text:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>
#include <float.h>
/* #include "mat.h" */

#ifdef _WIN32
#define DLLEXPORT __declspec(dllexport)
#else
#define DLLEXPORT
#endif

struct NAME_LIST
  {
  unsigned char name[256];
  struct NAME_LIST *next;
};
typedef struct NAME_LIST NAME_LIST;

struct HEADER_FRAME
  {
  unsigned char buf[8192];
  int length;
  struct HEADER_FRAME *next;
};
typedef struct HEADER_FRAME HEADER_FRAME;

struct DATA_FRAME
  {
  float *fbuf;
  double *dbuf;
  int length, data_type;
  struct DATA_FRAME *next;
};
typedef struct DATA_FRAME DATA_FRAME;

struct NAMES_AND_DATA_STORAGE
  {
   struct NAME_LIST *first_sig_name;
   struct DATA_FRAME *first_data_frame;
   char filename[256];
   int num_sigs;
   int num_samples;
   int cur_sig_count;
};
typedef struct NAMES_AND_DATA_STORAGE NAMES_AND_DATA_STORAGE;

struct STORAGE_INFO
  {
   char *filename;
   int num_sigs;
   int num_samples;
};
typedef struct STORAGE_INFO STORAGE_INFO;

#ifdef _WIN32
static struct NAMES_AND_DATA_STORAGE names_and_data_file_info = {NULL, NULL, "NULL", 0, 0, 0};
#else
static struct NAMES_AND_DATA_STORAGE names_and_data_file_info = {.first_sig_name = NULL, .first_data_frame = NULL, .filename = "NULL", .num_sigs = 0, .num_samples = 0, .cur_sig_count = 0};
#endif

int CPPSIM_OLD_FILE_FLAG;

int load_data_from_file(char *filename,HEADER_FRAME *first_header_frame,
                        DATA_FRAME *first_data_frame,int *num_signals,
                        int *num_samples, char *error_msg);
int fread_int_values(FILE *fp, unsigned int *ibuf, int num_of_bytes, char *filename, char *error_msg);
int fread_char_values(FILE *fp, unsigned char *cbuf, int num_of_bytes);
int fread_float_values(FILE *fp, float *fbuf, int num_of_floats);
int fread_double_values(FILE *fp, double *dbuf, int num_of_doubles);
void print_header_frames(HEADER_FRAME *first_header_frame);
HEADER_FRAME *init_header_frame();
DATA_FRAME *init_data_frame();
int create_data_frame_buf(DATA_FRAME *data_frame);
NAME_LIST *init_name_list();
void print_name_list(NAME_LIST *first_sig_name);
int extract_signal_names(HEADER_FRAME *first_header_frame,int num_sigs,
                         NAME_LIST *first_sig_name, char *filename, char *error_msg);
void free_header_frames(HEADER_FRAME *first_header_frame);
void free_data_frames(DATA_FRAME *first_data_frame);
void free_name_list(NAME_LIST *first_name_list);

DLLEXPORT int evalsig(STORAGE_INFO *storage_info, char *sig_name, double *data, char *error_msg);
DLLEXPORT int lssig(STORAGE_INFO *storage_info, char *sig_name, char *error_msg);
DLLEXPORT int loadsig(STORAGE_INFO *storage_info, char *error_msg);
DLLEXPORT int reset_cur_sig_count(void);
DLLEXPORT int initialize(void);

int reset_cur_sig_count(void)
{
names_and_data_file_info.cur_sig_count = 0;
return(0);
}

int evalsig(STORAGE_INFO *storage_info, char *sig_name, double *data, char *error_msg)
{
NAME_LIST *cur_sig_name;
DATA_FRAME *cur_data_frame;
int i, j, count, sig_num;

if (names_and_data_file_info.first_sig_name == NULL)
    {
      sprintf(error_msg,"Error using evalsig('%s'):\n  -> need to first run loadsig before using evalsig",sig_name);
      return(1);
    }

if (names_and_data_file_info.first_data_frame == NULL)
    {
      sprintf(error_msg,"Error using evalsig('%s'):\n  -> need to first run loadsig before using evalsig",sig_name);
      return(1);
    }

if (strcmp(storage_info->filename,names_and_data_file_info.filename) != 0)
    {
      sprintf(error_msg,"Error using evalsig('%s'):\n  ->  internal data storage needs to be updated\n  ---> need to rerun loadsig on file '%s'\n       (Note that file represented in data storage is '%s')",
	      sig_name, storage_info->filename, names_and_data_file_info.filename);
      return(1);
    }

if (storage_info->num_sigs != names_and_data_file_info.num_sigs)
    {
      sprintf(error_msg,"Error using evalsig('%s'):\n  ->  internal data storage needs to be updated\n  ---> need to rerun loadsig on file '%s'\n       (Note that num_sigs in data storage is %d compared to assumed value of %d)",
	      sig_name, storage_info->filename, names_and_data_file_info.num_sigs, storage_info->num_sigs);
      return(1);
    }

if (storage_info->num_samples != names_and_data_file_info.num_samples)
    {
      sprintf(error_msg,"Error using evalsig('%s'):\n  ->  internal data storage needs to be updated\n  ---> need to rerun loadsig on file '%s'\n       (Note that num_samples in data storage is %d compared to assumed value of %d)",
	      sig_name, storage_info->filename, names_and_data_file_info.num_samples, storage_info->num_samples);
      return(1);
    }

cur_sig_name = names_and_data_file_info.first_sig_name;
for (sig_num = 0; sig_num < names_and_data_file_info.num_sigs; sig_num++)
    {
      if (strcmp(sig_name,cur_sig_name->name) == 0)
	 break;
     cur_sig_name = cur_sig_name->next;
    }

if (sig_num == names_and_data_file_info.num_sigs)
   {
     sprintf(error_msg,"Error using evalsig('%s'):\n  -> signal '%s' does not exist as of the last loadsig\n       of file '%s'",
	     sig_name, sig_name, storage_info->filename);
     return(1);
   }

cur_data_frame = names_and_data_file_info.first_data_frame;

count = 0;
for (j = 0; j < names_and_data_file_info.num_samples; j++)
  {
   for (i = 0; i < names_and_data_file_info.num_sigs; i++)
      {
	if (count == cur_data_frame->length)
	  {
	    cur_data_frame = cur_data_frame->next;
	    if (cur_data_frame == NULL)
	      {
		sprintf(error_msg,"error using evalsig('%s'): data frame too short!\n", sig_name);
		return(1);
	      }
            count = 0;
	  }
	if (i == sig_num)
	  {
	   if (cur_data_frame->data_type == 32)
              data[j] = cur_data_frame->fbuf[count];
           else
              data[j] = cur_data_frame->dbuf[count];
	  }
        count++;
      }
  }
return(0);
}

int lssig(STORAGE_INFO *storage_info, char *sig_name, char *error_msg)
{
NAME_LIST *cur_sig_name;
int i;

if (names_and_data_file_info.first_sig_name == NULL)
    {
      strcpy(error_msg,"Error using lssig: need to first run loadsig before using lssig");
      return(1);
    }

if (names_and_data_file_info.first_data_frame == NULL)
    {
      strcpy(error_msg,"Error using lssig: need to first run loadsig before using lssig");
      return(1);
    }

if (strcmp(storage_info->filename,names_and_data_file_info.filename) != 0)
    {
      sprintf(error_msg,"Error using lssig:  internal data storage needs to be updated\n  ---> need to rerun loadsig on file '%s'\n       (Note that file represented in data storage is '%s')",
	      storage_info->filename, names_and_data_file_info.filename);
      return(1);
    }

if (storage_info->num_sigs != names_and_data_file_info.num_sigs)
    {
      sprintf(error_msg,"Error using lssig:  internal data storage needs to be updated\n  ---> need to rerun loadsig on file '%s'\n       (Note that num_sigs in data storage is %d compared to assumed value of %d)",
	      storage_info->filename, names_and_data_file_info.num_sigs, storage_info->num_sigs);
      return(1);
    }

if (names_and_data_file_info.cur_sig_count >= names_and_data_file_info.num_sigs)
   {
     sprintf(sig_name,"NULL");
     names_and_data_file_info.cur_sig_count = 0;
     return(0);
   }

cur_sig_name = names_and_data_file_info.first_sig_name;
for (i = 0; i < names_and_data_file_info.num_sigs; i++)
    {
      if (i == names_and_data_file_info.cur_sig_count)
	 break;
     cur_sig_name = cur_sig_name->next;
    }

strcpy(sig_name,cur_sig_name->name);
names_and_data_file_info.cur_sig_count++;

return(0);
}

int initialize(void)
{
if (names_and_data_file_info.first_sig_name != NULL)
  {
     free_name_list(names_and_data_file_info.first_sig_name);
     names_and_data_file_info.first_sig_name = NULL;
  }

if (names_and_data_file_info.first_data_frame != NULL)
  {
     free_data_frames(names_and_data_file_info.first_data_frame);
     names_and_data_file_info.first_data_frame = NULL;
  }

strcpy(names_and_data_file_info.filename,"NULL");
names_and_data_file_info.num_sigs = 0;
names_and_data_file_info.num_samples = 0;
names_and_data_file_info.cur_sig_count = 0;
}

int loadsig(STORAGE_INFO *storage_info, char *error_msg)
{
HEADER_FRAME *first_header_frame;

int num_sigs, num_samples;

if (names_and_data_file_info.first_sig_name != NULL)
  {
     free_name_list(names_and_data_file_info.first_sig_name);
     names_and_data_file_info.first_sig_name = NULL;
  }

if (names_and_data_file_info.first_data_frame != NULL)
  {
     free_data_frames(names_and_data_file_info.first_data_frame);
     names_and_data_file_info.first_data_frame = NULL;
  }

strcpy(names_and_data_file_info.filename,storage_info->filename);

names_and_data_file_info.first_data_frame = init_data_frame();
if (names_and_data_file_info.first_data_frame == NULL)
   {
     sprintf(error_msg,"Error using loadsig('%s'):\n  -> unable to allocate memory for data frame\n  ---> Insufficient memory to load in file",storage_info->filename);
     return(1);
   }

first_header_frame = init_header_frame();
if (first_header_frame == NULL)
   {
     sprintf(error_msg,"Error using loadsig('%s'):\n  -> unable to allocate memory for header frame\n  ---> Insufficient memory to load in file",storage_info->filename);
     return(1);
   }
names_and_data_file_info.first_sig_name = init_name_list();
if (names_and_data_file_info.first_sig_name == NULL)
   {
     sprintf(error_msg,"Error using loadsig('%s'):\n  -> unable to allocate memory for signal list\n  ---> Insufficient memory to load in file",storage_info->filename);
     return(1);
   }

strcpy(error_msg,"NULL");
if (load_data_from_file(storage_info->filename, first_header_frame,
                        names_and_data_file_info.first_data_frame,
                        &num_sigs, &num_samples, error_msg) == 1)
  {
    return(1);
  }

 if (extract_signal_names(first_header_frame,num_sigs,names_and_data_file_info.first_sig_name, storage_info->filename, error_msg) == 1)
  {
    return(1);
  }

names_and_data_file_info.num_sigs = num_sigs;
names_and_data_file_info.num_samples = num_samples;

storage_info->num_sigs = num_sigs;
storage_info->num_samples = num_samples;

free_header_frames(first_header_frame);
first_header_frame = NULL;

return(0);
}

int load_data_from_file(char *filename,HEADER_FRAME *first_header_frame,
                        DATA_FRAME *first_data_frame,int *num_signals,
                        int *num_samples, char *error_msg)
{
int i,j, num_sigs;
char num_sigs_text[5],output_version[5];
int status, data_type, buf_length, buf_length_confirm, buf_length_actual;
unsigned int ibuf[20];
HEADER_FRAME *cur_header_frame;
DATA_FRAME *cur_data_frame;
FILE *fid;
int data_frame_count, buf_length_float, buf_length_double;
int num_sample_points, remainder, last_buf_length;
unsigned char temp_buf[1000];
int found_header_flag, found_data_flag, data_64_flag;

cur_data_frame = NULL;
cur_header_frame = NULL;
data_64_flag = 0;

if ((fid = fopen(filename,"rb")) == NULL)
  {
   sprintf(error_msg,"Error using loadsig('%s'):\n  -> file can't be opened", filename);
   return(1);
  }

/*****************  read in header ******************/

CPPSIM_OLD_FILE_FLAG = 0;
data_frame_count = 0;
found_header_flag = 0;
found_data_flag = 0;

if (fread_int_values(fid, ibuf, 4, filename, error_msg) != 4)
   {
    if (strcmp(error_msg,"NULL") == 0)
        sprintf(error_msg, "\nError using loadsig('%s'):\n  -> file appears to be empty!", filename);
    return(1);
   }
if (ibuf[0] != 4 && ibuf[0] != 8)
   {
    CPPSIM_OLD_FILE_FLAG = 1;
    //    printf("...reading in old version of CppSim simulation file...\n");
    rewind(fid);
    if (fread_int_values(fid, ibuf, 4, filename, error_msg) != 4)
       {
       if (strcmp(error_msg,"NULL") == 0)
           sprintf(error_msg, "Error using loadsig('%s'):\n  -> encountered a read error for file", filename);
       return(1);
       }
    if (ibuf[0] != 4 && ibuf[0] != 8)
      {
       sprintf(error_msg, "Error using loadsig('%s'):\n  -> file is corrupted", filename);
       return(1);
      }
   }
rewind(fid);

while(1)
   {
   /*   read in whether header or data (header:  112, data: 128)   */
   /*   and buffer length of next data segment   */

   if (fread_int_values(fid, ibuf, 16, filename, error_msg) != 16)
       {
       if (strcmp(error_msg,"NULL") != 0)
	  return(1);
       status = -1;
       break;
       }
   data_type = ibuf[1];
   buf_length = ibuf[3];

   /* printf("data_type = %d, buf_length = %d\n",data_type,buf_length); */
   if (data_type == 112)
     {
      /*    read current header segment   */
      if (cur_header_frame == NULL)
	  {
          cur_header_frame = first_header_frame;
	  }
      else
          {
	  cur_header_frame->next = init_header_frame();
          if (cur_header_frame->next == NULL)
              {
               sprintf(error_msg,"Error using loadsig('%s'):\n  ->  unable to allocate memory for header frame\n  ---> Insufficient memory to load in file",filename);
               return(1);
              }

	  cur_header_frame = cur_header_frame->next;
          }

      buf_length_actual = fread_char_values(fid, cur_header_frame->buf,
	      buf_length);

      cur_header_frame->length = buf_length_actual;
      if (buf_length_actual != buf_length)
          {
	  status = -1;
  	  break;
          }

      if (found_header_flag == 0)
	{
         for (i = 16; i < 20; i++)
            output_version[i-16] = first_header_frame->buf[i];
         output_version[4] = '\0';

         /* printf("num_sigs = %d, output_version = %s\n",num_sigs,output_version); */

         if (strcmp(output_version,"9601") != 0)
            {
             if (strcmp(output_version,"9602") == 0)
                data_64_flag = 1;
             else
               {
		 sprintf(error_msg, "Error using loadsig('%s'):\n  -> file is not Hspice version 9601 (or version 9602 for CppSim 64-bit data)", filename);
                return(1);
               }
            }
         found_header_flag = 1;
	}
     }
   else if (data_type == 128)
     {
       if (found_header_flag == 0)
	 {
	  sprintf(error_msg, "Error using loadsig('%s'):\n  -> did not find header in file", filename);
          return(1);
	 }
      found_data_flag = 1;

      data_frame_count++;
      /*    read current data segment   */
      if (cur_data_frame == NULL)
          cur_data_frame = first_data_frame;
      else
          {
	  cur_data_frame->next = init_data_frame();
          if (cur_data_frame->next == NULL)
              {
               sprintf(error_msg,"Error using loadsig('%s'):\n  -> unable to allocate memory for data frame\n  ---> Insufficient memory to load in file",filename);
               return(1);
              }
	  cur_data_frame = cur_data_frame->next;
          }

      if (data_64_flag == 0) /* 32-bit data */
	{
	 cur_data_frame->data_type = 32;
         if (create_data_frame_buf(cur_data_frame) == 0)
              {
               sprintf(error_msg,"Error using loadsig('%s'):\n  ->  unable to allocate memory for data frame buffer\n  ---> Insufficient memory to load in file",filename);
               return(1);
              }
         buf_length_float = buf_length/4;
         /*  printf("buf_length_float = %d\n",buf_length_float);  */
         buf_length_actual = fread_float_values(fid, cur_data_frame->fbuf,
                                                buf_length_float);
         cur_data_frame->length = buf_length_actual;
         /*      printf("buf_length_actual = %d\n",buf_length_actual);   */
         if (buf_length_actual != buf_length_float)
           {
	    /*	    printf("data_frame_count = %d, buf_length = %d\n",
		    data_frame_count, buf_length_actual); */
	    status = -1;
  	    break;
           }
	}
      else /* 64-bit data */
	{
	 cur_data_frame->data_type = 64;
         if (create_data_frame_buf(cur_data_frame) == 0)
              {
               sprintf(error_msg,"Error using loadsig('%s'):\n  ->  unable to allocate memory for data frame buffer\n  ---> Insufficient memory to load in file",filename);
               return(1);
              }
         buf_length_double = buf_length/8;
         /*  printf("buf_length_double = %d\n",buf_length_double);  */
         buf_length_actual = fread_double_values(fid, cur_data_frame->dbuf,
                                                buf_length_double);
         cur_data_frame->length = buf_length_actual;
         /*      printf("buf_length_actual = %d\n",buf_length_actual);   */
         if (buf_length_actual != buf_length_double)
           {
	    /*	    printf("data_frame_count = %d, buf_length = %d\n",
		    data_frame_count, buf_length_actual); */
	    status = -1;
  	    break;
           }
	}
     }
   else
     {
       sprintf(error_msg, "Error using loadsig('%s'):\n  -> unrecognized data type segment", filename);
       return(1);
     }
/* grab end of current buffer segment and check that data is OK */

   if (fread_int_values(fid,ibuf, 4, filename, error_msg) != 4)
       {
	if (strcmp(error_msg,"NULL") != 0)
	   return(1);
	status = -1;
	break;
       }
   buf_length_confirm = ibuf[0];
   /*   printf("buf_length_confirm = %d\n",buf_length_confirm); */

   if (buf_length != buf_length_confirm)
     {
      sprintf(error_msg, "Error using loadsig('%s'):\n  ->  buf_length not equal to buf_length_confirm", filename);
      return(1);
     }
   }
if (found_header_flag == 0 || found_data_flag == 0)
   {
     sprintf(error_msg, "Error using loadsig('%s'):\n  ->  attempt to read file was unsuccessful", filename);
     return(1);
   }

last_buf_length = buf_length_actual;

for (i = 0; i < 4; i++)
    num_sigs_text[i] = first_header_frame->buf[i];
num_sigs_text[4] = '\0';

num_sigs = atoi(num_sigs_text);

num_sample_points = (data_frame_count-1)*2048 + last_buf_length;
remainder = num_sample_points % num_sigs;
num_sample_points = (num_sample_points - remainder)/num_sigs;

/* printf("num_sample_points = %d\n",num_sample_points);  */

/* print_header_frames(first_header_frame); */

*num_samples = num_sample_points;
*num_signals = num_sigs;
fclose(fid);
return(0);
}

int extract_signal_names(HEADER_FRAME *first_header_frame,int num_sigs,
                         NAME_LIST *first_sig_name, char *filename, char *error_msg)
{
int i, j, k, count;
HEADER_FRAME *cur_header_frame;
NAME_LIST *cur_sig_name;

cur_sig_name = NULL;

cur_header_frame = first_header_frame;
count = 0;
while(cur_header_frame != NULL)
  {
   if (cur_header_frame == first_header_frame)
      i = 264;
   else
      i = 0;

   for (   ; i < cur_header_frame->length; i++)
      {
      if (count == num_sigs)
          break;
      if (cur_header_frame->buf[i] == '1')
          count++;
      }
   if (count == num_sigs)
     {
       i++;
       break;
     }
   cur_header_frame = cur_header_frame->next;
  }
if (count != num_sigs)
   {
    sprintf(error_msg, "Error using loadsig('%s'):\n  -> in 'extract_signal_names':  not enough 1 entries for file", filename);
    return(1);
   }

for (j = 0; j < num_sigs; j++)
  {
   k = i;
   while(1)
     {
      if (k == cur_header_frame->length)
	{
	  if (cur_header_frame->next != NULL)
	     {
	      cur_header_frame = cur_header_frame->next;
              k = 0;
	     }
          else
	      break;
	}
      if (cur_header_frame->buf[k] != ' ')
           break;
      k++;
     }

   i = k;
   if (cur_sig_name == NULL)
       cur_sig_name = first_sig_name;
   else
     {
       cur_sig_name->next = init_name_list();
       if (cur_sig_name->next == NULL)
          {
           sprintf(error_msg,"Error using loadsig('%s'):\n  -> unable to allocate memory for signal list\n  ---> Insufficient memory to load in file",filename);
          return(1);
          }
       cur_sig_name = cur_sig_name->next;
     }
   k = i;
   while(1)
     {
      if (k == cur_header_frame->length)
	{
	 if (cur_header_frame->next != NULL)
	   {
	     cur_header_frame = cur_header_frame->next;
             i = i-k;
             k = 0;
	   }
         else
	     break;
	}

      if (cur_header_frame->buf[k] == ' ')
         break;

      /***
      if (cur_header_frame->buf[k] != '.')
         cur_sig_name->name[k-i] = cur_header_frame->buf[k];
      else
         cur_sig_name->name[k-i] = '_';
      ***/
      cur_sig_name->name[k-i] = cur_header_frame->buf[k];
      k++;
     }
   cur_sig_name->name[k-i] = '\0';
   i = k;
  }
return(0);
}

void print_header_frames(HEADER_FRAME *first_header_frame)
{
HEADER_FRAME *cur_header_frame;
int i;

cur_header_frame = first_header_frame;

while (cur_header_frame != NULL)
   {
     for (i = 0; i < cur_header_frame->length; i++)
        printf("%c",(char) cur_header_frame->buf[i]);
     printf("\n");
     cur_header_frame = cur_header_frame->next;
   }
}

void print_name_list(NAME_LIST *first_sig_name)
{
NAME_LIST *cur_sig_name;

cur_sig_name = first_sig_name;

while (cur_sig_name != NULL)
   {
     printf("%s\n",cur_sig_name->name);
     cur_sig_name = cur_sig_name->next;
   }
}

int fread_int_values(FILE *fp, unsigned int *ibuf, int num_of_bytes, char *filename, char *error_msg)
  {
   unsigned char *charbuf;
   int i, num_int_values;
   size_t bytes_read;

   num_int_values = num_of_bytes/4;

   if ((charbuf = (unsigned char *) calloc(num_of_bytes,sizeof(unsigned char))) == NULL)
         {
	  sprintf(error_msg,"Error using loadsig('%s'):\n  -> in 'fread_int_values':  calloc call failed\n   ->  not enough memory to read file",
               filename);
          return(-1);
        }

   bytes_read = fread(charbuf, sizeof(unsigned char),num_of_bytes, fp);

   for (i = 0; i < num_int_values; i++)
      {
	if (CPPSIM_OLD_FILE_FLAG == 1) 	/**** Former Endian method ****/
	  {
          ibuf[i] = charbuf[i*4]*(1<<24) + charbuf[i*4+1]*(1<<16)
                     + charbuf[i*4+2]*(1<<8) + charbuf[i*4+3];
	  }
	else /**** New Endian method to match Hspice ****/
	  {
          ibuf[i] = charbuf[i*4+3]*(1<<24) + charbuf[i*4+2]*(1<<16)
                     + charbuf[i*4+1]*(1<<8) + charbuf[i*4];
	  }
      }
   free(charbuf);
   return((int) bytes_read);
  }

int fread_char_values(FILE *fp, unsigned char *cbuf, int num_of_bytes)
  {
   size_t bytes_read;

   bytes_read = fread(cbuf, sizeof(unsigned char),num_of_bytes, fp);

   return((int) bytes_read);
  }

int fread_float_values(FILE *fp, float *fbuf, int num_of_floats)
  {
   size_t floats_read;

   floats_read = fread(fbuf, sizeof(float),num_of_floats, fp);

   return((int) floats_read);
  }

int fread_double_values(FILE *fp, double *dbuf, int num_of_doubles)
  {
   size_t double_read;

   double_read = fread(dbuf, sizeof(double), num_of_doubles, fp);

   return((int) double_read);
  }

HEADER_FRAME *init_header_frame()
{
HEADER_FRAME *A;

if ((A = (HEADER_FRAME *) calloc(1,sizeof(HEADER_FRAME))) == NULL)
   {
   /*
   printf("error in 'init_header_frame':  calloc call failed\n");
   printf("out of memory!\n");
   */
   return(NULL);
  }
A->length = 8192;
A->next = NULL;
return(A);
}

DATA_FRAME *init_data_frame()
{
DATA_FRAME *A;

if ((A = (DATA_FRAME *) calloc(1,sizeof(DATA_FRAME))) == NULL)
   {
   /*
   printf("error in 'init_data_frame':  calloc call failed\n");
   printf("out of memory!\n");
   */
   return(NULL);
  }
A->data_type = 32;
A->fbuf = NULL;
A->dbuf = NULL;
A->length = 2048;
A->next = NULL;
return(A);
}

int create_data_frame_buf(DATA_FRAME *data_frame)
{
if (data_frame->data_type == 32)
  {
   if ((data_frame->fbuf = (float *) calloc(2048,sizeof(float))) == NULL)
      {
      /**
      printf("error in 'create_data_frame_buf':  calloc call failed\n");
      printf("out of memory!\n");
      **/
      return(0);
      }
  }
else
  {
   if ((data_frame->dbuf = (double *) calloc(2048,sizeof(double))) == NULL)
      {
      /**
      printf("error in 'create_data_frame_buf':  calloc call failed\n");
      printf("out of memory!\n");
      **/
      return(0);
      }
  }
return(2048);
}

NAME_LIST *init_name_list()
{
NAME_LIST *A;

if ((A = (NAME_LIST *) calloc(1,sizeof(NAME_LIST))) == NULL)
   {
   /*
   printf("error in 'init_name_list':  calloc call failed\n");
   printf("out of memory!\n");
   */
   return(NULL);
  }
A->next = NULL;
return(A);
}

void free_header_frames(HEADER_FRAME *first_header_frame)
{
HEADER_FRAME *cur_header_frame, *prev_header_frame;

cur_header_frame = first_header_frame;

while(cur_header_frame != NULL)
   {
    prev_header_frame = cur_header_frame;
    cur_header_frame = cur_header_frame->next;
    free(prev_header_frame);
   }
}

void free_data_frames(DATA_FRAME *first_data_frame)
{
DATA_FRAME *cur_data_frame, *prev_data_frame;

cur_data_frame = first_data_frame;

while(cur_data_frame != NULL)
   {
    prev_data_frame = cur_data_frame;
    cur_data_frame = cur_data_frame->next;
    if (prev_data_frame->fbuf != NULL)
        free(prev_data_frame->fbuf);
    if (prev_data_frame->dbuf != NULL)
        free(prev_data_frame->dbuf);
    free(prev_data_frame);
   }
}

void free_name_list(NAME_LIST *first_name_list)
{
NAME_LIST *cur_name_list, *prev_name_list;

cur_name_list = first_name_list;

while(cur_name_list != NULL)
   {
    prev_name_list = cur_name_list;
    cur_name_list = cur_name_list->next;
    free(prev_name_list);
   }
}


text:
Q: Product attributes and variations in Woocommerce Product Bundles On our site we are using WooCommerce with Woocommerce product bundle plugin. I have a bit of a special case I'm afraid.
On our site we are selling lambs meat. There are several products of course and a lots of them are sold as a stand alone product and in a product bundle as well. There is one special bundle, we call it "for singles". A collection of the same products are added to the bundle, we just added smaller portions. For instance a portion of 250 grams instead of 500 grams.
The standalone product is 500 grams. The 250 grams version exists only in the "Package for singles". I do not want the 250 grams version visible in the shop or search results to be sold separately. At first we added two distinct products: a 250 grams version and a 500 grams version.
We added the 500 grams version to a couple of other bundles and we show it on the product pages as a stand alone product.
Working on SEO I learned that it is not done to add pages, posts or products with the same description as it will lead to a "Duplicate COntent" vote on Google and harm our rankings.
So what I want to achieve is this:
the 500 grams version shown as a single, stand alone product
the 500 grams version in a couple of bundles
the 250 grams version in only the "singles" bundle.
The single product page for the 500 grams version must be displayed as a "normal" single product without variations. So, no attributes and no pull down menu to select the options.
A checkbox whether or not the variations has to be displayed on the single product page should be great (I think).
Working with the settings for Attributes and Variations for more than a day now I realized I need some help.
I've read up on a bunch of posts and tutorials but no avail.
Please advice
PS. I can't give you credentials for the live site because I don't want to interrupt anyting. But you can view the pages at https://lokaallamsvlees.nl. The site I am working for development purposes is on my local machine.

A: I have chosen to keep both product variations and set the a canonical url at the small variation of the product. This way I avoid the duplicate content issue in Google and that was what it was all about.

redpajama_set_name: RedPajamaStackExchange


Maria Canteli has been teaching Spanish at the Santa Catalina School for the past 12 years and currently teaches grades 7-8. Santa Catalina, a PreK-12 independent school in Monterey, CA, has a robust device program that provides Chromebooks for students in grades 4-8 and MacBooks and iPads for faculty, while inviting students to bring their own laptops at the high school level. Accordingly, the school relies heavily on GSuite and Schoology, their LMS, for collaboration and creation between faculty and students.
A firm believer in student voice, especially in language teaching, Maria describes her classroom as student-centered and strives to actively engage her students with as much Spanish language and culture as is possible. Though relatively easy to accomplish during class, she found that active engagement was quite challenging outside of class, after students left her for the day. And because regular active practice is the key for achieving mastery of a language, she understood both the challenge facing her as well as the opportunity that technology provided to help her overcome it.
Fortunately, the Knowing Technologies instructional coaching program offered the perfect structure for her to pursue her goals around the curriculum she wanted to build for her students. Maria thus applied and became a member of the Santa Catalina's third Instructional Innovation Cohort, run by Jim Puccetti, Director of Teacher Development and Instructional Design (see here for more details on the program). In her collaboration sessions with Jim over the course of the year, she learned how edtech was about more than just substitution—she learned how to leverage digital tools to go even farther with her students than she otherwise could without them.
In particular, Maria developed an action plan to help more of her students actively speak in the target language. With Jim's help, Maria used the video tools Flipgrid and Adobe Spark to allow her students to record themselves actively speaking in Spanish, thereby increasing their level of active engagement with the language and giving them more opportunities to build mastery of it.
Jim also helped Maria to organize other online language-learning resources and make them available to students through Schoology. Together, they were able to overcome the limitations that traditional textbooks present, especially for language study, and break the attachments to them by creating more authentic materials of their own.
Going even deeper, Maria reimagined the traditional foreign country project to bolster her students' level of engagement. She used Google's Tour Creator and Google Earth to have her students build interactive tours of countries they were curious about. By taking advantage of Google's tools, her students were able to create immersive experiences that they could share with each other, including using Google Street View to explore specific destinations in greater detail. In the end, Maria was far less interested in the product of her students' work than she was with the exploratory process by which they put it all together and the skills they learned from doing so. On account of their engagement in the work and their newfound interest in the countries they explored, her students began having spontaneous discussions about traveling and now see their language study as more immediately useful and relevant to them, which has always been one of Maria's goals.
The coaching experience has inspired Maria to develop a habit of learning new things and a desire to keep growing, while also stoking her passion for teaching. In the coming academic year, she's eager to implement more of what she learned last year into her curricula, beginning by connecting students outside of the classroom for cultural exchanges. She is also excited to continue learning with her peers, including those who are in this year's Santa Catalina cohort.
Maria has become so empowered and inspired by her professional growth that she has volunteered to lead professional development opportunities for others, including presenting at the C3Tech conference in Los Angeles this summer, where she led a workshop on the importance of student voice, and she will also present at the Foreign Language Education Symposium in Monterey this November. She was also accepted into the highly selective Google Certified Innovator Academy and will be traveling to Spain for the event in October, where she'll continue to learn about innovative approaches to teaching, learning, and leadership with other educators.
As the instructional cohort model has spread at the school, more students at Santa Catalina are starting to talk about the exciting activities they're doing in their courses, and the enthusiasm for innovative teaching is spreading into other classrooms. More faculty at the school are collaborating and sharing across departments, and the faculty room is becoming a nexus for the exchange of ideas, resources, and exciting new learning experiences.
Find out what else Maria is up to on Twitter at @mariafcanteli and stay tuned for more cohort stories here on our blog or at @KnowingTechK12. And please let us know if you'd like to learn more about how we work with schools, since we're always happy to share our own story.


Students who participated in Alternative Spring Break last month in El Paso, Texas, and Boston shared stories about what they learned after meeting people affected by immigration policy in a Lunch and Learn event at Common Ground, in the Walker Building, on April 16.
Some students became visibly emotional as they described the experiences of people they met while volunteering at shelters and outreach programs.
Edwin Stubbs, MA '15, a Marketing Communication major, tried not to choke up as he recounted the story of a woman from Mexico who was discouraged by friends and family from leaving her partner who was physically abusive.
Angelika Romero '15, a Journalism major, spoke about a woman who fled Mexico after being threatened with death by a drug cartel because she had not paid them money they demanded. Romero said the cartel forced people into payment of so-called dues.
Romero said she met with the woman on the same day she left a U.S. detention center, where she had been held since crossing the border.
Romero, along with the other students, called for the need for reform to help immigrants from Latin American countries, where corruption in government is common.
Suzanne Hinton, director of Emerson's Office of Service Learning and Community Action, which organizes the annual Alternative Spring Break trip, said the Lunch and Learn event was intended to help the program grow and strategize for next year.
Hinton said her office would continue working closely with the Office of Development and Alumni Relations on fundraising for future Alternative Spring Break trips using USEED.


If you buy whole asparagus, you will have to peel off the hard fibers on the lower part of the stalks , or you can bend the stalks until they snap. The breaking point marks where the tender green part ends and the woody lower end of the asparagus start.
Do not throw these ends away. Split the stalks in two, and put them in the stock and allow to simmer for 2-3 hours. Remove them from the stock. Take a spoon and scoop the delicious inner core and dispose of the skin. You will find that they have the same delicious taste as the top.


Patch 1.03 for EA's NHL 17 is now available for PS4 and Xbox One. The patch brings changes to HUT, EASHL, and the general gameplay experience, but it isn't a massive upgrade.
SGO is your source for all things NHL 17.


These new modern 14.2cm tall ottoman legs are a shiny gun-metal nickle on aluminium colour and are sleek. The Emily retro ottoman leg angles outward.
Total height of this metal furniture leg is 14.2cm (5.9" inches). The anodized gun-metal aluminium surface is a shiny finish.
This ottoman leg is ordered in as needed and takes 7-10 days to arrive into our showroom before being dispatched to you, so please allow for this time.
Each metal ottoman leg has two holes in the top plate to fix into the wood frame of any ottoman or sofa. Screws are not included with this order but you can use a commonly found screw and washer from a hardware shop.


text:
Apple's New Stand For Its Pro Display Costs An Astounding $10000
The Engineer June 15, 2019 0
Apple launched its biggest conference of the year on Monday, and it was during this conference that the audience was bestowed upon with Apple's latest updates and new creations. John Ternus is Apple's vice president of hardware engineering and the person who was in charge of presenting the updates and creations during the conference. It was during this conference that The Pro Stand was introduced!
Apple executives described the Mac Pro in complete detail during the conference. The Mac Pro is the most powerful computer for professionals by Apple. Same was the case for the 32-inch Pro Display XR monitor (or screen). The Mac Pro is priced at $6,000, and the monitor is priced at $5,000. Both of these items were quite well-received amidst cheers and excitement.
The next stop was for the Pro Stand that was welcomed with a few groans and a single, yes single, clap from a member of the audience. The Pro Stand is priced at $1,000. Nope, we are not mistaken about the cost, folks. It does indeed cost a thousand dollars. That explains the lack of enthusiasm and excitement during its unveiling.
The sentiment of the audience was mutually shared by social media networks soon enough. The Internet had a field day with a plethora of roasting comments, images, video clips, and memes all making the Pro Stand the butt of their jokes. Twitter and Reddit users were leading the charge, and we have to admit that some of them are actually quite good.
only Apple would charge $1,000 for a literal stand and then display it like it's a piece of art https://t.co/z0UVQP1Oeu
— Mike Murphy (@mcwm) June 4, 2019
The Mac Pro costs $5,000.
The stand, sold separately, costs $999 #WWDC19 #MacPro
Buyers : pic.twitter.com/eA5ZmKklOq
— Maita (@piyapiyanka) June 3, 2019
Will the Pro Stand actually sell? How well will it be received by the consumers? All of these questions and more will be answered during the Fall when it is actually available for purchase. We, however, don't understand why a stand is priced at a thousand dollars. What do you think? Do let us know!
Huawei Has Asked Verizon To Pay $1 Billion For Its Patents
NASA Is Opening ISS To Tourists In 2020
Turkish University Dispatches Over 10,000 Mirrors To Stop Students From Cheating

redpajama_set_name: RedPajamaCommonCrawl


text:
Tomlin's formula a simple one
LATROBE, PA. – It's a simple formula, and as the Pittsburgh Steelers prepare to break the fifth training camp of the Mike Tomlin era, it can be used to rank the previous four. From best to worst, it would be 2008, then 2010, then 2007 and coming in last would be 2009.
That's because the Steelers won Super Bowl XLIII in 2008, they won the AFC Championship in 2010, the won the AFC North Division in 2007, and they missed the playoffs in 2009.
"I usually measure camps based on seasons," said Tomlin on Tuesday during his final press briefing of the Saint Vincent College portion of this preseason. "I believe that's the appropriate way to look at it. I feel comfortable with what we've done to this point, but no question, you measure camps and productivity based on outcomes of football seasons. I'll really take a look at this camp and its structure and what we were able to do in hindsight as we proceed throughout the season."
History will remember 2011 training camps as the ones that happened without the benefit of an offseason that allows for free agency, minicamps and OTAs to be spread over a four-month span. Because of no offseason, those things were condensed from months into a matter of days, and the sum total was to create a training camp that seemed disjointed, a camp that never developed the comfort level of a typical one.
"I said at the outset of this thing that comfort was going to be a difficult thing under the circumstances," said Tomlin. "I find comfort in that all of us as head coaches are slightly uncomfortable from that standpoint. No we weren't able to get done what we usually get done under normal circumstances, but I'm sure there are 31 other guys in my position who are saying the same thing."
From the standpoint of the building of the 90-man roster to the art of conducting training camp practices in pads with some 30-plus guys who were issued their playbooks about a fortnight ago, yes, everything is equal all across the league. But here in Latrobe this summer, the climate has been better suited to growing rice than practicing football, and the Steelers have been able to conduct only about a half-dozen practices on the grass fields their turf specialists spend months preparing. Still, Tomlin refuses to complain or make excuses.
"I'm always comfortable, maybe because I make the schedule," Tomlin said jokingly, before turning serious. "I'm not looking for comfort, you guys know that. That's not in our profession. I enjoy what I do, I enjoy the challenges that it presents, even under the unusual circumstances such as what we've all gone through in the National Football League this season. I welcome it all."
One of the keystones of an NFL training camp is the battle for jobs, and on this veteran Steelers team the one spot that remains wide open at this point is at right guard. When things began, the competitors included Doug Legursky, Ramon Foster and Chris Scott, but last Friday in Washington a new candidate emerged, and Tony Hills will get the start there against the Philadelphia Eagles on Thursday night at Heinz Field. Legursky will start at left guard while Chris Kemoeatu (knee) continues to work his way back to being ready to play after a camp-opening stint on the physically unable to perform list.
"Doug Legursky will start at left guard," said Tomlin, "and I think we'll give Tony Hills a shot at right guard. Tony represented himself very well in his guard play in the preseason opener. We gave Chris Scott the opportunity to start with the first unit. Tony played later in the game at right guard and represented himself rather well, and so we want to give him an opportunity to play, hopefully against Philadelphia's first units and see how he fares under those circumstances.
"That's what this process of team building is about. I think it's refreshing, not only for (coaches) but for (players). It lets them know we have viable candidates and guys competing for work, and we're going to let their play sort it out. That's what training camp and the preseason is about, and we're glad it's developing the way it is."
What this point in the preseason is about for Tomlin is getting some improvement from his team, because of what he saw in the opener against the Redskins. As Tomlin said, "Of course, this is a significant step as it's our second time out. We're looking for improvement, quite frankly, in all areas."
Still, there will be no game plan installed for the Eagles, but Tomlin has indicated the staff will do a little bit in the way of preparing the players for what they can expect, if for no other reason than to give the coaches a better chance at evaluating performances.
"I thought their first two quarterbacks (Michael Vick and Vince Young) looked sharp," said Tomlin about what he saw of the Eagles in their preseason opening win over the Baltimore Ravens. "They were able to keep plays alive with their natural skill sets, which we're all aware of, of course. They've got great skill offensively, they've got great rush-men and cover-people defensively. They're a great football team, and it's going to be a really good challenge for us. I'm glad we're playing these guys. This is the type of challenge we need coming off our last performance."
INJURY REPORT: Tomlin has ruled seven players out of the game: WR Emmanuel Sanders, CBs, Cortez Allen, Crezdon Butler, Bryant McFadden and Ike Taylor, G Chris Kemoeatu and ILB Mario Harvey. "There may be some others," said Tomlin, "but those are the ones we're definitive about in terms of them not participating."
Tomlin also said that James Harrison and Troy Polamalu will play this week after sitting out the opener, and he explained his thinking: "Like Chris (Kemoeatu) this week, they hadn't had enough consistent participation for my comfort, so I didn't play them. They have had that this week, so I am going to play them. And that's why Chris Kemoeatu is not playing Thursday. Even though he had a nice day on Monday, just not enough practices and not enough consistent work leading into a performance opportunity for my comfort. He wants to play, but it's my call."
On Monday, veterans Aaron Smith, Brett Keisel and LaMarr Woodley were given a day off practice, and Tomlin explained his reasons for that, as well: "Guys have training camp-like injuries, minor injuries, swelling in the knees and so forth, particularly when you're working on artificial surfaces. We're just trying to stay ahead of the curve and preserve them. Rotate them in and out in terms of giving them days off in terms of keeping the guys who are veteran Steelers ready to go."
Steelers sign two to Reserve/Future contracts
The Steelers signed Trey Edmunds and Chaz Green to Reserve/Future contracts
The perfect mentor
Isaiahh Loudermilk knows how lucky he was to find the perfect mentor in Cameron Heyward
2022 NFL Key Dates
A detailed look at the 2022 NFL calendar
Harvin understands 'It's okay not to be okay'
Pressley Harvin III dealt with the emotional loss of his father and grandmother during a two-week period last in the season


text:
package com.ibm.watson.text_to_speech.v1.model;

import static org.testng.Assert.*;

import com.ibm.cloud.sdk.core.service.model.FileWithMetadata;
import com.ibm.watson.text_to_speech.v1.utils.TestUtilities;
import java.io.InputStream;
import java.util.HashMap;
import java.util.List;
import org.testng.annotations.Test;

/** Unit test class for the Words model. */
public class WordsTest {
  final HashMap<String, InputStream> mockStreamMap = TestUtilities.createMockStreamMap();
  final List<FileWithMetadata> mockListFileWithMetadata =
      TestUtilities.creatMockListFileWithMetadata();

  @Test
  public void testWords() throws Throwable {
    Word wordModel =
        new Word.Builder()
            .word("testString")
            .translation("testString")
            .partOfSpeech("Dosi")
            .build();
    assertEquals(wordModel.word(), "testString");
    assertEquals(wordModel.translation(), "testString");
    assertEquals(wordModel.partOfSpeech(), "Dosi");

    Words wordsModel = new Words.Builder().words(java.util.Arrays.asList(wordModel)).build();
    assertEquals(wordsModel.words(), java.util.Arrays.asList(wordModel));

    String json = TestUtilities.serialize(wordsModel);

    Words wordsModelNew = TestUtilities.deserialize(json, Words.class);
    assertTrue(wordsModelNew instanceof Words);
  }

  @Test(expectedExceptions = IllegalArgumentException.class)
  public void testWordsError() throws Throwable {
    new Words.Builder().build();
  }
}

redpajama_set_name: RedPajamaGithub


text:
Heikal Foundation of Arab Journalism award opens for submissions on February
Ahram Online , Tuesday 24 Jan 2023
The excellence award in journalism presented annually by Egypt's Heikal Foundation of Arab Journalism will be open for submissions for four months from 1 February to 31 May.
Al-Ahram journalist Ahmed Saeed wins Heikal Foundation of Arab Journalism award in 2020. File photo
The award, presented for the seventh year in a row, commemorates the birth centenary of late renowned Al-Ahram journalist Mohamed Hassanein Heikal, the guru of Egyptian and Arab journalism who died in 2016.
The foundation presents two awards every year, worth EGP 250,000 each, for scoops and investigative reports with the aim of enabling young Arab journalists to develop their skills and drive excellence in the field of journalism.
The applicants are required to be Arab journalists under the age of 40, working at an Arabic language news outlet.
Established in 2007 by Heikal, the foundation aims to nurture excellence and development in the field of journalism across the Arab world.
Heikal, veteran journalist and the ultimate inside storyteller of key political events in Egypt and across the region after World War II, passed away aged 93.
Heikal had seven decades of experience in journalism and served as editor-in-chief of Al-Ahram daily from 1957 to 1974.
He was an adviser to late President Gamal Abdel-Nasser, the country's second president, and became minister of information in 1970.
Mohamed Hassanein Heikal
Egyptian Journalist
Heikal Foundation of Arab Journalism
Pope's Africa trip spotlights conflict, and church's future: AP report
Asian markets take fresh hit as nervous traders await Fed meeting
Also In Society
ECSS to present findings of research project on extremism cost in Egypt at Cairo Book Fair Thursday
More than 75% of Egyptians aware of 'overpopulation problem': Cabinet's information centre survey
Laughing the pain away: How Egyptians talk about the economic crisis in memes
T-shirt weather forecast in South Sinai & Upper Egypt during the day this week
5.8 magnitude earthquake hits eastern Mediterranean, felt in Egypt
Egypt releases first quarterly bulletin to monitor human rights progress
Egypt's Al-Azhar calls on Arab, Muslim peoples to boycott Dutch, Swedish products


We write often about the importance of branding in aviation, the critical need to move away from selling air-service as a commodity or a utility, but we've never heard anyone put it as eloquently or as practically as Mr. Dedekoylu has, nor seen any airline 'get it' quite like this bold low-cost carrier has.
With the unbundled, fees added, sales strategy firmly embedded in the low-cost airline model, and now adopted by former full-service carriers around the world, it's unusual to hear any airline talk about taking a step back and listening to consumer opinions on these retailing strategies.
But that's exactly what Turkey's only low-cost carrier, Pegasus Airlines, has done.
Onur Dedekoylu, Marketing Director at Pegasus Airlines, explained to attendees at the World Low Cost Airlines Congress in London how by following everybody else Pegasus very nearly got it wrong and how it quickly adjusted to do right by taking heed of consumer feedback and thinking like a travel brand.
"We were only two months away from launching the new [unbundled] package structure, and while we were talking about working on the communication route we realized this wouldn't work," said Dedekoylu.
By structuring packages in this way, Pegasus accomplishes the same thing that other airlines offer, in terms of covering costs of extras, but presents it as a solution rather than an impediment. Customers aren't asked to book and then add ancillaries. Instead, they are encouraged to opt for the package that offers them everything they need, at the lowest possible price, and nothing they don't want.
As Dedekoylu presented it, the negative reaction from consumers, came from either being given a choice of solutions, or presented with an impediment to purchase. It's a subtle difference, but an important one to the airline's retail strategy.
That simple change in language and presentation has worked for the airline.
"It's given us a very positive response because for an airline focused on the low-cost model having some strict rules, it was the first time customers heard something like this that gave them the perception that Pegasus is thinking about their customers, no trying to sell something to them," said Dedekoylu.
This consumer-friendly approach was made possible at Pegasus, Dedekoylu explains, because the airline thinks of itself as a travel brand, not an airline; as a travel services provider, instead of merely transport.
"[It's about] being a travel brand rather than an airline travel brand. We need to decide whether we are in the business of transporting a passenger from one place to another," said Dedekoylu.
He also remarked that airlines are missing a great opportunity to present something unique about their service to customers by not thinking of themselves in these terms: that all of the consumers' travel aspirations would be impossible without airlines ready to connect them to far-off places.
This clear and very self-aware brand identity sets Pegasus apart from low-cost peers and, in fact, from many traditional carriers which still haven't decided whether they are in the travel industry or transport sector.
To adjust its brand accordingly, Pegasus has had to make big changes in its retailing strategy, to partner with and compete with larger, more sophisticated, travel industry players.
Dedekoylu is uniquely positioned to bring these insights to his airlines because, before 2010, he did not work in the airline industry. Instead, he has made a career working on consumer goods retailing and branding, at Hasbro and Coca-Cola. He thinks in terms of research and brand analysis in that broader consumer context. He believes there is ample opportunity for airlines to think like consumer-focused companies, and attract travel consumers with solutions that fit their aspirational needs.
"The interaction with the passenger also covers the whole travel experience, not just the booking and the flight experience. We need to create all sorts of channels where people can connect to us for different services or needs during the whole travel experience," Dedekoylu said.
One of the topics of conversation at a separate retailing panel held during the conference was that the industry could use a good jolt of outsider perspective when planning its product offerings. Dedekoylu's work at Pegasus proves that it can make a difference.
"These are things that had simple consumer insights and we acted on them because we decided to listen to consumer insights early, or even later in the process," Dedekoylu said.


Should an SPF be implemented in both sender and receiver in order to avoid spoofing?
SPF must be implemented on the sender's side and the recipient must be doing SPF validation on emails coming into their network.
How to create an SPF record in DNS using Cloudflare?
I have SPF, do I really need DMARC to protect my domain? What does DMARC do that SPF does not?
How does SPF compare to DMARC and why is DMARC needed to stop domain phishing and spoofing?
What is SPF or Sender Policy Framework?
What is an include in SPF?
What is the include statement found in an SPF record?
Most common SPF includes used by well known email providers.
What if my email provider supports only SPF?
My email provider supports only SPF and does not support DKIM, what should I do?
Can I use only SPF and DMARC, without DKIM?
Suggestion on why SPF should be used along with DKIM to improve email deliverability.
What is the +all mechanism in SPF and should I use it?
Information on the +all mechanism in SPF, what it means and why it should not be used in your SPF records.
Which DNS record type is used by SPF?
Information on the record type used by SPF and the old deprecated record type which should not be used.
Does SPF protect my domain from spoofing?
Information on how SPF works, what identifier it uses for authentication and how to protect your domain from being spoofed.
I received an SPF PermError, what caused this? What are some of the causes for an invalid SPF record?
What is a ptr record, how does it work and why it should not be used as a mechanism in an SPF record?
Should I include multiple SPF records in DNS for each service I use?
What is SPF hard fail and SPF soft fail? Here are some examples that illustrate the difference between SPF hard fail and soft fail.


1 Please download firmware file from Samsung.com Support page.
1) Use the full charged battery.
2) Suggested memory card format before upgrade start.
• Before installing the program, ensure that the PC is connected to a network.
• You must plug the small end of the USB cable into your camera. If the cable is reversed, it may damage your files.
3) Turn on the camera.
4) When the pop-up window prompts you to install i-Launcher, select Yes.
• If a pop-up window prompting you to run iLinker.exe appears, run it first.
• When you connect the camera to a computer with i-Launcher installed, the program will launch automatically.
5) Follow the on-screen instructions to complete the installation.
• An i-Launcher shortcut will appear on the computer.
* Automatically "Upgrade window" open if new firmware registered.