diff --git a/_darcs/checkpoints/inventory b/_darcs/checkpoints/inventory new file mode 100644 index 0000000000..e69de29bb2 diff --git a/_darcs/format b/_darcs/format new file mode 100644 index 0000000000..020c452187 --- /dev/null +++ b/_darcs/format @@ -0,0 +1 @@ +darcs-1.0 diff --git a/_darcs/inventories/20080517153140-84dde-9a66640ac27da548d82459183d14b60d9e0c241a.gz b/_darcs/inventories/20080517153140-84dde-9a66640ac27da548d82459183d14b60d9e0c241a.gz new file mode 100644 index 0000000000..3e909155ba --- /dev/null +++ b/_darcs/inventories/20080517153140-84dde-9a66640ac27da548d82459183d14b60d9e0c241a.gz @@ -0,0 +1,99 @@ +[initial database +Evan Prodromou **20080505135019] +[default index files +Evan Prodromou **20080505135228] +[documentation for URLs +Evan Prodromou **20080505150839] +[add standard directories +Evan Prodromou **20080506151729 + + Added some of the standard directories + +] +[beginnings of PHP +Evan Prodromou **20080507164807] +[add data objects +Evan Prodromou **20080507171542] +[start showstream +Evan Prodromou **20080508162145] +[read-only stuff +Evan Prodromou **20080509021604] +[considerable coding +Evan Prodromou **20080514145436] +[head and foot menus +Evan Prodromou **20080514184702] +[deny access to include files +Evan Prodromou **20080514190009] +[remove placeholder index files +Evan Prodromou **20080514190105] +[move library files to lib +Evan Prodromou **20080514190300] +[move docs to doc +Evan Prodromou **20080514190341] +[move sql file to db +Evan Prodromou **20080514190411] +[license block for source code +Evan Prodromou **20080514192648 + + Added GNU Affero GPL license block to source code. + + Added name "LACONICA". I think it should work fine. + +] +[settings and avatars +Evan Prodromou **20080515162844 + + Did considerable work on the settings section. + + Redesigned the DB to allow avatars. Each avatar image has a size and + an URL. There can be multiple avatars per profile, just different sizes. + + Added accessors in Profile for avatar. Show the avatar in lots of + places, where it makes sense. Constants for avatar sizes in common.php. + +] +[upload and change avatars +Evan Prodromou **20080517122045 + + code to upload and change avatars. + + combined some code in the settings area, too. + +] +[bogus version of common_local_url() +Evan Prodromou **20080517135138 + + Threw together a bogus version of common_local_url(), which should + work for now. But eventually it should use pretty URLs if possible. + +] +[move the goal posts +Evan Prodromou **20080517140532 + + change the version numbers for an internal 0.1 test release (putting + it on the server!). + + Also, added some tweedly date formatting, just to have something + there. Needs some thought. + +] +[more twiddling +Evan Prodromou **20080517144642 + + Placeholder for broadcasting notice updates. + + Fixup the local url function to include server and path. + + Add server and path to configuration array. + + Make new notice 303 redirect to shownotice. + + Make redirects work. + + Add link in streams to notices. + +] +[make config kinda work +Evan Prodromou **20080517152958] +[flipped a couple of TODOs around +Evan Prodromou **20080517153127] \ No newline at end of file diff --git a/_darcs/inventories/20080522172623-84dde-81f0da83f977503dbeb718b9c9c8017fb6479f04.gz b/_darcs/inventories/20080522172623-84dde-81f0da83f977503dbeb718b9c9c8017fb6479f04.gz new file mode 100644 index 0000000000..01d8760b0a --- /dev/null +++ b/_darcs/inventories/20080522172623-84dde-81f0da83f977503dbeb718b9c9c8017fb6479f04.gz @@ -0,0 +1,366 @@ +Starting with tag: +[TAG 0.1 +Evan Prodromou **20080517153140] +[fixes to make it all lint +Evan Prodromou **20080517154701 + + Ran everything through php -l, found out that it didn't compile. + + So: fixed the am-I-running-in-Laconica check at the top of each file. + Some syntax fixes in shownotice, showstream, common. + +] +[correct placement of common +Evan Prodromou **20080517154942] +[correct path to DB_DataObject +Evan Prodromou **20080517155326] +[fix comma in db script +Evan Prodromou **20080517155754] +[fix check in config.php.sample +Evan Prodromou **20080517160654] +[common_local_url() second parameter optional +Evan Prodromou **20080517160908] +[some more todos +Evan Prodromou **20080517161332] +[handle empty path better +Evan Prodromou **20080517161548] +[add action class to default loads +Evan Prodromou **20080517161817] +[fixup argument handling in action superclass +Evan Prodromou **20080517162305] +[try to make register work +Evan Prodromou **20080517162932] +[try to fix arghandling in action +Evan Prodromou **20080517163749] +[change from class call on action to obj call +Evan Prodromou **20080517163917] +[fix array key check +Evan Prodromou **20080517164218] +[fix form output in register +Evan Prodromou **20080517164349 + + Two twiddly bits for the form output. + +] +[common_start_element -> common_element_start +Evan Prodromou **20080517170430] +[wrong title on register +Evan Prodromou **20080517170617] +[buttons work right +Evan Prodromou **20080517170920] +[fix check for POST +Evan Prodromou **20080517171501] +[add stub email canonicalizer +Evan Prodromou **20080517172110 + + Added a stub function to stand in for eventual email canonicalizer. + +] +[require data classes in common +Evan Prodromou **20080517172528] +[path separator problem in data classes +Evan Prodromou **20080517172654] +[fix INSTALLDIR use in common.php +Evan Prodromou **20080517173424 + + I was using $INSTALLDIR instead of INSTALLDIR + +] +[misspelled function name +Evan Prodromou **20080517173626] +[change username to nickname +Evan Prodromou **20080517174219] +[fixup some nickname handling +Evan Prodromou **20080517175022] +[require once for settings actions +Evan Prodromou **20080517175416] +[fixup login form +Evan Prodromou **20080517190142] +[require stream stuff +Evan Prodromou **20080517191034] +[canonicalize -> canonical +Evan Prodromou **20080517191128 + + typo + +] +[change profile argument to nickname +Evan Prodromou **20080517191430] +[change how the user profile is fetched +Evan Prodromou **20080517192001] +[fix notice counting code +Evan Prodromou **20080517192151] +[handle empty subscription list +Evan Prodromou **20080517192447] +[check results of setting current user +Evan Prodromou **20080517193030] +[ensure rather than check for session +Evan Prodromou **20080517193520] +[better button for posting notes +Evan Prodromou **20080517193833] +[fix button on newnotice +Evan Prodromou **20080517194003] +[fix typo in common_date_string +Evan Prodromou **20080517194133] +[fix created, messages +Evan Prodromou **20080517195201] +[go to public timeline on logout and handle missing user more gracefully +Evan Prodromou **20080517195449] +[fix typo in newnotice +Evan Prodromou **20080517195724 + + there was a typo, and I removed it. + +] +[use cast object for datetimes +Evan Prodromou **20080517201411] +[dates are already strings +Evan Prodromou **20080517201719] +[save profile url +Evan Prodromou **20080517202132] +[hide subscribe stuff if looking at your own page +Evan Prodromou **20080518011808] +[fix table name in subscriptions.php +Evan Prodromou **20080518012850] +[sub => subs consistently +Evan Prodromou **20080518013312] +[add header and footer to subscriptions +Evan Prodromou **20080518013747] +[fix interpolation of profile_id in query +Evan Prodromou **20080518014207] +[smaller packet +Evan Prodromou **20080518015551] +[header and footer on subscribers +Evan Prodromou **20080518125253] +[off-by-one error in notice stream +Evan Prodromou **20080518185940] +[better handling of zero values in stats +Evan Prodromou **20080518190220] +[fix path to files, some TODOs +Evan Prodromou **20080518191056] +[fix form for avatars +Evan Prodromou **20080518191326] +[move avatars to their own dir +Evan Prodromou **20080518191750] +[change defaults to use avatar dir +Evan Prodromou **20080518191849] +[better deletion of old avatars +Evan Prodromou **20080518193951] +[timestamps for avatar +Evan Prodromou **20080518194653] +[try to fix updating in profile +Evan Prodromou **20080519122445] +[all updates use original now +Evan Prodromou **20080519122708] +[add common_password +Evan Prodromou **20080519131808] +[fix form in password +Evan Prodromou **20080519132118] +[update avatar table +Evan Prodromou **20080519134057] +[better headers +Evan Prodromou **20080519141219 + + Added H1 headers to all pages. Added H2 headers to sections of pages, + where appropriate. + + Moved a lot of TODOs around. + + Made the public stream the default if no action is specified. + +] +[whitespace in showstream +Evan Prodromou **20080519141351] +[fix link to profilesettings in settings menu +Evan Prodromou **20080519141736] +[fix output of statistics +Evan Prodromou **20080519141943] +[better stats +Evan Prodromou **20080519142807] +[break out utility functions to util.php +Evan Prodromou **20080520130535] +[convert html-generation functions to use XMLWriter +Evan Prodromou **20080520132722] +[change textarea to start and end +Evan Prodromou **20080520133008] +[fix calling for textarea elements +Evan Prodromou **20080520133220] +[type declaration +Evan Prodromou **20080520133640] +[add a space to textarea +Evan Prodromou **20080520133825] +[add alt to all images +Evan Prodromou **20080520134631] +[add notice id +Evan Prodromou **20080520153629] +[license block and move theme stuff +Evan Prodromou **20080520171353] +[add image to config +Evan Prodromou **20080520171711] +[fix license title +Evan Prodromou **20080520171809] +[copy in SimpleLife theme +Evan Prodromou **20080520172241] +[make the code use the default style +Evan Prodromou **20080520173427] +[better forms for new theme +Evan Prodromou **20080520174759] +[typo in form functions +Evan Prodromou **20080520175105] +[add a label for submit button +Evan Prodromou **20080520175906] +[add nbsp to submit button label +Evan Prodromou **20080520180640] +[indent HTML +Evan Prodromou **20080520180750] +[fix problem with uninitialized xw object +Evan Prodromou **20080520181040] +[better login button +Evan Prodromou **20080520181444] +[forgot the footer +Evan Prodromou **20080520181906] +[add validation methods to classes +Evan Prodromou **20080520185756] +[call validate before saving objects +Evan Prodromou **20080520191032] +[trim whitespace +Evan Prodromou **20080520191412] +[fix validation of url +Evan Prodromou **20080520192634] +[float images in stream left +Evan Prodromou **20080520192901] +[add a sidebar +Evan Prodromou **20080520193636] +[fix div in profile +Evan Prodromou **20080520194008] +[float notices left +Evan Prodromou **20080520194326] +[reformat showstream +Evan Prodromou **20080520201120] +[change relative widths of sidebar and notices again +Evan Prodromou **20080520201440] +[fix element in notice form +Evan Prodromou **20080520201738] +[smaller textbox +Evan Prodromou **20080520202500] +[highlight notice +Evan Prodromou **20080520202747] +[close ul for foot menu +Evan Prodromou **20080520203002] +[move notices and sidebar relative to each other +Evan Prodromou **20080520204259] +[clear both for footer +Evan Prodromou **20080520204639] +[better menuish stuff +Evan Prodromou **20080520205152] +[fix menuish again +Evan Prodromou **20080520205756] +[ease up on the validation +Evan Prodromou **20080520210119] +[fixup footer menu and fix syntax error in profile.php +Evan Prodromou **20080520210437] +[extract textarea code and make bio a textarea +Evan Prodromou **20080520211945] +[fixup textarea again +Evan Prodromou **20080520212319] +[remove validation code +Evan Prodromou **20080521110253] +[validation in form handlers +Evan Prodromou **20080521112707 + + Moved validation code from classes to form handlers. Probably better + in the classes, but I can't quite grok the validate() method in + DB_DataObject, so for now I'm going to do it the old-fashioned way. + +] +[default avatars +Evan Prodromou **20080521114624] +[default avatar +Evan Prodromou **20080521115727] +[change measurement of updated profiles +Evan Prodromou **20080521121307] +[correct error-handling in newnotice +Evan Prodromou **20080521122604] +[move error display to save_new_notice +Evan Prodromou **20080521123106] +[declare config global for show_notice in streams +Evan Prodromou **20080521133951 + + This is needed to get the default avatar, but it was missing. + +] +[better formatting in profile +Evan Prodromou **20080521134849] +[rss feed plus +Evan Prodromou **20080521143351 + + Added an action for creating an RSS 1.0 (RDF) feed. To make this work, + added a couple of helper functions to util, and changed the HTML stuff + to use the helper functions. + + Also, changed a bit of formatting in the profile. Yeah, not a clean + changeset. + +] +[add w3dtf date to rss 1.0 items +Evan Prodromou **20080521145916] +[full path for avatars +Evan Prodromou **20080521151227] +[add RSS 1.0 link to header of showstream +Evan Prodromou **20080521152404] +[falsely claim rss 1.0 is rss 2.0 +Evan Prodromou **20080521153652] +[fix path to default avatars +Evan Prodromou **20080521154234] +[fixup default avatar urls by using common function +Evan Prodromou **20080521155448] +[mismatched parens +Evan Prodromou **20080521155611] +[wrong path for defaults +Evan Prodromou **20080521155849] +[fixup subscription links +Evan Prodromou **20080521183645] +[fix subscriptions a bit +Evan Prodromou **20080521185602] +[off-by-one error in subscriptions +Evan Prodromou **20080521190640] +[close unclosed rows in subscriptions +Evan Prodromou **20080521191135] +[re-write the subscriptions section +Evan Prodromou **20080521192048] +[define undefined, order subs +Evan Prodromou **20080521192912] +[get the correct data for subscribers/subscriptions +Evan Prodromou **20080521193452] +[change some todos +Evan Prodromou **20080521194238] +[strip slashes +Evan Prodromou **20080522103630 + + Check if automated slash-adder is on, and if so, strip out automated + slashes. + +] +[abstract out RSS 1.0 generation to allow multiple streams +Evan Prodromou **20080522112954] +[RSS feeds for public stream and friends streams +Evan Prodromou **20080522114152] +[fix query and description for allrss +Evan Prodromou **20080522114839] +[TODOs and docs and openmicroblogging spec +Evan Prodromou **20080522172006 + + Moved around a few TODOs. + + Linked to docs in the foot menu better. + + Added a specification for the openmicroblogging standard. + +] +[move the goalposts for 0.2 +Evan Prodromou **20080522172530 + + I pushed a lot of TODOs down, renamed the 0.2 release to 0.3, and made + a new release 0.2 in between. + +] \ No newline at end of file diff --git a/_darcs/inventories/20080610150429-34904-c09bc4ef00a38bcdbf740f35291c8ea35869dcae.gz b/_darcs/inventories/20080610150429-34904-c09bc4ef00a38bcdbf740f35291c8ea35869dcae.gz new file mode 100644 index 0000000000..8906048123 --- /dev/null +++ b/_darcs/inventories/20080610150429-34904-c09bc4ef00a38bcdbf740f35291c8ea35869dcae.gz @@ -0,0 +1,475 @@ +Starting with tag: +[TAG 0.2 +Evan Prodromou **20080522172623] +[tags and XRDS +Evan Prodromou **20080522183421 + + Starting the process of remote subscriptions. + + First, add the capacity to mint tags. May in the future want to allow + some kind of UUID or URL for unique URIs. New config options for tag + authority and date, and a function for minting tags. + + Store URIs in the DB. If the admin changes his/her tag config, this + shouldn't change the URIs in the DB. Unless they really want to make + that happen. + + Generate an XRDS document with the appropriate URLs for microblogging. + Also, redefined some stuff in openmicroblogging.txt. And moved the file. + +] +[typo in common_mint_tag +Evan Prodromou **20080522184027] +[generate classes for db schema with URIs +Evan Prodromou **20080522184109] +[use notice URIs in RSS feeds +Evan Prodromou **20080522184434] +[add tags on creation of notices and users +Evan Prodromou **20080522185500] +[use notice URI in channel items list +Evan Prodromou **20080522191028] +[fix notice generation in rss channels +Evan Prodromou **20080522191436] +[oauth discovery and all new actions +Evan Prodromou **20080526112700 + + Updated the spec to include OAuth discovery. + + Added new actions for all the OMB URLs. + +] +[update for new version of OMB protocol +Evan Prodromou **20080526130328 + + After finding OAuth Discovery, I rewrote the OMB spec to support it + better. This version of the XRDS generator supports OAuth Discovery + more completely. + +] +[fixups for xrds +Evan Prodromou **20080526131551 + + Corrected the definition of showService to show all the parameters. + + Fixed the localID part so it uses $user->uri; getUri() was throwing an + error. + +] +[fix typo in xrds +Evan Prodromou **20080526131953 + + I'd spelled "ENDPOINT" as "ENDPONT" in the code. whoops! + +] +[move OMB and OAUTH defs to their own lib file +Evan Prodromou **20080526151332] +[client side of distributed subscription almost complete +Evan Prodromou **20080527114219] +[server-side storage model +Evan Prodromou **20080527200721 + + First pass at a server-side storage model. New tables for consumers, + tokens, and nonces, with associated classes. An OAuthDataStore class + interfaces with the OAuth.php library to enable server logic. + + Some additional work to get pretty-OK random number generation into + the utilities library. Use /dev/urandom if available; else use + mt_rand(). + +] +[remove bogus validation code +Evan Prodromou **20080528134804] +[add timestamp to avatar filenames to prevent overlap +Evan Prodromou **20080528140321] +[fix submit button for avatar +Evan Prodromou **20080528141432] +[fix source link +Evan Prodromou **20080528141555] +[better timestamped avatar filenames +Evan Prodromou **20080528143030] +[don't scale avatar if original already matches size +Evan Prodromou **20080528144202] +[registration requires accepting the license +Evan Prodromou **20080528164222] +[move license label to _after_ the checkbox +Evan Prodromou **20080528170438] +[get rid of the license label, since it mucks everything else up. +Evan Prodromou **20080528170556] +[show error messages in registration form +Evan Prodromou **20080528170752] +[fix cc license url +Evan Prodromou **20080528171012] +[float text of license stuff right, to make a more pleasing license block +Evan Prodromou **20080528171232] +[try to float license image left again +Evan Prodromou **20080528171434] +[try to float license text right +Evan Prodromou **20080528171543] +[fixed widths +Evan Prodromou **20080528171626] +[add span around license link +Evan Prodromou **20080528171758] +[add greenBg for license +Evan Prodromou **20080528171944] +[whole footer has greenBg +Evan Prodromou **20080528172041] +[undo that +Evan Prodromou **20080528172149] +[paginate on showstream +Evan Prodromou **20080528173129] +[forgot commas! +Evan Prodromou **20080528173231] +[better page numbers +Evan Prodromou **20080528173417] +[add pagination to all and public +Evan Prodromou **20080528173917] +[update TODOs and try to reformat notices +Evan Prodromou **20080528174247] +[change to use correct width classes +Evan Prodromou **20080528174412] +[take out spans +Evan Prodromou **20080528174621] +[take out avatar floatleft +Evan Prodromou **20080528174807] +[take out content rendering, seems to do something strange +Evan Prodromou **20080528174924] +[add doc action +Evan Prodromou **20080528182707] +[error in file_exists() +Evan Prodromou **20080528183022] +[stub of about +Evan Prodromou **20080528183709] +[add more docs +Evan Prodromou **20080528185637] +[source document +Evan Prodromou **20080528193121] +[dump args to browser for debugging +Evan Prodromou **20080529151317] +[fix checking boolean parameters +Evan Prodromou **20080529151602] +[even better boolean handling +Evan Prodromou **20080529152304] +[mark some TODOs done +Evan Prodromou **20080529163508] +[use common_render_content +Evan Prodromou **20080529164139] +[reformat showstream +Evan Prodromou **20080529164411] +[@ messages +Evan Prodromou **20080529170801] +[loosen restrictions on names for atlinks +Evan Prodromou **20080529171604] +[fixup atlink generator a bit +Evan Prodromou **20080529171853] +[dummy atlinkin +Evan Prodromou **20080529172107] +[more debugging crap +Evan Prodromou **20080529172205] +[remove debug string +Evan Prodromou **20080529172258] +[don't check for notice in rendering content; just render it! +Evan Prodromou **20080529172549] +[better regular expression for atlinks +Evan Prodromou **20080529173234] +[special chars for raw links in atlinks +Evan Prodromou **20080529173400] +[fix render in showstream +Evan Prodromou **20080529173527] +[keep the ampersand in atlinks +Evan Prodromou **20080529173635] +[linkify URLs +Evan Prodromou **20080529181244] +[remove url regex +Evan Prodromou **20080529181321] +[use q's for regex delimiter +Evan Prodromou **20080529181549] +[bad regex again +Evan Prodromou **20080529181623] +[one more try on the preg delimiter +Evan Prodromou **20080529181942] +[remove URL check again +Evan Prodromou **20080529182026] +[more regex fun +Evan Prodromou **20080529182725] +[ar +Evan Prodromou **20080529182754] +[linkify URLs +Evan Prodromou **20080529190702] +[move linkifying so URL links come first +Evan Prodromou **20080529190743] +[change number of subscriptions per row +Evan Prodromou **20080529192112] +[don't render content in RSS feeds +Evan Prodromou **20080529192510] +[interim commit after pull from server +Evan Prodromou **20080530142324] +[common function for turning a relative path into a full URL +Evan Prodromou **20080530162429] +[remotesubscribe form +Evan Prodromou **20080530174310] +[fix path for requiring oauthstore +Evan Prodromou **20080530174616] +[check that services are null in yadis check +Evan Prodromou **20080530175055] +[show footer for remotesubscribe form +Evan Prodromou **20080530175235] +[add a print_r for the yadis doc returned +Evan Prodromou **20080530175436] +[correct content-type on XRDS document +Evan Prodromou **20080530181029] +[check to see if XRDS discovery failed +Evan Prodromou **20080530181103] +[add debug logging and do some from the remotesubscribe page +Evan Prodromou **20080530182230] +[add X-XRDS-Location header +Evan Prodromou **20080530183528] +[typo in checking for YADIS failure +Evan Prodromou **20080530184105] +[better debug messages +Evan Prodromou **20080530184712] +[debug message for when services returns null +Evan Prodromou **20080530184925] +[no pid in syslog +Evan Prodromou **20080530185015] +[check xrds object +Evan Prodromou **20080530185343] +[parse the XRDS results +Evan Prodromou **20080530190446 + + Apparently you have to parse the XRDS results from the discovery + result object. Who knew? + +] +[start handling fancy URLs +Evan Prodromou **20080530212555] +[set proper row sizes +Evan Prodromou **20080601020132] +[better handling of XRDS files +Evan Prodromou **20080602174249 + + Our generated XRDS files contain 3 XRD elements: one for OAuth, one + for OMB, and one to point to the other two. Auth_Yadis only gives us + the last one, so we have to use it to find the other two, and then + extract service URLs from them. + + Kind of fragile code, probably won't hold up under complicated + topologies, and won't work at all if the XRDs are in another XRDS + container. I tried to use XRDS filtering to get the top-priority + version of XRDs, services, and URIs, but Laconica's output doesn't use + any of that stuff and I don't particularly want to test it. + +] +[move service-matching callbacks to library +Evan Prodromou **20080602175725] +[use omb_service_filter() rather than omb_match_service() +Evan Prodromou **20080602175936] +[fix dynamically-created code +Evan Prodromou **20080602180108] +[add some debugging stuff for problems with remote subscribe +Evan Prodromou **20080602181254] +[services() returns an array +Evan Prodromou **20080602181759] +[trim whitespace +Evan Prodromou **20080602181857] +[make a nodes variable to pass nodes by reference +Evan Prodromou **20080602182153] +[fix assignment of omb stuff +Evan Prodromou **20080602183314] +[debug info +Evan Prodromou **20080602183911] +[minor corrections for OMB discovery +Evan Prodromou **20080602185137] +[typo in LocalID generation in xrds +Evan Prodromou **20080602185452] +[fix URLs for OMB endpoints +Evan Prodromou **20080602185618] +[add a namespace when checking for LocalID element +Evan Prodromou **20080602190357] +[get content of element rather than raw element +Evan Prodromou **20080602191039] +[add some debugging output to request token request +Evan Prodromou **20080602192018] +[fixup caching problem with server variable +Evan Prodromou **20080602192242] +[correct name of data store class +Evan Prodromou **20080602192526] +[fixup classes +Evan Prodromou **20080602192820] +[correct server error output +Evan Prodromou **20080602193851] +[add the hmac sha1 signature method to server +Evan Prodromou **20080602194333] +[change names, update +Evan Prodromou **20080602195138] +[fix consumer fetching, nonce making +Evan Prodromou **20080602200645] +[get rid of callback nonce +Evan Prodromou **20080602201707] +[debugging code for userauthorization +Evan Prodromou **20080602203142] +[more debug code +Evan Prodromou **20080602203802] +[trying to find out why auth request is going to requesttoken +Evan Prodromou **20080602205534] +[move debugging code for checking URIs of XRD +Evan Prodromou **20080602205921] +[more debugging, don't reuse variable +Evan Prodromou **20080603104859] +[typo in use of omb_service_uri() +Evan Prodromou **20080603110749] +[restructure filters on services +Evan Prodromou **20080603111750] +[one more stab at type matching, plus debug message +Evan Prodromou **20080603113626] +[fix service discovery (I think) +Evan Prodromou **20080603114317] +[clear out lots of debugging code, add require to userauthorization +Evan Prodromou **20080603115218] +[remove call to private get-version() method +Evan Prodromou **20080603115839] +[full interface for userauthorization +Evan Prodromou **20080604185131] +[fix passing request around +Evan Prodromou **20080604191206] +[add some debugging code +Evan Prodromou **20080604201123] +[automatically prepend filename to debug output +Evan Prodromou **20080605024035] +[move filename stuff to debug function +Evan Prodromou **20080605024717] +[move stoica schema to laconica +Evan Prodromou **20080605024807] +[correct order of params in get_token +Evan Prodromou **20080605025152] +[clear request doesn't need an argument +Evan Prodromou **20080605025611] +[don't validate listenee URI +Evan Prodromou **20080605033911 + + Validation of the listenee URI was failing for tag: URIs. So, + abandoned validation for now. Maybe in the future I'll add it back in, + with a second check for a valid tag URI if it doesn't work. + +] +[decided to validate tag uris rather than not validating any uris +Evan Prodromou **20080605040153] +[bad validation of callback URL +Evan Prodromou **20080605040358] +[a +Evan Prodromou **20080605183419] +[new TODOs +Evan Prodromou **20080605190614] +[move avatar scaling and saving to Avatar and Profile +Evan Prodromou **20080605193708 + + Extracted the code for setting a new original avatar to the Profile + class, and moved some of it to Avatar, too. This makes it easier to + have the same functionality whether an avatar is set using the profile + settings (for our users), or on a remote subscription. Necessitated + changing the filenaming function to just take an ID. + +] +[setOriginal() is an instance method +Evan Prodromou **20080605195222] +[passing id to the avatar filename function +Evan Prodromou **20080605195500] +[show error correctly in login +Evan Prodromou **20080605200759] +[debugging info on finished remote subscribe +Evan Prodromou **20080606040946] +[listenee is nickname, not URI +Evan Prodromou **20080606043405] +[fix args in returnto +Evan Prodromou **20080606051331] +[don't clone arrays! +Evan Prodromou **20080606051823] +[use $_GET, not $args +Evan Prodromou **20080606052117] +[handle errors in authorizing and saving remote profile +Evan Prodromou **20080606052631] +[debug info for authorizing token +Evan Prodromou **20080606053321] +[seem to be storing tokens with null consumer keys +Evan Prodromou **20080606053914] +[mixed up OAuthConsumer and Consumer classes +Evan Prodromou **20080606054549] +[checks for user and sub in validate and better error check in remote save +Evan Prodromou **20080606055439] +[remember to sign access token request with request token +Evan Prodromou **20080606060000] +[mixed up token keys and OAuthToken objects +Evan Prodromou **20080606060601] +[debugging output for new_access_token +Evan Prodromou **20080606061556] +[debugging stuff in accesstoken action +Evan Prodromou **20080606062235] +[debugging request for access token +Evan Prodromou **20080606062958] +[store URL rather than service in $omb for bounce back +Evan Prodromou **20080606063721] +[forgot to require libs in accesstoken +Evan Prodromou **20080606064011] +[stash URLs for return and check all values for profiles +Evan Prodromou **20080606065027] +[call postnotice when there's a remote subscription +Evan Prodromou **20080606160437] +[move notice-posting stuff from util.php to omb.php +Evan Prodromou **20080606162226] +[push yadis requirement into omb.php +Evan Prodromou **20080606162659] +[debugging messages in broadcast remote +Evan Prodromou **20080606171450] +[trim whitespace and more debugging for posting messages +Evan Prodromou **20080606172239] +[dump sub and rp +Evan Prodromou **20080606172638] +[fix name of join-adding method +Evan Prodromou **20080606173804] +[quit trying to use fancy join and just loop +Evan Prodromou **20080606174822] +[removing some noisy debug notices +Evan Prodromou **20080606175254] +[bad signature because variable name was wrong +Evan Prodromou **20080606180035] +[was using $notice->uri instead of $notice_uri +Evan Prodromou **20080606180330] +[start doing some fancy URLs +Evan Prodromou **20080606182044] +[use mod_rewrite to have prettier urls +Evan Prodromou **20080606195136] +[fancy URLs +Evan Prodromou **20080606200151] +[add cc:license to RSS streams +Evan Prodromou **20080608201917] +[forgot config in channel +Evan Prodromou **20080608201957] +[use rdf:resource for license urls +Evan Prodromou **20080608203314] +[export FOAF +Evan Prodromou **20080610121132] +[incorrectly used , instead of => in a surprising number of places +Evan Prodromou **20080610121936] +[more specific fetchers +Evan Prodromou **20080610122707] +[undo fancy URLs for omb endpoints +Evan Prodromou **20080610123002 + + The OAuth library uses the $_GET and $_POST arrays for checking + signatures on requests. So, we need to make sure that the client sees + the same request parameters as the server (or callback). These don't + have to be particularly readable URLs, anyways, since they're mostly + "behind the scenes". + +] +[ticking off a TODO +Evan Prodromou **20080610142221] +[make presentation of remote subscribe nicer +Evan Prodromou **20080610143709] +[add link for FOAF autodiscovery +Evan Prodromou **20080610144420] +[close parens in showstream +Evan Prodromou **20080610144606] +[fix getting subscribers +Evan Prodromou **20080610145520] +[add another TODO +Evan Prodromou **20080610150113] \ No newline at end of file diff --git a/_darcs/inventories/20080613184833-84dde-560f55c55492f909c3a5a0948e4ef3b072208bcd.gz b/_darcs/inventories/20080613184833-84dde-560f55c55492f909c3a5a0948e4ef3b072208bcd.gz new file mode 100644 index 0000000000..4763643ca1 --- /dev/null +++ b/_darcs/inventories/20080613184833-84dde-560f55c55492f909c3a5a0948e4ef3b072208bcd.gz @@ -0,0 +1,146 @@ +Starting with tag: +[TAG 0.2.5 +Evan Prodromou **20080610150429] +[geo namespace +Evan Prodromou **20080610150957] +[files from Marie-Claude Doyon for stoi.ca theme +Evan Prodromou **20080610171303] +[rename files in stoica theme +Evan Prodromou **20080610173718] +[first steps towards new skin +Evan Prodromou **20080610185238] +[background header +Evan Prodromou **20080610185551] +[fix footer menu +Evan Prodromou **20080610185759] +[fixup for new theme design in public.php +Evan Prodromou **20080610192101] +[new layout for all action +Evan Prodromou **20080610193305] +[fixup views menu +Evan Prodromou **20080610193520] +[wrap notice form in p +Evan Prodromou **20080610193649] +[finish logo link +Evan Prodromou **20080610193854] +[change class of notice textarea to its id +Evan Prodromou **20080610194243] +[move help menu and change class of menuitem li,s +Evan Prodromou **20080610194553] +[remove license block +Evan Prodromou **20080610195134] +[better footer +Evan Prodromou **20080610195502] +[get current user in views menu +Evan Prodromou **20080610195920] +[canonicalization lowercases nicknames +Evan Prodromou **20080611141824] +[new TODOs +Evan Prodromou **20080608203731] +[fixup TODOs +Evan Prodromou **20080610211316] +[better form handling +Evan Prodromou **20080610211614] +[make shownotice a stream of one notice +Evan Prodromou **20080610221910 + + For display sake, make showing a single notice like showing a + stream with one notice in it. + +] +[fix including stream in shownotice +Evan Prodromou **20080610222222] +[get the profile to show it in the title +Evan Prodromou **20080610222547] +[add more TODOs +Evan Prodromou **20080611014547] +[one more TODO +Evan Prodromou **20080611014616] +[take out home/profile menu for all pages, use same format for settings menu +Evan Prodromou **20080611015609] +[fixup some TODOs, fix a bug in userauthorization +Evan Prodromou **20080611020810] +[refresh on showstream +Evan Prodromou **20080611022900] +[remove notice form from showstream +Evan Prodromou **20080611023246] +[menu on home and profile +Evan Prodromou **20080611155258] +[make last parameter for common_menu_item() optional +Evan Prodromou **20080611155649] +[closing menu list in the wrong place +Evan Prodromou **20080611160318] +[show selection in settings menu +Evan Prodromou **20080611160520] +[a couple of TODOs that are done +Evan Prodromou **20080611162118] +[instructions +Evan Prodromou **20080611163308] +[reminder about site license in avatar upload process +Evan Prodromou **20080611163645] +[more documentation +Evan Prodromou **20080611170624] +[remove URLS.txt +Evan Prodromou **20080611170723] +[move files in default theme to one directory +Evan Prodromou **20080611171009] +[reformat for our theme layout +Evan Prodromou **20080611171351] +[only show notice form if user is logged in, looking at own page +Evan Prodromou **20080611181334] +[push notice form and sub-menu into header div +Evan Prodromou **20080611183634] +[double-showing notice form and views menu +Evan Prodromou **20080611184128] +[change default avatars from config vars to theme files +Evan Prodromou **20080611190230] +[start changing default theme to work with new HTML +Evan Prodromou **20080612015858] +[menu to nav +Evan Prodromou **20080612020408] +[add instructions to each form entry in forms +Evan Prodromou **20080612165201] +[link for website +Evan Prodromou **20080612174453] +[broadcast profile and change subscription input id +Evan Prodromou **20080612184028] +[hide warnings when unlinking an avatar file +Evan Prodromou **20080612185322] +[add some more debugging code +Evan Prodromou **20080612190447] +[fix some incorrect input due to copy-and-paste programming +Evan Prodromou **20080612191606] +[correct the id attribute of the profile +Evan Prodromou **20080612192221] +[only show "more subscriptions" link if there really are more subscriptions +Evan Prodromou **20080612192650] +[catch errors in debug log +Evan Prodromou **20080612193945] +[another copy-and-paste error +Evan Prodromou **20080612194656] +[only validate if values are sent +Evan Prodromou **20080612195324] +[links for subscribers and subscribed in showstream +Evan Prodromou **20080612200424] +[add content negotiation for media type +Evan Prodromou **20080613144913] +[mark off TODO, only local notices in public stream +Evan Prodromou **20080613152420] +[MC's changes on test1 server +Evan Prodromou **20080613152520] +[add author information for RSS +Evan Prodromou **20080613153012] +[better titles in RSS +Evan Prodromou **20080613153303] +[show logo only if file exists, add h1 and h2 to all pages +Evan Prodromou **20080613154632] +[hide pagename and site title +Evan Prodromou **20080613155540] +[update TODO, and add variables to docs +Evan Prodromou **20080613171538] +[function for retrieving a config variable +Evan Prodromou **20080613175344] +[site name in help file +Evan Prodromou **20080613183325] +[mark off some todos, add a version number, and put code info at the bottom of the page +Evan Prodromou **20080613184638] \ No newline at end of file diff --git a/_darcs/inventories/20080619150226-5ed1f-2c7ad753166708ede8c07e704953a5da888e4145.gz b/_darcs/inventories/20080619150226-5ed1f-2c7ad753166708ede8c07e704953a5da888e4145.gz new file mode 100644 index 0000000000..089fa655f1 --- /dev/null +++ b/_darcs/inventories/20080619150226-5ed1f-2c7ad753166708ede8c07e704953a5da888e4145.gz @@ -0,0 +1,263 @@ +Starting with tag: +[TAG 0.3.0 +Evan Prodromou **20080613184833] +[add public tab +Evan Prodromou **20080614122038] +[no arg +Evan Prodromou **20080614122155] +[take out public from views menu for now +Evan Prodromou **20080614122517] +[show default profile image in showstream +Evan Prodromou **20080615014742] +[some doc +Evan Prodromou **20080615021852] +[email notification on new subscriptions +Evan Prodromou **20080615030202] +[use site name as default sender +Evan Prodromou **20080615030319] +[fancy URLs should remember page +Evan Prodromou **20080615035012] +[before and after are switched, pass QSA in some rewrite rules +Evan Prodromou **20080615035510] +[add jQuery +Evan Prodromou **20080617043650] +[filename in jquery +Evan Prodromou **20080617044054] +[move roadmap to web site +Evan Prodromou **20080617121642 + + I've put all the roadmap info into the Laconi.ca Web site: + + http://laconi.ca/PITS + + It's more detailed, more accessible for non-programmers, and more + structured. + + To avoid having the two sources go out-of-synch, I'm deleting this one. + +] +[start openid rp integration +Evan Prodromou **20080617133501] +[remove roadmap +Evan Prodromou **20080617133539] +[ignore oid_.* tables when generating classes +Evan Prodromou **20080617133941] +[beginnings of OpenID login +Evan Prodromou **20080617144942] +[inclusion of our local OpenID lib +Evan Prodromou **20080617145140] +[more specific Store class +Evan Prodromou **20080617150509] +[forgot 'new' keyword +Evan Prodromou **20080617150656] +[add OpenID and SReg libraries +Evan Prodromou **20080617151249] +[fixup & +Evan Prodromou **20080617152051] +[close function call in javascript +Evan Prodromou **20080617152444] +[what exactly are we updating +Evan Prodromou **20080615152047] +[more debugging on profile update +Evan Prodromou **20080615153123] +[M-C changes in stoica +Evan Prodromou **20080618015146] +[make default a clone of stoica +Evan Prodromou **20080618015423 + + Rather than trying to backfill a default theme from the Simple Life + theme, we're just going to copy the stoica theme, and make some + changes so it looks distinctive. + +] +[finish openid +Evan Prodromou **20080618052638 + + Added some code to make finishing the OpenID login work. + + Changed the OID storage so that there's a "canonical" URL and a + display URL. This is because of i-names, which is annoying. + + If the login succeeds, we try to find a local user associated with the + canonical URL. If they don't exist, we let the user either create a + new account, or login to an existing account and connect to it. + + A totally unrelated change is that the DB engine now uses InnoDB. + +] +[require the openid relational class +Evan Prodromou **20080618054847] +[fix prompt and debug input +Evan Prodromou **20080618055349] +[check existence of args not booleanness +Evan Prodromou **20080618055657] +[refactoring error +Evan Prodromou **20080618055836] +[fix get_saved_values() function in finishopenidlogin +Evan Prodromou **20080618060549] +[set nickname correctly +Evan Prodromou **20080618061117] +[go to profile instead of profile settings +Evan Prodromou **20080618061833] +[fix missing parens +Evan Prodromou **20080618062059] +[manage existing OpenIDs +Evan Prodromou **20080618065320 + + Add a settings page to manage existing OpenIDs, or add OpenIDs to an + account. + +] +[add OpenID settings to settings menu +Evan Prodromou **20080618065508] +[user_id in user_openid should not be unique +Evan Prodromou **20080618070430] +[dot not comma +Evan Prodromou **20080618070710] +[better error handling +Evan Prodromou **20080618071207] +[user_id in user_openid is not unique +Evan Prodromou **20080618110126] +[debugging on adding OpenID +Evan Prodromou **20080618110853] +[error on save +Evan Prodromou **20080618111512] +[return true on successful save of openid +Evan Prodromou **20080618112624] +[voodoo changes +Evan Prodromou **20080618113720] +[consolidate linking a user to an OpenID +Evan Prodromou **20080618114310] +[fix syntax error in finishopenidlogin +Evan Prodromou **20080618123941] +[references +Evan Prodromou **20080618131519] +[change variable name error +Evan Prodromou **20080618131636] +[debugging for addopenid problem +Evan Prodromou **20080618132613] +[move openid authentication to a common function +Evan Prodromou **20080618133251] +[fixup syntax error in openid.php +Evan Prodromou **20080618150557] +[better presentation on openidsettings +Evan Prodromou **20080618160111] +[better URLs for OpenID stuff +Evan Prodromou **20080618160733] +[fancified openidsettings URL +Evan Prodromou **20080618161321] +[more debugging output, better check on canonical +Evan Prodromou **20080618162715] +[fix debug to prefix with var name +Evan Prodromou **20080618162838] +[add submit class to all buttons +Evan Prodromou **20080618163516] +[don't put fake spaces in the text area +Evan Prodromou **20080618025253] +[fake spaces in textareas to fakeout XMLWriter +Evan Prodromou **20080618030019] +[move instructions up to the "whats up" area +Evan Prodromou **20080618035739] +[fix copy-and-paste error +Evan Prodromou **20080618151103] +[change sitename h2 to branding p +Evan Prodromou **20080618152004] +[more rigorous check on site logo +Evan Prodromou **20080618153036] +[class=branding => id=branding +Evan Prodromou **20080618153258] +[link in the branding p +Evan Prodromou **20080618154643] +[better pagination and no rows in subscriptions and subscribed +Evan Prodromou **20080618165041] +[more changes by M-C on the server +Evan Prodromou **20080618175911] +[small debugging and messaging fixes +Evan Prodromou **20080618180642] +[add xrds for trust root URL +Evan Prodromou **20080618182647] +[fix trust root in openid to use 'public' string +Evan Prodromou **20080618182812] +[remove 'oauth' from publicxrds +Evan Prodromou **20080618183606] +[add more debugging +Evan Prodromou **20080618201123] +[add a little XML goodness to redirect +Evan Prodromou **20080618202500] +[factor out similarities in subscriptions and subscribers +Evan Prodromou **20080618171313] +[change references from subscribed to subscribers +Evan Prodromou **20080618171622] +[more subscriptions/subscribers changes +Evan Prodromou **20080618172444 + + Showstream now shows subscriptions in reverse chron order, like the + other pages. + + Added a callback method to figure out who the _other_ guy is in a + subscription. + + Changed gallery page to be a UL of images. + +] +[move instructions to top in openid pages +Evan Prodromou **20080618190202] +[removed message was slurping in success flag +Evan Prodromou **20080618204421] +[forgot settingsmenu in openidsettings +Evan Prodromou **20080618204611] +[take out check for other user +Evan Prodromou **20080618210044] +[switch password and id in munge_password +Evan Prodromou **20080618211454 + + I think this is the less effective way to salt a password, BUT... + I had a big bug in my code! All the code that was calling this + function got the order of the params mixed up. So, to save heartache, + I just reversed the order of the parameters, and reversed how the were + used in the function. It should be functionally the same as before, + but better documented. + +] +[add some reasonable things to configure +Evan Prodromou **20080619014802] +[config with path +Evan Prodromou **20080619020540] +[default DB driver is DB +Evan Prodromou **20080619020634] +[use DB as the data driver in dataobject.ini too +Evan Prodromou **20080619021449] +[do some commits +Evan Prodromou **20080619033212] +[use query method to do some transactions +Evan Prodromou **20080619033619] +[immediate mode for openid +Evan Prodromou **20080619134710] +[move update_user function to openid.php +Evan Prodromou **20080619135148] +[use openid.php functions in finishimmediate +Evan Prodromou **20080619135603] +[added some debugging stuff +Evan Prodromou **20080619135944] +[build backto a little smarter +Evan Prodromou **20080619140350] +[refresh the cookie on successful immediate +Evan Prodromou **20080619140505] +[copy args function +Evan Prodromou **20080619141107] +[M-C's changes to default theme on test2 +Test Server 2 **20080619142224] +[more changes by M-C on the dev server +Evan Prodromou **20080619141755] +[openid input styling +Evan Prodromou **20080619143610] +[id not class on openid_url input +Evan Prodromou **20080619143829] +[TAG 0.3.1 +Identica Server **20080619145124] +[update_user didn't return true +Evan Prodromou **20080619145838] +[update version +Evan Prodromou **20080619150158] +[TAG 0.3.2 +Evan Prodromou **20080619150208] \ No newline at end of file diff --git a/_darcs/inventories/20080619162450-5ed1f-037e20d9adc391a309e7c27091d13a8a039e3f94.gz b/_darcs/inventories/20080619162450-5ed1f-037e20d9adc391a309e7c27091d13a8a039e3f94.gz new file mode 100644 index 0000000000..4da7ab35ff --- /dev/null +++ b/_darcs/inventories/20080619162450-5ed1f-037e20d9adc391a309e7c27091d13a8a039e3f94.gz @@ -0,0 +1,23 @@ +Starting with tag: +[TAG 0.3.2 +Evan Prodromou **20080619150226] +[need a profileurl for new users +Evan Prodromou **20080619151803] +[cant remove last openid, public xrds includes immediate +Evan Prodromou **20080619153231 + + Added a check to make sure the user doesn't remove their last OpenID + if they don't also have a password. + + Also, put the finishimmediate URL in the publicxrds so that e.g. + Yahoo! doesn't get snippy. + +] +[fetch the oid before showing it +Evan Prodromou **20080619153719] +[had order of arguments for oid_link_user backwards in finishaddopenid +Evan Prodromou **20080619155042] +[Don't repeat "Remove OpenID" header +Evan Prodromou **20080619155154] +[posting from a form takes you back to the same page +Evan Prodromou **20080619161814] \ No newline at end of file diff --git a/_darcs/inventories/20080622172309-34904-734a780cc39d8716ca998ece451fec8923d9cbe7.gz b/_darcs/inventories/20080622172309-34904-734a780cc39d8716ca998ece451fec8923d9cbe7.gz new file mode 100644 index 0000000000..73b4b9c7ee --- /dev/null +++ b/_darcs/inventories/20080622172309-34904-734a780cc39d8716ca998ece451fec8923d9cbe7.gz @@ -0,0 +1,108 @@ +Starting with tag: +[TAG 0.3.3 +Evan Prodromou **20080619162450] +[common_show_footer() was hidden in an if +Evan Prodromou **20080619172031] +[push instructions into head and require license +Evan Prodromou **20080619173225] +[try to clear openid url cookie better +Evan Prodromou **20080619183238] +[put instructions into header div +Evan Prodromou **20080619190357] +[fix pagination for galleries +Evan Prodromou **20080620195627] +[Fix for bug #00019 (Linkified all @ addresses in a message) +matthew.gregg@gmail.com**20080620181136] +[skip a DB hit, and better regex +Evan Prodromou **20080620203449] +[add confirmemail table +Evan Prodromou **20080620041012] +[confirm email addresses +Evan Prodromou **20080620051536] +[correct name for common_good_rand() +Evan Prodromou **20080620052453] +[correct confirmation code +Evan Prodromou **20080620062606] +[fancy url for confirmation of email +Evan Prodromou **20080620062847] +[whitespace and debugging changes +Evan Prodromou **20080620064824] +[don't keep cached user +Evan Prodromou **20080620065455] +[strip some whitespace +Evan Prodromou **20080620065619] +[go back to ensuring session +Evan Prodromou **20080620070256] +[change from using tag uris to http urls for identifiers +Evan Prodromou **20080620071700 + + Weirdly, I got in an argument with Tim Berners-Lee in #swig about the + tag URIs I was using in FOAF documents. Eventually, I was convinced + that it's a better thing to use HTTP URLs instead. So, now we have + HTTP URLs. + + The tricky thing was for users. Since they can change their names, we + can't use their profile URL, since it includes the name. Instead, I + made up a new action, which simply redirects from a user ID to their + current profile URL. This should be sufficiently long-term. + +] +[some whitespace +Evan Prodromou **20080620072125] +[fix url for redirect +Evan Prodromou **20080620072632] +[add better debugging +Evan Prodromou **20080622140941] +[add confirm email to profile settings +Evan Prodromou **20080622142015] +[reference calling for objstring +Evan Prodromou **20080622142713] +[typo in objstring +Evan Prodromou **20080622142906] +[add a method to update key fields in User +Evan Prodromou **20080622145644] +[use internal quoting code for manual query +Evan Prodromou **20080622150633] +[use updateKeys() for updating the user +Evan Prodromou **20080622151611] +[better logic in profile settings, missing method in all +Evan Prodromou **20080622152306] +[nickname update +Evan Prodromou **20080622152628] +[strcmp for comparison +Evan Prodromou **20080622153220] +[more debugging +Evan Prodromou **20080622153754] +[q +Evan Prodromou **20080622154836] +[change Confirm_email to Confirm_address +Evan Prodromou **20080622155028] +[move confirmemail to confirmaddress +Evan Prodromou **20080622155250 + + Rename the confirmemail to more general confirmaddress so we can use + it for Jabber, SMS, or whatever. + +] +[require the right class +Evan Prodromou **20080622155454] +[correctly use Confirm_address +Evan Prodromou **20080622161607] +[fix name of class in confirmaddress.php +Evan Prodromou **20080622161749] +[confirm address +Evan Prodromou **20080622161917] +[special function for generating confirmation codes +Evan Prodromou **20080622163241] +[use a static rather than a constant for code chars +Evan Prodromou **20080622163458] +[auto-increment primary key for SMS carrier +Evan Prodromou **20080622164013] +[debugging for profile update +Evan Prodromou **20080622164542] +[move profile update to front +Evan Prodromou **20080622164928] +[move profile update to front +Evan Prodromou *-20080622164928] +[allow blank email address (I think) +Evan Prodromou **20080622165453] \ No newline at end of file diff --git a/_darcs/inventories/20080622172408-34904-76462f7172a89292a1f5125bd616fc789f1199d5.gz b/_darcs/inventories/20080622172408-34904-76462f7172a89292a1f5125bd616fc789f1199d5.gz new file mode 100644 index 0000000000..634971d8ab --- /dev/null +++ b/_darcs/inventories/20080622172408-34904-76462f7172a89292a1f5125bd616fc789f1199d5.gz @@ -0,0 +1,5 @@ +Starting with tag: +[TAG 0.3.4 +Evan Prodromou **20080622172309] +[version number changed +Evan Prodromou **20080622172354] \ No newline at end of file diff --git a/_darcs/inventories/20080626205418-34904-3c00363d01955e4df73b0ef730c23188f03b548f.gz b/_darcs/inventories/20080626205418-34904-3c00363d01955e4df73b0ef730c23188f03b548f.gz new file mode 100644 index 0000000000..300ac62fbf --- /dev/null +++ b/_darcs/inventories/20080626205418-34904-3c00363d01955e4df73b0ef730c23188f03b548f.gz @@ -0,0 +1,160 @@ +Starting with tag: +[TAG 0.3.4 +Evan Prodromou **20080622172408] +[remove check immediate +Evan Prodromou **20080622173341 + + After getting a lot of problems and bugs with this, I'm removing the + check_immediate code. Instead, I'm going to add this functionality in + JavaScript. I think that's a preferred practice, anyways. + +] +[disallow nicknames on a blacklist +Evan Prodromou **20080622180437] +[forgot to return on invalid nickname +Evan Prodromou **20080622181550] +[first pass at a daemon to receive XMPP messages +Evan Prodromou **20080623022710] +[add flags to db for jabber and sms notification +Evan Prodromou **20080623023859] +[make the daemon do something +Evan Prodromou **20080623030150] +[strip whitespace in xmppdaemon +Evan Prodromou **20080623030259] +[dont let the daemon get called from a web server +Evan Prodromou **20080623030523] +[change host to port +Evan Prodromou **20080623030930] +[conn is an attribute of XMPPdaemon +Evan Prodromou **20080623031058] +[normalize jids before comparison +Evan Prodromou **20080623041816] +[add imsettings to menu +Evan Prodromou **20080623223641] +[add jabber library and use it +Evan Prodromou **20080624001523] +[jabber send and confirmation code +Evan Prodromou **20080624013203] +[broadcast notices to jabber +Evan Prodromou **20080624014241] +[fix instructions in default theme +Evan Prodromou **20080624014625] +[don't validate email if none provided +Evan Prodromou **20080624014642] +[more fixes in default theme +Evan Prodromou **20080624014843] +[syntax error in jabber_format_notice +Evan Prodromou **20080624015001] +[more robust handling of new JIDs +Evan Prodromou **20080624015616] +[add table for remember me codes +Evan Prodromou **20080624020205] +[implement rememberme functionality +Evan Prodromou **20080624025234 + + Added a checkbox on login or register to remember the current user. If + the login is successful, this sets a cookie with a random code (saved + in the DB). If they come back, and they aren't logged in "normally", + we check to see if they have a rememberme cookie. If so, we log them + in. + + However, they can't change settings -- cookie theft is too prevalent. + So we mark a session as having a "real" (password or OpenID) login, or + not. In settings pages, we check to see if the login is "real", and if + not, we redirect to the login page. + +] +[switch order for checkbox, instructio +Evan Prodromou **20080624030034] +[bad function call +Evan Prodromou **20080624030741] +[typo in name of common_set_cookie +Evan Prodromou **20080624030834] +[use the correct field for Remember_me +Evan Prodromou **20080624031057] +[force session again and correctly get ID +Evan Prodromou **20080624031746] +[correct name for common_forgetme() in logout +Evan Prodromou **20080624031927] +[change some things around to see if we can get the cookies right +Evan Prodromou **20080624032408] +[set user takes a nickname, not a user object +Evan Prodromou **20080624032818] +[better cookie building +Evan Prodromou **20080624033223] +[check session name COOKIE before ensuring session +Evan Prodromou **20080624034906] +[think && was binding too closely in remembered_user +Evan Prodromou **20080624040058] +[using bogus attribute of $rm +Evan Prodromou **20080624040234] +[login doesn't bark if the user is automatically logged in +Evan Prodromou **20080624040548] +[rudimentary recoverpassword system +Evan Prodromou **20080624215033] +[output a message when we send the recovery email +Evan Prodromou **20080624215826] +[url for confirmation email is better, fancy url +Evan Prodromou **20080624220335] +[less tricky with recoverpassword +Evan Prodromou **20080624220626] +[slightly different from settingsaction +Evan Prodromou **20080624221054] +[type -> address_type +Evan Prodromou **20080624221437] +[correct field name +Evan Prodromou **20080624221758] +[use $newpassword instead of $password consistently +Evan Prodromou **20080624224030] +[show better errors on bad codes +Evan Prodromou **20080624225556] +[subscribe before sending confirmation message +Evan Prodromou **20080626064646] +[use jabber library from xmppdaemon program +Evan Prodromou **20080626070703] +[commit queries in xmppdaemon::add_notice +Evan Prodromou **20080626071213] +[show the proper address in the message for non-email confirms +Evan Prodromou **20080626072159] +[confirmation code sent by web user, not xmppdaemon +Evan Prodromou **20080626073530] +[handle host != server in xmpp, also use one function for connections +Evan Prodromou **20080626075920] +[lost parenthesis in xmppdaemon +Evan Prodromou **20080626080214] +[misunderstood host versus server +Evan Prodromou **20080626080626] +[use jabber.php more from xmppdaemon +Evan Prodromou **20080626150336] +[more logging +Evan Prodromou **20080626151202] +[correct confirm code +Evan Prodromou **20080626152044] +[some UI changes to the IM settings +Evan Prodromou **20080626181144] +[get rid of label on checkbox, just include it as contents +Evan Prodromou **20080626181726] +[move text out of input, into a separate span +Evan Prodromou **20080626182231] +[show checkbox as checked or not +Evan Prodromou **20080626182705] +[stub for jabber_is_subscribed +Evan Prodromou **20080626183117] +[forgot to clone user +Evan Prodromou **20080626183721] +[add a function to show current address +Evan Prodromou **20080626184055] +[some variable names swapped around when I split up the big method +Evan Prodromou **20080626184811] +[fancy URLs for IM settings +Evan Prodromou **20080626184931] +[better instructions on confirmation code +Evan Prodromou **20080626190307] +[compile error with lost dot +Evan Prodromou **20080626190538] +[don't bother with subscription hoohaw; just ask the user to do it +Evan Prodromou **20080626203103] +[lost a couple of variables +Evan Prodromou **20080626203935] +[new version number +Evan Prodromou **20080626205409] \ No newline at end of file diff --git a/_darcs/inventories/20080701185244-34904-63270def0bb343c20fd150490996e6d0e49f40b4.gz b/_darcs/inventories/20080701185244-34904-63270def0bb343c20fd150490996e6d0e49f40b4.gz new file mode 100644 index 0000000000..2d511825b7 --- /dev/null +++ b/_darcs/inventories/20080701185244-34904-63270def0bb343c20fd150490996e6d0e49f40b4.gz @@ -0,0 +1,95 @@ +Starting with tag: +[TAG 0.3.5 +Evan Prodromou **20080626205418] +[limit rss streams to 100 items by default +Evan Prodromou **20080626213018] +[better handling of too-long messages +Evan Prodromou **20080626214654] +[add a bit of instructions +Evan Prodromou **20080626215204] +[better formatting for notice instructions +Evan Prodromou **20080626215308] +[better formatting for notice instructions +Evan Prodromou *-20080626215308] +[take out the instructions +Evan Prodromou **20080626215525] +[xhtml/xml and IE do not mix so well PITS # 00103 +matthew.gregg@gmail.com**20080623173043] +[Missing quote in the conditional CSS for IE browsers. Fix for http://laconi.ca/PITS/00104 +matthew.gregg@gmail.com**20080624171305] +[revert to common_user_error, which is what is used everywhere +Evan Prodromou **20080626225002] +["subscribe" -> "add to buddy list" +Evan Prodromou **20080627143025] +[add some classes to inputs +Evan Prodromou **20080627145553] +[add a space between address and to +Evan Prodromou **20080627154825] +[more natural date strings +Evan Prodromou **20080627222522] +[show exact date when needed +Evan Prodromou **20080627222930] +[822 -> 850 +Evan Prodromou **20080627223439] +[wasn't checking for notify flag +Evan Prodromou **20080630152415] +[beef up the faq +Evan Prodromou **20080630161024] +[add FAQ to foot menu +Evan Prodromou **20080630161201] +[add FAQ rewrite +Evan Prodromou **20080630161304] +[add some documentation on the IM stuff +Evan Prodromou **20080630164341] +[refactor common behaviour in settings pages +Evan Prodromou **20080630170342] +[move markdown require to common +Evan Prodromou **20080630170545] +[return instructions +Evan Prodromou **20080630170653] +[link for im +Evan Prodromou **20080630171317] +[change remote subscribe to link +Evan Prodromou **20080630195032] +[fixup code in showstream +Evan Prodromou **20080630195139] +[fixup formatting on remotesubscribe link +Evan Prodromou **20080701155442] +[class -> id +Evan Prodromou **20080701155651] +[remove formatting for profile_url +Evan Prodromou **20080701155809] +[add instructions to remotesubscribe +Evan Prodromou **20080701163705] +[fancy url for remote subscribe +Evan Prodromou **20080701164058] +[add documentation for OpenMicroBlogging +Evan Prodromou **20080701165717] +[fix link in doc/openmublog +Evan Prodromou **20080701165927] +[make help doc an index to other documents +Evan Prodromou **20080701170521] +[add OpenID documentation +Evan Prodromou **20080701172429] +[formatting in OpenID documentation +Evan Prodromou **20080701172904] +[add more contact information +Evan Prodromou **20080701175611] +[basic help in help page +Evan Prodromou **20080701180205] +[better instructions for login +Evan Prodromou **20080701180611] +[Char counter for notice update text area. http://laconi.ca/PITS/00094 +matthew.gregg@gmail.com**20080624174613 + + Added a util.js and this uses JQuery. + +] +[Removed some DOM lookups in the char counter +matthew.gregg@gmail.com**20080625125847] +[Fix for space being added to notice form +matthew.gregg@gmail.com**20080625142131] +[rationalize with mgs version +Evan Prodromou **20080701182758] +[run the counter once at page load time +Evan Prodromou **20080701183016] \ No newline at end of file diff --git a/_darcs/inventories/20080701185302-34904-46a593cdf2d9abf2d18e005cc3c861d563a3a48c.gz b/_darcs/inventories/20080701185302-34904-46a593cdf2d9abf2d18e005cc3c861d563a3a48c.gz new file mode 100644 index 0000000000..879a8b5b18 --- /dev/null +++ b/_darcs/inventories/20080701185302-34904-46a593cdf2d9abf2d18e005cc3c861d563a3a48c.gz @@ -0,0 +1,3 @@ +Starting with tag: +[TAG 0.4.0 +Evan Prodromou **20080701185244] \ No newline at end of file diff --git a/_darcs/inventories/20080701185323-34904-85f85b33132fc1aea00afb1ec5e3a16cbc638dc6.gz b/_darcs/inventories/20080701185323-34904-85f85b33132fc1aea00afb1ec5e3a16cbc638dc6.gz new file mode 100644 index 0000000000..f937f3676c --- /dev/null +++ b/_darcs/inventories/20080701185323-34904-85f85b33132fc1aea00afb1ec5e3a16cbc638dc6.gz @@ -0,0 +1,9 @@ +Starting with tag: +[TAG 0.4.0 +Evan Prodromou **20080701185302] +[change version number +Evan Prodromou **20080701185305 + + Update the version number. + +] \ No newline at end of file diff --git a/_darcs/inventories/20080702183853-34904-59f0b9eeb79289f12e93db25f660e5b7b1a3e9db.gz b/_darcs/inventories/20080702183853-34904-59f0b9eeb79289f12e93db25f660e5b7b1a3e9db.gz new file mode 100644 index 0000000000..f291d57624 --- /dev/null +++ b/_darcs/inventories/20080702183853-34904-59f0b9eeb79289f12e93db25f660e5b7b1a3e9db.gz @@ -0,0 +1,13 @@ +Starting with tag: +[TAG 0.4.0 +Evan Prodromou **20080701185323] +[fix rememberme checkboxes on login, register +Evan Prodromou **20080702125457] +[full end element, no space in textarea +Evan Prodromou **20080702130029] +[method="POST" to method="post" +Evan Prodromou **20080702131507] +[show current tab correctly on settings menu +Evan Prodromou **20080702131911] +[bump the version number +Evan Prodromou **20080702183839] \ No newline at end of file diff --git a/_darcs/inventories/20080706173453-84dde-bdd84aa8e9dc72eaea72247d03a8620a67a8cec2.gz b/_darcs/inventories/20080706173453-84dde-bdd84aa8e9dc72eaea72247d03a8620a67a8cec2.gz new file mode 100644 index 0000000000..d6adad5123 --- /dev/null +++ b/_darcs/inventories/20080706173453-84dde-bdd84aa8e9dc72eaea72247d03a8620a67a8cec2.gz @@ -0,0 +1,83 @@ +Starting with tag: +[TAG 0.4.1 +Evan Prodromou **20080702183853] +[invert title and content in rss action +Evan Prodromou **20080702214011] +[update using a config'd server +Evan Prodromou **20080703165043] +[add a display url function to display URLs +Evan Prodromou **20080703170347] +[add a queued notice item +Evan Prodromou **20080704040746] +[enqueue notices for offline broadcast +Evan Prodromou **20080704050425] +[a couple of things to make queue items work +Evan Prodromou **20080704052240] +[info about stuff getting queued +Evan Prodromou **20080704053846] +[some logging for queues +Evan Prodromou **20080704055259] +[don't worry about old claims +Evan Prodromou **20080704060213] +[log some errors for missed inserts +Evan Prodromou **20080704062056] +[problem with dates in db error +Evan Prodromou **20080704071726] +[don't treat notice_id like a sequence +Evan Prodromou **20080704082418] +[better notices on commands and errors +Evan Prodromou **20080704201716] +[Validate action parameter +Gina Haeussge **20080704194114 + + Make sure the action request parameter only consists of a-z, A-Z, 0-9, _ or - + to discourage tampering with the following require_once. +] +[spaces on avatars +Evan Prodromou **20080704210954] +[fix galleries +Evan Prodromou **20080704221336] +[a little more error-checking in the queuedaemon +Evan Prodromou **20080705002207] +[error notices +Evan Prodromou **20080705005602] +[nickname in profile, member since in profile +Evan Prodromou **20080705064303] +[move member since to statistics +Evan Prodromou **20080705064618] +[debugging code for rm +Evan Prodromou **20080705161602] +[better debugging +Evan Prodromou **20080705161801] +[rememberme debugging +Evan Prodromou **20080705162142] +[move queuedaemon into xmppdaemon +Evan Prodromou **20080705172837] +[fix checkbox width +Test Server 1 **20080627171700] +[some whitespace differences +Test Server 1 **20080703124652] +[change to use SVN version of XMPPHP +Evan Prodromou **20080705174045] +[don't use old inarow variable +Evan Prodromou **20080705183955] +[use method instead of now-protected attribute for xmpp +Evan Prodromou **20080705184729] +[if not a POST, redirect to subscriptions +Evan Prodromou **20080705213637] +[add queueing variables to confirm_address +Evan Prodromou **20080706031234] +[optionally queue jabber confirmations +Evan Prodromou **20080706035707] +[restrict confirmations in queue to jabber addresses +Evan Prodromou **20080706035838] +[broadcast directly from xmpp daemon +Evan Prodromou **20080704072909] +[fixup disconnected to use method +Evan Prodromou **20080705202412] +[debugging on the live server +Evan Prodromou **20080706061437] +[enable confirmation queue +Evan Prodromou **20080706071319] +[fixes on bourdin for confirm claims +Evan Prodromou **20080706090309] \ No newline at end of file diff --git a/_darcs/inventories/20080710042333-84dde-55b87a5f8cba7992b5c2ca1eeb87838c20ef6a61.gz b/_darcs/inventories/20080710042333-84dde-55b87a5f8cba7992b5c2ca1eeb87838c20ef6a61.gz new file mode 100644 index 0000000000..a54e6bc201 --- /dev/null +++ b/_darcs/inventories/20080710042333-84dde-55b87a5f8cba7992b5c2ca1eeb87838c20ef6a61.gz @@ -0,0 +1,225 @@ +Starting with tag: +[TAG 0.4.2 +Evan Prodromou **20080706173453] +[don't double-escape bio +Evan Prodromou **20080706210809] +[prefer, barely, text/html to application/xhtml+xml +Evan Prodromou **20080706220020] +[First pass at replies support http://laconi.ca/PITS/00080 +matthew.gregg@gmail.com**20080623030837 + + Doesn't handle a reply to a user that has never updated. +] +[fixup conflicts +Evan Prodromou **20080706221758] +[some twiddles in the db for replies, plus the class +Evan Prodromou **20080706223839] +[add replies fancy url and include Reply class +Evan Prodromou **20080707032348] +[twiddle a few bits to make replies work correctly +Evan Prodromou **20080707054358] +[added a script for adding old replies in +Evan Prodromou **20080707055428] +[default for datetime in common_relative_profile +Evan Prodromou **20080707060733] +[use db error logger for common_save_replies +Evan Prodromou **20080707061639] +[fix constant in common_db_log_error +Evan Prodromou **20080707061912] +[check for profile +Evan Prodromou **20080707062347] +[check to see the reply_for worked +Evan Prodromou **20080707062618] +[created -> modified in Reply +Evan Prodromou **20080707063731] +[consolidate show_notice and show_reply +Evan Prodromou **20080707064155] +[change reply info +Evan Prodromou **20080707064430] +[show replies +Evan Prodromou **20080707064607] +[use DB_DataObject join +Evan Prodromou **20080707070545] +[use DB_DataObject join +Evan Prodromou *-20080707070545] +[add repliesrss +Evan Prodromou **20080707072454] +[add in the notice form +Evan Prodromou **20080707072545] +[shorter replies rss +Evan Prodromou **20080707072754] +[fancy url for replies rss +Evan Prodromou **20080707073025] +[better error reporting +Evan Prodromou **20080707074434] +[don't try to do date relative +Evan Prodromou **20080707074755] +[mcdoyon changes to design on dev server +Test Server 1 **20080707173224 + + Marie-Claude did some changes to the design on the dev server. + +] +[get rid of one-pixel border on subscriptions +Evan Prodromou **20080707181150] +[add authorship block to OMB spec +Evan Prodromou **20080707234033] +[autosubscribe for jabber +Evan Prodromou **20080707234050] +[autoreply +Evan Prodromou **20080708003055] +[ignore old password if no old password +Evan Prodromou **20080708041210] +[more debug output for rememberme cookies +Evan Prodromou **20080708064241] +[space in title +Evan Prodromou **20080705064900] +[debugging info for queueing notices +Evan Prodromou **20080704083216] +[debugging info for queueing notices +Evan Prodromou *-20080704083216] +[take out queuing debugging +Evan Prodromou **20080708070457] +[don't do an end tag for empty elements +Evan Prodromou **20080708233218] +[don't call text if you don't mean it +Evan Prodromou **20080708235004] +[p.instructions -> div.instructions +Evan Prodromou **20080709002242] +[notice -> permalink in notices +Evan Prodromou **20080709004349] +[name of form on remote subscribe changed +Evan Prodromou **20080709005342] +[better description of what happens when changing settings +Evan Prodromou **20080709050022] +[some debug stuff for remember me +Evan Prodromou **20080709051943] +[don't refetch user objects so much +Evan Prodromou **20080709055343] +[login -> reenter +Evan Prodromou **20080709060928] +[reword, leave out the OpenID part +Evan Prodromou **20080709061118] +[forgot to change null check at beginning of set user +Evan Prodromou **20080709062502] +[replybutton.darc +mike@ice2o.com**20080708112016 + + Add a simple reply button to notices +] +[fixup required XMPP library +Evan Prodromou **20080709070012] +[fallback to newnotice on reply button, new button with mouseover +Evan Prodromou **20080709071439] +[return false +Evan Prodromou **20080709072244] +[try another tack +Evan Prodromou **20080709072429] +[accept replyto for fancy newnotice URL +Evan Prodromou **20080709072833] +[format replyto name correctly +Evan Prodromou **20080709072953] +[remove replybutton formatting +Evan Prodromou **20080709073159] +[remove current notice code which doesn't seem to do anything +Evan Prodromou **20080709073305] +[better arrow +Evan Prodromou **20080709075045] +[move some things around +Evan Prodromou **20080709080110] +[move again +Evan Prodromou **20080709080206] +[remove version number from OMB spec +Evan Prodromou **20080709183833] +[changes to database +Evan Prodromou **20080709193810] +[store rendered content on save; display pre-rendered content +Evan Prodromou **20080709195238] +[rebuild DB_DataObject classes for new structure +Evan Prodromou **20080709200711] +[wording change in comment +Evan Prodromou **20080709200750] +[reply_to is now stored on the notice, not on the reply record +Evan Prodromou **20080709202346] +[store replies on the notice record, not the reply record +Evan Prodromou **20080709202716] +[show reply_to for notices in profile stream +Evan Prodromou **20080709203237] +[use getCurrentNotice() on profile page +Evan Prodromou **20080709203831] +[use rendered text in profile page stream +Evan Prodromou **20080709203910] +[don't record a reply_to for responses to self +Evan Prodromou **20080709203925] +[wrong comparison operator for saving reply to self +Evan Prodromou **20080709204050] +[defaults for argument functions +Evan Prodromou **20080709214433] +[first pass at people search +Evan Prodromou **20080709214455] +[missing comma in people search +Evan Prodromou **20080709214659] +[move end of form element +Evan Prodromou **20080709214713] +[common_start_element -> common_element_start +Evan Prodromou **20080709214821] +[ignore case when highlighting +Evan Prodromou **20080709215011] +[show p.error when there are no results. +Evan Prodromou **20080709215632] +[change formatting of search output +Evan Prodromou **20080709220045] +[add some CSS for the people lists +Evan Prodromou **20080709220446] +[don't inline p's in the people list +Evan Prodromou **20080709220656] +[list of profiles +Evan Prodromou **20080709220856] +[fixup end tag in login (not used, maybe later) +Evan Prodromou **20080709221735] +[add instructions to people search +Evan Prodromou **20080709221754] +[remove hr -- CSS takes care of it +Evan Prodromou **20080709221826] +[add fancy urls for search +Evan Prodromou **20080709223144] +[fix syntax errors in URL builder +Evan Prodromou **20080709223409] +[use smarter query builder +Evan Prodromou **20080709223701] +[try some scoping +Evan Prodromou **20080709223803] +[better instructions +Evan Prodromou **20080709223910] +[highlight homepage in search results +Evan Prodromou **20080709225929] +[specialchars() text in search results +Evan Prodromou **20080709225942] +[first pass at a notice search +Evan Prodromou **20080709230017] +[refactor common code between searches and between search and settings +Evan Prodromou **20080709231031] +[require search action lib in search actions +Evan Prodromou **20080709231217] +[some debug code to find a problem with terms +Evan Prodromou **20080709231503] +[found missing second term +Evan Prodromou **20080709231539] +[better highlighting in URL +Evan Prodromou **20080709231638] +[missing second argument +Evan Prodromou **20080709231821] +[change some parens +Evan Prodromou **20080709231948] +[correct class for ul +Evan Prodromou **20080709232350] +[add notice search rss ("tracking") +Evan Prodromou **20080709234228] +[order search rss items by date desc +Evan Prodromou **20080710032835] +[mc's changes on test1 +Test Server 1 **20080710032953] +[add both my and mc's stuff to the display.css +Evan Prodromou **20080710033108] +[update version number +Evan Prodromou **20080710042324] \ No newline at end of file diff --git a/_darcs/inventories/20080710045454-84dde-4f33e8ca41dcbd0bf0a69c28c56d7ec716f1c48a.gz b/_darcs/inventories/20080710045454-84dde-4f33e8ca41dcbd0bf0a69c28c56d7ec716f1c48a.gz new file mode 100644 index 0000000000..706b099865 --- /dev/null +++ b/_darcs/inventories/20080710045454-84dde-4f33e8ca41dcbd0bf0a69c28c56d7ec716f1c48a.gz @@ -0,0 +1,5 @@ +Starting with tag: +[TAG 0.4.3 +Evan Prodromou **20080710042333] +[lost a closing tag in peoplesearch +Evan Prodromou **20080710042930] \ No newline at end of file diff --git a/_darcs/inventories/20080718164332-34904-c590580bef21d90072f988d2597154b954823299.gz b/_darcs/inventories/20080718164332-34904-c590580bef21d90072f988d2597154b954823299.gz new file mode 100644 index 0000000000..8699583269 --- /dev/null +++ b/_darcs/inventories/20080718164332-34904-c590580bef21d90072f988d2597154b954823299.gz @@ -0,0 +1,414 @@ +Starting with tag: +[TAG 0.4.3 +Evan Prodromou **20080710045454] +[don't auto-pull OpenID parameters +Evan Prodromou **20080710151842] +[bug in userbyid +Evan Prodromou **20080711042022] +[get avatar by nickname +Evan Prodromou **20080711060045 + + This is to support third-party apps that want to build an URL to an + avatar given a user's name. + +] +[add 'avatar' to blacklisted names +Evan Prodromou **20080711171113] +[better error checking in shownotice +Evan Prodromou **20080711171345] +[check for error, not success! +Evan Prodromou **20080712051738] +[Log msgs can now go to a file as well as syslog +zach@copley.name**20080711070021] +[add the logfile entry to common, a little recoding in common_log +Evan Prodromou **20080712151521] +[Convert _t() to _() for gettext. +Mike Cochrane **20080708094531 + + +] +[Remove tralling whitespace on lines and a gettext replacement that I missed. +Mike Cochrane **20080708095113 + +] +[Translate a few more strings. +Mike Cochrane **20080708100519] +[bracket in the wrong place +Mike Cochrane **20080708130408] +[Merge conflicts and kill a whole lot of trailing whitespace on lines. +Mike Cochrane **20080709224630] +[Resolve conflicts and convert _t( to _( where it was introduced again. +Mike Cochrane **20080710045126] +[Resolve conflict properly +Mike Cochrane **20080710045942] +[Bracket in correct place +Mike Cochrane **20080710050202] +[Missing sprintf +Mike Cochrane **20080710050459] +[More _t( to _( and sprintfs in new code +Mike Cochrane **20080710051035] +[Trailing whitespace on lines +Mike Cochrane **20080710051201] +[Missed one _t +Mike Cochrane **20080710051331] +[Stop after a redirect. Fixed remote subscription for me. +Mike Cochrane **20080710055726] +[Convert more _t s to _ +Mike Cochrane **20080712115300] +[Error I made merging a diff +Mike Cochrane **20080712123942] +[try to show zeroes in statistics +Evan Prodromou **20080712200909] +[fixup name sent in subject of confirmation email +Evan Prodromou **20080712202017] +[lost the site name, and moved everything into sprintf of gettext +Evan Prodromou **20080712202903] +[reformat mail again +Evan Prodromou **20080712204923] +[format string, again +Evan Prodromou **20080712205220] +[change search forms to get (PITS 00248) +Evan Prodromou **20080712214610] +[multibyte counter +drry **20080708090418 + #00179 +] +[check type, not value, of counts +Evan Prodromou **20080713003932] +[first pass at a sitemap generator +Evan Prodromou **20080713004936] +[twiddle some parens in imsettings for gettext +Evan Prodromou **20080713130112] +[restore enhanced login instructions, lost in gettext() switchover +Evan Prodromou **20080713151004] +[little lost hash +Evan Prodromou **20080713151035] +[Fixed non openid registration +Mike Cochrane **20080713024754] +[Sort notices on the public page where they were posted in the same second +Mike Cochrane **20080713042238] +[Merge some gettext strings to one line so translation tools are happier +Mike Cochrane **20080713044608] +[Colapse a lot of strings to make like easier for translators and more consisitant for users +Mike Cochrane **20080713053748] +[locale/laconica.pot can be used as a translation template to translate loconica. +Mike Cochrane **20080713060055 + + I have added an en_NZ translation which has a few of the spelling differences that we have down here. + + Until a language interface is created add something like: + /* Set locale */ + setlocale(LC_ALL, 'en_NZ'); + bindtextdomain("laconica", './locale'); + textdomain("laconica"); + + to index.php to allow you to test your new locale. I used http://www.poedit.net/ to edit the locale. Also see http://nz2.php.net/manual/en/function.setlocale.php#82288 is you're having issues getting you locale to work on linux. + + +] +[Sort notices by date then id so they are in the correct order when there are multiple in the same second +Mike Cochrane **20080713065009] +[conflict resolution after pulling from mikenz +Evan Prodromou **20080713215601] +[remove dataobject.ini +Evan Prodromou **20080713220114 + + This is a useful file for development but not for deployment. Deleting + it so people don't use it on production servers. + +] +[remove old file from themes dir +Evan Prodromou **20080713222006] +[remove old index file +Evan Prodromou **20080713222056] +[fixing IM message, AGAIN +Evan Prodromou **20080714022055] +[extra space in link +Evan Prodromou **20080714060517] +[add handle_session() +Evan Prodromou **20080714124733] +[utility for getting avatar or default avatar +Evan Prodromou **20080714034443] +[add extra Twitter cruft to jabber messages +Evan Prodromou **20080714034503] +[make broadcast send notice with extra Twitter cruft +Evan Prodromou **20080714034647] +[forgot to send a null for subject in XMPP message +Evan Prodromou **20080714043459] +[get the msg to format +Evan Prodromou **20080714044153] +[debugging changes on development server +Evan Prodromou **20080714140209] +[encode special chars in atom payload +Evan Prodromou **20080714143042] +[build stanza ourselves, without library +Evan Prodromou **20080715033711] +[work around probs with XMPPHP library +Evan Prodromou **20080715190519] +[replies from people you're not subscribed to over Jabber +Evan Prodromou **20080715195513] +[more info at registration time, better message when you're finished +Evan Prodromou **20080715213202] +[fix checkbox for license +Evan Prodromou **20080715214249] +[better formatting in registration results +Evan Prodromou **20080715214612] +[more formatting for registration success +Evan Prodromou **20080715214934] +[maybe an extra \n will help my formatting +Evan Prodromou **20080715215407] +[one more linefeed +Evan Prodromou **20080715215556] +[remove email settings from profile settings ahead of having its own tab +Evan Prodromou **20080715220144] +[move email settings to its own tab +Evan Prodromou **20080715221826] +[unique key on a boolean value is not scalable +Evan Prodromou **20080715221946] +[rebuild classes based on DB change +Evan Prodromou **20080715222026] +[bad class name in emailsettings +Evan Prodromou **20080715222342] +[correct name for common_canonical_email +Evan Prodromou **20080715222554] +[confirm address +Evan Prodromou **20080715223149] +[Take full path for index file, not just name; change any "hourly" changefreqs to "daily"; add small function for W3C timestamps. +Earle Martin **20080714000833] +[Include user name in item titles for RSS aggregator users. +Earle Martin **20080714153859] +[Add SIOC data to global RSS feed. +Earle Martin **20080714191328] +[Don't capture trailing ")", "]" or ">" as part of URLs +Earle Martin **20080715022045] +[only loop through the list if there's a list +Evan Prodromou **20080716004414] +[PITS.00114: 'T USERNAME' should work like an @-link +erik@erikstambaugh.com**20080709010415] +[add alternative reply format +Evan Prodromou **20080716025842] +[got the args to array unshift backwards +Evan Prodromou **20080716030022] +[back out my change to the link format; see if it helps +Evan Prodromou **20080716030200] +[more array munging +Evan Prodromou **20080716031346] +[lcase tname +Evan Prodromou **20080716031459] +[yet more array munging +Evan Prodromou **20080716031544] +[sigh +Evan Prodromou **20080716031718] +[Update laconica.pot with latest strings +Mike Cochrane **20080714091337] +[The first translation of laconica, fr_FR translation from Florian Biree . Thanks :-) +Mike Cochrane **20080714091448 + + + To test locales add code like this to your index.php: + + /* Set locale */ + setlocale(LC_ALL, 'fr_FR'); + bindtextdomain("laconica", './locale'); + bind_textdomain_codeset("laconica", 'UTF-8'); + textdomain("laconica"); + + UI coming soon from someone else for changing your language. + + +] +[Fixup rememberme cookie handling in the POST only case +Dave Barry **20080714050037] +[lost else +Evan Prodromou **20080716053532] +[error handler in xmppdaemon +Evan Prodromou **20080716054932] +[add some warnings and stuff +Evan Prodromou **20080716061933] +[bad default for email on command-line systems +Evan Prodromou **20080716055326] +[slightly better error handling +Evan Prodromou **20080716064736] +[better formatting on custom error +Evan Prodromou **20080716134408] +[slight code hygiene for rssaction +Evan Prodromou **20080716152009 + + I moved the $creators array from being a global variable to being an + instance variable. + + I also changed the URL that was used for the user, based on whether + they're a remote or local user. + + Finally, I changed instances of $config to calls to common_config(). + +] +[utility function for getting a profile URI +Evan Prodromou **20080716152511 + + I added a utility function for getting a profile URI. At some point we + need to push commonalities between Remote_profile and User into the + Profile class; single-table inheritance. We do a lot of switching + around for no good reason on users and profiles. + +] +[use root url of site, not hard-coded identi.ca URL +Evan Prodromou **20080716152906] +[creator_url => creator_uri +Evan Prodromou **20080716163339] +[remove tag URI stuff; unused and confusing +Evan Prodromou **20080716205359] +[default value for avatar server +Evan Prodromou **20080716205541] +[theme server support +Evan Prodromou **20080716205947] +[default timezone +Evan Prodromou **20080716210949] +[no such user in replies. +Evan Prodromou **20080717124215] +[add a description with the bio in it to HTML head +Evan Prodromou **20080717124719] +[better log message for incoming presence +Evan Prodromou **20080717132452] +[public indexers in config file +Evan Prodromou **20080717134331] +[remove default priority from sitemaps +Evan Prodromou **20080717153657] +[use common functions +Evan Prodromou **20080717155212 + + I used the common function for the avatar URL, in case there's an + avatar server. + + I used the common W3C DTF function. + +] +[remove unused call to undefined function +Evan Prodromou **20080717155438] +[restrict avatars to certain sizes in SQL +Evan Prodromou **20080717160257] +[avatar files never change +Evan Prodromou **20080717160531] +[add rel=me to homepage link +Evan Prodromou **20080717163211] +[define syslog variables in common.php +Evan Prodromou **20080717163613] +[uniquify the list of reply nicknames (DOH!) +Evan Prodromou **20080717164042] +[First volly at a Twitter-compatible API. Just working out the +zach@copley.name**20080712081247 + detials of 1) Basic Auth and 2) dispatch to the right Action class + files to handle the requests. + + You can hit it with... + + http://localhost/laconica/api/public_timeline.json + + or to try Basic Auth you can try something like: + + http://nickname:password@localhost/laconica/api/statuses/friends_timeline.xml + + Although that actual method isn't done yet, so it should authenticate + and then complain. + +] +[Comment changed to reflect reality +zach@copley.name**20080713083853] +[Second shot at figuring out action dispatch for Twitter-compatible API +zach@copley.name**20080714080741] +[Stubs for all Twitter-API methods +zach@copley.name**20080714080949] +[All Twitter-compatible API calls answer now +zach@copley.name**20080714190300] +[First Twitter-compat API call works! /api/help/test.format +zach@copley.name**20080714202728] +[Twitter-compatible API: /statuses/public_timeline.xml sorta works +zach@copley.name**20080715031812] +[Prepended 'Twit' to Twitter-compatible API actions (renamed action +zach@copley.name**20080715043121 + files) to make it more clear what the action files are for. +] +[Twitter-compatible API: public_timeline.xml more complete +zach@copley.name**20080715065850] +[Twitter-compatible API: refactor in prep for json, rss, and atom formats +zach@copley.name**20080715234131] +[Twitter-compatible API: public_timeline.json now works +zach@copley.name**20080716060922] +[Twitter-compatible API: public_timeline.rss mostly working +zach@copley.name**20080716072124] +[Twitter-compatible API: public_timeline.rss really works now +zach@copley.name**20080716191847] +[Twitter-compatible API: public_timeline.atom works +zach@copley.name**20080716205218] +[Twitter-compatible API - code cleanup +zach@copley.name**20080716220223] +[Twitter-compatible API: statuses/show/id.format now works +zach@copley.name**20080716230047] +[Twitter-compatible API - /statuses/show and /statuses/update now work +zach@copley.name**20080717054411] +[add friend statuses, refactor output functions +Evan Prodromou **20080717210519] +[support id, user timeline +Evan Prodromou **20080717211942] +[sprintf error +Evan Prodromou **20080717213214] +[Twitter-API: /statuses/replies.format now works (mostly) +zach@copley.name**20080717222845] +[Twitter-compatible API /statuses/replies.format -- changed subtitle to be more like Twitter's +zach@copley.name**20080717223521] +[Twitter-compatible API: /statuses/user_timeline/argument.format now works +zach@copley.name**20080718002131] +[Twitter-compatible API - updated rewrite rules to support /statuses/user_timeline +zach@copley.name**20080718002324] +[Link author avatars to posts directly. +Earle Martin **20080716183052] +[hand-built links.ini +Evan Prodromou **20080718013444] +[Twitter-compatible API: white listed user_timeline and show as per twitter +zach@copley.name**20080718023334] +[Twitter-compatible API - first crack at /statuses/followers.format +zach@copley.name**20080718025554] +[Twitter-API: /account/verify_credentials.format now works +zach@copley.name**20080718040332] +[move mail notification to a utility function +Evan Prodromou **20080718041231] +[show friendship stuff +Evan Prodromou **20080718041323] +[add nonce links +Evan Prodromou **20080718041549] +[beware of shadows +Evan Prodromou **20080718041633] +[null reference error +Evan Prodromou **20080718042030] +[getting the id from the wrong place +Evan Prodromou **20080718042352] +[start and end xml +Evan Prodromou **20080718042511] +[init and end documents +Evan Prodromou **20080718043456] +[when in doubt, start throwing transactions around +Evan Prodromou **20080718043735] +[exit on error +Evan Prodromou **20080718044905] +[add create stamp to subscription in api +Evan Prodromou **20080718045150] +[change fetch to find in api +Evan Prodromou **20080718045204] +[handle some more cases +Evan Prodromou **20080718050845] +[add api data +Evan Prodromou **20080718051318] +[forgot ending element for users +Evan Prodromou **20080718051404] +[add argumented friends and followers to api +Evan Prodromou **20080718051841] +[pages and limits +Evan Prodromou **20080718052557] +[add an HTML payload to outgoing notices +Evan Prodromou **20080718063130] +[forgot the user's name in HTML output +Evan Prodromou **20080718070252] +[remove API from list of unimplemented features. +Evan Prodromou **20080718164120] +[increment software version +Evan Prodromou **20080718164317] \ No newline at end of file diff --git a/_darcs/inventories/20080731050646-34904-b17417e7a20088b81fd47484c29bb0922de94acf.gz b/_darcs/inventories/20080731050646-34904-b17417e7a20088b81fd47484c29bb0922de94acf.gz new file mode 100644 index 0000000000..192e98bbce --- /dev/null +++ b/_darcs/inventories/20080731050646-34904-b17417e7a20088b81fd47484c29bb0922de94acf.gz @@ -0,0 +1,375 @@ +Starting with tag: +[TAG 0.4.4 +Evan Prodromou **20080718164332] +[quote match terms +Evan Prodromou **20080718183534] +[Twitter-compatible API - added missing double quotes to WWW-Authenticate header +zach@copley.name**20080718185053] +[LOG_ERROR -> LOG_ERR +Evan Prodromou **20080718190835] +[add basic auth for user_timeline +Evan Prodromou **20080719154753] +[try again with user_timeline auth +Evan Prodromou **20080719155526] +[bare auth for friends, too +Evan Prodromou **20080719171023] +[correct handling of bareauth +Evan Prodromou **20080719171605] +[Update pot file +Mike Cochrane **20080717235306] +[Fix a couple of notice errors +Mike Cochrane **20080720023259] +[Another notice error +Mike Cochrane **20080720023510] +[A couple more notice errors +Mike Cochrane **20080720025546] +[Some more notice errors - I guess I'm the only one developing with E_ALL +Mike Cochrane **20080720033236] +[Don't highlight search terms inside url +Mike Cochrane **20080720033401] +[Add hidden form value when the site is not in fancy mode so the action is not lost +Mike Cochrane **20080720040351] +[mailer daemon start +Evan Prodromou **20080717132533] +[some missing methods +Evan Prodromou **20080718180951] +[fixup error +Evan Prodromou **20080718181612] +[better error msg +Evan Prodromou **20080718185027] +[LOG_ERROR => LOG_ERR in maildaemon +Evan Prodromou **20080718191019] +[better type logic +Evan Prodromou **20080718202052] +[pass type to error +Evan Prodromou **20080718202124] +[add some logging +Evan Prodromou **20080718202702] +[add a transport flag to queue items +Evan Prodromou **20080719140906] +[use mailparse +Evan Prodromou **20080719142058] +[email settings for post by email +Evan Prodromou **20080719202625] +[save emailpost flag +Evan Prodromou **20080720053431] +[first pass at list of SMS carriers for SMS-to-email gateway +Evan Prodromou **20080720053458] +[start sms settings +Evan Prodromou **20080720193005] +[wrong name for email settings action file +Evan Prodromou **20080720193132] +[require sms carrier +Evan Prodromou **20080720193228] +[confirmation for sms +Evan Prodromou **20080720193712] +[add sms broadcast to broadcasting +Evan Prodromou **20080720195549] +[clarify that charges may be exorbitant +Evan Prodromou **20080720195834] +[bad string in SQL query +Evan Prodromou **20080720200039] +[add autosubscribe flag to users +Evan Prodromou **20080720200530] +[add autosubscribe +Evan Prodromou **20080720201620] +[add autosubscribe to profile settings +Evan Prodromou **20080720202705] +[too much merlot on the airplane, dumb syntax mistake +Evan Prodromou **20080720202832] +[$true not the same as true +Evan Prodromou **20080720233308] +[fixup autosubscribe save +Evan Prodromou **20080720233712] +[shorter confirmation message and web iface to confirm +Evan Prodromou **20080721011128] +[forgot to p +Evan Prodromou **20080721012301] +[get the correct code +Evan Prodromou **20080721012405] +[stop overwriting links.ini +Evan Prodromou **20080721035853] +[add sms email address to user +Evan Prodromou **20080721035919] +[add flag for sms replies +Evan Prodromou **20080721040551] +[use user field rather than re-building sms email over and over +Evan Prodromou **20080721040614] +[use smsemail stored value +Evan Prodromou **20080721042302] +[trim mail and maildaemon +Evan Prodromou **20080721042333] +[scrub mail content a bit more +Evan Prodromou **20080721043734] +[explode WHAT, again? +Evan Prodromou **20080721044015] +[output with whitespace between lines +Evan Prodromou **20080721044135] +[save changes to smsemail +Evan Prodromou **20080721044604] +[multitype (???) -> multipart +Evan Prodromou **20080721045119] +[some more scrubbing +Evan Prodromou **20080721050508] +[rewrite for settings of sms +Evan Prodromou **20080721083758] +[checkbox named wrong in sms settings +Evan Prodromou **20080721084801] +[update keys for incomingemail +Evan Prodromou **20080721085641] +[fix mail sending +Evan Prodromou **20080721090819] +[SQL error +Evan Prodromou **20080721091854] +[logging and checking +Evan Prodromou **20080721092813] +[do the sms query the dumb way +Evan Prodromou **20080721093401] +[return true from mail sms broadcast +Evan Prodromou **20080721093457] +[maildaemon enqueues +Evan Prodromou **20080721133337] +[Twitter-compatible API: /account/update_location implemented +zach@copley.name**20080720044756] +[Twitter-compatible API - Error handling that better matches Twitter's +zach@copley.name**20080720070905] +[Twitter-compatible API - refactoring and bug fixes +zach@copley.name**20080720083428] +[Twitter-compatible API: /friendship/exists always failed - fixed! +zach@copley.name**20080720083948] +[Twitter-compatible API: /help/test was emmitting dupe elements. Fixed. +zach@copley.name**20080721091702] +[better confirm cancel +Evan Prodromou **20080721162434] +[correct values for hidden fields +Evan Prodromou **20080721162857] +[mark notices as local +Evan Prodromou **20080722141614] +[mark incoming notices as local or not +Evan Prodromou **20080722141828] +[public timeline only gets local notices +Evan Prodromou **20080722142050] +[every user is subscribed to themselves +Evan Prodromou **20080722144154] +[centralize and optimize with-friends query +Evan Prodromou **20080722160213] +[blow off DB_DataObject joins, write SQL from scratch +Evan Prodromou **20080722161549] +[whitespace in SQL +Evan Prodromou **20080722161712] +[another whitespace SQL error +Evan Prodromou **20080722161752] +[notices and counts +Evan Prodromou **20080722162332] +[don't get a count from query +Evan Prodromou **20080722163116] +[don't get a count anywhere +Evan Prodromou **20080722163200] +[hide magic self subscription +Evan Prodromou **20080722163511] +[fix content check so it shows zeros +Evan Prodromou **20080722163618] +[correctly return 0 for zero followers +Evan Prodromou **20080722164129] +[add notice sources (currently unused) +Evan Prodromou **20080722164639] +[lost the nickname changing from profile to user +Evan Prodromou **20080722173613] +[Twitter-compatible API - location_update was spitting out the wrong profile. Fixed. +zach@copley.name**20080721174438] +[Added is_readonly() method to all Actions +zach@copley.name**20080722171501] +[Twitter-compatible API: made is_readonly() method smarter +zach@copley.name**20080722182919] +[base class is_readonly() now returns false by default +zach@copley.name**20080722212056] +[use a random mirror +Evan Prodromou **20080724171213] +[default for mirror in DB +Evan Prodromou **20080724205456] +[ensure that there's a session before redirecting the user +Evan Prodromou **20080724231833] +[let admins prevent registration +Evan Prodromou **20080724235508] +[don't show register link if the site is closed +Evan Prodromou **20080724235804] +[add local flag for stuff posted over the API +Evan Prodromou **20080727023516] +[four key SMS providers had ' (SMS)' appended to their patterns +Evan Prodromou **20080729032845] +[Fixed location of bracket for gettext. +Mike Cochrane **20080713053033] +[Resolve conflict +Mike Cochrane **20080714025853] +[More notice errors and fix and incorrect variable name +Mike Cochrane **20080720055558] +[First cut at hastags support. +Mike Cochrane **20080720055702] +[Missing ini settings for notice_tag table +Mike Cochrane **20080720080801] +[Add rewrite rules for tags +Mike Cochrane **20080720081021] +[Add tag action +Mike Cochrane **20080720081838] +[Set constant to propper value, not debug value +Mike Cochrane **20080720082641] +[Update of the fr_FR translation +florian@biree.name**20080719162355] +[Added notice deletion http://laconi.ca/PITS/00045 +matthew.gregg@gmail.com**20080716032045 + + Removes selected notice and any replies that reference it. + Attempts to de-queue anything pending. + + This patch does not archive notices. +] +[Patch for PITS 00032, 00033, 00034 +matthew.gregg@gmail.com**20080719003417] +[Adds Opensearch description +matthew.gregg@gmail.com**20080720015823] +[Sort tags by highest frequency then most recent +Mike Cochrane **20080720094832] +[Notice error +Mike Cochrane **20080720094917] +[Clean up of delete links when not logged in +Mike Cochrane **20080720094954] +[Update for langauge column +Mike Cochrane **20080720095651] +[Fix undefined variable error +Mike Cochrane **20080720100024] +[Regenerate class file for language column +Mike Cochrane **20080720100253] +[Fullname is in the profile, not the user object +Mike Cochrane **20080720101553] +[Add rel="contact" to subscription on profile page. http://laconi.ca/PITS/00275 +Mike Cochrane **20080720101947] +[gettext strings and pass the query string between tabs http://laconi.ca/PITS/00231 +Mike Cochrane **20080720105659] +[Block access to .ini files http://laconi.ca/PITS/00240 +Mike Cochrane **20080720112032] +[Explicitly set the character set on the handle column to fix http://laconi.ca/PITS/00262 +Mike Cochrane **20080720113458] +[Fix errors from delete code when viewing a user's profile while not logged in. +Mike Cochrane **20080720122715] +[Strip characters that shouldn't be in xml. Fixes http://laconi.ca/PITS/00253 for future messages, or all after a regeneration of rendered messages +Mike Cochrane **20080720122832] +[Clean up delete code. Add missing htaccess rule. Exit after errors so the code doesn't continue running. +Mike Cochrane **20080720124552] +[User definable timezones. Work in UTC internally and display per user/site default. http://laconi.ca/PITS/00011 +Mike Cochrane **20080720141325] +[Locate examples in config +Mike Cochrane **20080720141543] +[Opensearch updates +matthew.gregg@gmail.com**20080720195505 + + This adds htaccess and searches for people and notices. + +] +[Get text wrappers around strings so they can be in the native language of the site and use fancy urls if appropriate +mikec@mikenz.geek.nz**20080721090110] +[Publish MicroIDs for email and mpp on profile and notice pages. +mikec@mikenz.geek.nz**20080721120036] +[Changse to ini file that I always forget to record +Mike Cochrane **20080721123243] +[Update POT file +Mike Cochrane **20080721123519] +[Resolve conflicts after pull from evan +mikec@mikenz.geek.nz**20080721135637] +[Add error file and line to the xmppdaemon error handler +Mike Cochrane **20080722064607] +[Add vodafone New Zealand +Mike Cochrane **20080722082526] +[Only try sending xmpp notices if xmpp is enabled +Mike Cochrane **20080722082653] +[Only Set reply details if there is something to reply to +Mike Cochrane **20080722082724] +[No errors if it's not set +Mike Cochrane **20080722082840] +[Add SMS mail config to sample config +Mike Cochrane **20080722100828] +[Resolve conflicts +Mike Cochrane **20080722205315] +[Index on the correct column +Mike Cochrane **20080722205335] +[Lazy/Auto load the class files as needed +Mike Cochrane **20080724234533] +[Correct variable name +Mike Cochrane **20080724234601] +[Cache the DateTimeZon objects +Mike Cochrane **20080724234619] +[Auto/Lazy load the class files +Mike Cochrane **20080724234701] +[Queue_item correct name in dequeue function +Evan Prodromou **20080726033958] +[change 'deletenotice' to 'notice/delete' +Evan Prodromou **20080726034209] +[require validation code +Evan Prodromou **20080729025156] +[Orange (UK) for carriers +Evan Prodromou **20080729182534] +[rel=tag for hashtags +Evan Prodromou **20080729182558] +[force re-render on all notices whether or not they're already rendered +Evan Prodromou **20080729183154] +[change tag output to a tag cloud +Evan Prodromou **20080729193533] +[show the weight in output (for my own edification) +Evan Prodromou **20080729194246] +[relative info, too +Evan Prodromou **20080729194457] +[if-else instead of ?: +Evan Prodromou **20080729194735] +[change relative names to percentages in font sizes +Evan Prodromou **20080729195055] +[fix css selector +Evan Prodromou **20080729195204] +[shift some font sizes around +Evan Prodromou **20080729195307] +[justify the tag cloud +Evan Prodromou **20080729195405] +[justify -> center +Evan Prodromou **20080729195512] +[refactor notice-adding code to one static method on Notice +Evan Prodromou **20080730022856] +[save the source +Evan Prodromou **20080730025052] +[remember to broadcast in api, and also use the right ID +Evan Prodromou **20080730030012] +[show where a notice came from +Evan Prodromou **20080730032651] +[fallback for unknown source +Evan Prodromou **20080730032918] +[new -> staticGet +Evan Prodromou **20080730033304] +[use a little X instead of "delete" for delete link, right after arrow +Evan Prodromou **20080730033804] +[show the right stuff on profile page, too +Evan Prodromou **20080730033939] +[move the language info, fix dir for locales +Evan Prodromou **20080730035446] +[output on fixup_hashtags +Evan Prodromou **20080730191753] +[Twitter-compatible API: better error handling for replier_by_reply() +zach@copley.name**20080728230221] +[Update some gettext strings and number the arguements so life is easier for translators +Mike Cochrane **20080729080641] +[Resolve conflicts +Mike Cochrane **20080731004922] +[Twitter-compatible API: implemented /users/show.format method +zach@copley.name**20080730213226 + (and some API bug fixes) +] +[let @rejon do the homework http://ur1.ca/17c +Evan Prodromou **20080731020433] +[try to slim down the top menu so it all fits +Evan Prodromou **20080731020933] +[Envoyer -> Poster +Evan Prodromou **20080731031652] +[Poster -> Envoi (coding by microblog, probably a first) +Evan Prodromou **20080731033641] +[change the font sizes in the tag cloud +Evan Prodromou **20080731040703] +[ksort() the tags list +Evan Prodromou **20080731041000] +[version upgrade +Evan Prodromou **20080731050632] \ No newline at end of file diff --git a/_darcs/inventories/20080922225224-84dde-625df932503bbcfc34e4eecc6aec09c5a0509315.gz b/_darcs/inventories/20080922225224-84dde-625df932503bbcfc34e4eecc6aec09c5a0509315.gz new file mode 100644 index 0000000000..da247966a3 --- /dev/null +++ b/_darcs/inventories/20080922225224-84dde-625df932503bbcfc34e4eecc6aec09c5a0509315.gz @@ -0,0 +1,869 @@ +Starting with tag: +[TAG 0.5.0 +Evan Prodromou **20080731050646] +[add edo's tagcloud code +Evan Prodromou **20080731132302] +[extend length of source for notices +Evan Prodromou **20080731152731] +[added conneg for action/userbyid so that foaf can be delivered to clients that want application/rdf+xml +ehs@pobox.com**20080801164623] +[update .pot from source code +Evan Prodromou **20080803232102] +[change no-such-user error to a 404 instead of a 400 +Evan Prodromou **20080804132001] +[use an outstanding unconfirmed email address for password recovery if available +Evan Prodromou **20080804130914] +[better handling of unconfirmed email addresses +Evan Prodromou **20080804133253] +[use noreply address as fallback if no incoming email address exists +Evan Prodromou **20080804133933] +[add commands to turn sms notification on and off +Evan Prodromou **20080804190749] +[ignore OTR messages over Jabber (I think) +Evan Prodromou **20080806002134] +[make init of lang environment happen earlier, or when user language may have changed +Evan Prodromou **20080806034515] +[Set the C locate to avoid tr_TR php bug see http://www.topolis.lt/php/#35050 +mikec@mikenz.geek.nz**20080804133727] +[Add other languages to drop down +Mike Cochrane **20080805020520] +[fixup locale stuff from mikenz +Evan Prodromou **20080806040433] +[fix config global +Evan Prodromou **20080806122119] +[update French translation with msgmerge +Evan Prodromou **20080806161748] +[LOG_ERROR -> LOG_ERR (again) +Evan Prodromou **20080807234227] +[emergency fixup for bad notices in notice search +Evan Prodromou **20080811175318] +[make tag dropoff configurable +Evan Prodromou **20080811175820] +[Twitter-compatible API - /statuses/update.format now decodes HTML chars, such as & +zach@copley.name**20080731224911] +[Twitter-compatible API: filled in the source attr for notices accessed via API +zach@copley.name**20080809001240] +[fix problem with new notices +Evan Prodromou **20080811181158] +[correct sitemapindex output +Evan Prodromou **20080811200058] +[fix some errors in sitemaps +Evan Prodromou **20080812011600 + + Only show notices that don't have a remote URL. That should include + only local notices. + + Also, don't do an avatar sitemap; apparently nobody indexes these + anyways. + +] +[correctly show URL for rare notice without an URI +Evan Prodromou **20080812121832] +[get rid of dataobject.ini -- again +Evan Prodromou **20080813180239] +[auto-load OAuthRequest +Evan Prodromou **20080813195408] +[move user registration to a single static method +Evan Prodromou **20080814002038] +[Twitter-compatible API: removed redundant decoding step; already taken care of by util.php's common_render_content() +zach@copley.name**20080813193327] +[Twitter-compatible API: support for new in_reply_to_status_id in statuses/update +zach@copley.name**20080815185317] +[name omb_listener param so we can refer to it in error msg +Evan Prodromou **20080816151057] +[make settings and search menus localisable +Evan Prodromou **20080817150244] +[move command-line scripts to their own dir +Evan Prodromou **20080813154603] +[accept 140-character UTF-8 strings to content +Evan Prodromou **20080817151751] +[debug for content too long +Evan Prodromou **20080817152419] +[use UTF-8 as the internal encoding +Evan Prodromou **20080817153024] +[remove hack to count bytes, not chars, in JS, since we now use chars +Evan Prodromou **20080817153143] +[typo in forgotten password string +Evan Prodromou **20080817163324] +[accept 140 chars in API, too +Evan Prodromou **20080817192710] +[use mb_substr for xmpp daemon check +Evan Prodromou **20080818025549] +[first step towards adding favorites to the system +Evan Prodromou **20080813142637] +[Database uses UTF-8 by default +Evan Prodromou **20080817151728] +[restore fave table lost when doing utf8 upgrade +Evan Prodromou **20080817152108] +[trim whitespace in laconica.sql +Evan Prodromou **20080817152133] +[set internal encoding in XMPP daemon +Evan Prodromou **20080818033049] +[broadcast remote notices +Evan Prodromou **20080819182724] +[add remote flag to broadcast of notices +Evan Prodromou **20080819182824] +[add database tables for foreign services +Evan Prodromou **20080819221214] +[Twitter-compatible API - running all strings through gettext() now +zach@controlyourself.ca**20080819002903] +[Twitter-compatible API - moved show() to the right file +zach@controlyourself.ca**20080819003931] +[Twitter-compatible API - /statuses/destroy method implemented +zach@controlyourself.ca**20080819194610] +[Twitter-compatible API - Added /statuses/followers to methods that +zach@controlyourself.ca**20080819195431 + require bareauth only if no nickname/id is supplied. +] +[Twitter-compatible API - /statuses/show - better err msg if notice doesn't exist +zach@controlyourself.ca**20080819202318] +[Twitter-compatible API - RESTfulness checks as per Twitter +zach@controlyourself.ca**20080819214923] +[add Cincinnati Bell Wireless +Evan Prodromou **20080821125306] +[include external libs in a subdir to make install easier +Evan Prodromou **20080822131714] +[local-only is optional on public timeline +Evan Prodromou **20080822210307] +[add note to config.php.sample about localonly +Evan Prodromou **20080822210415] +[fix include path bug +Evan Prodromou **20080822210654] +[better error reporting in user authorization action +Evan Prodromou **20080822212111] +[XMPP bounce message when too long (ticket #112) +CiaranG **20080818213031] +[Fix bug in xmpp on/off (ticket #528) +CiaranG **20080819071321] +[Define xmpp daemon claim timeout time +CiaranG **20080822185955] +[XMPP sub/unsub and help commands +CiaranG **20080822191032] +[Fixed attempt to read nonexistent match in JID regex +CiaranG **20080822191751] +[Escape profile url in xmpp in case fancy urls off (Ticket #521) +CiaranG **20080823052534] +[Prevent jabber.php error by checking key exists +CiaranG **20080823053548] +[request token is not readonly +Evan Prodromou **20080824011706] +[be a little more liberal for sites that accidentally put whitespace before the xml decl +Evan Prodromou **20080824013803] +[move README to main dir +Evan Prodromou **20080824113719] +[big scarygram warning in config.php.sample about using DB_DataObject's debug mode +Evan Prodromou **20080824171202] +[notify user of remote subscriptions +Evan Prodromou **20080824200517] +[use mb_strlen instead of strlen in xmpp daemon +Evan Prodromou **20080825173105] +[use common_sql_now() instead of DB_DataObject_Cast +Evan Prodromou **20080825182338] +[change DataObject_Cast to use sql_now +Evan Prodromou **20080825183005] +[use better SQL date, fix security problem with OpenID logins +Evan Prodromou **20080825184104] +[never allow blank passwords +Evan Prodromou **20080825185245] +[optionally turn encryption on or off in the XMPP connection +Evan Prodromou **20080826131814 + + For identi.ca, we had some problems with the XMPP daemon getting + "stuck" in I/O through the encrypted (by default) XMPP socket. Turning + off encryption helped. So, now it's an option. + +] +[only send local messages to public XMPP stream +Evan Prodromou **20080826205341] +[use notice URI if it's not local and it's an HTTP URL +Evan Prodromou **20080826210314] +[fix error storing uris of remote notices +Evan Prodromou **20080826211108] +[import upstream XMPPHP with @ciarang's fix +Evan Prodromou **20080827124430] +[fixup whitespace +Evan Prodromou **20080827131603] +[don't show unknown (debug) errors +Evan Prodromou **20080827132346] +[XMPP daemon that doesn't eat messages - note change to XMPPHP as well (Ticket #551) +CiaranG **20080826200057] +[restoring upstream XMLStream.php after pulling ciarang's patch +Evan Prodromou **20080827133048] +[add back in a session start handler +Evan Prodromou **20080827135422] +[don't do too many broadcasts or confirms before checking the message queue +Evan Prodromou **20080827142336] +[get language before setting it. +Evan Prodromou **20080828005323] +[add session token check to password change +Evan Prodromou **20080829014515] +[code for session token +Evan Prodromou **20080829015304] +[fix random function name +Evan Prodromou **20080829021854] +[return after failed token +Evan Prodromou **20080829023731] +[add CSRF protection to avatar +Evan Prodromou **20080829023919] +[CSRF protection in deletenotice +Evan Prodromou **20080829025127] +[show error in delete notice +Evan Prodromou **20080829025559] +[add a token for CSRF avoidance +Evan Prodromou **20080829034854] +[CSRF protection for OpenID form +Evan Prodromou **20080829035934] +[swap around some stuff to show the form correctly on a CSRF error in openidlogin +Evan Prodromou **20080829040925] +[CSRF protection in openidsettings +Evan Prodromou **20080829042908] +[add csrf protection to profile settings +Evan Prodromou **20080829043909] +[CSRF protection in smssettings.php +Zach Copley **20080829035118] +[CSRF protection in imsettings.php +Zach Copley **20080829035707] +[CSRF protection for subscription/unsubscription +Evan Prodromou **20080829051104] +[better client error on CSRF problem with subscribe/unsubscribe +Evan Prodromou **20080829051628] +[csrf protection in userauthorization +Evan Prodromou **20080829052732] +[session token in userauthorization form +Evan Prodromou **20080829052847] +[CSRF protection in recoverpassword +Zach Copley **20080829052824] +[CSRF protection in user registration +Evan Prodromou **20080829054017] +[CSRF protection in emailsettings +Zach Copley **20080829053337] +[CSRF protection in remotesubscribe +Zach Copley **20080829054038] +[clean up username entered at login +Evan Prodromou **20080829225258] +[break up monolithic xmppdaemon into multiple queue handlers +Evan Prodromou **20080827205407 + + Eventually, the poor xmppdaemon has become overloaded with extra + tasks. So, I've broken it up. Now, we have 5 background scripts, and + more coming: + + * xmppdaemon.php - handles incoming XMPP messages only. + * xmppqueuehandler.php - sends notices from the queue out through XMPP. + * smsqueuehandler.php - sends notices from the queue out over SMS + * ombqueuehandler.php - sends notices from the queue out over OMB + * xmppconfirmhandler.php - sends confirmation requests out over XMPP. + + This is in addition to maildaemon.php, which takes incoming messages. + + None of these are "true" daemons -- they don't daemonize themselves + automatically. Use nohup or another tool to background them. monit can + also be useful to keep them running. + + At some point, these might become fork()'ing daemons, able to handle + more than one notice at a time. For now, I'm just running multiple + instances, hoping they don't interfere. + +] +[remove unimplemented methods from XmppDaemon +Evan Prodromou **20080827210429] +[change queue_item to use a compound primary key +Evan Prodromou **20080827211239 + + Breaking up to use multiple queue handlers means we need multiple + queue items for the same notice. So, change the queue_item table to + have a compound pkey, (notice_id,transport). + +] +[got two lines reversed +Evan Prodromou **20080827211940] +[change return in queue function +Evan Prodromou **20080828001414] +[correct presence in jabber function +Evan Prodromou **20080828001936] +[don't clear claims immediately +Evan Prodromou **20080828002610] +[correct return values from start() in queue handlers +Evan Prodromou **20080828003013] +[extend QueueHandler +Evan Prodromou **20080828003829] +[XmppQueueHandler extends QueueHandler too +Evan Prodromou **20080828004224] +[$this->log to common_log in Queue_item +Evan Prodromou **20080828004503] +[return correct values for success in handling messages +Evan Prodromou **20080828011002] +[misprint of omb as oms +Evan Prodromou **20080828012619] +[return results of broadcasting by sms +Evan Prodromou **20080828012635] +[add a bash script to start all the daemons +Evan Prodromou **20080828134856] +[add a script to stop daemons, too +Evan Prodromou **20080828135011] +[harmonize csrf and queues +Evan Prodromou **20080829174012] +[split public stream to its own queue handler +Evan Prodromou **20080829181702 + + Add another queue handler for the public stream. Should further + parallelize the work of sending out messages. + +] +[fix name of instantiated class +Evan Prodromou **20080829182112] +[a little more robust confirm handler +Evan Prodromou **20080829182349] +[many jabber queue management changes +Evan Prodromou **20080829200352 + + Added a method to QueueManager to let subclasses do stuff when idle. + Needed so that XMPP queue manager can service its message queue. + + Cleaned up jabber_broadcast_message quite a bit. Use custom joins + instead of loop-and-query, should fix some problems with users who are + getting messages even after turning off notification. Only build $msg + and $entry once, and use the XMPPHP function for messages with a + payload, rather than rolling our own. + +] +[lost $sent_to in jabber_public_notice +Evan Prodromou **20080829200859] +[strip script ending from end of xmppdaemon +Evan Prodromou **20080829202613] +[add 'raw' to payload to allow getting to the raw xml +Evan Prodromou **20080830000314] +[forward messages from queuehandler to listener +Evan Prodromou **20080830040717 + + The queuehandler sends messages to the user. If the user replies, the + messages are typically sent directly to the queuehandler (including + resource), not the default bot JID. + + We add a little code for the xmppqueuehandler to periodically service + its queue of received messages. Received messages are forwarded to the + listener to deal with. We use XEP 33, 'addresses', to note the + original sender. + + The xmppdaemon checks to see if the 'from' on a message is the daemon + address. If so, it looks for a XEP 33 'addresses' stanza, with an + 'ofrom' address, which shows who it was originally is from. + + This should let us send from one resource ID and still process + incoming messages in a different connection. + +] +[strtolower jids for comparison +Evan Prodromou **20080830052143] +[typo preventing detection of addresses +Evan Prodromou **20080830052810] +[use common log in error handler rather than echo +Evan Prodromou **20080830053052] +[log transport when claiming a notice +Evan Prodromou **20080830054933] +[better logging in ombqueuehandler +Evan Prodromou **20080830055416] +[get address from addresses +Evan Prodromou **20080830055640] +[better debugging output for forwarded messages +Evan Prodromou **20080830055938] +[debug xml input +Evan Prodromou **20080830060732] +[log fetch +Evan Prodromou **20080830062246] +[correctly use attrs array rather than nonexistent attunction +Evan Prodromou **20080830062744] +[less sleeping, slightly +Evan Prodromou **20080830064431] +[don't clear old claims +Evan Prodromou **20080830070135] +[require mail for sms, not omb +Evan Prodromou **20080830070309] +[sms handler was handling omb wrongly +Evan Prodromou **20080830071007] +[forgot to get the profile in public queue handler +Evan Prodromou **20080830071232] +[some fixes from on the jabber server +evan@controlezvous.ca**20080830083502] +[get rid of Laconica_XMPP and ignore priority +Evan Prodromou **20080830084423] +[check for self in forwards, too +Evan Prodromou **20080830085607] +[eliminate loops in forwarding +Evan Prodromou **20080830090148] +[make XMPP take a priority for presence +Evan Prodromou **20080830091430] +[use priority in connection +Evan Prodromou **20080830091522] +[forgot to use the array for avoiding dupes +Evan Prodromou **20080830094252] +[check the state of the queue before diving in to process it +Evan Prodromou **20080830095709] +[better check for ready state on connection +Evan Prodromou **20080830171441] +[public queue handler and xmpp confirm handler service their message queues +Evan Prodromou **20080830172217] +[add initialization info to the queue handlers +Evan Prodromou **20080831020325] +[add some sanity-check stuff for long-running daemons +Evan Prodromou **20080831023844] +[halt sending HTML in Jabber +Evan Prodromou **20080831114642] +[separate out presence from connection, send different presence types from queuehandlers +Evan Prodromou **20080902012604] +[slightly more robust connection code +Evan Prodromou **20080902030331] +[restore HTML in output, remove rump pubsub event code +Evan Prodromou **20080902030403] +[dnd -> available, just looks bad as dns +Evan Prodromou **20080902030910] +[switch around how XMLStream does processing +Evan Prodromou **20080831003210] +[debug logging in __process +Evan Prodromou **20080831012136] +[floor +Evan Prodromou **20080831013132] +[int div games +Evan Prodromou **20080831013603] +[slightly better int math +Evan Prodromou **20080831014404] +[use updated xmpphp library +Evan Prodromou **20080902163718] +[add reconnect handlers to main XMPP-handling scripts +Evan Prodromou **20080902165319] +[better connection handling in scripts +Evan Prodromou **20080902165735] +[set the reconnect timeout +Evan Prodromou **20080902171740] +[variable name conflict on reconnect +Evan Prodromou **20080902172039] +[reconnect timeout +Evan Prodromou **20080902172256] +[license block on util.js +Evan Prodromou **20080827013835] +[try to make the reply button do the right thing if there's no notification box. +Evan Prodromou **20080827015010] +[move broadcast in OMB postnotice for bad case +Evan Prodromou **20080828221420] +[Tags_without_fancy +Garret Buell **20080831233401 + Change common_tag_link to format the tag link based on the setting of $config['site']['fancy'] +] +[Allow_multicase_tags +Garret Buell **20080901001241 + Make "#test", "#Test", and "#tEsT" all preserve appearance but link to the same tag +] +[Elide_Tags +Garret Buell **20080901025932 + Make "#sanfrancisco", "#SanFrancisco", "#san_francisco", "#San.Francisco", and "#SAN-FRANCISCO" all link to http://identi.ca/tag/sanfrancisco but preserve appearance +] +[RequirePassword +Garret Buell **20080830195036 + Require a password with at least 6 characters when registering. +] +[Resolve remote subscribe and omb problems with quotes (Tickets #604 and #567) +CiaranG **20080904065504] +[Fix typo in presence message (x3) +CiaranG **20080904081542] +[Some Notice::saveNew cleanups. +Ori Avtalion **20080902173804 + * No need to check $source's value before inserting + * No need to update the notice if the $uri was known in advance +] +[fix bad args in postnotice for new notices +Evan Prodromou **20080904195720] +[Fix typo in finishremotesubscribe +CiaranG **20080904201921] +[scripts daemonize themselves +Evan Prodromou **20080904184031] +[add .pid to pidfile names +Evan Prodromou **20080904190254] +[more robust code for setting daemon uid/gid +Evan Prodromou **20080904191031] +[add newline at the end of pidfile +Evan Prodromou **20080904191517] +[new format for startdaemons; not sure how to do stopdaemons so punting +Evan Prodromou **20080904192220] +[better feedback when starting daemons +Evan Prodromou **20080904192851] +[make confirmhandler a subclass of queuehandler +Evan Prodromou **20080904193118] +[abstract XMPP-related queue handling to a common superclass +Evan Prodromou **20080904194035] +[change xmppqueuedaemon to jabberqueuedaemon in startdaemons +Evan Prodromou **20080904194346] +[require xmppqueuehandler in jabberqueuehandler +Evan Prodromou **20080904194456] +[better logging for confirm handler update +Evan Prodromou **20080904203502] +[add some processTime() to the send loops to avoid filling the buffer +Evan Prodromou **20080904213257] +[better @ links +Evan Prodromou **20080904224129] +[use a join for omb broadcast +Evan Prodromou **20080905004701] +[change sms broadcast to use a join +Evan Prodromou **20080905022019] +[return in the status textarea will submit the form +Evan Prodromou **20080905045415] +[do submit on keydown +Evan Prodromou **20080905045736] +[stop default handling of return in browser +Evan Prodromou **20080905050356] +[set focus to status text area +Evan Prodromou **20080905050824] +[free and unset DB_DataObjects after we're done with them +Evan Prodromou **20080906015501] +[free memory in SMS daemon, too +Evan Prodromou **20080906015621] +[debugging for omb +Evan Prodromou **20080907193402] +[lots of debugging code in OMB send +Evan Prodromou **20080907195242] +[remove some debugging code from omb.php +Evan Prodromou **20080907200344] +[error checking in subscriptions +Evan Prodromou **20080908201020] +[Disallow 'tag' and 'tags' as usernames. Fixes ticket #584 +Ori Avtalion **20080905114534] +[Fix for reply arrow in profile page +Michael Landers **20080905090848] +[Fix confusing comment in config.sample.php (Ticket #616) +CiaranG **20080905162732] +[add a sample RewriteBase +Evan Prodromou **20080910180050] +[add a line for mail domain +Evan Prodromou **20080910154632] +[update information about queues +Evan Prodromou **20080910154754] +[reverse order of queries for galleries +Evan Prodromou **20080911144742] +[LOG_ERROR -> LOG_ERR +Evan Prodromou **20080913161107] +[duplicate confirmation to avoid where clause +Evan Prodromou **20080913164333] +[only use MyISAM for tables with fulltext indices +Evan Prodromou **20080915053955] +[cache noticesWithFriends in memcached +Evan Prodromou **20080915065616 + + noticesWithFriends is turning out to be one of our most expensive + queries. The join is costly, and this method is hit over and over and + over by desktop clients and other API users. + + So, I've added a first pass at caching the results. I store a "window" + of notices -- equal to the first 3 pages of notices, plus one for + pagination -- in the memcached cache. If with-friends notices are + requests, I fetch the whole window out of the cache and grab the slice + requested. If the requested notices are outside the window, we just do + the query. If there's nothing in the cache, we request the window and + store it, then return a slice. + + I had to add a NoticeWrapper class that works like DB_DataObject + (well, just the fetch() part...) but just holds an array of notices + instead of a DB cursor. + + Finally, saving a new notice blows away the caches for subscribed users. + +] +[$INSTALLDIR -> INSTALLDIR +Evan Prodromou **20080915070413] +[array_count -> count +Evan Prodromou **20080915070951] +[subscriptions clear user with-friends cache, too +Evan Prodromou **20080915071500] +[compress window-getting to one function +Evan Prodromou **20080915071835] +[misused instance attribute in noticewrapper +Evan Prodromou **20080915072553] +[another attribute error +Evan Prodromou **20080915072738] +[make NoticeWrapper extend Notice so methods work +Evan Prodromou **20080915073006] +[fix cache deletion code +Evan Prodromou **20080915073215] +[fixup SQL code +Evan Prodromou **20080915073412] +[can actually take all the data in the window +Evan Prodromou **20080920174700] +[blow subscriptions cache when the user deletes a notice +Evan Prodromou **20080920175339] +[use common-config instead of $config in common_language +Evan Prodromou **20080922172631] +[data classes for invitations +Evan Prodromou **20080823191015] +[start the invite form +Evan Prodromou **20080825192946] +[add invite to htaccess.sample +Evan Prodromou **20080825193149] +[add invite to the nav menu +Evan Prodromou **20080825193235] +[invite fancy url +Evan Prodromou **20080825193333] +[fix the invite url +Evan Prodromou **20080825193450] +[fix instructions +Evan Prodromou **20080825193738] +[skip preview, just send the darn thing +Evan Prodromou **20080826021227] +[added a created timestamp to invitations +Evan Prodromou **20080826023116] +[clean up some whitespace in DB script +Evan Prodromou **20080826024015] +[helper functions that take a user object +Evan Prodromou **20080827001348] +[updates for invitations +Evan Prodromou **20080827001927 + + Add the code to registration to handle invitation codes. + + Some edge cases on invitations: is the user already subbed to this + person? Tell them. Is the person already on the system? Sub the user + to them, then, and tell the user. + + Add some code to User to auto-sub invitees whenever the email address + changes. Call it from a new registration with an invite code, and also + from confirmaddress. + + Some whitespace cleanup in the files touched. + +] +[correct output on invitations +Evan Prodromou **20080827003529] +[save invitation code and improve format of outgoing mail +Evan Prodromou **20080827004410] +[fix format for subject +Evan Prodromou **20080827004755] +[fix runon string in invites format +Evan Prodromou **20080827004854] +[send personal message through to send_invitation function +Evan Prodromou **20080827005155] +[lost the names when making a new function send_invitation +Evan Prodromou **20080827005418] +[fix format string, again again +Evan Prodromou **20080827010138] +[Invite -> Invitation +Evan Prodromou **20080827010515] +[removed the preview, so use "Send" for the button +Evan Prodromou **20080827011921] +[add a foreign_link table with prefs for the link +Evan Prodromou **20080827032423] +[update to translation +Evan Prodromou **20080827185817] +[Bounce oversized XMPP messages back to user (Ticket #112) +CiaranG **20080814083856] +[XMPP daemon updates including help, sub and subsub commands, plus subscribe/unsubcribe logic broken out into standalone module for sharing +CiaranG **20080816083422] +[Added missing subs.php +CiaranG **20080816153917] +[remove custom xmppdaemon error handler +Evan Prodromou **20080830162128] +[merge in changes for CSRF, too +Evan Prodromou **20080830162223] +[initial non-Ajax version of favorites +Evan Prodromou **20080908181624] +[change input buttons to submit buttons +Evan Prodromou **20080908182353] +[fix requires in dis/favor and correct url in form +Evan Prodromou **20080908182559] +[correct action for showfavorites in disfavor +Evan Prodromou **20080908182716] +[better styling for favor/disfavor buttons +Evan Prodromou **20080908183515] +[styling on the favor/disfavor forms to show inline +Evan Prodromou **20080908201751] +[write our own submit so there's no

+Evan Prodromou **20080908202226] +[move fave form, float right +Evan Prodromou **20080908202717] +[make favorites form use Ajax +Evan Prodromou **20080908211610] +[missed a closing curly +Evan Prodromou **20080908211656] +[enjitqueuehandler added +Evan Prodromou **20080916174105] +[rationalize with repository version +Evan Prodromou **20080916174400] +[change some more tables to InnoDB +Evan Prodromou **20080916174515] +[Database and classes for direct messages +Evan Prodromou **20080916185126] +[inbox and outbox for direct messages +Evan Prodromou **20080916195346 + + Added an inbox and outbox for direct messages. + + Factored common code to mailbox.php. Factored common code with + stream.php to personal.php. + +] +[fixup CSS for messages +Evan Prodromou **20080916195620] +[correctly show top +Evan Prodromou **20080916200445] +[instructions for inbox and outbox +Evan Prodromou **20080916200703] +[correct title on inbox and outbox +Evan Prodromou **20080916200942] +[Twitter integration - SQL ref data for Twitter +zach@controlyourself.ca**20080822034054] +[Twitter integration - Oh look, a Twitter settings tab. +zach@controlyourself.ca**20080822034157] +[Twitter-integration - Twitter settings tab now saves Twitter credentials +zach@controlyourself.ca**20080826225615] +[Twitter integration - Add and remove Twitter accnt now working +Zach Copley **20080827000327] +[Twitter integration - Foreign_user::getForeignUser() to retrieve +Zach Copley **20080827005444 + Foreign_user by multi-part key: user_id + service +] +[Twitter integration - decided to change Twitter to service ID #1 +Zach Copley **20080827021635] +[fork daemon +Evan Prodromou **20080626224011] +[fork daemon +Evan Prodromou *-20080626224011] +[translation updates +Evan Prodromou **20080817160451] +[Twitter integration - support for new foreign_link table and prefs now save/update +Zach Copley **20080828072205] +[Twitter integration - Notices now broadcast (directly) to Twitter from linked accts. +Zach Copley **20080828192509] +[CSRF protection for invites.php +Zach Copley **20080829045441] +[CSRF protection in twittersettings.php +Zach Copley **20080829045724] +[Conflated Avatar and Profile settings + removed a bunch of unnecessary whitespace +Zach Copley **20080905194732] +[Moved avatar upload down below timezone on profile settings +Zach Copley **20080906070651] +[Fold password form into profile settings +Zach Copley **20080907053604] +[Twitter integration - added $config option for source attribute when posting to Twitter +Zach Copley **20080907062118] +[Twitter integration - wording change +Zach Copley **20080907063339] +[Disallow 'api' nickname +Zach Copley **20080909000650] +[Twitter-compatible API - JSONP callbacks for all methods emitting JSON +Zach Copley **20080910025013] +[integrate local changes with Zach's +Evan Prodromou **20080916210813] +[Initial support for PostgreSQL +CiaranG **20080909072224] +[Fix remote sub when redirected via login (Ticket #618) +CiaranG **20080909202259] +[PostgreSQL - reply.modified needs a default +CiaranG **20080910073741] +[Fix unquoted array key, causes b0rkage on some php setups (via @bopuc) +CiaranG **20080911163558] +[PostgreSQL: Make tag cloud query work - also fixes what is surely an ignored error in the mysql query +CiaranG **20080911192348] +[PostgreSQL: support for full text searching (notice and people) +CiaranG **20080914201744] +[PostgreSQL: Quote table name in manually formed query - fixes profile settings update +CiaranG **20080915070256] +[Further updates to sample config +CiaranG **20080915081246] +[Fix missing nickname in rss replies to title +CiaranG **20080915190953] +[Get correct configured language when all else fails +CiaranG **20080916172706] +[rationalize with ciarang's pgsql changes +Evan Prodromou **20080916214134] +[add in ciarang's changes to config.php.sample +Evan Prodromou **20080916214206] +[use common_local_url() in tagging, add canonicalization function +Evan Prodromou **20080917112234] +[move rendering stuff that doesn't depend on notice to a separate function +Evan Prodromou **20080917112730] +[newmessage and showmessage +Evan Prodromou **20080917174741] +[add new message link to showstream +Evan Prodromou **20080917175356] +[don't show message link on your own page +Evan Prodromou **20080917175512] +[fancy urls for show message, new message +Evan Prodromou **20080917180244] +[to parameter is an ID not a nickname +Evan Prodromou **20080917185142] +[not a nickname so don't canonicalize +Evan Prodromou **20080917185723] +[correct urls from fancy url for show-message +Evan Prodromou **20080917185950] +[fix missing variable in save-new-message +Evan Prodromou **20080917190306] +[skip over Mailbox::handle to Action::handle +Evan Prodromou **20080917190445] +[fix titles in showmessage +Evan Prodromou **20080917190745] +[save created date +Evan Prodromou **20080917191652] +[some minor fixes for new messages +Evan Prodromou **20080917192121] +[style for message form +Evan Prodromou **20080918021421] +[rearrange paragraphs in message form +Evan Prodromou **20080918021727] +[change id of message textarea +Evan Prodromou **20080918021926] +[no instructions for 'to' dropdown +Evan Prodromou **20080918022410] +[set message form label to display inline +Evan Prodromou **20080918022558] +[try to move the message box up a bit +Evan Prodromou **20080918022756] +[scootch it down a bit again +Evan Prodromou **20080918022841] +[return correct data structure for messages in showmessage +Evan Prodromou **20080918023032] +[fetch -> find +Evan Prodromou **20080918025232] +[fix htaccess so pass message param correctly +Evan Prodromou **20080918025428] +[more id -> message shenanigans +Evan Prodromou **20080918025543] +[remove tabs from showmessage +Evan Prodromou **20080918025713] +[split favor forms code +Evan Prodromou **20080918032048] +[big changes to the README, part 1 +Evan Prodromou **20080918135502] +[if favor/disfavor submitted through ajax, return micro-html of form +Evan Prodromou **20080918135608] +[Gee, maybe I shouldn't try to write DOM code from memory +Evan Prodromou **20080918140533] +[ah, turns out each() stuff is called as a method +Evan Prodromou **20080918140756] +[get the zeroth form in the returned array +Evan Prodromou **20080918145545] +[replace -> replaceWith +Evan Prodromou **20080918150120] +[ajaxForm on returned forms +Evan Prodromou **20080918150438] +[have to add the ajaxHidden thing, too +Evan Prodromou **20080918150753] +[dis -> fav +Evan Prodromou **20080918151642] +[correct background of dis/favor form on hover +Evan Prodromou **20080918151907] +[input changes +Evan Prodromou **20080918152124] +[add favor/disfavor to profile +Evan Prodromou **20080918152612] +[don't notify you favor your own notice +Evan Prodromou **20080918152823] +[correct a couple of bugs +Evan Prodromou **20080922190937] +[clear and rebuild db scripts +Evan Prodromou **20080922195824] +[add additional licenses into extlib subdir +Evan Prodromou **20080922212120] +[hide IM settings if xmpp disabled +Evan Prodromou **20080922214003] +[finish the README file +Evan Prodromou **20080922223239] +[A working stopdaemons.sh, and no parameter needed for startdaemons.sh +CiaranG **20080906202242] +[merge CiaranG's changes for subs +Evan Prodromou **20080922225031] \ No newline at end of file diff --git a/_darcs/inventories/20080922225239-84dde-57e21338f073811b3ac3766f65e905849e1e9eb3.gz b/_darcs/inventories/20080922225239-84dde-57e21338f073811b3ac3766f65e905849e1e9eb3.gz new file mode 100644 index 0000000000..c50c7c90a8 --- /dev/null +++ b/_darcs/inventories/20080922225239-84dde-57e21338f073811b3ac3766f65e905849e1e9eb3.gz @@ -0,0 +1,3 @@ +Starting with tag: +[TAG 0.6 +Evan Prodromou **20080922225224] \ No newline at end of file diff --git a/_darcs/inventories/20080923043110-5ed1f-f818e92c96b3c88598cea1fb53a95d4b1b9fb19d.gz b/_darcs/inventories/20080923043110-5ed1f-f818e92c96b3c88598cea1fb53a95d4b1b9fb19d.gz new file mode 100644 index 0000000000..b857a53219 --- /dev/null +++ b/_darcs/inventories/20080923043110-5ed1f-f818e92c96b3c88598cea1fb53a95d4b1b9fb19d.gz @@ -0,0 +1,9 @@ +Starting with tag: +[TAG 0.6.0 +Evan Prodromou **20080922225239] +[check for cur before message link +Evan Prodromou **20080922225620] +[Fix quotes in favorite notification +Evan Prodromou **20080922232328] +[CSRF protection in newmessage.php +Evan Prodromou **20080923031419] \ No newline at end of file diff --git a/_darcs/inventories/20080923045458-5ed1f-348585c4e0f04a1715dc9f0c0092bcbf7af0a9ef.gz b/_darcs/inventories/20080923045458-5ed1f-348585c4e0f04a1715dc9f0c0092bcbf7af0a9ef.gz new file mode 100644 index 0000000000..18dc5ac8fb --- /dev/null +++ b/_darcs/inventories/20080923045458-5ed1f-348585c4e0f04a1715dc9f0c0092bcbf7af0a9ef.gz @@ -0,0 +1,5 @@ +Starting with tag: +[TAG 0.6.0 +Evan Prodromou **20080923043110] +[version number -- doh! +Evan Prodromou **20080923045449] \ No newline at end of file diff --git a/_darcs/inventories/20081006040733-5ed1f-01bc3eb49157daccde21c5bbe3505df7b584dfde.gz b/_darcs/inventories/20081006040733-5ed1f-01bc3eb49157daccde21c5bbe3505df7b584dfde.gz new file mode 100644 index 0000000000..be0cab6f49 --- /dev/null +++ b/_darcs/inventories/20081006040733-5ed1f-01bc3eb49157daccde21c5bbe3505df7b584dfde.gz @@ -0,0 +1,352 @@ +Starting with tag: +[TAG 0.6.0 +Evan Prodromou **20080923045458] +[403 for a message that isn't yours. +Evan Prodromou **20080923050637] +[change how Foreign_link fetches, and fix mixup between user-ids and foreign-ids in twittersettings +Evan Prodromou **20080923054413] +[change twitter username to allow uppercase letters and underscores +Evan Prodromou **20080923060314] +[incorrect message info shown in title +Evan Prodromou **20080923063029] +[append LACONICA_VERSION to css files to force reload +Evan Prodromou **20080923065021] +[make it look like a query +Evan Prodromou **20080923065211] +[try some fiddling to get message notification going out +Evan Prodromou **20080923072150] +[Twitter bridge - fix to allow linking to 'protected' Twitter users +Zach Copley **20080923074529] +[was notifying user name not object +Evan Prodromou **20080923080246] +[comma to dot +Evan Prodromou **20080923080855] +[Twitter bridge: Hack to get around PHP cURL's use of @ as a metachar, +Zach Copley **20080923083632 + which was keeping @reply messages from getting posted to Twitter. +] +[Twitter bridge - Changed Twitter username length check from 64 chars to Twitter max of 15. +Zach Copley **20080923084145] +[rationalize Zach's change of length with my added _ and caps +Evan Prodromou **20080923174302] +[user -> this +Evan Prodromou **20080923181648] +[better logic around protecting messages +Evan Prodromou **20080923182024] +[note privacy of login credentials and private messages +Evan Prodromou **20080923183035] +[Added option to add disable attr to common_checkbox() +Zach Copley **20080923213829] +[README - Added mbstring to the list of required PHP5 extensions +Zach Copley **20080923221439] +[Twitter bridge - Bugfix: You can now turn off brige via prefs +Zach Copley **20080923231921] +[Twitter bridge - pref setting to turn off sending @-replies to Twitter +Zach Copley **20080924023615] +[Twitter bridge - fixed another bug that kept prefs from saving properly +Zach Copley **20080924052431] +[Twitter bridge - Was using the wrong idiom to update foreign_link +Zach Copley **20080924060455 + objs, which was causing UI inconsistencies. Fixed. + +] +[change foreign links flags code to use bitmasks +Evan Prodromou **20080924150834 + + Zach was doing a lot of integer comparisons on the Foreign_link sync + fields. I switched them to use named bitmasks instead. I also switched + the semantics of bit 3 to be the opposite of what Zach had -- I find + lots of double-negatives in a checkbox to be hard to read. + +] +[Fix ticket 662 +mac65@mac65.com**20080922213314 + The user_timeline action for the Twitter API was not reading the page + argument. Added in one line to assign the page argument. Tested on local + install and it worked. + +] +[Fix ticket 460 +mac65@mac65.com**20080922223429 + The show action for the twitter user API was using subscribed instead of + subscriber to grab the friends_count. +] +[default sending local @ replies to Twitter +Evan Prodromou **20080924161708] +[change the rule for detecting replies. +Evan Prodromou **20080924200710] +[change handle() to use message-getting helper +Evan Prodromou **20080924202211] +[put message form on inbox and outbox +Evan Prodromou **20080924204131] +[correct url for new message form +Evan Prodromou **20080924210254] +[redirect to outbox after posting +Evan Prodromou **20080924210459] +[better redirect to outbox +Evan Prodromou **20080924210757] +[try to clean up user-without-profile errors +Evan Prodromou **20080926145008] +[caching layer for DB/DataObject +Evan Prodromou **20080926160941 + + I added a new class, Memcached_DataObject, that will (optionally) + fetch data out of a memcached server if it's available. This only + works on 'staticGet'. + + Methods that write to the database (insert, update, delete) will clear + and set the cache correctly, too. + +] +[prepend Memcached_DataObject require with INSTALLDIR +Evan Prodromou **20080926161540] +[rename cached object file +Evan Prodromou **20080926161652] +[path correct in require_once for memcached +Evan Prodromou **20080926161824] +[better handling of staticGet +Evan Prodromou **20080926161946] +[try to make some static/non-static stuff work right +Evan Prodromou **20080926162347] +[better deletes and key names +Evan Prodromou **20080926163030] +[handle one-argument calls to staticGet +Evan Prodromou **20080926163357] +[hack to make keys work +Evan Prodromou **20080926163555] +[don't record null key values +Evan Prodromou **20080926164021] +[Memcache returns false on cache miss +Evan Prodromou **20080926164413] +[another false-for-error +Evan Prodromou **20080926164532] +[log a db error for inserting the notice +Evan Prodromou **20080926165029] +[add some more info on notice update +Evan Prodromou **20080926165201] +[wasn't returning results of update +Evan Prodromou **20080926165310] +[handle multiple memcached servers +Evan Prodromou **20080926195501] +[move memcache connections to util.php +Evan Prodromou **20080926200102] +[slightly better check on $orig in update() +Evan Prodromou **20080927123507] +[single function for important streams, with memcached support +Evan Prodromou **20080928120119 + + I moved the 4 streams for a user (with friends, faves, replies, + personal) into functions on the User object. Added a helper function + in Notice for making notice streams. Also, will fetch notice streams + out of the memcached server, if possible. Made the API, RSS, and HTML + output all use the same streams (hopefully cached). + + Added some code to Notice to blow the cache when a notice is posted. + Also, added code to favor and disfavor actions to blow the faves + cache, too. + +] +[shownotices takes user rather than profile in showstream +Evan Prodromou **20080928120616] +[change arguments to Notice::publicStream +Evan Prodromou **20080928132747] +[lost paren in Notice +Evan Prodromou **20080928132846] +[add some debugging stuff to Notice +Evan Prodromou **20080928171407] +[move noticewrapper to classes +Evan Prodromou **20080928171538] +[remove noticewrapper +Evan Prodromou **20080928171634] +[another debug notice +Evan Prodromou **20080928172002] +[exact check on memcached results +Evan Prodromou **20080928173558] +[correct some SQL and add some spaces +Evan Prodromou **20080928174316] +[remove debugging code for notice streams +Evan Prodromou **20080928174814] +[remove unneeded find() in userrss.php +Evan Prodromou **20080928175156] +[fancy url for favorites rss +Evan Prodromou **20080928175626] +[add favoritesrss +Evan Prodromou **20080928180132] +[cache tag streams in Memcached, too +Evan Prodromou **20080928180904] +[sync function names +Evan Prodromou **20080928181017] +[add some whitespace to the qry for tags +Evan Prodromou **20080928181121] +[pass tag parameter along to stream query +Evan Prodromou **20080928181255] +[fixup tag display code +Evan Prodromou **20080928181503] +[blow the cached streams for tags on a new notice +Evan Prodromou **20080928181812] +[note about stream_select() bug in PHP 5.2.x +Evan Prodromou **20080928191022] +[guarded call to conn method in xmppqueuehandler +Evan Prodromou **20080929205504] +[blow cache in Notice for tags +Evan Prodromou **20080929222107] +[trying to fix up pages in tags +Evan Prodromou **20080929230047] +[log a warning on recovery of old recovery codes +Evan Prodromou **20080930124452] +[use two-arg constructor for confirmation code +Evan Prodromou **20080930130530] +[don't encache on insert; misses timestamps +Evan Prodromou **20080930130844] +[some extlibs that were missing from 0.6.0 +Evan Prodromou **20080930133847] +[Add Lithuanian to list of supported languages +CiaranG **20080923140710] +[Added Swedish to list of languages +CiaranG **20080923184851] +[PostgreSQL: New tables for private messages and invitations (untested) +CiaranG **20080923214601] +[PostgreSQL: Corrections to the two new table definitions +CiaranG **20080924113550] +[Add a sys_get_temp_dir substitute to extlib for easier installation on versions that lack it +CiaranG **20080924150828] +[A load of translations, including de_DE,es,it_IT,nl_NL,en_GB +CiaranG **20080924194608] +[Translations updates using script +CiaranG **20080924205318] +[More translations +CiaranG **20080924210153] +[Updates to the update_translations script +CiaranG **20080925092854] +[Latest translation updates +CiaranG **20080925113246] +[Another batch of translations +CiaranG **20080926104442] +[Fix error in xmpp help +CiaranG **20080926214627] +[Make stopdaemons.sh work no matter where it runs from +CiaranG **20080927210355] +[PostgreSQL: Put a default on confirm_address.address_extra to mimic mysql's behaviour when a not-null field is not set in a new record +CiaranG **20080929060227] +[Fix problem with tags in different locales (Ticket #679) +CiaranG **20080924092031] +[use profile URL instead of local URL +Evan Prodromou **20080930210542] +[Fix replies tab pagination issue +support@bambeeq.com**20081001010741 + Problem: + Before / After links in replies tab don't work. When clicked they show "No such user" error. + How to reproduce: + 1. Access http://identi.ca/evan/replies + 2. Click on Before button + +] +[remove unused helper function +Evan Prodromou **20081002144628] +[add methods to Memcached_DataObject for caching compound keys +Evan Prodromou **20081002144715] +[use pkeyGet for Avatar +Evan Prodromou **20081002144749] +[try to use caching functions where possible in User +Evan Prodromou **20081002162513] +[incorrect function call in Fave +Evan Prodromou **20081002162604] +[don't try to free faves in User +Evan Prodromou **20081002162739] +[only put notices that are local in the sitemap +Evan Prodromou **20081003192826] +[better instructions in the password recovery page +Evan Prodromou **20081004232554] +[more output in daemon.php +Evan Prodromou **20081005000851] +[explicitly load classes for queuehandler +Evan Prodromou **20081005191505] +[XMPP Direct Messaging / Last notice +nick@cloudspider.com**20081003011145 + + Direct messaging now works under XMPP, the command syntax is 'd $nick + $message'. Also, a command to fetch a users last notice is in there + ('last $nick'). Notification of the recipient of a message is not yet + supported. + +] +[more specific profile-get is slightly more efficient +Evan Prodromou **20081004021158] +[basics of the command interpreter +Evan Prodromou **20081004021442] +[move DB_DataObject ini files to more common name. +Evan Prodromou **20081004142205] +[move fave notification to mail library +Evan Prodromou **20081004154454] +[fill out commands, move to separate file +Evan Prodromou **20081004154846] +[add channels and use command interpreter in different channels +Evan Prodromou **20081004163213] +[text -> content in newnotice +Evan Prodromou **20081004170136] +[correct use of $user to $this->user +Evan Prodromou **20081004170342] +[correctly refer to notice as a notice +Evan Prodromou **20081004170550] +[different message source per command channel +Evan Prodromou **20081004173427] +[typo in message command +Evan Prodromou **20081004173609] +[common_client_error -> common_user_error +Evan Prodromou **20081004173734] +[FaveCommand -> FavCommand +Evan Prodromou **20081004173957] +[check for notification flags in FavCommand +Evan Prodromou **20081004174519] +[cleanup whitespace in lib/mail.php +Evan Prodromou **20081004174552] +[correct output for Get command +Evan Prodromou **20081004182028] +[Combined language patches that got missed due to repo dependencies +CiaranG **20081002181338] +[pt_BR translation now has a new file ID +CiaranG **20081004143747] +[New pt_BR translation, 100% complete +CiaranG **20081004144441] +[Update q-value for completed pt_BR translation +CiaranG **20081004144545] +[Twitter bridge -- more explicit checking of noticesync bits +Zach Copley **20080926190543] +[Twitter-API: Viewing direct msgs in xml and json now work +Zach Copley **20080924234857] +[Twitter-compatible API - rss and atom feeds for direct messages +Zach Copley **20080926012015] +[Twitter-compatible API: Direct messages work (everything but destroy()) +Zach Copley **20080929050826] +[Twitter-compatible API - added source links to statuses/notices +zach@controlyourself.ca**20080930175354] +[Twitter-compatible API - Favorites now working! +zach@controlyourself.ca**20080930194435] +[Twitter-compatible API - factored out redundant JSON printing functions +zach@controlyourself.ca**20080930212526] +[Add support for since_id and before_id to Twitter API. Ticket #540. +mac65@mac65.com**20081001001233] +[Twitter-compatible API - Added content-type checks to several methods. Calling an API +zach@controlyourself.ca**20081001020959 + method with a bad content type used to return a blank page. +] +[Twitter-compatible API - cleaned up sloppy control flow: exit() statements everywhere +zach@controlyourself.ca**20081001025421] +[fix deleted function after synch from Zach +Evan Prodromou **20081004194218] +[change stoica.ini to laconica.ini in config.php.sample +Evan Prodromou **20081004194611] +[Fixed up conflict (over white space) in User.php +Zach Copley **20081005181350] +[Another patch to fix up whitespace conflicts in User.php +Zach Copley **20081005181614] +[Twitter-compatible API - hooked in command interpreter +zach@controlyourself.ca**20081005030915] +[Added OnCommand and OffCommand to the list of cmds the Twitter API +zach@controlyourself.ca**20081005183850 + supports thru statuses/update +] +[update README with info about 0.6.1 plus some forgotten stuff +Evan Prodromou **20081006040646] +[increment the version +Evan Prodromou **20081006040713] \ No newline at end of file diff --git a/_darcs/inventories/20081006041249-5ed1f-33af2f1759aee066875182272fe0e175a1b8a516.gz b/_darcs/inventories/20081006041249-5ed1f-33af2f1759aee066875182272fe0e175a1b8a516.gz new file mode 100644 index 0000000000..0301072b25 --- /dev/null +++ b/_darcs/inventories/20081006041249-5ed1f-33af2f1759aee066875182272fe0e175a1b8a516.gz @@ -0,0 +1,5 @@ +Starting with tag: +[TAG 0.6.1 +Evan Prodromou **20081006040733] +[fix error and output in on and off commands +Evan Prodromou **20081006041232] \ No newline at end of file diff --git a/_darcs/inventories/20081114032959-84dde-ae883939976e69cc80fa0f15cd281cd0642e95fc.gz b/_darcs/inventories/20081114032959-84dde-ae883939976e69cc80fa0f15cd281cd0642e95fc.gz new file mode 100644 index 0000000000..765ee00983 --- /dev/null +++ b/_darcs/inventories/20081114032959-84dde-ae883939976e69cc80fa0f15cd281cd0642e95fc.gz @@ -0,0 +1,205 @@ +Starting with tag: +[TAG 0.6.1 +Evan Prodromou **20081006041249] +[fixup return value of XMPP channel on setting notification +Evan Prodromou **20081006054425] +[Twitter-compatible API - direct_messages/new.json was not answering +zach@controlyourself.ca**20081006153715] +[Twitter bridge - was checking the wrong bit (!) for reply sync preference +zach@controlyourself.ca**20081007004432] +[Adapted stoica theme for iPhone use +Ken Sheppardson **20080816181321] +[Adapted stoica theme for iphone use +Ken Sheppardson **20080816181845] +[Renamed 'mobile' theme to more appropriate 'iphone' +Ken Sheppardson **20080816200437] +[enjitqueuehandler +Ken Sheppardson **20080904215328] +[Skip remote notices +Ken Sheppardson **20080905032903] +[enjit queue handler (from kshep) +Evan Prodromou **20081008164624] +[add about 60px +Evan Prodromou **20081012155650] +[add about 60px to default theme, too +Evan Prodromou **20081012161211] +[fixup margins in stoica theme +Evan Prodromou **20081012162719] +[fixup margin and padding in default theme +Evan Prodromou **20081012162810] +[Twitter-compatible API - added favorites/favorites to list of methods only requiring bare auth +zach@controlyourself.ca**20081015163112] +[Twitter-compatible API: +zach@controlyourself.ca**20081017023638 + - Filled in favorites tags in statuses + - Filled in more tags in user/show, including undocumented features + - Better error handling and more consistent error messages + - Code clean-up and refactoring + - Removed huge obnoxious comments +] +[try to make replies point to the clicked-on notice +Evan Prodromou **20081020170245] +[don't overwrite replies in notices +Evan Prodromou **20081020170828] +[add a little debugging for replyto +Evan Prodromou **20081020171033] +[more specific selector for updating replies +Evan Prodromou **20081020172117] +[more value updates +Evan Prodromou **20081020172305] +[move update of replyto value to correct area +Evan Prodromou **20081020172549] +[correct number of args to saveNew in newnotice +Evan Prodromou **20081020173108] +[force util.js to reload on version change +Evan Prodromou **20081020174231] +[accidentally setting replies to 'false' +Evan Prodromou **20081020174956] +[add 'invite-only' mode for registration +Evan Prodromou **20081021182822] +[full sentence for invite-only error +Evan Prodromou **20081021183035] +[try to synch changes in stoica theme to default theme +Evan Prodromou **20081021192914] +[try to force background on favorite heart in default +Evan Prodromou **20081021193501] +[try to set correct background color on hover, too +Evan Prodromou **20081021193612] +[change "stoica" theme to "identica" +Evan Prodromou **20081021194440] +[move identica ie[67].css to default +Evan Prodromou **20081021194833] +[make identica theme use default theme, only include differences +Evan Prodromou **20081021201853] +[fix link color in identica theme +Evan Prodromou **20081021202455] +[add is_readonly() to api.php +Evan Prodromou **20081024201234] +[remove unused noticesWithFriendsWindow from User +Evan Prodromou **20081022210428] +[add atom and RSS 2.0 link elements to head of profile page +Evan Prodromou **20081023212659] +[Twitter-compatible API - checks for is_readonly() now work! +zach@controlyourself.ca**20081024213745] +[Twitter-compatible API - removed debugging statement +zach@controlyourself.ca**20081024215101] +[add an index to subscription token +Evan Prodromou **20081022192750] +[add SUP link to User RSS +Evan Prodromou **20081025022849] +[override initrss +Evan Prodromou **20081025023252] +[fixed use of header() +Evan Prodromou **20081025023347] +[a SUP action to product correct SUP json output +Evan Prodromou **20081026033353] +[add SUP links to RSS and Atom, too +Evan Prodromou **20081026145326] +[fix calls to show_rss_timeline +Evan Prodromou **20081026145749] +[handle seconds argument to SUP +Evan Prodromou **20081026150623] +[Twitter bridge - change regex to look for mb @-replies +zach@controlyourself.ca**20081027191629] +[heuristics for paren linking (thanks @brion!) +Evan Prodromou **20081102090241] +[Twitter-compatible API - properly encode and decode UTF-8 HTML entities +zach@controlyourself.ca**20081103211653] +[Better UTF-8 escaped entity handling. Fixed bad chars in all RSS feeds. +zach@controlyourself.ca**20081104084027] +[use correct class for avatar deletion so memcached is updated +Evan Prodromou **20081113063850] +[notice inbox +Evan Prodromou **20081022203600] +[save notice to inbox on saveNew +Evan Prodromou **20081022205621] +[better prefix for Notice_inbox.php +Evan Prodromou **20081022205823] +[change User to use notice inboxes rather than subscription +Evan Prodromou **20081022210445] +[blow inboxes +Evan Prodromou **20081023203505] +[Twitter-compatible API - since_id and before_id were polluting the cache and generating bad SQL +zach@controlyourself.ca**20081104053359 + (Also cleaned out some extra whitespace.) +] +[created timestamp on notice_inbox +Evan Prodromou **20081112172517] +[notice_inbox.id -> notice_inbox.notice_id +Evan Prodromou **20081112173627] +[add a script to populate notice inboxes +Evan Prodromou **20081112181117] +[correct method for querying +Evan Prodromou **20081112181327] +[some memory and execution time management +Evan Prodromou **20081112181533] +[add created to notice update +Evan Prodromou **20081112185117] +[check for errors in fixup_inboxes +Evan Prodromou **20081112185146] +[add LOW_PRIORITY and IGNORE extensions for INSERT +Evan Prodromou **20081112190828] +[Fix error when maildaemon tries to report a message parsing error +CiaranG **20081007083521] +[Only log locale sets that fail +CiaranG **20081007145232] +[Fix to previous fix :( +CiaranG **20081007155038] +[Script to update laconica.pot from source, and the results of running it +CiaranG **20081013200837] +[Twitter-compatible API - don't strip XML-illegal chars from JSON output +zach@controlyourself.ca**20081106225721] +[CSRF Protection for login and new notice. Ticket #503 +zach@controlyourself.ca**20081111022330] +[trac31 url_auto_shortening by sgmurphy +millette@controlyourself.ca**20081106205926] +[trac31 forgot actions/othersettings.php file +millette@controlyourself.ca**20081106210552] +[trac31 added othersettings fancy url +millette@controlyourself.ca**20081106224006] +[added Shorturl_api to add support for ur1, 2tu and other services lacking a native api - trac31 +millette@controlyourself.ca**20081107193831] +[trac31 added 3 more short url services: ur1.ca, 2tu.ru and ptiturl.com +millette@controlyourself.ca**20081107194735] +[trac31 added bit.ly support +millette@controlyourself.ca**20081107201926] +[trac31 don't shorten URLs prefixed with a * +millette@controlyourself.ca**20081107203039] +[trac31 revert the "don't shorten URLs prefixed with a *" patch since we automatically shorten in notices > 140 chars +millette@controlyourself.ca**20081107222100] +[trac31 pg support, fixing 2tu typo, set ur1.ca as default service +millette@controlyourself.ca**20081113152718] +[trac31 shorten all URLs even if notice is already <= 140 chars +millette@controlyourself.ca**20081113153216] +[trac31 forgot about twitapi, now fixed. +millette@controlyourself.ca**20081113164741] +[trac31 let * preceding a url prevent its shortening. +millette@controlyourself.ca**20081113170234] +[trac31 added longurl title to anchors when applicable. Also removed * url prefix feature to prevent short urls. +millette@controlyourself.ca**20081113182834] +[Conflict resolution patch for newnotice.php (zach vs. millette) +zach@controlyourself.ca**20081113195237] +[add inboxed and regenerate data objects +Evan Prodromou **20081113210209] +[add documentation on notice inboxes +Evan Prodromou **20081113214544] +[different query based on config var and user inbox status +Evan Prodromou **20081113215734] +[update inboxed flag in fixup inboxes +Evan Prodromou **20081113220335] +[Ticket 753 +tryggvib@hi.is**20081113024833] +[Bug fix for ticket 753 +tryggvib@hi.is**20081113212214] +[Ticket 753 bugfix, characters/digits only +tryggvib@hi.is**20081113213119] +[clear memcached cache in fixup_inboxes +Evan Prodromou **20081113223514] +[take a command-line argument to start with a particular user ID +Evan Prodromou **20081114015930] +[add Net Socket +Evan Prodromou **20081114021217] +[update README +Evan Prodromou **20081114025715] +[remove 'nudge' -- it won't be in this release +Evan Prodromou **20081114032817] \ No newline at end of file diff --git a/_darcs/inventories/20081118172328-34904-98eea66103c6acee66cb23933038efe8e56923e9.gz b/_darcs/inventories/20081118172328-34904-98eea66103c6acee66cb23933038efe8e56923e9.gz new file mode 100644 index 0000000000..7060e83dc2 --- /dev/null +++ b/_darcs/inventories/20081118172328-34904-98eea66103c6acee66cb23933038efe8e56923e9.gz @@ -0,0 +1,29 @@ +Starting with tag: +[TAG 0.6.2 +Evan Prodromou **20081114032959] +[don't ignore errors on inbox fixup; it messes up replication +Evan Prodromou **20081114065145] +[don't write notice to inbox if user isn't inboxed yet +Evan Prodromou **20081114074211] +[better code for only inserting inboxes that don't already exist +Evan Prodromou **20081114074511] +[threw out the baby with the bathwater +Evan Prodromou **20081114080853] +[add quotes to longurl title +Evan Prodromou **20081114142228] +[add start_at argument for notice rendering fixer +Evan Prodromou **20081114144014] +[silly escape problem with quotes, fixed. +millette@controlyourself.ca**20081114173242] +[RSS alternate link for tag pages +zach@controlyourself.ca**20081114052528] +[try to import new_form +Evan Prodromou **20081114194620] +[second argument to importNode +Evan Prodromou **20081114194727] +[fix longurl title attribute, removing extra backslashes. +millette@controlyourself.ca**20081114192649] +[escaping was not needed at all to process short urls. Real fix. +millette@controlyourself.ca**20081114195457] +[add inboxes for new users +Evan Prodromou **20081116062937] \ No newline at end of file diff --git a/_darcs/inventories/20081118173307-34904-426f45fb40129e75f9b251baecfec59e2b9cb6c9.gz b/_darcs/inventories/20081118173307-34904-426f45fb40129e75f9b251baecfec59e2b9cb6c9.gz new file mode 100644 index 0000000000..4e9e98e7f5 --- /dev/null +++ b/_darcs/inventories/20081118173307-34904-426f45fb40129e75f9b251baecfec59e2b9cb6c9.gz @@ -0,0 +1,5 @@ +Starting with tag: +[TAG 0.6.2 +Evan Prodromou **20081118172328] +[update version number in common.php +Evan Prodromou **20081118173250] \ No newline at end of file diff --git a/_darcs/inventories/20081124052429-5ed1f-0244f7dce1285a57198d87c6b11d906968193d64.gz b/_darcs/inventories/20081124052429-5ed1f-0244f7dce1285a57198d87c6b11d906968193d64.gz new file mode 100644 index 0000000000..eab2fc27d2 --- /dev/null +++ b/_darcs/inventories/20081124052429-5ed1f-0244f7dce1285a57198d87c6b11d906968193d64.gz @@ -0,0 +1,319 @@ +Starting with tag: +[TAG 0.6.2 +Evan Prodromou **20081118173307] +[♫ Don't you forget about me ♫ +Evan Prodromou **20081118024947] +[add some extra checks to avoid remote subscriptions to local users +Evan Prodromou **20081118180644] +[check URI before sending +Evan Prodromou **20081118192227] +[hide certain users from the public stream +Evan Prodromou **20081120183722 + + On identi.ca, certain users (http://identi.ca/derricklo) publish 5-10 + automated notices every half hour or hour. This can flood the public + stream, making it unreadable for casual readers. + + We don't want to prevent anyone from using the site for personal use. + However, if their personal use clouds up the public space, we can + gently remove them from that public space without interfering with + their personal activity. + + So: this change prevents selected people's notices from appearing in + the public stream. It's hand-configured by an administrator, and + probably doesn't scale beyond 10-20 blacklisted users. It's a stopgap + measure. + +] +[clean up list of expected features in faq +Evan Prodromou **20081120210045] +[inbox particular users +Evan Prodromou **20081121162600] +[variable name change bug +Evan Prodromou **20081121162918] +[notice inbox only when not already exists +Evan Prodromou **20081121184132] +[double-cache to get newer items +Evan Prodromou **20081122124151] +[whitespace cleanup +Evan Prodromou **20081122124235] +[use cached fave stream to save DB hits for faves +Evan Prodromou **20081122163347] +[messed up logic for passing faves +Evan Prodromou **20081122163552] +[blow last cache for faves +Evan Prodromou **20081122165234] +[if all faves in cache, skip +Evan Prodromou **20081122192857] +[blow last caches on notice delete +Evan Prodromou **20081124003240 + + We do some extra caching of streams, at ';last'. If a notice is + deleted, we need to blow those caches, too. So, this deletes them. + +] +[trac626 Put a list of feed links +csarven@controlyourself.ca**20081114210506] +[trac626 Bugfix: Atom URL missing a dot +csarven@controlyourself.ca**20081114214315] +[trac626 Update: Moving illustrations to the default theme +csarven@controlyourself.ca**20081114220805] +[trac670 trac689 Favorites (duplicate id, background image, JavaScript) +csarven@controlyourself.ca**20081115033549] +[Favorite icons change +csarven@controlyourself.ca**20081115043955 + Favorite (heart) icon is from the Tango Icon Library: + http://tango.freedesktop.org/Tango_Icon_Library + + Disfavor (broken heart) icon is created by modifying the favorite icon. +] +[Nudge feature +csarven@controlyourself.ca**20081116022735] +[added nudge.php action file +csarven@controlyourself.ca**20081116033155] +[fix nudge typo and add emailnotifynudge to laconica.ini +millette@controlyourself.ca**20081117001644] +[emailnotifynudge added to User.php class manually (how to auto-gen?) +millette@controlyourself.ca**20081117003010] +[nudge: only show it when other person has enabled it. +millette@controlyourself.ca**20081117154147] +[nudge : added js code to enable ajax +millette@controlyourself.ca**20081117173144] +[nudge: better nudge email, better nudge disable language. +millette@controlyourself.ca**20081117175627] +[small nudge enhancements +millette@controlyourself.ca**20081118155643] +[Favorites icon changes +csarven@controlyourself.ca**20081117181511 + Favorite (full heart) is using the twotone icon library from + http://www.upstartblogger.com/free-twotone-icons + + Disfavor (empty heart with outline) is a modified version +] +[Feed icon change +csarven@controlyourself.ca**20081118185649] +[Checkmark icon change +csarven@controlyourself.ca**20081118190030] +[Favor icon states fixed +csarven@controlyourself.ca**20081118194444] +[Twitter bridge - don't delete Twitter users. Update them instead. +zach@controlyourself.ca**20081114053044] +[trac685 Twitter bridge - Sync Twitter friends +zach@controlyourself.ca**20081117024624] +[trac685 Twitter bridge - Shell script to sync all users' Twitter friends +Zach Copley **20081119011128] +[Twitter bridge - fixed a bad call to Foreign_user +Zach Copley **20081119200839] +[Twitter bridge - shell script wasn't checking FOREIGN_FRIEND_RECV bit +Zach Copley **20081119204501] +[abstract people lists from search results +Evan Prodromou **20081120105027] +[correct constructor for PeopleSearchResults +Evan Prodromou **20081120105223] +[better looping in profile list +Evan Prodromou **20081120105726] +[display subscriptions/subscribers as a list +Evan Prodromou **20081120113839] +[do page offsets correctly (depending on display type) +Evan Prodromou **20081120114137] +[increase PROFILES_PER_PAGE from 10 to 20 +Evan Prodromou **20081120114156] +[remove unnecessary variables from subs query +Evan Prodromou **20081120122352] +[correct pagination criteria +Evan Prodromou **20081120122411] +[fix empty results +Evan Prodromou **20081120122620] +[show error on empty gallery +Evan Prodromou **20081120122709] +[stop trying to get count from query +Evan Prodromou **20081120123146] +[links to different display options for subscriptions +Evan Prodromou **20081120142914] +[add nickname to list/icons links +Evan Prodromou **20081120143045] +[forgot my dollar sign +Evan Prodromou **20081120143203] +[more pagination math +Evan Prodromou **20081120143840] +[add all params to subscribers +Evan Prodromou **20081120144300] +[break ties using profile ID for order +Evan Prodromou **20081120145619] +[try to fix up pagination again +Evan Prodromou **20081120145814] +[New public tabs - Public, Recent tags, Featured, and Favorited +Zach Copley **20081120071930] +[add new config variables +Evan Prodromou **20081120201502] +[more ajax coming (un-sub) +millette@controlyourself.ca**20081118174857] +[Copy of (un)subscribe forms in util.php +csarven@controlyourself.ca**20081120202448 + Will remove the copies in showstream.php once everything is okay. +] +[common_(un)subscribe_form +Evan Prodromou **20081120203528] +[float subscribe button right in profile list +Evan Prodromou **20081120204022] +[fixup CSS for profile_single +Evan Prodromou **20081120204147] +[fixup this pointer +Evan Prodromou **20081120204347] +[don't show sub/unsub on your own record! +Evan Prodromou **20081120204725] +[whitespace diff on Notice_inbox +Evan Prodromou **20081120205319] +[whitespace diffs in User.php +Evan Prodromou **20081120205421] +[add profile tags to DB +Evan Prodromou **20081120205506] +[let users set their own profile tags from profilesettings +Evan Prodromou **20081120214821] +[fix require in Profile_tag.php +Evan Prodromou **20081120214945] +[correct tags method for user +Evan Prodromou **20081120215222] +[correct name for param +Evan Prodromou **20081120215508] +[show self-tags +Evan Prodromou **20081120215751] +[add peopletag action for tagged people +Evan Prodromou **20081120224207] +[fix instructions in peopletag +Evan Prodromou **20081120224429] +[p-wrapper for instructions +Evan Prodromou **20081120224540] +[bad page +Evan Prodromou **20081120224708] +[fix timestamp name +Evan Prodromou **20081120224918] +[links to people tags +Evan Prodromou **20081120225137] +[show self-tags in profile list +Evan Prodromou **20081120225917] +[sphinx search of people +millette@controlyourself.ca**20081120211347] +[Only show 'Recent tags' tab for tag cloud, not for tag streams +Zach Copley **20081120212142] +[Public tabs - only show 'Featured' tab when featured users are defined in config.php +Zach Copley **20081120213022] +[Public tabs - added instructions for 'Featured' and 'Favorited'; removed notice input boxes +Zach Copley **20081120214557] +[(Un)Subscribe form using ajaxForm() +csarven@controlyourself.ca**20081120232655] +[tag other users +Evan Prodromou **20081121002038] +[fix $profile in profilelist +Evan Prodromou **20081121002402] +[fix link to tagother +Evan Prodromou **20081121003108] +[fix some stuff with tagother link +Evan Prodromou **20081121003338] +[a little better presentation for tag-other +Evan Prodromou **20081121003608] +[missed $tags in setTags +Evan Prodromou **20081121003655] +[importNode bugfix for undefined node +csarven@controlyourself.ca**20081120234923] +[only show tags if there's a logged-in user +Evan Prodromou **20081121004336] +[Don't allow user to send a new message or nudge right after subscribing to another contact +csarven@controlyourself.ca**20081120235752] +[fancy url for tagother +Evan Prodromou **20081121005216] +[show tags that the owner added, not that the current user added +Evan Prodromou **20081121005631] +[Public 'Featured' tab now shows profiles instead of notices! +Zach Copley **20081121005338] +[Tag markup and styling for tag_self, tag_user, form#tag_user +csarven@controlyourself.ca**20081121023827] +[fancier urls for tagged subscriptions/subscribers +Evan Prodromou **20081121025749] +[fix tag links in subs +Evan Prodromou **20081121154218] +[Linking directly from Your tags instead of Tag user +csarven@controlyourself.ca**20081121031811] +[rel-bookmark not required because hAtom is not present +csarven@controlyourself.ca**20081121153517] +[Profile CSS bugfix +csarven@controlyourself.ca**20081121155829] +[Removing empty element no longer in use +csarven@controlyourself.ca**20081121160208] +[Fixing bio alignment +csarven@controlyourself.ca**20081121161645] +[sphinx search for notices +millette@controlyourself.ca**20081120215041] +[sphinx integration for notices and profiles +millette@controlyourself.ca**20081123185136] +[conflict resolution on people search +millette@controlyourself.ca**20081123190555] +[sphinx: fallback if no connection +millette@controlyourself.ca**20081123201616] +[EXPERIMENTAL PATCH #3 - ajax response for newnotice.php +Zach Copley **20081122043145] +[merge save and ajax save +Evan Prodromou **20081123014003] +[PostNotice AJAX working in all browsers except IE +csarven@controlyourself.ca**20081123015559] +[Don't display avatars when posting to personal streams via ajax +Zach Copley **20081123022902] +[Set encoding for xml response in newnotice.php to UTF-8 +Zach Copley **20081123183613] +[Send raw UTF-8 chars instead of escaped entities in newnotice.php's ajax response +Zach Copley **20081123193727] +[Allow the toggling of XMLWriter's indenting on and off +Zach Copley **20081123211348 + + IE needs and unindented XML response in for ajax calls. +] +[Added 'Help' menu item to the header menu (in addition to the footer menu) +Zach Copley **20081123212532] +[Removed JS alert and minor cleanup +csarven@controlyourself.ca**20081123213458] +[sphinx search config.php.sample defaults +millette@controlyourself.ca**20081124005402] +[filter galleries by tag +Evan Prodromou **20081124013928] +[show dropdown of tags only when tags are available and add tags function to profile +Evan Prodromou **20081124015802] +[don't get self-tags +Evan Prodromou **20081124015927] +[fix tag link +Evan Prodromou **20081124020029] +[better tag handling for profile lists +Evan Prodromou **20081124024434] +[sphinx documentation and sample config file +millette@controlyourself.ca**20081124023036] +[include action in tags +csarven@controlyourself.ca**20081124025308] +[only get tags for this profile list type +Evan Prodromou **20081124031549] +[Make replies to @# +Evan Prodromou **20081124034952] +[little better handling of @# +Evan Prodromou **20081124035814] +[incorrect use of match results +Evan Prodromou **20081124040224] +[nudge: added rule to htaccess.sample (and removed duplicate line) +millette@controlyourself.ca**20081124033659] +[Added stanza about Twitter friends syncing to the README +Zach Copley **20081124041832] +[README for new version +Evan Prodromou **20081124043723] +[sphinx scripts +millette@controlyourself.ca**20081124044435] +[Subscriptions tag filtering and views +csarven@controlyourself.ca**20081124045319] +[retain links in List and Icon switch +Evan Prodromou **20081124045924] +[sphinx documentation for the provided scripts +millette@controlyourself.ca**20081124050037] +[fixing README conflict +millette@controlyourself.ca**20081124050556] +[redirect on a post from tag dropdown +Evan Prodromou **20081124051429] +[correct self_url without cookie stuff +Evan Prodromou **20081124052250] +[Tag filtering CSS fixes for IE +csarven@controlyourself.ca**20081124052230] \ No newline at end of file diff --git a/_darcs/inventories/20081124053335-34904-1e8a1fe43c30f5b9c13bf58654f1af5f894d1501.gz b/_darcs/inventories/20081124053335-34904-1e8a1fe43c30f5b9c13bf58654f1af5f894d1501.gz new file mode 100644 index 0000000000..15e9ab2828 --- /dev/null +++ b/_darcs/inventories/20081124053335-34904-1e8a1fe43c30f5b9c13bf58654f1af5f894d1501.gz @@ -0,0 +1,5 @@ +Starting with tag: +[TAG 0.6.3 +Evan Prodromou **20081124052429] +[a couple more items, release nickname +Evan Prodromou **20081124053237] \ No newline at end of file diff --git a/_darcs/inventories/20081215205036-34904-6e03eddcd13c7c882a9e7286edf67a63f5b5124b.gz b/_darcs/inventories/20081215205036-34904-6e03eddcd13c7c882a9e7286edf67a63f5b5124b.gz new file mode 100644 index 0000000000..b0523d3067 --- /dev/null +++ b/_darcs/inventories/20081215205036-34904-6e03eddcd13c7c882a9e7286edf67a63f5b5124b.gz @@ -0,0 +1,440 @@ +Starting with tag: +[TAG 0.6.3 +Evan Prodromou **20081124053335] +[small correction to sphinx scripts (path to sphinx.conf) +millette@controlyourself.ca**20081124053341] +[whitespace and fixup problem with blank string +Evan Prodromou **20081124150638] +[add gettext as a prereq +Evan Prodromou **20081124183054] +[support microsummaries +Evan Prodromou **20081124223533] +[microsummary doesn't need stream stuff +Evan Prodromou **20081124223733] +[better output for microsummary +Evan Prodromou **20081124223848] +[correct the output formats for api user timelines +Evan Prodromou **20081124234115] +[fix problems with blank tag strings (!) +Evan Prodromou **20081125000556] +[better link +Evan Prodromou **20081127162551] +[lost the URL +Evan Prodromou **20081127162720] +[don't use list display -- it's the default +Evan Prodromou **20081127162805] +[use full alphanum for incoming email addresses +Evan Prodromou **20081129233637] +[don't show self-subscriptions in FOAF +Evan Prodromou **20081130213755] +[change is_local flag for blacklisted users +Evan Prodromou **20081202184258 + + Changed the flag on notices that says whether the notice is local, so + that it's -1 for local-but-blacklisted. This should keep blacklisted + users off the public timeline. + +] +[check for blank email when rejecting a dupe +Evan Prodromou **20081202185343] +[whitespace in actions/register +Evan Prodromou **20081202185444] +[add instructions to the public page for people who aren't logged in +Evan Prodromou **20081202193857] +[better formatting for home page +Evan Prodromou **20081202194027] +[cleanup whitespace in public.php +Evan Prodromou **20081202194043] +[better registration instructions +Evan Prodromou **20081202194633] +[better instructions +Evan Prodromou **20081202194816] +[check for license compatibility +Evan Prodromou **20081203032632] +[whitespace fixup in userauthorization +Evan Prodromou **20081203032650] +[add common_compatible_license() function +Evan Prodromou **20081203032705] +[whitespace cleanup +Evan Prodromou **20081203032743] +[new auto-reply regexp (thanks @lilyhill!) +Evan Prodromou **20081204174754] +[use content namespace to add HTML to the notice output +Evan Prodromou **20081205152445] +[whitespace changes in rssaction +Evan Prodromou **20081205152521] +[HTML output in RSS 2.0 and Atom +Evan Prodromou **20081205160205] +[better error reporting for rememberme cookie handling +Evan Prodromou **20081209170413 + + rememberme cookies are probably the most complained-about parts of the + system. We use "weak", one-use, low-info cookies that don't allow + changing settings like passwords or email addresses. + + This change adds some better error-reporting to the rememberme + function. Hopefully we'll find out if there are other rm problem. + +] +[cache current user in a global variable +Evan Prodromou **20081209173402] +[common_warning() doesn't exist +Evan Prodromou **20081209174233] +[slightly better reporting when setting rememberme cookies +Evan Prodromou **20081209175446] +[slightly better rememberme logic in finishopenidlogin +Evan Prodromou **20081209180330] +[add some transaction voodoo to the insert for rememberme cookies +Evan Prodromou **20081209185424] +[lets an admin set the password for a user +Evan Prodromou **20081207192917 + + A small utility script for updating users' passwords. Since I have to + do this once in a while, I figured it was good to have a script for. + Will also (I think) update memcached. + +] +[edit throttling +Evan Prodromou **20081210174722] +[api posts cannot use one of the reserved sources: web, omb, mail or xmpp. +millette@controlyourself.ca**20081210173726] +[make sure passed profile_id is valid in Notice::saveNew +millette@controlyourself.ca**20081210181123] +[Ban certain users from posting by nickname and/or ID +Zach Copley **20081210191337] +[don't check edit throttle if throttle not enabled +Evan Prodromou **20081210194335] +[always return a variable by reference +Evan Prodromou **20081210233503] +[Remove a bunch of extraneous logging statements +Zach Copley **20081211024233] +[Twitter bridge: update to handle Twitter API changes to verify_credentials method +Zach Copley **20081211100106] +[only shorten >= 30 char links with some services. +millette@controlyourself.ca**20081125010332] +[fix text describe shortening service usage. +millette@controlyourself.ca**20081125010516] +[Dec/Increment user's number of Subscribers in Portfolio Un/Subscribe event. +csarven@controlyourself.ca**20081126182317] +[trac155 first step to delete account +millette@controlyourself.ca**20081123215059] +[a step closer to deleting a user and hosts posts from the db +millette@controlyourself.ca**20081124005054] +[only expand URLs we shortened ourselves + only shorten if notice > 140 chars +millette@controlyourself.ca**20081128200004] +[shorten urls for posts > 140 chars only, from anywhere. Only show long urls in title attributes for links we shortened ourselves. +millette@controlyourself.ca**20081128210114] +[use label tab for checkboxes +millette@controlyourself.ca**20081128223646] +[fix shorturl_api so it works even when 3rd party is down. +millette@controlyourself.ca**20081129012446] +[new upstream version of jquery form +Evan Prodromou **20081130231627] +[trac831 disables status_form input submit onsubmit +csarven@controlyourself.ca**20081201175028] +[add init, last_modified to actions +Evan Prodromou **20081202034736] +[init() returns boolean success value +Evan Prodromou **20081202040549] +[trim whitespace +Evan Prodromou **20081202041243] +[copy-and-paste typo +Evan Prodromou **20081202041508] +[whitespace changes in action.php +Evan Prodromou **20081202041532] +[better logic for if-modified-since +Evan Prodromou **20081202042159] +[better header for not-modified message +Evan Prodromou **20081202042334] +[add ETag handling +Evan Prodromou **20081202044211] +[better HTTP timestamp +Evan Prodromou **20081202044441] +[generate an etag for shownotice +Evan Prodromou **20081202045021] +[notices have a create stamp not a modified stamp +Evan Prodromou **20081202045320] +[end ETag with quotes +Evan Prodromou **20081202045544] +[remove init from rssaction +Evan Prodromou **20081202045825] +[cleanup whitespace in rssaction +Evan Prodromou **20081202045856] +[add attributes for shownotice +Evan Prodromou **20081202050200] +[better microformats from @singpolyma +Evan Prodromou **20081203035947] +[fix conflict with Robin's changes on trunk +Evan Prodromou **20081203041730] +[rollback removing init from rssaction +Evan Prodromou **20081203172856] +[change Action::init() to Action::prepare() to avoid conflict with RSS10Action::init() +Evan Prodromou **20081203173225] +[parent::init() -> parent::prepare() +Evan Prodromou **20081203173423] +[permanent redirect on non-canonical nickname +Evan Prodromou **20081203174646] +[unsubscribe from a remote profile +Evan Prodromou **20081203180945] +[if the site is marked as private, redirect anon users to login +Evan Prodromou **20081203182421] +[allow doc and api calls from private +Evan Prodromou **20081203182830] +[fine-tuning the privacy flag +Evan Prodromou **20081203183432] +[add finishopenidlogin to list of actions that anon users can do +Evan Prodromou **20081203183638] +[move checkbox label formatting from identica theme to default theme +Evan Prodromou **20081203184254] +[allow registrations even when site is private (for invites, etc.) +Evan Prodromou **20081203184748] +[don't allow new users if the site is closed or invite only in OpenID +Evan Prodromou **20081203185022] +[allow recoverpassword in private mode +Evan Prodromou **20081203185254] +[prepare the action obj for API +Evan Prodromou **20081203210358] +[Using abbr.published @title and ISO8601 +csarven@controlyourself.ca**20081203220637] +[add profile block data object +Evan Prodromou **20081203222619] +[whitespace in laconica.sql +Evan Prodromou **20081203222819] +[delete user and all traces from the db. +millette@controlyourself.ca**20081203164942] +[moving delete profile to its own space. +millette@controlyourself.ca**20081203192658] +[done delete own profile (see other settings) +millette@controlyourself.ca**20081204180233] +[trac768 keep transparency of resized avatar images. +millette@controlyourself.ca**20081204182953] +[trac494 email is now in recipient's language +millette@controlyourself.ca**20081204203433] +[send all emails in the destination's language. +millette@controlyourself.ca**20081204212455] +[set email content type to text/plain; utf-8 +millette@controlyourself.ca**20081204213414] +[trac855 trac856 and Feed list for the Favorited page +csarven@controlyourself.ca**20081205221402] +[fixup the problems with the repo patch +Evan Prodromou **20081205153325] +[remove favoritedrss +Evan Prodromou **20081207165900 + + I've removed the favoritedrss action, and removed the links from the + favorited page. + + Most-favorited is not a good candidate for an RSS format. RSS works + well for series that work sequentially -- new things always come in at + the top. + + This just isn't the case with "most favorited". The favorited notices + list on Identi.ca is sorted by how many times a message is favorited. + + What happens if a notice used to be on that list, then falls off + because other messages get more faves, then gets back on because it + gets faved again? Or if a notice moves "up" on the list? + +] +[(Un)Subscribed submit is disabled and greyed out while ajaxForm process +csarven@controlyourself.ca**20081208051212] +[Removed the "sun", process and checkmark icons from Nudge +csarven@controlyourself.ca**20081208053011] +[Favorited -> Popular +Evan Prodromou **20081208053543] +[add class to body element +Evan Prodromou **20081208055023] +[Nudge disabled and greyed out while ajaxForm process +csarven@controlyourself.ca**20081208055812] +[low-level management of blocks +Evan Prodromou **20081208031008] +[pass profile id for subscriptions rather than user name +Evan Prodromou **20081208031312] +[don't save replies from a blocked profile to the blocking user +Evan Prodromou **20081208031408] +[don't allow remote subscribes from blocked profiles +Evan Prodromou **20081208031532] +[remove unused code from profile list +Evan Prodromou **20081208033132] +[add block form to subscribers list and profile page +Evan Prodromou **20081208055511 + + I added a small form for blocking users to profiles in the profile + list, and also to the profile page. + + I also added an action to handle the results of blocking someone. + + This required some changes to the profile list class (so I could + add the block form), so I made them. And the gallery class lets its + subclasses return a subclass of ProfileList for their profile list. + +] +[fixup handle function in block action +Evan Prodromou **20081208062841] +[add header and footer +Evan Prodromou **20081208063056] +[add fancy url for block action +Evan Prodromou **20081208071521] +[return true from block action +Evan Prodromou **20081208071720] +[add block name to block form +Evan Prodromou **20081208072519] +[change element_start to element for instructions +Evan Prodromou **20081208072629] +[static to not static +Evan Prodromou **20081208072958] +[copyright block and better load for Memcached_DataObject in profile_block +Evan Prodromou **20081208073209] +[add returnto information to the block form +Evan Prodromou **20081208170931] +[error in figuring out actions to return to +Evan Prodromou **20081208172812] +[add an unblock form +Evan Prodromou **20081208173722] +[enable block API +Evan Prodromou **20081208185728] +[correctly init the document type for block API actions +Evan Prodromou **20081208193939] +[pass profile correctly to show_owner_controls +Evan Prodromou **20081208201351] +[pass returnto info from subscribers to block form +Evan Prodromou **20081208201453] +[Fixed duplicate @class assignment to element +csarven@controlyourself.ca**20081208215420] +[database changes to say whether to deliver messages for a subscription +Evan Prodromou **20081209033637] +[removed Profile_block::get, changed to use pkeyGet +Evan Prodromou **20081209041227] +[fix Profile_block::get() again +Evan Prodromou **20081209041648] +[trac540 - Add 'since' param to Twitter-compatible API calls +Zach Copley **20081209055345] +[trac750 - Exoskeleton of a nascent Facebook app +Zach Copley **20081206030132] +[trac750 - linked in CSS file and added CSS for profile box +Zach Copley **20081207235925 + - added button for adding a box to the profile on settings +] +[trac750 Remove foreign link when Facebook user removes our app +Zach Copley **20081208005522] +[trac750 added Facebook client libs for PHP to extlib dir +Zach Copley **20081208005816] +[trac750 Use Facebook dialogs for success and error messages during initial setup / login +Zach Copley **20081208015412] +[trac750 add timestamp to CSS file to keep Facebook's caching from ignoring our changes +Zach Copley **20081208051859] +[fix registration bug - fatal error when sending email confirmation +Zach Copley **20081209082750] +[New AjaxWebChannel for returning ajaxy responses to notice input box commands +Zach Copley **20081209210654] +[resolve conflicts +Evan Prodromou **20081210014619] +[set jabber and sms flags on subscriptions +Evan Prodromou **20081210024416] +[on broadcast jabber and sms to people with the flags set +Evan Prodromou **20081210024706] +[resolve conflicts in config.php.sample +Evan Prodromou **20081211162558] +[resolve whitespace changes in Notice.php +Evan Prodromou **20081211163150] +[whitespace conflicts in User.php +Evan Prodromou **20081211163434] +[missing argument +Evan Prodromou **20081211171353] +[Nudge JS process and image removal +Sarven Capadisli **20081211021755] +[add a menu to subs +Evan Prodromou **20081211180622] +[upgrade XMPPHP to upstream version +Evan Prodromou **20081211181500] +[xmppdaemon uses 'xml' rather than 'raw' accessor +Evan Prodromou **20081211183250] +[better output in subscribe +Evan Prodromou **20081211183756] +[add User-Agent to OMB requests +Evan Prodromou **20081211185525] +[Array needs initializing before it's returned. How did this code ever work? +Zach Copley **20081211022557] +[more places where required since param skipped for Notice::getStreamDirect +Evan Prodromou **20081211195259] +[fix id of common_unsubscribe_form +Evan Prodromou **20081211200239] +[Fix bad arguments that were throwing PHP warnings +Zach Copley **20081211203659] +[Profile block base style +Sarven Capadisli **20081211201717] +[Removal of unused processing style +Sarven Capadisli **20081211204814] +[Standardising XHR responses to utf-8 and indenting +Sarven Capadisli **20081211211814] +[Setting nudge XHR response to utf-8 and indenting +Sarven Capadisli **20081211212046] +[make a new NoticeList widget and call it from StreamAction +Evan Prodromou **20081211231252 + + I made a new notice-list widget (like the profile list) and call it + from StreamAction. This cleans up some of the mess in the various + notice-stream-showing classes. + + I also changed show-stream so it uses a subclass of NoticeList that + doesn't show author info (which is unnecessary). + +] +[don't use undefined source_link; instead, just link +Evan Prodromou **20081211231925] +[take out c&p code from newnotice, use noticelist classes instead +Evan Prodromou **20081211232000] +[remove unused $notice param from NoticeListItem::show() +Evan Prodromou **20081211232811] +[fixup function names for show_avatar() and show_nickname() +Evan Prodromou **20081211232921] +[$profile -> $this->profile in noticelistitem +Evan Prodromou **20081211233039] +[misspelled INSTALLDIR in newnotice.php +Evan Prodromou **20081211233515] +[switch labels for tabs on subs +Evan Prodromou **20081211234741] +[Alerting the direct message XHR response +Sarven Capadisli **20081211225808] +[Better titles and instructions for Featured and Popular tabs +Zach Copley **20081211235341 + (Do not be afraid of this patch!) +] +[Indenting the XML response +Sarven Capadisli **20081212030820] +[Block styles in Subscribers +Sarven Capadisli **20081212035117] +[Delivery method in Subscriptions +Sarven Capadisli **20081212035255] +[fix source name +Evan Prodromou **20081212041543] +[documentation and version number +Evan Prodromou **20081212043201] +[stub out facebook app and delete profile +Evan Prodromou **20081212044600] +[Using single id for both profile block and unblock +Sarven Capadisli **20081212043240] +[don't block yourself! +Evan Prodromou **20081212051830] +[link error with notice sources +Evan Prodromou **20081212054448] +[don't show form if subscription can't be found (weirdly) +Evan Prodromou **20081212055713] +[remove spaces from atlink for unfound name +Evan Prodromou **20081212174414] +[remove content:items from rss output +Evan Prodromou **20081212195520] +[trim the body of an incoming message +Evan Prodromou **20081214002239] +[trim some output to avoid excessive whitespace +Evan Prodromou **20081214161942] +[get rid of hcard in @-replies +Evan Prodromou **20081214204557] +[Setting font-weight to normal for nicknames within notices +Sarven Capadisli **20081212062337] +[Fixed Popular tab (hopefully) +Zach Copley **20081212075617] +[bug with remote subscriptions and blocks +Evan Prodromou **20081215132806] +[correctly handle remote re-subscribe +Evan Prodromou **20081215134824] \ No newline at end of file diff --git a/_darcs/inventories/20081220204906-34904-cc69d9afe4d4a20e9e07e3bb0b9562aa61e436e8.gz b/_darcs/inventories/20081220204906-34904-cc69d9afe4d4a20e9e07e3bb0b9562aa61e436e8.gz new file mode 100644 index 0000000000..46412f53ab --- /dev/null +++ b/_darcs/inventories/20081220204906-34904-cc69d9afe4d4a20e9e07e3bb0b9562aa61e436e8.gz @@ -0,0 +1,13 @@ +Starting with tag: +[TAG 0.6.4 +Evan Prodromou **20081215205036] +[Twitter-compatible API - update verify_credentials to return profile +Zach Copley **20081216030455] +[XHR response fix for IE +Sarven Capadisli **20081216063751] +[Direct message XHR response fix for IE and minor tweaks +Sarven Capadisli **20081216071818] +[two undefined variables in noticelist.php +Evan Prodromou **20081220204320] +[bugpatch release code +Evan Prodromou **20081220204852] \ No newline at end of file diff --git a/_darcs/inventories/20081228190546-34904-7f0c38f5139a581f3a9e7fd21772b3601450a36b.gz b/_darcs/inventories/20081228190546-34904-7f0c38f5139a581f3a9e7fd21772b3601450a36b.gz new file mode 100644 index 0000000000..10188700b1 --- /dev/null +++ b/_darcs/inventories/20081228190546-34904-7f0c38f5139a581f3a9e7fd21772b3601450a36b.gz @@ -0,0 +1,5 @@ +Starting with tag: +[TAG 0.6.4.1 +Evan Prodromou **20081220204906] +[Twitter-bridge: fix for Twitter's new strict policy of rejecting HTTP POSTs with invalid "expect" headers (not the same patch as in trunk) +Zach Copley **20081226051716] \ No newline at end of file diff --git a/_darcs/inventory b/_darcs/inventory new file mode 100644 index 0000000000..4cce87d659 --- /dev/null +++ b/_darcs/inventory @@ -0,0 +1,3 @@ +Starting with tag: +[TAG 0.6.4.1 +Evan Prodromou **20081220204906] \ No newline at end of file diff --git a/_darcs/patches/20080505135019-84dde-f35cef3a6f3c990937376c21e5e6d70c8eb22f80.gz b/_darcs/patches/20080505135019-84dde-f35cef3a6f3c990937376c21e5e6d70c8eb22f80.gz new file mode 100644 index 0000000000..ad8b4e078a Binary files /dev/null and b/_darcs/patches/20080505135019-84dde-f35cef3a6f3c990937376c21e5e6d70c8eb22f80.gz differ diff --git a/_darcs/patches/20080505135228-84dde-b8675e97f4dd684f5c24c1def8daedea793ed113.gz b/_darcs/patches/20080505135228-84dde-b8675e97f4dd684f5c24c1def8daedea793ed113.gz new file mode 100644 index 0000000000..e71106d2af Binary files /dev/null and b/_darcs/patches/20080505135228-84dde-b8675e97f4dd684f5c24c1def8daedea793ed113.gz differ diff --git a/_darcs/patches/20080505150839-84dde-a301ab5d8e22447e0f4ed8c465aedccecf46546d.gz b/_darcs/patches/20080505150839-84dde-a301ab5d8e22447e0f4ed8c465aedccecf46546d.gz new file mode 100644 index 0000000000..61b9ddf4f0 Binary files /dev/null and b/_darcs/patches/20080505150839-84dde-a301ab5d8e22447e0f4ed8c465aedccecf46546d.gz differ diff --git a/_darcs/patches/20080506151729-84dde-563da8505e06a7302041c93ab157ced31165876c.gz b/_darcs/patches/20080506151729-84dde-563da8505e06a7302041c93ab157ced31165876c.gz new file mode 100644 index 0000000000..6a8250e3ad Binary files /dev/null and b/_darcs/patches/20080506151729-84dde-563da8505e06a7302041c93ab157ced31165876c.gz differ diff --git a/_darcs/patches/20080507164807-84dde-ef7d205a0fedca42064a337786d2f203cdcc5a45.gz b/_darcs/patches/20080507164807-84dde-ef7d205a0fedca42064a337786d2f203cdcc5a45.gz new file mode 100644 index 0000000000..9418af6a15 Binary files /dev/null and b/_darcs/patches/20080507164807-84dde-ef7d205a0fedca42064a337786d2f203cdcc5a45.gz differ diff --git a/_darcs/patches/20080507171542-84dde-232baccc10f015e8c0e80edf0ceea4aa5c85b4b7.gz b/_darcs/patches/20080507171542-84dde-232baccc10f015e8c0e80edf0ceea4aa5c85b4b7.gz new file mode 100644 index 0000000000..e82fd90a34 Binary files /dev/null and b/_darcs/patches/20080507171542-84dde-232baccc10f015e8c0e80edf0ceea4aa5c85b4b7.gz differ diff --git a/_darcs/patches/20080508162145-84dde-9ae0fdcc75d794df754708642d8786ccd95d9461.gz b/_darcs/patches/20080508162145-84dde-9ae0fdcc75d794df754708642d8786ccd95d9461.gz new file mode 100644 index 0000000000..34c45c4ff8 Binary files /dev/null and b/_darcs/patches/20080508162145-84dde-9ae0fdcc75d794df754708642d8786ccd95d9461.gz differ diff --git a/_darcs/patches/20080509021604-84dde-f785fc09dd435fc12741b3a75184e2425721d03d.gz b/_darcs/patches/20080509021604-84dde-f785fc09dd435fc12741b3a75184e2425721d03d.gz new file mode 100644 index 0000000000..d02912407e Binary files /dev/null and b/_darcs/patches/20080509021604-84dde-f785fc09dd435fc12741b3a75184e2425721d03d.gz differ diff --git a/_darcs/patches/20080514145436-84dde-d0994cb35d3fe8545d3f08abeec3cdfe7559c67d.gz b/_darcs/patches/20080514145436-84dde-d0994cb35d3fe8545d3f08abeec3cdfe7559c67d.gz new file mode 100644 index 0000000000..430683300d Binary files /dev/null and b/_darcs/patches/20080514145436-84dde-d0994cb35d3fe8545d3f08abeec3cdfe7559c67d.gz differ diff --git a/_darcs/patches/20080514184702-84dde-b9291e08f3fd0ad31141e392cab26220b310a6d4.gz b/_darcs/patches/20080514184702-84dde-b9291e08f3fd0ad31141e392cab26220b310a6d4.gz new file mode 100644 index 0000000000..ef08394615 Binary files /dev/null and b/_darcs/patches/20080514184702-84dde-b9291e08f3fd0ad31141e392cab26220b310a6d4.gz differ diff --git a/_darcs/patches/20080514190009-84dde-30f0f1b5955d71cd85563e12078ab02bf8645524.gz b/_darcs/patches/20080514190009-84dde-30f0f1b5955d71cd85563e12078ab02bf8645524.gz new file mode 100644 index 0000000000..441591000b Binary files /dev/null and b/_darcs/patches/20080514190009-84dde-30f0f1b5955d71cd85563e12078ab02bf8645524.gz differ diff --git a/_darcs/patches/20080514190105-84dde-6a1e44520dd035f2203a08dab20f3008347ea53b.gz b/_darcs/patches/20080514190105-84dde-6a1e44520dd035f2203a08dab20f3008347ea53b.gz new file mode 100644 index 0000000000..770d87e609 Binary files /dev/null and b/_darcs/patches/20080514190105-84dde-6a1e44520dd035f2203a08dab20f3008347ea53b.gz differ diff --git a/_darcs/patches/20080514190300-84dde-626b88c9da510c8830d2eff2d36b72f18e6353d4.gz b/_darcs/patches/20080514190300-84dde-626b88c9da510c8830d2eff2d36b72f18e6353d4.gz new file mode 100644 index 0000000000..2b4d47f66a Binary files /dev/null and b/_darcs/patches/20080514190300-84dde-626b88c9da510c8830d2eff2d36b72f18e6353d4.gz differ diff --git a/_darcs/patches/20080514190341-84dde-1c71549a150c1028dae0cb8421cf61e72ce3045c.gz b/_darcs/patches/20080514190341-84dde-1c71549a150c1028dae0cb8421cf61e72ce3045c.gz new file mode 100644 index 0000000000..d776b2761b Binary files /dev/null and b/_darcs/patches/20080514190341-84dde-1c71549a150c1028dae0cb8421cf61e72ce3045c.gz differ diff --git a/_darcs/patches/20080514190411-84dde-d7fd117f33a642c038408fb34fbfb3a35057b476.gz b/_darcs/patches/20080514190411-84dde-d7fd117f33a642c038408fb34fbfb3a35057b476.gz new file mode 100644 index 0000000000..e770ac25af Binary files /dev/null and b/_darcs/patches/20080514190411-84dde-d7fd117f33a642c038408fb34fbfb3a35057b476.gz differ diff --git a/_darcs/patches/20080514192648-84dde-a430dc438a4e3741c62ccf30ee7f85ecc968b159.gz b/_darcs/patches/20080514192648-84dde-a430dc438a4e3741c62ccf30ee7f85ecc968b159.gz new file mode 100644 index 0000000000..6a8155fb5a Binary files /dev/null and b/_darcs/patches/20080514192648-84dde-a430dc438a4e3741c62ccf30ee7f85ecc968b159.gz differ diff --git a/_darcs/patches/20080515162844-84dde-fe0630366e247c02ca8ca9d1cc6b963cfce57a26.gz b/_darcs/patches/20080515162844-84dde-fe0630366e247c02ca8ca9d1cc6b963cfce57a26.gz new file mode 100644 index 0000000000..b8f611b8ac Binary files /dev/null and b/_darcs/patches/20080515162844-84dde-fe0630366e247c02ca8ca9d1cc6b963cfce57a26.gz differ diff --git a/_darcs/patches/20080517122045-84dde-8e13994e627805f29679c9533c2f62db81dc0925.gz b/_darcs/patches/20080517122045-84dde-8e13994e627805f29679c9533c2f62db81dc0925.gz new file mode 100644 index 0000000000..f38e2bb313 Binary files /dev/null and b/_darcs/patches/20080517122045-84dde-8e13994e627805f29679c9533c2f62db81dc0925.gz differ diff --git a/_darcs/patches/20080517135138-84dde-3c69c89ee8080568e92f655cbb3171867a7b38ce.gz b/_darcs/patches/20080517135138-84dde-3c69c89ee8080568e92f655cbb3171867a7b38ce.gz new file mode 100644 index 0000000000..3bc0806d27 Binary files /dev/null and b/_darcs/patches/20080517135138-84dde-3c69c89ee8080568e92f655cbb3171867a7b38ce.gz differ diff --git a/_darcs/patches/20080517140532-84dde-b316b4b425cced5c31fc2ecd0dd81217d5f91365.gz b/_darcs/patches/20080517140532-84dde-b316b4b425cced5c31fc2ecd0dd81217d5f91365.gz new file mode 100644 index 0000000000..9408009b55 Binary files /dev/null and b/_darcs/patches/20080517140532-84dde-b316b4b425cced5c31fc2ecd0dd81217d5f91365.gz differ diff --git a/_darcs/patches/20080517144642-84dde-c267a6e3bb0717ad5a3a819a7cf65fdd5817ea8e.gz b/_darcs/patches/20080517144642-84dde-c267a6e3bb0717ad5a3a819a7cf65fdd5817ea8e.gz new file mode 100644 index 0000000000..8489fe6b8c Binary files /dev/null and b/_darcs/patches/20080517144642-84dde-c267a6e3bb0717ad5a3a819a7cf65fdd5817ea8e.gz differ diff --git a/_darcs/patches/20080517152958-84dde-1170f017a6cf42845d74f75057c923be91404c29.gz b/_darcs/patches/20080517152958-84dde-1170f017a6cf42845d74f75057c923be91404c29.gz new file mode 100644 index 0000000000..4110f5df30 Binary files /dev/null and b/_darcs/patches/20080517152958-84dde-1170f017a6cf42845d74f75057c923be91404c29.gz differ diff --git a/_darcs/patches/20080517153127-84dde-0775d0606266158a488662dcd7377fcfc1c575c2.gz b/_darcs/patches/20080517153127-84dde-0775d0606266158a488662dcd7377fcfc1c575c2.gz new file mode 100644 index 0000000000..5382bb87b6 Binary files /dev/null and b/_darcs/patches/20080517153127-84dde-0775d0606266158a488662dcd7377fcfc1c575c2.gz differ diff --git a/_darcs/patches/20080517153140-84dde-9a66640ac27da548d82459183d14b60d9e0c241a.gz b/_darcs/patches/20080517153140-84dde-9a66640ac27da548d82459183d14b60d9e0c241a.gz new file mode 100644 index 0000000000..b84a7696f0 Binary files /dev/null and b/_darcs/patches/20080517153140-84dde-9a66640ac27da548d82459183d14b60d9e0c241a.gz differ diff --git a/_darcs/patches/20080517154701-84dde-8d38da89c5b9cb3b40704adb04a4de880c204181.gz b/_darcs/patches/20080517154701-84dde-8d38da89c5b9cb3b40704adb04a4de880c204181.gz new file mode 100644 index 0000000000..b387f56f73 Binary files /dev/null and b/_darcs/patches/20080517154701-84dde-8d38da89c5b9cb3b40704adb04a4de880c204181.gz differ diff --git a/_darcs/patches/20080517154942-84dde-d671f0805fc47c4321d84d3e1c1aea6a11d46395.gz b/_darcs/patches/20080517154942-84dde-d671f0805fc47c4321d84d3e1c1aea6a11d46395.gz new file mode 100644 index 0000000000..81cf740b89 Binary files /dev/null and b/_darcs/patches/20080517154942-84dde-d671f0805fc47c4321d84d3e1c1aea6a11d46395.gz differ diff --git a/_darcs/patches/20080517155326-84dde-2da05716ece2cce3c3f2f790d326c5333417ef9e.gz b/_darcs/patches/20080517155326-84dde-2da05716ece2cce3c3f2f790d326c5333417ef9e.gz new file mode 100644 index 0000000000..536f4787a5 Binary files /dev/null and b/_darcs/patches/20080517155326-84dde-2da05716ece2cce3c3f2f790d326c5333417ef9e.gz differ diff --git a/_darcs/patches/20080517155754-84dde-388126a2941bedd3b578e347e72b942404f6b6c0.gz b/_darcs/patches/20080517155754-84dde-388126a2941bedd3b578e347e72b942404f6b6c0.gz new file mode 100644 index 0000000000..44d2dbe899 Binary files /dev/null and b/_darcs/patches/20080517155754-84dde-388126a2941bedd3b578e347e72b942404f6b6c0.gz differ diff --git a/_darcs/patches/20080517160654-84dde-824b3aaf45639ff98e95c4b8011e32a74efd64a9.gz b/_darcs/patches/20080517160654-84dde-824b3aaf45639ff98e95c4b8011e32a74efd64a9.gz new file mode 100644 index 0000000000..ee9dd9c363 Binary files /dev/null and b/_darcs/patches/20080517160654-84dde-824b3aaf45639ff98e95c4b8011e32a74efd64a9.gz differ diff --git a/_darcs/patches/20080517160908-84dde-c176f1fa4c4026a84efac994e65db0158935cb11.gz b/_darcs/patches/20080517160908-84dde-c176f1fa4c4026a84efac994e65db0158935cb11.gz new file mode 100644 index 0000000000..4ce1a80961 Binary files /dev/null and b/_darcs/patches/20080517160908-84dde-c176f1fa4c4026a84efac994e65db0158935cb11.gz differ diff --git a/_darcs/patches/20080517161332-84dde-fbb5728ec0e6825c145f110b09420c231c4b7973.gz b/_darcs/patches/20080517161332-84dde-fbb5728ec0e6825c145f110b09420c231c4b7973.gz new file mode 100644 index 0000000000..a66a668a18 Binary files /dev/null and b/_darcs/patches/20080517161332-84dde-fbb5728ec0e6825c145f110b09420c231c4b7973.gz differ diff --git a/_darcs/patches/20080517161548-84dde-8b011466dcf6a0e95e5e0b9c6a5ddcf4cd4bd145.gz b/_darcs/patches/20080517161548-84dde-8b011466dcf6a0e95e5e0b9c6a5ddcf4cd4bd145.gz new file mode 100644 index 0000000000..6a9bf262f6 Binary files /dev/null and b/_darcs/patches/20080517161548-84dde-8b011466dcf6a0e95e5e0b9c6a5ddcf4cd4bd145.gz differ diff --git a/_darcs/patches/20080517161817-84dde-a28288b093f40eda0d8444f54eca818b2c65a735.gz b/_darcs/patches/20080517161817-84dde-a28288b093f40eda0d8444f54eca818b2c65a735.gz new file mode 100644 index 0000000000..1086a8df4d Binary files /dev/null and b/_darcs/patches/20080517161817-84dde-a28288b093f40eda0d8444f54eca818b2c65a735.gz differ diff --git a/_darcs/patches/20080517162305-84dde-92b12e54f367528cc0d8454c14ca2f1616eeb8e4.gz b/_darcs/patches/20080517162305-84dde-92b12e54f367528cc0d8454c14ca2f1616eeb8e4.gz new file mode 100644 index 0000000000..88912b0d6d Binary files /dev/null and b/_darcs/patches/20080517162305-84dde-92b12e54f367528cc0d8454c14ca2f1616eeb8e4.gz differ diff --git a/_darcs/patches/20080517162932-84dde-f087458cd090cc24d032a5d5e45ef1e13eb8be9d.gz b/_darcs/patches/20080517162932-84dde-f087458cd090cc24d032a5d5e45ef1e13eb8be9d.gz new file mode 100644 index 0000000000..f102102b47 Binary files /dev/null and b/_darcs/patches/20080517162932-84dde-f087458cd090cc24d032a5d5e45ef1e13eb8be9d.gz differ diff --git a/_darcs/patches/20080517163749-84dde-a323b2b956a0912c5dc2cb93a83714dad64064a0.gz b/_darcs/patches/20080517163749-84dde-a323b2b956a0912c5dc2cb93a83714dad64064a0.gz new file mode 100644 index 0000000000..49cabb33f9 Binary files /dev/null and b/_darcs/patches/20080517163749-84dde-a323b2b956a0912c5dc2cb93a83714dad64064a0.gz differ diff --git a/_darcs/patches/20080517163917-84dde-c9e0953e6074e66d427164e7cfad1ca1cf27553b.gz b/_darcs/patches/20080517163917-84dde-c9e0953e6074e66d427164e7cfad1ca1cf27553b.gz new file mode 100644 index 0000000000..d438f73da8 Binary files /dev/null and b/_darcs/patches/20080517163917-84dde-c9e0953e6074e66d427164e7cfad1ca1cf27553b.gz differ diff --git a/_darcs/patches/20080517164218-84dde-20ee8612a1d3cd913b1412d5ee56a72a2b741f2b.gz b/_darcs/patches/20080517164218-84dde-20ee8612a1d3cd913b1412d5ee56a72a2b741f2b.gz new file mode 100644 index 0000000000..887619e690 Binary files /dev/null and b/_darcs/patches/20080517164218-84dde-20ee8612a1d3cd913b1412d5ee56a72a2b741f2b.gz differ diff --git a/_darcs/patches/20080517164349-84dde-6931aabcabe26e327f6f139c6e374816fbb327fd.gz b/_darcs/patches/20080517164349-84dde-6931aabcabe26e327f6f139c6e374816fbb327fd.gz new file mode 100644 index 0000000000..17a4a8b0b3 Binary files /dev/null and b/_darcs/patches/20080517164349-84dde-6931aabcabe26e327f6f139c6e374816fbb327fd.gz differ diff --git a/_darcs/patches/20080517170430-84dde-74f42b52695699f646b65b939f78fbbe95a05c7e.gz b/_darcs/patches/20080517170430-84dde-74f42b52695699f646b65b939f78fbbe95a05c7e.gz new file mode 100644 index 0000000000..5c226c8a95 Binary files /dev/null and b/_darcs/patches/20080517170430-84dde-74f42b52695699f646b65b939f78fbbe95a05c7e.gz differ diff --git a/_darcs/patches/20080517170617-84dde-e9d708d6e04c748ac35a93e69b3ac7f0129c0585.gz b/_darcs/patches/20080517170617-84dde-e9d708d6e04c748ac35a93e69b3ac7f0129c0585.gz new file mode 100644 index 0000000000..5cb2d43188 Binary files /dev/null and b/_darcs/patches/20080517170617-84dde-e9d708d6e04c748ac35a93e69b3ac7f0129c0585.gz differ diff --git a/_darcs/patches/20080517170920-84dde-150c051a92f5af4189e55539d71c37b4f20e369d.gz b/_darcs/patches/20080517170920-84dde-150c051a92f5af4189e55539d71c37b4f20e369d.gz new file mode 100644 index 0000000000..f5bbf93e28 Binary files /dev/null and b/_darcs/patches/20080517170920-84dde-150c051a92f5af4189e55539d71c37b4f20e369d.gz differ diff --git a/_darcs/patches/20080517171501-84dde-b8d6a1cc106372c9127d73442b4740f2de7e7b22.gz b/_darcs/patches/20080517171501-84dde-b8d6a1cc106372c9127d73442b4740f2de7e7b22.gz new file mode 100644 index 0000000000..ea40dadd5d Binary files /dev/null and b/_darcs/patches/20080517171501-84dde-b8d6a1cc106372c9127d73442b4740f2de7e7b22.gz differ diff --git a/_darcs/patches/20080517172110-84dde-d2c83cb5e88693100c444b0ed088eed327f8a77d.gz b/_darcs/patches/20080517172110-84dde-d2c83cb5e88693100c444b0ed088eed327f8a77d.gz new file mode 100644 index 0000000000..b052035f08 Binary files /dev/null and b/_darcs/patches/20080517172110-84dde-d2c83cb5e88693100c444b0ed088eed327f8a77d.gz differ diff --git a/_darcs/patches/20080517172528-84dde-99ef7b8b71e3229d54697a84ac7f9f3d8cbd77db.gz b/_darcs/patches/20080517172528-84dde-99ef7b8b71e3229d54697a84ac7f9f3d8cbd77db.gz new file mode 100644 index 0000000000..8dcc491af0 Binary files /dev/null and b/_darcs/patches/20080517172528-84dde-99ef7b8b71e3229d54697a84ac7f9f3d8cbd77db.gz differ diff --git a/_darcs/patches/20080517172654-84dde-83b31bcf0f9497bf6a1d3d3bc498312e50b6b9da.gz b/_darcs/patches/20080517172654-84dde-83b31bcf0f9497bf6a1d3d3bc498312e50b6b9da.gz new file mode 100644 index 0000000000..29df635a9b Binary files /dev/null and b/_darcs/patches/20080517172654-84dde-83b31bcf0f9497bf6a1d3d3bc498312e50b6b9da.gz differ diff --git a/_darcs/patches/20080517173424-84dde-6fe6df2e710f1a19db97a93682f41cf01034952f.gz b/_darcs/patches/20080517173424-84dde-6fe6df2e710f1a19db97a93682f41cf01034952f.gz new file mode 100644 index 0000000000..631777670d Binary files /dev/null and b/_darcs/patches/20080517173424-84dde-6fe6df2e710f1a19db97a93682f41cf01034952f.gz differ diff --git a/_darcs/patches/20080517173626-84dde-da0e6057b127ef3578267bdbc425dcef36f29c2a.gz b/_darcs/patches/20080517173626-84dde-da0e6057b127ef3578267bdbc425dcef36f29c2a.gz new file mode 100644 index 0000000000..1d871b6b6f Binary files /dev/null and b/_darcs/patches/20080517173626-84dde-da0e6057b127ef3578267bdbc425dcef36f29c2a.gz differ diff --git a/_darcs/patches/20080517174219-84dde-60a678b876bfe9ec9b93142734c21019ad5761bf.gz b/_darcs/patches/20080517174219-84dde-60a678b876bfe9ec9b93142734c21019ad5761bf.gz new file mode 100644 index 0000000000..d5c1afddde Binary files /dev/null and b/_darcs/patches/20080517174219-84dde-60a678b876bfe9ec9b93142734c21019ad5761bf.gz differ diff --git a/_darcs/patches/20080517175022-84dde-475a63e7f8d400c508d259fcbc9959588720316b.gz b/_darcs/patches/20080517175022-84dde-475a63e7f8d400c508d259fcbc9959588720316b.gz new file mode 100644 index 0000000000..8aad3d8c6f Binary files /dev/null and b/_darcs/patches/20080517175022-84dde-475a63e7f8d400c508d259fcbc9959588720316b.gz differ diff --git a/_darcs/patches/20080517175416-84dde-b83a41de70a48671e0a251c645cf67b81c54bda6.gz b/_darcs/patches/20080517175416-84dde-b83a41de70a48671e0a251c645cf67b81c54bda6.gz new file mode 100644 index 0000000000..88ad6946d1 Binary files /dev/null and b/_darcs/patches/20080517175416-84dde-b83a41de70a48671e0a251c645cf67b81c54bda6.gz differ diff --git a/_darcs/patches/20080517190142-84dde-ec4cc3dc256c2daca29ffe6710507188829f04ba.gz b/_darcs/patches/20080517190142-84dde-ec4cc3dc256c2daca29ffe6710507188829f04ba.gz new file mode 100644 index 0000000000..81f39133f6 Binary files /dev/null and b/_darcs/patches/20080517190142-84dde-ec4cc3dc256c2daca29ffe6710507188829f04ba.gz differ diff --git a/_darcs/patches/20080517191034-84dde-eebc08698104692bd67e00b9feffb0dd19f5c2b9.gz b/_darcs/patches/20080517191034-84dde-eebc08698104692bd67e00b9feffb0dd19f5c2b9.gz new file mode 100644 index 0000000000..4db0f4b4b0 Binary files /dev/null and b/_darcs/patches/20080517191034-84dde-eebc08698104692bd67e00b9feffb0dd19f5c2b9.gz differ diff --git a/_darcs/patches/20080517191128-84dde-1bbcedf4c600b5faaca9a2c3f27feb1256cf7046.gz b/_darcs/patches/20080517191128-84dde-1bbcedf4c600b5faaca9a2c3f27feb1256cf7046.gz new file mode 100644 index 0000000000..6ad0eec4c8 Binary files /dev/null and b/_darcs/patches/20080517191128-84dde-1bbcedf4c600b5faaca9a2c3f27feb1256cf7046.gz differ diff --git a/_darcs/patches/20080517191430-84dde-bdaffcd7b2704a8a3636db7c7ebbc43c8d826198.gz b/_darcs/patches/20080517191430-84dde-bdaffcd7b2704a8a3636db7c7ebbc43c8d826198.gz new file mode 100644 index 0000000000..f5e154bd41 Binary files /dev/null and b/_darcs/patches/20080517191430-84dde-bdaffcd7b2704a8a3636db7c7ebbc43c8d826198.gz differ diff --git a/_darcs/patches/20080517192001-84dde-fa2b16b7aeacab52c7697e14182fc72d2022bfcc.gz b/_darcs/patches/20080517192001-84dde-fa2b16b7aeacab52c7697e14182fc72d2022bfcc.gz new file mode 100644 index 0000000000..df145becec Binary files /dev/null and b/_darcs/patches/20080517192001-84dde-fa2b16b7aeacab52c7697e14182fc72d2022bfcc.gz differ diff --git a/_darcs/patches/20080517192151-84dde-d96af70740e7edd76fd1dd4cd9ea5f8e9bc5c060.gz b/_darcs/patches/20080517192151-84dde-d96af70740e7edd76fd1dd4cd9ea5f8e9bc5c060.gz new file mode 100644 index 0000000000..e7602406c7 Binary files /dev/null and b/_darcs/patches/20080517192151-84dde-d96af70740e7edd76fd1dd4cd9ea5f8e9bc5c060.gz differ diff --git a/_darcs/patches/20080517192447-84dde-f8dc1f4befde5d7624887b13eb7f5730f693c72c.gz b/_darcs/patches/20080517192447-84dde-f8dc1f4befde5d7624887b13eb7f5730f693c72c.gz new file mode 100644 index 0000000000..5ca772dcaa Binary files /dev/null and b/_darcs/patches/20080517192447-84dde-f8dc1f4befde5d7624887b13eb7f5730f693c72c.gz differ diff --git a/_darcs/patches/20080517193030-84dde-ecd85676afd34bd9eb4b42b84bb3b6a6b9ea6a9e.gz b/_darcs/patches/20080517193030-84dde-ecd85676afd34bd9eb4b42b84bb3b6a6b9ea6a9e.gz new file mode 100644 index 0000000000..ee7f016a74 Binary files /dev/null and b/_darcs/patches/20080517193030-84dde-ecd85676afd34bd9eb4b42b84bb3b6a6b9ea6a9e.gz differ diff --git a/_darcs/patches/20080517193520-84dde-e0e0ad44fa0b87e7964fa36375b656e7cfabf865.gz b/_darcs/patches/20080517193520-84dde-e0e0ad44fa0b87e7964fa36375b656e7cfabf865.gz new file mode 100644 index 0000000000..a92b9209f2 Binary files /dev/null and b/_darcs/patches/20080517193520-84dde-e0e0ad44fa0b87e7964fa36375b656e7cfabf865.gz differ diff --git a/_darcs/patches/20080517193833-84dde-6bd3630291a70a6ba6f5b37ba7397f320c4d6d5e.gz b/_darcs/patches/20080517193833-84dde-6bd3630291a70a6ba6f5b37ba7397f320c4d6d5e.gz new file mode 100644 index 0000000000..a3d5389495 Binary files /dev/null and b/_darcs/patches/20080517193833-84dde-6bd3630291a70a6ba6f5b37ba7397f320c4d6d5e.gz differ diff --git a/_darcs/patches/20080517194003-84dde-fb9334c5cfa7654d09b770132d284d5fa8d7b4ca.gz b/_darcs/patches/20080517194003-84dde-fb9334c5cfa7654d09b770132d284d5fa8d7b4ca.gz new file mode 100644 index 0000000000..01567baa66 Binary files /dev/null and b/_darcs/patches/20080517194003-84dde-fb9334c5cfa7654d09b770132d284d5fa8d7b4ca.gz differ diff --git a/_darcs/patches/20080517194133-84dde-7fc79724a9036b6d98c44c3369aac6a5a3ee931f.gz b/_darcs/patches/20080517194133-84dde-7fc79724a9036b6d98c44c3369aac6a5a3ee931f.gz new file mode 100644 index 0000000000..2629fc43da Binary files /dev/null and b/_darcs/patches/20080517194133-84dde-7fc79724a9036b6d98c44c3369aac6a5a3ee931f.gz differ diff --git a/_darcs/patches/20080517195201-84dde-8f8269284e5fc00e9f2a6d8187059d0f59eae007.gz b/_darcs/patches/20080517195201-84dde-8f8269284e5fc00e9f2a6d8187059d0f59eae007.gz new file mode 100644 index 0000000000..835ec67bb3 Binary files /dev/null and b/_darcs/patches/20080517195201-84dde-8f8269284e5fc00e9f2a6d8187059d0f59eae007.gz differ diff --git a/_darcs/patches/20080517195449-84dde-d08f3cad4fb79cdf81ef40f79aa30a29c9ddd9a7.gz b/_darcs/patches/20080517195449-84dde-d08f3cad4fb79cdf81ef40f79aa30a29c9ddd9a7.gz new file mode 100644 index 0000000000..ff654a9003 Binary files /dev/null and b/_darcs/patches/20080517195449-84dde-d08f3cad4fb79cdf81ef40f79aa30a29c9ddd9a7.gz differ diff --git a/_darcs/patches/20080517195724-84dde-9a5bbde2f8be89dbeaf255e6ae8c5f392af63c64.gz b/_darcs/patches/20080517195724-84dde-9a5bbde2f8be89dbeaf255e6ae8c5f392af63c64.gz new file mode 100644 index 0000000000..65e21d1680 Binary files /dev/null and b/_darcs/patches/20080517195724-84dde-9a5bbde2f8be89dbeaf255e6ae8c5f392af63c64.gz differ diff --git a/_darcs/patches/20080517201411-84dde-7a6195517a5bded7b84266f61c035e2adbc49edd.gz b/_darcs/patches/20080517201411-84dde-7a6195517a5bded7b84266f61c035e2adbc49edd.gz new file mode 100644 index 0000000000..55353e769b Binary files /dev/null and b/_darcs/patches/20080517201411-84dde-7a6195517a5bded7b84266f61c035e2adbc49edd.gz differ diff --git a/_darcs/patches/20080517201719-84dde-ad4d5d935f510bedbd965c9c4c93550c50820454.gz b/_darcs/patches/20080517201719-84dde-ad4d5d935f510bedbd965c9c4c93550c50820454.gz new file mode 100644 index 0000000000..1b4628def0 Binary files /dev/null and b/_darcs/patches/20080517201719-84dde-ad4d5d935f510bedbd965c9c4c93550c50820454.gz differ diff --git a/_darcs/patches/20080517202132-84dde-78c7fe9f22aa28f33e9e00432f5cf6436b64e6b5.gz b/_darcs/patches/20080517202132-84dde-78c7fe9f22aa28f33e9e00432f5cf6436b64e6b5.gz new file mode 100644 index 0000000000..a2444d103c Binary files /dev/null and b/_darcs/patches/20080517202132-84dde-78c7fe9f22aa28f33e9e00432f5cf6436b64e6b5.gz differ diff --git a/_darcs/patches/20080518011808-84dde-a379fa8baa2f3cc7e871e54d46ef025106aecc84.gz b/_darcs/patches/20080518011808-84dde-a379fa8baa2f3cc7e871e54d46ef025106aecc84.gz new file mode 100644 index 0000000000..329c91e033 Binary files /dev/null and b/_darcs/patches/20080518011808-84dde-a379fa8baa2f3cc7e871e54d46ef025106aecc84.gz differ diff --git a/_darcs/patches/20080518012850-84dde-31e2c255b661dc71201756b20763ab817df44d05.gz b/_darcs/patches/20080518012850-84dde-31e2c255b661dc71201756b20763ab817df44d05.gz new file mode 100644 index 0000000000..5a3623d325 Binary files /dev/null and b/_darcs/patches/20080518012850-84dde-31e2c255b661dc71201756b20763ab817df44d05.gz differ diff --git a/_darcs/patches/20080518013312-84dde-382047d577719dd4f0fd39768546b6bb43b1933c.gz b/_darcs/patches/20080518013312-84dde-382047d577719dd4f0fd39768546b6bb43b1933c.gz new file mode 100644 index 0000000000..161d2f764b Binary files /dev/null and b/_darcs/patches/20080518013312-84dde-382047d577719dd4f0fd39768546b6bb43b1933c.gz differ diff --git a/_darcs/patches/20080518013747-84dde-e3e4f2bcd562f86e7c5460bc1bdbda8a1417dd31.gz b/_darcs/patches/20080518013747-84dde-e3e4f2bcd562f86e7c5460bc1bdbda8a1417dd31.gz new file mode 100644 index 0000000000..074c48dc01 Binary files /dev/null and b/_darcs/patches/20080518013747-84dde-e3e4f2bcd562f86e7c5460bc1bdbda8a1417dd31.gz differ diff --git a/_darcs/patches/20080518014207-84dde-8efb938e50bbd1c1008c3b8a1e09e17124d260b4.gz b/_darcs/patches/20080518014207-84dde-8efb938e50bbd1c1008c3b8a1e09e17124d260b4.gz new file mode 100644 index 0000000000..33e1703e2d Binary files /dev/null and b/_darcs/patches/20080518014207-84dde-8efb938e50bbd1c1008c3b8a1e09e17124d260b4.gz differ diff --git a/_darcs/patches/20080518015551-84dde-65964e140ed0b6c23aeee368fcffccdc14d71c61.gz b/_darcs/patches/20080518015551-84dde-65964e140ed0b6c23aeee368fcffccdc14d71c61.gz new file mode 100644 index 0000000000..58c720b264 Binary files /dev/null and b/_darcs/patches/20080518015551-84dde-65964e140ed0b6c23aeee368fcffccdc14d71c61.gz differ diff --git a/_darcs/patches/20080518125253-84dde-590f37a4789b5fbf702a0cbacbd56087d94d51f9.gz b/_darcs/patches/20080518125253-84dde-590f37a4789b5fbf702a0cbacbd56087d94d51f9.gz new file mode 100644 index 0000000000..375895467c Binary files /dev/null and b/_darcs/patches/20080518125253-84dde-590f37a4789b5fbf702a0cbacbd56087d94d51f9.gz differ diff --git a/_darcs/patches/20080518185940-84dde-fb7a3af877c67b5d7e9c59d32092c1392a0ecd58.gz b/_darcs/patches/20080518185940-84dde-fb7a3af877c67b5d7e9c59d32092c1392a0ecd58.gz new file mode 100644 index 0000000000..d634c588d7 Binary files /dev/null and b/_darcs/patches/20080518185940-84dde-fb7a3af877c67b5d7e9c59d32092c1392a0ecd58.gz differ diff --git a/_darcs/patches/20080518190220-84dde-e1e3005a72a6913dd86fc9384e1083fb39203a73.gz b/_darcs/patches/20080518190220-84dde-e1e3005a72a6913dd86fc9384e1083fb39203a73.gz new file mode 100644 index 0000000000..cd4c6dc6de Binary files /dev/null and b/_darcs/patches/20080518190220-84dde-e1e3005a72a6913dd86fc9384e1083fb39203a73.gz differ diff --git a/_darcs/patches/20080518191056-84dde-c7b52e98b4b9642788c82f28cdf16ff6af9f45c3.gz b/_darcs/patches/20080518191056-84dde-c7b52e98b4b9642788c82f28cdf16ff6af9f45c3.gz new file mode 100644 index 0000000000..cadc364273 Binary files /dev/null and b/_darcs/patches/20080518191056-84dde-c7b52e98b4b9642788c82f28cdf16ff6af9f45c3.gz differ diff --git a/_darcs/patches/20080518191326-84dde-29f6238550a5dc66e4de2c4e1e165be254609ce6.gz b/_darcs/patches/20080518191326-84dde-29f6238550a5dc66e4de2c4e1e165be254609ce6.gz new file mode 100644 index 0000000000..973b059831 Binary files /dev/null and b/_darcs/patches/20080518191326-84dde-29f6238550a5dc66e4de2c4e1e165be254609ce6.gz differ diff --git a/_darcs/patches/20080518191750-84dde-b8dc74908e66879d5746fd39a3e16a370fab08f2.gz b/_darcs/patches/20080518191750-84dde-b8dc74908e66879d5746fd39a3e16a370fab08f2.gz new file mode 100644 index 0000000000..d6c82b40b0 Binary files /dev/null and b/_darcs/patches/20080518191750-84dde-b8dc74908e66879d5746fd39a3e16a370fab08f2.gz differ diff --git a/_darcs/patches/20080518191849-84dde-ecaf7a36d27378d707d0a08b3948bcc2af24374f.gz b/_darcs/patches/20080518191849-84dde-ecaf7a36d27378d707d0a08b3948bcc2af24374f.gz new file mode 100644 index 0000000000..b2e73337bd Binary files /dev/null and b/_darcs/patches/20080518191849-84dde-ecaf7a36d27378d707d0a08b3948bcc2af24374f.gz differ diff --git a/_darcs/patches/20080518193951-84dde-cc45fbfba1f11a4ae2f629cc862e02a14743f2c1.gz b/_darcs/patches/20080518193951-84dde-cc45fbfba1f11a4ae2f629cc862e02a14743f2c1.gz new file mode 100644 index 0000000000..993ca9a044 Binary files /dev/null and b/_darcs/patches/20080518193951-84dde-cc45fbfba1f11a4ae2f629cc862e02a14743f2c1.gz differ diff --git a/_darcs/patches/20080518194653-84dde-33205b1f2f6297006d63aec41fa91a8bcffda1ef.gz b/_darcs/patches/20080518194653-84dde-33205b1f2f6297006d63aec41fa91a8bcffda1ef.gz new file mode 100644 index 0000000000..74e7185a11 Binary files /dev/null and b/_darcs/patches/20080518194653-84dde-33205b1f2f6297006d63aec41fa91a8bcffda1ef.gz differ diff --git a/_darcs/patches/20080519122445-84dde-b6505e0b8ea310eee50eb6e638238fb7cf93bead.gz b/_darcs/patches/20080519122445-84dde-b6505e0b8ea310eee50eb6e638238fb7cf93bead.gz new file mode 100644 index 0000000000..9f27581bba Binary files /dev/null and b/_darcs/patches/20080519122445-84dde-b6505e0b8ea310eee50eb6e638238fb7cf93bead.gz differ diff --git a/_darcs/patches/20080519122708-84dde-78ec2e47aeb4b33fb83c7d8f5e7f3735d66055ae.gz b/_darcs/patches/20080519122708-84dde-78ec2e47aeb4b33fb83c7d8f5e7f3735d66055ae.gz new file mode 100644 index 0000000000..f9bbd67110 Binary files /dev/null and b/_darcs/patches/20080519122708-84dde-78ec2e47aeb4b33fb83c7d8f5e7f3735d66055ae.gz differ diff --git a/_darcs/patches/20080519131808-84dde-af9d0bf03a963f7b0bdaed3b973a38998f9e806e.gz b/_darcs/patches/20080519131808-84dde-af9d0bf03a963f7b0bdaed3b973a38998f9e806e.gz new file mode 100644 index 0000000000..b65744bd27 Binary files /dev/null and b/_darcs/patches/20080519131808-84dde-af9d0bf03a963f7b0bdaed3b973a38998f9e806e.gz differ diff --git a/_darcs/patches/20080519132118-84dde-abb2cf71cc9f7f319c8a2a556bdb591f40221a5c.gz b/_darcs/patches/20080519132118-84dde-abb2cf71cc9f7f319c8a2a556bdb591f40221a5c.gz new file mode 100644 index 0000000000..b6ad6e3ec4 Binary files /dev/null and b/_darcs/patches/20080519132118-84dde-abb2cf71cc9f7f319c8a2a556bdb591f40221a5c.gz differ diff --git a/_darcs/patches/20080519134057-84dde-d30a178de9e3e7d6ced21e9c395dfac545b3d343.gz b/_darcs/patches/20080519134057-84dde-d30a178de9e3e7d6ced21e9c395dfac545b3d343.gz new file mode 100644 index 0000000000..3f702d00ff Binary files /dev/null and b/_darcs/patches/20080519134057-84dde-d30a178de9e3e7d6ced21e9c395dfac545b3d343.gz differ diff --git a/_darcs/patches/20080519141219-84dde-f9917a8351596060faa7ff5d231417773764a8fd.gz b/_darcs/patches/20080519141219-84dde-f9917a8351596060faa7ff5d231417773764a8fd.gz new file mode 100644 index 0000000000..1e1b1b8e93 Binary files /dev/null and b/_darcs/patches/20080519141219-84dde-f9917a8351596060faa7ff5d231417773764a8fd.gz differ diff --git a/_darcs/patches/20080519141351-84dde-98b442cb7275b94a5fc6198f9ef78a785ed7bf19.gz b/_darcs/patches/20080519141351-84dde-98b442cb7275b94a5fc6198f9ef78a785ed7bf19.gz new file mode 100644 index 0000000000..488bc38bcb Binary files /dev/null and b/_darcs/patches/20080519141351-84dde-98b442cb7275b94a5fc6198f9ef78a785ed7bf19.gz differ diff --git a/_darcs/patches/20080519141736-84dde-20ee1ffc994ca10ae3ccd6ec765512ad0cd0385c.gz b/_darcs/patches/20080519141736-84dde-20ee1ffc994ca10ae3ccd6ec765512ad0cd0385c.gz new file mode 100644 index 0000000000..e44515521c Binary files /dev/null and b/_darcs/patches/20080519141736-84dde-20ee1ffc994ca10ae3ccd6ec765512ad0cd0385c.gz differ diff --git a/_darcs/patches/20080519141943-84dde-940b096ccb100a7f92eb0787dc7c1050d8184ad3.gz b/_darcs/patches/20080519141943-84dde-940b096ccb100a7f92eb0787dc7c1050d8184ad3.gz new file mode 100644 index 0000000000..2d0595b8c8 Binary files /dev/null and b/_darcs/patches/20080519141943-84dde-940b096ccb100a7f92eb0787dc7c1050d8184ad3.gz differ diff --git a/_darcs/patches/20080519142807-84dde-0d9a0a3d70e935a0264215fa1c18082d78057e36.gz b/_darcs/patches/20080519142807-84dde-0d9a0a3d70e935a0264215fa1c18082d78057e36.gz new file mode 100644 index 0000000000..3cc0f9f1b0 Binary files /dev/null and b/_darcs/patches/20080519142807-84dde-0d9a0a3d70e935a0264215fa1c18082d78057e36.gz differ diff --git a/_darcs/patches/20080520130535-84dde-5414005cdbd8d39bb548c75388893c7827f2fb16.gz b/_darcs/patches/20080520130535-84dde-5414005cdbd8d39bb548c75388893c7827f2fb16.gz new file mode 100644 index 0000000000..d6c3248dbf Binary files /dev/null and b/_darcs/patches/20080520130535-84dde-5414005cdbd8d39bb548c75388893c7827f2fb16.gz differ diff --git a/_darcs/patches/20080520132722-84dde-88a619005006dd032ac82c0e27d07c820843ab7e.gz b/_darcs/patches/20080520132722-84dde-88a619005006dd032ac82c0e27d07c820843ab7e.gz new file mode 100644 index 0000000000..585c095d2c Binary files /dev/null and b/_darcs/patches/20080520132722-84dde-88a619005006dd032ac82c0e27d07c820843ab7e.gz differ diff --git a/_darcs/patches/20080520133008-84dde-efc5b05e3576a56dd692f404eb028d867a7981bf.gz b/_darcs/patches/20080520133008-84dde-efc5b05e3576a56dd692f404eb028d867a7981bf.gz new file mode 100644 index 0000000000..dc700daee7 Binary files /dev/null and b/_darcs/patches/20080520133008-84dde-efc5b05e3576a56dd692f404eb028d867a7981bf.gz differ diff --git a/_darcs/patches/20080520133220-84dde-86eed983511b6e529b49212d10338d45d3e7691e.gz b/_darcs/patches/20080520133220-84dde-86eed983511b6e529b49212d10338d45d3e7691e.gz new file mode 100644 index 0000000000..16444d2950 Binary files /dev/null and b/_darcs/patches/20080520133220-84dde-86eed983511b6e529b49212d10338d45d3e7691e.gz differ diff --git a/_darcs/patches/20080520133640-84dde-5fe3c3079d12812fff09834754c3bc5f5610b5eb.gz b/_darcs/patches/20080520133640-84dde-5fe3c3079d12812fff09834754c3bc5f5610b5eb.gz new file mode 100644 index 0000000000..36de3f3746 Binary files /dev/null and b/_darcs/patches/20080520133640-84dde-5fe3c3079d12812fff09834754c3bc5f5610b5eb.gz differ diff --git a/_darcs/patches/20080520133825-84dde-10a3623b12380f12386a8bbbe06cb130902bff8e.gz b/_darcs/patches/20080520133825-84dde-10a3623b12380f12386a8bbbe06cb130902bff8e.gz new file mode 100644 index 0000000000..c8e11c8725 Binary files /dev/null and b/_darcs/patches/20080520133825-84dde-10a3623b12380f12386a8bbbe06cb130902bff8e.gz differ diff --git a/_darcs/patches/20080520134631-84dde-249574ec7e16108cf47f3001c2bc726bdc6f8751.gz b/_darcs/patches/20080520134631-84dde-249574ec7e16108cf47f3001c2bc726bdc6f8751.gz new file mode 100644 index 0000000000..e145f9d116 Binary files /dev/null and b/_darcs/patches/20080520134631-84dde-249574ec7e16108cf47f3001c2bc726bdc6f8751.gz differ diff --git a/_darcs/patches/20080520153629-84dde-bcbde039e19b50b75528e30881eb877c276068ee.gz b/_darcs/patches/20080520153629-84dde-bcbde039e19b50b75528e30881eb877c276068ee.gz new file mode 100644 index 0000000000..aba219a955 Binary files /dev/null and b/_darcs/patches/20080520153629-84dde-bcbde039e19b50b75528e30881eb877c276068ee.gz differ diff --git a/_darcs/patches/20080520171353-84dde-5a04033ee8ef19da25ffa9e5c68d2cb18fc71b04.gz b/_darcs/patches/20080520171353-84dde-5a04033ee8ef19da25ffa9e5c68d2cb18fc71b04.gz new file mode 100644 index 0000000000..79e3fe5cfd Binary files /dev/null and b/_darcs/patches/20080520171353-84dde-5a04033ee8ef19da25ffa9e5c68d2cb18fc71b04.gz differ diff --git a/_darcs/patches/20080520171711-84dde-37d126ca0ccc8658fe2806a8f7f97ee0807783ba.gz b/_darcs/patches/20080520171711-84dde-37d126ca0ccc8658fe2806a8f7f97ee0807783ba.gz new file mode 100644 index 0000000000..b3b26450be Binary files /dev/null and b/_darcs/patches/20080520171711-84dde-37d126ca0ccc8658fe2806a8f7f97ee0807783ba.gz differ diff --git a/_darcs/patches/20080520171809-84dde-629fe4850ab2d3efc5c323f0acee2ebab5f83106.gz b/_darcs/patches/20080520171809-84dde-629fe4850ab2d3efc5c323f0acee2ebab5f83106.gz new file mode 100644 index 0000000000..aefd597670 Binary files /dev/null and b/_darcs/patches/20080520171809-84dde-629fe4850ab2d3efc5c323f0acee2ebab5f83106.gz differ diff --git a/_darcs/patches/20080520172241-84dde-c872445967ab5c3427e7138189be6ad67dbea780.gz b/_darcs/patches/20080520172241-84dde-c872445967ab5c3427e7138189be6ad67dbea780.gz new file mode 100644 index 0000000000..2a8022911a Binary files /dev/null and b/_darcs/patches/20080520172241-84dde-c872445967ab5c3427e7138189be6ad67dbea780.gz differ diff --git a/_darcs/patches/20080520173427-84dde-890b794c42ab3c29c23aa542fee3232fd41463a3.gz b/_darcs/patches/20080520173427-84dde-890b794c42ab3c29c23aa542fee3232fd41463a3.gz new file mode 100644 index 0000000000..bb5f57f87c Binary files /dev/null and b/_darcs/patches/20080520173427-84dde-890b794c42ab3c29c23aa542fee3232fd41463a3.gz differ diff --git a/_darcs/patches/20080520174759-84dde-7206aeef3246b2304d463b121a6b17c7f3f2f6d5.gz b/_darcs/patches/20080520174759-84dde-7206aeef3246b2304d463b121a6b17c7f3f2f6d5.gz new file mode 100644 index 0000000000..6c0f0d2a37 Binary files /dev/null and b/_darcs/patches/20080520174759-84dde-7206aeef3246b2304d463b121a6b17c7f3f2f6d5.gz differ diff --git a/_darcs/patches/20080520175105-84dde-0f08b19d42ed6b5484ef763c3f6c819ae0156d6f.gz b/_darcs/patches/20080520175105-84dde-0f08b19d42ed6b5484ef763c3f6c819ae0156d6f.gz new file mode 100644 index 0000000000..d501f430fa Binary files /dev/null and b/_darcs/patches/20080520175105-84dde-0f08b19d42ed6b5484ef763c3f6c819ae0156d6f.gz differ diff --git a/_darcs/patches/20080520175906-84dde-3b4aec544d517b21344fa802ca00026c8362b573.gz b/_darcs/patches/20080520175906-84dde-3b4aec544d517b21344fa802ca00026c8362b573.gz new file mode 100644 index 0000000000..35cb0cafa1 Binary files /dev/null and b/_darcs/patches/20080520175906-84dde-3b4aec544d517b21344fa802ca00026c8362b573.gz differ diff --git a/_darcs/patches/20080520180640-84dde-ab6db22c62371f5b747c39a78d5296e2d2fce2f8.gz b/_darcs/patches/20080520180640-84dde-ab6db22c62371f5b747c39a78d5296e2d2fce2f8.gz new file mode 100644 index 0000000000..a326ae1732 Binary files /dev/null and b/_darcs/patches/20080520180640-84dde-ab6db22c62371f5b747c39a78d5296e2d2fce2f8.gz differ diff --git a/_darcs/patches/20080520180750-84dde-bdf9cca691ea8386ff66a482f4d890ce9e836ca3.gz b/_darcs/patches/20080520180750-84dde-bdf9cca691ea8386ff66a482f4d890ce9e836ca3.gz new file mode 100644 index 0000000000..7dc06ff803 Binary files /dev/null and b/_darcs/patches/20080520180750-84dde-bdf9cca691ea8386ff66a482f4d890ce9e836ca3.gz differ diff --git a/_darcs/patches/20080520181040-84dde-eb1692baeb910ce86abc912e3196bae14ad3fd55.gz b/_darcs/patches/20080520181040-84dde-eb1692baeb910ce86abc912e3196bae14ad3fd55.gz new file mode 100644 index 0000000000..7952f8e9b3 Binary files /dev/null and b/_darcs/patches/20080520181040-84dde-eb1692baeb910ce86abc912e3196bae14ad3fd55.gz differ diff --git a/_darcs/patches/20080520181444-84dde-62756d5b151bfe0e607001aee7f176a6c47d5602.gz b/_darcs/patches/20080520181444-84dde-62756d5b151bfe0e607001aee7f176a6c47d5602.gz new file mode 100644 index 0000000000..49317e5dcf Binary files /dev/null and b/_darcs/patches/20080520181444-84dde-62756d5b151bfe0e607001aee7f176a6c47d5602.gz differ diff --git a/_darcs/patches/20080520181906-84dde-fade37744a568d37bdcce69aa85edbd38370d1f1.gz b/_darcs/patches/20080520181906-84dde-fade37744a568d37bdcce69aa85edbd38370d1f1.gz new file mode 100644 index 0000000000..8ab0084c15 Binary files /dev/null and b/_darcs/patches/20080520181906-84dde-fade37744a568d37bdcce69aa85edbd38370d1f1.gz differ diff --git a/_darcs/patches/20080520185756-84dde-290bc12cddfc1738a96385e95821d466eff11196.gz b/_darcs/patches/20080520185756-84dde-290bc12cddfc1738a96385e95821d466eff11196.gz new file mode 100644 index 0000000000..500d53b61a Binary files /dev/null and b/_darcs/patches/20080520185756-84dde-290bc12cddfc1738a96385e95821d466eff11196.gz differ diff --git a/_darcs/patches/20080520191032-84dde-64197121c93cd4cf3cbc614badff0bd44547f9f9.gz b/_darcs/patches/20080520191032-84dde-64197121c93cd4cf3cbc614badff0bd44547f9f9.gz new file mode 100644 index 0000000000..f86b5522c5 Binary files /dev/null and b/_darcs/patches/20080520191032-84dde-64197121c93cd4cf3cbc614badff0bd44547f9f9.gz differ diff --git a/_darcs/patches/20080520191412-84dde-a607dbe848279639630edd1ab4616d05cc2318d1.gz b/_darcs/patches/20080520191412-84dde-a607dbe848279639630edd1ab4616d05cc2318d1.gz new file mode 100644 index 0000000000..e79d2e3b70 Binary files /dev/null and b/_darcs/patches/20080520191412-84dde-a607dbe848279639630edd1ab4616d05cc2318d1.gz differ diff --git a/_darcs/patches/20080520192634-84dde-2394dbf8767ff886817a5f20f5c9064ea3a1bc79.gz b/_darcs/patches/20080520192634-84dde-2394dbf8767ff886817a5f20f5c9064ea3a1bc79.gz new file mode 100644 index 0000000000..cec02fff6e Binary files /dev/null and b/_darcs/patches/20080520192634-84dde-2394dbf8767ff886817a5f20f5c9064ea3a1bc79.gz differ diff --git a/_darcs/patches/20080520192901-84dde-a292a53eabbfad423f31d7c257875198321e322a.gz b/_darcs/patches/20080520192901-84dde-a292a53eabbfad423f31d7c257875198321e322a.gz new file mode 100644 index 0000000000..6bb53025ab Binary files /dev/null and b/_darcs/patches/20080520192901-84dde-a292a53eabbfad423f31d7c257875198321e322a.gz differ diff --git a/_darcs/patches/20080520193636-84dde-a925a6c351e8f8800122f3e264c88478038bdf2d.gz b/_darcs/patches/20080520193636-84dde-a925a6c351e8f8800122f3e264c88478038bdf2d.gz new file mode 100644 index 0000000000..e1e49ef56c Binary files /dev/null and b/_darcs/patches/20080520193636-84dde-a925a6c351e8f8800122f3e264c88478038bdf2d.gz differ diff --git a/_darcs/patches/20080520194008-84dde-f032df10986fab4b1c421e58deefce56bf77e66a.gz b/_darcs/patches/20080520194008-84dde-f032df10986fab4b1c421e58deefce56bf77e66a.gz new file mode 100644 index 0000000000..4c91b98e10 Binary files /dev/null and b/_darcs/patches/20080520194008-84dde-f032df10986fab4b1c421e58deefce56bf77e66a.gz differ diff --git a/_darcs/patches/20080520194326-84dde-48b25c342111e354759263ccea2e2c9ad8345904.gz b/_darcs/patches/20080520194326-84dde-48b25c342111e354759263ccea2e2c9ad8345904.gz new file mode 100644 index 0000000000..51c70e416f Binary files /dev/null and b/_darcs/patches/20080520194326-84dde-48b25c342111e354759263ccea2e2c9ad8345904.gz differ diff --git a/_darcs/patches/20080520201120-84dde-4b455d4e4854454cc78be8c636a3e0c7f730b93a.gz b/_darcs/patches/20080520201120-84dde-4b455d4e4854454cc78be8c636a3e0c7f730b93a.gz new file mode 100644 index 0000000000..892f9301f0 Binary files /dev/null and b/_darcs/patches/20080520201120-84dde-4b455d4e4854454cc78be8c636a3e0c7f730b93a.gz differ diff --git a/_darcs/patches/20080520201440-84dde-ce245ba4f2df693ca76a7378c001eb7645489bef.gz b/_darcs/patches/20080520201440-84dde-ce245ba4f2df693ca76a7378c001eb7645489bef.gz new file mode 100644 index 0000000000..b09e9ffd01 Binary files /dev/null and b/_darcs/patches/20080520201440-84dde-ce245ba4f2df693ca76a7378c001eb7645489bef.gz differ diff --git a/_darcs/patches/20080520201738-84dde-8f2591a10e1a917c869c1f50eef28de7cf4b66c2.gz b/_darcs/patches/20080520201738-84dde-8f2591a10e1a917c869c1f50eef28de7cf4b66c2.gz new file mode 100644 index 0000000000..dac0feed9d Binary files /dev/null and b/_darcs/patches/20080520201738-84dde-8f2591a10e1a917c869c1f50eef28de7cf4b66c2.gz differ diff --git a/_darcs/patches/20080520202500-84dde-a4bb2b7c64122805a73c157f34acc8849e2421d2.gz b/_darcs/patches/20080520202500-84dde-a4bb2b7c64122805a73c157f34acc8849e2421d2.gz new file mode 100644 index 0000000000..d72afc980d Binary files /dev/null and b/_darcs/patches/20080520202500-84dde-a4bb2b7c64122805a73c157f34acc8849e2421d2.gz differ diff --git a/_darcs/patches/20080520202747-84dde-d0c7a1ac57b8caab5498978cc8108e92243e22fb.gz b/_darcs/patches/20080520202747-84dde-d0c7a1ac57b8caab5498978cc8108e92243e22fb.gz new file mode 100644 index 0000000000..42d3aebeb5 Binary files /dev/null and b/_darcs/patches/20080520202747-84dde-d0c7a1ac57b8caab5498978cc8108e92243e22fb.gz differ diff --git a/_darcs/patches/20080520203002-84dde-13b54cb7fe55641b735833d5c4a29349bf913c5e.gz b/_darcs/patches/20080520203002-84dde-13b54cb7fe55641b735833d5c4a29349bf913c5e.gz new file mode 100644 index 0000000000..dd2ead9909 Binary files /dev/null and b/_darcs/patches/20080520203002-84dde-13b54cb7fe55641b735833d5c4a29349bf913c5e.gz differ diff --git a/_darcs/patches/20080520204259-84dde-46759945569225f25128ed4d18b635ecce3ba1ea.gz b/_darcs/patches/20080520204259-84dde-46759945569225f25128ed4d18b635ecce3ba1ea.gz new file mode 100644 index 0000000000..839d9aef41 Binary files /dev/null and b/_darcs/patches/20080520204259-84dde-46759945569225f25128ed4d18b635ecce3ba1ea.gz differ diff --git a/_darcs/patches/20080520204639-84dde-b97420b0d024772c5c9e51c7b55809977aa71870.gz b/_darcs/patches/20080520204639-84dde-b97420b0d024772c5c9e51c7b55809977aa71870.gz new file mode 100644 index 0000000000..e4a44d4e76 Binary files /dev/null and b/_darcs/patches/20080520204639-84dde-b97420b0d024772c5c9e51c7b55809977aa71870.gz differ diff --git a/_darcs/patches/20080520205152-84dde-4261d3d07e172a365e383f75c646d46cdbfaeecb.gz b/_darcs/patches/20080520205152-84dde-4261d3d07e172a365e383f75c646d46cdbfaeecb.gz new file mode 100644 index 0000000000..c183fad7ed Binary files /dev/null and b/_darcs/patches/20080520205152-84dde-4261d3d07e172a365e383f75c646d46cdbfaeecb.gz differ diff --git a/_darcs/patches/20080520205756-84dde-1ee1cbaae42b5a0cb9c684849e43a7ffc1338f82.gz b/_darcs/patches/20080520205756-84dde-1ee1cbaae42b5a0cb9c684849e43a7ffc1338f82.gz new file mode 100644 index 0000000000..f620de88b9 Binary files /dev/null and b/_darcs/patches/20080520205756-84dde-1ee1cbaae42b5a0cb9c684849e43a7ffc1338f82.gz differ diff --git a/_darcs/patches/20080520210119-84dde-a9b74a933bd45b2e6b2f96a53a1be55caa0f7912.gz b/_darcs/patches/20080520210119-84dde-a9b74a933bd45b2e6b2f96a53a1be55caa0f7912.gz new file mode 100644 index 0000000000..cd738bb3e8 Binary files /dev/null and b/_darcs/patches/20080520210119-84dde-a9b74a933bd45b2e6b2f96a53a1be55caa0f7912.gz differ diff --git a/_darcs/patches/20080520210437-84dde-1a8472f5b5cdde042975d669b0fdca5d6984f330.gz b/_darcs/patches/20080520210437-84dde-1a8472f5b5cdde042975d669b0fdca5d6984f330.gz new file mode 100644 index 0000000000..1677f926d4 Binary files /dev/null and b/_darcs/patches/20080520210437-84dde-1a8472f5b5cdde042975d669b0fdca5d6984f330.gz differ diff --git a/_darcs/patches/20080520211945-84dde-06c9f0884b3dba3e01fe7e0d71662da162c34418.gz b/_darcs/patches/20080520211945-84dde-06c9f0884b3dba3e01fe7e0d71662da162c34418.gz new file mode 100644 index 0000000000..879c772dd2 Binary files /dev/null and b/_darcs/patches/20080520211945-84dde-06c9f0884b3dba3e01fe7e0d71662da162c34418.gz differ diff --git a/_darcs/patches/20080520212319-84dde-27601a4e11dd6a34834f4689c316dae594d8d7e8.gz b/_darcs/patches/20080520212319-84dde-27601a4e11dd6a34834f4689c316dae594d8d7e8.gz new file mode 100644 index 0000000000..a1edbaa04a Binary files /dev/null and b/_darcs/patches/20080520212319-84dde-27601a4e11dd6a34834f4689c316dae594d8d7e8.gz differ diff --git a/_darcs/patches/20080521110253-84dde-e8d6f62225bb56f5e08b28b35d23ccfbe56984fd.gz b/_darcs/patches/20080521110253-84dde-e8d6f62225bb56f5e08b28b35d23ccfbe56984fd.gz new file mode 100644 index 0000000000..00c70b0fe4 Binary files /dev/null and b/_darcs/patches/20080521110253-84dde-e8d6f62225bb56f5e08b28b35d23ccfbe56984fd.gz differ diff --git a/_darcs/patches/20080521112707-84dde-38e27199b977ae81171b8391fbdb93ebb54494f9.gz b/_darcs/patches/20080521112707-84dde-38e27199b977ae81171b8391fbdb93ebb54494f9.gz new file mode 100644 index 0000000000..a02cdd32df Binary files /dev/null and b/_darcs/patches/20080521112707-84dde-38e27199b977ae81171b8391fbdb93ebb54494f9.gz differ diff --git a/_darcs/patches/20080521114624-84dde-c881b9be27b797d98c004d549d5d42f0e84e1cf9.gz b/_darcs/patches/20080521114624-84dde-c881b9be27b797d98c004d549d5d42f0e84e1cf9.gz new file mode 100644 index 0000000000..ba07c57155 Binary files /dev/null and b/_darcs/patches/20080521114624-84dde-c881b9be27b797d98c004d549d5d42f0e84e1cf9.gz differ diff --git a/_darcs/patches/20080521115727-84dde-73b58873e08c936139bd63cffab0c30883c9f8a5.gz b/_darcs/patches/20080521115727-84dde-73b58873e08c936139bd63cffab0c30883c9f8a5.gz new file mode 100644 index 0000000000..059e0a22f9 Binary files /dev/null and b/_darcs/patches/20080521115727-84dde-73b58873e08c936139bd63cffab0c30883c9f8a5.gz differ diff --git a/_darcs/patches/20080521121307-84dde-1a2908c4bb85e9e9e55524f591ba02d38c8ecbc2.gz b/_darcs/patches/20080521121307-84dde-1a2908c4bb85e9e9e55524f591ba02d38c8ecbc2.gz new file mode 100644 index 0000000000..98778dea21 Binary files /dev/null and b/_darcs/patches/20080521121307-84dde-1a2908c4bb85e9e9e55524f591ba02d38c8ecbc2.gz differ diff --git a/_darcs/patches/20080521122604-84dde-bfcfe7b2a254f19ce56054f6e4c80317ed8aaf86.gz b/_darcs/patches/20080521122604-84dde-bfcfe7b2a254f19ce56054f6e4c80317ed8aaf86.gz new file mode 100644 index 0000000000..f7c4ecc885 Binary files /dev/null and b/_darcs/patches/20080521122604-84dde-bfcfe7b2a254f19ce56054f6e4c80317ed8aaf86.gz differ diff --git a/_darcs/patches/20080521123106-84dde-2ad51d79df069cdba4102a4545640260bf5aa8b1.gz b/_darcs/patches/20080521123106-84dde-2ad51d79df069cdba4102a4545640260bf5aa8b1.gz new file mode 100644 index 0000000000..fbdc5e8cb4 Binary files /dev/null and b/_darcs/patches/20080521123106-84dde-2ad51d79df069cdba4102a4545640260bf5aa8b1.gz differ diff --git a/_darcs/patches/20080521133951-84dde-9d7ebbcc90086e94d1b48b33dfadcc9169f0f183.gz b/_darcs/patches/20080521133951-84dde-9d7ebbcc90086e94d1b48b33dfadcc9169f0f183.gz new file mode 100644 index 0000000000..682dc06083 Binary files /dev/null and b/_darcs/patches/20080521133951-84dde-9d7ebbcc90086e94d1b48b33dfadcc9169f0f183.gz differ diff --git a/_darcs/patches/20080521134849-84dde-7201729e692bccfc9649fb30a1d21a47a5eb4259.gz b/_darcs/patches/20080521134849-84dde-7201729e692bccfc9649fb30a1d21a47a5eb4259.gz new file mode 100644 index 0000000000..d872efa109 Binary files /dev/null and b/_darcs/patches/20080521134849-84dde-7201729e692bccfc9649fb30a1d21a47a5eb4259.gz differ diff --git a/_darcs/patches/20080521143351-84dde-d191761c399d7f014b990585c21e916e887b3401.gz b/_darcs/patches/20080521143351-84dde-d191761c399d7f014b990585c21e916e887b3401.gz new file mode 100644 index 0000000000..53e6b57baf Binary files /dev/null and b/_darcs/patches/20080521143351-84dde-d191761c399d7f014b990585c21e916e887b3401.gz differ diff --git a/_darcs/patches/20080521145916-84dde-4a5e04edb1bdcdb5e33bed7497dcf93be88636f8.gz b/_darcs/patches/20080521145916-84dde-4a5e04edb1bdcdb5e33bed7497dcf93be88636f8.gz new file mode 100644 index 0000000000..8d5a8f2aa5 Binary files /dev/null and b/_darcs/patches/20080521145916-84dde-4a5e04edb1bdcdb5e33bed7497dcf93be88636f8.gz differ diff --git a/_darcs/patches/20080521151227-84dde-a4fdacd42dc9be7aa83646f589942931542da73f.gz b/_darcs/patches/20080521151227-84dde-a4fdacd42dc9be7aa83646f589942931542da73f.gz new file mode 100644 index 0000000000..63b7eb7a7b Binary files /dev/null and b/_darcs/patches/20080521151227-84dde-a4fdacd42dc9be7aa83646f589942931542da73f.gz differ diff --git a/_darcs/patches/20080521152404-84dde-bc5a2121ca9acddca9ed43c07935f713cf5c0b8e.gz b/_darcs/patches/20080521152404-84dde-bc5a2121ca9acddca9ed43c07935f713cf5c0b8e.gz new file mode 100644 index 0000000000..20a61fa0af Binary files /dev/null and b/_darcs/patches/20080521152404-84dde-bc5a2121ca9acddca9ed43c07935f713cf5c0b8e.gz differ diff --git a/_darcs/patches/20080521153652-84dde-cf442ce24e278fc7c6b072785a8d0677bbc63e85.gz b/_darcs/patches/20080521153652-84dde-cf442ce24e278fc7c6b072785a8d0677bbc63e85.gz new file mode 100644 index 0000000000..8485261508 Binary files /dev/null and b/_darcs/patches/20080521153652-84dde-cf442ce24e278fc7c6b072785a8d0677bbc63e85.gz differ diff --git a/_darcs/patches/20080521154234-84dde-e83305636b6bc2bb158db8588838c8b62b1b7af0.gz b/_darcs/patches/20080521154234-84dde-e83305636b6bc2bb158db8588838c8b62b1b7af0.gz new file mode 100644 index 0000000000..785901e90f Binary files /dev/null and b/_darcs/patches/20080521154234-84dde-e83305636b6bc2bb158db8588838c8b62b1b7af0.gz differ diff --git a/_darcs/patches/20080521155448-84dde-0e71fe5dccea49162911f80c65cd1e2a46043b14.gz b/_darcs/patches/20080521155448-84dde-0e71fe5dccea49162911f80c65cd1e2a46043b14.gz new file mode 100644 index 0000000000..e00cb7f378 Binary files /dev/null and b/_darcs/patches/20080521155448-84dde-0e71fe5dccea49162911f80c65cd1e2a46043b14.gz differ diff --git a/_darcs/patches/20080521155611-84dde-9e661052d5d2faaa1601c7e023ae086cbf5e3ca1.gz b/_darcs/patches/20080521155611-84dde-9e661052d5d2faaa1601c7e023ae086cbf5e3ca1.gz new file mode 100644 index 0000000000..becd48359a Binary files /dev/null and b/_darcs/patches/20080521155611-84dde-9e661052d5d2faaa1601c7e023ae086cbf5e3ca1.gz differ diff --git a/_darcs/patches/20080521155849-84dde-97b8533a4c70f8f2494632bbb3044bb103270098.gz b/_darcs/patches/20080521155849-84dde-97b8533a4c70f8f2494632bbb3044bb103270098.gz new file mode 100644 index 0000000000..250074e014 Binary files /dev/null and b/_darcs/patches/20080521155849-84dde-97b8533a4c70f8f2494632bbb3044bb103270098.gz differ diff --git a/_darcs/patches/20080521183645-84dde-45d943f0d2b784aac372244fcf7d7e62143a76cf.gz b/_darcs/patches/20080521183645-84dde-45d943f0d2b784aac372244fcf7d7e62143a76cf.gz new file mode 100644 index 0000000000..b66cd0b967 Binary files /dev/null and b/_darcs/patches/20080521183645-84dde-45d943f0d2b784aac372244fcf7d7e62143a76cf.gz differ diff --git a/_darcs/patches/20080521185602-84dde-9e058c34c251d96cf557c1dd459523aa434bed79.gz b/_darcs/patches/20080521185602-84dde-9e058c34c251d96cf557c1dd459523aa434bed79.gz new file mode 100644 index 0000000000..9081dcd50a Binary files /dev/null and b/_darcs/patches/20080521185602-84dde-9e058c34c251d96cf557c1dd459523aa434bed79.gz differ diff --git a/_darcs/patches/20080521190640-84dde-04fc00048b044474488e7774053674231c96e355.gz b/_darcs/patches/20080521190640-84dde-04fc00048b044474488e7774053674231c96e355.gz new file mode 100644 index 0000000000..bb943da794 Binary files /dev/null and b/_darcs/patches/20080521190640-84dde-04fc00048b044474488e7774053674231c96e355.gz differ diff --git a/_darcs/patches/20080521191135-84dde-11f89c88ef526ff41bfc1d0d3bfe774f5796c2da.gz b/_darcs/patches/20080521191135-84dde-11f89c88ef526ff41bfc1d0d3bfe774f5796c2da.gz new file mode 100644 index 0000000000..7591ccb589 Binary files /dev/null and b/_darcs/patches/20080521191135-84dde-11f89c88ef526ff41bfc1d0d3bfe774f5796c2da.gz differ diff --git a/_darcs/patches/20080521192048-84dde-45745601b743798b205c56a7d7f018d8b020275e.gz b/_darcs/patches/20080521192048-84dde-45745601b743798b205c56a7d7f018d8b020275e.gz new file mode 100644 index 0000000000..5d4f993768 Binary files /dev/null and b/_darcs/patches/20080521192048-84dde-45745601b743798b205c56a7d7f018d8b020275e.gz differ diff --git a/_darcs/patches/20080521192912-84dde-4bea2a463bfb357b5688e0f8faccac622770ac95.gz b/_darcs/patches/20080521192912-84dde-4bea2a463bfb357b5688e0f8faccac622770ac95.gz new file mode 100644 index 0000000000..087876651f Binary files /dev/null and b/_darcs/patches/20080521192912-84dde-4bea2a463bfb357b5688e0f8faccac622770ac95.gz differ diff --git a/_darcs/patches/20080521193452-84dde-a1553941833cf3f11c53a6f493ad2dae975cc168.gz b/_darcs/patches/20080521193452-84dde-a1553941833cf3f11c53a6f493ad2dae975cc168.gz new file mode 100644 index 0000000000..54d3b9e620 Binary files /dev/null and b/_darcs/patches/20080521193452-84dde-a1553941833cf3f11c53a6f493ad2dae975cc168.gz differ diff --git a/_darcs/patches/20080521194238-84dde-725c85aa8c24f9160649ee1fa65aab7bd051ae20.gz b/_darcs/patches/20080521194238-84dde-725c85aa8c24f9160649ee1fa65aab7bd051ae20.gz new file mode 100644 index 0000000000..01b2b65731 Binary files /dev/null and b/_darcs/patches/20080521194238-84dde-725c85aa8c24f9160649ee1fa65aab7bd051ae20.gz differ diff --git a/_darcs/patches/20080522103630-84dde-4f6d10b6e6efff91a53c4af735040995ae947211.gz b/_darcs/patches/20080522103630-84dde-4f6d10b6e6efff91a53c4af735040995ae947211.gz new file mode 100644 index 0000000000..b2ac5f5c82 Binary files /dev/null and b/_darcs/patches/20080522103630-84dde-4f6d10b6e6efff91a53c4af735040995ae947211.gz differ diff --git a/_darcs/patches/20080522112954-84dde-aa5087977298f5169148383e82e22241e613b1f2.gz b/_darcs/patches/20080522112954-84dde-aa5087977298f5169148383e82e22241e613b1f2.gz new file mode 100644 index 0000000000..295681d117 Binary files /dev/null and b/_darcs/patches/20080522112954-84dde-aa5087977298f5169148383e82e22241e613b1f2.gz differ diff --git a/_darcs/patches/20080522114152-84dde-7e9b6f465829fc71391613c93df112a7956deffc.gz b/_darcs/patches/20080522114152-84dde-7e9b6f465829fc71391613c93df112a7956deffc.gz new file mode 100644 index 0000000000..1618ffc1d4 Binary files /dev/null and b/_darcs/patches/20080522114152-84dde-7e9b6f465829fc71391613c93df112a7956deffc.gz differ diff --git a/_darcs/patches/20080522114839-84dde-bdf5f244766b198932a068d6c80a667943a03f54.gz b/_darcs/patches/20080522114839-84dde-bdf5f244766b198932a068d6c80a667943a03f54.gz new file mode 100644 index 0000000000..a7bb562341 Binary files /dev/null and b/_darcs/patches/20080522114839-84dde-bdf5f244766b198932a068d6c80a667943a03f54.gz differ diff --git a/_darcs/patches/20080522172006-84dde-060372ec90444faf0e3453229cfd33aceaf28e4a.gz b/_darcs/patches/20080522172006-84dde-060372ec90444faf0e3453229cfd33aceaf28e4a.gz new file mode 100644 index 0000000000..5d94763dbd Binary files /dev/null and b/_darcs/patches/20080522172006-84dde-060372ec90444faf0e3453229cfd33aceaf28e4a.gz differ diff --git a/_darcs/patches/20080522172530-84dde-f2c7db710bfd877d83d9162c0698bddd709a455c.gz b/_darcs/patches/20080522172530-84dde-f2c7db710bfd877d83d9162c0698bddd709a455c.gz new file mode 100644 index 0000000000..d67dc188f3 Binary files /dev/null and b/_darcs/patches/20080522172530-84dde-f2c7db710bfd877d83d9162c0698bddd709a455c.gz differ diff --git a/_darcs/patches/20080522172623-84dde-81f0da83f977503dbeb718b9c9c8017fb6479f04.gz b/_darcs/patches/20080522172623-84dde-81f0da83f977503dbeb718b9c9c8017fb6479f04.gz new file mode 100644 index 0000000000..122be2d792 Binary files /dev/null and b/_darcs/patches/20080522172623-84dde-81f0da83f977503dbeb718b9c9c8017fb6479f04.gz differ diff --git a/_darcs/patches/20080522183421-84dde-fe46f32e4050f2c4b6c850334103007ed7feabf7.gz b/_darcs/patches/20080522183421-84dde-fe46f32e4050f2c4b6c850334103007ed7feabf7.gz new file mode 100644 index 0000000000..4d3dea3988 Binary files /dev/null and b/_darcs/patches/20080522183421-84dde-fe46f32e4050f2c4b6c850334103007ed7feabf7.gz differ diff --git a/_darcs/patches/20080522184027-84dde-f6e53502335b5cd14bc1a2323b3f3eeb99b33cd4.gz b/_darcs/patches/20080522184027-84dde-f6e53502335b5cd14bc1a2323b3f3eeb99b33cd4.gz new file mode 100644 index 0000000000..f28a1bfa23 Binary files /dev/null and b/_darcs/patches/20080522184027-84dde-f6e53502335b5cd14bc1a2323b3f3eeb99b33cd4.gz differ diff --git a/_darcs/patches/20080522184109-84dde-0d13fc6890f85613554f5dd64b1baa67bbcaa8f6.gz b/_darcs/patches/20080522184109-84dde-0d13fc6890f85613554f5dd64b1baa67bbcaa8f6.gz new file mode 100644 index 0000000000..0e12b78f69 Binary files /dev/null and b/_darcs/patches/20080522184109-84dde-0d13fc6890f85613554f5dd64b1baa67bbcaa8f6.gz differ diff --git a/_darcs/patches/20080522184434-84dde-0d698f3e34301c2a5600ce5e828db4402d070808.gz b/_darcs/patches/20080522184434-84dde-0d698f3e34301c2a5600ce5e828db4402d070808.gz new file mode 100644 index 0000000000..f3d91cb7dd Binary files /dev/null and b/_darcs/patches/20080522184434-84dde-0d698f3e34301c2a5600ce5e828db4402d070808.gz differ diff --git a/_darcs/patches/20080522185500-84dde-39a66d36d2c80ff57e2ab2d0274548770c4d06f7.gz b/_darcs/patches/20080522185500-84dde-39a66d36d2c80ff57e2ab2d0274548770c4d06f7.gz new file mode 100644 index 0000000000..460dfbbc1b Binary files /dev/null and b/_darcs/patches/20080522185500-84dde-39a66d36d2c80ff57e2ab2d0274548770c4d06f7.gz differ diff --git a/_darcs/patches/20080522191028-84dde-802a85a8838bfe04347c172dc7c7df51367e11e6.gz b/_darcs/patches/20080522191028-84dde-802a85a8838bfe04347c172dc7c7df51367e11e6.gz new file mode 100644 index 0000000000..5536badc7c Binary files /dev/null and b/_darcs/patches/20080522191028-84dde-802a85a8838bfe04347c172dc7c7df51367e11e6.gz differ diff --git a/_darcs/patches/20080522191436-84dde-a24bd6fa5e9d5fc9af03d64d199ad827c8eb38ec.gz b/_darcs/patches/20080522191436-84dde-a24bd6fa5e9d5fc9af03d64d199ad827c8eb38ec.gz new file mode 100644 index 0000000000..0c409ac011 Binary files /dev/null and b/_darcs/patches/20080522191436-84dde-a24bd6fa5e9d5fc9af03d64d199ad827c8eb38ec.gz differ diff --git a/_darcs/patches/20080526112700-84dde-b1800fb4a5ab830be065e736d2a74b742b7eb0f6.gz b/_darcs/patches/20080526112700-84dde-b1800fb4a5ab830be065e736d2a74b742b7eb0f6.gz new file mode 100644 index 0000000000..9df7874f8b Binary files /dev/null and b/_darcs/patches/20080526112700-84dde-b1800fb4a5ab830be065e736d2a74b742b7eb0f6.gz differ diff --git a/_darcs/patches/20080526130328-84dde-1c31294e251f22d197be95fcf113d2e05b2d6219.gz b/_darcs/patches/20080526130328-84dde-1c31294e251f22d197be95fcf113d2e05b2d6219.gz new file mode 100644 index 0000000000..cf4d8ba139 Binary files /dev/null and b/_darcs/patches/20080526130328-84dde-1c31294e251f22d197be95fcf113d2e05b2d6219.gz differ diff --git a/_darcs/patches/20080526131551-84dde-ab31c6cbfe2bce62aa1573ad9be9a916984e37b3.gz b/_darcs/patches/20080526131551-84dde-ab31c6cbfe2bce62aa1573ad9be9a916984e37b3.gz new file mode 100644 index 0000000000..978cb44503 Binary files /dev/null and b/_darcs/patches/20080526131551-84dde-ab31c6cbfe2bce62aa1573ad9be9a916984e37b3.gz differ diff --git a/_darcs/patches/20080526131953-84dde-95770739bc0c5ea45efbc8b831c11448ea5d4b32.gz b/_darcs/patches/20080526131953-84dde-95770739bc0c5ea45efbc8b831c11448ea5d4b32.gz new file mode 100644 index 0000000000..35930045f7 Binary files /dev/null and b/_darcs/patches/20080526131953-84dde-95770739bc0c5ea45efbc8b831c11448ea5d4b32.gz differ diff --git a/_darcs/patches/20080526151332-84dde-286a22536e3b9168199200a7226cedd7b26dd073.gz b/_darcs/patches/20080526151332-84dde-286a22536e3b9168199200a7226cedd7b26dd073.gz new file mode 100644 index 0000000000..7185659013 Binary files /dev/null and b/_darcs/patches/20080526151332-84dde-286a22536e3b9168199200a7226cedd7b26dd073.gz differ diff --git a/_darcs/patches/20080527114219-84dde-784ddf4d4650c17bc7a1e3e01219c6948dfc9b3d.gz b/_darcs/patches/20080527114219-84dde-784ddf4d4650c17bc7a1e3e01219c6948dfc9b3d.gz new file mode 100644 index 0000000000..7ae52cc107 Binary files /dev/null and b/_darcs/patches/20080527114219-84dde-784ddf4d4650c17bc7a1e3e01219c6948dfc9b3d.gz differ diff --git a/_darcs/patches/20080527200721-84dde-308c047af2ebc2c4d753c1e1e24af20fef862a7e.gz b/_darcs/patches/20080527200721-84dde-308c047af2ebc2c4d753c1e1e24af20fef862a7e.gz new file mode 100644 index 0000000000..536ab8d7a3 Binary files /dev/null and b/_darcs/patches/20080527200721-84dde-308c047af2ebc2c4d753c1e1e24af20fef862a7e.gz differ diff --git a/_darcs/patches/20080528134804-84dde-994624cc82941094719670f78212c391127cc9a6.gz b/_darcs/patches/20080528134804-84dde-994624cc82941094719670f78212c391127cc9a6.gz new file mode 100644 index 0000000000..3436aa813c Binary files /dev/null and b/_darcs/patches/20080528134804-84dde-994624cc82941094719670f78212c391127cc9a6.gz differ diff --git a/_darcs/patches/20080528140321-84dde-2dbeb6032e845a23bb1adde1cbc1788333b55156.gz b/_darcs/patches/20080528140321-84dde-2dbeb6032e845a23bb1adde1cbc1788333b55156.gz new file mode 100644 index 0000000000..4cacca974a Binary files /dev/null and b/_darcs/patches/20080528140321-84dde-2dbeb6032e845a23bb1adde1cbc1788333b55156.gz differ diff --git a/_darcs/patches/20080528141432-84dde-df546c7e7d79cb753934cdb002859587b7ed2a81.gz b/_darcs/patches/20080528141432-84dde-df546c7e7d79cb753934cdb002859587b7ed2a81.gz new file mode 100644 index 0000000000..8afa4a0d02 Binary files /dev/null and b/_darcs/patches/20080528141432-84dde-df546c7e7d79cb753934cdb002859587b7ed2a81.gz differ diff --git a/_darcs/patches/20080528141555-84dde-deeaf974426d353c6e7573e5c532823001639f36.gz b/_darcs/patches/20080528141555-84dde-deeaf974426d353c6e7573e5c532823001639f36.gz new file mode 100644 index 0000000000..181f73872c Binary files /dev/null and b/_darcs/patches/20080528141555-84dde-deeaf974426d353c6e7573e5c532823001639f36.gz differ diff --git a/_darcs/patches/20080528143030-84dde-c698588b2db9e36a576c402ba685b5d205396948.gz b/_darcs/patches/20080528143030-84dde-c698588b2db9e36a576c402ba685b5d205396948.gz new file mode 100644 index 0000000000..720866407d Binary files /dev/null and b/_darcs/patches/20080528143030-84dde-c698588b2db9e36a576c402ba685b5d205396948.gz differ diff --git a/_darcs/patches/20080528144202-84dde-d0f15e4ad4c840816bfadf3b1b57faecdfd401b2.gz b/_darcs/patches/20080528144202-84dde-d0f15e4ad4c840816bfadf3b1b57faecdfd401b2.gz new file mode 100644 index 0000000000..c93e17bdab Binary files /dev/null and b/_darcs/patches/20080528144202-84dde-d0f15e4ad4c840816bfadf3b1b57faecdfd401b2.gz differ diff --git a/_darcs/patches/20080528164222-84dde-20fa91371bcd0116e8d38bb90e221b3edbc2179a.gz b/_darcs/patches/20080528164222-84dde-20fa91371bcd0116e8d38bb90e221b3edbc2179a.gz new file mode 100644 index 0000000000..bc1f8639bd Binary files /dev/null and b/_darcs/patches/20080528164222-84dde-20fa91371bcd0116e8d38bb90e221b3edbc2179a.gz differ diff --git a/_darcs/patches/20080528170438-84dde-90edcb9248823988f70d8dbedf9a694a7bb732f5.gz b/_darcs/patches/20080528170438-84dde-90edcb9248823988f70d8dbedf9a694a7bb732f5.gz new file mode 100644 index 0000000000..747e16de93 Binary files /dev/null and b/_darcs/patches/20080528170438-84dde-90edcb9248823988f70d8dbedf9a694a7bb732f5.gz differ diff --git a/_darcs/patches/20080528170556-84dde-5dd6fe94b31e2fb4387f0c7e8775122bd5c4965b.gz b/_darcs/patches/20080528170556-84dde-5dd6fe94b31e2fb4387f0c7e8775122bd5c4965b.gz new file mode 100644 index 0000000000..254e424bd2 Binary files /dev/null and b/_darcs/patches/20080528170556-84dde-5dd6fe94b31e2fb4387f0c7e8775122bd5c4965b.gz differ diff --git a/_darcs/patches/20080528170752-84dde-86f5965c108fffe703e62bd42f6bd0eda22f1931.gz b/_darcs/patches/20080528170752-84dde-86f5965c108fffe703e62bd42f6bd0eda22f1931.gz new file mode 100644 index 0000000000..d42cb30b71 Binary files /dev/null and b/_darcs/patches/20080528170752-84dde-86f5965c108fffe703e62bd42f6bd0eda22f1931.gz differ diff --git a/_darcs/patches/20080528171012-84dde-bf66fac5e9ca78881d3d3dfd08d76b22aeb84a2f.gz b/_darcs/patches/20080528171012-84dde-bf66fac5e9ca78881d3d3dfd08d76b22aeb84a2f.gz new file mode 100644 index 0000000000..4324f7ff3a Binary files /dev/null and b/_darcs/patches/20080528171012-84dde-bf66fac5e9ca78881d3d3dfd08d76b22aeb84a2f.gz differ diff --git a/_darcs/patches/20080528171232-84dde-3a8155054dacf2859c5544bfa8bc05c46e2115f7.gz b/_darcs/patches/20080528171232-84dde-3a8155054dacf2859c5544bfa8bc05c46e2115f7.gz new file mode 100644 index 0000000000..6cd8ea4268 Binary files /dev/null and b/_darcs/patches/20080528171232-84dde-3a8155054dacf2859c5544bfa8bc05c46e2115f7.gz differ diff --git a/_darcs/patches/20080528171434-84dde-5e0e37212b9de9809fd40304d31f9c8d08450ed0.gz b/_darcs/patches/20080528171434-84dde-5e0e37212b9de9809fd40304d31f9c8d08450ed0.gz new file mode 100644 index 0000000000..04cd0f6dff Binary files /dev/null and b/_darcs/patches/20080528171434-84dde-5e0e37212b9de9809fd40304d31f9c8d08450ed0.gz differ diff --git a/_darcs/patches/20080528171543-84dde-3a2ef0070d8c6a64bda036db5a1efde185f78b80.gz b/_darcs/patches/20080528171543-84dde-3a2ef0070d8c6a64bda036db5a1efde185f78b80.gz new file mode 100644 index 0000000000..bba18babae Binary files /dev/null and b/_darcs/patches/20080528171543-84dde-3a2ef0070d8c6a64bda036db5a1efde185f78b80.gz differ diff --git a/_darcs/patches/20080528171626-84dde-860eb9185838f11ae7e68d5381ff3d26a0b71829.gz b/_darcs/patches/20080528171626-84dde-860eb9185838f11ae7e68d5381ff3d26a0b71829.gz new file mode 100644 index 0000000000..f627c7d075 Binary files /dev/null and b/_darcs/patches/20080528171626-84dde-860eb9185838f11ae7e68d5381ff3d26a0b71829.gz differ diff --git a/_darcs/patches/20080528171758-84dde-6121afedbce9bbecea09386e347aa3d1c85c8f44.gz b/_darcs/patches/20080528171758-84dde-6121afedbce9bbecea09386e347aa3d1c85c8f44.gz new file mode 100644 index 0000000000..d6b01fb883 Binary files /dev/null and b/_darcs/patches/20080528171758-84dde-6121afedbce9bbecea09386e347aa3d1c85c8f44.gz differ diff --git a/_darcs/patches/20080528171944-84dde-9de7d48ed96a7bd763a1720a472db1e7a7246000.gz b/_darcs/patches/20080528171944-84dde-9de7d48ed96a7bd763a1720a472db1e7a7246000.gz new file mode 100644 index 0000000000..405ea28bca Binary files /dev/null and b/_darcs/patches/20080528171944-84dde-9de7d48ed96a7bd763a1720a472db1e7a7246000.gz differ diff --git a/_darcs/patches/20080528172041-84dde-afe59aa8a36d72bca5294c9919186b1ab3db268f.gz b/_darcs/patches/20080528172041-84dde-afe59aa8a36d72bca5294c9919186b1ab3db268f.gz new file mode 100644 index 0000000000..b56666ba09 Binary files /dev/null and b/_darcs/patches/20080528172041-84dde-afe59aa8a36d72bca5294c9919186b1ab3db268f.gz differ diff --git a/_darcs/patches/20080528172149-84dde-5ccf267e5b97ad403cf87f4339258f3dda051728.gz b/_darcs/patches/20080528172149-84dde-5ccf267e5b97ad403cf87f4339258f3dda051728.gz new file mode 100644 index 0000000000..c1e50f7774 Binary files /dev/null and b/_darcs/patches/20080528172149-84dde-5ccf267e5b97ad403cf87f4339258f3dda051728.gz differ diff --git a/_darcs/patches/20080528173129-84dde-8f0537b20173afa895aeb76e503d76cc24fdae41.gz b/_darcs/patches/20080528173129-84dde-8f0537b20173afa895aeb76e503d76cc24fdae41.gz new file mode 100644 index 0000000000..b34c2c29ed Binary files /dev/null and b/_darcs/patches/20080528173129-84dde-8f0537b20173afa895aeb76e503d76cc24fdae41.gz differ diff --git a/_darcs/patches/20080528173231-84dde-0fb59cf9ea19f025a2c840b44cf8d337c00231a3.gz b/_darcs/patches/20080528173231-84dde-0fb59cf9ea19f025a2c840b44cf8d337c00231a3.gz new file mode 100644 index 0000000000..69e13e8ee0 Binary files /dev/null and b/_darcs/patches/20080528173231-84dde-0fb59cf9ea19f025a2c840b44cf8d337c00231a3.gz differ diff --git a/_darcs/patches/20080528173417-84dde-033ab1f9a30c1b19c1f2b5a5b6ea652d94c226e7.gz b/_darcs/patches/20080528173417-84dde-033ab1f9a30c1b19c1f2b5a5b6ea652d94c226e7.gz new file mode 100644 index 0000000000..99afe4f104 Binary files /dev/null and b/_darcs/patches/20080528173417-84dde-033ab1f9a30c1b19c1f2b5a5b6ea652d94c226e7.gz differ diff --git a/_darcs/patches/20080528173917-84dde-b623d152de415de3790673b8a4eaafb584b23752.gz b/_darcs/patches/20080528173917-84dde-b623d152de415de3790673b8a4eaafb584b23752.gz new file mode 100644 index 0000000000..802e491c8b Binary files /dev/null and b/_darcs/patches/20080528173917-84dde-b623d152de415de3790673b8a4eaafb584b23752.gz differ diff --git a/_darcs/patches/20080528174247-84dde-8b5e4cf4a750c25164bde2ee54a2178a9107dc11.gz b/_darcs/patches/20080528174247-84dde-8b5e4cf4a750c25164bde2ee54a2178a9107dc11.gz new file mode 100644 index 0000000000..d8d98f7506 Binary files /dev/null and b/_darcs/patches/20080528174247-84dde-8b5e4cf4a750c25164bde2ee54a2178a9107dc11.gz differ diff --git a/_darcs/patches/20080528174412-84dde-4f4e39c1a4ad36dcbf06f022936a91ebf4955c52.gz b/_darcs/patches/20080528174412-84dde-4f4e39c1a4ad36dcbf06f022936a91ebf4955c52.gz new file mode 100644 index 0000000000..3b6cd40991 Binary files /dev/null and b/_darcs/patches/20080528174412-84dde-4f4e39c1a4ad36dcbf06f022936a91ebf4955c52.gz differ diff --git a/_darcs/patches/20080528174621-84dde-41b0575e8a937aa8504a67edde66a8fb84222304.gz b/_darcs/patches/20080528174621-84dde-41b0575e8a937aa8504a67edde66a8fb84222304.gz new file mode 100644 index 0000000000..00f7728b0e Binary files /dev/null and b/_darcs/patches/20080528174621-84dde-41b0575e8a937aa8504a67edde66a8fb84222304.gz differ diff --git a/_darcs/patches/20080528174807-84dde-88318f09f55ec55f5f3c8933943edc7b4504a496.gz b/_darcs/patches/20080528174807-84dde-88318f09f55ec55f5f3c8933943edc7b4504a496.gz new file mode 100644 index 0000000000..3413fd1161 Binary files /dev/null and b/_darcs/patches/20080528174807-84dde-88318f09f55ec55f5f3c8933943edc7b4504a496.gz differ diff --git a/_darcs/patches/20080528174924-84dde-ed785a6704ed3ba402091f7f5539d5ced5756d69.gz b/_darcs/patches/20080528174924-84dde-ed785a6704ed3ba402091f7f5539d5ced5756d69.gz new file mode 100644 index 0000000000..0c87881e93 Binary files /dev/null and b/_darcs/patches/20080528174924-84dde-ed785a6704ed3ba402091f7f5539d5ced5756d69.gz differ diff --git a/_darcs/patches/20080528182707-84dde-5f15e83a1243ec29a890b3b258163d07db5fc329.gz b/_darcs/patches/20080528182707-84dde-5f15e83a1243ec29a890b3b258163d07db5fc329.gz new file mode 100644 index 0000000000..08174c50ce Binary files /dev/null and b/_darcs/patches/20080528182707-84dde-5f15e83a1243ec29a890b3b258163d07db5fc329.gz differ diff --git a/_darcs/patches/20080528183022-84dde-f5362f0284be4969e930d93408bdb9d5dec1488c.gz b/_darcs/patches/20080528183022-84dde-f5362f0284be4969e930d93408bdb9d5dec1488c.gz new file mode 100644 index 0000000000..6062ea17bf Binary files /dev/null and b/_darcs/patches/20080528183022-84dde-f5362f0284be4969e930d93408bdb9d5dec1488c.gz differ diff --git a/_darcs/patches/20080528183709-84dde-f6acf1d61590f2faf1d112fac3d0d0194d648403.gz b/_darcs/patches/20080528183709-84dde-f6acf1d61590f2faf1d112fac3d0d0194d648403.gz new file mode 100644 index 0000000000..c5033f5501 Binary files /dev/null and b/_darcs/patches/20080528183709-84dde-f6acf1d61590f2faf1d112fac3d0d0194d648403.gz differ diff --git a/_darcs/patches/20080528185637-84dde-40919f110bf90de1fb927cacf44f4ab0a7c75475.gz b/_darcs/patches/20080528185637-84dde-40919f110bf90de1fb927cacf44f4ab0a7c75475.gz new file mode 100644 index 0000000000..8f9a75875a Binary files /dev/null and b/_darcs/patches/20080528185637-84dde-40919f110bf90de1fb927cacf44f4ab0a7c75475.gz differ diff --git a/_darcs/patches/20080528193121-84dde-a46435df24aba369a1011feaf5be865795ed6c25.gz b/_darcs/patches/20080528193121-84dde-a46435df24aba369a1011feaf5be865795ed6c25.gz new file mode 100644 index 0000000000..81022b2649 Binary files /dev/null and b/_darcs/patches/20080528193121-84dde-a46435df24aba369a1011feaf5be865795ed6c25.gz differ diff --git a/_darcs/patches/20080529151317-84dde-046fffcfacea163bf14d5a0ee6838581e3a9ebe4.gz b/_darcs/patches/20080529151317-84dde-046fffcfacea163bf14d5a0ee6838581e3a9ebe4.gz new file mode 100644 index 0000000000..29f3b31c70 Binary files /dev/null and b/_darcs/patches/20080529151317-84dde-046fffcfacea163bf14d5a0ee6838581e3a9ebe4.gz differ diff --git a/_darcs/patches/20080529151602-84dde-f6bc3c41846d92c94008f721fa5115907fd9a7d3.gz b/_darcs/patches/20080529151602-84dde-f6bc3c41846d92c94008f721fa5115907fd9a7d3.gz new file mode 100644 index 0000000000..b695f2bb6c Binary files /dev/null and b/_darcs/patches/20080529151602-84dde-f6bc3c41846d92c94008f721fa5115907fd9a7d3.gz differ diff --git a/_darcs/patches/20080529152304-84dde-b0b0ea1f919701c2d821d9bf589a30db34dcc015.gz b/_darcs/patches/20080529152304-84dde-b0b0ea1f919701c2d821d9bf589a30db34dcc015.gz new file mode 100644 index 0000000000..75a3dc4be5 Binary files /dev/null and b/_darcs/patches/20080529152304-84dde-b0b0ea1f919701c2d821d9bf589a30db34dcc015.gz differ diff --git a/_darcs/patches/20080529163508-84dde-1213ebe19275ce354b218dbeb5d81f18e6db4769.gz b/_darcs/patches/20080529163508-84dde-1213ebe19275ce354b218dbeb5d81f18e6db4769.gz new file mode 100644 index 0000000000..1358b656bb Binary files /dev/null and b/_darcs/patches/20080529163508-84dde-1213ebe19275ce354b218dbeb5d81f18e6db4769.gz differ diff --git a/_darcs/patches/20080529164139-84dde-85f6b27707af4c2f00f0d62c2fe4e209ab353e57.gz b/_darcs/patches/20080529164139-84dde-85f6b27707af4c2f00f0d62c2fe4e209ab353e57.gz new file mode 100644 index 0000000000..4f9f00f5ac Binary files /dev/null and b/_darcs/patches/20080529164139-84dde-85f6b27707af4c2f00f0d62c2fe4e209ab353e57.gz differ diff --git a/_darcs/patches/20080529164411-84dde-1a54ecf1e6acec0e9a6105b8a7e68af2d1c18846.gz b/_darcs/patches/20080529164411-84dde-1a54ecf1e6acec0e9a6105b8a7e68af2d1c18846.gz new file mode 100644 index 0000000000..0bae5fb05a Binary files /dev/null and b/_darcs/patches/20080529164411-84dde-1a54ecf1e6acec0e9a6105b8a7e68af2d1c18846.gz differ diff --git a/_darcs/patches/20080529170801-84dde-765f70013696c46bee65bf1408ff4a0b379711d7.gz b/_darcs/patches/20080529170801-84dde-765f70013696c46bee65bf1408ff4a0b379711d7.gz new file mode 100644 index 0000000000..af06a16c45 Binary files /dev/null and b/_darcs/patches/20080529170801-84dde-765f70013696c46bee65bf1408ff4a0b379711d7.gz differ diff --git a/_darcs/patches/20080529171604-84dde-63bf0f261fe340df7bfec22a0b64daf2ca42615e.gz b/_darcs/patches/20080529171604-84dde-63bf0f261fe340df7bfec22a0b64daf2ca42615e.gz new file mode 100644 index 0000000000..29b8868830 Binary files /dev/null and b/_darcs/patches/20080529171604-84dde-63bf0f261fe340df7bfec22a0b64daf2ca42615e.gz differ diff --git a/_darcs/patches/20080529171853-84dde-3c7239cfb22c85b67946787e3cabf5a7583a8d4d.gz b/_darcs/patches/20080529171853-84dde-3c7239cfb22c85b67946787e3cabf5a7583a8d4d.gz new file mode 100644 index 0000000000..ffd07db4fd Binary files /dev/null and b/_darcs/patches/20080529171853-84dde-3c7239cfb22c85b67946787e3cabf5a7583a8d4d.gz differ diff --git a/_darcs/patches/20080529172107-84dde-5c4fd44c49340e1ef478e1582776a0310365e479.gz b/_darcs/patches/20080529172107-84dde-5c4fd44c49340e1ef478e1582776a0310365e479.gz new file mode 100644 index 0000000000..423b222159 Binary files /dev/null and b/_darcs/patches/20080529172107-84dde-5c4fd44c49340e1ef478e1582776a0310365e479.gz differ diff --git a/_darcs/patches/20080529172205-84dde-7f4fe045ae9bd93b501087a96dea61914f6eb05f.gz b/_darcs/patches/20080529172205-84dde-7f4fe045ae9bd93b501087a96dea61914f6eb05f.gz new file mode 100644 index 0000000000..5ad1b2d01d Binary files /dev/null and b/_darcs/patches/20080529172205-84dde-7f4fe045ae9bd93b501087a96dea61914f6eb05f.gz differ diff --git a/_darcs/patches/20080529172258-84dde-5c413413103946838aaeed249019f168e8f5b601.gz b/_darcs/patches/20080529172258-84dde-5c413413103946838aaeed249019f168e8f5b601.gz new file mode 100644 index 0000000000..70a3fc392f Binary files /dev/null and b/_darcs/patches/20080529172258-84dde-5c413413103946838aaeed249019f168e8f5b601.gz differ diff --git a/_darcs/patches/20080529172549-84dde-12c79e34baa6a19938350447f5939fb25febea21.gz b/_darcs/patches/20080529172549-84dde-12c79e34baa6a19938350447f5939fb25febea21.gz new file mode 100644 index 0000000000..8dafde0346 Binary files /dev/null and b/_darcs/patches/20080529172549-84dde-12c79e34baa6a19938350447f5939fb25febea21.gz differ diff --git a/_darcs/patches/20080529173234-84dde-7b1e8fa0af993edd74b11f88bdfbc24e970298a7.gz b/_darcs/patches/20080529173234-84dde-7b1e8fa0af993edd74b11f88bdfbc24e970298a7.gz new file mode 100644 index 0000000000..d02c91a5e9 Binary files /dev/null and b/_darcs/patches/20080529173234-84dde-7b1e8fa0af993edd74b11f88bdfbc24e970298a7.gz differ diff --git a/_darcs/patches/20080529173400-84dde-f0883200a6dac50a3d9022cef82816339f9dd84c.gz b/_darcs/patches/20080529173400-84dde-f0883200a6dac50a3d9022cef82816339f9dd84c.gz new file mode 100644 index 0000000000..614c7cb8cd Binary files /dev/null and b/_darcs/patches/20080529173400-84dde-f0883200a6dac50a3d9022cef82816339f9dd84c.gz differ diff --git a/_darcs/patches/20080529173527-84dde-968857bab4df3f26d8d135b00991838aa78210c0.gz b/_darcs/patches/20080529173527-84dde-968857bab4df3f26d8d135b00991838aa78210c0.gz new file mode 100644 index 0000000000..ca7d06f70b Binary files /dev/null and b/_darcs/patches/20080529173527-84dde-968857bab4df3f26d8d135b00991838aa78210c0.gz differ diff --git a/_darcs/patches/20080529173635-84dde-8152ddcd07e094f5478a470f5b1a3ea28ce5421e.gz b/_darcs/patches/20080529173635-84dde-8152ddcd07e094f5478a470f5b1a3ea28ce5421e.gz new file mode 100644 index 0000000000..8470d92928 Binary files /dev/null and b/_darcs/patches/20080529173635-84dde-8152ddcd07e094f5478a470f5b1a3ea28ce5421e.gz differ diff --git a/_darcs/patches/20080529181244-84dde-6b51042c5c92581d8aecfbb83630646afc078793.gz b/_darcs/patches/20080529181244-84dde-6b51042c5c92581d8aecfbb83630646afc078793.gz new file mode 100644 index 0000000000..12c1b1fb1d Binary files /dev/null and b/_darcs/patches/20080529181244-84dde-6b51042c5c92581d8aecfbb83630646afc078793.gz differ diff --git a/_darcs/patches/20080529181321-84dde-ed6ab6e839787cacc82681617b152106150839aa.gz b/_darcs/patches/20080529181321-84dde-ed6ab6e839787cacc82681617b152106150839aa.gz new file mode 100644 index 0000000000..0edb9cdf6c Binary files /dev/null and b/_darcs/patches/20080529181321-84dde-ed6ab6e839787cacc82681617b152106150839aa.gz differ diff --git a/_darcs/patches/20080529181549-84dde-bd4ce6c6101268a95aa95a8727c7aaa96f96cac3.gz b/_darcs/patches/20080529181549-84dde-bd4ce6c6101268a95aa95a8727c7aaa96f96cac3.gz new file mode 100644 index 0000000000..30cee1405e Binary files /dev/null and b/_darcs/patches/20080529181549-84dde-bd4ce6c6101268a95aa95a8727c7aaa96f96cac3.gz differ diff --git a/_darcs/patches/20080529181623-84dde-90c4ce5306cdc9df2696064184aec122083519c8.gz b/_darcs/patches/20080529181623-84dde-90c4ce5306cdc9df2696064184aec122083519c8.gz new file mode 100644 index 0000000000..1e8c203656 Binary files /dev/null and b/_darcs/patches/20080529181623-84dde-90c4ce5306cdc9df2696064184aec122083519c8.gz differ diff --git a/_darcs/patches/20080529181942-84dde-60f2e659d4d67f085e4f8bc9a1c06753cf4b8924.gz b/_darcs/patches/20080529181942-84dde-60f2e659d4d67f085e4f8bc9a1c06753cf4b8924.gz new file mode 100644 index 0000000000..7dee88c84a Binary files /dev/null and b/_darcs/patches/20080529181942-84dde-60f2e659d4d67f085e4f8bc9a1c06753cf4b8924.gz differ diff --git a/_darcs/patches/20080529182026-84dde-b4ac5b6326476e6913683149db32f1ff46283127.gz b/_darcs/patches/20080529182026-84dde-b4ac5b6326476e6913683149db32f1ff46283127.gz new file mode 100644 index 0000000000..1d5b10df88 Binary files /dev/null and b/_darcs/patches/20080529182026-84dde-b4ac5b6326476e6913683149db32f1ff46283127.gz differ diff --git a/_darcs/patches/20080529182725-84dde-aa343a6ecd3c6ac79adcd96198d1f18b6c56cb79.gz b/_darcs/patches/20080529182725-84dde-aa343a6ecd3c6ac79adcd96198d1f18b6c56cb79.gz new file mode 100644 index 0000000000..0cbb308214 Binary files /dev/null and b/_darcs/patches/20080529182725-84dde-aa343a6ecd3c6ac79adcd96198d1f18b6c56cb79.gz differ diff --git a/_darcs/patches/20080529182754-84dde-b5b0d1094b586602e62828995d75d8697ea52cbf.gz b/_darcs/patches/20080529182754-84dde-b5b0d1094b586602e62828995d75d8697ea52cbf.gz new file mode 100644 index 0000000000..5807a94c79 Binary files /dev/null and b/_darcs/patches/20080529182754-84dde-b5b0d1094b586602e62828995d75d8697ea52cbf.gz differ diff --git a/_darcs/patches/20080529190702-84dde-ef753ca1864b13e4c2ae0ebbd683c4f593f2f1f0.gz b/_darcs/patches/20080529190702-84dde-ef753ca1864b13e4c2ae0ebbd683c4f593f2f1f0.gz new file mode 100644 index 0000000000..2cfedfd433 Binary files /dev/null and b/_darcs/patches/20080529190702-84dde-ef753ca1864b13e4c2ae0ebbd683c4f593f2f1f0.gz differ diff --git a/_darcs/patches/20080529190743-84dde-849369c3c48006aaf6fcc523c9a952ea5d5bd999.gz b/_darcs/patches/20080529190743-84dde-849369c3c48006aaf6fcc523c9a952ea5d5bd999.gz new file mode 100644 index 0000000000..03b3d56c38 Binary files /dev/null and b/_darcs/patches/20080529190743-84dde-849369c3c48006aaf6fcc523c9a952ea5d5bd999.gz differ diff --git a/_darcs/patches/20080529192112-84dde-7de629e1d5449bb42539c10ef567e94322f97a38.gz b/_darcs/patches/20080529192112-84dde-7de629e1d5449bb42539c10ef567e94322f97a38.gz new file mode 100644 index 0000000000..07c5a3250c Binary files /dev/null and b/_darcs/patches/20080529192112-84dde-7de629e1d5449bb42539c10ef567e94322f97a38.gz differ diff --git a/_darcs/patches/20080529192510-84dde-eedf578cb3cb06dd019b8a613192adb467cfab4a.gz b/_darcs/patches/20080529192510-84dde-eedf578cb3cb06dd019b8a613192adb467cfab4a.gz new file mode 100644 index 0000000000..82fa111713 Binary files /dev/null and b/_darcs/patches/20080529192510-84dde-eedf578cb3cb06dd019b8a613192adb467cfab4a.gz differ diff --git a/_darcs/patches/20080530142324-84dde-782c9f04f551447514f1557b9e80f8461a17771f.gz b/_darcs/patches/20080530142324-84dde-782c9f04f551447514f1557b9e80f8461a17771f.gz new file mode 100644 index 0000000000..a6554f60e2 Binary files /dev/null and b/_darcs/patches/20080530142324-84dde-782c9f04f551447514f1557b9e80f8461a17771f.gz differ diff --git a/_darcs/patches/20080530162429-84dde-12336814d3a01b4937ab574741fa4987484be62d.gz b/_darcs/patches/20080530162429-84dde-12336814d3a01b4937ab574741fa4987484be62d.gz new file mode 100644 index 0000000000..92b3c7b7f2 Binary files /dev/null and b/_darcs/patches/20080530162429-84dde-12336814d3a01b4937ab574741fa4987484be62d.gz differ diff --git a/_darcs/patches/20080530174310-84dde-1e05966eb48573ced8e73acf3f3b59e7bc4f1170.gz b/_darcs/patches/20080530174310-84dde-1e05966eb48573ced8e73acf3f3b59e7bc4f1170.gz new file mode 100644 index 0000000000..facca2025d Binary files /dev/null and b/_darcs/patches/20080530174310-84dde-1e05966eb48573ced8e73acf3f3b59e7bc4f1170.gz differ diff --git a/_darcs/patches/20080530174616-84dde-8a7c90c83c04cd07d6dcbe2795dde03dbc63c0f2.gz b/_darcs/patches/20080530174616-84dde-8a7c90c83c04cd07d6dcbe2795dde03dbc63c0f2.gz new file mode 100644 index 0000000000..3e17a55f84 Binary files /dev/null and b/_darcs/patches/20080530174616-84dde-8a7c90c83c04cd07d6dcbe2795dde03dbc63c0f2.gz differ diff --git a/_darcs/patches/20080530175055-84dde-f0e231b4efc30a59d6111b749eb8340116be9f92.gz b/_darcs/patches/20080530175055-84dde-f0e231b4efc30a59d6111b749eb8340116be9f92.gz new file mode 100644 index 0000000000..60e5a90305 Binary files /dev/null and b/_darcs/patches/20080530175055-84dde-f0e231b4efc30a59d6111b749eb8340116be9f92.gz differ diff --git a/_darcs/patches/20080530175235-84dde-0eda227cdd5a8c3b5e20ba12dbedbfc9aba269f3.gz b/_darcs/patches/20080530175235-84dde-0eda227cdd5a8c3b5e20ba12dbedbfc9aba269f3.gz new file mode 100644 index 0000000000..60f85b8725 Binary files /dev/null and b/_darcs/patches/20080530175235-84dde-0eda227cdd5a8c3b5e20ba12dbedbfc9aba269f3.gz differ diff --git a/_darcs/patches/20080530175436-84dde-e55601349cf83ea504924ea3d3733cccf75838e4.gz b/_darcs/patches/20080530175436-84dde-e55601349cf83ea504924ea3d3733cccf75838e4.gz new file mode 100644 index 0000000000..1d876b6018 Binary files /dev/null and b/_darcs/patches/20080530175436-84dde-e55601349cf83ea504924ea3d3733cccf75838e4.gz differ diff --git a/_darcs/patches/20080530181029-84dde-58de78ad1bef7a5c540a0315470bc24ddc59b04b.gz b/_darcs/patches/20080530181029-84dde-58de78ad1bef7a5c540a0315470bc24ddc59b04b.gz new file mode 100644 index 0000000000..d151545bda Binary files /dev/null and b/_darcs/patches/20080530181029-84dde-58de78ad1bef7a5c540a0315470bc24ddc59b04b.gz differ diff --git a/_darcs/patches/20080530181103-84dde-55eb7fce80ae6a11639ec9748c0d02f7f72cbc4d.gz b/_darcs/patches/20080530181103-84dde-55eb7fce80ae6a11639ec9748c0d02f7f72cbc4d.gz new file mode 100644 index 0000000000..ce1154663f Binary files /dev/null and b/_darcs/patches/20080530181103-84dde-55eb7fce80ae6a11639ec9748c0d02f7f72cbc4d.gz differ diff --git a/_darcs/patches/20080530182230-84dde-b9b6f515affcd245abb5e199de02a8891138ff2a.gz b/_darcs/patches/20080530182230-84dde-b9b6f515affcd245abb5e199de02a8891138ff2a.gz new file mode 100644 index 0000000000..02f56a8977 Binary files /dev/null and b/_darcs/patches/20080530182230-84dde-b9b6f515affcd245abb5e199de02a8891138ff2a.gz differ diff --git a/_darcs/patches/20080530183528-84dde-c69c5d130c5951eec55613fc7ec7526c1fb13cfb.gz b/_darcs/patches/20080530183528-84dde-c69c5d130c5951eec55613fc7ec7526c1fb13cfb.gz new file mode 100644 index 0000000000..08c20c9a25 Binary files /dev/null and b/_darcs/patches/20080530183528-84dde-c69c5d130c5951eec55613fc7ec7526c1fb13cfb.gz differ diff --git a/_darcs/patches/20080530184105-84dde-6d55e2bf320ea5b71d657edb756c4ea330bd438f.gz b/_darcs/patches/20080530184105-84dde-6d55e2bf320ea5b71d657edb756c4ea330bd438f.gz new file mode 100644 index 0000000000..5c48455757 Binary files /dev/null and b/_darcs/patches/20080530184105-84dde-6d55e2bf320ea5b71d657edb756c4ea330bd438f.gz differ diff --git a/_darcs/patches/20080530184712-84dde-bcea123d79aff11585eacee8b85932543acfe072.gz b/_darcs/patches/20080530184712-84dde-bcea123d79aff11585eacee8b85932543acfe072.gz new file mode 100644 index 0000000000..bec6f90997 Binary files /dev/null and b/_darcs/patches/20080530184712-84dde-bcea123d79aff11585eacee8b85932543acfe072.gz differ diff --git a/_darcs/patches/20080530184925-84dde-5888985ad083a6cff49c2efe1679e1246735608a.gz b/_darcs/patches/20080530184925-84dde-5888985ad083a6cff49c2efe1679e1246735608a.gz new file mode 100644 index 0000000000..65cbbebbc0 Binary files /dev/null and b/_darcs/patches/20080530184925-84dde-5888985ad083a6cff49c2efe1679e1246735608a.gz differ diff --git a/_darcs/patches/20080530185015-84dde-8b4a2f735a530f20a3fd8a2b07b2cc4f038e3846.gz b/_darcs/patches/20080530185015-84dde-8b4a2f735a530f20a3fd8a2b07b2cc4f038e3846.gz new file mode 100644 index 0000000000..5d59121a35 Binary files /dev/null and b/_darcs/patches/20080530185015-84dde-8b4a2f735a530f20a3fd8a2b07b2cc4f038e3846.gz differ diff --git a/_darcs/patches/20080530185343-84dde-90c12188656a29b0f34d8ffa27927f0f664fbd74.gz b/_darcs/patches/20080530185343-84dde-90c12188656a29b0f34d8ffa27927f0f664fbd74.gz new file mode 100644 index 0000000000..438c53e31d Binary files /dev/null and b/_darcs/patches/20080530185343-84dde-90c12188656a29b0f34d8ffa27927f0f664fbd74.gz differ diff --git a/_darcs/patches/20080530190446-84dde-52e5220aa5b76bc443ed20a1d0e07e509a5522f8.gz b/_darcs/patches/20080530190446-84dde-52e5220aa5b76bc443ed20a1d0e07e509a5522f8.gz new file mode 100644 index 0000000000..308fcf499a Binary files /dev/null and b/_darcs/patches/20080530190446-84dde-52e5220aa5b76bc443ed20a1d0e07e509a5522f8.gz differ diff --git a/_darcs/patches/20080530212555-84dde-213c04b9cf9048f48bf0b0b4234bcdf49546d4d9.gz b/_darcs/patches/20080530212555-84dde-213c04b9cf9048f48bf0b0b4234bcdf49546d4d9.gz new file mode 100644 index 0000000000..acaf52ee5c Binary files /dev/null and b/_darcs/patches/20080530212555-84dde-213c04b9cf9048f48bf0b0b4234bcdf49546d4d9.gz differ diff --git a/_darcs/patches/20080601020132-84dde-8559905f735c05e7274babc6a23440317cc4e587.gz b/_darcs/patches/20080601020132-84dde-8559905f735c05e7274babc6a23440317cc4e587.gz new file mode 100644 index 0000000000..ac4ffe480d Binary files /dev/null and b/_darcs/patches/20080601020132-84dde-8559905f735c05e7274babc6a23440317cc4e587.gz differ diff --git a/_darcs/patches/20080602174249-84dde-b7ffdf7f21afb5b734def70530fc305689da471d.gz b/_darcs/patches/20080602174249-84dde-b7ffdf7f21afb5b734def70530fc305689da471d.gz new file mode 100644 index 0000000000..0c2957d66b Binary files /dev/null and b/_darcs/patches/20080602174249-84dde-b7ffdf7f21afb5b734def70530fc305689da471d.gz differ diff --git a/_darcs/patches/20080602175725-84dde-c8b3abaedcb8667130da2a080a09630d91969b5c.gz b/_darcs/patches/20080602175725-84dde-c8b3abaedcb8667130da2a080a09630d91969b5c.gz new file mode 100644 index 0000000000..eabae44956 Binary files /dev/null and b/_darcs/patches/20080602175725-84dde-c8b3abaedcb8667130da2a080a09630d91969b5c.gz differ diff --git a/_darcs/patches/20080602175936-84dde-d21c8236ef5ffd788edc81d9d7a932b2eae0ec7d.gz b/_darcs/patches/20080602175936-84dde-d21c8236ef5ffd788edc81d9d7a932b2eae0ec7d.gz new file mode 100644 index 0000000000..2aa6c44be4 Binary files /dev/null and b/_darcs/patches/20080602175936-84dde-d21c8236ef5ffd788edc81d9d7a932b2eae0ec7d.gz differ diff --git a/_darcs/patches/20080602180108-84dde-c499dd9734e87081a3d7124c5b6ef885dc346670.gz b/_darcs/patches/20080602180108-84dde-c499dd9734e87081a3d7124c5b6ef885dc346670.gz new file mode 100644 index 0000000000..2ed3dca658 Binary files /dev/null and b/_darcs/patches/20080602180108-84dde-c499dd9734e87081a3d7124c5b6ef885dc346670.gz differ diff --git a/_darcs/patches/20080602181254-84dde-ac7f4a362754a66facfb06a7b41f9160a0eb5caf.gz b/_darcs/patches/20080602181254-84dde-ac7f4a362754a66facfb06a7b41f9160a0eb5caf.gz new file mode 100644 index 0000000000..aef970a057 Binary files /dev/null and b/_darcs/patches/20080602181254-84dde-ac7f4a362754a66facfb06a7b41f9160a0eb5caf.gz differ diff --git a/_darcs/patches/20080602181759-84dde-97355611da9635d40f41eb9324731cfaa3c584e0.gz b/_darcs/patches/20080602181759-84dde-97355611da9635d40f41eb9324731cfaa3c584e0.gz new file mode 100644 index 0000000000..0ba77f4b40 Binary files /dev/null and b/_darcs/patches/20080602181759-84dde-97355611da9635d40f41eb9324731cfaa3c584e0.gz differ diff --git a/_darcs/patches/20080602181857-84dde-846a8899f9db1b244c946c94373c60058b48774e.gz b/_darcs/patches/20080602181857-84dde-846a8899f9db1b244c946c94373c60058b48774e.gz new file mode 100644 index 0000000000..0cf26ee73c Binary files /dev/null and b/_darcs/patches/20080602181857-84dde-846a8899f9db1b244c946c94373c60058b48774e.gz differ diff --git a/_darcs/patches/20080602182153-84dde-4e5ac1c02e8e7a408d251ffa0aa2bbff190d1631.gz b/_darcs/patches/20080602182153-84dde-4e5ac1c02e8e7a408d251ffa0aa2bbff190d1631.gz new file mode 100644 index 0000000000..14bbdfdb26 Binary files /dev/null and b/_darcs/patches/20080602182153-84dde-4e5ac1c02e8e7a408d251ffa0aa2bbff190d1631.gz differ diff --git a/_darcs/patches/20080602183314-84dde-1f81609b2eb0d628c0e6dfe5fea7e21d799bdb3d.gz b/_darcs/patches/20080602183314-84dde-1f81609b2eb0d628c0e6dfe5fea7e21d799bdb3d.gz new file mode 100644 index 0000000000..a55e6951b1 Binary files /dev/null and b/_darcs/patches/20080602183314-84dde-1f81609b2eb0d628c0e6dfe5fea7e21d799bdb3d.gz differ diff --git a/_darcs/patches/20080602183911-84dde-9b5629cd97b894875b33888195eacffabb2ebe54.gz b/_darcs/patches/20080602183911-84dde-9b5629cd97b894875b33888195eacffabb2ebe54.gz new file mode 100644 index 0000000000..a7fe32b312 Binary files /dev/null and b/_darcs/patches/20080602183911-84dde-9b5629cd97b894875b33888195eacffabb2ebe54.gz differ diff --git a/_darcs/patches/20080602185137-84dde-0a3db0833eaf9361447559a6366e3820ae1f0694.gz b/_darcs/patches/20080602185137-84dde-0a3db0833eaf9361447559a6366e3820ae1f0694.gz new file mode 100644 index 0000000000..59f8042553 Binary files /dev/null and b/_darcs/patches/20080602185137-84dde-0a3db0833eaf9361447559a6366e3820ae1f0694.gz differ diff --git a/_darcs/patches/20080602185452-84dde-f9dc335ca69291d83e2a82ecce6e27055ee9e0e5.gz b/_darcs/patches/20080602185452-84dde-f9dc335ca69291d83e2a82ecce6e27055ee9e0e5.gz new file mode 100644 index 0000000000..369246b7f2 Binary files /dev/null and b/_darcs/patches/20080602185452-84dde-f9dc335ca69291d83e2a82ecce6e27055ee9e0e5.gz differ diff --git a/_darcs/patches/20080602185618-84dde-222f44fcdd6d085b9c3ef26f03738e120be55fae.gz b/_darcs/patches/20080602185618-84dde-222f44fcdd6d085b9c3ef26f03738e120be55fae.gz new file mode 100644 index 0000000000..0555d36d20 Binary files /dev/null and b/_darcs/patches/20080602185618-84dde-222f44fcdd6d085b9c3ef26f03738e120be55fae.gz differ diff --git a/_darcs/patches/20080602190357-84dde-fbfece18db8a6c4c916c1a58dca1b4a7998772f1.gz b/_darcs/patches/20080602190357-84dde-fbfece18db8a6c4c916c1a58dca1b4a7998772f1.gz new file mode 100644 index 0000000000..9e0c9fd9e9 Binary files /dev/null and b/_darcs/patches/20080602190357-84dde-fbfece18db8a6c4c916c1a58dca1b4a7998772f1.gz differ diff --git a/_darcs/patches/20080602191039-84dde-d4a119b5c6a0bff9648ee6a4445e373933f2c199.gz b/_darcs/patches/20080602191039-84dde-d4a119b5c6a0bff9648ee6a4445e373933f2c199.gz new file mode 100644 index 0000000000..57327b72c9 Binary files /dev/null and b/_darcs/patches/20080602191039-84dde-d4a119b5c6a0bff9648ee6a4445e373933f2c199.gz differ diff --git a/_darcs/patches/20080602192018-84dde-11f3092598ecd0d521e0243b5683eeb484180cbd.gz b/_darcs/patches/20080602192018-84dde-11f3092598ecd0d521e0243b5683eeb484180cbd.gz new file mode 100644 index 0000000000..89ffd2385c Binary files /dev/null and b/_darcs/patches/20080602192018-84dde-11f3092598ecd0d521e0243b5683eeb484180cbd.gz differ diff --git a/_darcs/patches/20080602192242-84dde-e023e8f328ec7f6c283a0f436b2dd577659d9e10.gz b/_darcs/patches/20080602192242-84dde-e023e8f328ec7f6c283a0f436b2dd577659d9e10.gz new file mode 100644 index 0000000000..851add7275 Binary files /dev/null and b/_darcs/patches/20080602192242-84dde-e023e8f328ec7f6c283a0f436b2dd577659d9e10.gz differ diff --git a/_darcs/patches/20080602192526-84dde-f3416449cc8dcfc0ffe85d79d166d419aa2a5b0c.gz b/_darcs/patches/20080602192526-84dde-f3416449cc8dcfc0ffe85d79d166d419aa2a5b0c.gz new file mode 100644 index 0000000000..d19664f46b Binary files /dev/null and b/_darcs/patches/20080602192526-84dde-f3416449cc8dcfc0ffe85d79d166d419aa2a5b0c.gz differ diff --git a/_darcs/patches/20080602192820-84dde-6ac58e44cc0fb455e871053ace803194c76ccd00.gz b/_darcs/patches/20080602192820-84dde-6ac58e44cc0fb455e871053ace803194c76ccd00.gz new file mode 100644 index 0000000000..f351fc6403 Binary files /dev/null and b/_darcs/patches/20080602192820-84dde-6ac58e44cc0fb455e871053ace803194c76ccd00.gz differ diff --git a/_darcs/patches/20080602193851-84dde-069af77a95bc89271b75b7e0c7ff965fefa1de34.gz b/_darcs/patches/20080602193851-84dde-069af77a95bc89271b75b7e0c7ff965fefa1de34.gz new file mode 100644 index 0000000000..5ce783d167 Binary files /dev/null and b/_darcs/patches/20080602193851-84dde-069af77a95bc89271b75b7e0c7ff965fefa1de34.gz differ diff --git a/_darcs/patches/20080602194333-84dde-3ebcd6250184952779a6e6fd7c8561cc6a3733ac.gz b/_darcs/patches/20080602194333-84dde-3ebcd6250184952779a6e6fd7c8561cc6a3733ac.gz new file mode 100644 index 0000000000..73ddee6d93 Binary files /dev/null and b/_darcs/patches/20080602194333-84dde-3ebcd6250184952779a6e6fd7c8561cc6a3733ac.gz differ diff --git a/_darcs/patches/20080602195138-84dde-d5106000f1496aac729685b65da8bb21c520f0a3.gz b/_darcs/patches/20080602195138-84dde-d5106000f1496aac729685b65da8bb21c520f0a3.gz new file mode 100644 index 0000000000..9df2ae71ec Binary files /dev/null and b/_darcs/patches/20080602195138-84dde-d5106000f1496aac729685b65da8bb21c520f0a3.gz differ diff --git a/_darcs/patches/20080602200645-84dde-c72e2e98a955bdd7768fa39da30660dfcffd0f15.gz b/_darcs/patches/20080602200645-84dde-c72e2e98a955bdd7768fa39da30660dfcffd0f15.gz new file mode 100644 index 0000000000..2262293822 Binary files /dev/null and b/_darcs/patches/20080602200645-84dde-c72e2e98a955bdd7768fa39da30660dfcffd0f15.gz differ diff --git a/_darcs/patches/20080602201707-84dde-400855b57fcf01e597494143cc78092351043b91.gz b/_darcs/patches/20080602201707-84dde-400855b57fcf01e597494143cc78092351043b91.gz new file mode 100644 index 0000000000..9d46ab26d8 Binary files /dev/null and b/_darcs/patches/20080602201707-84dde-400855b57fcf01e597494143cc78092351043b91.gz differ diff --git a/_darcs/patches/20080602203142-84dde-6f68b40061d0af776d077be1b24b8adf84ee331b.gz b/_darcs/patches/20080602203142-84dde-6f68b40061d0af776d077be1b24b8adf84ee331b.gz new file mode 100644 index 0000000000..479c985380 Binary files /dev/null and b/_darcs/patches/20080602203142-84dde-6f68b40061d0af776d077be1b24b8adf84ee331b.gz differ diff --git a/_darcs/patches/20080602203802-84dde-f7f237da7c86fe38fd67629d0599c48929dfa619.gz b/_darcs/patches/20080602203802-84dde-f7f237da7c86fe38fd67629d0599c48929dfa619.gz new file mode 100644 index 0000000000..8c4190ab66 Binary files /dev/null and b/_darcs/patches/20080602203802-84dde-f7f237da7c86fe38fd67629d0599c48929dfa619.gz differ diff --git a/_darcs/patches/20080602205534-84dde-fc7d85d50b758bc73721a6aaa87c16c41237d14f.gz b/_darcs/patches/20080602205534-84dde-fc7d85d50b758bc73721a6aaa87c16c41237d14f.gz new file mode 100644 index 0000000000..aaf69dc7d4 Binary files /dev/null and b/_darcs/patches/20080602205534-84dde-fc7d85d50b758bc73721a6aaa87c16c41237d14f.gz differ diff --git a/_darcs/patches/20080602205921-84dde-26945a4fb66489120115576ce1cb57a46c532e92.gz b/_darcs/patches/20080602205921-84dde-26945a4fb66489120115576ce1cb57a46c532e92.gz new file mode 100644 index 0000000000..e68d94db02 Binary files /dev/null and b/_darcs/patches/20080602205921-84dde-26945a4fb66489120115576ce1cb57a46c532e92.gz differ diff --git a/_darcs/patches/20080603104859-84dde-3ed15e61feb0cef1a1d0d2dc8723951ac41b00d8.gz b/_darcs/patches/20080603104859-84dde-3ed15e61feb0cef1a1d0d2dc8723951ac41b00d8.gz new file mode 100644 index 0000000000..cce2e41911 Binary files /dev/null and b/_darcs/patches/20080603104859-84dde-3ed15e61feb0cef1a1d0d2dc8723951ac41b00d8.gz differ diff --git a/_darcs/patches/20080603110749-84dde-e278a8ccf17e68735f6d5699dee5bb0e7444ec29.gz b/_darcs/patches/20080603110749-84dde-e278a8ccf17e68735f6d5699dee5bb0e7444ec29.gz new file mode 100644 index 0000000000..b6dc47e8da Binary files /dev/null and b/_darcs/patches/20080603110749-84dde-e278a8ccf17e68735f6d5699dee5bb0e7444ec29.gz differ diff --git a/_darcs/patches/20080603111750-84dde-5b3eb37cc05ceaec991951338d55d38a2e0a5f2d.gz b/_darcs/patches/20080603111750-84dde-5b3eb37cc05ceaec991951338d55d38a2e0a5f2d.gz new file mode 100644 index 0000000000..1fe767d3c8 Binary files /dev/null and b/_darcs/patches/20080603111750-84dde-5b3eb37cc05ceaec991951338d55d38a2e0a5f2d.gz differ diff --git a/_darcs/patches/20080603113626-84dde-99a92331e3875d05e68919acea46392a0128938e.gz b/_darcs/patches/20080603113626-84dde-99a92331e3875d05e68919acea46392a0128938e.gz new file mode 100644 index 0000000000..8b9eaa3d9c Binary files /dev/null and b/_darcs/patches/20080603113626-84dde-99a92331e3875d05e68919acea46392a0128938e.gz differ diff --git a/_darcs/patches/20080603114317-84dde-04fe2734003fa8023708b6dbda6243d9fd15e9d8.gz b/_darcs/patches/20080603114317-84dde-04fe2734003fa8023708b6dbda6243d9fd15e9d8.gz new file mode 100644 index 0000000000..55331abc1f Binary files /dev/null and b/_darcs/patches/20080603114317-84dde-04fe2734003fa8023708b6dbda6243d9fd15e9d8.gz differ diff --git a/_darcs/patches/20080603115218-84dde-f333d4541e1112487a5da1e3ad71064513e2228f.gz b/_darcs/patches/20080603115218-84dde-f333d4541e1112487a5da1e3ad71064513e2228f.gz new file mode 100644 index 0000000000..8f74144c37 Binary files /dev/null and b/_darcs/patches/20080603115218-84dde-f333d4541e1112487a5da1e3ad71064513e2228f.gz differ diff --git a/_darcs/patches/20080603115839-84dde-40da93a70e24274dcdc28ea2f4fd1e492fdb9e24.gz b/_darcs/patches/20080603115839-84dde-40da93a70e24274dcdc28ea2f4fd1e492fdb9e24.gz new file mode 100644 index 0000000000..a11125ef92 Binary files /dev/null and b/_darcs/patches/20080603115839-84dde-40da93a70e24274dcdc28ea2f4fd1e492fdb9e24.gz differ diff --git a/_darcs/patches/20080604185131-84dde-2ff45e07ebba18c97803ed4a99121a6244ef1158.gz b/_darcs/patches/20080604185131-84dde-2ff45e07ebba18c97803ed4a99121a6244ef1158.gz new file mode 100644 index 0000000000..cf03c7062d Binary files /dev/null and b/_darcs/patches/20080604185131-84dde-2ff45e07ebba18c97803ed4a99121a6244ef1158.gz differ diff --git a/_darcs/patches/20080604191206-84dde-24d6a80c9e3886352d451ca0993ed0bb6baafd7a.gz b/_darcs/patches/20080604191206-84dde-24d6a80c9e3886352d451ca0993ed0bb6baafd7a.gz new file mode 100644 index 0000000000..c6b7b91815 Binary files /dev/null and b/_darcs/patches/20080604191206-84dde-24d6a80c9e3886352d451ca0993ed0bb6baafd7a.gz differ diff --git a/_darcs/patches/20080604201123-84dde-ff9ec8530474e194eee5e6fcc6190f7cd6fc5b5c.gz b/_darcs/patches/20080604201123-84dde-ff9ec8530474e194eee5e6fcc6190f7cd6fc5b5c.gz new file mode 100644 index 0000000000..94cd7ce1a0 Binary files /dev/null and b/_darcs/patches/20080604201123-84dde-ff9ec8530474e194eee5e6fcc6190f7cd6fc5b5c.gz differ diff --git a/_darcs/patches/20080605024035-84dde-bc3abc4329f3181cffd26e83d37968ee6a02a26e.gz b/_darcs/patches/20080605024035-84dde-bc3abc4329f3181cffd26e83d37968ee6a02a26e.gz new file mode 100644 index 0000000000..bb3565945a Binary files /dev/null and b/_darcs/patches/20080605024035-84dde-bc3abc4329f3181cffd26e83d37968ee6a02a26e.gz differ diff --git a/_darcs/patches/20080605024717-84dde-dc897a855af13ea30bb670daf94749e9f14fa7ad.gz b/_darcs/patches/20080605024717-84dde-dc897a855af13ea30bb670daf94749e9f14fa7ad.gz new file mode 100644 index 0000000000..ac1514331c Binary files /dev/null and b/_darcs/patches/20080605024717-84dde-dc897a855af13ea30bb670daf94749e9f14fa7ad.gz differ diff --git a/_darcs/patches/20080605024807-84dde-b6b112fc71f6337bf2d3605944191454aaeb28e2.gz b/_darcs/patches/20080605024807-84dde-b6b112fc71f6337bf2d3605944191454aaeb28e2.gz new file mode 100644 index 0000000000..1503f8988a Binary files /dev/null and b/_darcs/patches/20080605024807-84dde-b6b112fc71f6337bf2d3605944191454aaeb28e2.gz differ diff --git a/_darcs/patches/20080605025152-84dde-54da3eba220432b71d14ef7cfd4a8a7bf664316f.gz b/_darcs/patches/20080605025152-84dde-54da3eba220432b71d14ef7cfd4a8a7bf664316f.gz new file mode 100644 index 0000000000..d10cae48c5 Binary files /dev/null and b/_darcs/patches/20080605025152-84dde-54da3eba220432b71d14ef7cfd4a8a7bf664316f.gz differ diff --git a/_darcs/patches/20080605025611-84dde-18fcf515bb9c727cafd3ca44454e7f18d8f8e752.gz b/_darcs/patches/20080605025611-84dde-18fcf515bb9c727cafd3ca44454e7f18d8f8e752.gz new file mode 100644 index 0000000000..a0b0c9cddf Binary files /dev/null and b/_darcs/patches/20080605025611-84dde-18fcf515bb9c727cafd3ca44454e7f18d8f8e752.gz differ diff --git a/_darcs/patches/20080605033911-84dde-0cf77fad66198a790450183eba11028e153f43d1.gz b/_darcs/patches/20080605033911-84dde-0cf77fad66198a790450183eba11028e153f43d1.gz new file mode 100644 index 0000000000..49a6c554c8 Binary files /dev/null and b/_darcs/patches/20080605033911-84dde-0cf77fad66198a790450183eba11028e153f43d1.gz differ diff --git a/_darcs/patches/20080605040153-84dde-5d180f0d8ead2fc7c5eaca3deaf035ba31d3512a.gz b/_darcs/patches/20080605040153-84dde-5d180f0d8ead2fc7c5eaca3deaf035ba31d3512a.gz new file mode 100644 index 0000000000..4925ec28d9 Binary files /dev/null and b/_darcs/patches/20080605040153-84dde-5d180f0d8ead2fc7c5eaca3deaf035ba31d3512a.gz differ diff --git a/_darcs/patches/20080605040358-84dde-b2018db43791d1cbed722d3320cd0b62d6da94eb.gz b/_darcs/patches/20080605040358-84dde-b2018db43791d1cbed722d3320cd0b62d6da94eb.gz new file mode 100644 index 0000000000..95ad8f069d Binary files /dev/null and b/_darcs/patches/20080605040358-84dde-b2018db43791d1cbed722d3320cd0b62d6da94eb.gz differ diff --git a/_darcs/patches/20080605183419-84dde-debe7f18565c960ee6886ac1330833bc8ae1ca5f.gz b/_darcs/patches/20080605183419-84dde-debe7f18565c960ee6886ac1330833bc8ae1ca5f.gz new file mode 100644 index 0000000000..e8a3e244e9 Binary files /dev/null and b/_darcs/patches/20080605183419-84dde-debe7f18565c960ee6886ac1330833bc8ae1ca5f.gz differ diff --git a/_darcs/patches/20080605190614-84dde-4684be45f62623ca4bb69a95b264414af88f2ac2.gz b/_darcs/patches/20080605190614-84dde-4684be45f62623ca4bb69a95b264414af88f2ac2.gz new file mode 100644 index 0000000000..77ff8554a0 Binary files /dev/null and b/_darcs/patches/20080605190614-84dde-4684be45f62623ca4bb69a95b264414af88f2ac2.gz differ diff --git a/_darcs/patches/20080605193708-84dde-a441cc0474951ce7f1a1da9310b5145c0b7c3070.gz b/_darcs/patches/20080605193708-84dde-a441cc0474951ce7f1a1da9310b5145c0b7c3070.gz new file mode 100644 index 0000000000..39b458b456 Binary files /dev/null and b/_darcs/patches/20080605193708-84dde-a441cc0474951ce7f1a1da9310b5145c0b7c3070.gz differ diff --git a/_darcs/patches/20080605195222-84dde-c9e00b0ef0f8fed4ea5d4c088d52e39589b6bb02.gz b/_darcs/patches/20080605195222-84dde-c9e00b0ef0f8fed4ea5d4c088d52e39589b6bb02.gz new file mode 100644 index 0000000000..52a03db5f4 Binary files /dev/null and b/_darcs/patches/20080605195222-84dde-c9e00b0ef0f8fed4ea5d4c088d52e39589b6bb02.gz differ diff --git a/_darcs/patches/20080605195500-84dde-307ed9c01b6efa0055908f408d3032ce7d7a9870.gz b/_darcs/patches/20080605195500-84dde-307ed9c01b6efa0055908f408d3032ce7d7a9870.gz new file mode 100644 index 0000000000..24613046fe Binary files /dev/null and b/_darcs/patches/20080605195500-84dde-307ed9c01b6efa0055908f408d3032ce7d7a9870.gz differ diff --git a/_darcs/patches/20080605200759-84dde-a1e8cc5c2c6a22da80f03ef692de9d0a8dcb29fc.gz b/_darcs/patches/20080605200759-84dde-a1e8cc5c2c6a22da80f03ef692de9d0a8dcb29fc.gz new file mode 100644 index 0000000000..5d3fd311b2 Binary files /dev/null and b/_darcs/patches/20080605200759-84dde-a1e8cc5c2c6a22da80f03ef692de9d0a8dcb29fc.gz differ diff --git a/_darcs/patches/20080606040946-84dde-3a78ddbc700dcd2cb56ad3200b5658e07416096f.gz b/_darcs/patches/20080606040946-84dde-3a78ddbc700dcd2cb56ad3200b5658e07416096f.gz new file mode 100644 index 0000000000..959f2e872a Binary files /dev/null and b/_darcs/patches/20080606040946-84dde-3a78ddbc700dcd2cb56ad3200b5658e07416096f.gz differ diff --git a/_darcs/patches/20080606043405-84dde-e365fd5a897990c446a4156ed3582081949fd891.gz b/_darcs/patches/20080606043405-84dde-e365fd5a897990c446a4156ed3582081949fd891.gz new file mode 100644 index 0000000000..662d2aee11 Binary files /dev/null and b/_darcs/patches/20080606043405-84dde-e365fd5a897990c446a4156ed3582081949fd891.gz differ diff --git a/_darcs/patches/20080606051331-84dde-1afe6e4a156cbb802b8b4231e065dc99ad07fef4.gz b/_darcs/patches/20080606051331-84dde-1afe6e4a156cbb802b8b4231e065dc99ad07fef4.gz new file mode 100644 index 0000000000..c530747de3 Binary files /dev/null and b/_darcs/patches/20080606051331-84dde-1afe6e4a156cbb802b8b4231e065dc99ad07fef4.gz differ diff --git a/_darcs/patches/20080606051823-84dde-1ba6bdfe546b5307afd97c2c7715f8d35b464e83.gz b/_darcs/patches/20080606051823-84dde-1ba6bdfe546b5307afd97c2c7715f8d35b464e83.gz new file mode 100644 index 0000000000..5abc155eb8 Binary files /dev/null and b/_darcs/patches/20080606051823-84dde-1ba6bdfe546b5307afd97c2c7715f8d35b464e83.gz differ diff --git a/_darcs/patches/20080606052117-84dde-b9afe0037d9c75382f218f85eefec2a944e42dc6.gz b/_darcs/patches/20080606052117-84dde-b9afe0037d9c75382f218f85eefec2a944e42dc6.gz new file mode 100644 index 0000000000..599feb289a Binary files /dev/null and b/_darcs/patches/20080606052117-84dde-b9afe0037d9c75382f218f85eefec2a944e42dc6.gz differ diff --git a/_darcs/patches/20080606052631-84dde-4a8b4d8f70b0148d0b98b62875099f7d9cca9026.gz b/_darcs/patches/20080606052631-84dde-4a8b4d8f70b0148d0b98b62875099f7d9cca9026.gz new file mode 100644 index 0000000000..e5d9690083 Binary files /dev/null and b/_darcs/patches/20080606052631-84dde-4a8b4d8f70b0148d0b98b62875099f7d9cca9026.gz differ diff --git a/_darcs/patches/20080606053321-84dde-c6ee7a4565cce35873ad36890b609b90b65b472d.gz b/_darcs/patches/20080606053321-84dde-c6ee7a4565cce35873ad36890b609b90b65b472d.gz new file mode 100644 index 0000000000..eff45675a9 Binary files /dev/null and b/_darcs/patches/20080606053321-84dde-c6ee7a4565cce35873ad36890b609b90b65b472d.gz differ diff --git a/_darcs/patches/20080606053914-84dde-e4bad8da4af7bed3ca8e8e84c5cc82ff2a82ad4c.gz b/_darcs/patches/20080606053914-84dde-e4bad8da4af7bed3ca8e8e84c5cc82ff2a82ad4c.gz new file mode 100644 index 0000000000..96c59f636f Binary files /dev/null and b/_darcs/patches/20080606053914-84dde-e4bad8da4af7bed3ca8e8e84c5cc82ff2a82ad4c.gz differ diff --git a/_darcs/patches/20080606054549-84dde-9d90611b14fa441873fc4504548d46848dbdf5b4.gz b/_darcs/patches/20080606054549-84dde-9d90611b14fa441873fc4504548d46848dbdf5b4.gz new file mode 100644 index 0000000000..c19bbb000a Binary files /dev/null and b/_darcs/patches/20080606054549-84dde-9d90611b14fa441873fc4504548d46848dbdf5b4.gz differ diff --git a/_darcs/patches/20080606055439-84dde-3abda48583737e89a9c75b3cff6722e9444d13a9.gz b/_darcs/patches/20080606055439-84dde-3abda48583737e89a9c75b3cff6722e9444d13a9.gz new file mode 100644 index 0000000000..46ed224969 Binary files /dev/null and b/_darcs/patches/20080606055439-84dde-3abda48583737e89a9c75b3cff6722e9444d13a9.gz differ diff --git a/_darcs/patches/20080606060000-84dde-30573475c9721e7763deccac1359439887ae8add.gz b/_darcs/patches/20080606060000-84dde-30573475c9721e7763deccac1359439887ae8add.gz new file mode 100644 index 0000000000..021c3897bc Binary files /dev/null and b/_darcs/patches/20080606060000-84dde-30573475c9721e7763deccac1359439887ae8add.gz differ diff --git a/_darcs/patches/20080606060601-84dde-a1ae6f677c2846f9d10af18cd7f001ae5e560403.gz b/_darcs/patches/20080606060601-84dde-a1ae6f677c2846f9d10af18cd7f001ae5e560403.gz new file mode 100644 index 0000000000..5a677b2989 Binary files /dev/null and b/_darcs/patches/20080606060601-84dde-a1ae6f677c2846f9d10af18cd7f001ae5e560403.gz differ diff --git a/_darcs/patches/20080606061556-84dde-21c46b2021b2ed63836111aa31a45b251c73a1bc.gz b/_darcs/patches/20080606061556-84dde-21c46b2021b2ed63836111aa31a45b251c73a1bc.gz new file mode 100644 index 0000000000..72c34900d0 Binary files /dev/null and b/_darcs/patches/20080606061556-84dde-21c46b2021b2ed63836111aa31a45b251c73a1bc.gz differ diff --git a/_darcs/patches/20080606062235-84dde-2af2ed6b90474beac139a740c49fa6eec6f61484.gz b/_darcs/patches/20080606062235-84dde-2af2ed6b90474beac139a740c49fa6eec6f61484.gz new file mode 100644 index 0000000000..ee64d0ae69 Binary files /dev/null and b/_darcs/patches/20080606062235-84dde-2af2ed6b90474beac139a740c49fa6eec6f61484.gz differ diff --git a/_darcs/patches/20080606062958-84dde-3568ba98526687d81873bff77385d214c50cddfb.gz b/_darcs/patches/20080606062958-84dde-3568ba98526687d81873bff77385d214c50cddfb.gz new file mode 100644 index 0000000000..0285c81c06 Binary files /dev/null and b/_darcs/patches/20080606062958-84dde-3568ba98526687d81873bff77385d214c50cddfb.gz differ diff --git a/_darcs/patches/20080606063721-84dde-a843ac9ef5b48aa25d15125d4f0be3f0c2e6bfb1.gz b/_darcs/patches/20080606063721-84dde-a843ac9ef5b48aa25d15125d4f0be3f0c2e6bfb1.gz new file mode 100644 index 0000000000..43fc4d4801 Binary files /dev/null and b/_darcs/patches/20080606063721-84dde-a843ac9ef5b48aa25d15125d4f0be3f0c2e6bfb1.gz differ diff --git a/_darcs/patches/20080606064011-84dde-89cca620d3782dec77da804008ce391e17ec393e.gz b/_darcs/patches/20080606064011-84dde-89cca620d3782dec77da804008ce391e17ec393e.gz new file mode 100644 index 0000000000..bc901a2520 Binary files /dev/null and b/_darcs/patches/20080606064011-84dde-89cca620d3782dec77da804008ce391e17ec393e.gz differ diff --git a/_darcs/patches/20080606065027-84dde-a4ac215010b76ef296976fdf8a94473bd80c7ffa.gz b/_darcs/patches/20080606065027-84dde-a4ac215010b76ef296976fdf8a94473bd80c7ffa.gz new file mode 100644 index 0000000000..b50d9fa755 Binary files /dev/null and b/_darcs/patches/20080606065027-84dde-a4ac215010b76ef296976fdf8a94473bd80c7ffa.gz differ diff --git a/_darcs/patches/20080606160437-84dde-25d2db21e059159751a27fd77f47764346029dd8.gz b/_darcs/patches/20080606160437-84dde-25d2db21e059159751a27fd77f47764346029dd8.gz new file mode 100644 index 0000000000..00eb918384 Binary files /dev/null and b/_darcs/patches/20080606160437-84dde-25d2db21e059159751a27fd77f47764346029dd8.gz differ diff --git a/_darcs/patches/20080606162226-84dde-a794aede95d78913a21e7e2180d7d04cc47789f0.gz b/_darcs/patches/20080606162226-84dde-a794aede95d78913a21e7e2180d7d04cc47789f0.gz new file mode 100644 index 0000000000..dce54d4bde Binary files /dev/null and b/_darcs/patches/20080606162226-84dde-a794aede95d78913a21e7e2180d7d04cc47789f0.gz differ diff --git a/_darcs/patches/20080606162659-84dde-fd7d5e030aa6aeebf61d0ea7b143aa7cafce7c45.gz b/_darcs/patches/20080606162659-84dde-fd7d5e030aa6aeebf61d0ea7b143aa7cafce7c45.gz new file mode 100644 index 0000000000..3879bf6743 Binary files /dev/null and b/_darcs/patches/20080606162659-84dde-fd7d5e030aa6aeebf61d0ea7b143aa7cafce7c45.gz differ diff --git a/_darcs/patches/20080606171450-84dde-cd594e2cdb734a76e4dd6436a40ba900d4f64053.gz b/_darcs/patches/20080606171450-84dde-cd594e2cdb734a76e4dd6436a40ba900d4f64053.gz new file mode 100644 index 0000000000..fbe980dbc1 Binary files /dev/null and b/_darcs/patches/20080606171450-84dde-cd594e2cdb734a76e4dd6436a40ba900d4f64053.gz differ diff --git a/_darcs/patches/20080606172239-84dde-383dd08b116b9238a8313dc2f117f5edac3a5905.gz b/_darcs/patches/20080606172239-84dde-383dd08b116b9238a8313dc2f117f5edac3a5905.gz new file mode 100644 index 0000000000..04a585cefb Binary files /dev/null and b/_darcs/patches/20080606172239-84dde-383dd08b116b9238a8313dc2f117f5edac3a5905.gz differ diff --git a/_darcs/patches/20080606172638-84dde-191d9ef20462ec6edf2637c7b3f6d39ba5815a56.gz b/_darcs/patches/20080606172638-84dde-191d9ef20462ec6edf2637c7b3f6d39ba5815a56.gz new file mode 100644 index 0000000000..ce0f57ae96 Binary files /dev/null and b/_darcs/patches/20080606172638-84dde-191d9ef20462ec6edf2637c7b3f6d39ba5815a56.gz differ diff --git a/_darcs/patches/20080606173804-84dde-16dfd378d370206ec5837a317bb986cfa57fbea5.gz b/_darcs/patches/20080606173804-84dde-16dfd378d370206ec5837a317bb986cfa57fbea5.gz new file mode 100644 index 0000000000..7ee208185a Binary files /dev/null and b/_darcs/patches/20080606173804-84dde-16dfd378d370206ec5837a317bb986cfa57fbea5.gz differ diff --git a/_darcs/patches/20080606174822-84dde-2128b2a5a6e129b10741bb8a1b2cdcdacc4ca1ca.gz b/_darcs/patches/20080606174822-84dde-2128b2a5a6e129b10741bb8a1b2cdcdacc4ca1ca.gz new file mode 100644 index 0000000000..d55e9ad6fc Binary files /dev/null and b/_darcs/patches/20080606174822-84dde-2128b2a5a6e129b10741bb8a1b2cdcdacc4ca1ca.gz differ diff --git a/_darcs/patches/20080606175254-84dde-acf1bd42c7ca01bb811caec928abf6dfa338fd36.gz b/_darcs/patches/20080606175254-84dde-acf1bd42c7ca01bb811caec928abf6dfa338fd36.gz new file mode 100644 index 0000000000..64a1a6912b Binary files /dev/null and b/_darcs/patches/20080606175254-84dde-acf1bd42c7ca01bb811caec928abf6dfa338fd36.gz differ diff --git a/_darcs/patches/20080606180035-84dde-d91a6540a33196a6b76b1d5ba473d79dbc961b93.gz b/_darcs/patches/20080606180035-84dde-d91a6540a33196a6b76b1d5ba473d79dbc961b93.gz new file mode 100644 index 0000000000..e9dff9bf99 Binary files /dev/null and b/_darcs/patches/20080606180035-84dde-d91a6540a33196a6b76b1d5ba473d79dbc961b93.gz differ diff --git a/_darcs/patches/20080606180330-84dde-be0e84696cd5e7304cd8523c0d7de9d6e402b73e.gz b/_darcs/patches/20080606180330-84dde-be0e84696cd5e7304cd8523c0d7de9d6e402b73e.gz new file mode 100644 index 0000000000..248b3d9883 Binary files /dev/null and b/_darcs/patches/20080606180330-84dde-be0e84696cd5e7304cd8523c0d7de9d6e402b73e.gz differ diff --git a/_darcs/patches/20080606182044-84dde-1ef6f8b6edeaa2e9f3c28fd7dc1831e5d7381f26.gz b/_darcs/patches/20080606182044-84dde-1ef6f8b6edeaa2e9f3c28fd7dc1831e5d7381f26.gz new file mode 100644 index 0000000000..148c304278 Binary files /dev/null and b/_darcs/patches/20080606182044-84dde-1ef6f8b6edeaa2e9f3c28fd7dc1831e5d7381f26.gz differ diff --git a/_darcs/patches/20080606195136-84dde-c1839e332e9b7e1e36f693c1a0968535a8f2702f.gz b/_darcs/patches/20080606195136-84dde-c1839e332e9b7e1e36f693c1a0968535a8f2702f.gz new file mode 100644 index 0000000000..83beeb92b0 Binary files /dev/null and b/_darcs/patches/20080606195136-84dde-c1839e332e9b7e1e36f693c1a0968535a8f2702f.gz differ diff --git a/_darcs/patches/20080606200151-84dde-4ed7ae04c16441a431544c207effcfdea1c72a6c.gz b/_darcs/patches/20080606200151-84dde-4ed7ae04c16441a431544c207effcfdea1c72a6c.gz new file mode 100644 index 0000000000..e4f3211258 Binary files /dev/null and b/_darcs/patches/20080606200151-84dde-4ed7ae04c16441a431544c207effcfdea1c72a6c.gz differ diff --git a/_darcs/patches/20080608201917-84dde-ba5c877c01c0200f379c4433799b1f752a9817df.gz b/_darcs/patches/20080608201917-84dde-ba5c877c01c0200f379c4433799b1f752a9817df.gz new file mode 100644 index 0000000000..23d6249a0d Binary files /dev/null and b/_darcs/patches/20080608201917-84dde-ba5c877c01c0200f379c4433799b1f752a9817df.gz differ diff --git a/_darcs/patches/20080608201957-84dde-a092da20de695cfd6a910c38b24a607fe678159c.gz b/_darcs/patches/20080608201957-84dde-a092da20de695cfd6a910c38b24a607fe678159c.gz new file mode 100644 index 0000000000..0bb1b90707 Binary files /dev/null and b/_darcs/patches/20080608201957-84dde-a092da20de695cfd6a910c38b24a607fe678159c.gz differ diff --git a/_darcs/patches/20080608203314-84dde-6553bea647ce5e712a7615ece83840e1e14a33d4.gz b/_darcs/patches/20080608203314-84dde-6553bea647ce5e712a7615ece83840e1e14a33d4.gz new file mode 100644 index 0000000000..7d293924d7 Binary files /dev/null and b/_darcs/patches/20080608203314-84dde-6553bea647ce5e712a7615ece83840e1e14a33d4.gz differ diff --git a/_darcs/patches/20080608203731-84dde-b13b5ef0cee83cc102bef45ab0725ee0f99b9969.gz b/_darcs/patches/20080608203731-84dde-b13b5ef0cee83cc102bef45ab0725ee0f99b9969.gz new file mode 100644 index 0000000000..11d5d2666c Binary files /dev/null and b/_darcs/patches/20080608203731-84dde-b13b5ef0cee83cc102bef45ab0725ee0f99b9969.gz differ diff --git a/_darcs/patches/20080610121132-84dde-f0f49c2e33c650e6cf91d3e31f595b0ee570e603.gz b/_darcs/patches/20080610121132-84dde-f0f49c2e33c650e6cf91d3e31f595b0ee570e603.gz new file mode 100644 index 0000000000..d63e3effbb Binary files /dev/null and b/_darcs/patches/20080610121132-84dde-f0f49c2e33c650e6cf91d3e31f595b0ee570e603.gz differ diff --git a/_darcs/patches/20080610121936-84dde-5e13dfc79beaac01ed795d37e11b02cad610051d.gz b/_darcs/patches/20080610121936-84dde-5e13dfc79beaac01ed795d37e11b02cad610051d.gz new file mode 100644 index 0000000000..c49716b9df Binary files /dev/null and b/_darcs/patches/20080610121936-84dde-5e13dfc79beaac01ed795d37e11b02cad610051d.gz differ diff --git a/_darcs/patches/20080610122707-84dde-403d9869ea32d629e60736822c6f06b0a56a070d.gz b/_darcs/patches/20080610122707-84dde-403d9869ea32d629e60736822c6f06b0a56a070d.gz new file mode 100644 index 0000000000..ad243bb28d Binary files /dev/null and b/_darcs/patches/20080610122707-84dde-403d9869ea32d629e60736822c6f06b0a56a070d.gz differ diff --git a/_darcs/patches/20080610123002-84dde-0bce005b77d053d22cfbba8e0743af1b49f151bb.gz b/_darcs/patches/20080610123002-84dde-0bce005b77d053d22cfbba8e0743af1b49f151bb.gz new file mode 100644 index 0000000000..3df0c16b22 Binary files /dev/null and b/_darcs/patches/20080610123002-84dde-0bce005b77d053d22cfbba8e0743af1b49f151bb.gz differ diff --git a/_darcs/patches/20080610142221-84dde-ad2d1dcfc151b330612b374c25700d81767e9ef7.gz b/_darcs/patches/20080610142221-84dde-ad2d1dcfc151b330612b374c25700d81767e9ef7.gz new file mode 100644 index 0000000000..500122997b Binary files /dev/null and b/_darcs/patches/20080610142221-84dde-ad2d1dcfc151b330612b374c25700d81767e9ef7.gz differ diff --git a/_darcs/patches/20080610143709-84dde-ce586d1ca5bb73bdeef8b254f8835f599b769714.gz b/_darcs/patches/20080610143709-84dde-ce586d1ca5bb73bdeef8b254f8835f599b769714.gz new file mode 100644 index 0000000000..965e23d972 Binary files /dev/null and b/_darcs/patches/20080610143709-84dde-ce586d1ca5bb73bdeef8b254f8835f599b769714.gz differ diff --git a/_darcs/patches/20080610144420-84dde-b1904673a1afb56bef1a4f54e4432eb94aa03619.gz b/_darcs/patches/20080610144420-84dde-b1904673a1afb56bef1a4f54e4432eb94aa03619.gz new file mode 100644 index 0000000000..45d892eb85 Binary files /dev/null and b/_darcs/patches/20080610144420-84dde-b1904673a1afb56bef1a4f54e4432eb94aa03619.gz differ diff --git a/_darcs/patches/20080610144606-84dde-7c8b86d2954324e686eb5fe1ed9daeb4919a945c.gz b/_darcs/patches/20080610144606-84dde-7c8b86d2954324e686eb5fe1ed9daeb4919a945c.gz new file mode 100644 index 0000000000..dab8f4fca0 Binary files /dev/null and b/_darcs/patches/20080610144606-84dde-7c8b86d2954324e686eb5fe1ed9daeb4919a945c.gz differ diff --git a/_darcs/patches/20080610145520-84dde-67e0480537053f7aacf18a8fb1f45e472e115493.gz b/_darcs/patches/20080610145520-84dde-67e0480537053f7aacf18a8fb1f45e472e115493.gz new file mode 100644 index 0000000000..67db7f625c Binary files /dev/null and b/_darcs/patches/20080610145520-84dde-67e0480537053f7aacf18a8fb1f45e472e115493.gz differ diff --git a/_darcs/patches/20080610150113-84dde-00dbd7fb5079d990c7625902fa7fe9ca2dbbcc1e.gz b/_darcs/patches/20080610150113-84dde-00dbd7fb5079d990c7625902fa7fe9ca2dbbcc1e.gz new file mode 100644 index 0000000000..60fee02769 Binary files /dev/null and b/_darcs/patches/20080610150113-84dde-00dbd7fb5079d990c7625902fa7fe9ca2dbbcc1e.gz differ diff --git a/_darcs/patches/20080610150429-34904-c09bc4ef00a38bcdbf740f35291c8ea35869dcae.gz b/_darcs/patches/20080610150429-34904-c09bc4ef00a38bcdbf740f35291c8ea35869dcae.gz new file mode 100644 index 0000000000..a7c7fa0517 Binary files /dev/null and b/_darcs/patches/20080610150429-34904-c09bc4ef00a38bcdbf740f35291c8ea35869dcae.gz differ diff --git a/_darcs/patches/20080610150957-84dde-2aff9cb5f23c593f524e4affb5c3f67a7f06ce34.gz b/_darcs/patches/20080610150957-84dde-2aff9cb5f23c593f524e4affb5c3f67a7f06ce34.gz new file mode 100644 index 0000000000..6e80c8ff0b Binary files /dev/null and b/_darcs/patches/20080610150957-84dde-2aff9cb5f23c593f524e4affb5c3f67a7f06ce34.gz differ diff --git a/_darcs/patches/20080610171303-84dde-1b93542571121331623aa5379ac34ff05896a5d9.gz b/_darcs/patches/20080610171303-84dde-1b93542571121331623aa5379ac34ff05896a5d9.gz new file mode 100644 index 0000000000..be946f37f5 Binary files /dev/null and b/_darcs/patches/20080610171303-84dde-1b93542571121331623aa5379ac34ff05896a5d9.gz differ diff --git a/_darcs/patches/20080610173718-84dde-4591c99e3ff5a414da524929a73b6ffca3b4f350.gz b/_darcs/patches/20080610173718-84dde-4591c99e3ff5a414da524929a73b6ffca3b4f350.gz new file mode 100644 index 0000000000..d0107708d4 Binary files /dev/null and b/_darcs/patches/20080610173718-84dde-4591c99e3ff5a414da524929a73b6ffca3b4f350.gz differ diff --git a/_darcs/patches/20080610185238-84dde-c073065f5f802be39b97a23105613fac1eeb0bea.gz b/_darcs/patches/20080610185238-84dde-c073065f5f802be39b97a23105613fac1eeb0bea.gz new file mode 100644 index 0000000000..e3c62372e4 Binary files /dev/null and b/_darcs/patches/20080610185238-84dde-c073065f5f802be39b97a23105613fac1eeb0bea.gz differ diff --git a/_darcs/patches/20080610185551-84dde-e8352c4f2632b1281684c37dcb27a9005acf22cb.gz b/_darcs/patches/20080610185551-84dde-e8352c4f2632b1281684c37dcb27a9005acf22cb.gz new file mode 100644 index 0000000000..7c95c09ebc Binary files /dev/null and b/_darcs/patches/20080610185551-84dde-e8352c4f2632b1281684c37dcb27a9005acf22cb.gz differ diff --git a/_darcs/patches/20080610185759-84dde-dafb858d36f77cf295d2c869061723b018b4f002.gz b/_darcs/patches/20080610185759-84dde-dafb858d36f77cf295d2c869061723b018b4f002.gz new file mode 100644 index 0000000000..82b3729541 Binary files /dev/null and b/_darcs/patches/20080610185759-84dde-dafb858d36f77cf295d2c869061723b018b4f002.gz differ diff --git a/_darcs/patches/20080610192101-84dde-29ba2cc875b73131bbbbef4cbdfb17965df37677.gz b/_darcs/patches/20080610192101-84dde-29ba2cc875b73131bbbbef4cbdfb17965df37677.gz new file mode 100644 index 0000000000..e406063118 Binary files /dev/null and b/_darcs/patches/20080610192101-84dde-29ba2cc875b73131bbbbef4cbdfb17965df37677.gz differ diff --git a/_darcs/patches/20080610193305-84dde-ef9bfe958f79d8668f14302b22e098f2f8232bc1.gz b/_darcs/patches/20080610193305-84dde-ef9bfe958f79d8668f14302b22e098f2f8232bc1.gz new file mode 100644 index 0000000000..3fb6d15c3a Binary files /dev/null and b/_darcs/patches/20080610193305-84dde-ef9bfe958f79d8668f14302b22e098f2f8232bc1.gz differ diff --git a/_darcs/patches/20080610193520-84dde-300bbdf3d38a7f235ed7b073d8fb29aff76b9c85.gz b/_darcs/patches/20080610193520-84dde-300bbdf3d38a7f235ed7b073d8fb29aff76b9c85.gz new file mode 100644 index 0000000000..5657ac87b0 Binary files /dev/null and b/_darcs/patches/20080610193520-84dde-300bbdf3d38a7f235ed7b073d8fb29aff76b9c85.gz differ diff --git a/_darcs/patches/20080610193649-84dde-a735d4c6fdb6d808f727dc79215e7014523555ee.gz b/_darcs/patches/20080610193649-84dde-a735d4c6fdb6d808f727dc79215e7014523555ee.gz new file mode 100644 index 0000000000..3541d4e9bc Binary files /dev/null and b/_darcs/patches/20080610193649-84dde-a735d4c6fdb6d808f727dc79215e7014523555ee.gz differ diff --git a/_darcs/patches/20080610193854-84dde-5abf4471581cd474bfcf68cab6b72b7a6a9d5930.gz b/_darcs/patches/20080610193854-84dde-5abf4471581cd474bfcf68cab6b72b7a6a9d5930.gz new file mode 100644 index 0000000000..7f845c8d25 Binary files /dev/null and b/_darcs/patches/20080610193854-84dde-5abf4471581cd474bfcf68cab6b72b7a6a9d5930.gz differ diff --git a/_darcs/patches/20080610194243-84dde-dad19548b794cc3d6d549e986bf17aa6b0421199.gz b/_darcs/patches/20080610194243-84dde-dad19548b794cc3d6d549e986bf17aa6b0421199.gz new file mode 100644 index 0000000000..f89d79b0aa Binary files /dev/null and b/_darcs/patches/20080610194243-84dde-dad19548b794cc3d6d549e986bf17aa6b0421199.gz differ diff --git a/_darcs/patches/20080610194553-84dde-adf2c70341bda9e3c06e2513426cddbfdf4c5d53.gz b/_darcs/patches/20080610194553-84dde-adf2c70341bda9e3c06e2513426cddbfdf4c5d53.gz new file mode 100644 index 0000000000..b1a18d8e81 Binary files /dev/null and b/_darcs/patches/20080610194553-84dde-adf2c70341bda9e3c06e2513426cddbfdf4c5d53.gz differ diff --git a/_darcs/patches/20080610195134-84dde-48212ca46f4467ef1bf72a2d49e346dc03308c52.gz b/_darcs/patches/20080610195134-84dde-48212ca46f4467ef1bf72a2d49e346dc03308c52.gz new file mode 100644 index 0000000000..4e987ae94c Binary files /dev/null and b/_darcs/patches/20080610195134-84dde-48212ca46f4467ef1bf72a2d49e346dc03308c52.gz differ diff --git a/_darcs/patches/20080610195502-84dde-7f88fbfc5accd6d91467ddec1356e193728ba059.gz b/_darcs/patches/20080610195502-84dde-7f88fbfc5accd6d91467ddec1356e193728ba059.gz new file mode 100644 index 0000000000..120dbaeb34 Binary files /dev/null and b/_darcs/patches/20080610195502-84dde-7f88fbfc5accd6d91467ddec1356e193728ba059.gz differ diff --git a/_darcs/patches/20080610195920-84dde-39012658cb5f4127d667ac23ddcabd795a337f7e.gz b/_darcs/patches/20080610195920-84dde-39012658cb5f4127d667ac23ddcabd795a337f7e.gz new file mode 100644 index 0000000000..25ebd786fd Binary files /dev/null and b/_darcs/patches/20080610195920-84dde-39012658cb5f4127d667ac23ddcabd795a337f7e.gz differ diff --git a/_darcs/patches/20080610211316-84dde-5ce855db362f0837ddd7f8883471366adeed4c18.gz b/_darcs/patches/20080610211316-84dde-5ce855db362f0837ddd7f8883471366adeed4c18.gz new file mode 100644 index 0000000000..b7f5397ee9 Binary files /dev/null and b/_darcs/patches/20080610211316-84dde-5ce855db362f0837ddd7f8883471366adeed4c18.gz differ diff --git a/_darcs/patches/20080610211614-84dde-34fe91876d37f1a5a6a1368f199378949c56c1b8.gz b/_darcs/patches/20080610211614-84dde-34fe91876d37f1a5a6a1368f199378949c56c1b8.gz new file mode 100644 index 0000000000..da12cb3704 Binary files /dev/null and b/_darcs/patches/20080610211614-84dde-34fe91876d37f1a5a6a1368f199378949c56c1b8.gz differ diff --git a/_darcs/patches/20080610221910-84dde-a3b2252625ac5392ff60f1e975350ed5d2d1145f.gz b/_darcs/patches/20080610221910-84dde-a3b2252625ac5392ff60f1e975350ed5d2d1145f.gz new file mode 100644 index 0000000000..0e5b0422bc Binary files /dev/null and b/_darcs/patches/20080610221910-84dde-a3b2252625ac5392ff60f1e975350ed5d2d1145f.gz differ diff --git a/_darcs/patches/20080610222222-84dde-f17190f0da05f65ba0d0030d39c97dfec701b624.gz b/_darcs/patches/20080610222222-84dde-f17190f0da05f65ba0d0030d39c97dfec701b624.gz new file mode 100644 index 0000000000..14b5e482d7 Binary files /dev/null and b/_darcs/patches/20080610222222-84dde-f17190f0da05f65ba0d0030d39c97dfec701b624.gz differ diff --git a/_darcs/patches/20080610222547-84dde-7606c2f575ba482fef17a9ef306789c047aaddec.gz b/_darcs/patches/20080610222547-84dde-7606c2f575ba482fef17a9ef306789c047aaddec.gz new file mode 100644 index 0000000000..b9110f8387 Binary files /dev/null and b/_darcs/patches/20080610222547-84dde-7606c2f575ba482fef17a9ef306789c047aaddec.gz differ diff --git a/_darcs/patches/20080611014547-84dde-160f7b7711bc7e8a41fd2126f2f2ae8b499547cd.gz b/_darcs/patches/20080611014547-84dde-160f7b7711bc7e8a41fd2126f2f2ae8b499547cd.gz new file mode 100644 index 0000000000..45301f7684 Binary files /dev/null and b/_darcs/patches/20080611014547-84dde-160f7b7711bc7e8a41fd2126f2f2ae8b499547cd.gz differ diff --git a/_darcs/patches/20080611014616-84dde-49b6bdf4fde099282ea1b24da1091e8fe9a70f07.gz b/_darcs/patches/20080611014616-84dde-49b6bdf4fde099282ea1b24da1091e8fe9a70f07.gz new file mode 100644 index 0000000000..6325e98ef0 Binary files /dev/null and b/_darcs/patches/20080611014616-84dde-49b6bdf4fde099282ea1b24da1091e8fe9a70f07.gz differ diff --git a/_darcs/patches/20080611015609-84dde-e2789990adb9a166aa76d119b1e941dbf18fbcc9.gz b/_darcs/patches/20080611015609-84dde-e2789990adb9a166aa76d119b1e941dbf18fbcc9.gz new file mode 100644 index 0000000000..a56384f173 Binary files /dev/null and b/_darcs/patches/20080611015609-84dde-e2789990adb9a166aa76d119b1e941dbf18fbcc9.gz differ diff --git a/_darcs/patches/20080611020810-84dde-32ab3b9e25532b92156d093dcf2ad24134cbcf4f.gz b/_darcs/patches/20080611020810-84dde-32ab3b9e25532b92156d093dcf2ad24134cbcf4f.gz new file mode 100644 index 0000000000..4e0c5b4bc5 Binary files /dev/null and b/_darcs/patches/20080611020810-84dde-32ab3b9e25532b92156d093dcf2ad24134cbcf4f.gz differ diff --git a/_darcs/patches/20080611022900-84dde-63cade69e8f65fd067b5e0c54caac080e03df979.gz b/_darcs/patches/20080611022900-84dde-63cade69e8f65fd067b5e0c54caac080e03df979.gz new file mode 100644 index 0000000000..c8e6a5d429 Binary files /dev/null and b/_darcs/patches/20080611022900-84dde-63cade69e8f65fd067b5e0c54caac080e03df979.gz differ diff --git a/_darcs/patches/20080611023246-84dde-cd0a768e95af336cada91fc28246ae4d100bb854.gz b/_darcs/patches/20080611023246-84dde-cd0a768e95af336cada91fc28246ae4d100bb854.gz new file mode 100644 index 0000000000..0fe7e36996 Binary files /dev/null and b/_darcs/patches/20080611023246-84dde-cd0a768e95af336cada91fc28246ae4d100bb854.gz differ diff --git a/_darcs/patches/20080611141824-84dde-a1016e113f7ba0e32685d935cd57618c60db2265.gz b/_darcs/patches/20080611141824-84dde-a1016e113f7ba0e32685d935cd57618c60db2265.gz new file mode 100644 index 0000000000..4a667867b5 Binary files /dev/null and b/_darcs/patches/20080611141824-84dde-a1016e113f7ba0e32685d935cd57618c60db2265.gz differ diff --git a/_darcs/patches/20080611155258-84dde-7afab3908ff3464975f8478fcd41f065466170ae.gz b/_darcs/patches/20080611155258-84dde-7afab3908ff3464975f8478fcd41f065466170ae.gz new file mode 100644 index 0000000000..fe1587490e Binary files /dev/null and b/_darcs/patches/20080611155258-84dde-7afab3908ff3464975f8478fcd41f065466170ae.gz differ diff --git a/_darcs/patches/20080611155649-84dde-6200d33e93ed13278c22833d1225e3b9eb44b9b5.gz b/_darcs/patches/20080611155649-84dde-6200d33e93ed13278c22833d1225e3b9eb44b9b5.gz new file mode 100644 index 0000000000..d2f42cfe82 Binary files /dev/null and b/_darcs/patches/20080611155649-84dde-6200d33e93ed13278c22833d1225e3b9eb44b9b5.gz differ diff --git a/_darcs/patches/20080611160318-84dde-d3c9a5c19651cc188420d7e0974e25e90d88c780.gz b/_darcs/patches/20080611160318-84dde-d3c9a5c19651cc188420d7e0974e25e90d88c780.gz new file mode 100644 index 0000000000..f46800b137 Binary files /dev/null and b/_darcs/patches/20080611160318-84dde-d3c9a5c19651cc188420d7e0974e25e90d88c780.gz differ diff --git a/_darcs/patches/20080611160520-84dde-6e5b2d12cd9f0f601ffd57bc68246df738d6145a.gz b/_darcs/patches/20080611160520-84dde-6e5b2d12cd9f0f601ffd57bc68246df738d6145a.gz new file mode 100644 index 0000000000..9890be2386 Binary files /dev/null and b/_darcs/patches/20080611160520-84dde-6e5b2d12cd9f0f601ffd57bc68246df738d6145a.gz differ diff --git a/_darcs/patches/20080611162118-84dde-66a961cc25da36aad75652c5612b583247139eee.gz b/_darcs/patches/20080611162118-84dde-66a961cc25da36aad75652c5612b583247139eee.gz new file mode 100644 index 0000000000..724f396581 Binary files /dev/null and b/_darcs/patches/20080611162118-84dde-66a961cc25da36aad75652c5612b583247139eee.gz differ diff --git a/_darcs/patches/20080611163308-84dde-c918f04fe6bba3dd382b822ef59cb70a57bb9504.gz b/_darcs/patches/20080611163308-84dde-c918f04fe6bba3dd382b822ef59cb70a57bb9504.gz new file mode 100644 index 0000000000..12c9f5b080 Binary files /dev/null and b/_darcs/patches/20080611163308-84dde-c918f04fe6bba3dd382b822ef59cb70a57bb9504.gz differ diff --git a/_darcs/patches/20080611163645-84dde-f50f3f9b8230390565485d449a22dfddefd8f61d.gz b/_darcs/patches/20080611163645-84dde-f50f3f9b8230390565485d449a22dfddefd8f61d.gz new file mode 100644 index 0000000000..65b6073308 Binary files /dev/null and b/_darcs/patches/20080611163645-84dde-f50f3f9b8230390565485d449a22dfddefd8f61d.gz differ diff --git a/_darcs/patches/20080611170624-84dde-25c41cf9b285b65fecd67e8496c85c225df95ef9.gz b/_darcs/patches/20080611170624-84dde-25c41cf9b285b65fecd67e8496c85c225df95ef9.gz new file mode 100644 index 0000000000..723e9c63d8 Binary files /dev/null and b/_darcs/patches/20080611170624-84dde-25c41cf9b285b65fecd67e8496c85c225df95ef9.gz differ diff --git a/_darcs/patches/20080611170723-84dde-57fceb85b2db112733d0e90906765927277fd514.gz b/_darcs/patches/20080611170723-84dde-57fceb85b2db112733d0e90906765927277fd514.gz new file mode 100644 index 0000000000..5f1433cb64 Binary files /dev/null and b/_darcs/patches/20080611170723-84dde-57fceb85b2db112733d0e90906765927277fd514.gz differ diff --git a/_darcs/patches/20080611171009-84dde-54dc9de5d799d77950e09233fda6939e76c15247.gz b/_darcs/patches/20080611171009-84dde-54dc9de5d799d77950e09233fda6939e76c15247.gz new file mode 100644 index 0000000000..576a753ce3 Binary files /dev/null and b/_darcs/patches/20080611171009-84dde-54dc9de5d799d77950e09233fda6939e76c15247.gz differ diff --git a/_darcs/patches/20080611171351-84dde-1064792078b90c754de06132e610c8575663afb1.gz b/_darcs/patches/20080611171351-84dde-1064792078b90c754de06132e610c8575663afb1.gz new file mode 100644 index 0000000000..ec8657b23c Binary files /dev/null and b/_darcs/patches/20080611171351-84dde-1064792078b90c754de06132e610c8575663afb1.gz differ diff --git a/_darcs/patches/20080611181334-84dde-e9045179a94f8c78af9d660c57a37ce6f5fc9776.gz b/_darcs/patches/20080611181334-84dde-e9045179a94f8c78af9d660c57a37ce6f5fc9776.gz new file mode 100644 index 0000000000..da411ce21d Binary files /dev/null and b/_darcs/patches/20080611181334-84dde-e9045179a94f8c78af9d660c57a37ce6f5fc9776.gz differ diff --git a/_darcs/patches/20080611183634-84dde-97119e7ef1abb01f6ce8723955dc5d6e06e644a8.gz b/_darcs/patches/20080611183634-84dde-97119e7ef1abb01f6ce8723955dc5d6e06e644a8.gz new file mode 100644 index 0000000000..622962338d Binary files /dev/null and b/_darcs/patches/20080611183634-84dde-97119e7ef1abb01f6ce8723955dc5d6e06e644a8.gz differ diff --git a/_darcs/patches/20080611184128-84dde-2671b7837a6285840cbc70d301241cbcd51bb711.gz b/_darcs/patches/20080611184128-84dde-2671b7837a6285840cbc70d301241cbcd51bb711.gz new file mode 100644 index 0000000000..53c8e685dc Binary files /dev/null and b/_darcs/patches/20080611184128-84dde-2671b7837a6285840cbc70d301241cbcd51bb711.gz differ diff --git a/_darcs/patches/20080611190230-84dde-78ff0d6f6c370a33aabc4f0053651b6629f85499.gz b/_darcs/patches/20080611190230-84dde-78ff0d6f6c370a33aabc4f0053651b6629f85499.gz new file mode 100644 index 0000000000..5faa894c0f Binary files /dev/null and b/_darcs/patches/20080611190230-84dde-78ff0d6f6c370a33aabc4f0053651b6629f85499.gz differ diff --git a/_darcs/patches/20080612015858-84dde-28a67b8a2204cd23ef2fe78ffa19ca1ded13887f.gz b/_darcs/patches/20080612015858-84dde-28a67b8a2204cd23ef2fe78ffa19ca1ded13887f.gz new file mode 100644 index 0000000000..1407e709d2 Binary files /dev/null and b/_darcs/patches/20080612015858-84dde-28a67b8a2204cd23ef2fe78ffa19ca1ded13887f.gz differ diff --git a/_darcs/patches/20080612020408-84dde-4a8518ea1c0a71b1b6268d47c70657ab52a2ab3f.gz b/_darcs/patches/20080612020408-84dde-4a8518ea1c0a71b1b6268d47c70657ab52a2ab3f.gz new file mode 100644 index 0000000000..4a7e34f736 Binary files /dev/null and b/_darcs/patches/20080612020408-84dde-4a8518ea1c0a71b1b6268d47c70657ab52a2ab3f.gz differ diff --git a/_darcs/patches/20080612165201-84dde-1abc45a0b2fd24002bc6f3449e9fc521d4f02eac.gz b/_darcs/patches/20080612165201-84dde-1abc45a0b2fd24002bc6f3449e9fc521d4f02eac.gz new file mode 100644 index 0000000000..05b5fbd8b6 Binary files /dev/null and b/_darcs/patches/20080612165201-84dde-1abc45a0b2fd24002bc6f3449e9fc521d4f02eac.gz differ diff --git a/_darcs/patches/20080612174453-84dde-035da48b74c9148d6dbdd4650c713f434419e9e6.gz b/_darcs/patches/20080612174453-84dde-035da48b74c9148d6dbdd4650c713f434419e9e6.gz new file mode 100644 index 0000000000..63229b07ce Binary files /dev/null and b/_darcs/patches/20080612174453-84dde-035da48b74c9148d6dbdd4650c713f434419e9e6.gz differ diff --git a/_darcs/patches/20080612184028-84dde-1f919ab373e5731efd403986ae760116769566d9.gz b/_darcs/patches/20080612184028-84dde-1f919ab373e5731efd403986ae760116769566d9.gz new file mode 100644 index 0000000000..4559346680 Binary files /dev/null and b/_darcs/patches/20080612184028-84dde-1f919ab373e5731efd403986ae760116769566d9.gz differ diff --git a/_darcs/patches/20080612185322-84dde-b14d4cbc90f3b5b04931e4b5d3c20f027abb609c.gz b/_darcs/patches/20080612185322-84dde-b14d4cbc90f3b5b04931e4b5d3c20f027abb609c.gz new file mode 100644 index 0000000000..142d52bf46 Binary files /dev/null and b/_darcs/patches/20080612185322-84dde-b14d4cbc90f3b5b04931e4b5d3c20f027abb609c.gz differ diff --git a/_darcs/patches/20080612190447-84dde-f5752112cd129b44719114e56bec7f3745c665fd.gz b/_darcs/patches/20080612190447-84dde-f5752112cd129b44719114e56bec7f3745c665fd.gz new file mode 100644 index 0000000000..80b605a73e Binary files /dev/null and b/_darcs/patches/20080612190447-84dde-f5752112cd129b44719114e56bec7f3745c665fd.gz differ diff --git a/_darcs/patches/20080612191606-84dde-653d6707f79b18c5e92defb6d35f7af088655137.gz b/_darcs/patches/20080612191606-84dde-653d6707f79b18c5e92defb6d35f7af088655137.gz new file mode 100644 index 0000000000..c8fce73847 Binary files /dev/null and b/_darcs/patches/20080612191606-84dde-653d6707f79b18c5e92defb6d35f7af088655137.gz differ diff --git a/_darcs/patches/20080612192221-84dde-1c39a22068e64dc3dee8902a730a6f1264728874.gz b/_darcs/patches/20080612192221-84dde-1c39a22068e64dc3dee8902a730a6f1264728874.gz new file mode 100644 index 0000000000..a7bc3cad21 Binary files /dev/null and b/_darcs/patches/20080612192221-84dde-1c39a22068e64dc3dee8902a730a6f1264728874.gz differ diff --git a/_darcs/patches/20080612192650-84dde-3bab08162d9e1e6def8712070c509306227ee645.gz b/_darcs/patches/20080612192650-84dde-3bab08162d9e1e6def8712070c509306227ee645.gz new file mode 100644 index 0000000000..90219ac4d3 Binary files /dev/null and b/_darcs/patches/20080612192650-84dde-3bab08162d9e1e6def8712070c509306227ee645.gz differ diff --git a/_darcs/patches/20080612193945-84dde-2c368ba1273814401f741ef79333c0cd8a43f90d.gz b/_darcs/patches/20080612193945-84dde-2c368ba1273814401f741ef79333c0cd8a43f90d.gz new file mode 100644 index 0000000000..415c57f3bd Binary files /dev/null and b/_darcs/patches/20080612193945-84dde-2c368ba1273814401f741ef79333c0cd8a43f90d.gz differ diff --git a/_darcs/patches/20080612194656-84dde-d4cc2ac343b17502adf7c6190145d5041f554420.gz b/_darcs/patches/20080612194656-84dde-d4cc2ac343b17502adf7c6190145d5041f554420.gz new file mode 100644 index 0000000000..036d24eb59 Binary files /dev/null and b/_darcs/patches/20080612194656-84dde-d4cc2ac343b17502adf7c6190145d5041f554420.gz differ diff --git a/_darcs/patches/20080612195324-84dde-cab5efa3218f3cd3632ced1c819a5be2edb3c5a0.gz b/_darcs/patches/20080612195324-84dde-cab5efa3218f3cd3632ced1c819a5be2edb3c5a0.gz new file mode 100644 index 0000000000..e8c1e0977a Binary files /dev/null and b/_darcs/patches/20080612195324-84dde-cab5efa3218f3cd3632ced1c819a5be2edb3c5a0.gz differ diff --git a/_darcs/patches/20080612200424-84dde-b96bf533612308e0ecd695365802f3da3f2601a4.gz b/_darcs/patches/20080612200424-84dde-b96bf533612308e0ecd695365802f3da3f2601a4.gz new file mode 100644 index 0000000000..471d72cc63 Binary files /dev/null and b/_darcs/patches/20080612200424-84dde-b96bf533612308e0ecd695365802f3da3f2601a4.gz differ diff --git a/_darcs/patches/20080613144913-84dde-3e970b4e6f19ea1e0db09d7ab133a6c148be7a75.gz b/_darcs/patches/20080613144913-84dde-3e970b4e6f19ea1e0db09d7ab133a6c148be7a75.gz new file mode 100644 index 0000000000..4e15894f03 Binary files /dev/null and b/_darcs/patches/20080613144913-84dde-3e970b4e6f19ea1e0db09d7ab133a6c148be7a75.gz differ diff --git a/_darcs/patches/20080613152420-84dde-76da80c7345815986ee47fab45dcbde2bad895ab.gz b/_darcs/patches/20080613152420-84dde-76da80c7345815986ee47fab45dcbde2bad895ab.gz new file mode 100644 index 0000000000..5d142ba5b0 Binary files /dev/null and b/_darcs/patches/20080613152420-84dde-76da80c7345815986ee47fab45dcbde2bad895ab.gz differ diff --git a/_darcs/patches/20080613152520-84dde-20e2d44633ba9c3953db12ebd080a7bd0296e9d4.gz b/_darcs/patches/20080613152520-84dde-20e2d44633ba9c3953db12ebd080a7bd0296e9d4.gz new file mode 100644 index 0000000000..2c3a80f31c Binary files /dev/null and b/_darcs/patches/20080613152520-84dde-20e2d44633ba9c3953db12ebd080a7bd0296e9d4.gz differ diff --git a/_darcs/patches/20080613153012-84dde-3b5b4670681fc40dc62d82a1609ebca69a921bda.gz b/_darcs/patches/20080613153012-84dde-3b5b4670681fc40dc62d82a1609ebca69a921bda.gz new file mode 100644 index 0000000000..6d92e10297 Binary files /dev/null and b/_darcs/patches/20080613153012-84dde-3b5b4670681fc40dc62d82a1609ebca69a921bda.gz differ diff --git a/_darcs/patches/20080613153303-84dde-556ed40d75c3701df3a3ce7b5415896f9ac66d12.gz b/_darcs/patches/20080613153303-84dde-556ed40d75c3701df3a3ce7b5415896f9ac66d12.gz new file mode 100644 index 0000000000..5b72c0ec78 Binary files /dev/null and b/_darcs/patches/20080613153303-84dde-556ed40d75c3701df3a3ce7b5415896f9ac66d12.gz differ diff --git a/_darcs/patches/20080613154632-84dde-d2eec5c1472d76eb5d3e8eb253b6a3572a8f721b.gz b/_darcs/patches/20080613154632-84dde-d2eec5c1472d76eb5d3e8eb253b6a3572a8f721b.gz new file mode 100644 index 0000000000..a724590897 Binary files /dev/null and b/_darcs/patches/20080613154632-84dde-d2eec5c1472d76eb5d3e8eb253b6a3572a8f721b.gz differ diff --git a/_darcs/patches/20080613155540-84dde-5ce1ea63b57e3422f1f42f853ba34099d4b85992.gz b/_darcs/patches/20080613155540-84dde-5ce1ea63b57e3422f1f42f853ba34099d4b85992.gz new file mode 100644 index 0000000000..6d6c0a1c65 Binary files /dev/null and b/_darcs/patches/20080613155540-84dde-5ce1ea63b57e3422f1f42f853ba34099d4b85992.gz differ diff --git a/_darcs/patches/20080613171538-84dde-ffd6abee1ae304e55f4ff4224dfebf4be8fff0fd.gz b/_darcs/patches/20080613171538-84dde-ffd6abee1ae304e55f4ff4224dfebf4be8fff0fd.gz new file mode 100644 index 0000000000..1d4dce6d70 Binary files /dev/null and b/_darcs/patches/20080613171538-84dde-ffd6abee1ae304e55f4ff4224dfebf4be8fff0fd.gz differ diff --git a/_darcs/patches/20080613175344-84dde-253b5b55ea8ae85b807cba2e23ea885c6bbb0b8f.gz b/_darcs/patches/20080613175344-84dde-253b5b55ea8ae85b807cba2e23ea885c6bbb0b8f.gz new file mode 100644 index 0000000000..ed149c0656 Binary files /dev/null and b/_darcs/patches/20080613175344-84dde-253b5b55ea8ae85b807cba2e23ea885c6bbb0b8f.gz differ diff --git a/_darcs/patches/20080613183325-84dde-cef08cb550ece879eae52008906cdf71bc6d5c17.gz b/_darcs/patches/20080613183325-84dde-cef08cb550ece879eae52008906cdf71bc6d5c17.gz new file mode 100644 index 0000000000..1ae2fee607 Binary files /dev/null and b/_darcs/patches/20080613183325-84dde-cef08cb550ece879eae52008906cdf71bc6d5c17.gz differ diff --git a/_darcs/patches/20080613184638-84dde-aa7059348899949f3e0c6cfa02d08c41458384a1.gz b/_darcs/patches/20080613184638-84dde-aa7059348899949f3e0c6cfa02d08c41458384a1.gz new file mode 100644 index 0000000000..d12ace08b0 Binary files /dev/null and b/_darcs/patches/20080613184638-84dde-aa7059348899949f3e0c6cfa02d08c41458384a1.gz differ diff --git a/_darcs/patches/20080613184833-84dde-560f55c55492f909c3a5a0948e4ef3b072208bcd.gz b/_darcs/patches/20080613184833-84dde-560f55c55492f909c3a5a0948e4ef3b072208bcd.gz new file mode 100644 index 0000000000..4784e76488 Binary files /dev/null and b/_darcs/patches/20080613184833-84dde-560f55c55492f909c3a5a0948e4ef3b072208bcd.gz differ diff --git a/_darcs/patches/20080614122038-84dde-af7c2be04d41c1d85b62cf74724fe8e4a877a84a.gz b/_darcs/patches/20080614122038-84dde-af7c2be04d41c1d85b62cf74724fe8e4a877a84a.gz new file mode 100644 index 0000000000..0a15918a12 Binary files /dev/null and b/_darcs/patches/20080614122038-84dde-af7c2be04d41c1d85b62cf74724fe8e4a877a84a.gz differ diff --git a/_darcs/patches/20080614122155-84dde-81e6de701ce6e7171a252b0b8ad442373b3bb24a.gz b/_darcs/patches/20080614122155-84dde-81e6de701ce6e7171a252b0b8ad442373b3bb24a.gz new file mode 100644 index 0000000000..7848ea2f61 Binary files /dev/null and b/_darcs/patches/20080614122155-84dde-81e6de701ce6e7171a252b0b8ad442373b3bb24a.gz differ diff --git a/_darcs/patches/20080614122517-84dde-c78fbdd9c3329e87f405040e851650a81ab63d5c.gz b/_darcs/patches/20080614122517-84dde-c78fbdd9c3329e87f405040e851650a81ab63d5c.gz new file mode 100644 index 0000000000..22faa01971 Binary files /dev/null and b/_darcs/patches/20080614122517-84dde-c78fbdd9c3329e87f405040e851650a81ab63d5c.gz differ diff --git a/_darcs/patches/20080615014742-84dde-d39f4c7744dc430fdb4ad64a172ffe3e909ee4a0.gz b/_darcs/patches/20080615014742-84dde-d39f4c7744dc430fdb4ad64a172ffe3e909ee4a0.gz new file mode 100644 index 0000000000..be52963fe0 Binary files /dev/null and b/_darcs/patches/20080615014742-84dde-d39f4c7744dc430fdb4ad64a172ffe3e909ee4a0.gz differ diff --git a/_darcs/patches/20080615021852-84dde-38b250ba3bf4c437e7151290c8de543b519722c6.gz b/_darcs/patches/20080615021852-84dde-38b250ba3bf4c437e7151290c8de543b519722c6.gz new file mode 100644 index 0000000000..2b905f63ed Binary files /dev/null and b/_darcs/patches/20080615021852-84dde-38b250ba3bf4c437e7151290c8de543b519722c6.gz differ diff --git a/_darcs/patches/20080615030202-84dde-ebed7919c227ce280dc818f301e15001eb8b5926.gz b/_darcs/patches/20080615030202-84dde-ebed7919c227ce280dc818f301e15001eb8b5926.gz new file mode 100644 index 0000000000..872b7e4402 Binary files /dev/null and b/_darcs/patches/20080615030202-84dde-ebed7919c227ce280dc818f301e15001eb8b5926.gz differ diff --git a/_darcs/patches/20080615030319-84dde-3dc38d515b029424027c3160e06e62ce8b7dd29a.gz b/_darcs/patches/20080615030319-84dde-3dc38d515b029424027c3160e06e62ce8b7dd29a.gz new file mode 100644 index 0000000000..d49cdc139c Binary files /dev/null and b/_darcs/patches/20080615030319-84dde-3dc38d515b029424027c3160e06e62ce8b7dd29a.gz differ diff --git a/_darcs/patches/20080615035012-84dde-0450954528a270f46a4ac5d2b077af793ba8c1f3.gz b/_darcs/patches/20080615035012-84dde-0450954528a270f46a4ac5d2b077af793ba8c1f3.gz new file mode 100644 index 0000000000..e1bc94d177 Binary files /dev/null and b/_darcs/patches/20080615035012-84dde-0450954528a270f46a4ac5d2b077af793ba8c1f3.gz differ diff --git a/_darcs/patches/20080615035510-84dde-3026b20678070004d8e8439d5e08e01ee6ef2b8b.gz b/_darcs/patches/20080615035510-84dde-3026b20678070004d8e8439d5e08e01ee6ef2b8b.gz new file mode 100644 index 0000000000..0bf041a64f Binary files /dev/null and b/_darcs/patches/20080615035510-84dde-3026b20678070004d8e8439d5e08e01ee6ef2b8b.gz differ diff --git a/_darcs/patches/20080615152047-84dde-eca46b9a1e3e0adb81a29d1b43bf87ee93e4f535.gz b/_darcs/patches/20080615152047-84dde-eca46b9a1e3e0adb81a29d1b43bf87ee93e4f535.gz new file mode 100644 index 0000000000..fa0c299643 Binary files /dev/null and b/_darcs/patches/20080615152047-84dde-eca46b9a1e3e0adb81a29d1b43bf87ee93e4f535.gz differ diff --git a/_darcs/patches/20080615153123-84dde-6153ed4ad0cce6908a103a507e6f6ffcf23620f2.gz b/_darcs/patches/20080615153123-84dde-6153ed4ad0cce6908a103a507e6f6ffcf23620f2.gz new file mode 100644 index 0000000000..8805dfb4c8 Binary files /dev/null and b/_darcs/patches/20080615153123-84dde-6153ed4ad0cce6908a103a507e6f6ffcf23620f2.gz differ diff --git a/_darcs/patches/20080617043650-84dde-cef7662e9dff3ac0a1187586fc4cdcfca1d08087.gz b/_darcs/patches/20080617043650-84dde-cef7662e9dff3ac0a1187586fc4cdcfca1d08087.gz new file mode 100644 index 0000000000..4791647eae Binary files /dev/null and b/_darcs/patches/20080617043650-84dde-cef7662e9dff3ac0a1187586fc4cdcfca1d08087.gz differ diff --git a/_darcs/patches/20080617044054-84dde-67eb7cd429c8f5bef64273c73a58dcb43816de02.gz b/_darcs/patches/20080617044054-84dde-67eb7cd429c8f5bef64273c73a58dcb43816de02.gz new file mode 100644 index 0000000000..71f7adf971 Binary files /dev/null and b/_darcs/patches/20080617044054-84dde-67eb7cd429c8f5bef64273c73a58dcb43816de02.gz differ diff --git a/_darcs/patches/20080617121642-84dde-e4fc7c2887bbd759c8221063c6b9b3d09d219985.gz b/_darcs/patches/20080617121642-84dde-e4fc7c2887bbd759c8221063c6b9b3d09d219985.gz new file mode 100644 index 0000000000..8e3b82ff5c Binary files /dev/null and b/_darcs/patches/20080617121642-84dde-e4fc7c2887bbd759c8221063c6b9b3d09d219985.gz differ diff --git a/_darcs/patches/20080617133501-84dde-adec156ac58b84cce41ae0e9bde58cf7637e6c42.gz b/_darcs/patches/20080617133501-84dde-adec156ac58b84cce41ae0e9bde58cf7637e6c42.gz new file mode 100644 index 0000000000..012d35085f Binary files /dev/null and b/_darcs/patches/20080617133501-84dde-adec156ac58b84cce41ae0e9bde58cf7637e6c42.gz differ diff --git a/_darcs/patches/20080617133539-84dde-fdf6176d8c4f45de1c228224b0ea881b78c0c68a.gz b/_darcs/patches/20080617133539-84dde-fdf6176d8c4f45de1c228224b0ea881b78c0c68a.gz new file mode 100644 index 0000000000..df9948f5ee Binary files /dev/null and b/_darcs/patches/20080617133539-84dde-fdf6176d8c4f45de1c228224b0ea881b78c0c68a.gz differ diff --git a/_darcs/patches/20080617133941-84dde-556a7935411ba955d36f7eab90570dc8398aa5cf.gz b/_darcs/patches/20080617133941-84dde-556a7935411ba955d36f7eab90570dc8398aa5cf.gz new file mode 100644 index 0000000000..2a2db80e6f Binary files /dev/null and b/_darcs/patches/20080617133941-84dde-556a7935411ba955d36f7eab90570dc8398aa5cf.gz differ diff --git a/_darcs/patches/20080617144942-84dde-a2a1040a42254903a64cff0aae3c1912ed951473.gz b/_darcs/patches/20080617144942-84dde-a2a1040a42254903a64cff0aae3c1912ed951473.gz new file mode 100644 index 0000000000..340f0f73f9 Binary files /dev/null and b/_darcs/patches/20080617144942-84dde-a2a1040a42254903a64cff0aae3c1912ed951473.gz differ diff --git a/_darcs/patches/20080617145140-84dde-76c88b7b9cc8caf54d8f8b60fe7fbd3bb0ad2c39.gz b/_darcs/patches/20080617145140-84dde-76c88b7b9cc8caf54d8f8b60fe7fbd3bb0ad2c39.gz new file mode 100644 index 0000000000..dfb4ea90dc Binary files /dev/null and b/_darcs/patches/20080617145140-84dde-76c88b7b9cc8caf54d8f8b60fe7fbd3bb0ad2c39.gz differ diff --git a/_darcs/patches/20080617150509-84dde-3534c0a188ee3c81ca5597e8f5eba75d5ed5383e.gz b/_darcs/patches/20080617150509-84dde-3534c0a188ee3c81ca5597e8f5eba75d5ed5383e.gz new file mode 100644 index 0000000000..3eef1f00bf Binary files /dev/null and b/_darcs/patches/20080617150509-84dde-3534c0a188ee3c81ca5597e8f5eba75d5ed5383e.gz differ diff --git a/_darcs/patches/20080617150656-84dde-ebeaab4cd8c8c52ba27a2fc8cee177ede9b63246.gz b/_darcs/patches/20080617150656-84dde-ebeaab4cd8c8c52ba27a2fc8cee177ede9b63246.gz new file mode 100644 index 0000000000..205b6b2b74 Binary files /dev/null and b/_darcs/patches/20080617150656-84dde-ebeaab4cd8c8c52ba27a2fc8cee177ede9b63246.gz differ diff --git a/_darcs/patches/20080617151249-84dde-49ae79fe369b0a6917fa9d0f2abd907bb13ba389.gz b/_darcs/patches/20080617151249-84dde-49ae79fe369b0a6917fa9d0f2abd907bb13ba389.gz new file mode 100644 index 0000000000..7777a9c6a6 Binary files /dev/null and b/_darcs/patches/20080617151249-84dde-49ae79fe369b0a6917fa9d0f2abd907bb13ba389.gz differ diff --git a/_darcs/patches/20080617152051-84dde-bc311c05a6cb15cdc5ac52f56964fa98f42f3927.gz b/_darcs/patches/20080617152051-84dde-bc311c05a6cb15cdc5ac52f56964fa98f42f3927.gz new file mode 100644 index 0000000000..5a14ea354b Binary files /dev/null and b/_darcs/patches/20080617152051-84dde-bc311c05a6cb15cdc5ac52f56964fa98f42f3927.gz differ diff --git a/_darcs/patches/20080617152444-84dde-726e19c7b503143b201b9008b21768729603c302.gz b/_darcs/patches/20080617152444-84dde-726e19c7b503143b201b9008b21768729603c302.gz new file mode 100644 index 0000000000..ed067b619b Binary files /dev/null and b/_darcs/patches/20080617152444-84dde-726e19c7b503143b201b9008b21768729603c302.gz differ diff --git a/_darcs/patches/20080618015146-84dde-9d08f680cf68bbb677d7944af2ffd2e7520c6997.gz b/_darcs/patches/20080618015146-84dde-9d08f680cf68bbb677d7944af2ffd2e7520c6997.gz new file mode 100644 index 0000000000..b79cf03504 Binary files /dev/null and b/_darcs/patches/20080618015146-84dde-9d08f680cf68bbb677d7944af2ffd2e7520c6997.gz differ diff --git a/_darcs/patches/20080618015423-84dde-3644c6b25bf00333b5d2eb495b6740c1c26751b1.gz b/_darcs/patches/20080618015423-84dde-3644c6b25bf00333b5d2eb495b6740c1c26751b1.gz new file mode 100644 index 0000000000..0597a3a0e3 Binary files /dev/null and b/_darcs/patches/20080618015423-84dde-3644c6b25bf00333b5d2eb495b6740c1c26751b1.gz differ diff --git a/_darcs/patches/20080618025253-84dde-3a9f3dceccc366b069b931b4159d8160c1ad62ce.gz b/_darcs/patches/20080618025253-84dde-3a9f3dceccc366b069b931b4159d8160c1ad62ce.gz new file mode 100644 index 0000000000..6eafc69120 Binary files /dev/null and b/_darcs/patches/20080618025253-84dde-3a9f3dceccc366b069b931b4159d8160c1ad62ce.gz differ diff --git a/_darcs/patches/20080618030019-84dde-194b5591d9da98c74a513db540b802ed56455ae1.gz b/_darcs/patches/20080618030019-84dde-194b5591d9da98c74a513db540b802ed56455ae1.gz new file mode 100644 index 0000000000..f4eab8d2b0 Binary files /dev/null and b/_darcs/patches/20080618030019-84dde-194b5591d9da98c74a513db540b802ed56455ae1.gz differ diff --git a/_darcs/patches/20080618035739-84dde-a562cffe186780d5f03cf53798ea249b2bda9fb1.gz b/_darcs/patches/20080618035739-84dde-a562cffe186780d5f03cf53798ea249b2bda9fb1.gz new file mode 100644 index 0000000000..ca2481eb0c Binary files /dev/null and b/_darcs/patches/20080618035739-84dde-a562cffe186780d5f03cf53798ea249b2bda9fb1.gz differ diff --git a/_darcs/patches/20080618052638-84dde-909e51dbd5b9eadadf18cd010868baa18ea2349a.gz b/_darcs/patches/20080618052638-84dde-909e51dbd5b9eadadf18cd010868baa18ea2349a.gz new file mode 100644 index 0000000000..2d61eb343e Binary files /dev/null and b/_darcs/patches/20080618052638-84dde-909e51dbd5b9eadadf18cd010868baa18ea2349a.gz differ diff --git a/_darcs/patches/20080618054847-84dde-2057020f22c3179fb93d5a3a7377e4f04bb74c83.gz b/_darcs/patches/20080618054847-84dde-2057020f22c3179fb93d5a3a7377e4f04bb74c83.gz new file mode 100644 index 0000000000..07def6b505 Binary files /dev/null and b/_darcs/patches/20080618054847-84dde-2057020f22c3179fb93d5a3a7377e4f04bb74c83.gz differ diff --git a/_darcs/patches/20080618055349-84dde-8ac49632d06a7b271d13912d46d26c7c1f1ec793.gz b/_darcs/patches/20080618055349-84dde-8ac49632d06a7b271d13912d46d26c7c1f1ec793.gz new file mode 100644 index 0000000000..ee6eaa39b2 Binary files /dev/null and b/_darcs/patches/20080618055349-84dde-8ac49632d06a7b271d13912d46d26c7c1f1ec793.gz differ diff --git a/_darcs/patches/20080618055657-84dde-269a234dd68867ca4f159031fe206e31131ef108.gz b/_darcs/patches/20080618055657-84dde-269a234dd68867ca4f159031fe206e31131ef108.gz new file mode 100644 index 0000000000..25f7af80a6 Binary files /dev/null and b/_darcs/patches/20080618055657-84dde-269a234dd68867ca4f159031fe206e31131ef108.gz differ diff --git a/_darcs/patches/20080618055836-84dde-7a0c460ec125581b659df39c8a079b9fcdc8dbaa.gz b/_darcs/patches/20080618055836-84dde-7a0c460ec125581b659df39c8a079b9fcdc8dbaa.gz new file mode 100644 index 0000000000..ecc4fb2d3a Binary files /dev/null and b/_darcs/patches/20080618055836-84dde-7a0c460ec125581b659df39c8a079b9fcdc8dbaa.gz differ diff --git a/_darcs/patches/20080618060549-84dde-d32f1f167a69ea4f98f6a4a2f2ac753675e8cafd.gz b/_darcs/patches/20080618060549-84dde-d32f1f167a69ea4f98f6a4a2f2ac753675e8cafd.gz new file mode 100644 index 0000000000..826cbd9814 Binary files /dev/null and b/_darcs/patches/20080618060549-84dde-d32f1f167a69ea4f98f6a4a2f2ac753675e8cafd.gz differ diff --git a/_darcs/patches/20080618061117-84dde-6983ed79c2d0e985fc8b00ac7c270b46d92bc20d.gz b/_darcs/patches/20080618061117-84dde-6983ed79c2d0e985fc8b00ac7c270b46d92bc20d.gz new file mode 100644 index 0000000000..7eb6a65588 Binary files /dev/null and b/_darcs/patches/20080618061117-84dde-6983ed79c2d0e985fc8b00ac7c270b46d92bc20d.gz differ diff --git a/_darcs/patches/20080618061833-84dde-e77ea989a6caaf1d6722d6e82c1bcd04da44f486.gz b/_darcs/patches/20080618061833-84dde-e77ea989a6caaf1d6722d6e82c1bcd04da44f486.gz new file mode 100644 index 0000000000..c8a010adbd Binary files /dev/null and b/_darcs/patches/20080618061833-84dde-e77ea989a6caaf1d6722d6e82c1bcd04da44f486.gz differ diff --git a/_darcs/patches/20080618062059-84dde-f3d27969a876fd89c5f01fb690ca367a51ec1b5e.gz b/_darcs/patches/20080618062059-84dde-f3d27969a876fd89c5f01fb690ca367a51ec1b5e.gz new file mode 100644 index 0000000000..924f3bb41d Binary files /dev/null and b/_darcs/patches/20080618062059-84dde-f3d27969a876fd89c5f01fb690ca367a51ec1b5e.gz differ diff --git a/_darcs/patches/20080618065320-84dde-d013191a57a3de66a038feb88ad46ceff1e986ca.gz b/_darcs/patches/20080618065320-84dde-d013191a57a3de66a038feb88ad46ceff1e986ca.gz new file mode 100644 index 0000000000..65aa470117 Binary files /dev/null and b/_darcs/patches/20080618065320-84dde-d013191a57a3de66a038feb88ad46ceff1e986ca.gz differ diff --git a/_darcs/patches/20080618065508-84dde-855999e8433ac5882638635c43bd52b8940b59d4.gz b/_darcs/patches/20080618065508-84dde-855999e8433ac5882638635c43bd52b8940b59d4.gz new file mode 100644 index 0000000000..42d7c74d66 Binary files /dev/null and b/_darcs/patches/20080618065508-84dde-855999e8433ac5882638635c43bd52b8940b59d4.gz differ diff --git a/_darcs/patches/20080618070430-84dde-403d695209ab88f2d0c4e54da333698c6fe5883a.gz b/_darcs/patches/20080618070430-84dde-403d695209ab88f2d0c4e54da333698c6fe5883a.gz new file mode 100644 index 0000000000..e353d44e72 Binary files /dev/null and b/_darcs/patches/20080618070430-84dde-403d695209ab88f2d0c4e54da333698c6fe5883a.gz differ diff --git a/_darcs/patches/20080618070710-84dde-bcf4cce6586cf22909659efefc410dded33204c3.gz b/_darcs/patches/20080618070710-84dde-bcf4cce6586cf22909659efefc410dded33204c3.gz new file mode 100644 index 0000000000..b9602d1990 Binary files /dev/null and b/_darcs/patches/20080618070710-84dde-bcf4cce6586cf22909659efefc410dded33204c3.gz differ diff --git a/_darcs/patches/20080618071207-84dde-a7903c5a806e16a39101244ef721204a7ce2bd46.gz b/_darcs/patches/20080618071207-84dde-a7903c5a806e16a39101244ef721204a7ce2bd46.gz new file mode 100644 index 0000000000..cc09f98982 Binary files /dev/null and b/_darcs/patches/20080618071207-84dde-a7903c5a806e16a39101244ef721204a7ce2bd46.gz differ diff --git a/_darcs/patches/20080618110126-84dde-4dd97a6e08fb95b0f9860edda45ccaedb3958b20.gz b/_darcs/patches/20080618110126-84dde-4dd97a6e08fb95b0f9860edda45ccaedb3958b20.gz new file mode 100644 index 0000000000..422e0c9b1a Binary files /dev/null and b/_darcs/patches/20080618110126-84dde-4dd97a6e08fb95b0f9860edda45ccaedb3958b20.gz differ diff --git a/_darcs/patches/20080618110853-84dde-b24a19acffad53362a80c92f1dddafab37a457c6.gz b/_darcs/patches/20080618110853-84dde-b24a19acffad53362a80c92f1dddafab37a457c6.gz new file mode 100644 index 0000000000..16928f2bc6 Binary files /dev/null and b/_darcs/patches/20080618110853-84dde-b24a19acffad53362a80c92f1dddafab37a457c6.gz differ diff --git a/_darcs/patches/20080618111512-84dde-835a9d92386c5a5a5e51b0879c04575e9a80fdf5.gz b/_darcs/patches/20080618111512-84dde-835a9d92386c5a5a5e51b0879c04575e9a80fdf5.gz new file mode 100644 index 0000000000..aed79ed410 Binary files /dev/null and b/_darcs/patches/20080618111512-84dde-835a9d92386c5a5a5e51b0879c04575e9a80fdf5.gz differ diff --git a/_darcs/patches/20080618112624-84dde-76bbb4338585852abef7ed6ced26784a77f01a34.gz b/_darcs/patches/20080618112624-84dde-76bbb4338585852abef7ed6ced26784a77f01a34.gz new file mode 100644 index 0000000000..9a66bedd05 Binary files /dev/null and b/_darcs/patches/20080618112624-84dde-76bbb4338585852abef7ed6ced26784a77f01a34.gz differ diff --git a/_darcs/patches/20080618113720-84dde-4483d18751e7f82480c925cce4d1f84095598742.gz b/_darcs/patches/20080618113720-84dde-4483d18751e7f82480c925cce4d1f84095598742.gz new file mode 100644 index 0000000000..11fb3fd804 Binary files /dev/null and b/_darcs/patches/20080618113720-84dde-4483d18751e7f82480c925cce4d1f84095598742.gz differ diff --git a/_darcs/patches/20080618114310-84dde-15b224bb16d434150af457bc3b08de58e3833abd.gz b/_darcs/patches/20080618114310-84dde-15b224bb16d434150af457bc3b08de58e3833abd.gz new file mode 100644 index 0000000000..f3afefbef8 Binary files /dev/null and b/_darcs/patches/20080618114310-84dde-15b224bb16d434150af457bc3b08de58e3833abd.gz differ diff --git a/_darcs/patches/20080618123941-84dde-ec6e2fdef8c561714e509dc47e14aa47c58a9c44.gz b/_darcs/patches/20080618123941-84dde-ec6e2fdef8c561714e509dc47e14aa47c58a9c44.gz new file mode 100644 index 0000000000..4a0e64ec61 Binary files /dev/null and b/_darcs/patches/20080618123941-84dde-ec6e2fdef8c561714e509dc47e14aa47c58a9c44.gz differ diff --git a/_darcs/patches/20080618131519-84dde-a3af7c41be8d9606f39ce4be3029697f913ab053.gz b/_darcs/patches/20080618131519-84dde-a3af7c41be8d9606f39ce4be3029697f913ab053.gz new file mode 100644 index 0000000000..713415c991 Binary files /dev/null and b/_darcs/patches/20080618131519-84dde-a3af7c41be8d9606f39ce4be3029697f913ab053.gz differ diff --git a/_darcs/patches/20080618131636-84dde-ef33dcb94c630fdd8831d904caadb9e669ce6cb3.gz b/_darcs/patches/20080618131636-84dde-ef33dcb94c630fdd8831d904caadb9e669ce6cb3.gz new file mode 100644 index 0000000000..3c773cd88a Binary files /dev/null and b/_darcs/patches/20080618131636-84dde-ef33dcb94c630fdd8831d904caadb9e669ce6cb3.gz differ diff --git a/_darcs/patches/20080618132613-84dde-a7d78778af37cf3f20bfeb70ae2d381bc9ae92d4.gz b/_darcs/patches/20080618132613-84dde-a7d78778af37cf3f20bfeb70ae2d381bc9ae92d4.gz new file mode 100644 index 0000000000..7b315d9d5e Binary files /dev/null and b/_darcs/patches/20080618132613-84dde-a7d78778af37cf3f20bfeb70ae2d381bc9ae92d4.gz differ diff --git a/_darcs/patches/20080618133251-84dde-40c6326cb27ac20e52ef456a3f05e111c6fae97c.gz b/_darcs/patches/20080618133251-84dde-40c6326cb27ac20e52ef456a3f05e111c6fae97c.gz new file mode 100644 index 0000000000..5aa83d9f97 Binary files /dev/null and b/_darcs/patches/20080618133251-84dde-40c6326cb27ac20e52ef456a3f05e111c6fae97c.gz differ diff --git a/_darcs/patches/20080618150557-84dde-61120bcf12e9ecfaafda079d1a943c75f99f5930.gz b/_darcs/patches/20080618150557-84dde-61120bcf12e9ecfaafda079d1a943c75f99f5930.gz new file mode 100644 index 0000000000..1a8829c61d Binary files /dev/null and b/_darcs/patches/20080618150557-84dde-61120bcf12e9ecfaafda079d1a943c75f99f5930.gz differ diff --git a/_darcs/patches/20080618151103-84dde-f3af75746f3f240c0fad2e0fec1d01459df9e48e.gz b/_darcs/patches/20080618151103-84dde-f3af75746f3f240c0fad2e0fec1d01459df9e48e.gz new file mode 100644 index 0000000000..e244fdcd48 Binary files /dev/null and b/_darcs/patches/20080618151103-84dde-f3af75746f3f240c0fad2e0fec1d01459df9e48e.gz differ diff --git a/_darcs/patches/20080618152004-84dde-4d97997a9842ff1db550152266b51048df9e7281.gz b/_darcs/patches/20080618152004-84dde-4d97997a9842ff1db550152266b51048df9e7281.gz new file mode 100644 index 0000000000..375fd12e51 Binary files /dev/null and b/_darcs/patches/20080618152004-84dde-4d97997a9842ff1db550152266b51048df9e7281.gz differ diff --git a/_darcs/patches/20080618153036-84dde-06329e00661924826d6fd2b5b0682957c21c06d9.gz b/_darcs/patches/20080618153036-84dde-06329e00661924826d6fd2b5b0682957c21c06d9.gz new file mode 100644 index 0000000000..7b0cb064c8 Binary files /dev/null and b/_darcs/patches/20080618153036-84dde-06329e00661924826d6fd2b5b0682957c21c06d9.gz differ diff --git a/_darcs/patches/20080618153258-84dde-48204f3d9d3d6c710d73bad4b390877cb34e2991.gz b/_darcs/patches/20080618153258-84dde-48204f3d9d3d6c710d73bad4b390877cb34e2991.gz new file mode 100644 index 0000000000..ccc816f0de Binary files /dev/null and b/_darcs/patches/20080618153258-84dde-48204f3d9d3d6c710d73bad4b390877cb34e2991.gz differ diff --git a/_darcs/patches/20080618154643-84dde-e77d6bf486806725579cdfe922ccbe3e59e008e1.gz b/_darcs/patches/20080618154643-84dde-e77d6bf486806725579cdfe922ccbe3e59e008e1.gz new file mode 100644 index 0000000000..a7deda6e90 Binary files /dev/null and b/_darcs/patches/20080618154643-84dde-e77d6bf486806725579cdfe922ccbe3e59e008e1.gz differ diff --git a/_darcs/patches/20080618160111-84dde-70cc4c0a40f14aa6a5f7b05f6b8a8947bb5025f7.gz b/_darcs/patches/20080618160111-84dde-70cc4c0a40f14aa6a5f7b05f6b8a8947bb5025f7.gz new file mode 100644 index 0000000000..e9d183481c Binary files /dev/null and b/_darcs/patches/20080618160111-84dde-70cc4c0a40f14aa6a5f7b05f6b8a8947bb5025f7.gz differ diff --git a/_darcs/patches/20080618160733-84dde-cb233a9b2073b6333f2944682bb3ab0c1a7a547a.gz b/_darcs/patches/20080618160733-84dde-cb233a9b2073b6333f2944682bb3ab0c1a7a547a.gz new file mode 100644 index 0000000000..615be4e7af Binary files /dev/null and b/_darcs/patches/20080618160733-84dde-cb233a9b2073b6333f2944682bb3ab0c1a7a547a.gz differ diff --git a/_darcs/patches/20080618161321-84dde-366f585399c0dc0b8412596ebd0abcc61cfc904d.gz b/_darcs/patches/20080618161321-84dde-366f585399c0dc0b8412596ebd0abcc61cfc904d.gz new file mode 100644 index 0000000000..1e0bcbb5ef Binary files /dev/null and b/_darcs/patches/20080618161321-84dde-366f585399c0dc0b8412596ebd0abcc61cfc904d.gz differ diff --git a/_darcs/patches/20080618162715-84dde-9a3213796a88cf4f28597553e1834896c7f201a7.gz b/_darcs/patches/20080618162715-84dde-9a3213796a88cf4f28597553e1834896c7f201a7.gz new file mode 100644 index 0000000000..d3406ff558 Binary files /dev/null and b/_darcs/patches/20080618162715-84dde-9a3213796a88cf4f28597553e1834896c7f201a7.gz differ diff --git a/_darcs/patches/20080618162838-84dde-90e6950d9cdfcfee947f504512b7fb529d0db7de.gz b/_darcs/patches/20080618162838-84dde-90e6950d9cdfcfee947f504512b7fb529d0db7de.gz new file mode 100644 index 0000000000..f5e9a8500a Binary files /dev/null and b/_darcs/patches/20080618162838-84dde-90e6950d9cdfcfee947f504512b7fb529d0db7de.gz differ diff --git a/_darcs/patches/20080618163516-84dde-ab4d9daa4180d75da0813bed03f6c824577a87a0.gz b/_darcs/patches/20080618163516-84dde-ab4d9daa4180d75da0813bed03f6c824577a87a0.gz new file mode 100644 index 0000000000..8296a3feb2 Binary files /dev/null and b/_darcs/patches/20080618163516-84dde-ab4d9daa4180d75da0813bed03f6c824577a87a0.gz differ diff --git a/_darcs/patches/20080618165041-84dde-d98bebb8e74286993c582710ae385d5d7ef1b3fb.gz b/_darcs/patches/20080618165041-84dde-d98bebb8e74286993c582710ae385d5d7ef1b3fb.gz new file mode 100644 index 0000000000..6dad1e7d4f Binary files /dev/null and b/_darcs/patches/20080618165041-84dde-d98bebb8e74286993c582710ae385d5d7ef1b3fb.gz differ diff --git a/_darcs/patches/20080618171313-84dde-3389db1f5110d3f47cd5a4ef17f6a7fc0fcf3b44.gz b/_darcs/patches/20080618171313-84dde-3389db1f5110d3f47cd5a4ef17f6a7fc0fcf3b44.gz new file mode 100644 index 0000000000..4c1db2b167 Binary files /dev/null and b/_darcs/patches/20080618171313-84dde-3389db1f5110d3f47cd5a4ef17f6a7fc0fcf3b44.gz differ diff --git a/_darcs/patches/20080618171622-84dde-abe0986279b106ff651913d759828d6d945adf0f.gz b/_darcs/patches/20080618171622-84dde-abe0986279b106ff651913d759828d6d945adf0f.gz new file mode 100644 index 0000000000..3ceddde090 Binary files /dev/null and b/_darcs/patches/20080618171622-84dde-abe0986279b106ff651913d759828d6d945adf0f.gz differ diff --git a/_darcs/patches/20080618172444-84dde-b886f6f8170370ae1aaf2e7f996aff288a471145.gz b/_darcs/patches/20080618172444-84dde-b886f6f8170370ae1aaf2e7f996aff288a471145.gz new file mode 100644 index 0000000000..76a76555c2 Binary files /dev/null and b/_darcs/patches/20080618172444-84dde-b886f6f8170370ae1aaf2e7f996aff288a471145.gz differ diff --git a/_darcs/patches/20080618175911-84dde-bc27789cef7d68d34f8cf33cd026928ce6f2fa18.gz b/_darcs/patches/20080618175911-84dde-bc27789cef7d68d34f8cf33cd026928ce6f2fa18.gz new file mode 100644 index 0000000000..3660518df1 Binary files /dev/null and b/_darcs/patches/20080618175911-84dde-bc27789cef7d68d34f8cf33cd026928ce6f2fa18.gz differ diff --git a/_darcs/patches/20080618180642-84dde-1e8ee16d2b6497c71854486a687545d948340d69.gz b/_darcs/patches/20080618180642-84dde-1e8ee16d2b6497c71854486a687545d948340d69.gz new file mode 100644 index 0000000000..2b55ee91ef Binary files /dev/null and b/_darcs/patches/20080618180642-84dde-1e8ee16d2b6497c71854486a687545d948340d69.gz differ diff --git a/_darcs/patches/20080618182647-84dde-e75e2c3441e8441ad6602f36fd9b7bf6ca39e70d.gz b/_darcs/patches/20080618182647-84dde-e75e2c3441e8441ad6602f36fd9b7bf6ca39e70d.gz new file mode 100644 index 0000000000..7696555af5 Binary files /dev/null and b/_darcs/patches/20080618182647-84dde-e75e2c3441e8441ad6602f36fd9b7bf6ca39e70d.gz differ diff --git a/_darcs/patches/20080618182812-84dde-62e5442eb8f051e29f9a7b5134a7ba5a09cfe3a0.gz b/_darcs/patches/20080618182812-84dde-62e5442eb8f051e29f9a7b5134a7ba5a09cfe3a0.gz new file mode 100644 index 0000000000..c9377815d0 Binary files /dev/null and b/_darcs/patches/20080618182812-84dde-62e5442eb8f051e29f9a7b5134a7ba5a09cfe3a0.gz differ diff --git a/_darcs/patches/20080618183606-84dde-d0843cd3f1656b8b547227eeef326d89d6c55adf.gz b/_darcs/patches/20080618183606-84dde-d0843cd3f1656b8b547227eeef326d89d6c55adf.gz new file mode 100644 index 0000000000..4160b9bb73 Binary files /dev/null and b/_darcs/patches/20080618183606-84dde-d0843cd3f1656b8b547227eeef326d89d6c55adf.gz differ diff --git a/_darcs/patches/20080618190202-84dde-20cc79646144076090c36fe25d78f2d0e399d5ad.gz b/_darcs/patches/20080618190202-84dde-20cc79646144076090c36fe25d78f2d0e399d5ad.gz new file mode 100644 index 0000000000..a83d744709 Binary files /dev/null and b/_darcs/patches/20080618190202-84dde-20cc79646144076090c36fe25d78f2d0e399d5ad.gz differ diff --git a/_darcs/patches/20080618201123-84dde-3c6a131fafc0ba8922293c608173a6d7407ce8d0.gz b/_darcs/patches/20080618201123-84dde-3c6a131fafc0ba8922293c608173a6d7407ce8d0.gz new file mode 100644 index 0000000000..7e3e3692a3 Binary files /dev/null and b/_darcs/patches/20080618201123-84dde-3c6a131fafc0ba8922293c608173a6d7407ce8d0.gz differ diff --git a/_darcs/patches/20080618202500-84dde-66eeb8af0e26d9723b89831a6ba7bb82b09dbe09.gz b/_darcs/patches/20080618202500-84dde-66eeb8af0e26d9723b89831a6ba7bb82b09dbe09.gz new file mode 100644 index 0000000000..a719fc1533 Binary files /dev/null and b/_darcs/patches/20080618202500-84dde-66eeb8af0e26d9723b89831a6ba7bb82b09dbe09.gz differ diff --git a/_darcs/patches/20080618204421-84dde-ba5ec861d68adf9179bb3907784156fb404d23ed.gz b/_darcs/patches/20080618204421-84dde-ba5ec861d68adf9179bb3907784156fb404d23ed.gz new file mode 100644 index 0000000000..d0218c5f39 Binary files /dev/null and b/_darcs/patches/20080618204421-84dde-ba5ec861d68adf9179bb3907784156fb404d23ed.gz differ diff --git a/_darcs/patches/20080618204611-84dde-e8de48c6a7213787c09201f4007bfc57064bdeed.gz b/_darcs/patches/20080618204611-84dde-e8de48c6a7213787c09201f4007bfc57064bdeed.gz new file mode 100644 index 0000000000..c7f169a30d Binary files /dev/null and b/_darcs/patches/20080618204611-84dde-e8de48c6a7213787c09201f4007bfc57064bdeed.gz differ diff --git a/_darcs/patches/20080618210044-84dde-3b064b11117d4c785e4eba7902f1c0298dbbd8a7.gz b/_darcs/patches/20080618210044-84dde-3b064b11117d4c785e4eba7902f1c0298dbbd8a7.gz new file mode 100644 index 0000000000..ef3aec1bd6 Binary files /dev/null and b/_darcs/patches/20080618210044-84dde-3b064b11117d4c785e4eba7902f1c0298dbbd8a7.gz differ diff --git a/_darcs/patches/20080618211454-84dde-4772135cc92f2a51faa072e4470da3c628e1510c.gz b/_darcs/patches/20080618211454-84dde-4772135cc92f2a51faa072e4470da3c628e1510c.gz new file mode 100644 index 0000000000..f905ebe5ca Binary files /dev/null and b/_darcs/patches/20080618211454-84dde-4772135cc92f2a51faa072e4470da3c628e1510c.gz differ diff --git a/_darcs/patches/20080619014802-84dde-186c526a0452e916775cdddef94357da1aacd6a5.gz b/_darcs/patches/20080619014802-84dde-186c526a0452e916775cdddef94357da1aacd6a5.gz new file mode 100644 index 0000000000..c9830b5f0f Binary files /dev/null and b/_darcs/patches/20080619014802-84dde-186c526a0452e916775cdddef94357da1aacd6a5.gz differ diff --git a/_darcs/patches/20080619020540-84dde-a177b25086c88071bd9933b54ba3ab52951c90cd.gz b/_darcs/patches/20080619020540-84dde-a177b25086c88071bd9933b54ba3ab52951c90cd.gz new file mode 100644 index 0000000000..4b28eb3a52 Binary files /dev/null and b/_darcs/patches/20080619020540-84dde-a177b25086c88071bd9933b54ba3ab52951c90cd.gz differ diff --git a/_darcs/patches/20080619020634-84dde-37a8f87b9f293534ed167e183fa2d08f6714c2ad.gz b/_darcs/patches/20080619020634-84dde-37a8f87b9f293534ed167e183fa2d08f6714c2ad.gz new file mode 100644 index 0000000000..99fcb680c9 Binary files /dev/null and b/_darcs/patches/20080619020634-84dde-37a8f87b9f293534ed167e183fa2d08f6714c2ad.gz differ diff --git a/_darcs/patches/20080619021449-84dde-773db884c6276622f3090ab02116410750200470.gz b/_darcs/patches/20080619021449-84dde-773db884c6276622f3090ab02116410750200470.gz new file mode 100644 index 0000000000..a74e0bc5e2 Binary files /dev/null and b/_darcs/patches/20080619021449-84dde-773db884c6276622f3090ab02116410750200470.gz differ diff --git a/_darcs/patches/20080619033212-84dde-2f7227fe16c7015b03121424520ebd74d4b96762.gz b/_darcs/patches/20080619033212-84dde-2f7227fe16c7015b03121424520ebd74d4b96762.gz new file mode 100644 index 0000000000..189c1bf174 Binary files /dev/null and b/_darcs/patches/20080619033212-84dde-2f7227fe16c7015b03121424520ebd74d4b96762.gz differ diff --git a/_darcs/patches/20080619033619-84dde-e4fcc00f5d86cb0d11feff5f88f719ea72d3318e.gz b/_darcs/patches/20080619033619-84dde-e4fcc00f5d86cb0d11feff5f88f719ea72d3318e.gz new file mode 100644 index 0000000000..02d373fb59 Binary files /dev/null and b/_darcs/patches/20080619033619-84dde-e4fcc00f5d86cb0d11feff5f88f719ea72d3318e.gz differ diff --git a/_darcs/patches/20080619134710-84dde-6086a4ac7bbd72a251fe5ce6fe3156e3270ebd74.gz b/_darcs/patches/20080619134710-84dde-6086a4ac7bbd72a251fe5ce6fe3156e3270ebd74.gz new file mode 100644 index 0000000000..1a426a8694 Binary files /dev/null and b/_darcs/patches/20080619134710-84dde-6086a4ac7bbd72a251fe5ce6fe3156e3270ebd74.gz differ diff --git a/_darcs/patches/20080619135148-84dde-6caaa7f97d2405bc318bfa818c4ac9cbc31cab33.gz b/_darcs/patches/20080619135148-84dde-6caaa7f97d2405bc318bfa818c4ac9cbc31cab33.gz new file mode 100644 index 0000000000..0f0ed8a040 Binary files /dev/null and b/_darcs/patches/20080619135148-84dde-6caaa7f97d2405bc318bfa818c4ac9cbc31cab33.gz differ diff --git a/_darcs/patches/20080619135603-84dde-1bfd6606f34416eb6f1be4d5c926f6bb198427bd.gz b/_darcs/patches/20080619135603-84dde-1bfd6606f34416eb6f1be4d5c926f6bb198427bd.gz new file mode 100644 index 0000000000..728c411d63 Binary files /dev/null and b/_darcs/patches/20080619135603-84dde-1bfd6606f34416eb6f1be4d5c926f6bb198427bd.gz differ diff --git a/_darcs/patches/20080619135944-84dde-948447f0e5e7524c64a5538d145d8c52bf4206a9.gz b/_darcs/patches/20080619135944-84dde-948447f0e5e7524c64a5538d145d8c52bf4206a9.gz new file mode 100644 index 0000000000..0285fa92c8 Binary files /dev/null and b/_darcs/patches/20080619135944-84dde-948447f0e5e7524c64a5538d145d8c52bf4206a9.gz differ diff --git a/_darcs/patches/20080619140350-84dde-a9b640051f5b35a5f7907d49ab006e62d480b82a.gz b/_darcs/patches/20080619140350-84dde-a9b640051f5b35a5f7907d49ab006e62d480b82a.gz new file mode 100644 index 0000000000..1b59a1c02d Binary files /dev/null and b/_darcs/patches/20080619140350-84dde-a9b640051f5b35a5f7907d49ab006e62d480b82a.gz differ diff --git a/_darcs/patches/20080619140505-84dde-d4006afa9507e29e58115f23c4acc5156a571930.gz b/_darcs/patches/20080619140505-84dde-d4006afa9507e29e58115f23c4acc5156a571930.gz new file mode 100644 index 0000000000..7dab29cb4b Binary files /dev/null and b/_darcs/patches/20080619140505-84dde-d4006afa9507e29e58115f23c4acc5156a571930.gz differ diff --git a/_darcs/patches/20080619141107-84dde-a5e018fdac3f72eee13b3093fbd871299cda0739.gz b/_darcs/patches/20080619141107-84dde-a5e018fdac3f72eee13b3093fbd871299cda0739.gz new file mode 100644 index 0000000000..bc3a5e5775 Binary files /dev/null and b/_darcs/patches/20080619141107-84dde-a5e018fdac3f72eee13b3093fbd871299cda0739.gz differ diff --git a/_darcs/patches/20080619141755-84dde-5bd550251842f9d18f7d80746d436198a030d7c8.gz b/_darcs/patches/20080619141755-84dde-5bd550251842f9d18f7d80746d436198a030d7c8.gz new file mode 100644 index 0000000000..1c18f28f2d Binary files /dev/null and b/_darcs/patches/20080619141755-84dde-5bd550251842f9d18f7d80746d436198a030d7c8.gz differ diff --git a/_darcs/patches/20080619142224-c91fa-a666854bc81c00fc37350029c3c8682fcb108da3.gz b/_darcs/patches/20080619142224-c91fa-a666854bc81c00fc37350029c3c8682fcb108da3.gz new file mode 100644 index 0000000000..3c5087b6b2 Binary files /dev/null and b/_darcs/patches/20080619142224-c91fa-a666854bc81c00fc37350029c3c8682fcb108da3.gz differ diff --git a/_darcs/patches/20080619143610-5ed1f-fa3cbc67e273adc206808d7213baa8bf691ea149.gz b/_darcs/patches/20080619143610-5ed1f-fa3cbc67e273adc206808d7213baa8bf691ea149.gz new file mode 100644 index 0000000000..bc6745e526 Binary files /dev/null and b/_darcs/patches/20080619143610-5ed1f-fa3cbc67e273adc206808d7213baa8bf691ea149.gz differ diff --git a/_darcs/patches/20080619143829-5ed1f-df0b08a87ba592b552cebd49745be480f0e46d56.gz b/_darcs/patches/20080619143829-5ed1f-df0b08a87ba592b552cebd49745be480f0e46d56.gz new file mode 100644 index 0000000000..4297c515f2 Binary files /dev/null and b/_darcs/patches/20080619143829-5ed1f-df0b08a87ba592b552cebd49745be480f0e46d56.gz differ diff --git a/_darcs/patches/20080619145124-8af03-fb5d4d79e34d76b7acddbd02e73f071a0a6fcc61.gz b/_darcs/patches/20080619145124-8af03-fb5d4d79e34d76b7acddbd02e73f071a0a6fcc61.gz new file mode 100644 index 0000000000..de889fd15a Binary files /dev/null and b/_darcs/patches/20080619145124-8af03-fb5d4d79e34d76b7acddbd02e73f071a0a6fcc61.gz differ diff --git a/_darcs/patches/20080619145838-5ed1f-c9c98e0df682a6ad4f1ec3028a985ff49b7c3e12.gz b/_darcs/patches/20080619145838-5ed1f-c9c98e0df682a6ad4f1ec3028a985ff49b7c3e12.gz new file mode 100644 index 0000000000..91d6e4e7ef Binary files /dev/null and b/_darcs/patches/20080619145838-5ed1f-c9c98e0df682a6ad4f1ec3028a985ff49b7c3e12.gz differ diff --git a/_darcs/patches/20080619150158-5ed1f-e488de5630d8ca131b3ad95c6701bfb3c1e5d569.gz b/_darcs/patches/20080619150158-5ed1f-e488de5630d8ca131b3ad95c6701bfb3c1e5d569.gz new file mode 100644 index 0000000000..9bff565814 Binary files /dev/null and b/_darcs/patches/20080619150158-5ed1f-e488de5630d8ca131b3ad95c6701bfb3c1e5d569.gz differ diff --git a/_darcs/patches/20080619150208-5ed1f-f077ebe50180113779487263dded7d8b05262306.gz b/_darcs/patches/20080619150208-5ed1f-f077ebe50180113779487263dded7d8b05262306.gz new file mode 100644 index 0000000000..cae703b603 Binary files /dev/null and b/_darcs/patches/20080619150208-5ed1f-f077ebe50180113779487263dded7d8b05262306.gz differ diff --git a/_darcs/patches/20080619150226-5ed1f-2c7ad753166708ede8c07e704953a5da888e4145.gz b/_darcs/patches/20080619150226-5ed1f-2c7ad753166708ede8c07e704953a5da888e4145.gz new file mode 100644 index 0000000000..45e852c8c4 Binary files /dev/null and b/_darcs/patches/20080619150226-5ed1f-2c7ad753166708ede8c07e704953a5da888e4145.gz differ diff --git a/_darcs/patches/20080619151803-5ed1f-53df3a53f1147233658397c3c6d2cd6a2202b199.gz b/_darcs/patches/20080619151803-5ed1f-53df3a53f1147233658397c3c6d2cd6a2202b199.gz new file mode 100644 index 0000000000..f1260d470e Binary files /dev/null and b/_darcs/patches/20080619151803-5ed1f-53df3a53f1147233658397c3c6d2cd6a2202b199.gz differ diff --git a/_darcs/patches/20080619153231-5ed1f-a5d784ff39b53afdfb0584689188dd78bdb90c41.gz b/_darcs/patches/20080619153231-5ed1f-a5d784ff39b53afdfb0584689188dd78bdb90c41.gz new file mode 100644 index 0000000000..0e338cd3fa Binary files /dev/null and b/_darcs/patches/20080619153231-5ed1f-a5d784ff39b53afdfb0584689188dd78bdb90c41.gz differ diff --git a/_darcs/patches/20080619153719-5ed1f-da58c447643d24dbfd9d0076c74d8ce4f57c5be3.gz b/_darcs/patches/20080619153719-5ed1f-da58c447643d24dbfd9d0076c74d8ce4f57c5be3.gz new file mode 100644 index 0000000000..f03e5f10e8 Binary files /dev/null and b/_darcs/patches/20080619153719-5ed1f-da58c447643d24dbfd9d0076c74d8ce4f57c5be3.gz differ diff --git a/_darcs/patches/20080619155042-5ed1f-d814e2ae7f565e7e5cd8c0389071491705117e73.gz b/_darcs/patches/20080619155042-5ed1f-d814e2ae7f565e7e5cd8c0389071491705117e73.gz new file mode 100644 index 0000000000..e7ac34c362 Binary files /dev/null and b/_darcs/patches/20080619155042-5ed1f-d814e2ae7f565e7e5cd8c0389071491705117e73.gz differ diff --git a/_darcs/patches/20080619155154-5ed1f-0bd8ea0c1e7a7ead736483cd516bcf4f999e9deb.gz b/_darcs/patches/20080619155154-5ed1f-0bd8ea0c1e7a7ead736483cd516bcf4f999e9deb.gz new file mode 100644 index 0000000000..5947146454 Binary files /dev/null and b/_darcs/patches/20080619155154-5ed1f-0bd8ea0c1e7a7ead736483cd516bcf4f999e9deb.gz differ diff --git a/_darcs/patches/20080619161814-5ed1f-5add55346470e71a53a676d39617062acc0f19bf.gz b/_darcs/patches/20080619161814-5ed1f-5add55346470e71a53a676d39617062acc0f19bf.gz new file mode 100644 index 0000000000..699bf7b34e Binary files /dev/null and b/_darcs/patches/20080619161814-5ed1f-5add55346470e71a53a676d39617062acc0f19bf.gz differ diff --git a/_darcs/patches/20080619162450-5ed1f-037e20d9adc391a309e7c27091d13a8a039e3f94.gz b/_darcs/patches/20080619162450-5ed1f-037e20d9adc391a309e7c27091d13a8a039e3f94.gz new file mode 100644 index 0000000000..6a57bc1112 Binary files /dev/null and b/_darcs/patches/20080619162450-5ed1f-037e20d9adc391a309e7c27091d13a8a039e3f94.gz differ diff --git a/_darcs/patches/20080619172031-84dde-6b97932d4d51541581c0b220df8ce53cbc51e2da.gz b/_darcs/patches/20080619172031-84dde-6b97932d4d51541581c0b220df8ce53cbc51e2da.gz new file mode 100644 index 0000000000..53cbb3a320 Binary files /dev/null and b/_darcs/patches/20080619172031-84dde-6b97932d4d51541581c0b220df8ce53cbc51e2da.gz differ diff --git a/_darcs/patches/20080619173225-84dde-d73961d047f75fa1e3ac4287d35e4c6afb391e84.gz b/_darcs/patches/20080619173225-84dde-d73961d047f75fa1e3ac4287d35e4c6afb391e84.gz new file mode 100644 index 0000000000..abe1cf800b Binary files /dev/null and b/_darcs/patches/20080619173225-84dde-d73961d047f75fa1e3ac4287d35e4c6afb391e84.gz differ diff --git a/_darcs/patches/20080619183238-84dde-dbe912a40894ec7414e6d5ea0bc40ec527385436.gz b/_darcs/patches/20080619183238-84dde-dbe912a40894ec7414e6d5ea0bc40ec527385436.gz new file mode 100644 index 0000000000..e1414fc5a6 Binary files /dev/null and b/_darcs/patches/20080619183238-84dde-dbe912a40894ec7414e6d5ea0bc40ec527385436.gz differ diff --git a/_darcs/patches/20080619190357-84dde-f7e6e0741c5fc9c1bf99b4273ff1c0160056cf39.gz b/_darcs/patches/20080619190357-84dde-f7e6e0741c5fc9c1bf99b4273ff1c0160056cf39.gz new file mode 100644 index 0000000000..88450196e4 Binary files /dev/null and b/_darcs/patches/20080619190357-84dde-f7e6e0741c5fc9c1bf99b4273ff1c0160056cf39.gz differ diff --git a/_darcs/patches/20080620041012-5ed1f-20a7d4df375250f5c4eff90cdab80b22348b1088.gz b/_darcs/patches/20080620041012-5ed1f-20a7d4df375250f5c4eff90cdab80b22348b1088.gz new file mode 100644 index 0000000000..af02f058d5 Binary files /dev/null and b/_darcs/patches/20080620041012-5ed1f-20a7d4df375250f5c4eff90cdab80b22348b1088.gz differ diff --git a/_darcs/patches/20080620051536-5ed1f-231e427832dd20c861eb7a6dc1171315e90f455b.gz b/_darcs/patches/20080620051536-5ed1f-231e427832dd20c861eb7a6dc1171315e90f455b.gz new file mode 100644 index 0000000000..3cea846f30 Binary files /dev/null and b/_darcs/patches/20080620051536-5ed1f-231e427832dd20c861eb7a6dc1171315e90f455b.gz differ diff --git a/_darcs/patches/20080620052453-5ed1f-4ce9b677b9010b3879bbae1ba9218036f0ad728f.gz b/_darcs/patches/20080620052453-5ed1f-4ce9b677b9010b3879bbae1ba9218036f0ad728f.gz new file mode 100644 index 0000000000..de16c30eb6 Binary files /dev/null and b/_darcs/patches/20080620052453-5ed1f-4ce9b677b9010b3879bbae1ba9218036f0ad728f.gz differ diff --git a/_darcs/patches/20080620062606-84dde-59be3fd35a01d788f3953e2dba70baefefabfb76.gz b/_darcs/patches/20080620062606-84dde-59be3fd35a01d788f3953e2dba70baefefabfb76.gz new file mode 100644 index 0000000000..e4da9bf2f7 Binary files /dev/null and b/_darcs/patches/20080620062606-84dde-59be3fd35a01d788f3953e2dba70baefefabfb76.gz differ diff --git a/_darcs/patches/20080620062847-84dde-e7dd5ea325b1cbbf3cb5e3668851750497242e64.gz b/_darcs/patches/20080620062847-84dde-e7dd5ea325b1cbbf3cb5e3668851750497242e64.gz new file mode 100644 index 0000000000..ff37881c9c Binary files /dev/null and b/_darcs/patches/20080620062847-84dde-e7dd5ea325b1cbbf3cb5e3668851750497242e64.gz differ diff --git a/_darcs/patches/20080620064824-84dde-1d349cf2add75fbffa7cc763fb5ac8776cce4d03.gz b/_darcs/patches/20080620064824-84dde-1d349cf2add75fbffa7cc763fb5ac8776cce4d03.gz new file mode 100644 index 0000000000..535cf270e9 Binary files /dev/null and b/_darcs/patches/20080620064824-84dde-1d349cf2add75fbffa7cc763fb5ac8776cce4d03.gz differ diff --git a/_darcs/patches/20080620065455-84dde-0c3bd495205e49ba2c5a8e040495339f35f9b215.gz b/_darcs/patches/20080620065455-84dde-0c3bd495205e49ba2c5a8e040495339f35f9b215.gz new file mode 100644 index 0000000000..70390000cd Binary files /dev/null and b/_darcs/patches/20080620065455-84dde-0c3bd495205e49ba2c5a8e040495339f35f9b215.gz differ diff --git a/_darcs/patches/20080620065619-84dde-9c207b2a898ff0a16b45f5f1b28565aaa85f9e65.gz b/_darcs/patches/20080620065619-84dde-9c207b2a898ff0a16b45f5f1b28565aaa85f9e65.gz new file mode 100644 index 0000000000..8925c37f9c Binary files /dev/null and b/_darcs/patches/20080620065619-84dde-9c207b2a898ff0a16b45f5f1b28565aaa85f9e65.gz differ diff --git a/_darcs/patches/20080620070256-84dde-215e2ccf2cc037208837353a3d979d69770301f6.gz b/_darcs/patches/20080620070256-84dde-215e2ccf2cc037208837353a3d979d69770301f6.gz new file mode 100644 index 0000000000..3f5fcc30c5 Binary files /dev/null and b/_darcs/patches/20080620070256-84dde-215e2ccf2cc037208837353a3d979d69770301f6.gz differ diff --git a/_darcs/patches/20080620071700-84dde-c6145243dc45dd2dff621aff421375d05796057e.gz b/_darcs/patches/20080620071700-84dde-c6145243dc45dd2dff621aff421375d05796057e.gz new file mode 100644 index 0000000000..f7886e171b Binary files /dev/null and b/_darcs/patches/20080620071700-84dde-c6145243dc45dd2dff621aff421375d05796057e.gz differ diff --git a/_darcs/patches/20080620072125-84dde-777b0a5405ea8ffc2436f711d60ab515d803b987.gz b/_darcs/patches/20080620072125-84dde-777b0a5405ea8ffc2436f711d60ab515d803b987.gz new file mode 100644 index 0000000000..e60c0188da Binary files /dev/null and b/_darcs/patches/20080620072125-84dde-777b0a5405ea8ffc2436f711d60ab515d803b987.gz differ diff --git a/_darcs/patches/20080620072632-84dde-d1e1b1593a882b6faa4fcd21c36200398ee49286.gz b/_darcs/patches/20080620072632-84dde-d1e1b1593a882b6faa4fcd21c36200398ee49286.gz new file mode 100644 index 0000000000..2b490d3be0 Binary files /dev/null and b/_darcs/patches/20080620072632-84dde-d1e1b1593a882b6faa4fcd21c36200398ee49286.gz differ diff --git a/_darcs/patches/20080620181136-982e4-ee4bb812b3db0f1d0e0b7961bc9aa6beec74096b.gz b/_darcs/patches/20080620181136-982e4-ee4bb812b3db0f1d0e0b7961bc9aa6beec74096b.gz new file mode 100644 index 0000000000..5f4bf7c279 Binary files /dev/null and b/_darcs/patches/20080620181136-982e4-ee4bb812b3db0f1d0e0b7961bc9aa6beec74096b.gz differ diff --git a/_darcs/patches/20080620195627-84dde-96d31837394eba6357e1134bc5a76b650dea42e6.gz b/_darcs/patches/20080620195627-84dde-96d31837394eba6357e1134bc5a76b650dea42e6.gz new file mode 100644 index 0000000000..af93389c47 Binary files /dev/null and b/_darcs/patches/20080620195627-84dde-96d31837394eba6357e1134bc5a76b650dea42e6.gz differ diff --git a/_darcs/patches/20080620203449-84dde-b878277e0ad5a5478b7396fbca7e42feb39715f8.gz b/_darcs/patches/20080620203449-84dde-b878277e0ad5a5478b7396fbca7e42feb39715f8.gz new file mode 100644 index 0000000000..9c991e66fc Binary files /dev/null and b/_darcs/patches/20080620203449-84dde-b878277e0ad5a5478b7396fbca7e42feb39715f8.gz differ diff --git a/_darcs/patches/20080622140941-34904-2a0eda21f6a374a9d26107a4bc627fc6de2a7063.gz b/_darcs/patches/20080622140941-34904-2a0eda21f6a374a9d26107a4bc627fc6de2a7063.gz new file mode 100644 index 0000000000..5ecce89258 Binary files /dev/null and b/_darcs/patches/20080622140941-34904-2a0eda21f6a374a9d26107a4bc627fc6de2a7063.gz differ diff --git a/_darcs/patches/20080622142015-34904-00feabce7fe73360319d8a9c1372478879bb203a.gz b/_darcs/patches/20080622142015-34904-00feabce7fe73360319d8a9c1372478879bb203a.gz new file mode 100644 index 0000000000..87c5657d56 Binary files /dev/null and b/_darcs/patches/20080622142015-34904-00feabce7fe73360319d8a9c1372478879bb203a.gz differ diff --git a/_darcs/patches/20080622142713-34904-1cee0bb3dbf54ad9ebb27b9c99fe4166dca3f9e2.gz b/_darcs/patches/20080622142713-34904-1cee0bb3dbf54ad9ebb27b9c99fe4166dca3f9e2.gz new file mode 100644 index 0000000000..ad1695c348 Binary files /dev/null and b/_darcs/patches/20080622142713-34904-1cee0bb3dbf54ad9ebb27b9c99fe4166dca3f9e2.gz differ diff --git a/_darcs/patches/20080622142906-34904-0699374fa0a88a1e4c004deb2a2f96b775fb98e5.gz b/_darcs/patches/20080622142906-34904-0699374fa0a88a1e4c004deb2a2f96b775fb98e5.gz new file mode 100644 index 0000000000..8a579c327a Binary files /dev/null and b/_darcs/patches/20080622142906-34904-0699374fa0a88a1e4c004deb2a2f96b775fb98e5.gz differ diff --git a/_darcs/patches/20080622145644-34904-92549d9bb68251214c4dc370f6e2a56f516ceecb.gz b/_darcs/patches/20080622145644-34904-92549d9bb68251214c4dc370f6e2a56f516ceecb.gz new file mode 100644 index 0000000000..0a20a36f6e Binary files /dev/null and b/_darcs/patches/20080622145644-34904-92549d9bb68251214c4dc370f6e2a56f516ceecb.gz differ diff --git a/_darcs/patches/20080622150633-34904-2e26094807f989a62261f2247d0a53995eb5bac5.gz b/_darcs/patches/20080622150633-34904-2e26094807f989a62261f2247d0a53995eb5bac5.gz new file mode 100644 index 0000000000..fbefc7f67d Binary files /dev/null and b/_darcs/patches/20080622150633-34904-2e26094807f989a62261f2247d0a53995eb5bac5.gz differ diff --git a/_darcs/patches/20080622151611-34904-1d952df08b5247ab391bb76fd50d7b90498f0c96.gz b/_darcs/patches/20080622151611-34904-1d952df08b5247ab391bb76fd50d7b90498f0c96.gz new file mode 100644 index 0000000000..c4e5782562 Binary files /dev/null and b/_darcs/patches/20080622151611-34904-1d952df08b5247ab391bb76fd50d7b90498f0c96.gz differ diff --git a/_darcs/patches/20080622152306-34904-3d3ab7c02c33efac17d02692a10b4fee2fb013f1.gz b/_darcs/patches/20080622152306-34904-3d3ab7c02c33efac17d02692a10b4fee2fb013f1.gz new file mode 100644 index 0000000000..3506832436 Binary files /dev/null and b/_darcs/patches/20080622152306-34904-3d3ab7c02c33efac17d02692a10b4fee2fb013f1.gz differ diff --git a/_darcs/patches/20080622152628-34904-9974209ebe964058d00337bc602ef20c10b83f66.gz b/_darcs/patches/20080622152628-34904-9974209ebe964058d00337bc602ef20c10b83f66.gz new file mode 100644 index 0000000000..23c9d39f60 Binary files /dev/null and b/_darcs/patches/20080622152628-34904-9974209ebe964058d00337bc602ef20c10b83f66.gz differ diff --git a/_darcs/patches/20080622153220-34904-119cea6c5dbe20e33569287cf9632c07e9768b10.gz b/_darcs/patches/20080622153220-34904-119cea6c5dbe20e33569287cf9632c07e9768b10.gz new file mode 100644 index 0000000000..b7e7132068 Binary files /dev/null and b/_darcs/patches/20080622153220-34904-119cea6c5dbe20e33569287cf9632c07e9768b10.gz differ diff --git a/_darcs/patches/20080622153754-34904-b722aa6d0ffa52242b06a8eec1eaa5216d216a4f.gz b/_darcs/patches/20080622153754-34904-b722aa6d0ffa52242b06a8eec1eaa5216d216a4f.gz new file mode 100644 index 0000000000..dfd364af04 Binary files /dev/null and b/_darcs/patches/20080622153754-34904-b722aa6d0ffa52242b06a8eec1eaa5216d216a4f.gz differ diff --git a/_darcs/patches/20080622154836-34904-0673a1ee33f35cdfd906251e50dadcbe8c4c90e7.gz b/_darcs/patches/20080622154836-34904-0673a1ee33f35cdfd906251e50dadcbe8c4c90e7.gz new file mode 100644 index 0000000000..cb2609bb26 Binary files /dev/null and b/_darcs/patches/20080622154836-34904-0673a1ee33f35cdfd906251e50dadcbe8c4c90e7.gz differ diff --git a/_darcs/patches/20080622155028-34904-4861ffd6927b05c35614b1ce8c51eec73e0bc9ac.gz b/_darcs/patches/20080622155028-34904-4861ffd6927b05c35614b1ce8c51eec73e0bc9ac.gz new file mode 100644 index 0000000000..f91385397f Binary files /dev/null and b/_darcs/patches/20080622155028-34904-4861ffd6927b05c35614b1ce8c51eec73e0bc9ac.gz differ diff --git a/_darcs/patches/20080622155250-34904-0cbc2895c01769dfb5e7393e6534355b6f5c2ac3.gz b/_darcs/patches/20080622155250-34904-0cbc2895c01769dfb5e7393e6534355b6f5c2ac3.gz new file mode 100644 index 0000000000..7c9daca433 Binary files /dev/null and b/_darcs/patches/20080622155250-34904-0cbc2895c01769dfb5e7393e6534355b6f5c2ac3.gz differ diff --git a/_darcs/patches/20080622155454-34904-2598501f3d1788eb1ead9252e5925637e721a525.gz b/_darcs/patches/20080622155454-34904-2598501f3d1788eb1ead9252e5925637e721a525.gz new file mode 100644 index 0000000000..e6c86d8ec3 Binary files /dev/null and b/_darcs/patches/20080622155454-34904-2598501f3d1788eb1ead9252e5925637e721a525.gz differ diff --git a/_darcs/patches/20080622161607-34904-d8e042b80fe6acd3cb6ad763216a0b1817752cac.gz b/_darcs/patches/20080622161607-34904-d8e042b80fe6acd3cb6ad763216a0b1817752cac.gz new file mode 100644 index 0000000000..a5d8b2d68f Binary files /dev/null and b/_darcs/patches/20080622161607-34904-d8e042b80fe6acd3cb6ad763216a0b1817752cac.gz differ diff --git a/_darcs/patches/20080622161749-34904-eb2e43aaa3f409accd94a2555f854fb22a297db7.gz b/_darcs/patches/20080622161749-34904-eb2e43aaa3f409accd94a2555f854fb22a297db7.gz new file mode 100644 index 0000000000..06cc49380c Binary files /dev/null and b/_darcs/patches/20080622161749-34904-eb2e43aaa3f409accd94a2555f854fb22a297db7.gz differ diff --git a/_darcs/patches/20080622161917-34904-32528c78b43d501d5994c4f5c74b977ca4d9c618.gz b/_darcs/patches/20080622161917-34904-32528c78b43d501d5994c4f5c74b977ca4d9c618.gz new file mode 100644 index 0000000000..9dc480127e Binary files /dev/null and b/_darcs/patches/20080622161917-34904-32528c78b43d501d5994c4f5c74b977ca4d9c618.gz differ diff --git a/_darcs/patches/20080622163241-34904-199b3654328d78c0b9fe2fa85a3ecc1ab0b1262a.gz b/_darcs/patches/20080622163241-34904-199b3654328d78c0b9fe2fa85a3ecc1ab0b1262a.gz new file mode 100644 index 0000000000..34358c054d Binary files /dev/null and b/_darcs/patches/20080622163241-34904-199b3654328d78c0b9fe2fa85a3ecc1ab0b1262a.gz differ diff --git a/_darcs/patches/20080622163458-34904-1be378ff9765dcfdf491ea8d38ef6c157ebe99ce.gz b/_darcs/patches/20080622163458-34904-1be378ff9765dcfdf491ea8d38ef6c157ebe99ce.gz new file mode 100644 index 0000000000..e91d6c95ea Binary files /dev/null and b/_darcs/patches/20080622163458-34904-1be378ff9765dcfdf491ea8d38ef6c157ebe99ce.gz differ diff --git a/_darcs/patches/20080622164013-34904-4119be65edb5fc09dcbe11edf17c3401f1d19a33.gz b/_darcs/patches/20080622164013-34904-4119be65edb5fc09dcbe11edf17c3401f1d19a33.gz new file mode 100644 index 0000000000..10a64d3939 Binary files /dev/null and b/_darcs/patches/20080622164013-34904-4119be65edb5fc09dcbe11edf17c3401f1d19a33.gz differ diff --git a/_darcs/patches/20080622164542-34904-e6945828677580ee30b5fb85101928633708f605.gz b/_darcs/patches/20080622164542-34904-e6945828677580ee30b5fb85101928633708f605.gz new file mode 100644 index 0000000000..152456013c Binary files /dev/null and b/_darcs/patches/20080622164542-34904-e6945828677580ee30b5fb85101928633708f605.gz differ diff --git a/_darcs/patches/20080622164928-34904-04e381d2ac562a31fb3ed3dce300e2c2c456b0d7.gz b/_darcs/patches/20080622164928-34904-04e381d2ac562a31fb3ed3dce300e2c2c456b0d7.gz new file mode 100644 index 0000000000..2b55b6a740 Binary files /dev/null and b/_darcs/patches/20080622164928-34904-04e381d2ac562a31fb3ed3dce300e2c2c456b0d7.gz differ diff --git a/_darcs/patches/20080622164928-34904-77df2f698c617e2788cc0db2d902238a5dd522d1.gz b/_darcs/patches/20080622164928-34904-77df2f698c617e2788cc0db2d902238a5dd522d1.gz new file mode 100644 index 0000000000..2eb1e79ff4 Binary files /dev/null and b/_darcs/patches/20080622164928-34904-77df2f698c617e2788cc0db2d902238a5dd522d1.gz differ diff --git a/_darcs/patches/20080622165453-34904-a3bdd2557622e6db3aef88371c22586e2d2fed07.gz b/_darcs/patches/20080622165453-34904-a3bdd2557622e6db3aef88371c22586e2d2fed07.gz new file mode 100644 index 0000000000..dcade81741 Binary files /dev/null and b/_darcs/patches/20080622165453-34904-a3bdd2557622e6db3aef88371c22586e2d2fed07.gz differ diff --git a/_darcs/patches/20080622172309-34904-734a780cc39d8716ca998ece451fec8923d9cbe7.gz b/_darcs/patches/20080622172309-34904-734a780cc39d8716ca998ece451fec8923d9cbe7.gz new file mode 100644 index 0000000000..e0ce10d067 Binary files /dev/null and b/_darcs/patches/20080622172309-34904-734a780cc39d8716ca998ece451fec8923d9cbe7.gz differ diff --git a/_darcs/patches/20080622172354-34904-6d09d8e6cceafb348b88528fe15e907bf1244347.gz b/_darcs/patches/20080622172354-34904-6d09d8e6cceafb348b88528fe15e907bf1244347.gz new file mode 100644 index 0000000000..bb6d3fff49 Binary files /dev/null and b/_darcs/patches/20080622172354-34904-6d09d8e6cceafb348b88528fe15e907bf1244347.gz differ diff --git a/_darcs/patches/20080622172408-34904-76462f7172a89292a1f5125bd616fc789f1199d5.gz b/_darcs/patches/20080622172408-34904-76462f7172a89292a1f5125bd616fc789f1199d5.gz new file mode 100644 index 0000000000..f3cc237fbb Binary files /dev/null and b/_darcs/patches/20080622172408-34904-76462f7172a89292a1f5125bd616fc789f1199d5.gz differ diff --git a/_darcs/patches/20080622173341-34904-3c406ca9a33dbe3afeacebef1a63d0dd101669c4.gz b/_darcs/patches/20080622173341-34904-3c406ca9a33dbe3afeacebef1a63d0dd101669c4.gz new file mode 100644 index 0000000000..b19bf620b9 Binary files /dev/null and b/_darcs/patches/20080622173341-34904-3c406ca9a33dbe3afeacebef1a63d0dd101669c4.gz differ diff --git a/_darcs/patches/20080622180437-34904-4b6313f6fd8845232031663c5c2df00dff725183.gz b/_darcs/patches/20080622180437-34904-4b6313f6fd8845232031663c5c2df00dff725183.gz new file mode 100644 index 0000000000..6cce0bf952 Binary files /dev/null and b/_darcs/patches/20080622180437-34904-4b6313f6fd8845232031663c5c2df00dff725183.gz differ diff --git a/_darcs/patches/20080622181550-34904-7970919db30ccfc3979fa6c118c29af9eac0c550.gz b/_darcs/patches/20080622181550-34904-7970919db30ccfc3979fa6c118c29af9eac0c550.gz new file mode 100644 index 0000000000..352bba3837 Binary files /dev/null and b/_darcs/patches/20080622181550-34904-7970919db30ccfc3979fa6c118c29af9eac0c550.gz differ diff --git a/_darcs/patches/20080623022710-84dde-bf3d3e3ce87957b9a91d38c16cf834d07b9933ea.gz b/_darcs/patches/20080623022710-84dde-bf3d3e3ce87957b9a91d38c16cf834d07b9933ea.gz new file mode 100644 index 0000000000..c2368e7ca4 Binary files /dev/null and b/_darcs/patches/20080623022710-84dde-bf3d3e3ce87957b9a91d38c16cf834d07b9933ea.gz differ diff --git a/_darcs/patches/20080623023859-84dde-1c72985ee0a840e59d1fac88f27f929f3c637b65.gz b/_darcs/patches/20080623023859-84dde-1c72985ee0a840e59d1fac88f27f929f3c637b65.gz new file mode 100644 index 0000000000..304f958c5b Binary files /dev/null and b/_darcs/patches/20080623023859-84dde-1c72985ee0a840e59d1fac88f27f929f3c637b65.gz differ diff --git a/_darcs/patches/20080623030150-84dde-d065378a7cf8371924ebf3a76bf9b25d0d50795e.gz b/_darcs/patches/20080623030150-84dde-d065378a7cf8371924ebf3a76bf9b25d0d50795e.gz new file mode 100644 index 0000000000..c0bddecc6c Binary files /dev/null and b/_darcs/patches/20080623030150-84dde-d065378a7cf8371924ebf3a76bf9b25d0d50795e.gz differ diff --git a/_darcs/patches/20080623030259-84dde-303fe8b38d237871861b5475c2b15b3d8605369b.gz b/_darcs/patches/20080623030259-84dde-303fe8b38d237871861b5475c2b15b3d8605369b.gz new file mode 100644 index 0000000000..e96d55bffb Binary files /dev/null and b/_darcs/patches/20080623030259-84dde-303fe8b38d237871861b5475c2b15b3d8605369b.gz differ diff --git a/_darcs/patches/20080623030523-84dde-d667f0e35b5719cee8496df4b0782dbb4afe5177.gz b/_darcs/patches/20080623030523-84dde-d667f0e35b5719cee8496df4b0782dbb4afe5177.gz new file mode 100644 index 0000000000..83daf44797 Binary files /dev/null and b/_darcs/patches/20080623030523-84dde-d667f0e35b5719cee8496df4b0782dbb4afe5177.gz differ diff --git a/_darcs/patches/20080623030837-982e4-532ccd8899fd8be00575f8840da0defb44cd56f8.gz b/_darcs/patches/20080623030837-982e4-532ccd8899fd8be00575f8840da0defb44cd56f8.gz new file mode 100644 index 0000000000..a2fc4bf48a Binary files /dev/null and b/_darcs/patches/20080623030837-982e4-532ccd8899fd8be00575f8840da0defb44cd56f8.gz differ diff --git a/_darcs/patches/20080623030930-84dde-9bfebd8ecec06f985fdb2a79536c652391855d13.gz b/_darcs/patches/20080623030930-84dde-9bfebd8ecec06f985fdb2a79536c652391855d13.gz new file mode 100644 index 0000000000..f1f23c6cb8 Binary files /dev/null and b/_darcs/patches/20080623030930-84dde-9bfebd8ecec06f985fdb2a79536c652391855d13.gz differ diff --git a/_darcs/patches/20080623031058-84dde-60487882c7bc8a29742b0ebd75c32a213ec22a39.gz b/_darcs/patches/20080623031058-84dde-60487882c7bc8a29742b0ebd75c32a213ec22a39.gz new file mode 100644 index 0000000000..4268cc88cd Binary files /dev/null and b/_darcs/patches/20080623031058-84dde-60487882c7bc8a29742b0ebd75c32a213ec22a39.gz differ diff --git a/_darcs/patches/20080623041816-34904-9a55d96a3e76e27b399706f7247bb715f396366b.gz b/_darcs/patches/20080623041816-34904-9a55d96a3e76e27b399706f7247bb715f396366b.gz new file mode 100644 index 0000000000..e52e283f99 Binary files /dev/null and b/_darcs/patches/20080623041816-34904-9a55d96a3e76e27b399706f7247bb715f396366b.gz differ diff --git a/_darcs/patches/20080623173043-982e4-5951fba93a2aa28f3e8e622167f6b33c1abc6949.gz b/_darcs/patches/20080623173043-982e4-5951fba93a2aa28f3e8e622167f6b33c1abc6949.gz new file mode 100644 index 0000000000..2f2a6086a2 Binary files /dev/null and b/_darcs/patches/20080623173043-982e4-5951fba93a2aa28f3e8e622167f6b33c1abc6949.gz differ diff --git a/_darcs/patches/20080623223641-34904-2758e19c70026a0c169e99d86481d87b0b4bc79c.gz b/_darcs/patches/20080623223641-34904-2758e19c70026a0c169e99d86481d87b0b4bc79c.gz new file mode 100644 index 0000000000..9f8f22a7f2 Binary files /dev/null and b/_darcs/patches/20080623223641-34904-2758e19c70026a0c169e99d86481d87b0b4bc79c.gz differ diff --git a/_darcs/patches/20080624001523-34904-8d0c052f12301d86aeb9107149b34f22c94da1c4.gz b/_darcs/patches/20080624001523-34904-8d0c052f12301d86aeb9107149b34f22c94da1c4.gz new file mode 100644 index 0000000000..e97f1aef26 Binary files /dev/null and b/_darcs/patches/20080624001523-34904-8d0c052f12301d86aeb9107149b34f22c94da1c4.gz differ diff --git a/_darcs/patches/20080624013203-34904-fe87dc6b3b991e9753512b8b7cc192f7610eb1dc.gz b/_darcs/patches/20080624013203-34904-fe87dc6b3b991e9753512b8b7cc192f7610eb1dc.gz new file mode 100644 index 0000000000..d8d0208715 Binary files /dev/null and b/_darcs/patches/20080624013203-34904-fe87dc6b3b991e9753512b8b7cc192f7610eb1dc.gz differ diff --git a/_darcs/patches/20080624014241-34904-39ace8e82e50e5f50c5980b5fb3256184a7c9050.gz b/_darcs/patches/20080624014241-34904-39ace8e82e50e5f50c5980b5fb3256184a7c9050.gz new file mode 100644 index 0000000000..73388fe6a4 Binary files /dev/null and b/_darcs/patches/20080624014241-34904-39ace8e82e50e5f50c5980b5fb3256184a7c9050.gz differ diff --git a/_darcs/patches/20080624014625-34904-81e30387f4350499f83f12bb9f7eb460c6ebf6dc.gz b/_darcs/patches/20080624014625-34904-81e30387f4350499f83f12bb9f7eb460c6ebf6dc.gz new file mode 100644 index 0000000000..c6fc86b3b0 Binary files /dev/null and b/_darcs/patches/20080624014625-34904-81e30387f4350499f83f12bb9f7eb460c6ebf6dc.gz differ diff --git a/_darcs/patches/20080624014642-34904-7d4b1b91a3163add6a99146f92360913e172a39a.gz b/_darcs/patches/20080624014642-34904-7d4b1b91a3163add6a99146f92360913e172a39a.gz new file mode 100644 index 0000000000..b8ea050c58 Binary files /dev/null and b/_darcs/patches/20080624014642-34904-7d4b1b91a3163add6a99146f92360913e172a39a.gz differ diff --git a/_darcs/patches/20080624014843-34904-4626ab17bfcd320e06e6e5704491c74756b4028c.gz b/_darcs/patches/20080624014843-34904-4626ab17bfcd320e06e6e5704491c74756b4028c.gz new file mode 100644 index 0000000000..dd269c5d72 Binary files /dev/null and b/_darcs/patches/20080624014843-34904-4626ab17bfcd320e06e6e5704491c74756b4028c.gz differ diff --git a/_darcs/patches/20080624015001-34904-5ce1e31677627baa3b4241530cfe2ae0e385c541.gz b/_darcs/patches/20080624015001-34904-5ce1e31677627baa3b4241530cfe2ae0e385c541.gz new file mode 100644 index 0000000000..da83cbe504 Binary files /dev/null and b/_darcs/patches/20080624015001-34904-5ce1e31677627baa3b4241530cfe2ae0e385c541.gz differ diff --git a/_darcs/patches/20080624015616-34904-c1ff985257c8c57aacf68439488d628a8b4d2e38.gz b/_darcs/patches/20080624015616-34904-c1ff985257c8c57aacf68439488d628a8b4d2e38.gz new file mode 100644 index 0000000000..1853a37d57 Binary files /dev/null and b/_darcs/patches/20080624015616-34904-c1ff985257c8c57aacf68439488d628a8b4d2e38.gz differ diff --git a/_darcs/patches/20080624020205-34904-be536546e7058ed77a6d45be4f91ffe201b3448e.gz b/_darcs/patches/20080624020205-34904-be536546e7058ed77a6d45be4f91ffe201b3448e.gz new file mode 100644 index 0000000000..1505b0b1f5 Binary files /dev/null and b/_darcs/patches/20080624020205-34904-be536546e7058ed77a6d45be4f91ffe201b3448e.gz differ diff --git a/_darcs/patches/20080624025234-34904-ad20001bf35bf41fcb63a0c357fd929aacc55fdb.gz b/_darcs/patches/20080624025234-34904-ad20001bf35bf41fcb63a0c357fd929aacc55fdb.gz new file mode 100644 index 0000000000..c2ed6c328b Binary files /dev/null and b/_darcs/patches/20080624025234-34904-ad20001bf35bf41fcb63a0c357fd929aacc55fdb.gz differ diff --git a/_darcs/patches/20080624030034-34904-bdcb6197d2050bc37f9daaf6f849aed5890bce53.gz b/_darcs/patches/20080624030034-34904-bdcb6197d2050bc37f9daaf6f849aed5890bce53.gz new file mode 100644 index 0000000000..44db75c999 Binary files /dev/null and b/_darcs/patches/20080624030034-34904-bdcb6197d2050bc37f9daaf6f849aed5890bce53.gz differ diff --git a/_darcs/patches/20080624030741-34904-e5b601dd4d76b367ae09a61923b062f6a36702f7.gz b/_darcs/patches/20080624030741-34904-e5b601dd4d76b367ae09a61923b062f6a36702f7.gz new file mode 100644 index 0000000000..a09917b1f4 Binary files /dev/null and b/_darcs/patches/20080624030741-34904-e5b601dd4d76b367ae09a61923b062f6a36702f7.gz differ diff --git a/_darcs/patches/20080624030834-34904-6efc827f64aebc23a1d2f3602c562fff69b9a0df.gz b/_darcs/patches/20080624030834-34904-6efc827f64aebc23a1d2f3602c562fff69b9a0df.gz new file mode 100644 index 0000000000..3090b68824 Binary files /dev/null and b/_darcs/patches/20080624030834-34904-6efc827f64aebc23a1d2f3602c562fff69b9a0df.gz differ diff --git a/_darcs/patches/20080624031057-34904-7a2597a8f56d9d49ad8f126c55058893a922c89f.gz b/_darcs/patches/20080624031057-34904-7a2597a8f56d9d49ad8f126c55058893a922c89f.gz new file mode 100644 index 0000000000..0d1281e2d1 Binary files /dev/null and b/_darcs/patches/20080624031057-34904-7a2597a8f56d9d49ad8f126c55058893a922c89f.gz differ diff --git a/_darcs/patches/20080624031746-34904-3719874e1e0afa201e5c81e267531f0768ddacd9.gz b/_darcs/patches/20080624031746-34904-3719874e1e0afa201e5c81e267531f0768ddacd9.gz new file mode 100644 index 0000000000..5ff0c0049f Binary files /dev/null and b/_darcs/patches/20080624031746-34904-3719874e1e0afa201e5c81e267531f0768ddacd9.gz differ diff --git a/_darcs/patches/20080624031927-34904-4a0c4d5966c8dd840cf6c368bdbe47990a39c074.gz b/_darcs/patches/20080624031927-34904-4a0c4d5966c8dd840cf6c368bdbe47990a39c074.gz new file mode 100644 index 0000000000..c797453aec Binary files /dev/null and b/_darcs/patches/20080624031927-34904-4a0c4d5966c8dd840cf6c368bdbe47990a39c074.gz differ diff --git a/_darcs/patches/20080624032408-34904-1437e0359bd81c780e8ab12bdcbd1f9d8c87ef1c.gz b/_darcs/patches/20080624032408-34904-1437e0359bd81c780e8ab12bdcbd1f9d8c87ef1c.gz new file mode 100644 index 0000000000..fa50e48037 Binary files /dev/null and b/_darcs/patches/20080624032408-34904-1437e0359bd81c780e8ab12bdcbd1f9d8c87ef1c.gz differ diff --git a/_darcs/patches/20080624032818-34904-bf8c5594c42c797820e080250c955645a5a84aa1.gz b/_darcs/patches/20080624032818-34904-bf8c5594c42c797820e080250c955645a5a84aa1.gz new file mode 100644 index 0000000000..fc013fdcd2 Binary files /dev/null and b/_darcs/patches/20080624032818-34904-bf8c5594c42c797820e080250c955645a5a84aa1.gz differ diff --git a/_darcs/patches/20080624033223-34904-39ffa0aebcb9d173a7e5dd09870681ebb6e7313d.gz b/_darcs/patches/20080624033223-34904-39ffa0aebcb9d173a7e5dd09870681ebb6e7313d.gz new file mode 100644 index 0000000000..0ef6198d11 Binary files /dev/null and b/_darcs/patches/20080624033223-34904-39ffa0aebcb9d173a7e5dd09870681ebb6e7313d.gz differ diff --git a/_darcs/patches/20080624034906-34904-a21bab1db498d69c616606126f6b788a2188b1e2.gz b/_darcs/patches/20080624034906-34904-a21bab1db498d69c616606126f6b788a2188b1e2.gz new file mode 100644 index 0000000000..a9561cdf04 Binary files /dev/null and b/_darcs/patches/20080624034906-34904-a21bab1db498d69c616606126f6b788a2188b1e2.gz differ diff --git a/_darcs/patches/20080624040058-34904-0f16041ec545e1a42384178f6cd52edcae967d2a.gz b/_darcs/patches/20080624040058-34904-0f16041ec545e1a42384178f6cd52edcae967d2a.gz new file mode 100644 index 0000000000..4bc27e01ed Binary files /dev/null and b/_darcs/patches/20080624040058-34904-0f16041ec545e1a42384178f6cd52edcae967d2a.gz differ diff --git a/_darcs/patches/20080624040234-34904-bf5e87a55ee94c74b840c6a62e78e476c7b5f8d3.gz b/_darcs/patches/20080624040234-34904-bf5e87a55ee94c74b840c6a62e78e476c7b5f8d3.gz new file mode 100644 index 0000000000..3f7f1917b3 Binary files /dev/null and b/_darcs/patches/20080624040234-34904-bf5e87a55ee94c74b840c6a62e78e476c7b5f8d3.gz differ diff --git a/_darcs/patches/20080624040548-34904-3b5a78f4ed40db913c82e90fe6955f26aac0f92a.gz b/_darcs/patches/20080624040548-34904-3b5a78f4ed40db913c82e90fe6955f26aac0f92a.gz new file mode 100644 index 0000000000..3eff76bc54 Binary files /dev/null and b/_darcs/patches/20080624040548-34904-3b5a78f4ed40db913c82e90fe6955f26aac0f92a.gz differ diff --git a/_darcs/patches/20080624171305-982e4-732e5d4f9ad5d92145c6cbc7568ef9393e962dfb.gz b/_darcs/patches/20080624171305-982e4-732e5d4f9ad5d92145c6cbc7568ef9393e962dfb.gz new file mode 100644 index 0000000000..25b180d19c Binary files /dev/null and b/_darcs/patches/20080624171305-982e4-732e5d4f9ad5d92145c6cbc7568ef9393e962dfb.gz differ diff --git a/_darcs/patches/20080624174613-982e4-1a6f11365957e6f4ed70b87ce64fb9938441f01f.gz b/_darcs/patches/20080624174613-982e4-1a6f11365957e6f4ed70b87ce64fb9938441f01f.gz new file mode 100644 index 0000000000..849bfbbe1b Binary files /dev/null and b/_darcs/patches/20080624174613-982e4-1a6f11365957e6f4ed70b87ce64fb9938441f01f.gz differ diff --git a/_darcs/patches/20080624215033-34904-d5576bf55da26df44f0580c3759ed3edd8597506.gz b/_darcs/patches/20080624215033-34904-d5576bf55da26df44f0580c3759ed3edd8597506.gz new file mode 100644 index 0000000000..45131caffa Binary files /dev/null and b/_darcs/patches/20080624215033-34904-d5576bf55da26df44f0580c3759ed3edd8597506.gz differ diff --git a/_darcs/patches/20080624215826-34904-045d8e8cc25195eb045d2a96a526a6d2a9f0c218.gz b/_darcs/patches/20080624215826-34904-045d8e8cc25195eb045d2a96a526a6d2a9f0c218.gz new file mode 100644 index 0000000000..b405f3e11e Binary files /dev/null and b/_darcs/patches/20080624215826-34904-045d8e8cc25195eb045d2a96a526a6d2a9f0c218.gz differ diff --git a/_darcs/patches/20080624220335-34904-2c4089bf6d1b37b6f613ce89c6fad104727e7487.gz b/_darcs/patches/20080624220335-34904-2c4089bf6d1b37b6f613ce89c6fad104727e7487.gz new file mode 100644 index 0000000000..316103c3b3 Binary files /dev/null and b/_darcs/patches/20080624220335-34904-2c4089bf6d1b37b6f613ce89c6fad104727e7487.gz differ diff --git a/_darcs/patches/20080624220626-34904-94cb8a4cd1f1a7a96e78ab57e760f8de42f4eaca.gz b/_darcs/patches/20080624220626-34904-94cb8a4cd1f1a7a96e78ab57e760f8de42f4eaca.gz new file mode 100644 index 0000000000..78df24217c Binary files /dev/null and b/_darcs/patches/20080624220626-34904-94cb8a4cd1f1a7a96e78ab57e760f8de42f4eaca.gz differ diff --git a/_darcs/patches/20080624221054-34904-732acfe742c0b1c5e71b604660aa2e657c68a4d4.gz b/_darcs/patches/20080624221054-34904-732acfe742c0b1c5e71b604660aa2e657c68a4d4.gz new file mode 100644 index 0000000000..db4af1e4bc Binary files /dev/null and b/_darcs/patches/20080624221054-34904-732acfe742c0b1c5e71b604660aa2e657c68a4d4.gz differ diff --git a/_darcs/patches/20080624221437-34904-746bd79dbef949c16095b9b44a9a721288abb989.gz b/_darcs/patches/20080624221437-34904-746bd79dbef949c16095b9b44a9a721288abb989.gz new file mode 100644 index 0000000000..719b09560e Binary files /dev/null and b/_darcs/patches/20080624221437-34904-746bd79dbef949c16095b9b44a9a721288abb989.gz differ diff --git a/_darcs/patches/20080624221758-34904-8ba5bbf95a2f16e9bfebb2c4dbd4d2d357cf958e.gz b/_darcs/patches/20080624221758-34904-8ba5bbf95a2f16e9bfebb2c4dbd4d2d357cf958e.gz new file mode 100644 index 0000000000..d2cf054540 Binary files /dev/null and b/_darcs/patches/20080624221758-34904-8ba5bbf95a2f16e9bfebb2c4dbd4d2d357cf958e.gz differ diff --git a/_darcs/patches/20080624224030-34904-a2a50cfcadba05799094574201223907e6e423a6.gz b/_darcs/patches/20080624224030-34904-a2a50cfcadba05799094574201223907e6e423a6.gz new file mode 100644 index 0000000000..53372945fd Binary files /dev/null and b/_darcs/patches/20080624224030-34904-a2a50cfcadba05799094574201223907e6e423a6.gz differ diff --git a/_darcs/patches/20080624225556-34904-2f31fbe0944374892005ea88977736bda59729fa.gz b/_darcs/patches/20080624225556-34904-2f31fbe0944374892005ea88977736bda59729fa.gz new file mode 100644 index 0000000000..31971dfdfd Binary files /dev/null and b/_darcs/patches/20080624225556-34904-2f31fbe0944374892005ea88977736bda59729fa.gz differ diff --git a/_darcs/patches/20080625125847-982e4-b4c1c644fe07a43c61062ae3d9302148ab925088.gz b/_darcs/patches/20080625125847-982e4-b4c1c644fe07a43c61062ae3d9302148ab925088.gz new file mode 100644 index 0000000000..ee398a1f4e Binary files /dev/null and b/_darcs/patches/20080625125847-982e4-b4c1c644fe07a43c61062ae3d9302148ab925088.gz differ diff --git a/_darcs/patches/20080625142131-982e4-04a23e0c07cff075a3d0ad33f6d765d4eb8b5057.gz b/_darcs/patches/20080625142131-982e4-04a23e0c07cff075a3d0ad33f6d765d4eb8b5057.gz new file mode 100644 index 0000000000..2c30708ae7 Binary files /dev/null and b/_darcs/patches/20080625142131-982e4-04a23e0c07cff075a3d0ad33f6d765d4eb8b5057.gz differ diff --git a/_darcs/patches/20080626064646-34904-d9b9bba1994626cc242e1ed7222762e8e3a90543.gz b/_darcs/patches/20080626064646-34904-d9b9bba1994626cc242e1ed7222762e8e3a90543.gz new file mode 100644 index 0000000000..6942bb2dc5 Binary files /dev/null and b/_darcs/patches/20080626064646-34904-d9b9bba1994626cc242e1ed7222762e8e3a90543.gz differ diff --git a/_darcs/patches/20080626070703-34904-b6c6a9b1df39f09221c450dcb3d32f6da6e2df5e.gz b/_darcs/patches/20080626070703-34904-b6c6a9b1df39f09221c450dcb3d32f6da6e2df5e.gz new file mode 100644 index 0000000000..08b82a8b6c Binary files /dev/null and b/_darcs/patches/20080626070703-34904-b6c6a9b1df39f09221c450dcb3d32f6da6e2df5e.gz differ diff --git a/_darcs/patches/20080626071213-34904-aefba28162aa3afb1b3e8152ee8210fe3108b841.gz b/_darcs/patches/20080626071213-34904-aefba28162aa3afb1b3e8152ee8210fe3108b841.gz new file mode 100644 index 0000000000..22f37e7c3f Binary files /dev/null and b/_darcs/patches/20080626071213-34904-aefba28162aa3afb1b3e8152ee8210fe3108b841.gz differ diff --git a/_darcs/patches/20080626072159-34904-b025f2d626b3421ca0a658b5664504b4a261b993.gz b/_darcs/patches/20080626072159-34904-b025f2d626b3421ca0a658b5664504b4a261b993.gz new file mode 100644 index 0000000000..c51aec39a7 Binary files /dev/null and b/_darcs/patches/20080626072159-34904-b025f2d626b3421ca0a658b5664504b4a261b993.gz differ diff --git a/_darcs/patches/20080626073530-34904-e56c156737db036b0de4bd6e396833bf044cb865.gz b/_darcs/patches/20080626073530-34904-e56c156737db036b0de4bd6e396833bf044cb865.gz new file mode 100644 index 0000000000..c61ebdc4d0 Binary files /dev/null and b/_darcs/patches/20080626073530-34904-e56c156737db036b0de4bd6e396833bf044cb865.gz differ diff --git a/_darcs/patches/20080626075920-34904-0aad06d788f8dbf3a03d17752ba49d866322594e.gz b/_darcs/patches/20080626075920-34904-0aad06d788f8dbf3a03d17752ba49d866322594e.gz new file mode 100644 index 0000000000..21012301ba Binary files /dev/null and b/_darcs/patches/20080626075920-34904-0aad06d788f8dbf3a03d17752ba49d866322594e.gz differ diff --git a/_darcs/patches/20080626080214-34904-88d67a23cbdde21dd74064e6e0c401fb7204699a.gz b/_darcs/patches/20080626080214-34904-88d67a23cbdde21dd74064e6e0c401fb7204699a.gz new file mode 100644 index 0000000000..cf8691365d Binary files /dev/null and b/_darcs/patches/20080626080214-34904-88d67a23cbdde21dd74064e6e0c401fb7204699a.gz differ diff --git a/_darcs/patches/20080626080626-34904-e6783597cc1317894d9f6a301edf3ef69c529ce9.gz b/_darcs/patches/20080626080626-34904-e6783597cc1317894d9f6a301edf3ef69c529ce9.gz new file mode 100644 index 0000000000..9057ea62db Binary files /dev/null and b/_darcs/patches/20080626080626-34904-e6783597cc1317894d9f6a301edf3ef69c529ce9.gz differ diff --git a/_darcs/patches/20080626150336-34904-bfa5ec8740ba1edf60c34e1ef6aafdfd73fc99a2.gz b/_darcs/patches/20080626150336-34904-bfa5ec8740ba1edf60c34e1ef6aafdfd73fc99a2.gz new file mode 100644 index 0000000000..82247d1a62 Binary files /dev/null and b/_darcs/patches/20080626150336-34904-bfa5ec8740ba1edf60c34e1ef6aafdfd73fc99a2.gz differ diff --git a/_darcs/patches/20080626151202-34904-dbf62574fe1002a76002018ad1dfe8de8ec9774b.gz b/_darcs/patches/20080626151202-34904-dbf62574fe1002a76002018ad1dfe8de8ec9774b.gz new file mode 100644 index 0000000000..bf9f90962b Binary files /dev/null and b/_darcs/patches/20080626151202-34904-dbf62574fe1002a76002018ad1dfe8de8ec9774b.gz differ diff --git a/_darcs/patches/20080626152044-34904-2724922671149ab7ee40241d96199d80e2ecc1fe.gz b/_darcs/patches/20080626152044-34904-2724922671149ab7ee40241d96199d80e2ecc1fe.gz new file mode 100644 index 0000000000..3a68bea20a Binary files /dev/null and b/_darcs/patches/20080626152044-34904-2724922671149ab7ee40241d96199d80e2ecc1fe.gz differ diff --git a/_darcs/patches/20080626181144-34904-87503e70e6705b06ebb6c19910583f4fba1b22e0.gz b/_darcs/patches/20080626181144-34904-87503e70e6705b06ebb6c19910583f4fba1b22e0.gz new file mode 100644 index 0000000000..d546bcf772 Binary files /dev/null and b/_darcs/patches/20080626181144-34904-87503e70e6705b06ebb6c19910583f4fba1b22e0.gz differ diff --git a/_darcs/patches/20080626181726-34904-c21801c5f2a74b6e66130308cdc106429cf7f43c.gz b/_darcs/patches/20080626181726-34904-c21801c5f2a74b6e66130308cdc106429cf7f43c.gz new file mode 100644 index 0000000000..e039914fba Binary files /dev/null and b/_darcs/patches/20080626181726-34904-c21801c5f2a74b6e66130308cdc106429cf7f43c.gz differ diff --git a/_darcs/patches/20080626182231-34904-e8d139c2a8b5cd07fa0179b0bcf5cd41f1a1217b.gz b/_darcs/patches/20080626182231-34904-e8d139c2a8b5cd07fa0179b0bcf5cd41f1a1217b.gz new file mode 100644 index 0000000000..f9326fcd06 Binary files /dev/null and b/_darcs/patches/20080626182231-34904-e8d139c2a8b5cd07fa0179b0bcf5cd41f1a1217b.gz differ diff --git a/_darcs/patches/20080626182705-34904-893d72f480c330beb2d8f871da0d2cd9b902ffbf.gz b/_darcs/patches/20080626182705-34904-893d72f480c330beb2d8f871da0d2cd9b902ffbf.gz new file mode 100644 index 0000000000..bbfd615e3e Binary files /dev/null and b/_darcs/patches/20080626182705-34904-893d72f480c330beb2d8f871da0d2cd9b902ffbf.gz differ diff --git a/_darcs/patches/20080626183117-34904-62bd1ba2aab5cf8a0d351b3b600369fec7956b3f.gz b/_darcs/patches/20080626183117-34904-62bd1ba2aab5cf8a0d351b3b600369fec7956b3f.gz new file mode 100644 index 0000000000..deb6e0cd0d Binary files /dev/null and b/_darcs/patches/20080626183117-34904-62bd1ba2aab5cf8a0d351b3b600369fec7956b3f.gz differ diff --git a/_darcs/patches/20080626183721-34904-7c03b34e911ddb0c4adba959402d49476be932c1.gz b/_darcs/patches/20080626183721-34904-7c03b34e911ddb0c4adba959402d49476be932c1.gz new file mode 100644 index 0000000000..391ae7c6e1 Binary files /dev/null and b/_darcs/patches/20080626183721-34904-7c03b34e911ddb0c4adba959402d49476be932c1.gz differ diff --git a/_darcs/patches/20080626184055-34904-05d1ef61bcf973b4b2c234b08708fd8c62805c2a.gz b/_darcs/patches/20080626184055-34904-05d1ef61bcf973b4b2c234b08708fd8c62805c2a.gz new file mode 100644 index 0000000000..51ac7712ca Binary files /dev/null and b/_darcs/patches/20080626184055-34904-05d1ef61bcf973b4b2c234b08708fd8c62805c2a.gz differ diff --git a/_darcs/patches/20080626184811-34904-d5d7373acb89b06eb3f0854d83b0ac425a70d1e2.gz b/_darcs/patches/20080626184811-34904-d5d7373acb89b06eb3f0854d83b0ac425a70d1e2.gz new file mode 100644 index 0000000000..238da4e5b5 Binary files /dev/null and b/_darcs/patches/20080626184811-34904-d5d7373acb89b06eb3f0854d83b0ac425a70d1e2.gz differ diff --git a/_darcs/patches/20080626184931-34904-d83ce6fc0f3d126929e01804dafea466249b329b.gz b/_darcs/patches/20080626184931-34904-d83ce6fc0f3d126929e01804dafea466249b329b.gz new file mode 100644 index 0000000000..d6169aafa9 Binary files /dev/null and b/_darcs/patches/20080626184931-34904-d83ce6fc0f3d126929e01804dafea466249b329b.gz differ diff --git a/_darcs/patches/20080626190307-34904-5aca9b62944d4e8f6170705dec822d30a1163401.gz b/_darcs/patches/20080626190307-34904-5aca9b62944d4e8f6170705dec822d30a1163401.gz new file mode 100644 index 0000000000..cbd39548d7 Binary files /dev/null and b/_darcs/patches/20080626190307-34904-5aca9b62944d4e8f6170705dec822d30a1163401.gz differ diff --git a/_darcs/patches/20080626190538-34904-d160176208203bcc806e824874c75021b32b6f92.gz b/_darcs/patches/20080626190538-34904-d160176208203bcc806e824874c75021b32b6f92.gz new file mode 100644 index 0000000000..d09b797da1 Binary files /dev/null and b/_darcs/patches/20080626190538-34904-d160176208203bcc806e824874c75021b32b6f92.gz differ diff --git a/_darcs/patches/20080626203103-34904-19ef53bc734622a310a705608f3e227e2f387904.gz b/_darcs/patches/20080626203103-34904-19ef53bc734622a310a705608f3e227e2f387904.gz new file mode 100644 index 0000000000..6b434c1c94 Binary files /dev/null and b/_darcs/patches/20080626203103-34904-19ef53bc734622a310a705608f3e227e2f387904.gz differ diff --git a/_darcs/patches/20080626203935-34904-bf73b91cc008b28a0d0d2187dfaa346784c23afd.gz b/_darcs/patches/20080626203935-34904-bf73b91cc008b28a0d0d2187dfaa346784c23afd.gz new file mode 100644 index 0000000000..4c0fa9de7b Binary files /dev/null and b/_darcs/patches/20080626203935-34904-bf73b91cc008b28a0d0d2187dfaa346784c23afd.gz differ diff --git a/_darcs/patches/20080626205409-34904-62ff39380f8fc22085825d0cee5fe8cf356459e5.gz b/_darcs/patches/20080626205409-34904-62ff39380f8fc22085825d0cee5fe8cf356459e5.gz new file mode 100644 index 0000000000..e46c627a60 Binary files /dev/null and b/_darcs/patches/20080626205409-34904-62ff39380f8fc22085825d0cee5fe8cf356459e5.gz differ diff --git a/_darcs/patches/20080626205418-34904-3c00363d01955e4df73b0ef730c23188f03b548f.gz b/_darcs/patches/20080626205418-34904-3c00363d01955e4df73b0ef730c23188f03b548f.gz new file mode 100644 index 0000000000..28b833e703 Binary files /dev/null and b/_darcs/patches/20080626205418-34904-3c00363d01955e4df73b0ef730c23188f03b548f.gz differ diff --git a/_darcs/patches/20080626213018-34904-d5efe7ae9489afa9f07e0336902c713ac731d948.gz b/_darcs/patches/20080626213018-34904-d5efe7ae9489afa9f07e0336902c713ac731d948.gz new file mode 100644 index 0000000000..1ae4fbb2d7 Binary files /dev/null and b/_darcs/patches/20080626213018-34904-d5efe7ae9489afa9f07e0336902c713ac731d948.gz differ diff --git a/_darcs/patches/20080626214654-34904-68a52888deaaca54fe39bcd77ae51997aa3a3959.gz b/_darcs/patches/20080626214654-34904-68a52888deaaca54fe39bcd77ae51997aa3a3959.gz new file mode 100644 index 0000000000..eeb614cfcc Binary files /dev/null and b/_darcs/patches/20080626214654-34904-68a52888deaaca54fe39bcd77ae51997aa3a3959.gz differ diff --git a/_darcs/patches/20080626215204-34904-04b3c1508c0265d47f7a01c5d0d99f9a4b1d1535.gz b/_darcs/patches/20080626215204-34904-04b3c1508c0265d47f7a01c5d0d99f9a4b1d1535.gz new file mode 100644 index 0000000000..a4a459585d Binary files /dev/null and b/_darcs/patches/20080626215204-34904-04b3c1508c0265d47f7a01c5d0d99f9a4b1d1535.gz differ diff --git a/_darcs/patches/20080626215308-34904-3dc92c082d793a92f3d3521f83ef38c009432d0b.gz b/_darcs/patches/20080626215308-34904-3dc92c082d793a92f3d3521f83ef38c009432d0b.gz new file mode 100644 index 0000000000..c354955732 Binary files /dev/null and b/_darcs/patches/20080626215308-34904-3dc92c082d793a92f3d3521f83ef38c009432d0b.gz differ diff --git a/_darcs/patches/20080626215308-34904-872bd73f57b618e9f5670d47ee26da993f81a431.gz b/_darcs/patches/20080626215308-34904-872bd73f57b618e9f5670d47ee26da993f81a431.gz new file mode 100644 index 0000000000..304bedb29c Binary files /dev/null and b/_darcs/patches/20080626215308-34904-872bd73f57b618e9f5670d47ee26da993f81a431.gz differ diff --git a/_darcs/patches/20080626215525-34904-6642f29eebddcdb52955017bdd69da9ee87c3d20.gz b/_darcs/patches/20080626215525-34904-6642f29eebddcdb52955017bdd69da9ee87c3d20.gz new file mode 100644 index 0000000000..154c4f0977 Binary files /dev/null and b/_darcs/patches/20080626215525-34904-6642f29eebddcdb52955017bdd69da9ee87c3d20.gz differ diff --git a/_darcs/patches/20080626224011-84dde-c6bbfcde6d0802ef3a2346524e0f883e6767c949.gz b/_darcs/patches/20080626224011-84dde-c6bbfcde6d0802ef3a2346524e0f883e6767c949.gz new file mode 100644 index 0000000000..c7e9b1e306 Binary files /dev/null and b/_darcs/patches/20080626224011-84dde-c6bbfcde6d0802ef3a2346524e0f883e6767c949.gz differ diff --git a/_darcs/patches/20080626224011-84dde-fcdb8c079ad3aef9be51e46651b6a75ea45f5fe6.gz b/_darcs/patches/20080626224011-84dde-fcdb8c079ad3aef9be51e46651b6a75ea45f5fe6.gz new file mode 100644 index 0000000000..eaeb170c9c Binary files /dev/null and b/_darcs/patches/20080626224011-84dde-fcdb8c079ad3aef9be51e46651b6a75ea45f5fe6.gz differ diff --git a/_darcs/patches/20080626225002-84dde-898a118457577e321f426270f8c98072962341ab.gz b/_darcs/patches/20080626225002-84dde-898a118457577e321f426270f8c98072962341ab.gz new file mode 100644 index 0000000000..8049733698 Binary files /dev/null and b/_darcs/patches/20080626225002-84dde-898a118457577e321f426270f8c98072962341ab.gz differ diff --git a/_darcs/patches/20080627143025-84dde-fee234fbcdf825cccc2ce0c9c812dcb27ebe6433.gz b/_darcs/patches/20080627143025-84dde-fee234fbcdf825cccc2ce0c9c812dcb27ebe6433.gz new file mode 100644 index 0000000000..32c3fac664 Binary files /dev/null and b/_darcs/patches/20080627143025-84dde-fee234fbcdf825cccc2ce0c9c812dcb27ebe6433.gz differ diff --git a/_darcs/patches/20080627145553-84dde-31e52074c9b8327bcebc46372e4ee8f86b77ea20.gz b/_darcs/patches/20080627145553-84dde-31e52074c9b8327bcebc46372e4ee8f86b77ea20.gz new file mode 100644 index 0000000000..b4641f4f3d Binary files /dev/null and b/_darcs/patches/20080627145553-84dde-31e52074c9b8327bcebc46372e4ee8f86b77ea20.gz differ diff --git a/_darcs/patches/20080627154825-84dde-b876f7dff5e1b72b94432e26cf8af02e2c36d0cc.gz b/_darcs/patches/20080627154825-84dde-b876f7dff5e1b72b94432e26cf8af02e2c36d0cc.gz new file mode 100644 index 0000000000..016e83d6bf Binary files /dev/null and b/_darcs/patches/20080627154825-84dde-b876f7dff5e1b72b94432e26cf8af02e2c36d0cc.gz differ diff --git a/_darcs/patches/20080627171700-e4794-114dafeabd05784a3440dca54f0d95edf374794d.gz b/_darcs/patches/20080627171700-e4794-114dafeabd05784a3440dca54f0d95edf374794d.gz new file mode 100644 index 0000000000..f31d3e8896 Binary files /dev/null and b/_darcs/patches/20080627171700-e4794-114dafeabd05784a3440dca54f0d95edf374794d.gz differ diff --git a/_darcs/patches/20080627222522-84dde-9bef8dc543bbb945b1f05dbeed43924d27f704d1.gz b/_darcs/patches/20080627222522-84dde-9bef8dc543bbb945b1f05dbeed43924d27f704d1.gz new file mode 100644 index 0000000000..1d6ccd33b5 Binary files /dev/null and b/_darcs/patches/20080627222522-84dde-9bef8dc543bbb945b1f05dbeed43924d27f704d1.gz differ diff --git a/_darcs/patches/20080627222930-84dde-e54a369d91060b7ff2559af9ff08735b2eec43d9.gz b/_darcs/patches/20080627222930-84dde-e54a369d91060b7ff2559af9ff08735b2eec43d9.gz new file mode 100644 index 0000000000..55f8f90a97 Binary files /dev/null and b/_darcs/patches/20080627222930-84dde-e54a369d91060b7ff2559af9ff08735b2eec43d9.gz differ diff --git a/_darcs/patches/20080627223439-84dde-2d0a8a8284e2f6d6af8710a5b9a52f7d45658f81.gz b/_darcs/patches/20080627223439-84dde-2d0a8a8284e2f6d6af8710a5b9a52f7d45658f81.gz new file mode 100644 index 0000000000..b8bb63442b Binary files /dev/null and b/_darcs/patches/20080627223439-84dde-2d0a8a8284e2f6d6af8710a5b9a52f7d45658f81.gz differ diff --git a/_darcs/patches/20080630152415-84dde-7ee73e1b9b8684ebcfb957c2c33b20a8265e1e74.gz b/_darcs/patches/20080630152415-84dde-7ee73e1b9b8684ebcfb957c2c33b20a8265e1e74.gz new file mode 100644 index 0000000000..8abd98a88b Binary files /dev/null and b/_darcs/patches/20080630152415-84dde-7ee73e1b9b8684ebcfb957c2c33b20a8265e1e74.gz differ diff --git a/_darcs/patches/20080630161024-84dde-6afe93a69b91af9270b9e0536dea0e6c17ae2297.gz b/_darcs/patches/20080630161024-84dde-6afe93a69b91af9270b9e0536dea0e6c17ae2297.gz new file mode 100644 index 0000000000..675e1ea8c1 Binary files /dev/null and b/_darcs/patches/20080630161024-84dde-6afe93a69b91af9270b9e0536dea0e6c17ae2297.gz differ diff --git a/_darcs/patches/20080630161201-84dde-835e66e9abb6e5c447bfc9b97b29bdd27962ac41.gz b/_darcs/patches/20080630161201-84dde-835e66e9abb6e5c447bfc9b97b29bdd27962ac41.gz new file mode 100644 index 0000000000..c467a2c8f3 Binary files /dev/null and b/_darcs/patches/20080630161201-84dde-835e66e9abb6e5c447bfc9b97b29bdd27962ac41.gz differ diff --git a/_darcs/patches/20080630161304-84dde-c7f390e99502d6092a6597789a74a3f7790d38ed.gz b/_darcs/patches/20080630161304-84dde-c7f390e99502d6092a6597789a74a3f7790d38ed.gz new file mode 100644 index 0000000000..fca4307378 Binary files /dev/null and b/_darcs/patches/20080630161304-84dde-c7f390e99502d6092a6597789a74a3f7790d38ed.gz differ diff --git a/_darcs/patches/20080630164341-84dde-0d62a56b3c23e722b0b703ade5aa4220b9f2996a.gz b/_darcs/patches/20080630164341-84dde-0d62a56b3c23e722b0b703ade5aa4220b9f2996a.gz new file mode 100644 index 0000000000..0bc4e4af4d Binary files /dev/null and b/_darcs/patches/20080630164341-84dde-0d62a56b3c23e722b0b703ade5aa4220b9f2996a.gz differ diff --git a/_darcs/patches/20080630170342-84dde-5d7feb88a0a707b24c8070802a7ec99dd1f35687.gz b/_darcs/patches/20080630170342-84dde-5d7feb88a0a707b24c8070802a7ec99dd1f35687.gz new file mode 100644 index 0000000000..74fae89cf0 Binary files /dev/null and b/_darcs/patches/20080630170342-84dde-5d7feb88a0a707b24c8070802a7ec99dd1f35687.gz differ diff --git a/_darcs/patches/20080630170545-84dde-7bd95c43f3943e9cc5bf9ec6f57da0ff12204601.gz b/_darcs/patches/20080630170545-84dde-7bd95c43f3943e9cc5bf9ec6f57da0ff12204601.gz new file mode 100644 index 0000000000..17f73e52df Binary files /dev/null and b/_darcs/patches/20080630170545-84dde-7bd95c43f3943e9cc5bf9ec6f57da0ff12204601.gz differ diff --git a/_darcs/patches/20080630170653-84dde-e13ebf4ea364a6f12bb2692bc0278491a804c0fc.gz b/_darcs/patches/20080630170653-84dde-e13ebf4ea364a6f12bb2692bc0278491a804c0fc.gz new file mode 100644 index 0000000000..a5d8b1de3a Binary files /dev/null and b/_darcs/patches/20080630170653-84dde-e13ebf4ea364a6f12bb2692bc0278491a804c0fc.gz differ diff --git a/_darcs/patches/20080630171317-84dde-90df9a852df935c50507cd6986583fd80c2b1fd6.gz b/_darcs/patches/20080630171317-84dde-90df9a852df935c50507cd6986583fd80c2b1fd6.gz new file mode 100644 index 0000000000..f0da600351 Binary files /dev/null and b/_darcs/patches/20080630171317-84dde-90df9a852df935c50507cd6986583fd80c2b1fd6.gz differ diff --git a/_darcs/patches/20080630195032-84dde-941bafd039cd6483c5eee0ec9acde9df911a3d14.gz b/_darcs/patches/20080630195032-84dde-941bafd039cd6483c5eee0ec9acde9df911a3d14.gz new file mode 100644 index 0000000000..68861ea3b6 Binary files /dev/null and b/_darcs/patches/20080630195032-84dde-941bafd039cd6483c5eee0ec9acde9df911a3d14.gz differ diff --git a/_darcs/patches/20080630195139-84dde-d0d9297331f341f9fa0dda5c70ed574179de43c7.gz b/_darcs/patches/20080630195139-84dde-d0d9297331f341f9fa0dda5c70ed574179de43c7.gz new file mode 100644 index 0000000000..8dd04f9ae1 Binary files /dev/null and b/_darcs/patches/20080630195139-84dde-d0d9297331f341f9fa0dda5c70ed574179de43c7.gz differ diff --git a/_darcs/patches/20080701155442-84dde-948a31801bc639a0e5d7d9c04bee1fc0b1df7667.gz b/_darcs/patches/20080701155442-84dde-948a31801bc639a0e5d7d9c04bee1fc0b1df7667.gz new file mode 100644 index 0000000000..c10018558e Binary files /dev/null and b/_darcs/patches/20080701155442-84dde-948a31801bc639a0e5d7d9c04bee1fc0b1df7667.gz differ diff --git a/_darcs/patches/20080701155651-84dde-be2516b912927e565a518dbcddd8d071b006b501.gz b/_darcs/patches/20080701155651-84dde-be2516b912927e565a518dbcddd8d071b006b501.gz new file mode 100644 index 0000000000..67ff0c55ca Binary files /dev/null and b/_darcs/patches/20080701155651-84dde-be2516b912927e565a518dbcddd8d071b006b501.gz differ diff --git a/_darcs/patches/20080701155809-84dde-9275267d10258d421416ab801116aabbb561212a.gz b/_darcs/patches/20080701155809-84dde-9275267d10258d421416ab801116aabbb561212a.gz new file mode 100644 index 0000000000..b554b04789 Binary files /dev/null and b/_darcs/patches/20080701155809-84dde-9275267d10258d421416ab801116aabbb561212a.gz differ diff --git a/_darcs/patches/20080701163705-84dde-ee039de84a45080962671d15891f3f7f685a73a6.gz b/_darcs/patches/20080701163705-84dde-ee039de84a45080962671d15891f3f7f685a73a6.gz new file mode 100644 index 0000000000..c4fc3374ac Binary files /dev/null and b/_darcs/patches/20080701163705-84dde-ee039de84a45080962671d15891f3f7f685a73a6.gz differ diff --git a/_darcs/patches/20080701164058-84dde-9e3864ddd1174b771d0830bb77db7889c4e3def1.gz b/_darcs/patches/20080701164058-84dde-9e3864ddd1174b771d0830bb77db7889c4e3def1.gz new file mode 100644 index 0000000000..726de68434 Binary files /dev/null and b/_darcs/patches/20080701164058-84dde-9e3864ddd1174b771d0830bb77db7889c4e3def1.gz differ diff --git a/_darcs/patches/20080701165717-84dde-084a3dfe99e58e57c4bb9cf5dcbd6b1ffeff00bb.gz b/_darcs/patches/20080701165717-84dde-084a3dfe99e58e57c4bb9cf5dcbd6b1ffeff00bb.gz new file mode 100644 index 0000000000..b5d6df91ac Binary files /dev/null and b/_darcs/patches/20080701165717-84dde-084a3dfe99e58e57c4bb9cf5dcbd6b1ffeff00bb.gz differ diff --git a/_darcs/patches/20080701165927-84dde-04aaa82b971ec1e5799f4aad0d8d9b66e593f827.gz b/_darcs/patches/20080701165927-84dde-04aaa82b971ec1e5799f4aad0d8d9b66e593f827.gz new file mode 100644 index 0000000000..e87e231880 Binary files /dev/null and b/_darcs/patches/20080701165927-84dde-04aaa82b971ec1e5799f4aad0d8d9b66e593f827.gz differ diff --git a/_darcs/patches/20080701170521-84dde-6bc929388018eefbe8a0d1de3a6a6a06154eadc7.gz b/_darcs/patches/20080701170521-84dde-6bc929388018eefbe8a0d1de3a6a6a06154eadc7.gz new file mode 100644 index 0000000000..5125b0364e Binary files /dev/null and b/_darcs/patches/20080701170521-84dde-6bc929388018eefbe8a0d1de3a6a6a06154eadc7.gz differ diff --git a/_darcs/patches/20080701172429-84dde-94b70a726459e7309f179c18788f2a7de8d233f1.gz b/_darcs/patches/20080701172429-84dde-94b70a726459e7309f179c18788f2a7de8d233f1.gz new file mode 100644 index 0000000000..d14bb15b79 Binary files /dev/null and b/_darcs/patches/20080701172429-84dde-94b70a726459e7309f179c18788f2a7de8d233f1.gz differ diff --git a/_darcs/patches/20080701172904-84dde-28ed1b9bbfe2a99fbcc10d8421b62eef9b052fff.gz b/_darcs/patches/20080701172904-84dde-28ed1b9bbfe2a99fbcc10d8421b62eef9b052fff.gz new file mode 100644 index 0000000000..48d40dd2ba Binary files /dev/null and b/_darcs/patches/20080701172904-84dde-28ed1b9bbfe2a99fbcc10d8421b62eef9b052fff.gz differ diff --git a/_darcs/patches/20080701175611-84dde-59873964e036f3c9bc225ea8272e840535ea7643.gz b/_darcs/patches/20080701175611-84dde-59873964e036f3c9bc225ea8272e840535ea7643.gz new file mode 100644 index 0000000000..83e1a30575 Binary files /dev/null and b/_darcs/patches/20080701175611-84dde-59873964e036f3c9bc225ea8272e840535ea7643.gz differ diff --git a/_darcs/patches/20080701180205-84dde-a1540d8c6fdfb8496c9dd5a15fcf98c398ebdc57.gz b/_darcs/patches/20080701180205-84dde-a1540d8c6fdfb8496c9dd5a15fcf98c398ebdc57.gz new file mode 100644 index 0000000000..e333e6b312 Binary files /dev/null and b/_darcs/patches/20080701180205-84dde-a1540d8c6fdfb8496c9dd5a15fcf98c398ebdc57.gz differ diff --git a/_darcs/patches/20080701180611-84dde-ca0ed035476469fea28edfb2e1b8cbc2aa3e9d41.gz b/_darcs/patches/20080701180611-84dde-ca0ed035476469fea28edfb2e1b8cbc2aa3e9d41.gz new file mode 100644 index 0000000000..9df40f6986 Binary files /dev/null and b/_darcs/patches/20080701180611-84dde-ca0ed035476469fea28edfb2e1b8cbc2aa3e9d41.gz differ diff --git a/_darcs/patches/20080701182758-84dde-0c80052ea50e6c1c6e8e173c98beb56bc516b2cf.gz b/_darcs/patches/20080701182758-84dde-0c80052ea50e6c1c6e8e173c98beb56bc516b2cf.gz new file mode 100644 index 0000000000..26dca1ebc3 Binary files /dev/null and b/_darcs/patches/20080701182758-84dde-0c80052ea50e6c1c6e8e173c98beb56bc516b2cf.gz differ diff --git a/_darcs/patches/20080701183016-84dde-f1aed06f7bd67a665ba55c03f036d98bd208c3b9.gz b/_darcs/patches/20080701183016-84dde-f1aed06f7bd67a665ba55c03f036d98bd208c3b9.gz new file mode 100644 index 0000000000..84df852465 Binary files /dev/null and b/_darcs/patches/20080701183016-84dde-f1aed06f7bd67a665ba55c03f036d98bd208c3b9.gz differ diff --git a/_darcs/patches/20080701185244-34904-63270def0bb343c20fd150490996e6d0e49f40b4.gz b/_darcs/patches/20080701185244-34904-63270def0bb343c20fd150490996e6d0e49f40b4.gz new file mode 100644 index 0000000000..2f768f2811 Binary files /dev/null and b/_darcs/patches/20080701185244-34904-63270def0bb343c20fd150490996e6d0e49f40b4.gz differ diff --git a/_darcs/patches/20080701185302-34904-46a593cdf2d9abf2d18e005cc3c861d563a3a48c.gz b/_darcs/patches/20080701185302-34904-46a593cdf2d9abf2d18e005cc3c861d563a3a48c.gz new file mode 100644 index 0000000000..4c3eb79345 Binary files /dev/null and b/_darcs/patches/20080701185302-34904-46a593cdf2d9abf2d18e005cc3c861d563a3a48c.gz differ diff --git a/_darcs/patches/20080701185305-34904-482a2392e60f26ca80147798cb39d955414050cb.gz b/_darcs/patches/20080701185305-34904-482a2392e60f26ca80147798cb39d955414050cb.gz new file mode 100644 index 0000000000..4b300719e9 Binary files /dev/null and b/_darcs/patches/20080701185305-34904-482a2392e60f26ca80147798cb39d955414050cb.gz differ diff --git a/_darcs/patches/20080701185323-34904-85f85b33132fc1aea00afb1ec5e3a16cbc638dc6.gz b/_darcs/patches/20080701185323-34904-85f85b33132fc1aea00afb1ec5e3a16cbc638dc6.gz new file mode 100644 index 0000000000..90f4b75a1f Binary files /dev/null and b/_darcs/patches/20080701185323-34904-85f85b33132fc1aea00afb1ec5e3a16cbc638dc6.gz differ diff --git a/_darcs/patches/20080702125457-84dde-d27e405d7003c86886ad81b87bbbf20cbf6fba1c.gz b/_darcs/patches/20080702125457-84dde-d27e405d7003c86886ad81b87bbbf20cbf6fba1c.gz new file mode 100644 index 0000000000..126df4dfe9 Binary files /dev/null and b/_darcs/patches/20080702125457-84dde-d27e405d7003c86886ad81b87bbbf20cbf6fba1c.gz differ diff --git a/_darcs/patches/20080702130029-84dde-481fe1f3d7df5cc931010374a7eb8db4f179cf92.gz b/_darcs/patches/20080702130029-84dde-481fe1f3d7df5cc931010374a7eb8db4f179cf92.gz new file mode 100644 index 0000000000..e87a27742f Binary files /dev/null and b/_darcs/patches/20080702130029-84dde-481fe1f3d7df5cc931010374a7eb8db4f179cf92.gz differ diff --git a/_darcs/patches/20080702131507-84dde-507a6380fcab66c1fbcbaad6d1399c8a2f210acf.gz b/_darcs/patches/20080702131507-84dde-507a6380fcab66c1fbcbaad6d1399c8a2f210acf.gz new file mode 100644 index 0000000000..3285e19cc7 Binary files /dev/null and b/_darcs/patches/20080702131507-84dde-507a6380fcab66c1fbcbaad6d1399c8a2f210acf.gz differ diff --git a/_darcs/patches/20080702131911-84dde-aea1a69547187d3f66e435f14becb2e9013edb39.gz b/_darcs/patches/20080702131911-84dde-aea1a69547187d3f66e435f14becb2e9013edb39.gz new file mode 100644 index 0000000000..3de67023c5 Binary files /dev/null and b/_darcs/patches/20080702131911-84dde-aea1a69547187d3f66e435f14becb2e9013edb39.gz differ diff --git a/_darcs/patches/20080702183839-34904-540719c718ab29fc4d808e0d8b1b65b53c2f3b0b.gz b/_darcs/patches/20080702183839-34904-540719c718ab29fc4d808e0d8b1b65b53c2f3b0b.gz new file mode 100644 index 0000000000..a286374def Binary files /dev/null and b/_darcs/patches/20080702183839-34904-540719c718ab29fc4d808e0d8b1b65b53c2f3b0b.gz differ diff --git a/_darcs/patches/20080702183853-34904-59f0b9eeb79289f12e93db25f660e5b7b1a3e9db.gz b/_darcs/patches/20080702183853-34904-59f0b9eeb79289f12e93db25f660e5b7b1a3e9db.gz new file mode 100644 index 0000000000..570399c4ee Binary files /dev/null and b/_darcs/patches/20080702183853-34904-59f0b9eeb79289f12e93db25f660e5b7b1a3e9db.gz differ diff --git a/_darcs/patches/20080702214011-84dde-a40f7dc3906e32b087023e5d7e593f80eb46a1e8.gz b/_darcs/patches/20080702214011-84dde-a40f7dc3906e32b087023e5d7e593f80eb46a1e8.gz new file mode 100644 index 0000000000..bd9c920a13 Binary files /dev/null and b/_darcs/patches/20080702214011-84dde-a40f7dc3906e32b087023e5d7e593f80eb46a1e8.gz differ diff --git a/_darcs/patches/20080703124652-e4794-13ca56b1642c729b8213c64f26a5482ad4d63692.gz b/_darcs/patches/20080703124652-e4794-13ca56b1642c729b8213c64f26a5482ad4d63692.gz new file mode 100644 index 0000000000..3231fe5ebc Binary files /dev/null and b/_darcs/patches/20080703124652-e4794-13ca56b1642c729b8213c64f26a5482ad4d63692.gz differ diff --git a/_darcs/patches/20080703165043-34904-1e63865bc37f34e5dbb6e194d22e4f35383861c2.gz b/_darcs/patches/20080703165043-34904-1e63865bc37f34e5dbb6e194d22e4f35383861c2.gz new file mode 100644 index 0000000000..62467923e1 Binary files /dev/null and b/_darcs/patches/20080703165043-34904-1e63865bc37f34e5dbb6e194d22e4f35383861c2.gz differ diff --git a/_darcs/patches/20080703170347-84dde-1ba2e178dd4051aa63e4073e472c73240e3d9fe8.gz b/_darcs/patches/20080703170347-84dde-1ba2e178dd4051aa63e4073e472c73240e3d9fe8.gz new file mode 100644 index 0000000000..cddd9b356c Binary files /dev/null and b/_darcs/patches/20080703170347-84dde-1ba2e178dd4051aa63e4073e472c73240e3d9fe8.gz differ diff --git a/_darcs/patches/20080704040746-84dde-36803f820ea7c238613cf5728c59a18ff1eb442d.gz b/_darcs/patches/20080704040746-84dde-36803f820ea7c238613cf5728c59a18ff1eb442d.gz new file mode 100644 index 0000000000..e3c375b011 Binary files /dev/null and b/_darcs/patches/20080704040746-84dde-36803f820ea7c238613cf5728c59a18ff1eb442d.gz differ diff --git a/_darcs/patches/20080704050425-84dde-d0106845c7b16b80be8e0d5ee9ac93a457334df7.gz b/_darcs/patches/20080704050425-84dde-d0106845c7b16b80be8e0d5ee9ac93a457334df7.gz new file mode 100644 index 0000000000..c505ec7431 Binary files /dev/null and b/_darcs/patches/20080704050425-84dde-d0106845c7b16b80be8e0d5ee9ac93a457334df7.gz differ diff --git a/_darcs/patches/20080704052240-34904-c6458bbd6842cd8a86929bba60fb0d4408b56345.gz b/_darcs/patches/20080704052240-34904-c6458bbd6842cd8a86929bba60fb0d4408b56345.gz new file mode 100644 index 0000000000..03634db2f3 Binary files /dev/null and b/_darcs/patches/20080704052240-34904-c6458bbd6842cd8a86929bba60fb0d4408b56345.gz differ diff --git a/_darcs/patches/20080704053846-84dde-11afd488ba31664be6cd6955d4198ae11670f6ae.gz b/_darcs/patches/20080704053846-84dde-11afd488ba31664be6cd6955d4198ae11670f6ae.gz new file mode 100644 index 0000000000..97aa970adb Binary files /dev/null and b/_darcs/patches/20080704053846-84dde-11afd488ba31664be6cd6955d4198ae11670f6ae.gz differ diff --git a/_darcs/patches/20080704055259-84dde-1bc6947531632f0d9d93277f6138cc81c82196af.gz b/_darcs/patches/20080704055259-84dde-1bc6947531632f0d9d93277f6138cc81c82196af.gz new file mode 100644 index 0000000000..94ae70853e Binary files /dev/null and b/_darcs/patches/20080704055259-84dde-1bc6947531632f0d9d93277f6138cc81c82196af.gz differ diff --git a/_darcs/patches/20080704060213-84dde-228a06885e49bc81bb8f0f681ff3dc788c97213c.gz b/_darcs/patches/20080704060213-84dde-228a06885e49bc81bb8f0f681ff3dc788c97213c.gz new file mode 100644 index 0000000000..5581f1e5e1 Binary files /dev/null and b/_darcs/patches/20080704060213-84dde-228a06885e49bc81bb8f0f681ff3dc788c97213c.gz differ diff --git a/_darcs/patches/20080704062056-84dde-6d5173a345be8fe3e9099e09b438fe69f3d2a1e2.gz b/_darcs/patches/20080704062056-84dde-6d5173a345be8fe3e9099e09b438fe69f3d2a1e2.gz new file mode 100644 index 0000000000..71c11de142 Binary files /dev/null and b/_darcs/patches/20080704062056-84dde-6d5173a345be8fe3e9099e09b438fe69f3d2a1e2.gz differ diff --git a/_darcs/patches/20080704071726-34904-bb327b11a8e38788c5d50b1af5e0df5a7feb9275.gz b/_darcs/patches/20080704071726-34904-bb327b11a8e38788c5d50b1af5e0df5a7feb9275.gz new file mode 100644 index 0000000000..c31772155b Binary files /dev/null and b/_darcs/patches/20080704071726-34904-bb327b11a8e38788c5d50b1af5e0df5a7feb9275.gz differ diff --git a/_darcs/patches/20080704072909-5a68a-098c1b44f4e188d101d0786730d2e41ddb359c9a.gz b/_darcs/patches/20080704072909-5a68a-098c1b44f4e188d101d0786730d2e41ddb359c9a.gz new file mode 100644 index 0000000000..6d0cb33497 Binary files /dev/null and b/_darcs/patches/20080704072909-5a68a-098c1b44f4e188d101d0786730d2e41ddb359c9a.gz differ diff --git a/_darcs/patches/20080704082418-84dde-5f314d3f0c72756f480599913a4aab6c0404dcc6.gz b/_darcs/patches/20080704082418-84dde-5f314d3f0c72756f480599913a4aab6c0404dcc6.gz new file mode 100644 index 0000000000..e0d2b0e3ca Binary files /dev/null and b/_darcs/patches/20080704082418-84dde-5f314d3f0c72756f480599913a4aab6c0404dcc6.gz differ diff --git a/_darcs/patches/20080704083216-34904-b1129dd872951f7659de01c991cc00a4c3d276d0.gz b/_darcs/patches/20080704083216-34904-b1129dd872951f7659de01c991cc00a4c3d276d0.gz new file mode 100644 index 0000000000..94cee1400f Binary files /dev/null and b/_darcs/patches/20080704083216-34904-b1129dd872951f7659de01c991cc00a4c3d276d0.gz differ diff --git a/_darcs/patches/20080704083216-34904-b170843a5fa73cb36ffb900be6f1bb56a08515d6.gz b/_darcs/patches/20080704083216-34904-b170843a5fa73cb36ffb900be6f1bb56a08515d6.gz new file mode 100644 index 0000000000..cf1c6b2dc4 Binary files /dev/null and b/_darcs/patches/20080704083216-34904-b170843a5fa73cb36ffb900be6f1bb56a08515d6.gz differ diff --git a/_darcs/patches/20080704194114-2b4f5-2bec30d7d40d7c7bd2c747ef3c805dbf720f6159.gz b/_darcs/patches/20080704194114-2b4f5-2bec30d7d40d7c7bd2c747ef3c805dbf720f6159.gz new file mode 100644 index 0000000000..2c5f270fde Binary files /dev/null and b/_darcs/patches/20080704194114-2b4f5-2bec30d7d40d7c7bd2c747ef3c805dbf720f6159.gz differ diff --git a/_darcs/patches/20080704201716-84dde-97709a82225bf5a972d9462f692eff1675d50ceb.gz b/_darcs/patches/20080704201716-84dde-97709a82225bf5a972d9462f692eff1675d50ceb.gz new file mode 100644 index 0000000000..4e00bb840a Binary files /dev/null and b/_darcs/patches/20080704201716-84dde-97709a82225bf5a972d9462f692eff1675d50ceb.gz differ diff --git a/_darcs/patches/20080704210954-84dde-3311555b173f7428939e66c4e2b7d1e994c05693.gz b/_darcs/patches/20080704210954-84dde-3311555b173f7428939e66c4e2b7d1e994c05693.gz new file mode 100644 index 0000000000..b08e58cd0b Binary files /dev/null and b/_darcs/patches/20080704210954-84dde-3311555b173f7428939e66c4e2b7d1e994c05693.gz differ diff --git a/_darcs/patches/20080704221336-84dde-910c073092eecda6ad2a62cb2aef720c8a14962b.gz b/_darcs/patches/20080704221336-84dde-910c073092eecda6ad2a62cb2aef720c8a14962b.gz new file mode 100644 index 0000000000..2ccc5ea248 Binary files /dev/null and b/_darcs/patches/20080704221336-84dde-910c073092eecda6ad2a62cb2aef720c8a14962b.gz differ diff --git a/_darcs/patches/20080705002207-84dde-c5bc4da7dbca8a32ea4126badb772e99bd4f8bf1.gz b/_darcs/patches/20080705002207-84dde-c5bc4da7dbca8a32ea4126badb772e99bd4f8bf1.gz new file mode 100644 index 0000000000..df21a1b5dc Binary files /dev/null and b/_darcs/patches/20080705002207-84dde-c5bc4da7dbca8a32ea4126badb772e99bd4f8bf1.gz differ diff --git a/_darcs/patches/20080705005602-84dde-3c99dbed5e431a9d4f1de124454296d4709eb115.gz b/_darcs/patches/20080705005602-84dde-3c99dbed5e431a9d4f1de124454296d4709eb115.gz new file mode 100644 index 0000000000..e8129f6eb8 Binary files /dev/null and b/_darcs/patches/20080705005602-84dde-3c99dbed5e431a9d4f1de124454296d4709eb115.gz differ diff --git a/_darcs/patches/20080705064303-84dde-f5e07a71ae18805d3bd1e430d752d3e0e09998fd.gz b/_darcs/patches/20080705064303-84dde-f5e07a71ae18805d3bd1e430d752d3e0e09998fd.gz new file mode 100644 index 0000000000..4cf5596880 Binary files /dev/null and b/_darcs/patches/20080705064303-84dde-f5e07a71ae18805d3bd1e430d752d3e0e09998fd.gz differ diff --git a/_darcs/patches/20080705064618-84dde-11f2909f8d768f96673979f31a7ee914df1f5987.gz b/_darcs/patches/20080705064618-84dde-11f2909f8d768f96673979f31a7ee914df1f5987.gz new file mode 100644 index 0000000000..98c022e9b4 Binary files /dev/null and b/_darcs/patches/20080705064618-84dde-11f2909f8d768f96673979f31a7ee914df1f5987.gz differ diff --git a/_darcs/patches/20080705064900-34904-880679f81aa30564f23fbee3042847595c747a6d.gz b/_darcs/patches/20080705064900-34904-880679f81aa30564f23fbee3042847595c747a6d.gz new file mode 100644 index 0000000000..e1e692da74 Binary files /dev/null and b/_darcs/patches/20080705064900-34904-880679f81aa30564f23fbee3042847595c747a6d.gz differ diff --git a/_darcs/patches/20080705161602-84dde-f046e62ed9af829c86ac967f83168933e6264deb.gz b/_darcs/patches/20080705161602-84dde-f046e62ed9af829c86ac967f83168933e6264deb.gz new file mode 100644 index 0000000000..0a936f2d06 Binary files /dev/null and b/_darcs/patches/20080705161602-84dde-f046e62ed9af829c86ac967f83168933e6264deb.gz differ diff --git a/_darcs/patches/20080705161801-84dde-b8ce7f1edcb18d7382b2690ff35f84e4b7cc7421.gz b/_darcs/patches/20080705161801-84dde-b8ce7f1edcb18d7382b2690ff35f84e4b7cc7421.gz new file mode 100644 index 0000000000..9c1e16c1e8 Binary files /dev/null and b/_darcs/patches/20080705161801-84dde-b8ce7f1edcb18d7382b2690ff35f84e4b7cc7421.gz differ diff --git a/_darcs/patches/20080705162142-84dde-6bc70413f43e0890e6372962eb14697ee6f88992.gz b/_darcs/patches/20080705162142-84dde-6bc70413f43e0890e6372962eb14697ee6f88992.gz new file mode 100644 index 0000000000..c7bc9c7101 Binary files /dev/null and b/_darcs/patches/20080705162142-84dde-6bc70413f43e0890e6372962eb14697ee6f88992.gz differ diff --git a/_darcs/patches/20080705172837-84dde-89fa8f7e844417f8157a2ecc9b24efad267258ff.gz b/_darcs/patches/20080705172837-84dde-89fa8f7e844417f8157a2ecc9b24efad267258ff.gz new file mode 100644 index 0000000000..7e300caa22 Binary files /dev/null and b/_darcs/patches/20080705172837-84dde-89fa8f7e844417f8157a2ecc9b24efad267258ff.gz differ diff --git a/_darcs/patches/20080705174045-d018c-84a84f72a3f371fe767ccca890d67be3b8a127af.gz b/_darcs/patches/20080705174045-d018c-84a84f72a3f371fe767ccca890d67be3b8a127af.gz new file mode 100644 index 0000000000..be00e8674c Binary files /dev/null and b/_darcs/patches/20080705174045-d018c-84a84f72a3f371fe767ccca890d67be3b8a127af.gz differ diff --git a/_darcs/patches/20080705183955-84dde-50b515e9a3188919dff7b4f5ab7111d2a8e4d288.gz b/_darcs/patches/20080705183955-84dde-50b515e9a3188919dff7b4f5ab7111d2a8e4d288.gz new file mode 100644 index 0000000000..acfeb62972 Binary files /dev/null and b/_darcs/patches/20080705183955-84dde-50b515e9a3188919dff7b4f5ab7111d2a8e4d288.gz differ diff --git a/_darcs/patches/20080705184729-84dde-8ed4e07c1694f0300bf5acf967e8c596b9c4d635.gz b/_darcs/patches/20080705184729-84dde-8ed4e07c1694f0300bf5acf967e8c596b9c4d635.gz new file mode 100644 index 0000000000..c98ab7dfae Binary files /dev/null and b/_darcs/patches/20080705184729-84dde-8ed4e07c1694f0300bf5acf967e8c596b9c4d635.gz differ diff --git a/_darcs/patches/20080705202412-5a68a-12ead3349425d70ec0a8349ebc3ce24b7a628dbc.gz b/_darcs/patches/20080705202412-5a68a-12ead3349425d70ec0a8349ebc3ce24b7a628dbc.gz new file mode 100644 index 0000000000..25a3bf3fe8 Binary files /dev/null and b/_darcs/patches/20080705202412-5a68a-12ead3349425d70ec0a8349ebc3ce24b7a628dbc.gz differ diff --git a/_darcs/patches/20080705213637-84dde-87ceb18bfc0db5248083bae1b9ce7ef088a68fe2.gz b/_darcs/patches/20080705213637-84dde-87ceb18bfc0db5248083bae1b9ce7ef088a68fe2.gz new file mode 100644 index 0000000000..94ae920ae2 Binary files /dev/null and b/_darcs/patches/20080705213637-84dde-87ceb18bfc0db5248083bae1b9ce7ef088a68fe2.gz differ diff --git a/_darcs/patches/20080706031234-84dde-42e06c969ef6e8a63c527c197d7f074f7346d223.gz b/_darcs/patches/20080706031234-84dde-42e06c969ef6e8a63c527c197d7f074f7346d223.gz new file mode 100644 index 0000000000..2b4937b34e Binary files /dev/null and b/_darcs/patches/20080706031234-84dde-42e06c969ef6e8a63c527c197d7f074f7346d223.gz differ diff --git a/_darcs/patches/20080706035707-84dde-5403fe9bcb017c401fe5847527628df548e54499.gz b/_darcs/patches/20080706035707-84dde-5403fe9bcb017c401fe5847527628df548e54499.gz new file mode 100644 index 0000000000..bfdfd48684 Binary files /dev/null and b/_darcs/patches/20080706035707-84dde-5403fe9bcb017c401fe5847527628df548e54499.gz differ diff --git a/_darcs/patches/20080706035838-84dde-abcea063c7d298b3332cf7401efecf3c6ba96ee5.gz b/_darcs/patches/20080706035838-84dde-abcea063c7d298b3332cf7401efecf3c6ba96ee5.gz new file mode 100644 index 0000000000..26dc9f2dfa Binary files /dev/null and b/_darcs/patches/20080706035838-84dde-abcea063c7d298b3332cf7401efecf3c6ba96ee5.gz differ diff --git a/_darcs/patches/20080706061437-5a68a-734b7f7b7966e8091f1c6df3abaf10bed9b0f0f8.gz b/_darcs/patches/20080706061437-5a68a-734b7f7b7966e8091f1c6df3abaf10bed9b0f0f8.gz new file mode 100644 index 0000000000..8090ebe880 Binary files /dev/null and b/_darcs/patches/20080706061437-5a68a-734b7f7b7966e8091f1c6df3abaf10bed9b0f0f8.gz differ diff --git a/_darcs/patches/20080706071319-d018c-c2ad1a7672a53586d0232a205a62cf5c5ee10fcd.gz b/_darcs/patches/20080706071319-d018c-c2ad1a7672a53586d0232a205a62cf5c5ee10fcd.gz new file mode 100644 index 0000000000..7559181fbc Binary files /dev/null and b/_darcs/patches/20080706071319-d018c-c2ad1a7672a53586d0232a205a62cf5c5ee10fcd.gz differ diff --git a/_darcs/patches/20080706090309-5a68a-188f45e295e43933595dadfa0c2cfa71b6573386.gz b/_darcs/patches/20080706090309-5a68a-188f45e295e43933595dadfa0c2cfa71b6573386.gz new file mode 100644 index 0000000000..c274fa4a2a Binary files /dev/null and b/_darcs/patches/20080706090309-5a68a-188f45e295e43933595dadfa0c2cfa71b6573386.gz differ diff --git a/_darcs/patches/20080706173453-84dde-bdd84aa8e9dc72eaea72247d03a8620a67a8cec2.gz b/_darcs/patches/20080706173453-84dde-bdd84aa8e9dc72eaea72247d03a8620a67a8cec2.gz new file mode 100644 index 0000000000..5d4c1d4cbb Binary files /dev/null and b/_darcs/patches/20080706173453-84dde-bdd84aa8e9dc72eaea72247d03a8620a67a8cec2.gz differ diff --git a/_darcs/patches/20080706210809-84dde-84b674413c2ca6540176191cc5f1b5a2ef170cbc.gz b/_darcs/patches/20080706210809-84dde-84b674413c2ca6540176191cc5f1b5a2ef170cbc.gz new file mode 100644 index 0000000000..d4a6183bda Binary files /dev/null and b/_darcs/patches/20080706210809-84dde-84b674413c2ca6540176191cc5f1b5a2ef170cbc.gz differ diff --git a/_darcs/patches/20080706220020-84dde-7e700e953c18909edd05de240c0f989584417294.gz b/_darcs/patches/20080706220020-84dde-7e700e953c18909edd05de240c0f989584417294.gz new file mode 100644 index 0000000000..2359cc189f Binary files /dev/null and b/_darcs/patches/20080706220020-84dde-7e700e953c18909edd05de240c0f989584417294.gz differ diff --git a/_darcs/patches/20080706221758-84dde-5e222a282f9a1bd242d2653700c444e93e21cc7f.gz b/_darcs/patches/20080706221758-84dde-5e222a282f9a1bd242d2653700c444e93e21cc7f.gz new file mode 100644 index 0000000000..b082217309 Binary files /dev/null and b/_darcs/patches/20080706221758-84dde-5e222a282f9a1bd242d2653700c444e93e21cc7f.gz differ diff --git a/_darcs/patches/20080706223839-84dde-269eba758843e45265a08379356cdfd84701e2cd.gz b/_darcs/patches/20080706223839-84dde-269eba758843e45265a08379356cdfd84701e2cd.gz new file mode 100644 index 0000000000..de5153cf31 Binary files /dev/null and b/_darcs/patches/20080706223839-84dde-269eba758843e45265a08379356cdfd84701e2cd.gz differ diff --git a/_darcs/patches/20080707032348-84dde-e217ed87ae6947d6fdda64dc105ac4a433c7793a.gz b/_darcs/patches/20080707032348-84dde-e217ed87ae6947d6fdda64dc105ac4a433c7793a.gz new file mode 100644 index 0000000000..8df68fe35d Binary files /dev/null and b/_darcs/patches/20080707032348-84dde-e217ed87ae6947d6fdda64dc105ac4a433c7793a.gz differ diff --git a/_darcs/patches/20080707054358-84dde-916977a2af4f792e0dc9e02a9f5344ec60911319.gz b/_darcs/patches/20080707054358-84dde-916977a2af4f792e0dc9e02a9f5344ec60911319.gz new file mode 100644 index 0000000000..c2e1bce659 Binary files /dev/null and b/_darcs/patches/20080707054358-84dde-916977a2af4f792e0dc9e02a9f5344ec60911319.gz differ diff --git a/_darcs/patches/20080707055428-84dde-30ce553505221694c1ee6fd99484c41508d47821.gz b/_darcs/patches/20080707055428-84dde-30ce553505221694c1ee6fd99484c41508d47821.gz new file mode 100644 index 0000000000..80751cecb2 Binary files /dev/null and b/_darcs/patches/20080707055428-84dde-30ce553505221694c1ee6fd99484c41508d47821.gz differ diff --git a/_darcs/patches/20080707060733-84dde-d0cd0a70aa94b124019378840de1e893ead912d7.gz b/_darcs/patches/20080707060733-84dde-d0cd0a70aa94b124019378840de1e893ead912d7.gz new file mode 100644 index 0000000000..4e91e5b070 Binary files /dev/null and b/_darcs/patches/20080707060733-84dde-d0cd0a70aa94b124019378840de1e893ead912d7.gz differ diff --git a/_darcs/patches/20080707061639-84dde-a52c5533d52841072acf50a013a89962e4eb644d.gz b/_darcs/patches/20080707061639-84dde-a52c5533d52841072acf50a013a89962e4eb644d.gz new file mode 100644 index 0000000000..6537f3c682 Binary files /dev/null and b/_darcs/patches/20080707061639-84dde-a52c5533d52841072acf50a013a89962e4eb644d.gz differ diff --git a/_darcs/patches/20080707061912-84dde-944b786092dbd40f784ee4c4698d9abf7eab4ffd.gz b/_darcs/patches/20080707061912-84dde-944b786092dbd40f784ee4c4698d9abf7eab4ffd.gz new file mode 100644 index 0000000000..1f04c1483f Binary files /dev/null and b/_darcs/patches/20080707061912-84dde-944b786092dbd40f784ee4c4698d9abf7eab4ffd.gz differ diff --git a/_darcs/patches/20080707062347-84dde-fb13c5548d962092877fc374cea3f81ec2cca43e.gz b/_darcs/patches/20080707062347-84dde-fb13c5548d962092877fc374cea3f81ec2cca43e.gz new file mode 100644 index 0000000000..63c570c4a7 Binary files /dev/null and b/_darcs/patches/20080707062347-84dde-fb13c5548d962092877fc374cea3f81ec2cca43e.gz differ diff --git a/_darcs/patches/20080707062618-84dde-2bf8d7476a7b234d0f3bc88ce0a20024654c6625.gz b/_darcs/patches/20080707062618-84dde-2bf8d7476a7b234d0f3bc88ce0a20024654c6625.gz new file mode 100644 index 0000000000..9cdfc92c90 Binary files /dev/null and b/_darcs/patches/20080707062618-84dde-2bf8d7476a7b234d0f3bc88ce0a20024654c6625.gz differ diff --git a/_darcs/patches/20080707063731-84dde-0ce24e15c33d1d12e4e2ea1e05129ae6de84cb0e.gz b/_darcs/patches/20080707063731-84dde-0ce24e15c33d1d12e4e2ea1e05129ae6de84cb0e.gz new file mode 100644 index 0000000000..7bc04a04e7 Binary files /dev/null and b/_darcs/patches/20080707063731-84dde-0ce24e15c33d1d12e4e2ea1e05129ae6de84cb0e.gz differ diff --git a/_darcs/patches/20080707064155-84dde-fb6209b36ff8066335249c0602b2e78961f90c55.gz b/_darcs/patches/20080707064155-84dde-fb6209b36ff8066335249c0602b2e78961f90c55.gz new file mode 100644 index 0000000000..40d7f43fee Binary files /dev/null and b/_darcs/patches/20080707064155-84dde-fb6209b36ff8066335249c0602b2e78961f90c55.gz differ diff --git a/_darcs/patches/20080707064430-84dde-42fe551e1bf503d492dec8c0e30c153655351b5f.gz b/_darcs/patches/20080707064430-84dde-42fe551e1bf503d492dec8c0e30c153655351b5f.gz new file mode 100644 index 0000000000..8f85747c74 Binary files /dev/null and b/_darcs/patches/20080707064430-84dde-42fe551e1bf503d492dec8c0e30c153655351b5f.gz differ diff --git a/_darcs/patches/20080707064607-84dde-140a88c6e08831ec2852001e174c7f0bc891a85d.gz b/_darcs/patches/20080707064607-84dde-140a88c6e08831ec2852001e174c7f0bc891a85d.gz new file mode 100644 index 0000000000..8ddbec8b44 Binary files /dev/null and b/_darcs/patches/20080707064607-84dde-140a88c6e08831ec2852001e174c7f0bc891a85d.gz differ diff --git a/_darcs/patches/20080707070545-84dde-581f5b8d356b5b7d27a9b0b331a0e40ddab28cbe.gz b/_darcs/patches/20080707070545-84dde-581f5b8d356b5b7d27a9b0b331a0e40ddab28cbe.gz new file mode 100644 index 0000000000..06d2e2caa5 Binary files /dev/null and b/_darcs/patches/20080707070545-84dde-581f5b8d356b5b7d27a9b0b331a0e40ddab28cbe.gz differ diff --git a/_darcs/patches/20080707070545-84dde-8034bf485a182ac86295c9a7831cfabac3cb2b55.gz b/_darcs/patches/20080707070545-84dde-8034bf485a182ac86295c9a7831cfabac3cb2b55.gz new file mode 100644 index 0000000000..5ae3a853cc Binary files /dev/null and b/_darcs/patches/20080707070545-84dde-8034bf485a182ac86295c9a7831cfabac3cb2b55.gz differ diff --git a/_darcs/patches/20080707072454-84dde-218caf9132a0973465902418fc62abdbc49d6717.gz b/_darcs/patches/20080707072454-84dde-218caf9132a0973465902418fc62abdbc49d6717.gz new file mode 100644 index 0000000000..870994a547 Binary files /dev/null and b/_darcs/patches/20080707072454-84dde-218caf9132a0973465902418fc62abdbc49d6717.gz differ diff --git a/_darcs/patches/20080707072545-84dde-1f78764ef1c19f311fea9b8315e1081b4c2e6b0c.gz b/_darcs/patches/20080707072545-84dde-1f78764ef1c19f311fea9b8315e1081b4c2e6b0c.gz new file mode 100644 index 0000000000..d1529eaa2d Binary files /dev/null and b/_darcs/patches/20080707072545-84dde-1f78764ef1c19f311fea9b8315e1081b4c2e6b0c.gz differ diff --git a/_darcs/patches/20080707072754-84dde-861d5d2b0a75097042e8f8c13a80c68ba3a0edba.gz b/_darcs/patches/20080707072754-84dde-861d5d2b0a75097042e8f8c13a80c68ba3a0edba.gz new file mode 100644 index 0000000000..072ac594fc Binary files /dev/null and b/_darcs/patches/20080707072754-84dde-861d5d2b0a75097042e8f8c13a80c68ba3a0edba.gz differ diff --git a/_darcs/patches/20080707073025-84dde-724deaf0db1c40a95296b53b895a60a04ff7f957.gz b/_darcs/patches/20080707073025-84dde-724deaf0db1c40a95296b53b895a60a04ff7f957.gz new file mode 100644 index 0000000000..3a39e9e061 Binary files /dev/null and b/_darcs/patches/20080707073025-84dde-724deaf0db1c40a95296b53b895a60a04ff7f957.gz differ diff --git a/_darcs/patches/20080707074434-84dde-ffc9b2caeef3e9fef9607511b425880986883d72.gz b/_darcs/patches/20080707074434-84dde-ffc9b2caeef3e9fef9607511b425880986883d72.gz new file mode 100644 index 0000000000..b929fbbe49 Binary files /dev/null and b/_darcs/patches/20080707074434-84dde-ffc9b2caeef3e9fef9607511b425880986883d72.gz differ diff --git a/_darcs/patches/20080707074755-84dde-478a9a82c598c8d377ea64de50a3523defb34804.gz b/_darcs/patches/20080707074755-84dde-478a9a82c598c8d377ea64de50a3523defb34804.gz new file mode 100644 index 0000000000..90ebde703b Binary files /dev/null and b/_darcs/patches/20080707074755-84dde-478a9a82c598c8d377ea64de50a3523defb34804.gz differ diff --git a/_darcs/patches/20080707173224-e4794-8cee424db46489a3fe0dbe53d2741bfb33de5a47.gz b/_darcs/patches/20080707173224-e4794-8cee424db46489a3fe0dbe53d2741bfb33de5a47.gz new file mode 100644 index 0000000000..ecbe6f93c1 Binary files /dev/null and b/_darcs/patches/20080707173224-e4794-8cee424db46489a3fe0dbe53d2741bfb33de5a47.gz differ diff --git a/_darcs/patches/20080707181150-84dde-1e5f2259701fabda29fd5dee6fa276b01b23809f.gz b/_darcs/patches/20080707181150-84dde-1e5f2259701fabda29fd5dee6fa276b01b23809f.gz new file mode 100644 index 0000000000..30b7a2fd21 Binary files /dev/null and b/_darcs/patches/20080707181150-84dde-1e5f2259701fabda29fd5dee6fa276b01b23809f.gz differ diff --git a/_darcs/patches/20080707234033-84dde-cd840b31e7b8e678450462b8d09d5e035930dd50.gz b/_darcs/patches/20080707234033-84dde-cd840b31e7b8e678450462b8d09d5e035930dd50.gz new file mode 100644 index 0000000000..cc3890b2da Binary files /dev/null and b/_darcs/patches/20080707234033-84dde-cd840b31e7b8e678450462b8d09d5e035930dd50.gz differ diff --git a/_darcs/patches/20080707234050-84dde-b8bb3e4af8dad740e48372e8fa059cdba460a382.gz b/_darcs/patches/20080707234050-84dde-b8bb3e4af8dad740e48372e8fa059cdba460a382.gz new file mode 100644 index 0000000000..aa1d1bdce5 Binary files /dev/null and b/_darcs/patches/20080707234050-84dde-b8bb3e4af8dad740e48372e8fa059cdba460a382.gz differ diff --git a/_darcs/patches/20080708003055-84dde-8ab47a05b658d2de9bf8e55f70f8a9fb9a77b23a.gz b/_darcs/patches/20080708003055-84dde-8ab47a05b658d2de9bf8e55f70f8a9fb9a77b23a.gz new file mode 100644 index 0000000000..21dfb3e79c Binary files /dev/null and b/_darcs/patches/20080708003055-84dde-8ab47a05b658d2de9bf8e55f70f8a9fb9a77b23a.gz differ diff --git a/_darcs/patches/20080708041210-84dde-71118bdd00ace64af0aee5033bff69e638a1463c.gz b/_darcs/patches/20080708041210-84dde-71118bdd00ace64af0aee5033bff69e638a1463c.gz new file mode 100644 index 0000000000..7a590c4ea9 Binary files /dev/null and b/_darcs/patches/20080708041210-84dde-71118bdd00ace64af0aee5033bff69e638a1463c.gz differ diff --git a/_darcs/patches/20080708064241-84dde-6c72e4e5d5ec5675bdef027e1b241f0555ce8dd1.gz b/_darcs/patches/20080708064241-84dde-6c72e4e5d5ec5675bdef027e1b241f0555ce8dd1.gz new file mode 100644 index 0000000000..9e8f278839 Binary files /dev/null and b/_darcs/patches/20080708064241-84dde-6c72e4e5d5ec5675bdef027e1b241f0555ce8dd1.gz differ diff --git a/_darcs/patches/20080708070457-34904-8c6d51dc78b9ee08aca9890a833a0572de3b7f76.gz b/_darcs/patches/20080708070457-34904-8c6d51dc78b9ee08aca9890a833a0572de3b7f76.gz new file mode 100644 index 0000000000..63e9d27778 Binary files /dev/null and b/_darcs/patches/20080708070457-34904-8c6d51dc78b9ee08aca9890a833a0572de3b7f76.gz differ diff --git a/_darcs/patches/20080708090418-57001-e5c0f9e19666fb25a7fcb2e92e89ef83d159b5ab.gz b/_darcs/patches/20080708090418-57001-e5c0f9e19666fb25a7fcb2e92e89ef83d159b5ab.gz new file mode 100644 index 0000000000..aff9219bfc Binary files /dev/null and b/_darcs/patches/20080708090418-57001-e5c0f9e19666fb25a7fcb2e92e89ef83d159b5ab.gz differ diff --git a/_darcs/patches/20080708094531-533db-83399a46e6ec4c0fcc6249b0235961f969d1ae73.gz b/_darcs/patches/20080708094531-533db-83399a46e6ec4c0fcc6249b0235961f969d1ae73.gz new file mode 100644 index 0000000000..d455d61ba5 Binary files /dev/null and b/_darcs/patches/20080708094531-533db-83399a46e6ec4c0fcc6249b0235961f969d1ae73.gz differ diff --git a/_darcs/patches/20080708095113-533db-ad63bbde67b6275fb7ae944cc9882adf6f3be517.gz b/_darcs/patches/20080708095113-533db-ad63bbde67b6275fb7ae944cc9882adf6f3be517.gz new file mode 100644 index 0000000000..24716ee642 Binary files /dev/null and b/_darcs/patches/20080708095113-533db-ad63bbde67b6275fb7ae944cc9882adf6f3be517.gz differ diff --git a/_darcs/patches/20080708100519-533db-b326ea0bb16ea6c8244cfd00a0dd639d0553dd21.gz b/_darcs/patches/20080708100519-533db-b326ea0bb16ea6c8244cfd00a0dd639d0553dd21.gz new file mode 100644 index 0000000000..ae3c791c81 Binary files /dev/null and b/_darcs/patches/20080708100519-533db-b326ea0bb16ea6c8244cfd00a0dd639d0553dd21.gz differ diff --git a/_darcs/patches/20080708112016-f7d30-321142883159fa91338754140ac4ea37e54bb746.gz b/_darcs/patches/20080708112016-f7d30-321142883159fa91338754140ac4ea37e54bb746.gz new file mode 100644 index 0000000000..dc81341c30 Binary files /dev/null and b/_darcs/patches/20080708112016-f7d30-321142883159fa91338754140ac4ea37e54bb746.gz differ diff --git a/_darcs/patches/20080708130408-533db-9e7fb996a7c37af9557f097d785a53ff77c7559f.gz b/_darcs/patches/20080708130408-533db-9e7fb996a7c37af9557f097d785a53ff77c7559f.gz new file mode 100644 index 0000000000..1abbc382de Binary files /dev/null and b/_darcs/patches/20080708130408-533db-9e7fb996a7c37af9557f097d785a53ff77c7559f.gz differ diff --git a/_darcs/patches/20080708233218-84dde-45850157b8fce2ac1d5c1d16a4fdb4fbcc817b76.gz b/_darcs/patches/20080708233218-84dde-45850157b8fce2ac1d5c1d16a4fdb4fbcc817b76.gz new file mode 100644 index 0000000000..c298ecb0f2 Binary files /dev/null and b/_darcs/patches/20080708233218-84dde-45850157b8fce2ac1d5c1d16a4fdb4fbcc817b76.gz differ diff --git a/_darcs/patches/20080708235004-84dde-bca47ff45828387ed256195ef5cf9051f99a5163.gz b/_darcs/patches/20080708235004-84dde-bca47ff45828387ed256195ef5cf9051f99a5163.gz new file mode 100644 index 0000000000..a3cd8e698f Binary files /dev/null and b/_darcs/patches/20080708235004-84dde-bca47ff45828387ed256195ef5cf9051f99a5163.gz differ diff --git a/_darcs/patches/20080709002242-84dde-1d7a2107079ab5d84592d280a19a253663f84b4f.gz b/_darcs/patches/20080709002242-84dde-1d7a2107079ab5d84592d280a19a253663f84b4f.gz new file mode 100644 index 0000000000..71f7957961 Binary files /dev/null and b/_darcs/patches/20080709002242-84dde-1d7a2107079ab5d84592d280a19a253663f84b4f.gz differ diff --git a/_darcs/patches/20080709004349-84dde-bb19f619819eac92df8b4e534bee2d66fc7258c9.gz b/_darcs/patches/20080709004349-84dde-bb19f619819eac92df8b4e534bee2d66fc7258c9.gz new file mode 100644 index 0000000000..3275109963 Binary files /dev/null and b/_darcs/patches/20080709004349-84dde-bb19f619819eac92df8b4e534bee2d66fc7258c9.gz differ diff --git a/_darcs/patches/20080709005342-84dde-de6e2ce487c54ac53ea60757f216e4ba6379f196.gz b/_darcs/patches/20080709005342-84dde-de6e2ce487c54ac53ea60757f216e4ba6379f196.gz new file mode 100644 index 0000000000..4cc4539c7b Binary files /dev/null and b/_darcs/patches/20080709005342-84dde-de6e2ce487c54ac53ea60757f216e4ba6379f196.gz differ diff --git a/_darcs/patches/20080709010415-7f4fe-943321fd9ad9df3890599fc1b3f99e97db16e43d.gz b/_darcs/patches/20080709010415-7f4fe-943321fd9ad9df3890599fc1b3f99e97db16e43d.gz new file mode 100644 index 0000000000..4dfe361737 Binary files /dev/null and b/_darcs/patches/20080709010415-7f4fe-943321fd9ad9df3890599fc1b3f99e97db16e43d.gz differ diff --git a/_darcs/patches/20080709050022-84dde-b8b583c8d2c67bcf6bbe86b2ff26eec7af345d72.gz b/_darcs/patches/20080709050022-84dde-b8b583c8d2c67bcf6bbe86b2ff26eec7af345d72.gz new file mode 100644 index 0000000000..8dc774d2af Binary files /dev/null and b/_darcs/patches/20080709050022-84dde-b8b583c8d2c67bcf6bbe86b2ff26eec7af345d72.gz differ diff --git a/_darcs/patches/20080709051943-84dde-1b866d62097c549f14fcf783f4404ae1b31cae18.gz b/_darcs/patches/20080709051943-84dde-1b866d62097c549f14fcf783f4404ae1b31cae18.gz new file mode 100644 index 0000000000..fc6213cacb Binary files /dev/null and b/_darcs/patches/20080709051943-84dde-1b866d62097c549f14fcf783f4404ae1b31cae18.gz differ diff --git a/_darcs/patches/20080709055343-84dde-ac550608a4736ce5daed70af19866c75a1cfb416.gz b/_darcs/patches/20080709055343-84dde-ac550608a4736ce5daed70af19866c75a1cfb416.gz new file mode 100644 index 0000000000..3b6f17a8eb Binary files /dev/null and b/_darcs/patches/20080709055343-84dde-ac550608a4736ce5daed70af19866c75a1cfb416.gz differ diff --git a/_darcs/patches/20080709060928-84dde-14e8803a617d177739f5ee6b96f296dea80719c9.gz b/_darcs/patches/20080709060928-84dde-14e8803a617d177739f5ee6b96f296dea80719c9.gz new file mode 100644 index 0000000000..4f5a58863f Binary files /dev/null and b/_darcs/patches/20080709060928-84dde-14e8803a617d177739f5ee6b96f296dea80719c9.gz differ diff --git a/_darcs/patches/20080709061118-84dde-b79745bf15dde9e95b46efd1e952d67d435eb1bf.gz b/_darcs/patches/20080709061118-84dde-b79745bf15dde9e95b46efd1e952d67d435eb1bf.gz new file mode 100644 index 0000000000..d7024cc329 Binary files /dev/null and b/_darcs/patches/20080709061118-84dde-b79745bf15dde9e95b46efd1e952d67d435eb1bf.gz differ diff --git a/_darcs/patches/20080709062502-84dde-7e4c574dc0a710bcd0b662bfbab263308d1c9cd5.gz b/_darcs/patches/20080709062502-84dde-7e4c574dc0a710bcd0b662bfbab263308d1c9cd5.gz new file mode 100644 index 0000000000..a65cfc9b72 Binary files /dev/null and b/_darcs/patches/20080709062502-84dde-7e4c574dc0a710bcd0b662bfbab263308d1c9cd5.gz differ diff --git a/_darcs/patches/20080709070012-84dde-5fa51b1dba00a6299170fd4b44eea34c01f388e0.gz b/_darcs/patches/20080709070012-84dde-5fa51b1dba00a6299170fd4b44eea34c01f388e0.gz new file mode 100644 index 0000000000..a1483184f7 Binary files /dev/null and b/_darcs/patches/20080709070012-84dde-5fa51b1dba00a6299170fd4b44eea34c01f388e0.gz differ diff --git a/_darcs/patches/20080709071439-84dde-f85f0e97f7c14bb77b7174f281e3e9f75c23cac1.gz b/_darcs/patches/20080709071439-84dde-f85f0e97f7c14bb77b7174f281e3e9f75c23cac1.gz new file mode 100644 index 0000000000..487a1e4740 Binary files /dev/null and b/_darcs/patches/20080709071439-84dde-f85f0e97f7c14bb77b7174f281e3e9f75c23cac1.gz differ diff --git a/_darcs/patches/20080709072244-84dde-c7df8dbdf69b1307f7a41d45cde612a32f542ee2.gz b/_darcs/patches/20080709072244-84dde-c7df8dbdf69b1307f7a41d45cde612a32f542ee2.gz new file mode 100644 index 0000000000..c23b7e9391 Binary files /dev/null and b/_darcs/patches/20080709072244-84dde-c7df8dbdf69b1307f7a41d45cde612a32f542ee2.gz differ diff --git a/_darcs/patches/20080709072429-84dde-86bd168e5d70b84cc471c74e349bd4e9a3ba0a70.gz b/_darcs/patches/20080709072429-84dde-86bd168e5d70b84cc471c74e349bd4e9a3ba0a70.gz new file mode 100644 index 0000000000..65b4d1952b Binary files /dev/null and b/_darcs/patches/20080709072429-84dde-86bd168e5d70b84cc471c74e349bd4e9a3ba0a70.gz differ diff --git a/_darcs/patches/20080709072833-84dde-42c600c5facb073f502318cae389832bd2115927.gz b/_darcs/patches/20080709072833-84dde-42c600c5facb073f502318cae389832bd2115927.gz new file mode 100644 index 0000000000..2cc13c1716 Binary files /dev/null and b/_darcs/patches/20080709072833-84dde-42c600c5facb073f502318cae389832bd2115927.gz differ diff --git a/_darcs/patches/20080709072953-84dde-5ebea95c28e535c8bdd5255354910a6f92903b92.gz b/_darcs/patches/20080709072953-84dde-5ebea95c28e535c8bdd5255354910a6f92903b92.gz new file mode 100644 index 0000000000..3e4a065ae1 Binary files /dev/null and b/_darcs/patches/20080709072953-84dde-5ebea95c28e535c8bdd5255354910a6f92903b92.gz differ diff --git a/_darcs/patches/20080709073159-84dde-b149ae89135c1004d7d2a47843743e051672fa32.gz b/_darcs/patches/20080709073159-84dde-b149ae89135c1004d7d2a47843743e051672fa32.gz new file mode 100644 index 0000000000..7cdf9bc003 Binary files /dev/null and b/_darcs/patches/20080709073159-84dde-b149ae89135c1004d7d2a47843743e051672fa32.gz differ diff --git a/_darcs/patches/20080709073305-84dde-9e7f0d367ab9f3f762031501eb4c83f6410c6da7.gz b/_darcs/patches/20080709073305-84dde-9e7f0d367ab9f3f762031501eb4c83f6410c6da7.gz new file mode 100644 index 0000000000..5587612bd3 Binary files /dev/null and b/_darcs/patches/20080709073305-84dde-9e7f0d367ab9f3f762031501eb4c83f6410c6da7.gz differ diff --git a/_darcs/patches/20080709075045-84dde-c00a97cfed2eb1c560f3cc2581d29f29b2eb32b2.gz b/_darcs/patches/20080709075045-84dde-c00a97cfed2eb1c560f3cc2581d29f29b2eb32b2.gz new file mode 100644 index 0000000000..f99233d868 Binary files /dev/null and b/_darcs/patches/20080709075045-84dde-c00a97cfed2eb1c560f3cc2581d29f29b2eb32b2.gz differ diff --git a/_darcs/patches/20080709080110-84dde-2d8169e2fbe28300d099090100547a19cb8c6a7d.gz b/_darcs/patches/20080709080110-84dde-2d8169e2fbe28300d099090100547a19cb8c6a7d.gz new file mode 100644 index 0000000000..947705e6f1 Binary files /dev/null and b/_darcs/patches/20080709080110-84dde-2d8169e2fbe28300d099090100547a19cb8c6a7d.gz differ diff --git a/_darcs/patches/20080709080206-84dde-b324eea8e6043397e09f41c099b9c2c821e192fb.gz b/_darcs/patches/20080709080206-84dde-b324eea8e6043397e09f41c099b9c2c821e192fb.gz new file mode 100644 index 0000000000..496c82b9c0 Binary files /dev/null and b/_darcs/patches/20080709080206-84dde-b324eea8e6043397e09f41c099b9c2c821e192fb.gz differ diff --git a/_darcs/patches/20080709183833-84dde-d349a733fafc1d9f6a6e534bcfd988c3694738a9.gz b/_darcs/patches/20080709183833-84dde-d349a733fafc1d9f6a6e534bcfd988c3694738a9.gz new file mode 100644 index 0000000000..4b38b69028 Binary files /dev/null and b/_darcs/patches/20080709183833-84dde-d349a733fafc1d9f6a6e534bcfd988c3694738a9.gz differ diff --git a/_darcs/patches/20080709193810-84dde-0ee9bd7b4783f5a66c2ffd6526728e4e267fb024.gz b/_darcs/patches/20080709193810-84dde-0ee9bd7b4783f5a66c2ffd6526728e4e267fb024.gz new file mode 100644 index 0000000000..90114c45c5 Binary files /dev/null and b/_darcs/patches/20080709193810-84dde-0ee9bd7b4783f5a66c2ffd6526728e4e267fb024.gz differ diff --git a/_darcs/patches/20080709195238-84dde-a5df98439faaf7058571b5e345f165adece9c7b8.gz b/_darcs/patches/20080709195238-84dde-a5df98439faaf7058571b5e345f165adece9c7b8.gz new file mode 100644 index 0000000000..10ff163820 Binary files /dev/null and b/_darcs/patches/20080709195238-84dde-a5df98439faaf7058571b5e345f165adece9c7b8.gz differ diff --git a/_darcs/patches/20080709200711-84dde-b6a9e403ab50ef5a6497a25a756ed63c373f0402.gz b/_darcs/patches/20080709200711-84dde-b6a9e403ab50ef5a6497a25a756ed63c373f0402.gz new file mode 100644 index 0000000000..d7c939de38 Binary files /dev/null and b/_darcs/patches/20080709200711-84dde-b6a9e403ab50ef5a6497a25a756ed63c373f0402.gz differ diff --git a/_darcs/patches/20080709200750-84dde-1460fb58f84a16cdfff93b46afb13928cdd0a439.gz b/_darcs/patches/20080709200750-84dde-1460fb58f84a16cdfff93b46afb13928cdd0a439.gz new file mode 100644 index 0000000000..14994d1f85 Binary files /dev/null and b/_darcs/patches/20080709200750-84dde-1460fb58f84a16cdfff93b46afb13928cdd0a439.gz differ diff --git a/_darcs/patches/20080709202346-84dde-63561db24b55e98020c00707cc2c36e46bb8025f.gz b/_darcs/patches/20080709202346-84dde-63561db24b55e98020c00707cc2c36e46bb8025f.gz new file mode 100644 index 0000000000..4948ed6a50 Binary files /dev/null and b/_darcs/patches/20080709202346-84dde-63561db24b55e98020c00707cc2c36e46bb8025f.gz differ diff --git a/_darcs/patches/20080709202716-84dde-30ffe46b711ff108fa210757eeb856803b09de82.gz b/_darcs/patches/20080709202716-84dde-30ffe46b711ff108fa210757eeb856803b09de82.gz new file mode 100644 index 0000000000..bb9605ca7f Binary files /dev/null and b/_darcs/patches/20080709202716-84dde-30ffe46b711ff108fa210757eeb856803b09de82.gz differ diff --git a/_darcs/patches/20080709203237-84dde-f76ca017b4bc1f3c260aaefaaa5ffac5c0f08028.gz b/_darcs/patches/20080709203237-84dde-f76ca017b4bc1f3c260aaefaaa5ffac5c0f08028.gz new file mode 100644 index 0000000000..7467bc8cf2 Binary files /dev/null and b/_darcs/patches/20080709203237-84dde-f76ca017b4bc1f3c260aaefaaa5ffac5c0f08028.gz differ diff --git a/_darcs/patches/20080709203831-84dde-6f5f64f354a243ffefea8af8ef046d4bd0ec8e82.gz b/_darcs/patches/20080709203831-84dde-6f5f64f354a243ffefea8af8ef046d4bd0ec8e82.gz new file mode 100644 index 0000000000..c1dd234d7a Binary files /dev/null and b/_darcs/patches/20080709203831-84dde-6f5f64f354a243ffefea8af8ef046d4bd0ec8e82.gz differ diff --git a/_darcs/patches/20080709203910-84dde-85a0a36009b13cb57e2db9f051aa5864fdb723a2.gz b/_darcs/patches/20080709203910-84dde-85a0a36009b13cb57e2db9f051aa5864fdb723a2.gz new file mode 100644 index 0000000000..d36f81afb4 Binary files /dev/null and b/_darcs/patches/20080709203910-84dde-85a0a36009b13cb57e2db9f051aa5864fdb723a2.gz differ diff --git a/_darcs/patches/20080709203925-84dde-d494ddd0188bea229ca75391949ec2f4c6a7bdb3.gz b/_darcs/patches/20080709203925-84dde-d494ddd0188bea229ca75391949ec2f4c6a7bdb3.gz new file mode 100644 index 0000000000..01c976bb49 Binary files /dev/null and b/_darcs/patches/20080709203925-84dde-d494ddd0188bea229ca75391949ec2f4c6a7bdb3.gz differ diff --git a/_darcs/patches/20080709204050-84dde-b7ed70cb1820e8257f47d5cae23fbc1e1ff5a52f.gz b/_darcs/patches/20080709204050-84dde-b7ed70cb1820e8257f47d5cae23fbc1e1ff5a52f.gz new file mode 100644 index 0000000000..f10780b0d8 Binary files /dev/null and b/_darcs/patches/20080709204050-84dde-b7ed70cb1820e8257f47d5cae23fbc1e1ff5a52f.gz differ diff --git a/_darcs/patches/20080709214433-84dde-4cb9de9ca054c54ebeb028bc3382ae07f4b7f5e1.gz b/_darcs/patches/20080709214433-84dde-4cb9de9ca054c54ebeb028bc3382ae07f4b7f5e1.gz new file mode 100644 index 0000000000..253244fd11 Binary files /dev/null and b/_darcs/patches/20080709214433-84dde-4cb9de9ca054c54ebeb028bc3382ae07f4b7f5e1.gz differ diff --git a/_darcs/patches/20080709214455-84dde-6757b0252963e49f2790831ac4d31b2aafffca17.gz b/_darcs/patches/20080709214455-84dde-6757b0252963e49f2790831ac4d31b2aafffca17.gz new file mode 100644 index 0000000000..161a414b24 Binary files /dev/null and b/_darcs/patches/20080709214455-84dde-6757b0252963e49f2790831ac4d31b2aafffca17.gz differ diff --git a/_darcs/patches/20080709214659-84dde-86ff362aa1b7e7fd7194e9d7dd33cff78c2f05c9.gz b/_darcs/patches/20080709214659-84dde-86ff362aa1b7e7fd7194e9d7dd33cff78c2f05c9.gz new file mode 100644 index 0000000000..c4ec10d2c1 Binary files /dev/null and b/_darcs/patches/20080709214659-84dde-86ff362aa1b7e7fd7194e9d7dd33cff78c2f05c9.gz differ diff --git a/_darcs/patches/20080709214713-84dde-c8549c7837d6bc18e1cd35cc64b84a97fff9c05f.gz b/_darcs/patches/20080709214713-84dde-c8549c7837d6bc18e1cd35cc64b84a97fff9c05f.gz new file mode 100644 index 0000000000..fc2e87d973 Binary files /dev/null and b/_darcs/patches/20080709214713-84dde-c8549c7837d6bc18e1cd35cc64b84a97fff9c05f.gz differ diff --git a/_darcs/patches/20080709214821-84dde-88aee48526993768ede96dc9cb245b65472d8dbe.gz b/_darcs/patches/20080709214821-84dde-88aee48526993768ede96dc9cb245b65472d8dbe.gz new file mode 100644 index 0000000000..061adef04f Binary files /dev/null and b/_darcs/patches/20080709214821-84dde-88aee48526993768ede96dc9cb245b65472d8dbe.gz differ diff --git a/_darcs/patches/20080709215011-84dde-29c80d3210e337614980b647c58b5720b7bfc35f.gz b/_darcs/patches/20080709215011-84dde-29c80d3210e337614980b647c58b5720b7bfc35f.gz new file mode 100644 index 0000000000..f494ff8e55 Binary files /dev/null and b/_darcs/patches/20080709215011-84dde-29c80d3210e337614980b647c58b5720b7bfc35f.gz differ diff --git a/_darcs/patches/20080709215632-84dde-fc2270bcebc64e3a616e681868f44bff26f7540e.gz b/_darcs/patches/20080709215632-84dde-fc2270bcebc64e3a616e681868f44bff26f7540e.gz new file mode 100644 index 0000000000..ee53bbaf54 Binary files /dev/null and b/_darcs/patches/20080709215632-84dde-fc2270bcebc64e3a616e681868f44bff26f7540e.gz differ diff --git a/_darcs/patches/20080709220045-84dde-b81ebf4e5f9c8c0eef17e785de28d93e2987979f.gz b/_darcs/patches/20080709220045-84dde-b81ebf4e5f9c8c0eef17e785de28d93e2987979f.gz new file mode 100644 index 0000000000..e83293a41d Binary files /dev/null and b/_darcs/patches/20080709220045-84dde-b81ebf4e5f9c8c0eef17e785de28d93e2987979f.gz differ diff --git a/_darcs/patches/20080709220446-84dde-2cc813b2a781a641cc73482599479c3be6496a09.gz b/_darcs/patches/20080709220446-84dde-2cc813b2a781a641cc73482599479c3be6496a09.gz new file mode 100644 index 0000000000..44ffcc98fd Binary files /dev/null and b/_darcs/patches/20080709220446-84dde-2cc813b2a781a641cc73482599479c3be6496a09.gz differ diff --git a/_darcs/patches/20080709220656-84dde-c094a14100363a98407ec622c1bba967fc75c51e.gz b/_darcs/patches/20080709220656-84dde-c094a14100363a98407ec622c1bba967fc75c51e.gz new file mode 100644 index 0000000000..4fd1528688 Binary files /dev/null and b/_darcs/patches/20080709220656-84dde-c094a14100363a98407ec622c1bba967fc75c51e.gz differ diff --git a/_darcs/patches/20080709220856-84dde-f3fc0fa4c5c37c66cf4d27b2d9e8f50d696e94ce.gz b/_darcs/patches/20080709220856-84dde-f3fc0fa4c5c37c66cf4d27b2d9e8f50d696e94ce.gz new file mode 100644 index 0000000000..e07cb773e7 Binary files /dev/null and b/_darcs/patches/20080709220856-84dde-f3fc0fa4c5c37c66cf4d27b2d9e8f50d696e94ce.gz differ diff --git a/_darcs/patches/20080709221735-84dde-f3fb10d2a3ef832b8528db92cc914d31a474c5d3.gz b/_darcs/patches/20080709221735-84dde-f3fb10d2a3ef832b8528db92cc914d31a474c5d3.gz new file mode 100644 index 0000000000..0b91622f36 Binary files /dev/null and b/_darcs/patches/20080709221735-84dde-f3fb10d2a3ef832b8528db92cc914d31a474c5d3.gz differ diff --git a/_darcs/patches/20080709221754-84dde-1ad060768f3d4cd9ac8238474e1e418482c15843.gz b/_darcs/patches/20080709221754-84dde-1ad060768f3d4cd9ac8238474e1e418482c15843.gz new file mode 100644 index 0000000000..1301eeb464 Binary files /dev/null and b/_darcs/patches/20080709221754-84dde-1ad060768f3d4cd9ac8238474e1e418482c15843.gz differ diff --git a/_darcs/patches/20080709221826-84dde-e218ebeadd8c17fc6612159f2cb7fefa9174ba67.gz b/_darcs/patches/20080709221826-84dde-e218ebeadd8c17fc6612159f2cb7fefa9174ba67.gz new file mode 100644 index 0000000000..cb1adeeb61 Binary files /dev/null and b/_darcs/patches/20080709221826-84dde-e218ebeadd8c17fc6612159f2cb7fefa9174ba67.gz differ diff --git a/_darcs/patches/20080709223144-84dde-10f7f9db7dc5ba200fdeea4d6c1f277e71c54c16.gz b/_darcs/patches/20080709223144-84dde-10f7f9db7dc5ba200fdeea4d6c1f277e71c54c16.gz new file mode 100644 index 0000000000..bf438770ba Binary files /dev/null and b/_darcs/patches/20080709223144-84dde-10f7f9db7dc5ba200fdeea4d6c1f277e71c54c16.gz differ diff --git a/_darcs/patches/20080709223409-84dde-809bfe5eb294f24cb3a99faf6436e57ff054cd16.gz b/_darcs/patches/20080709223409-84dde-809bfe5eb294f24cb3a99faf6436e57ff054cd16.gz new file mode 100644 index 0000000000..293679bf50 Binary files /dev/null and b/_darcs/patches/20080709223409-84dde-809bfe5eb294f24cb3a99faf6436e57ff054cd16.gz differ diff --git a/_darcs/patches/20080709223701-84dde-a2bc25d65eeb70d24d4c598ef962e17062390fc4.gz b/_darcs/patches/20080709223701-84dde-a2bc25d65eeb70d24d4c598ef962e17062390fc4.gz new file mode 100644 index 0000000000..23ab2b14db Binary files /dev/null and b/_darcs/patches/20080709223701-84dde-a2bc25d65eeb70d24d4c598ef962e17062390fc4.gz differ diff --git a/_darcs/patches/20080709223803-84dde-c04d91be4d0a39d173297633cf5cad464ea52c4e.gz b/_darcs/patches/20080709223803-84dde-c04d91be4d0a39d173297633cf5cad464ea52c4e.gz new file mode 100644 index 0000000000..6b9cc84d61 Binary files /dev/null and b/_darcs/patches/20080709223803-84dde-c04d91be4d0a39d173297633cf5cad464ea52c4e.gz differ diff --git a/_darcs/patches/20080709223910-84dde-dc2e01e3fddb335b84cbee1e4979eb07b978988f.gz b/_darcs/patches/20080709223910-84dde-dc2e01e3fddb335b84cbee1e4979eb07b978988f.gz new file mode 100644 index 0000000000..a3d52ae8ea Binary files /dev/null and b/_darcs/patches/20080709223910-84dde-dc2e01e3fddb335b84cbee1e4979eb07b978988f.gz differ diff --git a/_darcs/patches/20080709224630-533db-b5399baef280133858dac9b89c2cd6a2aba9f861.gz b/_darcs/patches/20080709224630-533db-b5399baef280133858dac9b89c2cd6a2aba9f861.gz new file mode 100644 index 0000000000..d3f1e7fc3a Binary files /dev/null and b/_darcs/patches/20080709224630-533db-b5399baef280133858dac9b89c2cd6a2aba9f861.gz differ diff --git a/_darcs/patches/20080709225929-84dde-ddc83a90cb56f9abdd596561eeebb6ce078e5e5a.gz b/_darcs/patches/20080709225929-84dde-ddc83a90cb56f9abdd596561eeebb6ce078e5e5a.gz new file mode 100644 index 0000000000..4e0c9b0b4c Binary files /dev/null and b/_darcs/patches/20080709225929-84dde-ddc83a90cb56f9abdd596561eeebb6ce078e5e5a.gz differ diff --git a/_darcs/patches/20080709225942-84dde-80c201825f566af717456f13d17e7382ce234692.gz b/_darcs/patches/20080709225942-84dde-80c201825f566af717456f13d17e7382ce234692.gz new file mode 100644 index 0000000000..f8cd0e1ba2 Binary files /dev/null and b/_darcs/patches/20080709225942-84dde-80c201825f566af717456f13d17e7382ce234692.gz differ diff --git a/_darcs/patches/20080709230017-84dde-28e4d9d9dcc4dfe2c9f9e08e3123fe4e0bd5a8c0.gz b/_darcs/patches/20080709230017-84dde-28e4d9d9dcc4dfe2c9f9e08e3123fe4e0bd5a8c0.gz new file mode 100644 index 0000000000..01187bdcaf Binary files /dev/null and b/_darcs/patches/20080709230017-84dde-28e4d9d9dcc4dfe2c9f9e08e3123fe4e0bd5a8c0.gz differ diff --git a/_darcs/patches/20080709231031-84dde-929095ca3844ed6fe7ebd535fc9696678a5fcb0f.gz b/_darcs/patches/20080709231031-84dde-929095ca3844ed6fe7ebd535fc9696678a5fcb0f.gz new file mode 100644 index 0000000000..8211a9448a Binary files /dev/null and b/_darcs/patches/20080709231031-84dde-929095ca3844ed6fe7ebd535fc9696678a5fcb0f.gz differ diff --git a/_darcs/patches/20080709231217-84dde-2df00042fd1a0c571f232ad0815b191af043c5a0.gz b/_darcs/patches/20080709231217-84dde-2df00042fd1a0c571f232ad0815b191af043c5a0.gz new file mode 100644 index 0000000000..5942da3bf5 Binary files /dev/null and b/_darcs/patches/20080709231217-84dde-2df00042fd1a0c571f232ad0815b191af043c5a0.gz differ diff --git a/_darcs/patches/20080709231503-84dde-e9a00ec6b5c038c8ea7fab62a61f3d9de2dbe2c8.gz b/_darcs/patches/20080709231503-84dde-e9a00ec6b5c038c8ea7fab62a61f3d9de2dbe2c8.gz new file mode 100644 index 0000000000..4d27cf1de6 Binary files /dev/null and b/_darcs/patches/20080709231503-84dde-e9a00ec6b5c038c8ea7fab62a61f3d9de2dbe2c8.gz differ diff --git a/_darcs/patches/20080709231539-84dde-4414d122b3b396d31d393ab2f74b0d51758afbc2.gz b/_darcs/patches/20080709231539-84dde-4414d122b3b396d31d393ab2f74b0d51758afbc2.gz new file mode 100644 index 0000000000..4024f9c06c Binary files /dev/null and b/_darcs/patches/20080709231539-84dde-4414d122b3b396d31d393ab2f74b0d51758afbc2.gz differ diff --git a/_darcs/patches/20080709231638-84dde-91dd99af8fbeae8b2400543913efedec3938b2aa.gz b/_darcs/patches/20080709231638-84dde-91dd99af8fbeae8b2400543913efedec3938b2aa.gz new file mode 100644 index 0000000000..92384022f9 Binary files /dev/null and b/_darcs/patches/20080709231638-84dde-91dd99af8fbeae8b2400543913efedec3938b2aa.gz differ diff --git a/_darcs/patches/20080709231821-84dde-ecbcbed7e856a92b74c1bd9ba11c4c9be4ecb79f.gz b/_darcs/patches/20080709231821-84dde-ecbcbed7e856a92b74c1bd9ba11c4c9be4ecb79f.gz new file mode 100644 index 0000000000..769c64022f Binary files /dev/null and b/_darcs/patches/20080709231821-84dde-ecbcbed7e856a92b74c1bd9ba11c4c9be4ecb79f.gz differ diff --git a/_darcs/patches/20080709231948-84dde-feb7d677238eaa0b80f263337a1833d9b3ec7d2f.gz b/_darcs/patches/20080709231948-84dde-feb7d677238eaa0b80f263337a1833d9b3ec7d2f.gz new file mode 100644 index 0000000000..3351ddad99 Binary files /dev/null and b/_darcs/patches/20080709231948-84dde-feb7d677238eaa0b80f263337a1833d9b3ec7d2f.gz differ diff --git a/_darcs/patches/20080709232350-84dde-3e33baad97a5f39f601d8fc5b117a37e182f3ef3.gz b/_darcs/patches/20080709232350-84dde-3e33baad97a5f39f601d8fc5b117a37e182f3ef3.gz new file mode 100644 index 0000000000..aff3902d17 Binary files /dev/null and b/_darcs/patches/20080709232350-84dde-3e33baad97a5f39f601d8fc5b117a37e182f3ef3.gz differ diff --git a/_darcs/patches/20080709234228-84dde-f24d277947ab49031a1b6d74184568fe2f50a685.gz b/_darcs/patches/20080709234228-84dde-f24d277947ab49031a1b6d74184568fe2f50a685.gz new file mode 100644 index 0000000000..3056813122 Binary files /dev/null and b/_darcs/patches/20080709234228-84dde-f24d277947ab49031a1b6d74184568fe2f50a685.gz differ diff --git a/_darcs/patches/20080710032835-84dde-dc8534409c6ba05fd9390ff965ab9f7aea0a04eb.gz b/_darcs/patches/20080710032835-84dde-dc8534409c6ba05fd9390ff965ab9f7aea0a04eb.gz new file mode 100644 index 0000000000..a03849ac12 Binary files /dev/null and b/_darcs/patches/20080710032835-84dde-dc8534409c6ba05fd9390ff965ab9f7aea0a04eb.gz differ diff --git a/_darcs/patches/20080710032953-e4794-beb1a282ccfa8f3bf977d2ed28a863ba9084d86c.gz b/_darcs/patches/20080710032953-e4794-beb1a282ccfa8f3bf977d2ed28a863ba9084d86c.gz new file mode 100644 index 0000000000..40eb0c43ab Binary files /dev/null and b/_darcs/patches/20080710032953-e4794-beb1a282ccfa8f3bf977d2ed28a863ba9084d86c.gz differ diff --git a/_darcs/patches/20080710033108-84dde-4a362790f0386d1553a50df8adab680b5b17d0f3.gz b/_darcs/patches/20080710033108-84dde-4a362790f0386d1553a50df8adab680b5b17d0f3.gz new file mode 100644 index 0000000000..00b2edf3b8 Binary files /dev/null and b/_darcs/patches/20080710033108-84dde-4a362790f0386d1553a50df8adab680b5b17d0f3.gz differ diff --git a/_darcs/patches/20080710042324-84dde-9d26f10470fa0e9614717c2f2b976d6d9e6f4361.gz b/_darcs/patches/20080710042324-84dde-9d26f10470fa0e9614717c2f2b976d6d9e6f4361.gz new file mode 100644 index 0000000000..5a056c9a81 Binary files /dev/null and b/_darcs/patches/20080710042324-84dde-9d26f10470fa0e9614717c2f2b976d6d9e6f4361.gz differ diff --git a/_darcs/patches/20080710042333-84dde-55b87a5f8cba7992b5c2ca1eeb87838c20ef6a61.gz b/_darcs/patches/20080710042333-84dde-55b87a5f8cba7992b5c2ca1eeb87838c20ef6a61.gz new file mode 100644 index 0000000000..ba87e7584a Binary files /dev/null and b/_darcs/patches/20080710042333-84dde-55b87a5f8cba7992b5c2ca1eeb87838c20ef6a61.gz differ diff --git a/_darcs/patches/20080710042930-84dde-e8caef45ae3efb095c81f62736d2cf888b2b85ef.gz b/_darcs/patches/20080710042930-84dde-e8caef45ae3efb095c81f62736d2cf888b2b85ef.gz new file mode 100644 index 0000000000..d41c53f3ce Binary files /dev/null and b/_darcs/patches/20080710042930-84dde-e8caef45ae3efb095c81f62736d2cf888b2b85ef.gz differ diff --git a/_darcs/patches/20080710045126-533db-ffd9bcfe1295b3a376579ed7cd2278d5597b1884.gz b/_darcs/patches/20080710045126-533db-ffd9bcfe1295b3a376579ed7cd2278d5597b1884.gz new file mode 100644 index 0000000000..81669cd0a2 Binary files /dev/null and b/_darcs/patches/20080710045126-533db-ffd9bcfe1295b3a376579ed7cd2278d5597b1884.gz differ diff --git a/_darcs/patches/20080710045454-84dde-4f33e8ca41dcbd0bf0a69c28c56d7ec716f1c48a.gz b/_darcs/patches/20080710045454-84dde-4f33e8ca41dcbd0bf0a69c28c56d7ec716f1c48a.gz new file mode 100644 index 0000000000..488d3eb44c Binary files /dev/null and b/_darcs/patches/20080710045454-84dde-4f33e8ca41dcbd0bf0a69c28c56d7ec716f1c48a.gz differ diff --git a/_darcs/patches/20080710045942-533db-209fce2e2e89dfc809c9b25e93fb428c585f29e4.gz b/_darcs/patches/20080710045942-533db-209fce2e2e89dfc809c9b25e93fb428c585f29e4.gz new file mode 100644 index 0000000000..ebafe0c8df Binary files /dev/null and b/_darcs/patches/20080710045942-533db-209fce2e2e89dfc809c9b25e93fb428c585f29e4.gz differ diff --git a/_darcs/patches/20080710050202-533db-31739e6dc9d57058df99c8e6592249563f484179.gz b/_darcs/patches/20080710050202-533db-31739e6dc9d57058df99c8e6592249563f484179.gz new file mode 100644 index 0000000000..88c3504655 Binary files /dev/null and b/_darcs/patches/20080710050202-533db-31739e6dc9d57058df99c8e6592249563f484179.gz differ diff --git a/_darcs/patches/20080710050459-533db-251d9fec6b700628e3e56607f25e551381f2fad2.gz b/_darcs/patches/20080710050459-533db-251d9fec6b700628e3e56607f25e551381f2fad2.gz new file mode 100644 index 0000000000..dfddd3374b Binary files /dev/null and b/_darcs/patches/20080710050459-533db-251d9fec6b700628e3e56607f25e551381f2fad2.gz differ diff --git a/_darcs/patches/20080710051035-533db-4a3d824a50545b8a291a81059dcbb97487a13630.gz b/_darcs/patches/20080710051035-533db-4a3d824a50545b8a291a81059dcbb97487a13630.gz new file mode 100644 index 0000000000..62da9104ab Binary files /dev/null and b/_darcs/patches/20080710051035-533db-4a3d824a50545b8a291a81059dcbb97487a13630.gz differ diff --git a/_darcs/patches/20080710051201-533db-2d5fb38710ce1dedcb6e161b08e31611dbaba666.gz b/_darcs/patches/20080710051201-533db-2d5fb38710ce1dedcb6e161b08e31611dbaba666.gz new file mode 100644 index 0000000000..94596e838e Binary files /dev/null and b/_darcs/patches/20080710051201-533db-2d5fb38710ce1dedcb6e161b08e31611dbaba666.gz differ diff --git a/_darcs/patches/20080710051331-533db-a687146f02d399ae1f3368e1b94476bd7e74cc5f.gz b/_darcs/patches/20080710051331-533db-a687146f02d399ae1f3368e1b94476bd7e74cc5f.gz new file mode 100644 index 0000000000..257cf9d896 Binary files /dev/null and b/_darcs/patches/20080710051331-533db-a687146f02d399ae1f3368e1b94476bd7e74cc5f.gz differ diff --git a/_darcs/patches/20080710055726-533db-4b96201b090970f390d62b305256a786a1a96d44.gz b/_darcs/patches/20080710055726-533db-4b96201b090970f390d62b305256a786a1a96d44.gz new file mode 100644 index 0000000000..c887fd1cba Binary files /dev/null and b/_darcs/patches/20080710055726-533db-4b96201b090970f390d62b305256a786a1a96d44.gz differ diff --git a/_darcs/patches/20080710151842-84dde-ad2159088ed05830e4feba88880863c84c4728c8.gz b/_darcs/patches/20080710151842-84dde-ad2159088ed05830e4feba88880863c84c4728c8.gz new file mode 100644 index 0000000000..b9502abaa7 Binary files /dev/null and b/_darcs/patches/20080710151842-84dde-ad2159088ed05830e4feba88880863c84c4728c8.gz differ diff --git a/_darcs/patches/20080711042022-84dde-a29b769e1c032cb1b8bf13a2e6c69671169c032f.gz b/_darcs/patches/20080711042022-84dde-a29b769e1c032cb1b8bf13a2e6c69671169c032f.gz new file mode 100644 index 0000000000..7723c1bd33 Binary files /dev/null and b/_darcs/patches/20080711042022-84dde-a29b769e1c032cb1b8bf13a2e6c69671169c032f.gz differ diff --git a/_darcs/patches/20080711060045-84dde-08b0072de764d5b67ce7abe73fa0553f32de4ab3.gz b/_darcs/patches/20080711060045-84dde-08b0072de764d5b67ce7abe73fa0553f32de4ab3.gz new file mode 100644 index 0000000000..336be8fd09 Binary files /dev/null and b/_darcs/patches/20080711060045-84dde-08b0072de764d5b67ce7abe73fa0553f32de4ab3.gz differ diff --git a/_darcs/patches/20080711070021-ca946-8f8f385ddacc098c8a0c2627e3a8690a9f3aa2c7.gz b/_darcs/patches/20080711070021-ca946-8f8f385ddacc098c8a0c2627e3a8690a9f3aa2c7.gz new file mode 100644 index 0000000000..e251c73bd4 Binary files /dev/null and b/_darcs/patches/20080711070021-ca946-8f8f385ddacc098c8a0c2627e3a8690a9f3aa2c7.gz differ diff --git a/_darcs/patches/20080711171113-84dde-56b61d305e207bdb7d1fa844356fbc41e5bd43b9.gz b/_darcs/patches/20080711171113-84dde-56b61d305e207bdb7d1fa844356fbc41e5bd43b9.gz new file mode 100644 index 0000000000..9e5da764e1 Binary files /dev/null and b/_darcs/patches/20080711171113-84dde-56b61d305e207bdb7d1fa844356fbc41e5bd43b9.gz differ diff --git a/_darcs/patches/20080711171345-84dde-790e24f1d31a716cc52857229087469cd84ad65e.gz b/_darcs/patches/20080711171345-84dde-790e24f1d31a716cc52857229087469cd84ad65e.gz new file mode 100644 index 0000000000..263e5b5af1 Binary files /dev/null and b/_darcs/patches/20080711171345-84dde-790e24f1d31a716cc52857229087469cd84ad65e.gz differ diff --git a/_darcs/patches/20080712051738-84dde-70b1dbc5aa034c6aa9151eac5a216701b7860a72.gz b/_darcs/patches/20080712051738-84dde-70b1dbc5aa034c6aa9151eac5a216701b7860a72.gz new file mode 100644 index 0000000000..7cb79cc9b9 Binary files /dev/null and b/_darcs/patches/20080712051738-84dde-70b1dbc5aa034c6aa9151eac5a216701b7860a72.gz differ diff --git a/_darcs/patches/20080712081247-ca946-acd3e0e2762c7d9ff0cb3cd7a53cfdfcc5b26660.gz b/_darcs/patches/20080712081247-ca946-acd3e0e2762c7d9ff0cb3cd7a53cfdfcc5b26660.gz new file mode 100644 index 0000000000..7f041eeca7 Binary files /dev/null and b/_darcs/patches/20080712081247-ca946-acd3e0e2762c7d9ff0cb3cd7a53cfdfcc5b26660.gz differ diff --git a/_darcs/patches/20080712115300-533db-7426faac9059437c2a06a45ed5c87998f998aada.gz b/_darcs/patches/20080712115300-533db-7426faac9059437c2a06a45ed5c87998f998aada.gz new file mode 100644 index 0000000000..6135d68645 Binary files /dev/null and b/_darcs/patches/20080712115300-533db-7426faac9059437c2a06a45ed5c87998f998aada.gz differ diff --git a/_darcs/patches/20080712123942-533db-21fa41076dd7b57935f49462423f247ccbb01e8f.gz b/_darcs/patches/20080712123942-533db-21fa41076dd7b57935f49462423f247ccbb01e8f.gz new file mode 100644 index 0000000000..dba9de041c Binary files /dev/null and b/_darcs/patches/20080712123942-533db-21fa41076dd7b57935f49462423f247ccbb01e8f.gz differ diff --git a/_darcs/patches/20080712151521-84dde-a81c53bacbe15e77b70fc460ad9143e7e4f8402c.gz b/_darcs/patches/20080712151521-84dde-a81c53bacbe15e77b70fc460ad9143e7e4f8402c.gz new file mode 100644 index 0000000000..1fe2ae0e93 Binary files /dev/null and b/_darcs/patches/20080712151521-84dde-a81c53bacbe15e77b70fc460ad9143e7e4f8402c.gz differ diff --git a/_darcs/patches/20080712200909-84dde-c248fe1d44072c40db59eed592166e3f529cfbb0.gz b/_darcs/patches/20080712200909-84dde-c248fe1d44072c40db59eed592166e3f529cfbb0.gz new file mode 100644 index 0000000000..30503888f7 Binary files /dev/null and b/_darcs/patches/20080712200909-84dde-c248fe1d44072c40db59eed592166e3f529cfbb0.gz differ diff --git a/_darcs/patches/20080712202017-84dde-db9bb7d4db42514215cccf76f12ffae4f853dbdc.gz b/_darcs/patches/20080712202017-84dde-db9bb7d4db42514215cccf76f12ffae4f853dbdc.gz new file mode 100644 index 0000000000..3845dde417 Binary files /dev/null and b/_darcs/patches/20080712202017-84dde-db9bb7d4db42514215cccf76f12ffae4f853dbdc.gz differ diff --git a/_darcs/patches/20080712202903-84dde-e210b42815db5601579a0a890385762c3a54fe5e.gz b/_darcs/patches/20080712202903-84dde-e210b42815db5601579a0a890385762c3a54fe5e.gz new file mode 100644 index 0000000000..8910a57836 Binary files /dev/null and b/_darcs/patches/20080712202903-84dde-e210b42815db5601579a0a890385762c3a54fe5e.gz differ diff --git a/_darcs/patches/20080712204923-84dde-627704bb3a0bb95af3b8fa9ba281a38913e0bbcf.gz b/_darcs/patches/20080712204923-84dde-627704bb3a0bb95af3b8fa9ba281a38913e0bbcf.gz new file mode 100644 index 0000000000..4ddb524165 Binary files /dev/null and b/_darcs/patches/20080712204923-84dde-627704bb3a0bb95af3b8fa9ba281a38913e0bbcf.gz differ diff --git a/_darcs/patches/20080712205220-84dde-c58df22d58fa4d483a0ca09c3d9c74e4e22eb6a7.gz b/_darcs/patches/20080712205220-84dde-c58df22d58fa4d483a0ca09c3d9c74e4e22eb6a7.gz new file mode 100644 index 0000000000..2f0718ca4e Binary files /dev/null and b/_darcs/patches/20080712205220-84dde-c58df22d58fa4d483a0ca09c3d9c74e4e22eb6a7.gz differ diff --git a/_darcs/patches/20080712214610-84dde-bbba589edff6a627e9e131d938c75f4665a9722f.gz b/_darcs/patches/20080712214610-84dde-bbba589edff6a627e9e131d938c75f4665a9722f.gz new file mode 100644 index 0000000000..1ee2f47142 Binary files /dev/null and b/_darcs/patches/20080712214610-84dde-bbba589edff6a627e9e131d938c75f4665a9722f.gz differ diff --git a/_darcs/patches/20080713003932-84dde-cb681331aae0d3351bbeb8bed0744933a462c1d5.gz b/_darcs/patches/20080713003932-84dde-cb681331aae0d3351bbeb8bed0744933a462c1d5.gz new file mode 100644 index 0000000000..3a9bc731bf Binary files /dev/null and b/_darcs/patches/20080713003932-84dde-cb681331aae0d3351bbeb8bed0744933a462c1d5.gz differ diff --git a/_darcs/patches/20080713004936-84dde-52aaffede10321b54abab6b9b91aa41e9395b3eb.gz b/_darcs/patches/20080713004936-84dde-52aaffede10321b54abab6b9b91aa41e9395b3eb.gz new file mode 100644 index 0000000000..2e58fc8a44 Binary files /dev/null and b/_darcs/patches/20080713004936-84dde-52aaffede10321b54abab6b9b91aa41e9395b3eb.gz differ diff --git a/_darcs/patches/20080713024754-533db-af3dbd6186df4ce27caa7c25d0752d3e7afa184a.gz b/_darcs/patches/20080713024754-533db-af3dbd6186df4ce27caa7c25d0752d3e7afa184a.gz new file mode 100644 index 0000000000..947de8c5e7 Binary files /dev/null and b/_darcs/patches/20080713024754-533db-af3dbd6186df4ce27caa7c25d0752d3e7afa184a.gz differ diff --git a/_darcs/patches/20080713042238-533db-d55470e31ebaf8cda8c1ccee0cdc1bd5c58bd69a.gz b/_darcs/patches/20080713042238-533db-d55470e31ebaf8cda8c1ccee0cdc1bd5c58bd69a.gz new file mode 100644 index 0000000000..a191aa8dcd Binary files /dev/null and b/_darcs/patches/20080713042238-533db-d55470e31ebaf8cda8c1ccee0cdc1bd5c58bd69a.gz differ diff --git a/_darcs/patches/20080713044608-533db-ee16aecee9b6d82b22ce6a25f6a9573c23eee9f8.gz b/_darcs/patches/20080713044608-533db-ee16aecee9b6d82b22ce6a25f6a9573c23eee9f8.gz new file mode 100644 index 0000000000..316953c4e0 Binary files /dev/null and b/_darcs/patches/20080713044608-533db-ee16aecee9b6d82b22ce6a25f6a9573c23eee9f8.gz differ diff --git a/_darcs/patches/20080713053033-533db-c1b4e827abd764dc173173556ec889290b0643bf.gz b/_darcs/patches/20080713053033-533db-c1b4e827abd764dc173173556ec889290b0643bf.gz new file mode 100644 index 0000000000..91d9d22eca Binary files /dev/null and b/_darcs/patches/20080713053033-533db-c1b4e827abd764dc173173556ec889290b0643bf.gz differ diff --git a/_darcs/patches/20080713053748-533db-1cdb0cf3a9e4102eb139b74a7a9d4f97dadb20b8.gz b/_darcs/patches/20080713053748-533db-1cdb0cf3a9e4102eb139b74a7a9d4f97dadb20b8.gz new file mode 100644 index 0000000000..3c214d6d0e Binary files /dev/null and b/_darcs/patches/20080713053748-533db-1cdb0cf3a9e4102eb139b74a7a9d4f97dadb20b8.gz differ diff --git a/_darcs/patches/20080713060055-533db-ad45b43abeeab1e2b4326b15597c4f67ea921a56.gz b/_darcs/patches/20080713060055-533db-ad45b43abeeab1e2b4326b15597c4f67ea921a56.gz new file mode 100644 index 0000000000..7cf5106c3a Binary files /dev/null and b/_darcs/patches/20080713060055-533db-ad45b43abeeab1e2b4326b15597c4f67ea921a56.gz differ diff --git a/_darcs/patches/20080713065009-533db-69d7f21d152552d7e994a0c7c7615b61a8ea592c.gz b/_darcs/patches/20080713065009-533db-69d7f21d152552d7e994a0c7c7615b61a8ea592c.gz new file mode 100644 index 0000000000..5876d71792 Binary files /dev/null and b/_darcs/patches/20080713065009-533db-69d7f21d152552d7e994a0c7c7615b61a8ea592c.gz differ diff --git a/_darcs/patches/20080713083853-ca946-f4454aa5da08c870a11398a6ed2d8d5e0762b043.gz b/_darcs/patches/20080713083853-ca946-f4454aa5da08c870a11398a6ed2d8d5e0762b043.gz new file mode 100644 index 0000000000..cfd12c4471 Binary files /dev/null and b/_darcs/patches/20080713083853-ca946-f4454aa5da08c870a11398a6ed2d8d5e0762b043.gz differ diff --git a/_darcs/patches/20080713130112-84dde-b3727f84de7db3bbe96b9d1003380b89402495de.gz b/_darcs/patches/20080713130112-84dde-b3727f84de7db3bbe96b9d1003380b89402495de.gz new file mode 100644 index 0000000000..455dafb724 Binary files /dev/null and b/_darcs/patches/20080713130112-84dde-b3727f84de7db3bbe96b9d1003380b89402495de.gz differ diff --git a/_darcs/patches/20080713151004-84dde-6818a5392e8d78e6672399dfbc183b571751953a.gz b/_darcs/patches/20080713151004-84dde-6818a5392e8d78e6672399dfbc183b571751953a.gz new file mode 100644 index 0000000000..71c32f69a9 Binary files /dev/null and b/_darcs/patches/20080713151004-84dde-6818a5392e8d78e6672399dfbc183b571751953a.gz differ diff --git a/_darcs/patches/20080713151035-84dde-8561acc3546efa741e2d927ffb3167fd8efeb7e1.gz b/_darcs/patches/20080713151035-84dde-8561acc3546efa741e2d927ffb3167fd8efeb7e1.gz new file mode 100644 index 0000000000..019d0a3c08 Binary files /dev/null and b/_darcs/patches/20080713151035-84dde-8561acc3546efa741e2d927ffb3167fd8efeb7e1.gz differ diff --git a/_darcs/patches/20080713215601-84dde-371d54221d9ffbed500e8d3c9e0ad4bb15bd5c30.gz b/_darcs/patches/20080713215601-84dde-371d54221d9ffbed500e8d3c9e0ad4bb15bd5c30.gz new file mode 100644 index 0000000000..2b03fe8b48 Binary files /dev/null and b/_darcs/patches/20080713215601-84dde-371d54221d9ffbed500e8d3c9e0ad4bb15bd5c30.gz differ diff --git a/_darcs/patches/20080713220114-84dde-7f489c6de0921a13fc3a5b3b497f60dd46983749.gz b/_darcs/patches/20080713220114-84dde-7f489c6de0921a13fc3a5b3b497f60dd46983749.gz new file mode 100644 index 0000000000..da69e633cc Binary files /dev/null and b/_darcs/patches/20080713220114-84dde-7f489c6de0921a13fc3a5b3b497f60dd46983749.gz differ diff --git a/_darcs/patches/20080713222006-84dde-a56a5125414499a9bfb6d1d8002470bb77f5dd94.gz b/_darcs/patches/20080713222006-84dde-a56a5125414499a9bfb6d1d8002470bb77f5dd94.gz new file mode 100644 index 0000000000..e4c0d8225b Binary files /dev/null and b/_darcs/patches/20080713222006-84dde-a56a5125414499a9bfb6d1d8002470bb77f5dd94.gz differ diff --git a/_darcs/patches/20080713222056-84dde-71d72b60af252a2240000b50dbb80c371c5dc96a.gz b/_darcs/patches/20080713222056-84dde-71d72b60af252a2240000b50dbb80c371c5dc96a.gz new file mode 100644 index 0000000000..42cad87098 Binary files /dev/null and b/_darcs/patches/20080713222056-84dde-71d72b60af252a2240000b50dbb80c371c5dc96a.gz differ diff --git a/_darcs/patches/20080714000833-68ac8-388a8a23336cd08b7e5e5984834aef3d57c3b7bc.gz b/_darcs/patches/20080714000833-68ac8-388a8a23336cd08b7e5e5984834aef3d57c3b7bc.gz new file mode 100644 index 0000000000..e7fdfe2469 Binary files /dev/null and b/_darcs/patches/20080714000833-68ac8-388a8a23336cd08b7e5e5984834aef3d57c3b7bc.gz differ diff --git a/_darcs/patches/20080714022055-84dde-385e62dcea9c692262556d4e78b52f95212b512a.gz b/_darcs/patches/20080714022055-84dde-385e62dcea9c692262556d4e78b52f95212b512a.gz new file mode 100644 index 0000000000..47ce56ce0e Binary files /dev/null and b/_darcs/patches/20080714022055-84dde-385e62dcea9c692262556d4e78b52f95212b512a.gz differ diff --git a/_darcs/patches/20080714025853-533db-e215a2ab0277acafc1c01d2c12c20ec452ed53e2.gz b/_darcs/patches/20080714025853-533db-e215a2ab0277acafc1c01d2c12c20ec452ed53e2.gz new file mode 100644 index 0000000000..148b746081 Binary files /dev/null and b/_darcs/patches/20080714025853-533db-e215a2ab0277acafc1c01d2c12c20ec452ed53e2.gz differ diff --git a/_darcs/patches/20080714034443-84dde-f443b04e6733b22709d746a700c0ba032d7afb60.gz b/_darcs/patches/20080714034443-84dde-f443b04e6733b22709d746a700c0ba032d7afb60.gz new file mode 100644 index 0000000000..ffd544d43d Binary files /dev/null and b/_darcs/patches/20080714034443-84dde-f443b04e6733b22709d746a700c0ba032d7afb60.gz differ diff --git a/_darcs/patches/20080714034503-84dde-c06198f9d7b8b1c11f6c57e518dcf49b863ee6f3.gz b/_darcs/patches/20080714034503-84dde-c06198f9d7b8b1c11f6c57e518dcf49b863ee6f3.gz new file mode 100644 index 0000000000..da344c3140 Binary files /dev/null and b/_darcs/patches/20080714034503-84dde-c06198f9d7b8b1c11f6c57e518dcf49b863ee6f3.gz differ diff --git a/_darcs/patches/20080714034647-84dde-8cee5c041927eb7d3f47cf14410c6ce09752dd2f.gz b/_darcs/patches/20080714034647-84dde-8cee5c041927eb7d3f47cf14410c6ce09752dd2f.gz new file mode 100644 index 0000000000..f0586e11b8 Binary files /dev/null and b/_darcs/patches/20080714034647-84dde-8cee5c041927eb7d3f47cf14410c6ce09752dd2f.gz differ diff --git a/_darcs/patches/20080714043459-84dde-cd80f2558432b901944d32e71234eb95f6dc47fb.gz b/_darcs/patches/20080714043459-84dde-cd80f2558432b901944d32e71234eb95f6dc47fb.gz new file mode 100644 index 0000000000..bfbb9972d4 Binary files /dev/null and b/_darcs/patches/20080714043459-84dde-cd80f2558432b901944d32e71234eb95f6dc47fb.gz differ diff --git a/_darcs/patches/20080714044153-84dde-8043ee7e32936f468b2cfa096a1a1846eddfba88.gz b/_darcs/patches/20080714044153-84dde-8043ee7e32936f468b2cfa096a1a1846eddfba88.gz new file mode 100644 index 0000000000..ee5f2fc54d Binary files /dev/null and b/_darcs/patches/20080714044153-84dde-8043ee7e32936f468b2cfa096a1a1846eddfba88.gz differ diff --git a/_darcs/patches/20080714050037-08d49-b00c6370c4eed918eee94f828e2d6098b922ba69.gz b/_darcs/patches/20080714050037-08d49-b00c6370c4eed918eee94f828e2d6098b922ba69.gz new file mode 100644 index 0000000000..c885c7e376 Binary files /dev/null and b/_darcs/patches/20080714050037-08d49-b00c6370c4eed918eee94f828e2d6098b922ba69.gz differ diff --git a/_darcs/patches/20080714060517-84dde-7ff9417a790ded358d7fc5fe0d565fc5f3591906.gz b/_darcs/patches/20080714060517-84dde-7ff9417a790ded358d7fc5fe0d565fc5f3591906.gz new file mode 100644 index 0000000000..4cc60e4db5 Binary files /dev/null and b/_darcs/patches/20080714060517-84dde-7ff9417a790ded358d7fc5fe0d565fc5f3591906.gz differ diff --git a/_darcs/patches/20080714080741-ca946-1b2f8c026f433e27a30abc104ca2dba11b9b662e.gz b/_darcs/patches/20080714080741-ca946-1b2f8c026f433e27a30abc104ca2dba11b9b662e.gz new file mode 100644 index 0000000000..a20c8f33a5 Binary files /dev/null and b/_darcs/patches/20080714080741-ca946-1b2f8c026f433e27a30abc104ca2dba11b9b662e.gz differ diff --git a/_darcs/patches/20080714080949-ca946-7372d114c1db9f48aa79f7bd8a5f67042da37ac4.gz b/_darcs/patches/20080714080949-ca946-7372d114c1db9f48aa79f7bd8a5f67042da37ac4.gz new file mode 100644 index 0000000000..e7ccf0bae8 Binary files /dev/null and b/_darcs/patches/20080714080949-ca946-7372d114c1db9f48aa79f7bd8a5f67042da37ac4.gz differ diff --git a/_darcs/patches/20080714091337-533db-86af7bdde30397459299e4604ee6f38f473d4b9e.gz b/_darcs/patches/20080714091337-533db-86af7bdde30397459299e4604ee6f38f473d4b9e.gz new file mode 100644 index 0000000000..26bacb1033 Binary files /dev/null and b/_darcs/patches/20080714091337-533db-86af7bdde30397459299e4604ee6f38f473d4b9e.gz differ diff --git a/_darcs/patches/20080714091448-533db-d87b53ea5c270d41449fb2dfa1c0bd0680262eea.gz b/_darcs/patches/20080714091448-533db-d87b53ea5c270d41449fb2dfa1c0bd0680262eea.gz new file mode 100644 index 0000000000..00fb13ce44 Binary files /dev/null and b/_darcs/patches/20080714091448-533db-d87b53ea5c270d41449fb2dfa1c0bd0680262eea.gz differ diff --git a/_darcs/patches/20080714124733-84dde-a931815975c1e98cc6b8a5d4ebfabb7554d64402.gz b/_darcs/patches/20080714124733-84dde-a931815975c1e98cc6b8a5d4ebfabb7554d64402.gz new file mode 100644 index 0000000000..d3187cf3c0 Binary files /dev/null and b/_darcs/patches/20080714124733-84dde-a931815975c1e98cc6b8a5d4ebfabb7554d64402.gz differ diff --git a/_darcs/patches/20080714140209-d018c-02b3372603f4a012c230f0fffb6e7f29e43e013a.gz b/_darcs/patches/20080714140209-d018c-02b3372603f4a012c230f0fffb6e7f29e43e013a.gz new file mode 100644 index 0000000000..0eaf2ead20 Binary files /dev/null and b/_darcs/patches/20080714140209-d018c-02b3372603f4a012c230f0fffb6e7f29e43e013a.gz differ diff --git a/_darcs/patches/20080714143042-84dde-8da6275ea2bf0e0ce4691d8f56e1b932727efcd8.gz b/_darcs/patches/20080714143042-84dde-8da6275ea2bf0e0ce4691d8f56e1b932727efcd8.gz new file mode 100644 index 0000000000..587e42c892 Binary files /dev/null and b/_darcs/patches/20080714143042-84dde-8da6275ea2bf0e0ce4691d8f56e1b932727efcd8.gz differ diff --git a/_darcs/patches/20080714153859-68ac8-8c370d385fd060d2fcebc118c3000f3c383fb4dc.gz b/_darcs/patches/20080714153859-68ac8-8c370d385fd060d2fcebc118c3000f3c383fb4dc.gz new file mode 100644 index 0000000000..9296978529 Binary files /dev/null and b/_darcs/patches/20080714153859-68ac8-8c370d385fd060d2fcebc118c3000f3c383fb4dc.gz differ diff --git a/_darcs/patches/20080714190300-ca946-80e4dbdd0b5278d03cb00b0922cd69c695a166cb.gz b/_darcs/patches/20080714190300-ca946-80e4dbdd0b5278d03cb00b0922cd69c695a166cb.gz new file mode 100644 index 0000000000..3c0a6941f5 Binary files /dev/null and b/_darcs/patches/20080714190300-ca946-80e4dbdd0b5278d03cb00b0922cd69c695a166cb.gz differ diff --git a/_darcs/patches/20080714191328-68ac8-7b525eb8d85ed77599231b7d7456eaccc8a5ff15.gz b/_darcs/patches/20080714191328-68ac8-7b525eb8d85ed77599231b7d7456eaccc8a5ff15.gz new file mode 100644 index 0000000000..5dd7dc63c6 Binary files /dev/null and b/_darcs/patches/20080714191328-68ac8-7b525eb8d85ed77599231b7d7456eaccc8a5ff15.gz differ diff --git a/_darcs/patches/20080714202728-ca946-fed9631e283e00019aad61a87d7c4f51530327d1.gz b/_darcs/patches/20080714202728-ca946-fed9631e283e00019aad61a87d7c4f51530327d1.gz new file mode 100644 index 0000000000..1ab2ba6ef5 Binary files /dev/null and b/_darcs/patches/20080714202728-ca946-fed9631e283e00019aad61a87d7c4f51530327d1.gz differ diff --git a/_darcs/patches/20080715022045-68ac8-8f8222e7a97009297bed6ff88b6c020192fe6dd2.gz b/_darcs/patches/20080715022045-68ac8-8f8222e7a97009297bed6ff88b6c020192fe6dd2.gz new file mode 100644 index 0000000000..94774e6375 Binary files /dev/null and b/_darcs/patches/20080715022045-68ac8-8f8222e7a97009297bed6ff88b6c020192fe6dd2.gz differ diff --git a/_darcs/patches/20080715031812-ca946-10a94dd3cd96039ad76adc36f0f23d7402768fbe.gz b/_darcs/patches/20080715031812-ca946-10a94dd3cd96039ad76adc36f0f23d7402768fbe.gz new file mode 100644 index 0000000000..13ca9f2c8a Binary files /dev/null and b/_darcs/patches/20080715031812-ca946-10a94dd3cd96039ad76adc36f0f23d7402768fbe.gz differ diff --git a/_darcs/patches/20080715033711-84dde-f4a4583d8182dc18fec6f7ea7e2e27ff4958cb90.gz b/_darcs/patches/20080715033711-84dde-f4a4583d8182dc18fec6f7ea7e2e27ff4958cb90.gz new file mode 100644 index 0000000000..ed46e43482 Binary files /dev/null and b/_darcs/patches/20080715033711-84dde-f4a4583d8182dc18fec6f7ea7e2e27ff4958cb90.gz differ diff --git a/_darcs/patches/20080715043121-ca946-bb7acd42271117dbb77d5e16292673a4b8cfad53.gz b/_darcs/patches/20080715043121-ca946-bb7acd42271117dbb77d5e16292673a4b8cfad53.gz new file mode 100644 index 0000000000..16f7d686dd Binary files /dev/null and b/_darcs/patches/20080715043121-ca946-bb7acd42271117dbb77d5e16292673a4b8cfad53.gz differ diff --git a/_darcs/patches/20080715065850-ca946-6d0e490957830d2f837fd304f70599a636597f9c.gz b/_darcs/patches/20080715065850-ca946-6d0e490957830d2f837fd304f70599a636597f9c.gz new file mode 100644 index 0000000000..4a5d31d63d Binary files /dev/null and b/_darcs/patches/20080715065850-ca946-6d0e490957830d2f837fd304f70599a636597f9c.gz differ diff --git a/_darcs/patches/20080715190519-84dde-766a45bc05fff8682843323145c1bd2460f8c308.gz b/_darcs/patches/20080715190519-84dde-766a45bc05fff8682843323145c1bd2460f8c308.gz new file mode 100644 index 0000000000..cfb62c655a Binary files /dev/null and b/_darcs/patches/20080715190519-84dde-766a45bc05fff8682843323145c1bd2460f8c308.gz differ diff --git a/_darcs/patches/20080715195513-84dde-454419c971015be385d9c4c35f7acbee419031f9.gz b/_darcs/patches/20080715195513-84dde-454419c971015be385d9c4c35f7acbee419031f9.gz new file mode 100644 index 0000000000..8fe2b3192f Binary files /dev/null and b/_darcs/patches/20080715195513-84dde-454419c971015be385d9c4c35f7acbee419031f9.gz differ diff --git a/_darcs/patches/20080715213202-84dde-7a6a8fadfccc76bda12f3de01d17a1d95daf18b8.gz b/_darcs/patches/20080715213202-84dde-7a6a8fadfccc76bda12f3de01d17a1d95daf18b8.gz new file mode 100644 index 0000000000..3a12435ccc Binary files /dev/null and b/_darcs/patches/20080715213202-84dde-7a6a8fadfccc76bda12f3de01d17a1d95daf18b8.gz differ diff --git a/_darcs/patches/20080715214249-84dde-ed5f9b38a93e9fcfd5c6772fb1c784696d3a435a.gz b/_darcs/patches/20080715214249-84dde-ed5f9b38a93e9fcfd5c6772fb1c784696d3a435a.gz new file mode 100644 index 0000000000..e091051c69 Binary files /dev/null and b/_darcs/patches/20080715214249-84dde-ed5f9b38a93e9fcfd5c6772fb1c784696d3a435a.gz differ diff --git a/_darcs/patches/20080715214612-84dde-779ae3816488bdc1e0754fd807fde39c293db61e.gz b/_darcs/patches/20080715214612-84dde-779ae3816488bdc1e0754fd807fde39c293db61e.gz new file mode 100644 index 0000000000..b208738bc9 Binary files /dev/null and b/_darcs/patches/20080715214612-84dde-779ae3816488bdc1e0754fd807fde39c293db61e.gz differ diff --git a/_darcs/patches/20080715214934-84dde-f0a20191b3e833d0660affc944a527e3d06d2f69.gz b/_darcs/patches/20080715214934-84dde-f0a20191b3e833d0660affc944a527e3d06d2f69.gz new file mode 100644 index 0000000000..bc6e6f06e3 Binary files /dev/null and b/_darcs/patches/20080715214934-84dde-f0a20191b3e833d0660affc944a527e3d06d2f69.gz differ diff --git a/_darcs/patches/20080715215407-84dde-6e75d2a138152a2f5dd71fc2813096b4d66ba831.gz b/_darcs/patches/20080715215407-84dde-6e75d2a138152a2f5dd71fc2813096b4d66ba831.gz new file mode 100644 index 0000000000..3307ad7321 Binary files /dev/null and b/_darcs/patches/20080715215407-84dde-6e75d2a138152a2f5dd71fc2813096b4d66ba831.gz differ diff --git a/_darcs/patches/20080715215556-84dde-e41b099910bd11698b0148c6bd4f4d98cc883fb3.gz b/_darcs/patches/20080715215556-84dde-e41b099910bd11698b0148c6bd4f4d98cc883fb3.gz new file mode 100644 index 0000000000..2ebb2a1030 Binary files /dev/null and b/_darcs/patches/20080715215556-84dde-e41b099910bd11698b0148c6bd4f4d98cc883fb3.gz differ diff --git a/_darcs/patches/20080715220144-84dde-9b4c8338b8acf0c1268947cb4a9b8cbdb9751a7f.gz b/_darcs/patches/20080715220144-84dde-9b4c8338b8acf0c1268947cb4a9b8cbdb9751a7f.gz new file mode 100644 index 0000000000..95ae940a53 Binary files /dev/null and b/_darcs/patches/20080715220144-84dde-9b4c8338b8acf0c1268947cb4a9b8cbdb9751a7f.gz differ diff --git a/_darcs/patches/20080715221826-84dde-8a3692f95199818c11dbb0be159d07f1ab10cf6a.gz b/_darcs/patches/20080715221826-84dde-8a3692f95199818c11dbb0be159d07f1ab10cf6a.gz new file mode 100644 index 0000000000..e08730b448 Binary files /dev/null and b/_darcs/patches/20080715221826-84dde-8a3692f95199818c11dbb0be159d07f1ab10cf6a.gz differ diff --git a/_darcs/patches/20080715221946-84dde-cd843d283da019b102073bc64732f4abb89a6456.gz b/_darcs/patches/20080715221946-84dde-cd843d283da019b102073bc64732f4abb89a6456.gz new file mode 100644 index 0000000000..cf8abfa40a Binary files /dev/null and b/_darcs/patches/20080715221946-84dde-cd843d283da019b102073bc64732f4abb89a6456.gz differ diff --git a/_darcs/patches/20080715222026-84dde-6ceebbb94455aec41907896ab65294ce3f79492f.gz b/_darcs/patches/20080715222026-84dde-6ceebbb94455aec41907896ab65294ce3f79492f.gz new file mode 100644 index 0000000000..09c849c549 Binary files /dev/null and b/_darcs/patches/20080715222026-84dde-6ceebbb94455aec41907896ab65294ce3f79492f.gz differ diff --git a/_darcs/patches/20080715222342-84dde-448f6f06f3a596aac279f88f8f14a47f584139e0.gz b/_darcs/patches/20080715222342-84dde-448f6f06f3a596aac279f88f8f14a47f584139e0.gz new file mode 100644 index 0000000000..a9ef94545b Binary files /dev/null and b/_darcs/patches/20080715222342-84dde-448f6f06f3a596aac279f88f8f14a47f584139e0.gz differ diff --git a/_darcs/patches/20080715222554-84dde-8aed1c8c6d30b4a3645fa2563a9368f8e3859fbf.gz b/_darcs/patches/20080715222554-84dde-8aed1c8c6d30b4a3645fa2563a9368f8e3859fbf.gz new file mode 100644 index 0000000000..369399d6b8 Binary files /dev/null and b/_darcs/patches/20080715222554-84dde-8aed1c8c6d30b4a3645fa2563a9368f8e3859fbf.gz differ diff --git a/_darcs/patches/20080715223149-84dde-7159a4db6c0e09c4e616ae45d25ec734a60d36ae.gz b/_darcs/patches/20080715223149-84dde-7159a4db6c0e09c4e616ae45d25ec734a60d36ae.gz new file mode 100644 index 0000000000..c20501fe7f Binary files /dev/null and b/_darcs/patches/20080715223149-84dde-7159a4db6c0e09c4e616ae45d25ec734a60d36ae.gz differ diff --git a/_darcs/patches/20080715234131-ca946-8c277e9f5980953b5037af40db38c0546222304d.gz b/_darcs/patches/20080715234131-ca946-8c277e9f5980953b5037af40db38c0546222304d.gz new file mode 100644 index 0000000000..3df696cf04 Binary files /dev/null and b/_darcs/patches/20080715234131-ca946-8c277e9f5980953b5037af40db38c0546222304d.gz differ diff --git a/_darcs/patches/20080716004414-d018c-dad819f8c5881271f494dd27a073baa05bb7e7bc.gz b/_darcs/patches/20080716004414-d018c-dad819f8c5881271f494dd27a073baa05bb7e7bc.gz new file mode 100644 index 0000000000..5a85dc49a9 Binary files /dev/null and b/_darcs/patches/20080716004414-d018c-dad819f8c5881271f494dd27a073baa05bb7e7bc.gz differ diff --git a/_darcs/patches/20080716025842-84dde-b4100ca8cec891d34d14c1bc66912cbd3762bdfb.gz b/_darcs/patches/20080716025842-84dde-b4100ca8cec891d34d14c1bc66912cbd3762bdfb.gz new file mode 100644 index 0000000000..7f6af8b386 Binary files /dev/null and b/_darcs/patches/20080716025842-84dde-b4100ca8cec891d34d14c1bc66912cbd3762bdfb.gz differ diff --git a/_darcs/patches/20080716030022-84dde-d24e4881e143163031a7b6c077d3eed77a58b579.gz b/_darcs/patches/20080716030022-84dde-d24e4881e143163031a7b6c077d3eed77a58b579.gz new file mode 100644 index 0000000000..b95ddba697 Binary files /dev/null and b/_darcs/patches/20080716030022-84dde-d24e4881e143163031a7b6c077d3eed77a58b579.gz differ diff --git a/_darcs/patches/20080716030200-84dde-eaff2cdf00d9268594b5ecf7913a6746a516af62.gz b/_darcs/patches/20080716030200-84dde-eaff2cdf00d9268594b5ecf7913a6746a516af62.gz new file mode 100644 index 0000000000..624edaf3a6 Binary files /dev/null and b/_darcs/patches/20080716030200-84dde-eaff2cdf00d9268594b5ecf7913a6746a516af62.gz differ diff --git a/_darcs/patches/20080716031346-84dde-2aa160254fd80537ba89df2b39b4560c044d1bab.gz b/_darcs/patches/20080716031346-84dde-2aa160254fd80537ba89df2b39b4560c044d1bab.gz new file mode 100644 index 0000000000..e100a4f3d1 Binary files /dev/null and b/_darcs/patches/20080716031346-84dde-2aa160254fd80537ba89df2b39b4560c044d1bab.gz differ diff --git a/_darcs/patches/20080716031459-84dde-ccb707bb9059bbc95eabb48cf32edf6dfe803108.gz b/_darcs/patches/20080716031459-84dde-ccb707bb9059bbc95eabb48cf32edf6dfe803108.gz new file mode 100644 index 0000000000..e0f6e37065 Binary files /dev/null and b/_darcs/patches/20080716031459-84dde-ccb707bb9059bbc95eabb48cf32edf6dfe803108.gz differ diff --git a/_darcs/patches/20080716031544-84dde-a04b4057e5d7aa394ae061daac47f38089ff5343.gz b/_darcs/patches/20080716031544-84dde-a04b4057e5d7aa394ae061daac47f38089ff5343.gz new file mode 100644 index 0000000000..273c45b975 Binary files /dev/null and b/_darcs/patches/20080716031544-84dde-a04b4057e5d7aa394ae061daac47f38089ff5343.gz differ diff --git a/_darcs/patches/20080716031718-84dde-74ce45fdb3be03ae7974f76698d43ecf78730f23.gz b/_darcs/patches/20080716031718-84dde-74ce45fdb3be03ae7974f76698d43ecf78730f23.gz new file mode 100644 index 0000000000..7cc3e53ac5 Binary files /dev/null and b/_darcs/patches/20080716031718-84dde-74ce45fdb3be03ae7974f76698d43ecf78730f23.gz differ diff --git a/_darcs/patches/20080716032045-982e4-a0b5d37ecfa84796f1681dda54110094ad1424c6.gz b/_darcs/patches/20080716032045-982e4-a0b5d37ecfa84796f1681dda54110094ad1424c6.gz new file mode 100644 index 0000000000..518b04123f Binary files /dev/null and b/_darcs/patches/20080716032045-982e4-a0b5d37ecfa84796f1681dda54110094ad1424c6.gz differ diff --git a/_darcs/patches/20080716053532-84dde-0a53cc573ee9a0c20ff88e011d83f15e60f7c825.gz b/_darcs/patches/20080716053532-84dde-0a53cc573ee9a0c20ff88e011d83f15e60f7c825.gz new file mode 100644 index 0000000000..f8026f6d1b Binary files /dev/null and b/_darcs/patches/20080716053532-84dde-0a53cc573ee9a0c20ff88e011d83f15e60f7c825.gz differ diff --git a/_darcs/patches/20080716054932-84dde-4c7c65cb1b5fb1d3b1b15409e092b40285d6cfd0.gz b/_darcs/patches/20080716054932-84dde-4c7c65cb1b5fb1d3b1b15409e092b40285d6cfd0.gz new file mode 100644 index 0000000000..6c64b8d78f Binary files /dev/null and b/_darcs/patches/20080716054932-84dde-4c7c65cb1b5fb1d3b1b15409e092b40285d6cfd0.gz differ diff --git a/_darcs/patches/20080716055326-5a68a-368860d9a9dfd071e7855c3d05a24b7004f59912.gz b/_darcs/patches/20080716055326-5a68a-368860d9a9dfd071e7855c3d05a24b7004f59912.gz new file mode 100644 index 0000000000..220e0ed35a Binary files /dev/null and b/_darcs/patches/20080716055326-5a68a-368860d9a9dfd071e7855c3d05a24b7004f59912.gz differ diff --git a/_darcs/patches/20080716060922-ca946-6e973c6fb40ab8c8c930b6dfd916e20f40545471.gz b/_darcs/patches/20080716060922-ca946-6e973c6fb40ab8c8c930b6dfd916e20f40545471.gz new file mode 100644 index 0000000000..a416d2b5d5 Binary files /dev/null and b/_darcs/patches/20080716060922-ca946-6e973c6fb40ab8c8c930b6dfd916e20f40545471.gz differ diff --git a/_darcs/patches/20080716061933-84dde-7bb5f28c9263782bc0535cd8303a9fcad3820134.gz b/_darcs/patches/20080716061933-84dde-7bb5f28c9263782bc0535cd8303a9fcad3820134.gz new file mode 100644 index 0000000000..aa7c132e1c Binary files /dev/null and b/_darcs/patches/20080716061933-84dde-7bb5f28c9263782bc0535cd8303a9fcad3820134.gz differ diff --git a/_darcs/patches/20080716064736-5a68a-b57c978702037f380e31d2d8825109821a01cef5.gz b/_darcs/patches/20080716064736-5a68a-b57c978702037f380e31d2d8825109821a01cef5.gz new file mode 100644 index 0000000000..488b3d8593 Binary files /dev/null and b/_darcs/patches/20080716064736-5a68a-b57c978702037f380e31d2d8825109821a01cef5.gz differ diff --git a/_darcs/patches/20080716072124-ca946-6714d13d6801eddf84800b884721aac37852993d.gz b/_darcs/patches/20080716072124-ca946-6714d13d6801eddf84800b884721aac37852993d.gz new file mode 100644 index 0000000000..a16a03146f Binary files /dev/null and b/_darcs/patches/20080716072124-ca946-6714d13d6801eddf84800b884721aac37852993d.gz differ diff --git a/_darcs/patches/20080716134408-84dde-17022943bba55b6108fb015b0166e10f2529d632.gz b/_darcs/patches/20080716134408-84dde-17022943bba55b6108fb015b0166e10f2529d632.gz new file mode 100644 index 0000000000..4b68794c0e Binary files /dev/null and b/_darcs/patches/20080716134408-84dde-17022943bba55b6108fb015b0166e10f2529d632.gz differ diff --git a/_darcs/patches/20080716152009-84dde-8d077ab92d1252c252ab722ba887a57b177c8f65.gz b/_darcs/patches/20080716152009-84dde-8d077ab92d1252c252ab722ba887a57b177c8f65.gz new file mode 100644 index 0000000000..1769081bf7 Binary files /dev/null and b/_darcs/patches/20080716152009-84dde-8d077ab92d1252c252ab722ba887a57b177c8f65.gz differ diff --git a/_darcs/patches/20080716152511-84dde-6f73d947d11083e7235756fde635e145f02e2483.gz b/_darcs/patches/20080716152511-84dde-6f73d947d11083e7235756fde635e145f02e2483.gz new file mode 100644 index 0000000000..c5c87d1e80 Binary files /dev/null and b/_darcs/patches/20080716152511-84dde-6f73d947d11083e7235756fde635e145f02e2483.gz differ diff --git a/_darcs/patches/20080716152906-84dde-6b28a9c29901274ecef255f8b34839445d6e3d7b.gz b/_darcs/patches/20080716152906-84dde-6b28a9c29901274ecef255f8b34839445d6e3d7b.gz new file mode 100644 index 0000000000..621f29b030 Binary files /dev/null and b/_darcs/patches/20080716152906-84dde-6b28a9c29901274ecef255f8b34839445d6e3d7b.gz differ diff --git a/_darcs/patches/20080716163339-84dde-b6d10e042e3168afa07eb6738dae9714b402dbe2.gz b/_darcs/patches/20080716163339-84dde-b6d10e042e3168afa07eb6738dae9714b402dbe2.gz new file mode 100644 index 0000000000..71e46792d1 Binary files /dev/null and b/_darcs/patches/20080716163339-84dde-b6d10e042e3168afa07eb6738dae9714b402dbe2.gz differ diff --git a/_darcs/patches/20080716183052-68ac8-ad94d5e0195ea861cd65b9b3abf8b56824906794.gz b/_darcs/patches/20080716183052-68ac8-ad94d5e0195ea861cd65b9b3abf8b56824906794.gz new file mode 100644 index 0000000000..7e29654def Binary files /dev/null and b/_darcs/patches/20080716183052-68ac8-ad94d5e0195ea861cd65b9b3abf8b56824906794.gz differ diff --git a/_darcs/patches/20080716191847-ca946-9a75dd3aa07974408b269b31d1de3e49c5ae2a72.gz b/_darcs/patches/20080716191847-ca946-9a75dd3aa07974408b269b31d1de3e49c5ae2a72.gz new file mode 100644 index 0000000000..7bdec58df4 Binary files /dev/null and b/_darcs/patches/20080716191847-ca946-9a75dd3aa07974408b269b31d1de3e49c5ae2a72.gz differ diff --git a/_darcs/patches/20080716205218-ca946-98e53e29ed364ea4254ed90303c04b93511877f9.gz b/_darcs/patches/20080716205218-ca946-98e53e29ed364ea4254ed90303c04b93511877f9.gz new file mode 100644 index 0000000000..981f9aae89 Binary files /dev/null and b/_darcs/patches/20080716205218-ca946-98e53e29ed364ea4254ed90303c04b93511877f9.gz differ diff --git a/_darcs/patches/20080716205359-84dde-590916f8812c7c03a2b81b3e7aeb021194ac0f25.gz b/_darcs/patches/20080716205359-84dde-590916f8812c7c03a2b81b3e7aeb021194ac0f25.gz new file mode 100644 index 0000000000..37fff58cb6 Binary files /dev/null and b/_darcs/patches/20080716205359-84dde-590916f8812c7c03a2b81b3e7aeb021194ac0f25.gz differ diff --git a/_darcs/patches/20080716205541-84dde-1c98befb2d53613fe1b161d479b8f91adbfb7f6c.gz b/_darcs/patches/20080716205541-84dde-1c98befb2d53613fe1b161d479b8f91adbfb7f6c.gz new file mode 100644 index 0000000000..ffe05fb56e Binary files /dev/null and b/_darcs/patches/20080716205541-84dde-1c98befb2d53613fe1b161d479b8f91adbfb7f6c.gz differ diff --git a/_darcs/patches/20080716205947-84dde-fa57c8fc140cc479e14b50479df13447abaef31b.gz b/_darcs/patches/20080716205947-84dde-fa57c8fc140cc479e14b50479df13447abaef31b.gz new file mode 100644 index 0000000000..4377c95fc2 Binary files /dev/null and b/_darcs/patches/20080716205947-84dde-fa57c8fc140cc479e14b50479df13447abaef31b.gz differ diff --git a/_darcs/patches/20080716210949-84dde-b12d95acdf6f15887fe83fea8f968c972b862be5.gz b/_darcs/patches/20080716210949-84dde-b12d95acdf6f15887fe83fea8f968c972b862be5.gz new file mode 100644 index 0000000000..139f101c05 Binary files /dev/null and b/_darcs/patches/20080716210949-84dde-b12d95acdf6f15887fe83fea8f968c972b862be5.gz differ diff --git a/_darcs/patches/20080716220223-ca946-e3eed117cded61eb9c2d2805fd07758f883fb85b.gz b/_darcs/patches/20080716220223-ca946-e3eed117cded61eb9c2d2805fd07758f883fb85b.gz new file mode 100644 index 0000000000..e122e39379 Binary files /dev/null and b/_darcs/patches/20080716220223-ca946-e3eed117cded61eb9c2d2805fd07758f883fb85b.gz differ diff --git a/_darcs/patches/20080716230047-ca946-b9ff940ab05b29ed88b209f5ca9b446fbe25eab0.gz b/_darcs/patches/20080716230047-ca946-b9ff940ab05b29ed88b209f5ca9b446fbe25eab0.gz new file mode 100644 index 0000000000..943dfd188f Binary files /dev/null and b/_darcs/patches/20080716230047-ca946-b9ff940ab05b29ed88b209f5ca9b446fbe25eab0.gz differ diff --git a/_darcs/patches/20080717054411-ca946-e839882ebec3f6d6a12a3f5ecdc1cc403e8afe51.gz b/_darcs/patches/20080717054411-ca946-e839882ebec3f6d6a12a3f5ecdc1cc403e8afe51.gz new file mode 100644 index 0000000000..91d349b666 Binary files /dev/null and b/_darcs/patches/20080717054411-ca946-e839882ebec3f6d6a12a3f5ecdc1cc403e8afe51.gz differ diff --git a/_darcs/patches/20080717124215-84dde-83c2c5ec54a50bb5aa7a5adc23321dadc48083ad.gz b/_darcs/patches/20080717124215-84dde-83c2c5ec54a50bb5aa7a5adc23321dadc48083ad.gz new file mode 100644 index 0000000000..df3087851d Binary files /dev/null and b/_darcs/patches/20080717124215-84dde-83c2c5ec54a50bb5aa7a5adc23321dadc48083ad.gz differ diff --git a/_darcs/patches/20080717124719-84dde-192dd0799905c6fde3bf503c08951d4a308e1e12.gz b/_darcs/patches/20080717124719-84dde-192dd0799905c6fde3bf503c08951d4a308e1e12.gz new file mode 100644 index 0000000000..568c9f9267 Binary files /dev/null and b/_darcs/patches/20080717124719-84dde-192dd0799905c6fde3bf503c08951d4a308e1e12.gz differ diff --git a/_darcs/patches/20080717132452-84dde-47017a07fa6a141062d50e7cd1b4473c20f4d25f.gz b/_darcs/patches/20080717132452-84dde-47017a07fa6a141062d50e7cd1b4473c20f4d25f.gz new file mode 100644 index 0000000000..8005a8ae91 Binary files /dev/null and b/_darcs/patches/20080717132452-84dde-47017a07fa6a141062d50e7cd1b4473c20f4d25f.gz differ diff --git a/_darcs/patches/20080717132533-84dde-4ada5d4a103d92b9767726e723b26246205b9cbd.gz b/_darcs/patches/20080717132533-84dde-4ada5d4a103d92b9767726e723b26246205b9cbd.gz new file mode 100644 index 0000000000..43365645cf Binary files /dev/null and b/_darcs/patches/20080717132533-84dde-4ada5d4a103d92b9767726e723b26246205b9cbd.gz differ diff --git a/_darcs/patches/20080717134331-84dde-b63c9b7e318d74e2cfea14cc962ec2d519f20d43.gz b/_darcs/patches/20080717134331-84dde-b63c9b7e318d74e2cfea14cc962ec2d519f20d43.gz new file mode 100644 index 0000000000..a62365849b Binary files /dev/null and b/_darcs/patches/20080717134331-84dde-b63c9b7e318d74e2cfea14cc962ec2d519f20d43.gz differ diff --git a/_darcs/patches/20080717153657-84dde-bbd0179305b8080911be123ffec26cee03bc1153.gz b/_darcs/patches/20080717153657-84dde-bbd0179305b8080911be123ffec26cee03bc1153.gz new file mode 100644 index 0000000000..1c370a34fe Binary files /dev/null and b/_darcs/patches/20080717153657-84dde-bbd0179305b8080911be123ffec26cee03bc1153.gz differ diff --git a/_darcs/patches/20080717155212-84dde-15d39c28e6b502767c1deaf838f6a65136baeda9.gz b/_darcs/patches/20080717155212-84dde-15d39c28e6b502767c1deaf838f6a65136baeda9.gz new file mode 100644 index 0000000000..ac6f2fe90b Binary files /dev/null and b/_darcs/patches/20080717155212-84dde-15d39c28e6b502767c1deaf838f6a65136baeda9.gz differ diff --git a/_darcs/patches/20080717155438-84dde-7fbe7230ab50e076216d4def65b87a38d7e4edb3.gz b/_darcs/patches/20080717155438-84dde-7fbe7230ab50e076216d4def65b87a38d7e4edb3.gz new file mode 100644 index 0000000000..52c7dded55 Binary files /dev/null and b/_darcs/patches/20080717155438-84dde-7fbe7230ab50e076216d4def65b87a38d7e4edb3.gz differ diff --git a/_darcs/patches/20080717160257-84dde-8c4f78582ef0d590102c078a045826951ffcbb28.gz b/_darcs/patches/20080717160257-84dde-8c4f78582ef0d590102c078a045826951ffcbb28.gz new file mode 100644 index 0000000000..f80d8374e6 Binary files /dev/null and b/_darcs/patches/20080717160257-84dde-8c4f78582ef0d590102c078a045826951ffcbb28.gz differ diff --git a/_darcs/patches/20080717160531-84dde-1a44025c9cf5b2da1f62714cc82ccdb490a8bb63.gz b/_darcs/patches/20080717160531-84dde-1a44025c9cf5b2da1f62714cc82ccdb490a8bb63.gz new file mode 100644 index 0000000000..7b3e353dee Binary files /dev/null and b/_darcs/patches/20080717160531-84dde-1a44025c9cf5b2da1f62714cc82ccdb490a8bb63.gz differ diff --git a/_darcs/patches/20080717163211-84dde-6fceee14b023a44bd44311528c8a74a9ca3917e8.gz b/_darcs/patches/20080717163211-84dde-6fceee14b023a44bd44311528c8a74a9ca3917e8.gz new file mode 100644 index 0000000000..b0f567ad85 Binary files /dev/null and b/_darcs/patches/20080717163211-84dde-6fceee14b023a44bd44311528c8a74a9ca3917e8.gz differ diff --git a/_darcs/patches/20080717163613-84dde-2684415a03d1a2754e148e4921ce39ad075bbc5b.gz b/_darcs/patches/20080717163613-84dde-2684415a03d1a2754e148e4921ce39ad075bbc5b.gz new file mode 100644 index 0000000000..eec7d088db Binary files /dev/null and b/_darcs/patches/20080717163613-84dde-2684415a03d1a2754e148e4921ce39ad075bbc5b.gz differ diff --git a/_darcs/patches/20080717164042-84dde-191bc47dc302911e4ceae0d3b1e74116bb95bcba.gz b/_darcs/patches/20080717164042-84dde-191bc47dc302911e4ceae0d3b1e74116bb95bcba.gz new file mode 100644 index 0000000000..bfc76e0c72 Binary files /dev/null and b/_darcs/patches/20080717164042-84dde-191bc47dc302911e4ceae0d3b1e74116bb95bcba.gz differ diff --git a/_darcs/patches/20080717210519-84dde-4a2e4caa23d793e74208dcf5c21221e4166366f2.gz b/_darcs/patches/20080717210519-84dde-4a2e4caa23d793e74208dcf5c21221e4166366f2.gz new file mode 100644 index 0000000000..5851ea6153 Binary files /dev/null and b/_darcs/patches/20080717210519-84dde-4a2e4caa23d793e74208dcf5c21221e4166366f2.gz differ diff --git a/_darcs/patches/20080717211942-84dde-3e8fcffc2c4def3088389ed5c1720919458d6f54.gz b/_darcs/patches/20080717211942-84dde-3e8fcffc2c4def3088389ed5c1720919458d6f54.gz new file mode 100644 index 0000000000..9cbd1815c4 Binary files /dev/null and b/_darcs/patches/20080717211942-84dde-3e8fcffc2c4def3088389ed5c1720919458d6f54.gz differ diff --git a/_darcs/patches/20080717213214-84dde-9e7226c5b33d704398e250ad37653b30effaa069.gz b/_darcs/patches/20080717213214-84dde-9e7226c5b33d704398e250ad37653b30effaa069.gz new file mode 100644 index 0000000000..f98ceda7c0 Binary files /dev/null and b/_darcs/patches/20080717213214-84dde-9e7226c5b33d704398e250ad37653b30effaa069.gz differ diff --git a/_darcs/patches/20080717222845-ca946-f2644317a144157aaba7a38d4effb216a9c5f650.gz b/_darcs/patches/20080717222845-ca946-f2644317a144157aaba7a38d4effb216a9c5f650.gz new file mode 100644 index 0000000000..82c9947aff Binary files /dev/null and b/_darcs/patches/20080717222845-ca946-f2644317a144157aaba7a38d4effb216a9c5f650.gz differ diff --git a/_darcs/patches/20080717223521-ca946-cd043e9430956dde56907181896a16133333d905.gz b/_darcs/patches/20080717223521-ca946-cd043e9430956dde56907181896a16133333d905.gz new file mode 100644 index 0000000000..e6fee64a3a Binary files /dev/null and b/_darcs/patches/20080717223521-ca946-cd043e9430956dde56907181896a16133333d905.gz differ diff --git a/_darcs/patches/20080717235306-533db-499c63251966a404081c8b0aa1c92a18c28cc27d.gz b/_darcs/patches/20080717235306-533db-499c63251966a404081c8b0aa1c92a18c28cc27d.gz new file mode 100644 index 0000000000..e3b6b4e4a0 Binary files /dev/null and b/_darcs/patches/20080717235306-533db-499c63251966a404081c8b0aa1c92a18c28cc27d.gz differ diff --git a/_darcs/patches/20080718002131-ca946-d34d4554dadbdfc1cff6648e989a73d4b3b24271.gz b/_darcs/patches/20080718002131-ca946-d34d4554dadbdfc1cff6648e989a73d4b3b24271.gz new file mode 100644 index 0000000000..8bfe728fae Binary files /dev/null and b/_darcs/patches/20080718002131-ca946-d34d4554dadbdfc1cff6648e989a73d4b3b24271.gz differ diff --git a/_darcs/patches/20080718002324-ca946-6b30ea6e3941b0f1278712edc02d9eeef00a3cc2.gz b/_darcs/patches/20080718002324-ca946-6b30ea6e3941b0f1278712edc02d9eeef00a3cc2.gz new file mode 100644 index 0000000000..a201c5a732 Binary files /dev/null and b/_darcs/patches/20080718002324-ca946-6b30ea6e3941b0f1278712edc02d9eeef00a3cc2.gz differ diff --git a/_darcs/patches/20080718013444-84dde-7076bec8ccdf34ef5d31efd7bbbbfd29a1f3dab3.gz b/_darcs/patches/20080718013444-84dde-7076bec8ccdf34ef5d31efd7bbbbfd29a1f3dab3.gz new file mode 100644 index 0000000000..77076ec282 Binary files /dev/null and b/_darcs/patches/20080718013444-84dde-7076bec8ccdf34ef5d31efd7bbbbfd29a1f3dab3.gz differ diff --git a/_darcs/patches/20080718023334-ca946-5d158ade124318f7f846d1f8e0f35ccf1a234027.gz b/_darcs/patches/20080718023334-ca946-5d158ade124318f7f846d1f8e0f35ccf1a234027.gz new file mode 100644 index 0000000000..8e2af09df4 Binary files /dev/null and b/_darcs/patches/20080718023334-ca946-5d158ade124318f7f846d1f8e0f35ccf1a234027.gz differ diff --git a/_darcs/patches/20080718025554-ca946-1e4b5aa5570c15f4e71df58c41d16f6ece1e359b.gz b/_darcs/patches/20080718025554-ca946-1e4b5aa5570c15f4e71df58c41d16f6ece1e359b.gz new file mode 100644 index 0000000000..bb89eb797d Binary files /dev/null and b/_darcs/patches/20080718025554-ca946-1e4b5aa5570c15f4e71df58c41d16f6ece1e359b.gz differ diff --git a/_darcs/patches/20080718040332-ca946-0c8da4f5e98355ccbb1ee929693fa74bff3c2481.gz b/_darcs/patches/20080718040332-ca946-0c8da4f5e98355ccbb1ee929693fa74bff3c2481.gz new file mode 100644 index 0000000000..751b72cd50 Binary files /dev/null and b/_darcs/patches/20080718040332-ca946-0c8da4f5e98355ccbb1ee929693fa74bff3c2481.gz differ diff --git a/_darcs/patches/20080718041231-84dde-5953d417b76ae538fd501db11af9ff4a32bfbc9f.gz b/_darcs/patches/20080718041231-84dde-5953d417b76ae538fd501db11af9ff4a32bfbc9f.gz new file mode 100644 index 0000000000..a13c976926 Binary files /dev/null and b/_darcs/patches/20080718041231-84dde-5953d417b76ae538fd501db11af9ff4a32bfbc9f.gz differ diff --git a/_darcs/patches/20080718041323-84dde-2cc93bd2ced792797db634c4c4cd2a72a6ae61be.gz b/_darcs/patches/20080718041323-84dde-2cc93bd2ced792797db634c4c4cd2a72a6ae61be.gz new file mode 100644 index 0000000000..63b55b7ca7 Binary files /dev/null and b/_darcs/patches/20080718041323-84dde-2cc93bd2ced792797db634c4c4cd2a72a6ae61be.gz differ diff --git a/_darcs/patches/20080718041549-84dde-fbf9fe830b5f4be5cce5124522f923b83de3a582.gz b/_darcs/patches/20080718041549-84dde-fbf9fe830b5f4be5cce5124522f923b83de3a582.gz new file mode 100644 index 0000000000..0db392fbde Binary files /dev/null and b/_darcs/patches/20080718041549-84dde-fbf9fe830b5f4be5cce5124522f923b83de3a582.gz differ diff --git a/_darcs/patches/20080718041633-84dde-4fb8e5738b6594334e42d21c4ed104039da62abb.gz b/_darcs/patches/20080718041633-84dde-4fb8e5738b6594334e42d21c4ed104039da62abb.gz new file mode 100644 index 0000000000..5ec0d79afc Binary files /dev/null and b/_darcs/patches/20080718041633-84dde-4fb8e5738b6594334e42d21c4ed104039da62abb.gz differ diff --git a/_darcs/patches/20080718042030-84dde-78e056f1e47335556d353cdf2940651f59291efd.gz b/_darcs/patches/20080718042030-84dde-78e056f1e47335556d353cdf2940651f59291efd.gz new file mode 100644 index 0000000000..fc0e6e9fb7 Binary files /dev/null and b/_darcs/patches/20080718042030-84dde-78e056f1e47335556d353cdf2940651f59291efd.gz differ diff --git a/_darcs/patches/20080718042352-84dde-6326cd8c68b73ccf801b93314e3f5352ff744544.gz b/_darcs/patches/20080718042352-84dde-6326cd8c68b73ccf801b93314e3f5352ff744544.gz new file mode 100644 index 0000000000..a431333d3a Binary files /dev/null and b/_darcs/patches/20080718042352-84dde-6326cd8c68b73ccf801b93314e3f5352ff744544.gz differ diff --git a/_darcs/patches/20080718042511-84dde-577d462b1441a30d1d88cc8e26dde32bde79c9fd.gz b/_darcs/patches/20080718042511-84dde-577d462b1441a30d1d88cc8e26dde32bde79c9fd.gz new file mode 100644 index 0000000000..ace17060f5 Binary files /dev/null and b/_darcs/patches/20080718042511-84dde-577d462b1441a30d1d88cc8e26dde32bde79c9fd.gz differ diff --git a/_darcs/patches/20080718043456-84dde-ffe825e8021e0f803fbbecacdc93d26309853daa.gz b/_darcs/patches/20080718043456-84dde-ffe825e8021e0f803fbbecacdc93d26309853daa.gz new file mode 100644 index 0000000000..add96f2c55 Binary files /dev/null and b/_darcs/patches/20080718043456-84dde-ffe825e8021e0f803fbbecacdc93d26309853daa.gz differ diff --git a/_darcs/patches/20080718043735-84dde-8c74ccaf2560716209b8518e77e6a0f357d881af.gz b/_darcs/patches/20080718043735-84dde-8c74ccaf2560716209b8518e77e6a0f357d881af.gz new file mode 100644 index 0000000000..d91aacbb93 Binary files /dev/null and b/_darcs/patches/20080718043735-84dde-8c74ccaf2560716209b8518e77e6a0f357d881af.gz differ diff --git a/_darcs/patches/20080718044905-84dde-2d447d7ec4e6d6a56075c8238f357ecb48fd295c.gz b/_darcs/patches/20080718044905-84dde-2d447d7ec4e6d6a56075c8238f357ecb48fd295c.gz new file mode 100644 index 0000000000..d8f2cc2e42 Binary files /dev/null and b/_darcs/patches/20080718044905-84dde-2d447d7ec4e6d6a56075c8238f357ecb48fd295c.gz differ diff --git a/_darcs/patches/20080718045150-84dde-8fda088ea35c20d23ae86a9c61189545754403b2.gz b/_darcs/patches/20080718045150-84dde-8fda088ea35c20d23ae86a9c61189545754403b2.gz new file mode 100644 index 0000000000..fc29c8713f Binary files /dev/null and b/_darcs/patches/20080718045150-84dde-8fda088ea35c20d23ae86a9c61189545754403b2.gz differ diff --git a/_darcs/patches/20080718045204-84dde-1fb4fe473c9dd64867920ec8e5a1b0c15661e9e6.gz b/_darcs/patches/20080718045204-84dde-1fb4fe473c9dd64867920ec8e5a1b0c15661e9e6.gz new file mode 100644 index 0000000000..1f39edb15d Binary files /dev/null and b/_darcs/patches/20080718045204-84dde-1fb4fe473c9dd64867920ec8e5a1b0c15661e9e6.gz differ diff --git a/_darcs/patches/20080718050845-84dde-ab587c6b35c0366f8bd8f4dc27fe868bc69703be.gz b/_darcs/patches/20080718050845-84dde-ab587c6b35c0366f8bd8f4dc27fe868bc69703be.gz new file mode 100644 index 0000000000..68c2ff682e Binary files /dev/null and b/_darcs/patches/20080718050845-84dde-ab587c6b35c0366f8bd8f4dc27fe868bc69703be.gz differ diff --git a/_darcs/patches/20080718051318-84dde-6776fb3ce4bb69b7abc377532857cd916ac56a29.gz b/_darcs/patches/20080718051318-84dde-6776fb3ce4bb69b7abc377532857cd916ac56a29.gz new file mode 100644 index 0000000000..93453dd0d9 Binary files /dev/null and b/_darcs/patches/20080718051318-84dde-6776fb3ce4bb69b7abc377532857cd916ac56a29.gz differ diff --git a/_darcs/patches/20080718051404-84dde-fc6a1b93f8e1f4faf6dd15d79372709f6493776e.gz b/_darcs/patches/20080718051404-84dde-fc6a1b93f8e1f4faf6dd15d79372709f6493776e.gz new file mode 100644 index 0000000000..f3fdd7510f Binary files /dev/null and b/_darcs/patches/20080718051404-84dde-fc6a1b93f8e1f4faf6dd15d79372709f6493776e.gz differ diff --git a/_darcs/patches/20080718051841-84dde-32da4237ac89bc6dd953a1e73cab63e8aa718746.gz b/_darcs/patches/20080718051841-84dde-32da4237ac89bc6dd953a1e73cab63e8aa718746.gz new file mode 100644 index 0000000000..96583470d2 Binary files /dev/null and b/_darcs/patches/20080718051841-84dde-32da4237ac89bc6dd953a1e73cab63e8aa718746.gz differ diff --git a/_darcs/patches/20080718052557-84dde-65d7411377b866a66474584e90dc08ea3eb432b0.gz b/_darcs/patches/20080718052557-84dde-65d7411377b866a66474584e90dc08ea3eb432b0.gz new file mode 100644 index 0000000000..633a9f0360 Binary files /dev/null and b/_darcs/patches/20080718052557-84dde-65d7411377b866a66474584e90dc08ea3eb432b0.gz differ diff --git a/_darcs/patches/20080718063130-84dde-01cc0d9d9cf92e5ad9f5c079c771e2ea64c8d5f2.gz b/_darcs/patches/20080718063130-84dde-01cc0d9d9cf92e5ad9f5c079c771e2ea64c8d5f2.gz new file mode 100644 index 0000000000..e3ad5c8138 Binary files /dev/null and b/_darcs/patches/20080718063130-84dde-01cc0d9d9cf92e5ad9f5c079c771e2ea64c8d5f2.gz differ diff --git a/_darcs/patches/20080718070252-84dde-27b01cd01b309ba079c38e9bd09a97b1626d479b.gz b/_darcs/patches/20080718070252-84dde-27b01cd01b309ba079c38e9bd09a97b1626d479b.gz new file mode 100644 index 0000000000..508a6615cb Binary files /dev/null and b/_darcs/patches/20080718070252-84dde-27b01cd01b309ba079c38e9bd09a97b1626d479b.gz differ diff --git a/_darcs/patches/20080718164120-84dde-b5fa39b14b26d4d6ed0a0452692744b1c3cbf64b.gz b/_darcs/patches/20080718164120-84dde-b5fa39b14b26d4d6ed0a0452692744b1c3cbf64b.gz new file mode 100644 index 0000000000..93b9221ab7 Binary files /dev/null and b/_darcs/patches/20080718164120-84dde-b5fa39b14b26d4d6ed0a0452692744b1c3cbf64b.gz differ diff --git a/_darcs/patches/20080718164317-34904-693c42830fa5682f49ac2213b31153172815b9a5.gz b/_darcs/patches/20080718164317-34904-693c42830fa5682f49ac2213b31153172815b9a5.gz new file mode 100644 index 0000000000..d6f22afb32 Binary files /dev/null and b/_darcs/patches/20080718164317-34904-693c42830fa5682f49ac2213b31153172815b9a5.gz differ diff --git a/_darcs/patches/20080718164332-34904-c590580bef21d90072f988d2597154b954823299.gz b/_darcs/patches/20080718164332-34904-c590580bef21d90072f988d2597154b954823299.gz new file mode 100644 index 0000000000..1c67536043 Binary files /dev/null and b/_darcs/patches/20080718164332-34904-c590580bef21d90072f988d2597154b954823299.gz differ diff --git a/_darcs/patches/20080718180951-84dde-322895309c13697b30832bd463f55a49f5e9d964.gz b/_darcs/patches/20080718180951-84dde-322895309c13697b30832bd463f55a49f5e9d964.gz new file mode 100644 index 0000000000..7088e0734c Binary files /dev/null and b/_darcs/patches/20080718180951-84dde-322895309c13697b30832bd463f55a49f5e9d964.gz differ diff --git a/_darcs/patches/20080718181612-84dde-4934733cdeeb331e2c71e14626dc6f6e51097824.gz b/_darcs/patches/20080718181612-84dde-4934733cdeeb331e2c71e14626dc6f6e51097824.gz new file mode 100644 index 0000000000..dcf67127d2 Binary files /dev/null and b/_darcs/patches/20080718181612-84dde-4934733cdeeb331e2c71e14626dc6f6e51097824.gz differ diff --git a/_darcs/patches/20080718183534-84dde-a8cdb4cbcb3eb67152eb74179e3b00061e2287cf.gz b/_darcs/patches/20080718183534-84dde-a8cdb4cbcb3eb67152eb74179e3b00061e2287cf.gz new file mode 100644 index 0000000000..6b99c73574 Binary files /dev/null and b/_darcs/patches/20080718183534-84dde-a8cdb4cbcb3eb67152eb74179e3b00061e2287cf.gz differ diff --git a/_darcs/patches/20080718185027-84dde-f349b9772ec091d8b09bc09405a9ff5660902a2c.gz b/_darcs/patches/20080718185027-84dde-f349b9772ec091d8b09bc09405a9ff5660902a2c.gz new file mode 100644 index 0000000000..509b9afcf8 Binary files /dev/null and b/_darcs/patches/20080718185027-84dde-f349b9772ec091d8b09bc09405a9ff5660902a2c.gz differ diff --git a/_darcs/patches/20080718185053-ca946-457b1ce5261abeb067bbbaba43b707ad4751aeef.gz b/_darcs/patches/20080718185053-ca946-457b1ce5261abeb067bbbaba43b707ad4751aeef.gz new file mode 100644 index 0000000000..4cd7922658 Binary files /dev/null and b/_darcs/patches/20080718185053-ca946-457b1ce5261abeb067bbbaba43b707ad4751aeef.gz differ diff --git a/_darcs/patches/20080718190835-84dde-1ce20cb3ac604f0e9fa9e4ed86118bca7bec3a06.gz b/_darcs/patches/20080718190835-84dde-1ce20cb3ac604f0e9fa9e4ed86118bca7bec3a06.gz new file mode 100644 index 0000000000..06cba9891d Binary files /dev/null and b/_darcs/patches/20080718190835-84dde-1ce20cb3ac604f0e9fa9e4ed86118bca7bec3a06.gz differ diff --git a/_darcs/patches/20080718191019-84dde-8b16ec097fedfb3a4366e4c4317248452b368bfc.gz b/_darcs/patches/20080718191019-84dde-8b16ec097fedfb3a4366e4c4317248452b368bfc.gz new file mode 100644 index 0000000000..3353c45950 Binary files /dev/null and b/_darcs/patches/20080718191019-84dde-8b16ec097fedfb3a4366e4c4317248452b368bfc.gz differ diff --git a/_darcs/patches/20080718202052-84dde-cf788df7bcf76f971229d18041823a9483a164cc.gz b/_darcs/patches/20080718202052-84dde-cf788df7bcf76f971229d18041823a9483a164cc.gz new file mode 100644 index 0000000000..cd280d9bbe Binary files /dev/null and b/_darcs/patches/20080718202052-84dde-cf788df7bcf76f971229d18041823a9483a164cc.gz differ diff --git a/_darcs/patches/20080718202124-84dde-42b9c1d73c51c9bb98cb3896bb03716067762c48.gz b/_darcs/patches/20080718202124-84dde-42b9c1d73c51c9bb98cb3896bb03716067762c48.gz new file mode 100644 index 0000000000..2873cffc82 Binary files /dev/null and b/_darcs/patches/20080718202124-84dde-42b9c1d73c51c9bb98cb3896bb03716067762c48.gz differ diff --git a/_darcs/patches/20080718202702-84dde-7a7e8223323c93cfae74f497cef1cf55e8a75c47.gz b/_darcs/patches/20080718202702-84dde-7a7e8223323c93cfae74f497cef1cf55e8a75c47.gz new file mode 100644 index 0000000000..ac4e2681f6 Binary files /dev/null and b/_darcs/patches/20080718202702-84dde-7a7e8223323c93cfae74f497cef1cf55e8a75c47.gz differ diff --git a/_darcs/patches/20080719003417-982e4-7004f8a4dfb447f941457c30b0b2289eee5582e6.gz b/_darcs/patches/20080719003417-982e4-7004f8a4dfb447f941457c30b0b2289eee5582e6.gz new file mode 100644 index 0000000000..a20a597ba1 Binary files /dev/null and b/_darcs/patches/20080719003417-982e4-7004f8a4dfb447f941457c30b0b2289eee5582e6.gz differ diff --git a/_darcs/patches/20080719140906-84dde-9fcac26ee544ad53091808256f70b1745ac27a70.gz b/_darcs/patches/20080719140906-84dde-9fcac26ee544ad53091808256f70b1745ac27a70.gz new file mode 100644 index 0000000000..ea054d9599 Binary files /dev/null and b/_darcs/patches/20080719140906-84dde-9fcac26ee544ad53091808256f70b1745ac27a70.gz differ diff --git a/_darcs/patches/20080719142058-84dde-60908b20612ee8965015b96d7e279de28cd9b112.gz b/_darcs/patches/20080719142058-84dde-60908b20612ee8965015b96d7e279de28cd9b112.gz new file mode 100644 index 0000000000..a391e05977 Binary files /dev/null and b/_darcs/patches/20080719142058-84dde-60908b20612ee8965015b96d7e279de28cd9b112.gz differ diff --git a/_darcs/patches/20080719154753-84dde-9b0da984d03ed4010abddbc77858d86986c075b0.gz b/_darcs/patches/20080719154753-84dde-9b0da984d03ed4010abddbc77858d86986c075b0.gz new file mode 100644 index 0000000000..063c9cf83a Binary files /dev/null and b/_darcs/patches/20080719154753-84dde-9b0da984d03ed4010abddbc77858d86986c075b0.gz differ diff --git a/_darcs/patches/20080719155526-84dde-5157cd11d2f96128321b46cb2bea8ff27ce4478f.gz b/_darcs/patches/20080719155526-84dde-5157cd11d2f96128321b46cb2bea8ff27ce4478f.gz new file mode 100644 index 0000000000..26b7a62043 Binary files /dev/null and b/_darcs/patches/20080719155526-84dde-5157cd11d2f96128321b46cb2bea8ff27ce4478f.gz differ diff --git a/_darcs/patches/20080719162355-0dc29-8ad0a40a93697853117c4a85c7e3e66bec564abb.gz b/_darcs/patches/20080719162355-0dc29-8ad0a40a93697853117c4a85c7e3e66bec564abb.gz new file mode 100644 index 0000000000..bd5bd74c1c Binary files /dev/null and b/_darcs/patches/20080719162355-0dc29-8ad0a40a93697853117c4a85c7e3e66bec564abb.gz differ diff --git a/_darcs/patches/20080719171023-84dde-4d562898d10a2342db271640951fcf0ba552cc01.gz b/_darcs/patches/20080719171023-84dde-4d562898d10a2342db271640951fcf0ba552cc01.gz new file mode 100644 index 0000000000..154c9b1c3d Binary files /dev/null and b/_darcs/patches/20080719171023-84dde-4d562898d10a2342db271640951fcf0ba552cc01.gz differ diff --git a/_darcs/patches/20080719171605-84dde-4b23eb6896d9bb6e57ce65de374acaf1703b7463.gz b/_darcs/patches/20080719171605-84dde-4b23eb6896d9bb6e57ce65de374acaf1703b7463.gz new file mode 100644 index 0000000000..52f2a186b5 Binary files /dev/null and b/_darcs/patches/20080719171605-84dde-4b23eb6896d9bb6e57ce65de374acaf1703b7463.gz differ diff --git a/_darcs/patches/20080719202625-84dde-52b3d6710302f55e35ef57ea0aa4aff07cbeafaa.gz b/_darcs/patches/20080719202625-84dde-52b3d6710302f55e35ef57ea0aa4aff07cbeafaa.gz new file mode 100644 index 0000000000..c154eff4e1 Binary files /dev/null and b/_darcs/patches/20080719202625-84dde-52b3d6710302f55e35ef57ea0aa4aff07cbeafaa.gz differ diff --git a/_darcs/patches/20080720015823-982e4-b33e1ef01cd071e958c9c51625190513b86594f3.gz b/_darcs/patches/20080720015823-982e4-b33e1ef01cd071e958c9c51625190513b86594f3.gz new file mode 100644 index 0000000000..b3a8ae61d9 Binary files /dev/null and b/_darcs/patches/20080720015823-982e4-b33e1ef01cd071e958c9c51625190513b86594f3.gz differ diff --git a/_darcs/patches/20080720023259-533db-6a4e8abb730b2192fcf2887a665dee2e1048529a.gz b/_darcs/patches/20080720023259-533db-6a4e8abb730b2192fcf2887a665dee2e1048529a.gz new file mode 100644 index 0000000000..7270f629ef Binary files /dev/null and b/_darcs/patches/20080720023259-533db-6a4e8abb730b2192fcf2887a665dee2e1048529a.gz differ diff --git a/_darcs/patches/20080720023510-533db-74cdcbc59c5956c1bd1ce3b01921fd4cd1c7376c.gz b/_darcs/patches/20080720023510-533db-74cdcbc59c5956c1bd1ce3b01921fd4cd1c7376c.gz new file mode 100644 index 0000000000..24c267fdb5 Binary files /dev/null and b/_darcs/patches/20080720023510-533db-74cdcbc59c5956c1bd1ce3b01921fd4cd1c7376c.gz differ diff --git a/_darcs/patches/20080720025546-533db-7044949bfaa6676c86f3e1d84d20ecb85aab0937.gz b/_darcs/patches/20080720025546-533db-7044949bfaa6676c86f3e1d84d20ecb85aab0937.gz new file mode 100644 index 0000000000..bd27f403ba Binary files /dev/null and b/_darcs/patches/20080720025546-533db-7044949bfaa6676c86f3e1d84d20ecb85aab0937.gz differ diff --git a/_darcs/patches/20080720033236-533db-95f6a169f73e69549a8ff0eefb0e4c8ba21f090e.gz b/_darcs/patches/20080720033236-533db-95f6a169f73e69549a8ff0eefb0e4c8ba21f090e.gz new file mode 100644 index 0000000000..a7fe4d6ae3 Binary files /dev/null and b/_darcs/patches/20080720033236-533db-95f6a169f73e69549a8ff0eefb0e4c8ba21f090e.gz differ diff --git a/_darcs/patches/20080720033401-533db-05bf2c9ebe988ebda6a295447a958af66571a088.gz b/_darcs/patches/20080720033401-533db-05bf2c9ebe988ebda6a295447a958af66571a088.gz new file mode 100644 index 0000000000..68d0458b27 Binary files /dev/null and b/_darcs/patches/20080720033401-533db-05bf2c9ebe988ebda6a295447a958af66571a088.gz differ diff --git a/_darcs/patches/20080720040351-533db-a0924ce6cd6e472c7001a167ce36452adf99b038.gz b/_darcs/patches/20080720040351-533db-a0924ce6cd6e472c7001a167ce36452adf99b038.gz new file mode 100644 index 0000000000..a6078d8be5 Binary files /dev/null and b/_darcs/patches/20080720040351-533db-a0924ce6cd6e472c7001a167ce36452adf99b038.gz differ diff --git a/_darcs/patches/20080720044756-ca946-2e0823506b352d8364f84b77af644b8fc7f1a00d.gz b/_darcs/patches/20080720044756-ca946-2e0823506b352d8364f84b77af644b8fc7f1a00d.gz new file mode 100644 index 0000000000..eca468f515 Binary files /dev/null and b/_darcs/patches/20080720044756-ca946-2e0823506b352d8364f84b77af644b8fc7f1a00d.gz differ diff --git a/_darcs/patches/20080720053431-84dde-2a46f89bcb18ecbb2b151f5d86a98fb016c851dd.gz b/_darcs/patches/20080720053431-84dde-2a46f89bcb18ecbb2b151f5d86a98fb016c851dd.gz new file mode 100644 index 0000000000..1f540043ea Binary files /dev/null and b/_darcs/patches/20080720053431-84dde-2a46f89bcb18ecbb2b151f5d86a98fb016c851dd.gz differ diff --git a/_darcs/patches/20080720053458-84dde-1b1d4db642ef350d1f2c94f35ce7c685378bd9f5.gz b/_darcs/patches/20080720053458-84dde-1b1d4db642ef350d1f2c94f35ce7c685378bd9f5.gz new file mode 100644 index 0000000000..24855efc87 Binary files /dev/null and b/_darcs/patches/20080720053458-84dde-1b1d4db642ef350d1f2c94f35ce7c685378bd9f5.gz differ diff --git a/_darcs/patches/20080720055558-533db-781488916e178921f1bcd6ea141df10c1a0ace55.gz b/_darcs/patches/20080720055558-533db-781488916e178921f1bcd6ea141df10c1a0ace55.gz new file mode 100644 index 0000000000..9b5ee3249b Binary files /dev/null and b/_darcs/patches/20080720055558-533db-781488916e178921f1bcd6ea141df10c1a0ace55.gz differ diff --git a/_darcs/patches/20080720055702-533db-193ed842b0d0a952bef71a3c5287213ada0ef15c.gz b/_darcs/patches/20080720055702-533db-193ed842b0d0a952bef71a3c5287213ada0ef15c.gz new file mode 100644 index 0000000000..4554f11a9d Binary files /dev/null and b/_darcs/patches/20080720055702-533db-193ed842b0d0a952bef71a3c5287213ada0ef15c.gz differ diff --git a/_darcs/patches/20080720070905-ca946-dda57dd92210461361fd58b7a3244bf24c01e801.gz b/_darcs/patches/20080720070905-ca946-dda57dd92210461361fd58b7a3244bf24c01e801.gz new file mode 100644 index 0000000000..2f53a8474f Binary files /dev/null and b/_darcs/patches/20080720070905-ca946-dda57dd92210461361fd58b7a3244bf24c01e801.gz differ diff --git a/_darcs/patches/20080720080801-533db-ac529a873885e7142e6e0450479bf59aafb6c058.gz b/_darcs/patches/20080720080801-533db-ac529a873885e7142e6e0450479bf59aafb6c058.gz new file mode 100644 index 0000000000..b3d9318b0e Binary files /dev/null and b/_darcs/patches/20080720080801-533db-ac529a873885e7142e6e0450479bf59aafb6c058.gz differ diff --git a/_darcs/patches/20080720081021-533db-c5610ba4b0bb7f1999582ee4f9220ff2e5595949.gz b/_darcs/patches/20080720081021-533db-c5610ba4b0bb7f1999582ee4f9220ff2e5595949.gz new file mode 100644 index 0000000000..598ff75ac0 Binary files /dev/null and b/_darcs/patches/20080720081021-533db-c5610ba4b0bb7f1999582ee4f9220ff2e5595949.gz differ diff --git a/_darcs/patches/20080720081838-533db-bfe217657f0c3327fa8facc66b41b00f6c8f1948.gz b/_darcs/patches/20080720081838-533db-bfe217657f0c3327fa8facc66b41b00f6c8f1948.gz new file mode 100644 index 0000000000..7cec95c939 Binary files /dev/null and b/_darcs/patches/20080720081838-533db-bfe217657f0c3327fa8facc66b41b00f6c8f1948.gz differ diff --git a/_darcs/patches/20080720082641-533db-fa5b327a6670fd77f55cc028fc3a3a66664d4bb3.gz b/_darcs/patches/20080720082641-533db-fa5b327a6670fd77f55cc028fc3a3a66664d4bb3.gz new file mode 100644 index 0000000000..a4ae332c25 Binary files /dev/null and b/_darcs/patches/20080720082641-533db-fa5b327a6670fd77f55cc028fc3a3a66664d4bb3.gz differ diff --git a/_darcs/patches/20080720083428-ca946-c14a92345366f2105b3c452a3899714d89692daa.gz b/_darcs/patches/20080720083428-ca946-c14a92345366f2105b3c452a3899714d89692daa.gz new file mode 100644 index 0000000000..18532faf90 Binary files /dev/null and b/_darcs/patches/20080720083428-ca946-c14a92345366f2105b3c452a3899714d89692daa.gz differ diff --git a/_darcs/patches/20080720083948-ca946-14b4ef6a5fe387f1e147546be156fafb7d665275.gz b/_darcs/patches/20080720083948-ca946-14b4ef6a5fe387f1e147546be156fafb7d665275.gz new file mode 100644 index 0000000000..415638f8a8 Binary files /dev/null and b/_darcs/patches/20080720083948-ca946-14b4ef6a5fe387f1e147546be156fafb7d665275.gz differ diff --git a/_darcs/patches/20080720094832-533db-91b0cf2e0589ca4008b3011d5acd41449caa0904.gz b/_darcs/patches/20080720094832-533db-91b0cf2e0589ca4008b3011d5acd41449caa0904.gz new file mode 100644 index 0000000000..6bbfd4fe13 Binary files /dev/null and b/_darcs/patches/20080720094832-533db-91b0cf2e0589ca4008b3011d5acd41449caa0904.gz differ diff --git a/_darcs/patches/20080720094917-533db-386e12dbeabcfb9bc74cdce11e6bc197964929b7.gz b/_darcs/patches/20080720094917-533db-386e12dbeabcfb9bc74cdce11e6bc197964929b7.gz new file mode 100644 index 0000000000..8820dbda95 Binary files /dev/null and b/_darcs/patches/20080720094917-533db-386e12dbeabcfb9bc74cdce11e6bc197964929b7.gz differ diff --git a/_darcs/patches/20080720094954-533db-1096bf464e37a9c380afc15ac1b33b1f2f43cf91.gz b/_darcs/patches/20080720094954-533db-1096bf464e37a9c380afc15ac1b33b1f2f43cf91.gz new file mode 100644 index 0000000000..e3d908edf4 Binary files /dev/null and b/_darcs/patches/20080720094954-533db-1096bf464e37a9c380afc15ac1b33b1f2f43cf91.gz differ diff --git a/_darcs/patches/20080720095651-533db-fc0ab9f07e9d354c3b73a1f90bdc3224209651f2.gz b/_darcs/patches/20080720095651-533db-fc0ab9f07e9d354c3b73a1f90bdc3224209651f2.gz new file mode 100644 index 0000000000..ed666a8e12 Binary files /dev/null and b/_darcs/patches/20080720095651-533db-fc0ab9f07e9d354c3b73a1f90bdc3224209651f2.gz differ diff --git a/_darcs/patches/20080720100024-533db-d2b5b63f169b6e16e08e81c8da63b7f9f69e7521.gz b/_darcs/patches/20080720100024-533db-d2b5b63f169b6e16e08e81c8da63b7f9f69e7521.gz new file mode 100644 index 0000000000..79d4a4a1ff Binary files /dev/null and b/_darcs/patches/20080720100024-533db-d2b5b63f169b6e16e08e81c8da63b7f9f69e7521.gz differ diff --git a/_darcs/patches/20080720100253-533db-bc2605d57e265cfa4e38866b977c81302d4fb1c5.gz b/_darcs/patches/20080720100253-533db-bc2605d57e265cfa4e38866b977c81302d4fb1c5.gz new file mode 100644 index 0000000000..bb1550f2a0 Binary files /dev/null and b/_darcs/patches/20080720100253-533db-bc2605d57e265cfa4e38866b977c81302d4fb1c5.gz differ diff --git a/_darcs/patches/20080720101553-533db-3ebe6e3cd4b9e1b937df076b876bc3f9b826f476.gz b/_darcs/patches/20080720101553-533db-3ebe6e3cd4b9e1b937df076b876bc3f9b826f476.gz new file mode 100644 index 0000000000..27bacb3a0c Binary files /dev/null and b/_darcs/patches/20080720101553-533db-3ebe6e3cd4b9e1b937df076b876bc3f9b826f476.gz differ diff --git a/_darcs/patches/20080720101947-533db-a7ddbd4d33b492196cf9a4287dfbfa3e341d6f40.gz b/_darcs/patches/20080720101947-533db-a7ddbd4d33b492196cf9a4287dfbfa3e341d6f40.gz new file mode 100644 index 0000000000..7071105a4f Binary files /dev/null and b/_darcs/patches/20080720101947-533db-a7ddbd4d33b492196cf9a4287dfbfa3e341d6f40.gz differ diff --git a/_darcs/patches/20080720105659-533db-35a71fab668a7ea692f7b51557b4f84addb796bb.gz b/_darcs/patches/20080720105659-533db-35a71fab668a7ea692f7b51557b4f84addb796bb.gz new file mode 100644 index 0000000000..03a39a8623 Binary files /dev/null and b/_darcs/patches/20080720105659-533db-35a71fab668a7ea692f7b51557b4f84addb796bb.gz differ diff --git a/_darcs/patches/20080720112032-533db-e7bd1e7faaf3f1580b90faf425997de034f1a0cc.gz b/_darcs/patches/20080720112032-533db-e7bd1e7faaf3f1580b90faf425997de034f1a0cc.gz new file mode 100644 index 0000000000..1dc6f13fab Binary files /dev/null and b/_darcs/patches/20080720112032-533db-e7bd1e7faaf3f1580b90faf425997de034f1a0cc.gz differ diff --git a/_darcs/patches/20080720113458-533db-0b0c2736c464195476562fb52f5a5bb1591d3d82.gz b/_darcs/patches/20080720113458-533db-0b0c2736c464195476562fb52f5a5bb1591d3d82.gz new file mode 100644 index 0000000000..58f0935086 Binary files /dev/null and b/_darcs/patches/20080720113458-533db-0b0c2736c464195476562fb52f5a5bb1591d3d82.gz differ diff --git a/_darcs/patches/20080720122715-533db-64247879e336666835880cd3de10bc2ef27e46c7.gz b/_darcs/patches/20080720122715-533db-64247879e336666835880cd3de10bc2ef27e46c7.gz new file mode 100644 index 0000000000..e7e22d6fbf Binary files /dev/null and b/_darcs/patches/20080720122715-533db-64247879e336666835880cd3de10bc2ef27e46c7.gz differ diff --git a/_darcs/patches/20080720122832-533db-7fda43b257160b90788f0d860d50df995d463ee8.gz b/_darcs/patches/20080720122832-533db-7fda43b257160b90788f0d860d50df995d463ee8.gz new file mode 100644 index 0000000000..0ed1ef0388 Binary files /dev/null and b/_darcs/patches/20080720122832-533db-7fda43b257160b90788f0d860d50df995d463ee8.gz differ diff --git a/_darcs/patches/20080720124552-533db-81be2c04445f146e477b1bb7e6e8e7d0eb27431d.gz b/_darcs/patches/20080720124552-533db-81be2c04445f146e477b1bb7e6e8e7d0eb27431d.gz new file mode 100644 index 0000000000..27b7fd476b Binary files /dev/null and b/_darcs/patches/20080720124552-533db-81be2c04445f146e477b1bb7e6e8e7d0eb27431d.gz differ diff --git a/_darcs/patches/20080720141325-533db-87cb60501434c9dc0ac13716ba5d8b17754431f5.gz b/_darcs/patches/20080720141325-533db-87cb60501434c9dc0ac13716ba5d8b17754431f5.gz new file mode 100644 index 0000000000..b40102e48f Binary files /dev/null and b/_darcs/patches/20080720141325-533db-87cb60501434c9dc0ac13716ba5d8b17754431f5.gz differ diff --git a/_darcs/patches/20080720141543-533db-f9d9eb94cd9f770be5f912a838a7e5f462c04809.gz b/_darcs/patches/20080720141543-533db-f9d9eb94cd9f770be5f912a838a7e5f462c04809.gz new file mode 100644 index 0000000000..664bf58043 Binary files /dev/null and b/_darcs/patches/20080720141543-533db-f9d9eb94cd9f770be5f912a838a7e5f462c04809.gz differ diff --git a/_darcs/patches/20080720193005-84dde-97e098996309550dc98b658923d84620e7715c69.gz b/_darcs/patches/20080720193005-84dde-97e098996309550dc98b658923d84620e7715c69.gz new file mode 100644 index 0000000000..988c4eedbc Binary files /dev/null and b/_darcs/patches/20080720193005-84dde-97e098996309550dc98b658923d84620e7715c69.gz differ diff --git a/_darcs/patches/20080720193132-84dde-89bc231a00934484cbaf0d91d4336cc790db1a21.gz b/_darcs/patches/20080720193132-84dde-89bc231a00934484cbaf0d91d4336cc790db1a21.gz new file mode 100644 index 0000000000..e0d17b5d46 Binary files /dev/null and b/_darcs/patches/20080720193132-84dde-89bc231a00934484cbaf0d91d4336cc790db1a21.gz differ diff --git a/_darcs/patches/20080720193228-84dde-00e82ee00a1c94f6adb079ea3ac6affa5aad280c.gz b/_darcs/patches/20080720193228-84dde-00e82ee00a1c94f6adb079ea3ac6affa5aad280c.gz new file mode 100644 index 0000000000..f9e8881e1b Binary files /dev/null and b/_darcs/patches/20080720193228-84dde-00e82ee00a1c94f6adb079ea3ac6affa5aad280c.gz differ diff --git a/_darcs/patches/20080720193712-84dde-1b862531df5250752cd7046a2588fe39b24ece45.gz b/_darcs/patches/20080720193712-84dde-1b862531df5250752cd7046a2588fe39b24ece45.gz new file mode 100644 index 0000000000..5dcef10c5c Binary files /dev/null and b/_darcs/patches/20080720193712-84dde-1b862531df5250752cd7046a2588fe39b24ece45.gz differ diff --git a/_darcs/patches/20080720195505-982e4-3f03e6ab4c466ae131e025b6a3c26c7bb9a99c03.gz b/_darcs/patches/20080720195505-982e4-3f03e6ab4c466ae131e025b6a3c26c7bb9a99c03.gz new file mode 100644 index 0000000000..2afb85d543 Binary files /dev/null and b/_darcs/patches/20080720195505-982e4-3f03e6ab4c466ae131e025b6a3c26c7bb9a99c03.gz differ diff --git a/_darcs/patches/20080720195549-84dde-4193f27f8efda497fbe55f1c514fe30e4dd8a69d.gz b/_darcs/patches/20080720195549-84dde-4193f27f8efda497fbe55f1c514fe30e4dd8a69d.gz new file mode 100644 index 0000000000..129fde984d Binary files /dev/null and b/_darcs/patches/20080720195549-84dde-4193f27f8efda497fbe55f1c514fe30e4dd8a69d.gz differ diff --git a/_darcs/patches/20080720195834-84dde-3183d0cc0b93777649c03b2ded962af16ffd9bab.gz b/_darcs/patches/20080720195834-84dde-3183d0cc0b93777649c03b2ded962af16ffd9bab.gz new file mode 100644 index 0000000000..a29b263f06 Binary files /dev/null and b/_darcs/patches/20080720195834-84dde-3183d0cc0b93777649c03b2ded962af16ffd9bab.gz differ diff --git a/_darcs/patches/20080720200039-84dde-62412804de2802de9f032bd4e00c8e32373d56a8.gz b/_darcs/patches/20080720200039-84dde-62412804de2802de9f032bd4e00c8e32373d56a8.gz new file mode 100644 index 0000000000..b53738630c Binary files /dev/null and b/_darcs/patches/20080720200039-84dde-62412804de2802de9f032bd4e00c8e32373d56a8.gz differ diff --git a/_darcs/patches/20080720200530-84dde-dade3117bdf510c1880d35f27bd9352995725175.gz b/_darcs/patches/20080720200530-84dde-dade3117bdf510c1880d35f27bd9352995725175.gz new file mode 100644 index 0000000000..cfa99589c8 Binary files /dev/null and b/_darcs/patches/20080720200530-84dde-dade3117bdf510c1880d35f27bd9352995725175.gz differ diff --git a/_darcs/patches/20080720201620-84dde-f782e01bdf7f267b3b02e20e851aa7b643ed8590.gz b/_darcs/patches/20080720201620-84dde-f782e01bdf7f267b3b02e20e851aa7b643ed8590.gz new file mode 100644 index 0000000000..4f2861990a Binary files /dev/null and b/_darcs/patches/20080720201620-84dde-f782e01bdf7f267b3b02e20e851aa7b643ed8590.gz differ diff --git a/_darcs/patches/20080720202705-84dde-da40ebc8bcb9bd438e891c5a103211ebd67fd2c7.gz b/_darcs/patches/20080720202705-84dde-da40ebc8bcb9bd438e891c5a103211ebd67fd2c7.gz new file mode 100644 index 0000000000..5154328d95 Binary files /dev/null and b/_darcs/patches/20080720202705-84dde-da40ebc8bcb9bd438e891c5a103211ebd67fd2c7.gz differ diff --git a/_darcs/patches/20080720202832-84dde-918fb1d27d1dd1f06e3bceeb5217c136e6d78ac5.gz b/_darcs/patches/20080720202832-84dde-918fb1d27d1dd1f06e3bceeb5217c136e6d78ac5.gz new file mode 100644 index 0000000000..5f611ef8c9 Binary files /dev/null and b/_darcs/patches/20080720202832-84dde-918fb1d27d1dd1f06e3bceeb5217c136e6d78ac5.gz differ diff --git a/_darcs/patches/20080720233308-84dde-f9de49360dd366690bd6e3bb55cb5fe632dd7298.gz b/_darcs/patches/20080720233308-84dde-f9de49360dd366690bd6e3bb55cb5fe632dd7298.gz new file mode 100644 index 0000000000..ce255ec23a Binary files /dev/null and b/_darcs/patches/20080720233308-84dde-f9de49360dd366690bd6e3bb55cb5fe632dd7298.gz differ diff --git a/_darcs/patches/20080720233712-84dde-dda5de6fec9d1d48f61139c1cce8a6e8aa2e0055.gz b/_darcs/patches/20080720233712-84dde-dda5de6fec9d1d48f61139c1cce8a6e8aa2e0055.gz new file mode 100644 index 0000000000..0507ae4e8a Binary files /dev/null and b/_darcs/patches/20080720233712-84dde-dda5de6fec9d1d48f61139c1cce8a6e8aa2e0055.gz differ diff --git a/_darcs/patches/20080721011128-84dde-0b3af6237c2c07bf7f573d9e609c19e6538c2859.gz b/_darcs/patches/20080721011128-84dde-0b3af6237c2c07bf7f573d9e609c19e6538c2859.gz new file mode 100644 index 0000000000..9cec3af153 Binary files /dev/null and b/_darcs/patches/20080721011128-84dde-0b3af6237c2c07bf7f573d9e609c19e6538c2859.gz differ diff --git a/_darcs/patches/20080721012301-84dde-b4848c9336562042268abb3373d5c60babdc4e7b.gz b/_darcs/patches/20080721012301-84dde-b4848c9336562042268abb3373d5c60babdc4e7b.gz new file mode 100644 index 0000000000..925a847166 Binary files /dev/null and b/_darcs/patches/20080721012301-84dde-b4848c9336562042268abb3373d5c60babdc4e7b.gz differ diff --git a/_darcs/patches/20080721012405-84dde-f320413d02473f2a1ee6c64ade0357fa6d089ee3.gz b/_darcs/patches/20080721012405-84dde-f320413d02473f2a1ee6c64ade0357fa6d089ee3.gz new file mode 100644 index 0000000000..d440b0153e Binary files /dev/null and b/_darcs/patches/20080721012405-84dde-f320413d02473f2a1ee6c64ade0357fa6d089ee3.gz differ diff --git a/_darcs/patches/20080721035853-84dde-5c95b6b06a2f82b9f9170bd02bc3fd5a1bdb231b.gz b/_darcs/patches/20080721035853-84dde-5c95b6b06a2f82b9f9170bd02bc3fd5a1bdb231b.gz new file mode 100644 index 0000000000..8607486be7 Binary files /dev/null and b/_darcs/patches/20080721035853-84dde-5c95b6b06a2f82b9f9170bd02bc3fd5a1bdb231b.gz differ diff --git a/_darcs/patches/20080721035919-84dde-e06f9094902522d2cd0ad71d65d565293f19db4a.gz b/_darcs/patches/20080721035919-84dde-e06f9094902522d2cd0ad71d65d565293f19db4a.gz new file mode 100644 index 0000000000..f9358cca48 Binary files /dev/null and b/_darcs/patches/20080721035919-84dde-e06f9094902522d2cd0ad71d65d565293f19db4a.gz differ diff --git a/_darcs/patches/20080721040551-84dde-f6c76d806969ccaa772da31235baaf7d9b065c15.gz b/_darcs/patches/20080721040551-84dde-f6c76d806969ccaa772da31235baaf7d9b065c15.gz new file mode 100644 index 0000000000..1c565d0d66 Binary files /dev/null and b/_darcs/patches/20080721040551-84dde-f6c76d806969ccaa772da31235baaf7d9b065c15.gz differ diff --git a/_darcs/patches/20080721040614-84dde-431def35d4e3c163df2b4f4e78bef7b3521be40a.gz b/_darcs/patches/20080721040614-84dde-431def35d4e3c163df2b4f4e78bef7b3521be40a.gz new file mode 100644 index 0000000000..f7b4c8953c Binary files /dev/null and b/_darcs/patches/20080721040614-84dde-431def35d4e3c163df2b4f4e78bef7b3521be40a.gz differ diff --git a/_darcs/patches/20080721042302-84dde-b077675affa13a761ba07b4c5ac4ff667cf00eb2.gz b/_darcs/patches/20080721042302-84dde-b077675affa13a761ba07b4c5ac4ff667cf00eb2.gz new file mode 100644 index 0000000000..de143a1be2 Binary files /dev/null and b/_darcs/patches/20080721042302-84dde-b077675affa13a761ba07b4c5ac4ff667cf00eb2.gz differ diff --git a/_darcs/patches/20080721042333-84dde-f3331569171b33f16322bd6b2999a21cefb718c0.gz b/_darcs/patches/20080721042333-84dde-f3331569171b33f16322bd6b2999a21cefb718c0.gz new file mode 100644 index 0000000000..96155b0008 Binary files /dev/null and b/_darcs/patches/20080721042333-84dde-f3331569171b33f16322bd6b2999a21cefb718c0.gz differ diff --git a/_darcs/patches/20080721043734-84dde-de49b283d468334abd4ee4375042b7f2d003823c.gz b/_darcs/patches/20080721043734-84dde-de49b283d468334abd4ee4375042b7f2d003823c.gz new file mode 100644 index 0000000000..496e6492e0 Binary files /dev/null and b/_darcs/patches/20080721043734-84dde-de49b283d468334abd4ee4375042b7f2d003823c.gz differ diff --git a/_darcs/patches/20080721044015-84dde-e933bf93ff744cfa25d0aaa496002d3b8857d250.gz b/_darcs/patches/20080721044015-84dde-e933bf93ff744cfa25d0aaa496002d3b8857d250.gz new file mode 100644 index 0000000000..d0dd8ff56b Binary files /dev/null and b/_darcs/patches/20080721044015-84dde-e933bf93ff744cfa25d0aaa496002d3b8857d250.gz differ diff --git a/_darcs/patches/20080721044135-84dde-6af27ed89647ca276750024b32b5004fa104c037.gz b/_darcs/patches/20080721044135-84dde-6af27ed89647ca276750024b32b5004fa104c037.gz new file mode 100644 index 0000000000..ce76889638 Binary files /dev/null and b/_darcs/patches/20080721044135-84dde-6af27ed89647ca276750024b32b5004fa104c037.gz differ diff --git a/_darcs/patches/20080721044604-84dde-c3e920bd56992c4e6a77625767b4599bacc74434.gz b/_darcs/patches/20080721044604-84dde-c3e920bd56992c4e6a77625767b4599bacc74434.gz new file mode 100644 index 0000000000..f805308a16 Binary files /dev/null and b/_darcs/patches/20080721044604-84dde-c3e920bd56992c4e6a77625767b4599bacc74434.gz differ diff --git a/_darcs/patches/20080721045119-84dde-fc65941017d3731ec925e4a410c52f756e91d507.gz b/_darcs/patches/20080721045119-84dde-fc65941017d3731ec925e4a410c52f756e91d507.gz new file mode 100644 index 0000000000..29abc7dbf1 Binary files /dev/null and b/_darcs/patches/20080721045119-84dde-fc65941017d3731ec925e4a410c52f756e91d507.gz differ diff --git a/_darcs/patches/20080721050508-84dde-5e6d8121b403e9b81f8f46a2f5c7de5908b9593a.gz b/_darcs/patches/20080721050508-84dde-5e6d8121b403e9b81f8f46a2f5c7de5908b9593a.gz new file mode 100644 index 0000000000..bedf9f3485 Binary files /dev/null and b/_darcs/patches/20080721050508-84dde-5e6d8121b403e9b81f8f46a2f5c7de5908b9593a.gz differ diff --git a/_darcs/patches/20080721083758-84dde-76534893df215e9754c00c1e0a6d6351f64f1818.gz b/_darcs/patches/20080721083758-84dde-76534893df215e9754c00c1e0a6d6351f64f1818.gz new file mode 100644 index 0000000000..6a4f831602 Binary files /dev/null and b/_darcs/patches/20080721083758-84dde-76534893df215e9754c00c1e0a6d6351f64f1818.gz differ diff --git a/_darcs/patches/20080721084801-84dde-ea8722deb8760cc9f7f83766e4e6167a338f5742.gz b/_darcs/patches/20080721084801-84dde-ea8722deb8760cc9f7f83766e4e6167a338f5742.gz new file mode 100644 index 0000000000..645d99afba Binary files /dev/null and b/_darcs/patches/20080721084801-84dde-ea8722deb8760cc9f7f83766e4e6167a338f5742.gz differ diff --git a/_darcs/patches/20080721085641-84dde-9b29902977f78714188ba5fe8c37b4d603c3c63b.gz b/_darcs/patches/20080721085641-84dde-9b29902977f78714188ba5fe8c37b4d603c3c63b.gz new file mode 100644 index 0000000000..64a8aeae11 Binary files /dev/null and b/_darcs/patches/20080721085641-84dde-9b29902977f78714188ba5fe8c37b4d603c3c63b.gz differ diff --git a/_darcs/patches/20080721090110-edabd-aea47e1cbcc2527fdb0274cb29638d2abc108a35.gz b/_darcs/patches/20080721090110-edabd-aea47e1cbcc2527fdb0274cb29638d2abc108a35.gz new file mode 100644 index 0000000000..65cc0bc707 Binary files /dev/null and b/_darcs/patches/20080721090110-edabd-aea47e1cbcc2527fdb0274cb29638d2abc108a35.gz differ diff --git a/_darcs/patches/20080721090819-84dde-34f1d1a0c448296e124c172d234976fd5cdad32c.gz b/_darcs/patches/20080721090819-84dde-34f1d1a0c448296e124c172d234976fd5cdad32c.gz new file mode 100644 index 0000000000..aec11c1353 Binary files /dev/null and b/_darcs/patches/20080721090819-84dde-34f1d1a0c448296e124c172d234976fd5cdad32c.gz differ diff --git a/_darcs/patches/20080721091702-ca946-e114030e33e4e1237006c7e64d8a0de8f8d9e7fc.gz b/_darcs/patches/20080721091702-ca946-e114030e33e4e1237006c7e64d8a0de8f8d9e7fc.gz new file mode 100644 index 0000000000..894dc24758 Binary files /dev/null and b/_darcs/patches/20080721091702-ca946-e114030e33e4e1237006c7e64d8a0de8f8d9e7fc.gz differ diff --git a/_darcs/patches/20080721091854-84dde-98b2bc313f23694a92c6f3ce92fd8f6beafe01fd.gz b/_darcs/patches/20080721091854-84dde-98b2bc313f23694a92c6f3ce92fd8f6beafe01fd.gz new file mode 100644 index 0000000000..1ff8ac4095 Binary files /dev/null and b/_darcs/patches/20080721091854-84dde-98b2bc313f23694a92c6f3ce92fd8f6beafe01fd.gz differ diff --git a/_darcs/patches/20080721092813-84dde-ac19bbdd85bbf796ecf8ffbc8c0cb05d0d1667ab.gz b/_darcs/patches/20080721092813-84dde-ac19bbdd85bbf796ecf8ffbc8c0cb05d0d1667ab.gz new file mode 100644 index 0000000000..875b2d351c Binary files /dev/null and b/_darcs/patches/20080721092813-84dde-ac19bbdd85bbf796ecf8ffbc8c0cb05d0d1667ab.gz differ diff --git a/_darcs/patches/20080721093401-84dde-6c370b1901ea3f548bec0d7e69cf21e63c3ade97.gz b/_darcs/patches/20080721093401-84dde-6c370b1901ea3f548bec0d7e69cf21e63c3ade97.gz new file mode 100644 index 0000000000..a5d1d394c0 Binary files /dev/null and b/_darcs/patches/20080721093401-84dde-6c370b1901ea3f548bec0d7e69cf21e63c3ade97.gz differ diff --git a/_darcs/patches/20080721093457-84dde-b9c735bef0d279b92e23743a5d96bcaa6b7f8444.gz b/_darcs/patches/20080721093457-84dde-b9c735bef0d279b92e23743a5d96bcaa6b7f8444.gz new file mode 100644 index 0000000000..14c35fec29 Binary files /dev/null and b/_darcs/patches/20080721093457-84dde-b9c735bef0d279b92e23743a5d96bcaa6b7f8444.gz differ diff --git a/_darcs/patches/20080721120036-edabd-838335c0e23c80a657d353955b25b52a9a8624b2.gz b/_darcs/patches/20080721120036-edabd-838335c0e23c80a657d353955b25b52a9a8624b2.gz new file mode 100644 index 0000000000..af756197d5 Binary files /dev/null and b/_darcs/patches/20080721120036-edabd-838335c0e23c80a657d353955b25b52a9a8624b2.gz differ diff --git a/_darcs/patches/20080721123243-533db-bf3664c2cb9d2cd37c633e13ab918994c57d01a0.gz b/_darcs/patches/20080721123243-533db-bf3664c2cb9d2cd37c633e13ab918994c57d01a0.gz new file mode 100644 index 0000000000..b7e32b5236 Binary files /dev/null and b/_darcs/patches/20080721123243-533db-bf3664c2cb9d2cd37c633e13ab918994c57d01a0.gz differ diff --git a/_darcs/patches/20080721123519-533db-d3977a69493f5a57e202c80fd6ecaa2445d111d7.gz b/_darcs/patches/20080721123519-533db-d3977a69493f5a57e202c80fd6ecaa2445d111d7.gz new file mode 100644 index 0000000000..e2ea92aeda Binary files /dev/null and b/_darcs/patches/20080721123519-533db-d3977a69493f5a57e202c80fd6ecaa2445d111d7.gz differ diff --git a/_darcs/patches/20080721133337-84dde-ab0bb78d0dcb1c2d45c0dcc56f3b470ab55efb45.gz b/_darcs/patches/20080721133337-84dde-ab0bb78d0dcb1c2d45c0dcc56f3b470ab55efb45.gz new file mode 100644 index 0000000000..34c2577e1a Binary files /dev/null and b/_darcs/patches/20080721133337-84dde-ab0bb78d0dcb1c2d45c0dcc56f3b470ab55efb45.gz differ diff --git a/_darcs/patches/20080721135637-edabd-cca33bc0a0936423b9fd2ffdf9413236123d680e.gz b/_darcs/patches/20080721135637-edabd-cca33bc0a0936423b9fd2ffdf9413236123d680e.gz new file mode 100644 index 0000000000..97aca2356c Binary files /dev/null and b/_darcs/patches/20080721135637-edabd-cca33bc0a0936423b9fd2ffdf9413236123d680e.gz differ diff --git a/_darcs/patches/20080721162434-84dde-1302ff7dc970e663fc21b336b3da821793b62d86.gz b/_darcs/patches/20080721162434-84dde-1302ff7dc970e663fc21b336b3da821793b62d86.gz new file mode 100644 index 0000000000..c71b2a5f0a Binary files /dev/null and b/_darcs/patches/20080721162434-84dde-1302ff7dc970e663fc21b336b3da821793b62d86.gz differ diff --git a/_darcs/patches/20080721162857-84dde-50f206d20718ddb9805961da2dd2daaea8fc2f8d.gz b/_darcs/patches/20080721162857-84dde-50f206d20718ddb9805961da2dd2daaea8fc2f8d.gz new file mode 100644 index 0000000000..840917585d Binary files /dev/null and b/_darcs/patches/20080721162857-84dde-50f206d20718ddb9805961da2dd2daaea8fc2f8d.gz differ diff --git a/_darcs/patches/20080721174438-ca946-1f1ddc79f8117561e98a17b143714f5daae1283e.gz b/_darcs/patches/20080721174438-ca946-1f1ddc79f8117561e98a17b143714f5daae1283e.gz new file mode 100644 index 0000000000..683337d586 Binary files /dev/null and b/_darcs/patches/20080721174438-ca946-1f1ddc79f8117561e98a17b143714f5daae1283e.gz differ diff --git a/_darcs/patches/20080722064607-533db-c902d49bc97b74064e5a7ca2b91c4577f5256fbd.gz b/_darcs/patches/20080722064607-533db-c902d49bc97b74064e5a7ca2b91c4577f5256fbd.gz new file mode 100644 index 0000000000..d1e406231f Binary files /dev/null and b/_darcs/patches/20080722064607-533db-c902d49bc97b74064e5a7ca2b91c4577f5256fbd.gz differ diff --git a/_darcs/patches/20080722082526-533db-7405614141475c597847d2eab6b6b96231254ed4.gz b/_darcs/patches/20080722082526-533db-7405614141475c597847d2eab6b6b96231254ed4.gz new file mode 100644 index 0000000000..d5b654c882 Binary files /dev/null and b/_darcs/patches/20080722082526-533db-7405614141475c597847d2eab6b6b96231254ed4.gz differ diff --git a/_darcs/patches/20080722082653-533db-14e277869986f0c4f0df0f84eec9c5d39626956d.gz b/_darcs/patches/20080722082653-533db-14e277869986f0c4f0df0f84eec9c5d39626956d.gz new file mode 100644 index 0000000000..cc6fc0387e Binary files /dev/null and b/_darcs/patches/20080722082653-533db-14e277869986f0c4f0df0f84eec9c5d39626956d.gz differ diff --git a/_darcs/patches/20080722082724-533db-ead12f037aa716dc548d6a4b04493ada5049ec96.gz b/_darcs/patches/20080722082724-533db-ead12f037aa716dc548d6a4b04493ada5049ec96.gz new file mode 100644 index 0000000000..3b55d8c43a Binary files /dev/null and b/_darcs/patches/20080722082724-533db-ead12f037aa716dc548d6a4b04493ada5049ec96.gz differ diff --git a/_darcs/patches/20080722082840-533db-6df7b1fe05bbcaef6862d3e9b5ee3bcd277523e7.gz b/_darcs/patches/20080722082840-533db-6df7b1fe05bbcaef6862d3e9b5ee3bcd277523e7.gz new file mode 100644 index 0000000000..9a31009afc Binary files /dev/null and b/_darcs/patches/20080722082840-533db-6df7b1fe05bbcaef6862d3e9b5ee3bcd277523e7.gz differ diff --git a/_darcs/patches/20080722100828-533db-4a2b61a204b2e7c7696e839c43f09c6974d49d91.gz b/_darcs/patches/20080722100828-533db-4a2b61a204b2e7c7696e839c43f09c6974d49d91.gz new file mode 100644 index 0000000000..9941f105fe Binary files /dev/null and b/_darcs/patches/20080722100828-533db-4a2b61a204b2e7c7696e839c43f09c6974d49d91.gz differ diff --git a/_darcs/patches/20080722141614-84dde-b80c6945fdb90a5f67acaba65a1e4c2b306b1f8e.gz b/_darcs/patches/20080722141614-84dde-b80c6945fdb90a5f67acaba65a1e4c2b306b1f8e.gz new file mode 100644 index 0000000000..147a96566f Binary files /dev/null and b/_darcs/patches/20080722141614-84dde-b80c6945fdb90a5f67acaba65a1e4c2b306b1f8e.gz differ diff --git a/_darcs/patches/20080722141828-84dde-160fe4582c1949af1f6b049b3336cad493e30510.gz b/_darcs/patches/20080722141828-84dde-160fe4582c1949af1f6b049b3336cad493e30510.gz new file mode 100644 index 0000000000..3cad891c60 Binary files /dev/null and b/_darcs/patches/20080722141828-84dde-160fe4582c1949af1f6b049b3336cad493e30510.gz differ diff --git a/_darcs/patches/20080722142050-84dde-b948048b7f85e24c59dc063ef298bcc4c386d33a.gz b/_darcs/patches/20080722142050-84dde-b948048b7f85e24c59dc063ef298bcc4c386d33a.gz new file mode 100644 index 0000000000..d6a3a81bca Binary files /dev/null and b/_darcs/patches/20080722142050-84dde-b948048b7f85e24c59dc063ef298bcc4c386d33a.gz differ diff --git a/_darcs/patches/20080722144154-84dde-80beabad9a681f2e12edb34ceb4ac249f4ce6705.gz b/_darcs/patches/20080722144154-84dde-80beabad9a681f2e12edb34ceb4ac249f4ce6705.gz new file mode 100644 index 0000000000..954f0d812d Binary files /dev/null and b/_darcs/patches/20080722144154-84dde-80beabad9a681f2e12edb34ceb4ac249f4ce6705.gz differ diff --git a/_darcs/patches/20080722160213-84dde-2e466b9cc4601a8cb7237770a7df17a2f9dcadb9.gz b/_darcs/patches/20080722160213-84dde-2e466b9cc4601a8cb7237770a7df17a2f9dcadb9.gz new file mode 100644 index 0000000000..4c6aaf034a Binary files /dev/null and b/_darcs/patches/20080722160213-84dde-2e466b9cc4601a8cb7237770a7df17a2f9dcadb9.gz differ diff --git a/_darcs/patches/20080722161549-84dde-fedeed101bdef172f4a7aabf2278f1a2277a6d88.gz b/_darcs/patches/20080722161549-84dde-fedeed101bdef172f4a7aabf2278f1a2277a6d88.gz new file mode 100644 index 0000000000..6aa50763dd Binary files /dev/null and b/_darcs/patches/20080722161549-84dde-fedeed101bdef172f4a7aabf2278f1a2277a6d88.gz differ diff --git a/_darcs/patches/20080722161712-84dde-58d69d8861ad6be471ab2403cd5d23942c27eac6.gz b/_darcs/patches/20080722161712-84dde-58d69d8861ad6be471ab2403cd5d23942c27eac6.gz new file mode 100644 index 0000000000..8521d21d7e Binary files /dev/null and b/_darcs/patches/20080722161712-84dde-58d69d8861ad6be471ab2403cd5d23942c27eac6.gz differ diff --git a/_darcs/patches/20080722161752-84dde-aaf5762ef3d376f0e8f335ff8f7811e3162d33fb.gz b/_darcs/patches/20080722161752-84dde-aaf5762ef3d376f0e8f335ff8f7811e3162d33fb.gz new file mode 100644 index 0000000000..7bde5b73d4 Binary files /dev/null and b/_darcs/patches/20080722161752-84dde-aaf5762ef3d376f0e8f335ff8f7811e3162d33fb.gz differ diff --git a/_darcs/patches/20080722162332-84dde-75801a271f50789377aa7a3467223286c372ec6c.gz b/_darcs/patches/20080722162332-84dde-75801a271f50789377aa7a3467223286c372ec6c.gz new file mode 100644 index 0000000000..324a0cbf94 Binary files /dev/null and b/_darcs/patches/20080722162332-84dde-75801a271f50789377aa7a3467223286c372ec6c.gz differ diff --git a/_darcs/patches/20080722163116-84dde-3b17b13022b3d97483e911a99ebd23cc4b8da784.gz b/_darcs/patches/20080722163116-84dde-3b17b13022b3d97483e911a99ebd23cc4b8da784.gz new file mode 100644 index 0000000000..ee945c4f88 Binary files /dev/null and b/_darcs/patches/20080722163116-84dde-3b17b13022b3d97483e911a99ebd23cc4b8da784.gz differ diff --git a/_darcs/patches/20080722163200-84dde-736d11972503a37c062fe51c38c58eaf38a11862.gz b/_darcs/patches/20080722163200-84dde-736d11972503a37c062fe51c38c58eaf38a11862.gz new file mode 100644 index 0000000000..9e85ae75c9 Binary files /dev/null and b/_darcs/patches/20080722163200-84dde-736d11972503a37c062fe51c38c58eaf38a11862.gz differ diff --git a/_darcs/patches/20080722163511-84dde-3ac60595640e545335cc13d120f3e99ba5d1f513.gz b/_darcs/patches/20080722163511-84dde-3ac60595640e545335cc13d120f3e99ba5d1f513.gz new file mode 100644 index 0000000000..de09a70f9c Binary files /dev/null and b/_darcs/patches/20080722163511-84dde-3ac60595640e545335cc13d120f3e99ba5d1f513.gz differ diff --git a/_darcs/patches/20080722163618-84dde-5a519a92a84bb94de225fbb3da61af51cfdfdef4.gz b/_darcs/patches/20080722163618-84dde-5a519a92a84bb94de225fbb3da61af51cfdfdef4.gz new file mode 100644 index 0000000000..7ba6cd857d Binary files /dev/null and b/_darcs/patches/20080722163618-84dde-5a519a92a84bb94de225fbb3da61af51cfdfdef4.gz differ diff --git a/_darcs/patches/20080722164129-84dde-be64fd4d2fff5951f2d182e44ec1eb457bddd51c.gz b/_darcs/patches/20080722164129-84dde-be64fd4d2fff5951f2d182e44ec1eb457bddd51c.gz new file mode 100644 index 0000000000..6d4f9fa4c9 Binary files /dev/null and b/_darcs/patches/20080722164129-84dde-be64fd4d2fff5951f2d182e44ec1eb457bddd51c.gz differ diff --git a/_darcs/patches/20080722164639-84dde-19c6300516443862da016120cf9eed40e5972b6d.gz b/_darcs/patches/20080722164639-84dde-19c6300516443862da016120cf9eed40e5972b6d.gz new file mode 100644 index 0000000000..60ee0d4d56 Binary files /dev/null and b/_darcs/patches/20080722164639-84dde-19c6300516443862da016120cf9eed40e5972b6d.gz differ diff --git a/_darcs/patches/20080722171501-ca946-160bad6c4f80be2b3b105ea9b913f1c0f9edb0ef.gz b/_darcs/patches/20080722171501-ca946-160bad6c4f80be2b3b105ea9b913f1c0f9edb0ef.gz new file mode 100644 index 0000000000..2759dcd98f Binary files /dev/null and b/_darcs/patches/20080722171501-ca946-160bad6c4f80be2b3b105ea9b913f1c0f9edb0ef.gz differ diff --git a/_darcs/patches/20080722173613-84dde-f074a753a46f36e4e174ea85b66c472d436efd62.gz b/_darcs/patches/20080722173613-84dde-f074a753a46f36e4e174ea85b66c472d436efd62.gz new file mode 100644 index 0000000000..8c10609655 Binary files /dev/null and b/_darcs/patches/20080722173613-84dde-f074a753a46f36e4e174ea85b66c472d436efd62.gz differ diff --git a/_darcs/patches/20080722182919-ca946-dce04d84290711066154567458da2dd3253dd957.gz b/_darcs/patches/20080722182919-ca946-dce04d84290711066154567458da2dd3253dd957.gz new file mode 100644 index 0000000000..3ea78dc82d Binary files /dev/null and b/_darcs/patches/20080722182919-ca946-dce04d84290711066154567458da2dd3253dd957.gz differ diff --git a/_darcs/patches/20080722205315-533db-7ebf783855b8f1b302c52ec431b4025ef0983c82.gz b/_darcs/patches/20080722205315-533db-7ebf783855b8f1b302c52ec431b4025ef0983c82.gz new file mode 100644 index 0000000000..78522e1cdd Binary files /dev/null and b/_darcs/patches/20080722205315-533db-7ebf783855b8f1b302c52ec431b4025ef0983c82.gz differ diff --git a/_darcs/patches/20080722205335-533db-d7b4a6c727305cffedc443b5bfa15779a685d03a.gz b/_darcs/patches/20080722205335-533db-d7b4a6c727305cffedc443b5bfa15779a685d03a.gz new file mode 100644 index 0000000000..69fe76ef6a Binary files /dev/null and b/_darcs/patches/20080722205335-533db-d7b4a6c727305cffedc443b5bfa15779a685d03a.gz differ diff --git a/_darcs/patches/20080722212056-ca946-e4bd9eef8e3d8991414932e9fc7b8c9a31f818c0.gz b/_darcs/patches/20080722212056-ca946-e4bd9eef8e3d8991414932e9fc7b8c9a31f818c0.gz new file mode 100644 index 0000000000..9f96c8a722 Binary files /dev/null and b/_darcs/patches/20080722212056-ca946-e4bd9eef8e3d8991414932e9fc7b8c9a31f818c0.gz differ diff --git a/_darcs/patches/20080724171213-84dde-4668d0e57ce1766da7df22a5372aa94466b2fae5.gz b/_darcs/patches/20080724171213-84dde-4668d0e57ce1766da7df22a5372aa94466b2fae5.gz new file mode 100644 index 0000000000..d9758a85c1 Binary files /dev/null and b/_darcs/patches/20080724171213-84dde-4668d0e57ce1766da7df22a5372aa94466b2fae5.gz differ diff --git a/_darcs/patches/20080724205456-84dde-855e907d68c9548e99efe1068b5a53733e5555bf.gz b/_darcs/patches/20080724205456-84dde-855e907d68c9548e99efe1068b5a53733e5555bf.gz new file mode 100644 index 0000000000..3422399018 Binary files /dev/null and b/_darcs/patches/20080724205456-84dde-855e907d68c9548e99efe1068b5a53733e5555bf.gz differ diff --git a/_darcs/patches/20080724231833-84dde-965c41484ecf9b85b1979e8ac76314a6b0d951ee.gz b/_darcs/patches/20080724231833-84dde-965c41484ecf9b85b1979e8ac76314a6b0d951ee.gz new file mode 100644 index 0000000000..5b042d78fa Binary files /dev/null and b/_darcs/patches/20080724231833-84dde-965c41484ecf9b85b1979e8ac76314a6b0d951ee.gz differ diff --git a/_darcs/patches/20080724234533-533db-ec2e235401e7f670ee8094ba8d70dc95c3e6dd63.gz b/_darcs/patches/20080724234533-533db-ec2e235401e7f670ee8094ba8d70dc95c3e6dd63.gz new file mode 100644 index 0000000000..256de7b818 Binary files /dev/null and b/_darcs/patches/20080724234533-533db-ec2e235401e7f670ee8094ba8d70dc95c3e6dd63.gz differ diff --git a/_darcs/patches/20080724234601-533db-c9fe139144a5ec9f58b8ab612331fa31bd55967b.gz b/_darcs/patches/20080724234601-533db-c9fe139144a5ec9f58b8ab612331fa31bd55967b.gz new file mode 100644 index 0000000000..ce25d94aee Binary files /dev/null and b/_darcs/patches/20080724234601-533db-c9fe139144a5ec9f58b8ab612331fa31bd55967b.gz differ diff --git a/_darcs/patches/20080724234619-533db-015a2751ade3b5b8befb8a735fe89acd4742c4b9.gz b/_darcs/patches/20080724234619-533db-015a2751ade3b5b8befb8a735fe89acd4742c4b9.gz new file mode 100644 index 0000000000..58fb0ba0d3 Binary files /dev/null and b/_darcs/patches/20080724234619-533db-015a2751ade3b5b8befb8a735fe89acd4742c4b9.gz differ diff --git a/_darcs/patches/20080724234701-533db-ceab005e4c418a62d49af04e7835e963b67b03e0.gz b/_darcs/patches/20080724234701-533db-ceab005e4c418a62d49af04e7835e963b67b03e0.gz new file mode 100644 index 0000000000..09fdd50ca1 Binary files /dev/null and b/_darcs/patches/20080724234701-533db-ceab005e4c418a62d49af04e7835e963b67b03e0.gz differ diff --git a/_darcs/patches/20080724235508-84dde-8bac4d9dd772adb9f27d083b3d0b6ed5b7526dbf.gz b/_darcs/patches/20080724235508-84dde-8bac4d9dd772adb9f27d083b3d0b6ed5b7526dbf.gz new file mode 100644 index 0000000000..cdf5715f0a Binary files /dev/null and b/_darcs/patches/20080724235508-84dde-8bac4d9dd772adb9f27d083b3d0b6ed5b7526dbf.gz differ diff --git a/_darcs/patches/20080724235804-84dde-daf159e938289ad2d593d3825ce845bcbecac053.gz b/_darcs/patches/20080724235804-84dde-daf159e938289ad2d593d3825ce845bcbecac053.gz new file mode 100644 index 0000000000..ecdd1399ef Binary files /dev/null and b/_darcs/patches/20080724235804-84dde-daf159e938289ad2d593d3825ce845bcbecac053.gz differ diff --git a/_darcs/patches/20080726033958-84dde-09d117b3e5bb997ddfd6548806ce7a51a38434e7.gz b/_darcs/patches/20080726033958-84dde-09d117b3e5bb997ddfd6548806ce7a51a38434e7.gz new file mode 100644 index 0000000000..e93a567a5a Binary files /dev/null and b/_darcs/patches/20080726033958-84dde-09d117b3e5bb997ddfd6548806ce7a51a38434e7.gz differ diff --git a/_darcs/patches/20080726034209-84dde-02b25960aeb361319f8037b17aed6290d477cf7b.gz b/_darcs/patches/20080726034209-84dde-02b25960aeb361319f8037b17aed6290d477cf7b.gz new file mode 100644 index 0000000000..7ab55c1346 Binary files /dev/null and b/_darcs/patches/20080726034209-84dde-02b25960aeb361319f8037b17aed6290d477cf7b.gz differ diff --git a/_darcs/patches/20080727023516-84dde-7ebc4ccc8065dd1df9a414d5c39df70dbfebf487.gz b/_darcs/patches/20080727023516-84dde-7ebc4ccc8065dd1df9a414d5c39df70dbfebf487.gz new file mode 100644 index 0000000000..5d3f41fc40 Binary files /dev/null and b/_darcs/patches/20080727023516-84dde-7ebc4ccc8065dd1df9a414d5c39df70dbfebf487.gz differ diff --git a/_darcs/patches/20080728230221-ca946-68253052cfcd800a6da979e2a615d4847b1b05f3.gz b/_darcs/patches/20080728230221-ca946-68253052cfcd800a6da979e2a615d4847b1b05f3.gz new file mode 100644 index 0000000000..02bec3fb8e Binary files /dev/null and b/_darcs/patches/20080728230221-ca946-68253052cfcd800a6da979e2a615d4847b1b05f3.gz differ diff --git a/_darcs/patches/20080729025156-84dde-f3d9d26db3a500ff04f3a4ce3a3ff1846b6eca08.gz b/_darcs/patches/20080729025156-84dde-f3d9d26db3a500ff04f3a4ce3a3ff1846b6eca08.gz new file mode 100644 index 0000000000..046cbbb3ce Binary files /dev/null and b/_darcs/patches/20080729025156-84dde-f3d9d26db3a500ff04f3a4ce3a3ff1846b6eca08.gz differ diff --git a/_darcs/patches/20080729032845-84dde-9582cfd621142d99cddc8b91d2b619e984e263a9.gz b/_darcs/patches/20080729032845-84dde-9582cfd621142d99cddc8b91d2b619e984e263a9.gz new file mode 100644 index 0000000000..7d8274c030 Binary files /dev/null and b/_darcs/patches/20080729032845-84dde-9582cfd621142d99cddc8b91d2b619e984e263a9.gz differ diff --git a/_darcs/patches/20080729080641-533db-560337e226a02dd6fc671f090883d4bedd50eaaa.gz b/_darcs/patches/20080729080641-533db-560337e226a02dd6fc671f090883d4bedd50eaaa.gz new file mode 100644 index 0000000000..40fb6b4fde Binary files /dev/null and b/_darcs/patches/20080729080641-533db-560337e226a02dd6fc671f090883d4bedd50eaaa.gz differ diff --git a/_darcs/patches/20080729182534-84dde-cd91e6914464a577208d569c2ff3f730f2deaf4a.gz b/_darcs/patches/20080729182534-84dde-cd91e6914464a577208d569c2ff3f730f2deaf4a.gz new file mode 100644 index 0000000000..31d6d38249 Binary files /dev/null and b/_darcs/patches/20080729182534-84dde-cd91e6914464a577208d569c2ff3f730f2deaf4a.gz differ diff --git a/_darcs/patches/20080729182558-84dde-3f3eab4da119cf57fb55896b114146fd72007824.gz b/_darcs/patches/20080729182558-84dde-3f3eab4da119cf57fb55896b114146fd72007824.gz new file mode 100644 index 0000000000..d774e66c40 Binary files /dev/null and b/_darcs/patches/20080729182558-84dde-3f3eab4da119cf57fb55896b114146fd72007824.gz differ diff --git a/_darcs/patches/20080729183154-84dde-680e676d3f1f953ed0a8259598aaee04c012dc60.gz b/_darcs/patches/20080729183154-84dde-680e676d3f1f953ed0a8259598aaee04c012dc60.gz new file mode 100644 index 0000000000..992fa13917 Binary files /dev/null and b/_darcs/patches/20080729183154-84dde-680e676d3f1f953ed0a8259598aaee04c012dc60.gz differ diff --git a/_darcs/patches/20080729193533-84dde-1e7deeb0c7d7fb7686653be17d197e871aded8be.gz b/_darcs/patches/20080729193533-84dde-1e7deeb0c7d7fb7686653be17d197e871aded8be.gz new file mode 100644 index 0000000000..784b44993c Binary files /dev/null and b/_darcs/patches/20080729193533-84dde-1e7deeb0c7d7fb7686653be17d197e871aded8be.gz differ diff --git a/_darcs/patches/20080729194246-84dde-4a47578d8727720097dab9362cb356bd8f4d2a7d.gz b/_darcs/patches/20080729194246-84dde-4a47578d8727720097dab9362cb356bd8f4d2a7d.gz new file mode 100644 index 0000000000..811bef3a3f Binary files /dev/null and b/_darcs/patches/20080729194246-84dde-4a47578d8727720097dab9362cb356bd8f4d2a7d.gz differ diff --git a/_darcs/patches/20080729194457-84dde-fd0545edb3af519ccc43ee3ac50ad5eb14c35dad.gz b/_darcs/patches/20080729194457-84dde-fd0545edb3af519ccc43ee3ac50ad5eb14c35dad.gz new file mode 100644 index 0000000000..1a54d7c183 Binary files /dev/null and b/_darcs/patches/20080729194457-84dde-fd0545edb3af519ccc43ee3ac50ad5eb14c35dad.gz differ diff --git a/_darcs/patches/20080729194735-84dde-246582a47d4a384375d153bff0e724c778c4b3af.gz b/_darcs/patches/20080729194735-84dde-246582a47d4a384375d153bff0e724c778c4b3af.gz new file mode 100644 index 0000000000..312879f034 Binary files /dev/null and b/_darcs/patches/20080729194735-84dde-246582a47d4a384375d153bff0e724c778c4b3af.gz differ diff --git a/_darcs/patches/20080729195055-84dde-f7e6200cc81deea2399ce7c5d5cb8cddcc32ae2d.gz b/_darcs/patches/20080729195055-84dde-f7e6200cc81deea2399ce7c5d5cb8cddcc32ae2d.gz new file mode 100644 index 0000000000..704d64d5ea Binary files /dev/null and b/_darcs/patches/20080729195055-84dde-f7e6200cc81deea2399ce7c5d5cb8cddcc32ae2d.gz differ diff --git a/_darcs/patches/20080729195204-84dde-fbea8ce57aa1c76816f72c4a20fabbbb2d37045d.gz b/_darcs/patches/20080729195204-84dde-fbea8ce57aa1c76816f72c4a20fabbbb2d37045d.gz new file mode 100644 index 0000000000..3e2998b1d7 Binary files /dev/null and b/_darcs/patches/20080729195204-84dde-fbea8ce57aa1c76816f72c4a20fabbbb2d37045d.gz differ diff --git a/_darcs/patches/20080729195307-84dde-8e9100be281e32f38c75d5872489505805b44a2a.gz b/_darcs/patches/20080729195307-84dde-8e9100be281e32f38c75d5872489505805b44a2a.gz new file mode 100644 index 0000000000..b08a93182b Binary files /dev/null and b/_darcs/patches/20080729195307-84dde-8e9100be281e32f38c75d5872489505805b44a2a.gz differ diff --git a/_darcs/patches/20080729195405-84dde-101cca52afaacf38b64282aebb07e5698fd02b11.gz b/_darcs/patches/20080729195405-84dde-101cca52afaacf38b64282aebb07e5698fd02b11.gz new file mode 100644 index 0000000000..1e10c93a2b Binary files /dev/null and b/_darcs/patches/20080729195405-84dde-101cca52afaacf38b64282aebb07e5698fd02b11.gz differ diff --git a/_darcs/patches/20080729195512-84dde-acff6fb05edfb88bfdb2aaa482792cac1f975d94.gz b/_darcs/patches/20080729195512-84dde-acff6fb05edfb88bfdb2aaa482792cac1f975d94.gz new file mode 100644 index 0000000000..ab3cd64588 Binary files /dev/null and b/_darcs/patches/20080729195512-84dde-acff6fb05edfb88bfdb2aaa482792cac1f975d94.gz differ diff --git a/_darcs/patches/20080730022856-84dde-f19e4ff5d5ae2603b63b8aebd8f878ec90b3ce22.gz b/_darcs/patches/20080730022856-84dde-f19e4ff5d5ae2603b63b8aebd8f878ec90b3ce22.gz new file mode 100644 index 0000000000..3035c988e0 Binary files /dev/null and b/_darcs/patches/20080730022856-84dde-f19e4ff5d5ae2603b63b8aebd8f878ec90b3ce22.gz differ diff --git a/_darcs/patches/20080730025052-84dde-9669e6a7df50bf5762bd3e175ed1471bff9d446c.gz b/_darcs/patches/20080730025052-84dde-9669e6a7df50bf5762bd3e175ed1471bff9d446c.gz new file mode 100644 index 0000000000..a52b36b5df Binary files /dev/null and b/_darcs/patches/20080730025052-84dde-9669e6a7df50bf5762bd3e175ed1471bff9d446c.gz differ diff --git a/_darcs/patches/20080730030012-84dde-9ceea12e90a4b4b4bbe35cb6cb50b6bcbb6085b7.gz b/_darcs/patches/20080730030012-84dde-9ceea12e90a4b4b4bbe35cb6cb50b6bcbb6085b7.gz new file mode 100644 index 0000000000..86ce5f64e9 Binary files /dev/null and b/_darcs/patches/20080730030012-84dde-9ceea12e90a4b4b4bbe35cb6cb50b6bcbb6085b7.gz differ diff --git a/_darcs/patches/20080730032651-84dde-0685ec5f899129bc75745ca8d1d083f56f3f1ff5.gz b/_darcs/patches/20080730032651-84dde-0685ec5f899129bc75745ca8d1d083f56f3f1ff5.gz new file mode 100644 index 0000000000..f55c58dd68 Binary files /dev/null and b/_darcs/patches/20080730032651-84dde-0685ec5f899129bc75745ca8d1d083f56f3f1ff5.gz differ diff --git a/_darcs/patches/20080730032918-84dde-a38f8731840e0dcc82a4ced768bf85069e15a133.gz b/_darcs/patches/20080730032918-84dde-a38f8731840e0dcc82a4ced768bf85069e15a133.gz new file mode 100644 index 0000000000..729b2c861a Binary files /dev/null and b/_darcs/patches/20080730032918-84dde-a38f8731840e0dcc82a4ced768bf85069e15a133.gz differ diff --git a/_darcs/patches/20080730033304-84dde-159bd4582731d2adfb8b7306ee6eb44ce25d256a.gz b/_darcs/patches/20080730033304-84dde-159bd4582731d2adfb8b7306ee6eb44ce25d256a.gz new file mode 100644 index 0000000000..1354f04a8e Binary files /dev/null and b/_darcs/patches/20080730033304-84dde-159bd4582731d2adfb8b7306ee6eb44ce25d256a.gz differ diff --git a/_darcs/patches/20080730033804-84dde-1c747a7a6ee85f885926a42905b0b910fd1dec50.gz b/_darcs/patches/20080730033804-84dde-1c747a7a6ee85f885926a42905b0b910fd1dec50.gz new file mode 100644 index 0000000000..25d445a9d1 Binary files /dev/null and b/_darcs/patches/20080730033804-84dde-1c747a7a6ee85f885926a42905b0b910fd1dec50.gz differ diff --git a/_darcs/patches/20080730033939-84dde-21b90f9c8b5fcede12a71f12fee20a4faaf1c549.gz b/_darcs/patches/20080730033939-84dde-21b90f9c8b5fcede12a71f12fee20a4faaf1c549.gz new file mode 100644 index 0000000000..ee8a86d2f0 Binary files /dev/null and b/_darcs/patches/20080730033939-84dde-21b90f9c8b5fcede12a71f12fee20a4faaf1c549.gz differ diff --git a/_darcs/patches/20080730035446-84dde-8ce202ea6956bb49e1be98307136fc299862ab9b.gz b/_darcs/patches/20080730035446-84dde-8ce202ea6956bb49e1be98307136fc299862ab9b.gz new file mode 100644 index 0000000000..4d5e92a0a1 Binary files /dev/null and b/_darcs/patches/20080730035446-84dde-8ce202ea6956bb49e1be98307136fc299862ab9b.gz differ diff --git a/_darcs/patches/20080730191753-84dde-488f6ec3593072996a5227d2a02c079d9ba14032.gz b/_darcs/patches/20080730191753-84dde-488f6ec3593072996a5227d2a02c079d9ba14032.gz new file mode 100644 index 0000000000..d3177062f0 Binary files /dev/null and b/_darcs/patches/20080730191753-84dde-488f6ec3593072996a5227d2a02c079d9ba14032.gz differ diff --git a/_darcs/patches/20080730213226-ca946-eb89bad91eee630ac286d537ba42f0042b8d2109.gz b/_darcs/patches/20080730213226-ca946-eb89bad91eee630ac286d537ba42f0042b8d2109.gz new file mode 100644 index 0000000000..e6aeee3122 Binary files /dev/null and b/_darcs/patches/20080730213226-ca946-eb89bad91eee630ac286d537ba42f0042b8d2109.gz differ diff --git a/_darcs/patches/20080731004922-533db-96d62078f226ffc18db71d222d1c47524ac1319d.gz b/_darcs/patches/20080731004922-533db-96d62078f226ffc18db71d222d1c47524ac1319d.gz new file mode 100644 index 0000000000..ecfb6aaf42 Binary files /dev/null and b/_darcs/patches/20080731004922-533db-96d62078f226ffc18db71d222d1c47524ac1319d.gz differ diff --git a/_darcs/patches/20080731020433-84dde-641127c2de488087c1525fc773d544ba5b136550.gz b/_darcs/patches/20080731020433-84dde-641127c2de488087c1525fc773d544ba5b136550.gz new file mode 100644 index 0000000000..10d1e39170 Binary files /dev/null and b/_darcs/patches/20080731020433-84dde-641127c2de488087c1525fc773d544ba5b136550.gz differ diff --git a/_darcs/patches/20080731020933-84dde-80d7abb2d681a9f748b16f6245d33396e1f899b2.gz b/_darcs/patches/20080731020933-84dde-80d7abb2d681a9f748b16f6245d33396e1f899b2.gz new file mode 100644 index 0000000000..9ce9d452cb Binary files /dev/null and b/_darcs/patches/20080731020933-84dde-80d7abb2d681a9f748b16f6245d33396e1f899b2.gz differ diff --git a/_darcs/patches/20080731031652-d018c-23797e9624816572114e2e497e3618d03fac6968.gz b/_darcs/patches/20080731031652-d018c-23797e9624816572114e2e497e3618d03fac6968.gz new file mode 100644 index 0000000000..847b2703e2 Binary files /dev/null and b/_darcs/patches/20080731031652-d018c-23797e9624816572114e2e497e3618d03fac6968.gz differ diff --git a/_darcs/patches/20080731033641-84dde-188b32028a6a44ee0582f50b373338ec61593560.gz b/_darcs/patches/20080731033641-84dde-188b32028a6a44ee0582f50b373338ec61593560.gz new file mode 100644 index 0000000000..3cbe6e9e82 Binary files /dev/null and b/_darcs/patches/20080731033641-84dde-188b32028a6a44ee0582f50b373338ec61593560.gz differ diff --git a/_darcs/patches/20080731040703-84dde-c90f3afa2b15474331edb39f38ab1123978b4b09.gz b/_darcs/patches/20080731040703-84dde-c90f3afa2b15474331edb39f38ab1123978b4b09.gz new file mode 100644 index 0000000000..43233fa631 Binary files /dev/null and b/_darcs/patches/20080731040703-84dde-c90f3afa2b15474331edb39f38ab1123978b4b09.gz differ diff --git a/_darcs/patches/20080731041000-84dde-09a4b1d69cc42b7380582d1a2f5d718b6e57dcd2.gz b/_darcs/patches/20080731041000-84dde-09a4b1d69cc42b7380582d1a2f5d718b6e57dcd2.gz new file mode 100644 index 0000000000..916fd48e3e Binary files /dev/null and b/_darcs/patches/20080731041000-84dde-09a4b1d69cc42b7380582d1a2f5d718b6e57dcd2.gz differ diff --git a/_darcs/patches/20080731050632-34904-db9fc10c55321b81a33732a2062bf72914927cec.gz b/_darcs/patches/20080731050632-34904-db9fc10c55321b81a33732a2062bf72914927cec.gz new file mode 100644 index 0000000000..e87cfb5415 Binary files /dev/null and b/_darcs/patches/20080731050632-34904-db9fc10c55321b81a33732a2062bf72914927cec.gz differ diff --git a/_darcs/patches/20080731050646-34904-b17417e7a20088b81fd47484c29bb0922de94acf.gz b/_darcs/patches/20080731050646-34904-b17417e7a20088b81fd47484c29bb0922de94acf.gz new file mode 100644 index 0000000000..336d3dd437 Binary files /dev/null and b/_darcs/patches/20080731050646-34904-b17417e7a20088b81fd47484c29bb0922de94acf.gz differ diff --git a/_darcs/patches/20080731132302-84dde-4b5512a19202fb055338a0463ce2ecfac1c78778.gz b/_darcs/patches/20080731132302-84dde-4b5512a19202fb055338a0463ce2ecfac1c78778.gz new file mode 100644 index 0000000000..ff5cb343ac Binary files /dev/null and b/_darcs/patches/20080731132302-84dde-4b5512a19202fb055338a0463ce2ecfac1c78778.gz differ diff --git a/_darcs/patches/20080731152731-84dde-dc6bf652c38ae9a52950e65d7cb310f870a70640.gz b/_darcs/patches/20080731152731-84dde-dc6bf652c38ae9a52950e65d7cb310f870a70640.gz new file mode 100644 index 0000000000..6b85e2091a Binary files /dev/null and b/_darcs/patches/20080731152731-84dde-dc6bf652c38ae9a52950e65d7cb310f870a70640.gz differ diff --git a/_darcs/patches/20080731224911-ca946-1cb52c7592d48174437c1896c41a4dd853a9e5c7.gz b/_darcs/patches/20080731224911-ca946-1cb52c7592d48174437c1896c41a4dd853a9e5c7.gz new file mode 100644 index 0000000000..2037ae02da Binary files /dev/null and b/_darcs/patches/20080731224911-ca946-1cb52c7592d48174437c1896c41a4dd853a9e5c7.gz differ diff --git a/_darcs/patches/20080801164623-b1e77-1e8786743cc02e3d6f2320edff0f2f474f4ed76b.gz b/_darcs/patches/20080801164623-b1e77-1e8786743cc02e3d6f2320edff0f2f474f4ed76b.gz new file mode 100644 index 0000000000..aae1e450f1 Binary files /dev/null and b/_darcs/patches/20080801164623-b1e77-1e8786743cc02e3d6f2320edff0f2f474f4ed76b.gz differ diff --git a/_darcs/patches/20080803232102-84dde-6a070b8ff0d7fe25b8a69e0e9e4f8caa2c335f9b.gz b/_darcs/patches/20080803232102-84dde-6a070b8ff0d7fe25b8a69e0e9e4f8caa2c335f9b.gz new file mode 100644 index 0000000000..eba955ce05 Binary files /dev/null and b/_darcs/patches/20080803232102-84dde-6a070b8ff0d7fe25b8a69e0e9e4f8caa2c335f9b.gz differ diff --git a/_darcs/patches/20080804130914-84dde-77e1683ec76b26e9a3838d82cbe7827246db22dd.gz b/_darcs/patches/20080804130914-84dde-77e1683ec76b26e9a3838d82cbe7827246db22dd.gz new file mode 100644 index 0000000000..ca12eef2c6 Binary files /dev/null and b/_darcs/patches/20080804130914-84dde-77e1683ec76b26e9a3838d82cbe7827246db22dd.gz differ diff --git a/_darcs/patches/20080804132001-84dde-e6fae9837f87d80356317e4815516dd9ff03e674.gz b/_darcs/patches/20080804132001-84dde-e6fae9837f87d80356317e4815516dd9ff03e674.gz new file mode 100644 index 0000000000..1ce6c897d0 Binary files /dev/null and b/_darcs/patches/20080804132001-84dde-e6fae9837f87d80356317e4815516dd9ff03e674.gz differ diff --git a/_darcs/patches/20080804133253-84dde-4b1ceb6feabaaad503f8777d6f21545b2bb87e85.gz b/_darcs/patches/20080804133253-84dde-4b1ceb6feabaaad503f8777d6f21545b2bb87e85.gz new file mode 100644 index 0000000000..4a395cc35f Binary files /dev/null and b/_darcs/patches/20080804133253-84dde-4b1ceb6feabaaad503f8777d6f21545b2bb87e85.gz differ diff --git a/_darcs/patches/20080804133727-edabd-4bd34431d0ab8519ec512b59be354720925da9a0.gz b/_darcs/patches/20080804133727-edabd-4bd34431d0ab8519ec512b59be354720925da9a0.gz new file mode 100644 index 0000000000..e5142acc2f Binary files /dev/null and b/_darcs/patches/20080804133727-edabd-4bd34431d0ab8519ec512b59be354720925da9a0.gz differ diff --git a/_darcs/patches/20080804133933-84dde-189f0ee39bf1000fbb648144fadcf9a9263c4b38.gz b/_darcs/patches/20080804133933-84dde-189f0ee39bf1000fbb648144fadcf9a9263c4b38.gz new file mode 100644 index 0000000000..fee856c722 Binary files /dev/null and b/_darcs/patches/20080804133933-84dde-189f0ee39bf1000fbb648144fadcf9a9263c4b38.gz differ diff --git a/_darcs/patches/20080804190749-84dde-0b6d007e3da6d468e7dbe1c859f2c5c753726e8a.gz b/_darcs/patches/20080804190749-84dde-0b6d007e3da6d468e7dbe1c859f2c5c753726e8a.gz new file mode 100644 index 0000000000..b2b482166f Binary files /dev/null and b/_darcs/patches/20080804190749-84dde-0b6d007e3da6d468e7dbe1c859f2c5c753726e8a.gz differ diff --git a/_darcs/patches/20080805020520-533db-774b253ac10ae71e7d8d9b48e654736039fa5ae3.gz b/_darcs/patches/20080805020520-533db-774b253ac10ae71e7d8d9b48e654736039fa5ae3.gz new file mode 100644 index 0000000000..78dc74e2a0 Binary files /dev/null and b/_darcs/patches/20080805020520-533db-774b253ac10ae71e7d8d9b48e654736039fa5ae3.gz differ diff --git a/_darcs/patches/20080806002134-84dde-1674375f840a61ce469be784805a969beff35f43.gz b/_darcs/patches/20080806002134-84dde-1674375f840a61ce469be784805a969beff35f43.gz new file mode 100644 index 0000000000..a4cddeda58 Binary files /dev/null and b/_darcs/patches/20080806002134-84dde-1674375f840a61ce469be784805a969beff35f43.gz differ diff --git a/_darcs/patches/20080806034515-84dde-e32cbfec2890f50b610d0441659180038b060473.gz b/_darcs/patches/20080806034515-84dde-e32cbfec2890f50b610d0441659180038b060473.gz new file mode 100644 index 0000000000..9f05b0fdac Binary files /dev/null and b/_darcs/patches/20080806034515-84dde-e32cbfec2890f50b610d0441659180038b060473.gz differ diff --git a/_darcs/patches/20080806040433-84dde-a504751a8a0329a37d866e68a9ecda6a5d629c55.gz b/_darcs/patches/20080806040433-84dde-a504751a8a0329a37d866e68a9ecda6a5d629c55.gz new file mode 100644 index 0000000000..c420ccd88c Binary files /dev/null and b/_darcs/patches/20080806040433-84dde-a504751a8a0329a37d866e68a9ecda6a5d629c55.gz differ diff --git a/_darcs/patches/20080806122119-84dde-41fb0645db58ac5ce74b485c8cb68f7275e74915.gz b/_darcs/patches/20080806122119-84dde-41fb0645db58ac5ce74b485c8cb68f7275e74915.gz new file mode 100644 index 0000000000..47f872b092 Binary files /dev/null and b/_darcs/patches/20080806122119-84dde-41fb0645db58ac5ce74b485c8cb68f7275e74915.gz differ diff --git a/_darcs/patches/20080806161748-84dde-2d2e6a3ed224abfc440fa6dd2533dd6c4b8231d0.gz b/_darcs/patches/20080806161748-84dde-2d2e6a3ed224abfc440fa6dd2533dd6c4b8231d0.gz new file mode 100644 index 0000000000..fb5a3c46a1 Binary files /dev/null and b/_darcs/patches/20080806161748-84dde-2d2e6a3ed224abfc440fa6dd2533dd6c4b8231d0.gz differ diff --git a/_darcs/patches/20080807234227-84dde-a64619c71de020aa2284ca1a36ea2a71ff8b29a6.gz b/_darcs/patches/20080807234227-84dde-a64619c71de020aa2284ca1a36ea2a71ff8b29a6.gz new file mode 100644 index 0000000000..5e59aea219 Binary files /dev/null and b/_darcs/patches/20080807234227-84dde-a64619c71de020aa2284ca1a36ea2a71ff8b29a6.gz differ diff --git a/_darcs/patches/20080809001240-ca946-0a8ec8b965876e1da90c675ad596b32906a21d93.gz b/_darcs/patches/20080809001240-ca946-0a8ec8b965876e1da90c675ad596b32906a21d93.gz new file mode 100644 index 0000000000..3664ca6019 Binary files /dev/null and b/_darcs/patches/20080809001240-ca946-0a8ec8b965876e1da90c675ad596b32906a21d93.gz differ diff --git a/_darcs/patches/20080811175318-84dde-080db6e81589e794761daab868706704d39e2f1b.gz b/_darcs/patches/20080811175318-84dde-080db6e81589e794761daab868706704d39e2f1b.gz new file mode 100644 index 0000000000..005e496a32 Binary files /dev/null and b/_darcs/patches/20080811175318-84dde-080db6e81589e794761daab868706704d39e2f1b.gz differ diff --git a/_darcs/patches/20080811175820-84dde-f3d934495fa90fadde5f7d5d0c37c5f2a575a9d8.gz b/_darcs/patches/20080811175820-84dde-f3d934495fa90fadde5f7d5d0c37c5f2a575a9d8.gz new file mode 100644 index 0000000000..42dc2e6147 Binary files /dev/null and b/_darcs/patches/20080811175820-84dde-f3d934495fa90fadde5f7d5d0c37c5f2a575a9d8.gz differ diff --git a/_darcs/patches/20080811181158-84dde-338f926bd4c161ea55ef8600fac254f216413ad4.gz b/_darcs/patches/20080811181158-84dde-338f926bd4c161ea55ef8600fac254f216413ad4.gz new file mode 100644 index 0000000000..186d360ff2 Binary files /dev/null and b/_darcs/patches/20080811181158-84dde-338f926bd4c161ea55ef8600fac254f216413ad4.gz differ diff --git a/_darcs/patches/20080811200058-84dde-8a45ed98a331d3b53ba8e50494e44f52928c7a04.gz b/_darcs/patches/20080811200058-84dde-8a45ed98a331d3b53ba8e50494e44f52928c7a04.gz new file mode 100644 index 0000000000..cb51988a5f Binary files /dev/null and b/_darcs/patches/20080811200058-84dde-8a45ed98a331d3b53ba8e50494e44f52928c7a04.gz differ diff --git a/_darcs/patches/20080812011600-84dde-680d39ef8379605febd16ed52c529711e8e1ccc9.gz b/_darcs/patches/20080812011600-84dde-680d39ef8379605febd16ed52c529711e8e1ccc9.gz new file mode 100644 index 0000000000..f6a91a00a4 Binary files /dev/null and b/_darcs/patches/20080812011600-84dde-680d39ef8379605febd16ed52c529711e8e1ccc9.gz differ diff --git a/_darcs/patches/20080812121832-84dde-dad220ddc4c67e017aa10e47e3aed85392d606ca.gz b/_darcs/patches/20080812121832-84dde-dad220ddc4c67e017aa10e47e3aed85392d606ca.gz new file mode 100644 index 0000000000..0604686929 Binary files /dev/null and b/_darcs/patches/20080812121832-84dde-dad220ddc4c67e017aa10e47e3aed85392d606ca.gz differ diff --git a/_darcs/patches/20080813142637-84dde-9530d153eceb6bbedbb692755aa5c96d65d8e071.gz b/_darcs/patches/20080813142637-84dde-9530d153eceb6bbedbb692755aa5c96d65d8e071.gz new file mode 100644 index 0000000000..594eef85e5 Binary files /dev/null and b/_darcs/patches/20080813142637-84dde-9530d153eceb6bbedbb692755aa5c96d65d8e071.gz differ diff --git a/_darcs/patches/20080813154603-84dde-fc1cf32ab5617c11b6cbe9ad084dac32b0db315a.gz b/_darcs/patches/20080813154603-84dde-fc1cf32ab5617c11b6cbe9ad084dac32b0db315a.gz new file mode 100644 index 0000000000..e860d0ab04 Binary files /dev/null and b/_darcs/patches/20080813154603-84dde-fc1cf32ab5617c11b6cbe9ad084dac32b0db315a.gz differ diff --git a/_darcs/patches/20080813180239-84dde-535ac9147c988e3617a68e4638367bdcef8fe5be.gz b/_darcs/patches/20080813180239-84dde-535ac9147c988e3617a68e4638367bdcef8fe5be.gz new file mode 100644 index 0000000000..460fa43638 Binary files /dev/null and b/_darcs/patches/20080813180239-84dde-535ac9147c988e3617a68e4638367bdcef8fe5be.gz differ diff --git a/_darcs/patches/20080813193327-ca946-c0160fbcc04771e39e303470d3418e84973a8189.gz b/_darcs/patches/20080813193327-ca946-c0160fbcc04771e39e303470d3418e84973a8189.gz new file mode 100644 index 0000000000..48e95b4ec6 Binary files /dev/null and b/_darcs/patches/20080813193327-ca946-c0160fbcc04771e39e303470d3418e84973a8189.gz differ diff --git a/_darcs/patches/20080813195408-84dde-a1de441ce50759f50b2c88b45d626dc4e0892d31.gz b/_darcs/patches/20080813195408-84dde-a1de441ce50759f50b2c88b45d626dc4e0892d31.gz new file mode 100644 index 0000000000..561643db37 Binary files /dev/null and b/_darcs/patches/20080813195408-84dde-a1de441ce50759f50b2c88b45d626dc4e0892d31.gz differ diff --git a/_darcs/patches/20080814002038-84dde-8505d4e083056b770db128129a95be639d8e7f0a.gz b/_darcs/patches/20080814002038-84dde-8505d4e083056b770db128129a95be639d8e7f0a.gz new file mode 100644 index 0000000000..499d0a23ec Binary files /dev/null and b/_darcs/patches/20080814002038-84dde-8505d4e083056b770db128129a95be639d8e7f0a.gz differ diff --git a/_darcs/patches/20080814083856-f6e2c-0e56895260fb96dedaa6a663db7e906fee2f7b05.gz b/_darcs/patches/20080814083856-f6e2c-0e56895260fb96dedaa6a663db7e906fee2f7b05.gz new file mode 100644 index 0000000000..fe2ba6c674 Binary files /dev/null and b/_darcs/patches/20080814083856-f6e2c-0e56895260fb96dedaa6a663db7e906fee2f7b05.gz differ diff --git a/_darcs/patches/20080815185317-ca946-11c3f9f7255180d5d6ea7b115b3e33b2abb7fe93.gz b/_darcs/patches/20080815185317-ca946-11c3f9f7255180d5d6ea7b115b3e33b2abb7fe93.gz new file mode 100644 index 0000000000..80f44b8764 Binary files /dev/null and b/_darcs/patches/20080815185317-ca946-11c3f9f7255180d5d6ea7b115b3e33b2abb7fe93.gz differ diff --git a/_darcs/patches/20080816083422-f6e2c-fb8b4e0581719bd8c3f433e661ec9742e1b84cbc.gz b/_darcs/patches/20080816083422-f6e2c-fb8b4e0581719bd8c3f433e661ec9742e1b84cbc.gz new file mode 100644 index 0000000000..b8cd5e8b3d Binary files /dev/null and b/_darcs/patches/20080816083422-f6e2c-fb8b4e0581719bd8c3f433e661ec9742e1b84cbc.gz differ diff --git a/_darcs/patches/20080816151057-84dde-e9df2c91a2711b235aa936a28e250715fc7c6d50.gz b/_darcs/patches/20080816151057-84dde-e9df2c91a2711b235aa936a28e250715fc7c6d50.gz new file mode 100644 index 0000000000..978d9bcdfb Binary files /dev/null and b/_darcs/patches/20080816151057-84dde-e9df2c91a2711b235aa936a28e250715fc7c6d50.gz differ diff --git a/_darcs/patches/20080816153917-f6e2c-e9a3111a80dfda5755c5fa3a4ea00d880afb08c2.gz b/_darcs/patches/20080816153917-f6e2c-e9a3111a80dfda5755c5fa3a4ea00d880afb08c2.gz new file mode 100644 index 0000000000..b12ee4c3c8 Binary files /dev/null and b/_darcs/patches/20080816153917-f6e2c-e9a3111a80dfda5755c5fa3a4ea00d880afb08c2.gz differ diff --git a/_darcs/patches/20080816181321-18f16-f9e3f6a71141232c019bf5290f6acbd747fa20df.gz b/_darcs/patches/20080816181321-18f16-f9e3f6a71141232c019bf5290f6acbd747fa20df.gz new file mode 100644 index 0000000000..6172ce1b6e Binary files /dev/null and b/_darcs/patches/20080816181321-18f16-f9e3f6a71141232c019bf5290f6acbd747fa20df.gz differ diff --git a/_darcs/patches/20080816181845-18f16-5f7a91b4ea706605d1890513b8a44fcb0182d66b.gz b/_darcs/patches/20080816181845-18f16-5f7a91b4ea706605d1890513b8a44fcb0182d66b.gz new file mode 100644 index 0000000000..6f8281dbf5 Binary files /dev/null and b/_darcs/patches/20080816181845-18f16-5f7a91b4ea706605d1890513b8a44fcb0182d66b.gz differ diff --git a/_darcs/patches/20080816200437-18f16-360a19784be7e063015fa71580e09d740d6a72b5.gz b/_darcs/patches/20080816200437-18f16-360a19784be7e063015fa71580e09d740d6a72b5.gz new file mode 100644 index 0000000000..b8f745b429 Binary files /dev/null and b/_darcs/patches/20080816200437-18f16-360a19784be7e063015fa71580e09d740d6a72b5.gz differ diff --git a/_darcs/patches/20080817150244-84dde-7f2e4dec226aa9754dfc970386e62076f952db72.gz b/_darcs/patches/20080817150244-84dde-7f2e4dec226aa9754dfc970386e62076f952db72.gz new file mode 100644 index 0000000000..d29c5c7cec Binary files /dev/null and b/_darcs/patches/20080817150244-84dde-7f2e4dec226aa9754dfc970386e62076f952db72.gz differ diff --git a/_darcs/patches/20080817151728-84dde-6d5557db098a1273c0b9e3451b814e8d57759e57.gz b/_darcs/patches/20080817151728-84dde-6d5557db098a1273c0b9e3451b814e8d57759e57.gz new file mode 100644 index 0000000000..0e8e92768f Binary files /dev/null and b/_darcs/patches/20080817151728-84dde-6d5557db098a1273c0b9e3451b814e8d57759e57.gz differ diff --git a/_darcs/patches/20080817151751-84dde-b3fc3ee57872f53a465fd9b45f4255e5e3be3450.gz b/_darcs/patches/20080817151751-84dde-b3fc3ee57872f53a465fd9b45f4255e5e3be3450.gz new file mode 100644 index 0000000000..0c7feb3e0a Binary files /dev/null and b/_darcs/patches/20080817151751-84dde-b3fc3ee57872f53a465fd9b45f4255e5e3be3450.gz differ diff --git a/_darcs/patches/20080817152108-84dde-9ca19fbe374ad021771f175f587f19902b3f927b.gz b/_darcs/patches/20080817152108-84dde-9ca19fbe374ad021771f175f587f19902b3f927b.gz new file mode 100644 index 0000000000..7c9d079f65 Binary files /dev/null and b/_darcs/patches/20080817152108-84dde-9ca19fbe374ad021771f175f587f19902b3f927b.gz differ diff --git a/_darcs/patches/20080817152133-84dde-36313e2aa0f37dd43ae8ed17c1194e4a2289a2eb.gz b/_darcs/patches/20080817152133-84dde-36313e2aa0f37dd43ae8ed17c1194e4a2289a2eb.gz new file mode 100644 index 0000000000..d1647b1e17 Binary files /dev/null and b/_darcs/patches/20080817152133-84dde-36313e2aa0f37dd43ae8ed17c1194e4a2289a2eb.gz differ diff --git a/_darcs/patches/20080817152419-84dde-5df1554695bd8560e5affa0ff74f7d0ab7c7c3ff.gz b/_darcs/patches/20080817152419-84dde-5df1554695bd8560e5affa0ff74f7d0ab7c7c3ff.gz new file mode 100644 index 0000000000..8dc2b9af66 Binary files /dev/null and b/_darcs/patches/20080817152419-84dde-5df1554695bd8560e5affa0ff74f7d0ab7c7c3ff.gz differ diff --git a/_darcs/patches/20080817153024-84dde-ca566d665fff08d52f1f9796e2731417585d4c6f.gz b/_darcs/patches/20080817153024-84dde-ca566d665fff08d52f1f9796e2731417585d4c6f.gz new file mode 100644 index 0000000000..7c069bde91 Binary files /dev/null and b/_darcs/patches/20080817153024-84dde-ca566d665fff08d52f1f9796e2731417585d4c6f.gz differ diff --git a/_darcs/patches/20080817153143-84dde-1ff56e4066c0905e8846876bc9de22eca999f826.gz b/_darcs/patches/20080817153143-84dde-1ff56e4066c0905e8846876bc9de22eca999f826.gz new file mode 100644 index 0000000000..5cbfd94867 Binary files /dev/null and b/_darcs/patches/20080817153143-84dde-1ff56e4066c0905e8846876bc9de22eca999f826.gz differ diff --git a/_darcs/patches/20080817160451-84dde-dc1813f3c555e25f796596128fed4344c296ec58.gz b/_darcs/patches/20080817160451-84dde-dc1813f3c555e25f796596128fed4344c296ec58.gz new file mode 100644 index 0000000000..2fd36f27f0 Binary files /dev/null and b/_darcs/patches/20080817160451-84dde-dc1813f3c555e25f796596128fed4344c296ec58.gz differ diff --git a/_darcs/patches/20080817163324-84dde-0b7f3449b7f6e96704518340351ada9ec0e56bbb.gz b/_darcs/patches/20080817163324-84dde-0b7f3449b7f6e96704518340351ada9ec0e56bbb.gz new file mode 100644 index 0000000000..51d3eebd22 Binary files /dev/null and b/_darcs/patches/20080817163324-84dde-0b7f3449b7f6e96704518340351ada9ec0e56bbb.gz differ diff --git a/_darcs/patches/20080817192710-84dde-47e8da809c930c7c4528e3cb920d9a448e56d4c0.gz b/_darcs/patches/20080817192710-84dde-47e8da809c930c7c4528e3cb920d9a448e56d4c0.gz new file mode 100644 index 0000000000..beba7c1693 Binary files /dev/null and b/_darcs/patches/20080817192710-84dde-47e8da809c930c7c4528e3cb920d9a448e56d4c0.gz differ diff --git a/_darcs/patches/20080818025549-84dde-0277e3c0b58a6d223f892376cfc9f5aa9df9714b.gz b/_darcs/patches/20080818025549-84dde-0277e3c0b58a6d223f892376cfc9f5aa9df9714b.gz new file mode 100644 index 0000000000..b5e180cc52 Binary files /dev/null and b/_darcs/patches/20080818025549-84dde-0277e3c0b58a6d223f892376cfc9f5aa9df9714b.gz differ diff --git a/_darcs/patches/20080818033049-84dde-eb6098e0ae84d081418536ceb6964a65bcbf4953.gz b/_darcs/patches/20080818033049-84dde-eb6098e0ae84d081418536ceb6964a65bcbf4953.gz new file mode 100644 index 0000000000..0a89554eea Binary files /dev/null and b/_darcs/patches/20080818033049-84dde-eb6098e0ae84d081418536ceb6964a65bcbf4953.gz differ diff --git a/_darcs/patches/20080818213031-f6e2c-760cbb6f91485bbb8b29156c06a16e9ad6cd0acf.gz b/_darcs/patches/20080818213031-f6e2c-760cbb6f91485bbb8b29156c06a16e9ad6cd0acf.gz new file mode 100644 index 0000000000..660d8574a4 Binary files /dev/null and b/_darcs/patches/20080818213031-f6e2c-760cbb6f91485bbb8b29156c06a16e9ad6cd0acf.gz differ diff --git a/_darcs/patches/20080819002903-462f3-94e62891db9b9de049a918034742e545f663e840.gz b/_darcs/patches/20080819002903-462f3-94e62891db9b9de049a918034742e545f663e840.gz new file mode 100644 index 0000000000..195d49bd26 Binary files /dev/null and b/_darcs/patches/20080819002903-462f3-94e62891db9b9de049a918034742e545f663e840.gz differ diff --git a/_darcs/patches/20080819003931-462f3-4b5b838a2fc5f872391581a189d33abdd8eeb744.gz b/_darcs/patches/20080819003931-462f3-4b5b838a2fc5f872391581a189d33abdd8eeb744.gz new file mode 100644 index 0000000000..3494f689f5 Binary files /dev/null and b/_darcs/patches/20080819003931-462f3-4b5b838a2fc5f872391581a189d33abdd8eeb744.gz differ diff --git a/_darcs/patches/20080819071321-f6e2c-a7ee326669eba917fff8dd37c85c13db46c93f19.gz b/_darcs/patches/20080819071321-f6e2c-a7ee326669eba917fff8dd37c85c13db46c93f19.gz new file mode 100644 index 0000000000..74e824b188 Binary files /dev/null and b/_darcs/patches/20080819071321-f6e2c-a7ee326669eba917fff8dd37c85c13db46c93f19.gz differ diff --git a/_darcs/patches/20080819182724-84dde-d2cece72dfb7f4f9f5b5cb4574812fdd32daa601.gz b/_darcs/patches/20080819182724-84dde-d2cece72dfb7f4f9f5b5cb4574812fdd32daa601.gz new file mode 100644 index 0000000000..92a470d99e Binary files /dev/null and b/_darcs/patches/20080819182724-84dde-d2cece72dfb7f4f9f5b5cb4574812fdd32daa601.gz differ diff --git a/_darcs/patches/20080819182824-84dde-84d93fae2c4b0d6acee646999bad8e8bb9752c7b.gz b/_darcs/patches/20080819182824-84dde-84d93fae2c4b0d6acee646999bad8e8bb9752c7b.gz new file mode 100644 index 0000000000..37ba724932 Binary files /dev/null and b/_darcs/patches/20080819182824-84dde-84d93fae2c4b0d6acee646999bad8e8bb9752c7b.gz differ diff --git a/_darcs/patches/20080819194610-462f3-eb736e4cfc817b479e1e8e52db03b5f44cdb3d2a.gz b/_darcs/patches/20080819194610-462f3-eb736e4cfc817b479e1e8e52db03b5f44cdb3d2a.gz new file mode 100644 index 0000000000..12aa6ae300 Binary files /dev/null and b/_darcs/patches/20080819194610-462f3-eb736e4cfc817b479e1e8e52db03b5f44cdb3d2a.gz differ diff --git a/_darcs/patches/20080819195431-462f3-93d27cf980fd09aeb30ea741639c1650baecad60.gz b/_darcs/patches/20080819195431-462f3-93d27cf980fd09aeb30ea741639c1650baecad60.gz new file mode 100644 index 0000000000..b92cc3831a Binary files /dev/null and b/_darcs/patches/20080819195431-462f3-93d27cf980fd09aeb30ea741639c1650baecad60.gz differ diff --git a/_darcs/patches/20080819202318-462f3-bc08a105c6b41b6a89a2358962440f68a9a79c7f.gz b/_darcs/patches/20080819202318-462f3-bc08a105c6b41b6a89a2358962440f68a9a79c7f.gz new file mode 100644 index 0000000000..fa4cacc4a8 Binary files /dev/null and b/_darcs/patches/20080819202318-462f3-bc08a105c6b41b6a89a2358962440f68a9a79c7f.gz differ diff --git a/_darcs/patches/20080819214923-462f3-83ab492cb93c1ba643beb70853578cbd7ac35d61.gz b/_darcs/patches/20080819214923-462f3-83ab492cb93c1ba643beb70853578cbd7ac35d61.gz new file mode 100644 index 0000000000..5d0b7892dc Binary files /dev/null and b/_darcs/patches/20080819214923-462f3-83ab492cb93c1ba643beb70853578cbd7ac35d61.gz differ diff --git a/_darcs/patches/20080819221214-84dde-15683b1e146b9e29064aa8ae04bc7daebfaf2e92.gz b/_darcs/patches/20080819221214-84dde-15683b1e146b9e29064aa8ae04bc7daebfaf2e92.gz new file mode 100644 index 0000000000..d3873033c7 Binary files /dev/null and b/_darcs/patches/20080819221214-84dde-15683b1e146b9e29064aa8ae04bc7daebfaf2e92.gz differ diff --git a/_darcs/patches/20080821125306-84dde-58acb80666ed3a2b1ef4db3290aa3c5f0de12a9a.gz b/_darcs/patches/20080821125306-84dde-58acb80666ed3a2b1ef4db3290aa3c5f0de12a9a.gz new file mode 100644 index 0000000000..c9e1e2213b Binary files /dev/null and b/_darcs/patches/20080821125306-84dde-58acb80666ed3a2b1ef4db3290aa3c5f0de12a9a.gz differ diff --git a/_darcs/patches/20080822034054-462f3-3211b5a9a412f9496d46a9fb64b26d62a3b28d1f.gz b/_darcs/patches/20080822034054-462f3-3211b5a9a412f9496d46a9fb64b26d62a3b28d1f.gz new file mode 100644 index 0000000000..04d9f8cc8e Binary files /dev/null and b/_darcs/patches/20080822034054-462f3-3211b5a9a412f9496d46a9fb64b26d62a3b28d1f.gz differ diff --git a/_darcs/patches/20080822034157-462f3-398e2ba92d9c38520ea6518c3ff614b41f3cc7ec.gz b/_darcs/patches/20080822034157-462f3-398e2ba92d9c38520ea6518c3ff614b41f3cc7ec.gz new file mode 100644 index 0000000000..19dc5f196a Binary files /dev/null and b/_darcs/patches/20080822034157-462f3-398e2ba92d9c38520ea6518c3ff614b41f3cc7ec.gz differ diff --git a/_darcs/patches/20080822131714-84dde-6978424ded2ed1041a65142a25560654ac717fcd.gz b/_darcs/patches/20080822131714-84dde-6978424ded2ed1041a65142a25560654ac717fcd.gz new file mode 100644 index 0000000000..a675e592cb Binary files /dev/null and b/_darcs/patches/20080822131714-84dde-6978424ded2ed1041a65142a25560654ac717fcd.gz differ diff --git a/_darcs/patches/20080822185955-f6e2c-569bc9d304e904fd26e3cc976e8246e3eb7f93bd.gz b/_darcs/patches/20080822185955-f6e2c-569bc9d304e904fd26e3cc976e8246e3eb7f93bd.gz new file mode 100644 index 0000000000..16e4a60856 Binary files /dev/null and b/_darcs/patches/20080822185955-f6e2c-569bc9d304e904fd26e3cc976e8246e3eb7f93bd.gz differ diff --git a/_darcs/patches/20080822191032-f6e2c-a3a7efbbaad1ec7c48ef132a8ba34fc8b8651969.gz b/_darcs/patches/20080822191032-f6e2c-a3a7efbbaad1ec7c48ef132a8ba34fc8b8651969.gz new file mode 100644 index 0000000000..a02ed68112 Binary files /dev/null and b/_darcs/patches/20080822191032-f6e2c-a3a7efbbaad1ec7c48ef132a8ba34fc8b8651969.gz differ diff --git a/_darcs/patches/20080822191751-f6e2c-578869b8524e3238c461872981a5dd8c285937e3.gz b/_darcs/patches/20080822191751-f6e2c-578869b8524e3238c461872981a5dd8c285937e3.gz new file mode 100644 index 0000000000..02b9467374 Binary files /dev/null and b/_darcs/patches/20080822191751-f6e2c-578869b8524e3238c461872981a5dd8c285937e3.gz differ diff --git a/_darcs/patches/20080822210307-84dde-c90f6e7953d11c5b12c7a084ac23e5578412932c.gz b/_darcs/patches/20080822210307-84dde-c90f6e7953d11c5b12c7a084ac23e5578412932c.gz new file mode 100644 index 0000000000..93682e3730 Binary files /dev/null and b/_darcs/patches/20080822210307-84dde-c90f6e7953d11c5b12c7a084ac23e5578412932c.gz differ diff --git a/_darcs/patches/20080822210415-84dde-1a00e3090d52bbeeb5f40b0640cb561992ff0d1e.gz b/_darcs/patches/20080822210415-84dde-1a00e3090d52bbeeb5f40b0640cb561992ff0d1e.gz new file mode 100644 index 0000000000..cf14876fb9 Binary files /dev/null and b/_darcs/patches/20080822210415-84dde-1a00e3090d52bbeeb5f40b0640cb561992ff0d1e.gz differ diff --git a/_darcs/patches/20080822210654-84dde-68595effcfc11d5e4497c72b189b5f046a8b3ca6.gz b/_darcs/patches/20080822210654-84dde-68595effcfc11d5e4497c72b189b5f046a8b3ca6.gz new file mode 100644 index 0000000000..548590a415 Binary files /dev/null and b/_darcs/patches/20080822210654-84dde-68595effcfc11d5e4497c72b189b5f046a8b3ca6.gz differ diff --git a/_darcs/patches/20080822212111-84dde-2770093fcfaa6fe03abb1143d3828f0622382b45.gz b/_darcs/patches/20080822212111-84dde-2770093fcfaa6fe03abb1143d3828f0622382b45.gz new file mode 100644 index 0000000000..32b22bd03a Binary files /dev/null and b/_darcs/patches/20080822212111-84dde-2770093fcfaa6fe03abb1143d3828f0622382b45.gz differ diff --git a/_darcs/patches/20080823052534-f6e2c-aa452a8c2c6ee33399f4079d0bf2224847e1450a.gz b/_darcs/patches/20080823052534-f6e2c-aa452a8c2c6ee33399f4079d0bf2224847e1450a.gz new file mode 100644 index 0000000000..53390be0fe Binary files /dev/null and b/_darcs/patches/20080823052534-f6e2c-aa452a8c2c6ee33399f4079d0bf2224847e1450a.gz differ diff --git a/_darcs/patches/20080823053548-f6e2c-dfc8a0acd9fb8589ed37e54c7d0d3d38afff34f5.gz b/_darcs/patches/20080823053548-f6e2c-dfc8a0acd9fb8589ed37e54c7d0d3d38afff34f5.gz new file mode 100644 index 0000000000..73755d4252 Binary files /dev/null and b/_darcs/patches/20080823053548-f6e2c-dfc8a0acd9fb8589ed37e54c7d0d3d38afff34f5.gz differ diff --git a/_darcs/patches/20080823191015-84dde-05263d6e9a2535c726b98aacc5f3269f66fe22bd.gz b/_darcs/patches/20080823191015-84dde-05263d6e9a2535c726b98aacc5f3269f66fe22bd.gz new file mode 100644 index 0000000000..d342b0acbf Binary files /dev/null and b/_darcs/patches/20080823191015-84dde-05263d6e9a2535c726b98aacc5f3269f66fe22bd.gz differ diff --git a/_darcs/patches/20080824011706-84dde-bf35373c3bfc631f8285f8630155195c3c5cc304.gz b/_darcs/patches/20080824011706-84dde-bf35373c3bfc631f8285f8630155195c3c5cc304.gz new file mode 100644 index 0000000000..f97adf0aa0 Binary files /dev/null and b/_darcs/patches/20080824011706-84dde-bf35373c3bfc631f8285f8630155195c3c5cc304.gz differ diff --git a/_darcs/patches/20080824013803-84dde-9c5d9ce9c588cfb9baddae64366e3417f0a5fee9.gz b/_darcs/patches/20080824013803-84dde-9c5d9ce9c588cfb9baddae64366e3417f0a5fee9.gz new file mode 100644 index 0000000000..f0827893b0 Binary files /dev/null and b/_darcs/patches/20080824013803-84dde-9c5d9ce9c588cfb9baddae64366e3417f0a5fee9.gz differ diff --git a/_darcs/patches/20080824113719-84dde-fce2da5de5de7cd76c001ac2c48b99edbedb80a8.gz b/_darcs/patches/20080824113719-84dde-fce2da5de5de7cd76c001ac2c48b99edbedb80a8.gz new file mode 100644 index 0000000000..3ffe9f8554 Binary files /dev/null and b/_darcs/patches/20080824113719-84dde-fce2da5de5de7cd76c001ac2c48b99edbedb80a8.gz differ diff --git a/_darcs/patches/20080824171202-84dde-fd3ed2b9645f2c2ec5439824dbc6f6a765c0a622.gz b/_darcs/patches/20080824171202-84dde-fd3ed2b9645f2c2ec5439824dbc6f6a765c0a622.gz new file mode 100644 index 0000000000..de69b955a2 Binary files /dev/null and b/_darcs/patches/20080824171202-84dde-fd3ed2b9645f2c2ec5439824dbc6f6a765c0a622.gz differ diff --git a/_darcs/patches/20080824200517-84dde-9662d89dbcd948e3ef7b7f8d4e82d90b4891c684.gz b/_darcs/patches/20080824200517-84dde-9662d89dbcd948e3ef7b7f8d4e82d90b4891c684.gz new file mode 100644 index 0000000000..1e1cb55d77 Binary files /dev/null and b/_darcs/patches/20080824200517-84dde-9662d89dbcd948e3ef7b7f8d4e82d90b4891c684.gz differ diff --git a/_darcs/patches/20080825173105-84dde-ea607521c78694fe558514b423f1c6dc0e70241e.gz b/_darcs/patches/20080825173105-84dde-ea607521c78694fe558514b423f1c6dc0e70241e.gz new file mode 100644 index 0000000000..a275497eb9 Binary files /dev/null and b/_darcs/patches/20080825173105-84dde-ea607521c78694fe558514b423f1c6dc0e70241e.gz differ diff --git a/_darcs/patches/20080825182338-84dde-ec0edef9469b294b7e23945f1bc7d810da988ed7.gz b/_darcs/patches/20080825182338-84dde-ec0edef9469b294b7e23945f1bc7d810da988ed7.gz new file mode 100644 index 0000000000..a63d282ba2 Binary files /dev/null and b/_darcs/patches/20080825182338-84dde-ec0edef9469b294b7e23945f1bc7d810da988ed7.gz differ diff --git a/_darcs/patches/20080825183005-84dde-c1d24a057d9545cc6d1f0dc21c5af4ea7316d8e9.gz b/_darcs/patches/20080825183005-84dde-c1d24a057d9545cc6d1f0dc21c5af4ea7316d8e9.gz new file mode 100644 index 0000000000..b28645809b Binary files /dev/null and b/_darcs/patches/20080825183005-84dde-c1d24a057d9545cc6d1f0dc21c5af4ea7316d8e9.gz differ diff --git a/_darcs/patches/20080825184104-84dde-5735c1791002a12c3417603dc85da31ea868f263.gz b/_darcs/patches/20080825184104-84dde-5735c1791002a12c3417603dc85da31ea868f263.gz new file mode 100644 index 0000000000..21c55bf927 Binary files /dev/null and b/_darcs/patches/20080825184104-84dde-5735c1791002a12c3417603dc85da31ea868f263.gz differ diff --git a/_darcs/patches/20080825185245-84dde-f2ad86c1aedc2a42f7b468775234be53a7e84d5b.gz b/_darcs/patches/20080825185245-84dde-f2ad86c1aedc2a42f7b468775234be53a7e84d5b.gz new file mode 100644 index 0000000000..8930056025 Binary files /dev/null and b/_darcs/patches/20080825185245-84dde-f2ad86c1aedc2a42f7b468775234be53a7e84d5b.gz differ diff --git a/_darcs/patches/20080825192946-84dde-c48e79699e5c0bc51ce5ab1fa921c49abbf2c4f5.gz b/_darcs/patches/20080825192946-84dde-c48e79699e5c0bc51ce5ab1fa921c49abbf2c4f5.gz new file mode 100644 index 0000000000..d8c715d933 Binary files /dev/null and b/_darcs/patches/20080825192946-84dde-c48e79699e5c0bc51ce5ab1fa921c49abbf2c4f5.gz differ diff --git a/_darcs/patches/20080825193149-84dde-dcb4fd0fbe5cba621d02dd3436daa69505200ccd.gz b/_darcs/patches/20080825193149-84dde-dcb4fd0fbe5cba621d02dd3436daa69505200ccd.gz new file mode 100644 index 0000000000..df2a69ee09 Binary files /dev/null and b/_darcs/patches/20080825193149-84dde-dcb4fd0fbe5cba621d02dd3436daa69505200ccd.gz differ diff --git a/_darcs/patches/20080825193235-84dde-fb91c560029b3aa7c73709dba57e00d3cc7f5122.gz b/_darcs/patches/20080825193235-84dde-fb91c560029b3aa7c73709dba57e00d3cc7f5122.gz new file mode 100644 index 0000000000..91ac001d8b Binary files /dev/null and b/_darcs/patches/20080825193235-84dde-fb91c560029b3aa7c73709dba57e00d3cc7f5122.gz differ diff --git a/_darcs/patches/20080825193333-84dde-d02930a6e8c2333cbaa3ec4cddb7e31d1cbaf3eb.gz b/_darcs/patches/20080825193333-84dde-d02930a6e8c2333cbaa3ec4cddb7e31d1cbaf3eb.gz new file mode 100644 index 0000000000..4b3bc5ec9a Binary files /dev/null and b/_darcs/patches/20080825193333-84dde-d02930a6e8c2333cbaa3ec4cddb7e31d1cbaf3eb.gz differ diff --git a/_darcs/patches/20080825193450-84dde-a9a2e16b65c21a22adcb5574c4040d401513e961.gz b/_darcs/patches/20080825193450-84dde-a9a2e16b65c21a22adcb5574c4040d401513e961.gz new file mode 100644 index 0000000000..599e8954ff Binary files /dev/null and b/_darcs/patches/20080825193450-84dde-a9a2e16b65c21a22adcb5574c4040d401513e961.gz differ diff --git a/_darcs/patches/20080825193738-84dde-d58e63ee015a52ccf065d17a2fc16d2d1899f805.gz b/_darcs/patches/20080825193738-84dde-d58e63ee015a52ccf065d17a2fc16d2d1899f805.gz new file mode 100644 index 0000000000..0844f9e7f5 Binary files /dev/null and b/_darcs/patches/20080825193738-84dde-d58e63ee015a52ccf065d17a2fc16d2d1899f805.gz differ diff --git a/_darcs/patches/20080826021227-84dde-22f709bf330bcfa46b93eadd11700723bf640a6b.gz b/_darcs/patches/20080826021227-84dde-22f709bf330bcfa46b93eadd11700723bf640a6b.gz new file mode 100644 index 0000000000..bc5dd263de Binary files /dev/null and b/_darcs/patches/20080826021227-84dde-22f709bf330bcfa46b93eadd11700723bf640a6b.gz differ diff --git a/_darcs/patches/20080826023116-84dde-7d80c624b2dcfa637f58509c1d5ff7eca371512c.gz b/_darcs/patches/20080826023116-84dde-7d80c624b2dcfa637f58509c1d5ff7eca371512c.gz new file mode 100644 index 0000000000..810323b27b Binary files /dev/null and b/_darcs/patches/20080826023116-84dde-7d80c624b2dcfa637f58509c1d5ff7eca371512c.gz differ diff --git a/_darcs/patches/20080826024015-84dde-4258c99348f5d665d99a82cf50444fab9391336c.gz b/_darcs/patches/20080826024015-84dde-4258c99348f5d665d99a82cf50444fab9391336c.gz new file mode 100644 index 0000000000..a370244082 Binary files /dev/null and b/_darcs/patches/20080826024015-84dde-4258c99348f5d665d99a82cf50444fab9391336c.gz differ diff --git a/_darcs/patches/20080826131814-84dde-2c4a809c6fb666dfb4b96d0d61205fe418f4e4b4.gz b/_darcs/patches/20080826131814-84dde-2c4a809c6fb666dfb4b96d0d61205fe418f4e4b4.gz new file mode 100644 index 0000000000..d1594fc960 Binary files /dev/null and b/_darcs/patches/20080826131814-84dde-2c4a809c6fb666dfb4b96d0d61205fe418f4e4b4.gz differ diff --git a/_darcs/patches/20080826200057-f6e2c-fb9a88251d034824218d20b3fefcde96ddaef827.gz b/_darcs/patches/20080826200057-f6e2c-fb9a88251d034824218d20b3fefcde96ddaef827.gz new file mode 100644 index 0000000000..2e2eb66f61 Binary files /dev/null and b/_darcs/patches/20080826200057-f6e2c-fb9a88251d034824218d20b3fefcde96ddaef827.gz differ diff --git a/_darcs/patches/20080826205341-84dde-04c1641f4b9c5aa5318b76512664ee9df170d779.gz b/_darcs/patches/20080826205341-84dde-04c1641f4b9c5aa5318b76512664ee9df170d779.gz new file mode 100644 index 0000000000..8e6bae54ab Binary files /dev/null and b/_darcs/patches/20080826205341-84dde-04c1641f4b9c5aa5318b76512664ee9df170d779.gz differ diff --git a/_darcs/patches/20080826210314-84dde-34d4eb71c7d74b65c0c4b486f345ed7d9301af15.gz b/_darcs/patches/20080826210314-84dde-34d4eb71c7d74b65c0c4b486f345ed7d9301af15.gz new file mode 100644 index 0000000000..c3a90e922b Binary files /dev/null and b/_darcs/patches/20080826210314-84dde-34d4eb71c7d74b65c0c4b486f345ed7d9301af15.gz differ diff --git a/_darcs/patches/20080826211108-84dde-b277bdb1476b9cec0c0d93fa8d565c4642ba16c8.gz b/_darcs/patches/20080826211108-84dde-b277bdb1476b9cec0c0d93fa8d565c4642ba16c8.gz new file mode 100644 index 0000000000..d33353b794 Binary files /dev/null and b/_darcs/patches/20080826211108-84dde-b277bdb1476b9cec0c0d93fa8d565c4642ba16c8.gz differ diff --git a/_darcs/patches/20080826225615-462f3-8d881eda7be43623e10b83e8d1e157f4096734cd.gz b/_darcs/patches/20080826225615-462f3-8d881eda7be43623e10b83e8d1e157f4096734cd.gz new file mode 100644 index 0000000000..bf83795123 Binary files /dev/null and b/_darcs/patches/20080826225615-462f3-8d881eda7be43623e10b83e8d1e157f4096734cd.gz differ diff --git a/_darcs/patches/20080827000327-7b5ce-453aad833576b9c76e19b8aa3ba34b24203dd377.gz b/_darcs/patches/20080827000327-7b5ce-453aad833576b9c76e19b8aa3ba34b24203dd377.gz new file mode 100644 index 0000000000..349a0f9c4c Binary files /dev/null and b/_darcs/patches/20080827000327-7b5ce-453aad833576b9c76e19b8aa3ba34b24203dd377.gz differ diff --git a/_darcs/patches/20080827001348-84dde-de452a1120aba995355aa616cf416bb6b617566c.gz b/_darcs/patches/20080827001348-84dde-de452a1120aba995355aa616cf416bb6b617566c.gz new file mode 100644 index 0000000000..8ab220a6b6 Binary files /dev/null and b/_darcs/patches/20080827001348-84dde-de452a1120aba995355aa616cf416bb6b617566c.gz differ diff --git a/_darcs/patches/20080827001927-84dde-b50e5d921ca3f2fb894821730ff93cac09d2ba66.gz b/_darcs/patches/20080827001927-84dde-b50e5d921ca3f2fb894821730ff93cac09d2ba66.gz new file mode 100644 index 0000000000..16fe4dad3c Binary files /dev/null and b/_darcs/patches/20080827001927-84dde-b50e5d921ca3f2fb894821730ff93cac09d2ba66.gz differ diff --git a/_darcs/patches/20080827003529-84dde-614dc517061e76d180823c0aaf3fc9f434f6480c.gz b/_darcs/patches/20080827003529-84dde-614dc517061e76d180823c0aaf3fc9f434f6480c.gz new file mode 100644 index 0000000000..b0f709acbd Binary files /dev/null and b/_darcs/patches/20080827003529-84dde-614dc517061e76d180823c0aaf3fc9f434f6480c.gz differ diff --git a/_darcs/patches/20080827004410-84dde-226101a8482f511ff9df7546342f84dd94ceca54.gz b/_darcs/patches/20080827004410-84dde-226101a8482f511ff9df7546342f84dd94ceca54.gz new file mode 100644 index 0000000000..25fd16f67a Binary files /dev/null and b/_darcs/patches/20080827004410-84dde-226101a8482f511ff9df7546342f84dd94ceca54.gz differ diff --git a/_darcs/patches/20080827004755-84dde-d3275abf281b1d4790806357d3d0bcba634f28f3.gz b/_darcs/patches/20080827004755-84dde-d3275abf281b1d4790806357d3d0bcba634f28f3.gz new file mode 100644 index 0000000000..40cd00bc8b Binary files /dev/null and b/_darcs/patches/20080827004755-84dde-d3275abf281b1d4790806357d3d0bcba634f28f3.gz differ diff --git a/_darcs/patches/20080827004854-84dde-a558664ac7f02ff319e3c29ac4516f491abef29a.gz b/_darcs/patches/20080827004854-84dde-a558664ac7f02ff319e3c29ac4516f491abef29a.gz new file mode 100644 index 0000000000..d8059e218f Binary files /dev/null and b/_darcs/patches/20080827004854-84dde-a558664ac7f02ff319e3c29ac4516f491abef29a.gz differ diff --git a/_darcs/patches/20080827005155-84dde-02a097e286800519fe5294cb7005ead533db478f.gz b/_darcs/patches/20080827005155-84dde-02a097e286800519fe5294cb7005ead533db478f.gz new file mode 100644 index 0000000000..7df31ee04e Binary files /dev/null and b/_darcs/patches/20080827005155-84dde-02a097e286800519fe5294cb7005ead533db478f.gz differ diff --git a/_darcs/patches/20080827005418-84dde-7e7a4be646c520542e8c065ba90ba759c100b481.gz b/_darcs/patches/20080827005418-84dde-7e7a4be646c520542e8c065ba90ba759c100b481.gz new file mode 100644 index 0000000000..26a1f06eac Binary files /dev/null and b/_darcs/patches/20080827005418-84dde-7e7a4be646c520542e8c065ba90ba759c100b481.gz differ diff --git a/_darcs/patches/20080827005444-7b5ce-2b53a2c1a917539248b68f21f94e0f9f5fe810f2.gz b/_darcs/patches/20080827005444-7b5ce-2b53a2c1a917539248b68f21f94e0f9f5fe810f2.gz new file mode 100644 index 0000000000..c8661f20f8 Binary files /dev/null and b/_darcs/patches/20080827005444-7b5ce-2b53a2c1a917539248b68f21f94e0f9f5fe810f2.gz differ diff --git a/_darcs/patches/20080827010138-84dde-db15d5a4408a9cca08822b4c4946e2dfc60ea3db.gz b/_darcs/patches/20080827010138-84dde-db15d5a4408a9cca08822b4c4946e2dfc60ea3db.gz new file mode 100644 index 0000000000..fa9375d212 Binary files /dev/null and b/_darcs/patches/20080827010138-84dde-db15d5a4408a9cca08822b4c4946e2dfc60ea3db.gz differ diff --git a/_darcs/patches/20080827010515-84dde-f4dd776209a0aa4f6a7e9d6ac1de46d83ff54650.gz b/_darcs/patches/20080827010515-84dde-f4dd776209a0aa4f6a7e9d6ac1de46d83ff54650.gz new file mode 100644 index 0000000000..589493a3e4 Binary files /dev/null and b/_darcs/patches/20080827010515-84dde-f4dd776209a0aa4f6a7e9d6ac1de46d83ff54650.gz differ diff --git a/_darcs/patches/20080827011921-84dde-622d4c8eab1b05ce999bba4554b85c08a5840c79.gz b/_darcs/patches/20080827011921-84dde-622d4c8eab1b05ce999bba4554b85c08a5840c79.gz new file mode 100644 index 0000000000..dfbe8f0d84 Binary files /dev/null and b/_darcs/patches/20080827011921-84dde-622d4c8eab1b05ce999bba4554b85c08a5840c79.gz differ diff --git a/_darcs/patches/20080827013835-84dde-f112bbda4d8d00f47147098ff6140f355610843c.gz b/_darcs/patches/20080827013835-84dde-f112bbda4d8d00f47147098ff6140f355610843c.gz new file mode 100644 index 0000000000..d77c4c1d99 Binary files /dev/null and b/_darcs/patches/20080827013835-84dde-f112bbda4d8d00f47147098ff6140f355610843c.gz differ diff --git a/_darcs/patches/20080827015010-84dde-d5ed6a0a290273e400b71e4623a54ac88ee29173.gz b/_darcs/patches/20080827015010-84dde-d5ed6a0a290273e400b71e4623a54ac88ee29173.gz new file mode 100644 index 0000000000..db7f35f455 Binary files /dev/null and b/_darcs/patches/20080827015010-84dde-d5ed6a0a290273e400b71e4623a54ac88ee29173.gz differ diff --git a/_darcs/patches/20080827021635-7b5ce-9b96743999aa85a505aecd5f25867937f0c34434.gz b/_darcs/patches/20080827021635-7b5ce-9b96743999aa85a505aecd5f25867937f0c34434.gz new file mode 100644 index 0000000000..5a57787bc8 Binary files /dev/null and b/_darcs/patches/20080827021635-7b5ce-9b96743999aa85a505aecd5f25867937f0c34434.gz differ diff --git a/_darcs/patches/20080827032423-84dde-90a4d5931c2292c9ec5febd0c90ed18f6ab93e90.gz b/_darcs/patches/20080827032423-84dde-90a4d5931c2292c9ec5febd0c90ed18f6ab93e90.gz new file mode 100644 index 0000000000..197d2fa396 Binary files /dev/null and b/_darcs/patches/20080827032423-84dde-90a4d5931c2292c9ec5febd0c90ed18f6ab93e90.gz differ diff --git a/_darcs/patches/20080827124430-84dde-654751781702f5518153a01aa3dae4a8580b7f35.gz b/_darcs/patches/20080827124430-84dde-654751781702f5518153a01aa3dae4a8580b7f35.gz new file mode 100644 index 0000000000..c961c2d6dc Binary files /dev/null and b/_darcs/patches/20080827124430-84dde-654751781702f5518153a01aa3dae4a8580b7f35.gz differ diff --git a/_darcs/patches/20080827131603-84dde-7be64f28840a29c5833bc625aaf6cb8f07b891e5.gz b/_darcs/patches/20080827131603-84dde-7be64f28840a29c5833bc625aaf6cb8f07b891e5.gz new file mode 100644 index 0000000000..ae4dcc5ba9 Binary files /dev/null and b/_darcs/patches/20080827131603-84dde-7be64f28840a29c5833bc625aaf6cb8f07b891e5.gz differ diff --git a/_darcs/patches/20080827132346-84dde-c5499ac960fbb28bced28ff9355846f7183fcb5c.gz b/_darcs/patches/20080827132346-84dde-c5499ac960fbb28bced28ff9355846f7183fcb5c.gz new file mode 100644 index 0000000000..9b7c7603f1 Binary files /dev/null and b/_darcs/patches/20080827132346-84dde-c5499ac960fbb28bced28ff9355846f7183fcb5c.gz differ diff --git a/_darcs/patches/20080827133048-84dde-cb99ac89c65008a8832395684386518718247887.gz b/_darcs/patches/20080827133048-84dde-cb99ac89c65008a8832395684386518718247887.gz new file mode 100644 index 0000000000..c923bea053 Binary files /dev/null and b/_darcs/patches/20080827133048-84dde-cb99ac89c65008a8832395684386518718247887.gz differ diff --git a/_darcs/patches/20080827135422-84dde-857d6e980e18803186d080a60eea60f1362bb348.gz b/_darcs/patches/20080827135422-84dde-857d6e980e18803186d080a60eea60f1362bb348.gz new file mode 100644 index 0000000000..0ef8534f3d Binary files /dev/null and b/_darcs/patches/20080827135422-84dde-857d6e980e18803186d080a60eea60f1362bb348.gz differ diff --git a/_darcs/patches/20080827142336-84dde-2bec2149d86900fd0291f8c00f85aa756842bbe1.gz b/_darcs/patches/20080827142336-84dde-2bec2149d86900fd0291f8c00f85aa756842bbe1.gz new file mode 100644 index 0000000000..9c2a411f5d Binary files /dev/null and b/_darcs/patches/20080827142336-84dde-2bec2149d86900fd0291f8c00f85aa756842bbe1.gz differ diff --git a/_darcs/patches/20080827185817-84dde-d6de1bcb00d1e3e49f6e669a921feadb6f27d672.gz b/_darcs/patches/20080827185817-84dde-d6de1bcb00d1e3e49f6e669a921feadb6f27d672.gz new file mode 100644 index 0000000000..6e74ff3227 Binary files /dev/null and b/_darcs/patches/20080827185817-84dde-d6de1bcb00d1e3e49f6e669a921feadb6f27d672.gz differ diff --git a/_darcs/patches/20080827205407-84dde-97884a12f5f4e54c93bc785bd280683d1ee7e749.gz b/_darcs/patches/20080827205407-84dde-97884a12f5f4e54c93bc785bd280683d1ee7e749.gz new file mode 100644 index 0000000000..fd09b47441 Binary files /dev/null and b/_darcs/patches/20080827205407-84dde-97884a12f5f4e54c93bc785bd280683d1ee7e749.gz differ diff --git a/_darcs/patches/20080827210429-84dde-90c22dbee16f74f53464dcd538a6dbcf49db4f28.gz b/_darcs/patches/20080827210429-84dde-90c22dbee16f74f53464dcd538a6dbcf49db4f28.gz new file mode 100644 index 0000000000..9b6c4422e5 Binary files /dev/null and b/_darcs/patches/20080827210429-84dde-90c22dbee16f74f53464dcd538a6dbcf49db4f28.gz differ diff --git a/_darcs/patches/20080827211239-84dde-db118799bfd43be62fb02380829c64813c9334f8.gz b/_darcs/patches/20080827211239-84dde-db118799bfd43be62fb02380829c64813c9334f8.gz new file mode 100644 index 0000000000..a8226748df Binary files /dev/null and b/_darcs/patches/20080827211239-84dde-db118799bfd43be62fb02380829c64813c9334f8.gz differ diff --git a/_darcs/patches/20080827211940-84dde-d5b404023a2fb6b74b6255dd91910c9ec7df3cc6.gz b/_darcs/patches/20080827211940-84dde-d5b404023a2fb6b74b6255dd91910c9ec7df3cc6.gz new file mode 100644 index 0000000000..9c4e42778e Binary files /dev/null and b/_darcs/patches/20080827211940-84dde-d5b404023a2fb6b74b6255dd91910c9ec7df3cc6.gz differ diff --git a/_darcs/patches/20080828001414-d018c-fa900f60f0af20c01e8b83a74834ddf46829f4b2.gz b/_darcs/patches/20080828001414-d018c-fa900f60f0af20c01e8b83a74834ddf46829f4b2.gz new file mode 100644 index 0000000000..bf11fc5e6d Binary files /dev/null and b/_darcs/patches/20080828001414-d018c-fa900f60f0af20c01e8b83a74834ddf46829f4b2.gz differ diff --git a/_darcs/patches/20080828001936-84dde-e4ec2fef30c49d1254d5358624a4391930811832.gz b/_darcs/patches/20080828001936-84dde-e4ec2fef30c49d1254d5358624a4391930811832.gz new file mode 100644 index 0000000000..c70b6635c1 Binary files /dev/null and b/_darcs/patches/20080828001936-84dde-e4ec2fef30c49d1254d5358624a4391930811832.gz differ diff --git a/_darcs/patches/20080828002610-84dde-d9cb46cb08ac50b8efbdf5683baeb2de168fc4b1.gz b/_darcs/patches/20080828002610-84dde-d9cb46cb08ac50b8efbdf5683baeb2de168fc4b1.gz new file mode 100644 index 0000000000..0b8e994403 Binary files /dev/null and b/_darcs/patches/20080828002610-84dde-d9cb46cb08ac50b8efbdf5683baeb2de168fc4b1.gz differ diff --git a/_darcs/patches/20080828003013-84dde-7c8323ef348960f58590e872b2c4ab37107ba60a.gz b/_darcs/patches/20080828003013-84dde-7c8323ef348960f58590e872b2c4ab37107ba60a.gz new file mode 100644 index 0000000000..12db4d1df6 Binary files /dev/null and b/_darcs/patches/20080828003013-84dde-7c8323ef348960f58590e872b2c4ab37107ba60a.gz differ diff --git a/_darcs/patches/20080828003829-84dde-dc44674785f853ebf37861e5e91fb0e0366258e9.gz b/_darcs/patches/20080828003829-84dde-dc44674785f853ebf37861e5e91fb0e0366258e9.gz new file mode 100644 index 0000000000..0de1c09e58 Binary files /dev/null and b/_darcs/patches/20080828003829-84dde-dc44674785f853ebf37861e5e91fb0e0366258e9.gz differ diff --git a/_darcs/patches/20080828004224-84dde-01ba0a7b9105629b1eb8a28a1a9702912e7e9da6.gz b/_darcs/patches/20080828004224-84dde-01ba0a7b9105629b1eb8a28a1a9702912e7e9da6.gz new file mode 100644 index 0000000000..e7c9065c6c Binary files /dev/null and b/_darcs/patches/20080828004224-84dde-01ba0a7b9105629b1eb8a28a1a9702912e7e9da6.gz differ diff --git a/_darcs/patches/20080828004503-84dde-c406172d750d0a5452d5cc62ecd7b27db381c575.gz b/_darcs/patches/20080828004503-84dde-c406172d750d0a5452d5cc62ecd7b27db381c575.gz new file mode 100644 index 0000000000..eb323a751e Binary files /dev/null and b/_darcs/patches/20080828004503-84dde-c406172d750d0a5452d5cc62ecd7b27db381c575.gz differ diff --git a/_darcs/patches/20080828005323-84dde-8f69e1e6115faa544c22436539148dac53ed6f65.gz b/_darcs/patches/20080828005323-84dde-8f69e1e6115faa544c22436539148dac53ed6f65.gz new file mode 100644 index 0000000000..0f7e03cc5c Binary files /dev/null and b/_darcs/patches/20080828005323-84dde-8f69e1e6115faa544c22436539148dac53ed6f65.gz differ diff --git a/_darcs/patches/20080828011002-84dde-8099da64841ab137e915249025857f34084c0f34.gz b/_darcs/patches/20080828011002-84dde-8099da64841ab137e915249025857f34084c0f34.gz new file mode 100644 index 0000000000..68b6757506 Binary files /dev/null and b/_darcs/patches/20080828011002-84dde-8099da64841ab137e915249025857f34084c0f34.gz differ diff --git a/_darcs/patches/20080828012619-84dde-f7e993f345220d3642743e9f2567d7f8e6e4b6ce.gz b/_darcs/patches/20080828012619-84dde-f7e993f345220d3642743e9f2567d7f8e6e4b6ce.gz new file mode 100644 index 0000000000..5db286a83e Binary files /dev/null and b/_darcs/patches/20080828012619-84dde-f7e993f345220d3642743e9f2567d7f8e6e4b6ce.gz differ diff --git a/_darcs/patches/20080828012635-84dde-166baf7800333ee79a6bad2e5427ac7623c7614f.gz b/_darcs/patches/20080828012635-84dde-166baf7800333ee79a6bad2e5427ac7623c7614f.gz new file mode 100644 index 0000000000..0873c9f4cb Binary files /dev/null and b/_darcs/patches/20080828012635-84dde-166baf7800333ee79a6bad2e5427ac7623c7614f.gz differ diff --git a/_darcs/patches/20080828072205-7b5ce-16510357343f1d9a3acc696f39a28a723005f3a4.gz b/_darcs/patches/20080828072205-7b5ce-16510357343f1d9a3acc696f39a28a723005f3a4.gz new file mode 100644 index 0000000000..f533402550 Binary files /dev/null and b/_darcs/patches/20080828072205-7b5ce-16510357343f1d9a3acc696f39a28a723005f3a4.gz differ diff --git a/_darcs/patches/20080828134856-84dde-271585ac7d76f8f0d615e9f641dfbc25c61bfb28.gz b/_darcs/patches/20080828134856-84dde-271585ac7d76f8f0d615e9f641dfbc25c61bfb28.gz new file mode 100644 index 0000000000..24817235b2 Binary files /dev/null and b/_darcs/patches/20080828134856-84dde-271585ac7d76f8f0d615e9f641dfbc25c61bfb28.gz differ diff --git a/_darcs/patches/20080828135011-84dde-40b44db4416cf83b8929bb0ed77741ed0f177f14.gz b/_darcs/patches/20080828135011-84dde-40b44db4416cf83b8929bb0ed77741ed0f177f14.gz new file mode 100644 index 0000000000..45c8f4b321 Binary files /dev/null and b/_darcs/patches/20080828135011-84dde-40b44db4416cf83b8929bb0ed77741ed0f177f14.gz differ diff --git a/_darcs/patches/20080828192509-7b5ce-8387c67500c082eb5a0107c0f78d4cf5620825af.gz b/_darcs/patches/20080828192509-7b5ce-8387c67500c082eb5a0107c0f78d4cf5620825af.gz new file mode 100644 index 0000000000..5082f4b950 Binary files /dev/null and b/_darcs/patches/20080828192509-7b5ce-8387c67500c082eb5a0107c0f78d4cf5620825af.gz differ diff --git a/_darcs/patches/20080828221420-84dde-713f564d28d2e548a09a325443b37d6dc1e9a7e7.gz b/_darcs/patches/20080828221420-84dde-713f564d28d2e548a09a325443b37d6dc1e9a7e7.gz new file mode 100644 index 0000000000..bade02c84a Binary files /dev/null and b/_darcs/patches/20080828221420-84dde-713f564d28d2e548a09a325443b37d6dc1e9a7e7.gz differ diff --git a/_darcs/patches/20080829014515-84dde-bce51f66ba0b3b4347a55a70b2b266b72c242304.gz b/_darcs/patches/20080829014515-84dde-bce51f66ba0b3b4347a55a70b2b266b72c242304.gz new file mode 100644 index 0000000000..fcf9d599e3 Binary files /dev/null and b/_darcs/patches/20080829014515-84dde-bce51f66ba0b3b4347a55a70b2b266b72c242304.gz differ diff --git a/_darcs/patches/20080829015304-84dde-1c93203bdfbd4c1696cdd3c07212ff16a9f727dd.gz b/_darcs/patches/20080829015304-84dde-1c93203bdfbd4c1696cdd3c07212ff16a9f727dd.gz new file mode 100644 index 0000000000..d54b709997 Binary files /dev/null and b/_darcs/patches/20080829015304-84dde-1c93203bdfbd4c1696cdd3c07212ff16a9f727dd.gz differ diff --git a/_darcs/patches/20080829021854-84dde-818492a31c07dd0921c2a693095ca7ac901b6d35.gz b/_darcs/patches/20080829021854-84dde-818492a31c07dd0921c2a693095ca7ac901b6d35.gz new file mode 100644 index 0000000000..3f48766f0f Binary files /dev/null and b/_darcs/patches/20080829021854-84dde-818492a31c07dd0921c2a693095ca7ac901b6d35.gz differ diff --git a/_darcs/patches/20080829023731-84dde-8920bbaf1e1f171829d0acff3f89ec987deb6368.gz b/_darcs/patches/20080829023731-84dde-8920bbaf1e1f171829d0acff3f89ec987deb6368.gz new file mode 100644 index 0000000000..ada2f15e3c Binary files /dev/null and b/_darcs/patches/20080829023731-84dde-8920bbaf1e1f171829d0acff3f89ec987deb6368.gz differ diff --git a/_darcs/patches/20080829023919-84dde-38e4bf6bddc120a221af5f856d9f88b7a532096b.gz b/_darcs/patches/20080829023919-84dde-38e4bf6bddc120a221af5f856d9f88b7a532096b.gz new file mode 100644 index 0000000000..20c44a775c Binary files /dev/null and b/_darcs/patches/20080829023919-84dde-38e4bf6bddc120a221af5f856d9f88b7a532096b.gz differ diff --git a/_darcs/patches/20080829025127-84dde-b3e2eb64b7dd8302037f471f6dba6949e2e15ecc.gz b/_darcs/patches/20080829025127-84dde-b3e2eb64b7dd8302037f471f6dba6949e2e15ecc.gz new file mode 100644 index 0000000000..da40702d27 Binary files /dev/null and b/_darcs/patches/20080829025127-84dde-b3e2eb64b7dd8302037f471f6dba6949e2e15ecc.gz differ diff --git a/_darcs/patches/20080829025559-84dde-bd29b5e6750a1ff72bd39e8e76bde325b0313fb8.gz b/_darcs/patches/20080829025559-84dde-bd29b5e6750a1ff72bd39e8e76bde325b0313fb8.gz new file mode 100644 index 0000000000..0e8180fddd Binary files /dev/null and b/_darcs/patches/20080829025559-84dde-bd29b5e6750a1ff72bd39e8e76bde325b0313fb8.gz differ diff --git a/_darcs/patches/20080829034854-84dde-a636b446dc254aaa77ac65f63be01e49c192bf32.gz b/_darcs/patches/20080829034854-84dde-a636b446dc254aaa77ac65f63be01e49c192bf32.gz new file mode 100644 index 0000000000..0ab76b71c7 Binary files /dev/null and b/_darcs/patches/20080829034854-84dde-a636b446dc254aaa77ac65f63be01e49c192bf32.gz differ diff --git a/_darcs/patches/20080829035118-7b5ce-57613e88b29617ea422c7f7003e81ef885e3debb.gz b/_darcs/patches/20080829035118-7b5ce-57613e88b29617ea422c7f7003e81ef885e3debb.gz new file mode 100644 index 0000000000..5d2db8484b Binary files /dev/null and b/_darcs/patches/20080829035118-7b5ce-57613e88b29617ea422c7f7003e81ef885e3debb.gz differ diff --git a/_darcs/patches/20080829035707-7b5ce-69a9ff98390ff8b9671ede948d78fdb37371aac6.gz b/_darcs/patches/20080829035707-7b5ce-69a9ff98390ff8b9671ede948d78fdb37371aac6.gz new file mode 100644 index 0000000000..84ee1c4d4f Binary files /dev/null and b/_darcs/patches/20080829035707-7b5ce-69a9ff98390ff8b9671ede948d78fdb37371aac6.gz differ diff --git a/_darcs/patches/20080829035934-84dde-cf36fd802bed76fdf15ac39b838494a414d5cc1e.gz b/_darcs/patches/20080829035934-84dde-cf36fd802bed76fdf15ac39b838494a414d5cc1e.gz new file mode 100644 index 0000000000..23e028a49f Binary files /dev/null and b/_darcs/patches/20080829035934-84dde-cf36fd802bed76fdf15ac39b838494a414d5cc1e.gz differ diff --git a/_darcs/patches/20080829040925-84dde-7195734eeb3df6439c099c1139caf77e2c2ea3c1.gz b/_darcs/patches/20080829040925-84dde-7195734eeb3df6439c099c1139caf77e2c2ea3c1.gz new file mode 100644 index 0000000000..b6305fdda1 Binary files /dev/null and b/_darcs/patches/20080829040925-84dde-7195734eeb3df6439c099c1139caf77e2c2ea3c1.gz differ diff --git a/_darcs/patches/20080829042908-84dde-1d1a22dfd3d89c5521aeb9069dc64c5f6dad3a27.gz b/_darcs/patches/20080829042908-84dde-1d1a22dfd3d89c5521aeb9069dc64c5f6dad3a27.gz new file mode 100644 index 0000000000..dd7c5ea249 Binary files /dev/null and b/_darcs/patches/20080829042908-84dde-1d1a22dfd3d89c5521aeb9069dc64c5f6dad3a27.gz differ diff --git a/_darcs/patches/20080829043909-84dde-c70a633c93ab89560bc300817bda66eebf6176cf.gz b/_darcs/patches/20080829043909-84dde-c70a633c93ab89560bc300817bda66eebf6176cf.gz new file mode 100644 index 0000000000..dc2986fb3c Binary files /dev/null and b/_darcs/patches/20080829043909-84dde-c70a633c93ab89560bc300817bda66eebf6176cf.gz differ diff --git a/_darcs/patches/20080829045441-7b5ce-a1382496d8d6b043a1a72c0fb32051f1b43163c8.gz b/_darcs/patches/20080829045441-7b5ce-a1382496d8d6b043a1a72c0fb32051f1b43163c8.gz new file mode 100644 index 0000000000..2f4ee3c7c5 Binary files /dev/null and b/_darcs/patches/20080829045441-7b5ce-a1382496d8d6b043a1a72c0fb32051f1b43163c8.gz differ diff --git a/_darcs/patches/20080829045724-7b5ce-66fdc5e54155012e41eb09c6a41bc94619bf520f.gz b/_darcs/patches/20080829045724-7b5ce-66fdc5e54155012e41eb09c6a41bc94619bf520f.gz new file mode 100644 index 0000000000..116257dc99 Binary files /dev/null and b/_darcs/patches/20080829045724-7b5ce-66fdc5e54155012e41eb09c6a41bc94619bf520f.gz differ diff --git a/_darcs/patches/20080829051104-84dde-9bd23c28c2c8a720046060a33ff3e5f246c47116.gz b/_darcs/patches/20080829051104-84dde-9bd23c28c2c8a720046060a33ff3e5f246c47116.gz new file mode 100644 index 0000000000..44d59b6446 Binary files /dev/null and b/_darcs/patches/20080829051104-84dde-9bd23c28c2c8a720046060a33ff3e5f246c47116.gz differ diff --git a/_darcs/patches/20080829051628-84dde-2a339a35c422afb9ec04f757771764ed43b2c28b.gz b/_darcs/patches/20080829051628-84dde-2a339a35c422afb9ec04f757771764ed43b2c28b.gz new file mode 100644 index 0000000000..7e16f2f208 Binary files /dev/null and b/_darcs/patches/20080829051628-84dde-2a339a35c422afb9ec04f757771764ed43b2c28b.gz differ diff --git a/_darcs/patches/20080829052732-84dde-0ebb7e32236b480cc3aa2eb7a4bb2b41ff6177d6.gz b/_darcs/patches/20080829052732-84dde-0ebb7e32236b480cc3aa2eb7a4bb2b41ff6177d6.gz new file mode 100644 index 0000000000..2dd159b13e Binary files /dev/null and b/_darcs/patches/20080829052732-84dde-0ebb7e32236b480cc3aa2eb7a4bb2b41ff6177d6.gz differ diff --git a/_darcs/patches/20080829052824-7b5ce-39a8fd299b7a85793ad7a19fe00c93813ca882b6.gz b/_darcs/patches/20080829052824-7b5ce-39a8fd299b7a85793ad7a19fe00c93813ca882b6.gz new file mode 100644 index 0000000000..300581f063 Binary files /dev/null and b/_darcs/patches/20080829052824-7b5ce-39a8fd299b7a85793ad7a19fe00c93813ca882b6.gz differ diff --git a/_darcs/patches/20080829052847-84dde-a64918a75f8300ec8fb230202881691066147652.gz b/_darcs/patches/20080829052847-84dde-a64918a75f8300ec8fb230202881691066147652.gz new file mode 100644 index 0000000000..274a93aa27 Binary files /dev/null and b/_darcs/patches/20080829052847-84dde-a64918a75f8300ec8fb230202881691066147652.gz differ diff --git a/_darcs/patches/20080829053337-7b5ce-6d94638c57d185e5d44e02ad458593a3f4de36d9.gz b/_darcs/patches/20080829053337-7b5ce-6d94638c57d185e5d44e02ad458593a3f4de36d9.gz new file mode 100644 index 0000000000..5de47fd821 Binary files /dev/null and b/_darcs/patches/20080829053337-7b5ce-6d94638c57d185e5d44e02ad458593a3f4de36d9.gz differ diff --git a/_darcs/patches/20080829054017-84dde-c9268e5c815934dcbca2451dd6c9016f2ac4a03a.gz b/_darcs/patches/20080829054017-84dde-c9268e5c815934dcbca2451dd6c9016f2ac4a03a.gz new file mode 100644 index 0000000000..57d0cd34d8 Binary files /dev/null and b/_darcs/patches/20080829054017-84dde-c9268e5c815934dcbca2451dd6c9016f2ac4a03a.gz differ diff --git a/_darcs/patches/20080829054038-7b5ce-d0503a8eb7f89a9d2de4aadd4550f4342b943b09.gz b/_darcs/patches/20080829054038-7b5ce-d0503a8eb7f89a9d2de4aadd4550f4342b943b09.gz new file mode 100644 index 0000000000..6456d58ba2 Binary files /dev/null and b/_darcs/patches/20080829054038-7b5ce-d0503a8eb7f89a9d2de4aadd4550f4342b943b09.gz differ diff --git a/_darcs/patches/20080829174012-84dde-4859ce0a34a50080f8376fa3278c3aa3e3a3046d.gz b/_darcs/patches/20080829174012-84dde-4859ce0a34a50080f8376fa3278c3aa3e3a3046d.gz new file mode 100644 index 0000000000..81ca3dfc87 Binary files /dev/null and b/_darcs/patches/20080829174012-84dde-4859ce0a34a50080f8376fa3278c3aa3e3a3046d.gz differ diff --git a/_darcs/patches/20080829181702-84dde-594505aa73d2380b13bd98917b70b02bac597d12.gz b/_darcs/patches/20080829181702-84dde-594505aa73d2380b13bd98917b70b02bac597d12.gz new file mode 100644 index 0000000000..6f6560096f Binary files /dev/null and b/_darcs/patches/20080829181702-84dde-594505aa73d2380b13bd98917b70b02bac597d12.gz differ diff --git a/_darcs/patches/20080829182112-84dde-c29ccd959e19e18cc2ceac1ba701f351f914c26b.gz b/_darcs/patches/20080829182112-84dde-c29ccd959e19e18cc2ceac1ba701f351f914c26b.gz new file mode 100644 index 0000000000..59e86a6ad8 Binary files /dev/null and b/_darcs/patches/20080829182112-84dde-c29ccd959e19e18cc2ceac1ba701f351f914c26b.gz differ diff --git a/_darcs/patches/20080829182349-84dde-a6d4056d6fa2ecb4c5ed07f3a3a40576315ec4d9.gz b/_darcs/patches/20080829182349-84dde-a6d4056d6fa2ecb4c5ed07f3a3a40576315ec4d9.gz new file mode 100644 index 0000000000..7bb865bb73 Binary files /dev/null and b/_darcs/patches/20080829182349-84dde-a6d4056d6fa2ecb4c5ed07f3a3a40576315ec4d9.gz differ diff --git a/_darcs/patches/20080829200352-84dde-427e4ca8c81d4222a36f78e7c580b611ff0bf765.gz b/_darcs/patches/20080829200352-84dde-427e4ca8c81d4222a36f78e7c580b611ff0bf765.gz new file mode 100644 index 0000000000..e9ce15af6e Binary files /dev/null and b/_darcs/patches/20080829200352-84dde-427e4ca8c81d4222a36f78e7c580b611ff0bf765.gz differ diff --git a/_darcs/patches/20080829200859-84dde-d1c4c5897096a06dec8be14e81499d70a79c78d2.gz b/_darcs/patches/20080829200859-84dde-d1c4c5897096a06dec8be14e81499d70a79c78d2.gz new file mode 100644 index 0000000000..1f8942d673 Binary files /dev/null and b/_darcs/patches/20080829200859-84dde-d1c4c5897096a06dec8be14e81499d70a79c78d2.gz differ diff --git a/_darcs/patches/20080829202613-84dde-58f58a315ea0093c5b029b01492fd71d2fed014c.gz b/_darcs/patches/20080829202613-84dde-58f58a315ea0093c5b029b01492fd71d2fed014c.gz new file mode 100644 index 0000000000..c71fbf9c1a Binary files /dev/null and b/_darcs/patches/20080829202613-84dde-58f58a315ea0093c5b029b01492fd71d2fed014c.gz differ diff --git a/_darcs/patches/20080829225258-84dde-6fee5f0beea62f023c13436b8d7044241bc0d01a.gz b/_darcs/patches/20080829225258-84dde-6fee5f0beea62f023c13436b8d7044241bc0d01a.gz new file mode 100644 index 0000000000..bbb4f75932 Binary files /dev/null and b/_darcs/patches/20080829225258-84dde-6fee5f0beea62f023c13436b8d7044241bc0d01a.gz differ diff --git a/_darcs/patches/20080830000314-84dde-c83d970dbaf046fa37b4af13a23795abcc20e33b.gz b/_darcs/patches/20080830000314-84dde-c83d970dbaf046fa37b4af13a23795abcc20e33b.gz new file mode 100644 index 0000000000..d5ddb9be8d Binary files /dev/null and b/_darcs/patches/20080830000314-84dde-c83d970dbaf046fa37b4af13a23795abcc20e33b.gz differ diff --git a/_darcs/patches/20080830040717-84dde-59c75bfb107a1dd5fd531106751b4544bfd15656.gz b/_darcs/patches/20080830040717-84dde-59c75bfb107a1dd5fd531106751b4544bfd15656.gz new file mode 100644 index 0000000000..86525ba551 Binary files /dev/null and b/_darcs/patches/20080830040717-84dde-59c75bfb107a1dd5fd531106751b4544bfd15656.gz differ diff --git a/_darcs/patches/20080830052143-84dde-81ba3f1e687605d23e9bdc2c3672ac7ae36f9b60.gz b/_darcs/patches/20080830052143-84dde-81ba3f1e687605d23e9bdc2c3672ac7ae36f9b60.gz new file mode 100644 index 0000000000..a6fe1d37ea Binary files /dev/null and b/_darcs/patches/20080830052143-84dde-81ba3f1e687605d23e9bdc2c3672ac7ae36f9b60.gz differ diff --git a/_darcs/patches/20080830052810-84dde-e90c46cc8d9a48a91098efd123c45108ce2903b6.gz b/_darcs/patches/20080830052810-84dde-e90c46cc8d9a48a91098efd123c45108ce2903b6.gz new file mode 100644 index 0000000000..e567cf79a9 Binary files /dev/null and b/_darcs/patches/20080830052810-84dde-e90c46cc8d9a48a91098efd123c45108ce2903b6.gz differ diff --git a/_darcs/patches/20080830053052-84dde-279d1c52e9b8696079ba686009ce2d71725a690e.gz b/_darcs/patches/20080830053052-84dde-279d1c52e9b8696079ba686009ce2d71725a690e.gz new file mode 100644 index 0000000000..f8bb58c13e Binary files /dev/null and b/_darcs/patches/20080830053052-84dde-279d1c52e9b8696079ba686009ce2d71725a690e.gz differ diff --git a/_darcs/patches/20080830054933-84dde-58cc7aa6947612cda9987d532d85d9dd81e32410.gz b/_darcs/patches/20080830054933-84dde-58cc7aa6947612cda9987d532d85d9dd81e32410.gz new file mode 100644 index 0000000000..8b8b925c5f Binary files /dev/null and b/_darcs/patches/20080830054933-84dde-58cc7aa6947612cda9987d532d85d9dd81e32410.gz differ diff --git a/_darcs/patches/20080830055416-84dde-fad0303b1d4b7265e7f01faf90e088e409c7d8b3.gz b/_darcs/patches/20080830055416-84dde-fad0303b1d4b7265e7f01faf90e088e409c7d8b3.gz new file mode 100644 index 0000000000..b52f3b9280 Binary files /dev/null and b/_darcs/patches/20080830055416-84dde-fad0303b1d4b7265e7f01faf90e088e409c7d8b3.gz differ diff --git a/_darcs/patches/20080830055640-84dde-2cd151d876f6586d827ecfc38e1b72d1cfb4950d.gz b/_darcs/patches/20080830055640-84dde-2cd151d876f6586d827ecfc38e1b72d1cfb4950d.gz new file mode 100644 index 0000000000..7bee7f78e2 Binary files /dev/null and b/_darcs/patches/20080830055640-84dde-2cd151d876f6586d827ecfc38e1b72d1cfb4950d.gz differ diff --git a/_darcs/patches/20080830055938-84dde-d0c6b241502b674f974f75f6c22b13f9dca8134c.gz b/_darcs/patches/20080830055938-84dde-d0c6b241502b674f974f75f6c22b13f9dca8134c.gz new file mode 100644 index 0000000000..14f3aa5ce1 Binary files /dev/null and b/_darcs/patches/20080830055938-84dde-d0c6b241502b674f974f75f6c22b13f9dca8134c.gz differ diff --git a/_darcs/patches/20080830060732-84dde-54d5d4c4a8747215bd5b224e4216f9fc1eb349a6.gz b/_darcs/patches/20080830060732-84dde-54d5d4c4a8747215bd5b224e4216f9fc1eb349a6.gz new file mode 100644 index 0000000000..448776d8fd Binary files /dev/null and b/_darcs/patches/20080830060732-84dde-54d5d4c4a8747215bd5b224e4216f9fc1eb349a6.gz differ diff --git a/_darcs/patches/20080830062246-84dde-823ceafa203aa034c52e0df55c21f241e35363fa.gz b/_darcs/patches/20080830062246-84dde-823ceafa203aa034c52e0df55c21f241e35363fa.gz new file mode 100644 index 0000000000..22a0b199bf Binary files /dev/null and b/_darcs/patches/20080830062246-84dde-823ceafa203aa034c52e0df55c21f241e35363fa.gz differ diff --git a/_darcs/patches/20080830062744-84dde-98c6419f4b66a570e9ef9de34d8d07e40aa1177d.gz b/_darcs/patches/20080830062744-84dde-98c6419f4b66a570e9ef9de34d8d07e40aa1177d.gz new file mode 100644 index 0000000000..4c77b03db7 Binary files /dev/null and b/_darcs/patches/20080830062744-84dde-98c6419f4b66a570e9ef9de34d8d07e40aa1177d.gz differ diff --git a/_darcs/patches/20080830064431-84dde-42629109de11f65da9d876aee168abdf7c4ced3d.gz b/_darcs/patches/20080830064431-84dde-42629109de11f65da9d876aee168abdf7c4ced3d.gz new file mode 100644 index 0000000000..317bd0ef60 Binary files /dev/null and b/_darcs/patches/20080830064431-84dde-42629109de11f65da9d876aee168abdf7c4ced3d.gz differ diff --git a/_darcs/patches/20080830070135-84dde-dc0cfc8e23c31c33617aa167f7c97d443b10539d.gz b/_darcs/patches/20080830070135-84dde-dc0cfc8e23c31c33617aa167f7c97d443b10539d.gz new file mode 100644 index 0000000000..aeba7ccd47 Binary files /dev/null and b/_darcs/patches/20080830070135-84dde-dc0cfc8e23c31c33617aa167f7c97d443b10539d.gz differ diff --git a/_darcs/patches/20080830070309-84dde-14a3492cb8132f6a8008d482caa753df2c79ff46.gz b/_darcs/patches/20080830070309-84dde-14a3492cb8132f6a8008d482caa753df2c79ff46.gz new file mode 100644 index 0000000000..a0f7efb0d0 Binary files /dev/null and b/_darcs/patches/20080830070309-84dde-14a3492cb8132f6a8008d482caa753df2c79ff46.gz differ diff --git a/_darcs/patches/20080830071007-84dde-7e7e52c858e3dd33d0efd02abe86e2eaa7111e4b.gz b/_darcs/patches/20080830071007-84dde-7e7e52c858e3dd33d0efd02abe86e2eaa7111e4b.gz new file mode 100644 index 0000000000..bc0a0fdc3e Binary files /dev/null and b/_darcs/patches/20080830071007-84dde-7e7e52c858e3dd33d0efd02abe86e2eaa7111e4b.gz differ diff --git a/_darcs/patches/20080830071232-84dde-90bad1be7a7e141927175e42d39cb21d7bba337e.gz b/_darcs/patches/20080830071232-84dde-90bad1be7a7e141927175e42d39cb21d7bba337e.gz new file mode 100644 index 0000000000..f53d4fe05f Binary files /dev/null and b/_darcs/patches/20080830071232-84dde-90bad1be7a7e141927175e42d39cb21d7bba337e.gz differ diff --git a/_darcs/patches/20080830083502-5b646-d6a66157d86ca84cfa6cf6280bb2eb17bc20e02d.gz b/_darcs/patches/20080830083502-5b646-d6a66157d86ca84cfa6cf6280bb2eb17bc20e02d.gz new file mode 100644 index 0000000000..52243a2a9b Binary files /dev/null and b/_darcs/patches/20080830083502-5b646-d6a66157d86ca84cfa6cf6280bb2eb17bc20e02d.gz differ diff --git a/_darcs/patches/20080830084423-84dde-7749d00c4c2fcada9e0f30af044637c48c0512c3.gz b/_darcs/patches/20080830084423-84dde-7749d00c4c2fcada9e0f30af044637c48c0512c3.gz new file mode 100644 index 0000000000..1955f9ea65 Binary files /dev/null and b/_darcs/patches/20080830084423-84dde-7749d00c4c2fcada9e0f30af044637c48c0512c3.gz differ diff --git a/_darcs/patches/20080830085607-84dde-83e95d40d4d8a64a6bc223a0e91fec53022422c6.gz b/_darcs/patches/20080830085607-84dde-83e95d40d4d8a64a6bc223a0e91fec53022422c6.gz new file mode 100644 index 0000000000..64d8d23ee5 Binary files /dev/null and b/_darcs/patches/20080830085607-84dde-83e95d40d4d8a64a6bc223a0e91fec53022422c6.gz differ diff --git a/_darcs/patches/20080830090148-84dde-2f5711a22c7e5a868005bb3188a966c0cdde30ab.gz b/_darcs/patches/20080830090148-84dde-2f5711a22c7e5a868005bb3188a966c0cdde30ab.gz new file mode 100644 index 0000000000..4ff8b3a530 Binary files /dev/null and b/_darcs/patches/20080830090148-84dde-2f5711a22c7e5a868005bb3188a966c0cdde30ab.gz differ diff --git a/_darcs/patches/20080830091430-84dde-cb0bc7d8957fd295c823298b137c4cf4b285f689.gz b/_darcs/patches/20080830091430-84dde-cb0bc7d8957fd295c823298b137c4cf4b285f689.gz new file mode 100644 index 0000000000..5ac709d4db Binary files /dev/null and b/_darcs/patches/20080830091430-84dde-cb0bc7d8957fd295c823298b137c4cf4b285f689.gz differ diff --git a/_darcs/patches/20080830091522-84dde-75121e8794f2a43b8a4c5bff7ec42cac40d5520c.gz b/_darcs/patches/20080830091522-84dde-75121e8794f2a43b8a4c5bff7ec42cac40d5520c.gz new file mode 100644 index 0000000000..ec183bb311 Binary files /dev/null and b/_darcs/patches/20080830091522-84dde-75121e8794f2a43b8a4c5bff7ec42cac40d5520c.gz differ diff --git a/_darcs/patches/20080830094252-84dde-bf6c17d7036c84bfeaf41d2fc704cc8656a083c1.gz b/_darcs/patches/20080830094252-84dde-bf6c17d7036c84bfeaf41d2fc704cc8656a083c1.gz new file mode 100644 index 0000000000..ffaed973e9 Binary files /dev/null and b/_darcs/patches/20080830094252-84dde-bf6c17d7036c84bfeaf41d2fc704cc8656a083c1.gz differ diff --git a/_darcs/patches/20080830095709-84dde-a64262c1b32e506cb2c43f8b4fb55ab88effc22f.gz b/_darcs/patches/20080830095709-84dde-a64262c1b32e506cb2c43f8b4fb55ab88effc22f.gz new file mode 100644 index 0000000000..f2f3c63b69 Binary files /dev/null and b/_darcs/patches/20080830095709-84dde-a64262c1b32e506cb2c43f8b4fb55ab88effc22f.gz differ diff --git a/_darcs/patches/20080830162128-84dde-430fae5f1a0be77db2860c4e6e1c68b961b0944d.gz b/_darcs/patches/20080830162128-84dde-430fae5f1a0be77db2860c4e6e1c68b961b0944d.gz new file mode 100644 index 0000000000..e74dd66297 Binary files /dev/null and b/_darcs/patches/20080830162128-84dde-430fae5f1a0be77db2860c4e6e1c68b961b0944d.gz differ diff --git a/_darcs/patches/20080830162223-84dde-573e490dc4fde68512ea4ec28599019d2740cfcf.gz b/_darcs/patches/20080830162223-84dde-573e490dc4fde68512ea4ec28599019d2740cfcf.gz new file mode 100644 index 0000000000..c23d756df9 Binary files /dev/null and b/_darcs/patches/20080830162223-84dde-573e490dc4fde68512ea4ec28599019d2740cfcf.gz differ diff --git a/_darcs/patches/20080830171441-84dde-bb5373c4af2ae223d7b4b150f5a76404247a7570.gz b/_darcs/patches/20080830171441-84dde-bb5373c4af2ae223d7b4b150f5a76404247a7570.gz new file mode 100644 index 0000000000..211ce3b908 Binary files /dev/null and b/_darcs/patches/20080830171441-84dde-bb5373c4af2ae223d7b4b150f5a76404247a7570.gz differ diff --git a/_darcs/patches/20080830172217-84dde-b5501719421b84ea1ee8346cf8a5ad170fd1db88.gz b/_darcs/patches/20080830172217-84dde-b5501719421b84ea1ee8346cf8a5ad170fd1db88.gz new file mode 100644 index 0000000000..7839a25cf6 Binary files /dev/null and b/_darcs/patches/20080830172217-84dde-b5501719421b84ea1ee8346cf8a5ad170fd1db88.gz differ diff --git a/_darcs/patches/20080830195036-e3c0d-6b4cac221674240e1a8383675b69863f54dd2525.gz b/_darcs/patches/20080830195036-e3c0d-6b4cac221674240e1a8383675b69863f54dd2525.gz new file mode 100644 index 0000000000..6641747094 Binary files /dev/null and b/_darcs/patches/20080830195036-e3c0d-6b4cac221674240e1a8383675b69863f54dd2525.gz differ diff --git a/_darcs/patches/20080831003210-84dde-92ccffd5b2e1d50963b18babd93c70fb1d20cdba.gz b/_darcs/patches/20080831003210-84dde-92ccffd5b2e1d50963b18babd93c70fb1d20cdba.gz new file mode 100644 index 0000000000..60cc2d08d9 Binary files /dev/null and b/_darcs/patches/20080831003210-84dde-92ccffd5b2e1d50963b18babd93c70fb1d20cdba.gz differ diff --git a/_darcs/patches/20080831012136-84dde-801afb153d5f5c761336394647788e99e845f4a6.gz b/_darcs/patches/20080831012136-84dde-801afb153d5f5c761336394647788e99e845f4a6.gz new file mode 100644 index 0000000000..bcb79364b7 Binary files /dev/null and b/_darcs/patches/20080831012136-84dde-801afb153d5f5c761336394647788e99e845f4a6.gz differ diff --git a/_darcs/patches/20080831013132-84dde-dc51363f8f6c6a0fece8b4acf7088b64acedc5f9.gz b/_darcs/patches/20080831013132-84dde-dc51363f8f6c6a0fece8b4acf7088b64acedc5f9.gz new file mode 100644 index 0000000000..7be2b05e38 Binary files /dev/null and b/_darcs/patches/20080831013132-84dde-dc51363f8f6c6a0fece8b4acf7088b64acedc5f9.gz differ diff --git a/_darcs/patches/20080831013603-84dde-e4e04c8bbb97cf9ed300a9c07dc4e33f8a5edd05.gz b/_darcs/patches/20080831013603-84dde-e4e04c8bbb97cf9ed300a9c07dc4e33f8a5edd05.gz new file mode 100644 index 0000000000..f9cd67d6d6 Binary files /dev/null and b/_darcs/patches/20080831013603-84dde-e4e04c8bbb97cf9ed300a9c07dc4e33f8a5edd05.gz differ diff --git a/_darcs/patches/20080831014404-84dde-ef3f9aa997b6d0727958f56d68c9b6738e20225e.gz b/_darcs/patches/20080831014404-84dde-ef3f9aa997b6d0727958f56d68c9b6738e20225e.gz new file mode 100644 index 0000000000..0b5a593218 Binary files /dev/null and b/_darcs/patches/20080831014404-84dde-ef3f9aa997b6d0727958f56d68c9b6738e20225e.gz differ diff --git a/_darcs/patches/20080831020325-84dde-606d52b08146d4c226f812a9f47b5a3ec1abc743.gz b/_darcs/patches/20080831020325-84dde-606d52b08146d4c226f812a9f47b5a3ec1abc743.gz new file mode 100644 index 0000000000..625d16bf0d Binary files /dev/null and b/_darcs/patches/20080831020325-84dde-606d52b08146d4c226f812a9f47b5a3ec1abc743.gz differ diff --git a/_darcs/patches/20080831023844-84dde-b8c9ce5f38d33c7fd8a42dc0d3640d500e653011.gz b/_darcs/patches/20080831023844-84dde-b8c9ce5f38d33c7fd8a42dc0d3640d500e653011.gz new file mode 100644 index 0000000000..a9f3915919 Binary files /dev/null and b/_darcs/patches/20080831023844-84dde-b8c9ce5f38d33c7fd8a42dc0d3640d500e653011.gz differ diff --git a/_darcs/patches/20080831114642-84dde-c1e486fe03752882e212bd6e3930477042f993be.gz b/_darcs/patches/20080831114642-84dde-c1e486fe03752882e212bd6e3930477042f993be.gz new file mode 100644 index 0000000000..baaebc5373 Binary files /dev/null and b/_darcs/patches/20080831114642-84dde-c1e486fe03752882e212bd6e3930477042f993be.gz differ diff --git a/_darcs/patches/20080831233401-e3c0d-4e0e43f5a53a6659c49d65a2b1f2a47c5cdec228.gz b/_darcs/patches/20080831233401-e3c0d-4e0e43f5a53a6659c49d65a2b1f2a47c5cdec228.gz new file mode 100644 index 0000000000..997a4beec7 Binary files /dev/null and b/_darcs/patches/20080831233401-e3c0d-4e0e43f5a53a6659c49d65a2b1f2a47c5cdec228.gz differ diff --git a/_darcs/patches/20080901001241-e3c0d-b466f35f4f023c6c90a6d2817487c97be9a1bbca.gz b/_darcs/patches/20080901001241-e3c0d-b466f35f4f023c6c90a6d2817487c97be9a1bbca.gz new file mode 100644 index 0000000000..62bd6c8208 Binary files /dev/null and b/_darcs/patches/20080901001241-e3c0d-b466f35f4f023c6c90a6d2817487c97be9a1bbca.gz differ diff --git a/_darcs/patches/20080901025932-e3c0d-c0a939eaf7e242d88cbcb0d651c9d53718c60a9d.gz b/_darcs/patches/20080901025932-e3c0d-c0a939eaf7e242d88cbcb0d651c9d53718c60a9d.gz new file mode 100644 index 0000000000..62bce6d9bd Binary files /dev/null and b/_darcs/patches/20080901025932-e3c0d-c0a939eaf7e242d88cbcb0d651c9d53718c60a9d.gz differ diff --git a/_darcs/patches/20080902012604-84dde-073a583da9b09c80e5e9a47a5eddd144fad8e87a.gz b/_darcs/patches/20080902012604-84dde-073a583da9b09c80e5e9a47a5eddd144fad8e87a.gz new file mode 100644 index 0000000000..f8894667a2 Binary files /dev/null and b/_darcs/patches/20080902012604-84dde-073a583da9b09c80e5e9a47a5eddd144fad8e87a.gz differ diff --git a/_darcs/patches/20080902030331-84dde-bb2db886d90623785f930bb7c5c3c406d407f808.gz b/_darcs/patches/20080902030331-84dde-bb2db886d90623785f930bb7c5c3c406d407f808.gz new file mode 100644 index 0000000000..323d4dc50a Binary files /dev/null and b/_darcs/patches/20080902030331-84dde-bb2db886d90623785f930bb7c5c3c406d407f808.gz differ diff --git a/_darcs/patches/20080902030403-84dde-5f1576104104ea57d3e23401b59493c03d5a84d4.gz b/_darcs/patches/20080902030403-84dde-5f1576104104ea57d3e23401b59493c03d5a84d4.gz new file mode 100644 index 0000000000..b4c82d10c0 Binary files /dev/null and b/_darcs/patches/20080902030403-84dde-5f1576104104ea57d3e23401b59493c03d5a84d4.gz differ diff --git a/_darcs/patches/20080902030910-84dde-01fa58c8c1ab359a077c7a5498973235954be085.gz b/_darcs/patches/20080902030910-84dde-01fa58c8c1ab359a077c7a5498973235954be085.gz new file mode 100644 index 0000000000..acc3e9f682 Binary files /dev/null and b/_darcs/patches/20080902030910-84dde-01fa58c8c1ab359a077c7a5498973235954be085.gz differ diff --git a/_darcs/patches/20080902163718-84dde-80ccca8a5ad66b9993ced2419aa76f686d098334.gz b/_darcs/patches/20080902163718-84dde-80ccca8a5ad66b9993ced2419aa76f686d098334.gz new file mode 100644 index 0000000000..0fa57f73bd Binary files /dev/null and b/_darcs/patches/20080902163718-84dde-80ccca8a5ad66b9993ced2419aa76f686d098334.gz differ diff --git a/_darcs/patches/20080902165319-84dde-b6cc255f014e6c5c059905c37c258a6c7a53b39a.gz b/_darcs/patches/20080902165319-84dde-b6cc255f014e6c5c059905c37c258a6c7a53b39a.gz new file mode 100644 index 0000000000..078516d0ff Binary files /dev/null and b/_darcs/patches/20080902165319-84dde-b6cc255f014e6c5c059905c37c258a6c7a53b39a.gz differ diff --git a/_darcs/patches/20080902165735-84dde-e522711214832e6f992b9897aaf8904b1d5c6a2e.gz b/_darcs/patches/20080902165735-84dde-e522711214832e6f992b9897aaf8904b1d5c6a2e.gz new file mode 100644 index 0000000000..46f7b80a60 Binary files /dev/null and b/_darcs/patches/20080902165735-84dde-e522711214832e6f992b9897aaf8904b1d5c6a2e.gz differ diff --git a/_darcs/patches/20080902171740-84dde-ee629f4b5dbcf712cd350c37d0f1814ca1b7f237.gz b/_darcs/patches/20080902171740-84dde-ee629f4b5dbcf712cd350c37d0f1814ca1b7f237.gz new file mode 100644 index 0000000000..e52a7c8c26 Binary files /dev/null and b/_darcs/patches/20080902171740-84dde-ee629f4b5dbcf712cd350c37d0f1814ca1b7f237.gz differ diff --git a/_darcs/patches/20080902172039-84dde-2b1bbac407959af2a5ca0c764aa503f0cb05c785.gz b/_darcs/patches/20080902172039-84dde-2b1bbac407959af2a5ca0c764aa503f0cb05c785.gz new file mode 100644 index 0000000000..c8011b2ddb Binary files /dev/null and b/_darcs/patches/20080902172039-84dde-2b1bbac407959af2a5ca0c764aa503f0cb05c785.gz differ diff --git a/_darcs/patches/20080902172256-84dde-fa354cc9cb21361074553ad099827fdff84e8048.gz b/_darcs/patches/20080902172256-84dde-fa354cc9cb21361074553ad099827fdff84e8048.gz new file mode 100644 index 0000000000..d4c2c3539e Binary files /dev/null and b/_darcs/patches/20080902172256-84dde-fa354cc9cb21361074553ad099827fdff84e8048.gz differ diff --git a/_darcs/patches/20080902173804-57fc3-496ceaf8192694db43e62f7af1f57785a1a16a01.gz b/_darcs/patches/20080902173804-57fc3-496ceaf8192694db43e62f7af1f57785a1a16a01.gz new file mode 100644 index 0000000000..1921406747 Binary files /dev/null and b/_darcs/patches/20080902173804-57fc3-496ceaf8192694db43e62f7af1f57785a1a16a01.gz differ diff --git a/_darcs/patches/20080904065504-f6e2c-f0c770f52624e7151a93f2ed2b8813657ca88c14.gz b/_darcs/patches/20080904065504-f6e2c-f0c770f52624e7151a93f2ed2b8813657ca88c14.gz new file mode 100644 index 0000000000..0d74e6ba75 Binary files /dev/null and b/_darcs/patches/20080904065504-f6e2c-f0c770f52624e7151a93f2ed2b8813657ca88c14.gz differ diff --git a/_darcs/patches/20080904081542-f6e2c-33b65962d067d142cbdca727625a1b6cc0b30ba4.gz b/_darcs/patches/20080904081542-f6e2c-33b65962d067d142cbdca727625a1b6cc0b30ba4.gz new file mode 100644 index 0000000000..8100a6bf67 Binary files /dev/null and b/_darcs/patches/20080904081542-f6e2c-33b65962d067d142cbdca727625a1b6cc0b30ba4.gz differ diff --git a/_darcs/patches/20080904184031-84dde-eba2061f3aa898d0c791ffeb70837f759778c567.gz b/_darcs/patches/20080904184031-84dde-eba2061f3aa898d0c791ffeb70837f759778c567.gz new file mode 100644 index 0000000000..f66a0d6a4f Binary files /dev/null and b/_darcs/patches/20080904184031-84dde-eba2061f3aa898d0c791ffeb70837f759778c567.gz differ diff --git a/_darcs/patches/20080904190254-84dde-57d24d7a82e4c7eabef87d60ebb69292832e31ac.gz b/_darcs/patches/20080904190254-84dde-57d24d7a82e4c7eabef87d60ebb69292832e31ac.gz new file mode 100644 index 0000000000..36fe061143 Binary files /dev/null and b/_darcs/patches/20080904190254-84dde-57d24d7a82e4c7eabef87d60ebb69292832e31ac.gz differ diff --git a/_darcs/patches/20080904191031-84dde-bb457c429c76eedb9bd4ea838b7ccad28844effd.gz b/_darcs/patches/20080904191031-84dde-bb457c429c76eedb9bd4ea838b7ccad28844effd.gz new file mode 100644 index 0000000000..9d10ce2219 Binary files /dev/null and b/_darcs/patches/20080904191031-84dde-bb457c429c76eedb9bd4ea838b7ccad28844effd.gz differ diff --git a/_darcs/patches/20080904191517-84dde-7bc5b62f26d10c7e865b483df90356a5eaea0205.gz b/_darcs/patches/20080904191517-84dde-7bc5b62f26d10c7e865b483df90356a5eaea0205.gz new file mode 100644 index 0000000000..264f8a91e3 Binary files /dev/null and b/_darcs/patches/20080904191517-84dde-7bc5b62f26d10c7e865b483df90356a5eaea0205.gz differ diff --git a/_darcs/patches/20080904192220-84dde-e852271817361bd00fd89c31c7e4b684edf5f029.gz b/_darcs/patches/20080904192220-84dde-e852271817361bd00fd89c31c7e4b684edf5f029.gz new file mode 100644 index 0000000000..c0f1866ee6 Binary files /dev/null and b/_darcs/patches/20080904192220-84dde-e852271817361bd00fd89c31c7e4b684edf5f029.gz differ diff --git a/_darcs/patches/20080904192851-84dde-91b7e3bd9cadb760224fee14418fc37c44e2b7c7.gz b/_darcs/patches/20080904192851-84dde-91b7e3bd9cadb760224fee14418fc37c44e2b7c7.gz new file mode 100644 index 0000000000..65098095a8 Binary files /dev/null and b/_darcs/patches/20080904192851-84dde-91b7e3bd9cadb760224fee14418fc37c44e2b7c7.gz differ diff --git a/_darcs/patches/20080904193118-84dde-a33d0db712c51177c3f5a5f36483e873aca81532.gz b/_darcs/patches/20080904193118-84dde-a33d0db712c51177c3f5a5f36483e873aca81532.gz new file mode 100644 index 0000000000..bc7036b77e Binary files /dev/null and b/_darcs/patches/20080904193118-84dde-a33d0db712c51177c3f5a5f36483e873aca81532.gz differ diff --git a/_darcs/patches/20080904194035-84dde-480b3605862d26eff6a2cac6eec02775628287e4.gz b/_darcs/patches/20080904194035-84dde-480b3605862d26eff6a2cac6eec02775628287e4.gz new file mode 100644 index 0000000000..6e6d04732d Binary files /dev/null and b/_darcs/patches/20080904194035-84dde-480b3605862d26eff6a2cac6eec02775628287e4.gz differ diff --git a/_darcs/patches/20080904194346-84dde-93705711bbaab5ac10195a9ef1c855115e545b26.gz b/_darcs/patches/20080904194346-84dde-93705711bbaab5ac10195a9ef1c855115e545b26.gz new file mode 100644 index 0000000000..0b5d826b72 Binary files /dev/null and b/_darcs/patches/20080904194346-84dde-93705711bbaab5ac10195a9ef1c855115e545b26.gz differ diff --git a/_darcs/patches/20080904194456-84dde-16fa43e8158134dcc91b4ecbe04ebf10ad85605a.gz b/_darcs/patches/20080904194456-84dde-16fa43e8158134dcc91b4ecbe04ebf10ad85605a.gz new file mode 100644 index 0000000000..80c924f4eb Binary files /dev/null and b/_darcs/patches/20080904194456-84dde-16fa43e8158134dcc91b4ecbe04ebf10ad85605a.gz differ diff --git a/_darcs/patches/20080904195720-84dde-f286bfe898ef3e08f07fd977bfe692e9cff6c375.gz b/_darcs/patches/20080904195720-84dde-f286bfe898ef3e08f07fd977bfe692e9cff6c375.gz new file mode 100644 index 0000000000..dbff6efb3b Binary files /dev/null and b/_darcs/patches/20080904195720-84dde-f286bfe898ef3e08f07fd977bfe692e9cff6c375.gz differ diff --git a/_darcs/patches/20080904201921-f6e2c-44a5fc1dbf699b9c2b6919eaabd7db12c7c65ef8.gz b/_darcs/patches/20080904201921-f6e2c-44a5fc1dbf699b9c2b6919eaabd7db12c7c65ef8.gz new file mode 100644 index 0000000000..aa182909ad Binary files /dev/null and b/_darcs/patches/20080904201921-f6e2c-44a5fc1dbf699b9c2b6919eaabd7db12c7c65ef8.gz differ diff --git a/_darcs/patches/20080904203502-84dde-b95f4c3564a0ccc8dbfec8da7e2ff5b8c57e1ed2.gz b/_darcs/patches/20080904203502-84dde-b95f4c3564a0ccc8dbfec8da7e2ff5b8c57e1ed2.gz new file mode 100644 index 0000000000..3bbde9025f Binary files /dev/null and b/_darcs/patches/20080904203502-84dde-b95f4c3564a0ccc8dbfec8da7e2ff5b8c57e1ed2.gz differ diff --git a/_darcs/patches/20080904213257-84dde-c046a708c6ac9f8f7ed2135f29241d70abe4104f.gz b/_darcs/patches/20080904213257-84dde-c046a708c6ac9f8f7ed2135f29241d70abe4104f.gz new file mode 100644 index 0000000000..1f646cc491 Binary files /dev/null and b/_darcs/patches/20080904213257-84dde-c046a708c6ac9f8f7ed2135f29241d70abe4104f.gz differ diff --git a/_darcs/patches/20080904215328-18f16-53f338eda04f3f61d85eaf177d0fb9b69113f87a.gz b/_darcs/patches/20080904215328-18f16-53f338eda04f3f61d85eaf177d0fb9b69113f87a.gz new file mode 100644 index 0000000000..a4b19fb6d2 Binary files /dev/null and b/_darcs/patches/20080904215328-18f16-53f338eda04f3f61d85eaf177d0fb9b69113f87a.gz differ diff --git a/_darcs/patches/20080904224129-84dde-6844b29ab1818954aacaf6d9ef11371dbb11812a.gz b/_darcs/patches/20080904224129-84dde-6844b29ab1818954aacaf6d9ef11371dbb11812a.gz new file mode 100644 index 0000000000..80b0530123 Binary files /dev/null and b/_darcs/patches/20080904224129-84dde-6844b29ab1818954aacaf6d9ef11371dbb11812a.gz differ diff --git a/_darcs/patches/20080905004701-84dde-c8b27c6b3b4ad634cd954ec51d45a92d2ad32389.gz b/_darcs/patches/20080905004701-84dde-c8b27c6b3b4ad634cd954ec51d45a92d2ad32389.gz new file mode 100644 index 0000000000..41b79be132 Binary files /dev/null and b/_darcs/patches/20080905004701-84dde-c8b27c6b3b4ad634cd954ec51d45a92d2ad32389.gz differ diff --git a/_darcs/patches/20080905022019-84dde-d53b1dda2cd0ec996b8dda99a00d01e6da000d3f.gz b/_darcs/patches/20080905022019-84dde-d53b1dda2cd0ec996b8dda99a00d01e6da000d3f.gz new file mode 100644 index 0000000000..7eae914615 Binary files /dev/null and b/_darcs/patches/20080905022019-84dde-d53b1dda2cd0ec996b8dda99a00d01e6da000d3f.gz differ diff --git a/_darcs/patches/20080905032903-18f16-939f998d8f52212827c2734e34f83587a645f8c0.gz b/_darcs/patches/20080905032903-18f16-939f998d8f52212827c2734e34f83587a645f8c0.gz new file mode 100644 index 0000000000..c093c6f319 Binary files /dev/null and b/_darcs/patches/20080905032903-18f16-939f998d8f52212827c2734e34f83587a645f8c0.gz differ diff --git a/_darcs/patches/20080905045415-84dde-bbb6947b53479c2b0f3060094431835784fa686b.gz b/_darcs/patches/20080905045415-84dde-bbb6947b53479c2b0f3060094431835784fa686b.gz new file mode 100644 index 0000000000..a7e0a18967 Binary files /dev/null and b/_darcs/patches/20080905045415-84dde-bbb6947b53479c2b0f3060094431835784fa686b.gz differ diff --git a/_darcs/patches/20080905045736-84dde-7232813dafb70b75309f5cb9e58831fb49497918.gz b/_darcs/patches/20080905045736-84dde-7232813dafb70b75309f5cb9e58831fb49497918.gz new file mode 100644 index 0000000000..7e64bd4ea0 Binary files /dev/null and b/_darcs/patches/20080905045736-84dde-7232813dafb70b75309f5cb9e58831fb49497918.gz differ diff --git a/_darcs/patches/20080905050356-84dde-6e8b359848ff43b97097cc96943d829a8c9d3f5c.gz b/_darcs/patches/20080905050356-84dde-6e8b359848ff43b97097cc96943d829a8c9d3f5c.gz new file mode 100644 index 0000000000..e697a4ee2b Binary files /dev/null and b/_darcs/patches/20080905050356-84dde-6e8b359848ff43b97097cc96943d829a8c9d3f5c.gz differ diff --git a/_darcs/patches/20080905050824-84dde-6a58a72c28d79cc5b754ee0498fcb3dadccd555a.gz b/_darcs/patches/20080905050824-84dde-6a58a72c28d79cc5b754ee0498fcb3dadccd555a.gz new file mode 100644 index 0000000000..51d6fc1898 Binary files /dev/null and b/_darcs/patches/20080905050824-84dde-6a58a72c28d79cc5b754ee0498fcb3dadccd555a.gz differ diff --git a/_darcs/patches/20080905090848-58978-6b47e2b4b30fccc02df7cf3aa43fede33379c1ee.gz b/_darcs/patches/20080905090848-58978-6b47e2b4b30fccc02df7cf3aa43fede33379c1ee.gz new file mode 100644 index 0000000000..f447c2cec1 Binary files /dev/null and b/_darcs/patches/20080905090848-58978-6b47e2b4b30fccc02df7cf3aa43fede33379c1ee.gz differ diff --git a/_darcs/patches/20080905114534-57fc3-feee793696ddf3d5bbb1ae7f326d9d88dc961e60.gz b/_darcs/patches/20080905114534-57fc3-feee793696ddf3d5bbb1ae7f326d9d88dc961e60.gz new file mode 100644 index 0000000000..da8e1f871b Binary files /dev/null and b/_darcs/patches/20080905114534-57fc3-feee793696ddf3d5bbb1ae7f326d9d88dc961e60.gz differ diff --git a/_darcs/patches/20080905162732-f6e2c-21c056ba2f211cee9d6ba720b40b5a1ab1186341.gz b/_darcs/patches/20080905162732-f6e2c-21c056ba2f211cee9d6ba720b40b5a1ab1186341.gz new file mode 100644 index 0000000000..52a3d0b24c Binary files /dev/null and b/_darcs/patches/20080905162732-f6e2c-21c056ba2f211cee9d6ba720b40b5a1ab1186341.gz differ diff --git a/_darcs/patches/20080905194732-7b5ce-2797acd4d04f3b02c4ad67be629badbae469e8ed.gz b/_darcs/patches/20080905194732-7b5ce-2797acd4d04f3b02c4ad67be629badbae469e8ed.gz new file mode 100644 index 0000000000..6b2b3a719e Binary files /dev/null and b/_darcs/patches/20080905194732-7b5ce-2797acd4d04f3b02c4ad67be629badbae469e8ed.gz differ diff --git a/_darcs/patches/20080906015501-84dde-e787962b9805759224389dd42a211dfa21da3473.gz b/_darcs/patches/20080906015501-84dde-e787962b9805759224389dd42a211dfa21da3473.gz new file mode 100644 index 0000000000..e2f5aea2a5 Binary files /dev/null and b/_darcs/patches/20080906015501-84dde-e787962b9805759224389dd42a211dfa21da3473.gz differ diff --git a/_darcs/patches/20080906015621-84dde-ae1a53e6757a743f82f3078947212b7bbe984dde.gz b/_darcs/patches/20080906015621-84dde-ae1a53e6757a743f82f3078947212b7bbe984dde.gz new file mode 100644 index 0000000000..536a9092a8 Binary files /dev/null and b/_darcs/patches/20080906015621-84dde-ae1a53e6757a743f82f3078947212b7bbe984dde.gz differ diff --git a/_darcs/patches/20080906070651-7b5ce-23c17932cc9c474dfbeb530d29b1bd1adb3a4260.gz b/_darcs/patches/20080906070651-7b5ce-23c17932cc9c474dfbeb530d29b1bd1adb3a4260.gz new file mode 100644 index 0000000000..5ee079a0a5 Binary files /dev/null and b/_darcs/patches/20080906070651-7b5ce-23c17932cc9c474dfbeb530d29b1bd1adb3a4260.gz differ diff --git a/_darcs/patches/20080906202242-f6e2c-8f3d04c181ef4bffc1727f3333a3bfe5766bda6b.gz b/_darcs/patches/20080906202242-f6e2c-8f3d04c181ef4bffc1727f3333a3bfe5766bda6b.gz new file mode 100644 index 0000000000..061eddceb3 Binary files /dev/null and b/_darcs/patches/20080906202242-f6e2c-8f3d04c181ef4bffc1727f3333a3bfe5766bda6b.gz differ diff --git a/_darcs/patches/20080907053604-7b5ce-4e01cefdbab4cc73a28960b265c23abf5e2f2b0a.gz b/_darcs/patches/20080907053604-7b5ce-4e01cefdbab4cc73a28960b265c23abf5e2f2b0a.gz new file mode 100644 index 0000000000..3a4a1b464f Binary files /dev/null and b/_darcs/patches/20080907053604-7b5ce-4e01cefdbab4cc73a28960b265c23abf5e2f2b0a.gz differ diff --git a/_darcs/patches/20080907062118-7b5ce-b4412446bbf245b1d14a78b01ecde0f71f621185.gz b/_darcs/patches/20080907062118-7b5ce-b4412446bbf245b1d14a78b01ecde0f71f621185.gz new file mode 100644 index 0000000000..4570603c15 Binary files /dev/null and b/_darcs/patches/20080907062118-7b5ce-b4412446bbf245b1d14a78b01ecde0f71f621185.gz differ diff --git a/_darcs/patches/20080907063339-7b5ce-bce7b96763adcac5746b1b4d930b636ae0852491.gz b/_darcs/patches/20080907063339-7b5ce-bce7b96763adcac5746b1b4d930b636ae0852491.gz new file mode 100644 index 0000000000..e12c06588a Binary files /dev/null and b/_darcs/patches/20080907063339-7b5ce-bce7b96763adcac5746b1b4d930b636ae0852491.gz differ diff --git a/_darcs/patches/20080907193402-84dde-cc5ecd5d02a00e3dfb7523f93d7f0a9ddbe6fb1b.gz b/_darcs/patches/20080907193402-84dde-cc5ecd5d02a00e3dfb7523f93d7f0a9ddbe6fb1b.gz new file mode 100644 index 0000000000..ce809b72aa Binary files /dev/null and b/_darcs/patches/20080907193402-84dde-cc5ecd5d02a00e3dfb7523f93d7f0a9ddbe6fb1b.gz differ diff --git a/_darcs/patches/20080907195242-84dde-b2adc3cd10cfe516c4635d26830ed43b8151d6f0.gz b/_darcs/patches/20080907195242-84dde-b2adc3cd10cfe516c4635d26830ed43b8151d6f0.gz new file mode 100644 index 0000000000..8ebb434d29 Binary files /dev/null and b/_darcs/patches/20080907195242-84dde-b2adc3cd10cfe516c4635d26830ed43b8151d6f0.gz differ diff --git a/_darcs/patches/20080907200344-84dde-3cc68af343e2da1ae852df07bdc1738865c122f0.gz b/_darcs/patches/20080907200344-84dde-3cc68af343e2da1ae852df07bdc1738865c122f0.gz new file mode 100644 index 0000000000..f2e2f98c27 Binary files /dev/null and b/_darcs/patches/20080907200344-84dde-3cc68af343e2da1ae852df07bdc1738865c122f0.gz differ diff --git a/_darcs/patches/20080908181624-84dde-8200e1d91eb5f560ef0f296c9e1c56f93ef1b0c5.gz b/_darcs/patches/20080908181624-84dde-8200e1d91eb5f560ef0f296c9e1c56f93ef1b0c5.gz new file mode 100644 index 0000000000..997eb166b8 Binary files /dev/null and b/_darcs/patches/20080908181624-84dde-8200e1d91eb5f560ef0f296c9e1c56f93ef1b0c5.gz differ diff --git a/_darcs/patches/20080908182353-84dde-c2825731b071e140b8bf8f633246eddc7c5b1f3c.gz b/_darcs/patches/20080908182353-84dde-c2825731b071e140b8bf8f633246eddc7c5b1f3c.gz new file mode 100644 index 0000000000..a69d72f3cc Binary files /dev/null and b/_darcs/patches/20080908182353-84dde-c2825731b071e140b8bf8f633246eddc7c5b1f3c.gz differ diff --git a/_darcs/patches/20080908182559-84dde-27b288efd341a4dd148abb641064d9e48ca2aa11.gz b/_darcs/patches/20080908182559-84dde-27b288efd341a4dd148abb641064d9e48ca2aa11.gz new file mode 100644 index 0000000000..168dcde892 Binary files /dev/null and b/_darcs/patches/20080908182559-84dde-27b288efd341a4dd148abb641064d9e48ca2aa11.gz differ diff --git a/_darcs/patches/20080908182716-84dde-fad2159212dd427d596a8ace7aa4032be8446799.gz b/_darcs/patches/20080908182716-84dde-fad2159212dd427d596a8ace7aa4032be8446799.gz new file mode 100644 index 0000000000..0aa7a8e624 Binary files /dev/null and b/_darcs/patches/20080908182716-84dde-fad2159212dd427d596a8ace7aa4032be8446799.gz differ diff --git a/_darcs/patches/20080908183515-84dde-7630e2185aa2f0a4e95e3eb8502294361d9879e5.gz b/_darcs/patches/20080908183515-84dde-7630e2185aa2f0a4e95e3eb8502294361d9879e5.gz new file mode 100644 index 0000000000..a9361c6b73 Binary files /dev/null and b/_darcs/patches/20080908183515-84dde-7630e2185aa2f0a4e95e3eb8502294361d9879e5.gz differ diff --git a/_darcs/patches/20080908201020-84dde-233d38e3cb65f1778a34456193cd3f013e8d94a8.gz b/_darcs/patches/20080908201020-84dde-233d38e3cb65f1778a34456193cd3f013e8d94a8.gz new file mode 100644 index 0000000000..98445cd6b1 Binary files /dev/null and b/_darcs/patches/20080908201020-84dde-233d38e3cb65f1778a34456193cd3f013e8d94a8.gz differ diff --git a/_darcs/patches/20080908201751-84dde-a498395d26b957b72350d8075d056b661a1f77c7.gz b/_darcs/patches/20080908201751-84dde-a498395d26b957b72350d8075d056b661a1f77c7.gz new file mode 100644 index 0000000000..44d7299f4c Binary files /dev/null and b/_darcs/patches/20080908201751-84dde-a498395d26b957b72350d8075d056b661a1f77c7.gz differ diff --git a/_darcs/patches/20080908202226-84dde-bf0bf0d67f1f9a9e4cf70bc20fb12b4ca736b594.gz b/_darcs/patches/20080908202226-84dde-bf0bf0d67f1f9a9e4cf70bc20fb12b4ca736b594.gz new file mode 100644 index 0000000000..56b0d2324c Binary files /dev/null and b/_darcs/patches/20080908202226-84dde-bf0bf0d67f1f9a9e4cf70bc20fb12b4ca736b594.gz differ diff --git a/_darcs/patches/20080908202717-84dde-4f89d50c07dfd16ff71f80c4115159eb8b01e9ce.gz b/_darcs/patches/20080908202717-84dde-4f89d50c07dfd16ff71f80c4115159eb8b01e9ce.gz new file mode 100644 index 0000000000..dd6e29e4ca Binary files /dev/null and b/_darcs/patches/20080908202717-84dde-4f89d50c07dfd16ff71f80c4115159eb8b01e9ce.gz differ diff --git a/_darcs/patches/20080908211610-84dde-8a7819ee8733cf73a778c2448c93974e2adecca7.gz b/_darcs/patches/20080908211610-84dde-8a7819ee8733cf73a778c2448c93974e2adecca7.gz new file mode 100644 index 0000000000..965ac5cd94 Binary files /dev/null and b/_darcs/patches/20080908211610-84dde-8a7819ee8733cf73a778c2448c93974e2adecca7.gz differ diff --git a/_darcs/patches/20080908211656-84dde-d903b28745503166b8d94b0d86836860b6b0fbbe.gz b/_darcs/patches/20080908211656-84dde-d903b28745503166b8d94b0d86836860b6b0fbbe.gz new file mode 100644 index 0000000000..d1b9036fc8 Binary files /dev/null and b/_darcs/patches/20080908211656-84dde-d903b28745503166b8d94b0d86836860b6b0fbbe.gz differ diff --git a/_darcs/patches/20080909000650-7b5ce-c7eb990db81620b83201c0e361af9dfcdd9c2b89.gz b/_darcs/patches/20080909000650-7b5ce-c7eb990db81620b83201c0e361af9dfcdd9c2b89.gz new file mode 100644 index 0000000000..8540d1a8dc Binary files /dev/null and b/_darcs/patches/20080909000650-7b5ce-c7eb990db81620b83201c0e361af9dfcdd9c2b89.gz differ diff --git a/_darcs/patches/20080909072224-f6e2c-881bd2e7fb032f336fecae9ca5ce527dd821d3dc.gz b/_darcs/patches/20080909072224-f6e2c-881bd2e7fb032f336fecae9ca5ce527dd821d3dc.gz new file mode 100644 index 0000000000..12441c6d6c Binary files /dev/null and b/_darcs/patches/20080909072224-f6e2c-881bd2e7fb032f336fecae9ca5ce527dd821d3dc.gz differ diff --git a/_darcs/patches/20080909202259-f6e2c-8c7e836fd1f0ce9de3ea3802161e1068e346e5dd.gz b/_darcs/patches/20080909202259-f6e2c-8c7e836fd1f0ce9de3ea3802161e1068e346e5dd.gz new file mode 100644 index 0000000000..9a12d3bf92 Binary files /dev/null and b/_darcs/patches/20080909202259-f6e2c-8c7e836fd1f0ce9de3ea3802161e1068e346e5dd.gz differ diff --git a/_darcs/patches/20080910025013-7b5ce-95c8dd7eaf83e98e5ee0da5dee8ef07fe4ae5041.gz b/_darcs/patches/20080910025013-7b5ce-95c8dd7eaf83e98e5ee0da5dee8ef07fe4ae5041.gz new file mode 100644 index 0000000000..a6e91aa0cc Binary files /dev/null and b/_darcs/patches/20080910025013-7b5ce-95c8dd7eaf83e98e5ee0da5dee8ef07fe4ae5041.gz differ diff --git a/_darcs/patches/20080910073741-f6e2c-fe856e1acbc14f77e8ad6502cf5e16de768e0e5f.gz b/_darcs/patches/20080910073741-f6e2c-fe856e1acbc14f77e8ad6502cf5e16de768e0e5f.gz new file mode 100644 index 0000000000..b2ccfa122b Binary files /dev/null and b/_darcs/patches/20080910073741-f6e2c-fe856e1acbc14f77e8ad6502cf5e16de768e0e5f.gz differ diff --git a/_darcs/patches/20080910154632-84dde-6aecbcc8c61f52273a62a2ea3fd3fd305227e2f7.gz b/_darcs/patches/20080910154632-84dde-6aecbcc8c61f52273a62a2ea3fd3fd305227e2f7.gz new file mode 100644 index 0000000000..f29d420223 Binary files /dev/null and b/_darcs/patches/20080910154632-84dde-6aecbcc8c61f52273a62a2ea3fd3fd305227e2f7.gz differ diff --git a/_darcs/patches/20080910154754-84dde-899822c61fb3e8be563341ca54fe2a61fcdee31f.gz b/_darcs/patches/20080910154754-84dde-899822c61fb3e8be563341ca54fe2a61fcdee31f.gz new file mode 100644 index 0000000000..303c797b0d Binary files /dev/null and b/_darcs/patches/20080910154754-84dde-899822c61fb3e8be563341ca54fe2a61fcdee31f.gz differ diff --git a/_darcs/patches/20080910180050-84dde-8c00e9add17b0c545a36d38ee7c4554135bc5f54.gz b/_darcs/patches/20080910180050-84dde-8c00e9add17b0c545a36d38ee7c4554135bc5f54.gz new file mode 100644 index 0000000000..6c81cf6e46 Binary files /dev/null and b/_darcs/patches/20080910180050-84dde-8c00e9add17b0c545a36d38ee7c4554135bc5f54.gz differ diff --git a/_darcs/patches/20080911144742-84dde-235a1af2d958500b1f1c503f21785284ca4b5c8a.gz b/_darcs/patches/20080911144742-84dde-235a1af2d958500b1f1c503f21785284ca4b5c8a.gz new file mode 100644 index 0000000000..3029938fc8 Binary files /dev/null and b/_darcs/patches/20080911144742-84dde-235a1af2d958500b1f1c503f21785284ca4b5c8a.gz differ diff --git a/_darcs/patches/20080911163558-f6e2c-ae857f68936ed4328d4e38323f7e77ce25a0236a.gz b/_darcs/patches/20080911163558-f6e2c-ae857f68936ed4328d4e38323f7e77ce25a0236a.gz new file mode 100644 index 0000000000..b5f4e73566 Binary files /dev/null and b/_darcs/patches/20080911163558-f6e2c-ae857f68936ed4328d4e38323f7e77ce25a0236a.gz differ diff --git a/_darcs/patches/20080911192348-f6e2c-b846b777b382386de56ca01d957dc5e55161fced.gz b/_darcs/patches/20080911192348-f6e2c-b846b777b382386de56ca01d957dc5e55161fced.gz new file mode 100644 index 0000000000..d583adcca1 Binary files /dev/null and b/_darcs/patches/20080911192348-f6e2c-b846b777b382386de56ca01d957dc5e55161fced.gz differ diff --git a/_darcs/patches/20080913161107-84dde-30b694455d509a7ec2d12e8418f54ce695aa0993.gz b/_darcs/patches/20080913161107-84dde-30b694455d509a7ec2d12e8418f54ce695aa0993.gz new file mode 100644 index 0000000000..6e67ef5453 Binary files /dev/null and b/_darcs/patches/20080913161107-84dde-30b694455d509a7ec2d12e8418f54ce695aa0993.gz differ diff --git a/_darcs/patches/20080913164333-84dde-ef4f3363e045aabd52173ea9be34b2f59f64d084.gz b/_darcs/patches/20080913164333-84dde-ef4f3363e045aabd52173ea9be34b2f59f64d084.gz new file mode 100644 index 0000000000..60bbde3ce3 Binary files /dev/null and b/_darcs/patches/20080913164333-84dde-ef4f3363e045aabd52173ea9be34b2f59f64d084.gz differ diff --git a/_darcs/patches/20080914201744-f6e2c-71b2a3aec4c0b91557465323d79645e7eab2bfd1.gz b/_darcs/patches/20080914201744-f6e2c-71b2a3aec4c0b91557465323d79645e7eab2bfd1.gz new file mode 100644 index 0000000000..de6c11343f Binary files /dev/null and b/_darcs/patches/20080914201744-f6e2c-71b2a3aec4c0b91557465323d79645e7eab2bfd1.gz differ diff --git a/_darcs/patches/20080915053955-84dde-0bcb883b0075cfb3835aae5043c827aaa0b7099e.gz b/_darcs/patches/20080915053955-84dde-0bcb883b0075cfb3835aae5043c827aaa0b7099e.gz new file mode 100644 index 0000000000..3951df8ced Binary files /dev/null and b/_darcs/patches/20080915053955-84dde-0bcb883b0075cfb3835aae5043c827aaa0b7099e.gz differ diff --git a/_darcs/patches/20080915065616-84dde-1b1e814c2294498a10b763b779cbb62c3f96aa84.gz b/_darcs/patches/20080915065616-84dde-1b1e814c2294498a10b763b779cbb62c3f96aa84.gz new file mode 100644 index 0000000000..e676dd6f41 Binary files /dev/null and b/_darcs/patches/20080915065616-84dde-1b1e814c2294498a10b763b779cbb62c3f96aa84.gz differ diff --git a/_darcs/patches/20080915070256-f6e2c-344d1ca1ca158b9ab5f558804ad129c1ef9d6a7a.gz b/_darcs/patches/20080915070256-f6e2c-344d1ca1ca158b9ab5f558804ad129c1ef9d6a7a.gz new file mode 100644 index 0000000000..c88ef14f2f Binary files /dev/null and b/_darcs/patches/20080915070256-f6e2c-344d1ca1ca158b9ab5f558804ad129c1ef9d6a7a.gz differ diff --git a/_darcs/patches/20080915070413-84dde-5e942675dec105b297889a58ea770fb4b337307d.gz b/_darcs/patches/20080915070413-84dde-5e942675dec105b297889a58ea770fb4b337307d.gz new file mode 100644 index 0000000000..56c55a0ed2 Binary files /dev/null and b/_darcs/patches/20080915070413-84dde-5e942675dec105b297889a58ea770fb4b337307d.gz differ diff --git a/_darcs/patches/20080915070951-84dde-be26f8844c884b0210cfd6165fd3403ce760195e.gz b/_darcs/patches/20080915070951-84dde-be26f8844c884b0210cfd6165fd3403ce760195e.gz new file mode 100644 index 0000000000..c8818a022c Binary files /dev/null and b/_darcs/patches/20080915070951-84dde-be26f8844c884b0210cfd6165fd3403ce760195e.gz differ diff --git a/_darcs/patches/20080915071500-84dde-765c8c289d5cf7f71c2a49967bde4ecda28d9ea8.gz b/_darcs/patches/20080915071500-84dde-765c8c289d5cf7f71c2a49967bde4ecda28d9ea8.gz new file mode 100644 index 0000000000..324b0b9903 Binary files /dev/null and b/_darcs/patches/20080915071500-84dde-765c8c289d5cf7f71c2a49967bde4ecda28d9ea8.gz differ diff --git a/_darcs/patches/20080915071835-84dde-173e6afde44c3348c3314c638e2a67dfb333c011.gz b/_darcs/patches/20080915071835-84dde-173e6afde44c3348c3314c638e2a67dfb333c011.gz new file mode 100644 index 0000000000..987d9e4a88 Binary files /dev/null and b/_darcs/patches/20080915071835-84dde-173e6afde44c3348c3314c638e2a67dfb333c011.gz differ diff --git a/_darcs/patches/20080915072553-84dde-6de01a486dfcf3440643584d1f698fe1b188f351.gz b/_darcs/patches/20080915072553-84dde-6de01a486dfcf3440643584d1f698fe1b188f351.gz new file mode 100644 index 0000000000..becfed0cae Binary files /dev/null and b/_darcs/patches/20080915072553-84dde-6de01a486dfcf3440643584d1f698fe1b188f351.gz differ diff --git a/_darcs/patches/20080915072738-84dde-377131613c91dcb353bc6aaf55bae8ce1b7f13e5.gz b/_darcs/patches/20080915072738-84dde-377131613c91dcb353bc6aaf55bae8ce1b7f13e5.gz new file mode 100644 index 0000000000..0389e9ff76 Binary files /dev/null and b/_darcs/patches/20080915072738-84dde-377131613c91dcb353bc6aaf55bae8ce1b7f13e5.gz differ diff --git a/_darcs/patches/20080915073006-84dde-8ea7daa73743647711a8c1d7389894b25f2b077d.gz b/_darcs/patches/20080915073006-84dde-8ea7daa73743647711a8c1d7389894b25f2b077d.gz new file mode 100644 index 0000000000..e708d61a86 Binary files /dev/null and b/_darcs/patches/20080915073006-84dde-8ea7daa73743647711a8c1d7389894b25f2b077d.gz differ diff --git a/_darcs/patches/20080915073215-84dde-34bdd1a40ce310bca5bbb6f11ed4df79c7915cb2.gz b/_darcs/patches/20080915073215-84dde-34bdd1a40ce310bca5bbb6f11ed4df79c7915cb2.gz new file mode 100644 index 0000000000..d96f616e20 Binary files /dev/null and b/_darcs/patches/20080915073215-84dde-34bdd1a40ce310bca5bbb6f11ed4df79c7915cb2.gz differ diff --git a/_darcs/patches/20080915073412-84dde-3c9cfb1d2d4933dbaff002b30fffb9e7d3d5e1d7.gz b/_darcs/patches/20080915073412-84dde-3c9cfb1d2d4933dbaff002b30fffb9e7d3d5e1d7.gz new file mode 100644 index 0000000000..1c24bf1113 Binary files /dev/null and b/_darcs/patches/20080915073412-84dde-3c9cfb1d2d4933dbaff002b30fffb9e7d3d5e1d7.gz differ diff --git a/_darcs/patches/20080915081246-f6e2c-79e1f7258954bf649560aeaf7b220cdd6e156317.gz b/_darcs/patches/20080915081246-f6e2c-79e1f7258954bf649560aeaf7b220cdd6e156317.gz new file mode 100644 index 0000000000..4abef1d464 Binary files /dev/null and b/_darcs/patches/20080915081246-f6e2c-79e1f7258954bf649560aeaf7b220cdd6e156317.gz differ diff --git a/_darcs/patches/20080915190953-f6e2c-40510d7407ccb621680489780dec79e581e59d1c.gz b/_darcs/patches/20080915190953-f6e2c-40510d7407ccb621680489780dec79e581e59d1c.gz new file mode 100644 index 0000000000..2919848db7 Binary files /dev/null and b/_darcs/patches/20080915190953-f6e2c-40510d7407ccb621680489780dec79e581e59d1c.gz differ diff --git a/_darcs/patches/20080916172706-f6e2c-762079233fd311ac6f1995415beb36d60484c496.gz b/_darcs/patches/20080916172706-f6e2c-762079233fd311ac6f1995415beb36d60484c496.gz new file mode 100644 index 0000000000..834eefee02 Binary files /dev/null and b/_darcs/patches/20080916172706-f6e2c-762079233fd311ac6f1995415beb36d60484c496.gz differ diff --git a/_darcs/patches/20080916174105-84dde-708b2a6f00b2f9d379972c0140446377b625a74f.gz b/_darcs/patches/20080916174105-84dde-708b2a6f00b2f9d379972c0140446377b625a74f.gz new file mode 100644 index 0000000000..5b07672671 Binary files /dev/null and b/_darcs/patches/20080916174105-84dde-708b2a6f00b2f9d379972c0140446377b625a74f.gz differ diff --git a/_darcs/patches/20080916174400-84dde-63781c5cd6a7c9a3dbc765dfa15084e3372effd5.gz b/_darcs/patches/20080916174400-84dde-63781c5cd6a7c9a3dbc765dfa15084e3372effd5.gz new file mode 100644 index 0000000000..83f80b329f Binary files /dev/null and b/_darcs/patches/20080916174400-84dde-63781c5cd6a7c9a3dbc765dfa15084e3372effd5.gz differ diff --git a/_darcs/patches/20080916174515-84dde-f0adac3444809b2f3bfc145eaf8e6f394124e9cc.gz b/_darcs/patches/20080916174515-84dde-f0adac3444809b2f3bfc145eaf8e6f394124e9cc.gz new file mode 100644 index 0000000000..f16f7ec708 Binary files /dev/null and b/_darcs/patches/20080916174515-84dde-f0adac3444809b2f3bfc145eaf8e6f394124e9cc.gz differ diff --git a/_darcs/patches/20080916185126-84dde-2983718fc2ab11874c839489290b8a827985274d.gz b/_darcs/patches/20080916185126-84dde-2983718fc2ab11874c839489290b8a827985274d.gz new file mode 100644 index 0000000000..938eabe6bf Binary files /dev/null and b/_darcs/patches/20080916185126-84dde-2983718fc2ab11874c839489290b8a827985274d.gz differ diff --git a/_darcs/patches/20080916195346-84dde-b5c846f713a970c41fd1b0671cb333e91f3cb920.gz b/_darcs/patches/20080916195346-84dde-b5c846f713a970c41fd1b0671cb333e91f3cb920.gz new file mode 100644 index 0000000000..bbac20342f Binary files /dev/null and b/_darcs/patches/20080916195346-84dde-b5c846f713a970c41fd1b0671cb333e91f3cb920.gz differ diff --git a/_darcs/patches/20080916195620-84dde-ebb6079fd08ba464ea0c11b792564f0bed27f09e.gz b/_darcs/patches/20080916195620-84dde-ebb6079fd08ba464ea0c11b792564f0bed27f09e.gz new file mode 100644 index 0000000000..ab7ed7d017 Binary files /dev/null and b/_darcs/patches/20080916195620-84dde-ebb6079fd08ba464ea0c11b792564f0bed27f09e.gz differ diff --git a/_darcs/patches/20080916200445-84dde-6c552453c98d82a00e0f0fbb82a42fc8b7f89d46.gz b/_darcs/patches/20080916200445-84dde-6c552453c98d82a00e0f0fbb82a42fc8b7f89d46.gz new file mode 100644 index 0000000000..94ca404944 Binary files /dev/null and b/_darcs/patches/20080916200445-84dde-6c552453c98d82a00e0f0fbb82a42fc8b7f89d46.gz differ diff --git a/_darcs/patches/20080916200703-84dde-4984552dfc6865f6660d45670af6e3dc56395ff5.gz b/_darcs/patches/20080916200703-84dde-4984552dfc6865f6660d45670af6e3dc56395ff5.gz new file mode 100644 index 0000000000..49d1527f34 Binary files /dev/null and b/_darcs/patches/20080916200703-84dde-4984552dfc6865f6660d45670af6e3dc56395ff5.gz differ diff --git a/_darcs/patches/20080916200942-84dde-257499b7cbc4553d3f4cf5c0eafc891b860a53b8.gz b/_darcs/patches/20080916200942-84dde-257499b7cbc4553d3f4cf5c0eafc891b860a53b8.gz new file mode 100644 index 0000000000..b31361ecc7 Binary files /dev/null and b/_darcs/patches/20080916200942-84dde-257499b7cbc4553d3f4cf5c0eafc891b860a53b8.gz differ diff --git a/_darcs/patches/20080916210813-84dde-c2cadb63b09f59ac6c76dc1205a56687de9483ce.gz b/_darcs/patches/20080916210813-84dde-c2cadb63b09f59ac6c76dc1205a56687de9483ce.gz new file mode 100644 index 0000000000..4afae891b8 Binary files /dev/null and b/_darcs/patches/20080916210813-84dde-c2cadb63b09f59ac6c76dc1205a56687de9483ce.gz differ diff --git a/_darcs/patches/20080916214134-84dde-ba11f44676d876cf0f29773c60fa95676ad07ebd.gz b/_darcs/patches/20080916214134-84dde-ba11f44676d876cf0f29773c60fa95676ad07ebd.gz new file mode 100644 index 0000000000..ad7777d9f4 Binary files /dev/null and b/_darcs/patches/20080916214134-84dde-ba11f44676d876cf0f29773c60fa95676ad07ebd.gz differ diff --git a/_darcs/patches/20080916214206-84dde-7ef1668240b2838461d4adc255070e90e90ed9f1.gz b/_darcs/patches/20080916214206-84dde-7ef1668240b2838461d4adc255070e90e90ed9f1.gz new file mode 100644 index 0000000000..1590d177d2 Binary files /dev/null and b/_darcs/patches/20080916214206-84dde-7ef1668240b2838461d4adc255070e90e90ed9f1.gz differ diff --git a/_darcs/patches/20080917112234-84dde-69fb6c2dc279b8fffd5c524673808d8991e99429.gz b/_darcs/patches/20080917112234-84dde-69fb6c2dc279b8fffd5c524673808d8991e99429.gz new file mode 100644 index 0000000000..2b62ea2a49 Binary files /dev/null and b/_darcs/patches/20080917112234-84dde-69fb6c2dc279b8fffd5c524673808d8991e99429.gz differ diff --git a/_darcs/patches/20080917112730-84dde-d8bf234bf2a0bf0aca17d653c3cdf57a76ad1a00.gz b/_darcs/patches/20080917112730-84dde-d8bf234bf2a0bf0aca17d653c3cdf57a76ad1a00.gz new file mode 100644 index 0000000000..e8442a76ab Binary files /dev/null and b/_darcs/patches/20080917112730-84dde-d8bf234bf2a0bf0aca17d653c3cdf57a76ad1a00.gz differ diff --git a/_darcs/patches/20080917174741-5ed1f-c090055487bab0df52d25ad6550d3850ef5f7661.gz b/_darcs/patches/20080917174741-5ed1f-c090055487bab0df52d25ad6550d3850ef5f7661.gz new file mode 100644 index 0000000000..6c7d3a79e7 Binary files /dev/null and b/_darcs/patches/20080917174741-5ed1f-c090055487bab0df52d25ad6550d3850ef5f7661.gz differ diff --git a/_darcs/patches/20080917175356-5ed1f-5a84dc8363d7c1dbf60a82782aefe5a0bd6f3d59.gz b/_darcs/patches/20080917175356-5ed1f-5a84dc8363d7c1dbf60a82782aefe5a0bd6f3d59.gz new file mode 100644 index 0000000000..3ec8448f47 Binary files /dev/null and b/_darcs/patches/20080917175356-5ed1f-5a84dc8363d7c1dbf60a82782aefe5a0bd6f3d59.gz differ diff --git a/_darcs/patches/20080917175512-5ed1f-0242ead7766806165266e424ed6d1cb9dd19abca.gz b/_darcs/patches/20080917175512-5ed1f-0242ead7766806165266e424ed6d1cb9dd19abca.gz new file mode 100644 index 0000000000..ac731459f6 Binary files /dev/null and b/_darcs/patches/20080917175512-5ed1f-0242ead7766806165266e424ed6d1cb9dd19abca.gz differ diff --git a/_darcs/patches/20080917180244-5ed1f-06e2ac2d8f094eacd12b316794b0599b57d76596.gz b/_darcs/patches/20080917180244-5ed1f-06e2ac2d8f094eacd12b316794b0599b57d76596.gz new file mode 100644 index 0000000000..30605d7859 Binary files /dev/null and b/_darcs/patches/20080917180244-5ed1f-06e2ac2d8f094eacd12b316794b0599b57d76596.gz differ diff --git a/_darcs/patches/20080917185142-5ed1f-1f87afb283161609bfc202824a39c53f3239b716.gz b/_darcs/patches/20080917185142-5ed1f-1f87afb283161609bfc202824a39c53f3239b716.gz new file mode 100644 index 0000000000..179b6fed7e Binary files /dev/null and b/_darcs/patches/20080917185142-5ed1f-1f87afb283161609bfc202824a39c53f3239b716.gz differ diff --git a/_darcs/patches/20080917185723-5ed1f-1795b591692f804df3140012af69560aa8204b77.gz b/_darcs/patches/20080917185723-5ed1f-1795b591692f804df3140012af69560aa8204b77.gz new file mode 100644 index 0000000000..453d3de621 Binary files /dev/null and b/_darcs/patches/20080917185723-5ed1f-1795b591692f804df3140012af69560aa8204b77.gz differ diff --git a/_darcs/patches/20080917185950-5ed1f-27fc1ee8d68df57b8dd687eb4e701beba2269924.gz b/_darcs/patches/20080917185950-5ed1f-27fc1ee8d68df57b8dd687eb4e701beba2269924.gz new file mode 100644 index 0000000000..d1e6224d62 Binary files /dev/null and b/_darcs/patches/20080917185950-5ed1f-27fc1ee8d68df57b8dd687eb4e701beba2269924.gz differ diff --git a/_darcs/patches/20080917190306-5ed1f-f2d339ce6d5c7c32940046012a0d4702be6eade2.gz b/_darcs/patches/20080917190306-5ed1f-f2d339ce6d5c7c32940046012a0d4702be6eade2.gz new file mode 100644 index 0000000000..71c18965f8 Binary files /dev/null and b/_darcs/patches/20080917190306-5ed1f-f2d339ce6d5c7c32940046012a0d4702be6eade2.gz differ diff --git a/_darcs/patches/20080917190445-5ed1f-4fdf97356c40eb076185eff790ce0d34b5117699.gz b/_darcs/patches/20080917190445-5ed1f-4fdf97356c40eb076185eff790ce0d34b5117699.gz new file mode 100644 index 0000000000..1a2bb1cb8e Binary files /dev/null and b/_darcs/patches/20080917190445-5ed1f-4fdf97356c40eb076185eff790ce0d34b5117699.gz differ diff --git a/_darcs/patches/20080917190745-5ed1f-c9305b7ee5f4cd79524491e8e0d676cf42f6ebc1.gz b/_darcs/patches/20080917190745-5ed1f-c9305b7ee5f4cd79524491e8e0d676cf42f6ebc1.gz new file mode 100644 index 0000000000..2d9d0c4d72 Binary files /dev/null and b/_darcs/patches/20080917190745-5ed1f-c9305b7ee5f4cd79524491e8e0d676cf42f6ebc1.gz differ diff --git a/_darcs/patches/20080917191652-5ed1f-f066e906146146cfe0ffb80055ea15d71f491f3c.gz b/_darcs/patches/20080917191652-5ed1f-f066e906146146cfe0ffb80055ea15d71f491f3c.gz new file mode 100644 index 0000000000..2105c5ab9b Binary files /dev/null and b/_darcs/patches/20080917191652-5ed1f-f066e906146146cfe0ffb80055ea15d71f491f3c.gz differ diff --git a/_darcs/patches/20080917192121-5ed1f-15603b7f7d5246caed3e1633cc3361e1288d8653.gz b/_darcs/patches/20080917192121-5ed1f-15603b7f7d5246caed3e1633cc3361e1288d8653.gz new file mode 100644 index 0000000000..8a94f880da Binary files /dev/null and b/_darcs/patches/20080917192121-5ed1f-15603b7f7d5246caed3e1633cc3361e1288d8653.gz differ diff --git a/_darcs/patches/20080918021421-5ed1f-bb52217316014fc7873acd6dd8696056ad69a7a1.gz b/_darcs/patches/20080918021421-5ed1f-bb52217316014fc7873acd6dd8696056ad69a7a1.gz new file mode 100644 index 0000000000..06d7de58cb Binary files /dev/null and b/_darcs/patches/20080918021421-5ed1f-bb52217316014fc7873acd6dd8696056ad69a7a1.gz differ diff --git a/_darcs/patches/20080918021727-5ed1f-ad74f71450db27e587b04fe19dfbbaf51f4d0300.gz b/_darcs/patches/20080918021727-5ed1f-ad74f71450db27e587b04fe19dfbbaf51f4d0300.gz new file mode 100644 index 0000000000..5dbe3dca66 Binary files /dev/null and b/_darcs/patches/20080918021727-5ed1f-ad74f71450db27e587b04fe19dfbbaf51f4d0300.gz differ diff --git a/_darcs/patches/20080918021926-5ed1f-93d05fdd25606664a619e027178d188a46cbde83.gz b/_darcs/patches/20080918021926-5ed1f-93d05fdd25606664a619e027178d188a46cbde83.gz new file mode 100644 index 0000000000..2ee0531e82 Binary files /dev/null and b/_darcs/patches/20080918021926-5ed1f-93d05fdd25606664a619e027178d188a46cbde83.gz differ diff --git a/_darcs/patches/20080918022410-5ed1f-0c4f5ca478246d4d8e56a0b71419d179ea66ff2b.gz b/_darcs/patches/20080918022410-5ed1f-0c4f5ca478246d4d8e56a0b71419d179ea66ff2b.gz new file mode 100644 index 0000000000..a587b19b3b Binary files /dev/null and b/_darcs/patches/20080918022410-5ed1f-0c4f5ca478246d4d8e56a0b71419d179ea66ff2b.gz differ diff --git a/_darcs/patches/20080918022558-5ed1f-d1be18fc2e383ab0f0482e2ea8903a6bc4f05bf8.gz b/_darcs/patches/20080918022558-5ed1f-d1be18fc2e383ab0f0482e2ea8903a6bc4f05bf8.gz new file mode 100644 index 0000000000..128f433710 Binary files /dev/null and b/_darcs/patches/20080918022558-5ed1f-d1be18fc2e383ab0f0482e2ea8903a6bc4f05bf8.gz differ diff --git a/_darcs/patches/20080918022756-5ed1f-c51413846aefe2e1308969376733433c9c4de222.gz b/_darcs/patches/20080918022756-5ed1f-c51413846aefe2e1308969376733433c9c4de222.gz new file mode 100644 index 0000000000..2e8e9a8006 Binary files /dev/null and b/_darcs/patches/20080918022756-5ed1f-c51413846aefe2e1308969376733433c9c4de222.gz differ diff --git a/_darcs/patches/20080918022841-5ed1f-73233547e9d09c32a6140c023b024cc5ad5c0f54.gz b/_darcs/patches/20080918022841-5ed1f-73233547e9d09c32a6140c023b024cc5ad5c0f54.gz new file mode 100644 index 0000000000..d16fa74673 Binary files /dev/null and b/_darcs/patches/20080918022841-5ed1f-73233547e9d09c32a6140c023b024cc5ad5c0f54.gz differ diff --git a/_darcs/patches/20080918023032-5ed1f-e8789b391eb88a181bb6232a5e5f199b0ccb2098.gz b/_darcs/patches/20080918023032-5ed1f-e8789b391eb88a181bb6232a5e5f199b0ccb2098.gz new file mode 100644 index 0000000000..14b44c8e2f Binary files /dev/null and b/_darcs/patches/20080918023032-5ed1f-e8789b391eb88a181bb6232a5e5f199b0ccb2098.gz differ diff --git a/_darcs/patches/20080918025232-5ed1f-825b72c981ee5e03391d5c84eca5dc4f9805227c.gz b/_darcs/patches/20080918025232-5ed1f-825b72c981ee5e03391d5c84eca5dc4f9805227c.gz new file mode 100644 index 0000000000..1269738926 Binary files /dev/null and b/_darcs/patches/20080918025232-5ed1f-825b72c981ee5e03391d5c84eca5dc4f9805227c.gz differ diff --git a/_darcs/patches/20080918025428-5ed1f-863296cf8f17d97b415e3ec78e7cc592ebb18b5d.gz b/_darcs/patches/20080918025428-5ed1f-863296cf8f17d97b415e3ec78e7cc592ebb18b5d.gz new file mode 100644 index 0000000000..42448c78ba Binary files /dev/null and b/_darcs/patches/20080918025428-5ed1f-863296cf8f17d97b415e3ec78e7cc592ebb18b5d.gz differ diff --git a/_darcs/patches/20080918025543-5ed1f-c017a351fce611516b18d64724ee2d7977a0bd47.gz b/_darcs/patches/20080918025543-5ed1f-c017a351fce611516b18d64724ee2d7977a0bd47.gz new file mode 100644 index 0000000000..1b0cff11ac Binary files /dev/null and b/_darcs/patches/20080918025543-5ed1f-c017a351fce611516b18d64724ee2d7977a0bd47.gz differ diff --git a/_darcs/patches/20080918025713-5ed1f-8bb2f106a567ef657a314f800da32efb7409ce2b.gz b/_darcs/patches/20080918025713-5ed1f-8bb2f106a567ef657a314f800da32efb7409ce2b.gz new file mode 100644 index 0000000000..808304c93c Binary files /dev/null and b/_darcs/patches/20080918025713-5ed1f-8bb2f106a567ef657a314f800da32efb7409ce2b.gz differ diff --git a/_darcs/patches/20080918032048-5ed1f-90a55a52e5444d9ae85c0d52af204b44fb895f58.gz b/_darcs/patches/20080918032048-5ed1f-90a55a52e5444d9ae85c0d52af204b44fb895f58.gz new file mode 100644 index 0000000000..7af0c74fdc Binary files /dev/null and b/_darcs/patches/20080918032048-5ed1f-90a55a52e5444d9ae85c0d52af204b44fb895f58.gz differ diff --git a/_darcs/patches/20080918135502-5ed1f-c13d8015d6784fbec259cfd62811661cd7b7c79f.gz b/_darcs/patches/20080918135502-5ed1f-c13d8015d6784fbec259cfd62811661cd7b7c79f.gz new file mode 100644 index 0000000000..3f9a0f63c9 Binary files /dev/null and b/_darcs/patches/20080918135502-5ed1f-c13d8015d6784fbec259cfd62811661cd7b7c79f.gz differ diff --git a/_darcs/patches/20080918135608-5ed1f-d753cb01f96e04871eb4f503ccd258674a03623a.gz b/_darcs/patches/20080918135608-5ed1f-d753cb01f96e04871eb4f503ccd258674a03623a.gz new file mode 100644 index 0000000000..252a48d9e1 Binary files /dev/null and b/_darcs/patches/20080918135608-5ed1f-d753cb01f96e04871eb4f503ccd258674a03623a.gz differ diff --git a/_darcs/patches/20080918140533-5ed1f-429c55bd99e468dc1e9d1ba4c8823f4027e94477.gz b/_darcs/patches/20080918140533-5ed1f-429c55bd99e468dc1e9d1ba4c8823f4027e94477.gz new file mode 100644 index 0000000000..d95dfb7891 Binary files /dev/null and b/_darcs/patches/20080918140533-5ed1f-429c55bd99e468dc1e9d1ba4c8823f4027e94477.gz differ diff --git a/_darcs/patches/20080918140756-5ed1f-800912781c9b34d4490cef462ad32a6afa7e799c.gz b/_darcs/patches/20080918140756-5ed1f-800912781c9b34d4490cef462ad32a6afa7e799c.gz new file mode 100644 index 0000000000..962d4a4905 Binary files /dev/null and b/_darcs/patches/20080918140756-5ed1f-800912781c9b34d4490cef462ad32a6afa7e799c.gz differ diff --git a/_darcs/patches/20080918145545-5ed1f-11100b4bd89ef289f31bbfd37a58c4395469f808.gz b/_darcs/patches/20080918145545-5ed1f-11100b4bd89ef289f31bbfd37a58c4395469f808.gz new file mode 100644 index 0000000000..8ac1b29f5a Binary files /dev/null and b/_darcs/patches/20080918145545-5ed1f-11100b4bd89ef289f31bbfd37a58c4395469f808.gz differ diff --git a/_darcs/patches/20080918150120-5ed1f-aaa30e8817bc1653fb5c28a6cd7697f960f9ef2c.gz b/_darcs/patches/20080918150120-5ed1f-aaa30e8817bc1653fb5c28a6cd7697f960f9ef2c.gz new file mode 100644 index 0000000000..2b45c63f31 Binary files /dev/null and b/_darcs/patches/20080918150120-5ed1f-aaa30e8817bc1653fb5c28a6cd7697f960f9ef2c.gz differ diff --git a/_darcs/patches/20080918150438-5ed1f-72853ffa3b2d4a3719ba72a1aedb7191f7213e4e.gz b/_darcs/patches/20080918150438-5ed1f-72853ffa3b2d4a3719ba72a1aedb7191f7213e4e.gz new file mode 100644 index 0000000000..e6a02a3710 Binary files /dev/null and b/_darcs/patches/20080918150438-5ed1f-72853ffa3b2d4a3719ba72a1aedb7191f7213e4e.gz differ diff --git a/_darcs/patches/20080918150753-5ed1f-ffb32e350a24e7a425f5ce2b46b3248f22523d2a.gz b/_darcs/patches/20080918150753-5ed1f-ffb32e350a24e7a425f5ce2b46b3248f22523d2a.gz new file mode 100644 index 0000000000..d6e1866317 Binary files /dev/null and b/_darcs/patches/20080918150753-5ed1f-ffb32e350a24e7a425f5ce2b46b3248f22523d2a.gz differ diff --git a/_darcs/patches/20080918151642-5ed1f-ceb2678a7818cadf3928257504f3e14eb179c749.gz b/_darcs/patches/20080918151642-5ed1f-ceb2678a7818cadf3928257504f3e14eb179c749.gz new file mode 100644 index 0000000000..e7b65ac783 Binary files /dev/null and b/_darcs/patches/20080918151642-5ed1f-ceb2678a7818cadf3928257504f3e14eb179c749.gz differ diff --git a/_darcs/patches/20080918151907-5ed1f-e747294fbd1545c622ae743de92cd7ff2bda1557.gz b/_darcs/patches/20080918151907-5ed1f-e747294fbd1545c622ae743de92cd7ff2bda1557.gz new file mode 100644 index 0000000000..9df1d10271 Binary files /dev/null and b/_darcs/patches/20080918151907-5ed1f-e747294fbd1545c622ae743de92cd7ff2bda1557.gz differ diff --git a/_darcs/patches/20080918152124-5ed1f-6792db4298b9edae8ce4607467cdbcae9faaa4f8.gz b/_darcs/patches/20080918152124-5ed1f-6792db4298b9edae8ce4607467cdbcae9faaa4f8.gz new file mode 100644 index 0000000000..0629d5b094 Binary files /dev/null and b/_darcs/patches/20080918152124-5ed1f-6792db4298b9edae8ce4607467cdbcae9faaa4f8.gz differ diff --git a/_darcs/patches/20080918152612-5ed1f-5ce8b0a834ffa50e04d6b47d1cac4c4b94f28e9e.gz b/_darcs/patches/20080918152612-5ed1f-5ce8b0a834ffa50e04d6b47d1cac4c4b94f28e9e.gz new file mode 100644 index 0000000000..a7614e2572 Binary files /dev/null and b/_darcs/patches/20080918152612-5ed1f-5ce8b0a834ffa50e04d6b47d1cac4c4b94f28e9e.gz differ diff --git a/_darcs/patches/20080918152823-5ed1f-bc7bea3305c39cfbc41f4a116b9a602ada556365.gz b/_darcs/patches/20080918152823-5ed1f-bc7bea3305c39cfbc41f4a116b9a602ada556365.gz new file mode 100644 index 0000000000..e11250bb4d Binary files /dev/null and b/_darcs/patches/20080918152823-5ed1f-bc7bea3305c39cfbc41f4a116b9a602ada556365.gz differ diff --git a/_darcs/patches/20080920174700-84dde-a00751e0eafd9adc4580924bb41c11b0649b7fe5.gz b/_darcs/patches/20080920174700-84dde-a00751e0eafd9adc4580924bb41c11b0649b7fe5.gz new file mode 100644 index 0000000000..2a99d9e963 Binary files /dev/null and b/_darcs/patches/20080920174700-84dde-a00751e0eafd9adc4580924bb41c11b0649b7fe5.gz differ diff --git a/_darcs/patches/20080920175339-84dde-e46d0e7b86e0752e8331cdfba26257b3ff9e601c.gz b/_darcs/patches/20080920175339-84dde-e46d0e7b86e0752e8331cdfba26257b3ff9e601c.gz new file mode 100644 index 0000000000..47e43118cc Binary files /dev/null and b/_darcs/patches/20080920175339-84dde-e46d0e7b86e0752e8331cdfba26257b3ff9e601c.gz differ diff --git a/_darcs/patches/20080922172631-84dde-357c532ac1fb1e2fec54680eb9d294a2ede23ab0.gz b/_darcs/patches/20080922172631-84dde-357c532ac1fb1e2fec54680eb9d294a2ede23ab0.gz new file mode 100644 index 0000000000..8fc9cfa937 Binary files /dev/null and b/_darcs/patches/20080922172631-84dde-357c532ac1fb1e2fec54680eb9d294a2ede23ab0.gz differ diff --git a/_darcs/patches/20080922190937-5ed1f-9439cd9cff178323ac1445f33e2520260b4b267e.gz b/_darcs/patches/20080922190937-5ed1f-9439cd9cff178323ac1445f33e2520260b4b267e.gz new file mode 100644 index 0000000000..93b2404f16 Binary files /dev/null and b/_darcs/patches/20080922190937-5ed1f-9439cd9cff178323ac1445f33e2520260b4b267e.gz differ diff --git a/_darcs/patches/20080922195824-5ed1f-f95ae048209e44e4de7698d98eb8a01121a2231d.gz b/_darcs/patches/20080922195824-5ed1f-f95ae048209e44e4de7698d98eb8a01121a2231d.gz new file mode 100644 index 0000000000..f07c9c3bb8 Binary files /dev/null and b/_darcs/patches/20080922195824-5ed1f-f95ae048209e44e4de7698d98eb8a01121a2231d.gz differ diff --git a/_darcs/patches/20080922212120-5ed1f-951b3a20590bbbb317909953287f6afb5354afa6.gz b/_darcs/patches/20080922212120-5ed1f-951b3a20590bbbb317909953287f6afb5354afa6.gz new file mode 100644 index 0000000000..c83cc0dc40 Binary files /dev/null and b/_darcs/patches/20080922212120-5ed1f-951b3a20590bbbb317909953287f6afb5354afa6.gz differ diff --git a/_darcs/patches/20080922213314-e558a-1e429af6660de21990236b2bb444f2b6f36e08df.gz b/_darcs/patches/20080922213314-e558a-1e429af6660de21990236b2bb444f2b6f36e08df.gz new file mode 100644 index 0000000000..7a5dfcb414 Binary files /dev/null and b/_darcs/patches/20080922213314-e558a-1e429af6660de21990236b2bb444f2b6f36e08df.gz differ diff --git a/_darcs/patches/20080922214003-5ed1f-f183262f41a430710946470133f61694e322fcad.gz b/_darcs/patches/20080922214003-5ed1f-f183262f41a430710946470133f61694e322fcad.gz new file mode 100644 index 0000000000..9fdeff392d Binary files /dev/null and b/_darcs/patches/20080922214003-5ed1f-f183262f41a430710946470133f61694e322fcad.gz differ diff --git a/_darcs/patches/20080922223239-5ed1f-1d34d37c75b2fc321e00063a788e9ca0c8baa359.gz b/_darcs/patches/20080922223239-5ed1f-1d34d37c75b2fc321e00063a788e9ca0c8baa359.gz new file mode 100644 index 0000000000..62b314ef11 Binary files /dev/null and b/_darcs/patches/20080922223239-5ed1f-1d34d37c75b2fc321e00063a788e9ca0c8baa359.gz differ diff --git a/_darcs/patches/20080922223429-e558a-4b456954f475c022be288e85a186ffa8794fad03.gz b/_darcs/patches/20080922223429-e558a-4b456954f475c022be288e85a186ffa8794fad03.gz new file mode 100644 index 0000000000..8106323c60 Binary files /dev/null and b/_darcs/patches/20080922223429-e558a-4b456954f475c022be288e85a186ffa8794fad03.gz differ diff --git a/_darcs/patches/20080922225031-84dde-c6967f46ae642f8943b0de77d9a82892ecadb4ce.gz b/_darcs/patches/20080922225031-84dde-c6967f46ae642f8943b0de77d9a82892ecadb4ce.gz new file mode 100644 index 0000000000..a37a65348b Binary files /dev/null and b/_darcs/patches/20080922225031-84dde-c6967f46ae642f8943b0de77d9a82892ecadb4ce.gz differ diff --git a/_darcs/patches/20080922225224-84dde-625df932503bbcfc34e4eecc6aec09c5a0509315.gz b/_darcs/patches/20080922225224-84dde-625df932503bbcfc34e4eecc6aec09c5a0509315.gz new file mode 100644 index 0000000000..a5bdba304b Binary files /dev/null and b/_darcs/patches/20080922225224-84dde-625df932503bbcfc34e4eecc6aec09c5a0509315.gz differ diff --git a/_darcs/patches/20080922225239-84dde-57e21338f073811b3ac3766f65e905849e1e9eb3.gz b/_darcs/patches/20080922225239-84dde-57e21338f073811b3ac3766f65e905849e1e9eb3.gz new file mode 100644 index 0000000000..cdedfa0d4d Binary files /dev/null and b/_darcs/patches/20080922225239-84dde-57e21338f073811b3ac3766f65e905849e1e9eb3.gz differ diff --git a/_darcs/patches/20080922225620-5ed1f-0dd8e76bcb8850744040e234e04b3182a0e13add.gz b/_darcs/patches/20080922225620-5ed1f-0dd8e76bcb8850744040e234e04b3182a0e13add.gz new file mode 100644 index 0000000000..2b65de146c Binary files /dev/null and b/_darcs/patches/20080922225620-5ed1f-0dd8e76bcb8850744040e234e04b3182a0e13add.gz differ diff --git a/_darcs/patches/20080922232328-5ed1f-846910a5f0bb379130055d035c3686e3e639912d.gz b/_darcs/patches/20080922232328-5ed1f-846910a5f0bb379130055d035c3686e3e639912d.gz new file mode 100644 index 0000000000..6417ffe6a4 Binary files /dev/null and b/_darcs/patches/20080922232328-5ed1f-846910a5f0bb379130055d035c3686e3e639912d.gz differ diff --git a/_darcs/patches/20080923031419-5ed1f-5435509496b882de27d4c3acca4697cc410ee7be.gz b/_darcs/patches/20080923031419-5ed1f-5435509496b882de27d4c3acca4697cc410ee7be.gz new file mode 100644 index 0000000000..bfaa0d4525 Binary files /dev/null and b/_darcs/patches/20080923031419-5ed1f-5435509496b882de27d4c3acca4697cc410ee7be.gz differ diff --git a/_darcs/patches/20080923043110-5ed1f-f818e92c96b3c88598cea1fb53a95d4b1b9fb19d.gz b/_darcs/patches/20080923043110-5ed1f-f818e92c96b3c88598cea1fb53a95d4b1b9fb19d.gz new file mode 100644 index 0000000000..0b79af095d Binary files /dev/null and b/_darcs/patches/20080923043110-5ed1f-f818e92c96b3c88598cea1fb53a95d4b1b9fb19d.gz differ diff --git a/_darcs/patches/20080923045449-5ed1f-073632fdff95f4869730d01d57cfdb83b31401a9.gz b/_darcs/patches/20080923045449-5ed1f-073632fdff95f4869730d01d57cfdb83b31401a9.gz new file mode 100644 index 0000000000..f783df7c24 Binary files /dev/null and b/_darcs/patches/20080923045449-5ed1f-073632fdff95f4869730d01d57cfdb83b31401a9.gz differ diff --git a/_darcs/patches/20080923045458-5ed1f-348585c4e0f04a1715dc9f0c0092bcbf7af0a9ef.gz b/_darcs/patches/20080923045458-5ed1f-348585c4e0f04a1715dc9f0c0092bcbf7af0a9ef.gz new file mode 100644 index 0000000000..043b8715a0 Binary files /dev/null and b/_darcs/patches/20080923045458-5ed1f-348585c4e0f04a1715dc9f0c0092bcbf7af0a9ef.gz differ diff --git a/_darcs/patches/20080923050637-5ed1f-c568033b5c00ac32d9ad63b5a4d18a81c09ad525.gz b/_darcs/patches/20080923050637-5ed1f-c568033b5c00ac32d9ad63b5a4d18a81c09ad525.gz new file mode 100644 index 0000000000..7a0a2a7620 Binary files /dev/null and b/_darcs/patches/20080923050637-5ed1f-c568033b5c00ac32d9ad63b5a4d18a81c09ad525.gz differ diff --git a/_darcs/patches/20080923054413-5ed1f-a317e07925101215e87d2db0c574d20c1cfac665.gz b/_darcs/patches/20080923054413-5ed1f-a317e07925101215e87d2db0c574d20c1cfac665.gz new file mode 100644 index 0000000000..c3a42d8d1f Binary files /dev/null and b/_darcs/patches/20080923054413-5ed1f-a317e07925101215e87d2db0c574d20c1cfac665.gz differ diff --git a/_darcs/patches/20080923060314-5ed1f-2ec4894251b99a2f9e9763ecc41659533bfab2eb.gz b/_darcs/patches/20080923060314-5ed1f-2ec4894251b99a2f9e9763ecc41659533bfab2eb.gz new file mode 100644 index 0000000000..6a1f939826 Binary files /dev/null and b/_darcs/patches/20080923060314-5ed1f-2ec4894251b99a2f9e9763ecc41659533bfab2eb.gz differ diff --git a/_darcs/patches/20080923063029-5ed1f-de15e9af49acb7e402127b45cd5b6c2814f559bb.gz b/_darcs/patches/20080923063029-5ed1f-de15e9af49acb7e402127b45cd5b6c2814f559bb.gz new file mode 100644 index 0000000000..c2dac5e07c Binary files /dev/null and b/_darcs/patches/20080923063029-5ed1f-de15e9af49acb7e402127b45cd5b6c2814f559bb.gz differ diff --git a/_darcs/patches/20080923065021-5ed1f-cef0ed94149b862aa4bf3b1d0189d6fb6d15aaf7.gz b/_darcs/patches/20080923065021-5ed1f-cef0ed94149b862aa4bf3b1d0189d6fb6d15aaf7.gz new file mode 100644 index 0000000000..982a216fd9 Binary files /dev/null and b/_darcs/patches/20080923065021-5ed1f-cef0ed94149b862aa4bf3b1d0189d6fb6d15aaf7.gz differ diff --git a/_darcs/patches/20080923065211-5ed1f-7d028a9e42be5ba1151a172d0a4e81f4c618dd2e.gz b/_darcs/patches/20080923065211-5ed1f-7d028a9e42be5ba1151a172d0a4e81f4c618dd2e.gz new file mode 100644 index 0000000000..caa651f976 Binary files /dev/null and b/_darcs/patches/20080923065211-5ed1f-7d028a9e42be5ba1151a172d0a4e81f4c618dd2e.gz differ diff --git a/_darcs/patches/20080923072150-5ed1f-e885ab238ccf5bb4b21486b37cf8449812cae7ee.gz b/_darcs/patches/20080923072150-5ed1f-e885ab238ccf5bb4b21486b37cf8449812cae7ee.gz new file mode 100644 index 0000000000..70dd15fd4c Binary files /dev/null and b/_darcs/patches/20080923072150-5ed1f-e885ab238ccf5bb4b21486b37cf8449812cae7ee.gz differ diff --git a/_darcs/patches/20080923074529-7b5ce-818fc75dd3a59ae2f1de1b73e1884dd8a826bd6e.gz b/_darcs/patches/20080923074529-7b5ce-818fc75dd3a59ae2f1de1b73e1884dd8a826bd6e.gz new file mode 100644 index 0000000000..ab7ddea352 Binary files /dev/null and b/_darcs/patches/20080923074529-7b5ce-818fc75dd3a59ae2f1de1b73e1884dd8a826bd6e.gz differ diff --git a/_darcs/patches/20080923080246-5ed1f-a14a101fe2c8cb436ba278dc1b1af9ca3a02f634.gz b/_darcs/patches/20080923080246-5ed1f-a14a101fe2c8cb436ba278dc1b1af9ca3a02f634.gz new file mode 100644 index 0000000000..fee82a61c5 Binary files /dev/null and b/_darcs/patches/20080923080246-5ed1f-a14a101fe2c8cb436ba278dc1b1af9ca3a02f634.gz differ diff --git a/_darcs/patches/20080923080855-5ed1f-1c19826896f247e9d4f88da07a6fc2134726b4ed.gz b/_darcs/patches/20080923080855-5ed1f-1c19826896f247e9d4f88da07a6fc2134726b4ed.gz new file mode 100644 index 0000000000..098c53da35 Binary files /dev/null and b/_darcs/patches/20080923080855-5ed1f-1c19826896f247e9d4f88da07a6fc2134726b4ed.gz differ diff --git a/_darcs/patches/20080923083632-7b5ce-02498acc9fba3070b984eb473ec7825a5eaa2a77.gz b/_darcs/patches/20080923083632-7b5ce-02498acc9fba3070b984eb473ec7825a5eaa2a77.gz new file mode 100644 index 0000000000..9e580552c4 Binary files /dev/null and b/_darcs/patches/20080923083632-7b5ce-02498acc9fba3070b984eb473ec7825a5eaa2a77.gz differ diff --git a/_darcs/patches/20080923084145-7b5ce-25cfef64778010135234046be25294a3c7860419.gz b/_darcs/patches/20080923084145-7b5ce-25cfef64778010135234046be25294a3c7860419.gz new file mode 100644 index 0000000000..cc7bec25aa Binary files /dev/null and b/_darcs/patches/20080923084145-7b5ce-25cfef64778010135234046be25294a3c7860419.gz differ diff --git a/_darcs/patches/20080923140710-f6e2c-9389f76d0e512c97b44c9d0d52ef3a15cb89d795.gz b/_darcs/patches/20080923140710-f6e2c-9389f76d0e512c97b44c9d0d52ef3a15cb89d795.gz new file mode 100644 index 0000000000..85713ec91e Binary files /dev/null and b/_darcs/patches/20080923140710-f6e2c-9389f76d0e512c97b44c9d0d52ef3a15cb89d795.gz differ diff --git a/_darcs/patches/20080923174302-5ed1f-bf1e3339745eb497523912c2e58298b25ebe89d5.gz b/_darcs/patches/20080923174302-5ed1f-bf1e3339745eb497523912c2e58298b25ebe89d5.gz new file mode 100644 index 0000000000..9f341dd288 Binary files /dev/null and b/_darcs/patches/20080923174302-5ed1f-bf1e3339745eb497523912c2e58298b25ebe89d5.gz differ diff --git a/_darcs/patches/20080923181648-5ed1f-a30ef5c24b8b9e49e5c8ba8e023574bb7d9b1ef3.gz b/_darcs/patches/20080923181648-5ed1f-a30ef5c24b8b9e49e5c8ba8e023574bb7d9b1ef3.gz new file mode 100644 index 0000000000..ff8ded243d Binary files /dev/null and b/_darcs/patches/20080923181648-5ed1f-a30ef5c24b8b9e49e5c8ba8e023574bb7d9b1ef3.gz differ diff --git a/_darcs/patches/20080923182024-5ed1f-cd751ae81cde929ab377734a41e0cdad321ffec5.gz b/_darcs/patches/20080923182024-5ed1f-cd751ae81cde929ab377734a41e0cdad321ffec5.gz new file mode 100644 index 0000000000..2d85f5dfdf Binary files /dev/null and b/_darcs/patches/20080923182024-5ed1f-cd751ae81cde929ab377734a41e0cdad321ffec5.gz differ diff --git a/_darcs/patches/20080923183035-5ed1f-3a121f45bb373c25cf56fd83c37b552b522844dd.gz b/_darcs/patches/20080923183035-5ed1f-3a121f45bb373c25cf56fd83c37b552b522844dd.gz new file mode 100644 index 0000000000..79946154c5 Binary files /dev/null and b/_darcs/patches/20080923183035-5ed1f-3a121f45bb373c25cf56fd83c37b552b522844dd.gz differ diff --git a/_darcs/patches/20080923184851-f6e2c-736ba9b33f02ae5429df6ce8f27418cfbc09db25.gz b/_darcs/patches/20080923184851-f6e2c-736ba9b33f02ae5429df6ce8f27418cfbc09db25.gz new file mode 100644 index 0000000000..15b8c56c13 Binary files /dev/null and b/_darcs/patches/20080923184851-f6e2c-736ba9b33f02ae5429df6ce8f27418cfbc09db25.gz differ diff --git a/_darcs/patches/20080923213829-7b5ce-da5c5d25639812403eb59787c4c429cc9931d08a.gz b/_darcs/patches/20080923213829-7b5ce-da5c5d25639812403eb59787c4c429cc9931d08a.gz new file mode 100644 index 0000000000..d716fd5726 Binary files /dev/null and b/_darcs/patches/20080923213829-7b5ce-da5c5d25639812403eb59787c4c429cc9931d08a.gz differ diff --git a/_darcs/patches/20080923214601-f6e2c-350de6e8df8bb6e9e5f3dbb1ea43360fc55ee847.gz b/_darcs/patches/20080923214601-f6e2c-350de6e8df8bb6e9e5f3dbb1ea43360fc55ee847.gz new file mode 100644 index 0000000000..4aab7a385a Binary files /dev/null and b/_darcs/patches/20080923214601-f6e2c-350de6e8df8bb6e9e5f3dbb1ea43360fc55ee847.gz differ diff --git a/_darcs/patches/20080923221439-7b5ce-be8cfce3a34039bd665348a66812b3a3859a0561.gz b/_darcs/patches/20080923221439-7b5ce-be8cfce3a34039bd665348a66812b3a3859a0561.gz new file mode 100644 index 0000000000..34ab4b3725 Binary files /dev/null and b/_darcs/patches/20080923221439-7b5ce-be8cfce3a34039bd665348a66812b3a3859a0561.gz differ diff --git a/_darcs/patches/20080923231921-7b5ce-751490e59ae0a76cebf83eea98da902a63e39645.gz b/_darcs/patches/20080923231921-7b5ce-751490e59ae0a76cebf83eea98da902a63e39645.gz new file mode 100644 index 0000000000..237dd569f5 Binary files /dev/null and b/_darcs/patches/20080923231921-7b5ce-751490e59ae0a76cebf83eea98da902a63e39645.gz differ diff --git a/_darcs/patches/20080924023615-7b5ce-c747e8236b3967824ed93f18285e1b6e0b46c3f0.gz b/_darcs/patches/20080924023615-7b5ce-c747e8236b3967824ed93f18285e1b6e0b46c3f0.gz new file mode 100644 index 0000000000..71833a7743 Binary files /dev/null and b/_darcs/patches/20080924023615-7b5ce-c747e8236b3967824ed93f18285e1b6e0b46c3f0.gz differ diff --git a/_darcs/patches/20080924052431-7b5ce-589a3f5352f241c5c938ed855601d971e8d69fff.gz b/_darcs/patches/20080924052431-7b5ce-589a3f5352f241c5c938ed855601d971e8d69fff.gz new file mode 100644 index 0000000000..b697d224cb Binary files /dev/null and b/_darcs/patches/20080924052431-7b5ce-589a3f5352f241c5c938ed855601d971e8d69fff.gz differ diff --git a/_darcs/patches/20080924060455-7b5ce-71ac4bb3a80ca44e6ae758d2287d50c918d1d908.gz b/_darcs/patches/20080924060455-7b5ce-71ac4bb3a80ca44e6ae758d2287d50c918d1d908.gz new file mode 100644 index 0000000000..176446ae07 Binary files /dev/null and b/_darcs/patches/20080924060455-7b5ce-71ac4bb3a80ca44e6ae758d2287d50c918d1d908.gz differ diff --git a/_darcs/patches/20080924092031-f6e2c-8def504406ee1a13273bb67faafe3a3327ae4a44.gz b/_darcs/patches/20080924092031-f6e2c-8def504406ee1a13273bb67faafe3a3327ae4a44.gz new file mode 100644 index 0000000000..52bec04aa9 Binary files /dev/null and b/_darcs/patches/20080924092031-f6e2c-8def504406ee1a13273bb67faafe3a3327ae4a44.gz differ diff --git a/_darcs/patches/20080924113550-f6e2c-8791d68684424ef028049ee9ed95b3853dd8f770.gz b/_darcs/patches/20080924113550-f6e2c-8791d68684424ef028049ee9ed95b3853dd8f770.gz new file mode 100644 index 0000000000..ace88c4f4a Binary files /dev/null and b/_darcs/patches/20080924113550-f6e2c-8791d68684424ef028049ee9ed95b3853dd8f770.gz differ diff --git a/_darcs/patches/20080924150828-f6e2c-4c592c60b7ff6b0cae5a222a5d871fc875217e13.gz b/_darcs/patches/20080924150828-f6e2c-4c592c60b7ff6b0cae5a222a5d871fc875217e13.gz new file mode 100644 index 0000000000..02f3756b47 Binary files /dev/null and b/_darcs/patches/20080924150828-f6e2c-4c592c60b7ff6b0cae5a222a5d871fc875217e13.gz differ diff --git a/_darcs/patches/20080924150834-5ed1f-54cd945f61e43bc06768037c60c1e6180a8feead.gz b/_darcs/patches/20080924150834-5ed1f-54cd945f61e43bc06768037c60c1e6180a8feead.gz new file mode 100644 index 0000000000..96ee20701a Binary files /dev/null and b/_darcs/patches/20080924150834-5ed1f-54cd945f61e43bc06768037c60c1e6180a8feead.gz differ diff --git a/_darcs/patches/20080924161708-5ed1f-c215f149abc11b07c34fda59c90a26d8b7603d38.gz b/_darcs/patches/20080924161708-5ed1f-c215f149abc11b07c34fda59c90a26d8b7603d38.gz new file mode 100644 index 0000000000..d9e67df82d Binary files /dev/null and b/_darcs/patches/20080924161708-5ed1f-c215f149abc11b07c34fda59c90a26d8b7603d38.gz differ diff --git a/_darcs/patches/20080924194608-f6e2c-cb28d1df4a79b8bb47e22f4c323e90b00a6917ae.gz b/_darcs/patches/20080924194608-f6e2c-cb28d1df4a79b8bb47e22f4c323e90b00a6917ae.gz new file mode 100644 index 0000000000..7b162bf2b1 Binary files /dev/null and b/_darcs/patches/20080924194608-f6e2c-cb28d1df4a79b8bb47e22f4c323e90b00a6917ae.gz differ diff --git a/_darcs/patches/20080924200710-5ed1f-be75fac6babb59469a1967436c32f0d8c8271680.gz b/_darcs/patches/20080924200710-5ed1f-be75fac6babb59469a1967436c32f0d8c8271680.gz new file mode 100644 index 0000000000..ec178290c5 Binary files /dev/null and b/_darcs/patches/20080924200710-5ed1f-be75fac6babb59469a1967436c32f0d8c8271680.gz differ diff --git a/_darcs/patches/20080924202211-5ed1f-a39e520b113a843bee6dd9e2e56c1a7afb2bb896.gz b/_darcs/patches/20080924202211-5ed1f-a39e520b113a843bee6dd9e2e56c1a7afb2bb896.gz new file mode 100644 index 0000000000..13dc34cf7e Binary files /dev/null and b/_darcs/patches/20080924202211-5ed1f-a39e520b113a843bee6dd9e2e56c1a7afb2bb896.gz differ diff --git a/_darcs/patches/20080924204131-5ed1f-099c73720b3a4f2263ca28566fcd6b4c809fd4ab.gz b/_darcs/patches/20080924204131-5ed1f-099c73720b3a4f2263ca28566fcd6b4c809fd4ab.gz new file mode 100644 index 0000000000..5592d74346 Binary files /dev/null and b/_darcs/patches/20080924204131-5ed1f-099c73720b3a4f2263ca28566fcd6b4c809fd4ab.gz differ diff --git a/_darcs/patches/20080924205318-f6e2c-fd8ae92a29a3f915cce45dd6797a8c294713d65b.gz b/_darcs/patches/20080924205318-f6e2c-fd8ae92a29a3f915cce45dd6797a8c294713d65b.gz new file mode 100644 index 0000000000..6d9b440431 Binary files /dev/null and b/_darcs/patches/20080924205318-f6e2c-fd8ae92a29a3f915cce45dd6797a8c294713d65b.gz differ diff --git a/_darcs/patches/20080924210153-f6e2c-77281b7f449435bd0129addb4850860b6e85739b.gz b/_darcs/patches/20080924210153-f6e2c-77281b7f449435bd0129addb4850860b6e85739b.gz new file mode 100644 index 0000000000..cd859eff7e Binary files /dev/null and b/_darcs/patches/20080924210153-f6e2c-77281b7f449435bd0129addb4850860b6e85739b.gz differ diff --git a/_darcs/patches/20080924210254-5ed1f-2c6fd16b9be0dafb3b72ef23b53193db5e188b46.gz b/_darcs/patches/20080924210254-5ed1f-2c6fd16b9be0dafb3b72ef23b53193db5e188b46.gz new file mode 100644 index 0000000000..8dcb71ec27 Binary files /dev/null and b/_darcs/patches/20080924210254-5ed1f-2c6fd16b9be0dafb3b72ef23b53193db5e188b46.gz differ diff --git a/_darcs/patches/20080924210459-5ed1f-8fb83a73373b4077a47a7f78b26161adcbe1f977.gz b/_darcs/patches/20080924210459-5ed1f-8fb83a73373b4077a47a7f78b26161adcbe1f977.gz new file mode 100644 index 0000000000..6825538dee Binary files /dev/null and b/_darcs/patches/20080924210459-5ed1f-8fb83a73373b4077a47a7f78b26161adcbe1f977.gz differ diff --git a/_darcs/patches/20080924210757-5ed1f-beca326b5c38b086f5ab195b7478c944881ca469.gz b/_darcs/patches/20080924210757-5ed1f-beca326b5c38b086f5ab195b7478c944881ca469.gz new file mode 100644 index 0000000000..4d67a6d01a Binary files /dev/null and b/_darcs/patches/20080924210757-5ed1f-beca326b5c38b086f5ab195b7478c944881ca469.gz differ diff --git a/_darcs/patches/20080924234857-7b5ce-2f0c60901ee582bdd76ae9596253c2efcc6dc50d.gz b/_darcs/patches/20080924234857-7b5ce-2f0c60901ee582bdd76ae9596253c2efcc6dc50d.gz new file mode 100644 index 0000000000..616ffd19f2 Binary files /dev/null and b/_darcs/patches/20080924234857-7b5ce-2f0c60901ee582bdd76ae9596253c2efcc6dc50d.gz differ diff --git a/_darcs/patches/20080925092854-f6e2c-b1b73a1f01e8541cd354edfd9b879447a52b928e.gz b/_darcs/patches/20080925092854-f6e2c-b1b73a1f01e8541cd354edfd9b879447a52b928e.gz new file mode 100644 index 0000000000..5157d7191e Binary files /dev/null and b/_darcs/patches/20080925092854-f6e2c-b1b73a1f01e8541cd354edfd9b879447a52b928e.gz differ diff --git a/_darcs/patches/20080925113246-f6e2c-3791dad4a43f3c5f295f3cb7d629eaddc8b44a28.gz b/_darcs/patches/20080925113246-f6e2c-3791dad4a43f3c5f295f3cb7d629eaddc8b44a28.gz new file mode 100644 index 0000000000..51f6fe44d8 Binary files /dev/null and b/_darcs/patches/20080925113246-f6e2c-3791dad4a43f3c5f295f3cb7d629eaddc8b44a28.gz differ diff --git a/_darcs/patches/20080926012015-7b5ce-da94465ff9c027183e0e674b6152902c302d0131.gz b/_darcs/patches/20080926012015-7b5ce-da94465ff9c027183e0e674b6152902c302d0131.gz new file mode 100644 index 0000000000..47f50476d2 Binary files /dev/null and b/_darcs/patches/20080926012015-7b5ce-da94465ff9c027183e0e674b6152902c302d0131.gz differ diff --git a/_darcs/patches/20080926104442-f6e2c-6684c535eef665f6196f160f02e4763957c3613c.gz b/_darcs/patches/20080926104442-f6e2c-6684c535eef665f6196f160f02e4763957c3613c.gz new file mode 100644 index 0000000000..804c153d53 Binary files /dev/null and b/_darcs/patches/20080926104442-f6e2c-6684c535eef665f6196f160f02e4763957c3613c.gz differ diff --git a/_darcs/patches/20080926145008-5ed1f-8a60ed3c5adbfe75aa044732e8d10dbdb9b93089.gz b/_darcs/patches/20080926145008-5ed1f-8a60ed3c5adbfe75aa044732e8d10dbdb9b93089.gz new file mode 100644 index 0000000000..28e2569556 Binary files /dev/null and b/_darcs/patches/20080926145008-5ed1f-8a60ed3c5adbfe75aa044732e8d10dbdb9b93089.gz differ diff --git a/_darcs/patches/20080926160941-5ed1f-922de078b4c1941853ad014edf9a17fae486f8cf.gz b/_darcs/patches/20080926160941-5ed1f-922de078b4c1941853ad014edf9a17fae486f8cf.gz new file mode 100644 index 0000000000..28a3fbf79a Binary files /dev/null and b/_darcs/patches/20080926160941-5ed1f-922de078b4c1941853ad014edf9a17fae486f8cf.gz differ diff --git a/_darcs/patches/20080926161540-5ed1f-2e9dc6f2297c612208214a6d52f36ce0dd7aa4de.gz b/_darcs/patches/20080926161540-5ed1f-2e9dc6f2297c612208214a6d52f36ce0dd7aa4de.gz new file mode 100644 index 0000000000..92f73078dc Binary files /dev/null and b/_darcs/patches/20080926161540-5ed1f-2e9dc6f2297c612208214a6d52f36ce0dd7aa4de.gz differ diff --git a/_darcs/patches/20080926161652-5ed1f-45aee985c6755642d346b864926b2346900c4055.gz b/_darcs/patches/20080926161652-5ed1f-45aee985c6755642d346b864926b2346900c4055.gz new file mode 100644 index 0000000000..6055292e66 Binary files /dev/null and b/_darcs/patches/20080926161652-5ed1f-45aee985c6755642d346b864926b2346900c4055.gz differ diff --git a/_darcs/patches/20080926161824-5ed1f-b4fb53e5ca65bb099aabbba6ea60a13496f669a2.gz b/_darcs/patches/20080926161824-5ed1f-b4fb53e5ca65bb099aabbba6ea60a13496f669a2.gz new file mode 100644 index 0000000000..5902cd7bc3 Binary files /dev/null and b/_darcs/patches/20080926161824-5ed1f-b4fb53e5ca65bb099aabbba6ea60a13496f669a2.gz differ diff --git a/_darcs/patches/20080926161946-5ed1f-496b47c72a77fb26610af465af9d9e26c488d315.gz b/_darcs/patches/20080926161946-5ed1f-496b47c72a77fb26610af465af9d9e26c488d315.gz new file mode 100644 index 0000000000..8109b491cb Binary files /dev/null and b/_darcs/patches/20080926161946-5ed1f-496b47c72a77fb26610af465af9d9e26c488d315.gz differ diff --git a/_darcs/patches/20080926162347-5ed1f-ddb17266f5a60ee85db5fdfb9c8bd12311da3c73.gz b/_darcs/patches/20080926162347-5ed1f-ddb17266f5a60ee85db5fdfb9c8bd12311da3c73.gz new file mode 100644 index 0000000000..a5698cb11e Binary files /dev/null and b/_darcs/patches/20080926162347-5ed1f-ddb17266f5a60ee85db5fdfb9c8bd12311da3c73.gz differ diff --git a/_darcs/patches/20080926163030-5ed1f-c2d375d8a8c2097456ffb3e09e55daacae2cc903.gz b/_darcs/patches/20080926163030-5ed1f-c2d375d8a8c2097456ffb3e09e55daacae2cc903.gz new file mode 100644 index 0000000000..7fb8e5468f Binary files /dev/null and b/_darcs/patches/20080926163030-5ed1f-c2d375d8a8c2097456ffb3e09e55daacae2cc903.gz differ diff --git a/_darcs/patches/20080926163357-5ed1f-49bd6d85d34d0e6ac3514c06d99e5b5b9a78b0fc.gz b/_darcs/patches/20080926163357-5ed1f-49bd6d85d34d0e6ac3514c06d99e5b5b9a78b0fc.gz new file mode 100644 index 0000000000..b0ea1487b4 Binary files /dev/null and b/_darcs/patches/20080926163357-5ed1f-49bd6d85d34d0e6ac3514c06d99e5b5b9a78b0fc.gz differ diff --git a/_darcs/patches/20080926163555-5ed1f-b2c7f8b9fde0af801e33dc92e4177d1ed4f80159.gz b/_darcs/patches/20080926163555-5ed1f-b2c7f8b9fde0af801e33dc92e4177d1ed4f80159.gz new file mode 100644 index 0000000000..fa9359ab8f Binary files /dev/null and b/_darcs/patches/20080926163555-5ed1f-b2c7f8b9fde0af801e33dc92e4177d1ed4f80159.gz differ diff --git a/_darcs/patches/20080926164021-5ed1f-833db670e260c68fc02b0a2a60a2829f247742a1.gz b/_darcs/patches/20080926164021-5ed1f-833db670e260c68fc02b0a2a60a2829f247742a1.gz new file mode 100644 index 0000000000..0e05032245 Binary files /dev/null and b/_darcs/patches/20080926164021-5ed1f-833db670e260c68fc02b0a2a60a2829f247742a1.gz differ diff --git a/_darcs/patches/20080926164413-5ed1f-d0bbbab5215e43d182e8807fc9fec6cc86dae1ae.gz b/_darcs/patches/20080926164413-5ed1f-d0bbbab5215e43d182e8807fc9fec6cc86dae1ae.gz new file mode 100644 index 0000000000..705deeca72 Binary files /dev/null and b/_darcs/patches/20080926164413-5ed1f-d0bbbab5215e43d182e8807fc9fec6cc86dae1ae.gz differ diff --git a/_darcs/patches/20080926164532-5ed1f-1ed3922f205dea0805c7a77618fdf8c9e1a4de02.gz b/_darcs/patches/20080926164532-5ed1f-1ed3922f205dea0805c7a77618fdf8c9e1a4de02.gz new file mode 100644 index 0000000000..2c407d32cb Binary files /dev/null and b/_darcs/patches/20080926164532-5ed1f-1ed3922f205dea0805c7a77618fdf8c9e1a4de02.gz differ diff --git a/_darcs/patches/20080926165029-5ed1f-60059ffeac9a39326fc6286faf4ac13c35127f25.gz b/_darcs/patches/20080926165029-5ed1f-60059ffeac9a39326fc6286faf4ac13c35127f25.gz new file mode 100644 index 0000000000..613d51547b Binary files /dev/null and b/_darcs/patches/20080926165029-5ed1f-60059ffeac9a39326fc6286faf4ac13c35127f25.gz differ diff --git a/_darcs/patches/20080926165201-5ed1f-8efd0369f1f367dacca450ac3bffd755ea841f6f.gz b/_darcs/patches/20080926165201-5ed1f-8efd0369f1f367dacca450ac3bffd755ea841f6f.gz new file mode 100644 index 0000000000..590e8f4183 Binary files /dev/null and b/_darcs/patches/20080926165201-5ed1f-8efd0369f1f367dacca450ac3bffd755ea841f6f.gz differ diff --git a/_darcs/patches/20080926165310-5ed1f-e6d17801c4e9f58cbbbfa774e79583221fdca01f.gz b/_darcs/patches/20080926165310-5ed1f-e6d17801c4e9f58cbbbfa774e79583221fdca01f.gz new file mode 100644 index 0000000000..4f958754c0 Binary files /dev/null and b/_darcs/patches/20080926165310-5ed1f-e6d17801c4e9f58cbbbfa774e79583221fdca01f.gz differ diff --git a/_darcs/patches/20080926190543-7b5ce-b67b1f2a27825a38782ea8a7a11cc5f50e49725a.gz b/_darcs/patches/20080926190543-7b5ce-b67b1f2a27825a38782ea8a7a11cc5f50e49725a.gz new file mode 100644 index 0000000000..e4208038dd Binary files /dev/null and b/_darcs/patches/20080926190543-7b5ce-b67b1f2a27825a38782ea8a7a11cc5f50e49725a.gz differ diff --git a/_darcs/patches/20080926195501-5ed1f-b811fac3320a0b6d8002771caa9463ba9a0889a1.gz b/_darcs/patches/20080926195501-5ed1f-b811fac3320a0b6d8002771caa9463ba9a0889a1.gz new file mode 100644 index 0000000000..e2fefe974f Binary files /dev/null and b/_darcs/patches/20080926195501-5ed1f-b811fac3320a0b6d8002771caa9463ba9a0889a1.gz differ diff --git a/_darcs/patches/20080926200102-5ed1f-debbc18981424d7724277ac82e5fbfd5e797090e.gz b/_darcs/patches/20080926200102-5ed1f-debbc18981424d7724277ac82e5fbfd5e797090e.gz new file mode 100644 index 0000000000..197063095e Binary files /dev/null and b/_darcs/patches/20080926200102-5ed1f-debbc18981424d7724277ac82e5fbfd5e797090e.gz differ diff --git a/_darcs/patches/20080926214627-f6e2c-f0aa98fe5e76c4aaa3bbaeb400fe85704a31a8c9.gz b/_darcs/patches/20080926214627-f6e2c-f0aa98fe5e76c4aaa3bbaeb400fe85704a31a8c9.gz new file mode 100644 index 0000000000..ee906ff723 Binary files /dev/null and b/_darcs/patches/20080926214627-f6e2c-f0aa98fe5e76c4aaa3bbaeb400fe85704a31a8c9.gz differ diff --git a/_darcs/patches/20080927123507-5ed1f-57bc3843352007ae47689a94483d315984276b45.gz b/_darcs/patches/20080927123507-5ed1f-57bc3843352007ae47689a94483d315984276b45.gz new file mode 100644 index 0000000000..370938e112 Binary files /dev/null and b/_darcs/patches/20080927123507-5ed1f-57bc3843352007ae47689a94483d315984276b45.gz differ diff --git a/_darcs/patches/20080927210355-f6e2c-e434c363a6d849215ceb7ee366f35c0a3cd92c8e.gz b/_darcs/patches/20080927210355-f6e2c-e434c363a6d849215ceb7ee366f35c0a3cd92c8e.gz new file mode 100644 index 0000000000..f04e8cf149 Binary files /dev/null and b/_darcs/patches/20080927210355-f6e2c-e434c363a6d849215ceb7ee366f35c0a3cd92c8e.gz differ diff --git a/_darcs/patches/20080928120119-5ed1f-ead542348bcd3cf315be6f42934353154402eb16.gz b/_darcs/patches/20080928120119-5ed1f-ead542348bcd3cf315be6f42934353154402eb16.gz new file mode 100644 index 0000000000..13d5972ac5 Binary files /dev/null and b/_darcs/patches/20080928120119-5ed1f-ead542348bcd3cf315be6f42934353154402eb16.gz differ diff --git a/_darcs/patches/20080928120616-5ed1f-fc0b136afff897a2d69f88dd83b6fc5df4f675b6.gz b/_darcs/patches/20080928120616-5ed1f-fc0b136afff897a2d69f88dd83b6fc5df4f675b6.gz new file mode 100644 index 0000000000..1702905505 Binary files /dev/null and b/_darcs/patches/20080928120616-5ed1f-fc0b136afff897a2d69f88dd83b6fc5df4f675b6.gz differ diff --git a/_darcs/patches/20080928132747-5ed1f-9e9b6d8b91f855758ca4b269418f6d5d6e4a2ae0.gz b/_darcs/patches/20080928132747-5ed1f-9e9b6d8b91f855758ca4b269418f6d5d6e4a2ae0.gz new file mode 100644 index 0000000000..90b0129fd4 Binary files /dev/null and b/_darcs/patches/20080928132747-5ed1f-9e9b6d8b91f855758ca4b269418f6d5d6e4a2ae0.gz differ diff --git a/_darcs/patches/20080928132846-5ed1f-cb542b90cdebcb2af95e6e225c3da157a5526741.gz b/_darcs/patches/20080928132846-5ed1f-cb542b90cdebcb2af95e6e225c3da157a5526741.gz new file mode 100644 index 0000000000..824f22e579 Binary files /dev/null and b/_darcs/patches/20080928132846-5ed1f-cb542b90cdebcb2af95e6e225c3da157a5526741.gz differ diff --git a/_darcs/patches/20080928171407-84dde-9c6944a42a6e8e7f2fc90138336a86ae81c33763.gz b/_darcs/patches/20080928171407-84dde-9c6944a42a6e8e7f2fc90138336a86ae81c33763.gz new file mode 100644 index 0000000000..4a4ea2003f Binary files /dev/null and b/_darcs/patches/20080928171407-84dde-9c6944a42a6e8e7f2fc90138336a86ae81c33763.gz differ diff --git a/_darcs/patches/20080928171538-5ed1f-a4e930adcc9aa5d25f47a04952b181a1546c22d3.gz b/_darcs/patches/20080928171538-5ed1f-a4e930adcc9aa5d25f47a04952b181a1546c22d3.gz new file mode 100644 index 0000000000..eee341b0df Binary files /dev/null and b/_darcs/patches/20080928171538-5ed1f-a4e930adcc9aa5d25f47a04952b181a1546c22d3.gz differ diff --git a/_darcs/patches/20080928171634-5ed1f-5a62d8a16dedeff8a9ed5677b2288c9890a008e7.gz b/_darcs/patches/20080928171634-5ed1f-5a62d8a16dedeff8a9ed5677b2288c9890a008e7.gz new file mode 100644 index 0000000000..54833f9414 Binary files /dev/null and b/_darcs/patches/20080928171634-5ed1f-5a62d8a16dedeff8a9ed5677b2288c9890a008e7.gz differ diff --git a/_darcs/patches/20080928172002-5ed1f-a81ae374b920e222183cf9de86e5fed732a0ed5b.gz b/_darcs/patches/20080928172002-5ed1f-a81ae374b920e222183cf9de86e5fed732a0ed5b.gz new file mode 100644 index 0000000000..c0fab0b284 Binary files /dev/null and b/_darcs/patches/20080928172002-5ed1f-a81ae374b920e222183cf9de86e5fed732a0ed5b.gz differ diff --git a/_darcs/patches/20080928173558-5ed1f-0949a60e3c7edb9ad58f818c3121896637033abe.gz b/_darcs/patches/20080928173558-5ed1f-0949a60e3c7edb9ad58f818c3121896637033abe.gz new file mode 100644 index 0000000000..0b88d63d64 Binary files /dev/null and b/_darcs/patches/20080928173558-5ed1f-0949a60e3c7edb9ad58f818c3121896637033abe.gz differ diff --git a/_darcs/patches/20080928174316-5ed1f-73bc071fed0aff359c94b4213816e8830eba6c50.gz b/_darcs/patches/20080928174316-5ed1f-73bc071fed0aff359c94b4213816e8830eba6c50.gz new file mode 100644 index 0000000000..b571bbad49 Binary files /dev/null and b/_darcs/patches/20080928174316-5ed1f-73bc071fed0aff359c94b4213816e8830eba6c50.gz differ diff --git a/_darcs/patches/20080928174814-5ed1f-3e431670e52096669e26f6a26edc6ae903763411.gz b/_darcs/patches/20080928174814-5ed1f-3e431670e52096669e26f6a26edc6ae903763411.gz new file mode 100644 index 0000000000..8bcd3ce5b7 Binary files /dev/null and b/_darcs/patches/20080928174814-5ed1f-3e431670e52096669e26f6a26edc6ae903763411.gz differ diff --git a/_darcs/patches/20080928175156-5ed1f-f33007b9dd9ee73632e48fc4bf45f29fb63ae494.gz b/_darcs/patches/20080928175156-5ed1f-f33007b9dd9ee73632e48fc4bf45f29fb63ae494.gz new file mode 100644 index 0000000000..afe5a0d62b Binary files /dev/null and b/_darcs/patches/20080928175156-5ed1f-f33007b9dd9ee73632e48fc4bf45f29fb63ae494.gz differ diff --git a/_darcs/patches/20080928175626-5ed1f-cb8775fbff6825e56378f4b900f496cbc6cb3678.gz b/_darcs/patches/20080928175626-5ed1f-cb8775fbff6825e56378f4b900f496cbc6cb3678.gz new file mode 100644 index 0000000000..353d0411ee Binary files /dev/null and b/_darcs/patches/20080928175626-5ed1f-cb8775fbff6825e56378f4b900f496cbc6cb3678.gz differ diff --git a/_darcs/patches/20080928180132-5ed1f-6e8ab82b22e71ad59b83579f17b9c3d01fcc29e2.gz b/_darcs/patches/20080928180132-5ed1f-6e8ab82b22e71ad59b83579f17b9c3d01fcc29e2.gz new file mode 100644 index 0000000000..3017a5c431 Binary files /dev/null and b/_darcs/patches/20080928180132-5ed1f-6e8ab82b22e71ad59b83579f17b9c3d01fcc29e2.gz differ diff --git a/_darcs/patches/20080928180904-5ed1f-ebf95f6f04ee4128a1ab2bb9a6a06a946926665d.gz b/_darcs/patches/20080928180904-5ed1f-ebf95f6f04ee4128a1ab2bb9a6a06a946926665d.gz new file mode 100644 index 0000000000..e1542f1220 Binary files /dev/null and b/_darcs/patches/20080928180904-5ed1f-ebf95f6f04ee4128a1ab2bb9a6a06a946926665d.gz differ diff --git a/_darcs/patches/20080928181017-5ed1f-0a55e69f2b3c12fa182954855c1f5a5f25812d1b.gz b/_darcs/patches/20080928181017-5ed1f-0a55e69f2b3c12fa182954855c1f5a5f25812d1b.gz new file mode 100644 index 0000000000..f00b051cac Binary files /dev/null and b/_darcs/patches/20080928181017-5ed1f-0a55e69f2b3c12fa182954855c1f5a5f25812d1b.gz differ diff --git a/_darcs/patches/20080928181121-5ed1f-b8fc9b65bf1180b9a360422caf584d65a5db63c3.gz b/_darcs/patches/20080928181121-5ed1f-b8fc9b65bf1180b9a360422caf584d65a5db63c3.gz new file mode 100644 index 0000000000..d76efc1538 Binary files /dev/null and b/_darcs/patches/20080928181121-5ed1f-b8fc9b65bf1180b9a360422caf584d65a5db63c3.gz differ diff --git a/_darcs/patches/20080928181255-5ed1f-fd49afc180bda9ae7875ad7b70a337e4cd5771d2.gz b/_darcs/patches/20080928181255-5ed1f-fd49afc180bda9ae7875ad7b70a337e4cd5771d2.gz new file mode 100644 index 0000000000..2ee7ae0874 Binary files /dev/null and b/_darcs/patches/20080928181255-5ed1f-fd49afc180bda9ae7875ad7b70a337e4cd5771d2.gz differ diff --git a/_darcs/patches/20080928181503-5ed1f-4a4046000646530b8462f06d0cfc0d2fe862dc48.gz b/_darcs/patches/20080928181503-5ed1f-4a4046000646530b8462f06d0cfc0d2fe862dc48.gz new file mode 100644 index 0000000000..da136a8b5f Binary files /dev/null and b/_darcs/patches/20080928181503-5ed1f-4a4046000646530b8462f06d0cfc0d2fe862dc48.gz differ diff --git a/_darcs/patches/20080928181812-5ed1f-708380f239b17b2a53b7279aa4a55af11156a5e8.gz b/_darcs/patches/20080928181812-5ed1f-708380f239b17b2a53b7279aa4a55af11156a5e8.gz new file mode 100644 index 0000000000..cff5ae3abf Binary files /dev/null and b/_darcs/patches/20080928181812-5ed1f-708380f239b17b2a53b7279aa4a55af11156a5e8.gz differ diff --git a/_darcs/patches/20080928191022-5ed1f-5adceb2deb208be787f8f32eb8c11b27b7a4fd29.gz b/_darcs/patches/20080928191022-5ed1f-5adceb2deb208be787f8f32eb8c11b27b7a4fd29.gz new file mode 100644 index 0000000000..6fb212732b Binary files /dev/null and b/_darcs/patches/20080928191022-5ed1f-5adceb2deb208be787f8f32eb8c11b27b7a4fd29.gz differ diff --git a/_darcs/patches/20080929050826-7b5ce-201624b32e174ae85b906b92353e39aa043838fa.gz b/_darcs/patches/20080929050826-7b5ce-201624b32e174ae85b906b92353e39aa043838fa.gz new file mode 100644 index 0000000000..b04a67f5bc Binary files /dev/null and b/_darcs/patches/20080929050826-7b5ce-201624b32e174ae85b906b92353e39aa043838fa.gz differ diff --git a/_darcs/patches/20080929060227-f6e2c-5996ad74cb5c89052417e36634a22b6e219bd92d.gz b/_darcs/patches/20080929060227-f6e2c-5996ad74cb5c89052417e36634a22b6e219bd92d.gz new file mode 100644 index 0000000000..790864b8cf Binary files /dev/null and b/_darcs/patches/20080929060227-f6e2c-5996ad74cb5c89052417e36634a22b6e219bd92d.gz differ diff --git a/_darcs/patches/20080929205504-5ed1f-fa0ddfe8e78b854eb99e5ab92060320a1d399a2a.gz b/_darcs/patches/20080929205504-5ed1f-fa0ddfe8e78b854eb99e5ab92060320a1d399a2a.gz new file mode 100644 index 0000000000..baec9bea5c Binary files /dev/null and b/_darcs/patches/20080929205504-5ed1f-fa0ddfe8e78b854eb99e5ab92060320a1d399a2a.gz differ diff --git a/_darcs/patches/20080929222107-5ed1f-37f079239b11b8ab13d8d33c850351f703d51371.gz b/_darcs/patches/20080929222107-5ed1f-37f079239b11b8ab13d8d33c850351f703d51371.gz new file mode 100644 index 0000000000..8d79ad62e9 Binary files /dev/null and b/_darcs/patches/20080929222107-5ed1f-37f079239b11b8ab13d8d33c850351f703d51371.gz differ diff --git a/_darcs/patches/20080929230047-5ed1f-1fee58a5bb18c71de7abeef67d89b087d84cc853.gz b/_darcs/patches/20080929230047-5ed1f-1fee58a5bb18c71de7abeef67d89b087d84cc853.gz new file mode 100644 index 0000000000..941657dd0c Binary files /dev/null and b/_darcs/patches/20080929230047-5ed1f-1fee58a5bb18c71de7abeef67d89b087d84cc853.gz differ diff --git a/_darcs/patches/20080930124452-5ed1f-31cc4ff18994880f9ab36b57cdfc6d9fb19b99d1.gz b/_darcs/patches/20080930124452-5ed1f-31cc4ff18994880f9ab36b57cdfc6d9fb19b99d1.gz new file mode 100644 index 0000000000..5bf0fb78e7 Binary files /dev/null and b/_darcs/patches/20080930124452-5ed1f-31cc4ff18994880f9ab36b57cdfc6d9fb19b99d1.gz differ diff --git a/_darcs/patches/20080930130530-5ed1f-48d4d4a503a6bb37c91d828139d652a272b9734a.gz b/_darcs/patches/20080930130530-5ed1f-48d4d4a503a6bb37c91d828139d652a272b9734a.gz new file mode 100644 index 0000000000..b29c6e50de Binary files /dev/null and b/_darcs/patches/20080930130530-5ed1f-48d4d4a503a6bb37c91d828139d652a272b9734a.gz differ diff --git a/_darcs/patches/20080930130844-5ed1f-217eb0d62fcac4a287ef3e3f213f2ac6bbc70778.gz b/_darcs/patches/20080930130844-5ed1f-217eb0d62fcac4a287ef3e3f213f2ac6bbc70778.gz new file mode 100644 index 0000000000..5666a29f02 Binary files /dev/null and b/_darcs/patches/20080930130844-5ed1f-217eb0d62fcac4a287ef3e3f213f2ac6bbc70778.gz differ diff --git a/_darcs/patches/20080930133847-5ed1f-429b4b3c6ff4f56f50e2dad19de76066589b9e05.gz b/_darcs/patches/20080930133847-5ed1f-429b4b3c6ff4f56f50e2dad19de76066589b9e05.gz new file mode 100644 index 0000000000..75c3f55df1 Binary files /dev/null and b/_darcs/patches/20080930133847-5ed1f-429b4b3c6ff4f56f50e2dad19de76066589b9e05.gz differ diff --git a/_darcs/patches/20080930175354-462f3-b49bef0e1b91ef1b94c01426c4c54900a43554d3.gz b/_darcs/patches/20080930175354-462f3-b49bef0e1b91ef1b94c01426c4c54900a43554d3.gz new file mode 100644 index 0000000000..ed2000621b Binary files /dev/null and b/_darcs/patches/20080930175354-462f3-b49bef0e1b91ef1b94c01426c4c54900a43554d3.gz differ diff --git a/_darcs/patches/20080930194435-462f3-a0a7fec3f0d05dc3b1fe8a9219155f4d59092e43.gz b/_darcs/patches/20080930194435-462f3-a0a7fec3f0d05dc3b1fe8a9219155f4d59092e43.gz new file mode 100644 index 0000000000..619955860f Binary files /dev/null and b/_darcs/patches/20080930194435-462f3-a0a7fec3f0d05dc3b1fe8a9219155f4d59092e43.gz differ diff --git a/_darcs/patches/20080930210542-5ed1f-7432cf920da782ea220ef6b9e156cf1ea650a5b8.gz b/_darcs/patches/20080930210542-5ed1f-7432cf920da782ea220ef6b9e156cf1ea650a5b8.gz new file mode 100644 index 0000000000..b86f44e935 Binary files /dev/null and b/_darcs/patches/20080930210542-5ed1f-7432cf920da782ea220ef6b9e156cf1ea650a5b8.gz differ diff --git a/_darcs/patches/20080930212526-462f3-abe9f1f2fc395c751b2861e686d638ea0a8ca001.gz b/_darcs/patches/20080930212526-462f3-abe9f1f2fc395c751b2861e686d638ea0a8ca001.gz new file mode 100644 index 0000000000..2275a73aa6 Binary files /dev/null and b/_darcs/patches/20080930212526-462f3-abe9f1f2fc395c751b2861e686d638ea0a8ca001.gz differ diff --git a/_darcs/patches/20081001001233-e558a-3fcc269985050021ec9b44c052206c731cc4689d.gz b/_darcs/patches/20081001001233-e558a-3fcc269985050021ec9b44c052206c731cc4689d.gz new file mode 100644 index 0000000000..b03b0a4760 Binary files /dev/null and b/_darcs/patches/20081001001233-e558a-3fcc269985050021ec9b44c052206c731cc4689d.gz differ diff --git a/_darcs/patches/20081001010741-352e0-4cbf4afc0f12aa850c1cc7145324477157f24d98.gz b/_darcs/patches/20081001010741-352e0-4cbf4afc0f12aa850c1cc7145324477157f24d98.gz new file mode 100644 index 0000000000..b743a104ae Binary files /dev/null and b/_darcs/patches/20081001010741-352e0-4cbf4afc0f12aa850c1cc7145324477157f24d98.gz differ diff --git a/_darcs/patches/20081001020959-462f3-83b0241ba7dc99c4e3a52148a46deb8182e005b0.gz b/_darcs/patches/20081001020959-462f3-83b0241ba7dc99c4e3a52148a46deb8182e005b0.gz new file mode 100644 index 0000000000..564a5eb45f Binary files /dev/null and b/_darcs/patches/20081001020959-462f3-83b0241ba7dc99c4e3a52148a46deb8182e005b0.gz differ diff --git a/_darcs/patches/20081001025421-462f3-3bf666327de3a3c5ea506b2c387741dc3d0e82bf.gz b/_darcs/patches/20081001025421-462f3-3bf666327de3a3c5ea506b2c387741dc3d0e82bf.gz new file mode 100644 index 0000000000..50e75f7ed5 Binary files /dev/null and b/_darcs/patches/20081001025421-462f3-3bf666327de3a3c5ea506b2c387741dc3d0e82bf.gz differ diff --git a/_darcs/patches/20081002144628-5ed1f-0cf7909fd15d5361d391a9bcde723585d83e5ed3.gz b/_darcs/patches/20081002144628-5ed1f-0cf7909fd15d5361d391a9bcde723585d83e5ed3.gz new file mode 100644 index 0000000000..9018e1887f Binary files /dev/null and b/_darcs/patches/20081002144628-5ed1f-0cf7909fd15d5361d391a9bcde723585d83e5ed3.gz differ diff --git a/_darcs/patches/20081002144715-5ed1f-97c8362c4fb4f6a761250b68e2f3311bcc5cba4f.gz b/_darcs/patches/20081002144715-5ed1f-97c8362c4fb4f6a761250b68e2f3311bcc5cba4f.gz new file mode 100644 index 0000000000..64ab84b14a Binary files /dev/null and b/_darcs/patches/20081002144715-5ed1f-97c8362c4fb4f6a761250b68e2f3311bcc5cba4f.gz differ diff --git a/_darcs/patches/20081002144749-5ed1f-a5503625b811f28a853712d4ddd4a76813f24bc1.gz b/_darcs/patches/20081002144749-5ed1f-a5503625b811f28a853712d4ddd4a76813f24bc1.gz new file mode 100644 index 0000000000..d8be20d079 Binary files /dev/null and b/_darcs/patches/20081002144749-5ed1f-a5503625b811f28a853712d4ddd4a76813f24bc1.gz differ diff --git a/_darcs/patches/20081002162513-5ed1f-fff718be660fa4a8abf58df402a3db30d72d11db.gz b/_darcs/patches/20081002162513-5ed1f-fff718be660fa4a8abf58df402a3db30d72d11db.gz new file mode 100644 index 0000000000..ded535fc2e Binary files /dev/null and b/_darcs/patches/20081002162513-5ed1f-fff718be660fa4a8abf58df402a3db30d72d11db.gz differ diff --git a/_darcs/patches/20081002162604-5ed1f-45e9f43e3dbe778462377ebe22f994bdafb4bcdd.gz b/_darcs/patches/20081002162604-5ed1f-45e9f43e3dbe778462377ebe22f994bdafb4bcdd.gz new file mode 100644 index 0000000000..a28a5395bd Binary files /dev/null and b/_darcs/patches/20081002162604-5ed1f-45e9f43e3dbe778462377ebe22f994bdafb4bcdd.gz differ diff --git a/_darcs/patches/20081002162739-5ed1f-7d83c69d986cc704ef1bb9703a105ac04ad38d06.gz b/_darcs/patches/20081002162739-5ed1f-7d83c69d986cc704ef1bb9703a105ac04ad38d06.gz new file mode 100644 index 0000000000..d8f5d3a513 Binary files /dev/null and b/_darcs/patches/20081002162739-5ed1f-7d83c69d986cc704ef1bb9703a105ac04ad38d06.gz differ diff --git a/_darcs/patches/20081002181338-f6e2c-cf9cf3791680634fa457cb83dc2e4f933073a9b1.gz b/_darcs/patches/20081002181338-f6e2c-cf9cf3791680634fa457cb83dc2e4f933073a9b1.gz new file mode 100644 index 0000000000..83353774e8 Binary files /dev/null and b/_darcs/patches/20081002181338-f6e2c-cf9cf3791680634fa457cb83dc2e4f933073a9b1.gz differ diff --git a/_darcs/patches/20081003011145-29929-9fce5057066d0d223a0d01c1708df072d91b0e63.gz b/_darcs/patches/20081003011145-29929-9fce5057066d0d223a0d01c1708df072d91b0e63.gz new file mode 100644 index 0000000000..0220dbf591 Binary files /dev/null and b/_darcs/patches/20081003011145-29929-9fce5057066d0d223a0d01c1708df072d91b0e63.gz differ diff --git a/_darcs/patches/20081003192826-5ed1f-3ec4ebe13d3e9297f99c90f4da3d469805ddc722.gz b/_darcs/patches/20081003192826-5ed1f-3ec4ebe13d3e9297f99c90f4da3d469805ddc722.gz new file mode 100644 index 0000000000..a357fad9cc Binary files /dev/null and b/_darcs/patches/20081003192826-5ed1f-3ec4ebe13d3e9297f99c90f4da3d469805ddc722.gz differ diff --git a/_darcs/patches/20081004021158-5ed1f-c8f5e68dd411a5fe7a01ae35398914469c377794.gz b/_darcs/patches/20081004021158-5ed1f-c8f5e68dd411a5fe7a01ae35398914469c377794.gz new file mode 100644 index 0000000000..81f3b1f237 Binary files /dev/null and b/_darcs/patches/20081004021158-5ed1f-c8f5e68dd411a5fe7a01ae35398914469c377794.gz differ diff --git a/_darcs/patches/20081004021442-5ed1f-2f60065150426995707e7cf48ca08d59ec175905.gz b/_darcs/patches/20081004021442-5ed1f-2f60065150426995707e7cf48ca08d59ec175905.gz new file mode 100644 index 0000000000..337116af94 Binary files /dev/null and b/_darcs/patches/20081004021442-5ed1f-2f60065150426995707e7cf48ca08d59ec175905.gz differ diff --git a/_darcs/patches/20081004142205-5ed1f-7da60ab5a596906acb2fcac2b0a732579d61352a.gz b/_darcs/patches/20081004142205-5ed1f-7da60ab5a596906acb2fcac2b0a732579d61352a.gz new file mode 100644 index 0000000000..b36688ea2a Binary files /dev/null and b/_darcs/patches/20081004142205-5ed1f-7da60ab5a596906acb2fcac2b0a732579d61352a.gz differ diff --git a/_darcs/patches/20081004143747-f6e2c-041d44b5375e6c35badbc9748627620fa1092a9a.gz b/_darcs/patches/20081004143747-f6e2c-041d44b5375e6c35badbc9748627620fa1092a9a.gz new file mode 100644 index 0000000000..71d1f462db Binary files /dev/null and b/_darcs/patches/20081004143747-f6e2c-041d44b5375e6c35badbc9748627620fa1092a9a.gz differ diff --git a/_darcs/patches/20081004144441-f6e2c-9a7855e35331f1330d582927c4314a6e5553ff41.gz b/_darcs/patches/20081004144441-f6e2c-9a7855e35331f1330d582927c4314a6e5553ff41.gz new file mode 100644 index 0000000000..b8b87a3a2a Binary files /dev/null and b/_darcs/patches/20081004144441-f6e2c-9a7855e35331f1330d582927c4314a6e5553ff41.gz differ diff --git a/_darcs/patches/20081004144545-f6e2c-ec48b90428e224a664080fde72d869b9f941bb90.gz b/_darcs/patches/20081004144545-f6e2c-ec48b90428e224a664080fde72d869b9f941bb90.gz new file mode 100644 index 0000000000..ddab6e57aa Binary files /dev/null and b/_darcs/patches/20081004144545-f6e2c-ec48b90428e224a664080fde72d869b9f941bb90.gz differ diff --git a/_darcs/patches/20081004154454-5ed1f-6b5b66945d415690f4cac5e66c1edad71ec031a5.gz b/_darcs/patches/20081004154454-5ed1f-6b5b66945d415690f4cac5e66c1edad71ec031a5.gz new file mode 100644 index 0000000000..9ad4f5b696 Binary files /dev/null and b/_darcs/patches/20081004154454-5ed1f-6b5b66945d415690f4cac5e66c1edad71ec031a5.gz differ diff --git a/_darcs/patches/20081004154846-5ed1f-02f7c93248af00fd22e7bb3520179ef1f31da121.gz b/_darcs/patches/20081004154846-5ed1f-02f7c93248af00fd22e7bb3520179ef1f31da121.gz new file mode 100644 index 0000000000..fedcfab85b Binary files /dev/null and b/_darcs/patches/20081004154846-5ed1f-02f7c93248af00fd22e7bb3520179ef1f31da121.gz differ diff --git a/_darcs/patches/20081004163213-5ed1f-684ecb464e843b1bbe456c348e56b40a39a83ecd.gz b/_darcs/patches/20081004163213-5ed1f-684ecb464e843b1bbe456c348e56b40a39a83ecd.gz new file mode 100644 index 0000000000..b83a7fc638 Binary files /dev/null and b/_darcs/patches/20081004163213-5ed1f-684ecb464e843b1bbe456c348e56b40a39a83ecd.gz differ diff --git a/_darcs/patches/20081004170136-5ed1f-4eca2ee2c7ebb7f2d3c6b49ecd634a8ceee28054.gz b/_darcs/patches/20081004170136-5ed1f-4eca2ee2c7ebb7f2d3c6b49ecd634a8ceee28054.gz new file mode 100644 index 0000000000..640b366749 Binary files /dev/null and b/_darcs/patches/20081004170136-5ed1f-4eca2ee2c7ebb7f2d3c6b49ecd634a8ceee28054.gz differ diff --git a/_darcs/patches/20081004170342-5ed1f-f4b4656d765c67cf95ca3a9193ff64e3220c1526.gz b/_darcs/patches/20081004170342-5ed1f-f4b4656d765c67cf95ca3a9193ff64e3220c1526.gz new file mode 100644 index 0000000000..7066607ad7 Binary files /dev/null and b/_darcs/patches/20081004170342-5ed1f-f4b4656d765c67cf95ca3a9193ff64e3220c1526.gz differ diff --git a/_darcs/patches/20081004170550-5ed1f-69aadc2b9c26d71a1ba039eb92647f4e53c83de9.gz b/_darcs/patches/20081004170550-5ed1f-69aadc2b9c26d71a1ba039eb92647f4e53c83de9.gz new file mode 100644 index 0000000000..dbcfb15619 Binary files /dev/null and b/_darcs/patches/20081004170550-5ed1f-69aadc2b9c26d71a1ba039eb92647f4e53c83de9.gz differ diff --git a/_darcs/patches/20081004173427-5ed1f-2a818562f5aa7143b68a0eab3e9f26cd02926c0b.gz b/_darcs/patches/20081004173427-5ed1f-2a818562f5aa7143b68a0eab3e9f26cd02926c0b.gz new file mode 100644 index 0000000000..feea24130d Binary files /dev/null and b/_darcs/patches/20081004173427-5ed1f-2a818562f5aa7143b68a0eab3e9f26cd02926c0b.gz differ diff --git a/_darcs/patches/20081004173609-5ed1f-e5c7fe78c409e9e073634c0bb5ede0f6d46e2f4f.gz b/_darcs/patches/20081004173609-5ed1f-e5c7fe78c409e9e073634c0bb5ede0f6d46e2f4f.gz new file mode 100644 index 0000000000..33fa9dc5f8 Binary files /dev/null and b/_darcs/patches/20081004173609-5ed1f-e5c7fe78c409e9e073634c0bb5ede0f6d46e2f4f.gz differ diff --git a/_darcs/patches/20081004173734-5ed1f-fbb4c09bc9acd26971d0a7ff58769cb77299b371.gz b/_darcs/patches/20081004173734-5ed1f-fbb4c09bc9acd26971d0a7ff58769cb77299b371.gz new file mode 100644 index 0000000000..247a93c6b2 Binary files /dev/null and b/_darcs/patches/20081004173734-5ed1f-fbb4c09bc9acd26971d0a7ff58769cb77299b371.gz differ diff --git a/_darcs/patches/20081004173957-5ed1f-dd460b4208c1c7c72b92db6cb85f03accfc1d610.gz b/_darcs/patches/20081004173957-5ed1f-dd460b4208c1c7c72b92db6cb85f03accfc1d610.gz new file mode 100644 index 0000000000..bf131ad80d Binary files /dev/null and b/_darcs/patches/20081004173957-5ed1f-dd460b4208c1c7c72b92db6cb85f03accfc1d610.gz differ diff --git a/_darcs/patches/20081004174519-5ed1f-1b9f8d1f12c895eacead8703cbfb088a135e810c.gz b/_darcs/patches/20081004174519-5ed1f-1b9f8d1f12c895eacead8703cbfb088a135e810c.gz new file mode 100644 index 0000000000..3f456e6ba1 Binary files /dev/null and b/_darcs/patches/20081004174519-5ed1f-1b9f8d1f12c895eacead8703cbfb088a135e810c.gz differ diff --git a/_darcs/patches/20081004174552-5ed1f-058eb6b0b12d96afa9c2cd635467f0fd6ff4e704.gz b/_darcs/patches/20081004174552-5ed1f-058eb6b0b12d96afa9c2cd635467f0fd6ff4e704.gz new file mode 100644 index 0000000000..a289c6e1c5 Binary files /dev/null and b/_darcs/patches/20081004174552-5ed1f-058eb6b0b12d96afa9c2cd635467f0fd6ff4e704.gz differ diff --git a/_darcs/patches/20081004182028-5ed1f-18e89922d7f59bcb11c784d36f4ed0a104a1c903.gz b/_darcs/patches/20081004182028-5ed1f-18e89922d7f59bcb11c784d36f4ed0a104a1c903.gz new file mode 100644 index 0000000000..2e1d820fd0 Binary files /dev/null and b/_darcs/patches/20081004182028-5ed1f-18e89922d7f59bcb11c784d36f4ed0a104a1c903.gz differ diff --git a/_darcs/patches/20081004194218-5ed1f-efd9e82c9f78e19185d8ef6b626f46c5ae6613db.gz b/_darcs/patches/20081004194218-5ed1f-efd9e82c9f78e19185d8ef6b626f46c5ae6613db.gz new file mode 100644 index 0000000000..ad9f769b65 Binary files /dev/null and b/_darcs/patches/20081004194218-5ed1f-efd9e82c9f78e19185d8ef6b626f46c5ae6613db.gz differ diff --git a/_darcs/patches/20081004194611-5ed1f-7731a6105f0501ef8cbaf866c52eb9a051e51d9e.gz b/_darcs/patches/20081004194611-5ed1f-7731a6105f0501ef8cbaf866c52eb9a051e51d9e.gz new file mode 100644 index 0000000000..717dc358a1 Binary files /dev/null and b/_darcs/patches/20081004194611-5ed1f-7731a6105f0501ef8cbaf866c52eb9a051e51d9e.gz differ diff --git a/_darcs/patches/20081004232554-5ed1f-06b3464638a6dbd6d4090afafa600578ad151b39.gz b/_darcs/patches/20081004232554-5ed1f-06b3464638a6dbd6d4090afafa600578ad151b39.gz new file mode 100644 index 0000000000..2deb2e9643 Binary files /dev/null and b/_darcs/patches/20081004232554-5ed1f-06b3464638a6dbd6d4090afafa600578ad151b39.gz differ diff --git a/_darcs/patches/20081005000851-34904-9d4db52b2b9aaf7567f3c0762a68c3e192740bdf.gz b/_darcs/patches/20081005000851-34904-9d4db52b2b9aaf7567f3c0762a68c3e192740bdf.gz new file mode 100644 index 0000000000..9a65611f1c Binary files /dev/null and b/_darcs/patches/20081005000851-34904-9d4db52b2b9aaf7567f3c0762a68c3e192740bdf.gz differ diff --git a/_darcs/patches/20081005030915-462f3-0c0541f062020ee958f1df0361e27f44d6c35e95.gz b/_darcs/patches/20081005030915-462f3-0c0541f062020ee958f1df0361e27f44d6c35e95.gz new file mode 100644 index 0000000000..c9143202cd Binary files /dev/null and b/_darcs/patches/20081005030915-462f3-0c0541f062020ee958f1df0361e27f44d6c35e95.gz differ diff --git a/_darcs/patches/20081005181350-7b5ce-1e722af0bd3677b27dd6d100456131a42072dd91.gz b/_darcs/patches/20081005181350-7b5ce-1e722af0bd3677b27dd6d100456131a42072dd91.gz new file mode 100644 index 0000000000..e3a873f1c8 Binary files /dev/null and b/_darcs/patches/20081005181350-7b5ce-1e722af0bd3677b27dd6d100456131a42072dd91.gz differ diff --git a/_darcs/patches/20081005181614-7b5ce-4ab236108fe2570a199120317120d921715fbd19.gz b/_darcs/patches/20081005181614-7b5ce-4ab236108fe2570a199120317120d921715fbd19.gz new file mode 100644 index 0000000000..5e529c7578 Binary files /dev/null and b/_darcs/patches/20081005181614-7b5ce-4ab236108fe2570a199120317120d921715fbd19.gz differ diff --git a/_darcs/patches/20081005183850-462f3-1fcbf873c14f1048ba7c3ac23f6cd394066170c7.gz b/_darcs/patches/20081005183850-462f3-1fcbf873c14f1048ba7c3ac23f6cd394066170c7.gz new file mode 100644 index 0000000000..8c01085879 Binary files /dev/null and b/_darcs/patches/20081005183850-462f3-1fcbf873c14f1048ba7c3ac23f6cd394066170c7.gz differ diff --git a/_darcs/patches/20081005191505-5ed1f-f0783711adae8381c5ca987f3f7299393ed435e1.gz b/_darcs/patches/20081005191505-5ed1f-f0783711adae8381c5ca987f3f7299393ed435e1.gz new file mode 100644 index 0000000000..ac83855bc1 Binary files /dev/null and b/_darcs/patches/20081005191505-5ed1f-f0783711adae8381c5ca987f3f7299393ed435e1.gz differ diff --git a/_darcs/patches/20081006040646-5ed1f-309d137a65e16b6baa022bb2ee7115836bf502a2.gz b/_darcs/patches/20081006040646-5ed1f-309d137a65e16b6baa022bb2ee7115836bf502a2.gz new file mode 100644 index 0000000000..c593d29ded Binary files /dev/null and b/_darcs/patches/20081006040646-5ed1f-309d137a65e16b6baa022bb2ee7115836bf502a2.gz differ diff --git a/_darcs/patches/20081006040713-5ed1f-da7f2235b5301c1889922f5c133c01920a316c57.gz b/_darcs/patches/20081006040713-5ed1f-da7f2235b5301c1889922f5c133c01920a316c57.gz new file mode 100644 index 0000000000..7792cc768c Binary files /dev/null and b/_darcs/patches/20081006040713-5ed1f-da7f2235b5301c1889922f5c133c01920a316c57.gz differ diff --git a/_darcs/patches/20081006040733-5ed1f-01bc3eb49157daccde21c5bbe3505df7b584dfde.gz b/_darcs/patches/20081006040733-5ed1f-01bc3eb49157daccde21c5bbe3505df7b584dfde.gz new file mode 100644 index 0000000000..f528c38cbf Binary files /dev/null and b/_darcs/patches/20081006040733-5ed1f-01bc3eb49157daccde21c5bbe3505df7b584dfde.gz differ diff --git a/_darcs/patches/20081006041232-5ed1f-830c7ebc8141fae002fead026407f1499126e021.gz b/_darcs/patches/20081006041232-5ed1f-830c7ebc8141fae002fead026407f1499126e021.gz new file mode 100644 index 0000000000..8d4359e12b Binary files /dev/null and b/_darcs/patches/20081006041232-5ed1f-830c7ebc8141fae002fead026407f1499126e021.gz differ diff --git a/_darcs/patches/20081006041249-5ed1f-33af2f1759aee066875182272fe0e175a1b8a516.gz b/_darcs/patches/20081006041249-5ed1f-33af2f1759aee066875182272fe0e175a1b8a516.gz new file mode 100644 index 0000000000..05dcbac4f6 Binary files /dev/null and b/_darcs/patches/20081006041249-5ed1f-33af2f1759aee066875182272fe0e175a1b8a516.gz differ diff --git a/_darcs/patches/20081006054425-5ed1f-a241327bad9f5918606543f329a78a6832564f18.gz b/_darcs/patches/20081006054425-5ed1f-a241327bad9f5918606543f329a78a6832564f18.gz new file mode 100644 index 0000000000..698848c43a Binary files /dev/null and b/_darcs/patches/20081006054425-5ed1f-a241327bad9f5918606543f329a78a6832564f18.gz differ diff --git a/_darcs/patches/20081006153715-462f3-395d230824398e7aa50aeba200b9b716c64f00c9.gz b/_darcs/patches/20081006153715-462f3-395d230824398e7aa50aeba200b9b716c64f00c9.gz new file mode 100644 index 0000000000..48867f83bc Binary files /dev/null and b/_darcs/patches/20081006153715-462f3-395d230824398e7aa50aeba200b9b716c64f00c9.gz differ diff --git a/_darcs/patches/20081007004432-462f3-6385dcaf69cbcf18ce36a45dc17f5e8b9a19ba31.gz b/_darcs/patches/20081007004432-462f3-6385dcaf69cbcf18ce36a45dc17f5e8b9a19ba31.gz new file mode 100644 index 0000000000..def9eab2c3 Binary files /dev/null and b/_darcs/patches/20081007004432-462f3-6385dcaf69cbcf18ce36a45dc17f5e8b9a19ba31.gz differ diff --git a/_darcs/patches/20081007083521-f6e2c-00bd73ab4df406188713e7a652b0bd5a7012bf6d.gz b/_darcs/patches/20081007083521-f6e2c-00bd73ab4df406188713e7a652b0bd5a7012bf6d.gz new file mode 100644 index 0000000000..d395d618ff Binary files /dev/null and b/_darcs/patches/20081007083521-f6e2c-00bd73ab4df406188713e7a652b0bd5a7012bf6d.gz differ diff --git a/_darcs/patches/20081007145232-f6e2c-15812a2576e1ec270e26dcd61bbec5d07b2b7f05.gz b/_darcs/patches/20081007145232-f6e2c-15812a2576e1ec270e26dcd61bbec5d07b2b7f05.gz new file mode 100644 index 0000000000..96a669a03e Binary files /dev/null and b/_darcs/patches/20081007145232-f6e2c-15812a2576e1ec270e26dcd61bbec5d07b2b7f05.gz differ diff --git a/_darcs/patches/20081007155038-f6e2c-edf0c68026daa174123533af92edc5318a611ba0.gz b/_darcs/patches/20081007155038-f6e2c-edf0c68026daa174123533af92edc5318a611ba0.gz new file mode 100644 index 0000000000..96bc393d0b Binary files /dev/null and b/_darcs/patches/20081007155038-f6e2c-edf0c68026daa174123533af92edc5318a611ba0.gz differ diff --git a/_darcs/patches/20081008164624-5ed1f-aa8d7648df9cd1d554879286dcdd9390bea5a198.gz b/_darcs/patches/20081008164624-5ed1f-aa8d7648df9cd1d554879286dcdd9390bea5a198.gz new file mode 100644 index 0000000000..51d6ba4dc6 Binary files /dev/null and b/_darcs/patches/20081008164624-5ed1f-aa8d7648df9cd1d554879286dcdd9390bea5a198.gz differ diff --git a/_darcs/patches/20081012155650-5ed1f-d1bc1f9636c75290c460defe45024e903d0f6930.gz b/_darcs/patches/20081012155650-5ed1f-d1bc1f9636c75290c460defe45024e903d0f6930.gz new file mode 100644 index 0000000000..cd48af69a0 Binary files /dev/null and b/_darcs/patches/20081012155650-5ed1f-d1bc1f9636c75290c460defe45024e903d0f6930.gz differ diff --git a/_darcs/patches/20081012161211-5ed1f-a813eef14d6c5ec9585e27cde27b3c774e35ceb5.gz b/_darcs/patches/20081012161211-5ed1f-a813eef14d6c5ec9585e27cde27b3c774e35ceb5.gz new file mode 100644 index 0000000000..94493f1461 Binary files /dev/null and b/_darcs/patches/20081012161211-5ed1f-a813eef14d6c5ec9585e27cde27b3c774e35ceb5.gz differ diff --git a/_darcs/patches/20081012162719-84dde-37c59c8ce953bb4e0b24a60e75785d3236750a81.gz b/_darcs/patches/20081012162719-84dde-37c59c8ce953bb4e0b24a60e75785d3236750a81.gz new file mode 100644 index 0000000000..092844e80c Binary files /dev/null and b/_darcs/patches/20081012162719-84dde-37c59c8ce953bb4e0b24a60e75785d3236750a81.gz differ diff --git a/_darcs/patches/20081012162810-5ed1f-d2bb39f95e6bf429c3b0a5fea72e8984de78b1bb.gz b/_darcs/patches/20081012162810-5ed1f-d2bb39f95e6bf429c3b0a5fea72e8984de78b1bb.gz new file mode 100644 index 0000000000..81dc15616d Binary files /dev/null and b/_darcs/patches/20081012162810-5ed1f-d2bb39f95e6bf429c3b0a5fea72e8984de78b1bb.gz differ diff --git a/_darcs/patches/20081013200837-f6e2c-201363fdb98e3dff815eb3ac76125dc6b060db68.gz b/_darcs/patches/20081013200837-f6e2c-201363fdb98e3dff815eb3ac76125dc6b060db68.gz new file mode 100644 index 0000000000..ca5a97d77c Binary files /dev/null and b/_darcs/patches/20081013200837-f6e2c-201363fdb98e3dff815eb3ac76125dc6b060db68.gz differ diff --git a/_darcs/patches/20081015163112-462f3-ca22e3fcf4a5d3ad4613dd08c4bf7ce59e296385.gz b/_darcs/patches/20081015163112-462f3-ca22e3fcf4a5d3ad4613dd08c4bf7ce59e296385.gz new file mode 100644 index 0000000000..9048387a59 Binary files /dev/null and b/_darcs/patches/20081015163112-462f3-ca22e3fcf4a5d3ad4613dd08c4bf7ce59e296385.gz differ diff --git a/_darcs/patches/20081017023638-462f3-27b5d2709e423c616723d4bcfbc9d7d30a4ad161.gz b/_darcs/patches/20081017023638-462f3-27b5d2709e423c616723d4bcfbc9d7d30a4ad161.gz new file mode 100644 index 0000000000..ac70ca0962 Binary files /dev/null and b/_darcs/patches/20081017023638-462f3-27b5d2709e423c616723d4bcfbc9d7d30a4ad161.gz differ diff --git a/_darcs/patches/20081020170245-5ed1f-b84f63d9d9b589bd18f97924db547e348beb6647.gz b/_darcs/patches/20081020170245-5ed1f-b84f63d9d9b589bd18f97924db547e348beb6647.gz new file mode 100644 index 0000000000..272a77d0b6 Binary files /dev/null and b/_darcs/patches/20081020170245-5ed1f-b84f63d9d9b589bd18f97924db547e348beb6647.gz differ diff --git a/_darcs/patches/20081020170828-5ed1f-9172e6ee88e1e70bfbd6695b44bfb82eef690c4b.gz b/_darcs/patches/20081020170828-5ed1f-9172e6ee88e1e70bfbd6695b44bfb82eef690c4b.gz new file mode 100644 index 0000000000..aaf2a3431b Binary files /dev/null and b/_darcs/patches/20081020170828-5ed1f-9172e6ee88e1e70bfbd6695b44bfb82eef690c4b.gz differ diff --git a/_darcs/patches/20081020171033-5ed1f-00bdf131a25c86ae1d400a238eee070cb19ebec9.gz b/_darcs/patches/20081020171033-5ed1f-00bdf131a25c86ae1d400a238eee070cb19ebec9.gz new file mode 100644 index 0000000000..8c1fe3fae0 Binary files /dev/null and b/_darcs/patches/20081020171033-5ed1f-00bdf131a25c86ae1d400a238eee070cb19ebec9.gz differ diff --git a/_darcs/patches/20081020172117-5ed1f-29177ae6f4439707b20732cccb83ef12f8478f85.gz b/_darcs/patches/20081020172117-5ed1f-29177ae6f4439707b20732cccb83ef12f8478f85.gz new file mode 100644 index 0000000000..e4276fb511 Binary files /dev/null and b/_darcs/patches/20081020172117-5ed1f-29177ae6f4439707b20732cccb83ef12f8478f85.gz differ diff --git a/_darcs/patches/20081020172305-5ed1f-8d2d9ba64faa0e12ac14fc7c92f0dcdd283f48fc.gz b/_darcs/patches/20081020172305-5ed1f-8d2d9ba64faa0e12ac14fc7c92f0dcdd283f48fc.gz new file mode 100644 index 0000000000..355a05753a Binary files /dev/null and b/_darcs/patches/20081020172305-5ed1f-8d2d9ba64faa0e12ac14fc7c92f0dcdd283f48fc.gz differ diff --git a/_darcs/patches/20081020172549-5ed1f-9ae91cf6d0af250275921b48831999269fd8d3dd.gz b/_darcs/patches/20081020172549-5ed1f-9ae91cf6d0af250275921b48831999269fd8d3dd.gz new file mode 100644 index 0000000000..6e5c524513 Binary files /dev/null and b/_darcs/patches/20081020172549-5ed1f-9ae91cf6d0af250275921b48831999269fd8d3dd.gz differ diff --git a/_darcs/patches/20081020173108-5ed1f-06b346f0f341bf8401d29dcf725db69c5d26cc14.gz b/_darcs/patches/20081020173108-5ed1f-06b346f0f341bf8401d29dcf725db69c5d26cc14.gz new file mode 100644 index 0000000000..36e2fb38e1 Binary files /dev/null and b/_darcs/patches/20081020173108-5ed1f-06b346f0f341bf8401d29dcf725db69c5d26cc14.gz differ diff --git a/_darcs/patches/20081020174231-5ed1f-03ae9fa6cfde7d224fbf7fa81f8d9a577b89a7b5.gz b/_darcs/patches/20081020174231-5ed1f-03ae9fa6cfde7d224fbf7fa81f8d9a577b89a7b5.gz new file mode 100644 index 0000000000..0846806d70 Binary files /dev/null and b/_darcs/patches/20081020174231-5ed1f-03ae9fa6cfde7d224fbf7fa81f8d9a577b89a7b5.gz differ diff --git a/_darcs/patches/20081020174956-5ed1f-f0a632482ab9d2f2d15baa3a524bc312d7be5755.gz b/_darcs/patches/20081020174956-5ed1f-f0a632482ab9d2f2d15baa3a524bc312d7be5755.gz new file mode 100644 index 0000000000..37755c6cf8 Binary files /dev/null and b/_darcs/patches/20081020174956-5ed1f-f0a632482ab9d2f2d15baa3a524bc312d7be5755.gz differ diff --git a/_darcs/patches/20081021182822-5ed1f-9a8ee3960f82d115d43e35baac646f69bc702533.gz b/_darcs/patches/20081021182822-5ed1f-9a8ee3960f82d115d43e35baac646f69bc702533.gz new file mode 100644 index 0000000000..71b200e6db Binary files /dev/null and b/_darcs/patches/20081021182822-5ed1f-9a8ee3960f82d115d43e35baac646f69bc702533.gz differ diff --git a/_darcs/patches/20081021183035-5ed1f-c40445017094a3f6c0e89fa8744ede28fd5ab20a.gz b/_darcs/patches/20081021183035-5ed1f-c40445017094a3f6c0e89fa8744ede28fd5ab20a.gz new file mode 100644 index 0000000000..e8eca3f4bf Binary files /dev/null and b/_darcs/patches/20081021183035-5ed1f-c40445017094a3f6c0e89fa8744ede28fd5ab20a.gz differ diff --git a/_darcs/patches/20081021192914-5ed1f-58bb42251a6df7979bd91c8f230d78e963d67ccc.gz b/_darcs/patches/20081021192914-5ed1f-58bb42251a6df7979bd91c8f230d78e963d67ccc.gz new file mode 100644 index 0000000000..eb6fde7b0d Binary files /dev/null and b/_darcs/patches/20081021192914-5ed1f-58bb42251a6df7979bd91c8f230d78e963d67ccc.gz differ diff --git a/_darcs/patches/20081021193501-5ed1f-19b398272e49fd3e5b9bebdcdef95572396e4ad7.gz b/_darcs/patches/20081021193501-5ed1f-19b398272e49fd3e5b9bebdcdef95572396e4ad7.gz new file mode 100644 index 0000000000..5e30bd55c2 Binary files /dev/null and b/_darcs/patches/20081021193501-5ed1f-19b398272e49fd3e5b9bebdcdef95572396e4ad7.gz differ diff --git a/_darcs/patches/20081021193612-5ed1f-67caf8945c3745d432f95ced1b92c7c03770b664.gz b/_darcs/patches/20081021193612-5ed1f-67caf8945c3745d432f95ced1b92c7c03770b664.gz new file mode 100644 index 0000000000..083741378b Binary files /dev/null and b/_darcs/patches/20081021193612-5ed1f-67caf8945c3745d432f95ced1b92c7c03770b664.gz differ diff --git a/_darcs/patches/20081021194440-5ed1f-d1a2590f89e9a7318f4920160d4e7d44a8ff0c9f.gz b/_darcs/patches/20081021194440-5ed1f-d1a2590f89e9a7318f4920160d4e7d44a8ff0c9f.gz new file mode 100644 index 0000000000..ca3c12bd10 Binary files /dev/null and b/_darcs/patches/20081021194440-5ed1f-d1a2590f89e9a7318f4920160d4e7d44a8ff0c9f.gz differ diff --git a/_darcs/patches/20081021194833-5ed1f-f5b4c246fd461f0e0a82ce8ee52985183b4577f1.gz b/_darcs/patches/20081021194833-5ed1f-f5b4c246fd461f0e0a82ce8ee52985183b4577f1.gz new file mode 100644 index 0000000000..1bdb0495f5 Binary files /dev/null and b/_darcs/patches/20081021194833-5ed1f-f5b4c246fd461f0e0a82ce8ee52985183b4577f1.gz differ diff --git a/_darcs/patches/20081021201853-5ed1f-1d61285996c5fca73b0d302e7fb4a45000a3d1e0.gz b/_darcs/patches/20081021201853-5ed1f-1d61285996c5fca73b0d302e7fb4a45000a3d1e0.gz new file mode 100644 index 0000000000..e83aa5f417 Binary files /dev/null and b/_darcs/patches/20081021201853-5ed1f-1d61285996c5fca73b0d302e7fb4a45000a3d1e0.gz differ diff --git a/_darcs/patches/20081021202455-5ed1f-6263bfe811298349028c5cfe4e1c86ebaab161b4.gz b/_darcs/patches/20081021202455-5ed1f-6263bfe811298349028c5cfe4e1c86ebaab161b4.gz new file mode 100644 index 0000000000..588dfaf39f Binary files /dev/null and b/_darcs/patches/20081021202455-5ed1f-6263bfe811298349028c5cfe4e1c86ebaab161b4.gz differ diff --git a/_darcs/patches/20081022192750-5ed1f-3265f9f4954cff431a0c276c16a98b9c22d8d40b.gz b/_darcs/patches/20081022192750-5ed1f-3265f9f4954cff431a0c276c16a98b9c22d8d40b.gz new file mode 100644 index 0000000000..fcdcf10a26 Binary files /dev/null and b/_darcs/patches/20081022192750-5ed1f-3265f9f4954cff431a0c276c16a98b9c22d8d40b.gz differ diff --git a/_darcs/patches/20081022203600-5ed1f-344e77e348655806a27db2de043b55ba67afc73a.gz b/_darcs/patches/20081022203600-5ed1f-344e77e348655806a27db2de043b55ba67afc73a.gz new file mode 100644 index 0000000000..6e43871d02 Binary files /dev/null and b/_darcs/patches/20081022203600-5ed1f-344e77e348655806a27db2de043b55ba67afc73a.gz differ diff --git a/_darcs/patches/20081022205621-5ed1f-4103d4db9713f4e6e65647f71cc788cbee56a240.gz b/_darcs/patches/20081022205621-5ed1f-4103d4db9713f4e6e65647f71cc788cbee56a240.gz new file mode 100644 index 0000000000..84f3b8a439 Binary files /dev/null and b/_darcs/patches/20081022205621-5ed1f-4103d4db9713f4e6e65647f71cc788cbee56a240.gz differ diff --git a/_darcs/patches/20081022205823-5ed1f-4dd1c7ef62a20a62e2be06abb6c4f1f1fdf902f9.gz b/_darcs/patches/20081022205823-5ed1f-4dd1c7ef62a20a62e2be06abb6c4f1f1fdf902f9.gz new file mode 100644 index 0000000000..72ee527987 Binary files /dev/null and b/_darcs/patches/20081022205823-5ed1f-4dd1c7ef62a20a62e2be06abb6c4f1f1fdf902f9.gz differ diff --git a/_darcs/patches/20081022210428-5ed1f-8de35689bfee3b38e6da83328137fb457a0bfdb0.gz b/_darcs/patches/20081022210428-5ed1f-8de35689bfee3b38e6da83328137fb457a0bfdb0.gz new file mode 100644 index 0000000000..05e6a4b021 Binary files /dev/null and b/_darcs/patches/20081022210428-5ed1f-8de35689bfee3b38e6da83328137fb457a0bfdb0.gz differ diff --git a/_darcs/patches/20081022210445-5ed1f-94a7b172f33411dfa8d1faaf7dc72169f57d6b39.gz b/_darcs/patches/20081022210445-5ed1f-94a7b172f33411dfa8d1faaf7dc72169f57d6b39.gz new file mode 100644 index 0000000000..a5bbe35917 Binary files /dev/null and b/_darcs/patches/20081022210445-5ed1f-94a7b172f33411dfa8d1faaf7dc72169f57d6b39.gz differ diff --git a/_darcs/patches/20081023203505-5ed1f-9fda1f30a6eb271966b7eaf42968103761b33b22.gz b/_darcs/patches/20081023203505-5ed1f-9fda1f30a6eb271966b7eaf42968103761b33b22.gz new file mode 100644 index 0000000000..f810399a5b Binary files /dev/null and b/_darcs/patches/20081023203505-5ed1f-9fda1f30a6eb271966b7eaf42968103761b33b22.gz differ diff --git a/_darcs/patches/20081023212659-5ed1f-0efa86cf7fbcc7bae4cb468fc514f33adf15ba0d.gz b/_darcs/patches/20081023212659-5ed1f-0efa86cf7fbcc7bae4cb468fc514f33adf15ba0d.gz new file mode 100644 index 0000000000..690e5f834c Binary files /dev/null and b/_darcs/patches/20081023212659-5ed1f-0efa86cf7fbcc7bae4cb468fc514f33adf15ba0d.gz differ diff --git a/_darcs/patches/20081024201234-84dde-06d2c147ec967cb8123ee0639a76f00a5f44e5c5.gz b/_darcs/patches/20081024201234-84dde-06d2c147ec967cb8123ee0639a76f00a5f44e5c5.gz new file mode 100644 index 0000000000..bd3d9276e6 Binary files /dev/null and b/_darcs/patches/20081024201234-84dde-06d2c147ec967cb8123ee0639a76f00a5f44e5c5.gz differ diff --git a/_darcs/patches/20081024213745-462f3-7c26611e7f75265affafd471c3d66e02ec7e686e.gz b/_darcs/patches/20081024213745-462f3-7c26611e7f75265affafd471c3d66e02ec7e686e.gz new file mode 100644 index 0000000000..7b2010f9c4 Binary files /dev/null and b/_darcs/patches/20081024213745-462f3-7c26611e7f75265affafd471c3d66e02ec7e686e.gz differ diff --git a/_darcs/patches/20081024215101-462f3-cef62f04283d58538dd7aab621668ce2274593f7.gz b/_darcs/patches/20081024215101-462f3-cef62f04283d58538dd7aab621668ce2274593f7.gz new file mode 100644 index 0000000000..5207aa24b2 Binary files /dev/null and b/_darcs/patches/20081024215101-462f3-cef62f04283d58538dd7aab621668ce2274593f7.gz differ diff --git a/_darcs/patches/20081025022849-5ed1f-edd99a830ff285f4d0468e0e9ce3ceba4a885352.gz b/_darcs/patches/20081025022849-5ed1f-edd99a830ff285f4d0468e0e9ce3ceba4a885352.gz new file mode 100644 index 0000000000..2232fdec0b Binary files /dev/null and b/_darcs/patches/20081025022849-5ed1f-edd99a830ff285f4d0468e0e9ce3ceba4a885352.gz differ diff --git a/_darcs/patches/20081025023252-5ed1f-ce96bbd6374b28a6380383ccfc6f78fb8ee67854.gz b/_darcs/patches/20081025023252-5ed1f-ce96bbd6374b28a6380383ccfc6f78fb8ee67854.gz new file mode 100644 index 0000000000..7811b523ea Binary files /dev/null and b/_darcs/patches/20081025023252-5ed1f-ce96bbd6374b28a6380383ccfc6f78fb8ee67854.gz differ diff --git a/_darcs/patches/20081025023347-5ed1f-b8dbb87a4dff048e9cab136c54564413c63ad4d4.gz b/_darcs/patches/20081025023347-5ed1f-b8dbb87a4dff048e9cab136c54564413c63ad4d4.gz new file mode 100644 index 0000000000..5a6ec388da Binary files /dev/null and b/_darcs/patches/20081025023347-5ed1f-b8dbb87a4dff048e9cab136c54564413c63ad4d4.gz differ diff --git a/_darcs/patches/20081026033353-5ed1f-f449572d9069add47dd88749be73e7550d260a0f.gz b/_darcs/patches/20081026033353-5ed1f-f449572d9069add47dd88749be73e7550d260a0f.gz new file mode 100644 index 0000000000..f77c62612f Binary files /dev/null and b/_darcs/patches/20081026033353-5ed1f-f449572d9069add47dd88749be73e7550d260a0f.gz differ diff --git a/_darcs/patches/20081026145326-5ed1f-430b98eedef21903caaae47e3355482ae7bfa616.gz b/_darcs/patches/20081026145326-5ed1f-430b98eedef21903caaae47e3355482ae7bfa616.gz new file mode 100644 index 0000000000..4fb32ae49d Binary files /dev/null and b/_darcs/patches/20081026145326-5ed1f-430b98eedef21903caaae47e3355482ae7bfa616.gz differ diff --git a/_darcs/patches/20081026145749-5ed1f-f2e566947ee5724aeb9c6e91922477cbfc60e144.gz b/_darcs/patches/20081026145749-5ed1f-f2e566947ee5724aeb9c6e91922477cbfc60e144.gz new file mode 100644 index 0000000000..dbc59ff509 Binary files /dev/null and b/_darcs/patches/20081026145749-5ed1f-f2e566947ee5724aeb9c6e91922477cbfc60e144.gz differ diff --git a/_darcs/patches/20081026150623-5ed1f-2aff71bf8faf4957b09d968d60851b4f74f738c4.gz b/_darcs/patches/20081026150623-5ed1f-2aff71bf8faf4957b09d968d60851b4f74f738c4.gz new file mode 100644 index 0000000000..fd10f506a7 Binary files /dev/null and b/_darcs/patches/20081026150623-5ed1f-2aff71bf8faf4957b09d968d60851b4f74f738c4.gz differ diff --git a/_darcs/patches/20081027191629-462f3-ff16a45754e2370f62ebac06dc38c51981bb6ee6.gz b/_darcs/patches/20081027191629-462f3-ff16a45754e2370f62ebac06dc38c51981bb6ee6.gz new file mode 100644 index 0000000000..b1db519043 Binary files /dev/null and b/_darcs/patches/20081027191629-462f3-ff16a45754e2370f62ebac06dc38c51981bb6ee6.gz differ diff --git a/_darcs/patches/20081102090241-5ed1f-f5278c69aa0c7427294b40b91f8957530b07062f.gz b/_darcs/patches/20081102090241-5ed1f-f5278c69aa0c7427294b40b91f8957530b07062f.gz new file mode 100644 index 0000000000..99724bbc34 Binary files /dev/null and b/_darcs/patches/20081102090241-5ed1f-f5278c69aa0c7427294b40b91f8957530b07062f.gz differ diff --git a/_darcs/patches/20081103211653-462f3-58a0ad41ab0426c21aceb04b4a91dc52559018d0.gz b/_darcs/patches/20081103211653-462f3-58a0ad41ab0426c21aceb04b4a91dc52559018d0.gz new file mode 100644 index 0000000000..7273841e00 Binary files /dev/null and b/_darcs/patches/20081103211653-462f3-58a0ad41ab0426c21aceb04b4a91dc52559018d0.gz differ diff --git a/_darcs/patches/20081104053359-462f3-2f6619bb942aa34b38dd82cb427878f83d4c332c.gz b/_darcs/patches/20081104053359-462f3-2f6619bb942aa34b38dd82cb427878f83d4c332c.gz new file mode 100644 index 0000000000..c2bb7a878c Binary files /dev/null and b/_darcs/patches/20081104053359-462f3-2f6619bb942aa34b38dd82cb427878f83d4c332c.gz differ diff --git a/_darcs/patches/20081104084027-462f3-ea7ab93938358bf90a1c1851d6f665973beae767.gz b/_darcs/patches/20081104084027-462f3-ea7ab93938358bf90a1c1851d6f665973beae767.gz new file mode 100644 index 0000000000..9b933894ab Binary files /dev/null and b/_darcs/patches/20081104084027-462f3-ea7ab93938358bf90a1c1851d6f665973beae767.gz differ diff --git a/_darcs/patches/20081106205926-099f7-6bcfd7969a159a12b1ba6a9ee254e44a07b94761.gz b/_darcs/patches/20081106205926-099f7-6bcfd7969a159a12b1ba6a9ee254e44a07b94761.gz new file mode 100644 index 0000000000..66be772499 Binary files /dev/null and b/_darcs/patches/20081106205926-099f7-6bcfd7969a159a12b1ba6a9ee254e44a07b94761.gz differ diff --git a/_darcs/patches/20081106210552-099f7-c5275ef0cc17622b60cb6e04ef7d1f420379f768.gz b/_darcs/patches/20081106210552-099f7-c5275ef0cc17622b60cb6e04ef7d1f420379f768.gz new file mode 100644 index 0000000000..b9bcd282de Binary files /dev/null and b/_darcs/patches/20081106210552-099f7-c5275ef0cc17622b60cb6e04ef7d1f420379f768.gz differ diff --git a/_darcs/patches/20081106224006-099f7-b1dee734b54c8426f386fd1eb0bf2f45bee302f9.gz b/_darcs/patches/20081106224006-099f7-b1dee734b54c8426f386fd1eb0bf2f45bee302f9.gz new file mode 100644 index 0000000000..5d48f0ddfe Binary files /dev/null and b/_darcs/patches/20081106224006-099f7-b1dee734b54c8426f386fd1eb0bf2f45bee302f9.gz differ diff --git a/_darcs/patches/20081106225721-462f3-b80ba75f87a4b36b803868653c956c393a236626.gz b/_darcs/patches/20081106225721-462f3-b80ba75f87a4b36b803868653c956c393a236626.gz new file mode 100644 index 0000000000..cff6e748c2 Binary files /dev/null and b/_darcs/patches/20081106225721-462f3-b80ba75f87a4b36b803868653c956c393a236626.gz differ diff --git a/_darcs/patches/20081107193831-099f7-e340280ba9d2abb4dca05733bc04bb5a5069b62b.gz b/_darcs/patches/20081107193831-099f7-e340280ba9d2abb4dca05733bc04bb5a5069b62b.gz new file mode 100644 index 0000000000..4496225bcd Binary files /dev/null and b/_darcs/patches/20081107193831-099f7-e340280ba9d2abb4dca05733bc04bb5a5069b62b.gz differ diff --git a/_darcs/patches/20081107194735-099f7-fe1ef28b4d36e5dde9e6addc287ad22946b060cd.gz b/_darcs/patches/20081107194735-099f7-fe1ef28b4d36e5dde9e6addc287ad22946b060cd.gz new file mode 100644 index 0000000000..83c5803dde Binary files /dev/null and b/_darcs/patches/20081107194735-099f7-fe1ef28b4d36e5dde9e6addc287ad22946b060cd.gz differ diff --git a/_darcs/patches/20081107201926-099f7-bee53da36841b7dc048591ed91ea35d3e3522d34.gz b/_darcs/patches/20081107201926-099f7-bee53da36841b7dc048591ed91ea35d3e3522d34.gz new file mode 100644 index 0000000000..fbb0b2e8b3 Binary files /dev/null and b/_darcs/patches/20081107201926-099f7-bee53da36841b7dc048591ed91ea35d3e3522d34.gz differ diff --git a/_darcs/patches/20081107203039-099f7-a059dab8d6b7909c309eacf5ef929408c3c6c6e0.gz b/_darcs/patches/20081107203039-099f7-a059dab8d6b7909c309eacf5ef929408c3c6c6e0.gz new file mode 100644 index 0000000000..a6956371c7 Binary files /dev/null and b/_darcs/patches/20081107203039-099f7-a059dab8d6b7909c309eacf5ef929408c3c6c6e0.gz differ diff --git a/_darcs/patches/20081107222100-099f7-18b3fc1c4e6939cdbc7a811a7df6f0e08068ea01.gz b/_darcs/patches/20081107222100-099f7-18b3fc1c4e6939cdbc7a811a7df6f0e08068ea01.gz new file mode 100644 index 0000000000..ecc5e7ab65 Binary files /dev/null and b/_darcs/patches/20081107222100-099f7-18b3fc1c4e6939cdbc7a811a7df6f0e08068ea01.gz differ diff --git a/_darcs/patches/20081111022330-462f3-810b2a86e6e209330ade628fc0e97df96151d496.gz b/_darcs/patches/20081111022330-462f3-810b2a86e6e209330ade628fc0e97df96151d496.gz new file mode 100644 index 0000000000..a2f7af888e Binary files /dev/null and b/_darcs/patches/20081111022330-462f3-810b2a86e6e209330ade628fc0e97df96151d496.gz differ diff --git a/_darcs/patches/20081112172517-5ed1f-4e8534d7898e2134edf4c0a28417b4a5274617d4.gz b/_darcs/patches/20081112172517-5ed1f-4e8534d7898e2134edf4c0a28417b4a5274617d4.gz new file mode 100644 index 0000000000..fb4c6cef54 Binary files /dev/null and b/_darcs/patches/20081112172517-5ed1f-4e8534d7898e2134edf4c0a28417b4a5274617d4.gz differ diff --git a/_darcs/patches/20081112173627-5ed1f-7cee5b6f25ab654f066c8902492ed531fb1ea091.gz b/_darcs/patches/20081112173627-5ed1f-7cee5b6f25ab654f066c8902492ed531fb1ea091.gz new file mode 100644 index 0000000000..14efe20c6d Binary files /dev/null and b/_darcs/patches/20081112173627-5ed1f-7cee5b6f25ab654f066c8902492ed531fb1ea091.gz differ diff --git a/_darcs/patches/20081112181117-5ed1f-47585440302995dc33a4accc35a76fc750495709.gz b/_darcs/patches/20081112181117-5ed1f-47585440302995dc33a4accc35a76fc750495709.gz new file mode 100644 index 0000000000..481fcee495 Binary files /dev/null and b/_darcs/patches/20081112181117-5ed1f-47585440302995dc33a4accc35a76fc750495709.gz differ diff --git a/_darcs/patches/20081112181327-5ed1f-b9703dc936c8d99b226055053b02e4ba177b240d.gz b/_darcs/patches/20081112181327-5ed1f-b9703dc936c8d99b226055053b02e4ba177b240d.gz new file mode 100644 index 0000000000..d9afeb57bd Binary files /dev/null and b/_darcs/patches/20081112181327-5ed1f-b9703dc936c8d99b226055053b02e4ba177b240d.gz differ diff --git a/_darcs/patches/20081112181533-5ed1f-d1c2d3ff28153afaf640eb127e9bcf4867952d36.gz b/_darcs/patches/20081112181533-5ed1f-d1c2d3ff28153afaf640eb127e9bcf4867952d36.gz new file mode 100644 index 0000000000..821f78fb17 Binary files /dev/null and b/_darcs/patches/20081112181533-5ed1f-d1c2d3ff28153afaf640eb127e9bcf4867952d36.gz differ diff --git a/_darcs/patches/20081112185117-5ed1f-3b2373620581d123182dc951c528276541f4ab68.gz b/_darcs/patches/20081112185117-5ed1f-3b2373620581d123182dc951c528276541f4ab68.gz new file mode 100644 index 0000000000..3acce37ef0 Binary files /dev/null and b/_darcs/patches/20081112185117-5ed1f-3b2373620581d123182dc951c528276541f4ab68.gz differ diff --git a/_darcs/patches/20081112185146-5ed1f-fbef54f5eac30f26b999cd2347583f7d867535bf.gz b/_darcs/patches/20081112185146-5ed1f-fbef54f5eac30f26b999cd2347583f7d867535bf.gz new file mode 100644 index 0000000000..bc9b43b261 Binary files /dev/null and b/_darcs/patches/20081112185146-5ed1f-fbef54f5eac30f26b999cd2347583f7d867535bf.gz differ diff --git a/_darcs/patches/20081112190828-5ed1f-a9537a2e4542fbbbec555ed43792c6a5236e6029.gz b/_darcs/patches/20081112190828-5ed1f-a9537a2e4542fbbbec555ed43792c6a5236e6029.gz new file mode 100644 index 0000000000..d72ef649fd Binary files /dev/null and b/_darcs/patches/20081112190828-5ed1f-a9537a2e4542fbbbec555ed43792c6a5236e6029.gz differ diff --git a/_darcs/patches/20081113024833-0aa81-27d1d08708ddc96fb37b30d3547c1e54108fe409.gz b/_darcs/patches/20081113024833-0aa81-27d1d08708ddc96fb37b30d3547c1e54108fe409.gz new file mode 100644 index 0000000000..4b61223a9f Binary files /dev/null and b/_darcs/patches/20081113024833-0aa81-27d1d08708ddc96fb37b30d3547c1e54108fe409.gz differ diff --git a/_darcs/patches/20081113063850-5ed1f-15c314239e2114b52beb7c83b7006b69a48ec5c3.gz b/_darcs/patches/20081113063850-5ed1f-15c314239e2114b52beb7c83b7006b69a48ec5c3.gz new file mode 100644 index 0000000000..244ecb0046 Binary files /dev/null and b/_darcs/patches/20081113063850-5ed1f-15c314239e2114b52beb7c83b7006b69a48ec5c3.gz differ diff --git a/_darcs/patches/20081113152718-099f7-42b60d02395f016c54c5f3c301f9dbe987c1283f.gz b/_darcs/patches/20081113152718-099f7-42b60d02395f016c54c5f3c301f9dbe987c1283f.gz new file mode 100644 index 0000000000..6b66b806f5 Binary files /dev/null and b/_darcs/patches/20081113152718-099f7-42b60d02395f016c54c5f3c301f9dbe987c1283f.gz differ diff --git a/_darcs/patches/20081113153216-099f7-81c4aba01babca97edeaf55b230dee300dbeb57a.gz b/_darcs/patches/20081113153216-099f7-81c4aba01babca97edeaf55b230dee300dbeb57a.gz new file mode 100644 index 0000000000..e07b7bd838 Binary files /dev/null and b/_darcs/patches/20081113153216-099f7-81c4aba01babca97edeaf55b230dee300dbeb57a.gz differ diff --git a/_darcs/patches/20081113164741-099f7-c8994bc8902df1cfc9fe62bf6d556a5c3f521b8f.gz b/_darcs/patches/20081113164741-099f7-c8994bc8902df1cfc9fe62bf6d556a5c3f521b8f.gz new file mode 100644 index 0000000000..18231c8cb4 Binary files /dev/null and b/_darcs/patches/20081113164741-099f7-c8994bc8902df1cfc9fe62bf6d556a5c3f521b8f.gz differ diff --git a/_darcs/patches/20081113170234-099f7-b714b0640370b8ecf37aa422455831dae5ce4c5e.gz b/_darcs/patches/20081113170234-099f7-b714b0640370b8ecf37aa422455831dae5ce4c5e.gz new file mode 100644 index 0000000000..5ed7a700c3 Binary files /dev/null and b/_darcs/patches/20081113170234-099f7-b714b0640370b8ecf37aa422455831dae5ce4c5e.gz differ diff --git a/_darcs/patches/20081113182834-099f7-f55adc95eb8fb46f8cee1c176653c88f65e27ab6.gz b/_darcs/patches/20081113182834-099f7-f55adc95eb8fb46f8cee1c176653c88f65e27ab6.gz new file mode 100644 index 0000000000..c5dbd75dbb Binary files /dev/null and b/_darcs/patches/20081113182834-099f7-f55adc95eb8fb46f8cee1c176653c88f65e27ab6.gz differ diff --git a/_darcs/patches/20081113195237-462f3-35c44753490c57e30d0adf661ae4c8a08af7e39c.gz b/_darcs/patches/20081113195237-462f3-35c44753490c57e30d0adf661ae4c8a08af7e39c.gz new file mode 100644 index 0000000000..90e8dfb943 Binary files /dev/null and b/_darcs/patches/20081113195237-462f3-35c44753490c57e30d0adf661ae4c8a08af7e39c.gz differ diff --git a/_darcs/patches/20081113210209-84dde-56052bac5ce490d54f3220baaa13f5bfc0e7618d.gz b/_darcs/patches/20081113210209-84dde-56052bac5ce490d54f3220baaa13f5bfc0e7618d.gz new file mode 100644 index 0000000000..a0054912f9 Binary files /dev/null and b/_darcs/patches/20081113210209-84dde-56052bac5ce490d54f3220baaa13f5bfc0e7618d.gz differ diff --git a/_darcs/patches/20081113212214-0aa81-542425ff91428f38985c0acd36c15319bd2f5ec7.gz b/_darcs/patches/20081113212214-0aa81-542425ff91428f38985c0acd36c15319bd2f5ec7.gz new file mode 100644 index 0000000000..7bcc7153b8 Binary files /dev/null and b/_darcs/patches/20081113212214-0aa81-542425ff91428f38985c0acd36c15319bd2f5ec7.gz differ diff --git a/_darcs/patches/20081113213119-0aa81-0f484f48bfe5cceb443d36c90dbd8ad7ca554be4.gz b/_darcs/patches/20081113213119-0aa81-0f484f48bfe5cceb443d36c90dbd8ad7ca554be4.gz new file mode 100644 index 0000000000..57ba559d73 Binary files /dev/null and b/_darcs/patches/20081113213119-0aa81-0f484f48bfe5cceb443d36c90dbd8ad7ca554be4.gz differ diff --git a/_darcs/patches/20081113214544-84dde-a6de7a968847a7043aecdf0201abca648dd15e70.gz b/_darcs/patches/20081113214544-84dde-a6de7a968847a7043aecdf0201abca648dd15e70.gz new file mode 100644 index 0000000000..5fa8cdae94 Binary files /dev/null and b/_darcs/patches/20081113214544-84dde-a6de7a968847a7043aecdf0201abca648dd15e70.gz differ diff --git a/_darcs/patches/20081113215734-84dde-badae0579fb70a6760dc6fdf0289b76356e479f6.gz b/_darcs/patches/20081113215734-84dde-badae0579fb70a6760dc6fdf0289b76356e479f6.gz new file mode 100644 index 0000000000..d24acc4e5b Binary files /dev/null and b/_darcs/patches/20081113215734-84dde-badae0579fb70a6760dc6fdf0289b76356e479f6.gz differ diff --git a/_darcs/patches/20081113220335-84dde-27009ae22f0994709046b6681d3139455a4e9c22.gz b/_darcs/patches/20081113220335-84dde-27009ae22f0994709046b6681d3139455a4e9c22.gz new file mode 100644 index 0000000000..ec6ef95a05 Binary files /dev/null and b/_darcs/patches/20081113220335-84dde-27009ae22f0994709046b6681d3139455a4e9c22.gz differ diff --git a/_darcs/patches/20081113223514-84dde-be89824e7986a9af30bd42e89228a0f7ce949240.gz b/_darcs/patches/20081113223514-84dde-be89824e7986a9af30bd42e89228a0f7ce949240.gz new file mode 100644 index 0000000000..9a952ab603 Binary files /dev/null and b/_darcs/patches/20081113223514-84dde-be89824e7986a9af30bd42e89228a0f7ce949240.gz differ diff --git a/_darcs/patches/20081114015930-84dde-c2556e2dd409f4c13f9063d77ad15974e6d0f3c4.gz b/_darcs/patches/20081114015930-84dde-c2556e2dd409f4c13f9063d77ad15974e6d0f3c4.gz new file mode 100644 index 0000000000..af29b85763 Binary files /dev/null and b/_darcs/patches/20081114015930-84dde-c2556e2dd409f4c13f9063d77ad15974e6d0f3c4.gz differ diff --git a/_darcs/patches/20081114021217-84dde-e3758114435b794b0d1be0c135419390ab06be13.gz b/_darcs/patches/20081114021217-84dde-e3758114435b794b0d1be0c135419390ab06be13.gz new file mode 100644 index 0000000000..23dc9f58d5 Binary files /dev/null and b/_darcs/patches/20081114021217-84dde-e3758114435b794b0d1be0c135419390ab06be13.gz differ diff --git a/_darcs/patches/20081114025715-84dde-f281521adee0c81cde88261a6a539495310ed927.gz b/_darcs/patches/20081114025715-84dde-f281521adee0c81cde88261a6a539495310ed927.gz new file mode 100644 index 0000000000..f8a1aafdb3 Binary files /dev/null and b/_darcs/patches/20081114025715-84dde-f281521adee0c81cde88261a6a539495310ed927.gz differ diff --git a/_darcs/patches/20081114032817-84dde-149e8f70877ea10bd853f473898e6ba898f12d46.gz b/_darcs/patches/20081114032817-84dde-149e8f70877ea10bd853f473898e6ba898f12d46.gz new file mode 100644 index 0000000000..e01c926828 Binary files /dev/null and b/_darcs/patches/20081114032817-84dde-149e8f70877ea10bd853f473898e6ba898f12d46.gz differ diff --git a/_darcs/patches/20081114032959-84dde-ae883939976e69cc80fa0f15cd281cd0642e95fc.gz b/_darcs/patches/20081114032959-84dde-ae883939976e69cc80fa0f15cd281cd0642e95fc.gz new file mode 100644 index 0000000000..2136ac33bb Binary files /dev/null and b/_darcs/patches/20081114032959-84dde-ae883939976e69cc80fa0f15cd281cd0642e95fc.gz differ diff --git a/_darcs/patches/20081114052528-462f3-741f881a49934cb5a3ef9196ad6df872f387a748.gz b/_darcs/patches/20081114052528-462f3-741f881a49934cb5a3ef9196ad6df872f387a748.gz new file mode 100644 index 0000000000..e2030fe09f Binary files /dev/null and b/_darcs/patches/20081114052528-462f3-741f881a49934cb5a3ef9196ad6df872f387a748.gz differ diff --git a/_darcs/patches/20081114053044-462f3-30e2d27261bca1977b89dee409383e178f446149.gz b/_darcs/patches/20081114053044-462f3-30e2d27261bca1977b89dee409383e178f446149.gz new file mode 100644 index 0000000000..d898ddff67 Binary files /dev/null and b/_darcs/patches/20081114053044-462f3-30e2d27261bca1977b89dee409383e178f446149.gz differ diff --git a/_darcs/patches/20081114065145-84dde-869571e84951470ab40f5b5191d099d23e68b27b.gz b/_darcs/patches/20081114065145-84dde-869571e84951470ab40f5b5191d099d23e68b27b.gz new file mode 100644 index 0000000000..3e39e394e3 Binary files /dev/null and b/_darcs/patches/20081114065145-84dde-869571e84951470ab40f5b5191d099d23e68b27b.gz differ diff --git a/_darcs/patches/20081114074211-84dde-77dbee17b2eb5848a0aa012c6ebe352135f5e7c1.gz b/_darcs/patches/20081114074211-84dde-77dbee17b2eb5848a0aa012c6ebe352135f5e7c1.gz new file mode 100644 index 0000000000..0edae17e4b Binary files /dev/null and b/_darcs/patches/20081114074211-84dde-77dbee17b2eb5848a0aa012c6ebe352135f5e7c1.gz differ diff --git a/_darcs/patches/20081114074511-84dde-af2b2e5deee20bdf1ea72559411716cb756d2866.gz b/_darcs/patches/20081114074511-84dde-af2b2e5deee20bdf1ea72559411716cb756d2866.gz new file mode 100644 index 0000000000..f65cbb6422 Binary files /dev/null and b/_darcs/patches/20081114074511-84dde-af2b2e5deee20bdf1ea72559411716cb756d2866.gz differ diff --git a/_darcs/patches/20081114080853-84dde-5e9d1e2fa3af671036be98d79a82ddc4e8a52a05.gz b/_darcs/patches/20081114080853-84dde-5e9d1e2fa3af671036be98d79a82ddc4e8a52a05.gz new file mode 100644 index 0000000000..0f65f46451 Binary files /dev/null and b/_darcs/patches/20081114080853-84dde-5e9d1e2fa3af671036be98d79a82ddc4e8a52a05.gz differ diff --git a/_darcs/patches/20081114142228-84dde-cc4a966817a1977282ef9a6845613ed5ec6c4e88.gz b/_darcs/patches/20081114142228-84dde-cc4a966817a1977282ef9a6845613ed5ec6c4e88.gz new file mode 100644 index 0000000000..1e9220ffac Binary files /dev/null and b/_darcs/patches/20081114142228-84dde-cc4a966817a1977282ef9a6845613ed5ec6c4e88.gz differ diff --git a/_darcs/patches/20081114144014-84dde-b75b44b8bb485c4122655e38b8201736fb3f64ed.gz b/_darcs/patches/20081114144014-84dde-b75b44b8bb485c4122655e38b8201736fb3f64ed.gz new file mode 100644 index 0000000000..807fbc15e2 Binary files /dev/null and b/_darcs/patches/20081114144014-84dde-b75b44b8bb485c4122655e38b8201736fb3f64ed.gz differ diff --git a/_darcs/patches/20081114173242-099f7-7cc37f036cc564ecde029bfce00b313eb047232c.gz b/_darcs/patches/20081114173242-099f7-7cc37f036cc564ecde029bfce00b313eb047232c.gz new file mode 100644 index 0000000000..934b042ab4 Binary files /dev/null and b/_darcs/patches/20081114173242-099f7-7cc37f036cc564ecde029bfce00b313eb047232c.gz differ diff --git a/_darcs/patches/20081114192649-099f7-338368278173f5fa130e508316f5b8b252d90214.gz b/_darcs/patches/20081114192649-099f7-338368278173f5fa130e508316f5b8b252d90214.gz new file mode 100644 index 0000000000..17eeee6188 Binary files /dev/null and b/_darcs/patches/20081114192649-099f7-338368278173f5fa130e508316f5b8b252d90214.gz differ diff --git a/_darcs/patches/20081114194620-84dde-8349db3358c547889ec9b095dc340fdd0cd31210.gz b/_darcs/patches/20081114194620-84dde-8349db3358c547889ec9b095dc340fdd0cd31210.gz new file mode 100644 index 0000000000..885f2c8525 Binary files /dev/null and b/_darcs/patches/20081114194620-84dde-8349db3358c547889ec9b095dc340fdd0cd31210.gz differ diff --git a/_darcs/patches/20081114194727-84dde-8dba6a82efe1deafc77e07f17685cf2cd0f8eeb2.gz b/_darcs/patches/20081114194727-84dde-8dba6a82efe1deafc77e07f17685cf2cd0f8eeb2.gz new file mode 100644 index 0000000000..86fdab478f Binary files /dev/null and b/_darcs/patches/20081114194727-84dde-8dba6a82efe1deafc77e07f17685cf2cd0f8eeb2.gz differ diff --git a/_darcs/patches/20081114195457-099f7-45f4f39d5f2eff980d903ca156170576323ec4a7.gz b/_darcs/patches/20081114195457-099f7-45f4f39d5f2eff980d903ca156170576323ec4a7.gz new file mode 100644 index 0000000000..4580c95149 Binary files /dev/null and b/_darcs/patches/20081114195457-099f7-45f4f39d5f2eff980d903ca156170576323ec4a7.gz differ diff --git a/_darcs/patches/20081114210506-eefa4-ba7e9bdd794ddfcacc397d732073abf99e97f3a5.gz b/_darcs/patches/20081114210506-eefa4-ba7e9bdd794ddfcacc397d732073abf99e97f3a5.gz new file mode 100644 index 0000000000..87fcbe5149 Binary files /dev/null and b/_darcs/patches/20081114210506-eefa4-ba7e9bdd794ddfcacc397d732073abf99e97f3a5.gz differ diff --git a/_darcs/patches/20081114214315-eefa4-f21edae797a7c9c685dd00c858731b173337bf85.gz b/_darcs/patches/20081114214315-eefa4-f21edae797a7c9c685dd00c858731b173337bf85.gz new file mode 100644 index 0000000000..2c53fa1c0a Binary files /dev/null and b/_darcs/patches/20081114214315-eefa4-f21edae797a7c9c685dd00c858731b173337bf85.gz differ diff --git a/_darcs/patches/20081114220805-eefa4-3d8a8eaf21cd219e25186ec2f956a8442580109e.gz b/_darcs/patches/20081114220805-eefa4-3d8a8eaf21cd219e25186ec2f956a8442580109e.gz new file mode 100644 index 0000000000..b1244a925a Binary files /dev/null and b/_darcs/patches/20081114220805-eefa4-3d8a8eaf21cd219e25186ec2f956a8442580109e.gz differ diff --git a/_darcs/patches/20081115033549-eefa4-cfbca6f9c723aa63869c39d6851de7a7803f0703.gz b/_darcs/patches/20081115033549-eefa4-cfbca6f9c723aa63869c39d6851de7a7803f0703.gz new file mode 100644 index 0000000000..237c6122a5 Binary files /dev/null and b/_darcs/patches/20081115033549-eefa4-cfbca6f9c723aa63869c39d6851de7a7803f0703.gz differ diff --git a/_darcs/patches/20081115043955-eefa4-907cf3fd3533f193496bc608fd0cd1573405de35.gz b/_darcs/patches/20081115043955-eefa4-907cf3fd3533f193496bc608fd0cd1573405de35.gz new file mode 100644 index 0000000000..36bfa72068 Binary files /dev/null and b/_darcs/patches/20081115043955-eefa4-907cf3fd3533f193496bc608fd0cd1573405de35.gz differ diff --git a/_darcs/patches/20081116022735-eefa4-366f6deb85942f859ebd532e477b57737bcafbf8.gz b/_darcs/patches/20081116022735-eefa4-366f6deb85942f859ebd532e477b57737bcafbf8.gz new file mode 100644 index 0000000000..f38cb1ef04 Binary files /dev/null and b/_darcs/patches/20081116022735-eefa4-366f6deb85942f859ebd532e477b57737bcafbf8.gz differ diff --git a/_darcs/patches/20081116033155-eefa4-3fedb1932819520c6b35b2a543f4dcfd5014e872.gz b/_darcs/patches/20081116033155-eefa4-3fedb1932819520c6b35b2a543f4dcfd5014e872.gz new file mode 100644 index 0000000000..d2be971299 Binary files /dev/null and b/_darcs/patches/20081116033155-eefa4-3fedb1932819520c6b35b2a543f4dcfd5014e872.gz differ diff --git a/_darcs/patches/20081116062937-84dde-2c2369d0513dba49514a6800f67324803d0fe335.gz b/_darcs/patches/20081116062937-84dde-2c2369d0513dba49514a6800f67324803d0fe335.gz new file mode 100644 index 0000000000..289ad31d1b Binary files /dev/null and b/_darcs/patches/20081116062937-84dde-2c2369d0513dba49514a6800f67324803d0fe335.gz differ diff --git a/_darcs/patches/20081117001644-099f7-9b086e032d0bc4d74da426c7dd363bb9a4f9aed4.gz b/_darcs/patches/20081117001644-099f7-9b086e032d0bc4d74da426c7dd363bb9a4f9aed4.gz new file mode 100644 index 0000000000..b34f0c3f25 Binary files /dev/null and b/_darcs/patches/20081117001644-099f7-9b086e032d0bc4d74da426c7dd363bb9a4f9aed4.gz differ diff --git a/_darcs/patches/20081117003010-099f7-dd605b41a28ab99c2fadde38d9c7341bfdae0312.gz b/_darcs/patches/20081117003010-099f7-dd605b41a28ab99c2fadde38d9c7341bfdae0312.gz new file mode 100644 index 0000000000..1859b4d114 Binary files /dev/null and b/_darcs/patches/20081117003010-099f7-dd605b41a28ab99c2fadde38d9c7341bfdae0312.gz differ diff --git a/_darcs/patches/20081117024624-462f3-91f148111c2c43ddd302fc63cfa8c8ef14e1f38e.gz b/_darcs/patches/20081117024624-462f3-91f148111c2c43ddd302fc63cfa8c8ef14e1f38e.gz new file mode 100644 index 0000000000..862aa096e8 Binary files /dev/null and b/_darcs/patches/20081117024624-462f3-91f148111c2c43ddd302fc63cfa8c8ef14e1f38e.gz differ diff --git a/_darcs/patches/20081117154147-099f7-cf844aabcc3866eaf42312050a959dbc7cb10ed9.gz b/_darcs/patches/20081117154147-099f7-cf844aabcc3866eaf42312050a959dbc7cb10ed9.gz new file mode 100644 index 0000000000..59531b0b67 Binary files /dev/null and b/_darcs/patches/20081117154147-099f7-cf844aabcc3866eaf42312050a959dbc7cb10ed9.gz differ diff --git a/_darcs/patches/20081117173144-099f7-b475f072ddc36e03143e05698e86186955566db9.gz b/_darcs/patches/20081117173144-099f7-b475f072ddc36e03143e05698e86186955566db9.gz new file mode 100644 index 0000000000..b4f1925c18 Binary files /dev/null and b/_darcs/patches/20081117173144-099f7-b475f072ddc36e03143e05698e86186955566db9.gz differ diff --git a/_darcs/patches/20081117175627-099f7-59da80fe33257fa736a354c0a422a227e534ab2c.gz b/_darcs/patches/20081117175627-099f7-59da80fe33257fa736a354c0a422a227e534ab2c.gz new file mode 100644 index 0000000000..a923a45b8e Binary files /dev/null and b/_darcs/patches/20081117175627-099f7-59da80fe33257fa736a354c0a422a227e534ab2c.gz differ diff --git a/_darcs/patches/20081117181511-eefa4-9b2e11a65022b71259ca15ea9b02d94a128ca459.gz b/_darcs/patches/20081117181511-eefa4-9b2e11a65022b71259ca15ea9b02d94a128ca459.gz new file mode 100644 index 0000000000..145391cc3c Binary files /dev/null and b/_darcs/patches/20081117181511-eefa4-9b2e11a65022b71259ca15ea9b02d94a128ca459.gz differ diff --git a/_darcs/patches/20081118024947-84dde-46f68dff10cd2b5665fbd482f90ac83601df4228.gz b/_darcs/patches/20081118024947-84dde-46f68dff10cd2b5665fbd482f90ac83601df4228.gz new file mode 100644 index 0000000000..f956488273 Binary files /dev/null and b/_darcs/patches/20081118024947-84dde-46f68dff10cd2b5665fbd482f90ac83601df4228.gz differ diff --git a/_darcs/patches/20081118155643-099f7-df2d332253d9acc007966b28f5afc2edcd7cc9ac.gz b/_darcs/patches/20081118155643-099f7-df2d332253d9acc007966b28f5afc2edcd7cc9ac.gz new file mode 100644 index 0000000000..5dad8c5f30 Binary files /dev/null and b/_darcs/patches/20081118155643-099f7-df2d332253d9acc007966b28f5afc2edcd7cc9ac.gz differ diff --git a/_darcs/patches/20081118172328-34904-98eea66103c6acee66cb23933038efe8e56923e9.gz b/_darcs/patches/20081118172328-34904-98eea66103c6acee66cb23933038efe8e56923e9.gz new file mode 100644 index 0000000000..ed8f0c8dcb Binary files /dev/null and b/_darcs/patches/20081118172328-34904-98eea66103c6acee66cb23933038efe8e56923e9.gz differ diff --git a/_darcs/patches/20081118173250-34904-ebde2dda47e743d5728a3ff9f556a8945b734009.gz b/_darcs/patches/20081118173250-34904-ebde2dda47e743d5728a3ff9f556a8945b734009.gz new file mode 100644 index 0000000000..f085444877 Binary files /dev/null and b/_darcs/patches/20081118173250-34904-ebde2dda47e743d5728a3ff9f556a8945b734009.gz differ diff --git a/_darcs/patches/20081118173307-34904-426f45fb40129e75f9b251baecfec59e2b9cb6c9.gz b/_darcs/patches/20081118173307-34904-426f45fb40129e75f9b251baecfec59e2b9cb6c9.gz new file mode 100644 index 0000000000..be06339b20 Binary files /dev/null and b/_darcs/patches/20081118173307-34904-426f45fb40129e75f9b251baecfec59e2b9cb6c9.gz differ diff --git a/_darcs/patches/20081118174857-099f7-bb67199062174a41433c34434f4832a8f48898ee.gz b/_darcs/patches/20081118174857-099f7-bb67199062174a41433c34434f4832a8f48898ee.gz new file mode 100644 index 0000000000..16e86c9bf8 Binary files /dev/null and b/_darcs/patches/20081118174857-099f7-bb67199062174a41433c34434f4832a8f48898ee.gz differ diff --git a/_darcs/patches/20081118180644-84dde-ab152249ac0844a482029b7e0f8db2780a0f15d6.gz b/_darcs/patches/20081118180644-84dde-ab152249ac0844a482029b7e0f8db2780a0f15d6.gz new file mode 100644 index 0000000000..7af7f2904b Binary files /dev/null and b/_darcs/patches/20081118180644-84dde-ab152249ac0844a482029b7e0f8db2780a0f15d6.gz differ diff --git a/_darcs/patches/20081118185649-eefa4-72d485513ea9052cb02e2f8f79e36109491f1446.gz b/_darcs/patches/20081118185649-eefa4-72d485513ea9052cb02e2f8f79e36109491f1446.gz new file mode 100644 index 0000000000..b62cb58ba6 Binary files /dev/null and b/_darcs/patches/20081118185649-eefa4-72d485513ea9052cb02e2f8f79e36109491f1446.gz differ diff --git a/_darcs/patches/20081118190030-eefa4-6fdd5c61412555628a2a4d62941605e9e08bdcc5.gz b/_darcs/patches/20081118190030-eefa4-6fdd5c61412555628a2a4d62941605e9e08bdcc5.gz new file mode 100644 index 0000000000..7042bc21d2 Binary files /dev/null and b/_darcs/patches/20081118190030-eefa4-6fdd5c61412555628a2a4d62941605e9e08bdcc5.gz differ diff --git a/_darcs/patches/20081118192227-84dde-3318e91d2366f3cb70bc795e313072f8e81a190c.gz b/_darcs/patches/20081118192227-84dde-3318e91d2366f3cb70bc795e313072f8e81a190c.gz new file mode 100644 index 0000000000..86a1fa2028 Binary files /dev/null and b/_darcs/patches/20081118192227-84dde-3318e91d2366f3cb70bc795e313072f8e81a190c.gz differ diff --git a/_darcs/patches/20081118194444-eefa4-ed631080a17ecddaaf32950ab190d071e2461ed7.gz b/_darcs/patches/20081118194444-eefa4-ed631080a17ecddaaf32950ab190d071e2461ed7.gz new file mode 100644 index 0000000000..287dc4f359 Binary files /dev/null and b/_darcs/patches/20081118194444-eefa4-ed631080a17ecddaaf32950ab190d071e2461ed7.gz differ diff --git a/_darcs/patches/20081119011128-7b5ce-74471277443b44d0075f66131028447cfda3b1e4.gz b/_darcs/patches/20081119011128-7b5ce-74471277443b44d0075f66131028447cfda3b1e4.gz new file mode 100644 index 0000000000..e99592b0f0 Binary files /dev/null and b/_darcs/patches/20081119011128-7b5ce-74471277443b44d0075f66131028447cfda3b1e4.gz differ diff --git a/_darcs/patches/20081119200839-7b5ce-5f4a689dde7cbed392f598d3a2fbbf7f44bb0bd9.gz b/_darcs/patches/20081119200839-7b5ce-5f4a689dde7cbed392f598d3a2fbbf7f44bb0bd9.gz new file mode 100644 index 0000000000..83506dd015 Binary files /dev/null and b/_darcs/patches/20081119200839-7b5ce-5f4a689dde7cbed392f598d3a2fbbf7f44bb0bd9.gz differ diff --git a/_darcs/patches/20081119204501-7b5ce-c501f29e754d667ba680c19ef4e5db5c0125316e.gz b/_darcs/patches/20081119204501-7b5ce-c501f29e754d667ba680c19ef4e5db5c0125316e.gz new file mode 100644 index 0000000000..623bea046f Binary files /dev/null and b/_darcs/patches/20081119204501-7b5ce-c501f29e754d667ba680c19ef4e5db5c0125316e.gz differ diff --git a/_darcs/patches/20081120071930-7b5ce-a15d7308bde085f03aa335c98ecd0aaa3833bc35.gz b/_darcs/patches/20081120071930-7b5ce-a15d7308bde085f03aa335c98ecd0aaa3833bc35.gz new file mode 100644 index 0000000000..5e8dc23453 Binary files /dev/null and b/_darcs/patches/20081120071930-7b5ce-a15d7308bde085f03aa335c98ecd0aaa3833bc35.gz differ diff --git a/_darcs/patches/20081120105027-84dde-e1c0faace07d9f2439d3a51a42cfe83464da5319.gz b/_darcs/patches/20081120105027-84dde-e1c0faace07d9f2439d3a51a42cfe83464da5319.gz new file mode 100644 index 0000000000..3bf01d2ed5 Binary files /dev/null and b/_darcs/patches/20081120105027-84dde-e1c0faace07d9f2439d3a51a42cfe83464da5319.gz differ diff --git a/_darcs/patches/20081120105223-84dde-d4b44f20e9bd0e3ce96e6834e04ad05cb451ba6a.gz b/_darcs/patches/20081120105223-84dde-d4b44f20e9bd0e3ce96e6834e04ad05cb451ba6a.gz new file mode 100644 index 0000000000..b951d97aad Binary files /dev/null and b/_darcs/patches/20081120105223-84dde-d4b44f20e9bd0e3ce96e6834e04ad05cb451ba6a.gz differ diff --git a/_darcs/patches/20081120105726-84dde-bc863f49370dca492d46a5f46c65f46d01862acb.gz b/_darcs/patches/20081120105726-84dde-bc863f49370dca492d46a5f46c65f46d01862acb.gz new file mode 100644 index 0000000000..b921860110 Binary files /dev/null and b/_darcs/patches/20081120105726-84dde-bc863f49370dca492d46a5f46c65f46d01862acb.gz differ diff --git a/_darcs/patches/20081120113839-84dde-169dceadab4d365c81282e8a68a744b7c1aa6a94.gz b/_darcs/patches/20081120113839-84dde-169dceadab4d365c81282e8a68a744b7c1aa6a94.gz new file mode 100644 index 0000000000..1c91888446 Binary files /dev/null and b/_darcs/patches/20081120113839-84dde-169dceadab4d365c81282e8a68a744b7c1aa6a94.gz differ diff --git a/_darcs/patches/20081120114137-84dde-6d55cab81e0b23628cf9aa0360b9de2f866ba186.gz b/_darcs/patches/20081120114137-84dde-6d55cab81e0b23628cf9aa0360b9de2f866ba186.gz new file mode 100644 index 0000000000..18d868bb4b Binary files /dev/null and b/_darcs/patches/20081120114137-84dde-6d55cab81e0b23628cf9aa0360b9de2f866ba186.gz differ diff --git a/_darcs/patches/20081120114156-84dde-90c360afbf3812d27262ac5c3e921bbc8e550627.gz b/_darcs/patches/20081120114156-84dde-90c360afbf3812d27262ac5c3e921bbc8e550627.gz new file mode 100644 index 0000000000..8f13337636 Binary files /dev/null and b/_darcs/patches/20081120114156-84dde-90c360afbf3812d27262ac5c3e921bbc8e550627.gz differ diff --git a/_darcs/patches/20081120122352-84dde-2bc356e446abb061ac1d7e9e9bd4f8d53d688509.gz b/_darcs/patches/20081120122352-84dde-2bc356e446abb061ac1d7e9e9bd4f8d53d688509.gz new file mode 100644 index 0000000000..8c470b4938 Binary files /dev/null and b/_darcs/patches/20081120122352-84dde-2bc356e446abb061ac1d7e9e9bd4f8d53d688509.gz differ diff --git a/_darcs/patches/20081120122411-84dde-86319f13b241ebe4557561106014035653d5e197.gz b/_darcs/patches/20081120122411-84dde-86319f13b241ebe4557561106014035653d5e197.gz new file mode 100644 index 0000000000..e9d2326b72 Binary files /dev/null and b/_darcs/patches/20081120122411-84dde-86319f13b241ebe4557561106014035653d5e197.gz differ diff --git a/_darcs/patches/20081120122620-84dde-ac84012a563247b3074be50662b2879b7519c3d3.gz b/_darcs/patches/20081120122620-84dde-ac84012a563247b3074be50662b2879b7519c3d3.gz new file mode 100644 index 0000000000..3335e3eadc Binary files /dev/null and b/_darcs/patches/20081120122620-84dde-ac84012a563247b3074be50662b2879b7519c3d3.gz differ diff --git a/_darcs/patches/20081120122709-84dde-3af930fcea7788753517537afd762999cc4e0a93.gz b/_darcs/patches/20081120122709-84dde-3af930fcea7788753517537afd762999cc4e0a93.gz new file mode 100644 index 0000000000..3d3d213909 Binary files /dev/null and b/_darcs/patches/20081120122709-84dde-3af930fcea7788753517537afd762999cc4e0a93.gz differ diff --git a/_darcs/patches/20081120123146-84dde-299808e2ed7a793a8240ab1c54e71b27f51307c4.gz b/_darcs/patches/20081120123146-84dde-299808e2ed7a793a8240ab1c54e71b27f51307c4.gz new file mode 100644 index 0000000000..cd971a915f Binary files /dev/null and b/_darcs/patches/20081120123146-84dde-299808e2ed7a793a8240ab1c54e71b27f51307c4.gz differ diff --git a/_darcs/patches/20081120142914-84dde-293e068ab92d9174bc270c35700809a1be9f19e1.gz b/_darcs/patches/20081120142914-84dde-293e068ab92d9174bc270c35700809a1be9f19e1.gz new file mode 100644 index 0000000000..f3586507d6 Binary files /dev/null and b/_darcs/patches/20081120142914-84dde-293e068ab92d9174bc270c35700809a1be9f19e1.gz differ diff --git a/_darcs/patches/20081120143045-84dde-aab1cead676f41ed0703d830e7d4a7a08a2b3568.gz b/_darcs/patches/20081120143045-84dde-aab1cead676f41ed0703d830e7d4a7a08a2b3568.gz new file mode 100644 index 0000000000..c0e6059b11 Binary files /dev/null and b/_darcs/patches/20081120143045-84dde-aab1cead676f41ed0703d830e7d4a7a08a2b3568.gz differ diff --git a/_darcs/patches/20081120143203-84dde-035efce34357338429aebb6dfbdd4da84810dc0f.gz b/_darcs/patches/20081120143203-84dde-035efce34357338429aebb6dfbdd4da84810dc0f.gz new file mode 100644 index 0000000000..bc1aeff985 Binary files /dev/null and b/_darcs/patches/20081120143203-84dde-035efce34357338429aebb6dfbdd4da84810dc0f.gz differ diff --git a/_darcs/patches/20081120143840-84dde-af7dd6ad2dd3b6d8181d9554b1866cabdfcb7285.gz b/_darcs/patches/20081120143840-84dde-af7dd6ad2dd3b6d8181d9554b1866cabdfcb7285.gz new file mode 100644 index 0000000000..82d6352105 Binary files /dev/null and b/_darcs/patches/20081120143840-84dde-af7dd6ad2dd3b6d8181d9554b1866cabdfcb7285.gz differ diff --git a/_darcs/patches/20081120144300-84dde-bb02bac8053dacb470eeb357cdd43007c361cc9a.gz b/_darcs/patches/20081120144300-84dde-bb02bac8053dacb470eeb357cdd43007c361cc9a.gz new file mode 100644 index 0000000000..5e9603555d Binary files /dev/null and b/_darcs/patches/20081120144300-84dde-bb02bac8053dacb470eeb357cdd43007c361cc9a.gz differ diff --git a/_darcs/patches/20081120145619-84dde-e9c2c367102090425800ca78e893772a5023560a.gz b/_darcs/patches/20081120145619-84dde-e9c2c367102090425800ca78e893772a5023560a.gz new file mode 100644 index 0000000000..df57368da2 Binary files /dev/null and b/_darcs/patches/20081120145619-84dde-e9c2c367102090425800ca78e893772a5023560a.gz differ diff --git a/_darcs/patches/20081120145814-84dde-f0d8fb0756935e16516778c521eb263064c5bd96.gz b/_darcs/patches/20081120145814-84dde-f0d8fb0756935e16516778c521eb263064c5bd96.gz new file mode 100644 index 0000000000..a91dede909 Binary files /dev/null and b/_darcs/patches/20081120145814-84dde-f0d8fb0756935e16516778c521eb263064c5bd96.gz differ diff --git a/_darcs/patches/20081120183722-84dde-8a8401fbcbb6abb60a8b36de249323586ea0b22c.gz b/_darcs/patches/20081120183722-84dde-8a8401fbcbb6abb60a8b36de249323586ea0b22c.gz new file mode 100644 index 0000000000..7a810b38ea Binary files /dev/null and b/_darcs/patches/20081120183722-84dde-8a8401fbcbb6abb60a8b36de249323586ea0b22c.gz differ diff --git a/_darcs/patches/20081120201502-84dde-ff65f1962ab94474cfafe8717ea6a9d7d9f302bd.gz b/_darcs/patches/20081120201502-84dde-ff65f1962ab94474cfafe8717ea6a9d7d9f302bd.gz new file mode 100644 index 0000000000..3ec86711f2 Binary files /dev/null and b/_darcs/patches/20081120201502-84dde-ff65f1962ab94474cfafe8717ea6a9d7d9f302bd.gz differ diff --git a/_darcs/patches/20081120202448-eefa4-e2d294d906b0ff90f9977606d18ea6655a944452.gz b/_darcs/patches/20081120202448-eefa4-e2d294d906b0ff90f9977606d18ea6655a944452.gz new file mode 100644 index 0000000000..37acc8f113 Binary files /dev/null and b/_darcs/patches/20081120202448-eefa4-e2d294d906b0ff90f9977606d18ea6655a944452.gz differ diff --git a/_darcs/patches/20081120203528-84dde-2b8d14a491ea4d44bebfdd4e4a3041dde3b375c1.gz b/_darcs/patches/20081120203528-84dde-2b8d14a491ea4d44bebfdd4e4a3041dde3b375c1.gz new file mode 100644 index 0000000000..c5c89feed9 Binary files /dev/null and b/_darcs/patches/20081120203528-84dde-2b8d14a491ea4d44bebfdd4e4a3041dde3b375c1.gz differ diff --git a/_darcs/patches/20081120204022-84dde-c238f7b51e43e81ce267ec65112f006f928676bf.gz b/_darcs/patches/20081120204022-84dde-c238f7b51e43e81ce267ec65112f006f928676bf.gz new file mode 100644 index 0000000000..3833da0d1d Binary files /dev/null and b/_darcs/patches/20081120204022-84dde-c238f7b51e43e81ce267ec65112f006f928676bf.gz differ diff --git a/_darcs/patches/20081120204147-84dde-2205d6b49262c8a89287331129a6ffb90622a3be.gz b/_darcs/patches/20081120204147-84dde-2205d6b49262c8a89287331129a6ffb90622a3be.gz new file mode 100644 index 0000000000..199df22a8e Binary files /dev/null and b/_darcs/patches/20081120204147-84dde-2205d6b49262c8a89287331129a6ffb90622a3be.gz differ diff --git a/_darcs/patches/20081120204347-84dde-5efd1a69aaecfa8c5cbde17b60017922a6888839.gz b/_darcs/patches/20081120204347-84dde-5efd1a69aaecfa8c5cbde17b60017922a6888839.gz new file mode 100644 index 0000000000..7298fcf94d Binary files /dev/null and b/_darcs/patches/20081120204347-84dde-5efd1a69aaecfa8c5cbde17b60017922a6888839.gz differ diff --git a/_darcs/patches/20081120204725-84dde-1b126328b7c5a62b59146824139dfff4914879cb.gz b/_darcs/patches/20081120204725-84dde-1b126328b7c5a62b59146824139dfff4914879cb.gz new file mode 100644 index 0000000000..67fc60f1ef Binary files /dev/null and b/_darcs/patches/20081120204725-84dde-1b126328b7c5a62b59146824139dfff4914879cb.gz differ diff --git a/_darcs/patches/20081120205319-84dde-c8ea8a1ae5e1e22c48fa89bd1b8f486345b3e13b.gz b/_darcs/patches/20081120205319-84dde-c8ea8a1ae5e1e22c48fa89bd1b8f486345b3e13b.gz new file mode 100644 index 0000000000..3b925bc984 Binary files /dev/null and b/_darcs/patches/20081120205319-84dde-c8ea8a1ae5e1e22c48fa89bd1b8f486345b3e13b.gz differ diff --git a/_darcs/patches/20081120205421-84dde-b41e50386ce3ec5f887c87cd83258c2e0e86f713.gz b/_darcs/patches/20081120205421-84dde-b41e50386ce3ec5f887c87cd83258c2e0e86f713.gz new file mode 100644 index 0000000000..1a51e27322 Binary files /dev/null and b/_darcs/patches/20081120205421-84dde-b41e50386ce3ec5f887c87cd83258c2e0e86f713.gz differ diff --git a/_darcs/patches/20081120205506-84dde-e9aa0a70d3529f91909dbe29f03a46b40ef18fff.gz b/_darcs/patches/20081120205506-84dde-e9aa0a70d3529f91909dbe29f03a46b40ef18fff.gz new file mode 100644 index 0000000000..f83e79556b Binary files /dev/null and b/_darcs/patches/20081120205506-84dde-e9aa0a70d3529f91909dbe29f03a46b40ef18fff.gz differ diff --git a/_darcs/patches/20081120210045-84dde-87d77f45937eca796477fb9e18ca84e31a5dfa3b.gz b/_darcs/patches/20081120210045-84dde-87d77f45937eca796477fb9e18ca84e31a5dfa3b.gz new file mode 100644 index 0000000000..fab7d49cef Binary files /dev/null and b/_darcs/patches/20081120210045-84dde-87d77f45937eca796477fb9e18ca84e31a5dfa3b.gz differ diff --git a/_darcs/patches/20081120211347-099f7-d5588788dcd9a16cf72ece59da3d2bf9b8171b85.gz b/_darcs/patches/20081120211347-099f7-d5588788dcd9a16cf72ece59da3d2bf9b8171b85.gz new file mode 100644 index 0000000000..2705e4f485 Binary files /dev/null and b/_darcs/patches/20081120211347-099f7-d5588788dcd9a16cf72ece59da3d2bf9b8171b85.gz differ diff --git a/_darcs/patches/20081120212142-7b5ce-9b0325c43a423de108b221325446969dc240d916.gz b/_darcs/patches/20081120212142-7b5ce-9b0325c43a423de108b221325446969dc240d916.gz new file mode 100644 index 0000000000..3f3e004251 Binary files /dev/null and b/_darcs/patches/20081120212142-7b5ce-9b0325c43a423de108b221325446969dc240d916.gz differ diff --git a/_darcs/patches/20081120213022-7b5ce-df10d289e8c0e1d06f6e10d5ff642eb93752be19.gz b/_darcs/patches/20081120213022-7b5ce-df10d289e8c0e1d06f6e10d5ff642eb93752be19.gz new file mode 100644 index 0000000000..9d00c8fe55 Binary files /dev/null and b/_darcs/patches/20081120213022-7b5ce-df10d289e8c0e1d06f6e10d5ff642eb93752be19.gz differ diff --git a/_darcs/patches/20081120214557-7b5ce-df1993ee7a761d109e9346d9817ead147d015962.gz b/_darcs/patches/20081120214557-7b5ce-df1993ee7a761d109e9346d9817ead147d015962.gz new file mode 100644 index 0000000000..fa35e15596 Binary files /dev/null and b/_darcs/patches/20081120214557-7b5ce-df1993ee7a761d109e9346d9817ead147d015962.gz differ diff --git a/_darcs/patches/20081120214821-84dde-c8569ef645b389de545f78bf01a270f28b871f02.gz b/_darcs/patches/20081120214821-84dde-c8569ef645b389de545f78bf01a270f28b871f02.gz new file mode 100644 index 0000000000..fb5babeb52 Binary files /dev/null and b/_darcs/patches/20081120214821-84dde-c8569ef645b389de545f78bf01a270f28b871f02.gz differ diff --git a/_darcs/patches/20081120214945-84dde-f15f2512f3998e7dd7bf7216ecc9ef0f5f37ea87.gz b/_darcs/patches/20081120214945-84dde-f15f2512f3998e7dd7bf7216ecc9ef0f5f37ea87.gz new file mode 100644 index 0000000000..f6bd53df49 Binary files /dev/null and b/_darcs/patches/20081120214945-84dde-f15f2512f3998e7dd7bf7216ecc9ef0f5f37ea87.gz differ diff --git a/_darcs/patches/20081120215041-099f7-db396a60755d551099122b58634b7550d5606d88.gz b/_darcs/patches/20081120215041-099f7-db396a60755d551099122b58634b7550d5606d88.gz new file mode 100644 index 0000000000..35026c2cc4 Binary files /dev/null and b/_darcs/patches/20081120215041-099f7-db396a60755d551099122b58634b7550d5606d88.gz differ diff --git a/_darcs/patches/20081120215222-84dde-340269eb99daff7815bb2e17a04341f603eef438.gz b/_darcs/patches/20081120215222-84dde-340269eb99daff7815bb2e17a04341f603eef438.gz new file mode 100644 index 0000000000..8d2cfb9b66 Binary files /dev/null and b/_darcs/patches/20081120215222-84dde-340269eb99daff7815bb2e17a04341f603eef438.gz differ diff --git a/_darcs/patches/20081120215508-84dde-1f38247dae1b196cbf2c32df4f2733e4cffa3ef6.gz b/_darcs/patches/20081120215508-84dde-1f38247dae1b196cbf2c32df4f2733e4cffa3ef6.gz new file mode 100644 index 0000000000..b7a9042bad Binary files /dev/null and b/_darcs/patches/20081120215508-84dde-1f38247dae1b196cbf2c32df4f2733e4cffa3ef6.gz differ diff --git a/_darcs/patches/20081120215751-84dde-8954f2dd5be0a333329d035a649676193c8844e9.gz b/_darcs/patches/20081120215751-84dde-8954f2dd5be0a333329d035a649676193c8844e9.gz new file mode 100644 index 0000000000..198fe02d97 Binary files /dev/null and b/_darcs/patches/20081120215751-84dde-8954f2dd5be0a333329d035a649676193c8844e9.gz differ diff --git a/_darcs/patches/20081120224207-84dde-3fe1c8936ca93fc8c65e9a9b4680e8a7b3dd38b8.gz b/_darcs/patches/20081120224207-84dde-3fe1c8936ca93fc8c65e9a9b4680e8a7b3dd38b8.gz new file mode 100644 index 0000000000..65f1c05442 Binary files /dev/null and b/_darcs/patches/20081120224207-84dde-3fe1c8936ca93fc8c65e9a9b4680e8a7b3dd38b8.gz differ diff --git a/_darcs/patches/20081120224429-84dde-e9f2abbb6dba5576f21ee02ca9e5371d468c9249.gz b/_darcs/patches/20081120224429-84dde-e9f2abbb6dba5576f21ee02ca9e5371d468c9249.gz new file mode 100644 index 0000000000..7907bd69fc Binary files /dev/null and b/_darcs/patches/20081120224429-84dde-e9f2abbb6dba5576f21ee02ca9e5371d468c9249.gz differ diff --git a/_darcs/patches/20081120224540-84dde-adc442888ce7e5faacffb062ed07b4508aed4538.gz b/_darcs/patches/20081120224540-84dde-adc442888ce7e5faacffb062ed07b4508aed4538.gz new file mode 100644 index 0000000000..ba61432c3f Binary files /dev/null and b/_darcs/patches/20081120224540-84dde-adc442888ce7e5faacffb062ed07b4508aed4538.gz differ diff --git a/_darcs/patches/20081120224708-84dde-2c259c12a3ac553f431430e016074e02ad5ae3b9.gz b/_darcs/patches/20081120224708-84dde-2c259c12a3ac553f431430e016074e02ad5ae3b9.gz new file mode 100644 index 0000000000..b7644fef10 Binary files /dev/null and b/_darcs/patches/20081120224708-84dde-2c259c12a3ac553f431430e016074e02ad5ae3b9.gz differ diff --git a/_darcs/patches/20081120224918-84dde-c964bdb77618d6a208efe581dd570b6ea1e23e7d.gz b/_darcs/patches/20081120224918-84dde-c964bdb77618d6a208efe581dd570b6ea1e23e7d.gz new file mode 100644 index 0000000000..8b5ae9eb6c Binary files /dev/null and b/_darcs/patches/20081120224918-84dde-c964bdb77618d6a208efe581dd570b6ea1e23e7d.gz differ diff --git a/_darcs/patches/20081120225137-84dde-03ae7562e67c825bb7bf29805d32a351f8b095c5.gz b/_darcs/patches/20081120225137-84dde-03ae7562e67c825bb7bf29805d32a351f8b095c5.gz new file mode 100644 index 0000000000..bf726efc63 Binary files /dev/null and b/_darcs/patches/20081120225137-84dde-03ae7562e67c825bb7bf29805d32a351f8b095c5.gz differ diff --git a/_darcs/patches/20081120225917-84dde-f9813a891a6547264817ed289b9899382abd8c60.gz b/_darcs/patches/20081120225917-84dde-f9813a891a6547264817ed289b9899382abd8c60.gz new file mode 100644 index 0000000000..ee08213112 Binary files /dev/null and b/_darcs/patches/20081120225917-84dde-f9813a891a6547264817ed289b9899382abd8c60.gz differ diff --git a/_darcs/patches/20081120232655-eefa4-cf6a71e246828793d3bfa413db724ab33bc58bcf.gz b/_darcs/patches/20081120232655-eefa4-cf6a71e246828793d3bfa413db724ab33bc58bcf.gz new file mode 100644 index 0000000000..076bc44729 Binary files /dev/null and b/_darcs/patches/20081120232655-eefa4-cf6a71e246828793d3bfa413db724ab33bc58bcf.gz differ diff --git a/_darcs/patches/20081120234923-eefa4-952f059fdda781d3f223a1f26af4741b59bb9421.gz b/_darcs/patches/20081120234923-eefa4-952f059fdda781d3f223a1f26af4741b59bb9421.gz new file mode 100644 index 0000000000..ecc8b09c67 Binary files /dev/null and b/_darcs/patches/20081120234923-eefa4-952f059fdda781d3f223a1f26af4741b59bb9421.gz differ diff --git a/_darcs/patches/20081120235752-eefa4-42e67140086035ae57c4db38aea48cabb0486d75.gz b/_darcs/patches/20081120235752-eefa4-42e67140086035ae57c4db38aea48cabb0486d75.gz new file mode 100644 index 0000000000..4797662c2f Binary files /dev/null and b/_darcs/patches/20081120235752-eefa4-42e67140086035ae57c4db38aea48cabb0486d75.gz differ diff --git a/_darcs/patches/20081121002038-84dde-2d9800f8c0ad3d22d13ca7b497f2914c9d9719fd.gz b/_darcs/patches/20081121002038-84dde-2d9800f8c0ad3d22d13ca7b497f2914c9d9719fd.gz new file mode 100644 index 0000000000..42d45a166c Binary files /dev/null and b/_darcs/patches/20081121002038-84dde-2d9800f8c0ad3d22d13ca7b497f2914c9d9719fd.gz differ diff --git a/_darcs/patches/20081121002402-84dde-867316d44fdc6ab363045540174b69297ea2f183.gz b/_darcs/patches/20081121002402-84dde-867316d44fdc6ab363045540174b69297ea2f183.gz new file mode 100644 index 0000000000..6422c86c24 Binary files /dev/null and b/_darcs/patches/20081121002402-84dde-867316d44fdc6ab363045540174b69297ea2f183.gz differ diff --git a/_darcs/patches/20081121003108-84dde-d305637fa58f6e7edb8bb79dfb7c721a16f8aeed.gz b/_darcs/patches/20081121003108-84dde-d305637fa58f6e7edb8bb79dfb7c721a16f8aeed.gz new file mode 100644 index 0000000000..af187ebfe3 Binary files /dev/null and b/_darcs/patches/20081121003108-84dde-d305637fa58f6e7edb8bb79dfb7c721a16f8aeed.gz differ diff --git a/_darcs/patches/20081121003338-84dde-45745ca353eb5a68627335115d2993fd15a38498.gz b/_darcs/patches/20081121003338-84dde-45745ca353eb5a68627335115d2993fd15a38498.gz new file mode 100644 index 0000000000..766e7378f1 Binary files /dev/null and b/_darcs/patches/20081121003338-84dde-45745ca353eb5a68627335115d2993fd15a38498.gz differ diff --git a/_darcs/patches/20081121003608-84dde-1bae74a9d4635423965c8f18a7555c2b0eab982e.gz b/_darcs/patches/20081121003608-84dde-1bae74a9d4635423965c8f18a7555c2b0eab982e.gz new file mode 100644 index 0000000000..663b4c8d14 Binary files /dev/null and b/_darcs/patches/20081121003608-84dde-1bae74a9d4635423965c8f18a7555c2b0eab982e.gz differ diff --git a/_darcs/patches/20081121003655-84dde-56051867f44c63546a972dd55d364e3dc43f799c.gz b/_darcs/patches/20081121003655-84dde-56051867f44c63546a972dd55d364e3dc43f799c.gz new file mode 100644 index 0000000000..7267841e30 Binary files /dev/null and b/_darcs/patches/20081121003655-84dde-56051867f44c63546a972dd55d364e3dc43f799c.gz differ diff --git a/_darcs/patches/20081121004336-84dde-8fc36b38b9f35d9058118efebd509098f6ce8230.gz b/_darcs/patches/20081121004336-84dde-8fc36b38b9f35d9058118efebd509098f6ce8230.gz new file mode 100644 index 0000000000..260be7eb3e Binary files /dev/null and b/_darcs/patches/20081121004336-84dde-8fc36b38b9f35d9058118efebd509098f6ce8230.gz differ diff --git a/_darcs/patches/20081121005216-84dde-5dea247b1c64f276cf2b2b5d3d6ce51ba3d9d615.gz b/_darcs/patches/20081121005216-84dde-5dea247b1c64f276cf2b2b5d3d6ce51ba3d9d615.gz new file mode 100644 index 0000000000..b058cbd401 Binary files /dev/null and b/_darcs/patches/20081121005216-84dde-5dea247b1c64f276cf2b2b5d3d6ce51ba3d9d615.gz differ diff --git a/_darcs/patches/20081121005338-7b5ce-1e2b30a5f7de6900cdc865246c1ed65d0dfe29f6.gz b/_darcs/patches/20081121005338-7b5ce-1e2b30a5f7de6900cdc865246c1ed65d0dfe29f6.gz new file mode 100644 index 0000000000..f666f71cae Binary files /dev/null and b/_darcs/patches/20081121005338-7b5ce-1e2b30a5f7de6900cdc865246c1ed65d0dfe29f6.gz differ diff --git a/_darcs/patches/20081121005631-84dde-2dbb716ef054bba7dfbdda3d0374c30718affd29.gz b/_darcs/patches/20081121005631-84dde-2dbb716ef054bba7dfbdda3d0374c30718affd29.gz new file mode 100644 index 0000000000..bb41d0aa54 Binary files /dev/null and b/_darcs/patches/20081121005631-84dde-2dbb716ef054bba7dfbdda3d0374c30718affd29.gz differ diff --git a/_darcs/patches/20081121023827-eefa4-ed91f63cac35c078dc385546a69209cbef2a0d5e.gz b/_darcs/patches/20081121023827-eefa4-ed91f63cac35c078dc385546a69209cbef2a0d5e.gz new file mode 100644 index 0000000000..ed91205a03 Binary files /dev/null and b/_darcs/patches/20081121023827-eefa4-ed91f63cac35c078dc385546a69209cbef2a0d5e.gz differ diff --git a/_darcs/patches/20081121025749-84dde-9fd9a98c23ecabd1c1615dec938edbd4be884aec.gz b/_darcs/patches/20081121025749-84dde-9fd9a98c23ecabd1c1615dec938edbd4be884aec.gz new file mode 100644 index 0000000000..0252c6f235 Binary files /dev/null and b/_darcs/patches/20081121025749-84dde-9fd9a98c23ecabd1c1615dec938edbd4be884aec.gz differ diff --git a/_darcs/patches/20081121031811-eefa4-80ec886c93a3357baffe332a5bf19214e8b64e93.gz b/_darcs/patches/20081121031811-eefa4-80ec886c93a3357baffe332a5bf19214e8b64e93.gz new file mode 100644 index 0000000000..13566bfafc Binary files /dev/null and b/_darcs/patches/20081121031811-eefa4-80ec886c93a3357baffe332a5bf19214e8b64e93.gz differ diff --git a/_darcs/patches/20081121153517-eefa4-66e38c8b447da35b616db156d73cdbb24871823d.gz b/_darcs/patches/20081121153517-eefa4-66e38c8b447da35b616db156d73cdbb24871823d.gz new file mode 100644 index 0000000000..0137077b2c Binary files /dev/null and b/_darcs/patches/20081121153517-eefa4-66e38c8b447da35b616db156d73cdbb24871823d.gz differ diff --git a/_darcs/patches/20081121154218-84dde-3c805fe52692950edd397ac184f68c09095419a7.gz b/_darcs/patches/20081121154218-84dde-3c805fe52692950edd397ac184f68c09095419a7.gz new file mode 100644 index 0000000000..fcb0fd5076 Binary files /dev/null and b/_darcs/patches/20081121154218-84dde-3c805fe52692950edd397ac184f68c09095419a7.gz differ diff --git a/_darcs/patches/20081121155829-eefa4-d7bfe7c9faf5d4464b017dea43806207883ad74e.gz b/_darcs/patches/20081121155829-eefa4-d7bfe7c9faf5d4464b017dea43806207883ad74e.gz new file mode 100644 index 0000000000..3074e993ad Binary files /dev/null and b/_darcs/patches/20081121155829-eefa4-d7bfe7c9faf5d4464b017dea43806207883ad74e.gz differ diff --git a/_darcs/patches/20081121160208-eefa4-33005f2d8c3e5e668c928f7c8425ac2731ed153b.gz b/_darcs/patches/20081121160208-eefa4-33005f2d8c3e5e668c928f7c8425ac2731ed153b.gz new file mode 100644 index 0000000000..9eb1635aa4 Binary files /dev/null and b/_darcs/patches/20081121160208-eefa4-33005f2d8c3e5e668c928f7c8425ac2731ed153b.gz differ diff --git a/_darcs/patches/20081121161645-eefa4-6e4af82adb69e89ada3fdd5eee8f02bc3aefeed1.gz b/_darcs/patches/20081121161645-eefa4-6e4af82adb69e89ada3fdd5eee8f02bc3aefeed1.gz new file mode 100644 index 0000000000..f7a27b8b2b Binary files /dev/null and b/_darcs/patches/20081121161645-eefa4-6e4af82adb69e89ada3fdd5eee8f02bc3aefeed1.gz differ diff --git a/_darcs/patches/20081121162600-84dde-c6223f113b55a83e98b4d761a4c29d2518e0079a.gz b/_darcs/patches/20081121162600-84dde-c6223f113b55a83e98b4d761a4c29d2518e0079a.gz new file mode 100644 index 0000000000..8479207177 Binary files /dev/null and b/_darcs/patches/20081121162600-84dde-c6223f113b55a83e98b4d761a4c29d2518e0079a.gz differ diff --git a/_darcs/patches/20081121162918-84dde-76a765414ccc036371cc747b6323a555df8fc6c4.gz b/_darcs/patches/20081121162918-84dde-76a765414ccc036371cc747b6323a555df8fc6c4.gz new file mode 100644 index 0000000000..57cf92f1bc Binary files /dev/null and b/_darcs/patches/20081121162918-84dde-76a765414ccc036371cc747b6323a555df8fc6c4.gz differ diff --git a/_darcs/patches/20081121184132-84dde-39d090e8bf82d10f3aa3a55ada3f4170c01e11d1.gz b/_darcs/patches/20081121184132-84dde-39d090e8bf82d10f3aa3a55ada3f4170c01e11d1.gz new file mode 100644 index 0000000000..cd51c7b6ff Binary files /dev/null and b/_darcs/patches/20081121184132-84dde-39d090e8bf82d10f3aa3a55ada3f4170c01e11d1.gz differ diff --git a/_darcs/patches/20081122043145-7b5ce-0fc4b2ed06e29437c54e3c2f1a64b6d0fbeb9058.gz b/_darcs/patches/20081122043145-7b5ce-0fc4b2ed06e29437c54e3c2f1a64b6d0fbeb9058.gz new file mode 100644 index 0000000000..ebc9acb335 Binary files /dev/null and b/_darcs/patches/20081122043145-7b5ce-0fc4b2ed06e29437c54e3c2f1a64b6d0fbeb9058.gz differ diff --git a/_darcs/patches/20081122124151-84dde-3e942c9ab172444bd28afb84a452b8bfb5e3574a.gz b/_darcs/patches/20081122124151-84dde-3e942c9ab172444bd28afb84a452b8bfb5e3574a.gz new file mode 100644 index 0000000000..89c8350325 Binary files /dev/null and b/_darcs/patches/20081122124151-84dde-3e942c9ab172444bd28afb84a452b8bfb5e3574a.gz differ diff --git a/_darcs/patches/20081122124235-84dde-680b2d2c8caff26d40dec4fe8e926a61668c47a0.gz b/_darcs/patches/20081122124235-84dde-680b2d2c8caff26d40dec4fe8e926a61668c47a0.gz new file mode 100644 index 0000000000..b233353ffa Binary files /dev/null and b/_darcs/patches/20081122124235-84dde-680b2d2c8caff26d40dec4fe8e926a61668c47a0.gz differ diff --git a/_darcs/patches/20081122163347-84dde-abb0dfc800f65f50951c5517af3bfda48013c6ed.gz b/_darcs/patches/20081122163347-84dde-abb0dfc800f65f50951c5517af3bfda48013c6ed.gz new file mode 100644 index 0000000000..153215c6c0 Binary files /dev/null and b/_darcs/patches/20081122163347-84dde-abb0dfc800f65f50951c5517af3bfda48013c6ed.gz differ diff --git a/_darcs/patches/20081122163552-84dde-9171c5e24ae90a430f2abd78437073656af9e5ec.gz b/_darcs/patches/20081122163552-84dde-9171c5e24ae90a430f2abd78437073656af9e5ec.gz new file mode 100644 index 0000000000..48af00a7b0 Binary files /dev/null and b/_darcs/patches/20081122163552-84dde-9171c5e24ae90a430f2abd78437073656af9e5ec.gz differ diff --git a/_darcs/patches/20081122165234-84dde-d9d6a608434502cb3d5fb09f04d0c641900c3134.gz b/_darcs/patches/20081122165234-84dde-d9d6a608434502cb3d5fb09f04d0c641900c3134.gz new file mode 100644 index 0000000000..f7904ed818 Binary files /dev/null and b/_darcs/patches/20081122165234-84dde-d9d6a608434502cb3d5fb09f04d0c641900c3134.gz differ diff --git a/_darcs/patches/20081122192857-84dde-c8fcddd794a8339a53e6a0224bd07f6f86ef3896.gz b/_darcs/patches/20081122192857-84dde-c8fcddd794a8339a53e6a0224bd07f6f86ef3896.gz new file mode 100644 index 0000000000..471392da61 Binary files /dev/null and b/_darcs/patches/20081122192857-84dde-c8fcddd794a8339a53e6a0224bd07f6f86ef3896.gz differ diff --git a/_darcs/patches/20081123014003-84dde-ea8f5d167a544617efb22bb0c553f18d718a65c6.gz b/_darcs/patches/20081123014003-84dde-ea8f5d167a544617efb22bb0c553f18d718a65c6.gz new file mode 100644 index 0000000000..f53f0fa377 Binary files /dev/null and b/_darcs/patches/20081123014003-84dde-ea8f5d167a544617efb22bb0c553f18d718a65c6.gz differ diff --git a/_darcs/patches/20081123015559-eefa4-5ce05e6e79236c6d5ebc87f0aa3ec4de51bae130.gz b/_darcs/patches/20081123015559-eefa4-5ce05e6e79236c6d5ebc87f0aa3ec4de51bae130.gz new file mode 100644 index 0000000000..372b97ef0d Binary files /dev/null and b/_darcs/patches/20081123015559-eefa4-5ce05e6e79236c6d5ebc87f0aa3ec4de51bae130.gz differ diff --git a/_darcs/patches/20081123022902-7b5ce-fbdd4e9a3df3e206caec0ca37c10a2e0a58cef85.gz b/_darcs/patches/20081123022902-7b5ce-fbdd4e9a3df3e206caec0ca37c10a2e0a58cef85.gz new file mode 100644 index 0000000000..5cf3c139f0 Binary files /dev/null and b/_darcs/patches/20081123022902-7b5ce-fbdd4e9a3df3e206caec0ca37c10a2e0a58cef85.gz differ diff --git a/_darcs/patches/20081123183613-7b5ce-9c6bd2b2efb679bce9f710f5f5ad9c48bf652e29.gz b/_darcs/patches/20081123183613-7b5ce-9c6bd2b2efb679bce9f710f5f5ad9c48bf652e29.gz new file mode 100644 index 0000000000..99e6df4794 Binary files /dev/null and b/_darcs/patches/20081123183613-7b5ce-9c6bd2b2efb679bce9f710f5f5ad9c48bf652e29.gz differ diff --git a/_darcs/patches/20081123185136-099f7-ca600dbdfff09762802e1cc58cf8777c45a24402.gz b/_darcs/patches/20081123185136-099f7-ca600dbdfff09762802e1cc58cf8777c45a24402.gz new file mode 100644 index 0000000000..3a5778e32d Binary files /dev/null and b/_darcs/patches/20081123185136-099f7-ca600dbdfff09762802e1cc58cf8777c45a24402.gz differ diff --git a/_darcs/patches/20081123190555-099f7-cd09b07e99355e2f61562324221840f869fea5bb.gz b/_darcs/patches/20081123190555-099f7-cd09b07e99355e2f61562324221840f869fea5bb.gz new file mode 100644 index 0000000000..e2dd774e34 Binary files /dev/null and b/_darcs/patches/20081123190555-099f7-cd09b07e99355e2f61562324221840f869fea5bb.gz differ diff --git a/_darcs/patches/20081123193727-7b5ce-0771232a9771e1325f937ccc87e6ba319dd97590.gz b/_darcs/patches/20081123193727-7b5ce-0771232a9771e1325f937ccc87e6ba319dd97590.gz new file mode 100644 index 0000000000..0d70ff2160 Binary files /dev/null and b/_darcs/patches/20081123193727-7b5ce-0771232a9771e1325f937ccc87e6ba319dd97590.gz differ diff --git a/_darcs/patches/20081123201616-099f7-54ac0134e38e145b99a81336ae0b51a8ecd560a8.gz b/_darcs/patches/20081123201616-099f7-54ac0134e38e145b99a81336ae0b51a8ecd560a8.gz new file mode 100644 index 0000000000..927d6fdd64 Binary files /dev/null and b/_darcs/patches/20081123201616-099f7-54ac0134e38e145b99a81336ae0b51a8ecd560a8.gz differ diff --git a/_darcs/patches/20081123211348-7b5ce-426c07ee1d1884c691b659e8a9b359bb95afc61e.gz b/_darcs/patches/20081123211348-7b5ce-426c07ee1d1884c691b659e8a9b359bb95afc61e.gz new file mode 100644 index 0000000000..e4d51c42e3 Binary files /dev/null and b/_darcs/patches/20081123211348-7b5ce-426c07ee1d1884c691b659e8a9b359bb95afc61e.gz differ diff --git a/_darcs/patches/20081123212532-7b5ce-0d5f6761f232975d721f02d16e90ad6d5dcf02d6.gz b/_darcs/patches/20081123212532-7b5ce-0d5f6761f232975d721f02d16e90ad6d5dcf02d6.gz new file mode 100644 index 0000000000..3068009125 Binary files /dev/null and b/_darcs/patches/20081123212532-7b5ce-0d5f6761f232975d721f02d16e90ad6d5dcf02d6.gz differ diff --git a/_darcs/patches/20081123213458-eefa4-51ef75c757915e5d4eb0dd69fcdcada3b0ccb150.gz b/_darcs/patches/20081123213458-eefa4-51ef75c757915e5d4eb0dd69fcdcada3b0ccb150.gz new file mode 100644 index 0000000000..c005cd3b45 Binary files /dev/null and b/_darcs/patches/20081123213458-eefa4-51ef75c757915e5d4eb0dd69fcdcada3b0ccb150.gz differ diff --git a/_darcs/patches/20081123215059-099f7-a0a969229b20fc01ca54f15b166333b3e5a32137.gz b/_darcs/patches/20081123215059-099f7-a0a969229b20fc01ca54f15b166333b3e5a32137.gz new file mode 100644 index 0000000000..05eb17ad7e Binary files /dev/null and b/_darcs/patches/20081123215059-099f7-a0a969229b20fc01ca54f15b166333b3e5a32137.gz differ diff --git a/_darcs/patches/20081124003240-84dde-aa4561e5e68b0ccc0598ac86294ea54f9be5775a.gz b/_darcs/patches/20081124003240-84dde-aa4561e5e68b0ccc0598ac86294ea54f9be5775a.gz new file mode 100644 index 0000000000..c55a47b435 Binary files /dev/null and b/_darcs/patches/20081124003240-84dde-aa4561e5e68b0ccc0598ac86294ea54f9be5775a.gz differ diff --git a/_darcs/patches/20081124005054-099f7-a7b20c1e15900e1c696a33902a6612b8be2387fa.gz b/_darcs/patches/20081124005054-099f7-a7b20c1e15900e1c696a33902a6612b8be2387fa.gz new file mode 100644 index 0000000000..f4aea42456 Binary files /dev/null and b/_darcs/patches/20081124005054-099f7-a7b20c1e15900e1c696a33902a6612b8be2387fa.gz differ diff --git a/_darcs/patches/20081124005402-099f7-00c1482cdb297db98d6419479afdd825d3494c89.gz b/_darcs/patches/20081124005402-099f7-00c1482cdb297db98d6419479afdd825d3494c89.gz new file mode 100644 index 0000000000..a98d6e5aac Binary files /dev/null and b/_darcs/patches/20081124005402-099f7-00c1482cdb297db98d6419479afdd825d3494c89.gz differ diff --git a/_darcs/patches/20081124013928-84dde-c5f08e23edcf6873af04bd7f0d8aa1b64cb5c902.gz b/_darcs/patches/20081124013928-84dde-c5f08e23edcf6873af04bd7f0d8aa1b64cb5c902.gz new file mode 100644 index 0000000000..52ff7e67c2 Binary files /dev/null and b/_darcs/patches/20081124013928-84dde-c5f08e23edcf6873af04bd7f0d8aa1b64cb5c902.gz differ diff --git a/_darcs/patches/20081124015802-84dde-d72651ff0c466d15835fe263e96bdd9b34162849.gz b/_darcs/patches/20081124015802-84dde-d72651ff0c466d15835fe263e96bdd9b34162849.gz new file mode 100644 index 0000000000..1ac360fc10 Binary files /dev/null and b/_darcs/patches/20081124015802-84dde-d72651ff0c466d15835fe263e96bdd9b34162849.gz differ diff --git a/_darcs/patches/20081124015927-84dde-525625c0341e62d3939879430743d0a976d0d8d2.gz b/_darcs/patches/20081124015927-84dde-525625c0341e62d3939879430743d0a976d0d8d2.gz new file mode 100644 index 0000000000..863e48ff65 Binary files /dev/null and b/_darcs/patches/20081124015927-84dde-525625c0341e62d3939879430743d0a976d0d8d2.gz differ diff --git a/_darcs/patches/20081124020029-84dde-2778ef961b5f900c7abe2cb18550f5e013b5579a.gz b/_darcs/patches/20081124020029-84dde-2778ef961b5f900c7abe2cb18550f5e013b5579a.gz new file mode 100644 index 0000000000..f2079e7469 Binary files /dev/null and b/_darcs/patches/20081124020029-84dde-2778ef961b5f900c7abe2cb18550f5e013b5579a.gz differ diff --git a/_darcs/patches/20081124023036-099f7-d2c32538e8a81170032ba0bc9fc5caf79e2b59a9.gz b/_darcs/patches/20081124023036-099f7-d2c32538e8a81170032ba0bc9fc5caf79e2b59a9.gz new file mode 100644 index 0000000000..f78bdc5a99 Binary files /dev/null and b/_darcs/patches/20081124023036-099f7-d2c32538e8a81170032ba0bc9fc5caf79e2b59a9.gz differ diff --git a/_darcs/patches/20081124024434-84dde-e68f54652c2d0dfb802b1abcafba53556c1f057a.gz b/_darcs/patches/20081124024434-84dde-e68f54652c2d0dfb802b1abcafba53556c1f057a.gz new file mode 100644 index 0000000000..63fd05fe6d Binary files /dev/null and b/_darcs/patches/20081124024434-84dde-e68f54652c2d0dfb802b1abcafba53556c1f057a.gz differ diff --git a/_darcs/patches/20081124025308-eefa4-b4523d386c1dd36d4856949abba1dc8bd8099da0.gz b/_darcs/patches/20081124025308-eefa4-b4523d386c1dd36d4856949abba1dc8bd8099da0.gz new file mode 100644 index 0000000000..f99064b8bf Binary files /dev/null and b/_darcs/patches/20081124025308-eefa4-b4523d386c1dd36d4856949abba1dc8bd8099da0.gz differ diff --git a/_darcs/patches/20081124031549-84dde-c537cb25f301ac3368440d4d5f583ea3d713ac2c.gz b/_darcs/patches/20081124031549-84dde-c537cb25f301ac3368440d4d5f583ea3d713ac2c.gz new file mode 100644 index 0000000000..ee91a6a4b9 Binary files /dev/null and b/_darcs/patches/20081124031549-84dde-c537cb25f301ac3368440d4d5f583ea3d713ac2c.gz differ diff --git a/_darcs/patches/20081124033659-099f7-65aea696c71be9bcc71b0b507d14fd2a645608b2.gz b/_darcs/patches/20081124033659-099f7-65aea696c71be9bcc71b0b507d14fd2a645608b2.gz new file mode 100644 index 0000000000..ec7258bba8 Binary files /dev/null and b/_darcs/patches/20081124033659-099f7-65aea696c71be9bcc71b0b507d14fd2a645608b2.gz differ diff --git a/_darcs/patches/20081124034952-84dde-e059f0800780de879ffa922e5ce379682a4f275a.gz b/_darcs/patches/20081124034952-84dde-e059f0800780de879ffa922e5ce379682a4f275a.gz new file mode 100644 index 0000000000..16ecf6e995 Binary files /dev/null and b/_darcs/patches/20081124034952-84dde-e059f0800780de879ffa922e5ce379682a4f275a.gz differ diff --git a/_darcs/patches/20081124035814-84dde-a0ccc1b19cd1dc1d3fed16d2dbe3ac712a0a986b.gz b/_darcs/patches/20081124035814-84dde-a0ccc1b19cd1dc1d3fed16d2dbe3ac712a0a986b.gz new file mode 100644 index 0000000000..71862a22ff Binary files /dev/null and b/_darcs/patches/20081124035814-84dde-a0ccc1b19cd1dc1d3fed16d2dbe3ac712a0a986b.gz differ diff --git a/_darcs/patches/20081124040224-84dde-ca5e732949bf2f837b4d99f7fe705f0fd74b9a48.gz b/_darcs/patches/20081124040224-84dde-ca5e732949bf2f837b4d99f7fe705f0fd74b9a48.gz new file mode 100644 index 0000000000..d1425f968b Binary files /dev/null and b/_darcs/patches/20081124040224-84dde-ca5e732949bf2f837b4d99f7fe705f0fd74b9a48.gz differ diff --git a/_darcs/patches/20081124041832-7b5ce-5b127b4a2c556d5083f0030341556478cc8fb875.gz b/_darcs/patches/20081124041832-7b5ce-5b127b4a2c556d5083f0030341556478cc8fb875.gz new file mode 100644 index 0000000000..d00238eaba Binary files /dev/null and b/_darcs/patches/20081124041832-7b5ce-5b127b4a2c556d5083f0030341556478cc8fb875.gz differ diff --git a/_darcs/patches/20081124043723-84dde-289b6415c59eb6955d0a8d3c74bbbdb225b01a02.gz b/_darcs/patches/20081124043723-84dde-289b6415c59eb6955d0a8d3c74bbbdb225b01a02.gz new file mode 100644 index 0000000000..45f7eeee35 Binary files /dev/null and b/_darcs/patches/20081124043723-84dde-289b6415c59eb6955d0a8d3c74bbbdb225b01a02.gz differ diff --git a/_darcs/patches/20081124044435-099f7-9d7413f0eb27d20dc1bbf912ffd9eccaec17422a.gz b/_darcs/patches/20081124044435-099f7-9d7413f0eb27d20dc1bbf912ffd9eccaec17422a.gz new file mode 100644 index 0000000000..10b1ae5970 Binary files /dev/null and b/_darcs/patches/20081124044435-099f7-9d7413f0eb27d20dc1bbf912ffd9eccaec17422a.gz differ diff --git a/_darcs/patches/20081124045319-eefa4-58036c236467323d7437ad7d88ce7b7b0552d266.gz b/_darcs/patches/20081124045319-eefa4-58036c236467323d7437ad7d88ce7b7b0552d266.gz new file mode 100644 index 0000000000..14e94e400b Binary files /dev/null and b/_darcs/patches/20081124045319-eefa4-58036c236467323d7437ad7d88ce7b7b0552d266.gz differ diff --git a/_darcs/patches/20081124045924-5ed1f-2a8c374362334914fe37aad1fc8be2a661d54675.gz b/_darcs/patches/20081124045924-5ed1f-2a8c374362334914fe37aad1fc8be2a661d54675.gz new file mode 100644 index 0000000000..5df3e9228e Binary files /dev/null and b/_darcs/patches/20081124045924-5ed1f-2a8c374362334914fe37aad1fc8be2a661d54675.gz differ diff --git a/_darcs/patches/20081124050037-099f7-6a9675c51df88ee416f34b5c93ba4568462dd99f.gz b/_darcs/patches/20081124050037-099f7-6a9675c51df88ee416f34b5c93ba4568462dd99f.gz new file mode 100644 index 0000000000..2a2278c549 Binary files /dev/null and b/_darcs/patches/20081124050037-099f7-6a9675c51df88ee416f34b5c93ba4568462dd99f.gz differ diff --git a/_darcs/patches/20081124050556-099f7-3f0df19cfc3ecbf128cfff6db6f364110eff61d9.gz b/_darcs/patches/20081124050556-099f7-3f0df19cfc3ecbf128cfff6db6f364110eff61d9.gz new file mode 100644 index 0000000000..9d07975bb7 Binary files /dev/null and b/_darcs/patches/20081124050556-099f7-3f0df19cfc3ecbf128cfff6db6f364110eff61d9.gz differ diff --git a/_darcs/patches/20081124051429-5ed1f-f47de55517ac9762ad6f1b7520c758359b0958bc.gz b/_darcs/patches/20081124051429-5ed1f-f47de55517ac9762ad6f1b7520c758359b0958bc.gz new file mode 100644 index 0000000000..fff4242d3a Binary files /dev/null and b/_darcs/patches/20081124051429-5ed1f-f47de55517ac9762ad6f1b7520c758359b0958bc.gz differ diff --git a/_darcs/patches/20081124052230-eefa4-0b17fc8872d7f4cc765fc4f3fd6abd3288120c08.gz b/_darcs/patches/20081124052230-eefa4-0b17fc8872d7f4cc765fc4f3fd6abd3288120c08.gz new file mode 100644 index 0000000000..6625f7179b Binary files /dev/null and b/_darcs/patches/20081124052230-eefa4-0b17fc8872d7f4cc765fc4f3fd6abd3288120c08.gz differ diff --git a/_darcs/patches/20081124052250-5ed1f-158956ba8a735e5bfe4f7199c17596e13357cf5f.gz b/_darcs/patches/20081124052250-5ed1f-158956ba8a735e5bfe4f7199c17596e13357cf5f.gz new file mode 100644 index 0000000000..b2ef51d269 Binary files /dev/null and b/_darcs/patches/20081124052250-5ed1f-158956ba8a735e5bfe4f7199c17596e13357cf5f.gz differ diff --git a/_darcs/patches/20081124052429-5ed1f-0244f7dce1285a57198d87c6b11d906968193d64.gz b/_darcs/patches/20081124052429-5ed1f-0244f7dce1285a57198d87c6b11d906968193d64.gz new file mode 100644 index 0000000000..63bed6c390 Binary files /dev/null and b/_darcs/patches/20081124052429-5ed1f-0244f7dce1285a57198d87c6b11d906968193d64.gz differ diff --git a/_darcs/patches/20081124053237-5ed1f-aa6deee920c77d0084373ecb9605b6370139284b.gz b/_darcs/patches/20081124053237-5ed1f-aa6deee920c77d0084373ecb9605b6370139284b.gz new file mode 100644 index 0000000000..e3e754d562 Binary files /dev/null and b/_darcs/patches/20081124053237-5ed1f-aa6deee920c77d0084373ecb9605b6370139284b.gz differ diff --git a/_darcs/patches/20081124053335-34904-1e8a1fe43c30f5b9c13bf58654f1af5f894d1501.gz b/_darcs/patches/20081124053335-34904-1e8a1fe43c30f5b9c13bf58654f1af5f894d1501.gz new file mode 100644 index 0000000000..042dbc7c31 Binary files /dev/null and b/_darcs/patches/20081124053335-34904-1e8a1fe43c30f5b9c13bf58654f1af5f894d1501.gz differ diff --git a/_darcs/patches/20081124053341-099f7-46d7061034668e06e13626cada88a1a6ac87e163.gz b/_darcs/patches/20081124053341-099f7-46d7061034668e06e13626cada88a1a6ac87e163.gz new file mode 100644 index 0000000000..86005f5b6f Binary files /dev/null and b/_darcs/patches/20081124053341-099f7-46d7061034668e06e13626cada88a1a6ac87e163.gz differ diff --git a/_darcs/patches/20081124150638-5ed1f-994af62567660c7f09985bf449a344df104548eb.gz b/_darcs/patches/20081124150638-5ed1f-994af62567660c7f09985bf449a344df104548eb.gz new file mode 100644 index 0000000000..5d43da5772 Binary files /dev/null and b/_darcs/patches/20081124150638-5ed1f-994af62567660c7f09985bf449a344df104548eb.gz differ diff --git a/_darcs/patches/20081124183054-5ed1f-653824bb6345aecfe5dbc6d3e3b8ad0df9194b42.gz b/_darcs/patches/20081124183054-5ed1f-653824bb6345aecfe5dbc6d3e3b8ad0df9194b42.gz new file mode 100644 index 0000000000..ca136e5a69 Binary files /dev/null and b/_darcs/patches/20081124183054-5ed1f-653824bb6345aecfe5dbc6d3e3b8ad0df9194b42.gz differ diff --git a/_darcs/patches/20081124223533-5ed1f-1ae78e694043cef14d528dcd4201301eec8ad61b.gz b/_darcs/patches/20081124223533-5ed1f-1ae78e694043cef14d528dcd4201301eec8ad61b.gz new file mode 100644 index 0000000000..e08c392923 Binary files /dev/null and b/_darcs/patches/20081124223533-5ed1f-1ae78e694043cef14d528dcd4201301eec8ad61b.gz differ diff --git a/_darcs/patches/20081124223733-5ed1f-48a17c80c49f5d35b1f45b113b863913cdd703ae.gz b/_darcs/patches/20081124223733-5ed1f-48a17c80c49f5d35b1f45b113b863913cdd703ae.gz new file mode 100644 index 0000000000..1bf814d6c9 Binary files /dev/null and b/_darcs/patches/20081124223733-5ed1f-48a17c80c49f5d35b1f45b113b863913cdd703ae.gz differ diff --git a/_darcs/patches/20081124223848-5ed1f-754db592b88dfc577370c77415ae1c96e09a188a.gz b/_darcs/patches/20081124223848-5ed1f-754db592b88dfc577370c77415ae1c96e09a188a.gz new file mode 100644 index 0000000000..669320a945 Binary files /dev/null and b/_darcs/patches/20081124223848-5ed1f-754db592b88dfc577370c77415ae1c96e09a188a.gz differ diff --git a/_darcs/patches/20081124234115-5ed1f-4a136027fddd625c39f14b5ec2e3e9d0fd0a6b3b.gz b/_darcs/patches/20081124234115-5ed1f-4a136027fddd625c39f14b5ec2e3e9d0fd0a6b3b.gz new file mode 100644 index 0000000000..031adca6df Binary files /dev/null and b/_darcs/patches/20081124234115-5ed1f-4a136027fddd625c39f14b5ec2e3e9d0fd0a6b3b.gz differ diff --git a/_darcs/patches/20081125000556-5ed1f-d19f3a1e723695122a8e75fb881846bcbc48ebda.gz b/_darcs/patches/20081125000556-5ed1f-d19f3a1e723695122a8e75fb881846bcbc48ebda.gz new file mode 100644 index 0000000000..09c1f00e89 Binary files /dev/null and b/_darcs/patches/20081125000556-5ed1f-d19f3a1e723695122a8e75fb881846bcbc48ebda.gz differ diff --git a/_darcs/patches/20081125010332-099f7-f851f7c6217a1a2c65cd0f8ca28a9b6eb8c19764.gz b/_darcs/patches/20081125010332-099f7-f851f7c6217a1a2c65cd0f8ca28a9b6eb8c19764.gz new file mode 100644 index 0000000000..11852117a8 Binary files /dev/null and b/_darcs/patches/20081125010332-099f7-f851f7c6217a1a2c65cd0f8ca28a9b6eb8c19764.gz differ diff --git a/_darcs/patches/20081125010516-099f7-626c76d9f09efee56a713518a32b0f8e89670dd1.gz b/_darcs/patches/20081125010516-099f7-626c76d9f09efee56a713518a32b0f8e89670dd1.gz new file mode 100644 index 0000000000..8f474f28f1 Binary files /dev/null and b/_darcs/patches/20081125010516-099f7-626c76d9f09efee56a713518a32b0f8e89670dd1.gz differ diff --git a/_darcs/patches/20081126182317-eefa4-837600d917ec3fbe4c806fb2c5fad2daff0713cb.gz b/_darcs/patches/20081126182317-eefa4-837600d917ec3fbe4c806fb2c5fad2daff0713cb.gz new file mode 100644 index 0000000000..6583ea2df4 Binary files /dev/null and b/_darcs/patches/20081126182317-eefa4-837600d917ec3fbe4c806fb2c5fad2daff0713cb.gz differ diff --git a/_darcs/patches/20081127162551-5ed1f-7ccfe9c5d84149c5d5aa507e70d555003c200b39.gz b/_darcs/patches/20081127162551-5ed1f-7ccfe9c5d84149c5d5aa507e70d555003c200b39.gz new file mode 100644 index 0000000000..cf9aeaf363 Binary files /dev/null and b/_darcs/patches/20081127162551-5ed1f-7ccfe9c5d84149c5d5aa507e70d555003c200b39.gz differ diff --git a/_darcs/patches/20081127162720-5ed1f-3962aa9b288ab8aedf81c2c7c743147f3cf3122b.gz b/_darcs/patches/20081127162720-5ed1f-3962aa9b288ab8aedf81c2c7c743147f3cf3122b.gz new file mode 100644 index 0000000000..9a68a4e218 Binary files /dev/null and b/_darcs/patches/20081127162720-5ed1f-3962aa9b288ab8aedf81c2c7c743147f3cf3122b.gz differ diff --git a/_darcs/patches/20081127162805-5ed1f-0342777b88a70a734c4cdd35cbece8c37d83407a.gz b/_darcs/patches/20081127162805-5ed1f-0342777b88a70a734c4cdd35cbece8c37d83407a.gz new file mode 100644 index 0000000000..d44e31e899 Binary files /dev/null and b/_darcs/patches/20081127162805-5ed1f-0342777b88a70a734c4cdd35cbece8c37d83407a.gz differ diff --git a/_darcs/patches/20081128200004-099f7-085c833e3e34b2a13b5b3ec3b1316e7948ff196f.gz b/_darcs/patches/20081128200004-099f7-085c833e3e34b2a13b5b3ec3b1316e7948ff196f.gz new file mode 100644 index 0000000000..36c29e98da Binary files /dev/null and b/_darcs/patches/20081128200004-099f7-085c833e3e34b2a13b5b3ec3b1316e7948ff196f.gz differ diff --git a/_darcs/patches/20081128210114-099f7-4e4cde0a983c2ac6d41efb59b46cb7dbf45dc7a6.gz b/_darcs/patches/20081128210114-099f7-4e4cde0a983c2ac6d41efb59b46cb7dbf45dc7a6.gz new file mode 100644 index 0000000000..291c01d592 Binary files /dev/null and b/_darcs/patches/20081128210114-099f7-4e4cde0a983c2ac6d41efb59b46cb7dbf45dc7a6.gz differ diff --git a/_darcs/patches/20081128223646-099f7-79b7c961b4494ff7430bd3c0a0f4742888098ede.gz b/_darcs/patches/20081128223646-099f7-79b7c961b4494ff7430bd3c0a0f4742888098ede.gz new file mode 100644 index 0000000000..225dc2d4a4 Binary files /dev/null and b/_darcs/patches/20081128223646-099f7-79b7c961b4494ff7430bd3c0a0f4742888098ede.gz differ diff --git a/_darcs/patches/20081129012446-099f7-e2d0398dc22fc3e83398920f46da6cf1691544b3.gz b/_darcs/patches/20081129012446-099f7-e2d0398dc22fc3e83398920f46da6cf1691544b3.gz new file mode 100644 index 0000000000..5edc05af6c Binary files /dev/null and b/_darcs/patches/20081129012446-099f7-e2d0398dc22fc3e83398920f46da6cf1691544b3.gz differ diff --git a/_darcs/patches/20081129233637-5ed1f-2f428e859daebe6e1e68a9ce2c5fa7f5de12d2fb.gz b/_darcs/patches/20081129233637-5ed1f-2f428e859daebe6e1e68a9ce2c5fa7f5de12d2fb.gz new file mode 100644 index 0000000000..2b48e6dd53 Binary files /dev/null and b/_darcs/patches/20081129233637-5ed1f-2f428e859daebe6e1e68a9ce2c5fa7f5de12d2fb.gz differ diff --git a/_darcs/patches/20081130213755-5ed1f-bfece58a97ae85f959eb27a38d9bbb622e178793.gz b/_darcs/patches/20081130213755-5ed1f-bfece58a97ae85f959eb27a38d9bbb622e178793.gz new file mode 100644 index 0000000000..2b54a4be7f Binary files /dev/null and b/_darcs/patches/20081130213755-5ed1f-bfece58a97ae85f959eb27a38d9bbb622e178793.gz differ diff --git a/_darcs/patches/20081130231627-5ed1f-7ee35664bf6cf3a35157bd861016a1210dfca79c.gz b/_darcs/patches/20081130231627-5ed1f-7ee35664bf6cf3a35157bd861016a1210dfca79c.gz new file mode 100644 index 0000000000..edf7d9950c Binary files /dev/null and b/_darcs/patches/20081130231627-5ed1f-7ee35664bf6cf3a35157bd861016a1210dfca79c.gz differ diff --git a/_darcs/patches/20081201175028-eefa4-f67a2bd15bf052d62c36b1ff666f37ca98983f31.gz b/_darcs/patches/20081201175028-eefa4-f67a2bd15bf052d62c36b1ff666f37ca98983f31.gz new file mode 100644 index 0000000000..e325013e45 Binary files /dev/null and b/_darcs/patches/20081201175028-eefa4-f67a2bd15bf052d62c36b1ff666f37ca98983f31.gz differ diff --git a/_darcs/patches/20081202034736-5ed1f-e096ab5e9a77d2bb74c949659966d400cbc9a149.gz b/_darcs/patches/20081202034736-5ed1f-e096ab5e9a77d2bb74c949659966d400cbc9a149.gz new file mode 100644 index 0000000000..d98b9ed69a Binary files /dev/null and b/_darcs/patches/20081202034736-5ed1f-e096ab5e9a77d2bb74c949659966d400cbc9a149.gz differ diff --git a/_darcs/patches/20081202040549-5ed1f-b23a6b80b6e1823a97a7b446d9c4e59f8744b904.gz b/_darcs/patches/20081202040549-5ed1f-b23a6b80b6e1823a97a7b446d9c4e59f8744b904.gz new file mode 100644 index 0000000000..8f0129a276 Binary files /dev/null and b/_darcs/patches/20081202040549-5ed1f-b23a6b80b6e1823a97a7b446d9c4e59f8744b904.gz differ diff --git a/_darcs/patches/20081202041243-5ed1f-7f30aeaa43160bddacc7d5300627964417aff3ec.gz b/_darcs/patches/20081202041243-5ed1f-7f30aeaa43160bddacc7d5300627964417aff3ec.gz new file mode 100644 index 0000000000..81b44b445c Binary files /dev/null and b/_darcs/patches/20081202041243-5ed1f-7f30aeaa43160bddacc7d5300627964417aff3ec.gz differ diff --git a/_darcs/patches/20081202041508-5ed1f-d54be6a7ec9aedebf10b813ee7e102c0c053f6cf.gz b/_darcs/patches/20081202041508-5ed1f-d54be6a7ec9aedebf10b813ee7e102c0c053f6cf.gz new file mode 100644 index 0000000000..a098961a7a Binary files /dev/null and b/_darcs/patches/20081202041508-5ed1f-d54be6a7ec9aedebf10b813ee7e102c0c053f6cf.gz differ diff --git a/_darcs/patches/20081202041532-5ed1f-8c392967eb14d726bc1b761a39c6dce0097879c0.gz b/_darcs/patches/20081202041532-5ed1f-8c392967eb14d726bc1b761a39c6dce0097879c0.gz new file mode 100644 index 0000000000..e8dea14984 Binary files /dev/null and b/_darcs/patches/20081202041532-5ed1f-8c392967eb14d726bc1b761a39c6dce0097879c0.gz differ diff --git a/_darcs/patches/20081202042159-5ed1f-16cbaa0253b6b60033bf842dff88b097a41ea328.gz b/_darcs/patches/20081202042159-5ed1f-16cbaa0253b6b60033bf842dff88b097a41ea328.gz new file mode 100644 index 0000000000..7e13727842 Binary files /dev/null and b/_darcs/patches/20081202042159-5ed1f-16cbaa0253b6b60033bf842dff88b097a41ea328.gz differ diff --git a/_darcs/patches/20081202042334-5ed1f-47957bc0ad54d0250a0638b4e6e5a200dac1d335.gz b/_darcs/patches/20081202042334-5ed1f-47957bc0ad54d0250a0638b4e6e5a200dac1d335.gz new file mode 100644 index 0000000000..59e9ac6905 Binary files /dev/null and b/_darcs/patches/20081202042334-5ed1f-47957bc0ad54d0250a0638b4e6e5a200dac1d335.gz differ diff --git a/_darcs/patches/20081202044211-5ed1f-d8779be7681fc21eebff3c0c56fdde892c2fa3da.gz b/_darcs/patches/20081202044211-5ed1f-d8779be7681fc21eebff3c0c56fdde892c2fa3da.gz new file mode 100644 index 0000000000..e50980cf15 Binary files /dev/null and b/_darcs/patches/20081202044211-5ed1f-d8779be7681fc21eebff3c0c56fdde892c2fa3da.gz differ diff --git a/_darcs/patches/20081202044441-5ed1f-63025fde108bff917253995f448f841160c8e394.gz b/_darcs/patches/20081202044441-5ed1f-63025fde108bff917253995f448f841160c8e394.gz new file mode 100644 index 0000000000..0c1caa129d Binary files /dev/null and b/_darcs/patches/20081202044441-5ed1f-63025fde108bff917253995f448f841160c8e394.gz differ diff --git a/_darcs/patches/20081202045021-5ed1f-ca0f14051507602bab8898e1e99d9cdb69f2eadc.gz b/_darcs/patches/20081202045021-5ed1f-ca0f14051507602bab8898e1e99d9cdb69f2eadc.gz new file mode 100644 index 0000000000..9a2e5699c6 Binary files /dev/null and b/_darcs/patches/20081202045021-5ed1f-ca0f14051507602bab8898e1e99d9cdb69f2eadc.gz differ diff --git a/_darcs/patches/20081202045320-5ed1f-583091191425d10b695107ddc2e1a5e72b60130d.gz b/_darcs/patches/20081202045320-5ed1f-583091191425d10b695107ddc2e1a5e72b60130d.gz new file mode 100644 index 0000000000..ca8ad4f8f4 Binary files /dev/null and b/_darcs/patches/20081202045320-5ed1f-583091191425d10b695107ddc2e1a5e72b60130d.gz differ diff --git a/_darcs/patches/20081202045544-5ed1f-ac8df1a1c8ae9b2cd72e952144a8c2cb001868c4.gz b/_darcs/patches/20081202045544-5ed1f-ac8df1a1c8ae9b2cd72e952144a8c2cb001868c4.gz new file mode 100644 index 0000000000..ee795cceef Binary files /dev/null and b/_darcs/patches/20081202045544-5ed1f-ac8df1a1c8ae9b2cd72e952144a8c2cb001868c4.gz differ diff --git a/_darcs/patches/20081202045825-5ed1f-5bbbf3954610442bdd123f720b1c85ec85c4449e.gz b/_darcs/patches/20081202045825-5ed1f-5bbbf3954610442bdd123f720b1c85ec85c4449e.gz new file mode 100644 index 0000000000..6ba74ba184 Binary files /dev/null and b/_darcs/patches/20081202045825-5ed1f-5bbbf3954610442bdd123f720b1c85ec85c4449e.gz differ diff --git a/_darcs/patches/20081202045856-5ed1f-3b14fafd709eb5f4e1c4ea74bce067a1429f03d7.gz b/_darcs/patches/20081202045856-5ed1f-3b14fafd709eb5f4e1c4ea74bce067a1429f03d7.gz new file mode 100644 index 0000000000..683754bdc3 Binary files /dev/null and b/_darcs/patches/20081202045856-5ed1f-3b14fafd709eb5f4e1c4ea74bce067a1429f03d7.gz differ diff --git a/_darcs/patches/20081202050200-5ed1f-1ba5a3573e2276eac22a018ce26cc76b1ed7275f.gz b/_darcs/patches/20081202050200-5ed1f-1ba5a3573e2276eac22a018ce26cc76b1ed7275f.gz new file mode 100644 index 0000000000..f68b0f909b Binary files /dev/null and b/_darcs/patches/20081202050200-5ed1f-1ba5a3573e2276eac22a018ce26cc76b1ed7275f.gz differ diff --git a/_darcs/patches/20081202184258-5ed1f-cd87ea5c528ea0c90cb31eeb59d4d1ba4f85e9ad.gz b/_darcs/patches/20081202184258-5ed1f-cd87ea5c528ea0c90cb31eeb59d4d1ba4f85e9ad.gz new file mode 100644 index 0000000000..4870e9587c Binary files /dev/null and b/_darcs/patches/20081202184258-5ed1f-cd87ea5c528ea0c90cb31eeb59d4d1ba4f85e9ad.gz differ diff --git a/_darcs/patches/20081202185343-5ed1f-99c314aac9e59ddbddd59ee403d4111c3639aa98.gz b/_darcs/patches/20081202185343-5ed1f-99c314aac9e59ddbddd59ee403d4111c3639aa98.gz new file mode 100644 index 0000000000..7eee105f19 Binary files /dev/null and b/_darcs/patches/20081202185343-5ed1f-99c314aac9e59ddbddd59ee403d4111c3639aa98.gz differ diff --git a/_darcs/patches/20081202185444-5ed1f-a84761dfb4ffb40d6e90c79d92dcd4b029745300.gz b/_darcs/patches/20081202185444-5ed1f-a84761dfb4ffb40d6e90c79d92dcd4b029745300.gz new file mode 100644 index 0000000000..28356607b6 Binary files /dev/null and b/_darcs/patches/20081202185444-5ed1f-a84761dfb4ffb40d6e90c79d92dcd4b029745300.gz differ diff --git a/_darcs/patches/20081202193857-5ed1f-1705c3f615b96790dcae30ec240c25721ea443cc.gz b/_darcs/patches/20081202193857-5ed1f-1705c3f615b96790dcae30ec240c25721ea443cc.gz new file mode 100644 index 0000000000..01b8f4255b Binary files /dev/null and b/_darcs/patches/20081202193857-5ed1f-1705c3f615b96790dcae30ec240c25721ea443cc.gz differ diff --git a/_darcs/patches/20081202194027-5ed1f-5ebbc762496b6f6675a98271acbdd1851439471b.gz b/_darcs/patches/20081202194027-5ed1f-5ebbc762496b6f6675a98271acbdd1851439471b.gz new file mode 100644 index 0000000000..e9b76a5259 Binary files /dev/null and b/_darcs/patches/20081202194027-5ed1f-5ebbc762496b6f6675a98271acbdd1851439471b.gz differ diff --git a/_darcs/patches/20081202194043-5ed1f-35ee3a57c08febe282082d829063489b51a8fb96.gz b/_darcs/patches/20081202194043-5ed1f-35ee3a57c08febe282082d829063489b51a8fb96.gz new file mode 100644 index 0000000000..2487fc0b8b Binary files /dev/null and b/_darcs/patches/20081202194043-5ed1f-35ee3a57c08febe282082d829063489b51a8fb96.gz differ diff --git a/_darcs/patches/20081202194633-5ed1f-ebf0c5f54f4080dc70489d58777ad66d4f1b9bc8.gz b/_darcs/patches/20081202194633-5ed1f-ebf0c5f54f4080dc70489d58777ad66d4f1b9bc8.gz new file mode 100644 index 0000000000..96f45461b7 Binary files /dev/null and b/_darcs/patches/20081202194633-5ed1f-ebf0c5f54f4080dc70489d58777ad66d4f1b9bc8.gz differ diff --git a/_darcs/patches/20081202194816-5ed1f-93a18c7b978950a770b833e7dea9e1fd5bb71de8.gz b/_darcs/patches/20081202194816-5ed1f-93a18c7b978950a770b833e7dea9e1fd5bb71de8.gz new file mode 100644 index 0000000000..9e4a8e60a6 Binary files /dev/null and b/_darcs/patches/20081202194816-5ed1f-93a18c7b978950a770b833e7dea9e1fd5bb71de8.gz differ diff --git a/_darcs/patches/20081203032632-5ed1f-2213efd018913e3253082dbe83d7b906c4f0ff76.gz b/_darcs/patches/20081203032632-5ed1f-2213efd018913e3253082dbe83d7b906c4f0ff76.gz new file mode 100644 index 0000000000..441de16a82 Binary files /dev/null and b/_darcs/patches/20081203032632-5ed1f-2213efd018913e3253082dbe83d7b906c4f0ff76.gz differ diff --git a/_darcs/patches/20081203032650-5ed1f-1f9affd557cf958cdfe7ed224433199b22e1c56a.gz b/_darcs/patches/20081203032650-5ed1f-1f9affd557cf958cdfe7ed224433199b22e1c56a.gz new file mode 100644 index 0000000000..cd5dc63340 Binary files /dev/null and b/_darcs/patches/20081203032650-5ed1f-1f9affd557cf958cdfe7ed224433199b22e1c56a.gz differ diff --git a/_darcs/patches/20081203032705-5ed1f-c425d8aef897b4223db3f2cb0250ed6fbe816f67.gz b/_darcs/patches/20081203032705-5ed1f-c425d8aef897b4223db3f2cb0250ed6fbe816f67.gz new file mode 100644 index 0000000000..f58dd02f64 Binary files /dev/null and b/_darcs/patches/20081203032705-5ed1f-c425d8aef897b4223db3f2cb0250ed6fbe816f67.gz differ diff --git a/_darcs/patches/20081203032743-5ed1f-87f9b170e87d5e010564b6f3c6dc7b3ca2b9c719.gz b/_darcs/patches/20081203032743-5ed1f-87f9b170e87d5e010564b6f3c6dc7b3ca2b9c719.gz new file mode 100644 index 0000000000..104f295f87 Binary files /dev/null and b/_darcs/patches/20081203032743-5ed1f-87f9b170e87d5e010564b6f3c6dc7b3ca2b9c719.gz differ diff --git a/_darcs/patches/20081203035947-84dde-68ce5b3ba2b49bd76e9ef8572cea7857cd05a659.gz b/_darcs/patches/20081203035947-84dde-68ce5b3ba2b49bd76e9ef8572cea7857cd05a659.gz new file mode 100644 index 0000000000..e658350020 Binary files /dev/null and b/_darcs/patches/20081203035947-84dde-68ce5b3ba2b49bd76e9ef8572cea7857cd05a659.gz differ diff --git a/_darcs/patches/20081203041730-5ed1f-1e1910cec75546291b14386d91f3bd22ae06b750.gz b/_darcs/patches/20081203041730-5ed1f-1e1910cec75546291b14386d91f3bd22ae06b750.gz new file mode 100644 index 0000000000..f116a16429 Binary files /dev/null and b/_darcs/patches/20081203041730-5ed1f-1e1910cec75546291b14386d91f3bd22ae06b750.gz differ diff --git a/_darcs/patches/20081203164942-099f7-ea511948139c9c18b1c8b7de018aa4f0ee5ff624.gz b/_darcs/patches/20081203164942-099f7-ea511948139c9c18b1c8b7de018aa4f0ee5ff624.gz new file mode 100644 index 0000000000..d9ec005626 Binary files /dev/null and b/_darcs/patches/20081203164942-099f7-ea511948139c9c18b1c8b7de018aa4f0ee5ff624.gz differ diff --git a/_darcs/patches/20081203172856-5ed1f-78a27cd47a2b5733bd55d0acfd7c399c5818ba08.gz b/_darcs/patches/20081203172856-5ed1f-78a27cd47a2b5733bd55d0acfd7c399c5818ba08.gz new file mode 100644 index 0000000000..2ad1f6d986 Binary files /dev/null and b/_darcs/patches/20081203172856-5ed1f-78a27cd47a2b5733bd55d0acfd7c399c5818ba08.gz differ diff --git a/_darcs/patches/20081203173225-5ed1f-e5ebfb202ed4a84c90851d0faa025ad09774d2c3.gz b/_darcs/patches/20081203173225-5ed1f-e5ebfb202ed4a84c90851d0faa025ad09774d2c3.gz new file mode 100644 index 0000000000..e2e941d67c Binary files /dev/null and b/_darcs/patches/20081203173225-5ed1f-e5ebfb202ed4a84c90851d0faa025ad09774d2c3.gz differ diff --git a/_darcs/patches/20081203173423-5ed1f-95de0f98aba4be527cd59d7297bc4f7b712713bd.gz b/_darcs/patches/20081203173423-5ed1f-95de0f98aba4be527cd59d7297bc4f7b712713bd.gz new file mode 100644 index 0000000000..174d1d1af3 Binary files /dev/null and b/_darcs/patches/20081203173423-5ed1f-95de0f98aba4be527cd59d7297bc4f7b712713bd.gz differ diff --git a/_darcs/patches/20081203174646-5ed1f-8f9f050a7e8c217872c283f299d790252c205920.gz b/_darcs/patches/20081203174646-5ed1f-8f9f050a7e8c217872c283f299d790252c205920.gz new file mode 100644 index 0000000000..1050226c75 Binary files /dev/null and b/_darcs/patches/20081203174646-5ed1f-8f9f050a7e8c217872c283f299d790252c205920.gz differ diff --git a/_darcs/patches/20081203180945-5ed1f-747b3c0e00ced81c02953e1095a9b866a7876c43.gz b/_darcs/patches/20081203180945-5ed1f-747b3c0e00ced81c02953e1095a9b866a7876c43.gz new file mode 100644 index 0000000000..d9f6f9cdd1 Binary files /dev/null and b/_darcs/patches/20081203180945-5ed1f-747b3c0e00ced81c02953e1095a9b866a7876c43.gz differ diff --git a/_darcs/patches/20081203182421-5ed1f-9a8569a5b38ca15c7ae83438a59a05f8b07215bd.gz b/_darcs/patches/20081203182421-5ed1f-9a8569a5b38ca15c7ae83438a59a05f8b07215bd.gz new file mode 100644 index 0000000000..8146a089e3 Binary files /dev/null and b/_darcs/patches/20081203182421-5ed1f-9a8569a5b38ca15c7ae83438a59a05f8b07215bd.gz differ diff --git a/_darcs/patches/20081203182830-5ed1f-ad1c3c585984cb4e27b078964d6f96bd7d8e05d8.gz b/_darcs/patches/20081203182830-5ed1f-ad1c3c585984cb4e27b078964d6f96bd7d8e05d8.gz new file mode 100644 index 0000000000..1e332c2292 Binary files /dev/null and b/_darcs/patches/20081203182830-5ed1f-ad1c3c585984cb4e27b078964d6f96bd7d8e05d8.gz differ diff --git a/_darcs/patches/20081203183432-5ed1f-7626661b797f64594f990ee06d9e13b73b265b49.gz b/_darcs/patches/20081203183432-5ed1f-7626661b797f64594f990ee06d9e13b73b265b49.gz new file mode 100644 index 0000000000..813d14723e Binary files /dev/null and b/_darcs/patches/20081203183432-5ed1f-7626661b797f64594f990ee06d9e13b73b265b49.gz differ diff --git a/_darcs/patches/20081203183638-5ed1f-f54d43e62dca66d9ebbd1203549e63c165510b22.gz b/_darcs/patches/20081203183638-5ed1f-f54d43e62dca66d9ebbd1203549e63c165510b22.gz new file mode 100644 index 0000000000..f3c384477b Binary files /dev/null and b/_darcs/patches/20081203183638-5ed1f-f54d43e62dca66d9ebbd1203549e63c165510b22.gz differ diff --git a/_darcs/patches/20081203184254-5ed1f-844aa013d72f5100ea5f100b252321760121cb17.gz b/_darcs/patches/20081203184254-5ed1f-844aa013d72f5100ea5f100b252321760121cb17.gz new file mode 100644 index 0000000000..6a125820bf Binary files /dev/null and b/_darcs/patches/20081203184254-5ed1f-844aa013d72f5100ea5f100b252321760121cb17.gz differ diff --git a/_darcs/patches/20081203184748-5ed1f-b3c3236d17457a112db53595d64c5a41e9a9d2a2.gz b/_darcs/patches/20081203184748-5ed1f-b3c3236d17457a112db53595d64c5a41e9a9d2a2.gz new file mode 100644 index 0000000000..18339e9b88 Binary files /dev/null and b/_darcs/patches/20081203184748-5ed1f-b3c3236d17457a112db53595d64c5a41e9a9d2a2.gz differ diff --git a/_darcs/patches/20081203185022-5ed1f-a618527f069301c34b3fd6a75ae5676f45e64d39.gz b/_darcs/patches/20081203185022-5ed1f-a618527f069301c34b3fd6a75ae5676f45e64d39.gz new file mode 100644 index 0000000000..3b94d515e6 Binary files /dev/null and b/_darcs/patches/20081203185022-5ed1f-a618527f069301c34b3fd6a75ae5676f45e64d39.gz differ diff --git a/_darcs/patches/20081203185254-5ed1f-3dea8c6396ee3a05e2fff7ec02023f50c3d38515.gz b/_darcs/patches/20081203185254-5ed1f-3dea8c6396ee3a05e2fff7ec02023f50c3d38515.gz new file mode 100644 index 0000000000..fd972db652 Binary files /dev/null and b/_darcs/patches/20081203185254-5ed1f-3dea8c6396ee3a05e2fff7ec02023f50c3d38515.gz differ diff --git a/_darcs/patches/20081203192658-099f7-37d26abf7409ab2996a22de4aa71cb7a5f68d205.gz b/_darcs/patches/20081203192658-099f7-37d26abf7409ab2996a22de4aa71cb7a5f68d205.gz new file mode 100644 index 0000000000..c07e9fcd89 Binary files /dev/null and b/_darcs/patches/20081203192658-099f7-37d26abf7409ab2996a22de4aa71cb7a5f68d205.gz differ diff --git a/_darcs/patches/20081203210358-5ed1f-3ff0de9c00c72de6bde703b150b24597ff8fadf4.gz b/_darcs/patches/20081203210358-5ed1f-3ff0de9c00c72de6bde703b150b24597ff8fadf4.gz new file mode 100644 index 0000000000..a6660200b3 Binary files /dev/null and b/_darcs/patches/20081203210358-5ed1f-3ff0de9c00c72de6bde703b150b24597ff8fadf4.gz differ diff --git a/_darcs/patches/20081203220637-eefa4-5a9db2b3b178c6a7e4edb43b72c392215ed3e004.gz b/_darcs/patches/20081203220637-eefa4-5a9db2b3b178c6a7e4edb43b72c392215ed3e004.gz new file mode 100644 index 0000000000..966759909b Binary files /dev/null and b/_darcs/patches/20081203220637-eefa4-5a9db2b3b178c6a7e4edb43b72c392215ed3e004.gz differ diff --git a/_darcs/patches/20081203222619-5ed1f-b313092893c67a3ec1dc92a79aa7fed4ab583729.gz b/_darcs/patches/20081203222619-5ed1f-b313092893c67a3ec1dc92a79aa7fed4ab583729.gz new file mode 100644 index 0000000000..db6eab374c Binary files /dev/null and b/_darcs/patches/20081203222619-5ed1f-b313092893c67a3ec1dc92a79aa7fed4ab583729.gz differ diff --git a/_darcs/patches/20081203222819-5ed1f-49d1657730072be304ea6455ac96637ab47191f3.gz b/_darcs/patches/20081203222819-5ed1f-49d1657730072be304ea6455ac96637ab47191f3.gz new file mode 100644 index 0000000000..b6607cc0f2 Binary files /dev/null and b/_darcs/patches/20081203222819-5ed1f-49d1657730072be304ea6455ac96637ab47191f3.gz differ diff --git a/_darcs/patches/20081204174754-5ed1f-dcce210332c55a544c35d535c3f3008aa8c165d3.gz b/_darcs/patches/20081204174754-5ed1f-dcce210332c55a544c35d535c3f3008aa8c165d3.gz new file mode 100644 index 0000000000..0f976b8e0d Binary files /dev/null and b/_darcs/patches/20081204174754-5ed1f-dcce210332c55a544c35d535c3f3008aa8c165d3.gz differ diff --git a/_darcs/patches/20081204180233-099f7-7728ee57876b789278aa1cc35f54e0a422593e5d.gz b/_darcs/patches/20081204180233-099f7-7728ee57876b789278aa1cc35f54e0a422593e5d.gz new file mode 100644 index 0000000000..8478be46af Binary files /dev/null and b/_darcs/patches/20081204180233-099f7-7728ee57876b789278aa1cc35f54e0a422593e5d.gz differ diff --git a/_darcs/patches/20081204182953-099f7-b47315607d937da4d648b200a733c715a97d9bc2.gz b/_darcs/patches/20081204182953-099f7-b47315607d937da4d648b200a733c715a97d9bc2.gz new file mode 100644 index 0000000000..1f6579f1c2 Binary files /dev/null and b/_darcs/patches/20081204182953-099f7-b47315607d937da4d648b200a733c715a97d9bc2.gz differ diff --git a/_darcs/patches/20081204203433-099f7-41be8f47b2a8e647414225f26318da005144006d.gz b/_darcs/patches/20081204203433-099f7-41be8f47b2a8e647414225f26318da005144006d.gz new file mode 100644 index 0000000000..7d9da79523 Binary files /dev/null and b/_darcs/patches/20081204203433-099f7-41be8f47b2a8e647414225f26318da005144006d.gz differ diff --git a/_darcs/patches/20081204212455-099f7-a3a325852f55b94e4b81c84dbb301ae2eebf48b4.gz b/_darcs/patches/20081204212455-099f7-a3a325852f55b94e4b81c84dbb301ae2eebf48b4.gz new file mode 100644 index 0000000000..51405a3dae Binary files /dev/null and b/_darcs/patches/20081204212455-099f7-a3a325852f55b94e4b81c84dbb301ae2eebf48b4.gz differ diff --git a/_darcs/patches/20081204213414-099f7-631e8aecc8ce2d8725b93e23e15e6e97f06a6bac.gz b/_darcs/patches/20081204213414-099f7-631e8aecc8ce2d8725b93e23e15e6e97f06a6bac.gz new file mode 100644 index 0000000000..c357e17cc8 Binary files /dev/null and b/_darcs/patches/20081204213414-099f7-631e8aecc8ce2d8725b93e23e15e6e97f06a6bac.gz differ diff --git a/_darcs/patches/20081205152445-84dde-62b3560fae1b1505528826e91939af89b8afd971.gz b/_darcs/patches/20081205152445-84dde-62b3560fae1b1505528826e91939af89b8afd971.gz new file mode 100644 index 0000000000..d3d72f99ba Binary files /dev/null and b/_darcs/patches/20081205152445-84dde-62b3560fae1b1505528826e91939af89b8afd971.gz differ diff --git a/_darcs/patches/20081205152521-84dde-6487a2769943da5dc70b9425d00c17d2c53270d0.gz b/_darcs/patches/20081205152521-84dde-6487a2769943da5dc70b9425d00c17d2c53270d0.gz new file mode 100644 index 0000000000..05255a3f26 Binary files /dev/null and b/_darcs/patches/20081205152521-84dde-6487a2769943da5dc70b9425d00c17d2c53270d0.gz differ diff --git a/_darcs/patches/20081205153325-5ed1f-f663ec459d8d5067505ff28be39dee8c382e5814.gz b/_darcs/patches/20081205153325-5ed1f-f663ec459d8d5067505ff28be39dee8c382e5814.gz new file mode 100644 index 0000000000..f26a005cc6 Binary files /dev/null and b/_darcs/patches/20081205153325-5ed1f-f663ec459d8d5067505ff28be39dee8c382e5814.gz differ diff --git a/_darcs/patches/20081205160205-84dde-68363153ee7f4f75a7c25ca6546816b648406b8b.gz b/_darcs/patches/20081205160205-84dde-68363153ee7f4f75a7c25ca6546816b648406b8b.gz new file mode 100644 index 0000000000..ffe0712518 Binary files /dev/null and b/_darcs/patches/20081205160205-84dde-68363153ee7f4f75a7c25ca6546816b648406b8b.gz differ diff --git a/_darcs/patches/20081205221402-eefa4-9c765fe3c7a6e0cf9cdee1749ed2bebb24d3deaf.gz b/_darcs/patches/20081205221402-eefa4-9c765fe3c7a6e0cf9cdee1749ed2bebb24d3deaf.gz new file mode 100644 index 0000000000..adcb29dd5e Binary files /dev/null and b/_darcs/patches/20081205221402-eefa4-9c765fe3c7a6e0cf9cdee1749ed2bebb24d3deaf.gz differ diff --git a/_darcs/patches/20081206030132-7b5ce-96c38ab67edd3d58f8722ef25852a6143f05a86b.gz b/_darcs/patches/20081206030132-7b5ce-96c38ab67edd3d58f8722ef25852a6143f05a86b.gz new file mode 100644 index 0000000000..dab820496f Binary files /dev/null and b/_darcs/patches/20081206030132-7b5ce-96c38ab67edd3d58f8722ef25852a6143f05a86b.gz differ diff --git a/_darcs/patches/20081207165900-84dde-23afe73c9c61cfb259ec5dc0cac5030643b31f2c.gz b/_darcs/patches/20081207165900-84dde-23afe73c9c61cfb259ec5dc0cac5030643b31f2c.gz new file mode 100644 index 0000000000..6204ac38d5 Binary files /dev/null and b/_darcs/patches/20081207165900-84dde-23afe73c9c61cfb259ec5dc0cac5030643b31f2c.gz differ diff --git a/_darcs/patches/20081207192917-84dde-6a24da9dae18bb003944d9044eaa2631bde07902.gz b/_darcs/patches/20081207192917-84dde-6a24da9dae18bb003944d9044eaa2631bde07902.gz new file mode 100644 index 0000000000..669df9c9bd Binary files /dev/null and b/_darcs/patches/20081207192917-84dde-6a24da9dae18bb003944d9044eaa2631bde07902.gz differ diff --git a/_darcs/patches/20081207235925-7b5ce-224fd2482f66c2c9ac9da9ce72c1c0da0243bd83.gz b/_darcs/patches/20081207235925-7b5ce-224fd2482f66c2c9ac9da9ce72c1c0da0243bd83.gz new file mode 100644 index 0000000000..dc9aa5b8ab Binary files /dev/null and b/_darcs/patches/20081207235925-7b5ce-224fd2482f66c2c9ac9da9ce72c1c0da0243bd83.gz differ diff --git a/_darcs/patches/20081208005522-7b5ce-84325ed13fd5e59ac07640089806a507c7168170.gz b/_darcs/patches/20081208005522-7b5ce-84325ed13fd5e59ac07640089806a507c7168170.gz new file mode 100644 index 0000000000..0452400ae2 Binary files /dev/null and b/_darcs/patches/20081208005522-7b5ce-84325ed13fd5e59ac07640089806a507c7168170.gz differ diff --git a/_darcs/patches/20081208005816-7b5ce-b7ec90e310ddc609fe88d54cfac5ec7bc67da6ca.gz b/_darcs/patches/20081208005816-7b5ce-b7ec90e310ddc609fe88d54cfac5ec7bc67da6ca.gz new file mode 100644 index 0000000000..2c090f5561 Binary files /dev/null and b/_darcs/patches/20081208005816-7b5ce-b7ec90e310ddc609fe88d54cfac5ec7bc67da6ca.gz differ diff --git a/_darcs/patches/20081208015412-7b5ce-c899a3b743621f7d003b93f383b78a2c8ba9fb52.gz b/_darcs/patches/20081208015412-7b5ce-c899a3b743621f7d003b93f383b78a2c8ba9fb52.gz new file mode 100644 index 0000000000..c005e449e7 Binary files /dev/null and b/_darcs/patches/20081208015412-7b5ce-c899a3b743621f7d003b93f383b78a2c8ba9fb52.gz differ diff --git a/_darcs/patches/20081208031008-5ed1f-c96006b5c05fa0e68f9adaacd0518016aedfee2a.gz b/_darcs/patches/20081208031008-5ed1f-c96006b5c05fa0e68f9adaacd0518016aedfee2a.gz new file mode 100644 index 0000000000..b910fd50a6 Binary files /dev/null and b/_darcs/patches/20081208031008-5ed1f-c96006b5c05fa0e68f9adaacd0518016aedfee2a.gz differ diff --git a/_darcs/patches/20081208031312-5ed1f-b570b86b28e8eda763c51be1ae091034f76bd984.gz b/_darcs/patches/20081208031312-5ed1f-b570b86b28e8eda763c51be1ae091034f76bd984.gz new file mode 100644 index 0000000000..bd5024271d Binary files /dev/null and b/_darcs/patches/20081208031312-5ed1f-b570b86b28e8eda763c51be1ae091034f76bd984.gz differ diff --git a/_darcs/patches/20081208031408-5ed1f-dfdb46fbcf5390d890b4db47c64da0b70ace8096.gz b/_darcs/patches/20081208031408-5ed1f-dfdb46fbcf5390d890b4db47c64da0b70ace8096.gz new file mode 100644 index 0000000000..1d0dd8fe9d Binary files /dev/null and b/_darcs/patches/20081208031408-5ed1f-dfdb46fbcf5390d890b4db47c64da0b70ace8096.gz differ diff --git a/_darcs/patches/20081208031532-5ed1f-6094c6425b73e45589de282fa482b912fb686fae.gz b/_darcs/patches/20081208031532-5ed1f-6094c6425b73e45589de282fa482b912fb686fae.gz new file mode 100644 index 0000000000..853c78838a Binary files /dev/null and b/_darcs/patches/20081208031532-5ed1f-6094c6425b73e45589de282fa482b912fb686fae.gz differ diff --git a/_darcs/patches/20081208033132-5ed1f-ee93e5b26353c097ee1bdb8d3e4cedad5763548e.gz b/_darcs/patches/20081208033132-5ed1f-ee93e5b26353c097ee1bdb8d3e4cedad5763548e.gz new file mode 100644 index 0000000000..6435fa1c1a Binary files /dev/null and b/_darcs/patches/20081208033132-5ed1f-ee93e5b26353c097ee1bdb8d3e4cedad5763548e.gz differ diff --git a/_darcs/patches/20081208051212-eefa4-13c2cc5bab8c8da38dff51bce7fe89c2debdb781.gz b/_darcs/patches/20081208051212-eefa4-13c2cc5bab8c8da38dff51bce7fe89c2debdb781.gz new file mode 100644 index 0000000000..1a038decc4 Binary files /dev/null and b/_darcs/patches/20081208051212-eefa4-13c2cc5bab8c8da38dff51bce7fe89c2debdb781.gz differ diff --git a/_darcs/patches/20081208051859-7b5ce-5d777044f81edd562a4fe825cfcc12233e2bc5dc.gz b/_darcs/patches/20081208051859-7b5ce-5d777044f81edd562a4fe825cfcc12233e2bc5dc.gz new file mode 100644 index 0000000000..c22798ef3e Binary files /dev/null and b/_darcs/patches/20081208051859-7b5ce-5d777044f81edd562a4fe825cfcc12233e2bc5dc.gz differ diff --git a/_darcs/patches/20081208053011-eefa4-aa5f115efa26653f1cd56101637cee40eedb27e7.gz b/_darcs/patches/20081208053011-eefa4-aa5f115efa26653f1cd56101637cee40eedb27e7.gz new file mode 100644 index 0000000000..5fd358c5d0 Binary files /dev/null and b/_darcs/patches/20081208053011-eefa4-aa5f115efa26653f1cd56101637cee40eedb27e7.gz differ diff --git a/_darcs/patches/20081208053543-84dde-039dcb947f0c6c2cd01ab7065b8c807000f59b3a.gz b/_darcs/patches/20081208053543-84dde-039dcb947f0c6c2cd01ab7065b8c807000f59b3a.gz new file mode 100644 index 0000000000..22b7b17e7e Binary files /dev/null and b/_darcs/patches/20081208053543-84dde-039dcb947f0c6c2cd01ab7065b8c807000f59b3a.gz differ diff --git a/_darcs/patches/20081208055023-84dde-5ae95497ae63584f7b86e63eb62ed13607ee1ee8.gz b/_darcs/patches/20081208055023-84dde-5ae95497ae63584f7b86e63eb62ed13607ee1ee8.gz new file mode 100644 index 0000000000..583dc3570f Binary files /dev/null and b/_darcs/patches/20081208055023-84dde-5ae95497ae63584f7b86e63eb62ed13607ee1ee8.gz differ diff --git a/_darcs/patches/20081208055511-5ed1f-e2e09986bd3b9cbb6a00a0c6b94f49ea78b7bdab.gz b/_darcs/patches/20081208055511-5ed1f-e2e09986bd3b9cbb6a00a0c6b94f49ea78b7bdab.gz new file mode 100644 index 0000000000..f0a1805fb5 Binary files /dev/null and b/_darcs/patches/20081208055511-5ed1f-e2e09986bd3b9cbb6a00a0c6b94f49ea78b7bdab.gz differ diff --git a/_darcs/patches/20081208055812-eefa4-719bb1b630a7d0764b286d67488313627b5180c8.gz b/_darcs/patches/20081208055812-eefa4-719bb1b630a7d0764b286d67488313627b5180c8.gz new file mode 100644 index 0000000000..5699f6dc6b Binary files /dev/null and b/_darcs/patches/20081208055812-eefa4-719bb1b630a7d0764b286d67488313627b5180c8.gz differ diff --git a/_darcs/patches/20081208062841-5ed1f-be70623070712b4877c8d2fd8aaadba33ebd2180.gz b/_darcs/patches/20081208062841-5ed1f-be70623070712b4877c8d2fd8aaadba33ebd2180.gz new file mode 100644 index 0000000000..d716ec518d Binary files /dev/null and b/_darcs/patches/20081208062841-5ed1f-be70623070712b4877c8d2fd8aaadba33ebd2180.gz differ diff --git a/_darcs/patches/20081208063056-5ed1f-ff1fdbc345395661c19699c6c76cc1d1f6ea8d25.gz b/_darcs/patches/20081208063056-5ed1f-ff1fdbc345395661c19699c6c76cc1d1f6ea8d25.gz new file mode 100644 index 0000000000..4799fc8844 Binary files /dev/null and b/_darcs/patches/20081208063056-5ed1f-ff1fdbc345395661c19699c6c76cc1d1f6ea8d25.gz differ diff --git a/_darcs/patches/20081208071521-5ed1f-1178a3c50f94c039d98112620e8bf78836e659bc.gz b/_darcs/patches/20081208071521-5ed1f-1178a3c50f94c039d98112620e8bf78836e659bc.gz new file mode 100644 index 0000000000..de3476151e Binary files /dev/null and b/_darcs/patches/20081208071521-5ed1f-1178a3c50f94c039d98112620e8bf78836e659bc.gz differ diff --git a/_darcs/patches/20081208071720-5ed1f-82ff38a26edc9254883bd22e055b7a883b07081c.gz b/_darcs/patches/20081208071720-5ed1f-82ff38a26edc9254883bd22e055b7a883b07081c.gz new file mode 100644 index 0000000000..b0f1ccd702 Binary files /dev/null and b/_darcs/patches/20081208071720-5ed1f-82ff38a26edc9254883bd22e055b7a883b07081c.gz differ diff --git a/_darcs/patches/20081208072519-5ed1f-10e7d3e14e54f0d67c58504adbc4c81f3228944a.gz b/_darcs/patches/20081208072519-5ed1f-10e7d3e14e54f0d67c58504adbc4c81f3228944a.gz new file mode 100644 index 0000000000..bd1a31aa2c Binary files /dev/null and b/_darcs/patches/20081208072519-5ed1f-10e7d3e14e54f0d67c58504adbc4c81f3228944a.gz differ diff --git a/_darcs/patches/20081208072629-5ed1f-90935f7a2a3d99a4c21b6390eb3fc941117c2580.gz b/_darcs/patches/20081208072629-5ed1f-90935f7a2a3d99a4c21b6390eb3fc941117c2580.gz new file mode 100644 index 0000000000..a5906e8caa Binary files /dev/null and b/_darcs/patches/20081208072629-5ed1f-90935f7a2a3d99a4c21b6390eb3fc941117c2580.gz differ diff --git a/_darcs/patches/20081208072958-5ed1f-3476745ea503bb234d81a7513cd84db789239871.gz b/_darcs/patches/20081208072958-5ed1f-3476745ea503bb234d81a7513cd84db789239871.gz new file mode 100644 index 0000000000..a67ad03dd5 Binary files /dev/null and b/_darcs/patches/20081208072958-5ed1f-3476745ea503bb234d81a7513cd84db789239871.gz differ diff --git a/_darcs/patches/20081208073209-5ed1f-0fca508e15833517f6c61f16d5f9979624c27b40.gz b/_darcs/patches/20081208073209-5ed1f-0fca508e15833517f6c61f16d5f9979624c27b40.gz new file mode 100644 index 0000000000..46f459ba67 Binary files /dev/null and b/_darcs/patches/20081208073209-5ed1f-0fca508e15833517f6c61f16d5f9979624c27b40.gz differ diff --git a/_darcs/patches/20081208170931-5ed1f-e7c5853e6a222b04723f20c01ebaae15eeab3687.gz b/_darcs/patches/20081208170931-5ed1f-e7c5853e6a222b04723f20c01ebaae15eeab3687.gz new file mode 100644 index 0000000000..d41e98196f Binary files /dev/null and b/_darcs/patches/20081208170931-5ed1f-e7c5853e6a222b04723f20c01ebaae15eeab3687.gz differ diff --git a/_darcs/patches/20081208172812-5ed1f-58ce42160f0ea5330de578c310897906d0012c5c.gz b/_darcs/patches/20081208172812-5ed1f-58ce42160f0ea5330de578c310897906d0012c5c.gz new file mode 100644 index 0000000000..eac617e65c Binary files /dev/null and b/_darcs/patches/20081208172812-5ed1f-58ce42160f0ea5330de578c310897906d0012c5c.gz differ diff --git a/_darcs/patches/20081208173722-5ed1f-fcdcb49e4958854ce9872beecee409737cacecb5.gz b/_darcs/patches/20081208173722-5ed1f-fcdcb49e4958854ce9872beecee409737cacecb5.gz new file mode 100644 index 0000000000..04d18283a2 Binary files /dev/null and b/_darcs/patches/20081208173722-5ed1f-fcdcb49e4958854ce9872beecee409737cacecb5.gz differ diff --git a/_darcs/patches/20081208185728-5ed1f-8d5f6be6decfbb50deb4ca50bee13404d0c51b72.gz b/_darcs/patches/20081208185728-5ed1f-8d5f6be6decfbb50deb4ca50bee13404d0c51b72.gz new file mode 100644 index 0000000000..28fd773860 Binary files /dev/null and b/_darcs/patches/20081208185728-5ed1f-8d5f6be6decfbb50deb4ca50bee13404d0c51b72.gz differ diff --git a/_darcs/patches/20081208193939-5ed1f-3275ec50dd2dbb23689710f9e52a071bcba94cc9.gz b/_darcs/patches/20081208193939-5ed1f-3275ec50dd2dbb23689710f9e52a071bcba94cc9.gz new file mode 100644 index 0000000000..6819d5c943 Binary files /dev/null and b/_darcs/patches/20081208193939-5ed1f-3275ec50dd2dbb23689710f9e52a071bcba94cc9.gz differ diff --git a/_darcs/patches/20081208201351-5ed1f-e74df1c59589816c24a0ccd867cbae714cd7daec.gz b/_darcs/patches/20081208201351-5ed1f-e74df1c59589816c24a0ccd867cbae714cd7daec.gz new file mode 100644 index 0000000000..7585dc9640 Binary files /dev/null and b/_darcs/patches/20081208201351-5ed1f-e74df1c59589816c24a0ccd867cbae714cd7daec.gz differ diff --git a/_darcs/patches/20081208201453-5ed1f-fe423d57a54d482b95c0dc22ab46e6e0a5ea060a.gz b/_darcs/patches/20081208201453-5ed1f-fe423d57a54d482b95c0dc22ab46e6e0a5ea060a.gz new file mode 100644 index 0000000000..225290db18 Binary files /dev/null and b/_darcs/patches/20081208201453-5ed1f-fe423d57a54d482b95c0dc22ab46e6e0a5ea060a.gz differ diff --git a/_darcs/patches/20081208215420-eefa4-25bc0ed6c14d9031e8343e89c2cf6bde6ce35521.gz b/_darcs/patches/20081208215420-eefa4-25bc0ed6c14d9031e8343e89c2cf6bde6ce35521.gz new file mode 100644 index 0000000000..5c9da8313c Binary files /dev/null and b/_darcs/patches/20081208215420-eefa4-25bc0ed6c14d9031e8343e89c2cf6bde6ce35521.gz differ diff --git a/_darcs/patches/20081209033637-5ed1f-df5ef40e57cc0e9485e34e2f5e46249dcb0d9130.gz b/_darcs/patches/20081209033637-5ed1f-df5ef40e57cc0e9485e34e2f5e46249dcb0d9130.gz new file mode 100644 index 0000000000..2002876962 Binary files /dev/null and b/_darcs/patches/20081209033637-5ed1f-df5ef40e57cc0e9485e34e2f5e46249dcb0d9130.gz differ diff --git a/_darcs/patches/20081209041227-5ed1f-2edefdc79545da646a6fd40b15fd72809c15831c.gz b/_darcs/patches/20081209041227-5ed1f-2edefdc79545da646a6fd40b15fd72809c15831c.gz new file mode 100644 index 0000000000..a53f178557 Binary files /dev/null and b/_darcs/patches/20081209041227-5ed1f-2edefdc79545da646a6fd40b15fd72809c15831c.gz differ diff --git a/_darcs/patches/20081209041648-5ed1f-fb6ed96047ebfbbe769a11cc3171ce8a5a1440a7.gz b/_darcs/patches/20081209041648-5ed1f-fb6ed96047ebfbbe769a11cc3171ce8a5a1440a7.gz new file mode 100644 index 0000000000..bb6437c08e Binary files /dev/null and b/_darcs/patches/20081209041648-5ed1f-fb6ed96047ebfbbe769a11cc3171ce8a5a1440a7.gz differ diff --git a/_darcs/patches/20081209055345-7b5ce-e48fd4c87963b8ae15859fd03d2f1f86a16f3a2b.gz b/_darcs/patches/20081209055345-7b5ce-e48fd4c87963b8ae15859fd03d2f1f86a16f3a2b.gz new file mode 100644 index 0000000000..da4e8104bc Binary files /dev/null and b/_darcs/patches/20081209055345-7b5ce-e48fd4c87963b8ae15859fd03d2f1f86a16f3a2b.gz differ diff --git a/_darcs/patches/20081209082750-7b5ce-6d06a7b1cda2a9afb6ce8ea64d65df81cc063139.gz b/_darcs/patches/20081209082750-7b5ce-6d06a7b1cda2a9afb6ce8ea64d65df81cc063139.gz new file mode 100644 index 0000000000..75db9133d6 Binary files /dev/null and b/_darcs/patches/20081209082750-7b5ce-6d06a7b1cda2a9afb6ce8ea64d65df81cc063139.gz differ diff --git a/_darcs/patches/20081209170413-84dde-6845ae5524d3ee1d1a491548bb22386f11f0e867.gz b/_darcs/patches/20081209170413-84dde-6845ae5524d3ee1d1a491548bb22386f11f0e867.gz new file mode 100644 index 0000000000..8eb93e7cea Binary files /dev/null and b/_darcs/patches/20081209170413-84dde-6845ae5524d3ee1d1a491548bb22386f11f0e867.gz differ diff --git a/_darcs/patches/20081209173402-84dde-eb1c47ddbf45a831379f6571729187267411ed07.gz b/_darcs/patches/20081209173402-84dde-eb1c47ddbf45a831379f6571729187267411ed07.gz new file mode 100644 index 0000000000..0b9da44b4d Binary files /dev/null and b/_darcs/patches/20081209173402-84dde-eb1c47ddbf45a831379f6571729187267411ed07.gz differ diff --git a/_darcs/patches/20081209174233-84dde-a5593f20cce3af07909ef9b3af7497ff61565fd3.gz b/_darcs/patches/20081209174233-84dde-a5593f20cce3af07909ef9b3af7497ff61565fd3.gz new file mode 100644 index 0000000000..9f2bed9c4a Binary files /dev/null and b/_darcs/patches/20081209174233-84dde-a5593f20cce3af07909ef9b3af7497ff61565fd3.gz differ diff --git a/_darcs/patches/20081209175446-84dde-ae63433fa42debe8fb2eb3862cac0b9f81f1e6de.gz b/_darcs/patches/20081209175446-84dde-ae63433fa42debe8fb2eb3862cac0b9f81f1e6de.gz new file mode 100644 index 0000000000..2941652e35 Binary files /dev/null and b/_darcs/patches/20081209175446-84dde-ae63433fa42debe8fb2eb3862cac0b9f81f1e6de.gz differ diff --git a/_darcs/patches/20081209180330-84dde-ba48eed8a9a557bac90d3869d60b24a4b9683e61.gz b/_darcs/patches/20081209180330-84dde-ba48eed8a9a557bac90d3869d60b24a4b9683e61.gz new file mode 100644 index 0000000000..5e30471526 Binary files /dev/null and b/_darcs/patches/20081209180330-84dde-ba48eed8a9a557bac90d3869d60b24a4b9683e61.gz differ diff --git a/_darcs/patches/20081209185424-84dde-d439346477811043ae471c5e68644b326b016713.gz b/_darcs/patches/20081209185424-84dde-d439346477811043ae471c5e68644b326b016713.gz new file mode 100644 index 0000000000..285111903e Binary files /dev/null and b/_darcs/patches/20081209185424-84dde-d439346477811043ae471c5e68644b326b016713.gz differ diff --git a/_darcs/patches/20081209210654-7b5ce-2ef432aa8cb7bf5cc1a973a71eb70e6b2aae4ab6.gz b/_darcs/patches/20081209210654-7b5ce-2ef432aa8cb7bf5cc1a973a71eb70e6b2aae4ab6.gz new file mode 100644 index 0000000000..bf8823a8da Binary files /dev/null and b/_darcs/patches/20081209210654-7b5ce-2ef432aa8cb7bf5cc1a973a71eb70e6b2aae4ab6.gz differ diff --git a/_darcs/patches/20081210014619-5ed1f-b78d0990f80f7fee6f31424bc1e366d08767af9d.gz b/_darcs/patches/20081210014619-5ed1f-b78d0990f80f7fee6f31424bc1e366d08767af9d.gz new file mode 100644 index 0000000000..c28c031470 Binary files /dev/null and b/_darcs/patches/20081210014619-5ed1f-b78d0990f80f7fee6f31424bc1e366d08767af9d.gz differ diff --git a/_darcs/patches/20081210024416-5ed1f-ec3b22136883f66c49473a10e09c06b6b9573a22.gz b/_darcs/patches/20081210024416-5ed1f-ec3b22136883f66c49473a10e09c06b6b9573a22.gz new file mode 100644 index 0000000000..075d988b31 Binary files /dev/null and b/_darcs/patches/20081210024416-5ed1f-ec3b22136883f66c49473a10e09c06b6b9573a22.gz differ diff --git a/_darcs/patches/20081210024706-5ed1f-fd54b76630656f7d4f7617309d2e4f87f25b006b.gz b/_darcs/patches/20081210024706-5ed1f-fd54b76630656f7d4f7617309d2e4f87f25b006b.gz new file mode 100644 index 0000000000..204e7e2e20 Binary files /dev/null and b/_darcs/patches/20081210024706-5ed1f-fd54b76630656f7d4f7617309d2e4f87f25b006b.gz differ diff --git a/_darcs/patches/20081210173726-099f7-5fc908c7330ec8b21d101c1498d5b78ab09ee490.gz b/_darcs/patches/20081210173726-099f7-5fc908c7330ec8b21d101c1498d5b78ab09ee490.gz new file mode 100644 index 0000000000..9e00484fd7 Binary files /dev/null and b/_darcs/patches/20081210173726-099f7-5fc908c7330ec8b21d101c1498d5b78ab09ee490.gz differ diff --git a/_darcs/patches/20081210174722-84dde-4c79d7f73230d008195bd19738bc9a6017b940e9.gz b/_darcs/patches/20081210174722-84dde-4c79d7f73230d008195bd19738bc9a6017b940e9.gz new file mode 100644 index 0000000000..7a4c389a1b Binary files /dev/null and b/_darcs/patches/20081210174722-84dde-4c79d7f73230d008195bd19738bc9a6017b940e9.gz differ diff --git a/_darcs/patches/20081210181123-099f7-b13ae11d136512655fc5ba4bb314c80256244593.gz b/_darcs/patches/20081210181123-099f7-b13ae11d136512655fc5ba4bb314c80256244593.gz new file mode 100644 index 0000000000..40c1c55e94 Binary files /dev/null and b/_darcs/patches/20081210181123-099f7-b13ae11d136512655fc5ba4bb314c80256244593.gz differ diff --git a/_darcs/patches/20081210191337-7b5ce-f9a083596b3f5627405c9e233c1994d8338f5731.gz b/_darcs/patches/20081210191337-7b5ce-f9a083596b3f5627405c9e233c1994d8338f5731.gz new file mode 100644 index 0000000000..63585b25c0 Binary files /dev/null and b/_darcs/patches/20081210191337-7b5ce-f9a083596b3f5627405c9e233c1994d8338f5731.gz differ diff --git a/_darcs/patches/20081210194335-84dde-a74fe65acfa707eae5499cdf47850d353562ccb8.gz b/_darcs/patches/20081210194335-84dde-a74fe65acfa707eae5499cdf47850d353562ccb8.gz new file mode 100644 index 0000000000..be2ee84925 Binary files /dev/null and b/_darcs/patches/20081210194335-84dde-a74fe65acfa707eae5499cdf47850d353562ccb8.gz differ diff --git a/_darcs/patches/20081210233503-84dde-ae7e4acd0d5e42d6d743b545688ad4ad51bc5014.gz b/_darcs/patches/20081210233503-84dde-ae7e4acd0d5e42d6d743b545688ad4ad51bc5014.gz new file mode 100644 index 0000000000..7ab281170b Binary files /dev/null and b/_darcs/patches/20081210233503-84dde-ae7e4acd0d5e42d6d743b545688ad4ad51bc5014.gz differ diff --git a/_darcs/patches/20081211021755-efd22-5b2f406b22a87c81cc02f92fee8a0ed64572e113.gz b/_darcs/patches/20081211021755-efd22-5b2f406b22a87c81cc02f92fee8a0ed64572e113.gz new file mode 100644 index 0000000000..3dc13e9ede Binary files /dev/null and b/_darcs/patches/20081211021755-efd22-5b2f406b22a87c81cc02f92fee8a0ed64572e113.gz differ diff --git a/_darcs/patches/20081211022557-7b5ce-8040947f258db638bd68fe2620381b3c078a4c31.gz b/_darcs/patches/20081211022557-7b5ce-8040947f258db638bd68fe2620381b3c078a4c31.gz new file mode 100644 index 0000000000..2242a2bf15 Binary files /dev/null and b/_darcs/patches/20081211022557-7b5ce-8040947f258db638bd68fe2620381b3c078a4c31.gz differ diff --git a/_darcs/patches/20081211024233-7b5ce-e4911c049adf067f24821f868a27bdf67c324caf.gz b/_darcs/patches/20081211024233-7b5ce-e4911c049adf067f24821f868a27bdf67c324caf.gz new file mode 100644 index 0000000000..80b20be62c Binary files /dev/null and b/_darcs/patches/20081211024233-7b5ce-e4911c049adf067f24821f868a27bdf67c324caf.gz differ diff --git a/_darcs/patches/20081211100106-7b5ce-c8dfd1f3ded2b9f1258d11457a1c2669a4858185.gz b/_darcs/patches/20081211100106-7b5ce-c8dfd1f3ded2b9f1258d11457a1c2669a4858185.gz new file mode 100644 index 0000000000..1589b317cb Binary files /dev/null and b/_darcs/patches/20081211100106-7b5ce-c8dfd1f3ded2b9f1258d11457a1c2669a4858185.gz differ diff --git a/_darcs/patches/20081211162558-5ed1f-1eb8afbadbaa5f84140cbd255b1c01dc456577fd.gz b/_darcs/patches/20081211162558-5ed1f-1eb8afbadbaa5f84140cbd255b1c01dc456577fd.gz new file mode 100644 index 0000000000..54b403b918 Binary files /dev/null and b/_darcs/patches/20081211162558-5ed1f-1eb8afbadbaa5f84140cbd255b1c01dc456577fd.gz differ diff --git a/_darcs/patches/20081211163150-5ed1f-10ff4c4863145909c1d541e39dc4bf69d945cfd7.gz b/_darcs/patches/20081211163150-5ed1f-10ff4c4863145909c1d541e39dc4bf69d945cfd7.gz new file mode 100644 index 0000000000..134654feb1 Binary files /dev/null and b/_darcs/patches/20081211163150-5ed1f-10ff4c4863145909c1d541e39dc4bf69d945cfd7.gz differ diff --git a/_darcs/patches/20081211163434-5ed1f-38d9bf093db72d27837cbfe76d46fd518adc3bb6.gz b/_darcs/patches/20081211163434-5ed1f-38d9bf093db72d27837cbfe76d46fd518adc3bb6.gz new file mode 100644 index 0000000000..30e09171d9 Binary files /dev/null and b/_darcs/patches/20081211163434-5ed1f-38d9bf093db72d27837cbfe76d46fd518adc3bb6.gz differ diff --git a/_darcs/patches/20081211171353-84dde-31b2858e361f62e13ca8ca8784b1aac4209ef04c.gz b/_darcs/patches/20081211171353-84dde-31b2858e361f62e13ca8ca8784b1aac4209ef04c.gz new file mode 100644 index 0000000000..ffc7411585 Binary files /dev/null and b/_darcs/patches/20081211171353-84dde-31b2858e361f62e13ca8ca8784b1aac4209ef04c.gz differ diff --git a/_darcs/patches/20081211180622-5ed1f-ab61ae0e19506b9686cd560ff262d29a6d0ac267.gz b/_darcs/patches/20081211180622-5ed1f-ab61ae0e19506b9686cd560ff262d29a6d0ac267.gz new file mode 100644 index 0000000000..d6a668be85 Binary files /dev/null and b/_darcs/patches/20081211180622-5ed1f-ab61ae0e19506b9686cd560ff262d29a6d0ac267.gz differ diff --git a/_darcs/patches/20081211181500-5ed1f-5042b1ff2ed5de36500200f3ea2aa91108f1f853.gz b/_darcs/patches/20081211181500-5ed1f-5042b1ff2ed5de36500200f3ea2aa91108f1f853.gz new file mode 100644 index 0000000000..cebb1309ad Binary files /dev/null and b/_darcs/patches/20081211181500-5ed1f-5042b1ff2ed5de36500200f3ea2aa91108f1f853.gz differ diff --git a/_darcs/patches/20081211183250-5ed1f-73f542de534be2931508841a2c85162e2fe15160.gz b/_darcs/patches/20081211183250-5ed1f-73f542de534be2931508841a2c85162e2fe15160.gz new file mode 100644 index 0000000000..5ac9022783 Binary files /dev/null and b/_darcs/patches/20081211183250-5ed1f-73f542de534be2931508841a2c85162e2fe15160.gz differ diff --git a/_darcs/patches/20081211183756-5ed1f-d4c430397d6356ede7873d3790a61fd822a96e60.gz b/_darcs/patches/20081211183756-5ed1f-d4c430397d6356ede7873d3790a61fd822a96e60.gz new file mode 100644 index 0000000000..09a11e7c6a Binary files /dev/null and b/_darcs/patches/20081211183756-5ed1f-d4c430397d6356ede7873d3790a61fd822a96e60.gz differ diff --git a/_darcs/patches/20081211185525-5ed1f-ea300a9f824163ea7989baae4e4b439e58fd0881.gz b/_darcs/patches/20081211185525-5ed1f-ea300a9f824163ea7989baae4e4b439e58fd0881.gz new file mode 100644 index 0000000000..f6000feeca Binary files /dev/null and b/_darcs/patches/20081211185525-5ed1f-ea300a9f824163ea7989baae4e4b439e58fd0881.gz differ diff --git a/_darcs/patches/20081211195259-5ed1f-c52136c07bdad5521184bd1990313030a8e1e831.gz b/_darcs/patches/20081211195259-5ed1f-c52136c07bdad5521184bd1990313030a8e1e831.gz new file mode 100644 index 0000000000..07f5dddf56 Binary files /dev/null and b/_darcs/patches/20081211195259-5ed1f-c52136c07bdad5521184bd1990313030a8e1e831.gz differ diff --git a/_darcs/patches/20081211200239-5ed1f-b8829a657dcb6b9f1ec6134d61de5340414a10d4.gz b/_darcs/patches/20081211200239-5ed1f-b8829a657dcb6b9f1ec6134d61de5340414a10d4.gz new file mode 100644 index 0000000000..ac07eb3b51 Binary files /dev/null and b/_darcs/patches/20081211200239-5ed1f-b8829a657dcb6b9f1ec6134d61de5340414a10d4.gz differ diff --git a/_darcs/patches/20081211201717-efd22-850db00fab62a80773b5c6b9b5e4008059ee6b17.gz b/_darcs/patches/20081211201717-efd22-850db00fab62a80773b5c6b9b5e4008059ee6b17.gz new file mode 100644 index 0000000000..4dd6c6e216 Binary files /dev/null and b/_darcs/patches/20081211201717-efd22-850db00fab62a80773b5c6b9b5e4008059ee6b17.gz differ diff --git a/_darcs/patches/20081211203659-7b5ce-43cfb2067c296374779a532410f186c42e8d2f99.gz b/_darcs/patches/20081211203659-7b5ce-43cfb2067c296374779a532410f186c42e8d2f99.gz new file mode 100644 index 0000000000..6eb06c7e43 Binary files /dev/null and b/_darcs/patches/20081211203659-7b5ce-43cfb2067c296374779a532410f186c42e8d2f99.gz differ diff --git a/_darcs/patches/20081211204814-efd22-9882cf51d2a62c7018babfc2cfc3ef582e8dc8a4.gz b/_darcs/patches/20081211204814-efd22-9882cf51d2a62c7018babfc2cfc3ef582e8dc8a4.gz new file mode 100644 index 0000000000..4d91364e3a Binary files /dev/null and b/_darcs/patches/20081211204814-efd22-9882cf51d2a62c7018babfc2cfc3ef582e8dc8a4.gz differ diff --git a/_darcs/patches/20081211211814-efd22-a41a2b123fcd08945370e868431dc1b2feda4dfe.gz b/_darcs/patches/20081211211814-efd22-a41a2b123fcd08945370e868431dc1b2feda4dfe.gz new file mode 100644 index 0000000000..8e38ce3643 Binary files /dev/null and b/_darcs/patches/20081211211814-efd22-a41a2b123fcd08945370e868431dc1b2feda4dfe.gz differ diff --git a/_darcs/patches/20081211212046-efd22-5face1c2bfaf0dd43dc7ffcc4eec639fdb4b5fe5.gz b/_darcs/patches/20081211212046-efd22-5face1c2bfaf0dd43dc7ffcc4eec639fdb4b5fe5.gz new file mode 100644 index 0000000000..72da828f49 Binary files /dev/null and b/_darcs/patches/20081211212046-efd22-5face1c2bfaf0dd43dc7ffcc4eec639fdb4b5fe5.gz differ diff --git a/_darcs/patches/20081211225808-efd22-7f21b4588aad028766516f76173cf62cdf560855.gz b/_darcs/patches/20081211225808-efd22-7f21b4588aad028766516f76173cf62cdf560855.gz new file mode 100644 index 0000000000..6d2058be91 Binary files /dev/null and b/_darcs/patches/20081211225808-efd22-7f21b4588aad028766516f76173cf62cdf560855.gz differ diff --git a/_darcs/patches/20081211231252-5ed1f-ee6e551ed5a029406748120f12e2ff57c4a86493.gz b/_darcs/patches/20081211231252-5ed1f-ee6e551ed5a029406748120f12e2ff57c4a86493.gz new file mode 100644 index 0000000000..9c9694a734 Binary files /dev/null and b/_darcs/patches/20081211231252-5ed1f-ee6e551ed5a029406748120f12e2ff57c4a86493.gz differ diff --git a/_darcs/patches/20081211231925-5ed1f-b01d6ef925de540f4a671c0814d8715127a4c98d.gz b/_darcs/patches/20081211231925-5ed1f-b01d6ef925de540f4a671c0814d8715127a4c98d.gz new file mode 100644 index 0000000000..c62af28ace Binary files /dev/null and b/_darcs/patches/20081211231925-5ed1f-b01d6ef925de540f4a671c0814d8715127a4c98d.gz differ diff --git a/_darcs/patches/20081211232000-5ed1f-5ed2008f6c8273b7fa653396bff090afb10b030e.gz b/_darcs/patches/20081211232000-5ed1f-5ed2008f6c8273b7fa653396bff090afb10b030e.gz new file mode 100644 index 0000000000..f6953ff73e Binary files /dev/null and b/_darcs/patches/20081211232000-5ed1f-5ed2008f6c8273b7fa653396bff090afb10b030e.gz differ diff --git a/_darcs/patches/20081211232811-84dde-658ffc41153b3ffcf7243baa0faa0c3b09a493f0.gz b/_darcs/patches/20081211232811-84dde-658ffc41153b3ffcf7243baa0faa0c3b09a493f0.gz new file mode 100644 index 0000000000..abe3d7faf2 Binary files /dev/null and b/_darcs/patches/20081211232811-84dde-658ffc41153b3ffcf7243baa0faa0c3b09a493f0.gz differ diff --git a/_darcs/patches/20081211232921-84dde-9dba2a8d0fe3aa970f433973ef8c4ddf7c5e8928.gz b/_darcs/patches/20081211232921-84dde-9dba2a8d0fe3aa970f433973ef8c4ddf7c5e8928.gz new file mode 100644 index 0000000000..36957f1543 Binary files /dev/null and b/_darcs/patches/20081211232921-84dde-9dba2a8d0fe3aa970f433973ef8c4ddf7c5e8928.gz differ diff --git a/_darcs/patches/20081211233039-84dde-9bcacf8f114025052a208e1068e58d570db05f15.gz b/_darcs/patches/20081211233039-84dde-9bcacf8f114025052a208e1068e58d570db05f15.gz new file mode 100644 index 0000000000..998e0c8e4a Binary files /dev/null and b/_darcs/patches/20081211233039-84dde-9bcacf8f114025052a208e1068e58d570db05f15.gz differ diff --git a/_darcs/patches/20081211233515-84dde-184e46fdee817baa3df8e066ca49d759f3b1a899.gz b/_darcs/patches/20081211233515-84dde-184e46fdee817baa3df8e066ca49d759f3b1a899.gz new file mode 100644 index 0000000000..30bdaf604c Binary files /dev/null and b/_darcs/patches/20081211233515-84dde-184e46fdee817baa3df8e066ca49d759f3b1a899.gz differ diff --git a/_darcs/patches/20081211234741-84dde-d20d0f7e5e850a2d045fb95f5b75157076f7b7b6.gz b/_darcs/patches/20081211234741-84dde-d20d0f7e5e850a2d045fb95f5b75157076f7b7b6.gz new file mode 100644 index 0000000000..97670ff900 Binary files /dev/null and b/_darcs/patches/20081211234741-84dde-d20d0f7e5e850a2d045fb95f5b75157076f7b7b6.gz differ diff --git a/_darcs/patches/20081211235341-7b5ce-98bae58e267b4e4b0adb5835e5a05e19cd910363.gz b/_darcs/patches/20081211235341-7b5ce-98bae58e267b4e4b0adb5835e5a05e19cd910363.gz new file mode 100644 index 0000000000..0272572402 Binary files /dev/null and b/_darcs/patches/20081211235341-7b5ce-98bae58e267b4e4b0adb5835e5a05e19cd910363.gz differ diff --git a/_darcs/patches/20081212030820-efd22-3ee6f5ab50c821e3da5dd6785abb765af168058a.gz b/_darcs/patches/20081212030820-efd22-3ee6f5ab50c821e3da5dd6785abb765af168058a.gz new file mode 100644 index 0000000000..2ff9676a15 Binary files /dev/null and b/_darcs/patches/20081212030820-efd22-3ee6f5ab50c821e3da5dd6785abb765af168058a.gz differ diff --git a/_darcs/patches/20081212035117-efd22-f829f9470e64ed2e5560f6272db5d1d099bf28cc.gz b/_darcs/patches/20081212035117-efd22-f829f9470e64ed2e5560f6272db5d1d099bf28cc.gz new file mode 100644 index 0000000000..e61a26d2b9 Binary files /dev/null and b/_darcs/patches/20081212035117-efd22-f829f9470e64ed2e5560f6272db5d1d099bf28cc.gz differ diff --git a/_darcs/patches/20081212035255-efd22-534581fa42c74785dcf4333ae4b8513d96718bdd.gz b/_darcs/patches/20081212035255-efd22-534581fa42c74785dcf4333ae4b8513d96718bdd.gz new file mode 100644 index 0000000000..eb3f30c178 Binary files /dev/null and b/_darcs/patches/20081212035255-efd22-534581fa42c74785dcf4333ae4b8513d96718bdd.gz differ diff --git a/_darcs/patches/20081212041543-84dde-47540bac9f755be3101b7e403ae8940c90003f33.gz b/_darcs/patches/20081212041543-84dde-47540bac9f755be3101b7e403ae8940c90003f33.gz new file mode 100644 index 0000000000..2592a7b7b4 Binary files /dev/null and b/_darcs/patches/20081212041543-84dde-47540bac9f755be3101b7e403ae8940c90003f33.gz differ diff --git a/_darcs/patches/20081212043201-84dde-1bf07467f85f743fb5cb4ec92e5b8934bfb49578.gz b/_darcs/patches/20081212043201-84dde-1bf07467f85f743fb5cb4ec92e5b8934bfb49578.gz new file mode 100644 index 0000000000..0a89ca9d7a Binary files /dev/null and b/_darcs/patches/20081212043201-84dde-1bf07467f85f743fb5cb4ec92e5b8934bfb49578.gz differ diff --git a/_darcs/patches/20081212043240-efd22-99f6754e2b76eed06237414955d6c01b4137cba5.gz b/_darcs/patches/20081212043240-efd22-99f6754e2b76eed06237414955d6c01b4137cba5.gz new file mode 100644 index 0000000000..97ef676d44 Binary files /dev/null and b/_darcs/patches/20081212043240-efd22-99f6754e2b76eed06237414955d6c01b4137cba5.gz differ diff --git a/_darcs/patches/20081212044600-84dde-b9fa8240a83457f9ed41c0bcdac4b20aff1f8aed.gz b/_darcs/patches/20081212044600-84dde-b9fa8240a83457f9ed41c0bcdac4b20aff1f8aed.gz new file mode 100644 index 0000000000..c64a2668a8 Binary files /dev/null and b/_darcs/patches/20081212044600-84dde-b9fa8240a83457f9ed41c0bcdac4b20aff1f8aed.gz differ diff --git a/_darcs/patches/20081212051830-84dde-4db7b40c27b20bd37bac261a68bd11051d263c25.gz b/_darcs/patches/20081212051830-84dde-4db7b40c27b20bd37bac261a68bd11051d263c25.gz new file mode 100644 index 0000000000..72d6708348 Binary files /dev/null and b/_darcs/patches/20081212051830-84dde-4db7b40c27b20bd37bac261a68bd11051d263c25.gz differ diff --git a/_darcs/patches/20081212054448-84dde-14b0bdbd5ce2848a171d565bc0b17902ddb10ed3.gz b/_darcs/patches/20081212054448-84dde-14b0bdbd5ce2848a171d565bc0b17902ddb10ed3.gz new file mode 100644 index 0000000000..e96dbe3461 Binary files /dev/null and b/_darcs/patches/20081212054448-84dde-14b0bdbd5ce2848a171d565bc0b17902ddb10ed3.gz differ diff --git a/_darcs/patches/20081212055713-84dde-1b2aa99861ee0ab7c63a48152a5590b4d2f360d9.gz b/_darcs/patches/20081212055713-84dde-1b2aa99861ee0ab7c63a48152a5590b4d2f360d9.gz new file mode 100644 index 0000000000..67b1e0341c Binary files /dev/null and b/_darcs/patches/20081212055713-84dde-1b2aa99861ee0ab7c63a48152a5590b4d2f360d9.gz differ diff --git a/_darcs/patches/20081212062337-efd22-8adadf1810c253e27b573727c2ff5372d264fcd2.gz b/_darcs/patches/20081212062337-efd22-8adadf1810c253e27b573727c2ff5372d264fcd2.gz new file mode 100644 index 0000000000..519d7ea61d Binary files /dev/null and b/_darcs/patches/20081212062337-efd22-8adadf1810c253e27b573727c2ff5372d264fcd2.gz differ diff --git a/_darcs/patches/20081212075617-7b5ce-c56db92d928c58eaa3fed7e4f226e0fca62e2bbf.gz b/_darcs/patches/20081212075617-7b5ce-c56db92d928c58eaa3fed7e4f226e0fca62e2bbf.gz new file mode 100644 index 0000000000..6e0382348d Binary files /dev/null and b/_darcs/patches/20081212075617-7b5ce-c56db92d928c58eaa3fed7e4f226e0fca62e2bbf.gz differ diff --git a/_darcs/patches/20081212174414-84dde-03713508050c326904594057e6e2d3f3b1ca6437.gz b/_darcs/patches/20081212174414-84dde-03713508050c326904594057e6e2d3f3b1ca6437.gz new file mode 100644 index 0000000000..9c738aa429 Binary files /dev/null and b/_darcs/patches/20081212174414-84dde-03713508050c326904594057e6e2d3f3b1ca6437.gz differ diff --git a/_darcs/patches/20081212195520-84dde-d464ee28ab9a9757b889fad437e310056f4c576a.gz b/_darcs/patches/20081212195520-84dde-d464ee28ab9a9757b889fad437e310056f4c576a.gz new file mode 100644 index 0000000000..2307963fc6 Binary files /dev/null and b/_darcs/patches/20081212195520-84dde-d464ee28ab9a9757b889fad437e310056f4c576a.gz differ diff --git a/_darcs/patches/20081214002239-84dde-9d4d15f37b48ed1830c0423e7e34cb11c7cf9c2d.gz b/_darcs/patches/20081214002239-84dde-9d4d15f37b48ed1830c0423e7e34cb11c7cf9c2d.gz new file mode 100644 index 0000000000..c4e119c82b Binary files /dev/null and b/_darcs/patches/20081214002239-84dde-9d4d15f37b48ed1830c0423e7e34cb11c7cf9c2d.gz differ diff --git a/_darcs/patches/20081214161942-84dde-bfb91a534eb01d3e16b364937dcf405277e75a6a.gz b/_darcs/patches/20081214161942-84dde-bfb91a534eb01d3e16b364937dcf405277e75a6a.gz new file mode 100644 index 0000000000..32ac4711f2 Binary files /dev/null and b/_darcs/patches/20081214161942-84dde-bfb91a534eb01d3e16b364937dcf405277e75a6a.gz differ diff --git a/_darcs/patches/20081214204557-84dde-92dbf80aa81d55c9ef23faa14bc209183fdcf883.gz b/_darcs/patches/20081214204557-84dde-92dbf80aa81d55c9ef23faa14bc209183fdcf883.gz new file mode 100644 index 0000000000..0f8feb7f7c Binary files /dev/null and b/_darcs/patches/20081214204557-84dde-92dbf80aa81d55c9ef23faa14bc209183fdcf883.gz differ diff --git a/_darcs/patches/20081215132806-84dde-0319e95259047d652214c151326aff64e746d532.gz b/_darcs/patches/20081215132806-84dde-0319e95259047d652214c151326aff64e746d532.gz new file mode 100644 index 0000000000..ae6b36175f Binary files /dev/null and b/_darcs/patches/20081215132806-84dde-0319e95259047d652214c151326aff64e746d532.gz differ diff --git a/_darcs/patches/20081215134824-84dde-de48c99b6cb45cc461125a7f8f382eb57de0bf28.gz b/_darcs/patches/20081215134824-84dde-de48c99b6cb45cc461125a7f8f382eb57de0bf28.gz new file mode 100644 index 0000000000..7522b79016 Binary files /dev/null and b/_darcs/patches/20081215134824-84dde-de48c99b6cb45cc461125a7f8f382eb57de0bf28.gz differ diff --git a/_darcs/patches/20081215205036-34904-6e03eddcd13c7c882a9e7286edf67a63f5b5124b.gz b/_darcs/patches/20081215205036-34904-6e03eddcd13c7c882a9e7286edf67a63f5b5124b.gz new file mode 100644 index 0000000000..9ccb3fe188 Binary files /dev/null and b/_darcs/patches/20081215205036-34904-6e03eddcd13c7c882a9e7286edf67a63f5b5124b.gz differ diff --git a/_darcs/patches/20081216030455-7b5ce-552516bfb34cb0ae1550787813feb4a4514d6c53.gz b/_darcs/patches/20081216030455-7b5ce-552516bfb34cb0ae1550787813feb4a4514d6c53.gz new file mode 100644 index 0000000000..7ef4940306 Binary files /dev/null and b/_darcs/patches/20081216030455-7b5ce-552516bfb34cb0ae1550787813feb4a4514d6c53.gz differ diff --git a/_darcs/patches/20081216063751-efd22-42fa56ae88c444b80d96c25236733e90f8609fc5.gz b/_darcs/patches/20081216063751-efd22-42fa56ae88c444b80d96c25236733e90f8609fc5.gz new file mode 100644 index 0000000000..b782786a99 Binary files /dev/null and b/_darcs/patches/20081216063751-efd22-42fa56ae88c444b80d96c25236733e90f8609fc5.gz differ diff --git a/_darcs/patches/20081216071818-efd22-d2e59bb60a236538452be356f38d0974f35f0107.gz b/_darcs/patches/20081216071818-efd22-d2e59bb60a236538452be356f38d0974f35f0107.gz new file mode 100644 index 0000000000..0c715eee87 Binary files /dev/null and b/_darcs/patches/20081216071818-efd22-d2e59bb60a236538452be356f38d0974f35f0107.gz differ diff --git a/_darcs/patches/20081220204320-84dde-cc64afc5ad47f07ace499fe932f59f898dd8f0dd.gz b/_darcs/patches/20081220204320-84dde-cc64afc5ad47f07ace499fe932f59f898dd8f0dd.gz new file mode 100644 index 0000000000..2e8a9244e5 Binary files /dev/null and b/_darcs/patches/20081220204320-84dde-cc64afc5ad47f07ace499fe932f59f898dd8f0dd.gz differ diff --git a/_darcs/patches/20081220204852-34904-d63d2050408db9eeaea0af8e81c5b5c9e0c8f227.gz b/_darcs/patches/20081220204852-34904-d63d2050408db9eeaea0af8e81c5b5c9e0c8f227.gz new file mode 100644 index 0000000000..5aa5ab8053 Binary files /dev/null and b/_darcs/patches/20081220204852-34904-d63d2050408db9eeaea0af8e81c5b5c9e0c8f227.gz differ diff --git a/_darcs/patches/20081220204906-34904-cc69d9afe4d4a20e9e07e3bb0b9562aa61e436e8.gz b/_darcs/patches/20081220204906-34904-cc69d9afe4d4a20e9e07e3bb0b9562aa61e436e8.gz new file mode 100644 index 0000000000..bf92d42f76 Binary files /dev/null and b/_darcs/patches/20081220204906-34904-cc69d9afe4d4a20e9e07e3bb0b9562aa61e436e8.gz differ diff --git a/_darcs/patches/20081226051716-7b5ce-82040320785bab9438aa11cf5efa63fa4cba10ae.gz b/_darcs/patches/20081226051716-7b5ce-82040320785bab9438aa11cf5efa63fa4cba10ae.gz new file mode 100644 index 0000000000..11d42fc5b1 Binary files /dev/null and b/_darcs/patches/20081226051716-7b5ce-82040320785bab9438aa11cf5efa63fa4cba10ae.gz differ diff --git a/_darcs/patches/20081228190546-34904-7f0c38f5139a581f3a9e7fd21772b3601450a36b.gz b/_darcs/patches/20081228190546-34904-7f0c38f5139a581f3a9e7fd21772b3601450a36b.gz new file mode 100644 index 0000000000..7bb23cd87f Binary files /dev/null and b/_darcs/patches/20081228190546-34904-7f0c38f5139a581f3a9e7fd21772b3601450a36b.gz differ diff --git a/_darcs/patches/20081231032227-84dde-671346360e569522d5384663d4b808e329d4cf0c.gz b/_darcs/patches/20081231032227-84dde-671346360e569522d5384663d4b808e329d4cf0c.gz new file mode 100644 index 0000000000..a98c1e2011 Binary files /dev/null and b/_darcs/patches/20081231032227-84dde-671346360e569522d5384663d4b808e329d4cf0c.gz differ diff --git a/_darcs/patches/pending b/_darcs/patches/pending new file mode 100644 index 0000000000..2c63c08510 --- /dev/null +++ b/_darcs/patches/pending @@ -0,0 +1,2 @@ +{ +} diff --git a/_darcs/patches/pending.tentative b/_darcs/patches/pending.tentative new file mode 100644 index 0000000000..2c63c08510 --- /dev/null +++ b/_darcs/patches/pending.tentative @@ -0,0 +1,2 @@ +{ +} diff --git a/_darcs/prefs/binaries b/_darcs/prefs/binaries new file mode 100644 index 0000000000..94e7f4b469 --- /dev/null +++ b/_darcs/prefs/binaries @@ -0,0 +1,59 @@ +# Binary file regexps: +\.png$ +\.PNG$ +\.gz$ +\.GZ$ +\.pdf$ +\.PDF$ +\.jpg$ +\.JPG$ +\.jpeg$ +\.JPEG$ +\.gif$ +\.GIF$ +\.tif$ +\.TIF$ +\.tiff$ +\.TIFF$ +\.pnm$ +\.PNM$ +\.pbm$ +\.PBM$ +\.pgm$ +\.PGM$ +\.ppm$ +\.PPM$ +\.bmp$ +\.BMP$ +\.mng$ +\.MNG$ +\.tar$ +\.TAR$ +\.bz2$ +\.BZ2$ +\.z$ +\.Z$ +\.zip$ +\.ZIP$ +\.jar$ +\.JAR$ +\.so$ +\.SO$ +\.a$ +\.A$ +\.tgz$ +\.TGZ$ +\.mpg$ +\.MPG$ +\.mpeg$ +\.MPEG$ +\.iso$ +\.ISO$ +\.exe$ +\.EXE$ +\.doc$ +\.DOC$ +\.elc$ +\.ELC$ +\.pyc$ +\.PYC$ diff --git a/_darcs/prefs/boring b/_darcs/prefs/boring new file mode 100644 index 0000000000..d37927b8c2 --- /dev/null +++ b/_darcs/prefs/boring @@ -0,0 +1,71 @@ +# Boring file regexps: +\.hi$ +\.hi-boot$ +\.o-boot$ +\.o$ +\.o\.cmd$ +\.p_hi$ +\.p_o$ +\.tix$ +\.mod$ +\.installed-pkg-config +\.setup-config +\.setup-config +# *.ko files aren't boring by default because they might +# be Korean translations rather than kernel modules. +# \.ko$ +\.ko\.cmd$ +\.mod\.c$ +(^|/)\.tmp_versions($|/) +(^|/)CVS($|/) +\.cvsignore$ +^\.# +(^|/)RCS($|/) +,v$ +(^|/)\.svn($|/) +(^|/)\.hg($|/) +(^|/)\.git($|/) +\.bzr$ +(^|/)SCCS($|/) +~$ +(^|/)_darcs($|/) +(^|/)\.darcsrepo($|/) +\.bak$ +\.BAK$ +\.orig$ +\.rej$ +(^|/)vssver\.scc$ +\.swp$ +(^|/)MT($|/) +(^|/)\{arch\}($|/) +(^|/).arch-ids($|/) +(^|/), +\.prof$ +(^|/)\.DS_Store$ +(^|/)BitKeeper($|/) +(^|/)ChangeSet($|/) +\.py[co]$ +\.elc$ +\.class$ +\.zwc$ +\.revdep-rebuild.* +\..serverauth.* +\# +(^|/)Thumbs\.db$ +(^|/)autom4te\.cache($|/) +(^|/)config\.(log|status)$ +^\.depend$ +(^|/)(tags|TAGS)$ +#(^|/)\.[^/] +(^|/|\.)core$ +\.(obj|a|exe|so|lo|la)$ +^\.darcs-temp-mail$ +-darcs-backup[[:digit:]]+$ +\.(fas|fasl|sparcf|x86f)$ +\.part$ +(^|/)\.waf-[[:digit:].]+-[[:digit:]]+($|/) +(^|/)\.lock-wscript$ +^\.darcs-temp-mail$ +\_vti_cnf$ +\_vti_pvt$ +\.gitignore$ diff --git a/_darcs/prefs/boring~ b/_darcs/prefs/boring~ new file mode 100644 index 0000000000..6582fbff3b --- /dev/null +++ b/_darcs/prefs/boring~ @@ -0,0 +1,70 @@ +# Boring file regexps: +\.hi$ +\.hi-boot$ +\.o-boot$ +\.o$ +\.o\.cmd$ +\.p_hi$ +\.p_o$ +\.tix$ +\.mod$ +\.installed-pkg-config +\.setup-config +\.setup-config +# *.ko files aren't boring by default because they might +# be Korean translations rather than kernel modules. +# \.ko$ +\.ko\.cmd$ +\.mod\.c$ +(^|/)\.tmp_versions($|/) +(^|/)CVS($|/) +\.cvsignore$ +^\.# +(^|/)RCS($|/) +,v$ +(^|/)\.svn($|/) +(^|/)\.hg($|/) +(^|/)\.git($|/) +\.bzr$ +(^|/)SCCS($|/) +~$ +(^|/)_darcs($|/) +(^|/)\.darcsrepo($|/) +\.bak$ +\.BAK$ +\.orig$ +\.rej$ +(^|/)vssver\.scc$ +\.swp$ +(^|/)MT($|/) +(^|/)\{arch\}($|/) +(^|/).arch-ids($|/) +(^|/), +\.prof$ +(^|/)\.DS_Store$ +(^|/)BitKeeper($|/) +(^|/)ChangeSet($|/) +\.py[co]$ +\.elc$ +\.class$ +\.zwc$ +\.revdep-rebuild.* +\..serverauth.* +\# +(^|/)Thumbs\.db$ +(^|/)autom4te\.cache($|/) +(^|/)config\.(log|status)$ +^\.depend$ +(^|/)(tags|TAGS)$ +#(^|/)\.[^/] +(^|/|\.)core$ +\.(obj|a|exe|so|lo|la)$ +^\.darcs-temp-mail$ +-darcs-backup[[:digit:]]+$ +\.(fas|fasl|sparcf|x86f)$ +\.part$ +(^|/)\.waf-[[:digit:].]+-[[:digit:]]+($|/) +(^|/)\.lock-wscript$ +^\.darcs-temp-mail$ +\_vti_cnf$ +\_vti_pvt$ diff --git a/_darcs/prefs/defaultrepo b/_darcs/prefs/defaultrepo new file mode 100644 index 0000000000..cd3b343a74 --- /dev/null +++ b/_darcs/prefs/defaultrepo @@ -0,0 +1 @@ +/home/evan/Code/laconica.trunk diff --git a/_darcs/prefs/motd b/_darcs/prefs/motd new file mode 100644 index 0000000000..e69de29bb2 diff --git a/_darcs/prefs/repos b/_darcs/prefs/repos new file mode 100644 index 0000000000..86caa0b256 --- /dev/null +++ b/_darcs/prefs/repos @@ -0,0 +1,2 @@ +/home/evan/Code/laconica.repo +/home/evan/Code/laconica.trunk diff --git a/_darcs/pristine/COPYING b/_darcs/pristine/COPYING new file mode 100644 index 0000000000..dba13ed2dd --- /dev/null +++ b/_darcs/pristine/COPYING @@ -0,0 +1,661 @@ + GNU AFFERO GENERAL PUBLIC LICENSE + Version 3, 19 November 2007 + + Copyright (C) 2007 Free Software Foundation, Inc. + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + Preamble + + The GNU Affero General Public License is a free, copyleft license for +software and other kinds of works, specifically designed to ensure +cooperation with the community in the case of network server software. + + The licenses for most software and other practical works are designed +to take away your freedom to share and change the works. By contrast, +our General Public Licenses are intended to guarantee your freedom to +share and change all versions of a program--to make sure it remains free +software for all its users. + + When we speak of free software, we are referring to freedom, not +price. Our General Public Licenses are designed to make sure that you +have the freedom to distribute copies of free software (and charge for +them if you wish), that you receive source code or can get it if you +want it, that you can change the software or use pieces of it in new +free programs, and that you know you can do these things. + + Developers that use our General Public Licenses protect your rights +with two steps: (1) assert copyright on the software, and (2) offer +you this License which gives you legal permission to copy, distribute +and/or modify the software. + + A secondary benefit of defending all users' freedom is that +improvements made in alternate versions of the program, if they +receive widespread use, become available for other developers to +incorporate. Many developers of free software are heartened and +encouraged by the resulting cooperation. However, in the case of +software used on network servers, this result may fail to come about. +The GNU General Public License permits making a modified version and +letting the public access it on a server without ever releasing its +source code to the public. + + The GNU Affero General Public License is designed specifically to +ensure that, in such cases, the modified source code becomes available +to the community. It requires the operator of a network server to +provide the source code of the modified version running there to the +users of that server. Therefore, public use of a modified version, on +a publicly accessible server, gives the public access to the source +code of the modified version. + + An older license, called the Affero General Public License and +published by Affero, was designed to accomplish similar goals. This is +a different license, not a version of the Affero GPL, but Affero has +released a new version of the Affero GPL which permits relicensing under +this license. + + The precise terms and conditions for copying, distribution and +modification follow. + + TERMS AND CONDITIONS + + 0. Definitions. + + "This License" refers to version 3 of the GNU Affero General Public License. + + "Copyright" also means copyright-like laws that apply to other kinds of +works, such as semiconductor masks. + + "The Program" refers to any copyrightable work licensed under this +License. Each licensee is addressed as "you". "Licensees" and +"recipients" may be individuals or organizations. + + To "modify" a work means to copy from or adapt all or part of the work +in a fashion requiring copyright permission, other than the making of an +exact copy. The resulting work is called a "modified version" of the +earlier work or a work "based on" the earlier work. + + A "covered work" means either the unmodified Program or a work based +on the Program. + + To "propagate" a work means to do anything with it that, without +permission, would make you directly or secondarily liable for +infringement under applicable copyright law, except executing it on a +computer or modifying a private copy. Propagation includes copying, +distribution (with or without modification), making available to the +public, and in some countries other activities as well. + + To "convey" a work means any kind of propagation that enables other +parties to make or receive copies. Mere interaction with a user through +a computer network, with no transfer of a copy, is not conveying. + + An interactive user interface displays "Appropriate Legal Notices" +to the extent that it includes a convenient and prominently visible +feature that (1) displays an appropriate copyright notice, and (2) +tells the user that there is no warranty for the work (except to the +extent that warranties are provided), that licensees may convey the +work under this License, and how to view a copy of this License. If +the interface presents a list of user commands or options, such as a +menu, a prominent item in the list meets this criterion. + + 1. Source Code. + + The "source code" for a work means the preferred form of the work +for making modifications to it. "Object code" means any non-source +form of a work. + + A "Standard Interface" means an interface that either is an official +standard defined by a recognized standards body, or, in the case of +interfaces specified for a particular programming language, one that +is widely used among developers working in that language. + + The "System Libraries" of an executable work include anything, other +than the work as a whole, that (a) is included in the normal form of +packaging a Major Component, but which is not part of that Major +Component, and (b) serves only to enable use of the work with that +Major Component, or to implement a Standard Interface for which an +implementation is available to the public in source code form. A +"Major Component", in this context, means a major essential component +(kernel, window system, and so on) of the specific operating system +(if any) on which the executable work runs, or a compiler used to +produce the work, or an object code interpreter used to run it. + + The "Corresponding Source" for a work in object code form means all +the source code needed to generate, install, and (for an executable +work) run the object code and to modify the work, including scripts to +control those activities. However, it does not include the work's +System Libraries, or general-purpose tools or generally available free +programs which are used unmodified in performing those activities but +which are not part of the work. For example, Corresponding Source +includes interface definition files associated with source files for +the work, and the source code for shared libraries and dynamically +linked subprograms that the work is specifically designed to require, +such as by intimate data communication or control flow between those +subprograms and other parts of the work. + + The Corresponding Source need not include anything that users +can regenerate automatically from other parts of the Corresponding +Source. + + The Corresponding Source for a work in source code form is that +same work. + + 2. Basic Permissions. + + All rights granted under this License are granted for the term of +copyright on the Program, and are irrevocable provided the stated +conditions are met. This License explicitly affirms your unlimited +permission to run the unmodified Program. The output from running a +covered work is covered by this License only if the output, given its +content, constitutes a covered work. This License acknowledges your +rights of fair use or other equivalent, as provided by copyright law. + + You may make, run and propagate covered works that you do not +convey, without conditions so long as your license otherwise remains +in force. You may convey covered works to others for the sole purpose +of having them make modifications exclusively for you, or provide you +with facilities for running those works, provided that you comply with +the terms of this License in conveying all material for which you do +not control copyright. Those thus making or running the covered works +for you must do so exclusively on your behalf, under your direction +and control, on terms that prohibit them from making any copies of +your copyrighted material outside their relationship with you. + + Conveying under any other circumstances is permitted solely under +the conditions stated below. Sublicensing is not allowed; section 10 +makes it unnecessary. + + 3. Protecting Users' Legal Rights From Anti-Circumvention Law. + + No covered work shall be deemed part of an effective technological +measure under any applicable law fulfilling obligations under article +11 of the WIPO copyright treaty adopted on 20 December 1996, or +similar laws prohibiting or restricting circumvention of such +measures. + + When you convey a covered work, you waive any legal power to forbid +circumvention of technological measures to the extent such circumvention +is effected by exercising rights under this License with respect to +the covered work, and you disclaim any intention to limit operation or +modification of the work as a means of enforcing, against the work's +users, your or third parties' legal rights to forbid circumvention of +technological measures. + + 4. Conveying Verbatim Copies. + + You may convey verbatim copies of the Program's source code as you +receive it, in any medium, provided that you conspicuously and +appropriately publish on each copy an appropriate copyright notice; +keep intact all notices stating that this License and any +non-permissive terms added in accord with section 7 apply to the code; +keep intact all notices of the absence of any warranty; and give all +recipients a copy of this License along with the Program. + + You may charge any price or no price for each copy that you convey, +and you may offer support or warranty protection for a fee. + + 5. Conveying Modified Source Versions. + + You may convey a work based on the Program, or the modifications to +produce it from the Program, in the form of source code under the +terms of section 4, provided that you also meet all of these conditions: + + a) The work must carry prominent notices stating that you modified + it, and giving a relevant date. + + b) The work must carry prominent notices stating that it is + released under this License and any conditions added under section + 7. This requirement modifies the requirement in section 4 to + "keep intact all notices". + + c) You must license the entire work, as a whole, under this + License to anyone who comes into possession of a copy. This + License will therefore apply, along with any applicable section 7 + additional terms, to the whole of the work, and all its parts, + regardless of how they are packaged. This License gives no + permission to license the work in any other way, but it does not + invalidate such permission if you have separately received it. + + d) If the work has interactive user interfaces, each must display + Appropriate Legal Notices; however, if the Program has interactive + interfaces that do not display Appropriate Legal Notices, your + work need not make them do so. + + A compilation of a covered work with other separate and independent +works, which are not by their nature extensions of the covered work, +and which are not combined with it such as to form a larger program, +in or on a volume of a storage or distribution medium, is called an +"aggregate" if the compilation and its resulting copyright are not +used to limit the access or legal rights of the compilation's users +beyond what the individual works permit. Inclusion of a covered work +in an aggregate does not cause this License to apply to the other +parts of the aggregate. + + 6. Conveying Non-Source Forms. + + You may convey a covered work in object code form under the terms +of sections 4 and 5, provided that you also convey the +machine-readable Corresponding Source under the terms of this License, +in one of these ways: + + a) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by the + Corresponding Source fixed on a durable physical medium + customarily used for software interchange. + + b) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by a + written offer, valid for at least three years and valid for as + long as you offer spare parts or customer support for that product + model, to give anyone who possesses the object code either (1) a + copy of the Corresponding Source for all the software in the + product that is covered by this License, on a durable physical + medium customarily used for software interchange, for a price no + more than your reasonable cost of physically performing this + conveying of source, or (2) access to copy the + Corresponding Source from a network server at no charge. + + c) Convey individual copies of the object code with a copy of the + written offer to provide the Corresponding Source. This + alternative is allowed only occasionally and noncommercially, and + only if you received the object code with such an offer, in accord + with subsection 6b. + + d) Convey the object code by offering access from a designated + place (gratis or for a charge), and offer equivalent access to the + Corresponding Source in the same way through the same place at no + further charge. You need not require recipients to copy the + Corresponding Source along with the object code. If the place to + copy the object code is a network server, the Corresponding Source + may be on a different server (operated by you or a third party) + that supports equivalent copying facilities, provided you maintain + clear directions next to the object code saying where to find the + Corresponding Source. Regardless of what server hosts the + Corresponding Source, you remain obligated to ensure that it is + available for as long as needed to satisfy these requirements. + + e) Convey the object code using peer-to-peer transmission, provided + you inform other peers where the object code and Corresponding + Source of the work are being offered to the general public at no + charge under subsection 6d. + + A separable portion of the object code, whose source code is excluded +from the Corresponding Source as a System Library, need not be +included in conveying the object code work. + + A "User Product" is either (1) a "consumer product", which means any +tangible personal property which is normally used for personal, family, +or household purposes, or (2) anything designed or sold for incorporation +into a dwelling. In determining whether a product is a consumer product, +doubtful cases shall be resolved in favor of coverage. For a particular +product received by a particular user, "normally used" refers to a +typical or common use of that class of product, regardless of the status +of the particular user or of the way in which the particular user +actually uses, or expects or is expected to use, the product. A product +is a consumer product regardless of whether the product has substantial +commercial, industrial or non-consumer uses, unless such uses represent +the only significant mode of use of the product. + + "Installation Information" for a User Product means any methods, +procedures, authorization keys, or other information required to install +and execute modified versions of a covered work in that User Product from +a modified version of its Corresponding Source. The information must +suffice to ensure that the continued functioning of the modified object +code is in no case prevented or interfered with solely because +modification has been made. + + If you convey an object code work under this section in, or with, or +specifically for use in, a User Product, and the conveying occurs as +part of a transaction in which the right of possession and use of the +User Product is transferred to the recipient in perpetuity or for a +fixed term (regardless of how the transaction is characterized), the +Corresponding Source conveyed under this section must be accompanied +by the Installation Information. But this requirement does not apply +if neither you nor any third party retains the ability to install +modified object code on the User Product (for example, the work has +been installed in ROM). + + The requirement to provide Installation Information does not include a +requirement to continue to provide support service, warranty, or updates +for a work that has been modified or installed by the recipient, or for +the User Product in which it has been modified or installed. Access to a +network may be denied when the modification itself materially and +adversely affects the operation of the network or violates the rules and +protocols for communication across the network. + + Corresponding Source conveyed, and Installation Information provided, +in accord with this section must be in a format that is publicly +documented (and with an implementation available to the public in +source code form), and must require no special password or key for +unpacking, reading or copying. + + 7. Additional Terms. + + "Additional permissions" are terms that supplement the terms of this +License by making exceptions from one or more of its conditions. +Additional permissions that are applicable to the entire Program shall +be treated as though they were included in this License, to the extent +that they are valid under applicable law. If additional permissions +apply only to part of the Program, that part may be used separately +under those permissions, but the entire Program remains governed by +this License without regard to the additional permissions. + + When you convey a copy of a covered work, you may at your option +remove any additional permissions from that copy, or from any part of +it. (Additional permissions may be written to require their own +removal in certain cases when you modify the work.) You may place +additional permissions on material, added by you to a covered work, +for which you have or can give appropriate copyright permission. + + Notwithstanding any other provision of this License, for material you +add to a covered work, you may (if authorized by the copyright holders of +that material) supplement the terms of this License with terms: + + a) Disclaiming warranty or limiting liability differently from the + terms of sections 15 and 16 of this License; or + + b) Requiring preservation of specified reasonable legal notices or + author attributions in that material or in the Appropriate Legal + Notices displayed by works containing it; or + + c) Prohibiting misrepresentation of the origin of that material, or + requiring that modified versions of such material be marked in + reasonable ways as different from the original version; or + + d) Limiting the use for publicity purposes of names of licensors or + authors of the material; or + + e) Declining to grant rights under trademark law for use of some + trade names, trademarks, or service marks; or + + f) Requiring indemnification of licensors and authors of that + material by anyone who conveys the material (or modified versions of + it) with contractual assumptions of liability to the recipient, for + any liability that these contractual assumptions directly impose on + those licensors and authors. + + All other non-permissive additional terms are considered "further +restrictions" within the meaning of section 10. If the Program as you +received it, or any part of it, contains a notice stating that it is +governed by this License along with a term that is a further +restriction, you may remove that term. If a license document contains +a further restriction but permits relicensing or conveying under this +License, you may add to a covered work material governed by the terms +of that license document, provided that the further restriction does +not survive such relicensing or conveying. + + If you add terms to a covered work in accord with this section, you +must place, in the relevant source files, a statement of the +additional terms that apply to those files, or a notice indicating +where to find the applicable terms. + + Additional terms, permissive or non-permissive, may be stated in the +form of a separately written license, or stated as exceptions; +the above requirements apply either way. + + 8. Termination. + + You may not propagate or modify a covered work except as expressly +provided under this License. Any attempt otherwise to propagate or +modify it is void, and will automatically terminate your rights under +this License (including any patent licenses granted under the third +paragraph of section 11). + + However, if you cease all violation of this License, then your +license from a particular copyright holder is reinstated (a) +provisionally, unless and until the copyright holder explicitly and +finally terminates your license, and (b) permanently, if the copyright +holder fails to notify you of the violation by some reasonable means +prior to 60 days after the cessation. + + Moreover, your license from a particular copyright holder is +reinstated permanently if the copyright holder notifies you of the +violation by some reasonable means, this is the first time you have +received notice of violation of this License (for any work) from that +copyright holder, and you cure the violation prior to 30 days after +your receipt of the notice. + + Termination of your rights under this section does not terminate the +licenses of parties who have received copies or rights from you under +this License. If your rights have been terminated and not permanently +reinstated, you do not qualify to receive new licenses for the same +material under section 10. + + 9. Acceptance Not Required for Having Copies. + + You are not required to accept this License in order to receive or +run a copy of the Program. Ancillary propagation of a covered work +occurring solely as a consequence of using peer-to-peer transmission +to receive a copy likewise does not require acceptance. However, +nothing other than this License grants you permission to propagate or +modify any covered work. These actions infringe copyright if you do +not accept this License. Therefore, by modifying or propagating a +covered work, you indicate your acceptance of this License to do so. + + 10. Automatic Licensing of Downstream Recipients. + + Each time you convey a covered work, the recipient automatically +receives a license from the original licensors, to run, modify and +propagate that work, subject to this License. You are not responsible +for enforcing compliance by third parties with this License. + + An "entity transaction" is a transaction transferring control of an +organization, or substantially all assets of one, or subdividing an +organization, or merging organizations. If propagation of a covered +work results from an entity transaction, each party to that +transaction who receives a copy of the work also receives whatever +licenses to the work the party's predecessor in interest had or could +give under the previous paragraph, plus a right to possession of the +Corresponding Source of the work from the predecessor in interest, if +the predecessor has it or can get it with reasonable efforts. + + You may not impose any further restrictions on the exercise of the +rights granted or affirmed under this License. For example, you may +not impose a license fee, royalty, or other charge for exercise of +rights granted under this License, and you may not initiate litigation +(including a cross-claim or counterclaim in a lawsuit) alleging that +any patent claim is infringed by making, using, selling, offering for +sale, or importing the Program or any portion of it. + + 11. Patents. + + A "contributor" is a copyright holder who authorizes use under this +License of the Program or a work on which the Program is based. The +work thus licensed is called the contributor's "contributor version". + + A contributor's "essential patent claims" are all patent claims +owned or controlled by the contributor, whether already acquired or +hereafter acquired, that would be infringed by some manner, permitted +by this License, of making, using, or selling its contributor version, +but do not include claims that would be infringed only as a +consequence of further modification of the contributor version. For +purposes of this definition, "control" includes the right to grant +patent sublicenses in a manner consistent with the requirements of +this License. + + Each contributor grants you a non-exclusive, worldwide, royalty-free +patent license under the contributor's essential patent claims, to +make, use, sell, offer for sale, import and otherwise run, modify and +propagate the contents of its contributor version. + + In the following three paragraphs, a "patent license" is any express +agreement or commitment, however denominated, not to enforce a patent +(such as an express permission to practice a patent or covenant not to +sue for patent infringement). To "grant" such a patent license to a +party means to make such an agreement or commitment not to enforce a +patent against the party. + + If you convey a covered work, knowingly relying on a patent license, +and the Corresponding Source of the work is not available for anyone +to copy, free of charge and under the terms of this License, through a +publicly available network server or other readily accessible means, +then you must either (1) cause the Corresponding Source to be so +available, or (2) arrange to deprive yourself of the benefit of the +patent license for this particular work, or (3) arrange, in a manner +consistent with the requirements of this License, to extend the patent +license to downstream recipients. "Knowingly relying" means you have +actual knowledge that, but for the patent license, your conveying the +covered work in a country, or your recipient's use of the covered work +in a country, would infringe one or more identifiable patents in that +country that you have reason to believe are valid. + + If, pursuant to or in connection with a single transaction or +arrangement, you convey, or propagate by procuring conveyance of, a +covered work, and grant a patent license to some of the parties +receiving the covered work authorizing them to use, propagate, modify +or convey a specific copy of the covered work, then the patent license +you grant is automatically extended to all recipients of the covered +work and works based on it. + + A patent license is "discriminatory" if it does not include within +the scope of its coverage, prohibits the exercise of, or is +conditioned on the non-exercise of one or more of the rights that are +specifically granted under this License. You may not convey a covered +work if you are a party to an arrangement with a third party that is +in the business of distributing software, under which you make payment +to the third party based on the extent of your activity of conveying +the work, and under which the third party grants, to any of the +parties who would receive the covered work from you, a discriminatory +patent license (a) in connection with copies of the covered work +conveyed by you (or copies made from those copies), or (b) primarily +for and in connection with specific products or compilations that +contain the covered work, unless you entered into that arrangement, +or that patent license was granted, prior to 28 March 2007. + + Nothing in this License shall be construed as excluding or limiting +any implied license or other defenses to infringement that may +otherwise be available to you under applicable patent law. + + 12. No Surrender of Others' Freedom. + + If conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot convey a +covered work so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you may +not convey it at all. For example, if you agree to terms that obligate you +to collect a royalty for further conveying from those to whom you convey +the Program, the only way you could satisfy both those terms and this +License would be to refrain entirely from conveying the Program. + + 13. Remote Network Interaction; Use with the GNU General Public License. + + Notwithstanding any other provision of this License, if you modify the +Program, your modified version must prominently offer all users +interacting with it remotely through a computer network (if your version +supports such interaction) an opportunity to receive the Corresponding +Source of your version by providing access to the Corresponding Source +from a network server at no charge, through some standard or customary +means of facilitating copying of software. This Corresponding Source +shall include the Corresponding Source for any work covered by version 3 +of the GNU General Public License that is incorporated pursuant to the +following paragraph. + + Notwithstanding any other provision of this License, you have +permission to link or combine any covered work with a work licensed +under version 3 of the GNU General Public License into a single +combined work, and to convey the resulting work. The terms of this +License will continue to apply to the part which is the covered work, +but the work with which it is combined will remain governed by version +3 of the GNU General Public License. + + 14. Revised Versions of this License. + + The Free Software Foundation may publish revised and/or new versions of +the GNU Affero General Public License from time to time. Such new versions +will be similar in spirit to the present version, but may differ in detail to +address new problems or concerns. + + Each version is given a distinguishing version number. If the +Program specifies that a certain numbered version of the GNU Affero General +Public License "or any later version" applies to it, you have the +option of following the terms and conditions either of that numbered +version or of any later version published by the Free Software +Foundation. If the Program does not specify a version number of the +GNU Affero General Public License, you may choose any version ever published +by the Free Software Foundation. + + If the Program specifies that a proxy can decide which future +versions of the GNU Affero General Public License can be used, that proxy's +public statement of acceptance of a version permanently authorizes you +to choose that version for the Program. + + Later license versions may give you additional or different +permissions. However, no additional obligations are imposed on any +author or copyright holder as a result of your choosing to follow a +later version. + + 15. Disclaimer of Warranty. + + THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY +APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT +HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY +OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, +THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM +IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF +ALL NECESSARY SERVICING, REPAIR OR CORRECTION. + + 16. Limitation of Liability. + + IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING +WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS +THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY +GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE +USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF +DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD +PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), +EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF +SUCH DAMAGES. + + 17. Interpretation of Sections 15 and 16. + + If the disclaimer of warranty and limitation of liability provided +above cannot be given local legal effect according to their terms, +reviewing courts shall apply local law that most closely approximates +an absolute waiver of all civil liability in connection with the +Program, unless a warranty or assumption of liability accompanies a +copy of the Program in return for a fee. + + END OF TERMS AND CONDITIONS + + How to Apply These Terms to Your New Programs + + If you develop a new program, and you want it to be of the greatest +possible use to the public, the best way to achieve this is to make it +free software which everyone can redistribute and change under these terms. + + To do so, attach the following notices to the program. It is safest +to attach them to the start of each source file to most effectively +state the exclusion of warranty; and each file should have at least +the "copyright" line and a pointer to where the full notice is found. + + + Copyright (C) + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU Affero General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU Affero General Public License for more details. + + You should have received a copy of the GNU Affero General Public License + along with this program. If not, see . + +Also add information on how to contact you by electronic and paper mail. + + If your software can interact with users remotely through a computer +network, you should also make sure that it provides a way for users to +get its source. For example, if your program is a web application, its +interface could display a "Source" link that leads users to an archive +of the code. There are many ways you could offer source, and different +solutions will be better for different programs; see section 13 for the +specific requirements. + + You should also get your employer (if you work as a programmer) or school, +if any, to sign a "copyright disclaimer" for the program, if necessary. +For more information on this, and how to apply and follow the GNU AGPL, see +. diff --git a/_darcs/pristine/README b/_darcs/pristine/README new file mode 100644 index 0000000000..a3ea5fa585 --- /dev/null +++ b/_darcs/pristine/README @@ -0,0 +1,1162 @@ +------ +README +------ + +Laconica 0.6.4 ("Catapult") +11 December 2008 + +This is the README file for Laconica, the Open Source microblogging +platform. It includes installation instructions, descriptions of +options you can set, warnings, tips, and general info for +administrators. Information on using Laconica can be found in the +"doc" subdirectory or in the "help" section on-line. + +About +===== + +Laconica (pronounced "luh-KAWN-ih-kuh") is a Free and Open Source +microblogging platform. It helps people in a community, company or +group to exchange short (140 character) messages over the Web. Users +can choose which people to "follow" and receive only their friends' or +colleagues' status messages. It provides a similar service to sites +like Twitter, Jaiku, Pownce and Plurk. + +With a little work, status messages can be sent to mobile phones, +instant messenger programs (GTalk/Jabber), and specially-designed +desktop clients that support the Twitter API. + +Laconica supports an open standard called OpenMicroBlogging +(http://openmicroblogging.org/) that lets users on different Web sites +or in different companies subscribe to each others' notices. It +enables a distributed social network spread all across the Web. + +Laconica was originally developed for the Open Software Service, +Identi.ca (http://identi.ca/). It is shared with you in hope that you +too make an Open Software Service available to your users. To learn +more, please see the Open Software Service Definition 1.0: + + http://www.openknowledge.org/ossd + +License +======= + +This program is free software: you can redistribute it and/or modify +it under the terms of the GNU Affero General Public License as +published by the Free Software Foundation, either version 3 of the +License, or (at your option) any later version. + +This program is distributed in the hope that it will be useful, but +WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +Affero General Public License for more details. + +You should have received a copy of the GNU Affero General Public +License along with this program, in the file "COPYING". If not, see +. + + IMPORTANT NOTE: The GNU Affero General Public License (AGPL) has + *different requirements* from the "regular" GPL. In particular, if + you make modifications to the Laconica source code on your server, + you *MUST MAKE AVAILABLE* the modified version of the source code + to your users under the same license. This is a legal requirement + of using the software, and if you do not wish to share your + modifications, *YOU MAY NOT INSTALL LACONICA*. + +Additional library software has been made available in the 'extlib' +directory. All of it is Free Software and can be distributed under +liberal terms, but those terms may differ in detail from the AGPL's +particulars. See each package's license file in the extlib directory +for additional terms. + +New this version +================ + +This is a minor feature and security improvement version from version +0.6.3 (release 24 Nov 2008). Notable features of version 0.6.4 include: + +- "private" installs won't show any data to the outside world; redirect + non-logged-in users to login. (See "Private" below) +- Ability to "block" a subscriber, which forces them to unsubscribe, + doesn't allow them to subscribe again, and doesn't allow them to send + @-replies +- Fine-grained control of subscriptions; users can choose not to receive + notices from other users over SMS, or IM, or both +- support for Mozilla microsummaries + (https://wiki.mozilla.org/Microsummaries) +- more efficient support for blacklisting users from the public page +- instructions on the public page for people who aren't logged in +- better registration instructions +- a check for license compatibility in receiving OMB notices +- HTML output in RSS 1.0, 2.0, and Atom feeds +- tuned and more reliable 'rememberme' cookies for username/password + and OpenID logins +- a utility for setting user passwords +- a "ban" configuration variable to ban certain users from posting + notices +- an configurable posting throttle to keep any one user from flooding + the site with messages. +- fine-tuned url-shortening: only shorten if it's needed, only expand + certain URLs, and handle failure of URL-shortening services reliably +- disable Ajax input for notices, subscribe, nudge, while the + request is processing +- early implementation of support for Last-Modified and ETag-based + caching +- initial microformats support +- redirect on bad nicknames in URLs +- correctly send emails in recipient's, not sender's, language +- correct email content type +- Change "Most Favorited" page to "Popular" +- properly support the "since" parameter in API calls +- Fix for changes in validate_credentials API call for the Twitter + bridge +- Fix for fatal error when sending email confirmation on registration +- Better replies for commands sent through the Ajax channel +- Add a User-Agent string for OMB requests +- Upgrade upstream library XMPPHP +- Upgrade upstream library JQuery Forms +- Code cleanup: checkboxes have proper

    '; + + $cnt = 0; + + while ($notice->fetch() && $cnt <= NOTICES_PER_PAGE) { + $cnt++; + + if ($cnt > NOTICES_PER_PAGE) { + break; + } + + echo $this->render_notice($notice); + } + + echo '
      '; + + $this->pagination($page > 1, $cnt > NOTICES_PER_PAGE, + $page, 'index.php', array('nickname' => $user->nickname)); + + } + +} diff --git a/_darcs/pristine/actions/facebookinvite.php b/_darcs/pristine/actions/facebookinvite.php new file mode 100644 index 0000000000..68b351fb93 --- /dev/null +++ b/_darcs/pristine/actions/facebookinvite.php @@ -0,0 +1,46 @@ +. + */ + +if (!defined('LACONICA')) { exit(1); } + +require_once(INSTALLDIR.'/lib/facebookaction.php'); + +class FacebookinviteAction extends FacebookAction { + + function handle($args) { + parent::handle($args); + + $this->display(); + } + + function display() { + + $facebook = $this->get_facebook(); + + $fbuid = $facebook->require_login(); + + $this->show_header('Invite'); + + echo '

      Coming soon...

      '; + + $this->show_footer(); + + } + +} diff --git a/_darcs/pristine/actions/facebookremove.php b/_darcs/pristine/actions/facebookremove.php new file mode 100644 index 0000000000..2a7bdd03e0 --- /dev/null +++ b/_darcs/pristine/actions/facebookremove.php @@ -0,0 +1,65 @@ +. + */ + +if (!defined('LACONICA')) { exit(1); } + +require_once(INSTALLDIR.'/lib/facebookaction.php'); + +class FacebookremoveAction extends FacebookAction { + + function handle($args) { + parent::handle($args); + + $secret = common_config('facebook', 'secret'); + + $sig = ''; + + ksort($_POST); + + foreach ($_POST as $key => $val) { + if (substr($key, 0, 7) == 'fb_sig_') { + $sig .= substr($key, 7) . '=' . $val; + } + } + + $sig .= $secret; + $verify = md5($sig); + + if ($verify == $this->arg('fb_sig')) { + + $flink = Foreign_link::getByForeignID($this->arg('fb_sig_user'), 2); + + common_debug("Removing foreign link to Facebook - local user ID: $flink->user_id, Facebook ID: $flink->foreign_id"); + + $result = $flink->delete(); + + if (!$result) { + common_log_db_error($flink, 'DELETE', __FILE__); + common_server_error(_('Couldn\'t remove Facebook user.')); + return; + } + + } else { + # Someone bad tried to remove facebook link? + common_log(LOG_ERR, "Someone from $_SERVER[REMOTE_ADDR] " . + 'unsuccessfully tried to remove a foreign link to Facebook!'); + } + } + +} diff --git a/_darcs/pristine/actions/facebooksettings.php b/_darcs/pristine/actions/facebooksettings.php new file mode 100644 index 0000000000..4d7000d605 --- /dev/null +++ b/_darcs/pristine/actions/facebooksettings.php @@ -0,0 +1,52 @@ +. + */ + +if (!defined('LACONICA')) { exit(1); } + +require_once(INSTALLDIR.'/lib/facebookaction.php'); + +class FacebooksettingsAction extends FacebookAction { + + function handle($args) { + parent::handle($args); + + $this->display(); + } + + function display() { + + $facebook = $this->get_facebook(); + + $fbuid = $facebook->require_login(); + + $fbml = '' + .'

      Add an Identi.ca box to your profile!

      ' + .'' + .'
      '; + + + $this->show_header('Settings'); + + echo $fbml; + + $this->show_footer(); + + } + +} diff --git a/_darcs/pristine/actions/favor.php b/_darcs/pristine/actions/favor.php new file mode 100644 index 0000000000..aede32902e --- /dev/null +++ b/_darcs/pristine/actions/favor.php @@ -0,0 +1,94 @@ +. + */ + +if (!defined('LACONICA')) { exit(1); } + +require_once(INSTALLDIR.'/lib/mail.php'); + +class FavorAction extends Action { + + function handle($args) { + parent::handle($args); + + if (!common_logged_in()) { + common_user_error(_('Not logged in.')); + return; + } + + $user = common_current_user(); + + if ($_SERVER['REQUEST_METHOD'] != 'POST') { + common_redirect(common_local_url('showfavorites', array('nickname' => $user->nickname))); + return; + } + + $id = $this->trimmed('notice'); + + $notice = Notice::staticGet($id); + + # CSRF protection + + $token = $this->trimmed('token-'.$notice->id); + if (!$token || $token != common_session_token()) { + $this->client_error(_("There was a problem with your session token. Try again, please.")); + return; + } + + if ($user->hasFave($notice)) { + $this->client_error(_('This notice is already a favorite!')); + return; + } + + $fave = Fave::addNew($user, $notice); + + if (!$fave) { + $this->server_error(_('Could not create favorite.')); + return; + } + + $this->notify($fave, $notice, $user); + $user->blowFavesCache(); + + if ($this->boolean('ajax')) { + common_start_html('text/xml;charset=utf-8', true); + common_element_start('head'); + common_element('title', null, _('Disfavor favorite')); + common_element_end('head'); + common_element_start('body'); + common_disfavor_form($notice); + common_element_end('body'); + common_element_end('html'); + } else { + common_redirect(common_local_url('showfavorites', + array('nickname' => $user->nickname))); + } + } + + function notify($fave, $notice, $user) { + $other = User::staticGet('id', $notice->profile_id); + if ($other && $other->id != $user->id) { + if ($other->email && $other->emailnotifyfav) { + mail_notify_fave($other, $user, $notice); + } + # XXX: notify by IM + # XXX: notify by SMS + } + } + +} diff --git a/_darcs/pristine/actions/favorited.php b/_darcs/pristine/actions/favorited.php new file mode 100644 index 0000000000..dc8070d060 --- /dev/null +++ b/_darcs/pristine/actions/favorited.php @@ -0,0 +1,99 @@ +. + */ + +if (!defined('LACONICA')) { exit(1); } + +require_once(INSTALLDIR.'/lib/stream.php'); + +class FavoritedAction extends StreamAction { + + function handle($args) { + parent::handle($args); + + $page = ($this->arg('page')) ? ($this->arg('page')+0) : 1; + + common_show_header(_('Popular notices'), + array($this, 'show_header'), NULL, + array($this, 'show_top')); + + $this->show_notices($page); + + common_show_footer(); + } + + function show_top() { + $instr = $this->get_instructions(); + $output = common_markup_to_html($instr); + common_element_start('div', 'instructions'); + common_raw($output); + common_element_end('div'); + $this->public_views_menu(); + } + + function show_header() { + return; + } + + function get_instructions() { + return _('Showing recently popular notices'); + } + + function show_notices($page) { + + $qry = 'SELECT notice.*, sum(exp(-(now() - fave.modified) / %s)) as weight ' . + 'FROM notice JOIN fave ON notice.id = fave.notice_id ' . + 'GROUP BY fave.notice_id ' . + 'ORDER BY weight DESC'; + + $offset = ($page - 1) * NOTICES_PER_PAGE; + $limit = NOTICES_PER_PAGE + 1; + + if (common_config('db','type') == 'pgsql') { + $qry .= ' LIMIT ' . $limit . ' OFFSET ' . $offset; + } else { + $qry .= ' LIMIT ' . $offset . ', ' . $limit; + } + + # Figure out how to cache this query + + $notice = new Notice; + $notice->query(sprintf($qry, common_config('popular', 'dropoff'))); + + common_element_start('ul', array('id' => 'notices')); + + $cnt = 0; + + while ($notice->fetch() && $cnt <= NOTICES_PER_PAGE) { + $cnt++; + + if ($cnt > NOTICES_PER_PAGE) { + break; + } + + $item = new NoticeListItem($notice); + $item->show(); + } + + common_element_end('ul'); + + common_pagination($page > 1, $cnt > NOTICES_PER_PAGE, + $page, 'favorited'); + } + +} diff --git a/_darcs/pristine/actions/favoritesrss.php b/_darcs/pristine/actions/favoritesrss.php new file mode 100644 index 0000000000..25dd3861fa --- /dev/null +++ b/_darcs/pristine/actions/favoritesrss.php @@ -0,0 +1,73 @@ +. + */ + +if (!defined('LACONICA')) { exit(1); } + +require_once(INSTALLDIR.'/lib/rssaction.php'); + +// Formatting of RSS handled by Rss10Action + +class FavoritesrssAction extends Rss10Action { + + var $user = NULL; + + function init() { + $nickname = $this->trimmed('nickname'); + $this->user = User::staticGet('nickname', $nickname); + + if (!$this->user) { + common_user_error(_('No such user.')); + return false; + } else { + return true; + } + } + + function get_notices($limit=0) { + + $user = $this->user; + + $notice = $user->favoriteNotices(0, $limit); + + $notices = array(); + + while ($notice->fetch()) { + $notices[] = clone($notice); + } + + return $notices; + } + + function get_channel() { + $user = $this->user; + $c = array('url' => common_local_url('favoritesrss', + array('nickname' => + $user->nickname)), + 'title' => sprintf(_("%s favorite notices"), $user->nickname), + 'link' => common_local_url('showfavorites', + array('nickname' => + $user->nickname)), + 'description' => sprintf(_('Feed of favorite notices of %s'), $user->nickname)); + return $c; + } + + function get_image() { + return NULL; + } +} \ No newline at end of file diff --git a/_darcs/pristine/actions/featured.php b/_darcs/pristine/actions/featured.php new file mode 100644 index 0000000000..96fbd89ab7 --- /dev/null +++ b/_darcs/pristine/actions/featured.php @@ -0,0 +1,102 @@ +. + */ + +if (!defined('LACONICA')) { exit(1); } + +require_once(INSTALLDIR.'/lib/stream.php'); +require_once(INSTALLDIR.'/lib/profilelist.php'); + +class FeaturedAction extends StreamAction { + + function handle($args) { + parent::handle($args); + + $page = ($this->arg('page')) ? ($this->arg('page')+0) : 1; + + common_show_header(_('Featured users'), + array($this, 'show_header'), NULL, + array($this, 'show_top')); + + $this->show_notices($page); + + common_show_footer(); + } + + function show_top() { + $instr = $this->get_instructions(); + $output = common_markup_to_html($instr); + common_element_start('div', 'instructions'); + common_raw($output); + common_element_end('div'); + $this->public_views_menu(); + } + + function show_header() { + } + + function get_instructions() { + return _('Featured users'); + } + + function show_notices($page) { + + // XXX: Note I'm doing it this two-stage way because a raw query + // with a JOIN was *not* working. --Zach + + $featured_nicks = common_config('nickname', 'featured'); + + if (count($featured_nicks) > 0) { + + $quoted = array(); + + foreach ($featured_nicks as $nick) { + $quoted[] = "'$nick'"; + } + + $user = new User; + $user->whereAdd(sprintf('nickname IN (%s)', implode(',', $quoted))); + $user->limit(($page - 1) * PROFILES_PER_PAGE, PROFILES_PER_PAGE + 1); + $user->orderBy('user.nickname ASC'); + + $user->find(); + + $profile_ids = array(); + + while ($user->fetch()) { + $profile_ids[] = $user->id; + } + + $profile = new Profile; + $profile->whereAdd(sprintf('profile.id IN (%s)', implode(',', $profile_ids))); + $profile->orderBy('nickname ASC'); + + $cnt = $profile->find(); + + if ($cnt > 0) { + $featured = new ProfileList($profile); + $featured->show_list(); + } + + $profile->free(); + + common_pagination($page > 1, $cnt > PROFILES_PER_PAGE, $page, 'featured'); + } + } + +} \ No newline at end of file diff --git a/_darcs/pristine/actions/finishaddopenid.php b/_darcs/pristine/actions/finishaddopenid.php new file mode 100644 index 0000000000..54d81b0b4e --- /dev/null +++ b/_darcs/pristine/actions/finishaddopenid.php @@ -0,0 +1,103 @@ +. + */ + +if (!defined('LACONICA')) { exit(1); } + +require_once(INSTALLDIR.'/lib/openid.php'); + +class FinishaddopenidAction extends Action { + + function handle($args) { + parent::handle($args); + if (!common_logged_in()) { + common_user_error(_('Not logged in.')); + } else { + $this->try_login(); + } + } + + function try_login() { + + $consumer =& oid_consumer(); + + $response = $consumer->complete(common_local_url('finishaddopenid')); + + if ($response->status == Auth_OpenID_CANCEL) { + $this->message(_('OpenID authentication cancelled.')); + return; + } else if ($response->status == Auth_OpenID_FAILURE) { + // Authentication failed; display the error message. + $this->message(sprintf(_('OpenID authentication failed: %s'), $response->message)); + } else if ($response->status == Auth_OpenID_SUCCESS) { + + $display = $response->getDisplayIdentifier(); + $canonical = ($response->endpoint && $response->endpoint->canonicalID) ? + $response->endpoint->canonicalID : $display; + + $sreg_resp = Auth_OpenID_SRegResponse::fromSuccessResponse($response); + + if ($sreg_resp) { + $sreg = $sreg_resp->contents(); + } + + $cur =& common_current_user(); + $other = oid_get_user($canonical); + + if ($other) { + if ($other->id == $cur->id) { + $this->message(_('You already have this OpenID!')); + } else { + $this->message(_('Someone else already has this OpenID.')); + } + return; + } + + # start a transaction + + $cur->query('BEGIN'); + + $result = oid_link_user($cur->id, $canonical, $display); + + if (!$result) { + $this->message(_('Error connecting user.')); + return; + } + if ($sreg) { + if (!oid_update_user($cur, $sreg)) { + $this->message(_('Error updating profile')); + return; + } + } + + # success! + + $cur->query('COMMIT'); + + oid_set_last($display); + + common_redirect(common_local_url('openidsettings')); + } + } + + function message($msg) { + common_show_header(_('OpenID Login')); + common_element('p', NULL, $msg); + common_show_footer(); + } +} diff --git a/_darcs/pristine/actions/finishimmediate.php b/_darcs/pristine/actions/finishimmediate.php new file mode 100644 index 0000000000..6dbaa3d1c6 --- /dev/null +++ b/_darcs/pristine/actions/finishimmediate.php @@ -0,0 +1,65 @@ +. + */ + +if (!defined('LACONICA')) { exit(1); } + +require_once(INSTALLDIR.'/lib/openid.php'); + +class FinishimmediateAction extends Action { + + function handle($args) { + parent::handle($args); + + $consumer = oid_consumer(); + + $response = $consumer->complete(common_local_url('finishimmediate')); + + if ($response->status == Auth_OpenID_SUCCESS) { + $display = $response->getDisplayIdentifier(); + $canonical = ($response->endpoint->canonicalID) ? + $response->endpoint->canonicalID : $response->getDisplayIdentifier(); + + $user = oid_get_user($canonical); + + if ($user) { + oid_update_user($user, $sreg); + oid_set_last($display); # refresh for another year + common_set_user($user->nickname); + $this->go_backto(); + return; + } + } + + # Failure! Clear openid so we don't try it again + + oid_clear_last(); + $this->go_backto(); + return; + } + + function go_backto() { + common_ensure_session(); + $backto = $_SESSION['openid_immediate_backto']; + if (!$backto) { + # gar. Well, push them to the public page + $backto = common_local_url('public'); + } + common_redirect($backto); + } +} diff --git a/_darcs/pristine/actions/finishopenidlogin.php b/_darcs/pristine/actions/finishopenidlogin.php new file mode 100644 index 0000000000..766a08b208 --- /dev/null +++ b/_darcs/pristine/actions/finishopenidlogin.php @@ -0,0 +1,436 @@ +. + */ + +if (!defined('LACONICA')) { exit(1); } + +require_once(INSTALLDIR.'/lib/openid.php'); + +class FinishopenidloginAction extends Action { + + function handle($args) { + parent::handle($args); + if (common_logged_in()) { + common_user_error(_('Already logged in.')); + } else if ($_SERVER['REQUEST_METHOD'] == 'POST') { + $token = $this->trimmed('token'); + if (!$token || $token != common_session_token()) { + $this->show_form(_('There was a problem with your session token. Try again, please.')); + return; + } + if ($this->arg('create')) { + if (!$this->boolean('license')) { + $this->show_form(_('You can\'t register if you don\'t agree to the license.'), + $this->trimmed('newname')); + return; + } + $this->create_new_user(); + } else if ($this->arg('connect')) { + $this->connect_user(); + } else { + common_debug(print_r($this->args, true), __FILE__); + $this->show_form(_('Something weird happened.'), + $this->trimmed('newname')); + } + } else { + $this->try_login(); + } + } + + function show_top($error=NULL) { + if ($error) { + common_element('div', array('class' => 'error'), $error); + } else { + global $config; + common_element('div', 'instructions', + sprintf(_('This is the first time you\'ve logged into %s so we must connect your OpenID to a local account. You can either create a new account, or connect with your existing account, if you have one.'), $config['site']['name'])); + } + } + + function show_form($error=NULL, $username=NULL) { + common_show_header(_('OpenID Account Setup'), NULL, $error, + array($this, 'show_top')); + + common_element_start('form', array('method' => 'post', + 'id' => 'account_connect', + 'action' => common_local_url('finishopenidlogin'))); + common_hidden('token', common_session_token()); + common_element('h2', NULL, + _('Create new account')); + common_element('p', NULL, + _('Create a new user with this nickname.')); + common_input('newname', _('New nickname'), + ($username) ? $username : '', + _('1-64 lowercase letters or numbers, no punctuation or spaces')); + common_element_start('p'); + common_element('input', array('type' => 'checkbox', + 'id' => 'license', + 'name' => 'license', + 'value' => 'true')); + common_text(_('My text and files are available under ')); + common_element('a', array(href => common_config('license', 'url')), + common_config('license', 'title')); + common_text(_(' except this private data: password, email address, IM address, phone number.')); + common_element_end('p'); + common_submit('create', _('Create')); + common_element('h2', NULL, + _('Connect existing account')); + common_element('p', NULL, + _('If you already have an account, login with your username and password to connect it to your OpenID.')); + common_input('nickname', _('Existing nickname')); + common_password('password', _('Password')); + common_submit('connect', _('Connect')); + common_element_end('form'); + common_show_footer(); + } + + function try_login() { + + $consumer = oid_consumer(); + + $response = $consumer->complete(common_local_url('finishopenidlogin')); + + if ($response->status == Auth_OpenID_CANCEL) { + $this->message(_('OpenID authentication cancelled.')); + return; + } else if ($response->status == Auth_OpenID_FAILURE) { + // Authentication failed; display the error message. + $this->message(sprintf(_('OpenID authentication failed: %s'), $response->message)); + } else if ($response->status == Auth_OpenID_SUCCESS) { + // This means the authentication succeeded; extract the + // identity URL and Simple Registration data (if it was + // returned). + $display = $response->getDisplayIdentifier(); + $canonical = ($response->endpoint->canonicalID) ? + $response->endpoint->canonicalID : $response->getDisplayIdentifier(); + + $sreg_resp = Auth_OpenID_SRegResponse::fromSuccessResponse($response); + + if ($sreg_resp) { + $sreg = $sreg_resp->contents(); + } + + $user = oid_get_user($canonical); + + if ($user) { + oid_set_last($display); + # XXX: commented out at @edd's request until better + # control over how data flows from OpenID provider. + # oid_update_user($user, $sreg); + common_set_user($user); + common_real_login(true); + if (isset($_SESSION['openid_rememberme']) && $_SESSION['openid_rememberme']) { + common_rememberme($user); + } + unset($_SESSION['openid_rememberme']); + $this->go_home($user->nickname); + } else { + $this->save_values($display, $canonical, $sreg); + $this->show_form(NULL, $this->best_new_nickname($display, $sreg)); + } + } + } + + function message($msg) { + common_show_header(_('OpenID Login')); + common_element('p', NULL, $msg); + common_show_footer(); + } + + function save_values($display, $canonical, $sreg) { + common_ensure_session(); + $_SESSION['openid_display'] = $display; + $_SESSION['openid_canonical'] = $canonical; + $_SESSION['openid_sreg'] = $sreg; + } + + function get_saved_values() { + return array($_SESSION['openid_display'], + $_SESSION['openid_canonical'], + $_SESSION['openid_sreg']); + } + + function create_new_user() { + + # FIXME: save invite code before redirect, and check here + + if (common_config('site', 'closed') || common_config('site', 'inviteonly')) { + common_user_error(_('Registration not allowed.')); + return; + } + + $nickname = $this->trimmed('newname'); + + if (!Validate::string($nickname, array('min_length' => 1, + 'max_length' => 64, + 'format' => VALIDATE_NUM . VALIDATE_ALPHA_LOWER))) { + $this->show_form(_('Nickname must have only lowercase letters and numbers and no spaces.')); + return; + } + + if (!User::allowed_nickname($nickname)) { + $this->show_form(_('Nickname not allowed.')); + return; + } + + if (User::staticGet('nickname', $nickname)) { + $this->show_form(_('Nickname already in use. Try another one.')); + return; + } + + list($display, $canonical, $sreg) = $this->get_saved_values(); + + if (!$display || !$canonical) { + common_server_error(_('Stored OpenID not found.')); + return; + } + + # Possible race condition... let's be paranoid + + $other = oid_get_user($canonical); + + if ($other) { + common_server_error(_('Creating new account for OpenID that already has a user.')); + return; + } + + if ($sreg['country']) { + if ($sreg['postcode']) { + # XXX: use postcode to get city and region + # XXX: also, store postcode somewhere -- it's valuable! + $location = $sreg['postcode'] . ', ' . $sreg['country']; + } else { + $location = $sreg['country']; + } + } + + if ($sreg['fullname'] && strlen($sreg['fullname']) <= 255) { + $fullname = $sreg['fullname']; + } + + if ($sreg['email'] && Validate::email($sreg['email'], true)) { + $email = $sreg['email']; + } + + # XXX: add language + # XXX: add timezone + + $user = User::register(array('nickname' => $nickname, + 'email' => $email, + 'fullname' => $fullname, + 'location' => $location)); + + $result = oid_link_user($user->id, $canonical, $display); + + oid_set_last($display); + common_set_user($user); + common_real_login(true); + if (isset($_SESSION['openid_rememberme']) && $_SESSION['openid_rememberme']) { + common_rememberme($user); + } + unset($_SESSION['openid_rememberme']); + common_redirect(common_local_url('showstream', array('nickname' => $user->nickname))); + } + + function connect_user() { + + $nickname = $this->trimmed('nickname'); + $password = $this->trimmed('password'); + + if (!common_check_user($nickname, $password)) { + $this->show_form(_('Invalid username or password.')); + return; + } + + # They're legit! + + $user = User::staticGet('nickname', $nickname); + + list($display, $canonical, $sreg) = $this->get_saved_values(); + + if (!$display || !$canonical) { + common_server_error(_('Stored OpenID not found.')); + return; + } + + $result = oid_link_user($user->id, $canonical, $display); + + if (!$result) { + common_server_error(_('Error connecting user to OpenID.')); + return; + } + + oid_update_user($user, $sreg); + oid_set_last($display); + common_set_user($user); + common_real_login(true); + if (isset($_SESSION['openid_rememberme']) && $_SESSION['openid_rememberme']) { + common_rememberme($user); + } + unset($_SESSION['openid_rememberme']); + $this->go_home($user->nickname); + } + + function go_home($nickname) { + $url = common_get_returnto(); + if ($url) { + # We don't have to return to it again + common_set_returnto(NULL); + } else { + $url = common_local_url('all', + array('nickname' => + $nickname)); + } + common_redirect($url); + } + + function best_new_nickname($display, $sreg) { + + # Try the passed-in nickname + + if ($sreg['nickname']) { + $nickname = $this->nicknamize($sreg['nickname']); + if ($this->is_new_nickname($nickname)) { + return $nickname; + } + } + + # Try the full name + + if ($sreg['fullname']) { + $fullname = $this->nicknamize($sreg['fullname']); + if ($this->is_new_nickname($fullname)) { + return $fullname; + } + } + + # Try the URL + + $from_url = $this->openid_to_nickname($display); + + if ($from_url && $this->is_new_nickname($from_url)) { + return $from_url; + } + + # XXX: others? + + return NULL; + } + + function is_new_nickname($str) { + if (!Validate::string($str, array('min_length' => 1, + 'max_length' => 64, + 'format' => VALIDATE_NUM . VALIDATE_ALPHA_LOWER))) { + return false; + } + if (!User::allowed_nickname($str)) { + return false; + } + if (User::staticGet('nickname', $str)) { + return false; + } + return true; + } + + function openid_to_nickname($openid) { + if (Auth_Yadis_identifierScheme($openid) == 'XRI') { + return $this->xri_to_nickname($openid); + } else { + return $this->url_to_nickname($openid); + } + } + + # We try to use an OpenID URL as a legal Laconica user name in this order + # 1. Plain hostname, like http://evanp.myopenid.com/ + # 2. One element in path, like http://profile.typekey.com/EvanProdromou/ + # or http://getopenid.com/evanprodromou + + function url_to_nickname($openid) { + static $bad = array('query', 'user', 'password', 'port', 'fragment'); + + $parts = parse_url($openid); + + # If any of these parts exist, this won't work + + foreach ($bad as $badpart) { + if (array_key_exists($badpart, $parts)) { + return NULL; + } + } + + # We just have host and/or path + + # If it's just a host... + if (array_key_exists('host', $parts) && + (!array_key_exists('path', $parts) || strcmp($parts['path'], '/') == 0)) + { + $hostparts = explode('.', $parts['host']); + + # Try to catch common idiom of nickname.service.tld + + if ((count($hostparts) > 2) && + (strlen($hostparts[count($hostparts) - 2]) > 3) && # try to skip .co.uk, .com.au + (strcmp($hostparts[0], 'www') != 0)) + { + return $this->nicknamize($hostparts[0]); + } else { + # Do the whole hostname + return $this->nicknamize($parts['host']); + } + } else { + if (array_key_exists('path', $parts)) { + # Strip starting, ending slashes + $path = preg_replace('@/$@', '', $parts['path']); + $path = preg_replace('@^/@', '', $path); + if (strpos($path, '/') === false) { + return $this->nicknamize($path); + } + } + } + + return NULL; + } + + function xri_to_nickname($xri) { + $base = $this->xri_base($xri); + + if (!$base) { + return NULL; + } else { + # =evan.prodromou + # or @gratis*evan.prodromou + $parts = explode('*', substr($base, 1)); + return $this->nicknamize(array_pop($parts)); + } + } + + function xri_base($xri) { + if (substr($xri, 0, 6) == 'xri://') { + return substr($xri, 6); + } else { + return $xri; + } + } + + # Given a string, try to make it work as a nickname + + function nicknamize($str) { + $str = preg_replace('/\W/', '', $str); + return strtolower($str); + } +} diff --git a/_darcs/pristine/actions/finishremotesubscribe.php b/_darcs/pristine/actions/finishremotesubscribe.php new file mode 100644 index 0000000000..58040683fd --- /dev/null +++ b/_darcs/pristine/actions/finishremotesubscribe.php @@ -0,0 +1,288 @@ +. + */ + +if (!defined('LACONICA')) { exit(1); } + +require_once(INSTALLDIR.'/lib/omb.php'); + +class FinishremotesubscribeAction extends Action { + + function handle($args) { + + parent::handle($args); + + if (common_logged_in()) { + common_user_error(_('You can use the local subscription!')); + return; + } + + $omb = $_SESSION['oauth_authorization_request']; + + if (!$omb) { + common_user_error(_('Not expecting this response!')); + return; + } + + common_debug('stored request: '.print_r($omb,true), __FILE__); + + common_remove_magic_from_request(); + $req = OAuthRequest::from_request(); + + $token = $req->get_parameter('oauth_token'); + + # I think this is the success metric + + if ($token != $omb['token']) { + common_user_error(_('Not authorized.')); + return; + } + + $version = $req->get_parameter('omb_version'); + + if ($version != OMB_VERSION_01) { + common_user_error(_('Unknown version of OMB protocol.')); + return; + } + + $nickname = $req->get_parameter('omb_listener_nickname'); + + if (!$nickname) { + common_user_error(_('No nickname provided by remote server.')); + return; + } + + $profile_url = $req->get_parameter('omb_listener_profile'); + + if (!$profile_url) { + common_user_error(_('No profile URL returned by server.')); + return; + } + + if (!Validate::uri($profile_url, array('allowed_schemes' => array('http', 'https')))) { + common_user_error(_('Invalid profile URL returned by server.')); + return; + } + + if ($profile_url == common_local_url('showstream', array('nickname' => $nickname))) { + common_user_error(_('You can use the local subscription!')); + return; + } + + common_debug('listenee: "'.$omb['listenee'].'"', __FILE__); + + $user = User::staticGet('nickname', $omb['listenee']); + + if (!$user) { + common_user_error(_('User being listened to doesn\'t exist.')); + return; + } + + $other = User::staticGet('uri', $omb['listener']); + + if ($other) { + common_user_error(_('You can use the local subscription!')); + return; + } + + $fullname = $req->get_parameter('omb_listener_fullname'); + $homepage = $req->get_parameter('omb_listener_homepage'); + $bio = $req->get_parameter('omb_listener_bio'); + $location = $req->get_parameter('omb_listener_location'); + $avatar_url = $req->get_parameter('omb_listener_avatar'); + + list($newtok, $newsecret) = $this->access_token($omb); + + if (!$newtok || !$newsecret) { + common_user_error(_('Couldn\'t convert request tokens to access tokens.')); + return; + } + + # XXX: possible attack point; subscribe and return someone else's profile URI + + $remote = Remote_profile::staticGet('uri', $omb['listener']); + + if ($remote) { + $exists = true; + $profile = Profile::staticGet($remote->id); + $orig_remote = clone($remote); + $orig_profile = clone($profile); + # XXX: compare current postNotice and updateProfile URLs to the ones + # stored in the DB to avoid (possibly...) above attack + } else { + $exists = false; + $remote = new Remote_profile(); + $remote->uri = $omb['listener']; + $profile = new Profile(); + } + + $profile->nickname = $nickname; + $profile->profileurl = $profile_url; + + if ($fullname) { + $profile->fullname = $fullname; + } + if ($homepage) { + $profile->homepage = $homepage; + } + if ($bio) { + $profile->bio = $bio; + } + if ($location) { + $profile->location = $location; + } + + if ($exists) { + $profile->update($orig_profile); + } else { + $profile->created = DB_DataObject_Cast::dateTime(); # current time + $id = $profile->insert(); + if (!$id) { + common_server_error(_('Error inserting new profile')); + return; + } + $remote->id = $id; + } + + if ($avatar_url) { + if (!$this->add_avatar($profile, $avatar_url)) { + common_server_error(_('Error inserting avatar')); + return; + } + } + + $remote->postnoticeurl = $omb['post_notice_url']; + $remote->updateprofileurl = $omb['update_profile_url']; + + if ($exists) { + if (!$remote->update($orig_remote)) { + common_server_error(_('Error updating remote profile')); + return; + } + } else { + $remote->created = DB_DataObject_Cast::dateTime(); # current time + if (!$remote->insert()) { + common_server_error(_('Error inserting remote profile')); + return; + } + } + + if ($user->hasBlocked($profile)) { + $this->client_error(_('That user has blocked you from subscribing.')); + return; + } + + $sub = new Subscription(); + + $sub->subscriber = $remote->id; + $sub->subscribed = $user->id; + + $sub_exists = false; + + if ($sub->find(true)) { + $sub_exists = true; + $orig_sub = clone($sub); + } else { + $sub_exists = false; + $sub->created = DB_DataObject_Cast::dateTime(); # current time + } + + $sub->token = $newtok; + $sub->secret = $newsecret; + + if ($sub_exists) { + $result = $sub->update($orig_sub); + } else { + $result = $sub->insert(); + } + + if (!$result) { + common_log_db_error($sub, ($sub_exists) ? 'UPDATE' : 'INSERT', __FILE__); + common_user_error(_('Couldn\'t insert new subscription.')); + return; + } + + # Notify user, if necessary + + mail_subscribe_notify_profile($user, $profile); + + # Clear the data + unset($_SESSION['oauth_authorization_request']); + + # If we show subscriptions in reverse chron order, this should + # show up close to the top of the page + + common_redirect(common_local_url('subscribers', array('nickname' => + $user->nickname))); + } + + function add_avatar($profile, $url) { + $temp_filename = tempnam(sys_get_temp_dir(), 'listener_avatar'); + copy($url, $temp_filename); + return $profile->setOriginal($temp_filename); + } + + function access_token($omb) { + + common_debug('starting request for access token', __FILE__); + + $con = omb_oauth_consumer(); + $tok = new OAuthToken($omb['token'], $omb['secret']); + + common_debug('using request token "'.$tok.'"', __FILE__); + + $url = $omb['access_token_url']; + + common_debug('using access token url "'.$url.'"', __FILE__); + + # XXX: Is this the right thing to do? Strip off GET params and make them + # POST params? Seems wrong to me. + + $parsed = parse_url($url); + $params = array(); + parse_str($parsed['query'], $params); + + $req = OAuthRequest::from_consumer_and_token($con, $tok, "POST", $url, $params); + + $req->set_parameter('omb_version', OMB_VERSION_01); + + # XXX: test to see if endpoint accepts this signature method + + $req->sign_request(omb_hmac_sha1(), $con, $tok); + + # We re-use this tool's fetcher, since it's pretty good + + common_debug('posting to access token url "'.$req->get_normalized_http_url().'"', __FILE__); + common_debug('posting request data "'.$req->to_postdata().'"', __FILE__); + + $fetcher = Auth_Yadis_Yadis::getHTTPFetcher(); + $result = $fetcher->post($req->get_normalized_http_url(), + $req->to_postdata(), + array('User-Agent' => 'Laconica/' . LACONICA_VERSION)); + + common_debug('got result: "'.print_r($result,TRUE).'"', __FILE__); + + if ($result->status != 200) { + return NULL; + } + + parse_str($result->body, $return); + + return array($return['oauth_token'], $return['oauth_token_secret']); + } +} diff --git a/_darcs/pristine/actions/foaf.php b/_darcs/pristine/actions/foaf.php new file mode 100644 index 0000000000..6811fc05af --- /dev/null +++ b/_darcs/pristine/actions/foaf.php @@ -0,0 +1,202 @@ +. + */ + +if (!defined('LACONICA')) { exit(1); } + +define('LISTENER', 1); +define('LISTENEE', -1); +define('BOTH', 0); + +class FoafAction extends Action { + + function is_readonly() { + return true; + } + + function handle($args) { + parent::handle($args); + + $nickname = $this->trimmed('nickname'); + + $user = User::staticGet('nickname', $nickname); + + if (!$user) { + common_user_error(_('No such user.'), 404); + return; + } + + $profile = $user->getProfile(); + + if (!$profile) { + common_server_error(_('User has no profile.'), 500); + return; + } + + header('Content-Type: application/rdf+xml'); + + common_start_xml(); + common_element_start('rdf:RDF', array('xmlns:rdf' => + 'http://www.w3.org/1999/02/22-rdf-syntax-ns#', + 'xmlns:rdfs' => + 'http://www.w3.org/2000/01/rdf-schema#', + 'xmlns:geo' => + 'http://www.w3.org/2003/01/geo/wgs84_pos#', + 'xmlns' => 'http://xmlns.com/foaf/0.1/')); + + # This is the document about the user + + $this->show_ppd('', $user->uri); + + # XXX: might not be a person + common_element_start('Person', array('rdf:about' => + $user->uri)); + common_element('mbox_sha1sum', NULL, sha1('mailto:' . $user->email)); + if ($profile->fullname) { + common_element('name', NULL, $profile->fullname); + } + if ($profile->homepage) { + common_element('homepage', array('rdf:resource' => $profile->homepage)); + } + if ($profile->bio) { + common_element('rdfs:comment', NULL, $profile->bio); + } + # XXX: more structured location data + if ($profile->location) { + common_element_start('based_near'); + common_element_start('geo:SpatialThing'); + common_element('name', NULL, $profile->location); + common_element_end('geo:SpatialThing'); + common_element_end('based_near'); + } + + $this->show_microblogging_account($profile, common_root_url()); + + $avatar = $profile->getOriginalAvatar(); + + if ($avatar) { + common_element_start('img'); + common_element_start('Image', array('rdf:about' => $avatar->url)); + foreach (array(AVATAR_PROFILE_SIZE, AVATAR_STREAM_SIZE, AVATAR_MINI_SIZE) as $size) { + $scaled = $profile->getAvatar($size); + if (!$scaled->original) { # sometimes the original has one of our scaled sizes + common_element_start('thumbnail'); + common_element('Image', array('rdf:about' => $scaled->url)); + common_element_end('thumbnail'); + } + } + common_element_end('Image'); + common_element_end('img'); + } + + # Get people user is subscribed to + + $person = array(); + + $sub = new Subscription(); + $sub->subscriber = $profile->id; + $sub->whereAdd('subscriber != subscribed'); + + if ($sub->find()) { + while ($sub->fetch()) { + if ($sub->token) { + $other = Remote_profile::staticGet('id', $sub->subscribed); + } else { + $other = User::staticGet('id', $sub->subscribed); + } + if (!$other) { + common_debug('Got a bad subscription: '.print_r($sub,TRUE)); + continue; + } + common_element('knows', array('rdf:resource' => $other->uri)); + $person[$other->uri] = array(LISTENEE, $other); + } + } + + # Get people who subscribe to user + + $sub = new Subscription(); + $sub->subscribed = $profile->id; + $sub->whereAdd('subscriber != subscribed'); + + if ($sub->find()) { + while ($sub->fetch()) { + if ($sub->token) { + $other = Remote_profile::staticGet('id', $sub->subscriber); + } else { + $other = User::staticGet('id', $sub->subscriber); + } + if (!$other) { + common_debug('Got a bad subscription: '.print_r($sub,TRUE)); + continue; + } + if (array_key_exists($other->uri, $person)) { + $person[$other->uri][0] = BOTH; + } else { + $person[$other->uri] = array(LISTENER, $other); + } + } + } + + common_element_end('Person'); + + foreach ($person as $uri => $p) { + $foaf_url = NULL; + if ($p[1] instanceof User) { + $foaf_url = common_local_url('foaf', array('nickname' => $p[1]->nickname)); + } + $profile = Profile::staticGet($p[1]->id); + common_element_start('Person', array('rdf:about' => $uri)); + if ($p[0] == LISTENER || $p[0] == BOTH) { + common_element('knows', array('rdf:resource' => $user->uri)); + } + $this->show_microblogging_account($profile, ($p[1] instanceof User) ? + common_root_url() : NULL); + if ($foaf_url) { + common_element('rdfs:seeAlso', array('rdf:resource' => $foaf_url)); + } + common_element_end('Person'); + if ($foaf_url) { + $this->show_ppd($foaf_url, $uri); + } + } + + common_element_end('rdf:RDF'); + } + + function show_ppd($foaf_url, $person_uri) { + common_element_start('PersonalProfileDocument', array('rdf:about' => $foaf_url)); + common_element('maker', array('rdf:resource' => $person_uri)); + common_element('primaryTopic', array('rdf:resource' => $person_uri)); + common_element_end('PersonalProfileDocument'); + } + + function show_microblogging_account($profile, $service=NULL) { + # Their account + common_element_start('holdsAccount'); + common_element_start('OnlineAccount'); + if ($service) { + common_element('accountServiceHomepage', array('rdf:resource' => + $service)); + } + common_element('accountName', NULL, $profile->nickname); + common_element('homepage', array('rdf:resource' => $profile->profileurl)); + common_element_end('OnlineAccount'); + common_element_end('holdsAccount'); + } +} diff --git a/_darcs/pristine/actions/imsettings.php b/_darcs/pristine/actions/imsettings.php new file mode 100644 index 0000000000..0aa7631dc2 --- /dev/null +++ b/_darcs/pristine/actions/imsettings.php @@ -0,0 +1,270 @@ +. + */ + +if (!defined('LACONICA')) { exit(1); } + +require_once(INSTALLDIR.'/lib/settingsaction.php'); +require_once(INSTALLDIR.'/lib/jabber.php'); + +class ImsettingsAction extends SettingsAction { + + function get_instructions() { + return _('You can send and receive notices through Jabber/GTalk [instant messages](%%doc.im%%). Configure your address and settings below.'); + } + + function show_form($msg=NULL, $success=false) { + $user = common_current_user(); + $this->form_header(_('IM Settings'), $msg, $success); + common_element_start('form', array('method' => 'post', + 'id' => 'imsettings', + 'action' => + common_local_url('imsettings'))); + common_hidden('token', common_session_token()); + + common_element('h2', NULL, _('Address')); + + if ($user->jabber) { + common_element_start('p'); + common_element('span', 'address confirmed', $user->jabber); + common_element('span', 'input_instructions', + _('Current confirmed Jabber/GTalk address.')); + common_hidden('jabber', $user->jabber); + common_element_end('p'); + common_submit('remove', _('Remove')); + } else { + $confirm = $this->get_confirmation(); + if ($confirm) { + common_element_start('p'); + common_element('span', 'address unconfirmed', $confirm->address); + common_element('span', 'input_instructions', + sprintf(_('Awaiting confirmation on this address. Check your Jabber/GTalk account for a message with further instructions. (Did you add %s to your buddy list?)'), jabber_daemon_address())); + common_hidden('jabber', $confirm->address); + common_element_end('p'); + common_submit('cancel', _('Cancel')); + } else { + common_input('jabber', _('IM Address'), + ($this->arg('jabber')) ? $this->arg('jabber') : NULL, + sprintf(_('Jabber or GTalk address, like "UserName@example.org". First, make sure to add %s to your buddy list in your IM client or on GTalk.'), jabber_daemon_address())); + common_submit('add', _('Add')); + } + } + + common_element('h2', NULL, _('Preferences')); + + common_checkbox('jabbernotify', + _('Send me notices through Jabber/GTalk.'), + $user->jabbernotify); + common_checkbox('updatefrompresence', + _('Post a notice when my Jabber/GTalk status changes.'), + $user->updatefrompresence); + common_checkbox('jabberreplies', + _('Send me replies through Jabber/GTalk from people I\'m not subscribed to.'), + $user->jabberreplies); + common_checkbox('jabbermicroid', + _('Publish a MicroID for my Jabber/GTalk address.'), + $user->jabbermicroid); + common_submit('save', _('Save')); + + common_element_end('form'); + common_show_footer(); + } + + function get_confirmation() { + $user = common_current_user(); + $confirm = new Confirm_address(); + $confirm->user_id = $user->id; + $confirm->address_type = 'jabber'; + if ($confirm->find(TRUE)) { + return $confirm; + } else { + return NULL; + } + } + + function handle_post() { + + # CSRF protection + $token = $this->trimmed('token'); + if (!$token || $token != common_session_token()) { + $this->show_form(_('There was a problem with your session token. Try again, please.')); + return; + } + + if ($this->arg('save')) { + $this->save_preferences(); + } else if ($this->arg('add')) { + $this->add_address(); + } else if ($this->arg('cancel')) { + $this->cancel_confirmation(); + } else if ($this->arg('remove')) { + $this->remove_address(); + } else { + $this->show_form(_('Unexpected form submission.')); + } + } + + function save_preferences() { + + $jabbernotify = $this->boolean('jabbernotify'); + $updatefrompresence = $this->boolean('updatefrompresence'); + $jabberreplies = $this->boolean('jabberreplies'); + $jabbermicroid = $this->boolean('jabbermicroid'); + + $user = common_current_user(); + + assert(!is_null($user)); # should already be checked + + $user->query('BEGIN'); + + $original = clone($user); + + $user->jabbernotify = $jabbernotify; + $user->updatefrompresence = $updatefrompresence; + $user->jabberreplies = $jabberreplies; + $user->jabbermicroid = $jabbermicroid; + + $result = $user->update($original); + + if ($result === FALSE) { + common_log_db_error($user, 'UPDATE', __FILE__); + common_server_error(_('Couldn\'t update user.')); + return; + } + + $user->query('COMMIT'); + + $this->show_form(_('Preferences saved.'), true); + } + + function add_address() { + + $user = common_current_user(); + + $jabber = $this->trimmed('jabber'); + + # Some validation + + if (!$jabber) { + $this->show_form(_('No Jabber ID.')); + return; + } + + $jabber = jabber_normalize_jid($jabber); + + if (!$jabber) { + $this->show_form(_('Cannot normalize that Jabber ID')); + return; + } + if (!jabber_valid_base_jid($jabber)) { + $this->show_form(_('Not a valid Jabber ID')); + return; + } else if ($user->jabber == $jabber) { + $this->show_form(_('That is already your Jabber ID.')); + return; + } else if ($this->jabber_exists($jabber)) { + $this->show_form(_('Jabber ID already belongs to another user.')); + return; + } + + $confirm = new Confirm_address(); + $confirm->address = $jabber; + $confirm->address_type = 'jabber'; + $confirm->user_id = $user->id; + $confirm->code = common_confirmation_code(64); + + $result = $confirm->insert(); + + if ($result === FALSE) { + common_log_db_error($confirm, 'INSERT', __FILE__); + common_server_error(_('Couldn\'t insert confirmation code.')); + return; + } + + if (!common_config('queue', 'enabled')) { + jabber_confirm_address($confirm->code, + $user->nickname, + $jabber); + } + + $msg = sprintf(_('A confirmation code was sent to the IM address you added. You must approve %s for sending messages to you.'), jabber_daemon_address()); + + $this->show_form($msg, TRUE); + } + + function cancel_confirmation() { + $jabber = $this->arg('jabber'); + $confirm = $this->get_confirmation(); + if (!$confirm) { + $this->show_form(_('No pending confirmation to cancel.')); + return; + } + if ($confirm->address != $jabber) { + $this->show_form(_('That is the wrong IM address.')); + return; + } + + $result = $confirm->delete(); + + if (!$result) { + common_log_db_error($confirm, 'DELETE', __FILE__); + $this->server_error(_('Couldn\'t delete email confirmation.')); + return; + } + + $this->show_form(_('Confirmation cancelled.'), TRUE); + } + + function remove_address() { + + $user = common_current_user(); + $jabber = $this->arg('jabber'); + + # Maybe an old tab open...? + + if ($user->jabber != $jabber) { + $this->show_form(_('That is not your Jabber ID.')); + return; + } + + $user->query('BEGIN'); + $original = clone($user); + $user->jabber = NULL; + $result = $user->updateKeys($original); + if (!$result) { + common_log_db_error($user, 'UPDATE', __FILE__); + common_server_error(_('Couldn\'t update user.')); + return; + } + $user->query('COMMIT'); + + # XXX: unsubscribe to the old address + + $this->show_form(_('The address was removed.'), TRUE); + } + + function jabber_exists($jabber) { + $user = common_current_user(); + $other = User::staticGet('jabber', $jabber); + if (!$other) { + return false; + } else { + return $other->id != $user->id; + } + } +} diff --git a/_darcs/pristine/actions/inbox.php b/_darcs/pristine/actions/inbox.php new file mode 100644 index 0000000000..c752e404e9 --- /dev/null +++ b/_darcs/pristine/actions/inbox.php @@ -0,0 +1,55 @@ +. + */ + +if (!defined('LACONICA')) { exit(1); } + +require_once(INSTALLDIR.'/lib/mailbox.php'); + +class InboxAction extends MailboxAction { + + function get_title($user, $page) { + if ($page > 1) { + $title = sprintf(_("Inbox for %s - page %d"), $user->nickname, $page); + } else { + $title = sprintf(_("Inbox for %s"), $user->nickname); + } + return $title; + } + + function get_messages($user, $page) { + $message = new Message(); + $message->to_profile = $user->id; + $message->orderBy('created DESC, id DESC'); + $message->limit((($page-1)*MESSAGES_PER_PAGE), MESSAGES_PER_PAGE + 1); + + if ($message->find()) { + return $message; + } else { + return NULL; + } + } + + function get_message_profile($message) { + return $message->getFrom(); + } + + function get_instructions() { + return _('This is your inbox, which lists your incoming private messages.'); + } +} diff --git a/_darcs/pristine/actions/invite.php b/_darcs/pristine/actions/invite.php new file mode 100644 index 0000000000..c7d92085c1 --- /dev/null +++ b/_darcs/pristine/actions/invite.php @@ -0,0 +1,199 @@ +. + */ + +if (!defined('LACONICA')) { exit(1); } + +class InviteAction extends Action { + + function is_readonly() { + return false; + } + + function handle($args) { + parent::handle($args); + if (!common_logged_in()) { + $this->client_error(sprintf(_('You must be logged in to invite other users to use %s'), + common_config('site', 'name'))); + return; + } else if ($_SERVER['REQUEST_METHOD'] == 'POST') { + $this->send_invitations(); + } else { + $this->show_form(); + } + } + + function send_invitations() { + + # CSRF protection + $token = $this->trimmed('token'); + if (!$token || $token != common_session_token()) { + $this->show_form(_('There was a problem with your session token. Try again, please.')); + return; + } + + $user = common_current_user(); + $profile = $user->getProfile(); + + $bestname = $profile->getBestName(); + $sitename = common_config('site', 'name'); + $personal = $this->trimmed('personal'); + + $addresses = explode("\n", $this->trimmed('addresses')); + + foreach ($addresses as $email) { + $email = trim($email); + if (!Validate::email($email, true)) { + $this->show_form(sprintf(_('Invalid email address: %s'), $email)); + return; + } + } + + $already = array(); + $subbed = array(); + + foreach ($addresses as $email) { + $email = common_canonical_email($email); + $other = User::staticGet('email', $email); + if ($other) { + if ($user->isSubscribed($other)) { + $already[] = $other; + } else { + subs_subscribe_to($user, $other); + $subbed[] = $other; + } + } else { + $sent[] = $email; + $this->send_invitation($email, $user, $personal); + } + } + + common_show_header(_('Invitation(s) sent')); + if ($already) { + common_element('p', NULL, _('You are already subscribed to these users:')); + common_element_start('ul'); + foreach ($already as $other) { + common_element('li', NULL, sprintf(_('%s (%s)'), $other->nickname, $other->email)); + } + common_element_end('ul'); + } + if ($subbed) { + common_element('p', NULL, _('These people are already users and you were automatically subscribed to them:')); + common_element_start('ul'); + foreach ($subbed as $other) { + common_element('li', NULL, sprintf(_('%s (%s)'), $other->nickname, $other->email)); + } + common_element_end('ul'); + } + if ($sent) { + common_element('p', NULL, _('Invitation(s) sent to the following people:')); + common_element_start('ul'); + foreach ($sent as $other) { + common_element('li', NULL, $other); + } + common_element_end('ul'); + common_element('p', NULL, _('You will be notified when your invitees accept the invitation and register on the site. Thanks for growing the community!')); + } + common_show_footer(); + } + + function show_top($error=NULL) { + if ($error) { + common_element('p', 'error', $error); + } else { + common_element_start('div', 'instructions'); + common_element('p', NULL, + _('Use this form to invite your friends and colleagues to use this service.')); + common_element_end('div'); + } + } + + function show_form($error=NULL) { + + global $config; + + common_show_header(_('Invite new users'), NULL, $error, array($this, 'show_top')); + + common_element_start('form', array('method' => 'post', + 'id' => 'invite', + 'action' => common_local_url('invite'))); + common_hidden('token', common_session_token()); + + common_textarea('addresses', _('Email addresses'), + $this->trimmed('addresses'), + _('Addresses of friends to invite (one per line)')); + + common_textarea('personal', _('Personal message'), + $this->trimmed('personal'), + _('Optionally add a personal message to the invitation.')); + + common_submit('send', _('Send')); + + common_element_end('form'); + + common_show_footer(); + } + + function send_invitation($email, $user, $personal) { + + $profile = $user->getProfile(); + $bestname = $profile->getBestName(); + + $sitename = common_config('site', 'name'); + + $invite = new Invitation(); + + $invite->address = $email; + $invite->address_type = 'email'; + $invite->code = common_confirmation_code(128); + $invite->user_id = $user->id; + $invite->created = common_sql_now(); + + if (!$invite->insert()) { + common_log_db_error($invite, 'INSERT', __FILE__); + return false; + } + + $recipients = array($email); + + $headers['From'] = mail_notify_from(); + $headers['To'] = $email; + $headers['Subject'] = sprintf(_('%1$s has invited you to join them on %2$s'), $bestname, $sitename); + + $body = sprintf(_("%1\$s has invited you to join them on %2\$s (%3\$s).\n\n". + "%2\$s is a micro-blogging service that lets you keep up-to-date with people you know and people who interest you.\n\n". + "You can also share news about yourself, your thoughts, or your life online with people who know about you. ". + "It's also great for meeting new people who share your interests.\n\n". + "%1\$s said:\n\n%4\$s\n\n". + "You can see %1\$s's profile page on %2\$s here:\n\n". + "%5\$s\n\n". + "If you'd like to try the service, click on the link below to accept the invitation.\n\n". + "%6\$s\n\n". + "If not, you can ignore this message. Thanks for your patience and your time.\n\n". + "Sincerely, %2\$s\n"), + $bestname, + $sitename, + common_root_url(), + $personal, + common_local_url('showstream', array('nickname' => $user->nickname)), + common_local_url('register', array('code' => $invite->code))); + + mail_send($recipients, $headers, $body); + } + +} diff --git a/_darcs/pristine/actions/login.php b/_darcs/pristine/actions/login.php new file mode 100644 index 0000000000..ccec9cf8a7 --- /dev/null +++ b/_darcs/pristine/actions/login.php @@ -0,0 +1,152 @@ +. + */ + +if (!defined('LACONICA')) { exit(1); } + +class LoginAction extends Action { + + function is_readonly() { + return true; + } + + function handle($args) { + parent::handle($args); + if (common_is_real_login()) { + common_user_error(_('Already logged in.')); + } else if ($_SERVER['REQUEST_METHOD'] == 'POST') { + $this->check_login(); + } else { + $this->show_form(); + } + } + + function check_login() { + # XXX: login throttle + + # CSRF protection - token set in common_notice_form() + $token = $this->trimmed('token'); + if (!$token || $token != common_session_token()) { + $this->client_error(_('There was a problem with your session token. Try again, please.')); + return; + } + + $nickname = common_canonical_nickname($this->trimmed('nickname')); + $password = $this->arg('password'); + if (common_check_user($nickname, $password)) { + # success! + if (!common_set_user($nickname)) { + common_server_error(_('Error setting user.')); + return; + } + common_real_login(true); + if ($this->boolean('rememberme')) { + common_debug('Adding rememberme cookie for ' . $nickname); + common_rememberme(); + } + # success! + $url = common_get_returnto(); + if ($url) { + # We don't have to return to it again + common_set_returnto(NULL); + } else { + $url = common_local_url('all', + array('nickname' => + $nickname)); + } + common_redirect($url); + } else { + $this->show_form(_('Incorrect username or password.')); + return; + } + + # success! + if (!common_set_user($user)) { + common_server_error(_('Error setting user.')); + return; + } + + common_real_login(true); + + if ($this->boolean('rememberme')) { + common_debug('Adding rememberme cookie for ' . $nickname); + common_rememberme($user); + } + # success! + $url = common_get_returnto(); + if ($url) { + # We don't have to return to it again + common_set_returnto(NULL); + } else { + $url = common_local_url('all', + array('nickname' => + $nickname)); + } + common_redirect($url); + } + + function show_form($error=NULL) { + common_show_header(_('Login'), NULL, $error, array($this, 'show_top')); + common_element_start('form', array('method' => 'post', + 'id' => 'login', + 'action' => common_local_url('login'))); + common_input('nickname', _('Nickname')); + common_password('password', _('Password')); + common_checkbox('rememberme', _('Remember me'), false, + _('Automatically login in the future; ' . + 'not for shared computers!')); + common_submit('submit', _('Login')); + common_hidden('token', common_session_token()); + common_element_end('form'); + common_element_start('p'); + common_element('a', array('href' => common_local_url('recoverpassword')), + _('Lost or forgotten password?')); + common_element_end('p'); + common_show_footer(); + } + + function get_instructions() { + if (common_logged_in() && + !common_is_real_login() && + common_get_returnto()) + { + # rememberme logins have to reauthenticate before + # changing any profile settings (cookie-stealing protection) + return _('For security reasons, please re-enter your ' . + 'user name and password ' . + 'before changing your settings.'); + } else { + return _('Login with your username and password. ' . + 'Don\'t have a username yet? ' . + '[Register](%%action.register%%) a new account, or ' . + 'try [OpenID](%%action.openidlogin%%). '); + } + } + + function show_top($error=NULL) { + if ($error) { + common_element('p', 'error', $error); + } else { + $instr = $this->get_instructions(); + $output = common_markup_to_html($instr); + common_element_start('div', 'instructions'); + common_raw($output); + common_element_end('div'); + } + } +} diff --git a/_darcs/pristine/actions/logout.php b/_darcs/pristine/actions/logout.php new file mode 100644 index 0000000000..f00fa0ba7f --- /dev/null +++ b/_darcs/pristine/actions/logout.php @@ -0,0 +1,41 @@ +. + */ + +if (!defined('LACONICA')) { exit(1); } + +require_once(INSTALLDIR.'/lib/openid.php'); + +class LogoutAction extends Action { + + function is_readonly() { + return true; + } + + function handle($args) { + parent::handle($args); + if (!common_logged_in()) { + common_user_error(_('Not logged in.')); + } else { + common_set_user(NULL); + common_real_login(false); # not logged in + common_forgetme(); # don't log back in! + common_redirect(common_local_url('public')); + } + } +} diff --git a/_darcs/pristine/actions/microsummary.php b/_darcs/pristine/actions/microsummary.php new file mode 100644 index 0000000000..104467d297 --- /dev/null +++ b/_darcs/pristine/actions/microsummary.php @@ -0,0 +1,46 @@ +. + */ + +if (!defined('LACONICA')) { exit(1); } + +class MicrosummaryAction extends Action { + + function handle($args) { + + parent::handle($args); + + $nickname = common_canonical_nickname($this->arg('nickname')); + $user = User::staticGet('nickname', $nickname); + + if (!$user) { + $this->client_error(_('No such user'), 404); + return; + } + + $notice = $user->getCurrentNotice(); + + if (!$notice) { + $this->client_error(_('No current status'), 404); + } + + header('Content-Type: text/plain'); + + print $user->nickname . ': ' . $notice->content; + } +} diff --git a/_darcs/pristine/actions/newmessage.php b/_darcs/pristine/actions/newmessage.php new file mode 100644 index 0000000000..da48fc7e7a --- /dev/null +++ b/_darcs/pristine/actions/newmessage.php @@ -0,0 +1,135 @@ +. + */ + +if (!defined('LACONICA')) { exit(1); } + +class NewmessageAction extends Action { + + function handle($args) { + parent::handle($args); + + if (!common_logged_in()) { + $this->client_error(_('Not logged in.'), 403); + } else if ($_SERVER['REQUEST_METHOD'] == 'POST') { + $this->save_new_message(); + } else { + $this->show_form(); + } + } + + function save_new_message() { + $user = common_current_user(); + assert($user); # XXX: maybe an error instead... + + # CSRF protection + + $token = $this->trimmed('token'); + if (!$token || $token != common_session_token()) { + $this->show_form(_('There was a problem with your session token. Try again, please.')); + return; + } + + $content = $this->trimmed('content'); + $to = $this->trimmed('to'); + + if (!$content) { + $this->show_form(_('No content!')); + return; + } else { + $content_shortened = common_shorten_links($content); + + if (mb_strlen($content_shortened) > 140) { + common_debug("Content = '$content_shortened'", __FILE__); + common_debug("mb_strlen(\$content) = " . mb_strlen($content_shortened), __FILE__); + $this->show_form(_('That\'s too long. Max message size is 140 chars.')); + return; + } + } + + $other = User::staticGet('id', $to); + + if (!$other) { + $this->show_form(_('No recipient specified.')); + return; + } else if (!$user->mutuallySubscribed($other)) { + $this->client_error(_('You can\'t send a message to this user.'), 404); + return; + } else if ($user->id == $other->id) { + $this->client_error(_('Don\'t send a message to yourself; just say it to yourself quietly instead.'), 403); + return; + } + + $message = Message::saveNew($user->id, $other->id, $content, 'web'); + + if (is_string($message)) { + $this->show_form($message); + return; + } + + $this->notify($user, $other, $message); + + $url = common_local_url('outbox', array('nickname' => $user->nickname)); + + common_redirect($url, 303); + } + + function show_top($params) { + + list($content, $user, $to) = $params; + + assert(!is_null($user)); + + common_message_form($content, $user, $to); + } + + function show_form($msg=NULL) { + + $content = $this->trimmed('content'); + $user = common_current_user(); + + $to = $this->trimmed('to'); + + $other = User::staticGet('id', $to); + + if (!$other) { + $this->client_error(_('No such user'), 404); + return; + } + + if (!$user->mutuallySubscribed($other)) { + $this->client_error(_('You can\'t send a message to this user.'), 404); + return; + } + + common_show_header(_('New message'), NULL, + array($content, $user, $other), + array($this, 'show_top')); + + if ($msg) { + common_element('p', array('id'=>'error'), $msg); + } + + common_show_footer(); + } + + function notify($from, $to, $message) { + mail_notify_message($message, $from, $to); + # XXX: Jabber, SMS notifications... probably queued + } +} diff --git a/_darcs/pristine/actions/newnotice.php b/_darcs/pristine/actions/newnotice.php new file mode 100644 index 0000000000..42b48923f5 --- /dev/null +++ b/_darcs/pristine/actions/newnotice.php @@ -0,0 +1,154 @@ +. + */ + +if (!defined('LACONICA')) { exit(1); } + +require_once INSTALLDIR . '/lib/noticelist.php'; + +class NewnoticeAction extends Action { + + function handle($args) { + parent::handle($args); + + if (!common_logged_in()) { + common_user_error(_('Not logged in.')); + } else if ($_SERVER['REQUEST_METHOD'] == 'POST') { + + # CSRF protection - token set in common_notice_form() + $token = $this->trimmed('token'); + if (!$token || $token != common_session_token()) { + $this->client_error(_('There was a problem with your session token. Try again, please.')); + return; + } + + $this->save_new_notice(); + } else { + $this->show_form(); + } + } + + function save_new_notice() { + + $user = common_current_user(); + assert($user); # XXX: maybe an error instead... + $content = $this->trimmed('status_textarea'); + + if (!$content) { + $this->show_form(_('No content!')); + return; + } else { + $content_shortened = common_shorten_links($content); + + if (mb_strlen($content_shortened) > 140) { + common_debug("Content = '$content_shortened'", __FILE__); + common_debug("mb_strlen(\$content) = " . mb_strlen($content_shortened), __FILE__); + $this->show_form(_('That\'s too long. Max notice size is 140 chars.')); + return; + } + } + + $inter = new CommandInterpreter(); + + $cmd = $inter->handle_command($user, $content_shortened); + + if ($cmd) { + if ($this->boolean('ajax')) { + $cmd->execute(new AjaxWebChannel()); + } else { + $cmd->execute(new WebChannel()); + } + return; + } + + $replyto = $this->trimmed('inreplyto'); + + $notice = Notice::saveNew($user->id, $content, 'web', 1, ($replyto == 'false') ? NULL : $replyto); + + if (is_string($notice)) { + $this->show_form($notice); + return; + } + + common_broadcast_notice($notice); + + if ($this->boolean('ajax')) { + common_start_html('text/xml;charset=utf-8', true); + common_element_start('head'); + common_element('title', null, _('Notice posted')); + common_element_end('head'); + common_element_start('body'); + $this->show_notice($notice); + common_element_end('body'); + common_element_end('html'); + } else { + $returnto = $this->trimmed('returnto'); + + if ($returnto) { + $url = common_local_url($returnto, + array('nickname' => $user->nickname)); + } else { + $url = common_local_url('shownotice', + array('notice' => $notice->id)); + } + common_redirect($url, 303); + } + } + + function ajax_error_msg($msg) { + common_start_html('text/xml;charset=utf-8', true); + common_element_start('head'); + common_element('title', null, _('Ajax Error')); + common_element_end('head'); + common_element_start('body'); + common_element('p', array('id' => 'error'), $msg); + common_element_end('body'); + common_element_end('html'); + } + + function show_top($content=NULL) { + common_notice_form(NULL, $content); + } + + function show_form($msg=NULL) { + if ($msg && $this->boolean('ajax')) { + $this->ajax_error_msg($msg); + return; + } + $content = $this->trimmed('status_textarea'); + if (!$content) { + $replyto = $this->trimmed('replyto'); + $profile = Profile::staticGet('nickname', $replyto); + if ($profile) { + $content = '@' . $profile->nickname . ' '; + } + } + common_show_header(_('New notice'), NULL, $content, + array($this, 'show_top')); + if ($msg) { + common_element('p', array('id' => 'error'), $msg); + } + common_show_footer(); + } + + function show_notice($notice) { + $nli = new NoticeListItem($notice); + $nli->show(); + } + +} diff --git a/_darcs/pristine/actions/noticesearch.php b/_darcs/pristine/actions/noticesearch.php new file mode 100644 index 0000000000..96e4d777fa --- /dev/null +++ b/_darcs/pristine/actions/noticesearch.php @@ -0,0 +1,164 @@ +. + */ + +if (!defined('LACONICA')) { exit(1); } + +require_once(INSTALLDIR.'/lib/searchaction.php'); + +# XXX common parent for people and content search? + +class NoticesearchAction extends SearchAction { + + function get_instructions() { + return _('Search for notices on %%site.name%% by their contents. Separate search terms by spaces; they must be 3 characters or more.'); + } + + function get_title() { + return _('Text search'); + } + + function show_results($q, $page) { + + $notice = new Notice(); + + # lcase it for comparison + $q = strtolower($q); + + $search_engine = $notice->getSearchEngine('identica_notices'); + + $search_engine->set_sort_mode('chron'); + # Ask for an extra to see if there's more. + $search_engine->limit((($page-1)*NOTICES_PER_PAGE), NOTICES_PER_PAGE + 1); + + if (false === $search_engine->query($q)) { + $cnt = 0; + } + else { + $cnt = $notice->find(); + } + if ($cnt > 0) { + $terms = preg_split('/[\s,]+/', $q); + common_element_start('ul', array('id' => 'notices')); + for ($i = 0; $i < min($cnt, NOTICES_PER_PAGE); $i++) { + if ($notice->fetch()) { + $this->show_notice($notice, $terms); + } else { + // shouldn't happen! + break; + } + } + common_element_end('ul'); + } else { + common_element('p', 'error', _('No results')); + } + + common_pagination($page > 1, $cnt > NOTICES_PER_PAGE, + $page, 'noticesearch', array('q' => $q)); + } + + function show_header($arr) { + if ($arr) { + $q = $arr[0]; + } + if ($q) { + common_element('link', array('rel' => 'alternate', + 'href' => common_local_url('noticesearchrss', + array('q' => $q)), + 'type' => 'application/rss+xml', + 'title' => _('Search Stream Feed'))); + } + } + + # XXX: refactor and combine with StreamAction::show_notice() + + function show_notice($notice, $terms) { + $profile = $notice->getProfile(); + if (!$profile) { + common_log_db_error($notice, 'SELECT', __FILE__); + $this->server_error(_('Notice without matching profile')); + return; + } + # XXX: RDFa + common_element_start('li', array('class' => 'notice_single', + 'id' => 'notice-' . $notice->id)); + $avatar = $profile->getAvatar(AVATAR_STREAM_SIZE); + common_element_start('a', array('href' => $profile->profileurl)); + common_element('img', array('src' => ($avatar) ? common_avatar_display_url($avatar) : common_default_avatar(AVATAR_STREAM_SIZE), + 'class' => 'avatar stream', + 'width' => AVATAR_STREAM_SIZE, + 'height' => AVATAR_STREAM_SIZE, + 'alt' => + ($profile->fullname) ? $profile->fullname : + $profile->nickname)); + common_element_end('a'); + common_element('a', array('href' => $profile->profileurl, + 'class' => 'nickname'), + $profile->nickname); + # FIXME: URL, image, video, audio + common_element_start('p', array('class' => 'content')); + if ($notice->rendered) { + common_raw($this->highlight($notice->rendered, $terms)); + } else { + # XXX: may be some uncooked notices in the DB, + # we cook them right now. This should probably disappear in future + # versions (>> 0.4.x) + common_raw($this->highlight(common_render_content($notice->content, $notice), $terms)); + } + common_element_end('p'); + $noticeurl = common_local_url('shownotice', array('notice' => $notice->id)); + common_element_start('p', 'time'); + common_element('a', array('class' => 'permalink', + 'href' => $noticeurl, + 'title' => common_exact_date($notice->created)), + common_date_string($notice->created)); + if ($notice->reply_to) { + $replyurl = common_local_url('shownotice', array('notice' => $notice->reply_to)); + common_text(' ('); + common_element('a', array('class' => 'inreplyto', + 'href' => $replyurl), + _('in reply to...')); + common_text(')'); + } + common_element_start('a', + array('href' => common_local_url('newnotice', + array('replyto' => $profile->nickname)), + 'onclick' => 'doreply("'.$profile->nickname.'"); return false', + 'title' => _('reply'), + 'class' => 'replybutton')); + common_hidden('posttoken', common_session_token()); + + common_raw('→'); + common_element_end('a'); + common_element_end('p'); + common_element_end('li'); + } + + function highlight($text, $terms) { + /* Highligh serach terms */ + $pattern = '/('.implode('|',array_map('htmlspecialchars', $terms)).')/i'; + $result = preg_replace($pattern, '\\1', $text); + + /* Remove highlighting from inside links, loop incase multiple highlights in links */ + $pattern = '/(href="[^"]*)('.implode('|',array_map('htmlspecialchars', $terms)).')<\/strong>([^"]*")/iU'; + do { + $result = preg_replace($pattern, '\\1\\2\\3', $result, -1, $count); + } while ($count); + return $result; + } +} diff --git a/_darcs/pristine/actions/noticesearchrss.php b/_darcs/pristine/actions/noticesearchrss.php new file mode 100644 index 0000000000..0f38515a02 --- /dev/null +++ b/_darcs/pristine/actions/noticesearchrss.php @@ -0,0 +1,70 @@ +. + */ + +if (!defined('LACONICA')) { exit(1); } + +require_once(INSTALLDIR.'/lib/rssaction.php'); + +// Formatting of RSS handled by Rss10Action + +class NoticesearchrssAction extends Rss10Action { + + function init() { + return true; + } + + function get_notices($limit=0) { + + $q = $this->trimmed('q'); + $notices = array(); + + $notice = new Notice(); + + # lcase it for comparison + $q = strtolower($q); + + $search_engine = $notice->getSearchEngine('identica_notices'); + $search_engine->set_sort_mode('chron'); + + if (!$limit) $limit = 20; + $search_engine->limit(0, $limit, true); + $search_engine->query($q); + $notice->find(); + + while ($notice->fetch()) { + $notices[] = clone($notice); + } + + return $notices; + } + + function get_channel() { + global $config; + $q = $this->trimmed('q'); + $c = array('url' => common_local_url('noticesearchrss', array('q' => $q)), + 'title' => $config['site']['name'] . sprintf(_(' Search Stream for "%s"'), $q), + 'link' => common_local_url('noticesearch', array('q' => $q)), + 'description' => sprintf(_('All updates matching search term "%s"'), $q)); + return $c; + } + + function get_image() { + return NULL; + } +} diff --git a/_darcs/pristine/actions/nudge.php b/_darcs/pristine/actions/nudge.php new file mode 100644 index 0000000000..677f588005 --- /dev/null +++ b/_darcs/pristine/actions/nudge.php @@ -0,0 +1,84 @@ +. + */ + +if (!defined('LACONICA')) { exit(1); } + +require_once(INSTALLDIR.'/lib/mail.php'); + +class NudgeAction extends Action { + + function handle($args) { + parent::handle($args); + + if (!common_logged_in()) { + $this->client_error(_('Not logged in.')); + return; + } + + $user = common_current_user(); + $other = User::staticGet('nickname', $this->arg('nickname')); + + if ($_SERVER['REQUEST_METHOD'] != 'POST') { + common_redirect(common_local_url('showstream', array('nickname' => $other->nickname))); + return; + } + + # CSRF protection + + $token = $this->trimmed('token'); + + if (!$token || $token != common_session_token()) { + $this->client_error(_('There was a problem with your session token. Try again, please.')); + return; + } + + if (!$other->email || !$other->emailnotifynudge) { + $this->client_error(_('This user doesn\'t allow nudges or hasn\'t confirmed or set his email yet.')); + return; + } + + $this->notify($user, $other); + + if ($this->boolean('ajax')) { + common_start_html('text/xml;charset=utf-8', true); + common_element_start('head'); + common_element('title', null, _('Nudge sent')); + common_element_end('head'); + common_element_start('body'); + common_nudge_response(); + common_element_end('body'); + common_element_end('html'); + } else { + // display a confirmation to the user + common_redirect(common_local_url('showstream', + array('nickname' => $other->nickname))); + } + } + + function notify($user, $other) { + if ($other->id != $user->id) { + if ($other->email && $other->emailnotifynudge) { + mail_notify_nudge($user, $other); + } + # XXX: notify by IM + # XXX: notify by SMS + } + } +} + diff --git a/_darcs/pristine/actions/openidlogin.php b/_darcs/pristine/actions/openidlogin.php new file mode 100644 index 0000000000..1b289dbeab --- /dev/null +++ b/_darcs/pristine/actions/openidlogin.php @@ -0,0 +1,92 @@ +. + */ + +if (!defined('LACONICA')) { exit(1); } + +require_once(INSTALLDIR.'/lib/openid.php'); + +class OpenidloginAction extends Action { + + function handle($args) { + parent::handle($args); + if (common_logged_in()) { + common_user_error(_('Already logged in.')); + } else if ($_SERVER['REQUEST_METHOD'] == 'POST') { + $openid_url = $this->trimmed('openid_url'); + + # CSRF protection + $token = $this->trimmed('token'); + if (!$token || $token != common_session_token()) { + $this->show_form(_('There was a problem with your session token. Try again, please.'), $openid_url); + return; + } + + $rememberme = $this->boolean('rememberme'); + + common_ensure_session(); + + $_SESSION['openid_rememberme'] = $rememberme; + + $result = oid_authenticate($openid_url, + 'finishopenidlogin'); + + if (is_string($result)) { # error message + unset($_SESSION['openid_rememberme']); + $this->show_form($result, $openid_url); + } + } else { + $openid_url = oid_get_last(); + $this->show_form(NULL, $openid_url); + } + } + + function get_instructions() { + return _('Login with an [OpenID](%%doc.openid%%) account.'); + } + + function show_top($error=NULL) { + if ($error) { + common_element('div', array('class' => 'error'), $error); + } else { + $instr = $this->get_instructions(); + $output = common_markup_to_html($instr); + common_element_start('div', 'instructions'); + common_raw($output); + common_element_end('div'); + } + } + + function show_form($error=NULL, $openid_url) { + common_show_header(_('OpenID Login'), NULL, $error, array($this, 'show_top')); + $formaction = common_local_url('openidlogin'); + common_element_start('form', array('method' => 'post', + 'id' => 'openidlogin', + 'action' => $formaction)); + common_hidden('token', common_session_token()); + common_input('openid_url', _('OpenID URL'), + $openid_url, + _('Your OpenID URL')); + common_checkbox('rememberme', _('Remember me'), false, + _('Automatically login in the future; ' . + 'not for shared computers!')); + common_submit('submit', _('Login')); + common_element_end('form'); + common_show_footer(); + } +} diff --git a/_darcs/pristine/actions/openidsettings.php b/_darcs/pristine/actions/openidsettings.php new file mode 100644 index 0000000000..f539d111f9 --- /dev/null +++ b/_darcs/pristine/actions/openidsettings.php @@ -0,0 +1,156 @@ +. + */ + +if (!defined('LACONICA')) { exit(1); } + +require_once(INSTALLDIR.'/lib/settingsaction.php'); +require_once(INSTALLDIR.'/lib/openid.php'); + +class OpenidsettingsAction extends SettingsAction { + + function get_instructions() { + return _('[OpenID](%%doc.openid%%) lets you log into many sites ' . + ' with the same user account. '. + ' Manage your associated OpenIDs from here.'); + } + + function show_form($msg=NULL, $success=false) { + + $user = common_current_user(); + + $this->form_header(_('OpenID settings'), $msg, $success); + + common_element_start('form', array('method' => 'post', + 'id' => 'openidadd', + 'action' => + common_local_url('openidsettings'))); + common_hidden('token', common_session_token()); + common_element('h2', NULL, _('Add OpenID')); + common_element('p', NULL, + _('If you want to add an OpenID to your account, ' . + 'enter it in the box below and click "Add".')); + common_element_start('p'); + common_element('label', array('for' => 'openid_url'), + _('OpenID URL')); + common_element('input', array('name' => 'openid_url', + 'type' => 'text', + 'id' => 'openid_url')); + common_element('input', array('type' => 'submit', + 'id' => 'add', + 'name' => 'add', + 'class' => 'submit', + 'value' => _('Add'))); + common_element_end('p'); + common_element_end('form'); + + $oid = new User_openid(); + $oid->user_id = $user->id; + + $cnt = $oid->find(); + + if ($cnt > 0) { + + common_element('h2', NULL, _('Remove OpenID')); + + if ($cnt == 1 && !$user->password) { + + common_element('p', NULL, + _('Removing your only OpenID would make it impossible to log in! ' . + 'If you need to remove it, add another OpenID first.')); + + if ($oid->fetch()) { + common_element_start('p'); + common_element('a', array('href' => $oid->canonical), + $oid->display); + common_element_end('p'); + } + + } else { + + common_element('p', NULL, + _('You can remove an OpenID from your account '. + 'by clicking the button marked "Remove".')); + $idx = 0; + + while ($oid->fetch()) { + common_element_start('form', array('method' => 'POST', + 'id' => 'openiddelete' . $idx, + 'action' => + common_local_url('openidsettings'))); + common_element_start('p'); + common_hidden('token', common_session_token()); + common_element('a', array('href' => $oid->canonical), + $oid->display); + common_element('input', array('type' => 'hidden', + 'id' => 'openid_url'.$idx, + 'name' => 'openid_url', + 'value' => $oid->canonical)); + common_element('input', array('type' => 'submit', + 'id' => 'remove'.$idx, + 'name' => 'remove', + 'class' => 'submit', + 'value' => _('Remove'))); + common_element_end('p'); + common_element_end('form'); + $idx++; + } + } + } + + common_show_footer(); + } + + function handle_post() { + # CSRF protection + $token = $this->trimmed('token'); + if (!$token || $token != common_session_token()) { + $this->show_form(_('There was a problem with your session token. Try again, please.')); + return; + } + + if ($this->arg('add')) { + $result = oid_authenticate($this->trimmed('openid_url'), 'finishaddopenid'); + if (is_string($result)) { # error message + $this->show_form($result); + } + } else if ($this->arg('remove')) { + $this->remove_openid(); + } else { + $this->show_form(_('Something weird happened.')); + } + } + + function remove_openid() { + + $openid_url = $this->trimmed('openid_url'); + $oid = User_openid::staticGet('canonical', $openid_url); + if (!$oid) { + $this->show_form(_('No such OpenID.')); + return; + } + $cur = common_current_user(); + if (!$cur || $oid->user_id != $cur->id) { + $this->show_form(_('That OpenID does not belong to you.')); + return; + } + $oid->delete(); + $this->show_form(_('OpenID removed.'), true); + return; + } +} diff --git a/_darcs/pristine/actions/opensearch.php b/_darcs/pristine/actions/opensearch.php new file mode 100644 index 0000000000..0f366be4ca --- /dev/null +++ b/_darcs/pristine/actions/opensearch.php @@ -0,0 +1,59 @@ +. + */ + +if (!defined('LACONICA')) { exit(1); } + +class OpensearchAction extends Action { + + function handle($args) { + + parent::handle($args); + + $type = $this->trimmed('type'); + + $short_name = ''; + if ($type == 'people') { + $type = 'peoplesearch'; + $short_name = _('People Search'); + } else { + $short_name = _('Notice Search'); + $type = 'noticesearch'; + } + + header('Content-Type: text/html'); + + common_start_xml(); + common_element_start('OpenSearchDescription', array('xmlns' => 'http://a9.com/-/spec/opensearch/1.1/')); + + $short_name = common_config('site', 'name').' '.$short_name; + common_element('ShortName', NULL, $short_name); + common_element('Contact', NULL, common_config('site', 'email')); + common_element('Url', array('type' => 'text/html', 'method' => 'get', + 'template' => str_replace('---', '{searchTerms}', common_local_url($type, array('q' => '---'))))); + common_element('Image', array('height' => 16, 'width' => 16, 'type' => 'image/vnd.microsoft.icon'), common_path('favicon.ico')); + common_element('Image', array('height' => 50, 'width' => 50, 'type' => 'image/png'), theme_path('logo.png')); + common_element('AdultContent', NULL, 'false'); + common_element('Language', NULL, common_language()); + common_element('OutputEncoding', NULL, 'UTF-8'); + common_element('InputEncoding', NULL, 'UTF-8'); + + common_element_end('OpenSearchDescription'); + common_end_xml(); + } +} diff --git a/_darcs/pristine/actions/othersettings.php b/_darcs/pristine/actions/othersettings.php new file mode 100644 index 0000000000..eccf90e91b --- /dev/null +++ b/_darcs/pristine/actions/othersettings.php @@ -0,0 +1,181 @@ +. + */ + +if (!defined('LACONICA')) { exit(1); } + +require_once(INSTALLDIR.'/lib/settingsaction.php'); + +class OthersettingsAction extends SettingsAction { + + function get_instructions() { + return _('Manage various other options.'); + } + + function show_form($msg=NULL, $success=false) { + $user = common_current_user(); + + $this->form_header(_('Other Settings'), $msg, $success); + + common_element('h2', NULL, _('URL Auto-shortening')); + common_element_start('form', array('method' => 'post', + 'id' => 'othersettings', + 'action' => + common_local_url('othersettings'))); + common_hidden('token', common_session_token()); + + $services = array( + '' => 'None', + 'ur1.ca' => 'ur1.ca (free service)', + '2tu.us' => '2tu.us (free service)', + 'ptiturl.com' => 'ptiturl.com', + 'bit.ly' => 'bit.ly', + 'tinyurl.com' => 'tinyurl.com', + 'is.gd' => 'is.gd', + 'snipr.com' => 'snipr.com', + 'metamark.net' => 'metamark.net' + ); + + common_dropdown('urlshorteningservice', _('Service'), $services, _('Automatic shortening service to use.'), FALSE, $user->urlshorteningservice); + + common_submit('save', _('Save')); + + common_element_end('form'); + +// common_element('h2', NULL, _('Delete my account')); +// $this->show_delete_form(); + + common_show_footer(); + } + + function show_feeds_list($feeds) { + common_element_start('div', array('class' => 'feedsdel')); + common_element('p', null, 'Feeds:'); + common_element_start('ul', array('class' => 'xoxo')); + + foreach ($feeds as $key => $value) { + $this->common_feed_item($feeds[$key]); + } + common_element_end('ul'); + common_element_end('div'); + } + + //TODO move to common.php (and retrace its origin) + function common_feed_item($feed) { + $user = common_current_user(); + $nickname = $user->nickname; + + switch($feed['item']) { + case 'notices': default: + $feed_classname = $feed['type']; + $feed_mimetype = "application/".$feed['type']."+xml"; + $feed_title = "$nickname's ".$feed['version']." notice feed"; + $feed['textContent'] = "RSS"; + break; + + case 'foaf': + $feed_classname = "foaf"; + $feed_mimetype = "application/".$feed['type']."+xml"; + $feed_title = "$nickname's FOAF file"; + $feed['textContent'] = "FOAF"; + break; + } + common_element_start('li'); + common_element('a', array('href' => $feed['href'], + 'class' => $feed_classname, + 'type' => $feed_mimetype, + 'title' => $feed_title), + $feed['textContent']); + common_element_end('li'); + } + +// function show_delete_form() { +// $user = common_current_user(); +// $notices = DB_DataObject::factory('notice'); +// $notices->profile_id = $user->id; +// $notice_count = (int) $notices->count(); +// +// common_element_start('form', array('method' => 'POST', +// 'id' => 'delete', +// 'action' => +// common_local_url('deleteprofile'))); +// +// common_hidden('token', common_session_token()); +// common_element('p', null, "You can copy your notices and contacts by saving the two links below before deleting your account. Be careful, this operation cannot be undone."); +// +// $this->show_feeds_list(array(0=>array('href'=>common_local_url('userrss', array('limit' => $notice_count, 'nickname' => $user->nickname)), +// 'type' => 'rss', +// 'version' => 'RSS 1.0', +// 'item' => 'notices'), +// 1=>array('href'=>common_local_url('foaf',array('nickname' => $user->nickname)), +// 'type' => 'rdf', +// 'version' => 'FOAF', +// 'item' => 'foaf'))); +// +// common_submit('deleteaccount', _('Delete my account')); +// common_element_end('form'); +// } + + function handle_post() { + + # CSRF protection + $token = $this->trimmed('token'); + if (!$token || $token != common_session_token()) { + $this->show_form(_('There was a problem with your session token. Try again, please.')); + return; + } + + if ($this->arg('save')) { + $this->save_preferences(); + }else { + $this->show_form(_('Unexpected form submission.')); + } + } + + function save_preferences() { + + $urlshorteningservice = $this->trimmed('urlshorteningservice'); + + if (!is_null($urlshorteningservice) && strlen($urlshorteningservice) > 50) { + $this->show_form(_('URL shortening service is too long (max 50 chars).')); + return; + } + + $user = common_current_user(); + + assert(!is_null($user)); # should already be checked + + $user->query('BEGIN'); + + $original = clone($user); + + $user->urlshorteningservice = $urlshorteningservice; + + $result = $user->update($original); + + if ($result === FALSE) { + common_log_db_error($user, 'UPDATE', __FILE__); + common_server_error(_('Couldn\'t update user.')); + return; + } + + $user->query('COMMIT'); + + $this->show_form(_('Preferences saved.'), true); + } +} diff --git a/_darcs/pristine/actions/outbox.php b/_darcs/pristine/actions/outbox.php new file mode 100644 index 0000000000..c48d9c2062 --- /dev/null +++ b/_darcs/pristine/actions/outbox.php @@ -0,0 +1,56 @@ +. + */ + +if (!defined('LACONICA')) { exit(1); } + +require_once(INSTALLDIR.'/lib/mailbox.php'); + +class OutboxAction extends MailboxAction { + + function get_title($user, $page) { + if ($page > 1) { + $title = sprintf(_("Outbox for %s - page %d"), $user->nickname, $page); + } else { + $title = sprintf(_("Outbox for %s"), $user->nickname); + } + return $title; + } + + function get_messages($user, $page) { + $message = new Message(); + $message->from_profile = $user->id; + $message->orderBy('created DESC, id DESC'); + $message->limit((($page-1)*MESSAGES_PER_PAGE), MESSAGES_PER_PAGE + 1); + + if ($message->find()) { + return $message; + } else { + return NULL; + } + } + + function get_message_profile($message) { + return $message->getTo(); + } + + function get_instructions() { + return _('This is your outbox, which lists private messages you have sent.'); + } + +} diff --git a/_darcs/pristine/actions/peoplesearch.php b/_darcs/pristine/actions/peoplesearch.php new file mode 100644 index 0000000000..2e54233ec1 --- /dev/null +++ b/_darcs/pristine/actions/peoplesearch.php @@ -0,0 +1,84 @@ +. + */ + +if (!defined('LACONICA')) { exit(1); } + +require_once(INSTALLDIR.'/lib/searchaction.php'); +require_once(INSTALLDIR.'/lib/profilelist.php'); + +class PeoplesearchAction extends SearchAction { + + function get_instructions() { + return _('Search for people on %%site.name%% by their name, location, or interests. ' . + 'Separate the terms by spaces; they must be 3 characters or more.'); + } + + function get_title() { + return _('People search'); + } + + function show_results($q, $page) { + + $profile = new Profile(); + + # lcase it for comparison + $q = strtolower($q); + + $search_engine = $profile->getSearchEngine('identica_people'); + + $search_engine->set_sort_mode('chron'); + # Ask for an extra to see if there's more. + $search_engine->limit((($page-1)*PROFILES_PER_PAGE), PROFILES_PER_PAGE + 1); + if (false === $search_engine->query($q)) { + $cnt = 0; + } + else { + $cnt = $profile->find(); + } + if ($cnt > 0) { + $terms = preg_split('/[\s,]+/', $q); + $results = new PeopleSearchResults($profile, $terms); + $results->show_list(); + } else { + common_element('p', 'error', _('No results')); + } + + $profile->free(); + + common_pagination($page > 1, $cnt > PROFILES_PER_PAGE, + $page, 'peoplesearch', array('q' => $q)); + } +} + +class PeopleSearchResults extends ProfileList { + + var $terms = NULL; + var $pattern = NULL; + + function __construct($profile, $terms) { + parent::__construct($profile); + $this->terms = array_map('preg_quote', + array_map('htmlspecialchars', $terms)); + $this->pattern = '/('.implode('|',$terms).')/i'; + } + + function highlight($text) { + return preg_replace($this->pattern, '\\1', htmlspecialchars($text)); + } +} diff --git a/_darcs/pristine/actions/peopletag.php b/_darcs/pristine/actions/peopletag.php new file mode 100644 index 0000000000..c508e05943 --- /dev/null +++ b/_darcs/pristine/actions/peopletag.php @@ -0,0 +1,103 @@ +. + */ + +if (!defined('LACONICA')) { exit(1); } + +require_once(INSTALLDIR.'/lib/profilelist.php'); + +class PeopletagAction extends Action { + + function handle($args) { + + parent::handle($args); + + $tag = $this->trimmed('tag'); + + if (!common_valid_profile_tag($tag)) { + $this->client_error(sprintf(_('Not a valid people tag: %s'), $tag)); + return; + } + + $page = $this->trimmed('page'); + + if (!$page) { + $page = 1; + } + + # Looks like we're good; show the header + + common_show_header(sprintf(_('Users self-tagged with %s - page %d'), $tag, $page), + NULL, $tag, array($this, 'show_top')); + + $this->show_people($tag, $page); + + common_show_footer(); + } + + function show_people($tag, $page) { + + $profile = new Profile(); + + $offset = ($page-1)*PROFILES_PER_PAGE; + $limit = PROFILES_PER_PAGE + 1; + + if (common_config('db','type') == 'pgsql') { + $lim = ' LIMIT ' . $limit . ' OFFSET ' . $offset; + } else { + $lim = ' LIMIT ' . $offset . ', ' . $limit; + } + + # XXX: memcached this + + $profile->query(sprintf('SELECT profile.* ' . + 'FROM profile JOIN profile_tag ' . + 'ON profile.id = profile_tag.tagger ' . + 'WHERE profile_tag.tagger = profile_tag.tagged ' . + 'AND tag = "%s" ' . + 'ORDER BY profile_tag.modified DESC ' . + $lim, $tag)); + + $pl = new ProfileList($profile); + $cnt = $pl->show_list(); + + common_pagination($page > 1, + $cnt > PROFILES_PER_PAGE, + $page, + $this->trimmed('action'), + array('tag' => $tag)); + } + + function show_top($tag) { + $instr = sprintf(_('These are users who have tagged themselves "%s" ' . + 'to show a common interest, characteristic, hobby or job.'), $tag); + common_element_start('div', 'instructions'); + common_element_start('p'); + common_text($instr); + common_element_end('p'); + common_element_end('div'); + } + + function get_title() { + return NULL; + } + + function show_header($arr) { + return; + } +} diff --git a/_darcs/pristine/actions/postnotice.php b/_darcs/pristine/actions/postnotice.php new file mode 100644 index 0000000000..243081f122 --- /dev/null +++ b/_darcs/pristine/actions/postnotice.php @@ -0,0 +1,88 @@ +. + */ + +if (!defined('LACONICA')) { exit(1); } + +require_once(INSTALLDIR.'/lib/omb.php'); + +class PostnoticeAction extends Action { + function handle($args) { + parent::handle($args); + try { + common_remove_magic_from_request(); + $req = OAuthRequest::from_request(); + # Note: server-to-server function! + $server = omb_oauth_server(); + list($consumer, $token) = $server->verify_request($req); + if ($this->save_notice($req, $consumer, $token)) { + print "omb_version=".OMB_VERSION_01; + } + } catch (OAuthException $e) { + common_server_error($e->getMessage()); + return; + } + } + + function save_notice(&$req, &$consumer, &$token) { + $version = $req->get_parameter('omb_version'); + if ($version != OMB_VERSION_01) { + common_user_error(_('Unsupported OMB version'), 400); + return false; + } + # First, check to see + $listenee = $req->get_parameter('omb_listenee'); + $remote_profile = Remote_profile::staticGet('uri', $listenee); + if (!$remote_profile) { + common_user_error(_('Profile unknown'), 403); + return false; + } + $sub = Subscription::staticGet('token', $token->key); + if (!$sub) { + common_user_error(_('No such subscription'), 403); + return false; + } + $content = $req->get_parameter('omb_notice_content'); + $content_shortened = common_shorten_links($content); + if (mb_strlen($content_shortened) > 140) { + common_user_error(_('Invalid notice content'), 400); + return false; + } + $notice_uri = $req->get_parameter('omb_notice'); + if (!Validate::uri($notice_uri) && + !common_valid_tag($notice_uri)) { + common_user_error(_('Invalid notice uri'), 400); + return false; + } + $notice_url = $req->get_parameter('omb_notice_url'); + if ($notice_url && !common_valid_http_url($notice_url)) { + common_user_error(_('Invalid notice url'), 400); + return false; + } + $notice = Notice::staticGet('uri', $notice_uri); + if (!$notice) { + $notice = Notice::saveNew($remote_profile->id, $content, 'omb', false, 0, $notice_uri); + if (is_string($notice)) { + common_server_serror($notice, 500); + return false; + } + common_broadcast_notice($notice, true); + } + return true; + } +} diff --git a/_darcs/pristine/actions/profilesettings.php b/_darcs/pristine/actions/profilesettings.php new file mode 100644 index 0000000000..ed2623c9bb --- /dev/null +++ b/_darcs/pristine/actions/profilesettings.php @@ -0,0 +1,439 @@ +. + */ + +if (!defined('LACONICA')) { exit(1); } + +require_once(INSTALLDIR.'/lib/settingsaction.php'); + +class ProfilesettingsAction extends SettingsAction { + + function get_instructions() { + return _('You can update your personal profile info here '. + 'so people know more about you.'); + } + + function show_form($msg=NULL, $success=false) { + $this->form_header(_('Profile settings'), $msg, $success); + $this->show_settings_form(); + common_element('h2', NULL, _('Avatar')); + $this->show_avatar_form(); + common_element('h2', NULL, _('Change password')); + $this->show_password_form(); +// common_element('h2', NULL, _('Delete my account')); +// $this->show_delete_form(); + common_show_footer(); + } + + function handle_post() { + + # CSRF protection + + $token = $this->trimmed('token'); + if (!$token || $token != common_session_token()) { + $this->show_form(_('There was a problem with your session token. Try again, please.')); + return; + } + + if ($this->arg('save')) { + $this->save_profile(); + } else if ($this->arg('upload')) { + $this->upload_avatar(); + } else if ($this->arg('changepass')) { + $this->change_password(); + } + + } + + function show_settings_form() { + + $user = common_current_user(); + $profile = $user->getProfile(); + + common_element_start('form', array('method' => 'POST', + 'id' => 'profilesettings', + 'action' => + common_local_url('profilesettings'))); + common_hidden('token', common_session_token()); + + # too much common patterns here... abstractable? + + common_input('nickname', _('Nickname'), + ($this->arg('nickname')) ? $this->arg('nickname') : $profile->nickname, + _('1-64 lowercase letters or numbers, no punctuation or spaces')); + common_input('fullname', _('Full name'), + ($this->arg('fullname')) ? $this->arg('fullname') : $profile->fullname); + common_input('homepage', _('Homepage'), + ($this->arg('homepage')) ? $this->arg('homepage') : $profile->homepage, + _('URL of your homepage, blog, or profile on another site')); + common_textarea('bio', _('Bio'), + ($this->arg('bio')) ? $this->arg('bio') : $profile->bio, + _('Describe yourself and your interests in 140 chars')); + common_input('location', _('Location'), + ($this->arg('location')) ? $this->arg('location') : $profile->location, + _('Where you are, like "City, State (or Region), Country"')); + common_input('tags', _('Tags'), + ($this->arg('tags')) ? $this->arg('tags') : implode(' ', $user->getSelfTags()), + _('Tags for yourself (letters, numbers, -, ., and _), comma- or space- separated')); + + $language = common_language(); + common_dropdown('language', _('Language'), get_nice_language_list(), _('Preferred language'), TRUE, $language); + $timezone = common_timezone(); + $timezones = array(); + foreach(DateTimeZone::listIdentifiers() as $k => $v) { + $timezones[$v] = $v; + } + common_dropdown('timezone', _('Timezone'), $timezones, _('What timezone are you normally in?'), TRUE, $timezone); + + common_checkbox('autosubscribe', _('Automatically subscribe to whoever subscribes to me (best for non-humans)'), + ($this->arg('autosubscribe')) ? $this->boolean('autosubscribe') : $user->autosubscribe); + + common_submit('save', _('Save')); + + common_element_end('form'); + + + } + + function show_avatar_form() { + + $user = common_current_user(); + $profile = $user->getProfile(); + + if (!$profile) { + common_log_db_error($user, 'SELECT', __FILE__); + $this->server_error(_('User without matching profile')); + return; + } + + $original = $profile->getOriginalAvatar(); + + + common_element_start('form', array('enctype' => 'multipart/form-data', + 'method' => 'POST', + 'id' => 'avatar', + 'action' => + common_local_url('profilesettings'))); + common_hidden('token', common_session_token()); + + if ($original) { + common_element('img', array('src' => $original->url, + 'class' => 'avatar original', + 'width' => $original->width, + 'height' => $original->height, + 'alt' => $user->nickname)); + } + + $avatar = $profile->getAvatar(AVATAR_PROFILE_SIZE); + + if ($avatar) { + common_element('img', array('src' => $avatar->url, + 'class' => 'avatar profile', + 'width' => AVATAR_PROFILE_SIZE, + 'height' => AVATAR_PROFILE_SIZE, + 'alt' => $user->nickname)); + } + + + common_element('input', array('name' => 'MAX_FILE_SIZE', + 'type' => 'hidden', + 'id' => 'MAX_FILE_SIZE', + 'value' => MAX_AVATAR_SIZE)); + + common_element_start('p'); + + + common_element('input', array('name' => 'avatarfile', + 'type' => 'file', + 'id' => 'avatarfile')); + common_element_end('p'); + + common_submit('upload', _('Upload')); + common_element_end('form'); + + } + + function show_password_form() { + + $user = common_current_user(); + common_element_start('form', array('method' => 'POST', + 'id' => 'password', + 'action' => + common_local_url('profilesettings'))); + + common_hidden('token', common_session_token()); + + # Users who logged in with OpenID won't have a pwd + if ($user->password) { + common_password('oldpassword', _('Old password')); + } + common_password('newpassword', _('New password'), + _('6 or more characters')); + common_password('confirm', _('Confirm'), + _('same as password above')); + common_submit('changepass', _('Change')); + common_element_end('form'); + } + + function save_profile() { + $nickname = $this->trimmed('nickname'); + $fullname = $this->trimmed('fullname'); + $homepage = $this->trimmed('homepage'); + $bio = $this->trimmed('bio'); + $location = $this->trimmed('location'); + $autosubscribe = $this->boolean('autosubscribe'); + $language = $this->trimmed('language'); + $timezone = $this->trimmed('timezone'); + $tagstring = $this->trimmed('tags'); + + # Some validation + + if (!Validate::string($nickname, array('min_length' => 1, + 'max_length' => 64, + 'format' => VALIDATE_NUM . VALIDATE_ALPHA_LOWER))) { + $this->show_form(_('Nickname must have only lowercase letters and numbers and no spaces.')); + return; + } else if (!User::allowed_nickname($nickname)) { + $this->show_form(_('Not a valid nickname.')); + return; + } else if (!is_null($homepage) && (strlen($homepage) > 0) && + !Validate::uri($homepage, array('allowed_schemes' => array('http', 'https')))) { + $this->show_form(_('Homepage is not a valid URL.')); + return; + } else if (!is_null($fullname) && strlen($fullname) > 255) { + $this->show_form(_('Full name is too long (max 255 chars).')); + return; + } else if (!is_null($bio) && strlen($bio) > 140) { + $this->show_form(_('Bio is too long (max 140 chars).')); + return; + } else if (!is_null($location) && strlen($location) > 255) { + $this->show_form(_('Location is too long (max 255 chars).')); + return; + } else if (is_null($timezone) || !in_array($timezone, DateTimeZone::listIdentifiers())) { + $this->show_form(_('Timezone not selected.')); + return; + } else if ($this->nickname_exists($nickname)) { + $this->show_form(_('Nickname already in use. Try another one.')); + return; + } else if (!is_null($language) && strlen($language) > 50) { + $this->show_form(_('Language is too long (max 50 chars).')); + return; + } + + if ($tagstring) { + $tags = array_map('common_canonical_tag', preg_split('/[\s,]+/', $tagstring)); + } else { + $tags = array(); + } + + foreach ($tags as $tag) { + if (!common_valid_profile_tag($tag)) { + $this->show_form(sprintf(_('Invalid tag: "%s"'), $tag)); + return; + } + } + + $user = common_current_user(); + + $user->query('BEGIN'); + + if ($user->nickname != $nickname || + $user->language != $language || + $user->timezone != $timezone) { + + common_debug('Updating user nickname from ' . $user->nickname . ' to ' . $nickname, + __FILE__); + common_debug('Updating user language from ' . $user->language . ' to ' . $language, + __FILE__); + common_debug('Updating user timezone from ' . $user->timezone . ' to ' . $timezone, + __FILE__); + + $original = clone($user); + + $user->nickname = $nickname; + $user->language = $language; + $user->timezone = $timezone; + + $result = $user->updateKeys($original); + + if ($result === FALSE) { + common_log_db_error($user, 'UPDATE', __FILE__); + common_server_error(_('Couldn\'t update user.')); + return; + } else { + # Re-initialize language environment if it changed + common_init_language(); + } + } + + # XXX: XOR + + if ($user->autosubscribe ^ $autosubscribe) { + + $original = clone($user); + + $user->autosubscribe = $autosubscribe; + + $result = $user->update($original); + + if ($result === FALSE) { + common_log_db_error($user, 'UPDATE', __FILE__); + common_server_error(_('Couldn\'t update user for autosubscribe.')); + return; + } + } + + $profile = $user->getProfile(); + + $orig_profile = clone($profile); + + $profile->nickname = $user->nickname; + $profile->fullname = $fullname; + $profile->homepage = $homepage; + $profile->bio = $bio; + $profile->location = $location; + $profile->profileurl = common_profile_url($nickname); + + common_debug('Old profile: ' . common_log_objstring($orig_profile), __FILE__); + common_debug('New profile: ' . common_log_objstring($profile), __FILE__); + + $result = $profile->update($orig_profile); + + if (!$result) { + common_log_db_error($profile, 'UPDATE', __FILE__); + common_server_error(_('Couldn\'t save profile.')); + return; + } + + # Set the user tags + + $result = $user->setSelfTags($tags); + + if (!$result) { + common_server_error(_('Couldn\'t save tags.')); + return; + } + + $user->query('COMMIT'); + + common_broadcast_profile($profile); + + $this->show_form(_('Settings saved.'), TRUE); + } + + + function upload_avatar() { + switch ($_FILES['avatarfile']['error']) { + case UPLOAD_ERR_OK: # success, jump out + break; + case UPLOAD_ERR_INI_SIZE: + case UPLOAD_ERR_FORM_SIZE: + $this->show_form(_('That file is too big.')); + return; + case UPLOAD_ERR_PARTIAL: + @unlink($_FILES['avatarfile']['tmp_name']); + $this->show_form(_('Partial upload.')); + return; + default: + $this->show_form(_('System error uploading file.')); + return; + } + + $info = @getimagesize($_FILES['avatarfile']['tmp_name']); + + if (!$info) { + @unlink($_FILES['avatarfile']['tmp_name']); + $this->show_form(_('Not an image or corrupt file.')); + return; + } + + switch ($info[2]) { + case IMAGETYPE_GIF: + case IMAGETYPE_JPEG: + case IMAGETYPE_PNG: + break; + default: + $this->show_form(_('Unsupported image file format.')); + return; + } + + $user = common_current_user(); + $profile = $user->getProfile(); + + if ($profile->setOriginal($_FILES['avatarfile']['tmp_name'])) { + $this->show_form(_('Avatar updated.'), true); + } else { + $this->show_form(_('Failed updating avatar.')); + } + + @unlink($_FILES['avatarfile']['tmp_name']); + } + + function nickname_exists($nickname) { + $user = common_current_user(); + $other = User::staticGet('nickname', $nickname); + if (!$other) { + return false; + } else { + return $other->id != $user->id; + } + } + + function change_password() { + + $user = common_current_user(); + assert(!is_null($user)); # should already be checked + + # FIXME: scrub input + + $newpassword = $this->arg('newpassword'); + $confirm = $this->arg('confirm'); + $token = $this->arg('token'); + + if (0 != strcmp($newpassword, $confirm)) { + $this->show_form(_('Passwords don\'t match.')); + return; + } + + if ($user->password) { + $oldpassword = $this->arg('oldpassword'); + + if (!common_check_user($user->nickname, $oldpassword)) { + $this->show_form(_('Incorrect old password')); + return; + } + } + + $original = clone($user); + + $user->password = common_munge_password($newpassword, $user->id); + + $val = $user->validate(); + if ($val !== TRUE) { + $this->show_form(_('Error saving user; invalid.')); + return; + } + + if (!$user->update($original)) { + common_server_error(_('Can\'t save new password.')); + return; + } + + $this->show_form(_('Password saved.'), true); + } +} diff --git a/_darcs/pristine/actions/public.php b/_darcs/pristine/actions/public.php new file mode 100644 index 0000000000..218f801945 --- /dev/null +++ b/_darcs/pristine/actions/public.php @@ -0,0 +1,99 @@ +. + */ + +if (!defined('LACONICA')) { exit(1); } + +require_once(INSTALLDIR.'/lib/stream.php'); + +class PublicAction extends StreamAction { + + function handle($args) { + parent::handle($args); + + $page = ($this->arg('page')) ? ($this->arg('page')+0) : 1; + + header('X-XRDS-Location: '. common_local_url('publicxrds')); + + common_show_header(_('Public timeline'), + array($this, 'show_header'), NULL, + array($this, 'show_top')); + + # XXX: Public sidebar here? + + $this->show_notices($page); + + common_show_footer(); + } + + function show_top() { + if (common_logged_in()) { + common_notice_form('public'); + } else { + $instr = $this->get_instructions(); + $output = common_markup_to_html($instr); + common_element_start('div', 'instructions'); + common_raw($output); + common_element_end('div'); + } + + $this->public_views_menu(); + + $this->show_feeds_list(array(0=>array('href'=>common_local_url('publicrss'), + 'type' => 'rss', + 'version' => 'RSS 1.0', + 'item' => 'publicrss'), + 1=>array('href'=>common_local_url('publicatom'), + 'type' => 'atom', + 'version' => 'Atom 1.0', + 'item' => 'publicatom'))); + } + + function get_instructions() { + return _('This is %%site.name%%, a [micro-blogging](http://en.wikipedia.org/wiki/Micro-blogging) service ' . + 'based on the Free Software [Laconica](http://laconi.ca/) tool. ' . + '[Join now](%%action.register%%) to share notices about yourself with friends, family, and colleagues! ([Read more](%%doc.help%%))'); + } + + function show_header() { + common_element('link', array('rel' => 'alternate', + 'href' => common_local_url('publicrss'), + 'type' => 'application/rss+xml', + 'title' => _('Public Stream Feed'))); + # for client side of OpenID authentication + common_element('meta', array('http-equiv' => 'X-XRDS-Location', + 'content' => common_local_url('publicxrds'))); + } + + function show_notices($page) { + + $cnt = 0; + $notice = Notice::publicStream(($page-1)*NOTICES_PER_PAGE, + NOTICES_PER_PAGE + 1); + + if (!$notice) { + $this->server_error(_('Could not retrieve public stream.')); + return; + } + + $cnt = $this->show_notice_list($notice); + + common_pagination($page > 1, $cnt > NOTICES_PER_PAGE, + $page, 'public'); + } +} diff --git a/_darcs/pristine/actions/publicrss.php b/_darcs/pristine/actions/publicrss.php new file mode 100644 index 0000000000..1ab6a8be06 --- /dev/null +++ b/_darcs/pristine/actions/publicrss.php @@ -0,0 +1,57 @@ +. + */ + +if (!defined('LACONICA')) { exit(1); } + +require_once(INSTALLDIR.'/lib/rssaction.php'); + +// Formatting of RSS handled by Rss10Action + +class PublicrssAction extends Rss10Action { + + function init() { + return true; + } + + function get_notices($limit=0) { + + $notices = array(); + + $notice = Notice::publicStream(0, ($limit == 0) ? 48 : $limit); + + while ($notice->fetch()) { + $notices[] = clone($notice); + } + + return $notices; + } + + function get_channel() { + global $config; + $c = array('url' => common_local_url('publicrss'), + 'title' => sprintf(_('%s Public Stream'), $config['site']['name']), + 'link' => common_local_url('public'), + 'description' => sprintf(_('All updates for %s'), $config['site']['name'])); + return $c; + } + + function get_image() { + return NULL; + } +} \ No newline at end of file diff --git a/_darcs/pristine/actions/publicxrds.php b/_darcs/pristine/actions/publicxrds.php new file mode 100644 index 0000000000..951434c878 --- /dev/null +++ b/_darcs/pristine/actions/publicxrds.php @@ -0,0 +1,79 @@ +. + */ + +if (!defined('LACONICA')) { exit(1); } + +require_once(INSTALLDIR.'/lib/openid.php'); + +# XXX: factor out similarities with XrdsAction + +class PublicxrdsAction extends Action { + + function is_readonly() { + return true; + } + + function handle($args) { + + parent::handle($args); + + header('Content-Type: application/xrds+xml'); + + common_start_xml(); + common_element_start('XRDS', array('xmlns' => 'xri://$xrds')); + + common_element_start('XRD', array('xmlns' => 'xri://$xrd*($v*2.0)', + 'xmlns:simple' => 'http://xrds-simple.net/core/1.0', + 'version' => '2.0')); + + common_element('Type', NULL, 'xri://$xrds*simple'); + + foreach (array('finishopenidlogin', 'finishaddopenid', 'finishimmediate') as $finish) { + $this->show_service(Auth_OpenID_RP_RETURN_TO_URL_TYPE, + common_local_url($finish)); + } + + common_element_end('XRD'); + + common_element_end('XRDS'); + common_end_xml(); + } + + function show_service($type, $uri, $params=NULL, $sigs=NULL, $localId=NULL) { + common_element_start('Service'); + if ($uri) { + common_element('URI', NULL, $uri); + } + common_element('Type', NULL, $type); + if ($params) { + foreach ($params as $param) { + common_element('Type', NULL, $param); + } + } + if ($sigs) { + foreach ($sigs as $sig) { + common_element('Type', NULL, $sig); + } + } + if ($localId) { + common_element('LocalID', NULL, $localId); + } + common_element_end('Service'); + } +} \ No newline at end of file diff --git a/_darcs/pristine/actions/recoverpassword.php b/_darcs/pristine/actions/recoverpassword.php new file mode 100644 index 0000000000..38c42f41d1 --- /dev/null +++ b/_darcs/pristine/actions/recoverpassword.php @@ -0,0 +1,331 @@ +. + */ + +if (!defined('LACONICA')) { exit(1); } + +# You have 24 hours to claim your password + +define(MAX_RECOVERY_TIME, 24 * 60 * 60); + +class RecoverpasswordAction extends Action { + + function handle($args) { + parent::handle($args); + if (common_logged_in()) { + $this->client_error(_('You are already logged in!')); + return; + } else if ($_SERVER['REQUEST_METHOD'] == 'POST') { + if ($this->arg('recover')) { + $this->recover_password(); + } else if ($this->arg('reset')) { + $this->reset_password(); + } else { + $this->client_error(_('Unexpected form submission.')); + } + } else { + if ($this->trimmed('code')) { + $this->check_code(); + } else { + $this->show_form(); + } + } + } + + function check_code() { + + $code = $this->trimmed('code'); + $confirm = Confirm_address::staticGet('code', $code); + + if (!$confirm) { + $this->client_error(_('No such recovery code.')); + return; + } + if ($confirm->address_type != 'recover') { + $this->client_error(_('Not a recovery code.')); + return; + } + + $user = User::staticGet($confirm->user_id); + + if (!$user) { + $this->server_error(_('Recovery code for unknown user.')); + return; + } + + $touched = strtotime($confirm->modified); + $email = $confirm->address; + + # Burn this code + + $result = $confirm->delete(); + + if (!$result) { + common_log_db_error($confirm, 'DELETE', __FILE__); + common_server_error(_('Error with confirmation code.')); + return; + } + + # These should be reaped, but for now we just check mod time + # Note: it's still deleted; let's avoid a second attempt! + + if ((time() - $touched) > MAX_RECOVERY_TIME) { + common_log(LOG_WARNING, + 'Attempted redemption on recovery code ' . + 'that is ' . $touched . ' seconds old. '); + $this->client_error(_('This confirmation code is too old. ' . + 'Please start again.')); + return; + } + + # If we used an outstanding confirmation to send the email, + # it's been confirmed at this point. + + if (!$user->email) { + $orig = clone($user); + $user->email = $email; + $result = $user->updateKeys($orig); + if (!$result) { + common_log_db_error($user, 'UPDATE', __FILE__); + $this->server_error(_('Could not update user with confirmed email address.')); + return; + } + } + + # Success! + + $this->set_temp_user($user); + $this->show_password_form(); + } + + function set_temp_user(&$user) { + common_ensure_session(); + $_SESSION['tempuser'] = $user->id; + } + + function get_temp_user() { + common_ensure_session(); + $user_id = $_SESSION['tempuser']; + if ($user_id) { + $user = User::staticGet($user_id); + } + return $user; + } + + function clear_temp_user() { + common_ensure_session(); + unset($_SESSION['tempuser']); + } + + function show_top($msg=NULL) { + if ($msg) { + common_element('div', 'error', $msg); + } else { + common_element_start('div', 'instructions'); + common_element('p', NULL, + _('If you\'ve forgotten or lost your' . + ' password, you can get a new one sent to' . + ' the email address you have stored ' . + ' in your account.')); + common_element_end('div'); + } + } + + function show_password_top($msg=NULL) { + if ($msg) { + common_element('div', 'error', $msg); + } else { + common_element('div', 'instructions', + _('You\'ve been identified. Enter a ' . + ' new password below. ')); + } + } + + function show_form($msg=NULL) { + + common_show_header(_('Recover password'), NULL, + $msg, array($this, 'show_top')); + + common_element_start('form', array('method' => 'post', + 'id' => 'recoverpassword', + 'action' => common_local_url('recoverpassword'))); + common_input('nicknameoremail', _('Nickname or email'), + $this->trimmed('nicknameoremail'), + _('Your nickname on this server, ' . + 'or your registered email address.')); + common_submit('recover', _('Recover')); + common_element_end('form'); + common_show_footer(); + } + + function show_password_form($msg=NULL) { + + common_show_header(_('Reset password'), NULL, + $msg, array($this, 'show_password_top')); + + common_element_start('form', array('method' => 'post', + 'id' => 'recoverpassword', + 'action' => common_local_url('recoverpassword'))); + common_hidden('token', common_session_token()); + common_password('newpassword', _('New password'), + _('6 or more characters, and don\'t forget it!')); + common_password('confirm', _('Confirm'), + _('Same as password above')); + common_submit('reset', _('Reset')); + common_element_end('form'); + common_show_footer(); + } + + function recover_password() { + $nore = $this->trimmed('nicknameoremail'); + if (!$nore) { + $this->show_form(_('Enter a nickname or email address.')); + return; + } + + $user = User::staticGet('email', common_canonical_email($nore)); + + if (!$user) { + $user = User::staticGet('nickname', common_canonical_nickname($nore)); + } + + # See if it's an unconfirmed email address + + if (!$user) { + $confirm_email = Confirm_address::staticGet('address', common_canonical_email($nore)); + if ($confirm_email && $confirm_email->address_type == 'email') { + $user = User::staticGet($confirm_email->user_id); + } + } + + if (!$user) { + $this->show_form(_('No user with that email address or username.')); + return; + } + + # Try to get an unconfirmed email address if they used a user name + + if (!$user->email && !$confirm_email) { + $confirm_email = Confirm_address::staticGet('user_id', $user->id); + if ($confirm_email && $confirm_email->address_type != 'email') { + # Skip non-email confirmations + $confirm_email = NULL; + } + } + + if (!$user->email && !$confirm_email) { + $this->client_error(_('No registered email address for that user.')); + return; + } + + # Success! We have a valid user and a confirmed or unconfirmed email address + + $confirm = new Confirm_address(); + $confirm->code = common_confirmation_code(128); + $confirm->address_type = 'recover'; + $confirm->user_id = $user->id; + $confirm->address = (isset($user->email)) ? $user->email : $confirm_email->address; + + if (!$confirm->insert()) { + common_log_db_error($confirm, 'INSERT', __FILE__); + $this->server_error(_('Error saving address confirmation.')); + return; + } + + $body = "Hey, $user->nickname."; + $body .= "\n\n"; + $body .= 'Someone just asked for a new password ' . + 'for this account on ' . common_config('site', 'name') . '.'; + $body .= "\n\n"; + $body .= 'If it was you, and you want to confirm, use the URL below:'; + $body .= "\n\n"; + $body .= "\t".common_local_url('recoverpassword', + array('code' => $confirm->code)); + $body .= "\n\n"; + $body .= 'If not, just ignore this message.'; + $body .= "\n\n"; + $body .= 'Thanks for your time, '; + $body .= "\n"; + $body .= common_config('site', 'name'); + $body .= "\n"; + + mail_to_user($user, _('Password recovery requested'), $body, $confirm->address); + + common_show_header(_('Password recovery requested')); + common_element('p', NULL, + _('Instructions for recovering your password ' . + 'have been sent to the email address registered to your ' . + 'account.')); + common_show_footer(); + } + + function reset_password() { + + # CSRF protection + $token = $this->trimmed('token'); + if (!$token || $token != common_session_token()) { + $this->show_form(_('There was a problem with your session token. Try again, please.')); + return; + } + + $user = $this->get_temp_user(); + + if (!$user) { + $this->client_error(_('Unexpected password reset.')); + return; + } + + $newpassword = $this->trimmed('newpassword'); + $confirm = $this->trimmed('confirm'); + + if (!$newpassword || strlen($newpassword) < 6) { + $this->show_password_form(_('Password must be 6 chars or more.')); + return; + } + if ($newpassword != $confirm) { + $this->show_password_form(_('Password and confirmation do not match.')); + return; + } + + # OK, we're ready to go + + $original = clone($user); + + $user->password = common_munge_password($newpassword, $user->id); + + if (!$user->update($original)) { + common_log_db_error($user, 'UPDATE', __FILE__); + common_server_error(_('Can\'t save new password.')); + return; + } + + $this->clear_temp_user(); + + if (!common_set_user($user->nickname)) { + common_server_error(_('Error setting user.')); + return; + } + + common_real_login(true); + + common_show_header(_('Password saved.')); + common_element('p', NULL, _('New password successfully saved. ' . + 'You are now logged in.')); + common_show_footer(); + } +} diff --git a/_darcs/pristine/actions/register.php b/_darcs/pristine/actions/register.php new file mode 100644 index 0000000000..a22ffca28e --- /dev/null +++ b/_darcs/pristine/actions/register.php @@ -0,0 +1,262 @@ +. + */ + +if (!defined('LACONICA')) { exit(1); } + +class RegisterAction extends Action { + + function handle($args) { + parent::handle($args); + + if (common_config('site', 'closed')) { + common_user_error(_('Registration not allowed.')); + } else if (common_logged_in()) { + common_user_error(_('Already logged in.')); + } else if ($_SERVER['REQUEST_METHOD'] == 'POST') { + $this->try_register(); + } else { + $this->show_form(); + } + } + + function try_register() { + + $token = $this->trimmed('token'); + if (!$token || $token != common_session_token()) { + $this->show_form(_('There was a problem with your session token. Try again, please.')); + return; + } + + $nickname = $this->trimmed('nickname'); + $email = $this->trimmed('email'); + $fullname = $this->trimmed('fullname'); + $homepage = $this->trimmed('homepage'); + $bio = $this->trimmed('bio'); + $location = $this->trimmed('location'); + + # We don't trim these... whitespace is OK in a password! + + $password = $this->arg('password'); + $confirm = $this->arg('confirm'); + + # invitation code, if any + + $code = $this->trimmed('code'); + + if ($code) { + $invite = Invitation::staticGet($code); + } + + if (common_config('site', 'inviteonly') && !($code && $invite)) { + $this->client_error(_('Sorry, only invited people can register.')); + return; + } + + # Input scrubbing + + $nickname = common_canonical_nickname($nickname); + $email = common_canonical_email($email); + + if (!$this->boolean('license')) { + $this->show_form(_('You can\'t register if you don\'t agree to the license.')); + } else if ($email && !Validate::email($email, true)) { + $this->show_form(_('Not a valid email address.')); + } else if (!Validate::string($nickname, array('min_length' => 1, + 'max_length' => 64, + 'format' => VALIDATE_NUM . VALIDATE_ALPHA_LOWER))) { + $this->show_form(_('Nickname must have only lowercase letters and numbers and no spaces.')); + } else if ($this->nickname_exists($nickname)) { + $this->show_form(_('Nickname already in use. Try another one.')); + } else if (!User::allowed_nickname($nickname)) { + $this->show_form(_('Not a valid nickname.')); + } else if ($this->email_exists($email)) { + $this->show_form(_('Email address already exists.')); + } else if (!is_null($homepage) && (strlen($homepage) > 0) && + !Validate::uri($homepage, array('allowed_schemes' => array('http', 'https')))) { + $this->show_form(_('Homepage is not a valid URL.')); + return; + } else if (!is_null($fullname) && strlen($fullname) > 255) { + $this->show_form(_('Full name is too long (max 255 chars).')); + return; + } else if (!is_null($bio) && strlen($bio) > 140) { + $this->show_form(_('Bio is too long (max 140 chars).')); + return; + } else if (!is_null($location) && strlen($location) > 255) { + $this->show_form(_('Location is too long (max 255 chars).')); + return; + } else if (strlen($password) < 6) { + $this->show_form(_('Password must be 6 or more characters.')); + return; + } else if ($password != $confirm) { + $this->show_form(_('Passwords don\'t match.')); + } else if ($user = User::register(array('nickname' => $nickname, 'password' => $password, 'email' => $email, + 'fullname' => $fullname, 'homepage' => $homepage, 'bio' => $bio, + 'location' => $location, 'code' => $code))) { + if (!$user) { + $this->show_form(_('Invalid username or password.')); + return; + } + # success! + if (!common_set_user($user)) { + common_server_error(_('Error setting user.')); + return; + } + # this is a real login + common_real_login(true); + if ($this->boolean('rememberme')) { + common_debug('Adding rememberme cookie for ' . $nickname); + common_rememberme($user); + } + # Re-init language env in case it changed (not yet, but soon) + common_init_language(); + $this->show_success(); + } else { + $this->show_form(_('Invalid username or password.')); + } + } + + # checks if *CANONICAL* nickname exists + + function nickname_exists($nickname) { + $user = User::staticGet('nickname', $nickname); + return ($user !== false); + } + + # checks if *CANONICAL* email exists + + function email_exists($email) { + $email = common_canonical_email($email); + if (!$email || strlen($email) == 0) { + return false; + } + $user = User::staticGet('email', $email); + return ($user !== false); + } + + function show_top($error=NULL) { + if ($error) { + common_element('p', 'error', $error); + } else { + $instr = common_markup_to_html(_('With this form you can create a new account. ' . + 'You can then post notices and link up to friends and colleagues. '. + '(Have an [OpenID](http://openid.net/)? ' . + 'Try our [OpenID registration](%%action.openidlogin%%)!)')); + + common_element_start('div', 'instructions'); + common_raw($instr); + common_element_end('div'); + } + } + + function show_form($error=NULL) { + global $config; + + $code = $this->trimmed('code'); + + if ($code) { + $invite = Invitation::staticGet($code); + } + + if (common_config('site', 'inviteonly') && !($code && $invite)) { + $this->client_error(_('Sorry, only invited people can register.')); + return; + } + + common_show_header(_('Register'), NULL, $error, array($this, 'show_top')); + common_element_start('form', array('method' => 'post', + 'id' => 'login', + 'action' => common_local_url('register'))); + + common_hidden('token', common_session_token()); + + if ($code) { + common_hidden('code', $code); + } + + common_input('nickname', _('Nickname'), $this->trimmed('nickname'), + _('1-64 lowercase letters or numbers, no punctuation or spaces. Required.')); + common_password('password', _('Password'), + _('6 or more characters. Required.')); + common_password('confirm', _('Confirm'), + _('Same as password above. Required.')); + if ($invite && $invite->address_type == 'email') { + common_input('email', _('Email'), $invite->address, + _('Used only for updates, announcements, and password recovery')); + } else { + common_input('email', _('Email'), $this->trimmed('email'), + _('Used only for updates, announcements, and password recovery')); + } + common_input('fullname', _('Full name'), + $this->trimmed('fullname'), + _('Longer name, preferably your "real" name')); + common_input('homepage', _('Homepage'), + $this->trimmed('homepage'), + _('URL of your homepage, blog, or profile on another site')); + common_textarea('bio', _('Bio'), + $this->trimmed('bio'), + _('Describe yourself and your interests in 140 chars')); + common_input('location', _('Location'), + $this->trimmed('location'), + _('Where you are, like "City, State (or Region), Country"')); + common_checkbox('rememberme', _('Remember me'), + $this->boolean('rememberme'), + _('Automatically login in the future; not for shared computers!')); + common_element_start('p'); + $attrs = array('type' => 'checkbox', + 'id' => 'license', + 'name' => 'license', + 'value' => 'true'); + if ($this->boolean('license')) { + $attrs['checked'] = 'checked'; + } + common_element('input', $attrs); + common_text(_('My text and files are available under ')); + common_element('a', array('href' => $config['license']['url']), + $config['license']['title']); + common_text(_(' except this private data: password, email address, IM address, phone number.')); + common_element_end('p'); + common_submit('submit', _('Register')); + common_element_end('form'); + common_show_footer(); + } + + function show_success() { + $nickname = $this->arg('nickname'); + common_show_header(_('Registration successful')); + common_element_start('div', 'success'); + $instr = sprintf(_('Congratulations, %s! And welcome to %%%%site.name%%%%. From here, you may want to...'. "\n\n" . + '* Go to [your profile](%s) and post your first message.' . "\n" . + '* Add a [Jabber/GTalk address](%%%%action.imsettings%%%%) so you can send notices through instant messages.' . "\n" . + '* [Search for people](%%%%action.peoplesearch%%%%) that you may know or that share your interests. ' . "\n" . + '* Update your [profile settings](%%%%action.profilesettings%%%%) to tell others more about you. ' . "\n" . + '* Read over the [online docs](%%%%doc.help%%%%) for features you may have missed. ' . "\n\n" . + 'Thanks for signing up and we hope you enjoy using this service.'), + $nickname, common_local_url('showstream', array('nickname' => $nickname))); + common_raw(common_markup_to_html($instr)); + $have_email = $this->trimmed('email'); + if ($have_email) { + $emailinstr = _('(You should receive a message by email momentarily, with ' . + 'instructions on how to confirm your email address.)'); + common_raw(common_markup_to_html($emailinstr)); + } + common_element_end('div'); + common_show_footer(); + } + +} diff --git a/_darcs/pristine/actions/remotesubscribe.php b/_darcs/pristine/actions/remotesubscribe.php new file mode 100644 index 0000000000..c3a09bcfc2 --- /dev/null +++ b/_darcs/pristine/actions/remotesubscribe.php @@ -0,0 +1,386 @@ +. + */ + +if (!defined('LACONICA')) { exit(1); } + +require_once(INSTALLDIR.'/lib/omb.php'); + +class RemotesubscribeAction extends Action { + + function handle($args) { + + parent::handle($args); + + if (common_logged_in()) { + common_user_error(_('You can use the local subscription!')); + return; + } + + if ($_SERVER['REQUEST_METHOD'] == 'POST') { + + # CSRF protection + $token = $this->trimmed('token'); + if (!$token || $token != common_session_token()) { + $this->show_form(_('There was a problem with your session token. Try again, please.')); + return; + } + + $this->remote_subscription(); + } else { + $this->show_form(); + } + } + + function get_instructions() { + return _('To subscribe, you can [login](%%action.login%%),' . + ' or [register](%%action.register%%) a new ' . + ' account. If you already have an account ' . + ' on a [compatible microblogging site](%%doc.openmublog%%), ' . + ' enter your profile URL below.'); + } + + function show_top($err=NULL) { + if ($err) { + common_element('div', 'error', $err); + } else { + $instructions = $this->get_instructions(); + $output = common_markup_to_html($instructions); + common_element_start('div', 'instructions'); + common_raw($output); + common_element_end('p'); + } + } + + function show_form($err=NULL) { + $nickname = $this->trimmed('nickname'); + $profile = $this->trimmed('profile_url'); + common_show_header(_('Remote subscribe'), NULL, $err, + array($this, 'show_top')); + # id = remotesubscribe conflicts with the + # button on profile page + common_element_start('form', array('id' => 'remsub', 'method' => 'post', + 'action' => common_local_url('remotesubscribe'))); + common_hidden('token', common_session_token()); + common_input('nickname', _('User nickname'), $nickname, + _('Nickname of the user you want to follow')); + common_input('profile_url', _('Profile URL'), $profile, + _('URL of your profile on another compatible microblogging service')); + common_submit('submit', _('Subscribe')); + common_element_end('form'); + common_show_footer(); + } + + function remote_subscription() { + $user = $this->get_user(); + + if (!$user) { + $this->show_form(_('No such user.')); + return; + } + + $profile = $this->trimmed('profile_url'); + + if (!$profile) { + $this->show_form(_('No such user.')); + return; + } + + if (!Validate::uri($profile, array('allowed_schemes' => array('http', 'https')))) { + $this->show_form(_('Invalid profile URL (bad format)')); + return; + } + + $fetcher = Auth_Yadis_Yadis::getHTTPFetcher(); + $yadis = Auth_Yadis_Yadis::discover($profile, $fetcher); + + if (!$yadis || $yadis->failed) { + $this->show_form(_('Not a valid profile URL (no YADIS document).')); + return; + } + + # XXX: a little liberal for sites that accidentally put whitespace before the xml declaration + + $xrds =& Auth_Yadis_XRDS::parseXRDS(trim($yadis->response_text)); + + if (!$xrds) { + $this->show_form(_('Not a valid profile URL (no XRDS defined).')); + return; + } + + $omb = $this->getOmb($xrds); + + if (!$omb) { + $this->show_form(_('Not a valid profile URL (incorrect services).')); + return; + } + + if (omb_service_uri($omb[OAUTH_ENDPOINT_REQUEST]) == + common_local_url('requesttoken')) + { + $this->show_form(_('That\'s a local profile! Login to subscribe.')); + return; + } + + if (User::staticGet('uri', omb_local_id($omb[OAUTH_ENDPOINT_REQUEST]))) { + $this->show_form(_('That\'s a local profile! Login to subscribe.')); + return; + } + + list($token, $secret) = $this->request_token($omb); + + if (!$token || !$secret) { + $this->show_form(_('Couldn\'t get a request token.')); + return; + } + + $this->request_authorization($user, $omb, $token, $secret); + } + + function get_user() { + $user = NULL; + $nickname = $this->trimmed('nickname'); + if ($nickname) { + $user = User::staticGet('nickname', $nickname); + } + return $user; + } + + function getOmb($xrds) { + + static $omb_endpoints = array(OMB_ENDPOINT_UPDATEPROFILE, OMB_ENDPOINT_POSTNOTICE); + static $oauth_endpoints = array(OAUTH_ENDPOINT_REQUEST, OAUTH_ENDPOINT_AUTHORIZE, + OAUTH_ENDPOINT_ACCESS); + $omb = array(); + + # XXX: the following code could probably be refactored to eliminate dupes + + $oauth_services = omb_get_services($xrds, OAUTH_DISCOVERY); + + if (!$oauth_services) { + return NULL; + } + + $oauth_service = $oauth_services[0]; + + $oauth_xrd = $this->getXRD($oauth_service, $xrds); + + if (!$oauth_xrd) { + return NULL; + } + + if (!$this->addServices($oauth_xrd, $oauth_endpoints, $omb)) { + return NULL; + } + + $omb_services = omb_get_services($xrds, OMB_NAMESPACE); + + if (!$omb_services) { + return NULL; + } + + $omb_service = $omb_services[0]; + + $omb_xrd = $this->getXRD($omb_service, $xrds); + + if (!$omb_xrd) { + return NULL; + } + + if (!$this->addServices($omb_xrd, $omb_endpoints, $omb)) { + return NULL; + } + + # XXX: check that we got all the services we needed + + foreach (array_merge($omb_endpoints, $oauth_endpoints) as $type) { + if (!array_key_exists($type, $omb) || !$omb[$type]) { + return NULL; + } + } + + if (!omb_local_id($omb[OAUTH_ENDPOINT_REQUEST])) { + return NULL; + } + + return $omb; + } + + function getXRD($main_service, $main_xrds) { + $uri = omb_service_uri($main_service); + if (strpos($uri, "#") !== 0) { + # FIXME: more rigorous handling of external service definitions + return NULL; + } + $id = substr($uri, 1); + $nodes = $main_xrds->allXrdNodes; + $parser = $main_xrds->parser; + foreach ($nodes as $node) { + $attrs = $parser->attributes($node); + if (array_key_exists('xml:id', $attrs) && + $attrs['xml:id'] == $id) { + # XXX: trick the constructor into thinking this is the only node + $bogus_nodes = array($node); + return new Auth_Yadis_XRDS($parser, $bogus_nodes); + } + } + return NULL; + } + + function addServices($xrd, $types, &$omb) { + foreach ($types as $type) { + $matches = omb_get_services($xrd, $type); + if ($matches) { + $omb[$type] = $matches[0]; + } else { + # no match for type + return false; + } + } + return true; + } + + function request_token($omb) { + $con = omb_oauth_consumer(); + + $url = omb_service_uri($omb[OAUTH_ENDPOINT_REQUEST]); + + # XXX: Is this the right thing to do? Strip off GET params and make them + # POST params? Seems wrong to me. + + $parsed = parse_url($url); + $params = array(); + parse_str($parsed['query'], $params); + + $req = OAuthRequest::from_consumer_and_token($con, NULL, "POST", $url, $params); + + $listener = omb_local_id($omb[OAUTH_ENDPOINT_REQUEST]); + + if (!$listener) { + return NULL; + } + + $req->set_parameter('omb_listener', $listener); + $req->set_parameter('omb_version', OMB_VERSION_01); + + # XXX: test to see if endpoint accepts this signature method + + $req->sign_request(omb_hmac_sha1(), $con, NULL); + + # We re-use this tool's fetcher, since it's pretty good + + $fetcher = Auth_Yadis_Yadis::getHTTPFetcher(); + + $result = $fetcher->post($req->get_normalized_http_url(), + $req->to_postdata(), + array('User-Agent' => 'Laconica/' . LACONICA_VERSION)); + + if ($result->status != 200) { + return NULL; + } + + parse_str($result->body, $return); + + return array($return['oauth_token'], $return['oauth_token_secret']); + } + + function request_authorization($user, $omb, $token, $secret) { + global $config; # for license URL + + $con = omb_oauth_consumer(); + $tok = new OAuthToken($token, $secret); + + $url = omb_service_uri($omb[OAUTH_ENDPOINT_AUTHORIZE]); + + # XXX: Is this the right thing to do? Strip off GET params and make them + # POST params? Seems wrong to me. + + $parsed = parse_url($url); + $params = array(); + parse_str($parsed['query'], $params); + + $req = OAuthRequest::from_consumer_and_token($con, $tok, 'GET', $url, $params); + + # We send over a ton of information. This lets the other + # server store info about our user, and it lets the current + # user decide if they really want to authorize the subscription. + + $req->set_parameter('omb_version', OMB_VERSION_01); + $req->set_parameter('omb_listener', omb_local_id($omb[OAUTH_ENDPOINT_REQUEST])); + $req->set_parameter('omb_listenee', $user->uri); + $req->set_parameter('omb_listenee_profile', common_profile_url($user->nickname)); + $req->set_parameter('omb_listenee_nickname', $user->nickname); + $req->set_parameter('omb_listenee_license', $config['license']['url']); + + $profile = $user->getProfile(); + if (!$profile) { + common_log_db_error($user, 'SELECT', __FILE__); + $this->server_error(_('User without matching profile')); + return; + } + + if ($profile->fullname) { + $req->set_parameter('omb_listenee_fullname', $profile->fullname); + } + if ($profile->homepage) { + $req->set_parameter('omb_listenee_homepage', $profile->homepage); + } + if ($profile->bio) { + $req->set_parameter('omb_listenee_bio', $profile->bio); + } + if ($profile->location) { + $req->set_parameter('omb_listenee_location', $profile->location); + } + $avatar = $profile->getAvatar(AVATAR_PROFILE_SIZE); + if ($avatar) { + $req->set_parameter('omb_listenee_avatar', $avatar->url); + } + + # XXX: add a nonce to prevent replay attacks + + $req->set_parameter('oauth_callback', common_local_url('finishremotesubscribe')); + + # XXX: test to see if endpoint accepts this signature method + + $req->sign_request(omb_hmac_sha1(), $con, $tok); + + # store all our info here + + $omb['listenee'] = $user->nickname; + $omb['listener'] = omb_local_id($omb[OAUTH_ENDPOINT_REQUEST]); + $omb['token'] = $token; + $omb['secret'] = $secret; + # call doesn't work after bounce back so we cache; maybe serialization issue...? + $omb['access_token_url'] = omb_service_uri($omb[OAUTH_ENDPOINT_ACCESS]); + $omb['post_notice_url'] = omb_service_uri($omb[OMB_ENDPOINT_POSTNOTICE]); + $omb['update_profile_url'] = omb_service_uri($omb[OMB_ENDPOINT_UPDATEPROFILE]); + + common_ensure_session(); + + $_SESSION['oauth_authorization_request'] = $omb; + + # Redirect to authorization service + + common_redirect($req->to_url()); + return; + } + + function make_nonce() { + return common_good_rand(16); + } +} diff --git a/_darcs/pristine/actions/replies.php b/_darcs/pristine/actions/replies.php new file mode 100644 index 0000000000..835871ffc1 --- /dev/null +++ b/_darcs/pristine/actions/replies.php @@ -0,0 +1,94 @@ +. + */ + +if (!defined('LACONICA')) { exit(1); } + +require_once(INSTALLDIR.'/actions/showstream.php'); + +class RepliesAction extends StreamAction { + + function handle($args) { + + parent::handle($args); + + $nickname = common_canonical_nickname($this->arg('nickname')); + $user = User::staticGet('nickname', $nickname); + + if (!$user) { + $this->no_such_user(); + return; + } + + $profile = $user->getProfile(); + + if (!$profile) { + common_server_error(_('User has no profile.')); + return; + } + + # Looks like we're good; show the header + + common_show_header(sprintf(_("Replies to %s"), $profile->nickname), + array($this, 'show_header'), $user, + array($this, 'show_top')); + + $this->show_replies($user); + + common_show_footer(); + } + + function no_such_user() { + common_user_error(_('No such user.')); + } + + function show_header($user) { + common_element('link', array('rel' => 'alternate', + 'href' => common_local_url('repliesrss', array('nickname' => + $user->nickname)), + 'type' => 'application/rss+xml', + 'title' => sprintf(_('Feed for replies to %s'), $user->nickname))); + } + + function show_top($user) { + $cur = common_current_user(); + + if ($cur && $cur->id == $user->id) { + common_notice_form('replies'); + } + + $this->views_menu(); + + $this->show_feeds_list(array(0=>array('href'=>common_local_url('repliesrss', array('nickname' => $user->nickname)), + 'type' => 'rss', + 'version' => 'RSS 1.0', + 'item' => 'repliesrss'))); + } + + function show_replies($user) { + + $page = ($this->arg('page')) ? ($this->arg('page')+0) : 1; + + $notice = $user->getReplies(($page-1) * NOTICES_PER_PAGE, NOTICES_PER_PAGE + 1); + + $cnt = $this->show_notice_list($notice); + + common_pagination($page > 1, $cnt > NOTICES_PER_PAGE, + $page, 'replies', array('nickname' => $user->nickname)); + } +} diff --git a/_darcs/pristine/actions/repliesrss.php b/_darcs/pristine/actions/repliesrss.php new file mode 100644 index 0000000000..7369db5e04 --- /dev/null +++ b/_darcs/pristine/actions/repliesrss.php @@ -0,0 +1,79 @@ +. + */ + +if (!defined('LACONICA')) { exit(1); } + +require_once(INSTALLDIR.'/lib/rssaction.php'); + +// Formatting of RSS handled by Rss10Action + +class RepliesrssAction extends Rss10Action { + + var $user = NULL; + + function init() { + $nickname = $this->trimmed('nickname'); + $this->user = User::staticGet('nickname', $nickname); + + if (!$this->user) { + common_user_error(_('No such user.')); + return false; + } else { + return true; + } + } + + function get_notices($limit=0) { + + $user = $this->user; + + $notice = $user->getReplies(0, ($limit == 0) ? 48 : $limit); + + $notices = array(); + + while ($notice->fetch()) { + $notices[] = clone($notice); + } + + return $notices; + } + + function get_channel() { + $user = $this->user; + $c = array('url' => common_local_url('repliesrss', + array('nickname' => + $user->nickname)), + 'title' => sprintf(_("Replies to %s"), $user->nickname), + 'link' => common_local_url('replies', + array('nickname' => + $user->nickname)), + 'description' => sprintf(_('Feed for replies to %s'), $user->nickname)); + return $c; + } + + function get_image() { + $user = $this->user; + $profile = $user->getProfile(); + if (!$profile) { + return NULL; + } + $avatar = $profile->getAvatar(AVATAR_PROFILE_SIZE); + return ($avatar) ? $avatar->url : NULL; + } +} \ No newline at end of file diff --git a/_darcs/pristine/actions/requesttoken.php b/_darcs/pristine/actions/requesttoken.php new file mode 100644 index 0000000000..76019a9299 --- /dev/null +++ b/_darcs/pristine/actions/requesttoken.php @@ -0,0 +1,42 @@ +. + */ + +if (!defined('LACONICA')) { exit(1); } + +require_once(INSTALLDIR.'/lib/omb.php'); + +class RequesttokenAction extends Action { + + function is_readonly() { + return false; + } + + function handle($args) { + parent::handle($args); + try { + common_remove_magic_from_request(); + $req = OAuthRequest::from_request(); + $server = omb_oauth_server(); + $token = $server->fetch_request_token($req); + print $token; + } catch (OAuthException $e) { + common_server_error($e->getMessage()); + } + } +} diff --git a/_darcs/pristine/actions/showfavorites.php b/_darcs/pristine/actions/showfavorites.php new file mode 100644 index 0000000000..4de4b12716 --- /dev/null +++ b/_darcs/pristine/actions/showfavorites.php @@ -0,0 +1,97 @@ +. + */ + +if (!defined('LACONICA')) { exit(1); } + +require_once(INSTALLDIR.'/actions/showstream.php'); + +class ShowfavoritesAction extends StreamAction { + + function handle($args) { + + parent::handle($args); + + $nickname = common_canonical_nickname($this->arg('nickname')); + $user = User::staticGet('nickname', $nickname); + + if (!$user) { + $this->client_error(_('No such user.')); + return; + } + + $profile = $user->getProfile(); + + if (!$profile) { + common_server_error(_('User has no profile.')); + return; + } + + # Looks like we're good; show the header + + common_show_header(sprintf(_("%s favorite notices"), $profile->nickname), + array($this, 'show_header'), $user, + array($this, 'show_top')); + + $this->show_notices($user); + + common_show_footer(); + } + + function show_header($user) { + common_element('link', array('rel' => 'alternate', + 'href' => common_local_url('favoritesrss', array('nickname' => + $user->nickname)), + 'type' => 'application/rss+xml', + 'title' => sprintf(_('Feed for favorites of %s'), $user->nickname))); + } + + function show_top($user) { + $cur = common_current_user(); + + if ($cur && $cur->id == $user->id) { + common_notice_form('all'); + } + + $this->show_feeds_list(array(0=>array('href'=>common_local_url('favoritesrss', array('nickname' => $user->nickname)), + 'type' => 'rss', + 'version' => 'RSS 1.0', + 'item' => 'Favorites'))); + $this->views_menu(); + } + + function show_notices($user) { + + $page = $this->trimmed('page'); + if (!$page) { + $page = 1; + } + + $notice = $user->favoriteNotices(($page-1)*NOTICES_PER_PAGE, NOTICES_PER_PAGE + 1); + + if (!$notice) { + $this->server_error(_('Could not retrieve favorite notices.')); + return; + } + + $cnt = $this->show_notice_list($notice); + + common_pagination($page > 1, $cnt > NOTICES_PER_PAGE, + $page, 'showfavorites', array('nickname' => $user->nickname)); + } +} diff --git a/_darcs/pristine/actions/showmessage.php b/_darcs/pristine/actions/showmessage.php new file mode 100644 index 0000000000..c171ffe0b5 --- /dev/null +++ b/_darcs/pristine/actions/showmessage.php @@ -0,0 +1,100 @@ +. + */ + +if (!defined('LACONICA')) { exit(1); } + +require_once(INSTALLDIR.'/lib/mailbox.php'); + +class ShowmessageAction extends MailboxAction { + + function handle($args) { + + Action::handle($args); + + $message = $this->get_message(); + + if (!$message) { + $this->client_error(_('No such message.'), 404); + return; + } + + $cur = common_current_user(); + + if ($cur && ($cur->id == $message->from_profile || $cur->id == $message->to_profile)) { + $this->show_page($cur, 1); + } else { + $this->client_error(_('Only the sender and recipient may read this message.'), 403); + return; + } + } + + function get_message() { + $id = $this->trimmed('message'); + $message = Message::staticGet('id', $id); + return $message; + } + + function get_title($user, $page) { + $message = $this->get_message(); + if (!$message) { + return NULL; + } + + if ($user->id == $message->from_profile) { + $to = $message->getTo(); + $title = sprintf(_("Message to %1\$s on %2\$s"), + $to->nickname, + common_exact_date($message->created)); + } else if ($user->id == $message->to_profile) { + $from = $message->getFrom(); + $title = sprintf(_("Message from %1\$s on %2\$s"), + $from->nickname, + common_exact_date($message->created)); + } + return $title; + } + + function get_messages($user, $page) { + $message = new Message(); + $message->id = $this->trimmed('message'); + $message->find(); + return $message; + } + + function get_message_profile($message) { + $user = common_current_user(); + if ($user->id == $message->from_profile) { + return $message->getTo(); + } else if ($user->id == $message->to_profile) { + return $message->getFrom(); + } else { + # This shouldn't happen + return NULL; + } + } + + function get_instructions() { + return ''; + } + + function views_menu() { + return; + } +} + \ No newline at end of file diff --git a/_darcs/pristine/actions/shownotice.php b/_darcs/pristine/actions/shownotice.php new file mode 100644 index 0000000000..6dea6d7bba --- /dev/null +++ b/_darcs/pristine/actions/shownotice.php @@ -0,0 +1,116 @@ +. + */ + +if (!defined('LACONICA')) { exit(1); } + +require_once(INSTALLDIR.'/lib/stream.php'); + +class ShownoticeAction extends StreamAction { + + var $notice = NULL; + var $profile = NULL; + var $avatar = NULL; + + function prepare($args) { + + parent::prepare($args); + + $id = $this->arg('notice'); + $this->notice = Notice::staticGet($id); + + if (!$this->notice) { + $this->client_error(_('No such notice.'), 404); + return false; + } + + $this->profile = $this->notice->getProfile(); + + if (!$this->profile) { + $this->server_error(_('Notice has no profile'), 500); + return false; + } + + $this->avatar = $this->profile->getAvatar(AVATAR_STREAM_SIZE); + + return true; + } + + function last_modified() { + return max(strtotime($this->notice->created), + strtotime($this->profile->modified), + ($this->avatar) ? strtotime($this->avatar->modified) : 0); + } + + function etag() { + return 'W/"' . implode(':', array($this->arg('action'), + common_language(), + $this->notice->id, + strtotime($this->notice->created), + strtotime($this->profile->modified), + ($this->avatar) ? strtotime($this->avatar->modified) : 0)) . '"'; + } + + function handle($args) { + + parent::handle($args); + + common_show_header(sprintf(_('%1$s\'s status on %2$s'), + $this->profile->nickname, + common_exact_date($this->notice->created)), + array($this, 'show_header'), NULL, + array($this, 'show_top')); + + common_element_start('ul', array('id' => 'notices')); + $nli = new NoticeListItem($this->notice); + $nli->show(); + common_element_end('ul'); + + common_show_footer(); + } + + function show_header() { + + $user = User::staticGet($this->profile->id); + + if (!$user) { + return; + } + + if ($user->emailmicroid && $user->email && $this->notice->uri) { + common_element('meta', array('name' => 'microid', + 'content' => "mailto+http:sha1:" . sha1(sha1('mailto:' . $user->email) . sha1($this->notice->uri)))); + } + + if ($user->jabbermicroid && $user->jabber && $this->notice->uri) { + common_element('meta', array('name' => 'microid', + 'content' => "xmpp+http:sha1:" . sha1(sha1('xmpp:' . $user->jabber) . sha1($this->notice->uri)))); + } + } + + function show_top() { + $cur = common_current_user(); + if ($cur && $cur->id == $this->profile->id) { + common_notice_form(); + } + } + + function no_such_notice() { + common_user_error(_('No such notice.')); + } +} diff --git a/_darcs/pristine/actions/showstream.php b/_darcs/pristine/actions/showstream.php new file mode 100644 index 0000000000..6d6225661c --- /dev/null +++ b/_darcs/pristine/actions/showstream.php @@ -0,0 +1,450 @@ +. + */ + +if (!defined('LACONICA')) { exit(1); } + +require_once(INSTALLDIR.'/lib/stream.php'); + +define('SUBSCRIPTIONS_PER_ROW', 4); +define('SUBSCRIPTIONS', 80); + +class ShowstreamAction extends StreamAction { + + function handle($args) { + + parent::handle($args); + + $nickname_arg = $this->arg('nickname'); + $nickname = common_canonical_nickname($nickname_arg); + + # Permanent redirect on non-canonical nickname + + if ($nickname_arg != $nickname) { + $args = array('nickname' => $nickname); + if ($this->arg('page') && $this->arg('page') != 1) { + $args['page'] = $this->arg['page']; + } + common_redirect(common_local_url('showstream', $args), 301); + return; + } + + $user = User::staticGet('nickname', $nickname); + + if (!$user) { + $this->no_such_user(); + return; + } + + $profile = $user->getProfile(); + + if (!$profile) { + common_server_error(_('User has no profile.')); + return; + } + + # Looks like we're good; start output + + # For YADIS discovery, we also have a tag + + header('X-XRDS-Location: '. common_local_url('xrds', array('nickname' => + $user->nickname))); + + common_show_header($profile->nickname, + array($this, 'show_header'), $user, + array($this, 'show_top')); + + $this->show_profile($profile); + + $this->show_notices($user); + + common_show_footer(); + } + + function show_top($user) { + $cur = common_current_user(); + + if ($cur && $cur->id == $user->id) { + common_notice_form('showstream'); + } + + $this->views_menu(); + + $this->show_feeds_list(array(0=>array('href'=>common_local_url('userrss', array('nickname' => $user->nickname)), + 'type' => 'rss', + 'version' => 'RSS 1.0', + 'item' => 'notices'), + 1=>array('href'=>common_local_url('usertimeline', array('nickname' => $user->nickname)), + 'type' => 'atom', + 'version' => 'Atom 1.0', + 'item' => 'usertimeline'), + + 2=>array('href'=>common_local_url('foaf',array('nickname' => $user->nickname)), + 'type' => 'rdf', + 'version' => 'FOAF', + 'item' => 'foaf'))); + } + + function show_header($user) { + # Feeds + common_element('link', array('rel' => 'alternate', + 'href' => common_local_url('api', + array('apiaction' => 'statuses', + 'method' => 'user_timeline.rss', + 'argument' => $user->nickname)), + 'type' => 'application/rss+xml', + 'title' => sprintf(_('Notice feed for %s'), $user->nickname))); + common_element('link', array('rel' => 'alternate feed', + 'href' => common_local_url('api', + array('apiaction' => 'statuses', + 'method' => 'user_timeline.atom', + 'argument' => $user->nickname)), + 'type' => 'application/atom+xml', + 'title' => sprintf(_('Notice feed for %s'), $user->nickname))); + common_element('link', array('rel' => 'alternate', + 'href' => common_local_url('userrss', array('nickname' => + $user->nickname)), + 'type' => 'application/rdf+xml', + 'title' => sprintf(_('Notice feed for %s'), $user->nickname))); + # FOAF + common_element('link', array('rel' => 'meta', + 'href' => common_local_url('foaf', array('nickname' => + $user->nickname)), + 'type' => 'application/rdf+xml', + 'title' => 'FOAF')); + # for remote subscriptions etc. + common_element('meta', array('http-equiv' => 'X-XRDS-Location', + 'content' => common_local_url('xrds', array('nickname' => + $user->nickname)))); + $profile = $user->getProfile(); + if ($profile->bio) { + common_element('meta', array('name' => 'description', + 'content' => $profile->bio)); + } + + if ($user->emailmicroid && $user->email && $profile->profileurl) { + common_element('meta', array('name' => 'microid', + 'content' => "mailto+http:sha1:" . sha1(sha1('mailto:' . $user->email) . sha1($profile->profileurl)))); + } + if ($user->jabbermicroid && $user->jabber && $profile->profileurl) { + common_element('meta', array('name' => 'microid', + 'content' => "xmpp+http:sha1:" . sha1(sha1('xmpp:' . $user->jabber) . sha1($profile->profileurl)))); + } + + # See https://wiki.mozilla.org/Microsummaries + + common_element('link', array('rel' => 'microsummary', + 'href' => common_local_url('microsummary', + array('nickname' => $profile->nickname)))); + } + + function no_such_user() { + $this->client_error(_('No such user.'), 404); + } + + function show_profile($profile) { + + common_element_start('div', array('id' => 'profile', 'class' => 'vcard')); + + $this->show_personal($profile); + + $this->show_last_notice($profile); + + $cur = common_current_user(); + + $this->show_subscriptions($profile); + + common_element_end('div'); + } + + function show_personal($profile) { + + $avatar = $profile->getAvatar(AVATAR_PROFILE_SIZE); + common_element_start('div', array('id' => 'profile_avatar')); + common_element('img', array('src' => ($avatar) ? common_avatar_display_url($avatar) : common_default_avatar(AVATAR_PROFILE_SIZE), + 'class' => 'avatar profile photo', + 'width' => AVATAR_PROFILE_SIZE, + 'height' => AVATAR_PROFILE_SIZE, + 'alt' => $profile->nickname)); + + common_element_start('ul', array('id' => 'profile_actions')); + + common_element_start('li', array('id' => 'profile_subscribe')); + $cur = common_current_user(); + if ($cur) { + if ($cur->id != $profile->id) { + if ($cur->isSubscribed($profile)) { + common_unsubscribe_form($profile); + } else { + common_subscribe_form($profile); + } + } + } else { + $this->show_remote_subscribe_link($profile); + } + common_element_end('li'); + + $user = User::staticGet('id', $profile->id); + common_profile_new_message_nudge($cur, $user, $profile); + + if ($cur && $cur->id != $profile->id) { + $blocked = $cur->hasBlocked($profile); + common_element_start('li', array('id' => 'profile_block')); + if ($blocked) { + common_unblock_form($profile, array('action' => 'showstream', + 'nickname' => $profile->nickname)); + } else { + common_block_form($profile, array('action' => 'showstream', + 'nickname' => $profile->nickname)); + } + common_element_end('li'); + } + + common_element_end('ul'); + + common_element_end('div'); + + common_element_start('div', array('id' => 'profile_information')); + + if ($profile->fullname) { + common_element('h1', array('class' => 'fn'), $profile->fullname . ' (' . $profile->nickname . ')'); + } else { + common_element('h1', array('class' => 'fn nickname'), $profile->nickname); + } + + if ($profile->location) { + common_element('p', 'location', $profile->location); + } + if ($profile->bio) { + common_element('p', 'description note', $profile->bio); + } + if ($profile->homepage) { + common_element_start('p', 'website'); + common_element('a', array('href' => $profile->homepage, + 'rel' => 'me', 'class' => 'url'), + $profile->homepage); + common_element_end('p'); + } + + $this->show_statistics($profile); + + common_element_end('div'); + } + + function show_remote_subscribe_link($profile) { + $url = common_local_url('remotesubscribe', + array('nickname' => $profile->nickname)); + common_element('a', array('href' => $url, + 'id' => 'remotesubscribe'), + _('Subscribe')); + } + + function show_unsubscribe_form($profile) { + common_element_start('form', array('id' => 'unsubscribe', 'method' => 'post', + 'action' => common_local_url('unsubscribe'))); + common_hidden('token', common_session_token()); + common_element('input', array('id' => 'unsubscribeto', + 'name' => 'unsubscribeto', + 'type' => 'hidden', + 'value' => $profile->nickname)); + common_element('input', array('type' => 'submit', + 'class' => 'submit', + 'value' => _('Unsubscribe'))); + common_element_end('form'); + } + + function show_subscriptions($profile) { + global $config; + + $subs = DB_DataObject::factory('subscription'); + $subs->subscriber = $profile->id; + $subs->whereAdd('subscribed != ' . $profile->id); + + $subs->orderBy('created DESC'); + + # We ask for an extra one to know if we need to do another page + + $subs->limit(0, SUBSCRIPTIONS + 1); + + $subs_count = $subs->find(); + + common_element_start('div', array('id' => 'subscriptions')); + + common_element('h2', NULL, _('Subscriptions')); + + if ($subs_count > 0) { + + common_element_start('ul', array('id' => 'subscriptions_avatars')); + + for ($i = 0; $i < min($subs_count, SUBSCRIPTIONS); $i++) { + + if (!$subs->fetch()) { + common_debug('Weirdly, broke out of subscriptions loop early', __FILE__); + break; + } + + $other = Profile::staticGet($subs->subscribed); + + if (!$other) { + common_log_db_error($subs, 'SELECT', __FILE__); + continue; + } + + common_element_start('li', 'vcard'); + common_element_start('a', array('title' => ($other->fullname) ? + $other->fullname : + $other->nickname, + 'href' => $other->profileurl, + 'rel' => 'contact', + 'class' => 'subscription fn url')); + $avatar = $other->getAvatar(AVATAR_MINI_SIZE); + common_element('img', array('src' => (($avatar) ? common_avatar_display_url($avatar) : common_default_avatar(AVATAR_MINI_SIZE)), + 'width' => AVATAR_MINI_SIZE, + 'height' => AVATAR_MINI_SIZE, + 'class' => 'avatar mini photo', + 'alt' => ($other->fullname) ? + $other->fullname : + $other->nickname)); + common_element_end('a'); + common_element_end('li'); + } + + common_element_end('ul'); + } + + if ($subs_count > SUBSCRIPTIONS) { + common_element_start('p', array('id' => 'subscriptions_viewall')); + + common_element('a', array('href' => common_local_url('subscriptions', + array('nickname' => $profile->nickname)), + 'class' => 'moresubscriptions'), + _('All subscriptions')); + common_element_end('p'); + } + + common_element_end('div'); + } + + function show_statistics($profile) { + + // XXX: WORM cache this + $subs = DB_DataObject::factory('subscription'); + $subs->subscriber = $profile->id; + $subs_count = (int) $subs->count() - 1; + + $subbed = DB_DataObject::factory('subscription'); + $subbed->subscribed = $profile->id; + $subbed_count = (int) $subbed->count() - 1; + + $notices = DB_DataObject::factory('notice'); + $notices->profile_id = $profile->id; + $notice_count = (int) $notices->count(); + + common_element_start('div', 'statistics'); + common_element('h2', 'statistics', _('Statistics')); + + # Other stats...? + common_element_start('dl', 'statistics'); + common_element('dt', 'membersince', _('Member since')); + common_element('dd', 'membersince', date('j M Y', + strtotime($profile->created))); + + common_element_start('dt', 'subscriptions'); + common_element('a', array('href' => common_local_url('subscriptions', + array('nickname' => $profile->nickname))), + _('Subscriptions')); + common_element_end('dt'); + common_element('dd', 'subscriptions', (is_int($subs_count)) ? $subs_count : '0'); + common_element_start('dt', 'subscribers'); + common_element('a', array('href' => common_local_url('subscribers', + array('nickname' => $profile->nickname))), + _('Subscribers')); + common_element_end('dt'); + common_element('dd', 'subscribers', (is_int($subbed_count)) ? $subbed_count : '0'); + common_element('dt', 'notices', _('Notices')); + common_element('dd', 'notices', (is_int($notice_count)) ? $notice_count : '0'); + # XXX: link these to something + common_element('dt', 'tags', _('Tags')); + common_element_start('dd', 'tags'); + $tags = Profile_tag::getTags($profile->id, $profile->id); + + common_element_start('ul', 'tags xoxo'); + foreach ($tags as $tag) { + common_element_start('li'); + common_element('a', array('rel' => 'bookmark tag', + 'href' => common_local_url('peopletag', + array('tag' => $tag))), + $tag); + common_element_end('li'); + } + common_element_end('ul'); + common_element_end('dd'); + + common_element_end('dl'); + + common_element_end('div'); + } + + function show_notices($user) { + + $page = ($this->arg('page')) ? ($this->arg('page')+0) : 1; + + $notice = $user->getNotices(($page-1)*NOTICES_PER_PAGE, NOTICES_PER_PAGE + 1); + + $pnl = new ProfileNoticeList($notice); + $cnt = $pnl->show(); + + common_pagination($page>1, $cnt>NOTICES_PER_PAGE, $page, + 'showstream', array('nickname' => $user->nickname)); + } + + function show_last_notice($profile) { + + common_element('h2', NULL, _('Currently')); + + $notice = $profile->getCurrentNotice(); + + if ($notice) { + # FIXME: URL, image, video, audio + common_element_start('p', array('class' => 'notice_current')); + if ($notice->rendered) { + common_raw($notice->rendered); + } else { + # XXX: may be some uncooked notices in the DB, + # we cook them right now. This can probably disappear in future + # versions (>> 0.4.x) + common_raw(common_render_content($notice->content, $notice)); + } + common_element_end('p'); + } + } +} + +# We don't show the author for a profile, since we already know who it is! + +class ProfileNoticeList extends NoticeList { + function new_list_item($notice) { + return new ProfileNoticeListItem($notice); + } +} + +class ProfileNoticeListItem extends NoticeListItem { + function show_author() { + return; + } +} diff --git a/_darcs/pristine/actions/smssettings.php b/_darcs/pristine/actions/smssettings.php new file mode 100644 index 0000000000..5db26730a5 --- /dev/null +++ b/_darcs/pristine/actions/smssettings.php @@ -0,0 +1,331 @@ +. + */ + +if (!defined('LACONICA')) { exit(1); } + +require_once(INSTALLDIR.'/lib/settingsaction.php'); +require_once(INSTALLDIR.'/actions/emailsettings.php'); + +class SmssettingsAction extends EmailsettingsAction { + + function get_instructions() { + return _('You can receive SMS messages through email from %%site.name%%.'); + } + + function show_form($msg=NULL, $success=false) { + $user = common_current_user(); + $this->form_header(_('SMS Settings'), $msg, $success); + common_element_start('form', array('method' => 'post', + 'id' => 'smssettings', + 'action' => + common_local_url('smssettings'))); + common_hidden('token', common_session_token()); + common_element('h2', NULL, _('Address')); + + if ($user->sms) { + common_element_start('p'); + $carrier = $user->getCarrier(); + common_element('span', 'address confirmed', $user->sms . ' (' . $carrier->name . ')'); + common_element('span', 'input_instructions', + _('Current confirmed SMS-enabled phone number.')); + common_hidden('sms', $user->sms); + common_hidden('carrier', $user->carrier); + common_element_end('p'); + common_submit('remove', _('Remove')); + } else { + $confirm = $this->get_confirmation(); + if ($confirm) { + $carrier = Sms_carrier::staticGet($confirm->address_extra); + common_element_start('p'); + common_element('span', 'address unconfirmed', $confirm->address . ' (' . $carrier->name . ')'); + common_element('span', 'input_instructions', + _('Awaiting confirmation on this phone number.')); + common_hidden('sms', $confirm->address); + common_hidden('carrier', $confirm->address_extra); + common_element_end('p'); + common_submit('cancel', _('Cancel')); + common_input('code', _('Confirmation code'), NULL, + _('Enter the code you received on your phone.')); + common_submit('confirm', _('Confirm')); + } else { + common_input('sms', _('SMS Phone number'), + ($this->arg('sms')) ? $this->arg('sms') : NULL, + _('Phone number, no punctuation or spaces, with area code')); + $this->carrier_select(); + common_submit('add', _('Add')); + } + } + + if ($user->sms) { + common_element('h2', NULL, _('Incoming email')); + + if ($user->incomingemail) { + common_element_start('p'); + common_element('span', 'address', $user->incomingemail); + common_element('span', 'input_instructions', + _('Send email to this address to post new notices.')); + common_element_end('p'); + common_submit('removeincoming', _('Remove')); + } + + common_element_start('p'); + common_element('span', 'input_instructions', + _('Make a new email address for posting to; cancels the old one.')); + common_element_end('p'); + common_submit('newincoming', _('New')); + } + + common_element('h2', NULL, _('Preferences')); + + common_checkbox('smsnotify', + _('Send me notices through SMS; I understand I may incur exorbitant charges from my carrier.'), + $user->smsnotify); + + common_submit('save', _('Save')); + + common_element_end('form'); + common_show_footer(); + } + + function get_confirmation() { + $user = common_current_user(); + $confirm = new Confirm_address(); + $confirm->user_id = $user->id; + $confirm->address_type = 'sms'; + if ($confirm->find(TRUE)) { + return $confirm; + } else { + return NULL; + } + } + + function handle_post() { + + # CSRF protection + + $token = $this->trimmed('token'); + if (!$token || $token != common_session_token()) { + $this->show_form(_('There was a problem with your session token. Try again, please.')); + return; + } + + if ($this->arg('save')) { + $this->save_preferences(); + } else if ($this->arg('add')) { + $this->add_address(); + } else if ($this->arg('cancel')) { + $this->cancel_confirmation(); + } else if ($this->arg('remove')) { + $this->remove_address(); + } else if ($this->arg('removeincoming')) { + $this->remove_incoming(); + } else if ($this->arg('newincoming')) { + $this->new_incoming(); + } else if ($this->arg('confirm')) { + $this->confirm_code(); + } else { + $this->show_form(_('Unexpected form submission.')); + } + } + + function save_preferences() { + + $smsnotify = $this->boolean('smsnotify'); + + $user = common_current_user(); + + assert(!is_null($user)); # should already be checked + + $user->query('BEGIN'); + + $original = clone($user); + + $user->smsnotify = $smsnotify; + + $result = $user->update($original); + + if ($result === FALSE) { + common_log_db_error($user, 'UPDATE', __FILE__); + common_server_error(_('Couldn\'t update user.')); + return; + } + + $user->query('COMMIT'); + + $this->show_form(_('Preferences saved.'), true); + } + + function add_address() { + + $user = common_current_user(); + + $sms = $this->trimmed('sms'); + $carrier_id = $this->trimmed('carrier'); + + # Some validation + + if (!$sms) { + $this->show_form(_('No phone number.')); + return; + } + + if (!$carrier_id) { + $this->show_form(_('No carrier selected.')); + return; + } + + $sms = common_canonical_sms($sms); + + if ($user->sms == $sms) { + $this->show_form(_('That is already your phone number.')); + return; + } else if ($this->sms_exists($sms)) { + $this->show_form(_('That phone number already belongs to another user.')); + return; + } + + $confirm = new Confirm_address(); + $confirm->address = $sms; + $confirm->address_extra = $carrier_id; + $confirm->address_type = 'sms'; + $confirm->user_id = $user->id; + $confirm->code = common_confirmation_code(40); + + $result = $confirm->insert(); + + if ($result === FALSE) { + common_log_db_error($confirm, 'INSERT', __FILE__); + common_server_error(_('Couldn\'t insert confirmation code.')); + return; + } + + $carrier = Sms_carrier::staticGet($carrier_id); + + mail_confirm_sms($confirm->code, + $user->nickname, + $carrier->toEmailAddress($sms)); + + $msg = _('A confirmation code was sent to the phone number you added. Check your inbox (and spam box!) for the code and instructions on how to use it.'); + + $this->show_form($msg, TRUE); + } + + function cancel_confirmation() { + + $sms = $this->trimmed('sms'); + $carrier = $this->trimmed('carrier'); + + $confirm = $this->get_confirmation(); + + if (!$confirm) { + $this->show_form(_('No pending confirmation to cancel.')); + return; + } + if ($confirm->address != $sms) { + $this->show_form(_('That is the wrong confirmation number.')); + return; + } + + $result = $confirm->delete(); + + if (!$result) { + common_log_db_error($confirm, 'DELETE', __FILE__); + $this->server_error(_('Couldn\'t delete email confirmation.')); + return; + } + + $this->show_form(_('Confirmation cancelled.'), TRUE); + } + + function remove_address() { + + $user = common_current_user(); + $sms = $this->arg('sms'); + $carrier = $this->arg('carrier'); + + # Maybe an old tab open...? + + if ($user->sms != $sms) { + $this->show_form(_('That is not your phone number.')); + return; + } + + $user->query('BEGIN'); + $original = clone($user); + $user->sms = NULL; + $user->carrier = NULL; + $user->smsemail = NULL; + $result = $user->updateKeys($original); + if (!$result) { + common_log_db_error($user, 'UPDATE', __FILE__); + common_server_error(_('Couldn\'t update user.')); + return; + } + $user->query('COMMIT'); + + $this->show_form(_('The address was removed.'), TRUE); + } + + function sms_exists($sms) { + $user = common_current_user(); + $other = User::staticGet('sms', $sms); + if (!$other) { + return false; + } else { + return $other->id != $user->id; + } + } + + function carrier_select() { + $carrier = new Sms_carrier(); + $cnt = $carrier->find(); + + common_element_start('p'); + common_element('label', array('for' => 'carrier')); + common_element_start('select', array('name' => 'carrier', + 'id' => 'carrier')); + common_element('option', array('value' => 0), + _('Select a carrier')); + while ($carrier->fetch()) { + common_element('option', array('value' => $carrier->id), + $carrier->name); + } + common_element_end('select'); + common_element_end('p'); + common_element('span', 'input_instructions', + sprintf(_('Mobile carrier for your phone. '. + 'If you know a carrier that accepts ' . + 'SMS over email but isn\'t listed here, ' . + 'send email to let us know at %s.'), + common_config('site', 'email'))); + } + + function confirm_code() { + + $code = $this->trimmed('code'); + + if (!$code) { + $this->show_form(_('No code entered')); + return; + } + + common_redirect(common_local_url('confirmaddress', + array('code' => $code))); + } +} diff --git a/_darcs/pristine/actions/subedit.php b/_darcs/pristine/actions/subedit.php new file mode 100644 index 0000000000..e7505e3fef --- /dev/null +++ b/_darcs/pristine/actions/subedit.php @@ -0,0 +1,89 @@ +. + */ + +if (!defined('LACONICA')) { exit(1); } + +class SubeditAction extends Action { + + var $profile = NULL; + + function prepare($args) { + + parent::prepare($args); + + if (!common_logged_in()) { + $this->client_error(_('Not logged in.')); + return false; + } + + $token = $this->trimmed('token'); + + if (!$token || $token != common_session_token()) { + $this->client_error(_('There was a problem with your session token. Try again, please.')); + return; + } + + $id = $this->trimmed('profile'); + + if (!$id) { + $this->client_error(_('No profile specified.')); + return false; + } + + $this->profile = Profile::staticGet('id', $id); + + if (!$this->profile) { + $this->client_error(_('No profile with that ID.')); + return false; + } + + return true; + } + + function handle($args) { + parent::handle($args); + if ($_SERVER['REQUEST_METHOD'] == 'POST') { + $cur = common_current_user(); + + $sub = Subscription::pkeyGet(array('subscriber' => $cur->id, + 'subscribed' => $this->profile->id)); + + if (!$sub) { + $this->client_error(_('You are not subscribed to that profile.')); + return false; + } + + $orig = clone($sub); + + $sub->jabber = $this->boolean('jabber'); + $sub->sms = $this->boolean('sms'); + + $result = $sub->update($orig); + + if (!$result) { + common_log_db_error($sub, 'UPDATE', __FILE__); + $this->server_error(_('Could not save subscription.')); + return false; + } + + common_redirect(common_local_url('subscriptions', + array('nickname' => $cur->nickname))); + } + } +} diff --git a/_darcs/pristine/actions/subscribe.php b/_darcs/pristine/actions/subscribe.php new file mode 100644 index 0000000000..64abda0043 --- /dev/null +++ b/_darcs/pristine/actions/subscribe.php @@ -0,0 +1,78 @@ +. + */ + +if (!defined('LACONICA')) { exit(1); } + +class SubscribeAction extends Action { + + function handle($args) { + parent::handle($args); + + if (!common_logged_in()) { + common_user_error(_('Not logged in.')); + return; + } + + $user = common_current_user(); + + if ($_SERVER['REQUEST_METHOD'] != 'POST') { + common_redirect(common_local_url('subscriptions', array('nickname' => $user->nickname))); + return; + } + + # CSRF protection + + $token = $this->trimmed('token'); + + if (!$token || $token != common_session_token()) { + $this->client_error(_('There was a problem with your session token. Try again, please.')); + return; + } + + $other_id = $this->arg('subscribeto'); + + $other = User::staticGet('id', $other_id); + + if (!$other) { + $this->client_error(_('Not a local user.')); + return; + } + + $result = subs_subscribe_to($user, $other); + + if($result != true) { + common_user_error($result); + return; + } + + if ($this->boolean('ajax')) { + common_start_html('text/xml;charset=utf-8', true); + common_element_start('head'); + common_element('title', null, _('Subscribed')); + common_element_end('head'); + common_element_start('body'); + common_unsubscribe_form($other->getProfile()); + common_element_end('body'); + common_element_end('html'); + } else { + common_redirect(common_local_url('subscriptions', array('nickname' => + $user->nickname))); + } + } +} diff --git a/_darcs/pristine/actions/subscribers.php b/_darcs/pristine/actions/subscribers.php new file mode 100644 index 0000000000..ae52526e19 --- /dev/null +++ b/_darcs/pristine/actions/subscribers.php @@ -0,0 +1,61 @@ +. + */ + +if (!defined('LACONICA')) { exit(1); } + +require_once(INSTALLDIR.'/lib/gallery.php'); + +class SubscribersAction extends GalleryAction { + + function gallery_type() { + return _('Subscribers'); + } + + function get_instructions(&$profile) { + $user =& common_current_user(); + if ($user && ($user->id == $profile->id)) { + return _('These are the people who listen to your notices.'); + } else { + return sprintf(_('These are the people who listen to %s\'s notices.'), $profile->nickname); + } + } + + function fields() { + return array('subscriber', 'subscribed'); + } + + function div_class() { + return 'subscribers'; + } + + function get_other(&$subs) { + return $subs->subscriber; + } + + function profile_list_class() { + return 'SubscribersList'; + } +} + +class SubscribersList extends ProfileList { + function show_owner_controls($profile) { + common_block_form($profile, array('action' => 'subscribers', + 'nickname' => $this->owner->nickname)); + } +} diff --git a/_darcs/pristine/actions/subscriptions.php b/_darcs/pristine/actions/subscriptions.php new file mode 100644 index 0000000000..f518a1f92d --- /dev/null +++ b/_darcs/pristine/actions/subscriptions.php @@ -0,0 +1,78 @@ +. + */ + +if (!defined('LACONICA')) { exit(1); } + +require_once(INSTALLDIR.'/lib/gallery.php'); + +class SubscriptionsAction extends GalleryAction { + + function gallery_type() { + return _('Subscriptions'); + } + + function get_instructions(&$profile) { + $user =& common_current_user(); + if ($user && ($user->id == $profile->id)) { + return _('These are the people whose notices you listen to.'); + } else { + return sprintf(_('These are the people whose notices %s listens to.'), $profile->nickname); + } + } + + function fields() { + return array('subscribed', 'subscriber'); + } + + function div_class() { + return 'subscriptions'; + } + + function get_other(&$subs) { + return $subs->subscribed; + } + + function profile_list_class() { + return 'SubscriptionsList'; + } +} + +class SubscriptionsList extends ProfileList { + + function show_owner_controls($profile) { + + $sub = Subscription::pkeyGet(array('subscriber' => $this->owner->id, + 'subscribed' => $profile->id)); + if (!$sub) { + return; + } + + common_element_start('form', array('id' => 'subedit-' . $profile->id, + 'method' => 'post', + 'class' => 'subedit', + 'action' => common_local_url('subedit'))); + common_hidden('token', common_session_token()); + common_hidden('profile', $profile->id); + common_checkbox('jabber', _('Jabber'), $sub->jabber); + common_checkbox('sms', _('SMS'), $sub->sms); + common_submit('save', _('Save')); + common_element_end('form'); + return; + } +} diff --git a/_darcs/pristine/actions/sup.php b/_darcs/pristine/actions/sup.php new file mode 100644 index 0000000000..887017b2a4 --- /dev/null +++ b/_darcs/pristine/actions/sup.php @@ -0,0 +1,81 @@ +. + */ + +if (!defined('LACONICA')) { exit(1); } + +class SupAction extends Action { + + function handle($args) { + + parent::handle($args); + + $seconds = $this->trimmed('seconds'); + + if (!$seconds) { + $seconds = 15; + } + + $updates = $this->get_updates($seconds); + + header('Content-Type: application/json; charset=utf-8'); + + print json_encode(array('updated_time' => date('c'), + 'since_time' => date('c', time() - $seconds), + 'available_periods' => $this->available_periods(), + 'period' => $seconds, + 'updates' => $updates)); + } + + function available_periods() { + static $periods = array(86400, 43200, 21600, 7200, + 3600, 1800, 600, 300, 120, + 60, 30, 15); + $available = array(); + foreach ($periods as $period) { + $available[$period] = common_local_url('sup', + array('seconds' => $period)); + } + + return $available; + } + + function get_updates($seconds) { + $notice = new Notice(); + + # XXX: cache this. Depends on how big this protocol becomes; + # Re-doing this query every 15 seconds isn't the end of the world. + + $notice->query('SELECT profile_id, max(id) AS max_id ' . + 'FROM notice ' . + 'WHERE created > (now() - ' . $seconds . ') ' . + 'GROUP BY profile_id'); + + $updates = array(); + + while ($notice->fetch()) { + $updates[] = array($notice->profile_id, $notice->max_id); + } + + return $updates; + } + + function is_readonly() { + return true; + } +} diff --git a/_darcs/pristine/actions/tag.php b/_darcs/pristine/actions/tag.php new file mode 100644 index 0000000000..25cc853c45 --- /dev/null +++ b/_darcs/pristine/actions/tag.php @@ -0,0 +1,165 @@ +. + */ + +if (!defined('LACONICA')) { exit(1); } + +require_once(INSTALLDIR.'/actions/showstream.php'); +define('TAGS_PER_PAGE', 100); + +class TagAction extends StreamAction { + + function handle($args) { + + parent::handle($args); + + # Looks like we're good; show the header + + if (isset($args['tag']) && $args['tag']) { + $tag = $args['tag']; + common_show_header(sprintf(_("Notices tagged with %s"), $tag), + array($this, 'show_header'), $tag, + array($this, 'show_top')); + $this->show_notices($tag); + } else { + common_show_header(_("Tags"), + array($this, 'show_header'), '', + array($this, 'show_top')); + $this->show_tags(); + } + + common_show_footer(); + } + + function show_header($tag = false) { + if ($tag) { + common_element('link', array('rel' => 'alternate', + 'href' => common_local_url('tagrss', array('tag' => $tag)), + 'type' => 'application/rss+xml', + 'title' => sprintf(_('Feed for tag %s'), $tag))); + } + } + + function get_instructions() { + return _('Showing most popular tags from the last week'); + } + + function show_top($tag = false) { + if (!$tag) { + $instr = $this->get_instructions(); + $output = common_markup_to_html($instr); + common_element_start('div', 'instructions'); + common_raw($output); + common_element_end('div'); + $this->public_views_menu(); + } + else { + $this->show_feeds_list(array(0=>array('href'=>common_local_url('tagrss'), + 'type' => 'rss', + 'version' => 'RSS 1.0', + 'item' => 'tagrss'))); + } + } + + function show_tags() + { + # This should probably be cached rather than recalculated + $tags = DB_DataObject::factory('Notice_tag'); + + #Need to clear the selection and then only re-add the field + #we are grouping by, otherwise it's not a valid 'group by' + #even though MySQL seems to let it slide... + $tags->selectAdd(); + $tags->selectAdd('tag'); + + #Add the aggregated columns... + $tags->selectAdd('max(notice_id) as last_notice_id'); + if(common_config('db','type')=='pgsql') { + $calc='sum(exp(-extract(epoch from (now()-created))/%s)) as weight'; + } else { + $calc='sum(exp(-(now() - created)/%s)) as weight'; + } + $tags->selectAdd(sprintf($calc, common_config('tag', 'dropoff'))); + $tags->groupBy('tag'); + $tags->orderBy('weight DESC'); + + # $tags->whereAdd('created > "' . strftime('%Y-%m-%d %H:%M:%S', strtotime('-1 MONTH')) . '"'); + + $tags->limit(TAGS_PER_PAGE); + + $cnt = $tags->find(); + + if ($cnt > 0) { + common_element_start('p', 'tagcloud'); + + $tw = array(); + $sum = 0; + while ($tags->fetch()) { + $tw[$tags->tag] = $tags->weight; + $sum += $tags->weight; + } + + ksort($tw); + + foreach ($tw as $tag => $weight) { + $this->show_tag($tag, $weight, $weight/$sum); + } + + common_element_end('p'); + } + } + + function show_tag($tag, $weight, $relative) { + + # XXX: these should probably tune to the size of the site + if ($relative > 0.1) { + $cls = 'largest'; + } else if ($relative > 0.05) { + $cls = 'verylarge'; + } else if ($relative > 0.02) { + $cls = 'large'; + } else if ($relative > 0.01) { + $cls = 'medium'; + } else if ($relative > 0.005) { + $cls = 'small'; + } else if ($relative > 0.002) { + $cls = 'verysmall'; + } else { + $cls = 'smallest'; + } + + common_element('a', array('class' => "$cls weight-$weight relative-$relative", + 'href' => common_local_url('tag', array('tag' => $tag))), + $tag); + common_text(' '); + } + + function show_notices($tag) { + + $cnt = 0; + + $page = ($this->arg('page')) ? ($this->arg('page')+0) : 1; + + $notice = Notice_tag::getStream($tag, (($page-1)*NOTICES_PER_PAGE), NOTICES_PER_PAGE + 1); + + $cnt = $this->show_notice_list($notice); + + common_pagination($page > 1, $cnt > NOTICES_PER_PAGE, + $page, 'tag', array('tag' => $tag)); + } +} diff --git a/_darcs/pristine/actions/tagother.php b/_darcs/pristine/actions/tagother.php new file mode 100644 index 0000000000..a4449dd690 --- /dev/null +++ b/_darcs/pristine/actions/tagother.php @@ -0,0 +1,193 @@ +. + */ + +if (!defined('LACONICA')) { exit(1); } + +require_once(INSTALLDIR.'/lib/settingsaction.php'); + +class TagotherAction extends Action { + + function handle($args) { + + parent::handle($args); + + if (!common_logged_in()) { + $this->client_error(_('Not logged in'), 403); + return; + } + + if ($_SERVER['REQUEST_METHOD'] == 'POST') { + $this->save_tags(); + } else { + $id = $this->trimmed('id'); + if (!$id) { + $this->client_error(_('No id argument.')); + return; + } + $profile = Profile::staticGet('id', $id); + if (!$profile) { + $this->client_error(_('No profile with that ID.')); + return; + } + $this->show_form($profile); + } + } + + function show_form($profile, $error=NULL) { + + $user = common_current_user(); + + common_show_header(_('Tag a person'), + NULL, array($profile, $error), array($this, 'show_top')); + + $avatar = $profile->getAvatar(AVATAR_PROFILE_SIZE); + + common_element('img', array('src' => ($avatar) ? common_avatar_display_url($avatar) : common_default_avatar(AVATAR_PROFILE_SIZE), + 'class' => 'avatar stream', + 'width' => AVATAR_PROFILE_SIZE, + 'height' => AVATAR_PROFILE_SIZE, + 'alt' => + ($profile->fullname) ? $profile->fullname : + $profile->nickname)); + + common_element('a', array('href' => $profile->profileurl, + 'class' => 'external profile nickname'), + $profile->nickname); + + if ($profile->fullname) { + common_element_start('div', 'fullname'); + if ($profile->homepage) { + common_element('a', array('href' => $profile->homepage), + $profile->fullname); + } else { + common_text($profile->fullname); + } + common_element_end('div'); + } + if ($profile->location) { + common_element('div', 'location', $profile->location); + } + if ($profile->bio) { + common_element('div', 'bio', $profile->bio); + } + + common_element_start('form', array('method' => 'post', + 'id' => 'tag_user', + 'name' => 'tagother', + 'action' => $this->self_url())); + common_hidden('token', common_session_token()); + common_hidden('id', $profile->id); + common_input('tags', _('Tags'), + ($this->arg('tags')) ? $this->arg('tags') : implode(' ', Profile_tag::getTags($user->id, $profile->id)), + _('Tags for this user (letters, numbers, -, ., and _), comma- or space- separated')); + + common_submit('save', _('Save')); + common_element_end('form'); + common_show_footer(); + + } + + function save_tags() { + + $id = $this->trimmed('id'); + $tagstring = $this->trimmed('tags'); + $token = $this->trimmed('token'); + + if (!$token || $token != common_session_token()) { + $this->show_form(_('There was a problem with your session token. Try again, please.')); + return; + } + + $profile = Profile::staticGet('id', $id); + + if (!$profile) { + $this->client_error(_('No such profile.')); + return; + } + + if (is_string($tagstring) && strlen($tagstring) > 0) { + + $tags = array_map('common_canonical_tag', + preg_split('/[\s,]+/', $tagstring)); + + foreach ($tags as $tag) { + if (!common_valid_profile_tag($tag)) { + $this->show_form($profile, sprintf(_('Invalid tag: "%s"'), $tag)); + return; + } + } + } else { + $tags = array(); + } + + $user = common_current_user(); + + if (!Subscription::pkeyGet(array('subscriber' => $user->id, + 'subscribed' => $profile->id)) && + !Subscription::pkeyGet(array('subscriber' => $profile->id, + 'subscribed' => $user->id))) + { + $this->client_error(_('You can only tag people you are subscribed to or who are subscribed to you.')); + return; + } + + $result = Profile_tag::setTags($user->id, $profile->id, $tags); + + if (!$result) { + $this->client_error(_('Could not save tags.')); + return; + } + + $action = $user->isSubscribed($profile) ? 'subscriptions' : 'subscribers'; + + if ($this->boolean('ajax')) { + common_start_html('text/xml'); + common_element_start('head'); + common_element('title', null, _('Tags')); + common_element_end('head'); + common_element_start('body'); + common_element_start('p', 'subtags'); + foreach ($tags as $tag) { + common_element('a', array('href' => common_local_url($action, + array('nickname' => $user->nickname, + 'tag' => $tag))), + $tag); + } + common_element_end('p'); + common_element_end('body'); + common_element_end('html'); + } else { + common_redirect(common_local_url($action, array('nickname' => + $user->nickname))); + } + } + + function show_top($arr = NULL) { + list($profile, $error) = $arr; + if ($error) { + common_element('p', 'error', $error); + } else { + common_element_start('div', 'instructions'); + common_element('p', NULL, + _('Use this form to add tags to your subscribers or subscriptions.')); + common_element_end('div'); + } + } +} + diff --git a/_darcs/pristine/actions/tagrss.php b/_darcs/pristine/actions/tagrss.php new file mode 100644 index 0000000000..9187bdc873 --- /dev/null +++ b/_darcs/pristine/actions/tagrss.php @@ -0,0 +1,65 @@ +. + */ + +if (!defined('LACONICA')) { exit(1); } + +require_once(INSTALLDIR.'/lib/rssaction.php'); + +// Formatting of RSS handled by Rss10Action + +class TagrssAction extends Rss10Action { + + function init() { + $tag = $this->trimmed('tag'); + $this->tag = Notice_tag::staticGet('tag', $tag); + + if (!$this->tag) { + common_user_error(_('No such tag.')); + return false; + } else { + return true; + } + } + + function get_notices($limit=0) { + $tag = $this->tag; + + if (is_null($tag)) { + return NULL; + } + + $notice = Notice_tag::getStream($tag->tag, 0, ($limit == 0) ? NOTICES_PER_PAGE : $limit); + + while ($notice->fetch()) { + $notices[] = clone($notice); + } + + return $notices; + } + + function get_channel() { + $tag = $this->tag->tag; + + $c = array('url' => common_local_url('tagrss', array('tag' => $tagname)), + 'title' => $tagname, + 'link' => common_local_url('tagrss', array('tag' => $tagname)), + 'description' => sprintf(_('Microblog tagged with %s'), $tagname)); + return $c; + } +} diff --git a/_darcs/pristine/actions/twitapiaccount.php b/_darcs/pristine/actions/twitapiaccount.php new file mode 100644 index 0000000000..f6e955828e --- /dev/null +++ b/_darcs/pristine/actions/twitapiaccount.php @@ -0,0 +1,96 @@ +. + */ + +if (!defined('LACONICA')) { exit(1); } + +require_once(INSTALLDIR.'/lib/twitterapi.php'); + +class TwitapiaccountAction extends TwitterapiAction { + + function verify_credentials($args, $apidata) { + parent::handle($args); + + if (!in_array($apidata['content-type'], array('xml', 'json'))) { + common_user_error(_('API method not found!'), $code = 404); + return; + } + + $this->show_extended_profile($apidata['user'], $apidata); + } + + function end_session($args, $apidata) { + parent::handle($args); + common_server_error(_('API method under construction.'), $code=501); + } + + function update_location($args, $apidata) { + parent::handle($args); + + if ($_SERVER['REQUEST_METHOD'] != 'POST') { + $this->client_error(_('This method requires a POST.'), 400, $apidata['content-type']); + return; + } + + $location = trim($this->arg('location')); + + if (!is_null($location) && strlen($location) > 255) { + + // XXX: But Twitter just truncates and runs with it. -- Zach + $this->client_error(_('That\'s too long. Max notice size is 255 chars.'), 406, $apidate['content-type']); + return; + } + + $user = $apidata['user']; + $profile = $user->getProfile(); + + if (!$profile) { + common_server_error(_('User has no profile.')); + return; + } + + $orig_profile = clone($profile); + $profile->location = $location; + + $result = $profile->update($orig_profile); + + if (!$result) { + common_log_db_error($profile, 'UPDATE', __FILE__); + common_server_error(_('Couldn\'t save profile.')); + return; + } + + common_broadcast_profile($profile); + $type = $apidata['content-type']; + + $this->init_document($type); + $this->show_profile($profile, $type); + $this->end_document($type); + } + + + function update_delivery_device($args, $apidata) { + parent::handle($args); + common_server_error(_('API method under construction.'), $code=501); + } + + function rate_limit_status($args, $apidata) { + parent::handle($args); + common_server_error(_('API method under construction.'), $code=501); + } +} \ No newline at end of file diff --git a/_darcs/pristine/actions/twitapiblocks.php b/_darcs/pristine/actions/twitapiblocks.php new file mode 100644 index 0000000000..4852ff9388 --- /dev/null +++ b/_darcs/pristine/actions/twitapiblocks.php @@ -0,0 +1,69 @@ +. + */ + +if (!defined('LACONICA')) { exit(1); } + +require_once(INSTALLDIR.'/lib/twitterapi.php'); + +class TwitapiblocksAction extends TwitterapiAction { + + function create($args, $apidata) { + + parent::handle($args); + + $blockee = $this->get_user($apidata['api_arg'], $apidata); + + if (!$blockee) { + $this->client_error('Not Found', 404, $apidata['content-type']); + return; + } + + $user = $apidata['user']; + + if ($user->hasBlocked($blockee) || $user->block($blockee)) { + $type = $apidata['content-type']; + $this->init_document($type); + $this->show_profile($blockee, $type); + $this->end_document($type); + } else { + common_server_error(_('Block user failed.')); + } + } + + function destroy($args, $apidata) { + parent::handle($args); + $blockee = $this->get_user($apidata['api_arg'], $apidata); + + if (!$blockee) { + $this->client_error('Not Found', 404, $apidata['content-type']); + return; + } + + $user = $apidata['user']; + + if (!$user->hasBlocked($blockee) || $user->unblock($blockee)) { + $type = $apidata['content-type']; + $this->init_document($type); + $this->show_profile($blockee, $type); + $this->end_document($type); + } else { + common_server_error(_('Unblock user failed.')); + } + } +} \ No newline at end of file diff --git a/_darcs/pristine/actions/twitapidirect_messages.php b/_darcs/pristine/actions/twitapidirect_messages.php new file mode 100644 index 0000000000..535795ca43 --- /dev/null +++ b/_darcs/pristine/actions/twitapidirect_messages.php @@ -0,0 +1,287 @@ +. + */ + +if (!defined('LACONICA')) { exit(1); } + +require_once(INSTALLDIR.'/lib/twitterapi.php'); + +class Twitapidirect_messagesAction extends TwitterapiAction { + + function direct_messages($args, $apidata) { + parent::handle($args); + return $this->show_messages($args, $apidata, 'received'); + } + + function sent($args, $apidata) { + parent::handle($args); + return $this->show_messages($args, $apidata, 'sent'); + } + + function show_messages($args, $apidata, $type) { + + $user = $apidata['user']; + + $count = $this->arg('count'); + $since = $this->arg('since'); + $since_id = $this->arg('since_id'); + $before_id = $this->arg('before_id'); + + $page = $this->arg('page'); + + if (!$page) { + $page = 1; + } + + if (!$count) { + $count = 20; + } + + $message = new Message(); + + $title = null; + $subtitle = null; + $link = null; + $server = common_root_url(); + + if ($type == 'received') { + $message->to_profile = $user->id; + $title = sprintf(_("Direct messages to %s"), $user->nickname); + $subtitle = sprintf(_("All the direct messages sent to %s"), $user->nickname); + $link = $server . $user->nickname . '/inbox'; + } else { + $message->from_profile = $user->id; + $title = _('Direct Messages You\'ve Sent'); + $subtitle = sprintf(_("All the direct messages sent from %s"), $user->nickname); + $link = $server . $user->nickname . '/outbox'; + } + + if ($before_id) { + $message->whereAdd("id < $before_id"); + } + + if ($since_id) { + $message->whereAdd("id > $since_id"); + } + + $since = strtotime($this->arg('since')); + + if ($since) { + $d = date('Y-m-d H:i:s', $since); + $message->whereAdd("created > '$d'"); + } + + $message->orderBy('created DESC, id DESC'); + $message->limit((($page-1)*20), $count); + $message->find(); + + switch($apidata['content-type']) { + case 'xml': + $this->show_xml_dmsgs($message); + break; + case 'rss': + $this->show_rss_dmsgs($message, $title, $link, $subtitle); + break; + case 'atom': + $this->show_atom_dmsgs($message, $title, $link, $subtitle); + break; + case 'json': + $this->show_json_dmsgs($message); + break; + default: + common_user_error(_('API method not found!'), $code = 404); + } + + } + + // had to change this from "new" to "create" to avoid PHP reserved word + function create($args, $apidata) { + parent::handle($args); + + if ($_SERVER['REQUEST_METHOD'] != 'POST') { + $this->client_error(_('This method requires a POST.'), 400, $apidata['content-type']); + return; + } + + $user = $apidata['user']; + $source = $this->trimmed('source'); // Not supported by Twitter. + + $reserved_sources = array('web', 'omb', 'mail', 'xmpp', 'api'); + if (!$source || in_array($source, $reserved_sources)) { + $source = 'api'; + } + + $content = $this->trimmed('text'); + + if (!$content) { + $this->client_error(_('No message text!'), $code = 406, $apidata['content-type']); + } else { + $content_shortened = common_shorten_links($content); + if (mb_strlen($content_shortened) > 140) { + $this->client_error(_('That\'s too long. Max message size is 140 chars.'), + $code = 406, $apidata['content-type']); + return; + } + } + + $other = $this->get_user($this->trimmed('user')); + + if (!$other) { + $this->client_error(_('Recipient user not found.'), $code = 403, $apidata['content-type']); + return; + } else if (!$user->mutuallySubscribed($other)) { + $this->client_error(_('Can\'t send direct messages to users who aren\'t your friend.'), + $code = 403, $apidata['content-type']); + return; + } else if ($user->id == $other->id) { + // Sending msgs to yourself is allowed by Twitter + $this->client_error(_('Don\'t send a message to yourself; just say it to yourself quietly instead.'), + $code = 403, $apidata['content-type']); + return; + } + + $message = Message::saveNew($user->id, $other->id, + html_entity_decode($content, ENT_NOQUOTES, 'UTF-8'), $source); + + if (is_string($message)) { + $this->server_error($message); + return; + } + + $this->notify($user, $other, $message); + + if ($apidata['content-type'] == 'xml') { + $this->show_single_xml_dmsg($message); + } elseif ($apidata['content-type'] == 'json') { + $this->show_single_json_dmsg($message); + } + + } + + function destroy($args, $apidata) { + parent::handle($args); + common_server_error(_('API method under construction.'), $code=501); + } + + function show_xml_dmsgs($message) { + + $this->init_document('xml'); + common_element_start('direct-messages', array('type' => 'array')); + + if (is_array($messages)) { + foreach ($message as $m) { + $twitter_dm = $this->twitter_dmsg_array($m); + $this->show_twitter_xml_dmsg($twitter_dm); + } + } else { + while ($message->fetch()) { + $twitter_dm = $this->twitter_dmsg_array($message); + $this->show_twitter_xml_dmsg($twitter_dm); + } + } + + common_element_end('direct-messages'); + $this->end_document('xml'); + + } + + function show_json_dmsgs($message) { + + $this->init_document('json'); + + $dmsgs = array(); + + if (is_array($message)) { + foreach ($message as $m) { + $twitter_dm = $this->twitter_dmsg_array($m); + array_push($dmsgs, $twitter_dm); + } + } else { + while ($message->fetch()) { + $twitter_dm = $this->twitter_dmsg_array($message); + array_push($dmsgs, $twitter_dm); + } + } + + $this->show_json_objects($dmsgs); + $this->end_document('json'); + + } + + function show_rss_dmsgs($message, $title, $link, $subtitle) { + + $this->init_document('rss'); + + common_element_start('channel'); + common_element('title', NULL, $title); + + common_element('link', NULL, $link); + common_element('description', NULL, $subtitle); + common_element('language', NULL, 'en-us'); + common_element('ttl', NULL, '40'); + + if (is_array($message)) { + foreach ($message as $m) { + $entry = $this->twitter_rss_dmsg_array($m); + $this->show_twitter_rss_item($entry); + } + } else { + while ($message->fetch()) { + $entry = $this->twitter_rss_dmsg_array($message); + $this->show_twitter_rss_item($entry); + } + } + + common_element_end('channel'); + $this->end_twitter_rss(); + + } + + function show_atom_dmsgs($message, $title, $link, $subtitle) { + + $this->init_document('atom'); + + common_element('title', NULL, $title); + $siteserver = common_config('site', 'server'); + common_element('id', NULL, "tag:$siteserver,2008:DirectMessage"); + common_element('link', array('href' => $link, 'rel' => 'alternate', 'type' => 'text/html'), NULL); + common_element('updated', NULL, common_date_iso8601(strftime('%c'))); + common_element('subtitle', NULL, $subtitle); + + if (is_array($message)) { + foreach ($message as $m) { + $entry = $this->twitter_rss_dmsg_array($m); + $this->show_twitter_atom_entry($entry); + } + } else { + while ($message->fetch()) { + $entry = $this->twitter_rss_dmsg_array($message); + $this->show_twitter_atom_entry($entry); + } + } + + $this->end_document('atom'); + } + + // swiped from MessageAction. Should it be place in util.php? + function notify($from, $to, $message) { + mail_notify_message($message, $from, $to); + # XXX: Jabber, SMS notifications... probably queued + } + +} diff --git a/_darcs/pristine/actions/twitapifavorites.php b/_darcs/pristine/actions/twitapifavorites.php new file mode 100644 index 0000000000..3eaff327a1 --- /dev/null +++ b/_darcs/pristine/actions/twitapifavorites.php @@ -0,0 +1,175 @@ +. + */ + +if (!defined('LACONICA')) { exit(1); } + +require_once(INSTALLDIR.'/lib/twitterapi.php'); + +class TwitapifavoritesAction extends TwitterapiAction { + + function favorites($args, $apidata) { + parent::handle($args); + + $this->auth_user = $apidata['user']; + $user = $this->get_user($apidata['api_arg'], $apidata); + + if (!$user) { + $this->client_error('Not Found', 404, $apidata['content-type']); + return; + } + + $profile = $user->getProfile(); + + if (!$profile) { + common_server_error(_('User has no profile.')); + return; + } + + $page = $this->arg('page'); + + if (!$page) { + $page = 1; + } + + if (!$count) { + $count = 20; + } + + $notice = $user->favoriteNotices((($page-1)*20), $count); + + if (!$notice) { + common_server_error(_('Could not retrieve favorite notices.')); + return; + } + + $sitename = common_config('site', 'name'); + $siteserver = common_config('site', 'server'); + + $title = sprintf(_('%s / Favorites from %s'), $sitename, $user->nickname); + $id = "tag:$siteserver:favorites:".$user->id; + $link = common_local_url('favorites', array('nickname' => $user->nickname)); + $subtitle = sprintf(_('%s updates favorited by %s / %s.'), $sitename, $profile->getBestName(), $user->nickname); + + switch($apidata['content-type']) { + case 'xml': + $this->show_xml_timeline($notice); + break; + case 'rss': + $this->show_rss_timeline($notice, $title, $link, $subtitle); + break; + case 'atom': + $this->show_atom_timeline($notice, $title, $id, $link, $subtitle); + break; + case 'json': + $this->show_json_timeline($notice); + break; + default: + common_user_error(_('API method not found!'), $code = 404); + } + + } + + function create($args, $apidata) { + parent::handle($args); + + // Check for RESTfulness + if (!in_array($_SERVER['REQUEST_METHOD'], array('POST', 'DELETE'))) { + // XXX: Twitter just prints the err msg, no XML / JSON. + $this->client_error(_('This method requires a POST or DELETE.'), 400, $apidata['content-type']); + return; + } + + if (!in_array($apidata['content-type'], array('xml', 'json'))) { + common_user_error(_('API method not found!'), $code = 404); + return; + } + + $this->auth_user = $apidata['user']; + $user = $this->auth_user; + $notice_id = $apidata['api_arg']; + $notice = Notice::staticGet($notice_id); + + if (!$notice) { + $this->client_error(_('No status found with that ID.'), 404, $apidata['content-type']); + return; + } + + // XXX: Twitter lets you fave things repeatedly via api. + if ($user->hasFave($notice)) { + $this->client_error(_('This notice is already a favorite!'), 403, $apidata['content-type']); + return; + } + + $fave = Fave::addNew($user, $notice); + + if (!$fave) { + common_server_error(_('Could not create favorite.')); + return; + } + + $this->notify($fave, $notice, $user); + $user->blowFavesCache(); + + if ($apidata['content-type'] == 'xml') { + $this->show_single_xml_status($notice); + } elseif ($apidata['content-type'] == 'json') { + $this->show_single_json_status($notice); + } + + } + + function destroy($args, $apidata) { + parent::handle($args); + common_server_error(_('API method under construction.'), $code=501); + } + + // XXX: these two funcs swiped from faves. Maybe put in util.php, or some common base class? + + function notify($fave, $notice, $user) { + $other = User::staticGet('id', $notice->profile_id); + if ($other && $other->id != $user->id) { + if ($other->email && $other->emailnotifyfav) { + $this->notify_mail($other, $user, $notice); + } + # XXX: notify by IM + # XXX: notify by SMS + } + } + + function notify_mail($other, $user, $notice) { + $profile = $user->getProfile(); + $bestname = $profile->getBestName(); + $subject = sprintf(_('%s added your notice as a favorite'), $bestname); + $body = sprintf(_("%1\$s just added your notice from %2\$s as one of their favorites.\n\n" . + "In case you forgot, you can see the text of your notice here:\n\n" . + "%3\$s\n\n" . + "You can see the list of %1\$s's favorites here:\n\n" . + "%4\$s\n\n" . + "Faithfully yours,\n" . + "%5\$s\n"), + $bestname, + common_exact_date($notice->created), + common_local_url('shownotice', array('notice' => $notice->id)), + common_local_url('showfavorites', array('nickname' => $user->nickname)), + common_config('site', 'name')); + + mail_to_user($other, $subject, $body); + } + +} \ No newline at end of file diff --git a/_darcs/pristine/actions/twitapifriendships.php b/_darcs/pristine/actions/twitapifriendships.php new file mode 100644 index 0000000000..e4b49cbe4a --- /dev/null +++ b/_darcs/pristine/actions/twitapifriendships.php @@ -0,0 +1,155 @@ +. + */ + +if (!defined('LACONICA')) { exit(1); } + +require_once(INSTALLDIR.'/lib/twitterapi.php'); + +class TwitapifriendshipsAction extends TwitterapiAction { + + function create($args, $apidata) { + parent::handle($args); + + if ($_SERVER['REQUEST_METHOD'] != 'POST') { + $this->client_error(_('This method requires a POST.'), 400, $apidata['content-type']); + return; + } + + $id = $apidata['api_arg']; + + $other = $this->get_user($id); + + if (!$other) { + $this->client_error(_('Could not follow user: User not found.'), 403, $apidata['content-type']); + return; + } + + $user = $apidata['user']; + + if ($user->isSubscribed($other)) { + $errmsg = sprintf(_('Could not follow user: %s is already on your list.'), $other->nickname); + $this->client_error($errmsg, 403, $apidata['content-type']); + return; + } + + $sub = new Subscription(); + + $sub->query('BEGIN'); + + $sub->subscriber = $user->id; + $sub->subscribed = $other->id; + $sub->created = DB_DataObject_Cast::dateTime(); # current time + + $result = $sub->insert(); + + if (!$result) { + $errmsg = sprintf(_('Could not follow user: %s is already on your list.'), $other->nickname); + $this->client_error($errmsg, 400, $apidata['content-type']); + return; + } + + $sub->query('COMMIT'); + + mail_subscribe_notify($other, $user); + + $type = $apidata['content-type']; + $this->init_document($type); + $this->show_profile($other, $type); + $this->end_document($type); + + } + + function destroy($args, $apidata) { + parent::handle($args); + + if (!in_array($_SERVER['REQUEST_METHOD'], array('POST', 'DELETE'))) { + $this->client_error(_('This method requires a POST or DELETE.'), 400, $apidata['content-type']); + return; + } + + $id = $apidata['api_arg']; + + # We can't subscribe to a remote person, but we can unsub + + $other = $this->get_profile($id); + $user = $apidata['user']; + + $sub = new Subscription(); + $sub->subscriber = $user->id; + $sub->subscribed = $other->id; + + if ($sub->find(TRUE)) { + $sub->query('BEGIN'); + $sub->delete(); + $sub->query('COMMIT'); + } else { + $this->client_error(_('You are not friends with the specified user.'), 403, $apidata['content-type']); + return; + } + + $type = $apidata['content-type']; + $this->init_document($type); + $this->show_profile($other, $type); + $this->end_document($type); + + } + + function exists($args, $apidata) { + parent::handle($args); + + if (!in_array($apidata['content-type'], array('xml', 'json'))) { + common_user_error(_('API method not found!'), $code = 404); + return; + } + + $user_a_id = $this->trimmed('user_a'); + $user_b_id = $this->trimmed('user_b'); + + $user_a = $this->get_user($user_a_id); + $user_b = $this->get_user($user_b_id); + + if (!$user_a || !$user_b) { + $this->client_error(_('Two user ids or screen_names must be supplied.'), 400, $apidata['content-type']); + return; + } + + if ($user_a->isSubscribed($user_b)) { + $result = 'true'; + } else { + $result = 'false'; + } + + switch ($apidata['content-type']) { + case 'xml': + $this->init_document('xml'); + common_element('friends', NULL, $result); + $this->end_document('xml'); + break; + case 'json': + $this->init_document('json'); + print json_encode($result); + $this->end_document('json'); + break; + default: + break; + } + + } + +} \ No newline at end of file diff --git a/_darcs/pristine/actions/twitapihelp.php b/_darcs/pristine/actions/twitapihelp.php new file mode 100644 index 0000000000..c5d503e118 --- /dev/null +++ b/_darcs/pristine/actions/twitapihelp.php @@ -0,0 +1,52 @@ +. + */ + +if (!defined('LACONICA')) { exit(1); } + +require_once(INSTALLDIR.'/lib/twitterapi.php'); + +class TwitapihelpAction extends TwitterapiAction { + + /* Returns the string "ok" in the requested format with a 200 OK HTTP status code. + * URL:http://identi.ca/api/help/test.format + * Formats: xml, json + */ + function test($args, $apidata) { + parent::handle($args); + + if ($apidata['content-type'] == 'xml') { + $this->init_document('xml'); + common_element('ok', NULL, 'true'); + $this->end_document('xml'); + } elseif ($apidata['content-type'] == 'json') { + $this->init_document('json'); + print '"ok"'; + $this->end_document('json'); + } else { + common_user_error(_('API method not found!'), $code=404); + } + + } + + function downtime_schedule($args, $apidata) { + parent::handle($args); + common_server_error(_('API method under construction.'), $code=501); + } + +} \ No newline at end of file diff --git a/_darcs/pristine/actions/twitapinotifications.php b/_darcs/pristine/actions/twitapinotifications.php new file mode 100644 index 0000000000..8d93309a25 --- /dev/null +++ b/_darcs/pristine/actions/twitapinotifications.php @@ -0,0 +1,37 @@ +. + */ + +if (!defined('LACONICA')) { exit(1); } + +require_once(INSTALLDIR.'/lib/twitterapi.php'); + +# This naming convention looks real sick +class TwitapinotificationsAction extends TwitterapiAction { + + function follow($args, $apidata) { + parent::handle($args); + common_server_error(_('API method under construction.'), $code=501); + } + + function leave($args, $apidata) { + parent::handle($args); + common_server_error(_('API method under construction.'), $code=501); + } + +} \ No newline at end of file diff --git a/_darcs/pristine/actions/twitapistatuses.php b/_darcs/pristine/actions/twitapistatuses.php new file mode 100644 index 0000000000..7b6598b108 --- /dev/null +++ b/_darcs/pristine/actions/twitapistatuses.php @@ -0,0 +1,563 @@ +. + */ + +if (!defined('LACONICA')) { exit(1); } + +require_once(INSTALLDIR.'/lib/twitterapi.php'); + +class TwitapistatusesAction extends TwitterapiAction { + + function public_timeline($args, $apidata) { + parent::handle($args); + + $sitename = common_config('site', 'name'); + $siteserver = common_config('site', 'server'); + $title = sprintf(_("%s public timeline"), $sitename); + $id = "tag:$siteserver:Statuses"; + $link = common_root_url(); + $subtitle = sprintf(_("%s updates from everyone!"), $sitename); + + // Number of public statuses to return by default -- Twitter sends 20 + $MAX_PUBSTATUSES = 20; + + // FIXME: To really live up to the spec we need to build a list + // of notices by users who have custom avatars, so fix this SQL -- Zach + + $page = $this->arg('page'); + $since_id = $this->arg('since_id'); + $before_id = $this->arg('before_id'); + + // NOTE: page, since_id, and before_id are extensions to Twitter API -- TB + if (!$page) { + $page = 1; + } + if (!$since_id) { + $since_id = 0; + } + if (!$before_id) { + $before_id = 0; + } + + $since = strtotime($this->arg('since')); + + $notice = Notice::publicStream((($page-1)*$MAX_PUBSTATUSES), $MAX_PUBSTATUSES, $since_id, $before_id, $since); + + if ($notice) { + + switch($apidata['content-type']) { + case 'xml': + $this->show_xml_timeline($notice); + break; + case 'rss': + $this->show_rss_timeline($notice, $title, $link, $subtitle); + break; + case 'atom': + $this->show_atom_timeline($notice, $title, $id, $link, $subtitle); + break; + case 'json': + $this->show_json_timeline($notice); + break; + default: + common_user_error(_('API method not found!'), $code = 404); + break; + } + + } else { + common_server_error(_('Couldn\'t find any statuses.'), $code = 503); + } + + } + + function friends_timeline($args, $apidata) { + parent::handle($args); + + $since = $this->arg('since'); + $since_id = $this->arg('since_id'); + $count = $this->arg('count'); + $page = $this->arg('page'); + $before_id = $this->arg('before_id'); + + if (!$page) { + $page = 1; + } + + if (!$count) { + $count = 20; + } + + if (!$since_id) { + $since_id = 0; + } + + // NOTE: before_id is an extension to Twitter API -- TB + if (!$before_id) { + $before_id = 0; + } + + $since = strtotime($this->arg('since')); + + $user = $this->get_user(NULL, $apidata); + $this->auth_user = $user; + + $profile = $user->getProfile(); + + $sitename = common_config('site', 'name'); + $siteserver = common_config('site', 'server'); + + $title = sprintf(_("%s and friends"), $user->nickname); + $id = "tag:$siteserver:friends:" . $user->id; + $link = common_local_url('all', array('nickname' => $user->nickname)); + $subtitle = sprintf(_('Updates from %1$s and friends on %2$s!'), $user->nickname, $sitename); + + $notice = $user->noticesWithFriends(($page-1)*20, $count, $since_id, $before_id, $since); + + switch($apidata['content-type']) { + case 'xml': + $this->show_xml_timeline($notice); + break; + case 'rss': + $this->show_rss_timeline($notice, $title, $link, $subtitle); + break; + case 'atom': + $this->show_atom_timeline($notice, $title, $id, $link, $subtitle); + break; + case 'json': + $this->show_json_timeline($notice); + break; + default: + common_user_error(_('API method not found!'), $code = 404); + } + + } + + function user_timeline($args, $apidata) { + parent::handle($args); + + $this->auth_user = $apidata['user']; + $user = $this->get_user($apidata['api_arg'], $apidata); + + if (!$user) { + $this->client_error('Not Found', 404, $apidata['content-type']); + return; + } + + $profile = $user->getProfile(); + + if (!$profile) { + common_server_error(_('User has no profile.')); + return; + } + + $count = $this->arg('count'); + $since = $this->arg('since'); + $since_id = $this->arg('since_id'); + $page = $this->arg('page'); + $before_id = $this->arg('before_id'); + + if (!$page) { + $page = 1; + } + + if (!$count) { + $count = 20; + } + + if (!$since_id) { + $since_id = 0; + } + + // NOTE: before_id is an extensions to Twitter API -- TB + if (!$before_id) { + $before_id = 0; + } + + $since = strtotime($this->arg('since')); + + $sitename = common_config('site', 'name'); + $siteserver = common_config('site', 'server'); + + $title = sprintf(_("%s timeline"), $user->nickname); + $id = "tag:$siteserver:user:".$user->id; + $link = common_local_url('showstream', array('nickname' => $user->nickname)); + $subtitle = sprintf(_('Updates from %1$s on %2$s!'), $user->nickname, $sitename); + + # FriendFeed's SUP protocol + # Also added RSS and Atom feeds + + $suplink = common_local_url('sup', NULL, $user->id); + header('X-SUP-ID: '.$suplink); + + # XXX: since + + $notice = $user->getNotices((($page-1)*20), $count, $since_id, $before_id, $since); + + switch($apidata['content-type']) { + case 'xml': + $this->show_xml_timeline($notice); + break; + case 'rss': + $this->show_rss_timeline($notice, $title, $link, $subtitle, $suplink); + break; + case 'atom': + $this->show_atom_timeline($notice, $title, $id, $link, $subtitle, $suplink); + break; + case 'json': + $this->show_json_timeline($notice); + break; + default: + common_user_error(_('API method not found!'), $code = 404); + } + + } + + function update($args, $apidata) { + + parent::handle($args); + + if (!in_array($apidata['content-type'], array('xml', 'json'))) { + common_user_error(_('API method not found!'), $code = 404); + return; + } + + if ($_SERVER['REQUEST_METHOD'] != 'POST') { + $this->client_error(_('This method requires a POST.'), 400, $apidata['content-type']); + return; + } + + $this->auth_user = $apidata['user']; + $user = $this->auth_user; + $status = $this->trimmed('status'); + $source = $this->trimmed('source'); + $in_reply_to_status_id = intval($this->trimmed('in_reply_to_status_id')); + $reserved_sources = array('web', 'omb', 'mail', 'xmpp', 'api'); + if (!$source || in_array($source, $reserved_sources)) { + $source = 'api'; + } + + if (!$status) { + + // XXX: Note: In this case, Twitter simply returns '200 OK' + // No error is given, but the status is not posted to the + // user's timeline. Seems bad. Shouldn't we throw an + // errror? -- Zach + return; + + } else { + + $status_shortened = common_shorten_links($status); + + if (mb_strlen($status_shortened) > 140) { + + // XXX: Twitter truncates anything over 140, flags the status + // as "truncated." Sending this error may screw up some clients + // that assume Twitter will truncate for them. Should we just + // truncate too? -- Zach + $this->client_error(_('That\'s too long. Max notice size is 140 chars.'), $code = 406, $apidata['content-type']); + return; + + } + } + + // Check for commands + $inter = new CommandInterpreter(); + $cmd = $inter->handle_command($user, $status_shortened); + + if ($cmd) { + + if ($this->supported($cmd)) { + $cmd->execute(new Channel()); + } + + // cmd not supported? Twitter just returns your latest status. + // And, it returns your last status whether the cmd was successful + // or not! + $n = $user->getCurrentNotice(); + $apidata['api_arg'] = $n->id; + } else { + + $reply_to = NULL; + + if ($in_reply_to_status_id) { + + // check whether notice actually exists + $reply = Notice::staticGet($in_reply_to_status_id); + + if ($reply) { + $reply_to = $in_reply_to_status_id; + } else { + $this->client_error(_('Not found'), $code = 404, $apidata['content-type']); + return; + } + } + + $notice = Notice::saveNew($user->id, html_entity_decode($status, ENT_NOQUOTES, 'UTF-8'), + $source, 1, $reply_to); + + if (is_string($notice)) { + $this->server_error($notice); + return; + } + + common_broadcast_notice($notice); + $apidata['api_arg'] = $notice->id; + } + + $this->show($args, $apidata); + } + + function replies($args, $apidata) { + + parent::handle($args); + + $since = $this->arg('since'); + $count = $this->arg('count'); + $page = $this->arg('page'); + $since_id = $this->arg('since_id'); + $before_id = $this->arg('before_id'); + + $this->auth_user = $apidata['user']; + $user = $this->auth_user; + $profile = $user->getProfile(); + + $sitename = common_config('site', 'name'); + $siteserver = common_config('site', 'server'); + + $title = sprintf(_('%1$s / Updates replying to %2$s'), $sitename, $user->nickname); + $id = "tag:$siteserver:replies:".$user->id; + $link = common_local_url('replies', array('nickname' => $user->nickname)); + $subtitle = sprintf(_('%1$s updates that reply to updates from %2$s / %3$s.'), $sitename, $user->nickname, $profile->getBestName()); + + if (!$page) { + $page = 1; + } + + if (!$count) { + $count = 20; + } + + if (!$since_id) { + $since_id = 0; + } + + // NOTE: before_id is an extension to Twitter API -- TB + if (!$before_id) { + $before_id = 0; + } + + $since = strtotime($this->arg('since')); + + $notice = $user->getReplies((($page-1)*20), $count, $since_id, $before_id, $since); + $notices = array(); + + while ($notice->fetch()) { + $notices[] = clone($notice); + } + + switch($apidata['content-type']) { + case 'xml': + $this->show_xml_timeline($notices); + break; + case 'rss': + $this->show_rss_timeline($notices, $title, $link, $subtitle); + break; + case 'atom': + $this->show_atom_timeline($notices, $title, $id, $link, $subtitle); + break; + case 'json': + $this->show_json_timeline($notices); + break; + default: + common_user_error(_('API method not found!'), $code = 404); + } + + } + + function show($args, $apidata) { + parent::handle($args); + + if (!in_array($apidata['content-type'], array('xml', 'json'))) { + common_user_error(_('API method not found!'), $code = 404); + return; + } + + $this->auth_user = $apidata['user']; + $notice_id = $apidata['api_arg']; + $notice = Notice::staticGet($notice_id); + + if ($notice) { + if ($apidata['content-type'] == 'xml') { + $this->show_single_xml_status($notice); + } elseif ($apidata['content-type'] == 'json') { + $this->show_single_json_status($notice); + } + } else { + // XXX: Twitter just sets a 404 header and doens't bother to return an err msg + $this->client_error(_('No status with that ID found.'), 404, $apidata['content-type']); + } + + } + + function destroy($args, $apidata) { + + parent::handle($args); + + if (!in_array($apidata['content-type'], array('xml', 'json'))) { + common_user_error(_('API method not found!'), $code = 404); + return; + } + + // Check for RESTfulness + if (!in_array($_SERVER['REQUEST_METHOD'], array('POST', 'DELETE'))) { + // XXX: Twitter just prints the err msg, no XML / JSON. + $this->client_error(_('This method requires a POST or DELETE.'), 400, $apidata['content-type']); + return; + } + + $this->auth_user = $apidata['user']; + $user = $this->auth_user; + $notice_id = $apidata['api_arg']; + $notice = Notice::staticGet($notice_id); + + if (!$notice) { + $this->client_error(_('No status found with that ID.'), 404, $apidata['content-type']); + return; + } + + if ($user->id == $notice->profile_id) { + $replies = new Reply; + $replies->get('notice_id', $notice_id); + common_dequeue_notice($notice); + $replies->delete(); + $notice->delete(); + + if ($apidata['content-type'] == 'xml') { + $this->show_single_xml_status($notice); + } elseif ($apidata['content-type'] == 'json') { + $this->show_single_json_status($notice); + } + } else { + $this->client_error(_('You may not delete another user\'s status.'), 403, $apidata['content-type']); + } + + } + + function friends($args, $apidata) { + parent::handle($args); + return $this->subscriptions($apidata, 'subscribed', 'subscriber'); + } + + function followers($args, $apidata) { + parent::handle($args); + + return $this->subscriptions($apidata, 'subscriber', 'subscribed'); + } + + function subscriptions($apidata, $other_attr, $user_attr) { + + # XXX: lite + + $this->auth_user = $apidate['user']; + $user = $this->get_user($apidata['api_arg'], $apidata); + + if (!$user) { + $this->client_error('Not Found', 404, $apidata['content-type']); + return; + } + + $page = $this->trimmed('page'); + + if (!$page || !is_numeric($page)) { + $page = 1; + } + + $profile = $user->getProfile(); + + if (!$profile) { + common_server_error(_('User has no profile.')); + return; + } + + $sub = new Subscription(); + $sub->$user_attr = $profile->id; + + $since = strtotime($this->trimmed('since')); + + if ($since) { + $d = date('Y-m-d H:i:s', $since); + $sub->whereAdd("created > '$d'"); + } + + $sub->orderBy('created DESC'); + $sub->limit(($page-1)*100, 100); + + $others = array(); + + if ($sub->find()) { + while ($sub->fetch()) { + $others[] = Profile::staticGet($sub->$other_attr); + } + } else { + // user has no followers + } + + $type = $apidata['content-type']; + + $this->init_document($type); + $this->show_profiles($others, $type); + $this->end_document($type); + } + + function show_profiles($profiles, $type) { + switch ($type) { + case 'xml': + common_element_start('users', array('type' => 'array')); + foreach ($profiles as $profile) { + $this->show_profile($profile); + } + common_element_end('users'); + break; + case 'json': + $arrays = array(); + foreach ($profiles as $profile) { + $arrays[] = $this->twitter_user_array($profile, true); + } + print json_encode($arrays); + break; + default: + $this->client_error(_('unsupported file type')); + } + } + + function featured($args, $apidata) { + parent::handle($args); + common_server_error(_('API method under construction.'), $code=501); + } + + function supported($cmd) { + + $cmdlist = array('MessageCommand', 'SubCommand', 'UnsubCommand', 'FavCommand', 'OnCommand', 'OffCommand'); + + if (in_array(get_class($cmd), $cmdlist)) { + return true; + } + + return false; + } + +} diff --git a/_darcs/pristine/actions/twitapiusers.php b/_darcs/pristine/actions/twitapiusers.php new file mode 100644 index 0000000000..9e06efa642 --- /dev/null +++ b/_darcs/pristine/actions/twitapiusers.php @@ -0,0 +1,52 @@ +. + */ + +if (!defined('LACONICA')) { exit(1); } + +require_once(INSTALLDIR.'/lib/twitterapi.php'); + +class TwitapiusersAction extends TwitterapiAction { + + function show($args, $apidata) { + parent::handle($args); + + if (!in_array($apidata['content-type'], array('xml', 'json'))) { + common_user_error(_('API method not found!'), $code = 404); + return; + } + + $user = null; + $email = $this->arg('email'); + + if ($email) { + $user = User::staticGet('email', $email); + } elseif (isset($apidata['api_arg'])) { + $user = $this->get_user($apidata['api_arg']); + } + + if (!$user) { + // XXX: Twitter returns a random(?) user instead of throwing and err! -- Zach + $this->client_error(_('Not found.'), 404, $apidata['content-type']); + return; + } + + $this->show_extended_profile($user, $apidata); + } + +} diff --git a/_darcs/pristine/actions/twittersettings.php b/_darcs/pristine/actions/twittersettings.php new file mode 100644 index 0000000000..ae3aff8778 --- /dev/null +++ b/_darcs/pristine/actions/twittersettings.php @@ -0,0 +1,378 @@ +. + */ + +if (!defined('LACONICA')) { exit(1); } + +require_once(INSTALLDIR.'/lib/settingsaction.php'); + +define('SUBSCRIPTIONS', 80); + +class TwittersettingsAction extends SettingsAction { + + function get_instructions() { + return _('Add your Twitter account to automatically send your notices to Twitter, ' . + 'and subscribe to Twitter friends already here.'); + } + + function show_form($msg=NULL, $success=false) { + $user = common_current_user(); + $profile = $user->getProfile(); + $fuser = NULL; + $flink = Foreign_link::getByUserID($user->id, 1); // 1 == Twitter + + if ($flink) { + $fuser = $flink->getForeignUser(); + } + + $this->form_header(_('Twitter settings'), $msg, $success); + common_element_start('form', array('method' => 'post', + 'id' => 'twittersettings', + 'action' => + common_local_url('twittersettings'))); + common_hidden('token', common_session_token()); + + common_element('h2', NULL, _('Twitter Account')); + + if ($fuser) { + common_element_start('p'); + + common_element('span', 'twitter_user', $fuser->nickname); + common_element('a', array('href' => $fuser->uri), $fuser->uri); + common_element('span', 'input_instructions', + _('Current verified Twitter account.')); + common_hidden('flink_foreign_id', $flink->foreign_id); + common_element_end('p'); + common_submit('remove', _('Remove')); + } else { + common_input('twitter_username', _('Twitter user name'), + ($this->arg('twitter_username')) ? $this->arg('twitter_username') : $profile->nickname, + _('No spaces, please.')); // hey, it's what Twitter says + + common_password('twitter_password', _('Twitter password')); + } + + common_element('h2', NULL, _('Preferences')); + + common_checkbox('noticesync', _('Automatically send my notices to Twitter.'), + ($flink) ? ($flink->noticesync & FOREIGN_NOTICE_SEND) : true); + + common_checkbox('replysync', _('Send local "@" replies to Twitter.'), + ($flink) ? ($flink->noticesync & FOREIGN_NOTICE_SEND_REPLY) : true); + + common_checkbox('friendsync', _('Subscribe to my Twitter friends here.'), + ($flink) ? ($flink->friendsync & FOREIGN_FRIEND_RECV) : false); + + if ($flink) { + common_submit('save', _('Save')); + } else { + common_submit('add', _('Add')); + } + + $this->show_twitter_subscriptions(); + + common_element_end('form'); + + common_show_footer(); + } + + function subscribed_twitter_users() { + + $current_user = common_current_user(); + + $qry = 'SELECT user.* ' . + 'FROM subscription ' . + 'JOIN user ON subscription.subscribed = user.id ' . + 'JOIN foreign_link ON foreign_link.user_id = user.id ' . + 'WHERE subscriber = %d ' . + 'ORDER BY user.nickname'; + + $user = new User(); + + $user->query(sprintf($qry, $current_user->id)); + + $users = array(); + + while ($user->fetch()) { + + // Don't include the user's own self-subscription + if ($user->id != $current_user->id) { + $users[] = clone($user); + } + } + + return $users; + } + + function show_twitter_subscriptions() { + + $friends = $this->subscribed_twitter_users(); + $friends_count = count($friends); + + if ($friends_count > 0) { + + common_element('h3', NULL, _('Twitter Friends')); + common_element_start('div', array('id' => 'subscriptions')); + common_element_start('ul', array('id' => 'subscriptions_avatars')); + + for ($i = 0; $i < min($friends_count, SUBSCRIPTIONS); $i++) { + + $other = Profile::staticGet($friends[$i]->id); + + if (!$other) { + common_log_db_error($subs, 'SELECT', __FILE__); + continue; + } + + common_element_start('li'); + common_element_start('a', array('title' => ($other->fullname) ? + $other->fullname : + $other->nickname, + 'href' => $other->profileurl, + 'rel' => 'contact', + 'class' => 'subscription')); + $avatar = $other->getAvatar(AVATAR_MINI_SIZE); + common_element('img', array('src' => (($avatar) ? common_avatar_display_url($avatar) : common_default_avatar(AVATAR_MINI_SIZE)), + 'width' => AVATAR_MINI_SIZE, + 'height' => AVATAR_MINI_SIZE, + 'class' => 'avatar mini', + 'alt' => ($other->fullname) ? + $other->fullname : + $other->nickname)); + common_element_end('a'); + common_element_end('li'); + + } + + common_element_end('ul'); + common_element_end('div'); + + } + + // XXX Figure out a way to show all Twitter friends... ? + + /* + if ($subs_count > SUBSCRIPTIONS) { + common_element_start('p', array('id' => 'subscriptions_viewall')); + + common_element('a', array('href' => common_local_url('subscriptions', + array('nickname' => $profile->nickname)), + 'class' => 'moresubscriptions'), + _('All subscriptions')); + common_element_end('p'); + } + */ + + } + + function handle_post() { + + # CSRF protection + $token = $this->trimmed('token'); + if (!$token || $token != common_session_token()) { + $this->show_form(_('There was a problem with your session token. Try again, please.')); + return; + } + + if ($this->arg('save')) { + $this->save_preferences(); + } else if ($this->arg('add')) { + $this->add_twitter_acct(); + } else if ($this->arg('remove')) { + $this->remove_twitter_acct(); + } else { + $this->show_form(_('Unexpected form submission.')); + } + } + + function add_twitter_acct() { + + $screen_name = $this->trimmed('twitter_username'); + $password = $this->trimmed('twitter_password'); + $noticesync = $this->boolean('noticesync'); + $replysync = $this->boolean('replysync'); + $friendsync = $this->boolean('friendsync'); + + if (!Validate::string($screen_name, + array( 'min_length' => 1, + 'max_length' => 15, + 'format' => VALIDATE_NUM . VALIDATE_ALPHA . '_'))) { + $this->show_form( + _('Username must have only numbers, upper- and lowercase letters, and underscore (_). 15 chars max.')); + return; + } + + if (!$this->verify_credentials($screen_name, $password)) { + $this->show_form(_('Could not verify your Twitter credentials!')); + return; + } + + $twit_user = twitter_user_info($screen_name, $password); + + if (!$twit_user) { + $this->show_form(sprintf(_('Unable to retrieve account information for "%s" from Twitter.'), + $screen_name)); + return; + } + + if (!save_twitter_user($twit_user->id, $screen_name)) { + $this->show_form(_('Unable to save your Twitter settings!')); + return; + } + + $user = common_current_user(); + + $flink = DB_DataObject::factory('foreign_link'); + $flink->user_id = $user->id; + $flink->foreign_id = $twit_user->id; + $flink->service = 1; // Twitter + $flink->credentials = $password; + $flink->created = common_sql_now(); + + $this->set_flags($flink, $noticesync, $replysync, $friendsync); + + $flink_id = $flink->insert(); + + if (!$flink_id) { + common_log_db_error($flink, 'INSERT', __FILE__); + $this->show_form(_('Unable to save your Twitter settings!')); + return; + } + + if ($friendsync) { + save_twitter_friends($user, $twit_user->id, $screen_name, $password); + } + + $this->show_form(_('Twitter settings saved.'), true); + } + + function remove_twitter_acct() { + + $user = common_current_user(); + $flink = Foreign_link::getByUserID($user->id, 1); + $flink_foreign_id = $this->arg('flink_foreign_id'); + + # Maybe an old tab open...? + if ($flink->foreign_id != $flink_foreign_id) { + $this->show_form(_('That is not your Twitter account.')); + return; + } + + $result = $flink->delete(); + + if (!$result) { + common_log_db_error($flink, 'DELETE', __FILE__); + common_server_error(_('Couldn\'t remove Twitter user.')); + return; + } + + $this->show_form(_('Twitter account removed.'), TRUE); + } + + function save_preferences() { + + $noticesync = $this->boolean('noticesync'); + $friendsync = $this->boolean('friendsync'); + $replysync = $this->boolean('replysync'); + + $user = common_current_user(); + + $flink = Foreign_link::getByUserID($user->id, 1); + + if (!$flink) { + common_log_db_error($flink, 'SELECT', __FILE__); + $this->show_form(_('Couldn\'t save Twitter preferences.')); + return; + } + + $twitter_id = $flink->foreign_id; + $password = $flink->credentials; + + $fuser = $flink->getForeignUser(); + + if (!$fuser) { + common_log_db_error($fuser, 'SELECT', __FILE__); + $this->show_form(_('Couldn\'t save Twitter preferences.')); + return; + } + + $screen_name = $fuser->nickname; + + $original = clone($flink); + $this->set_flags($flink, $noticesync, $replysync, $friendsync); + $result = $flink->update($original); + + if ($result === FALSE) { + common_log_db_error($flink, 'UPDATE', __FILE__); + $this->show_form(_('Couldn\'t save Twitter preferences.')); + return; + } + + if ($friendsync) { + save_twitter_friends($user, $flink->foreign_id, $screen_name, $password); + } + + $this->show_form(_('Twitter preferences saved.')); + } + + function verify_credentials($screen_name, $password) { + $uri = 'http://twitter.com/account/verify_credentials.json'; + $data = get_twitter_data($uri, $screen_name, $password); + + if (!$data) { + return false; + } + + $user = json_decode($data); + + if (!$user) { + return false; + } + + $twitter_id = $user->status->id; + + if ($twitter_id) { + return $twitter_id; + } + + return false; + } + + function set_flags(&$flink, $noticesync, $replysync, $friendsync) { + if ($noticesync) { + $flink->noticesync |= FOREIGN_NOTICE_SEND; + } else { + $flink->noticesync &= ~FOREIGN_NOTICE_SEND; + } + + if ($replysync) { + $flink->noticesync |= FOREIGN_NOTICE_SEND_REPLY; + } else { + $flink->noticesync &= ~FOREIGN_NOTICE_SEND_REPLY; + } + + if ($friendsync) { + $flink->friendsync |= FOREIGN_FRIEND_RECV; + } else { + $flink->friendsync &= ~FOREIGN_FRIEND_RECV; + } + + $flink->profilesync = 0; + } + +} \ No newline at end of file diff --git a/_darcs/pristine/actions/unblock.php b/_darcs/pristine/actions/unblock.php new file mode 100644 index 0000000000..d60cc70885 --- /dev/null +++ b/_darcs/pristine/actions/unblock.php @@ -0,0 +1,92 @@ +. + */ + +if (!defined('LACONICA')) { exit(1); } + +class UnblockAction extends Action { + + var $profile = NULL; + + function prepare($args) { + + parent::prepare($args); + + if (!common_logged_in()) { + $this->client_error(_('Not logged in.')); + return false; + } + + $token = $this->trimmed('token'); + + if (!$token || $token != common_session_token()) { + $this->client_error(_('There was a problem with your session token. Try again, please.')); + return; + } + + $id = $this->trimmed('unblockto'); + + if (!$id) { + $this->client_error(_('No profile specified.')); + return false; + } + + $this->profile = Profile::staticGet('id', $id); + + if (!$this->profile) { + $this->client_error(_('No profile with that ID.')); + return false; + } + + return true; + } + + function handle($args) { + parent::handle($args); + if ($_SERVER['REQUEST_METHOD'] == 'POST') { + $this->unblock_profile(); + } + } + + function unblock_profile() { + + $cur = common_current_user(); + + $result = $cur->unblock($this->profile); + + if (!$result) { + $this->server_error(_('Error removing the block.')); + return; + } + + foreach ($this->args as $k => $v) { + if ($k == 'returnto-action') { + $action = $v; + } else if (substr($k, 0, 9) == 'returnto-') { + $args[substr($k, 9)] = $v; + } + } + + if ($action) { + common_redirect(common_local_url($action, $args)); + } else { + common_redirect(common_local_url('subscriptions', + array('nickname' => $cur->nickname))); + } + } +} diff --git a/_darcs/pristine/actions/unsubscribe.php b/_darcs/pristine/actions/unsubscribe.php new file mode 100644 index 0000000000..98291e897e --- /dev/null +++ b/_darcs/pristine/actions/unsubscribe.php @@ -0,0 +1,80 @@ +. + */ + +class UnsubscribeAction extends Action { + + function handle($args) { + parent::handle($args); + if (!common_logged_in()) { + common_user_error(_('Not logged in.')); + return; + } + + $user = common_current_user(); + + if ($_SERVER['REQUEST_METHOD'] != 'POST') { + common_redirect(common_local_url('subscriptions', array('nickname' => $user->nickname))); + return; + } + + # CSRF protection + + $token = $this->trimmed('token'); + + if (!$token || $token != common_session_token()) { + $this->client_error(_('There was a problem with your session token. Try again, please.')); + return; + } + + $other_id = $this->arg('unsubscribeto'); + + if (!$other_id) { + $this->client_error(_('No profile id in request.')); + return; + } + + $other = Profile::staticGet('id', $other_id); + + if (!$other_id) { + $this->client_error(_('No profile with that id.')); + return; + } + + $result = subs_unsubscribe_to($user, $other); + + if ($result != true) { + common_user_error($result); + return; + } + + if ($this->boolean('ajax')) { + common_start_html('text/xml;charset=utf-8', true); + common_element_start('head'); + common_element('title', null, _('Unsubscribed')); + common_element_end('head'); + common_element_start('body'); + common_subscribe_form($other); + common_element_end('body'); + common_element_end('html'); + } else { + common_redirect(common_local_url('subscriptions', array('nickname' => + $user->nickname))); + } + } +} diff --git a/_darcs/pristine/actions/updateprofile.php b/_darcs/pristine/actions/updateprofile.php new file mode 100644 index 0000000000..921e88e635 --- /dev/null +++ b/_darcs/pristine/actions/updateprofile.php @@ -0,0 +1,174 @@ +. + */ + +if (!defined('LACONICA')) { exit(1); } + +require_once(INSTALLDIR.'/lib/omb.php'); + +class UpdateprofileAction extends Action { + + function handle($args) { + parent::handle($args); + try { + common_remove_magic_from_request(); + $req = OAuthRequest::from_request(); + # Note: server-to-server function! + $server = omb_oauth_server(); + list($consumer, $token) = $server->verify_request($req); + if ($this->update_profile($req, $consumer, $token)) { + print "omb_version=".OMB_VERSION_01; + } + } catch (OAuthException $e) { + $this->server_error($e->getMessage()); + return; + } + } + + function update_profile($req, $consumer, $token) { + $version = $req->get_parameter('omb_version'); + if ($version != OMB_VERSION_01) { + $this->client_error(_('Unsupported OMB version'), 400); + return false; + } + # First, check to see if listenee exists + $listenee = $req->get_parameter('omb_listenee'); + $remote = Remote_profile::staticGet('uri', $listenee); + if (!$remote) { + $this->client_error(_('Profile unknown'), 404); + return false; + } + # Second, check to see if they should be able to post updates! + # We see if there are any subscriptions to that remote user with + # the given token. + + $sub = new Subscription(); + $sub->subscribed = $remote->id; + $sub->token = $token->key; + if (!$sub->find(true)) { + $this->client_error(_('You did not send us that profile'), 403); + return false; + } + + $profile = Profile::staticGet('id', $remote->id); + if (!$profile) { + # This one is our fault + $this->server_error(_('Remote profile with no matching profile'), 500); + return false; + } + $nickname = $req->get_parameter('omb_listenee_nickname'); + if ($nickname && !Validate::string($nickname, array('min_length' => 1, + 'max_length' => 64, + 'format' => VALIDATE_NUM . VALIDATE_ALPHA_LOWER))) { + $this->client_error(_('Nickname must have only lowercase letters and numbers and no spaces.')); + return false; + } + $license = $req->get_parameter('omb_listenee_license'); + if ($license && !common_valid_http_url($license)) { + $this->client_error(sprintf(_("Invalid license URL '%s'"), $license)); + return false; + } + $profile_url = $req->get_parameter('omb_listenee_profile'); + if ($profile_url && !common_valid_http_url($profile_url)) { + $this->client_error(sprintf(_("Invalid profile URL '%s'."), $profile_url)); + return false; + } + # optional stuff + $fullname = $req->get_parameter('omb_listenee_fullname'); + if ($fullname && strlen($fullname) > 255) { + $this->client_error(_("Full name is too long (max 255 chars).")); + return false; + } + $homepage = $req->get_parameter('omb_listenee_homepage'); + if ($homepage && (!common_valid_http_url($homepage) || strlen($homepage) > 255)) { + $this->client_error(sprintf(_("Invalid homepage '%s'"), $homepage)); + return false; + } + $bio = $req->get_parameter('omb_listenee_bio'); + if ($bio && strlen($bio) > 140) { + $this->client_error(_("Bio is too long (max 140 chars).")); + return false; + } + $location = $req->get_parameter('omb_listenee_location'); + if ($location && strlen($location) > 255) { + $this->client_error(_("Location is too long (max 255 chars).")); + return false; + } + $avatar = $req->get_parameter('omb_listenee_avatar'); + if ($avatar) { + if (!common_valid_http_url($avatar) || strlen($avatar) > 255) { + $this->client_error(sprintf(_("Invalid avatar URL '%s'"), $avatar)); + return false; + } + $size = @getimagesize($avatar); + if (!$size) { + $this->client_error(sprintf(_("Can't read avatar URL '%s'"), $avatar)); + return false; + } + if ($size[0] != AVATAR_PROFILE_SIZE || $size[1] != AVATAR_PROFILE_SIZE) { + $this->client_error(sprintf(_("Wrong size image at '%s'"), $avatar)); + return false; + } + if (!in_array($size[2], array(IMAGETYPE_GIF, IMAGETYPE_JPEG, + IMAGETYPE_PNG))) { + $this->client_error(sprintf(_("Wrong image type for '%s'"), $avatar)); + return false; + } + } + + $orig_profile = clone($profile); + + if ($nickname) { + $profile->nickname = $nickname; + } + if ($profile_url) { + $profile->profileurl = $profile_url; + } + if ($fullname) { + $profile->fullname = $fullname; + } + if ($homepage) { + $profile->homepage = $homepage; + } + if ($bio) { + $profile->bio = $bio; + } + if ($location) { + $profile->location = $location; + } + + if (!$profile->update($orig_profile)) { + $this->server_error(_('Could not save new profile info'), 500); + return false; + } else { + if ($avatar) { + $temp_filename = tempnam(sys_get_temp_dir(), 'listenee_avatar'); + copy($avatar, $temp_filename); + if (!$profile->setOriginal($temp_filename)) { + $this->server_error(_('Could not save avatar info'), 500); + return false; + } + } + header('HTTP/1.1 200 OK'); + header('Content-type: text/plain'); + print 'Updated profile'; + print "\n"; + return true; + } + } +} diff --git a/_darcs/pristine/actions/userauthorization.php b/_darcs/pristine/actions/userauthorization.php new file mode 100644 index 0000000000..ac0a0728cf --- /dev/null +++ b/_darcs/pristine/actions/userauthorization.php @@ -0,0 +1,579 @@ +. + */ + +if (!defined('LACONICA')) { exit(1); } + +require_once(INSTALLDIR.'/lib/omb.php'); +define('TIMESTAMP_THRESHOLD', 300); + +class UserauthorizationAction extends Action { + + function handle($args) { + parent::handle($args); + + if ($_SERVER['REQUEST_METHOD'] == 'POST') { + # CSRF protection + $token = $this->trimmed('token'); + if (!$token || $token != common_session_token()) { + $req = $this->get_stored_request(); + $this->show_form(_('There was a problem with your session token. Try again, please.'), $req); + return; + } + # We've shown the form, now post user's choice + $this->send_authorization(); + } else { + if (!common_logged_in()) { + # Go log in, and then come back + common_debug('saving URL for returnto', __FILE__); + common_set_returnto($_SERVER['REQUEST_URI']); + + common_debug('redirecting to login', __FILE__); + common_redirect(common_local_url('login')); + return; + } + try { + # this must be a new request + common_debug('getting new request', __FILE__); + $req = $this->get_new_request(); + if (!$req) { + $this->client_error(_('No request found!')); + } + common_debug('validating request', __FILE__); + # XXX: only validate new requests, since nonce is one-time use + $this->validate_request($req); + common_debug('showing form', __FILE__); + $this->store_request($req); + $this->show_form($req); + } catch (OAuthException $e) { + $this->clear_request(); + $this->client_error($e->getMessage()); + return; + } + + } + } + + function show_form($req) { + + $nickname = $req->get_parameter('omb_listenee_nickname'); + $profile = $req->get_parameter('omb_listenee_profile'); + $license = $req->get_parameter('omb_listenee_license'); + $fullname = $req->get_parameter('omb_listenee_fullname'); + $homepage = $req->get_parameter('omb_listenee_homepage'); + $bio = $req->get_parameter('omb_listenee_bio'); + $location = $req->get_parameter('omb_listenee_location'); + $avatar = $req->get_parameter('omb_listenee_avatar'); + + common_show_header(_('Authorize subscription')); + common_element('p', NULL, _('Please check these details to make sure '. + 'that you want to subscribe to this user\'s notices. '. + 'If you didn\'t just ask to subscribe to someone\'s notices, '. + 'click "Cancel".')); + common_element_start('div', 'profile'); + if ($avatar) { + common_element('img', array('src' => $avatar, + 'class' => 'avatar profile', + 'width' => AVATAR_PROFILE_SIZE, + 'height' => AVATAR_PROFILE_SIZE, + 'alt' => $nickname)); + } + common_element('a', array('href' => $profile, + 'class' => 'external profile nickname'), + $nickname); + if ($fullname) { + common_element_start('div', 'fullname'); + if ($homepage) { + common_element('a', array('href' => $homepage), + $fullname); + } else { + common_text($fullname); + } + common_element_end('div'); + } + if ($location) { + common_element('div', 'location', $location); + } + if ($bio) { + common_element('div', 'bio', $bio); + } + common_element_start('div', 'license'); + common_element('a', array('href' => $license, + 'class' => 'license'), + $license); + common_element_end('div'); + common_element_end('div'); + common_element_start('form', array('method' => 'post', + 'id' => 'userauthorization', + 'name' => 'userauthorization', + 'action' => common_local_url('userauthorization'))); + common_hidden('token', common_session_token()); + common_submit('accept', _('Accept')); + common_submit('reject', _('Reject')); + common_element_end('form'); + common_show_footer(); + } + + function send_authorization() { + $req = $this->get_stored_request(); + + if (!$req) { + common_user_error(_('No authorization request!')); + return; + } + + $callback = $req->get_parameter('oauth_callback'); + + if ($this->arg('accept')) { + if (!$this->authorize_token($req)) { + $this->client_error(_('Error authorizing token')); + } + if (!$this->save_remote_profile($req)) { + $this->client_error(_('Error saving remote profile')); + } + if (!$callback) { + $this->show_accept_message($req->get_parameter('oauth_token')); + } else { + $params = array(); + $params['oauth_token'] = $req->get_parameter('oauth_token'); + $params['omb_version'] = OMB_VERSION_01; + $user = User::staticGet('uri', $req->get_parameter('omb_listener')); + $profile = $user->getProfile(); + if (!$profile) { + common_log_db_error($user, 'SELECT', __FILE__); + $this->server_error(_('User without matching profile')); + return; + } + $params['omb_listener_nickname'] = $user->nickname; + $params['omb_listener_profile'] = common_local_url('showstream', + array('nickname' => $user->nickname)); + if ($profile->fullname) { + $params['omb_listener_fullname'] = $profile->fullname; + } + if ($profile->homepage) { + $params['omb_listener_homepage'] = $profile->homepage; + } + if ($profile->bio) { + $params['omb_listener_bio'] = $profile->bio; + } + if ($profile->location) { + $params['omb_listener_location'] = $profile->location; + } + $avatar = $profile->getAvatar(AVATAR_PROFILE_SIZE); + if ($avatar) { + $params['omb_listener_avatar'] = $avatar->url; + } + $parts = array(); + foreach ($params as $k => $v) { + $parts[] = $k . '=' . OAuthUtil::urlencodeRFC3986($v); + } + $query_string = implode('&', $parts); + $parsed = parse_url($callback); + $url = $callback . (($parsed['query']) ? '&' : '?') . $query_string; + common_redirect($url, 303); + } + } else { + if (!$callback) { + $this->show_reject_message(); + } else { + # XXX: not 100% sure how to signal failure... just redirect without token? + common_redirect($callback, 303); + } + } + } + + function authorize_token(&$req) { + $consumer_key = $req->get_parameter('oauth_consumer_key'); + $token_field = $req->get_parameter('oauth_token'); + common_debug('consumer key = "'.$consumer_key.'"', __FILE__); + common_debug('token field = "'.$token_field.'"', __FILE__); + $rt = new Token(); + $rt->consumer_key = $consumer_key; + $rt->tok = $token_field; + $rt->type = 0; + $rt->state = 0; + common_debug('request token to look up: "'.print_r($rt,TRUE).'"'); + if ($rt->find(true)) { + common_debug('found request token to authorize', __FILE__); + $orig_rt = clone($rt); + $rt->state = 1; # Authorized but not used + if ($rt->update($orig_rt)) { + common_debug('updated request token so it is authorized', __FILE__); + return true; + } + } + return FALSE; + } + + # XXX: refactor with similar code in finishremotesubscribe.php + + function save_remote_profile(&$req) { + # FIXME: we should really do this when the consumer comes + # back for an access token. If they never do, we've got stuff in a + # weird state. + + $nickname = $req->get_parameter('omb_listenee_nickname'); + $fullname = $req->get_parameter('omb_listenee_fullname'); + $profile_url = $req->get_parameter('omb_listenee_profile'); + $homepage = $req->get_parameter('omb_listenee_homepage'); + $bio = $req->get_parameter('omb_listenee_bio'); + $location = $req->get_parameter('omb_listenee_location'); + $avatar_url = $req->get_parameter('omb_listenee_avatar'); + + $listenee = $req->get_parameter('omb_listenee'); + $remote = Remote_profile::staticGet('uri', $listenee); + + if ($remote) { + $exists = true; + $profile = Profile::staticGet($remote->id); + $orig_remote = clone($remote); + $orig_profile = clone($profile); + } else { + $exists = false; + $remote = new Remote_profile(); + $remote->uri = $listenee; + $profile = new Profile(); + } + + $profile->nickname = $nickname; + $profile->profileurl = $profile_url; + + if ($fullname) { + $profile->fullname = $fullname; + } + if ($homepage) { + $profile->homepage = $homepage; + } + if ($bio) { + $profile->bio = $bio; + } + if ($location) { + $profile->location = $location; + } + + if ($exists) { + $profile->update($orig_profile); + } else { + $profile->created = DB_DataObject_Cast::dateTime(); # current time + $id = $profile->insert(); + if (!$id) { + return FALSE; + } + $remote->id = $id; + } + + if ($exists) { + if (!$remote->update($orig_remote)) { + return FALSE; + } + } else { + $remote->created = DB_DataObject_Cast::dateTime(); # current time + if (!$remote->insert()) { + return FALSE; + } + } + + if ($avatar_url) { + if (!$this->add_avatar($profile, $avatar_url)) { + return FALSE; + } + } + + $user = common_current_user(); + $datastore = omb_oauth_datastore(); + $consumer = $this->get_consumer($datastore, $req); + $token = $this->get_token($datastore, $req, $consumer); + + $sub = new Subscription(); + $sub->subscriber = $user->id; + $sub->subscribed = $remote->id; + $sub->token = $token->key; # NOTE: request token, not valid for use! + $sub->created = DB_DataObject_Cast::dateTime(); # current time + + if (!$sub->insert()) { + return FALSE; + } + + return TRUE; + } + + function add_avatar($profile, $url) { + $temp_filename = tempnam(sys_get_temp_dir(), 'listenee_avatar'); + copy($url, $temp_filename); + return $profile->setOriginal($temp_filename); + } + + function show_accept_message($tok) { + common_show_header(_('Subscription authorized')); + common_element('p', NULL, + _('The subscription has been authorized, but no '. + 'callback URL was passed. Check with the site\'s instructions for '. + 'details on how to authorize the subscription. Your subscription token is:')); + common_element('blockquote', 'token', $tok); + common_show_footer(); + } + + function show_reject_message($tok) { + common_show_header(_('Subscription rejected')); + common_element('p', NULL, + _('The subscription has been rejected, but no '. + 'callback URL was passed. Check with the site\'s instructions for '. + 'details on how to fully reject the subscription.')); + common_show_footer(); + } + + function store_request($req) { + common_ensure_session(); + $_SESSION['userauthorizationrequest'] = $req; + } + + function clear_request() { + common_ensure_session(); + unset($_SESSION['userauthorizationrequest']); + } + + function get_stored_request() { + common_ensure_session(); + $req = $_SESSION['userauthorizationrequest']; + return $req; + } + + function get_new_request() { + common_remove_magic_from_request(); + $req = OAuthRequest::from_request(); + return $req; + } + + # Throws an OAuthException if anything goes wrong + + function validate_request(&$req) { + # OAuth stuff -- have to copy from OAuth.php since they're + # all private methods, and there's no user-authentication method + common_debug('checking version', __FILE__); + $this->check_version($req); + common_debug('getting datastore', __FILE__); + $datastore = omb_oauth_datastore(); + common_debug('getting consumer', __FILE__); + $consumer = $this->get_consumer($datastore, $req); + common_debug('getting token', __FILE__); + $token = $this->get_token($datastore, $req, $consumer); + common_debug('checking timestamp', __FILE__); + $this->check_timestamp($req); + common_debug('checking nonce', __FILE__); + $this->check_nonce($datastore, $req, $consumer, $token); + common_debug('checking signature', __FILE__); + $this->check_signature($req, $consumer, $token); + common_debug('validating omb stuff', __FILE__); + $this->validate_omb($req); + common_debug('done validating', __FILE__); + return true; + } + + function validate_omb(&$req) { + foreach (array('omb_version', 'omb_listener', 'omb_listenee', + 'omb_listenee_profile', 'omb_listenee_nickname', + 'omb_listenee_license') as $param) + { + if (!$req->get_parameter($param)) { + throw new OAuthException("Required parameter '$param' not found"); + } + } + # Now, OMB stuff + $version = $req->get_parameter('omb_version'); + if ($version != OMB_VERSION_01) { + throw new OAuthException("OpenMicroBlogging version '$version' not supported"); + } + $listener = $req->get_parameter('omb_listener'); + $user = User::staticGet('uri', $listener); + if (!$user) { + throw new OAuthException("Listener URI '$listener' not found here"); + } + $cur = common_current_user(); + if ($cur->id != $user->id) { + throw new OAuthException("Can't add for another user!"); + } + $listenee = $req->get_parameter('omb_listenee'); + if (!Validate::uri($listenee) && + !common_valid_tag($listenee)) { + throw new OAuthException("Listenee URI '$listenee' not a recognizable URI"); + } + if (strlen($listenee) > 255) { + throw new OAuthException("Listenee URI '$listenee' too long"); + } + + $other = User::staticGet('uri', $listenee); + if ($other) { + throw new OAuthException("Listenee URI '$listenee' is local user"); + } + + $remote = Remote_profile::staticGet('uri', $listenee); + if ($remote) { + $sub = new Subscription(); + $sub->subscriber = $user->id; + $sub->subscribed = $remote->id; + if ($sub->find(TRUE)) { + throw new OAuthException("Already subscribed to user!"); + } + } + $nickname = $req->get_parameter('omb_listenee_nickname'); + if (!Validate::string($nickname, array('min_length' => 1, + 'max_length' => 64, + 'format' => VALIDATE_NUM . VALIDATE_ALPHA_LOWER))) { + throw new OAuthException('Nickname must have only letters and numbers and no spaces.'); + } + $profile = $req->get_parameter('omb_listenee_profile'); + if (!common_valid_http_url($profile)) { + throw new OAuthException("Invalid profile URL '$profile'."); + } + + if ($profile == common_local_url('showstream', array('nickname' => $nickname))) { + throw new OAuthException("Profile URL '$profile' is for a local user."); + } + + $license = $req->get_parameter('omb_listenee_license'); + if (!common_valid_http_url($license)) { + throw new OAuthException("Invalid license URL '$license'."); + } + $site_license = common_config('license', 'url'); + if (!common_compatible_license($license, $site_license)) { + throw new OAuthException("Listenee stream license '$license' not compatible with site license '$site_license'."); + } + # optional stuff + $fullname = $req->get_parameter('omb_listenee_fullname'); + if ($fullname && strlen($fullname) > 255) { + throw new OAuthException("Full name '$fullname' too long."); + } + $homepage = $req->get_parameter('omb_listenee_homepage'); + if ($homepage && (!common_valid_http_url($homepage) || strlen($homepage) > 255)) { + throw new OAuthException("Invalid homepage '$homepage'"); + } + $bio = $req->get_parameter('omb_listenee_bio'); + if ($bio && strlen($bio) > 140) { + throw new OAuthException("Bio too long '$bio'"); + } + $location = $req->get_parameter('omb_listenee_location'); + if ($location && strlen($location) > 255) { + throw new OAuthException("Location too long '$location'"); + } + $avatar = $req->get_parameter('omb_listenee_avatar'); + if ($avatar) { + if (!common_valid_http_url($avatar) || strlen($avatar) > 255) { + throw new OAuthException("Invalid avatar URL '$avatar'"); + } + $size = @getimagesize($avatar); + if (!$size) { + throw new OAuthException("Can't read avatar URL '$avatar'"); + } + if ($size[0] != AVATAR_PROFILE_SIZE || $size[1] != AVATAR_PROFILE_SIZE) { + throw new OAuthException("Wrong size image at '$avatar'"); + } + if (!in_array($size[2], array(IMAGETYPE_GIF, IMAGETYPE_JPEG, + IMAGETYPE_PNG))) { + throw new OAuthException("Wrong image type for '$avatar'"); + } + } + $callback = $req->get_parameter('oauth_callback'); + if ($callback && !common_valid_http_url($callback)) { + throw new OAuthException("Invalid callback URL '$callback'"); + } + if ($callback && $callback == common_local_url('finishremotesubscribe')) { + throw new OAuthException("Callback URL '$callback' is for local site."); + } + } + + # Snagged from OAuthServer + + function check_version(&$req) { + $version = $req->get_parameter("oauth_version"); + if (!$version) { + $version = 1.0; + } + if ($version != 1.0) { + throw new OAuthException("OAuth version '$version' not supported"); + } + return $version; + } + + # Snagged from OAuthServer + + function get_consumer($datastore, $req) { + $consumer_key = @$req->get_parameter("oauth_consumer_key"); + if (!$consumer_key) { + throw new OAuthException("Invalid consumer key"); + } + + $consumer = $datastore->lookup_consumer($consumer_key); + if (!$consumer) { + throw new OAuthException("Invalid consumer"); + } + return $consumer; + } + + # Mostly cadged from OAuthServer + + function get_token($datastore, &$req, $consumer) {/*{{{*/ + $token_field = @$req->get_parameter('oauth_token'); + $token = $datastore->lookup_token($consumer, 'request', $token_field); + if (!$token) { + throw new OAuthException("Invalid $token_type token: $token_field"); + } + return $token; + } + + function check_timestamp(&$req) { + $timestamp = @$req->get_parameter('oauth_timestamp'); + $now = time(); + if ($now - $timestamp > TIMESTAMP_THRESHOLD) { + throw new OAuthException("Expired timestamp, yours $timestamp, ours $now"); + } + } + + # NOTE: don't call twice on the same request; will fail! + function check_nonce(&$datastore, &$req, $consumer, $token) { + $timestamp = @$req->get_parameter('oauth_timestamp'); + $nonce = @$req->get_parameter('oauth_nonce'); + $found = $datastore->lookup_nonce($consumer, $token, $nonce, $timestamp); + if ($found) { + throw new OAuthException("Nonce already used"); + } + return true; + } + + function check_signature(&$req, $consumer, $token) { + $signature_method = $this->get_signature_method($req); + $signature = $req->get_parameter('oauth_signature'); + $valid_sig = $signature_method->check_signature($req, + $consumer, + $token, + $signature); + if (!$valid_sig) { + throw new OAuthException("Invalid signature"); + } + } + + function get_signature_method(&$req) { + $signature_method = @$req->get_parameter("oauth_signature_method"); + if (!$signature_method) { + $signature_method = "PLAINTEXT"; + } + if ($signature_method != 'HMAC-SHA1') { + throw new OAuthException("Signature method '$signature_method' not supported."); + } + return omb_hmac_sha1(); + } +} diff --git a/_darcs/pristine/actions/userbyid.php b/_darcs/pristine/actions/userbyid.php new file mode 100644 index 0000000000..38bff2edee --- /dev/null +++ b/_darcs/pristine/actions/userbyid.php @@ -0,0 +1,49 @@ +. + */ + +if (!defined('LACONICA')) { exit(1); } + +class UserbyidAction extends Action { + + function is_readonly() { + return true; + } + + function handle($args) { + parent::handle($args); + $id = $this->trimmed('id'); + if (!$id) { + $this->client_error(_('No id.')); + } + $user =& User::staticGet($id); + if (!$user) { + $this->client_error(_('No such user.')); + } + + // support redirecting to FOAF rdf/xml if the agent prefers it + $page_prefs = 'application/rdf+xml,text/html,application/xhtml+xml,application/xml;q=0.3,text/xml;q=0.2'; + $httpaccept = isset($_SERVER['HTTP_ACCEPT']) ? $_SERVER['HTTP_ACCEPT'] : NULL; + $type = common_negotiate_type(common_accept_to_prefs($httpaccept), + common_accept_to_prefs($page_prefs)); + $page = $type == 'application/rdf+xml' ? 'foaf' : 'showstream'; + + $url = common_local_url($page, array('nickname' => $user->nickname)); + common_redirect($url, 303); + } +} diff --git a/_darcs/pristine/actions/userrss.php b/_darcs/pristine/actions/userrss.php new file mode 100644 index 0000000000..e57f861054 --- /dev/null +++ b/_darcs/pristine/actions/userrss.php @@ -0,0 +1,90 @@ +. + */ + +if (!defined('LACONICA')) { exit(1); } + +require_once(INSTALLDIR.'/lib/rssaction.php'); + +// Formatting of RSS handled by Rss10Action + +class UserrssAction extends Rss10Action { + + var $user = NULL; + + function init() { + $nickname = $this->trimmed('nickname'); + $this->user = User::staticGet('nickname', $nickname); + + if (!$this->user) { + common_user_error(_('No such user.')); + return false; + } else { + return true; + } + } + + function get_notices($limit=0) { + + $user = $this->user; + + if (is_null($user)) { + return NULL; + } + + $notice = $user->getNotices(0, ($limit == 0) ? NOTICES_PER_PAGE : $limit); + + while ($notice->fetch()) { + $notices[] = clone($notice); + } + + return $notices; + } + + function get_channel() { + $user = $this->user; + $profile = $user->getProfile(); + $c = array('url' => common_local_url('userrss', + array('nickname' => + $user->nickname)), + 'title' => $user->nickname, + 'link' => $profile->profileurl, + 'description' => sprintf(_('Microblog by %s'), $user->nickname)); + return $c; + } + + function get_image() { + $user = $this->user; + $profile = $user->getProfile(); + if (!$profile) { + common_log_db_error($user, 'SELECT', __FILE__); + $this->server_error(_('User without matching profile')); + return NULL; + } + $avatar = $profile->getAvatar(AVATAR_PROFILE_SIZE); + return ($avatar) ? $avatar->url : NULL; + } + + # override parent to add X-SUP-ID URL + + function init_rss($limit=0) { + $url = common_local_url('sup', NULL, $this->user->id); + header('X-SUP-ID: '.$url); + parent::init_rss($limit); + } +} \ No newline at end of file diff --git a/_darcs/pristine/actions/xrds.php b/_darcs/pristine/actions/xrds.php new file mode 100644 index 0000000000..1d516aab72 --- /dev/null +++ b/_darcs/pristine/actions/xrds.php @@ -0,0 +1,132 @@ +. + */ + +if (!defined('LACONICA')) { exit(1); } + +require_once(INSTALLDIR.'/lib/omb.php'); + +class XrdsAction extends Action { + + function is_readonly() { + return true; + } + + function handle($args) { + parent::handle($args); + $nickname = $this->trimmed('nickname'); + $user = User::staticGet('nickname', $nickname); + if (!$user) { + common_user_error(_('No such user.')); + return; + } + $this->show_xrds($user); + } + + function show_xrds($user) { + + header('Content-Type: application/xrds+xml'); + + common_start_xml(); + common_element_start('XRDS', array('xmlns' => 'xri://$xrds')); + + common_element_start('XRD', array('xmlns' => 'xri://$xrd*($v*2.0)', + 'xml:id' => 'oauth', + 'xmlns:simple' => 'http://xrds-simple.net/core/1.0', + 'version' => '2.0')); + + common_element('Type', NULL, 'xri://$xrds*simple'); + + $this->show_service(OAUTH_ENDPOINT_REQUEST, + common_local_url('requesttoken'), + array(OAUTH_AUTH_HEADER, OAUTH_POST_BODY), + array(OAUTH_HMAC_SHA1), + $user->uri); + + $this->show_service(OAUTH_ENDPOINT_AUTHORIZE, + common_local_url('userauthorization'), + array(OAUTH_AUTH_HEADER, OAUTH_POST_BODY), + array(OAUTH_HMAC_SHA1)); + + $this->show_service(OAUTH_ENDPOINT_ACCESS, + common_local_url('accesstoken'), + array(OAUTH_AUTH_HEADER, OAUTH_POST_BODY), + array(OAUTH_HMAC_SHA1)); + + $this->show_service(OAUTH_ENDPOINT_RESOURCE, + NULL, + array(OAUTH_AUTH_HEADER, OAUTH_POST_BODY), + array(OAUTH_HMAC_SHA1)); + + common_element_end('XRD'); + + # XXX: decide whether to include user's ID/nickname in postNotice URL + + common_element_start('XRD', array('xmlns' => 'xri://$xrd*($v*2.0)', + 'xml:id' => 'omb', + 'xmlns:simple' => 'http://xrds-simple.net/core/1.0', + 'version' => '2.0')); + + common_element('Type', NULL, 'xri://$xrds*simple'); + + $this->show_service(OMB_ENDPOINT_POSTNOTICE, + common_local_url('postnotice')); + + $this->show_service(OMB_ENDPOINT_UPDATEPROFILE, + common_local_url('updateprofile')); + + common_element_end('XRD'); + + common_element_start('XRD', array('xmlns' => 'xri://$xrd*($v*2.0)', + 'version' => '2.0')); + + common_element('Type', NULL, 'xri://$xrds*simple'); + + $this->show_service(OAUTH_DISCOVERY, + '#oauth'); + $this->show_service(OMB_NAMESPACE, + '#omb'); + + common_element_end('XRD'); + + common_element_end('XRDS'); + common_end_xml(); + } + + function show_service($type, $uri, $params=NULL, $sigs=NULL, $localId=NULL) { + common_element_start('Service'); + if ($uri) { + common_element('URI', NULL, $uri); + } + common_element('Type', NULL, $type); + if ($params) { + foreach ($params as $param) { + common_element('Type', NULL, $param); + } + } + if ($sigs) { + foreach ($sigs as $sig) { + common_element('Type', NULL, $sig); + } + } + if ($localId) { + common_element('LocalID', NULL, $localId); + } + common_element_end('Service'); + } +} \ No newline at end of file diff --git a/_darcs/pristine/classes/Avatar.php b/_darcs/pristine/classes/Avatar.php new file mode 100644 index 0000000000..901c47c51e --- /dev/null +++ b/_darcs/pristine/classes/Avatar.php @@ -0,0 +1,95 @@ +filename; + if (parent::delete()) { + @unlink(common_avatar_path($filename)); + } + } + + # Create and save scaled version of this avatar + # XXX: maybe break into different methods + + function scale($size) { + + $image_s = imagecreatetruecolor($size, $size); + $image_a = $this->to_image(); + $square = min($this->width, $this->height); + imagecolortransparent($image_s, imagecolorallocate($image_s, 0, 0, 0)); + imagealphablending($image_s, false); + imagesavealpha($image_s, true); + imagecopyresampled($image_s, $image_a, 0, 0, 0, 0, + $size, $size, $square, $square); + + $ext = ($this->mediattype == 'image/jpeg') ? ".jpeg" : ".png"; + + $filename = common_avatar_filename($this->profile_id, $ext, $size, common_timestamp()); + + if ($this->mediatype == 'image/jpeg') { + imagejpeg($image_s, common_avatar_path($filename)); + } else { + imagepng($image_s, common_avatar_path($filename)); + } + + $scaled = DB_DataObject::factory('avatar'); + $scaled->profile_id = $this->profile_id; + $scaled->width = $size; + $scaled->height = $size; + $scaled->original = false; + $scaled->mediatype = ($this->mediattype == 'image/jpeg') ? 'image/jpeg' : 'image/png'; + $scaled->filename = $filename; + $scaled->url = common_avatar_url($filename); + $scaled->created = DB_DataObject_Cast::dateTime(); # current time + + if ($scaled->insert()) { + return $scaled; + } else { + return NULL; + } + } + + function to_image() { + $filepath = common_avatar_path($this->filename); + if ($this->mediatype == 'image/gif') { + return imagecreatefromgif($filepath); + } else if ($this->mediatype == 'image/jpeg') { + return imagecreatefromjpeg($filepath); + } else if ($this->mediatype == 'image/png') { + return imagecreatefrompng($filepath); + } else { + return NULL; + } + } + + function &pkeyGet($kv) { + return Memcached_DataObject::pkeyGet('Avatar', $kv); + } +} diff --git a/_darcs/pristine/classes/Channel.php b/_darcs/pristine/classes/Channel.php new file mode 100644 index 0000000000..bcc0c36b56 --- /dev/null +++ b/_darcs/pristine/classes/Channel.php @@ -0,0 +1,200 @@ +. + */ + +if (!defined('LACONICA')) { exit(1); } + +class Channel { + + function on($user) { + return false; + } + + function off($user) { + return false; + } + + function output($user, $text) { + return false; + } + + function error($user, $text) { + return false; + } + + function source() { + return NULL; + } +} + +class XMPPChannel extends Channel { + + var $conn = NULL; + + function source() { + return 'xmpp'; + } + + function __construct($conn) { + $this->conn = $conn; + } + + function on($user) { + return $this->set_notify($user, 1); + } + + function off($user) { + return $this->set_notify($user, 0); + } + + function output($user, $text) { + $text = '['.common_config('site', 'name') . '] ' . $text; + jabber_send_message($user->jabber, $text); + } + + function error($user, $text) { + $text = '['.common_config('site', 'name') . '] ' . $text; + jabber_send_message($user->jabber, $text); + } + + function set_notify(&$user, $notify) { + $orig = clone($user); + $user->jabbernotify = $notify; + $result = $user->update($orig); + if (!$result) { + $last_error = &PEAR::getStaticProperty('DB_DataObject','lastError'); + common_log(LOG_ERR, + 'Could not set notify flag to ' . $notify . + ' for user ' . common_log_objstring($user) . + ': ' . $last_error->message); + return false; + } else { + common_log(LOG_INFO, + 'User ' . $user->nickname . ' set notify flag to ' . $notify); + return true; + } + } +} + + +class WebChannel extends Channel { + + function source() { + return 'web'; + } + + function on($user) { + return false; + } + + function off($user) { + return false; + } + + function output($user, $text) { + # XXX: buffer all output and send it at the end + # XXX: even better, redirect to appropriate page + # depending on what command was run + common_show_header(_('Command results')); + common_element('p', NULL, $text); + common_show_footer(); + } + + function error($user, $text) { + common_user_error($text); + } +} + + +class AjaxWebChannel extends WebChannel { + + function output($user, $text) { + common_start_html('text/xml;charset=utf-8', true); + common_element_start('head'); + common_element('title', null, _('Command results')); + common_element_end('head'); + common_element_start('body'); + common_element('p', array('id' => 'command_result'), $text); + common_element_end('body'); + common_element_end('html'); + } + + function error($user, $text) { + common_start_html('text/xml;charset=utf-8', true); + common_element_start('head'); + common_element('title', null, _('Ajax Error')); + common_element_end('head'); + common_element_start('body'); + common_element('p', array('id' => 'error'), $text); + common_element_end('body'); + common_element_end('html'); + } +} + + +class MailChannel extends Channel { + + var $addr = NULL; + + function source() { + return 'mail'; + } + + function __construct($addr=NULL) { + $this->addr = $addr; + } + + function on($user) { + return $this->set_notify($user, 1); + } + + function off($user) { + return $this->set_notify($user, 0); + } + + function output($user, $text) { + + $headers['From'] = $user->incomingemail; + $headers['To'] = $this->addr; + + $headers['Subject'] = _('Command complete'); + + return mail_send(array($this->addr), $headers, $text); + } + + function error($user, $text) { + + $headers['From'] = $user->incomingemail; + $headers['To'] = $this->addr; + + $headers['Subject'] = _('Command failed'); + + return mail_send(array($this->addr), $headers, $text); + } + + function set_notify($user, $value) { + $orig = clone($user); + $user->smsnotify = $value; + $result = $user->update($orig); + if (!$result) { + common_log_db_error($user, 'UPDATE', __FILE__); + return false; + } + return true; + } +} diff --git a/_darcs/pristine/classes/Command.php b/_darcs/pristine/classes/Command.php new file mode 100644 index 0000000000..c2409d140a --- /dev/null +++ b/_darcs/pristine/classes/Command.php @@ -0,0 +1,376 @@ +. + */ + +if (!defined('LACONICA')) { exit(1); } + +require_once(INSTALLDIR.'/classes/Channel.php'); + +class Command { + + var $user = NULL; + + function __construct($user=NULL) { + $this->user = $user; + } + + function execute($channel) { + return false; + } +} + +class UnimplementedCommand extends Command { + function execute($channel) { + $channel->error($this->user, _("Sorry, this command is not yet implemented.")); + } +} + +class TrackingCommand extends UnimplementedCommand { +} + +class TrackOffCommand extends UnimplementedCommand { +} + +class TrackCommand extends UnimplementedCommand { + var $word = NULL; + function __construct($user, $word) { + parent::__construct($user); + $this->word = $word; + } +} + +class UntrackCommand extends UnimplementedCommand { + var $word = NULL; + function __construct($user, $word) { + parent::__construct($user); + $this->word = $word; + } +} + +class NudgeCommand extends UnimplementedCommand { + var $other = NULL; + function __construct($user, $other) { + parent::__construct($user); + $this->other = $other; + } +} + +class InviteCommand extends UnimplementedCommand { + var $other = NULL; + function __construct($user, $other) { + parent::__construct($user); + $this->other = $other; + } +} + +class StatsCommand extends Command { + function execute($channel) { + + $subs = new Subscription(); + $subs->subscriber = $this->user->id; + $subs_count = (int) $subs->count() - 1; + + $subbed = new Subscription(); + $subbed->subscribed = $this->user->id; + $subbed_count = (int) $subbed->count() - 1; + + $notices = new Notice(); + $notices->profile_id = $this->user->id; + $notice_count = (int) $notices->count(); + + $channel->output($this->user, sprintf(_("Subscriptions: %1\$s\n". + "Subscribers: %2\$s\n". + "Notices: %3\$s"), + $subs_count, + $subbed_count, + $notice_count)); + } +} + +class FavCommand extends Command { + + var $other = NULL; + + function __construct($user, $other) { + parent::__construct($user); + $this->other = $other; + } + + function execute($channel) { + + $recipient = + common_relative_profile($this->user, common_canonical_nickname($this->other)); + + if (!$recipient) { + $channel->error($this->user, _('No such user.')); + return; + } + $notice = $recipient->getCurrentNotice(); + if (!$notice) { + $channel->error($this->user, _('User has no last notice')); + return; + } + + $fave = Fave::addNew($this->user, $notice); + + if (!$fave) { + $channel->error($this->user, _('Could not create favorite.')); + return; + } + + $other = User::staticGet('id', $recipient->id); + + if ($other && $other->id != $user->id) { + if ($other->email && $other->emailnotifyfav) { + mail_notify_fave($other, $this->user, $notice); + } + } + + $this->user->blowFavesCache(); + + $channel->output($this->user, _('Notice marked as fave.')); + } +} + +class WhoisCommand extends Command { + var $other = NULL; + function __construct($user, $other) { + parent::__construct($user); + $this->other = $other; + } + + function execute($channel) { + $recipient = + common_relative_profile($this->user, common_canonical_nickname($this->other)); + + if (!$recipient) { + $channel->error($this->user, _('No such user.')); + return; + } + + $whois = sprintf(_("%1\$s (%2\$s)"), $recipient->nickname, + $recipient->profileurl); + if ($recipient->fullname) { + $whois .= "\n" . sprintf(_('Fullname: %s'), $recipient->fullname); + } + if ($recipient->location) { + $whois .= "\n" . sprintf(_('Location: %s'), $recipient->location); + } + if ($recipient->homepage) { + $whois .= "\n" . sprintf(_('Homepage: %s'), $recipient->homepage); + } + if ($recipient->bio) { + $whois .= "\n" . sprintf(_('About: %s'), $recipient->bio); + } + $channel->output($this->user, $whois); + } +} + +class MessageCommand extends Command { + var $other = NULL; + var $text = NULL; + function __construct($user, $other, $text) { + parent::__construct($user); + $this->other = $other; + $this->text = $text; + } + + function execute($channel) { + $other = User::staticGet('nickname', common_canonical_nickname($this->other)); + $len = mb_strlen($this->text); + if ($len == 0) { + $channel->error($this->user, _('No content!')); + return; + } else if ($len > 140) { + $content = common_shorten_links($content); + if (mb_strlen($content) > 140) { + $channel->error($this->user, sprintf(_('Message too long - maximum is 140 characters, you sent %d'), $len)); + return; + } + } + + if (!$other) { + $channel->error($this->user, _('No such user.')); + return; + } else if (!$this->user->mutuallySubscribed($other)) { + $channel->error($this->user, _('You can\'t send a message to this user.')); + return; + } else if ($this->user->id == $other->id) { + $channel->error($this->user, _('Don\'t send a message to yourself; just say it to yourself quietly instead.')); + return; + } + $message = Message::saveNew($this->user->id, $other->id, $this->text, $channel->source()); + if ($message) { + $channel->output($this->user, sprintf(_('Direct message to %s sent'), $this->other)); + } else { + $channel->error($this->user, _('Error sending direct message.')); + } + } +} + +class GetCommand extends Command { + + var $other = NULL; + + function __construct($user, $other) { + parent::__construct($user); + $this->other = $other; + } + + function execute($channel) { + $target_nickname = common_canonical_nickname($this->other); + + $target = + common_relative_profile($this->user, $target_nickname); + + if (!$target) { + $channel->error($this->user, _('No such user.')); + return; + } + $notice = $target->getCurrentNotice(); + if (!$notice) { + $channel->error($this->user, _('User has no last notice')); + return; + } + $notice_content = $notice->content; + + $channel->output($this->user, $target_nickname . ": " . $notice_content); + } +} + +class SubCommand extends Command { + + var $other = NULL; + + function __construct($user, $other) { + parent::__construct($user); + $this->other = $other; + } + + function execute($channel) { + + if (!$this->other) { + $channel->error($this->user, _('Specify the name of the user to subscribe to')); + return; + } + + $result = subs_subscribe_user($this->user, $this->other); + + if ($result == 'true') { + $channel->output($this->user, sprintf(_('Subscribed to %s'), $this->other)); + } else { + $channel->error($this->user, $result); + } + } +} + +class UnsubCommand extends Command { + + var $other = NULL; + + function __construct($user, $other) { + parent::__construct($user); + $this->other = $other; + } + + function execute($channel) { + if(!$this->other) { + $channel->error($this->user, _('Specify the name of the user to unsubscribe from')); + return; + } + + $result=subs_unsubscribe_user($this->user, $this->other); + + if ($result) { + $channel->output($this->user, sprintf(_('Unsubscribed from %s'), $this->other)); + } else { + $channel->error($this->user, $result); + } + } +} + +class OffCommand extends Command { + var $other = NULL; + function __construct($user, $other=NULL) { + parent::__construct($user); + $this->other = $other; + } + function execute($channel) { + if ($other) { + $channel->error($this->user, _("Command not yet implemented.")); + } else { + if ($channel->off($this->user)) { + $channel->output($this->user, _('Notification off.')); + } else { + $channel->error($this->user, _('Can\'t turn off notification.')); + } + } + } +} + +class OnCommand extends Command { + var $other = NULL; + function __construct($user, $other=NULL) { + parent::__construct($user); + $this->other = $other; + } + + function execute($channel) { + if ($other) { + $channel->error($this->user, _("Command not yet implemented.")); + } else { + if ($channel->on($this->user)) { + $channel->output($this->user, _('Notification on.')); + } else { + $channel->error($this->user, _('Can\'t turn on notification.')); + } + } + } +} + +class HelpCommand extends Command { + function execute($channel) { + $channel->output($this->user, + _("Commands:\n". + "on - turn on notifications\n". + "off - turn off notifications\n". + "help - show this help\n". + "follow - subscribe to user\n". + "leave - unsubscribe from user\n". + "d - direct message to user\n". + "get - get last notice from user\n". + "whois - get profile info on user\n". + "fav - add user's last notice as a 'fave'\n". + "stats - get your stats\n". + "stop - same as 'off'\n". + "quit - same as 'off'\n". + "sub - same as 'follow'\n". + "unsub - same as 'leave'\n". + "last - same as 'get'\n". + "on - not yet implemented.\n". + "off - not yet implemented.\n". + "nudge - not yet implemented.\n". + "invite - not yet implemented.\n". + "track - not yet implemented.\n". + "untrack - not yet implemented.\n". + "track off - not yet implemented.\n". + "untrack all - not yet implemented.\n". + "tracks - not yet implemented.\n". + "tracking - not yet implemented.\n")); + } +} diff --git a/_darcs/pristine/classes/CommandInterpreter.php b/_darcs/pristine/classes/CommandInterpreter.php new file mode 100644 index 0000000000..4e27f8f796 --- /dev/null +++ b/_darcs/pristine/classes/CommandInterpreter.php @@ -0,0 +1,195 @@ +. + */ + +if (!defined('LACONICA')) { exit(1); } + +require_once(INSTALLDIR.'/classes/Command.php'); + +class CommandInterpreter { + + function handle_command($user, $text) { + # XXX: localise + + $text = preg_replace('/\s+/', ' ', trim($text)); + list($cmd, $arg) = explode(' ', $text, 2); + + # We try to support all the same commands as Twitter, see + # http://getsatisfaction.com/twitter/topics/what_are_the_twitter_commands + # There are a few compatibility commands from earlier versions of + # Laconica + + switch(strtolower($cmd)) { + case 'help': + if ($arg) { + return NULL; + } + return new HelpCommand($user); + case 'on': + if ($arg) { + list($other, $extra) = explode(' ', $arg, 2); + if ($extra) { + return NULL; + } else { + return new OnCommand($user, $other); + } + } else { + return new OnCommand($user); + } + case 'off': + if ($arg) { + list($other, $extra) = explode(' ', $arg, 2); + if ($extra) { + return NULL; + } else { + return new OffCommand($user, $other); + } + } else { + return new OffCommand($user); + } + case 'stop': + case 'quit': + if ($arg) { + return NULL; + } else { + return new OffCommand($user); + } + case 'follow': + case 'sub': + if (!$arg) { + return NULL; + } + list($other, $extra) = explode(' ', $arg, 2); + if ($extra) { + return NULL; + } else { + return new SubCommand($user, $other); + } + case 'leave': + case 'unsub': + if (!$arg) { + return NULL; + } + list($other, $extra) = explode(' ', $arg, 2); + if ($extra) { + return NULL; + } else { + return new UnsubCommand($user, $other); + } + case 'get': + case 'last': + if (!$arg) { + return NULL; + } + list($other, $extra) = explode(' ', $arg, 2); + if ($extra) { + return NULL; + } else { + return new GetCommand($user, $other); + } + case 'd': + if (!$arg) { + return NULL; + } + list($other, $extra) = explode(' ', $arg, 2); + if (!$extra) { + return NULL; + } else { + return new MessageCommand($user, $other, $extra); + } + case 'whois': + if (!$arg) { + return NULL; + } + list($other, $extra) = explode(' ', $arg, 2); + if ($extra) { + return NULL; + } else { + return new WhoisCommand($user, $other); + } + case 'fav': + if (!$arg) { + return NULL; + } + list($other, $extra) = explode(' ', $arg, 2); + if ($extra) { + return NULL; + } else { + return new FavCommand($user, $other); + } + case 'nudge': + if (!$arg) { + return NULL; + } + list($other, $extra) = explode(' ', $arg, 2); + if ($extra) { + return NULL; + } else { + return new NudgeCommand($user, $other); + } + case 'stats': + if ($arg) { + return NULL; + } + return new StatsCommand($user); + case 'invite': + if (!$arg) { + return NULL; + } + list($other, $extra) = explode(' ', $arg, 2); + if ($extra) { + return NULL; + } else { + return new InviteCommand($user, $other); + } + case 'track': + if (!$arg) { + return NULL; + } + list($word, $extra) = explode(' ', $arg, 2); + if ($extra) { + return NULL; + } else if ($word == 'off') { + return new TrackOffCommand($user); + } else { + return new TrackCommand($user, $word); + } + case 'untrack': + if (!$arg) { + return NULL; + } + list($word, $extra) = explode(' ', $arg, 2); + if ($extra) { + return NULL; + } else if ($word == 'all') { + return new TrackOffCommand($user); + } else { + return new UntrackCommand($user, $word); + } + case 'tracks': + case 'tracking': + if ($arg) { + return NULL; + } + return new TrackingCommand($user); + default: + return false; + } + } +} + diff --git a/_darcs/pristine/classes/Confirm_address.php b/_darcs/pristine/classes/Confirm_address.php new file mode 100644 index 0000000000..10661ff5ce --- /dev/null +++ b/_darcs/pristine/classes/Confirm_address.php @@ -0,0 +1,29 @@ +user_id = $user->id; + $fave->notice_id = $notice->id; + if (!$fave->insert()) { + common_log_db_error($fave, 'INSERT', __FILE__); + return false; + } + return $fave; + } + + function &pkeyGet($kv) { + return Memcached_DataObject::pkeyGet('Fave', $kv); + } +} diff --git a/_darcs/pristine/classes/Foreign_link.php b/_darcs/pristine/classes/Foreign_link.php new file mode 100644 index 0000000000..7a625a2092 --- /dev/null +++ b/_darcs/pristine/classes/Foreign_link.php @@ -0,0 +1,76 @@ +1 single obj mapping. Change? Or make + // a getForeignUsers() that returns more than one? --Zach + static function getByUserID($user_id, $service) { + $flink = new Foreign_link(); + $flink->service = $service; + $flink->user_id = $user_id; + $flink->limit(1); + + if ($flink->find(TRUE)) { + return $flink; + } + + return NULL; + } + + static function getByForeignID($foreign_id, $service) { + $flink = new Foreign_link(); + $flink->service = $service; + $flink->foreign_id = $foreign_id; + $flink->limit(1); + + if ($flink->find(TRUE)) { + return $flink; + } + + return NULL; + } + + # Convenience methods + function getForeignUser() { + $fuser = new Foreign_user(); + $fuser->service = $this->service; + $fuser->id = $this->foreign_id; + + $fuser->limit(1); + + if ($fuser->find(TRUE)) { + return $fuser; + } + + return NULL; + } + + function getUser() { + return User::staticGet($this->user_id); + } + +} diff --git a/_darcs/pristine/classes/Foreign_service.php b/_darcs/pristine/classes/Foreign_service.php new file mode 100644 index 0000000000..18ef83d699 --- /dev/null +++ b/_darcs/pristine/classes/Foreign_service.php @@ -0,0 +1,24 @@ +1 single obj mapping. Change? Or make + // a getForeignUsers() that returns more than one? --Zach + static function getForeignUser($id, $service) { + $fuser = new Foreign_user(); + $fuser->whereAdd("service = $service"); + $fuser->whereAdd("id = $id"); + $fuser->limit(1); + + if ($fuser->find()) { + $fuser->fetch(); + return $fuser; + } + + return NULL; + } + + function updateKeys(&$orig) { + $parts = array(); + foreach (array('id', 'service', 'uri', 'nickname') as $k) { + if (strcmp($this->$k, $orig->$k) != 0) { + $parts[] = $k . ' = ' . $this->_quote($this->$k); + } + } + if (count($parts) == 0) { + # No changes + return true; + } + $toupdate = implode(', ', $parts); + + $table = $this->tableName(); + if(common_config('db','quote_identifiers')) { + $table = '"' . $table . '"'; + } + $qry = 'UPDATE ' . $table . ' SET ' . $toupdate . + ' WHERE id = ' . $this->id; + $orig->decache(); + $result = $this->query($qry); + if ($result) { + $this->encache(); + } + return $result; + } + + +} diff --git a/_darcs/pristine/classes/Invitation.php b/_darcs/pristine/classes/Invitation.php new file mode 100644 index 0000000000..1477391b0e --- /dev/null +++ b/_darcs/pristine/classes/Invitation.php @@ -0,0 +1,24 @@ +. + */ + +if (!defined('LACONICA')) { exit(1); } + +require_once INSTALLDIR.'/classes/Memcached_DataObject.php'; + +class Memcached_DataObject extends DB_DataObject +{ + function &staticGet($cls, $k, $v=NULL) { + if (is_null($v)) { + $v = $k; + # XXX: HACK! + $i = new $cls; + $keys = $i->keys(); + $k = $keys[0]; + unset($i); + } + $i = Memcached_DataObject::getcached($cls, $k, $v); + if ($i) { + return $i; + } else { + $i = DB_DataObject::staticGet($cls, $k, $v); + if ($i) { + $i->encache(); + } + return $i; + } + } + + function &pkeyGet($cls, $kv) { + $i = Memcached_DataObject::multicache($cls, $kv); + if ($i) { + return $i; + } else { + $i = new $cls(); + foreach ($kv as $k => $v) { + $i->$k = $v; + } + if ($i->find(true)) { + $i->encache(); + } else { + $i = NULL; + } + return $i; + } + } + + function insert() { + $result = parent::insert(); + return $result; + } + + function update($orig=NULL) { + if (is_object($orig) && $orig instanceof Memcached_DataObject) { + $orig->decache(); # might be different keys + } + $result = parent::update($orig); + if ($result) { + $this->encache(); + } + return $result; + } + + function delete() { + $this->decache(); # while we still have the values! + return parent::delete(); + } + + static function memcache() { + return common_memcache(); + } + + static function cacheKey($cls, $k, $v) { + return common_cache_key(strtolower($cls).':'.$k.':'.$v); + } + + static function getcached($cls, $k, $v) { + $c = Memcached_DataObject::memcache(); + if (!$c) { + return false; + } else { + return $c->get(Memcached_DataObject::cacheKey($cls, $k, $v)); + } + } + + function keyTypes() { + global $_DB_DATAOBJECT; + if (!isset($_DB_DATAOBJECT['INI'][$this->_database][$this->__table."__keys"])) { + $this->databaseStructure(); + + } + return $_DB_DATAOBJECT['INI'][$this->_database][$this->__table."__keys"]; + } + + function encache() { + $c = $this->memcache(); + if (!$c) { + return false; + } else { + $pkey = array(); + $pval = array(); + $types = $this->keyTypes(); + ksort($types); + foreach ($types as $key => $type) { + if ($type == 'K') { + $pkey[] = $key; + $pval[] = $this->$key; + } else { + $c->set($this->cacheKey($this->tableName(), $key, $this->$key), $this); + } + } + # XXX: should work for both compound and scalar pkeys + $pvals = implode(',', $pval); + $pkeys = implode(',', $pkey); + $c->set($this->cacheKey($this->tableName(), $pkeys, $pvals), $this); + } + } + + function decache() { + $c = $this->memcache(); + if (!$c) { + return false; + } else { + $pkey = array(); + $pval = array(); + $types = $this->keyTypes(); + ksort($types); + foreach ($types as $key => $type) { + if ($type == 'K') { + $pkey[] = $key; + $pval[] = $this->$key; + } else { + $c->delete($this->cacheKey($this->tableName(), $key, $this->$key)); + } + } + # should work for both compound and scalar pkeys + # XXX: comma works for now but may not be safe separator for future keys + $pvals = implode(',', $pval); + $pkeys = implode(',', $pkey); + $c->delete($this->cacheKey($this->tableName(), $pkeys, $pvals)); + } + } + + function multicache($cls, $kv) { + ksort($kv); + $c = Memcached_DataObject::memcache(); + if (!$c) { + return false; + } else { + $pkeys = implode(',', array_keys($kv)); + $pvals = implode(',', array_values($kv)); + return $c->get(Memcached_DataObject::cacheKey($cls, $pkeys, $pvals)); + } + } + + function getSearchEngine($table) { + require_once INSTALLDIR.'/lib/search_engines.php'; + static $search_engine; + if (!isset($search_engine)) { + $connected = false; + if (common_config('sphinx', 'enabled')) { + $search_engine = new SphinxSearch($this, $table); + $connected = $search_engine->is_connected(); + } + + // unable to connect to sphinx' search daemon + if (!$connected) { + if ('mysql' === common_config('db', 'type')) { + $search_engine = new MySQLSearch($this, $table); + } else { + $search_engine = new PGSearch($this, $table); + } + } + } + return $search_engine; + } +} diff --git a/_darcs/pristine/classes/Message.php b/_darcs/pristine/classes/Message.php new file mode 100644 index 0000000000..ef4bd03161 --- /dev/null +++ b/_darcs/pristine/classes/Message.php @@ -0,0 +1,68 @@ +from_profile); + } + + function getTo() { + return Profile::staticGet('id', $this->to_profile); + } + + static function saveNew($from, $to, $content, $source) { + + $msg = new Message(); + + $msg->from_profile = $from; + $msg->to_profile = $to; + $msg->content = common_shorten_links($content); + $msg->rendered = common_render_text($content); + $msg->created = common_sql_now(); + $msg->source = $source; + + $result = $msg->insert(); + + if (!$result) { + common_log_db_error($msg, 'INSERT', __FILE__); + return _('Could not insert message.'); + } + + $orig = clone($msg); + $msg->uri = common_local_url('showmessage', array('message' => $msg->id)); + + $result = $msg->update($orig); + + if (!$result) { + common_log_db_error($msg, 'UPDATE', __FILE__); + return _('Could not update message with new URI.'); + } + + return $msg; + } +} diff --git a/_darcs/pristine/classes/Nonce.php b/_darcs/pristine/classes/Nonce.php new file mode 100644 index 0000000000..89d673c532 --- /dev/null +++ b/_darcs/pristine/classes/Nonce.php @@ -0,0 +1,25 @@ +. + */ + +if (!defined('LACONICA')) { exit(1); } + +/** + * Table Definition for notice + */ +require_once INSTALLDIR.'/classes/Memcached_DataObject.php'; + +/* We keep the first three 20-notice pages, plus one for pagination check, + * in the memcached cache. */ + +define('NOTICE_CACHE_WINDOW', 61); + +class Notice extends Memcached_DataObject +{ + ###START_AUTOCODE + /* the code below is auto generated do not remove the above tag */ + + public $__table = 'notice'; // table name + public $id; // int(4) primary_key not_null + public $profile_id; // int(4) not_null + public $uri; // varchar(255) unique_key + public $content; // varchar(140) + public $rendered; // text() + public $url; // varchar(255) + public $created; // datetime() not_null + public $modified; // timestamp() not_null default_CURRENT_TIMESTAMP + public $reply_to; // int(4) + public $is_local; // tinyint(1) + public $source; // varchar(32) + + /* Static get */ + function staticGet($k,$v=NULL) { return Memcached_DataObject::staticGet('Notice',$k,$v); } + + /* the code above is auto generated do not remove the tag below */ + ###END_AUTOCODE + + function getProfile() { + return Profile::staticGet('id', $this->profile_id); + } + + function delete() { + $this->blowCaches(true); + $this->blowFavesCache(true); + $this->blowInboxes(); + return parent::delete(); + } + + function saveTags() { + /* extract all #hastags */ + $count = preg_match_all('/(?:^|\s)#([A-Za-z0-9_\-\.]{1,64})/', strtolower($this->content), $match); + if (!$count) { + return true; + } + + /* elide characters we don't want in the tag */ + $match[1] = str_replace(array('-', '_', '.'), '', $match[1]); + + /* Add them to the database */ + foreach(array_unique($match[1]) as $hashtag) { + $tag = DB_DataObject::factory('Notice_tag'); + $tag->notice_id = $this->id; + $tag->tag = $hashtag; + $tag->created = $this->created; + $id = $tag->insert(); + if (!$id) { + $last_error = PEAR::getStaticProperty('DB_DataObject','lastError'); + common_log(LOG_ERR, 'DB error inserting hashtag: ' . $last_error->message); + common_server_error(sprintf(_('DB error inserting hashtag: %s'), $last_error->message)); + return; + } + } + return true; + } + + static function saveNew($profile_id, $content, $source=NULL, $is_local=1, $reply_to=NULL, $uri=NULL) { + + $profile = Profile::staticGet($profile_id); + + if (!$profile) { + common_log(LOG_ERR, 'Problem saving notice. Unknown user.'); + return _('Problem saving notice. Unknown user.'); + } + + if (common_config('throttle', 'enabled') && !Notice::checkEditThrottle($profile_id)) { + common_log(LOG_WARNING, 'Excessive posting by profile #' . $profile_id . '; throttled.'); + return _('Too many notices too fast; take a breather and post again in a few minutes.'); + } + + $banned = common_config('profile', 'banned'); + + if ( in_array($profile_id, $banned) || in_array($profile->nickname, $banned)) { + common_log(LOG_WARNING, "Attempted post from banned user: $profile->nickname (user id = $profile_id)."); + return _('You are banned from posting notices on this site.'); + } + + $notice = new Notice(); + $notice->profile_id = $profile_id; + + $blacklist = common_config('public', 'blacklist'); + + # Blacklisted are non-false, but not 1, either + + if ($blacklist && in_array($profile_id, $blacklist)) { + $notice->is_local = -1; + } else { + $notice->is_local = $is_local; + } + + $notice->reply_to = $reply_to; + $notice->created = common_sql_now(); + $notice->content = common_shorten_links($content); + $notice->rendered = common_render_content($notice->content, $notice); + $notice->source = $source; + $notice->uri = $uri; + + $id = $notice->insert(); + + if (!$id) { + common_log_db_error($notice, 'INSERT', __FILE__); + return _('Problem saving notice.'); + } + + # Update the URI after the notice is in the database + if (!$uri) { + $orig = clone($notice); + $notice->uri = common_notice_uri($notice); + + if (!$notice->update($orig)) { + common_log_db_error($notice, 'UPDATE', __FILE__); + return _('Problem saving notice.'); + } + } + + # XXX: do we need to change this for remote users? + + common_save_replies($notice); + $notice->saveTags(); + + # Clear the cache for subscribed users, so they'll update at next request + # XXX: someone clever could prepend instead of clearing the cache + + if (common_config('memcached', 'enabled')) { + $notice->blowCaches(); + } + + $notice->addToInboxes(); + return $notice; + } + + static function checkEditThrottle($profile_id) { + $profile = Profile::staticGet($profile_id); + if (!$profile) { + return false; + } + # Get the Nth notice + $notice = $profile->getNotices(common_config('throttle', 'count') - 1, 1); + if ($notice && $notice->fetch()) { + # If the Nth notice was posted less than timespan seconds ago + if (time() - strtotime($notice->created) <= common_config('throttle', 'timespan')) { + # Then we throttle + return false; + } + } + # Either not N notices in the stream, OR the Nth was not posted within timespan seconds + return true; + } + + function blowCaches($blowLast=false) { + $this->blowSubsCache($blowLast); + $this->blowNoticeCache($blowLast); + $this->blowRepliesCache($blowLast); + $this->blowPublicCache($blowLast); + $this->blowTagCache($blowLast); + } + + function blowTagCache($blowLast=false) { + $cache = common_memcache(); + if ($cache) { + $tag = new Notice_tag(); + $tag->notice_id = $this->id; + if ($tag->find()) { + while ($tag->fetch()) { + $cache->delete(common_cache_key('notice_tag:notice_stream:' . $tag->tag)); + if ($blowLast) { + $cache->delete(common_cache_key('notice_tag:notice_stream:' . $tag->tag . ';last')); + } + } + } + $tag->free(); + unset($tag); + } + } + + function blowSubsCache($blowLast=false) { + $cache = common_memcache(); + if ($cache) { + $user = new User(); + + $user->query('SELECT id ' . + 'FROM user JOIN subscription ON user.id = subscription.subscriber ' . + 'WHERE subscription.subscribed = ' . $this->profile_id); + + while ($user->fetch()) { + $cache->delete(common_cache_key('user:notices_with_friends:' . $user->id)); + if ($blowLast) { + $cache->delete(common_cache_key('user:notices_with_friends:' . $user->id . ';last')); + } + } + $user->free(); + unset($user); + } + } + + function blowNoticeCache($blowLast=false) { + if ($this->is_local) { + $cache = common_memcache(); + if ($cache) { + $cache->delete(common_cache_key('profile:notices:'.$this->profile_id)); + if ($blowLast) { + $cache->delete(common_cache_key('profile:notices:'.$this->profile_id.';last')); + } + } + } + } + + function blowRepliesCache($blowLast=false) { + $cache = common_memcache(); + if ($cache) { + $reply = new Reply(); + $reply->notice_id = $this->id; + if ($reply->find()) { + while ($reply->fetch()) { + $cache->delete(common_cache_key('user:replies:'.$reply->profile_id)); + if ($blowLast) { + $cache->delete(common_cache_key('user:replies:'.$reply->profile_id.';last')); + } + } + } + $reply->free(); + unset($reply); + } + } + + function blowPublicCache($blowLast=false) { + if ($this->is_local == 1) { + $cache = common_memcache(); + if ($cache) { + $cache->delete(common_cache_key('public')); + if ($blowLast) { + $cache->delete(common_cache_key('public').';last'); + } + } + } + } + + function blowFavesCache($blowLast=false) { + $cache = common_memcache(); + if ($cache) { + $fave = new Fave(); + $fave->notice_id = $this->id; + if ($fave->find()) { + while ($fave->fetch()) { + $cache->delete(common_cache_key('user:faves:'.$fave->user_id)); + if ($blowLast) { + $cache->delete(common_cache_key('user:faves:'.$fave->user_id.';last')); + } + } + } + $fave->free(); + unset($fave); + } + } + + # XXX: too many args; we need to move to named params or even a separate + # class for notice streams + + static function getStream($qry, $cachekey, $offset=0, $limit=20, $since_id=0, $before_id=0, $order=NULL, $since=NULL) { + + if (common_config('memcached', 'enabled')) { + + # Skip the cache if this is a since, since_id or before_id qry + if ($since_id > 0 || $before_id > 0 || $since) { + return Notice::getStreamDirect($qry, $offset, $limit, $since_id, $before_id, $order, $since); + } else { + return Notice::getCachedStream($qry, $cachekey, $offset, $limit, $order); + } + } + + return Notice::getStreamDirect($qry, $offset, $limit, $since_id, $before_id, $order, $since); + } + + static function getStreamDirect($qry, $offset, $limit, $since_id, $before_id, $order, $since) { + + $needAnd = FALSE; + $needWhere = TRUE; + + if (preg_match('/\bWHERE\b/i', $qry)) { + $needWhere = FALSE; + $needAnd = TRUE; + } + + if ($since_id > 0) { + + if ($needWhere) { + $qry .= ' WHERE '; + $needWhere = FALSE; + } else { + $qry .= ' AND '; + } + + $qry .= ' notice.id > ' . $since_id; + } + + if ($before_id > 0) { + + if ($needWhere) { + $qry .= ' WHERE '; + $needWhere = FALSE; + } else { + $qry .= ' AND '; + } + + $qry .= ' notice.id < ' . $before_id; + } + + if ($since) { + + if ($needWhere) { + $qry .= ' WHERE '; + $needWhere = FALSE; + } else { + $qry .= ' AND '; + } + + $qry .= ' notice.created > \'' . date('Y-m-d H:i:s', $since) . '\''; + } + + # Allow ORDER override + + if ($order) { + $qry .= $order; + } else { + $qry .= ' ORDER BY notice.created DESC, notice.id DESC '; + } + + if (common_config('db','type') == 'pgsql') { + $qry .= ' LIMIT ' . $limit . ' OFFSET ' . $offset; + } else { + $qry .= ' LIMIT ' . $offset . ', ' . $limit; + } + + $notice = new Notice(); + + $notice->query($qry); + + return $notice; + } + + # XXX: this is pretty long and should probably be broken up into + # some helper functions + + static function getCachedStream($qry, $cachekey, $offset, $limit, $order) { + + # If outside our cache window, just go to the DB + + if ($offset + $limit > NOTICE_CACHE_WINDOW) { + return Notice::getStreamDirect($qry, $offset, $limit, NULL, NULL, $order, NULL); + } + + # Get the cache; if we can't, just go to the DB + + $cache = common_memcache(); + + if (!$cache) { + return Notice::getStreamDirect($qry, $offset, $limit, NULL, NULL, $order, NULL); + } + + # Get the notices out of the cache + + $notices = $cache->get(common_cache_key($cachekey)); + + # On a cache hit, return a DB-object-like wrapper + + if ($notices !== FALSE) { + $wrapper = new NoticeWrapper(array_slice($notices, $offset, $limit)); + return $wrapper; + } + + # If the cache was invalidated because of new data being + # added, we can try and just get the new stuff. We keep an additional + # copy of the data at the key + ';last' + + # No cache hit. Try to get the *last* cached version + + $last_notices = $cache->get(common_cache_key($cachekey) . ';last'); + + if ($last_notices) { + + # Reverse-chron order, so last ID is last. + + $last_id = $last_notices[0]->id; + + # XXX: this assumes monotonically increasing IDs; a fair + # bet with our DB. + + $new_notice = Notice::getStreamDirect($qry, 0, NOTICE_CACHE_WINDOW, + $last_id, NULL, $order, NULL); + + if ($new_notice) { + $new_notices = array(); + while ($new_notice->fetch()) { + $new_notices[] = clone($new_notice); + } + $new_notice->free(); + $notices = array_slice(array_merge($new_notices, $last_notices), + 0, NOTICE_CACHE_WINDOW); + + # Store the array in the cache for next time + + $result = $cache->set(common_cache_key($cachekey), $notices); + $result = $cache->set(common_cache_key($cachekey) . ';last', $notices); + + # return a wrapper of the array for use now + + return new NoticeWrapper(array_slice($notices, $offset, $limit)); + } + } + + # Otherwise, get the full cache window out of the DB + + $notice = Notice::getStreamDirect($qry, 0, NOTICE_CACHE_WINDOW, NULL, NULL, $order, NULL); + + # If there are no hits, just return the value + + if (!$notice) { + return $notice; + } + + # Pack results into an array + + $notices = array(); + + while ($notice->fetch()) { + $notices[] = clone($notice); + } + + $notice->free(); + + # Store the array in the cache for next time + + $result = $cache->set(common_cache_key($cachekey), $notices); + $result = $cache->set(common_cache_key($cachekey) . ';last', $notices); + + # return a wrapper of the array for use now + + $wrapper = new NoticeWrapper(array_slice($notices, $offset, $limit)); + + return $wrapper; + } + + function publicStream($offset=0, $limit=20, $since_id=0, $before_id=0, $since=NULL) { + + $parts = array(); + + $qry = 'SELECT * FROM notice '; + + if (common_config('public', 'localonly')) { + $parts[] = 'is_local = 1'; + } else { + # -1 == blacklisted + $parts[] = 'is_local != -1'; + } + + if ($parts) { + $qry .= ' WHERE ' . implode(' AND ', $parts); + } + + return Notice::getStream($qry, + 'public', + $offset, $limit, $since_id, $before_id, NULL, $since); + } + + function addToInboxes() { + $enabled = common_config('inboxes', 'enabled'); + + if ($enabled === true || $enabled === 'transitional') { + $inbox = new Notice_inbox(); + $qry = 'INSERT INTO notice_inbox (user_id, notice_id, created) ' . + 'SELECT user.id, ' . $this->id . ', "' . $this->created . '" ' . + 'FROM user JOIN subscription ON user.id = subscription.subscriber ' . + 'WHERE subscription.subscribed = ' . $this->profile_id . ' ' . + 'AND NOT EXISTS (SELECT user_id, notice_id ' . + 'FROM notice_inbox ' . + 'WHERE user_id = user.id ' . + 'AND notice_id = ' . $this->id . ' )'; + if ($enabled === 'transitional') { + $qry .= ' AND user.inboxed = 1'; + } + $inbox->query($qry); + } + return; + } + + # Delete from inboxes if we're deleted. + + function blowInboxes() { + + $enabled = common_config('inboxes', 'enabled'); + + if ($enabled === true || $enabled === 'transitional') { + $inbox = new Notice_inbox(); + $inbox->notice_id = $this->id; + $inbox->delete(); + } + + return; + } + +} + diff --git a/_darcs/pristine/classes/NoticeWrapper.php b/_darcs/pristine/classes/NoticeWrapper.php new file mode 100644 index 0000000000..f8c0aa3819 --- /dev/null +++ b/_darcs/pristine/classes/NoticeWrapper.php @@ -0,0 +1,59 @@ +. + */ + +if (!defined('LACONICA')) { exit(1); } + +require_once(INSTALLDIR.'/classes/Notice.php'); + +class NoticeWrapper extends Notice { + + public $id; // int(4) primary_key not_null + public $profile_id; // int(4) not_null + public $uri; // varchar(255) unique_key + public $content; // varchar(140) + public $rendered; // text() + public $url; // varchar(255) + public $created; // datetime() not_null + public $modified; // timestamp() not_null default_CURRENT_TIMESTAMP + public $reply_to; // int(4) + public $is_local; // tinyint(1) + public $source; // varchar(32) + + var $notices = NULL; + var $i = -1; + + function __construct($arr) { + $this->notices = $arr; + } + + function fetch() { + static $fields = array('id', 'profile_id', 'uri', 'content', 'rendered', + 'url', 'created', 'modified', 'reply_to', 'is_local', 'source'); + $this->i++; + if ($this->i >= count($this->notices)) { + return false; + } else { + $n = $this->notices[$this->i]; + foreach ($fields as $f) { + $this->$f = $n->$f; + } + return true; + } + } +} \ No newline at end of file diff --git a/_darcs/pristine/classes/Notice_inbox.php b/_darcs/pristine/classes/Notice_inbox.php new file mode 100644 index 0000000000..cc482bd194 --- /dev/null +++ b/_darcs/pristine/classes/Notice_inbox.php @@ -0,0 +1,40 @@ +. + */ + +if (!defined('LACONICA')) { exit(1); } + +require_once INSTALLDIR.'/classes/Memcached_DataObject.php'; + +class Notice_inbox extends Memcached_DataObject +{ + ###START_AUTOCODE + /* the code below is auto generated do not remove the above tag */ + + public $__table = 'notice_inbox'; // table name + public $user_id; // int(4) primary_key not_null + public $notice_id; // int(4) primary_key not_null + public $created; // datetime() not_null + public $source; // tinyint(1) default_1 + + /* Static get */ + function staticGet($k,$v=NULL) { return Memcached_DataObject::staticGet('Notice_inbox',$k,$v); } + + /* the code above is auto generated do not remove the tag below */ + ###END_AUTOCODE +} diff --git a/_darcs/pristine/classes/Notice_source.php b/_darcs/pristine/classes/Notice_source.php new file mode 100644 index 0000000000..e0a41b927c --- /dev/null +++ b/_darcs/pristine/classes/Notice_source.php @@ -0,0 +1,24 @@ +. + */ + +require_once INSTALLDIR.'/classes/Memcached_DataObject.php'; + +class Notice_tag extends Memcached_DataObject +{ + ###START_AUTOCODE + /* the code below is auto generated do not remove the above tag */ + + public $__table = 'notice_tag'; // table name + public $tag; // varchar(64) primary_key not_null + public $notice_id; // int(4) primary_key not_null + public $created; // datetime() not_null + + /* Static get */ + function staticGet($k,$v=NULL) { return Memcached_DataObject::staticGet('Notice_tag',$k,$v); } + + /* the code above is auto generated do not remove the tag below */ + ###END_AUTOCODE + + static function getStream($tag, $offset=0, $limit=20) { + $qry = + 'SELECT notice.* ' . + 'FROM notice JOIN notice_tag ON notice.id = notice_tag.notice_id ' . + 'WHERE notice_tag.tag = "%s" '; + + return Notice::getStream(sprintf($qry, $tag), + 'notice_tag:notice_stream:' . common_keyize($tag), + $offset, $limit); + } + + function blowCache() { + $cache = common_memcache(); + if ($cache) { + $cache->delete(common_cache_key('notice_tag:notice_stream:' . $this->tag)); + } + } +} diff --git a/_darcs/pristine/classes/Profile.php b/_darcs/pristine/classes/Profile.php new file mode 100644 index 0000000000..b57d7e38dd --- /dev/null +++ b/_darcs/pristine/classes/Profile.php @@ -0,0 +1,159 @@ +. + */ + +if (!defined('LACONICA')) { exit(1); } + +/** + * Table Definition for profile + */ +require_once INSTALLDIR.'/classes/Memcached_DataObject.php'; + +class Profile extends Memcached_DataObject +{ + ###START_AUTOCODE + /* the code below is auto generated do not remove the above tag */ + + public $__table = 'profile'; // table name + public $id; // int(4) primary_key not_null + public $nickname; // varchar(64) multiple_key not_null + public $fullname; // varchar(255) multiple_key + public $profileurl; // varchar(255) + public $homepage; // varchar(255) multiple_key + public $bio; // varchar(140) multiple_key + public $location; // varchar(255) multiple_key + public $created; // datetime() not_null + public $modified; // timestamp() not_null default_CURRENT_TIMESTAMP + + /* Static get */ + function staticGet($k,$v=NULL) { return Memcached_DataObject::staticGet('Profile',$k,$v); } + + /* the code above is auto generated do not remove the tag below */ + ###END_AUTOCODE + + function getAvatar($width, $height=NULL) { + if (is_null($height)) { + $height = $width; + } + return Avatar::pkeyGet(array('profile_id' => $this->id, + 'width' => $width, + 'height' => $height)); + } + + function getOriginalAvatar() { + $avatar = DB_DataObject::factory('avatar'); + $avatar->profile_id = $this->id; + $avatar->original = true; + if ($avatar->find(true)) { + return $avatar; + } else { + return NULL; + } + } + + function setOriginal($source) { + + $info = @getimagesize($source); + + if (!$info) { + return NULL; + } + + $filename = common_avatar_filename($this->id, + image_type_to_extension($info[2]), + NULL, common_timestamp()); + $filepath = common_avatar_path($filename); + + copy($source, $filepath); + + $avatar = new Avatar(); + + $avatar->profile_id = $this->id; + $avatar->width = $info[0]; + $avatar->height = $info[1]; + $avatar->mediatype = image_type_to_mime_type($info[2]); + $avatar->filename = $filename; + $avatar->original = true; + $avatar->url = common_avatar_url($filename); + $avatar->created = DB_DataObject_Cast::dateTime(); # current time + + # XXX: start a transaction here + + if (!$this->delete_avatars()) { + @unlink($filepath); + return NULL; + } + + if (!$avatar->insert()) { + @unlink($filepath); + return NULL; + } + + foreach (array(AVATAR_PROFILE_SIZE, AVATAR_STREAM_SIZE, AVATAR_MINI_SIZE) as $size) { + # We don't do a scaled one if original is our scaled size + if (!($avatar->width == $size && $avatar->height == $size)) { + $s = $avatar->scale($size); + if (!$s) { + return NULL; + } + } + } + + return $avatar; + } + + function delete_avatars() { + $avatar = new Avatar(); + $avatar->profile_id = $this->id; + $avatar->find(); + while ($avatar->fetch()) { + $avatar->delete(); + } + return true; + } + + function getBestName() { + return ($this->fullname) ? $this->fullname : $this->nickname; + } + + # Get latest notice on or before date; default now + function getCurrentNotice($dt=NULL) { + $notice = new Notice(); + $notice->profile_id = $this->id; + if ($dt) { + $notice->whereAdd('created < "' . $dt . '"'); + } + $notice->orderBy('created DESC, notice.id DESC'); + $notice->limit(1); + if ($notice->find(true)) { + return $notice; + } + return NULL; + } + + function getNotices($offset=0, $limit=NOTICES_PER_PAGE, $since_id=0, $before_id=0) { + $qry = + 'SELECT * ' . + 'FROM notice ' . + 'WHERE profile_id = %d '; + + return Notice::getStream(sprintf($qry, $this->id), + 'profile:notices:'.$this->id, + $offset, $limit, $since_id, $before_id); + } +} diff --git a/_darcs/pristine/classes/Profile_block.php b/_darcs/pristine/classes/Profile_block.php new file mode 100644 index 0000000000..6ea26a3bc4 --- /dev/null +++ b/_darcs/pristine/classes/Profile_block.php @@ -0,0 +1,49 @@ +. + */ + +if (!defined('LACONICA')) { exit(1); } + +/** + * Table Definition for profile_block + */ + +require_once INSTALLDIR.'/classes/Memcached_DataObject.php'; + +class Profile_block extends Memcached_DataObject +{ + ###START_AUTOCODE + /* the code below is auto generated do not remove the above tag */ + + public $__table = 'profile_block'; // table name + public $blocker; // int(4) primary_key not_null + public $blocked; // int(4) primary_key not_null + public $modified; // timestamp() not_null default_CURRENT_TIMESTAMP + + /* Static get */ + function staticGet($k,$v=NULL) { return Memcached_DataObject::staticGet('Profile_block',$k,$v); } + + /* the code above is auto generated do not remove the tag below */ + ###END_AUTOCODE + + function get($blocker, $blocked) { + return Memcached_DataObject::pkeyGet('Profile_block', + array('blocker' => $blocker, + 'blocked' => $blocked)); + } +} diff --git a/_darcs/pristine/classes/Profile_tag.php b/_darcs/pristine/classes/Profile_tag.php new file mode 100644 index 0000000000..dde19aea25 --- /dev/null +++ b/_darcs/pristine/classes/Profile_tag.php @@ -0,0 +1,101 @@ +tagger = $tagger; + $profile_tag->tagged = $tagged; + + $profile_tag->find(); + + while ($profile_tag->fetch()) { + $tags[] = $profile_tag->tag; + } + + $profile_tag->free(); + + return $tags; + } + + static function setTags($tagger, $tagged, $newtags) { + + $oldtags = Profile_tag::getTags($tagger, $tagged); + + # Delete stuff that's old that not in new + + $to_delete = array_diff($oldtags, $newtags); + + # Insert stuff that's in new and not in old + + $to_insert = array_diff($newtags, $oldtags); + + $profile_tag = new Profile_tag(); + + $profile_tag->tagger = $tagger; + $profile_tag->tagged = $tagged; + + $profile_tag->query('BEGIN'); + + foreach ($to_delete as $deltag) { + $profile_tag->tag = $deltag; + $result = $profile_tag->delete(); + if (!$result) { + common_log_db_error($profile_tag, 'DELETE', __FILE__); + return false; + } + } + + foreach ($to_insert as $instag) { + $profile_tag->tag = $instag; + $result = $profile_tag->insert(); + if (!$result) { + common_log_db_error($profile_tag, 'INSERT', __FILE__); + return false; + } + } + + $profile_tag->query('COMMIT'); + + return true; + } + + # Return profiles with a given tag + static function getTagged($tagger, $tag) { + $profile = new Profile(); + $profile->query('SELECT profile.* ' . + 'FROM profile JOIN profile_tag ' . + 'ON profile.id = profile_tag.tagged ' . + 'WHERE profile_tag.tagger = ' . $tagger . ' ' . + 'AND profile_tag.tag = "' . $tag . '" '); + $tagged = array(); + while ($profile->fetch()) { + $tagged[] = clone($profile); + } + return $tagged; + } +} diff --git a/_darcs/pristine/classes/Queue_item.php b/_darcs/pristine/classes/Queue_item.php new file mode 100644 index 0000000000..8ba3281de3 --- /dev/null +++ b/_darcs/pristine/classes/Queue_item.php @@ -0,0 +1,55 @@ +transport = $transport; + $qi->orderBy('created'); + $qi->whereAdd('claimed is NULL'); + + $qi->limit(1); + + $cnt = $qi->find(TRUE); + + if ($cnt) { + # XXX: potential race condition + # can we force it to only update if claimed is still NULL + # (or old)? + common_log(LOG_INFO, 'claiming queue item = ' . $qi->notice_id . ' for transport ' . $transport); + $orig = clone($qi); + $qi->claimed = common_sql_now(); + $result = $qi->update($orig); + if ($result) { + common_log(LOG_INFO, 'claim succeeded.'); + return $qi; + } else { + common_log(LOG_INFO, 'claim failed.'); + } + } + $qi = NULL; + return NULL; + } +} diff --git a/_darcs/pristine/classes/Remember_me.php b/_darcs/pristine/classes/Remember_me.php new file mode 100644 index 0000000000..5bbd6cf174 --- /dev/null +++ b/_darcs/pristine/classes/Remember_me.php @@ -0,0 +1,24 @@ +. + */ + +if (!defined('LACONICA')) { exit(1); } + +/** + * Table Definition for remote_profile + */ +require_once INSTALLDIR.'/classes/Memcached_DataObject.php'; + +class Remote_profile extends Memcached_DataObject +{ + ###START_AUTOCODE + /* the code below is auto generated do not remove the above tag */ + + public $__table = 'remote_profile'; // table name + public $id; // int(4) primary_key not_null + public $uri; // varchar(255) unique_key + public $postnoticeurl; // varchar(255) + public $updateprofileurl; // varchar(255) + public $created; // datetime() not_null + public $modified; // timestamp() not_null default_CURRENT_TIMESTAMP + + /* Static get */ + function staticGet($k,$v=NULL) { return Memcached_DataObject::staticGet('Remote_profile',$k,$v); } + + /* the code above is auto generated do not remove the tag below */ + ###END_AUTOCODE +} diff --git a/_darcs/pristine/classes/Reply.php b/_darcs/pristine/classes/Reply.php new file mode 100644 index 0000000000..d71ce3afbc --- /dev/null +++ b/_darcs/pristine/classes/Reply.php @@ -0,0 +1,23 @@ +email_pattern, $sms); + } +} diff --git a/_darcs/pristine/classes/Subscription.php b/_darcs/pristine/classes/Subscription.php new file mode 100644 index 0000000000..cc174fccee --- /dev/null +++ b/_darcs/pristine/classes/Subscription.php @@ -0,0 +1,51 @@ +. + */ + +if (!defined('LACONICA')) { exit(1); } + +/** + * Table Definition for subscription + */ +require_once INSTALLDIR.'/classes/Memcached_DataObject.php'; + +class Subscription extends Memcached_DataObject +{ + ###START_AUTOCODE + /* the code below is auto generated do not remove the above tag */ + + public $__table = 'subscription'; // table name + public $subscriber; // int(4) primary_key not_null + public $subscribed; // int(4) primary_key not_null + public $jabber; // tinyint(1) default_1 + public $sms; // tinyint(1) default_1 + public $token; // varchar(255) + public $secret; // varchar(255) + public $created; // datetime() not_null + public $modified; // timestamp() not_null default_CURRENT_TIMESTAMP + + /* Static get */ + function staticGet($k,$v=NULL) { return Memcached_DataObject::staticGet('Subscription',$k,$v); } + + /* the code above is auto generated do not remove the tag below */ + ###END_AUTOCODE + + function &pkeyGet($kv) { + return Memcached_DataObject::pkeyGet('Subscription', $kv); + } +} diff --git a/_darcs/pristine/classes/Token.php b/_darcs/pristine/classes/Token.php new file mode 100644 index 0000000000..d180ecebeb --- /dev/null +++ b/_darcs/pristine/classes/Token.php @@ -0,0 +1,26 @@ +. + */ + +if (!defined('LACONICA')) { exit(1); } + +/** + * Table Definition for user + */ +require_once INSTALLDIR.'/classes/Memcached_DataObject.php'; +require_once 'Validate.php'; + +class User extends Memcached_DataObject +{ + ###START_AUTOCODE + /* the code below is auto generated do not remove the above tag */ + + public $__table = 'user'; // table name + public $id; // int(4) primary_key not_null + public $nickname; // varchar(64) unique_key + public $password; // varchar(255) + public $email; // varchar(255) unique_key + public $incomingemail; // varchar(255) unique_key + public $emailnotifysub; // tinyint(1) default_1 + public $emailnotifyfav; // tinyint(1) default_1 + public $emailnotifynudge; // tinyint(1) default_1 + public $emailnotifymsg; // tinyint(1) default_1 + public $emailmicroid; // tinyint(1) default_1 + public $language; // varchar(50) + public $timezone; // varchar(50) + public $emailpost; // tinyint(1) default_1 + public $jabber; // varchar(255) unique_key + public $jabbernotify; // tinyint(1) + public $jabberreplies; // tinyint(1) + public $jabbermicroid; // tinyint(1) default_1 + public $updatefrompresence; // tinyint(1) + public $sms; // varchar(64) unique_key + public $carrier; // int(4) + public $smsnotify; // tinyint(1) + public $smsreplies; // tinyint(1) + public $smsemail; // varchar(255) + public $uri; // varchar(255) unique_key + public $autosubscribe; // tinyint(1) + public $urlshorteningservice; // varchar(50) default_ur1.ca + public $inboxed; // tinyint(1) + public $created; // datetime() not_null + public $modified; // timestamp() not_null default_CURRENT_TIMESTAMP + + /* Static get */ + function staticGet($k,$v=NULL) { return Memcached_DataObject::staticGet('User',$k,$v); } + + /* the code above is auto generated do not remove the tag below */ + ###END_AUTOCODE + + function getProfile() { + return Profile::staticGet('id', $this->id); + } + + function isSubscribed($other) { + assert(!is_null($other)); + # XXX: cache results of this query + $sub = Subscription::pkeyGet(array('subscriber' => $this->id, + 'subscribed' => $other->id)); + return (is_null($sub)) ? false : true; + } + + # 'update' won't write key columns, so we have to do it ourselves. + + function updateKeys(&$orig) { + $parts = array(); + foreach (array('nickname', 'email', 'jabber', 'incomingemail', 'sms', 'carrier', 'smsemail', 'language', 'timezone') as $k) { + if (strcmp($this->$k, $orig->$k) != 0) { + $parts[] = $k . ' = ' . $this->_quote($this->$k); + } + } + if (count($parts) == 0) { + # No changes + return true; + } + $toupdate = implode(', ', $parts); + + $table = $this->tableName(); + if(common_config('db','quote_identifiers')) { + $table = '"' . $table . '"'; + } + $qry = 'UPDATE ' . $table . ' SET ' . $toupdate . + ' WHERE id = ' . $this->id; + $orig->decache(); + $result = $this->query($qry); + if ($result) { + $this->encache(); + } + return $result; + } + + function allowed_nickname($nickname) { + # XXX: should already be validated for size, content, etc. + static $blacklist = array('rss', 'xrds', 'doc', 'main', + 'settings', 'notice', 'user', + 'search', 'avatar', 'tag', 'tags', + 'api', 'message'); + $merged = array_merge($blacklist, common_config('nickname', 'blacklist')); + return !in_array($nickname, $merged); + } + + function getCurrentNotice($dt=NULL) { + $profile = $this->getProfile(); + if (!$profile) { + return NULL; + } + return $profile->getCurrentNotice($dt); + } + + function getCarrier() { + return Sms_carrier::staticGet('id', $this->carrier); + } + + function subscribeTo($other) { + $sub = new Subscription(); + $sub->subscriber = $this->id; + $sub->subscribed = $other->id; + + $sub->created = common_sql_now(); # current time + + if (!$sub->insert()) { + return false; + } + + return true; + } + + function hasBlocked($other) { + + $block = Profile_block::get($this->id, $other->id); + + if (is_null($block)) { + $result = false; + } else { + $result = true; + $block->free(); + } + + return $result; + } + + static function register($fields) { + + # MAGICALLY put fields into current scope + + extract($fields); + + $profile = new Profile(); + + $profile->query('BEGIN'); + + $profile->nickname = $nickname; + $profile->profileurl = common_profile_url($nickname); + + if ($fullname) { + $profile->fullname = $fullname; + } + if ($homepage) { + $profile->homepage = $homepage; + } + if ($bio) { + $profile->bio = $bio; + } + if ($location) { + $profile->location = $location; + } + + $profile->created = common_sql_now(); + + $id = $profile->insert(); + + if (!$id) { + common_log_db_error($profile, 'INSERT', __FILE__); + return FALSE; + } + + $user = new User(); + + $user->id = $id; + $user->nickname = $nickname; + + if ($password) { # may not have a password for OpenID users + $user->password = common_munge_password($password, $id); + } + + # Users who respond to invite email have proven their ownership of that address + + if ($code) { + $invite = Invitation::staticGet($code); + if ($invite && $invite->address && $invite->address_type == 'email' && $invite->address == $email) { + $user->email = $invite->address; + } + } + + $inboxes = common_config('inboxes', 'enabled'); + + if ($inboxes === true || $inboxes == 'transitional') { + $user->inboxed = 1; + } + + $user->created = common_sql_now(); + $user->uri = common_user_uri($user); + + $result = $user->insert(); + + if (!$result) { + common_log_db_error($user, 'INSERT', __FILE__); + return FALSE; + } + + # Everyone is subscribed to themself + + $subscription = new Subscription(); + $subscription->subscriber = $user->id; + $subscription->subscribed = $user->id; + $subscription->created = $user->created; + + $result = $subscription->insert(); + + if (!$result) { + common_log_db_error($subscription, 'INSERT', __FILE__); + return FALSE; + } + + if ($email && !$user->email) { + + $confirm = new Confirm_address(); + $confirm->code = common_confirmation_code(128); + $confirm->user_id = $user->id; + $confirm->address = $email; + $confirm->address_type = 'email'; + + $result = $confirm->insert(); + if (!$result) { + common_log_db_error($confirm, 'INSERT', __FILE__); + return FALSE; + } + } + + if ($code && $user->email) { + $user->emailChanged(); + } + + $profile->query('COMMIT'); + + if ($email && !$user->email) { + mail_confirm_address($user, $confirm->code, $profile->nickname, $email); + } + + return $user; + } + + # Things we do when the email changes + + function emailChanged() { + + $invites = new Invitation(); + $invites->address = $this->email; + $invites->address_type = 'email'; + + if ($invites->find()) { + while ($invites->fetch()) { + $other = User::staticGet($invites->user_id); + subs_subscribe_to($other, $this); + } + } + } + + function hasFave($notice) { + $cache = common_memcache(); + + # XXX: Kind of a hack. + if ($cache) { + # This is the stream of favorite notices, in rev chron + # order. This forces it into cache. + $faves = $this->favoriteNotices(0, NOTICE_CACHE_WINDOW); + $cnt = 0; + while ($faves->fetch()) { + if ($faves->id < $notice->id) { + # If we passed it, it's not a fave + return false; + } else if ($faves->id == $notice->id) { + # If it matches a cached notice, then it's a fave + return true; + } + $cnt++; + } + # If we're not past the end of the cache window, + # then the cache has all available faves, so this one + # is not a fave. + if ($cnt < NOTICE_CACHE_WINDOW) { + return false; + } + # Otherwise, cache doesn't have all faves; + # fall through to the default + } + $fave = Fave::pkeyGet(array('user_id' => $this->id, + 'notice_id' => $notice->id)); + return ((is_null($fave)) ? false : true); + } + function mutuallySubscribed($other) { + return $this->isSubscribed($other) && + $other->isSubscribed($this); + } + + function mutuallySubscribedUsers() { + + # 3-way join; probably should get cached + $qry = 'SELECT user.* ' . + 'FROM subscription sub1 JOIN user ON sub1.subscribed = user.id ' . + 'JOIN subscription sub2 ON user.id = sub2.subscriber ' . + 'WHERE sub1.subscriber = %d and sub2.subscribed = %d ' . + 'ORDER BY user.nickname'; + $user = new User(); + $user->query(sprintf($qry, $this->id, $this->id)); + + return $user; + } + + function getReplies($offset=0, $limit=NOTICES_PER_PAGE, $since_id=0, $before_id=0, $since=NULL) { + $qry = + 'SELECT notice.* ' . + 'FROM notice JOIN reply ON notice.id = reply.notice_id ' . + 'WHERE reply.profile_id = %d '; + return Notice::getStream(sprintf($qry, $this->id), + 'user:replies:'.$this->id, + $offset, $limit, $since_id, $before_id, NULL, $since); + } + + function getNotices($offset=0, $limit=NOTICES_PER_PAGE, $since_id=0, $before_id=0, $since=NULL) { + $profile = $this->getProfile(); + if (!$profile) { + return NULL; + } else { + return $profile->getNotices($offset, $limit, $since_id, $before_id); + } + } + + function favoriteNotices($offset=0, $limit=NOTICES_PER_PAGE) { + $qry = + 'SELECT notice.* ' . + 'FROM notice JOIN fave ON notice.id = fave.notice_id ' . + 'WHERE fave.user_id = %d '; + return Notice::getStream(sprintf($qry, $this->id), + 'user:faves:'.$this->id, + $offset, $limit); + } + + function noticesWithFriends($offset=0, $limit=NOTICES_PER_PAGE, $since_id=0, $before_id=0, $since=NULL) { + $enabled = common_config('inboxes', 'enabled'); + + # Complicated code, depending on whether we support inboxes yet + # XXX: make this go away when inboxes become mandatory + + if ($enabled === false || + ($enabled == 'transitional' && $this->inboxed == 0)) { + $qry = + 'SELECT notice.* ' . + 'FROM notice JOIN subscription ON notice.profile_id = subscription.subscribed ' . + 'WHERE subscription.subscriber = %d '; + $order = NULL; + } else if ($enabled === true || + ($enabled == 'transitional' && $this->inboxed == 1)) { + + $qry = + 'SELECT notice.* ' . + 'FROM notice JOIN notice_inbox ON notice.id = notice_inbox.notice_id ' . + 'WHERE notice_inbox.user_id = %d '; + # NOTE: we override ORDER + $order = 'ORDER BY notice_inbox.created DESC, notice_inbox.notice_id DESC '; + } + return Notice::getStream(sprintf($qry, $this->id), + 'user:notices_with_friends:' . $this->id, + $offset, $limit, $since_id, $before_id, + $order, $since); + } + + function blowFavesCache() { + $cache = common_memcache(); + if ($cache) { + # Faves don't happen chronologically, so we need to blow + # ;last cache, too + $cache->delete(common_cache_key('user:faves:'.$this->id)); + $cache->delete(common_cache_key('user:faves:'.$this->id).';last'); + } + } + + function getSelfTags() { + return Profile_tag::getTags($this->id, $this->id); + } + + function setSelfTags($newtags) { + return Profile_tag::setTags($this->id, $this->id, $newtags); + } + + function block($other) { + + # Add a new block record + + $block = new Profile_block(); + + # Begin a transaction + + $block->query('BEGIN'); + + $block->blocker = $this->id; + $block->blocked = $other->id; + + $result = $block->insert(); + + if (!$result) { + common_log_db_error($block, 'INSERT', __FILE__); + return false; + } + + # Cancel their subscription, if it exists + + $sub = Subscription::pkeyGet(array('subscriber' => $other->id, + 'subscribed' => $this->id)); + + if ($sub) { + $result = $sub->delete(); + if (!$result) { + common_log_db_error($sub, 'DELETE', __FILE__); + return false; + } + } + + $block->query('COMMIT'); + + return true; + } + + function unblock($other) { + + # Get the block record + + $block = Profile_block::get($this->id, $other->id); + + if (!$block) { + return false; + } + + $result = $block->delete(); + + if (!$result) { + common_log_db_error($block, 'DELETE', __FILE__); + return false; + } + + return true; + } + +} diff --git a/_darcs/pristine/classes/User_openid.php b/_darcs/pristine/classes/User_openid.php new file mode 100644 index 0000000000..ad68f74024 --- /dev/null +++ b/_darcs/pristine/classes/User_openid.php @@ -0,0 +1,24 @@ + 'localhost', +# 'port' => 25, +# ); +#For incoming email, if enabled. Defaults to site server name. +#$config['mail']['domain'] = 'incoming.example.net'; + +#exponential decay factor for tags, default 10 days +#raise this if traffic is slow, lower it if it's fast +#$config['tag']['dropoff'] = 86400.0 * 10; + +#exponential decay factor for popular (most favorited notices) +#default 10 days -- similar to tag dropoff +#$config['popular']['dropoff'] = 86400.0 * 10; + +#optionally show non-local messages in public timeline +#$config['public']['localonly'] = false; + +#hide certain users from public pages, by ID +#$config['public']['blacklist'][] = 123; +#$config['public']['blacklist'][] = 2307; + +#Do notice broadcasts offline +#If you use this, you must run the six offline daemons in the +#background. See the README for details. +#$config['queue']['enabled'] = true; + +#The following customise the behaviour of the various daemons: +#$config['daemon']['piddir'] = '/var/run'; +#$config['daemon']['user'] = false; +#$config['daemon']['group'] = false; + +#For installations with high traffic, laconica can use MemCached to cache +#frequently requested information. Only enable the following if you have +#MemCached up and running: +#$config['memcached']['enabled'] = false; +#$config['memcached']['server'] = 'localhost'; +#$config['memcached']['port'] = 11211; + +#Twitter integration source attribute. Note: default is Laconica +#$config['integration']['source'] = 'Laconica'; + +# Edit throttling. Off by default. If turned on, you can only post 20 notices +# every 10 minutes. Admins may want to play with the settings to minimize inconvenience for +# real users without getting uncontrollable floods from spammers or runaway bots. + +#$config['throttle']['enabled'] = true; +#$config['throttle']['count'] = 100; +#$config['throttle']['timespan'] = 3600; + +# List of users banned from posting (nicknames and/or IDs) +#$config['profile']['banned'][] = 'hacker'; +#$config['profile']['banned'][] = 12345; + +# config section for the built-in Facebook application +#$config['facebook']['apikey'] = 'APIKEY'; +#$config['facebook']['secret'] = 'SECRET'; diff --git a/_darcs/pristine/db/carrier.sql b/_darcs/pristine/db/carrier.sql new file mode 100644 index 0000000000..932f7c8bb0 --- /dev/null +++ b/_darcs/pristine/db/carrier.sql @@ -0,0 +1,61 @@ +insert into sms_carrier + (name, email_pattern, created) +values + ('3 River Wireless', '%s@sms.3rivers.net', now()), + ('7-11 Speakout', '%s@cingularme.com', now()), + ('Airtel (Karnataka, India)', '%s@airtelkk.com', now()), + ('Alaska Communications Systems', '%s@msg.acsalaska.com', now()), + ('Alltel Wireless', '%s@message.alltel.com', now()), + ('AT&T Wireless', '%s@txt.att.net', now()), + ('Bell Mobility (Canada)', '%s@txt.bell.ca', now()), + ('Boost Mobile', '%s@myboostmobile.com', now()), + ('Cellular One (Dobson)', '%s@mobile.celloneusa.com', now()), + ('Cincinnati Bell Wireless', '%s@gocbw.com', now()), + ('Cingular (Postpaid)', '%s@cingularme.com', now()), + ('Centennial Wireless', '%s@cwemail.com', now()), + ('Cingular (GoPhone prepaid)', '%s@cingularme.com', now()), + ('Claro (Nicaragua)', '%s@ideasclaro-ca.com', now()), + ('Comcel', '%s@comcel.com.co', now()), + ('Cricket', '%s@sms.mycricket.com', now()), + ('CTI', '%s@sms.ctimovil.com.ar', now()), + ('Emtel (Mauritius)', '%s@emtelworld.net', now()), + ('Fido (Canada)', '%s@fido.ca', now()), + ('General Communications Inc.', '%s@msg.gci.net', now()), + ('Globalstar', '%s@msg.globalstarusa.com', now()), + ('Helio', '%s@myhelio.com', now()), + ('Illinois Valley Cellular', '%s@ivctext.com', now()), + ('i wireless', '%s.iws@iwspcs.net', now()), + ('Meteor (Ireland)', '%s@sms.mymeteor.ie', now()), + ('Mero Mobile (Nepal)', '%s@sms.spicenepal.com', now()), + ('MetroPCS', '%s@mymetropcs.com', now()), + ('Movicom', '%s@movimensaje.com.ar', now()), + ('Mobitel (Sri Lanka)', '%s@sms.mobitel.lk', now()), + ('Movistar (Colombia)', '%s@movistar.com.co', now()), + ('MTN (South Africa)', '%s@sms.co.za', now()), + ('MTS (Canada)', '%s@text.mtsmobility.com', now()), + ('Nextel (Argentina)', '%s@nextel.net.ar', now()), + ('Orange (Poland)', '%s@orange.pl', now()), + ('Orange (UK)', '%s@orange.net', now()), + ('Personal (Argentina)', '%s@personal-net.com.ar', now()), + ('Plus GSM (Poland)', '%s@text.plusgsm.pl', now()), + ('President''s Choice (Canada)', '%s@txt.bell.ca', now()), + ('Qwest', '%s@qwestmp.com', now()), + ('Rogers (Canada)', '%s@pcs.rogers.com', now()), + ('Sasktel (Canada)', '%s@sms.sasktel.com', now()), + ('Setar Mobile email (Aruba)', '%s@mas.aw', now()), + ('Solo Mobile', '%s@txt.bell.ca', now()), + ('Sprint (PCS)', '%s@messaging.sprintpcs.com', now()), + ('Sprint (Nextel)', '%s@page.nextel.com', now()), + ('Suncom', '%s@tms.suncom.com', now()), + ('T-Mobile', '%s@tmomail.net', now()), + ('T-Mobile (Austria)', '%s@sms.t-mobile.at', now()), + ('Telus Mobility (Canada)', '%s@msg.telus.com', now()), + ('Thumb Cellular', '%s@sms.thumbcellular.com', now()), + ('Tigo (Formerly Ola)', '%s@sms.tigo.com.co', now()), + ('Unicel', '%s@utext.com', now()), + ('US Cellular', '%s@email.uscc.net', now()), + ('Verizon', '%s@vtext.com', now()), + ('Virgin Mobile (Canada)', '%s@vmobile.ca', now()), + ('Virgin Mobile (USA)', '%s@vmobl.com', now()), + ('Vodafone NZ (txt ''R'' to 901 to enable first)', '%s@sms.vodafone.net.nz', now()), + ('YCC', '%s@sms.ycc.ru', now()); diff --git a/_darcs/pristine/db/foreign_services.sql b/_darcs/pristine/db/foreign_services.sql new file mode 100644 index 0000000000..512d425138 --- /dev/null +++ b/_darcs/pristine/db/foreign_services.sql @@ -0,0 +1,8 @@ +insert into foreign_service + (id, name, description, created) +values + ('1','Twitter', 'Twitter Micro-blogging service', now()); +insert into foreign_service + (id, name, description, created) +values + ('2','Facebook', 'Facebook', now()); diff --git a/_darcs/pristine/db/laconica.sql b/_darcs/pristine/db/laconica.sql new file mode 100644 index 0000000000..a366a6bcbb --- /dev/null +++ b/_darcs/pristine/db/laconica.sql @@ -0,0 +1,370 @@ +/* local and remote users have profiles */ + +create table profile ( + id integer auto_increment primary key comment 'unique identifier', + nickname varchar(64) not null comment 'nickname or username', + fullname varchar(255) comment 'display name', + profileurl varchar(255) comment 'URL, cached so we dont regenerate', + homepage varchar(255) comment 'identifying URL', + bio varchar(140) comment 'descriptive biography', + location varchar(255) comment 'physical location', + created datetime not null comment 'date this record was created', + modified timestamp comment 'date this record was modified', + + index profile_nickname_idx (nickname), + FULLTEXT(nickname, fullname, location, bio, homepage) +) ENGINE=MyISAM CHARACTER SET utf8 COLLATE utf8_bin; + +create table avatar ( + profile_id integer not null comment 'foreign key to profile table' references profile (id), + original boolean default false comment 'uploaded by user or generated?', + width integer not null comment 'image width', + height integer not null comment 'image height', + mediatype varchar(32) not null comment 'file type', + filename varchar(255) null comment 'local filename, if local', + url varchar(255) unique key comment 'avatar location', + created datetime not null comment 'date this record was created', + modified timestamp comment 'date this record was modified', + + constraint primary key (profile_id, width, height), + index avatar_profile_id_idx (profile_id) +) ENGINE=InnoDB CHARACTER SET utf8 COLLATE utf8_bin; + +create table sms_carrier ( + id integer auto_increment primary key comment 'primary key for SMS carrier', + name varchar(64) unique key comment 'name of the carrier', + email_pattern varchar(255) not null comment 'sprintf pattern for making an email address from a phone number', + created datetime not null comment 'date this record was created', + modified timestamp comment 'date this record was modified' +) ENGINE=InnoDB CHARACTER SET utf8 COLLATE utf8_bin; + +/* local users */ + +create table user ( + id integer primary key comment 'foreign key to profile table' references profile (id), + nickname varchar(64) unique key comment 'nickname or username, duped in profile', + password varchar(255) comment 'salted password, can be null for OpenID users', + email varchar(255) unique key comment 'email address for password recovery etc.', + incomingemail varchar(255) unique key comment 'email address for post-by-email', + emailnotifysub tinyint default 1 comment 'Notify by email of subscriptions', + emailnotifyfav tinyint default 1 comment 'Notify by email of favorites', + emailnotifynudge tinyint default 1 comment 'Notify by email of nudges', + emailnotifymsg tinyint default 1 comment 'Notify by email of direct messages', + emailmicroid tinyint default 1 comment 'whether to publish email microid', + language varchar(50) comment 'preferred language', + timezone varchar(50) comment 'timezone', + emailpost tinyint default 1 comment 'Post by email', + jabber varchar(255) unique key comment 'jabber ID for notices', + jabbernotify tinyint default 0 comment 'whether to send notices to jabber', + jabberreplies tinyint default 0 comment 'whether to send notices to jabber on replies', + jabbermicroid tinyint default 1 comment 'whether to publish xmpp microid', + updatefrompresence tinyint default 0 comment 'whether to record updates from Jabber presence notices', + sms varchar(64) unique key comment 'sms phone number', + carrier integer comment 'foreign key to sms_carrier' references sms_carrier (id), + smsnotify tinyint default 0 comment 'whether to send notices to SMS', + smsreplies tinyint default 0 comment 'whether to send notices to SMS on replies', + smsemail varchar(255) comment 'built from sms and carrier', + uri varchar(255) unique key comment 'universally unique identifier, usually a tag URI', + autosubscribe tinyint default 0 comment 'automatically subscribe to users who subscribe to us', + urlshorteningservice varchar(50) default 'ur1.ca' comment 'service to use for auto-shortening URLs', + inboxed tinyint default 0 comment 'has an inbox been created for this user?', + created datetime not null comment 'date this record was created', + modified timestamp comment 'date this record was modified', + + index user_smsemail_idx (smsemail) +) ENGINE=InnoDB CHARACTER SET utf8 COLLATE utf8_bin; + +/* remote people */ + +create table remote_profile ( + id integer primary key comment 'foreign key to profile table' references profile (id), + uri varchar(255) unique key comment 'universally unique identifier, usually a tag URI', + postnoticeurl varchar(255) comment 'URL we use for posting notices', + updateprofileurl varchar(255) comment 'URL we use for updates to this profile', + created datetime not null comment 'date this record was created', + modified timestamp comment 'date this record was modified' +) ENGINE=InnoDB CHARACTER SET utf8 COLLATE utf8_bin; + +create table subscription ( + subscriber integer not null comment 'profile listening', + subscribed integer not null comment 'profile being listened to', + jabber tinyint default 1 comment 'deliver jabber messages', + sms tinyint default 1 comment 'deliver sms messages', + token varchar(255) comment 'authorization token', + secret varchar(255) comment 'token secret', + created datetime not null comment 'date this record was created', + modified timestamp comment 'date this record was modified', + + constraint primary key (subscriber, subscribed), + index subscription_subscriber_idx (subscriber), + index subscription_subscribed_idx (subscribed), + index subscription_token_idx (token) +) ENGINE=InnoDB CHARACTER SET utf8 COLLATE utf8_bin; + +create table notice ( + + id integer auto_increment primary key comment 'unique identifier', + profile_id integer not null comment 'who made the update' references profile (id), + uri varchar(255) unique key comment 'universally unique identifier, usually a tag URI', + content varchar(140) comment 'update content', + rendered text comment 'HTML version of the content', + url varchar(255) comment 'URL of any attachment (image, video, bookmark, whatever)', + created datetime not null comment 'date this record was created', + modified timestamp comment 'date this record was modified', + reply_to integer comment 'notice replied to (usually a guess)' references notice (id), + is_local tinyint default 0 comment 'notice was generated by a user', + source varchar(32) comment 'source of comment, like "web", "im", or "clientname"', + + index notice_profile_id_idx (profile_id), + index notice_created_idx (created), + FULLTEXT(content) +) ENGINE=MyISAM CHARACTER SET utf8 COLLATE utf8_bin; + +create table notice_source ( + code varchar(32) primary key not null comment 'source code', + name varchar(255) not null comment 'name of the source', + url varchar(255) not null comment 'url to link to', + created datetime not null comment 'date this record was created', + modified timestamp comment 'date this record was modified' +) ENGINE=InnoDB CHARACTER SET utf8 COLLATE utf8_bin; + +create table reply ( + + notice_id integer not null comment 'notice that is the reply' references notice (id), + profile_id integer not null comment 'profile replied to' references profile (id), + modified timestamp not null comment 'date this record was modified', + replied_id integer comment 'notice replied to (not used, see notice.reply_to)', + + constraint primary key (notice_id, profile_id), + index reply_notice_id_idx (notice_id), + index reply_profile_id_idx (profile_id), + index reply_replied_id_idx (replied_id) + +) ENGINE=InnoDB CHARACTER SET utf8 COLLATE utf8_bin; + +create table fave ( + + notice_id integer not null comment 'notice that is the favorite' references notice (id), + user_id integer not null comment 'user who likes this notice' references user (id), + modified timestamp not null comment 'date this record was modified', + + constraint primary key (notice_id, user_id), + index fave_notice_id_idx (notice_id), + index fave_user_id_idx (user_id), + index fave_modified_idx (modified) + +) ENGINE=InnoDB CHARACTER SET utf8 COLLATE utf8_bin; + +/* tables for OAuth */ + +create table consumer ( + consumer_key varchar(255) primary key comment 'unique identifier, root URL', + seed char(32) not null comment 'seed for new tokens by this consumer', + + created datetime not null comment 'date this record was created', + modified timestamp comment 'date this record was modified' +) ENGINE=InnoDB CHARACTER SET utf8 COLLATE utf8_bin; + +create table token ( + consumer_key varchar(255) not null comment 'unique identifier, root URL' references consumer (consumer_key), + tok char(32) not null comment 'identifying value', + secret char(32) not null comment 'secret value', + type tinyint not null default 0 comment 'request or access', + state tinyint default 0 comment 'for requests; 0 = initial, 1 = authorized, 2 = used', + + created datetime not null comment 'date this record was created', + modified timestamp comment 'date this record was modified', + + constraint primary key (consumer_key, tok) +) ENGINE=InnoDB CHARACTER SET utf8 COLLATE utf8_bin; + +create table nonce ( + consumer_key varchar(255) not null comment 'unique identifier, root URL', + tok char(32) not null comment 'identifying value', + nonce char(32) not null comment 'nonce', + ts datetime not null comment 'timestamp sent', + + created datetime not null comment 'date this record was created', + modified timestamp comment 'date this record was modified', + + constraint primary key (consumer_key, tok, nonce), + constraint foreign key (consumer_key, tok) references token (consumer_key, tok) +) ENGINE=InnoDB CHARACTER SET utf8 COLLATE utf8_bin; + +/* One-to-many relationship of user to openid_url */ + +create table user_openid ( + canonical varchar(255) primary key comment 'Canonical true URL', + display varchar(255) not null unique key comment 'URL for viewing, may be different from canonical', + user_id integer not null comment 'user owning this URL' references user (id), + created datetime not null comment 'date this record was created', + modified timestamp comment 'date this record was modified', + + index user_openid_user_id_idx (user_id) +) ENGINE=InnoDB CHARACTER SET utf8 COLLATE utf8_bin; + +/* These are used by JanRain OpenID library */ + +create table oid_associations ( + server_url BLOB, + handle VARCHAR(255) character set latin1, + secret BLOB, + issued INTEGER, + lifetime INTEGER, + assoc_type VARCHAR(64), + PRIMARY KEY (server_url(255), handle) +) ENGINE=InnoDB CHARACTER SET utf8 COLLATE utf8_bin; + +create table oid_nonces ( + server_url VARCHAR(2047), + timestamp INTEGER, + salt CHAR(40), + UNIQUE (server_url(255), timestamp, salt) +) ENGINE=InnoDB CHARACTER SET utf8 COLLATE utf8_bin; + +create table confirm_address ( + code varchar(32) not null primary key comment 'good random code', + user_id integer not null comment 'user who requested confirmation' references user (id), + address varchar(255) not null comment 'address (email, Jabber, SMS, etc.)', + address_extra varchar(255) not null comment 'carrier ID, for SMS', + address_type varchar(8) not null comment 'address type ("email", "jabber", "sms")', + claimed datetime comment 'date this was claimed for queueing', + sent datetime comment 'date this was sent for queueing', + modified timestamp comment 'date this record was modified' +) ENGINE=InnoDB CHARACTER SET utf8 COLLATE utf8_bin; + +create table remember_me ( + code varchar(32) not null primary key comment 'good random code', + user_id integer not null comment 'user who is logged in' references user (id), + modified timestamp comment 'date this record was modified' +) ENGINE=InnoDB CHARACTER SET utf8 COLLATE utf8_bin; + +create table queue_item ( + + notice_id integer not null comment 'notice queued' references notice (id), + transport varchar(8) not null comment 'queue for what? "email", "jabber", "sms", "irc", ...', + created datetime not null comment 'date this record was created', + claimed datetime comment 'date this item was claimed', + + constraint primary key (notice_id, transport), + index queue_item_created_idx (created) + +) ENGINE=InnoDB CHARACTER SET utf8 COLLATE utf8_bin; + +/* Hash tags */ +create table notice_tag ( + tag varchar( 64 ) not null comment 'hash tag associated with this notice', + notice_id integer not null comment 'notice tagged' references notice (id), + created datetime not null comment 'date this record was created', + + constraint primary key (tag, notice_id), + index notice_tag_created_idx (created) +) ENGINE=InnoDB CHARACTER SET utf8 COLLATE utf8_bin; + +/* Synching with foreign services */ + +create table foreign_service ( + id int not null primary key comment 'numeric key for service', + name varchar(32) not null unique key comment 'name of the service', + description varchar(255) comment 'description', + created datetime not null comment 'date this record was created', + modified timestamp comment 'date this record was modified' +) ENGINE=InnoDB CHARACTER SET utf8 COLLATE utf8_bin; + +create table foreign_user ( + id int not null comment 'unique numeric key on foreign service', + service int not null comment 'foreign key to service' references foreign_service(id), + uri varchar(255) not null unique key comment 'identifying URI', + nickname varchar(255) comment 'nickname on foreign service', + created datetime not null comment 'date this record was created', + modified timestamp comment 'date this record was modified', + + constraint primary key (id, service) +) ENGINE=InnoDB CHARACTER SET utf8 COLLATE utf8_bin; + +create table foreign_link ( + user_id int comment 'link to user on this system, if exists' references user (id), + foreign_id int comment 'link ' references foreign_user(id), + service int not null comment 'foreign key to service' references foreign_service(id), + credentials varchar(255) comment 'authc credentials, typically a password', + noticesync tinyint not null default 1 comment 'notice synchronization, bit 1 = sync outgoing, bit 2 = sync incoming, bit 3 = filter local replies', + friendsync tinyint not null default 2 comment 'friend synchronization, bit 1 = sync outgoing, bit 2 = sync incoming', + profilesync tinyint not null default 1 comment 'profile synchronization, bit 1 = sync outgoing, bit 2 = sync incoming', + created datetime not null comment 'date this record was created', + modified timestamp comment 'date this record was modified', + + constraint primary key (user_id, foreign_id, service), + index foreign_user_user_id_idx (user_id) +) ENGINE=InnoDB CHARACTER SET utf8 COLLATE utf8_bin; + +create table foreign_subscription ( + service int not null comment 'service where relationship happens' references foreign_service(id), + subscriber int not null comment 'subscriber on foreign service' references foreign_user (id), + subscribed int not null comment 'subscribed user' references foreign_user (id), + created datetime not null comment 'date this record was created', + + constraint primary key (service, subscriber, subscribed), + index foreign_subscription_subscriber_idx (subscriber), + index foreign_subscription_subscribed_idx (subscribed) +) ENGINE=InnoDB CHARACTER SET utf8 COLLATE utf8_bin; + +create table invitation ( + code varchar(32) not null primary key comment 'random code for an invitation', + user_id int not null comment 'who sent the invitation' references user (id), + address varchar(255) not null comment 'invitation sent to', + address_type varchar(8) not null comment 'address type ("email", "jabber", "sms")', + created datetime not null comment 'date this record was created', + + index invitation_address_idx (address, address_type), + index invitation_user_id_idx (user_id) +) ENGINE=InnoDB CHARACTER SET utf8 COLLATE utf8_bin; + +create table message ( + + id integer auto_increment primary key comment 'unique identifier', + uri varchar(255) unique key comment 'universally unique identifier', + from_profile integer not null comment 'who the message is from' references profile (id), + to_profile integer not null comment 'who the message is to' references profile (id), + content varchar(140) comment 'message content', + rendered text comment 'HTML version of the content', + url varchar(255) comment 'URL of any attachment (image, video, bookmark, whatever)', + created datetime not null comment 'date this record was created', + modified timestamp comment 'date this record was modified', + source varchar(32) comment 'source of comment, like "web", "im", or "clientname"', + + index message_from_idx (from_profile), + index message_to_idx (to_profile), + index message_created_idx (created) +) ENGINE=InnoDB CHARACTER SET utf8 COLLATE utf8_bin; + +create table notice_inbox ( + + user_id integer not null comment 'user receiving the message' references user (id), + notice_id integer not null comment 'notice received' references notice (id), + created datetime not null comment 'date the notice was created', + source tinyint default 1 comment 'reason it is in the inbox; 1=subscription', + + constraint primary key (user_id, notice_id), + index notice_inbox_notice_id_idx (notice_id) +) ENGINE=InnoDB CHARACTER SET utf8 COLLATE utf8_bin; + +create table profile_tag ( + tagger integer not null comment 'user making the tag' references user (id), + tagged integer not null comment 'profile tagged' references profile (id), + tag varchar(64) not null comment 'hash tag associated with this notice', + modified timestamp comment 'date the tag was added', + + constraint primary key (tagger, tagged, tag), + index profile_tag_modified_idx (modified), + index profile_tag_tagger_tag_idx (tagger, tag) +) ENGINE=InnoDB CHARACTER SET utf8 COLLATE utf8_bin; + +create table profile_block ( + + blocker integer not null comment 'user making the block' references user (id), + blocked integer not null comment 'profile that is blocked' references profile (id), + modified timestamp comment 'date of blocking', + + constraint primary key (blocker, blocked) + +) ENGINE=InnoDB CHARACTER SET utf8 COLLATE utf8_bin; diff --git a/_darcs/pristine/db/laconica_pg.sql b/_darcs/pristine/db/laconica_pg.sql new file mode 100644 index 0000000000..e784bb1699 --- /dev/null +++ b/_darcs/pristine/db/laconica_pg.sql @@ -0,0 +1,329 @@ +/* local and remote users have profiles */ + +create table profile ( + id serial primary key /* comment 'unique identifier' */, + nickname varchar(64) not null /* comment 'nickname or username' */, + fullname varchar(255) /* comment 'display name' */, + profileurl varchar(255) /* comment 'URL, cached so we dont regenerate' */, + homepage varchar(255) /* comment 'identifying URL' */, + bio varchar(140) /* comment 'descriptive biography' */, + location varchar(255) /* comment 'physical location' */, + created timestamp not null /* comment 'date this record was created' */, + modified timestamp /* comment 'date this record was modified' */, + + textsearch tsvector +); +create index profile_nickname_idx on profile using btree(nickname); + +create table avatar ( + profile_id integer not null /* comment 'foreign key to profile table' */ references profile (id) , + original integer default 0 /* comment 'uploaded by user or generated?' */, + width integer not null /* comment 'image width' */, + height integer not null /* comment 'image height' */, + mediatype varchar(32) not null /* comment 'file type' */, + filename varchar(255) null /* comment 'local filename, if local' */, + url varchar(255) unique /* comment 'avatar location' */, + created timestamp not null /* comment 'date this record was created' */, + modified timestamp /* comment 'date this record was modified' */, + + primary key(profile_id, width, height) +); +create index avatar_profile_id_idx on avatar using btree(profile_id); + +create table sms_carrier ( + id serial primary key /* comment 'primary key for SMS carrier' */, + name varchar(64) unique /* comment 'name of the carrier' */, + email_pattern varchar(255) not null /* comment 'sprintf pattern for making an email address from a phone number' */, + created timestamp not null /* comment 'date this record was created' */, + modified timestamp /* comment 'date this record was modified ' */ +); + +/* local users */ + +create table "user" ( + id integer primary key /* comment 'foreign key to profile table' */ references profile (id) , + nickname varchar(64) unique /* comment 'nickname or username, duped in profile' */, + password varchar(255) /* comment 'salted password, can be null for OpenID users' */, + email varchar(255) unique /* comment 'email address for password recovery etc.' */, + incomingemail varchar(255) unique /* comment 'email address for post-by-email' */, + emailnotifysub integer default 1 /* comment 'Notify by email of subscriptions' */, + emailnotifyfav integer default 1 /* comment 'Notify by email of favorites' */, + emailnotifynudge integer default 1 /* comment 'Notify by email of nudges' */, + emailmicroid integer default 1 /* comment 'whether to publish email microid' */, + language varchar(50) /* comment 'preferred language' */, + timezone varchar(50) /* comment 'timezone' */, + emailpost integer default 1 /* comment 'Post by email' */, + jabber varchar(255) unique /* comment 'jabber ID for notices' */, + jabbernotify integer default 0 /* comment 'whether to send notices to jabber' */, + jabberreplies integer default 0 /* comment 'whether to send notices to jabber on replies' */, + jabbermicroid integer default 1 /* comment 'whether to publish xmpp microid' */, + updatefrompresence integer default 0 /* comment 'whether to record updates from Jabber presence notices' */, + sms varchar(64) unique /* comment 'sms phone number' */, + carrier integer /* comment 'foreign key to sms_carrier' */ references sms_carrier (id) , + smsnotify integer default 0 /* comment 'whether to send notices to SMS' */, + smsreplies integer default 0 /* comment 'whether to send notices to SMS on replies' */, + smsemail varchar(255) /* comment 'built from sms and carrier' */, + uri varchar(255) unique /* comment 'universally unique identifier, usually a tag URI' */, + autosubscribe integer default 0 /* comment 'automatically subscribe to users who subscribe to us' */, + urlshorteningservice varchar(50) default 'ur1.ca' /* comment 'service to use for auto-shortening URLs' */, + created timestamp not null /* comment 'date this record was created' */, + modified timestamp /* comment 'date this record was modified' */ + +); +create index user_smsemail_idx on "user" using btree(smsemail); + +/* remote people */ + +create table remote_profile ( + id integer primary key /* comment 'foreign key to profile table' */ references profile (id) , + uri varchar(255) unique /* comment 'universally unique identifier, usually a tag URI' */, + postnoticeurl varchar(255) /* comment 'URL we use for posting notices' */, + updateprofileurl varchar(255) /* comment 'URL we use for updates to this profile' */, + created timestamp not null /* comment 'date this record was created' */, + modified timestamp /* comment 'date this record was modified' */ +); + +create table subscription ( + subscriber integer not null /* comment 'profile listening' */, + subscribed integer not null /* comment 'profile being listened to' */, + token varchar(255) /* comment 'authorization token' */, + secret varchar(255) /* comment 'token secret' */, + created timestamp not null /* comment 'date this record was created' */, + modified timestamp /* comment 'date this record was modified' */, + + primary key (subscriber, subscribed) +); +create index subscription_subscriber_idx on subscription using btree(subscriber); +create index subscription_subscribed_idx on subscription using btree(subscribed); + +create table notice ( + + id serial primary key /* comment 'unique identifier' */, + profile_id integer not null /* comment 'who made the update' */ references profile (id) , + uri varchar(255) unique /* comment 'universally unique identifier, usually a tag URI' */, + content varchar(140) /* comment 'update content' */, + rendered text /* comment 'HTML version of the content' */, + url varchar(255) /* comment 'URL of any attachment (image, video, bookmark, whatever)' */, + created timestamp not null /* comment 'date this record was created' */, + modified timestamp /* comment 'date this record was modified' */, + reply_to integer /* comment 'notice replied to (usually a guess)' */ references notice (id) , + is_local integer default 0 /* comment 'notice was generated by a user' */, + source varchar(32) /* comment 'source of comment, like "web", "im", or "clientname"' */ + +/* FULLTEXT(content) */ +); +create index notice_profile_id_idx on notice using btree(profile_id); +create index notice_created_idx on notice using btree(created); + +create table notice_source ( + code varchar(32) primary key not null /* comment 'source code' */, + name varchar(255) not null /* comment 'name of the source' */, + url varchar(255) not null /* comment 'url to link to' */, + created timestamp not null /* comment 'date this record was created' */, + modified timestamp /* comment 'date this record was modified' */ +); + +create table reply ( + + notice_id integer not null /* comment 'notice that is the reply' */ references notice (id) , + profile_id integer not null /* comment 'profile replied to' */ references profile (id) , + modified timestamp not null default 'now' /* comment 'date this record was modified' */, + replied_id integer /* comment 'notice replied to (not used, see notice.reply_to)' */, + + primary key (notice_id, profile_id) + +); +create index reply_notice_id_idx on reply using btree(notice_id); +create index reply_profile_id_idx on reply using btree(profile_id); +create index reply_replied_id_idx on reply using btree(replied_id); + +create table fave ( + + notice_id integer not null /* comment 'notice that is the favorite' */ references notice (id), + user_id integer not null /* comment 'user who likes this notice' */ references "user" (id) , + modified timestamp not null /* comment 'date this record was modified' */, + + primary key (notice_id, user_id) + +); +create index fave_notice_id_idx on fave using btree(notice_id); +create index fave_user_id_idx on fave using btree(user_id); +create index fave_modified_idx on fave using btree(modified); + +/* tables for OAuth */ + +create table consumer ( + consumer_key varchar(255) primary key /* comment 'unique identifier, root URL' */, + seed char(32) not null /* comment 'seed for new tokens by this consumer' */, + + created timestamp not null /* comment 'date this record was created' */, + modified timestamp /* comment 'date this record was modified' */ +); + +create table token ( + consumer_key varchar(255) not null /* comment 'unique identifier, root URL' */ references consumer (consumer_key), + tok char(32) not null /* comment 'identifying value' */, + secret char(32) not null /* comment 'secret value' */, + type integer not null default 0 /* comment 'request or access' */, + state integer default 0 /* comment 'for requests; 0 = initial, 1 = authorized, 2 = used' */, + + created timestamp not null /* comment 'date this record was created' */, + modified timestamp /* comment 'date this record was modified' */, + + primary key (consumer_key, tok) +); + +create table nonce ( + consumer_key varchar(255) not null /* comment 'unique identifier, root URL' */, + tok char(32) not null /* comment 'identifying value' */, + nonce char(32) not null /* comment 'nonce' */, + ts timestamp not null /* comment 'timestamp sent' */, + + created timestamp not null /* comment 'date this record was created' */, + modified timestamp /* comment 'date this record was modified' */, + + primary key (consumer_key, tok, nonce), + foreign key (consumer_key, tok) references token (consumer_key, tok) +); + +/* One-to-many relationship of user to openid_url */ + +create table user_openid ( + canonical varchar(255) primary key /* comment 'Canonical true URL' */, + display varchar(255) not null unique /* comment 'URL for viewing, may be different from canonical' */, + user_id integer not null /* comment 'user owning this URL' */ references "user" (id) , + created timestamp not null /* comment 'date this record was created' */, + modified timestamp /* comment 'date this record was modified' */ + +); +create index user_openid_user_id_idx on user_openid using btree(user_id); + +/* These are used by JanRain OpenID library */ + +create table oid_associations ( + server_url varchar(2047), + handle varchar(255), + secret bytea, + issued integer, + lifetime integer, + assoc_type varchar(64), + primary key (server_url, handle) +); + +create table oid_nonces ( + server_url varchar(2047), + "timestamp" integer, + salt character(40), + unique (server_url, "timestamp", salt) +); + +create table confirm_address ( + code varchar(32) not null primary key /* comment 'good random code' */, + user_id integer not null /* comment 'user who requested confirmation' */ references "user" (id), + address varchar(255) not null /* comment 'address (email, Jabber, SMS, etc.)' */, + address_extra varchar(255) not null default '' /* comment 'carrier ID, for SMS' */, + address_type varchar(8) not null /* comment 'address type ("email", "jabber", "sms")' */, + claimed timestamp /* comment 'date this was claimed for queueing' */, + sent timestamp /* comment 'date this was sent for queueing' */, + modified timestamp /* comment 'date this record was modified' */ +); + +create table remember_me ( + code varchar(32) not null primary key /* comment 'good random code' */, + user_id integer not null /* comment 'user who is logged in' */ references "user" (id), + modified timestamp /* comment 'date this record was modified' */ +); + +create table queue_item ( + + notice_id integer not null /* comment 'notice queued' */ references notice (id) , + transport varchar(8) not null /* comment 'queue for what? "email", "jabber", "sms", "irc", ...' */, + created timestamp not null /* comment 'date this record was created' */, + claimed timestamp /* comment 'date this item was claimed' */, + + primary key (notice_id, transport) + +); +create index queue_item_created_idx on queue_item using btree(created); + +/* Hash tags */ +create table notice_tag ( + tag varchar( 64 ) not null /* comment 'hash tag associated with this notice' */, + notice_id integer not null /* comment 'notice tagged' */ references notice (id) , + created timestamp not null /* comment 'date this record was created' */, + + primary key (tag, notice_id) +); +create index notice_tag_created_idx on notice_tag using btree(created); + +/* Synching with foreign services */ + +create table foreign_service ( + id int not null primary key /* comment 'numeric key for service' */, + name varchar(32) not null unique /* comment 'name of the service' */, + description varchar(255) /* comment 'description' */, + created timestamp not null /* comment 'date this record was created' */, + modified timestamp /* comment 'date this record was modified' */ +); + +create table foreign_user ( + id int not null /* comment 'unique numeric key on foreign service' */, + service int not null /* comment 'foreign key to service' */ references foreign_service(id) , + uri varchar(255) not null unique /* comment 'identifying URI' */, + nickname varchar(255) /* comment 'nickname on foreign service' */, + user_id int /* comment 'link to user on this system, if exists' */ references "user" (id), + credentials varchar(255) /* comment 'authc credentials, typically a password' */, + created timestamp not null /* comment 'date this record was created' */, + modified timestamp /* comment 'date this record was modified' */, + + primary key (id, service) +); +create index foreign_user_user_id_idx on foreign_user using btree(user_id); + +create table foreign_subscription ( + service int not null /* comment 'service where relationship happens' */ references foreign_service(id) , + subscriber int not null /* comment 'subscriber on foreign service' */ , + subscribed int not null /* comment 'subscribed user' */ , + created timestamp not null /* comment 'date this record was created' */, + + primary key (service, subscriber, subscribed) +); +create index foreign_subscription_subscriber_idx on foreign_subscription using btree(subscriber); +create index foreign_subscription_subscribed_idx on foreign_subscription using btree(subscribed); + +create table invitation ( + code varchar(32) not null primary key /* comment 'random code for an invitation' */, + user_id int not null /* comment 'who sent the invitation' */ references "user" (id), + address varchar(255) not null /* comment 'invitation sent to' */, + address_type varchar(8) not null /* comment 'address type ("email", "jabber", "sms") '*/, + created timestamp not null /* comment 'date this record was created' */ + +); +create index invitation_address_idx on invitation using btree(address,address_type); +create index invitation_user_id_idx on invitation using btree(user_id); + +create table message ( + + id serial primary key /* comment 'unique identifier' */, + uri varchar(255) unique /* comment 'universally unique identifier' */, + from_profile integer not null /* comment 'who the message is from' */ references profile (id), + to_profile integer not null /* comment 'who the message is to' */ references profile (id), + content varchar(140) /* comment 'message content' */, + rendered text /* comment 'HTML version of the content' */, + url varchar(255) /* comment 'URL of any attachment (image, video, bookmark, whatever)' */, + created timestamp not null /* comment 'date this record was created' */, + modified timestamp /* comment 'date this record was modified' */, + source varchar(32) /* comment 'source of comment, like "web", "im", or "clientname"' */ + +); +create index message_from_idx on message using btree(from_profile); +create index message_to_idx on message using btree(to_profile); +create index message_created_idx on message using btree(created); + +/* Textsearch stuff */ + +create index textsearch_idx on profile using gist(textsearch); +create index noticecontent_idx on notice using gist(to_tsvector('english',content)); +create trigger textsearchupdate before insert or update on profile for each row +execute procedure tsvector_update_trigger(textsearch, 'pg_catalog.english', nickname, fullname, location, bio, homepage); + diff --git a/_darcs/pristine/doc/about b/_darcs/pristine/doc/about new file mode 100644 index 0000000000..3036a51b96 --- /dev/null +++ b/_darcs/pristine/doc/about @@ -0,0 +1,10 @@ +%%site.name%% is a +[micro-blogging](http://en.wikipedia.org/wiki/Micro-blogging) service +based on the Free Software [Laconica](http://laconi.ca/) tool. + +If you [register](%%action.register%%) for an account, +you can post small (140 chars or less) text notices +about yourself, where you are, what you're doing, or practically +anything you want. You can also subscribe to the notices of your +friends, or other people you're interested in, and follow them on the +Web or in an [RSS](http://en.wikipedia.org/wiki/RSS) feed. diff --git a/_darcs/pristine/doc/contact b/_darcs/pristine/doc/contact new file mode 100644 index 0000000000..a8efc456a1 --- /dev/null +++ b/_darcs/pristine/doc/contact @@ -0,0 +1,24 @@ +There are a number of options for getting in contact with responsible +people for %%site.name%%. + +Post a notice +------------- + +If you have a question about how to do something, just post a notice +with your question. People here like to answer messages. Watch the +[public timeline](%%action.public%%) for answers; they'll usually start +with "@" plus your user name. + +Bugs +---- + +If you think you've found a bug in the [Laconica](http://laconi.ca/) software, +or if there's a new feature you'd like to see, add it into the [Laconica bug database](http://laconi.ca/PITS/HomePage). Don't forget to check the list of +existing bugs to make sure it hasn't already been reported! + +Email +----- + +You can reach the responsible party for this server at [%%site.email%%](mailto:%%site.email%%). + + diff --git a/_darcs/pristine/doc/faq b/_darcs/pristine/doc/faq new file mode 100644 index 0000000000..5699f3635d --- /dev/null +++ b/_darcs/pristine/doc/faq @@ -0,0 +1,42 @@ +These are some *Frequently Asked Questions* about this service, with +some answers. + +What is %%site.name%%? +---------------------- + +%%site.name%% is a [micro-blogging](http://en.wikipedia.org/wiki/Micro-blogging) service. +You can use it to write short notices about yourself, where you are, +and what you're doing, and those notices will be sent to all your friends +and fans. + +How is %%site.name%% different from Twitter, Jaiku, Pownce, Plurk, others? +-------------------------------------------------------------------------- + +%%site.name%% is an [Open Network Service](http://opendefinition.org/osd). Our main +goal is to provide a fair and transparent service that preserves users' autonomy. In +particular, all the software used for %%site.name%% is [Free Software](http://en.wikipedia.org/wiki/Free_Software), and all the data is available +under the [%%license.title%%](%%license.url%%) license, making it Open Data. + +The software also implements the [OpenMicroBlogging](http://openmicroblogging.org/) protocol, meaning that you can have friends on other microblogging services +that can receive your notices. + +The goal here is *autonomy* -- you deserve the right to manage your own on-line +presence. If you don't like how %%site.name%% works, you can take your data and the source code and set up your own server (or move your account to another one). + +Where is feature X? +------------------- + +The software we run, [Laconica](http://laconi.ca/), is still in its early stages, +and many features people expect from microblogging sites are not yet implemented. Some important ones that are expected "soon": + +* More [AJAX](http://en.wikipedia.org/wiki/AJAX)-y interface +* Maps +* Cross-post to Pownce, Jaiku, etc. +* Pull messages from Twitter, Pownce, Jaiku, etc. +* [Facebook](http://www.facebook.com/) integration +* Image, video, audio notices + +There is [a list of bugs and features](http://laconi.ca/trac/) that you may find +interesting. New ideas or complaints are very welcome. + + diff --git a/_darcs/pristine/doc/help b/_darcs/pristine/doc/help new file mode 100644 index 0000000000..5b60072e26 --- /dev/null +++ b/_darcs/pristine/doc/help @@ -0,0 +1,29 @@ +%%site.name%% is a **microblogging service**. Users post short (140 +character) notices which are broadcast to their friends and fans using +the Web, RSS, or instant messages. + +If you'd like to try it out, first [register](%%action.register%%) a new account. +Then, on the [public timeline](%%action.public%%), enter your message into +the textbox at the top of the page, and click "Send". It will go out on the +public timeline and to anyone who is subscribed to your notices (probably nobody, +at first). + +To subscribe to other people's notifications, go to their profile page +and click the "subscribe" button. They'll get a notice that you're now +subscribed to their notifications, and, who knows?, they might subscribe +back. + +More help +--------- + +Here are some documents that you might find helpful in understanding +%%site.name%% and how to use it. + +* [About](%%doc.about%%) - an overview of the service +* [FAQ](%%doc.faq%%) - frequently-asked questions about %%site.name%% +* [Contact](%%doc.contact%%) - who to contact with questions about the service +* [IM](%%doc.im%%) - using the instant-message (IM) features of %%site.name%% +* [OpenID](%%doc.openid%%) - what OpenID is and how to use it with this service +* [OpenMicroBlogging](%%doc.openmublog%%) - subscribing to remote users +* [Privacy](%%doc.privacy%%) - %%site.name%%'s privacy policy +* [Source](%%doc.source%%) - How to get the Laconica source code diff --git a/_darcs/pristine/doc/im b/_darcs/pristine/doc/im new file mode 100644 index 0000000000..da07f9fe7b --- /dev/null +++ b/_darcs/pristine/doc/im @@ -0,0 +1,35 @@ +You can post messages to %%site.name%% using a [Jabber](http://jabber.org/) client +on your computer, mobile phone, or other platform. ([GTalk](http://talk.google.com/), +Google's Jabber program, will also work.) This can be a convenient way to keep +up with your friends on %%site.name%%. + +If you don't already have a Jabber account, you can use GTalk or one of the other +[public Jabber services](http://www.jabber.org/im-services). You'll probably also +need an IM client like [Pidgin](http://www.pidgin.im/). + +Managing your IM settings +------------------------- + +Use the [IM settings](%%action.imsettings%%) page to set your IM preferences. You can add or change your Jabber address and set the flags for Jabber update. + +When you add or change your address, you'll receive a message from **%%xmpp.user%%@%%xmpp.server%%** asking you to confirm the change. (You may need to +add %%xmpp.user%%@%%xmpp.server%% to your buddy list *before* changing your IM +settings; this is definitely true for GTalk.) + +Sending updates +--------------- + +You send updates by sending messages to %%xmpp.user%%@%%xmpp.server%%. Messages +should be less than 140 characters; longer messages will be truncated. + +Commands +-------- + +You can do some minor management of your account through Jabber. These are the +currently-implemented commands: + +* **on**: Turn on notifications. You'll receive copies of messages by people + you subscribe to. +* **off**: Turn off notifications. You'll no longer receive Jabber + notifications. + diff --git a/_darcs/pristine/doc/openid b/_darcs/pristine/doc/openid new file mode 100644 index 0000000000..c741e36741 --- /dev/null +++ b/_darcs/pristine/doc/openid @@ -0,0 +1,11 @@ +%%site.name%% supports the [OpenID](http://openid.net/) standard for single signon between Web sites. OpenID lets you log into many different Web sites without using a different password for each. (See [Wikipedia's OpenID article](http://en.wikipedia.org/wiki/OpenID) for more information.) + +If you already have an account on %%site.name%%, you can [login](%%action.login%%) with your username and password as usual. +To use OpenID in the future, you can [add an OpenID to your account](%%action.openidsettings%%) after you have logged in normally. + +There are many [Public OpenID providers](http://wiki.openid.net/Public_OpenID_providers), and you may already have an OpenID-enabled account on another service. + +* On wikis: If you have an account on an OpenID-enabled wiki, like [Wikitravel](http://wikitravel.org/), [wikiHow](http://www.wikihow.com/), [Vinismo](http://vinismo.com/), [AboutUs](http://aboutus.org/) or [Keiki](http://kei.ki/), you can log in to %%site.name%% by entering the **full URL** of your user page on that other wiki in the box above. For example, *http://kei.ki/en/User:Evan*. +* [Yahoo!](http://openid.yahoo.com/) : If you have an account with Yahoo!, you can log in to this site by entering your Yahoo!-provided OpenID in the box above. Yahoo! OpenID URLs have the form *https://me.yahoo.com/yourusername*. +* [AOL](http://dev.aol.com/aol-and-63-million-openids) : If you have an account with [AOL](http://www.aol.com/), like an [AIM](http://www.aim.com/) account, you can log in to %%site.name%% by entering your AOL-provided OpenID in the box above. AOL OpenID URLs have the form *http://openid.aol.com/yourusername*. Your username should be all lowercase, no spaces. +* [Blogger](http://bloggerindraft.blogspot.com/2008/01/new-feature-blogger-as-openid-provider.html), [Wordpress.com](http://faq.wordpress.com/2007/03/06/what-is-openid/), [LiveJournal](http://www.livejournal.com/openid/about.bml), [Vox](http://bradfitz.vox.com/library/post/openid-for-vox.html) : If you have a blog on any of these services, enter your blog URL in the box above. For example, *http://yourusername.blogspot.com/*, *http://yourusername.wordpress.com/*, *http://yourusername.livejournal.com/*, or *http://yourusername.vox.com/*. diff --git a/_darcs/pristine/doc/openmicroblogging.txt b/_darcs/pristine/doc/openmicroblogging.txt new file mode 100644 index 0000000000..a0df04035e --- /dev/null +++ b/_darcs/pristine/doc/openmicroblogging.txt @@ -0,0 +1,325 @@ +=============================== +OpenMicroBlogging specification +=============================== + +:Author: Evan Prodromou (Control Yourself, Inc.) +:Contact: evan@controlezvous.ca +:Revision: 0.1.1 +:Date: 2008-07-07 +:Copyright: To the extent possible under law, Control Yourself, Inc + has waived all copyright, moral rights, database rights, + and any other rights that might be asserted over + The OpenMicroBlogging specification. + +Purpose +======= + +To allow users of one microblogging service to publish notices to +users of another service, given the other users' permission. + +Enabling technologies +===================== + +Depends on OAuth 1.0, OAuth Discovery 1.0, YADIS 1.0. + +We piggy-back additional information onto these protocols to pass +microblogging information back and forth. + +Terminology +=========== + +microblogging service + undefined. +user + undefined. +listen + to allow a remote service to send notices to the user's local + service on a remote user's behalf. +listener + the person listening. +listenee + the user sending notices. +remote service + the listenee's microblogging service. +local service + the listener's microblogging service. +profile URL + "home" URL for the listener, typically their profile page on a + microblogging site. +nickname + An alphanumeric short name for a person, 1-64 characters. +identifier URI + A globally unique and unchanging identifying URI for a user. + Need not be an URL. [*]_ +notice URI + A unique and unchanging identifier for a notice. Need not be an + URL. [*]_ + +.. [*] May be the profile URL, if it's defined not to change or be + re-used. The profile URL of some services includes the nickname, + and some let the user change his/her nickname. This user's profile + URL may change from 'http://example.net/~john' to + 'http://example.net/~johnsmith' A tag URI, like + 'tag:example.net,2008:user:1' may be more appropriate here. +.. [*] IWBNI the notice URI is used everywhere the notice is + published; for example, in any RSS feeds. + +Initiation +========== + +The user submits their profile URL [*]_ to the remote service somehow -- +for example, with an HTML form on the remote service's Web site. + +.. [*] For OAuth Discovery, this is the "protected resource". It may + be more correct that the protected resource is the postNotice URL + (see below), but the listener will be more familiar with their own + profile URL. So there will have to be discovery of the postNotice + URL anyways, and it might as well all be done in one step. + +Discovery +========= + +The remote service recovers a YADIS document from the profile URL, as +described in OAuth Discovery. + +The request token service must have a LocalID associated with it, +containing the identifier URI for the listener. + +The following two extra services must be included in the YADIS +document, with accompanying URIs. + +http://openmicroblogging.org/protocol/0.1/postNotice + Post Notice URL, as defined below. + +http://openmicroblogging.org/protocol/0.1/updateProfile + Update Profile URL, as defined below. + +If any of the URIs is unavailable, the remote service MUST stop +processing. + +Authorization +============= + +The remote service must go through the OAuth 1.0 dance to get +authorization to post notices and update profiles. + +In all OAuth, the consumer key should be the root URL for the +microblogging service, if available. The secret should be the blank +string (''), unless the remote server and local service have negotiated +another key. Such negotiation is out-of-scope for this document, and we +assume an "open" network of microblogging services. But if you want to +have that kind of network, do it with this key. + +The remote service MUST do OAuth for every new listener, regardless of +whether they've already received authorization for posting to the +given postNotice URL. See `Posting a Notice`_ below. + +Request token +------------- + +The remote service uses the defined requestToken URL to get a request +token. + +In the request token HTTP request, the remote service MUST send the +following additional parameter(s): + +omb_version + 'http://openmicroblogging.org/protocol/0.1' +omb_listener + The identifier URI for the listener. + +In the results for the request token request, the local service MUST +send the following additional parameters: + +omb_version + 'http://openmicroblogging.org/protocol/0.1' + +User authorization +------------------ + +In requesting user authorization, the remote service must send the +following parameters: + +omb_version + 'http://openmicroblogging.org/protocol/0.1'. +omb_listener + The identifier URI for the listener. +omb_listenee + The identifier URI for the listenee. +omb_listenee_profile + The profile URL of the listenee. +omb_listenee_nickname + The nickname of the listenee. +omb_listenee_license + The default license URL for the listenee's stream. Typically the + URL of a Creative Commons license, with the Attribution license + being heavily encouraged. CC0 quitclaim also pretty good. The + local service MAY reject listenees if their licenses are + incompatible with the service. + +The remote service should send as many of the following parameters as +possible. This will help the user decide if they really want to allow +the listening to happen, and allow the local service to store a copy +of the listenee's profile. + +omb_listenee_fullname + The full name of the listenee. Up to 255 chars. +omb_listenee_homepage + The home page of the listenee (may be distinct from the profile + URL). +omb_listenee_bio + A brief biography of the listenee; less than 140 chars. +omb_listenee_location + Physical location of the listenee; less that 255 chars. No fixed + structure, but "Locality, Region, Country" or "Locality, Country" + or "Locality, Region" recommended. +omb_listenee_avatar + URL of a 96px by 96px image in PNG, GIF or JPEG format representing + the listenee. + +The local service, in a successful response, must return the +following additional parameters: + +omb_version + 'http://openmicroblogging.org/protocol/0.1'. +omb_listener_nickname + A nickname for the listener. +omb_listener_profile + The profile URL for the listener, possibly cleaned up or + canonicalized. + +It should return as many of the following as possible: + +omb_listener_fullname + The full name of the listener. Up to 255 chars. +omb_listener_homepage + The home page of the listener (may be distinct from the profile + URL). +omb_listener_bio + A brief biography of the listener; less than 140 chars. +omb_listener_location + Physical location of the listener; less that 255 chars. No fixed + structure, but "Locality, Region, Country" or "Locality, Country" + or "Locality, Region" recommended. +omb_listener_avatar + URL of a 96px by 96px image in PNG, GIF or JPEG format representing + the listener. + +This will allow the remote service to display information about the +listener in the listenee's "listeners" or "subscribers" list. + +Access token +------------ + +The access token step of the OAuth protocol requires no additional +parameters. + +Posting a Notice +================ + +To post a notice to the local service, the remote service sends an HTTP +POST message to the postNotice URL discovered above. The message must +use OAuth authorization. The message must also include the following +parameters: + +omb_version + 'http://openmicroblogging.org/protocol/0.1'. +omb_listenee + The identifier URI for the listenee. +omb_notice + The notice URI. +omb_notice_content + The content of the notice. No maximum, but 140 chars is recommended. + +The message may include the following parameters: + +omb_notice_url + The URL of the notice, if the notice is retrievable. +omb_notice_license + The URL of the license for the notice, if different from the + listenee's default license. +omb_seealso + URL of additional content for the notice; for example, an image, + video, or audio file. +omb_seealso_disposition + One of 'link' or 'inline', to recommend how the extra data should + be shown. Default 'link'. +omb_seealso_mediatype + Internet Media Type of the see-also data. Advisory, probably + shouldn't be trusted. +omb_seealso_license + License for the attached data. May be distinct from the notice's + license (if they're passing along someone else's content). + +The local service should include the following parameters in its +response: + +omb_version + 'http://openmicroblogging.org/protocol/0.1'. + +The local service makes no guarantees about the delivery of the notice +to anyone. + +The remote service SHOULD NOT send a message with the same notice URL +to the same postNotice URL more than once. [*]_ If the request returns +a 403 Unauthorized message, the remote service SHOULD NOT post +messages to the same URL again with the same listenee, until another +listener has gone through the OAuth dance. [*]_ + +.. [*] A half-assed optimization. A local service may have a lot of + listeners listening to the same listenee. It would be pointless to + have the remote service post the same notice 100 times to the same + service. However, if the local service wants fine-grained control, + it can have a different postNotice URL for each listener. +.. [*] If there's one postNotice URL per listener, the 403 message + means the listener has told the local service not to allow posting + any more ("unsubscribed"). If there's one postNotice URL per local + service, it means that the count of listeners has dropped to 0. + +Updating a profile +================== + +If the listenee's profile information changes, the remote service MAY +send an HTTP POST message to to the updateProfile URL to tell the +local service about the change. + +The message must use OAuth authorization. The message must also +include the following parameters: + +omb_version + 'http://openmicroblogging.org/protocol/0.1'. +omb_listenee + The identifier URI for the listenee. + +The message may include any of the following parameters: + +omb_listenee_profile + The profile URL of the listenee. +omb_listenee_nickname + The nickname of the listenee. +omb_listenee_license + The default license URL for the listenee's stream. A change in the + default license only applies to future notices; notices previous + to the update SHOULD be treated as under the old license. +omb_listenee_fullname + The full name of the listenee. Up to 255 chars. +omb_listenee_homepage + The home page of the listenee. +omb_listenee_bio + A brief biography of the listenee; less than 140 chars. +omb_listenee_location + Physical location of the listenee; less that 255 chars. +omb_listenee_avatar + URL of a 96px by 96px image in PNG, GIF or JPEG format representing + the listenee. + +Missing parameters should not be construed to mean that the profile +field has been blanked. The remote service MUST set the parameter to +an empty string to show that the field is blank. + +References +========== + +* OAuth: http://oauth.net/ +* OAuth Discovery: http://oauth.net/discovery/1.0 +* XRDS Simple: http://xrds-simple.net/core/1.0/ \ No newline at end of file diff --git a/_darcs/pristine/doc/openmublog b/_darcs/pristine/doc/openmublog new file mode 100644 index 0000000000..6e3abee42e --- /dev/null +++ b/_darcs/pristine/doc/openmublog @@ -0,0 +1,25 @@ +[OpenMicroBlogging](http://openmicroblogging.org/) is a protocol that +lets users of one [microblogging](http://en.wikipedia.org/wiki/microblogging) service +subscribe to notices by users of another service. The protocol, based on +[OAuth](http://oauth.net/), is open and free, and doesn't depend on any +central authority to maintain the federated microblogs. + +The [Laconica](http://laconi.ca/) software that runs %%site.name%% supports +OpenMicroBlogging 0.1. Anyone can make a new installation of Laconica on their +own servers, and users of that new installation can subscribe to notices from +%%site.name%%. + +Remote subscription +------------------- + +If you have an account on a remote site that supports OpenMicroBlogging, and you +want to subscribe to the notices of a user on this site, click on the "Subscribe" +link under their avatar on their profile page. This should take you to the +[remote subscription](%%action.remotesubscribe%%) page. Make sure that you've got the +right nickname registered, and enter your profile URL on the other microblogging +service. + +You'll be taken to your microblogging service, where you'll be asked to confirm the +subscription. When you confirm, your service will receive new notifications from +the user on %%site.name%%, and your service will forward them to you (using IM, SMS, +the Web, or whatever else). diff --git a/_darcs/pristine/doc/privacy b/_darcs/pristine/doc/privacy new file mode 100644 index 0000000000..90c7b3c7fb --- /dev/null +++ b/_darcs/pristine/doc/privacy @@ -0,0 +1,45 @@ +This document outlines this service's respect for your personal +privacy as a user of the service. + +- Almost all the text and files that users upload to this site is + available under the site license (see the license block at the bottom + of this page). Users agree to the license when they register to use + the site for the first time. Typically that means that the data can + be copied far and wide, for commercial and non-commercial purposes, + and in modified or unmodified form. If you're not OK with that, + don't use the service. +- The following data items are considered *private data* that won't be + shared with other users, business partners, or the public at large: + * your password + * your email address + * your IM address (AIM, Jabber, or other instant messaging address) + * your phone number + * your "private messages" + * your login credentials (username and password) for other services (Twitter, Facebook, etc.) +- Some private data may be published in aggregate, e.g. "30% of our + users are registered with Hotmail addresses." +- Your notices (including files) can be downloaded and re-used by + other services, either one-by-one or in bulk as + [RSS](http://en.wikipedia.org/wiki/RSS) files. +- Your profile information (including subscriptions and avatars) can be + downloaded and re-used by other services, either scraped from the HTML + interface or in bulk as [FOAF](http://en.wikipedia.org/wiki/FOAF) files. +- Your notices will be forwarded to users who subscribe to them, + including users on another microblogging service. +- Your profile information will be sent to microblogging services for + users who subscribe to you or to whom you subscribe. +- Based on your email preferences, you may receive automated email + messages for important system events, such as when others subscribe + to your notices. +- Based on your email preferences, you may receive an email + newsletter. You can opt out of the newsletter if you don't want to + receive it. +- In urgent situations, administrators may send you email directly to + your registered email address, even if you've requested no notices + or newsletter. *Administrators will use digitally-signed email.* +- This service will comply with court orders to turn over your private + information. + + + + diff --git a/_darcs/pristine/doc/source b/_darcs/pristine/doc/source new file mode 100644 index 0000000000..83debbe539 --- /dev/null +++ b/_darcs/pristine/doc/source @@ -0,0 +1,12 @@ +This service uses a Free microblogging tool called **Laconica**. +Laconica is available under the [GNU Affero General Public License +Version 3.0](http://www.fsf.org/licensing/licenses/agpl-3.0.html), a +Free Software license for network services. + +You can get a copy of the software from the +[Laconica](http://laconi.ca/) main site. The version of the software +that runs on *this* site is unmodified from that version. The site +also depends on certain libraries and other software; you can get +those at the Laconica site, too. + + diff --git a/_darcs/pristine/extlib/Apache2.0.txt b/_darcs/pristine/extlib/Apache2.0.txt new file mode 100644 index 0000000000..d645695673 --- /dev/null +++ b/_darcs/pristine/extlib/Apache2.0.txt @@ -0,0 +1,202 @@ + + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright [yyyy] [name of copyright owner] + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. diff --git a/_darcs/pristine/extlib/Auth/OpenID.php b/_darcs/pristine/extlib/Auth/OpenID.php new file mode 100644 index 0000000000..6a6e54f8b7 --- /dev/null +++ b/_darcs/pristine/extlib/Auth/OpenID.php @@ -0,0 +1,552 @@ + + * @copyright 2005-2008 Janrain, Inc. + * @license http://www.apache.org/licenses/LICENSE-2.0 Apache + */ + +/** + * The library version string + */ +define('Auth_OpenID_VERSION', '2.1.1'); + +/** + * Require the fetcher code. + */ +require_once "Auth/Yadis/PlainHTTPFetcher.php"; +require_once "Auth/Yadis/ParanoidHTTPFetcher.php"; +require_once "Auth/OpenID/BigMath.php"; +require_once "Auth/OpenID/URINorm.php"; + +/** + * Status code returned by the server when the only option is to show + * an error page, since we do not have enough information to redirect + * back to the consumer. The associated value is an error message that + * should be displayed on an HTML error page. + * + * @see Auth_OpenID_Server + */ +define('Auth_OpenID_LOCAL_ERROR', 'local_error'); + +/** + * Status code returned when there is an error to return in key-value + * form to the consumer. The caller should return a 400 Bad Request + * response with content-type text/plain and the value as the body. + * + * @see Auth_OpenID_Server + */ +define('Auth_OpenID_REMOTE_ERROR', 'remote_error'); + +/** + * Status code returned when there is a key-value form OK response to + * the consumer. The value associated with this code is the + * response. The caller should return a 200 OK response with + * content-type text/plain and the value as the body. + * + * @see Auth_OpenID_Server + */ +define('Auth_OpenID_REMOTE_OK', 'remote_ok'); + +/** + * Status code returned when there is a redirect back to the + * consumer. The value is the URL to redirect back to. The caller + * should return a 302 Found redirect with a Location: header + * containing the URL. + * + * @see Auth_OpenID_Server + */ +define('Auth_OpenID_REDIRECT', 'redirect'); + +/** + * Status code returned when the caller needs to authenticate the + * user. The associated value is a {@link Auth_OpenID_ServerRequest} + * object that can be used to complete the authentication. If the user + * has taken some authentication action, use the retry() method of the + * {@link Auth_OpenID_ServerRequest} object to complete the request. + * + * @see Auth_OpenID_Server + */ +define('Auth_OpenID_DO_AUTH', 'do_auth'); + +/** + * Status code returned when there were no OpenID arguments + * passed. This code indicates that the caller should return a 200 OK + * response and display an HTML page that says that this is an OpenID + * server endpoint. + * + * @see Auth_OpenID_Server + */ +define('Auth_OpenID_DO_ABOUT', 'do_about'); + +/** + * Defines for regexes and format checking. + */ +define('Auth_OpenID_letters', + "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"); + +define('Auth_OpenID_digits', + "0123456789"); + +define('Auth_OpenID_punct', + "!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~"); + +if (Auth_OpenID_getMathLib() === null) { + Auth_OpenID_setNoMathSupport(); +} + +/** + * The OpenID utility function class. + * + * @package OpenID + * @access private + */ +class Auth_OpenID { + + /** + * Return true if $thing is an Auth_OpenID_FailureResponse object; + * false if not. + * + * @access private + */ + function isFailure($thing) + { + return is_a($thing, 'Auth_OpenID_FailureResponse'); + } + + /** + * Gets the query data from the server environment based on the + * request method used. If GET was used, this looks at + * $_SERVER['QUERY_STRING'] directly. If POST was used, this + * fetches data from the special php://input file stream. + * + * Returns an associative array of the query arguments. + * + * Skips invalid key/value pairs (i.e. keys with no '=value' + * portion). + * + * Returns an empty array if neither GET nor POST was used, or if + * POST was used but php://input cannot be opened. + * + * @access private + */ + function getQuery($query_str=null) + { + $data = array(); + + if ($query_str !== null) { + $data = Auth_OpenID::params_from_string($query_str); + } else if (!array_key_exists('REQUEST_METHOD', $_SERVER)) { + // Do nothing. + } else { + // XXX HACK FIXME HORRIBLE. + // + // POSTing to a URL with query parameters is acceptable, but + // we don't have a clean way to distinguish those parameters + // when we need to do things like return_to verification + // which only want to look at one kind of parameter. We're + // going to emulate the behavior of some other environments + // by defaulting to GET and overwriting with POST if POST + // data is available. + $data = Auth_OpenID::params_from_string($_SERVER['QUERY_STRING']); + + if ($_SERVER['REQUEST_METHOD'] == 'POST') { + $str = file_get_contents('php://input'); + + if ($str === false) { + $post = array(); + } else { + $post = Auth_OpenID::params_from_string($str); + } + + $data = array_merge($data, $post); + } + } + + return $data; + } + + function params_from_string($str) + { + $chunks = explode("&", $str); + + $data = array(); + foreach ($chunks as $chunk) { + $parts = explode("=", $chunk, 2); + + if (count($parts) != 2) { + continue; + } + + list($k, $v) = $parts; + $data[$k] = urldecode($v); + } + + return $data; + } + + /** + * Create dir_name as a directory if it does not exist. If it + * exists, make sure that it is, in fact, a directory. Returns + * true if the operation succeeded; false if not. + * + * @access private + */ + function ensureDir($dir_name) + { + if (is_dir($dir_name) || @mkdir($dir_name)) { + return true; + } else { + $parent_dir = dirname($dir_name); + + // Terminal case; there is no parent directory to create. + if ($parent_dir == $dir_name) { + return true; + } + + return (Auth_OpenID::ensureDir($parent_dir) && @mkdir($dir_name)); + } + } + + /** + * Adds a string prefix to all values of an array. Returns a new + * array containing the prefixed values. + * + * @access private + */ + function addPrefix($values, $prefix) + { + $new_values = array(); + foreach ($values as $s) { + $new_values[] = $prefix . $s; + } + return $new_values; + } + + /** + * Convenience function for getting array values. Given an array + * $arr and a key $key, get the corresponding value from the array + * or return $default if the key is absent. + * + * @access private + */ + function arrayGet($arr, $key, $fallback = null) + { + if (is_array($arr)) { + if (array_key_exists($key, $arr)) { + return $arr[$key]; + } else { + return $fallback; + } + } else { + trigger_error("Auth_OpenID::arrayGet (key = ".$key.") expected " . + "array as first parameter, got " . + gettype($arr), E_USER_WARNING); + + return false; + } + } + + /** + * Replacement for PHP's broken parse_str. + */ + function parse_str($query) + { + if ($query === null) { + return null; + } + + $parts = explode('&', $query); + + $new_parts = array(); + for ($i = 0; $i < count($parts); $i++) { + $pair = explode('=', $parts[$i]); + + if (count($pair) != 2) { + continue; + } + + list($key, $value) = $pair; + $new_parts[$key] = urldecode($value); + } + + return $new_parts; + } + + /** + * Implements the PHP 5 'http_build_query' functionality. + * + * @access private + * @param array $data Either an array key/value pairs or an array + * of arrays, each of which holding two values: a key and a value, + * sequentially. + * @return string $result The result of url-encoding the key/value + * pairs from $data into a URL query string + * (e.g. "username=bob&id=56"). + */ + function httpBuildQuery($data) + { + $pairs = array(); + foreach ($data as $key => $value) { + if (is_array($value)) { + $pairs[] = urlencode($value[0])."=".urlencode($value[1]); + } else { + $pairs[] = urlencode($key)."=".urlencode($value); + } + } + return implode("&", $pairs); + } + + /** + * "Appends" query arguments onto a URL. The URL may or may not + * already have arguments (following a question mark). + * + * @access private + * @param string $url A URL, which may or may not already have + * arguments. + * @param array $args Either an array key/value pairs or an array of + * arrays, each of which holding two values: a key and a value, + * sequentially. If $args is an ordinary key/value array, the + * parameters will be added to the URL in sorted alphabetical order; + * if $args is an array of arrays, their order will be preserved. + * @return string $url The original URL with the new parameters added. + * + */ + function appendArgs($url, $args) + { + if (count($args) == 0) { + return $url; + } + + // Non-empty array; if it is an array of arrays, use + // multisort; otherwise use sort. + if (array_key_exists(0, $args) && + is_array($args[0])) { + // Do nothing here. + } else { + $keys = array_keys($args); + sort($keys); + $new_args = array(); + foreach ($keys as $key) { + $new_args[] = array($key, $args[$key]); + } + $args = $new_args; + } + + $sep = '?'; + if (strpos($url, '?') !== false) { + $sep = '&'; + } + + return $url . $sep . Auth_OpenID::httpBuildQuery($args); + } + + /** + * Implements python's urlunparse, which is not available in PHP. + * Given the specified components of a URL, this function rebuilds + * and returns the URL. + * + * @access private + * @param string $scheme The scheme (e.g. 'http'). Defaults to 'http'. + * @param string $host The host. Required. + * @param string $port The port. + * @param string $path The path. + * @param string $query The query. + * @param string $fragment The fragment. + * @return string $url The URL resulting from assembling the + * specified components. + */ + function urlunparse($scheme, $host, $port = null, $path = '/', + $query = '', $fragment = '') + { + + if (!$scheme) { + $scheme = 'http'; + } + + if (!$host) { + return false; + } + + if (!$path) { + $path = ''; + } + + $result = $scheme . "://" . $host; + + if ($port) { + $result .= ":" . $port; + } + + $result .= $path; + + if ($query) { + $result .= "?" . $query; + } + + if ($fragment) { + $result .= "#" . $fragment; + } + + return $result; + } + + /** + * Given a URL, this "normalizes" it by adding a trailing slash + * and / or a leading http:// scheme where necessary. Returns + * null if the original URL is malformed and cannot be normalized. + * + * @access private + * @param string $url The URL to be normalized. + * @return mixed $new_url The URL after normalization, or null if + * $url was malformed. + */ + function normalizeUrl($url) + { + @$parsed = parse_url($url); + + if (!$parsed) { + return null; + } + + if (isset($parsed['scheme']) && + isset($parsed['host'])) { + $scheme = strtolower($parsed['scheme']); + if (!in_array($scheme, array('http', 'https'))) { + return null; + } + } else { + $url = 'http://' . $url; + } + + $normalized = Auth_OpenID_urinorm($url); + if ($normalized === null) { + return null; + } + list($defragged, $frag) = Auth_OpenID::urldefrag($normalized); + return $defragged; + } + + /** + * Replacement (wrapper) for PHP's intval() because it's broken. + * + * @access private + */ + function intval($value) + { + $re = "/^\\d+$/"; + + if (!preg_match($re, $value)) { + return false; + } + + return intval($value); + } + + /** + * Count the number of bytes in a string independently of + * multibyte support conditions. + * + * @param string $str The string of bytes to count. + * @return int The number of bytes in $str. + */ + function bytes($str) + { + return strlen(bin2hex($str)) / 2; + } + + /** + * Get the bytes in a string independently of multibyte support + * conditions. + */ + function toBytes($str) + { + $hex = bin2hex($str); + + if (!$hex) { + return array(); + } + + $b = array(); + for ($i = 0; $i < strlen($hex); $i += 2) { + $b[] = chr(base_convert(substr($hex, $i, 2), 16, 10)); + } + + return $b; + } + + function urldefrag($url) + { + $parts = explode("#", $url, 2); + + if (count($parts) == 1) { + return array($parts[0], ""); + } else { + return $parts; + } + } + + function filter($callback, &$sequence) + { + $result = array(); + + foreach ($sequence as $item) { + if (call_user_func_array($callback, array($item))) { + $result[] = $item; + } + } + + return $result; + } + + function update(&$dest, &$src) + { + foreach ($src as $k => $v) { + $dest[$k] = $v; + } + } + + /** + * Wrap PHP's standard error_log functionality. Use this to + * perform all logging. It will interpolate any additional + * arguments into the format string before logging. + * + * @param string $format_string The sprintf format for the message + */ + function log($format_string) + { + $args = func_get_args(); + $message = call_user_func_array('sprintf', $args); + error_log($message); + } + + function autoSubmitHTML($form, $title="OpenId transaction in progress") + { + return("". + "". + $title . + "". + "". + $form . + "". + "". + ""); + } +} +?> diff --git a/_darcs/pristine/extlib/Auth/OpenID/AX.php b/_darcs/pristine/extlib/Auth/OpenID/AX.php new file mode 100644 index 0000000000..4a617ae30c --- /dev/null +++ b/_darcs/pristine/extlib/Auth/OpenID/AX.php @@ -0,0 +1,1023 @@ +message = $message; + } +} + +/** + * Abstract class containing common code for attribute exchange + * messages. + * + * @package OpenID + */ +class Auth_OpenID_AX_Message extends Auth_OpenID_Extension { + /** + * ns_alias: The preferred namespace alias for attribute exchange + * messages + */ + var $ns_alias = 'ax'; + + /** + * mode: The type of this attribute exchange message. This must be + * overridden in subclasses. + */ + var $mode = null; + + var $ns_uri = Auth_OpenID_AX_NS_URI; + + /** + * Return Auth_OpenID_AX_Error if the mode in the attribute + * exchange arguments does not match what is expected for this + * class; true otherwise. + * + * @access private + */ + function _checkMode($ax_args) + { + $mode = Auth_OpenID::arrayGet($ax_args, 'mode'); + if ($mode != $this->mode) { + return new Auth_OpenID_AX_Error( + sprintf( + "Expected mode '%s'; got '%s'", + $this->mode, $mode)); + } + + return true; + } + + /** + * Return a set of attribute exchange arguments containing the + * basic information that must be in every attribute exchange + * message. + * + * @access private + */ + function _newArgs() + { + return array('mode' => $this->mode); + } +} + +/** + * Represents a single attribute in an attribute exchange + * request. This should be added to an AXRequest object in order to + * request the attribute. + * + * @package OpenID + */ +class Auth_OpenID_AX_AttrInfo { + /** + * Construct an attribute information object. Do not call this + * directly; call make(...) instead. + * + * @param string $type_uri The type URI for this attribute. + * + * @param int $count The number of values of this type to request. + * + * @param bool $required Whether the attribute will be marked as + * required in the request. + * + * @param string $alias The name that should be given to this + * attribute in the request. + */ + function Auth_OpenID_AX_AttrInfo($type_uri, $count, $required, + $alias) + { + /** + * required: Whether the attribute will be marked as required + * when presented to the subject of the attribute exchange + * request. + */ + $this->required = $required; + + /** + * count: How many values of this type to request from the + * subject. Defaults to one. + */ + $this->count = $count; + + /** + * type_uri: The identifier that determines what the attribute + * represents and how it is serialized. For example, one type + * URI representing dates could represent a Unix timestamp in + * base 10 and another could represent a human-readable + * string. + */ + $this->type_uri = $type_uri; + + /** + * alias: The name that should be given to this attribute in + * the request. If it is not supplied, a generic name will be + * assigned. For example, if you want to call a Unix timestamp + * value 'tstamp', set its alias to that value. If two + * attributes in the same message request to use the same + * alias, the request will fail to be generated. + */ + $this->alias = $alias; + } + + /** + * Construct an attribute information object. For parameter + * details, see the constructor. + */ + function make($type_uri, $count=1, $required=false, + $alias=null) + { + if ($alias !== null) { + $result = Auth_OpenID_AX_checkAlias($alias); + + if (Auth_OpenID_AX::isError($result)) { + return $result; + } + } + + return new Auth_OpenID_AX_AttrInfo($type_uri, $count, $required, + $alias); + } + + /** + * When processing a request for this attribute, the OP should + * call this method to determine whether all available attribute + * values were requested. If self.count == UNLIMITED_VALUES, this + * returns True. Otherwise this returns False, in which case + * self.count is an integer. + */ + function wantsUnlimitedValues() + { + return $this->count === Auth_OpenID_AX_UNLIMITED_VALUES; + } +} + +/** + * Given a namespace mapping and a string containing a comma-separated + * list of namespace aliases, return a list of type URIs that + * correspond to those aliases. + * + * @param $namespace_map The mapping from namespace URI to alias + * @param $alias_list_s The string containing the comma-separated + * list of aliases. May also be None for convenience. + * + * @return $seq The list of namespace URIs that corresponds to the + * supplied list of aliases. If the string was zero-length or None, an + * empty list will be returned. + * + * return null If an alias is present in the list of aliases but + * is not present in the namespace map. + */ +function Auth_OpenID_AX_toTypeURIs(&$namespace_map, $alias_list_s) +{ + $uris = array(); + + if ($alias_list_s) { + foreach (explode(',', $alias_list_s) as $alias) { + $type_uri = $namespace_map->getNamespaceURI($alias); + if ($type_uri === null) { + // raise KeyError( + // 'No type is defined for attribute name %r' % (alias,)) + return new Auth_OpenID_AX_Error( + sprintf('No type is defined for attribute name %s', + $alias) + ); + } else { + $uris[] = $type_uri; + } + } + } + + return $uris; +} + +/** + * An attribute exchange 'fetch_request' message. This message is sent + * by a relying party when it wishes to obtain attributes about the + * subject of an OpenID authentication request. + * + * @package OpenID + */ +class Auth_OpenID_AX_FetchRequest extends Auth_OpenID_AX_Message { + + var $mode = 'fetch_request'; + + function Auth_OpenID_AX_FetchRequest($update_url=null) + { + /** + * requested_attributes: The attributes that have been + * requested thus far, indexed by the type URI. + */ + $this->requested_attributes = array(); + + /** + * update_url: A URL that will accept responses for this + * attribute exchange request, even in the absence of the user + * who made this request. + */ + $this->update_url = $update_url; + } + + /** + * Add an attribute to this attribute exchange request. + * + * @param attribute: The attribute that is being requested + * @return true on success, false when the requested attribute is + * already present in this fetch request. + */ + function add($attribute) + { + if ($this->contains($attribute->type_uri)) { + return new Auth_OpenID_AX_Error( + sprintf("The attribute %s has already been requested", + $attribute->type_uri)); + } + + $this->requested_attributes[$attribute->type_uri] = $attribute; + + return true; + } + + /** + * Get the serialized form of this attribute fetch request. + * + * @returns Auth_OpenID_AX_FetchRequest The fetch request message parameters + */ + function getExtensionArgs() + { + $aliases = new Auth_OpenID_NamespaceMap(); + + $required = array(); + $if_available = array(); + + $ax_args = $this->_newArgs(); + + foreach ($this->requested_attributes as $type_uri => $attribute) { + if ($attribute->alias === null) { + $alias = $aliases->add($type_uri); + } else { + $alias = $aliases->addAlias($type_uri, $attribute->alias); + + if ($alias === null) { + return new Auth_OpenID_AX_Error( + sprintf("Could not add alias %s for URI %s", + $attribute->alias, $type_uri + )); + } + } + + if ($attribute->required) { + $required[] = $alias; + } else { + $if_available[] = $alias; + } + + if ($attribute->count != 1) { + $ax_args['count.' . $alias] = strval($attribute->count); + } + + $ax_args['type.' . $alias] = $type_uri; + } + + if ($required) { + $ax_args['required'] = implode(',', $required); + } + + if ($if_available) { + $ax_args['if_available'] = implode(',', $if_available); + } + + return $ax_args; + } + + /** + * Get the type URIs for all attributes that have been marked as + * required. + * + * @return A list of the type URIs for attributes that have been + * marked as required. + */ + function getRequiredAttrs() + { + $required = array(); + foreach ($this->requested_attributes as $type_uri => $attribute) { + if ($attribute->required) { + $required[] = $type_uri; + } + } + + return $required; + } + + /** + * Extract a FetchRequest from an OpenID message + * + * @param request: The OpenID request containing the attribute + * fetch request + * + * @returns mixed An Auth_OpenID_AX_Error or the + * Auth_OpenID_AX_FetchRequest extracted from the request message if + * successful + */ + function &fromOpenIDRequest($request) + { + $m = $request->message; + $obj = new Auth_OpenID_AX_FetchRequest(); + $ax_args = $m->getArgs($obj->ns_uri); + + $result = $obj->parseExtensionArgs($ax_args); + + if (Auth_OpenID_AX::isError($result)) { + return $result; + } + + if ($obj->update_url) { + // Update URL must match the openid.realm of the + // underlying OpenID 2 message. + $realm = $m->getArg(Auth_OpenID_OPENID_NS, 'realm', + $m->getArg( + Auth_OpenID_OPENID_NS, + 'return_to')); + + if (!$realm) { + $obj = new Auth_OpenID_AX_Error( + sprintf("Cannot validate update_url %s " . + "against absent realm", $obj->update_url)); + } else if (!Auth_OpenID_TrustRoot::match($realm, + $obj->update_url)) { + $obj = new Auth_OpenID_AX_Error( + sprintf("Update URL %s failed validation against realm %s", + $obj->update_url, $realm)); + } + } + + return $obj; + } + + /** + * Given attribute exchange arguments, populate this FetchRequest. + * + * @return $result Auth_OpenID_AX_Error if the data to be parsed + * does not follow the attribute exchange specification. At least + * when 'if_available' or 'required' is not specified for a + * particular attribute type. Returns true otherwise. + */ + function parseExtensionArgs($ax_args) + { + $result = $this->_checkMode($ax_args); + if (Auth_OpenID_AX::isError($result)) { + return $result; + } + + $aliases = new Auth_OpenID_NamespaceMap(); + + foreach ($ax_args as $key => $value) { + if (strpos($key, 'type.') === 0) { + $alias = substr($key, 5); + $type_uri = $value; + + $alias = $aliases->addAlias($type_uri, $alias); + + if ($alias === null) { + return new Auth_OpenID_AX_Error( + sprintf("Could not add alias %s for URI %s", + $alias, $type_uri) + ); + } + + $count_s = Auth_OpenID::arrayGet($ax_args, 'count.' . $alias); + if ($count_s) { + $count = Auth_OpenID::intval($count_s); + if (($count === false) && + ($count_s === Auth_OpenID_AX_UNLIMITED_VALUES)) { + $count = $count_s; + } + } else { + $count = 1; + } + + if ($count === false) { + return new Auth_OpenID_AX_Error( + sprintf("Integer value expected for %s, got %s", + 'count.' . $alias, $count_s)); + } + + $attrinfo = Auth_OpenID_AX_AttrInfo::make($type_uri, $count, + false, $alias); + + if (Auth_OpenID_AX::isError($attrinfo)) { + return $attrinfo; + } + + $this->add($attrinfo); + } + } + + $required = Auth_OpenID_AX_toTypeURIs($aliases, + Auth_OpenID::arrayGet($ax_args, 'required')); + + foreach ($required as $type_uri) { + $attrib =& $this->requested_attributes[$type_uri]; + $attrib->required = true; + } + + $if_available = Auth_OpenID_AX_toTypeURIs($aliases, + Auth_OpenID::arrayGet($ax_args, 'if_available')); + + $all_type_uris = array_merge($required, $if_available); + + foreach ($aliases->iterNamespaceURIs() as $type_uri) { + if (!in_array($type_uri, $all_type_uris)) { + return new Auth_OpenID_AX_Error( + sprintf('Type URI %s was in the request but not ' . + 'present in "required" or "if_available"', + $type_uri)); + + } + } + + $this->update_url = Auth_OpenID::arrayGet($ax_args, 'update_url'); + + return true; + } + + /** + * Iterate over the AttrInfo objects that are contained in this + * fetch_request. + */ + function iterAttrs() + { + return array_values($this->requested_attributes); + } + + function iterTypes() + { + return array_keys($this->requested_attributes); + } + + /** + * Is the given type URI present in this fetch_request? + */ + function contains($type_uri) + { + return in_array($type_uri, $this->iterTypes()); + } +} + +/** + * An abstract class that implements a message that has attribute keys + * and values. It contains the common code between fetch_response and + * store_request. + * + * @package OpenID + */ +class Auth_OpenID_AX_KeyValueMessage extends Auth_OpenID_AX_Message { + + function Auth_OpenID_AX_KeyValueMessage() + { + $this->data = array(); + } + + /** + * Add a single value for the given attribute type to the + * message. If there are already values specified for this type, + * this value will be sent in addition to the values already + * specified. + * + * @param type_uri: The URI for the attribute + * @param value: The value to add to the response to the relying + * party for this attribute + * @return null + */ + function addValue($type_uri, $value) + { + if (!array_key_exists($type_uri, $this->data)) { + $this->data[$type_uri] = array(); + } + + $values =& $this->data[$type_uri]; + $values[] = $value; + } + + /** + * Set the values for the given attribute type. This replaces any + * values that have already been set for this attribute. + * + * @param type_uri: The URI for the attribute + * @param values: A list of values to send for this attribute. + */ + function setValues($type_uri, &$values) + { + $this->data[$type_uri] =& $values; + } + + /** + * Get the extension arguments for the key/value pairs contained + * in this message. + * + * @param aliases: An alias mapping. Set to None if you don't care + * about the aliases for this request. + * + * @access private + */ + function _getExtensionKVArgs(&$aliases) + { + if ($aliases === null) { + $aliases = new Auth_OpenID_NamespaceMap(); + } + + $ax_args = array(); + + foreach ($this->data as $type_uri => $values) { + $alias = $aliases->add($type_uri); + + $ax_args['type.' . $alias] = $type_uri; + $ax_args['count.' . $alias] = strval(count($values)); + + foreach ($values as $i => $value) { + $key = sprintf('value.%s.%d', $alias, $i + 1); + $ax_args[$key] = $value; + } + } + + return $ax_args; + } + + /** + * Parse attribute exchange key/value arguments into this object. + * + * @param ax_args: The attribute exchange fetch_response + * arguments, with namespacing removed. + * + * @return Auth_OpenID_AX_Error or true + */ + function parseExtensionArgs($ax_args) + { + $result = $this->_checkMode($ax_args); + if (Auth_OpenID_AX::isError($result)) { + return $result; + } + + $aliases = new Auth_OpenID_NamespaceMap(); + + foreach ($ax_args as $key => $value) { + if (strpos($key, 'type.') === 0) { + $type_uri = $value; + $alias = substr($key, 5); + + $result = Auth_OpenID_AX_checkAlias($alias); + + if (Auth_OpenID_AX::isError($result)) { + return $result; + } + + $alias = $aliases->addAlias($type_uri, $alias); + + if ($alias === null) { + return new Auth_OpenID_AX_Error( + sprintf("Could not add alias %s for URI %s", + $alias, $type_uri) + ); + } + } + } + + foreach ($aliases->iteritems() as $pair) { + list($type_uri, $alias) = $pair; + + if (array_key_exists('count.' . $alias, $ax_args)) { + + $count_key = 'count.' . $alias; + $count_s = $ax_args[$count_key]; + + $count = Auth_OpenID::intval($count_s); + + if ($count === false) { + return new Auth_OpenID_AX_Error( + sprintf("Integer value expected for %s, got %s", + 'count. %s' . $alias, $count_s, + Auth_OpenID_AX_UNLIMITED_VALUES) + ); + } + + $values = array(); + for ($i = 1; $i < $count + 1; $i++) { + $value_key = sprintf('value.%s.%d', $alias, $i); + + if (!array_key_exists($value_key, $ax_args)) { + return new Auth_OpenID_AX_Error( + sprintf( + "No value found for key %s", + $value_key)); + } + + $value = $ax_args[$value_key]; + $values[] = $value; + } + } else { + $key = 'value.' . $alias; + + if (!array_key_exists($key, $ax_args)) { + return new Auth_OpenID_AX_Error( + sprintf( + "No value found for key %s", + $key)); + } + + $value = $ax_args['value.' . $alias]; + + if ($value == '') { + $values = array(); + } else { + $values = array($value); + } + } + + $this->data[$type_uri] = $values; + } + + return true; + } + + /** + * Get a single value for an attribute. If no value was sent for + * this attribute, use the supplied default. If there is more than + * one value for this attribute, this method will fail. + * + * @param type_uri: The URI for the attribute + * @param default: The value to return if the attribute was not + * sent in the fetch_response. + * + * @return $value Auth_OpenID_AX_Error on failure or the value of + * the attribute in the fetch_response message, or the default + * supplied + */ + function getSingle($type_uri, $default=null) + { + $values = Auth_OpenID::arrayGet($this->data, $type_uri); + if (!$values) { + return $default; + } else if (count($values) == 1) { + return $values[0]; + } else { + return new Auth_OpenID_AX_Error( + sprintf('More than one value present for %s', + $type_uri) + ); + } + } + + /** + * Get the list of values for this attribute in the + * fetch_response. + * + * XXX: what to do if the values are not present? default + * parameter? this is funny because it's always supposed to return + * a list, so the default may break that, though it's provided by + * the user's code, so it might be okay. If no default is + * supplied, should the return be None or []? + * + * @param type_uri: The URI of the attribute + * + * @return $values The list of values for this attribute in the + * response. May be an empty list. If the attribute was not sent + * in the response, returns Auth_OpenID_AX_Error. + */ + function get($type_uri) + { + if (array_key_exists($type_uri, $this->data)) { + return $this->data[$type_uri]; + } else { + return new Auth_OpenID_AX_Error( + sprintf("Type URI %s not found in response", + $type_uri) + ); + } + } + + /** + * Get the number of responses for a particular attribute in this + * fetch_response message. + * + * @param type_uri: The URI of the attribute + * + * @returns int The number of values sent for this attribute. If + * the attribute was not sent in the response, returns + * Auth_OpenID_AX_Error. + */ + function count($type_uri) + { + if (array_key_exists($type_uri, $this->data)) { + return count($this->get($type_uri)); + } else { + return new Auth_OpenID_AX_Error( + sprintf("Type URI %s not found in response", + $type_uri) + ); + } + } +} + +/** + * A fetch_response attribute exchange message. + * + * @package OpenID + */ +class Auth_OpenID_AX_FetchResponse extends Auth_OpenID_AX_KeyValueMessage { + var $mode = 'fetch_response'; + + function Auth_OpenID_AX_FetchResponse($update_url=null) + { + $this->Auth_OpenID_AX_KeyValueMessage(); + $this->update_url = $update_url; + } + + /** + * Serialize this object into arguments in the attribute exchange + * namespace + * + * @return $args The dictionary of unqualified attribute exchange + * arguments that represent this fetch_response, or + * Auth_OpenID_AX_Error on error. + */ + function getExtensionArgs($request=null) + { + $aliases = new Auth_OpenID_NamespaceMap(); + + $zero_value_types = array(); + + if ($request !== null) { + // Validate the data in the context of the request (the + // same attributes should be present in each, and the + // counts in the response must be no more than the counts + // in the request) + + foreach ($this->data as $type_uri => $unused) { + if (!$request->contains($type_uri)) { + return new Auth_OpenID_AX_Error( + sprintf("Response attribute not present in request: %s", + $type_uri) + ); + } + } + + foreach ($request->iterAttrs() as $attr_info) { + // Copy the aliases from the request so that reading + // the response in light of the request is easier + if ($attr_info->alias === null) { + $aliases->add($attr_info->type_uri); + } else { + $alias = $aliases->addAlias($attr_info->type_uri, + $attr_info->alias); + + if ($alias === null) { + return new Auth_OpenID_AX_Error( + sprintf("Could not add alias %s for URI %s", + $attr_info->alias, $attr_info->type_uri) + ); + } + } + + if (array_key_exists($attr_info->type_uri, $this->data)) { + $values = $this->data[$attr_info->type_uri]; + } else { + $values = array(); + $zero_value_types[] = $attr_info; + } + + if (($attr_info->count != Auth_OpenID_AX_UNLIMITED_VALUES) && + ($attr_info->count < count($values))) { + return new Auth_OpenID_AX_Error( + sprintf("More than the number of requested values " . + "were specified for %s", + $attr_info->type_uri) + ); + } + } + } + + $kv_args = $this->_getExtensionKVArgs($aliases); + + // Add the KV args into the response with the args that are + // unique to the fetch_response + $ax_args = $this->_newArgs(); + + // For each requested attribute, put its type/alias and count + // into the response even if no data were returned. + foreach ($zero_value_types as $attr_info) { + $alias = $aliases->getAlias($attr_info->type_uri); + $kv_args['type.' . $alias] = $attr_info->type_uri; + $kv_args['count.' . $alias] = '0'; + } + + $update_url = null; + if ($request) { + $update_url = $request->update_url; + } else { + $update_url = $this->update_url; + } + + if ($update_url) { + $ax_args['update_url'] = $update_url; + } + + Auth_OpenID::update(&$ax_args, $kv_args); + + return $ax_args; + } + + /** + * @return $result Auth_OpenID_AX_Error on failure or true on + * success. + */ + function parseExtensionArgs($ax_args) + { + $result = parent::parseExtensionArgs($ax_args); + + if (Auth_OpenID_AX::isError($result)) { + return $result; + } + + $this->update_url = Auth_OpenID::arrayGet($ax_args, 'update_url'); + + return true; + } + + /** + * Construct a FetchResponse object from an OpenID library + * SuccessResponse object. + * + * @param success_response: A successful id_res response object + * + * @param signed: Whether non-signed args should be processsed. If + * True (the default), only signed arguments will be processsed. + * + * @return $response A FetchResponse containing the data from the + * OpenID message + */ + function fromSuccessResponse($success_response, $signed=true) + { + $obj = new Auth_OpenID_AX_FetchResponse(); + if ($signed) { + $ax_args = $success_response->getSignedNS($obj->ns_uri); + } else { + $ax_args = $success_response->message->getArgs($obj->ns_uri); + } + if ($ax_args === null || Auth_OpenID::isFailure($ax_args) || + sizeof($ax_args) == 0) { + return null; + } + + $result = $obj->parseExtensionArgs($ax_args); + if (Auth_OpenID_AX::isError($result)) { + #XXX log me + return null; + } + return $obj; + } +} + +/** + * A store request attribute exchange message representation. + * + * @package OpenID + */ +class Auth_OpenID_AX_StoreRequest extends Auth_OpenID_AX_KeyValueMessage { + var $mode = 'store_request'; + + /** + * @param array $aliases The namespace aliases to use when making + * this store response. Leave as None to use defaults. + */ + function getExtensionArgs($aliases=null) + { + $ax_args = $this->_newArgs(); + $kv_args = $this->_getExtensionKVArgs($aliases); + Auth_OpenID::update(&$ax_args, $kv_args); + return $ax_args; + } +} + +/** + * An indication that the store request was processed along with this + * OpenID transaction. Use make(), NOT the constructor, to create + * response objects. + * + * @package OpenID + */ +class Auth_OpenID_AX_StoreResponse extends Auth_OpenID_AX_Message { + var $SUCCESS_MODE = 'store_response_success'; + var $FAILURE_MODE = 'store_response_failure'; + + /** + * Returns Auth_OpenID_AX_Error on error or an + * Auth_OpenID_AX_StoreResponse object on success. + */ + function &make($succeeded=true, $error_message=null) + { + if (($succeeded) && ($error_message !== null)) { + return new Auth_OpenID_AX_Error('An error message may only be '. + 'included in a failing fetch response'); + } + + return new Auth_OpenID_AX_StoreResponse($succeeded, $error_message); + } + + function Auth_OpenID_AX_StoreResponse($succeeded=true, $error_message=null) + { + if ($succeeded) { + $this->mode = $this->SUCCESS_MODE; + } else { + $this->mode = $this->FAILURE_MODE; + } + + $this->error_message = $error_message; + } + + /** + * Was this response a success response? + */ + function succeeded() + { + return $this->mode == $this->SUCCESS_MODE; + } + + function getExtensionArgs() + { + $ax_args = $this->_newArgs(); + if ((!$this->succeeded()) && $this->error_message) { + $ax_args['error'] = $this->error_message; + } + + return $ax_args; + } +} + +?> \ No newline at end of file diff --git a/_darcs/pristine/extlib/Auth/OpenID/Association.php b/_darcs/pristine/extlib/Auth/OpenID/Association.php new file mode 100644 index 0000000000..37ce0cbf45 --- /dev/null +++ b/_darcs/pristine/extlib/Auth/OpenID/Association.php @@ -0,0 +1,613 @@ + + * @copyright 2005-2008 Janrain, Inc. + * @license http://www.apache.org/licenses/LICENSE-2.0 Apache + */ + +/** + * @access private + */ +require_once 'Auth/OpenID/CryptUtil.php'; + +/** + * @access private + */ +require_once 'Auth/OpenID/KVForm.php'; + +/** + * @access private + */ +require_once 'Auth/OpenID/HMAC.php'; + +/** + * This class represents an association between a server and a + * consumer. In general, users of this library will never see + * instances of this object. The only exception is if you implement a + * custom {@link Auth_OpenID_OpenIDStore}. + * + * If you do implement such a store, it will need to store the values + * of the handle, secret, issued, lifetime, and assoc_type instance + * variables. + * + * @package OpenID + */ +class Auth_OpenID_Association { + + /** + * This is a HMAC-SHA1 specific value. + * + * @access private + */ + var $SIG_LENGTH = 20; + + /** + * The ordering and name of keys as stored by serialize. + * + * @access private + */ + var $assoc_keys = array( + 'version', + 'handle', + 'secret', + 'issued', + 'lifetime', + 'assoc_type' + ); + + var $_macs = array( + 'HMAC-SHA1' => 'Auth_OpenID_HMACSHA1', + 'HMAC-SHA256' => 'Auth_OpenID_HMACSHA256' + ); + + /** + * This is an alternate constructor (factory method) used by the + * OpenID consumer library to create associations. OpenID store + * implementations shouldn't use this constructor. + * + * @access private + * + * @param integer $expires_in This is the amount of time this + * association is good for, measured in seconds since the + * association was issued. + * + * @param string $handle This is the handle the server gave this + * association. + * + * @param string secret This is the shared secret the server + * generated for this association. + * + * @param assoc_type This is the type of association this + * instance represents. The only valid values of this field at + * this time is 'HMAC-SHA1' and 'HMAC-SHA256', but new types may + * be defined in the future. + * + * @return association An {@link Auth_OpenID_Association} + * instance. + */ + function fromExpiresIn($expires_in, $handle, $secret, $assoc_type) + { + $issued = time(); + $lifetime = $expires_in; + return new Auth_OpenID_Association($handle, $secret, + $issued, $lifetime, $assoc_type); + } + + /** + * This is the standard constructor for creating an association. + * The library should create all of the necessary associations, so + * this constructor is not part of the external API. + * + * @access private + * + * @param string $handle This is the handle the server gave this + * association. + * + * @param string $secret This is the shared secret the server + * generated for this association. + * + * @param integer $issued This is the time this association was + * issued, in seconds since 00:00 GMT, January 1, 1970. (ie, a + * unix timestamp) + * + * @param integer $lifetime This is the amount of time this + * association is good for, measured in seconds since the + * association was issued. + * + * @param string $assoc_type This is the type of association this + * instance represents. The only valid values of this field at + * this time is 'HMAC-SHA1' and 'HMAC-SHA256', but new types may + * be defined in the future. + */ + function Auth_OpenID_Association( + $handle, $secret, $issued, $lifetime, $assoc_type) + { + if (!in_array($assoc_type, + Auth_OpenID_getSupportedAssociationTypes())) { + $fmt = 'Unsupported association type (%s)'; + trigger_error(sprintf($fmt, $assoc_type), E_USER_ERROR); + } + + $this->handle = $handle; + $this->secret = $secret; + $this->issued = $issued; + $this->lifetime = $lifetime; + $this->assoc_type = $assoc_type; + } + + /** + * This returns the number of seconds this association is still + * valid for, or 0 if the association is no longer valid. + * + * @return integer $seconds The number of seconds this association + * is still valid for, or 0 if the association is no longer valid. + */ + function getExpiresIn($now = null) + { + if ($now == null) { + $now = time(); + } + + return max(0, $this->issued + $this->lifetime - $now); + } + + /** + * This checks to see if two {@link Auth_OpenID_Association} + * instances represent the same association. + * + * @return bool $result true if the two instances represent the + * same association, false otherwise. + */ + function equal($other) + { + return ((gettype($this) == gettype($other)) + && ($this->handle == $other->handle) + && ($this->secret == $other->secret) + && ($this->issued == $other->issued) + && ($this->lifetime == $other->lifetime) + && ($this->assoc_type == $other->assoc_type)); + } + + /** + * Convert an association to KV form. + * + * @return string $result String in KV form suitable for + * deserialization by deserialize. + */ + function serialize() + { + $data = array( + 'version' => '2', + 'handle' => $this->handle, + 'secret' => base64_encode($this->secret), + 'issued' => strval(intval($this->issued)), + 'lifetime' => strval(intval($this->lifetime)), + 'assoc_type' => $this->assoc_type + ); + + assert(array_keys($data) == $this->assoc_keys); + + return Auth_OpenID_KVForm::fromArray($data, $strict = true); + } + + /** + * Parse an association as stored by serialize(). This is the + * inverse of serialize. + * + * @param string $assoc_s Association as serialized by serialize() + * @return Auth_OpenID_Association $result instance of this class + */ + function deserialize($class_name, $assoc_s) + { + $pairs = Auth_OpenID_KVForm::toArray($assoc_s, $strict = true); + $keys = array(); + $values = array(); + foreach ($pairs as $key => $value) { + if (is_array($value)) { + list($key, $value) = $value; + } + $keys[] = $key; + $values[] = $value; + } + + $class_vars = get_class_vars($class_name); + $class_assoc_keys = $class_vars['assoc_keys']; + + sort($keys); + sort($class_assoc_keys); + + if ($keys != $class_assoc_keys) { + trigger_error('Unexpected key values: ' . var_export($keys, true), + E_USER_WARNING); + return null; + } + + $version = $pairs['version']; + $handle = $pairs['handle']; + $secret = $pairs['secret']; + $issued = $pairs['issued']; + $lifetime = $pairs['lifetime']; + $assoc_type = $pairs['assoc_type']; + + if ($version != '2') { + trigger_error('Unknown version: ' . $version, E_USER_WARNING); + return null; + } + + $issued = intval($issued); + $lifetime = intval($lifetime); + $secret = base64_decode($secret); + + return new $class_name( + $handle, $secret, $issued, $lifetime, $assoc_type); + } + + /** + * Generate a signature for a sequence of (key, value) pairs + * + * @access private + * @param array $pairs The pairs to sign, in order. This is an + * array of two-tuples. + * @return string $signature The binary signature of this sequence + * of pairs + */ + function sign($pairs) + { + $kv = Auth_OpenID_KVForm::fromArray($pairs); + + /* Invalid association types should be caught at constructor */ + $callback = $this->_macs[$this->assoc_type]; + + return call_user_func_array($callback, array($this->secret, $kv)); + } + + /** + * Generate a signature for some fields in a dictionary + * + * @access private + * @param array $fields The fields to sign, in order; this is an + * array of strings. + * @param array $data Dictionary of values to sign (an array of + * string => string pairs). + * @return string $signature The signature, base64 encoded + */ + function signMessage($message) + { + if ($message->hasKey(Auth_OpenID_OPENID_NS, 'sig') || + $message->hasKey(Auth_OpenID_OPENID_NS, 'signed')) { + // Already has a sig + return null; + } + + $extant_handle = $message->getArg(Auth_OpenID_OPENID_NS, + 'assoc_handle'); + + if ($extant_handle && ($extant_handle != $this->handle)) { + // raise ValueError("Message has a different association handle") + return null; + } + + $signed_message = $message; + $signed_message->setArg(Auth_OpenID_OPENID_NS, 'assoc_handle', + $this->handle); + + $message_keys = array_keys($signed_message->toPostArgs()); + $signed_list = array(); + $signed_prefix = 'openid.'; + + foreach ($message_keys as $k) { + if (strpos($k, $signed_prefix) === 0) { + $signed_list[] = substr($k, strlen($signed_prefix)); + } + } + + $signed_list[] = 'signed'; + sort($signed_list); + + $signed_message->setArg(Auth_OpenID_OPENID_NS, 'signed', + implode(',', $signed_list)); + $sig = $this->getMessageSignature($signed_message); + $signed_message->setArg(Auth_OpenID_OPENID_NS, 'sig', $sig); + return $signed_message; + } + + /** + * Given a {@link Auth_OpenID_Message}, return the key/value pairs + * to be signed according to the signed list in the message. If + * the message lacks a signed list, return null. + * + * @access private + */ + function _makePairs(&$message) + { + $signed = $message->getArg(Auth_OpenID_OPENID_NS, 'signed'); + if (!$signed || Auth_OpenID::isFailure($signed)) { + // raise ValueError('Message has no signed list: %s' % (message,)) + return null; + } + + $signed_list = explode(',', $signed); + $pairs = array(); + $data = $message->toPostArgs(); + foreach ($signed_list as $field) { + $pairs[] = array($field, Auth_OpenID::arrayGet($data, + 'openid.' . + $field, '')); + } + return $pairs; + } + + /** + * Given an {@link Auth_OpenID_Message}, return the signature for + * the signed list in the message. + * + * @access private + */ + function getMessageSignature(&$message) + { + $pairs = $this->_makePairs($message); + return base64_encode($this->sign($pairs)); + } + + /** + * Confirm that the signature of these fields matches the + * signature contained in the data. + * + * @access private + */ + function checkMessageSignature(&$message) + { + $sig = $message->getArg(Auth_OpenID_OPENID_NS, + 'sig'); + + if (!$sig || Auth_OpenID::isFailure($sig)) { + return false; + } + + $calculated_sig = $this->getMessageSignature($message); + return $calculated_sig == $sig; + } +} + +function Auth_OpenID_getSecretSize($assoc_type) +{ + if ($assoc_type == 'HMAC-SHA1') { + return 20; + } else if ($assoc_type == 'HMAC-SHA256') { + return 32; + } else { + return null; + } +} + +function Auth_OpenID_getAllAssociationTypes() +{ + return array('HMAC-SHA1', 'HMAC-SHA256'); +} + +function Auth_OpenID_getSupportedAssociationTypes() +{ + $a = array('HMAC-SHA1'); + + if (Auth_OpenID_HMACSHA256_SUPPORTED) { + $a[] = 'HMAC-SHA256'; + } + + return $a; +} + +function Auth_OpenID_getSessionTypes($assoc_type) +{ + $assoc_to_session = array( + 'HMAC-SHA1' => array('DH-SHA1', 'no-encryption')); + + if (Auth_OpenID_HMACSHA256_SUPPORTED) { + $assoc_to_session['HMAC-SHA256'] = + array('DH-SHA256', 'no-encryption'); + } + + return Auth_OpenID::arrayGet($assoc_to_session, $assoc_type, array()); +} + +function Auth_OpenID_checkSessionType($assoc_type, $session_type) +{ + if (!in_array($session_type, + Auth_OpenID_getSessionTypes($assoc_type))) { + return false; + } + + return true; +} + +function Auth_OpenID_getDefaultAssociationOrder() +{ + $order = array(); + + if (!Auth_OpenID_noMathSupport()) { + $order[] = array('HMAC-SHA1', 'DH-SHA1'); + + if (Auth_OpenID_HMACSHA256_SUPPORTED) { + $order[] = array('HMAC-SHA256', 'DH-SHA256'); + } + } + + $order[] = array('HMAC-SHA1', 'no-encryption'); + + if (Auth_OpenID_HMACSHA256_SUPPORTED) { + $order[] = array('HMAC-SHA256', 'no-encryption'); + } + + return $order; +} + +function Auth_OpenID_getOnlyEncryptedOrder() +{ + $result = array(); + + foreach (Auth_OpenID_getDefaultAssociationOrder() as $pair) { + list($assoc, $session) = $pair; + + if ($session != 'no-encryption') { + if (Auth_OpenID_HMACSHA256_SUPPORTED && + ($assoc == 'HMAC-SHA256')) { + $result[] = $pair; + } else if ($assoc != 'HMAC-SHA256') { + $result[] = $pair; + } + } + } + + return $result; +} + +function &Auth_OpenID_getDefaultNegotiator() +{ + $x = new Auth_OpenID_SessionNegotiator( + Auth_OpenID_getDefaultAssociationOrder()); + return $x; +} + +function &Auth_OpenID_getEncryptedNegotiator() +{ + $x = new Auth_OpenID_SessionNegotiator( + Auth_OpenID_getOnlyEncryptedOrder()); + return $x; +} + +/** + * A session negotiator controls the allowed and preferred association + * types and association session types. Both the {@link + * Auth_OpenID_Consumer} and {@link Auth_OpenID_Server} use + * negotiators when creating associations. + * + * You can create and use negotiators if you: + + * - Do not want to do Diffie-Hellman key exchange because you use + * transport-layer encryption (e.g. SSL) + * + * - Want to use only SHA-256 associations + * + * - Do not want to support plain-text associations over a non-secure + * channel + * + * It is up to you to set a policy for what kinds of associations to + * accept. By default, the library will make any kind of association + * that is allowed in the OpenID 2.0 specification. + * + * Use of negotiators in the library + * ================================= + * + * When a consumer makes an association request, it calls {@link + * getAllowedType} to get the preferred association type and + * association session type. + * + * The server gets a request for a particular association/session type + * and calls {@link isAllowed} to determine if it should create an + * association. If it is supported, negotiation is complete. If it is + * not, the server calls {@link getAllowedType} to get an allowed + * association type to return to the consumer. + * + * If the consumer gets an error response indicating that the + * requested association/session type is not supported by the server + * that contains an assocation/session type to try, it calls {@link + * isAllowed} to determine if it should try again with the given + * combination of association/session type. + * + * @package OpenID + */ +class Auth_OpenID_SessionNegotiator { + function Auth_OpenID_SessionNegotiator($allowed_types) + { + $this->allowed_types = array(); + $this->setAllowedTypes($allowed_types); + } + + /** + * Set the allowed association types, checking to make sure each + * combination is valid. + * + * @access private + */ + function setAllowedTypes($allowed_types) + { + foreach ($allowed_types as $pair) { + list($assoc_type, $session_type) = $pair; + if (!Auth_OpenID_checkSessionType($assoc_type, $session_type)) { + return false; + } + } + + $this->allowed_types = $allowed_types; + return true; + } + + /** + * Add an association type and session type to the allowed types + * list. The assocation/session pairs are tried in the order that + * they are added. + * + * @access private + */ + function addAllowedType($assoc_type, $session_type = null) + { + if ($this->allowed_types === null) { + $this->allowed_types = array(); + } + + if ($session_type === null) { + $available = Auth_OpenID_getSessionTypes($assoc_type); + + if (!$available) { + return false; + } + + foreach ($available as $session_type) { + $this->addAllowedType($assoc_type, $session_type); + } + } else { + if (Auth_OpenID_checkSessionType($assoc_type, $session_type)) { + $this->allowed_types[] = array($assoc_type, $session_type); + } else { + return false; + } + } + + return true; + } + + // Is this combination of association type and session type allowed? + function isAllowed($assoc_type, $session_type) + { + $assoc_good = in_array(array($assoc_type, $session_type), + $this->allowed_types); + + $matches = in_array($session_type, + Auth_OpenID_getSessionTypes($assoc_type)); + + return ($assoc_good && $matches); + } + + /** + * Get a pair of assocation type and session type that are + * supported. + */ + function getAllowedType() + { + if (!$this->allowed_types) { + return array(null, null); + } + + return $this->allowed_types[0]; + } +} + +?> \ No newline at end of file diff --git a/_darcs/pristine/extlib/Auth/OpenID/BigMath.php b/_darcs/pristine/extlib/Auth/OpenID/BigMath.php new file mode 100644 index 0000000000..45104947d6 --- /dev/null +++ b/_darcs/pristine/extlib/Auth/OpenID/BigMath.php @@ -0,0 +1,471 @@ + + * @copyright 2005-2008 Janrain, Inc. + * @license http://www.apache.org/licenses/LICENSE-2.0 Apache + */ + +/** + * Needed for random number generation + */ +require_once 'Auth/OpenID/CryptUtil.php'; + +/** + * Need Auth_OpenID::bytes(). + */ +require_once 'Auth/OpenID.php'; + +/** + * The superclass of all big-integer math implementations + * @access private + * @package OpenID + */ +class Auth_OpenID_MathLibrary { + /** + * Given a long integer, returns the number converted to a binary + * string. This function accepts long integer values of arbitrary + * magnitude and uses the local large-number math library when + * available. + * + * @param integer $long The long number (can be a normal PHP + * integer or a number created by one of the available long number + * libraries) + * @return string $binary The binary version of $long + */ + function longToBinary($long) + { + $cmp = $this->cmp($long, 0); + if ($cmp < 0) { + $msg = __FUNCTION__ . " takes only positive integers."; + trigger_error($msg, E_USER_ERROR); + return null; + } + + if ($cmp == 0) { + return "\x00"; + } + + $bytes = array(); + + while ($this->cmp($long, 0) > 0) { + array_unshift($bytes, $this->mod($long, 256)); + $long = $this->div($long, pow(2, 8)); + } + + if ($bytes && ($bytes[0] > 127)) { + array_unshift($bytes, 0); + } + + $string = ''; + foreach ($bytes as $byte) { + $string .= pack('C', $byte); + } + + return $string; + } + + /** + * Given a binary string, returns the binary string converted to a + * long number. + * + * @param string $binary The binary version of a long number, + * probably as a result of calling longToBinary + * @return integer $long The long number equivalent of the binary + * string $str + */ + function binaryToLong($str) + { + if ($str === null) { + return null; + } + + // Use array_merge to return a zero-indexed array instead of a + // one-indexed array. + $bytes = array_merge(unpack('C*', $str)); + + $n = $this->init(0); + + if ($bytes && ($bytes[0] > 127)) { + trigger_error("bytesToNum works only for positive integers.", + E_USER_WARNING); + return null; + } + + foreach ($bytes as $byte) { + $n = $this->mul($n, pow(2, 8)); + $n = $this->add($n, $byte); + } + + return $n; + } + + function base64ToLong($str) + { + $b64 = base64_decode($str); + + if ($b64 === false) { + return false; + } + + return $this->binaryToLong($b64); + } + + function longToBase64($str) + { + return base64_encode($this->longToBinary($str)); + } + + /** + * Returns a random number in the specified range. This function + * accepts $start, $stop, and $step values of arbitrary magnitude + * and will utilize the local large-number math library when + * available. + * + * @param integer $start The start of the range, or the minimum + * random number to return + * @param integer $stop The end of the range, or the maximum + * random number to return + * @param integer $step The step size, such that $result - ($step + * * N) = $start for some N + * @return integer $result The resulting randomly-generated number + */ + function rand($stop) + { + static $duplicate_cache = array(); + + // Used as the key for the duplicate cache + $rbytes = $this->longToBinary($stop); + + if (array_key_exists($rbytes, $duplicate_cache)) { + list($duplicate, $nbytes) = $duplicate_cache[$rbytes]; + } else { + if ($rbytes[0] == "\x00") { + $nbytes = Auth_OpenID::bytes($rbytes) - 1; + } else { + $nbytes = Auth_OpenID::bytes($rbytes); + } + + $mxrand = $this->pow(256, $nbytes); + + // If we get a number less than this, then it is in the + // duplicated range. + $duplicate = $this->mod($mxrand, $stop); + + if (count($duplicate_cache) > 10) { + $duplicate_cache = array(); + } + + $duplicate_cache[$rbytes] = array($duplicate, $nbytes); + } + + do { + $bytes = "\x00" . Auth_OpenID_CryptUtil::getBytes($nbytes); + $n = $this->binaryToLong($bytes); + // Keep looping if this value is in the low duplicated range + } while ($this->cmp($n, $duplicate) < 0); + + return $this->mod($n, $stop); + } +} + +/** + * Exposes BCmath math library functionality. + * + * {@link Auth_OpenID_BcMathWrapper} wraps the functionality provided + * by the BCMath extension. + * + * @access private + * @package OpenID + */ +class Auth_OpenID_BcMathWrapper extends Auth_OpenID_MathLibrary{ + var $type = 'bcmath'; + + function add($x, $y) + { + return bcadd($x, $y); + } + + function sub($x, $y) + { + return bcsub($x, $y); + } + + function pow($base, $exponent) + { + return bcpow($base, $exponent); + } + + function cmp($x, $y) + { + return bccomp($x, $y); + } + + function init($number, $base = 10) + { + return $number; + } + + function mod($base, $modulus) + { + return bcmod($base, $modulus); + } + + function mul($x, $y) + { + return bcmul($x, $y); + } + + function div($x, $y) + { + return bcdiv($x, $y); + } + + /** + * Same as bcpowmod when bcpowmod is missing + * + * @access private + */ + function _powmod($base, $exponent, $modulus) + { + $square = $this->mod($base, $modulus); + $result = 1; + while($this->cmp($exponent, 0) > 0) { + if ($this->mod($exponent, 2)) { + $result = $this->mod($this->mul($result, $square), $modulus); + } + $square = $this->mod($this->mul($square, $square), $modulus); + $exponent = $this->div($exponent, 2); + } + return $result; + } + + function powmod($base, $exponent, $modulus) + { + if (function_exists('bcpowmod')) { + return bcpowmod($base, $exponent, $modulus); + } else { + return $this->_powmod($base, $exponent, $modulus); + } + } + + function toString($num) + { + return $num; + } +} + +/** + * Exposes GMP math library functionality. + * + * {@link Auth_OpenID_GmpMathWrapper} wraps the functionality provided + * by the GMP extension. + * + * @access private + * @package OpenID + */ +class Auth_OpenID_GmpMathWrapper extends Auth_OpenID_MathLibrary{ + var $type = 'gmp'; + + function add($x, $y) + { + return gmp_add($x, $y); + } + + function sub($x, $y) + { + return gmp_sub($x, $y); + } + + function pow($base, $exponent) + { + return gmp_pow($base, $exponent); + } + + function cmp($x, $y) + { + return gmp_cmp($x, $y); + } + + function init($number, $base = 10) + { + return gmp_init($number, $base); + } + + function mod($base, $modulus) + { + return gmp_mod($base, $modulus); + } + + function mul($x, $y) + { + return gmp_mul($x, $y); + } + + function div($x, $y) + { + return gmp_div_q($x, $y); + } + + function powmod($base, $exponent, $modulus) + { + return gmp_powm($base, $exponent, $modulus); + } + + function toString($num) + { + return gmp_strval($num); + } +} + +/** + * Define the supported extensions. An extension array has keys + * 'modules', 'extension', and 'class'. 'modules' is an array of PHP + * module names which the loading code will attempt to load. These + * values will be suffixed with a library file extension (e.g. ".so"). + * 'extension' is the name of a PHP extension which will be tested + * before 'modules' are loaded. 'class' is the string name of a + * {@link Auth_OpenID_MathWrapper} subclass which should be + * instantiated if a given extension is present. + * + * You can define new math library implementations and add them to + * this array. + */ +function Auth_OpenID_math_extensions() +{ + $result = array(); + + if (!defined('Auth_OpenID_BUGGY_GMP')) { + $result[] = + array('modules' => array('gmp', 'php_gmp'), + 'extension' => 'gmp', + 'class' => 'Auth_OpenID_GmpMathWrapper'); + } + + $result[] = array( + 'modules' => array('bcmath', 'php_bcmath'), + 'extension' => 'bcmath', + 'class' => 'Auth_OpenID_BcMathWrapper'); + + return $result; +} + +/** + * Detect which (if any) math library is available + */ +function Auth_OpenID_detectMathLibrary($exts) +{ + $loaded = false; + + foreach ($exts as $extension) { + // See if the extension specified is already loaded. + if ($extension['extension'] && + extension_loaded($extension['extension'])) { + $loaded = true; + } + + // Try to load dynamic modules. + if (!$loaded) { + foreach ($extension['modules'] as $module) { + if (@dl($module . "." . PHP_SHLIB_SUFFIX)) { + $loaded = true; + break; + } + } + } + + // If the load succeeded, supply an instance of + // Auth_OpenID_MathWrapper which wraps the specified + // module's functionality. + if ($loaded) { + return $extension; + } + } + + return false; +} + +/** + * {@link Auth_OpenID_getMathLib} checks for the presence of long + * number extension modules and returns an instance of + * {@link Auth_OpenID_MathWrapper} which exposes the module's + * functionality. + * + * Checks for the existence of an extension module described by the + * result of {@link Auth_OpenID_math_extensions()} and returns an + * instance of a wrapper for that extension module. If no extension + * module is found, an instance of {@link Auth_OpenID_MathWrapper} is + * returned, which wraps the native PHP integer implementation. The + * proper calling convention for this method is $lib =& + * Auth_OpenID_getMathLib(). + * + * This function checks for the existence of specific long number + * implementations in the following order: GMP followed by BCmath. + * + * @return Auth_OpenID_MathWrapper $instance An instance of + * {@link Auth_OpenID_MathWrapper} or one of its subclasses + * + * @package OpenID + */ +function &Auth_OpenID_getMathLib() +{ + // The instance of Auth_OpenID_MathWrapper that we choose to + // supply will be stored here, so that subseqent calls to this + // method will return a reference to the same object. + static $lib = null; + + if (isset($lib)) { + return $lib; + } + + if (Auth_OpenID_noMathSupport()) { + $null = null; + return $null; + } + + // If this method has not been called before, look at + // Auth_OpenID_math_extensions and try to find an extension that + // works. + $ext = Auth_OpenID_detectMathLibrary(Auth_OpenID_math_extensions()); + if ($ext === false) { + $tried = array(); + foreach (Auth_OpenID_math_extensions() as $extinfo) { + $tried[] = $extinfo['extension']; + } + $triedstr = implode(", ", $tried); + + Auth_OpenID_setNoMathSupport(); + + $result = null; + return $result; + } + + // Instantiate a new wrapper + $class = $ext['class']; + $lib = new $class(); + + return $lib; +} + +function Auth_OpenID_setNoMathSupport() +{ + if (!defined('Auth_OpenID_NO_MATH_SUPPORT')) { + define('Auth_OpenID_NO_MATH_SUPPORT', true); + } +} + +function Auth_OpenID_noMathSupport() +{ + return defined('Auth_OpenID_NO_MATH_SUPPORT'); +} + +?> diff --git a/_darcs/pristine/extlib/Auth/OpenID/Consumer.php b/_darcs/pristine/extlib/Auth/OpenID/Consumer.php new file mode 100644 index 0000000000..6631cbaa90 --- /dev/null +++ b/_darcs/pristine/extlib/Auth/OpenID/Consumer.php @@ -0,0 +1,2227 @@ + + * @copyright 2005-2008 Janrain, Inc. + * @license http://www.apache.org/licenses/LICENSE-2.0 Apache + */ + +/** + * Require utility classes and functions for the consumer. + */ +require_once "Auth/OpenID.php"; +require_once "Auth/OpenID/Message.php"; +require_once "Auth/OpenID/HMAC.php"; +require_once "Auth/OpenID/Association.php"; +require_once "Auth/OpenID/CryptUtil.php"; +require_once "Auth/OpenID/DiffieHellman.php"; +require_once "Auth/OpenID/KVForm.php"; +require_once "Auth/OpenID/Nonce.php"; +require_once "Auth/OpenID/Discover.php"; +require_once "Auth/OpenID/URINorm.php"; +require_once "Auth/Yadis/Manager.php"; +require_once "Auth/Yadis/XRI.php"; + +/** + * This is the status code returned when the complete method returns + * successfully. + */ +define('Auth_OpenID_SUCCESS', 'success'); + +/** + * Status to indicate cancellation of OpenID authentication. + */ +define('Auth_OpenID_CANCEL', 'cancel'); + +/** + * This is the status code completeAuth returns when the value it + * received indicated an invalid login. + */ +define('Auth_OpenID_FAILURE', 'failure'); + +/** + * This is the status code completeAuth returns when the + * {@link Auth_OpenID_Consumer} instance is in immediate mode, and the + * identity server sends back a URL to send the user to to complete his + * or her login. + */ +define('Auth_OpenID_SETUP_NEEDED', 'setup needed'); + +/** + * This is the status code beginAuth returns when the page fetched + * from the entered OpenID URL doesn't contain the necessary link tags + * to function as an identity page. + */ +define('Auth_OpenID_PARSE_ERROR', 'parse error'); + +/** + * An OpenID consumer implementation that performs discovery and does + * session management. See the Consumer.php file documentation for + * more information. + * + * @package OpenID + */ +class Auth_OpenID_Consumer { + + /** + * @access private + */ + var $discoverMethod = 'Auth_OpenID_discover'; + + /** + * @access private + */ + var $session_key_prefix = "_openid_consumer_"; + + /** + * @access private + */ + var $_token_suffix = "last_token"; + + /** + * Initialize a Consumer instance. + * + * You should create a new instance of the Consumer object with + * every HTTP request that handles OpenID transactions. + * + * @param Auth_OpenID_OpenIDStore $store This must be an object + * that implements the interface in {@link + * Auth_OpenID_OpenIDStore}. Several concrete implementations are + * provided, to cover most common use cases. For stores backed by + * MySQL, PostgreSQL, or SQLite, see the {@link + * Auth_OpenID_SQLStore} class and its sublcasses. For a + * filesystem-backed store, see the {@link Auth_OpenID_FileStore} + * module. As a last resort, if it isn't possible for the server + * to store state at all, an instance of {@link + * Auth_OpenID_DumbStore} can be used. + * + * @param mixed $session An object which implements the interface + * of the {@link Auth_Yadis_PHPSession} class. Particularly, this + * object is expected to have these methods: get($key), set($key), + * $value), and del($key). This defaults to a session object + * which wraps PHP's native session machinery. You should only + * need to pass something here if you have your own sessioning + * implementation. + * + * @param str $consumer_cls The name of the class to instantiate + * when creating the internal consumer object. This is used for + * testing. + */ + function Auth_OpenID_Consumer(&$store, $session = null, + $consumer_cls = null) + { + if ($session === null) { + $session = new Auth_Yadis_PHPSession(); + } + + $this->session =& $session; + + if ($consumer_cls !== null) { + $this->consumer =& new $consumer_cls($store); + } else { + $this->consumer =& new Auth_OpenID_GenericConsumer($store); + } + + $this->_token_key = $this->session_key_prefix . $this->_token_suffix; + } + + /** + * Used in testing to define the discovery mechanism. + * + * @access private + */ + function getDiscoveryObject(&$session, $openid_url, + $session_key_prefix) + { + return new Auth_Yadis_Discovery($session, $openid_url, + $session_key_prefix); + } + + /** + * Start the OpenID authentication process. See steps 1-2 in the + * overview at the top of this file. + * + * @param string $user_url Identity URL given by the user. This + * method performs a textual transformation of the URL to try and + * make sure it is normalized. For example, a user_url of + * example.com will be normalized to http://example.com/ + * normalizing and resolving any redirects the server might issue. + * + * @param bool $anonymous True if the OpenID request is to be sent + * to the server without any identifier information. Use this + * when you want to transport data but don't want to do OpenID + * authentication with identifiers. + * + * @return Auth_OpenID_AuthRequest $auth_request An object + * containing the discovered information will be returned, with a + * method for building a redirect URL to the server, as described + * in step 3 of the overview. This object may also be used to add + * extension arguments to the request, using its 'addExtensionArg' + * method. + */ + function begin($user_url, $anonymous=false) + { + $openid_url = $user_url; + + $disco = $this->getDiscoveryObject($this->session, + $openid_url, + $this->session_key_prefix); + + // Set the 'stale' attribute of the manager. If discovery + // fails in a fatal way, the stale flag will cause the manager + // to be cleaned up next time discovery is attempted. + + $m = $disco->getManager(); + $loader = new Auth_Yadis_ManagerLoader(); + + if ($m) { + if ($m->stale) { + $disco->destroyManager(); + } else { + $m->stale = true; + $disco->session->set($disco->session_key, + serialize($loader->toSession($m))); + } + } + + $endpoint = $disco->getNextService($this->discoverMethod, + $this->consumer->fetcher); + + // Reset the 'stale' attribute of the manager. + $m =& $disco->getManager(); + if ($m) { + $m->stale = false; + $disco->session->set($disco->session_key, + serialize($loader->toSession($m))); + } + + if ($endpoint === null) { + return null; + } else { + return $this->beginWithoutDiscovery($endpoint, + $anonymous); + } + } + + /** + * Start OpenID verification without doing OpenID server + * discovery. This method is used internally by Consumer.begin + * after discovery is performed, and exists to provide an + * interface for library users needing to perform their own + * discovery. + * + * @param Auth_OpenID_ServiceEndpoint $endpoint an OpenID service + * endpoint descriptor. + * + * @param bool anonymous Set to true if you want to perform OpenID + * without identifiers. + * + * @return Auth_OpenID_AuthRequest $auth_request An OpenID + * authentication request object. + */ + function &beginWithoutDiscovery($endpoint, $anonymous=false) + { + $loader = new Auth_OpenID_ServiceEndpointLoader(); + $auth_req = $this->consumer->begin($endpoint); + $this->session->set($this->_token_key, + $loader->toSession($auth_req->endpoint)); + if (!$auth_req->setAnonymous($anonymous)) { + return new Auth_OpenID_FailureResponse(null, + "OpenID 1 requests MUST include the identifier " . + "in the request."); + } + return $auth_req; + } + + /** + * Called to interpret the server's response to an OpenID + * request. It is called in step 4 of the flow described in the + * consumer overview. + * + * @param string $current_url The URL used to invoke the application. + * Extract the URL from your application's web + * request framework and specify it here to have it checked + * against the openid.current_url value in the response. If + * the current_url URL check fails, the status of the + * completion will be FAILURE. + * + * @param array $query An array of the query parameters (key => + * value pairs) for this HTTP request. Defaults to null. If + * null, the GET or POST data are automatically gotten from the + * PHP environment. It is only useful to override $query for + * testing. + * + * @return Auth_OpenID_ConsumerResponse $response A instance of an + * Auth_OpenID_ConsumerResponse subclass. The type of response is + * indicated by the status attribute, which will be one of + * SUCCESS, CANCEL, FAILURE, or SETUP_NEEDED. + */ + function complete($current_url, $query=null) + { + if ($current_url && !is_string($current_url)) { + // This is ugly, but we need to complain loudly when + // someone uses the API incorrectly. + trigger_error("current_url must be a string; see NEWS file " . + "for upgrading notes.", + E_USER_ERROR); + } + + if ($query === null) { + $query = Auth_OpenID::getQuery(); + } + + $loader = new Auth_OpenID_ServiceEndpointLoader(); + $endpoint_data = $this->session->get($this->_token_key); + $endpoint = + $loader->fromSession($endpoint_data); + + $message = Auth_OpenID_Message::fromPostArgs($query); + $response = $this->consumer->complete($message, $endpoint, + $current_url); + $this->session->del($this->_token_key); + + if (in_array($response->status, array(Auth_OpenID_SUCCESS, + Auth_OpenID_CANCEL))) { + if ($response->identity_url !== null) { + $disco = $this->getDiscoveryObject($this->session, + $response->identity_url, + $this->session_key_prefix); + $disco->cleanup(true); + } + } + + return $response; + } +} + +/** + * A class implementing HMAC/DH-SHA1 consumer sessions. + * + * @package OpenID + */ +class Auth_OpenID_DiffieHellmanSHA1ConsumerSession { + var $session_type = 'DH-SHA1'; + var $hash_func = 'Auth_OpenID_SHA1'; + var $secret_size = 20; + var $allowed_assoc_types = array('HMAC-SHA1'); + + function Auth_OpenID_DiffieHellmanSHA1ConsumerSession($dh = null) + { + if ($dh === null) { + $dh = new Auth_OpenID_DiffieHellman(); + } + + $this->dh = $dh; + } + + function getRequest() + { + $math =& Auth_OpenID_getMathLib(); + + $cpub = $math->longToBase64($this->dh->public); + + $args = array('dh_consumer_public' => $cpub); + + if (!$this->dh->usingDefaultValues()) { + $args = array_merge($args, array( + 'dh_modulus' => + $math->longToBase64($this->dh->mod), + 'dh_gen' => + $math->longToBase64($this->dh->gen))); + } + + return $args; + } + + function extractSecret($response) + { + if (!$response->hasKey(Auth_OpenID_OPENID_NS, + 'dh_server_public')) { + return null; + } + + if (!$response->hasKey(Auth_OpenID_OPENID_NS, + 'enc_mac_key')) { + return null; + } + + $math =& Auth_OpenID_getMathLib(); + + $spub = $math->base64ToLong($response->getArg(Auth_OpenID_OPENID_NS, + 'dh_server_public')); + $enc_mac_key = base64_decode($response->getArg(Auth_OpenID_OPENID_NS, + 'enc_mac_key')); + + return $this->dh->xorSecret($spub, $enc_mac_key, $this->hash_func); + } +} + +/** + * A class implementing HMAC/DH-SHA256 consumer sessions. + * + * @package OpenID + */ +class Auth_OpenID_DiffieHellmanSHA256ConsumerSession extends + Auth_OpenID_DiffieHellmanSHA1ConsumerSession { + var $session_type = 'DH-SHA256'; + var $hash_func = 'Auth_OpenID_SHA256'; + var $secret_size = 32; + var $allowed_assoc_types = array('HMAC-SHA256'); +} + +/** + * A class implementing plaintext consumer sessions. + * + * @package OpenID + */ +class Auth_OpenID_PlainTextConsumerSession { + var $session_type = 'no-encryption'; + var $allowed_assoc_types = array('HMAC-SHA1', 'HMAC-SHA256'); + + function getRequest() + { + return array(); + } + + function extractSecret($response) + { + if (!$response->hasKey(Auth_OpenID_OPENID_NS, 'mac_key')) { + return null; + } + + return base64_decode($response->getArg(Auth_OpenID_OPENID_NS, + 'mac_key')); + } +} + +/** + * Returns available session types. + */ +function Auth_OpenID_getAvailableSessionTypes() +{ + $types = array( + 'no-encryption' => 'Auth_OpenID_PlainTextConsumerSession', + 'DH-SHA1' => 'Auth_OpenID_DiffieHellmanSHA1ConsumerSession', + 'DH-SHA256' => 'Auth_OpenID_DiffieHellmanSHA256ConsumerSession'); + + return $types; +} + +/** + * This class is the interface to the OpenID consumer logic. + * Instances of it maintain no per-request state, so they can be + * reused (or even used by multiple threads concurrently) as needed. + * + * @package OpenID + */ +class Auth_OpenID_GenericConsumer { + /** + * @access private + */ + var $discoverMethod = 'Auth_OpenID_discover'; + + /** + * This consumer's store object. + */ + var $store; + + /** + * @access private + */ + var $_use_assocs; + + /** + * @access private + */ + var $openid1_nonce_query_arg_name = 'janrain_nonce'; + + /** + * Another query parameter that gets added to the return_to for + * OpenID 1; if the user's session state is lost, use this claimed + * identifier to do discovery when verifying the response. + */ + var $openid1_return_to_identifier_name = 'openid1_claimed_id'; + + /** + * This method initializes a new {@link Auth_OpenID_Consumer} + * instance to access the library. + * + * @param Auth_OpenID_OpenIDStore $store This must be an object + * that implements the interface in {@link Auth_OpenID_OpenIDStore}. + * Several concrete implementations are provided, to cover most common use + * cases. For stores backed by MySQL, PostgreSQL, or SQLite, see + * the {@link Auth_OpenID_SQLStore} class and its sublcasses. For a + * filesystem-backed store, see the {@link Auth_OpenID_FileStore} module. + * As a last resort, if it isn't possible for the server to store + * state at all, an instance of {@link Auth_OpenID_DumbStore} can be used. + * + * @param bool $immediate This is an optional boolean value. It + * controls whether the library uses immediate mode, as explained + * in the module description. The default value is False, which + * disables immediate mode. + */ + function Auth_OpenID_GenericConsumer(&$store) + { + $this->store =& $store; + $this->negotiator =& Auth_OpenID_getDefaultNegotiator(); + $this->_use_assocs = ($this->store ? true : false); + + $this->fetcher = Auth_Yadis_Yadis::getHTTPFetcher(); + + $this->session_types = Auth_OpenID_getAvailableSessionTypes(); + } + + /** + * Called to begin OpenID authentication using the specified + * {@link Auth_OpenID_ServiceEndpoint}. + * + * @access private + */ + function begin($service_endpoint) + { + $assoc = $this->_getAssociation($service_endpoint); + $r = new Auth_OpenID_AuthRequest($service_endpoint, $assoc); + $r->return_to_args[$this->openid1_nonce_query_arg_name] = + Auth_OpenID_mkNonce(); + + if ($r->message->isOpenID1()) { + $r->return_to_args[$this->openid1_return_to_identifier_name] = + $r->endpoint->claimed_id; + } + + return $r; + } + + /** + * Given an {@link Auth_OpenID_Message}, {@link + * Auth_OpenID_ServiceEndpoint} and optional return_to URL, + * complete OpenID authentication. + * + * @access private + */ + function complete($message, $endpoint, $return_to) + { + $mode = $message->getArg(Auth_OpenID_OPENID_NS, 'mode', + ''); + + $mode_methods = array( + 'cancel' => '_complete_cancel', + 'error' => '_complete_error', + 'setup_needed' => '_complete_setup_needed', + 'id_res' => '_complete_id_res', + ); + + $method = Auth_OpenID::arrayGet($mode_methods, $mode, + '_completeInvalid'); + + return call_user_func_array(array(&$this, $method), + array($message, $endpoint, $return_to)); + } + + /** + * @access private + */ + function _completeInvalid($message, &$endpoint, $unused) + { + $mode = $message->getArg(Auth_OpenID_OPENID_NS, 'mode', + ''); + + return new Auth_OpenID_FailureResponse($endpoint, + sprintf("Invalid openid.mode '%s'", $mode)); + } + + /** + * @access private + */ + function _complete_cancel($message, &$endpoint, $unused) + { + return new Auth_OpenID_CancelResponse($endpoint); + } + + /** + * @access private + */ + function _complete_error($message, &$endpoint, $unused) + { + $error = $message->getArg(Auth_OpenID_OPENID_NS, 'error'); + $contact = $message->getArg(Auth_OpenID_OPENID_NS, 'contact'); + $reference = $message->getArg(Auth_OpenID_OPENID_NS, 'reference'); + + return new Auth_OpenID_FailureResponse($endpoint, $error, + $contact, $reference); + } + + /** + * @access private + */ + function _complete_setup_needed($message, &$endpoint, $unused) + { + if (!$message->isOpenID2()) { + return $this->_completeInvalid($message, $endpoint); + } + + return new Auth_OpenID_SetupNeededResponse($endpoint); + } + + /** + * @access private + */ + function _complete_id_res($message, &$endpoint, $return_to) + { + $user_setup_url = $message->getArg(Auth_OpenID_OPENID1_NS, + 'user_setup_url'); + + if ($this->_checkSetupNeeded($message)) { + return new Auth_OpenID_SetupNeededResponse( + $endpoint, $user_setup_url); + } else { + return $this->_doIdRes($message, $endpoint, $return_to); + } + } + + /** + * @access private + */ + function _checkSetupNeeded($message) + { + // In OpenID 1, we check to see if this is a cancel from + // immediate mode by the presence of the user_setup_url + // parameter. + if ($message->isOpenID1()) { + $user_setup_url = $message->getArg(Auth_OpenID_OPENID1_NS, + 'user_setup_url'); + if ($user_setup_url !== null) { + return true; + } + } + + return false; + } + + /** + * @access private + */ + function _doIdRes($message, $endpoint, $return_to) + { + // Checks for presence of appropriate fields (and checks + // signed list fields) + $result = $this->_idResCheckForFields($message); + + if (Auth_OpenID::isFailure($result)) { + return $result; + } + + if (!$this->_checkReturnTo($message, $return_to)) { + return new Auth_OpenID_FailureResponse(null, + sprintf("return_to does not match return URL. Expected %s, got %s", + $return_to, + $message->getArg(Auth_OpenID_OPENID_NS, 'return_to'))); + } + + // Verify discovery information: + $result = $this->_verifyDiscoveryResults($message, $endpoint); + + if (Auth_OpenID::isFailure($result)) { + return $result; + } + + $endpoint = $result; + + $result = $this->_idResCheckSignature($message, + $endpoint->server_url); + + if (Auth_OpenID::isFailure($result)) { + return $result; + } + + $result = $this->_idResCheckNonce($message, $endpoint); + + if (Auth_OpenID::isFailure($result)) { + return $result; + } + + $signed_list_str = $message->getArg(Auth_OpenID_OPENID_NS, 'signed', + Auth_OpenID_NO_DEFAULT); + if (Auth_OpenID::isFailure($signed_list_str)) { + return $signed_list_str; + } + $signed_list = explode(',', $signed_list_str); + + $signed_fields = Auth_OpenID::addPrefix($signed_list, "openid."); + + return new Auth_OpenID_SuccessResponse($endpoint, $message, + $signed_fields); + + } + + /** + * @access private + */ + function _checkReturnTo($message, $return_to) + { + // Check an OpenID message and its openid.return_to value + // against a return_to URL from an application. Return True + // on success, False on failure. + + // Check the openid.return_to args against args in the + // original message. + $result = Auth_OpenID_GenericConsumer::_verifyReturnToArgs( + $message->toPostArgs()); + if (Auth_OpenID::isFailure($result)) { + return false; + } + + // Check the return_to base URL against the one in the + // message. + $msg_return_to = $message->getArg(Auth_OpenID_OPENID_NS, + 'return_to'); + if (Auth_OpenID::isFailure($return_to)) { + // XXX log me + return false; + } + + $return_to_parts = parse_url(Auth_OpenID_urinorm($return_to)); + $msg_return_to_parts = parse_url(Auth_OpenID_urinorm($msg_return_to)); + + // If port is absent from both, add it so it's equal in the + // check below. + if ((!array_key_exists('port', $return_to_parts)) && + (!array_key_exists('port', $msg_return_to_parts))) { + $return_to_parts['port'] = null; + $msg_return_to_parts['port'] = null; + } + + // If path is absent from both, add it so it's equal in the + // check below. + if ((!array_key_exists('path', $return_to_parts)) && + (!array_key_exists('path', $msg_return_to_parts))) { + $return_to_parts['path'] = null; + $msg_return_to_parts['path'] = null; + } + + // The URL scheme, authority, and path MUST be the same + // between the two URLs. + foreach (array('scheme', 'host', 'port', 'path') as $component) { + // If the url component is absent in either URL, fail. + // There should always be a scheme, host, port, and path. + if (!array_key_exists($component, $return_to_parts)) { + return false; + } + + if (!array_key_exists($component, $msg_return_to_parts)) { + return false; + } + + if (Auth_OpenID::arrayGet($return_to_parts, $component) !== + Auth_OpenID::arrayGet($msg_return_to_parts, $component)) { + return false; + } + } + + return true; + } + + /** + * @access private + */ + function _verifyReturnToArgs($query) + { + // Verify that the arguments in the return_to URL are present in this + // response. + + $message = Auth_OpenID_Message::fromPostArgs($query); + $return_to = $message->getArg(Auth_OpenID_OPENID_NS, 'return_to'); + + if (Auth_OpenID::isFailure($return_to)) { + return $return_to; + } + // XXX: this should be checked by _idResCheckForFields + if (!$return_to) { + return new Auth_OpenID_FailureResponse(null, + "Response has no return_to"); + } + + $parsed_url = parse_url($return_to); + + $q = array(); + if (array_key_exists('query', $parsed_url)) { + $rt_query = $parsed_url['query']; + $q = Auth_OpenID::parse_str($rt_query); + } + + foreach ($q as $rt_key => $rt_value) { + if (!array_key_exists($rt_key, $query)) { + return new Auth_OpenID_FailureResponse(null, + sprintf("return_to parameter %s absent from query", $rt_key)); + } else { + $value = $query[$rt_key]; + if ($rt_value != $value) { + return new Auth_OpenID_FailureResponse(null, + sprintf("parameter %s value %s does not match " . + "return_to value %s", $rt_key, + $value, $rt_value)); + } + } + } + + // Make sure all non-OpenID arguments in the response are also + // in the signed return_to. + $bare_args = $message->getArgs(Auth_OpenID_BARE_NS); + foreach ($bare_args as $key => $value) { + if (Auth_OpenID::arrayGet($q, $key) != $value) { + return new Auth_OpenID_FailureResponse(null, + sprintf("Parameter %s = %s not in return_to URL", + $key, $value)); + } + } + + return true; + } + + /** + * @access private + */ + function _idResCheckSignature($message, $server_url) + { + $assoc_handle = $message->getArg(Auth_OpenID_OPENID_NS, + 'assoc_handle'); + if (Auth_OpenID::isFailure($assoc_handle)) { + return $assoc_handle; + } + + $assoc = $this->store->getAssociation($server_url, $assoc_handle); + + if ($assoc) { + if ($assoc->getExpiresIn() <= 0) { + // XXX: It might be a good idea sometimes to re-start + // the authentication with a new association. Doing it + // automatically opens the possibility for + // denial-of-service by a server that just returns + // expired associations (or really short-lived + // associations) + return new Auth_OpenID_FailureResponse(null, + 'Association with ' . $server_url . ' expired'); + } + + if (!$assoc->checkMessageSignature($message)) { + return new Auth_OpenID_FailureResponse(null, + "Bad signature"); + } + } else { + // It's not an association we know about. Stateless mode + // is our only possible path for recovery. XXX - async + // framework will not want to block on this call to + // _checkAuth. + if (!$this->_checkAuth($message, $server_url)) { + return new Auth_OpenID_FailureResponse(null, + "Server denied check_authentication"); + } + } + + return null; + } + + /** + * @access private + */ + function _verifyDiscoveryResults($message, $endpoint=null) + { + if ($message->getOpenIDNamespace() == Auth_OpenID_OPENID2_NS) { + return $this->_verifyDiscoveryResultsOpenID2($message, + $endpoint); + } else { + return $this->_verifyDiscoveryResultsOpenID1($message, + $endpoint); + } + } + + /** + * @access private + */ + function _verifyDiscoveryResultsOpenID1($message, $endpoint) + { + $claimed_id = $message->getArg(Auth_OpenID_BARE_NS, + $this->openid1_return_to_identifier_name); + + if (($endpoint === null) && ($claimed_id === null)) { + return new Auth_OpenID_FailureResponse($endpoint, + 'When using OpenID 1, the claimed ID must be supplied, ' . + 'either by passing it through as a return_to parameter ' . + 'or by using a session, and supplied to the GenericConsumer ' . + 'as the argument to complete()'); + } else if (($endpoint !== null) && ($claimed_id === null)) { + $claimed_id = $endpoint->claimed_id; + } + + $to_match = new Auth_OpenID_ServiceEndpoint(); + $to_match->type_uris = array(Auth_OpenID_TYPE_1_1); + $to_match->local_id = $message->getArg(Auth_OpenID_OPENID1_NS, + 'identity'); + + // Restore delegate information from the initiation phase + $to_match->claimed_id = $claimed_id; + + if ($to_match->local_id === null) { + return new Auth_OpenID_FailureResponse($endpoint, + "Missing required field openid.identity"); + } + + $to_match_1_0 = $to_match->copy(); + $to_match_1_0->type_uris = array(Auth_OpenID_TYPE_1_0); + + if ($endpoint !== null) { + $result = $this->_verifyDiscoverySingle($endpoint, $to_match); + + if (is_a($result, 'Auth_OpenID_TypeURIMismatch')) { + $result = $this->_verifyDiscoverySingle($endpoint, + $to_match_1_0); + } + + if (Auth_OpenID::isFailure($result)) { + // oidutil.log("Error attempting to use stored + // discovery information: " + str(e)) + // oidutil.log("Attempting discovery to + // verify endpoint") + } else { + return $endpoint; + } + } + + // Endpoint is either bad (failed verification) or None + return $this->_discoverAndVerify($to_match->claimed_id, + array($to_match, $to_match_1_0)); + } + + /** + * @access private + */ + function _verifyDiscoverySingle($endpoint, $to_match) + { + // Every type URI that's in the to_match endpoint has to be + // present in the discovered endpoint. + foreach ($to_match->type_uris as $type_uri) { + if (!$endpoint->usesExtension($type_uri)) { + return new Auth_OpenID_TypeURIMismatch($endpoint, + "Required type ".$type_uri." not present"); + } + } + + // Fragments do not influence discovery, so we can't compare a + // claimed identifier with a fragment to discovered + // information. + list($defragged_claimed_id, $_) = + Auth_OpenID::urldefrag($to_match->claimed_id); + + if ($defragged_claimed_id != $endpoint->claimed_id) { + return new Auth_OpenID_FailureResponse($endpoint, + sprintf('Claimed ID does not match (different subjects!), ' . + 'Expected %s, got %s', $defragged_claimed_id, + $endpoint->claimed_id)); + } + + if ($to_match->getLocalID() != $endpoint->getLocalID()) { + return new Auth_OpenID_FailureResponse($endpoint, + sprintf('local_id mismatch. Expected %s, got %s', + $to_match->getLocalID(), $endpoint->getLocalID())); + } + + // If the server URL is None, this must be an OpenID 1 + // response, because op_endpoint is a required parameter in + // OpenID 2. In that case, we don't actually care what the + // discovered server_url is, because signature checking or + // check_auth should take care of that check for us. + if ($to_match->server_url === null) { + if ($to_match->preferredNamespace() != Auth_OpenID_OPENID1_NS) { + return new Auth_OpenID_FailureResponse($endpoint, + "Preferred namespace mismatch (bug)"); + } + } else if ($to_match->server_url != $endpoint->server_url) { + return new Auth_OpenID_FailureResponse($endpoint, + sprintf('OP Endpoint mismatch. Expected %s, got %s', + $to_match->server_url, $endpoint->server_url)); + } + + return null; + } + + /** + * @access private + */ + function _verifyDiscoveryResultsOpenID2($message, $endpoint) + { + $to_match = new Auth_OpenID_ServiceEndpoint(); + $to_match->type_uris = array(Auth_OpenID_TYPE_2_0); + $to_match->claimed_id = $message->getArg(Auth_OpenID_OPENID2_NS, + 'claimed_id'); + + $to_match->local_id = $message->getArg(Auth_OpenID_OPENID2_NS, + 'identity'); + + $to_match->server_url = $message->getArg(Auth_OpenID_OPENID2_NS, + 'op_endpoint'); + + if ($to_match->server_url === null) { + return new Auth_OpenID_FailureResponse($endpoint, + "OP Endpoint URL missing"); + } + + // claimed_id and identifier must both be present or both be + // absent + if (($to_match->claimed_id === null) && + ($to_match->local_id !== null)) { + return new Auth_OpenID_FailureResponse($endpoint, + 'openid.identity is present without openid.claimed_id'); + } + + if (($to_match->claimed_id !== null) && + ($to_match->local_id === null)) { + return new Auth_OpenID_FailureResponse($endpoint, + 'openid.claimed_id is present without openid.identity'); + } + + if ($to_match->claimed_id === null) { + // This is a response without identifiers, so there's + // really no checking that we can do, so return an + // endpoint that's for the specified `openid.op_endpoint' + return Auth_OpenID_ServiceEndpoint::fromOPEndpointURL( + $to_match->server_url); + } + + if (!$endpoint) { + // The claimed ID doesn't match, so we have to do + // discovery again. This covers not using sessions, OP + // identifier endpoints and responses that didn't match + // the original request. + // oidutil.log('No pre-discovered information supplied.') + return $this->_discoverAndVerify($to_match->claimed_id, + array($to_match)); + } else { + + // The claimed ID matches, so we use the endpoint that we + // discovered in initiation. This should be the most + // common case. + $result = $this->_verifyDiscoverySingle($endpoint, $to_match); + + if (Auth_OpenID::isFailure($result)) { + $endpoint = $this->_discoverAndVerify($to_match->claimed_id, + array($to_match)); + if (Auth_OpenID::isFailure($endpoint)) { + return $endpoint; + } + } + } + + // The endpoint we return should have the claimed ID from the + // message we just verified, fragment and all. + if ($endpoint->claimed_id != $to_match->claimed_id) { + $endpoint->claimed_id = $to_match->claimed_id; + } + + return $endpoint; + } + + /** + * @access private + */ + function _discoverAndVerify($claimed_id, $to_match_endpoints) + { + // oidutil.log('Performing discovery on %s' % (claimed_id,)) + list($unused, $services) = call_user_func($this->discoverMethod, + $claimed_id, + $this->fetcher); + + if (!$services) { + return new Auth_OpenID_FailureResponse(null, + sprintf("No OpenID information found at %s", + $claimed_id)); + } + + return $this->_verifyDiscoveryServices($claimed_id, $services, + $to_match_endpoints); + } + + /** + * @access private + */ + function _verifyDiscoveryServices($claimed_id, + &$services, &$to_match_endpoints) + { + // Search the services resulting from discovery to find one + // that matches the information from the assertion + + foreach ($services as $endpoint) { + foreach ($to_match_endpoints as $to_match_endpoint) { + $result = $this->_verifyDiscoverySingle($endpoint, + $to_match_endpoint); + + if (!Auth_OpenID::isFailure($result)) { + // It matches, so discover verification has + // succeeded. Return this endpoint. + return $endpoint; + } + } + } + + return new Auth_OpenID_FailureResponse(null, + sprintf('No matching endpoint found after discovering %s', + $claimed_id)); + } + + /** + * Extract the nonce from an OpenID 1 response. Return the nonce + * from the BARE_NS since we independently check the return_to + * arguments are the same as those in the response message. + * + * See the openid1_nonce_query_arg_name class variable + * + * @returns $nonce The nonce as a string or null + * + * @access private + */ + function _idResGetNonceOpenID1($message, $endpoint) + { + return $message->getArg(Auth_OpenID_BARE_NS, + $this->openid1_nonce_query_arg_name); + } + + /** + * @access private + */ + function _idResCheckNonce($message, $endpoint) + { + if ($message->isOpenID1()) { + // This indicates that the nonce was generated by the consumer + $nonce = $this->_idResGetNonceOpenID1($message, $endpoint); + $server_url = ''; + } else { + $nonce = $message->getArg(Auth_OpenID_OPENID2_NS, + 'response_nonce'); + + $server_url = $endpoint->server_url; + } + + if ($nonce === null) { + return new Auth_OpenID_FailureResponse($endpoint, + "Nonce missing from response"); + } + + $parts = Auth_OpenID_splitNonce($nonce); + + if ($parts === null) { + return new Auth_OpenID_FailureResponse($endpoint, + "Malformed nonce in response"); + } + + list($timestamp, $salt) = $parts; + + if (!$this->store->useNonce($server_url, $timestamp, $salt)) { + return new Auth_OpenID_FailureResponse($endpoint, + "Nonce already used or out of range"); + } + + return null; + } + + /** + * @access private + */ + function _idResCheckForFields($message) + { + $basic_fields = array('return_to', 'assoc_handle', 'sig', 'signed'); + $basic_sig_fields = array('return_to', 'identity'); + + $require_fields = array( + Auth_OpenID_OPENID2_NS => array_merge($basic_fields, + array('op_endpoint')), + + Auth_OpenID_OPENID1_NS => array_merge($basic_fields, + array('identity')) + ); + + $require_sigs = array( + Auth_OpenID_OPENID2_NS => array_merge($basic_sig_fields, + array('response_nonce', + 'claimed_id', + 'assoc_handle')), + Auth_OpenID_OPENID1_NS => array_merge($basic_sig_fields, + array('nonce')) + ); + + foreach ($require_fields[$message->getOpenIDNamespace()] as $field) { + if (!$message->hasKey(Auth_OpenID_OPENID_NS, $field)) { + return new Auth_OpenID_FailureResponse(null, + "Missing required field '".$field."'"); + } + } + + $signed_list_str = $message->getArg(Auth_OpenID_OPENID_NS, + 'signed', + Auth_OpenID_NO_DEFAULT); + if (Auth_OpenID::isFailure($signed_list_str)) { + return $signed_list_str; + } + $signed_list = explode(',', $signed_list_str); + + foreach ($require_sigs[$message->getOpenIDNamespace()] as $field) { + // Field is present and not in signed list + if ($message->hasKey(Auth_OpenID_OPENID_NS, $field) && + (!in_array($field, $signed_list))) { + return new Auth_OpenID_FailureResponse(null, + "'".$field."' not signed"); + } + } + + return null; + } + + /** + * @access private + */ + function _checkAuth($message, $server_url) + { + $request = $this->_createCheckAuthRequest($message); + if ($request === null) { + return false; + } + + $resp_message = $this->_makeKVPost($request, $server_url); + if (($resp_message === null) || + (is_a($resp_message, 'Auth_OpenID_ServerErrorContainer'))) { + return false; + } + + return $this->_processCheckAuthResponse($resp_message, $server_url); + } + + /** + * @access private + */ + function _createCheckAuthRequest($message) + { + $signed = $message->getArg(Auth_OpenID_OPENID_NS, 'signed'); + if ($signed) { + foreach (explode(',', $signed) as $k) { + $value = $message->getAliasedArg($k); + if ($value === null) { + return null; + } + } + } + $ca_message = $message->copy(); + $ca_message->setArg(Auth_OpenID_OPENID_NS, 'mode', + 'check_authentication'); + return $ca_message; + } + + /** + * @access private + */ + function _processCheckAuthResponse($response, $server_url) + { + $is_valid = $response->getArg(Auth_OpenID_OPENID_NS, 'is_valid', + 'false'); + + $invalidate_handle = $response->getArg(Auth_OpenID_OPENID_NS, + 'invalidate_handle'); + + if ($invalidate_handle !== null) { + $this->store->removeAssociation($server_url, + $invalidate_handle); + } + + if ($is_valid == 'true') { + return true; + } + + return false; + } + + /** + * Adapt a POST response to a Message. + * + * @param $response Result of a POST to an OpenID endpoint. + * + * @access private + */ + function _httpResponseToMessage($response, $server_url) + { + // Should this function be named Message.fromHTTPResponse instead? + $response_message = Auth_OpenID_Message::fromKVForm($response->body); + + if ($response->status == 400) { + return Auth_OpenID_ServerErrorContainer::fromMessage( + $response_message); + } else if ($response->status != 200 and $response->status != 206) { + return null; + } + + return $response_message; + } + + /** + * @access private + */ + function _makeKVPost($message, $server_url) + { + $body = $message->toURLEncoded(); + $resp = $this->fetcher->post($server_url, $body); + + if ($resp === null) { + return null; + } + + return $this->_httpResponseToMessage($resp, $server_url); + } + + /** + * @access private + */ + function _getAssociation($endpoint) + { + if (!$this->_use_assocs) { + return null; + } + + $assoc = $this->store->getAssociation($endpoint->server_url); + + if (($assoc === null) || + ($assoc->getExpiresIn() <= 0)) { + + $assoc = $this->_negotiateAssociation($endpoint); + + if ($assoc !== null) { + $this->store->storeAssociation($endpoint->server_url, + $assoc); + } + } + + return $assoc; + } + + /** + * Handle ServerErrors resulting from association requests. + * + * @return $result If server replied with an C{unsupported-type} + * error, return a tuple of supported C{association_type}, + * C{session_type}. Otherwise logs the error and returns null. + * + * @access private + */ + function _extractSupportedAssociationType(&$server_error, &$endpoint, + $assoc_type) + { + // Any error message whose code is not 'unsupported-type' + // should be considered a total failure. + if (($server_error->error_code != 'unsupported-type') || + ($server_error->message->isOpenID1())) { + return null; + } + + // The server didn't like the association/session type that we + // sent, and it sent us back a message that might tell us how + // to handle it. + + // Extract the session_type and assoc_type from the error + // message + $assoc_type = $server_error->message->getArg(Auth_OpenID_OPENID_NS, + 'assoc_type'); + + $session_type = $server_error->message->getArg(Auth_OpenID_OPENID_NS, + 'session_type'); + + if (($assoc_type === null) || ($session_type === null)) { + return null; + } else if (!$this->negotiator->isAllowed($assoc_type, + $session_type)) { + return null; + } else { + return array($assoc_type, $session_type); + } + } + + /** + * @access private + */ + function _negotiateAssociation($endpoint) + { + // Get our preferred session/association type from the negotiatior. + list($assoc_type, $session_type) = $this->negotiator->getAllowedType(); + + $assoc = $this->_requestAssociation( + $endpoint, $assoc_type, $session_type); + + if (Auth_OpenID::isFailure($assoc)) { + return null; + } + + if (is_a($assoc, 'Auth_OpenID_ServerErrorContainer')) { + $why = $assoc; + + $supportedTypes = $this->_extractSupportedAssociationType( + $why, $endpoint, $assoc_type); + + if ($supportedTypes !== null) { + list($assoc_type, $session_type) = $supportedTypes; + + // Attempt to create an association from the assoc_type + // and session_type that the server told us it + // supported. + $assoc = $this->_requestAssociation( + $endpoint, $assoc_type, $session_type); + + if (is_a($assoc, 'Auth_OpenID_ServerErrorContainer')) { + // Do not keep trying, since it rejected the + // association type that it told us to use. + // oidutil.log('Server %s refused its suggested association + // 'type: session_type=%s, assoc_type=%s' + // % (endpoint.server_url, session_type, + // assoc_type)) + return null; + } else { + return $assoc; + } + } else { + return null; + } + } else { + return $assoc; + } + } + + /** + * @access private + */ + function _requestAssociation($endpoint, $assoc_type, $session_type) + { + list($assoc_session, $args) = $this->_createAssociateRequest( + $endpoint, $assoc_type, $session_type); + + $response_message = $this->_makeKVPost($args, $endpoint->server_url); + + if ($response_message === null) { + // oidutil.log('openid.associate request failed: %s' % (why[0],)) + return null; + } else if (is_a($response_message, + 'Auth_OpenID_ServerErrorContainer')) { + return $response_message; + } + + return $this->_extractAssociation($response_message, $assoc_session); + } + + /** + * @access private + */ + function _extractAssociation(&$assoc_response, &$assoc_session) + { + // Extract the common fields from the response, raising an + // exception if they are not found + $assoc_type = $assoc_response->getArg( + Auth_OpenID_OPENID_NS, 'assoc_type', + Auth_OpenID_NO_DEFAULT); + + if (Auth_OpenID::isFailure($assoc_type)) { + return $assoc_type; + } + + $assoc_handle = $assoc_response->getArg( + Auth_OpenID_OPENID_NS, 'assoc_handle', + Auth_OpenID_NO_DEFAULT); + + if (Auth_OpenID::isFailure($assoc_handle)) { + return $assoc_handle; + } + + // expires_in is a base-10 string. The Python parsing will + // accept literals that have whitespace around them and will + // accept negative values. Neither of these are really in-spec, + // but we think it's OK to accept them. + $expires_in_str = $assoc_response->getArg( + Auth_OpenID_OPENID_NS, 'expires_in', + Auth_OpenID_NO_DEFAULT); + + if (Auth_OpenID::isFailure($expires_in_str)) { + return $expires_in_str; + } + + $expires_in = Auth_OpenID::intval($expires_in_str); + if ($expires_in === false) { + + $err = sprintf("Could not parse expires_in from association ". + "response %s", print_r($assoc_response, true)); + return new Auth_OpenID_FailureResponse(null, $err); + } + + // OpenID 1 has funny association session behaviour. + if ($assoc_response->isOpenID1()) { + $session_type = $this->_getOpenID1SessionType($assoc_response); + } else { + $session_type = $assoc_response->getArg( + Auth_OpenID_OPENID2_NS, 'session_type', + Auth_OpenID_NO_DEFAULT); + + if (Auth_OpenID::isFailure($session_type)) { + return $session_type; + } + } + + // Session type mismatch + if ($assoc_session->session_type != $session_type) { + if ($assoc_response->isOpenID1() && + ($session_type == 'no-encryption')) { + // In OpenID 1, any association request can result in + // a 'no-encryption' association response. Setting + // assoc_session to a new no-encryption session should + // make the rest of this function work properly for + // that case. + $assoc_session = new Auth_OpenID_PlainTextConsumerSession(); + } else { + // Any other mismatch, regardless of protocol version + // results in the failure of the association session + // altogether. + return null; + } + } + + // Make sure assoc_type is valid for session_type + if (!in_array($assoc_type, $assoc_session->allowed_assoc_types)) { + return null; + } + + // Delegate to the association session to extract the secret + // from the response, however is appropriate for that session + // type. + $secret = $assoc_session->extractSecret($assoc_response); + + if ($secret === null) { + return null; + } + + return Auth_OpenID_Association::fromExpiresIn( + $expires_in, $assoc_handle, $secret, $assoc_type); + } + + /** + * @access private + */ + function _createAssociateRequest($endpoint, $assoc_type, $session_type) + { + if (array_key_exists($session_type, $this->session_types)) { + $session_type_class = $this->session_types[$session_type]; + + if (is_callable($session_type_class)) { + $assoc_session = $session_type_class(); + } else { + $assoc_session = new $session_type_class(); + } + } else { + return null; + } + + $args = array( + 'mode' => 'associate', + 'assoc_type' => $assoc_type); + + if (!$endpoint->compatibilityMode()) { + $args['ns'] = Auth_OpenID_OPENID2_NS; + } + + // Leave out the session type if we're in compatibility mode + // *and* it's no-encryption. + if ((!$endpoint->compatibilityMode()) || + ($assoc_session->session_type != 'no-encryption')) { + $args['session_type'] = $assoc_session->session_type; + } + + $args = array_merge($args, $assoc_session->getRequest()); + $message = Auth_OpenID_Message::fromOpenIDArgs($args); + return array($assoc_session, $message); + } + + /** + * Given an association response message, extract the OpenID 1.X + * session type. + * + * This function mostly takes care of the 'no-encryption' default + * behavior in OpenID 1. + * + * If the association type is plain-text, this function will + * return 'no-encryption' + * + * @access private + * @return $typ The association type for this message + */ + function _getOpenID1SessionType($assoc_response) + { + // If it's an OpenID 1 message, allow session_type to default + // to None (which signifies "no-encryption") + $session_type = $assoc_response->getArg(Auth_OpenID_OPENID1_NS, + 'session_type'); + + // Handle the differences between no-encryption association + // respones in OpenID 1 and 2: + + // no-encryption is not really a valid session type for OpenID + // 1, but we'll accept it anyway, while issuing a warning. + if ($session_type == 'no-encryption') { + // oidutil.log('WARNING: OpenID server sent "no-encryption"' + // 'for OpenID 1.X') + } else if (($session_type == '') || ($session_type === null)) { + // Missing or empty session type is the way to flag a + // 'no-encryption' response. Change the session type to + // 'no-encryption' so that it can be handled in the same + // way as OpenID 2 'no-encryption' respones. + $session_type = 'no-encryption'; + } + + return $session_type; + } +} + +/** + * This class represents an authentication request from a consumer to + * an OpenID server. + * + * @package OpenID + */ +class Auth_OpenID_AuthRequest { + + /** + * Initialize an authentication request with the specified token, + * association, and endpoint. + * + * Users of this library should not create instances of this + * class. Instances of this class are created by the library when + * needed. + */ + function Auth_OpenID_AuthRequest(&$endpoint, $assoc) + { + $this->assoc = $assoc; + $this->endpoint =& $endpoint; + $this->return_to_args = array(); + $this->message = new Auth_OpenID_Message( + $endpoint->preferredNamespace()); + $this->_anonymous = false; + } + + /** + * Add an extension to this checkid request. + * + * $extension_request: An object that implements the extension + * request interface for adding arguments to an OpenID message. + */ + function addExtension(&$extension_request) + { + $extension_request->toMessage($this->message); + } + + /** + * Add an extension argument to this OpenID authentication + * request. + * + * Use caution when adding arguments, because they will be + * URL-escaped and appended to the redirect URL, which can easily + * get quite long. + * + * @param string $namespace The namespace for the extension. For + * example, the simple registration extension uses the namespace + * 'sreg'. + * + * @param string $key The key within the extension namespace. For + * example, the nickname field in the simple registration + * extension's key is 'nickname'. + * + * @param string $value The value to provide to the server for + * this argument. + */ + function addExtensionArg($namespace, $key, $value) + { + return $this->message->setArg($namespace, $key, $value); + } + + /** + * Set whether this request should be made anonymously. If a + * request is anonymous, the identifier will not be sent in the + * request. This is only useful if you are making another kind of + * request with an extension in this request. + * + * Anonymous requests are not allowed when the request is made + * with OpenID 1. + */ + function setAnonymous($is_anonymous) + { + if ($is_anonymous && $this->message->isOpenID1()) { + return false; + } else { + $this->_anonymous = $is_anonymous; + return true; + } + } + + /** + * Produce a {@link Auth_OpenID_Message} representing this + * request. + * + * @param string $realm The URL (or URL pattern) that identifies + * your web site to the user when she is authorizing it. + * + * @param string $return_to The URL that the OpenID provider will + * send the user back to after attempting to verify her identity. + * + * Not specifying a return_to URL means that the user will not be + * returned to the site issuing the request upon its completion. + * + * @param bool $immediate If true, the OpenID provider is to send + * back a response immediately, useful for behind-the-scenes + * authentication attempts. Otherwise the OpenID provider may + * engage the user before providing a response. This is the + * default case, as the user may need to provide credentials or + * approve the request before a positive response can be sent. + */ + function getMessage($realm, $return_to=null, $immediate=false) + { + if ($return_to) { + $return_to = Auth_OpenID::appendArgs($return_to, + $this->return_to_args); + } else if ($immediate) { + // raise ValueError( + // '"return_to" is mandatory when + //using "checkid_immediate"') + return new Auth_OpenID_FailureResponse(null, + "'return_to' is mandatory when using checkid_immediate"); + } else if ($this->message->isOpenID1()) { + // raise ValueError('"return_to" is + // mandatory for OpenID 1 requests') + return new Auth_OpenID_FailureResponse(null, + "'return_to' is mandatory for OpenID 1 requests"); + } else if ($this->return_to_args) { + // raise ValueError('extra "return_to" arguments + // were specified, but no return_to was specified') + return new Auth_OpenID_FailureResponse(null, + "extra 'return_to' arguments where specified, " . + "but no return_to was specified"); + } + + if ($immediate) { + $mode = 'checkid_immediate'; + } else { + $mode = 'checkid_setup'; + } + + $message = $this->message->copy(); + if ($message->isOpenID1()) { + $realm_key = 'trust_root'; + } else { + $realm_key = 'realm'; + } + + $message->updateArgs(Auth_OpenID_OPENID_NS, + array( + $realm_key => $realm, + 'mode' => $mode, + 'return_to' => $return_to)); + + if (!$this->_anonymous) { + if ($this->endpoint->isOPIdentifier()) { + // This will never happen when we're in compatibility + // mode, as long as isOPIdentifier() returns False + // whenever preferredNamespace() returns OPENID1_NS. + $claimed_id = $request_identity = + Auth_OpenID_IDENTIFIER_SELECT; + } else { + $request_identity = $this->endpoint->getLocalID(); + $claimed_id = $this->endpoint->claimed_id; + } + + // This is true for both OpenID 1 and 2 + $message->setArg(Auth_OpenID_OPENID_NS, 'identity', + $request_identity); + + if ($message->isOpenID2()) { + $message->setArg(Auth_OpenID_OPENID2_NS, 'claimed_id', + $claimed_id); + } + } + + if ($this->assoc) { + $message->setArg(Auth_OpenID_OPENID_NS, 'assoc_handle', + $this->assoc->handle); + } + + return $message; + } + + function redirectURL($realm, $return_to = null, + $immediate = false) + { + $message = $this->getMessage($realm, $return_to, $immediate); + + if (Auth_OpenID::isFailure($message)) { + return $message; + } + + return $message->toURL($this->endpoint->server_url); + } + + /** + * Get html for a form to submit this request to the IDP. + * + * form_tag_attrs: An array of attributes to be added to the form + * tag. 'accept-charset' and 'enctype' have defaults that can be + * overridden. If a value is supplied for 'action' or 'method', it + * will be replaced. + */ + function formMarkup($realm, $return_to=null, $immediate=false, + $form_tag_attrs=null) + { + $message = $this->getMessage($realm, $return_to, $immediate); + + if (Auth_OpenID::isFailure($message)) { + return $message; + } + + return $message->toFormMarkup($this->endpoint->server_url, + $form_tag_attrs); + } + + /** + * Get a complete html document that will autosubmit the request + * to the IDP. + * + * Wraps formMarkup. See the documentation for that function. + */ + function htmlMarkup($realm, $return_to=null, $immediate=false, + $form_tag_attrs=null) + { + $form = $this->formMarkup($realm, $return_to, $immediate, + $form_tag_attrs); + + if (Auth_OpenID::isFailure($form)) { + return $form; + } + return Auth_OpenID::autoSubmitHTML($form); + } + + function shouldSendRedirect() + { + return $this->endpoint->compatibilityMode(); + } +} + +/** + * The base class for responses from the Auth_OpenID_Consumer. + * + * @package OpenID + */ +class Auth_OpenID_ConsumerResponse { + var $status = null; + + function setEndpoint($endpoint) + { + $this->endpoint = $endpoint; + if ($endpoint === null) { + $this->identity_url = null; + } else { + $this->identity_url = $endpoint->claimed_id; + } + } + + /** + * Return the display identifier for this response. + * + * The display identifier is related to the Claimed Identifier, but the + * two are not always identical. The display identifier is something the + * user should recognize as what they entered, whereas the response's + * claimed identifier (in the identity_url attribute) may have extra + * information for better persistence. + * + * URLs will be stripped of their fragments for display. XRIs will + * display the human-readable identifier (i-name) instead of the + * persistent identifier (i-number). + * + * Use the display identifier in your user interface. Use + * identity_url for querying your database or authorization server. + * + */ + function getDisplayIdentifier() + { + if ($this->endpoint !== null) { + return $this->endpoint->getDisplayIdentifier(); + } + return null; + } +} + +/** + * A response with a status of Auth_OpenID_SUCCESS. Indicates that + * this request is a successful acknowledgement from the OpenID server + * that the supplied URL is, indeed controlled by the requesting + * agent. This has three relevant attributes: + * + * claimed_id - The identity URL that has been authenticated + * + * signed_args - The arguments in the server's response that were + * signed and verified. + * + * status - Auth_OpenID_SUCCESS. + * + * @package OpenID + */ +class Auth_OpenID_SuccessResponse extends Auth_OpenID_ConsumerResponse { + var $status = Auth_OpenID_SUCCESS; + + /** + * @access private + */ + function Auth_OpenID_SuccessResponse($endpoint, $message, $signed_args=null) + { + $this->endpoint = $endpoint; + $this->identity_url = $endpoint->claimed_id; + $this->signed_args = $signed_args; + $this->message = $message; + + if ($this->signed_args === null) { + $this->signed_args = array(); + } + } + + /** + * Extract signed extension data from the server's response. + * + * @param string $prefix The extension namespace from which to + * extract the extension data. + */ + function extensionResponse($namespace_uri, $require_signed) + { + if ($require_signed) { + return $this->getSignedNS($namespace_uri); + } else { + return $this->message->getArgs($namespace_uri); + } + } + + function isOpenID1() + { + return $this->message->isOpenID1(); + } + + function isSigned($ns_uri, $ns_key) + { + // Return whether a particular key is signed, regardless of + // its namespace alias + return in_array($this->message->getKey($ns_uri, $ns_key), + $this->signed_args); + } + + function getSigned($ns_uri, $ns_key, $default = null) + { + // Return the specified signed field if available, otherwise + // return default + if ($this->isSigned($ns_uri, $ns_key)) { + return $this->message->getArg($ns_uri, $ns_key, $default); + } else { + return $default; + } + } + + function getSignedNS($ns_uri) + { + $args = array(); + + $msg_args = $this->message->getArgs($ns_uri); + if (Auth_OpenID::isFailure($msg_args)) { + return null; + } + + foreach ($msg_args as $key => $value) { + if (!$this->isSigned($ns_uri, $key)) { + return null; + } + } + + return $msg_args; + } + + /** + * Get the openid.return_to argument from this response. + * + * This is useful for verifying that this request was initiated by + * this consumer. + * + * @return string $return_to The return_to URL supplied to the + * server on the initial request, or null if the response did not + * contain an 'openid.return_to' argument. + */ + function getReturnTo() + { + return $this->getSigned(Auth_OpenID_OPENID_NS, 'return_to'); + } +} + +/** + * A response with a status of Auth_OpenID_FAILURE. Indicates that the + * OpenID protocol has failed. This could be locally or remotely + * triggered. This has three relevant attributes: + * + * claimed_id - The identity URL for which authentication was + * attempted, if it can be determined. Otherwise, null. + * + * message - A message indicating why the request failed, if one is + * supplied. Otherwise, null. + * + * status - Auth_OpenID_FAILURE. + * + * @package OpenID + */ +class Auth_OpenID_FailureResponse extends Auth_OpenID_ConsumerResponse { + var $status = Auth_OpenID_FAILURE; + + function Auth_OpenID_FailureResponse($endpoint, $message = null, + $contact = null, $reference = null) + { + $this->setEndpoint($endpoint); + $this->message = $message; + $this->contact = $contact; + $this->reference = $reference; + } +} + +/** + * A specific, internal failure used to detect type URI mismatch. + * + * @package OpenID + */ +class Auth_OpenID_TypeURIMismatch extends Auth_OpenID_FailureResponse { +} + +/** + * Exception that is raised when the server returns a 400 response + * code to a direct request. + * + * @package OpenID + */ +class Auth_OpenID_ServerErrorContainer { + function Auth_OpenID_ServerErrorContainer($error_text, + $error_code, + $message) + { + $this->error_text = $error_text; + $this->error_code = $error_code; + $this->message = $message; + } + + /** + * @access private + */ + function fromMessage($message) + { + $error_text = $message->getArg( + Auth_OpenID_OPENID_NS, 'error', ''); + $error_code = $message->getArg(Auth_OpenID_OPENID_NS, 'error_code'); + return new Auth_OpenID_ServerErrorContainer($error_text, + $error_code, + $message); + } +} + +/** + * A response with a status of Auth_OpenID_CANCEL. Indicates that the + * user cancelled the OpenID authentication request. This has two + * relevant attributes: + * + * claimed_id - The identity URL for which authentication was + * attempted, if it can be determined. Otherwise, null. + * + * status - Auth_OpenID_SUCCESS. + * + * @package OpenID + */ +class Auth_OpenID_CancelResponse extends Auth_OpenID_ConsumerResponse { + var $status = Auth_OpenID_CANCEL; + + function Auth_OpenID_CancelResponse($endpoint) + { + $this->setEndpoint($endpoint); + } +} + +/** + * A response with a status of Auth_OpenID_SETUP_NEEDED. Indicates + * that the request was in immediate mode, and the server is unable to + * authenticate the user without further interaction. + * + * claimed_id - The identity URL for which authentication was + * attempted. + * + * setup_url - A URL that can be used to send the user to the server + * to set up for authentication. The user should be redirected in to + * the setup_url, either in the current window or in a new browser + * window. Null in OpenID 2. + * + * status - Auth_OpenID_SETUP_NEEDED. + * + * @package OpenID + */ +class Auth_OpenID_SetupNeededResponse extends Auth_OpenID_ConsumerResponse { + var $status = Auth_OpenID_SETUP_NEEDED; + + function Auth_OpenID_SetupNeededResponse($endpoint, + $setup_url = null) + { + $this->setEndpoint($endpoint); + $this->setup_url = $setup_url; + } +} + +?> diff --git a/_darcs/pristine/extlib/Auth/OpenID/CryptUtil.php b/_darcs/pristine/extlib/Auth/OpenID/CryptUtil.php new file mode 100644 index 0000000000..aacc3cd397 --- /dev/null +++ b/_darcs/pristine/extlib/Auth/OpenID/CryptUtil.php @@ -0,0 +1,109 @@ + + * @copyright 2005-2008 Janrain, Inc. + * @license http://www.apache.org/licenses/LICENSE-2.0 Apache + */ + +if (!defined('Auth_OpenID_RAND_SOURCE')) { + /** + * The filename for a source of random bytes. Define this yourself + * if you have a different source of randomness. + */ + define('Auth_OpenID_RAND_SOURCE', '/dev/urandom'); +} + +class Auth_OpenID_CryptUtil { + /** + * Get the specified number of random bytes. + * + * Attempts to use a cryptographically secure (not predictable) + * source of randomness if available. If there is no high-entropy + * randomness source available, it will fail. As a last resort, + * for non-critical systems, define + * Auth_OpenID_RAND_SOURCE as null, and + * the code will fall back on a pseudo-random number generator. + * + * @param int $num_bytes The length of the return value + * @return string $bytes random bytes + */ + function getBytes($num_bytes) + { + static $f = null; + $bytes = ''; + if ($f === null) { + if (Auth_OpenID_RAND_SOURCE === null) { + $f = false; + } else { + $f = @fopen(Auth_OpenID_RAND_SOURCE, "r"); + if ($f === false) { + $msg = 'Define Auth_OpenID_RAND_SOURCE as null to ' . + ' continue with an insecure random number generator.'; + trigger_error($msg, E_USER_ERROR); + } + } + } + if ($f === false) { + // pseudorandom used + $bytes = ''; + for ($i = 0; $i < $num_bytes; $i += 4) { + $bytes .= pack('L', mt_rand()); + } + $bytes = substr($bytes, 0, $num_bytes); + } else { + $bytes = fread($f, $num_bytes); + } + return $bytes; + } + + /** + * Produce a string of length random bytes, chosen from chrs. If + * $chrs is null, the resulting string may contain any characters. + * + * @param integer $length The length of the resulting + * randomly-generated string + * @param string $chrs A string of characters from which to choose + * to build the new string + * @return string $result A string of randomly-chosen characters + * from $chrs + */ + function randomString($length, $population = null) + { + if ($population === null) { + return Auth_OpenID_CryptUtil::getBytes($length); + } + + $popsize = strlen($population); + + if ($popsize > 256) { + $msg = 'More than 256 characters supplied to ' . __FUNCTION__; + trigger_error($msg, E_USER_ERROR); + } + + $duplicate = 256 % $popsize; + + $str = ""; + for ($i = 0; $i < $length; $i++) { + do { + $n = ord(Auth_OpenID_CryptUtil::getBytes(1)); + } while ($n < $duplicate); + + $n %= $popsize; + $str .= $population[$n]; + } + + return $str; + } +} + +?> \ No newline at end of file diff --git a/_darcs/pristine/extlib/Auth/OpenID/DatabaseConnection.php b/_darcs/pristine/extlib/Auth/OpenID/DatabaseConnection.php new file mode 100644 index 0000000000..9db6e0eb3f --- /dev/null +++ b/_darcs/pristine/extlib/Auth/OpenID/DatabaseConnection.php @@ -0,0 +1,131 @@ + + * @copyright 2005-2008 Janrain, Inc. + * @license http://www.apache.org/licenses/LICENSE-2.0 Apache + */ + +/** + * An empty base class intended to emulate PEAR connection + * functionality in applications that supply their own database + * abstraction mechanisms. See {@link Auth_OpenID_SQLStore} for more + * information. You should subclass this class if you need to create + * an SQL store that needs to access its database using an + * application's database abstraction layer instead of a PEAR database + * connection. Any subclass of Auth_OpenID_DatabaseConnection MUST + * adhere to the interface specified here. + * + * @package OpenID + */ +class Auth_OpenID_DatabaseConnection { + /** + * Sets auto-commit mode on this database connection. + * + * @param bool $mode True if auto-commit is to be used; false if + * not. + */ + function autoCommit($mode) + { + } + + /** + * Run an SQL query with the specified parameters, if any. + * + * @param string $sql An SQL string with placeholders. The + * placeholders are assumed to be specific to the database engine + * for this connection. + * + * @param array $params An array of parameters to insert into the + * SQL string using this connection's escaping mechanism. + * + * @return mixed $result The result of calling this connection's + * internal query function. The type of result depends on the + * underlying database engine. This method is usually used when + * the result of a query is not important, like a DDL query. + */ + function query($sql, $params = array()) + { + } + + /** + * Starts a transaction on this connection, if supported. + */ + function begin() + { + } + + /** + * Commits a transaction on this connection, if supported. + */ + function commit() + { + } + + /** + * Performs a rollback on this connection, if supported. + */ + function rollback() + { + } + + /** + * Run an SQL query and return the first column of the first row + * of the result set, if any. + * + * @param string $sql An SQL string with placeholders. The + * placeholders are assumed to be specific to the database engine + * for this connection. + * + * @param array $params An array of parameters to insert into the + * SQL string using this connection's escaping mechanism. + * + * @return mixed $result The value of the first column of the + * first row of the result set. False if no such result was + * found. + */ + function getOne($sql, $params = array()) + { + } + + /** + * Run an SQL query and return the first row of the result set, if + * any. + * + * @param string $sql An SQL string with placeholders. The + * placeholders are assumed to be specific to the database engine + * for this connection. + * + * @param array $params An array of parameters to insert into the + * SQL string using this connection's escaping mechanism. + * + * @return array $result The first row of the result set, if any, + * keyed on column name. False if no such result was found. + */ + function getRow($sql, $params = array()) + { + } + + /** + * Run an SQL query with the specified parameters, if any. + * + * @param string $sql An SQL string with placeholders. The + * placeholders are assumed to be specific to the database engine + * for this connection. + * + * @param array $params An array of parameters to insert into the + * SQL string using this connection's escaping mechanism. + * + * @return array $result An array of arrays representing the + * result of the query; each array is keyed on column name. + */ + function getAll($sql, $params = array()) + { + } +} + +?> \ No newline at end of file diff --git a/_darcs/pristine/extlib/Auth/OpenID/DiffieHellman.php b/_darcs/pristine/extlib/Auth/OpenID/DiffieHellman.php new file mode 100644 index 0000000000..f4ded7eba5 --- /dev/null +++ b/_darcs/pristine/extlib/Auth/OpenID/DiffieHellman.php @@ -0,0 +1,113 @@ + + * @copyright 2005-2008 Janrain, Inc. + * @license http://www.apache.org/licenses/LICENSE-2.0 Apache + */ + +require_once 'Auth/OpenID.php'; +require_once 'Auth/OpenID/BigMath.php'; + +function Auth_OpenID_getDefaultMod() +{ + return '155172898181473697471232257763715539915724801'. + '966915404479707795314057629378541917580651227423'. + '698188993727816152646631438561595825688188889951'. + '272158842675419950341258706556549803580104870537'. + '681476726513255747040765857479291291572334510643'. + '245094715007229621094194349783925984760375594985'. + '848253359305585439638443'; +} + +function Auth_OpenID_getDefaultGen() +{ + return '2'; +} + +/** + * The Diffie-Hellman key exchange class. This class relies on + * {@link Auth_OpenID_MathLibrary} to perform large number operations. + * + * @access private + * @package OpenID + */ +class Auth_OpenID_DiffieHellman { + + var $mod; + var $gen; + var $private; + var $lib = null; + + function Auth_OpenID_DiffieHellman($mod = null, $gen = null, + $private = null, $lib = null) + { + if ($lib === null) { + $this->lib =& Auth_OpenID_getMathLib(); + } else { + $this->lib =& $lib; + } + + if ($mod === null) { + $this->mod = $this->lib->init(Auth_OpenID_getDefaultMod()); + } else { + $this->mod = $mod; + } + + if ($gen === null) { + $this->gen = $this->lib->init(Auth_OpenID_getDefaultGen()); + } else { + $this->gen = $gen; + } + + if ($private === null) { + $r = $this->lib->rand($this->mod); + $this->private = $this->lib->add($r, 1); + } else { + $this->private = $private; + } + + $this->public = $this->lib->powmod($this->gen, $this->private, + $this->mod); + } + + function getSharedSecret($composite) + { + return $this->lib->powmod($composite, $this->private, $this->mod); + } + + function getPublicKey() + { + return $this->public; + } + + function usingDefaultValues() + { + return ($this->mod == Auth_OpenID_getDefaultMod() && + $this->gen == Auth_OpenID_getDefaultGen()); + } + + function xorSecret($composite, $secret, $hash_func) + { + $dh_shared = $this->getSharedSecret($composite); + $dh_shared_str = $this->lib->longToBinary($dh_shared); + $hash_dh_shared = $hash_func($dh_shared_str); + + $xsecret = ""; + for ($i = 0; $i < Auth_OpenID::bytes($secret); $i++) { + $xsecret .= chr(ord($secret[$i]) ^ ord($hash_dh_shared[$i])); + } + + return $xsecret; + } +} + +?> diff --git a/_darcs/pristine/extlib/Auth/OpenID/Discover.php b/_darcs/pristine/extlib/Auth/OpenID/Discover.php new file mode 100644 index 0000000000..62aeb1d2bc --- /dev/null +++ b/_darcs/pristine/extlib/Auth/OpenID/Discover.php @@ -0,0 +1,548 @@ +claimed_id = null; + $this->server_url = null; + $this->type_uris = array(); + $this->local_id = null; + $this->canonicalID = null; + $this->used_yadis = false; // whether this came from an XRDS + $this->display_identifier = null; + } + + function getDisplayIdentifier() + { + if ($this->display_identifier) { + return $this->display_identifier; + } + if (! $this->claimed_id) { + return $this->claimed_id; + } + $parsed = parse_url($this->claimed_id); + $scheme = $parsed['scheme']; + $host = $parsed['host']; + $path = $parsed['path']; + if (array_key_exists('query', $parsed)) { + $query = $parsed['query']; + $no_frag = "$scheme://$host$path?$query"; + } else { + $no_frag = "$scheme://$host$path"; + } + return $no_frag; + } + + function usesExtension($extension_uri) + { + return in_array($extension_uri, $this->type_uris); + } + + function preferredNamespace() + { + if (in_array(Auth_OpenID_TYPE_2_0_IDP, $this->type_uris) || + in_array(Auth_OpenID_TYPE_2_0, $this->type_uris)) { + return Auth_OpenID_OPENID2_NS; + } else { + return Auth_OpenID_OPENID1_NS; + } + } + + /* + * Query this endpoint to see if it has any of the given type + * URIs. This is useful for implementing other endpoint classes + * that e.g. need to check for the presence of multiple versions + * of a single protocol. + * + * @param $type_uris The URIs that you wish to check + * + * @return all types that are in both in type_uris and + * $this->type_uris + */ + function matchTypes($type_uris) + { + $result = array(); + foreach ($type_uris as $test_uri) { + if ($this->supportsType($test_uri)) { + $result[] = $test_uri; + } + } + + return $result; + } + + function supportsType($type_uri) + { + // Does this endpoint support this type? + return ((in_array($type_uri, $this->type_uris)) || + (($type_uri == Auth_OpenID_TYPE_2_0) && + $this->isOPIdentifier())); + } + + function compatibilityMode() + { + return $this->preferredNamespace() != Auth_OpenID_OPENID2_NS; + } + + function isOPIdentifier() + { + return in_array(Auth_OpenID_TYPE_2_0_IDP, $this->type_uris); + } + + function fromOPEndpointURL($op_endpoint_url) + { + // Construct an OP-Identifier OpenIDServiceEndpoint object for + // a given OP Endpoint URL + $obj = new Auth_OpenID_ServiceEndpoint(); + $obj->server_url = $op_endpoint_url; + $obj->type_uris = array(Auth_OpenID_TYPE_2_0_IDP); + return $obj; + } + + function parseService($yadis_url, $uri, $type_uris, $service_element) + { + // Set the state of this object based on the contents of the + // service element. Return true if successful, false if not + // (if findOPLocalIdentifier returns false). + $this->type_uris = $type_uris; + $this->server_url = $uri; + $this->used_yadis = true; + + if (!$this->isOPIdentifier()) { + $this->claimed_id = $yadis_url; + $this->local_id = Auth_OpenID_findOPLocalIdentifier( + $service_element, + $this->type_uris); + if ($this->local_id === false) { + return false; + } + } + + return true; + } + + function getLocalID() + { + // Return the identifier that should be sent as the + // openid.identity_url parameter to the server. + if ($this->local_id === null && $this->canonicalID === null) { + return $this->claimed_id; + } else { + if ($this->local_id) { + return $this->local_id; + } else { + return $this->canonicalID; + } + } + } + + /* + * Parse the given document as XRDS looking for OpenID services. + * + * @return array of Auth_OpenID_ServiceEndpoint or null if the + * document cannot be parsed. + */ + function fromXRDS($uri, $xrds_text) + { + $xrds =& Auth_Yadis_XRDS::parseXRDS($xrds_text); + + if ($xrds) { + $yadis_services = + $xrds->services(array('filter_MatchesAnyOpenIDType')); + return Auth_OpenID_makeOpenIDEndpoints($uri, $yadis_services); + } + + return null; + } + + /* + * Create endpoints from a DiscoveryResult. + * + * @param discoveryResult Auth_Yadis_DiscoveryResult + * @return array of Auth_OpenID_ServiceEndpoint or null if + * endpoints cannot be created. + */ + function fromDiscoveryResult($discoveryResult) + { + if ($discoveryResult->isXRDS()) { + return Auth_OpenID_ServiceEndpoint::fromXRDS( + $discoveryResult->normalized_uri, + $discoveryResult->response_text); + } else { + return Auth_OpenID_ServiceEndpoint::fromHTML( + $discoveryResult->normalized_uri, + $discoveryResult->response_text); + } + } + + function fromHTML($uri, $html) + { + $discovery_types = array( + array(Auth_OpenID_TYPE_2_0, + 'openid2.provider', 'openid2.local_id'), + array(Auth_OpenID_TYPE_1_1, + 'openid.server', 'openid.delegate') + ); + + $services = array(); + + foreach ($discovery_types as $triple) { + list($type_uri, $server_rel, $delegate_rel) = $triple; + + $urls = Auth_OpenID_legacy_discover($html, $server_rel, + $delegate_rel); + + if ($urls === false) { + continue; + } + + list($delegate_url, $server_url) = $urls; + + $service = new Auth_OpenID_ServiceEndpoint(); + $service->claimed_id = $uri; + $service->local_id = $delegate_url; + $service->server_url = $server_url; + $service->type_uris = array($type_uri); + + $services[] = $service; + } + + return $services; + } + + function copy() + { + $x = new Auth_OpenID_ServiceEndpoint(); + + $x->claimed_id = $this->claimed_id; + $x->server_url = $this->server_url; + $x->type_uris = $this->type_uris; + $x->local_id = $this->local_id; + $x->canonicalID = $this->canonicalID; + $x->used_yadis = $this->used_yadis; + + return $x; + } +} + +function Auth_OpenID_findOPLocalIdentifier($service, $type_uris) +{ + // Extract a openid:Delegate value from a Yadis Service element. + // If no delegate is found, returns null. Returns false on + // discovery failure (when multiple delegate/localID tags have + // different values). + + $service->parser->registerNamespace('openid', + Auth_OpenID_XMLNS_1_0); + + $service->parser->registerNamespace('xrd', + Auth_Yadis_XMLNS_XRD_2_0); + + $parser =& $service->parser; + + $permitted_tags = array(); + + if (in_array(Auth_OpenID_TYPE_1_1, $type_uris) || + in_array(Auth_OpenID_TYPE_1_0, $type_uris)) { + $permitted_tags[] = 'openid:Delegate'; + } + + if (in_array(Auth_OpenID_TYPE_2_0, $type_uris)) { + $permitted_tags[] = 'xrd:LocalID'; + } + + $local_id = null; + + foreach ($permitted_tags as $tag_name) { + $tags = $service->getElements($tag_name); + + foreach ($tags as $tag) { + $content = $parser->content($tag); + + if ($local_id === null) { + $local_id = $content; + } else if ($local_id != $content) { + return false; + } + } + } + + return $local_id; +} + +function filter_MatchesAnyOpenIDType(&$service) +{ + $uris = $service->getTypes(); + + foreach ($uris as $uri) { + if (in_array($uri, Auth_OpenID_getOpenIDTypeURIs())) { + return true; + } + } + + return false; +} + +function Auth_OpenID_bestMatchingService($service, $preferred_types) +{ + // Return the index of the first matching type, or something + // higher if no type matches. + // + // This provides an ordering in which service elements that + // contain a type that comes earlier in the preferred types list + // come before service elements that come later. If a service + // element has more than one type, the most preferred one wins. + + foreach ($preferred_types as $index => $typ) { + if (in_array($typ, $service->type_uris)) { + return $index; + } + } + + return count($preferred_types); +} + +function Auth_OpenID_arrangeByType($service_list, $preferred_types) +{ + // Rearrange service_list in a new list so services are ordered by + // types listed in preferred_types. Return the new list. + + // Build a list with the service elements in tuples whose + // comparison will prefer the one with the best matching service + $prio_services = array(); + foreach ($service_list as $index => $service) { + $prio_services[] = array(Auth_OpenID_bestMatchingService($service, + $preferred_types), + $index, $service); + } + + sort($prio_services); + + // Now that the services are sorted by priority, remove the sort + // keys from the list. + foreach ($prio_services as $index => $s) { + $prio_services[$index] = $prio_services[$index][2]; + } + + return $prio_services; +} + +// Extract OP Identifier services. If none found, return the rest, +// sorted with most preferred first according to +// OpenIDServiceEndpoint.openid_type_uris. +// +// openid_services is a list of OpenIDServiceEndpoint objects. +// +// Returns a list of OpenIDServiceEndpoint objects.""" +function Auth_OpenID_getOPOrUserServices($openid_services) +{ + $op_services = Auth_OpenID_arrangeByType($openid_services, + array(Auth_OpenID_TYPE_2_0_IDP)); + + $openid_services = Auth_OpenID_arrangeByType($openid_services, + Auth_OpenID_getOpenIDTypeURIs()); + + if ($op_services) { + return $op_services; + } else { + return $openid_services; + } +} + +function Auth_OpenID_makeOpenIDEndpoints($uri, $yadis_services) +{ + $s = array(); + + if (!$yadis_services) { + return $s; + } + + foreach ($yadis_services as $service) { + $type_uris = $service->getTypes(); + $uris = $service->getURIs(); + + // If any Type URIs match and there is an endpoint URI + // specified, then this is an OpenID endpoint + if ($type_uris && + $uris) { + foreach ($uris as $service_uri) { + $openid_endpoint = new Auth_OpenID_ServiceEndpoint(); + if ($openid_endpoint->parseService($uri, + $service_uri, + $type_uris, + $service)) { + $s[] = $openid_endpoint; + } + } + } + } + + return $s; +} + +function Auth_OpenID_discoverWithYadis($uri, &$fetcher, + $endpoint_filter='Auth_OpenID_getOPOrUserServices', + $discover_function=null) +{ + // Discover OpenID services for a URI. Tries Yadis and falls back + // on old-style discovery if Yadis fails. + + // Might raise a yadis.discover.DiscoveryFailure if no document + // came back for that URI at all. I don't think falling back to + // OpenID 1.0 discovery on the same URL will help, so don't bother + // to catch it. + if ($discover_function === null) { + $discover_function = array('Auth_Yadis_Yadis', 'discover'); + } + + $openid_services = array(); + + $response = call_user_func_array($discover_function, + array($uri, &$fetcher)); + + $yadis_url = $response->normalized_uri; + $yadis_services = array(); + + if ($response->isFailure()) { + return array($uri, array()); + } + + $openid_services = Auth_OpenID_ServiceEndpoint::fromXRDS( + $yadis_url, + $response->response_text); + + if (!$openid_services) { + if ($response->isXRDS()) { + return Auth_OpenID_discoverWithoutYadis($uri, + $fetcher); + } + + // Try to parse the response as HTML to get OpenID 1.0/1.1 + // + $openid_services = Auth_OpenID_ServiceEndpoint::fromHTML( + $yadis_url, + $response->response_text); + } + + $openid_services = call_user_func_array($endpoint_filter, + array(&$openid_services)); + + return array($yadis_url, $openid_services); +} + +function Auth_OpenID_discoverURI($uri, &$fetcher) +{ + $uri = Auth_OpenID::normalizeUrl($uri); + return Auth_OpenID_discoverWithYadis($uri, $fetcher); +} + +function Auth_OpenID_discoverWithoutYadis($uri, &$fetcher) +{ + $http_resp = @$fetcher->get($uri); + + if ($http_resp->status != 200 and $http_resp->status != 206) { + return array($uri, array()); + } + + $identity_url = $http_resp->final_url; + + // Try to parse the response as HTML to get OpenID 1.0/1.1 + $openid_services = Auth_OpenID_ServiceEndpoint::fromHTML( + $identity_url, + $http_resp->body); + + return array($identity_url, $openid_services); +} + +function Auth_OpenID_discoverXRI($iname, &$fetcher) +{ + $resolver = new Auth_Yadis_ProxyResolver($fetcher); + list($canonicalID, $yadis_services) = + $resolver->query($iname, + Auth_OpenID_getOpenIDTypeURIs(), + array('filter_MatchesAnyOpenIDType')); + + $openid_services = Auth_OpenID_makeOpenIDEndpoints($iname, + $yadis_services); + + $openid_services = Auth_OpenID_getOPOrUserServices($openid_services); + + for ($i = 0; $i < count($openid_services); $i++) { + $openid_services[$i]->canonicalID = $canonicalID; + $openid_services[$i]->claimed_id = $canonicalID; + $openid_services[$i]->display_identifier = $iname; + } + + // FIXME: returned xri should probably be in some normal form + return array($iname, $openid_services); +} + +function Auth_OpenID_discover($uri, &$fetcher) +{ + // If the fetcher (i.e., PHP) doesn't support SSL, we can't do + // discovery on an HTTPS URL. + if ($fetcher->isHTTPS($uri) && !$fetcher->supportsSSL()) { + return array($uri, array()); + } + + if (Auth_Yadis_identifierScheme($uri) == 'XRI') { + $result = Auth_OpenID_discoverXRI($uri, $fetcher); + } else { + $result = Auth_OpenID_discoverURI($uri, $fetcher); + } + + // If the fetcher doesn't support SSL, we can't interact with + // HTTPS server URLs; remove those endpoints from the list. + if (!$fetcher->supportsSSL()) { + $http_endpoints = array(); + list($new_uri, $endpoints) = $result; + + foreach ($endpoints as $e) { + if (!$fetcher->isHTTPS($e->server_url)) { + $http_endpoints[] = $e; + } + } + + $result = array($new_uri, $http_endpoints); + } + + return $result; +} + +?> diff --git a/_darcs/pristine/extlib/Auth/OpenID/DumbStore.php b/_darcs/pristine/extlib/Auth/OpenID/DumbStore.php new file mode 100644 index 0000000000..22fd2d3661 --- /dev/null +++ b/_darcs/pristine/extlib/Auth/OpenID/DumbStore.php @@ -0,0 +1,100 @@ + + * @copyright 2005-2008 Janrain, Inc. + * @license http://www.apache.org/licenses/LICENSE-2.0 Apache + */ + +/** + * Import the interface for creating a new store class. + */ +require_once 'Auth/OpenID/Interface.php'; +require_once 'Auth/OpenID/HMAC.php'; + +/** + * This is a store for use in the worst case, when you have no way of + * saving state on the consumer site. Using this store makes the + * consumer vulnerable to replay attacks, as it's unable to use + * nonces. Avoid using this store if it is at all possible. + * + * Most of the methods of this class are implementation details. + * Users of this class need to worry only about the constructor. + * + * @package OpenID + */ +class Auth_OpenID_DumbStore extends Auth_OpenID_OpenIDStore { + + /** + * Creates a new {@link Auth_OpenID_DumbStore} instance. For the security + * of the tokens generated by the library, this class attempts to + * at least have a secure implementation of getAuthKey. + * + * When you create an instance of this class, pass in a secret + * phrase. The phrase is hashed with sha1 to make it the correct + * length and form for an auth key. That allows you to use a long + * string as the secret phrase, which means you can make it very + * difficult to guess. + * + * Each {@link Auth_OpenID_DumbStore} instance that is created for use by + * your consumer site needs to use the same $secret_phrase. + * + * @param string secret_phrase The phrase used to create the auth + * key returned by getAuthKey + */ + function Auth_OpenID_DumbStore($secret_phrase) + { + $this->auth_key = Auth_OpenID_SHA1($secret_phrase); + } + + /** + * This implementation does nothing. + */ + function storeAssociation($server_url, $association) + { + } + + /** + * This implementation always returns null. + */ + function getAssociation($server_url, $handle = null) + { + return null; + } + + /** + * This implementation always returns false. + */ + function removeAssociation($server_url, $handle) + { + return false; + } + + /** + * In a system truly limited to dumb mode, nonces must all be + * accepted. This therefore always returns true, which makes + * replay attacks feasible. + */ + function useNonce($server_url, $timestamp, $salt) + { + return true; + } + + /** + * This method returns the auth key generated by the constructor. + */ + function getAuthKey() + { + return $this->auth_key; + } +} + +?> \ No newline at end of file diff --git a/_darcs/pristine/extlib/Auth/OpenID/Extension.php b/_darcs/pristine/extlib/Auth/OpenID/Extension.php new file mode 100644 index 0000000000..f362a4b389 --- /dev/null +++ b/_darcs/pristine/extlib/Auth/OpenID/Extension.php @@ -0,0 +1,62 @@ +isOpenID1(); + $added = $message->namespaces->addAlias($this->ns_uri, + $this->ns_alias, + $implicit); + + if ($added === null) { + if ($message->namespaces->getAlias($this->ns_uri) != + $this->ns_alias) { + return null; + } + } + + $message->updateArgs($this->ns_uri, + $this->getExtensionArgs()); + return $message; + } +} + +?> \ No newline at end of file diff --git a/_darcs/pristine/extlib/Auth/OpenID/FileStore.php b/_darcs/pristine/extlib/Auth/OpenID/FileStore.php new file mode 100644 index 0000000000..29d8d20e76 --- /dev/null +++ b/_darcs/pristine/extlib/Auth/OpenID/FileStore.php @@ -0,0 +1,618 @@ + + * @copyright 2005-2008 Janrain, Inc. + * @license http://www.apache.org/licenses/LICENSE-2.0 Apache + */ + +/** + * Require base class for creating a new interface. + */ +require_once 'Auth/OpenID.php'; +require_once 'Auth/OpenID/Interface.php'; +require_once 'Auth/OpenID/HMAC.php'; +require_once 'Auth/OpenID/Nonce.php'; + +/** + * This is a filesystem-based store for OpenID associations and + * nonces. This store should be safe for use in concurrent systems on + * both windows and unix (excluding NFS filesystems). There are a + * couple race conditions in the system, but those failure cases have + * been set up in such a way that the worst-case behavior is someone + * having to try to log in a second time. + * + * Most of the methods of this class are implementation details. + * People wishing to just use this store need only pay attention to + * the constructor. + * + * @package OpenID + */ +class Auth_OpenID_FileStore extends Auth_OpenID_OpenIDStore { + + /** + * Initializes a new {@link Auth_OpenID_FileStore}. This + * initializes the nonce and association directories, which are + * subdirectories of the directory passed in. + * + * @param string $directory This is the directory to put the store + * directories in. + */ + function Auth_OpenID_FileStore($directory) + { + if (!Auth_OpenID::ensureDir($directory)) { + trigger_error('Not a directory and failed to create: ' + . $directory, E_USER_ERROR); + } + $directory = realpath($directory); + + $this->directory = $directory; + $this->active = true; + + $this->nonce_dir = $directory . DIRECTORY_SEPARATOR . 'nonces'; + + $this->association_dir = $directory . DIRECTORY_SEPARATOR . + 'associations'; + + // Temp dir must be on the same filesystem as the assciations + // $directory. + $this->temp_dir = $directory . DIRECTORY_SEPARATOR . 'temp'; + + $this->max_nonce_age = 6 * 60 * 60; // Six hours, in seconds + + if (!$this->_setup()) { + trigger_error('Failed to initialize OpenID file store in ' . + $directory, E_USER_ERROR); + } + } + + function destroy() + { + Auth_OpenID_FileStore::_rmtree($this->directory); + $this->active = false; + } + + /** + * Make sure that the directories in which we store our data + * exist. + * + * @access private + */ + function _setup() + { + return (Auth_OpenID::ensureDir($this->nonce_dir) && + Auth_OpenID::ensureDir($this->association_dir) && + Auth_OpenID::ensureDir($this->temp_dir)); + } + + /** + * Create a temporary file on the same filesystem as + * $this->association_dir. + * + * The temporary directory should not be cleaned if there are any + * processes using the store. If there is no active process using + * the store, it is safe to remove all of the files in the + * temporary directory. + * + * @return array ($fd, $filename) + * @access private + */ + function _mktemp() + { + $name = Auth_OpenID_FileStore::_mkstemp($dir = $this->temp_dir); + $file_obj = @fopen($name, 'wb'); + if ($file_obj !== false) { + return array($file_obj, $name); + } else { + Auth_OpenID_FileStore::_removeIfPresent($name); + } + } + + function cleanupNonces() + { + global $Auth_OpenID_SKEW; + + $nonces = Auth_OpenID_FileStore::_listdir($this->nonce_dir); + $now = time(); + + $removed = 0; + // Check all nonces for expiry + foreach ($nonces as $nonce_fname) { + $base = basename($nonce_fname); + $parts = explode('-', $base, 2); + $timestamp = $parts[0]; + $timestamp = intval($timestamp, 16); + if (abs($timestamp - $now) > $Auth_OpenID_SKEW) { + Auth_OpenID_FileStore::_removeIfPresent($nonce_fname); + $removed += 1; + } + } + return $removed; + } + + /** + * Create a unique filename for a given server url and + * handle. This implementation does not assume anything about the + * format of the handle. The filename that is returned will + * contain the domain name from the server URL for ease of human + * inspection of the data directory. + * + * @return string $filename + */ + function getAssociationFilename($server_url, $handle) + { + if (!$this->active) { + trigger_error("FileStore no longer active", E_USER_ERROR); + return null; + } + + if (strpos($server_url, '://') === false) { + trigger_error(sprintf("Bad server URL: %s", $server_url), + E_USER_WARNING); + return null; + } + + list($proto, $rest) = explode('://', $server_url, 2); + $parts = explode('/', $rest); + $domain = Auth_OpenID_FileStore::_filenameEscape($parts[0]); + $url_hash = Auth_OpenID_FileStore::_safe64($server_url); + if ($handle) { + $handle_hash = Auth_OpenID_FileStore::_safe64($handle); + } else { + $handle_hash = ''; + } + + $filename = sprintf('%s-%s-%s-%s', $proto, $domain, $url_hash, + $handle_hash); + + return $this->association_dir. DIRECTORY_SEPARATOR . $filename; + } + + /** + * Store an association in the association directory. + */ + function storeAssociation($server_url, $association) + { + if (!$this->active) { + trigger_error("FileStore no longer active", E_USER_ERROR); + return false; + } + + $association_s = $association->serialize(); + $filename = $this->getAssociationFilename($server_url, + $association->handle); + list($tmp_file, $tmp) = $this->_mktemp(); + + if (!$tmp_file) { + trigger_error("_mktemp didn't return a valid file descriptor", + E_USER_WARNING); + return false; + } + + fwrite($tmp_file, $association_s); + + fflush($tmp_file); + + fclose($tmp_file); + + if (@rename($tmp, $filename)) { + return true; + } else { + // In case we are running on Windows, try unlinking the + // file in case it exists. + @unlink($filename); + + // Now the target should not exist. Try renaming again, + // giving up if it fails. + if (@rename($tmp, $filename)) { + return true; + } + } + + // If there was an error, don't leave the temporary file + // around. + Auth_OpenID_FileStore::_removeIfPresent($tmp); + return false; + } + + /** + * Retrieve an association. If no handle is specified, return the + * association with the most recent issue time. + * + * @return mixed $association + */ + function getAssociation($server_url, $handle = null) + { + if (!$this->active) { + trigger_error("FileStore no longer active", E_USER_ERROR); + return null; + } + + if ($handle === null) { + $handle = ''; + } + + // The filename with the empty handle is a prefix of all other + // associations for the given server URL. + $filename = $this->getAssociationFilename($server_url, $handle); + + if ($handle) { + return $this->_getAssociation($filename); + } else { + $association_files = + Auth_OpenID_FileStore::_listdir($this->association_dir); + $matching_files = array(); + + // strip off the path to do the comparison + $name = basename($filename); + foreach ($association_files as $association_file) { + $base = basename($association_file); + if (strpos($base, $name) === 0) { + $matching_files[] = $association_file; + } + } + + $matching_associations = array(); + // read the matching files and sort by time issued + foreach ($matching_files as $full_name) { + $association = $this->_getAssociation($full_name); + if ($association !== null) { + $matching_associations[] = array($association->issued, + $association); + } + } + + $issued = array(); + $assocs = array(); + foreach ($matching_associations as $key => $assoc) { + $issued[$key] = $assoc[0]; + $assocs[$key] = $assoc[1]; + } + + array_multisort($issued, SORT_DESC, $assocs, SORT_DESC, + $matching_associations); + + // return the most recently issued one. + if ($matching_associations) { + list($issued, $assoc) = $matching_associations[0]; + return $assoc; + } else { + return null; + } + } + } + + /** + * @access private + */ + function _getAssociation($filename) + { + if (!$this->active) { + trigger_error("FileStore no longer active", E_USER_ERROR); + return null; + } + + $assoc_file = @fopen($filename, 'rb'); + + if ($assoc_file === false) { + return null; + } + + $assoc_s = fread($assoc_file, filesize($filename)); + fclose($assoc_file); + + if (!$assoc_s) { + return null; + } + + $association = + Auth_OpenID_Association::deserialize('Auth_OpenID_Association', + $assoc_s); + + if (!$association) { + Auth_OpenID_FileStore::_removeIfPresent($filename); + return null; + } + + if ($association->getExpiresIn() == 0) { + Auth_OpenID_FileStore::_removeIfPresent($filename); + return null; + } else { + return $association; + } + } + + /** + * Remove an association if it exists. Do nothing if it does not. + * + * @return bool $success + */ + function removeAssociation($server_url, $handle) + { + if (!$this->active) { + trigger_error("FileStore no longer active", E_USER_ERROR); + return null; + } + + $assoc = $this->getAssociation($server_url, $handle); + if ($assoc === null) { + return false; + } else { + $filename = $this->getAssociationFilename($server_url, $handle); + return Auth_OpenID_FileStore::_removeIfPresent($filename); + } + } + + /** + * Return whether this nonce is present. As a side effect, mark it + * as no longer present. + * + * @return bool $present + */ + function useNonce($server_url, $timestamp, $salt) + { + global $Auth_OpenID_SKEW; + + if (!$this->active) { + trigger_error("FileStore no longer active", E_USER_ERROR); + return null; + } + + if ( abs($timestamp - time()) > $Auth_OpenID_SKEW ) { + return False; + } + + if ($server_url) { + list($proto, $rest) = explode('://', $server_url, 2); + } else { + $proto = ''; + $rest = ''; + } + + $parts = explode('/', $rest, 2); + $domain = $this->_filenameEscape($parts[0]); + $url_hash = $this->_safe64($server_url); + $salt_hash = $this->_safe64($salt); + + $filename = sprintf('%08x-%s-%s-%s-%s', $timestamp, $proto, + $domain, $url_hash, $salt_hash); + $filename = $this->nonce_dir . DIRECTORY_SEPARATOR . $filename; + + $result = @fopen($filename, 'x'); + + if ($result === false) { + return false; + } else { + fclose($result); + return true; + } + } + + /** + * Remove expired entries from the database. This is potentially + * expensive, so only run when it is acceptable to take time. + * + * @access private + */ + function _allAssocs() + { + $all_associations = array(); + + $association_filenames = + Auth_OpenID_FileStore::_listdir($this->association_dir); + + foreach ($association_filenames as $association_filename) { + $association_file = fopen($association_filename, 'rb'); + + if ($association_file !== false) { + $assoc_s = fread($association_file, + filesize($association_filename)); + fclose($association_file); + + // Remove expired or corrupted associations + $association = + Auth_OpenID_Association::deserialize( + 'Auth_OpenID_Association', $assoc_s); + + if ($association === null) { + Auth_OpenID_FileStore::_removeIfPresent( + $association_filename); + } else { + if ($association->getExpiresIn() == 0) { + $all_associations[] = array($association_filename, + $association); + } + } + } + } + + return $all_associations; + } + + function clean() + { + if (!$this->active) { + trigger_error("FileStore no longer active", E_USER_ERROR); + return null; + } + + $nonces = Auth_OpenID_FileStore::_listdir($this->nonce_dir); + $now = time(); + + // Check all nonces for expiry + foreach ($nonces as $nonce) { + if (!Auth_OpenID_checkTimestamp($nonce, $now)) { + $filename = $this->nonce_dir . DIRECTORY_SEPARATOR . $nonce; + Auth_OpenID_FileStore::_removeIfPresent($filename); + } + } + + foreach ($this->_allAssocs() as $pair) { + list($assoc_filename, $assoc) = $pair; + if ($assoc->getExpiresIn() == 0) { + Auth_OpenID_FileStore::_removeIfPresent($assoc_filename); + } + } + } + + /** + * @access private + */ + function _rmtree($dir) + { + if ($dir[strlen($dir) - 1] != DIRECTORY_SEPARATOR) { + $dir .= DIRECTORY_SEPARATOR; + } + + if ($handle = opendir($dir)) { + while ($item = readdir($handle)) { + if (!in_array($item, array('.', '..'))) { + if (is_dir($dir . $item)) { + + if (!Auth_OpenID_FileStore::_rmtree($dir . $item)) { + return false; + } + } else if (is_file($dir . $item)) { + if (!unlink($dir . $item)) { + return false; + } + } + } + } + + closedir($handle); + + if (!@rmdir($dir)) { + return false; + } + + return true; + } else { + // Couldn't open directory. + return false; + } + } + + /** + * @access private + */ + function _mkstemp($dir) + { + foreach (range(0, 4) as $i) { + $name = tempnam($dir, "php_openid_filestore_"); + + if ($name !== false) { + return $name; + } + } + return false; + } + + /** + * @access private + */ + function _mkdtemp($dir) + { + foreach (range(0, 4) as $i) { + $name = $dir . strval(DIRECTORY_SEPARATOR) . strval(getmypid()) . + "-" . strval(rand(1, time())); + if (!mkdir($name, 0700)) { + return false; + } else { + return $name; + } + } + return false; + } + + /** + * @access private + */ + function _listdir($dir) + { + $handle = opendir($dir); + $files = array(); + while (false !== ($filename = readdir($handle))) { + if (!in_array($filename, array('.', '..'))) { + $files[] = $dir . DIRECTORY_SEPARATOR . $filename; + } + } + return $files; + } + + /** + * @access private + */ + function _isFilenameSafe($char) + { + $_Auth_OpenID_filename_allowed = Auth_OpenID_letters . + Auth_OpenID_digits . "."; + return (strpos($_Auth_OpenID_filename_allowed, $char) !== false); + } + + /** + * @access private + */ + function _safe64($str) + { + $h64 = base64_encode(Auth_OpenID_SHA1($str)); + $h64 = str_replace('+', '_', $h64); + $h64 = str_replace('/', '.', $h64); + $h64 = str_replace('=', '', $h64); + return $h64; + } + + /** + * @access private + */ + function _filenameEscape($str) + { + $filename = ""; + $b = Auth_OpenID::toBytes($str); + + for ($i = 0; $i < count($b); $i++) { + $c = $b[$i]; + if (Auth_OpenID_FileStore::_isFilenameSafe($c)) { + $filename .= $c; + } else { + $filename .= sprintf("_%02X", ord($c)); + } + } + return $filename; + } + + /** + * Attempt to remove a file, returning whether the file existed at + * the time of the call. + * + * @access private + * @return bool $result True if the file was present, false if not. + */ + function _removeIfPresent($filename) + { + return @unlink($filename); + } + + function cleanupAssociations() + { + $removed = 0; + foreach ($this->_allAssocs() as $pair) { + list($assoc_filename, $assoc) = $pair; + if ($assoc->getExpiresIn() == 0) { + $this->_removeIfPresent($assoc_filename); + $removed += 1; + } + } + return $removed; + } +} + +?> diff --git a/_darcs/pristine/extlib/Auth/OpenID/HMAC.php b/_darcs/pristine/extlib/Auth/OpenID/HMAC.php new file mode 100644 index 0000000000..ec42db8dfc --- /dev/null +++ b/_darcs/pristine/extlib/Auth/OpenID/HMAC.php @@ -0,0 +1,99 @@ + + * @copyright 2005-2008 Janrain, Inc. + * @license http://www.apache.org/licenses/LICENSE-2.0 Apache + */ + +require_once 'Auth/OpenID.php'; + +/** + * SHA1_BLOCKSIZE is this module's SHA1 blocksize used by the fallback + * implementation. + */ +define('Auth_OpenID_SHA1_BLOCKSIZE', 64); + +function Auth_OpenID_SHA1($text) +{ + if (function_exists('hash') && + function_exists('hash_algos') && + (in_array('sha1', hash_algos()))) { + // PHP 5 case (sometimes): 'hash' available and 'sha1' algo + // supported. + return hash('sha1', $text, true); + } else if (function_exists('sha1')) { + // PHP 4 case: 'sha1' available. + $hex = sha1($text); + $raw = ''; + for ($i = 0; $i < 40; $i += 2) { + $hexcode = substr($hex, $i, 2); + $charcode = (int)base_convert($hexcode, 16, 10); + $raw .= chr($charcode); + } + return $raw; + } else { + // Explode. + trigger_error('No SHA1 function found', E_USER_ERROR); + } +} + +/** + * Compute an HMAC/SHA1 hash. + * + * @access private + * @param string $key The HMAC key + * @param string $text The message text to hash + * @return string $mac The MAC + */ +function Auth_OpenID_HMACSHA1($key, $text) +{ + if (Auth_OpenID::bytes($key) > Auth_OpenID_SHA1_BLOCKSIZE) { + $key = Auth_OpenID_SHA1($key, true); + } + + $key = str_pad($key, Auth_OpenID_SHA1_BLOCKSIZE, chr(0x00)); + $ipad = str_repeat(chr(0x36), Auth_OpenID_SHA1_BLOCKSIZE); + $opad = str_repeat(chr(0x5c), Auth_OpenID_SHA1_BLOCKSIZE); + $hash1 = Auth_OpenID_SHA1(($key ^ $ipad) . $text, true); + $hmac = Auth_OpenID_SHA1(($key ^ $opad) . $hash1, true); + return $hmac; +} + +if (function_exists('hash') && + function_exists('hash_algos') && + (in_array('sha256', hash_algos()))) { + function Auth_OpenID_SHA256($text) + { + // PHP 5 case: 'hash' available and 'sha256' algo supported. + return hash('sha256', $text, true); + } + define('Auth_OpenID_SHA256_SUPPORTED', true); +} else { + define('Auth_OpenID_SHA256_SUPPORTED', false); +} + +if (function_exists('hash_hmac') && + function_exists('hash_algos') && + (in_array('sha256', hash_algos()))) { + + function Auth_OpenID_HMACSHA256($key, $text) + { + // Return raw MAC (not hex string). + return hash_hmac('sha256', $text, $key, true); + } + + define('Auth_OpenID_HMACSHA256_SUPPORTED', true); +} else { + define('Auth_OpenID_HMACSHA256_SUPPORTED', false); +} + +?> \ No newline at end of file diff --git a/_darcs/pristine/extlib/Auth/OpenID/Interface.php b/_darcs/pristine/extlib/Auth/OpenID/Interface.php new file mode 100644 index 0000000000..f4c6062f8c --- /dev/null +++ b/_darcs/pristine/extlib/Auth/OpenID/Interface.php @@ -0,0 +1,197 @@ + + * @copyright 2005-2008 Janrain, Inc. + * @license http://www.apache.org/licenses/LICENSE-2.0 Apache + */ + +/** + * This is the interface for the store objects the OpenID library + * uses. It is a single class that provides all of the persistence + * mechanisms that the OpenID library needs, for both servers and + * consumers. If you want to create an SQL-driven store, please see + * then {@link Auth_OpenID_SQLStore} class. + * + * Change: Version 2.0 removed the storeNonce, getAuthKey, and isDumb + * methods, and changed the behavior of the useNonce method to support + * one-way nonces. + * + * @package OpenID + * @author JanRain, Inc. + */ +class Auth_OpenID_OpenIDStore { + /** + * This method puts an Association object into storage, + * retrievable by server URL and handle. + * + * @param string $server_url The URL of the identity server that + * this association is with. Because of the way the server portion + * of the library uses this interface, don't assume there are any + * limitations on the character set of the input string. In + * particular, expect to see unescaped non-url-safe characters in + * the server_url field. + * + * @param Association $association The Association to store. + */ + function storeAssociation($server_url, $association) + { + trigger_error("Auth_OpenID_OpenIDStore::storeAssociation ". + "not implemented", E_USER_ERROR); + } + + /* + * Remove expired nonces from the store. + * + * Discards any nonce from storage that is old enough that its + * timestamp would not pass useNonce(). + * + * This method is not called in the normal operation of the + * library. It provides a way for store admins to keep their + * storage from filling up with expired data. + * + * @return the number of nonces expired + */ + function cleanupNonces() + { + trigger_error("Auth_OpenID_OpenIDStore::cleanupNonces ". + "not implemented", E_USER_ERROR); + } + + /* + * Remove expired associations from the store. + * + * This method is not called in the normal operation of the + * library. It provides a way for store admins to keep their + * storage from filling up with expired data. + * + * @return the number of associations expired. + */ + function cleanupAssociations() + { + trigger_error("Auth_OpenID_OpenIDStore::cleanupAssociations ". + "not implemented", E_USER_ERROR); + } + + /* + * Shortcut for cleanupNonces(), cleanupAssociations(). + * + * This method is not called in the normal operation of the + * library. It provides a way for store admins to keep their + * storage from filling up with expired data. + */ + function cleanup() + { + return array($this->cleanupNonces(), + $this->cleanupAssociations()); + } + + /** + * Report whether this storage supports cleanup + */ + function supportsCleanup() + { + return true; + } + + /** + * This method returns an Association object from storage that + * matches the server URL and, if specified, handle. It returns + * null if no such association is found or if the matching + * association is expired. + * + * If no handle is specified, the store may return any association + * which matches the server URL. If multiple associations are + * valid, the recommended return value for this method is the one + * most recently issued. + * + * This method is allowed (and encouraged) to garbage collect + * expired associations when found. This method must not return + * expired associations. + * + * @param string $server_url The URL of the identity server to get + * the association for. Because of the way the server portion of + * the library uses this interface, don't assume there are any + * limitations on the character set of the input string. In + * particular, expect to see unescaped non-url-safe characters in + * the server_url field. + * + * @param mixed $handle This optional parameter is the handle of + * the specific association to get. If no specific handle is + * provided, any valid association matching the server URL is + * returned. + * + * @return Association The Association for the given identity + * server. + */ + function getAssociation($server_url, $handle = null) + { + trigger_error("Auth_OpenID_OpenIDStore::getAssociation ". + "not implemented", E_USER_ERROR); + } + + /** + * This method removes the matching association if it's found, and + * returns whether the association was removed or not. + * + * @param string $server_url The URL of the identity server the + * association to remove belongs to. Because of the way the server + * portion of the library uses this interface, don't assume there + * are any limitations on the character set of the input + * string. In particular, expect to see unescaped non-url-safe + * characters in the server_url field. + * + * @param string $handle This is the handle of the association to + * remove. If there isn't an association found that matches both + * the given URL and handle, then there was no matching handle + * found. + * + * @return mixed Returns whether or not the given association existed. + */ + function removeAssociation($server_url, $handle) + { + trigger_error("Auth_OpenID_OpenIDStore::removeAssociation ". + "not implemented", E_USER_ERROR); + } + + /** + * Called when using a nonce. + * + * This method should return C{True} if the nonce has not been + * used before, and store it for a while to make sure nobody + * tries to use the same value again. If the nonce has already + * been used, return C{False}. + * + * Change: In earlier versions, round-trip nonces were used and a + * nonce was only valid if it had been previously stored with + * storeNonce. Version 2.0 uses one-way nonces, requiring a + * different implementation here that does not depend on a + * storeNonce call. (storeNonce is no longer part of the + * interface. + * + * @param string $nonce The nonce to use. + * + * @return bool Whether or not the nonce was valid. + */ + function useNonce($server_url, $timestamp, $salt) + { + trigger_error("Auth_OpenID_OpenIDStore::useNonce ". + "not implemented", E_USER_ERROR); + } + + /** + * Removes all entries from the store; implementation is optional. + */ + function reset() + { + } + +} +?> \ No newline at end of file diff --git a/_darcs/pristine/extlib/Auth/OpenID/KVForm.php b/_darcs/pristine/extlib/Auth/OpenID/KVForm.php new file mode 100644 index 0000000000..fb342a0013 --- /dev/null +++ b/_darcs/pristine/extlib/Auth/OpenID/KVForm.php @@ -0,0 +1,112 @@ + + * @copyright 2005-2008 Janrain, Inc. + * @license http://www.apache.org/licenses/LICENSE-2.0 Apache + */ + +/** + * Container for key-value/comma-newline OpenID format and parsing + */ +class Auth_OpenID_KVForm { + /** + * Convert an OpenID colon/newline separated string into an + * associative array + * + * @static + * @access private + */ + function toArray($kvs, $strict=false) + { + $lines = explode("\n", $kvs); + + $last = array_pop($lines); + if ($last !== '') { + array_push($lines, $last); + if ($strict) { + return false; + } + } + + $values = array(); + + for ($lineno = 0; $lineno < count($lines); $lineno++) { + $line = $lines[$lineno]; + $kv = explode(':', $line, 2); + if (count($kv) != 2) { + if ($strict) { + return false; + } + continue; + } + + $key = $kv[0]; + $tkey = trim($key); + if ($tkey != $key) { + if ($strict) { + return false; + } + } + + $value = $kv[1]; + $tval = trim($value); + if ($tval != $value) { + if ($strict) { + return false; + } + } + + $values[$tkey] = $tval; + } + + return $values; + } + + /** + * Convert an array into an OpenID colon/newline separated string + * + * @static + * @access private + */ + function fromArray($values) + { + if ($values === null) { + return null; + } + + ksort($values); + + $serialized = ''; + foreach ($values as $key => $value) { + if (is_array($value)) { + list($key, $value) = array($value[0], $value[1]); + } + + if (strpos($key, ':') !== false) { + return null; + } + + if (strpos($key, "\n") !== false) { + return null; + } + + if (strpos($value, "\n") !== false) { + return null; + } + $serialized .= "$key:$value\n"; + } + return $serialized; + } +} + +?> \ No newline at end of file diff --git a/_darcs/pristine/extlib/Auth/OpenID/MemcachedStore.php b/_darcs/pristine/extlib/Auth/OpenID/MemcachedStore.php new file mode 100644 index 0000000000..d357c6b11d --- /dev/null +++ b/_darcs/pristine/extlib/Auth/OpenID/MemcachedStore.php @@ -0,0 +1,208 @@ + + * @copyright 2008 JanRain, Inc. + * @license http://www.apache.org/licenses/LICENSE-2.0 Apache + * Contributed by Open Web Technologies + */ + +/** + * Import the interface for creating a new store class. + */ +require_once 'Auth/OpenID/Interface.php'; + +/** + * This is a memcached-based store for OpenID associations and + * nonces. + * + * As memcache has limit of 250 chars for key length, + * server_url, handle and salt are hashed with sha1(). + * + * Most of the methods of this class are implementation details. + * People wishing to just use this store need only pay attention to + * the constructor. + * + * @package OpenID + */ +class Auth_OpenID_MemcachedStore extends Auth_OpenID_OpenIDStore { + + /** + * Initializes a new {@link Auth_OpenID_MemcachedStore} instance. + * Just saves memcached object as property. + * + * @param resource connection Memcache connection resourse + */ + function Auth_OpenID_MemcachedStore($connection, $compress = false) + { + $this->connection = $connection; + $this->compress = $compress ? MEMCACHE_COMPRESSED : 0; + } + + /** + * Store association until its expiration time in memcached. + * Overwrites any existing association with same server_url and + * handle. Handles list of associations for every server. + */ + function storeAssociation($server_url, $association) + { + // create memcached keys for association itself + // and list of associations for this server + $associationKey = $this->associationKey($server_url, + $association->handle); + $serverKey = $this->associationServerKey($server_url); + + // get list of associations + $serverAssociations = $this->connection->get($serverKey); + + // if no such list, initialize it with empty array + if (!$serverAssociations) { + $serverAssociations = array(); + } + // and store given association key in it + $serverAssociations[$association->issued] = $associationKey; + + // save associations' keys list + $this->connection->set( + $serverKey, + $serverAssociations, + $this->compress + ); + // save association itself + $this->connection->set( + $associationKey, + $association, + $this->compress, + $association->issued + $association->lifetime); + } + + /** + * Read association from memcached. If no handle given + * and multiple associations found, returns latest issued + */ + function getAssociation($server_url, $handle = null) + { + // simple case: handle given + if ($handle !== null) { + // get association, return null if failed + $association = $this->connection->get( + $this->associationKey($server_url, $handle)); + return $association ? $association : null; + } + + // no handle given, working with list + // create key for list of associations + $serverKey = $this->associationServerKey($server_url); + + // get list of associations + $serverAssociations = $this->connection->get($serverKey); + // return null if failed or got empty list + if (!$serverAssociations) { + return null; + } + + // get key of most recently issued association + $keys = array_keys($serverAssociations); + sort($keys); + $lastKey = $serverAssociations[array_pop($keys)]; + + // get association, return null if failed + $association = $this->connection->get($lastKey); + return $association ? $association : null; + } + + /** + * Immediately delete association from memcache. + */ + function removeAssociation($server_url, $handle) + { + // create memcached keys for association itself + // and list of associations for this server + $serverKey = $this->associationServerKey($server_url); + $associationKey = $this->associationKey($server_url, + $handle); + + // get list of associations + $serverAssociations = $this->connection->get($serverKey); + // return null if failed or got empty list + if (!$serverAssociations) { + return false; + } + + // ensure that given association key exists in list + $serverAssociations = array_flip($serverAssociations); + if (!array_key_exists($associationKey, $serverAssociations)) { + return false; + } + + // remove given association key from list + unset($serverAssociations[$associationKey]); + $serverAssociations = array_flip($serverAssociations); + + // save updated list + $this->connection->set( + $serverKey, + $serverAssociations, + $this->compress + ); + + // delete association + return $this->connection->delete($associationKey); + } + + /** + * Create nonce for server and salt, expiring after + * $Auth_OpenID_SKEW seconds. + */ + function useNonce($server_url, $timestamp, $salt) + { + global $Auth_OpenID_SKEW; + + // save one request to memcache when nonce obviously expired + if (abs($timestamp - time()) > $Auth_OpenID_SKEW) { + return false; + } + + // returns false when nonce already exists + // otherwise adds nonce + return $this->connection->add( + 'openid_nonce_' . sha1($server_url) . '_' . sha1($salt), + 1, // any value here + $this->compress, + $Auth_OpenID_SKEW); + } + + /** + * Memcache key is prefixed with 'openid_association_' string. + */ + function associationKey($server_url, $handle = null) + { + return 'openid_association_' . sha1($server_url) . '_' . sha1($handle); + } + + /** + * Memcache key is prefixed with 'openid_association_' string. + */ + function associationServerKey($server_url) + { + return 'openid_association_server_' . sha1($server_url); + } + + /** + * Report that this storage doesn't support cleanup + */ + function supportsCleanup() + { + return false; + } +} + +?> \ No newline at end of file diff --git a/_darcs/pristine/extlib/Auth/OpenID/Message.php b/_darcs/pristine/extlib/Auth/OpenID/Message.php new file mode 100644 index 0000000000..fd23e67a3c --- /dev/null +++ b/_darcs/pristine/extlib/Auth/OpenID/Message.php @@ -0,0 +1,915 @@ +keys = array(); + $this->values = array(); + + if (is_array($classic_array)) { + foreach ($classic_array as $key => $value) { + $this->set($key, $value); + } + } + } + + /** + * Returns true if $thing is an Auth_OpenID_Mapping object; false + * if not. + */ + function isA($thing) + { + return (is_object($thing) && + strtolower(get_class($thing)) == 'auth_openid_mapping'); + } + + /** + * Returns an array of the keys in the mapping. + */ + function keys() + { + return $this->keys; + } + + /** + * Returns an array of values in the mapping. + */ + function values() + { + return $this->values; + } + + /** + * Returns an array of (key, value) pairs in the mapping. + */ + function items() + { + $temp = array(); + + for ($i = 0; $i < count($this->keys); $i++) { + $temp[] = array($this->keys[$i], + $this->values[$i]); + } + return $temp; + } + + /** + * Returns the "length" of the mapping, or the number of keys. + */ + function len() + { + return count($this->keys); + } + + /** + * Sets a key-value pair in the mapping. If the key already + * exists, its value is replaced with the new value. + */ + function set($key, $value) + { + $index = array_search($key, $this->keys); + + if ($index !== false) { + $this->values[$index] = $value; + } else { + $this->keys[] = $key; + $this->values[] = $value; + } + } + + /** + * Gets a specified value from the mapping, associated with the + * specified key. If the key does not exist in the mapping, + * $default is returned instead. + */ + function get($key, $default = null) + { + $index = array_search($key, $this->keys); + + if ($index !== false) { + return $this->values[$index]; + } else { + return $default; + } + } + + /** + * @access private + */ + function _reflow() + { + // PHP is broken yet again. Sort the arrays to remove the + // hole in the numeric indexes that make up the array. + $old_keys = $this->keys; + $old_values = $this->values; + + $this->keys = array(); + $this->values = array(); + + foreach ($old_keys as $k) { + $this->keys[] = $k; + } + + foreach ($old_values as $v) { + $this->values[] = $v; + } + } + + /** + * Deletes a key-value pair from the mapping with the specified + * key. + */ + function del($key) + { + $index = array_search($key, $this->keys); + + if ($index !== false) { + unset($this->keys[$index]); + unset($this->values[$index]); + $this->_reflow(); + return true; + } + return false; + } + + /** + * Returns true if the specified value has a key in the mapping; + * false if not. + */ + function contains($value) + { + return (array_search($value, $this->keys) !== false); + } +} + +/** + * Maintains a bijective map between namespace uris and aliases. + * + * @package OpenID + */ +class Auth_OpenID_NamespaceMap { + function Auth_OpenID_NamespaceMap() + { + $this->alias_to_namespace = new Auth_OpenID_Mapping(); + $this->namespace_to_alias = new Auth_OpenID_Mapping(); + $this->implicit_namespaces = array(); + } + + function getAlias($namespace_uri) + { + return $this->namespace_to_alias->get($namespace_uri); + } + + function getNamespaceURI($alias) + { + return $this->alias_to_namespace->get($alias); + } + + function iterNamespaceURIs() + { + // Return an iterator over the namespace URIs + return $this->namespace_to_alias->keys(); + } + + function iterAliases() + { + // Return an iterator over the aliases""" + return $this->alias_to_namespace->keys(); + } + + function iteritems() + { + return $this->namespace_to_alias->items(); + } + + function isImplicit($namespace_uri) + { + return in_array($namespace_uri, $this->implicit_namespaces); + } + + function addAlias($namespace_uri, $desired_alias, $implicit=false) + { + // Add an alias from this namespace URI to the desired alias + global $Auth_OpenID_OPENID_PROTOCOL_FIELDS; + + // Check that desired_alias is not an openid protocol field as + // per the spec. + if (in_array($desired_alias, $Auth_OpenID_OPENID_PROTOCOL_FIELDS)) { + Auth_OpenID::log("\"%s\" is not an allowed namespace alias", + $desired_alias); + return null; + } + + // Check that desired_alias does not contain a period as per + // the spec. + if (strpos($desired_alias, '.') !== false) { + Auth_OpenID::log('"%s" must not contain a dot', $desired_alias); + return null; + } + + // Check that there is not a namespace already defined for the + // desired alias + $current_namespace_uri = + $this->alias_to_namespace->get($desired_alias); + + if (($current_namespace_uri !== null) && + ($current_namespace_uri != $namespace_uri)) { + Auth_OpenID::log('Cannot map "%s" because previous mapping exists', + $namespace_uri); + return null; + } + + // Check that there is not already a (different) alias for + // this namespace URI + $alias = $this->namespace_to_alias->get($namespace_uri); + + if (($alias !== null) && ($alias != $desired_alias)) { + Auth_OpenID::log('Cannot map %s to alias %s. ' . + 'It is already mapped to alias %s', + $namespace_uri, $desired_alias, $alias); + return null; + } + + assert((Auth_OpenID_NULL_NAMESPACE === $desired_alias) || + is_string($desired_alias)); + + $this->alias_to_namespace->set($desired_alias, $namespace_uri); + $this->namespace_to_alias->set($namespace_uri, $desired_alias); + if ($implicit) { + array_push($this->implicit_namespaces, $namespace_uri); + } + + return $desired_alias; + } + + function add($namespace_uri) + { + // Add this namespace URI to the mapping, without caring what + // alias it ends up with + + // See if this namespace is already mapped to an alias + $alias = $this->namespace_to_alias->get($namespace_uri); + + if ($alias !== null) { + return $alias; + } + + // Fall back to generating a numerical alias + $i = 0; + while (1) { + $alias = 'ext' . strval($i); + if ($this->addAlias($namespace_uri, $alias) === null) { + $i += 1; + } else { + return $alias; + } + } + + // Should NEVER be reached! + return null; + } + + function contains($namespace_uri) + { + return $this->isDefined($namespace_uri); + } + + function isDefined($namespace_uri) + { + return $this->namespace_to_alias->contains($namespace_uri); + } +} + +/** + * In the implementation of this object, null represents the global + * namespace as well as a namespace with no key. + * + * @package OpenID + */ +class Auth_OpenID_Message { + + function Auth_OpenID_Message($openid_namespace = null) + { + // Create an empty Message + $this->allowed_openid_namespaces = array( + Auth_OpenID_OPENID1_NS, + Auth_OpenID_THE_OTHER_OPENID1_NS, + Auth_OpenID_OPENID2_NS); + + $this->args = new Auth_OpenID_Mapping(); + $this->namespaces = new Auth_OpenID_NamespaceMap(); + if ($openid_namespace === null) { + $this->_openid_ns_uri = null; + } else { + $implicit = Auth_OpenID_isOpenID1($openid_namespace); + $this->setOpenIDNamespace($openid_namespace, $implicit); + } + } + + function isOpenID1() + { + return Auth_OpenID_isOpenID1($this->getOpenIDNamespace()); + } + + function isOpenID2() + { + return $this->getOpenIDNamespace() == Auth_OpenID_OPENID2_NS; + } + + function fromPostArgs($args) + { + // Construct a Message containing a set of POST arguments + $obj = new Auth_OpenID_Message(); + + // Partition into "openid." args and bare args + $openid_args = array(); + foreach ($args as $key => $value) { + + if (is_array($value)) { + return null; + } + + $parts = explode('.', $key, 2); + + if (count($parts) == 2) { + list($prefix, $rest) = $parts; + } else { + $prefix = null; + } + + if ($prefix != 'openid') { + $obj->args->set(array(Auth_OpenID_BARE_NS, $key), $value); + } else { + $openid_args[$rest] = $value; + } + } + + if ($obj->_fromOpenIDArgs($openid_args)) { + return $obj; + } else { + return null; + } + } + + function fromOpenIDArgs($openid_args) + { + // Takes an array. + + // Construct a Message from a parsed KVForm message + $obj = new Auth_OpenID_Message(); + if ($obj->_fromOpenIDArgs($openid_args)) { + return $obj; + } else { + return null; + } + } + + /** + * @access private + */ + function _fromOpenIDArgs($openid_args) + { + global $Auth_OpenID_registered_aliases; + + // Takes an Auth_OpenID_Mapping instance OR an array. + + if (!Auth_OpenID_Mapping::isA($openid_args)) { + $openid_args = new Auth_OpenID_Mapping($openid_args); + } + + $ns_args = array(); + + // Resolve namespaces + foreach ($openid_args->items() as $pair) { + list($rest, $value) = $pair; + + $parts = explode('.', $rest, 2); + + if (count($parts) == 2) { + list($ns_alias, $ns_key) = $parts; + } else { + $ns_alias = Auth_OpenID_NULL_NAMESPACE; + $ns_key = $rest; + } + + if ($ns_alias == 'ns') { + if ($this->namespaces->addAlias($value, $ns_key) === null) { + return false; + } + } else if (($ns_alias == Auth_OpenID_NULL_NAMESPACE) && + ($ns_key == 'ns')) { + // null namespace + if ($this->setOpenIDNamespace($value, false) === false) { + return false; + } + } else { + $ns_args[] = array($ns_alias, $ns_key, $value); + } + } + + if (!$this->getOpenIDNamespace()) { + if ($this->setOpenIDNamespace(Auth_OpenID_OPENID1_NS, true) === + false) { + return false; + } + } + + // Actually put the pairs into the appropriate namespaces + foreach ($ns_args as $triple) { + list($ns_alias, $ns_key, $value) = $triple; + $ns_uri = $this->namespaces->getNamespaceURI($ns_alias); + if ($ns_uri === null) { + $ns_uri = $this->_getDefaultNamespace($ns_alias); + if ($ns_uri === null) { + + $ns_uri = Auth_OpenID_OPENID_NS; + $ns_key = sprintf('%s.%s', $ns_alias, $ns_key); + } else { + $this->namespaces->addAlias($ns_uri, $ns_alias, true); + } + } + + $this->setArg($ns_uri, $ns_key, $value); + } + + return true; + } + + function _getDefaultNamespace($mystery_alias) + { + global $Auth_OpenID_registered_aliases; + if ($this->isOpenID1()) { + return @$Auth_OpenID_registered_aliases[$mystery_alias]; + } + return null; + } + + function setOpenIDNamespace($openid_ns_uri, $implicit) + { + if (!in_array($openid_ns_uri, $this->allowed_openid_namespaces)) { + Auth_OpenID::log('Invalid null namespace: "%s"', $openid_ns_uri); + return false; + } + + $succeeded = $this->namespaces->addAlias($openid_ns_uri, + Auth_OpenID_NULL_NAMESPACE, + $implicit); + if ($succeeded === false) { + return false; + } + + $this->_openid_ns_uri = $openid_ns_uri; + + return true; + } + + function getOpenIDNamespace() + { + return $this->_openid_ns_uri; + } + + function fromKVForm($kvform_string) + { + // Create a Message from a KVForm string + return Auth_OpenID_Message::fromOpenIDArgs( + Auth_OpenID_KVForm::toArray($kvform_string)); + } + + function copy() + { + return $this; + } + + function toPostArgs() + { + // Return all arguments with openid. in front of namespaced + // arguments. + + $args = array(); + + // Add namespace definitions to the output + foreach ($this->namespaces->iteritems() as $pair) { + list($ns_uri, $alias) = $pair; + if ($this->namespaces->isImplicit($ns_uri)) { + continue; + } + if ($alias == Auth_OpenID_NULL_NAMESPACE) { + $ns_key = 'openid.ns'; + } else { + $ns_key = 'openid.ns.' . $alias; + } + $args[$ns_key] = $ns_uri; + } + + foreach ($this->args->items() as $pair) { + list($ns_parts, $value) = $pair; + list($ns_uri, $ns_key) = $ns_parts; + $key = $this->getKey($ns_uri, $ns_key); + $args[$key] = $value; + } + + return $args; + } + + function toArgs() + { + // Return all namespaced arguments, failing if any + // non-namespaced arguments exist. + $post_args = $this->toPostArgs(); + $kvargs = array(); + foreach ($post_args as $k => $v) { + if (strpos($k, 'openid.') !== 0) { + // raise ValueError( + // 'This message can only be encoded as a POST, because it ' + // 'contains arguments that are not prefixed with "openid."') + return null; + } else { + $kvargs[substr($k, 7)] = $v; + } + } + + return $kvargs; + } + + function toFormMarkup($action_url, $form_tag_attrs = null, + $submit_text = "Continue") + { + $form = "
      $attr) { + $form .= sprintf(" %s=\"%s\"", $name, $attr); + } + } + + $form .= ">\n"; + + foreach ($this->toPostArgs() as $name => $value) { + $form .= sprintf( + "\n", + $name, $value); + } + + $form .= sprintf("\n", + $submit_text); + + $form .= "
      \n"; + + return $form; + } + + function toURL($base_url) + { + // Generate a GET URL with the parameters in this message + // attached as query parameters. + return Auth_OpenID::appendArgs($base_url, $this->toPostArgs()); + } + + function toKVForm() + { + // Generate a KVForm string that contains the parameters in + // this message. This will fail if the message contains + // arguments outside of the 'openid.' prefix. + return Auth_OpenID_KVForm::fromArray($this->toArgs()); + } + + function toURLEncoded() + { + // Generate an x-www-urlencoded string + $args = array(); + + foreach ($this->toPostArgs() as $k => $v) { + $args[] = array($k, $v); + } + + sort($args); + return Auth_OpenID::httpBuildQuery($args); + } + + /** + * @access private + */ + function _fixNS($namespace) + { + // Convert an input value into the internally used values of + // this object + + if ($namespace == Auth_OpenID_OPENID_NS) { + if ($this->_openid_ns_uri === null) { + return new Auth_OpenID_FailureResponse(null, + 'OpenID namespace not set'); + } else { + $namespace = $this->_openid_ns_uri; + } + } + + if (($namespace != Auth_OpenID_BARE_NS) && + (!is_string($namespace))) { + //TypeError + $err_msg = sprintf("Namespace must be Auth_OpenID_BARE_NS, ". + "Auth_OpenID_OPENID_NS or a string. got %s", + print_r($namespace, true)); + return new Auth_OpenID_FailureResponse(null, $err_msg); + } + + if (($namespace != Auth_OpenID_BARE_NS) && + (strpos($namespace, ':') === false)) { + // fmt = 'OpenID 2.0 namespace identifiers SHOULD be URIs. Got %r' + // warnings.warn(fmt % (namespace,), DeprecationWarning) + + if ($namespace == 'sreg') { + // fmt = 'Using %r instead of "sreg" as namespace' + // warnings.warn(fmt % (SREG_URI,), DeprecationWarning,) + return Auth_OpenID_SREG_URI; + } + } + + return $namespace; + } + + function hasKey($namespace, $ns_key) + { + $namespace = $this->_fixNS($namespace); + if (Auth_OpenID::isFailure($namespace)) { + // XXX log me + return false; + } else { + return $this->args->contains(array($namespace, $ns_key)); + } + } + + function getKey($namespace, $ns_key) + { + // Get the key for a particular namespaced argument + $namespace = $this->_fixNS($namespace); + if (Auth_OpenID::isFailure($namespace)) { + return $namespace; + } + if ($namespace == Auth_OpenID_BARE_NS) { + return $ns_key; + } + + $ns_alias = $this->namespaces->getAlias($namespace); + + // No alias is defined, so no key can exist + if ($ns_alias === null) { + return null; + } + + if ($ns_alias == Auth_OpenID_NULL_NAMESPACE) { + $tail = $ns_key; + } else { + $tail = sprintf('%s.%s', $ns_alias, $ns_key); + } + + return 'openid.' . $tail; + } + + function getArg($namespace, $key, $default = null) + { + // Get a value for a namespaced key. + $namespace = $this->_fixNS($namespace); + + if (Auth_OpenID::isFailure($namespace)) { + return $namespace; + } else { + if ((!$this->args->contains(array($namespace, $key))) && + ($default == Auth_OpenID_NO_DEFAULT)) { + $err_msg = sprintf("Namespace %s missing required field %s", + $namespace, $key); + return new Auth_OpenID_FailureResponse(null, $err_msg); + } else { + return $this->args->get(array($namespace, $key), $default); + } + } + } + + function getArgs($namespace) + { + // Get the arguments that are defined for this namespace URI + + $namespace = $this->_fixNS($namespace); + if (Auth_OpenID::isFailure($namespace)) { + return $namespace; + } else { + $stuff = array(); + foreach ($this->args->items() as $pair) { + list($key, $value) = $pair; + list($pair_ns, $ns_key) = $key; + if ($pair_ns == $namespace) { + $stuff[$ns_key] = $value; + } + } + + return $stuff; + } + } + + function updateArgs($namespace, $updates) + { + // Set multiple key/value pairs in one call + + $namespace = $this->_fixNS($namespace); + + if (Auth_OpenID::isFailure($namespace)) { + return $namespace; + } else { + foreach ($updates as $k => $v) { + $this->setArg($namespace, $k, $v); + } + return true; + } + } + + function setArg($namespace, $key, $value) + { + // Set a single argument in this namespace + $namespace = $this->_fixNS($namespace); + + if (Auth_OpenID::isFailure($namespace)) { + return $namespace; + } else { + $this->args->set(array($namespace, $key), $value); + if ($namespace !== Auth_OpenID_BARE_NS) { + $this->namespaces->add($namespace); + } + return true; + } + } + + function delArg($namespace, $key) + { + $namespace = $this->_fixNS($namespace); + + if (Auth_OpenID::isFailure($namespace)) { + return $namespace; + } else { + return $this->args->del(array($namespace, $key)); + } + } + + function getAliasedArg($aliased_key, $default = null) + { + $parts = explode('.', $aliased_key, 2); + + if (count($parts) != 2) { + $ns = null; + } else { + list($alias, $key) = $parts; + + if ($alias == 'ns') { + // Return the namespace URI for a namespace alias + // parameter. + return $this->namespaces->getNamespaceURI($key); + } else { + $ns = $this->namespaces->getNamespaceURI($alias); + } + } + + if ($ns === null) { + $key = $aliased_key; + $ns = $this->getOpenIDNamespace(); + } + + return $this->getArg($ns, $key, $default); + } +} + +?> diff --git a/_darcs/pristine/extlib/Auth/OpenID/MySQLStore.php b/_darcs/pristine/extlib/Auth/OpenID/MySQLStore.php new file mode 100644 index 0000000000..eb08af0162 --- /dev/null +++ b/_darcs/pristine/extlib/Auth/OpenID/MySQLStore.php @@ -0,0 +1,78 @@ +sql['nonce_table'] = + "CREATE TABLE %s (\n". + " server_url VARCHAR(2047) NOT NULL,\n". + " timestamp INTEGER NOT NULL,\n". + " salt CHAR(40) NOT NULL,\n". + " UNIQUE (server_url(255), timestamp, salt)\n". + ") ENGINE=InnoDB"; + + $this->sql['assoc_table'] = + "CREATE TABLE %s (\n". + " server_url BLOB NOT NULL,\n". + " handle VARCHAR(255) NOT NULL,\n". + " secret BLOB NOT NULL,\n". + " issued INTEGER NOT NULL,\n". + " lifetime INTEGER NOT NULL,\n". + " assoc_type VARCHAR(64) NOT NULL,\n". + " PRIMARY KEY (server_url(255), handle)\n". + ") ENGINE=InnoDB"; + + $this->sql['set_assoc'] = + "REPLACE INTO %s (server_url, handle, secret, issued,\n". + " lifetime, assoc_type) VALUES (?, ?, !, ?, ?, ?)"; + + $this->sql['get_assocs'] = + "SELECT handle, secret, issued, lifetime, assoc_type FROM %s ". + "WHERE server_url = ?"; + + $this->sql['get_assoc'] = + "SELECT handle, secret, issued, lifetime, assoc_type FROM %s ". + "WHERE server_url = ? AND handle = ?"; + + $this->sql['remove_assoc'] = + "DELETE FROM %s WHERE server_url = ? AND handle = ?"; + + $this->sql['add_nonce'] = + "INSERT INTO %s (server_url, timestamp, salt) VALUES (?, ?, ?)"; + + $this->sql['clean_nonce'] = + "DELETE FROM %s WHERE timestamp < ?"; + + $this->sql['clean_assoc'] = + "DELETE FROM %s WHERE issued + lifetime < ?"; + } + + /** + * @access private + */ + function blobEncode($blob) + { + return "0x" . bin2hex($blob); + } +} + +?> \ No newline at end of file diff --git a/_darcs/pristine/extlib/Auth/OpenID/Nonce.php b/_darcs/pristine/extlib/Auth/OpenID/Nonce.php new file mode 100644 index 0000000000..effecac385 --- /dev/null +++ b/_darcs/pristine/extlib/Auth/OpenID/Nonce.php @@ -0,0 +1,109 @@ + \ No newline at end of file diff --git a/_darcs/pristine/extlib/Auth/OpenID/PAPE.php b/_darcs/pristine/extlib/Auth/OpenID/PAPE.php new file mode 100644 index 0000000000..62cba8a912 --- /dev/null +++ b/_darcs/pristine/extlib/Auth/OpenID/PAPE.php @@ -0,0 +1,301 @@ +preferred_auth_policies = $preferred_auth_policies; + $this->max_auth_age = $max_auth_age; + } + + /** + * Add an acceptable authentication policy URI to this request + * + * This method is intended to be used by the relying party to add + * acceptable authentication types to the request. + * + * policy_uri: The identifier for the preferred type of + * authentication. + */ + function addPolicyURI($policy_uri) + { + if (!in_array($policy_uri, $this->preferred_auth_policies)) { + $this->preferred_auth_policies[] = $policy_uri; + } + } + + function getExtensionArgs() + { + $ns_args = array( + 'preferred_auth_policies' => + implode(' ', $this->preferred_auth_policies) + ); + + if ($this->max_auth_age !== null) { + $ns_args['max_auth_age'] = strval($this->max_auth_age); + } + + return $ns_args; + } + + /** + * Instantiate a Request object from the arguments in a checkid_* + * OpenID message + */ + function fromOpenIDRequest($request) + { + $obj = new Auth_OpenID_PAPE_Request(); + $args = $request->message->getArgs(Auth_OpenID_PAPE_NS_URI); + + if ($args === null || $args === array()) { + return null; + } + + $obj->parseExtensionArgs($args); + return $obj; + } + + /** + * Set the state of this request to be that expressed in these + * PAPE arguments + * + * @param args: The PAPE arguments without a namespace + */ + function parseExtensionArgs($args) + { + // preferred_auth_policies is a space-separated list of policy + // URIs + $this->preferred_auth_policies = array(); + + $policies_str = Auth_OpenID::arrayGet($args, 'preferred_auth_policies'); + if ($policies_str) { + foreach (explode(' ', $policies_str) as $uri) { + if (!in_array($uri, $this->preferred_auth_policies)) { + $this->preferred_auth_policies[] = $uri; + } + } + } + + // max_auth_age is base-10 integer number of seconds + $max_auth_age_str = Auth_OpenID::arrayGet($args, 'max_auth_age'); + if ($max_auth_age_str) { + $this->max_auth_age = Auth_OpenID::intval($max_auth_age_str); + } else { + $this->max_auth_age = null; + } + } + + /** + * Given a list of authentication policy URIs that a provider + * supports, this method returns the subsequence of those types + * that are preferred by the relying party. + * + * @param supported_types: A sequence of authentication policy + * type URIs that are supported by a provider + * + * @return array The sub-sequence of the supported types that are + * preferred by the relying party. This list will be ordered in + * the order that the types appear in the supported_types + * sequence, and may be empty if the provider does not prefer any + * of the supported authentication types. + */ + function preferredTypes($supported_types) + { + $result = array(); + + foreach ($supported_types as $st) { + if (in_array($st, $this->preferred_auth_policies)) { + $result[] = $st; + } + } + return $result; + } +} + +/** + * A Provider Authentication Policy response, sent from a provider to + * a relying party + */ +class Auth_OpenID_PAPE_Response extends Auth_OpenID_Extension { + + var $ns_alias = 'pape'; + var $ns_uri = Auth_OpenID_PAPE_NS_URI; + + function Auth_OpenID_PAPE_Response($auth_policies=null, $auth_time=null, + $nist_auth_level=null) + { + if ($auth_policies) { + $this->auth_policies = $auth_policies; + } else { + $this->auth_policies = array(); + } + + $this->auth_time = $auth_time; + $this->nist_auth_level = $nist_auth_level; + } + + /** + * Add a authentication policy to this response + * + * This method is intended to be used by the provider to add a + * policy that the provider conformed to when authenticating the + * user. + * + * @param policy_uri: The identifier for the preferred type of + * authentication. + */ + function addPolicyURI($policy_uri) + { + if (!in_array($policy_uri, $this->auth_policies)) { + $this->auth_policies[] = $policy_uri; + } + } + + /** + * Create an Auth_OpenID_PAPE_Response object from a successful + * OpenID library response. + * + * @param success_response $success_response A SuccessResponse + * from Auth_OpenID_Consumer::complete() + * + * @returns: A provider authentication policy response from the + * data that was supplied with the id_res response. + */ + function fromSuccessResponse($success_response) + { + $obj = new Auth_OpenID_PAPE_Response(); + + // PAPE requires that the args be signed. + $args = $success_response->getSignedNS(Auth_OpenID_PAPE_NS_URI); + + if ($args === null || $args === array()) { + return null; + } + + $result = $obj->parseExtensionArgs($args); + + if ($result === false) { + return null; + } else { + return $obj; + } + } + + /** + * Parse the provider authentication policy arguments into the + * internal state of this object + * + * @param args: unqualified provider authentication policy + * arguments + * + * @param strict: Whether to return false when bad data is + * encountered + * + * @return null The data is parsed into the internal fields of + * this object. + */ + function parseExtensionArgs($args, $strict=false) + { + $policies_str = Auth_OpenID::arrayGet($args, 'auth_policies'); + if ($policies_str && $policies_str != "none") { + $this->auth_policies = explode(" ", $policies_str); + } + + $nist_level_str = Auth_OpenID::arrayGet($args, 'nist_auth_level'); + if ($nist_level_str !== null) { + $nist_level = Auth_OpenID::intval($nist_level_str); + + if ($nist_level === false) { + if ($strict) { + return false; + } else { + $nist_level = null; + } + } + + if (0 <= $nist_level && $nist_level < 5) { + $this->nist_auth_level = $nist_level; + } else if ($strict) { + return false; + } + } + + $auth_time = Auth_OpenID::arrayGet($args, 'auth_time'); + if ($auth_time !== null) { + if (ereg(PAPE_TIME_VALIDATOR, $auth_time)) { + $this->auth_time = $auth_time; + } else if ($strict) { + return false; + } + } + } + + function getExtensionArgs() + { + $ns_args = array(); + if (count($this->auth_policies) > 0) { + $ns_args['auth_policies'] = implode(' ', $this->auth_policies); + } else { + $ns_args['auth_policies'] = 'none'; + } + + if ($this->nist_auth_level !== null) { + if (!in_array($this->nist_auth_level, range(0, 4), true)) { + return false; + } + $ns_args['nist_auth_level'] = strval($this->nist_auth_level); + } + + if ($this->auth_time !== null) { + if (!ereg(PAPE_TIME_VALIDATOR, $this->auth_time)) { + return false; + } + + $ns_args['auth_time'] = $this->auth_time; + } + + return $ns_args; + } +} + +?> \ No newline at end of file diff --git a/_darcs/pristine/extlib/Auth/OpenID/Parse.php b/_darcs/pristine/extlib/Auth/OpenID/Parse.php new file mode 100644 index 0000000000..546f34f6be --- /dev/null +++ b/_darcs/pristine/extlib/Auth/OpenID/Parse.php @@ -0,0 +1,352 @@ + tags + * in the head of HTML or XHTML documents and parses out their + * attributes according to the OpenID spec. It is a liberal parser, + * but it requires these things from the data in order to work: + * + * - There must be an open tag + * + * - There must be an open tag inside of the tag + * + * - Only s that are found inside of the tag are parsed + * (this is by design) + * + * - The parser follows the OpenID specification in resolving the + * attributes of the link tags. This means that the attributes DO + * NOT get resolved as they would by an XML or HTML parser. In + * particular, only certain entities get replaced, and href + * attributes do not get resolved relative to a base URL. + * + * From http://openid.net/specs.bml: + * + * - The openid.server URL MUST be an absolute URL. OpenID consumers + * MUST NOT attempt to resolve relative URLs. + * + * - The openid.server URL MUST NOT include entities other than &, + * <, >, and ". + * + * The parser ignores SGML comments and . Both kinds + * of quoting are allowed for attributes. + * + * The parser deals with invalid markup in these ways: + * + * - Tag names are not case-sensitive + * + * - The tag is accepted even when it is not at the top level + * + * - The tag is accepted even when it is not a direct child of + * the tag, but a tag must be an ancestor of the + * tag + * + * - tags are accepted even when they are not direct children + * of the tag, but a tag must be an ancestor of the + * tag + * + * - If there is no closing tag for an open or tag, the + * remainder of the document is viewed as being inside of the + * tag. If there is no closing tag for a tag, the link tag is + * treated as a short tag. Exceptions to this rule are that + * closes and or closes + * + * - Attributes of the tag are not required to be quoted. + * + * - In the case of duplicated attribute names, the attribute coming + * last in the tag will be the value returned. + * + * - Any text that does not parse as an attribute within a link tag + * will be ignored. (e.g. will + * ignore pumpkin) + * + * - If there are more than one or tag, the parser only + * looks inside of the first one. + * + * - The contents of "; + } else { + header('Location: ' . $url); + } + exit; + } + + public function in_frame() { + return isset($this->fb_params['in_canvas']) || isset($this->fb_params['in_iframe']); + } + public function in_fb_canvas() { + return isset($this->fb_params['in_canvas']); + } + + public function get_loggedin_user() { + return $this->user; + } + + public function get_canvas_user() { + return $this->canvas_user; + } + + public function get_profile_user() { + return $this->profile_user; + } + + public static function current_url() { + return 'http://' . $_SERVER['HTTP_HOST'] . $_SERVER['REQUEST_URI']; + } + + // require_add and require_install have been removed. + // see http://developer.facebook.com/news.php?blog=1&story=116 for more details + public function require_login() { + if ($user = $this->get_loggedin_user()) { + return $user; + } + $this->redirect($this->get_login_url(self::current_url(), $this->in_frame())); + } + + public function require_frame() { + if (!$this->in_frame()) { + $this->redirect($this->get_login_url(self::current_url(), true)); + } + } + + public static function get_facebook_url($subdomain='www') { + return 'http://' . $subdomain . '.facebook.com'; + } + + public function get_install_url($next=null) { + // this was renamed, keeping for compatibility's sake + return $this->get_add_url($next); + } + + public function get_add_url($next=null) { + return self::get_facebook_url().'/add.php?api_key='.$this->api_key . + ($next ? '&next=' . urlencode($next) : ''); + } + + public function get_login_url($next, $canvas) { + return self::get_facebook_url().'/login.php?v=1.0&api_key=' . $this->api_key . + ($next ? '&next=' . urlencode($next) : '') . + ($canvas ? '&canvas' : ''); + } + + public function set_user($user, $session_key, $expires=null, $session_secret=null) { + if (!$this->in_fb_canvas() && (!isset($_COOKIE[$this->api_key . '_user']) + || $_COOKIE[$this->api_key . '_user'] != $user)) { + $this->set_cookies($user, $session_key, $expires, $session_secret); + } + $this->user = $user; + $this->api_client->session_key = $session_key; + $this->session_expires = $expires; + } + + public function set_cookies($user, $session_key, $expires=null, $session_secret=null) { + $cookies = array(); + $cookies['user'] = $user; + $cookies['session_key'] = $session_key; + if ($expires != null) { + $cookies['expires'] = $expires; + } + if ($session_secret != null) { + $cookies['ss'] = $session_secret; + } + + foreach ($cookies as $name => $val) { + setcookie($this->api_key . '_' . $name, $val, (int)$expires, '', $this->base_domain); + $_COOKIE[$this->api_key . '_' . $name] = $val; + } + $sig = self::generate_sig($cookies, $this->secret); + setcookie($this->api_key, $sig, (int)$expires, '', $this->base_domain); + $_COOKIE[$this->api_key] = $sig; + + if ($this->base_domain != null) { + $base_domain_cookie = 'base_domain_' . $this->api_key; + setcookie($base_domain_cookie, $this->base_domain, (int)$expires, '', $this->base_domain); + $_COOKIE[$base_domain_cookie] = $this->base_domain; + } + } + + /** + * Tries to undo the badness of magic quotes as best we can + * @param string $val Should come directly from $_GET, $_POST, etc. + * @return string val without added slashes + */ + public static function no_magic_quotes($val) { + if (get_magic_quotes_gpc()) { + return stripslashes($val); + } else { + return $val; + } + } + + /* + * Get the signed parameters that were sent from Facebook. Validates the set + * of parameters against the included signature. + * + * Since Facebook sends data to your callback URL via unsecured means, the + * signature is the only way to make sure that the data actually came from + * Facebook. So if an app receives a request at the callback URL, it should + * always verify the signature that comes with against your own secret key. + * Otherwise, it's possible for someone to spoof a request by + * pretending to be someone else, i.e.: + * www.your-callback-url.com/?fb_user=10101 + * + * This is done automatically by verify_fb_params. + * + * @param assoc $params a full array of external parameters. + * presumed $_GET, $_POST, or $_COOKIE + * @param int $timeout number of seconds that the args are good for. + * Specifically good for forcing cookies to expire. + * @param string $namespace prefix string for the set of parameters we want + * to verify. i.e., fb_sig or fb_post_sig + * + * @return assoc the subset of parameters containing the given prefix, + * and also matching the signature associated with them. + * OR an empty array if the params do not validate + */ + public function get_valid_fb_params($params, $timeout=null, $namespace='fb_sig') { + $prefix = $namespace . '_'; + $prefix_len = strlen($prefix); + $fb_params = array(); + if (empty($params)) { + return array(); + } + + foreach ($params as $name => $val) { + // pull out only those parameters that match the prefix + // note that the signature itself ($params[$namespace]) is not in the list + if (strpos($name, $prefix) === 0) { + $fb_params[substr($name, $prefix_len)] = self::no_magic_quotes($val); + } + } + + // validate that the request hasn't expired. this is most likely + // for params that come from $_COOKIE + if ($timeout && (!isset($fb_params['time']) || time() - $fb_params['time'] > $timeout)) { + return array(); + } + + // validate that the params match the signature + $signature = isset($params[$namespace]) ? $params[$namespace] : null; + if (!$signature || (!$this->verify_signature($fb_params, $signature))) { + return array(); + } + return $fb_params; + } + + /* + * Validates that a given set of parameters match their signature. + * Parameters all match a given input prefix, such as "fb_sig". + * + * @param $fb_params an array of all Facebook-sent parameters, + * not including the signature itself + * @param $expected_sig the expected result to check against + */ + public function verify_signature($fb_params, $expected_sig) { + return self::generate_sig($fb_params, $this->secret) == $expected_sig; + } + + /* + * Generate a signature using the application secret key. + * + * The only two entities that know your secret key are you and Facebook, + * according to the Terms of Service. Since nobody else can generate + * the signature, you can rely on it to verify that the information + * came from Facebook. + * + * @param $params_array an array of all Facebook-sent parameters, + * NOT INCLUDING the signature itself + * @param $secret your app's secret key + * + * @return a hash to be checked against the signature provided by Facebook + */ + public static function generate_sig($params_array, $secret) { + $str = ''; + + ksort($params_array); + // Note: make sure that the signature parameter is not already included in + // $params_array. + foreach ($params_array as $k=>$v) { + $str .= "$k=$v"; + } + $str .= $secret; + + return md5($str); + } + + public function encode_validationError($summary, $message) { + return json_encode( + array('errorCode' => FACEBOOK_API_VALIDATION_ERROR, + 'errorTitle' => $summary, + 'errorMessage' => $message)); + } + + public function encode_multiFeedStory($feed, $next) { + return json_encode( + array('method' => 'multiFeedStory', + 'content' => + array('next' => $next, + 'feed' => $feed))); + } + + public function encode_feedStory($feed, $next) { + return json_encode( + array('method' => 'feedStory', + 'content' => + array('next' => $next, + 'feed' => $feed))); + } + + public function create_templatizedFeedStory($title_template, $title_data=array(), + $body_template='', $body_data = array(), $body_general=null, + $image_1=null, $image_1_link=null, + $image_2=null, $image_2_link=null, + $image_3=null, $image_3_link=null, + $image_4=null, $image_4_link=null) { + return array('title_template'=> $title_template, + 'title_data' => $title_data, + 'body_template'=> $body_template, + 'body_data' => $body_data, + 'body_general' => $body_general, + 'image_1' => $image_1, + 'image_1_link' => $image_1_link, + 'image_2' => $image_2, + 'image_2_link' => $image_2_link, + 'image_3' => $image_3, + 'image_3_link' => $image_3_link, + 'image_4' => $image_4, + 'image_4_link' => $image_4_link); + } + + +} + diff --git a/_darcs/pristine/extlib/facebook/facebook_desktop.php b/_darcs/pristine/extlib/facebook/facebook_desktop.php new file mode 100644 index 0000000000..90cdf66bd0 --- /dev/null +++ b/_darcs/pristine/extlib/facebook/facebook_desktop.php @@ -0,0 +1,104 @@ +app_secret = $secret; + $this->verify_sig = false; + parent::__construct($api_key, $secret); + } + + public function do_get_session($auth_token) { + $this->api_client->secret = $this->app_secret; + $this->api_client->session_key = null; + $session_info = parent::do_get_session($auth_token); + if (!empty($session_info['secret'])) { + // store the session secret + $this->set_session_secret($session_info['secret']); + } + return $session_info; + } + + public function set_session_secret($session_secret) { + $this->secret = $session_secret; + $this->api_client->secret = $session_secret; + } + + public function require_login() { + if ($this->get_loggedin_user()) { + try { + // try a session-based API call to ensure that we have the correct + // session secret + $user = $this->api_client->users_getLoggedInUser(); + + // now that we have a valid session secret, verify the signature + $this->verify_sig = true; + if ($this->validate_fb_params(false)) { + return $user; + } else { + // validation failed + return null; + } + } catch (FacebookRestClientException $ex) { + if (isset($_GET['auth_token'])) { + // if we have an auth_token, use it to establish a session + $session_info = $this->do_get_session($_GET['auth_token']); + if ($session_info) { + return $session_info['uid']; + } + } + } + } + // if we get here, we need to redirect the user to log in + $this->redirect($this->get_login_url(self::current_url(), $this->in_fb_canvas())); + } + + public function verify_signature($fb_params, $expected_sig) { + // we don't want to verify the signature until we have a valid + // session secret + if ($this->verify_sig) { + return parent::verify_signature($fb_params, $expected_sig); + } else { + return true; + } + } +} diff --git a/_darcs/pristine/extlib/facebook/facebookapi_php5_restlib.php b/_darcs/pristine/extlib/facebook/facebookapi_php5_restlib.php new file mode 100644 index 0000000000..389f40a9d4 --- /dev/null +++ b/_darcs/pristine/extlib/facebook/facebookapi_php5_restlib.php @@ -0,0 +1,2632 @@ +secret = $secret; + $this->session_key = $session_key; + $this->api_key = $api_key; + $this->batch_mode = FacebookRestClient::BATCH_MODE_DEFAULT; + $this->last_call_id = 0; + $this->call_as_apikey = ''; + $this->server_addr = Facebook::get_facebook_url('api') . '/restserver.php'; + + if (!empty($GLOBALS['facebook_config']['debug'])) { + $this->cur_id = 0; + ?> + +user = $uid; + } + + /** + * Start a batch operation. + */ + public function begin_batch() { + if($this->batch_queue !== null) { + $code = FacebookAPIErrorCodes::API_EC_BATCH_ALREADY_STARTED; + throw new FacebookRestClientException($code, + FacebookAPIErrorCodes::$api_error_descriptions[$code]); + } + + $this->batch_queue = array(); + } + + /* + * End current batch operation + */ + public function end_batch() { + if($this->batch_queue === null) { + $code = FacebookAPIErrorCodes::API_EC_BATCH_NOT_STARTED; + throw new FacebookRestClientException($code, + FacebookAPIErrorCodes::$api_error_descriptions[$code]); + } + + $this->execute_server_side_batch(); + + $this->batch_queue = null; + } + + private function execute_server_side_batch() { + $item_count = count($this->batch_queue); + $method_feed = array(); + foreach($this->batch_queue as $batch_item) { + $method_feed[] = $this->create_post_string($batch_item['m'], + $batch_item['p']); + } + + $method_feed_json = json_encode($method_feed); + + $serial_only = + ($this->batch_mode == FacebookRestClient::BATCH_MODE_SERIAL_ONLY); + $params = array('method_feed' => $method_feed_json, + 'serial_only' => $serial_only); + if ($this->call_as_apikey) { + $params['call_as_apikey'] = $this->call_as_apikey; + } + + $xml = $this->post_request('batch.run', $params); + + $result = $this->convert_xml_to_result($xml, 'batch.run', $params); + + + if (is_array($result) && isset($result['error_code'])) { + throw new FacebookRestClientException($result['error_msg'], + $result['error_code']); + } + + for($i = 0; $i < $item_count; $i++) { + $batch_item = $this->batch_queue[$i]; + $batch_item_result_xml = $result[$i]; + $batch_item_result = $this->convert_xml_to_result($batch_item_result_xml, + $batch_item['m'], + $batch_item['p']); + + if (is_array($batch_item_result) && + isset($batch_item_result['error_code'])) { + throw new FacebookRestClientException($batch_item_result['error_msg'], + $batch_item_result['error_code']); + } + $batch_item['r'] = $batch_item_result; + } + } + + public function begin_permissions_mode($permissions_apikey) { + $this->call_as_apikey = $permissions_apikey; + } + + public function end_permissions_mode() { + $this->call_as_apikey = ''; + } + + /** + * Returns public information for an application (as shown in the application + * directory) by either application ID, API key, or canvas page name. + * + * @param int $application_id (Optional) app id + * @param string $application_api_key (Optional) api key + * @param string $application_canvas_name (Optional) canvas name + * + * Exactly one argument must be specified, otherwise it is an error. + * + * @return array An array of public information about the application. + */ + public function application_getPublicInfo($application_id=null, + $application_api_key=null, + $application_canvas_name=null) { + return $this->call_method('facebook.application.getPublicInfo', + array('application_id' => $application_id, + 'application_api_key' => $application_api_key, + 'application_canvas_name' => $application_canvas_name)); + } + + /** + * Creates an authentication token to be used as part of the desktop login + * flow. For more information, please see + * http://wiki.developers.facebook.com/index.php/Auth.createToken. + * + * @return string An authentication token. + */ + public function auth_createToken() { + return $this->call_method('facebook.auth.createToken', array()); + } + + /** + * Returns the session information available after current user logs in. + * + * @param string $auth_token the token returned by + * auth_createToken or passed back to + * your callback_url. + * @param bool $generate_session_secret whether the session returned should + * include a session secret + * + * @return array An assoc array containing session_key, uid + */ + public function auth_getSession($auth_token, $generate_session_secret=false) { + //Check if we are in batch mode + if($this->batch_queue === null) { + $result = $this->call_method('facebook.auth.getSession', + array('auth_token' => $auth_token, + 'generate_session_secret' => $generate_session_secret)); + $this->session_key = $result['session_key']; + + if (!empty($result['secret']) && !$generate_session_secret) { + // desktop apps have a special secret + $this->secret = $result['secret']; + } + return $result; + } + } + + /** + * Generates a session-specific secret. This is for integration with + * client-side API calls, such as the JS library. + * + * @return array A session secret for the current promoted session + * + * @error API_EC_PARAM_SESSION_KEY + * API_EC_PARAM_UNKNOWN + */ + public function auth_promoteSession() { + return $this->call_method('facebook.auth.promoteSession', array()); + } + + /** + * Expires the session that is currently being used. If this call is + * successful, no further calls to the API (which require a session) can be + * made until a valid session is created. + * + * @return bool true if session expiration was successful, false otherwise + */ + public function auth_expireSession() { + return $this->call_method('facebook.auth.expireSession', array()); + } + + /** + * Revokes the user's agreement to the Facebook Terms of Service for your + * application. If you call this method for one of your users, you will no + * longer be able to make API requests on their behalf until they again + * authorize your application. Use with care. Note that if this method is + * called without a user parameter, then it will revoke access for the + * current session's user. + * + * @param int $uid (Optional) User to revoke + * + * @return bool true if revocation succeeds, false otherwise + */ + public function auth_revokeAuthorization($uid=null) { + return $this->call_method('facebook.auth.revokeAuthorization', + array('uid' => $uid)); + } + + /** + * Returns the number of unconnected friends that exist in this application. + * This number is determined based on the accounts registered through + * connect.registerUsers() (see below). + */ + public function connect_getUnconnectedFriendsCount() { + return $this->call_method('facebook.connect.getUnconnectedFriendsCount', + array()); + } + + /** + * This method is used to create an association between an external user + * account and a Facebook user account, as per Facebook Connect. + * + * This method takes an array of account data, including a required email_hash + * and optional account data. For each connected account, if the user exists, + * the information is added to the set of the user's connected accounts. + * If the user has already authorized the site, the connected account is added + * in the confirmed state. If the user has not yet authorized the site, the + * connected account is added in the pending state. + * + * This is designed to help Facebook Connect recognize when two Facebook + * friends are both members of a external site, but perhaps are not aware of + * it. The Connect dialog (see fb:connect-form) is used when friends can be + * identified through these email hashes. See the following url for details: + * + * http://wiki.developers.facebook.com/index.php/Connect.registerUsers + * + * @param mixed $accounts A (JSON-encoded) array of arrays, where each array + * has three properties: + * 'email_hash' (req) - public email hash of account + * 'account_id' (opt) - remote account id; + * 'account_url' (opt) - url to remote account; + * + * @return array The list of email hashes for the successfully registered + * accounts. + */ + public function connect_registerUsers($accounts) { + return $this->call_method('facebook.connect.registerUsers', + array('accounts' => $accounts)); + } + + /** + * Unregisters a set of accounts registered using connect.registerUsers. + * + * @param array $email_hashes The (JSON-encoded) list of email hashes to be + * unregistered. + * + * @return array The list of email hashes which have been successfully + * unregistered. + */ + public function connect_unregisterUsers($email_hashes) { + return $this->call_method('facebook.connect.unregisterUsers', + array('email_hashes' => $email_hashes)); + } + + /** + * Returns events according to the filters specified. + * + * @param int $uid (Optional) User associated with events. A null + * parameter will default to the session user. + * @param array $eids (Optional) Filter by these event ids. A null + * parameter will get all events for the user. + * @param int $start_time (Optional) Filter with this unix time as lower + * bound. A null or zero parameter indicates no + * lower bound. + * @param int $end_time (Optional) Filter with this UTC as upper bound. + * A null or zero parameter indicates no upper + * bound. + * @param string $rsvp_status (Optional) Only show events where the given uid + * has this rsvp status. This only works if you + * have specified a value for $uid. Values are as + * in events.getMembers. Null indicates to ignore + * rsvp status when filtering. + * + * @return array The events matching the query. + */ + public function &events_get($uid=null, + $eids=null, + $start_time=null, + $end_time=null, + $rsvp_status=null) { + return $this->call_method('facebook.events.get', + array('uid' => $uid, + 'eids' => $eids, + 'start_time' => $start_time, + 'end_time' => $end_time, + 'rsvp_status' => $rsvp_status)); + } + + /** + * Returns membership list data associated with an event. + * + * @param int $eid event id + * + * @return array An assoc array of four membership lists, with keys + * 'attending', 'unsure', 'declined', and 'not_replied' + */ + public function &events_getMembers($eid) { + return $this->call_method('facebook.events.getMembers', + array('eid' => $eid)); + } + + /** + * RSVPs the current user to this event. + * + * @param int $eid event id + * @param string $rsvp_status 'attending', 'unsure', or 'declined' + * + * @return bool true if successful + */ + public function &events_rsvp($eid, $rsvp_status) { + return $this->call_method('facebook.events.rsvp', + array( + 'eid' => $eid, + 'rsvp_status' => $rsvp_status)); + } + + /** + * Cancels an event. Only works for events where application is the admin. + * + * @param int $eid event id + * @param string $cancel_message (Optional) message to send to members of + * the event about why it is cancelled + * + * @return bool true if successful + */ + public function &events_cancel($eid, $cancel_message='') { + return $this->call_method('facebook.events.cancel', + array('eid' => $eid, + 'cancel_message' => $cancel_message)); + } + + /** + * Creates an event on behalf of the user is there is a session, otherwise on + * behalf of app. Successful creation guarantees app will be admin. + * + * @param assoc array $event_info json encoded event information + * + * @return int event id + */ + public function &events_create($event_info) { + return $this->call_method('facebook.events.create', + array('event_info' => $event_info)); + } + + /** + * Edits an existing event. Only works for events where application is admin. + * + * @param int $eid event id + * @param assoc array $event_info json encoded event information + * + * @return bool true if successful + */ + public function &events_edit($eid, $event_info) { + return $this->call_method('facebook.events.edit', + array('eid' => $eid, + 'event_info' => $event_info)); + } + + /** + * Fetches and re-caches the image stored at the given URL, for use in images + * published to non-canvas pages via the API (for example, to user profiles + * via profile.setFBML, or to News Feed via feed.publishUserAction). + * + * @param string $url The absolute URL from which to refresh the image. + * + * @return bool true on success + */ + public function &fbml_refreshImgSrc($url) { + return $this->call_method('facebook.fbml.refreshImgSrc', + array('url' => $url)); + } + + /** + * Fetches and re-caches the content stored at the given URL, for use in an + * fb:ref FBML tag. + * + * @param string $url The absolute URL from which to fetch content. This URL + * should be used in a fb:ref FBML tag. + * + * @return bool true on success + */ + public function &fbml_refreshRefUrl($url) { + return $this->call_method('facebook.fbml.refreshRefUrl', + array('url' => $url)); + } + + /** + * Lets you insert text strings in their native language into the Facebook + * Translations database so they can be translated. + * + * @param array $native_strings An array of maps, where each map has a 'text' + * field and a 'description' field. + * + * @return int Number of strings uploaded. + */ + public function &fbml_uploadNativeStrings($native_strings) { + return $this->call_method('facebook.fbml.uploadNativeStrings', + array('native_strings' => json_encode($native_strings))); + } + + /** + * Associates a given "handle" with FBML markup so that the handle can be + * used within the fb:ref FBML tag. A handle is unique within an application + * and allows an application to publish identical FBML to many user profiles + * and do subsequent updates without having to republish FBML on behalf of + * each user. + * + * @param string $handle The handle to associate with the given FBML. + * @param string $fbml The FBML to associate with the given handle. + * + * @return bool true on success + */ + public function &fbml_setRefHandle($handle, $fbml) { + return $this->call_method('facebook.fbml.setRefHandle', + array('handle' => $handle, 'fbml' => $fbml)); + } + + /** + * Register custom tags for the application. Custom tags can be used + * to extend the set of tags available to applications in FBML + * markup. + * + * Before you call this function, + * make sure you read the full documentation at + * + * http://wiki.developers.facebook.com/index.php/Fbml.RegisterCustomTags + * + * IMPORTANT: This function overwrites the values of + * existing tags if the names match. Use this function with care because + * it may break the FBML of any application that is using the + * existing version of the tags. + * + * @param mixed $tags an array of tag objects (the full description is on the + * wiki page) + * + * @return int the number of tags that were registered + */ + public function &fbml_registerCustomTags($tags) { + $tags = json_encode($tags); + return $this->call_method('facebook.fbml.registerCustomTags', + array('tags' => $tags)); + } + + /** + * Get the custom tags for an application. If $app_id + * is not specified, the calling app's tags are returned. + * If $app_id is different from the id of the calling app, + * only the app's public tags are returned. + * The return value is an array of the same type as + * the $tags parameter of fbml_registerCustomTags(). + * + * @param int $app_id the application's id (optional) + * + * @return mixed an array containing the custom tag objects + */ + public function &fbml_getCustomTags($app_id = null) { + return $this->call_method('facebook.fbml.getCustomTags', + array('app_id' => $app_id)); + } + + + /** + * Delete custom tags the application has registered. If + * $tag_names is null, all the application's custom tags will be + * deleted. + * + * IMPORTANT: If your application has registered public tags + * that other applications may be using, don't delete those tags! + * Doing so can break the FBML ofapplications that are using them. + * + * @param array $tag_names the names of the tags to delete (optinal) + * @return bool true on success + */ + public function &fbml_deleteCustomTags($tag_names = null) { + return $this->call_method('facebook.fbml.deleteCustomTags', + array('tag_names' => json_encode($tag_names))); + } + + + + /** + * This method is deprecated for calls made on behalf of users. This method + * works only for publishing stories on a Facebook Page that has installed + * your application. To publish stories to a user's profile, use + * feed.publishUserAction instead. + * + * For more details on this call, please visit the wiki page: + * + * http://wiki.developers.facebook.com/index.php/Feed.publishTemplatizedAction + */ + public function &feed_publishTemplatizedAction($title_template, + $title_data, + $body_template, + $body_data, + $body_general, + $image_1=null, + $image_1_link=null, + $image_2=null, + $image_2_link=null, + $image_3=null, + $image_3_link=null, + $image_4=null, + $image_4_link=null, + $target_ids='', + $page_actor_id=null) { + return $this->call_method('facebook.feed.publishTemplatizedAction', + array('title_template' => $title_template, + 'title_data' => $title_data, + 'body_template' => $body_template, + 'body_data' => $body_data, + 'body_general' => $body_general, + 'image_1' => $image_1, + 'image_1_link' => $image_1_link, + 'image_2' => $image_2, + 'image_2_link' => $image_2_link, + 'image_3' => $image_3, + 'image_3_link' => $image_3_link, + 'image_4' => $image_4, + 'image_4_link' => $image_4_link, + 'target_ids' => $target_ids, + 'page_actor_id' => $page_actor_id)); + } + + /** + * Registers a template bundle. Template bundles are somewhat involved, so + * it's recommended you check out the wiki for more details: + * + * http://wiki.developers.facebook.com/index.php/Feed.registerTemplateBundle + * + * @return string A template bundle id + */ + public function &feed_registerTemplateBundle($one_line_story_templates, + $short_story_templates = array(), + $full_story_template = null, + $action_links = array()) { + + $one_line_story_templates = json_encode($one_line_story_templates); + + if (!empty($short_story_templates)) { + $short_story_templates = json_encode($short_story_templates); + } + + if (isset($full_story_template)) { + $full_story_template = json_encode($full_story_template); + } + + if (isset($action_links)) { + $action_links = json_encode($action_links); + } + + return $this->call_method('facebook.feed.registerTemplateBundle', + array('one_line_story_templates' => $one_line_story_templates, + 'short_story_templates' => $short_story_templates, + 'full_story_template' => $full_story_template, + 'action_links' => $action_links)); + } + + /** + * Retrieves the full list of active template bundles registered by the + * requesting application. + * + * @return array An array of template bundles + */ + public function &feed_getRegisteredTemplateBundles() { + return $this->call_method('facebook.feed.getRegisteredTemplateBundles', + array()); + } + + /** + * Retrieves information about a specified template bundle previously + * registered by the requesting application. + * + * @param string $template_bundle_id The template bundle id + * + * @return array Template bundle + */ + public function &feed_getRegisteredTemplateBundleByID($template_bundle_id) { + return $this->call_method('facebook.feed.getRegisteredTemplateBundleByID', + array('template_bundle_id' => $template_bundle_id)); + } + + /** + * Deactivates a previously registered template bundle. + * + * @param string $template_bundle_id The template bundle id + * + * @return bool true on success + */ + public function &feed_deactivateTemplateBundleByID($template_bundle_id) { + return $this->call_method('facebook.feed.deactivateTemplateBundleByID', + array('template_bundle_id' => $template_bundle_id)); + } + + const STORY_SIZE_ONE_LINE = 1; + const STORY_SIZE_SHORT = 2; + const STORY_SIZE_FULL = 4; + + /** + * Publishes a story on behalf of the user owning the session, using the + * specified template bundle. This method requires an active session key in + * order to be called. + * + * The parameters to this method ($templata_data in particular) are somewhat + * involved. It's recommended you visit the wiki for details: + * + * http://wiki.developers.facebook.com/index.php/Feed.publishUserAction + * + * @param int $template_bundle_id A template bundle id previously registered + * @param array $template_data See wiki article for syntax + * @param array $target_ids (Optional) An array of friend uids of the + * user who shared in this action. + * @param string $body_general (Optional) Additional markup that extends + * the body of a short story. + * @param int $story_size (Optional) A story size (see above) + * + * @return bool true on success + */ + public function &feed_publishUserAction( + $template_bundle_id, $template_data, $target_ids='', $body_general='', + $story_size=FacebookRestClient::STORY_SIZE_ONE_LINE) { + + if (is_array($template_data)) { + $template_data = json_encode($template_data); + } // allow client to either pass in JSON or an assoc that we JSON for them + + if (is_array($target_ids)) { + $target_ids = json_encode($target_ids); + $target_ids = trim($target_ids, "[]"); // we don't want square brackets + } + + return $this->call_method('facebook.feed.publishUserAction', + array('template_bundle_id' => $template_bundle_id, + 'template_data' => $template_data, + 'target_ids' => $target_ids, + 'body_general' => $body_general, + 'story_size' => $story_size)); + } + + /** + * For the current user, retrieves stories generated by the user's friends + * while using this application. This can be used to easily create a + * "News Feed" like experience. + * + * @return array An array of feed story objects. + */ + public function &feed_getAppFriendStories() { + return $this->call_method('facebook.feed.getAppFriendStories', array()); + } + + /** + * Makes an FQL query. This is a generalized way of accessing all the data + * in the API, as an alternative to most of the other method calls. More + * info at http://developers.facebook.com/documentation.php?v=1.0&doc=fql + * + * @param string $query the query to evaluate + * + * @return array generalized array representing the results + */ + public function &fql_query($query) { + return $this->call_method('facebook.fql.query', + array('query' => $query)); + } + + /** + * Returns whether or not pairs of users are friends. + * Note that the Facebook friend relationship is symmetric. + * + * @param array $uids1 array of ids (id_1, id_2,...) of some length X + * @param array $uids2 array of ids (id_A, id_B,...) of SAME length X + * + * @return array An array with uid1, uid2, and bool if friends, e.g.: + * array(0 => array('uid1' => id_1, 'uid2' => id_A, 'are_friends' => 1), + * 1 => array('uid1' => id_2, 'uid2' => id_B, 'are_friends' => 0) + * ...) + */ + public function &friends_areFriends($uids1, $uids2) { + return $this->call_method('facebook.friends.areFriends', + array('uids1' => $uids1, 'uids2' => $uids2)); + } + + /** + * Returns the friends of the current session user. + * + * @param int $flid (Optional) Only return friends on this friend list. + * + * @return array An array of friends + */ + public function &friends_get($flid=null) { + if (isset($this->friends_list)) { + return $this->friends_list; + } + $params = array(); + if (isset($this->canvas_user)) { + $params['uid'] = $this->canvas_user; + } + if ($flid) { + $params['flid'] = $flid; + } + return $this->call_method('facebook.friends.get', $params); + + } + + /** + * Returns the set of friend lists for the current session user. + * + * @return array An array of friend list objects + */ + public function &friends_getLists() { + return $this->call_method('facebook.friends.getLists', array()); + } + + /** + * Returns the friends of the session user, who are also users + * of the calling application. + * + * @return array An array of friends also using the app + */ + public function &friends_getAppUsers() { + return $this->call_method('facebook.friends.getAppUsers', array()); + } + + /** + * Returns groups according to the filters specified. + * + * @param int $uid (Optional) User associated with groups. A null + * parameter will default to the session user. + * @param array $gids (Optional) Group ids to query. A null parameter will + * get all groups for the user. + * + * @return array An array of group objects + */ + public function &groups_get($uid, $gids) { + return $this->call_method('facebook.groups.get', + array('uid' => $uid, + 'gids' => $gids)); + } + + /** + * Returns the membership list of a group. + * + * @param int $gid Group id + * + * @return array An array with four membership lists, with keys 'members', + * 'admins', 'officers', and 'not_replied' + */ + public function &groups_getMembers($gid) { + return $this->call_method('facebook.groups.getMembers', + array('gid' => $gid)); + } + + /** + * Returns cookies according to the filters specified. + * + * @param int $uid User for which the cookies are needed. + * @param string $name (Optional) A null parameter will get all cookies + * for the user. + * + * @return array Cookies! Nom nom nom nom nom. + */ + public function data_getCookies($uid, $name) { + return $this->call_method('facebook.data.getCookies', + array('uid' => $uid, + 'name' => $name)); + } + + /** + * Sets cookies according to the params specified. + * + * @param int $uid User for which the cookies are needed. + * @param string $name Name of the cookie + * @param string $value (Optional) if expires specified and is in the past + * @param int $expires (Optional) Expiry time + * @param string $path (Optional) Url path to associate with (default is /) + * + * @return bool true on success + */ + public function data_setCookie($uid, $name, $value, $expires, $path) { + return $this->call_method('facebook.data.setCookie', + array('uid' => $uid, + 'name' => $name, + 'value' => $value, + 'expires' => $expires, + 'path' => $path)); + } + + /** + * Permissions API + */ + + /** + * Checks API-access granted by self to the specified application. + * + * @param string $permissions_apikey Other application key + * + * @return array API methods/namespaces which are allowed access + */ + public function permissions_checkGrantedApiAccess($permissions_apikey) { + return $this->call_method('facebook.permissions.checkGrantedApiAccess', + array('permissions_apikey' => $permissions_apikey)); + } + + /** + * Checks API-access granted to self by the specified application. + * + * @param string $permissions_apikey Other application key + * + * @return array API methods/namespaces which are allowed access + */ + public function permissions_checkAvailableApiAccess($permissions_apikey) { + return $this->call_method('facebook.permissions.checkAvailableApiAccess', + array('permissions_apikey' => $permissions_apikey)); + } + + /** + * Grant API-access to the specified methods/namespaces to the specified + * application. + * + * @param string $permissions_apikey Other application key + * @param array(string) $method_arr (Optional) API methods/namespaces + * allowed + * + * @return array API methods/namespaces which are allowed access + */ + public function permissions_grantApiAccess($permissions_apikey, $method_arr) { + return $this->call_method('facebook.permissions.grantApiAccess', + array('permissions_apikey' => $permissions_apikey, + 'method_arr' => $method_arr)); + } + + /** + * Revoke API-access granted to the specified application. + * + * @param string $permissions_apikey Other application key + * + * @return bool true on success + */ + public function permissions_revokeApiAccess($permissions_apikey) { + return $this->call_method('facebook.permissions.revokeApiAccess', + array('permissions_apikey' => $permissions_apikey)); + } + + /** + * Returns the outstanding notifications for the session user. + * + * @return array An assoc array of notification count objects for + * 'messages', 'pokes' and 'shares', a uid list of + * 'friend_requests', a gid list of 'group_invites', + * and an eid list of 'event_invites' + */ + public function ¬ifications_get() { + return $this->call_method('facebook.notifications.get', array()); + } + + /** + * Sends a notification to the specified users. + * + * @return A comma separated list of successful recipients + */ + public function ¬ifications_send($to_ids, $notification, $type) { + return $this->call_method('facebook.notifications.send', + array('to_ids' => $to_ids, + 'notification' => $notification, + 'type' => $type)); + } + + /** + * Sends an email to the specified user of the application. + * + * @param array $recipients id of the recipients + * @param string $subject subject of the email + * @param string $text (plain text) body of the email + * @param string $fbml fbml markup for an html version of the email + * + * @return string A comma separated list of successful recipients + */ + public function ¬ifications_sendEmail($recipients, + $subject, + $text, + $fbml) { + return $this->call_method('facebook.notifications.sendEmail', + array('recipients' => $recipients, + 'subject' => $subject, + 'text' => $text, + 'fbml' => $fbml)); + } + + /** + * Returns the requested info fields for the requested set of pages. + * + * @param array $page_ids an array of page ids + * @param array $fields an array of strings describing the info fields + * desired + * @param int $uid (Optional) limit results to pages of which this + * user is a fan. + * @param string type limits results to a particular type of page. + * + * @return array An array of pages + */ + public function &pages_getInfo($page_ids, $fields, $uid, $type) { + return $this->call_method('facebook.pages.getInfo', + array('page_ids' => $page_ids, + 'fields' => $fields, + 'uid' => $uid, + 'type' => $type)); + } + + /** + * Returns true if the given user is an admin for the passed page. + * + * @param int $page_id target page id + * @param int $uid (Optional) user id (defaults to the logged-in user) + * + * @return bool true on success + */ + public function &pages_isAdmin($page_id, $uid = null) { + return $this->call_method('facebook.pages.isAdmin', + array('page_id' => $page_id, + 'uid' => $uid)); + } + + /** + * Returns whether or not the given page has added the application. + * + * @param int $page_id target page id + * + * @return bool true on success + */ + public function &pages_isAppAdded($page_id) { + return $this->call_method('facebook.pages.isAppAdded', + array('page_id' => $page_id)); + } + + /** + * Returns true if logged in user is a fan for the passed page. + * + * @param int $page_id target page id + * @param int $uid user to compare. If empty, the logged in user. + * + * @return bool true on success + */ + public function &pages_isFan($page_id, $uid = null) { + return $this->call_method('facebook.pages.isFan', + array('page_id' => $page_id, + 'uid' => $uid)); + } + + /** + * Adds a tag with the given information to a photo. See the wiki for details: + * + * http://wiki.developers.facebook.com/index.php/Photos.addTag + * + * @param int $pid The ID of the photo to be tagged + * @param int $tag_uid The ID of the user being tagged. You must specify + * either the $tag_uid or the $tag_text parameter + * (unless $tags is specified). + * @param string $tag_text Some text identifying the person being tagged. + * You must specify either the $tag_uid or $tag_text + * parameter (unless $tags is specified). + * @param float $x The horizontal position of the tag, as a + * percentage from 0 to 100, from the left of the + * photo. + * @param float $y The vertical position of the tag, as a percentage + * from 0 to 100, from the top of the photo. + * @param array $tags (Optional) An array of maps, where each map + * can contain the tag_uid, tag_text, x, and y + * parameters defined above. If specified, the + * individual arguments are ignored. + * @param int $owner_uid (Optional) The user ID of the user whose photo + * you are tagging. If this parameter is not + * specified, then it defaults to the session user. + * + * @return bool true on success + */ + public function &photos_addTag($pid, + $tag_uid, + $tag_text, + $x, + $y, + $tags, + $owner_uid=0) { + return $this->call_method('facebook.photos.addTag', + array('pid' => $pid, + 'tag_uid' => $tag_uid, + 'tag_text' => $tag_text, + 'x' => $x, + 'y' => $y, + 'tags' => json_encode($tags), + 'owner_uid' => $this->get_uid($owner_uid))); + } + + /** + * Creates and returns a new album owned by the specified user or the current + * session user. + * + * @param string $name The name of the album. + * @param string $description (Optional) A description of the album. + * @param string $location (Optional) A description of the location. + * @param string $visible (Optional) A privacy setting for the album. + * One of 'friends', 'friends-of-friends', + * 'networks', or 'everyone'. Default 'everyone'. + * @param int $uid (Optional) User id for creating the album; if + * not specified, the session user is used. + * + * @return array An album object + */ + public function &photos_createAlbum($name, + $description='', + $location='', + $visible='', + $uid=0) { + return $this->call_method('facebook.photos.createAlbum', + array('name' => $name, + 'description' => $description, + 'location' => $location, + 'visible' => $visible, + 'uid' => $this->get_uid($uid))); + } + + /** + * Returns photos according to the filters specified. + * + * @param int $subj_id (Optional) Filter by uid of user tagged in the photos. + * @param int $aid (Optional) Filter by an album, as returned by + * photos_getAlbums. + * @param array $pids (Optional) Restrict to a list of pids + * + * Note that at least one of these parameters needs to be specified, or an + * error is returned. + * + * @return array An array of photo objects. + */ + public function &photos_get($subj_id, $aid, $pids) { + return $this->call_method('facebook.photos.get', + array('subj_id' => $subj_id, 'aid' => $aid, 'pids' => $pids)); + } + + /** + * Returns the albums created by the given user. + * + * @param int $uid (Optional) The uid of the user whose albums you want. + * A null will return the albums of the session user. + * @param array $aids (Optional) A list of aids to restrict the query. + * + * Note that at least one of the (uid, aids) parameters must be specified. + * + * @returns an array of album objects. + */ + public function &photos_getAlbums($uid, $aids) { + return $this->call_method('facebook.photos.getAlbums', + array('uid' => $uid, + 'aids' => $aids)); + } + + /** + * Returns the tags on all photos specified. + * + * @param string $pids A list of pids to query + * + * @return array An array of photo tag objects, which include pid, + * subject uid, and two floating-point numbers (xcoord, ycoord) + * for tag pixel location. + */ + public function &photos_getTags($pids) { + return $this->call_method('facebook.photos.getTags', + array('pids' => $pids)); + } + + /** + * Returns the requested info fields for the requested set of users. + * + * @param array $uids An array of user ids + * @param array $fields An array of info field names desired + * + * @return array An array of user objects + */ + public function &users_getInfo($uids, $fields) { + return $this->call_method('facebook.users.getInfo', + array('uids' => $uids, 'fields' => $fields)); + } + + /** + * Returns the requested info fields for the requested set of users. A + * session key must not be specified. Only data about users that have + * authorized your application will be returned. + * + * Check the wiki for fields that can be queried through this API call. + * Data returned from here should not be used for rendering to application + * users, use users.getInfo instead, so that proper privacy rules will be + * applied. + * + * @param array $uids An array of user ids + * @param array $fields An array of info field names desired + * + * @return array An array of user objects + */ + public function &users_getStandardInfo($uids, $fields) { + return $this->call_method('facebook.users.getStandardInfo', + array('uids' => $uids, 'fields' => $fields)); + } + + /** + * Returns the user corresponding to the current session object. + * + * @return integer User id + */ + public function &users_getLoggedInUser() { + return $this->call_method('facebook.users.getLoggedInUser', array()); + } + + /** + * Returns 1 if the user has the specified permission, 0 otherwise. + * http://wiki.developers.facebook.com/index.php/Users.hasAppPermission + * + * @return integer 1 or 0 + */ + public function &users_hasAppPermission($ext_perm, $uid=null) { + return $this->call_method('facebook.users.hasAppPermission', + array('ext_perm' => $ext_perm, 'uid' => $uid)); + } + + /** + * Returns whether or not the user corresponding to the current + * session object has the give the app basic authorization. + * + * @return boolean true if the user has authorized the app + */ + public function &users_isAppUser($uid=null) { + if ($uid === null && isset($this->is_user)) { + return $this->is_user; + } + + return $this->call_method('facebook.users.isAppUser', array('uid' => $uid)); + } + + /** + * Sets the users' current status message. Message does NOT contain the + * word "is" , so make sure to include a verb. + * + * Example: setStatus("is loving the API!") + * will produce the status "Luke is loving the API!" + * + * @param string $status text-only message to set + * @param int $uid user to set for (defaults to the + * logged-in user) + * @param bool $clear whether or not to clear the status, + * instead of setting it + * @param bool $status_includes_verb if true, the word "is" will *not* be + * prepended to the status message + * + * @return boolean + */ + public function &users_setStatus($status, + $uid = null, + $clear = false, + $status_includes_verb = true) { + $args = array( + 'status' => $status, + 'uid' => $uid, + 'clear' => $clear, + 'status_includes_verb' => $status_includes_verb, + ); + return $this->call_method('facebook.users.setStatus', $args); + } + + /** + * Sets the FBML for the profile of the user attached to this session. + * + * @param string $markup The FBML that describes the profile + * presence of this app for the user + * @param int $uid The user + * @param string $profile Profile FBML + * @param string $profile_action Profile action FBML (deprecated) + * @param string $mobile_profile Mobile profile FBML + * @param string $profile_main Main Tab profile FBML + * + * @return array A list of strings describing any compile errors for the + * submitted FBML + */ + function profile_setFBML($markup, + $uid=null, + $profile='', + $profile_action='', + $mobile_profile='', + $profile_main='') { + return $this->call_method('facebook.profile.setFBML', + array('markup' => $markup, + 'uid' => $uid, + 'profile' => $profile, + 'profile_action' => $profile_action, + 'mobile_profile' => $mobile_profile, + 'profile_main' => $profile_main)); + } + + /** + * Gets the FBML for the profile box that is currently set for a user's + * profile (your application set the FBML previously by calling the + * profile.setFBML method). + * + * @param int $uid (Optional) User id to lookup; defaults to session. + * @param int $type (Optional) 1 for original style, 2 for profile_main boxes + * + * @return string The FBML + */ + public function &profile_getFBML($uid=null, $type=null) { + return $this->call_method('facebook.profile.getFBML', + array('uid' => $uid, + 'type' => $type)); + } + + /** + * Returns the specified user's application info section for the calling + * application. These info sections have either been set via a previous + * profile.setInfo call or by the user editing them directly. + * + * @param int $uid (Optional) User id to lookup; defaults to session. + * + * @return array Info fields for the current user. See wiki for structure: + * + * http://wiki.developers.facebook.com/index.php/Profile.getInfo + * + */ + public function &profile_getInfo($uid=null) { + return $this->call_method('facebook.profile.getInfo', + array('uid' => $uid)); + } + + /** + * Returns the options associated with the specified info field for an + * application info section. + * + * @param string $field The title of the field + * + * @return array An array of info options. + */ + public function &profile_getInfoOptions($field) { + return $this->call_method('facebook.profile.getInfoOptions', + array('field' => $field)); + } + + /** + * Configures an application info section that the specified user can install + * on the Info tab of her profile. For details on the structure of an info + * field, please see: + * + * http://wiki.developers.facebook.com/index.php/Profile.setInfo + * + * @param string $title Title / header of the info section + * @param int $type 1 for text-only, 5 for thumbnail views + * @param array $info_fields An array of info fields. See wiki for details. + * @param int $uid (Optional) + * + * @return bool true on success + */ + public function &profile_setInfo($title, $type, $info_fields, $uid=null) { + return $this->call_method('facebook.profile.setInfo', + array('uid' => $uid, + 'type' => $type, + 'title' => $title, + 'info_fields' => json_encode($info_fields))); + } + + /** + * Specifies the objects for a field for an application info section. These + * options populate the typeahead for a thumbnail. + * + * @param string $field The title of the field + * @param array $options An array of items for a thumbnail, including + * 'label', 'link', and optionally 'image', + * 'description' and 'sublabel' + * + * @return bool true on success + */ + public function profile_setInfoOptions($field, $options) { + return $this->call_method('facebook.profile.setInfoOptions', + array('field' => $field, + 'options' => json_encode($options))); + } + + /** + * Get all the marketplace categories. + * + * @return array A list of category names + */ + function marketplace_getCategories() { + return $this->call_method('facebook.marketplace.getCategories', + array()); + } + + /** + * Get all the marketplace subcategories for a particular category. + * + * @param category The category for which we are pulling subcategories + * + * @return array A list of subcategory names + */ + function marketplace_getSubCategories($category) { + return $this->call_method('facebook.marketplace.getSubCategories', + array('category' => $category)); + } + + /** + * Get listings by either listing_id or user. + * + * @param listing_ids An array of listing_ids (optional) + * @param uids An array of user ids (optional) + * + * @return array The data for matched listings + */ + function marketplace_getListings($listing_ids, $uids) { + return $this->call_method('facebook.marketplace.getListings', + array('listing_ids' => $listing_ids, 'uids' => $uids)); + } + + /** + * Search for Marketplace listings. All arguments are optional, though at + * least one must be filled out to retrieve results. + * + * @param category The category in which to search (optional) + * @param subcategory The subcategory in which to search (optional) + * @param query A query string (optional) + * + * @return array The data for matched listings + */ + function marketplace_search($category, $subcategory, $query) { + return $this->call_method('facebook.marketplace.search', + array('category' => $category, + 'subcategory' => $subcategory, + 'query' => $query)); + } + + /** + * Remove a listing from Marketplace. + * + * @param listing_id The id of the listing to be removed + * @param status 'SUCCESS', 'NOT_SUCCESS', or 'DEFAULT' + * + * @return bool True on success + */ + function marketplace_removeListing($listing_id, + $status='DEFAULT', + $uid=null) { + return $this->call_method('facebook.marketplace.removeListing', + array('listing_id' => $listing_id, + 'status' => $status, + 'uid' => $uid)); + } + + /** + * Create/modify a Marketplace listing for the loggedinuser. + * + * @param int listing_id The id of a listing to be modified, 0 + * for a new listing. + * @param show_on_profile bool Should we show this listing on the + * user's profile + * @param listing_attrs array An array of the listing data + * + * @return int The listing_id (unchanged if modifying an existing listing). + */ + function marketplace_createListing($listing_id, + $show_on_profile, + $attrs, + $uid=null) { + return $this->call_method('facebook.marketplace.createListing', + array('listing_id' => $listing_id, + 'show_on_profile' => $show_on_profile, + 'listing_attrs' => json_encode($attrs), + 'uid' => $uid)); + } + + ///////////////////////////////////////////////////////////////////////////// + // Data Store API + + /** + * Set a user preference. + * + * @param pref_id preference identifier (0-200) + * @param value preferece's value + * @param uid the user id (defaults to current session user) + * @error + * API_EC_DATA_DATABASE_ERROR + * API_EC_PARAM + * API_EC_DATA_QUOTA_EXCEEDED + * API_EC_DATA_UNKNOWN_ERROR + * API_EC_PERMISSION_OTHER_USER + */ + public function &data_setUserPreference($pref_id, $value, $uid = null) { + return $this->call_method('facebook.data.setUserPreference', + array('pref_id' => $pref_id, + 'value' => $value, + 'uid' => $this->get_uid($uid))); + } + + /** + * Set a user's all preferences for this application. + * + * @param values preferece values in an associative arrays + * @param replace whether to replace all existing preferences or + * merge into them. + * @param uid the user id (defaults to current session user) + * @error + * API_EC_DATA_DATABASE_ERROR + * API_EC_PARAM + * API_EC_DATA_QUOTA_EXCEEDED + * API_EC_DATA_UNKNOWN_ERROR + * API_EC_PERMISSION_OTHER_USER + */ + public function &data_setUserPreferences($values, + $replace = false, + $uid = null) { + return $this->call_method('facebook.data.setUserPreferences', + array('values' => json_encode($values), + 'replace' => $replace, + 'uid' => $this->get_uid($uid))); + } + + /** + * Get a user preference. + * + * @param pref_id preference identifier (0-200) + * @param uid the user id (defaults to current session user) + * @return preference's value + * @error + * API_EC_DATA_DATABASE_ERROR + * API_EC_PARAM + * API_EC_DATA_QUOTA_EXCEEDED + * API_EC_DATA_UNKNOWN_ERROR + * API_EC_PERMISSION_OTHER_USER + */ + public function &data_getUserPreference($pref_id, $uid = null) { + return $this->call_method('facebook.data.getUserPreference', + array('pref_id' => $pref_id, + 'uid' => $this->get_uid($uid))); + } + + /** + * Get a user preference. + * + * @param uid the user id (defaults to current session user) + * @return preference values + * @error + * API_EC_DATA_DATABASE_ERROR + * API_EC_DATA_QUOTA_EXCEEDED + * API_EC_DATA_UNKNOWN_ERROR + * API_EC_PERMISSION_OTHER_USER + */ + public function &data_getUserPreferences($uid = null) { + return $this->call_method('facebook.data.getUserPreferences', + array('uid' => $this->get_uid($uid))); + } + + /** + * Create a new object type. + * + * @param name object type's name + * @error + * API_EC_DATA_DATABASE_ERROR + * API_EC_DATA_OBJECT_ALREADY_EXISTS + * API_EC_PARAM + * API_EC_PERMISSION + * API_EC_DATA_INVALID_OPERATION + * API_EC_DATA_QUOTA_EXCEEDED + * API_EC_DATA_UNKNOWN_ERROR + */ + public function &data_createObjectType($name) { + return $this->call_method('facebook.data.createObjectType', + array('name' => $name)); + } + + /** + * Delete an object type. + * + * @param obj_type object type's name + * @error + * API_EC_DATA_DATABASE_ERROR + * API_EC_DATA_OBJECT_NOT_FOUND + * API_EC_PARAM + * API_EC_PERMISSION + * API_EC_DATA_INVALID_OPERATION + * API_EC_DATA_QUOTA_EXCEEDED + * API_EC_DATA_UNKNOWN_ERROR + */ + public function &data_dropObjectType($obj_type) { + return $this->call_method('facebook.data.dropObjectType', + array('obj_type' => $obj_type)); + } + + /** + * Rename an object type. + * + * @param obj_type object type's name + * @param new_name new object type's name + * @error + * API_EC_DATA_DATABASE_ERROR + * API_EC_DATA_OBJECT_NOT_FOUND + * API_EC_DATA_OBJECT_ALREADY_EXISTS + * API_EC_PARAM + * API_EC_PERMISSION + * API_EC_DATA_INVALID_OPERATION + * API_EC_DATA_QUOTA_EXCEEDED + * API_EC_DATA_UNKNOWN_ERROR + */ + public function &data_renameObjectType($obj_type, $new_name) { + return $this->call_method('facebook.data.renameObjectType', + array('obj_type' => $obj_type, + 'new_name' => $new_name)); + } + + /** + * Add a new property to an object type. + * + * @param obj_type object type's name + * @param prop_name name of the property to add + * @param prop_type 1: integer; 2: string; 3: text blob + * @error + * API_EC_DATA_DATABASE_ERROR + * API_EC_DATA_OBJECT_ALREADY_EXISTS + * API_EC_PARAM + * API_EC_PERMISSION + * API_EC_DATA_INVALID_OPERATION + * API_EC_DATA_QUOTA_EXCEEDED + * API_EC_DATA_UNKNOWN_ERROR + */ + public function &data_defineObjectProperty($obj_type, + $prop_name, + $prop_type) { + return $this->call_method('facebook.data.defineObjectProperty', + array('obj_type' => $obj_type, + 'prop_name' => $prop_name, + 'prop_type' => $prop_type)); + } + + /** + * Remove a previously defined property from an object type. + * + * @param obj_type object type's name + * @param prop_name name of the property to remove + * @error + * API_EC_DATA_DATABASE_ERROR + * API_EC_DATA_OBJECT_NOT_FOUND + * API_EC_PARAM + * API_EC_PERMISSION + * API_EC_DATA_INVALID_OPERATION + * API_EC_DATA_QUOTA_EXCEEDED + * API_EC_DATA_UNKNOWN_ERROR + */ + public function &data_undefineObjectProperty($obj_type, $prop_name) { + return $this->call_method('facebook.data.undefineObjectProperty', + array('obj_type' => $obj_type, + 'prop_name' => $prop_name)); + } + + /** + * Rename a previously defined property of an object type. + * + * @param obj_type object type's name + * @param prop_name name of the property to rename + * @param new_name new name to use + * @error + * API_EC_DATA_DATABASE_ERROR + * API_EC_DATA_OBJECT_NOT_FOUND + * API_EC_DATA_OBJECT_ALREADY_EXISTS + * API_EC_PARAM + * API_EC_PERMISSION + * API_EC_DATA_INVALID_OPERATION + * API_EC_DATA_QUOTA_EXCEEDED + * API_EC_DATA_UNKNOWN_ERROR + */ + public function &data_renameObjectProperty($obj_type, $prop_name, + $new_name) { + return $this->call_method('facebook.data.renameObjectProperty', + array('obj_type' => $obj_type, + 'prop_name' => $prop_name, + 'new_name' => $new_name)); + } + + /** + * Retrieve a list of all object types that have defined for the application. + * + * @return a list of object type names + * @error + * API_EC_DATA_DATABASE_ERROR + * API_EC_PERMISSION + * API_EC_DATA_QUOTA_EXCEEDED + * API_EC_DATA_UNKNOWN_ERROR + */ + public function &data_getObjectTypes() { + return $this->call_method('facebook.data.getObjectTypes', array()); + } + + /** + * Get definitions of all properties of an object type. + * + * @param obj_type object type's name + * @return pairs of property name and property types + * @error + * API_EC_DATA_DATABASE_ERROR + * API_EC_PARAM + * API_EC_PERMISSION + * API_EC_DATA_OBJECT_NOT_FOUND + * API_EC_DATA_QUOTA_EXCEEDED + * API_EC_DATA_UNKNOWN_ERROR + */ + public function &data_getObjectType($obj_type) { + return $this->call_method('facebook.data.getObjectType', + array('obj_type' => $obj_type)); + } + + /** + * Create a new object. + * + * @param obj_type object type's name + * @param properties (optional) properties to set initially + * @return newly created object's id + * @error + * API_EC_DATA_DATABASE_ERROR + * API_EC_PARAM + * API_EC_PERMISSION + * API_EC_DATA_INVALID_OPERATION + * API_EC_DATA_QUOTA_EXCEEDED + * API_EC_DATA_UNKNOWN_ERROR + */ + public function &data_createObject($obj_type, $properties = null) { + return $this->call_method('facebook.data.createObject', + array('obj_type' => $obj_type, + 'properties' => json_encode($properties))); + } + + /** + * Update an existing object. + * + * @param obj_id object's id + * @param properties new properties + * @param replace true for replacing existing properties; + * false for merging + * @error + * API_EC_DATA_DATABASE_ERROR + * API_EC_DATA_OBJECT_NOT_FOUND + * API_EC_PARAM + * API_EC_PERMISSION + * API_EC_DATA_INVALID_OPERATION + * API_EC_DATA_QUOTA_EXCEEDED + * API_EC_DATA_UNKNOWN_ERROR + */ + public function &data_updateObject($obj_id, $properties, $replace = false) { + return $this->call_method('facebook.data.updateObject', + array('obj_id' => $obj_id, + 'properties' => json_encode($properties), + 'replace' => $replace)); + } + + /** + * Delete an existing object. + * + * @param obj_id object's id + * @error + * API_EC_DATA_DATABASE_ERROR + * API_EC_DATA_OBJECT_NOT_FOUND + * API_EC_PARAM + * API_EC_PERMISSION + * API_EC_DATA_INVALID_OPERATION + * API_EC_DATA_QUOTA_EXCEEDED + * API_EC_DATA_UNKNOWN_ERROR + */ + public function &data_deleteObject($obj_id) { + return $this->call_method('facebook.data.deleteObject', + array('obj_id' => $obj_id)); + } + + /** + * Delete a list of objects. + * + * @param obj_ids objects to delete + * @error + * API_EC_DATA_DATABASE_ERROR + * API_EC_PARAM + * API_EC_PERMISSION + * API_EC_DATA_INVALID_OPERATION + * API_EC_DATA_QUOTA_EXCEEDED + * API_EC_DATA_UNKNOWN_ERROR + */ + public function &data_deleteObjects($obj_ids) { + return $this->call_method('facebook.data.deleteObjects', + array('obj_ids' => json_encode($obj_ids))); + } + + /** + * Get a single property value of an object. + * + * @param obj_id object's id + * @param prop_name individual property's name + * @return individual property's value + * @error + * API_EC_DATA_DATABASE_ERROR + * API_EC_DATA_OBJECT_NOT_FOUND + * API_EC_PARAM + * API_EC_PERMISSION + * API_EC_DATA_INVALID_OPERATION + * API_EC_DATA_QUOTA_EXCEEDED + * API_EC_DATA_UNKNOWN_ERROR + */ + public function &data_getObjectProperty($obj_id, $prop_name) { + return $this->call_method('facebook.data.getObjectProperty', + array('obj_id' => $obj_id, + 'prop_name' => $prop_name)); + } + + /** + * Get properties of an object. + * + * @param obj_id object's id + * @param prop_names (optional) properties to return; null for all. + * @return specified properties of an object + * @error + * API_EC_DATA_DATABASE_ERROR + * API_EC_DATA_OBJECT_NOT_FOUND + * API_EC_PARAM + * API_EC_PERMISSION + * API_EC_DATA_INVALID_OPERATION + * API_EC_DATA_QUOTA_EXCEEDED + * API_EC_DATA_UNKNOWN_ERROR + */ + public function &data_getObject($obj_id, $prop_names = null) { + return $this->call_method('facebook.data.getObject', + array('obj_id' => $obj_id, + 'prop_names' => json_encode($prop_names))); + } + + /** + * Get properties of a list of objects. + * + * @param obj_ids object ids + * @param prop_names (optional) properties to return; null for all. + * @return specified properties of an object + * @error + * API_EC_DATA_DATABASE_ERROR + * API_EC_DATA_OBJECT_NOT_FOUND + * API_EC_PARAM + * API_EC_PERMISSION + * API_EC_DATA_INVALID_OPERATION + * API_EC_DATA_QUOTA_EXCEEDED + * API_EC_DATA_UNKNOWN_ERROR + */ + public function &data_getObjects($obj_ids, $prop_names = null) { + return $this->call_method('facebook.data.getObjects', + array('obj_ids' => json_encode($obj_ids), + 'prop_names' => json_encode($prop_names))); + } + + /** + * Set a single property value of an object. + * + * @param obj_id object's id + * @param prop_name individual property's name + * @param prop_value new value to set + * @error + * API_EC_DATA_DATABASE_ERROR + * API_EC_DATA_OBJECT_NOT_FOUND + * API_EC_PARAM + * API_EC_PERMISSION + * API_EC_DATA_INVALID_OPERATION + * API_EC_DATA_QUOTA_EXCEEDED + * API_EC_DATA_UNKNOWN_ERROR + */ + public function &data_setObjectProperty($obj_id, $prop_name, + $prop_value) { + return $this->call_method('facebook.data.setObjectProperty', + array('obj_id' => $obj_id, + 'prop_name' => $prop_name, + 'prop_value' => $prop_value)); + } + + /** + * Read hash value by key. + * + * @param obj_type object type's name + * @param key hash key + * @param prop_name (optional) individual property's name + * @return hash value + * @error + * API_EC_DATA_DATABASE_ERROR + * API_EC_PARAM + * API_EC_PERMISSION + * API_EC_DATA_INVALID_OPERATION + * API_EC_DATA_QUOTA_EXCEEDED + * API_EC_DATA_UNKNOWN_ERROR + */ + public function &data_getHashValue($obj_type, $key, $prop_name = null) { + return $this->call_method('facebook.data.getHashValue', + array('obj_type' => $obj_type, + 'key' => $key, + 'prop_name' => $prop_name)); + } + + /** + * Write hash value by key. + * + * @param obj_type object type's name + * @param key hash key + * @param value hash value + * @param prop_name (optional) individual property's name + * @error + * API_EC_DATA_DATABASE_ERROR + * API_EC_PARAM + * API_EC_PERMISSION + * API_EC_DATA_INVALID_OPERATION + * API_EC_DATA_QUOTA_EXCEEDED + * API_EC_DATA_UNKNOWN_ERROR + */ + public function &data_setHashValue($obj_type, + $key, + $value, + $prop_name = null) { + return $this->call_method('facebook.data.setHashValue', + array('obj_type' => $obj_type, + 'key' => $key, + 'value' => $value, + 'prop_name' => $prop_name)); + } + + /** + * Increase a hash value by specified increment atomically. + * + * @param obj_type object type's name + * @param key hash key + * @param prop_name individual property's name + * @param increment (optional) default is 1 + * @return incremented hash value + * @error + * API_EC_DATA_DATABASE_ERROR + * API_EC_PARAM + * API_EC_PERMISSION + * API_EC_DATA_INVALID_OPERATION + * API_EC_DATA_QUOTA_EXCEEDED + * API_EC_DATA_UNKNOWN_ERROR + */ + public function &data_incHashValue($obj_type, + $key, + $prop_name, + $increment = 1) { + return $this->call_method('facebook.data.incHashValue', + array('obj_type' => $obj_type, + 'key' => $key, + 'prop_name' => $prop_name, + 'increment' => $increment)); + } + + /** + * Remove a hash key and its values. + * + * @param obj_type object type's name + * @param key hash key + * @error + * API_EC_DATA_DATABASE_ERROR + * API_EC_PARAM + * API_EC_PERMISSION + * API_EC_DATA_INVALID_OPERATION + * API_EC_DATA_QUOTA_EXCEEDED + * API_EC_DATA_UNKNOWN_ERROR + */ + public function &data_removeHashKey($obj_type, $key) { + return $this->call_method('facebook.data.removeHashKey', + array('obj_type' => $obj_type, + 'key' => $key)); + } + + /** + * Remove hash keys and their values. + * + * @param obj_type object type's name + * @param keys hash keys + * @error + * API_EC_DATA_DATABASE_ERROR + * API_EC_PARAM + * API_EC_PERMISSION + * API_EC_DATA_INVALID_OPERATION + * API_EC_DATA_QUOTA_EXCEEDED + * API_EC_DATA_UNKNOWN_ERROR + */ + public function &data_removeHashKeys($obj_type, $keys) { + return $this->call_method('facebook.data.removeHashKeys', + array('obj_type' => $obj_type, + 'keys' => json_encode($keys))); + } + + /** + * Define an object association. + * + * @param name name of this association + * @param assoc_type 1: one-way 2: two-way symmetric 3: two-way asymmetric + * @param assoc_info1 needed info about first object type + * @param assoc_info2 needed info about second object type + * @param inverse (optional) name of reverse association + * @error + * API_EC_DATA_DATABASE_ERROR + * API_EC_DATA_OBJECT_ALREADY_EXISTS + * API_EC_PARAM + * API_EC_PERMISSION + * API_EC_DATA_INVALID_OPERATION + * API_EC_DATA_QUOTA_EXCEEDED + * API_EC_DATA_UNKNOWN_ERROR + */ + public function &data_defineAssociation($name, $assoc_type, $assoc_info1, + $assoc_info2, $inverse = null) { + return $this->call_method('facebook.data.defineAssociation', + array('name' => $name, + 'assoc_type' => $assoc_type, + 'assoc_info1' => json_encode($assoc_info1), + 'assoc_info2' => json_encode($assoc_info2), + 'inverse' => $inverse)); + } + + /** + * Undefine an object association. + * + * @param name name of this association + * @error + * API_EC_DATA_DATABASE_ERROR + * API_EC_DATA_OBJECT_NOT_FOUND + * API_EC_PARAM + * API_EC_PERMISSION + * API_EC_DATA_INVALID_OPERATION + * API_EC_DATA_QUOTA_EXCEEDED + * API_EC_DATA_UNKNOWN_ERROR + */ + public function &data_undefineAssociation($name) { + return $this->call_method('facebook.data.undefineAssociation', + array('name' => $name)); + } + + /** + * Rename an object association or aliases. + * + * @param name name of this association + * @param new_name (optional) new name of this association + * @param new_alias1 (optional) new alias for object type 1 + * @param new_alias2 (optional) new alias for object type 2 + * @error + * API_EC_DATA_DATABASE_ERROR + * API_EC_DATA_OBJECT_ALREADY_EXISTS + * API_EC_DATA_OBJECT_NOT_FOUND + * API_EC_PARAM + * API_EC_PERMISSION + * API_EC_DATA_INVALID_OPERATION + * API_EC_DATA_QUOTA_EXCEEDED + * API_EC_DATA_UNKNOWN_ERROR + */ + public function &data_renameAssociation($name, $new_name, $new_alias1 = null, + $new_alias2 = null) { + return $this->call_method('facebook.data.renameAssociation', + array('name' => $name, + 'new_name' => $new_name, + 'new_alias1' => $new_alias1, + 'new_alias2' => $new_alias2)); + } + + /** + * Get definition of an object association. + * + * @param name name of this association + * @return specified association + * @error + * API_EC_DATA_DATABASE_ERROR + * API_EC_DATA_OBJECT_NOT_FOUND + * API_EC_PARAM + * API_EC_PERMISSION + * API_EC_DATA_QUOTA_EXCEEDED + * API_EC_DATA_UNKNOWN_ERROR + */ + public function &data_getAssociationDefinition($name) { + return $this->call_method('facebook.data.getAssociationDefinition', + array('name' => $name)); + } + + /** + * Get definition of all associations. + * + * @return all defined associations + * @error + * API_EC_DATA_DATABASE_ERROR + * API_EC_PERMISSION + * API_EC_DATA_QUOTA_EXCEEDED + * API_EC_DATA_UNKNOWN_ERROR + */ + public function &data_getAssociationDefinitions() { + return $this->call_method('facebook.data.getAssociationDefinitions', + array()); + } + + /** + * Create or modify an association between two objects. + * + * @param name name of association + * @param obj_id1 id of first object + * @param obj_id2 id of second object + * @param data (optional) extra string data to store + * @param assoc_time (optional) extra time data; default to creation time + * @error + * API_EC_DATA_DATABASE_ERROR + * API_EC_PARAM + * API_EC_PERMISSION + * API_EC_DATA_INVALID_OPERATION + * API_EC_DATA_QUOTA_EXCEEDED + * API_EC_DATA_UNKNOWN_ERROR + */ + public function &data_setAssociation($name, $obj_id1, $obj_id2, $data = null, + $assoc_time = null) { + return $this->call_method('facebook.data.setAssociation', + array('name' => $name, + 'obj_id1' => $obj_id1, + 'obj_id2' => $obj_id2, + 'data' => $data, + 'assoc_time' => $assoc_time)); + } + + /** + * Create or modify associations between objects. + * + * @param assocs associations to set + * @param name (optional) name of association + * @error + * API_EC_DATA_DATABASE_ERROR + * API_EC_PARAM + * API_EC_PERMISSION + * API_EC_DATA_INVALID_OPERATION + * API_EC_DATA_QUOTA_EXCEEDED + * API_EC_DATA_UNKNOWN_ERROR + */ + public function &data_setAssociations($assocs, $name = null) { + return $this->call_method('facebook.data.setAssociations', + array('assocs' => json_encode($assocs), + 'name' => $name)); + } + + /** + * Remove an association between two objects. + * + * @param name name of association + * @param obj_id1 id of first object + * @param obj_id2 id of second object + * @error + * API_EC_DATA_DATABASE_ERROR + * API_EC_DATA_OBJECT_NOT_FOUND + * API_EC_PARAM + * API_EC_PERMISSION + * API_EC_DATA_QUOTA_EXCEEDED + * API_EC_DATA_UNKNOWN_ERROR + */ + public function &data_removeAssociation($name, $obj_id1, $obj_id2) { + return $this->call_method('facebook.data.removeAssociation', + array('name' => $name, + 'obj_id1' => $obj_id1, + 'obj_id2' => $obj_id2)); + } + + /** + * Remove associations between objects by specifying pairs of object ids. + * + * @param assocs associations to remove + * @param name (optional) name of association + * @error + * API_EC_DATA_DATABASE_ERROR + * API_EC_DATA_OBJECT_NOT_FOUND + * API_EC_PARAM + * API_EC_PERMISSION + * API_EC_DATA_QUOTA_EXCEEDED + * API_EC_DATA_UNKNOWN_ERROR + */ + public function &data_removeAssociations($assocs, $name = null) { + return $this->call_method('facebook.data.removeAssociations', + array('assocs' => json_encode($assocs), + 'name' => $name)); + } + + /** + * Remove associations between objects by specifying one object id. + * + * @param name name of association + * @param obj_id who's association to remove + * @error + * API_EC_DATA_DATABASE_ERROR + * API_EC_DATA_OBJECT_NOT_FOUND + * API_EC_PARAM + * API_EC_PERMISSION + * API_EC_DATA_INVALID_OPERATION + * API_EC_DATA_QUOTA_EXCEEDED + * API_EC_DATA_UNKNOWN_ERROR + */ + public function &data_removeAssociatedObjects($name, $obj_id) { + return $this->call_method('facebook.data.removeAssociatedObjects', + array('name' => $name, + 'obj_id' => $obj_id)); + } + + /** + * Retrieve a list of associated objects. + * + * @param name name of association + * @param obj_id who's association to retrieve + * @param no_data only return object ids + * @return associated objects + * @error + * API_EC_DATA_DATABASE_ERROR + * API_EC_DATA_OBJECT_NOT_FOUND + * API_EC_PARAM + * API_EC_PERMISSION + * API_EC_DATA_INVALID_OPERATION + * API_EC_DATA_QUOTA_EXCEEDED + * API_EC_DATA_UNKNOWN_ERROR + */ + public function &data_getAssociatedObjects($name, $obj_id, $no_data = true) { + return $this->call_method('facebook.data.getAssociatedObjects', + array('name' => $name, + 'obj_id' => $obj_id, + 'no_data' => $no_data)); + } + + /** + * Count associated objects. + * + * @param name name of association + * @param obj_id who's association to retrieve + * @return associated object's count + * @error + * API_EC_DATA_DATABASE_ERROR + * API_EC_DATA_OBJECT_NOT_FOUND + * API_EC_PARAM + * API_EC_PERMISSION + * API_EC_DATA_INVALID_OPERATION + * API_EC_DATA_QUOTA_EXCEEDED + * API_EC_DATA_UNKNOWN_ERROR + */ + public function &data_getAssociatedObjectCount($name, $obj_id) { + return $this->call_method('facebook.data.getAssociatedObjectCount', + array('name' => $name, + 'obj_id' => $obj_id)); + } + + /** + * Get a list of associated object counts. + * + * @param name name of association + * @param obj_ids whose association to retrieve + * @return associated object counts + * @error + * API_EC_DATA_DATABASE_ERROR + * API_EC_DATA_OBJECT_NOT_FOUND + * API_EC_PARAM + * API_EC_PERMISSION + * API_EC_DATA_INVALID_OPERATION + * API_EC_DATA_QUOTA_EXCEEDED + * API_EC_DATA_UNKNOWN_ERROR + */ + public function &data_getAssociatedObjectCounts($name, $obj_ids) { + return $this->call_method('facebook.data.getAssociatedObjectCounts', + array('name' => $name, + 'obj_ids' => json_encode($obj_ids))); + } + + /** + * Find all associations between two objects. + * + * @param obj_id1 id of first object + * @param obj_id2 id of second object + * @param no_data only return association names without data + * @return all associations between objects + * @error + * API_EC_DATA_DATABASE_ERROR + * API_EC_PARAM + * API_EC_PERMISSION + * API_EC_DATA_QUOTA_EXCEEDED + * API_EC_DATA_UNKNOWN_ERROR + */ + public function &data_getAssociations($obj_id1, $obj_id2, $no_data = true) { + return $this->call_method('facebook.data.getAssociations', + array('obj_id1' => $obj_id1, + 'obj_id2' => $obj_id2, + 'no_data' => $no_data)); + } + + /** + * Get the properties that you have set for an app. + * + * @param properties List of properties names to fetch + * + * @return array A map from property name to value + */ + public function admin_getAppProperties($properties) { + return json_decode( + $this->call_method('facebook.admin.getAppProperties', + array('properties' => json_encode($properties))), true); + } + + /** + * Set properties for an app. + * + * @param properties A map from property names to values + * + * @return bool true on success + */ + public function admin_setAppProperties($properties) { + return $this->call_method('facebook.admin.setAppProperties', + array('properties' => json_encode($properties))); + } + + /** + * Returns the allocation limit value for a specified integration point name + * Integration point names are defined in lib/api/karma/constants.php in the + * limit_map. + * + * @param string $integration_point_name Name of an integration point + * (see developer wiki for list). + * + * @return int Integration point allocation value + */ + public function &admin_getAllocation($integration_point_name) { + return $this->call_method('facebook.admin.getAllocation', + array('integration_point_name' => $integration_point_name)); + } + + /** + * Returns values for the specified metrics for the current application, in + * the given time range. The metrics are collected for fixed-length periods, + * and the times represent midnight at the end of each period. + * + * @param start_time unix time for the start of the range + * @param end_time unix time for the end of the range + * @param period number of seconds in the desired period + * @param metrics list of metrics to look up + * + * @return array A map of the names and values for those metrics + */ + public function &admin_getMetrics($start_time, $end_time, $period, $metrics) { + return $this->call_method('admin.getMetrics', + array('start_time' => $start_time, + 'end_time' => $end_time, + 'period' => $period, + 'metrics' => json_encode($metrics))); + } + + /** + * Sets application restriction info. + * + * Applications can restrict themselves to only a limited user demographic + * based on users' age and/or location or based on static predefined types + * specified by facebook for specifying diff age restriction for diff + * locations. + * + * @param array $restriction_info The age restriction settings to set. + * + * @return bool true on success + */ + public function admin_setRestrictionInfo($restriction_info = null) { + $restriction_str = null; + if (!empty($restriction_info)) { + $restriction_str = json_encode($restriction_info); + } + return $this->call_method('admin.setRestrictionInfo', + array('restriction_str' => $restriction_str)); + } + + /** + * Gets application restriction info. + * + * Applications can restrict themselves to only a limited user demographic + * based on users' age and/or location or based on static predefined types + * specified by facebook for specifying diff age restriction for diff + * locations. + * + * @return array The age restriction settings for this application. + */ + public function admin_getRestrictionInfo() { + return json_decode( + $this->call_method('admin.getRestrictionInfo', array()), + true); + } + + /* UTILITY FUNCTIONS */ + + /** + * Calls the specified method with the specified parameters. + * + * @param string $method Name of the Facebook method to invoke + * @param array $params A map of param names => param values + * + * @return mixed Result of method call + */ + public function & call_method($method, $params) { + //Check if we are in batch mode + if($this->batch_queue === null) { + if ($this->call_as_apikey) { + $params['call_as_apikey'] = $this->call_as_apikey; + } + $xml = $this->post_request($method, $params); + $result = $this->convert_xml_to_result($xml, $method, $params); + + if (is_array($result) && isset($result['error_code'])) { + throw new FacebookRestClientException($result['error_msg'], + $result['error_code']); + } + } + else { + $result = null; + $batch_item = array('m' => $method, 'p' => $params, 'r' => & $result); + $this->batch_queue[] = $batch_item; + } + + return $result; + } + + private function convert_xml_to_result($xml, $method, $params) { + $sxml = simplexml_load_string($xml); + $result = self::convert_simplexml_to_array($sxml); + + + if (!empty($GLOBALS['facebook_config']['debug'])) { + // output the raw xml and its corresponding php object, for debugging: + print '
      '; + $this->cur_id++; + print $this->cur_id . ': Called ' . $method . ', show ' . + 'Params | '. + 'XML | '. + 'SXML | '. + 'PHP'; + print ''; + print ''; + print ''; + print ''; + print '
      '; + } + return $result; + } + + private function create_post_string($method, $params) { + $params['method'] = $method; + $params['session_key'] = $this->session_key; + $params['api_key'] = $this->api_key; + $params['call_id'] = microtime(true); + if ($params['call_id'] <= $this->last_call_id) { + $params['call_id'] = $this->last_call_id + 0.001; + } + $this->last_call_id = $params['call_id']; + if (!isset($params['v'])) { + $params['v'] = '1.0'; + } + $post_params = array(); + foreach ($params as $key => &$val) { + if (is_array($val)) $val = implode(',', $val); + $post_params[] = $key.'='.urlencode($val); + } + $secret = $this->secret; + $post_params[] = 'sig='.Facebook::generate_sig($params, $secret); + return implode('&', $post_params); + } + + public function post_request($method, $params) { + + $post_string = $this->create_post_string($method, $params); + + if (function_exists('curl_init')) { + // Use CURL if installed... + $useragent = 'Facebook API PHP5 Client 1.1 (curl) ' . phpversion(); + $ch = curl_init(); + curl_setopt($ch, CURLOPT_URL, $this->server_addr); + curl_setopt($ch, CURLOPT_POSTFIELDS, $post_string); + curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); + curl_setopt($ch, CURLOPT_USERAGENT, $useragent); + $result = curl_exec($ch); + curl_close($ch); + } else { + // Non-CURL based version... + $content_type = 'application/x-www-form-urlencoded'; + $user_agent = 'Facebook API PHP5 Client 1.1 (non-curl) '.phpversion(); + $context = + array('http' => + array('method' => 'POST', + 'header' => 'Content-type: '.$content_type."\r\n". + 'User-Agent: '.$user_agent."\r\n". + 'Content-length: ' . strlen($post_string), + 'content' => $post_string)); + $contextid=stream_context_create($context); + $sock=fopen($this->server_addr, 'r', false, $contextid); + if ($sock) { + $result=''; + while (!feof($sock)) + $result.=fgets($sock, 4096); + + fclose($sock); + } + } + return $result; + } + + public static function convert_simplexml_to_array($sxml) { + $arr = array(); + if ($sxml) { + foreach ($sxml as $k => $v) { + if ($sxml['list']) { + $arr[] = self::convert_simplexml_to_array($v); + } else { + $arr[$k] = self::convert_simplexml_to_array($v); + } + } + } + if (sizeof($arr) > 0) { + return $arr; + } else { + return (string)$sxml; + } + } + + private function get_uid($uid) { + return $uid ? $uid : $this->user; + } +} + + +class FacebookRestClientException extends Exception { +} + +// Supporting methods and values------ + +/** + * Error codes and descriptions for the Facebook API. + */ + +class FacebookAPIErrorCodes { + + const API_EC_SUCCESS = 0; + + /* + * GENERAL ERRORS + */ + const API_EC_UNKNOWN = 1; + const API_EC_SERVICE = 2; + const API_EC_METHOD = 3; + const API_EC_TOO_MANY_CALLS = 4; + const API_EC_BAD_IP = 5; + + /* + * PARAMETER ERRORS + */ + const API_EC_PARAM = 100; + const API_EC_PARAM_API_KEY = 101; + const API_EC_PARAM_SESSION_KEY = 102; + const API_EC_PARAM_CALL_ID = 103; + const API_EC_PARAM_SIGNATURE = 104; + const API_EC_PARAM_USER_ID = 110; + const API_EC_PARAM_USER_FIELD = 111; + const API_EC_PARAM_SOCIAL_FIELD = 112; + const API_EC_PARAM_ALBUM_ID = 120; + const API_EC_PARAM_BAD_EID = 150; + const API_EC_PARAM_UNKNOWN_CITY = 151; + + /* + * USER PERMISSIONS ERRORS + */ + const API_EC_PERMISSION = 200; + const API_EC_PERMISSION_USER = 210; + const API_EC_PERMISSION_ALBUM = 220; + const API_EC_PERMISSION_PHOTO = 221; + const API_EC_PERMISSION_EVENT = 290; + const API_EC_PERMISSION_RSVP_EVENT = 299; + + const FQL_EC_PARSER = 601; + const FQL_EC_UNKNOWN_FIELD = 602; + const FQL_EC_UNKNOWN_TABLE = 603; + const FQL_EC_NOT_INDEXABLE = 604; + + /** + * DATA STORE API ERRORS + */ + const API_EC_DATA_UNKNOWN_ERROR = 800; + const API_EC_DATA_INVALID_OPERATION = 801; + const API_EC_DATA_QUOTA_EXCEEDED = 802; + const API_EC_DATA_OBJECT_NOT_FOUND = 803; + const API_EC_DATA_OBJECT_ALREADY_EXISTS = 804; + const API_EC_DATA_DATABASE_ERROR = 805; + + /* + * Batch ERROR + */ + const API_EC_BATCH_ALREADY_STARTED = 900; + const API_EC_BATCH_NOT_STARTED = 901; + const API_EC_BATCH_METHOD_NOT_ALLOWED_IN_BATCH_MODE = 902; + + public static $api_error_descriptions = array( + API_EC_SUCCESS => 'Success', + API_EC_UNKNOWN => 'An unknown error occurred', + API_EC_SERVICE => 'Service temporarily unavailable', + API_EC_METHOD => 'Unknown method', + API_EC_TOO_MANY_CALLS => 'Application request limit reached', + API_EC_BAD_IP => 'Unauthorized source IP address', + API_EC_PARAM => 'Invalid parameter', + API_EC_PARAM_API_KEY => 'Invalid API key', + API_EC_PARAM_SESSION_KEY => 'Session key invalid or no longer valid', + API_EC_PARAM_CALL_ID => 'Call_id must be greater than previous', + API_EC_PARAM_SIGNATURE => 'Incorrect signature', + API_EC_PARAM_USER_ID => 'Invalid user id', + API_EC_PARAM_USER_FIELD => 'Invalid user info field', + API_EC_PARAM_SOCIAL_FIELD => 'Invalid user field', + API_EC_PARAM_ALBUM_ID => 'Invalid album id', + API_EC_PARAM_BAD_EID => 'Invalid eid', + API_EC_PARAM_UNKNOWN_CITY => 'Unknown city', + API_EC_PERMISSION => 'Permissions error', + API_EC_PERMISSION_USER => 'User not visible', + API_EC_PERMISSION_ALBUM => 'Album not visible', + API_EC_PERMISSION_PHOTO => 'Photo not visible', + API_EC_PERMISSION_EVENT => 'Creating and modifying events required the extended permission create_event', + API_EC_PERMISSION_RSVP_EVENT => 'RSVPing to events required the extended permission rsvp_event', + FQL_EC_PARSER => 'FQL: Parser Error', + FQL_EC_UNKNOWN_FIELD => 'FQL: Unknown Field', + FQL_EC_UNKNOWN_TABLE => 'FQL: Unknown Table', + FQL_EC_NOT_INDEXABLE => 'FQL: Statement not indexable', + FQL_EC_UNKNOWN_FUNCTION => 'FQL: Attempted to call unknown function', + FQL_EC_INVALID_PARAM => 'FQL: Invalid parameter passed in', + API_EC_DATA_UNKNOWN_ERROR => 'Unknown data store API error', + API_EC_DATA_INVALID_OPERATION => 'Invalid operation', + API_EC_DATA_QUOTA_EXCEEDED => 'Data store allowable quota was exceeded', + API_EC_DATA_OBJECT_NOT_FOUND => 'Specified object cannot be found', + API_EC_DATA_OBJECT_ALREADY_EXISTS => 'Specified object already exists', + API_EC_DATA_DATABASE_ERROR => 'A database error occurred. Please try again', + API_EC_BATCH_ALREADY_STARTED => 'begin_batch already called, please make sure to call end_batch first', + API_EC_BATCH_NOT_STARTED => 'end_batch called before start_batch', + API_EC_BATCH_METHOD_NOT_ALLOWED_IN_BATCH_MODE => 'This method is not allowed in batch mode', + ); +} diff --git a/_darcs/pristine/extlib/facebook/jsonwrapper/JSON/JSON.php b/_darcs/pristine/extlib/facebook/jsonwrapper/JSON/JSON.php new file mode 100644 index 0000000000..0cddbddb41 --- /dev/null +++ b/_darcs/pristine/extlib/facebook/jsonwrapper/JSON/JSON.php @@ -0,0 +1,806 @@ + + * @author Matt Knapp + * @author Brett Stimmerman + * @copyright 2005 Michal Migurski + * @version CVS: $Id: JSON.php,v 1.31 2006/06/28 05:54:17 migurski Exp $ + * @license http://www.opensource.org/licenses/bsd-license.php + * @link http://pear.php.net/pepr/pepr-proposal-show.php?id=198 + */ + +/** + * Marker constant for Services_JSON::decode(), used to flag stack state + */ +define('SERVICES_JSON_SLICE', 1); + +/** + * Marker constant for Services_JSON::decode(), used to flag stack state + */ +define('SERVICES_JSON_IN_STR', 2); + +/** + * Marker constant for Services_JSON::decode(), used to flag stack state + */ +define('SERVICES_JSON_IN_ARR', 3); + +/** + * Marker constant for Services_JSON::decode(), used to flag stack state + */ +define('SERVICES_JSON_IN_OBJ', 4); + +/** + * Marker constant for Services_JSON::decode(), used to flag stack state + */ +define('SERVICES_JSON_IN_CMT', 5); + +/** + * Behavior switch for Services_JSON::decode() + */ +define('SERVICES_JSON_LOOSE_TYPE', 16); + +/** + * Behavior switch for Services_JSON::decode() + */ +define('SERVICES_JSON_SUPPRESS_ERRORS', 32); + +/** + * Converts to and from JSON format. + * + * Brief example of use: + * + * + * // create a new instance of Services_JSON + * $json = new Services_JSON(); + * + * // convert a complexe value to JSON notation, and send it to the browser + * $value = array('foo', 'bar', array(1, 2, 'baz'), array(3, array(4))); + * $output = $json->encode($value); + * + * print($output); + * // prints: ["foo","bar",[1,2,"baz"],[3,[4]]] + * + * // accept incoming POST data, assumed to be in JSON notation + * $input = file_get_contents('php://input', 1000000); + * $value = $json->decode($input); + * + */ +class Services_JSON +{ + /** + * constructs a new JSON instance + * + * @param int $use object behavior flags; combine with boolean-OR + * + * possible values: + * - SERVICES_JSON_LOOSE_TYPE: loose typing. + * "{...}" syntax creates associative arrays + * instead of objects in decode(). + * - SERVICES_JSON_SUPPRESS_ERRORS: error suppression. + * Values which can't be encoded (e.g. resources) + * appear as NULL instead of throwing errors. + * By default, a deeply-nested resource will + * bubble up with an error, so all return values + * from encode() should be checked with isError() + */ + function Services_JSON($use = 0) + { + $this->use = $use; + } + + /** + * convert a string from one UTF-16 char to one UTF-8 char + * + * Normally should be handled by mb_convert_encoding, but + * provides a slower PHP-only method for installations + * that lack the multibye string extension. + * + * @param string $utf16 UTF-16 character + * @return string UTF-8 character + * @access private + */ + function utf162utf8($utf16) + { + // oh please oh please oh please oh please oh please + if(function_exists('mb_convert_encoding')) { + return mb_convert_encoding($utf16, 'UTF-8', 'UTF-16'); + } + + $bytes = (ord($utf16{0}) << 8) | ord($utf16{1}); + + switch(true) { + case ((0x7F & $bytes) == $bytes): + // this case should never be reached, because we are in ASCII range + // see: http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8 + return chr(0x7F & $bytes); + + case (0x07FF & $bytes) == $bytes: + // return a 2-byte UTF-8 character + // see: http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8 + return chr(0xC0 | (($bytes >> 6) & 0x1F)) + . chr(0x80 | ($bytes & 0x3F)); + + case (0xFFFF & $bytes) == $bytes: + // return a 3-byte UTF-8 character + // see: http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8 + return chr(0xE0 | (($bytes >> 12) & 0x0F)) + . chr(0x80 | (($bytes >> 6) & 0x3F)) + . chr(0x80 | ($bytes & 0x3F)); + } + + // ignoring UTF-32 for now, sorry + return ''; + } + + /** + * convert a string from one UTF-8 char to one UTF-16 char + * + * Normally should be handled by mb_convert_encoding, but + * provides a slower PHP-only method for installations + * that lack the multibye string extension. + * + * @param string $utf8 UTF-8 character + * @return string UTF-16 character + * @access private + */ + function utf82utf16($utf8) + { + // oh please oh please oh please oh please oh please + if(function_exists('mb_convert_encoding')) { + return mb_convert_encoding($utf8, 'UTF-16', 'UTF-8'); + } + + switch(strlen($utf8)) { + case 1: + // this case should never be reached, because we are in ASCII range + // see: http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8 + return $utf8; + + case 2: + // return a UTF-16 character from a 2-byte UTF-8 char + // see: http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8 + return chr(0x07 & (ord($utf8{0}) >> 2)) + . chr((0xC0 & (ord($utf8{0}) << 6)) + | (0x3F & ord($utf8{1}))); + + case 3: + // return a UTF-16 character from a 3-byte UTF-8 char + // see: http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8 + return chr((0xF0 & (ord($utf8{0}) << 4)) + | (0x0F & (ord($utf8{1}) >> 2))) + . chr((0xC0 & (ord($utf8{1}) << 6)) + | (0x7F & ord($utf8{2}))); + } + + // ignoring UTF-32 for now, sorry + return ''; + } + + /** + * encodes an arbitrary variable into JSON format + * + * @param mixed $var any number, boolean, string, array, or object to be encoded. + * see argument 1 to Services_JSON() above for array-parsing behavior. + * if var is a strng, note that encode() always expects it + * to be in ASCII or UTF-8 format! + * + * @return mixed JSON string representation of input var or an error if a problem occurs + * @access public + */ + function encode($var) + { + switch (gettype($var)) { + case 'boolean': + return $var ? 'true' : 'false'; + + case 'NULL': + return 'null'; + + case 'integer': + return (int) $var; + + case 'double': + case 'float': + return (float) $var; + + case 'string': + // STRINGS ARE EXPECTED TO BE IN ASCII OR UTF-8 FORMAT + $ascii = ''; + $strlen_var = strlen($var); + + /* + * Iterate over every character in the string, + * escaping with a slash or encoding to UTF-8 where necessary + */ + for ($c = 0; $c < $strlen_var; ++$c) { + + $ord_var_c = ord($var{$c}); + + switch (true) { + case $ord_var_c == 0x08: + $ascii .= '\b'; + break; + case $ord_var_c == 0x09: + $ascii .= '\t'; + break; + case $ord_var_c == 0x0A: + $ascii .= '\n'; + break; + case $ord_var_c == 0x0C: + $ascii .= '\f'; + break; + case $ord_var_c == 0x0D: + $ascii .= '\r'; + break; + + case $ord_var_c == 0x22: + case $ord_var_c == 0x2F: + case $ord_var_c == 0x5C: + // double quote, slash, slosh + $ascii .= '\\'.$var{$c}; + break; + + case (($ord_var_c >= 0x20) && ($ord_var_c <= 0x7F)): + // characters U-00000000 - U-0000007F (same as ASCII) + $ascii .= $var{$c}; + break; + + case (($ord_var_c & 0xE0) == 0xC0): + // characters U-00000080 - U-000007FF, mask 110XXXXX + // see http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8 + $char = pack('C*', $ord_var_c, ord($var{$c + 1})); + $c += 1; + $utf16 = $this->utf82utf16($char); + $ascii .= sprintf('\u%04s', bin2hex($utf16)); + break; + + case (($ord_var_c & 0xF0) == 0xE0): + // characters U-00000800 - U-0000FFFF, mask 1110XXXX + // see http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8 + $char = pack('C*', $ord_var_c, + ord($var{$c + 1}), + ord($var{$c + 2})); + $c += 2; + $utf16 = $this->utf82utf16($char); + $ascii .= sprintf('\u%04s', bin2hex($utf16)); + break; + + case (($ord_var_c & 0xF8) == 0xF0): + // characters U-00010000 - U-001FFFFF, mask 11110XXX + // see http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8 + $char = pack('C*', $ord_var_c, + ord($var{$c + 1}), + ord($var{$c + 2}), + ord($var{$c + 3})); + $c += 3; + $utf16 = $this->utf82utf16($char); + $ascii .= sprintf('\u%04s', bin2hex($utf16)); + break; + + case (($ord_var_c & 0xFC) == 0xF8): + // characters U-00200000 - U-03FFFFFF, mask 111110XX + // see http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8 + $char = pack('C*', $ord_var_c, + ord($var{$c + 1}), + ord($var{$c + 2}), + ord($var{$c + 3}), + ord($var{$c + 4})); + $c += 4; + $utf16 = $this->utf82utf16($char); + $ascii .= sprintf('\u%04s', bin2hex($utf16)); + break; + + case (($ord_var_c & 0xFE) == 0xFC): + // characters U-04000000 - U-7FFFFFFF, mask 1111110X + // see http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8 + $char = pack('C*', $ord_var_c, + ord($var{$c + 1}), + ord($var{$c + 2}), + ord($var{$c + 3}), + ord($var{$c + 4}), + ord($var{$c + 5})); + $c += 5; + $utf16 = $this->utf82utf16($char); + $ascii .= sprintf('\u%04s', bin2hex($utf16)); + break; + } + } + + return '"'.$ascii.'"'; + + case 'array': + /* + * As per JSON spec if any array key is not an integer + * we must treat the the whole array as an object. We + * also try to catch a sparsely populated associative + * array with numeric keys here because some JS engines + * will create an array with empty indexes up to + * max_index which can cause memory issues and because + * the keys, which may be relevant, will be remapped + * otherwise. + * + * As per the ECMA and JSON specification an object may + * have any string as a property. Unfortunately due to + * a hole in the ECMA specification if the key is a + * ECMA reserved word or starts with a digit the + * parameter is only accessible using ECMAScript's + * bracket notation. + */ + + // treat as a JSON object + if (is_array($var) && count($var) && (array_keys($var) !== range(0, sizeof($var) - 1))) { + $properties = array_map(array($this, 'name_value'), + array_keys($var), + array_values($var)); + + foreach($properties as $property) { + if(Services_JSON::isError($property)) { + return $property; + } + } + + return '{' . join(',', $properties) . '}'; + } + + // treat it like a regular array + $elements = array_map(array($this, 'encode'), $var); + + foreach($elements as $element) { + if(Services_JSON::isError($element)) { + return $element; + } + } + + return '[' . join(',', $elements) . ']'; + + case 'object': + $vars = get_object_vars($var); + + $properties = array_map(array($this, 'name_value'), + array_keys($vars), + array_values($vars)); + + foreach($properties as $property) { + if(Services_JSON::isError($property)) { + return $property; + } + } + + return '{' . join(',', $properties) . '}'; + + default: + return ($this->use & SERVICES_JSON_SUPPRESS_ERRORS) + ? 'null' + : new Services_JSON_Error(gettype($var)." can not be encoded as JSON string"); + } + } + + /** + * array-walking function for use in generating JSON-formatted name-value pairs + * + * @param string $name name of key to use + * @param mixed $value reference to an array element to be encoded + * + * @return string JSON-formatted name-value pair, like '"name":value' + * @access private + */ + function name_value($name, $value) + { + $encoded_value = $this->encode($value); + + if(Services_JSON::isError($encoded_value)) { + return $encoded_value; + } + + return $this->encode(strval($name)) . ':' . $encoded_value; + } + + /** + * reduce a string by removing leading and trailing comments and whitespace + * + * @param $str string string value to strip of comments and whitespace + * + * @return string string value stripped of comments and whitespace + * @access private + */ + function reduce_string($str) + { + $str = preg_replace(array( + + // eliminate single line comments in '// ...' form + '#^\s*//(.+)$#m', + + // eliminate multi-line comments in '/* ... */' form, at start of string + '#^\s*/\*(.+)\*/#Us', + + // eliminate multi-line comments in '/* ... */' form, at end of string + '#/\*(.+)\*/\s*$#Us' + + ), '', $str); + + // eliminate extraneous space + return trim($str); + } + + /** + * decodes a JSON string into appropriate variable + * + * @param string $str JSON-formatted string + * + * @return mixed number, boolean, string, array, or object + * corresponding to given JSON input string. + * See argument 1 to Services_JSON() above for object-output behavior. + * Note that decode() always returns strings + * in ASCII or UTF-8 format! + * @access public + */ + function decode($str) + { + $str = $this->reduce_string($str); + + switch (strtolower($str)) { + case 'true': + return true; + + case 'false': + return false; + + case 'null': + return null; + + default: + $m = array(); + + if (is_numeric($str)) { + // Lookie-loo, it's a number + + // This would work on its own, but I'm trying to be + // good about returning integers where appropriate: + // return (float)$str; + + // Return float or int, as appropriate + return ((float)$str == (integer)$str) + ? (integer)$str + : (float)$str; + + } elseif (preg_match('/^("|\').*(\1)$/s', $str, $m) && $m[1] == $m[2]) { + // STRINGS RETURNED IN UTF-8 FORMAT + $delim = substr($str, 0, 1); + $chrs = substr($str, 1, -1); + $utf8 = ''; + $strlen_chrs = strlen($chrs); + + for ($c = 0; $c < $strlen_chrs; ++$c) { + + $substr_chrs_c_2 = substr($chrs, $c, 2); + $ord_chrs_c = ord($chrs{$c}); + + switch (true) { + case $substr_chrs_c_2 == '\b': + $utf8 .= chr(0x08); + ++$c; + break; + case $substr_chrs_c_2 == '\t': + $utf8 .= chr(0x09); + ++$c; + break; + case $substr_chrs_c_2 == '\n': + $utf8 .= chr(0x0A); + ++$c; + break; + case $substr_chrs_c_2 == '\f': + $utf8 .= chr(0x0C); + ++$c; + break; + case $substr_chrs_c_2 == '\r': + $utf8 .= chr(0x0D); + ++$c; + break; + + case $substr_chrs_c_2 == '\\"': + case $substr_chrs_c_2 == '\\\'': + case $substr_chrs_c_2 == '\\\\': + case $substr_chrs_c_2 == '\\/': + if (($delim == '"' && $substr_chrs_c_2 != '\\\'') || + ($delim == "'" && $substr_chrs_c_2 != '\\"')) { + $utf8 .= $chrs{++$c}; + } + break; + + case preg_match('/\\\u[0-9A-F]{4}/i', substr($chrs, $c, 6)): + // single, escaped unicode character + $utf16 = chr(hexdec(substr($chrs, ($c + 2), 2))) + . chr(hexdec(substr($chrs, ($c + 4), 2))); + $utf8 .= $this->utf162utf8($utf16); + $c += 5; + break; + + case ($ord_chrs_c >= 0x20) && ($ord_chrs_c <= 0x7F): + $utf8 .= $chrs{$c}; + break; + + case ($ord_chrs_c & 0xE0) == 0xC0: + // characters U-00000080 - U-000007FF, mask 110XXXXX + //see http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8 + $utf8 .= substr($chrs, $c, 2); + ++$c; + break; + + case ($ord_chrs_c & 0xF0) == 0xE0: + // characters U-00000800 - U-0000FFFF, mask 1110XXXX + // see http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8 + $utf8 .= substr($chrs, $c, 3); + $c += 2; + break; + + case ($ord_chrs_c & 0xF8) == 0xF0: + // characters U-00010000 - U-001FFFFF, mask 11110XXX + // see http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8 + $utf8 .= substr($chrs, $c, 4); + $c += 3; + break; + + case ($ord_chrs_c & 0xFC) == 0xF8: + // characters U-00200000 - U-03FFFFFF, mask 111110XX + // see http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8 + $utf8 .= substr($chrs, $c, 5); + $c += 4; + break; + + case ($ord_chrs_c & 0xFE) == 0xFC: + // characters U-04000000 - U-7FFFFFFF, mask 1111110X + // see http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8 + $utf8 .= substr($chrs, $c, 6); + $c += 5; + break; + + } + + } + + return $utf8; + + } elseif (preg_match('/^\[.*\]$/s', $str) || preg_match('/^\{.*\}$/s', $str)) { + // array, or object notation + + if ($str{0} == '[') { + $stk = array(SERVICES_JSON_IN_ARR); + $arr = array(); + } else { + if ($this->use & SERVICES_JSON_LOOSE_TYPE) { + $stk = array(SERVICES_JSON_IN_OBJ); + $obj = array(); + } else { + $stk = array(SERVICES_JSON_IN_OBJ); + $obj = new stdClass(); + } + } + + array_push($stk, array('what' => SERVICES_JSON_SLICE, + 'where' => 0, + 'delim' => false)); + + $chrs = substr($str, 1, -1); + $chrs = $this->reduce_string($chrs); + + if ($chrs == '') { + if (reset($stk) == SERVICES_JSON_IN_ARR) { + return $arr; + + } else { + return $obj; + + } + } + + //print("\nparsing {$chrs}\n"); + + $strlen_chrs = strlen($chrs); + + for ($c = 0; $c <= $strlen_chrs; ++$c) { + + $top = end($stk); + $substr_chrs_c_2 = substr($chrs, $c, 2); + + if (($c == $strlen_chrs) || (($chrs{$c} == ',') && ($top['what'] == SERVICES_JSON_SLICE))) { + // found a comma that is not inside a string, array, etc., + // OR we've reached the end of the character list + $slice = substr($chrs, $top['where'], ($c - $top['where'])); + array_push($stk, array('what' => SERVICES_JSON_SLICE, 'where' => ($c + 1), 'delim' => false)); + //print("Found split at {$c}: ".substr($chrs, $top['where'], (1 + $c - $top['where']))."\n"); + + if (reset($stk) == SERVICES_JSON_IN_ARR) { + // we are in an array, so just push an element onto the stack + array_push($arr, $this->decode($slice)); + + } elseif (reset($stk) == SERVICES_JSON_IN_OBJ) { + // we are in an object, so figure + // out the property name and set an + // element in an associative array, + // for now + $parts = array(); + + if (preg_match('/^\s*(["\'].*[^\\\]["\'])\s*:\s*(\S.*),?$/Uis', $slice, $parts)) { + // "name":value pair + $key = $this->decode($parts[1]); + $val = $this->decode($parts[2]); + + if ($this->use & SERVICES_JSON_LOOSE_TYPE) { + $obj[$key] = $val; + } else { + $obj->$key = $val; + } + } elseif (preg_match('/^\s*(\w+)\s*:\s*(\S.*),?$/Uis', $slice, $parts)) { + // name:value pair, where name is unquoted + $key = $parts[1]; + $val = $this->decode($parts[2]); + + if ($this->use & SERVICES_JSON_LOOSE_TYPE) { + $obj[$key] = $val; + } else { + $obj->$key = $val; + } + } + + } + + } elseif ((($chrs{$c} == '"') || ($chrs{$c} == "'")) && ($top['what'] != SERVICES_JSON_IN_STR)) { + // found a quote, and we are not inside a string + array_push($stk, array('what' => SERVICES_JSON_IN_STR, 'where' => $c, 'delim' => $chrs{$c})); + //print("Found start of string at {$c}\n"); + + } elseif (($chrs{$c} == $top['delim']) && + ($top['what'] == SERVICES_JSON_IN_STR) && + ((strlen(substr($chrs, 0, $c)) - strlen(rtrim(substr($chrs, 0, $c), '\\'))) % 2 != 1)) { + // found a quote, we're in a string, and it's not escaped + // we know that it's not escaped becase there is _not_ an + // odd number of backslashes at the end of the string so far + array_pop($stk); + //print("Found end of string at {$c}: ".substr($chrs, $top['where'], (1 + 1 + $c - $top['where']))."\n"); + + } elseif (($chrs{$c} == '[') && + in_array($top['what'], array(SERVICES_JSON_SLICE, SERVICES_JSON_IN_ARR, SERVICES_JSON_IN_OBJ))) { + // found a left-bracket, and we are in an array, object, or slice + array_push($stk, array('what' => SERVICES_JSON_IN_ARR, 'where' => $c, 'delim' => false)); + //print("Found start of array at {$c}\n"); + + } elseif (($chrs{$c} == ']') && ($top['what'] == SERVICES_JSON_IN_ARR)) { + // found a right-bracket, and we're in an array + array_pop($stk); + //print("Found end of array at {$c}: ".substr($chrs, $top['where'], (1 + $c - $top['where']))."\n"); + + } elseif (($chrs{$c} == '{') && + in_array($top['what'], array(SERVICES_JSON_SLICE, SERVICES_JSON_IN_ARR, SERVICES_JSON_IN_OBJ))) { + // found a left-brace, and we are in an array, object, or slice + array_push($stk, array('what' => SERVICES_JSON_IN_OBJ, 'where' => $c, 'delim' => false)); + //print("Found start of object at {$c}\n"); + + } elseif (($chrs{$c} == '}') && ($top['what'] == SERVICES_JSON_IN_OBJ)) { + // found a right-brace, and we're in an object + array_pop($stk); + //print("Found end of object at {$c}: ".substr($chrs, $top['where'], (1 + $c - $top['where']))."\n"); + + } elseif (($substr_chrs_c_2 == '/*') && + in_array($top['what'], array(SERVICES_JSON_SLICE, SERVICES_JSON_IN_ARR, SERVICES_JSON_IN_OBJ))) { + // found a comment start, and we are in an array, object, or slice + array_push($stk, array('what' => SERVICES_JSON_IN_CMT, 'where' => $c, 'delim' => false)); + $c++; + //print("Found start of comment at {$c}\n"); + + } elseif (($substr_chrs_c_2 == '*/') && ($top['what'] == SERVICES_JSON_IN_CMT)) { + // found a comment end, and we're in one now + array_pop($stk); + $c++; + + for ($i = $top['where']; $i <= $c; ++$i) + $chrs = substr_replace($chrs, ' ', $i, 1); + + //print("Found end of comment at {$c}: ".substr($chrs, $top['where'], (1 + $c - $top['where']))."\n"); + + } + + } + + if (reset($stk) == SERVICES_JSON_IN_ARR) { + return $arr; + + } elseif (reset($stk) == SERVICES_JSON_IN_OBJ) { + return $obj; + + } + + } + } + } + + /** + * @todo Ultimately, this should just call PEAR::isError() + */ + function isError($data, $code = null) + { + if (class_exists('pear')) { + return PEAR::isError($data, $code); + } elseif (is_object($data) && (get_class($data) == 'services_json_error' || + is_subclass_of($data, 'services_json_error'))) { + return true; + } + + return false; + } +} + +if (class_exists('PEAR_Error')) { + + class Services_JSON_Error extends PEAR_Error + { + function Services_JSON_Error($message = 'unknown error', $code = null, + $mode = null, $options = null, $userinfo = null) + { + parent::PEAR_Error($message, $code, $mode, $options, $userinfo); + } + } + +} else { + + /** + * @todo Ultimately, this class shall be descended from PEAR_Error + */ + class Services_JSON_Error + { + function Services_JSON_Error($message = 'unknown error', $code = null, + $mode = null, $options = null, $userinfo = null) + { + + } + } + +} + +?> diff --git a/_darcs/pristine/extlib/facebook/jsonwrapper/JSON/LICENSE b/_darcs/pristine/extlib/facebook/jsonwrapper/JSON/LICENSE new file mode 100644 index 0000000000..4ae6bef55d --- /dev/null +++ b/_darcs/pristine/extlib/facebook/jsonwrapper/JSON/LICENSE @@ -0,0 +1,21 @@ +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are +met: + +Redistributions of source code must retain the above copyright notice, +this list of conditions and the following disclaimer. + +Redistributions in binary form must reproduce the above copyright +notice, this list of conditions and the following disclaimer in the +documentation and/or other materials provided with the distribution. + +THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED +WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF +MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN +NO EVENT SHALL CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, +INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF +USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON +ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF +THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. diff --git a/_darcs/pristine/extlib/facebook/jsonwrapper/jsonwrapper.php b/_darcs/pristine/extlib/facebook/jsonwrapper/jsonwrapper.php new file mode 100644 index 0000000000..29509debad --- /dev/null +++ b/_darcs/pristine/extlib/facebook/jsonwrapper/jsonwrapper.php @@ -0,0 +1,6 @@ + diff --git a/_darcs/pristine/extlib/facebook/jsonwrapper/jsonwrapper_inner.php b/_darcs/pristine/extlib/facebook/jsonwrapper/jsonwrapper_inner.php new file mode 100644 index 0000000000..36a3f28635 --- /dev/null +++ b/_darcs/pristine/extlib/facebook/jsonwrapper/jsonwrapper_inner.php @@ -0,0 +1,23 @@ +encode($arg); +} + +function json_decode($arg) +{ + global $services_json; + if (!isset($services_json)) { + $services_json = new Services_JSON(); + } + return $services_json->decode($arg); +} + +?> diff --git a/_darcs/pristine/extlib/get_temp_dir.php b/_darcs/pristine/extlib/get_temp_dir.php new file mode 100644 index 0000000000..4ec96e5221 --- /dev/null +++ b/_darcs/pristine/extlib/get_temp_dir.php @@ -0,0 +1,14 @@ + diff --git a/_darcs/pristine/extlib/gpl-2.0.txt b/_darcs/pristine/extlib/gpl-2.0.txt new file mode 100644 index 0000000000..d511905c16 --- /dev/null +++ b/_darcs/pristine/extlib/gpl-2.0.txt @@ -0,0 +1,339 @@ + GNU GENERAL PUBLIC LICENSE + Version 2, June 1991 + + Copyright (C) 1989, 1991 Free Software Foundation, Inc., + 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + Preamble + + The licenses for most software are designed to take away your +freedom to share and change it. By contrast, the GNU General Public +License is intended to guarantee your freedom to share and change free +software--to make sure the software is free for all its users. This +General Public License applies to most of the Free Software +Foundation's software and to any other program whose authors commit to +using it. (Some other Free Software Foundation software is covered by +the GNU Lesser General Public License instead.) You can apply it to +your programs, too. + + When we speak of free software, we are referring to freedom, not +price. Our General Public Licenses are designed to make sure that you +have the freedom to distribute copies of free software (and charge for +this service if you wish), that you receive source code or can get it +if you want it, that you can change the software or use pieces of it +in new free programs; and that you know you can do these things. + + To protect your rights, we need to make restrictions that forbid +anyone to deny you these rights or to ask you to surrender the rights. +These restrictions translate to certain responsibilities for you if you +distribute copies of the software, or if you modify it. + + For example, if you distribute copies of such a program, whether +gratis or for a fee, you must give the recipients all the rights that +you have. You must make sure that they, too, receive or can get the +source code. And you must show them these terms so they know their +rights. + + We protect your rights with two steps: (1) copyright the software, and +(2) offer you this license which gives you legal permission to copy, +distribute and/or modify the software. + + Also, for each author's protection and ours, we want to make certain +that everyone understands that there is no warranty for this free +software. If the software is modified by someone else and passed on, we +want its recipients to know that what they have is not the original, so +that any problems introduced by others will not reflect on the original +authors' reputations. + + Finally, any free program is threatened constantly by software +patents. We wish to avoid the danger that redistributors of a free +program will individually obtain patent licenses, in effect making the +program proprietary. To prevent this, we have made it clear that any +patent must be licensed for everyone's free use or not licensed at all. + + The precise terms and conditions for copying, distribution and +modification follow. + + GNU GENERAL PUBLIC LICENSE + TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION + + 0. This License applies to any program or other work which contains +a notice placed by the copyright holder saying it may be distributed +under the terms of this General Public License. The "Program", below, +refers to any such program or work, and a "work based on the Program" +means either the Program or any derivative work under copyright law: +that is to say, a work containing the Program or a portion of it, +either verbatim or with modifications and/or translated into another +language. (Hereinafter, translation is included without limitation in +the term "modification".) Each licensee is addressed as "you". + +Activities other than copying, distribution and modification are not +covered by this License; they are outside its scope. The act of +running the Program is not restricted, and the output from the Program +is covered only if its contents constitute a work based on the +Program (independent of having been made by running the Program). +Whether that is true depends on what the Program does. + + 1. You may copy and distribute verbatim copies of the Program's +source code as you receive it, in any medium, provided that you +conspicuously and appropriately publish on each copy an appropriate +copyright notice and disclaimer of warranty; keep intact all the +notices that refer to this License and to the absence of any warranty; +and give any other recipients of the Program a copy of this License +along with the Program. + +You may charge a fee for the physical act of transferring a copy, and +you may at your option offer warranty protection in exchange for a fee. + + 2. You may modify your copy or copies of the Program or any portion +of it, thus forming a work based on the Program, and copy and +distribute such modifications or work under the terms of Section 1 +above, provided that you also meet all of these conditions: + + a) You must cause the modified files to carry prominent notices + stating that you changed the files and the date of any change. + + b) You must cause any work that you distribute or publish, that in + whole or in part contains or is derived from the Program or any + part thereof, to be licensed as a whole at no charge to all third + parties under the terms of this License. + + c) If the modified program normally reads commands interactively + when run, you must cause it, when started running for such + interactive use in the most ordinary way, to print or display an + announcement including an appropriate copyright notice and a + notice that there is no warranty (or else, saying that you provide + a warranty) and that users may redistribute the program under + these conditions, and telling the user how to view a copy of this + License. (Exception: if the Program itself is interactive but + does not normally print such an announcement, your work based on + the Program is not required to print an announcement.) + +These requirements apply to the modified work as a whole. If +identifiable sections of that work are not derived from the Program, +and can be reasonably considered independent and separate works in +themselves, then this License, and its terms, do not apply to those +sections when you distribute them as separate works. But when you +distribute the same sections as part of a whole which is a work based +on the Program, the distribution of the whole must be on the terms of +this License, whose permissions for other licensees extend to the +entire whole, and thus to each and every part regardless of who wrote it. + +Thus, it is not the intent of this section to claim rights or contest +your rights to work written entirely by you; rather, the intent is to +exercise the right to control the distribution of derivative or +collective works based on the Program. + +In addition, mere aggregation of another work not based on the Program +with the Program (or with a work based on the Program) on a volume of +a storage or distribution medium does not bring the other work under +the scope of this License. + + 3. You may copy and distribute the Program (or a work based on it, +under Section 2) in object code or executable form under the terms of +Sections 1 and 2 above provided that you also do one of the following: + + a) Accompany it with the complete corresponding machine-readable + source code, which must be distributed under the terms of Sections + 1 and 2 above on a medium customarily used for software interchange; or, + + b) Accompany it with a written offer, valid for at least three + years, to give any third party, for a charge no more than your + cost of physically performing source distribution, a complete + machine-readable copy of the corresponding source code, to be + distributed under the terms of Sections 1 and 2 above on a medium + customarily used for software interchange; or, + + c) Accompany it with the information you received as to the offer + to distribute corresponding source code. (This alternative is + allowed only for noncommercial distribution and only if you + received the program in object code or executable form with such + an offer, in accord with Subsection b above.) + +The source code for a work means the preferred form of the work for +making modifications to it. For an executable work, complete source +code means all the source code for all modules it contains, plus any +associated interface definition files, plus the scripts used to +control compilation and installation of the executable. However, as a +special exception, the source code distributed need not include +anything that is normally distributed (in either source or binary +form) with the major components (compiler, kernel, and so on) of the +operating system on which the executable runs, unless that component +itself accompanies the executable. + +If distribution of executable or object code is made by offering +access to copy from a designated place, then offering equivalent +access to copy the source code from the same place counts as +distribution of the source code, even though third parties are not +compelled to copy the source along with the object code. + + 4. You may not copy, modify, sublicense, or distribute the Program +except as expressly provided under this License. Any attempt +otherwise to copy, modify, sublicense or distribute the Program is +void, and will automatically terminate your rights under this License. +However, parties who have received copies, or rights, from you under +this License will not have their licenses terminated so long as such +parties remain in full compliance. + + 5. You are not required to accept this License, since you have not +signed it. However, nothing else grants you permission to modify or +distribute the Program or its derivative works. These actions are +prohibited by law if you do not accept this License. Therefore, by +modifying or distributing the Program (or any work based on the +Program), you indicate your acceptance of this License to do so, and +all its terms and conditions for copying, distributing or modifying +the Program or works based on it. + + 6. Each time you redistribute the Program (or any work based on the +Program), the recipient automatically receives a license from the +original licensor to copy, distribute or modify the Program subject to +these terms and conditions. You may not impose any further +restrictions on the recipients' exercise of the rights granted herein. +You are not responsible for enforcing compliance by third parties to +this License. + + 7. If, as a consequence of a court judgment or allegation of patent +infringement or for any other reason (not limited to patent issues), +conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot +distribute so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you +may not distribute the Program at all. For example, if a patent +license would not permit royalty-free redistribution of the Program by +all those who receive copies directly or indirectly through you, then +the only way you could satisfy both it and this License would be to +refrain entirely from distribution of the Program. + +If any portion of this section is held invalid or unenforceable under +any particular circumstance, the balance of the section is intended to +apply and the section as a whole is intended to apply in other +circumstances. + +It is not the purpose of this section to induce you to infringe any +patents or other property right claims or to contest validity of any +such claims; this section has the sole purpose of protecting the +integrity of the free software distribution system, which is +implemented by public license practices. Many people have made +generous contributions to the wide range of software distributed +through that system in reliance on consistent application of that +system; it is up to the author/donor to decide if he or she is willing +to distribute software through any other system and a licensee cannot +impose that choice. + +This section is intended to make thoroughly clear what is believed to +be a consequence of the rest of this License. + + 8. If the distribution and/or use of the Program is restricted in +certain countries either by patents or by copyrighted interfaces, the +original copyright holder who places the Program under this License +may add an explicit geographical distribution limitation excluding +those countries, so that distribution is permitted only in or among +countries not thus excluded. In such case, this License incorporates +the limitation as if written in the body of this License. + + 9. The Free Software Foundation may publish revised and/or new versions +of the General Public License from time to time. Such new versions will +be similar in spirit to the present version, but may differ in detail to +address new problems or concerns. + +Each version is given a distinguishing version number. If the Program +specifies a version number of this License which applies to it and "any +later version", you have the option of following the terms and conditions +either of that version or of any later version published by the Free +Software Foundation. If the Program does not specify a version number of +this License, you may choose any version ever published by the Free Software +Foundation. + + 10. If you wish to incorporate parts of the Program into other free +programs whose distribution conditions are different, write to the author +to ask for permission. For software which is copyrighted by the Free +Software Foundation, write to the Free Software Foundation; we sometimes +make exceptions for this. Our decision will be guided by the two goals +of preserving the free status of all derivatives of our free software and +of promoting the sharing and reuse of software generally. + + NO WARRANTY + + 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY +FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN +OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES +PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED +OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF +MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS +TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE +PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, +REPAIR OR CORRECTION. + + 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING +WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR +REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, +INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING +OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED +TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY +YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER +PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE +POSSIBILITY OF SUCH DAMAGES. + + END OF TERMS AND CONDITIONS + + How to Apply These Terms to Your New Programs + + If you develop a new program, and you want it to be of the greatest +possible use to the public, the best way to achieve this is to make it +free software which everyone can redistribute and change under these terms. + + To do so, attach the following notices to the program. It is safest +to attach them to the start of each source file to most effectively +convey the exclusion of warranty; and each file should have at least +the "copyright" line and a pointer to where the full notice is found. + + + Copyright (C) + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License along + with this program; if not, write to the Free Software Foundation, Inc., + 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + +Also add information on how to contact you by electronic and paper mail. + +If the program is interactive, make it output a short notice like this +when it starts in an interactive mode: + + Gnomovision version 69, Copyright (C) year name of author + Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. + This is free software, and you are welcome to redistribute it + under certain conditions; type `show c' for details. + +The hypothetical commands `show w' and `show c' should show the appropriate +parts of the General Public License. Of course, the commands you use may +be called something other than `show w' and `show c'; they could even be +mouse-clicks or menu items--whatever suits your program. + +You should also get your employer (if you work as a programmer) or your +school, if any, to sign a "copyright disclaimer" for the program, if +necessary. Here is a sample; alter the names: + + Yoyodyne, Inc., hereby disclaims all copyright interest in the program + `Gnomovision' (which makes passes at compilers) written by James Hacker. + + , 1 April 1989 + Ty Coon, President of Vice + +This General Public License does not permit incorporating your program into +proprietary programs. If your program is a subroutine library, you may +consider it more useful to permit linking proprietary applications with the +library. If this is what you want to do, use the GNU Lesser General +Public License instead of this License. diff --git a/_darcs/pristine/extlib/markdown.php b/_darcs/pristine/extlib/markdown.php new file mode 100644 index 0000000000..8179b568b8 --- /dev/null +++ b/_darcs/pristine/extlib/markdown.php @@ -0,0 +1,1710 @@ + +# +# Original Markdown +# Copyright (c) 2004-2006 John Gruber +# +# + + +define( 'MARKDOWN_VERSION', "1.0.1m" ); # Sat 21 Jun 2008 + + +# +# Global default settings: +# + +# Change to ">" for HTML output +@define( 'MARKDOWN_EMPTY_ELEMENT_SUFFIX', " />"); + +# Define the width of a tab for code blocks. +@define( 'MARKDOWN_TAB_WIDTH', 4 ); + + +# +# WordPress settings: +# + +# Change to false to remove Markdown from posts and/or comments. +@define( 'MARKDOWN_WP_POSTS', true ); +@define( 'MARKDOWN_WP_COMMENTS', true ); + + + +### Standard Function Interface ### + +@define( 'MARKDOWN_PARSER_CLASS', 'Markdown_Parser' ); + +function Markdown($text) { +# +# Initialize the parser and return the result of its transform method. +# + # Setup static parser variable. + static $parser; + if (!isset($parser)) { + $parser_class = MARKDOWN_PARSER_CLASS; + $parser = new $parser_class; + } + + # Transform text using parser. + return $parser->transform($text); +} + + +### WordPress Plugin Interface ### + +/* +Plugin Name: Markdown +Plugin URI: http://www.michelf.com/projects/php-markdown/ +Description: Markdown syntax allows you to write using an easy-to-read, easy-to-write plain text format. Based on the original Perl version by John Gruber. More... +Version: 1.0.1m +Author: Michel Fortin +Author URI: http://www.michelf.com/ +*/ + +if (isset($wp_version)) { + # More details about how it works here: + # + + # Post content and excerpts + # - Remove WordPress paragraph generator. + # - Run Markdown on excerpt, then remove all tags. + # - Add paragraph tag around the excerpt, but remove it for the excerpt rss. + if (MARKDOWN_WP_POSTS) { + remove_filter('the_content', 'wpautop'); + remove_filter('the_content_rss', 'wpautop'); + remove_filter('the_excerpt', 'wpautop'); + add_filter('the_content', 'Markdown', 6); + add_filter('the_content_rss', 'Markdown', 6); + add_filter('get_the_excerpt', 'Markdown', 6); + add_filter('get_the_excerpt', 'trim', 7); + add_filter('the_excerpt', 'mdwp_add_p'); + add_filter('the_excerpt_rss', 'mdwp_strip_p'); + + remove_filter('content_save_pre', 'balanceTags', 50); + remove_filter('excerpt_save_pre', 'balanceTags', 50); + add_filter('the_content', 'balanceTags', 50); + add_filter('get_the_excerpt', 'balanceTags', 9); + } + + # Comments + # - Remove WordPress paragraph generator. + # - Remove WordPress auto-link generator. + # - Scramble important tags before passing them to the kses filter. + # - Run Markdown on excerpt then remove paragraph tags. + if (MARKDOWN_WP_COMMENTS) { + remove_filter('comment_text', 'wpautop', 30); + remove_filter('comment_text', 'make_clickable'); + add_filter('pre_comment_content', 'Markdown', 6); + add_filter('pre_comment_content', 'mdwp_hide_tags', 8); + add_filter('pre_comment_content', 'mdwp_show_tags', 12); + add_filter('get_comment_text', 'Markdown', 6); + add_filter('get_comment_excerpt', 'Markdown', 6); + add_filter('get_comment_excerpt', 'mdwp_strip_p', 7); + + global $mdwp_hidden_tags, $mdwp_placeholders; + $mdwp_hidden_tags = explode(' ', + '

       
    • '); + $mdwp_placeholders = explode(' ', str_rot13( + 'pEj07ZbbBZ U1kqgh4w4p pre2zmeN6K QTi31t9pre ol0MP1jzJR '. + 'ML5IjmbRol ulANi1NsGY J7zRLJqPul liA8ctl16T K9nhooUHli')); + } + + function mdwp_add_p($text) { + if (!preg_match('{^$|^<(p|ul|ol|dl|pre|blockquote)>}i', $text)) { + $text = '

      '.$text.'

      '; + $text = preg_replace('{\n{2,}}', "

      \n\n

      ", $text); + } + return $text; + } + + function mdwp_strip_p($t) { return preg_replace('{}i', '', $t); } + + function mdwp_hide_tags($text) { + global $mdwp_hidden_tags, $mdwp_placeholders; + return str_replace($mdwp_hidden_tags, $mdwp_placeholders, $text); + } + function mdwp_show_tags($text) { + global $mdwp_hidden_tags, $mdwp_placeholders; + return str_replace($mdwp_placeholders, $mdwp_hidden_tags, $text); + } +} + + +### bBlog Plugin Info ### + +function identify_modifier_markdown() { + return array( + 'name' => 'markdown', + 'type' => 'modifier', + 'nicename' => 'Markdown', + 'description' => 'A text-to-HTML conversion tool for web writers', + 'authors' => 'Michel Fortin and John Gruber', + 'licence' => 'BSD-like', + 'version' => MARKDOWN_VERSION, + 'help' => 'Markdown syntax allows you to write using an easy-to-read, easy-to-write plain text format. Based on the original Perl version by John Gruber. More...' + ); +} + + +### Smarty Modifier Interface ### + +function smarty_modifier_markdown($text) { + return Markdown($text); +} + + +### Textile Compatibility Mode ### + +# Rename this file to "classTextile.php" and it can replace Textile everywhere. + +if (strcasecmp(substr(__FILE__, -16), "classTextile.php") == 0) { + # Try to include PHP SmartyPants. Should be in the same directory. + @include_once 'smartypants.php'; + # Fake Textile class. It calls Markdown instead. + class Textile { + function TextileThis($text, $lite='', $encode='') { + if ($lite == '' && $encode == '') $text = Markdown($text); + if (function_exists('SmartyPants')) $text = SmartyPants($text); + return $text; + } + # Fake restricted version: restrictions are not supported for now. + function TextileRestricted($text, $lite='', $noimage='') { + return $this->TextileThis($text, $lite); + } + # Workaround to ensure compatibility with TextPattern 4.0.3. + function blockLite($text) { return $text; } + } +} + + + +# +# Markdown Parser Class +# + +class Markdown_Parser { + + # Regex to match balanced [brackets]. + # Needed to insert a maximum bracked depth while converting to PHP. + var $nested_brackets_depth = 6; + var $nested_brackets_re; + + var $nested_url_parenthesis_depth = 4; + var $nested_url_parenthesis_re; + + # Table of hash values for escaped characters: + var $escape_chars = '\`*_{}[]()>#+-.!'; + var $escape_chars_re; + + # Change to ">" for HTML output. + var $empty_element_suffix = MARKDOWN_EMPTY_ELEMENT_SUFFIX; + var $tab_width = MARKDOWN_TAB_WIDTH; + + # Change to `true` to disallow markup or entities. + var $no_markup = false; + var $no_entities = false; + + # Predefined urls and titles for reference links and images. + var $predef_urls = array(); + var $predef_titles = array(); + + + function Markdown_Parser() { + # + # Constructor function. Initialize appropriate member variables. + # + $this->_initDetab(); + $this->prepareItalicsAndBold(); + + $this->nested_brackets_re = + str_repeat('(?>[^\[\]]+|\[', $this->nested_brackets_depth). + str_repeat('\])*', $this->nested_brackets_depth); + + $this->nested_url_parenthesis_re = + str_repeat('(?>[^()\s]+|\(', $this->nested_url_parenthesis_depth). + str_repeat('(?>\)))*', $this->nested_url_parenthesis_depth); + + $this->escape_chars_re = '['.preg_quote($this->escape_chars).']'; + + # Sort document, block, and span gamut in ascendent priority order. + asort($this->document_gamut); + asort($this->block_gamut); + asort($this->span_gamut); + } + + + # Internal hashes used during transformation. + var $urls = array(); + var $titles = array(); + var $html_hashes = array(); + + # Status flag to avoid invalid nesting. + var $in_anchor = false; + + + function setup() { + # + # Called before the transformation process starts to setup parser + # states. + # + # Clear global hashes. + $this->urls = $this->predef_urls; + $this->titles = $this->predef_titles; + $this->html_hashes = array(); + + $in_anchor = false; + } + + function teardown() { + # + # Called after the transformation process to clear any variable + # which may be taking up memory unnecessarly. + # + $this->urls = array(); + $this->titles = array(); + $this->html_hashes = array(); + } + + + function transform($text) { + # + # Main function. Performs some preprocessing on the input text + # and pass it through the document gamut. + # + $this->setup(); + + # Remove UTF-8 BOM and marker character in input, if present. + $text = preg_replace('{^\xEF\xBB\xBF|\x1A}', '', $text); + + # Standardize line endings: + # DOS to Unix and Mac to Unix + $text = preg_replace('{\r\n?}', "\n", $text); + + # Make sure $text ends with a couple of newlines: + $text .= "\n\n"; + + # Convert all tabs to spaces. + $text = $this->detab($text); + + # Turn block-level HTML blocks into hash entries + $text = $this->hashHTMLBlocks($text); + + # Strip any lines consisting only of spaces and tabs. + # This makes subsequent regexen easier to write, because we can + # match consecutive blank lines with /\n+/ instead of something + # contorted like /[ ]*\n+/ . + $text = preg_replace('/^[ ]+$/m', '', $text); + + # Run document gamut methods. + foreach ($this->document_gamut as $method => $priority) { + $text = $this->$method($text); + } + + $this->teardown(); + + return $text . "\n"; + } + + var $document_gamut = array( + # Strip link definitions, store in hashes. + "stripLinkDefinitions" => 20, + + "runBasicBlockGamut" => 30, + ); + + + function stripLinkDefinitions($text) { + # + # Strips link definitions from text, stores the URLs and titles in + # hash references. + # + $less_than_tab = $this->tab_width - 1; + + # Link defs are in the form: ^[id]: url "optional title" + $text = preg_replace_callback('{ + ^[ ]{0,'.$less_than_tab.'}\[(.+)\][ ]?: # id = $1 + [ ]* + \n? # maybe *one* newline + [ ]* + ? # url = $2 + [ ]* + \n? # maybe one newline + [ ]* + (?: + (?<=\s) # lookbehind for whitespace + ["(] + (.*?) # title = $3 + [")] + [ ]* + )? # title is optional + (?:\n+|\Z) + }xm', + array(&$this, '_stripLinkDefinitions_callback'), + $text); + return $text; + } + function _stripLinkDefinitions_callback($matches) { + $link_id = strtolower($matches[1]); + $this->urls[$link_id] = $matches[2]; + $this->titles[$link_id] =& $matches[3]; + return ''; # String that will replace the block + } + + + function hashHTMLBlocks($text) { + if ($this->no_markup) return $text; + + $less_than_tab = $this->tab_width - 1; + + # Hashify HTML blocks: + # We only want to do this for block-level HTML tags, such as headers, + # lists, and tables. That's because we still want to wrap

      s around + # "paragraphs" that are wrapped in non-block-level tags, such as anchors, + # phrase emphasis, and spans. The list of tags we're looking for is + # hard-coded: + # + # * List "a" is made of tags which can be both inline or block-level. + # These will be treated block-level when the start tag is alone on + # its line, otherwise they're not matched here and will be taken as + # inline later. + # * List "b" is made of tags which are always block-level; + # + $block_tags_a_re = 'ins|del'; + $block_tags_b_re = 'p|div|h[1-6]|blockquote|pre|table|dl|ol|ul|address|'. + 'script|noscript|form|fieldset|iframe|math'; + + # Regular expression for the content of a block tag. + $nested_tags_level = 4; + $attr = ' + (?> # optional tag attributes + \s # starts with whitespace + (?> + [^>"/]+ # text outside quotes + | + /+(?!>) # slash not followed by ">" + | + "[^"]*" # text inside double quotes (tolerate ">") + | + \'[^\']*\' # text inside single quotes (tolerate ">") + )* + )? + '; + $content = + str_repeat(' + (?> + [^<]+ # content without tag + | + <\2 # nested opening tag + '.$attr.' # attributes + (?> + /> + | + >', $nested_tags_level). # end of opening tag + '.*?'. # last level nested tag content + str_repeat(' + # closing nested tag + ) + | + <(?!/\2\s*> # other tags with a different name + ) + )*', + $nested_tags_level); + $content2 = str_replace('\2', '\3', $content); + + # First, look for nested blocks, e.g.: + #

      + #
      + # tags for inner block must be indented. + #
      + #
      + # + # The outermost tags must start at the left margin for this to match, and + # the inner nested divs must be indented. + # We need to do this before the next, more liberal match, because the next + # match will start at the first `
      ` and stop at the first `
      `. + $text = preg_replace_callback('{(?> + (?> + (?<=\n\n) # Starting after a blank line + | # or + \A\n? # the beginning of the doc + ) + ( # save in $1 + + # Match from `\n` to `\n`, handling nested tags + # in between. + + [ ]{0,'.$less_than_tab.'} + <('.$block_tags_b_re.')# start tag = $2 + '.$attr.'> # attributes followed by > and \n + '.$content.' # content, support nesting + # the matching end tag + [ ]* # trailing spaces/tabs + (?=\n+|\Z) # followed by a newline or end of document + + | # Special version for tags of group a. + + [ ]{0,'.$less_than_tab.'} + <('.$block_tags_a_re.')# start tag = $3 + '.$attr.'>[ ]*\n # attributes followed by > + '.$content2.' # content, support nesting + # the matching end tag + [ ]* # trailing spaces/tabs + (?=\n+|\Z) # followed by a newline or end of document + + | # Special case just for
      . It was easier to make a special + # case than to make the other regex more complicated. + + [ ]{0,'.$less_than_tab.'} + <(hr) # start tag = $2 + '.$attr.' # attributes + /?> # the matching end tag + [ ]* + (?=\n{2,}|\Z) # followed by a blank line or end of document + + | # Special case for standalone HTML comments: + + [ ]{0,'.$less_than_tab.'} + (?s: + + ) + [ ]* + (?=\n{2,}|\Z) # followed by a blank line or end of document + + | # PHP and ASP-style processor instructions ( + ) + [ ]* + (?=\n{2,}|\Z) # followed by a blank line or end of document + + ) + )}Sxmi', + array(&$this, '_hashHTMLBlocks_callback'), + $text); + + return $text; + } + function _hashHTMLBlocks_callback($matches) { + $text = $matches[1]; + $key = $this->hashBlock($text); + return "\n\n$key\n\n"; + } + + + function hashPart($text, $boundary = 'X') { + # + # Called whenever a tag must be hashed when a function insert an atomic + # element in the text stream. Passing $text to through this function gives + # a unique text-token which will be reverted back when calling unhash. + # + # The $boundary argument specify what character should be used to surround + # the token. By convension, "B" is used for block elements that needs not + # to be wrapped into paragraph tags at the end, ":" is used for elements + # that are word separators and "X" is used in the general case. + # + # Swap back any tag hash found in $text so we do not have to `unhash` + # multiple times at the end. + $text = $this->unhash($text); + + # Then hash the block. + static $i = 0; + $key = "$boundary\x1A" . ++$i . $boundary; + $this->html_hashes[$key] = $text; + return $key; # String that will replace the tag. + } + + + function hashBlock($text) { + # + # Shortcut function for hashPart with block-level boundaries. + # + return $this->hashPart($text, 'B'); + } + + + var $block_gamut = array( + # + # These are all the transformations that form block-level + # tags like paragraphs, headers, and list items. + # + "doHeaders" => 10, + "doHorizontalRules" => 20, + + "doLists" => 40, + "doCodeBlocks" => 50, + "doBlockQuotes" => 60, + ); + + function runBlockGamut($text) { + # + # Run block gamut tranformations. + # + # We need to escape raw HTML in Markdown source before doing anything + # else. This need to be done for each block, and not only at the + # begining in the Markdown function since hashed blocks can be part of + # list items and could have been indented. Indented blocks would have + # been seen as a code block in a previous pass of hashHTMLBlocks. + $text = $this->hashHTMLBlocks($text); + + return $this->runBasicBlockGamut($text); + } + + function runBasicBlockGamut($text) { + # + # Run block gamut tranformations, without hashing HTML blocks. This is + # useful when HTML blocks are known to be already hashed, like in the first + # whole-document pass. + # + foreach ($this->block_gamut as $method => $priority) { + $text = $this->$method($text); + } + + # Finally form paragraph and restore hashed blocks. + $text = $this->formParagraphs($text); + + return $text; + } + + + function doHorizontalRules($text) { + # Do Horizontal Rules: + return preg_replace( + '{ + ^[ ]{0,3} # Leading space + ([-*_]) # $1: First marker + (?> # Repeated marker group + [ ]{0,2} # Zero, one, or two spaces. + \1 # Marker character + ){2,} # Group repeated at least twice + [ ]* # Tailing spaces + $ # End of line. + }mx', + "\n".$this->hashBlock("empty_element_suffix")."\n", + $text); + } + + + var $span_gamut = array( + # + # These are all the transformations that occur *within* block-level + # tags like paragraphs, headers, and list items. + # + # Process character escapes, code spans, and inline HTML + # in one shot. + "parseSpan" => -30, + + # Process anchor and image tags. Images must come first, + # because ![foo][f] looks like an anchor. + "doImages" => 10, + "doAnchors" => 20, + + # Make links out of things like `` + # Must come after doAnchors, because you can use < and > + # delimiters in inline links like [this](). + "doAutoLinks" => 30, + "encodeAmpsAndAngles" => 40, + + "doItalicsAndBold" => 50, + "doHardBreaks" => 60, + ); + + function runSpanGamut($text) { + # + # Run span gamut tranformations. + # + foreach ($this->span_gamut as $method => $priority) { + $text = $this->$method($text); + } + + return $text; + } + + + function doHardBreaks($text) { + # Do hard breaks: + return preg_replace_callback('/ {2,}\n/', + array(&$this, '_doHardBreaks_callback'), $text); + } + function _doHardBreaks_callback($matches) { + return $this->hashPart("empty_element_suffix\n"); + } + + + function doAnchors($text) { + # + # Turn Markdown link shortcuts into XHTML tags. + # + if ($this->in_anchor) return $text; + $this->in_anchor = true; + + # + # First, handle reference-style links: [link text] [id] + # + $text = preg_replace_callback('{ + ( # wrap whole match in $1 + \[ + ('.$this->nested_brackets_re.') # link text = $2 + \] + + [ ]? # one optional space + (?:\n[ ]*)? # one optional newline followed by spaces + + \[ + (.*?) # id = $3 + \] + ) + }xs', + array(&$this, '_doAnchors_reference_callback'), $text); + + # + # Next, inline-style links: [link text](url "optional title") + # + $text = preg_replace_callback('{ + ( # wrap whole match in $1 + \[ + ('.$this->nested_brackets_re.') # link text = $2 + \] + \( # literal paren + [ ]* + (?: + <(\S*)> # href = $3 + | + ('.$this->nested_url_parenthesis_re.') # href = $4 + ) + [ ]* + ( # $5 + ([\'"]) # quote char = $6 + (.*?) # Title = $7 + \6 # matching quote + [ ]* # ignore any spaces/tabs between closing quote and ) + )? # title is optional + \) + ) + }xs', + array(&$this, '_DoAnchors_inline_callback'), $text); + + # + # Last, handle reference-style shortcuts: [link text] + # These must come last in case you've also got [link test][1] + # or [link test](/foo) + # +// $text = preg_replace_callback('{ +// ( # wrap whole match in $1 +// \[ +// ([^\[\]]+) # link text = $2; can\'t contain [ or ] +// \] +// ) +// }xs', +// array(&$this, '_doAnchors_reference_callback'), $text); + + $this->in_anchor = false; + return $text; + } + function _doAnchors_reference_callback($matches) { + $whole_match = $matches[1]; + $link_text = $matches[2]; + $link_id =& $matches[3]; + + if ($link_id == "") { + # for shortcut links like [this][] or [this]. + $link_id = $link_text; + } + + # lower-case and turn embedded newlines into spaces + $link_id = strtolower($link_id); + $link_id = preg_replace('{[ ]?\n}', ' ', $link_id); + + if (isset($this->urls[$link_id])) { + $url = $this->urls[$link_id]; + $url = $this->encodeAttribute($url); + + $result = "titles[$link_id] ) ) { + $title = $this->titles[$link_id]; + $title = $this->encodeAttribute($title); + $result .= " title=\"$title\""; + } + + $link_text = $this->runSpanGamut($link_text); + $result .= ">$link_text"; + $result = $this->hashPart($result); + } + else { + $result = $whole_match; + } + return $result; + } + function _doAnchors_inline_callback($matches) { + $whole_match = $matches[1]; + $link_text = $this->runSpanGamut($matches[2]); + $url = $matches[3] == '' ? $matches[4] : $matches[3]; + $title =& $matches[7]; + + $url = $this->encodeAttribute($url); + + $result = "encodeAttribute($title); + $result .= " title=\"$title\""; + } + + $link_text = $this->runSpanGamut($link_text); + $result .= ">$link_text"; + + return $this->hashPart($result); + } + + + function doImages($text) { + # + # Turn Markdown image shortcuts into tags. + # + # + # First, handle reference-style labeled images: ![alt text][id] + # + $text = preg_replace_callback('{ + ( # wrap whole match in $1 + !\[ + ('.$this->nested_brackets_re.') # alt text = $2 + \] + + [ ]? # one optional space + (?:\n[ ]*)? # one optional newline followed by spaces + + \[ + (.*?) # id = $3 + \] + + ) + }xs', + array(&$this, '_doImages_reference_callback'), $text); + + # + # Next, handle inline images: ![alt text](url "optional title") + # Don't forget: encode * and _ + # + $text = preg_replace_callback('{ + ( # wrap whole match in $1 + !\[ + ('.$this->nested_brackets_re.') # alt text = $2 + \] + \s? # One optional whitespace character + \( # literal paren + [ ]* + (?: + <(\S*)> # src url = $3 + | + ('.$this->nested_url_parenthesis_re.') # src url = $4 + ) + [ ]* + ( # $5 + ([\'"]) # quote char = $6 + (.*?) # title = $7 + \6 # matching quote + [ ]* + )? # title is optional + \) + ) + }xs', + array(&$this, '_doImages_inline_callback'), $text); + + return $text; + } + function _doImages_reference_callback($matches) { + $whole_match = $matches[1]; + $alt_text = $matches[2]; + $link_id = strtolower($matches[3]); + + if ($link_id == "") { + $link_id = strtolower($alt_text); # for shortcut links like ![this][]. + } + + $alt_text = $this->encodeAttribute($alt_text); + if (isset($this->urls[$link_id])) { + $url = $this->encodeAttribute($this->urls[$link_id]); + $result = "\"$alt_text\"";titles[$link_id])) { + $title = $this->titles[$link_id]; + $title = $this->encodeAttribute($title); + $result .= " title=\"$title\""; + } + $result .= $this->empty_element_suffix; + $result = $this->hashPart($result); + } + else { + # If there's no such link ID, leave intact: + $result = $whole_match; + } + + return $result; + } + function _doImages_inline_callback($matches) { + $whole_match = $matches[1]; + $alt_text = $matches[2]; + $url = $matches[3] == '' ? $matches[4] : $matches[3]; + $title =& $matches[7]; + + $alt_text = $this->encodeAttribute($alt_text); + $url = $this->encodeAttribute($url); + $result = "\"$alt_text\"";encodeAttribute($title); + $result .= " title=\"$title\""; # $title already quoted + } + $result .= $this->empty_element_suffix; + + return $this->hashPart($result); + } + + + function doHeaders($text) { + # Setext-style headers: + # Header 1 + # ======== + # + # Header 2 + # -------- + # + $text = preg_replace_callback('{ ^(.+?)[ ]*\n(=+|-+)[ ]*\n+ }mx', + array(&$this, '_doHeaders_callback_setext'), $text); + + # atx-style headers: + # # Header 1 + # ## Header 2 + # ## Header 2 with closing hashes ## + # ... + # ###### Header 6 + # + $text = preg_replace_callback('{ + ^(\#{1,6}) # $1 = string of #\'s + [ ]* + (.+?) # $2 = Header text + [ ]* + \#* # optional closing #\'s (not counted) + \n+ + }xm', + array(&$this, '_doHeaders_callback_atx'), $text); + + return $text; + } + function _doHeaders_callback_setext($matches) { + # Terrible hack to check we haven't found an empty list item. + if ($matches[2] == '-' && preg_match('{^-(?: |$)}', $matches[1])) + return $matches[0]; + + $level = $matches[2]{0} == '=' ? 1 : 2; + $block = "".$this->runSpanGamut($matches[1]).""; + return "\n" . $this->hashBlock($block) . "\n\n"; + } + function _doHeaders_callback_atx($matches) { + $level = strlen($matches[1]); + $block = "".$this->runSpanGamut($matches[2]).""; + return "\n" . $this->hashBlock($block) . "\n\n"; + } + + + function doLists($text) { + # + # Form HTML ordered (numbered) and unordered (bulleted) lists. + # + $less_than_tab = $this->tab_width - 1; + + # Re-usable patterns to match list item bullets and number markers: + $marker_ul_re = '[*+-]'; + $marker_ol_re = '\d+[.]'; + $marker_any_re = "(?:$marker_ul_re|$marker_ol_re)"; + + $markers_relist = array($marker_ul_re, $marker_ol_re); + + foreach ($markers_relist as $marker_re) { + # Re-usable pattern to match any entirel ul or ol list: + $whole_list_re = ' + ( # $1 = whole list + ( # $2 + [ ]{0,'.$less_than_tab.'} + ('.$marker_re.') # $3 = first list item marker + [ ]+ + ) + (?s:.+?) + ( # $4 + \z + | + \n{2,} + (?=\S) + (?! # Negative lookahead for another list item marker + [ ]* + '.$marker_re.'[ ]+ + ) + ) + ) + '; // mx + + # We use a different prefix before nested lists than top-level lists. + # See extended comment in _ProcessListItems(). + + if ($this->list_level) { + $text = preg_replace_callback('{ + ^ + '.$whole_list_re.' + }mx', + array(&$this, '_doLists_callback'), $text); + } + else { + $text = preg_replace_callback('{ + (?:(?<=\n)\n|\A\n?) # Must eat the newline + '.$whole_list_re.' + }mx', + array(&$this, '_doLists_callback'), $text); + } + } + + return $text; + } + function _doLists_callback($matches) { + # Re-usable patterns to match list item bullets and number markers: + $marker_ul_re = '[*+-]'; + $marker_ol_re = '\d+[.]'; + $marker_any_re = "(?:$marker_ul_re|$marker_ol_re)"; + + $list = $matches[1]; + $list_type = preg_match("/$marker_ul_re/", $matches[3]) ? "ul" : "ol"; + + $marker_any_re = ( $list_type == "ul" ? $marker_ul_re : $marker_ol_re ); + + $list .= "\n"; + $result = $this->processListItems($list, $marker_any_re); + + $result = $this->hashBlock("<$list_type>\n" . $result . ""); + return "\n". $result ."\n\n"; + } + + var $list_level = 0; + + function processListItems($list_str, $marker_any_re) { + # + # Process the contents of a single ordered or unordered list, splitting it + # into individual list items. + # + # The $this->list_level global keeps track of when we're inside a list. + # Each time we enter a list, we increment it; when we leave a list, + # we decrement. If it's zero, we're not in a list anymore. + # + # We do this because when we're not inside a list, we want to treat + # something like this: + # + # I recommend upgrading to version + # 8. Oops, now this line is treated + # as a sub-list. + # + # As a single paragraph, despite the fact that the second line starts + # with a digit-period-space sequence. + # + # Whereas when we're inside a list (or sub-list), that line will be + # treated as the start of a sub-list. What a kludge, huh? This is + # an aspect of Markdown's syntax that's hard to parse perfectly + # without resorting to mind-reading. Perhaps the solution is to + # change the syntax rules such that sub-lists must start with a + # starting cardinal number; e.g. "1." or "a.". + + $this->list_level++; + + # trim trailing blank lines: + $list_str = preg_replace("/\n{2,}\\z/", "\n", $list_str); + + $list_str = preg_replace_callback('{ + (\n)? # leading line = $1 + (^[ ]*) # leading whitespace = $2 + ('.$marker_any_re.' # list marker and space = $3 + (?:[ ]+|(?=\n)) # space only required if item is not empty + ) + ((?s:.*?)) # list item text = $4 + (?:(\n+(?=\n))|\n) # tailing blank line = $5 + (?= \n* (\z | \2 ('.$marker_any_re.') (?:[ ]+|(?=\n)))) + }xm', + array(&$this, '_processListItems_callback'), $list_str); + + $this->list_level--; + return $list_str; + } + function _processListItems_callback($matches) { + $item = $matches[4]; + $leading_line =& $matches[1]; + $leading_space =& $matches[2]; + $marker_space = $matches[3]; + $tailing_blank_line =& $matches[5]; + + if ($leading_line || $tailing_blank_line || + preg_match('/\n{2,}/', $item)) + { + # Replace marker with the appropriate whitespace indentation + $item = $leading_space . str_repeat(' ', strlen($marker_space)) . $item; + $item = $this->runBlockGamut($this->outdent($item)."\n"); + } + else { + # Recursion for sub-lists: + $item = $this->doLists($this->outdent($item)); + $item = preg_replace('/\n+$/', '', $item); + $item = $this->runSpanGamut($item); + } + + return "
    • " . $item . "
    • \n"; + } + + + function doCodeBlocks($text) { + # + # Process Markdown `
      ` blocks.
      +	#
      +		$text = preg_replace_callback('{
      +				(?:\n\n|\A\n?)
      +				(	            # $1 = the code block -- one or more lines, starting with a space/tab
      +				  (?>
      +					[ ]{'.$this->tab_width.'}  # Lines must start with a tab or a tab-width of spaces
      +					.*\n+
      +				  )+
      +				)
      +				((?=^[ ]{0,'.$this->tab_width.'}\S)|\Z)	# Lookahead for non-space at line-start, or end of doc
      +			}xm',
      +			array(&$this, '_doCodeBlocks_callback'), $text);
      +
      +		return $text;
      +	}
      +	function _doCodeBlocks_callback($matches) {
      +		$codeblock = $matches[1];
      +
      +		$codeblock = $this->outdent($codeblock);
      +		$codeblock = htmlspecialchars($codeblock, ENT_NOQUOTES);
      +
      +		# trim leading newlines and trailing newlines
      +		$codeblock = preg_replace('/\A\n+|\n+\z/', '', $codeblock);
      +
      +		$codeblock = "
      $codeblock\n
      "; + return "\n\n".$this->hashBlock($codeblock)."\n\n"; + } + + + function makeCodeSpan($code) { + # + # Create a code span markup for $code. Called from handleSpanToken. + # + $code = htmlspecialchars(trim($code), ENT_NOQUOTES); + return $this->hashPart("$code"); + } + + + var $em_relist = array( + '' => '(?:(? '(?<=\S)(? '(?<=\S)(? '(?:(? '(?<=\S)(? '(?<=\S)(? '(?:(? '(?<=\S)(? '(?<=\S)(?em_relist as $em => $em_re) { + foreach ($this->strong_relist as $strong => $strong_re) { + # Construct list of allowed token expressions. + $token_relist = array(); + if (isset($this->em_strong_relist["$em$strong"])) { + $token_relist[] = $this->em_strong_relist["$em$strong"]; + } + $token_relist[] = $em_re; + $token_relist[] = $strong_re; + + # Construct master expression from list. + $token_re = '{('. implode('|', $token_relist) .')}'; + $this->em_strong_prepared_relist["$em$strong"] = $token_re; + } + } + } + + function doItalicsAndBold($text) { + $token_stack = array(''); + $text_stack = array(''); + $em = ''; + $strong = ''; + $tree_char_em = false; + + while (1) { + # + # Get prepared regular expression for seraching emphasis tokens + # in current context. + # + $token_re = $this->em_strong_prepared_relist["$em$strong"]; + + # + # Each loop iteration seach for the next emphasis token. + # Each token is then passed to handleSpanToken. + # + $parts = preg_split($token_re, $text, 2, PREG_SPLIT_DELIM_CAPTURE); + $text_stack[0] .= $parts[0]; + $token =& $parts[1]; + $text =& $parts[2]; + + if (empty($token)) { + # Reached end of text span: empty stack without emitting. + # any more emphasis. + while ($token_stack[0]) { + $text_stack[1] .= array_shift($token_stack); + $text_stack[0] .= array_shift($text_stack); + } + break; + } + + $token_len = strlen($token); + if ($tree_char_em) { + # Reached closing marker while inside a three-char emphasis. + if ($token_len == 3) { + # Three-char closing marker, close em and strong. + array_shift($token_stack); + $span = array_shift($text_stack); + $span = $this->runSpanGamut($span); + $span = "$span"; + $text_stack[0] .= $this->hashPart($span); + $em = ''; + $strong = ''; + } else { + # Other closing marker: close one em or strong and + # change current token state to match the other + $token_stack[0] = str_repeat($token{0}, 3-$token_len); + $tag = $token_len == 2 ? "strong" : "em"; + $span = $text_stack[0]; + $span = $this->runSpanGamut($span); + $span = "<$tag>$span"; + $text_stack[0] = $this->hashPart($span); + $$tag = ''; # $$tag stands for $em or $strong + } + $tree_char_em = false; + } else if ($token_len == 3) { + if ($em) { + # Reached closing marker for both em and strong. + # Closing strong marker: + for ($i = 0; $i < 2; ++$i) { + $shifted_token = array_shift($token_stack); + $tag = strlen($shifted_token) == 2 ? "strong" : "em"; + $span = array_shift($text_stack); + $span = $this->runSpanGamut($span); + $span = "<$tag>$span"; + $text_stack[0] .= $this->hashPart($span); + $$tag = ''; # $$tag stands for $em or $strong + } + } else { + # Reached opening three-char emphasis marker. Push on token + # stack; will be handled by the special condition above. + $em = $token{0}; + $strong = "$em$em"; + array_unshift($token_stack, $token); + array_unshift($text_stack, ''); + $tree_char_em = true; + } + } else if ($token_len == 2) { + if ($strong) { + # Unwind any dangling emphasis marker: + if (strlen($token_stack[0]) == 1) { + $text_stack[1] .= array_shift($token_stack); + $text_stack[0] .= array_shift($text_stack); + } + # Closing strong marker: + array_shift($token_stack); + $span = array_shift($text_stack); + $span = $this->runSpanGamut($span); + $span = "$span"; + $text_stack[0] .= $this->hashPart($span); + $strong = ''; + } else { + array_unshift($token_stack, $token); + array_unshift($text_stack, ''); + $strong = $token; + } + } else { + # Here $token_len == 1 + if ($em) { + if (strlen($token_stack[0]) == 1) { + # Closing emphasis marker: + array_shift($token_stack); + $span = array_shift($text_stack); + $span = $this->runSpanGamut($span); + $span = "$span"; + $text_stack[0] .= $this->hashPart($span); + $em = ''; + } else { + $text_stack[0] .= $token; + } + } else { + array_unshift($token_stack, $token); + array_unshift($text_stack, ''); + $em = $token; + } + } + } + return $text_stack[0]; + } + + + function doBlockQuotes($text) { + $text = preg_replace_callback('/ + ( # Wrap whole match in $1 + (?> + ^[ ]*>[ ]? # ">" at the start of a line + .+\n # rest of the first line + (.+\n)* # subsequent consecutive lines + \n* # blanks + )+ + ) + /xm', + array(&$this, '_doBlockQuotes_callback'), $text); + + return $text; + } + function _doBlockQuotes_callback($matches) { + $bq = $matches[1]; + # trim one level of quoting - trim whitespace-only lines + $bq = preg_replace('/^[ ]*>[ ]?|^[ ]+$/m', '', $bq); + $bq = $this->runBlockGamut($bq); # recurse + + $bq = preg_replace('/^/m', " ", $bq); + # These leading spaces cause problem with
       content, 
      +		# so we need to fix that:
      +		$bq = preg_replace_callback('{(\s*
      .+?
      )}sx', + array(&$this, '_DoBlockQuotes_callback2'), $bq); + + return "\n". $this->hashBlock("
      \n$bq\n
      ")."\n\n"; + } + function _doBlockQuotes_callback2($matches) { + $pre = $matches[1]; + $pre = preg_replace('/^ /m', '', $pre); + return $pre; + } + + + function formParagraphs($text) { + # + # Params: + # $text - string to process with html

      tags + # + # Strip leading and trailing lines: + $text = preg_replace('/\A\n+|\n+\z/', '', $text); + + $grafs = preg_split('/\n{2,}/', $text, -1, PREG_SPLIT_NO_EMPTY); + + # + # Wrap

      tags and unhashify HTML blocks + # + foreach ($grafs as $key => $value) { + if (!preg_match('/^B\x1A[0-9]+B$/', $value)) { + # Is a paragraph. + $value = $this->runSpanGamut($value); + $value = preg_replace('/^([ ]*)/', "

      ", $value); + $value .= "

      "; + $grafs[$key] = $this->unhash($value); + } + else { + # Is a block. + # Modify elements of @grafs in-place... + $graf = $value; + $block = $this->html_hashes[$graf]; + $graf = $block; +// if (preg_match('{ +// \A +// ( # $1 =
      tag +//
      ]* +// \b +// markdown\s*=\s* ([\'"]) # $2 = attr quote char +// 1 +// \2 +// [^>]* +// > +// ) +// ( # $3 = contents +// .* +// ) +// (
      ) # $4 = closing tag +// \z +// }xs', $block, $matches)) +// { +// list(, $div_open, , $div_content, $div_close) = $matches; +// +// # We can't call Markdown(), because that resets the hash; +// # that initialization code should be pulled into its own sub, though. +// $div_content = $this->hashHTMLBlocks($div_content); +// +// # Run document gamut methods on the content. +// foreach ($this->document_gamut as $method => $priority) { +// $div_content = $this->$method($div_content); +// } +// +// $div_open = preg_replace( +// '{\smarkdown\s*=\s*([\'"]).+?\1}', '', $div_open); +// +// $graf = $div_open . "\n" . $div_content . "\n" . $div_close; +// } + $grafs[$key] = $graf; + } + } + + return implode("\n\n", $grafs); + } + + + function encodeAttribute($text) { + # + # Encode text for a double-quoted HTML attribute. This function + # is *not* suitable for attributes enclosed in single quotes. + # + $text = $this->encodeAmpsAndAngles($text); + $text = str_replace('"', '"', $text); + return $text; + } + + + function encodeAmpsAndAngles($text) { + # + # Smart processing for ampersands and angle brackets that need to + # be encoded. Valid character entities are left alone unless the + # no-entities mode is set. + # + if ($this->no_entities) { + $text = str_replace('&', '&', $text); + } else { + # Ampersand-encoding based entirely on Nat Irons's Amputator + # MT plugin: + $text = preg_replace('/&(?!#?[xX]?(?:[0-9a-fA-F]+|\w+);)/', + '&', $text);; + } + # Encode remaining <'s + $text = str_replace('<', '<', $text); + + return $text; + } + + + function doAutoLinks($text) { + $text = preg_replace_callback('{<((https?|ftp|dict):[^\'">\s]+)>}i', + array(&$this, '_doAutoLinks_url_callback'), $text); + + # Email addresses: + $text = preg_replace_callback('{ + < + (?:mailto:)? + ( + [-.\w\x80-\xFF]+ + \@ + [-a-z0-9\x80-\xFF]+(\.[-a-z0-9\x80-\xFF]+)*\.[a-z]+ + ) + > + }xi', + array(&$this, '_doAutoLinks_email_callback'), $text); + + return $text; + } + function _doAutoLinks_url_callback($matches) { + $url = $this->encodeAttribute($matches[1]); + $link = "$url"; + return $this->hashPart($link); + } + function _doAutoLinks_email_callback($matches) { + $address = $matches[1]; + $link = $this->encodeEmailAddress($address); + return $this->hashPart($link); + } + + + function encodeEmailAddress($addr) { + # + # Input: an email address, e.g. "foo@example.com" + # + # Output: the email address as a mailto link, with each character + # of the address encoded as either a decimal or hex entity, in + # the hopes of foiling most address harvesting spam bots. E.g.: + # + #

      foo@exampl + # e.com

      + # + # Based by a filter by Matthew Wickline, posted to BBEdit-Talk. + # With some optimizations by Milian Wolff. + # + $addr = "mailto:" . $addr; + $chars = preg_split('/(? $char) { + $ord = ord($char); + # Ignore non-ascii chars. + if ($ord < 128) { + $r = ($seed * (1 + $key)) % 100; # Pseudo-random function. + # roughly 10% raw, 45% hex, 45% dec + # '@' *must* be encoded. I insist. + if ($r > 90 && $char != '@') /* do nothing */; + else if ($r < 45) $chars[$key] = '&#x'.dechex($ord).';'; + else $chars[$key] = '&#'.$ord.';'; + } + } + + $addr = implode('', $chars); + $text = implode('', array_slice($chars, 7)); # text without `mailto:` + $addr = "$text"; + + return $addr; + } + + + function parseSpan($str) { + # + # Take the string $str and parse it into tokens, hashing embeded HTML, + # escaped characters and handling code spans. + # + $output = ''; + + $span_re = '{ + ( + \\\\'.$this->escape_chars_re.' + | + (?no_markup ? '' : ' + | + # comment + | + <\?.*?\?> | <%.*?%> # processing instruction + | + <[/!$]?[-a-zA-Z0-9:]+ # regular tags + (?> + \s + (?>[^"\'>]+|"[^"]*"|\'[^\']*\')* + )? + > + ').' + ) + }xs'; + + while (1) { + # + # Each loop iteration seach for either the next tag, the next + # openning code span marker, or the next escaped character. + # Each token is then passed to handleSpanToken. + # + $parts = preg_split($span_re, $str, 2, PREG_SPLIT_DELIM_CAPTURE); + + # Create token from text preceding tag. + if ($parts[0] != "") { + $output .= $parts[0]; + } + + # Check if we reach the end. + if (isset($parts[1])) { + $output .= $this->handleSpanToken($parts[1], $parts[2]); + $str = $parts[2]; + } + else { + break; + } + } + + return $output; + } + + + function handleSpanToken($token, &$str) { + # + # Handle $token provided by parseSpan by determining its nature and + # returning the corresponding value that should replace it. + # + switch ($token{0}) { + case "\\": + return $this->hashPart("&#". ord($token{1}). ";"); + case "`": + # Search for end marker in remaining text. + if (preg_match('/^(.*?[^`])'.preg_quote($token).'(?!`)(.*)$/sm', + $str, $matches)) + { + $str = $matches[2]; + $codespan = $this->makeCodeSpan($matches[1]); + return $this->hashPart($codespan); + } + return $token; // return as text since no ending marker found. + default: + return $this->hashPart($token); + } + } + + + function outdent($text) { + # + # Remove one level of line-leading tabs or spaces + # + return preg_replace('/^(\t|[ ]{1,'.$this->tab_width.'})/m', '', $text); + } + + + # String length function for detab. `_initDetab` will create a function to + # hanlde UTF-8 if the default function does not exist. + var $utf8_strlen = 'mb_strlen'; + + function detab($text) { + # + # Replace tabs with the appropriate amount of space. + # + # For each line we separate the line in blocks delemited by + # tab characters. Then we reconstruct every line by adding the + # appropriate number of space between each blocks. + + $text = preg_replace_callback('/^.*\t.*$/m', + array(&$this, '_detab_callback'), $text); + + return $text; + } + function _detab_callback($matches) { + $line = $matches[0]; + $strlen = $this->utf8_strlen; # strlen function for UTF-8. + + # Split in blocks. + $blocks = explode("\t", $line); + # Add each blocks to the line. + $line = $blocks[0]; + unset($blocks[0]); # Do not add first block twice. + foreach ($blocks as $block) { + # Calculate amount of space, insert spaces, insert block. + $amount = $this->tab_width - + $strlen($line, 'UTF-8') % $this->tab_width; + $line .= str_repeat(" ", $amount) . $block; + } + return $line; + } + function _initDetab() { + # + # Check for the availability of the function in the `utf8_strlen` property + # (initially `mb_strlen`). If the function is not available, create a + # function that will loosely count the number of UTF-8 characters with a + # regular expression. + # + if (function_exists($this->utf8_strlen)) return; + $this->utf8_strlen = create_function('$text', 'return preg_match_all( + "/[\\\\x00-\\\\xBF]|[\\\\xC0-\\\\xFF][\\\\x80-\\\\xBF]*/", + $text, $m);'); + } + + + function unhash($text) { + # + # Swap back in all the tags hashed by _HashHTMLBlocks. + # + return preg_replace_callback('/(.)\x1A[0-9]+\1/', + array(&$this, '_unhash_callback'), $text); + } + function _unhash_callback($matches) { + return $this->html_hashes[$matches[0]]; + } + +} + +/* + +PHP Markdown +============ + +Description +----------- + +This is a PHP translation of the original Markdown formatter written in +Perl by John Gruber. + +Markdown is a text-to-HTML filter; it translates an easy-to-read / +easy-to-write structured text format into HTML. Markdown's text format +is most similar to that of plain text email, and supports features such +as headers, *emphasis*, code blocks, blockquotes, and links. + +Markdown's syntax is designed not as a generic markup language, but +specifically to serve as a front-end to (X)HTML. You can use span-level +HTML tags anywhere in a Markdown document, and you can use block level +HTML tags (like
      and as well). + +For more information about Markdown's syntax, see: + + + + +Bugs +---- + +To file bug reports please send email to: + + + +Please include with your report: (1) the example input; (2) the output you +expected; (3) the output Markdown actually produced. + + +Version History +--------------- + +See the readme file for detailed release notes for this version. + + +Copyright and License +--------------------- + +PHP Markdown +Copyright (c) 2004-2008 Michel Fortin + +All rights reserved. + +Based on Markdown +Copyright (c) 2003-2006 John Gruber + +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are +met: + +* Redistributions of source code must retain the above copyright notice, + this list of conditions and the following disclaimer. + +* Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + +* Neither the name "Markdown" nor the names of its contributors may + be used to endorse or promote products derived from this software + without specific prior written permission. + +This software is provided by the copyright holders and contributors "as +is" and any express or implied warranties, including, but not limited +to, the implied warranties of merchantability and fitness for a +particular purpose are disclaimed. In no event shall the copyright owner +or contributors be liable for any direct, indirect, incidental, special, +exemplary, or consequential damages (including, but not limited to, +procurement of substitute goods or services; loss of use, data, or +profits; or business interruption) however caused and on any theory of +liability, whether in contract, strict liability, or tort (including +negligence or otherwise) arising in any way out of the use of this +software, even if advised of the possibility of such damage. + +*/ +?> \ No newline at end of file diff --git a/_darcs/pristine/htaccess.sample b/_darcs/pristine/htaccess.sample new file mode 100644 index 0000000000..bd29d318f5 --- /dev/null +++ b/_darcs/pristine/htaccess.sample @@ -0,0 +1,150 @@ +RewriteEngine On + +# NOTE: change this to your actual Laconica path; may be "/". + +RewriteBase /mublog/ + +RewriteRule ^$ index.php?action=public [L,QSA] +RewriteRule ^rss$ index.php?action=publicrss [L,QSA] +RewriteRule ^xrds$ index.php?action=publicxrds [L,QSA] +RewriteRule ^featuredrss$ index.php?action=featuredrss [L,QSA] +RewriteRule ^favoritedrss$ index.php?action=favoritedrss [L,QSA] +RewriteRule ^opensearch/people$ index.php?action=opensearch&type=people [L,QSA] +RewriteRule ^opensearch/notice$ index.php?action=opensearch&type=notice [L,QSA] + +RewriteRule ^doc/about$ index.php?action=doc&title=about [L,QSA] +RewriteRule ^doc/contact$ index.php?action=doc&title=contact [L,QSA] +RewriteRule ^doc/faq$ index.php?action=doc&title=faq [L,QSA] +RewriteRule ^doc/help$ index.php?action=doc&title=help [L,QSA] +RewriteRule ^doc/im$ index.php?action=doc&title=im [L,QSA] +RewriteRule ^doc/openid$ index.php?action=doc&title=openid [L,QSA] +RewriteRule ^doc/openmublog$ index.php?action=doc&title=openmublog [L,QSA] +RewriteRule ^doc/privacy$ index.php?action=doc&title=privacy [L,QSA] +RewriteRule ^doc/source$ index.php?action=doc&title=source [L,QSA] + +RewriteRule ^facebook/$ index.php?action=facebookhome [L,QSA] +RewriteRule ^facebook/index.php$ index.php?action=facebookhome [L,QSA] +RewriteRule ^facebook/settings.php$ index.php?action=facebooksettings [L,QSA] +RewriteRule ^facebook/invite.php$ index.php?action=facebookinvite [L,QSA] +RewriteRule ^facebook/remove$ index.php?action=facebookremove [L,QSA] + +RewriteRule ^main/login$ index.php?action=login [L,QSA] +RewriteRule ^main/logout$ index.php?action=logout [L,QSA] +RewriteRule ^main/register/(.*)$ index.php?action=register&code=$1 [L,QSA] +RewriteRule ^main/register$ index.php?action=register [L,QSA] +RewriteRule ^main/openid$ index.php?action=openidlogin [L,QSA] +RewriteRule ^main/remote$ index.php?action=remotesubscribe [L,QSA] + +RewriteRule ^main/subscribe$ index.php?action=subscribe [L,QSA] +RewriteRule ^main/unsubscribe$ index.php?action=unsubscribe [L,QSA] +RewriteRule ^main/confirmaddress$ index.php?action=confirmaddress [L,QSA] +RewriteRule ^main/confirmaddress/(.*)$ index.php?action=confirmaddress&code=$1 [L,QSA] +RewriteRule ^main/recoverpassword$ index.php?action=recoverpassword [L,QSA] +RewriteRule ^main/recoverpassword/(.*)$ index.php?action=recoverpassword&code=$1 [L,QSA] +RewriteRule ^main/invite$ index.php?action=invite [L,QSA] + +RewriteRule ^main/favor$ index.php?action=favor [L,QSA] +RewriteRule ^main/disfavor$ index.php?action=disfavor [L,QSA] + +RewriteRule ^main/sup$ index.php?action=sup [L,QSA] + +RewriteRule ^main/tagother$ index.php?action=tagother [L,QSA] + +RewriteRule ^main/block$ index.php?action=block [L,QSA] + +RewriteRule ^settings/delete$ index.php?action=deleteprofile [L,QSA] +RewriteRule ^settings/profile$ index.php?action=profilesettings [L,QSA] +RewriteRule ^settings/openid$ index.php?action=openidsettings [L,QSA] +RewriteRule ^settings/im$ index.php?action=imsettings [L,QSA] +RewriteRule ^settings/email$ index.php?action=emailsettings [L,QSA] +RewriteRule ^settings/sms$ index.php?action=smssettings [L,QSA] +RewriteRule ^settings/twitter$ index.php?action=twittersettings [L,QSA] +RewriteRule ^settings/other$ index.php?action=othersettings [L,QSA] + +RewriteRule ^search/people$ index.php?action=peoplesearch [L,QSA] +RewriteRule ^search/notice$ index.php?action=noticesearch [L,QSA] +RewriteRule ^search/notice/rss$ index.php?action=noticesearchrss [L,QSA] + +RewriteRule ^notice/new$ index.php?action=newnotice [L,QSA] +RewriteRule ^notice/(\d+)$ index.php?action=shownotice¬ice=$1 [L,QSA] +RewriteRule ^notice/delete/((\d+))?$ index.php?action=deletenotice¬ice=$2 [L,QSA] +RewriteRule ^notice/delete$ index.php?action=deletenotice [L,QSA] + +RewriteRule ^message/new$ index.php?action=newmessage [L,QSA] +RewriteRule ^message/(\d+)$ index.php?action=showmessage&message=$1 [L,QSA] + +RewriteRule ^user/(\d+)$ index.php?action=userbyid&id=$1 [L,QSA] + +RewriteRule ^tags/?$ index.php?action=tag [L,QSA] +RewriteRule ^tag/([a-zA-Z0-9]+)/rss$ index.php?action=tagrss&tag=$1 [L,QSA] +RewriteRule ^tag(/(.*))?$ index.php?action=tag&tag=$2 [L,QSA] + +RewriteRule ^peopletag/([a-zA-Z0-9]+)$ index.php?action=peopletag&tag=$1 [L,QSA] + +RewriteRule ^featured/?$ index.php?action=featured [L,QSA] +RewriteRule ^favorited/?$ index.php?action=favorited [L,QSA] + +RewriteRule ^(\w+)/subscriptions$ index.php?action=subscriptions&nickname=$1 [L,QSA] +RewriteRule ^(\w+)/subscriptions/([a-zA-Z0-9]+)$ index.php?action=subscriptions&nickname=$1&tag=$2 [L,QSA] +RewriteRule ^(\w+)/subscribers/([a-zA-Z0-9]+)$ index.php?action=subscribers&nickname=$1&tag=$2 [L,QSA] +RewriteRule ^(\w+)/subscribers$ index.php?action=subscribers&nickname=$1 [L,QSA] +RewriteRule ^(\w+)/nudge$ index.php?action=nudge&nickname=$1 [L,QSA] +RewriteRule ^(\w+)/xrds$ index.php?action=xrds&nickname=$1 [L,QSA] +RewriteRule ^(\w+)/rss$ index.php?action=userrss&nickname=$1 [L,QSA] +RewriteRule ^(\w+)/all$ index.php?action=all&nickname=$1 [L,QSA] +RewriteRule ^(\w+)/all/rss$ index.php?action=allrss&nickname=$1 [L,QSA] +RewriteRule ^(\w+)/foaf$ index.php?action=foaf&nickname=$1 [L,QSA] +RewriteRule ^(\w+)/replies$ index.php?action=replies&nickname=$1 [L,QSA] +RewriteRule ^(\w+)/replies/rss$ index.php?action=repliesrss&nickname=$1 [L,QSA] +RewriteRule ^(\w+)/avatar/(original|96|48|24)$ index.php?action=avatarbynickname&nickname=$1&size=$2 [L,QSA] +RewriteRule ^(\w+)/favorites$ index.php?action=showfavorites&nickname=$1 [L,QSA] +RewriteRule ^(\w+)/favorites/rss$ index.php?action=favoritesrss&nickname=$1 [L,QSA] +RewriteRule ^(\w+)/inbox$ index.php?action=inbox&nickname=$1 [L,QSA] +RewriteRule ^(\w+)/outbox$ index.php?action=outbox&nickname=$1 [L,QSA] +RewriteRule ^(\w+)/microsummary$ index.php?action=microsummary&nickname=$1 [L,QSA] + +RewriteRule ^(\w+)$ index.php?action=showstream&nickname=$1 [L,QSA] + +# Twitter-compatible API rewrites +# XXX: Surely these can be refactored a little -- Zach +RewriteRule ^api/statuses/public_timeline(.*)$ index.php?action=api&apiaction=statuses&method=public_timeline$1 [L,QSA] +RewriteRule ^api/statuses/friends_timeline(.*)$ index.php?action=api&apiaction=statuses&method=friends_timeline$1 [L,QSA] +RewriteRule ^api/statuses/user_timeline/(.*)$ index.php?action=api&apiaction=statuses&method=user_timeline&argument=$1 [L,QSA] +RewriteRule ^api/statuses/user_timeline(.*)$ index.php?action=api&apiaction=statuses&method=user_timeline$1 [L,QSA] +RewriteRule ^api/statuses/show/(.*)$ index.php?action=api&apiaction=statuses&method=show&argument=$1 [L,QSA] +RewriteRule ^api/statuses/update(.*)$ index.php?action=api&apiaction=statuses&method=update$1 [L,QSA] +RewriteRule ^api/statuses/replies(.*)$ index.php?action=api&apiaction=statuses&method=replies&argument=$1 [L,QSA] +RewriteRule ^api/statuses/destroy/(.*)$ index.php?action=api&apiaction=statuses&method=destroy&argument=$1 [L,QSA] +RewriteRule ^api/statuses/friends/(.*)$ index.php?action=api&apiaction=statuses&method=friends&argument=$1 [L,QSA] +RewriteRule ^api/statuses/friends(.*)$ index.php?action=api&apiaction=statuses&method=friends$1 [L,QSA] +RewriteRule ^api/statuses/followers/(.*)$ index.php?action=api&apiaction=statuses&method=followers&argument=$1 [L,QSA] +RewriteRule ^api/statuses/followers(.*)$ index.php?action=api&apiaction=statuses&method=followers$1 [L,QSA] +RewriteRule ^api/statuses/featured(.*)$ index.php?action=api&apiaction=statuses&method=featured$1 [L,QSA] +RewriteRule ^api/users/show/(.*)$ index.php?action=api&apiaction=users&method=show&argument=$1 [L,QSA] +RewriteRule ^api/users/show(.*)$ index.php?action=api&apiaction=users&method=show$1 [L,QSA] +RewriteRule ^api/direct_messages/sent(.*)$ index.php?action=api&apiaction=direct_messages&method=sent$1 [L,QSA] +RewriteRule ^api/direct_messages/destroy/(.*)$ index.php?action=api&apiaction=direct_messages&method=destroy&argument=$1 [L,QSA] +RewriteRule ^api/direct_messages/new(.*)$ index.php?action=api&apiaction=direct_messages&method=create$1 [L,QSA] +RewriteRule ^api/direct_messages(.*)$ index.php?action=api&apiaction=direct_messages&method=direct_messages$1 [L,QSA] +RewriteRule ^api/friendships/create/(.*)$ index.php?action=api&apiaction=friendships&method=create&argument=$1 [L,QSA] +RewriteRule ^api/friendships/destroy/(.*)$ index.php?action=api&apiaction=friendships&method=destroy&argument=$1 [L,QSA] +RewriteRule ^api/friendships/exists(.*)$ index.php?action=api&apiaction=friendships&method=exists$1 [L,QSA] +RewriteRule ^api/account/verify_credentials(.*)$ index.php?action=api&apiaction=account&method=verify_credentials$1 [L,QSA] +RewriteRule ^api/account/end_session$ index.php?action=api&apiaction=account&method=end_session$1 [L,QSA] +RewriteRule ^api/account/update_location(.*)$ index.php?action=api&apiaction=account&method=update_location$1 [L,QSA] +RewriteRule ^api/account/update_delivery_device(.*)$ index.php?action=api&apiaction=account&method=update_delivery_device$1 [L,QSA] +RewriteRule ^api/account/rate_limit_status(.*)$ index.php?action=api&apiaction=account&method=rate_limit_status$1 [L,QSA] +RewriteRule ^api/favorites/create/(.*)$ index.php?action=api&apiaction=favorites&method=create&argument=$1 [L,QSA] +RewriteRule ^api/favorites/destroy/(.*)$ index.php?action=api&apiaction=favorites&method=destroy&argument=$1 [L,QSA] +RewriteRule ^api/favorites/(.*)$ index.php?action=api&apiaction=favorites&method=favorites&argument=$1 [L,QSA] +RewriteRule ^api/favorites(.*)$ index.php?action=api&apiaction=favorites&method=favorites$1 [L,QSA] +RewriteRule ^api/notifications/follow/(.*)$ index.php?action=api&apiaction=notifications&method=follow&argument=$1 [L,QSA] +RewriteRule ^api/notifications/leave/(.*)$ index.php?action=api&apiaction=notifications&method=leave&argument=$1 [L,QSA] +RewriteRule ^api/blocks/create/(.*)$ index.php?action=api&apiaction=blocks&method=create&argument=$1 [L,QSA] +RewriteRule ^api/blocks/destroy/(.*)$ index.php?action=api&apiaction=blocks&method=destroy&argument=$1 [L,QSA] +RewriteRule ^api/help/(.*)$ index.php?action=api&apiaction=help&method=$1 [L,QSA] + + + Order allow,deny + + diff --git a/_darcs/pristine/index.php b/_darcs/pristine/index.php new file mode 100644 index 0000000000..d387740fc2 --- /dev/null +++ b/_darcs/pristine/index.php @@ -0,0 +1,70 @@ +. + */ + +define('INSTALLDIR', dirname(__FILE__)); +define('LACONICA', true); + +require_once(INSTALLDIR . "/lib/common.php"); + +# get and cache current user + +$user = common_current_user(); + +# initialize language env + +common_init_language(); + +$action = $_REQUEST['action']; + +if (!$action || !preg_match('/^[a-zA-Z0-9_-]*$/', $action)) { + common_redirect(common_local_url('public')); +} + +// If the site is private, and they're not on one of the "public" +// parts of the site, redirect to login + +if (!$user && common_config('site', 'private') && + !in_array($action, array('login', 'openidlogin', 'finishopenidlogin', + 'recoverpassword', 'api', 'doc', 'register'))) +{ + common_redirect(common_local_url('login')); +} + +$actionfile = INSTALLDIR."/actions/$action.php"; + +if (file_exists($actionfile)) { + require_once($actionfile); + $action_class = ucfirst($action)."Action"; + $action_obj = new $action_class(); + if ($config['db']['mirror'] && $action_obj->is_readonly()) { + if (is_array($config['db']['mirror'])) { + # "load balancing", ha ha + $k = array_rand($config['db']['mirror']); + $mirror = $config['db']['mirror'][$k]; + } else { + $mirror = $config['db']['mirror']; + } + $config['db']['database'] = $mirror; + } + if (call_user_func(array($action_obj, 'prepare'), $_REQUEST)) { + call_user_func(array($action_obj, 'handle'), $_REQUEST); + } +} else { + common_user_error(_('Unknown action')); +} \ No newline at end of file diff --git a/_darcs/pristine/js/jquery.form.js b/_darcs/pristine/js/jquery.form.js new file mode 100644 index 0000000000..cb8b5a6609 --- /dev/null +++ b/_darcs/pristine/js/jquery.form.js @@ -0,0 +1,632 @@ +/* + * jQuery Form Plugin + * version: 2.17 (06-NOV-2008) + * @requires jQuery v1.2.2 or later + * + * Examples and documentation at: http://malsup.com/jquery/form/ + * Dual licensed under the MIT and GPL licenses: + * http://www.opensource.org/licenses/mit-license.php + * http://www.gnu.org/licenses/gpl.html + * + * Revision: $Id$ + */ +;(function($) { + +/* + Usage Note: + ----------- + Do not use both ajaxSubmit and ajaxForm on the same form. These + functions are intended to be exclusive. Use ajaxSubmit if you want + to bind your own submit handler to the form. For example, + + $(document).ready(function() { + $('#myForm').bind('submit', function() { + $(this).ajaxSubmit({ + target: '#output' + }); + return false; // <-- important! + }); + }); + + Use ajaxForm when you want the plugin to manage all the event binding + for you. For example, + + $(document).ready(function() { + $('#myForm').ajaxForm({ + target: '#output' + }); + }); + + When using ajaxForm, the ajaxSubmit function will be invoked for you + at the appropriate time. +*/ + +/** + * ajaxSubmit() provides a mechanism for immediately submitting + * an HTML form using AJAX. + */ +$.fn.ajaxSubmit = function(options) { + // fast fail if nothing selected (http://dev.jquery.com/ticket/2752) + if (!this.length) { + log('ajaxSubmit: skipping submit process - no element selected'); + return this; + } + + if (typeof options == 'function') + options = { success: options }; + + options = $.extend({ + url: this.attr('action') || window.location.toString(), + type: this.attr('method') || 'GET' + }, options || {}); + + // hook for manipulating the form data before it is extracted; + // convenient for use with rich editors like tinyMCE or FCKEditor + var veto = {}; + this.trigger('form-pre-serialize', [this, options, veto]); + if (veto.veto) { + log('ajaxSubmit: submit vetoed via form-pre-serialize trigger'); + return this; + } + + // provide opportunity to alter form data before it is serialized + if (options.beforeSerialize && options.beforeSerialize(this, options) === false) { + log('ajaxSubmit: submit aborted via beforeSerialize callback'); + return this; + } + + var a = this.formToArray(options.semantic); + if (options.data) { + options.extraData = options.data; + for (var n in options.data) { + if(options.data[n] instanceof Array) { + for (var k in options.data[n]) + a.push( { name: n, value: options.data[n][k] } ) + } + else + a.push( { name: n, value: options.data[n] } ); + } + } + + // give pre-submit callback an opportunity to abort the submit + if (options.beforeSubmit && options.beforeSubmit(a, this, options) === false) { + log('ajaxSubmit: submit aborted via beforeSubmit callback'); + return this; + } + + // fire vetoable 'validate' event + this.trigger('form-submit-validate', [a, this, options, veto]); + if (veto.veto) { + log('ajaxSubmit: submit vetoed via form-submit-validate trigger'); + return this; + } + + var q = $.param(a); + + if (options.type.toUpperCase() == 'GET') { + options.url += (options.url.indexOf('?') >= 0 ? '&' : '?') + q; + options.data = null; // data is null for 'get' + } + else + options.data = q; // data is the query string for 'post' + + var $form = this, callbacks = []; + if (options.resetForm) callbacks.push(function() { $form.resetForm(); }); + if (options.clearForm) callbacks.push(function() { $form.clearForm(); }); + + // perform a load on the target only if dataType is not provided + if (!options.dataType && options.target) { + var oldSuccess = options.success || function(){}; + callbacks.push(function(data) { + $(options.target).html(data).each(oldSuccess, arguments); + }); + } + else if (options.success) + callbacks.push(options.success); + + options.success = function(data, status) { + for (var i=0, max=callbacks.length; i < max; i++) + callbacks[i].apply(options, [data, status, $form]); + }; + + // are there files to upload? + var files = $('input:file', this).fieldValue(); + var found = false; + for (var j=0; j < files.length; j++) + if (files[j]) + found = true; + + // options.iframe allows user to force iframe mode + if (options.iframe || found) { + // hack to fix Safari hang (thanks to Tim Molendijk for this) + // see: http://groups.google.com/group/jquery-dev/browse_thread/thread/36395b7ab510dd5d + if ($.browser.safari && options.closeKeepAlive) + $.get(options.closeKeepAlive, fileUpload); + else + fileUpload(); + } + else + $.ajax(options); + + // fire 'notify' event + this.trigger('form-submit-notify', [this, options]); + return this; + + + // private function for handling file uploads (hat tip to YAHOO!) + function fileUpload() { + var form = $form[0]; + + if ($(':input[@name=submit]', form).length) { + alert('Error: Form elements must not be named "submit".'); + return; + } + + var opts = $.extend({}, $.ajaxSettings, options); + var s = jQuery.extend(true, {}, $.extend(true, {}, $.ajaxSettings), opts); + + var id = 'jqFormIO' + (new Date().getTime()); + var $io = $('