Merge branch 'refs/heads/t/doxygen'
authorAndre Noll <maan@tuebingen.mpg.de>
Fri, 21 Jul 2017 17:45:31 +0000 (19:45 +0200)
committerAndre Noll <maan@tuebingen.mpg.de>
Fri, 21 Jul 2017 17:51:17 +0000 (19:51 +0200)
This series contains an update of Doxyfile to a newer doxygen version
and an overhaul of the source code documentation. Several stale
references have been fixed. Other parts of the documentation have
been improved.

Cooking for almost a month.

* refs/heads/t/doxygen:
  aft.c: Trivial spelling/whitespace fixes.
  afh: Expand documentation of init function declarations.
  filter: Remove duplicate documentation of filter_get().
  doxygen: Improve documentation of struct receiver.
  doxygen: Add \ref to references.
  Improve documentation of mm.c and mm.h.
  doxygen: Don't refer to Black Hats Manual.
  doxygen: Don't refer to libosl functions.
  doxygen: Trivial cleanups.
  doxygen: Remove some stale doxygen references.
  recv: Explain user data mechanism.
  Update to doxygen-1.8.11.

The merge resulted in a few conflicts which were easy to resolve.

17 files changed:
NEWS.md
afh_common.c
afs.h
aft.c
configure.ac
error.h
grab_client.c
gui.c
mood.c
mp3_afh.c
ogg_afh.c
play.c
recv.c
string.c
web/dia/overview.dia [deleted file]
web/documentation.in.html
web/manual.md

diff --git a/NEWS.md b/NEWS.md
index 60b9423..5398d3a 100644 (file)
--- a/NEWS.md
+++ b/NEWS.md
@@ -1,6 +1,16 @@
 NEWS
 ====
 
+------------------------------------------------
+0.6.1 (to be announced) "hyperbolic correlation"
+------------------------------------------------
+
+- The contents of overview.pdf have been integrated into the user
+  manual.
+- The doxygen source browser has been disabled temporarily. The
+  API reference is still online, though.
+- Overhaul of the source code documentation.
+
 -------------------------------
 0.6.0 (2017-04-28) "fuzzy flux"
 -------------------------------
index 0d8d905..1614c27 100644 (file)
@@ -16,6 +16,7 @@
 #include "afh.h"
 
 typedef void afh_init_func(struct audio_format_handler *);
+
 /*
  * Declaration of the audio format handler init functions.
  *
@@ -26,7 +27,7 @@ typedef void afh_init_func(struct audio_format_handler *);
  * not all of these functions are defined. It does not hurt to declare them
  * anyway, and this avoids another set of ifdefs.
  */
-extern afh_init_func mp3_init, ogg_init, aac_afh_init, wma_afh_init,
+extern afh_init_func mp3_afh_init, ogg_afh_init, aac_afh_init, wma_afh_init,
        spx_afh_init, flac_afh_init, opus_afh_init;
 
 /** The list of all status items */
@@ -37,7 +38,7 @@ const char *status_item_list[] = {STATUS_ITEM_ARRAY};
  *
  * We always define the full array of audio formats even if some audio formats
  * were not compiled in. This is because for each audio file the number of its
- * audio format is stored in the database. We don't want that numbers to become
+ * audio format is stored in the database. We don't want these numbers to become
  * stale just because the user installed a new version of paraslash that
  * supports a different set of audio formats.
  *
@@ -47,12 +48,12 @@ const char *status_item_list[] = {STATUS_ITEM_ARRAY};
 static struct audio_format_handler afl[] = {
        {
                .name = "mp3",
-               .init = mp3_init,
+               .init = mp3_afh_init,
        },
        {
                .name = "ogg",
 #if defined(HAVE_OGG) && defined(HAVE_VORBIS)
-               .init = ogg_init,
+               .init = ogg_afh_init,
 #endif
        },
        {
diff --git a/afs.h b/afs.h
index e113915..ea4b497 100644 (file)
--- a/afs.h
+++ b/afs.h
@@ -179,11 +179,9 @@ struct afs_callback_arg {
 typedef int afs_callback(struct afs_callback_arg *aca);
 
 /**
- * Callbacks send chunks to data back to the command handler. Pointers to
- * this type of function are used by \ref send_callback_request and friends
- * to deal with the data in the command handler process.
- *
- * \sa \ref send_callback_request().
+ * Some AFS callbacks need to send data back to the command handler. Pointers
+ * to this type of function are passed to \ref send_callback_request() and
+ * related functions to dispatch the data in the command handler process.
  */
 typedef int callback_result_handler(struct osl_object *result, uint8_t band, void *private);
 int afs_cb_result_handler(struct osl_object *result, uint8_t band, void *private);
diff --git a/aft.c b/aft.c
index d58f9da..c2642ed 100644 (file)
--- a/aft.c
+++ b/aft.c
@@ -377,6 +377,7 @@ static void save_afhi(struct afh_info *afhi, char *buf)
        sprintf(p, "%s", afhi->tags.comment);
 }
 
+/* does not load the chunk table */
 static void load_afhi(const char *buf, struct afh_info *afhi)
 {
        afhi->seconds_total = read_u32(buf + AFHI_SECONDS_TOTAL_OFFSET);
@@ -592,6 +593,10 @@ static int get_hash_of_row(const struct osl_row *row, unsigned char **hash)
  * \param afhi Result pointer.
  *
  * \return The return value of the underlying call to osl_get_object().
+ *
+ * After the call the members of the afhi structure point to mapped memory
+ * which is owned by the osl table, Hence the caller must not attempt to free
+ * this memory by calling \ref clear_afhi().
  */
 int get_afhi_of_row(const struct osl_row *row, struct afh_info *afhi)
 {
index a589613..c2cb47e 100644 (file)
@@ -6,7 +6,6 @@ AC_CONFIG_HEADERS([config.h])
 
 AC_CONFIG_FILES([Makefile])
 AC_DEFUN([add_dot_o],[$(for i in $@; do printf "$i.o "; done)])
-AC_DEFUN([add_cmdline],[$(for i in $@; do printf "${i}.cmdline "; done)])
 AC_DEFUN([LIB_ARG_WITH], [
        AC_ARG_WITH($1-headers, [AS_HELP_STRING(--with-$1-headers=dir,
                [look for $1 headers in dir])])
@@ -76,7 +75,7 @@ STASH_FLAGS
 LIB_ARG_WITH([lopsub], [-llopsub])
 HAVE_LOPSUB=yes
 AC_CHECK_HEADER(lopsub.h, [], [HAVE_LOPSUB=no])
-AC_CHECK_LIB([lopsub], [lls_merge], [], [HAVE_LOPSUB=yes])
+AC_CHECK_LIB([lopsub], [lls_merge], [], [HAVE_LOPSUB=no])
 if test $HAVE_LOPSUB = no; then AC_MSG_ERROR([
        The lopsub library is required to build this software, but
        the above checks indicate it is not installed on your system.
@@ -197,7 +196,7 @@ AC_LINK_IFELSE([AC_LANG_PROGRAM([[
 ]])],[have_ip_mreqn=yes],[have_ip_mreqn=no])
 AC_MSG_RESULT($have_ip_mreqn)
 if test ${have_ip_mreqn} = yes; then
-       AC_DEFINE(HAVE_IP_MREQN, 1, define to 1 you have struct ip_mreqn)
+       AC_DEFINE(HAVE_IP_MREQN, 1, define to 1 if you have struct ip_mreqn)
 fi
 ########################################################################### ogg
 STASH_FLAGS
diff --git a/error.h b/error.h
index ea25f8c..e5d2469 100644 (file)
--- a/error.h
+++ b/error.h
@@ -8,6 +8,7 @@
 
 /** Codes and messages. */
 #define PARA_ERRORS \
+       PARA_ERROR(SUCCESS, "success"), \
        PARA_ERROR(AACDEC_INIT, "failed to init aac decoder"), \
        PARA_ERROR(AAC_DECODE, "aac decode error"), \
        PARA_ERROR(ACL_PERM, "access denied by acl"), \
index 11fff4c..382b047 100644 (file)
@@ -8,7 +8,6 @@
 
 #include <regex.h>
 #include <sys/types.h>
-#include <inttypes.h>
 #include <lopsub.h>
 
 #include "audiod_cmd.lsg.h"
diff --git a/gui.c b/gui.c
index 24f1c72..5bad7e1 100644 (file)
--- a/gui.c
+++ b/gui.c
@@ -56,9 +56,7 @@ struct rb_entry {
 static struct ringbuffer *bot_win_rb;
 
 static unsigned scroll_position;
-
 static pid_t exec_pid;
-
 static int exec_fds[2] = {-1, -1};
 static int loglevel;
 
@@ -253,7 +251,7 @@ static char *km_keyname(int c)
 }
 
 /* Print given number of spaces to curses window. */
-static void add_spaces(WINDOWwin, unsigned int num)
+static void add_spaces(WINDOW *win, unsigned int num)
 {
        const char space[] = "                                ";
        const unsigned sz = sizeof(space) - 1; /* number of spaces */
@@ -269,10 +267,10 @@ static void add_spaces(WINDOW* win, unsigned int num)
 }
 
 /*
- * print aligned string to curses window. This function always prints
+ * Print aligned string to curses window. This function always prints
  * exactly len chars.
  */
-static int align_str(WINDOWwin, const char *str, unsigned int len,
+static int align_str(WINDOW *win, const char *str, unsigned int len,
                unsigned int align)
 {
        int ret, num; /* of spaces */
@@ -458,10 +456,8 @@ static void rb_add_entry(int color, char *msg)
        waddstr(bot.win, msg);
 }
 
-/*
- * print formated output to bot win and refresh
- */
-__printf_2_3 static void outputf(int color, const char* fmt,...)
+/* Print formatted output to bot win and refresh. */
+__printf_2_3 static void outputf(int color, const char *fmt,...)
 {
        char *msg;
        va_list ap;
@@ -504,8 +500,9 @@ static __printf_2_3 void curses_log(int ll, const char *fmt,...)
                vfprintf(stderr, fmt, ap);
        va_end(ap);
 }
+
 /** The log function of para_gui, always set to curses_log(). */
-__printf_2_3 void (*para_log)(int, const char*, ...) = curses_log;
+__printf_2_3 void (*para_log)(int, const char *, ...) = curses_log;
 
 /* Call endwin() to reset the terminal into non-visual mode. */
 static void shutdown_curses(void)
@@ -522,8 +519,8 @@ static void shutdown_curses(void)
        endwin();
 }
 
-/* disable curses, print a message, kill running processes and exit */
-__noreturn __printf_2_3 static void die(int exit_code, const charfmt, ...)
+/* Disable curses, print a message, kill running processes and exit. */
+__noreturn __printf_2_3 static void die(int exit_code, const char *fmt, ...)
 {
        va_list argp;
 
@@ -546,9 +543,7 @@ __noreturn __printf_2_3 static void die(int exit_code, const char* fmt, ...)
        exit(exit_code);
 }
 
-/*
- * Print stat item #i to curses window
- */
+/* Print stat item #i to curses window. */
 static void print_stat_item(int i)
 {
        char *tmp;
@@ -698,9 +693,7 @@ static int status_post_select(struct sched *s, void *context)
        return 0;
 }
 
-/*
- * init all windows
- */
+/* Initialize all windows. */
 static void init_wins(int top_lines)
 {
        int top_y = 0, bot_y = top_lines + 1, sb_y = LINES - 2,
@@ -904,7 +897,7 @@ static void parse_config_file_or_die(bool reload)
        if (reload) /* config file overrides command line */
                ret = lls(lls_merge(cf_lpr, cmdline_lpr, CMD_PTR, &merged_lpr,
                        &errctx));
-       else /* command line options overrride config file options */
+       else /* command line options override config file options */
                ret = lls(lls_merge(cmdline_lpr, cf_lpr, CMD_PTR, &merged_lpr,
                        &errctx));
        lls_free_parse_result(cf_lpr, CMD_PTR);
@@ -928,7 +921,7 @@ free_cf:
        }
 }
 
-/* reread configuration, terminate on errors */
+/* Reread configuration, terminate on errors. */
 static void reread_conf(void)
 {
        /*
@@ -942,9 +935,7 @@ static void reread_conf(void)
        print_in_bar(COLOR_MSG, "config file reloaded\n");
 }
 
-/*
- * React to various signal-related events
- */
+/* React to various signal-related events. */
 static int signal_post_select(struct sched *s, __a_unused void *context)
 {
        int ret = para_next_signal(&s->rfds);
@@ -1045,7 +1036,7 @@ static void input_pre_select(struct sched *s, __a_unused void *context)
                sched_min_delay(s);
 }
 
-/* read from command pipe and print data to bot window */
+/* Read from command pipe and print data to bot window. */
 static void exec_and_display(const char *file_and_args)
 {
        int ret, fds[3] = {0, 1, 1};
@@ -1079,9 +1070,7 @@ static void exec_para(const char *args)
        free(file_and_args);
 }
 
-/*
- * shutdown curses and stat pipe before executing external commands
- */
+/* Shutdown curses and stat pipe before executing external commands. */
 static void exec_external(char *file_and_args)
 {
        int fds[3] = {-1, -1, -1};
@@ -1135,7 +1124,8 @@ static void handle_command(int c)
                km_keyname(c));
 }
 
-static int input_post_select(__a_unused struct sched *s, __a_unused void *context)
+static int input_post_select(__a_unused struct sched *s,
+               __a_unused void *context)
 {
        int ret;
        enum exec_status exs = exec_status();
diff --git a/mood.c b/mood.c
index 92bef0f..315ef0c 100644 (file)
--- a/mood.c
+++ b/mood.c
@@ -140,8 +140,8 @@ static bool get_item_score(struct mood_item *item, const struct afs_info *afsi,
 }
 
 /* returns 1 if row admissible, 0 if not, negative on errors */
-static int compute_mood_score(const struct osl_row *aft_row, struct mood *m,
-               long *result)
+static int row_is_admissible(const struct osl_row *aft_row, struct mood *m,
+               long *scorep)
 {
        struct mood_item *item;
        int ret;
@@ -154,13 +154,13 @@ static int compute_mood_score(const struct osl_row *aft_row, struct mood *m,
        if (!m)
                return -E_NO_MOOD;
        ret = get_afsi_of_row(aft_row, &afsi);
-       if (ret< 0)
+       if (ret < 0)
                return ret;
        ret = get_afhi_of_row(aft_row, &afhi);
-       if (ret< 0)
+       if (ret < 0)
                return ret;
        ret = get_audio_file_path_of_row(aft_row, &path);
-       if (ret< 0)
+       if (ret < 0)
                return ret;
        /* reject audio file if it matches any entry in the deny list */
        list_for_each_entry(item, &m->deny_list, mood_item_node) {
@@ -190,7 +190,7 @@ static int compute_mood_score(const struct osl_row *aft_row, struct mood *m,
        }
        if (score_arg_sum)
                score /= score_arg_sum;
-       *result = score;
+       *scorep = score;
        return 1;
 }
 
@@ -257,7 +257,6 @@ struct mood_line_parser_data {
  * <score> is either an integer or "random" which assigns a random score to
  * all matching files
  */
-
 static int parse_mood_line(char *mood_line, void *data)
 {
        struct mood_line_parser_data *mlpd = data;
@@ -566,7 +565,7 @@ static int add_if_admissible(struct osl_row *aft_row, void *data)
        int ret;
        long score = 0;
 
-       ret = compute_mood_score(aft_row, aa->m, &score);
+       ret = row_is_admissible(aft_row, aa->m, &score);
        if (ret <= 0)
                return ret;
        if (statistics.num >= aa->size) {
@@ -625,7 +624,8 @@ _static_inline_ int64_t update_quadratic_deviation(int64_t n, int64_t old_qd,
        return old_qd + delta * (sigma - 2 * old_sum / n - delta / n);
 }
 
-static int update_afs_statistics(struct afs_info *old_afsi, struct afs_info *new_afsi)
+static int update_afs_statistics(struct afs_info *old_afsi,
+               struct afs_info *new_afsi)
 {
        unsigned n;
        int ret = get_num_admissible_files(&n);
@@ -712,7 +712,7 @@ static int mood_update_audio_file(const struct osl_row *aft_row,
        if (ret < 0)
                return ret;
        was_admissible = ret;
-       ret = compute_mood_score(aft_row, current_mood, &score);
+       ret = row_is_admissible(aft_row, current_mood, &score);
        if (ret < 0)
                return ret;
        is_admissible = (ret > 0);
@@ -846,6 +846,7 @@ out:
        free(aa.array);
        return ret;
 }
+
 /*
  * Close and re-open the current mood.
  *
index e5d0ff1..08837be 100644 (file)
--- a/mp3_afh.c
+++ b/mp3_afh.c
@@ -690,7 +690,7 @@ static const char * const mp3_suffixes[] = {"mp3", NULL};
  *
  * \param afh pointer to the struct to initialize
  */
-void mp3_init(struct audio_format_handler *afh)
+void mp3_afh_init(struct audio_format_handler *afh)
 {
        afh->get_file_info = mp3_get_file_info;
        afh->suffixes = mp3_suffixes;
index 2ddf0ee..cb0611e 100644 (file)
--- a/ogg_afh.c
+++ b/ogg_afh.c
@@ -212,7 +212,7 @@ static const char * const ogg_suffixes[] = {"ogg", NULL};
  *
  * \param afh Pointer to the struct to initialize.
  */
-void ogg_init(struct audio_format_handler *afh)
+void ogg_afh_init(struct audio_format_handler *afh)
 {
        afh->get_file_info = ogg_vorbis_get_file_info;
        afh->get_header = vorbis_get_header;
diff --git a/play.c b/play.c
index 7ffcd9e..5fbf44c 100644 (file)
--- a/play.c
+++ b/play.c
@@ -8,7 +8,6 @@
 
 #include <regex.h>
 #include <signal.h>
-#include <inttypes.h>
 #include <lopsub.h>
 
 #include "recv_cmd.lsg.h"
@@ -109,8 +108,7 @@ struct play_task {
        char *afhi_txt;
 };
 
-typedef int (*play_cmd_handler_t)(struct play_task *pt,
-               struct lls_parse_result *lpr);
+typedef int (*play_cmd_handler_t)(struct lls_parse_result *lpr);
 struct play_command_info {
        play_cmd_handler_t handler;
 };
@@ -127,7 +125,7 @@ INIT_STDERR_LOGGING(loglevel);
 char *stat_item_values[NUM_STAT_ITEMS] = {NULL};
 
 static struct sched sched = {.max_fileno = 0};
-static struct play_task play_task;
+static struct play_task play_task, *pt = &play_task;
 
 #define AFH_RECV_CMD (lls_cmd(LSG_RECV_CMD_CMD_AFH, recv_cmd_suite))
 #define AFH_RECV ((struct receiver *)lls_user_data(AFH_RECV_CMD))
@@ -228,7 +226,7 @@ fail:
        exit(EXIT_FAILURE);
 }
 
-static char get_playback_state(struct play_task *pt)
+static char get_playback_state(void)
 {
        switch (pt->rq) {
        case CRT_NONE: return pt->playing? 'P' : 'U';
@@ -239,9 +237,9 @@ static char get_playback_state(struct play_task *pt)
        assert(false);
 };
 
-static long unsigned get_play_time(struct play_task *pt)
+static long unsigned get_play_time(void)
 {
-       char state = get_playback_state(pt);
+       char state = get_playback_state();
        long unsigned result;
 
        if (state != 'P' && state != 'U')
@@ -263,7 +261,7 @@ static long unsigned get_play_time(struct play_task *pt)
 }
 
 
-static void wipe_receiver_node(struct play_task *pt)
+static void wipe_receiver_node(void)
 {
        PARA_NOTICE_LOG("cleaning up receiver node\n");
        btr_remove_node(&pt->rn.btrn);
@@ -273,7 +271,7 @@ static void wipe_receiver_node(struct play_task *pt)
 }
 
 /* returns: 0 not eof, 1: eof, < 0: fatal error.  */
-static int get_playback_error(struct play_task *pt)
+static int get_playback_error(void)
 {
        int err;
 
@@ -292,13 +290,13 @@ static int get_playback_error(struct play_task *pt)
        return err;
 }
 
-static int eof_cleanup(struct play_task *pt)
+static int eof_cleanup(void)
 {
        const struct filter *decoder;
        const struct writer *w = writer_get(-1); /* default writer */
        int ret;
 
-       ret = get_playback_error(pt);
+       ret = get_playback_error();
        if (ret == 0)
                return ret;
        PARA_NOTICE_LOG("cleaning up wn/fn nodes\n");
@@ -324,7 +322,7 @@ static int eof_cleanup(struct play_task *pt)
         * paused.
         */
        if (ret < 0)
-               wipe_receiver_node(pt);
+               wipe_receiver_node();
        return ret;
 }
 
@@ -352,7 +350,7 @@ static struct btr_node *new_recv_btrn(struct receiver_node *rn)
                        .handler = AFH_RECV->execute));
 }
 
-static int open_new_file(struct play_task *pt)
+static int open_new_file(void)
 {
        int ret;
        const char *path = get_playlist_file(pt->next_file);
@@ -360,7 +358,7 @@ static int open_new_file(struct play_task *pt)
        char *argv[] = {"play", "-f", tmp, "-b", "0", NULL};
 
        PARA_NOTICE_LOG("next file: %s\n", path);
-       wipe_receiver_node(pt);
+       wipe_receiver_node();
        pt->start_chunk = 0;
        pt->rn.btrn = new_recv_btrn(&pt->rn);
        ret = lls(lls_parse(ARRAY_SIZE(argv) - 1, argv, AFH_RECV_CMD,
@@ -400,11 +398,11 @@ static int open_new_file(struct play_task *pt)
        }
        return 1;
 fail:
-       wipe_receiver_node(pt);
+       wipe_receiver_node();
        return ret;
 }
 
-static int load_file(struct play_task *pt)
+static int load_file(void)
 {
        const char *af;
        char *tmp, buf[20];
@@ -414,7 +412,7 @@ static int load_file(struct play_task *pt)
 
        btr_remove_node(&pt->rn.btrn);
        if (!pt->rn.receiver || pt->next_file != pt->current_file) {
-               ret = open_new_file(pt);
+               ret = open_new_file();
                if (ret < 0)
                        return ret;
        } else {
@@ -468,11 +466,11 @@ static int load_file(struct play_task *pt)
        register_writer_node(&pt->wn, pt->fn.btrn, &sched);
        return 1;
 fail:
-       wipe_receiver_node(pt);
+       wipe_receiver_node();
        return ret;
 }
 
-static int next_valid_file(struct play_task *pt)
+static int next_valid_file(void)
 {
        int i, j = pt->current_file;
        unsigned num_inputs = lls_num_inputs(play_lpr);
@@ -485,20 +483,20 @@ static int next_valid_file(struct play_task *pt)
        return -E_NO_VALID_FILES;
 }
 
-static int load_next_file(struct play_task *pt)
+static int load_next_file(void)
 {
        int ret;
 
 again:
        if (pt->rq == CRT_NONE) {
                pt->start_chunk = 0;
-               ret = next_valid_file(pt);
+               ret = next_valid_file();
                if (ret < 0)
                        return ret;
                pt->next_file = ret;
        } else if (pt->rq == CRT_REPOS)
                pt->next_file = pt->current_file;
-       ret = load_file(pt);
+       ret = load_file();
        if (ret < 0) {
                PARA_ERROR_LOG("%s: marking file as invalid\n",
                        para_strerror(-ret));
@@ -511,7 +509,7 @@ again:
        return ret;
 }
 
-static void kill_stream(struct play_task *pt)
+static void kill_stream(void)
 {
        if (pt->wn.task)
                task_notify(pt->wn.task, E_EOF);
@@ -520,7 +518,7 @@ static void kill_stream(struct play_task *pt)
 #ifdef HAVE_READLINE
 
 /* only called from com_prev(), nec. only if we have readline */
-static int previous_valid_file(struct play_task *pt)
+static int previous_valid_file(void)
 {
        int i, j = pt->current_file;
        unsigned num_inputs = lls_num_inputs(play_lpr);
@@ -729,7 +727,7 @@ static struct i9e_completer pp_completers[] = {
        {.name = NULL}
 };
 
-static void attach_stdout(struct play_task *pt, const char *name)
+static void attach_stdout(const char *name)
 {
        if (pt->btrn)
                return;
@@ -738,20 +736,19 @@ static void attach_stdout(struct play_task *pt, const char *name)
        i9e_attach_to_stdout(pt->btrn);
 }
 
-static void detach_stdout(struct play_task *pt)
+static void detach_stdout(void)
 {
        btr_remove_node(&pt->btrn);
 }
 
-static int com_quit(struct play_task *pt,
-               __a_unused struct lls_parse_result *lpr)
+static int com_quit(__a_unused struct lls_parse_result *lpr)
 {
        pt->rq = CRT_TERM_RQ;
        return 0;
 }
 EXPORT_PLAY_CMD_HANDLER(quit);
 
-static int com_help(struct play_task *pt, struct lls_parse_result *lpr)
+static int com_help(struct lls_parse_result *lpr)
 {
        int i, ret;
        char *buf, *errctx;
@@ -804,8 +801,7 @@ static int com_help(struct play_task *pt, struct lls_parse_result *lpr)
 }
 EXPORT_PLAY_CMD_HANDLER(help);
 
-static int com_info(struct play_task *pt,
-               __a_unused struct lls_parse_result *lpr)
+static int com_info(__a_unused struct lls_parse_result *lpr)
 {
        char *buf;
        size_t sz;
@@ -820,7 +816,7 @@ static int com_info(struct play_task *pt,
 }
 EXPORT_PLAY_CMD_HANDLER(info);
 
-static void list_file(struct play_task *pt, int num)
+static void list_file(int num)
 {
        char *buf;
        size_t sz;
@@ -830,8 +826,7 @@ static void list_file(struct play_task *pt, int num)
        btr_add_output(buf, sz, pt->btrn);
 }
 
-static int com_tasks(struct play_task *pt,
-               __a_unused struct lls_parse_result *lpr)
+static int com_tasks(__a_unused struct lls_parse_result *lpr)
 {
        static char state;
        char *buf;
@@ -839,26 +834,25 @@ static int com_tasks(struct play_task *pt,
 
        buf = get_task_list(&sched);
        btr_add_output(buf, strlen(buf), pt->btrn);
-       state = get_playback_state(pt);
+       state = get_playback_state();
        sz = xasprintf(&buf, "state: %c\n", state);
        btr_add_output(buf, sz, pt->btrn);
        return 0;
 }
 EXPORT_PLAY_CMD_HANDLER(tasks);
 
-static int com_ls(struct play_task *pt,
-       __a_unused struct lls_parse_result *lpr)
+static int com_ls(__a_unused struct lls_parse_result *lpr)
 {
        int i;
        unsigned num_inputs = lls_num_inputs(play_lpr);
 
        for (i = 0; i < num_inputs; i++)
-               list_file(pt, i);
+               list_file(i);
        return 0;
 }
 EXPORT_PLAY_CMD_HANDLER(ls);
 
-static int com_play(struct play_task *pt, struct lls_parse_result *lpr)
+static int com_play(struct lls_parse_result *lpr)
 {
        int32_t x;
        int ret;
@@ -871,7 +865,7 @@ static int com_play(struct play_task *pt, struct lls_parse_result *lpr)
                free(errctx);
                return ret;
        }
-       state = get_playback_state(pt);
+       state = get_playback_state();
        if (lls_num_inputs(lpr) == 0) {
                if (state == 'P')
                        return 0;
@@ -885,24 +879,23 @@ static int com_play(struct play_task *pt, struct lls_parse_result *lpr)
                return ret;
        if (x < 0 || x >= lls_num_inputs(play_lpr))
                return -ERRNO_TO_PARA_ERROR(EINVAL);
-       kill_stream(pt);
+       kill_stream();
        pt->next_file = x;
        pt->rq = CRT_FILE_CHANGE;
        return 0;
 }
 EXPORT_PLAY_CMD_HANDLER(play);
 
-static int com_pause(struct play_task *pt,
-               __a_unused struct lls_parse_result *lpr)
+static int com_pause(__a_unused struct lls_parse_result *lpr)
 {
        char state;
        long unsigned seconds, ss;
 
-       state = get_playback_state(pt);
+       state = get_playback_state();
        pt->playing = false;
        if (state != 'P')
                return 0;
-       seconds = get_play_time(pt);
+       seconds = get_play_time();
        pt->playing = false;
        ss = 0;
        if (pt->seconds > 0)
@@ -910,20 +903,19 @@ static int com_pause(struct play_task *pt,
        ss = PARA_MAX(ss, 0UL);
        ss = PARA_MIN(ss, pt->num_chunks);
        pt->start_chunk = ss;
-       kill_stream(pt);
+       kill_stream();
        return 0;
 }
 EXPORT_PLAY_CMD_HANDLER(pause);
 
-static int com_prev(struct play_task *pt,
-       __a_unused struct lls_parse_result *lpr)
+static int com_prev(__a_unused struct lls_parse_result *lpr)
 {
        int ret;
 
-       ret = previous_valid_file(pt);
+       ret = previous_valid_file();
        if (ret < 0)
                return ret;
-       kill_stream(pt);
+       kill_stream();
        pt->next_file = ret;
        pt->rq = CRT_FILE_CHANGE;
        pt->start_chunk = 0;
@@ -931,15 +923,14 @@ static int com_prev(struct play_task *pt,
 }
 EXPORT_PLAY_CMD_HANDLER(prev);
 
-static int com_next(struct play_task *pt,
-               __a_unused struct lls_parse_result *lpr)
+static int com_next(__a_unused struct lls_parse_result *lpr)
 {
        int ret;
 
-       ret = next_valid_file(pt);
+       ret = next_valid_file();
        if (ret < 0)
                return ret;
-       kill_stream(pt);
+       kill_stream();
        pt->next_file = ret;
        pt->rq = CRT_FILE_CHANGE;
        pt->start_chunk = 0;
@@ -947,23 +938,21 @@ static int com_next(struct play_task *pt,
 }
 EXPORT_PLAY_CMD_HANDLER(next);
 
-static int com_fg(struct play_task *pt,
-               __a_unused struct lls_parse_result *lpr)
+static int com_fg(__a_unused struct lls_parse_result *lpr)
 {
        pt->background = false;
        return 0;
 }
 EXPORT_PLAY_CMD_HANDLER(fg);
 
-static int com_bg(struct play_task *pt,
-       __a_unused struct lls_parse_result *lpr)
+static int com_bg(__a_unused struct lls_parse_result *lpr)
 {
        pt->background = true;
        return 0;
 }
 EXPORT_PLAY_CMD_HANDLER(bg);
 
-static int com_jmp(struct play_task *pt, struct lls_parse_result *lpr)
+static int com_jmp(struct lls_parse_result *lpr)
 {
        int32_t percent;
        int ret;
@@ -982,19 +971,19 @@ static int com_jmp(struct play_task *pt, struct lls_parse_result *lpr)
        if (percent < 0 || percent > 100)
                return -ERRNO_TO_PARA_ERROR(EINVAL);
        if (percent == 100)
-               return com_next(pt, NULL);
+               return com_next(NULL);
        if (pt->playing && !pt->fn.btrn)
                return 0;
        pt->start_chunk = percent * pt->num_chunks / 100;
        if (!pt->playing)
                return 0;
        pt->rq = CRT_REPOS;
-       kill_stream(pt);
+       kill_stream();
        return 0;
 }
 EXPORT_PLAY_CMD_HANDLER(jmp);
 
-static int com_ff(struct play_task *pt, struct lls_parse_result *lpr)
+static int com_ff(struct lls_parse_result *lpr)
 {
        int32_t seconds;
        char *errctx;
@@ -1012,7 +1001,7 @@ static int com_ff(struct play_task *pt, struct lls_parse_result *lpr)
                return ret;
        if (pt->playing && !pt->fn.btrn)
                return 0;
-       seconds += get_play_time(pt);
+       seconds += get_play_time();
        seconds = PARA_MIN(seconds, (typeof(seconds))pt->seconds - 4);
        seconds = PARA_MAX(seconds, 0);
        pt->start_chunk = pt->num_chunks * seconds / pt->seconds;
@@ -1021,12 +1010,12 @@ static int com_ff(struct play_task *pt, struct lls_parse_result *lpr)
        if (!pt->playing)
                return 0;
        pt->rq = CRT_REPOS;
-       kill_stream(pt);
+       kill_stream();
        return 0;
 }
 EXPORT_PLAY_CMD_HANDLER(ff);
 
-static int run_command(char *line, struct play_task *pt)
+static int run_command(char *line)
 {
        int ret, argc;
        char **argv = NULL;
@@ -1035,7 +1024,7 @@ static int run_command(char *line, struct play_task *pt)
        struct lls_parse_result *lpr;
        const struct lls_command *cmd;
 
-       attach_stdout(pt, __FUNCTION__);
+       attach_stdout(__FUNCTION__);
        ret = create_argv(line, " ", &argv);
        if (ret < 0)
                goto out;
@@ -1050,7 +1039,7 @@ static int run_command(char *line, struct play_task *pt)
        if (ret < 0)
                goto out;
        pci = lls_user_data(cmd);
-       ret = pci->handler(pt, lpr);
+       ret = pci->handler(lpr);
        lls_free_parse_result(lpr, cmd);
 out:
        if (errctx)
@@ -1062,12 +1051,11 @@ out:
 
 static int play_i9e_line_handler(char *line)
 {
-       return run_command(line, &play_task);
+       return run_command(line);
 }
 
 static int play_i9e_key_handler(int key)
 {
-       struct play_task *pt = &play_task;
        int idx = get_key_map_idx(key);
        char *seq = get_key_map_seq(key);
        char *cmd = get_key_map_cmd(key);
@@ -1076,7 +1064,7 @@ static int play_i9e_key_handler(int key)
        PARA_NOTICE_LOG("pressed %d: %s key #%d (%s -> %s)\n",
                key, internal? "internal" : "user-defined",
                idx, seq, cmd);
-       run_command(cmd, pt);
+       run_command(cmd);
        free(seq);
        free(cmd);
        pt->next_update = *now;
@@ -1093,7 +1081,7 @@ static struct i9e_client_info ici = {
 
 static void sigint_handler(int sig)
 {
-       play_task.background = true;
+       pt->background = true;
        i9e_signal_dispatch(sig);
 }
 
@@ -1102,7 +1090,7 @@ static void sigint_handler(int sig)
  * stderr. Once the i9e subsystem has been initialized, we switch to the i9e
  * log facility.
  */
-static void session_open(struct play_task *pt)
+static void session_open(void)
 {
        int ret;
        char *history_file;
@@ -1146,7 +1134,7 @@ out:
        exit(EXIT_FAILURE);
 }
 
-static void session_update_time_string(struct play_task *pt, char *str, unsigned len)
+static void session_update_time_string(char *str, unsigned len)
 {
        if (pt->background)
                return;
@@ -1171,30 +1159,30 @@ static void session_update_time_string(struct play_task *pt, char *str, unsigned
  * terminates. Subsequent calls to i9e_get_error() then return negative and we
  * are allowed to call i9e_close() and terminate as well.
  */
-static int session_post_select(__a_unused struct sched *s, struct play_task *pt)
+static int session_post_select(__a_unused struct sched *s)
 {
        int ret;
 
        if (pt->background)
-               detach_stdout(pt);
+               detach_stdout();
        else
-               attach_stdout(pt, __FUNCTION__);
+               attach_stdout(__FUNCTION__);
        ret = i9e_get_error();
        if (ret < 0) {
-               kill_stream(pt);
+               kill_stream();
                i9e_close();
                para_log = stderr_log;
                free(ici.history_file);
                return ret;
        }
-       if (get_playback_state(pt) == 'X')
+       if (get_playback_state() == 'X')
                i9e_signal_dispatch(SIGTERM);
        return 0;
 }
 
 #else /* HAVE_READLINE */
 
-static int session_post_select(struct sched *s, struct play_task *pt)
+static int session_post_select(struct sched *s)
 {
        char c;
 
@@ -1202,38 +1190,36 @@ static int session_post_select(struct sched *s, struct play_task *pt)
                return 0;
        if (read(STDIN_FILENO, &c, 1))
                do_nothing;
-       kill_stream(pt);
+       kill_stream();
        return 1;
 }
 
-static void session_open(__a_unused struct play_task *pt)
+static void session_open(void)
 {
 }
 
-static void session_update_time_string(__a_unused struct play_task *pt,
-               char *str, __a_unused unsigned len)
+static void session_update_time_string(char *str, __a_unused unsigned len)
 {
        printf("\r%s     ", str);
        fflush(stdout);
 }
 #endif /* HAVE_READLINE */
 
-static void play_pre_select(struct sched *s, void *context)
+static void play_pre_select(struct sched *s, __a_unused void *context)
 {
-       struct play_task *pt = context;
        char state;
 
        para_fd_set(STDIN_FILENO, &s->rfds, &s->max_fileno);
-       state = get_playback_state(pt);
+       state = get_playback_state();
        if (state == 'R' || state == 'F' || state == 'X')
                return sched_min_delay(s);
        sched_request_barrier_or_min_delay(&pt->next_update, s);
 }
 
-static unsigned get_time_string(struct play_task *pt, char **result)
+static unsigned get_time_string(char **result)
 {
        int seconds, length;
-       char state = get_playback_state(pt);
+       char state = get_playback_state();
 
        /* do not return anything if things are about to change */
        if (state != 'P' && state != 'U') {
@@ -1243,7 +1229,7 @@ static unsigned get_time_string(struct play_task *pt, char **result)
        length = pt->seconds;
        if (length == 0)
                return xasprintf(result, "0:00 [0:00] (0%%/0:00)");
-       seconds = get_play_time(pt);
+       seconds = get_play_time();
        return xasprintf(result, "#%u: %d:%02d [%d:%02d] (%d%%/%d:%02d) %s",
                pt->current_file,
                seconds / 60,
@@ -1257,24 +1243,23 @@ static unsigned get_time_string(struct play_task *pt, char **result)
        );
 }
 
-static int play_post_select(struct sched *s, void *context)
+static int play_post_select(struct sched *s, __a_unused void *context)
 {
-       struct play_task *pt = context;
        int ret;
 
-       ret = eof_cleanup(pt);
+       ret = eof_cleanup();
        if (ret < 0) {
                pt->rq = CRT_TERM_RQ;
                return 0;
        }
-       ret = session_post_select(s, pt);
+       ret = session_post_select(s);
        if (ret < 0)
                goto out;
        if (!pt->wn.btrn && !pt->fn.btrn) {
-               char state = get_playback_state(pt);
+               char state = get_playback_state();
                if (state == 'P' || state == 'R' || state == 'F') {
                        PARA_NOTICE_LOG("state: %c\n", state);
-                       ret = load_next_file(pt);
+                       ret = load_next_file();
                        if (ret < 0) {
                                PARA_ERROR_LOG("%s\n", para_strerror(-ret));
                                pt->rq = CRT_TERM_RQ;
@@ -1286,10 +1271,10 @@ static int play_post_select(struct sched *s, void *context)
        }
        if (tv_diff(now, &pt->next_update, NULL) >= 0) {
                char *str;
-               unsigned len = get_time_string(pt, &str);
+               unsigned len = get_time_string(&str);
                struct timeval delay = {.tv_sec = 0, .tv_usec = 100 * 1000};
                if (str && len > 0)
-                       session_update_time_string(pt, str, len);
+                       session_update_time_string(str, len);
                free(str);
                tv_add(now, &delay, &pt->next_update);
        }
@@ -1309,7 +1294,6 @@ out:
 int main(int argc, char *argv[])
 {
        int ret;
-       struct play_task *pt = &play_task;
        unsigned num_inputs;
 
        /* needed this early to make help work */
@@ -1318,7 +1302,7 @@ int main(int argc, char *argv[])
        sched.default_timeout.tv_sec = 5;
        parse_config_or_die(argc, argv);
        AFH_RECV->init();
-       session_open(pt);
+       session_open();
        num_inputs = lls_num_inputs(play_lpr);
        init_shuffle_map();
        pt->invalid = para_calloc(sizeof(*pt->invalid) * num_inputs);
diff --git a/recv.c b/recv.c
index 9842c7d..26aa7fd 100644 (file)
--- a/recv.c
+++ b/recv.c
@@ -8,7 +8,6 @@
 
 #include <regex.h>
 #include <sys/types.h>
-#include <inttypes.h>
 #include <lopsub.h>
 
 #include "recv_cmd.lsg.h"
index 5eb1606..e675502 100644 (file)
--- a/string.c
+++ b/string.c
@@ -10,7 +10,6 @@
 
 #include <pwd.h>
 #include <sys/utsname.h> /* uname() */
-#include <string.h>
 #include <regex.h>
 #include <langinfo.h>
 #include <wchar.h>
diff --git a/web/dia/overview.dia b/web/dia/overview.dia
deleted file mode 100644 (file)
index f9e0158..0000000
+++ /dev/null
@@ -1,3817 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<dia:diagram xmlns:dia="http://www.lysator.liu.se/~alla/dia/">
-  <dia:diagramdata>
-    <dia:attribute name="background">
-      <dia:color val="#ffffff"/>
-    </dia:attribute>
-    <dia:attribute name="pagebreak">
-      <dia:color val="#000099"/>
-    </dia:attribute>
-    <dia:attribute name="paper">
-      <dia:composite type="paper">
-        <dia:attribute name="name">
-          <dia:string>#A4#</dia:string>
-        </dia:attribute>
-        <dia:attribute name="tmargin">
-          <dia:real val="2.8222000598907471"/>
-        </dia:attribute>
-        <dia:attribute name="bmargin">
-          <dia:real val="2.8222000598907471"/>
-        </dia:attribute>
-        <dia:attribute name="lmargin">
-          <dia:real val="2.8222000598907471"/>
-        </dia:attribute>
-        <dia:attribute name="rmargin">
-          <dia:real val="2.8222000598907471"/>
-        </dia:attribute>
-        <dia:attribute name="is_portrait">
-          <dia:boolean val="true"/>
-        </dia:attribute>
-        <dia:attribute name="scaling">
-          <dia:real val="1"/>
-        </dia:attribute>
-        <dia:attribute name="fitto">
-          <dia:boolean val="false"/>
-        </dia:attribute>
-      </dia:composite>
-    </dia:attribute>
-    <dia:attribute name="grid">
-      <dia:composite type="grid">
-        <dia:attribute name="width_x">
-          <dia:real val="1"/>
-        </dia:attribute>
-        <dia:attribute name="width_y">
-          <dia:real val="1"/>
-        </dia:attribute>
-        <dia:attribute name="visible_x">
-          <dia:int val="1"/>
-        </dia:attribute>
-        <dia:attribute name="visible_y">
-          <dia:int val="1"/>
-        </dia:attribute>
-        <dia:composite type="color"/>
-      </dia:composite>
-    </dia:attribute>
-    <dia:attribute name="color">
-      <dia:color val="#d8e5e5"/>
-    </dia:attribute>
-    <dia:attribute name="guides">
-      <dia:composite type="guides">
-        <dia:attribute name="hguides"/>
-        <dia:attribute name="vguides"/>
-      </dia:composite>
-    </dia:attribute>
-  </dia:diagramdata>
-  <dia:layer name="Background" visible="true" active="true">
-    <dia:object type="Standard - Text" version="1" id="O0">
-      <dia:attribute name="obj_pos">
-        <dia:point val="0.13505,-23.1314"/>
-      </dia:attribute>
-      <dia:attribute name="obj_bb">
-        <dia:rectangle val="0.13505,-23.7264;3.15255,-22.9789"/>
-      </dia:attribute>
-      <dia:attribute name="text">
-        <dia:composite type="text">
-          <dia:attribute name="string">
-            <dia:string>#Overview#</dia:string>
-          </dia:attribute>
-          <dia:attribute name="font">
-            <dia:font family="sans" style="0" name="Helvetica"/>
-          </dia:attribute>
-          <dia:attribute name="height">
-            <dia:real val="0.80000000000000004"/>
-          </dia:attribute>
-          <dia:attribute name="pos">
-            <dia:point val="0.13505,-23.1314"/>
-          </dia:attribute>
-          <dia:attribute name="color">
-            <dia:color val="#000000"/>
-          </dia:attribute>
-          <dia:attribute name="alignment">
-            <dia:enum val="0"/>
-          </dia:attribute>
-        </dia:composite>
-      </dia:attribute>
-      <dia:attribute name="valign">
-        <dia:enum val="3"/>
-      </dia:attribute>
-    </dia:object>
-    <dia:object type="Standard - Text" version="1" id="O1">
-      <dia:attribute name="obj_pos">
-        <dia:point val="0.1367,0.8291"/>
-      </dia:attribute>
-      <dia:attribute name="obj_bb">
-        <dia:rectangle val="0.1367,0.2341;3.9392,0.9816"/>
-      </dia:attribute>
-      <dia:attribute name="text">
-        <dia:composite type="text">
-          <dia:attribute name="string">
-            <dia:string>#para_server#</dia:string>
-          </dia:attribute>
-          <dia:attribute name="font">
-            <dia:font family="sans" style="0" name="Helvetica"/>
-          </dia:attribute>
-          <dia:attribute name="height">
-            <dia:real val="0.80000000000000004"/>
-          </dia:attribute>
-          <dia:attribute name="pos">
-            <dia:point val="0.1367,0.8291"/>
-          </dia:attribute>
-          <dia:attribute name="color">
-            <dia:color val="#000000"/>
-          </dia:attribute>
-          <dia:attribute name="alignment">
-            <dia:enum val="0"/>
-          </dia:attribute>
-        </dia:composite>
-      </dia:attribute>
-      <dia:attribute name="valign">
-        <dia:enum val="3"/>
-      </dia:attribute>
-    </dia:object>
-    <dia:object type="Standard - Text" version="1" id="O2">
-      <dia:attribute name="obj_pos">
-        <dia:point val="0.225,9.8561"/>
-      </dia:attribute>
-      <dia:attribute name="obj_bb">
-        <dia:rectangle val="0.213438,9.47704;14.6275,15.9009"/>
-      </dia:attribute>
-      <dia:attribute name="text">
-        <dia:composite type="text">
-          <dia:attribute name="string">
-            <dia:string>#Incoming connections arrive via TCP at the dispatcher which creates a
-command handler process for each connection.
-
-After the connecting client has been authenticated, the command
-handler propagates the incoming request either to the audio file
-selector (afs) or to the virtual streaming system (vss). Results are sent
-back to the client.
-
-afs maintans the audio file database and  is responsible for selecting
-and loading audio files while vss controls the paraslash senders. When
-vss needs to stream an audio file it requests an open file descriptor from
-afs and feeds small chunks of data (e.g. mp3 frames) to the senders
-which send the chunks to all connected clients.#</dia:string>
-          </dia:attribute>
-          <dia:attribute name="font">
-            <dia:font family="sans" style="0" name="Helvetica"/>
-          </dia:attribute>
-          <dia:attribute name="height">
-            <dia:real val="0.49388889176727813"/>
-          </dia:attribute>
-          <dia:attribute name="pos">
-            <dia:point val="0.225,9.8561"/>
-          </dia:attribute>
-          <dia:attribute name="color">
-            <dia:color val="#000000"/>
-          </dia:attribute>
-          <dia:attribute name="alignment">
-            <dia:enum val="0"/>
-          </dia:attribute>
-        </dia:composite>
-      </dia:attribute>
-      <dia:attribute name="valign">
-        <dia:enum val="3"/>
-      </dia:attribute>
-    </dia:object>
-    <dia:object type="Standard - Text" version="1" id="O3">
-      <dia:attribute name="obj_pos">
-        <dia:point val="3.1702,14.0975"/>
-      </dia:attribute>
-      <dia:attribute name="obj_bb">
-        <dia:rectangle val="3.1702,13.5025;3.1702,14.25"/>
-      </dia:attribute>
-      <dia:attribute name="text">
-        <dia:composite type="text">
-          <dia:attribute name="string">
-            <dia:string>##</dia:string>
-          </dia:attribute>
-          <dia:attribute name="font">
-            <dia:font family="sans" style="0" name="Helvetica"/>
-          </dia:attribute>
-          <dia:attribute name="height">
-            <dia:real val="0.80000000000000004"/>
-          </dia:attribute>
-          <dia:attribute name="pos">
-            <dia:point val="3.1702,14.0975"/>
-          </dia:attribute>
-          <dia:attribute name="color">
-            <dia:color val="#000000"/>
-          </dia:attribute>
-          <dia:attribute name="alignment">
-            <dia:enum val="0"/>
-          </dia:attribute>
-        </dia:composite>
-      </dia:attribute>
-      <dia:attribute name="valign">
-        <dia:enum val="3"/>
-      </dia:attribute>
-    </dia:object>
-    <dia:group>
-      <dia:object type="Network - Bus" version="0" id="O4">
-        <dia:attribute name="obj_pos">
-          <dia:point val="6.3534,2.3542"/>
-        </dia:attribute>
-        <dia:attribute name="obj_bb">
-          <dia:rectangle val="3.58996,2.30409;11.989,6.1401"/>
-        </dia:attribute>
-        <dia:attribute name="conn_endpoints">
-          <dia:point val="6.3534,2.3542"/>
-          <dia:point val="11.9389,2.3663"/>
-        </dia:attribute>
-        <dia:attribute name="line_color">
-          <dia:color val="#000000"/>
-        </dia:attribute>
-        <dia:attribute name="bus_handles">
-          <dia:point val="5.21003,3.2968"/>
-          <dia:point val="3.6399,2.3744"/>
-          <dia:point val="7.88141,3.2968"/>
-          <dia:point val="10.175,6.1401"/>
-          <dia:point val="8.92435,3.44756"/>
-          <dia:point val="6.83847,3.44756"/>
-        </dia:attribute>
-        <dia:connections>
-          <dia:connection handle="2" to="O9" connection="11"/>
-          <dia:connection handle="4" to="O10" connection="11"/>
-          <dia:connection handle="5" to="O12" connection="11"/>
-          <dia:connection handle="6" to="O10" connection="3"/>
-          <dia:connection handle="7" to="O10" connection="6"/>
-        </dia:connections>
-      </dia:object>
-      <dia:object type="Standard - Line" version="0" id="O5">
-        <dia:attribute name="obj_pos">
-          <dia:point val="5.21006,6.4287"/>
-        </dia:attribute>
-        <dia:attribute name="obj_bb">
-          <dia:rectangle val="5.16003,5.6082;5.26006,6.4787"/>
-        </dia:attribute>
-        <dia:attribute name="conn_endpoints">
-          <dia:point val="5.21006,6.4287"/>
-          <dia:point val="5.21003,5.6582"/>
-        </dia:attribute>
-        <dia:attribute name="numcp">
-          <dia:int val="1"/>
-        </dia:attribute>
-        <dia:attribute name="line_width">
-          <dia:real val="0.10000000149011612"/>
-        </dia:attribute>
-        <dia:connections>
-          <dia:connection handle="0" to="O13" connection="11"/>
-          <dia:connection handle="1" to="O8" connection="1"/>
-        </dia:connections>
-      </dia:object>
-      <dia:object type="Standard - ZigZagLine" version="1" id="O6">
-        <dia:attribute name="obj_pos">
-          <dia:point val="4.0215,3.74907"/>
-        </dia:attribute>
-        <dia:attribute name="obj_bb">
-          <dia:rectangle val="3.4702,3.69907;11.8875,8.4582"/>
-        </dia:attribute>
-        <dia:attribute name="orth_points">
-          <dia:point val="4.0215,3.74907"/>
-          <dia:point val="3.5202,3.74907"/>
-          <dia:point val="3.5202,8.4082"/>
-          <dia:point val="11.8375,8.4082"/>
-          <dia:point val="11.8375,6.88101"/>
-          <dia:point val="11.3172,6.88101"/>
-        </dia:attribute>
-        <dia:attribute name="orth_orient">
-          <dia:enum val="0"/>
-          <dia:enum val="1"/>
-          <dia:enum val="0"/>
-          <dia:enum val="1"/>
-          <dia:enum val="0"/>
-        </dia:attribute>
-        <dia:attribute name="autorouting">
-          <dia:boolean val="false"/>
-        </dia:attribute>
-        <dia:attribute name="line_width">
-          <dia:real val="0.10000000149011612"/>
-        </dia:attribute>
-        <dia:connections>
-          <dia:connection handle="0" to="O9" connection="8"/>
-          <dia:connection handle="1" to="O12" connection="5"/>
-        </dia:connections>
-      </dia:object>
-      <dia:object type="Standard - ZigZagLine" version="1" id="O7">
-        <dia:attribute name="obj_pos">
-          <dia:point val="10.175,7.62192"/>
-        </dia:attribute>
-        <dia:attribute name="obj_bb">
-          <dia:rectangle val="5.16006,7.28325;10.225,8.0832"/>
-        </dia:attribute>
-        <dia:attribute name="orth_points">
-          <dia:point val="10.175,7.62192"/>
-          <dia:point val="10.175,8.0332"/>
-          <dia:point val="5.21006,8.0332"/>
-          <dia:point val="5.21006,7.33325"/>
-        </dia:attribute>
-        <dia:attribute name="orth_orient">
-          <dia:enum val="1"/>
-          <dia:enum val="0"/>
-          <dia:enum val="1"/>
-        </dia:attribute>
-        <dia:attribute name="autorouting">
-          <dia:boolean val="false"/>
-        </dia:attribute>
-        <dia:attribute name="line_width">
-          <dia:real val="0.10000000149011612"/>
-        </dia:attribute>
-        <dia:connections>
-          <dia:connection handle="0" to="O12" connection="2"/>
-          <dia:connection handle="1" to="O13" connection="2"/>
-        </dia:connections>
-      </dia:object>
-      <dia:object type="Network - Storage" version="1" id="O8">
-        <dia:attribute name="obj_pos">
-          <dia:point val="4.7175,4.4993"/>
-        </dia:attribute>
-        <dia:attribute name="obj_bb">
-          <dia:rectangle val="4.6675,4.4493;5.75257,6.51078"/>
-        </dia:attribute>
-        <dia:attribute name="meta">
-          <dia:composite type="dict"/>
-        </dia:attribute>
-        <dia:attribute name="elem_corner">
-          <dia:point val="4.7175,4.4993"/>
-        </dia:attribute>
-        <dia:attribute name="elem_width">
-          <dia:real val="0.9850649999999993"/>
-        </dia:attribute>
-        <dia:attribute name="elem_height">
-          <dia:real val="1.1588999999999992"/>
-        </dia:attribute>
-        <dia:attribute name="line_width">
-          <dia:real val="0.10000000149011612"/>
-        </dia:attribute>
-        <dia:attribute name="line_colour">
-          <dia:color val="#000000"/>
-        </dia:attribute>
-        <dia:attribute name="fill_colour">
-          <dia:color val="#cccccc"/>
-        </dia:attribute>
-        <dia:attribute name="show_background">
-          <dia:boolean val="true"/>
-        </dia:attribute>
-        <dia:attribute name="line_style">
-          <dia:enum val="0"/>
-          <dia:real val="1"/>
-        </dia:attribute>
-        <dia:attribute name="padding">
-          <dia:real val="0.10000000000000001"/>
-        </dia:attribute>
-        <dia:attribute name="text">
-          <dia:composite type="text">
-            <dia:attribute name="string">
-              <dia:string>##</dia:string>
-            </dia:attribute>
-            <dia:attribute name="font">
-              <dia:font family="sans" style="0" name="Helvetica"/>
-            </dia:attribute>
-            <dia:attribute name="height">
-              <dia:real val="0.80010001542891407"/>
-            </dia:attribute>
-            <dia:attribute name="pos">
-              <dia:point val="5.21003,6.25828"/>
-            </dia:attribute>
-            <dia:attribute name="color">
-              <dia:color val="#000000"/>
-            </dia:attribute>
-            <dia:attribute name="alignment">
-              <dia:enum val="1"/>
-            </dia:attribute>
-          </dia:composite>
-        </dia:attribute>
-        <dia:attribute name="flip_horizontal">
-          <dia:boolean val="false"/>
-        </dia:attribute>
-        <dia:attribute name="flip_vertical">
-          <dia:boolean val="false"/>
-        </dia:attribute>
-        <dia:attribute name="subscale">
-          <dia:real val="1"/>
-        </dia:attribute>
-      </dia:object>
-      <dia:object type="BPMN - Task" version="1" id="O9">
-        <dia:attribute name="obj_pos">
-          <dia:point val="3.86929,3.2968"/>
-        </dia:attribute>
-        <dia:attribute name="obj_bb">
-          <dia:rectangle val="3.81929,3.2468;6.60076,4.25135"/>
-        </dia:attribute>
-        <dia:attribute name="meta">
-          <dia:composite type="dict"/>
-        </dia:attribute>
-        <dia:attribute name="elem_corner">
-          <dia:point val="3.86929,3.2968"/>
-        </dia:attribute>
-        <dia:attribute name="elem_width">
-          <dia:real val="2.6814705898130646"/>
-        </dia:attribute>
-        <dia:attribute name="elem_height">
-          <dia:real val="0.90454545953539145"/>
-        </dia:attribute>
-        <dia:attribute name="line_width">
-          <dia:real val="0.10000000149011612"/>
-        </dia:attribute>
-        <dia:attribute name="line_colour">
-          <dia:color val="#000000"/>
-        </dia:attribute>
-        <dia:attribute name="fill_colour">
-          <dia:color val="#ffffff"/>
-        </dia:attribute>
-        <dia:attribute name="show_background">
-          <dia:boolean val="true"/>
-        </dia:attribute>
-        <dia:attribute name="line_style">
-          <dia:enum val="0"/>
-          <dia:real val="1"/>
-        </dia:attribute>
-        <dia:attribute name="padding">
-          <dia:real val="0.10000000000000001"/>
-        </dia:attribute>
-        <dia:attribute name="text">
-          <dia:composite type="text">
-            <dia:attribute name="string">
-              <dia:string>#dispatcher#</dia:string>
-            </dia:attribute>
-            <dia:attribute name="font">
-              <dia:font family="sans" style="0" name="Helvetica"/>
-            </dia:attribute>
-            <dia:attribute name="height">
-              <dia:real val="0.52916666975065518"/>
-            </dia:attribute>
-            <dia:attribute name="pos">
-              <dia:point val="5.21003,3.88136"/>
-            </dia:attribute>
-            <dia:attribute name="color">
-              <dia:color val="#000000"/>
-            </dia:attribute>
-            <dia:attribute name="alignment">
-              <dia:enum val="1"/>
-            </dia:attribute>
-          </dia:composite>
-        </dia:attribute>
-        <dia:attribute name="flip_horizontal">
-          <dia:boolean val="false"/>
-        </dia:attribute>
-        <dia:attribute name="flip_vertical">
-          <dia:boolean val="false"/>
-        </dia:attribute>
-        <dia:attribute name="subscale">
-          <dia:real val="1"/>
-        </dia:attribute>
-      </dia:object>
-      <dia:object type="BPMN - Task" version="1" id="O10">
-        <dia:attribute name="obj_pos">
-          <dia:point val="6.83847,3.2968"/>
-        </dia:attribute>
-        <dia:attribute name="obj_bb">
-          <dia:rectangle val="6.78847,3.2468;8.97435,4.25135"/>
-        </dia:attribute>
-        <dia:attribute name="meta">
-          <dia:composite type="dict"/>
-        </dia:attribute>
-        <dia:attribute name="elem_corner">
-          <dia:point val="6.83847,3.2968"/>
-        </dia:attribute>
-        <dia:attribute name="elem_width">
-          <dia:real val="2.0858823545189464"/>
-        </dia:attribute>
-        <dia:attribute name="elem_height">
-          <dia:real val="0.90454545953538812"/>
-        </dia:attribute>
-        <dia:attribute name="line_width">
-          <dia:real val="0.10000000149011612"/>
-        </dia:attribute>
-        <dia:attribute name="line_colour">
-          <dia:color val="#000000"/>
-        </dia:attribute>
-        <dia:attribute name="fill_colour">
-          <dia:color val="#ffffff"/>
-        </dia:attribute>
-        <dia:attribute name="show_background">
-          <dia:boolean val="true"/>
-        </dia:attribute>
-        <dia:attribute name="line_style">
-          <dia:enum val="0"/>
-          <dia:real val="1"/>
-        </dia:attribute>
-        <dia:attribute name="padding">
-          <dia:real val="0.10000000000000001"/>
-        </dia:attribute>
-        <dia:attribute name="text">
-          <dia:composite type="text">
-            <dia:attribute name="string">
-              <dia:string>#senders#</dia:string>
-            </dia:attribute>
-            <dia:attribute name="font">
-              <dia:font family="sans" style="0" name="Helvetica"/>
-            </dia:attribute>
-            <dia:attribute name="height">
-              <dia:real val="0.52916666975065518"/>
-            </dia:attribute>
-            <dia:attribute name="pos">
-              <dia:point val="7.88141,3.88136"/>
-            </dia:attribute>
-            <dia:attribute name="color">
-              <dia:color val="#000000"/>
-            </dia:attribute>
-            <dia:attribute name="alignment">
-              <dia:enum val="1"/>
-            </dia:attribute>
-          </dia:composite>
-        </dia:attribute>
-        <dia:attribute name="flip_horizontal">
-          <dia:boolean val="false"/>
-        </dia:attribute>
-        <dia:attribute name="flip_vertical">
-          <dia:boolean val="false"/>
-        </dia:attribute>
-        <dia:attribute name="subscale">
-          <dia:real val="1"/>
-        </dia:attribute>
-      </dia:object>
-      <dia:object type="BPMN - Task" version="1" id="O11">
-        <dia:attribute name="obj_pos">
-          <dia:point val="7.35748,6.4287"/>
-        </dia:attribute>
-        <dia:attribute name="obj_bb">
-          <dia:rectangle val="7.30748,6.3787;8.45572,7.38325"/>
-        </dia:attribute>
-        <dia:attribute name="meta">
-          <dia:composite type="dict"/>
-        </dia:attribute>
-        <dia:attribute name="elem_corner">
-          <dia:point val="7.35748,6.4287"/>
-        </dia:attribute>
-        <dia:attribute name="elem_width">
-          <dia:real val="1.0482352956954173"/>
-        </dia:attribute>
-        <dia:attribute name="elem_height">
-          <dia:real val="0.90454545953538545"/>
-        </dia:attribute>
-        <dia:attribute name="line_width">
-          <dia:real val="0.10000000149011612"/>
-        </dia:attribute>
-        <dia:attribute name="line_colour">
-          <dia:color val="#000000"/>
-        </dia:attribute>
-        <dia:attribute name="fill_colour">
-          <dia:color val="#ffffff"/>
-        </dia:attribute>
-        <dia:attribute name="show_background">
-          <dia:boolean val="true"/>
-        </dia:attribute>
-        <dia:attribute name="line_style">
-          <dia:enum val="0"/>
-          <dia:real val="1"/>
-        </dia:attribute>
-        <dia:attribute name="padding">
-          <dia:real val="0.10000000000000001"/>
-        </dia:attribute>
-        <dia:attribute name="text">
-          <dia:composite type="text">
-            <dia:attribute name="string">
-              <dia:string>#vss#</dia:string>
-            </dia:attribute>
-            <dia:attribute name="font">
-              <dia:font family="sans" style="0" name="Helvetica"/>
-            </dia:attribute>
-            <dia:attribute name="height">
-              <dia:real val="0.52916666975065518"/>
-            </dia:attribute>
-            <dia:attribute name="pos">
-              <dia:point val="7.8816,7.01326"/>
-            </dia:attribute>
-            <dia:attribute name="color">
-              <dia:color val="#000000"/>
-            </dia:attribute>
-            <dia:attribute name="alignment">
-              <dia:enum val="1"/>
-            </dia:attribute>
-          </dia:composite>
-        </dia:attribute>
-        <dia:attribute name="flip_horizontal">
-          <dia:boolean val="false"/>
-        </dia:attribute>
-        <dia:attribute name="flip_vertical">
-          <dia:boolean val="false"/>
-        </dia:attribute>
-        <dia:attribute name="subscale">
-          <dia:real val="1"/>
-        </dia:attribute>
-      </dia:object>
-      <dia:object type="BPMN - Task" version="1" id="O12">
-        <dia:attribute name="obj_pos">
-          <dia:point val="8.8978,6.1401"/>
-        </dia:attribute>
-        <dia:attribute name="obj_bb">
-          <dia:rectangle val="8.8478,6.0901;11.5022,7.67192"/>
-        </dia:attribute>
-        <dia:attribute name="meta">
-          <dia:composite type="dict"/>
-        </dia:attribute>
-        <dia:attribute name="elem_corner">
-          <dia:point val="8.8978,6.1401"/>
-        </dia:attribute>
-        <dia:attribute name="elem_width">
-          <dia:real val="2.5544117662836525"/>
-        </dia:attribute>
-        <dia:attribute name="elem_height">
-          <dia:real val="1.4818181901724667"/>
-        </dia:attribute>
-        <dia:attribute name="line_width">
-          <dia:real val="0.10000000149011612"/>
-        </dia:attribute>
-        <dia:attribute name="line_colour">
-          <dia:color val="#000000"/>
-        </dia:attribute>
-        <dia:attribute name="fill_colour">
-          <dia:color val="#ffffff"/>
-        </dia:attribute>
-        <dia:attribute name="show_background">
-          <dia:boolean val="true"/>
-        </dia:attribute>
-        <dia:attribute name="line_style">
-          <dia:enum val="0"/>
-          <dia:real val="1"/>
-        </dia:attribute>
-        <dia:attribute name="padding">
-          <dia:real val="0.10000000000000001"/>
-        </dia:attribute>
-        <dia:attribute name="text">
-          <dia:composite type="text">
-            <dia:attribute name="string">
-              <dia:string>#command
-handler#</dia:string>
-            </dia:attribute>
-            <dia:attribute name="font">
-              <dia:font family="sans" style="0" name="Helvetica"/>
-            </dia:attribute>
-            <dia:attribute name="height">
-              <dia:real val="0.52916666975065518"/>
-            </dia:attribute>
-            <dia:attribute name="pos">
-              <dia:point val="10.175,6.74872"/>
-            </dia:attribute>
-            <dia:attribute name="color">
-              <dia:color val="#000000"/>
-            </dia:attribute>
-            <dia:attribute name="alignment">
-              <dia:enum val="1"/>
-            </dia:attribute>
-          </dia:composite>
-        </dia:attribute>
-        <dia:attribute name="flip_horizontal">
-          <dia:boolean val="false"/>
-        </dia:attribute>
-        <dia:attribute name="flip_vertical">
-          <dia:boolean val="false"/>
-        </dia:attribute>
-        <dia:attribute name="subscale">
-          <dia:real val="1"/>
-        </dia:attribute>
-      </dia:object>
-      <dia:object type="BPMN - Task" version="1" id="O13">
-        <dia:attribute name="obj_pos">
-          <dia:point val="4.71771,6.4287"/>
-        </dia:attribute>
-        <dia:attribute name="obj_bb">
-          <dia:rectangle val="4.66771,6.3787;5.75242,7.38325"/>
-        </dia:attribute>
-        <dia:attribute name="meta">
-          <dia:composite type="dict"/>
-        </dia:attribute>
-        <dia:attribute name="elem_corner">
-          <dia:point val="4.71771,6.4287"/>
-        </dia:attribute>
-        <dia:attribute name="elem_width">
-          <dia:real val="0.98470588393071123"/>
-        </dia:attribute>
-        <dia:attribute name="elem_height">
-          <dia:real val="0.90454545953538301"/>
-        </dia:attribute>
-        <dia:attribute name="line_width">
-          <dia:real val="0.10000000149011612"/>
-        </dia:attribute>
-        <dia:attribute name="line_colour">
-          <dia:color val="#000000"/>
-        </dia:attribute>
-        <dia:attribute name="fill_colour">
-          <dia:color val="#ffffff"/>
-        </dia:attribute>
-        <dia:attribute name="show_background">
-          <dia:boolean val="true"/>
-        </dia:attribute>
-        <dia:attribute name="line_style">
-          <dia:enum val="0"/>
-          <dia:real val="1"/>
-        </dia:attribute>
-        <dia:attribute name="padding">
-          <dia:real val="0.10000000000000001"/>
-        </dia:attribute>
-        <dia:attribute name="text">
-          <dia:composite type="text">
-            <dia:attribute name="string">
-              <dia:string>#afs#</dia:string>
-            </dia:attribute>
-            <dia:attribute name="font">
-              <dia:font family="sans" style="0" name="Helvetica"/>
-            </dia:attribute>
-            <dia:attribute name="height">
-              <dia:real val="0.52916666975065518"/>
-            </dia:attribute>
-            <dia:attribute name="pos">
-              <dia:point val="5.21006,7.01326"/>
-            </dia:attribute>
-            <dia:attribute name="color">
-              <dia:color val="#000000"/>
-            </dia:attribute>
-            <dia:attribute name="alignment">
-              <dia:enum val="1"/>
-            </dia:attribute>
-          </dia:composite>
-        </dia:attribute>
-        <dia:attribute name="flip_horizontal">
-          <dia:boolean val="false"/>
-        </dia:attribute>
-        <dia:attribute name="flip_vertical">
-          <dia:boolean val="false"/>
-        </dia:attribute>
-        <dia:attribute name="subscale">
-          <dia:real val="1"/>
-        </dia:attribute>
-      </dia:object>
-      <dia:object type="Standard - Line" version="0" id="O14">
-        <dia:attribute name="obj_pos">
-          <dia:point val="7.8816,6.4287"/>
-        </dia:attribute>
-        <dia:attribute name="obj_bb">
-          <dia:rectangle val="7.83141,4.15135;7.9316,6.4787"/>
-        </dia:attribute>
-        <dia:attribute name="conn_endpoints">
-          <dia:point val="7.8816,6.4287"/>
-          <dia:point val="7.88141,4.20135"/>
-        </dia:attribute>
-        <dia:attribute name="numcp">
-          <dia:int val="1"/>
-        </dia:attribute>
-        <dia:attribute name="line_width">
-          <dia:real val="0.10000000149011612"/>
-        </dia:attribute>
-        <dia:connections>
-          <dia:connection handle="0" to="O11" connection="11"/>
-          <dia:connection handle="1" to="O10" connection="2"/>
-        </dia:connections>
-      </dia:object>
-      <dia:object type="Standard - Line" version="0" id="O15">
-        <dia:attribute name="obj_pos">
-          <dia:point val="8.3766,6.88097"/>
-        </dia:attribute>
-        <dia:attribute name="obj_bb">
-          <dia:rectangle val="8.3266,6.83097;9.0828,6.93101"/>
-        </dia:attribute>
-        <dia:attribute name="conn_endpoints">
-          <dia:point val="8.3766,6.88097"/>
-          <dia:point val="9.0328,6.88101"/>
-        </dia:attribute>
-        <dia:attribute name="numcp">
-          <dia:int val="1"/>
-        </dia:attribute>
-        <dia:attribute name="line_width">
-          <dia:real val="0.10000000149011612"/>
-        </dia:attribute>
-        <dia:connections>
-          <dia:connection handle="0" to="O11" connection="5"/>
-          <dia:connection handle="1" to="O12" connection="8"/>
-        </dia:connections>
-      </dia:object>
-      <dia:object type="Standard - Line" version="0" id="O16">
-        <dia:attribute name="obj_pos">
-          <dia:point val="5.66933,6.88097"/>
-        </dia:attribute>
-        <dia:attribute name="obj_bb">
-          <dia:rectangle val="5.61933,6.83097;7.4366,6.93097"/>
-        </dia:attribute>
-        <dia:attribute name="conn_endpoints">
-          <dia:point val="5.66933,6.88097"/>
-          <dia:point val="7.3866,6.88097"/>
-        </dia:attribute>
-        <dia:attribute name="numcp">
-          <dia:int val="1"/>
-        </dia:attribute>
-        <dia:attribute name="line_width">
-          <dia:real val="0.10000000149011612"/>
-        </dia:attribute>
-        <dia:connections>
-          <dia:connection handle="0" to="O13" connection="5"/>
-          <dia:connection handle="1" to="O11" connection="8"/>
-        </dia:connections>
-      </dia:object>
-    </dia:group>
-    <dia:object type="Network - An amplifier speaker" version="1" id="O17">
-      <dia:attribute name="obj_pos">
-        <dia:point val="9.8398,-22.1251"/>
-      </dia:attribute>
-      <dia:attribute name="obj_bb">
-        <dia:rectangle val="9.7898,-22.1751;11.2046,-19.4456"/>
-      </dia:attribute>
-      <dia:attribute name="meta">
-        <dia:composite type="dict"/>
-      </dia:attribute>
-      <dia:attribute name="elem_corner">
-        <dia:point val="9.8398,-22.1251"/>
-      </dia:attribute>
-      <dia:attribute name="elem_width">
-        <dia:real val="1.314752411332281"/>
-      </dia:attribute>
-      <dia:attribute name="elem_height">
-        <dia:real val="2.6295048226645621"/>
-      </dia:attribute>
-      <dia:attribute name="line_width">
-        <dia:real val="0.10000000149011612"/>
-      </dia:attribute>
-      <dia:attribute name="line_colour">
-        <dia:color val="#000000"/>
-      </dia:attribute>
-      <dia:attribute name="fill_colour">
-        <dia:color val="#ffffff"/>
-      </dia:attribute>
-      <dia:attribute name="show_background">
-        <dia:boolean val="true"/>
-      </dia:attribute>
-      <dia:attribute name="line_style">
-        <dia:enum val="0"/>
-        <dia:real val="1"/>
-      </dia:attribute>
-      <dia:attribute name="flip_horizontal">
-        <dia:boolean val="false"/>
-      </dia:attribute>
-      <dia:attribute name="flip_vertical">
-        <dia:boolean val="false"/>
-      </dia:attribute>
-      <dia:attribute name="subscale">
-        <dia:real val="1"/>
-      </dia:attribute>
-    </dia:object>
-    <dia:object type="Network - General Monitor (With Stand)" version="1" id="O18">
-      <dia:attribute name="obj_pos">
-        <dia:point val="3.20424,-21.8387"/>
-      </dia:attribute>
-      <dia:attribute name="obj_bb">
-        <dia:rectangle val="3.19174,-21.8512;5.40635,-18.76"/>
-      </dia:attribute>
-      <dia:attribute name="meta">
-        <dia:composite type="dict"/>
-      </dia:attribute>
-      <dia:attribute name="elem_corner">
-        <dia:point val="3.20424,-21.8387"/>
-      </dia:attribute>
-      <dia:attribute name="elem_width">
-        <dia:real val="2.1896140767718091"/>
-      </dia:attribute>
-      <dia:attribute name="elem_height">
-        <dia:real val="2.1531205088256122"/>
-      </dia:attribute>
-      <dia:attribute name="line_width">
-        <dia:real val="0.05000000074505806"/>
-      </dia:attribute>
-      <dia:attribute name="line_colour">
-        <dia:color val="#000000"/>
-      </dia:attribute>
-      <dia:attribute name="fill_colour">
-        <dia:color val="#ffffff"/>
-      </dia:attribute>
-      <dia:attribute name="show_background">
-        <dia:boolean val="true"/>
-      </dia:attribute>
-      <dia:attribute name="line_style">
-        <dia:enum val="0"/>
-        <dia:real val="1"/>
-      </dia:attribute>
-      <dia:attribute name="padding">
-        <dia:real val="0.10000000000000001"/>
-      </dia:attribute>
-      <dia:attribute name="text">
-        <dia:composite type="text">
-          <dia:attribute name="string">
-            <dia:string>##</dia:string>
-          </dia:attribute>
-          <dia:attribute name="font">
-            <dia:font family="sans" style="0" name="Helvetica"/>
-          </dia:attribute>
-          <dia:attribute name="height">
-            <dia:real val="0.80010001542891407"/>
-          </dia:attribute>
-          <dia:attribute name="pos">
-            <dia:point val="4.29905,-19.0125"/>
-          </dia:attribute>
-          <dia:attribute name="color">
-            <dia:color val="#000000"/>
-          </dia:attribute>
-          <dia:attribute name="alignment">
-            <dia:enum val="1"/>
-          </dia:attribute>
-        </dia:composite>
-      </dia:attribute>
-      <dia:attribute name="flip_horizontal">
-        <dia:boolean val="false"/>
-      </dia:attribute>
-      <dia:attribute name="flip_vertical">
-        <dia:boolean val="false"/>
-      </dia:attribute>
-      <dia:attribute name="subscale">
-        <dia:real val="1"/>
-      </dia:attribute>
-    </dia:object>
-    <dia:object type="Standard - Line" version="0" id="O19">
-      <dia:attribute name="obj_pos">
-        <dia:point val="11.7649,-16.3593"/>
-      </dia:attribute>
-      <dia:attribute name="obj_bb">
-        <dia:rectangle val="11.7144,-16.4098;12.6724,-16.2995"/>
-      </dia:attribute>
-      <dia:attribute name="conn_endpoints">
-        <dia:point val="11.7649,-16.3593"/>
-        <dia:point val="12.6218,-16.35"/>
-      </dia:attribute>
-      <dia:attribute name="numcp">
-        <dia:int val="1"/>
-      </dia:attribute>
-      <dia:attribute name="line_width">
-        <dia:real val="0.10000000149011612"/>
-      </dia:attribute>
-      <dia:connections>
-        <dia:connection handle="0" to="O20" connection="5"/>
-        <dia:connection handle="1" to="O35" connection="2"/>
-      </dia:connections>
-    </dia:object>
-    <dia:object type="BPMN - Task" version="1" id="O20">
-      <dia:attribute name="obj_pos">
-        <dia:point val="9.08475,-16.8116"/>
-      </dia:attribute>
-      <dia:attribute name="obj_bb">
-        <dia:rectangle val="9.03475,-16.8616;11.9353,-15.8571"/>
-      </dia:attribute>
-      <dia:attribute name="meta">
-        <dia:composite type="dict"/>
-      </dia:attribute>
-      <dia:attribute name="elem_corner">
-        <dia:point val="9.08475,-16.8116"/>
-      </dia:attribute>
-      <dia:attribute name="elem_width">
-        <dia:real val="2.8005882368718877"/>
-      </dia:attribute>
-      <dia:attribute name="elem_height">
-        <dia:real val="0.90454545953538812"/>
-      </dia:attribute>
-      <dia:attribute name="line_width">
-        <dia:real val="0.10000000149011612"/>
-      </dia:attribute>
-      <dia:attribute name="line_colour">
-        <dia:color val="#000000"/>
-      </dia:attribute>
-      <dia:attribute name="fill_colour">
-        <dia:color val="#bbe7bb"/>
-      </dia:attribute>
-      <dia:attribute name="show_background">
-        <dia:boolean val="true"/>
-      </dia:attribute>
-      <dia:attribute name="line_style">
-        <dia:enum val="0"/>
-        <dia:real val="1"/>
-      </dia:attribute>
-      <dia:attribute name="padding">
-        <dia:real val="0.10000000000000001"/>
-      </dia:attribute>
-      <dia:attribute name="text">
-        <dia:composite type="text">
-          <dia:attribute name="string">
-            <dia:string>#para_server#</dia:string>
-          </dia:attribute>
-          <dia:attribute name="font">
-            <dia:font family="sans" style="0" name="Helvetica"/>
-          </dia:attribute>
-          <dia:attribute name="height">
-            <dia:real val="0.49388889176727813"/>
-          </dia:attribute>
-          <dia:attribute name="pos">
-            <dia:point val="10.485,-16.2359"/>
-          </dia:attribute>
-          <dia:attribute name="color">
-            <dia:color val="#000000"/>
-          </dia:attribute>
-          <dia:attribute name="alignment">
-            <dia:enum val="1"/>
-          </dia:attribute>
-        </dia:composite>
-      </dia:attribute>
-      <dia:attribute name="flip_horizontal">
-        <dia:boolean val="false"/>
-      </dia:attribute>
-      <dia:attribute name="flip_vertical">
-        <dia:boolean val="false"/>
-      </dia:attribute>
-      <dia:attribute name="subscale">
-        <dia:real val="1"/>
-      </dia:attribute>
-    </dia:object>
-    <dia:object type="BPMN - Task" version="1" id="O21">
-      <dia:attribute name="obj_pos">
-        <dia:point val="9.03812,-18.5769"/>
-      </dia:attribute>
-      <dia:attribute name="obj_bb">
-        <dia:rectangle val="8.98812,-18.6269;11.9893,-17.6608"/>
-      </dia:attribute>
-      <dia:attribute name="meta">
-        <dia:composite type="dict"/>
-      </dia:attribute>
-      <dia:attribute name="elem_corner">
-        <dia:point val="9.03812,-18.5769"/>
-      </dia:attribute>
-      <dia:attribute name="elem_width">
-        <dia:real val="2.9011764721660049"/>
-      </dia:attribute>
-      <dia:attribute name="elem_height">
-        <dia:real val="0.86606061082624863"/>
-      </dia:attribute>
-      <dia:attribute name="line_width">
-        <dia:real val="0.10000000149011612"/>
-      </dia:attribute>
-      <dia:attribute name="line_colour">
-        <dia:color val="#000000"/>
-      </dia:attribute>
-      <dia:attribute name="fill_colour">
-        <dia:color val="#bbe7bb"/>
-      </dia:attribute>
-      <dia:attribute name="show_background">
-        <dia:boolean val="true"/>
-      </dia:attribute>
-      <dia:attribute name="line_style">
-        <dia:enum val="0"/>
-        <dia:real val="1"/>
-      </dia:attribute>
-      <dia:attribute name="padding">
-        <dia:real val="0.10000000000000001"/>
-      </dia:attribute>
-      <dia:attribute name="text">
-        <dia:composite type="text">
-          <dia:attribute name="string">
-            <dia:string>#para_audiod#</dia:string>
-          </dia:attribute>
-          <dia:attribute name="font">
-            <dia:font family="sans" style="0" name="Helvetica"/>
-          </dia:attribute>
-          <dia:attribute name="height">
-            <dia:real val="0.49388889176727813"/>
-          </dia:attribute>
-          <dia:attribute name="pos">
-            <dia:point val="10.4887,-18.0204"/>
-          </dia:attribute>
-          <dia:attribute name="color">
-            <dia:color val="#000000"/>
-          </dia:attribute>
-          <dia:attribute name="alignment">
-            <dia:enum val="1"/>
-          </dia:attribute>
-        </dia:composite>
-      </dia:attribute>
-      <dia:attribute name="flip_horizontal">
-        <dia:boolean val="false"/>
-      </dia:attribute>
-      <dia:attribute name="flip_vertical">
-        <dia:boolean val="false"/>
-      </dia:attribute>
-      <dia:attribute name="subscale">
-        <dia:real val="1"/>
-      </dia:attribute>
-    </dia:object>
-    <dia:object type="BPMN - Task" version="1" id="O22">
-      <dia:attribute name="obj_pos">
-        <dia:point val="5.75078,-18.5644"/>
-      </dia:attribute>
-      <dia:attribute name="obj_bb">
-        <dia:rectangle val="5.70078,-18.6144;8.66755,-17.6483"/>
-      </dia:attribute>
-      <dia:attribute name="meta">
-        <dia:composite type="dict"/>
-      </dia:attribute>
-      <dia:attribute name="elem_corner">
-        <dia:point val="5.75078,-18.5644"/>
-      </dia:attribute>
-      <dia:attribute name="elem_width">
-        <dia:real val="2.8667647074601228"/>
-      </dia:attribute>
-      <dia:attribute name="elem_height">
-        <dia:real val="0.86606061082624919"/>
-      </dia:attribute>
-      <dia:attribute name="line_width">
-        <dia:real val="0.10000000149011612"/>
-      </dia:attribute>
-      <dia:attribute name="line_colour">
-        <dia:color val="#000000"/>
-      </dia:attribute>
-      <dia:attribute name="fill_colour">
-        <dia:color val="#ffffff"/>
-      </dia:attribute>
-      <dia:attribute name="show_background">
-        <dia:boolean val="true"/>
-      </dia:attribute>
-      <dia:attribute name="line_style">
-        <dia:enum val="0"/>
-        <dia:real val="1"/>
-      </dia:attribute>
-      <dia:attribute name="padding">
-        <dia:real val="0.10000000000000001"/>
-      </dia:attribute>
-      <dia:attribute name="text">
-        <dia:composite type="text">
-          <dia:attribute name="string">
-            <dia:string>#para_audioc#</dia:string>
-          </dia:attribute>
-          <dia:attribute name="font">
-            <dia:font family="sans" style="0" name="Helvetica"/>
-          </dia:attribute>
-          <dia:attribute name="height">
-            <dia:real val="0.49388889176727813"/>
-          </dia:attribute>
-          <dia:attribute name="pos">
-            <dia:point val="7.18416,-18.0079"/>
-          </dia:attribute>
-          <dia:attribute name="color">
-            <dia:color val="#000000"/>
-          </dia:attribute>
-          <dia:attribute name="alignment">
-            <dia:enum val="1"/>
-          </dia:attribute>
-        </dia:composite>
-      </dia:attribute>
-      <dia:attribute name="flip_horizontal">
-        <dia:boolean val="false"/>
-      </dia:attribute>
-      <dia:attribute name="flip_vertical">
-        <dia:boolean val="false"/>
-      </dia:attribute>
-      <dia:attribute name="subscale">
-        <dia:real val="1"/>
-      </dia:attribute>
-    </dia:object>
-    <dia:object type="BPMN - Task" version="1" id="O23">
-      <dia:attribute name="obj_pos">
-        <dia:point val="6.01211,-21.1907"/>
-      </dia:attribute>
-      <dia:attribute name="obj_bb">
-        <dia:rectangle val="5.96211,-21.2407;8.43123,-20.2746"/>
-      </dia:attribute>
-      <dia:attribute name="meta">
-        <dia:composite type="dict"/>
-      </dia:attribute>
-      <dia:attribute name="elem_corner">
-        <dia:point val="6.01211,-21.1907"/>
-      </dia:attribute>
-      <dia:attribute name="elem_width">
-        <dia:real val="2.369117647058824"/>
-      </dia:attribute>
-      <dia:attribute name="elem_height">
-        <dia:real val="0.8660606108262402"/>
-      </dia:attribute>
-      <dia:attribute name="line_width">
-        <dia:real val="0.10000000149011612"/>
-      </dia:attribute>
-      <dia:attribute name="line_colour">
-        <dia:color val="#000000"/>
-      </dia:attribute>
-      <dia:attribute name="fill_colour">
-        <dia:color val="#ffffff"/>
-      </dia:attribute>
-      <dia:attribute name="show_background">
-        <dia:boolean val="true"/>
-      </dia:attribute>
-      <dia:attribute name="line_style">
-        <dia:enum val="0"/>
-        <dia:real val="1"/>
-      </dia:attribute>
-      <dia:attribute name="padding">
-        <dia:real val="0.10000000000000001"/>
-      </dia:attribute>
-      <dia:attribute name="text">
-        <dia:composite type="text">
-          <dia:attribute name="string">
-            <dia:string>#para_gui#</dia:string>
-          </dia:attribute>
-          <dia:attribute name="font">
-            <dia:font family="sans" style="0" name="Helvetica"/>
-          </dia:attribute>
-          <dia:attribute name="height">
-            <dia:real val="0.49388889176727813"/>
-          </dia:attribute>
-          <dia:attribute name="pos">
-            <dia:point val="7.19667,-20.6342"/>
-          </dia:attribute>
-          <dia:attribute name="color">
-            <dia:color val="#000000"/>
-          </dia:attribute>
-          <dia:attribute name="alignment">
-            <dia:enum val="1"/>
-          </dia:attribute>
-        </dia:composite>
-      </dia:attribute>
-      <dia:attribute name="flip_horizontal">
-        <dia:boolean val="false"/>
-      </dia:attribute>
-      <dia:attribute name="flip_vertical">
-        <dia:boolean val="true"/>
-      </dia:attribute>
-      <dia:attribute name="subscale">
-        <dia:real val="1"/>
-      </dia:attribute>
-    </dia:object>
-    <dia:object type="BPMN - Task" version="1" id="O24">
-      <dia:attribute name="obj_pos">
-        <dia:point val="2.98001,-16.8019"/>
-      </dia:attribute>
-      <dia:attribute name="obj_bb">
-        <dia:rectangle val="2.93001,-16.8519;5.65589,-15.8858"/>
-      </dia:attribute>
-      <dia:attribute name="meta">
-        <dia:composite type="dict"/>
-      </dia:attribute>
-      <dia:attribute name="elem_corner">
-        <dia:point val="2.98001,-16.8019"/>
-      </dia:attribute>
-      <dia:attribute name="elem_width">
-        <dia:real val="2.6258823545189465"/>
-      </dia:attribute>
-      <dia:attribute name="elem_height">
-        <dia:real val="0.86606061082625097"/>
-      </dia:attribute>
-      <dia:attribute name="line_width">
-        <dia:real val="0.10000000149011612"/>
-      </dia:attribute>
-      <dia:attribute name="line_colour">
-        <dia:color val="#000000"/>
-      </dia:attribute>
-      <dia:attribute name="fill_colour">
-        <dia:color val="#ffffff"/>
-      </dia:attribute>
-      <dia:attribute name="show_background">
-        <dia:boolean val="true"/>
-      </dia:attribute>
-      <dia:attribute name="line_style">
-        <dia:enum val="0"/>
-        <dia:real val="1"/>
-      </dia:attribute>
-      <dia:attribute name="padding">
-        <dia:real val="0.10000000000000001"/>
-      </dia:attribute>
-      <dia:attribute name="text">
-        <dia:composite type="text">
-          <dia:attribute name="string">
-            <dia:string>#para_client#</dia:string>
-          </dia:attribute>
-          <dia:attribute name="font">
-            <dia:font family="sans" style="0" name="Helvetica"/>
-          </dia:attribute>
-          <dia:attribute name="height">
-            <dia:real val="0.49388889176727813"/>
-          </dia:attribute>
-          <dia:attribute name="pos">
-            <dia:point val="4.29295,-16.2454"/>
-          </dia:attribute>
-          <dia:attribute name="color">
-            <dia:color val="#000000"/>
-          </dia:attribute>
-          <dia:attribute name="alignment">
-            <dia:enum val="1"/>
-          </dia:attribute>
-        </dia:composite>
-      </dia:attribute>
-      <dia:attribute name="flip_horizontal">
-        <dia:boolean val="false"/>
-      </dia:attribute>
-      <dia:attribute name="flip_vertical">
-        <dia:boolean val="false"/>
-      </dia:attribute>
-      <dia:attribute name="subscale">
-        <dia:real val="1"/>
-      </dia:attribute>
-    </dia:object>
-    <dia:object type="Standard - Line" version="0" id="O25">
-      <dia:attribute name="obj_pos">
-        <dia:point val="6.01211,-20.7577"/>
-      </dia:attribute>
-      <dia:attribute name="obj_bb">
-        <dia:rectangle val="5.35471,-20.8094;6.06224,-20.7076"/>
-      </dia:attribute>
-      <dia:attribute name="conn_endpoints">
-        <dia:point val="6.01211,-20.7577"/>
-        <dia:point val="5.40484,-20.7593"/>
-      </dia:attribute>
-      <dia:attribute name="numcp">
-        <dia:int val="1"/>
-      </dia:attribute>
-      <dia:attribute name="line_width">
-        <dia:real val="0.10000000149011612"/>
-      </dia:attribute>
-      <dia:connections>
-        <dia:connection handle="0" to="O23" connection="8"/>
-        <dia:connection handle="1" to="O18" connection="1"/>
-      </dia:connections>
-    </dia:object>
-    <dia:object type="Standard - Line" version="0" id="O26">
-      <dia:attribute name="obj_pos">
-        <dia:point val="8.49446,-18.1314"/>
-      </dia:attribute>
-      <dia:attribute name="obj_bb">
-        <dia:rectangle val="8.44354,-18.1948;9.21742,-18.0805"/>
-      </dia:attribute>
-      <dia:attribute name="conn_endpoints">
-        <dia:point val="8.49446,-18.1314"/>
-        <dia:point val="9.1665,-18.1439"/>
-      </dia:attribute>
-      <dia:attribute name="numcp">
-        <dia:int val="1"/>
-      </dia:attribute>
-      <dia:attribute name="line_width">
-        <dia:real val="0.10000000149011612"/>
-      </dia:attribute>
-      <dia:connections>
-        <dia:connection handle="0" to="O22" connection="5"/>
-        <dia:connection handle="1" to="O21" connection="8"/>
-      </dia:connections>
-    </dia:object>
-    <dia:object type="Standard - Line" version="0" id="O27">
-      <dia:attribute name="obj_pos">
-        <dia:point val="7.18416,-18.5644"/>
-      </dia:attribute>
-      <dia:attribute name="obj_bb">
-        <dia:rectangle val="7.13381,-20.3751;7.24702,-18.514"/>
-      </dia:attribute>
-      <dia:attribute name="conn_endpoints">
-        <dia:point val="7.18416,-18.5644"/>
-        <dia:point val="7.19667,-20.3247"/>
-      </dia:attribute>
-      <dia:attribute name="numcp">
-        <dia:int val="1"/>
-      </dia:attribute>
-      <dia:attribute name="line_width">
-        <dia:real val="0.10000000149011612"/>
-      </dia:attribute>
-      <dia:connections>
-        <dia:connection handle="0" to="O22" connection="11"/>
-        <dia:connection handle="1" to="O23" connection="11"/>
-      </dia:connections>
-    </dia:object>
-    <dia:object type="Standard - Line" version="0" id="O28">
-      <dia:attribute name="obj_pos">
-        <dia:point val="10.4972,-19.4956"/>
-      </dia:attribute>
-      <dia:attribute name="obj_bb">
-        <dia:rectangle val="10.4382,-19.5461;10.5477,-18.5264"/>
-      </dia:attribute>
-      <dia:attribute name="conn_endpoints">
-        <dia:point val="10.4972,-19.4956"/>
-        <dia:point val="10.4887,-18.5769"/>
-      </dia:attribute>
-      <dia:attribute name="numcp">
-        <dia:int val="1"/>
-      </dia:attribute>
-      <dia:attribute name="line_width">
-        <dia:real val="0.10000000149011612"/>
-      </dia:attribute>
-      <dia:connections>
-        <dia:connection handle="0" to="O17" connection="2"/>
-        <dia:connection handle="1" to="O21" connection="11"/>
-      </dia:connections>
-    </dia:object>
-    <dia:object type="Standard - Line" version="0" id="O29">
-      <dia:attribute name="obj_pos">
-        <dia:point val="5.47486,-16.3689"/>
-      </dia:attribute>
-      <dia:attribute name="obj_bb">
-        <dia:rectangle val="5.42473,-16.419;9.25532,-16.3092"/>
-      </dia:attribute>
-      <dia:attribute name="conn_endpoints">
-        <dia:point val="5.47486,-16.3689"/>
-        <dia:point val="9.20519,-16.3593"/>
-      </dia:attribute>
-      <dia:attribute name="numcp">
-        <dia:int val="1"/>
-      </dia:attribute>
-      <dia:attribute name="line_color">
-        <dia:color val="#888888"/>
-      </dia:attribute>
-      <dia:attribute name="line_width">
-        <dia:real val="0.10000000149011612"/>
-      </dia:attribute>
-      <dia:connections>
-        <dia:connection handle="0" to="O24" connection="5"/>
-        <dia:connection handle="1" to="O20" connection="8"/>
-      </dia:connections>
-    </dia:object>
-    <dia:object type="Standard - Line" version="0" id="O30">
-      <dia:attribute name="obj_pos">
-        <dia:point val="10.485,-16.8116"/>
-      </dia:attribute>
-      <dia:attribute name="obj_bb">
-        <dia:rectangle val="10.4348,-17.761;10.5389,-16.7614"/>
-      </dia:attribute>
-      <dia:attribute name="conn_endpoints">
-        <dia:point val="10.485,-16.8116"/>
-        <dia:point val="10.4887,-17.7108"/>
-      </dia:attribute>
-      <dia:attribute name="numcp">
-        <dia:int val="1"/>
-      </dia:attribute>
-      <dia:attribute name="line_color">
-        <dia:color val="#888888"/>
-      </dia:attribute>
-      <dia:attribute name="line_width">
-        <dia:real val="0.10000000149011612"/>
-      </dia:attribute>
-      <dia:connections>
-        <dia:connection handle="0" to="O20" connection="11"/>
-        <dia:connection handle="1" to="O21" connection="2"/>
-      </dia:connections>
-    </dia:object>
-    <dia:object type="Standard - Text" version="1" id="O31">
-      <dia:attribute name="obj_pos">
-        <dia:point val="1.575,-10.6689"/>
-      </dia:attribute>
-      <dia:attribute name="obj_bb">
-        <dia:rectangle val="1.575,-11.2639;1.575,-10.5164"/>
-      </dia:attribute>
-      <dia:attribute name="text">
-        <dia:composite type="text">
-          <dia:attribute name="string">
-            <dia:string>##</dia:string>
-          </dia:attribute>
-          <dia:attribute name="font">
-            <dia:font family="sans" style="0" name="Helvetica"/>
-          </dia:attribute>
-          <dia:attribute name="height">
-            <dia:real val="0.80000000000000004"/>
-          </dia:attribute>
-          <dia:attribute name="pos">
-            <dia:point val="1.575,-10.6689"/>
-          </dia:attribute>
-          <dia:attribute name="color">
-            <dia:color val="#000000"/>
-          </dia:attribute>
-          <dia:attribute name="alignment">
-            <dia:enum val="0"/>
-          </dia:attribute>
-        </dia:composite>
-      </dia:attribute>
-      <dia:attribute name="valign">
-        <dia:enum val="3"/>
-      </dia:attribute>
-    </dia:object>
-    <dia:object type="Standard - Text" version="1" id="O32">
-      <dia:attribute name="obj_pos">
-        <dia:point val="3.6375,10.9686"/>
-      </dia:attribute>
-      <dia:attribute name="obj_bb">
-        <dia:rectangle val="3.6375,10.3736;3.6375,11.1211"/>
-      </dia:attribute>
-      <dia:attribute name="text">
-        <dia:composite type="text">
-          <dia:attribute name="string">
-            <dia:string>##</dia:string>
-          </dia:attribute>
-          <dia:attribute name="font">
-            <dia:font family="sans" style="0" name="Helvetica"/>
-          </dia:attribute>
-          <dia:attribute name="height">
-            <dia:real val="0.80000000000000004"/>
-          </dia:attribute>
-          <dia:attribute name="pos">
-            <dia:point val="3.6375,10.9686"/>
-          </dia:attribute>
-          <dia:attribute name="color">
-            <dia:color val="#000000"/>
-          </dia:attribute>
-          <dia:attribute name="alignment">
-            <dia:enum val="0"/>
-          </dia:attribute>
-        </dia:composite>
-      </dia:attribute>
-      <dia:attribute name="valign">
-        <dia:enum val="3"/>
-      </dia:attribute>
-    </dia:object>
-    <dia:object type="Standard - Text" version="1" id="O33">
-      <dia:attribute name="obj_pos">
-        <dia:point val="2.6375,10.6686"/>
-      </dia:attribute>
-      <dia:attribute name="obj_bb">
-        <dia:rectangle val="2.6375,10.0736;2.6375,10.8211"/>
-      </dia:attribute>
-      <dia:attribute name="text">
-        <dia:composite type="text">
-          <dia:attribute name="string">
-            <dia:string>##</dia:string>
-          </dia:attribute>
-          <dia:attribute name="font">
-            <dia:font family="sans" style="0" name="Helvetica"/>
-          </dia:attribute>
-          <dia:attribute name="height">
-            <dia:real val="0.80000000000000004"/>
-          </dia:attribute>
-          <dia:attribute name="pos">
-            <dia:point val="2.6375,10.6686"/>
-          </dia:attribute>
-          <dia:attribute name="color">
-            <dia:color val="#000000"/>
-          </dia:attribute>
-          <dia:attribute name="alignment">
-            <dia:enum val="0"/>
-          </dia:attribute>
-        </dia:composite>
-      </dia:attribute>
-      <dia:attribute name="valign">
-        <dia:enum val="3"/>
-      </dia:attribute>
-    </dia:object>
-    <dia:object type="Standard - Line" version="0" id="O34">
-      <dia:attribute name="obj_pos">
-        <dia:point val="4.29295,-16.8019"/>
-      </dia:attribute>
-      <dia:attribute name="obj_bb">
-        <dia:rectangle val="4.24287,-19.7231;4.34745,-16.7518"/>
-      </dia:attribute>
-      <dia:attribute name="conn_endpoints">
-        <dia:point val="4.29295,-16.8019"/>
-        <dia:point val="4.29737,-19.673"/>
-      </dia:attribute>
-      <dia:attribute name="numcp">
-        <dia:int val="1"/>
-      </dia:attribute>
-      <dia:attribute name="line_width">
-        <dia:real val="0.10000000149011612"/>
-      </dia:attribute>
-      <dia:connections>
-        <dia:connection handle="0" to="O24" connection="11"/>
-        <dia:connection handle="1" to="O18" connection="1"/>
-      </dia:connections>
-    </dia:object>
-    <dia:object type="Network - Storage" version="1" id="O35">
-      <dia:attribute name="obj_pos">
-        <dia:point val="12.6719,-16.9342"/>
-      </dia:attribute>
-      <dia:attribute name="obj_bb">
-        <dia:rectangle val="12.6219,-16.9842;13.7267,-15.1866"/>
-      </dia:attribute>
-      <dia:attribute name="meta">
-        <dia:composite type="dict"/>
-      </dia:attribute>
-      <dia:attribute name="elem_corner">
-        <dia:point val="12.6719,-16.9342"/>
-      </dia:attribute>
-      <dia:attribute name="elem_width">
-        <dia:real val="1.0048306811423449"/>
-      </dia:attribute>
-      <dia:attribute name="elem_height">
-        <dia:real val="1.1821537425204058"/>
-      </dia:attribute>
-      <dia:attribute name="line_width">
-        <dia:real val="0.10000000149011612"/>
-      </dia:attribute>
-      <dia:attribute name="line_colour">
-        <dia:color val="#000000"/>
-      </dia:attribute>
-      <dia:attribute name="fill_colour">
-        <dia:color val="#cccccc"/>
-      </dia:attribute>
-      <dia:attribute name="show_background">
-        <dia:boolean val="true"/>
-      </dia:attribute>
-      <dia:attribute name="line_style">
-        <dia:enum val="0"/>
-        <dia:real val="1"/>
-      </dia:attribute>
-      <dia:attribute name="padding">
-        <dia:real val="0.10000000000000001"/>
-      </dia:attribute>
-      <dia:attribute name="text">
-        <dia:composite type="text">
-          <dia:attribute name="string">
-            <dia:string>##</dia:string>
-          </dia:attribute>
-          <dia:attribute name="font">
-            <dia:font family="sans" style="0" name="Helvetica"/>
-          </dia:attribute>
-          <dia:attribute name="height">
-            <dia:real val="0.49388889176727813"/>
-          </dia:attribute>
-          <dia:attribute name="pos">
-            <dia:point val="13.1743,-15.3816"/>
-          </dia:attribute>
-          <dia:attribute name="color">
-            <dia:color val="#000000"/>
-          </dia:attribute>
-          <dia:attribute name="alignment">
-            <dia:enum val="1"/>
-          </dia:attribute>
-        </dia:composite>
-      </dia:attribute>
-      <dia:attribute name="flip_horizontal">
-        <dia:boolean val="false"/>
-      </dia:attribute>
-      <dia:attribute name="flip_vertical">
-        <dia:boolean val="false"/>
-      </dia:attribute>
-      <dia:attribute name="subscale">
-        <dia:real val="1"/>
-      </dia:attribute>
-    </dia:object>
-    <dia:object type="Standard - Text" version="1" id="O36">
-      <dia:attribute name="obj_pos">
-        <dia:point val="0.171225,-14.4141"/>
-      </dia:attribute>
-      <dia:attribute name="obj_bb">
-        <dia:rectangle val="0.159662,-14.7932;14.6787,-7.87542"/>
-      </dia:attribute>
-      <dia:attribute name="text">
-        <dia:composite type="text">
-          <dia:attribute name="string">
-            <dia:string>#The two main applications of the paraslash suite (shaded green) are
-para_server and para_audiod. Both run in the background usually.
-para_server maintains the audio file database and acts as the streaming
-source, while para_audiod is the streaming client.
-
-The two client programs, para_client and para_audioc communicate
-with para_server and para_audiod, respectively.
-
-para_gui controls para_server/audiod by executing paraslash commands.
-Command output is shown in a curses window. para_gui automatically
-executes para_audioc to obtain the state of para_audiod and para_server
-and the metadata of the current audio file.
-
-Network connections are shaded grey, local connections black.#</dia:string>
-          </dia:attribute>
-          <dia:attribute name="font">
-            <dia:font family="sans" style="0" name="Helvetica"/>
-          </dia:attribute>
-          <dia:attribute name="height">
-            <dia:real val="0.49388889176727813"/>
-          </dia:attribute>
-          <dia:attribute name="pos">
-            <dia:point val="0.171225,-14.4141"/>
-          </dia:attribute>
-          <dia:attribute name="color">
-            <dia:color val="#000000"/>
-          </dia:attribute>
-          <dia:attribute name="alignment">
-            <dia:enum val="0"/>
-          </dia:attribute>
-        </dia:composite>
-      </dia:attribute>
-      <dia:attribute name="valign">
-        <dia:enum val="3"/>
-      </dia:attribute>
-    </dia:object>
-    <dia:object type="Standard - Text" version="1" id="O37">
-      <dia:attribute name="obj_pos">
-        <dia:point val="0.1003,73.0082"/>
-      </dia:attribute>
-      <dia:attribute name="obj_bb">
-        <dia:rectangle val="0.1003,72.4132;4.0578,73.1607"/>
-      </dia:attribute>
-      <dia:attribute name="text">
-        <dia:composite type="text">
-          <dia:attribute name="string">
-            <dia:string>#para_audiod#</dia:string>
-          </dia:attribute>
-          <dia:attribute name="font">
-            <dia:font family="sans" style="0" name="Helvetica"/>
-          </dia:attribute>
-          <dia:attribute name="height">
-            <dia:real val="0.80000000000000004"/>
-          </dia:attribute>
-          <dia:attribute name="pos">
-            <dia:point val="0.1003,73.0082"/>
-          </dia:attribute>
-          <dia:attribute name="color">
-            <dia:color val="#000000"/>
-          </dia:attribute>
-          <dia:attribute name="alignment">
-            <dia:enum val="0"/>
-          </dia:attribute>
-        </dia:composite>
-      </dia:attribute>
-      <dia:attribute name="valign">
-        <dia:enum val="3"/>
-      </dia:attribute>
-    </dia:object>
-    <dia:object type="Standard - Text" version="1" id="O38">
-      <dia:attribute name="obj_pos">
-        <dia:point val="0.116202,82.0061"/>
-      </dia:attribute>
-      <dia:attribute name="obj_bb">
-        <dia:rectangle val="0.116202,81.627;14.5828,87.0631"/>
-      </dia:attribute>
-      <dia:attribute name="text">
-        <dia:composite type="text">
-          <dia:attribute name="string">
-            <dia:string>#The purpose of para_audiod is to download, decode and play an audio
-stream received from para_server. It fetches the para_server status and
-starts a suitable buffer tree (shaded blue) if an audio stream is available.
-
-The buffer tree usually consists of a receiver, any number of filters and
-a writer. The receiver downloads the audio stream from para_server and
-the filters decode or modify the received data. The writer plays the
-decoded stream.
-
-The dispatcher acts on (local) requests from para_audioc, for example to
-dump information about the current audio file.#</dia:string>
-          </dia:attribute>
-          <dia:attribute name="font">
-            <dia:font family="sans" style="0" name="Helvetica"/>
-          </dia:attribute>
-          <dia:attribute name="height">
-            <dia:real val="0.49388889176727813"/>
-          </dia:attribute>
-          <dia:attribute name="pos">
-            <dia:point val="0.116202,82.0061"/>
-          </dia:attribute>
-          <dia:attribute name="color">
-            <dia:color val="#000000"/>
-          </dia:attribute>
-          <dia:attribute name="alignment">
-            <dia:enum val="0"/>
-          </dia:attribute>
-        </dia:composite>
-      </dia:attribute>
-      <dia:attribute name="valign">
-        <dia:enum val="3"/>
-      </dia:attribute>
-    </dia:object>
-    <dia:object type="Standard - Text" version="1" id="O39">
-      <dia:attribute name="obj_pos">
-        <dia:point val="0.27019,32.9375"/>
-      </dia:attribute>
-      <dia:attribute name="obj_bb">
-        <dia:rectangle val="0.258628,32.5584;13.8202,37.5006"/>
-      </dia:attribute>
-      <dia:attribute name="text">
-        <dia:composite type="text">
-          <dia:attribute name="string">
-            <dia:string>#The audio file selector (afs) accepts two different kinds of incoming
-connections: A bidirectional pipe shared with para_server is used for
-passing the file descriptor of the current audio file to the server
-process. The local socket is used by command handlers which query
-or update the database.
-
-To add a new file to the database, afs opens the file and locates an
-audio format handler (afh) that recognizes the file. A new database
-entry with metadata obtained from the afh is then added to the
-database.#</dia:string>
-          </dia:attribute>
-          <dia:attribute name="font">
-            <dia:font family="sans" style="0" name="Helvetica"/>
-          </dia:attribute>
-          <dia:attribute name="height">
-            <dia:real val="0.49388889176727813"/>
-          </dia:attribute>
-          <dia:attribute name="pos">
-            <dia:point val="0.27019,32.9375"/>
-          </dia:attribute>
-          <dia:attribute name="color">
-            <dia:color val="#000000"/>
-          </dia:attribute>
-          <dia:attribute name="alignment">
-            <dia:enum val="0"/>
-          </dia:attribute>
-        </dia:composite>
-      </dia:attribute>
-      <dia:attribute name="valign">
-        <dia:enum val="3"/>
-      </dia:attribute>
-    </dia:object>
-    <dia:object type="Standard - Text" version="1" id="O40">
-      <dia:attribute name="obj_pos">
-        <dia:point val="0.11118,24.9782"/>
-      </dia:attribute>
-      <dia:attribute name="obj_bb">
-        <dia:rectangle val="0.11118,24.3832;7.22118,25.1307"/>
-      </dia:attribute>
-      <dia:attribute name="text">
-        <dia:composite type="text">
-          <dia:attribute name="string">
-            <dia:string>#The audio file selector#</dia:string>
-          </dia:attribute>
-          <dia:attribute name="font">
-            <dia:font family="sans" style="0" name="Helvetica"/>
-          </dia:attribute>
-          <dia:attribute name="height">
-            <dia:real val="0.80000000000000004"/>
-          </dia:attribute>
-          <dia:attribute name="pos">
-            <dia:point val="0.11118,24.9782"/>
-          </dia:attribute>
-          <dia:attribute name="color">
-            <dia:color val="#000000"/>
-          </dia:attribute>
-          <dia:attribute name="alignment">
-            <dia:enum val="0"/>
-          </dia:attribute>
-        </dia:composite>
-      </dia:attribute>
-      <dia:attribute name="valign">
-        <dia:enum val="3"/>
-      </dia:attribute>
-    </dia:object>
-    <dia:object type="Standard - Line" version="0" id="O41">
-      <dia:attribute name="obj_pos">
-        <dia:point val="6.8012,28.9591"/>
-      </dia:attribute>
-      <dia:attribute name="obj_bb">
-        <dia:rectangle val="5.61907,28.9091;6.85122,29.0096"/>
-      </dia:attribute>
-      <dia:attribute name="conn_endpoints">
-        <dia:point val="6.8012,28.9591"/>
-        <dia:point val="5.66909,28.9596"/>
-      </dia:attribute>
-      <dia:attribute name="numcp">
-        <dia:int val="1"/>
-      </dia:attribute>
-      <dia:attribute name="line_width">
-        <dia:real val="0.10000000149011612"/>
-      </dia:attribute>
-      <dia:attribute name="line_style">
-        <dia:enum val="4"/>
-      </dia:attribute>
-      <dia:connections>
-        <dia:connection handle="0" to="O50" connection="8"/>
-        <dia:connection handle="1" to="O43" connection="2"/>
-      </dia:connections>
-    </dia:object>
-    <dia:object type="Standard - Line" version="0" id="O42">
-      <dia:attribute name="obj_pos">
-        <dia:point val="7.6012,28.5261"/>
-      </dia:attribute>
-      <dia:attribute name="obj_bb">
-        <dia:rectangle val="7.53094,27.1956;9.25521,28.5964"/>
-      </dia:attribute>
-      <dia:attribute name="conn_endpoints">
-        <dia:point val="7.6012,28.5261"/>
-        <dia:point val="9.18495,27.2659"/>
-      </dia:attribute>
-      <dia:attribute name="numcp">
-        <dia:int val="1"/>
-      </dia:attribute>
-      <dia:attribute name="line_width">
-        <dia:real val="0.10000000149011612"/>
-      </dia:attribute>
-      <dia:connections>
-        <dia:connection handle="0" to="O50" connection="10"/>
-        <dia:connection handle="1" to="O47" connection="0"/>
-      </dia:connections>
-    </dia:object>
-    <dia:object type="Network - Storage" version="1" id="O43">
-      <dia:attribute name="obj_pos">
-        <dia:point val="4.61551,28.3687"/>
-      </dia:attribute>
-      <dia:attribute name="obj_bb">
-        <dia:rectangle val="4.00418,28.3187;6.23168,30.1163"/>
-      </dia:attribute>
-      <dia:attribute name="meta">
-        <dia:composite type="dict"/>
-      </dia:attribute>
-      <dia:attribute name="elem_corner">
-        <dia:point val="4.61551,28.3687"/>
-      </dia:attribute>
-      <dia:attribute name="elem_width">
-        <dia:real val="1.0048306811423449"/>
-      </dia:attribute>
-      <dia:attribute name="elem_height">
-        <dia:real val="1.1821537425204058"/>
-      </dia:attribute>
-      <dia:attribute name="line_width">
-        <dia:real val="0.10000000149011612"/>
-      </dia:attribute>
-      <dia:attribute name="line_colour">
-        <dia:color val="#000000"/>
-      </dia:attribute>
-      <dia:attribute name="fill_colour">
-        <dia:color val="#cccccc"/>
-      </dia:attribute>
-      <dia:attribute name="show_background">
-        <dia:boolean val="true"/>
-      </dia:attribute>
-      <dia:attribute name="line_style">
-        <dia:enum val="0"/>
-        <dia:real val="1"/>
-      </dia:attribute>
-      <dia:attribute name="padding">
-        <dia:real val="0.10000000000000001"/>
-      </dia:attribute>
-      <dia:attribute name="text">
-        <dia:composite type="text">
-          <dia:attribute name="string">
-            <dia:string>#audio files#</dia:string>
-          </dia:attribute>
-          <dia:attribute name="font">
-            <dia:font family="sans" style="0" name="Helvetica"/>
-          </dia:attribute>
-          <dia:attribute name="height">
-            <dia:real val="0.49388889176727813"/>
-          </dia:attribute>
-          <dia:attribute name="pos">
-            <dia:point val="5.11793,29.9213"/>
-          </dia:attribute>
-          <dia:attribute name="color">
-            <dia:color val="#000000"/>
-          </dia:attribute>
-          <dia:attribute name="alignment">
-            <dia:enum val="1"/>
-          </dia:attribute>
-        </dia:composite>
-      </dia:attribute>
-      <dia:attribute name="flip_horizontal">
-        <dia:boolean val="false"/>
-      </dia:attribute>
-      <dia:attribute name="flip_vertical">
-        <dia:boolean val="false"/>
-      </dia:attribute>
-      <dia:attribute name="subscale">
-        <dia:real val="1"/>
-      </dia:attribute>
-    </dia:object>
-    <dia:object type="Standard - Line" version="0" id="O44">
-      <dia:attribute name="obj_pos">
-        <dia:point val="7.2512,28.5261"/>
-      </dia:attribute>
-      <dia:attribute name="obj_bb">
-        <dia:rectangle val="7.19859,26.8922;7.30128,28.5762"/>
-      </dia:attribute>
-      <dia:attribute name="conn_endpoints">
-        <dia:point val="7.2512,28.5261"/>
-        <dia:point val="7.24867,26.9423"/>
-      </dia:attribute>
-      <dia:attribute name="numcp">
-        <dia:int val="1"/>
-      </dia:attribute>
-      <dia:attribute name="line_width">
-        <dia:real val="0.10000000149011612"/>
-      </dia:attribute>
-      <dia:connections>
-        <dia:connection handle="0" to="O50" connection="11"/>
-        <dia:connection handle="1" to="O46" connection="2"/>
-      </dia:connections>
-    </dia:object>
-    <dia:object type="Standard - Line" version="0" id="O45">
-      <dia:attribute name="obj_pos">
-        <dia:point val="7.2512,29.3922"/>
-      </dia:attribute>
-      <dia:attribute name="obj_bb">
-        <dia:rectangle val="7.20042,29.3414;7.32552,30.9457"/>
-      </dia:attribute>
-      <dia:attribute name="conn_endpoints">
-        <dia:point val="7.2512,29.3922"/>
-        <dia:point val="7.27474,30.8949"/>
-      </dia:attribute>
-      <dia:attribute name="numcp">
-        <dia:int val="1"/>
-      </dia:attribute>
-      <dia:attribute name="line_width">
-        <dia:real val="0.10000000149011612"/>
-      </dia:attribute>
-      <dia:connections>
-        <dia:connection handle="0" to="O50" connection="2"/>
-        <dia:connection handle="1" to="O49" connection="11"/>
-      </dia:connections>
-    </dia:object>
-    <dia:object type="BPMN - Task" version="1" id="O46">
-      <dia:attribute name="obj_pos">
-        <dia:point val="5.84838,26.0762"/>
-      </dia:attribute>
-      <dia:attribute name="obj_bb">
-        <dia:rectangle val="5.79838,26.0262;8.69897,26.9923"/>
-      </dia:attribute>
-      <dia:attribute name="meta">
-        <dia:composite type="dict"/>
-      </dia:attribute>
-      <dia:attribute name="elem_corner">
-        <dia:point val="5.84838,26.0762"/>
-      </dia:attribute>
-      <dia:attribute name="elem_width">
-        <dia:real val="2.8005882368718877"/>
-      </dia:attribute>
-      <dia:attribute name="elem_height">
-        <dia:real val="0.86606061082624941"/>
-      </dia:attribute>
-      <dia:attribute name="line_width">
-        <dia:real val="0.10000000149011612"/>
-      </dia:attribute>
-      <dia:attribute name="line_colour">
-        <dia:color val="#000000"/>
-      </dia:attribute>
-      <dia:attribute name="fill_colour">
-        <dia:color val="#bbe7bb"/>
-      </dia:attribute>
-      <dia:attribute name="show_background">
-        <dia:boolean val="true"/>
-      </dia:attribute>
-      <dia:attribute name="line_style">
-        <dia:enum val="0"/>
-        <dia:real val="1"/>
-      </dia:attribute>
-      <dia:attribute name="padding">
-        <dia:real val="0.10000000000000001"/>
-      </dia:attribute>
-      <dia:attribute name="text">
-        <dia:composite type="text">
-          <dia:attribute name="string">
-            <dia:string>#para_server#</dia:string>
-          </dia:attribute>
-          <dia:attribute name="font">
-            <dia:font family="sans" style="0" name="Helvetica"/>
-          </dia:attribute>
-          <dia:attribute name="height">
-            <dia:real val="0.49388889176727813"/>
-          </dia:attribute>
-          <dia:attribute name="pos">
-            <dia:point val="7.24867,26.6327"/>
-          </dia:attribute>
-          <dia:attribute name="color">
-            <dia:color val="#000000"/>
-          </dia:attribute>
-          <dia:attribute name="alignment">
-            <dia:enum val="1"/>
-          </dia:attribute>
-        </dia:composite>
-      </dia:attribute>
-      <dia:attribute name="flip_horizontal">
-        <dia:boolean val="false"/>
-      </dia:attribute>
-      <dia:attribute name="flip_vertical">
-        <dia:boolean val="false"/>
-      </dia:attribute>
-      <dia:attribute name="subscale">
-        <dia:real val="1"/>
-      </dia:attribute>
-    </dia:object>
-    <dia:object type="BPMN - Task" version="1" id="O47">
-      <dia:attribute name="obj_pos">
-        <dia:point val="9.04127,26.3998"/>
-      </dia:attribute>
-      <dia:attribute name="obj_bb">
-        <dia:rectangle val="8.99127,26.3498;10.0786,27.3159"/>
-      </dia:attribute>
-      <dia:attribute name="meta">
-        <dia:composite type="dict"/>
-      </dia:attribute>
-      <dia:attribute name="elem_corner">
-        <dia:point val="9.04127,26.3998"/>
-      </dia:attribute>
-      <dia:attribute name="elem_width">
-        <dia:real val="0.98735294275424068"/>
-      </dia:attribute>
-      <dia:attribute name="elem_height">
-        <dia:real val="0.86606061082625274"/>
-      </dia:attribute>
-      <dia:attribute name="line_width">
-        <dia:real val="0.10000000149011612"/>
-      </dia:attribute>
-      <dia:attribute name="line_colour">
-        <dia:color val="#000000"/>
-      </dia:attribute>
-      <dia:attribute name="fill_colour">
-        <dia:color val="#ffffff"/>
-      </dia:attribute>
-      <dia:attribute name="show_background">
-        <dia:boolean val="true"/>
-      </dia:attribute>
-      <dia:attribute name="line_style">
-        <dia:enum val="0"/>
-        <dia:real val="1"/>
-      </dia:attribute>
-      <dia:attribute name="padding">
-        <dia:real val="0.10000000000000001"/>
-      </dia:attribute>
-      <dia:attribute name="text">
-        <dia:composite type="text">
-          <dia:attribute name="string">
-            <dia:string>#afh#</dia:string>
-          </dia:attribute>
-          <dia:attribute name="font">
-            <dia:font family="sans" style="0" name="Helvetica"/>
-          </dia:attribute>
-          <dia:attribute name="height">
-            <dia:real val="0.49388889176727813"/>
-          </dia:attribute>
-          <dia:attribute name="pos">
-            <dia:point val="9.53495,26.9563"/>
-          </dia:attribute>
-          <dia:attribute name="color">
-            <dia:color val="#000000"/>
-          </dia:attribute>
-          <dia:attribute name="alignment">
-            <dia:enum val="1"/>
-          </dia:attribute>
-        </dia:composite>
-      </dia:attribute>
-      <dia:attribute name="flip_horizontal">
-        <dia:boolean val="false"/>
-      </dia:attribute>
-      <dia:attribute name="flip_vertical">
-        <dia:boolean val="false"/>
-      </dia:attribute>
-      <dia:attribute name="subscale">
-        <dia:real val="1"/>
-      </dia:attribute>
-    </dia:object>
-    <dia:object type="Network - Storage" version="1" id="O48">
-      <dia:attribute name="obj_pos">
-        <dia:point val="8.84318,28.3795"/>
-      </dia:attribute>
-      <dia:attribute name="obj_bb">
-        <dia:rectangle val="8.65435,28.3295;10.0368,30.1271"/>
-      </dia:attribute>
-      <dia:attribute name="meta">
-        <dia:composite type="dict"/>
-      </dia:attribute>
-      <dia:attribute name="elem_corner">
-        <dia:point val="8.84318,28.3795"/>
-      </dia:attribute>
-      <dia:attribute name="elem_width">
-        <dia:real val="1.0048306811423449"/>
-      </dia:attribute>
-      <dia:attribute name="elem_height">
-        <dia:real val="1.1821537425204058"/>
-      </dia:attribute>
-      <dia:attribute name="line_width">
-        <dia:real val="0.10000000149011612"/>
-      </dia:attribute>
-      <dia:attribute name="line_colour">
-        <dia:color val="#000000"/>
-      </dia:attribute>
-      <dia:attribute name="fill_colour">
-        <dia:color val="#cccccc"/>
-      </dia:attribute>
-      <dia:attribute name="show_background">
-        <dia:boolean val="true"/>
-      </dia:attribute>
-      <dia:attribute name="line_style">
-        <dia:enum val="0"/>
-        <dia:real val="1"/>
-      </dia:attribute>
-      <dia:attribute name="padding">
-        <dia:real val="0.10000000000000001"/>
-      </dia:attribute>
-      <dia:attribute name="text">
-        <dia:composite type="text">
-          <dia:attribute name="string">
-            <dia:string>#osl db#</dia:string>
-          </dia:attribute>
-          <dia:attribute name="font">
-            <dia:font family="sans" style="0" name="Helvetica"/>
-          </dia:attribute>
-          <dia:attribute name="height">
-            <dia:real val="0.49388889176727813"/>
-          </dia:attribute>
-          <dia:attribute name="pos">
-            <dia:point val="9.3456,29.9321"/>
-          </dia:attribute>
-          <dia:attribute name="color">
-            <dia:color val="#000000"/>
-          </dia:attribute>
-          <dia:attribute name="alignment">
-            <dia:enum val="1"/>
-          </dia:attribute>
-        </dia:composite>
-      </dia:attribute>
-      <dia:attribute name="flip_horizontal">
-        <dia:boolean val="false"/>
-      </dia:attribute>
-      <dia:attribute name="flip_vertical">
-        <dia:boolean val="false"/>
-      </dia:attribute>
-      <dia:attribute name="subscale">
-        <dia:real val="1"/>
-      </dia:attribute>
-    </dia:object>
-    <dia:object type="BPMN - Task" version="1" id="O49">
-      <dia:attribute name="obj_pos">
-        <dia:point val="5.20738,30.8949"/>
-      </dia:attribute>
-      <dia:attribute name="obj_bb">
-        <dia:rectangle val="5.15738,30.8449;9.39209,31.811"/>
-      </dia:attribute>
-      <dia:attribute name="meta">
-        <dia:composite type="dict"/>
-      </dia:attribute>
-      <dia:attribute name="elem_corner">
-        <dia:point val="5.20738,30.8949"/>
-      </dia:attribute>
-      <dia:attribute name="elem_width">
-        <dia:real val="4.1347058839307111"/>
-      </dia:attribute>
-      <dia:attribute name="elem_height">
-        <dia:real val="0.86606061082624874"/>
-      </dia:attribute>
-      <dia:attribute name="line_width">
-        <dia:real val="0.10000000149011612"/>
-      </dia:attribute>
-      <dia:attribute name="line_colour">
-        <dia:color val="#000000"/>
-      </dia:attribute>
-      <dia:attribute name="fill_colour">
-        <dia:color val="#ffffff"/>
-      </dia:attribute>
-      <dia:attribute name="show_background">
-        <dia:boolean val="true"/>
-      </dia:attribute>
-      <dia:attribute name="line_style">
-        <dia:enum val="0"/>
-        <dia:real val="1"/>
-      </dia:attribute>
-      <dia:attribute name="padding">
-        <dia:real val="0.10000000000000001"/>
-      </dia:attribute>
-      <dia:attribute name="text">
-        <dia:composite type="text">
-          <dia:attribute name="string">
-            <dia:string>#command handler#</dia:string>
-          </dia:attribute>
-          <dia:attribute name="font">
-            <dia:font family="sans" style="0" name="Helvetica"/>
-          </dia:attribute>
-          <dia:attribute name="height">
-            <dia:real val="0.49388889176727813"/>
-          </dia:attribute>
-          <dia:attribute name="pos">
-            <dia:point val="7.27474,31.4514"/>
-          </dia:attribute>
-          <dia:attribute name="color">
-            <dia:color val="#000000"/>
-          </dia:attribute>
-          <dia:attribute name="alignment">
-            <dia:enum val="1"/>
-          </dia:attribute>
-        </dia:composite>
-      </dia:attribute>
-      <dia:attribute name="flip_horizontal">
-        <dia:boolean val="false"/>
-      </dia:attribute>
-      <dia:attribute name="flip_vertical">
-        <dia:boolean val="false"/>
-      </dia:attribute>
-      <dia:attribute name="subscale">
-        <dia:real val="1"/>
-      </dia:attribute>
-    </dia:object>
-    <dia:object type="BPMN - Task" version="1" id="O50">
-      <dia:attribute name="obj_pos">
-        <dia:point val="6.78135,28.5261"/>
-      </dia:attribute>
-      <dia:attribute name="obj_bb">
-        <dia:rectangle val="6.73135,28.4761;7.77105,29.4422"/>
-      </dia:attribute>
-      <dia:attribute name="meta">
-        <dia:composite type="dict"/>
-      </dia:attribute>
-      <dia:attribute name="elem_corner">
-        <dia:point val="6.78135,28.5261"/>
-      </dia:attribute>
-      <dia:attribute name="elem_width">
-        <dia:real val="0.93970588393071131"/>
-      </dia:attribute>
-      <dia:attribute name="elem_height">
-        <dia:real val="0.86606061082625274"/>
-      </dia:attribute>
-      <dia:attribute name="line_width">
-        <dia:real val="0.10000000149011612"/>
-      </dia:attribute>
-      <dia:attribute name="line_colour">
-        <dia:color val="#000000"/>
-      </dia:attribute>
-      <dia:attribute name="fill_colour">
-        <dia:color val="#ffffff"/>
-      </dia:attribute>
-      <dia:attribute name="show_background">
-        <dia:boolean val="true"/>
-      </dia:attribute>
-      <dia:attribute name="line_style">
-        <dia:enum val="0"/>
-        <dia:real val="1"/>
-      </dia:attribute>
-      <dia:attribute name="padding">
-        <dia:real val="0.10000000000000001"/>
-      </dia:attribute>
-      <dia:attribute name="text">
-        <dia:composite type="text">
-          <dia:attribute name="string">
-            <dia:string>#afs#</dia:string>
-          </dia:attribute>
-          <dia:attribute name="font">
-            <dia:font family="sans" style="0" name="Helvetica"/>
-          </dia:attribute>
-          <dia:attribute name="height">
-            <dia:real val="0.49388889176727813"/>
-          </dia:attribute>
-          <dia:attribute name="pos">
-            <dia:point val="7.2512,29.0826"/>
-          </dia:attribute>
-          <dia:attribute name="color">
-            <dia:color val="#000000"/>
-          </dia:attribute>
-          <dia:attribute name="alignment">
-            <dia:enum val="1"/>
-          </dia:attribute>
-        </dia:composite>
-      </dia:attribute>
-      <dia:attribute name="flip_horizontal">
-        <dia:boolean val="false"/>
-      </dia:attribute>
-      <dia:attribute name="flip_vertical">
-        <dia:boolean val="false"/>
-      </dia:attribute>
-      <dia:attribute name="subscale">
-        <dia:real val="1"/>
-      </dia:attribute>
-    </dia:object>
-    <dia:object type="Standard - Line" version="0" id="O51">
-      <dia:attribute name="obj_pos">
-        <dia:point val="7.7012,28.9591"/>
-      </dia:attribute>
-      <dia:attribute name="obj_bb">
-        <dia:rectangle val="7.65087,28.9088;8.844,29.0167"/>
-      </dia:attribute>
-      <dia:attribute name="conn_endpoints">
-        <dia:point val="7.7012,28.9591"/>
-        <dia:point val="8.79367,28.9663"/>
-      </dia:attribute>
-      <dia:attribute name="numcp">
-        <dia:int val="1"/>
-      </dia:attribute>
-      <dia:attribute name="line_width">
-        <dia:real val="0.10000000149011612"/>
-      </dia:attribute>
-      <dia:connections>
-        <dia:connection handle="0" to="O50" connection="5"/>
-        <dia:connection handle="1" to="O48" connection="2"/>
-      </dia:connections>
-    </dia:object>
-    <dia:object type="Standard - Text" version="1" id="O52">
-      <dia:attribute name="obj_pos">
-        <dia:point val="0.1025,49.0569"/>
-      </dia:attribute>
-      <dia:attribute name="obj_bb">
-        <dia:rectangle val="0.1025,48.4619;5.9375,49.2094"/>
-      </dia:attribute>
-      <dia:attribute name="text">
-        <dia:composite type="text">
-          <dia:attribute name="string">
-            <dia:string>#The OSL database#</dia:string>
-          </dia:attribute>
-          <dia:attribute name="font">
-            <dia:font family="sans" style="0" name="Helvetica"/>
-          </dia:attribute>
-          <dia:attribute name="height">
-            <dia:real val="0.80000000000000004"/>
-          </dia:attribute>
-          <dia:attribute name="pos">
-            <dia:point val="0.1025,49.0569"/>
-          </dia:attribute>
-          <dia:attribute name="color">
-            <dia:color val="#000000"/>
-          </dia:attribute>
-          <dia:attribute name="alignment">
-            <dia:enum val="0"/>
-          </dia:attribute>
-        </dia:composite>
-      </dia:attribute>
-      <dia:attribute name="valign">
-        <dia:enum val="3"/>
-      </dia:attribute>
-    </dia:object>
-    <dia:object type="Standard - Text" version="1" id="O53">
-      <dia:attribute name="obj_pos">
-        <dia:point val="0.2206,58.055"/>
-      </dia:attribute>
-      <dia:attribute name="obj_bb">
-        <dia:rectangle val="0.209037,57.6759;14.1806,68.0509"/>
-      </dia:attribute>
-      <dia:attribute name="text">
-        <dia:composite type="text">
-          <dia:attribute name="string">
-            <dia:string>#Metadata about all known audio files is stored in serveral tables of a
-database which is driven by libosl, the object storage layer library.
-
-The "audio files" table is the main table of the database. It contains
-path, hash and metadata of each known file.
-
-The "attributes" table maps each of the 64 possible attributes to a
-string. The attribute value of the file's metadata is translated through
-this table.
-
-The tables shown shaded are blob tables which support add, rm, mv,
-cat, ls commands. All of these are optional.
-
-The "score" table describes the subset of admissible files for the
-current playlist or mood. This table is created on demand, resides
-only in memory and is discarded on exit.
-
-When the next audio file is to be streamed, the audio file selector gets
-the entry with the highest score from the "score" table, obtains path,
-hash, and metadata for this entry from the "audio files" table, opens
-the path and verifies the hash.#</dia:string>
-          </dia:attribute>
-          <dia:attribute name="font">
-            <dia:font family="sans" style="0" name="Helvetica"/>
-          </dia:attribute>
-          <dia:attribute name="height">
-            <dia:real val="0.49388889176727813"/>
-          </dia:attribute>
-          <dia:attribute name="pos">
-            <dia:point val="0.2206,58.055"/>
-          </dia:attribute>
-          <dia:attribute name="color">
-            <dia:color val="#000000"/>
-          </dia:attribute>
-          <dia:attribute name="alignment">
-            <dia:enum val="0"/>
-          </dia:attribute>
-        </dia:composite>
-      </dia:attribute>
-      <dia:attribute name="valign">
-        <dia:enum val="3"/>
-      </dia:attribute>
-    </dia:object>
-    <dia:group>
-      <dia:object type="Flowchart - Extract" version="1" id="O54">
-        <dia:attribute name="obj_pos">
-          <dia:point val="2.048,53.4404"/>
-        </dia:attribute>
-        <dia:attribute name="obj_bb">
-          <dia:rectangle val="1.88598,53.3799;6.86502,55.0782"/>
-        </dia:attribute>
-        <dia:attribute name="meta">
-          <dia:composite type="dict"/>
-        </dia:attribute>
-        <dia:attribute name="elem_corner">
-          <dia:point val="2.048,53.4404"/>
-        </dia:attribute>
-        <dia:attribute name="elem_width">
-          <dia:real val="4.6550000029802332"/>
-        </dia:attribute>
-        <dia:attribute name="elem_height">
-          <dia:real val="1.5877777865147884"/>
-        </dia:attribute>
-        <dia:attribute name="line_width">
-          <dia:real val="0.10000000149011612"/>
-        </dia:attribute>
-        <dia:attribute name="line_colour">
-          <dia:color val="#000000"/>
-        </dia:attribute>
-        <dia:attribute name="fill_colour">
-          <dia:color val="#ffffff"/>
-        </dia:attribute>
-        <dia:attribute name="show_background">
-          <dia:boolean val="true"/>
-        </dia:attribute>
-        <dia:attribute name="line_style">
-          <dia:enum val="0"/>
-          <dia:real val="1"/>
-        </dia:attribute>
-        <dia:attribute name="padding">
-          <dia:real val="0.10000000000000001"/>
-        </dia:attribute>
-        <dia:attribute name="text">
-          <dia:composite type="text">
-            <dia:attribute name="string">
-              <dia:string>#audio files#</dia:string>
-            </dia:attribute>
-            <dia:attribute name="font">
-              <dia:font family="sans" style="0" name="Helvetica"/>
-            </dia:attribute>
-            <dia:attribute name="height">
-              <dia:real val="0.49388889176727813"/>
-            </dia:attribute>
-            <dia:attribute name="pos">
-              <dia:point val="4.3755,54.7547"/>
-            </dia:attribute>
-            <dia:attribute name="color">
-              <dia:color val="#000000"/>
-            </dia:attribute>
-            <dia:attribute name="alignment">
-              <dia:enum val="1"/>
-            </dia:attribute>
-          </dia:composite>
-        </dia:attribute>
-        <dia:attribute name="flip_horizontal">
-          <dia:boolean val="false"/>
-        </dia:attribute>
-        <dia:attribute name="flip_vertical">
-          <dia:boolean val="false"/>
-        </dia:attribute>
-        <dia:attribute name="subscale">
-          <dia:real val="1"/>
-        </dia:attribute>
-      </dia:object>
-      <dia:object type="Flowchart - Extract" version="1" id="O55">
-        <dia:attribute name="obj_pos">
-          <dia:point val="9.0846,55.0212"/>
-        </dia:attribute>
-        <dia:attribute name="obj_bb">
-          <dia:rectangle val="8.94554,54.9564;13.0687,56.659"/>
-        </dia:attribute>
-        <dia:attribute name="meta">
-          <dia:composite type="dict"/>
-        </dia:attribute>
-        <dia:attribute name="elem_corner">
-          <dia:point val="9.0846,55.0212"/>
-        </dia:attribute>
-        <dia:attribute name="elem_width">
-          <dia:real val="3.8450000029802323"/>
-        </dia:attribute>
-        <dia:attribute name="elem_height">
-          <dia:real val="1.5877777865147775"/>
-        </dia:attribute>
-        <dia:attribute name="line_width">
-          <dia:real val="0.10000000149011612"/>
-        </dia:attribute>
-        <dia:attribute name="line_colour">
-          <dia:color val="#000000"/>
-        </dia:attribute>
-        <dia:attribute name="fill_colour">
-          <dia:color val="#cccccc"/>
-        </dia:attribute>
-        <dia:attribute name="show_background">
-          <dia:boolean val="true"/>
-        </dia:attribute>
-        <dia:attribute name="line_style">
-          <dia:enum val="0"/>
-          <dia:real val="1"/>
-        </dia:attribute>
-        <dia:attribute name="padding">
-          <dia:real val="0.10000000000000001"/>
-        </dia:attribute>
-        <dia:attribute name="text">
-          <dia:composite type="text">
-            <dia:attribute name="string">
-              <dia:string>#playlists#</dia:string>
-            </dia:attribute>
-            <dia:attribute name="font">
-              <dia:font family="sans" style="0" name="Helvetica"/>
-            </dia:attribute>
-            <dia:attribute name="height">
-              <dia:real val="0.49388889176727813"/>
-            </dia:attribute>
-            <dia:attribute name="pos">
-              <dia:point val="11.0071,56.3355"/>
-            </dia:attribute>
-            <dia:attribute name="color">
-              <dia:color val="#000000"/>
-            </dia:attribute>
-            <dia:attribute name="alignment">
-              <dia:enum val="1"/>
-            </dia:attribute>
-          </dia:composite>
-        </dia:attribute>
-        <dia:attribute name="flip_horizontal">
-          <dia:boolean val="false"/>
-        </dia:attribute>
-        <dia:attribute name="flip_vertical">
-          <dia:boolean val="false"/>
-        </dia:attribute>
-        <dia:attribute name="subscale">
-          <dia:real val="1"/>
-        </dia:attribute>
-      </dia:object>
-      <dia:object type="Flowchart - Extract" version="1" id="O56">
-        <dia:attribute name="obj_pos">
-          <dia:point val="5.9317,52.7104"/>
-        </dia:attribute>
-        <dia:attribute name="obj_bb">
-          <dia:rectangle val="5.803,52.6426;9.5304,54.3482"/>
-        </dia:attribute>
-        <dia:attribute name="meta">
-          <dia:composite type="dict"/>
-        </dia:attribute>
-        <dia:attribute name="elem_corner">
-          <dia:point val="5.9317,52.7104"/>
-        </dia:attribute>
-        <dia:attribute name="elem_width">
-          <dia:real val="3.4700000029802327"/>
-        </dia:attribute>
-        <dia:attribute name="elem_height">
-          <dia:real val="1.5877777865147873"/>
-        </dia:attribute>
-        <dia:attribute name="line_width">
-          <dia:real val="0.10000000149011612"/>
-        </dia:attribute>
-        <dia:attribute name="line_colour">
-          <dia:color val="#000000"/>
-        </dia:attribute>
-        <dia:attribute name="fill_colour">
-          <dia:color val="#cccccc"/>
-        </dia:attribute>
-        <dia:attribute name="show_background">
-          <dia:boolean val="true"/>
-        </dia:attribute>
-        <dia:attribute name="line_style">
-          <dia:enum val="0"/>
-          <dia:real val="1"/>
-        </dia:attribute>
-        <dia:attribute name="padding">
-          <dia:real val="0.10000000000000001"/>
-        </dia:attribute>
-        <dia:attribute name="text">
-          <dia:composite type="text">
-            <dia:attribute name="string">
-              <dia:string>#images#</dia:string>
-            </dia:attribute>
-            <dia:attribute name="font">
-              <dia:font family="sans" style="0" name="Helvetica"/>
-            </dia:attribute>
-            <dia:attribute name="height">
-              <dia:real val="0.49388889176727813"/>
-            </dia:attribute>
-            <dia:attribute name="pos">
-              <dia:point val="7.6667,54.0247"/>
-            </dia:attribute>
-            <dia:attribute name="color">
-              <dia:color val="#000000"/>
-            </dia:attribute>
-            <dia:attribute name="alignment">
-              <dia:enum val="1"/>
-            </dia:attribute>
-          </dia:composite>
-        </dia:attribute>
-        <dia:attribute name="flip_horizontal">
-          <dia:boolean val="false"/>
-        </dia:attribute>
-        <dia:attribute name="flip_vertical">
-          <dia:boolean val="false"/>
-        </dia:attribute>
-        <dia:attribute name="subscale">
-          <dia:real val="1"/>
-        </dia:attribute>
-      </dia:object>
-      <dia:object type="Flowchart - Extract" version="1" id="O57">
-        <dia:attribute name="obj_pos">
-          <dia:point val="6.8382,50.5875"/>
-        </dia:attribute>
-        <dia:attribute name="obj_bb">
-          <dia:rectangle val="6.68191,50.5261;11.4495,52.2253"/>
-        </dia:attribute>
-        <dia:attribute name="meta">
-          <dia:composite type="dict"/>
-        </dia:attribute>
-        <dia:attribute name="elem_corner">
-          <dia:point val="6.8382,50.5875"/>
-        </dia:attribute>
-        <dia:attribute name="elem_width">
-          <dia:real val="4.4550000029802321"/>
-        </dia:attribute>
-        <dia:attribute name="elem_height">
-          <dia:real val="1.587777786514786"/>
-        </dia:attribute>
-        <dia:attribute name="line_width">
-          <dia:real val="0.10000000149011612"/>
-        </dia:attribute>
-        <dia:attribute name="line_colour">
-          <dia:color val="#000000"/>
-        </dia:attribute>
-        <dia:attribute name="fill_colour">
-          <dia:color val="#ffffff"/>
-        </dia:attribute>
-        <dia:attribute name="show_background">
-          <dia:boolean val="true"/>
-        </dia:attribute>
-        <dia:attribute name="line_style">
-          <dia:enum val="0"/>
-          <dia:real val="1"/>
-        </dia:attribute>
-        <dia:attribute name="padding">
-          <dia:real val="0.10000000000000001"/>
-        </dia:attribute>
-        <dia:attribute name="text">
-          <dia:composite type="text">
-            <dia:attribute name="string">
-              <dia:string>#attributes#</dia:string>
-            </dia:attribute>
-            <dia:attribute name="font">
-              <dia:font family="sans" style="0" name="Helvetica"/>
-            </dia:attribute>
-            <dia:attribute name="height">
-              <dia:real val="0.49388889176727813"/>
-            </dia:attribute>
-            <dia:attribute name="pos">
-              <dia:point val="9.0657,51.9018"/>
-            </dia:attribute>
-            <dia:attribute name="color">
-              <dia:color val="#000000"/>
-            </dia:attribute>
-            <dia:attribute name="alignment">
-              <dia:enum val="1"/>
-            </dia:attribute>
-          </dia:composite>
-        </dia:attribute>
-        <dia:attribute name="flip_horizontal">
-          <dia:boolean val="false"/>
-        </dia:attribute>
-        <dia:attribute name="flip_vertical">
-          <dia:boolean val="false"/>
-        </dia:attribute>
-        <dia:attribute name="subscale">
-          <dia:real val="1"/>
-        </dia:attribute>
-      </dia:object>
-      <dia:object type="Flowchart - Extract" version="1" id="O58">
-        <dia:attribute name="obj_pos">
-          <dia:point val="9.7265,52.7977"/>
-        </dia:attribute>
-        <dia:attribute name="obj_bb">
-          <dia:rectangle val="9.61888,52.7202;12.5141,54.4355"/>
-        </dia:attribute>
-        <dia:attribute name="meta">
-          <dia:composite type="dict"/>
-        </dia:attribute>
-        <dia:attribute name="elem_corner">
-          <dia:point val="9.7265,52.7977"/>
-        </dia:attribute>
-        <dia:attribute name="elem_width">
-          <dia:real val="2.6800000029802327"/>
-        </dia:attribute>
-        <dia:attribute name="elem_height">
-          <dia:real val="1.5877777865147884"/>
-        </dia:attribute>
-        <dia:attribute name="line_width">
-          <dia:real val="0.10000000149011612"/>
-        </dia:attribute>
-        <dia:attribute name="line_colour">
-          <dia:color val="#000000"/>
-        </dia:attribute>
-        <dia:attribute name="fill_colour">
-          <dia:color val="#cccccc"/>
-        </dia:attribute>
-        <dia:attribute name="show_background">
-          <dia:boolean val="true"/>
-        </dia:attribute>
-        <dia:attribute name="line_style">
-          <dia:enum val="0"/>
-          <dia:real val="1"/>
-        </dia:attribute>
-        <dia:attribute name="padding">
-          <dia:real val="0.10000000000000001"/>
-        </dia:attribute>
-        <dia:attribute name="text">
-          <dia:composite type="text">
-            <dia:attribute name="string">
-              <dia:string>#lyrics#</dia:string>
-            </dia:attribute>
-            <dia:attribute name="font">
-              <dia:font family="sans" style="0" name="Helvetica"/>
-            </dia:attribute>
-            <dia:attribute name="height">
-              <dia:real val="0.49388889176727813"/>
-            </dia:attribute>
-            <dia:attribute name="pos">
-              <dia:point val="11.0665,54.112"/>
-            </dia:attribute>
-            <dia:attribute name="color">
-              <dia:color val="#000000"/>
-            </dia:attribute>
-            <dia:attribute name="alignment">
-              <dia:enum val="1"/>
-            </dia:attribute>
-          </dia:composite>
-        </dia:attribute>
-        <dia:attribute name="flip_horizontal">
-          <dia:boolean val="false"/>
-        </dia:attribute>
-        <dia:attribute name="flip_vertical">
-          <dia:boolean val="false"/>
-        </dia:attribute>
-        <dia:attribute name="subscale">
-          <dia:real val="1"/>
-        </dia:attribute>
-      </dia:object>
-      <dia:object type="Flowchart - Extract" version="1" id="O59">
-        <dia:attribute name="obj_pos">
-          <dia:point val="5.4821,55.0581"/>
-        </dia:attribute>
-        <dia:attribute name="obj_bb">
-          <dia:rectangle val="5.35938,54.9882;8.85482,56.6959"/>
-        </dia:attribute>
-        <dia:attribute name="meta">
-          <dia:composite type="dict"/>
-        </dia:attribute>
-        <dia:attribute name="elem_corner">
-          <dia:point val="5.4821,55.0581"/>
-        </dia:attribute>
-        <dia:attribute name="elem_width">
-          <dia:real val="3.2500000029802325"/>
-        </dia:attribute>
-        <dia:attribute name="elem_height">
-          <dia:real val="1.58777778651479"/>
-        </dia:attribute>
-        <dia:attribute name="line_width">
-          <dia:real val="0.10000000149011612"/>
-        </dia:attribute>
-        <dia:attribute name="line_colour">
-          <dia:color val="#000000"/>
-        </dia:attribute>
-        <dia:attribute name="fill_colour">
-          <dia:color val="#cccccc"/>
-        </dia:attribute>
-        <dia:attribute name="show_background">
-          <dia:boolean val="true"/>
-        </dia:attribute>
-        <dia:attribute name="line_style">
-          <dia:enum val="0"/>
-          <dia:real val="1"/>
-        </dia:attribute>
-        <dia:attribute name="padding">
-          <dia:real val="0.10000000000000001"/>
-        </dia:attribute>
-        <dia:attribute name="text">
-          <dia:composite type="text">
-            <dia:attribute name="string">
-              <dia:string>#moods#</dia:string>
-            </dia:attribute>
-            <dia:attribute name="font">
-              <dia:font family="sans" style="0" name="Helvetica"/>
-            </dia:attribute>
-            <dia:attribute name="height">
-              <dia:real val="0.49388889176727813"/>
-            </dia:attribute>
-            <dia:attribute name="pos">
-              <dia:point val="7.1071,56.3724"/>
-            </dia:attribute>
-            <dia:attribute name="color">
-              <dia:color val="#000000"/>
-            </dia:attribute>
-            <dia:attribute name="alignment">
-              <dia:enum val="1"/>
-            </dia:attribute>
-          </dia:composite>
-        </dia:attribute>
-        <dia:attribute name="flip_horizontal">
-          <dia:boolean val="false"/>
-        </dia:attribute>
-        <dia:attribute name="flip_vertical">
-          <dia:boolean val="false"/>
-        </dia:attribute>
-        <dia:attribute name="subscale">
-          <dia:real val="1"/>
-        </dia:attribute>
-      </dia:object>
-      <dia:object type="Flowchart - Extract" version="1" id="O60">
-        <dia:attribute name="obj_pos">
-          <dia:point val="2.4988,50.5557"/>
-        </dia:attribute>
-        <dia:attribute name="obj_bb">
-          <dia:rectangle val="2.35946,50.4909;6.49314,52.1935"/>
-        </dia:attribute>
-        <dia:attribute name="meta">
-          <dia:composite type="dict"/>
-        </dia:attribute>
-        <dia:attribute name="elem_corner">
-          <dia:point val="2.4988,50.5557"/>
-        </dia:attribute>
-        <dia:attribute name="elem_width">
-          <dia:real val="3.855000002980232"/>
-        </dia:attribute>
-        <dia:attribute name="elem_height">
-          <dia:real val="1.587777786514786"/>
-        </dia:attribute>
-        <dia:attribute name="line_width">
-          <dia:real val="0.10000000149011612"/>
-        </dia:attribute>
-        <dia:attribute name="line_colour">
-          <dia:color val="#000000"/>
-        </dia:attribute>
-        <dia:attribute name="fill_colour">
-          <dia:color val="#ffffff"/>
-        </dia:attribute>
-        <dia:attribute name="show_background">
-          <dia:boolean val="true"/>
-        </dia:attribute>
-        <dia:attribute name="line_style">
-          <dia:enum val="4"/>
-          <dia:real val="1"/>
-        </dia:attribute>
-        <dia:attribute name="padding">
-          <dia:real val="0.10000000000000001"/>
-        </dia:attribute>
-        <dia:attribute name="text">
-          <dia:composite type="text">
-            <dia:attribute name="string">
-              <dia:string>#score#</dia:string>
-            </dia:attribute>
-            <dia:attribute name="font">
-              <dia:font family="sans" style="0" name="Helvetica"/>
-            </dia:attribute>
-            <dia:attribute name="height">
-              <dia:real val="0.49388889176727813"/>
-            </dia:attribute>
-            <dia:attribute name="pos">
-              <dia:point val="4.4263,51.87"/>
-            </dia:attribute>
-            <dia:attribute name="color">
-              <dia:color val="#000000"/>
-            </dia:attribute>
-            <dia:attribute name="alignment">
-              <dia:enum val="1"/>
-            </dia:attribute>
-          </dia:composite>
-        </dia:attribute>
-        <dia:attribute name="flip_horizontal">
-          <dia:boolean val="false"/>
-        </dia:attribute>
-        <dia:attribute name="flip_vertical">
-          <dia:boolean val="false"/>
-        </dia:attribute>
-        <dia:attribute name="subscale">
-          <dia:real val="1"/>
-        </dia:attribute>
-      </dia:object>
-      <dia:object type="Standard - Line" version="0" id="O61">
-        <dia:attribute name="obj_pos">
-          <dia:point val="4.41144,52.1937"/>
-        </dia:attribute>
-        <dia:attribute name="obj_bb">
-          <dia:rectangle val="4.33898,52.1428;4.46231,53.4702"/>
-        </dia:attribute>
-        <dia:attribute name="conn_endpoints">
-          <dia:point val="4.41144,52.1937"/>
-          <dia:point val="4.38985,53.4194"/>
-        </dia:attribute>
-        <dia:attribute name="numcp">
-          <dia:int val="1"/>
-        </dia:attribute>
-        <dia:attribute name="line_width">
-          <dia:real val="0.10000000149011612"/>
-        </dia:attribute>
-        <dia:connections>
-          <dia:connection handle="0" to="O60" connection="12"/>
-          <dia:connection handle="1" to="O54" connection="12"/>
-        </dia:connections>
-      </dia:object>
-      <dia:object type="Standard - Line" version="0" id="O62">
-        <dia:attribute name="obj_pos">
-          <dia:point val="5.03792,53.8314"/>
-        </dia:attribute>
-        <dia:attribute name="obj_bb">
-          <dia:rectangle val="4.96922,52.1555;7.74887,53.9001"/>
-        </dia:attribute>
-        <dia:attribute name="conn_endpoints">
-          <dia:point val="5.03792,53.8314"/>
-          <dia:point val="7.68017,52.2242"/>
-        </dia:attribute>
-        <dia:attribute name="numcp">
-          <dia:int val="1"/>
-        </dia:attribute>
-        <dia:attribute name="line_width">
-          <dia:real val="0.10000000149011612"/>
-        </dia:attribute>
-        <dia:connections>
-          <dia:connection handle="0" to="O54" connection="12"/>
-          <dia:connection handle="1" to="O57" connection="12"/>
-        </dia:connections>
-      </dia:object>
-    </dia:group>
-    <dia:group>
-      <dia:object type="BPMN - Task" version="1" id="O63">
-        <dia:attribute name="obj_pos">
-          <dia:point val="4.42569,77.8748"/>
-        </dia:attribute>
-        <dia:attribute name="obj_bb">
-          <dia:rectangle val="4.37569,77.8248;7.15716,78.8293"/>
-        </dia:attribute>
-        <dia:attribute name="meta">
-          <dia:composite type="dict"/>
-        </dia:attribute>
-        <dia:attribute name="elem_corner">
-          <dia:point val="4.42569,77.8748"/>
-        </dia:attribute>
-        <dia:attribute name="elem_width">
-          <dia:real val="2.6814705898130642"/>
-        </dia:attribute>
-        <dia:attribute name="elem_height">
-          <dia:real val="0.90454545953538923"/>
-        </dia:attribute>
-        <dia:attribute name="line_width">
-          <dia:real val="0.10000000149011612"/>
-        </dia:attribute>
-        <dia:attribute name="line_colour">
-          <dia:color val="#000000"/>
-        </dia:attribute>
-        <dia:attribute name="fill_colour">
-          <dia:color val="#ffffff"/>
-        </dia:attribute>
-        <dia:attribute name="show_background">
-          <dia:boolean val="true"/>
-        </dia:attribute>
-        <dia:attribute name="line_style">
-          <dia:enum val="0"/>
-          <dia:real val="1"/>
-        </dia:attribute>
-        <dia:attribute name="padding">
-          <dia:real val="0.10000000000000001"/>
-        </dia:attribute>
-        <dia:attribute name="text">
-          <dia:composite type="text">
-            <dia:attribute name="string">
-              <dia:string>#dispatcher#</dia:string>
-            </dia:attribute>
-            <dia:attribute name="font">
-              <dia:font family="sans" style="0" name="Helvetica"/>
-            </dia:attribute>
-            <dia:attribute name="height">
-              <dia:real val="0.52916666975065518"/>
-            </dia:attribute>
-            <dia:attribute name="pos">
-              <dia:point val="5.76643,78.4594"/>
-            </dia:attribute>
-            <dia:attribute name="color">
-              <dia:color val="#000000"/>
-            </dia:attribute>
-            <dia:attribute name="alignment">
-              <dia:enum val="1"/>
-            </dia:attribute>
-          </dia:composite>
-        </dia:attribute>
-        <dia:attribute name="flip_horizontal">
-          <dia:boolean val="false"/>
-        </dia:attribute>
-        <dia:attribute name="flip_vertical">
-          <dia:boolean val="false"/>
-        </dia:attribute>
-        <dia:attribute name="subscale">
-          <dia:real val="1"/>
-        </dia:attribute>
-      </dia:object>
-      <dia:object type="BPMN - Task" version="1" id="O64">
-        <dia:attribute name="obj_pos">
-          <dia:point val="1.63592,76.2823"/>
-        </dia:attribute>
-        <dia:attribute name="obj_bb">
-          <dia:rectangle val="1.58592,76.2323;5.11916,77.2368"/>
-        </dia:attribute>
-        <dia:attribute name="meta">
-          <dia:composite type="dict"/>
-        </dia:attribute>
-        <dia:attribute name="elem_corner">
-          <dia:point val="1.63592,76.2823"/>
-        </dia:attribute>
-        <dia:attribute name="elem_width">
-          <dia:real val="3.4332352956954173"/>
-        </dia:attribute>
-        <dia:attribute name="elem_height">
-          <dia:real val="0.9045454595353889"/>
-        </dia:attribute>
-        <dia:attribute name="line_width">
-          <dia:real val="0.10000000149011612"/>
-        </dia:attribute>
-        <dia:attribute name="line_colour">
-          <dia:color val="#000000"/>
-        </dia:attribute>
-        <dia:attribute name="fill_colour">
-          <dia:color val="#ffffff"/>
-        </dia:attribute>
-        <dia:attribute name="show_background">
-          <dia:boolean val="true"/>
-        </dia:attribute>
-        <dia:attribute name="line_style">
-          <dia:enum val="0"/>
-          <dia:real val="1"/>
-        </dia:attribute>
-        <dia:attribute name="padding">
-          <dia:real val="0.10000000000000001"/>
-        </dia:attribute>
-        <dia:attribute name="text">
-          <dia:composite type="text">
-            <dia:attribute name="string">
-              <dia:string>#status fetcher#</dia:string>
-            </dia:attribute>
-            <dia:attribute name="font">
-              <dia:font family="sans" style="0" name="Helvetica"/>
-            </dia:attribute>
-            <dia:attribute name="height">
-              <dia:real val="0.52916666975065518"/>
-            </dia:attribute>
-            <dia:attribute name="pos">
-              <dia:point val="3.35254,76.8669"/>
-            </dia:attribute>
-            <dia:attribute name="color">
-              <dia:color val="#000000"/>
-            </dia:attribute>
-            <dia:attribute name="alignment">
-              <dia:enum val="1"/>
-            </dia:attribute>
-          </dia:composite>
-        </dia:attribute>
-        <dia:attribute name="flip_horizontal">
-          <dia:boolean val="false"/>
-        </dia:attribute>
-        <dia:attribute name="flip_vertical">
-          <dia:boolean val="false"/>
-        </dia:attribute>
-        <dia:attribute name="subscale">
-          <dia:real val="1"/>
-        </dia:attribute>
-      </dia:object>
-      <dia:object type="Network - An amplifier speaker" version="1" id="O65">
-        <dia:attribute name="obj_pos">
-          <dia:point val="11.9716,75.7366"/>
-        </dia:attribute>
-        <dia:attribute name="obj_bb">
-          <dia:rectangle val="11.9216,75.6866;13.0196,77.7826"/>
-        </dia:attribute>
-        <dia:attribute name="meta">
-          <dia:composite type="dict"/>
-        </dia:attribute>
-        <dia:attribute name="elem_corner">
-          <dia:point val="11.9716,75.7366"/>
-        </dia:attribute>
-        <dia:attribute name="elem_width">
-          <dia:real val="0.99802008040072598"/>
-        </dia:attribute>
-        <dia:attribute name="elem_height">
-          <dia:real val="1.996040160801452"/>
-        </dia:attribute>
-        <dia:attribute name="line_width">
-          <dia:real val="0.10000000149011612"/>
-        </dia:attribute>
-        <dia:attribute name="line_colour">
-          <dia:color val="#000000"/>
-        </dia:attribute>
-        <dia:attribute name="fill_colour">
-          <dia:color val="#ffffff"/>
-        </dia:attribute>
-        <dia:attribute name="show_background">
-          <dia:boolean val="true"/>
-        </dia:attribute>
-        <dia:attribute name="line_style">
-          <dia:enum val="0"/>
-          <dia:real val="1"/>
-        </dia:attribute>
-        <dia:attribute name="flip_horizontal">
-          <dia:boolean val="false"/>
-        </dia:attribute>
-        <dia:attribute name="flip_vertical">
-          <dia:boolean val="false"/>
-        </dia:attribute>
-        <dia:attribute name="subscale">
-          <dia:real val="1"/>
-        </dia:attribute>
-      </dia:object>
-      <dia:object type="BPMN - Task" version="1" id="O66">
-        <dia:attribute name="obj_pos">
-          <dia:point val="4.31303,74.415"/>
-        </dia:attribute>
-        <dia:attribute name="obj_bb">
-          <dia:rectangle val="4.26303,74.365;7.16362,75.3311"/>
-        </dia:attribute>
-        <dia:attribute name="meta">
-          <dia:composite type="dict"/>
-        </dia:attribute>
-        <dia:attribute name="elem_corner">
-          <dia:point val="4.31303,74.415"/>
-        </dia:attribute>
-        <dia:attribute name="elem_width">
-          <dia:real val="2.8005882368718877"/>
-        </dia:attribute>
-        <dia:attribute name="elem_height">
-          <dia:real val="0.8660606108262453"/>
-        </dia:attribute>
-        <dia:attribute name="line_width">
-          <dia:real val="0.10000000149011612"/>
-        </dia:attribute>
-        <dia:attribute name="line_colour">
-          <dia:color val="#000000"/>
-        </dia:attribute>
-        <dia:attribute name="fill_colour">
-          <dia:color val="#bbe7bb"/>
-        </dia:attribute>
-        <dia:attribute name="show_background">
-          <dia:boolean val="true"/>
-        </dia:attribute>
-        <dia:attribute name="line_style">
-          <dia:enum val="0"/>
-          <dia:real val="1"/>
-        </dia:attribute>
-        <dia:attribute name="padding">
-          <dia:real val="0.10000000000000001"/>
-        </dia:attribute>
-        <dia:attribute name="text">
-          <dia:composite type="text">
-            <dia:attribute name="string">
-              <dia:string>#para_server#</dia:string>
-            </dia:attribute>
-            <dia:attribute name="font">
-              <dia:font family="sans" style="0" name="Helvetica"/>
-            </dia:attribute>
-            <dia:attribute name="height">
-              <dia:real val="0.49388889176727813"/>
-            </dia:attribute>
-            <dia:attribute name="pos">
-              <dia:point val="5.71332,74.9715"/>
-            </dia:attribute>
-            <dia:attribute name="color">
-              <dia:color val="#000000"/>
-            </dia:attribute>
-            <dia:attribute name="alignment">
-              <dia:enum val="1"/>
-            </dia:attribute>
-          </dia:composite>
-        </dia:attribute>
-        <dia:attribute name="flip_horizontal">
-          <dia:boolean val="false"/>
-        </dia:attribute>
-        <dia:attribute name="flip_vertical">
-          <dia:boolean val="false"/>
-        </dia:attribute>
-        <dia:attribute name="subscale">
-          <dia:real val="1"/>
-        </dia:attribute>
-      </dia:object>
-      <dia:object type="BPMN - Task" version="1" id="O67">
-        <dia:attribute name="obj_pos">
-          <dia:point val="7.11064,76.3016"/>
-        </dia:attribute>
-        <dia:attribute name="obj_bb">
-          <dia:rectangle val="7.06064,76.2516;9.18034,77.2177"/>
-        </dia:attribute>
-        <dia:attribute name="meta">
-          <dia:composite type="dict"/>
-        </dia:attribute>
-        <dia:attribute name="elem_corner">
-          <dia:point val="7.11064,76.3016"/>
-        </dia:attribute>
-        <dia:attribute name="elem_width">
-          <dia:real val="2.0197058839307109"/>
-        </dia:attribute>
-        <dia:attribute name="elem_height">
-          <dia:real val="0.86606061082625108"/>
-        </dia:attribute>
-        <dia:attribute name="line_width">
-          <dia:real val="0.10000000149011612"/>
-        </dia:attribute>
-        <dia:attribute name="line_colour">
-          <dia:color val="#000000"/>
-        </dia:attribute>
-        <dia:attribute name="fill_colour">
-          <dia:color val="#bbbbee"/>
-        </dia:attribute>
-        <dia:attribute name="show_background">
-          <dia:boolean val="true"/>
-        </dia:attribute>
-        <dia:attribute name="line_style">
-          <dia:enum val="0"/>
-          <dia:real val="1"/>
-        </dia:attribute>
-        <dia:attribute name="padding">
-          <dia:real val="0.10000000000000001"/>
-        </dia:attribute>
-        <dia:attribute name="text">
-          <dia:composite type="text">
-            <dia:attribute name="string">
-              <dia:string>#receiver#</dia:string>
-            </dia:attribute>
-            <dia:attribute name="font">
-              <dia:font family="sans" style="0" name="Helvetica"/>
-            </dia:attribute>
-            <dia:attribute name="height">
-              <dia:real val="0.49388889176727813"/>
-            </dia:attribute>
-            <dia:attribute name="pos">
-              <dia:point val="8.12049,76.8581"/>
-            </dia:attribute>
-            <dia:attribute name="color">
-              <dia:color val="#000000"/>
-            </dia:attribute>
-            <dia:attribute name="alignment">
-              <dia:enum val="1"/>
-            </dia:attribute>
-          </dia:composite>
-        </dia:attribute>
-        <dia:attribute name="flip_horizontal">
-          <dia:boolean val="false"/>
-        </dia:attribute>
-        <dia:attribute name="flip_vertical">
-          <dia:boolean val="false"/>
-        </dia:attribute>
-        <dia:attribute name="subscale">
-          <dia:real val="1"/>
-        </dia:attribute>
-      </dia:object>
-      <dia:object type="BPMN - Task" version="1" id="O68">
-        <dia:attribute name="obj_pos">
-          <dia:point val="9.56352,76.3016"/>
-        </dia:attribute>
-        <dia:attribute name="obj_bb">
-          <dia:rectangle val="9.51352,76.2516;11.1726,77.2177"/>
-        </dia:attribute>
-        <dia:attribute name="meta">
-          <dia:composite type="dict"/>
-        </dia:attribute>
-        <dia:attribute name="elem_corner">
-          <dia:point val="9.56352,76.3016"/>
-        </dia:attribute>
-        <dia:attribute name="elem_width">
-          <dia:real val="1.5591176486365934"/>
-        </dia:attribute>
-        <dia:attribute name="elem_height">
-          <dia:real val="0.86606061082625141"/>
-        </dia:attribute>
-        <dia:attribute name="line_width">
-          <dia:real val="0.10000000149011612"/>
-        </dia:attribute>
-        <dia:attribute name="line_colour">
-          <dia:color val="#000000"/>
-        </dia:attribute>
-        <dia:attribute name="fill_colour">
-          <dia:color val="#bbbbee"/>
-        </dia:attribute>
-        <dia:attribute name="show_background">
-          <dia:boolean val="true"/>
-        </dia:attribute>
-        <dia:attribute name="line_style">
-          <dia:enum val="0"/>
-          <dia:real val="1"/>
-        </dia:attribute>
-        <dia:attribute name="padding">
-          <dia:real val="0.10000000000000001"/>
-        </dia:attribute>
-        <dia:attribute name="text">
-          <dia:composite type="text">
-            <dia:attribute name="string">
-              <dia:string>#filter1#</dia:string>
-            </dia:attribute>
-            <dia:attribute name="font">
-              <dia:font family="sans" style="0" name="Helvetica"/>
-            </dia:attribute>
-            <dia:attribute name="height">
-              <dia:real val="0.49388889176727813"/>
-            </dia:attribute>
-            <dia:attribute name="pos">
-              <dia:point val="10.3431,76.8581"/>
-            </dia:attribute>
-            <dia:attribute name="color">
-              <dia:color val="#000000"/>
-            </dia:attribute>
-            <dia:attribute name="alignment">
-              <dia:enum val="1"/>
-            </dia:attribute>
-          </dia:composite>
-        </dia:attribute>
-        <dia:attribute name="flip_horizontal">
-          <dia:boolean val="false"/>
-        </dia:attribute>
-        <dia:attribute name="flip_vertical">
-          <dia:boolean val="false"/>
-        </dia:attribute>
-        <dia:attribute name="subscale">
-          <dia:real val="1"/>
-        </dia:attribute>
-      </dia:object>
-      <dia:object type="BPMN - Task" version="1" id="O69">
-        <dia:attribute name="obj_pos">
-          <dia:point val="9.48684,78.4014"/>
-        </dia:attribute>
-        <dia:attribute name="obj_bb">
-          <dia:rectangle val="9.43684,78.3514;11.2283,79.3175"/>
-        </dia:attribute>
-        <dia:attribute name="meta">
-          <dia:composite type="dict"/>
-        </dia:attribute>
-        <dia:attribute name="elem_corner">
-          <dia:point val="9.48684,78.4014"/>
-        </dia:attribute>
-        <dia:attribute name="elem_width">
-          <dia:real val="1.691470589813064"/>
-        </dia:attribute>
-        <dia:attribute name="elem_height">
-          <dia:real val="0.86606061082625141"/>
-        </dia:attribute>
-        <dia:attribute name="line_width">
-          <dia:real val="0.10000000149011612"/>
-        </dia:attribute>
-        <dia:attribute name="line_colour">
-          <dia:color val="#000000"/>
-        </dia:attribute>
-        <dia:attribute name="fill_colour">
-          <dia:color val="#bbbbee"/>
-        </dia:attribute>
-        <dia:attribute name="show_background">
-          <dia:boolean val="true"/>
-        </dia:attribute>
-        <dia:attribute name="line_style">
-          <dia:enum val="0"/>
-          <dia:real val="1"/>
-        </dia:attribute>
-        <dia:attribute name="padding">
-          <dia:real val="0.10000000000000001"/>
-        </dia:attribute>
-        <dia:attribute name="text">
-          <dia:composite type="text">
-            <dia:attribute name="string">
-              <dia:string>#filter 2#</dia:string>
-            </dia:attribute>
-            <dia:attribute name="font">
-              <dia:font family="sans" style="0" name="Helvetica"/>
-            </dia:attribute>
-            <dia:attribute name="height">
-              <dia:real val="0.49388889176727813"/>
-            </dia:attribute>
-            <dia:attribute name="pos">
-              <dia:point val="10.3326,78.9579"/>
-            </dia:attribute>
-            <dia:attribute name="color">
-              <dia:color val="#000000"/>
-            </dia:attribute>
-            <dia:attribute name="alignment">
-              <dia:enum val="1"/>
-            </dia:attribute>
-          </dia:composite>
-        </dia:attribute>
-        <dia:attribute name="flip_horizontal">
-          <dia:boolean val="false"/>
-        </dia:attribute>
-        <dia:attribute name="flip_vertical">
-          <dia:boolean val="false"/>
-        </dia:attribute>
-        <dia:attribute name="subscale">
-          <dia:real val="1"/>
-        </dia:attribute>
-      </dia:object>
-      <dia:object type="BPMN - Task" version="1" id="O70">
-        <dia:attribute name="obj_pos">
-          <dia:point val="11.6997,78.4014"/>
-        </dia:attribute>
-        <dia:attribute name="obj_bb">
-          <dia:rectangle val="11.6497,78.3514;13.2903,79.3175"/>
-        </dia:attribute>
-        <dia:attribute name="meta">
-          <dia:composite type="dict"/>
-        </dia:attribute>
-        <dia:attribute name="elem_corner">
-          <dia:point val="11.6997,78.4014"/>
-        </dia:attribute>
-        <dia:attribute name="elem_width">
-          <dia:real val="1.5405882368718877"/>
-        </dia:attribute>
-        <dia:attribute name="elem_height">
-          <dia:real val="0.86606061082624797"/>
-        </dia:attribute>
-        <dia:attribute name="line_width">
-          <dia:real val="0.10000000149011612"/>
-        </dia:attribute>
-        <dia:attribute name="line_colour">
-          <dia:color val="#000000"/>
-        </dia:attribute>
-        <dia:attribute name="fill_colour">
-          <dia:color val="#bbbbee"/>
-        </dia:attribute>
-        <dia:attribute name="show_background">
-          <dia:boolean val="true"/>
-        </dia:attribute>
-        <dia:attribute name="line_style">
-          <dia:enum val="0"/>
-          <dia:real val="1"/>
-        </dia:attribute>
-        <dia:attribute name="padding">
-          <dia:real val="0.10000000000000001"/>
-        </dia:attribute>
-        <dia:attribute name="text">
-          <dia:composite type="text">
-            <dia:attribute name="string">
-              <dia:string>#writer#</dia:string>
-            </dia:attribute>
-            <dia:attribute name="font">
-              <dia:font family="sans" style="0" name="Helvetica"/>
-            </dia:attribute>
-            <dia:attribute name="height">
-              <dia:real val="0.49388889176727813"/>
-            </dia:attribute>
-            <dia:attribute name="pos">
-              <dia:point val="12.47,78.9579"/>
-            </dia:attribute>
-            <dia:attribute name="color">
-              <dia:color val="#000000"/>
-            </dia:attribute>
-            <dia:attribute name="alignment">
-              <dia:enum val="1"/>
-            </dia:attribute>
-          </dia:composite>
-        </dia:attribute>
-        <dia:attribute name="flip_horizontal">
-          <dia:boolean val="false"/>
-        </dia:attribute>
-        <dia:attribute name="flip_vertical">
-          <dia:boolean val="false"/>
-        </dia:attribute>
-        <dia:attribute name="subscale">
-          <dia:real val="1"/>
-        </dia:attribute>
-      </dia:object>
-      <dia:object type="BPMN - Task" version="1" id="O71">
-        <dia:attribute name="obj_pos">
-          <dia:point val="4.32709,79.7644"/>
-        </dia:attribute>
-        <dia:attribute name="obj_bb">
-          <dia:rectangle val="4.27709,79.7144;7.24386,80.6805"/>
-        </dia:attribute>
-        <dia:attribute name="meta">
-          <dia:composite type="dict"/>
-        </dia:attribute>
-        <dia:attribute name="elem_corner">
-          <dia:point val="4.32709,79.7644"/>
-        </dia:attribute>
-        <dia:attribute name="elem_width">
-          <dia:real val="2.8667647074601228"/>
-        </dia:attribute>
-        <dia:attribute name="elem_height">
-          <dia:real val="0.86606061082624586"/>
-        </dia:attribute>
-        <dia:attribute name="line_width">
-          <dia:real val="0.10000000149011612"/>
-        </dia:attribute>
-        <dia:attribute name="line_colour">
-          <dia:color val="#000000"/>
-        </dia:attribute>
-        <dia:attribute name="fill_colour">
-          <dia:color val="#888888"/>
-        </dia:attribute>
-        <dia:attribute name="show_background">
-          <dia:boolean val="true"/>
-        </dia:attribute>
-        <dia:attribute name="line_style">
-          <dia:enum val="0"/>
-          <dia:real val="1"/>
-        </dia:attribute>
-        <dia:attribute name="padding">
-          <dia:real val="0.10000000000000001"/>
-        </dia:attribute>
-        <dia:attribute name="text">
-          <dia:composite type="text">
-            <dia:attribute name="string">
-              <dia:string>#para_audioc#</dia:string>
-            </dia:attribute>
-            <dia:attribute name="font">
-              <dia:font family="sans" style="0" name="Helvetica"/>
-            </dia:attribute>
-            <dia:attribute name="height">
-              <dia:real val="0.49388889176727813"/>
-            </dia:attribute>
-            <dia:attribute name="pos">
-              <dia:point val="5.76047,80.3209"/>
-            </dia:attribute>
-            <dia:attribute name="color">
-              <dia:color val="#000000"/>
-            </dia:attribute>
-            <dia:attribute name="alignment">
-              <dia:enum val="1"/>
-            </dia:attribute>
-          </dia:composite>
-        </dia:attribute>
-        <dia:attribute name="flip_horizontal">
-          <dia:boolean val="false"/>
-        </dia:attribute>
-        <dia:attribute name="flip_vertical">
-          <dia:boolean val="false"/>
-        </dia:attribute>
-        <dia:attribute name="subscale">
-          <dia:real val="1"/>
-        </dia:attribute>
-      </dia:object>
-      <dia:object type="Standard - ZigZagLine" version="1" id="O72">
-        <dia:attribute name="obj_pos">
-          <dia:point val="7.11362,74.848"/>
-        </dia:attribute>
-        <dia:attribute name="obj_bb">
-          <dia:rectangle val="7.06362,74.798;8.17049,76.3516"/>
-        </dia:attribute>
-        <dia:attribute name="orth_points">
-          <dia:point val="7.11362,74.848"/>
-          <dia:point val="8.12049,74.848"/>
-          <dia:point val="8.12049,76.3016"/>
-        </dia:attribute>
-        <dia:attribute name="orth_orient">
-          <dia:enum val="0"/>
-          <dia:enum val="1"/>
-        </dia:attribute>
-        <dia:attribute name="autorouting">
-          <dia:boolean val="true"/>
-        </dia:attribute>
-        <dia:attribute name="line_color">
-          <dia:color val="#888888"/>
-        </dia:attribute>
-        <dia:attribute name="line_width">
-          <dia:real val="0.10000000149011612"/>
-        </dia:attribute>
-        <dia:connections>
-          <dia:connection handle="0" to="O66" connection="5"/>
-          <dia:connection handle="1" to="O67" connection="11"/>
-        </dia:connections>
-      </dia:object>
-      <dia:object type="Standard - ZigZagLine" version="1" id="O73">
-        <dia:attribute name="obj_pos">
-          <dia:point val="4.31303,74.848"/>
-        </dia:attribute>
-        <dia:attribute name="obj_bb">
-          <dia:rectangle val="3.26303,73.798;4.36303,76.3323"/>
-        </dia:attribute>
-        <dia:attribute name="orth_points">
-          <dia:point val="4.31303,74.848"/>
-          <dia:point val="3.31303,74.848"/>
-          <dia:point val="3.31303,73.848"/>
-          <dia:point val="3.35254,73.848"/>
-          <dia:point val="3.35254,76.2823"/>
-        </dia:attribute>
-        <dia:attribute name="orth_orient">
-          <dia:enum val="0"/>
-          <dia:enum val="1"/>
-          <dia:enum val="0"/>
-          <dia:enum val="1"/>
-        </dia:attribute>
-        <dia:attribute name="autorouting">
-          <dia:boolean val="true"/>
-        </dia:attribute>
-        <dia:attribute name="line_color">
-          <dia:color val="#888888"/>
-        </dia:attribute>
-        <dia:attribute name="line_width">
-          <dia:real val="0.10000000149011612"/>
-        </dia:attribute>
-        <dia:connections>
-          <dia:connection handle="0" to="O66" connection="8"/>
-          <dia:connection handle="1" to="O64" connection="11"/>
-        </dia:connections>
-      </dia:object>
-      <dia:object type="Standard - ZigZagLine" version="1" id="O74">
-        <dia:attribute name="obj_pos">
-          <dia:point val="3.35254,77.1868"/>
-        </dia:attribute>
-        <dia:attribute name="obj_bb">
-          <dia:rectangle val="3.30254,77.1368;4.47569,78.3771"/>
-        </dia:attribute>
-        <dia:attribute name="orth_points">
-          <dia:point val="3.35254,77.1868"/>
-          <dia:point val="3.35254,78.3271"/>
-          <dia:point val="4.42569,78.3271"/>
-        </dia:attribute>
-        <dia:attribute name="orth_orient">
-          <dia:enum val="1"/>
-          <dia:enum val="0"/>
-        </dia:attribute>
-        <dia:attribute name="autorouting">
-          <dia:boolean val="true"/>
-        </dia:attribute>
-        <dia:attribute name="line_width">
-          <dia:real val="0.10000000149011612"/>
-        </dia:attribute>
-        <dia:connections>
-          <dia:connection handle="0" to="O64" connection="2"/>
-          <dia:connection handle="1" to="O63" connection="8"/>
-        </dia:connections>
-      </dia:object>
-      <dia:object type="Standard - ZigZagLine" version="1" id="O75">
-        <dia:attribute name="obj_pos">
-          <dia:point val="7.10716,78.3271"/>
-        </dia:attribute>
-        <dia:attribute name="obj_bb">
-          <dia:rectangle val="7.05716,77.1177;8.17049,78.3771"/>
-        </dia:attribute>
-        <dia:attribute name="orth_points">
-          <dia:point val="7.10716,78.3271"/>
-          <dia:point val="8.12049,78.3271"/>
-          <dia:point val="8.12049,77.1677"/>
-        </dia:attribute>
-        <dia:attribute name="orth_orient">
-          <dia:enum val="0"/>
-          <dia:enum val="1"/>
-        </dia:attribute>
-        <dia:attribute name="autorouting">
-          <dia:boolean val="true"/>
-        </dia:attribute>
-        <dia:attribute name="line_width">
-          <dia:real val="0.10000000149011612"/>
-        </dia:attribute>
-        <dia:connections>
-          <dia:connection handle="0" to="O63" connection="5"/>
-          <dia:connection handle="1" to="O67" connection="2"/>
-        </dia:connections>
-      </dia:object>
-      <dia:object type="Standard - Line" version="0" id="O76">
-        <dia:attribute name="obj_pos">
-          <dia:point val="5.76643,78.7793"/>
-        </dia:attribute>
-        <dia:attribute name="obj_bb">
-          <dia:rectangle val="5.71017,78.729;5.81673,79.8147"/>
-        </dia:attribute>
-        <dia:attribute name="conn_endpoints">
-          <dia:point val="5.76643,78.7793"/>
-          <dia:point val="5.76047,79.7644"/>
-        </dia:attribute>
-        <dia:attribute name="numcp">
-          <dia:int val="1"/>
-        </dia:attribute>
-        <dia:attribute name="line_width">
-          <dia:real val="0.10000000149011612"/>
-        </dia:attribute>
-        <dia:connections>
-          <dia:connection handle="0" to="O63" connection="2"/>
-          <dia:connection handle="1" to="O71" connection="11"/>
-        </dia:connections>
-      </dia:object>
-      <dia:object type="Standard - Line" version="0" id="O77">
-        <dia:attribute name="obj_pos">
-          <dia:point val="9.02049,76.7346"/>
-        </dia:attribute>
-        <dia:attribute name="obj_bb">
-          <dia:rectangle val="8.97049,76.6846;9.71808,76.7846"/>
-        </dia:attribute>
-        <dia:attribute name="conn_endpoints">
-          <dia:point val="9.02049,76.7346"/>
-          <dia:point val="9.66808,76.7346"/>
-        </dia:attribute>
-        <dia:attribute name="numcp">
-          <dia:int val="1"/>
-        </dia:attribute>
-        <dia:attribute name="line_width">
-          <dia:real val="0.10000000149011612"/>
-        </dia:attribute>
-        <dia:connections>
-          <dia:connection handle="0" to="O67" connection="5"/>
-          <dia:connection handle="1" to="O68" connection="8"/>
-        </dia:connections>
-      </dia:object>
-      <dia:object type="Standard - Line" version="0" id="O78">
-        <dia:attribute name="obj_pos">
-          <dia:point val="10.3431,77.1677"/>
-        </dia:attribute>
-        <dia:attribute name="obj_bb">
-          <dia:rectangle val="10.2822,77.1173;10.3935,78.4518"/>
-        </dia:attribute>
-        <dia:attribute name="conn_endpoints">
-          <dia:point val="10.3431,77.1677"/>
-          <dia:point val="10.3326,78.4014"/>
-        </dia:attribute>
-        <dia:attribute name="numcp">
-          <dia:int val="1"/>
-        </dia:attribute>
-        <dia:attribute name="line_width">
-          <dia:real val="0.10000000149011612"/>
-        </dia:attribute>
-        <dia:connections>
-          <dia:connection handle="0" to="O68" connection="2"/>
-          <dia:connection handle="1" to="O69" connection="11"/>
-        </dia:connections>
-      </dia:object>
-      <dia:object type="Standard - Line" version="0" id="O79">
-        <dia:attribute name="obj_pos">
-          <dia:point val="12.4706,77.7326"/>
-        </dia:attribute>
-        <dia:attribute name="obj_bb">
-          <dia:rectangle val="12.42,77.6826;12.5206,78.4514"/>
-        </dia:attribute>
-        <dia:attribute name="conn_endpoints">
-          <dia:point val="12.4706,77.7326"/>
-          <dia:point val="12.47,78.4014"/>
-        </dia:attribute>
-        <dia:attribute name="numcp">
-          <dia:int val="1"/>
-        </dia:attribute>
-        <dia:attribute name="line_width">
-          <dia:real val="0.10000000149011612"/>
-        </dia:attribute>
-        <dia:connections>
-          <dia:connection handle="0" to="O65" connection="2"/>
-          <dia:connection handle="1" to="O70" connection="11"/>
-        </dia:connections>
-      </dia:object>
-      <dia:object type="Standard - Line" version="0" id="O80">
-        <dia:attribute name="obj_pos">
-          <dia:point val="11.0658,78.8344"/>
-        </dia:attribute>
-        <dia:attribute name="obj_bb">
-          <dia:rectangle val="11.0158,78.7844;11.849,78.8844"/>
-        </dia:attribute>
-        <dia:attribute name="conn_endpoints">
-          <dia:point val="11.0658,78.8344"/>
-          <dia:point val="11.799,78.8344"/>
-        </dia:attribute>
-        <dia:attribute name="numcp">
-          <dia:int val="1"/>
-        </dia:attribute>
-        <dia:attribute name="line_width">
-          <dia:real val="0.10000000149011612"/>
-        </dia:attribute>
-        <dia:connections>
-          <dia:connection handle="0" to="O69" connection="5"/>
-          <dia:connection handle="1" to="O70" connection="8"/>
-        </dia:connections>
-      </dia:object>
-    </dia:group>
-  </dia:layer>
-</dia:diagram>
index 9e8b59c..d6d690a 100644 (file)
@@ -5,12 +5,6 @@
 <h2> General information </h2>
 
 <ul>
-       <li> <a href="overview.pdf">overview.pdf</a>,
-
-               a pdf file containing a sketch which illustrates how
-               the pieces of paraslash work together.
-
-       </li>
        <li> <a href="manual.html">user manual</a>,
                Installation, Configuration and Usage.
        </li>
index 5216c6b..96d724c 100644 (file)
@@ -12,81 +12,143 @@ paraslash executable.
 Introduction
 ============
 
-In this chapter we give an [overview](#Overview) of the interactions of
-the two main programs contained in the paraslash package, followed by
+In this chapter we give an [overview](#Overview) of the interactions
+of the programs contained in the paraslash package, followed by
 [brief descriptions](#The.paraslash.executables) of all executables.
 
 Overview
 --------
 
 The core functionality of the para suite is provided by two main
-executables, para_server and para_audiod. The former maintains a
-database of audio files and streams these files to para_audiod which
-receives and plays the stream.
-
-In a typical setting, both para_server and para_audiod act as
-background daemons whose functionality is controlled by client
-programs: the para_audioc client controls para_audiod over a local
-socket while the para_client program connects to para_server over a
-local or remote networking connection.
-
-Typically, these two daemons run on different hosts but a local setup
-is also possible.
+applications, para_server and para_audiod. para_server maintains
+the audio file database and acts as the streaming source, while
+para_audiod is the streaming client. Usually, both run in the
+background on different hosts but a local setup is also possible.
 
 A simplified picture of a typical setup is as follows
 
-       server_host                                  client_host
-       ~~~~~~~~~~~                                  ~~~~~~~~~~~
 
-       +-----------+         audio stream           +-----------+
-       |para_server| -----------------------------> |para_audiod|
-       +-----------+                                +-----------+
-            ^                                            ^
-            |                                            |
-            |                                            | connect
-            |                                            |
-            |                                            |
-            |                                       +-----------+
-            |                                       |para_audioc|
-            |                                       +-----------+
-            |
-            |
-            |                  connect              +-----------+
-            +-------------------------------------- |para_client|
-                                                    +-----------+
+                                               .____________________.
+                                               |       ______       |
+       .-----------------------.               |    .d########b.    |
+       |.---------------------.|               |  .d############b   |
+       ||                     ||               | .d######""####//b. |
+       ||                     ||               | 9######(  )######P |
+       ||                     ||               | 'b######++######d' |
+       ||       Screen        ||               |  "9############P"  |
+       ||                     ||               |   "9a########P"    |
+       ||                     ||               |      `""""''       |
+       |`---------------------'|               |  ________________  |
+       `-----------------------'               | |________________| |
+             ___)     (___                     |____________________|
+             `-._______.-'                           loudspeaker
+                   |                                     |
+                   |                                     |
+                   |                                     |
+             .____/ \___.     ._____________.     ._____/ \_____.
+             |          |     |             |     |             |
+             | para_gui |-----| para_audioc |-----| para_audiod |
+             |____   ___|     |_____________|     |_____   _____|
+                  \ /                                   \ /
+                   |                                     |
+                   |                                     |
+                   |                                     |
+            ._____/ \_____.                       ._____/ \_____.
+            |             |                       |             |
+            | para_client |-----------------------| para_server |
+            |_____________|                       |_____   _____|
+                                                        \ /
+                                                         |
+                                                         |
+                                                     .-'"""`-.
+                                                    (         )
+                                                    |`-.___.-'|
+                                                    |         |
+                                                    |. ' " ` .|
+                                                    |         |
+                                                     `-.___.-'
+                                                      Database
+
+The two client programs, para_client and para_audioc communicate with
+para_server and para_audiod, respectively.
+
+para_gui controls para_server and para_audiod by executing para_client
+and para_audioc. In particular, it runs a command to obtain the state
+of para_audiod and para_server, and the metadata of the current audio
+file. This information is pretty-printed in a curses window.
+
 The paraslash executables
 -------------------------
 
-### para_server ###
+<h3> para_server </h3>
 
 para_server streams binary audio data (MP3, ...) over local and/or
 remote networks. It listens on a TCP port and accepts commands such
-as play, stop, pause, next from authenticated clients. There are
-many more commands though, see the man page of para_server for a
-description of all commands.
-
-It supports three built-in network streaming protocols
-(senders/receivers): HTTP, DCCP, or UDP. This is explained in more
-detail in the section on [networking](#Networking).
-
-The built-in audio file selector of paraslash is used to manage your
-audio files. It maintains statistics on the usage of all available
-audio files such as last-played time, and the number of times each
-file was selected.
-
-Additional information may be added to the database to allow
+as play, stop, pause, next from authenticated clients. The components
+of para_server are illustrated in the following diagram:
+
+       ______________________________________________________________________ network
+             |                                  |      |      |         |
+             |           .-'""""`-.             |      |      |         |
+             |          (          )            |      |      |         |
+       .____/ \_____.   |`-.____.-'|      .____/ \____/ \____/ \____.   |
+       |            |   |          |      |                         |   |
+       | dispatcher |   | database |      | senders (http/udp/dccp) |   |
+       |____   _____|   |          |      |___________   ___________|   |
+            \ /         |. ' "" ` .|                  \ /               |
+             |          |          |                   |                |
+             |           `-.____.-'                    |                |
+             |               |                         |                |
+             |               |                         |                |
+             |               |                         |                |
+             |        ._____/ \_____.        .________/ \________.      |
+             |        |             |        |                   |      |
+             |        | audio  file |________| virtual streaming |      |
+             |        |  selector   |        |      system       |      |
+             |        |_____   _____|        |________   ________|      |
+             |              \ /                       \ /               |
+             |               |                         |                |
+             |               |                         |                |
+             |               |   ._________________.   |                |
+             |               |   |                 |   |                |
+             |               `---| command handler |---'                |
+             |                   |____   ___   ____|                    |
+             |                        \ /   \ /                         |
+             |                         |     |                          |
+             |                         |     |                          |
+             |                         |     |                          |
+             `-------------------------'     `--------------------------'
+
+
+Incoming connections arrive at the dispatcher which creates a process
+dedicated to the connection. Its task is to authenticate the client
+and to run the command handler which forwards the client request to
+either the audio file selector or the virtual streaming system. Results
+(if any) are sent back to the client.
+
+The audio file selector manages audio files using various database
+tables. It maintains statistics on the usage of all audio files such as
+last-played time and the number of times each file was selected. It
+is also responsible for selecting and loading audio files for
+streaming. Additional information may be added to the database to allow
 fine-grained selection based on various properties of the audio file,
-including information found in (ID3) tags. However, old-fashioned
-playlists are also supported.
-
-It is also possible to store images (album covers) and lyrics in the
-database and associate these to the corresponding audio files.
-
+including information found in (ID3) tags. Simple playlists are also
+supported. It is possible to store images (album covers) and lyrics
+in the database and associate these to the corresponding audio files.
 The section on the [audio file selector](#The.audio.file.selector)
-discusses this topic.
+discusses this topic in more detail.
+
+Another component of para_server is the virtual streaming system,
+which controls the paraslash senders. During streaming it requests
+small chunks of data (e.g., mp3 frames) from the audio file selector
+and feeds them to the senders which forward the chunks to connected
+clients.
 
+The three senders of para_server correspond to network streaming
+protocols based on HTTP, DCCP, or UDP. This is explained in the
+section on [networking](#Networking).
 
-### para_client ###
+<h3> para_client </h3>
 
 The client program to connect to para_server. paraslash commands
 are sent to para_server and the response is dumped to STDOUT. This
@@ -101,29 +163,67 @@ If para_client is started without non-option arguments, an interactive
 session (shell) is started. Command history and command completion are
 supported through libreadline.
 
-### para_audiod ###
-
-The local daemon that collects information from para_server.
-
-It runs on the client side and connects to para_server. As soon as
-para_server announces the availability of an audio stream, para_audiod
-starts an appropriate receiver, any number of filters and a paraslash
-writer to play the stream.
-
-Moreover, para_audiod listens on a local socket and sends status
-information about para_server and para_audiod to local clients on
-request. Access via this local socket may be restricted by using Unix
-socket credentials, if available.
-
-
-### para_audioc ###
+<h3> para_audiod </h3>
+
+The purpose of para_audiod is to download, decode and play an audio
+stream received from para_server. A typical setup looks as follows.
+
+
+              .----------------------------.
+              |                            |
+              |                            |
+       ._____/ \_____.                .___/ \____.
+       |             |     .----------|          |
+       | para_server |     |   .______| receiver |
+       |_____    ____|     |   |      |___   ____|
+             \ /           |   |          \ /
+              |            |   |           |
+              |            |   |           |
+              |            |   |           |
+       ._____/ \_____.     |   |      .___/ \____.
+       |             |     |   |      |          |
+       | status task |-----+   |      | filter 1 |
+       |_____________|         |      |___   ____|
+                               |          \ /
+                               |           |            .____________________.
+                               |           |            |       ______       |
+       .____________.          |      .___/ \____.      |    .d########b.    |
+       |            |          |      |          |      |  .d############b   |
+       | dispatcher |----------'      | filter 2 |      | .d######""####//b. |
+       |_____   ____|                 |___   ____|      | 9######(  )######P |
+             \ /                          \ /           | 'b######++######d' |
+              |                            |            |  "9############P"  |
+              |                            |            |   "9a########P"    |
+       ._____/ \_____.                .___/ \____.      |      `""""''       |
+       |             |                |          |      |  ________________  |
+       | para_audioc |                |  writer  |------| |________________| |
+       |_____________|                |__________|      |____________________|
+
+
+The status task of para_audiod connects to para_server and runs the
+"stat" command to retrieve the current server status. If an audio
+stream is available, para_audiod starts a so-called buffer tree to
+play the stream.
+
+The buffer tree consists of a receiver, any number of filters and a
+writer. The receiver downloads the audio stream from para_server and
+the filters decode or modify the received data. The writer plays the
+decoded stream.
+
+The dispatcher of para_audiod listens on a local socket and runs
+audiod commands on behalf of para_audioc. For example, para_gui runs
+para_audioc to obtain status information about para_audiod and the
+current audio file. Access to the local socket may be restricted by
+means of Unix socket credentials.
+
+<h3> para_audioc </h3>
 
 The client program which talks to para_audiod. Used to control
 para_audiod, to receive status info, or to grab the stream at any
 point of the decoding process. Like para_client, para_audioc supports
 interactive sessions on systems with libreadline.
 
-### para_recv ###
+<h3> para_recv </h3>
 
 A command line HTTP/DCCP/UDP stream grabber. The http mode is
 compatible with arbitrary HTTP streaming sources (e.g. icecast).
@@ -134,7 +234,7 @@ optionally 'just in time'. This allows to cut an audio file without
 first decoding it, and it enables third-party software which is unaware
 of the particular audio format to send complete frames in real time.
 
-### para_filter ###
+<h3> para_filter </h3>
 
 A filter program that reads from STDIN and writes to STDOUT.
 Like para_recv, this is an atomic building block which can be used to
@@ -143,30 +243,33 @@ different functionalities in one tool: decoders for multiple audio
 formats and a number of processing filters, among these a normalizer
 for audio volume.
 
-### para_afh ###
+<h3> para_afh </h3>
 
 A small stand-alone program that prints tech info about the given
 audio file to STDOUT. It can be instructed to print a "chunk table",
 an array of offsets within the audio file.
 
-### para_write ###
+<h3> para_write </h3>
 
 A modular audio stream writer. It supports a simple file writer
 output plug-in and optional WAV/raw players for ALSA (Linux) and OSS.
 para_write can also be used as a stand-alone WAV or raw audio player.
 
-### para_play ###
+<h3> para_play </h3>
 
-A command line audio player.
+A command line audio player which supports the same audio formats as
+para_server. It differs from other players in that it has an insert
+and a command mode, like the vi editor. Line editing is based on
+libreadline, and tab completion and command history are supported.
 
-### para_gui ###
+<h3> para_gui </h3>
 
 Curses-based gui that presents status information obtained in a curses
 window. Appearance can be customized via themes. para_gui provides
 key-bindings for the most common server commands and new key-bindings
 can be added easily.
 
-### para_mixer ###
+<h3> para_mixer </h3>
 
 An alarm clock and volume-fader for OSS and ALSA.
 
@@ -182,8 +285,10 @@ source code and the steps that have to be performed in order to
 
 Requirements
 ------------
-### For the impatient ###
+<h3> For the impatient </h3>
 
+       git clone git://git.tuebingen.mpg.de/lopsub
+       cd lopsub && make && sudo make install
        git clone git://git.tuebingen.mpg.de/osl
        cd osl && make && sudo make install && sudo ldconfig
        sudo apt-get install autoconf libssl-dev m4 \
@@ -192,16 +297,10 @@ Requirements
               libasound2-dev libao-dev libreadline-dev libncurses-dev \
               libopus-dev
 
-### Detailed description ###
+<h3> Detailed description </h3>
 
 In any case you will need
 
-- [libosl](http://people.tuebingen.mpg.de/maan/osl/). The _object
-storage layer_ library is used by para_server. To clone the source
-code repository, execute
-
-               git clone git://git.tuebingen.mpg.de/osl
-
 - [lopsub](http://people.tuebingen.mpg.de/maan/lopsub/). The long
 option parser for subcommands generates the command line and config
 file parsers for all paraslash executables. Clone the source code
@@ -225,6 +324,12 @@ from templates by the m4 macro processor.
 
 Optional:
 
+- [libosl](http://people.tuebingen.mpg.de/maan/osl/). The _object
+storage layer_ library is used by para_server. To clone the source
+code repository, execute
+
+               git clone git://git.tuebingen.mpg.de/osl
+
 - [openssl](http://www.openssl.org/) or
 [libgcrypt](ftp://ftp.gnupg.org/gcrypt/libgcrypt/).  At least one
 of these two libraries is needed as the backend for cryptographic
@@ -311,7 +416,7 @@ to install executables under /usr/local/bin and the man pages under
 Configuration
 -------------
 
-### Create a paraslash user ###
+<h3> Create a paraslash user </h3>
 
 In order to control para_server at runtime you must create a paraslash
 user. As authentication is based on the RSA crypto system you'll have
@@ -355,7 +460,7 @@ Finally, tell para_client to connect to server_host:
        echo 'hostname server_host' > $conf
 
 
-### Start para_server ###
+<h3> Start para_server </h3>
 
 For this first try, we'll use the info loglevel to make the output
 of para_server more verbose.
@@ -371,7 +476,7 @@ commands. Open a new shell as bar@client_host and try
 to retrieve the list of available commands and some server info.
 Don't proceed if this doesn't work.
 
-### Create and populate the database ###
+<h3> Create and populate the database </h3>
 
 An empty database is created with
 
@@ -399,7 +504,7 @@ You may print the list of all known audio files with
 
        para_client ls
 
-### Configure para_audiod ###
+<h3> Configure para_audiod </h3>
 
 We will have to tell para_audiod that it should receive the audio
 stream from server_host via http:
@@ -420,14 +525,6 @@ in which order.
 Troubleshooting
 ---------------
 
-If you receive a socket related error on server or audiod startup,
-make sure you have write permissions to the /var/paraslash directory:
-
-       sudo chown $LOGNAME /var/paraslash
-
-Alternatively, use the --afs-socket (para_server) or --socket
-(para_audiod) option to specify a different socket pathname.
-
 To identify streaming problems try to receive, decode and play the
 stream manually using para_recv, para_filter and para_write as follows.
 For simplicity we assume that you're running Linux/ALSA and that only
@@ -569,8 +666,7 @@ execute. The output of
 
        para_client help
 
-contains in the third column the permissions needed to execute the
-command.
+contains the permissions needed to execute the command.
 
 It is possible to make para_server reread the user_list file by
 executing the paraslash "hup" command or by sending SIGHUP to the
@@ -596,27 +692,21 @@ The audio file selector
 paraslash comes with a sophisticated audio file selector (AFS),
 whose main task is to determine which file to stream next, based on
 information on the audio files stored in a database. It communicates
-also with para_client whenever an AFS command is executed, for example
-to answer a database query.
+also with para_client via the command handler whenever an AFS command
+is executed, for example to answer a database query.
 
-Besides the traditional playlists, AFS supports audio file selection
+Besides the simple playlists, AFS supports audio file selection
 based on _moods_ which act as a filter that limits the set of all
-known audio files to those which satisfy certain criteria.  It also
+known audio files to those which satisfy certain criteria. It also
 maintains tables containing images (e.g. album cover art) and lyrics
 that can be associated with one or more audio files.
 
-AFS employs [libosl](http://people.tuebingen.mpg.de/maan/osl/), the
-object storage layer library, as the backend library for storing
-information on audio files, playlists, etc. This library offers
-functionality similar to a relational database, but is much more
-lightweight than a full database backend.
-
 In this chapter we sketch the setup of the [AFS
 process](#The.AFS.process) during server startup and proceed with the
 description of the [layout](#Database.layout) of the various database
 tables. The section on [playlists and moods](#Playlists.and.moods)
 explains these two audio file selection mechanisms in detail
-and contains pratical examples. The way [file renames and content
+and contains practical examples. The way [file renames and content
 changes](#File.renames.and.content.changes) are detected is discussed
 briefly before the [Troubleshooting](#Troubleshooting) section
 concludes the chapter.
@@ -625,25 +715,85 @@ The AFS process
 ---------------
 
 On startup, para_server forks to create the AFS process which opens
-the OSL database tables. The server process communicates with the
-AFS process via pipes and shared memory. Usually, the AFS process
-awakes only briefly whenever the current audio file changes. The AFS
-process determines the next audio file, opens it, verifies it has
-not been changed since it was added to the database and passes the
-open file descriptor to the server process, along with audio file
-meta-data such as file name, duration, audio format and so on. The
-server process then starts to stream the audio file.
-
-The AFS process also accepts connections from local clients via
-a well-known socket. However, only child processes of para_server
-may connect through this socket. All server commands that have the
-AFS_READ or AFS_WRITE permission bits use this mechanism to query or
-change the database.
+the database tables. The AFS process accepts incoming connections
+which arrive either on a pipe which is shared with para_server,
+or on the local socket it is listening on. The setup is as follows.
+
+                 .___________________.  .______________.
+                 |                   |  |              |
+                 | virtual streaming |  | audio format |
+                 |      system       |  |   handler    |
+                 |_________   _______|  |_____   ______|
+                           \ /                \ /
+                            |                  |
+         .-'""""`-.         |                  |          .-'""""`-.
+        (          )        |                  |         (          )
+        |`-.____.-'|    .__/ \________________/ \___.    |`-.____.-'|
+        |          |    |                           |    |          |
+        |   file   |----| AFS (audio file selector) |----|    OSL   |
+        |  system  |    |         process           |    | database |
+        |          |    |___________________________|    |          |
+        |. ' "" ` .|                 |                   |. ' "" ` .|
+        |          |                 |                   |          |
+         `-.____.-'                  |                    `-.____.-'
+                            ._______/ \_______.
+                            |                 |
+                            | command handler |
+                            |_______   _______|
+                                    \ /
+                                     |
+                                     |
+                                     |
+                              ._____/ \_____.
+                              |             |
+                              | para_client |
+                              |_____________|
+
+The virtual streaming system, which is part of the server process,
+communicates with the AFS process via pipes and shared memory. When
+the current audio file changes, it sends a notification through the
+shared pipe. The AFS process queries the database to determine the
+next audio file, opens it, verifies that it has not been changed since
+it was added to the database and passes the open file descriptor back
+to the virtual streaming system, along with audio file meta-data such
+as file name, duration, audio format and so on. The virtual streaming
+system then starts to stream the file.
+
+The command handlers of all AFS server commands use the local socket
+to query or update the database. For example, the command handler of
+the add command sends the path of an audio file to the local socket.
+The AFS process opens the file and tries to find an audio format
+handler which recognizes the file. If all goes well, a new database
+entry with metadata obtained from the audio format handler is added
+to the database.
+
+Note that AFS employs
+[libosl](http://people.tuebingen.mpg.de/maan/osl/), the object
+storage layer library, as the database backend. This library offers
+functionality similar to a relational database, but is much more
+lightweight than a full featured database management system.
 
 Database layout
 ---------------
 
-### The audio file table ###
+Metadata about the known audio files is stored in an OSL database. This
+database consists of the following tables:
+
+- The audio file table contains path, hash and metadata of each
+known file.
+
+- The "attributes" table maps each of the 64 possible attributes to a
+string.
+
+- The "blob" tables store images, lyrics, moods, playlists. All of
+these are optional.
+
+- The "score" table describes the subset of admissible files for the
+current playlist or mood.
+
+All tables are described in more detail below.
+
+<h3> The audio file table </h3>
 
 This is the most important and usually also the largest table of the
 AFS database. It contains the information needed to stream each audio
@@ -692,7 +842,7 @@ directory. In the latter case, the directory is traversed recursively
 and all files which are recognized as valid audio files are added to
 the database.
 
-### The attribute table ###
+<h3> The attribute table </h3>
 
 The attribute table contains two columns, _name_ and _bitnum_. An
 attribute is simply a name for a certain bit number in the attribute
@@ -752,7 +902,7 @@ Read the output of
 for more information and a complete list of command line options to
 these commands.
 
-### Blob tables ###
+<h3> Blob tables </h3>
 
 The image, lyrics, moods and playlists tables are all blob tables.
 Blob tables consist of three columns each: The identifier which is
@@ -779,7 +929,7 @@ Note that the images and lyrics are not interpreted at all, and also
 the playlist and the mood blobs are only investigated when the mood
 or playlist is activated with the select command.
 
-### The score table ###
+<h3> The score table </h3>
 
 The score table describes those audio files which are admissible for
 the current mood or playlist (see below). The table has two columns:
@@ -805,7 +955,7 @@ terms of attributes and other type of information available in the
 audio file table. As an example, a mood can define a filename pattern,
 which is then matched against the names of audio files in the table.
 
-### Playlists ###
+<h3> Playlists </h3>
 
 Playlists are accommodated in the playlist table of the afs database,
 using the aforementioned blob format for tables. A new playlist is
@@ -824,7 +974,7 @@ in descending order so that files will be selected in order. If a
 file could not be opened for streaming, its entry is removed from
 the score table (but not from the playlist).
 
-### Moods ###
+<h3> Moods </h3>
 
 A mood consists of a unique name and its *mood definition*, which is
 a set of *mood lines* containing expressions in terms of attributes
@@ -899,7 +1049,7 @@ special treatment:
 
 
 
-### List of mood_methods ###
+<h3> List of mood_methods </h3>
 
        no_attributes_set
 
@@ -945,7 +1095,7 @@ if the year tag is a two-digit number. In this case either 1900 or
 greater than 2000 plus the current year.
 
 
-### Mood usage ###
+<h3> Mood usage </h3>
 
 To create a new mood called "my_mood", write its definition into
 some temporary file, say "tmpfile", and add it to the mood table
@@ -973,7 +1123,7 @@ if the "-a" switch is given:
        para ls -a
 
 
-### Example mood definition ###
+<h3> Example mood definition </h3>
 
 Suppose you have defined attributes "punk" and "rock" and want to define
 a mood containing only Punk-Rock songs. That is, an audio file should be
@@ -1062,7 +1212,7 @@ Audio formats
 
 The following audio formats are supported by paraslash:
 
-### MP3 ###
+<h3> MP3 </h3>
 
 Mp3, MPEG-1 Audio Layer 3, is a common audio format for audio storage,
 designed as part of its MPEG-1 standard.  An MP3 file is made up of
@@ -1072,7 +1222,7 @@ of channels. For a typical CD-audio file (sample rate of 44.1 kHz
 stereo), encoded with a bit rate of 128 kbit, an MP3 frame is about
 400 bytes large.
 
-### OGG/Vorbis ###
+<h3> OGG/Vorbis </h3>
 
 OGG is a standardized audio container format, while Vorbis is an
 open source codec for lossy audio compression. Since Vorbis is most
@@ -1082,7 +1232,7 @@ chunks called OGG pages. A typical OGG page is about 4KB large. The
 Vorbis codec creates variable-bitrate (VBR) data, where the bitrate
 may vary considerably.
 
-### OGG/Speex ###
+<h3> OGG/Speex </h3>
 
 Speex is an open-source speech codec that is based on CELP (Code
 Excited Linear Prediction) coding. It is designed for voice
@@ -1092,7 +1242,7 @@ supported. As for Vorbis audio, Speex bit-streams are often stored
 in OGG files. As of 2012 this codec is considered obsolete since the
 Oppus codec, described below, surpasses its performance in all areas.
 
-### OGG/Opus ###
+<h3> OGG/Opus </h3>
 
 Opus is a lossy audio compression format standardized through RFC
 6716 in 2012. It combines the speech-oriented SILK codec and the
@@ -1101,7 +1251,7 @@ OGG/Vorbis and OGG/Speex, Opus data is usually encapsulated in OGG
 containers. All known software patents which cover Opus are licensed
 under royalty-free terms.
 
-### AAC ###
+<h3> AAC </h3>
 
 Advanced Audio Coding (AAC) is a standardized, lossy compression
 and encoding scheme for digital audio which is the default audio
@@ -1109,7 +1259,7 @@ format for Apple's iPhone, iPod, iTunes. Usually MPEG-4 is used as
 the container format and audio files encoded with AAC have the .m4a
 extension. A typical AAC frame is about 700 bytes large.
 
-### WMA ###
+<h3> WMA </h3>
 
 Windows Media Audio (WMA) is an audio data compression technology
 developed by Microsoft. A WMA file is usually encapsulated in the
@@ -1118,7 +1268,7 @@ how meta data about the file is to be encoded. The bit stream of WMA
 is composed of superframes, each containing one or more frames of
 2048 samples. For 16 bit stereo a WMA superframe is about 8K large.
 
-### FLAC ###
+<h3> FLAC </h3>
 
 The Free Lossless Audio Codec (FLAC) compresses audio without quality
 loss. It gives better compression ratios than a general purpose
@@ -1583,7 +1733,7 @@ they are usually placed directly after the decoding filter. Each
 sample is multiplied with a scaling factor (>= 1) which makes amp
 and compress quite expensive in terms of computing power.
 
-### amp ###
+<h3> amp </h3>
 
 The amp filter amplifies the audio stream by a fixed scaling factor
 that must be known in advance. For para_audiod this factor is derived
@@ -1610,7 +1760,7 @@ To store V in the audio file table, the command
 is used. The reader is encouraged to write a script that performs
 these computations :)
 
-### compress ###
+<h3> compress </h3>
 
 Unlike the amplification filter, the compress filter adjusts the volume
 of the audio stream dynamically without prior knowledge about the peak
@@ -1831,12 +1981,14 @@ welcome. Here's a list of things you can do to help the project:
 - Compile and test on your favorite architecture or operating
   system. The code is tested only on a limited set of systems, so you
   will probably encounter problems when building on different systems.
-- Post about about paraslash on your blog or on social networks.
+- Post about paraslash on your blog or on social networks.
 - Build and maintain Debian/RPM packages for your favorite distribution.
 
 Note that there is no mailing list, no bug tracker and no discussion
 forum for paraslash. If you'd like to contribute, or have questions
 about contributing, send email to Andre Noll <maan@tuebingen.mpg.de>.
+New releases are announced by email. If you would like to receive
+these announcements, contact the author through the above address.
 
 Tools
 -----
@@ -2025,14 +2177,14 @@ Appendix
 Network protocols
 -----------------
 
-### IP ###
+<h3> IP </h3>
 
 The _Internet Protocol_ is the primary networking protocol used for
 the Internet. All protocols described below use IP as the underlying
 layer. Both the prevalent IPv4 and the next-generation IPv6 variant
 are being deployed actively worldwide.
 
-### Connection-oriented and connectionless protocols ###
+<h3> Connection-oriented and connectionless protocols </h3>
 
 Connectionless protocols differ from connection-oriented ones in
 that state associated with the sending/receiving endpoints is treated
@@ -2048,7 +2200,7 @@ up-to-date internal state of the connection also in general means
 that the sending endpoints perform congestion control, adapting to
 qualitative changes of the connection medium.
 
-### Reliability ###
+<h3> Reliability </h3>
 
 In IP networking, packets can be lost, duplicated, or delivered
 out of order, and different network protocols handle these
@@ -2060,7 +2212,7 @@ out-of-order. Retransmission is used to guarantee loss-free
 delivery. Unreliable protocols, in contrast, do not guarantee ordering
 or data integrity.
 
-### Classification ###
+<h3> Classification </h3>
 
 With these definitions the protocols which are used by paraslash for
 steaming audio data may be classified as follows.
@@ -2071,7 +2223,7 @@ steaming audio data may be classified as follows.
 
 Below we give a short descriptions of these protocols.
 
-### TCP ###
+<h3> TCP </h3>
 
 The _Transmission Control Protocol_ provides reliable, ordered delivery
 of a stream and a classic window-based congestion control. In contrast
@@ -2082,7 +2234,7 @@ extensively by many application layers. Besides HTTP (the Hypertext
 Transfer Protocol), also FTP (the File Transfer protocol), SMTP (Simple
 Mail Transfer Protocol), SSH (Secure Shell) all sit on top of TCP.
 
-### UDP ###
+<h3> UDP </h3>
 
 The _User Datagram Protocol_ is the simplest transport-layer protocol,
 built as a thin layer directly on top of IP. For this reason, it offers
@@ -2093,7 +2245,7 @@ means that there is no protection against packet loss or network
 congestion. Error checking and correction (if at all) are performed
 in the application.
 
-### DCCP ###
+<h3> DCCP </h3>
 
 The _Datagram Congestion Control Protocol_ combines the
 connection-oriented state maintenance known from TCP with the
@@ -2110,7 +2262,7 @@ the choice of congestion control: classic, window-based congestion
 control known from TCP is available as CCID-2, rate-based, "smooth"
 congestion control is offered as CCID-3.
 
-### HTTP ###
+<h3> HTTP </h3>
 
 The _Hypertext Transfer Protocol_ is an application layer protocol
 on top of TCP. It is spoken by web servers and is most often used
@@ -2120,7 +2272,7 @@ delivery of web pages only. Being a simple request/response based
 protocol, the semantics of the protocol also allow the delivery of
 multimedia content, such as audio over http.
 
-### Multicast ###
+<h3> Multicast </h3>
 
 IP multicast is not really a protocol but a technique for one-to-many
 communication over an IP network. The challenge is to deliver