For v2003.06.01 Release $Revision: 1.20 $ Support: ------------- Language : C - C++ Features : Component Testing - Code Coverage - Performance Profiling - Memory Profiling - Trace Tested Against: ------------------------ Host Machine : Windows 2000 Compiler : Gnu Compiler 2.95 Linker : Gnu Linker 2.95 Debugger : Tornado 2.2 OS : VxWorks 5.5 Target : VxSim This target deployment port is adapted for VxWorks 5.4 running on an Intel x86 board. Adapt the following setting, representing the target IP address or name: - Basic Settings - For C and For C++: TARGETNAME <targetIP>[@hostname] DEFAULT_DEFINES CPU=<Your VxWorks Architecture>,..... COMPILER,LINKER,DEBUGGER,NM cc<arch>,ld<arch>,gdb<arch>,nm<arch> This TDP uses the WTX API from WindRiver to collect test results. The name of the program is rtrtWtx2.exe. Usage: "rtrtwtx2 [options]" where options can be one or more of the following: -entry <entry point> : Name of the function to start the application -list <comma separated list of objects to load/unload> or .lst file -load : Load then execute the objects listed in -list option -unload : After execution, unload the objects listed in -list option -out <default out file name> : Name of the default out.spt file written -notraces : Do not get result file from target -t <Target Name> : Name of the VxWorks target to attach to -a : Files opened in append mode -v : Debug/verbose mode -b : Stops when the program exits -delay <delay> : Try every second for <delay> seconds to attach to the target The source code for rtrtWtx2 can be found in this TDP so you can recompile it if needed. Note that if you execute the code wdbUserEvtPost("RTRTENDS"); on the target, it will automatically close all the the result files opened on the host machine. c o out CPU=SIMNT,RW_MULTI_THREAD,_REENTRANT,TOOL_FAMILY=gnu,TOOL=gnu -mcpu=pentium -march=pentium -ansi -nostdlib -fno-builtin -fno-defer-pop -g -g -nostdlib -Wl,-X <WIND_BASE: Updated when saved>\target\lib\pentium\PENTIUM\gnu COMPILER ccsimpc PREPROCESSOR ccsimpc LINKER ccsimpc NM nmsimpc NMFLAGS -g DEBUGGER $ENV{'COMSPEC'} /c start /w gdbsimnt ENV_WIND_BASE <WIND_BASE: Updated when saved> ENV_SET_IF_NOT_SET_WIND_HOST_TYPE x86-win32 ENV_TORN_INCLUDE $ENV{'WIND_BASE'}\target\h ENV_PATH $ENV{'WIND_BASE'}\host\$ENV{'WIND_HOST_TYPE'}\bin;$ENV{'PATH'} ENV_LIB $ENV{'WIND_BASE'}\host\$ENV{'WIND_HOST_TYPE'}\lib;$ENV{'LIB'} TARGETNAME vxsim cpp o out CPU=SIMNT,RW_MULTI_THREAD,_REENTRANT -mcpu=pentium -march=pentium -ansi -nostdlib -fno-builtin -fno-defer-pop -g -g -nostdlib -Wl,-X <WIND_BASE: Updated when saved>\target\lib\pentium\PENTIUM\gnu COMPILER ccsimpc PREPROCESSOR ccsimpc LINKER c++simpc NM nmsimpc NMFLAGS -g DEBUGGER $ENV{'COMSPEC'} /c start /w gdbsimnt ENV_WIND_BASE <WIND_BASE: Updated when saved> ENV_SET_IF_NOT_SET_WIND_HOST_TYPE x86-win32 ENV_PATH $ENV{'WIND_BASE'}\host\$ENV{'WIND_HOST_TYPE'}\bin;$ENV{'PATH'} ENV_LIB $ENV{'WIND_BASE'}\host\$ENV{'WIND_HOST_TYPE'}\lib;$ENV{'LIB'} ENV_TORN_INCLUDE $ENV{'WIND_BASE'}\target\h TARGETNAME vxsim sub atl_cc($$$$\@\@) { my ( $lang,$src,$out,$cflags,$Defines,$Includes) = @_; my $defines = ""; foreach (@$Defines) { $defines.=" -D$_"; } $defines.=" -DRTRT_ENTRY=$ATL_MAIN_PROCEDURE" if ($ATL_MAIN_PROCEDURE ne ''); my $includes = ""; foreach(@$Includes) { $_ = ShortPathName($_); $includes.=" \"-I$_\""; } $includes.=" -I."; $includes.=" \"-I$ENV{'TORN_INCLUDE'}\""; my $cc=$Ini{'COMPILER'}; unlink($out); my ($a, $b, $c) = SplitFileName("$src"); # Added to support entry name if ($b eq "TP") { $defines.=" -DSTR_ENTRY=\"$ATL_MAIN_PROCEDURE\" " if ($ATL_MAIN_PROCEDURE ne ''); } $src = ShortPathName($src); my ($d, $e, $f) = SplitFileName("$src"); $src = "$d$b.$c"; my $ret=SystemP("$cc -c $cflags $defines $includes \"$src\" -o \"$out\""); #build the TP as separate object to load if ($out =~ /TP\.o$/) { my $linkPath=$Ini{'LINKER'}; my $nmPath=$Ini{'NM'}; my $nmFlags=$Ini{'NMFLAGS'}; my $ldflags = "$Ini{'DEFAULT_LDFLAGS'} "; my @LibPath = split(/,/,$Ini{'DEFAULT_LIBRARY_PATHS'}); foreach (@LibPath ) { $ldflags .= " \"-L$_\""; } $ret=SystemP("$linkPath $ldflags -r $out -o out1.o"); return($ret) if($ret!=0); $ret=SystemP("$nmPath $nmFlags out1.o | munch > tornTmp.c"); return($ret) if($ret!=0); $ret=&atl_cc("C","tornTmp.c","tornTmp.o","-fdollars-in-identifiers ",\@EmptyList,\@EmptyList); return($ret) if($ret!=0); $ret=SystemP("$linkPath $ldflags -r out1.o tornTmp.o -o $INTDIR\\TP.out"); return($ret) if($ret!=0); unlink("out1.o"); unlink("tornTmp.c"); unlink("tornTmp.o"); } return($ret); } sub atl_cpp($$$$\@\@) { my ( $lang,$src,$out,$cflags,$Defines,$Includes) = @_; my $defines = ""; $defines.=" -DRTRT_ENTRY=$ATL_MAIN_PROCEDURE" if ($ATL_MAIN_PROCEDURE ne ''); foreach (@$Defines) { $defines.=" -D$_"; } my $includes = ""; foreach(@$Includes) { $_ = ShortPathName($_); $includes.=" \"-I$_\""; } $includes.=" -I."; $includes.=" \"-I$ENV{'TORN_INCLUDE'}\""; my $cc=$Ini{'PREPROCESSOR'}; unlink($out); my ($a, $b, $c) = SplitFileName("$src"); $src = ShortPathName($src); my ($d, $e, $f) = SplitFileName("$src"); $src = "$d$b.$c"; my $Status=SystemP("$cc -E $cflags $defines $includes -o atltmp.i \"$src\""); return($Status) if ($Status!=0); SystemP("$BINDIR/fixlines","atltmp.i",$out); unlink("atltmp.i"); return($Status); } 1; sub atl_link($\@$\@$) { my ($exe,$Objects,$ldflags,$LibPath,$libs) = @_; my $linkPath=$Ini{'LINKER'}; my $nmPath=$Ini{'NM'}; my $nmFlags=$Ini{'NMFLAGS'}; my $ret; my $objects = ""; unlink("rtrtobjlist.lst"); open LST, ">rtrtobjlist.lst" ; print LST "$INTDIR\\TP.out\n"; foreach(@$Objects) { print LST $_ if(/\.out$/); next if(/\.out$/); next if(/TP\.o/); $objects.=" \"$_\""; } print LST "$exe\n"; close LST; my $libpath = ""; foreach $L ( @$LibPath ) { $libpath .= " \"-L$L\"" ; } $ret=SystemP("$linkPath -r $ldflags $objects $libpath $libs -o out1.o"); return($ret) if($ret!=0); $ret=SystemP("$nmPath $nmFlags out1.o |munch > tornTmp.c"); return($ret) if($ret!=0); $ret=&atl_cc("C","tornTmp.c","tornTmp.o","-fdollars-in-identifiers ",\@EmptyList,\@EmptyList); return($ret) if($ret!=0); $ret=SystemP("$linkPath -r $ldflags out1.o tornTmp.o -o \"$exe\""); unlink("out1.o"); unlink("tornTmp.c"); unlink("tornTmp.o"); return($ret) if($ret!=0); } 1; sub atl_exec($$$) { my ($exe,$out,$parameters) = @_; my $TargetName=$Ini{'TARGETNAME'}; my $newWin="$ENV{'COMSPEC'} /c start "; my $rtrtWtx="$TARGETDIR\\cmd\\rtrtWtx2.exe"; my $entry = $ATL_MAIN_PROCEDURE; $entry="Tmain" if ($entry eq ''); unlink($out); # # $filesList contains the list of module(s) to be loaded. It may contain more than one. e.g: # my $filesList="obj1.out,obj2.out,$exe,obj3.out"; # my $filesList=$exe; $ret=SystemP("$newWin /w $rtrtWtx -load -unload -list rtrtobjlist.lst -entry $entry -t",$TargetName); RenameFile("tmpatutraces.rio", "$out") if ($ATUMODE); return $ret; } sub atl_execdbg($$$) { my ($exe,$out,$parameters) = @_; my $Debugger=$Ini{'DEBUGGER'}; my $TargetName=$Ini{'TARGETNAME'}; my $newWin="$ENV{'COMSPEC'} /c start "; my $rtrtWtx="$TARGETDIR\\cmd\\rtrtWtx2.exe"; my $entry = $ATL_MAIN_PROCEDURE; $entry="Tmain" if ($entry eq ''); unlink($out); open (OU,">TestRTd.cmd") || die("Cannot open file TestRTd.cmd for write\n"); print(OU "target wtx $TargetName\n"); open (IN,"<rtrtobjlist.lst") || die("Cannot open file rtrtobjlist.lst\n"); while(<IN>) { print(OU "load $_\n"); } close(IN); print(OU "b $entry\n"); print(OU "r $entry\n"); close(OU); my $ret=SystemP("$Debugger -command TestRTd.cmd"); unlink("TestRTd.cmd"); print("CAREFUL: No Report in Debug Mode ! \n"); exit(1); } 1; /********************************************************************** * Module : rtrtWtx2.c * Authors : R.France & B.Cormier & S.Washbrook (IBM Rational) * Date : 8 Jan 2004 * *********************************************************************/ #include <stdlib.h> #include <stdio.h> #ifdef _WIN32 #include <windows.h> #include <process.h> typedef long thread_t; #else #include <pthread.h> #include <thread.h> #define LPTHREAD_START_ROUTINE void *(*)(void *) #define CreateThread thr_create #endif #include <string.h> #include <signal.h> #include <errno.h> #include <wtx.h> /* Use the event notification instead of event polling */ #define EVENTHANDLER /* Max number of modules to load on the target */ #define NB_MODULES_MAX 100 typedef struct file_s { int fNo; FILE *fH; struct file_s *next; } file_t; file_t *fh=NULL; HWTX hWtx; char DEBUG=0; char DISPLAYEVT=0; char NOSTOP=0; char stopAtExit=0; char load=0; char Exec=0; char unload=0; char reset=0; char traceActiv=1; char listenActiv=0; char certKernel=0; enum { up=0, initialized, attached, loading, loaded, started, Tcollected, unloaded } execState = up; int sleepTime = 9; char aborted = 0; char entry[25]; char vxTgt[100]; char fname[200]="atlout.spt"; char *mode="w"; int nbOpen=0; char *objArray[NB_MODULES_MAX]; char objPathName[1024]; int nbModules; int delayBeforeAttach=30; /********************************************************************** * Service : waitFor * This function is waiting for x seconds (x given as a parameter) **********************************************************************/ void waitFor(int s) { #ifdef _WIN32 Sleep(s*1000); #else sleep(s); #endif } /********************************************************************** * Service : blocking * This function stops the execution until ctrl+C **********************************************************************/ void blocking(int ex) { aborted = 0; printf("ctrl+C to terminate\n"); while(!aborted) waitFor(1); exit(ex); } /********************************************************************** * Service : CloseAllFiles * This function closes all traces file **********************************************************************/ void CloseAllFiles() { file_t *newFH,*nextFH; newFH = fh; while(newFH) { fclose(newFH->fH); nextFH = newFH->next; free(newFH); newFH=nextFH; } nbOpen=0; DEBUG && printf ("All File closed\n"); } /********************************************************************** * Service : handleEvt * This function is handling the events sent by the target. There * is 4 kind of events : one to open a file, one to close a file, * one to write a string in a file, and one to close all the open files. * Events are : * RTRTOPENF_<filenumber>_<filename> * RTRTCLOSE_<filenumber> * RTRTWRITE_<filenumber>_<buffer> * RTRTMSG_<buffer> * RTRTENDS **********************************************************************/ void handleEvt(char *evt) { char *tmp, fNumber[6]; file_t *newFH, *prevFH; int i, fNo; DISPLAYEVT && printf("%s\n",evt); if (tmp = strstr(evt, "RTRTWRITE_")) { tmp = tmp + 10; for(i=0; i<5; i++) { fNumber[i]=*tmp++; } fNumber[i]=0; tmp++; /* skip 1 char */ fNo = atoi(fNumber); newFH = fh; while((newFH)&&(newFH->fNo!=fNo)) newFH = newFH->next; if (!newFH) { fNo=10000; newFH = fh; while((newFH)&&(newFH->fNo!=fNo)) newFH = newFH->next; if(newFH == NULL) { newFH = (file_t *)malloc(sizeof(file_t)); newFH->fNo = fNo; newFH->fH = fopen(fname, mode); newFH->next = fh; fh = newFH; printf("write without open, So Buffer written to %s\n",fname); } } fputs(tmp,newFH->fH); fflush(newFH->fH); } else if (tmp = strstr(evt, "RTRTOPENF_")) { tmp = tmp + 10; for(i=0; i<5; i++) { fNumber[i]=*tmp++; } fNumber[i]=0; tmp++; newFH = (file_t *)malloc(sizeof(file_t)); newFH->fNo = atoi(fNumber); newFH->fH = fopen(tmp, mode); newFH->next = fh; fh = newFH; nbOpen++; DEBUG && printf ("File opened fNumber = <%s>\n", fNumber); } else if (tmp = strstr(evt, "RTRTCLOSE_")) { tmp = tmp + 10; fNo = atoi(tmp); prevFH = NULL; newFH = fh; while((newFH)&&(newFH->fNo!=fNo)) { prevFH = newFH; newFH = newFH->next; } if(newFH) { fclose(newFH->fH); if(prevFH) { prevFH->next = newFH->next; } else { fh=newFH->next; } free(newFH); nbOpen--; DEBUG && printf ("File closed tmp = <%s>\n", tmp); } if(nbOpen==0) traceActiv=0; } else if (tmp = strstr(evt, "RTRTENDS")) { /* close all files */ CloseAllFiles(); traceActiv=0; } else if (tmp = strstr(evt, "RTRTMSG_")) { tmp = tmp + 8; printf("\n%s\n", tmp); } else { printf("Unknown event : %s\n", evt); } #ifndef EVENTHANDLER /* Reset the sleep time to zero so as not to miss an event */ sleepTime = 0; #endif } #ifdef EVENTHANDLER /********************************************************************** * Service : handleEvt * This function is handling the events sent by the target. There **********************************************************************/ void eventHandler (WTX_EVENT_DESC *evt) { if (evt!=NULL) { if ((evt->event !=NULL) && (strlen(evt->event)>2)) { if (strstr(evt->event, "VIO_WRITE")) { /* ---------------------CERT-------------------*/ DEBUG && printf("%s (%d)>%s<\n",evt->event,evt->addlDataLen,evt->addlData); if (evt->addlDataLen && strstr(evt->addlData, "RTRT")) { handleEvt(evt->addlData); } /* ---------------------CERT-------------------*/ } else { if (strstr(evt->event, "RTRT")) { handleEvt(evt->event); } } } } } #endif /********************************************************************** * Service : terminateWtx * This function is called before exiting this application. **********************************************************************/ void terminateWtx(HWTX hWtx, int ex) { int j; switch(execState) { case loaded: case started: case Tcollected: case loading: /* unload in reverse order */ if (unload) { printf ("Unloading objects in reverse order\n"); j=nbModules; while((j>=0)&&(objArray[j]!=NULL)) { if (wtxObjModuleByNameUnload(hWtx, objArray[j])!=WTX_OK) { printf("Unable to unload %s\n", objArray[j]); ex=1; } j--; } } case attached: #ifdef EVENTHANDLER if(listenActiv) { wtxAsyncNotifyDisable(hWtx); CloseAllFiles(); } #endif if (reset) { printf("resetting the target...\n"); wtxTargetReset(hWtx); /* on -reset option we reset the target before the end */ } wtxToolDetach(hWtx); case initialized: wtxTerminate(hWtx); case up: case unloaded: if(stopAtExit) blocking(ex); else if((DEBUG || ex) && !NOSTOP) blocking(ex); break; default: printf("Unknown State"); } exit(ex); } #ifndef EVENTHANDLER /********************************************************************** * Service : getEvt * This function is waiting for events in a loop. It exits when all * the files have been closed. **********************************************************************/ void * getEvt(void * no) { WTX_EVENT_DESC *evt; DEBUG && printf("Waiting for event ...\n"); while (traceActiv && (aborted == 0)) { evt = wtxEventGet(hWtx); if ((evt!=NULL) && (strlen(evt->event)>2)) { handleEvt(evt->event); } wtxResultFree(hWtx, evt); /* sleepTime is reset to zero every time a TestRT event is processed */ if (sleepTime > 0) waitFor(sleepTime); if (sleepTime < 8) sleepTime ++; } CloseAllFiles(); /* when aborted files are not closed yet */ traceActiv=0; /* all files are close: now try to unload objects in reverse order */ /* die */ return &traceActiv; /* return anything to be void * compliant */ } void SpawnGetEvt() { thread_t ThreadId; CreateThread( NULL, /* pointer to security attributes */ 0, /* initial thread stack size */ (LPTHREAD_START_ROUTINE) getEvt,/* pointer to thread function */ (void *)&hWtx, /* argument for new thread */ 0, /* creation flags */ &ThreadId);/* pointer to receive thread ID); */ waitFor(1); } #endif /*************************************************************************** * Trap the control-C to exit cleanly ***************************************************************************/ void Control_C_Handler (int sig) { aborted = 1; printf("signal %d...RTRT WTX shuting down!!!...\n",sig); } /*************************************************************************** * Get the object files list ***************************************************************************/ void buildObjectList(int i,char *name) { FILE* pFile; objArray[i]= name; DEBUG && printf ("\tobject[%d] = <%s>\n", i, objArray[i]); /* Check that the file exists */ pFile = fopen (objArray[i], "r"); if (pFile == 0) { printf ("ERROR: The file <%s> does not exist. Check the path to this file\n", objArray[i]); terminateWtx(hWtx, 1); } fclose(pFile); } /*************************************************************************** * Main routine **************************************************************************/ void main(int argc, char *argv[]) { STATUS status; WTX_SYMBOL *wtxSym, *tmpSym; WTX_LD_M_FILE_DESC *pFileDesc, *pFileDescTmp; WTX_CONTEXT_DESC *pContextDesc; char *tmp,*tmps; char tmp2[1024]; int i,j,k,tryNB; WTX_SYM_LIST *lwtxSym; signal (SIGINT, Control_C_Handler); signal (SIGTERM, Control_C_Handler); signal (SIGABRT, Control_C_Handler); signal (SIGILL, Control_C_Handler); signal (SIGFPE, Control_C_Handler); signal (SIGSEGV, Control_C_Handler); #ifdef _WIN32 signal (SIGBREAK, Control_C_Handler); #endif objPathName[0] = '\0'; vxTgt[0] = '\0'; for (i=1; i<argc; i++) { DEBUG && printf ("Treating argument %d <%s>\n", i, argv[i]); if (strcmp(argv[i], "-entry") == 0) { i++; if ((i >= argc) || (argv[i][0] == '-')) { printf ("Missing argument for -entry\n"); terminateWtx(hWtx, 1); } Exec=1; strcpy(entry, argv[i]); } else if (strcmp(argv[i], "-list") == 0) { i++; if ((i >= argc) || (argv[i][0] == '-')) { printf ("Missing argument for -list\n"); terminateWtx(hWtx, 1); } strncpy(objPathName, argv[i],1024); } else if (strcmp(argv[i], "-load") == 0) { load=1; } else if (strcmp(argv[i], "-unload") == 0) { unload=1; } else if (strcmp(argv[i], "-reset") == 0) { reset=1; } else if (strcmp(argv[i], "-notraces") == 0) { traceActiv=0; } else if (strcmp(argv[i], "-a") == 0) { mode="a"; } else if (strcmp(argv[i], "-out") == 0) { i++; if ((i >= argc) || (argv[i][0] == '-')) { printf ("Missing argument for -out\n"); terminateWtx(hWtx, 1); } DEBUG && printf ("\tFileName is <%s>\n", argv[i]); strcpy(fname, argv[i]); } else if (strcmp(argv[i], "-t") == 0) { i++; if ((i >= argc) || (argv[i][0] == '-')) { printf ("Missing argument for -t\n"); terminateWtx(hWtx, 1); } DEBUG && printf ("\ttargetName is <%s>\n", argv[i]); strcpy(vxTgt, argv[i]); } else if (strcmp(argv[i], "-cert") == 0) { certKernel=1; } else if (strcmp(argv[i], "-nostop") == 0) { NOSTOP=1; } else if (strcmp(argv[i], "-v") == 0) { DEBUG=1; } else if (strcmp(argv[i], "-dump") == 0) { DISPLAYEVT=1; } else if (strcmp(argv[i], "-b") == 0) { stopAtExit=1; } else if (strcmp(argv[i], "-delay") == 0) { i++; if ((i >= argc) || (argv[i][0] == '-')) { printf ("Missing argument for -delay\n"); terminateWtx(hWtx, 1); } delayBeforeAttach=atoi(argv[i]); if (delayBeforeAttach <= 0) { printf ("Argument for -delay is not an integer greater than 0.\n"); terminateWtx(hWtx, 1); } } else { printf ("Unknown option <%s>\n",argv[i]); printf ("Usage:\n\trtrtwtx [options]\nWhere options can be one or more of the following:\n"); printf ("\t-entry <entry point> : Name of the function to start the application.\n"); printf ("\t-list <comma separated list of objects to load/unload> or .lst file\n"); printf ("\t-load : Load then execute the objects listed in -list option\n"); printf ("\t-unload : Unload after execution, the objects listed in -list option\n"); printf ("\t-reset : reset the target after execution and unload (if any)\n"); printf ("\t-cert : Using the CERT Kernel\n"); printf ("\t-dump : display any received event from the target\n"); printf ("\t-nostop : let exit what ever the events\n"); printf ("\t-out <default out File Name> : Name of the default out spt file written\n"); printf ("\t-notraces : Do not get result file trace from target\n"); printf ("\t-t <Target Name> : Name of the Tornado target to attach to\n"); printf ("\t-a : Files opened in append mode\n"); printf ("\t-v : Verbose mode\n"); printf ("\t-b : Stops when the program ends (do not exits)\n"); printf ("\t-delay <delay> : Try every second for <delay> seconds to attach to the target server\n"); printf ("\n"); terminateWtx(hWtx, 1); } } if(Exec && !load) { printf ("ERROR: -entry cannot be used without -load\n"); terminateWtx(hWtx, 1); } if(Exec && unload && !traceActiv) { printf ("ERROR: -load and -unload cannot be used together when -notraces is selected\n"); terminateWtx(hWtx, 1); } if(vxTgt[0]==0) { printf ("ERROR: -t <Target Name> is a mandatory option\n"); terminateWtx(hWtx, 1); } if((objPathName[0]==0) && (load || unload)) { printf ("ERROR: -load and -unload options must be used in conjunction of -list\n"); terminateWtx(hWtx, 1); } /* Modules parsing */ for (i=0; i<NB_MODULES_MAX; i++) objArray[i]=NULL; if (objPathName[0] != 0) { DEBUG && printf ("Objects list = <%s>\n", objPathName); for(tmps=tmp=objPathName, k=1, j=0, i=0; k; tmp++) { if(*tmp=='.') j=1; else if((j==1) && (*tmp=='l')) j=2; else if((j==2) && (*tmp=='s')) j=3; else if((j==3) && (*tmp=='t')) j=4; else if ((*tmp==',')||(*tmp==0)) { if(*tmp==0) k=0; *tmp=0; /* mark end of string */ if(j==4) /* means .lst file */ { FILE* pFileLst; DEBUG && printf ("list of file %s\n",tmps); pFileLst = fopen (tmps, "r"); if (pFileLst == 0) { printf ("ERROR: The file <%s> does not exist. Check the path to this file\n", tmps); terminateWtx(hWtx, 1); } else { while(fgets(tmp2,1024,pFileLst) != 0) { j=strlen(tmp2); tmps=(char *)malloc(j+1); strcpy(tmps, tmp2); while((tmps[j] == 0) || (tmps[j]=='\n') || (tmps[j]=='\r')) { tmps[j--]=0; } buildObjectList(i++,tmps); } fclose(pFileLst); } } else { buildObjectList(i++,tmps); } tmps=tmp; tmps++; /* start of name on the next name */ j=0; } if (i > NB_MODULES_MAX) { printf ("ERROR: This tool is limited to %d modules, you have exceeded this limit!\n", NB_MODULES_MAX); terminateWtx(hWtx, 1); } } } /***************************************** * Initializing the WTX layer * ****************************************/ if (wtxInitialize(&hWtx)!=WTX_OK) { printf("Init Error ...\n"); terminateWtx(hWtx, 1); } DEBUG && printf ("wtxInitialize OK\n"); execState=initialized; /***************************************** * Attaching to the target server * ****************************************/ tryNB = 0; while ((status=wtxToolAttach(hWtx, vxTgt, "wtxapp")!=WTX_OK) && (tryNB < delayBeforeAttach)) { tryNB++; if (tryNB == 1) { printf ("Unable to attach to the target server <%s>\n", vxTgt); printf ("Will retry every second for %d seconds\n", delayBeforeAttach); } DEBUG && printf ("Trying to attach (%d/%d)\n", tryNB, delayBeforeAttach); waitFor(1); } if (tryNB == delayBeforeAttach) { printf("Attach Error ... \n"); terminateWtx(hWtx, 1); } DEBUG && printf ("wtxToolAttach OK\n"); execState=attached; if (traceActiv) { /***************************************** Getting traces ****************************************/ /* Registering to user events*/ if (certKernel) { /*---------------- CERT -----------------------*/ if (wtxRegisterForEvent(hWtx, "[UV][SI].*")!=WTX_OK) { printf("Unable to register for VIO event\n"); terminateWtx(hWtx, 1); } /*---------------- CERT -----------------------*/ } else { if (wtxRegisterForEvent(hWtx, "USER.*")!=WTX_OK) { printf("Unable to register for event\n"); terminateWtx(hWtx, 1); } } /* start thread for Event */ #ifdef EVENTHANDLER DEBUG && printf("Waiting for event ...\n"); if(wtxAsyncNotifyEnable(hWtx,(FUNCPTR)eventHandler) != WTX_OK) { printf("Unable to Notify for event\n"); terminateWtx(hWtx, 1); } listenActiv=1; #else SpawnGetEvt(); #endif } if (load) { /***************************************** * Loading object files to target * ****************************************/ execState=loading; printf ("Loading objects onto target\n"); pFileDesc=(WTX_LD_M_FILE_DESC *)malloc(sizeof(WTX_LD_M_FILE_DESC)+1024); if (pFileDesc == 0) { DEBUG && printf ("Loading 1: malloc of %d bytes failed\n",sizeof(WTX_LD_M_FILE_DESC)+1024); printf("Unable to load...\n"); terminateWtx(hWtx, 1); } j=0; while((objArray[j]!=NULL)&&(j<=NB_MODULES_MAX)&&(!aborted)) { int Loaded = 0; DEBUG && printf ("Loading the module <%s>...", objArray[j]); pFileDesc->filename=objArray[j]; pFileDesc->loadFlag=0x6; pFileDesc->nSections=0; pFileDesc->moduleId=WTX_LOAD_FROM_CLIENT; nbModules=j; i = 5; while ((!Loaded) && (!aborted) && (i > 0)) { pFileDescTmp=wtxObjModuleLoad(hWtx, pFileDesc); if(pFileDescTmp == NULL) { i--; /* Retry */ waitFor (1); DEBUG && printf ("retry..."); } else Loaded = 1; } if (Loaded) { DEBUG && printf ("Loaded\n"); } else { /* Get the reason why the load failed */ WTX_ERROR_T errCode = wtxErrGet(hWtx); const char* pMsgErr = wtxErrToMsg (hWtx, errCode); printf ("\nUnable to load <%s> because\n\t%s\n", objArray[j], pMsgErr); terminateWtx(hWtx, 1); } /* Checking for unresolved symbols */ if ((tmpSym=pFileDescTmp->undefSymList.pSymbol)!=NULL) { do { printf("Unresolved symbol : %s (%s)\n", tmpSym->name, objArray[j]); tmpSym = tmpSym->next; } while ((tmpSym) && (!aborted)); } wtxResultFree(hWtx, pFileDescTmp); j++; } if(aborted) terminateWtx(hWtx, 1); DEBUG && printf ("All listed modules loaded!!!\n"); execState=loaded; } if (Exec) { /***************************************** Execution part ****************************************/ printf("Start Execution from %s\n",entry); /* Looking for entry-point */ tmp = (char *)malloc(256); lwtxSym = wtxSymListGet(hWtx, entry, 0, 0, 0); i=1; while ((lwtxSym->pSymbol)&&(i)) { tmp = strstr(lwtxSym->pSymbol->name, entry); tmp=tmp+strlen(entry); if((*tmp==0)||((*tmp=='_')&&(*(tmp+1)=='_'))) i=0; if (i!=0) lwtxSym->pSymbol = lwtxSym->pSymbol->next; } if (!(lwtxSym->pSymbol)) { printf("Unable to find entry point\n"); terminateWtx(hWtx, 1); } if((wtxSym = wtxSymFind(hWtx, lwtxSym->pSymbol->name, 0, TRUE, 0, 0))==NULL) { printf("wtxSymFind error\n"); terminateWtx(hWtx, 1); } /* Spawning task on target */ pContextDesc=(WTX_CONTEXT_DESC *)malloc(sizeof(WTX_CONTEXT_DESC)+1024); pContextDesc->contextType =4; pContextDesc->returnType = 0; pContextDesc->name = entry; pContextDesc->priority = 100; pContextDesc->options = 0; pContextDesc->stackSize = 16000; pContextDesc->entry = wtxSym->value; pContextDesc->redirIn = 0; pContextDesc->redirOut = 1; for(i=0; i<10; i++) pContextDesc->args[i] = 0; wtxFuncCall(hWtx, pContextDesc); wtxResultFree(hWtx, wtxSym); wtxResultFree(hWtx, tmpSym); DEBUG && printf("Execution started\n"); execState=started; } /***************************************** wait end of execution ****************************************/ /* wait for unload */ while(traceActiv) waitFor(5); execState=Tcollected; /***************************************** Unload part ****************************************/ /* all files are close: now try to unload objects in reverse order */ if(unload==0) execState=attached; terminateWtx(hWtx, 0); } @echo off cl.exe rtrtWtx.c /W3 /I "<WIND_BASE: Updated when saved>\host\include" /D HOST /link wtxapidll.lib "/libpath:<WIND_BASE: Updated when saved>\host\x86-win32\lib" del rtrtWtx.obj pause use File::Copy; sub postGen { my $dir=shift; my @arg; my $WindBase=$ENV{'WIND_BASE'}; if ($WindBase eq "") { # Read WIND_BASE in tp.ini require("$SCRIPTDIR/Fcts.pl"); require("$SCRIPTDIR/GccUpdate.pl"); $ENV{'ATLTGT'}=$dir; $INIFILE="tp.ini"; DecodeIniFile(); $WindBase=$ENV{'WIND_BASE'}; if($WindBase eq "<WIND_BASE: Updated when saved>") { if ($^O =~/Win32/i) { require Win32::TieRegistry; import Win32::TieRegistry; my $Key=$Registry->{"HKEY_LOCAL_MACHINE\\SOFTWARE\\Wind River Systems"}; # Is Tornado installed unless ($Key) { print "Tornado not installed\n"; return 0; } $WindBase = $Key->{"WIND_BASE"}; unless($WindBase) { print "Tornado not installed\n"; return 0; } } else { print "WIND_BASE env variable is not set\n"; return(0); } } } # Patch the tp.ini file. my $atl_cc_in = $dir ."/tp.ini"; my $atl_cc_out = $dir ."/tp.ini.out"; open (IN, $atl_cc_in) or print "Can't open \"$atl_cc_in\"\n"; open (OUT, ">".$atl_cc_out) or print "Can't open \"$atl_cc_out\"\n"; while (<IN>) { ~s/<WIND_BASE: Updated when saved>/$WindBase/g; print OUT; } close (IN); close (OUT); # Rename the out file as the infile unlink ($atl_cc_in); rename ($atl_cc_out, $atl_cc_in); # Patch the tpcpp.ini file. $atl_cc_in = $dir ."/tpcpp.ini"; $atl_cc_out = $dir ."/tpcpp.ini.out"; open (IN, $atl_cc_in) or print "Can't open \"$atl_cc_in\"\n"; open (OUT, ">".$atl_cc_out) or print "Can't open \"$atl_cc_out\"\n"; while (<IN>) { ~s/<WIND_BASE: Updated when saved>/$WindBase/g; print OUT; } close (IN); close (OUT); # Rename the out file as the infile unlink ($atl_cc_in); rename ($atl_cc_out, $atl_cc_in); if($^O =~/Win32/i) { # Patch the ccWtx.bat file. $atl_cc_in = $dir ."\\cmd\\ccWtx.bat"; $atl_cc_out = $dir ."\\cmd\\ccWtx.bat.out"; } else { # Patch the ccWtx.sh file. $atl_cc_in = $dir ."/cmd/ccWtx.sh"; $atl_cc_out = $dir ."/cmd/ccWtx.sh.out"; } open (IN, $atl_cc_in) or print "Can't open \"$atl_cc_in\"\n"; open (OUT, ">".$atl_cc_out) or print "Can't open \"$atl_cc_out\"\n"; while (<IN>) { ~s/<WIND_BASE: Updated when saved>/$WindBase/g; print OUT; } close (IN); close (OUT); # Rename the out file as the infile unlink ($atl_cc_in); rename ($atl_cc_out, $atl_cc_in); # # Read the compiler in tp.ini # require("$SCRIPTDIR/Fcts.pl"); require("$SCRIPTDIR/GccUpdate.pl"); $ENV{'ATLTGT'}=$dir; $INIFILE="tp.ini"; DecodeIniFile(); push(@arg,"-compiler=$Ini{'COMPILER'} $Ini{'DEFAULT_CPPFLAGS'} $Ini{'DEFAULT_CFLAGS'} -I$Ini{'ENV_TORN_INCLUDE'}"); push(@arg,"$dir/ana/atct.def"); push(@arg,"$dir/ana/atus_c.def"); push(@arg,"$dir/ana/atus_cpp.def"); push(@arg,"$dir/ana/atl.opp"); push(@arg,"$dir/ana/atl.hpp"); GccUpdate(@arg); } 1; TVqQAAMAAAAEAAAA//8AALgAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAA4AAAAA4fug4AtAnNIbgBTM0hVGhpcyBwcm9ncmFtIGNhbm5vdCBiZSBydW4gaW4gRE9TIG1v ZGUuDQ0KJAAAAAAAAADLo0Woj8Ir+4/CK/uPwiv7j8Iq+6HCK/vt3Tj7jcIr+2fdIPuOwiv7DN4l +4DCK/sI3in7nMIr+2fdIfu0wiv7UmljaI/CK/sAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABQRQAA TAEDAFdq/T8AAAAAAAAAAOAADwELAQYAAHAAAABQAAAAAAAAnTIAAAAQAAAAgAAAAABAAAAQAAAA EAAABAAAAAAAAAAEAAAAAAAAAADQAAAAEAAAAAAAAAMAAAAAABAAABAAAAAAEAAAEAAAAAAAABAA AAAAAAAAAAAAANiEAAA8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAA/AAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAC50ZXh0AAAA2mQAAAAQAAAAcAAAABAAAAAAAAAAAAAAAAAAACAAAGAu cmRhdGEAAEIKAAAAgAAAABAAAACAAAAAAAAAAAAAAAAAAABAAABALmRhdGEAAAAcMQAAAJAAAAAg AAAAkAAAAAAAAAAAAAAAAAAAQAAAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 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 AIPEBIlF4ItN4IPBAVHoBAwAAIPEBImF0Pv//42V2Pv//1KLhdD7//9Q6GEPAACDxAiLjdD7//8D TeAPvhGF0nQii4XQ+///A0XgD74Ig/kKdBGLldD7//8DVeAPvgKD+A11F4uN0Pv//wNN4MYBAItV 4IPqAYlV4Ou3i4XQ+///UItN7ImNuPv//4uVuPv//1KLReyDwAGJRezoA/b//4PECOkq////i43I +///UeiKCQAAg8QE6yiLldD7//9Si0XsiYW0+///i420+///UYtV7IPCAYlV7OjF9f//g8QIi0X4 iYXQ+///i43Q+///g8EBiY3Q+///x0XgAAAAAIN97GR+IGpkaNCZQADozAgAAIPECGoBixXAq0AA Uuj08///g8QI6YH9//9owKtAAOihBwAAg8QEhcB0HWgcmkAA6JgIAACDxARqAaHAq0AAUOjB8/// g8QID74NNKVAAIXJdA1oLJpAAOhwCAAAg8QExwVApUAAAQAAAMdF9AAAAABoQJpAAGggp0AAixXA q0AAUug4BwAAg8QM99gbwPfYiYXU+///g73U+///AHRyi0X0OwUEkUAAfWeLTfSDwQGJTfSDffQB dSZoIKdAAGhImkAA6AUIAACDxAiLFQSRQABSaHSaQADo8QcAAIPECA++BTSlQACFwHQYiw0EkUAA UYtV9FJonJpAAOjOBwAAg8QMagHo1u3//4PEBOlg////i0X0OwUEkUAAdR5ouJpAAOinBwAAg8QE agGLDcCrQABR6M/y//+DxAgPvhU0pUAAhdJ0DWjMmkAA6H4HAACDxATHBUClQAACAAAAD74FMJBA AIXAD4TNAAAAD74NPaVAAIXJdDdo4JpAAIsVwKtAAFLoMgYAAIPECIXAdB1o7JpAAOg1BwAAg8QE agGhwKtAAFDoXvL//4PECOs2aBCbQACLDcCrQABR6PsFAACDxAiFwHQeaBibQADo/gYAAIPEBGoB ixXAq0AAUugm8v//g8QID74FNKVAAIXAdA1oOJtAAOjVBgAAg8QEaFsUQACLDcCrQABR6KcFAACD xAiFwHQeaFCbQADosAYAAIPEBGoBixXAq0AAUujY8f//g8QIxgU8pUAAAQ++BTilQACFwA+EmwIA AMcFQKVAAAMAAABobJtAAOhyBgAAg8QEaBgEAADonggAAIPEBIlF6IN96AB1Ow++DTSlQACFyXQS aBgEAABojJtAAOg/BgAAg8QIaLSbQADoMgYAAIPEBGoBixXAq0AAUuha8f//g8QIx0XgAAAAAItF 4IM8heCrQAAAD4TdAQAAg33gZA+P0wEAAA++DUSlQACFyQ+FxAEAAMeFxPv//wAAAAAPvhU0pUAA hdJ0GItF4IsMheCrQABRaMibQADowwUAAIPECItV6ItF4IsMheCrQACJCotV6MdCBAYAAACLRejH QAwAAAAAi03ox0EIAAAAAItV4IkVhKdAAMdF7AUAAACDvcT7//8AdWYPvgVEpUAAhcB1W4N97AB+ VYtN6FGLFcCrQABS6DkEAACDxAiJRdiDfdgAdS2LReyD6AGJRexqAehP6///g8QED74NNKVAAIXJ dA1o5JtAAOglBQAAg8QE6wrHhcT7//8BAAAA65GDvcT7//8AdBoPvhU0pUAAhdJ0DWjwm0AA6PYE AACDxATrX6HAq0AAUOjAAwAAg8QEiYXA+///i43A+///UYsVwKtAAFLongMAAIPECImFvPv//4uF vPv//1CLTeCLFI3gq0AAUmj4m0AA6KUEAACDxAxqAaHAq0AAUOjO7///g8QIi03Yi1EUiVXkg33k AHQ5i0XgiwyF4KtAAFGLVeSLQghQaBycQADoZwQAAIPEDItN5ItRIIlV5IN95AB0Cw++BUSlQACF wHTHi03YUYsVwKtAAFLoCAMAAIPECItF4IPAAYlF4OkS/v//D74NRKVAAIXJdBFqAYsVwKtAAFLo Se///4PECA++BTSlQACFwHQNaDycQADo+AMAAIPEBMcFQKVAAAQAAAAPvg05pUAAhckPhDACAABo oKdAAGhcnEAA6M0DAACDxAhoAAEAAOj5BQAAg8QEiUX4agBqAGoAaKCnQACLFcCrQABS6GsCAACD xBSJhcz7///HRewBAAAAi4XM+///gzgAdH2DfewAdHdooKdAAIuNzPv//4sRi0IIUOi+BgAAg8QI iUX4aKCnQADoLgcAAIPEBItN+APIiU34i1X4D74ChcB0F4tN+A++EYP6X3UTi0X4D75IAYP5X3UH x0XsAAAAAIN97AB0E4uVzPv//4sCi43M+///i1AgiRHpeP///4uFzPv//4M4AHUeaHicQADo9gIA AIPEBGoBiw3Aq0AAUege7v//g8QIagBqAGoBagCLlcz7//+LAotICFGLFcCrQABS6IQBAACDxBiJ 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 AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAASiAAAJIoA ABSKAAAEigAA9IkAAOKJAADWiQAAzIkAAMCJAAC0iQAAookAAJCJAAB6iQAAbIkAAFqJAAA6hwAA QocAAFCHAABkhwAAeIcAAISHAACQhwAAoIcAALiHAADKhwAA2IcAAOaHAAD0hwAAAogAAEqJAAC0 iAAAIIgAAC6IAABCiAAATogAAGqIAACAiAAAmogAAMqIAADiiAAA/IgAAA6JAAAeiQAALIkAAD6J AAAAAAAAHocAAA6HAAD4hgAA4IYAAMyGAADAhgAAsoYAAKKGAACShgAAhIYAAHaGAABahgAAQoYA ADCGAAAghgAAEIYAAAAAAAAAAAAA/////10zQABxM0AABgAABgABAAAQAAMGAAYCEARFRUUFBQUF BTUwAFAAAAAAICg4UFgHCAA3MDBXUAcAACAgCAAAAAAIYGhgYGBgAABwcHh4eHgIBwgAAAcACAgI AAAIAAgABwgAAAAoAG4AdQBsAGwAKQAAAAAAKG51bGwpAABydW50aW1lIGVycm9yIAAADQoAAFRM T1NTIGVycm9yDQoAAABTSU5HIGVycm9yDQoAAAAARE9NQUlOIGVycm9yDQoAAFI2MDI4DQotIHVu YWJsZSB0byBpbml0aWFsaXplIGhlYXANCgAAAABSNjAyNw0KLSBub3QgZW5vdWdoIHNwYWNlIGZv ciBsb3dpbyBpbml0aWFsaXphdGlvbg0KAAAAAFI2MDI2DQotIG5vdCBlbm91Z2ggc3BhY2UgZm9y IHN0ZGlvIGluaXRpYWxpemF0aW9uDQoAAAAAUjYwMjUNCi0gcHVyZSB2aXJ0dWFsIGZ1bmN0aW9u IGNhbGwNCgAAAFI2MDI0DQotIG5vdCBlbm91Z2ggc3BhY2UgZm9yIF9vbmV4aXQvYXRleGl0IHRh YmxlDQoAAAAAUjYwMTkNCi0gdW5hYmxlIHRvIG9wZW4gY29uc29sZSBkZXZpY2UNCgAAAABSNjAx OA0KLSB1bmV4cGVjdGVkIGhlYXAgZXJyb3INCgAAAABSNjAxNw0KLSB1bmV4cGVjdGVkIG11bHRp dGhyZWFkIGxvY2sgZXJyb3INCgAAAABSNjAxNg0KLSBub3QgZW5vdWdoIHNwYWNlIGZvciB0aHJl YWQgZGF0YQ0KAA0KYWJub3JtYWwgcHJvZ3JhbSB0ZXJtaW5hdGlvbg0KAAAAAFI2MDA5DQotIG5v dCBlbm91Z2ggc3BhY2UgZm9yIGVudmlyb25tZW50DQoAUjYwMDgNCi0gbm90IGVub3VnaCBzcGFj ZSBmb3IgYXJndW1lbnRzDQoAAABSNjAwMg0KLSBmbG9hdGluZyBwb2ludCBub3QgbG9hZGVkDQoA AAAATWljcm9zb2Z0IFZpc3VhbCBDKysgUnVudGltZSBMaWJyYXJ5AAAAAAoKAABSdW50aW1lIEVy cm9yIQoKUHJvZ3JhbTogAAAALi4uADxwcm9ncmFtIG5hbWUgdW5rbm93bj4AAAAAAAAAAAAA//// /zdpQAA7aUAAR2V0TGFzdEFjdGl2ZVBvcHVwAABHZXRBY3RpdmVXaW5kb3cATWVzc2FnZUJveEEA dXNlcjMyLmRsbAAA/////x9zQAAjc0AA/////9NzQADXc0AAzIUAAAAAAAAAAAAALocAALiAAAAU hQAAAAAAAAAAAAA0igAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEogAACSKAAAUigAABIoAAPSJ AADiiQAA1okAAMyJAADAiQAAtIkAAKKJAACQiQAAeokAAGyJAABaiQAAOocAAEKHAABQhwAAZIcA AHiHAACEhwAAkIcAAKCHAAC4hwAAyocAANiHAADmhwAA9IcAAAKIAABKiQAAtIgAACCIAAAuiAAA QogAAE6IAABqiAAAgIgAAJqIAADKiAAA4ogAAPyIAAAOiQAAHokAACyJAAA+iQAAAAAAAB6HAAAO hwAA+IYAAOCGAADMhgAAwIYAALKGAACihgAAkoYAAISGAAB2hgAAWoYAAEKGAAAwhgAAIIYAABCG AAAAAAAAhQB3dHhUZXJtaW5hdGUAAIoAd3R4VG9vbERldGFjaACCAHd0eFRhcmdldFJlc2V0AAAH AHd0eEFzeW5jTm90aWZ5RGlzYWJsZQBRAHd0eE9iak1vZHVsZUJ5TmFtZVVubG9hZAAAOwB3dHhG dW5jQ2FsbAB0AHd0eFN5bUZpbmQAAHgAd3R4U3ltTGlzdEdldABjAHd0eFJlc3VsdEZyZWUAJgB3 dHhFcnJUb01zZwAhAHd0eEVyckdldABYAHd0eE9iak1vZHVsZUxvYWQAAAgAd3R4QXN5bmNOb3Rp ZnlFbmFibGUAAGAAd3R4UmVnaXN0ZXJGb3JFdmVudACIAHd0eFRvb2xBdHRhY2gAQAB3dHhJbml0 aWFsaXplAHd0eGFwaS5kbGwAAJYCU2xlZXAAfQBFeGl0UHJvY2VzcwCeAlRlcm1pbmF0ZVByb2Nl c3MAAPcAR2V0Q3VycmVudFByb2Nlc3MAnwFIZWFwRnJlZQAAmQFIZWFwQWxsb2MAGgFHZXRMYXN0 RXJyb3IAAEECU2V0Q29uc29sZUN0cmxIYW5kbGVyAMoAR2V0Q29tbWFuZExpbmVBAHQBR2V0VmVy c2lvbgAAnQFIZWFwRGVzdHJveQCbAUhlYXBDcmVhdGUAAL8CVmlydHVhbEZyZWUAuwJWaXJ0dWFs QWxsb2MAAKIBSGVhcFJlQWxsb2MAGwBDbG9zZUhhbmRsZQCqAEZsdXNoRmlsZUJ1ZmZlcnMAAN8C V3JpdGVGaWxlAK0CVW5oYW5kbGVkRXhjZXB0aW9uRmlsdGVyAAAkAUdldE1vZHVsZUZpbGVOYW1l QQAAsgBGcmVlRW52aXJvbm1lbnRTdHJpbmdzQQCzAEZyZWVFbnZpcm9ubWVudFN0cmluZ3NXANIC V2lkZUNoYXJUb011bHRpQnl0ZQAGAUdldEVudmlyb25tZW50U3RyaW5ncwAIAUdldEVudmlyb25t ZW50U3RyaW5nc1cAAG0CU2V0SGFuZGxlQ291bnQAAFIBR2V0U3RkSGFuZGxlAAAVAUdldEZpbGVU eXBlAFABR2V0U3RhcnR1cEluZm9BAC8CUnRsVW53aW5kAHwCU2V0U3RkSGFuZGxlAABqAlNldEZp bGVQb2ludGVyAAA0AENyZWF0ZUZpbGVBAOQBTXVsdGlCeXRlVG9XaWRlQ2hhcgBTAUdldFN0cmlu Z1R5cGVBAABWAUdldFN0cmluZ1R5cGVXAAAYAlJlYWRGaWxlAAC/AEdldENQSW5mbwC5AEdldEFD UAAAMQFHZXRPRU1DUAAAPgFHZXRQcm9jQWRkcmVzcwAAwgFMb2FkTGlicmFyeUEAAGECU2V0RW5k T2ZGaWxlAAC/AUxDTWFwU3RyaW5nQQAAwAFMQ01hcFN0cmluZ1cAAEtFUk5FTDMyLmRsbAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAmTxA AIVvQAAAAAAAAAAAAD49QAAAAAAAAAAAAAAAAAAAAAAAAQAAAAkAAABhdGxvdXQuc3B0AAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAiRQAAeAAAAdwAAAGN0cmwrQyB0byB0ZXJtaW5hdGUKAAAAAEFsbCBGaWxl IGNsb3NlZAoAAAAAJXMKAFJUUlRXUklURV8AAHdyaXRlIHdpdGhvdXQgb3BlbiwgU28gQnVmZmVy IHdyaXR0ZW4gdG8gJXMKAAAAAFJUUlRPUEVORl8AAEZpbGUgb3BlbmVkIGZOdW1iZXIgPSA8JXM+ CgBSVFJUQ0xPU0VfAABGaWxlIGNsb3NlZCB0bXAgPSA8JXM+CgBSVFJURU5EUwAAAABSVFJUTVNH XwAAAAAKJXMKAAAAAFVua25vd24gZXZlbnQgOiAlcwoAVklPX1dSSVRFAAAAJXMgKCVkKT4lczwK AAAAAFJUUlQAAAAAUlRSVAAAAABVbmxvYWRpbmcgb2JqZWN0cyBpbiByZXZlcnNlIG9yZGVyCgBV bmFibGUgdG8gdW5sb2FkICVzCgAAAAByZXNldHRpbmcgdGhlIHRhcmdldC4uLgoAAAAAVW5rbm93 biBTdGF0ZQAAAHNpZ25hbCAlZC4uLlJUUlQgV1RYIHNodXRpbmcgZG93biEhIS4uLgoAAAAACW9i amVjdFslZF0gPSA8JXM+CgByAAAARVJST1I6IFRoZSBmaWxlIDwlcz4gZG9lcyBub3QgZXhpc3Qu IENoZWNrIHRoZSBwYXRoIHRvIHRoaXMgZmlsZQoAAABUcmVhdGluZyBhcmd1bWVudCAlZCA8JXM+ CgAALWVudHJ5AABNaXNzaW5nIGFyZ3VtZW50IGZvciAtZW50cnkKAAAAAC1saXN0AAAATWlzc2lu ZyBhcmd1bWVudCBmb3IgLWxpc3QKAC1sb2FkAAAALXVubG9hZAAtcmVzZXQAAC1ub3RyYWNlcwAA AC1hAABhAAAALW91dAAAAABNaXNzaW5nIGFyZ3VtZW50IGZvciAtb3V0CgAACUZpbGVOYW1lIGlz IDwlcz4KAAAtdAAATWlzc2luZyBhcmd1bWVudCBmb3IgLXQKAAAAAAl0YXJnZXROYW1lIGlzIDwl cz4KAAAAAC1jZXJ0AAAALW5vc3RvcAAtdgAALWR1bXAAAAAtYgAALWRlbGF5AABNaXNzaW5nIGFy Z3VtZW50IGZvciAtZGVsYXkKAAAAAEFyZ3VtZW50IGZvciAtZGVsYXkgaXMgbm90IGFuIGludGVn ZXIgZ3JlYXRlciB0aGFuIDAuCgAAVW5rbm93biBvcHRpb24gPCVzPgoAAAAAVXNhZ2U6CglydHJ0 d3R4IFtvcHRpb25zXQpXaGVyZSBvcHRpb25zIGNhbiBiZSBvbmUgb3IgbW9yZSBvZiB0aGUgZm9s bG93aW5nOgoAAAAJLWVudHJ5IDxlbnRyeSBwb2ludD4gOiBOYW1lIG9mIHRoZSBmdW5jdGlvbiB0 byBzdGFydCB0aGUgYXBwbGljYXRpb24uCgAJLWxpc3QgPGNvbW1hIHNlcGFyYXRlZCBsaXN0IG9m IG9iamVjdHMgdG8gbG9hZC91bmxvYWQ+IG9yIC5sc3QgZmlsZQoAAAAJLWxvYWQgOiBMb2FkIHRo ZW4gZXhlY3V0ZSB0aGUgb2JqZWN0cyBsaXN0ZWQgaW4gLWxpc3Qgb3B0aW9uCgAACS11bmxvYWQg OiBVbmxvYWQgYWZ0ZXIgZXhlY3V0aW9uLCB0aGUgb2JqZWN0cyBsaXN0ZWQgaW4gLWxpc3Qgb3B0 aW9uCgAACS1yZXNldCA6IHJlc2V0IHRoZSB0YXJnZXQgYWZ0ZXIgZXhlY3V0aW9uIGFuZCB1bmxv YWQgKGlmIGFueSkKAAktY2VydCA6IFVzaW5nIHRoZSBDRVJUIEtlcm5lbAoACS1kdW1wIDogZGlz cGxheSBhbnkgcmVjZWl2ZWQgZXZlbnQgZnJvbSB0aGUgdGFyZ2V0CgAAAAAJLW5vc3RvcCA6IGxl dCBleGl0IHdoYXQgZXZlciB0aGUgZXZlbnRzCgAAAAktb3V0IDxkZWZhdWx0IG91dCBGaWxlIE5h bWU+IDogTmFtZSBvZiB0aGUgZGVmYXVsdCBvdXQgc3B0IGZpbGUgd3JpdHRlbgoAAAAJLW5vdHJh Y2VzIDogRG8gbm90IGdldCByZXN1bHQgZmlsZSB0cmFjZSBmcm9tIHRhcmdldAoAAAktdCA8VGFy Z2V0IE5hbWU+IDogTmFtZSBvZiB0aGUgVG9ybmFkbyB0YXJnZXQgdG8gYXR0YWNoIHRvCgAAAAAJ LWEgOiBGaWxlcyBvcGVuZWQgaW4gYXBwZW5kIG1vZGUKAAAJLXYgOiBWZXJib3NlIG1vZGUKAAkt YiA6IFN0b3BzIHdoZW4gdGhlIHByb2dyYW0gZW5kcyAoZG8gbm90IGV4aXRzKQoAAAAJLWRlbGF5 IDxkZWxheT4gOiBUcnkgZXZlcnkgc2Vjb25kIGZvciA8ZGVsYXk+IHNlY29uZHMgdG8gYXR0YWNo IHRvIHRoZSB0YXJnZXQgc2VydmVyCgAACgAAAEVSUk9SOiAtZW50cnkgY2Fubm90IGJlIHVzZWQg d2l0aG91dCAtbG9hZAoARVJST1I6IC1sb2FkIGFuZCAtdW5sb2FkIGNhbm5vdCBiZSB1c2VkIHRv Z2V0aGVyIHdoZW4gLW5vdHJhY2VzIGlzIHNlbGVjdGVkCgAAAABFUlJPUjogLXQgPFRhcmdldCBO YW1lPiBpcyBhIG1hbmRhdG9yeSBvcHRpb24KAABFUlJPUjogLWxvYWQgYW5kIC11bmxvYWQgb3B0 aW9ucyBtdXN0IGJlIHVzZWQgaW4gY29uanVuY3Rpb24gb2YgLWxpc3QKAABPYmplY3RzIGxpc3Qg PSA8JXM+CgAAAABsaXN0IG9mIGZpbGUgJXMKAAAAAHIAAABFUlJPUjogVGhlIGZpbGUgPCVzPiBk b2VzIG5vdCBleGlzdC4gQ2hlY2sgdGhlIHBhdGggdG8gdGhpcyBmaWxlCgAAAEVSUk9SOiBUaGlz IHRvb2wgaXMgbGltaXRlZCB0byAlZCBtb2R1bGVzLCB5b3UgaGF2ZSBleGNlZWRlZCB0aGlzIGxp bWl0IQoAAABJbml0IEVycm9yIC4uLgoAd3R4SW5pdGlhbGl6ZSBPSwoAAAB3dHhhcHAAAFVuYWJs ZSB0byBhdHRhY2ggdG8gdGhlIHRhcmdldCBzZXJ2ZXIgPCVzPgoAV2lsbCByZXRyeSBldmVyeSBz ZWNvbmQgZm9yICVkIHNlY29uZHMKAFRyeWluZyB0byBhdHRhY2ggKCVkLyVkKQoAAABBdHRhY2gg RXJyb3IgLi4uIAoAAHd0eFRvb2xBdHRhY2ggT0sKAAAAW1VWXVtTSV0uKgAAVW5hYmxlIHRvIHJl Z2lzdGVyIGZvciBWSU8gZXZlbnQKAAAAVVNFUi4qAABVbmFibGUgdG8gcmVnaXN0ZXIgZm9yIGV2 ZW50CgAAAFdhaXRpbmcgZm9yIGV2ZW50IC4uLgoAAFVuYWJsZSB0byBOb3RpZnkgZm9yIGV2ZW50 CgBMb2FkaW5nIG9iamVjdHMgb250byB0YXJnZXQKAAAAAExvYWRpbmcgMTogbWFsbG9jIG9mICVk IGJ5dGVzIGZhaWxlZAoAAABVbmFibGUgdG8gbG9hZC4uLgoAAExvYWRpbmcgdGhlIG1vZHVsZSA8 JXM+Li4uAAByZXRyeS4uLgAAAABMb2FkZWQKAApVbmFibGUgdG8gbG9hZCA8JXM+IGJlY2F1c2UK CSVzCgAAAFVucmVzb2x2ZWQgc3ltYm9sIDogJXMgKCVzKQoAAAAAQWxsIGxpc3RlZCBtb2R1bGVz IGxvYWRlZCEhIQoAAABTdGFydCBFeGVjdXRpb24gZnJvbSAlcwoAAAAAVW5hYmxlIHRvIGZpbmQg ZW50cnkgcG9pbnQKAHd0eFN5bUZpbmQgZXJyb3IKAAAARXhlY3V0aW9uIHN0YXJ0ZWQKAAAAAAAA KilAAAEAAAB4gUAAaIFAAACxQAAAAAAAALFAAAEBAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAA AAAAAgAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAgAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAA+AMAAGKfQABin0AAAAAgACAAIAAgACAA IAAgACAAIAAoACgAKAAoACgAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAASAAQ ABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEACEAIQAhACEAIQAhACEAIQAhACEABAAEAAQABAA EAAQABAAgQCBAIEAgQCBAIEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQAB ABAAEAAQABAAEAAQAIIAggCCAIIAggCCAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIA AgACAAIAAgAQABAAEAAQACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAC4AAAAB AAAABQAAwAsAAAAAAAAAHQAAwAQAAAAAAAAAlgAAwAQAAAAAAAAAjQAAwAgAAAAAAAAAjgAAwAgA AAAAAAAAjwAAwAgAAAAAAAAAkAAAwAgAAAAAAAAAkQAAwAgAAAAAAAAAkgAAwAgAAAAAAAAAkwAA wAgAAAAAAAAAAwAAAAcAAAAKAAAAjAAAAP////8ACgAAIAWTGQAAAAAAAAAAAAAAAAIAAADkg0AA CAAAALiDQAAJAAAAjINAAAoAAABog0AAEAAAADyDQAARAAAADINAABIAAADogkAAEwAAALyCQAAY AAAAhIJAABkAAABcgkAAGgAAACSCQAAbAAAA7IFAABwAAADEgUAAeAAAALSBQAB5AAAApIFAAHoA AACUgUAA/AAAAJCBQAD/AAAAgIFAACpwQAAqcEAAKnBAACpwQAAqcEAAKnBAAAAAAAAAAAAAAQAA ABYAAAACAAAAAgAAAAMAAAACAAAABAAAABgAAAAFAAAADQAAAAYAAAAJAAAABwAAAAwAAAAIAAAA DAAAAAkAAAAMAAAACgAAAAcAAAALAAAACAAAAAwAAAAWAAAADQAAABYAAAAPAAAAAgAAABAAAAAN AAAAEQAAABIAAAASAAAAAgAAACEAAAANAAAANQAAAAIAAABBAAAADQAAAEMAAAACAAAAUAAAABEA AABSAAAADQAAAFMAAAANAAAAVwAAABYAAABZAAAACwAAAGwAAAANAAAAbQAAACAAAABwAAAAHAAA AHIAAAAJAAAABgAAABYAAACAAAAACgAAAIEAAAAKAAAAggAAAAkAAACDAAAAFgAAAIQAAAANAAAA kQAAACkAAACeAAAADQAAAKEAAAACAAAApAAAAAsAAACnAAAADQAAALcAAAARAAAAzgAAAAIAAADX AAAACwAAABgHAAAMAAAAAAAAAAAAAAABAgQIAAAAAKQDAABggnmCIQAAAAAAAACm3wAAAAAAAKGl AAAAAAAAgZ/g/AAAAABAfoD8AAAAAKgDAADBo9qjIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgf4A AAAAAABA/gAAAAAAALUDAADBo9qjIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgf4AAAAAAABB/gAA AAAAALYDAADPouSiGgDlouiiWwAAAAAAAAAAAAAAAAAAAAAAgf4AAAAAAABAfqH+AAAAAFEFAABR 2l7aIABf2mraMgAAAAAAAAAAAAAAAAAAAAAAgdPY3uD5AAAxfoH+AAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA= /* Insert any includes */ #include <time.h> #ifndef RTRT_ENTRY #define RTRT_ENTRY Tmain #endif /* Insert Here any includes free func or macros */ #include <stdio.h> #include <timers.h> #include <string.h> #include <vxWorks.h> #include <envLib.h> #include <semLib.h> #include <taskLib.h> #include <taskHookLib.h> #include <taskVarLib.h> #include <sysLib.h> #include <sockLib.h> #include <ioLib.h> #include <wdb/wdbLib.h> #ifndef STR_ENTRY #define STR_ENTRY "Tmain" #endif #ifndef EXITTASKNAME #define EXITTASKNAME usrAtExitTaskName #define ENTRYTASKNAME STR_ENTRY #else #define ENTRYTASKNAME EXITTASKNAME #endif SEM_ID mySemID=NULL; int rtrtFileNumber=0; char *usrAtExitTaskName; void (*usrAtExitHandler)(void); void usrAtExit(WIND_TCB *p) { if ((strcmp(EXITTASKNAME,p->name)==0) || (strcmp(ENTRYTASKNAME,p->name)==0)) { printf ("\n%s exit\n", p->name); (*usrAtExitHandler)(); taskDeleteHookDelete((FUNCPTR)usrAtExit); } } void usr_clock_diff(struct timespec *r,struct timespec *a,struct timespec *b) { r->tv_sec=a->tv_sec-b->tv_sec; if(a->tv_nsec < b->tv_nsec) { r->tv_sec--; r->tv_nsec=1000000000L+a->tv_nsec-b->tv_nsec; } else r->tv_nsec=a->tv_nsec-b->tv_nsec; } #ifdef USE_ATU char * atu_traces_file() { return("tmpatutraces.rio"); } #endif a##b static static extern extern "C" virtual char unsigned char short unsigned short long unsigned long unsigned int ((RTRT_U_INT32)p) RTRT_NONE RTRT_STD RTRT_USR void usr_exit(RTRT_INT32 x) { /* Code here your own exit function, returning x */ taskDelete(taskIdSelf()); } RTRT_NONE RTRT_USR char *usr_date() { /* Code here your own get date function */ return ((char *)0); } RTRT_NONE RTRT_STD RTRT_USR void *usr_memcpy(void *dest,const void *src,RTRT_SIZE_T s) { int i; /* Code here your memcpy function */ i=0; for(i=0;i<s;i++) ((char *)(dest))[i]=((char *)(src))[i]; return dest; } RTRT_NONE RTRT_STD RTRT_USR void *usr_gethostname(char *p) { /* Code here your gethostname function */ /* The p parameter is a 50-bytes long allocated pointer */ strcpy(p,"VxTarget"); return(0); } RTRT_NONE RTRT_STD RTRT_USR int usr_rdv(char *p) { /* Code here your rendez-vous function */ /* The p parameter contains the name of the rendez-vous */ /* THis function should block until all the members are at the same point */ } User Defined At-Exit, based on a hook set when tasks are deleted. The usrAtExit functions is located in the section 'Include files or Code...' at the beginning of the Lib Settings RTRT_NONE RTRT_STD RTRT_USR int usr_atexit(void (handler)(void)) { /* Code here your atexit function */ /* The p parameter contains the name of a function that should be */ /* called at normal program termination */ usrAtExitHandler=handler; usrAtExitTaskName=taskName(taskIdSelf()); taskDeleteHookAdd((FUNCPTR)usrAtExit); return(1); } RTRT_NONE RTRT_STD RTRT_USR char *usr_getenv(char *s) { /* Code here your getenv function */ /* The s parameter contains the name of the environment variable */ /* that should be retrieved from the environment */ } RTRT_NONE RTRT_STD RTRT_USR int usr_getpid() { /* Code here your getpid function */ return(0); } RTRT_NONE RTRT_STD RTRT_USR void usr_signal(int sig,void (handler)(int)) { /* Code here your signal function */ /* The sig parameter contains the signal number to be registered */ /* The f parameter is a function pointer to the handler */ } RTRT_NONE RTRT_USR void _atl_stack_jump(void *,short); #define STACK_GOING_UP 0 #define STACK_GOING_DOWN 1 #include <setjmp.h> void RTRT_longjmp(jmp_buf env,int val) { /* Call the actual longjmp function */ /* after having called _atl_stack_jump ( [Stack Pointer Register Address], [STACK_GOING_UP|STACK_GOING_DOWN] ); */ _atl_stack_jump(env[0],STACK_GOING_UP); longjmp(env,val); } void RTRT__longjmp(jmp_buf env,int val) { /* Call the actual longjmp function */ /* after having called _atl_stack_jump ( [Stack Pointer Register Address], [STACK_GOING_UP|STACK_GOING_DOWN] ); */ _atl_stack_jump(env[0],STACK_GOING_UP); _longjmp(env,val); } #define longjmp RTRT_longjmp #define _longjmp RTRT__longjmp int Tmain(int argc,char *argv[]) { return(0); No support of Long Doubles, even in C++. If set to 1, an undefined external _Q_qtod appears. 6 15 15 File type is int, open and append return 1, close is empty and writeln calls printf Line Split Market is defined and set to ^ RTRT_NONE RTRT_STD RTRT_USR int RTRT_FILE_TYPE usr_init(char *fileName) { /* Code here the open function */ /* The fileName parameter contains the name of the file */ /* to be opened on the host */ int i=0; char *evt = (char *)malloc(17+strlen(fileName)); rtrtFileNumber++; sprintf(evt, "RTRTOPENF_%5d_%s", rtrtFileNumber, fileName); while ((wdbUserEvtPost(evt)!=OK) && (i<20)) { i++; printf("Can't raise event RTRTOPENF %d\n", i); taskDelay(10*sysClkRateGet()/1000); /* Waiting for 10 milliseconds */ } free(evt); return(rtrtFileNumber); } RTRT_FILE_TYPE usr_open(char *fileName) { /* Code here the open function */ /* The fileName parameter contains the name of the file */ /* to be opened on the host */ int i=0; char *evt = (char *)malloc(17+strlen(fileName)); rtrtFileNumber++; sprintf(evt, "RTRTOPENF_%5d_%s", rtrtFileNumber, fileName); while ((wdbUserEvtPost(evt)!=OK) && (i<20)) { i++; printf("Can't raise event RTRTOPENF %d\n", i); taskDelay(10*sysClkRateGet()/1000); /* Waiting for 10 milliseconds */ } free(evt); return(rtrtFileNumber); } void usr_writeln(RTRT_FILE_TYPE f,char *s) { /* Code here the write function */ /* The f parameter contains the file */ /* The s parameter contains the string to be printed */ #define BUFFERSIZE 100 int i, j; unsigned int offset=0; char *tmp; char *evt; evt = (char *)malloc(17+BUFFERSIZE); tmp=s; while(offset<strlen(s)) { sprintf(evt, "RTRTWRITE_%5d_", f); for(j=0; (j<BUFFERSIZE) && (*tmp!=0); j++, tmp++) evt[16+j] = *tmp; evt[16+j]=0; offset = offset + BUFFERSIZE; i=0; while ((wdbUserEvtPost(evt)!=OK) && (i<20)) { i++; printf("Can't raise event RTRTWRITE %d\n", i); taskDelay(10*sysClkRateGet()/1000); /* Waiting for 10 milliseconds */ } } free(evt); } void usr_close(RTRT_FILE_TYPE f) { /* Code here the close function */ /* The f parameter contains the file to be closed */ int i=0; char *evt = (char *)malloc(16); sprintf(evt, "RTRTCLOSE_%5d",f); while ((wdbUserEvtPost(evt)!=OK) && (i<20)) { i++; printf("Can't raise event RTRTCLOSE %d\n", i); taskDelay(10*sysClkRateGet()/1000); /* Waiting for 10 milliseconds */ } free(evt); } RTRT_NONE RTRT_STD RTRT_USR void usr_error(const char *s) { /* Code the error function here */ printf("usr_error: %s\n",s); } RTRT_STD RTRT_USR RTRT_NONE void *usr_malloc(RTRT_SIZE_T size) { /* Code here your own allocation function here */ } void usr_free(void *ptr) { /* Code here your own free function here */ } RTRT_USR RTRT_NONE void *lowlevel_malloc(RTRT_SIZE_T size) { /* Code the low level allocation function here */ return(__libc_malloc(size)); } void *lowlevel_calloc(RTRT_SIZE_T x,RTRT_SIZE_T y) { /* Code the low level allocation function here */ return(__libc_calloc(x,y)); } void *lowlevel_realloc(void *ptr,RTRT_SIZE_T s) { /* Code the low level allocation function here */ return(__libc_realloc(ptr,s)); } void lowlevel_free(void *ptr) { /* Code the low level allocation function here */ __libc_free(ptr); } RTRT_NONE RTRT_USR #include "atpapi.h" void *RTRT_memPartAlloc(PART_ID id,unsigned n) { void *r, *ptr; unsigned x; if (mySemID==NULL) mySemID=semMCreate(SEM_Q_FIFO|SEM_Q_PRIORITY); semTake(mySemID,WAIT_FOREVER); x=_PurifyLTHeapActualSize(n); r=memPartAlloc(id,x); ptr = _PurifyLTHeapAction(_PurifyLT_API_ALLOC,r,n,0); semGive(mySemID); return(ptr); } void *RTRT_memPartRealloc(PART_ID id, char *pBlock, unsigned n) { void *r, *ptr; unsigned x; if (mySemID==NULL) mySemID=semMCreate(SEM_Q_FIFO|SEM_Q_PRIORITY); semTake(mySemID,WAIT_FOREVER); x = _PurifyLTHeapActualSize(n); ptr = _PurifyLTHeapAction(_PurifyLT_API_BEFORE_REALLOC,pBlock,n,0); r=memPartRealloc(id,(char *)ptr,x); ptr = _PurifyLTHeapAction(_PurifyLT_API_ALLOC,r,n,0); semGive(mySemID); return(ptr); } STATUS RTRT_memPartFree(PART_ID id,char *ptr) { return(memPartFree(id,(char *)_PurifyLTHeapAction(_PurifyLT_API_FREE,ptr,0,0))); } #define memPartAlloc RTRT_memPartAlloc #define memPartRealloc RTRT_memPartRealloc #define memPartFree RTRT_memPartFree User clock Interface, nased on timespec. The VxSim simulator givs only a precision of 16 milliseconds, although all is prepared to have a precision based on the microsecond. RTRT_NONE RTRT_STD RTRT_USR struct timespec This function reads the clock and returns seconds-nanoseconds void usr_clock(RTRT_CLOCK_TYPE *p) { /* Code here the funtion which reads the clock */ /* and sets (*p) to the current clock value */ clock_gettime(CLOCK_REALTIME,(struct timespec *)p); } void usr_clock_init(void) { /* This function will be called only once when starting the program */ /* You may code here clock resolution computation */ } RTRT_U_INT32 4 "us" "1" Convert seconds-nanoseconds into an 32-bits integer in MicroSeconds ((c.tv_sec*1000000)+(c.tv_nsec/1000)) usr_clock_diff(&(r),&(a),&(b)) RTRT_U_INT32 "0" ((c.tv_sec*1000)+(c.tv_nsec/1000000)) 1000 void usr_sleep(RTRT_TIME_TYPE p) { /* Code here the funtion which sleeps for a while */ /* p contains the duration, represented in a RTRT_TIME_TYPE item */ /* Milliseconds in this particular vxWorks case */ int nbTicks; int nbTicksPerSec=sysClkRateGet(); int tickDurationInMillisec; tickDurationInMillisec=1000/nbTicksPerSec; nbTicks=(p/tickDurationInMillisec); taskDelay(nbTicks); } RTRT_STD RTRT_SOLARIS RTRT_USR RTRT_NONE int taskIdSelf() ((t1)==(t2)) taskDelete(taskIdSelf()); SEM_ID v; v=semMCreate(SEM_Q_FIFO|SEM_Q_PRIORITY); semTake(v,WAIT_FOREVER); semGive(v); semDelete(v); {WIND_TCB *p=taskTcb(taskIdSelf()); v=p->spare4;} {WIND_TCB *p=taskTcb(taskIdSelf()); p->spare4=v;} #define __inline__ inline #define __inline inline #define __const const #define __signed signed #define __signed__ signed #define __attribute__(x) #define __volatile__ #define __volatile #define volatile #define __restrict restrict #define __extension__ char *__FUNCTION__; char *__PRETTY_FUNCTION__; #define __asm asm #define __asm__ asm typedef void * __builtin_va_list; #define __builtin_stdarg_start(ap,param) #define __builtin_next_arg(p) 0 #define __builtin_va_arg(ap,type) 0 #define __builtin_va_end(ap) extern void * __builtin_alloca(unsigned int); extern int __builtin_ffs(int); extern int __builtin_abs(int); extern float __builtin_fabsf(float); extern double __builtin_fabs(double); extern long double __builtin_fabsl(long double); extern long int __builtin_labs(long int); extern void * __builtin_memcpy(void *, const void *, unsigned int); extern int __builtin_memcmp(const void *, const void *, unsigned int); extern int __builtin_strcmp(const char *, const char *); extern char * __builtin_strcpy(char *, const char *); extern double __builtin_sqrt(double); extern float __builtin_sqrtf(float); extern long double __builtin_sqrtl(long double); extern double __builtin_sin(double); extern float __builtin_sinf(float); extern long double __builtin_sinl(long double); extern double __builtin_cos(double); extern float __builtin_cosf(float); extern long double __builtin_cosl(long double); extern char * __builtin_strchr(const char *, int); extern char * __builtin_strrchr(const char *, int); extern char * __builtin_strpbrk(const char *, const char*); extern char * __builtin_strstr(const char *, const char *); #define __builtin_return(result) return(result) #define __builtin_constant_p(X) 0 extern void * __builtin_apply_args (void); extern void * __builtin_apply (void (*)(), void *, int); extern int __builtin_return_address (int); extern int __builtin_frame_address (int); #define __builtin_isgreater(x, y) 0 #define __builtin_isgreaterequal(x, y) 0 #define __builtin_isless(x, y) 0 #define __builtin_islessequal(x, y) 0 #define __builtin_islessgreater(x, y) 0 #define __builtin_isunordered(x, y) 0 #define __builtin_classify_type(x, y) 0 #define __builtin_expect(x, y) 0 /* Macros start - do not remove this line */ /* Macro end - do not remove this line */ #define __cplusplus 1 #define __inline__ inline #define __inline inline #define __const const #define __signed signed #define __signed__ signed #define __attribute__(x) #define __volatile__ #define __volatile #define volatile #define __restrict #define __inline__ inline #define wchar_t int #define __tune_i386__i #define __tune_i486__ #define __const const #define __restrict #define __extension__ #define __EXCEPTIONS #define __register_exceptions #define __throw #define __find_first_exception_table_match #define __unwind_function char *__FUNCTION__; char *__PRETTY_FUNCTION__; #define __asm asm #define __asm__ asm typedef void * __builtin_va_list; #define __builtin_stdarg_start(ap,param) #define __builtin_next_arg(p) 0 #define __builtin_va_arg(ap,type) 0 #define __builtin_va_end(ap) extern void * __builtin_alloca(unsigned int); extern int __builtin_ffs(int); extern int __builtin_abs(int); extern float __builtin_fabsf(float); extern double __builtin_fabs(double); extern long double __builtin_fabsl(long double); extern long int __builtin_labs(long int); extern void * __builtin_memcpy(void *, const void *, unsigned int); extern int __builtin_memcmp(const void *, const void *, unsigned int); extern int __builtin_strcmp(const char *, const char *); extern char * __builtin_strcpy(char *, const char *); extern unsigned int __builtin_strlen(const char *); extern double __builtin_sqrt(double); extern float __builtin_sqrtf(float); extern long double __builtin_sqrtl(long double); extern double __builtin_sin(double); extern float __builtin_sinf(float); extern long double __builtin_sinl(long double); extern double __builtin_cos(double); extern float __builtin_cosf(float); extern long double __builtin_cosl(long double); extern char * __builtin_strchr(const char *, int); extern char * __builtin_strrchr(const char *, int); extern char * __builtin_strpbrk(const char *, const char*); extern char * __builtin_strstr(const char *, const char *); #define __builtin_return(result) return(result) #define __builtin_constant_p(X) 0 extern void * __builtin_apply_args (void); extern void * __builtin_apply (void (*)(), void *, int); extern int __builtin_return_address (int); extern int __builtin_frame_address (int); #define __builtin_isgreater(x, y) 0 #define __builtin_isgreaterequal(x, y) 0 #define __builtin_isless(x, y) 0 #define __builtin_islessequal(x, y) 0 #define __builtin_islessgreater(x, y) 0 #define __builtin_isunordered(x, y) 0 #define __builtin_classify_type(x, y) 0 #define __builtin_expect(x, y) 0 /* Macros start - do not remove this line */ /* Macro end - do not remove this line */ /* Macros start - do not remove this line */ /* Macro end - do not remove this line */ #pragma attol accept "__volatile__" #pragma attol accept "__volatile" #pragma attol accept "__signed__" = 279 #pragma attol accept "__const__" = 273 #pragma attol accept "__const" = 273 #pragma attol accept "__inline__" #pragma attol accept "__inline" #pragma attol accept "inline" #pragma attol type_modifier = __restrict #pragma attol "gnu#__extension__" #pragma attol reduce "__attribute__" null #pragma attol reduce "__attribute" null #pragma attol reduce "__asm__" empty #pragma attol reduce "__asm" empty #pragma attol reduce "asm" empty #pragma attol reduce "__typeof__" typename #pragma attol reduce "__alignof__" #pragma attol accept "__FUNCTION__" = 290 #pragma attol accept "__PRETTY_FUNCTION__" = 290 typedef void * __builtin_va_list; #define __builtin_stdarg_start(ap,param) #define __builtin_next_arg(p) 0 #define __builtin_va_arg(ap,type) 0 #define __builtin_va_end(ap) extern void * __builtin_alloca(unsigned int); extern int __builtin_ffs(int); extern int __builtin_abs(int); extern float __builtin_fabsf(float); extern double __builtin_fabs(double); extern long double __builtin_fabsl(long double); extern long int __builtin_labs(long int); extern void * __builtin_memcpy(void *, const void *, unsigned int); extern int __builtin_memcmp(const void *, const void *, unsigned int); extern int __builtin_strcmp(const char *, const char *); extern char * __builtin_strcpy(char *, const char *); extern unsigned int __builtin_strlen(const char *); extern double __builtin_sqrt(double); extern float __builtin_sqrtf(float); extern long double __builtin_sqrtl(long double); extern double __builtin_sin(double); extern float __builtin_sinf(float); extern long double __builtin_sinl(long double); extern double __builtin_cos(double); extern float __builtin_cosf(float); extern long double __builtin_cosl(long double); extern char * __builtin_strchr(const char *, int); extern char * __builtin_strrchr(const char *, int); extern char * __builtin_strpbrk(const char *, const char*); extern char * __builtin_strstr(const char *, const char *); #define __builtin_return(result) return(result) #define __builtin_constant_p(X) 0 extern void * __builtin_apply_args (void); extern void * __builtin_apply (void (*)(), void *, int); extern int __builtin_return_address (int); extern int __builtin_frame_address (int); #define __builtin_isgreater(x, y) 0 #define __builtin_isgreaterequal(x, y) 0 #define __builtin_isless(x, y) 0 #define __builtin_islessequal(x, y) 0 #define __builtin_islessgreater(x, y) 0 #define __builtin_isunordered(x, y) 0 #define __builtin_classify_type(x, y) 0 #define __builtin_expect(x, y) 0 /* Macros definitions: do not remove this line */ #ifdef NEED_PREPRO_DEFS #endif /* NEED_PREPRO_DEFS */ #define __inline__ inline #define __inline inline #define __const const #define __signed signed #define __signed__ signed #define __attribute__(x) #define __attribute(x) #define __volatile__ #define __volatile #define volatile #define __restrict #define __FUNCTION__ "__FUNCTION__" #define __PRETTY_FUNCTION__ "__PRETTY_FUNCTION__" #define __asm asm #define __asm__ asm #ifdef NEED_PREPRO_DEFS #define __null 0 #else #define __null __atl_null 6 #endif typedef void * __builtin_va_list; #define __builtin_stdarg_start(ap,param) #define __builtin_next_arg(p) 0 #define __builtin_va_arg(ap,type) 0 #define __builtin_va_end(ap) extern void * __builtin_saveregs(void); extern int __builtin_args_info (int); extern void * __builtin_alloca(unsigned int); extern int __builtin_ffs(int); extern int __builtin_abs(int); extern float __builtin_fabsf(float); extern double __builtin_fabs(double); extern long double __builtin_fabsl(long double); extern long int __builtin_labs(long int); extern void * __builtin_memcpy(void *, const void *, unsigned int); extern int __builtin_memcmp(const void *, const void *, unsigned int); extern int __builtin_strcmp(const char *, const char *); extern char * __builtin_strcpy(char *, const char *); extern unsigned int __builtin_strlen(const char *); extern double __builtin_sqrt(double); extern float __builtin_sqrtf(float); extern long double __builtin_sqrtl(long double); extern double __builtin_sin(double); extern float __builtin_sinf(float); extern long double __builtin_sinl(long double); extern double __builtin_cos(double); extern float __builtin_cosf(float); extern long double __builtin_cosl(long double); extern char * __builtin_strchr(const char *, int); extern char * __builtin_strrchr(const char *, int); extern char * __builtin_strpbrk(const char *, const char*); extern char * __builtin_strstr(const char *, const char *); #define __builtin_return(result) return(result) #define __builtin_constant_p(X) 0 extern void * __builtin_apply_args (void); extern void * __builtin_apply (void (*)(), void *, int); extern int __builtin_return_address (int); extern int __builtin_frame_address (int); #define __builtin_isgreater(x, y) 0 #define __builtin_isgreaterequal(x, y) 0 #define __builtin_isless(x, y) 0 #define __builtin_islessequal(x, y) 0 #define __builtin_islessgreater(x, y) 0 #define __builtin_isunordered(x, y) 0 #define __builtin_classify_type(x, y) 0 #define __builtin_expect(x, y) 0 #define __builtin_expect(x, y) 0 --old_for_init --dollar --no_restrict --ignore_std --special_subscript_cost --no_alternative_tokens --extended_variadic_macros --void_star_null_pointer --guiding_decls --old_specialization --inline_not_yet_defined --gnu_mode --microsoft_union_with_array --treat_template_classes_as_static --simulate_virtual_methods --simulate_called_routines --diag_suppress 14,34,46,111,161,174,177,305,375,427,549,550,737,795,830,837,940,997 --diag_suppress 1,30,114,289,330,349,397 --diag_suppress 137,280,350,381,416,541,815 --diag_suppress 756,347,186,307,175,485,321 --old_style_template_instantiation --vla --targ_size_t_int_kind 6