#include <termios.h>
#include <sys/utsname.h>
#include <signal.h>

#ifdef BSD
#include <dev/speaker/speaker.h>
#include "bsd_bells.c"
#endif

static gint isalpha_ui(guint c);
static gint isdigit_ui(guint c);
static gint isprint_ui(guint c);
static gint isupper_ui(guint c);
static guint toupper_ui(guint c);
static void new_pen(gint ipen);
static gint kp_snooper(GtkWidget *widget, GdkEventKey *event,
                       gpointer da);
static void cursor_control(gpointer widget, gint iadd, gint cursor_type,
                           gint cursor_row, gint cursor_col,
                           gint cursor_fg, gint cursor_bg);
static void play_bells(int isound);
static void get_kb_time(void);
static void fill_kb_dt(void);
static gint idelta_time(const gchar *day1, const gchar *day2,
                        const gchar *time1, const gchar *time2);
static void concat(gchar *s1, const gchar *s2, gint is2, gint js2,
                   gint nullout_s1);
static gint kb_index(const gchar *s1, const gchar *s2);
static void add_eol_chars(gchar *line_out);
static void remove_eol_chars(gchar *line_out);
static void left_zero_pad(gchar *s1, gint ss1);
static void left_blank_pad(gchar *s1, gint ss1);
static void left_blank_unpad(gchar *s1);
static void right_blank_pad(gchar *s1, gint ss1);
static void right_blank_unpad(gchar *s1);
static void reassemble_field(gchar *s1);
static gint int_to_char(gint in, gchar *s1);
static gint int_to_comma(gint in, gchar *s1);
static gint real_to_char(gdouble rin, gchar *s1, gint ndp);
static gint nint(gdouble rin);
static gint inquire(const gchar *filnam);
static void set_keyer_port(gint set_kp);
static void make_cw_line(guint ikey);
static gint send_cw_line(gpointer widget);
static void process_cw_message(guint ikey, gpointer widget);
static gint get_cw_eom(gpointer widget);
static gint repeat_cw_message(gpointer widget);
static void stop_dvk_msg(void);
static void send_dvk_msg(guint ikey);
static void repeat_dvk_msg(void);
static gint delay_dvk_msg(gpointer data);
static void dvk_sound_play(gchar *filnam);
static gint get_running_pid(const gchar *filnam);

static gint isalpha_ui(guint c)
{
  gint cout=FALSE;

  if(c<256)
   cout = isalpha(c);
  return cout;
}

static gint isdigit_ui(guint c)
{
  gint cout=FALSE;

  if(c<256)
   cout = isdigit(c);
  return cout;
}

static gint isprint_ui(guint c)
{
  gint cout=FALSE;

  if(c<256)
   cout = isprint(c);
  return cout;
}

static gint isupper_ui(guint c)
{
  gint cout=FALSE;

  if(c<256)
   cout = isupper(c);
  return cout;
}

static guint toupper_ui(guint c)
{
  guint cout;

  if(c<256)
   cout = toupper(c);
  else
   cout = c;
  return cout;
}

static void new_pen(gint ipen)
{
  GdkColor color;
  static gint saved_color = -1;
  gint red[17] = {0,0,0,0,
                  43690,43690,43690,43690,
                  16383,0,0,0,
                  65535,65535,65535,65535,
                  21845};
  gint green[17] = {0,0,43690,43690,
                    0,0,21845,43690,
                    16383,0,65535,65535,
                    0,0,65535,65535,
                    21845};
  gint blue[17] = {0,43690,0,43690,
                   0,43690,0,43690,
                   16383,65535,0,65535,
                   0,65535,0,65535,
                   21845};

  if(ipen != saved_color)
   {
    color.red = red[ipen];
    color.green = green[ipen];
    color.blue = blue[ipen];
    gdk_gc_set_rgb_fg_color (gc, &color);
    saved_color = ipen;
   }
}

static gint kp_snooper(GtkWidget *widget, GdkEventKey *event,
                       gpointer da)
{
  if(event->keyval==65479) event->keyval=65482;
  return FALSE;
}

static void cursor_control(gpointer widget, gint iadd, gint cursor_type,
                           gint cursor_row, gint cursor_col,
                           gint cursor_fg, gint cursor_bg)
{
  if(iadd%2 && cursor_type)
   new_pen (cursor_fg);
  else
   new_pen (cursor_bg);
  pango_layout_set_text (layout, "_", 1);
  gdk_draw_layout (main_drawing_area->window,
                   gc,
                   (cursor_col-1)*wcol,
                   (cursor_row-1)*hrow+cursor_offset,
                   layout);
}

static void play_bells(int isound)
{
  if(fd_bells<0 || strcmp(set_screen_choices[3], "<YES>"))
   return;

#ifdef BSD
  bsd_play_bells (isound);
#else
  ioctl(fd_bells, _IO(KB_BELLS_IOCTL_BASE, isound));
#endif

}

static void get_kb_time(void)
{
  time_t tsec;
  int lday_array[12] = {31, 0, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};

  tsec = time(NULL);
  kb_time = *gmtime(&tsec);
  if(kb_time.tm_year%4)
   lday_array[1] = 28;
  else
   lday_array[1] = 29;
  kb_time.tm_hour += utc_offset;
  if(kb_time.tm_hour>23)
   {
    kb_time.tm_hour -= 24;
    kb_time.tm_wday++;
    if(kb_time.tm_wday>6)
     kb_time.tm_wday = 0;
    kb_time.tm_mday++;
    if(kb_time.tm_mday>lday_array[kb_time.tm_mon])
     {
      kb_time.tm_mday = 1;
      kb_time.tm_mon++;
      if(kb_time.tm_mon>11)
       {
        kb_time.tm_mon = 0;
        kb_time.tm_year++;
       }
     }
   }
  else if(kb_time.tm_hour<0)
   {
    kb_time.tm_hour += 24;
    kb_time.tm_wday--;
    if(kb_time.tm_wday<0)
     kb_time.tm_wday = 6;
    kb_time.tm_mday--;
    if(kb_time.tm_mday<1)
     {
      kb_time.tm_mon--;
      if(kb_time.tm_mon<0)
       {
        kb_time.tm_mon = 11;
        kb_time.tm_year--;
       }
      kb_time.tm_mday = lday_array[kb_time.tm_mon];
     }
   }
  if(kb_time.tm_mon==1 && kb_time.tm_mday==lday_array[1])
   {
    kb_time.tm_mday = 0;
    kb_time.tm_mon = 2;
   }
}

static void fill_kb_dt(void)
{
  strftime(kb_dt.date, sizeof(kb_dt.date), "%m%d%g", &kb_time);
  strftime(kb_dt.time, sizeof(kb_dt.time), "%H%M%S", &kb_time);
}

static gint idelta_time(const gchar *day1, const gchar *day2,
                        const gchar *time1, const gchar *time2)
{
  gint id1, id2, ih1, ih2, im1, im2, is1, is2, dsecs;
  gchar d1[3], d2[3], h1[3], h2[3], m1[3], m2[3], s1[3], s2[3];

  concat(d1, day1, 2, 3, COPY);
  concat(d2, day2, 2, 3, COPY);
  concat(h1, time1, 0, 1, COPY);
  concat(h2, time2, 0, 1, COPY);
  concat(m1, time1, 2, 3, COPY);
  concat(m2, time2, 2, 3, COPY);
  concat(s1, time1, 4, 5, COPY);
  concat(s2, time2, 4, 5, COPY);
  id1 = atoi(d1);
  id2 = atoi(d2);
  ih1 = atoi(h1);
  ih2 = atoi(h2);
  im1 = atoi(m1);
  im2 = atoi(m2);
  is1 = atoi(s1);
  is2 = atoi(s2);
  if(is2<is1)
   {
    is2 += 60;
    im2--;
   }
  if(im2<im1)
   {
    im2 += 60;
    ih2--;
   }
  if(ih2<ih1)
   {
    ih2 += 24;
    id2--;
   }
  dsecs = (id2-id1)*3600*24+(ih2-ih1)*3600+(im2-im1)*60+(is2-is1);
  return dsecs;
}

static void concat(gchar *s1, const gchar *s2, gint is2, gint js2,
                   gint nullout_s1)
{
  gint i;

  if(!nullout_s1) while(*s1) s1++;
  for(i=is2; i<=js2; i++)
   {
    *s1 = *(s2+i);
    s1++;
   }
  *s1 = '\0';
}

static gint kb_index(const gchar *s1, const gchar *s2)
{
  const gchar *p1, *p2;
  gint i;

  for(i=0; s1[i]; i++)
   {
    p1 = &s1[i];
    p2 = s2;
    while(*p2 && *p2==*p1)
     {
      p1++;
      p2++;
     }
    if(!*p2) return i;
   }
  return -1;
}

static void add_eol_chars(gchar *line_out)
{
  gint lcil;

  lcil = strlen(line_out);
  line_out[lcil] = '\r';
  line_out[lcil+1] = '\n';
  line_out[lcil+2] = '\0';
}

static void remove_eol_chars(gchar *line_out)
{
  gint i, lcil;

  lcil = strlen(line_out);
  for(i=0; i<2; i++)
   {
    lcil--;
    if(lcil>-1)
     if(line_out[lcil]=='\r' || line_out[lcil]=='\n')
      line_out[lcil] = '\0';
   }
}

static void left_zero_pad(gchar *s1, gint ss1)
{
  gint i, ls1, nblanks;

  ls1 = strlen(s1);
  nblanks = ss1-ls1-1;
  for(i=ls1; i>-1; i--)
   s1[i+nblanks] = s1[i];
  for(i=0; i<nblanks; i++)
   s1[i] = '0';
}

static void left_blank_pad(gchar *s1, gint ss1)
{
  gint i, ls1, nblanks;

  ls1 = strlen(s1);
  nblanks = ss1-ls1-1;
  for(i=ls1; i>-1; i--)
   s1[i+nblanks] = s1[i];
  for(i=0; i<nblanks; i++)
   s1[i] = ' ';
}

static void left_blank_unpad(gchar *s1)
{
  gchar s1_hold[81];
  gint i=0;

  while(s1[i]==' ') i++;
  concat(s1_hold, s1, i, strlen(s1)-1, COPY);
  strcpy(s1, s1_hold);
}

static void right_blank_pad(gchar *s1, gint ss1)
{
  gint i, ls1;

  ls1 = strlen(s1);
  for(i=ls1; i<ss1-1; i++)
   s1[i] = ' ';
  s1[ss1-1] = '\0';
}

static void right_blank_unpad(gchar *s1)
{
  gint i;

  i = strlen(s1)-1;
  if(i>-1)
   while(s1[i]==' ')
    {
     s1[i] = '\0';
     i--;
     if(i<0) break;
    }
}

static void reassemble_field(gchar *s1)
{
  gint i, ls1;
  gchar s1_hold[81];

  i = kb_index (s1, " ");
  if(i>-1)
   {
    ls1 = strlen(s1);
    if(i==ls1-1)
     right_blank_unpad (s1);
    else
     {
      concat(s1_hold, s1, i+1, ls1-1, COPY);
      concat(s1_hold, s1, 0, i-1, !COPY);
      strcpy(s1, s1_hold);      
     }
   }
}

static gint int_to_char(gint in, gchar *s1)
{
  gint i;
  gint nout=1;
  const gint ipten[10]={1, 10, 100, 1e3, 1e4, 1e5, 1e6, 1e7, 1e8, 1e9};

  while(in>ipten[nout]-1)
   nout++;
  for(i=nout; i>0; i--)
   s1[nout-i] = ((in%ipten[i])/ipten[i-1])+48;
  s1[nout] = '\0';
  return nout;
}

static gint int_to_comma(gint in, gchar *s1)
{
  gint nout;
  gchar s1_hold[12];

  nout = int_to_char (in, s1);
  if(nout>3)
   {
    strcpy(s1_hold, s1);
    if(nout<7)
     {
      concat(s1, s1_hold, 0, nout-4, COPY);
      strcat(s1, ",");
      concat(s1, s1_hold, nout-3, nout-1, !COPY);
      nout++;
     }
    else if(nout<10)
     {
      concat(s1, s1_hold, 0, nout-7, COPY);
      strcat(s1, ",");
      concat(s1, s1_hold, nout-6, nout-4, !COPY);
      strcat(s1, ",");
      concat(s1, s1_hold, nout-3, nout-1, !COPY);
      nout += 2;
     }
   }
  return nout;
}

static gint real_to_char(gdouble rin, gchar *s1, gint ndp)
{
  gint lod, rod, nl, nr, nout;
  gchar s1_hold[20];
  const gchar *zeros = "000000";
  const gint ipten[10]={1, 10, 100, 1e3, 1e4, 1e5, 1e6, 1e7, 1e8, 1e9};

  lod = (gint) rin;
  nl = int_to_char (lod, s1_hold);
  concat(s1, s1_hold, 0, nl-1, COPY);
  strcat(s1, ".");
  rod = (gint) ((rin-((gdouble) lod))*ipten[ndp]);
  nr = int_to_char (rod, s1_hold);
  if(nr<ndp)
   concat(s1, zeros, 0, ndp-nr-1, !COPY);
  concat(s1, s1_hold, 0, nr-1, !COPY);
  nout = nl+nr+1;
  return nout;
}

static gint nint(gdouble rin)
{
  gint nout;

  if(rin<0)
   nout = (gint) (rin-.5);
  else
   nout = (gint) (rin+.5);
  return nout;
}

static gint inquire(const gchar *filnam)
{
  FILE *fp;

  fp = fopen(filnam, "r");
  if(fp==NULL)
   return FALSE;
  else
   { 
    fclose(fp);
    return TRUE;
   }
}

static void set_keyer_port(gint set_kp)
{
  struct termios settings_keyer;
  static struct termios settings_save;
  gchar port_name[13];

  if(fp_keyer)
   {
    tcsetattr(fileno(fp_keyer), TCSADRAIN, &settings_save);
    fclose(fp_keyer);
    fp_keyer = NULL;
   }
  if(set_kp)
   {
    if(strcmp(init_screen_choices[16], "<OFF>"))
     {
      strcpy(port_name, "/dev/");
      concat(port_name, init_screen_choices[16],
             1, strlen(init_screen_choices[16])-2, !COPY);

#ifdef BSD
      fp_keyer = (fdopen(open(port_name, O_RDWR | O_NONBLOCK), "r+"));
#else
      fp_keyer = fopen(port_name, "r+");
#endif

      if(fp_keyer)
       { 
        printf("port %s opened\n", port_name);
        tcgetattr(fileno(fp_keyer), &settings_keyer);
        settings_save = settings_keyer;
        cfsetispeed(&settings_keyer, B2400);
        cfsetospeed(&settings_keyer, B2400);
        settings_keyer.c_cflag &= ~CSTOPB;

#ifdef BSD
        settings_keyer.c_cflag |= CLOCAL;
#endif

        settings_keyer.c_lflag |= ICANON;
        tcsetattr(fileno(fp_keyer), TCSANOW, &settings_keyer);
        printf("c_cflag = %d\n", settings_save.c_cflag);
        printf("c_cflag = %d\n", settings_keyer.c_cflag);
//file=termbits.h
//c_cflag=CLOCAL+HUPCL+CREAD+CS8+B2400
//3259   =2048  +1024 +128  +48 +11
       }
      else
       printf("cannot open port %s \n", port_name);
     }
   }
}

static void make_cw_line(guint ikey)
{
  gint ihat, ipnd, socwm1;
  gchar ksc_hold[63], qso_hold[5], call_hold[14];

  socwm1 = sizeof(cw_line)-1;
  if(ikey==65299)
   {
    ikey = atoi(set_screen_choices[5])+65469;
    if(ikey==65479)
     ikey=65482;
   }
  switch (ikey)
   {
    case 65482 : /*F10*/
     strcpy(cw_line, cr_array[icall_count].call);
     break;
    case 65480 : /*F11*/
     strcpy(cw_line, "?");
     break;
    case 65481 : /*F12*/
     strcpy(cw_line, "TU");
     break;
    case 65377 : /*PrtScrn*/
     strcpy(cw_line, qued.call[0]);
     break;
    case 65470 : /*F1*/
    case 65471 : /*F2*/
    case 65472 : /*F3*/
    case 65473 : /*F4*/
    case 65474 : /*F5*/
    case 65475 : /*F6*/
    case 65476 : /*F7*/
    case 65477 : /*F8*/
    case 65478 : /*F9*/
     strcpy(ksc_hold, keyer_screen_choices[ikey-65468]);
     ihat = kb_index (ksc_hold, "^");
     ipnd = kb_index (ksc_hold, "#");
     if(ihat==-1 && ipnd==-1)
      strcpy(cw_line, ksc_hold);
     else if(ihat>-1 && ipnd==-1)
      {
       strcpy(call_hold, cr_array[iscroll_log+1].call);
       reassemble_field (call_hold);
       concat(cw_line, ksc_hold, 0, ihat-1, COPY);
       strcat(cw_line, call_hold);
       concat(cw_line, ksc_hold, ihat+1, strlen(ksc_hold)-1, !COPY);
      }
     else if(ipnd>-1 && ihat==-1)
      {
       strcpy(qso_hold, cr_array[iscroll_log+1].qso);
       left_blank_unpad (qso_hold);
       concat(cw_line, ksc_hold, 0, ipnd-1, COPY);
       strcat(cw_line, qso_hold);
       concat(cw_line, ksc_hold, ipnd+1, strlen(ksc_hold)-1, !COPY);
      }
     else
      {
       strcpy(call_hold, cr_array[iscroll_log+1].call);
       reassemble_field (call_hold);
       concat(cw_line, ksc_hold, 0, ihat-1, COPY);
       strcat(cw_line, call_hold);
       concat(cw_line, ksc_hold, ihat+1, strlen(ksc_hold)-1, !COPY);
       strcpy(ksc_hold, cw_line);
       ipnd = kb_index (ksc_hold, "#");
       strcpy(qso_hold, cr_array[iscroll_log+1].qso);
       left_blank_unpad (qso_hold);
       concat(cw_line, ksc_hold, 0, ipnd-1, COPY);
       strcat(cw_line, qso_hold);
       concat(cw_line, ksc_hold, ipnd+1, strlen(ksc_hold)-1, !COPY);
      }
     break;
    case ';' : /*tune*/
    case ':' : /*ditz*/
     memset(cw_line, ikey, socwm1);
     cw_line[socwm1] = '\0';
     break;
    case '`' : /*dit3*/
     memset(cw_line, ikey, 3);
     cw_line[3] = ' ';
     cw_line[4] = '\0';
     break;
    case 65421 : /*keypad enter*/
     strcpy(cw_line, "TU ");
     strcat(cw_line, init_screen_choices[0]);
     break;
   }
}

static gint send_cw_line(gpointer widget)
{
  gint i, iunit, dit, dah, esp, csp, sp, n;
  gchar ksc0[5];
  static gint j = 0;
  static gint jbytes = 24;

  concat(ksc0, keyer_screen_choices[0], 1, 4, COPY);
  iunit = (gint) (288.*cw_speed_adj/atof(ksc0)+.5);
  if(iunit<4) iunit = 4;
  if(iunit>24) iunit = 24;
  dit = iunit;
  dah = iunit*3;
  esp = iunit;
  csp = iunit*3;
  sp = iunit*2;
  if(fp_keyer)
   {
    if(cw_line[j])
     {
      jbytes -= 24;
      if(jbytes>240)
       return TRUE;
      switch (cw_line[j])
       {
        case 'A' :
         for(i=0; i<dit; i++) fputc(0,fp_keyer);
         for(i=0; i<esp; i++) fputc(255,fp_keyer);
         for(i=0; i<dah; i++) fputc(0,fp_keyer);
         for(i=0; i<csp; i++) fputc(255,fp_keyer);
         jbytes += dit+esp+dah+csp;
         break;
        case 'B' :
         for(i=0; i<dah; i++) fputc(0,fp_keyer);
         for(i=0; i<esp; i++) fputc(255,fp_keyer);
         for(i=0; i<dit; i++) fputc(0,fp_keyer);
         for(i=0; i<esp; i++) fputc(255,fp_keyer);
         for(i=0; i<dit; i++) fputc(0,fp_keyer);
         for(i=0; i<esp; i++) fputc(255,fp_keyer);
         for(i=0; i<dit; i++) fputc(0,fp_keyer);
         for(i=0; i<csp; i++) fputc(255,fp_keyer);
         jbytes += dah+esp+dit+esp+dit+esp+dit+csp;
         break;
        case 'C' :
         for(i=0; i<dah; i++) fputc(0,fp_keyer);
         for(i=0; i<esp; i++) fputc(255,fp_keyer);
         for(i=0; i<dit; i++) fputc(0,fp_keyer);
         for(i=0; i<esp; i++) fputc(255,fp_keyer);
         for(i=0; i<dah; i++) fputc(0,fp_keyer);
         for(i=0; i<esp; i++) fputc(255,fp_keyer);
         for(i=0; i<dit; i++) fputc(0,fp_keyer);
         for(i=0; i<csp; i++) fputc(255,fp_keyer);
         jbytes += dah+esp+dit+esp+dah+esp+dit+csp;
         break;
        case 'D' :
         for(i=0; i<dah; i++) fputc(0,fp_keyer);
         for(i=0; i<esp; i++) fputc(255,fp_keyer);
         for(i=0; i<dit; i++) fputc(0,fp_keyer);
         for(i=0; i<esp; i++) fputc(255,fp_keyer);
         for(i=0; i<dit; i++) fputc(0,fp_keyer);
         for(i=0; i<csp; i++) fputc(255,fp_keyer);
         jbytes += dah+esp+dit+esp+dit+csp;
         break;
        case 'E' :
         for(i=0; i<dit; i++) fputc(0,fp_keyer);
         for(i=0; i<csp; i++) fputc(255,fp_keyer);
         jbytes += dit+csp;
         break;
        case 'F' :
         for(i=0; i<dit; i++) fputc(0,fp_keyer);
         for(i=0; i<esp; i++) fputc(255,fp_keyer);
         for(i=0; i<dit; i++) fputc(0,fp_keyer);
         for(i=0; i<esp; i++) fputc(255,fp_keyer);
         for(i=0; i<dah; i++) fputc(0,fp_keyer);
         for(i=0; i<esp; i++) fputc(255,fp_keyer);
         for(i=0; i<dit; i++) fputc(0,fp_keyer);
         for(i=0; i<csp; i++) fputc(255,fp_keyer);
         jbytes += dit+esp+dit+esp+dah+esp+dit+csp;
         break;
        case 'G' :
         for(i=0; i<dah; i++) fputc(0,fp_keyer);
         for(i=0; i<esp; i++) fputc(255,fp_keyer);
         for(i=0; i<dah; i++) fputc(0,fp_keyer);
         for(i=0; i<esp; i++) fputc(255,fp_keyer);
         for(i=0; i<dit; i++) fputc(0,fp_keyer);
         for(i=0; i<csp; i++) fputc(255,fp_keyer);
         jbytes += dah+esp+dah+esp+dit+csp;
         break;
        case 'H' :
         for(i=0; i<dit; i++) fputc(0,fp_keyer);
         for(i=0; i<esp; i++) fputc(255,fp_keyer);
         for(i=0; i<dit; i++) fputc(0,fp_keyer);
         for(i=0; i<esp; i++) fputc(255,fp_keyer);
         for(i=0; i<dit; i++) fputc(0,fp_keyer);
         for(i=0; i<esp; i++) fputc(255,fp_keyer);
         for(i=0; i<dit; i++) fputc(0,fp_keyer);
         for(i=0; i<csp; i++) fputc(255,fp_keyer);
         jbytes += dit+esp+dit+esp+dit+esp+dit+csp;
         break;
        case 'I' :
         for(i=0; i<dit; i++) fputc(0,fp_keyer);
         for(i=0; i<esp; i++) fputc(255,fp_keyer);
         for(i=0; i<dit; i++) fputc(0,fp_keyer);
         for(i=0; i<csp; i++) fputc(255,fp_keyer);
         jbytes += dit+esp+dit+csp;
         break;
        case 'J' :
         for(i=0; i<dit; i++) fputc(0,fp_keyer);
         for(i=0; i<esp; i++) fputc(255,fp_keyer);
         for(i=0; i<dah; i++) fputc(0,fp_keyer);
         for(i=0; i<esp; i++) fputc(255,fp_keyer);
         for(i=0; i<dah; i++) fputc(0,fp_keyer);
         for(i=0; i<esp; i++) fputc(255,fp_keyer);
         for(i=0; i<dah; i++) fputc(0,fp_keyer);
         for(i=0; i<csp; i++) fputc(255,fp_keyer);
         jbytes += dit+esp+dah+esp+dah+esp+dah+csp;
         break;
        case 'K' :
         for(i=0; i<dah; i++) fputc(0,fp_keyer);
         for(i=0; i<esp; i++) fputc(255,fp_keyer);
         for(i=0; i<dit; i++) fputc(0,fp_keyer);
         for(i=0; i<esp; i++) fputc(255,fp_keyer);
         for(i=0; i<dah; i++) fputc(0,fp_keyer);
         for(i=0; i<csp; i++) fputc(255,fp_keyer);
         jbytes += dah+esp+dit+esp+dah+csp;
         break;
        case 'L' :
         for(i=0; i<dit; i++) fputc(0,fp_keyer);
         for(i=0; i<esp; i++) fputc(255,fp_keyer);
         for(i=0; i<dah; i++) fputc(0,fp_keyer);
         for(i=0; i<esp; i++) fputc(255,fp_keyer);
         for(i=0; i<dit; i++) fputc(0,fp_keyer);
         for(i=0; i<esp; i++) fputc(255,fp_keyer);
         for(i=0; i<dit; i++) fputc(0,fp_keyer);
         for(i=0; i<csp; i++) fputc(255,fp_keyer);
         jbytes += dit+esp+dah+esp+dit+esp+dit+csp;
         break;
        case 'M' :
         for(i=0; i<dah; i++) fputc(0,fp_keyer);
         for(i=0; i<esp; i++) fputc(255,fp_keyer);
         for(i=0; i<dah; i++) fputc(0,fp_keyer);
         for(i=0; i<csp; i++) fputc(255,fp_keyer);
         jbytes += dah+esp+dah+csp;
         break;
        case 'N' :
         for(i=0; i<dah; i++) fputc(0,fp_keyer);
         for(i=0; i<esp; i++) fputc(255,fp_keyer);
         for(i=0; i<dit; i++) fputc(0,fp_keyer);
         for(i=0; i<csp; i++) fputc(255,fp_keyer);
         jbytes += dah+esp+dit+csp;
         break;
        case 'O' :
         for(i=0; i<dah; i++) fputc(0,fp_keyer);
         for(i=0; i<esp; i++) fputc(255,fp_keyer);
         for(i=0; i<dah; i++) fputc(0,fp_keyer);
         for(i=0; i<esp; i++) fputc(255,fp_keyer);
         for(i=0; i<dah; i++) fputc(0,fp_keyer);
         for(i=0; i<csp; i++) fputc(255,fp_keyer);
         jbytes += dah+esp+dah+esp+dah+csp;
         break;
        case 'P' :
         for(i=0; i<dit; i++) fputc(0,fp_keyer);
         for(i=0; i<esp; i++) fputc(255,fp_keyer);
         for(i=0; i<dah; i++) fputc(0,fp_keyer);
         for(i=0; i<esp; i++) fputc(255,fp_keyer);
         for(i=0; i<dah; i++) fputc(0,fp_keyer);
         for(i=0; i<esp; i++) fputc(255,fp_keyer);
         for(i=0; i<dit; i++) fputc(0,fp_keyer);
         for(i=0; i<csp; i++) fputc(255,fp_keyer);
         jbytes += dit+esp+dah+esp+dah+esp+dit+csp;
         break;
        case 'Q' :
         for(i=0; i<dah; i++) fputc(0,fp_keyer);
         for(i=0; i<esp; i++) fputc(255,fp_keyer);
         for(i=0; i<dah; i++) fputc(0,fp_keyer);
         for(i=0; i<esp; i++) fputc(255,fp_keyer);
         for(i=0; i<dit; i++) fputc(0,fp_keyer);
         for(i=0; i<esp; i++) fputc(255,fp_keyer);
         for(i=0; i<dah; i++) fputc(0,fp_keyer);
         for(i=0; i<csp; i++) fputc(255,fp_keyer);
         jbytes += dah+esp+dah+esp+dit+esp+dah+csp;
         break;
        case 'R' :
         for(i=0; i<dit; i++) fputc(0,fp_keyer);
         for(i=0; i<esp; i++) fputc(255,fp_keyer);
         for(i=0; i<dah; i++) fputc(0,fp_keyer);
         for(i=0; i<esp; i++) fputc(255,fp_keyer);
         for(i=0; i<dit; i++) fputc(0,fp_keyer);
         for(i=0; i<csp; i++) fputc(255,fp_keyer);
         jbytes += dit+esp+dah+esp+dit+csp;
         break;
        case 'S' :
         for(i=0; i<dit; i++) fputc(0,fp_keyer);
         for(i=0; i<esp; i++) fputc(255,fp_keyer);
         for(i=0; i<dit; i++) fputc(0,fp_keyer);
         for(i=0; i<esp; i++) fputc(255,fp_keyer);
         for(i=0; i<dit; i++) fputc(0,fp_keyer);
         for(i=0; i<csp; i++) fputc(255,fp_keyer);
         jbytes += dit+esp+dit+esp+dit+csp;
         break;
        case 'T' :
         for(i=0; i<dah; i++) fputc(0,fp_keyer);
         for(i=0; i<csp; i++) fputc(255,fp_keyer);
         jbytes += dah+csp;
         break;
        case 'U' :
         for(i=0; i<dit; i++) fputc(0,fp_keyer);
         for(i=0; i<esp; i++) fputc(255,fp_keyer);
         for(i=0; i<dit; i++) fputc(0,fp_keyer);
         for(i=0; i<esp; i++) fputc(255,fp_keyer);
         for(i=0; i<dah; i++) fputc(0,fp_keyer);
         for(i=0; i<csp; i++) fputc(255,fp_keyer);
         jbytes += dit+esp+dit+esp+dah+csp;
         break;
        case 'V' :
         for(i=0; i<dit; i++) fputc(0,fp_keyer);
         for(i=0; i<esp; i++) fputc(255,fp_keyer);
         for(i=0; i<dit; i++) fputc(0,fp_keyer);
         for(i=0; i<esp; i++) fputc(255,fp_keyer);
         for(i=0; i<dit; i++) fputc(0,fp_keyer);
         for(i=0; i<esp; i++) fputc(255,fp_keyer);
         for(i=0; i<dah; i++) fputc(0,fp_keyer);
         for(i=0; i<csp; i++) fputc(255,fp_keyer);
         jbytes += dit+esp+dit+esp+dit+esp+dah+csp;
         break;
        case 'W' :
         for(i=0; i<dit; i++) fputc(0,fp_keyer);
         for(i=0; i<esp; i++) fputc(255,fp_keyer);
         for(i=0; i<dah; i++) fputc(0,fp_keyer);
         for(i=0; i<esp; i++) fputc(255,fp_keyer);
         for(i=0; i<dah; i++) fputc(0,fp_keyer);
         for(i=0; i<csp; i++) fputc(255,fp_keyer);
         jbytes += dit+esp+dah+esp+dah+csp;
         break;
        case 'X' :
         for(i=0; i<dah; i++) fputc(0,fp_keyer);
         for(i=0; i<esp; i++) fputc(255,fp_keyer);
         for(i=0; i<dit; i++) fputc(0,fp_keyer);
         for(i=0; i<esp; i++) fputc(255,fp_keyer);
         for(i=0; i<dit; i++) fputc(0,fp_keyer);
         for(i=0; i<esp; i++) fputc(255,fp_keyer);
         for(i=0; i<dah; i++) fputc(0,fp_keyer);
         for(i=0; i<csp; i++) fputc(255,fp_keyer);
         jbytes += dah+esp+dit+esp+dit+esp+dah+csp;
         break;
        case 'Y' :
         for(i=0; i<dah; i++) fputc(0,fp_keyer);
         for(i=0; i<esp; i++) fputc(255,fp_keyer);
         for(i=0; i<dit; i++) fputc(0,fp_keyer);
         for(i=0; i<esp; i++) fputc(255,fp_keyer);
         for(i=0; i<dah; i++) fputc(0,fp_keyer);
         for(i=0; i<esp; i++) fputc(255,fp_keyer);
         for(i=0; i<dah; i++) fputc(0,fp_keyer);
         for(i=0; i<csp; i++) fputc(255,fp_keyer);
         jbytes += dah+esp+dit+esp+dah+esp+dah+csp;
         break;
        case 'Z' :
         for(i=0; i<dah; i++) fputc(0,fp_keyer);
         for(i=0; i<esp; i++) fputc(255,fp_keyer);
         for(i=0; i<dah; i++) fputc(0,fp_keyer);
         for(i=0; i<esp; i++) fputc(255,fp_keyer);
         for(i=0; i<dit; i++) fputc(0,fp_keyer);
         for(i=0; i<esp; i++) fputc(255,fp_keyer);
         for(i=0; i<dit; i++) fputc(0,fp_keyer);
         for(i=0; i<csp; i++) fputc(255,fp_keyer);
         jbytes += dah+esp+dah+esp+dit+esp+dit+csp;
         break;
        case '0' :
         for(i=0; i<dah; i++) fputc(0,fp_keyer);
         for(i=0; i<esp; i++) fputc(255,fp_keyer);
         for(i=0; i<dah; i++) fputc(0,fp_keyer);
         for(i=0; i<esp; i++) fputc(255,fp_keyer);
         for(i=0; i<dah; i++) fputc(0,fp_keyer);
         for(i=0; i<esp; i++) fputc(255,fp_keyer);
         for(i=0; i<dah; i++) fputc(0,fp_keyer);
         for(i=0; i<esp; i++) fputc(255,fp_keyer);
         for(i=0; i<dah; i++) fputc(0,fp_keyer);
         for(i=0; i<csp; i++) fputc(255,fp_keyer);
         jbytes += dah+esp+dah+esp+dah+esp+dah+esp+dah+csp;
         break;
        case '1' :
         for(i=0; i<dit; i++) fputc(0,fp_keyer);
         for(i=0; i<esp; i++) fputc(255,fp_keyer);
         for(i=0; i<dah; i++) fputc(0,fp_keyer);
         for(i=0; i<esp; i++) fputc(255,fp_keyer);
         for(i=0; i<dah; i++) fputc(0,fp_keyer);
         for(i=0; i<esp; i++) fputc(255,fp_keyer);
         for(i=0; i<dah; i++) fputc(0,fp_keyer);
         for(i=0; i<esp; i++) fputc(255,fp_keyer);
         for(i=0; i<dah; i++) fputc(0,fp_keyer);
         for(i=0; i<csp; i++) fputc(255,fp_keyer);
         jbytes += dit+esp+dah+esp+dah+esp+dah+esp+dah+csp;
         break;
        case '2' :
         for(i=0; i<dit; i++) fputc(0,fp_keyer);
         for(i=0; i<esp; i++) fputc(255,fp_keyer);
         for(i=0; i<dit; i++) fputc(0,fp_keyer);
         for(i=0; i<esp; i++) fputc(255,fp_keyer);
         for(i=0; i<dah; i++) fputc(0,fp_keyer);
         for(i=0; i<esp; i++) fputc(255,fp_keyer);
         for(i=0; i<dah; i++) fputc(0,fp_keyer);
         for(i=0; i<esp; i++) fputc(255,fp_keyer);
         for(i=0; i<dah; i++) fputc(0,fp_keyer);
         for(i=0; i<csp; i++) fputc(255,fp_keyer);
         jbytes += dit+esp+dit+esp+dah+esp+dah+esp+dah+csp;
         break;
        case '3' :
         for(i=0; i<dit; i++) fputc(0,fp_keyer);
         for(i=0; i<esp; i++) fputc(255,fp_keyer);
         for(i=0; i<dit; i++) fputc(0,fp_keyer);
         for(i=0; i<esp; i++) fputc(255,fp_keyer);
         for(i=0; i<dit; i++) fputc(0,fp_keyer);
         for(i=0; i<esp; i++) fputc(255,fp_keyer);
         for(i=0; i<dah; i++) fputc(0,fp_keyer);
         for(i=0; i<esp; i++) fputc(255,fp_keyer);
         for(i=0; i<dah; i++) fputc(0,fp_keyer);
         for(i=0; i<csp; i++) fputc(255,fp_keyer);
         jbytes += dit+esp+dit+esp+dit+esp+dah+esp+dah+csp;
         break;
        case '4' :
         for(i=0; i<dit; i++) fputc(0,fp_keyer);
         for(i=0; i<esp; i++) fputc(255,fp_keyer);
         for(i=0; i<dit; i++) fputc(0,fp_keyer);
         for(i=0; i<esp; i++) fputc(255,fp_keyer);
         for(i=0; i<dit; i++) fputc(0,fp_keyer);
         for(i=0; i<esp; i++) fputc(255,fp_keyer);
         for(i=0; i<dit; i++) fputc(0,fp_keyer);
         for(i=0; i<esp; i++) fputc(255,fp_keyer);
         for(i=0; i<dah; i++) fputc(0,fp_keyer);
         for(i=0; i<csp; i++) fputc(255,fp_keyer);
         jbytes += dit+esp+dit+esp+dit+esp+dit+esp+dah+csp;
         break;
        case '5' :
         for(i=0; i<dit; i++) fputc(0,fp_keyer);
         for(i=0; i<esp; i++) fputc(255,fp_keyer);
         for(i=0; i<dit; i++) fputc(0,fp_keyer);
         for(i=0; i<esp; i++) fputc(255,fp_keyer);
         for(i=0; i<dit; i++) fputc(0,fp_keyer);
         for(i=0; i<esp; i++) fputc(255,fp_keyer);
         for(i=0; i<dit; i++) fputc(0,fp_keyer);
         for(i=0; i<esp; i++) fputc(255,fp_keyer);
         for(i=0; i<dit; i++) fputc(0,fp_keyer);
         for(i=0; i<csp; i++) fputc(255,fp_keyer);
         jbytes += dit+esp+dit+esp+dit+esp+dit+esp+dit+csp;
         break;
        case '6' :
         for(i=0; i<dah; i++) fputc(0,fp_keyer);
         for(i=0; i<esp; i++) fputc(255,fp_keyer);
         for(i=0; i<dit; i++) fputc(0,fp_keyer);
         for(i=0; i<esp; i++) fputc(255,fp_keyer);
         for(i=0; i<dit; i++) fputc(0,fp_keyer);
         for(i=0; i<esp; i++) fputc(255,fp_keyer);
         for(i=0; i<dit; i++) fputc(0,fp_keyer);
         for(i=0; i<esp; i++) fputc(255,fp_keyer);
         for(i=0; i<dit; i++) fputc(0,fp_keyer);
         for(i=0; i<csp; i++) fputc(255,fp_keyer);
         jbytes += dah+esp+dit+esp+dit+esp+dit+esp+dit+csp;
         break;
        case '7' :
         for(i=0; i<dah; i++) fputc(0,fp_keyer);
         for(i=0; i<esp; i++) fputc(255,fp_keyer);
         for(i=0; i<dah; i++) fputc(0,fp_keyer);
         for(i=0; i<esp; i++) fputc(255,fp_keyer);
         for(i=0; i<dit; i++) fputc(0,fp_keyer);
         for(i=0; i<esp; i++) fputc(255,fp_keyer);
         for(i=0; i<dit; i++) fputc(0,fp_keyer);
         for(i=0; i<esp; i++) fputc(255,fp_keyer);
         for(i=0; i<dit; i++) fputc(0,fp_keyer);
         for(i=0; i<csp; i++) fputc(255,fp_keyer);
         jbytes += dah+esp+dah+esp+dit+esp+dit+esp+dit+csp;
         break;
        case '8' :
         for(i=0; i<dah; i++) fputc(0,fp_keyer);
         for(i=0; i<esp; i++) fputc(255,fp_keyer);
         for(i=0; i<dah; i++) fputc(0,fp_keyer);
         for(i=0; i<esp; i++) fputc(255,fp_keyer);
         for(i=0; i<dah; i++) fputc(0,fp_keyer);
         for(i=0; i<esp; i++) fputc(255,fp_keyer);
         for(i=0; i<dit; i++) fputc(0,fp_keyer);
         for(i=0; i<esp; i++) fputc(255,fp_keyer);
         for(i=0; i<dit; i++) fputc(0,fp_keyer);
         for(i=0; i<csp; i++) fputc(255,fp_keyer);
         jbytes += dah+esp+dah+esp+dah+esp+dit+esp+dit+csp;
         break;
        case '9' :
         for(i=0; i<dah; i++) fputc(0,fp_keyer);
         for(i=0; i<esp; i++) fputc(255,fp_keyer);
         for(i=0; i<dah; i++) fputc(0,fp_keyer);
         for(i=0; i<esp; i++) fputc(255,fp_keyer);
         for(i=0; i<dah; i++) fputc(0,fp_keyer);
         for(i=0; i<esp; i++) fputc(255,fp_keyer);
         for(i=0; i<dah; i++) fputc(0,fp_keyer);
         for(i=0; i<esp; i++) fputc(255,fp_keyer);
         for(i=0; i<dit; i++) fputc(0,fp_keyer);
         for(i=0; i<csp; i++) fputc(255,fp_keyer);
         jbytes += dah+esp+dah+esp+dah+esp+dah+esp+dit+csp;
         break;
        case '/' :
         for(i=0; i<dah; i++) fputc(0,fp_keyer);
         for(i=0; i<esp; i++) fputc(255,fp_keyer);
         for(i=0; i<dit; i++) fputc(0,fp_keyer);
         for(i=0; i<esp; i++) fputc(255,fp_keyer);
         for(i=0; i<dit; i++) fputc(0,fp_keyer);
         for(i=0; i<esp; i++) fputc(255,fp_keyer);
         for(i=0; i<dah; i++) fputc(0,fp_keyer);
         for(i=0; i<esp; i++) fputc(255,fp_keyer);
         for(i=0; i<dit; i++) fputc(0,fp_keyer);
         for(i=0; i<csp; i++) fputc(255,fp_keyer);
         jbytes += dah+esp+dit+esp+dit+esp+dah+esp+dit+csp;
         break;
        case '?' :
         for(i=0; i<dit; i++) fputc(0,fp_keyer);
         for(i=0; i<esp; i++) fputc(255,fp_keyer);
         for(i=0; i<dit; i++) fputc(0,fp_keyer);
         for(i=0; i<esp; i++) fputc(255,fp_keyer);
         for(i=0; i<dah; i++) fputc(0,fp_keyer);
         for(i=0; i<esp; i++) fputc(255,fp_keyer);
         for(i=0; i<dah; i++) fputc(0,fp_keyer);
         for(i=0; i<esp; i++) fputc(255,fp_keyer);
         for(i=0; i<dit; i++) fputc(0,fp_keyer);
         for(i=0; i<esp; i++) fputc(255,fp_keyer);
         for(i=0; i<dit; i++) fputc(0,fp_keyer);
         for(i=0; i<csp; i++) fputc(255,fp_keyer);
         jbytes += dit+esp+dit+esp+dah+esp+dah+esp+dit+esp+dit+csp;
         break;
        case ' ' :
         for(i=0; i<sp; i++) fputc(255,fp_keyer);
         jbytes += sp;
         break;
        case ';' :
         for(i=0; i<60; i++) fputc(0,fp_keyer);
         jbytes += 60;
         break;
        case ':' :
         for(n=0; n<5; n++)
          {
           for(i=0; i<6; i++) fputc(0,fp_keyer);
           for(i=0; i<6; i++) fputc(255,fp_keyer);
          }
         jbytes += 60;
         break;
        case '`' :
         for(i=0; i<12; i++) fputc(0,fp_keyer);
         for(i=0; i<120; i++) fputc(255,fp_keyer);
         jbytes += 132;
         break;
       }
      j++;
      fflush(fp_keyer);
      return TRUE;
     }
   }
  j = 0;
  jbytes = 24;
  sending_cw = FALSE;
  tuning_up = FALSE;
  return FALSE;
}

static void process_cw_message(guint ikey, gpointer widget)
{
  static guint source_tag = 0;

  if(source_tag>0)
   g_source_remove (source_tag);
  memset(cw_line, '\0', sizeof(cw_line));
  send_cw_line (widget);
  tcflush(fileno(fp_keyer), TCOFLUSH);
  cw_speed_adj = 1.0;
  sending_cw = TRUE;
  if(ikey==';' || ikey==':' || ikey=='`')
   {
    tuning_up = TRUE;
    if(mode==PH)
     {
      change_radio_mode (VFOA);
      if(rcv.radio_split==SPLIT_ON)
       change_radio_mode (VFOB);
      usleep(1500000);
     }
   }
  make_cw_line (ikey);
  send_cw_line (widget);
  source_tag = g_timeout_add (100, send_cw_line, widget);
  if(repeat_message)
   g_timeout_add (100, get_cw_eom, widget);
}

static gint get_cw_eom(gpointer widget)
{
  static guint source_tag = 0;

  if(repeat_message)
   {
    if(!sending_cw)
     {
      if(source_tag>0)
       g_source_remove (source_tag);
      sending_cw = TRUE;
      source_tag = g_timeout_add ((guint) (atoi(set_screen_choices[6])+500),
                                  repeat_cw_message, widget);
     }
    return TRUE;
   }
  else
   {
    sending_cw = FALSE;
    return FALSE;
   }
}

static gint repeat_cw_message(gpointer widget)
{
  static guint source_tag = 0;

  if(repeat_message)
   {
    if(source_tag>0)
     g_source_remove (source_tag);
    source_tag = g_timeout_add (100, send_cw_line, widget);
   }
  return FALSE;
}

static void stop_dvk_msg(void)
{
  gint ipid;

  ipid = get_running_pid ("sox");
  if(ipid>-1)
   kill(ipid, SIGTERM);
}

static void send_dvk_msg(guint ikey)
{
  guint key_num;
  gchar dvk_sound_file[13], dvk_key[3], emsg[40];
  const gchar *sound_file_base = "DVKMSG";
  const gchar *sound_file_ext = ".WAV";

  key_num = ikey;
  if(key_num==65482) key_num = 65479;
  int_to_char (key_num-65469, dvk_key);
  strcpy(dvk_sound_file, sound_file_base);
  strcat(dvk_sound_file, dvk_key);
  strcat(dvk_sound_file, sound_file_ext);
  if(inquire(dvk_sound_file))
   dvk_sound_play (dvk_sound_file);
  else
   {
    play_bells (MESSAGE_SOUND);
    strcpy(emsg, "Cannot find sound file: ");
    strcat(emsg, dvk_sound_file);
    message_box (main_drawing_area, emsg, !REDRAW, CLEAR);
   }
}

static void repeat_dvk_msg(void)
{
  FILE *fp;
  gint wav[8];
  guint delay;
  gchar emsg[40];
  static gchar dvk_sound_file[13];
  const gchar *sound_file_base = "DVKMSG";
  const gchar *sound_file_ext = ".WAV";

  strcpy(dvk_sound_file, sound_file_base);
  strcat(dvk_sound_file, set_screen_choices[5]);
  strcat(dvk_sound_file, sound_file_ext);
  if(!repeat_message)
   {
    if(inquire(dvk_sound_file))
     {
      dvk_sound_play (dvk_sound_file);
      repeat_message = TRUE;
      fp = fopen(dvk_sound_file, "r");
      fread(wav, 4, 8, fp);
      fclose(fp);
      delay = (guint) (1000.*((gdouble) wav[1]/(gdouble) wav[7]))
               +atoi(set_screen_choices[6]);
      g_timeout_add (delay, delay_dvk_msg, dvk_sound_file);
     }
    else
     {
      play_bells (MESSAGE_SOUND);
      strcpy(emsg, "Cannot find sound file: ");
      strcat(emsg, dvk_sound_file);
      message_box (main_drawing_area, emsg, !REDRAW, CLEAR);
     }
   }
  else
   play_bells (BELL_SOUND);
}

static gint delay_dvk_msg(gpointer data)
{
  gint rm;
  gchar *dvk_sound_file;

  dvk_sound_file = (gchar*)data;
  rm = repeat_message;
  if(rm)
   dvk_sound_play (dvk_sound_file);
  return rm;
}

static void dvk_sound_play(gchar *filnam)
{
  gchar system_line[51];

  strcpy(system_line,"sox ");
  strcat(system_line, filnam);
  if(inquire("/dev/dsp"))
   strcat(system_line, " -q -t ossdsp /dev/dsp &");
  else
   strcat(system_line, " -q -d &");
  system(system_line);
}

static gint get_running_pid(const gchar *filnam)
{
  FILE *fp;
  gchar filnam_hold[15], psc_line[81], system_line[53];
  gint ami_running=-1;

  strcpy(filnam_hold, filnam);
  strcat(filnam_hold, ".tmp");
#ifdef BSD
  strcpy(system_line, "ps | grep ");
  strcat(system_line, filnam);
  strcat(system_line, " | grep -v grep > ");
  strcat(system_line, filnam_hold);
#else
  strcpy(system_line, "ps -C ");
  strcat(system_line, filnam);
  strcat(system_line, " | sort > ");
  strcat(system_line, filnam_hold);
#endif
  system(system_line);
  fp = fopen(filnam_hold, "r");
  if(fp!=NULL)
   {
    fgets(psc_line, sizeof(psc_line), fp);
    if(kb_index (psc_line, filnam)>-1)
     ami_running = atoi(psc_line);
    fclose(fp);
    remove(filnam_hold);
   }
  return ami_running;
}
