summary refs log tree commit diff
path: root/synapse (follow)
Commit message (Expand)AuthorAgeFilesLines
...
| * | Bump version v0.5.3cErik Johnston2014-12-021-1/+1
| * | SYN-187: Set a more sensible default for the content_addr v0.5.3bMark Haines2014-12-021-2/+5
* | | Begin fleshing out a new Event objectErik Johnston2014-12-022-0/+194
* | | Change DomainSpecificString so that it doesn't use a HomeServer objectErik Johnston2014-12-0212-66/+63
* | | Store full JSON of events in dbErik Johnston2014-12-013-56/+50
|/ /
* | Bump version v0.5.3aErik Johnston2014-11-271-1/+1
* | Bump version and changelogErik Johnston2014-11-271-1/+1
* | Don't return outliers when we get recent events for rooms.Erik Johnston2014-11-271-1/+1
* | Fix bugs when joining a remote room that has dodgy event graphs. This should ...Erik Johnston2014-11-272-30/+63
* | on_receive_pdu takes more argsErik Johnston2014-11-271-3/+3
* | Change the way we get missing auth and state eventsErik Johnston2014-11-272-44/+106
* | Re-sign events when we return them via federation as a temporary hack to work...Erik Johnston2014-11-271-0/+11
* | Attempt to fix bug where we 500d an event stream due to trying to cancel a ti...Erik Johnston2014-11-261-3/+9
* | Add a workaround for bug where some initial join events don't reference creat...Erik Johnston2014-11-261-1/+7
* | Catch exceptions when trying to add an entry to rooms tablesErik Johnston2014-11-261-6/+11
* | Bump version and changelog v0.5.2Erik Johnston2014-11-261-1/+1
* | Don't delete the entire current_state_events tableErik Johnston2014-11-261-1/+4
* | Bump version numbers and change logErik Johnston2014-11-261-1/+1
* | Add update delta for schema changeErik Johnston2014-11-262-1/+35
* | Update schema to support multiple signaturesErik Johnston2014-11-261-1/+1
* | Correctly handle the case where we get an event for an unknown room, which tu...Erik Johnston2014-11-265-47/+99
* | Fix bugs in invite/join dances.Erik Johnston2014-11-256-135/+194
* | Don't double url-decode state event types.Kegan Dougal2014-11-251-1/+1
|/
* Drop log level for incorrect logging contexts to WARN if the context is wrong...Mark Haines2014-11-251-5/+8
* Mark the auth events as possible outlierErik Johnston2014-11-241-0/+1
* Add missing None checkErik Johnston2014-11-241-1/+1
* Ask for any auth events that we don't haveErik Johnston2014-11-241-0/+15
* We don't always want to Auth get_persisted_pduErik Johnston2014-11-242-11/+20
* SYN-163: Add an order by rowid to selects.Erik Johnston2014-11-241-5/+10
* typosMatthew Hodgson2014-11-241-2/+2
* Return 404 M_NOT_FOUND when trying to look up a room alias that doesn't existMark Haines2014-11-211-12/+24
* SYN-58: Allow passing explicit limit=0 to initialSync to request no messages ...Paul "LeoNerd" Evans2014-11-202-7/+7
* Fix pep8 and pyflakes warningsMark Haines2014-11-206-12/+21
* Merge branch 'develop' into http_client_refactorDavid Baker2014-11-2035-140/+193
|\
| * Fix pep8 codestyle warningsMark Haines2014-11-2021-47/+71
| * Use module loggers rather than the root logger. Exceptions caused by bad clie...Mark Haines2014-11-208-10/+17
| * Add a few missing yields, Move deferred lists inside PreserveLoggingContext b...Mark Haines2014-11-2015-85/+107
* | Separate out the matrix http client completely because just about all of its ...David Baker2014-11-208-337/+361
* | Oops, I removed this param.David Baker2014-11-201-2/+0
* | Refactor the HTTP clients a little.David Baker2014-11-204-86/+82
* | CaptchaServerHttpClient should extend the base, not matrix http client.David Baker2014-11-201-1/+1
|/
* Merge branch 'master' into developMark Haines2014-11-202-2/+2
|\
| * Merge branch 'develop' of github.com:matrix-org/synapse into release-v0.5.0Erik Johnston2014-11-192-4/+0
| |\
| * | Bump version, changelog and upgrade.rstErik Johnston2014-11-192-2/+2
* | | SYN-153: Fix formatting of federation error messageMark Haines2014-11-201-1/+1
| |/ |/|
* | Don't add a 'prev' key to m.room.member messagesErik Johnston2014-11-192-4/+0
|/
* Initialise UserPresenceCache instances to always contain a 'presence' keyPaul "LeoNerd" Evans2014-11-191-4/+2
* Fix backfill requestErik Johnston2014-11-191-1/+1
* Only users can set state events which have their own user_idErik Johnston2014-11-191-0/+20
* Sometimes there isn't a current logging contextMark Haines2014-11-191-1/+1
* SYN-153: Raise 404 if room alias is not foundMark Haines2014-11-191-4/+8
* remove unused importMark Haines2014-11-191-1/+1
* replace user_id with senderMark Haines2014-11-192-1/+6
* Preserve logging context in a few more places, drop the logging context after...Mark Haines2014-11-194-22/+37
* SYN-141: Encode query params as UTF-8.Mark Haines2014-11-181-1/+7
* SYN-144: Remove bad keys from pdu json objects, convert age_ts to ageMark Haines2014-11-182-15/+29
* Remember also to UTF-8 decode bytes in room alias names in directory server URLsPaul "LeoNerd" Evans2014-11-181-3/+9
* Remember to URL decode the room_id in room initialSyncPaul "LeoNerd" Evans2014-11-181-1/+1
* SYN-141: Decode the query params as UTF-8Mark Haines2014-11-181-1/+2
* Remove unused variableMark Haines2014-11-181-1/+1
* SYN-104: When going backwards the end token should be before the last eventMark Haines2014-11-181-0/+3
* Merge pull request #17 from matrix-org/room-initial-syncPaul Evans2014-11-183-26/+88
|\
| * Ensure to parse a real pagination config object out of room initialSync reque...Paul "LeoNerd" Evans2014-11-181-2/+4
| * Rename message handler's new snapshot_room to room_initial_sync() as that bet...Paul "LeoNerd" Evans2014-11-182-2/+2
| * Merge remote-tracking branch 'origin/develop' into room-initial-syncPaul "LeoNerd" Evans2014-11-187-81/+122
| |\
| * | Include room members' presence in room initialSyncPaul "LeoNerd" Evans2014-11-181-1/+22
| * | Added ability to .get_state() from the PresenceHandler by returning a complet...Paul "LeoNerd" Evans2014-11-181-2/+15
| * | Don't expect all _user_cachemap entries to definitely contain a "last_active"...Paul "LeoNerd" Evans2014-11-181-3/+3
| * | Include 'messages' snapshot in room initialSyncPaul "LeoNerd" Evans2014-11-181-1/+20
| * | Merge branch 'develop' into room-initial-syncPaul "LeoNerd" Evans2014-11-1756-2974/+3391
| |\ \
| * | | Include room membership in room initialSyncPaul "LeoNerd" Evans2014-11-101-1/+7
| * | | Put room state in room initialSync output - I guess this is right; I really c...Paul "LeoNerd" Evans2014-11-101-2/+5
| * | | Have room initialSync return the room's room_idPaul "LeoNerd" Evans2014-11-102-21/+17
* | | | Revert accidental commit of bad fileErik Johnston2014-11-181-37/+24
| |_|/ |/| |
* | | Null check when determining default power levelsMark Haines2014-11-181-1/+2
* | | SYN-149: Enable auth for events added during room creation since they should ...Mark Haines2014-11-181-1/+1
* | | Fix auth to correctly handle initial creation of roomsErik Johnston2014-11-182-27/+58
* | | SYN-149: Send join event immediately after the room create eventMark Haines2014-11-183-26/+31
* | | Split out sending the room alias events from creating the alias so that we ca...Mark Haines2014-11-184-27/+31
* | | Stop before starting when restartingMark Haines2014-11-171-1/+1
| |/ |/|
* | SYN-148: Add the alias after creating the roomMark Haines2014-11-171-9/+9
* | These lines aren't doing anythingMark Haines2014-11-171-5/+0
* | Merge PDUs and Events into one objectMark Haines2014-11-148-206/+84
* | Fix PDU and event signaturesMark Haines2014-11-144-6/+16
* | Validate signatures on incoming eventsMark Haines2014-11-142-6/+49
* | Be more helpful and tell the user how to generate a config too.David Baker2014-11-141-1/+4
* | Adding --generate-config will not help if the user has not specified a config...David Baker2014-11-141-1/+1
* | Merge branch 'develop' into request_loggingMark Haines2014-11-1450-2825/+3162
|\ \
| * | SYN-103: Remove "origin" and "destination" keys from edusMark Haines2014-11-131-5/+4
| * | SYN-138: Rewrite synctl in python and include it in the python distributionMark Haines2014-11-131-0/+66
| * | Store all signatures on events rather than just dropping themErik Johnston2014-11-124-21/+31
| * | Add a few more comments to the federation handlerErik Johnston2014-11-121-0/+32
| * | Update some of the docs in event_federationErik Johnston2014-11-121-11/+20
| * | Document StateStore and use transactionsErik Johnston2014-11-121-28/+56
| * | Add indices to state group tablesErik Johnston2014-11-121-0/+13
| * | Fix pyflake warnings and add a FIXME comment to deal with auth_chains receive...Erik Johnston2014-11-121-3/+6
| * | Fix bugs with invites/joins across federatiom.Erik Johnston2014-11-126-26/+45
| * | PEP8ifyErik Johnston2014-11-111-9/+12
| * | Only allow people in a room to look up room state.Erik Johnston2014-11-111-34/+4
| * | synapse.state docs.Erik Johnston2014-11-111-0/+35
| * | Rename annotate_state_groups to annotate_event_with_stateErik Johnston2014-11-113-9/+9
| * | Merge pull request #12 from matrix-org/federation_authorizationMark Haines2014-11-1146-2764/+2902
| |\ \
| | * | Fix bugs which broke federation due to changes in function signatures.Erik Johnston2014-11-112-3/+3
| | * | Fix bug where we /always/ created a new state groupErik Johnston2014-11-113-31/+42
| | * | Fix typo in validatorErik Johnston2014-11-111-2/+8
| | * | Add EventValidator moduleErik Johnston2014-11-111-0/+81
| | * | Add an EventValidator. Fix bugs in auth ++ storageErik Johnston2014-11-109-90/+64
| | * | Fix regression where we did not return redacted events.Erik Johnston2014-11-101-1/+2
| | * | PEP8Erik Johnston2014-11-108-20/+22
| | * | Remove useless commentsErik Johnston2014-11-101-23/+0
| | * | Add auth to the various server-server APIsErik Johnston2014-11-103-9/+23
| | * | Fix backfill to work. Add auth to backfill requestErik Johnston2014-11-106-18/+56
| | * | Notify users about invites.Erik Johnston2014-11-103-10/+14
| | * | Fix invite authErik Johnston2014-11-101-3/+5
| | * | Tidy up some of the unused sql tablesErik Johnston2014-11-104-109/+9
| | * | Finish redaction algorithm.Erik Johnston2014-11-105-25/+33
| | * | Use current state to get room hosts, rather than querying the databaseErik Johnston2014-11-072-7/+32
| | * | Add '/event_auth/' federation apiErik Johnston2014-11-074-7/+55
| | * | Implement invite part of invite join danceErik Johnston2014-11-074-22/+75
| | * | Remove /context/ requestErik Johnston2014-11-072-16/+0
| | * | Add hash of current state to eventsErik Johnston2014-11-072-1/+11
| | * | Return auth chain when handling send_joinErik Johnston2014-11-072-8/+27
| | * | Fix bug in _get_auth_chain_txnErik Johnston2014-11-071-14/+11
| | * | Merge branch 'develop' of github.com:matrix-org/synapse into federation_autho...Erik Johnston2014-11-072-4/+7
| | |\|
| | * | Fix joining over federationErik Johnston2014-11-075-56/+55
| | * | Implement method to get auth_chain from a given event_idErik Johnston2014-11-071-0/+35
| | * | Start implementing auth chainsErik Johnston2014-11-078-6/+115
| | * | Neaten things up a bitErik Johnston2014-11-071-5/+2
| | * | Don't query the DB for user power levelsErik Johnston2014-11-071-10/+16
| | * | Amalgamate all power levels.Erik Johnston2014-11-068-395/+102
| | * | Update to use replaces_state rather than prev_stateErik Johnston2014-11-061-2/+4
| | * | Don't send prev_state to clients anymoreErik Johnston2014-11-061-1/+1
| | * | Implement new replace_state and changed prev_stateErik Johnston2014-11-0613-128/+220
| | * | Get correct prev_eventsErik Johnston2014-11-052-15/+26
| | * | Fix auth checks to all use the given old_event_stateErik Johnston2014-11-054-34/+54
| | * | Fix room handler testsErik Johnston2014-11-041-1/+0
| | * | Don't bother lockingErik Johnston2014-11-041-6/+5
| | * | Fix bug in replicationErik Johnston2014-11-041-1/+1
| | * | On AuthError, raise a FederationErrorErik Johnston2014-11-041-1/+9
| | * | Move FederationError to synapse.api.errorsErik Johnston2014-11-042-34/+34
| | * | PEP8Erik Johnston2014-11-041-4/+13
| | * | Add support for sending failuresErik Johnston2014-11-043-2/+63
| | * | Remove unused interfaceErik Johnston2014-11-041-8/+0
| | * | Remove unused importsErik Johnston2014-11-045-13/+2
| | * | Fix bugs in generating event signatures and hashingErik Johnston2014-11-034-83/+42
| | * | Add option to not bind to HTTPS port. This is useful if running behind an ssl...Erik Johnston2014-11-032-1/+7
| | * | Rename PDU fields to match that of events.Erik Johnston2014-11-036-316/+80
| | * | For now, don't store txn -> pdu mappings.Erik Johnston2014-11-032-5/+3
| | * | FormattingErik Johnston2014-11-031-1/+4
| | * | Sign events we create.Erik Johnston2014-11-031-0/+9
| | * | Add 'origin' key to eventsErik Johnston2014-11-031-0/+4
| | * | Don't assume event has hashes key alreadyErik Johnston2014-11-031-0/+2
| | * | Remove dead code.Erik Johnston2014-11-031-84/+0
| | * | Merge branch 'develop' of github.com:matrix-org/synapse into federation_autho...Erik Johnston2014-11-032-3/+2
| | |\ \
| | * | | Sign evnetsErik Johnston2014-10-312-0/+26
| | * | | Remove unused signature storage methodsErik Johnston2014-10-311-138/+1
| | * | | Remove unused sql file.Erik Johnston2014-10-311-31/+0
| | * | | Make prev_event signing work again.Erik Johnston2014-10-313-8/+18
| | * | | Remove more references to dead PDU tablesErik Johnston2014-10-314-94/+8
| | * | | Remove PDU tables.Erik Johnston2014-10-316-1230/+2
| | * | | Remove unused functions.Erik Johnston2014-10-311-90/+0
| | * | | Actually don't store any PDUsErik Johnston2014-10-313-14/+42
| | * | | old_state_events should be a dict not listErik Johnston2014-10-311-2/+4
| | * | | Don't store any PDUsErik Johnston2014-10-312-32/+33
| | * | | Move the impl of backfill to use events.Erik Johnston2014-10-313-5/+114
| | * | | Fix bug in redaction auth.Erik Johnston2014-10-311-2/+2
| | * | | Convert event ids to be of the form :example.comErik Johnston2014-10-306-28/+54
| | * | | Make federation return the old current state, so that we can use it to do authErik Johnston2014-10-302-10/+32
| | * | | Merge branch 'develop' of github.com:matrix-org/synapse into federation_autho...Erik Johnston2014-10-3040-186/+224
| | |\ \ \
| | * | | | Fix SQL so that accepts we may want to persist events twice.Erik Johnston2014-10-302-25/+47
| | * | | | Add a run_on_reactor functionErik Johnston2014-10-291-0/+7
| | * | | | Start filling out and using new events tablesErik Johnston2014-10-298-93/+159
| | * | | | Don't reference PDU when persisting eventErik Johnston2014-10-282-4/+5
| | * | | | Begin implementing all the PDU storage stuff in Events landErik Johnston2014-10-289-42/+485
| | * | | | Add transaction level logging and timing information. Add a _simple_delete me...Erik Johnston2014-10-289-21/+91
| | * | | | Clean up LoggingTransactionErik Johnston2014-10-281-10/+4
| | * | | | Add timer to LoggingTransactionErik Johnston2014-10-281-3/+10
| | * | | | Remove duplicate importErik Johnston2014-10-271-1/+0
| | * | | | Merge branch 'event_signing' of github.com:matrix-org/synapse into federation...Erik Johnston2014-10-2716-51/+450
| | |\ \ \ \
| | | * | | | fix pyflakes warningsMark Haines2014-10-273-6/+6
| | | * | | | Merge branch 'develop' into event_signingMark Haines2014-10-2714-21/+108
| | | |\ \ \ \
| | | * | | | | Remove signatures from pdu when computing hashes to use for prev pdus, make s...Mark Haines2014-10-172-2/+6
| | | * | | | | Merge branch 'develop' into event_signingMark Haines2014-10-1710-37/+32
| | | |\ \ \ \ \
| | | * | | | | | Rename 'meta' to 'unsigned'Mark Haines2014-10-173-9/+10
| | | * | | | | | move 'age' into 'meta' subdict so that it is clearer that it is not part of t...Mark Haines2014-10-172-7/+19
| | | * | | | | | Hash the same content covered by the signature when referencing previous PDUs...Mark Haines2014-10-176-16/+84
| | | * | | | | | Include hashes of previous pdus when referencing themMark Haines2014-10-169-28/+92
| | | * | | | | | Sign outgoing PDUs.Mark Haines2014-10-164-9/+14
| | | * | | | | | persist hashes and origin signatures for PDUsMark Haines2014-10-156-14/+132
| | | * | | | | | Merge branch 'develop' into event_signingMark Haines2014-10-152-3/+7
| | | |\ \ \ \ \ \
| | | * | | | | | | Storage for pdu signaturesMark Haines2014-10-142-0/+126
| | * | | | | | | | Merge branch 'develop' of github.com:matrix-org/synapse into federation_autho...Erik Johnston2014-10-2719-59/+138
| | |\ \ \ \ \ \ \ \
| | * | | | | | | | | It doesn't want a dictErik Johnston2014-10-171-2/+0
| | * | | | | | | | | Fix bug where people could join private roomsErik Johnston2014-10-173-45/+63
| | * | | | | | | | | Use state groups to get current state. Make join dance actually work.Erik Johnston2014-10-1710-67/+226
| | * | | | | | | | | Finish implementing the new join dance.Erik Johnston2014-10-176-126/+222
| | * | | | | | | | | Start implementing the invite/join dance. Continue moving auth to use event.s...Erik Johnston2014-10-164-22/+133
| | * | | | | | | | | Begin making auth use event.old_state_eventsErik Johnston2014-10-1510-83/+115
| | * | | | | | | | | Add missing package storate.stateErik Johnston2014-10-151-0/+97
| | * | | | | | | | | Begin implementing state groups.Erik Johnston2014-10-143-3/+123
| * | | | | | | | | | apply some cache headers to try to make the content repo less nutsoMatthew Hodgson2014-11-111-0/+8
| | |_|_|_|_|_|_|_|/ | |/| | | | | | | |
| * | | | | | | | | Fix url decoding bugs with /redact and /send APIs.Kegan Dougal2014-11-051-2/+2
| * | | | | | | | | Be sure to urlencode/decode event types correctly in both the web client and HS.Kegan Dougal2014-11-051-1/+1
| * | | | | | | | | Determine webclient path by the python module it is contained inMark Haines2014-11-041-1/+4
| | |_|_|_|_|_|_|/ | |/| | | | | | |
| * | | | | | | | Use python logger, not the twisted loggerErik Johnston2014-11-031-2/+1
| * | | | | | | | Bump version numbers and change logErik Johnston2014-10-311-1/+1
| | |_|_|_|_|_|/ | |/| | | | | |
* | | | | | | | Remove unused 'context' variables to appease pyflakesMark Haines2014-10-301-2/+2
* | | | | | | | Merge branch 'develop' into request_loggingMark Haines2014-10-3038-178/+219
|\| | | | | | |
| * | | | | | | Fix pep8 warningsMark Haines2014-10-3035-135/+179
| * | | | | | | Use floating-point rather than integer division to handle timeouts so that no...Paul "LeoNerd" Evans2014-10-291-1/+1
| * | | | | | | Fix an off-by-one bug in presence event stream pagination; this might be resp...Paul "LeoNerd" Evans2014-10-291-1/+1
| * | | | | | | Construct a source-specific 'SourcePaginationConfig' to pass into get_paginat...Paul "LeoNerd" Evans2014-10-296-40/+43
| * | | | | | | Remove redundant (and incorrect) presence pagination fetching codePaul "LeoNerd" Evans2014-10-291-3/+0
* | | | | | | | Pep8 and a few doc stringsMark Haines2014-10-302-17/+40
* | | | | | | | Add a request-id to each log lineMark Haines2014-10-309-30/+161
|/ / / / / / /
* | | | | | | Remove duplicate join_event from create_roomMark Haines2014-10-271-5/+0
* | | | | | | Remove test_pyflakes.Kegan Dougal2014-10-271-1/+0
| |_|_|_|_|/ |/| | | | |
* | | | | | Test pyflakes jenikns integrationMark Haines2014-10-271-0/+1
* | | | | | Fix pyflakes warningsMark Haines2014-10-274-4/+2
| |/ / / / |/| | | |
* | | | | Add log message if we can't enable ECC. Require pyopenssl>=0.14 since 0.13 do...Mark Haines2014-10-241-1/+4
* | | | | Wrap preparing the database in a transaction. Otherwise it will take many sec...Mark Haines2014-10-241-3/+4
* | | | | Coturn's timestamps are in seconds, not millisecondsDavid Baker2014-10-211-1/+1
* | | | | Add get_json method to 3pid http client. Better logging for errors in 3pid re...Mark Haines2014-10-202-2/+41
* | | | | Fix auto generating signing_keysMark Haines2014-10-181-1/+1
* | | | | Bump the other version v0.4.1Erik Johnston2014-10-181-1/+1
* | | | | Check that we have auth headers and fail nicelyErik Johnston2014-10-171-0/+5
* | | | | More log lines.Erik Johnston2014-10-171-7/+15
* | | | | add log line for checking verifying signaturesMark Haines2014-10-171-0/+1
* | | | | Bump version and changelogErik Johnston2014-10-171-1/+1
* | | | | Bump database version number.Erik Johnston2014-10-172-1/+32
| |_|_|/ |/| | |
* | | | keep 'origin_server_ts' as 'ts' in the database to avoid needlessly updating ...Mark Haines2014-10-177-11/+16
* | | | SPEC-7: Rename 'ts' to 'origin_server_ts'Mark Haines2014-10-1710-27/+27
* | | | SPEC-7: Don't stamp event contents with 'hsob_ts'Mark Haines2014-10-171-13/+3
* | | | Make sure to return an empty JSON object ({}) from presence PUT/POST requests...Paul "LeoNerd" Evans2014-10-141-2/+2
| |_|/ |/| |
* | | SYN-103: Ignore the 'origin' key in received EDUs. Instead take the origin fr...Mark Haines2014-10-142-3/+7
| |/ |/|
* | remove debugging logging for signing requestsMark Haines2014-10-141-4/+0
|/
* Better response message when signature is missing or unsupportedMark Haines2014-10-131-1/+1
* Respond with more helpful error messages for unsigned requestsMark Haines2014-10-136-10/+45
* Raise a SynapseError if the authorisation header is missing or malformedMark Haines2014-10-131-19/+27
* Remove debug logging, raise a proper SynapseError if the auth header is missingMark Haines2014-10-131-5/+4
* Verify signatures for server2server requestsMark Haines2014-10-133-25/+96
* SYN-75 sign at the request level rather than the transaction levelMark Haines2014-10-134-35/+53
* Merge branch 'develop' into server2server_signingMark Haines2014-10-131-11/+35
|\
| * Replace on_send_callback with something a bit clearer so that we can sign mes...Mark Haines2014-10-131-11/+35
* | Merge branch develop into server2server_signingMark Haines2014-10-138-170/+162
|\|
| * Fix pyflakes errorsMark Haines2014-10-022-9/+3
| * Add a keyword argument to get_json to avoid retrying on DNS failures. Rather ...Mark Haines2014-10-024-15/+11
| * Merge branch 'master' into developDavid Baker2014-10-021-1/+2
| |\
| | * Fix ncorrect ports in documentation and add notes on how generate-config also...David Baker2014-10-021-1/+2
| * | Split PlainHttpClient into separate clients for talking to Identity servers a...Mark Haines2014-10-025-154/+161