- 16 Dec, 2011 5 commits
-
-
* imap4d/imap4d.h: Include mailutils/imaputil.h * imap4d/list.c: Use mu_folder_imap_match/mu_imap_wildmatch. * imap4d/lsub.c: Likewise. * imap4d/util.c (util_wcard_match): Move as to libmailutils as mu_imap_wildmatch. * include/mailutils/imaputil.h: New file. * include/mailutils/Makefile.am (pkginclude_HEADERS): Add imaputil.h * include/mailutils/folder.h (mu_folder_imap_match) (mu_folder_glob_match): New protos. * include/mailutils/imapio.h (mu_imap_flag_to_attribute) (mu_imap_format_flags): Move to imaputil.h * libmailutils/imapio/wildmatch.c: New file. * libmailutils/imapio/sendflg.c: New file. * libmailutils/imapio/Makefile.am (libimapio_la_SOURCES): Add sendflg.c and wildmatch.c. * libmailutils/imapio/flags.c (mu_imapio_send_flags): Move to sendflg.c * libmailutils/mailbox/folder.c (mu_folder_match): Rename to mu_folder_glob_match. (mu_folder_imap_match): New function. (mu_folder_create_from_record): Use mu_folder_imap_match as the default matcher. * libmailutils/tests/fsfolder.c: Start command line options with a dash. New option "-glob". All uses changed. * libproto/imap/select.c: Include imaputil.h * mu/imap.c: Likewise.
Sergey Poznyakoff authored -
* python/Makefile.am (EXTRA_DIST): Add usercustomize.py * python/usercustomize.py: New file. * python/libmu_py/Makefile.am (pythonexec_LTLIBRARIES): Remove. * python/mailutils/Makefile.am (pythonexec_LTLIBRARIES): New variable (moved from ../libmu_py/Makefile.am) * python/libmu_py/c_api.c: Move ... * python/mailutils/c_api.c: ... there
Sergey Poznyakoff authored -
* testsuite/Makefile.am: Add new test cases. * testsuite/testsuite.at: Inclide fldel.at, add banners. * testsuite/atlocal.in: Define MH_SUPPORT and MAILDIR_SUPPORT variables depending on whether the corresponding mailbox format is enabled. * testsuite/fldel.at: New test case. * testsuite/mbdel.at: Skip tests which rely on disabled mailbox formats.
Sergey Poznyakoff authored -
* include/mailutils/folder.h (_mu_fsfolder_init): New proto. * include/mailutils/mailbox.h (mu_mailbox_create_at): New proto. * libmailutils/mailbox/mailbox.c (mu_mailbox_create_at): New function. * libmailutils/mailbox/Makefile.am (libmailbox_la_SOURCES): Add fsfolder.c * libmailutils/mailbox/folder.c (mu_folder_delete): If folder does not provide its own method for deletion, use mu_mailbox_remove. (mu_folder_open, mu_folder_close, mu_folder_enumerate) (mu_folder_lsub, mu_folder_subscribe, mu_folder_unsubscribe) (mu_folder_rename): Return EINVAL if folder is NULL. (mu_folder_match): Bugfix: don't pass folder flags to fnmatch. * libmailutils/mailbox/fsfolder.c: New file. Implementation of file-system based folders. * libmailutils/mailbox/mailbox (_create_mailbox0): Propagate error return from mu_registrar_lookup_url. * libmailutils/tests/fsfolder00.at: New test case. * libmailutils/tests/fsfolder01.at: New test case. * libmailutils/tests/fsfolder02.at: New test case. * libmailutils/tests/Makefile.am (noinst_PROGRAMS): Add fsfolder. (TESTSUITE_AT): Add fsfolder tests. * libmailutils/tests/testsuite.at: Include fsfolder tests. * libproto/mbox/folder.c: Use fsfolder. (_mh_is_scheme): Check file even if scheme matches. * libproto/maildir/folder.c: Likewise. (_maildir_is_scheme): Check file even if scheme matches. * libproto/mh/folder.c: Likewise. * testsuite/fldel.c: New file. * testsuite/Makefile.am (noinst_PROGRAMS): Buld fldel.
Sergey Poznyakoff authored -
* include/mailutils/imap.h (mu_imap_session_state): Remove. (mu_imap_state): Rename to mu_imap_session_state. (mu_imap_state_str): Rename to mu_imap_session_state_str. * libproto/imap/create.c (mu_imap_session_state) (mu_imap_iserror,mu_imap_clearerr): Move to state.c * mu/imap.c: Update accordingly.
Sergey Poznyakoff authored
-
- 15 Dec, 2011 1 commit
-
-
* libmailutils/list/listlist.c (mu_list_append_list): Do nothing if the source list is empty. * include/mailutils/sys/imap.h (_mu_imap_url_init) (_mu_imaps_url_init): New protos. * libproto/imap/Makefile.am (libmu_imap_la_SOURCES): Restore url.c * libproto/imap/mbox.c: Deleted * libproto/imap/url.c: Rewrite. * libproto/imap/folder.c: Rewrite from scratch. * configure.ac: Build libproto/imap/tests/Makefile * include/mailutils/imap.h (mu_imap_session_state) (mu_imap_iserror, mu_imap_clearerr) (mu_imap_login_secret): New protos. * include/mailutils/sys/imap.h (_mu_imap_list_element_is_nil): New proto. * libmailutils/mailbox/folder.c (mu_folder_list): Pass MU_FOLDER_ATTRIBUTE_ALL. * libproto/imap/fake-folder.c: Remove. * libproto/imap/Makefile.am (libmu_imap_la_SOURCES): Remove fake-folder.c Add url.c and folder.c * libproto/imap/create.c (mu_imap_session_state) (mu_imap_iserror, mu_imap_clearerr): New functions. * libproto/imap/delete.c: Check input parameters. * libproto/imap/fetch.c: Use _mu_imap_list_element_is_nil to check for empty lists. * libproto/imap/genlist.c: Likewise. * libproto/imap/rename.c: Likewise. * libproto/imap/subscribe.c: Likewise. * libproto/imap/unsubscribe.c: Likewise. * libproto/imap/resplist.c: Treat NIL and () equally. * libproto/imap/login.c (mu_imap_login_secret): New function. * mu/imap.c: Fix a typo.
Sergey Poznyakoff authored
-
- 14 Dec, 2011 5 commits
-
-
-
* include/mailutils/imap.h (mu_imap_starttls): New proto. * include/mailutils/imapio.h: Use mu_imapio_t instead of struct _mu_imapio *. * include/mailutils/sys/imap.h (MU_IMAP_CLIENT_STARTTLS_RX): New state. * libmailutils/imapio/transport.c: New file. * libmailutils/imapio/Makefile.am (libimapio_la_SOURCES): Add transport.c * libproto/imap/starttls.c: New file. * libproto/imap/Makefile.am (libmu_imap_la_SOURCES): Add starttls.c. * libproto/imap/capability.c (mu_imap_capability): Bugfix: set up comparator and reclaim function after successful return from mu_list_map. * libproto/imap/capatst.c (mu_imap_capability_test): Clear MU_IMAP_RESP bit. * libproto/imap/err.c (mu_imap_strerror): Return errstr only if MU_IMAP_RESP is set. * mu/imap.c: Implement starttls.
Sergey Poznyakoff authored -
LSUB is pretty similar to LIST, therefore it is implemented as a wrapper over the latter. * include/mailutils/imap.h (mu_imap_genlist,mu_imap_genlist_new) (mu_imap_lsub,mu_imap_lsub_new): New protos. * include/mailutils/sys/imap.h (MU_IMAP_CLIENT_LSUB_RX): New state. * libproto/imap/Makefile.am (libmu_imap_la_SOURCES): Add new files. * libproto/imap/genlist.c: New file. * libproto/imap/list.c: Rewrite using generalized list functions. * libproto/imap/lsub.c: New file. * mu/imap.c: Implement lsub.
Sergey Poznyakoff authored -
* include/mailutils/imap.h (mu_imap_subscribe) (mu_imap_unsubscribe): New protos. * include/mailutils/sys/imap.h (MU_IMAP_CLIENT_SUBSCRIBE_RX) (MU_IMAP_CLIENT_UNSUBSCRIBE_RX): New states. * libproto/imap/Makefile.am (libmu_imap_la_SOURCES): Add subscribe.c and unsubscribe.c * libproto/imap/subscribe.c: New file. * libproto/imap/unsubscribe.c: New file. * mu/imap.c: Implement subscribe/unsubscribe.
Sergey Poznyakoff authored -
* include/mailutils/imapio.h (mu_imapio_send_command) (mu_imapio_send_command_e,mu_imapio_send_command_v) (mu_imapio_last_error,mu_imapio_clearerr): New protos. * include/mailutils/sys/imap.h (imap_command)<uid>: Remove. <extra>: New member. * libmailutils/imapio/Makefile.am (libimapio_la_SOURCES): Add new files. * libmailutils/imapio/qstring.c (mu_imapio_send_qstring_unfold): Improve functionality. * libmailutils/imapio/sendcmd.c: New file. * libmailutils/imapio/sendcmde.c: New file. * libmailutils/imapio/sendcmdv.c: New file. * libmailutils/imapio/errstate.c: New file. * libproto/imap/gencom.c (mu_imap_gencom): Use mu_imapio_send_command_v * libproto/imap/appstrsiz.c: Quote command arguments as necessary. * libproto/imap/capability.c: Likewise. * libproto/imap/check.c: Likewise. * libproto/imap/close.c: Likewise. * libproto/imap/copy.c: Likewise. * libproto/imap/delete.c: Likewise. * libproto/imap/expunge.c: Likewise. * libproto/imap/fetch.c: Likewise. * libproto/imap/list.c: Likewise. * libproto/imap/login.c: Likewise. * libproto/imap/mbcreate.c: Likewise. * libproto/imap/noop.c: Likewise. * libproto/imap/rename.c: Likewise. * libproto/imap/select.c: Likewise. * libproto/imap/store.c: Likewise. * libproto/imap/unselect.c: Likewise.
Sergey Poznyakoff authored
-
- 13 Dec, 2011 4 commits
-
-
* libmailutils/stdstream/basestr.c (mu_strout): Bugfix: initialize destroy function. * include/mailutils/imap.h (imap_command) (mu_imap_gencom): Move to sys/imap.h (mu_imap_list,mu_imap_list_new): New protos. * include/mailutils/sys/imap.h (imap_command): New struct (from ../imap.h). <handler>: Rename to tagged_handler. (untagged_handler,untagged_handler_data): New members. All uses changed. (mu_imap_gencom): New proto. * libproto/imap/list.c: New file. * libproto/imap/Makefile.am: Add list.c * libproto/imap/gencom.c: Use supplied untagged_handler to analize untagged response. * mu/imap.c: Implement list command.
Sergey Poznyakoff authored -
* libmu_sieve/sieve.y (mu_sieve_compile): Initialize rc. * python/libmu_py/sieve.c (api_sieve_machine_error_text): Fix type of length.
Sergey Poznyakoff authored -
* python/libmu_py/sieve.c (api_sieve_machine_init): Improve. (api_sieve_machine_error_text): Add new function. * python/libmu_py/stream.c (api_memory_stream_create): Likewise. (api_stream_to_message): Likewise. * python/mailutils/error.py (Error): Add optional str_error argument. * python/mailutils/sieve.py: Update. * python/mailutils/stream.py (to_message): Add new method. (MemoryStream): Add new class.
Wojciech Polak authored -
* libmailutils/datetime/streamftime.c (mu_c_streamftime): Handle %Z separately. * libmu_sieve/sieve.y (mu_sieve_compile): Return MU_ERR_PARSE on errors.
Sergey Poznyakoff authored
-
- 12 Dec, 2011 4 commits
-
-
* libmailutils/filter/base64.c (_base64_encoder): Continue after incrementing nbytes. * mh/mhn.c: Additional error checking.
Sergey Poznyakoff authored -
-
This allows programmers to use them right away, much like their stdio counterparts. The mu_stdstream_setup and friends can be used to re-initialize them, should the need be. * include/mailutils/sys/file_stream.h (_MU_FILE_STREAM_STATIC_FILENAME): New flag. (_mu_file_stream_setup): New proto. * include/mailutils/sys/logstream.h (_mu_log_stream_setup): New proto. * include/mailutils/sys/stream.h (_MU_STR_EVENT_BOOTSTRAP): New event code. (_mu_stream) <destroy>: New method. * libmailutils/stdstream/basestr.c: Define the three standard streams statically, use bootstrap event to initialize them. * libmailutils/stdstream/strerr.c (mu_stdstream_strerr_create): Accept tag==NULL. * libmailutils/stream/file_stream.c (fd_done): Do not free filename if _MU_FILE_STREAM_STATIC_FILENAME is set. (_mu_file_stream_setup): New function. * libmailutils/stream/logstream.c (NEXT): Check size before advancing buffer pointer. (_mu_log_stream_setup): New function. * libmailutils/stream/stream.c (_bootstrap_event): New macro. (mu_stream_destroy): If .destroy is defined, use it instead of free(2). (mu_stream_open,mu_stream_seek,mu_stream_set_buffer) (mu_stream_read,mu_stream_readdelim,mu_stream_getdelim) (mu_stream_write,mu_stream_size,mu_stream_wait) (mu_stream_truncate,mu_stream_shutdown): Call _bootstrap_event at the beginning. * libmailutils/tests/.gitignore: Add strin, strout. * libmailutils/tests/Makefile.am (noinst_PROGRAMS): Add strin, strout. (TESTSUITE_AT): Add stdstream tests. * libmailutils/tests/testsuite.at: Include stdstream tests. * libmailutils/tests/strerr.at: New test case. * libmailutils/tests/strin.at: Likewise. * libmailutils/tests/strout.at: Likewise. * libmailutils/tests/strin.c: New test program. * libmailutils/tests/strout.c: Likewise.
Sergey Poznyakoff authored
-
- 11 Dec, 2011 2 commits
-
-
* libproto/mbox/mboxscan.c (mbox_scan_internal): Fix UID generation. * testsuite/lstuid.c: New test program. * testsuite/lstuid00.at: New test case. * testsuite/lstuid01.at: Likewise. * testsuite/lstuid02.at: Likewise. * testsuite/Makefile.am: Add new test cases. * testsuite/testsuite.at: Likewise.
Sergey Poznyakoff authored -
* libmu_sieve/sieve.y (mu_sieve_machine_init_ex): Fix typo. Reference errstream, not mu_strerr.
Sergey Poznyakoff authored
-
- 10 Dec, 2011 2 commits
-
-
* imap4d/imap4d.h (util_format_attribute_flags) (util_attribute_to_type): Remove. All uses changed to mu_imap_format_flags and mu_imap_flag_to_attribute, respectively. (util_type_to_attribute): Remove.
Sergey Poznyakoff authored -
The new parser complies to RFC3501. Its output message sets are formatted as MU lists of non-overlapping contiguous message ranges, which reduces memory consumption and imposes less strain on CPU. The parser automatically translates message UIDs to sequence numbers and provides better error handling. * imap4d/imap4d.h (util_msgset): Remove. (util_parse_msgset): New proto. (imap4d_message_action_t): New typedef. (util_foreach_message): New proto. * imap4d/util.c (util_msgset): Remove. (util_parse_msgset): New function. * imap4d/copy.c: Use util_parse_msgset to parse message set specs and util_foreach_message to iterate over the returned list. * imap4d/fetch.c: Likewise. * imap4d/search.c: Likewise. * imap4d/store.c: Likewise. * imap4d/tests/IDEF0955.at: Update the test. * include/mailutils/list.h (mu_list_action_t): Fix typedef. * libmailutils/list/foreach.c (mu_list_foreach) (mu_list_do): Update signatures.
Sergey Poznyakoff authored
-
- 09 Dec, 2011 2 commits
-
-
…umber is not found in the mailbox. * libmailutils/base/amd.c (amd_get_message): Return MU_ERR_NOENT if msgno is not found in the mailbox, but not if it is 0, in which case return EINVAL. * libproto/mbox/mbox.c (mbox_get_message): Likewise. * libproto/pop/mbox.c (pop_create_pop3_message): Likewise. * libproto/mbox/mboxscan.c (mbox_scan_internal): Fix calculation of UIDs.
Sergey Poznyakoff authored
-
- 08 Dec, 2011 7 commits
-
-
* examples/mta.c (make_tmp): Use gmtime + mu_c_streamftime to create From_ line. * libmailutils/mailbox/msgenv.c (message_envelope_date): Use gmtime. * maidag/deliver.c (make_tmp): Likewise. * maidag/lmtp.c (cfun_data): Likewise. * readmsg/readmsg.c (print_unix_header): Use gmtime.
Sergey Poznyakoff authored -
The function initializes mu_timezone structure to the local timezone. * include/mailutils/datetime.h (mu_utc_offset): Change return type. (mu_datetime_tz_local): New proto. * libmailutils/datetime/tzlocal.c: New file. * libmailutils/datetime/Makefile.am: Add new file. * libmailutils/datetime/scantime.c (mu_scan_datetime): Use mu_datetime_tz_local to initialize local TZ. * mh/mh_format.c (_parse_date): Likewise. * libmailutils/datetime/utcoff.c (mu_utc_offset): Returns int. * libmu_sieve/actions.c (mime_create_ds): Use mu_c_streamftime to format time directly to stream.
Sergey Poznyakoff authored -
-
* imap4d/append.c: Don't reuse msg variable. * po/POTFILES.in: Remove unneeded file.
Sergey Poznyakoff authored -
* configure.ac: Build libmailutils/datetime/Makefile.am * include/mailutils/datetime.h (mu_datetime_julianday) (mu_datetime_dayofweek,mu_datetime_dayofyear) (mu_datetime_year_days): New protos. * libmailutils/Makefile.am (SUBDIRS): Add datetime (libmailutils_la_LIBADD): Add libdatetime.la * libmailutils/base/Makefile.am (libbase_la_SOURCES): Remove date.c and strftime.c. * libmailutils/base/date.c: Remove. * libmailutils/base/strftime.c: Move to libmailutils/datetime * libmailutils/datetime/Makefile.am: New file. * libmailutils/datetime/dow.c: New file. * libmailutils/datetime/doy.c: New file. * libmailutils/datetime/jd.c: New file. * libmailutils/datetime/scantime.c: New file. * libmailutils/datetime/streamftime.c: New file. * libmailutils/datetime/tab.c: New file. * libmailutils/datetime/unixtime.c: New file. * libmailutils/datetime/utcoff.c: New file. * libmailutils/datetime/yd.c: New file. * libmailutils/tests/scantime.at: Fix yday numbers.
Sergey Poznyakoff authored -
* imap4d/append.c (imap4d_append0): Use mu_message_from_stream_with_envelope with crafted envelope. The effect is that the envelope of the message always reflects the actual sender, as deduced from the header (X-Envelope-Sender, Sender, From, in that order) and the date given with the APPEND command (or current date/time, if not given). * imap4d/tests/append00.at: Reflect changes in the envelope. * imap4d/tests/append01.at: Likewise. * imap4d/io.c (io_format_completion_response): Call imap4d_sync to emit eventual non-tagged responses before the tagged one. * include/mailutils/envelope.h (mu_envelope_set_destroy): New proto. * include/mailutils/header.h (MU_HEADER_SENDER): Remove duplicate define. * include/mailutils/imap.h (mu_imap_mailbox_create) (mu_imap_append_stream_size,mu_imap_append_stream) (mu_imap_append_message,mu_imapio_send_flags) (mu_imapio_send_time): New protos. * include/mailutils/imapio.h (mu_imapio_send_literal): Remove proto. (mu_imapio_send_literal_string) (mu_imapio_send_literal_stream): New protos. * include/mailutils/message.h (mu_message_from_stream_with_envelope): New proto. * include/mailutils/sys/imap.h (MU_IMAP_CLIENT_APPEND_RX): New state. * include/mailutils/sys/message_stream.h (_mu_message_stream) <envelope>: Rename to envelope_string. <construct_envelope>: New member. * libmailutils/imapio/literal.c: Remove. * libmailutils/imapio/litstream.c: New file. * libmailutils/imapio/litstring.c: New file. * libmailutils/imapio/time.c: New file. * libmailutils/imapio/Makefile.am: Add new files. * libmailutils/imapio/flags.c (mu_imapio_send_flags): New function. * libmailutils/imapio/qstring.c (mu_imapio_send_qstring_unfold): Use mu_imapio_send_literal_string. * libmailutils/mailbox/envelope.c (mu_envelope_set_destroy): New function. * libmailutils/stream/message_stream.c (mu_message_from_stream_with_envelope): New function. (mu_stream_to_message): Rewrite as an alternative entry point to the above. * libproto/imap/Makefile.am: Add new files. * libproto/imap/appmsg.c: New file. * libproto/imap/appstr.c: New file. * libproto/imap/appstrsiz.c: New file. * libproto/imap/mbcreate.c: New file. * mu/imap.c: Implement create and append.
Sergey Poznyakoff authored
-
- 07 Dec, 2011 3 commits
-
-
* include/mailutils/imap.h (imap_command): New struct. (mu_imap_gencom): New function. (mu_imap_store,mu_imap_delete) (mu_imap_rename,mu_imap_mailbox_close,mu_imap_close) (mu_imap_check): New functions. (_mu_close_handler): New function. * include/mailutils/sys/imap.h (mu_imap_client_state): Add new states. * libproto/imap/gencom.c: New file. * libproto/imap/close.c: New file. * libproto/imap/delete.c: New file. * libproto/imap/rename.c: New file. * libproto/imap/store.c: New file. * libproto/imap/unselect.c: New file. * libproto/imap/check.c: New file. * libproto/imap/expunge.c: New file. * libproto/imap/copy.c: New file. * libproto/imap/Makefile.am (libmu_imap_la_SOURCES): Add new files. * mu/imap.c: Implement new commands. * mu/shell.c (execute_line): Treat backslash as escape only before another backslash or double-quote.
Sergey Poznyakoff authored -
* imap4d/imap4d.h (silent_expunge): New global. * imap4d/sync.c (silent_expunge): New variable. (action): Suppress EXPUNGE responses if silent_expunge is set. * imap4d/close.c (imap4d_close0): Set silent_expunge before calling mu_mailbox_flush. * imap4d/tests/close-expunge.at: New test. * imap4d/tests/testsuite.at: Include close-expunge.at. * imap4d/tests/Makefile.am (TESTSUITE_AT): Add close-expunge.at. * imap4d/fetch.c (fetch_thunk): Emit BAD response if failed to parse message set. * imap4d/store.c (store_thunk): Emit BAD response if failed to parse flags.
Sergey Poznyakoff authored
- 06 Dec, 2011 2 commits
-
-
-
* libmailutils/base/date.c (mu_scan_datetime): Handle optional blocks (%[ %| %], alternatives %( %| %), "any character" wildcards (%?) and strict character matches (%\C). Return MU_ERR_FORMAT on errors in format string. Compute tm->tm_yday. * libmailutils/diag/errors (MU_ERR_FORMAT): New error code. * libmailutils/tests/scantime.c: Print yday. Print input line with diagnostic messages. * libmailutils/tests/scantime.at: Add more tests. * include/mailutils/util.h (MU_DATETIME_RFC822): Split into two formats: MU_DATETIME_FORM_RFC822, for output formatting, and MU_DATETIME_SCAN_RFC822 for input scanning. All uses changed.
Sergey Poznyakoff authored
-
- 05 Dec, 2011 3 commits
-
-
* libmu_sieve/runtime.c (_mu_sv_instr_push) (_mu_sv_instr_pop): Use mu_list_push and mu_list_pop. * mail/alias.c (recursive_alias_expand): Likewise.
Sergey Poznyakoff authored -
* include/mailutils/list.h (mu_list_push) (mu_list_pop): New functions. * libmailutils/list/pop.c: New file. * libmailutils/list/push.c: New file. * libmailutils/list/Makefile.am (liblist_la_SOURCES): Add new files. * libmailutils/tests/list.at: Test LIFO access. * libmailutils/tests/listop.c: Implement push & pop.
Sergey Poznyakoff authored -
* imap4d/util.c (util_parse_internal_date): Use MU_DATETIME_INTERNALDATE format. * include/mailutils/util.h (MU_DATETIME_IMAP_SEARCH): Rename to MU_DATETIME_INTERNALDATE (previous incorrect definition removed). (MU_DATETIME_RFC822): New format. * libmailutils/address/address.c: Accessors for local_part and domain invalidate email field. (validate_email): New static function. (mu_address_sget_email): Reconstruct email, if necessary. (mu_address_format_string): Likewise. * libmailutils/base/date.c (mu_c_streamftime): Allow for %$ specifier for compatibility with mu_scan_datetime. (mu_scan_datetime): Use %$ to idicate optional end of string. * libmailutils/tests/scantime.at: Update. * libproto/imap/fetch.c (_fill_response): Use MU_DATETIME_RFC822 format. * mu/imap.c (fetch_response_printer): Print subject.
Sergey Poznyakoff authored
-