--- /dev/null
+PROJECT(parserlds)
+SUBDIRS(runtime tests libgen libparser )
+INCLUDE_DIRECTORIES(${CMAKE_CURRENT_BINARY_DIR})
+INCLUDE_DIRECTORIES(${CMAKE_CURRENT_SOURCE_DIR})
+INCLUDE_DIRECTORIES(${CMAKE_CURRENT_SOURCE_DIR}/../common/include/)
+INCLUDE_DIRECTORIES(${CMAKE_CURRENT_SOURCE_DIR}/libgen/)
+INCLUDE_DIRECTORIES(${aebutils_SOURCE_DIR})
+# For option...
+INCLUDE_DIRECTORIES(${aebutils_SOURCE_DIR}/aeb)
+
+INCLUDE(${rules_SOURCE_DIR}/flex.cmake)
+IF(WIN32)
+ELSE(WIN32)
+SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -D__FILENAME__='\"$(subst ${CMAKE_CURRENT_SOURCE_DIR}/,,$<)\"'")
+ENDIF(WIN32)
+LEXGEN(lds.l lds_l.cpp)
+BISONGEN(lds.y lds_y.cpp cpp)
+
+
+ADD_EXECUTABLE(genaut main.cpp
+ #${CMAKE_CURRENT_BINARY_DIR}/lds_y.cpp
+ # ${CMAKE_CURRENT_BINARY_DIR}/lds_l.cpp
+ )
+
+TARGET_LINK_LIBRARIES(genaut ldsgen)
+TARGET_LINK_LIBRARIES(genaut ldsparser)
+TARGET_LINK_LIBRARIES(genaut commonAST)
+TARGET_LINK_LIBRARIES(genaut commonCodeGen)
+TARGET_LINK_LIBRARIES(genaut commonIR)
+TARGET_LINK_LIBRARIES(genaut ldsbytecode)
--- /dev/null
+2017/03/31:
+ -> Main issue is to compute branch distances. for if then else
+
+TODO: 2017/03/30:
+ -> output instruction parser to be completed with parameters
+ -> synomym type should needs to be created. A constant array....
+ -> better implementation of output assembler instruction
+ -> hash map class missing in aeb utils library
+ -> event table (with number of arguments (needed by output asm instruction)
+ events are function calls either native call or Interpreted call through output
+ -> generation of type library
+ -> ptr into tra
+ -> Finalize type management in code generation for stub
+ -> Add support to store Automaton in so library
+ -> Handle Multiple instances in VM.
+ -> Handle Threaded VM too
+
+BUG:
+ when EVT_NEW_CONFIG => same
+ begin
+ if AEL_PARSE (NEW_CONF_RC_FILE)
+ then
+ if AEL_CHECK_NEW_CONFIG
+ then
+ AEL_LOOP_MSG (EVT_NEW_CONFIG_OK) ;
+ else
+ AEL_LOOP_MSG (EVT_BAD_CONFIG) ;
+ end if ;
+ else
+ AEL_LOOP_MSG (EVT_BAD_CONFIG) ;
+ end if ;
+ end EVT_NEW_CONFIG ;
+
+Generates :
+static LdsInstruction _f19[]={
+/* Lds Local Function T SEM_CMDOWN_MAINT_20 */
+ AEL_PARSE , CALL_PARAM(1,NEW_CONF_RC_FILE)
+ , AEL_JUMP_PLUS_IF_NOT , 9 /* With added Missing should be 11 */
+ , AEL_CHECK_NEW_CONFIG
+ , AEL_JUMP_PLUS_IF_NOT , 4
+ , AEL_LOOP_MSG ,EVT_NEW_CONFIG_OK
+ , AEL_JUMP_PLUS , 2
+ , AEL_LOOP_MSG ,EVT_BAD_CONFIG
+ /* Missing ALE_JUMP_PLUS, 2 */
+ , AEL_LOOP_MSG ,EVT_BAD_CONFIG
+ , AEL_RETURN
+};
+
+
+
+1) Plans
+ The libgen directory, in the long run, should provide static and dynamic
+ libraries. I'm thinking of using dl lib do load the generators as
+ plugins that can be added to a program (parser / generator).
+
+2) Runtime
+ I need to reorganise the project in order to generate a runtime librarie.
+ Several options are on the table and I need to make choices. Today, I'm
+ able to run a basic virtual machine through a so called lds assembler.
+ Very basic. I can improve that assembler in order to be able to load
+ byte code.
+
+ Second option is to generate c code.
+
+ The runtime librarie needs to provide at least Message queues, Timers,
+ send and receive functions for the message queues. Automaton class ..
+
+2.1) Act Generation
+ What If we improve the ACT generation. Instead of putting all instruction
+ into one array, the act array will be an array of functions.
+ -> The SEM indexes will be the entry point of a function type
+ declaration. This declaration contains the signature of the
+ function. The return type, the number of parameters and so on.
+ This way, it's possible not to reach the 65538 index.
+ [Fct IDX][Code IDX]
+ -> What should be the type for the function ?
+ struct LdsFunctionProto {
+ unsigned char nbParams;
+ unsigned char isVaargs;
+ unsigned char nbLocVars;
+ unsigned char maxStackSize; /* Can be computed during compilatation*/
+ int sizeconstant; /* Not sure for that */
+ int sizecode;
+ char *fctName; /* NULL or Function Name */
+ /* May be it's better to use a global array for all constants as they
+ can be used somewhere else
+ */
+ LdsTYpeValue *Constants; /* Array of Constants used by the function */
+ unsigned short *paramType; /* Array of types for each */
+ /* Missing Local vars, variables used outside the function scope eg
+ globals
+ */
+ LdsInstruction *code;
+ };
+3) Open Points
+ How do I handle AEL's from SDL? Some how, the AELs are C functions.
+ They interact with the automaton context
+
+4) How to handle variables
+
+4.1) Constant Variables and literals
+ Z.104 provides synonym type to attribute a specific value to a "constant variable"
+ This needs to be handles
+
+5) Parser
+ I need to rewrite some parts of the parser in order to separate the
+ parsing from UI applications. A kind of observer pattern. This way
+ I would have separation between the UI and the parser. No need to
+ mix parser code with UI code.
+
+6) Type Handling ...
+ There is a lot of work here to be able to handle Type in lds.
+ First The possibility to somehow tell the native type. Like
+ asn1, C, C++, lpcm.
+
+6.1) Operators For Struct
+ There are a couple of operators that must be provided for datatypes.
+ Below the Liste:
+ -> Make without Parameter Don't forget to initialize default values.
+ -> Make With Parameters
+ -> Copy
+ -> Extract (Field) -> FieldType
+ -> Modify(field ,FielT)
+ -> Present
+ -> Undefined
+ -> Equal
+ -> + - * / and or != < > <= >=
+ -> encoding / decoding BER/PER/OER/XML/JSON/??
+
+6.2) Operators For Choice
+ Almost the same than the one in previous paragraph
+
+7) Reference Handling
+
+8) Create Operation to be handled
+
+9) Stack Management / Function Calls to be improved
+ -> Today internal functions (TASK) cannot use paramters
+ Only global variables
+
+10) Intermediat Representation
+ We started adding the Value Class for all Intermediary types. All elements
+ in the IR are Values located somewhere in memory. Thus, Instruction should
+ inherit from Value, BasicBlock Should inherit from Value and so on.
+ This should allow easy computation of the location of a variable and so on
+
+10.1) OUTPUT instruction
+ This instruction is supposed to send an event either internally or to another agent.
+ The event takes parameters. These parameters need to be added in lib parser.
+ The generator should generate a table of events leting the interpreter know how many
+ parameters are to be push in the stack.
+ -> The type of each parameter is also required. This might help in writing a generic
+ behaviour
+11) Type library
+ lds uses external packages. Each package comes with a certain number of types and functions
+ an external module should be able to address all these elements properly.
+ I need a hash map to load,export/access this feature
--- /dev/null
+--
+-- Andre Ebersold
+-- Attempt to make a little model for ACSE client
+-- I'm missing the ACSE ASN1 definition to complete the model
+-- and code generation
+--
+use pkg_acse_common / signal evtOnPDU,signal evtOnAARQ,signal evtOnAARE,signal evtOnRLRQ,signal evtOnRLRE,signal evtOnABRT
+ , type ACE_apdu ,type AARQ_apdy,type AARE_apdu,type RLRQ_apdu,type RLRE_apdu, type ABRT_apdu ;
+automaton acsec is
+
+-- event or signal ...
+-- evtOnPDU(ACSE_apdu),evtOnAARQ(AARQ_apdu),evtOnAARE(AARE_apdu),evtOnRLRQ(RLRQ_apdu),evtOnRLRE(RLRE_apdu),evtOnABRT(ABRT_apdu)
+-- signal prototype, ACESE_apdu,AARQ_apdu,AARE_apdu are types
+signal evtOnPDU(ACSE_apdu) ;
+signal evtOnAARQ(AARQ_apdu) ;
+signal evtOnAARE(AARE_apdu) ;
+signal evtOnRLRQ(RLRQ_apdu) ;
+signal evtOnRLRE(RLRE_apdu) ;
+signal evtOnABRT(ABRT_apdu) ;
+dcl FLG_AUTH_FAILED Integer;
+dcl testArray myArray;
+dcl testStruct dede;
+
+--
+-- LOOP_MSG sends an internal msg event.
+-- events can have parameters. This should be possible
+--
+-- Maybe the task should be able to take parameters as well. Ex PDU
+--
+task ProcessPDU is
+begin
+ case FLG_PDU
+ do -- 0 : AARQ
+ AEL_LOOP_MSG(evtOnAARQ);
+ do -- 1 : AARE
+ AEL_LOOP_MSG(evtOnAARE);
+ do -- 2 : RLRQ
+ AEL_LOOP_MSG(evtOnRLRQ);
+ do -- 3 : RLRE
+ AEL_LOOP_MSG(evtOnRLRE);
+ do -- 4 : ABRT
+ AEL_LOOP_MSG(evtOnABRT);
+ do -- 5 : ABRT
+ AEL_LOOP_MSG(evtOnDATA);
+ end case;
+end task ProcessPDU ;
+
+--
+-- Idle State
+--
+state STA_Idle accept
+ when evtOnPDU(pdu) => STA_AwaitingPdu
+ begin
+ execute ProcessPDU ;
+ end evtOnPDU;
+end state STA_Idle;
+
+--
+-- Awaiting PDU
+--
+state STA_AwaitingPdu accept
+ -- default processing case
+ when evtOnPDU(pdu) => same
+ begin
+ execute ProcessPDU ;
+ end evtOnPDU;
+ --
+ when evtOnAARQ(pdu_aarq) => STA_AwaitingAssociationResponse
+ begin
+ if AEL_Authenticated then
+ else
+ goto STA_Idle;
+ end if ;
+ end evtOnAARQ;
+ --
+ when evtOnAARE(pdu_aare) => STA_Associated
+ begin
+ if AEL_Failed then
+ goto Idle ;
+ end if;
+ end evtOnAARE;
+ --
+ when evtOnRLEQ(pdu_rleq) => STA_AwaitingAssocationResponse
+ begin
+ end evtOnRLRQ;
+ --
+ when evtOnRLRE(pdu_rlre) => STA_AwaitingAssocationResponse
+ begin
+ end evtOnRLRE;
+ --
+ when evtOnABRT(pdu_abrt) => STA_Idle
+ begin
+ end evtOnABRT;
+end state STA_AwaitingPdu;
+
+state STA_AwaitingAssociationResponse accept
+ -- default processing case
+ when evtOnPDU(pdu) => same
+ begin
+ execute ProcessPDU ;
+ end evtOnPDU;
+ --
+ when evtOnAARE(pdu) => STA_Associated
+ begin
+ end evtOnAARE;
+ --
+ when evtOnABRT(pdu) => STA_Idle
+ begin
+ end evtOnABRT;
+end state STA_AwaitingAssocitationResponse;
+
+state STA_AwaitingReleaseResponse accept
+ -- default processing case
+ when evtOnPDU(pdu) => same
+ begin
+ execute ProcessPDU ;
+ end evtOnPDU;
+ --
+ when evtOnRLRE(pdu_rlre) => STA_Idle
+ begin
+ -- May be I should inform, Log this
+ end evtOnRLRE;
+ --
+ when evtOnRLRQ(pdu_rlrq) => STA_CollInitiator
+ begin
+ end evtOnRLRQ;
+ --
+ when evtOnABRT(pdu_abrt) => STA_Idle
+ begin
+ end evtOnABRT;
+end state STA_AwaitingReleaseReponse ;
+
+state STA_Authenticating accept
+ -- default processing case
+ when evtOnPDU(pdu) => same
+ begin
+ execute ProcessPDU ;
+ end evtOnPDU;
+ --
+ when evtOnAARE(aare_pdu) => STA_Associated
+ begin
+ if (not AEL_CheckAuthenticate ) then
+ AEL_SendMessage(FLG_AUTH_FAILED);
+ end if ;
+ end evtOnAARE;
+ --
+ when evtOnABRT(avrt_pdu) => STA_Idle
+ begin
+ end evtOnABRT;
+
+end state STA_Authenticating;
+
+
+state STA_Associated accept
+ -- default processing case
+ when evtOnPDU(pdu) => same
+ begin
+ execute ProcessPDU ;
+ end evtOnPDU;
+ --
+ when evtOnRLRQ(pdu_rlrq) => same
+ begin
+ end evtOnRLQQ;
+ --
+ when evtOnABRT(pdu_abrt) => STA_Idle
+ begin
+ AEL_Message(FLG_ABORT);
+ end evtOnABRT;
+ --
+ when evtOnAARQ(pdu_aarq) => same
+ begin
+ end evtOnAARQ;
+ --
+ when evtOnDATA(pdu_data) => same
+ begin
+ -- Send data to uper layer
+ AEL_ForwardData(pdu_data) ;
+ end evtOnDATA;
+end state STA_Associated;
+
+state STA_CollInitiator accept
+ --
+ when evtOnABRT(pdu_abrt) => STA_Idle
+ begin
+ if testStruct.iA = 2 then
+ end if;
+ end evtOnABRT;
+end state STA_CollInitiator;
+
+state STA_CollResponder accept
+ --
+ when evtOnABRT(pdu_abrt) => STA_Idle
+ begin
+ AEL_ONE ;
+ AEL_TWO(pdu_abrt);
+ a := testArray[param] ;
+ testArray[param] := 1;
+ testStruct.iA :=2 ;
+ testStruct.iA := testArray[1];
+ end evtOnABRT;
+end state STA_CollResponder;
+end automaton acsesrv;
--- /dev/null
+--
+-- Andre Ebersold
+-- Attempt to make a automaton model for ACSE server
+--
+automaton acsesrv is
+
+-- event or signal ...
+-- evtOnPDU(ACSE_apdu),evtOnAARQ(AARQ_apdu),evtOnAARE(AARE_apdu),evtOnRLRQ(RLRQ_apdu),evtOnRLRE(RLRE_apdu),evtOnABRT(ABRT_apdu)
+--
+-- LOOP_MSG sends an internal msg event.
+-- events can have parameters. This should be possible
+--
+-- Maybe the task should be able to take parameters as well. Ex PDU
+--
+task ProcessPDU is
+begin
+ case PDU
+ do -- 0 : AARQ
+ AEL_LOOP_MSG(evtOnAARQ);
+ do -- 1 : AARE
+ AEL_LOOP_MSG(evtOnAARE);
+ do -- 2 : RLRQ
+ AEL_LOOP_MSG(evtOnRLRQ);
+ do -- 3 : RLRE
+ AEL_LOOP_MSG(evtOnRLRE);
+ do -- 4 : ABRT
+ AEL_LOOP_MSG(evtOnABRT);
+ end case;
+end task ProcessPDU ;
+
+--
+-- Idle State
+--
+state STA_Idle accept
+ when evtOnPDU => STA_AwaitingPdu
+ begin
+ execute ProcessPDU ;
+ end evtOnPDU;
+end state STA_Idle;
+
+--
+-- Awaiting PDU
+--
+state STA_AwaitingPdu accept
+ -- default processing case
+ when evtOnPDU => same
+ begin
+ execute ProcessPDU ;
+ end evtOnPDU;
+ --
+ when evtOnAARQ => STA_Idle
+ begin
+ -- Should not happen
+ end evtOnAARQ;
+ --
+ when evtOnAARE => STA_Associated
+ begin
+ if test FLG_Authenticate then
+ if AEL_CheckAuhenticate then
+ goto STA_Authenticating ;
+ else
+ AEL_SendMessage(AABRT);
+ goto STA_Idle ;
+ end if ;
+ else
+ goto STA;
+ end if;
+ end evtOnAARE;
+ --
+ when evtOnRLEQ => STA_AwaitingAssocationResponse
+ begin
+ end evtOnRLRQ;
+ --
+ when evtOnRLRE => STA_AwaitingAssocationResponse
+ begin
+ end evtOnRLRE;
+ --
+ when evtOnABRT => STA_Idle
+ begin
+ end evtOnABRT;
+end state STA_AwaitingPdu;
+
+state STA_AwaitingAssociationResponse accept
+ -- default processing case
+ when evtOnPDU => same
+ begin
+ execute ProcessPDU ;
+ end evtOnPDU;
+ --
+ when evtOnAARE => STA_Associated
+ begin
+ end evtOnAARE;
+end state STA_AwaitingAssocitationResponse;
+
+state STA_Authenticating accept
+ -- default processing case
+ when evtOnPDU => same
+ begin
+ execute ProcessPDU ;
+ end evtOnPDU;
+ --
+ when EVT_Ok => STA_Associated
+ begin
+ if AEL_Authenticated(FLG_toto) then
+ AEL_StartService ;
+ else
+ AEL_StopService ;
+ end if;
+
+ end Ok;
+ --
+
+end state STA_Authenticating;
+
+
+state STA_Associated accept
+ -- default processing case
+ when evtOnPDU => same
+ begin
+ execute ProcessPDU ;
+ end evtOnPDU;
+ --
+ when evtOnRLRQ => same
+ begin
+ end evtOnRLQQ;
+ --
+ when evtOnABRT => STA_Idle
+ begin
+ AEL_Message(FLG_Abort);
+ end evtOnABRT;
+ --
+ when evtOnAARQ => same
+ begin
+ end evtOnAARQ;
+ --
+ when evtOnDATA => same
+ begin
+ AEL_ForwardData;
+ end evtOnAARQ;
+end state STA_Associated;
+
+end automaton acsesrv;
--- /dev/null
+
+------------------------------------------------------------------------
+--
+-- Download state machine
+--
+-- LDS Version 1.1 Needs signals and variables to be declared
+-- before beeing used.
+--
+------------------------------------------------------------------------
+
+automaton cmdown_maint is
+
+dcl CONFIG_RC_FILE String := 'config.rc';
+dcl DELTA_RC_FILE String := 'delta.rc';
+dcl NEW_CONF_RC_FILE String := 'config.new.rc';
+dcl WAIT_BEF_LOGOUT Integer;
+
+synonym KO Integer := 0;
+synonym OK Integer := 1;
+synonym LOGIN_PH Integer := 0;
+synonym DOWN Integer := 1;
+synonym TRANSFER Integer := 2;
+synonym SWAP Integer := 3;
+synonym PLUGIN Integer := 4;
+
+dcl START,STOP Integer ;
+
+-- Login OK or KO
+signal EVT_LOGIN(Integer);
+-- Plugin OK or KO
+signal EVT_PLUGIN(Integer);
+-- DELTA INIT OK or KO
+signal EVT_DELTA_INIT(Integer);
+------------------------------------------------------------------------
+
+state STA_DEFAUT accept
+
+ when EVT_LOGOUT => STA_IDLE
+ begin
+ AEL_BREAK_TO (WAIT_BEF_LOGOUT) ;
+ AEL_HARD_ANO(STOP);
+ end EVT_LOGOUT ;
+
+ when EVT_PLUGIN(p) => STA_PLUGIN
+ begin
+ AEL_BREAK_TO (WAIT_BEF_LOGOUT);
+ AEL_RESTART_DOWNLOAD;
+ -- AEL_LOOP_MSG (EVT_PLUGIN);
+ OUTPUT EVT_PLUGIN(p);
+ end EVT_PLUGIN ;
+
+ when EVT_NO_PLUGIN => STA_PLUGIN
+ begin
+ AEL_BREAK_TO (WAIT_BEF_LOGOUT);
+ AEL_RESTART_DOWNLOAD;
+ AEL_LOOP_MSG (EVT_NO_PLUGIN);
+ end EVT_NO_PLUGIN ;
+ when EVT_DELTA_CONFIG => STA_CLOSE
+ begin
+ AEL_SET_ERROR_MESSAGE;
+ AEL_SEND_STATUS (DOWN, KO) ;
+ AEL_START_TO (WAIT_BEF_LOGOUT) ;
+ end EVT_DELTA_CONFIG ;
+
+end state STA_DEFAUT;
+
+------------------------------------------------------------------------
+
+state STA_IDLE accept
+
+ when EVT_LOGIN(LStatus) => STA_LOGIN
+ begin
+ STOP := 1;
+ AEL_HARD_ANO(START);
+ AEL_HARD_ANO(LStatus);
+ if AEL_CHECK_DOWN_ALLOWED
+ then
+ output EVT_LOGIN(OK);
+ else
+ output EVT_LOGIN(KO);
+ end if ;
+ end EVT_LOGIN ;
+
+ when EVT_LOGOUT,
+ EVT_OUTGOING_FILE,
+ EVT_SEND_KO => same
+ begin
+ -- AEL_RETURN ;
+ end EVT_SEND_KO ;
+
+end state STA_IDLE;
+
+------------------------------------------------------------------------
+
+state STA_LOGIN accept
+
+ when EVT_LOGIN(Status) => STA_PLUGIN
+ begin
+ if Status = 1
+ then
+ if AEL_PARSE (CONFIG_RC_FILE)
+ then
+ AEL_PUT_CONFIG_FILES ;
+ AEL_SEND_STATUS (LOGIN_PH, OK) ;
+ else
+ AEL_SEND_STATUS (LOGIN_PH, KO) ;
+ end if ;
+ else
+ AEL_SEND_STATUS (LOGIN_PH, KO) ;
+ AEL_START_TO (WAIT_BEF_LOGOUT) ;
+ GOTO STA_CLOSE;
+ end if;
+ end EVT_LOGIN_OK ;
+
+
+
+ when EVT_SWAP_ORDER => STA_SWAP
+ begin
+ AEL_LOOP_MSG(EVT_SWAP_ORDER);
+ end EVT_SWAP_ORDER ;
+
+ when EVT_DELTA_CONFIG => STA_INIT
+ begin
+
+ if AEL_CHECK_PLUGIN_PASSED
+ then
+ if AEL_PARSE (DELTA_RC_FILE)
+ then
+ if AEL_PROCESS_DELTA_SEM
+ then
+ OUTPUT EVT_DELTA_INIT(OK) TO THIS;
+ else
+ OUTPUT EVT_DELTA_INIT(KO) TO THIS;
+ end if ;
+ else
+ OUTPUT EVT_DELTA_INIT(KO) TO THIS;
+ end if ;
+ else
+ AEL_SET_ERROR_MESSAGE;
+ OUTPUT EVT_DELTA_INIT(KO);
+ end if ;
+
+ end EVT_DELTA_CONFIG ;
+
+ when EVT_SEND_KO,
+ EVT_OUTGOING_FILE =>same
+ begin
+ -- AEL_RETURN ;
+ end EVT_OUTGOING_FILE ;
+
+ when EVT_RECV_KO => same
+ begin
+ AEL_FILE_DOWN_RETRY ;
+ AEL_SEND_STATUS (LOGIN_PH,KO) ;
+ end EVT_RECV_KO ;
+
+
+end state STA_LOGIN;
+
+------------------------------------------------------------------------
+
+state STA_PLUGIN accept
+
+ when EVT_PLUGIN(p) => same
+ begin
+ AEL_SET_PLUGIN_PASSED;
+ if AEL_LOAD_PLUGIN
+ then
+ if AEL_PUT_HARD_CONFIG
+ then
+ AEL_LOOP_MSG (EVT_PLUGIN_OK) ;
+ else
+ AEL_LOOP_MSG (EVT_PLUGIN_KO) ;
+ end if;
+ else
+ AEL_LOOP_MSG (EVT_PLUGIN_KO) ;
+ end if ;
+ end EVT_PLUGIN ;
+
+ when EVT_NO_PLUGIN => same
+ begin
+ AEL_SET_PLUGIN_PASSED;
+ if AEL_TEST_ALLOWED_SWAP
+ then
+ AEL_LOOP_MSG(EVT_PLUGIN_OK);
+ else
+ AEL_LOOP_MSG(EVT_PLUGIN_KO);
+ end if;
+ end EVT_NO_PLUGIN ;
+
+ when EVT_PLUGIN_OK => STA_LOGIN
+ begin
+ AEL_SEND_STATUS (PLUGIN, OK) ;
+ end EVT_PLUGIN_OK ;
+
+ when EVT_PLUGIN_KO => STA_CLOSE
+ begin
+ AEL_SEND_STATUS (PLUGIN, KO) ;
+ AEL_START_TO (WAIT_BEF_LOGOUT) ;
+ end EVT_PLUGIN_KO ;
+
+ when EVT_SEND_KO,
+ EVT_OUTGOING_FILE =>same
+ begin
+ -- AEL_RETURN ;
+ end EVT_OUTGOING_FILE ;
+
+ when EVT_RECV_KO => same
+ begin
+ AEL_FILE_DOWN_RETRY ;
+ AEL_SEND_STATUS (PLUGIN, KO) ;
+ end EVT_RECV_KO ;
+
+end state STA_PLUGIN;
+
+------------------------------------------------------------------------
+
+state STA_INIT accept
+
+ when EVT_DELTA_INIT(Status) =>STA_DOWNLOAD
+ begin
+ if ( Status = 1)
+ then
+ AEL_SEND_STATUS ( DOWN, OK) ;
+ else
+ AEL_SEND_STATUS (DOWN, KO) ;
+ GOTO STA_LOGIN;
+ end if ;
+ end EVT_DELTA_INIT ;
+
+end state STA_INIT;
+
+------------------------------------------------------------------------
+
+state STA_DOWNLOAD accept
+
+ when EVT_INCOMING_FILE => same
+ -- files transfering
+ begin
+ end EVT_INCOMING_FILE;
+
+ when EVT_NEW_CONFIG => same
+ begin
+ if AEL_PARSE (NEW_CONF_RC_FILE)
+ then
+ if AEL_CHECK_NEW_CONFIG
+ then
+ AEL_LOOP_MSG (EVT_NEW_CONFIG_OK) ;
+ else
+ AEL_LOOP_MSG (EVT_BAD_CONFIG) ;
+ end if ;
+ else
+ AEL_LOOP_MSG (EVT_BAD_CONFIG) ;
+ end if ;
+ end EVT_NEW_CONFIG ;
+
+ when EVT_NEW_CONFIG_OK => STA_SWAP
+ begin
+ AEL_VOICE_PROMPT_CLEAN ;
+ AEL_SEND_STATUS (TRANSFER, OK) ;
+ end EVT_NEW_CONFIG_OK ;
+
+ when EVT_BAD_CONFIG => same
+ begin
+ AEL_SEND_STATUS (TRANSFER, KO) ;
+ end EVT_BAD_CONFIG ;
+
+ when EVT_OUTGOING_FILE => same
+ begin
+ end EVT_OUTGOING_FILE ;
+
+ when EVT_SEND_KO => same
+ begin
+ end EVT_SEND_KO ;
+
+ when EVT_RECV_KO => same
+ begin
+ AEL_FILE_DOWN_RETRY ;
+ AEL_SEND_STATUS (DOWN,KO) ;
+ end EVT_RECV_KO;
+
+ when EVT_DELTA_CONFIG => STA_INIT
+ begin
+ if AEL_PARSE (DELTA_RC_FILE)
+ then
+ if AEL_PROCESS_DELTA_SEM
+ then
+ OUTPUT EVT_DELTA_INIT(OK) ;
+ else
+ OUTPUT EVT_DELTA_INIT(KO) ;
+ end if ;
+ else
+ OUTPUT EVT_DELTA_INIT(KO) ;
+ end if ;
+ end EVT_DELTA_CONFIG ;
+
+end state STA_DOWNLOAD;
+
+------------------------------------------------------------------------
+
+state STA_SWAP accept
+
+ when EVT_SWAP_ORDER => same
+ begin
+ if AEL_PROCESS_SWAP_ORDER
+ then
+ if AEL_ALTERNATIVE_SOFTWARE
+ then
+ if AEL_IMMEDIAT_SWAP
+ then
+ AEL_LOOP_MSG(EVT_IMMEDIATE_SWAP) ;
+ end if ;
+ else
+ AEL_LOOP_MSG(EVT_NO_ALTERNATIVE_SOFT) ;
+ end if ;
+ else
+ AEL_LOOP_MSG(EVT_INVALID_SWAP_ORDER) ;
+ end if ;
+ end EVT_SWAP_ORDER ;
+
+ when EVT_IMMEDIATE_SWAP => same
+ begin
+ if not AEL_PROCESS_DLD_DATE
+ then
+ AEL_SEND_STATUS (SWAP, OK) ;
+ AEL_START_TO (WAIT_BEF_LOGOUT) ;
+ goto STA_CLOSE_AND_SWAP ;
+ end if ;
+ end EVT_IMMEDIATE_SWAP ;
+
+ when EVT_INVALID_SWAP_ORDER => same
+ begin
+ AEL_SEND_STATUS (SWAP, KO) ;
+ AEL_START_TO (WAIT_BEF_LOGOUT) ;
+ end EVT_INVALID_SWAP_ORDER ;
+
+ when EVT_NO_ALTERNATIVE_SOFT ,
+ EVT_INVALID_DATE => STA_CLOSE
+ begin
+ AEL_SEND_STATUS (SWAP, KO) ;
+ AEL_START_TO (WAIT_BEF_LOGOUT) ;
+ end EVT_INVALID_DATE;
+
+ when EVT_VALID_DATE => same
+ begin
+ if not AEL_STORE_SWAP_DATE
+ then
+ AEL_SEND_STATUS (SWAP, KO) ;
+ AEL_START_TO (WAIT_BEF_LOGOUT) ;
+ goto STA_CLOSE ;
+ else
+ if not AEL_PROCESS_DLD_DATE
+ then
+ AEL_SEND_STATUS (SWAP, OK) ;
+ AEL_START_TO (WAIT_BEF_LOGOUT) ;
+ goto STA_CLOSE ;
+ end if ;
+ end if ;
+ end EVT_VALID_DATE;
+
+ when EVT_VALID_DLD_DATE => same
+ begin
+ if not AEL_STORE_DLD_DATE
+ then
+ AEL_SEND_STATUS (SWAP, KO) ;
+ AEL_START_TO (WAIT_BEF_LOGOUT);
+ goto STA_CLOSE ;
+ else
+ AEL_SEND_STATUS (SWAP, OK) ;
+ AEL_START_TO (WAIT_BEF_LOGOUT);
+ if AEL_IMMEDIAT_SWAP
+ then
+ goto STA_CLOSE_AND_SWAP ;
+ else
+ goto STA_CLOSE ;
+ end if ;
+ end if ;
+ end EVT_VALID_DLD_DATE;
+
+ when EVT_OUTGOING_FILE => same
+ begin
+ -- AEL_RETURN ;
+ end EVT_OUTGOING_FILE ;
+
+ when EVT_SEND_KO => same
+ begin
+ -- AEL_RETURN;
+ end EVT_SEND_KO ;
+
+ when EVT_LOGOUT => STA_IDLE
+ begin
+ AEL_BREAK_TO (WAIT_BEF_LOGOUT) ;
+ AEL_NO_SWAP_ORDER_ON_LOGOUT ;
+ AEL_HARD_ANO(STOP);
+ end EVT_LOGOUT ;
+
+end state STA_SWAP;
+
+------------------------------------------------------------------------
+
+state STA_CLOSE accept
+
+ when EVT_RECV_KO ,
+ EVT_SEND_KO ,
+ EVT_INCOMING_FILE,
+ EVT_OUTGOING_FILE => same
+ begin
+ -- AEL_RETURN ;
+ end EVT_OUTGOING_FILE ;
+
+
+ when EVT_MAX_WAIT_LOGOUT => STA_IDLE
+ begin
+ AEL_HARD_ANO(STOP);
+ AEL_LOGOUT;
+ end EVT_MAX_WAIT_LOGOUT ;
+
+ when EVT_DELTA_CONFIG => STA_LOGIN
+ begin
+ AEL_BREAK_TO (WAIT_BEF_LOGOUT) ;
+ AEL_LOOP_MSG (EVT_DELTA_CONFIG) ;
+ end EVT_DELTA_CONFIG ;
+
+ when EVT_SWAP_ORDER => STA_SWAP
+ begin
+ AEL_BREAK_TO (WAIT_BEF_LOGOUT) ;
+ AEL_LOOP_MSG (EVT_SWAP_ORDER) ;
+ end EVT_SWAP_ORDER ;
+
+end state STA_CLOSE;
+
+------------------------------------------------------------------------
+
+state STA_CLOSE_AND_SWAP accept
+
+ when EVT_INCOMING_FILE,
+ EVT_RECV_KO,
+ EVT_SEND_KO ,
+ EVT_OUTGOING_FILE => same
+ begin
+ -- AEL_RETURN ;
+ end EVT_OUTGOING_FILE ;
+
+ when EVT_MAX_WAIT_LOGOUT => STA_IDLE
+ begin
+ AEL_HARD_ANO(STOP);
+ AEL_LOGOUT;
+ AEL_LAUNCH_SWAP ;
+ end EVT_MAX_WAIT_LOGOUT ;
+
+ when EVT_LOGOUT => STA_IDLE
+ begin
+ AEL_BREAK_TO (WAIT_BEF_LOGOUT) ;
+ AEL_HARD_ANO(STOP);
+ AEL_LAUNCH_SWAP ;
+ end EVT_LOGOUT ;
+
+ when EVT_DELTA_CONFIG => STA_LOGIN
+ begin
+ AEL_BREAK_TO (WAIT_BEF_LOGOUT) ;
+ AEL_LOOP_MSG (EVT_DELTA_CONFIG) ;
+ end EVT_DELTA_CONFIG ;
+
+ when EVT_SWAP_ORDER => STA_SWAP
+ begin
+ AEL_BREAK_TO (WAIT_BEF_LOGOUT) ;
+ AEL_LOOP_MSG (EVT_SWAP_ORDER) ;
+ end EVT_SWAP_ORDER ;
+
+end state STA_CLOSE_AND_SWAP ;
+
+------------------------------------------------------------------------
+
+end automaton cmdown_maint;
+
--- /dev/null
+--
+-- Andre Ebersold
+-- CSTA Client Engine. This stack is above ACSE client lib
+-- The purpose is to use it with csta_insight program
+-- 18/11/2015
+
+automaton cstaclte is
+ --
+ dcl FLG_NULL Integer;
+ dcl FLG_ALERTING Integer;
+ dcl FLG_CONNECT Integer;
+
+ state STA_Idle accept
+
+ end state STA_Idle;
+
+
+ -- Opening state
+ state STA_Consulting accept
+ --
+ when EVT_Initiated => STA_Dialing
+ begin
+ end EVT_Initiated;
+ --
+ when EVT_Retrieve => STA_Talking
+ begin
+ end EVT_Retrieve;
+ end state STA_Consultig;
+
+ -- Open state
+ state STA_Talking accept
+ --
+ when EVT_ConnectionCleared => STA_Releasing
+ begin
+ end EVT_ConnectionCleared;
+
+ when EVT_Held => STA_Consulting
+ begin
+ --
+ end EVT_Held;
+ --
+ when EVT_Transferred => same
+ begin
+ -- if lci is NULL go to free
+ IF AEL_LCI(FLG_NULL) THEN
+ goto STA_Talking;
+ END IF;
+ end EVT_Transferred;
+
+ end state STA_Talking;
+
+ -- In case The device requests the Release
+ -- we wait for release Ack message
+ state STA_Free accept
+ --
+ when EVT_Delivered => STA_Dialing
+ begin
+ end EVT_Delivered;
+ --
+ when EVT_Consulting => STA_Consulting
+ begin
+ end EVT_Consulting;
+ --
+ when EVT_ConnectionCleared => same
+ begin
+ end EVT_ConnectionCleared;
+ --
+ when EVT_Initiated => same
+ begin
+ -- If NB_CALLS > 1 Go to Consulting
+ -- If NB_CALL == 1 Go to Dialing
+ IF test FLG_NB_CALLS THEN
+ GOTO STA_Dialing;
+ ELSE
+ GOTO STA_Consulting;
+ END IF;
+ end EVT_Initiated;
+
+ end state STA_Free;
+
+ --
+ --
+ state STA_OutOfService accept
+ end state STA_OutOfService;
+
+ --
+ --
+ state STA_Monitored accept
+ end state STA_Monitored;
+
+ --
+ --
+ state STA_Recording accept
+ end state STA_Recording;
+
+ --
+ --
+ state STA_Dialing accept
+ --
+ when EVT_Established => same
+ begin
+ IF AEL_LCI(FLG_CONNECT) THEN
+ GOTO STA_Talking;
+ END IF;
+ end EVT_Established;
+ --
+ when EVT_Delivered => same
+ begin
+
+ -- When LCS == ALERTING GO TO Calling
+ IF AEL_LCI(FLG_CONNECT) THEN
+ GOTO STA_Ringing;
+ END IF;
+
+ IF AEL_LCI(FLG_ALERTING) THEN
+ GOTO STA_Calling;
+ END IF;
+ end EVT_Delivered;
+ --
+ when EVT_Originated => same
+ begin
+ -- figure out when to go to Calling
+ goto STA_Calling;
+ end EVT_Originated;
+ --
+ when EVT_Faild => same
+ begin
+ -- When cause == trunkBusy
+ IF AEL_LCI(FLG_TRUNK_BUSY) THEN
+ GOTO STA_Busytone;
+ END IF;
+ end EVT_Failed;
+ --
+ when EVT_Retrieve => STA_Talking
+ begin
+ end EVT_Retrieve;
+
+ end state STA_Dialing;
+
+ --
+ --
+ state STA_Calling accept
+ --
+ when EVT_Queued => same
+ begin
+ IF AEL_LCI(FLG_CONNECT) THEN
+ GOTO STA_Wating;
+ END IF;
+ end EVT_Failed;
+ --
+ when EVT_ConnectionCleared => same
+ begin
+ IF not test FLG_NB_CALLS THEN
+ GOTO STA_Releasing;
+ END IF;
+ end EVT_ConnectionCleared;
+ --
+ when EVT_Delivered => same
+ begin
+ IF AEL_LCI(FLG_CONNECT) THEN
+ GOTO STA_Ringing;
+ END IF;
+ end EVT_Delivered;
+ end state STA_Calling;
+
+ --
+ --
+ state STA_Ringing accept
+ --
+ when EVT_ConnectionCleared => same
+ begin
+ IF AEL_LCI(FLG_NULL) THEN
+ GOTO STA_Free;
+ END IF;
+ end EVT_ConnectionCleared;
+ --
+ when EVT_Queued => same
+ begin
+ end EVT_Queued;
+ --
+ when EVT_Established => same
+ begin
+ IF AEL_LCI(FLG_CONNECT) THEN
+ GOTO STA_Talking;
+ END IF;
+ end EVT_Established;
+ --
+ when EVT_Delivered => same
+ begin
+ IF AEL_LCI(FLG_ALERTING) THEN
+ GOTO STA_Calling;
+ END IF;
+ end EVT_Delivered;
+ --
+ when EVT_Diverted => same
+ begin
+ IF not test FLG_NB_CALLS THEN
+ GOTO STA_Free;
+ END IF;
+ end EVT_Diverted;
+ end state STA_Ringing;
+
+ --
+ --
+ state STA_Held accept
+ --
+ when EVT_Initiated => same
+ begin
+ end EVT_Initiated;
+ --
+ when EVT_Transferred => same
+ begin
+ end EVT_Transferred;
+ --
+ when EVT_Retrieve => STA_Talking
+ begin
+ end EVT_Retrieve;
+ end state STA_Held;
+
+ --
+ --
+ state STA_Conferenced accept
+ end state STA_Conferenced;
+
+ --
+ --
+ state STA_Blocked accept
+ end state STA_Blocked;
+
+ --
+ --
+ state STA_Waiting accept
+ --
+ when EVT_Retrieve,EVT_Established => STA_Talking
+ begin
+ end EVT_Retrieve;
+ end state STA_Waiting;
+
+ --
+ --
+ state STA_Releasing accept
+ --
+ when EVT_ConnectionCleared => STA_Free
+ begin
+ end EVT_ConnectionCleared;
+ end state STA_Releasing;
+
+ --
+ --
+ state STA_Busytone accept
+ end state STA_Busytone;
+
+
+end automaton cstaclte;
--- /dev/null
+
+package pkg_acse
+
+/* Define ACSE data types */
+
+/**
+ *
+ */
+value type AARQ_apdu { struct
+ protocol_version Integer; /* Bit String ....*/
+ application_context_name String;
+ called_AP_title String optional;
+ called_AE_invocation_id String optional;
+ calling_AP_title String optional;
+ calling_AE_invlocation_id String optional;
+ /**/
+ sender_acse_requirements String optional;
+ mechanism_name String optional;
+ calling_authentication_value String optional;
+ implementation_information String optional;
+ user_information String optional;
+};
+
+/**
+ *
+ */
+value type AARE_apdu { struct
+ protocol_version Integer; /* Bit String ....*/
+ application_context_name String;
+ result String;
+ result_source_diagnostic String;
+ responding_AP_title String optional;
+ responding_AE_qualifier String optional;
+ responding_AP_invocation_id String optional;
+ reponsding_AE_invocation_id String optional;
+ /**/
+ responder_acse_requirements String optional;
+ mechanism_name String optional;
+ responding_authentication_value String optional;
+ implementation_information String optional;
+ user_information String optional;
+};
+
+/**
+ *
+ */
+value type RLRQ_apdu { struct
+ reason Integer; /* Bit String ....*/
+ user_information String optional;
+};
+/**
+ *
+ */
+value type RLRE_apdu { struct
+ reason Integer; /* Bit String ....*/
+ user_information String optional;
+};
+
+/**
+ *
+ */
+value type ABRT_apdu { struct
+ abort_source Integer; /* Bit String ....*/
+ abort_diagnostic String; /* Bit String ....*/
+ user_information String optional;
+};
+
+
+/**
+ *
+ */
+value type ACSE_apdu { choice
+ aarq AARQ_apdu;
+ aare AARE_apdu;
+ rlrq RLRQ_apdu;
+ rlre RLRE_apdu;
+ abrt ABRT_apdu;
+} ;
+
+
+
+/*
+
+AARQ-apdu ::= [ APPLICATION 0 ] IMPLICIT SEQUENCE
+{ protocol-version
+application-context-name called-AP-title
+called-AE-qualifier called-AP-invocation-identifier called-AE-invocation-identifier calling-AP-title calling-AE-qualifier calling-AP-invocation-identifier calling-AE-invocation-identifier
+[0] IMPLICIT BIT STRING { version1 (0) }
+DEFAULT { version1 }, [1] Application-context-name,
+[2] AP-title OPTIONAL,
+[3] AE-qualifier OPTIONAL,
+[4] AP-invocation-identifier OPTIONAL,
+[5] AE-invocation-identifier OPTIONAL,
+[6] AP-title OPTIONAL,
+[7] AE-qualifier OPTIONAL,
+[8] AP-invocation-identifier OPTIONAL,
+[9] AE-invocation-identifier OPTIONAL,
+-- The following field shall not be present if only the Kernel is used.
+sender-acse-requirements [10] IMPLICIT ACSE-requirements OPTIONAL,
+-- The following field shall only be present if the Authentication functional unit is selected.
+mechanism-name [11] IMPLICIT Mechanism-name OPTIONAL,
+-- The following field shall only be present if the Authentication functional unit is selected.
+calling-authentication-value [12] EXPLICIT Authentication-value OPTIONAL,
+
+application-context-name-list [13] implementation-information [29] user-information [30]
+IMPLICIT Application-context-name-list OPTIONAL,
+IMPLICIT Implementation-data OPTIONAL,
+IMPLICIT Association-information OPTIONAL
+}
+
+AARE-apdu ::= [ APPLICATION 1 ] IMPLICIT SEQUENCE
+{ protocol-version
+application-context-name result result-source-diagnostic responding-AP-title
+responding-AE-qualifier responding-AP-invocation-identifier responding-AE-invocation-identifier
+[0] IMPLICIT BIT STRING { version1 (0) }
+DEFAULT { version1 }, [1] Application-context-name,
+[2] Associate-result,
+[3] Associate-source-diagnostic, [4] AP-title
+OPTIONAL, [5] AE-qualifier
+OPTIONAL,
+[6] AP-invocation-identifier
+OPTIONAL,
+[7] AE-invocation-identifier
+OPTIONAL,
+-- The following field shall not be present if only the Kernel is used.
+responder-acse-requirements [8] IMPLICIT ACSE-requirements OPTIONAL,
+-- The following field shall only be present if the Authentication functional unit is selected.
+mechanism-name [9] IMPLICIT Mechanism-name OPTIONAL,
+-- The following field shall only be present if the Authentication functional unit is selected.
+responding-authentication-value [10] EXPLICIT Authentication-value OPTIONAL,
+-- The following field shall only be present if the Application Context Negotiation functional unit is selected
+application-context-name-list [11] implementation-information [29] user-information [30]
+IMPLICIT Application-context-name-list OPTIONAL,
+IMPLICIT Implementation-data OPTIONAL,
+IMPLICIT Association-information OPTIONAL
+
+RLRQ-apdu ::= [ APPLICATION 2 ] IMPLICIT SEQUENCE
+{ reason [0] IMPLICIT Release-request-reason OPTIONAL, { user-information [30] IMPLICIT Association-information OPTIONAL }
+
+RLRE-apdu ::= [ APPLICATION 3 ] IMPLICIT SEQUENCE
+{ reason [0] IMPLICIT Release-response-reason OPTIONAL,
+user-information [30] IMPLICIT Association-information OPTIONAL }
+
+ABRT-apdu ::= [ APPLICATION 4 ] IMPLICIT SEQUENCE
+{ abort-source [0] IMPLICIT ABRT-source, -- The following field shall not be present if only the Kernel is used.
+abort-diagnostic user-information
+ABRT-diagnostic ::= ENUMERATED { no-reason-given (1),
+protocol-error (2), authentication-mechanism-name-not-recognized (3), authentication-mechanism-name-required (4), authentication-failure (5),
+authentication-required (6)
+}
+
+
+authentication-mechanism-name-required (12), authentication-failure (13), authentication-required (14)
+},
+acse-service-provider [2] INTEGER { null (0),
+no-reason-given (1),
+no-common-acse-version (2) }
+}
+Association-information ::= SEQUENCE OF EXTERNAL Authentication-value ::= CHOICE
+{ charstring bitstring external other
+} }
+[0] IMPLICIT GraphicString, [1] IMPLICIT BIT STRING, [2] IMPLICIT EXTERNAL, [3] IMPLICIT SEQUENCE {
+other-mechanism-name other-mechanism-value
+Mechanism-name, ANY DEFINED BY
+other-mechanism-name
+
+Release-request-reason ::= INTEGER { normal (0),
+ urgent (1),
+ user-defined (30)
+}
+Release-response-reason ::= INTEGER { normal (0),
+ not-finished (1),
+ user-defined (30)
+}
+*/
+
+/* Type shall be directely imported from ASN1 Files if possible
+ * something like use package acse.asn1
+ */
+
+/* Define Events and Event List */
+signal evtOnPDU(ACSE_apdu);
+signal evtOnAARQ(AARQ_apdu);
+signal evtOnAARE(AARE_apdu);
+signal evtOnRLRQ(RLRQ_apdu);
+signal evtOnRLRE(RLRE_apdu);
+signal evtOnABRT(ABRT_apdu);
+
+syntype Toto = Integer constants >= 0 endsyntype Toto;
+
+value type dede { struct
+ iA Integer;
+ iB Integer optional ;
+ operators
+ "eq" (Integer, Integer ) -> Boolean;
+ tests (this, Integer ) -> Boolean;
+ make ( ) -> dede;
+ clone (this) -> dede;
+} ;
+
+value type myArray inherits Array<3 ,Integer > ;
+syntype DefToto = Integer default 3 constants 0:15 endsyntype DefToto;
+
+/***************************
+ * AUTOMATON PCASE
+ ***************************/
+automaton pacse is
+
+value type localType { struct
+ iA Integer;
+ iB Integer optional ;
+} ;
+
+
+-- event or signal ...
+-- evtOnPDU(ACSE_apdu),evtOnAARQ(AARQ_apdu),evtOnAARE(AARE_apdu),evtOnRLRQ(RLRQ_apdu),evtOnRLRE(RLRE_apdu),evtOnABRT(ABRT_apdu)
+--
+-- LOOP_MSG sends an internal msg event.
+-- events can have parameters. This should be possible
+--
+-- Maybe the task should be able to take parameters as well. Ex PDU
+-- Waiting for the real definition
+/*
+syntype ACSE_apdu = Integer endsyntype;
+syntype AARQ_apdu = Integer endsyntype;
+syntype AARE_apdu = Integer endsyntype;
+syntype RLRQ_apdu = Integer endsyntype;
+syntype ABRT_apdu = Integer endsyntype;
+*/
+signal evtOnPDU(ACSE_apdu),evtOnAARQ(AARQ_apdu),evtOnAARE(AARE_apdu),evtOnRLRQ(RLRQ_apdu),evtOnRLRE(RLRE_apdu),evtOnABRT(ABRT_apdu)
+ , evtOnRLEQ(RLEQ_apdu) ;
+signal evtData(ACSE_data);
+
+dcl PDU Integer;
+dcl abrt ABRT_apdu := 0;
+
+gate lower2acse in with evtOnPDU out with evtData;
+--
+-- Task Should have PDU as Parameter
+--
+task ProcessPDU is
+begin
+ case PDU
+ do -- 0 : AARQ
+ AEL_PPDU_AARQ ;
+ AEL_LOOP_MSG(evtOnAARQ);
+ output evtOnAARQ(PDU) to this;
+ PDU := 2;
+ do -- 1 : AARE
+ AEL_PPDU_AARE ;
+ AEL_LOOP_MSG(evtOnAARE);
+ output evtOnAARE(PDU) to this;
+ do -- 2 : RLRQ
+ AEL_PPDU_RLRQ ;
+ AEL_LOOP_MSG(evtOnRLRQ);
+ output evtOnRLRQ(PDU ) to this;
+ do -- 3 : RLRE
+ AEL_PPDU_RLRE ;
+ AEL_LOOP_MSG(evtOnRLRE);
+ output evtOnRLRE(PDU ) to this;
+ do -- 4 : ABRT
+ AEL_LOOP_MSG(evtOnABRT);
+ output evtOnABRT(PDU ) to this;
+ end case;
+end task ProcessPDU ;
+
+task T1 is
+begin
+ AEL_DO_T1;
+ AEL_LOOP_MSG(evtOnPDU);
+end task T1;
+
+task T2 is
+begin
+ AEL_DO_T2;
+ AEL_LOOP_MSG(evtOnPDU);
+end task T2;
+--
+-- Idle State
+--
+state Idle accept
+ when evtOnPDU(PDU) => AwaitingPdu
+ begin
+ execute ProcessPDU ;
+ end evtOnPDU;
+end state Idle;
+
+--
+-- Awaiting PDU
+--
+state AwaitingPdu accept
+ -- default processing case
+ when evtOnPDU(evt) => same
+ begin
+ execute ProcessPDU ;
+ end evtOnPDU;
+ --
+ when evtOnAARQ(aarq) => AwaitingAssociationResponse
+ begin
+ PDU := 1;
+ if (aarq.protocol_version /= 1) then
+ -- Don't forget to initialize abrt
+ output evtOnABRT (abrt) to sender;
+ end if;
+ if aarq.authenticate then
+ -- if TEST PDU then
+ begin
+ DO_PDU_SET;
+ execute T1;
+ end;
+ else
+ DO_PDU_NOT_SET;
+ execute T2;
+ goto Idle;
+ end if ;
+ end evtOnAARQ;
+ --
+ when evtOnAARE(aare) => Associated
+ begin
+ if aare.failed then
+ output evtOnABRT( abrt) to sender;
+ goto Idle ;
+ end if;
+ end evtOnAARE;
+ --
+ when evtOnRLEQ(_v) => AwaitingAssociationResponse
+ begin
+ if (test PDU) then
+ goto Idle;
+ end if;
+ end evtOnRLRQ;
+ --
+ when evtOnRLRE(rlre) => AwaitingAssociationResponse
+ begin
+ AEL_AWAITING_GOTRLRE;
+ end evtOnRLRE;
+ --
+ when evtOnABRT(abrt) => Idle
+ begin
+ end evtOnABRT;
+end state Starting;
+
+state AwaitingAssociationResponse accept
+ -- default processing case
+ when evtOnPDU => same
+ begin
+ execute ProcessPDU ;
+ end evtOnPDU;
+ --
+ when evtOnAARE(aare) => Associated
+ begin
+ AEL_DO_AARE;
+ end evtOnAARE;
+end state AwaitingAssocitationResponse;
+
+state Authenticating accept
+ -- default processing case
+ when evtOnPDU(pdu) => same
+ begin
+ execute ProcessPDU ;
+ end evtOnPDU;
+ --
+ when evtOnAARE(aare) => Associated
+ begin
+ if Authenticated(aare) then
+ if ( not DoPoll()) then
+ LastError ; /* Do Poll Error*/
+ end if;
+ else
+ DoLogin;
+ end if;
+
+ DoPoll ;
+ end Ok;
+
+end state Authentication;
+
+
+state Associated accept
+ -- default processing case
+ when evtOnPDU(pdu) => same
+ begin
+ if ( not Dede )then
+ execute ProcessPDU ;
+ end if;
+ if not Dede1 then
+ execute ProcessPDU ;
+ AThen2;
+ end if;
+ end evtOnPDU;
+ --
+ when evtOnRLRQ(rlrq) => same
+ begin
+ end evtOnRLRQ;
+ --
+ when evtOnABRT(abrt) => Idle
+ begin
+ end evtOnABRT;
+ --
+ when evtOnAARQ(aarq) => same
+ begin
+ end evtOnAARQ;
+end state Associated;
+
+end automaton pacse;
+
+endpackage pkg_acse;
--- /dev/null
+use CSTA_event ;
+package pkg_csta
+
+/**
+ * This package contains all definitions required to process csta events
+ * Right now, the parameters of the signals are ASN1 Objects not the structure
+ */
+
+/* Events */
+signal onServiceInitiated(serviceInitiatedEvent);
+signal onConnectionCleared(connectionCleredEvent);
+signal onDelivered(DeliveredEvent);
+signal onOriginated(OriginatedEvent);
+signal onCallInformation(callInfomrationEvent);
+signal onQueued(queuedEvent);
+signal onHeld(heldEvent);
+signal onEstablished(establishedEvent);
+signal onTransferred(transferredEvent );
+signal onFailed(failedEvent);
+signal onNetworkReached(networkReachedEvent);
+signal onLoggedOn(loggedOnEvent);
+signal onLoggedOff(loggedOffEvent);
+
+signal onOutOfService(outOffServiceEvent);
+signal onBackInService(backInServiceEvent);
+
+/* Generic Automaton type could be placed here */
+endpackage pkg_csta;
+
+
+
--- /dev/null
+/**
+ Extracted from Z.104 to be completed
+*/
+
+package Predefined
+
+value type Boolean;
+ literals true,false;
+ operators
+ "not" ( this Boolean ) -> this Boolean;
+ "and" ( this Boolean, this Boolean) -> this Boolean;
+ "or" ( this Boolean, this Boolean) -> this Boolean;
+ "xor" ( this Boolean, this Boolean) -> this Boolean;
+ "=>" ( this Boolean, this Boolean) -> this Boolean;
+axioms
+ not (true) == false;
+ not (false) == true;
+
+ true and true == true;
+ true and false == false;
+ false and true == false;
+ false and false == false;
+
+endvalue type Boolean;
+
+
+value type Integer;
+ literals unordered nameclass (('0':'9')*) ('0':'9'));
+ operators
+ "-" ( this Integer ) -> this Integer;
+ "+" ( this Integer, this Integer ) -> this Integer;
+ "-" ( this Integer, this Integer ) -> this Integer;
+ "*" ( this Integer, this Integer ) -> this Integer;
+ "/" ( this Integer, this Integer ) -> this Integer raise DivisionByZero;
+ "mod" ( this Integer, this Integer ) -> this Integer raise DivisionByZero;
+ "rem" ( this Integer, this Integer ) -> this Integer;
+ "<" ( this Integer, this Integer ) -> Boolean;
+ ">" ( this Integer, this Integer ) -> Boolean;
+ "<=" ( this Integer, this Integer ) -> Boolean;
+ ">=" ( this Integer, this Integer ) -> Boolean;
+ power ( this Integer, this Integer ) -> this Integer;
+ integer ( Integer ) -> this Integer;
+ num ( this Integer ) -> Integer;
+ bs in nameclass '''' ( (('0' or '1')*'''B') or ((('0':'9') or ('A':'F'))*'''H') ) -> this Integer;
+axioms noequality
+for all a,b,c in this Integer (
+/* constructors are 0, 1, +, and unary - */
+/* equalities between constructor terms */
+ (a + b) + c == a + (b + c);
+ a + b == b + a;
+ 0 + a == a;
+ a + (- a) == 0;
+ (- a) + (- b) == - (a + b);
+
+ << type Integer>> - 0 == 0;
+ - (- a) == a;
+/* */
+/* definition of binary "-" by other operations */
+ a - b == a + (- b);
+/* */
+/* definition of "*" by applying it to all constructors */
+ 0 * a == 0;
+ 1 * a == a;
+ (- a) * b == - (a * b);
+ (a + b) * c == a * c + b * c;
+/* */
+/* definition of "<" by applying it to all constructors */
+ a < b == 0 < (b - a);
+ << type Integer>> 0 < 0 == false;
+ << type Integer>> 0 < 1 == true ;
+ 0 < a == true ==> 0 < (- a) == false;
+ 0 < a and 0 < b == true ==> 0 < (a + b) == true ;
+/* */
+/* definition of ">", "equal", "<=", and ">=" by other operations */
+ a > b == b < a;
+ equal(a, b) == not (a < b or a > b);
+ a <= b == a < b or a = b;
+ a >= b == a > b or a = b;
+/* */
+/* definition of "/" by other operations */
+ a / 0 == raise DivisionByZero;
+ a >= 0 and b > a == true ==> a / b == 0;
+ a >= 0 and b <= a and b > 0 == true ==> a / b == 1 + (a-b) / b;
+ a >= 0 and b < 0 == true ==> a / b == - (a / (- b));
+ a < 0 and b < 0 == true ==> a / b == (- a) / (- b);
+ a < 0 and b > 0 == true ==> a / b == - ((- a) / b);
+
+
+
+/* */
+/* definition of "rem" by other operations */
+ a rem b == a - b * (a/b);
+/* */
+/* definition of "mod" by other operations */
+ a >= 0 and b > 0 ==> a mod b == a rem b;
+ b < 0 ==> a mod b == a mod (- b);
+ a < 0 and b > 0 and a rem b = 0 ==> a mod b == 0;
+ a < 0 and b > 0 and a rem b < 0 ==> a mod b == b + a rem b;
+ a mod 0 == raise DivisionByZero;
+/* */
+/* definition of power by other operations */
+ power(a, 0) == 1;
+ b > 0 ==> power(a, b) == a * power(a, b-1);
+ b < 0 ==> power(a, b) == power(a, b+1) / a; );
+/* */
+/* definition of literals */
+ << type Integer>> 2 == 1 + 1;
+ << type Integer>> 3 == 2 + 1;
+ << type Integer>> 4 == 3 + 1;
+ << type Integer>> 5 == 4 + 1;
+ << type Integer>> 6 == 5 + 1;
+ << type Integer>> 7 == 6 + 1;
+ << type Integer>> 8 == 7 + 1;
+ << type Integer>> 9 == 8 + 1;
+/* */
+/* literals other than 0 to 9 */
+ for all a,b,c in this Integer nameclass (
+spelling (a) == spelling (b) // spelling (c),
+ length( spelling (c)) == 1 ==> a == b * (9 + 1) + c;
+ );
+/* */
+
+/* hex and binary representation of Integer */
+for all b in Bitstring nameclass (
+for all i in bs nameclass (
+spelling (i) == spelling (b) ==> i == << type Bitstring>>num(b);
+ ));
+/* integer makes parent sort into subsort */
+/* num makes subsort into parent sort */
+
+for all i in this Integer (
+for all p in Integer (
+spelling (i) == spelling (p) ==> num(i) == p ;
+ ));
+ integer(num(i)) == i;
+endvalue type Integer;
+
+
+syntype Natural = Integer constants >= 0; endsyntype Natural;
+
+
+
+/* ASN1 Bit */
+value type Bit
+ inherits Boolean ( 0 = false, 1 = true);
+ adding;
+ operators
+ num (this Bit) -> Integer;
+ bit (Integer ) -> this Bit raise OutOfRange;
+
+endvalue type Bit;
+
+
+
+
+interface Pid { literals Null }
+
+value type NULL
+ literals NULL
+endvalue type;
+
+/*
+ Predifined Exception
+*/
+exception
+ OutOfRange
+ , InvalidReference
+ , NoMatchingAnswer
+ , UndefinedVariable
+ , UndefinedField
+ , InvalidIndex
+ , InvalidSort
+ , InvalidCall
+ , DevisionByZero
+ , Empty
+ ;
+
+endpackage Predefined;
--- /dev/null
+package pkg_sip_stack
+
+
+/**
+ * Figure out what the missing
+ */
+value type SIPHeaderItem { struct
+ SIPFrom _from;
+ SIPTo _to ;
+} ;
+
+/* Figure out how to put size contraint on SIPHeader
+
+ */
+value type SIPHeader inherits String <SIPHeaderItem > ;
+
+
+syntype SIPHeaderLim = SIPHeader constants 0:15 endsyntype SIPHeaderLim;
+
+value type SIPMessage { struct
+ SIPHeader header;
+} ;
+
+/**
+ *
+ */
+
+signal onSipInviterSend , onSipOkSend, onSipNackSend,onSipAckSend,onSipPrackSend;
+signal onSipInviteResp,onSipOkResp,onSipNackResp,onSipNackResp,onSipPrackResp;
+
+/**
+ * Should I put block types and automaton types below ?
+ */
+block type SIPStack;
+dcl Integer dde;
+endblock type SIPStack;
+
+endpackage pkg_sip_stack;
--- /dev/null
+package ua_common
+
+/* Define ACSE data types */
+/* Type shall be directely imported from ASN1 Files if possible
+ * something like use package acse.asn1
+ */
+
+/* Define Events and Event List */
+signal evtOnPDU(ACSE_apdu);
+signal evtOnAARQ(AARQ_apdu);
+signal evtOnAARE(AARE_apdu);
+signal evtOnRLRQ(RLRQ_apdu);
+signal evtOnRLRE(RLRE_apdu);
+signal evtOnABRT(ABRT_apdu);
+
+syntype uchar = Integer default 0 constants >= 0 endsyntype uchar;
+syntype ushort = Integer default 0 constants >= 0 endsyntype ushort;
+
+value type infoArray512 inherits Array <512,uchar>;
+value type infoArray516 inherits Array <516,uchar>;
+
+value type uaudp_packet_type { literals
+ CONNECT
+ , CONNECT_ACK
+ , RELEASE
+ , RELEASE_ACK
+ , KEEPALIVE
+ , KEEPALIVE_ACK
+ , NACK
+ , DATA
+ , DATA_ACK; } ;
+
+value type uaudp_generic_packet { struct
+ opcode uchar;
+} ;
+
+value type uaudp_connect_packet { struct
+ opcode uchar;
+ info infoArray512; /* Size 512 */
+};
+
+value type uaudp_nack_packet { struct
+ opcode uchar;
+ seq_number uchar;
+} ;
+
+value type uaudp_data_packet { struct
+ opcode uchar;
+ expe_seq_number ushort;
+ sent_seq_number ushort;
+ info infoArray516; /* Size 516*/
+} ;
+
+value type uaudp { choice
+ cnx uaudp_connect_packet ;
+ cnx_ack uaudp_connect_ack_packet ;
+ release uaudp_generic_packet ;
+ release_ack uaudp_generic_packet;
+ keppalive uaudp_generic_packet ;
+ keepalive_ack uaudp_generic_packet;
+ nack uaudp_nack_packet;
+ data uaudp_data_packet;
+ ack uaudp_data_packet;
+ buffer uchar;
+} ;
+
+
+
+/*
+ C structures
+
+typedef struct {
+ unsigned char opcode;
+ char info[512];
+} uaudp_connect_packet;
+
+typedef struct {
+ unsigned char opcode;
+ unsigned short seq_number;
+} uaudp_nack_packet;
+
+typedef struct {
+ unsigned char opcode;
+ unsigned short expe_seq_number;
+ unsigned short sent_seq_number;
+ char info[516];
+} uaudp_data_packet;
+
+typedef struct {
+ union {
+ uaudp_connect_packet connect;
+ uaudp_connect_ack_packet connect_ack;
+ uaudp_generic_packet release;
+ uaudp_generic_packet release_ack;
+ uaudp_generic_packet keepalive;
+ uaudp_generic_packet keepalive_ack;
+ uaudp_nack_packet nack;
+ uaudp_data_packet data;
+ uaudp_data_packet ack;
+ char buffer;
+ } u;
+} uaudp;
+
+*/
+endpackage ua_common;
--- /dev/null
+use pkg_acse;
+use pkg_csta;
+system sys_csta ;
+
+
+/**
+ * One block that sets communication between the environment and iACSE.
+ * and a communication Channel between iACSE and iCSTA
+ * Signals and other stuff is defined in packages
+ */
+block bCsta ;
+ signal sig;
+ signal sigCSTA;
+
+ gate gt_c in with sig out with sig;
+ /* Missing Automatons in block */
+ /* Referenced automaton type. Means include acse and csta for parsing Or use this for linking */
+ automaton type acse referenced;
+ automaton type csta referenced;
+ /* typebase automaton */
+ automaton iACSE (1,1) : acse;
+ automaton iCSTA (1,1) : csta;
+ /* Gates can be generated on the fly */
+ /* constraint is signal list */
+ channel ch_env2acse
+ from env to iACSE with sig;
+ from iACSE to env with sig;
+ endchannel ch_env2ui;
+
+ channel ch_acse2csts
+ from iACSE to iCSTA with sigCstaEvt;
+ from iCSTA to iACSE with sigCstaAct;
+ endchannel ch_env2ui;
+
+endblock bCsta;
+
+endsystem sys_csta;
--- /dev/null
+use PkgCM_CLib;
+use PkgCM_DLib;
+system cm ;
+
+
+ block type cm_c referenced; block type cm_d referenced; block type cm_tr referenced;
+/*
+*/
+block t ;
+ signal sig;
+
+ gate gt_c in with sig out with sig;
+ /* Missing Automatons in block */
+ /* constraint is signal list */
+endblock t;
+
+/**
+ * VMU Block is an instance of block type
+ * Signaling should come from SIP messages So SIP stack is required
+ * The VMU controls media and
+ */
+block vmu ;
+ /* Signals for the engine must be in block type */
+ signal onPlay;
+ signal onAbort;
+ signal onPause;
+ signal onResume;
+ /* Signals for the UI */
+
+ /* Referenced blocks No sure if this can be present in system */
+ block type vmu_ui referenced;
+ block type vmu_engine referenced;
+ /* Instances created during Block instanciation */
+ /* gates can be declared here */
+ gate gt_env2vmu ;
+endblock vmu;
+
+ /* Channels are outside the block instance */
+ channel ch_env2ui
+ from env
+ to vmu ;
+ endchannel ch_env2ui;
+
+/* type base agents represent instances.
+ Each type should own gates that shall be used to interconnect the instances
+block CM_C:cm_c;
+block CM_D:cm_d;
+*/
+/* Need more clarification */
+channel ch_cd
+ from CM_C via gatec_cd
+ to CM_D via gated_cd
+ with signallist_cd;
+endchannel ch_dc;
+
+endsystem cm;
--- /dev/null
+automaton tftps is
+-- Events
+-- signal EVT_Read(String host,Integer port,String filename)
+signal EVT_Read(String ,Integer ,String );
+-- signal EVT_Write(host,port,filename)
+-- signal EVT_Ack(Integer PacketNumber)
+-- signal EVT_Data(String Buffer,Intger PacketNumber)
+-- signal EVT_Error(Integer cause)
+dcl FLG_fd Integer;
+dcl FLG_buffer Integer;
+dcl FLG_length Integer;
+dcl FLG_cause Integer;
+dcl FLG_filename String;
+dcl FLG_packetNumber Integer;
+dcl FLG_MSG1 String := 'Msg1 String ';
+dcl FLG_MSG3 String := 'Msg3 avec format ? ';
+ --
+ -- Idle state
+ --
+ state STA_Idle accept
+
+ when EVT_Read(host,port,filename) => STA_Reading
+ begin
+ -- Open file
+ -- AEL_StartRead(FLG_filename);
+ if not AEL_StartRead(FLG_filename) then
+ -- send ReadAck checks are OK !
+ AEL_SendData(FLG_filename,FLG_packetNumber);
+ else
+ -- send Error otherwise
+ AEL_SendError ;
+ AEL_Close(FLG_fd);
+ goto STA_Idle ;
+ end if;
+ end EVT_Read;
+
+ when EVT_Write => STA_Writing
+ begin
+ AEL_StartWrite(FLG_filename,FLG_fd);
+ AEL_SendAck(FLG_packetNumber);
+ end EVT_START;
+
+ when EVT_Data,EVT_Ack => same
+ begin
+ AEL_Message(FLG_MSG1);
+ end EVT_END;
+ --
+ when EVT_Error => same
+ begin
+ AEL_Message2(FLG_MSG3,FLG_cause);
+ end EVT_Error;
+
+ end state ST_BEGIN;
+
+ -- Reading server receives ack packages and sends data....
+ state STA_Reading accept
+ -- Should not happen in reading state
+ when EVT_Data => same
+ begin
+ AEL_Message2(FLG_MSG3,FLG_cause);
+ end EVT_Data;
+
+ when EVT_Ack => same
+ begin
+ if ( AEL_TestPacketNumber and not AEL_ReadingEnd)
+ then
+ AEL_SendData(FLG_filename,FLG_packetNumber);
+ end if;
+ if AEL_ReadingEnd then
+ AEL_Close(FLG_fd);
+ goto STA_Idle;
+ end if;
+ end EVT_Ack;
+
+ when EVT_Error => same
+ begin
+ AEL_Message2(FLG_MSG3,FLG_cause);
+ AEL_Close(FLG_fd);
+ goto STA_Idle;
+ end EVT_Error;
+
+ end state STA_Reading;
+
+ --
+ -- endif
+ --
+ state STA_Writing accept
+ when EVT_Data => same
+ begin
+ AEL_Message2(FLG_MSG3,FLG_cause);
+ end EVT_Data;
+
+ when EVT_Ack => same
+ begin
+ AEL_ReadBuffer(FLG_fd,FLG_buffer);
+ AEL_SendData(FLG_buffer,FLG_packetNumber);
+ end EVT_Ack;
+
+ when EVT_Error => same
+ begin
+ goto STA_Idle;
+ end EVT_Error;
+ end state STA_Writing;
+
+
+end automaton test_ ;
+
--- /dev/null
+--
+-- Andre Ebersold
+-- Ua IP protocol stack.
+-- 18/11/2015
+
+automaton uaipclt is
+
+ state STA_Idle accept
+
+ when EVT_Connect => STA_Opening
+ begin
+ -- TODO If Fast CONNECT, it's a bit different
+ AEL_Send(FLG_CONNECT_ACK);
+ AEL_Send(FLG_CONNECT);
+ end EVT_Connect;
+
+ end state STA_Idle;
+
+
+ -- Opening state
+ state STA_Opening accept
+ when EVT_ConnectAck => STA_Open
+ begin
+ --
+ end EVT_ConnectAck;
+ end state STA_Opening;
+
+ -- Open state
+ state STA_Open accept
+ when EVT_Data => same
+ begin
+ --
+ AEL_ProcessData();
+ -- send Ack or Nack depending on Message Number
+ AEL_Send(FLG_ACK);
+ end EVT_Data;
+
+ when EVT_Keepalive => same
+ begin
+ -- send Ack or Nack depending on Message Number
+ AEL_Send(FLG_KEEPALIVE_ACK);
+ end EVT_Data;
+
+ when EVT_Release => STA_Idle
+ begin
+ -- send Ack or Nack depending on Message Number
+ AEL_Send(FLG_RELEASE_ACK);
+ end EVT_Data;
+
+ end state STA_Open;
+
+ -- In case The device requests the Release
+ -- we wait for release Ack message
+ state STA_Closing accept
+ when EVT_ReleaseAck => STA_Idle
+ begin
+ -- send Ack or Nack depending on Message Number
+ end EVT_Data;
+
+ end state STA_Closing;
+
+end automaton uaipclt;
--- /dev/null
+--
+-- Andre Ebersold
+-- Ua IP protocol stack.
+-- 18/11/2015
+use pkg_ua ;
+
+automaton uaipsrv is
+
+ state STA_Idle accept
+
+ when EVT_Connect => STA_Opening
+ begin
+ -- TODO If Fast CONNECT, it's a bit different
+ AEL_Send(FLG_CONNECT_ACK);
+ AEL_NOP;
+ AEL_Send(FLG_CONNECT);
+ end EVT_Connect;
+
+ end state STA_Idle;
+
+
+ -- Opening state
+ state STA_Opening accept
+ when EVT_ConnectAck => STA_Open
+ begin
+ --
+ AEL_NOP;
+ end EVT_ConnectAck;
+ end state STA_Opening;
+
+ -- Open state
+ state STA_Open accept
+ when EVT_Data => same
+ begin
+ --
+ AEL_ProcessData();
+ -- send Ack or Nack depending on Message Number
+ AEL_Send(FLG_ACK);
+ end EVT_Data;
+
+ when EVT_Keepalive => same
+ begin
+ -- send Ack or Nack depending on Message Number
+ AEL_Send(FLG_KEEPALIVE_ACK);
+ end EVT_Data;
+
+ when EVT_Release => STA_Idle
+ begin
+ -- send Ack or Nack depending on Message Number
+ AEL_Send(FLG_RELEASE_ACK);
+ end EVT_Data;
+
+ end state STA_Open;
+
+ -- In case The device requests the Release
+ -- we wait for release Ack message
+ state STA_Closing accept
+ when EVT_ReleaseAck => STA_Idle
+ begin
+ -- send Ack or Nack depending on Message Number
+ end EVT_Data;
+
+ end state STA_Closing;
+
+end automaton uaipsrv;
--- /dev/null
+\section{Genaut}
+
+This document describes several tools and libraries that are provided with the Genaut package.
+It also provides the grammar and semantic of LDS Language
+
+\subsection{genaut executable}
+genaut is an lds compiler that is able to generate three kinds of outputs.
+First it's a rewritten version of ale tools. It's able to generate C structures
+that can be used with a lightweight virtual machine (16 instructions).
+
+Second, it's able to generate byte code for a slightly more sophisticated
+virtual machine. No need to define constants in header files. The vm is
+able to resolve all external links through dynamic loading.
+
+For debug purpose, it's also able to generate text formated intermediate
+code.
+
+\subsection{ldsparser library}
+This librarie provides the core classes two build an abstract syntax tree from an LDS file. The parser implements the observable pattern. Hence, a programmer can easely integrate the parser with a graphical user interface.
+\subsection{ldsgen library}
+This librarie provides classes to traverse the abstract syntax tree and generate executable automatons.
+The first version is able to generate the same code than ALE proprietary tools. The automaton has poor syntax. It's difficult to check the return values of function calls (there is no function declaration in the initial language)
+
+
+
+\printglossary[type=\acronymtype, title=Glossary,toctitle={Glossary} ,numberedsection]
+
+
+IR \gls{LDS} test \gls{IR}
+: print gloss
+
+
--- /dev/null
+\section{LDS Language }
+
+LSD is a derived version of SDL (System description language).
+The main feature is to describe as fast as possible an automaton.
+It handles states, signals and transitions, TASK's and some basic
+procedural language features like (Switch case, loop, if then else).
+
+The language is poorly typed. There are no forward declaration nor
+type declaration.
+There are some ambiguities in the way the VM handles FLAGS and
+function calls. These specificities will be described later on in this document.
+
+\subsection{Reserved words}
+\begin{minipage}{\linewidth}
+\centering
+
+
+\begin{multicols}{4}
+ \begin{enumerate}[nolistsep]
+ \item[] accept
+ \item[] and
+ \item[] automaton
+ \item[] begin
+ \item[] block
+ \item[] case
+ \item[] channel
+ \item[] dcl
+ \item[] do
+ \item[] else
+ \item[] elsif
+ \item[] end
+ \item[] env
+ \item[] event
+ \item[] eventlist
+ \item[] exit
+ \item[] execute
+ \item[] from
+ \item[] gate
+ \item[] goto
+ \item[] is
+ \item[] if
+ \item[] loop
+ \item[] not
+ \item[] or
+ \item[] output
+ \item[] package
+ \item[] parent
+ \item[] priority
+ \item[] reset
+ \item[] same
+ \item[] sender
+ \item[] set
+ \item[] state
+ \item[] system
+ \item[] task
+ \item[] test
+ \item[] then
+ \item[] timer
+ \item[] to
+ \item[] type
+ \item[] use
+ \item[] via
+ \item[] when
+ \item[] while
+ \item[] xor
+\end{enumerate}
+
+\end{multicols}
+\par Reserved words
+\end{minipage}
+\vskip 0.5cm
+All reserved words can be capitalized. Therefore, the reserved word "if" can be "IF" too.
+
+\subsection*{Statements summary}
+ Find below a summary of all statements available in the LDS language.
+ \vskip 2mm
+ \begin{tabular}{|l|l|}
+ \hline
+ Statement & Description \\
+ \hline $<$ automaton $>$ & automaton statement \\
+ \hline $<$ automaton name $>$ & name of the automaton simple identifier \\
+ \hline $<$ task definition $>$ & procedure definition \\
+ \hline $<$ state definition $>$ & definition of states in automaton \\
+ \hline
+
+ \end{tabular}
+
+\subsection{Agent statements}
+Compared to the initial development,the language now supports different kind of agents.
+
+\subsubsection{System declaration}
+The System is the toplevel block. It contains packages and block instances. This level should describe the highest abstract level of a system.
+\subsubsection{Block declaration}
+A block is a dynamic agent that runs in it's own context.
+\subsubsection{Package declaration}
+A package contains automaton descriptions, signal declarations and block description.
+I a package, there is no automaton instance nor block instance.
+An instance of block represents a running entity of a block.
+\subsubsection{Top level automaton}
+All automatons description respect the structure below.
+\begin{lstlisting}
+<automaton> ::= <automaton header> is <automaton body>
+ end automaton <automaton name> ;
+
+<automaton header> ::= automaton <identifier>
+
+<automaton body> ::= {<data declaration>}*
+ {<task definition>}*
+ {<state definition>}*
+\end{lstlisting}
+
+{\color{red} This cannot be the top level declaration in case we plan to have system and block definitions as well.}
+
+\subsection{Behaviour statments}
+\subsubsection{Task definition}
+ Tasks are procedures without parameters that can be called
+ from within several transitions.
+\begin{lstlisting}
+<task definition> ::= task <task name> is
+ begin
+ <task body>
+ end task <task name>;
+\end{lstlisting}
+%
+% Task Body section
+%
+\subsubsection{Taskbody definition}
+The task body is composed with a list of action that are
+sequentially executed.
+\begin{lstlisting}
+<task body> ::= {<action>}*
+
+<action> ::= <call action>
+ | <decision action>
+ | <loop action>
+ | <assignment action>
+ | <set action>
+ | <reset action>
+ | <switch action>
+ | <block action>
+ | <asm action>
+ | <goto action>
+\end{lstlisting}
+The $<$call action$>$ has two forms. The short form is a simple $<$action name$>$ followed by zero or more parameters. This form invokes a C routine. The long form uses the execute keyword and it's purpose is to invoke a task.
+\begin{lstlisting}
+<call action> ::= <action name > {<actual parameters>}*
+ | execute {<actual parameters>}*
+\end{lstlisting}
+The $<$loop action$>$ statement allows iteration blocks. Only two kind of loops are provided by the language.
+\begin{lstlisting}
+ <action loop> ::= while <expresion>
+ loop
+ <decision task body>
+ end loop ;
+ | loop <loop body> end loop ;
+\end{lstlisting}
+
+\subsubsection{State definition}
+\begin{lstlisting}
+<state definitions> ::= {<state>}*
+
+<state>::=state <state name> accept
+ {<transition>}*
+end state <state name> ;
+\end{lstlisting}
+
+\subsubsection{Transition}
+\begin{lstlisting}
+<transition> ::= when <events> => <destination state>
+ <transition body>
+
+<transition body>::= begin
+ <task body>
+ end <event name> ;
+ \end{lstlisting}
+Events in the transition can be represented through a wildcard. In that case all events are valide for this transition.
+\begin{lstlisting}
+<events> ::= {event}
+ | *
+\end{lstlisting}
+The $<$destination state$>$ statement is a state identifier or the "same" keyword which means the automation stays in the current state.
+\pagebreak
+
+\subsubsection{Action statment}
+
+\subsubsection{Call action}
+\begin{lstlisting}
+<call action> ::= <action name>;
+ | <action name> <actual parameters> ;
+ | execute <action name>;
+ | execute <action name> <actual parameters>;
+
+<action name> ::= <identifier>
+\end{lstlisting}
+
+The 'execute' keyword means that we are going to invoke an lds defined task. The direct action names refer to external "C" functions.
+
+\subsubsection{Decision action}
+\begin{lstlisting}
+<action decision> ::= if <expression> then
+ <decision task body>
+ end if ;
+ | if <expression> then
+ <decision task body>
+ else
+ <decision task body>
+ end if ;
+ | if <expression> then
+ <task body>
+ <alternative decisions>
+ end if ;
+ | if <expression> then
+ <task body>
+ <alternative decisions>
+ else
+ <decision task body>
+ end if ;
+
+<decision task body>::= {task body}*
+
+<alternative decisions> ::= <alternative> {alternative}*
+
+<alternative> ::= elsif <expression> then <decision task body>
+
+\end{lstlisting}
+
+\subsubsection{Loop action}
+The implementation is not completed yet. To be checked
+\begin{lstlisting}
+<action loop> ::= while <expression>
+ loop <decision task body>
+ end loop ;
+ | loop <loop body> end loop ;
+
+<loop body> ::= <actions>
+ | exit when <expression> ;
+ | <loop body> exit when <expression> ;
+ | <loop body> <actions>
+\end{lstlisting}
+
+\subsubsection{Assigment action}
+
+\begin{lstlisting}
+<assignment> ::= <primary> = <expression>
+\end{lstlisting}
+There is a missing rule. In case of arrays or objects or structures, how do I select the field to be assigned ? Maybe another rule like $<$primary field$>$
+
+\subsubsection{Set action}
+Set the variable referenced by $<$identifier $>$ to 1. In case the identifier is declared and is a timer, the instruction will start the timer.
+\begin{lstlisting}
+<set action> ::= set <identifier> ;
+\end{lstlisting}
+
+\subsubsection{Reset action}
+Set the variable referenced by $<$identifier $>$ to 0. In case the identifier references a timer declaration, the action will reset the timer.
+
+\begin{lstlisting}
+<reset action> ::= reset <identifier> ;
+\end{lstlisting}
+
+\subsubsection{Switch action}
+This action selects a case depending on the value in $<$case condition$>$ which should be an expression.
+\begin{lstlisting}
+<switch action> ::= case <case condition>
+ {<switch cases>}*
+ end case;
+
+<case condition>::= <identifier>
+
+<switch cases> ::= {<case_> }*
+
+<case_> ::= do <task body>
+
+\end{lstlisting}
+
+\subsubsection{Block action}
+A $<$block action$>$ is basicaly a list of actions enclosed with the begin/end keywords.
+\begin{lstlisting}
+<block action> ::= begin <task body> end;
+ | begin end ;
+
+\end{lstlisting}
+
+{\it Semantic}: A block should be seen as a new execution context by the LDSVM. It should be seen as a closure. It should be possible to declare a use local variables in this context.
+En empty block is simply ignored.
+
+\subsubsection{Asm action}
+{\color{red} This section needs to be completed}
+\begin{lstlisting}
+<asm action> ::= AEL_NOP ;
+ | AEL_RTS ;
+ | AEL_LOOP_MSG <internal event> ;
+ | AEL_JSR_IND ... ;
+\end{lstlisting}
+\subsubsection{Goto action}
+This action overwrites the destination state of the current automaton transition.
+
+\begin{lstlisting}
+<goto action> ::= goto <state name> ;
+\end{lstlisting}
+
+\subsubsection{Outut action}
+The rule below exists in the tested automatons. However, the resulting byte code is nothing.
+It seems that the function has been dropped.
+\begin{lstlisting}
+<output action> ::= output <identifier> {<via> <gate name>} ;
+\end{lstlisting}
+{\color{red} For the LDS extension, the rule above should be extended. Actually, $<$output action$>$ specifies the sending of an event to another block or automaton.}
+\subsubsection{Expression}
+\begin{lstlisting}
+<expression> ::= <operand>
+ | <value returning procedure call>
+
+<operand> ::= <operand0>
+ | <operand> <implies sign> <operand0>
+
+<operand0>::= <operand1>
+ | <operand> { or | xor} <operand1>
+
+<operand1>::= <operand2>
+ | <aperand1> and <operand2>
+
+<operand2>::= <operand3>
+ | <operand2> {
+ <greater than>
+ |<greater than or equal>
+ |<less than>
+ |<less than or equal>
+ |<equal>
+ |<not equal>
+ }<operand3>
+
+<operand3>::= <operand4>
+ |<operand3> {<plus sign> | <hyphen> | <concat>} operand4
+
+
+<operand4>::= <operand5>
+ |<operand4> {<solidus> | <asterisk> } <operand5>
+
+<operand5>::= [<hyphen> | not | test] <primary>
+
+<primary>::= <literal>
+ | (<expresion>)
+ | <variable access>
+ | <conditional expression>
+ | <function call>
+
+<function call>::= <identifier> <actual parameters>
+<conditional expression> ::= test <primary>
+
+<actual parameters> ::= ( actual parameter list)
+<actual parameter list>::= parameter {, parameter}*
+
+<parameter>::= <primary>
+
+\end{lstlisting}
+{\color{red} Not sure if $<$primary$>$ is a good choice for parameter. }
+
+\subsection{Data Declaration}
+
+General rules that includes data, type, signal definitions and channel connections.
+
+\begin{lstlisting}
+<var_declarations> ::= <variables>
+| <var_declarations> <variables>
+
+<variables> ::= <data_decl>
+ | <signal_decl>
+ | <syntype_definition>
+ | <datatype_definition>
+ | <channel_definition>
+
+<data_decl>::= dcl <data> <datatype> <end>
+
+<signal_decl> ::=
+
+<datatype_definition>::= <datatype_heading> <datatype_end>
+
+<datatype_heading>::= value type <identifier>
+
+<datatype_end>::= <end>
+ | endvalue type <identifier> <end>
+ | { dtd_body } <end>
+
+
+\end{lstlisting}
+\subsection{Type declaration}
--- /dev/null
+\section{LDS Binary File Format }
+
+This section describes the binary data structure for an LDS file.
+The LDS file might contain a single automaton, a block type, or system type.
+The file can be read by an execution engine. It will read all entities
+in the file and build executable automaton.
+
+The content must be extensible and simple at the same time. Basically
+for a first step, we need to provide the list of signals that the automaton
+can process. The parameters that the signal can cary.
+
+All function description need to be available in order to allow the virtual
+machine handle the stack and execution flow.
+
+\subsection{Global File structure}
+\begin{lstlisting}
+class LdsBinaryFile
+{
+ long magic
+ long version
+ short ldstype
+ short pool_count
+ cp_info pool_info[pool_count]
+ short state_count
+ state_info state_pool[state_count]
+}
+\end{lstlisting}
+
+ldstype field identifies the type of agent described.
+\linebreak
+ \begin{tabular}{|l|l|}
+ \hline
+ Value & Description \\
+ \hline 01 & system type \\
+ \hline 02 & block type \\
+ \hline 03 & automaton type \\
+ \hline 04 & system \\
+ \hline 05 & automaton \\
+ \hline
+
+ \end{tabular}
+\subsection{Constant pool}
+The constant pool contains all kind of constants that must be available
+to the virtual machine.
+Function declaration entry points are mendatory. This information helps the VM to determine the real number of parameters required by the function.
+Events need to be described as well. It is not mandatory.
+
+\subsection{State pool}
+The state pool contains all states handles by the automaton
+\begin{lstlisting}
+class state_info
+{
+ short name_idx
+ short method_count
+ method_info method[method_count]
+}
+\end{lstlisting}
+
+
+\subsection{method\_info structure}
--- /dev/null
+\section{LDS Intermediate Representation Language }\r
+\r
+To facilitate the transformation of LDS language into C++ or another language, the compiler (genaut) generates an intermediate representation. This output is used by the final generators to generate C++ code.\r
+\r
+\subsection{Organization}\r
+The IR code is simple enough to be executed by a virtual machine.\r
+\r
+\subsection{Module class}\r
+\r
+\subsection{Value class}\r
+There at least two kind of values. Constant values and variable values. The first category never changes during the execution of the automaton. The second category represents a storage area were the program can store a value.\r
+\r
+\subsection{Type class}\r
+To handle parameters in function calls and signal events, the \gls{IR} needs to know the type of each parameter.\r
+Types must be unique during the whole transformation process. Therefore the creation and retrieval of a (IR) type should be handled by an internal factory.\r
+As Types are unique, their location in memory is too and two types that point to the same memory location are of the same type.\r
+ \r
+\r
+\subsection{Instruction class}\r
+This abstract class represents an instruction of \gls{IR}. it is equivalent to an assembler instruction of a virtual machine.
\ No newline at end of file
--- /dev/null
+\section{LDS parser / compiler}
+
+\subsection{Design}
+In order to be fast in the developement phase, I choose the lex/yacc program. The lds grammar is quite simple and does not require a sophisticated hand written lexer and parser.
+To separate the parser from the Abstract Syntax Tree, I also choose the signal/slot pattern.
+
+The parser is responsible to build an Abstraction Syntax Tree. From this tree, we use another module to build an intermediate langage. This langage can that be transcribed into 'C' code, or what ever.
+
+\unitlength=1cm
+\begin{picture}(18,4.5)
+
+\put(0,3){
+ \framebox(1.5,1){.lds}
+ }
+\put(1.5,3.5){
+ \vector(1,0){2.5} }
+\put(2,3.6){parser}
+\put(4,3){
+ \framebox(2.5,1){ AST}}
+\put(6.5,3.5){
+ \vector(1,0){2.5} }
+\put(7,3.6){compiler}
+\put(9,3){
+ \framebox(2,1){IR}}
+\end{picture}
+
--- /dev/null
+\section{LDS UI}
+This section describes the graphic user interface available to handle LDS elements. The idea is to see the automaton through a graphical user interface rather than pure text. The purpose is to get faster graps of the content of a file. Among the elements that needs to be seen easly: The states, the signal processed by the automaton and the transitions.
+
+
+\subsection{LDSView}
+LDSView is a global window responsible to display the LDS View environnement. It is supposed to provide a global view of the LDS working environment. The view shall contain the LDSTree window, a TAB diagram window. Maybe a tab per file or a tab per diagram.
+An editor window should be available.
+
+Drag And Drop from LDSTree to LDSDiagram should work.
+
+\begin{picture}(10,5.5)
+
+\put(0.5,0.5){
+ \framebox(9,4.5){diagram content}
+}
+\put(0.5,0.5){
+ \framebox(9,0.5){}
+}
+\put(0.7,4.6){file.lds}
+\multiput(1.6,0.5)(1.5,0){3}{\line(1,1){0.5}}
+\put(0.5,4.5){
+ \framebox(9,0.5){}}
+\put(0.7,0.6){dia1}
+\multiput(2,4.5)(1.5,0){3}{\line(0,1){0.5}}
+\put(2.6,2.5){\oval(1.5,1)[]}
+\put(6.8,1.7){\usebox{\foldera}}
+\end{picture}
+
+The user will be able to select an open file. This action shall reset the content of the LDSTree view.
+When the user selects a diagram, the content of the selected diagram must be seen.
+
+In the view, there should be a property tab that allow the edition of the properties of the elements in the diagram window or from the LDSTree.
+
+There must be a tool bar that facilitates the addition of new states and transition.
+
+\subsection{LDSTree}
+The LDSTree widget is an FTLK Tree widget that implements the lds parser listener interface.
+Therfore, before parsing an opened file, we register the LDSTree widget with the parser. This
+action should build the FLTK tree.
+If the LDS description contains CIF annotation, the associated widgets shall be build as well.
+
+\subsection{LDSDiagram}
+Several kind of diagrams shall be available. So, LDSDiagram is a top level window for all kinds of diagrams supported by the application.
+
+System diagram, is the top level diagram. It contains blocks and imports packages. The package diagram displays all elements available in a package.
+The Block diagram and finaly the Automaton diagram.
+\subsubsection{LDSDiaSystem}
+The system diagram is the highest level diagram that describes the systems. It shows signal exchanges between blocks.
+\subsubsection{LDSDiaBlock}
+The block diagram contains processes and automatons. There can be on or more instances of a given automoton. However, all instance are executed in the same block thread. The dispatching of the signals is performed sequentially in the block.
+\subsubsection{LDSDiaAutomaton}
+The automaton diagram displays the states and transition of the automation.
+
+\subsection{LDSWidgets}
+Widgets are graphical entities contained in a diagram. For each visible entity there is an associated CIF description in the LDS file. The widget can be removed from the diagram and still be present in the LDS file.
+Open point: How to handle the situation where we have several diagrams that display the same elements? A kind of reference of something like that.
+\linebreak
+What kind of Widgets?
+\subsubsection{LDSWBlock}
+\subsubsection{LDSWAutomaton}
+\subsubsection{LDSWState}
+
+\begin{picture}(7,2)
+\put(0,0.9){State symbol :}
+\put(3.5,1){\oval(1.5,1)[]}
+\end{picture}
+\linebreak
+This symbol reprents a state. Transitions are represented through arrows that connect the states from one to another state.
+\subsubsection{LDSWTransition}
+\subsubsection{LDSWComment}
+\subsubsection{LDSWAction}
+\subsubsection{LDSWTask}
+\subsubsection{LDSWSystem}
+\subsubsection{LDSWPackage}
--- /dev/null
+
+% State Symbol
+\newsavebox{\symstate}
+\savebox{\symstate}
+(40,32)[bl]{% definition
+ \multiput(0,0)(0,28){2}
+ {\line(1,0){40}}
+ \multiput(0,0)(40,0){2}
+ {\line(0,1){28}}
+ \put(1,28){\oval(2,2)[tl]}
+ \put(1,29){\line(1,0){5}}
+ \put(9,29){\oval(6,6)[tl]}
+ \put(9,32){\line(1,0){8}}
+ \put(17,29){\oval(6,6)[tr]}
+ \put(20,29){\line(1,0){19}}
+ \put(39,28){\oval(2,2)[tr]}
+}
+
+
+% Automaton / Process Symbol ?
+\newsavebox{\symautomaton}
+\savebox{\symautomaton} (10,10) [bl]
+{
+}
+
+% Block Symbol
+\newsavebox{\symblock}
+\savebox{\symblock} (10,10) [bl]
+{
+ put(0,0){\framebox(10,10){}}
+}
+
+% Stop Symbol
+\newsavebox{\symstop}
+\savebox{\symstop} (10,10) [bl]
+{
+}
+% Return Symbol
+\newsavebox{\symreturn}
+\savebox{\symreturn} (10,10) [bl]
+{
+}
+% Label not sure if I want this.
+\newsavebox{\symlabel}
+\savebox{\symlabel} (10,10) [bl]
+{
+ \put(5,5){\oval(5,5)}
+}
+% Output Symbol
+\newsavebox{\symoutput}
+\savebox{\symoutput} (20,10) [bl]
+{
+}
+
+% Decision Symbol
+\newsavebox{\symdecision}
+\savebox{\symdecision} (10,10) [bl]
+{
+}
+
+% Action symbol assigment
+\newsavebox{\symblocktype}
+\savebox{\symblocktype} (10,10) [bl]
+{
+}
+
+% Type symbols
+
+\newsavebox{\symblocktype}
+\savebox{\symblocktype} (10,10) [bl]
+{
+ put(0,0){\framebox(10,10){}}
+ put(2,2){\framebox(7,7){}}
+}
+\newsavebox{\symprocesstype}
+\savebox{\symprocesstype} (10,10) [bl]
+{
+}
+\newsavebox{\symautomatontype}
+\savebox{\symautomatontype} (10,10) [bl]
+{
+}
+
--- /dev/null
+\documentclass[12pt,a4paper]{article}
+\usepackage{listings}
+\usepackage{titlesec}
+\usepackage{tabularx,caption,color,multicol,enumitem}
+\usepackage[acronym,nomain,xindy,section=subsection]{glossaries}
+\newcommand{\sectionbreak}{\clearpage}
+
+\renewcommand{\thesection}{}
+\renewcommand{\thesubsection}{\arabic{section}.\arabic{subsection}}
+\makeatletter
+\def\@seccntformat#1{\csname #1ignore\expandafter\endcsname\csname the#1\endcsname\quad}
+\let\sectionignore\@gobbletwo
+\let\latex@numberline\numberline
+\def\numberline#1{\if\relax#1\relax\else\latex@numberline{#1}\fi}
+\makeatother
+
+\makeglossaries
+
+\title{LDS Language}
+\author{Andre \textsc{Ebersold}}
+\date{\today}
+
+%\newacronym[longplural=Inmunoglobulinas]{IG}{IG}{Inmunoglobulina}
+\newacronym{IR}{IR}{Intermediate Representation}
+\newacronym{LDS}{LDS}{system description language}
+
+\begin{document}
+ \maketitle
+ \begin{abstract}
+ This document contains the LDS language specification. An automaton description language for protocol design. Several tools that were developed and use the language.
+ \end{abstract}
+% Some figures
+\newsavebox{\foldera}
+\savebox{\foldera}
+(40,32)[bl]{% definition
+ \multiput(0,0)(0,28){2}
+ {\line(1,0){40}}
+ \multiput(0,0)(40,0){2}
+ {\line(0,1){28}}
+ \put(1,28){\oval(2,2)[tl]}
+ \put(1,29){\line(1,0){5}}
+ \put(9,29){\oval(6,6)[tl]}
+ \put(9,32){\line(1,0){8}}
+ \put(17,29){\oval(6,6)[tr]}
+ \put(20,29){\line(1,0){19}}
+ \put(39,28){\oval(2,2)[tr]}
+}
+\pagebreak
+\tableofcontents
+\pagebreak
+
+% Tools description
+\input{Section_1}
+% LDS Language section
+\input{Section_2}
+% Parser Description
+\input{Section_Parser}
+% LDS Compiler
+% LDS Intermediary representation
+\input{Section_IR}
+% LDS Virtual machine
+% Automation Binary File Format
+\input{Section_4}
+\input{Section_UI}
+% Conclusion of the work
+% a Bibliographie of all documents I used
+\end{document}
--- /dev/null
+PROJECT(libgenlds)
+
+INCLUDE_DIRECTORIES(${CMAKE_CURRENT_BINARY_DIR})
+INCLUDE_DIRECTORIES(${CMAKE_CURRENT_SOURCE_DIR})
+INCLUDE_DIRECTORIES(${CMAKE_CURRENT_SOURCE_DIR}/../common/include/)
+INCLUDE_DIRECTORIES(${aebutils_SOURCE_DIR})
+# For option...
+INCLUDE_DIRECTORIES(${aebutils_SOURCE_DIR}/aeb)
+
+ADD_LIBRARY(ldsgen
+ gen_lpcm_aac.cpp
+ gen_lpcm.cpp
+ gen_datatype.cpp
+)
--- /dev/null
+#include <iostream>
+#include <fstream>
+#include <string.h>
+#include <map>
+#include <list>
+#include <vector>
+#include <cctype>
+#include <algorithm>
+#include <sstream>
+
+// For open / close
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <fcntl.h>
+// for access function I need unistd
+#ifndef _WIN32
+#include <unistd.h>
+#endif
+#include <stdlib.h>
+// AST
+#include "AST/Stmt.h"
+#include "AST/Expr.h"
+#include "AST/Decl.h"
+
+#include "AST/ASTRecursiveVisitor.h"
+#include "IR/Module.h"
+
+#include "gen_datatype.h"
+
+
+
+genDatatype::genDatatype( aeb::lds::CodeGen::CodeGenModule &_Module
+ ,std::ostream &os)
+ : m_os(os),m_Module(_Module)
+{
+}
+
+genDatatype::~genDatatype()
+{
+ std::cout<<"genDatatype:: What I got so far ....\n"<<m_sbuf.str()<<std::endl;
+}
+
+bool
+genDatatype::TraverseAgentDecl(AST::AgentDecl *ag)
+{
+ for (AST::DeclContext::specific_decl_iterator<AST::ValueTypeDecl> it(ag->begin());
+ it != ag->end()
+ ; ++it ) {
+ TRY_TO(TraverseDecl(*it));
+ }
+ return true;
+}
+
+bool
+genDatatype::VisitValueTypeDecl(AST::ValueTypeDecl *_decl)
+{
+ cppRecord cr(m_Module,_decl->getName(),m_sbuf);
+ cr.TraverseDecl(_decl);
+ m_sbuf<<"}"<<std::endl;
+ m_sbuf<<"genDatatype::Got Value Type Decl ..."<<_decl->getName()<<std::endl;
+ return true;
+}
+
+bool
+genDatatype::VisitRecordDecl(AST::RecordDecl *_decl)
+{
+ m_sbuf<<"Got Record Decl ..."<<std::endl;
+ //return false;
+ return true;
+}
+
+bool
+genDatatype::VisitEnumDecl(AST::EnumDecl *_decl)
+{
+ m_sbuf<<"Got Enum Decl ..."<<std::endl;
+ return true;
+}
+
+bool
+genDatatype::VisitTypedefDecl(AST::TypedefDecl *_decl)
+{
+ m_sbuf<<"Got typedef Decl ..."<<_decl->getName()<<std::endl;
+ return true;
+}
+
+bool
+genDatatype::VisitTypeDecl(AST::TypeDecl *_decl)
+{
+ //m_sbuf<<"Got type Decl ..."<<_decl->getName()<<std::endl;
+ return true;
+}
+
+
+bool
+genDatatype::VisitFieldDecl(AST::FieldDecl *_decl)
+{
+ //m_sbuf<<"Got Field Decl ..."<<_decl->getName()<<std::endl;
+ return true;
+}
+
+bool
+genDatatype::VisitEnumConstantDecl(AST::EnumConstantDecl *_decl)
+{
+ m_sbuf<<"Got Enum Decl ..."<<_decl->getName()<<std::endl;
+ return true;
+}
+
+
--- /dev/null
+#ifndef GEN_LPCM_DATATYPE_H
+#define GEN_LPCM_DATATYPE_H
+#include <fstream>
+#include <ostream>
+#include <set>
+
+#include <aeb/dlilist.h>
+#include <aeb/dlilist_node.h>
+#include <IR/LdsInstruction.h>
+#include <IR/LdsInstrVisitor.h>
+#include <IR/Transition.h>
+#include <IR/BasicBlock.h>
+#include <IR/LdsBuilder.h>
+#include <IR/Type.h>
+#include <CodeGen/CodeGenType.h>
+#include <CodeGen/CodeGenModule.h>
+#include <CodeGen/CodeGenFunction.h>
+#include <CodeGen/ModuleBuilder.h>
+
+/**
+ * @brief the purpose of this class is to
+ * generate the structures that will be used
+ * by the virtual machine to resole address
+ * of datatypes. Mainly structures, unions, arrays
+ *
+ */
+class genDatatype : public AST::RecursiveVisitor<genDatatype> {
+
+ std::stringstream m_sbuf;
+ std::ostream &m_os;
+ aeb::lds::CodeGen::CodeGenModule &m_Module;
+ protected:
+ /**
+ * I might need a couple of
+ * private classes to generate the structures and so on
+ */
+ struct cppRecord : public AST::RecursiveVisitor<cppRecord> {
+ std::stringstream &m_sbuf;
+ std::string m_struct;
+ aeb::lds::CodeGen::CodeGenModule &m_Module;
+ public:
+ cppRecord(
+ aeb::lds::CodeGen::CodeGenModule &_Module
+ ,const std::string &_n
+ ,std::stringstream &_sbuf) : m_struct(_n)
+ , m_Module(_Module)
+ , m_sbuf(_sbuf) {};
+ ~cppRecord() {
+ }
+ bool VisitRecordDecl(AST::RecordDecl *_decl) {
+ if (_decl->isStruct()) {
+ m_sbuf<<" struct _"<<m_struct<<" {"<<std::endl;
+ } else {
+ m_sbuf<<" union {"<<std::endl;
+ }
+ return true;
+ }
+ bool VisitFieldDecl(AST::FieldDecl *_decl) {
+ aeb::lds::CodeGen::CodeGenType &CGT = m_Module.getType();
+ AST::Type *T = _decl->getType();
+ aeb::lds::Type *ldsT = CGT.ConvertType(T);
+ if (ldsT != NULL)
+ ldsT->print(m_sbuf);
+ m_sbuf<<" "<<_decl->getName()<<std::endl;
+ return true;
+ }
+ };
+
+ public:
+ genDatatype( aeb::lds::CodeGen::CodeGenModule &_Module
+ ,std::ostream &os);
+ virtual ~genDatatype();
+
+ bool TraverseAgentDecl(AST::AgentDecl *ag) ;
+
+ bool VisitValueTypeDecl(AST::ValueTypeDecl *_decl);
+ bool VisitRecordDecl(AST::RecordDecl *_decl);
+ bool VisitEnumDecl(AST::EnumDecl *_decl);
+ bool VisitTypedefDecl(AST::TypedefDecl *_decl);
+ bool VisitTypeDecl(AST::TypeDecl *_decl);
+
+
+ bool VisitFieldDecl(AST::FieldDecl *_decl);
+ bool VisitEnumConstantDecl(AST::EnumConstantDecl *_decl);
+};
+
+
+#endif
+
--- /dev/null
+#include <iostream>
+#include <fstream>
+#include <string.h>
+#include <map>
+#include <list>
+#include <vector>
+#include <cctype>
+#include <algorithm>
+#include <sstream>
+
+// For open / clise
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <fcntl.h>
+// for access function I need unistd
+#ifndef _WIN32
+#include <unistd.h>
+#endif
+#include <stdlib.h>
+// AST
+#include "AST/Stmt.h"
+#include "AST/Expr.h"
+#include "AST/Decl.h"
+
+#include "AST/ASTRecursiveVisitor.h"
+#include "IR/Module.h"
+
+#include "gen_lpcm_aac.h"
+#include "gen_datatype.h"
+#include <gen_lpcm.h>
+
+
+
+/**
+ * Helper Class to generate eeta file
+ */
+struct GenEta : public aeb::lds::InstrVisitor<GenEta> {
+ public:
+ typedef std::map<std::string,aeb::lds::GlobalVariable *> GlobalMap;
+ typedef GlobalMap::iterator GlobalIterator;
+ typedef GlobalMap::const_iterator ConstGlobalIterator;
+ protected:
+ GlobalMap m_Globals;
+ std::string m_OutPath;
+ std::fstream act;
+ long m_NbI;
+ long m_NbT;
+ long m_NbE; //NumOf Functions
+ public:
+ GenEta(const std::string &p) : m_OutPath(p) , m_NbI(0) , m_NbE(0) , m_NbT(0) {}
+
+ void visitTransition(aeb::lds::Transition &T) { m_NbT++; };
+
+ void visitFunction(aeb::lds::Function &T) {
+ //act<<std::endl<<"/* Start Fct T "<<T.getName()<<" */"<<std::endl;
+ };
+
+ void visitState(aeb::lds::State &T) {
+ act<<"#define "<<T.getName()<<" "<<m_NbE++<<std::endl;
+ };
+
+ void visitInstruction(aeb::lds::Instruction &I) {
+ m_NbI+=I.NbOpcode();
+ };
+
+ void visitGlobalVariable(aeb::lds::GlobalVariable &G) {
+ m_Globals[G.getName()] = &G;
+ };
+
+ void Generate(aeb::lds::Module &M,const std::string &name) {
+ std::string f = m_OutPath +"/"+name+".eta";
+ act.open(f.c_str(),std::fstream::out);
+ prolog(name);
+ visit(M);
+ epilog(M.getName());
+ // Epilog ...
+ act.close();
+ }
+
+ void prolog(const std::string &mn) {
+ act<<""<<std::endl;
+ }
+
+ void epilog(const std::string &name) {
+ unsigned long count = 0;
+ act<<std::endl<<"#define "<<name<<"_taille_tran "<<m_NbT<<std::endl;
+ act<<"/* External Functions ....*/"<<std::endl;
+ act<<"#ifdef WITH_DEFINE_EXTERNAL_FLAGS"<<std::endl;
+ for (ConstGlobalIterator it = m_Globals.begin() ;it != m_Globals.end() ; ++it) {
+ act<<"#define "<<it->first<<" "<<count++<<std::endl;
+ }
+ act<<"#endif"<<std::endl;
+ }
+};
+
+
+/**
+ *
+ */
+struct GenAct : public aeb::lds::InstrVisitor<GenAct>
+{
+ protected:
+ std::string m_OutPath;
+ std::string m_ModuleName;
+ std::ostringstream m_FctOp;
+ std::fstream act;
+ std::stringstream fct_code;
+ std::stringstream fct;
+ long m_NbI;
+ long m_NbFctOp;
+ long m_NbFct;
+ int m_Version;
+ public:
+ GenAct(const std::string &p,int version = 0)
+ : m_NbFct(0),m_Version(version), m_OutPath(p) , m_NbI(0)
+ ,m_FctOp(std::ostringstream::ate)
+ {}
+
+ void visitTransition(aeb::lds::Transition &T)
+ {
+ // act<<"/* T "<<T.getName()<<"*/"<<std::endl;
+ };
+
+ void visitFunction(aeb::lds::Function &T)
+ {
+ m_NbFctOp = 0;
+ m_FctOp.str("");
+ if ( ! T.isExternal()) {
+ if (!m_Version)
+ {
+ act<<std::endl<<"/* Start Loc Fct T "<<T.getName()<<" */"<<std::endl;
+ }
+ m_FctOp<<" /* Lds Local Function T "<<T.getName();
+ m_FctOp<<" size: "<<T.getBlockList().size();
+ m_FctOp<<" Blocks */"<<std::endl;
+ fct<<std::endl<<"/* Start Loc Fct T "<<T.getName()<<" */"<<std::endl;
+ }
+ };
+ void visitFunctionEnd(aeb::lds::Function &T)
+ {
+ if ( (! T.isExternal()) && m_Version) {
+ if (m_NbFct)
+ {
+ fct<<" , ";
+ }
+ fct<<"{"<<T.getNbParams()<<",0,0,0,0,";
+ fct<<m_NbFctOp<<",\""<<T.getName()<<"\",NULL,NULL ,_f"<<m_NbFct<<" }";
+ fct<<std::endl;
+ fct_code<<"static LdsInstruction _f"<<m_NbFct<<"[]={\n";
+ fct_code<<m_FctOp.str()<<"}; "<<std::endl;
+ m_FctOp.str("");
+ m_NbFct++;
+ }
+ };
+
+ void visitBasicBlock(aeb::lds::BasicBlock &T)
+ {
+/* SHOULD BE PUT UNDER DEBUG FLAG OPCODE_DEBUG */
+#if 0
+ if (m_Version > 0)
+ {
+ m_FctOp<<" ";
+ m_FctOp<<"/* BLOCK "<<T.getName();
+ m_FctOp<<" size="<<T.size();
+ m_FctOp<<" */"<<std::endl;
+ } else
+ act<<"/* "<<T.getName()<<"*/"<<std::endl;
+#endif
+ };
+
+ void visitState(aeb::lds::State &T)
+ {
+ };
+
+ /**
+ *
+ */
+ void visitInstruction(aeb::lds::Instruction &I)
+ {
+ if (I.NbOpcode() ) {
+ if (m_Version == 0)
+ {
+ if (m_NbI++) {
+ act<<" ,";
+ } else {
+ act<<" ";
+ }
+ }
+ // New
+ if (m_NbFctOp) {
+ m_FctOp<<" ,";
+ } else
+ m_FctOp<<" ";
+
+ m_NbFctOp += I.NbOpcode();
+ if (m_Version > 0)
+ {
+ std::string i(I.getOpcodeName());
+ //std::cerr<<" <"<<i<<">"<<std::endl;
+ m_FctOp<<" ";
+ m_FctOp<<i<<std::endl;
+ } else
+ act<<I.getOpcodeName()<<std::endl;
+
+ }
+
+ };
+
+ void Generate(aeb::lds::Module &M,const std::string &name)
+ {
+ m_ModuleName = name;
+ std::string f = m_OutPath +"/"+name+".act";
+ act.open(f.c_str(),std::fstream::out);
+ prolog(name);
+ visit(M);
+ epilog();
+ // Epilog ...
+ act.close();
+ }
+ void prolog(const std::string &mn)
+ {
+ fct.str("");
+ fct_code.str("");
+ if (m_Version)
+ {
+ //act<<"const LdsFunctionProto "<<mn<<"_act [] = {"<<std::endl;
+ } else
+ act<<"const unsigned short "<<mn<<"_act [] = {"<<std::endl;
+ }
+ void epilog() {
+ if (m_Version)
+ {
+ act<<fct_code.str()<<std::endl;
+ act<<"const LdsFunctionProto "<<m_ModuleName<<"_act [] = {"<<std::endl;
+ act<<fct.str()<<std::endl;
+ }
+ act<<"};"<<std::endl;
+ }
+};
+
+
+/**
+ * Helper class to generate tra file
+ */
+class GenTra
+{
+ protected:
+ std::string m_OutPath;
+ std::fstream tra;
+
+ //
+ struct GenTraEvt : public aeb::lds::InstrVisitor<GenTraEvt>
+ {
+ std::ostream &m_trae;
+ long m_Count;
+ public:
+ GenTraEvt(std::ostream &_s) : m_Count(0) , m_trae(_s) {}
+
+ void visitTransition(aeb::lds::Transition &T) {
+ if (m_Count++) {
+ m_trae<<" ,"<<T.getEvent()<<std::endl;
+ } else {
+ m_trae<<" "<<T.getEvent()<<std::endl;
+ }
+ };
+
+ void Generate(aeb::lds::Module &M) {
+ prolog(M.getName());
+ visit(M);
+ epilog();
+ }
+
+ void prolog(const std::string &mn) {
+ m_trae<<"const unsigned short "<<mn<<"_evt [] = {"<<std::endl;
+ }
+ void epilog() {
+ m_trae<<"};"<<std::endl;
+ }
+ };
+ //
+ struct GenTraState : public aeb::lds::InstrVisitor<GenTraState> {
+ std::ostream &m_trae;
+ long m_Count;
+ public:
+ GenTraState(std::ostream &_s) : m_Count(0) , m_trae(_s) {}
+
+ void visitTransition(aeb::lds::Transition &T) {
+ if (m_Count++) {
+ m_trae<<" ,"<<T.getTargetState()<<std::endl;
+ } else {
+ m_trae<<" "<<T.getTargetState()<<std::endl;
+ }
+ };
+
+ void Generate(aeb::lds::Module &M) {
+ prolog(M.getName());
+ visit(M);
+ epilog();
+ }
+
+ void prolog(const std::string &mn) {
+ m_trae<<"const unsigned short "<<mn<<"_sta [] = {"<<std::endl;
+ }
+ void epilog() {
+ m_trae<<"};"<<std::endl;
+
+ }
+ };
+
+
+ //
+ struct GenTraSem : public aeb::lds::InstrVisitor<GenTraSem> {
+ std::ostream &m_trae;
+ long m_Count;
+ public:
+ GenTraSem(std::ostream &_s) : m_Count(0) , m_trae(_s) {}
+
+ void visitTransition(aeb::lds::Transition &T) {
+ if (m_Count++) {
+ m_trae<<" ,"<<T.getFunction()->getName()<<std::endl;
+ } else {
+ m_trae<<" "<<T.getFunction()->getName()<<std::endl;
+ }
+ };
+
+ void Generate(aeb::lds::Module &M) {
+ prolog(M.getName());
+ visit(M);
+ epilog();
+ }
+
+ void prolog(const std::string &mn) {
+ m_trae<<"const unsigned short "<<mn<<"_sem [] = {"<<std::endl;
+ }
+ void epilog() {
+ m_trae<<"};"<<std::endl;
+ }
+ };
+
+
+
+ public:
+ GenTra(const std::string &op) : m_OutPath(op) {};
+
+ void Generate(aeb::lds::Module &M,const std::string &name) {
+ std::string f = m_OutPath +"/"+name+".tra";
+ tra.open(f.c_str(),std::fstream::out);
+ // prolog(name);
+ GenTraEvt te(tra);
+ te.Generate(M);
+ GenTraState st(tra);
+ st.Generate(M);
+ GenTraSem sem(tra);
+ sem.Generate(M);
+ epilog(tra,M.getName());
+ // Epilog ...
+ tra.close();
+ } ;
+ void epilog(std::ostream &m_trae,const std::string &name) {
+ m_trae<<"const struct { ";
+ m_trae<<" unsigned short *ptr;"<<std::endl;
+ m_trae<<" unsigned short t_ptr;"<<std::endl;
+ m_trae<<" unsigned short *eta;"<<std::endl;
+ m_trae<<" unsigned short t_eta;"<<std::endl;
+ m_trae<<" unsigned short *evt;"<<std::endl;
+ m_trae<<" unsigned short t_evt;"<<std::endl;
+ m_trae<<" unsigned short *sem;"<<std::endl;
+ m_trae<<" unsigned short t_sem;"<<std::endl;
+ m_trae<<" unsigned short state;"<<std::endl;
+ m_trae<<"} t_aut_"<<name<<"= {"<<std::endl;
+ m_trae<<" (unsigned short *)"<<name<<"_ptr,sizeof("<<name<<"_ptr[0]),"<<std::endl;
+ m_trae<<" (unsigned short *)"<<name<<"_sta,sizeof("<<name<<"_sta[0]),"<<std::endl;
+ m_trae<<" (unsigned short *)"<<name<<"_evt,sizeof("<<name<<"_evt[0]),"<<std::endl;
+ m_trae<<" (unsigned short *)"<<name<<"_sem,sizeof("<<name<<"_sem[0]),"<<std::endl;
+ m_trae<<"0"<<std::endl;
+ m_trae<<"};"<<std::endl;
+ }
+
+};
+
+
+/**
+ * Helper Class
+ * ptr files is a table that tells where each state starts in the tra table.
+ * the list of events accepted is between current state and next state.
+ * The the automaton is looking for the next state and SEM to be executed
+ *
+ * Best is to rewrite traverse Transition to limit the traversal.
+ */
+class ptrVisitor : public AST::RecursiveVisitor<ptrVisitor> {
+ std::string m_OutPath;
+ std::fstream act_output;
+ unsigned long m_NbTransition;
+ public:
+ ptrVisitor(const std::string &od) : m_OutPath(od) {
+ }
+
+ /**
+ *
+ */
+ bool TraverseAutomatonDecl(AST::AutomatonDecl *Aut) {
+ std::string f = m_OutPath +"/"+Aut->getName()+".ptr";
+ act_output.open(f.c_str(),std::fstream::out);
+
+ m_NbTransition = 0;
+ act_output<<"const unsigned short "<<Aut->getName()<<"_ptr [] = {"<<std::endl;
+ act_output<<" "<<m_NbTransition;
+ for (AST::DeclContext::specific_decl_iterator<AST::StateDecl> it(Aut->begin()); it != Aut->end() ; ++it ) {
+ TRY_TO(TraverseDecl(*it));
+ }
+ act_output<<"};"<<std::endl;
+ act_output.close();
+ return true;
+ }
+
+ /**
+ *
+ */
+ bool VisitAutomatonDecl(AST::AutomatonDecl *d) {
+ std::cout<<"ptrVisitor Handle Automaton "<<d->getName()<<std::endl;
+ return true;
+ }
+
+ /**
+ *
+ */
+ bool TraverseTransitionDecl(AST::TransitionDecl *t) {
+ for (AST::DeclContext::specific_decl_iterator<AST::EventDecl> it(t->begin()); it != t->end() ; ++it ) {
+ TRY_TO(TraverseEventDecl(*it));
+ }
+ return true;
+ }
+
+ /**
+ *
+ */
+ bool TraverseStateDecl(AST::StateDecl *t) {
+ act_output<<" /* "<<t->getName()<<"\t\t\t\t*/ "<<std::endl;
+ for (AST::DeclContext::specific_decl_iterator<AST::TransitionDecl> it(t->begin()); it != t->end() ; ++it ) {
+ TRY_TO(TraverseTransitionDecl(*it));
+ }
+ act_output<<" ,"<<m_NbTransition;
+ return true;
+ }
+
+ /**
+ *
+ */
+ bool VisitEventDecl(AST::EventDecl *S) {
+ m_NbTransition++;
+ return true;
+ }
+};
+
+
+
+void gen_lpcm::gen_all()
+{
+ gen_ptr();
+ gen_code();
+};
+
+void
+gen_lpcm::gen_ptr() {
+ ptrVisitor ptr(m_OutputPath);
+ ptr.TraverseDecl(m_RootDecl);
+}
+
+/**
+ * Generates act file
+ */
+void
+gen_lpcm::gen_code()
+{
+ AST::DeclContext *DC = dynamic_cast<AST::DeclContext *>(m_RootDecl);
+ std::cout<<"gen_lpcm::gen_code: Try new model ... "<<m_Version<<std::endl;
+ if (DC)
+ {
+ for (AST::DeclContext::decl_iterator it = DC->begin(); it !=DC->end(); ++it)
+ {
+ if ( AST::AutomatonDecl *aut = dynamic_cast<AST::AutomatonDecl *>(*it) )
+ {
+ generate_automaton(*aut);
+ } else if ( AST::BlockDecl *block = dynamic_cast<AST::BlockDecl *>(*it) )
+ {
+ generate_block(*block);
+ } else if ( AST::PackageDecl *pkg = dynamic_cast<AST::PackageDecl *>(*it) )
+ {
+ generate_package(*pkg);
+ } else if ( AST::SystemDecl *s = dynamic_cast<AST::SystemDecl *>(*it) )
+ {
+ generate_system(*s);
+ } else if ( AST::PackageUseDecl *pkgu = dynamic_cast<AST::PackageUseDecl *>(*it) )
+ {
+ std::cout<<"gen_lpcm::gen_code Declaration is Use "<<pkgu->getName()<<std::endl;
+ } else
+ {
+ std::cout<<"Declaration is not an automaton not aBlock, not a PAckage, not a System "<<std::endl;
+ }
+ }
+ }
+}
+
+
+typedef AST::DeclContext::specific_decl_iterator<AST::AutomatonDecl> autiterator;
+typedef AST::DeclContext::specific_decl_iterator<AST::BlockDecl> biterator;
+
+/**
+ * Use a Help class for block generation.
+ * Maybe block type generation makes more sense
+ */
+void
+gen_lpcm::generate_automaton(AST::AutomatonDecl &aut)
+{
+ // Should I use the same Generator ?
+ aeb::lds::CodeGen::CodeGenerator *CG = aeb::lds::CodeGen::CreateLdsGenerator(m_Context,aut.getName());
+ std::cout<<"gen_lpcm::genenrate_automaton "<<aut.getName()<<std::endl;
+ CG->HandleTopLevelDecl(&aut);
+
+ Statistics Stat;
+ // Something Like, CG->GetModule, AACGenerator act( stream,Module)
+ //act.generate
+ // Or bc BCGenerator(stream,Module)
+ // bc.save
+ aeb::lds::Module *m = CG->GetModule();
+ Stat.visit(m);
+ std::cout<<"Stats Module "<<aut.getName()<<std::endl;
+ std::cout<<Stat<<std::endl;
+
+ GenAct act(m_OutputPath,m_Version);
+ act.Generate(*m,aut.getName());
+
+ // Don't if version < 1
+ if (m_Version < 1 ) {
+ GenEta eta(m_OutputPath);
+ eta.Generate(*m,aut.getName());
+ }
+ GenTra tra(m_OutputPath);
+ tra.Generate(*m,aut.getName());
+
+ GenAac aac(m_OutputPath,m_Version);
+ aac.Generate(*m,aut.getName());
+
+ delete (m);
+ delete (CG);
+
+}
+
+
+/**
+ *
+ */
+void
+gen_lpcm::generate_block(AST::BlockDecl &block)
+{
+ AST::DeclContext *DC = dynamic_cast<AST::DeclContext *>(&block);
+ // Should I use the same Generator ?
+ aeb::lds::CodeGen::CodeGenerator *CG = aeb::lds::CodeGen::CreateLdsGenerator(m_Context,block.getName());
+ std::cout<<"gen_lpcm::generate_block "<<block.getName()<<std::endl;
+ autiterator bend;
+ for (autiterator it(DC->begin()) ; it != bend ;++it)
+ {
+ std::cout<<"gen_lpcm::generate_block "<<block.getName()<<" has an automaton"<<std::endl;
+ generate_automaton(*(*it));
+ }
+ CG->HandleTopLevelDecl(&block);
+ aeb::lds::Module *m = CG->GetModule();
+
+ GenAct act(m_OutputPath,m_Version);
+ act.Generate(*m,block.getName());
+
+ GenEta eta(m_OutputPath);
+ eta.Generate(*m,block.getName());
+
+ GenTra tra(m_OutputPath);
+ tra.Generate(*m,block.getName());
+
+ GenAac aac(m_OutputPath,m_Version);
+ aac.Generate(*m,block.getName());
+ delete m;
+ delete(CG);
+ std::cout<<"gen_lpcm::generate_block "<<block.getName()<<" end"<<std::endl;
+}
+
+/**
+ * Use as Helper class for package generation as well
+ */
+void
+gen_lpcm::generate_package(AST::PackageDecl &pkg)
+{
+ std::cout<<"gen_lpcm::generate_package "<<pkg.getName()<<" begin"<<std::endl;
+ AST::DeclContext *DC = dynamic_cast<AST::DeclContext *>(&pkg);
+ autiterator bend;
+ for (autiterator it(DC->begin()) ; it != bend ;++it)
+ {
+ std::cout<<"Package "<<pkg.getName()<<" has an automaton"<<std::endl;
+ generate_automaton(*(*it));
+ }
+ aeb::lds::CodeGen::CodeGenerator *CG = aeb::lds::CodeGen::CreateLdsGenerator(m_Context,pkg.getName());
+ CG->HandleTopLevelDecl(&pkg);
+ /**/
+
+ genDatatype gdt(*CG->GetBuilder(),std::cout);
+ gdt.TraverseDecl(&pkg);
+
+ delete(CG);
+ std::cout<<"gen_lpcm::generate_package "<<pkg.getName()<<" end"<<std::endl;
+}
+
+/**
+ * Use as Helper class for package generation as well
+ */
+void
+gen_lpcm::generate_system(AST::SystemDecl &s)
+{
+ aeb::lds::CodeGen::CodeGenerator *CG = aeb::lds::CodeGen::CreateLdsGenerator(m_Context,s.getName());
+ std::cout<<"gen_lpcm::generate_system "<<s.getName()<<std::endl;
+ AST::DeclContext *DC = dynamic_cast<AST::DeclContext *>(&s);
+ biterator bend;
+
+ for (biterator it(DC->begin()) ; it != bend ;++it)
+ //for (AST::DeclContext::decl_iterator it = DC->begin() ; it !=DC->end() ;++it)
+ {
+ std::cout<<"gen_lpcm::generate_system, found block "<<std::endl;
+ generate_block(*(*it));
+ }
+ CG->HandleTopLevelDecl(&s);
+ std::cout<<"gen_lpcm::gen_code system "<<s.getName()<<" end "<<std::endl;
+ delete(CG);
+}
+/**
+ * ex: set et sw=4 ts=4 list:
+ */
--- /dev/null
+#ifndef GEN_LPCM_H__
+#define GEN_LPCM_H__
+#include <fstream>
+#include <ostream>
+#include <set>
+
+#include <aeb/dlilist.h>
+#include <aeb/dlilist_node.h>
+#include <IR/LdsInstruction.h>
+#include <IR/LdsInstrVisitor.h>
+#include <IR/Transition.h>
+#include <IR/BasicBlock.h>
+#include <IR/LdsBuilder.h>
+#include <CodeGen/CodeGenModule.h>
+#include <CodeGen/CodeGenFunction.h>
+#include <CodeGen/ModuleBuilder.h>
+
+
+
+/**
+ *
+ */
+struct Statistics : public aeb::lds::InstrVisitor<Statistics> {
+ unsigned int m_Transitions;
+ unsigned int m_States;
+ unsigned int m_NbI;
+ unsigned int m_NbGlobals;
+ unsigned int m_NbSignals;
+ Statistics() : m_Transitions(0) , m_States(0) , m_NbI(0),m_NbGlobals(0),m_NbSignals(0) {}
+ void visitTransition(aeb::lds::Transition &T) { m_Transitions++; };
+ void visitState(aeb::lds::State &T) { m_States++; };
+ void visitGlobalVariable(aeb::lds::GlobalVariable &T) { m_NbGlobals++; };
+ void visitInstruction(aeb::lds::Instruction &I) { m_NbI+=I.NbOpcode();
+ }
+ void visitSignal(aeb::lds::Signal &I) { m_NbSignals++;
+ }
+
+ friend std::ostream &operator <<(std::ostream &os,Statistics &s) {
+ os<<"\tNb States : "<<s.m_States<<std::endl;
+ os<<"\tNb Transition : "<<s.m_Transitions<<std::endl;
+ os<<"\tNb Globals : "<<s.m_NbGlobals<<std::endl;
+ os<<"\tNb Instructions : "<<s.m_NbI<<std::endl;
+ os<<"\tNb Signals : "<<s.m_NbSignals<<std::endl;
+ return os;
+ }
+};
+
+
+
+/**
+ * This generator needs to generate 5 different type of files.
+ * We are going to use the Visitor to full fill that purpose
+ *
+ */
+class gen_lpcm {
+ AST::Decl *m_RootDecl;
+ std::string m_OutputPath;
+ int m_Version;
+ AST::ASTContext &m_Context;
+ public:
+ gen_lpcm(AST::ASTContext &C,std::string &oPath,AST::Decl *r,int ver = 0)
+ : m_Context(C),m_Version(ver), m_RootDecl(r), m_OutputPath(oPath) {};
+
+
+ /**
+ * With the given declaration, generate all required files
+ * for cpp compilation.
+ */
+ void gen_all();
+
+ protected:
+
+ void gen_ptr() ;
+ /**
+ * Generates act file
+ * -> act
+ * -> eta
+ * -> tra
+ * -> aac
+ */
+ void gen_code();
+ ///
+ void generate_automaton(AST::AutomatonDecl &block);
+ ///
+ void generate_block(AST::BlockDecl &block);
+ ///
+ void generate_package(AST::PackageDecl &p);
+ ///
+ void generate_system(AST::SystemDecl &s);
+
+};
+/**
+ * ex: set et sw=4 ts=4 list:
+ */
+
+#endif
--- /dev/null
+#include <iostream>
+#include <fstream>
+#include <string.h>
+#include <map>
+#include <list>
+#include <vector>
+#include <cctype>
+#include <algorithm>
+#include <sstream>
+
+// For open / clise
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <fcntl.h>
+// for access function I need unistd
+#ifndef _WIN32
+#include <unistd.h>
+#endif
+#include <stdlib.h>
+// AST
+#include "AST/Stmt.h"
+#include "AST/Expr.h"
+#include "AST/Decl.h"
+
+#include "AST/ASTRecursiveVisitor.h"
+#include "IR/Module.h"
+#include "IR/Type.h"
+
+#include <gen_lpcm_aac.h>
+
+GenAac::GenAac(const std::string &p,int ver)
+ : m_Version(ver),m_OutPath(p) , m_NbI(0),m_NF(0),m_NbTransitions(0)
+{
+}
+/**
+ *
+ *
+ */
+void GenAac::Generate(aeb::lds::Module &M,const std::string &name)
+{
+ std::string f_aac = m_OutPath +"/"+name+".aac";
+ std::string f_h = m_OutPath +"/"+name+".h";
+ std::string f_cpp = m_OutPath +"/"+name+".cpp";
+ std::string f_evt = m_OutPath +"/"+name+".evt";
+ //std::string f_ael = m_OutPath +"/"+name+".ael";
+ m_InitFctStream.str(""); // Empty
+ m_GetterImplStream.str(""); // Empty
+ act.open(f_aac.c_str(),std::fstream::out);
+ m_ModuleName = M.getName();
+ m_ClassName = M.getName() + std::string("_stub");
+ prolog(name);
+ visit(M);
+ epilog();
+ // Epilog ...
+ act.close();
+ // Now generate external events header
+ if (m_Version < 1)
+ {
+ act.open(f_evt.c_str(),std::fstream::out);
+ gen_events(act);
+ act.close();
+ }
+ // Now generate external events header
+ // depreacted. The values are stored in aac header
+ //act.open(f_ael.c_str(),std::fstream::out);
+ //gen_user_ael(act);
+ //act.close();
+
+ // Generate stub class header
+ act.open(f_h.c_str(),std::fstream::out);
+ gen_class_header(act);
+ act.close();
+ // Generate stub class implementation
+ act.open(f_cpp.c_str(),std::fstream::out);
+ gen_class_impl(act);
+ act.close();
+}
+
+void GenAac::visitGlobalVariable(aeb::lds::GlobalVariable &V)
+{
+ m_Variables[V.getName()] = &V;
+ m_InitFctStream<<" "<<"; //"<<std::endl;
+}
+
+void GenAac::genType(std::ostream &os,const aeb::lds::Type *t)
+{
+ if (t)
+ {
+ switch (t->getTypeID())
+ {
+ case aeb::lds::Type::IntegerTyID : t->printNative(os); break;
+ case aeb::lds::Type::ArrayTyID : t->printNative(os); break;
+ default:
+ os<<"long";
+ }
+ } else
+ {
+ os<<"/*";
+ if (t != NULL)
+ {
+ t->print(os);
+ } else {
+ os<<" t == NULL";
+ }
+ os<<"*/";
+ os<<" long" ;
+ }
+}
+
+
+void GenAac::gen_interface_header(std::ostream &os)
+{
+ os<<"class I"<<m_ModuleName<<" {"<<std::endl;
+ os<<" public:"<<std::endl;
+ os<<" I"<<m_ModuleName<<"() {} ; "<<std::endl;
+ for (ConstSignalIterator vit = m_Signals.begin()
+ ; vit != m_Signals.end()
+ ; ++vit)
+ {
+ aeb::lds::Signal *Fct =vit->second;
+ os<<" virtual void signal_"<<vit->first<<"(";
+ // Does the signal have parameters
+ if (Fct->args().size() > 0)
+ {
+ int i=0;
+ for (aeb::lds::Signal::ArgumentConstIterator pit = Fct->arg_begin();
+ pit != Fct->arg_end();
+ ++pit)
+ {
+ if (pit != Fct->arg_begin())
+ os<<",";
+ genType(os,(pit)->getType());
+ os<<" &_"<<(pit)->getTypeName()<<i<<" ";
+ i++;
+ }
+ }
+ os<<") = 0;"<<std::endl;
+ }
+ os<<"};"<<std::endl;
+}
+
+void GenAac::gen_class_hdr_signals(std::ostream &os)
+{
+ for (ConstSignalIterator vit = m_Signals.begin()
+ ; vit != m_Signals.end()
+ ; ++vit)
+ {
+ aeb::lds::Signal *Fct =vit->second;
+ os<<" void signal_"<<vit->first<<"(";
+ // Does the signal have parameters
+ if (Fct->args().size() > 0)
+ {
+ int i=0;
+ for (aeb::lds::Signal::ArgumentConstIterator pit = Fct->arg_begin();
+ pit != Fct->arg_end();
+ ++pit)
+ {
+ if (pit != Fct->arg_begin())
+ os<<",";
+ genType(os,(pit)->getType());
+ os<<" &_"<<(pit)->getTypeName()<<i<<" ";
+ i++;
+ }
+ }
+ os<<") ;"<<std::endl;
+ }
+}
+
+void GenAac::gen_class_impl_signals(std::ostream &os)
+{
+ for (ConstSignalIterator vit = m_Signals.begin()
+ ; vit != m_Signals.end()
+ ; ++vit)
+ {
+ aeb::lds::Signal *Fct =vit->second;
+ act<<"void "<<m_ClassName<<"::signal_"<<vit->first<<"(";
+ // Does the signal have parameters
+ if (Fct->args().size() > 0)
+ {
+ int i=0;
+ for (aeb::lds::Signal::ArgumentConstIterator pit = Fct->arg_begin();
+ pit != Fct->arg_end();
+ ++pit)
+ {
+ if (pit != Fct->arg_begin())
+ act<<",";
+ genType(act,(pit)->getType());
+ act<<" &_"<<(pit)->getTypeName()<<i<<" ";
+ i++;
+ }
+ }
+ act<<")"<<std::endl;
+ act<<"{"<<std::endl;
+ if (Fct->args().size())
+ {
+ //act<<" static LdsMsg m("<<vit->first<<","<<Fct->args().size()<<");"<<std::endl;
+ act<<" static FixedSizeLdsMsg<"<<Fct->args().size()<<"> m("<<vit->first<<");"<<std::endl;
+ int i=0;
+ for (aeb::lds::Signal::ArgumentConstIterator pit = Fct->arg_begin();
+ pit != Fct->arg_end();
+ ++pit)
+ {
+ const aeb::lds::Type *Ty = pit->getType();
+ if (Ty)
+ {
+ act<<" m.m_P["<<i<<"].set_";
+ Ty->printLds(act);
+ act<<"( _"<<(pit)->getTypeName()<<i<<");\n";
+ } else
+ act<<" m.m_P["<<i<<"]= "<<" _"<<(pit)->getTypeName()<<i<<";\n";
+ i++;
+ }
+ } else
+ act<<" static LdsMsg m("<<vit->first<<","<<Fct->args().size()<<");"<<std::endl;
+ act<<" putMessage(&m);"<<std::endl;
+ //act<<" m_EventQueue.push("<<vit->first<<");"<<std::endl;
+ act<<"}\n"<<std::endl;
+ }
+}
+/**
+ * For each signal, generate a static function
+ * that will be able to trigger a signal
+ */
+void GenAac::gen_class_impl_signals_static(std::ostream &os)
+{
+ for (ConstSignalIterator vit = m_Signals.begin()
+ ; vit != m_Signals.end()
+ ; ++vit)
+ {
+ aeb::lds::Signal *Fct =vit->second;
+ os<<"static void signal_"<<vit->first<<"St(";
+ os<<"Context *_c)"<<std::endl;
+ os<<"{"<<std::endl;
+
+ os<<" "<<m_ClassName<<" *cls = dynamic_cast<"<<m_ClassName<<" *>(_c);"<<std::endl;
+ os<<" if (cls )"<<std::endl;
+ os<<" {"<<std::endl;
+ // Call function
+ os<<" cls->signal_"<<vit->first<<"(";//<<std::endl;
+ if (Fct->getNbParams())
+ {
+ int i = 1;
+ for (aeb::lds::Signal::ArgumentConstIterator pit = Fct->arg_begin();
+ pit != Fct->arg_end();
+ ++pit, i++)
+ {
+ const aeb::lds::Type *Ty = (pit)->getType();
+ if (pit != Fct->arg_begin())
+ os<<",";
+ // Should check if Val is Global or caller parameter
+ os<<" cls->getCallParam("<<i<<" + 1).get_";
+ if (Ty)
+ {
+ Ty->printLds(os);
+ } else {
+ std::cerr<<"GenAac::gen_class_impl_signal_static No type for parameter"<<std::endl;
+ }
+ os<<"()";
+ }
+ } else
+ {
+ os<<"/*No params*/";
+ }
+ os<<") ;"<<std::endl;
+ // Get Parameters from stack
+ // Pass parameters to function
+ os<<" }"<<std::endl;
+
+ os<<"}\n"<<std::endl;
+ }
+}
+/**
+ * Generate static array to be used by OUTPUT
+ * Missing output constraint
+ */
+void GenAac::gen_class_impl_signals_array(std::ostream &os)
+{
+
+ //os<<"struct {unsigned int nbp; const char *name;fct sig ;} m_Sig[] = {\n";
+ os<<"LdsSignalProto m_Sig[] = {\n";
+ for (ConstSignalIterator vit = m_Signals.begin()
+ ; vit != m_Signals.end()
+ ; ++vit)
+ {
+ aeb::lds::Signal *Fct =vit->second;
+ if (vit != m_Signals.begin())
+ os<<" ,";
+ os<<"{ "<<Fct->args().size()<<",";
+ os<<"\""<<vit->first<<"\" ,";
+ os<<"&signal_"<<vit->first<<"St";
+ // Does the signal have parameters
+ act<<"}"<<std::endl;
+ }
+ os<<"};\n";
+}
+
+//
+void GenAac::gen_class_header(std::ostream &os)
+{
+ std::string uModuleName;
+ std::stringstream getter;
+ int i = 0;
+ uModuleName.resize(m_ModuleName.size());
+ std::transform(m_ModuleName.begin()
+ ,m_ModuleName.end()
+ ,uModuleName.begin()
+ ,::toupper);
+ // Generate stub class
+ os<<"#ifndef "<<uModuleName<<"_H__"<<std::endl;
+ os<<"#define "<<uModuleName<<"_H__"<<std::endl;
+ os<<"/* Generated file. Do not edit */"<<std::endl;
+ os<<std::endl;
+ gen_interface_header(os);
+ os<<std::endl;
+ os<<"\n\nclass "<<m_ClassName<<" : public Context, public I"<<m_ModuleName<<" {"<<std::endl;
+ os<<" public:"<<std::endl;
+ os<<" "<<m_ClassName<<"(ldsvm &_vm);\n"<<std::endl;
+
+ // Remove again. Bad Strategie
+ getter.str("\n");
+ //getter<<" protected:\n";
+ for (ConstVarMapIterator vit = m_Variables.begin()
+ ; vit != m_Variables.end()
+ ; ++vit)
+ {
+ // getter<<" inline ";
+ getter<<" ";
+ genType(getter,(vit)->second->getType());
+ getter<<" &get"<<vit->first<<"() ;"<<std::endl;
+ // Implementation
+ genType(m_GetterImplStream,(vit)->second->getType());
+ m_GetterImplStream<<"& ";
+ m_GetterImplStream<<m_ClassName<<"::get"<<vit->first<<"() { return Global("<<vit->first<<").get_";
+ if (vit->second->getType())
+ {
+ vit->second->getType()->printLds(m_GetterImplStream);
+ } else
+ m_GetterImplStream<<"Integer";
+ m_GetterImplStream<<"(); };\n";
+ }
+ getter<<" public:\n"<<std::endl;
+ os<<std::endl;
+ os<<getter.str();
+
+ for (ConstFunctionIterator it = m_Functions.begin()
+ ; it != m_Functions.end()
+ ; ++it)
+ {
+ aeb::lds::Function *Fct = it->second;
+ int i = 0;
+
+ if (Fct->args().size() == 0)
+ os<<" virtual void "<<it->first<<"Impl( ) ;"<<std::endl;
+ if (Fct->args().size() > 0)
+ {
+ os<<" virtual void "<<it->first<<"Impl(";
+ for (aeb::lds::Function::ArgumentConstIterator pit = Fct->arg_begin();
+ pit != Fct->arg_end();
+ ++pit)
+ {
+ if (pit != Fct->arg_begin())
+ os<<",";
+ genType(os,(pit)->getType());
+ os<<" &_"<<(pit)->getTypeName()<<" ";
+ }
+ os<<" ) ;"<<std::endl;
+ }
+ os<<""<<std::endl;
+
+ }
+ gen_class_hdr_signals(os);
+ os<<" protected:"<<std::endl;
+ os<<" LdsCFunctionProto* userAction(Context *_c,long opcode);"<<std::endl;
+ os<<""<<std::endl;
+ //os<<" static ldsvm::fct m_UserOp[AEL_END_USER+1];"<<std::endl;
+
+ os<<"};"<<std::endl;
+ os<<"#endif"<<std::endl;
+}
+
+
+// Default Constructor
+void GenAac::gen_class_impl_ctors(std::ostream &os)
+{
+ os<<""<<m_ClassName<<"::"<<m_ClassName<<"(ldsvm &_vm)"<<std::endl;
+ os<<" : Context((LdsAutomaton *)&t_aut_"<<m_ModuleName<<",";
+ os<<m_ModuleName<<"_act,m_Sig)"<<std::endl;
+ // Initialize local variables
+ os<<"{"<<std::endl;
+ // Save Space on stack
+ os<<" m_Top+="<<m_Variables.size()<<";\n";
+ os<<" m_Ef->m_Top+="<<m_Variables.size()<<";\n";
+ os<<" for ( int i = 0 ; i < "<<m_Variables.size()<<" ; i++) \n";
+ os<<" {";
+ os<<" m_Globals[i].set_Integer(0);";
+ os<<" }"<<std::endl;
+ // If Variable has Type and Initializer Init It
+ for (ConstVarMapIterator vit = m_Variables.begin()
+ ; vit != m_Variables.end()
+ ; ++vit)
+ {
+ }
+ os<<"}"<<std::endl;
+}
+
+//
+void GenAac::gen_class_impl(std::ostream &os)
+{
+ os<<"#include <iostream>"<<std::endl;
+ os<<"#include <queue>"<<std::endl;
+ os<<""<<std::endl;
+ os<<"#include <ldsvm.h>"<<std::endl;
+
+ // os<<"#include <"<<m_ModuleName<<".ael>"<<std::endl;
+ os<<"#include <"<<m_ModuleName<<".h>"<<std::endl;
+#if 1
+ os<<"#include <"<<m_ModuleName<<".aac>"<<std::endl;
+ if (m_Version < 1) {
+ os<<"#include <"<<m_ModuleName<<".evt>"<<std::endl;
+ os<<"#include <"<<m_ModuleName<<".eta>"<<std::endl;
+ }
+ os<<"#include <"<<m_ModuleName<<".act>"<<std::endl;
+ os<<"#include <"<<m_ModuleName<<".ptr>"<<std::endl;
+ os<<"#include <"<<m_ModuleName<<".tra>\n"<<std::endl;
+#endif
+ os<<m_GetterImplStream.str()<<std::endl;
+ //
+ // Function implementation
+ for (ConstFunctionIterator it = m_Functions.begin()
+ ; it != m_Functions.end()
+ ; ++it)
+ {
+ aeb::lds::Function *Fct = it->second;
+ os<<"static void "<<it->first<<"St(Context *_c)\n";
+ os<<"{"<<std::endl;
+ os<<" "<<m_ClassName<<" *cls = dynamic_cast<"<<m_ClassName<<" *>(_c);"<<std::endl;
+ os<<" if (cls )"<<std::endl;
+ os<<" {"<<std::endl;
+ // Call function
+ os<<" cls->"<<it->first<<"Impl(";//<<std::endl;
+ if (it->second->getNbParams())
+ {
+ int i = 1;
+ for ( aeb::lds::Function::ArgumentConstIterator pit = Fct->arg_begin();
+ pit != Fct->arg_end();
+ ++pit, i++)
+ {
+ const aeb::lds::Type *Ty = (pit)->getType();
+ if (pit != Fct->arg_begin())
+ os<<",";
+ // Should check if Val is Global or caller parameter
+ os<<" cls->getCallParam("<<i<<").get_";
+ if (Ty)
+ {
+ Ty->printLds(os);
+ } else {
+ std::cerr<<"GenAac::get_class_impl error no Type"<<std::endl;
+ }
+ os<<"()";
+ }
+ }
+ os<<") ;"<<std::endl;
+ // Get Parameters from stack
+ // Pass parameters to function
+ os<<" }"<<std::endl;
+ os<<" _c->incIP("<<it->second->getNbParams()<<" + 1);"<<std::endl;
+ os<<"}\n"<<std::endl;
+
+ // Define function with arguments
+ if (Fct->args().size() > 0)
+ {
+ int i = 0;
+ os<<"void "<<m_ClassName<<"::"<<it->first<<"Impl(";
+ for (aeb::lds::Function::ArgumentConstIterator pit = Fct->arg_begin();
+ pit != Fct->arg_end();
+ ++pit)
+ {
+ if (pit != Fct->arg_begin())
+ os<<",";
+ genType(os,(pit)->getType()) ;
+ os<<" &/*"<<(pit)->getTypeName()<<"*/ Arg"<<i++;
+ }
+ os<<" )\n{ "<<std::endl;
+ os<<" std::cout<<\"Implement "<<it->first<<"\"<<std::endl ;"<<std::endl;
+ os<<"}"<<std::endl;
+ } else
+ {
+ // Define this function if there are no parameters
+ os<<"void "<<m_ClassName<<"::"<<it->first<<"Impl( )\n{"<<std::endl;
+ os<<" std::cout<<\"Implement "<<it->first<<"\"<<std::endl ;"<<std::endl;
+ os<<"}"<<std::endl;
+ os<<""<<std::endl;
+ }
+ }
+ gen_class_impl_signals(os);
+ gen_class_impl_signals_static(os);
+ gen_class_impl_signals_array(os);
+ // Initialize static symbol table
+ //os<<"\n\nstruct { int nbp;const char *n; fct f;} m_UserOp[] = {"<<std::endl;
+ os<<"\n\nLdsCFunctionProto m_UserOp[] = {"<<std::endl;
+ //os<<"\n\nfct "<<"m_UserOp[] = {"<<std::endl;
+ for (ConstFunctionIterator it = m_Functions.begin()
+ ; it != m_Functions.end()
+ ; ++it)
+ {
+ aeb::lds::Function *fct = it->second ;
+ if (it != m_Functions.begin())
+ os<<" ,";
+ //os<<" &"<<it->first<<"St";
+ os<<" {"<<fct->getNbParams()<<",\""<<it->first<<"\",&"<<it->first<<"St } "<<std::endl;
+ }
+ os<<"};"<<std::endl;
+
+ // Implement userAction
+ os<<"\n\nLdsCFunctionProto *"<<m_ClassName<<"::userAction(Context *_c,long opcode)"<<std::endl;
+ os<<"{"<<std::endl;
+ os<<" if (opcode < AEL_END_USER)\n {"<<std::endl;
+ os<<" m_UserOp[opcode - AEL_END].CFunction(_c); "<<std::endl;
+ os<<" return &m_UserOp[opcode - AEL_END];"<<std::endl;
+ os<<" }\nreturn NULL;}"<<std::endl;
+ os<<""<<std::endl;
+
+
+ gen_class_impl_ctors(os);
+}
+
+//
+void GenAac::gen_user_ael(std::ostream &os)
+{
+ int count = 0;
+ os<<""<<std::endl;
+ os<<"/* External Functions ....*/"<<std::endl;
+ os<<"#ifndef WITH_DEFINE_EXTERNAL_AEL_H__"<<std::endl;
+ os<<"#define WITH_DEFINE_EXTERNAL_AEL_H__"<<std::endl;
+ for (ConstFunctionIterator it = m_Functions.begin()
+ ; it != m_Functions.end()
+ ; ++it)
+ {
+ //os<<"#define "<<it->first<<"\t(AEL_END + "<<count++<<")"<<std::endl;
+ os<<"#define e"<<it->first<<"\t(AEL_END + "<<count++<<")"<<std::endl;
+ }
+ os<<"#define AEL_END_USER\t(AEL_END + "<<count++<<")"<<std::endl;
+ os<<"#endif"<<std::endl;
+}
+
+//
+void GenAac::gen_events(std::ostream &os)
+{
+ int count = 0;
+ os<<"/* Define Event Constants */"<<std::endl;
+ for (ConstEventSetIterator it = m_Events.begin()
+ ; it != m_Events.end()
+ ; ++it )
+ {
+ os<<"#define "<<(*it)<<"\t"<<count++<<std::endl;
+ }
+}
+
+
+
+//
+void GenAac::epilog()
+{
+ int count = 0;
+ act<<""<<std::endl;
+ act<<"/* External Functions ....*/"<<std::endl;
+ act<<"#ifdef WITH_DEFINE_EXTERNAL_AEL"<<std::endl;
+ for (ConstFunctionIterator it = m_Functions.begin() ;it != m_Functions.end() ; ++it) {
+ act<<"#define e"<<it->first<<"\t(AEL_END + "<<count++<<")"<<std::endl;
+
+ }
+ act<<"#define AEL_END_USER\t(AEL_END + "<<count++<<")"<<std::endl;
+ count = 0;
+
+ // Lets see If I can Add evt eta content
+ act<<"//\n// Lets see if eta content can be put here\n";
+ int counter = 0;
+ if (m_Version < 1)
+ act<<"#if 0\n";
+
+ act<<"enum "<<m_ModuleName<<"_states {\n";
+ for ( ConstStateArrayIterator ait = m_States.begin()
+ ; ait < m_States.end()
+ ; ++ait , ++counter )
+ {
+ if (ait != m_States.begin() )
+ act<<" , ";
+ act<<""<<(*ait)<<" = "<<counter<<"\n";
+ //act<<"// #define "<<(*ait)<<" "<<counter<<"\n";
+ }
+ act<<"};\n";
+ // Global Variables definitions ....
+
+ act<<std::endl<<"#define "<<m_ModuleName<<"_taille_tran "<<m_NbTransitions<<std::endl;
+ act<<"//\n// Lets see Global vartiables content can be put here\n";
+ counter = 0;
+ act<<"#ifdef WITH_DEFINE_EXTERNAL_FLAGS\n";
+ for ( ConstVarMapIterator ait = m_Variables.begin()
+ ; ait != m_Variables.end()
+ ; ++ait , ++counter )
+ {
+ act<<"#define "<<ait->first<<" "<<counter<<"\n";
+ }
+ act<<"#endif\n";
+
+ act<<"// Add Event definition here \n";
+ if (m_Version > 0)
+ gen_events(act);
+
+
+ if (m_Version < 1)
+ act<<"#endif\n"; // The #if 0
+ //
+ act<<"#endif"<<std::endl;
+}
+
+/**
+ * vim: et sw=2 ts=2 list:
+ */
--- /dev/null
+#ifndef GEN_LPCM_AAC_H
+#define GEN_LPCM_AAC_H
+#include <fstream>
+#include <ostream>
+#include <set>
+
+#include <aeb/dlilist.h>
+#include <aeb/dlilist_node.h>
+#include <IR/LdsInstruction.h>
+#include <IR/LdsInstrVisitor.h>
+#include <IR/Transition.h>
+#include <IR/BasicBlock.h>
+#include <IR/LdsBuilder.h>
+#include <CodeGen/CodeGenType.h>
+#include <CodeGen/CodeGenModule.h>
+#include <CodeGen/CodeGenFunction.h>
+#include <CodeGen/ModuleBuilder.h>
+
+/**
+ *
+ */
+struct GenAac : public aeb::lds::InstrVisitor<GenAac> {
+ public:
+ typedef std::map<std::string,aeb::lds::Function *> FunctionMap;
+ typedef FunctionMap::iterator FunctionIterator;
+ typedef FunctionMap::const_iterator ConstFunctionIterator;
+
+ typedef std::map<std::string,aeb::lds::Signal *> SignalMap;
+ typedef SignalMap::iterator SignalIterator;
+ typedef SignalMap::const_iterator ConstSignalIterator;
+
+ typedef std::map<std::string,aeb::lds::GlobalVariable *> VarMap;
+ typedef VarMap::iterator VarMapIterator;
+ typedef VarMap::const_iterator ConstVarMapIterator;
+
+ typedef std::set<std::string> EventSet;
+ typedef EventSet::const_iterator ConstEventSetIterator;
+
+ typedef std::vector<std::string> StateArray;
+ typedef StateArray::iterator StateArrayIterator;
+ typedef StateArray::const_iterator ConstStateArrayIterator;
+ protected:
+ std::string m_OutPath;
+ std::fstream act;
+ long m_NbI;
+ long m_NF; //NumOf Functions
+ long m_NbTransitions; //NumOf Functions
+ FunctionMap m_Functions;
+ VarMap m_Variables;
+ SignalMap m_Signals;
+ EventSet m_Events;
+ std::string m_ModuleName;
+ std::string m_ClassName;
+ int m_Version;
+ StateArray m_States;
+ // Some streams
+ std::stringstream m_InitFctStream;
+ std::stringstream m_GetterImplStream;
+
+ void genType(std::ostream &os,const aeb::lds::Type *a);
+ public:
+ GenAac(const std::string &p,int ver = 0);
+
+ void visitTransition(aeb::lds::Transition &T) {
+ m_Events.insert(T.getEvent());
+ m_NbTransitions++;
+
+ };
+
+ void visitGlobalVariable(aeb::lds::GlobalVariable &V);
+ /* Register The Starting Point of
+ * each defined function
+ */
+ void visitFunction(aeb::lds::Function &T) {
+ if ( ! T.isExternal())
+ {
+ if (m_Version > 0)
+ {
+ act<<"#define "<<T.getName()<<" "<<m_NF++<<" /**/"<<std::endl;
+ }
+ else
+ act<<"#define "<<T.getName()<<" "<<m_NbI<<std::endl;
+ } else
+ {
+ m_Functions[T.getName()] =& T;
+ }
+ };
+
+ void visitState(aeb::lds::State &T) {
+ m_States.push_back(T.getName());
+ };
+
+ void visitSignal(aeb::lds::Signal &T)
+ {
+ m_Events.insert(T.getName());
+ m_Signals[T.getName()] =& T;
+ };
+
+ void visitInstruction(aeb::lds::Instruction &I) {
+ m_NbI+=I.NbOpcode();
+ };
+ void Generate(aeb::lds::Module &M,const std::string &name) ;
+ //
+ void prolog(const std::string &mn) {
+ act<<""<<std::endl;
+ }
+
+ void gen_class_hdr_signals(std::ostream &os);
+
+ void gen_class_impl_ctors(std::ostream &od);
+ ///
+ void gen_class_impl_signals(std::ostream &od);
+ /**
+ * For each signal, generate a static function
+ * that will be able to trigger a signal
+ */
+ void gen_class_impl_signals_static(std::ostream &od);
+ /**
+ * Generate static array to be used by OUTPUT
+ * Missing output constraint
+ */
+ void gen_class_impl_signals_array(std::ostream &od);
+
+ void gen_interface_header(std::ostream &os);
+ //
+ void gen_class_header(std::ostream &os) ;
+ //
+ void gen_class_impl(std::ostream &os) ;
+ // generate content of <Module>.aac file
+ void gen_user_ael(std::ostream &os) ;
+ // generate content of <Module>.evt file
+ void gen_events(std::ostream &os) ;
+ //
+ void epilog();
+};
+
+
+#endif /*GEN_LPCM_AAC_H*/
--- /dev/null
+PROJECT(libparselds)
+
+INCLUDE_DIRECTORIES(${CMAKE_CURRENT_BINARY_DIR})
+INCLUDE_DIRECTORIES(${CMAKE_CURRENT_SOURCE_DIR})
+INCLUDE_DIRECTORIES(${CMAKE_CURRENT_SOURCE_DIR}/../common/include/)
+INCLUDE_DIRECTORIES(${aebutils_SOURCE_DIR})
+# For option...
+INCLUDE_DIRECTORIES(${aebutils_SOURCE_DIR}/aeb)
+
+LEXGEN(lds.l lds_l.cpp)
+BISONGEN(lds.y lds_y.cpp cpp)
+
+ADD_LIBRARY(ldsparser
+ lds_parser.cpp
+ ${CMAKE_CURRENT_BINARY_DIR}/lds_y.cpp
+ ${CMAKE_CURRENT_BINARY_DIR}/lds_l.cpp
+ )
--- /dev/null
+%option prefix="lds_"
+%option stack
+%option yylineno
+%option reentrant bison-bridge
+
+%{
+#include <stdio.h>
+#include <vector>
+#include <list>
+#include <map>
+#include <string>
+#include <AST/Stmt.h>
+#include <AST/Expr.h>
+#include <AST/Decl.h>
+
+#include <lds_parser_listener.h>
+#include <lds_parser.h>
+
+
+typedef union
+{
+ char * string;
+ int num;
+ double real;
+ AST::Stmt *stmt;
+ AST::Expr *expr;
+ AST::StringLiteral *str_expr;
+ AST::Decl *decl;
+} YYSTYPE;
+
+char *string_begin;
+
+#define YYSTYPE_IS_DECLARED 1
+#define YY_DECL int lds_lex(YYSTYPE *yylval_param,yyscan_t yyscanner)
+
+#include <lds_y.hpp>
+
+
+//#define DEBUG
+#ifdef DEBUG
+#define TOK(x) { /*fprintf(stderr,"lex:"#x" \'%s\'\n", yytext);*/ return x; }
+#define STR_TOK(x) { \
+ yylval->expr = new AST::StringLiteral(yytext,NULL); \
+ return x; \
+ }
+#define CHAINE_TOK(x) { AST::StringLiteral *s = new AST::StringLiteral(string_begin,NULL); \
+ yylval->expr = s; \
+ s->isConstantArray = true; return x; }
+
+#define NUM_TOK(x) { yylval->num = atol(yytext); return x; }
+#else
+#define TOK(x) { return x; }
+#define STR_TOK(x) { yylval->expr = new AST::StringLiteral(yytext,NULL); return x; }
+#define CHAINE_TOK(x) { AST::StringLiteral *s = new AST::StringLiteral(string_begin,NULL); \
+ yylval->expr = s; \
+ s->isConstantArray = true; return x; }
+#define NUM_TOK(x) { yylval->num = atol(yytext); return x; }
+#endif
+
+
+extern "C" int lds_wrap(yyscan_t yyscanner);
+
+void lds_error(yyscan_t yyscanner,const char *s) ;
+
+////
+static lds::parser *ldsp = lds::parser::instance();
+
+////
+
+
+#define LDS_P_MAX_DEPTH 10
+struct ldsp_fstack {
+ YY_BUFFER_STATE m_buff;
+ FILE *m_cin;
+};
+ldsp_fstack istack[LDS_P_MAX_DEPTH] ;
+int lds_stack_ptr = 0;
+
+void lds_switch_to_file(yyscan_t yyscanner,const char *f);
+
+void lds_restore_file(yyscan_t yyscanner);
+
+%}
+
+
+%pointer
+
+%x COMMENT
+%x CCOMMENT
+%x CHARSTRING
+%x HIDE
+%x PREPROC
+
+letter [a-zA-Z]
+digit [0-9]
+signe "$"|"]"|"~"|"\\"|";"|"&"|"!"|"{"|"}"|"["|"\'"|"\""|"^"|"?"|"\|"
+chaine [a-zA-Z0-9\._]*
+chainesp [a-zA-Z0-9_]*
+minus "-"
+nl \n
+tab \t
+space " "
+sharp "#"
+star "*"
+slash "/"
+chainems {chaine}|{minus}|{star}
+integer_name {digit}*
+
+%%
+
+
+"/*" {
+ BEGIN(CCOMMENT);
+ }
+
+"--" {
+ BEGIN(COMMENT);
+}
+
+"'" {
+ BEGIN(CHARSTRING);
+ string_begin = yytext;
+}
+
+%{ /* COMMENT */
+%}
+<COMMENT>"*/" {
+ BEGIN 0;
+ /*TOK(T_NOTE) */
+ }
+
+<COMMENT>{nl} {
+ BEGIN 0;
+ /*TOK(T_NOTE) */
+ }
+
+<COMMENT>.
+
+
+%{ /* END COMMENT */
+%}
+
+
+<CCOMMENT>"*/" {
+ BEGIN 0;
+ /*TOK(T_NOTE) */
+ }
+
+
+<CCOMMENT>.
+
+<PREPROC>{sharp}endif {
+ BEGIN 0;
+ }
+<PREPROC>.
+
+<CHARSTRING>{chaine}|{space}|{nl} {
+ }
+
+<CHARSTRING>"'" {
+ BEGIN 0;
+ /* printf("CHARSTRING GOT:%s\n",string_begin); */
+ CHAINE_TOK(T_CHARSTRING)
+ }
+
+%{ /* END CHARSTRING */
+%}
+
+
+
+
+
+if|IF TOK(T_IF)
+then|THEN TOK(T_THEN)
+accept|ACCEPT TOK(T_ACCEPT)
+else|ELSE TOK(T_ELSE)
+elsif|ELSIF TOK(T_ELSIF)
+task|TASK TOK(T_TASK)
+automaton|AUTOMATON TOK(T_AUTOMATON)
+is|IS TOK(T_IS)
+dcl|DCL TOK(T_DCL)
+encode TOK(T_ENCODE)
+decode TOK(T_DECODE)
+begin|BEGIN TOK(T_BEGIN)
+goto|GOTO TOK(T_GOTO)
+state|STATE TOK(T_STATE)
+when|WHEN TOK(T_WHEN)
+while|WHILE TOK(T_WHILE)
+loop|LOOP TOK(T_LOOP)
+not|NOT TOK(T_NOT)
+execute|EXECUTE TOK(T_EXECUTE)
+do|DO TOK(T_DO)
+case|CASE TOK(T_CASE)
+and|AND TOK(T_AND)
+or|OR TOK(T_OR)
+test|TEST TOK(T_TEST)
+set|SET TOK(T_SET)
+reset|RESET TOK(T_RESET)
+exit|EXIT TOK(T_EXIT)
+output|OUTPUT TOK(T_OUTPUT)
+same|SAME TOK(T_SAME)
+comment TOK(T_COMMENT)
+choice TOK(T_CHOICE)
+literals TOK(T_LITERALS)
+%{ /* LDS_EXTENSION */
+%}
+
+active TOK(T_ACTIVE)
+constants TOK(T_CONSTANTS)
+package TOK(T_PACKAGE)
+endpackage TOK(T_ENDPACKAGE)
+system|SYSTEM TOK(T_SYSTEM)
+block|BLOCK TOK(T_BLOCK)
+extern|EXTERN TOK(T_EXTERN)
+signallist|SIGNALLIST TOK(T_SIGNALLIST)
+signal|SIGNAL TOK(T_SIGNAL)
+struct TOK(T_STRUCT)
+channel|CHANNEL TOK(T_CHANNEL)
+connect TOK(T_CONNECT)
+from|FROM TOK(T_FROM)
+to|TO TOK(T_TO)
+referenced TOK(T_REFERENCED)
+this|THIS TOK(T_THIS)
+endsystem|ENDSYSTEM TOK(T_ENDSYSTEM)
+endblock|ENDBLOCK TOK(T_ENDBLOCK)
+endchannel|ENDCHANNEL TOK(T_ENDCHANNEL)
+endsyntype TOK(T_ENDSYNTYPE)
+endvalue TOK(T_ENDVALUE)
+optional TOK(T_OPTIONAL)
+offspring TOK(T_OFFSPRING)
+use|USE TOK(T_USE)
+value TOK(T_VALUE)
+type TOK(T_TYPE)
+gate|GATE TOK(T_GATE)
+via|VIA TOK(T_VIA)
+now TOK(T_NOW)
+priority|PRIORITY TOK(T_PRIORITY)
+parent TOK(T_PARENT)
+in|IN TOK(T_IN)
+out|OUT TOK(T_OUT)
+synonym TOK(T_SYNONYM)
+syntype TOK(T_SYNTYPE)
+with|WITH TOK(T_WITH)
+env|ENV TOK(T_ENV)
+timer TOK(T_TIMER)
+inherits TOK(T_INHERITS)
+default TOK(T_DEFAULT)
+operators TOK(T_OPERATORS)
+create TOK(T_CREATE)
+self TOK(T_SELF)
+sender TOK(T_SENDER)
+as TOK(T_AS)
+%{ /* END LDS EXTENSION */
+%}
+
+end|END TOK(T_END)
+".." TOK(T_RANGE)
+"->" TOK(T_RESULT)
+"(." TOK(T_COMPOSITE_BEGIN)
+".)" TOK(T_COMPOSITE_END)
+"//" TOK(T_CONCAT)
+"-*" TOK(T_HISTORY)
+">=" TOK(T_GTE)
+"<=" TOK(T_LTE)
+":=" TOK(T_ASSIGN)
+"=>" TOK(T_IMPLIES)
+"/=" TOK(T_NE)
+"<<" TOK(T_QUALIFIER_BEGIN)
+">>" TOK(T_QUALIFIER_END)
+
+"+" TOK(T_PLUS)
+"-" TOK(T_HYPHEN)
+"<" TOK(T_LT)
+">" TOK(T_GT)
+"@" TOK(T_AT)
+"!" TOK(T_EXCLAMATION)
+"[" TOK(T_LBRACKET)
+"]" TOK(T_RBRACKET)
+"{" TOK(T_LBRACET)
+"}" TOK(T_RBRACET)
+")" TOK(T_RPARENTHESES)
+"(" TOK(T_LPARENTHESES)
+"." {
+ // BEGIN(COMMENT);
+ TOK(T_POINT)
+ }
+"," TOK(T_COMMA)
+";" TOK(T_SIMILICON)
+":" TOK(T_COLON)
+"|" TOK(T_UNION)
+"^" TOK(T_EXCEPT)
+"/" TOK(T_SOLIDUS)
+"*" TOK(T_ASTERISK)
+"=" TOK(T_EQ)
+
+{sharp} {
+ BEGIN(PREPROC);
+}
+
+AEL_NOP STR_TOK(T_LDSASM)
+AEL_RETURN STR_TOK(T_LDSASM)
+AEL_RTS STR_TOK(T_LDSASM)
+AEL_LOOP_MSG STR_TOK(T_LDSASM)
+AEL_JSR_IND STR_TOK(T_LDSASM)
+
+{integer_name} NUM_TOK(T_NUMBER)
+{chainesp} STR_TOK(T_IDENTIFIER)
+{nl}|{tab}|{space}
+
+<<EOF>> { lds_restore_file(yyscanner);
+ if (lds_stack_ptr< 0) return YY_NULL;
+ }
+
+%%
+
+int g_lds_debug = 0;
+
+void lds_error(yyscan_t yyscanner,const char *s)
+{
+ printf("Failed line: %d %s\n",yyget_lineno(yyscanner),s);
+ exit(1);
+};
+
+void lds_switch_to_file(yyscan_t yyscanner,const char *f)
+{
+ std::string fn;
+
+ struct yyguts_t * yyg = (struct yyguts_t*)yyscanner;
+ /* Save Current State */
+ istack[lds_stack_ptr].m_buff = YY_CURRENT_BUFFER ;
+ istack[lds_stack_ptr].m_cin = yyget_in(yyscanner); //yyin;
+ if (ldsp->find_file(f,fn))
+ {
+ lds_stack_ptr++;
+ //yyin = fopen(fn.c_str(),"r");
+ yyset_in(fopen(fn.c_str(),"r"),yyscanner);
+ yy_switch_to_buffer ( yy_create_buffer(yyin,YY_BUF_SIZE,yyscanner),yyscanner);
+ } else
+ {
+ fprintf(stderr,"lds_switch_to_file FAILED %s\n",f);
+ }
+}
+
+
+/**
+ * should be called on <<EOF>>
+ */
+void lds_restore_file(yyscan_t yyscanner)
+{
+
+ struct yyguts_t * yyg = (struct yyguts_t*)yyscanner;
+
+ if (--lds_stack_ptr < 0)
+ {
+ fprintf(stderr,"lds_restore_file yyterminate() does not exists lds_stack_ptr=%d\n",lds_stack_ptr);
+ } else
+ { /* restore */
+ fprintf(stderr,"END LEX use or reference EEEERRRRORRRRRO lds_restore_file\n");
+ yy_delete_buffer(YY_CURRENT_BUFFER,yyscanner);
+ yy_switch_to_buffer(istack[lds_stack_ptr].m_buff,yyscanner);
+ /* What about cin ??? */
+ yyin = istack[lds_stack_ptr].m_cin;
+ }
+}
+
--- /dev/null
+%{
+#include <iostream>
+#include <sstream>
+#include <fstream>
+#include <cstdio>
+#include <stdio.h>
+#include <sys/stat.h>
+#include <sys/types.h>
+
+#ifndef __APPLE__
+#include <malloc.h>
+#endif
+#include <stdlib.h>
+#include <string.h>
+#include <algorithm>
+
+#include <cstdlib>
+
+#include <vector>
+#include <list>
+#include <map>
+#include <stack>
+#include <AST/Stmt.h>
+#include <AST/Expr.h>
+#include <AST/Decl.h>
+#include <AST/Type.h>
+#include <AST/ASTContext.h>
+
+#include <lds_parser_listener.h>
+#include <lds_parser.h>
+
+
+typedef void * yyscan_t;
+//extern int lds_lineno;
+extern int lds_get_lineno(yyscan_t);
+extern void lds_switch_to_file(yyscan_t,const char *f);
+
+extern int g_lds_debug;
+/* Also defined in sdl.l*/
+typedef union
+{
+ char *string;
+ int num;
+ double real;
+ AST::Stmt *stmt;
+ AST::Expr *expr;
+ AST::StringLiteral *str_expr;
+ AST::Decl *decl;
+ AST::Type *typ;
+ std::vector<AST::StringLiteral *> *str_array;
+ TypeArray *typ_array;
+ ExprArray *expr_array;
+ AST::TemplateArgumentArray *ta_array;
+ AST::TemplateArgument *tplt_arg;
+} YYSTYPE;
+
+
+
+#define YYSTYPE_IS_DECLARED 1
+
+//static AST::Context &m_Current = AST::Context::getRootContext();
+
+AST::TranslationUnitDecl *m_RootTranslationUnit = NULL; // AST::TranslationUnitDecl::Create(NULL,"Root");
+
+static AST::DeclContext *m_CurrentDC = NULL;
+static AST::AutomatonDecl *m_CurrentAut = NULL;
+static AST::AgentDecl *m_CurrentAgent = NULL;
+static std::stack<AST::DeclContext *> m_StackDC;
+static std::stack<AST::Stmt *> m_StackStmts;
+
+static int transition_count = 1;
+static std::string automaton_name;
+
+extern void lds_error(yyscan_t scanner, const char *s);
+extern int lds_lex(YYSTYPE *yylval,yyscan_t scanner);
+
+static lds::parser *ldsp = lds::parser::instance();
+
+/* Local hepler functions */
+void ldsExpr2TemplateArgument(yyscan_t scanner,AST::TemplateArgumentArray &a
+ ,AST::TemplateArgument *exp);
+
+/* Debug defines */
+#define F_SIZE "%u"
+#define F_INT "%d"
+#define F_LONG "%l"
+#define F_ULONG "%lu"
+
+#if defined(__GNUC__) && ! defined(DEBUG)
+#define LDS_LOG_DEBUG(fmt,args...) do {\
+ char _lbuf[256]; \
+ if ( _gLog.is_open()) { \
+ _gLog<<"DEBUG "; \
+ sprintf(_lbuf,fmt,##args); _gLog<<_lbuf; \
+ sprintf(_lbuf," (lds.y : %d)\n",__LINE__); _gLog<<_lbuf; \
+ } else if (g_lds_debug > 4){ \
+ fprintf(stderr,"lds_parser (DEBUG rel) line %d: ",lds_get_lineno(scanner)); \
+ fprintf(stderr,fmt,##args);\
+ fprintf(stderr," (lds.y : %d)\n",__LINE__);\
+ } \
+} while (0)
+
+#define LDS_LOG_INFO(fmt,args...) do {\
+ char _lbuf[256]; \
+ if ( _gLog.is_open()) { \
+ _gLog<<"INFO "; \
+ sprintf(_lbuf,fmt,##args); _gLog<<_lbuf; \
+ sprintf(_lbuf," (lds.y : %d)\n",__LINE__); _gLog<<_lbuf; \
+ } else if (g_lds_debug > 3){ \
+ fprintf(stderr,"lds_parser (INFO rel) line %d: ",lds_get_lineno(scanner)); \
+ fprintf(stderr,fmt,##args);\
+ fprintf(stderr," (lds.y : %d)\n",__LINE__);\
+ } \
+} while (0)
+
+
+#define LDS_LOG_WARN(fmt,args...) do {\
+ char _lbuf[256]; \
+ if ( _gLog.is_open()) { \
+ _gLog<<"WARN "; \
+ sprintf(_lbuf,fmt,##args); _gLog<<_lbuf; \
+ sprintf(_lbuf," (lds.y : %d)\n",__LINE__); _gLog<<_lbuf; \
+ } \
+ fprintf(stderr,"lds_parser (WARNI rel): "); \
+ fprintf(stderr,fmt,##args);\
+ fprintf(stderr," (lds.y : %d)\n",__LINE__);\
+} while (0)
+
+#define LDS_LOG_ERROR(fmt,args...) do {\
+ char _lbuf[256]; \
+ if ( _gLog.is_open()) { \
+ _gLog<<"ERROR "; \
+ sprintf(_lbuf,fmt,##args); _gLog<<_lbuf; \
+ sprintf(_lbuf," (lds.y : %d)\n",__LINE__); _gLog<<_lbuf; \
+ } \
+ fprintf(stderr,"lds_parser (ERROR rel): "); \
+ fprintf(stderr,fmt,##args);\
+ fprintf(stderr," (lds.y : %d)\n",__LINE__);\
+} while (0)
+
+static std::fstream _gLog;
+
+void open_log(const std::string &fn) {
+ struct stat st;
+ // Check if _gLog directory exists
+ if (stat("log",&st) == -1 ) {
+#ifdef WIN32
+ mkdir("log");
+#else
+ mkdir("log",0777);
+#endif
+ }
+ //
+ std::string _gLogname("log/"); _gLogname.append(fn); _gLogname.append(".parser.log");
+ if ( _gLog.is_open()) {
+ std::cout<<"open_log "<<fn<<" already open ?"<<std::endl;
+ } else
+ _gLog.open(_gLogname.c_str(),std::fstream::out);
+
+}
+
+void close_log() {
+ if ( _gLog.is_open())
+ _gLog.close();
+}
+#else
+ static inline void LDS_LOG_DEBUG(const char *fmt,...) {(void)fmt;};
+ static inline void LDS_LOG_INFO(const char *fmt,...) {(void)fmt;};
+#if 0
+ static inline void LDS_LOG_ERROR(const char *fmt,...) {
+ (void)fmt;
+ };
+#endif
+#define LDS_LOG_ERROR(fmt,args...) do {\
+ char _lbuf[256]; \
+ fprintf(stderr,"lds_parser (ERROR): "); \
+ fprintf(stderr,fmt,##args);\
+ fprintf(stderr," (lds.y : %d)\n",__LINE__);\
+} while (0)
+
+#define LDS_LOG_WARN(fmt,args...) do {\
+ char _lbuf[256]; \
+ fprintf(stderr,"lds_parser (WARN): "); \
+ fprintf(stderr,fmt,##args);\
+ fprintf(stderr," (lds.y : %d)\n",__LINE__);\
+} while (0)
+
+#define LDS_LOG_INFO(fmt,args...) do {\
+ char _lbuf[256]; \
+ fprintf(stderr,"lds_parser (INFO): "); \
+ fprintf(stderr,fmt,##args);\
+ fprintf(stderr," (lds.y : %d)\n",__LINE__);\
+} while (0)
+
+#endif
+
+
+
+%}
+
+%union {
+ char *string;
+ double real;
+ int num;
+ TemplateArgumentArray *ta_array;
+ TemplateArgument *tplt_arg;
+}
+
+
+%token <string>COMMAND
+%token T_ABSTRACT
+%token T_ACCEPT
+%token T_ACTIVE
+%token T_ALL
+%token T_AND
+%token T_AS
+%token T_AUTOMATON
+%token T_COMMENT
+%token T_STATE
+%token T_WHEN
+%token T_IF
+%token T_THEN
+%token T_DCL
+%token T_DECODE
+%token T_DEFAULT
+%token T_ELSE
+%token T_ELSIF
+%token T_ENCODE
+%token T_END
+%token T_ENV
+%token T_EXIT
+%token T_TASK
+%token T_OPERATORS
+%token T_THIS
+%token T_INHERITS
+%token T_IS
+%token T_SAME
+%token T_BEGIN
+%token T_GOTO
+%token T_CASE
+%token T_CHOICE
+%token T_CONNECT
+%token T_CONSTANTS
+%token T_TEST
+%token T_REFERENCED
+%token T_RESET
+%token T_SET
+%token T_EXECUTE
+%token T_CREATE
+%token T_LT
+%token T_GT
+%token T_AT
+%token T_EXCLAMATION
+%token T_LBRACKET
+%token T_RBRACKET
+%token T_LBRACET
+%token T_RBRACET
+%token T_RPARENTHESES
+%token T_LPARENTHESES
+%token T_POINT
+%token T_COMMA
+%token T_SIMILICON
+%token T_COLON
+%token T_UNION
+%token T_EXCEPT
+%token T_DO
+%token T_LOOP
+%token T_FOR
+%token T_ENDFOR
+%token T_OPTIONAL
+%token T_OFFSPRING
+%token T_OUTPUT
+%token T_NOTE
+%token T_NOW
+
+%token T_RANGE
+%token T_RESULT
+%token T_COMPOSITE_BEGIN
+%token T_COMPOSITE_END
+%token T_CONCAT
+%token T_HISTORY
+%token T_EQ
+%token T_GTE
+%token T_LTE
+%token T_NOT
+%token T_REM
+%token T_MOD
+%token T_OR
+%token T_XOR
+%token T_ASSIGN
+%token T_IMPLIES
+%token T_NE
+%token T_QUALIFIER_BEGIN
+%token T_QUALIFIER_END
+
+%token T_PACKAGE
+%token T_PARENT
+%token T_ENDPACKAGE
+%token T_CHARSTRING
+%token <str_expr>T_IDENTIFIER
+%token T_NUMBER
+%token T_PLUS
+%token T_HYPHEN
+%token T_SOLIDUS
+%token T_ASTERISK
+%token <str_expr>T_LDSASM
+
+%token T_SYSTEM
+%token T_BLOCK
+%token T_EXTERN
+%token T_SIGNALLIST
+%token T_SIGNAL
+%token T_CHANNEL
+%token T_FROM
+%token T_SIZE
+%token T_SYNONYM
+%token T_SYNTYPE
+%token T_TO
+%token T_ENDSYSTEM
+%token T_ENDBLOCK
+%token T_ENDCHANNEL
+%token T_ENDSYNTYPE
+%token T_ENDVALUE
+%token T_USE
+%token T_TYPE
+%token T_GATE
+%token T_VIA
+%token T_PRIORITY
+%token T_IN
+%token T_OUT
+%token T_LITERALS
+%token T_STRUCT
+%token T_SELF
+%token T_SENDER
+%token T_VALUE
+%token T_WITH
+%token T_WHILE
+%token T_TIMER
+
+%type <decl> action_name block_agent
+%type <expr> switch_cond
+%type <stmt> action_call output_action
+%type <stmt> actions task_body
+%type <stmt> action_switch switch_cases case_
+%type <stmt> action_loop loop_body
+%type <stmt> transition_body
+%type <stmt> action_assignment
+%type <stmt> action_decision decision_task_body alternative alternative_decisions
+%type <expr> expression expression0 operand operand0 operand1 operand2 operand3 operand4 operand5 primary
+%type <expr> create_expression imperative_expression encode_expr decode_expr encode_path
+%type <decl> automaton_header task state task_begin task_definitions transition transition_head
+%type <decl> state_begin state_name target_state_name signal_decl_item
+%type <decl> events variables field literal_signature package_header system_header block_header
+%type <decl> event channel_ep channel_path channel_definition
+%type <decl> syntype_name
+%type <decl> choice_of_sort
+%type <decl> dtd_body datatype_end dtd_constructor datatype_heading
+%type <str_array> variable_names
+%type <expr> actual_parameter_list actual_parameters conditional_expression signal_list_item
+%type <expr> opt_actual_parameters range range_condition syntype_optional default_initialization opt_default_initialization
+%type <expr> opt_communication_constraint communication_constraint
+%type <typ> sort named_sort bsort inline_dt_def inline_st_def anchored_sort
+%type <typ> op_result formal_parameter
+%type <typ> dt_type_expr datatype_specialization
+%type <typ_array> arguments op_arguments sort_items sort_list named_fields named_fields_sort_list
+%type <typ_array> sort_or_named_fields_sort_list
+%type <expr_array> primary_list signal_list chp_with
+
+%type <tplt_arg> actual_context_param
+
+%type <ta_array> actual_context_param_list
+
+%name-prefix="lds_"
+%pure-parser
+
+%lex-param {yyscan_t *scanner}
+%parse-param {yyscan_t scanner}
+
+%%
+
+
+
+system_specifications: agent {
+ LDS_LOG_DEBUG("system_specifiction: automaton root node");
+ }
+ | system_specifications agent {
+ LDS_LOG_DEBUG("system_specifiction: system_specifications automaton root node");
+ }
+;
+
+agent: automaton {
+ LDS_LOG_INFO("agent: parsed automaton");
+ }
+ | block_agent {
+ LDS_LOG_INFO("agent: parsed block");
+ }
+ | package_agent {
+ LDS_LOG_INFO("agent: parsed package");
+ }
+ | system_agent {
+ LDS_LOG_INFO("agent: parsed system");
+ }
+;
+
+package_agent: package_header package_body T_ENDPACKAGE T_IDENTIFIER T_SIMILICON {
+ /*
+ * PACKAGE AGENT RULES
+ */
+ AST::PackageDecl &sd = dynamic_cast<AST::PackageDecl &>(*$<decl>1);
+ LDS_LOG_INFO("package_agent: parse package");
+ m_RootTranslationUnit->addDecl($1);
+ m_StackDC.pop();
+ ldsp->got_PackageDecl(sd);
+ }
+ | package_use package_header package_body T_ENDPACKAGE T_IDENTIFIER T_SIMILICON {
+ LDS_LOG_INFO("package_agent: parse package with package_use ");
+ AST::PackageDecl &sd = dynamic_cast<AST::PackageDecl &>(*$<decl>2);
+ m_RootTranslationUnit->addDecl($2);
+ m_StackDC.pop();
+ /** Should not be required */
+ if (m_StackDC.size() >0)
+ m_CurrentDC = m_StackDC.top();
+ ldsp->got_PackageDecl(sd);
+ }
+;
+
+package_header: T_PACKAGE T_IDENTIFIER {
+ LDS_LOG_INFO("package_header: parse package %s",$2->getString().c_str());
+ AST::PackageDecl *pd = AST::PackageDecl::Create(m_RootTranslationUnit, $2->getString());
+ $<decl>$ = m_CurrentAgent = pd;
+ m_CurrentDC = dynamic_cast<AST::DeclContext *>($<decl>$);
+ m_StackDC.push(m_CurrentDC);
+ /* Should be package name */
+ automaton_name = $2->getString();
+ transition_count = 1;
+ ldsp->got_PackageDecl(*pd,lds::parser::eBEGIN);
+ }
+;
+
+package_body: var_declarations opt_agent_types {
+ }
+;
+
+opt_agent_types: /* Empty */
+ | agent_types {
+ }
+;
+
+agent_types: agent_type {
+ LDS_LOG_INFO("agent_types: block");
+ }
+ | agent_types agent_type {
+ LDS_LOG_INFO("agent_types: block next");
+ }
+;
+
+agent_type: block_type {
+ LDS_LOG_INFO("agent_type: block");
+ }
+ | automaton_type {
+ LDS_LOG_INFO("agent_type: automaton type");
+ }
+ | automaton {
+ LDS_LOG_INFO("agent_type: automaton");
+ }
+;
+
+block_type: block_type_header block_body agent_type_end {
+ /* BlockType agent rules */
+ AST::BlockTypeDecl &sd = dynamic_cast<AST::BlockTypeDecl &>(*$<decl>1);
+ /* Is true if StackDC size is 1 */
+ if (m_StackDC.size() > 1)
+ {
+ m_StackDC.top()->addDecl($<decl>1);
+ } else
+ m_RootTranslationUnit->addDecl($<decl>1);
+ m_StackDC.pop();
+ ldsp->got_BlockTypeDecl(sd);
+ }
+;
+
+agent_type_end: end {
+ }
+ | T_AUTOMATON T_TYPE end {
+ }
+ | T_ENDBLOCK T_TYPE T_IDENTIFIER end {
+ }
+ | T_ENDBLOCK T_TYPE end {
+ }
+;
+
+block_type_header: T_BLOCK T_TYPE T_IDENTIFIER end {
+ LDS_LOG_INFO("block_type_header: parse block");
+ AST::BlockTypeDecl *bl =
+ AST::BlockTypeDecl::Create(m_RootTranslationUnit->getASTContext(),m_RootTranslationUnit, $3->getString());
+ //$<decl>$ = AST::PackageUseDecl::Create( m_RootTranslationUnit->getASTContext()
+ $<decl>$ = bl;
+ m_CurrentDC = dynamic_cast<AST::DeclContext *>($<decl>$);
+ m_StackDC.push(m_CurrentDC);
+ automaton_name = $3->getString();
+ transition_count = 1;
+ ldsp->got_BlockTypeDecl(*bl,lds::parser::eBEGIN);
+ }
+;
+
+
+automaton_type: package_use automaton_type_header T_IS automaton_body T_END T_AUTOMATON T_IDENTIFIER T_SIMILICON {
+ LDS_LOG_INFO("type_based_automaton: Got automaton with end ID");
+ // I guess this should be an TopLevelDecl of an automaton
+ if ($<decl>2 != NULL)
+ m_RootTranslationUnit->addDecl($<decl>2);
+ m_StackDC.pop();
+ delete ($7);
+
+ ldsp->got_AutomatonDecl(*m_CurrentAut);
+ }
+ | package_use automaton_type_header T_IS automaton_body T_END T_AUTOMATON T_SIMILICON {
+ LDS_LOG_INFO("type_based_automaton: Got automaton without end ID");
+ if ($<decl>2 != NULL)
+ m_RootTranslationUnit->addDecl($<decl>2);
+ m_StackDC.pop();
+ //ldsp->got_AutomatonDecl(*m_CurrentAut);
+ }
+;
+
+
+automaton_type_header: T_AUTOMATON T_TYPE T_IDENTIFIER {
+ LDS_LOG_INFO("automaton_type_header: started %s",$3->getString().c_str());
+ AST::AutomatonTypeDecl *aut =
+ AST::AutomatonTypeDecl::Create(m_RootTranslationUnit->getASTContext(),m_RootTranslationUnit, $3->getString());
+ $<decl>$ = aut;
+ m_CurrentDC = dynamic_cast<AST::DeclContext *>($<decl>$);
+ m_StackDC.push(m_CurrentDC);
+ automaton_name = $3->getString();
+ transition_count = 1;
+ ldsp->got_AutomatonTypeDecl(*aut,lds::parser::eBEGIN);
+ }
+;
+
+
+
+block_agent: block_header block_body block_end {
+ /* Block agent rules */
+ AST::BlockDecl &sd = dynamic_cast<AST::BlockDecl &>(*$<decl>1);
+ /* Is true if StackDC size is 1 */
+ if (m_StackDC.size() > 1)
+ {
+ // m_StackDC.top()->addDecl($1);
+ } else
+ m_RootTranslationUnit->addDecl($1);
+ m_StackDC.pop();
+ m_CurrentDC = m_StackDC.top();
+ ldsp->got_BlockDecl(sd);
+ $$ = &sd;
+ }
+;
+
+system_agent: package_use system_header block_body block_end {
+ /* Block agent rules Instance */
+ AST::SystemDecl &sd = dynamic_cast<AST::SystemDecl &>(*$<decl>2);
+ m_RootTranslationUnit->addDecl($2);
+ m_StackDC.pop();
+ ldsp->got_SystemDecl(sd);
+ }
+;
+
+block_header: T_BLOCK T_IDENTIFIER T_SIMILICON {
+ LDS_LOG_INFO("block_header: parse block %s",$2->getString().c_str());
+ AST::BlockDecl *bl =
+ AST::BlockDecl::Create(m_RootTranslationUnit, $2->getString());
+ $<decl>$ = m_CurrentAgent = bl;
+ m_CurrentDC = dynamic_cast<AST::DeclContext *>($<decl>$);
+ m_StackDC.push(m_CurrentDC);
+ automaton_name = $2->getString();
+ transition_count = 1;
+ ldsp->got_BlockDecl(*bl,lds::parser::eBEGIN);
+ }
+;
+system_header: T_SYSTEM T_IDENTIFIER T_SIMILICON {
+ LDS_LOG_INFO("system_header: parse system");
+ AST::SystemDecl *sd =
+ AST::SystemDecl::Create(m_RootTranslationUnit, $2->getString());
+ $<decl>$ = m_CurrentAgent = sd;
+ m_CurrentDC = dynamic_cast<AST::DeclContext *>($<decl>$);
+ m_StackDC.push(m_CurrentDC);
+ automaton_name = $2->getString();
+ transition_count = 1;
+ ldsp->got_SystemDecl(*sd,lds::parser::eBEGIN);
+ }
+;
+
+block_end: T_ENDBLOCK T_IDENTIFIER T_SIMILICON {
+ LDS_LOG_INFO("block_end: block");
+ }
+ | T_ENDSYSTEM T_IDENTIFIER T_SIMILICON {
+ LDS_LOG_INFO("block_end: system");
+ }
+;
+
+block_body: var_declarations {
+ }
+ | var_declarations block_body_defs {
+ }
+;
+
+block_body_defs: bb_body_def {
+ }
+ | block_body_defs bb_body_def {
+ }
+;
+
+bb_body_def: automaton {
+ LDS_LOG_INFO("bb_body_def: automaton definition");
+ }
+ | T_AUTOMATON T_TYPE T_IDENTIFIER T_REFERENCED T_SIMILICON {
+ /* The definition is integrated in the block. lookup and parse the given automaton type */
+ LDS_LOG_INFO("bb_body_def: automaton type %s referenced definition",$3->getString().c_str());
+ }
+ | T_BLOCK T_TYPE T_IDENTIFIER T_REFERENCED T_SIMILICON {
+ LDS_LOG_INFO("bb_body_def: block type %s referenced definition",$3->getString().c_str());
+ }
+ | agent_reference {
+ LDS_LOG_INFO("bb_body_def: agent reference");
+ }
+ | block_agent {
+ LDS_LOG_INFO("bb_body_def: Block agent definition");
+ m_CurrentDC->addDecl($1);
+ }
+ | channel_definition {
+ LDS_LOG_INFO("bb_body_def: got channel definition");
+ m_CurrentDC->addDecl($1);
+ }
+ | gate_definition {
+ LDS_LOG_INFO("bb_body_def: gate definition");
+ }
+ | typebased_definition {
+ LDS_LOG_INFO("bb_body_def: typebased_definition");
+ }
+;
+
+agent_reference: typebased_header number_instances T_REFERENCED end {
+ LDS_LOG_INFO("agent reference: typebased_definition");
+ }
+;
+
+typebased_definition: typebased_header number_instances T_COLON T_IDENTIFIER end {
+ LDS_LOG_INFO("typebased_definition: %s",$4->getString().c_str());
+ }
+;
+
+typebased_header: T_AUTOMATON T_IDENTIFIER {
+ LDS_LOG_INFO("typebased_header: automaton %s",$2->getString().c_str());
+ }
+ | T_BLOCK T_IDENTIFIER {
+ LDS_LOG_INFO("typebased_header: system");
+ }
+ | T_SYSTEM T_IDENTIFIER {
+ LDS_LOG_INFO("typebased_header: system");
+ }
+;
+
+number_instances: /* Empty */ {
+ }
+ | T_LPARENTHESES T_RPARENTHESES {
+ }
+ | T_LPARENTHESES T_NUMBER T_RPARENTHESES {
+ }
+ | T_LPARENTHESES T_NUMBER T_COMMA T_NUMBER T_RPARENTHESES {
+ }
+ | T_LPARENTHESES T_NUMBER T_COMMA T_NUMBER T_COMMA T_NUMBER T_RPARENTHESES {
+ /* Initial >= Max , Max , Lower<: Initial */
+ }
+;
+
+automaton: package_use automaton_header T_IS automaton_body T_END T_AUTOMATON T_IDENTIFIER T_SIMILICON {
+ LDS_LOG_INFO("automaton: Got automaton with end ID");
+ // I guess this should be an TopLevelDecl of an automaton
+ m_StackDC.pop();
+ if (m_StackDC.size() > 0)
+ m_CurrentDC = m_StackDC.top();
+ if ($2 != NULL && (m_StackDC.size() == 0))
+ {
+ m_RootTranslationUnit->addDecl($2);
+ } else {
+ m_CurrentDC->addDecl($2);
+ }
+ delete ($7);
+ if (m_StackDC.size())
+ if (AST::AgentDecl *ag = dynamic_cast<AST::AgentDecl *>(m_StackDC.top()))
+ {
+ m_CurrentAgent = ag;
+ }
+ ldsp->got_AutomatonDecl(*m_CurrentAut);
+ }
+ | package_use automaton_header T_IS automaton_body T_END T_AUTOMATON T_SIMILICON {
+ LDS_LOG_INFO("automaton: Got automaton without end ID");
+ if ($2 != NULL)
+ m_RootTranslationUnit->addDecl($2);
+ m_StackDC.pop();
+ ldsp->got_AutomatonDecl(*m_CurrentAut);
+ }
+;
+
+
+automaton_header: T_AUTOMATON T_IDENTIFIER {
+ LDS_LOG_INFO("automaton_header: started %s",$2->getString().c_str());
+ $$ =
+ m_CurrentAut = AST::AutomatonDecl::Create(m_RootTranslationUnit, $2->getString());
+ m_CurrentAgent = m_CurrentAut;
+ m_CurrentDC = dynamic_cast<AST::DeclContext *>($$);
+ m_StackDC.push(m_CurrentDC);
+ automaton_name = $2->getString();
+ transition_count = 1;
+ ldsp->got_AutomatonDecl(*m_CurrentAut,lds::parser::eBEGIN);
+ }
+;
+
+automaton_body: var_declarations task_definitions state_definitions {
+ LDS_LOG_INFO("automaton_body: complete");
+ // The Body contains all definitions ....
+ }
+ | var_declarations state_definitions {
+ LDS_LOG_INFO("automaton_body: without tasks complete");
+ }
+ | state_definitions {
+ LDS_LOG_INFO("automaton_body: without var nor tasks complete");
+ }
+;
+
+var_declarations: /**/
+ | variables {
+ LDS_LOG_INFO("var_declarations: first");
+ }
+ | var_declarations variables {
+ LDS_LOG_INFO("var_declarations: new");
+ }
+
+;
+
+variables: variable_definition {
+ LDS_LOG_INFO("variables: variable_definition");
+ }
+ | signal_decl {
+ LDS_LOG_INFO("variables: signal declaration ");
+ /* It's possible that the signal is declared in a Package or Block */
+ }
+ | syntype_definition {
+ LDS_LOG_INFO("variables: got syntype ");
+ }
+ | synonym_definition {
+ LDS_LOG_INFO("variables: got syntype ");
+ }
+ | datatype_definition {
+ LDS_LOG_INFO("variables: got datatype ");
+ }
+ | channel_definition {
+ LDS_LOG_INFO("variables: got channel ");
+ }
+ | timer_definition {
+ LDS_LOG_INFO("variables: got channel ");
+ }
+ | gate_definition {
+ LDS_LOG_INFO("variables: gate definition");
+ }
+;
+
+timer_definition: T_TIMER timer_definition_items end {
+ LDS_LOG_INFO("timer_definition: WARNING NOT YET CODED got a timer definition");
+ }
+;
+
+timer_definition_items: timer_item {
+ }
+ | timer_definition_items T_COMMA timer_item {
+ }
+;
+
+timer_item: T_IDENTIFIER {
+ LDS_LOG_INFO("timer_item: Should Create a Timer Decl Missing Type");
+ AST::Type * vTy = &m_RootTranslationUnit->getASTContext().VoidTy;
+ AST::TimerDecl *timer = AST::TimerDecl::Create(m_RootTranslationUnit->getASTContext(),m_CurrentDC,$1->getString(),NULL);
+ m_CurrentDC->addDecl(timer);
+ delete ($1);
+ }
+ | T_IDENTIFIER sort_or_named_fields_sort_list {
+ LDS_LOG_INFO("timer_item: with sort list");
+ AST::TimerDecl *timer = AST::TimerDecl::Create(m_RootTranslationUnit->getASTContext(),m_CurrentDC,$1->getString(),NULL);
+ m_CurrentDC->addDecl(timer);
+ delete ($1);
+ }
+;
+
+variable_definition: T_DCL variables_of_sort_list end {
+ LDS_LOG_INFO("variables_definition: got one dcl ");
+ }
+;
+
+variables_of_sort_list: variables_sort {
+ }
+ | variables_of_sort_list T_COMMA variables_sort {
+ }
+;
+
+variables_sort: variable_names sort {
+ /* */
+ AST::Type *sort = dynamic_cast<AST::Type *>($<typ>2);
+ if (sort != NULL)
+ {
+ LDS_LOG_INFO("variables_sort: sort is %s",sort->getTypeClassName());
+ /* IDENTIFIER Is the Type*/
+ std::vector<AST::StringLiteral *> *a = reinterpret_cast<std::vector<AST::StringLiteral *> *>($1);
+ /* Most simplest case need to be improved */
+ //LDS_LOG_INFO("variables_sort: got variable %s ",sort->getString().c_str());
+ for (std::vector<AST::StringLiteral *>::iterator sit = a->begin(); sit != a->end() ; ++sit)
+ {
+ AST::StringLiteral *s = (*sit);
+ // LDS_LOG_INFO("variables_sort: got 1 variable %s type:%s",s->getString().c_str(),sort->getString().c_str());
+ m_CurrentDC->addDecl(ldsp->create_variable(m_CurrentDC,m_RootTranslationUnit,(*sit),sort));
+ delete (s);
+ }
+ } else {
+ LDS_LOG_ERROR("variables_sort: sort is NULL not good");
+ }
+ delete ($1);
+ }
+ | variable_names sort T_ASSIGN expression {
+ AST::Type *sort = dynamic_cast<AST::Type *>($<typ>2);
+ /* Be sure expression is a constant expression or else exit */
+ LDS_LOG_INFO("variables_sort: TODO add initExpression");
+ if (sort != NULL)
+ {
+ /* IDENTIFIER Is the Type*/
+ std::vector<AST::StringLiteral *> *a = reinterpret_cast<std::vector<AST::StringLiteral *> *>($1);
+ /* Most simplest case need to be improved */
+ //LDS_LOG_INFO("variables_sort: got variable %s ",sort->getString().c_str());
+ for (std::vector<AST::StringLiteral *>::iterator sit = a->begin(); sit != a->end() ; ++sit)
+ {
+ AST::StringLiteral *s = (*sit);
+ // LDS_LOG_INFO("variables_sort: got 1 variable %s type:%s",s->getString().c_str(),sort->getString().c_str());
+ AST::VarDecl *v =ldsp->create_variable(m_CurrentDC,m_RootTranslationUnit,(*sit),sort);
+ v->setInit($4);
+ m_CurrentDC->addDecl(v);
+ delete (s);
+ }
+ } else {
+ LDS_LOG_ERROR("variables_sort: sort is NULL not good");
+ }
+ delete ($1);
+ }
+;
+
+variable_names: T_IDENTIFIER {
+ $$ = new std::vector<AST::StringLiteral *>();
+ $$->push_back($1);
+ LDS_LOG_INFO("variables_names: first %s",$1->getString().c_str());
+ }
+ | variable_names T_COMMA T_IDENTIFIER {
+ LDS_LOG_INFO("variables_names: next %s",$3->getString().c_str() );
+ $1->push_back($3);
+ $$ = $1;
+ }
+;
+
+synonym_definition: T_SYNONYM synonym_items end {
+ LDS_LOG_INFO("synonym_definition : assign sort ");
+ }
+;
+
+synonym_items: synonym_item {
+ }
+ | synonym_items T_COMMA synonym_item {
+ }
+;
+
+synonym_item: T_IDENTIFIER sort T_ASSIGN expression {
+ LDS_LOG_INFO("synonym_item : assign sort ");
+ AST::Type *sort = dynamic_cast<AST::Type *>($<typ>2);
+ AST::VarDecl *v =ldsp->create_variable(m_CurrentDC,m_RootTranslationUnit,$1,sort);
+ v->setInit($4);
+ v->setConstant(true);
+ m_CurrentDC->addDecl(v);
+ }
+ |T_IDENTIFIER T_ASSIGN expression {
+ LDS_LOG_ERROR("synonym_item : assign without sort ");
+ }
+;
+
+signal_decl: T_SIGNAL signal_decl_list end {
+ LDS_LOG_INFO("signal_decl: signal declaration one or more");
+ }
+;
+
+signal_decl_list: signal_decl_item {
+ m_CurrentDC->addDecl($1);
+ }
+ | signal_decl_list T_COMMA signal_decl_item {
+ m_CurrentDC->addDecl($3);
+ }
+;
+
+signal_decl_item: T_IDENTIFIER {
+ LDS_LOG_INFO("signal_decl_item: signal declaration %s without parameters ",$1->getString().c_str());
+ /* Lookup if signal already exists or not */
+ /* Create getFunctionProtoType ...*/
+ AST::EventDecl *evt = AST::EventDecl::Create(m_CurrentDC,$1->getString(),NULL) ;
+ $$ = evt;
+ }
+ | T_IDENTIFIER sort_list {
+ /* Z.102 Pg 27 Signal definition is :
+ signal name [formal context parameters] [virtuality constraint] [specialization] [sort list] */
+ TypeArray &args = *dynamic_cast<TypeArray *>($2);
+ LDS_LOG_INFO("signal_decl_item: signal declaration %s with parameters ",$1->getString().c_str());
+ /* Create getFunctionProtoType ...*/
+ AST::EventDecl *evt = AST::EventDecl::Create(m_CurrentDC,$1->getString(),NULL) ;
+ $$ = evt;
+ if ($2 != NULL)
+ {
+ int count = 0;
+ for (TA_iterator sort_it = args.begin(); sort_it != args.end();++sort_it )
+ {
+ AST::Type * vTy = &m_RootTranslationUnit->getASTContext().VoidTy;
+ std::ostringstream oss;
+ if ((*sort_it) != NULL)
+ {
+ vTy = (*sort_it);
+ }
+ oss.str("");
+ oss<<"Arg"<<count; count++;
+ AST::ParmVarDecl *var =
+ AST::ParmVarDecl::Create(m_CurrentDC,oss.str(),vTy);
+ evt->add_param(var);
+ }
+ }
+
+ }
+;
+
+
+
+package_use: /* Empty */
+ | use_list {
+ }
+ | package_use use_list {
+ }
+;
+
+use_list: T_USE T_IDENTIFIER pkgu_select_list T_SIMILICON {
+ LDS_LOG_INFO("package_use: %s ",$2->getString().c_str());
+ $<decl>$ = AST::PackageUseDecl::Create( m_RootTranslationUnit->getASTContext()
+ , m_CurrentDC
+ , $2->getString());
+ delete($2);
+ m_RootTranslationUnit->addDecl($<decl>$);
+ lds_switch_to_file(scanner,$2->getString().c_str());
+ }
+;
+
+pkgu_select_list: /* Empty*/
+ | T_SOLIDUS select_list {
+ LDS_LOG_INFO("pkgu_select_list ");
+ }
+;
+
+select_list: def_select {
+ LDS_LOG_INFO("select_list: at leat one ");
+ }
+ | select_list T_COMMA def_select {
+ LDS_LOG_INFO("select_list: ");
+ }
+;
+
+def_select: T_SYSTEM T_TYPE T_IDENTIFIER {
+ LDS_LOG_INFO("def_select system type %s",$3->getString().c_str());
+ }
+ | T_BLOCK T_TYPE T_IDENTIFIER {
+ LDS_LOG_INFO("def_select block type %s",$3->getString().c_str());
+ }
+ | T_AUTOMATON T_TYPE T_IDENTIFIER {
+ LDS_LOG_INFO("def_select automaton type %s",$3->getString().c_str());
+ }
+ | T_PACKAGE T_IDENTIFIER {
+ LDS_LOG_INFO("def_select package %s",$2->getString().c_str());
+ }
+ | T_SIGNAL T_IDENTIFIER {
+ LDS_LOG_INFO("def_select signal %s",$2->getString().c_str());
+ }
+ | T_TYPE T_IDENTIFIER {
+ LDS_LOG_INFO("def_select type %s",$2->getString().c_str());
+ }
+ | T_SIGNALLIST T_IDENTIFIER {
+ LDS_LOG_INFO("def_select signallist %s",$2->getString().c_str());
+ }
+;
+
+syntype_definition: syntype_name T_EQ sort opt_default_initialization syntype_optional syntype_end {
+ /* See Z.104 2011 Pg 29 for the complete definition. Which is much richer than the one here */
+ //LDS_LOG_INFO("syntype_definition %s got it",$2->getString().c_str());
+ AST::TypedefDecl &td = dynamic_cast<AST::TypedefDecl &>(*$<decl>1);
+ td.setBaseType($3);
+ if ($5 != NULL)
+ { /* Got Range condition to be applied add it to the typedef for further evaluation */
+ LDS_LOG_INFO("syntype_definition %s got it TODO handle constraint",td.getName().c_str());
+ td.setConstraint($5);
+ }
+ if ($4 != NULL)
+ td.setInit($4);
+ m_CurrentDC->addDecl($<decl>1);
+ ldsp->got_TypedefDecl(td, lds::parser::END);
+ }
+ | syntype_name T_EQ sort syntype_body {
+ AST::TypedefDecl &td = dynamic_cast<AST::TypedefDecl &>(*$<decl>1);
+ td.setBaseType($3);
+ LDS_LOG_ERROR("syntype_definition: with body don't call setTypeForDecl because because $3 is parent type");
+ m_CurrentDC->addDecl($<decl>1);
+ ldsp->got_TypedefDecl(td, lds::parser::END);
+ }
+;
+
+syntype_name: T_SYNTYPE T_IDENTIFIER {
+ /* Alright create the new Typedef */
+ LDS_LOG_INFO("syntype_name %s got it",$2->getString().c_str());
+ /* Check if typedef already exists or if it's a primitive type */
+ AST::DeclContext::lookup_result r = m_CurrentAgent->lookup($2->getString());
+ if ( r.size() > 0)
+ {
+ LDS_LOG_ERROR("syntype_name: Typedef identifier %s found " F_SIZE " already exists should stop",$2->getString().c_str(),r.size());
+ $$ = r[0];
+ }
+ AST::TypedefDecl *td = AST::TypedefDecl::Create(m_RootTranslationUnit->getASTContext(),m_CurrentDC,$2->getString());
+ $<decl>$ = td;
+ AST::Type &t = m_RootTranslationUnit->getASTContext().getTypedefType(td);
+ delete($2);
+ ldsp->got_TypedefDecl(*td, lds::parser::eBEGIN);
+ }
+;
+
+syntype_optional: /* Empty */ {
+ $$ = NULL;
+ }
+ | T_CONSTANTS range_condition {
+ LDS_LOG_INFO("syntype: constant range");
+ $$ = $2;
+ }
+;
+
+syntype_body: T_LBRACET syntype_body_content T_RBRACET {
+ LDS_LOG_INFO("syntype_body: content TODO");
+ }
+;
+
+syntype_body_content: /* Empty */ {
+ }
+ | opt_default_initialization end constraint end {
+ }
+ | opt_default_initialization constraint end {
+ }
+;
+
+syntype_end: T_ENDSYNTYPE end {
+ }
+ | T_ENDSYNTYPE T_IDENTIFIER end {
+ delete( $2 );
+ }
+;
+
+opt_default_initialization: /* Empty */ {
+ /* Z.104 Chap 12.3.3.2 */
+ $$ = NULL;
+ }
+ | default_initialization {
+ }
+;
+
+default_initialization: T_DEFAULT T_NUMBER {
+ /* Z.104 default [<virtuality>] [<constant epxression>] */
+ /* Virtuality is redefined ot finalized. That means the instance to be
+ * intialized is a virtual instance. Virtuality is not yet implemented
+ */
+ LDS_LOG_INFO("default_initialization: number ");
+ AST::IntegerLiteral *el = new AST::IntegerLiteral($<num>2);
+ $$ = el;
+ }
+ | T_DEFAULT T_CHARSTRING {
+ LDS_LOG_INFO("default_initialization: string ");
+ AST::Type &Char = m_RootTranslationUnit->getASTContext().CharTy;
+ AST::Type &CharArray = m_RootTranslationUnit->getASTContext().getConstantArrayType(&Char,strlen($<string>1)+1 );
+ $$ = new AST::StringLiteral($<string>1,&CharArray);
+ }
+;
+
+datatype_definition: datatype_heading datatype_specialization datatype_end {
+ /* Z.104 Pg 20 */
+ AST::ValueTypeDecl *vt = dynamic_cast<AST::ValueTypeDecl *>($<decl>1);
+ AST::RecordDecl *Dr = dynamic_cast<AST::RecordDecl *>($3);
+ AST::EnumDecl *De = dynamic_cast<AST::EnumDecl *>($3);
+ AST::Type *Ty = $2;
+ if ( $2 != NULL) {
+ /* mainly inherit stuff, renaming and adding not supported */
+ LDS_LOG_DEBUG("datatype_definition: got datatype_definition <%s> with specialization",vt->getName().c_str());
+ } else {
+ if (Dr != NULL) {
+ Dr->setName(std::string("_") + vt->getName());
+ AST::Type &t = m_RootTranslationUnit->getASTContext().getRecordType(Dr);
+ LDS_LOG_DEBUG("datatype_definition: got datatype_definition <%s> with RecordDecl",vt->getName().c_str());
+ } else if (De != NULL) {
+ LDS_LOG_DEBUG("datatype_definition: got datatype_definition %s Enum type",vt->getName().c_str());
+ } else {
+ LDS_LOG_DEBUG("datatype_definition: got datatype_definition %s",vt->getName().c_str());
+ }
+ }
+ m_StackDC.pop();
+ m_CurrentDC = $<decl>1->getDeclContext();
+ vt->setSpecialization(Ty);
+ // Not sur this is required. getValueTypeType already called
+ // in heading rule.
+ AST::Type &ty = m_RootTranslationUnit->getASTContext().getValueTypeType(vt);
+ ldsp->got_ValueTypeDecl(*vt, lds::parser::END);
+ }
+;
+
+datatype_specialization: /* Empty */ {
+ /* Z.104 Pg 32 Chap 12.1.9 this declatation is not complete */
+ $<typ>$ = NULL;
+ }
+ | T_INHERITS dt_type_expr {
+ /* Missing [<renaming> | <legacy data inheritance>] [adding]*/
+ $<typ>$ = $2;
+ }
+;
+
+dt_type_expr: T_IDENTIFIER {
+ /* Array and Vector shall be the only possible values for Now. Just to be able to
+ declare arrays and Vectors
+ */
+ LDS_LOG_INFO("dt_type_expr: TODO %s",$1->getString().c_str());
+ AST::DeclContext::lookup_result r =
+ m_CurrentAgent->lookup( $1->getString() );
+ if ( r.size() > 0 )
+ { /* May be we can improve here.*/
+ }
+ $$ = NULL;
+ }
+ | T_IDENTIFIER T_LT actual_context_param_list T_GT {
+ /* Param are template parameters */
+ /* Resolve IDENTIFIER's sort type */
+ LDS_LOG_INFO("dt_type_expr: %s parameters",$1->getString().c_str());
+ AST::ASTContext &ctx = m_RootTranslationUnit->getASTContext();
+ AST::TemplateArgumentArray *taa = ($3);
+ AST::TemplateArgument *ta_type = ((*taa)[1]);
+
+ if (! $1->getString().compare("Array")
+ || !( $1->getString().compare("Vector"))
+ )
+ {
+ AST::TemplateArgument *ta = ((*taa)[0]);
+ if ( ta->isExpression() )
+ {
+ AST::IntegerLiteral *i = dynamic_cast<AST::IntegerLiteral *>(ta->getExpression());
+ AST::Type &Arr = ctx.getConstantArrayType(ta_type->getType(),i->get_value());
+ $$ = &Arr;
+ } else {
+ LDS_LOG_ERROR("dt_type_expr: %s parameter 2 must be expression",$1->getString().c_str());
+ $$ = NULL;
+ }
+ } else
+ {
+ LDS_LOG_ERROR("dt_type_expr: TODO %s parameters",$1->getString().c_str());
+ $$ = NULL;
+ }
+ }
+;
+
+actual_context_param_list: actual_context_param {
+ /* Z.102 P*/
+ LDS_LOG_INFO("actual_context_param_list: first");
+ $$ = new AST::TemplateArgumentArray();
+ if ($1 != NULL)
+ ldsExpr2TemplateArgument(scanner,*$$,$1);
+ }
+ | actual_context_param_list T_COMMA actual_context_param {
+ LDS_LOG_INFO("actual_context_param_list: TODO next");
+ if ($<ta_array>1 != NULL && $3 != NULL)
+ {
+ ldsExpr2TemplateArgument(scanner,*$1,$3);
+ }
+ }
+;
+
+actual_context_param: T_IDENTIFIER {
+ LDS_LOG_DEBUG("actual_context_param: TODO %s must be a type",$1->getString().c_str());
+ AST::DeclContext::lookup_result r = m_CurrentAgent->lookup( $1->getString() );
+ if ( r.size() > 0 )
+ {
+ LDS_LOG_INFO("actual_context_param: Typedef identifier %s found " F_SIZE " times"
+ ,$1->getString().c_str(),r.size());
+ if (AST::TypedefDecl *td = dynamic_cast<AST::TypedefDecl *>(r[0]) )
+ {
+ $$ = AST::TemplateArgument::Create(
+ m_RootTranslationUnit->getASTContext(),
+ td->getTypeForDecl());
+ } else if (AST::ValueTypeDecl *td = dynamic_cast<AST::ValueTypeDecl *>(r[0]) )
+ {
+ LDS_LOG_ERROR("actual_context_param: identifier %s type found not typedef"
+ ,$1->getString().c_str());
+ $$ = AST::TemplateArgument::Create(
+ m_RootTranslationUnit->getASTContext(),
+ td->getTypeForDecl());
+ }
+ } else {
+ LDS_LOG_ERROR("actual_context_param: identifier %s type not found"
+ ,$1->getString().c_str());
+ $$ = NULL;
+ }
+/**
+ | T_CHARSTRING {
+ LDS_LOG_DEBUG("primary: Constant string %s",$<str_expr>1->getString().c_str());
+ AST::Type &Char = m_RootTranslationUnit->getASTContext().CharTy;
+ AST::Type &CharArray = m_RootTranslationUnit->getASTContext().getConstantArrayType(&Char,strlen($<string>1)+1 );
+ $<expr>$ = $<str_expr>1;
+*/
+
+ }
+ | T_NUMBER {
+ /* Should be constant primary */
+ AST::Type &Int = m_RootTranslationUnit->getASTContext().IntegerTy;
+ LDS_LOG_DEBUG("actual_context_param: Number %d",$<num>1);
+ $$ = AST::TemplateArgument::Create(
+ m_RootTranslationUnit->getASTContext(),
+ new AST::IntegerLiteral($<num>1,&Int)
+ );
+}
+;
+
+datatype_heading: T_VALUE T_TYPE T_IDENTIFIER {
+ LDS_LOG_DEBUG("datatype_heading: %s",$3->getString().c_str());
+ AST::ValueTypeDecl *vt = AST::ValueTypeDecl::Create(m_RootTranslationUnit->getASTContext()
+ ,m_CurrentDC,$3->getString());
+ $<decl>$ = vt;
+ AST::Type &t = m_RootTranslationUnit->getASTContext().getValueTypeType(vt);
+ m_CurrentDC->addDecl($<decl>$);
+ m_CurrentDC = dynamic_cast<AST::DeclContext *>($<decl>$);
+ m_StackDC.push(m_CurrentDC);
+ delete $3;
+ ldsp->got_ValueTypeDecl(*vt, lds::parser::eBEGIN);
+ }
+;
+
+datatype_end: T_SIMILICON {
+ /* Result in added in current context */
+ $<decl>$ = NULL;
+ }
+ | T_ENDVALUE T_TYPE T_IDENTIFIER T_SIMILICON {
+ delete($3);
+ $<decl>$ = NULL;
+ }
+ | T_LBRACET dtd_body T_RBRACET T_SIMILICON {
+ LDS_LOG_DEBUG("datatype_end: with complex body structure ");
+ $<decl>$ = $2;
+ }
+;
+
+dtd_body: dtd_body_entities dtd_constructor operation_signatures {
+ /* See Z.101 12.1.1 pg 68*/
+ /* $1 is syntype typedef or value type strut,choice or enum. Can be NULL */
+ /* $2 is struct , choice or literals*/
+ LDS_LOG_ERROR("dtd_body: skip dtd_body_entities for now and op signature");
+ $<decl>$ = $2;
+ }
+ | dtd_body_entities dtd_constructor operation_signatures default_initialization end {
+ /* Result in added in current context */
+ LDS_LOG_ERROR("dtd_body: with defaut initialization");
+ $<decl>$ = $2;
+ }
+;
+
+dtd_body_entities: /*empty */ {
+ $<decl>$ = NULL;
+ }
+ | datatype_definition {
+ LDS_LOG_ERROR("dtd_body_entities: datatype_definition nested datatype");
+ $<decl>$ = NULL;
+ }
+ | syntype_definition {
+ LDS_LOG_ERROR("dtd_body_entities: syntype definition nested ");
+ $<decl>$ = NULL;
+ }
+;
+
+dtd_constructor: dtd_const_struct {
+ /* Z.101 Pg 76 */
+ LDS_LOG_ERROR("dtd_constructor: struct ");
+ }
+ | choice_definition {
+ /* Z.101 Pg 87 */
+ LDS_LOG_INFO("dtd_constructor: choice (union)");
+ }
+ | T_LITERALS {
+ $<decl>$ = AST::EnumDecl::Create(m_RootTranslationUnit->getASTContext(),m_CurrentDC,"unnamed enum");
+ LDS_LOG_DEBUG("dtd_constructor: literals (enum) begin ");
+ m_CurrentDC->addDecl($<decl>$);
+ m_CurrentDC = dynamic_cast<AST::DeclContext *>($<decl>$);
+ m_StackDC.push(m_CurrentDC);
+ } literals_list end {
+ /* Z.101 Pg 75 */
+ m_StackDC.pop();
+ m_CurrentDC = $<decl>2->getDeclContext();
+ LDS_LOG_DEBUG("dtd_constructor: literals (enum) restored ");
+ $<decl>$ = $<decl>2;
+ }
+;
+
+dtd_const_struct : T_STRUCT {
+ /* Create Record DECL before going through the content */
+ LDS_LOG_INFO("dtd_const_struct : struct");
+ AST::RecordDecl *rd = AST::RecordDecl::CreateStruct(m_CurrentDC,"anonymous");
+ $<decl>$ = rd;
+ m_CurrentDC->addDecl($<decl>$);
+ m_CurrentDC = dynamic_cast<AST::DeclContext *>($<decl>$);
+ m_StackDC.push(m_CurrentDC);
+ LDS_LOG_INFO("dtd_const_struct : now fields");
+ ldsp->got_RecordDecl(*rd
+ , lds::parser::eBEGIN);
+ } dtd_struct_fieldlist {
+ LDS_LOG_ERROR("dtd_const_struct: end");
+ AST::RecordDecl *rd = dynamic_cast<AST::RecordDecl *>($<decl>2);
+ /* */
+ m_StackDC.pop();
+ m_CurrentDC = $<decl>2->getDeclContext();
+ ldsp->got_RecordDecl(*rd
+ , lds::parser::END);
+ $<decl>$ = rd;
+ }
+;
+
+dtd_struct_fieldlist: field {
+ AST::FieldDecl *f = static_cast<AST::FieldDecl *>$1;
+ LDS_LOG_INFO("dtd_struct_fieldlist: first %s stack size: " F_SIZE,f->getName().c_str(),m_StackDC.size());
+ m_StackDC.top()->addDecl($1);
+ // Create record Decl that will contain the first Declaration
+ ldsp->got_FieldDecl( dynamic_cast<AST::FieldDecl &>(*f)
+ , lds::parser::eBEGIN);
+ }
+ | dtd_struct_fieldlist field {
+ AST::FieldDecl *f = static_cast<AST::FieldDecl *>$2;
+ LDS_LOG_INFO("dtd_struct_fieldlist: next %s stack size: " F_SIZE,f->getName().c_str(),m_StackDC.size());
+ m_StackDC.top()->addDecl($2);
+ ldsp->got_FieldDecl( dynamic_cast<AST::FieldDecl &>(*f)
+ , lds::parser::eBEGIN);
+ }
+;
+
+field: T_IDENTIFIER sort T_SIMILICON {
+ LDS_LOG_DEBUG("field: %s type %s",$1->getString().c_str(),$2->getTypeClassName());
+ /* Lookup for type $2 if not exists STOP*/
+ /* Create new Decl declaration field */
+ $$ = AST::FieldDecl::Create(m_CurrentDC,$1->getString(),$2);
+ }
+ | T_IDENTIFIER sort T_OPTIONAL T_SIMILICON {
+ LDS_LOG_DEBUG("field: %s type %s optional ",$1->getString().c_str(),$2->getTypeClassName());
+ $$ = AST::FieldDecl::Create(m_CurrentDC,$1->getString(),$2,true);
+ }
+;
+
+literals_list:literal_signature {
+ m_CurrentDC->addDecl($1);
+ }
+ | literals_list T_COMMA literal_signature {
+ m_CurrentDC->addDecl($3);
+ }
+;
+
+literal_signature: T_IDENTIFIER {
+ LDS_LOG_INFO("literal_signature: %s",$1->getString().c_str());
+ //$<decl>$ = AST::EnumDecl::Create(m_RootTranslationUnit->getASTContext(),m_CurrentDC,"unnamed enum");
+ $$ = AST::EnumConstantDecl::Create(m_RootTranslationUnit->getASTContext()
+ ,dynamic_cast<AST::EnumDecl *>(m_CurrentDC),$1->getString(),NULL);
+ }
+ | T_NUMBER {
+ LDS_LOG_INFO("literal_signature: Number %d",$<num>1);
+ AST::IntegerLiteral *el = new AST::IntegerLiteral($<num>1);
+ $$ = AST::EnumConstantDecl::Create(m_RootTranslationUnit->getASTContext()
+ ,dynamic_cast<AST::EnumDecl *>(m_CurrentDC),"ano",NULL);
+ }
+ | T_IDENTIFIER T_EQ T_NUMBER {
+ LDS_LOG_INFO("literal_signature: %s",$1->getString().c_str());
+ $$ = AST::EnumConstantDecl::Create(m_RootTranslationUnit->getASTContext()
+ ,dynamic_cast<AST::EnumDecl *>(m_CurrentDC),$1->getString(),NULL);
+ }
+;
+
+choice_definition: T_CHOICE {
+ AST::RecordDecl *rd = AST::RecordDecl::CreateStruct(m_CurrentDC,"anonymous");
+ $<decl>$ = rd;
+ m_CurrentDC->addDecl($<decl>$);
+ m_CurrentDC = dynamic_cast<AST::DeclContext *>($<decl>$);
+ m_StackDC.push(m_CurrentDC);
+ LDS_LOG_INFO("choice_definition : now fields");
+ ldsp->got_RecordDecl(*rd
+ , lds::parser::eBEGIN);
+ } choice_list {
+ LDS_LOG_ERROR("choice_definition: end");
+ AST::RecordDecl *rd = dynamic_cast<AST::RecordDecl *>($<decl>2);
+ /* */
+ m_StackDC.pop();
+ m_CurrentDC = $<decl>2->getDeclContext();
+ ldsp->got_RecordDecl(*rd
+ , lds::parser::END);
+ $<decl>$ = rd;
+ }
+;
+
+choice_list: choice_of_sort {
+ AST::FieldDecl *f = static_cast<AST::FieldDecl *>$1;
+ LDS_LOG_INFO("choice_list: first %s stack size: " F_SIZE,f->getName().c_str(),m_StackDC.size());
+ m_StackDC.top()->addDecl($1);
+ // Create record Decl that will contain the first Declaration
+ ldsp->got_FieldDecl( dynamic_cast<AST::FieldDecl &>(*f)
+ , lds::parser::eBEGIN);
+ }
+ | choice_list choice_of_sort {
+ AST::FieldDecl *f = static_cast<AST::FieldDecl *>$2;
+ LDS_LOG_INFO("choice_list: next %s stack size: " F_SIZE,f->getName().c_str(),m_StackDC.size());
+ m_StackDC.top()->addDecl($2);
+ ldsp->got_FieldDecl( dynamic_cast<AST::FieldDecl &>(*f)
+ , lds::parser::eBEGIN);
+ }
+;
+
+choice_of_sort: T_IDENTIFIER sort end {
+ /* z.101 Pg 87 should be <aggregation kind> <field name> <field sort> */
+ LDS_LOG_INFO("choice_of_sort : %s type:%s",$1->getString().c_str(),$2->getTypeClassName());
+ /* Create new Decl declaration field */
+ $$ = AST::FieldDecl::Create(m_CurrentDC,$1->getString(),$2);
+ }
+;
+
+operation_signatures: /* Empty*/
+ | T_OPERATORS operation_list {
+ }
+;
+
+operation_list: operation_signature {
+ LDS_LOG_INFO("operation_list: first");
+ }
+ | operation_list operation_signature {
+ }
+;
+
+operation_signature: operation_name op_arguments op_result end {
+ LDS_LOG_INFO("operation_signature: got one add to current context");
+ //m_CurrentDC->addDecl($<decl>$);
+ }
+;
+
+operation_name: T_IDENTIFIER {
+ LDS_LOG_INFO("operation_name: %s",$1->getString().c_str());
+ }
+ | T_CHARSTRING {
+ LDS_LOG_INFO("operation_name: \"%s\"",$<string>1);
+ }
+;
+
+op_arguments: T_LPARENTHESES arguments T_RPARENTHESES {
+ /* see 101 Pg 42 this is a <sort list>*/
+ }
+ | T_LPARENTHESES T_RPARENTHESES {
+ $$ = NULL;
+ }
+;
+
+arguments: formal_parameter {
+ LDS_LOG_INFO("arguments: first ");
+ $$ = new TypeArray();
+ $$->push_back($1);
+ }
+ | arguments T_COMMA formal_parameter {
+ LDS_LOG_INFO("arguments: next ");
+ $$->push_back($3);
+ }
+;
+
+formal_parameter: parameter_kind sort {
+ LDS_LOG_INFO("formal_parameter: %s should be an existing type ",$2->getTypeClassName());
+ $$ = $2;
+ }
+;
+
+parameter_kind: /* Empty */
+ |T_IN {
+ }
+ | T_OUT {
+ }
+ | T_IN T_OUT {
+ }
+ | T_OUT T_IN {
+ }
+;
+
+op_result: T_RESULT sort {
+ LDS_LOG_INFO("op_result: sort %s ",$2->getTypeClassName() );
+ }
+;
+opt_task_definition: /**/
+ | task_definitions {
+ }
+;
+
+task_definitions: task {
+ LDS_LOG_DEBUG("task_definitions: begin Stack size: " F_SIZE,m_StackDC.size());
+ if (m_CurrentDC != m_CurrentAut) {
+ LDS_LOG_ERROR("task_definitions: m_CurrentDC != m_Auth");
+ }
+ if ($<decl>1 != NULL)
+ m_CurrentDC->addDecl($<decl>1);
+ }
+ | task_definitions task {
+ if (m_CurrentDC != m_CurrentAut) {
+ LDS_LOG_ERROR("task_definitions: m_CurrentDC != m_Auth");
+ }
+ LDS_LOG_DEBUG("task_definitions: task ... ");
+ if ($<decl>1 != NULL)
+ {
+ m_CurrentDC->addDecl($<decl>2);
+ } else {
+ LDS_LOG_DEBUG("task_definitions: task NULL");
+ }
+ }
+;
+
+task: task_begin T_IS T_BEGIN task_body T_END T_TASK T_IDENTIFIER
+ T_SIMILICON {
+ LDS_LOG_DEBUG("task: got task with body : stack size " F_SIZE,m_StackDC.size());
+ AST::FunctionDecl *fct = dynamic_cast<AST::FunctionDecl *>($1);
+
+ // task_body is a
+ // $$ = new AST::FunctionDecl($<stmt>6);
+ ($<decl>1)->setBody($<stmt>4);
+ m_CurrentDC = dynamic_cast<AST::DeclContext
+ *>($<decl>1->getDeclContext());
+ m_StackDC.pop();
+ if ($4 != NULL)
+ dynamic_cast<AST::CompoundStmt *>($4)->addStmt(new AST::ReturnStmt(NULL,true) );
+ delete ($7);
+ ldsp->got_FunctionDecl(dynamic_cast<AST::FunctionDecl &>(*fct));
+ }
+ | task_begin T_IS T_BEGIN T_END T_TASK T_IDENTIFIER T_SIMILICON
+ {
+ LDS_LOG_DEBUG("task: empty stack size: " F_SIZE,m_StackDC.size());
+ AST::FunctionDecl *fct = dynamic_cast<AST::FunctionDecl *>($1);
+ m_CurrentDC = dynamic_cast<AST::DeclContext
+ *>($<decl>1->getDeclContext());
+ m_StackDC.pop();
+ $1->setBody(new AST::ReturnStmt(NULL,true));
+ delete ($6);
+ ldsp->got_FunctionDecl(dynamic_cast<AST::FunctionDecl &>(*fct));
+ }
+;
+
+task_begin: T_TASK T_IDENTIFIER {
+ LDS_LOG_DEBUG("task_begin: stack size: " F_SIZE, m_StackDC.size());
+ if (m_CurrentDC != m_CurrentAut) {
+ LDS_LOG_ERROR("task_begin: stack size: " F_SIZE " m_CurrentDC != m_Auth",m_StackDC.size());
+ }
+ $<decl>$ = AST::FunctionDecl::Create(m_CurrentDC,$2->getString(),NULL);
+ m_CurrentDC = dynamic_cast<AST::DeclContext *>($<decl>$);
+ m_StackDC.push(m_CurrentDC);
+ delete ($2);
+ ldsp->got_FunctionDecl(dynamic_cast<AST::FunctionDecl &>(*m_CurrentDC),lds::parser::eBEGIN);
+ }
+;
+
+task_body: actions {
+ LDS_LOG_DEBUG("task_body: actions");
+ $<stmt>$ = new AST::CompoundStmt();
+ if ($<stmt>1 != NULL)
+ dynamic_cast<AST::CompoundStmt *>($<stmt>$)->addStmt($<stmt>1 );
+ }
+ | task_body actions {
+ LDS_LOG_DEBUG("task_body: task_body actions");
+ if ($<stmt>1 != NULL && $<stmt>2 != NULL)
+ dynamic_cast<AST::CompoundStmt *>($<stmt>1)->addStmt($<stmt>2 );
+ }
+;
+
+actions: action_assignment T_SIMILICON {
+ LDS_LOG_DEBUG("actions: action_assignment");
+ $<stmt>$ = $1;
+ }
+ | action_decision {
+ LDS_LOG_DEBUG("actions: decision");
+ $<stmt>$ = $<stmt>1;
+ }
+ | T_GOTO T_IDENTIFIER T_SIMILICON {
+ LDS_LOG_DEBUG("actions: GOTO");
+ $<stmt>$ = new AST::GotoStmt( AST::LabelDecl::Create(m_CurrentDC,$2->getString()));
+ delete ($2);
+ }
+ | T_RESET T_IDENTIFIER T_SIMILICON {
+ LDS_LOG_DEBUG("actions: RESET");
+ /* Check if IDENTIFIER is a Timer or a flag */
+ AST::DeclContext::lookup_result r = m_CurrentDC->lookup($2->getString());
+ AST::LdsAsmStmt *st = new AST::LdsAsmStmt(m_CurrentDC,"AEL_RESET");
+ if ( r.size() == 0 )
+ {
+ LDS_LOG_ERROR("actions: RESET undeclared variable %s",$2->getString().c_str());
+ st->setLiteral($2);
+ } else if (AST::VarDecl *var = dynamic_cast<AST::VarDecl *>(r[0]))
+ {
+ LDS_LOG_WARN("actions: RESET variable TODO %s deprecated use assignemnt",var->getName().c_str());
+ st->setLiteral($2);
+ } else if (AST::TimerDecl *var = dynamic_cast<AST::TimerDecl *>(r[0]))
+ {
+ LDS_LOG_WARN("actions: RESET Timer TODO %s",var->getName().c_str());
+ AST::DeclRefExpr *dref = new AST::DeclRefExpr(dynamic_cast<AST::ValueDecl *>(var)) ;
+ st->setLiteral(dref);
+ }
+ $<stmt>$ = st ;
+ }
+ | T_RESET T_LPARENTHESES T_IDENTIFIER T_RPARENTHESES T_SIMILICON {
+ LDS_LOG_DEBUG("actions: RESET timer (%s)",$3->getString().c_str());
+ AST::DeclContext::lookup_result r = m_CurrentDC->lookup($3->getString());
+ AST::LdsAsmStmt *st = new AST::LdsAsmStmt(m_CurrentDC,"AEL_RESET");
+ if ( r.size() == 0 )
+ {
+ LDS_LOG_ERROR("actions: RESET undeclared timer %s",$3->getString().c_str());
+ } else if (AST::TimerDecl *var = dynamic_cast<AST::TimerDecl *>(r[0]))
+ {
+ LDS_LOG_WARN("actions: RESET Timer %s",var->getName().c_str());
+ AST::DeclRefExpr *dref = new AST::DeclRefExpr(dynamic_cast<AST::ValueDecl *>(var)) ;
+ st->setLiteral(dref);
+ }
+ $<stmt>$ = st ;
+
+ }
+ | T_SET T_IDENTIFIER T_SIMILICON {
+ LDS_LOG_WARN("actions: SET variable deprecated");
+ /* Check if IDENTIFIER is a flag */
+ AST::LdsAsmStmt *st = new AST::LdsAsmStmt(m_CurrentDC,"AEL_SET");
+ $<stmt>$ = st ;
+ st->setLiteral($2);
+ }
+ | T_SET T_LPARENTHESES expression T_COMMA T_IDENTIFIER T_RPARENTHESES T_SIMILICON {
+ LDS_LOG_DEBUG("actions: SET timer (%s)",$5->getString().c_str());
+ /* Check if IDENTIFIER is a Timer */
+ AST::DeclContext::lookup_result r = m_CurrentDC->lookup($5->getString());
+ AST::LdsAsmStmt *st = new AST::LdsAsmStmt(m_CurrentDC,"AEL_SET");
+ if ( r.size() == 0 )
+ {
+ LDS_LOG_ERROR("actions: SET undeclared timer %s",$5->getString().c_str());
+ st->setLiteral($5);
+ } else if (AST::TimerDecl *var = dynamic_cast<AST::TimerDecl *>(r[0]))
+ {
+ LDS_LOG_WARN("actions: SET Timer %s",var->getName().c_str());
+ AST::DeclRefExpr *dref = new AST::DeclRefExpr(dynamic_cast<AST::ValueDecl *>(var)) ;
+ st->setLiteral(dref);
+ st->setExpr($3);
+ } else
+ {
+ LDS_LOG_ERROR("actions: SET timer: %s not a timer Should STOP",$5->getString().c_str());
+ }
+ $<stmt>$ = st ;
+ }
+ | T_LDSASM T_SIMILICON {
+ LDS_LOG_DEBUG("actions: ASM %s",$1->getString().c_str());
+ AST::LdsAsmStmt *st = new AST::LdsAsmStmt(m_CurrentDC,$1->getString());
+ delete $1;
+ $<stmt>$ = st ;
+ }
+ | T_LDSASM T_LPARENTHESES T_IDENTIFIER T_RPARENTHESES T_SIMILICON {
+ LDS_LOG_DEBUG("actions: ASM %s",$1->getString().c_str());
+ AST::LdsAsmStmt *st = new AST::LdsAsmStmt(m_CurrentDC,$1->getString());
+ st->setLiteral($3);
+ delete $1;
+ $<stmt>$ = st ;
+ }
+ | action_switch {
+ LDS_LOG_DEBUG("actions: SWITCH");
+ AST::SwitchStmt *st = dynamic_cast<AST::SwitchStmt *>($1);
+ $<stmt>$ = st;
+ ldsp->got_SwitchStmt(*st);
+ }
+ | action_loop {
+ LDS_LOG_DEBUG("actions: While LOOP");
+ $<stmt>$ = $1;
+ }
+ | action_call {
+ LDS_LOG_DEBUG("actions: action_call");
+ $<stmt>$ = $1;
+ }
+ | T_BEGIN task_body T_END T_SIMILICON {
+ LDS_LOG_DEBUG("actions: BLOCK begin end");
+ $<stmt>$ = $2;
+ }
+ | T_BEGIN T_END T_SIMILICON {
+ LDS_LOG_DEBUG("actions: BLOCK begin empty end");
+ $<stmt>$ = NULL;
+ }
+ | T_OUTPUT output_action T_SIMILICON {
+ $<stmt>$ = $2;
+ }
+;
+
+communication_constraint: T_TO expression {
+ /* expression is pid expresssion0 or agent Identifier or THIS */
+ LDS_LOG_INFO("communication_constraint: to expression 0 TODO");
+ $$ = $2 ;
+ }
+ | T_TO T_THIS {
+ /* THIS is already parsed in imperative expression. Might to be required here */
+ LDS_LOG_INFO("communication_constraint: to this");
+ $<expr>$ = new AST::LdsThisExpr(&m_RootTranslationUnit->getASTContext().VoidTy);
+ }
+ | T_VIA T_IDENTIFIER {
+ LDS_LOG_INFO("communication_constraint: via TODO");
+ /* via path. Identifier is a gate not a channel */
+ }
+;
+
+opt_communication_constraint: /* Empty */ {
+ $$ = NULL;
+ }
+ | communication_constraint {
+ $$ = $1;
+ }
+;
+
+output_action: T_IDENTIFIER opt_actual_parameters opt_communication_constraint {
+ if ( ($2 == NULL) && ($<expr>3 == NULL))
+ {
+ LDS_LOG_INFO("output_action: output ... NOT taken into account ....");
+ $<stmt>$ = NULL;
+ delete ($1);
+ } else
+ {
+ AST::ParenListExpr *args = dynamic_cast<AST::ParenListExpr *>($2);
+ /*
+ AST::FunctionDecl *fct = dynamic_cast<AST::FunctionDecl *>($1);
+ LDS_LOG_DEBUG("action_call: simple function call %s with params %d",fct->getName().c_str(),fct->param_size());
+ AST::DeclRefExpr *dref = new AST::DeclRefExpr(dynamic_cast<AST::ValueDecl *>($1)) ;
+ AST::CallExpr *act = new AST::CallExpr(m_CurrentDC,dref,std::vector<AST::Expr *>(&args->getExprs()[0],&args->getExprs()[args->getNumExprs()]));
+ $<stmt>$ = act;
+ */
+ LDS_LOG_INFO("output_action: output %s taken into account .... MISSING HANDLING PARAMETERS",$1->getString().c_str());
+ AST::DeclContext::lookup_result r = m_CurrentAut->lookup($1->getString());
+ if ( r.size() == 0 )
+ {
+ LDS_LOG_ERROR("output_action: %s event not found",$1->getString().c_str());
+ } else if (AST::EventDecl *v = dynamic_cast<AST::EventDecl *>(r[0]))
+ {
+ AST::DeclRefExpr *dref = new AST::DeclRefExpr(v) ;
+ AST::OutputStmt *o = new AST::OutputStmt(m_CurrentDC,$1->getString(),dref,$3);
+ $$ = o;
+ /** Add parameters as well */
+ if (args != NULL)
+ {
+ std::vector<AST::Expr *> vargs(&args->getExprs()[0],&args->getExprs()[args->getNumExprs()]);
+ o->setArgs(vargs);
+ }
+
+ ldsp->got_OutputStmt(*o);
+ } else {
+ LDS_LOG_ERROR("output_action1: %s event not found",$1->getString().c_str());
+ $$ = NULL;
+ }
+ }
+ }
+;
+
+action_call: action_name T_SIMILICON {
+ // Check if it already exists in automaton context (no body)
+ AST::CallExpr *act = NULL;
+ if (AST::FunctionDecl *fct = dynamic_cast<AST::FunctionDecl *>($1) )
+ {
+ // Create DeclRefExpr
+ AST::DeclRefExpr *dref = new AST::DeclRefExpr(dynamic_cast<AST::ValueDecl *>($1)) ;
+ LDS_LOG_DEBUG("action_call: simple function call %s",fct->getName().c_str());
+ // Create CallExpr
+ act = new AST::CallExpr(m_CurrentDC,dref);
+ $<stmt>$ = act;
+ ldsp->got_CallExpr(*act);
+ } else if (AST::NamedDecl *fct = dynamic_cast<AST::NamedDecl *>($1) ) {
+ LDS_LOG_DEBUG("action_call: Lds Assembler Call %s",fct->getName().c_str());
+ AST::LdsAsmStmt *st = new AST::LdsAsmStmt(m_CurrentDC,fct->getName());
+ $<stmt>$ = st ;
+ }
+ m_StackDC.pop();
+ }
+ | action_name actual_parameters T_SIMILICON {
+ AST::ParenListExpr *args = dynamic_cast<AST::ParenListExpr *>($2);
+ AST::FunctionDecl *fct = dynamic_cast<AST::FunctionDecl *>($1);
+ AST::CallExpr *act = NULL;
+ if (fct->isNew())
+ {
+ LDS_LOG_DEBUG("action_call: call function complete simple function call %s with params %d",fct->getName().c_str(),fct->param_size());
+ ldsp->function_complete(m_CurrentDC,m_RootTranslationUnit,fct,args);
+ }
+ LDS_LOG_DEBUG("action_call: simple function call %s with params %d",fct->getName().c_str(),fct->param_size());
+ AST::DeclRefExpr *dref = new AST::DeclRefExpr(dynamic_cast<AST::ValueDecl *>($1)) ;
+ if (args == NULL) {
+ LDS_LOG_ERROR("action_call: %s EERROR args is NULL",fct->getName().c_str());
+ act= new AST::CallExpr(m_CurrentDC,dref);
+ } else {
+ act = new AST::CallExpr( m_CurrentDC
+ , dref
+ , std::vector<AST::Expr *>(&args->getExprs()[0]
+ , &args->getExprs()[args->getNumExprs()])
+ );
+ }
+ $<stmt>$ = act;
+
+ m_StackDC.pop();
+ ldsp->got_CallExpr(*act);
+ }
+ | T_EXECUTE action_name T_SIMILICON {
+ AST::FunctionDecl *fct = dynamic_cast<AST::FunctionDecl *>($2);
+ AST::DeclRefExpr *dref = new AST::DeclRefExpr(dynamic_cast<AST::ValueDecl *>($2)) ;
+ LDS_LOG_DEBUG("action_call: execute call %s without params ",fct->getName().c_str());
+ AST::CallExpr *act= new AST::CallExpr(m_CurrentDC,dref);
+ $<stmt>$ = act;
+ m_StackDC.pop();
+ ldsp->got_CallExpr(*act);
+ }
+ | T_EXECUTE action_name actual_parameters T_SIMILICON {
+ AST::FunctionDecl *fct = dynamic_cast<AST::FunctionDecl *>($2);
+ AST::ParenListExpr *args = dynamic_cast<AST::ParenListExpr *>($3);
+ AST::DeclRefExpr *dref = new AST::DeclRefExpr(dynamic_cast<AST::ValueDecl *>($2)) ;
+ LDS_LOG_DEBUG("action_call: execute call %s with params ",fct->getName().c_str());
+ // Copy/Past, find another way
+ if (fct->isNew())
+ {
+ LDS_LOG_ERROR("action_call: ERROR execute call %s with params NOT YET SUPPORTED",fct->getName().c_str());
+ AST::StmtRange range = args->children();
+ for ( ; ! range.empty(); ++range)
+ {
+ AST::StringLiteral *it = dynamic_cast<AST::StringLiteral *>(*range);
+ if (it != NULL)
+ {
+ AST::DeclContext::lookup_result r = m_CurrentAut->lookup(it->getString());
+ if ( r.size() == 0 )
+ {
+ LDS_LOG_ERROR("action_call: execute call %s undeclared parameter %s",fct->getName().c_str(),it->getString().c_str());
+ }
+ AST::ParmVarDecl *var = AST::ParmVarDecl::Create(m_CurrentDC,it->getString(),NULL);
+ fct->add_param(var);
+ }
+ }
+ }
+ AST::CallExpr *act= new AST::CallExpr(m_CurrentDC,dref);
+ $<stmt>$ = act;
+ m_StackDC.pop();
+ ldsp->got_CallExpr(*act);
+ }
+;
+
+action_name: T_IDENTIFIER {
+ LDS_LOG_DEBUG("action_name: identifier %s",$1->getString().c_str());
+
+ AST::DeclContext::lookup_result r = m_CurrentAgent->lookup($1->getString());
+ if ( r.size() > 0)
+ {
+ LDS_LOG_DEBUG("action_name: identifier %s found " F_SIZE,$1->getString().c_str(),r.size());
+ $$ = r[0];
+ } else
+ {
+ AST::FunctionDecl *fdecl = AST::FunctionDecl::Create(m_CurrentDC,$1->getString(),NULL);
+ $$ = fdecl ;
+ m_CurrentAut->addDecl(fdecl);
+ }
+ m_StackDC.push(dynamic_cast<AST::DeclContext *>($$));
+ delete ($1);
+};
+
+action_switch: T_CASE switch_cond switch_cases T_END T_CASE T_SIMILICON {
+ LDS_LOG_DEBUG("action_switch: T_CASE IDENTIFIER");
+ //$$ = new AST::SwitchStmt();
+ $$ = m_StackStmts.top();
+ m_StackStmts.pop();
+}
+;
+
+switch_cond: T_IDENTIFIER {
+ // switch condition should be an expresion but the lds semantic does is
+ // not addapted .... For now, it's just an identifier
+ m_StackStmts.push(new AST::SwitchStmt($1));
+ }
+;
+switch_cases: case_ {
+ AST::SwitchStmt *s = dynamic_cast<AST::SwitchStmt *>(m_StackStmts.top());
+ if ($1 != NULL && s) {
+ s->addCaseStmt($1);
+ }
+ }
+ | switch_cases case_ {
+ AST::SwitchStmt *s = dynamic_cast<AST::SwitchStmt *>(m_StackStmts.top());
+ if ($2 != NULL && s) {
+ s->addCaseStmt($2);
+ } else {
+ LDS_LOG_ERROR("switch_case: empty case !!!" );
+ }
+ }
+;
+
+case_: T_DO task_body {
+ LDS_LOG_DEBUG("case: task_body");
+ $<stmt>$ = new AST::SwitchCaseStmt(NULL,$2);
+ if ($2 != NULL && $2->getStmtClass() == AST::Stmt::CompoundStmtClass) {
+ dynamic_cast<AST::CompoundStmt *>($2)->addStmt(new AST::BreakStmt(m_CurrentDC,NULL) );
+ // LDS_LOG_INFO("transition_body: added_return Should be done by the compiler");
+ } else {
+ LDS_LOG_ERROR("case_: task_body of wrong type %d", $2->getStmtClass());
+ }
+ }
+ | T_DO {
+ LDS_LOG_DEBUG("case: empty");
+ $$ = NULL;
+ }
+;
+
+action_decision: T_IF expression T_THEN decision_task_body T_END T_IF T_SIMILICON {
+ LDS_LOG_DEBUG("action_decision:");
+ $<stmt>$ = new AST::IfStmt(m_CurrentDC,$2,$4,NULL);
+ }
+ | T_IF expression T_THEN decision_task_body T_ELSE decision_task_body T_END T_IF T_SIMILICON
+ {
+ LDS_LOG_DEBUG("action_decision: 1");
+ $<stmt>$ = new AST::IfStmt(m_CurrentDC,$2,$4,$6);
+ }
+ | T_IF expression T_THEN task_body alternative_decisions T_END T_IF T_SIMILICON
+ {
+ LDS_LOG_DEBUG("action_decision: 2");
+ $<stmt>$ = new AST::IfStmt(m_CurrentDC,$2,$4,$5);
+ }
+ | T_IF expression T_THEN task_body alternative_decisions T_ELSE decision_task_body T_END T_IF T_SIMILICON
+ {
+ AST::IfStmt *s = dynamic_cast<AST::IfStmt *>($5);
+ if (s)
+ s->setElse($7);
+ LDS_LOG_DEBUG("action_decision: 3");
+ $<stmt>$ = new AST::IfStmt(m_CurrentDC,$2,$4,
+ $5
+ );
+ }
+;
+
+decision_task_body: /* Can be empty */ {
+ LDS_LOG_DEBUG("decision_task_body: empty");
+ $$ = NULL;
+ }
+ | task_body {
+ LDS_LOG_DEBUG("decision_task_body: task_body");
+ }
+;
+
+alternative_decisions: alternative {
+ LDS_LOG_DEBUG("alternative_decisions: alternative");
+ }
+ | alternative_decisions alternative {
+ LDS_LOG_DEBUG("alternative_decisions: 1 alternative");
+
+ }
+;
+
+alternative: T_ELSIF expression T_THEN decision_task_body {
+ LDS_LOG_DEBUG("alternative: T_ELSIF");
+ $<stmt>$ = new AST::IfStmt(m_CurrentDC,$2,$4,NULL);
+ }
+;
+
+opt_actual_parameters: /* Empty */ {
+ $$ = NULL;
+ }
+ | actual_parameters {
+ $$ = $1;
+ }
+;
+
+actual_parameters: T_LPARENTHESES actual_parameter_list T_RPARENTHESES {
+ LDS_LOG_DEBUG("actual_parameters: done");
+ $$ = $2;
+ }
+ | T_LPARENTHESES T_RPARENTHESES {
+ /* no parameters */
+ $$ = NULL;
+ }
+;
+
+actual_parameter_list: primary {
+ LDS_LOG_DEBUG("actual_parameter_list: parameter");
+ AST::ParenListExpr *l = new AST::ParenListExpr();
+ l->addExpr($1);
+ $$ = l;
+ }
+ | actual_parameter_list T_COMMA primary {
+ LDS_LOG_DEBUG("actual_parameter_list: actual_parameter_list , parameter");
+ if ($1 != NULL && $3 != NULL)
+ dynamic_cast<AST::ParenListExpr *>($1)->addExpr($3);
+ }
+
+;
+
+action_assignment: variable T_ASSIGN expression {
+ LDS_LOG_DEBUG("action_assignment : T_IDENTIFIER := expression");
+ /* Should be a CompoundAssignment Expression */
+ $<stmt>$ = new AST::BinaryOperator($<expr>1,$3,AST::BO_Assign);
+ }
+;
+action_loop: T_WHILE expression T_LOOP decision_task_body T_END T_LOOP
+ T_SIMILICON {
+ LDS_LOG_DEBUG("action_loop: while loop");
+ $<stmt>$ = new AST::WhileStmt(m_CurrentDC,$2,$4);
+ }
+ | T_LOOP loop_body T_END T_LOOP T_SIMILICON {
+ LDS_LOG_DEBUG("action_loop: loop");
+ AST::Expr *e = new AST::IntegerLiteral(1);
+ $<stmt>$ = new AST::WhileStmt(m_CurrentDC,e,$2);
+ }
+;
+
+loop_body: actions {
+ LDS_LOG_DEBUG("loop_body: actions ");
+ $<stmt>$ = new AST::CompoundStmt();
+ if ($<stmt>1 != NULL)
+ dynamic_cast<AST::CompoundStmt *>($<stmt>$)->addStmt($<stmt>1 );
+ }
+ | T_EXIT T_WHEN expression T_SIMILICON {
+ LDS_LOG_DEBUG("loop_body: exit when");
+ $<stmt>$ = new AST::BreakStmt(m_CurrentDC,$3);
+ }
+ | loop_body T_EXIT T_WHEN expression T_SIMILICON {
+ LDS_LOG_DEBUG("loop_body: loop_body exit when");
+ AST::BreakStmt *brk = new AST::BreakStmt(m_CurrentDC,$4);
+ }
+ | loop_body actions {
+ LDS_LOG_DEBUG("loop_body: loop_body actions");
+ dynamic_cast<AST::CompoundStmt *>($<stmt>$)->addStmt($<stmt>1 );
+ }
+;
+
+state_definitions: state {
+ LDS_LOG_DEBUG("state_definitions: got state stack size: " F_SIZE,m_StackDC.size());
+ if ($<decl>1 != NULL) {
+ m_CurrentDC->addDecl($<decl>1);
+ m_StackDC.pop();
+ }
+ }
+ | state_definitions state {
+ LDS_LOG_DEBUG("state_definitions: state_definitions state stack size: " F_SIZE,m_StackDC.size());
+ if ($<decl>2 != NULL) {
+ // m_StackDC.top()->addDecl($<decl>2);
+ m_CurrentDC->addDecl($<decl>2);
+ m_StackDC.pop();
+ }
+ }
+;
+
+state: /* No State*/ {
+ LDS_LOG_DEBUG("state: empty state");
+ $<decl>$ = NULL;
+ }
+ | state_begin T_ACCEPT state_body T_END T_STATE T_IDENTIFIER T_SIMILICON {
+ LDS_LOG_DEBUG("state: got state %s end ",$6->getString().c_str());
+ AST::StateDecl *st = dynamic_cast<AST::StateDecl *>($1);
+ $<decl>1->setBody($<stmt>3);
+ m_CurrentDC = $<decl>1->getDeclContext();
+ delete($6);
+ ldsp->got_StateDecl( dynamic_cast<AST::StateDecl &>(*st)
+ , lds::parser::END);
+ }
+;
+
+state_begin: T_STATE state_name {
+ AST::LabelDecl *l = static_cast<AST::LabelDecl *>$2;
+ LDS_LOG_DEBUG("state: start %s stack size " F_SIZE,l->getName().c_str(),m_StackDC.size());
+ m_StackDC.top()->addDecl($2);
+ $<decl>$ = AST::StateDecl::Create(m_CurrentDC,l->getName());
+ m_CurrentDC = dynamic_cast<AST::DeclContext *>($<decl>$);
+ m_StackDC.push(m_CurrentDC);
+ ldsp->got_StateDecl( dynamic_cast<AST::StateDecl &>(*m_CurrentDC)
+ , lds::parser::eBEGIN);
+ }
+;
+
+state_name: T_IDENTIFIER {
+ $$ = AST::LabelDecl::Create(m_CurrentDC,$1->getString());
+ delete($1);
+ }
+;
+
+target_state_name: state_name
+ | T_SAME {
+ AST::TransitionDecl *_t = dynamic_cast<AST::TransitionDecl *>(m_StackDC.top());
+ if (_t )
+ {
+ AST::StateDecl *_st = _t->getState();
+ LDS_LOG_DEBUG("target_state_name: same = %s",_st->getName().c_str());
+ $$ = AST::LabelDecl::Create(m_CurrentDC,_st->getName().c_str());
+ } else {
+ LDS_LOG_ERROR("target_state_name: should not happen same state not found ????");
+ $$ = AST::LabelDecl::Create(m_CurrentDC,"same");
+ }
+ }
+;
+
+state_body: /* Body can be empty*/ {
+ LDS_LOG_DEBUG("state_body: empty ");
+ $<decl>$ = NULL;
+ }
+ | transition {
+ LDS_LOG_DEBUG("state_body: transition stack size " F_SIZE,m_StackDC.size());
+ if ($<decl>1 != NULL)
+ m_StackDC.top()->addDecl($<decl>1);
+ }
+ | state_body transition {
+ LDS_LOG_DEBUG("state_body: stat_body transition stack size " F_SIZE,m_StackDC.size());
+ if ($<decl>2 != NULL)
+ m_StackDC.top()->addDecl($<decl>2);
+ }
+;
+
+transition: transition_head T_BEGIN transition_body T_END T_IDENTIFIER T_SIMILICON {
+ LDS_LOG_DEBUG("transition: end with id stack size " F_SIZE,m_StackDC.size() );
+ AST::TransitionDecl *tr = dynamic_cast<AST::TransitionDecl *>($<decl>1);
+ m_CurrentDC = dynamic_cast<AST::DeclContext *>($<decl>1->getDeclContext());
+ if ($<stmt>3 != NULL)
+ $<decl>1->setBody($<stmt>3);
+ m_StackDC.pop();
+ delete ($5);
+ ldsp->got_TransitionDecl( dynamic_cast<AST::TransitionDecl &>(*tr)
+ , lds::parser::END);
+ }
+ | transition_head T_BEGIN transition_body T_END T_SIMILICON {
+ LDS_LOG_DEBUG("transition: end without id stack size " F_SIZE,m_StackDC.size());
+ AST::TransitionDecl *tr = dynamic_cast<AST::TransitionDecl *>($<decl>1);
+ m_CurrentDC = dynamic_cast<AST::DeclContext *>($<decl>1->getDeclContext());
+ if ($<stmt>3 != NULL)
+ $<decl>1->setBody($<stmt>3);
+ m_StackDC.pop();
+ ldsp->got_TransitionDecl( dynamic_cast<AST::TransitionDecl &>(*tr)
+ , lds::parser::END);
+ }
+;
+
+transition_head: T_WHEN events T_IMPLIES target_state_name {
+ AST::LabelDecl *l = static_cast<AST::LabelDecl *>$4;
+ AST::TransitionDecl *tr = dynamic_cast<AST::TransitionDecl *>($<decl>2);
+ // There is an error after IMPLIES, it's state_name
+
+ LDS_LOG_DEBUG("transition_head: count=%d",transition_count);
+ // Should be changed to something like
+ //$<decl>$ = AST::FunctionDecl::Create(m_CurrentDC,tn);
+ //m_CurrentDC = dynamic_cast<AST::DeclContext *>($<decl>$);
+ //m_StackDC.push(m_CurrentDC);
+ if ( AST::TransitionDecl *tra = dynamic_cast<AST::TransitionDecl *>($<decl>2) ) {
+ LDS_LOG_ERROR("transition_head: TransitionDecl target :%s ",l->getName().c_str());
+ tra->setTargetState(l->getName());
+ } else {
+ LDS_LOG_ERROR("transition_head: events not of type TransitionDecl");
+ }
+ if ($4)
+ delete ($4);
+ $$ = $2;
+ ldsp->got_TransitionDecl( dynamic_cast<AST::TransitionDecl &>(*tr)
+ , lds::parser::eBEGIN);
+ }
+;
+
+transition_body: /* Empty*/ {
+ $$ = new AST::ReturnStmt(NULL);
+ LDS_LOG_DEBUG("transition_body: NULL");
+
+ }
+ | task_body {
+ $<stmt>$ = $1;
+ if ($1 != NULL && $1->getStmtClass() == AST::Stmt::CompoundStmtClass) {
+ dynamic_cast<AST::CompoundStmt *>($1)->addStmt(new AST::ReturnStmt(NULL) );
+ // LDS_LOG_INFO("transition_body: added_return Should be done by the compiler");
+ } else {
+ LDS_LOG_ERROR("transition_body: task_body of wrong type %d", $1->getStmtClass());
+ }
+ }
+;
+
+
+events: event {
+ std::string tn("SEM_");
+ char buf[24];
+ sprintf(buf,"_%d",transition_count++);
+ tn = tn + automaton_name + buf;
+ LDS_LOG_DEBUG("events: first event new transition : %s",tn.c_str());
+ AST::RefStateDecl *_RefState = new AST::RefStateDecl(dynamic_cast<AST::StateDecl *>(m_StackDC.top()));
+ std::transform(tn.begin(),tn.end(),tn.begin(),::toupper);
+
+ $<decl>$ = AST::TransitionDecl::Create(m_CurrentDC,tn,_RefState);
+ m_CurrentDC = dynamic_cast<AST::DeclContext *>($<decl>$);
+ m_StackDC.push(m_CurrentDC);
+ if ($1 != NULL)
+ {
+ AST::EventDecl *evtr = dynamic_cast<AST::EventDecl *>($1) ;
+ if (evtr == NULL)
+ {
+ LDS_LOG_ERROR("events: evtr is NULL : %s",tn.c_str());
+ }
+ // Create DeclRefExpr
+ AST::EventDecl *evt = AST::EventDecl::Create(m_CurrentDC,evtr->getName(),NULL) ;
+ // Event is added to the transition
+ if (evtr->param_size() > 0)
+ evt->set_parameters(evtr->parameters());
+ m_StackDC.top()->addDecl(evt);
+ //delete ($1);
+ } else {
+ LDS_LOG_ERROR("events: event should never be NULL !!!!!");
+ }
+ LDS_LOG_ERROR("events: end first event new transition : %s",tn.c_str());
+ }
+ | events T_COMMA event {
+ if ($3 != NULL)
+ {
+ AST::EventDecl *evtr = dynamic_cast<AST::EventDecl *>($3) ;
+ LDS_LOG_DEBUG("events: other events %s",evtr->getName().c_str());
+ } else {
+ LDS_LOG_ERROR("events: other events same not good");
+ }
+ if ($3 != NULL) {
+ AST::EventDecl *evtr = dynamic_cast<AST::EventDecl *>($3) ;
+#if 0
+ AST::DeclContext::lookup_result r = m_StackDC.top()->lookup($3->getString());
+ if (r.size() > 0) {
+ LDS_LOG_DEBUG("events: other events already in the list");
+ } else
+#endif
+ // We should add the Events to the Tansition....
+ // Create DeclRefExpr
+ AST::EventDecl *evt = AST::EventDecl::Create(m_CurrentDC,evtr->getName(),NULL) ;
+ m_StackDC.top()->addDecl(evt);
+ }
+ }
+;
+
+event: T_IDENTIFIER opt_actual_parameters {
+ LDS_LOG_DEBUG("event: identifier %s",$1->getString().c_str());
+ AST::DeclContext::lookup_result r = m_CurrentAut->lookup($1->getString());
+ AST::EventDecl *evt = NULL;
+ AST::EventDecl *evtd = NULL;
+ if ( r.size() > 0 && (evt = dynamic_cast<AST::EventDecl *>(r[0])) )
+ {
+ // ALright, nothing to be done, set $$ = evt
+ LDS_LOG_INFO("event: already defined %s",$1->getString().c_str());
+ evtd = evt;
+ evt = AST::EventDecl::Create(m_CurrentDC,$1->getString(),NULL);
+ } else {
+ evt = AST::EventDecl::Create(m_CurrentDC,$1->getString(),NULL);
+ LDS_LOG_INFO("event: should not happen. Event should already be declared %s",$1->getString().c_str());
+ /* This is bizard, Why adding the Event in automaton ?*/
+ m_CurrentAut->addDecl(evt);
+
+ }
+ if ($2 != NULL)
+ {
+ AST::ParenListExpr *args = dynamic_cast<AST::ParenListExpr *>($2);
+ AST::StmtRange range = args->children();
+ for (int i = 0 ; ! range.empty();i++, ++range)
+ {
+ AST::StringLiteral *it = dynamic_cast<AST::StringLiteral *>(*range);
+ if (it != NULL)
+ {
+ AST::DeclContext::lookup_result r = m_CurrentAut->lookup(it->getString());
+ if ( r.size() == 0 )
+ {
+ LDS_LOG_WARN("event: %s undeclared parameter %s normal if transition"
+ , evt->getName().c_str()
+ , it->getString().c_str());
+ }
+ AST::ParmVarDecl *vd = NULL;
+ AST::ParmVarDecl *var = AST::ParmVarDecl::Create(m_CurrentDC,it->getString(),NULL);
+ if (evtd && ( vd = evtd->get_Parameter(i)) != NULL)
+ {
+ LDS_LOG_DEBUG("event: Parameter %s Exits Has Type=%d",it->getString().c_str(),(vd->getType() != NULL));
+ var = AST::ParmVarDecl::Create(m_CurrentDC,it->getString(),vd->getType());
+ } else
+ {
+ var = AST::ParmVarDecl::Create(m_CurrentDC,it->getString(),NULL);
+ }
+ evt->add_param(var);
+ }
+ }
+ }
+ $$ = evt;
+ }
+ | T_ASTERISK {
+ LDS_LOG_ERROR("event: asterisk NOT YET CODED");
+ $$ = NULL;
+ }
+;
+
+
+
+expression: expression0 {
+ LDS_LOG_DEBUG("expression: expression0");
+ }
+;
+expression0: operand {
+ LDS_LOG_DEBUG("expression0: operand");
+ /* Z.104 12.2.1 Pg 35 Missing Create expression, decoding and encoding Expr */
+ }
+ | T_EXECUTE value_returning_proc_call {
+ LDS_LOG_ERROR("expression0: value_return_proc_call");
+ }
+ | create_expression {
+ LDS_LOG_DEBUG("expression0: Create Expression");
+ }
+ | encode_expr {
+ LDS_LOG_DEBUG("expression0: Create Expression");
+ }
+ | decode_expr {
+ LDS_LOG_DEBUG("expression0: Create Expression");
+ }
+;
+operand:operand0
+ | operand T_IMPLIES operand0 {
+ LDS_LOG_ERROR("operand: IMPLIES not parsed");
+ }
+;
+
+operand0: operand1
+ | operand T_OR operand1 {
+ LDS_LOG_DEBUG("operand0: operand or operand1");
+ $$ = new AST::BinaryOperator($1,$3,AST::BO_LOr);
+ }
+ | operand T_XOR operand1 {
+ LDS_LOG_DEBUG("operand0: operand xor operand1");
+ $$ = new AST::BinaryOperator($1,$3,AST::BO_Xor);
+ }
+;
+
+operand1: operand2
+ | operand1 T_AND operand2 {
+ $$ = new AST::BinaryOperator($1,$3,AST::BO_And);
+ }
+;
+
+operand2: operand3
+ | operand2 T_GT operand3 {
+ LDS_LOG_DEBUG("operand2: operand2 > operand3");
+ $$ = new AST::BinaryOperator($1,$3,AST::BO_GT);
+ }
+ | operand2 T_GTE operand3 {
+ LDS_LOG_DEBUG("operand2: operand2 >= operand3");
+ $$ = new AST::BinaryOperator($1,$3,AST::BO_GE);
+ }
+ | operand2 T_LT operand3 {
+ LDS_LOG_DEBUG("operand2: operand2 < operand3");
+ $$ = new AST::BinaryOperator($1,$3,AST::BO_LT);
+ }
+ | operand2 T_LTE operand3 {
+ LDS_LOG_DEBUG("operand2: operand2 <= operand3");
+ $$ = new AST::BinaryOperator($1,$3,AST::BO_LE);
+ }
+ | operand2 T_EQ operand3 {
+ LDS_LOG_DEBUG("operand2: operand2 == operand3");
+ $$ = new AST::BinaryOperator($1,$3,AST::BO_EQ);
+ }
+ | operand2 T_NE operand3 {
+ LDS_LOG_DEBUG("operand2: operand2 != operand3");
+ $$ = new AST::BinaryOperator($1,$3,AST::BO_NE);
+ }
+;
+
+operand3: operand4
+ | operand3 T_PLUS operand4 {
+ LDS_LOG_DEBUG("operand2: operand3 + operand4");
+ $$ = new AST::BinaryOperator($1,$3,AST::BO_Add);
+ }
+ | operand3 T_HYPHEN operand4 {
+ LDS_LOG_DEBUG("operand2: operand3 - operand4");
+ $$ = new AST::BinaryOperator($1,$3,AST::BO_Sub);
+ }
+ | operand3 T_CONCAT operand4 {
+ LDS_LOG_ERROR("operand2: operand3 concat operand4");
+ }
+;
+operand4: operand5
+ | operand4 T_SOLIDUS operand5 {
+ LDS_LOG_DEBUG("operand2: operand4 / operand5");
+ $$ = new AST::BinaryOperator($1,$3,AST::BO_Div);
+ }
+ | operand4 T_ASTERISK operand5 {
+ LDS_LOG_DEBUG("operand2: operand4 * operand5");
+ $$ = new AST::BinaryOperator($1,$3,AST::BO_Mul);
+ }
+ | operand4 T_REM operand5 {
+ LDS_LOG_INFO("operand2: operand4 rem ??? operand5");
+ $$ = new AST::BinaryOperator($1,$3,AST::BO_Div);
+ }
+ | operand4 T_MOD operand5 {
+ LDS_LOG_INFO("operand2: operand4 mod operand5");
+ $$ = new AST::BinaryOperator($1,$3,AST::BO_Div);
+ }
+;
+
+operand5: primary {
+ AST::StringLiteral *s = dynamic_cast<AST::StringLiteral *>($1);
+ if ( (s != NULL)
+ && (! (s->isConstantArray) ) )
+ {
+ //AST::DeclContext::lookup_result r = m_CurrentAut->lookup(s->getString());
+ AST::DeclContext::lookup_result r = m_CurrentDC->lookup(s->getString());
+ AST::FunctionDecl *fdecl = NULL;
+ if ( r.size() > 0 && (fdecl = dynamic_cast<AST::FunctionDecl *>(r[0])) )
+ {
+ LDS_LOG_DEBUG("operand5 : Found Function %s ",s->getString().c_str());
+ } else if ( r.size() > 0 && ( dynamic_cast<AST::ParmVarDecl *>(r[0])) )
+ {
+ LDS_LOG_DEBUG("operand5 : Found ParmVar %s ",s->getString().c_str());
+ AST::DeclRefExpr *dref = new AST::DeclRefExpr(dynamic_cast<AST::ValueDecl *>(r[0])) ;
+ $<expr>$ = dref;
+ } else if ( r.size() > 0 && ( dynamic_cast<AST::VarDecl *>(r[0])) )
+ {
+ LDS_LOG_DEBUG("operand5 : Found Variable %s ",s->getString().c_str());
+ AST::DeclRefExpr *dref = new AST::DeclRefExpr(dynamic_cast<AST::ValueDecl *>(r[0])) ;
+ $<expr>$ = dref;
+ }else {
+ LDS_LOG_WARN("operand5 : Not Found function %s is constant %d ",s->getString().c_str(),s->isConstantArray);
+ fdecl = AST::FunctionDecl::Create(m_CurrentDC,s->getString(),NULL);
+ m_CurrentAut->addDecl(fdecl);
+ }
+ if (fdecl != NULL)
+ {
+ LDS_LOG_INFO("operand5: Transform StringLiteral %s into callExpr WHY",s->getString().c_str());
+ AST::DeclRefExpr *dref = new AST::DeclRefExpr(dynamic_cast<AST::ValueDecl *>(fdecl)) ;
+ LDS_LOG_DEBUG("operand5 : call expr %s with params ",fdecl->getName().c_str());
+ $<expr>$ = new AST::CallExpr(m_CurrentDC,dref);
+ }
+
+ } else {
+ }
+ // Return as is
+ }
+ | extended_primary {
+ }
+ | T_NOT primary {
+ LDS_LOG_DEBUG("operand5: T_NOT");
+ if (AST::StringLiteral *s = dynamic_cast<AST::StringLiteral *>($2) ) {
+ LDS_LOG_INFO("operand5: T_NOT Transform StringLiteral into callExpr");
+ AST::DeclContext::lookup_result r = m_CurrentAut->lookup(s->getString());
+ AST::FunctionDecl *fdecl = NULL;
+ AST::VarDecl *var = NULL;
+
+ if ( r.size() > 0 && (fdecl = dynamic_cast<AST::FunctionDecl *>(r[0])) )
+ {
+ LDS_LOG_DEBUG("operand5 T_NOT: Found function %s ",s->getString().c_str());
+ } else if ( r.size() > 0 && (var = dynamic_cast<AST::VarDecl *>(r[0])) )
+ {
+ LDS_LOG_INFO("operand5 T_NOT: Found global variable %s ",s->getString().c_str());
+ $$ = new AST::UnaryOperator($2, AST::UO_LNot);
+ } else
+ {
+ LDS_LOG_DEBUG("operand5 T_NOT: Not Found function %s ",s->getString().c_str());
+ fdecl = AST::FunctionDecl::Create(m_CurrentDC,s->getString(),NULL);
+ m_CurrentAut->addDecl(fdecl);
+ }
+ AST::DeclRefExpr *dref = new AST::DeclRefExpr(dynamic_cast<AST::ValueDecl *>(fdecl)) ;
+ LDS_LOG_DEBUG("operand5 : call expr %s with params ",fdecl->getName().c_str());
+ AST::CallExpr *ce = new AST::CallExpr(m_CurrentDC,dref);
+
+ $$ = new AST::UnaryOperator(ce, AST::UO_LNot);
+
+ } else
+ $$ = new AST::UnaryOperator($2, AST::UO_LNot);
+ }
+ | T_HYPHEN primary {
+ $$ = new AST::UnaryOperator($2, AST::UO_LNot);
+ }
+ | T_TEST primary {
+ LDS_LOG_DEBUG("operand5: T_TEST might never be called it's a conditional");
+ $$ = new AST::UnaryOperator($2, AST::UO_Test);
+ }
+;
+
+primary: T_LPARENTHESES expression T_RPARENTHESES {
+ LDS_LOG_DEBUG("primary: (expression)");
+ $$ = new AST::ParenExpr($2);
+ }
+ | action_name actual_parameters {
+
+ AST::ParenListExpr *args = dynamic_cast<AST::ParenListExpr *>($2);
+ AST::FunctionDecl *fct = dynamic_cast<AST::FunctionDecl *>($1);
+ AST::CallExpr * act = NULL;
+
+ if (fct->isNew() && args)
+ {
+ ldsp->function_complete(m_CurrentDC,m_RootTranslationUnit,fct,args);
+ }
+
+
+ LDS_LOG_DEBUG("primary: simple function call %s with params ",fct->getName().c_str());
+ AST::DeclRefExpr *dref = new AST::DeclRefExpr(dynamic_cast<AST::ValueDecl *>($1)) ;
+ if (args)
+ {
+ act = new AST::CallExpr(m_CurrentDC,dref,std::vector<AST::Expr *>(&args->getExprs()[0],&args->getExprs()[args->getNumExprs()]));
+ $<stmt>$ = act;
+ } else {
+ act = new AST::CallExpr(m_CurrentDC,dref);
+ $<stmt>$ = act;
+ }
+
+ m_StackDC.pop();
+ ldsp->got_CallExpr(*act);
+
+ }
+ | conditional_expression {
+ LDS_LOG_DEBUG("primary: conditional expression");
+ $$ = $1;
+ }
+ | T_IDENTIFIER {
+ /* May be shoud have check here if it's a variable (active primary -> variable access */
+ LDS_LOG_DEBUG("primary: identifier %s",$1->getString().c_str());
+ AST::DeclContext::lookup_result r = m_CurrentDC->lookup($1->getString());
+ AST::FunctionDecl *fdecl = NULL;
+ if (r.size() == 0)
+ {
+ LDS_LOG_INFO("primary: %s maybe is Global",$1->getString().c_str());
+ r = m_CurrentAgent->lookup($1->getString());
+ }
+ if ( r.size() > 0 && (fdecl = dynamic_cast<AST::FunctionDecl *>(r[0])) )
+ {
+ LDS_LOG_DEBUG("primary : Found Function %s ",$1->getString().c_str());
+ } else if ( r.size() > 0 && ( dynamic_cast<AST::ParmVarDecl *>(r[0])) )
+ {
+ LDS_LOG_DEBUG("primary : Found ParmVar %s ",$1->getString().c_str());
+ AST::DeclRefExpr *dref = new AST::DeclRefExpr(dynamic_cast<AST::ValueDecl *>(r[0])) ;
+ $<expr>$ = dref;
+ } else if ( r.size() > 0 && ( dynamic_cast<AST::VarDecl *>(r[0])) )
+ {
+ LDS_LOG_DEBUG("primary : Found Variable %s ",$1->getString().c_str());
+ AST::DeclRefExpr *dref = new AST::DeclRefExpr(dynamic_cast<AST::ValueDecl *>(r[0])) ;
+ $<expr>$ = dref;
+ } else
+ $<expr>$ = $<expr>1;
+ }
+ | T_NUMBER {
+ AST::Type &Int = m_RootTranslationUnit->getASTContext().IntegerTy;
+ LDS_LOG_DEBUG("primary: number=%d",$<num>1);
+ $<expr>$ = new AST::IntegerLiteral($<num>1,&Int);
+ }
+ | T_CHARSTRING {
+ LDS_LOG_DEBUG("primary: Constant string %s",$<str_expr>1->getString().c_str());
+ AST::Type &Char = m_RootTranslationUnit->getASTContext().CharTy;
+ AST::Type &CharArray = m_RootTranslationUnit->getASTContext().getConstantArrayType(&Char,strlen($<string>1)+1 );
+ $<expr>$ = $<str_expr>1;
+ }
+ | imperative_expression {
+ }
+;
+
+imperative_expression: T_SENDER {
+ LDS_LOG_DEBUG("imperative_expression: Pid expression sender");
+ AST::Type &PidTy = m_RootTranslationUnit->getASTContext().PidTy;
+ $$ = new AST::PidExpr(AST::PidExpr::Sender,NULL,&PidTy);
+ }
+ | T_PARENT {
+ LDS_LOG_DEBUG("imperative_expression: Pid expression parent");
+ AST::Type &PidTy = m_RootTranslationUnit->getASTContext().PidTy;
+ $$ = new AST::PidExpr(AST::PidExpr::Parent,NULL,&PidTy);
+ }
+ | T_OFFSPRING {
+ LDS_LOG_DEBUG("imperative_expression: Pid expression offspring");
+ AST::Type &PidTy = m_RootTranslationUnit->getASTContext().PidTy;
+ $$ = new AST::PidExpr(AST::PidExpr::OffSpring,NULL,&PidTy);
+ }
+ | T_SELF {
+ LDS_LOG_DEBUG("imperative_expression: Pid expression self");
+ AST::Type &PidTy = m_RootTranslationUnit->getASTContext().PidTy;
+ $$ = new AST::PidExpr(AST::PidExpr::Self,NULL,&PidTy);
+ }
+ | T_NOW {
+ LDS_LOG_ERROR("imperative_expression: now epxression TODO");
+ }
+ | T_ACTIVE T_LPARENTHESES T_IDENTIFIER T_LPARENTHESES expression_list T_RPARENTHESES T_RPARENTHESES {
+ LDS_LOG_ERROR("imperative_expression: timer active with expression TODO");
+ /* Expression with type result Boolean */
+ }
+ | T_ACTIVE T_LPARENTHESES T_IDENTIFIER T_RPARENTHESES {
+ LDS_LOG_ERROR("imperative_expression: timer or agent active TODO");
+ /* Expression with type result Boolean if timer */
+ /* Natural The number of Running instance Z.101 12.3.4.4 */
+ }
+ | T_ACTIVE T_LPARENTHESES T_THIS T_RPARENTHESES {
+ LDS_LOG_ERROR("imperative_expression: agent active this TODO");
+ }
+;
+
+expression_list: expression {
+ LDS_LOG_ERROR("expression_list:NOT YET IMPLEMENTED");
+ }
+ | expression_list T_COMMA expression {
+ }
+;
+
+
+extended_primary: primary T_LBRACET T_RBRACET {
+ LDS_LOG_ERROR("extended_primary: [] not coded !!!! ");
+ /* Need to return an ArraySubcriptExpr */
+ AST::Type *Ty = &m_RootTranslationUnit->getASTContext().VoidTy;
+ $<expr>$ =
+ AST::ArraySubscriptExpr::Create(m_RootTranslationUnit->getASTContext()
+ , $1 , NULL ,Ty);
+ }
+ | primary T_LBRACKET primary_list T_RBRACKET {
+ LDS_LOG_ERROR("extended_primary: [primary_list] not coded !!!! ");
+ /* Need to return an ArraySubcriptExpr */
+ AST::Type *Ty = &m_RootTranslationUnit->getASTContext().VoidTy;
+ $<expr>$ =
+ AST::ArraySubscriptExpr::Create(m_RootTranslationUnit->getASTContext()
+ , $1 , $<expr>3 ,Ty);
+ }
+ | primary T_POINT T_IDENTIFIER {
+ LDS_LOG_ERROR("extended_primary: M.x not coded !!!! ");
+ /* Figure out Primary And Member */
+ /* M Is a variable, or MemberExpr I should Be able to get The Type,
+ * From the type I should Find the Member Decl.
+ Ty should be the Type of Member
+ */
+ AST::Type *Ty = &m_RootTranslationUnit->getASTContext().VoidTy;
+ $<expr>$ =
+ AST::MemberExpr::Create( m_RootTranslationUnit->getASTContext()
+ , $1
+ , NULL
+ , Ty);
+ }
+ | T_COMPOSITE_BEGIN actual_parameters T_COMPOSITE_END {
+ LDS_LOG_ERROR("extended_primary: composite primary (.1,2,3 .)!!!! ");
+ }
+;
+
+variable: T_IDENTIFIER {
+ LDS_LOG_INFO("variable: %s ",$1->getString().c_str());
+ AST::DeclContext::lookup_result r = m_CurrentDC->lookup($1->getString());
+ AST::ValueDecl *decl = NULL;
+ if (r.size() == 0)
+ {
+ LDS_LOG_INFO("variable: %s is Global",$1->getString().c_str());
+ r = m_CurrentAgent->lookup($1->getString());
+ }
+ if ( r.size() > 0 )
+ {
+ decl = dynamic_cast<AST::ValueDecl * >(r[0]);
+ if (dynamic_cast<AST::FunctionDecl *>(r[0]))
+ {
+ LDS_LOG_INFO("variable: %s is Function",$1->getString().c_str());
+ } else if (dynamic_cast<AST::ParmVarDecl *>(r[0]))
+ {
+ LDS_LOG_INFO("variable: %s is Parameter Variable",$1->getString().c_str());
+ } else if (dynamic_cast<AST::VarDecl *>(r[0]))
+ {
+ LDS_LOG_INFO("variable: %s is Variable",$1->getString().c_str());
+ }
+ AST::DeclRefExpr *dref = new AST::DeclRefExpr(dynamic_cast<AST::ValueDecl *>(decl)) ;
+ $<expr>$ = dref;
+ delete ($1);
+ } else {
+ LDS_LOG_ERROR("variable: undeclared %s Not found in context",$1->getString().c_str());
+ }
+ /* It can be a local variable */
+ /* Function parameter */
+ /* Global variable */
+ /* External Variable */
+ /* Missing functions to figure out how to lookup
+ for the type
+ */
+ }
+ | extended_primary {
+ LDS_LOG_INFO("variable: extended ");
+ }
+;
+
+value_returning_proc_call: action_name actual_parameters {
+ /* If the function is undefined return Int */
+ AST::ParenListExpr *args = dynamic_cast<AST::ParenListExpr *>($2);
+ AST::FunctionDecl *fct = dynamic_cast<AST::FunctionDecl *>($1);
+
+ LDS_LOG_DEBUG("value_returning_proc_call: simple function call %s with params ",fct->getName().c_str());
+ AST::DeclRefExpr *dref = new AST::DeclRefExpr(dynamic_cast<AST::ValueDecl *>($1)) ;
+ //AST::CallExpr *act = new AST::CallExpr(m_CurrentDC,dref,std::vector<AST::Expr *>(&args->getExprs()[0],&args->getExprs()[args->getNumExprs()]));
+ //$<stmt>$ = act;
+
+ //m_StackDC.pop();
+ //* NEW */
+
+ if (fct->isNew() && args)
+ {
+ AST::StmtRange range = args->children();
+ for ( ; ! range.empty(); ++range)
+ {
+ AST::StringLiteral *it = dynamic_cast<AST::StringLiteral *>(*range);
+ if (it != NULL)
+ {
+ AST::DeclContext::lookup_result r = m_CurrentAut->lookup(it->getString());
+ if ( r.size() == 0 )
+ {
+ LDS_LOG_ERROR("value_return_proc: action simple function call %s undeclared parameter %s",fct->getName().c_str(),it->getString().c_str());
+ }
+ AST::ParmVarDecl *var = AST::ParmVarDecl::Create(m_CurrentDC,it->getString(),NULL);
+ fct->add_param(var);
+ }
+ }
+ }
+
+ LDS_LOG_DEBUG("value_returning_proc: simple function call %s with params ",fct->getName().c_str());
+ // AST::DeclRefExpr *dref = new AST::DeclRefExpr(dynamic_cast<AST::ValueDecl *>($1)) ;
+ if (args)
+ {
+ AST::CallExpr *act = new AST::CallExpr(m_CurrentDC,dref,std::vector<AST::Expr *>(&args->getExprs()[0]
+ ,&args->getExprs()[args->getNumExprs()]));
+ $<stmt>$ = act;
+ } else {
+ AST::CallExpr *act = new AST::CallExpr(m_CurrentDC,dref);
+ $<stmt>$ = act;
+ }
+
+ m_StackDC.pop();
+ }
+;
+
+create_expression: T_CREATE T_IDENTIFIER {
+ LDS_LOG_DEBUG("create_expression : create %s",$2->getString().c_str());
+ AST::CreateExpr *ce = new AST::CreateExpr($2,&m_RootTranslationUnit->getASTContext().PidTy);
+ $<expr>$ = ce;
+ ldsp->got_CreateExpr(*ce);
+ }
+;
+
+encode_expr: T_ENCODE T_IDENTIFIER expression encode_path{
+ LDS_LOG_DEBUG("encode_expr : TODO");
+ }
+;
+
+encode_path: /* Empty */ {
+ $$ = NULL;
+ }
+ | T_AS T_CHANNEL T_IDENTIFIER {
+ LDS_LOG_DEBUG("encode_path : as channel TODO");
+ }
+ | T_AS T_GATE T_IDENTIFIER {
+ LDS_LOG_DEBUG("encode_path : as gate TODO");
+ }
+
+
+decode_expr: T_DECODE expression encode_path{
+ LDS_LOG_DEBUG("decode_expr : TODO");
+};
+
+conditional_expression: T_TEST primary {
+ LDS_LOG_DEBUG("conditional_expression : T_TEST ???");
+ $$ = new AST::UnaryOperator($2, AST::UO_Test);
+ }
+;
+
+primary_list: primary {
+ LDS_LOG_INFO("primary_list : TODO");
+ $$ = new ExprArray();
+ $$->push_back($1);
+ }
+ | primary_list T_COMMA primary {
+ LDS_LOG_INFO("primary_list : TODO");
+ $$->push_back($3);
+ }
+;
+
+constraint: T_CONSTANTS T_LPARENTHESES range_condition T_RPARENTHESES {
+ /* Z.101 2011 Pg 85*/
+ LDS_LOG_INFO("constraint : constant TOTO");
+ $<expr>$ = $<expr>3;
+ }
+ | size_constraint {
+ LDS_LOG_INFO("constraint : size TOTO");
+ }
+;
+
+size_constraint: T_SIZE T_LPARENTHESES range_condition T_RPARENTHESES {
+ LDS_LOG_INFO("size constraint : first TOTO Missing somthing like SizeExpr");
+ $<expr>$ = $<expr>3;
+ }
+;
+
+range_condition: range {
+ LDS_LOG_INFO("range_condition : first TOTO");
+ $<expr>$ = $<expr>1;
+ }
+ | range_condition T_COMMA range {
+ LDS_LOG_INFO("range_condition : next TOTO");
+ $<expr>$ = new AST::BinaryOperator($<expr>1,$<expr>3,AST::BO_And);
+ }
+;
+
+range: primary T_COLON primary {
+ /* <close range> primary shall be a constant expression */
+ LDS_LOG_INFO("range : colon TODO");
+ /* Build an expression (> primary1) and (< pramary 2)*/
+ AST::BinaryOperator *le = new AST::BinaryOperator(NULL,$1,AST::BO_GE);
+ AST::BinaryOperator *re = new AST::BinaryOperator(NULL,$3,AST::BO_LE);
+ $$ = new AST::BinaryOperator(le,re,AST::BO_And);
+ }
+ | primary T_RANGE primary {
+ /* <close range> primary shall be a constant expression */
+ LDS_LOG_INFO("range : range TODO");
+ AST::BinaryOperator *le = new AST::BinaryOperator(NULL,$1,AST::BO_GE);
+ AST::BinaryOperator *re = new AST::BinaryOperator(NULL,$3,AST::BO_LE);
+ $$ = new AST::BinaryOperator(le,re,AST::BO_And);
+ }
+ | T_EQ primary {
+ /* <open range> primary shall be a constant expression */
+ LDS_LOG_INFO("range : = TODO");
+ $$ = new AST::BinaryOperator(NULL,$2,AST::BO_EQ);
+ }
+ | T_NE primary {
+ /* <open range> primary shall be a constant expression */
+ LDS_LOG_INFO("range : /=TODO");
+ $$ = new AST::BinaryOperator(NULL,$2,AST::BO_NE);
+ }
+ | T_LT primary {
+ /* <open range> primary shall be a constant expression */
+ LDS_LOG_INFO("range : < TODO");
+ $$ = new AST::BinaryOperator(NULL,$2,AST::BO_LT);
+ }
+ | T_GT primary {
+ /* <open range> primary shall be a constant expression */
+ LDS_LOG_INFO("range : > TODO");
+ $$ = new AST::BinaryOperator(NULL,$2,AST::BO_GT);
+ }
+ | T_GTE primary {
+ /* <open range> primary shall be a constant expression */
+ LDS_LOG_INFO("range : >= TODO");
+ $$ = new AST::BinaryOperator(NULL,$2,AST::BO_GE);
+ }
+ | T_LTE primary {
+ /* <open range> primary shall be a constant expression */
+ LDS_LOG_INFO("range : <= TODO");
+ $$ = new AST::BinaryOperator(NULL,$2,AST::BO_LE);
+ }
+;
+
+channel_definition: T_CHANNEL T_IDENTIFIER {
+ AST::ChannelDecl *ch = AST::ChannelDecl::Create( m_RootTranslationUnit->getASTContext()
+ , m_CurrentDC,$2->getString());
+ $<decl>$ = ch;
+ m_CurrentDC = dynamic_cast<AST::DeclContext *>($<decl>$);
+ m_StackDC.push(m_CurrentDC);
+ }
+ channel_paths T_ENDCHANNEL T_IDENTIFIER T_SIMILICON {
+ /* Z.106 Chapter 5.6.1 */
+ LDS_LOG_INFO("channel_definition: %s",$2->getString().c_str());
+ AST::ChannelDecl *ch = dynamic_cast<AST::ChannelDecl *>($<decl>3);
+ m_StackDC.pop();
+ m_CurrentDC = m_StackDC.top();
+ ldsp->got_ChannelDecl(*ch);
+ $$ = ch;
+ }
+;
+
+channel_paths:channel_path {
+ m_CurrentDC->addDecl($1);
+ }
+ | channel_paths channel_path {
+ m_CurrentDC->addDecl($2);
+ }
+;
+
+channel_path: T_FROM channel_ep T_TO channel_ep chp_with end {
+ LDS_LOG_INFO("channel_path: got From ");
+ AST::ChannelEndPointDecl *from = dynamic_cast<AST::ChannelEndPointDecl *>($2);
+ AST::ChannelEndPointDecl *to = dynamic_cast<AST::ChannelEndPointDecl *>($4);
+ AST::ChannelPathDecl *p = AST::ChannelPathDecl::Create( m_RootTranslationUnit->getASTContext()
+ , m_CurrentDC,"");
+ p->setFrom(from);
+ p->setTo(to);
+ $$ = p;
+ ldsp->got_ChannelPathDecl(*p);
+ }
+;
+channel_ep: T_IDENTIFIER chep_via {
+ LDS_LOG_INFO("channel_ep state or agent ");
+ $$ = AST::ChannelEndPointDecl::Create( m_RootTranslationUnit->getASTContext()
+ , m_CurrentDC,$1->getString(),AST::ChannelEndPointDecl::eAGENT);
+ }
+ | T_ENV chep_via {
+ LDS_LOG_INFO("channel_ep ENV");
+ $$ = AST::ChannelEndPointDecl::Create( m_RootTranslationUnit->getASTContext()
+ , m_CurrentDC,"env",AST::ChannelEndPointDecl::eENV);
+ }
+ | T_THIS chep_via {
+ LDS_LOG_INFO("channel_ep this");
+ $$ = AST::ChannelEndPointDecl::Create( m_RootTranslationUnit->getASTContext()
+ , m_CurrentDC,"this",AST::ChannelEndPointDecl::eTHIS);
+ }
+;
+
+chep_via: /* Empty */
+ | T_VIA T_IDENTIFIER {
+ /* IDENTIFIER is a gate */
+ }
+;
+
+chp_with:/* Empty*/ {
+ $$ = NULL;
+ }
+ | T_WITH signal_list {
+ /* with < signal list> */
+ LDS_LOG_ERROR("chp_with: TODO: use signal list");
+ $$ = $2;
+ }
+;
+
+signal_list: signal_list_item {
+ LDS_LOG_ERROR("signal_list: TODO: use signal list");
+ $$ = new ExprArray();
+ $$->push_back($1);
+ }
+ | signal_list T_COMMA signal_list_item {
+ LDS_LOG_ERROR("signal_list: TODO: ");
+ if ($3)
+ $$->push_back($3);
+ }
+;
+
+signal_list_item: T_IDENTIFIER {
+ LDS_LOG_ERROR("signal_list_item: TODO: %s",$1->getString().c_str());
+ AST::DeclContext::lookup_result r = m_CurrentAgent->lookup($1->getString());
+ if ( r.size() == 0 )
+ {
+ LDS_LOG_ERROR("signal_list_item: %s event not found STOP ",$1->getString().c_str());
+ $$ = NULL;
+ } else if (AST::EventDecl *v = dynamic_cast<AST::EventDecl *>(r[0]))
+ {
+ AST::DeclRefExpr *dref = new AST::DeclRefExpr(v) ;
+ $$ = dref;
+ } else {
+ LDS_LOG_ERROR("signal_list_item: %s event not found",$1->getString().c_str());
+ $$ = NULL;
+ }
+ }
+ | T_LPARENTHESES T_IDENTIFIER T_RPARENTHESES {
+ LDS_LOG_ERROR("signal_list_item: TODO: ");
+ $$ = NULL;
+ }
+;
+
+c2c_connection: T_CONNECT T_IDENTIFIER T_AND T_IDENTIFIER T_SIMILICON {
+ /* Z.106 Chapter 5.6 connect <external channel id> and <channel id> */
+ }
+;
+
+gate_definition: T_GATE T_IDENTIFIER gate_constraint end {
+ /* Z.102 Chp 8.3.12 Pg 18 */
+ LDS_LOG_INFO("gate_definition: %s",$2->getString().c_str());
+ }
+;
+
+gate_constraint: /* Empty */
+ | T_IN chp_with {
+ LDS_LOG_INFO("gate_contraint: IN ");
+ }
+ | T_IN chp_with T_OUT chp_with {
+ LDS_LOG_INFO("gate_contraint: IN OUT");
+ }
+ | T_OUT chp_with {
+ LDS_LOG_INFO("gate_contraint: OUT ");
+ }
+ | T_OUT chp_with T_IN chp_with {
+ LDS_LOG_INFO("gate_contraint: OUT IN ");
+ }
+;
+
+
+sort: bsort {
+ /* Z.104 Chap 12.1 Pg 19 */
+ /* a sort is a type. */
+ LDS_LOG_INFO("sort: basic sort");
+ }
+ | bsort T_LPARENTHESES range_condition T_RPARENTHESES {
+ LDS_LOG_INFO("sort: basic sort with range_condition ");
+ }
+ | inline_dt_def {
+ LDS_LOG_INFO("sort: inline_dt_def !!! is an anonymous datatype");
+ }
+ | inline_st_def {
+ LDS_LOG_INFO("sort: inline_st_def !!! is an anonymous syntype");
+ }
+ | anchored_sort {
+ LDS_LOG_INFO("sort: anchored_sort");
+ }
+;
+
+bsort: T_IDENTIFIER {
+ AST::Type *result = &m_RootTranslationUnit->getASTContext().VoidTy;
+ /* Identifier can be syntype identifier, Pid identifier, sort identifier */
+ /* Need to lookup if type exists before creating a new one */
+ AST::DeclContext::lookup_result r;
+ if ( m_CurrentAut)
+ {
+ r = m_CurrentAut->lookup($1->getString());
+ }
+ else if ( m_CurrentAgent)
+ {
+ r = m_CurrentAgent->lookup($1->getString());
+ }
+ if (! $1->getString().compare("Integer") )
+ {
+ /* */
+ result = &m_RootTranslationUnit->getASTContext().IntegerTy;
+ } else if ( ! $1->getString().compare("String"))
+ {
+ /* Still Some work todo */
+ result = &m_RootTranslationUnit->getASTContext().StringTy;
+ } else if ( ! $1->getString().compare("Boolean"))
+ {
+ result = &m_RootTranslationUnit->getASTContext().BooleanTy;
+ } else if ( ! $1->getString().compare("Pid"))
+ {
+ result = &m_RootTranslationUnit->getASTContext().PidTy;
+ } else if (r.size() != 0)
+ {
+ if (AST::TypeDecl *ty = dynamic_cast<AST::TypeDecl *>(r[0]))
+ {
+ LDS_LOG_INFO("bsort: return getTypeForDecl");
+ result = ty->getTypeForDecl();
+ if (! result )
+ {
+ LDS_LOG_ERROR("bsort: return getTypeForDecl NULL for type %s",$1->getString().c_str());
+ result = &m_RootTranslationUnit->getASTContext().VoidTy;
+ }
+ } else {
+ LDS_LOG_INFO("bsort: Unknown type ");
+ }
+ } else {
+ LDS_LOG_INFO("bsort: return void Type");
+ result = &m_RootTranslationUnit->getASTContext().VoidTy;
+ }
+ // May be it's a typedef !!!
+ $$ = result;
+ }
+ | T_AS T_SIGNAL T_IDENTIFIER {
+ /* Z104 Pg 13 et 13 */
+ /* Should generate an anonymous DataType <T_IDENTIFIER>UniqueAnon
+ * based on signal T_IDENTIFIER.
+ * If signal s1(Inger,String)
+ * then : value type s1UniqueAnon {
+ * struct
+ * Aa1 Integer optional;
+ * Aa2 String optional;
+ * };
+ */
+ AST::Type *result;
+ result = &m_RootTranslationUnit->getASTContext().IntegerTy;
+ $$ = result;
+ }
+ | T_AS T_CHANNEL T_IDENTIFIER {
+ AST::Type *result;
+ result = &m_RootTranslationUnit->getASTContext().IntegerTy;
+ $$ = result;
+ }
+ | T_AS T_GATE T_IDENTIFIER {
+ /* Identifier must represent a choice datatype. The choice
+ * must use the as signal fields
+ */
+ AST::Type *result;
+ result = &m_RootTranslationUnit->getASTContext().IntegerTy;
+ $$ = result;
+ }
+;
+
+sort_or_named_fields_sort_list: sort_list {
+ $$ = $1;
+ }
+ | named_fields_sort_list {
+ $$ = $1;
+ }
+;
+
+named_fields_sort_list: T_LPARENTHESES named_fields T_RPARENTHESES {
+ $$ = $2;
+ }
+;
+
+named_fields: named_sort {
+ $$ = new TypeArray();
+ $$->push_back($1);
+ }
+ | named_fields T_COMMA named_sort {
+ $$->push_back($3);
+ }
+;
+
+named_sort: parameter_kind T_IDENTIFIER sort {
+ LDS_LOG_INFO("named_sort: with aggregation kind");
+ $$ = $3;
+ delete ($2);
+ }
+ | T_IDENTIFIER sort {
+ LDS_LOG_INFO("named_sort: ");
+ $$ = $2;
+ delete ($1);
+ }
+;
+
+sort_list: T_LPARENTHESES sort_items T_RPARENTHESES {
+ LDS_LOG_INFO("sort_list: ");
+ $$ = $2;
+ }
+
+sort_items: sort {
+ LDS_LOG_INFO("sort_items: first");
+ $$ = new TypeArray();
+ $$->push_back($1);
+ }
+ | sort_items T_COMMA sort {
+ LDS_LOG_INFO("sort_items: next");
+ $$->push_back($3);
+ }
+;
+
+inline_dt_def: T_VALUE datatype_specialization {
+ /* value [dt specialization ] { dt_def_body } */
+ LDS_LOG_INFO("inline_dt_def: value with or without specialization");
+ AST::Type *result;
+ result = &m_RootTranslationUnit->getASTContext().IntegerTy;
+ $$ = result;
+ }
+ | T_VALUE datatype_specialization T_LBRACET dtd_body T_RBRACET {
+ LDS_LOG_INFO("inline_dt_def: value with or without specialization and dt_body ");
+ AST::Type *result;
+ result = &m_RootTranslationUnit->getASTContext().IntegerTy;
+ $$ = result;
+ }
+;
+inline_st_def: T_SYNTYPE bsort {
+ /* syntype <bsort> { <default init> <end > <constraint> |Â <constraint> } */
+ LDS_LOG_INFO("inline_st_def:");
+ AST::Type *result;
+ result = &m_RootTranslationUnit->getASTContext().IntegerTy;
+ $$ = result;
+ }
+ | T_SYNTYPE bsort T_LBRACET opt_default_initialization end constraint end T_RBRACET {
+ LDS_LOG_INFO("inline_st_def: TODO constraint");
+ AST::Type *result;
+ result = &m_RootTranslationUnit->getASTContext().IntegerTy;
+ $$ = result;
+ }
+ | T_SYNTYPE bsort T_LBRACET opt_default_initialization constraint end T_RBRACET {
+ LDS_LOG_INFO("inline_st_def: TODO constraint");
+ AST::Type *result;
+ result = &m_RootTranslationUnit->getASTContext().IntegerTy;
+ $$ = result;
+ }
+;
+
+anchored_sort: T_THIS {
+ /* Is legal only if within datatype definition */
+ LDS_LOG_INFO("anchored_sort: this");
+ AST::Type *result;
+ result = &m_RootTranslationUnit->getASTContext().IntegerTy;
+ $$ = result;
+ }
+ | T_THIS bsort {
+ /* bsort shall name the sort introduced by data type definition */
+ LDS_LOG_INFO("anchored_sort: this bsort");
+ AST::Type *result;
+ result = &m_RootTranslationUnit->getASTContext().IntegerTy;
+ $$ = result;
+ }
+;
+
+end: T_SIMILICON {
+ LDS_LOG_DEBUG("end:");
+ }
+ | T_COMMENT T_CHARSTRING T_SIMILICON {
+ LDS_LOG_DEBUG("end: comment ");
+ }
+;
+
+%%
+
+
+void ldsExpr2TemplateArgument(yyscan_t scanner,AST::TemplateArgumentArray &a
+ ,AST::TemplateArgument *exp)
+{
+ LDS_LOG_DEBUG("ldsExpr2TemplateArgument:: ");
+ a.push_back(exp);
+}
+
+
--- /dev/null
+#include <stdio.h>
+#include <iostream>
+#include <string>
+#include <list>
+#include <vector>
+#include <map>
+
+// For open / clise
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <fcntl.h>
+#include <algorithm>
+// for access function I need unistd
+#ifndef _WIN32
+#include <unistd.h>
+#else
+#include <io.h>
+#define acess _access_s
+#define F_OK 0
+#endif
+#include <stdlib.h>
+
+#include "AST/Stmt.h"
+#include "AST/Expr.h"
+#include "AST/Decl.h"
+
+#include <AST/Type.h>
+#include <AST/ASTContext.h>
+
+#include "lds_parser_listener.h"
+#include "lds_parser.h"
+#ifdef _WIN32
+/**
+ *
+ */
+#define LOG_DEBUG(fmt,...) do {\
+ char _lbuf[256]; \
+ if (g_lds_debug> 5) {\
+ fprintf(stderr,"genaut (DEBUG): "); \
+ fprintf(stderr,fmt,__VA_ARGS__);\
+ fprintf(stderr," (main : %d)\n",__LINE__);\
+ }\
+} while (0)
+
+#define LOG_WARN(fmt,...) do {\
+ char _lbuf[256]; \
+ if (g_lds_debug> 5) {\
+ fprintf(stderr,"genaut (WARN): "); \
+ fprintf(stderr,fmt,__VA_ARGS__);\
+ fprintf(stderr," (main : %d)\n",__LINE__);\
+ }\
+} while (0)
+
+#define LOG_ERROR(fmt,...) do {\
+ char _lbuf[256]; \
+ if (g_lds_debug>= 0) {\
+ fprintf(stderr,"genaut (ERR): "); \
+ fprintf(stderr,fmt,__VA_ARGS__);\
+ fprintf(stderr," (main : %d)\n",__LINE__);\
+ }\
+} while (0)
+#else
+/**
+ *
+ */
+#define LOG_DEBUG(fmt,args...) do {\
+ char _lbuf[256]; \
+ if (g_lds_debug> 5) {\
+ fprintf(stderr,"genaut (DEBUG): "); \
+ fprintf(stderr,fmt,##args);\
+ fprintf(stderr," (main : %d)\n",__LINE__);\
+ }\
+} while (0)
+
+#define LOG_WARN(fmt,args...) do {\
+ char _lbuf[256]; \
+ if (g_lds_debug> 5) {\
+ fprintf(stderr,"genaut (WARN): "); \
+ fprintf(stderr,fmt,##args);\
+ fprintf(stderr," (main : %d)\n",__LINE__);\
+ }\
+} while (0)
+
+#define LOG_ERROR(fmt,args...) do {\
+ char _lbuf[256]; \
+ if (g_lds_debug>= 0) {\
+ fprintf(stderr,"genaut (ERR): "); \
+ fprintf(stderr,fmt,##args);\
+ fprintf(stderr," (main : %d)\n",__LINE__);\
+ }\
+} while (0)
+#endif
+
+/**
+ * BISON EXTERNALS
+ */
+extern int g_lds_debug;
+
+typedef void *yyscan_t;
+extern int lds_parse(yyscan_t);
+extern void lds_lex_init(yyscan_t *);
+extern void lds_lex_destroy(yyscan_t);
+
+extern int _start_cmake();
+extern FILE *lds_get_in(yyscan_t);
+extern FILE *lds_get_out(yyscan_t);
+extern void lds_set_out(FILE *,yyscan_t);
+extern void lds_set_in(FILE *,yyscan_t);
+extern "C" int lds_wrap(yyscan_t yyscanner);
+extern int lds_stack_ptr;
+
+
+/**
+ * GLOBAL LOCAL VARIABLES
+ */
+bool file_mode = true; // -f option set
+
+std::string odir;
+
+/**
+ * wrap function to handle multiple file parsing other than through stdin
+ */
+int lds_wrap(yyscan_t scanner)
+{
+ std::string fullname;
+ lds::parser *ldsp = lds::parser::instance();
+ if (lds_stack_ptr >0)
+ return 1;
+ // If they are files to parse, return 0, but first, close the current in, and open the new one
+ //if ((file_mode ) && lds_in != NULL)
+ if ((file_mode ) && lds_get_in(scanner) != NULL)
+ {
+ fclose(lds_get_in(scanner));
+ if (lds_get_out(scanner) != NULL && lds_get_out(scanner) != stdout) {
+ fclose(lds_get_out(scanner));
+ lds_set_out(NULL,scanner);
+ }
+ lds_set_in(NULL,scanner);
+ } else if (!file_mode)
+ {
+ LOG_DEBUG("lds_wrap() not file_mode");
+ return 1;
+ }
+ // Only process files if specified
+ if (ldsp->files().size() > 0)
+ {
+ LOG_DEBUG("lds_wrap() files in array : %lu",ldsp->files().size());
+ if (ldsp->includes().size() > 0)
+ {
+ LOG_DEBUG("lds_wrap have include");
+ std::list<std::string>::iterator it;
+ for ( it = ldsp->includes().begin()
+ ; it != ldsp->includes().end(); ++it)
+ {
+ fullname = (*it) + ldsp->files().back();
+
+ LOG_DEBUG("lds_wrap() lookup : %s",fullname.c_str());
+ if (!access(fullname.c_str(),F_OK))
+ break;
+ }
+ }
+ if (fullname.size() > 0)
+ {
+ LOG_DEBUG("lds_wrap() new file : %s",fullname.c_str());
+ lds_set_in(fopen(fullname.c_str(),"r"),scanner);
+ if (lds_get_in(scanner) != NULL)
+ {
+ /* Handle output */
+#if 0
+ std::string of = odir+"/"+ldsp->files().back();
+ lds_out = fopen(of.c_str(),"w");
+ if (lds_out == NULL)
+ {
+ std::cout<<"Failed open output "<<of<<std::endl;
+ } else
+ {
+ LOG_DEBUG("OUTPUT : %s",of.c_str());
+ }
+#endif
+ // Check if cmake
+ //
+ ldsp->files().pop_back();
+ return 0;
+ } else
+ {
+ LOG_ERROR("lds_wrap() Failed open file %s",fullname.c_str());
+ return 1;
+ }
+ } else
+ return 1;
+ } else
+ {
+ LOG_DEBUG("lds_wrap() array file empty");
+ }
+ return 1;
+}
+
+
+/**
+ * LDS parser class the is supposed to hide all
+ * the bison stuff and so on
+ */
+namespace lds
+{
+ /**
+ * Notify creation of construct part
+ */
+ template <typename T>
+ struct notif_construct
+ {
+ typedef void (parser_listener::*ptr)(T &t,int state);
+ notif_construct(T &c,ptr p ,int state)
+ : m_entity(c) , m_ptr(p),m_state(state)
+ { }
+
+ void operator ()(parser_listener *l)
+ {
+ (*l.*m_ptr)(m_entity,m_state);
+ }
+
+ T &m_entity;
+ ptr m_ptr;
+ int m_state;
+ } ;
+
+parser *lds::parser::m_parser = NULL;
+
+/**
+ *
+ */
+parser *parser::instance()
+{
+ if (m_parser == NULL)
+ m_parser = new parser();
+ return m_parser;
+}
+
+/**
+ *
+ */
+parser::parser()
+{
+}
+
+/**
+ *
+ */
+parser::parser(const parser &p)
+{
+}
+
+/**
+ *
+ */
+void
+parser::register_listener(lds::parser_listener *l)
+{
+ m_listeners.push_back(l);
+}
+
+/**
+ *
+ */
+int
+parser::parse()
+{
+ int ret = 0;
+ yyscan_t scanner;
+ lds_lex_init(&scanner);
+ //lds_in = NULL;
+ if ( ! lds_wrap(scanner) )
+ {
+ lds_parse(scanner);
+ ret = 1;
+ } else
+ {
+ ret = 0;
+ }
+ lds_lex_destroy(scanner);
+ return ret;
+}
+
+/**
+ *
+ */
+bool
+parser::find_file(const char *f,std::string &fullname)
+{
+ bool ret = false;
+ std::string fn(f);
+ std::list<std::string>::iterator it;
+ for ( it = includes().begin()
+ ; it != includes().end(); ++it)
+ {
+ fullname = (*it) + fn +".lds";
+
+ LOG_DEBUG("parser::find_file(%s) lookup : %s",f,fullname.c_str());
+ if (!access(fullname.c_str(),F_OK))
+ {
+ ret = true;
+ break;
+ }
+ }
+ return ret;
+}
+
+/**
+ *
+ */
+void
+parser::set_output_dir(const std::string &o)
+{
+ odir = o;
+}
+
+AST::VarDecl *
+parser::create_variable(AST::DeclContext *m_CurrentDC,AST::TranslationUnitDecl *tu,AST::StringLiteral *v, AST::Type *sTy)
+{
+ AST::VarDecl *result = NULL;
+ result = AST::VarDecl::Create(m_CurrentDC,v->getString(),sTy);
+ return result;
+}
+
+
+void
+parser::function_complete(AST::DeclContext *m_CurrentDC,AST::TranslationUnitDecl *tu,AST::FunctionDecl *fct,AST::ParenListExpr *args)
+{
+ if (args == NULL)
+ return ;
+
+ AST::StmtRange range = args->children();
+ for ( ; ! range.empty(); ++range)
+ {
+ AST::StringLiteral *it = dynamic_cast<AST::StringLiteral *>(*range);
+ if (it != NULL)
+ {
+ /* Lookup has already be perfomed at primary level Its a constant String */
+ LOG_ERROR("fonction_complete: action simple function call %s StringLiteral parameter %s"
+ , fct->getName().c_str(),it->getString().c_str());
+ /* Parameter is string Literral Not always true */
+ AST::Type * vTy = &tu->getASTContext().StringTy;
+ /* May be find a global constant ... or something like that */
+ AST::DeclContext::lookup_result r = m_CurrentDC->lookup(it->getString());
+ if ( r.size() == 0 )
+ {
+ LOG_ERROR("function_complete: action_name simple function call %s undeclared parameter %s"
+ , fct->getName().c_str(),it->getString().c_str());
+ } else
+ {
+ }
+ AST::ParmVarDecl *var =
+ AST::ParmVarDecl::Create(m_CurrentDC,it->getString(),vTy);
+ fct->add_param(var);
+ }
+ else if (AST::ParmVarDecl *pv = dynamic_cast<AST::ParmVarDecl *>((*range)))
+ {
+ LOG_DEBUG("function_complete: %s declared parameter ParmVar %s ",fct->getName().c_str(),pv->getName().c_str());
+ fct->add_param(pv);
+ }
+ else if (AST::DeclRefExpr *ref = dynamic_cast<AST::DeclRefExpr *>((*range)))
+ {
+ AST::ValueDecl *vd = dynamic_cast<AST::ValueDecl *>(ref->getDecl());
+ LOG_DEBUG("function_complete: %s declared parameter Var %s Has Type=%d",fct->getName().c_str(),vd->getName().c_str(),(vd->getType()!=NULL));
+ AST::ParmVarDecl *var =
+ AST::ParmVarDecl::Create(m_CurrentDC,vd->getName(),vd->getType());
+ fct->add_param(var);
+ } else {
+ LOG_ERROR("function_complete: action simple function call %s BIG",fct->getName().c_str());
+ }
+ }
+}
+
+
+
+
+#define DEF_DECL(cls,code) \
+ void parser::got_##cls(AST::cls &d,int state) \
+ { \
+ notif_construct<AST::cls> notif(d \
+ ,&parser_listener::on_##cls,state); \
+ std::for_each( m_listeners.begin() \
+ , m_listeners.end() \
+ , notif); \
+ code \
+ }
+
+DEF_DECL(TranslationUnitDecl,{})
+//DEF_DECL(BlockDecl,{})
+//DEF_DECL(TypeDecl,{})
+DEF_DECL(NamedDecl,{})
+DEF_DECL(ChannelDecl,{})
+DEF_DECL(ChannelPathDecl,{})
+DEF_DECL(ChannelEndPointDecl,{})
+DEF_DECL(RefStateDecl,{})
+DEF_DECL(LabelDecl,{})
+DEF_DECL(BlockTypeDecl,{})
+DEF_DECL(SystemTypeDecl,{})
+DEF_DECL(AutomatonTypeDecl,{})
+
+DEF_DECL(EnumDecl,{})
+DEF_DECL(TypedefDecl,{})
+DEF_DECL(ValueTypeDecl,{})
+DEF_DECL(ValueDecl,{})
+DEF_DECL(VarDecl,{})
+DEF_DECL(ParmVarDecl,{})
+DEF_DECL(FunctionDecl,{})
+DEF_DECL(TransitionDecl,{})
+DEF_DECL(FieldDecl,{})
+DEF_DECL(RecordDecl,{})
+DEF_DECL(StateDecl,{})
+DEF_DECL(EventDecl,{})
+DEF_DECL(AutomatonDecl,{})
+DEF_DECL(SystemDecl,{})
+DEF_DECL(BlockDecl,{})
+DEF_DECL(PackageDecl,{})
+
+# define DEF_STMT(Type,Base) DEF_DECL(Type,Base)
+
+DEF_STMT(SwitchCaseStmt,{})
+DEF_STMT(BreakStmt,{})
+DEF_STMT(ReturnStmt,{})
+DEF_STMT(DeclStmt,{})
+DEF_STMT(LabelStmt,{})
+DEF_STMT(GotoStmt,{})
+DEF_STMT(ForStmt,{})
+DEF_STMT(WhileStmt,{})
+DEF_STMT(SwitchStmt,{})
+DEF_STMT(IfStmt,{})
+DEF_STMT(OutputStmt,{
+ /* Check Parameters */
+ })
+DEF_STMT(AsmStmt,{})
+DEF_STMT(LdsAsmStmt,{})
+DEF_STMT(CompoundStmt,{})
+
+# define DEF_EXPR(Type,Base) DEF_STMT(Type,Base)
+
+DEF_EXPR(ParenExpr,{})
+DEF_EXPR(ParenListExpr,{})
+DEF_EXPR(CallExpr,{
+#if 0
+ std::cout<<"gotCallExpr "<<d.getCalleeDecl()->getName()<<std::endl;
+#endif
+ })
+DEF_EXPR(CreateExpr,{})
+DEF_EXPR(DeclRefExpr,{})
+DEF_EXPR(StringLiteral,{})
+DEF_EXPR(IntegerLiteral,{})
+DEF_EXPR(FloatLiteral,{})
+DEF_EXPR(BinaryOperator,{})
+DEF_EXPR(UnaryOperator,{})
+DEF_EXPR(ConditionalOperator,{})
+
+
+
+}
--- /dev/null
+#ifndef LDS_PARSER_H
+#define LDS_PARSER_H
+
+typedef std::vector<AST::StringLiteral *> StrArray;
+typedef StrArray::iterator SA_iterator;
+typedef StrArray::const_iterator SAC_iterator;
+
+typedef std::vector<AST::Type *> TypeArray;
+typedef TypeArray::iterator TA_iterator;
+typedef TypeArray::const_iterator TAC_iterator;
+
+typedef std::vector<AST::Expr *> ExprArray;
+typedef ExprArray::iterator EA_iterator;
+typedef ExprArray::const_iterator EAC_iterator;
+
+namespace lds {
+ /**
+ * This class will be used by the bison parser
+ * to generate events that can be processed
+ * by a third party application
+ * The LDS AST builder should be a listener registered to
+ * parser
+ */
+ class parser
+ {
+ public:
+ typedef std::list<lds::parser_listener *> ListenerList;
+ typedef ListenerList::iterator listerner_iterator;
+ typedef std::list<std::string> StringList;
+
+ enum eState { eBEGIN,END};
+
+ static parser *instance();
+#define DECL(cls,p) \
+ void got_##cls(AST::cls &t,int state = END);
+#include "AST/Decl.h.inc"
+
+#define STMT(cls,p) \
+ void got_##cls(AST::cls &t,int state = END) ;
+#include "AST/Stmt.h.inc"
+
+
+ /**
+ *
+ */
+ void register_listener(lds::parser_listener *);
+ /**
+ *
+ */
+ void set_search_path(const std::string &s);
+ /**
+ * Parser one file
+ */
+ int parse(const std::list<std::string> &file_list);
+ /**
+ * Parser one file
+ */
+ int parse(const std::string &file_list);
+ /**
+ * Parse
+ */
+ int parse();
+
+ inline StringList &includes() { return m_includes ;};
+
+ inline StringList &files() { return m_files ;};
+
+ void set_output_dir(const std::string &o);
+
+ bool find_file(const char *f,std::string &full_name);
+ AST::VarDecl *create_variable(AST::DeclContext *DC,AST::TranslationUnitDecl *tu,AST::StringLiteral *v,AST::Type *sTy);
+ /**
+ * In transitions, call create_event for each event that occurs
+ */
+ AST::VarDecl *create_event(AST::DeclContext *DC,AST::TranslationUnitDecl *tu,AST::StringLiteral *v,AST::Type *sTy);
+ /**
+ * Add Parameters to Function
+ * AST::ParenListExpr *args = dynamic_cast<AST::ParenListExpr *>($2);
+ * AST::FunctionDecl *fct = dynamic_cast<AST::FunctionDecl *>($1);
+ */
+ void function_complete(AST::DeclContext *DC,AST::TranslationUnitDecl *tu,AST::FunctionDecl *fct,AST::ParenListExpr *args);
+
+ protected:
+ static parser *m_parser;
+ ListenerList m_listeners;
+ StringList m_includes;
+ StringList m_files;
+ std::string m_output_dir;
+ private:
+ parser();
+ parser(const parser &p);
+ };
+}
+#endif /*LDS_PARSER_H*/
--- /dev/null
+#ifndef LDS_PARSER_LISTENER_H
+#define LDS_PARSER_LISTENER_H
+namespace lds
+{
+
+ /**
+ * LDS parser Listerner interface
+ * All applications that intend to retrieve events
+ * from the parser will inherit from this interface
+ */
+ class parser_listener
+ {
+ public:
+ parser_listener() {};
+ // Define the events state begin , end
+ // Transition begin / end
+ // On Action
+ // On gate
+ // On Event
+ // On ...
+#define DECL(cls,p) \
+ virtual void on_##cls(AST::cls &t,int state) {};
+#include "AST/Decl.h.inc"
+
+#define STMT(cls,p) \
+ virtual void on_##cls(AST::cls &t,int state) {};
+#include "AST/Stmt.h.inc"
+
+ };
+
+}
+
+#endif /*LDS_PARSER_LISTENER_H*/
--- /dev/null
+#include <iostream>
+#include <fstream>
+#include <sstream>
+#include <string.h>
+#include <map>
+#include <list>
+#include <vector>
+#include <algorithm>
+
+// For open / clise
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <fcntl.h>
+// for access function I need unistd
+
+// #include <unistd.h>
+#include <stdlib.h>
+
+#include "optionparser.h"
+
+#include "AST/Stmt.h"
+#include "AST/Expr.h"
+#include "AST/Decl.h"
+#include "AST/Type.h"
+#include "AST/ASTContext.h"
+
+#include "AST/ASTRecursiveVisitor.h"
+#include "IR/Module.h"
+//
+#include "gen_lpcm_aac.h"
+#include "gen_lpcm.h"
+//
+#include "LDSBytecode/AutomatonBytecode.h"
+#include "libparser/lds_parser_listener.h"
+#include "libparser/lds_parser.h"
+
+extern AST::TranslationUnitDecl *m_RootTranslationUnit;
+
+extern int g_lds_debug;
+
+
+#if defined(_WIN32)
+/**
+ *
+ */
+#define LOG_DEBUG(fmt,...) do {\
+ char _lbuf[256]; \
+ if (g_lds_debug> 5) {\
+ fprintf(stderr,"genaut (DEBUG): "); \
+ fprintf(stderr,fmt,__VA_ARGS__);\
+ fprintf(stderr," (main : %d)\n",__LINE__);\
+ }\
+} while (0)
+
+#define LOG_WARN(fmt,...) do {\
+ char _lbuf[256]; \
+ if (g_lds_debug> 5) {\
+ fprintf(stderr,"genaut (WARN): "); \
+ fprintf(stderr,fmt,__VA_ARGS__);\
+ fprintf(stderr," (main : %d)\n",__LINE__);\
+ }\
+} while (0)
+
+#define LOG_ERROR(fmt,...) do {\
+ char _lbuf[256]; \
+ if (g_lds_debug>= 0) {\
+ fprintf(stderr,"genaut (ERR): "); \
+ fprintf(stderr,fmt,__VA_ARGS__);\
+ fprintf(stderr," (main : %d)\n",__LINE__);\
+ }\
+} while (0)
+#else
+/**
+ *
+ */
+#define LOG_DEBUG(fmt,args...) do {\
+ char _lbuf[256]; \
+ if (g_lds_debug> 5) {\
+ fprintf(stderr,"genaut (DEBUG): "); \
+ fprintf(stderr,fmt,##args);\
+ fprintf(stderr," (main : %d)\n",__LINE__);\
+ }\
+} while (0)
+
+#define LOG_WARN(fmt,args...) do {\
+ char _lbuf[256]; \
+ if (g_lds_debug> 5) {\
+ fprintf(stderr,"genaut (WARN): "); \
+ fprintf(stderr,fmt,##args);\
+ fprintf(stderr," (main : %d)\n",__LINE__);\
+ }\
+} while (0)
+
+#define LOG_ERROR(fmt,args...) do {\
+ char _lbuf[256]; \
+ if (g_lds_debug>= 0) {\
+ fprintf(stderr,"genaut (ERR): "); \
+ fprintf(stderr,fmt,##args);\
+ fprintf(stderr," (main : %d)\n",__LINE__);\
+ }\
+} while (0)
+
+#endif
+
+
+/**
+ * Vistor Test
+ */
+class VisitingAST : public AST::RecursiveVisitor<VisitingAST> {
+ public:
+ VisitingAST() {
+
+ };
+
+
+ bool VisitAutomatonDecl(AST::AutomatonDecl *s) {
+ std::cout<<"Visit Automaton : "<<s->getName()<<std::endl;
+ return true;
+ }
+ bool VisitFunctionDecl(AST::FunctionDecl *d) {
+ std::cout<<"VisitFunctionDecl Got Function "<< d->getName()<<std::endl;
+ return true;
+ }
+#if 0
+ bool VisitDecl(AST::Decl *d) {
+ std::cout<<"Got Decl"<<std::endl;
+ return true;
+ }
+ bool TraverseTranslationUnitDecl(AST::TranslationUnitDecl *d) {
+ std::cout<<"Got TranslationUnit : "<<std::endl;
+ AST::DeclContext::decl_iterator b,e;
+ for ( b = d->begin() ; b != d->end() ; ++b)
+ {
+ std::cout<<"Traverse::"<<std::endl;
+ TraverseDecl(*b);
+ }
+ }
+#endif
+ bool VisitTranslationUnitDecl(AST::TranslationUnitDecl *d) {
+ std::cout<<"Visit TranslationUnit : "<<std::endl;
+ return true ;
+ }
+ bool VisitStmt(AST::Stmt *s) {
+ // std::cout<<"Visit Stmt class "<<s->getStmtClass()<<std::endl;
+ switch (s->getStmtClass()) {
+ case AST::Stmt::ReturnStmtClass:
+ break;
+ case AST::Stmt::CompoundStmtClass:
+ break;
+ default:
+ std::cout<<"Visit Stmt class "<<s->getStmtClass()<<std::endl;
+ //std::cout<<"Visit Stmt"<<std::endl;
+ }
+ return true;
+ }
+
+ bool VisitReturnStmt(AST::ReturnStmt *s) {
+ std::cout<<"Visit ReturnStmt"<<std::endl;
+ return true;
+ }
+
+ bool VisitStateDecl(AST::StateDecl *d) {
+ std::cout<<"Visit State : "<<d->getName()<<std::endl;
+ return true;
+ }
+
+};
+
+
+static bool file_mode = false; // -f option set
+static std::string odir;
+
+enum optionIndex {UNKNOWN, HELP, DBG,FICHIER,OUTPUT,INCLUDE,GENERATOR,OPT_END};
+const option::Descriptor usage[] = {
+ {UNKNOWN, 0, "", "", option::Arg::None,"This is genaut an automaton compiler.\nUsage:\n genaut [options] -I ./ -f <automaton file> -o <output dir>\n"
+ " genaut -o Dist -f toto.lds -G lpcm1 -I ./\nOptions:\n"},
+ {HELP, 0, "h", "help",option::Arg::None," --help,-h \t\tPrint help and quit."},
+ {DBG, 0, "d", "debug",option::Arg::Optional," --debug,-d \t\tDebug mode. takes a parameters from 2 to 8"},
+ {FICHIER, 0, "f", "file", option::Arg::Required," --file,-f \t\tC/C++ input file to parse"},
+ {OUTPUT, 0, "o", "ouput", option::Arg::Required," --output,-o \t\toutput directory"},
+ {INCLUDE, 0, "I", "include", option::Arg::Required," --include,-I\t\tInclude path to look for other asn1 files."},
+ {GENERATOR, 0, "G", "generator", option::Arg::Required," --generator,-G\t\t[lpcm,lpcm1,ldsvm,ir] Generator to be used for output"},
+ {0,0,0,0,0,0}
+};
+
+
+/**
+ * MAIN Entry point
+ *
+ */
+int main(int argc,char **argv)
+{
+ std::string umlname;
+ std::fstream umlos;
+ // Option stuff must go here
+ option::Stats stats(usage,argc-1,&argv[1]);
+ const int max(stats.options_max);
+ option::Option options[OPT_END*2],buffer[OPT_END*3];
+ option::Parser parser(usage,argc-1,&argv[1],options,buffer);
+ lds::parser *ldsp = lds::parser::instance();
+ AST::ASTContext m_ASTContext;
+
+ m_RootTranslationUnit = m_ASTContext.getTranslationUnitDecl();
+
+ if (parser.error()) {
+ return 1;
+ }
+ if (options[HELP] )
+ {
+ option::printUsage(std::cout,usage);
+ return 1;
+ }
+ if (options[INCLUDE])
+ {
+ for (option::Option *opts = options[INCLUDE] ;opts; opts = opts->next()) {
+ if (opts->arg)
+ ldsp->includes().push_back(std::string(opts->arg));
+ }
+ }
+ if (options[DBG] && ((option::Option *)options[DBG])->arg) {
+ g_lds_debug = atol(((option::Option *)options[DBG])->arg);
+ LOG_DEBUG("debug level set to %d",g_lds_debug);
+ } else {
+ g_lds_debug = 1;
+ }
+ if (options[FICHIER] )
+ {
+ for (option::Option *opts = options[FICHIER] ;opts; opts = opts->next())
+ {
+ if (opts->arg)
+ ldsp->files().push_back(std::string(opts->arg));
+ }
+ file_mode = true;
+ if (options[OUTPUT] && ((option::Option *)options[OUTPUT])->arg)
+ {
+ odir = ((option::Option *)options[OUTPUT])->arg;
+ ldsp->set_output_dir(((option::Option *)options[OUTPUT])->arg);
+ LOG_DEBUG("odir = %s",odir.c_str());
+ } else {
+ LOG_WARN("Option OUTPUT needs a directory");
+ return 1;
+ }
+ LOG_DEBUG("Start parsing using wrap");
+ if (! ldsp->parse())
+ {
+ LOG_ERROR("parsing failed. could not find file");
+ option::printUsage(std::cout,usage);
+ }
+ } else {
+ // Parsing of stdin this might change in the future
+ option::printUsage(std::cout,usage);
+ }
+
+ LOG_DEBUG("End of parsing %s",argv[0]);
+ if (options[GENERATOR] )
+ {
+ for (option::Option *opts = options[GENERATOR] ;opts; opts = opts->next())
+ {
+ if (! std::string(opts->arg).compare("lpcm"))
+ {
+ VisitingAST v;
+ gen_lpcm g(m_ASTContext,odir,m_RootTranslationUnit);
+ g.gen_all();
+ }
+ if (! std::string(opts->arg).compare("lpcm1"))
+ {
+ VisitingAST v;
+ gen_lpcm g(m_ASTContext,odir,m_RootTranslationUnit,1);
+ g.gen_all();
+ }
+
+ if (! std::string(opts->arg).compare("ldsvm"))
+ {
+ std::cout<<"Generate LDSVM code"<<std::endl;
+ lds::AutomatonBytecode obc(std::cout);
+ obc.Generate(m_RootTranslationUnit);
+ }
+ //
+ if (! std::string(opts->arg).compare("ir"))
+ {
+ std::cout<<"Generate LDSVM code"<<std::endl;
+ }
+ }
+ }
+#if 0
+ // To be removed
+ VisitingAST v;
+ // v.TraverseDecl(m_RootTranslationUnit);
+ gen_lpcm g(odir,m_RootTranslationUnit);
+ g.gen_all();
+#endif
+}
+/**
+ * ex: set et sw=4 ts=4 list:
+ */
--- /dev/null
+/* XPM */
+static char *align_center[] = {
+/* columns rows colors chars-per-pixel */
+"24 24 256 2 ",
+" c None",
+". c #FEFEFE",
+"X c #FDFDFD",
+"o c #FCFAFA",
+"O c #FBFBFB",
+"+ c gray98",
+"@ c #F7F5F5",
+"# c gray96",
+"$ c #F4F4F4",
+"% c gray95",
+"& c #F1F1F1",
+"* c gray94",
+"= c #EFEFEF",
+"- c #EEEEEE",
+"; c gray93",
+": c #ECECEC",
+"> c gray92",
+", c #EAEAEA",
+"< c #BCBDBD",
+"1 c #BCBCBC",
+"2 c #BCB9B9",
+"3 c #BAB7B7",
+"4 c #B5B6B6",
+"5 c gray56",
+"6 c #848484",
+"7 c gray46",
+"8 c #747474",
+"9 c DimGray",
+"0 c gray38",
+"q c #505050",
+"w c gray31",
+"e c #4E4E4E",
+"r c gray30",
+"t c #4B4B4B",
+"y c #494949",
+"u c #484848",
+"i c gray28",
+"p c gray27",
+"a c #444444",
+"s c #434343",
+"d c gray26",
+"f c gray25",
+"g c #403F3F",
+"h c #3F3F3F",
+"j c #3E3E3E",
+"k c gray24",
+"l c #3C3C3C",
+"z c #3B3C3C",
+"x c gray23",
+"c c #3A3A3A",
+"v c black",
+"b c black",
+"n c black",
+"m c black",
+"M c black",
+"N c black",
+"B c black",
+"V c black",
+"C c black",
+"Z c black",
+"A c black",
+"S c black",
+"D c black",
+"F c black",
+"G c black",
+"H c black",
+"J c black",
+"K c black",
+"L c black",
+"P c black",
+"I c black",
+"U c black",
+"Y c black",
+"T c black",
+"R c black",
+"E c black",
+"W c black",
+"Q c black",
+"! c black",
+"~ c black",
+"^ c black",
+"/ c black",
+"( c black",
+") c black",
+"_ c black",
+"` c black",
+"' c black",
+"] c black",
+"[ c black",
+"{ c black",
+"} c black",
+"| c black",
+" . c black",
+".. c black",
+"X. c black",
+"o. c black",
+"O. c black",
+"+. c black",
+"@. c black",
+"#. c black",
+"$. c black",
+"%. c black",
+"&. c black",
+"*. c black",
+"=. c black",
+"-. c black",
+";. c black",
+":. c black",
+">. c black",
+",. c black",
+"<. c black",
+"1. c black",
+"2. c black",
+"3. c black",
+"4. c black",
+"5. c black",
+"6. c black",
+"7. c black",
+"8. c black",
+"9. c black",
+"0. c black",
+"q. c black",
+"w. c black",
+"e. c black",
+"r. c black",
+"t. c black",
+"y. c black",
+"u. c black",
+"i. c black",
+"p. c black",
+"a. c black",
+"s. c black",
+"d. c black",
+"f. c black",
+"g. c black",
+"h. c black",
+"j. c black",
+"k. c black",
+"l. c black",
+"z. c black",
+"x. c black",
+"c. c black",
+"v. c black",
+"b. c black",
+"n. c black",
+"m. c black",
+"M. c black",
+"N. c black",
+"B. c black",
+"V. c black",
+"C. c black",
+"Z. c black",
+"A. c black",
+"S. c black",
+"D. c black",
+"F. c black",
+"G. c black",
+"H. c black",
+"J. c black",
+"K. c black",
+"L. c black",
+"P. c black",
+"I. c black",
+"U. c black",
+"Y. c black",
+"T. c black",
+"R. c black",
+"E. c black",
+"W. c black",
+"Q. c black",
+"!. c black",
+"~. c black",
+"^. c black",
+"/. c black",
+"(. c black",
+"). c black",
+"_. c black",
+"`. c black",
+"'. c black",
+"]. c black",
+"[. c black",
+"{. c black",
+"}. c black",
+"|. c black",
+" X c black",
+".X c black",
+"XX c black",
+"oX c black",
+"OX c black",
+"+X c black",
+"@X c black",
+"#X c black",
+"$X c black",
+"%X c black",
+"&X c black",
+"*X c black",
+"=X c black",
+"-X c black",
+";X c black",
+":X c black",
+">X c black",
+",X c black",
+"<X c black",
+"1X c black",
+"2X c black",
+"3X c black",
+"4X c black",
+"5X c black",
+"6X c black",
+"7X c black",
+"8X c black",
+"9X c black",
+"0X c black",
+"qX c black",
+"wX c black",
+"eX c black",
+"rX c black",
+"tX c black",
+"yX c black",
+"uX c black",
+"iX c black",
+"pX c black",
+"aX c black",
+"sX c black",
+"dX c black",
+"fX c black",
+"gX c black",
+"hX c black",
+"jX c black",
+"kX c black",
+"lX c black",
+"zX c black",
+"xX c black",
+"cX c black",
+"vX c black",
+"bX c black",
+"nX c black",
+"mX c black",
+"MX c black",
+"NX c black",
+"BX c black",
+"VX c black",
+"CX c black",
+"ZX c black",
+"AX c black",
+"SX c black",
+"DX c black",
+"FX c black",
+"GX c black",
+"HX c black",
+"JX c black",
+"KX c black",
+"LX c black",
+"PX c black",
+"IX c black",
+"UX c black",
+/* pixels */
+" ",
+" ",
+" ",
+" @ = = = @ = = @ = = @ ",
+" = q h h h h h h h h h h 4 ",
+" @ 7 w w w w w w w w w w < ",
+" @ = = @ = = = = = = = = = = = = = @ ",
+" 6 h h h h i h i h i h h h h i h h h 3 ",
+" 5 i i i w w w w w w w w w w w w i i 4 ",
+" @ @ = = = = = = = = = = = ",
+" @ 0 h i h h h h i h i h 3 ",
+" @ 7 w w w w w w w w w w < ",
+" @ = = = = = = = = = = = = = = = = @ ",
+" 6 h h h h i h i h i h h h h i h h h 4 ",
+" 5 i i i w w w w w w w w w w w w i i 4 ",
+" @ = = = = = = = = = = = = ",
+" = 0 h h h h h h i h i h 3 ",
+" @ 7 w w w w w w w w w w < ",
+" @ = = = = = = = = = = = = = = = = = ",
+" 6 h h h h i h i h i h h h h i h h h 3 ",
+" 5 i i i w i i i i i w i w i i i i w 4 ",
+" @ @ @ @ ",
+" ",
+" "
+};
--- /dev/null
+/* XPM */
+static char *align_left[] = {
+/* columns rows colors chars-per-pixel */
+"24 24 256 2 ",
+" c None",
+". c gray97",
+"X c #EFEFEF",
+"o c #BCBCBC",
+"O c #B7B7B7",
+"+ c #8E8E8E",
+"@ c #878585",
+"# c #757474",
+"$ c #656565",
+"% c #525151",
+"& c #504F4F",
+"* c gray31",
+"= c #474646",
+"- c #3F3F3F",
+"; c black",
+": c #FEFCFC",
+"> c black",
+", c black",
+"< c black",
+"1 c black",
+"2 c black",
+"3 c black",
+"4 c black",
+"5 c black",
+"6 c black",
+"7 c black",
+"8 c black",
+"9 c black",
+"0 c black",
+"q c black",
+"w c black",
+"e c black",
+"r c black",
+"t c black",
+"y c black",
+"u c black",
+"i c black",
+"p c black",
+"a c black",
+"s c black",
+"d c black",
+"f c black",
+"g c black",
+"h c black",
+"j c black",
+"k c black",
+"l c black",
+"z c black",
+"x c black",
+"c c black",
+"v c black",
+"b c black",
+"n c black",
+"m c black",
+"M c black",
+"N c black",
+"B c black",
+"V c black",
+"C c black",
+"Z c black",
+"A c black",
+"S c black",
+"D c black",
+"F c black",
+"G c black",
+"H c black",
+"J c black",
+"K c black",
+"L c black",
+"P c black",
+"I c black",
+"U c black",
+"Y c black",
+"T c black",
+"R c black",
+"E c black",
+"W c black",
+"Q c black",
+"! c black",
+"~ c black",
+"^ c black",
+"/ c black",
+"( c black",
+") c black",
+"_ c black",
+"` c black",
+"' c black",
+"] c black",
+"[ c black",
+"{ c black",
+"} c black",
+"| c black",
+" . c black",
+".. c black",
+"X. c black",
+"o. c black",
+"O. c black",
+"+. c black",
+"@. c black",
+"#. c black",
+"$. c black",
+"%. c black",
+"&. c black",
+"*. c black",
+"=. c black",
+"-. c black",
+";. c black",
+":. c black",
+">. c black",
+",. c black",
+"<. c black",
+"1. c black",
+"2. c black",
+"3. c black",
+"4. c black",
+"5. c black",
+"6. c black",
+"7. c black",
+"8. c black",
+"9. c black",
+"0. c black",
+"q. c black",
+"w. c black",
+"e. c black",
+"r. c black",
+"t. c black",
+"y. c black",
+"u. c black",
+"i. c black",
+"p. c black",
+"a. c black",
+"s. c black",
+"d. c black",
+"f. c black",
+"g. c black",
+"h. c black",
+"j. c black",
+"k. c black",
+"l. c black",
+"z. c black",
+"x. c black",
+"c. c black",
+"v. c black",
+"b. c black",
+"n. c black",
+"m. c black",
+"M. c black",
+"N. c black",
+"B. c black",
+"V. c black",
+"C. c black",
+"Z. c black",
+"A. c black",
+"S. c black",
+"D. c black",
+"F. c black",
+"G. c black",
+"H. c black",
+"J. c black",
+"K. c black",
+"L. c black",
+"P. c black",
+"I. c black",
+"U. c black",
+"Y. c black",
+"T. c black",
+"R. c black",
+"E. c black",
+"W. c black",
+"Q. c black",
+"!. c black",
+"~. c black",
+"^. c black",
+"/. c black",
+"(. c black",
+"). c black",
+"_. c black",
+"`. c black",
+"'. c black",
+"]. c black",
+"[. c black",
+"{. c black",
+"}. c black",
+"|. c black",
+" X c black",
+".X c black",
+"XX c black",
+"oX c black",
+"OX c black",
+"+X c black",
+"@X c black",
+"#X c black",
+"$X c black",
+"%X c black",
+"&X c black",
+"*X c black",
+"=X c black",
+"-X c black",
+";X c black",
+":X c black",
+">X c black",
+",X c black",
+"<X c black",
+"1X c black",
+"2X c black",
+"3X c black",
+"4X c black",
+"5X c black",
+"6X c black",
+"7X c black",
+"8X c black",
+"9X c black",
+"0X c black",
+"qX c black",
+"wX c black",
+"eX c black",
+"rX c black",
+"tX c black",
+"yX c black",
+"uX c black",
+"iX c black",
+"pX c black",
+"aX c black",
+"sX c black",
+"dX c black",
+"fX c black",
+"gX c black",
+"hX c black",
+"jX c black",
+"kX c black",
+"lX c black",
+"zX c black",
+"xX c black",
+"cX c black",
+"vX c black",
+"bX c black",
+"nX c black",
+"mX c black",
+"MX c black",
+"NX c black",
+"BX c black",
+"VX c black",
+"CX c black",
+"ZX c black",
+"AX c black",
+"SX c black",
+"DX c black",
+"FX c black",
+"GX c black",
+"HX c black",
+"JX c black",
+"KX c black",
+"LX c black",
+"PX c black",
+"IX c black",
+"UX c black",
+/* pixels */
+" ",
+" ",
+" ",
+" - - - - - - - - - - - ",
+" - - - - - - - - - - - ",
+" ",
+" - - - - - - - - - - - - - - - - - - ",
+" - - - - - - - - - - - - - - - - - - ",
+" ",
+" - - - - - - - - - - - ",
+" - - - - - - - - - - - ",
+" ",
+" - - - - - - - - - - - - - - - - - - ",
+" - - - - - - - - - - - - - - - - - - ",
+" ",
+" - - - - - - - - - - - ",
+" - - - - - - - - - - - ",
+" ",
+" - - - - - - - - - - - - - - - - - - ",
+" - - - - - - - - - - - - - - - - - - ",
+" ",
+" ",
+" ",
+" "
+};
--- /dev/null
+/* XPM */
+static char *align_right[] = {
+/* columns rows colors chars-per-pixel */
+"24 24 256 2 ",
+" c None",
+". c gray39",
+"X c gray45",
+"o c gray55",
+"O c gray61",
+"+ c gray68",
+"@ c gray74",
+"# c #C6C6C6",
+"$ c #D6CECE",
+"% c black",
+"& c black",
+"* c black",
+"= c black",
+"- c black",
+"; c black",
+": c black",
+"> c black",
+", c black",
+"< c black",
+"1 c black",
+"2 c black",
+"3 c black",
+"4 c black",
+"5 c black",
+"6 c black",
+"7 c black",
+"8 c black",
+"9 c black",
+"0 c black",
+"q c black",
+"w c black",
+"e c black",
+"r c black",
+"t c black",
+"y c black",
+"u c black",
+"i c black",
+"p c black",
+"a c black",
+"s c black",
+"d c black",
+"f c black",
+"g c black",
+"h c black",
+"j c black",
+"k c black",
+"l c black",
+"z c black",
+"x c black",
+"c c black",
+"v c black",
+"b c black",
+"n c black",
+"m c black",
+"M c black",
+"N c black",
+"B c black",
+"V c black",
+"C c black",
+"Z c black",
+"A c black",
+"S c black",
+"D c black",
+"F c black",
+"G c black",
+"H c black",
+"J c black",
+"K c black",
+"L c black",
+"P c black",
+"I c black",
+"U c black",
+"Y c black",
+"T c black",
+"R c black",
+"E c black",
+"W c black",
+"Q c black",
+"! c black",
+"~ c black",
+"^ c black",
+"/ c black",
+"( c black",
+") c black",
+"_ c black",
+"` c black",
+"' c black",
+"] c black",
+"[ c black",
+"{ c black",
+"} c black",
+"| c black",
+" . c black",
+".. c black",
+"X. c black",
+"o. c black",
+"O. c black",
+"+. c black",
+"@. c black",
+"#. c black",
+"$. c black",
+"%. c black",
+"&. c black",
+"*. c black",
+"=. c black",
+"-. c black",
+";. c black",
+":. c black",
+">. c black",
+",. c black",
+"<. c black",
+"1. c black",
+"2. c black",
+"3. c black",
+"4. c black",
+"5. c black",
+"6. c black",
+"7. c black",
+"8. c black",
+"9. c black",
+"0. c black",
+"q. c black",
+"w. c black",
+"e. c black",
+"r. c black",
+"t. c black",
+"y. c black",
+"u. c black",
+"i. c black",
+"p. c black",
+"a. c black",
+"s. c black",
+"d. c black",
+"f. c black",
+"g. c black",
+"h. c black",
+"j. c black",
+"k. c black",
+"l. c black",
+"z. c black",
+"x. c black",
+"c. c black",
+"v. c black",
+"b. c black",
+"n. c black",
+"m. c black",
+"M. c black",
+"N. c black",
+"B. c black",
+"V. c black",
+"C. c black",
+"Z. c black",
+"A. c black",
+"S. c black",
+"D. c black",
+"F. c black",
+"G. c black",
+"H. c black",
+"J. c black",
+"K. c black",
+"L. c black",
+"P. c black",
+"I. c black",
+"U. c black",
+"Y. c black",
+"T. c black",
+"R. c black",
+"E. c black",
+"W. c black",
+"Q. c black",
+"!. c black",
+"~. c black",
+"^. c black",
+"/. c black",
+"(. c black",
+"). c black",
+"_. c black",
+"`. c black",
+"'. c black",
+"]. c black",
+"[. c black",
+"{. c black",
+"}. c black",
+"|. c black",
+" X c black",
+".X c black",
+"XX c black",
+"oX c black",
+"OX c black",
+"+X c black",
+"@X c black",
+"#X c black",
+"$X c black",
+"%X c black",
+"&X c black",
+"*X c black",
+"=X c black",
+"-X c black",
+";X c black",
+":X c black",
+">X c black",
+",X c black",
+"<X c black",
+"1X c black",
+"2X c black",
+"3X c black",
+"4X c black",
+"5X c black",
+"6X c black",
+"7X c black",
+"8X c black",
+"9X c black",
+"0X c black",
+"qX c black",
+"wX c black",
+"eX c black",
+"rX c black",
+"tX c black",
+"yX c black",
+"uX c black",
+"iX c black",
+"pX c black",
+"aX c black",
+"sX c black",
+"dX c black",
+"fX c black",
+"gX c black",
+"hX c black",
+"jX c black",
+"kX c black",
+"lX c black",
+"zX c black",
+"xX c black",
+"cX c black",
+"vX c black",
+"bX c black",
+"nX c black",
+"mX c black",
+"MX c black",
+"NX c black",
+"BX c black",
+"VX c black",
+"CX c black",
+"ZX c black",
+"AX c black",
+"SX c black",
+"DX c black",
+"FX c black",
+"GX c black",
+"HX c black",
+"JX c black",
+"KX c black",
+"LX c black",
+"PX c black",
+"IX c black",
+"UX c black",
+/* pixels */
+" ",
+" ",
+" ",
+" ",
+" % % % % % % % % % % % % ",
+" % % % % % % % % % % % % ",
+" ",
+" % % % % % % % % % % % % % % % % % % % ",
+" % % % % % % % % % % % % % % % % % % % ",
+" ",
+" % % % % % % % % % % % % ",
+" % % % % % % % % % % % % ",
+" ",
+" % % % % % % % % % % % % % % % % % % % ",
+" % % % % % % % % % % % % % % % % % % % ",
+" ",
+" % % % % % % % % % % % % ",
+" % % % % % % % % % % % % ",
+" ",
+" % % % % % % % % % % % % % % % % % % % ",
+" % % % % % % % % % % % % % % % % % % % ",
+" ",
+" ",
+" "
+};
--- /dev/null
+/* XPM */
+static char *alternative[] = {
+/* columns rows colors chars-per-pixel */
+"24 24 256 2 ",
+" c None",
+". c #FFFFFE",
+"X c #FFFFFD",
+"o c #FEFEFE",
+"O c #FEFEFA",
+"+ c #FDFDFD",
+"@ c gray99",
+"# c #FCFCFB",
+"$ c gray98",
+"% c #FAFAEF",
+"& c #F9F9F9",
+"* c #F9F9EB",
+"= c #F8FAF0",
+"- c #F8F9EC",
+"; c #F6F6FD",
+": c #F6F6E9",
+"> c #F6F5E6",
+", c gray96",
+"< c #F5F5E6",
+"1 c #F3F3EA",
+"2 c gray95",
+"3 c #F1F1E3",
+"4 c #EEEEEE",
+"5 c #EDF0D2",
+"6 c #EDEDF9",
+"7 c gray93",
+"8 c #ECECEC",
+"9 c #E9E9FA",
+"0 c #E9E9E9",
+"q c #E8E8E7",
+"w c #E7E7E7",
+"e c #E7E6C6",
+"r c #E6E6E6",
+"t c #E2E2E2",
+"y c gray88",
+"u c #DFDFFF",
+"i c #DFDFFD",
+"p c #DFDFDF",
+"a c #DDDDFE",
+"s c #DDDDD9",
+"d c gainsboro",
+"f c #DCDCDA",
+"g c #DBDBFD",
+"h c #DBDBD8",
+"j c #DADADA",
+"k c gray85",
+"l c #D8D8FA",
+"z c #D7D7FA",
+"x c #D7D7F7",
+"c c #D7D7F6",
+"v c #D6D6FA",
+"b c #D6D6F9",
+"n c #D6D6F8",
+"m c #D6D6F7",
+"M c #D6D6F6",
+"N c #D6D6F3",
+"B c #D6D6DA",
+"V c gray84",
+"C c #D5D5F6",
+"Z c #D4D4F9",
+"A c #D4D4F6",
+"S c #D4D4D7",
+"D c gray83",
+"F c #D4D4D1",
+"G c #D3D3F4",
+"H c #D2D2D2",
+"J c #D0D0D0",
+"K c #D0D0A8",
+"L c #D0D08B",
+"P c #D0CF8F",
+"I c gray81",
+"U c #CDCD7D",
+"Y c #CCCC91",
+"T c #CBCBCB",
+"R c #CACD8A",
+"E c #C9C9C6",
+"W c #C8C8C8",
+"Q c #C8C883",
+"! c gray78",
+"~ c #C6C978",
+"^ c #C5C75C",
+"/ c #C3C394",
+"( c #C2C25D",
+") c #C1C45D",
+"_ c #BFC371",
+"` c #BEC053",
+"' c gray",
+"] c #BDBDF6",
+"[ c #BDBC5D",
+"{ c #BCBCBC",
+"} c #BBBF69",
+"| c #BBBC61",
+" . c #BBBA61",
+".. c gray73",
+"X. c #B9BD5A",
+"o. c #B9B9D8",
+"O. c #B9B9C4",
+"+. c #B7BD5B",
+"@. c #B7B953",
+"#. c #B7B7CB",
+"$. c #B7B759",
+"%. c #B6B958",
+"&. c #B6B6B6",
+"*. c #B5B75D",
+"=. c #B5B458",
+"-. c gray70",
+";. c #B2B352",
+":. c #B2B269",
+">. c #B1B169",
+",. c #B0B168",
+"<. c gray69",
+"1. c #AEAEEF",
+"2. c #AEAEEC",
+"3. c #ADAD67",
+"4. c #ADAD4C",
+"5. c #ACAC6B",
+"6. c #ACAC61",
+"7. c gray67",
+"8. c gray66",
+"9. c #A7A75F",
+"0. c #A4A4EA",
+"q. c #A4A4A4",
+"w. c #A3A36D",
+"e. c #9E9EF7",
+"r. c #9999E9",
+"t. c #989971",
+"y. c #9898E5",
+"u. c #9494E9",
+"i. c #91919D",
+"p. c gray57",
+"a. c gray56",
+"s. c #8E8EEB",
+"d. c #8E8E8E",
+"f. c #8D8D8D",
+"g. c #8A8A99",
+"h. c gray54",
+"j. c #8989E4",
+"k. c gray52",
+"l. c #848484",
+"z. c #8383CB",
+"x. c #7F7FAC",
+"c. c #7E7E7E",
+"v. c gray49",
+"b. c #7C7C7C",
+"n. c #7B7BB3",
+"m. c #797979",
+"M. c gray47",
+"N. c #777777",
+"B. c #717171",
+"V. c gray43",
+"C. c #6D6D6D",
+"Z. c gray38",
+"A. c #5F5F7C",
+"S. c gray36",
+"D. c #5A5A80",
+"F. c #5A5A5A",
+"G. c #555555",
+"H. c gray33",
+"J. c #505050",
+"K. c #4E4EDC",
+"L. c gray30",
+"P. c #4949E0",
+"I. c #494949",
+"U. c #4848DF",
+"Y. c #4747E0",
+"T. c #4747DD",
+"R. c #4747DB",
+"E. c gray28",
+"W. c #4545E3",
+"Q. c #4343DA",
+"!. c #4242DA",
+"~. c #42423C",
+"^. c #414141",
+"/. c #40403B",
+"(. c #3F3F3F",
+"). c #3E3EE3",
+"_. c #3E3E3E",
+"`. c #3B3BDB",
+"'. c #3B3BD5",
+"]. c #3737D3",
+"[. c #373737",
+"{. c #3636CA",
+"}. c #3535D4",
+"|. c #35359B",
+" X c #343497",
+".X c #323232",
+"XX c #313131",
+"oX c gray19",
+"OX c #30302F",
+"+X c #2F2F2F",
+"@X c gray18",
+"#X c #2E2E2B",
+"$X c #2B2B2C",
+"%X c #2B2B27",
+"&X c #2B2B24",
+"*X c #2A2A28",
+"=X c #282821",
+"-X c #272727",
+";X c #252565",
+":X c #252525",
+">X c #252522",
+",X c #232366",
+"<X c #232323",
+"1X c #23231F",
+"2X c #222222",
+"3X c #212120",
+"4X c #202020",
+"5X c gray12",
+"6X c #1E1E1D",
+"7X c black",
+"8X c black",
+"9X c black",
+"0X c black",
+"qX c black",
+"wX c black",
+"eX c black",
+"rX c black",
+"tX c black",
+"yX c black",
+"uX c black",
+"iX c black",
+"pX c black",
+"aX c black",
+"sX c black",
+"dX c black",
+"fX c black",
+"gX c black",
+"hX c black",
+"jX c black",
+"kX c black",
+"lX c black",
+"zX c black",
+"xX c black",
+"cX c black",
+"vX c black",
+"bX c black",
+"nX c black",
+"mX c black",
+"MX c black",
+"NX c black",
+"BX c black",
+"VX c black",
+"CX c black",
+"ZX c black",
+"AX c black",
+"SX c black",
+"DX c black",
+"FX c black",
+"GX c black",
+"HX c black",
+"JX c black",
+"KX c black",
+"LX c black",
+"PX c black",
+"IX c black",
+"UX c black",
+/* pixels */
+" ",
+" : R e ",
+" % Q 4.} 5 ",
+" = R ;.$.+._ > ",
+" % P $.+.| | $.~ > ",
+" % L @.[ ^ ^ ^ [ ` U > ",
+" K 9.3.5.5.t.w.:.:.3./ ",
+" q V B p o.{.z.p p V p ",
+" u '.0. ",
+" x T.j.z z z x z z z z z x x 6 ",
+" x K.T.T.T.P.Y.K.P.Y.K.T.T.`.u. ",
+" u Y.s.u x x x x x x x z ] ).e. ",
+" #.|.x.: O. Xn.4 ",
+" 4 N.+X%X-XL.' 4 c.OX%X1XE.' ",
+" N.5Xa.V &.E.(.V c.-Xa.I ' (.[.I ",
+" V -Xc. V +Xa. p +Xc. I 5Xc. ",
+" &.-Xq. L.N. ' +X&. (.S., ",
+" ! 5Xk. w [.k. p +Xa. p -XV. ",
+" , G.+Xq.w V Z.+X! V.[.&.p I G.5X&. ",
+" V E.5X(.+X+Xq. w G.5X(.%X5Xa. ",
+" w a.;XA.V 4 i.;XA.E ",
+" u ].u. x ].u. ",
+" ; 1.x 4 1.z ",
+" "
+};
--- /dev/null
+/* XPM */
+static char *answer[] = {
+/* columns rows colors chars-per-pixel */
+"24 24 256 2 ",
+" c black",
+". c #010101",
+"X c #020202",
+"o c gray1",
+"O c #040404",
+"+ c gray2",
+"@ c #060606",
+"# c #070707",
+"$ c gray3",
+"% c #090909",
+"& c gray4",
+"* c #0B0B0B",
+"= c #0C0C0C",
+"- c gray5",
+"; c #0E0E0E",
+": c gray6",
+"> c #101010",
+", c #111111",
+"< c gray7",
+"1 c #131313",
+"2 c gray8",
+"3 c #151515",
+"4 c #161616",
+"5 c gray9",
+"6 c #181818",
+"7 c #191919",
+"8 c gray10",
+"9 c #1B1B1B",
+"0 c gray11",
+"q c #1D1D1D",
+"w c #1E1E1E",
+"e c gray12",
+"r c #202020",
+"t c gray13",
+"y c #222222",
+"u c #232323",
+"i c gray14",
+"p c #252525",
+"a c gray15",
+"s c #272727",
+"d c #282828",
+"f c gray16",
+"g c #2A2A2A",
+"h c gray17",
+"j c #2C2C2C",
+"k c #2D2D2D",
+"l c gray18",
+"z c #2F2F2F",
+"x c gray19",
+"c c #313131",
+"v c #323232",
+"b c gray20",
+"n c #343434",
+"m c #353535",
+"M c gray21",
+"N c #373737",
+"B c gray22",
+"V c #393939",
+"C c #3A3A3A",
+"Z c gray23",
+"A c #3C3C3C",
+"S c gray24",
+"D c #3E3E3E",
+"F c #3F3F3F",
+"G c gray25",
+"H c #414141",
+"J c gray26",
+"K c #434343",
+"L c #444444",
+"P c gray27",
+"I c #464646",
+"U c gray28",
+"Y c #484848",
+"T c #494949",
+"R c gray29",
+"E c #4B4B4B",
+"W c #4C4C4C",
+"Q c gray30",
+"! c #4E4E4E",
+"~ c gray31",
+"^ c #505050",
+"/ c #515151",
+"( c gray32",
+") c #535353",
+"_ c gray33",
+"` c #555555",
+"' c #565656",
+"] c gray34",
+"[ c #585858",
+"{ c gray35",
+"} c #5A5A5A",
+"| c #5B5B5B",
+" . c gray36",
+".. c #5D5D5D",
+"X. c gray37",
+"o. c #5F5F5F",
+"O. c #606060",
+"+. c gray38",
+"@. c #626262",
+"#. c gray39",
+"$. c #646464",
+"%. c #656565",
+"&. c gray40",
+"*. c #676767",
+"=. c #686868",
+"-. c DimGray",
+";. c #6A6A6A",
+":. c gray42",
+">. c #6C6C6C",
+",. c #6D6D6D",
+"<. c gray43",
+"1. c #6F6F6F",
+"2. c gray44",
+"3. c #717171",
+"4. c #727272",
+"5. c gray45",
+"6. c #747474",
+"7. c gray46",
+"8. c #767676",
+"9. c #777777",
+"0. c gray47",
+"q. c #797979",
+"w. c gray48",
+"e. c #7B7B7B",
+"r. c #7C7C7C",
+"t. c gray49",
+"y. c #7E7E7E",
+"u. c gray50",
+"i. c #808080",
+"p. c #818181",
+"a. c gray51",
+"s. c #838383",
+"d. c #848484",
+"f. c gray52",
+"g. c #868686",
+"h. c gray53",
+"j. c #888888",
+"k. c #898989",
+"l. c gray54",
+"z. c #8B8B8B",
+"x. c gray55",
+"c. c #8D8D8D",
+"v. c #8E8E8E",
+"b. c gray56",
+"n. c #909090",
+"m. c gray57",
+"M. c #929292",
+"N. c #939393",
+"B. c gray58",
+"V. c #959595",
+"C. c gray59",
+"Z. c #979797",
+"A. c #989898",
+"S. c gray60",
+"D. c #9A9A9A",
+"F. c #9B9B9B",
+"G. c gray61",
+"H. c #9D9D9D",
+"J. c gray62",
+"K. c #9F9F9F",
+"L. c #A0A0A0",
+"P. c gray63",
+"I. c #A2A2A2",
+"U. c gray64",
+"Y. c #A4A4A4",
+"T. c #A5A5A5",
+"R. c gray65",
+"E. c #A7A7A7",
+"W. c gray66",
+"Q. c #A9A9A9",
+"!. c #AAAAAA",
+"~. c gray67",
+"^. c #ACACAC",
+"/. c gray68",
+"(. c #AEAEAE",
+"). c #AFAFAF",
+"_. c gray69",
+"`. c #B1B1B1",
+"'. c #B2B2B2",
+"]. c gray70",
+"[. c #B4B4B4",
+"{. c gray71",
+"}. c #B6B6B6",
+"|. c #B7B7B7",
+" X c gray72",
+".X c #B9B9B9",
+"XX c gray73",
+"oX c #BBBBBB",
+"OX c #BCBCBC",
+"+X c gray74",
+"@X c gray",
+"#X c gray75",
+"$X c #C0C0C0",
+"%X c #C1C1C1",
+"&X c gray76",
+"*X c #C3C3C3",
+"=X c gray77",
+"-X c #C5C5C5",
+";X c #C6C6C6",
+":X c gray78",
+">X c #C8C8C8",
+",X c gray79",
+"<X c #CACACA",
+"1X c #CBCBCB",
+"2X c gray80",
+"3X c #CDCDCD",
+"4X c #CECECE",
+"5X c gray81",
+"6X c #D0D0D0",
+"7X c gray82",
+"8X c #D2D2D2",
+"9X c LightGray",
+"0X c gray83",
+"qX c #D5D5D5",
+"wX c gray84",
+"eX c #D7D7D7",
+"rX c #D8D8D8",
+"tX c gray85",
+"yX c #DADADA",
+"uX c gray86",
+"iX c gainsboro",
+"pX c #DDDDDD",
+"aX c gray87",
+"sX c #DFDFDF",
+"dX c gray88",
+"fX c #E1E1E1",
+"gX c #E2E2E2",
+"hX c gray89",
+"jX c #E4E4E4",
+"kX c gray90",
+"lX c #E6E6E6",
+"zX c #E7E7E7",
+"xX c gray91",
+"cX c #E9E9E9",
+"vX c #EAEAEA",
+"bX c gray92",
+"nX c #ECECEC",
+"mX c gray93",
+"MX c #EEEEEE",
+"NX c #EFEFEF",
+"BX c gray94",
+"VX c #F1F1F1",
+"CX c gray95",
+"ZX c #F3F3F3",
+"AX c #F4F4F4",
+"SX c gray96",
+"DX c #F6F6F6",
+"FX c gray97",
+"GX c #F8F8F8",
+"HX c #F9F9F9",
+"JX c gray98",
+"KX c #FBFBFB",
+"LX c gray99",
+"PX c #FDFDFD",
+"IX c #FEFEFE",
+"UX c None",
+/* pixels */
+"UXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUX",
+"UXUXUXUXUXUXUXUXUXUXUX5X#XFXUXUXUXUXUXUXUXUXUXUX",
+"UXUXUXUXUXUXUXUXUXUXUXZ e sXUXUXUXUXUXUXUXUXUXUX",
+"UXUXUXUXUXUXUXUXUXUXUXa - eXUXUXUXUXUXUXUXUXUXUX",
+"UXUXUXUXUXUXUXUXUXUXUXl - eXUXUXUXUXUXUXUXUXUXUX",
+"UXUXUXUXUXUX*XX.a.UXUXa @ eXUXv.X.#XUXUXUXUXUXUX",
+"UXUXUXUXFXy.@ @ ' UXUX1.$.zXUX' @ @ 8.FXUXUXUXUX",
+"UXUXUXUXy.@ @ 1.#XUXUXUXUXUXUX#X1.- @ 8.UXUXUXUX",
+"UXUXUX*X@ 5 ).UXUXUXUXUXUXUXUXUXUX|.5 @ #XUXUXUX",
+"UXUXUX$.@ v.UXUXUXUXUXUXUXUXUXUXUXUXZ.@ ' UXUXUX",
+"UXUXmXe 5 sXUXUXUXUXUXUXUXUXUXUXUXUXzXa - mXUXUX",
+"UXUXeX@ Z FXUXUXUXUXUXUXUXUXUXUXUXUXFXL @ 5XUXUX",
+"UXUXeX@ L mXUXUXUXUXUXUXUXUXUXUXUXUXFXL @ 5XUXUX",
+"UXUXmX5 e zXUXUXUXUXUXUXUXUXUXUXUXUXzXa - zXUXUX",
+"UXUXUXX.@ Z.UXUXUXUXUXUXUXUXUXUXUXUXZ.@ ' UXUXUX",
+"UXUXUX|.@ e #XUXUXUXUXUXUXUXUXUXUX*Xe @ |.UXUXUX",
+"UXUXUXUX1.@ 5 y.5XUXUXUXUXUXUX5Xy.5 @ $.FXUXUXUX",
+"UXUXUXUXmX1.@ @ L UXUXy.1.zXUXQ @ @ $.FXUXUXUXUX",
+"UXUXUXUXUXUX).Q $.UXUXa @ eXUX1.Q ).UXUXUXUXUXUX",
+"UXUXUXUXUXUXUXUXUXUXUXl 5 eXUXUXUXUXUXUXUXUXUXUX",
+"UXUXUXUXUXUXUXUXUXUXUXl - eXUXUXUXUXUXUXUXUXUXUX",
+"UXUXUXUXUXUXUXUXUXUXUXn 5 eXUXUXUXUXUXUXUXUXUXUX",
+"UXUXUXUXUXUXUXUXUXUXUX#X|.FXUXUXUXUXUXUXUXUXUXUX",
+"UXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUX"
+};
--- /dev/null
+/* XPM */
+static char *arrow[] = {
+/* columns rows colors chars-per-pixel */
+"24 24 256 2 ",
+" c None",
+". c #FEFEFE",
+"X c #FDFDFD",
+"o c gray99",
+"O c #FBFBFB",
+"+ c gray98",
+"@ c #F8F8F8",
+"# c #F6F6F6",
+"$ c gray96",
+"% c #F4F4F4",
+"& c gray95",
+"* c #F1F1F1",
+"= c #EEEEEE",
+"- c #E9E9E9",
+"; c #E6E6E6",
+": c #E1E0E0",
+"> c #DDDDDD",
+", c #D2D2D2",
+"< c gray82",
+"1 c gray81",
+"2 c gray76",
+"3 c #B9B9B9",
+"4 c gray71",
+"5 c #B4B4B4",
+"6 c #B2B2B2",
+"7 c gray69",
+"8 c #AEAEAE",
+"9 c #ACACAC",
+"0 c #A4A4A4",
+"q c gray63",
+"w c #9F9F9F",
+"e c gray61",
+"r c #9B9B9B",
+"t c #9A9A9A",
+"y c gray60",
+"u c #979797",
+"i c #939393",
+"p c #929292",
+"a c gray57",
+"s c #868686",
+"d c #818181",
+"f c gray50",
+"g c gray48",
+"h c gray47",
+"j c #777777",
+"k c gray46",
+"l c #727272",
+"z c #555555",
+"x c gray29",
+"c c #494949",
+"v c #464646",
+"b c #434343",
+"n c gray26",
+"m c gray24",
+"M c #393737",
+"N c gray19",
+"B c gray16",
+"V c #282828",
+"C c #272727",
+"Z c #252525",
+"A c #1D1D1D",
+"S c gray11",
+"D c #191919",
+"F c #181818",
+"G c #161616",
+"H c #151515",
+"J c gray8",
+"K c #120F0F",
+"L c #111111",
+"P c gray5",
+"I c gray4",
+"U c #090909",
+"Y c gray3",
+"T c #060606",
+"R c #040404",
+"E c gray1",
+"W c #020202",
+"Q c #010101",
+"! c black",
+"~ c black",
+"^ c black",
+"/ c black",
+"( c black",
+") c black",
+"_ c black",
+"` c black",
+"' c black",
+"] c black",
+"[ c black",
+"{ c black",
+"} c black",
+"| c black",
+" . c black",
+".. c black",
+"X. c black",
+"o. c black",
+"O. c black",
+"+. c black",
+"@. c black",
+"#. c black",
+"$. c black",
+"%. c black",
+"&. c black",
+"*. c black",
+"=. c black",
+"-. c black",
+";. c black",
+":. c black",
+">. c black",
+",. c black",
+"<. c black",
+"1. c black",
+"2. c black",
+"3. c black",
+"4. c black",
+"5. c black",
+"6. c black",
+"7. c black",
+"8. c black",
+"9. c black",
+"0. c black",
+"q. c black",
+"w. c black",
+"e. c black",
+"r. c black",
+"t. c black",
+"y. c black",
+"u. c black",
+"i. c black",
+"p. c black",
+"a. c black",
+"s. c black",
+"d. c black",
+"f. c black",
+"g. c black",
+"h. c black",
+"j. c black",
+"k. c black",
+"l. c black",
+"z. c black",
+"x. c black",
+"c. c black",
+"v. c black",
+"b. c black",
+"n. c black",
+"m. c black",
+"M. c black",
+"N. c black",
+"B. c black",
+"V. c black",
+"C. c black",
+"Z. c black",
+"A. c black",
+"S. c black",
+"D. c black",
+"F. c black",
+"G. c black",
+"H. c black",
+"J. c black",
+"K. c black",
+"L. c black",
+"P. c black",
+"I. c black",
+"U. c black",
+"Y. c black",
+"T. c black",
+"R. c black",
+"E. c black",
+"W. c black",
+"Q. c black",
+"!. c black",
+"~. c black",
+"^. c black",
+"/. c black",
+"(. c black",
+"). c black",
+"_. c black",
+"`. c black",
+"'. c black",
+"]. c black",
+"[. c black",
+"{. c black",
+"}. c black",
+"|. c black",
+" X c black",
+".X c black",
+"XX c black",
+"oX c black",
+"OX c black",
+"+X c black",
+"@X c black",
+"#X c black",
+"$X c black",
+"%X c black",
+"&X c black",
+"*X c black",
+"=X c black",
+"-X c black",
+";X c black",
+":X c black",
+">X c black",
+",X c black",
+"<X c black",
+"1X c black",
+"2X c black",
+"3X c black",
+"4X c black",
+"5X c black",
+"6X c black",
+"7X c black",
+"8X c black",
+"9X c black",
+"0X c black",
+"qX c black",
+"wX c black",
+"eX c black",
+"rX c black",
+"tX c black",
+"yX c black",
+"uX c black",
+"iX c black",
+"pX c black",
+"aX c black",
+"sX c black",
+"dX c black",
+"fX c black",
+"gX c black",
+"hX c black",
+"jX c black",
+"kX c black",
+"lX c black",
+"zX c black",
+"xX c black",
+"cX c black",
+"vX c black",
+"bX c black",
+"nX c black",
+"mX c black",
+"MX c black",
+"NX c black",
+"BX c black",
+"VX c black",
+"CX c black",
+"ZX c black",
+"AX c black",
+"SX c black",
+"DX c black",
+"FX c black",
+"GX c black",
+"HX c black",
+"JX c black",
+"KX c black",
+"LX c black",
+"PX c black",
+"IX c black",
+"UX c black",
+/* pixels */
+" ",
+" ",
+" ",
+" w u ",
+" j P 0 ",
+" w T G 3 ",
+" u T T G 8 ",
+" u T T T C 0 ",
+" w T T T T A 4 ",
+" u T T T T T G 3 ",
+" u T T T T T T C 4 ",
+" w T T T T T T T C 8 ",
+" u T T T T T T T T P u # ",
+" w T T T T T T m z x v > ",
+" u T T T T T A 1 # # = ",
+" w T G 4 m T T 2 ",
+" j T u 4 G A x = ",
+" u f j P T f ",
+" # , T T B # ",
+" s P T v > ",
+" # M T T , ",
+" f C j ",
+" # ; # ",
+" "
+};
--- /dev/null
+/* XPM */
+static char *blank[] = {
+/* columns rows colors chars-per-pixel */
+"24 24 2 1 ",
+" c None",
+". c black",
+/* pixels */
+" ",
+" ",
+" ",
+" ",
+" ",
+" ",
+" ",
+" ",
+" ",
+" ",
+" ",
+" ",
+" ",
+" ",
+" ",
+" ",
+" ",
+" ",
+" ",
+" ",
+" ",
+" ",
+" ",
+" "
+};
--- /dev/null
+/* XPM */
+static char *block[] = {
+/* columns rows colors chars-per-pixel */
+"24 24 256 2 ",
+" c None",
+". c #FFFF8F",
+"X c #FFFF8E",
+"o c #FFFF8D",
+"O c #FFFF8C",
+"+ c #FFFF8B",
+"@ c #FFFF8A",
+"# c #FFFF89",
+"$ c #FFFF88",
+"% c #FFFE8C",
+"& c #FFFE8B",
+"* c #FFFE89",
+"= c #FFFD8C",
+"- c #FFFD8B",
+"; c #FFFC8C",
+": c #FFFC8B",
+"> c #FFFC8A",
+", c #FFFC89",
+"< c #FFFC88",
+"1 c #FFFB8C",
+"2 c #FFFB8B",
+"3 c #FFFB8A",
+"4 c #FFFB89",
+"5 c #FFFB88",
+"6 c #FFFA8B",
+"7 c #FFFA8A",
+"8 c #FFFA89",
+"9 c #FFFA88",
+"0 c #FFF98C",
+"q c #FFF98B",
+"w c #FFF98A",
+"e c #FFF989",
+"r c #FFF988",
+"t c #FFF987",
+"y c #FFF88B",
+"u c #FFF88A",
+"i c #FFF889",
+"p c #FFF888",
+"a c #FFF78A",
+"s c #FFF789",
+"d c #FFF788",
+"f c #FFF787",
+"g c #FFF786",
+"h c #FFF68A",
+"j c #FFF688",
+"k c #FFF687",
+"l c #F1E57D",
+"z c #F0E47E",
+"x c #EEE17E",
+"c c #EEE07E",
+"v c #EEE07B",
+"b c #EEDE7E",
+"n c #EEDE7D",
+"m c #EEDE7C",
+"M c #EEDE7B",
+"N c #DCDCDB",
+"B c #DAD174",
+"V c #DACF75",
+"C c #D7CD72",
+"Z c #D7CC75",
+"A c #D7CC72",
+"S c #D7CC71",
+"D c #D7CB72",
+"F c #D7CA73",
+"G c #D7CA72",
+"H c #D7CA70",
+"J c #D7C973",
+"K c gray84",
+"L c #D5D5D5",
+"P c #C3C3C3",
+"I c gray76",
+"U c #C0C0C1",
+"Y c #C0C0C0",
+"T c #C0B265",
+"R c gray75",
+"E c gray",
+"W c #BEBCBE",
+"Q c #BEBCBD",
+"! c #BDBCBE",
+"~ c #BDB064",
+"^ c #BCBDBE",
+"/ c #BCBCBE",
+"( c #BCBABA",
+") c #BBBCBD",
+"_ c #BBBABB",
+"` c #BBAE63",
+"' c #BBAD62",
+"] c #BABBBB",
+"[ c #BAAE63",
+"{ c #BAAD63",
+"} c #BAAD62",
+"| c #AA9C5B",
+" . c #9C8F56",
+".. c #878383",
+"X. c #837F7F",
+"o. c #7F7C4D",
+"O. c #7D794D",
+"+. c #7C7B4D",
+"@. c #7C7878",
+"#. c #7C774D",
+"$. c #7C774C",
+"%. c #7C764E",
+"&. c #7C744D",
+"*. c #7B764C",
+"=. c #77797E",
+"-. c #77787D",
+";. c #77777C",
+":. c #777676",
+">. c #77757A",
+",. c #77747A",
+"<. c #76757A",
+"1. c #767476",
+"2. c #756A46",
+"3. c #747477",
+"4. c #6F6D71",
+"5. c #6F6D70",
+"6. c #6E7074",
+"7. c #6E6F73",
+"8. c #6E6E6F",
+"9. c #6E6D71",
+"0. c #6E6D70",
+"q. c #6C6D70",
+"w. c #6B6C70",
+"e. c #6B6A6D",
+"r. c #6A6A6C",
+"t. c #6A6744",
+"y. c #4F4736",
+"u. c #4E4433",
+"i. c #4D4835",
+"p. c #4D4735",
+"a. c #4D4635",
+"s. c #4D4433",
+"d. c #3E382E",
+"f. c #3E352B",
+"g. c #3D3A39",
+"h. c #3D3A2E",
+"j. c #3D392E",
+"k. c #3D3837",
+"l. c #3D382E",
+"z. c #3D382D",
+"x. c #3D3736",
+"c. c #3C3837",
+"v. c #3B3837",
+"b. c #3B3635",
+"n. c #3B3534",
+"m. c #3A3736",
+"M. c #3A3329",
+"N. c #333035",
+"B. c #323034",
+"V. c #322F33",
+"C. c #313236",
+"Z. c #313136",
+"A. c #313135",
+"S. c #313131",
+"D. c #313035",
+"F. c #313034",
+"G. c #312E33",
+"H. c #312E27",
+"J. c #302F2F",
+"K. c #2F2E2F",
+"L. c #2F2B24",
+"P. c #2E2A2A",
+"I. c #292421",
+"U. c black",
+"Y. c black",
+"T. c black",
+"R. c black",
+"E. c black",
+"W. c black",
+"Q. c black",
+"!. c black",
+"~. c black",
+"^. c black",
+"/. c black",
+"(. c black",
+"). c black",
+"_. c black",
+"`. c black",
+"'. c black",
+"]. c black",
+"[. c black",
+"{. c black",
+"}. c black",
+"|. c black",
+" X c black",
+".X c black",
+"XX c black",
+"oX c black",
+"OX c black",
+"+X c black",
+"@X c black",
+"#X c black",
+"$X c black",
+"%X c black",
+"&X c black",
+"*X c black",
+"=X c black",
+"-X c black",
+";X c black",
+":X c black",
+">X c black",
+",X c black",
+"<X c black",
+"1X c black",
+"2X c black",
+"3X c black",
+"4X c black",
+"5X c black",
+"6X c black",
+"7X c black",
+"8X c black",
+"9X c black",
+"0X c black",
+"qX c black",
+"wX c black",
+"eX c black",
+"rX c black",
+"tX c black",
+"yX c black",
+"uX c black",
+"iX c black",
+"pX c black",
+"aX c black",
+"sX c black",
+"dX c black",
+"fX c black",
+"gX c black",
+"hX c black",
+"jX c black",
+"kX c black",
+"lX c black",
+"zX c black",
+"xX c black",
+"cX c black",
+"vX c black",
+"bX c black",
+"nX c black",
+"mX c black",
+"MX c black",
+"NX c black",
+"BX c black",
+"VX c black",
+"CX c black",
+"ZX c black",
+"AX c black",
+"SX c black",
+"DX c black",
+"FX c black",
+"GX c black",
+"HX c black",
+"JX c black",
+"KX c black",
+"LX c black",
+"PX c black",
+"IX c black",
+"UX c black",
+/* pixels */
+" ",
+" ",
+" ",
+" ",
+" ",
+" N ..:.;.;.;.;.=.=.=.=.=.=.;.;.=.;.;.;.:.X.K ",
+" R N.H.y.y.y.y.y.i.i.i.i.i.i.y.y.y.y.y.f.K.R ",
+" P V.2.l b x b b x x x x x x x b b b x | x.R ",
+" P V.o.. t . . . . . . . . . . . t . t ~ x.R ",
+" P V.#.. f f t t . t . t t t . f f f . ` x.R ",
+" P N.#.. a f f . f . t a . . f . a t t ` x.R ",
+" P V.#.. f f . f . f . t . f f f a f . ` x.R ",
+" P N.o.. f . f a . t . . t . . f f a t ` x.R ",
+" R N.o.t f f a t t . f . t f a a f . t ~ x.R ",
+" P N.#.. a a a a a f . t a . t a f f . ` x.R ",
+" P N.o.. t . . . . . . . . . . . . t . ~ x.R ",
+" P V.t.B C C C C C C C C C C C C C C V .x.R ",
+" R K.I.d.d.f.d.f.d.d.d.f.d.f.d.f.f.d.f.L.K.R ",
+" K @.8.8.4.4.4.4.6.6.4.6.4.6.4.4.4.4.8.8.:.K ",
+" ",
+" ",
+" ",
+" ",
+" "
+};
--- /dev/null
+/* XPM */
+static char *block_substructure[] = {
+/* columns rows colors chars-per-pixel */
+"24 24 256 2 ",
+" c None",
+". c #FFFF97",
+"X c #FFFF94",
+"o c #FFFF93",
+"O c #FFFF92",
+"+ c #FFFF91",
+"@ c #FFFF90",
+"# c #FFFF8F",
+"$ c #FFFF8E",
+"% c #FFFF8D",
+"& c #FFFF8B",
+"* c #FFFE8A",
+"= c #FFFD8C",
+"- c #FFFD8B",
+"; c #FFFD8A",
+": c #FFFC8D",
+"> c #FFFC8B",
+", c #FFFC8A",
+"< c #FFFC89",
+"1 c #FFFC88",
+"2 c #FFFB8E",
+"3 c #FFFB8C",
+"4 c #FFFB8A",
+"5 c #FFFB89",
+"6 c #FFFA8A",
+"7 c #FFFA89",
+"8 c #FFFA88",
+"9 c #FFF98B",
+"0 c #FFF98A",
+"q c #FFF989",
+"w c #FFF988",
+"e c #FFF987",
+"r c #FFF88C",
+"t c #FFF88A",
+"y c #FFF889",
+"u c #FFF789",
+"i c #FBF8F8",
+"p c #F8F8F8",
+"a c gray97",
+"s c #F7F6F6",
+"d c #F6F6F6",
+"f c #DFD17A",
+"g c #D5C872",
+"h c #D4C876",
+"j c #D3C975",
+"k c #D3C673",
+"l c #D3C672",
+"z c #D2C974",
+"x c #D0C875",
+"c c #B3AC66",
+"v c #AFA463",
+"b c #ABA664",
+"n c #AAA663",
+"m c #AAA464",
+"M c #AAA463",
+"N c #AAA461",
+"B c #AAA262",
+"V c #9C9A5C",
+"C c #9C9999",
+"Z c #9B995D",
+"A c #9B985E",
+"S c #9B975E",
+"D c #9B975D",
+"F c #9B945A",
+"G c #9A9494",
+"H c #949090",
+"J c #918253",
+"K c #908D8D",
+"L c #8F8052",
+"P c #8A7D50",
+"I c #858052",
+"U c #808181",
+"Y c #808081",
+"T c #807E7E",
+"R c #807D7E",
+"E c #7A7878",
+"W c #7A7777",
+"Q c #767676",
+"! c #767575",
+"~ c #767474",
+"^ c #767373",
+"/ c #767272",
+"( c #766F6F",
+") c #746B49",
+"_ c #6F6D6D",
+"` c #6F6947",
+"' c #6E6B6B",
+"] c #665D42",
+"[ c #5E5F5F",
+"{ c #5D5E5F",
+"} c #5D5D5E",
+"| c #5D5A5B",
+" . c #595858",
+".. c #585353",
+"X. c #575152",
+"o. c #555355",
+"O. c #545353",
+"+. c #535558",
+"@. c #535356",
+"#. c #535256",
+"$. c #535255",
+"%. c #535154",
+"&. c #525050",
+"*. c #3A362D",
+"=. c #39352D",
+"-. c #39352C",
+";. c #39342C",
+":. c #38342C",
+">. c #37352D",
+",. c #302D28",
+"<. c #2C2A27",
+"1. c #232324",
+"2. c #212225",
+"3. c #212022",
+"4. c #201E21",
+"5. c #201D21",
+"6. c #201D20",
+"7. c #201C20",
+"8. c #1F2024",
+"9. c #1F2023",
+"0. c #1D1D22",
+"q. c #1D1D1D",
+"w. c #1C1D23",
+"e. c #1C1D22",
+"r. c #1C1C22",
+"t. c #1B1A1B",
+"y. c #1B1A1A",
+"u. c #191B22",
+"i. c #191A21",
+"p. c #181A22",
+"a. c black",
+"s. c black",
+"d. c black",
+"f. c black",
+"g. c black",
+"h. c black",
+"j. c black",
+"k. c black",
+"l. c black",
+"z. c black",
+"x. c black",
+"c. c black",
+"v. c black",
+"b. c black",
+"n. c black",
+"m. c black",
+"M. c black",
+"N. c black",
+"B. c black",
+"V. c black",
+"C. c black",
+"Z. c black",
+"A. c black",
+"S. c black",
+"D. c black",
+"F. c black",
+"G. c black",
+"H. c black",
+"J. c black",
+"K. c black",
+"L. c black",
+"P. c black",
+"I. c black",
+"U. c black",
+"Y. c black",
+"T. c black",
+"R. c black",
+"E. c black",
+"W. c black",
+"Q. c black",
+"!. c black",
+"~. c black",
+"^. c black",
+"/. c black",
+"(. c black",
+"). c black",
+"_. c black",
+"`. c black",
+"'. c black",
+"]. c black",
+"[. c black",
+"{. c black",
+"}. c black",
+"|. c black",
+" X c black",
+".X c black",
+"XX c black",
+"oX c black",
+"OX c black",
+"+X c black",
+"@X c black",
+"#X c black",
+"$X c black",
+"%X c black",
+"&X c black",
+"*X c black",
+"=X c black",
+"-X c black",
+";X c black",
+":X c black",
+">X c black",
+",X c black",
+"<X c black",
+"1X c black",
+"2X c black",
+"3X c black",
+"4X c black",
+"5X c black",
+"6X c black",
+"7X c black",
+"8X c black",
+"9X c black",
+"0X c black",
+"qX c black",
+"wX c black",
+"eX c black",
+"rX c black",
+"tX c black",
+"yX c black",
+"uX c black",
+"iX c black",
+"pX c black",
+"aX c black",
+"sX c black",
+"dX c black",
+"fX c black",
+"gX c black",
+"hX c black",
+"jX c black",
+"kX c black",
+"lX c black",
+"zX c black",
+"xX c black",
+"cX c black",
+"vX c black",
+"bX c black",
+"nX c black",
+"mX c black",
+"MX c black",
+"NX c black",
+"BX c black",
+"VX c black",
+"CX c black",
+"ZX c black",
+"AX c black",
+"SX c black",
+"DX c black",
+"FX c black",
+"GX c black",
+"HX c black",
+"JX c black",
+"KX c black",
+"LX c black",
+"PX c black",
+"IX c black",
+"UX c black",
+/* pixels */
+" ",
+" ",
+" ",
+" ",
+" ",
+" C W T U U U U U T T T T E G ",
+" [ q.1.0.0.0.0.0.0.0.0.8.q.X.a ",
+" [ 4.` V S S S S V S V I ,.X.a ",
+" [ 4.c . # . # . . # . f *.X.a ",
+" [ q.v . # e # # e e # k *.+.a ",
+" [ 0.v # e # e e # # # g >.X.a ",
+" [ q.v . # e # u e e # g >.X.a ",
+" [ q.v # e # u # # u # g >.+.a ",
+" [ 4.v . u # e e u # # k *.X.a ",
+" [ 0.v # # # # # e # # g >.X.a ",
+" [ 0.v . e e e # # e # g >.+.a ",
+" [ 1.] J P P P P P P L ` <.X.a ",
+" ..q.8.0.q.0.0.0.0.0.0.0.q.X.a ",
+" K _ Q Q Q Q Q Q Q Q Q ( _ K ",
+" ",
+" ",
+" ",
+" ",
+" "
+};
--- /dev/null
+/* XPM */
+static char *block_type[] = {
+/* columns rows colors chars-per-pixel */
+"24 24 256 2 ",
+" c None",
+". c #181818",
+"X c gray13",
+"o c gray16",
+"O c #313131",
+"+ c #393939",
+"@ c gray26",
+"# c gray29",
+"$ c gray32",
+"% c #5A5A5A",
+"& c gray39",
+"* c gray42",
+"= c gray45",
+"- c #7B7B7B",
+"; c #848484",
+": c gray55",
+"> c gray58",
+", c gray61",
+"< c #A5A5A5",
+"1 c gray68",
+"2 c gray71",
+"3 c gray74",
+"4 c #C6C6C6",
+"5 c #CECECE",
+"6 c gray84",
+"7 c gray87",
+"8 c #E7E7E7",
+"9 c #EFEFEF",
+"0 c gray97",
+"q c #F7EFEF",
+"w c #FFF7F7",
+"e c #DED6D6",
+"r c #C6BDBD",
+"t c #948C8C",
+"y c #9C9494",
+"u c #A59C9C",
+"i c #736B6B",
+"p c #6B6363",
+"a c #5A5252",
+"s c #635A5A",
+"d c #4A4242",
+"f c #423939",
+"g c #393131",
+"h c #312929",
+"j c #292121",
+"k c #FFFFF7",
+"l c #94948C",
+"z c #EFF7F7",
+"x c #D6DEDE",
+"c c #D6CED6",
+"v c #DED6DE",
+"b c #ADA5AD",
+"n c #C6BDC6",
+"m c #9C949C",
+"M c #847B84",
+"N c #5A525A",
+"B c #635A63",
+"V c #4A424A",
+"C c black",
+"Z c black",
+"A c black",
+"S c black",
+"D c black",
+"F c black",
+"G c black",
+"H c black",
+"J c black",
+"K c black",
+"L c black",
+"P c black",
+"I c black",
+"U c black",
+"Y c black",
+"T c black",
+"R c black",
+"E c black",
+"W c black",
+"Q c black",
+"! c black",
+"~ c black",
+"^ c black",
+"/ c black",
+"( c black",
+") c black",
+"_ c black",
+"` c black",
+"' c black",
+"] c black",
+"[ c black",
+"{ c black",
+"} c black",
+"| c black",
+" . c black",
+".. c black",
+"X. c black",
+"o. c black",
+"O. c black",
+"+. c black",
+"@. c black",
+"#. c black",
+"$. c black",
+"%. c black",
+"&. c black",
+"*. c black",
+"=. c black",
+"-. c black",
+";. c black",
+":. c black",
+">. c black",
+",. c black",
+"<. c black",
+"1. c black",
+"2. c black",
+"3. c black",
+"4. c black",
+"5. c black",
+"6. c black",
+"7. c black",
+"8. c black",
+"9. c black",
+"0. c black",
+"q. c black",
+"w. c black",
+"e. c black",
+"r. c black",
+"t. c black",
+"y. c black",
+"u. c black",
+"i. c black",
+"p. c black",
+"a. c black",
+"s. c black",
+"d. c black",
+"f. c black",
+"g. c black",
+"h. c black",
+"j. c black",
+"k. c black",
+"l. c black",
+"z. c black",
+"x. c black",
+"c. c black",
+"v. c black",
+"b. c black",
+"n. c black",
+"m. c black",
+"M. c black",
+"N. c black",
+"B. c black",
+"V. c black",
+"C. c black",
+"Z. c black",
+"A. c black",
+"S. c black",
+"D. c black",
+"F. c black",
+"G. c black",
+"H. c black",
+"J. c black",
+"K. c black",
+"L. c black",
+"P. c black",
+"I. c black",
+"U. c black",
+"Y. c black",
+"T. c black",
+"R. c black",
+"E. c black",
+"W. c black",
+"Q. c black",
+"!. c black",
+"~. c black",
+"^. c black",
+"/. c black",
+"(. c black",
+"). c black",
+"_. c black",
+"`. c black",
+"'. c black",
+"]. c black",
+"[. c black",
+"{. c black",
+"}. c black",
+"|. c black",
+" X c black",
+".X c black",
+"XX c black",
+"oX c black",
+"OX c black",
+"+X c black",
+"@X c black",
+"#X c black",
+"$X c black",
+"%X c black",
+"&X c black",
+"*X c black",
+"=X c black",
+"-X c black",
+";X c black",
+":X c black",
+">X c black",
+",X c black",
+"<X c black",
+"1X c black",
+"2X c black",
+"3X c black",
+"4X c black",
+"5X c black",
+"6X c black",
+"7X c black",
+"8X c black",
+"9X c black",
+"0X c black",
+"qX c black",
+"wX c black",
+"eX c black",
+"rX c black",
+"tX c black",
+"yX c black",
+"uX c black",
+"iX c black",
+"pX c black",
+"aX c black",
+"sX c black",
+"dX c black",
+"fX c black",
+"gX c black",
+"hX c black",
+"jX c black",
+"kX c black",
+"lX c black",
+"zX c black",
+"xX c black",
+"cX c black",
+"vX c black",
+"bX c black",
+"nX c black",
+"mX c black",
+"MX c black",
+"NX c black",
+"BX c black",
+"VX c black",
+"CX c black",
+"ZX c black",
+"AX c black",
+"SX c black",
+"DX c black",
+"FX c black",
+"GX c black",
+"HX c black",
+"JX c black",
+"KX c black",
+"LX c black",
+"PX c black",
+"IX c black",
+"UX c black",
+/* pixels */
+" ",
+" ",
+" 9 ; & & & p & p & p & p & p & p & & & & - 7 ",
+" 7 f @ * = = = = = = = = = = = = = = * s + 5 ",
+" 7 # 2 w 9 q q q 9 q q q q q 9 9 0 $ 5 ",
+" 7 # 2 8 % $ $ % % % % % % % $ $ $ % 6 0 $ 5 ",
+" 7 # 2 6 + : 3 b < < < < 1 3 3 3 1 d 3 w % 5 ",
+" 7 # 2 6 # 7 : % & s % & > 8 0 N 4 0 % 5 ",
+" 7 # 2 6 # e % X * : : s . & q N 4 0 $ 5 ",
+" 7 # 2 6 # e % + 7 $ + 9 0 $ 4 0 % 5 ",
+" 7 # 2 6 # x & h 3 8 8 4 @ p 0 0 N n 0 a 5 ",
+" 7 # 2 c # e & j @ # # o g 6 9 a 4 0 N 5 ",
+" 7 # 2 e # v & h M > > - + B 8 0 % 4 0 a 5 ",
+" 7 # 2 6 d 6 % + 7 , . , N n 0 % 5 ",
+" 7 # 2 6 # e & O 5 k 0 ; . u a 4 0 % 5 ",
+" 7 # 2 6 # e % . # % $ @ . $ 7 0 % n 0 % 5 ",
+" 7 # 2 c # 7 < - ; ; ; ; u 8 0 % 4 0 a 5 ",
+" 7 # 2 6 + = , m y , m , m < , m t + n 0 $ 5 ",
+" 7 # 2 7 s @ # # # # # # # # # d @ $ 6 0 % 5 ",
+" 8 d 2 9 9 8 9 9 9 9 9 q 9 8 9 9 9 0 $ 5 ",
+" 7 @ d & p p * p p p p * p * * p p * & a + 5 ",
+" 8 & @ @ # @ d # # @ d @ @ d @ # @ @ @ @ % 7 ",
+" 9 8 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 ",
+" "
+};
--- /dev/null
+/* XPM */
+static char *bold[] = {
+/* columns rows colors chars-per-pixel */
+"22 21 256 2 ",
+" c black",
+". c #010101",
+"X c #020202",
+"o c gray1",
+"O c #040404",
+"+ c gray2",
+"@ c #060606",
+"# c #070707",
+"$ c gray3",
+"% c #090909",
+"& c gray4",
+"* c #0B0B0B",
+"= c #0C0C0C",
+"- c gray5",
+"; c #0E0E0E",
+": c gray6",
+"> c #101010",
+", c #111111",
+"< c gray7",
+"1 c #131313",
+"2 c gray8",
+"3 c #151515",
+"4 c #161616",
+"5 c gray9",
+"6 c #181818",
+"7 c #191919",
+"8 c gray10",
+"9 c #1B1B1B",
+"0 c gray11",
+"q c #1D1D1D",
+"w c #1E1E1E",
+"e c gray12",
+"r c #202020",
+"t c gray13",
+"y c #222222",
+"u c #232323",
+"i c gray14",
+"p c #252525",
+"a c gray15",
+"s c #272727",
+"d c #282828",
+"f c gray16",
+"g c #2A2A2A",
+"h c gray17",
+"j c #2C2C2C",
+"k c #2D2D2D",
+"l c gray18",
+"z c #2F2F2F",
+"x c gray19",
+"c c #313131",
+"v c #323232",
+"b c gray20",
+"n c #343434",
+"m c #353535",
+"M c gray21",
+"N c #373737",
+"B c gray22",
+"V c #393939",
+"C c #3A3A3A",
+"Z c gray23",
+"A c #3C3C3C",
+"S c gray24",
+"D c #3E3E3E",
+"F c #3F3F3F",
+"G c gray25",
+"H c #414141",
+"J c gray26",
+"K c #434343",
+"L c #444444",
+"P c gray27",
+"I c #464646",
+"U c gray28",
+"Y c #484848",
+"T c #494949",
+"R c gray29",
+"E c #4B4B4B",
+"W c #4C4C4C",
+"Q c gray30",
+"! c #4E4E4E",
+"~ c gray31",
+"^ c #505050",
+"/ c #515151",
+"( c gray32",
+") c #535353",
+"_ c gray33",
+"` c #555555",
+"' c #565656",
+"] c gray34",
+"[ c #585858",
+"{ c gray35",
+"} c #5A5A5A",
+"| c #5B5B5B",
+" . c gray36",
+".. c #5D5D5D",
+"X. c gray37",
+"o. c #5F5F5F",
+"O. c #606060",
+"+. c gray38",
+"@. c #626262",
+"#. c gray39",
+"$. c #646464",
+"%. c #656565",
+"&. c gray40",
+"*. c #676767",
+"=. c #686868",
+"-. c DimGray",
+";. c #6A6A6A",
+":. c gray42",
+">. c #6C6C6C",
+",. c #6D6D6D",
+"<. c gray43",
+"1. c #6F6F6F",
+"2. c gray44",
+"3. c #717171",
+"4. c #727272",
+"5. c gray45",
+"6. c #747474",
+"7. c gray46",
+"8. c #767676",
+"9. c #777777",
+"0. c gray47",
+"q. c #797979",
+"w. c gray48",
+"e. c #7B7B7B",
+"r. c #7C7C7C",
+"t. c gray49",
+"y. c #7E7E7E",
+"u. c gray50",
+"i. c #808080",
+"p. c #818181",
+"a. c gray51",
+"s. c #838383",
+"d. c #848484",
+"f. c gray52",
+"g. c #868686",
+"h. c gray53",
+"j. c #888888",
+"k. c #898989",
+"l. c gray54",
+"z. c #8B8B8B",
+"x. c gray55",
+"c. c #8D8D8D",
+"v. c #8E8E8E",
+"b. c gray56",
+"n. c #909090",
+"m. c gray57",
+"M. c #929292",
+"N. c #939393",
+"B. c gray58",
+"V. c #959595",
+"C. c gray59",
+"Z. c #979797",
+"A. c #989898",
+"S. c gray60",
+"D. c #9A9A9A",
+"F. c #9B9B9B",
+"G. c gray61",
+"H. c #9D9D9D",
+"J. c gray62",
+"K. c #9F9F9F",
+"L. c #A0A0A0",
+"P. c gray63",
+"I. c #A2A2A2",
+"U. c gray64",
+"Y. c #A4A4A4",
+"T. c #A5A5A5",
+"R. c gray65",
+"E. c #A7A7A7",
+"W. c gray66",
+"Q. c #A9A9A9",
+"!. c #AAAAAA",
+"~. c gray67",
+"^. c #ACACAC",
+"/. c gray68",
+"(. c #AEAEAE",
+"). c #AFAFAF",
+"_. c gray69",
+"`. c #B1B1B1",
+"'. c #B2B2B2",
+"]. c gray70",
+"[. c #B4B4B4",
+"{. c gray71",
+"}. c #B6B6B6",
+"|. c #B7B7B7",
+" X c gray72",
+".X c #B9B9B9",
+"XX c gray73",
+"oX c #BBBBBB",
+"OX c #BCBCBC",
+"+X c gray74",
+"@X c gray",
+"#X c gray75",
+"$X c #C0C0C0",
+"%X c #C1C1C1",
+"&X c gray76",
+"*X c #C3C3C3",
+"=X c gray77",
+"-X c #C5C5C5",
+";X c #C6C6C6",
+":X c gray78",
+">X c #C8C8C8",
+",X c gray79",
+"<X c #CACACA",
+"1X c #CBCBCB",
+"2X c gray80",
+"3X c #CDCDCD",
+"4X c #CECECE",
+"5X c gray81",
+"6X c #D0D0D0",
+"7X c gray82",
+"8X c #D2D2D2",
+"9X c LightGray",
+"0X c gray83",
+"qX c #D5D5D5",
+"wX c gray84",
+"eX c #D7D7D7",
+"rX c #D8D8D8",
+"tX c gray85",
+"yX c #DADADA",
+"uX c gray86",
+"iX c gainsboro",
+"pX c #DDDDDD",
+"aX c gray87",
+"sX c #DFDFDF",
+"dX c gray88",
+"fX c #E1E1E1",
+"gX c #E2E2E2",
+"hX c gray89",
+"jX c #E4E4E4",
+"kX c gray90",
+"lX c #E6E6E6",
+"zX c #E7E7E7",
+"xX c gray91",
+"cX c #E9E9E9",
+"vX c #EAEAEA",
+"bX c gray92",
+"nX c #ECECEC",
+"mX c gray93",
+"MX c #EEEEEE",
+"NX c #EFEFEF",
+"BX c gray94",
+"VX c #F1F1F1",
+"CX c gray95",
+"ZX c #F3F3F3",
+"AX c #F4F4F4",
+"SX c gray96",
+"DX c #F6F6F6",
+"FX c gray97",
+"GX c #F8F8F8",
+"HX c #F9F9F9",
+"JX c gray98",
+"KX c #FBFBFB",
+"LX c gray99",
+"PX c #FDFDFD",
+"IX c #FEFEFE",
+"UX c None",
+/* pixels */
+"UXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUX",
+"UXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUX",
+"UXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUX",
+"UXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUX",
+"UXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUX",
+"UXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUX",
+"UXUXUXUXUXUXo o o o o o o o UXUXUXUXUXUXUXUX",
+"UXUXUXUXUXUXUXo o o UXUXo o o UXUXUXUXUXUXUX",
+"UXUXUXUXUXUXUXo o o UXUXo o o UXUXUXUXUXUXUX",
+"UXUXUXUXUXUXUXo o o UXUXo o o UXUXUXUXUXUXUX",
+"UXUXUXUXUXUXUXo o o o o o o UXUXUXUXUXUXUXUX",
+"UXUXUXUXUXUXUXo o o UXUXo o o UXUXUXUXUXUXUX",
+"UXUXUXUXUXUXUXo o o UXUXo o o UXUXUXUXUXUXUX",
+"UXUXUXUXUXUXUXo o o UXUXo o o UXUXUXUXUXUXUX",
+"UXUXUXUXUXUXo o o o o o o o UXUXUXUXUXUXUXUX",
+"UXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUX",
+"UXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUX",
+"UXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUX",
+"UXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUX",
+"UXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUX",
+"UXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUX"
+};
--- /dev/null
+@ECHO OFF\r
+SETLOCAL ENABLEDELAYEDEXPANSION\r
+SET COUNTER=0\r
+\r
+del resource.cpp\r
+del resource.h\r
+\r
+echo #ifndef _RESOURCE_H__>>resource.h\r
+echo #define _RESOURCE_H__>>resource.h\r
+\r
+echo #include "resource.h">>resource.cpp\r
+\r
+FOR %%i in (*.xpm) do CALL :UC %%~ni\r
+\r
+echo char *get_xpm(int i); >> resource.h \r
+echo #endif >> resource.h\r
+echo.>>resource.cpp \r
+echo static char **parray = {>>resource.cpp\r
+\r
+FOR %%i in (*.xpm) do CALL :PARRAY %%~ni\r
+\r
+echo NULL };>>resource.cpp\r
+echo.>>resource.cpp\r
+echo char * get_xpm(int i) {return parray[i];} >> resource.cpp\r
+\r
+ENDLOCAL\r
+GOTO:EOF\r
+\r
+:UC\r
+SET _S=%1\r
+CALL :UCase _S _RESULT\r
+echo #define %_RESULT% %COUNTER% >>resource.h\r
+SET /A COUNTER=COUNTER+1\r
+echo #include "%_S%.xpm" >> resource.cpp\r
+GOTO:EOF\r
+\r
+:PARRAY\r
+:: Build pointer array for all icons\r
+echo %1,>>resource.cpp\r
+GOTO:EOF\r
+\r
+\r
+:LCase\r
+:UCase\r
+:: Converts to upper/lower case variable contents\r
+:: Syntax: CALL :UCase _VAR1 _VAR2\r
+:: Syntax: CALL :LCase _VAR1 _VAR2\r
+:: _VAR1 = Variable NAME whose VALUE is to be converted to upper/lower case\r
+:: _VAR2 = NAME of variable to hold the converted value\r
+:: Note: Use variable NAMES in the CALL, not values (pass "by reference")\r
+\r
+SET _UCase=A B C D E F G H I J K L M N O P Q R S T U V W X Y Z\r
+SET _LCase=a b c d e f g h i j k l m n o p q r s t u v w x y z\r
+SET _Lib_UCase_Tmp=!%1!\r
+IF /I "%0"==":UCase" SET _Abet=%_UCase%\r
+IF /I "%0"==":LCase" SET _Abet=%_LCase%\r
+FOR %%Z IN (%_Abet%) DO SET _Lib_UCase_Tmp=!_Lib_UCase_Tmp:%%Z=%%Z!\r
+SET %2=%_Lib_UCase_Tmp%\r
+GOTO:EOF
\ No newline at end of file
--- /dev/null
+/* XPM */
+static char *center[] = {
+/* columns rows colors chars-per-pixel */
+"24 24 256 2 ",
+" c None",
+". c #FEFEFE",
+"X c #FDFDFD",
+"o c #FCFAFA",
+"O c #FBFBFB",
+"+ c gray98",
+"@ c #F7F5F5",
+"# c gray96",
+"$ c #F4F4F4",
+"% c gray95",
+"& c #F1F1F1",
+"* c gray94",
+"= c #EFEFEF",
+"- c #EEEEEE",
+"; c gray93",
+": c #ECECEC",
+"> c gray92",
+", c #EAEAEA",
+"< c #BCBDBD",
+"1 c #BCBCBC",
+"2 c #BCB9B9",
+"3 c #BAB7B7",
+"4 c #B5B6B6",
+"5 c gray56",
+"6 c #848484",
+"7 c gray46",
+"8 c #747474",
+"9 c DimGray",
+"0 c gray38",
+"q c #505050",
+"w c gray31",
+"e c #4E4E4E",
+"r c gray30",
+"t c #4B4B4B",
+"y c #494949",
+"u c #484848",
+"i c gray28",
+"p c gray27",
+"a c #444444",
+"s c #434343",
+"d c gray26",
+"f c gray25",
+"g c #403F3F",
+"h c #3F3F3F",
+"j c #3E3E3E",
+"k c gray24",
+"l c #3C3C3C",
+"z c #3B3C3C",
+"x c gray23",
+"c c #3A3A3A",
+"v c black",
+"b c black",
+"n c black",
+"m c black",
+"M c black",
+"N c black",
+"B c black",
+"V c black",
+"C c black",
+"Z c black",
+"A c black",
+"S c black",
+"D c black",
+"F c black",
+"G c black",
+"H c black",
+"J c black",
+"K c black",
+"L c black",
+"P c black",
+"I c black",
+"U c black",
+"Y c black",
+"T c black",
+"R c black",
+"E c black",
+"W c black",
+"Q c black",
+"! c black",
+"~ c black",
+"^ c black",
+"/ c black",
+"( c black",
+") c black",
+"_ c black",
+"` c black",
+"' c black",
+"] c black",
+"[ c black",
+"{ c black",
+"} c black",
+"| c black",
+" . c black",
+".. c black",
+"X. c black",
+"o. c black",
+"O. c black",
+"+. c black",
+"@. c black",
+"#. c black",
+"$. c black",
+"%. c black",
+"&. c black",
+"*. c black",
+"=. c black",
+"-. c black",
+";. c black",
+":. c black",
+">. c black",
+",. c black",
+"<. c black",
+"1. c black",
+"2. c black",
+"3. c black",
+"4. c black",
+"5. c black",
+"6. c black",
+"7. c black",
+"8. c black",
+"9. c black",
+"0. c black",
+"q. c black",
+"w. c black",
+"e. c black",
+"r. c black",
+"t. c black",
+"y. c black",
+"u. c black",
+"i. c black",
+"p. c black",
+"a. c black",
+"s. c black",
+"d. c black",
+"f. c black",
+"g. c black",
+"h. c black",
+"j. c black",
+"k. c black",
+"l. c black",
+"z. c black",
+"x. c black",
+"c. c black",
+"v. c black",
+"b. c black",
+"n. c black",
+"m. c black",
+"M. c black",
+"N. c black",
+"B. c black",
+"V. c black",
+"C. c black",
+"Z. c black",
+"A. c black",
+"S. c black",
+"D. c black",
+"F. c black",
+"G. c black",
+"H. c black",
+"J. c black",
+"K. c black",
+"L. c black",
+"P. c black",
+"I. c black",
+"U. c black",
+"Y. c black",
+"T. c black",
+"R. c black",
+"E. c black",
+"W. c black",
+"Q. c black",
+"!. c black",
+"~. c black",
+"^. c black",
+"/. c black",
+"(. c black",
+"). c black",
+"_. c black",
+"`. c black",
+"'. c black",
+"]. c black",
+"[. c black",
+"{. c black",
+"}. c black",
+"|. c black",
+" X c black",
+".X c black",
+"XX c black",
+"oX c black",
+"OX c black",
+"+X c black",
+"@X c black",
+"#X c black",
+"$X c black",
+"%X c black",
+"&X c black",
+"*X c black",
+"=X c black",
+"-X c black",
+";X c black",
+":X c black",
+">X c black",
+",X c black",
+"<X c black",
+"1X c black",
+"2X c black",
+"3X c black",
+"4X c black",
+"5X c black",
+"6X c black",
+"7X c black",
+"8X c black",
+"9X c black",
+"0X c black",
+"qX c black",
+"wX c black",
+"eX c black",
+"rX c black",
+"tX c black",
+"yX c black",
+"uX c black",
+"iX c black",
+"pX c black",
+"aX c black",
+"sX c black",
+"dX c black",
+"fX c black",
+"gX c black",
+"hX c black",
+"jX c black",
+"kX c black",
+"lX c black",
+"zX c black",
+"xX c black",
+"cX c black",
+"vX c black",
+"bX c black",
+"nX c black",
+"mX c black",
+"MX c black",
+"NX c black",
+"BX c black",
+"VX c black",
+"CX c black",
+"ZX c black",
+"AX c black",
+"SX c black",
+"DX c black",
+"FX c black",
+"GX c black",
+"HX c black",
+"JX c black",
+"KX c black",
+"LX c black",
+"PX c black",
+"IX c black",
+"UX c black",
+/* pixels */
+" ",
+" ",
+" ",
+" @ = = = @ = = @ = = @ ",
+" = q h h h h h h h h h h 4 ",
+" @ 7 w w w w w w w w w w < ",
+" @ = = @ = = = = = = = = = = = = = @ ",
+" 6 h h h h i h i h i h h h h i h h h 3 ",
+" 5 i i i w w w w w w w w w w w w i i 4 ",
+" @ @ = = = = = = = = = = = ",
+" @ 0 h i h h h h i h i h 3 ",
+" @ 7 w w w w w w w w w w < ",
+" @ = = = = = = = = = = = = = = = = @ ",
+" 6 h h h h i h i h i h h h h i h h h 4 ",
+" 5 i i i w w w w w w w w w w w w i i 4 ",
+" @ = = = = = = = = = = = = ",
+" = 0 h h h h h h i h i h 3 ",
+" @ 7 w w w w w w w w w w < ",
+" @ = = = = = = = = = = = = = = = = = ",
+" 6 h h h h i h i h i h h h h i h h h 3 ",
+" 5 i i i w i i i i i w i w i i i i w 4 ",
+" @ @ @ @ ",
+" ",
+" "
+};
--- /dev/null
+/* XPM */
+static char *channel[] = {
+/* columns rows colors chars-per-pixel */
+"24 24 256 2 ",
+" c None",
+". c #FCF7F0",
+"X c #F7F4F0",
+"o c #F3F3F3",
+"O c #F2F7FF",
+"+ c #F1F6FF",
+"@ c #EFEFEF",
+"# c #EEEEEF",
+"$ c #EEEEEE",
+"% c #E7F1FE",
+"& c #E3E7EE",
+"* c #DFEAFC",
+"= c #DCE8FC",
+"- c #D9E8FF",
+"; c #D8E7FC",
+": c #D8E6FE",
+"> c #D8E6FC",
+", c #D8E5FB",
+"< c #D5E3FB",
+"1 c #D1E3FD",
+"2 c #D0E0FB",
+"3 c #CBE0FD",
+"4 c #CBDDFB",
+"5 c #CADDFA",
+"6 c #C7DDFC",
+"7 c #C0D0EB",
+"8 c #B4D5FE",
+"9 c #B4D0FB",
+"0 c #B4CFF9",
+"q c #B1D0FC",
+"w c #AACBFB",
+"e c #A8C7F9",
+"r c #A6C7FA",
+"t c #A1C1F7",
+"y c #989898",
+"u c #96BBF7",
+"i c #93BAF7",
+"p c #89B2F5",
+"a c #808080",
+"s c #7D7B7A",
+"d c #7B7A7A",
+"f c gray48",
+"g c #72A5F5",
+"h c #71A4F4",
+"j c #717171",
+"k c #6DA2F8",
+"l c #68A0F5",
+"z c #659FF6",
+"x c #646464",
+"c c #5E96E8",
+"v c #5A9AFC",
+"b c #5A95F2",
+"n c #5893F2",
+"m c #5294F9",
+"M c gray30",
+"N c #4C8AEF",
+"B c #4B8AF0",
+"V c #4A8CF2",
+"C c #4488F2",
+"Z c #4487F1",
+"A c #4486F0",
+"S c #4385F0",
+"D c #4186F2",
+"F c #4085F1",
+"G c #3F83EF",
+"H c #3D81EF",
+"J c #3D81EE",
+"K c gray24",
+"L c #3C7DE7",
+"P c #3B81EF",
+"I c #3A81F2",
+"U c #3A81F0",
+"Y c #3980F0",
+"T c #393631",
+"R c #3880F1",
+"E c gray22",
+"W c #383531",
+"Q c #357CEF",
+"! c #357BED",
+"~ c #347BED",
+"^ c #3380F6",
+"/ c #337BEE",
+"( c #33322F",
+") c #323232",
+"_ c #323130",
+"` c #313030",
+"' c #3079EE",
+"] c gray19",
+"[ c #2F2F30",
+"{ c #2F2F2F",
+"} c #2E78EF",
+"| c #2D77EE",
+" . c #2876EF",
+".. c #2776F0",
+"X. c #2271EE",
+"o. c #151F2E",
+"O. c #0E0E0E",
+"+. c #050200",
+"@. c #040200",
+"#. c black",
+"$. c black",
+"%. c black",
+"&. c black",
+"*. c black",
+"=. c black",
+"-. c black",
+";. c black",
+":. c black",
+">. c black",
+",. c black",
+"<. c black",
+"1. c black",
+"2. c black",
+"3. c black",
+"4. c black",
+"5. c black",
+"6. c black",
+"7. c black",
+"8. c black",
+"9. c black",
+"0. c black",
+"q. c black",
+"w. c black",
+"e. c black",
+"r. c black",
+"t. c black",
+"y. c black",
+"u. c black",
+"i. c black",
+"p. c black",
+"a. c black",
+"s. c black",
+"d. c black",
+"f. c black",
+"g. c black",
+"h. c black",
+"j. c black",
+"k. c black",
+"l. c black",
+"z. c black",
+"x. c black",
+"c. c black",
+"v. c black",
+"b. c black",
+"n. c black",
+"m. c black",
+"M. c black",
+"N. c black",
+"B. c black",
+"V. c black",
+"C. c black",
+"Z. c black",
+"A. c black",
+"S. c black",
+"D. c black",
+"F. c black",
+"G. c black",
+"H. c black",
+"J. c black",
+"K. c black",
+"L. c black",
+"P. c black",
+"I. c black",
+"U. c black",
+"Y. c black",
+"T. c black",
+"R. c black",
+"E. c black",
+"W. c black",
+"Q. c black",
+"!. c black",
+"~. c black",
+"^. c black",
+"/. c black",
+"(. c black",
+"). c black",
+"_. c black",
+"`. c black",
+"'. c black",
+"]. c black",
+"[. c black",
+"{. c black",
+"}. c black",
+"|. c black",
+" X c black",
+".X c black",
+"XX c black",
+"oX c black",
+"OX c black",
+"+X c black",
+"@X c black",
+"#X c black",
+"$X c black",
+"%X c black",
+"&X c black",
+"*X c black",
+"=X c black",
+"-X c black",
+";X c black",
+":X c black",
+">X c black",
+",X c black",
+"<X c black",
+"1X c black",
+"2X c black",
+"3X c black",
+"4X c black",
+"5X c black",
+"6X c black",
+"7X c black",
+"8X c black",
+"9X c black",
+"0X c black",
+"qX c black",
+"wX c black",
+"eX c black",
+"rX c black",
+"tX c black",
+"yX c black",
+"uX c black",
+"iX c black",
+"pX c black",
+"aX c black",
+"sX c black",
+"dX c black",
+"fX c black",
+"gX c black",
+"hX c black",
+"jX c black",
+"kX c black",
+"lX c black",
+"zX c black",
+"xX c black",
+"cX c black",
+"vX c black",
+"bX c black",
+"nX c black",
+"mX c black",
+"MX c black",
+"NX c black",
+"BX c black",
+"VX c black",
+"CX c black",
+"ZX c black",
+"AX c black",
+"SX c black",
+"DX c black",
+"FX c black",
+"GX c black",
+"HX c black",
+"JX c black",
+"KX c black",
+"LX c black",
+"PX c black",
+"IX c black",
+"UX c black",
+/* pixels */
+" ",
+" ",
+" ",
+" ",
+" ",
+" y ) ) K M X j K ) ) x ",
+" y { { O.+.@ [ +.{ ) x ",
+" s +.@ { ) ",
+" s +.@ 4 8 < w ) ) ",
+" s +.@ ; L u 4 Q 8 { [ ",
+" s +.. ; B | r < Q I 0 ) ) ",
+" s +.7 m I G b g z I G I 8 ( ( ",
+" s +.c ^ Z C Q ..} Z Z Q v o.T ",
+" s +.& k Q G g t p G I B * ) ) ",
+" s +.X O z X.e * | N < ( ) ",
+" s +.@ O b u 6 Z < [ [ ",
+" a +.@ % 3 * 3 { ) ",
+" y ) [ O.+.@ ) +.[ ) x ",
+" y [ { K M X j K { ) x ",
+" ",
+" ",
+" ",
+" ",
+" "
+};
--- /dev/null
+/* XPM */
+static char *channel_substructure[] = {
+/* columns rows colors chars-per-pixel */
+"24 24 256 2 ",
+" c None",
+". c #FFFF97",
+"X c #FFFF94",
+"o c #FFFF93",
+"O c #FFFF92",
+"+ c #FFFF91",
+"@ c #FFFF90",
+"# c #FFFF8F",
+"$ c #FFFF8E",
+"% c #FFFF8D",
+"& c #FFFF8B",
+"* c #FFFE8A",
+"= c #FFFD8C",
+"- c #FFFD8B",
+"; c #FFFD8A",
+": c #FFFC8D",
+"> c #FFFC8B",
+", c #FFFC8A",
+"< c #FFFC89",
+"1 c #FFFC88",
+"2 c #FFFB8E",
+"3 c #FFFB8C",
+"4 c #FFFB8A",
+"5 c #FFFB89",
+"6 c #FFFA8A",
+"7 c #FFFA89",
+"8 c #FFFA88",
+"9 c #FFF98B",
+"0 c #FFF98A",
+"q c #FFF989",
+"w c #FFF988",
+"e c #FFF987",
+"r c #FFF88C",
+"t c #FFF88A",
+"y c #FFF889",
+"u c #FFF789",
+"i c #FBF8F8",
+"p c #F8F8F8",
+"a c gray97",
+"s c #F7F6F6",
+"d c #F6F6F6",
+"f c #DFD17A",
+"g c #D5C872",
+"h c #D4C876",
+"j c #D3C975",
+"k c #D3C673",
+"l c #D3C672",
+"z c #D2C974",
+"x c #D0C875",
+"c c #B3AC66",
+"v c #AFA463",
+"b c #ABA664",
+"n c #AAA663",
+"m c #AAA464",
+"M c #AAA463",
+"N c #AAA461",
+"B c #AAA262",
+"V c #9C9A5C",
+"C c #9C9999",
+"Z c #9B995D",
+"A c #9B985E",
+"S c #9B975E",
+"D c #9B975D",
+"F c #9B945A",
+"G c #9A9494",
+"H c #949090",
+"J c #918253",
+"K c #908D8D",
+"L c #8F8052",
+"P c #8A7D50",
+"I c #858052",
+"U c #808181",
+"Y c #808081",
+"T c #807E7E",
+"R c #807D7E",
+"E c #7A7878",
+"W c #7A7777",
+"Q c #767676",
+"! c #767575",
+"~ c #767474",
+"^ c #767373",
+"/ c #767272",
+"( c #766F6F",
+") c #746B49",
+"_ c #6F6D6D",
+"` c #6F6947",
+"' c #6E6B6B",
+"] c #665D42",
+"[ c #5E5F5F",
+"{ c #5D5E5F",
+"} c #5D5D5E",
+"| c #5D5A5B",
+" . c #595858",
+".. c #585353",
+"X. c #575152",
+"o. c #555355",
+"O. c #545353",
+"+. c #535558",
+"@. c #535356",
+"#. c #535256",
+"$. c #535255",
+"%. c #535154",
+"&. c #525050",
+"*. c #3A362D",
+"=. c #39352D",
+"-. c #39352C",
+";. c #39342C",
+":. c #38342C",
+">. c #37352D",
+",. c #302D28",
+"<. c #2C2A27",
+"1. c #232324",
+"2. c #212225",
+"3. c #212022",
+"4. c #201E21",
+"5. c #201D21",
+"6. c #201D20",
+"7. c #201C20",
+"8. c #1F2024",
+"9. c #1F2023",
+"0. c #1D1D22",
+"q. c #1D1D1D",
+"w. c #1C1D23",
+"e. c #1C1D22",
+"r. c #1C1C22",
+"t. c #1B1A1B",
+"y. c #1B1A1A",
+"u. c #191B22",
+"i. c #191A21",
+"p. c #181A22",
+"a. c black",
+"s. c black",
+"d. c black",
+"f. c black",
+"g. c black",
+"h. c black",
+"j. c black",
+"k. c black",
+"l. c black",
+"z. c black",
+"x. c black",
+"c. c black",
+"v. c black",
+"b. c black",
+"n. c black",
+"m. c black",
+"M. c black",
+"N. c black",
+"B. c black",
+"V. c black",
+"C. c black",
+"Z. c black",
+"A. c black",
+"S. c black",
+"D. c black",
+"F. c black",
+"G. c black",
+"H. c black",
+"J. c black",
+"K. c black",
+"L. c black",
+"P. c black",
+"I. c black",
+"U. c black",
+"Y. c black",
+"T. c black",
+"R. c black",
+"E. c black",
+"W. c black",
+"Q. c black",
+"!. c black",
+"~. c black",
+"^. c black",
+"/. c black",
+"(. c black",
+"). c black",
+"_. c black",
+"`. c black",
+"'. c black",
+"]. c black",
+"[. c black",
+"{. c black",
+"}. c black",
+"|. c black",
+" X c black",
+".X c black",
+"XX c black",
+"oX c black",
+"OX c black",
+"+X c black",
+"@X c black",
+"#X c black",
+"$X c black",
+"%X c black",
+"&X c black",
+"*X c black",
+"=X c black",
+"-X c black",
+";X c black",
+":X c black",
+">X c black",
+",X c black",
+"<X c black",
+"1X c black",
+"2X c black",
+"3X c black",
+"4X c black",
+"5X c black",
+"6X c black",
+"7X c black",
+"8X c black",
+"9X c black",
+"0X c black",
+"qX c black",
+"wX c black",
+"eX c black",
+"rX c black",
+"tX c black",
+"yX c black",
+"uX c black",
+"iX c black",
+"pX c black",
+"aX c black",
+"sX c black",
+"dX c black",
+"fX c black",
+"gX c black",
+"hX c black",
+"jX c black",
+"kX c black",
+"lX c black",
+"zX c black",
+"xX c black",
+"cX c black",
+"vX c black",
+"bX c black",
+"nX c black",
+"mX c black",
+"MX c black",
+"NX c black",
+"BX c black",
+"VX c black",
+"CX c black",
+"ZX c black",
+"AX c black",
+"SX c black",
+"DX c black",
+"FX c black",
+"GX c black",
+"HX c black",
+"JX c black",
+"KX c black",
+"LX c black",
+"PX c black",
+"IX c black",
+"UX c black",
+/* pixels */
+" ",
+" ",
+" ",
+" ",
+" ",
+" C W T U U U U U T T T T E G ",
+" [ q.1.0.0.0.0.0.0.0.0.8.q.X.a ",
+" [ 4.` V S S S S V S V I ,.X.a ",
+" [ 4.c . # . # . . # . f *.X.a ",
+" [ q.v . # e # # e e # k *.+.a ",
+" [ 0.v # e # e e # # # g >.X.a ",
+" [ q.v . # e # u e e # g >.X.a ",
+" [ q.v # e # u # # u # g >.+.a ",
+" [ 4.v . u # e e u # # k *.X.a ",
+" [ 0.v # # # # # e # # g >.X.a ",
+" [ 0.v . e e e # # e # g >.+.a ",
+" [ 1.] J P P P P P P L ` <.X.a ",
+" ..q.8.0.q.0.0.0.0.0.0.0.q.X.a ",
+" K _ Q Q Q Q Q Q Q Q Q ( _ K ",
+" ",
+" ",
+" ",
+" ",
+" "
+};
--- /dev/null
+/* XPM */
+static char *close[] = {
+/* columns rows colors chars-per-pixel */
+"24 24 256 2 ",
+" c None",
+". c #FFFF37",
+"X c #FEFEFE",
+"o c #FDFDFD",
+"O c #FBFF30",
+"+ c #FBFBFB",
+"@ c #FBFBFA",
+"# c #FAFF36",
+"$ c #FAFAFD",
+"% c #F9FF33",
+"& c #F9F9F9",
+"* c #F9F9F8",
+"= c #F8FAFD",
+"- c #F7F7F8",
+"; c #F6F6FA",
+": c #F6F6F5",
+"> c #F4FD33",
+", c #F4F5F5",
+"< c #F3F3F5",
+"1 c #F3F3F3",
+"2 c #F2F2F4",
+"3 c #F0F533",
+"4 c #EFF630",
+"5 c #EDF62F",
+"6 c #EDF62E",
+"7 c #EAEAEA",
+"8 c #E9E9EA",
+"9 c #E9E9E9",
+"0 c #E8F02E",
+"q c #E3EB2D",
+"w c #DEB329",
+"e c #DCEA26",
+"r c #DCDCD9",
+"t c #DADAD9",
+"y c #D9E825",
+"u c #D9AD2B",
+"i c #D8E02A",
+"p c #D8D8DD",
+"a c #D7AB29",
+"s c #D6DE28",
+"d c #D5D5E1",
+"f c #D5D4DE",
+"g c #D5D4DD",
+"h c #D4DC29",
+"j c #D4D5D4",
+"k c #D3DF24",
+"l c #D3DA23",
+"z c #D3D3D0",
+"x c #D3A929",
+"c c #D1A125",
+"v c #D0D822",
+"b c #D0A426",
+"n c #CFD822",
+"m c #CFCFD8",
+"M c #CFCFD3",
+"N c gray81",
+"B c #CECED3",
+"V c #CEA327",
+"C c #CDA326",
+"Z c #CDA226",
+"A c #CCD522",
+"S c #CCA425",
+"D c #CBA026",
+"F c #C9C9D2",
+"G c #C9C9CB",
+"H c #C89E25",
+"J c #C79D25",
+"K c #C79D24",
+"L c #C69D25",
+"P c #C3C3CF",
+"I c #C39A24",
+"U c #C2C2D0",
+"Y c #C29923",
+"T c #C19823",
+"R c #C0C820",
+"E c #C0C1C5",
+"W c #C09722",
+"Q c #BDC41E",
+"! c #BCC120",
+"~ c #B9B9BA",
+"^ c #B7B8B7",
+"/ c #B68D18",
+"( c #B5BD1B",
+") c #B5B5B3",
+"_ c #B0B0A8",
+"` c #AEAEAE",
+"' c #AEADB7",
+"] c #AE8816",
+"[ c #ACAEB7",
+"{ c #AC8516",
+"} c #ABB616",
+"| c #A9ABB8",
+" . c #A88116",
+".. c #A78116",
+"X. c #A57B15",
+"o. c #A3AD21",
+"O. c #A3A5B1",
+"+. c #A3A5B0",
+"@. c #A2A4B0",
+"#. c #A2A4AE",
+"$. c #A27B0F",
+"%. c #A1A3AE",
+"&. c #A1A1A4",
+"*. c #A0A0A0",
+"=. c #9F9EAB",
+"-. c #9EA313",
+";. c gray62",
+":. c #9E9D9B",
+">. c #9D9CAB",
+",. c #9B9AA5",
+"<. c #9B780F",
+"1. c #9AA51F",
+"2. c #999D0D",
+"3. c #99751E",
+"4. c #989F10",
+"5. c #989A16",
+"6. c #9696A1",
+"7. c #959C0E",
+"8. c #92991E",
+"9. c #92939B",
+"0. c #90908D",
+"q. c #8D951D",
+"w. c #8D8E92",
+"e. c #8D8D82",
+"r. c #8C8C8A",
+"t. c #8C6919",
+"y. c #8B8B8D",
+"u. c #8A910E",
+"i. c #888B94",
+"p. c #88660F",
+"a. c #87878C",
+"s. c #856018",
+"d. c #7A7A81",
+"f. c #747477",
+"g. c #6F6F6E",
+"h. c #6D6D6A",
+"j. c #666672",
+"k. c #66666A",
+"l. c #646464",
+"z. c #626173",
+"x. c #62591A",
+"c. c gray37",
+"v. c #5D5D5A",
+"b. c #5A440F",
+"n. c #535353",
+"m. c #503A05",
+"M. c #4F5710",
+"N. c #4E4E4F",
+"B. c #4D4D4A",
+"V. c #49510E",
+"C. c #493702",
+"Z. c #492D03",
+"A. c #484643",
+"S. c #47500E",
+"D. c #474839",
+"F. c #452E0E",
+"G. c #44453D",
+"H. c #433710",
+"J. c #432D0C",
+"K. c #423813",
+"L. c #422D0C",
+"P. c #422C0B",
+"I. c #41380C",
+"U. c #402B0B",
+"Y. c #3F470C",
+"T. c #3F3F3D",
+"R. c #3E3E3D",
+"E. c #3D450A",
+"W. c #3C3D50",
+"Q. c #352A0F",
+"!. c #35220A",
+"~. c #323615",
+"^. c #323232",
+"/. c #322B06",
+"(. c #2D3103",
+"). c #2C2C1E",
+"_. c #2A2B2C",
+"`. c #282405",
+"'. c #28200F",
+"]. c #232600",
+"[. c #222323",
+"{. c #201806",
+"}. c #201805",
+"|. c #1F2300",
+" X c #1F201D",
+".X c #1E2200",
+"XX c #1E1201",
+"oX c #1D1C11",
+"OX c #1C1503",
+"+X c #1C1404",
+"@X c #1B1304",
+"#X c #181D00",
+"$X c #171612",
+"%X c #14130E",
+"&X c #130900",
+"*X c #111113",
+"=X c #0F1107",
+"-X c #0F1012",
+";X c #0E0F13",
+":X c #080910",
+">X c #050506",
+",X c black",
+"<X c black",
+"1X c black",
+"2X c black",
+"3X c black",
+"4X c black",
+"5X c black",
+"6X c black",
+"7X c black",
+"8X c black",
+"9X c black",
+"0X c black",
+"qX c black",
+"wX c black",
+"eX c black",
+"rX c black",
+"tX c black",
+"yX c black",
+"uX c black",
+"iX c black",
+"pX c black",
+"aX c black",
+"sX c black",
+"dX c black",
+"fX c black",
+"gX c black",
+"hX c black",
+"jX c black",
+"kX c black",
+"lX c black",
+"zX c black",
+"xX c black",
+"cX c black",
+"vX c black",
+"bX c black",
+"nX c black",
+"mX c black",
+"MX c black",
+"NX c black",
+"BX c black",
+"VX c black",
+"CX c black",
+"ZX c black",
+"AX c black",
+"SX c black",
+"DX c black",
+"FX c black",
+"GX c black",
+"HX c black",
+"JX c black",
+"KX c black",
+"LX c black",
+"PX c black",
+"IX c black",
+"UX c black",
+/* pixels */
+" ",
+" ",
+" ",
+" M ;.- a.c.r ",
+" ` $Xr.d.n.k.N ",
+" ) >X>Xr.: f.c.N ",
+" m P U M : j A._.T.j A.N. ",
+" - ` ).%X$XoXe.f M f d r 7 : g.l. ",
+" ' ~.} Q ( ! x.[. X[._.G.r 7 7 ",
+" 6.#Xe . 5 > ! 7.4.2.-.u.D.E ",
+" =.|.n q s s 3 > . . . k =X| ",
+" =.|.n q s 4 8.S.S.S.V.Y.>XW.j.j.g.&. ",
+" =.|.A 5 4 q.H.F.Q.F.F.F.b.C.Z.&X>XT. ",
+" =.|.k . 8./.s.u c V V V J c w C.;Xr. ",
+" =.(.e o.`.t.c W J W J W J a X.K.r. ",
+" ,.].4.I.3.a V J J J J J V X.Q.w. ",
+" ) ;XXXp./ { ..{ X.....] $.!.9.: ",
+" : ,.;X{.{.XXXXXXXXXXXXXXoX;.- ",
+" ~ #.O.O.O.O.O.O.O.#.' : ",
+" ",
+" ",
+" ",
+" ",
+" "
+};
--- /dev/null
+/* XPM */
+static char *comment[] = {
+/* columns rows colors chars-per-pixel */
+"24 24 256 2 ",
+" c None",
+". c gray99",
+"X c #FBFBFB",
+"o c #F8F8F8",
+"O c #F7F8F8",
+"+ c #F6F5F5",
+"@ c #F5F6F6",
+"# c gray96",
+"$ c #F4F4F4",
+"% c gray95",
+"& c #ECECEC",
+"* c gray92",
+"= c #EBE9E9",
+"- c #E9E8E8",
+"; c #E7E5E5",
+": c #E3E2E2",
+"> c #E2E3E3",
+", c #DDDDDD",
+"< c gray86",
+"1 c #D8D7D7",
+"2 c #D7D8D8",
+"3 c #D6D7D7",
+"4 c gray84",
+"5 c LightGray",
+"6 c #D3D0D0",
+"7 c #D2D2D2",
+"8 c gray82",
+"9 c #D0D0D0",
+"0 c gray81",
+"q c #CECECE",
+"w c #CDCBCB",
+"e c gray79",
+"r c #C8C9C9",
+"t c #C8C8C8",
+"y c #C8C7C7",
+"u c gray78",
+"i c #C5C5C5",
+"p c #C5C3C3",
+"a c #C0BFBF",
+"s c gray74",
+"d c #BBBBBB",
+"f c #BBBABA",
+"g c #B9B9B9",
+"h c gray72",
+"j c gray69",
+"k c #AFB0B0",
+"l c #AFABAB",
+"z c #A4A4A4",
+"x c #9D9D9D",
+"c c #959595",
+"v c gray58",
+"b c #8F8E8E",
+"n c #8F8C8C",
+"m c #898989",
+"M c #888888",
+"N c #888787",
+"B c gray53",
+"V c #868686",
+"C c #848484",
+"Z c gray51",
+"A c #818181",
+"S c #808080",
+"D c gray50",
+"F c #7D7E7E",
+"G c gray49",
+"H c #7C7C7C",
+"J c gray48",
+"K c #797979",
+"L c #787979",
+"P c #787474",
+"I c gray46",
+"U c #717070",
+"Y c #716E6E",
+"T c #706F6F",
+"R c #706E6E",
+"E c #6C6C6C",
+"W c #6A6666",
+"Q c #686868",
+"! c gray40",
+"~ c #646565",
+"^ c #646464",
+"/ c #646262",
+"( c #626262",
+") c gray36",
+"_ c #5A5B5B",
+"` c #565656",
+"' c #494848",
+"] c #484848",
+"[ c gray28",
+"{ c #474343",
+"} c #464343",
+"| c #454444",
+" . c #373838",
+".. c #363535",
+"X. c black",
+"o. c black",
+"O. c black",
+"+. c black",
+"@. c black",
+"#. c black",
+"$. c black",
+"%. c black",
+"&. c black",
+"*. c black",
+"=. c black",
+"-. c black",
+";. c black",
+":. c black",
+">. c black",
+",. c black",
+"<. c black",
+"1. c black",
+"2. c black",
+"3. c black",
+"4. c black",
+"5. c black",
+"6. c black",
+"7. c black",
+"8. c black",
+"9. c black",
+"0. c black",
+"q. c black",
+"w. c black",
+"e. c black",
+"r. c black",
+"t. c black",
+"y. c black",
+"u. c black",
+"i. c black",
+"p. c black",
+"a. c black",
+"s. c black",
+"d. c black",
+"f. c black",
+"g. c black",
+"h. c black",
+"j. c black",
+"k. c black",
+"l. c black",
+"z. c black",
+"x. c black",
+"c. c black",
+"v. c black",
+"b. c black",
+"n. c black",
+"m. c black",
+"M. c black",
+"N. c black",
+"B. c black",
+"V. c black",
+"C. c black",
+"Z. c black",
+"A. c black",
+"S. c black",
+"D. c black",
+"F. c black",
+"G. c black",
+"H. c black",
+"J. c black",
+"K. c black",
+"L. c black",
+"P. c black",
+"I. c black",
+"U. c black",
+"Y. c black",
+"T. c black",
+"R. c black",
+"E. c black",
+"W. c black",
+"Q. c black",
+"!. c black",
+"~. c black",
+"^. c black",
+"/. c black",
+"(. c black",
+"). c black",
+"_. c black",
+"`. c black",
+"'. c black",
+"]. c black",
+"[. c black",
+"{. c black",
+"}. c black",
+"|. c black",
+" X c black",
+".X c black",
+"XX c black",
+"oX c black",
+"OX c black",
+"+X c black",
+"@X c black",
+"#X c black",
+"$X c black",
+"%X c black",
+"&X c black",
+"*X c black",
+"=X c black",
+"-X c black",
+";X c black",
+":X c black",
+">X c black",
+",X c black",
+"<X c black",
+"1X c black",
+"2X c black",
+"3X c black",
+"4X c black",
+"5X c black",
+"6X c black",
+"7X c black",
+"8X c black",
+"9X c black",
+"0X c black",
+"qX c black",
+"wX c black",
+"eX c black",
+"rX c black",
+"tX c black",
+"yX c black",
+"uX c black",
+"iX c black",
+"pX c black",
+"aX c black",
+"sX c black",
+"dX c black",
+"fX c black",
+"gX c black",
+"hX c black",
+"jX c black",
+"kX c black",
+"lX c black",
+"zX c black",
+"xX c black",
+"cX c black",
+"vX c black",
+"bX c black",
+"nX c black",
+"mX c black",
+"MX c black",
+"NX c black",
+"BX c black",
+"VX c black",
+"CX c black",
+"ZX c black",
+"AX c black",
+"SX c black",
+"DX c black",
+"FX c black",
+"GX c black",
+"HX c black",
+"JX c black",
+"KX c black",
+"LX c black",
+"PX c black",
+"IX c black",
+"UX c black",
+/* pixels */
+" ",
+" ",
+" ",
+" ",
+" ",
+" l b B 3 x B s & c B u 3 B B , ",
+" & [ [ ! u D ) k ; E ) s u ` ! 3 ",
+" & [ u ",
+" + B 3 ",
+" ; + ",
+" + E 0 ",
+" 3 I W 0 s Y .y ",
+" , D I 3 s I ..y ",
+" + Y 0 ",
+" ; + ",
+" + b 3 ",
+" & [ u ",
+" & [ [ E 0 B ! l & D ! s 3 ! W 3 ",
+" + z D D 0 c D s ; b I u 3 I D , ",
+" ",
+" ",
+" ",
+" ",
+" "
+};
--- /dev/null
+/* XPM */
+static char *connection[] = {
+/* columns rows colors chars-per-pixel */
+"24 24 256 2 ",
+" c None",
+". c #FEFFFF",
+"X c #FDFEFF",
+"o c #FCFEFE",
+"O c #F8F9FE",
+"+ c #F7F9FE",
+"@ c #F4F6FD",
+"# c #F4F6FB",
+"$ c gray95",
+"% c #EFEFEF",
+"& c #EFCB44",
+"* c #EFCA45",
+"= c #EDCB44",
+"- c #ECEFF9",
+"; c #ECCA45",
+": c #EBC947",
+"> c #EACA45",
+", c #EAC947",
+"< c #E8CA44",
+"1 c #E8C946",
+"2 c #E8C749",
+"3 c #E7EEF7",
+"4 c #E7EDF7",
+"5 c #E7C846",
+"6 c #E6ECF7",
+"7 c #E6C846",
+"8 c #E6C748",
+"9 c #E6C64A",
+"0 c #E5C749",
+"q c #E5C64A",
+"w c #E4E7EE",
+"e c #E4E7ED",
+"r c #E4E3E3",
+"t c #E4E2E2",
+"y c #E4E1DE",
+"u c #E4DFDC",
+"i c gray89",
+"p c #E3E2E2",
+"a c #E3C749",
+"s c #E2E8F6",
+"d c #E2E2E2",
+"f c #E1E1E1",
+"g c gray88",
+"h c #DFC44B",
+"j c #DEC54B",
+"k c #DEC34C",
+"l c #DDC34C",
+"z c #D7E2F3",
+"x c gray80",
+"c c #C7D4EC",
+"v c #C5D6ED",
+"b c #BDBCBC",
+"n c #BCAF5F",
+"m c #B8AF5F",
+"M c #ABA967",
+"N c #A7C0E3",
+"B c #A6BDE3",
+"V c #A4A4A4",
+"C c #A3A568",
+"Z c #9EB8E3",
+"A c #9EA16D",
+"S c #9C9D6E",
+"D c #9BB7DF",
+"F c #9BA06D",
+"G c #969491",
+"H c #959390",
+"J c #929191",
+"K c #918E8E",
+"L c #908E8E",
+"P c gray56",
+"I c #8E8E8E",
+"U c #8B8B8B",
+"Y c #8A9680",
+"T c #8A957B",
+"R c #89957B",
+"E c gray53",
+"W c #84937A",
+"Q c #83937A",
+"! c gray51",
+"~ c #7A9ED7",
+"^ c #789DD5",
+"/ c #789BD6",
+"( c #788C7E",
+") c #739AD2",
+"_ c #728985",
+"` c #628DCF",
+"' c #618290",
+"] c #608DCD",
+"[ c #5F7E9A",
+"{ c #5F7D8E",
+"} c #5D7E9A",
+"| c #5681CA",
+" . c #5481CA",
+".. c #5080C8",
+"X. c #4E5B6F",
+"o. c #4D7EC7",
+"O. c #4D586F",
+"+. c #4C6DA0",
+"@. c #4B7EC7",
+"#. c #4A6DA0",
+"$. c #4A4643",
+"%. c #4976B7",
+"&. c #4876B9",
+"*. c #486182",
+"=. c #484743",
+"-. c #466188",
+";. c #4477C6",
+":. c #423E3D",
+">. c #4177BE",
+",. c #413E3D",
+"<. c #4077C0",
+"1. c #4070B8",
+"2. c #403E3E",
+"3. c #3E3E3E",
+"4. c #3D3A3A",
+"5. c #3A3A3A",
+"6. c #3969AB",
+"7. c #386BAA",
+"8. c #3869AC",
+"9. c #366BAA",
+"0. c gray21",
+"q. c #343434",
+"w. c #2B5CA3",
+"e. c #275CA7",
+"r. c #272727",
+"t. c #252525",
+"y. c black",
+"u. c black",
+"i. c black",
+"p. c black",
+"a. c black",
+"s. c black",
+"d. c black",
+"f. c black",
+"g. c black",
+"h. c black",
+"j. c black",
+"k. c black",
+"l. c black",
+"z. c black",
+"x. c black",
+"c. c black",
+"v. c black",
+"b. c black",
+"n. c black",
+"m. c black",
+"M. c black",
+"N. c black",
+"B. c black",
+"V. c black",
+"C. c black",
+"Z. c black",
+"A. c black",
+"S. c black",
+"D. c black",
+"F. c black",
+"G. c black",
+"H. c black",
+"J. c black",
+"K. c black",
+"L. c black",
+"P. c black",
+"I. c black",
+"U. c black",
+"Y. c black",
+"T. c black",
+"R. c black",
+"E. c black",
+"W. c black",
+"Q. c black",
+"!. c black",
+"~. c black",
+"^. c black",
+"/. c black",
+"(. c black",
+"). c black",
+"_. c black",
+"`. c black",
+"'. c black",
+"]. c black",
+"[. c black",
+"{. c black",
+"}. c black",
+"|. c black",
+" X c black",
+".X c black",
+"XX c black",
+"oX c black",
+"OX c black",
+"+X c black",
+"@X c black",
+"#X c black",
+"$X c black",
+"%X c black",
+"&X c black",
+"*X c black",
+"=X c black",
+"-X c black",
+";X c black",
+":X c black",
+">X c black",
+",X c black",
+"<X c black",
+"1X c black",
+"2X c black",
+"3X c black",
+"4X c black",
+"5X c black",
+"6X c black",
+"7X c black",
+"8X c black",
+"9X c black",
+"0X c black",
+"qX c black",
+"wX c black",
+"eX c black",
+"rX c black",
+"tX c black",
+"yX c black",
+"uX c black",
+"iX c black",
+"pX c black",
+"aX c black",
+"sX c black",
+"dX c black",
+"fX c black",
+"gX c black",
+"hX c black",
+"jX c black",
+"kX c black",
+"lX c black",
+"zX c black",
+"xX c black",
+"cX c black",
+"vX c black",
+"bX c black",
+"nX c black",
+"mX c black",
+"MX c black",
+"NX c black",
+"BX c black",
+"VX c black",
+"CX c black",
+"ZX c black",
+"AX c black",
+"SX c black",
+"DX c black",
+"FX c black",
+"GX c black",
+"HX c black",
+"JX c black",
+"KX c black",
+"LX c black",
+"PX c black",
+"IX c black",
+"UX c black",
+/* pixels */
+" ",
+" x V $ ",
+" E r.r ",
+" P 0.r ",
+" P 3.r ",
+" P 0.r ",
+" @ 3 3 G :.r ",
+" N ` o.| ) c G :.r ",
+" + ) 6._ A S { >.*.$.r ",
+" Z 6.M & & & h Y w.X.y ",
+" - | W & 8 8 8 5 h [ +.r ",
+" z >.n & 8 8 8 8 5 T >.w ",
+" z %.n & 8 8 8 8 5 T %.w ",
+" - | ( & 8 8 8 2 h [ +.r ",
+" D 9.M 2 5 & h Y e.X.u ",
+" @ ~ 6.( C A { ;.-.$.r ",
+" + B ` ;.o.) c K :.r ",
+" @ 3 3 G 3.r ",
+" P 3.r ",
+" P 3.r ",
+" P 0.u ",
+" E r.r ",
+" b P % ",
+" "
+};
--- /dev/null
+/* XPM */
+static char *content[] = {
+/* columns rows colors chars-per-pixel */
+"24 24 256 2 ",
+" c None",
+". c #FFFFFE",
+"X c #FFFFFA",
+"o c #FFFEF5",
+"O c #FDFDFD",
+"+ c #FDFDFB",
+"@ c gray99",
+"# c #FBFBFB",
+"$ c gray98",
+"% c #F9F9F9",
+"& c #F8F8F8",
+"* c #F8F8F7",
+"= c #F7FAFB",
+"- c #F7F8F8",
+"; c #F6F6F7",
+": c gray96",
+"> c #F4F6FC",
+", c #F4F4F4",
+"< c #F3F3F3",
+"1 c #F1F1F1",
+"2 c #F0F0F3",
+"3 c #EFF1F9",
+"4 c #EFEDED",
+"5 c #EEEEEE",
+"6 c #EBEEFB",
+"7 c #EAECF9",
+"8 c #EAEAEA",
+"9 c #E8ECF7",
+"0 c gray91",
+"q c #E6E6E6",
+"w c #E4E2E1",
+"e c #E3E2DF",
+"r c #E2F0FF",
+"t c #E2E4E4",
+"y c #E1E1E2",
+"u c #DDDDD6",
+"i c #DCDCDE",
+"p c #DCD8CF",
+"a c gray86",
+"s c gray85",
+"d c #D7D6CF",
+"f c #D6DFFC",
+"g c #D6DDF1",
+"h c #D5D5D3",
+"j c #D4DDFA",
+"k c #D3D9F1",
+"l c LightGray",
+"z c #D3D3D2",
+"x c #D3D2D4",
+"c c #D2E0FF",
+"v c #D2D2D2",
+"b c #D1DBFF",
+"n c #D1DAF8",
+"m c gray82",
+"M c #D0DAF8",
+"N c #D0D9F7",
+"B c #CED6F1",
+"V c #CED0D2",
+"C c #CECECE",
+"Z c #CDD7F8",
+"A c #CBD4F1",
+"S c #CBD3EE",
+"D c #CBCCD2",
+"F c #CBCBCB",
+"G c #C9CBD1",
+"H c #C9C8C7",
+"J c #C6C7C7",
+"K c #C4C5C5",
+"L c gray77",
+"P c #C3C3C4",
+"I c #C3C3C3",
+"U c #C2D4FF",
+"Y c gray76",
+"T c #C2C2C1",
+"R c #C1C4C8",
+"E c #C1C1C2",
+"W c #C1C1C1",
+"Q c #C0CCF7",
+"! c #C0CBF8",
+"~ c #C0C1C1",
+"^ c #C0C0C3",
+"/ c #C0C0C0",
+"( c #BCBBBA",
+") c #BACAF8",
+"_ c #BABAB9",
+"` c #B9B9B9",
+"' c gray72",
+"] c #B7B8B8",
+"[ c #B7B7B7",
+"{ c #B7B6A6",
+"} c #B5CBFF",
+"| c #B5B5B4",
+" . c gray70",
+".. c #B2C8FF",
+"X. c #B2C2F6",
+"o. c #B1C7FF",
+"O. c #B0BFF3",
+"+. c #AFC0F5",
+"@. c #ADC3FF",
+"#. c #ADBEF5",
+"$. c #ABBEF6",
+"%. c #A8BFFF",
+"&. c gray66",
+"*. c #A4A7B0",
+"=. c #A3BBFF",
+"-. c #A3BAFF",
+";. c #A2A2A2",
+":. c #A0A3A5",
+">. c #9F9F9F",
+",. c #9EB4FA",
+"<. c #9D9D9D",
+"1. c #9B9B9B",
+"2. c gray60",
+"3. c #969797",
+"4. c gray59",
+"5. c #95ABF3",
+"6. c #95AAF2",
+"7. c #959595",
+"8. c #949495",
+"9. c gray58",
+"0. c #939393",
+"q. c #929292",
+"w. c #919292",
+"e. c gray57",
+"r. c #8FA7F1",
+"t. c gray56",
+"y. c #8F8F8E",
+"u. c #8F8A83",
+"i. c #8E8E8E",
+"p. c #8E8575",
+"a. c #8DA4F5",
+"s. c #8D9EE0",
+"d. c #8CA5F0",
+"f. c #8CA3F3",
+"g. c gray54",
+"h. c #898373",
+"j. c #898273",
+"k. c #88A0F4",
+"l. c #888585",
+"z. c #888484",
+"x. c #888273",
+"c. c #87A1F7",
+"v. c #879FEF",
+"b. c #879EEB",
+"n. c #857F75",
+"m. c #84858C",
+"M. c #837D68",
+"N. c #829EF1",
+"B. c #828281",
+"V. c #818076",
+"C. c #7F9AF1",
+"Z. c #7F7F7D",
+"A. c #797265",
+"S. c gray47",
+"D. c #77787B",
+"F. c #776E60",
+"G. c #7592F0",
+"H. c gray46",
+"J. c #74716B",
+"K. c #7290EE",
+"L. c #727066",
+"P. c #6C8BF0",
+"I. c #6B89ED",
+"U. c #6B6867",
+"Y. c #6A8CFC",
+"T. c #6786EF",
+"R. c #676764",
+"E. c #6487F8",
+"W. c #6389FF",
+"Q. c #6285FA",
+"!. c #6182EE",
+"~. c #61615B",
+"^. c #6083F3",
+"/. c #6075C3",
+"(. c #5C7FF4",
+"). c #5B7EEE",
+"_. c #5980FD",
+"`. c #575755",
+"'. c #557BF3",
+"]. c #547AED",
+"[. c #5478EE",
+"{. c #535353",
+"}. c #515151",
+"|. c #5076EC",
+" X c gray31",
+".X c #4E72EC",
+"XX c #4D72EA",
+"oX c #4C4C4C",
+"OX c #4B4B4B",
+"+X c #4B453F",
+"@X c #446EF4",
+"#X c #434349",
+"$X c #426CED",
+"%X c #416AEC",
+"&X c #414144",
+"*X c #413E3F",
+"=X c #413E3E",
+"-X c #4067E9",
+";X c gray25",
+":X c #403E3E",
+">X c #403D3D",
+",X c #3E3E42",
+"<X c #3E3E40",
+"1X c #3E3C3C",
+"2X c #3D66EA",
+"3X c #3D3B35",
+"4X c #3C3C3A",
+"5X c #3C3B39",
+"6X c #3C3A34",
+"7X c #3A3B3B",
+"8X c #3A3A3E",
+"9X c #39393A",
+"0X c #3764F0",
+"qX c #373737",
+"wX c gray21",
+"eX c #3561ED",
+"rX c #333231",
+"tX c #323330",
+"yX c gray19",
+"uX c #302B24",
+"iX c #2F2F2F",
+"pX c #2E2B29",
+"aX c #2D4CBD",
+"sX c #2D2922",
+"dX c #2C2C2C",
+"fX c #2B2B2C",
+"gX c #2B2927",
+"hX c #2A2A2A",
+"jX c #2A2922",
+"kX c #292922",
+"lX c #252421",
+"zX c #24221F",
+"xX c #232424",
+"cX c #222221",
+"vX c gray13",
+"bX c #202020",
+"nX c #201D16",
+"mX c #1F1F1E",
+"MX c #1D1D1D",
+"NX c gray11",
+"BX c #141411",
+"VX c #131313",
+"CX c #111112",
+"ZX c #111013",
+"AX c #0E1423",
+"SX c #09196B",
+"DX c black",
+"FX c black",
+"GX c black",
+"HX c black",
+"JX c black",
+"KX c black",
+"LX c black",
+"PX c black",
+"IX c black",
+"UX c black",
+/* pixels */
+" ",
+" ",
+" ",
+" ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ",
+" t. X X X X X X X X X X X X X X X XJ ",
+" XDXDXDXDXDXDXDXDXDXDXDXDXDXDXDXDX>. ",
+" `.qXZ.3.t.Z.H.t.3.3.3.3.3.3.3.U.BX;. ",
+" ; 1XB.4 >.[ [ 3.>.>.>.>.>.[ 9 1Xt. ",
+" ; 1Xl.H 3XJ. o L.3X+X1XqXqXiX`.u ,X3. ",
+" o ,XD.= g S g f B S g 6 ; ; ; ; e sX3. ",
+" > *Xn.U @X(.].|.^.'.eXs.4 ; 4 q iX3. ",
+" ; *Xp.=..XB f Z g f W.SXA. J XC qX3. ",
+" = *XV.} eXT.P.).I.6 r./.F.n.[ mXJ 1X3. ",
+" ; *Xp.@.|.#.X.#.#.6 K.%.p.qX( iX( &Xt. ",
+" = *XV.o.$X5.5.r.5.9 G.c.d ( q [ i iX3. ",
+" ; *Xp.} $Xv.N.C.r.> N.v.p J 4 ( i iX3. ",
+" = *XV.=.-XQ f ! ) #.2X,.M.3X[ mXJ &Xt. ",
+" ; *Xu.r W..XaX).Y.E._.c { B.q H.i &X3. ",
+" ; 1X~.h h m.AX*.D D V h D h C h ( mX3. ",
+" R.BXlXuXnXBXzXsXlXsXlXlXiXmXiXmXBX;. ",
+" q R J ( R d J J J J J J ( J ( J C ; ",
+" ",
+" ",
+" "
+};
--- /dev/null
+/* XPM */
+static char *continuous_signal[] = {
+/* columns rows colors chars-per-pixel */
+"24 24 256 2 ",
+" c black",
+". c #010101",
+"X c #020202",
+"o c gray1",
+"O c #040404",
+"+ c gray2",
+"@ c #060606",
+"# c #070707",
+"$ c gray3",
+"% c #090909",
+"& c gray4",
+"* c #0B0B0B",
+"= c #0C0C0C",
+"- c gray5",
+"; c #0E0E0E",
+": c gray6",
+"> c #101010",
+", c #111111",
+"< c gray7",
+"1 c #131313",
+"2 c gray8",
+"3 c #151515",
+"4 c #161616",
+"5 c gray9",
+"6 c #181818",
+"7 c #191919",
+"8 c gray10",
+"9 c #1B1B1B",
+"0 c gray11",
+"q c #1D1D1D",
+"w c #1E1E1E",
+"e c gray12",
+"r c #202020",
+"t c gray13",
+"y c #222222",
+"u c #232323",
+"i c gray14",
+"p c #252525",
+"a c gray15",
+"s c #272727",
+"d c #282828",
+"f c gray16",
+"g c #2A2A2A",
+"h c gray17",
+"j c #2C2C2C",
+"k c #2D2D2D",
+"l c gray18",
+"z c #2F2F2F",
+"x c gray19",
+"c c #313131",
+"v c #323232",
+"b c gray20",
+"n c #343434",
+"m c #353535",
+"M c gray21",
+"N c #373737",
+"B c gray22",
+"V c #393939",
+"C c #3A3A3A",
+"Z c gray23",
+"A c #3C3C3C",
+"S c gray24",
+"D c #3E3E3E",
+"F c #3F3F3F",
+"G c gray25",
+"H c #414141",
+"J c gray26",
+"K c #434343",
+"L c #444444",
+"P c gray27",
+"I c #464646",
+"U c gray28",
+"Y c #484848",
+"T c #494949",
+"R c gray29",
+"E c #4B4B4B",
+"W c #4C4C4C",
+"Q c gray30",
+"! c #4E4E4E",
+"~ c gray31",
+"^ c #505050",
+"/ c #515151",
+"( c gray32",
+") c #535353",
+"_ c gray33",
+"` c #555555",
+"' c #565656",
+"] c gray34",
+"[ c #585858",
+"{ c gray35",
+"} c #5A5A5A",
+"| c #5B5B5B",
+" . c gray36",
+".. c #5D5D5D",
+"X. c gray37",
+"o. c #5F5F5F",
+"O. c #606060",
+"+. c gray38",
+"@. c #626262",
+"#. c gray39",
+"$. c #646464",
+"%. c #656565",
+"&. c gray40",
+"*. c #676767",
+"=. c #686868",
+"-. c DimGray",
+";. c #6A6A6A",
+":. c gray42",
+">. c #6C6C6C",
+",. c #6D6D6D",
+"<. c gray43",
+"1. c #6F6F6F",
+"2. c gray44",
+"3. c #717171",
+"4. c #727272",
+"5. c gray45",
+"6. c #747474",
+"7. c gray46",
+"8. c #767676",
+"9. c #777777",
+"0. c gray47",
+"q. c #797979",
+"w. c gray48",
+"e. c #7B7B7B",
+"r. c #7C7C7C",
+"t. c gray49",
+"y. c #7E7E7E",
+"u. c gray50",
+"i. c #808080",
+"p. c #818181",
+"a. c gray51",
+"s. c #838383",
+"d. c #848484",
+"f. c gray52",
+"g. c #868686",
+"h. c gray53",
+"j. c #888888",
+"k. c #898989",
+"l. c gray54",
+"z. c #8B8B8B",
+"x. c gray55",
+"c. c #8D8D8D",
+"v. c #8E8E8E",
+"b. c gray56",
+"n. c #909090",
+"m. c gray57",
+"M. c #929292",
+"N. c #939393",
+"B. c gray58",
+"V. c #959595",
+"C. c gray59",
+"Z. c #979797",
+"A. c #989898",
+"S. c gray60",
+"D. c #9A9A9A",
+"F. c #9B9B9B",
+"G. c gray61",
+"H. c #9D9D9D",
+"J. c gray62",
+"K. c #9F9F9F",
+"L. c #A0A0A0",
+"P. c gray63",
+"I. c #A2A2A2",
+"U. c gray64",
+"Y. c #A4A4A4",
+"T. c #A5A5A5",
+"R. c gray65",
+"E. c #A7A7A7",
+"W. c gray66",
+"Q. c #A9A9A9",
+"!. c #AAAAAA",
+"~. c gray67",
+"^. c #ACACAC",
+"/. c gray68",
+"(. c #AEAEAE",
+"). c #AFAFAF",
+"_. c gray69",
+"`. c #B1B1B1",
+"'. c #B2B2B2",
+"]. c gray70",
+"[. c #B4B4B4",
+"{. c gray71",
+"}. c #B6B6B6",
+"|. c #B7B7B7",
+" X c gray72",
+".X c #B9B9B9",
+"XX c gray73",
+"oX c #BBBBBB",
+"OX c #BCBCBC",
+"+X c gray74",
+"@X c gray",
+"#X c gray75",
+"$X c #C0C0C0",
+"%X c #C1C1C1",
+"&X c gray76",
+"*X c #C3C3C3",
+"=X c gray77",
+"-X c #C5C5C5",
+";X c #C6C6C6",
+":X c gray78",
+">X c #C8C8C8",
+",X c gray79",
+"<X c #CACACA",
+"1X c #CBCBCB",
+"2X c gray80",
+"3X c #CDCDCD",
+"4X c #CECECE",
+"5X c gray81",
+"6X c #D0D0D0",
+"7X c gray82",
+"8X c #D2D2D2",
+"9X c LightGray",
+"0X c gray83",
+"qX c #D5D5D5",
+"wX c gray84",
+"eX c #D7D7D7",
+"rX c #D8D8D8",
+"tX c gray85",
+"yX c #DADADA",
+"uX c gray86",
+"iX c gainsboro",
+"pX c #DDDDDD",
+"aX c gray87",
+"sX c #DFDFDF",
+"dX c gray88",
+"fX c #E1E1E1",
+"gX c #E2E2E2",
+"hX c gray89",
+"jX c #E4E4E4",
+"kX c gray90",
+"lX c #E6E6E6",
+"zX c #E7E7E7",
+"xX c gray91",
+"cX c #E9E9E9",
+"vX c #EAEAEA",
+"bX c gray92",
+"nX c #ECECEC",
+"mX c gray93",
+"MX c #EEEEEE",
+"NX c #EFEFEF",
+"BX c gray94",
+"VX c #F1F1F1",
+"CX c gray95",
+"ZX c #F3F3F3",
+"AX c #F4F4F4",
+"SX c gray96",
+"DX c #F6F6F6",
+"FX c gray97",
+"GX c #F8F8F8",
+"HX c #F9F9F9",
+"JX c gray98",
+"KX c #FBFBFB",
+"LX c gray99",
+"PX c #FDFDFD",
+"IX c #FEFEFE",
+"UX c None",
+/* pixels */
+"UXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUX",
+"UXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUX",
+"UXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUX",
+"UXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUX",
+"UXUXUXUXUXUXUXUXzXUXUXUXUXUXUXzXUXUXUXUXUXUXUXUX",
+"UXUXUXUXUXUXUXK.z }.UXUXUXUX}.z K.UXUXUXUXUXUXUX",
+"UXUXUXUXUXUXK.@ @ Z ZXUXUXZXN @ : U.UXUXUXUXUXUX",
+"UXUXUXUXUXK.: @ 5 /.UXUXUXUX}.5 @ : K.UXUXUXUXUX",
+"UXUXUXUXK.: @ 5 /.UXUXUXUXUXUX}.5 @ @ K.UXUXUXUX",
+"UXUXUXU.@ @ : }.UXUXUXUXUXUXUXUX}.5 @ : U.UXUXUX",
+"UXUXK.: @ 5 }.UXUXUXUXUXUXUXUXUXUX}.5 @ : K.UXUX",
+"UXK.@ @ 5 }.UXUXUXUXUXUXUXUXUXUXUXUX#X5 @ @ K.UX",
+"UXK.@ @ 5 -XUXUXUXUXUXUXUXUXUXUXUXUX-X5 @ @ K.UX",
+"UXUXK.: @ e #XUXUXUXUXUXUXUXUXUXUX-Xe @ : K.UXUX",
+"UXUXUXK.@ @ 5 #XUXUXUXUXUXUXUXUX#Xe @ @ K.UXUXUX",
+"UXUXUXUXK.@ @ e #XUXUXUXUXUXUX#Xu @ @ K.UXUXUXUX",
+"UXUXUXUXUXK.: @ e #XUXUXUXUX#Xe @ : B.UXUXUXUXUX",
+"UXUXUXUXUXUXK.: @ N cXUXUXZXZ @ @ K.UXUXUXUXUXUX",
+"UXUXUXUXUXUXUXB.z /.UXUXUXUX/.z B.UXUXUXUXUXUXUX",
+"UXUXUXUXUXUXUXUXzXUXUXUXUXUXUXzXUXUXUXUXUXUXUXUX",
+"UXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUX",
+"UXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUX",
+"UXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUX",
+"UXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUX"
+};
--- /dev/null
+/* XPM */
+static char *copy[] = {
+/* columns rows colors chars-per-pixel */
+"24 24 256 2 ",
+" c None",
+". c #FFFFF8",
+"X c #FFFEF5",
+"o c #FBFCFF",
+"O c #FBFBFB",
+"+ c gray98",
+"@ c #F8F2EA",
+"# c gray97",
+"$ c #F7F7F6",
+"% c #F7F6F6",
+"& c #F6F9FF",
+"* c #F6F6F6",
+"= c #F6F1E9",
+"- c #F5F9FF",
+"; c #F5F9FE",
+": c #F4FDFF",
+"> c #F0F9FF",
+", c gray94",
+"< c #EFF5FE",
+"1 c #EBF3FE",
+"2 c gray92",
+"3 c #EAF2FE",
+"4 c #E9E9E9",
+"5 c gray91",
+"6 c #E7F1FE",
+"7 c #E7F0FE",
+"8 c #E5EFFE",
+"9 c #E3EEFE",
+"0 c #E2DCD3",
+"q c #DFE8F6",
+"w c #DDDDDD",
+"e c #D4E5FD",
+"r c gray83",
+"t c #D3E4FD",
+"y c #D2E4FD",
+"u c #D2D2D2",
+"i c gray82",
+"p c #D1D1D0",
+"a c #D0E2FD",
+"s c #CFE2FC",
+"d c #CEE1FD",
+"f c #CECECE",
+"g c #CDE1FD",
+"h c #CBE0FD",
+"j c #CBDFFD",
+"k c #CAE3FF",
+"l c #C9DEFD",
+"z c gray79",
+"x c #C8DEFD",
+"c c #C7DDFD",
+"v c gray78",
+"b c #C6DDFD",
+"n c #C3DBFE",
+"m c #C2DAFC",
+"M c #C1DAFE",
+"N c #C1D9FC",
+"B c #C0D8FC",
+"V c #BEC7D3",
+"C c #BBC5D3",
+"Z c #BBBBBB",
+"A c #BAD5FC",
+"S c #B9D5FC",
+"D c #B9B9B9",
+"F c gray72",
+"G c #B6B6B6",
+"H c gray70",
+"J c gray69",
+"K c #B0B0AF",
+"L c #AFAFAF",
+"P c #ACACAC",
+"I c #A9CBFB",
+"U c #A8CAFB",
+"Y c #A4C8FB",
+"T c #A4A7A9",
+"R c #A4A4A4",
+"E c #A4A3A1",
+"W c #A2C6F9",
+"Q c #9FC5FB",
+"! c #9F9F9F",
+"~ c #9EC4FB",
+"^ c #9DC3FB",
+"/ c #9DA6B4",
+"( c #9D9D9D",
+") c #9BC4FF",
+"_ c #9BC3FE",
+"` c #9BC2FB",
+"' c #99C2FF",
+"] c #99C2FD",
+"[ c #98C1FB",
+"{ c #97C0FB",
+"} c #97C0FA",
+"| c #94BEFB",
+" . c gray58",
+".. c #93BDFA",
+"X. c #939393",
+"o. c #939291",
+"O. c #929292",
+"+. c #91BCFA",
+"@. c #919AA8",
+"#. c #90B8F3",
+"$. c #8FBBFA",
+"%. c gray56",
+"&. c #8CB9FA",
+"*. c gray55",
+"=. c #8C867E",
+"-. c #8AB8FA",
+";. c gray54",
+":. c #89B7FA",
+">. c #898989",
+",. c #88B7FB",
+"<. c #888888",
+"1. c #888885",
+"2. c gray53",
+"3. c #86B5FB",
+"4. c #86B5FA",
+"5. c #868686",
+"6. c #85B5FA",
+"7. c gray52",
+"8. c #84B4FA",
+"9. c #83B4FA",
+"0. c #82B3FA",
+"q. c #82B1F5",
+"w. c #828B99",
+"e. c #818181",
+"r. c #80B2F9",
+"t. c #80B1FA",
+"y. c #808080",
+"u. c #7FAFF4",
+"i. c gray50",
+"p. c #7EB0FA",
+"a. c #7DB0FA",
+"s. c #7CB0FA",
+"d. c #7CAFFA",
+"f. c #7CAEF7",
+"g. c #7B7B7B",
+"h. c #7AAEFA",
+"j. c gray48",
+"k. c #79ABF2",
+"l. c #797979",
+"z. c #78ADFA",
+"x. c #78818F",
+"c. c #77ACFA",
+"v. c #77AAF3",
+"b. c #76ACF9",
+"n. c #76AAF4",
+"m. c #74AAF9",
+"M. c #73AAF9",
+"N. c #727272",
+"B. c #68A3F9",
+"V. c #63A1F8",
+"C. c #619DF6",
+"Z. c #5C84BF",
+"A. c #5296F8",
+"S. c #4890F7",
+"D. c #438DF7",
+"F. c black",
+"G. c black",
+"H. c black",
+"J. c black",
+"K. c black",
+"L. c black",
+"P. c black",
+"I. c black",
+"U. c black",
+"Y. c black",
+"T. c black",
+"R. c black",
+"E. c black",
+"W. c black",
+"Q. c black",
+"!. c black",
+"~. c black",
+"^. c black",
+"/. c black",
+"(. c black",
+"). c black",
+"_. c black",
+"`. c black",
+"'. c black",
+"]. c black",
+"[. c black",
+"{. c black",
+"}. c black",
+"|. c black",
+" X c black",
+".X c black",
+"XX c black",
+"oX c black",
+"OX c black",
+"+X c black",
+"@X c black",
+"#X c black",
+"$X c black",
+"%X c black",
+"&X c black",
+"*X c black",
+"=X c black",
+"-X c black",
+";X c black",
+":X c black",
+">X c black",
+",X c black",
+"<X c black",
+"1X c black",
+"2X c black",
+"3X c black",
+"4X c black",
+"5X c black",
+"6X c black",
+"7X c black",
+"8X c black",
+"9X c black",
+"0X c black",
+"qX c black",
+"wX c black",
+"eX c black",
+"rX c black",
+"tX c black",
+"yX c black",
+"uX c black",
+"iX c black",
+"pX c black",
+"aX c black",
+"sX c black",
+"dX c black",
+"fX c black",
+"gX c black",
+"hX c black",
+"jX c black",
+"kX c black",
+"lX c black",
+"zX c black",
+"xX c black",
+"cX c black",
+"vX c black",
+"bX c black",
+"nX c black",
+"mX c black",
+"MX c black",
+"NX c black",
+"BX c black",
+"VX c black",
+"CX c black",
+"ZX c black",
+"AX c black",
+"SX c black",
+"DX c black",
+"FX c black",
+"GX c black",
+"HX c black",
+"JX c black",
+"KX c black",
+"LX c black",
+"PX c black",
+"IX c black",
+"UX c black",
+/* pixels */
+" ",
+" ",
+" # %.2.2.%.2.%.2.%.i.2.Z ",
+" w i.w 2 w 2 w 2 w i.w G G ",
+" 2 %. 2.2 Z G ",
+" 2 .v i.%.2.%.i.f .i.2.2.i. ",
+" 2 2. # # # # = X X = = 0 =. ",
+" 2 %.r ! R R R Q Q { Q Q #.Z.| Q | e ",
+" 2 %.w f r f V C.A c A A c s c V.$.D.e ",
+" 2 %.2 f r r V u. 3. A A.s ",
+" 2 %.r ! R R @.u.s $.{ { { $.s c.3.Q D.V. ",
+" 2 2. # # # q 3.6 j s s s c < < j s A d. ",
+" 2 .v i.1.1.x.v.6 j s s s s c c s s 8 p. ",
+" 2 2. & 3.s | Q { Q Q Q Q Q | s 3. ",
+" w .r %. . .w.v. & & & & & & & & & 8 p. ",
+" 2 N.Z L L L / q.A c.p.p.d.d.d.d.p.d.c 3. ",
+" L ! R R R @.v. < p. ",
+" & $.A c.p.p.p.p.p.p.p.c.c 3. ",
+" 6 p. & & & & & & & & & 8 p. ",
+" 6 3.e { Q Q Q Q Q Q Q Q e 3. ",
+" 6 c.c Y I I I I I I I Y c c. ",
+" & d.3.:.:.:.:.:.:.:.:.:.c.| ",
+" ",
+" "
+};
--- /dev/null
+/* XPM */
+static char *create_line[] = {
+/* columns rows colors chars-per-pixel */
+"24 24 256 2 ",
+" c None",
+". c #FFFFFE",
+"X c #FFFFFD",
+"o c #FFFFFB",
+"O c #FEFEFF",
+"+ c #FEFEFE",
+"@ c #FDFDFD",
+"# c #FCFCFF",
+"$ c gray99",
+"% c gray98",
+"& c #F9F9FE",
+"* c #F9F9FC",
+"= c #F9F9F9",
+"- c #F8F8F9",
+"; c #F8F8F8",
+": c #F7F7FA",
+"> c gray97",
+", c #F7F7F4",
+"< c #F6F6F5",
+"1 c #F5F5FC",
+"2 c #F3F3F3",
+"3 c gray95",
+"4 c #F1F1F1",
+"5 c #EFEFEF",
+"6 c #EEEEEE",
+"7 c gray93",
+"8 c #EBEBF6",
+"9 c #EAEAEA",
+"0 c #E9E9F6",
+"q c #E9E9E9",
+"w c #E5E5F7",
+"e c gray90",
+"r c #E4E4F5",
+"t c #E3E3F7",
+"y c #E3E3F3",
+"u c #E3E3F1",
+"i c gray89",
+"p c #E2E2E2",
+"a c #E1E1F0",
+"s c #E1E1E1",
+"d c #DFDFDF",
+"f c gray87",
+"g c #DDDDDD",
+"h c #DBDBED",
+"j c #DADADA",
+"k c #D9D9E7",
+"l c gray85",
+"z c #D7D7D7",
+"x c gray84",
+"c c #D6D2CC",
+"v c #D5D5ED",
+"b c #D5D5D5",
+"n c LightGray",
+"m c #D2D3F4",
+"M c #CFCFEB",
+"N c #CECEE7",
+"B c #CECECE",
+"V c #CDCDE6",
+"C c #CBCBCB",
+"Z c #CBCBC9",
+"A c #CACACA",
+"S c #C6C6EC",
+"D c #C5C5CC",
+"F c #C3C3C3",
+"G c #C1C1C1",
+"H c #C1C1BF",
+"J c #C0C0C0",
+"K c gray75",
+"L c #BFBEBE",
+"P c gray74",
+"I c #BCBCBC",
+"U c #BBBBBB",
+"Y c gray73",
+"T c #B9B9B9",
+"R c gray72",
+"E c #B7B7B7",
+"W c #B4B4B4",
+"Q c gray70",
+"! c #B3B3B2",
+"~ c #B1B1E0",
+"^ c #B1B1AD",
+"/ c #B0B0D7",
+"( c #AFAFAF",
+") c gray68",
+"_ c #ACACAC",
+"` c gray67",
+"' c #ABA8A8",
+"] c #AAAAD9",
+"[ c #AAAAAA",
+"{ c #A6A6D2",
+"} c #A6A6A5",
+"| c #A5A5A5",
+" . c gray64",
+".. c #A2A2D2",
+"X. c #A0A09C",
+"o. c #9F9FDB",
+"O. c #9F9FA2",
+"+. c #9F9F9F",
+"@. c gray62",
+"#. c #9B9B9B",
+"$. c #989898",
+"%. c #989797",
+"&. c #959595",
+"*. c #909090",
+"=. c gray56",
+"-. c gray55",
+";. c #8B8BCA",
+":. c #838399",
+">. c #7D7DC4",
+",. c gray49",
+"<. c #797979",
+"1. c #767676",
+"2. c gray45",
+"3. c #6F6F6F",
+"4. c #6F6B6B",
+"5. c DimGray",
+"6. c #686864",
+"7. c #6767C4",
+"8. c #6767B9",
+"9. c #676767",
+"0. c #636361",
+"q. c #5D5DB6",
+"w. c #5B5BBF",
+"e. c #545461",
+"r. c #54545B",
+"t. c #5252B5",
+"y. c #515151",
+"u. c #4D4D4C",
+"i. c #4C4C4C",
+"p. c #4B4B4B",
+"a. c gray29",
+"s. c #494949",
+"d. c #4545A2",
+"f. c gray27",
+"g. c #4343AA",
+"h. c gray26",
+"j. c #40409F",
+"k. c gray25",
+"l. c #3F3FA2",
+"z. c gray24",
+"x. c #3C3C3C",
+"c. c #333363",
+"v. c #2E2E90",
+"b. c #2E2E66",
+"n. c #282828",
+"m. c #23239F",
+"M. c black",
+"N. c black",
+"B. c black",
+"V. c black",
+"C. c black",
+"Z. c black",
+"A. c black",
+"S. c black",
+"D. c black",
+"F. c black",
+"G. c black",
+"H. c black",
+"J. c black",
+"K. c black",
+"L. c black",
+"P. c black",
+"I. c black",
+"U. c black",
+"Y. c black",
+"T. c black",
+"R. c black",
+"E. c black",
+"W. c black",
+"Q. c black",
+"!. c black",
+"~. c black",
+"^. c black",
+"/. c black",
+"(. c black",
+"). c black",
+"_. c black",
+"`. c black",
+"'. c black",
+"]. c black",
+"[. c black",
+"{. c black",
+"}. c black",
+"|. c black",
+" X c black",
+".X c black",
+"XX c black",
+"oX c black",
+"OX c black",
+"+X c black",
+"@X c black",
+"#X c black",
+"$X c black",
+"%X c black",
+"&X c black",
+"*X c black",
+"=X c black",
+"-X c black",
+";X c black",
+":X c black",
+">X c black",
+",X c black",
+"<X c black",
+"1X c black",
+"2X c black",
+"3X c black",
+"4X c black",
+"5X c black",
+"6X c black",
+"7X c black",
+"8X c black",
+"9X c black",
+"0X c black",
+"qX c black",
+"wX c black",
+"eX c black",
+"rX c black",
+"tX c black",
+"yX c black",
+"uX c black",
+"iX c black",
+"pX c black",
+"aX c black",
+"sX c black",
+"dX c black",
+"fX c black",
+"gX c black",
+"hX c black",
+"jX c black",
+"kX c black",
+"lX c black",
+"zX c black",
+"xX c black",
+"cX c black",
+"vX c black",
+"bX c black",
+"nX c black",
+"mX c black",
+"MX c black",
+"NX c black",
+"BX c black",
+"VX c black",
+"CX c black",
+"ZX c black",
+"AX c black",
+"SX c black",
+"DX c black",
+"FX c black",
+"GX c black",
+"HX c black",
+"JX c black",
+"KX c black",
+"LX c black",
+"PX c black",
+"IX c black",
+"UX c black",
+/* pixels */
+" ",
+" ",
+" > K K 5 B ( e 5 E B ",
+" > u.f.z 1.f.F K f.1. ",
+" e K > d K ",
+" ( u.> ( r.k 8 w h w : ",
+" z } > ( b.g.>.w 8.j.v./ ",
+" d ( E r.N w w v d.{ ",
+" ( f.e =.9.3.3.1.1.u.9. q.] ",
+" d K 5 } &.&.&.&.+.+.K M 8 ",
+" o.M ",
+" w.~ ",
+" w S t.;.N : ",
+" m 7.m.l.{ ",
+" K &.c D c.:.> } &.e ",
+" ( 9.K B 6.X.> ,.1.d ",
+" O.z } z ",
+" 8 u.( 5 z.E ",
+" E d > f.E ",
+" > =.B e f.K ",
+" > u.E +.z.f.f.z.f.z.n.F ",
+" z 5 z K E E K E K B 5 ",
+" ",
+" "
+};
--- /dev/null
+/* XPM */
+static char *create_request[] = {
+/* columns rows colors chars-per-pixel */
+"24 24 256 2 ",
+" c None",
+". c #FFFF93",
+"X c #FFFF92",
+"o c #FFFF91",
+"O c #FFFF90",
+"+ c #FFFF8F",
+"@ c #FFFF8E",
+"# c #FFFF8D",
+"$ c #FFFF8C",
+"% c #FFFF8B",
+"& c #FFFE8A",
+"* c #FFFC88",
+"= c #FFFB8B",
+"- c #FFFB8A",
+"; c #FFFB88",
+": c #FFF988",
+"> c #FFF987",
+", c #FFF88B",
+"< c #FFF887",
+"1 c #FFF886",
+"2 c #FFF788",
+"3 c #FFF787",
+"4 c #FFF587",
+"5 c #FFF487",
+"6 c #FFF383",
+"7 c #FFF381",
+"8 c #FFF287",
+"9 c #FFF284",
+"0 c #FFF283",
+"q c #FFF182",
+"w c #FFF083",
+"e c #FFF082",
+"r c #FFEF85",
+"t c #FEF381",
+"y c #FEEF83",
+"u c #F7E77B",
+"i c #F6E67B",
+"p c #F2E781",
+"a c #F2E77E",
+"s c #F2E67D",
+"d c #F2E57D",
+"f c #F1E982",
+"g c #F1E882",
+"h c #F1E77E",
+"j c #F1E683",
+"k c #F1E682",
+"l c #F1E681",
+"z c #F1E680",
+"x c #F1E582",
+"c c #F1E581",
+"v c #EFDD79",
+"b c #EEDD79",
+"n c gray92",
+"m c #E8E8E7",
+"M c #E3D273",
+"N c #E2D373",
+"B c #BFC0C1",
+"V c #BFBFC0",
+"C c #BEBFC0",
+"Z c #BEBEC0",
+"A c #BDBEBF",
+"S c #BDBDBE",
+"D c #BCBDBE",
+"F c #BBBDBF",
+"G c #BBBCBF",
+"H c #B7B6B7",
+"J c #B6B6B7",
+"K c #B5B6B7",
+"L c #B3B3B5",
+"P c #B2AE6A",
+"I c #B2AE67",
+"U c #B2AD67",
+"Y c #B2AC69",
+"T c #B2AC68",
+"R c #B2AB67",
+"E c #B2AA66",
+"W c #B2AA63",
+"Q c #B1AA65",
+"! c #B0B1B7",
+"~ c #B0A865",
+"^ c #AFA664",
+"/ c #AEB0B5",
+"( c #AEADB2",
+") c #AEAAB0",
+"_ c #AEAA63",
+"` c #AEA862",
+"' c #AEA762",
+"] c #ADAFB4",
+"[ c #ADADB3",
+"{ c #ADACB1",
+"} c #ADABB1",
+"| c #ADAAB0",
+" . c #ACADB3",
+".. c #ACACB2",
+"X. c #ACAAAF",
+"o. c #ACA8AE",
+"O. c #ABADB3",
+"+. c #ABABB1",
+"@. c #ABABB0",
+"#. c #ABAAAF",
+"$. c #ABA9AE",
+"%. c #AAACB1",
+"&. c #AAABB1",
+"*. c #AAAAAF",
+"=. c #AAA9AE",
+"-. c #AAA8AD",
+";. c #A9ABB0",
+":. c #A9AAB0",
+">. c #A9A8AD",
+",. c #A8AAAF",
+"<. c #A8A9AE",
+"1. c #A8A8AE",
+"2. c #A7A9AE",
+"3. c #A6A8AD",
+"4. c #A39B5A",
+"5. c #A2995A",
+"6. c #A1915C",
+"7. c #A0915C",
+"8. c #9E915C",
+"9. c #9E915B",
+"0. c #9D915C",
+"q. c #9C915C",
+"w. c #9C9059",
+"e. c #9C8F59",
+"r. c #9B915B",
+"t. c #9A9156",
+"y. c #9A8F59",
+"u. c #908652",
+"i. c #8E8350",
+"p. c #82754D",
+"a. c #81754D",
+"s. c #80754E",
+"d. c #80754D",
+"f. c #7F754D",
+"g. c #7E6E4A",
+"h. c #7D6F4A",
+"j. c #7C744D",
+"k. c #7C6E4A",
+"l. c #7C6B49",
+"z. c #7A6E4A",
+"x. c #736B4C",
+"c. c #736B4B",
+"v. c #736B4A",
+"b. c #736B49",
+"n. c #736A4C",
+"m. c #726A49",
+"M. c #726845",
+"N. c #716544",
+"B. c #716540",
+"V. c #706847",
+"C. c #706440",
+"Z. c #6F6947",
+"A. c #6E6343",
+"S. c #6D6540",
+"D. c #6D643F",
+"F. c #6D633E",
+"G. c #6D623D",
+"H. c #6D603C",
+"J. c #6C5F40",
+"K. c #6B643F",
+"L. c #6B633F",
+"P. c #6B623F",
+"I. c #6B613F",
+"U. c #6B613C",
+"Y. c #6B603B",
+"T. c #6A623D",
+"R. c #6A613C",
+"E. c #69613D",
+"W. c #695F3D",
+"Q. c #695F3C",
+"!. c #695D3D",
+"~. c #68603D",
+"^. c #685D3C",
+"/. c #685B3C",
+"(. c #675A3B",
+"). c #665C3B",
+"_. c #665B3C",
+"`. c #66593A",
+"'. c #645B3C",
+"]. c #635A3A",
+"[. c #605946",
+"{. c #5F5945",
+"}. c #5E5943",
+"|. c #5E5435",
+" X c #5D5435",
+".X c #5B5543",
+"XX c #5A5334",
+"oX c #595241",
+"OX c #595234",
+"+X c #575543",
+"@X c #56543F",
+"#X c #55533E",
+"$X c #4F4C3F",
+"%X c #4D4B3D",
+"&X c #4C483C",
+"*X c #454038",
+"=X c #433B36",
+"-X c #424236",
+";X c #423E3B",
+":X c #3E3E37",
+">X c #36362E",
+",X c #36332E",
+"<X c #34332E",
+"1X c #33302E",
+"2X c black",
+"3X c black",
+"4X c black",
+"5X c black",
+"6X c black",
+"7X c black",
+"8X c black",
+"9X c black",
+"0X c black",
+"qX c black",
+"wX c black",
+"eX c black",
+"rX c black",
+"tX c black",
+"yX c black",
+"uX c black",
+"iX c black",
+"pX c black",
+"aX c black",
+"sX c black",
+"dX c black",
+"fX c black",
+"gX c black",
+"hX c black",
+"jX c black",
+"kX c black",
+"lX c black",
+"zX c black",
+"xX c black",
+"cX c black",
+"vX c black",
+"bX c black",
+"nX c black",
+"mX c black",
+"MX c black",
+"NX c black",
+"BX c black",
+"VX c black",
+"CX c black",
+"ZX c black",
+"AX c black",
+"SX c black",
+"DX c black",
+"FX c black",
+"GX c black",
+"HX c black",
+"JX c black",
+"KX c black",
+"LX c black",
+"PX c black",
+"IX c black",
+"UX c black",
+/* pixels */
+" ",
+" ",
+" ",
+" ",
+" ",
+" ",
+" n H 2.2.X.X.( ( ( ( ( X.( X.X.( ( 2.X.2.H n ",
+" A >X|.W.(.W.D.W.D.A.D.D.A.D.D.D.W.W.D.|.>XA ",
+" A @XM u u p u p p p p p f p p v f u u M .XA ",
+" V ;XW.A.x.A.x.x.x.x.x.x.x.x.x.x.x.Z.A.(.:XV ",
+" A $X4._ ^ I I I I P I I I I I I ^ _ ^ 4.$XA ",
+" A [.3 + + + + + . . . . . . + + + + + 3 {.A ",
+" A .Xu 3 > 3 > 2 + > > + > + > > > > 3 u +XA ",
+" V -XD.g.M.p.p.f.p.p.p.p.p.p.p.p.f.g.g.D.=XV ",
+" V ;Xi.t.e.t.8.8.8.8.6.6.6.8.8.8.8.e.e.u.$XV ",
+" A .Xv 3 3 r r 3 3 3 3 3 3 3 3 r 3 r r v @XA ",
+" A >X|.(.(.(.W.D.W.D.D.D.W.D.(.W.W.|.(.|.>XA ",
+" m H 2.X.( X./ ( ( ( ( ( ( ( ( ( X.( X.2.H n ",
+" ",
+" ",
+" ",
+" ",
+" ",
+" "
+};
--- /dev/null
+/* XPM */
+static char *cut[] = {
+/* columns rows colors chars-per-pixel */
+"24 24 256 2 ",
+" c None",
+". c #FFFFFE",
+"X c #FFFFFD",
+"o c #FFFFFB",
+"O c #FEFEFF",
+"+ c #FCFCFD",
+"@ c #FCFAFF",
+"# c #FBFBFB",
+"$ c #FAFBFF",
+"% c #FAFAF9",
+"& c #F9F9F9",
+"* c #F8F8FE",
+"= c #F6F9FE",
+"- c #F6F6F6",
+"; c gray95",
+": c #F1F4FF",
+"> c #F0F3FD",
+", c #F0F2FE",
+"< c #EEF3FC",
+"1 c #EDF2FC",
+"2 c #ECF0FE",
+"3 c #ECEFFC",
+"4 c #ECECEC",
+"5 c #EBF0FC",
+"6 c #EAEEFD",
+"7 c #E9EFFF",
+"8 c #E8EEFF",
+"9 c gray91",
+"0 c #E6E6E6",
+"q c #E5EBFB",
+"w c #E3E3E4",
+"e c #E2E2E2",
+"r c #E1E9FB",
+"t c #E1E1E0",
+"y c #DDE3FB",
+"u c #DAE0FA",
+"i c #DAE0F9",
+"p c #D5DEFA",
+"a c #D3D3D5",
+"s c #D2D2D2",
+"d c #D1DBFB",
+"f c #D0DAFB",
+"g c #CFD7F9",
+"h c #CAD6F7",
+"j c #C7CDD9",
+"k c #C3C3C3",
+"l c #C1C1C2",
+"z c #BEC9F7",
+"x c #BAB8B6",
+"c c #B9B7B6",
+"v c #B7C4F4",
+"b c #AEBDF3",
+"n c #A9BFF6",
+"m c #A9BAF5",
+"M c #A8B8F3",
+"N c #A4A9B5",
+"B c #A4A4A3",
+"V c #A3B5F1",
+"C c gray63",
+"Z c #9FB5F0",
+"A c #9FB4F3",
+"S c #9FB2F0",
+"D c #9D9D9F",
+"F c #9B9B9B",
+"G c #99AEF2",
+"H c gray58",
+"J c #93A8EF",
+"K c #8EA9F0",
+"L c #8E8C8C",
+"P c #8D8D8D",
+"I c #8C8C91",
+"U c #8BA2F0",
+"Y c #85A0F0",
+"T c #839DED",
+"R c #829DEF",
+"E c #829BED",
+"W c #7E99F0",
+"Q c #7D96EF",
+"! c #7C7C7C",
+"~ c #7894EE",
+"^ c #777777",
+"/ c #7295F8",
+"( c #717171",
+") c gray43",
+"_ c #6D8EEA",
+"` c #6D8DEB",
+"' c #6C8CEB",
+"] c #6A8AEF",
+"[ c #688AE8",
+"{ c #677CB4",
+"} c #676767",
+"| c #6685EE",
+" . c #6486EB",
+".. c #626262",
+"X. c #6085E9",
+"o. c gray37",
+"O. c #5C7CEB",
+"+. c #5B7BE9",
+"@. c gray35",
+"#. c #557CF4",
+"$. c #5479F6",
+"%. c #4F73E4",
+"&. c #4E71E9",
+"*. c #4D70E9",
+"=. c #4C4C4C",
+"-. c #494A4A",
+";. c #476EE4",
+":. c #476CE5",
+">. c #454548",
+",. c #45423F",
+"<. c #436FE9",
+"1. c #434343",
+"2. c #4168E2",
+"3. c #4069E4",
+"4. c #3B64E3",
+"5. c #3861E5",
+"6. c #37343B",
+"7. c #3356C7",
+"8. c #303033",
+"9. c #2E4DAF",
+"0. c #2D2D2D",
+"q. c #2C2927",
+"w. c #2B57D5",
+"e. c #28251A",
+"r. c #232323",
+"t. c #214EE0",
+"y. c #21201F",
+"u. c #151514",
+"i. c #111112",
+"p. c #101010",
+"a. c gray6",
+"s. c #0E0E0E",
+"d. c #060606",
+"f. c #050506",
+"g. c black",
+"h. c black",
+"j. c black",
+"k. c black",
+"l. c black",
+"z. c black",
+"x. c black",
+"c. c black",
+"v. c black",
+"b. c black",
+"n. c black",
+"m. c black",
+"M. c black",
+"N. c black",
+"B. c black",
+"V. c black",
+"C. c black",
+"Z. c black",
+"A. c black",
+"S. c black",
+"D. c black",
+"F. c black",
+"G. c black",
+"H. c black",
+"J. c black",
+"K. c black",
+"L. c black",
+"P. c black",
+"I. c black",
+"U. c black",
+"Y. c black",
+"T. c black",
+"R. c black",
+"E. c black",
+"W. c black",
+"Q. c black",
+"!. c black",
+"~. c black",
+"^. c black",
+"/. c black",
+"(. c black",
+"). c black",
+"_. c black",
+"`. c black",
+"'. c black",
+"]. c black",
+"[. c black",
+"{. c black",
+"}. c black",
+"|. c black",
+" X c black",
+".X c black",
+"XX c black",
+"oX c black",
+"OX c black",
+"+X c black",
+"@X c black",
+"#X c black",
+"$X c black",
+"%X c black",
+"&X c black",
+"*X c black",
+"=X c black",
+"-X c black",
+";X c black",
+":X c black",
+">X c black",
+",X c black",
+"<X c black",
+"1X c black",
+"2X c black",
+"3X c black",
+"4X c black",
+"5X c black",
+"6X c black",
+"7X c black",
+"8X c black",
+"9X c black",
+"0X c black",
+"qX c black",
+"wX c black",
+"eX c black",
+"rX c black",
+"tX c black",
+"yX c black",
+"uX c black",
+"iX c black",
+"pX c black",
+"aX c black",
+"sX c black",
+"dX c black",
+"fX c black",
+"gX c black",
+"hX c black",
+"jX c black",
+"kX c black",
+"lX c black",
+"zX c black",
+"xX c black",
+"cX c black",
+"vX c black",
+"bX c black",
+"nX c black",
+"mX c black",
+"MX c black",
+"NX c black",
+"BX c black",
+"VX c black",
+"CX c black",
+"ZX c black",
+"AX c black",
+"SX c black",
+"DX c black",
+"FX c black",
+"GX c black",
+"HX c black",
+"JX c black",
+"KX c black",
+"LX c black",
+"PX c black",
+"IX c black",
+"UX c black",
+/* pixels */
+" ",
+" ",
+" ",
+" 4 4 0 - ",
+" ! o.- 0 1.D ",
+" } 1. 0 r.L ",
+" } =. 0 0.H ",
+" ) a.D ^ d.D ",
+" k ,.q.) a.o.k ",
+" B d.d.a.a ",
+" k 0.d.1.0 ",
+" I u.x ",
+" c y.u.6.j 3 ",
+" L e.N 9.w.<.z ",
+" = G O._ 7.{ 3 #.T V W b ",
+" < ;.;.U #./ p &.y _ O. ",
+" < %.Z b | g &.y _ | ",
+" < ;.G b O.p 4.W b Q Z ",
+" < _ K h J W q | 4.4.v ",
+" : Y t.T < < q y ",
+" 3 g 3 ",
+" ",
+" ",
+" "
+};
--- /dev/null
+/* XPM */
+static char *decision[] = {
+/* columns rows colors chars-per-pixel */
+"24 24 256 2 ",
+" c None",
+". c #FFFC7E",
+"X c #FFF980",
+"o c #FFF57E",
+"O c #FFF17F",
+"+ c #FFF17B",
+"@ c #FFF17A",
+"# c #FFF07B",
+"$ c #FFEF7B",
+"% c #FFEC7D",
+"& c #FFEC77",
+"* c #FFEB7D",
+"= c #FFEA7C",
+"- c #FFEA7B",
+"; c #FFEA79",
+": c #FEFEFE",
+"> c #FDFDFD",
+", c #FBFCFF",
+"< c gray98",
+"1 c #F9F9F9",
+"2 c #F8F8FB",
+"3 c gray97",
+"4 c #F7F7F6",
+"5 c #F7E571",
+"6 c #F6F7FC",
+"7 c #F6F7F7",
+"8 c #F4F4F4",
+"9 c #F1F1F1",
+"0 c #EFEFEF",
+"q c gray92",
+"w c #EAEAF1",
+"e c #EAEAEA",
+"r c #EAEAE9",
+"t c #E9D165",
+"y c #E8EAEF",
+"u c #E8D066",
+"i c #E6E6E3",
+"p c #E5E5E2",
+"a c #E4E4E4",
+"s c #E4CD68",
+"d c #E3D86E",
+"f c #E1E1FD",
+"g c #DFDFE1",
+"h c #DEDEDC",
+"j c #DEDEDB",
+"k c #DCDCDE",
+"l c gainsboro",
+"z c gray85",
+"x c #D7D8DA",
+"c c #D6C462",
+"v c #D5D6DC",
+"b c #D5D6DA",
+"n c #D5D5FB",
+"m c #D4D4FB",
+"M c #D3D3F6",
+"N c LightGray",
+"B c #CCCCD5",
+"V c #CACAE3",
+"C c gray79",
+"Z c #C8C8F5",
+"A c gray78",
+"S c #C7BD63",
+"D c #C6C6C4",
+"F c #C5C5C6",
+"G c #C4AE51",
+"H c #C1C3C5",
+"J c #C1C1C1",
+"K c #C0AA5B",
+"L c #BFC0DA",
+"P c #BDBDC1",
+"I c #BDBDBC",
+"U c gray73",
+"Y c #B9BAB9",
+"T c #B8B8C9",
+"R c gray70",
+"E c #B3A65B",
+"W c #B2B2B2",
+"Q c #B2A24D",
+"! c #AFB1B8",
+"~ c #AFAFC9",
+"^ c #AEAEAE",
+"/ c #AEAEAD",
+"( c gray67",
+") c #A9A9A7",
+"_ c #A9A49A",
+"` c #A8A8FA",
+"' c #A89758",
+"] c #A7A099",
+"[ c #A69A59",
+"{ c #A5A5A4",
+"} c #A59A57",
+"| c #A4A4F3",
+" . c #A4A4A4",
+".. c #A39257",
+"X. c #A2A2F1",
+"o. c #A1A1F2",
+"O. c #A1A1F1",
+"+. c #A09F9F",
+"@. c gray62",
+"#. c #9E998C",
+"$. c #9B8E63",
+"%. c #9A9A9A",
+"&. c #999386",
+"*. c #979067",
+"=. c #959595",
+"-. c #94895A",
+";. c #9191F4",
+":. c gray57",
+">. c #8E8EED",
+",. c #8E8671",
+"<. c #8C8B86",
+"1. c #8C896D",
+"2. c #8C8777",
+"3. c #89825E",
+"4. c gray53",
+"5. c #8686EC",
+"6. c #8686BA",
+"7. c #868686",
+"8. c #86806D",
+"9. c #8484EC",
+"0. c #848484",
+"q. c #8383EC",
+"w. c #838383",
+"e. c #838382",
+"r. c #8282EC",
+"t. c #827F62",
+"y. c #8181ED",
+"u. c #818181",
+"i. c #7E7EEC",
+"p. c #7E7E7E",
+"a. c #7D7D7C",
+"s. c #797979",
+"d. c #7575E9",
+"f. c #736F53",
+"g. c gray44",
+"h. c #6F6F6D",
+"j. c #6E6A62",
+"k. c #606060",
+"l. c gray37",
+"z. c #5E5E59",
+"x. c gray36",
+"c. c #555555",
+"v. c gray33",
+"b. c #5252E6",
+"n. c #505050",
+"m. c #4E4E4D",
+"M. c #4C4C4C",
+"N. c #4A4AE5",
+"B. c #4A4AA2",
+"V. c #4949E3",
+"C. c #4949DB",
+"Z. c #464646",
+"A. c #444442",
+"S. c #434343",
+"D. c gray26",
+"F. c #414141",
+"G. c #3F3F40",
+"H. c #3B3A98",
+"J. c #3A3A3A",
+"K. c #38383A",
+"L. c #383839",
+"P. c #373738",
+"I. c #36369D",
+"U. c #353535",
+"Y. c #34343A",
+"T. c #323239",
+"R. c #323232",
+"E. c #313131",
+"W. c #2F2F30",
+"Q. c #2E2E2D",
+"!. c #2C2C2C",
+"~. c gray16",
+"^. c #282828",
+"/. c #272724",
+"(. c #1F1F20",
+"). c black",
+"_. c black",
+"`. c black",
+"'. c black",
+"]. c black",
+"[. c black",
+"{. c black",
+"}. c black",
+"|. c black",
+" X c black",
+".X c black",
+"XX c black",
+"oX c black",
+"OX c black",
+"+X c black",
+"@X c black",
+"#X c black",
+"$X c black",
+"%X c black",
+"&X c black",
+"*X c black",
+"=X c black",
+"-X c black",
+";X c black",
+":X c black",
+">X c black",
+",X c black",
+"<X c black",
+"1X c black",
+"2X c black",
+"3X c black",
+"4X c black",
+"5X c black",
+"6X c black",
+"7X c black",
+"8X c black",
+"9X c black",
+"0X c black",
+"qX c black",
+"wX c black",
+"eX c black",
+"rX c black",
+"tX c black",
+"yX c black",
+"uX c black",
+"iX c black",
+"pX c black",
+"aX c black",
+"sX c black",
+"dX c black",
+"fX c black",
+"gX c black",
+"hX c black",
+"jX c black",
+"kX c black",
+"lX c black",
+"zX c black",
+"xX c black",
+"cX c black",
+"vX c black",
+"bX c black",
+"nX c black",
+"mX c black",
+"MX c black",
+"NX c black",
+"BX c black",
+"VX c black",
+"CX c black",
+"ZX c black",
+"AX c black",
+"SX c black",
+"DX c black",
+"FX c black",
+"GX c black",
+"HX c black",
+"JX c black",
+"KX c black",
+"LX c black",
+"PX c black",
+"IX c black",
+"UX c black",
+/* pixels */
+" ",
+" ",
+" w ] 8.I 6 ",
+" A 1.K t [ &.v ",
+" g #...s $ $ $ c $._ 0 ",
+" I f.G & $ $ $ $ X o Q j.x ",
+" g ,.' s $ $ $ o o S 3.+.3 ",
+" P ,.E 5 X s -.<.v ",
+" w ^ 1.} t.! ",
+" L H.V ",
+" n N.f ",
+" M C.d.5.5.5.5.5.5.5.i.5.Z ",
+" n N.;.| ;.| | | ;.| >.b.| ",
+" ~ I.T B B.6.3 ",
+" 3 p.P.P.U.4.3 @.G.P.J.l.h ",
+" =.Q.^ i { U.@. A U.4.i A Z.l. ",
+" 0 m.p. 4.c.0 g.c.3 ^ /.N ",
+" 0 Z.4. =.c.3 g.l. R Q.A ",
+" 3 h.Q.A 0 A U.4. R U.{ 0 h c.J.3 ",
+" h m.(.Z./.l.i 4./.Z.Q.Q.A ",
+" 0 { 4.R w R 4.=.h ",
+" ",
+" ",
+" "
+};
--- /dev/null
+/* XPM */
+static char *delete[] = {
+/* columns rows colors chars-per-pixel */
+"24 24 256 2 ",
+" c None",
+". c #FEFFFF",
+"X c #FEFEFE",
+"o c #FDFDFD",
+"O c #FDFBFB",
+"+ c gray99",
+"@ c #FCFAFA",
+"# c #FBFBFB",
+"$ c gray98",
+"% c #F9F9F9",
+"& c #F8F8F8",
+"* c gray97",
+"= c #F6F6F6",
+"- c gray96",
+"; c #F4F4F4",
+": c #F3F3F3",
+"> c gray95",
+", c #F1F1F1",
+"< c gray94",
+"1 c #EFEFEF",
+"2 c #EEEEEE",
+"3 c gray93",
+"4 c #ECECEC",
+"5 c gray92",
+"6 c #EAEAEA",
+"7 c #E9E9E9",
+"8 c gray91",
+"9 c #E7E7E7",
+"0 c #E4E4E4",
+"q c #E1E1E1",
+"w c gray87",
+"e c gainsboro",
+"r c gray86",
+"t c #DADADA",
+"y c #D7D7D7",
+"u c LightGray",
+"i c #D0D0D0",
+"p c #CECECE",
+"a c #CBCBCB",
+"s c #CAC9C9",
+"d c gray79",
+"f c #C8C7C7",
+"g c #C7C5C5",
+"h c gray74",
+"j c #B8B7B7",
+"k c #B7B7B7",
+"l c gray71",
+"z c #B4B4B4",
+"x c #ACAAAA",
+"c c #A6A3A3",
+"v c #A4A5A5",
+"b c #A39F9F",
+"n c #A2A2A2",
+"m c #9D9D9D",
+"M c #9B9B9B",
+"N c gray60",
+"B c #979797",
+"V c gray58",
+"C c #908F8F",
+"Z c #8B8B8B",
+"A c gray54",
+"S c #898989",
+"D c #888888",
+"F c gray53",
+"G c gray52",
+"H c gray51",
+"J c #818282",
+"K c #7E7E7E",
+"L c gray48",
+"P c gray47",
+"I c #777777",
+"U c #6F6F6F",
+"Y c #6C6C6C",
+"T c gray39",
+"R c #5C5D5D",
+"E c #5A5858",
+"W c gray35",
+"Q c #585858",
+"! c #575454",
+"~ c #555454",
+"^ c gray32",
+"/ c #525151",
+"( c #464646",
+") c #454444",
+"_ c #444444",
+"` c #424141",
+"' c #414141",
+"] c #413D3D",
+"[ c #3F3E3E",
+"{ c #3E3E3E",
+"} c #3C3C3C",
+"| c #393939",
+" . c #2F2F2F",
+".. c #2E2B2B",
+"X. c #2D2D2D",
+"o. c #2C2C2C",
+"O. c #2A2A2A",
+"+. c gray16",
+"@. c #282828",
+"#. c #272525",
+"$. c gray14",
+"%. c #232323",
+"&. c #222222",
+"*. c gray13",
+"=. c #201D1D",
+"-. c gray12",
+";. c #1E1E1E",
+":. c #1D1E1E",
+">. c #1D1D1D",
+",. c gray11",
+"<. c #1B1C1C",
+"1. c #1B1B1B",
+"2. c gray10",
+"3. c #1A1919",
+"4. c #191919",
+"5. c gray9",
+"6. c gray8",
+"7. c #141212",
+"8. c #131313",
+"9. c #111111",
+"0. c #111010",
+"q. c gray6",
+"w. c #0E0E0E",
+"e. c gray5",
+"r. c #0D0A0A",
+"t. c #0C0C0C",
+"y. c #0C0B0B",
+"u. c #0A0707",
+"i. c #090A0A",
+"p. c #030101",
+"a. c #020202",
+"s. c #010101",
+"d. c black",
+"f. c black",
+"g. c black",
+"h. c black",
+"j. c black",
+"k. c black",
+"l. c black",
+"z. c black",
+"x. c black",
+"c. c black",
+"v. c black",
+"b. c black",
+"n. c black",
+"m. c black",
+"M. c black",
+"N. c black",
+"B. c black",
+"V. c black",
+"C. c black",
+"Z. c black",
+"A. c black",
+"S. c black",
+"D. c black",
+"F. c black",
+"G. c black",
+"H. c black",
+"J. c black",
+"K. c black",
+"L. c black",
+"P. c black",
+"I. c black",
+"U. c black",
+"Y. c black",
+"T. c black",
+"R. c black",
+"E. c black",
+"W. c black",
+"Q. c black",
+"!. c black",
+"~. c black",
+"^. c black",
+"/. c black",
+"(. c black",
+"). c black",
+"_. c black",
+"`. c black",
+"'. c black",
+"]. c black",
+"[. c black",
+"{. c black",
+"}. c black",
+"|. c black",
+" X c black",
+".X c black",
+"XX c black",
+"oX c black",
+"OX c black",
+"+X c black",
+"@X c black",
+"#X c black",
+"$X c black",
+"%X c black",
+"&X c black",
+"*X c black",
+"=X c black",
+"-X c black",
+";X c black",
+":X c black",
+">X c black",
+",X c black",
+"<X c black",
+"1X c black",
+"2X c black",
+"3X c black",
+"4X c black",
+"5X c black",
+"6X c black",
+"7X c black",
+"8X c black",
+"9X c black",
+"0X c black",
+"qX c black",
+"wX c black",
+"eX c black",
+"rX c black",
+"tX c black",
+"yX c black",
+"uX c black",
+"iX c black",
+"pX c black",
+"aX c black",
+"sX c black",
+"dX c black",
+"fX c black",
+"gX c black",
+"hX c black",
+"jX c black",
+"kX c black",
+"lX c black",
+"zX c black",
+"xX c black",
+"cX c black",
+"vX c black",
+"bX c black",
+"nX c black",
+"mX c black",
+"MX c black",
+"NX c black",
+"BX c black",
+"VX c black",
+"CX c black",
+"ZX c black",
+"AX c black",
+"SX c black",
+"DX c black",
+"FX c black",
+"GX c black",
+"HX c black",
+"JX c black",
+"KX c black",
+"LX c black",
+"PX c black",
+"IX c black",
+"UX c black",
+/* pixels */
+" ",
+" ",
+" ",
+" 1 m F 1 * w ",
+" 1 ! u.p.! 9 p R ! 9 ",
+" 1 .5.-.p.! * F 5.( g ",
+" * k ( p.p.p.R 1 F p.-.g ",
+" k [ q.p.u.F 1 * B q.#.y ",
+" 1 K q.p.5.F y B q.-.p ",
+" b 5.p. .[ -.-.h ",
+" g #.p.q.-.k ",
+" * Z [ 5.p.q.Z * ",
+" 1 I -.5.#.! q.q.I * ",
+" 9 F -.-.-.K k q.p.F 9 ",
+" 9 K 5. .-.U * g #.p.B ",
+" 1 K #.-.#.R * y [ ( w ",
+" 1 U #. .5.-.w 9 [ ( ",
+" 9 .5.5.-.c p ! c ",
+" * m .-.c k .w ",
+" Z c h ! w ",
+" * * ",
+" ",
+" ",
+" "
+};
--- /dev/null
+/* XPM */
+static char *down[] = {
+/* columns rows colors chars-per-pixel */
+"24 24 256 2 ",
+" c None",
+". c #FEFFFF",
+"X c #FDFDFD",
+"o c #F9F7F5",
+"O c #F8F8F8",
+"+ c #F8F7F6",
+"@ c #F6F6F6",
+"# c #F6F5F5",
+"$ c #F6F4F1",
+"% c gray96",
+"& c #F4F4F4",
+"* c #F3F3F2",
+"= c #F0EFEE",
+"- c #EFECE8",
+"; c gray93",
+": c #EDECEA",
+"> c #ECEBEB",
+", c #ECEBE9",
+"< c #EBE9E5",
+"1 c #EAE9E7",
+"2 c #E9E7E3",
+"3 c #E6E4E0",
+"4 c #E0E0DF",
+"5 c #DED9D4",
+"6 c gainsboro",
+"7 c #CECCC9",
+"8 c #CBC9C6",
+"9 c #CAC6C4",
+"0 c #C6C3BF",
+"q c #908C87",
+"w c #6B7381",
+"e c #687180",
+"r c gray40",
+"t c #656974",
+"y c #60636B",
+"u c #57575A",
+"i c #54524F",
+"p c #509BFF",
+"a c #4F4E4D",
+"s c #4E96FF",
+"d c #4D95FF",
+"f c #4D4C4B",
+"g c #4C96FF",
+"h c #4C95FF",
+"j c #4C94FC",
+"k c #4C90F2",
+"l c #4C8BEC",
+"z c #4B90F6",
+"x c #4A8FF7",
+"c c #4A8FF4",
+"v c #4A8EF4",
+"b c #4A8BED",
+"n c #4A4949",
+"m c #4988E8",
+"M c #4891FA",
+"N c #488EF5",
+"B c #484649",
+"V c #464646",
+"C c #4277CB",
+"Z c #424343",
+"A c #424247",
+"S c gray26",
+"D c #3D7AD3",
+"F c #3D3E3D",
+"G c #3C7AD5",
+"H c #3C74C8",
+"J c #3C3C3C",
+"K c #3B76CC",
+"L c #3B75CA",
+"P c #3B6EBF",
+"I c #3A6EBF",
+"U c #3A6DBF",
+"Y c #3A3A3A",
+"T c #3976CE",
+"R c #396DBD",
+"E c #3776D0",
+"W c #356BB8",
+"Q c #336BB6",
+"! c #313230",
+"~ c #2A2D30",
+"^ c #292421",
+"/ c #275396",
+"( c #27529A",
+") c #265295",
+"_ c #23457A",
+"` c #21242F",
+"' c #20232D",
+"] c #1F222D",
+"[ c #1E4781",
+"{ c #1C4782",
+"} c #1C1E2B",
+"| c #1B3F72",
+" . c #193869",
+".. c #193865",
+"X. c #151E2A",
+"o. c #133062",
+"O. c #131E2B",
+"+. c #131E2A",
+"@. c #131D2A",
+"#. c #121623",
+"$. c #10376A",
+"%. c #101E32",
+"&. c #0C1117",
+"*. c #040C18",
+"=. c black",
+"-. c black",
+";. c black",
+":. c black",
+">. c black",
+",. c black",
+"<. c black",
+"1. c black",
+"2. c black",
+"3. c black",
+"4. c black",
+"5. c black",
+"6. c black",
+"7. c black",
+"8. c black",
+"9. c black",
+"0. c black",
+"q. c black",
+"w. c black",
+"e. c black",
+"r. c black",
+"t. c black",
+"y. c black",
+"u. c black",
+"i. c black",
+"p. c black",
+"a. c black",
+"s. c black",
+"d. c black",
+"f. c black",
+"g. c black",
+"h. c black",
+"j. c black",
+"k. c black",
+"l. c black",
+"z. c black",
+"x. c black",
+"c. c black",
+"v. c black",
+"b. c black",
+"n. c black",
+"m. c black",
+"M. c black",
+"N. c black",
+"B. c black",
+"V. c black",
+"C. c black",
+"Z. c black",
+"A. c black",
+"S. c black",
+"D. c black",
+"F. c black",
+"G. c black",
+"H. c black",
+"J. c black",
+"K. c black",
+"L. c black",
+"P. c black",
+"I. c black",
+"U. c black",
+"Y. c black",
+"T. c black",
+"R. c black",
+"E. c black",
+"W. c black",
+"Q. c black",
+"!. c black",
+"~. c black",
+"^. c black",
+"/. c black",
+"(. c black",
+"). c black",
+"_. c black",
+"`. c black",
+"'. c black",
+"]. c black",
+"[. c black",
+"{. c black",
+"}. c black",
+"|. c black",
+" X c black",
+".X c black",
+"XX c black",
+"oX c black",
+"OX c black",
+"+X c black",
+"@X c black",
+"#X c black",
+"$X c black",
+"%X c black",
+"&X c black",
+"*X c black",
+"=X c black",
+"-X c black",
+";X c black",
+":X c black",
+">X c black",
+",X c black",
+"<X c black",
+"1X c black",
+"2X c black",
+"3X c black",
+"4X c black",
+"5X c black",
+"6X c black",
+"7X c black",
+"8X c black",
+"9X c black",
+"0X c black",
+"qX c black",
+"wX c black",
+"eX c black",
+"rX c black",
+"tX c black",
+"yX c black",
+"uX c black",
+"iX c black",
+"pX c black",
+"aX c black",
+"sX c black",
+"dX c black",
+"fX c black",
+"gX c black",
+"hX c black",
+"jX c black",
+"kX c black",
+"lX c black",
+"zX c black",
+"xX c black",
+"cX c black",
+"vX c black",
+"bX c black",
+"nX c black",
+"mX c black",
+"MX c black",
+"NX c black",
+"BX c black",
+"VX c black",
+"CX c black",
+"ZX c black",
+"AX c black",
+"SX c black",
+"DX c black",
+"FX c black",
+"GX c black",
+"HX c black",
+"JX c black",
+"KX c black",
+"LX c black",
+"PX c black",
+"IX c black",
+"UX c black",
+/* pixels */
+" ",
+" ",
+" ",
+" ",
+" ",
+" 4 u V a V r @ ",
+" 9 *.$._ o.&.- ",
+" 8 X.D s H ` 3 ",
+" 8 X.H s P ] 2 ",
+" 8 X.E s P ` - ",
+" 7 X.H s P ] < ",
+" @ @ 9 X.H s P } 5 @ ",
+" 6 F F ~ X.D s H #.^ ~ F @ ",
+" - a =._ W l x l Q [ =.i @ ",
+" - a .s x l x s ( t @ ",
+" - V o.l s x / w ",
+" - V | x / w o ",
+" - B %.y @ ",
+" < q @ ",
+" ",
+" ",
+" ",
+" ",
+" "
+};
--- /dev/null
+/* XPM */
+static char *draw_flow_line[] = {
+/* columns rows colors chars-per-pixel */
+"24 24 256 2 ",
+" c None",
+". c #FBFBFB",
+"X c #F7F7F8",
+"o c gray97",
+"O c #F1F1F2",
+"+ c #EFEFF0",
+"@ c #EFEFEF",
+"# c #EEEEEF",
+"$ c #E0E0E1",
+"% c #C5C5C7",
+"& c #C1C1C3",
+"* c #C0C0C2",
+"= c #BFBFC1",
+"- c #B4B4B7",
+"; c #B4B4B5",
+": c #969699",
+"> c #8C8C90",
+", c #8B8B8E",
+"< c #828286",
+"1 c #7E7E82",
+"2 c #78787C",
+"3 c #76767B",
+"4 c #747478",
+"5 c #646469",
+"6 c #45454C",
+"7 c #23232A",
+"8 c #10100F",
+"9 c #0D0D15",
+"0 c #090911",
+"q c #07070F",
+"w c #06060E",
+"e c #04040E",
+"r c #04040D",
+"t c #03030C",
+"y c #03030B",
+"u c #020208",
+"i c #000005",
+"p c #000001",
+"a c black",
+"s c black",
+"d c black",
+"f c black",
+"g c black",
+"h c black",
+"j c black",
+"k c black",
+"l c black",
+"z c black",
+"x c black",
+"c c black",
+"v c black",
+"b c black",
+"n c black",
+"m c black",
+"M c black",
+"N c black",
+"B c black",
+"V c black",
+"C c black",
+"Z c black",
+"A c black",
+"S c black",
+"D c black",
+"F c black",
+"G c black",
+"H c black",
+"J c black",
+"K c black",
+"L c black",
+"P c black",
+"I c black",
+"U c black",
+"Y c black",
+"T c black",
+"R c black",
+"E c black",
+"W c black",
+"Q c black",
+"! c black",
+"~ c black",
+"^ c black",
+"/ c black",
+"( c black",
+") c black",
+"_ c black",
+"` c black",
+"' c black",
+"] c black",
+"[ c black",
+"{ c black",
+"} c black",
+"| c black",
+" . c black",
+".. c black",
+"X. c black",
+"o. c black",
+"O. c black",
+"+. c black",
+"@. c black",
+"#. c black",
+"$. c black",
+"%. c black",
+"&. c black",
+"*. c black",
+"=. c black",
+"-. c black",
+";. c black",
+":. c black",
+">. c black",
+",. c black",
+"<. c black",
+"1. c black",
+"2. c black",
+"3. c black",
+"4. c black",
+"5. c black",
+"6. c black",
+"7. c black",
+"8. c black",
+"9. c black",
+"0. c black",
+"q. c black",
+"w. c black",
+"e. c black",
+"r. c black",
+"t. c black",
+"y. c black",
+"u. c black",
+"i. c black",
+"p. c black",
+"a. c black",
+"s. c black",
+"d. c black",
+"f. c black",
+"g. c black",
+"h. c black",
+"j. c black",
+"k. c black",
+"l. c black",
+"z. c black",
+"x. c black",
+"c. c black",
+"v. c black",
+"b. c black",
+"n. c black",
+"m. c black",
+"M. c black",
+"N. c black",
+"B. c black",
+"V. c black",
+"C. c black",
+"Z. c black",
+"A. c black",
+"S. c black",
+"D. c black",
+"F. c black",
+"G. c black",
+"H. c black",
+"J. c black",
+"K. c black",
+"L. c black",
+"P. c black",
+"I. c black",
+"U. c black",
+"Y. c black",
+"T. c black",
+"R. c black",
+"E. c black",
+"W. c black",
+"Q. c black",
+"!. c black",
+"~. c black",
+"^. c black",
+"/. c black",
+"(. c black",
+"). c black",
+"_. c black",
+"`. c black",
+"'. c black",
+"]. c black",
+"[. c black",
+"{. c black",
+"}. c black",
+"|. c black",
+" X c black",
+".X c black",
+"XX c black",
+"oX c black",
+"OX c black",
+"+X c black",
+"@X c black",
+"#X c black",
+"$X c black",
+"%X c black",
+"&X c black",
+"*X c black",
+"=X c black",
+"-X c black",
+";X c black",
+":X c black",
+">X c black",
+",X c black",
+"<X c black",
+"1X c black",
+"2X c black",
+"3X c black",
+"4X c black",
+"5X c black",
+"6X c black",
+"7X c black",
+"8X c black",
+"9X c black",
+"0X c black",
+"qX c black",
+"wX c black",
+"eX c black",
+"rX c black",
+"tX c black",
+"yX c black",
+"uX c black",
+"iX c black",
+"pX c black",
+"aX c black",
+"sX c black",
+"dX c black",
+"fX c black",
+"gX c black",
+"hX c black",
+"jX c black",
+"kX c black",
+"lX c black",
+"zX c black",
+"xX c black",
+"cX c black",
+"vX c black",
+"bX c black",
+"nX c black",
+"mX c black",
+"MX c black",
+"NX c black",
+"BX c black",
+"VX c black",
+"CX c black",
+"ZX c black",
+"AX c black",
+"SX c black",
+"DX c black",
+"FX c black",
+"GX c black",
+"HX c black",
+"JX c black",
+"KX c black",
+"LX c black",
+"PX c black",
+"IX c black",
+"UX c black",
+/* pixels */
+" ",
+" ",
+" ",
+" ",
+" ",
+" ",
+" ",
+" = < X ",
+" 3 i @ 6 : o ",
+" 1 q @ % % - q i 7 - $ ",
+" 2 q + @ 9 i i q q i i 2 ",
+" 1 q + @ 9 5 % q i 7 - $ ",
+" 1 q @ + q , 6 : o ",
+" 1 q + @ q 2 ",
+" 1 q + @ q 1 ",
+" 1 q q 1 ",
+" 1 i 3 1 3 i 1 ",
+" > 8 q q q 8 , ",
+" o @ @ @ @ @ o ",
+" ",
+" ",
+" ",
+" ",
+" "
+};
--- /dev/null
+/* XPM */
+static char *eli[] = {
+/* columns rows colors chars-per-pixel */
+"24 24 256 2 ",
+" c None",
+". c #FFFFFD",
+"X c #FFFFFB",
+"o c #FFFFF5",
+"O c #FFFFED",
+"+ c #FEF8DE",
+"@ c #FAF9F9",
+"# c #FAF8F8",
+"$ c #F8F8F8",
+"% c #F8F4DD",
+"& c #F7F8F8",
+"* c #F7F3DB",
+"= c #F6F6F6",
+"- c #F6F3EB",
+"; c #F4F4F4",
+": c #F3F2F2",
+"> c gray95",
+", c #F1F2F2",
+"< c #F1F1F1",
+"1 c #F1F0F0",
+"2 c #F1EFEF",
+"3 c #F0EFEF",
+"4 c #EFEDED",
+"5 c #EEEEEE",
+"6 c #EEECE3",
+"7 c #EDEBEB",
+"8 c #EDEBE6",
+"9 c #ECEAEA",
+"0 c gray92",
+"q c #EBE9E9",
+"w c #EAEAEA",
+"e c #EAEAE9",
+"r c #E7E6E6",
+"t c #E7E1D1",
+"y c #E6E3DA",
+"u c #E3E1E1",
+"i c #E2E2DB",
+"p c #E2E0E0",
+"a c #E1E1E1",
+"s c #E1DECD",
+"d c #E1DDCF",
+"f c #DFDECB",
+"g c gainsboro",
+"h c #DBDCDC",
+"j c #D9D6D6",
+"k c #D7D6D7",
+"l c #D7D6BE",
+"z c #D3D2D2",
+"x c #D3CEC2",
+"c c #D1D2D2",
+"v c #CAC6C0",
+"b c #C6C1B7",
+"n c #C4C1C1",
+"m c #C4C0BC",
+"M c #C3BEBC",
+"N c #C1BEBE",
+"B c #B7B8B8",
+"V c #B7B3B3",
+"C c #B4B1B2",
+"Z c #B4B1B1",
+"A c #B3B1A8",
+"S c #B3AEAD",
+"D c #B3ADAD",
+"F c #ADABAB",
+"G c #ADAA9B",
+"H c #ACAA99",
+"J c #ACA797",
+"K c #ABA9A9",
+"L c #A7A4A4",
+"P c #A6A296",
+"I c #A4A1A1",
+"U c #A39D92",
+"Y c #A09A8F",
+"T c #9E968D",
+"R c #929294",
+"E c #928B7E",
+"W c #908B8B",
+"Q c #8D8B8D",
+"! c #8B8989",
+"~ c #8B8882",
+"^ c #8A8582",
+"/ c #888686",
+"( c #858284",
+") c #857F7F",
+"_ c #848484",
+"` c #848282",
+"' c #837E81",
+"] c #827C7C",
+"[ c #817D75",
+"{ c #7F7C7C",
+"} c #7F7C74",
+"| c #7F7878",
+" . c #7D7B7C",
+".. c #7A7772",
+"X. c #787674",
+"o. c #787064",
+"O. c #777676",
+"+. c #77756E",
+"@. c #777469",
+"#. c #777070",
+"$. c #767269",
+"%. c #747171",
+"&. c #737068",
+"*. c #736F60",
+"=. c #736D5F",
+"-. c #6F6A6C",
+";. c #6D6A6B",
+":. c #6D695E",
+">. c #6C6566",
+",. c #6B6A6B",
+"<. c #6B6759",
+"1. c #6A686B",
+"2. c #6A685F",
+"3. c #6A6559",
+"4. c #686769",
+"5. c #686364",
+"6. c #666465",
+"7. c #656363",
+"8. c #645E53",
+"9. c #636060",
+"0. c #635E5D",
+"q. c #635E53",
+"w. c #635D51",
+"e. c #626060",
+"r. c #615E55",
+"t. c #615C5A",
+"y. c #605951",
+"u. c #5F5E5D",
+"i. c #5F5B5D",
+"p. c #5E5C5C",
+"a. c #5D5C5C",
+"s. c #5C5C5A",
+"d. c #59554E",
+"f. c #595457",
+"g. c #555458",
+"h. c #554E49",
+"j. c #514C48",
+"k. c #4F4A48",
+"l. c #4E4B47",
+"z. c #4D4845",
+"x. c #4A484A",
+"c. c #4A4847",
+"v. c #494749",
+"b. c #484748",
+"n. c #484547",
+"m. c #484445",
+"M. c #474647",
+"N. c #474341",
+"B. c #464446",
+"V. c #464344",
+"C. c #454040",
+"Z. c #444546",
+"A. c #444244",
+"S. c #444143",
+"D. c #444042",
+"F. c #434042",
+"G. c #413D3F",
+"H. c #413C3F",
+"J. c black",
+"K. c black",
+"L. c black",
+"P. c black",
+"I. c black",
+"U. c black",
+"Y. c black",
+"T. c black",
+"R. c black",
+"E. c black",
+"W. c black",
+"Q. c black",
+"!. c black",
+"~. c black",
+"^. c black",
+"/. c black",
+"(. c black",
+"). c black",
+"_. c black",
+"`. c black",
+"'. c black",
+"]. c black",
+"[. c black",
+"{. c black",
+"}. c black",
+"|. c black",
+" X c black",
+".X c black",
+"XX c black",
+"oX c black",
+"OX c black",
+"+X c black",
+"@X c black",
+"#X c black",
+"$X c black",
+"%X c black",
+"&X c black",
+"*X c black",
+"=X c black",
+"-X c black",
+";X c black",
+":X c black",
+">X c black",
+",X c black",
+"<X c black",
+"1X c black",
+"2X c black",
+"3X c black",
+"4X c black",
+"5X c black",
+"6X c black",
+"7X c black",
+"8X c black",
+"9X c black",
+"0X c black",
+"qX c black",
+"wX c black",
+"eX c black",
+"rX c black",
+"tX c black",
+"yX c black",
+"uX c black",
+"iX c black",
+"pX c black",
+"aX c black",
+"sX c black",
+"dX c black",
+"fX c black",
+"gX c black",
+"hX c black",
+"jX c black",
+"kX c black",
+"lX c black",
+"zX c black",
+"xX c black",
+"cX c black",
+"vX c black",
+"bX c black",
+"nX c black",
+"mX c black",
+"MX c black",
+"NX c black",
+"BX c black",
+"VX c black",
+"CX c black",
+"ZX c black",
+"AX c black",
+"SX c black",
+"DX c black",
+"FX c black",
+"GX c black",
+"HX c black",
+"JX c black",
+"KX c black",
+"LX c black",
+"PX c black",
+"IX c black",
+"UX c black",
+/* pixels */
+" ",
+" ",
+" ",
+" ",
+" 4 r r 4 o ",
+" = n R 4.0.u.u.u.4.Q M = ",
+" V -.n.d.o.O.{ { O.+.8.M.4.V & ",
+" 4 Q v.h.T x O o s G 8.M.( 4 ",
+" = Q G.:.l y [ M.) = ",
+" S k.8.f 6 +.M.L ",
+" = O.G.P b n.-.4 ",
+" g 0.l.M % =.f.k ",
+" g 6.l.M + =.f.k ",
+" = +.G.G v l.>.4 ",
+" F v.<.y - } M.P ",
+" = ) M.+.s 6 E M.{ 4 ",
+" 4 ( M.d.J t * A :.M.{ r ",
+" = S 6.n.8.+.^ Y U ~ ..<.l.u.F 4 ",
+" 4 V ( >.u.u.0.0.6.' V 4 ",
+" 4 r k k y = ",
+" ",
+" ",
+" ",
+" "
+};
--- /dev/null
+/* XPM */
+static char *export[] = {
+/* columns rows colors chars-per-pixel */
+"24 24 256 2 ",
+" c None",
+". c #FFFF9D",
+"X c #FFFF95",
+"o c #FFFF94",
+"O c #FFFF93",
+"+ c #FFFF92",
+"@ c #FFFF91",
+"# c #FFFF90",
+"$ c #FFFF8F",
+"% c #FFFF8E",
+"& c #FFFF8D",
+"* c #FFFF8C",
+"= c #FFFF8B",
+"- c #FFFF8A",
+"; c #FFFE8F",
+": c #FFFE8B",
+"> c #FFFE8A",
+", c #FFFD8E",
+"< c #FFFD8D",
+"1 c #FFFD8A",
+"2 c #FFFC89",
+"3 c #FFFB8B",
+"4 c #FEFB87",
+"5 c #FEF987",
+"6 c #FEF888",
+"7 c #FCFA8C",
+"8 c #FCF787",
+"9 c #FBF485",
+"0 c #F9FA90",
+"q c #F9F388",
+"w c #F5F584",
+"e c #F3F187",
+"r c #F2E67D",
+"t c #F0E47E",
+"y c #EFE27F",
+"u c #EFE27C",
+"i c #EFE17E",
+"p c #EFE07E",
+"a c #EFDF7F",
+"s c #EFDF7D",
+"d c #EEE17E",
+"f c #EEE07E",
+"g c #EEDE7E",
+"h c #EEDE7B",
+"j c #ECE87E",
+"k c #EBE57D",
+"l c #E8E57E",
+"z c #E7E47E",
+"x c #E7E17A",
+"c c #E6E27A",
+"v c #E6DF7B",
+"b c #E6DF7A",
+"n c #E2DC7C",
+"m c #E1DE7B",
+"M c #E1DC7A",
+"N c #DDDB79",
+"B c #DDD375",
+"V c #DDD274",
+"C c #DDD273",
+"Z c #DDD076",
+"A c #DDCF76",
+"S c #DCDCDB",
+"D c #DCD77A",
+"F c #DCCF75",
+"G c #DBCF74",
+"H c #DBCD77",
+"J c #DAD878",
+"K c #D9CE73",
+"L c #D9CC72",
+"P c #D8CD73",
+"I c #D8CB73",
+"U c #D8CB72",
+"Y c #D7CC72",
+"T c #D7CA73",
+"R c gray84",
+"E c #D5D5D5",
+"W c #D1CB71",
+"Q c #D1CA70",
+"! c #C8BB6B",
+"~ c #C5BF69",
+"^ c #C3C3C4",
+"/ c #C3C3C3",
+"( c #C3C06C",
+") c gray76",
+"_ c #C2B569",
+"` c #C1BE68",
+"' c #C0C0C1",
+"] c #C0C0C0",
+"[ c gray75",
+"{ c #BEBCBE",
+"} c #BEBCBD",
+"| c #BEB967",
+" . c #BDBCBE",
+".. c #BDB064",
+"X. c #BCBDBE",
+"o. c #BCBCBE",
+"O. c #BCBABA",
+"+. c #BBBCBD",
+"@. c #BBBABB",
+"#. c #BBAD65",
+"$. c #BBAD62",
+"%. c #BABBBB",
+"&. c #BAB363",
+"*. c #BAAE63",
+"=. c #BAAD63",
+"-. c #BAAD62",
+";. c #B7AF60",
+":. c #B6B461",
+">. c #B3AE61",
+",. c #B1AD5D",
+"<. c #B0AC5C",
+"1. c #AEA75C",
+"2. c #AAA65A",
+"3. c #AA9C5B",
+"4. c #A6A55A",
+"5. c #A3A155",
+"6. c #A1A15C",
+"7. c #9E9E56",
+"8. c #9D9C55",
+"9. c #9B8F56",
+"0. c #9A9253",
+"q. c #979655",
+"w. c #958F4D",
+"e. c #928D4B",
+"r. c #918C4E",
+"t. c #908E56",
+"y. c #908D57",
+"u. c #908A58",
+"i. c #908958",
+"p. c #8E8957",
+"a. c #8E8748",
+"s. c #8D894A",
+"d. c #8D8848",
+"f. c #8B8548",
+"g. c #878383",
+"h. c #857F53",
+"j. c #837F7F",
+"k. c #837F43",
+"l. c #837E45",
+"z. c #828046",
+"x. c #807A4E",
+"c. c #7E7B43",
+"v. c #7D794D",
+"b. c #7C7A40",
+"n. c #7B773E",
+"m. c #797841",
+"M. c #787777",
+"N. c #78743F",
+"B. c #77797E",
+"V. c #77787D",
+"C. c #77777C",
+"Z. c #777676",
+"A. c #77757A",
+"S. c #77747A",
+"D. c #76757A",
+"F. c #767476",
+"G. c #75713D",
+"H. c #75703D",
+"J. c #756A46",
+"K. c #747477",
+"L. c #736F3D",
+"P. c #716C3D",
+"I. c #6F6D71",
+"U. c #6F6D70",
+"Y. c #6E7074",
+"T. c #6E6F73",
+"R. c #6E6D71",
+"E. c #6E6D70",
+"W. c #6E6D3A",
+"Q. c #6E6C70",
+"!. c #6D6D6F",
+"~. c #6C6D70",
+"^. c #6B6C70",
+"/. c #6B6A6D",
+"(. c #6B6539",
+"). c #6A6A6C",
+"_. c #696644",
+"`. c #646234",
+"'. c #636033",
+"]. c #626034",
+"[. c #626032",
+"{. c #605D34",
+"}. c #605B31",
+"|. c #5C5830",
+" X c #52522B",
+".X c #52502A",
+"XX c #50512C",
+"oX c #504F2E",
+"OX c #504F2B",
+"+X c #4F4736",
+"@X c #4E4433",
+"#X c #4D4835",
+"$X c #4D4735",
+"%X c #4D4635",
+"&X c #4D4433",
+"*X c #4A4928",
+"=X c #464627",
+"-X c #444224",
+";X c #424123",
+":X c #3E382E",
+">X c #3E352B",
+",X c #3D3A39",
+"<X c #3D3A2E",
+"1X c #3D392E",
+"2X c #3D3836",
+"3X c #3D382E",
+"4X c #3D382D",
+"5X c #3D3736",
+"6X c #3D372E",
+"7X c #3D372D",
+"8X c #3C3837",
+"9X c #3B391E",
+"0X c #3B3836",
+"qX c #3B3635",
+"wX c #3B3534",
+"eX c #3A3736",
+"rX c #3A3329",
+"tX c #333136",
+"yX c #333135",
+"uX c #333034",
+"iX c #323135",
+"pX c #32311B",
+"aX c #322F33",
+"sX c #313135",
+"dX c #313131",
+"fX c #313035",
+"gX c #313034",
+"hX c #31301B",
+"jX c #312E33",
+"kX c #312E27",
+"lX c #302F34",
+"zX c #302F2F",
+"xX c #2F2C2C",
+"cX c #2F2B24",
+"vX c #2E2A2A",
+"bX c #282320",
+"nX c black",
+"mX c black",
+"MX c black",
+"NX c black",
+"BX c black",
+"VX c black",
+"CX c black",
+"ZX c black",
+"AX c black",
+"SX c black",
+"DX c black",
+"FX c black",
+"GX c black",
+"HX c black",
+"JX c black",
+"KX c black",
+"LX c black",
+"PX c black",
+"IX c black",
+"UX c black",
+/* pixels */
+" ",
+" ",
+" ",
+" ",
+" ",
+" S g.Z.C.C.C.C.B.B.B.B.B.B.C.C.B.C.C.C.Z.j.R ",
+" [ tXkX+X+X+X+X+X#X#X#X#X#X#X+X+X+X+X+X>XxX[ ",
+" ^ aXJ.r a y a y y y y y y y y y a a a 4.5X[ ",
+" ^ aXv.$ $ $ $ $ $ $ X $ $ $ $ $ $ 4 $ #.5X[ ",
+" [ tXh.Y z.0.w.,...$ z ,.q 1.s.z...4 4 #.5X[ ",
+" ^ tXp.n.{.4.7.( `.,.L.7.X =Xz.7. X| $ #.5X[ ",
+" ^ aXt.c.k.Y ~ 4 B pXL.$ $ *XD $ c.0.$ ,.5X[ ",
+" [ tXt.k.=XJ.W.z v pXG.$ $ =X X|.(.z $ #.2X[ ",
+" ^ tXu.n.,.. X w {.1.L.5.X *X~ N $ $ $ ,.5X[ ",
+" ^ tXp.s.9X X*X|.w.X v `.N {.z $ $ | 5.! 5X[ ",
+" [ aXx.$ y v y j $ $ $ 8 $ 4 4 $ $ 8 8 _ 5X[ ",
+" ^ tX_.B B B A A A Y Y A Y A Y Y Y A B 9.5X[ ",
+" ^ xXbX:X>X:X:X:X:X>X>X:X:X:X:X>X>X>X>XcXxX[ ",
+" R M.!.!.I.I.Y.I.Y.I.I.Y.Y.Y.I.I.I.!.!.!.Z.R ",
+" ",
+" ",
+" ",
+" ",
+" "
+};
--- /dev/null
+/* XPM */
+static char *fileReferencedLoaded[] = {
+/* columns rows colors chars-per-pixel */
+"22 21 256 2 ",
+" c #040404",
+". c #848484",
+"X c gray77",
+"o c #FA0404",
+"O c #FAFA04",
+"+ c gray98",
+"@ c black",
+"# c black",
+"$ c black",
+"% c black",
+"& c black",
+"* c black",
+"= c black",
+"- c black",
+"; c black",
+": c black",
+"> c black",
+", c black",
+"< c black",
+"1 c black",
+"2 c black",
+"3 c black",
+"4 c black",
+"5 c black",
+"6 c black",
+"7 c black",
+"8 c black",
+"9 c black",
+"0 c black",
+"q c black",
+"w c black",
+"e c black",
+"r c black",
+"t c black",
+"y c black",
+"u c black",
+"i c black",
+"p c black",
+"a c black",
+"s c black",
+"d c black",
+"f c black",
+"g c black",
+"h c black",
+"j c black",
+"k c black",
+"l c black",
+"z c black",
+"x c black",
+"c c black",
+"v c black",
+"b c black",
+"n c black",
+"m c black",
+"M c black",
+"N c black",
+"B c black",
+"V c black",
+"C c black",
+"Z c black",
+"A c black",
+"S c black",
+"D c black",
+"F c black",
+"G c black",
+"H c black",
+"J c black",
+"K c black",
+"L c black",
+"P c black",
+"I c black",
+"U c black",
+"Y c black",
+"T c black",
+"R c black",
+"E c black",
+"W c black",
+"Q c black",
+"! c black",
+"~ c black",
+"^ c black",
+"/ c black",
+"( c black",
+") c black",
+"_ c black",
+"` c black",
+"' c black",
+"] c black",
+"[ c black",
+"{ c black",
+"} c black",
+"| c black",
+" . c black",
+".. c black",
+"X. c black",
+"o. c black",
+"O. c black",
+"+. c black",
+"@. c black",
+"#. c black",
+"$. c black",
+"%. c black",
+"&. c black",
+"*. c black",
+"=. c black",
+"-. c black",
+";. c black",
+":. c black",
+">. c black",
+",. c black",
+"<. c black",
+"1. c black",
+"2. c black",
+"3. c black",
+"4. c black",
+"5. c black",
+"6. c black",
+"7. c black",
+"8. c black",
+"9. c black",
+"0. c black",
+"q. c black",
+"w. c black",
+"e. c black",
+"r. c black",
+"t. c black",
+"y. c black",
+"u. c black",
+"i. c black",
+"p. c black",
+"a. c black",
+"s. c black",
+"d. c black",
+"f. c black",
+"g. c black",
+"h. c black",
+"j. c black",
+"k. c black",
+"l. c black",
+"z. c black",
+"x. c black",
+"c. c black",
+"v. c black",
+"b. c black",
+"n. c black",
+"m. c black",
+"M. c black",
+"N. c black",
+"B. c black",
+"V. c black",
+"C. c black",
+"Z. c black",
+"A. c black",
+"S. c black",
+"D. c black",
+"F. c black",
+"G. c black",
+"H. c black",
+"J. c black",
+"K. c black",
+"L. c black",
+"P. c black",
+"I. c black",
+"U. c black",
+"Y. c black",
+"T. c black",
+"R. c black",
+"E. c black",
+"W. c black",
+"Q. c black",
+"!. c black",
+"~. c black",
+"^. c black",
+"/. c black",
+"(. c black",
+"). c black",
+"_. c black",
+"`. c black",
+"'. c black",
+"]. c black",
+"[. c black",
+"{. c black",
+"}. c black",
+"|. c black",
+" X c black",
+".X c black",
+"XX c black",
+"oX c black",
+"OX c black",
+"+X c black",
+"@X c black",
+"#X c black",
+"$X c black",
+"%X c black",
+"&X c black",
+"*X c black",
+"=X c black",
+"-X c black",
+";X c black",
+":X c black",
+">X c black",
+",X c black",
+"<X c black",
+"1X c black",
+"2X c black",
+"3X c black",
+"4X c black",
+"5X c black",
+"6X c black",
+"7X c black",
+"8X c black",
+"9X c black",
+"0X c black",
+"qX c black",
+"wX c black",
+"eX c black",
+"rX c black",
+"tX c black",
+"yX c black",
+"uX c black",
+"iX c black",
+"pX c black",
+"aX c black",
+"sX c black",
+"dX c black",
+"fX c black",
+"gX c black",
+"hX c black",
+"jX c black",
+"kX c black",
+"lX c black",
+"zX c black",
+"xX c black",
+"cX c black",
+"vX c black",
+"bX c black",
+"nX c black",
+"mX c black",
+"MX c black",
+"NX c black",
+"BX c black",
+"VX c black",
+"CX c black",
+"ZX c black",
+"AX c black",
+"SX c black",
+"DX c black",
+"FX c black",
+"GX c black",
+"HX c black",
+"JX c black",
+"KX c black",
+"LX c black",
+"PX c black",
+"IX c black",
+"UX c None",
+/* pixels */
+"UXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUX",
+"UXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUX",
+"UXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUX",
+"UXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUX",
+"UXUXUXUXUX. . . . . UXUXUXUXUXUXUXUXUXUXUXUX",
+"UXUXUXUX. + + + + + . UXUXUXUXUXUXUXUXUXUXUX",
+"UXUXUX. + X O X O X + . . . . . . UXUXUXUXUX",
+"UXUXUX. + O X O X O X + + + + + . UXUXUXUX",
+"UXUXUX. + X O X O X O X O X O X . UXUXUXUX",
+"UXUXUX. + O X O X O X O X O X O . UXUXUXUX",
+"UXUX. . . . . . . . . . . . . . O UXUXUXUX",
+"UXUX. + + + + + + + + + + + . X UXUXUXUX",
+"UXUXUX. O X O X O X O X O X O . UXUXUXUX",
+"UXUXUX. + O X O X O X O X O X . UXUXUXUX",
+"UXUXUXUX. + O X O X O X O X O X UXUXUXUX",
+"UXUXUXUXUX. + O X O X O X O X O . UXUXUXUX",
+"UXUXUXUXUX. UXUXUXUXUX",
+"UXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUX",
+"UXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUX",
+"UXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUX",
+"UXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUX"
+};
--- /dev/null
+/* XPM */
+static char *fileReferencedUnLoaded[] = {
+/* columns rows colors chars-per-pixel */
+"22 21 256 2 ",
+" c #040404",
+". c #646464",
+"X c gray81",
+"o c #DADADA",
+"O c #FA0404",
+"+ c #FAFA04",
+"@ c gray98",
+"# c black",
+"$ c black",
+"% c black",
+"& c black",
+"* c black",
+"= c black",
+"- c black",
+"; c black",
+": c black",
+"> c black",
+", c black",
+"< c black",
+"1 c black",
+"2 c black",
+"3 c black",
+"4 c black",
+"5 c black",
+"6 c black",
+"7 c black",
+"8 c black",
+"9 c black",
+"0 c black",
+"q c black",
+"w c black",
+"e c black",
+"r c black",
+"t c black",
+"y c black",
+"u c black",
+"i c black",
+"p c black",
+"a c black",
+"s c black",
+"d c black",
+"f c black",
+"g c black",
+"h c black",
+"j c black",
+"k c black",
+"l c black",
+"z c black",
+"x c black",
+"c c black",
+"v c black",
+"b c black",
+"n c black",
+"m c black",
+"M c black",
+"N c black",
+"B c black",
+"V c black",
+"C c black",
+"Z c black",
+"A c black",
+"S c black",
+"D c black",
+"F c black",
+"G c black",
+"H c black",
+"J c black",
+"K c black",
+"L c black",
+"P c black",
+"I c black",
+"U c black",
+"Y c black",
+"T c black",
+"R c black",
+"E c black",
+"W c black",
+"Q c black",
+"! c black",
+"~ c black",
+"^ c black",
+"/ c black",
+"( c black",
+") c black",
+"_ c black",
+"` c black",
+"' c black",
+"] c black",
+"[ c black",
+"{ c black",
+"} c black",
+"| c black",
+" . c black",
+".. c black",
+"X. c black",
+"o. c black",
+"O. c black",
+"+. c black",
+"@. c black",
+"#. c black",
+"$. c black",
+"%. c black",
+"&. c black",
+"*. c black",
+"=. c black",
+"-. c black",
+";. c black",
+":. c black",
+">. c black",
+",. c black",
+"<. c black",
+"1. c black",
+"2. c black",
+"3. c black",
+"4. c black",
+"5. c black",
+"6. c black",
+"7. c black",
+"8. c black",
+"9. c black",
+"0. c black",
+"q. c black",
+"w. c black",
+"e. c black",
+"r. c black",
+"t. c black",
+"y. c black",
+"u. c black",
+"i. c black",
+"p. c black",
+"a. c black",
+"s. c black",
+"d. c black",
+"f. c black",
+"g. c black",
+"h. c black",
+"j. c black",
+"k. c black",
+"l. c black",
+"z. c black",
+"x. c black",
+"c. c black",
+"v. c black",
+"b. c black",
+"n. c black",
+"m. c black",
+"M. c black",
+"N. c black",
+"B. c black",
+"V. c black",
+"C. c black",
+"Z. c black",
+"A. c black",
+"S. c black",
+"D. c black",
+"F. c black",
+"G. c black",
+"H. c black",
+"J. c black",
+"K. c black",
+"L. c black",
+"P. c black",
+"I. c black",
+"U. c black",
+"Y. c black",
+"T. c black",
+"R. c black",
+"E. c black",
+"W. c black",
+"Q. c black",
+"!. c black",
+"~. c black",
+"^. c black",
+"/. c black",
+"(. c black",
+"). c black",
+"_. c black",
+"`. c black",
+"'. c black",
+"]. c black",
+"[. c black",
+"{. c black",
+"}. c black",
+"|. c black",
+" X c black",
+".X c black",
+"XX c black",
+"oX c black",
+"OX c black",
+"+X c black",
+"@X c black",
+"#X c black",
+"$X c black",
+"%X c black",
+"&X c black",
+"*X c black",
+"=X c black",
+"-X c black",
+";X c black",
+":X c black",
+">X c black",
+",X c black",
+"<X c black",
+"1X c black",
+"2X c black",
+"3X c black",
+"4X c black",
+"5X c black",
+"6X c black",
+"7X c black",
+"8X c black",
+"9X c black",
+"0X c black",
+"qX c black",
+"wX c black",
+"eX c black",
+"rX c black",
+"tX c black",
+"yX c black",
+"uX c black",
+"iX c black",
+"pX c black",
+"aX c black",
+"sX c black",
+"dX c black",
+"fX c black",
+"gX c black",
+"hX c black",
+"jX c black",
+"kX c black",
+"lX c black",
+"zX c black",
+"xX c black",
+"cX c black",
+"vX c black",
+"bX c black",
+"nX c black",
+"mX c black",
+"MX c black",
+"NX c black",
+"BX c black",
+"VX c black",
+"CX c black",
+"ZX c black",
+"AX c black",
+"SX c black",
+"DX c black",
+"FX c black",
+"GX c black",
+"HX c black",
+"JX c black",
+"KX c black",
+"LX c black",
+"PX c black",
+"IX c black",
+"UX c None",
+/* pixels */
+"UXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUX",
+"UXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUX",
+"UXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUX",
+"UXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUX",
+"UXUXUXUXUX. . . . . UXUXUXUXUXUXUXUXUXUXUXUX",
+"UXUXUXUX. X + X + X . UXUXUXUXUXUXUXUXUXUXUX",
+"UXUXUX. X + X + X + X . . . . . . UXUXUXUXUX",
+"UXUXUX. @ @ @ @ @ @ @ @ @ @ @ @ . UXUXUXUX",
+"UXUXUX. @ + X + o + X + X + X + . + UXUXUX",
+"UXUXUX. @ X + + X . + UXUXUX",
+"UXUXUX. @ + X X + X + + X + . + UXUXUX",
+"UXUXUX. @ X + + X + + X + X . + UXUXUX",
+"UXUXUX. @ + X X + o + + o + . + UXUXUX",
+"UXUXUX. @ X + + X . + UXUXUX",
+"UXUXUX. @ + X + X + X + X + X + . + UXUXUX",
+"UXUXUX. . . . . . . . . . . . . . UXUXUXUX",
+"UXUXUXUX UXUXUXUX",
+"UXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUX",
+"UXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUX",
+"UXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUX",
+"UXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUX"
+};
--- /dev/null
+/* XPM */
+static char *first[] = {
+/* columns rows colors chars-per-pixel */
+"24 24 256 2 ",
+" c None",
+". c #FDFDFD",
+"X c gray99",
+"o c #FCFBF8",
+"O c #FBFBFA",
+"+ c #F8F7F7",
+"@ c #F8F7F6",
+"# c #F7F7F6",
+"$ c #F7F6F6",
+"% c #F6F5F4",
+"& c gray96",
+"* c #F3F3F3",
+"= c #F2F3F3",
+"- c #F0EFEF",
+"; c #F0EFED",
+": c #F0EEED",
+"> c #EEECEB",
+", c #EDEAE6",
+"< c #ECEAE7",
+"1 c #ECE9E6",
+"2 c #E9E8E6",
+"3 c #E8E7E5",
+"4 c #E6E5E3",
+"5 c #E1DED8",
+"6 c #E0E0DF",
+"7 c gray86",
+"8 c #CBC9C6",
+"9 c #CAC9C6",
+"0 c #CAC6C4",
+"q c #C6C3BF",
+"w c #8F8B82",
+"e c #697382",
+"r c #677081",
+"t c #666565",
+"y c #606973",
+"u c #60666B",
+"i c #595856",
+"p c #56565A",
+"a c #509BFF",
+"s c #4E97FF",
+"d c #4E96FF",
+"f c #4E95FF",
+"g c #4E4D4C",
+"h c #4D90F2",
+"j c #4C94FC",
+"k c #4C8FF3",
+"l c #4B95FF",
+"z c #4B90F5",
+"x c #4B8FF4",
+"c c #4B4A49",
+"v c #4A89E9",
+"b c #494847",
+"n c #4890FB",
+"m c #488EF6",
+"M c #488BEF",
+"N c #4888E8",
+"B c #468FF9",
+"V c #46484B",
+"C c #464647",
+"Z c gray27",
+"A c #4275C8",
+"S c #414244",
+"D c #40403F",
+"F c #3F74C5",
+"G c #3E3E3D",
+"H c #3D7AD3",
+"J c #3D3B3A",
+"K c #3A75CB",
+"L c #3A6EBF",
+"P c #3A6DBF",
+"I c #397AD7",
+"U c #39393A",
+"Y c #3776D0",
+"T c #376DC0",
+"R c #346BB6",
+"E c #3369B4",
+"W c #313131",
+"Q c #2A2A2D",
+"! c #285293",
+"~ c #275296",
+"^ c #272726",
+"/ c #24477C",
+"( c #20202B",
+") c #1F4782",
+"_ c #1F467E",
+"` c #1F202C",
+"' c #1E222F",
+"] c #1E1F29",
+"[ c #1C202F",
+"{ c #1B4073",
+"} c #183869",
+"| c #173767",
+" . c #151D29",
+".. c #131E2A",
+"X. c #131D2B",
+"o. c #131D2A",
+"O. c #12305D",
+"+. c #12171C",
+"@. c #113869",
+"#. c #101625",
+"$. c #040C18",
+"%. c #000E26",
+"&. c #00000A",
+"*. c black",
+"=. c black",
+"-. c black",
+";. c black",
+":. c black",
+">. c black",
+",. c black",
+"<. c black",
+"1. c black",
+"2. c black",
+"3. c black",
+"4. c black",
+"5. c black",
+"6. c black",
+"7. c black",
+"8. c black",
+"9. c black",
+"0. c black",
+"q. c black",
+"w. c black",
+"e. c black",
+"r. c black",
+"t. c black",
+"y. c black",
+"u. c black",
+"i. c black",
+"p. c black",
+"a. c black",
+"s. c black",
+"d. c black",
+"f. c black",
+"g. c black",
+"h. c black",
+"j. c black",
+"k. c black",
+"l. c black",
+"z. c black",
+"x. c black",
+"c. c black",
+"v. c black",
+"b. c black",
+"n. c black",
+"m. c black",
+"M. c black",
+"N. c black",
+"B. c black",
+"V. c black",
+"C. c black",
+"Z. c black",
+"A. c black",
+"S. c black",
+"D. c black",
+"F. c black",
+"G. c black",
+"H. c black",
+"J. c black",
+"K. c black",
+"L. c black",
+"P. c black",
+"I. c black",
+"U. c black",
+"Y. c black",
+"T. c black",
+"R. c black",
+"E. c black",
+"W. c black",
+"Q. c black",
+"!. c black",
+"~. c black",
+"^. c black",
+"/. c black",
+"(. c black",
+"). c black",
+"_. c black",
+"`. c black",
+"'. c black",
+"]. c black",
+"[. c black",
+"{. c black",
+"}. c black",
+"|. c black",
+" X c black",
+".X c black",
+"XX c black",
+"oX c black",
+"OX c black",
+"+X c black",
+"@X c black",
+"#X c black",
+"$X c black",
+"%X c black",
+"&X c black",
+"*X c black",
+"=X c black",
+"-X c black",
+";X c black",
+":X c black",
+">X c black",
+",X c black",
+"<X c black",
+"1X c black",
+"2X c black",
+"3X c black",
+"4X c black",
+"5X c black",
+"6X c black",
+"7X c black",
+"8X c black",
+"9X c black",
+"0X c black",
+"qX c black",
+"wX c black",
+"eX c black",
+"rX c black",
+"tX c black",
+"yX c black",
+"uX c black",
+"iX c black",
+"pX c black",
+"aX c black",
+"sX c black",
+"dX c black",
+"fX c black",
+"gX c black",
+"hX c black",
+"jX c black",
+"kX c black",
+"lX c black",
+"zX c black",
+"xX c black",
+"cX c black",
+"vX c black",
+"bX c black",
+"nX c black",
+"mX c black",
+"MX c black",
+"NX c black",
+"BX c black",
+"VX c black",
+"CX c black",
+"ZX c black",
+"AX c black",
+"SX c black",
+"DX c black",
+"FX c black",
+"GX c black",
+"HX c black",
+"JX c black",
+"KX c black",
+"LX c black",
+"PX c black",
+"IX c black",
+"UX c black",
+/* pixels */
+" ",
+" ",
+" ",
+" ",
+" ",
+" ",
+" u u u # 7 6 ",
+" u s u - g G # ",
+" u j u - b *.G ",
+" u d u , C @./ Q 0 8 8 8 8 0 ",
+" u d u 3 G | s R . . . . . .$.p ",
+" u d u 4 V { h k v H K Y Y Y H @.C ",
+" u d u w %.k s v B s s s s s s ) g ",
+" u d u - u ~ k B v A T L L L F O.C ",
+" u d u # r ~ s R #.] ( ` ` ` +.t ",
+" u s u e ~ _ ^ 5 , , , > > # ",
+" u u u y &.Q + ",
+" # i G + ",
+" # ",
+" ",
+" ",
+" ",
+" ",
+" "
+};
--- /dev/null
+/* XPM */
+static char *flow_line[] = {
+/* columns rows colors chars-per-pixel */
+"24 21 256 2 ",
+" c black",
+". c #010101",
+"X c #020202",
+"o c gray1",
+"O c #040404",
+"+ c gray2",
+"@ c #060606",
+"# c #070707",
+"$ c gray3",
+"% c #090909",
+"& c gray4",
+"* c #0B0B0B",
+"= c #0C0C0C",
+"- c gray5",
+"; c #0E0E0E",
+": c gray6",
+"> c #101010",
+", c #111111",
+"< c gray7",
+"1 c #131313",
+"2 c gray8",
+"3 c #151515",
+"4 c #161616",
+"5 c gray9",
+"6 c #181818",
+"7 c #191919",
+"8 c gray10",
+"9 c #1B1B1B",
+"0 c gray11",
+"q c #1D1D1D",
+"w c #1E1E1E",
+"e c gray12",
+"r c #202020",
+"t c gray13",
+"y c #222222",
+"u c #232323",
+"i c gray14",
+"p c #252525",
+"a c gray15",
+"s c #272727",
+"d c #282828",
+"f c gray16",
+"g c #2A2A2A",
+"h c gray17",
+"j c #2C2C2C",
+"k c #2D2D2D",
+"l c gray18",
+"z c #2F2F2F",
+"x c gray19",
+"c c #313131",
+"v c #323232",
+"b c gray20",
+"n c #343434",
+"m c #353535",
+"M c gray21",
+"N c #373737",
+"B c gray22",
+"V c #393939",
+"C c #3A3A3A",
+"Z c gray23",
+"A c #3C3C3C",
+"S c gray24",
+"D c #3E3E3E",
+"F c #3F3F3F",
+"G c gray25",
+"H c #414141",
+"J c gray26",
+"K c #434343",
+"L c #444444",
+"P c gray27",
+"I c #464646",
+"U c gray28",
+"Y c #484848",
+"T c #494949",
+"R c gray29",
+"E c #4B4B4B",
+"W c #4C4C4C",
+"Q c gray30",
+"! c #4E4E4E",
+"~ c gray31",
+"^ c #505050",
+"/ c #515151",
+"( c gray32",
+") c #535353",
+"_ c gray33",
+"` c #555555",
+"' c #565656",
+"] c gray34",
+"[ c #585858",
+"{ c gray35",
+"} c #5A5A5A",
+"| c #5B5B5B",
+" . c gray36",
+".. c #5D5D5D",
+"X. c gray37",
+"o. c #5F5F5F",
+"O. c #606060",
+"+. c gray38",
+"@. c #626262",
+"#. c gray39",
+"$. c #646464",
+"%. c #656565",
+"&. c gray40",
+"*. c #676767",
+"=. c #686868",
+"-. c DimGray",
+";. c #6A6A6A",
+":. c gray42",
+">. c #6C6C6C",
+",. c #6D6D6D",
+"<. c gray43",
+"1. c #6F6F6F",
+"2. c gray44",
+"3. c #717171",
+"4. c #727272",
+"5. c gray45",
+"6. c #747474",
+"7. c gray46",
+"8. c #767676",
+"9. c #777777",
+"0. c gray47",
+"q. c #797979",
+"w. c gray48",
+"e. c #7B7B7B",
+"r. c #7C7C7C",
+"t. c gray49",
+"y. c #7E7E7E",
+"u. c gray50",
+"i. c #808080",
+"p. c #818181",
+"a. c gray51",
+"s. c #838383",
+"d. c #848484",
+"f. c gray52",
+"g. c #868686",
+"h. c gray53",
+"j. c #888888",
+"k. c #898989",
+"l. c gray54",
+"z. c #8B8B8B",
+"x. c gray55",
+"c. c #8D8D8D",
+"v. c #8E8E8E",
+"b. c gray56",
+"n. c #909090",
+"m. c gray57",
+"M. c #929292",
+"N. c #939393",
+"B. c gray58",
+"V. c #959595",
+"C. c gray59",
+"Z. c #979797",
+"A. c #989898",
+"S. c gray60",
+"D. c #9A9A9A",
+"F. c #9B9B9B",
+"G. c gray61",
+"H. c #9D9D9D",
+"J. c gray62",
+"K. c #9F9F9F",
+"L. c #A0A0A0",
+"P. c gray63",
+"I. c #A2A2A2",
+"U. c gray64",
+"Y. c #A4A4A4",
+"T. c #A5A5A5",
+"R. c gray65",
+"E. c #A7A7A7",
+"W. c gray66",
+"Q. c #A9A9A9",
+"!. c #AAAAAA",
+"~. c gray67",
+"^. c #ACACAC",
+"/. c gray68",
+"(. c #AEAEAE",
+"). c #AFAFAF",
+"_. c gray69",
+"`. c #B1B1B1",
+"'. c #B2B2B2",
+"]. c gray70",
+"[. c #B4B4B4",
+"{. c gray71",
+"}. c #B6B6B6",
+"|. c #B7B7B7",
+" X c gray72",
+".X c #B9B9B9",
+"XX c gray73",
+"oX c #BBBBBB",
+"OX c #BCBCBC",
+"+X c gray74",
+"@X c gray",
+"#X c gray75",
+"$X c #C0C0C0",
+"%X c #C1C1C1",
+"&X c gray76",
+"*X c #C3C3C3",
+"=X c gray77",
+"-X c #C5C5C5",
+";X c #C6C6C6",
+":X c gray78",
+">X c #C8C8C8",
+",X c gray79",
+"<X c #CACACA",
+"1X c #CBCBCB",
+"2X c gray80",
+"3X c #CDCDCD",
+"4X c #CECECE",
+"5X c gray81",
+"6X c #D0D0D0",
+"7X c gray82",
+"8X c #D2D2D2",
+"9X c LightGray",
+"0X c gray83",
+"qX c #D5D5D5",
+"wX c gray84",
+"eX c #D7D7D7",
+"rX c #D8D8D8",
+"tX c gray85",
+"yX c #DADADA",
+"uX c gray86",
+"iX c gainsboro",
+"pX c #DDDDDD",
+"aX c gray87",
+"sX c #DFDFDF",
+"dX c gray88",
+"fX c #E1E1E1",
+"gX c #E2E2E2",
+"hX c gray89",
+"jX c #E4E4E4",
+"kX c gray90",
+"lX c #E6E6E6",
+"zX c #E7E7E7",
+"xX c gray91",
+"cX c #E9E9E9",
+"vX c #EAEAEA",
+"bX c gray92",
+"nX c #ECECEC",
+"mX c gray93",
+"MX c #EEEEEE",
+"NX c #EFEFEF",
+"BX c gray94",
+"VX c #F1F1F1",
+"CX c gray95",
+"ZX c #F3F3F3",
+"AX c #F4F4F4",
+"SX c gray96",
+"DX c #F6F6F6",
+"FX c gray97",
+"GX c #F8F8F8",
+"HX c #F9F9F9",
+"JX c gray98",
+"KX c #FBFBFB",
+"LX c gray99",
+"PX c #FDFDFD",
+"IX c #FEFEFE",
+"UX c None",
+/* pixels */
+"UXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUX",
+"UXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUX",
+"UXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUX",
+"UXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUX",
+"UXUXUXUXUXO UXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUX",
+"UXUXUXUXUXO UXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUX",
+"UXUXUXUXUXO UXUXUXUXUXUXUXUXO O UXUXUXUXUXUXUXUX",
+"UXUXUXUXUXO UXUXUXUXUXUXUXUXUXO O UXUXUXUXUXUXUX",
+"UXUXUXUXUXO UXUXUXUXUXO O O O O O O UXUXUXUXUXUX",
+"UXUXUXUXUXO UXUXUXUXUXO UXUXUXO O UXUXUXUXUXUXUX",
+"UXUXUXUXUXO UXUXUXUXUXO UXUXO O UXUXUXUXUXUXUXUX",
+"UXUXUXUXUXO UXUXUXUXUXO UXUXUXUXUXUXUXUXUXUXUXUX",
+"UXUXUXUXUXO UXUXUXUXUXO UXUXUXUXUXUXUXUXUXUXUXUX",
+"UXUXUXUXUXO UXUXUXUXUXO UXUXUXUXUXUXUXUXUXUXUXUX",
+"UXUXUXUXUXO UXUXUXUXUXO UXUXUXUXUXUXUXUXUXUXUXUX",
+"UXUXUXUXUXO O O O O O O UXUXUXUXUXUXUXUXUXUXUXUX",
+"UXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUX",
+"UXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUX",
+"UXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUX",
+"UXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUX",
+"UXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUX"
+};
--- /dev/null
+/* XPM */
+static char *gate[] = {
+/* columns rows colors chars-per-pixel */
+"24 24 256 2 ",
+" c None",
+". c #FEFEFE",
+"X c #FDFDFD",
+"o c gray99",
+"O c #FCFBF8",
+"+ c #FBFBFA",
+"@ c #F9F9F9",
+"# c #F8F7F7",
+"$ c #F8F7F6",
+"% c #F8F6F4",
+"& c #F7F7F6",
+"* c #F6F6F6",
+"= c #F6F5F4",
+"- c gray96",
+"; c #F4F4F4",
+": c #F3F3F3",
+"> c #F3F2F0",
+", c #F2F3F3",
+"< c #F2F2F3",
+"1 c gray95",
+"2 c #F2F0EE",
+"3 c #F1F1F1",
+"4 c #F0EFEF",
+"5 c #F0EFED",
+"6 c #F0EEED",
+"7 c #EFEFEF",
+"8 c #EFEEEE",
+"9 c #EDEAE7",
+"0 c #EDEAE6",
+"q c #E9E8E6",
+"w c #E8E7E5",
+"e c #E6E5E3",
+"r c #E1DED8",
+"t c gray86",
+"y c #D9D9D7",
+"u c gray81",
+"i c #CDCECF",
+"p c #CBC9C7",
+"a c #CAC8C5",
+"s c #C5C2BF",
+"d c #BEBAB5",
+"f c #BDC1C4",
+"g c #BCB9B5",
+"h c #BBB9B6",
+"j c gray71",
+"k c #AAA8A6",
+"l c #A7A7A7",
+"z c #A0A0A0",
+"x c #9F9F9F",
+"c c gray62",
+"v c #9D9D9D",
+"b c gray61",
+"n c gray60",
+"m c gray59",
+"M c #8F8B82",
+"N c #888785",
+"B c #7E7E7F",
+"V c gray44",
+"C c #6F6F6F",
+"Z c #697382",
+"A c #677081",
+"S c #676661",
+"D c #666664",
+"F c #616162",
+"G c gray38",
+"H c #606973",
+"J c #60666B",
+"K c #5C6063",
+"L c #595856",
+"P c #585856",
+"I c #545351",
+"U c #514E48",
+"Y c #504B44",
+"T c #4F96FF",
+"R c #4F4F4E",
+"E c #4E97FF",
+"W c #4E96FF",
+"Q c #4E95FF",
+"! c #4E4D4C",
+"~ c #4D97FF",
+"^ c #4D90F2",
+"/ c #4D8DF0",
+"( c #4D4C4B",
+") c #4C96FF",
+"_ c #4C95FF",
+"` c #4C94FC",
+"' c #4C93FA",
+"] c #4C91F7",
+"[ c #4C8FF3",
+"{ c #4C8EEE",
+"} c #4B95FF",
+"| c #4B90F5",
+" . c #4B8FF4",
+".. c #4A92FB",
+"X. c #4A90F7",
+"o. c #4A8CF0",
+"O. c #4A89E9",
+"+. c #4990FA",
+"@. c #4990F9",
+"#. c #4986E2",
+"$. c #494847",
+"%. c #4890FB",
+"&. c #488EF6",
+"*. c #488BEF",
+"=. c #4888E8",
+"-. c #478BF1",
+";. c #474440",
+":. c #468FF9",
+">. c #4683E2",
+",. c #46484B",
+"<. c #464646",
+"1. c #4585E4",
+"2. c #434545",
+"3. c #4277CB",
+"4. c #4275C8",
+"5. c gray26",
+"6. c #414244",
+"7. c #414141",
+"8. c gray25",
+"9. c #40403F",
+"0. c #3F3F3F",
+"q. c #3E7AD3",
+"w. c #3E3E3E",
+"e. c #3E3E3D",
+"r. c #3D3B3A",
+"t. c #3C567B",
+"y. c #3C3731",
+"u. c #3B7CDB",
+"i. c #3B77D3",
+"p. c #3B6EBF",
+"a. c #3A75CB",
+"s. c #3A557B",
+"d. c #3977D6",
+"f. c #396CBC",
+"g. c #39393A",
+"h. c #3777D3",
+"j. c #376DC0",
+"k. c #373737",
+"l. c #3675D0",
+"z. c #353535",
+"x. c #346BB6",
+"c. c #3369B4",
+"v. c #333537",
+"b. c #325F9F",
+"n. c #305DA0",
+"m. c #2F4469",
+"M. c #2F445C",
+"N. c #2F3031",
+"B. c #2D5BA0",
+"V. c #2D3034",
+"C. c #2B599C",
+"Z. c #2A2A2D",
+"A. c #285293",
+"S. c #275296",
+"D. c #272726",
+"F. c #24477C",
+"G. c #242625",
+"H. c #21222C",
+"J. c #204373",
+"K. c #204178",
+"L. c #20212C",
+"P. c #1F467E",
+"I. c #1E1F29",
+"U. c #1B4073",
+"Y. c #183869",
+"T. c #18335D",
+"R. c #182A41",
+"E. c #18253E",
+"W. c #173767",
+"Q. c #14335F",
+"!. c #141D29",
+"~. c #131E2B",
+"^. c #131E2A",
+"/. c #131419",
+"(. c #122441",
+"). c #101B2A",
+"_. c #101625",
+"`. c #0F1A35",
+"'. c #0E2F5A",
+"]. c #0E0C0A",
+"[. c #0D1C33",
+"{. c #000E26",
+"}. c #000B1E",
+"|. c #00000A",
+" X c black",
+".X c black",
+"XX c black",
+"oX c black",
+"OX c black",
+"+X c black",
+"@X c black",
+"#X c black",
+"$X c black",
+"%X c black",
+"&X c black",
+"*X c black",
+"=X c black",
+"-X c black",
+";X c black",
+":X c black",
+">X c black",
+",X c black",
+"<X c black",
+"1X c black",
+"2X c black",
+"3X c black",
+"4X c black",
+"5X c black",
+"6X c black",
+"7X c black",
+"8X c black",
+"9X c black",
+"0X c black",
+"qX c black",
+"wX c black",
+"eX c black",
+"rX c black",
+"tX c black",
+"yX c black",
+"uX c black",
+"iX c black",
+"pX c black",
+"aX c black",
+"sX c black",
+"dX c black",
+"fX c black",
+"gX c black",
+"hX c black",
+"jX c black",
+"kX c black",
+"lX c black",
+"zX c black",
+"xX c black",
+"cX c black",
+"vX c black",
+"bX c black",
+"nX c black",
+"mX c black",
+"MX c black",
+"NX c black",
+"BX c black",
+"VX c black",
+"CX c black",
+"ZX c black",
+"AX c black",
+"SX c black",
+"DX c black",
+"FX c black",
+"GX c black",
+"HX c black",
+"JX c black",
+"KX c black",
+"LX c black",
+"PX c black",
+"IX c black",
+"UX c black",
+/* pixels */
+" ",
+" ",
+" j V & ",
+" m k.& ",
+" x 0.& ",
+" x ;.7 ",
+" & t y u x 0.& ",
+" 7 R 0.& L ].d x ;.& ",
+" 4 $. X0. S }.R.f x 0.7 ",
+" 9 ;.Y.F.Z.s p p d d y.'.i.m.u k ;.& ",
+" e 0.W.T x.!.!.!.!.`.`.E.b.T i.t.K R & ",
+" e ,.U.^ / { q.a.h.h.>.>.#./ { T u.M.$.7 ",
+" M {./ :.-.-.T T T T T T T :.-.-.:.t.Y & ",
+" 4 J S.^ :.{ a.j.p.p.B.C.B.3.T { J.D.I & ",
+" & A A.T x._.I.H.I.N.k./.U.T Q.R N ;.& ",
+" Z S.P.D.r 9 7 7 & S (.Q.;.# l 0.& ",
+" H |.Z.# S X;.7 x ;.7 ",
+" & L 0.# B S 7 x ;.& ",
+" & & x 0.& ",
+" x 0.& ",
+" m k.7 ",
+" j C & ",
+" ",
+" "
+};
--- /dev/null
+/* XPM */
+static char *gate_constraint_block[] = {
+/* columns rows colors chars-per-pixel */
+"24 24 256 2 ",
+" c None",
+". c #FFFFFE",
+"X c #FFFF95",
+"o c #FFFF8E",
+"O c #FFFF8D",
+"+ c #FFFF8C",
+"@ c #FDFDFE",
+"# c gray99",
+"$ c #FBFBFB",
+"% c #FBFAF9",
+"& c #F9F9F9",
+"* c #F9F8F8",
+"= c #F3F4F4",
+"- c #F3F3F3",
+"; c #F3F2F2",
+": c #F2F3F3",
+"> c #F2F2F4",
+", c gray95",
+"< c #F2F1F1",
+"1 c #F2F1F0",
+"2 c #F1F1F0",
+"3 c #F1F0F0",
+"4 c #ECECEC",
+"5 c #EBECEE",
+"6 c #EBEAEA",
+"7 c #E6E6E6",
+"8 c #E6E6E5",
+"9 c #DDDDDD",
+"0 c gainsboro",
+"q c #D8D9D9",
+"w c #D7D6D6",
+"e c #D5D4D3",
+"r c gray81",
+"t c #CED0D0",
+"y c #CDD0D2",
+"u c #CDCED2",
+"i c gray80",
+"p c #C9CACA",
+"a c gray79",
+"s c #C3C5C7",
+"d c #C1C7CD",
+"f c #BEBDBD",
+"g c #B7B4B4",
+"h c #B4B8BB",
+"j c #B2B8C2",
+"k c #A8A8A7",
+"l c #A7A7A7",
+"z c #A7A7A6",
+"x c #A7A6A6",
+"c c #A7A5A6",
+"v c #A6A8AA",
+"b c #A1A3A3",
+"n c #A1A0A4",
+"m c #A1A0A0",
+"M c #9FA1A1",
+"N c #9F9E9E",
+"B c #9D9E9E",
+"V c #9D9C64",
+"C c #9C9FA0",
+"Z c #9C9F9F",
+"A c #9C9E9E",
+"S c #9C9DA0",
+"D c #9C9C9D",
+"F c gray61",
+"G c #9C9C64",
+"H c #9C9B9F",
+"J c #9C9B9B",
+"K c #98989D",
+"L c #98989B",
+"P c #979B65",
+"I c #979964",
+"U c #979797",
+"Y c #969663",
+"T c #969661",
+"R c #949696",
+"E c #8F8E8D",
+"W c #8E9092",
+"Q c #8D9192",
+"! c #898989",
+"~ c #6C6E6E",
+"^ c #68686B",
+"/ c #676666",
+"( c #656E77",
+") c #656C71",
+"_ c #62666E",
+"` c #606060",
+"' c #5F646D",
+"] c #5F5F62",
+"[ c #555656",
+"{ c #515655",
+"} c #4B4D52",
+"| c #4B4B4D",
+" . c #4A4E4E",
+".. c #4A4C44",
+"X. c #4A4B4B",
+"o. c #47494C",
+"O. c #464949",
+"+. c #454646",
+"@. c #444B54",
+"#. c #444646",
+"$. c #43494B",
+"%. c #434847",
+"&. c #434646",
+"*. c #434545",
+"=. c #434447",
+"-. c #434444",
+";. c #434443",
+":. c #434344",
+">. c #434343",
+",. c #424747",
+"<. c #424444",
+"1. c #424343",
+"2. c #42423C",
+"3. c #414443",
+"4. c #40443B",
+"5. c #40423A",
+"6. c #40414B",
+"7. c #404048",
+"8. c #3F4343",
+"9. c #3F4141",
+"0. c #3F4041",
+"q. c #3F4040",
+"w. c #3F3F4B",
+"e. c #3F3F42",
+"r. c #3E4240",
+"t. c #3E3E40",
+"y. c #3E3E3E",
+"u. c #3C4047",
+"i. c #3C3F40",
+"p. c #3C3C3E",
+"a. c #3B4044",
+"s. c #3B3E3D",
+"d. c #3A4148",
+"f. c #393A3A",
+"g. c #39383D",
+"h. c #383B3B",
+"j. c #373D41",
+"k. c #373A3A",
+"l. c #37373D",
+"z. c #363339",
+"x. c #353939",
+"c. c #353733",
+"v. c #343834",
+"b. c #343736",
+"n. c #343638",
+"m. c #343437",
+"M. c #343434",
+"N. c #343433",
+"B. c #333840",
+"V. c #333636",
+"C. c #33353D",
+"Z. c #333437",
+"A. c #333434",
+"S. c #323434",
+"D. c #303232",
+"F. c gray17",
+"G. c #2A2A2A",
+"H. c #282E3C",
+"J. c #171D1E",
+"K. c #131B26",
+"L. c #0D1423",
+"P. c black",
+"I. c black",
+"U. c black",
+"Y. c black",
+"T. c black",
+"R. c black",
+"E. c black",
+"W. c black",
+"Q. c black",
+"!. c black",
+"~. c black",
+"^. c black",
+"/. c black",
+"(. c black",
+"). c black",
+"_. c black",
+"`. c black",
+"'. c black",
+"]. c black",
+"[. c black",
+"{. c black",
+"}. c black",
+"|. c black",
+" X c black",
+".X c black",
+"XX c black",
+"oX c black",
+"OX c black",
+"+X c black",
+"@X c black",
+"#X c black",
+"$X c black",
+"%X c black",
+"&X c black",
+"*X c black",
+"=X c black",
+"-X c black",
+";X c black",
+":X c black",
+">X c black",
+",X c black",
+"<X c black",
+"1X c black",
+"2X c black",
+"3X c black",
+"4X c black",
+"5X c black",
+"6X c black",
+"7X c black",
+"8X c black",
+"9X c black",
+"0X c black",
+"qX c black",
+"wX c black",
+"eX c black",
+"rX c black",
+"tX c black",
+"yX c black",
+"uX c black",
+"iX c black",
+"pX c black",
+"aX c black",
+"sX c black",
+"dX c black",
+"fX c black",
+"gX c black",
+"hX c black",
+"jX c black",
+"kX c black",
+"lX c black",
+"zX c black",
+"xX c black",
+"cX c black",
+"vX c black",
+"bX c black",
+"nX c black",
+"mX c black",
+"MX c black",
+"NX c black",
+"BX c black",
+"VX c black",
+"CX c black",
+"ZX c black",
+"AX c black",
+"SX c black",
+"DX c black",
+"FX c black",
+"GX c black",
+"HX c black",
+"JX c black",
+"KX c black",
+"LX c black",
+"PX c black",
+"IX c black",
+"UX c black",
+/* pixels */
+" ",
+" ",
+" ",
+" r 7 ",
+" = k.U ",
+" = 8.N ",
+" 9 4 4 = y.N ",
+" E / f o.4 = 8.N ",
+" = = = = = j L./ w J.( = = 8.N ",
+" l y.l.c.y.y.l h 8.H.} u t v c.c.~ 4 y.N ",
+" C c.Y V P c.l d d.8.o.8.l.j.j.+.+.c.~ 7 +.N ",
+" C 2.o X o ..' @.y.+.8.+.6.8.+.+.8.+.c._ e.N ",
+" N y.o X o 2.N U c.8.+.e.c.c.l.+.+.k.[ s +.N ",
+" N c.Y V Y c.C W l.y.[ M l E y.k.| w 8.N ",
+" l e.6.w.6.8.v W K.] 9 F.o.9 = 8.N ",
+" = = = = = ( | s F.r = 8.N ",
+" g 9 r = y.N ",
+" = 8.N ",
+" = c.U ",
+" C u ",
+" ",
+" ",
+" ",
+" "
+};
--- /dev/null
+/* XPM */
+static char *gate_constraint_process[] = {
+/* columns rows colors chars-per-pixel */
+"24 24 256 2 ",
+" c None",
+". c #FFFFFE",
+"X c #FFFF8D",
+"o c #FFFE8C",
+"O c #FFFD8B",
+"+ c #FFFD88",
+"@ c #FFF484",
+"# c #FFEF84",
+"$ c #FEFEFE",
+"% c #FEFDFD",
+"& c #FDFDFE",
+"* c #FCFCFD",
+"= c gray99",
+"- c #FBFBFB",
+"; c #FBFAF9",
+": c #F8F8F8",
+"> c #F6EA87",
+", c #F5E887",
+"< c #F4F4F4",
+"1 c #F3F3F3",
+"2 c #F2F2F4",
+"3 c gray95",
+"4 c #F2F1F2",
+"5 c #F2E88A",
+"6 c gray94",
+"7 c #EEEFEE",
+"8 c #EEEEEE",
+"9 c #ECECEC",
+"0 c #EBECEE",
+"q c #EBEAEA",
+"w c #EAEAEA",
+"e c #E6E6E6",
+"r c #E6E6E5",
+"t c #E4E4E4",
+"y c #E1E0E2",
+"u c #DDDDDD",
+"i c gainsboro",
+"p c #D8D8D8",
+"a c #D6D6D7",
+"s c #D5D4D3",
+"d c #D0D1D4",
+"f c #D0D0D0",
+"g c gray81",
+"h c #CDCED2",
+"j c #CDC071",
+"k c #CCD0D3",
+"l c gray80",
+"z c #CBCACD",
+"x c #C9CACA",
+"c c gray79",
+"v c #C5C5C7",
+"b c #C5BC6D",
+"n c #C1B669",
+"m c #BEBDBD",
+"M c #BCB26C",
+"N c #B7B4B4",
+"B c #B4BABE",
+"V c #B3B7BC",
+"C c #B2B9C2",
+"Z c #AFA462",
+"A c #ABACB0",
+"S c #A5A7A9",
+"D c gray64",
+"F c #A2A2A2",
+"G c gray63",
+"H c #A19A5F",
+"J c #A0A0A0",
+"K c #A09F9F",
+"L c #9F9F9F",
+"P c gray62",
+"I c gray61",
+"U c #9B9FA4",
+"Y c #9B9B9B",
+"T c #9A9A9D",
+"R c #979797",
+"E c gray59",
+"W c #9595A2",
+"Q c #909393",
+"! c #8F9392",
+"~ c #8F8E8D",
+"^ c #8E8C8A",
+"/ c #88898B",
+"( c #888888",
+") c gray53",
+"_ c #848588",
+"` c #7F7F7B",
+"' c #7C754C",
+"] c #78724D",
+"[ c #757579",
+"{ c #716A46",
+"} c #6F6945",
+"| c gray43",
+" . c #68686B",
+".. c #666F77",
+"X. c gray40",
+"o. c #666563",
+"O. c #656C71",
+"+. c #63666E",
+"@. c #63615D",
+"#. c #606166",
+"$. c #606060",
+"%. c #5F5F62",
+"&. c #5E6383",
+"*. c #5E583C",
+"=. c #58533E",
+"-. c #57585D",
+";. c #545354",
+":. c #535353",
+">. c #4E5157",
+",. c gray30",
+"<. c #4C4A3C",
+"1. c #4B4B4D",
+"2. c #4A4E4E",
+"3. c #4A4D52",
+"4. c #494949",
+"5. c #484848",
+"6. c #47494C",
+"7. c #47482D",
+"8. c #464A4B",
+"9. c #46474B",
+"0. c #46464A",
+"q. c #464646",
+"w. c #464545",
+"e. c #464544",
+"r. c #454747",
+"t. c #454544",
+"y. c #444545",
+"u. c #444544",
+"i. c #444444",
+"p. c #444343",
+"a. c #434343",
+"s. c #434243",
+"d. c #43423A",
+"f. c #414246",
+"g. c #414142",
+"h. c #414141",
+"j. c gray25",
+"k. c #403F41",
+"l. c #3F3F3F",
+"z. c #3E424A",
+"x. c #3E4244",
+"c. c #3E3F40",
+"v. c #3E3E3E",
+"b. c #3E3D3D",
+"n. c #3D4047",
+"m. c #3D3932",
+"M. c gray23",
+"N. c #3A3D41",
+"B. c #3A3C3E",
+"V. c #3A3A3A",
+"C. c #393939",
+"Z. c gray22",
+"A. c #373939",
+"S. c #373736",
+"D. c #363838",
+"F. c #363638",
+"G. c #343538",
+"H. c #343434",
+"J. c #343433",
+"K. c #33393E",
+"L. c #33353D",
+"P. c #323232",
+"I. c gray17",
+"U. c #2A2A2A",
+"Y. c #29303C",
+"T. c #171C1D",
+"R. c #111924",
+"E. c #0D1523",
+"W. c black",
+"Q. c black",
+"!. c black",
+"~. c black",
+"^. c black",
+"/. c black",
+"(. c black",
+"). c black",
+"_. c black",
+"`. c black",
+"'. c black",
+"]. c black",
+"[. c black",
+"{. c black",
+"}. c black",
+"|. c black",
+" X c black",
+".X c black",
+"XX c black",
+"oX c black",
+"OX c black",
+"+X c black",
+"@X c black",
+"#X c black",
+"$X c black",
+"%X c black",
+"&X c black",
+"*X c black",
+"=X c black",
+"-X c black",
+";X c black",
+":X c black",
+">X c black",
+",X c black",
+"<X c black",
+"1X c black",
+"2X c black",
+"3X c black",
+"4X c black",
+"5X c black",
+"6X c black",
+"7X c black",
+"8X c black",
+"9X c black",
+"0X c black",
+"qX c black",
+"wX c black",
+"eX c black",
+"rX c black",
+"tX c black",
+"yX c black",
+"uX c black",
+"iX c black",
+"pX c black",
+"aX c black",
+"sX c black",
+"dX c black",
+"fX c black",
+"gX c black",
+"hX c black",
+"jX c black",
+"kX c black",
+"lX c black",
+"zX c black",
+"xX c black",
+"cX c black",
+"vX c black",
+"bX c black",
+"nX c black",
+"mX c black",
+"MX c black",
+"NX c black",
+"BX c black",
+"VX c black",
+"CX c black",
+"ZX c black",
+"AX c black",
+"SX c black",
+"DX c black",
+"FX c black",
+"GX c black",
+"HX c black",
+"JX c black",
+"KX c black",
+"LX c black",
+"PX c black",
+"IX c black",
+"UX c black",
+/* pixels */
+" ",
+" ",
+" ",
+" g e ",
+" < l.R ",
+" < l.L ",
+" u 7 7 < q.L ",
+" ~ X. m 9.7 < l.L ",
+" 7 U &.W 7 C E.X. a T...< < q.L ",
+" e @.} ' =.X.e V x.Y.3.h k D F.S.+.7 l.L ",
+" [ { > X > ' _ B z.k.6.z.F.c.c.q.q.m.| e q.L ",
+"7 x.M X # X M -.>.l.q.q.q.q.q.q.q.q.9.S.+.l.L ",
+"7 9.H X @ X Z X.) A.q.q.c.F.S.F.q.q.l.;.v q.D ",
+" ~ 7.b 5 j =.L R S.l.;.D U _ x.S.,.a l.L ",
+" 7 ` m.<.d.~ < ! E.%. u I.,.a < q.L ",
+" g A a ..,. g I.g < l.L ",
+" N u g < l.L ",
+" < q.L ",
+" < I.R ",
+" K a ",
+" ",
+" ",
+" ",
+" "
+};
--- /dev/null
+/* XPM */
+static char *gate_constraint_service[] = {
+/* columns rows colors chars-per-pixel */
+"24 24 256 2 ",
+" c None",
+". c #FFFEFF",
+"X c #FFFC85",
+"o c #FFFA81",
+"O c #FFF380",
+"+ c #FFF179",
+"@ c #FFEF7D",
+"# c #FDFDFD",
+"$ c #FCFCFF",
+"% c gray99",
+"& c gray98",
+"* c #FAF9FF",
+"= c #F9F9F8",
+"- c #F8F9FB",
+"; c #F8E472",
+": c gray97",
+"> c #F6F6F7",
+", c #F5F5FE",
+"< c #F4F5FE",
+"1 c #F3F3F4",
+"2 c #F3F3F3",
+"3 c #F3F3F2",
+"4 c #F2F2F3",
+"5 c gray95",
+"6 c #F2DD70",
+"7 c #F1E879",
+"8 c #F0F2F5",
+"9 c #F0F0F2",
+"0 c #EFEFEF",
+"q c #ECEDF4",
+"w c #ECD96C",
+"e c #EAEAEF",
+"r c gray91",
+"t c #E7E7E7",
+"y c #E6E7E8",
+"u c #E6E6E6",
+"i c #E5E5E7",
+"p c #E4E5E6",
+"a c #E1E2E5",
+"s c #E0E1E6",
+"d c #E0E0E1",
+"f c #DFE1E3",
+"g c #DEDFE5",
+"h c gray87",
+"j c #DCCC68",
+"k c #DCC55D",
+"l c #D8CE6A",
+"z c #D5D3D5",
+"x c gray81",
+"c c #CFB762",
+"v c #CECED0",
+"b c #CDCDCD",
+"n c #CBC565",
+"m c #CAC8C9",
+"M c #C6C6C6",
+"N c #C5C5C8",
+"B c #C5C5C5",
+"V c #C2C2C4",
+"C c #C1C0C2",
+"Z c #C0C0C0",
+"A c #BEBAB8",
+"S c #BBAE64",
+"D c #B8B4B2",
+"F c #B7B8B8",
+"G c #B7B6B2",
+"H c #B6B0B2",
+"J c #B4B4B4",
+"K c #B4A261",
+"L c #B1A164",
+"P c #B0A694",
+"I c #AFA99D",
+"U c #AEAEAE",
+"Y c #AD9F70",
+"T c #ABADAE",
+"R c gray67",
+"E c #A6997F",
+"W c #9F9FA1",
+"Q c #9F9FA0",
+"! c #9E9EA1",
+"~ c #9D9373",
+"^ c #9C9C9F",
+"/ c #9C9C9E",
+"( c gray61",
+") c #9C9C9B",
+"_ c #999380",
+"` c #989899",
+"' c #98959A",
+"] c #979797",
+"[ c #978A6F",
+"{ c #959595",
+"} c #949496",
+"| c gray58",
+" . c #948C6B",
+".. c #94865C",
+"X. c #918666",
+"o. c #909094",
+"O. c #8F8B95",
+"+. c #8B8C8E",
+"@. c #857D93",
+"#. c #747A7E",
+"$. c #73757A",
+"%. c #6D6D6C",
+"&. c #6C757F",
+"*. c #646568",
+"=. c #616469",
+"-. c #5E5E5F",
+";. c #5C6066",
+":. c #55595A",
+">. c #52545D",
+",. c #4E4F51",
+"<. c #454548",
+"1. c #444448",
+"2. c #444447",
+"3. c #434349",
+"4. c #434344",
+"5. c #434343",
+"6. c gray26",
+"7. c #424143",
+"8. c #414141",
+"9. c #414047",
+"0. c #414041",
+"q. c #414040",
+"w. c #404042",
+"e. c gray25",
+"r. c #403F43",
+"t. c #3F3F43",
+"y. c #3F3F41",
+"u. c #3F3F40",
+"i. c #3F3F3F",
+"p. c #3D3D3F",
+"a. c #3B3B3E",
+"s. c #393938",
+"d. c #39383E",
+"f. c #373838",
+"g. c #36383B",
+"h. c #353539",
+"j. c #343638",
+"k. c #333332",
+"l. c #323236",
+"z. c #313131",
+"x. c #30333B",
+"c. c #303032",
+"v. c #2C2F31",
+"b. c #29292D",
+"n. c #252828",
+"m. c #171920",
+"M. c #0D1720",
+"N. c black",
+"B. c black",
+"V. c black",
+"C. c black",
+"Z. c black",
+"A. c black",
+"S. c black",
+"D. c black",
+"F. c black",
+"G. c black",
+"H. c black",
+"J. c black",
+"K. c black",
+"L. c black",
+"P. c black",
+"I. c black",
+"U. c black",
+"Y. c black",
+"T. c black",
+"R. c black",
+"E. c black",
+"W. c black",
+"Q. c black",
+"!. c black",
+"~. c black",
+"^. c black",
+"/. c black",
+"(. c black",
+"). c black",
+"_. c black",
+"`. c black",
+"'. c black",
+"]. c black",
+"[. c black",
+"{. c black",
+"}. c black",
+"|. c black",
+" X c black",
+".X c black",
+"XX c black",
+"oX c black",
+"OX c black",
+"+X c black",
+"@X c black",
+"#X c black",
+"$X c black",
+"%X c black",
+"&X c black",
+"*X c black",
+"=X c black",
+"-X c black",
+";X c black",
+":X c black",
+">X c black",
+",X c black",
+"<X c black",
+"1X c black",
+"2X c black",
+"3X c black",
+"4X c black",
+"5X c black",
+"6X c black",
+"7X c black",
+"8X c black",
+"9X c black",
+"0X c black",
+"qX c black",
+"wX c black",
+"eX c black",
+"rX c black",
+"tX c black",
+"yX c black",
+"uX c black",
+"iX c black",
+"pX c black",
+"aX c black",
+"sX c black",
+"dX c black",
+"fX c black",
+"gX c black",
+"hX c black",
+"jX c black",
+"kX c black",
+"lX c black",
+"zX c black",
+"xX c black",
+"cX c black",
+"vX c black",
+"bX c black",
+"nX c black",
+"mX c black",
+"MX c black",
+"NX c black",
+"BX c black",
+"VX c black",
+"CX c black",
+"ZX c black",
+"AX c black",
+"SX c black",
+"DX c black",
+"FX c black",
+"GX c black",
+"HX c black",
+"JX c black",
+"KX c black",
+"LX c black",
+"PX c black",
+"IX c black",
+"UX c black",
+/* pixels */
+" ",
+" ",
+" ",
+" x t ",
+" : k.' ",
+" : t.^ ",
+" : i.^ ",
+" t t h 0 : i.^ ",
+" t 0 t ,.M G >.t : t.^ ",
+" N ~ E z : &.M.A D n.;.0 i.^ ",
+" f P K 6 w K I t : &.h.t.*.#.*.<.k.%.h 2.^ ",
+" F ..k + @ O X j X.>.k.t.<.h.v.f.2.<.k.-.i.^ ",
+" N [ c ; O X 7 S _ +.r.i.<.t.t.t.2.i.2.O.i.W ",
+" q D Y j n [ G , U r.k.] G ] i.i.I , 2.^ ",
+" t O.@.g U m.A x n.^ : t.^ ",
+" , , ' N M ' : i.^ ",
+" : i.^ ",
+" : t.^ ",
+" : v.] ",
+" : W x ",
+" ",
+" ",
+" ",
+" "
+};
--- /dev/null
+/* XPM */
+static char *hg_exam[] = {
+/* columns rows colors chars-per-pixel */
+"18 13 256 2 ",
+" c white",
+". c gray80",
+"X c gray60",
+"o c gray40",
+"O c gray20",
+"+ c black",
+"@ c red",
+"# c #CC0000",
+"$ c #990000",
+"% c #660000",
+"& c #330000",
+"* c None",
+"= c #00CC00",
+"- c #009900",
+"; c #006600",
+": c #003300",
+"> c #000033",
+", c #000066",
+"< c #000099",
+"1 c #0000CC",
+"2 c blue",
+"3 c cyan",
+"4 c #33FFFF",
+"5 c #66FFFF",
+"6 c #99FFFF",
+"7 c #CCFFFF",
+"8 c magenta",
+"9 c #FF33FF",
+"0 c #FF66FF",
+"q c #FF99FF",
+"w c #FFCCFF",
+"e c yellow",
+"r c #FFFF33",
+"t c #FFFF66",
+"y c #FFFF99",
+"u c #FFFFCC",
+"i c #003333",
+"p c #003366",
+"a c #003399",
+"s c #0033CC",
+"d c #0033FF",
+"f c #006633",
+"g c #006666",
+"h c #006699",
+"j c #0066CC",
+"k c #0066FF",
+"l c #009933",
+"z c #009966",
+"x c #009999",
+"c c #0099CC",
+"v c #0099FF",
+"b c #00CC33",
+"n c #00CC66",
+"m c #00CC99",
+"M c #00CCCC",
+"N c #00CCFF",
+"B c #00FF33",
+"V c #00FF66",
+"C c #00FF99",
+"Z c #00FFCC",
+"A c #330033",
+"S c #330066",
+"D c #330099",
+"F c #3300CC",
+"G c #3300FF",
+"H c #333300",
+"J c #333366",
+"K c #333399",
+"L c #3333CC",
+"P c #3333FF",
+"I c #336600",
+"U c #336633",
+"Y c #336666",
+"T c #336699",
+"R c #3366CC",
+"E c #3366FF",
+"W c #339900",
+"Q c #339933",
+"! c #339966",
+"~ c #339999",
+"^ c #3399CC",
+"/ c #3399FF",
+"( c #33CC00",
+") c #33CC33",
+"_ c #33CC66",
+"` c #33CC99",
+"' c #33CCCC",
+"] c #33CCFF",
+"[ c #33FF00",
+"{ c #33FF33",
+"} c #33FF66",
+"| c #33FF99",
+" . c #33FFCC",
+".. c #660033",
+"X. c #660066",
+"o. c #660099",
+"O. c #6600CC",
+"+. c #6600FF",
+"@. c #663300",
+"#. c #663333",
+"$. c #663366",
+"%. c #663399",
+"&. c #6633CC",
+"*. c #6633FF",
+"=. c #666600",
+"-. c #666633",
+";. c #666699",
+":. c #6666CC",
+">. c #6666FF",
+",. c #669900",
+"<. c #669933",
+"1. c #669966",
+"2. c #669999",
+"3. c #6699CC",
+"4. c #6699FF",
+"5. c #66CC00",
+"6. c #66CC33",
+"7. c #66CC66",
+"8. c #66CC99",
+"9. c #66CCCC",
+"0. c #66CCFF",
+"q. c #66FF00",
+"w. c #66FF33",
+"e. c #66FF66",
+"r. c #66FF99",
+"t. c #66FFCC",
+"y. c #990033",
+"u. c #990066",
+"i. c #990099",
+"p. c #9900CC",
+"a. c #9900FF",
+"s. c #993300",
+"d. c #993333",
+"f. c #993366",
+"g. c #993399",
+"h. c #9933CC",
+"j. c #9933FF",
+"k. c #996600",
+"l. c #996633",
+"z. c #996666",
+"x. c #996699",
+"c. c #9966CC",
+"v. c #9966FF",
+"b. c #999900",
+"n. c #999933",
+"m. c #999966",
+"M. c #9999CC",
+"N. c #9999FF",
+"B. c #99CC00",
+"V. c #99CC33",
+"C. c #99CC66",
+"Z. c #99CC99",
+"A. c #99CCCC",
+"S. c #99CCFF",
+"D. c #99FF00",
+"F. c #99FF33",
+"G. c #99FF66",
+"H. c #99FF99",
+"J. c #99FFCC",
+"K. c #CC0033",
+"L. c #CC0066",
+"P. c #CC0099",
+"I. c #CC00CC",
+"U. c #CC00FF",
+"Y. c #CC3300",
+"T. c #CC3333",
+"R. c #CC3366",
+"E. c #CC3399",
+"W. c #CC33CC",
+"Q. c #CC33FF",
+"!. c #CC6600",
+"~. c #CC6633",
+"^. c #CC6666",
+"/. c #CC6699",
+"(. c #CC66CC",
+"). c #CC66FF",
+"_. c #CC9900",
+"`. c #CC9933",
+"'. c #CC9966",
+"]. c #CC9999",
+"[. c #CC99CC",
+"{. c #CC99FF",
+"}. c #CCCC00",
+"|. c #CCCC33",
+" X c #CCCC66",
+".X c #CCCC99",
+"XX c #CCCCFF",
+"oX c #CCFF00",
+"OX c #CCFF33",
+"+X c #CCFF66",
+"@X c #CCFF99",
+"#X c #CCFFCC",
+"$X c #CCFFFF",
+"%X c #FF0033",
+"&X c #FF0066",
+"*X c #FF0099",
+"=X c #FF00CC",
+"-X c #FF3300",
+";X c #FF3333",
+":X c #FF3366",
+">X c #FF3399",
+",X c #FF33CC",
+"<X c #FF6600",
+"1X c #FF6633",
+"2X c #FF6666",
+"3X c #FF6699",
+"4X c #FF66CC",
+"5X c #FF9900",
+"6X c #FF9933",
+"7X c #FF9966",
+"8X c #FF9999",
+"9X c #FF99CC",
+"0X c #FFCC00",
+"qX c #FFCC33",
+"wX c #FFCC66",
+"eX c #FFCC99",
+"rX c #FFCCCC",
+"tX c #FFCCCC",
+"yX c #FFCCCC",
+"uX c #FFCCCC",
+"iX c #FFCCCC",
+"pX c #FFCCCC",
+"aX c #FFCCCC",
+"sX c #FFCCCC",
+"dX c #FFCCCC",
+"fX c #FFCCCC",
+"gX c #FFCCCC",
+"hX c #FFCCCC",
+"jX c #FFCCCC",
+"kX c #FFCCCC",
+"lX c #FFCCCC",
+"zX c #FFCCCC",
+"xX c #FFCCCC",
+"cX c #FFCCCC",
+"vX c #FFCCCC",
+"bX c #FFCCCC",
+"nX c #FFCCCC",
+"mX c #FFCCCC",
+"MX c #FFCCCC",
+"NX c #FFCCCC",
+"BX c #FFCCCC",
+"VX c #FFCCCC",
+"CX c #FFCCCC",
+"ZX c #FFCCCC",
+"AX c #FFCCCC",
+"SX c #FFCCCC",
+"DX c #FFCCCC",
+"FX c #FFCCCC",
+"GX c #FFCCCC",
+"HX c #FFCCCC",
+"JX c #FFCCCC",
+"KX c #FFCCCC",
+"LX c #FFCCCC",
+"PX c #FFCCCC",
+"IX c #FFCCCC",
+"UX c #FFCCCC",
+/* pixels */
+"* * X * X X X X X * X * * * * * * * ",
+"* X * X wXy y y wXX * X * * * * * * ",
+"X * X wXu u u u u wXX * X * * * * * ",
+"* X wXy u u y wXX * * * * * * ",
+"X X wXu u u u wXX X * * * * * ",
+"* X wXy u u t wXX * * * * * * ",
+"X * X wXu u u u u wXX * X * * * * * ",
+"* X * X wXy y y wXX * X * * * * * * ",
+"* * X * .X. m.m.m.* X * * * * * * * ",
+"* * * * X M.. o * * * * * * * * * ",
+"* * * * X . .X;.* * * * * * * * * ",
+"* * * * * O O O * * * * * * * * * * ",
+"* * * * * X X X * * * * * * * * * * "
+};
--- /dev/null
+/* XPM */
+static char *hg_note[] = {
+/* columns rows colors chars-per-pixel */
+"18 13 256 2 ",
+" c white",
+". c gray80",
+"X c gray60",
+"o c gray40",
+"O c gray20",
+"+ c black",
+"@ c red",
+"# c #CC0000",
+"$ c #990000",
+"% c #660000",
+"& c #330000",
+"* c None",
+"= c #00CC00",
+"- c #009900",
+"; c #006600",
+": c #003300",
+"> c #000033",
+", c #000066",
+"< c #000099",
+"1 c #0000CC",
+"2 c blue",
+"3 c cyan",
+"4 c #33FFFF",
+"5 c #66FFFF",
+"6 c #99FFFF",
+"7 c #CCFFFF",
+"8 c magenta",
+"9 c #FF33FF",
+"0 c #FF66FF",
+"q c #FF99FF",
+"w c #FFCCFF",
+"e c yellow",
+"r c #FFFF33",
+"t c #FFFF66",
+"y c #FFFF99",
+"u c #FFFFCC",
+"i c #003333",
+"p c #003366",
+"a c #003399",
+"s c #0033CC",
+"d c #0033FF",
+"f c #006633",
+"g c #006666",
+"h c #006699",
+"j c #0066CC",
+"k c #0066FF",
+"l c #009933",
+"z c #009966",
+"x c #009999",
+"c c #0099CC",
+"v c #0099FF",
+"b c #00CC33",
+"n c #00CC66",
+"m c #00CC99",
+"M c #00CCCC",
+"N c #00CCFF",
+"B c #00FF33",
+"V c #00FF66",
+"C c #00FF99",
+"Z c #00FFCC",
+"A c #330033",
+"S c #330066",
+"D c #330099",
+"F c #3300CC",
+"G c #3300FF",
+"H c #333300",
+"J c #333366",
+"K c #333399",
+"L c #3333CC",
+"P c #3333FF",
+"I c #336600",
+"U c #336633",
+"Y c #336666",
+"T c #336699",
+"R c #3366CC",
+"E c #3366FF",
+"W c #339900",
+"Q c #339933",
+"! c #339966",
+"~ c #339999",
+"^ c #3399CC",
+"/ c #3399FF",
+"( c #33CC00",
+") c #33CC33",
+"_ c #33CC66",
+"` c #33CC99",
+"' c #33CCCC",
+"] c #33CCFF",
+"[ c #33FF00",
+"{ c #33FF33",
+"} c #33FF66",
+"| c #33FF99",
+" . c #33FFCC",
+".. c #660033",
+"X. c #660066",
+"o. c #660099",
+"O. c #6600CC",
+"+. c #6600FF",
+"@. c #663300",
+"#. c #663333",
+"$. c #663366",
+"%. c #663399",
+"&. c #6633CC",
+"*. c #6633FF",
+"=. c #666600",
+"-. c #666633",
+";. c #666699",
+":. c #6666CC",
+">. c #6666FF",
+",. c #669900",
+"<. c #669933",
+"1. c #669966",
+"2. c #669999",
+"3. c #6699CC",
+"4. c #6699FF",
+"5. c #66CC00",
+"6. c #66CC33",
+"7. c #66CC66",
+"8. c #66CC99",
+"9. c #66CCCC",
+"0. c #66CCFF",
+"q. c #66FF00",
+"w. c #66FF33",
+"e. c #66FF66",
+"r. c #66FF99",
+"t. c #66FFCC",
+"y. c #990033",
+"u. c #990066",
+"i. c #990099",
+"p. c #9900CC",
+"a. c #9900FF",
+"s. c #993300",
+"d. c #993333",
+"f. c #993366",
+"g. c #993399",
+"h. c #9933CC",
+"j. c #9933FF",
+"k. c #996600",
+"l. c #996633",
+"z. c #996666",
+"x. c #996699",
+"c. c #9966CC",
+"v. c #9966FF",
+"b. c #999900",
+"n. c #999933",
+"m. c #999966",
+"M. c #9999CC",
+"N. c #9999FF",
+"B. c #99CC00",
+"V. c #99CC33",
+"C. c #99CC66",
+"Z. c #99CC99",
+"A. c #99CCCC",
+"S. c #99CCFF",
+"D. c #99FF00",
+"F. c #99FF33",
+"G. c #99FF66",
+"H. c #99FF99",
+"J. c #99FFCC",
+"K. c #CC0033",
+"L. c #CC0066",
+"P. c #CC0099",
+"I. c #CC00CC",
+"U. c #CC00FF",
+"Y. c #CC3300",
+"T. c #CC3333",
+"R. c #CC3366",
+"E. c #CC3399",
+"W. c #CC33CC",
+"Q. c #CC33FF",
+"!. c #CC6600",
+"~. c #CC6633",
+"^. c #CC6666",
+"/. c #CC6699",
+"(. c #CC66CC",
+"). c #CC66FF",
+"_. c #CC9900",
+"`. c #CC9933",
+"'. c #CC9966",
+"]. c #CC9999",
+"[. c #CC99CC",
+"{. c #CC99FF",
+"}. c #CCCC00",
+"|. c #CCCC33",
+" X c #CCCC66",
+".X c #CCCC99",
+"XX c #CCCCFF",
+"oX c #CCFF00",
+"OX c #CCFF33",
+"+X c #CCFF66",
+"@X c #CCFF99",
+"#X c #CCFFCC",
+"$X c #CCFFFF",
+"%X c #FF0033",
+"&X c #FF0066",
+"*X c #FF0099",
+"=X c #FF00CC",
+"-X c #FF3300",
+";X c #FF3333",
+":X c #FF3366",
+">X c #FF3399",
+",X c #FF33CC",
+"<X c #FF6600",
+"1X c #FF6633",
+"2X c #FF6666",
+"3X c #FF6699",
+"4X c #FF66CC",
+"5X c #FF9900",
+"6X c #FF9933",
+"7X c #FF9966",
+"8X c #FF9999",
+"9X c #FF99CC",
+"0X c #FFCC00",
+"qX c #FFCC33",
+"wX c #FFCC66",
+"eX c #FFCC99",
+"rX c #FFCCCC",
+"tX c #FFCCCC",
+"yX c #FFCCCC",
+"uX c #FFCCCC",
+"iX c #FFCCCC",
+"pX c #FFCCCC",
+"aX c #FFCCCC",
+"sX c #FFCCCC",
+"dX c #FFCCCC",
+"fX c #FFCCCC",
+"gX c #FFCCCC",
+"hX c #FFCCCC",
+"jX c #FFCCCC",
+"kX c #FFCCCC",
+"lX c #FFCCCC",
+"zX c #FFCCCC",
+"xX c #FFCCCC",
+"cX c #FFCCCC",
+"vX c #FFCCCC",
+"bX c #FFCCCC",
+"nX c #FFCCCC",
+"mX c #FFCCCC",
+"MX c #FFCCCC",
+"NX c #FFCCCC",
+"BX c #FFCCCC",
+"VX c #FFCCCC",
+"CX c #FFCCCC",
+"ZX c #FFCCCC",
+"AX c #FFCCCC",
+"SX c #FFCCCC",
+"DX c #FFCCCC",
+"FX c #FFCCCC",
+"GX c #FFCCCC",
+"HX c #FFCCCC",
+"JX c #FFCCCC",
+"KX c #FFCCCC",
+"LX c #FFCCCC",
+"PX c #FFCCCC",
+"IX c #FFCCCC",
+"UX c #FFCCCC",
+/* pixels */
+"* * * * * * * * * * * * * * * * * * ",
+"* X s.d.`.t t t t t t t * * * * * * ",
+"* d. $ d.t y t y y t X* * * * * * ",
+"* #.# @ Y.y y y y y y m.* * * * * * ",
+"* '.s.s.].@Xy u u u y o * * * * * * ",
+"* .Xy y m.rXu u u u u o * * * * * * ",
+"* y t y u o . u u u u o * * * * * * ",
+"* .Xy y y u o u u .Xo * * * * * * ",
+"* y t y u .Xy u u u X o * * * * * * ",
+"* t y y .Xu u u u u o o * * * * * * ",
+"* t t X.Xu u .Xm.o o o * * * * * * ",
+"* t m.m.m.o o o o o o o * * * * * * ",
+"* * * * * * * * * * * * * * * * * * "
+};
--- /dev/null
+/* XPM */
+static char *hg_proc[] = {
+/* columns rows colors chars-per-pixel */
+"18 13 256 2 ",
+" c white",
+". c gray80",
+"X c gray60",
+"o c gray40",
+"O c gray20",
+"+ c black",
+"@ c red",
+"# c #CC0000",
+"$ c #990000",
+"% c #660000",
+"& c #330000",
+"* c None",
+"= c #00CC00",
+"- c #009900",
+"; c #006600",
+": c #003300",
+"> c #000033",
+", c #000066",
+"< c #000099",
+"1 c #0000CC",
+"2 c blue",
+"3 c cyan",
+"4 c #33FFFF",
+"5 c #66FFFF",
+"6 c #99FFFF",
+"7 c #CCFFFF",
+"8 c magenta",
+"9 c #FF33FF",
+"0 c #FF66FF",
+"q c #FF99FF",
+"w c #FFCCFF",
+"e c yellow",
+"r c #FFFF33",
+"t c #FFFF66",
+"y c #FFFF99",
+"u c #FFFFCC",
+"i c #003333",
+"p c #003366",
+"a c #003399",
+"s c #0033CC",
+"d c #0033FF",
+"f c #006633",
+"g c #006666",
+"h c #006699",
+"j c #0066CC",
+"k c #0066FF",
+"l c #009933",
+"z c #009966",
+"x c #009999",
+"c c #0099CC",
+"v c #0099FF",
+"b c #00CC33",
+"n c #00CC66",
+"m c #00CC99",
+"M c #00CCCC",
+"N c #00CCFF",
+"B c #00FF33",
+"V c #00FF66",
+"C c #00FF99",
+"Z c #00FFCC",
+"A c #330033",
+"S c #330066",
+"D c #330099",
+"F c #3300CC",
+"G c #3300FF",
+"H c #333300",
+"J c #333366",
+"K c #333399",
+"L c #3333CC",
+"P c #3333FF",
+"I c #336600",
+"U c #336633",
+"Y c #336666",
+"T c #336699",
+"R c #3366CC",
+"E c #3366FF",
+"W c #339900",
+"Q c #339933",
+"! c #339966",
+"~ c #339999",
+"^ c #3399CC",
+"/ c #3399FF",
+"( c #33CC00",
+") c #33CC33",
+"_ c #33CC66",
+"` c #33CC99",
+"' c #33CCCC",
+"] c #33CCFF",
+"[ c #33FF00",
+"{ c #33FF33",
+"} c #33FF66",
+"| c #33FF99",
+" . c #33FFCC",
+".. c #660033",
+"X. c #660066",
+"o. c #660099",
+"O. c #6600CC",
+"+. c #6600FF",
+"@. c #663300",
+"#. c #663333",
+"$. c #663366",
+"%. c #663399",
+"&. c #6633CC",
+"*. c #6633FF",
+"=. c #666600",
+"-. c #666633",
+";. c #666699",
+":. c #6666CC",
+">. c #6666FF",
+",. c #669900",
+"<. c #669933",
+"1. c #669966",
+"2. c #669999",
+"3. c #6699CC",
+"4. c #6699FF",
+"5. c #66CC00",
+"6. c #66CC33",
+"7. c #66CC66",
+"8. c #66CC99",
+"9. c #66CCCC",
+"0. c #66CCFF",
+"q. c #66FF00",
+"w. c #66FF33",
+"e. c #66FF66",
+"r. c #66FF99",
+"t. c #66FFCC",
+"y. c #990033",
+"u. c #990066",
+"i. c #990099",
+"p. c #9900CC",
+"a. c #9900FF",
+"s. c #993300",
+"d. c #993333",
+"f. c #993366",
+"g. c #993399",
+"h. c #9933CC",
+"j. c #9933FF",
+"k. c #996600",
+"l. c #996633",
+"z. c #996666",
+"x. c #996699",
+"c. c #9966CC",
+"v. c #9966FF",
+"b. c #999900",
+"n. c #999933",
+"m. c #999966",
+"M. c #9999CC",
+"N. c #9999FF",
+"B. c #99CC00",
+"V. c #99CC33",
+"C. c #99CC66",
+"Z. c #99CC99",
+"A. c #99CCCC",
+"S. c #99CCFF",
+"D. c #99FF00",
+"F. c #99FF33",
+"G. c #99FF66",
+"H. c #99FF99",
+"J. c #99FFCC",
+"K. c #CC0033",
+"L. c #CC0066",
+"P. c #CC0099",
+"I. c #CC00CC",
+"U. c #CC00FF",
+"Y. c #CC3300",
+"T. c #CC3333",
+"R. c #CC3366",
+"E. c #CC3399",
+"W. c #CC33CC",
+"Q. c #CC33FF",
+"!. c #CC6600",
+"~. c #CC6633",
+"^. c #CC6666",
+"/. c #CC6699",
+"(. c #CC66CC",
+"). c #CC66FF",
+"_. c #CC9900",
+"`. c #CC9933",
+"'. c #CC9966",
+"]. c #CC9999",
+"[. c #CC99CC",
+"{. c #CC99FF",
+"}. c #CCCC00",
+"|. c #CCCC33",
+" X c #CCCC66",
+".X c #CCCC99",
+"XX c #CCCCFF",
+"oX c #CCFF00",
+"OX c #CCFF33",
+"+X c #CCFF66",
+"@X c #CCFF99",
+"#X c #CCFFCC",
+"$X c #CCFFFF",
+"%X c #FF0033",
+"&X c #FF0066",
+"*X c #FF0099",
+"=X c #FF00CC",
+"-X c #FF3300",
+";X c #FF3333",
+":X c #FF3366",
+">X c #FF3399",
+",X c #FF33CC",
+"<X c #FF6600",
+"1X c #FF6633",
+"2X c #FF6666",
+"3X c #FF6699",
+"4X c #FF66CC",
+"5X c #FF9900",
+"6X c #FF9933",
+"7X c #FF9966",
+"8X c #FF9999",
+"9X c #FF99CC",
+"0X c #FFCC00",
+"qX c #FFCC33",
+"wX c #FFCC66",
+"eX c #FFCC99",
+"rX c #FFCCCC",
+"tX c #FFCCCC",
+"yX c #FFCCCC",
+"uX c #FFCCCC",
+"iX c #FFCCCC",
+"pX c #FFCCCC",
+"aX c #FFCCCC",
+"sX c #FFCCCC",
+"dX c #FFCCCC",
+"fX c #FFCCCC",
+"gX c #FFCCCC",
+"hX c #FFCCCC",
+"jX c #FFCCCC",
+"kX c #FFCCCC",
+"lX c #FFCCCC",
+"zX c #FFCCCC",
+"xX c #FFCCCC",
+"cX c #FFCCCC",
+"vX c #FFCCCC",
+"bX c #FFCCCC",
+"nX c #FFCCCC",
+"mX c #FFCCCC",
+"MX c #FFCCCC",
+"NX c #FFCCCC",
+"BX c #FFCCCC",
+"VX c #FFCCCC",
+"CX c #FFCCCC",
+"ZX c #FFCCCC",
+"AX c #FFCCCC",
+"SX c #FFCCCC",
+"DX c #FFCCCC",
+"FX c #FFCCCC",
+"GX c #FFCCCC",
+"HX c #FFCCCC",
+"JX c #FFCCCC",
+"KX c #FFCCCC",
+"LX c #FFCCCC",
+"PX c #FFCCCC",
+"IX c #FFCCCC",
+"UX c #FFCCCC",
+/* pixels */
+"* * * * * * * * * * * * * * * * * * ",
+"* 7 * * * * * * * * * * * * * * * * ",
+"* 7 v 7 * * * * * * * * * * * * * * ",
+"* 7 k k v 7 * * * * * * * * * * * * ",
+"* 7 k k k k v 7 * * * * * * * * * * ",
+"* 7 k k k k k k v 7 * * * * * * * * ",
+"* 7 k k k k k k k h v 7 * * * * * * ",
+"* 7 k k k k k h D D *.* * * * * * * ",
+"* 7 k k k h D D *.* * * * * * * * * ",
+"* 7 k h D D *.* * * * * * * * * * * ",
+"* 7 D D *.* * * * * * * * * * * * * ",
+"* 7 *.* * * * * * * * * * * * * * * ",
+"* * * * * * * * * * * * * * * * * * "
+};
--- /dev/null
+/* XPM */
+static char *hg_see[] = {
+/* columns rows colors chars-per-pixel */
+"18 13 256 2 ",
+" c white",
+". c gray80",
+"X c gray60",
+"o c gray40",
+"O c gray20",
+"+ c black",
+"@ c red",
+"# c #CC0000",
+"$ c #990000",
+"% c #660000",
+"& c #330000",
+"* c None",
+"= c #00CC00",
+"- c #009900",
+"; c #006600",
+": c #003300",
+"> c #000033",
+", c #000066",
+"< c #000099",
+"1 c #0000CC",
+"2 c blue",
+"3 c cyan",
+"4 c #33FFFF",
+"5 c #66FFFF",
+"6 c #99FFFF",
+"7 c #CCFFFF",
+"8 c magenta",
+"9 c #FF33FF",
+"0 c #FF66FF",
+"q c #FF99FF",
+"w c #FFCCFF",
+"e c yellow",
+"r c #FFFF33",
+"t c #FFFF66",
+"y c #FFFF99",
+"u c #FFFFCC",
+"i c #003333",
+"p c #003366",
+"a c #003399",
+"s c #0033CC",
+"d c #0033FF",
+"f c #006633",
+"g c #006666",
+"h c #006699",
+"j c #0066CC",
+"k c #0066FF",
+"l c #009933",
+"z c #009966",
+"x c #009999",
+"c c #0099CC",
+"v c #0099FF",
+"b c #00CC33",
+"n c #00CC66",
+"m c #00CC99",
+"M c #00CCCC",
+"N c #00CCFF",
+"B c #00FF33",
+"V c #00FF66",
+"C c #00FF99",
+"Z c #00FFCC",
+"A c #330033",
+"S c #330066",
+"D c #330099",
+"F c #3300CC",
+"G c #3300FF",
+"H c #333300",
+"J c #333366",
+"K c #333399",
+"L c #3333CC",
+"P c #3333FF",
+"I c #336600",
+"U c #336633",
+"Y c #336666",
+"T c #336699",
+"R c #3366CC",
+"E c #3366FF",
+"W c #339900",
+"Q c #339933",
+"! c #339966",
+"~ c #339999",
+"^ c #3399CC",
+"/ c #3399FF",
+"( c #33CC00",
+") c #33CC33",
+"_ c #33CC66",
+"` c #33CC99",
+"' c #33CCCC",
+"] c #33CCFF",
+"[ c #33FF00",
+"{ c #33FF33",
+"} c #33FF66",
+"| c #33FF99",
+" . c #33FFCC",
+".. c #660033",
+"X. c #660066",
+"o. c #660099",
+"O. c #6600CC",
+"+. c #6600FF",
+"@. c #663300",
+"#. c #663333",
+"$. c #663366",
+"%. c #663399",
+"&. c #6633CC",
+"*. c #6633FF",
+"=. c #666600",
+"-. c #666633",
+";. c #666699",
+":. c #6666CC",
+">. c #6666FF",
+",. c #669900",
+"<. c #669933",
+"1. c #669966",
+"2. c #669999",
+"3. c #6699CC",
+"4. c #6699FF",
+"5. c #66CC00",
+"6. c #66CC33",
+"7. c #66CC66",
+"8. c #66CC99",
+"9. c #66CCCC",
+"0. c #66CCFF",
+"q. c #66FF00",
+"w. c #66FF33",
+"e. c #66FF66",
+"r. c #66FF99",
+"t. c #66FFCC",
+"y. c #990033",
+"u. c #990066",
+"i. c #990099",
+"p. c #9900CC",
+"a. c #9900FF",
+"s. c #993300",
+"d. c #993333",
+"f. c #993366",
+"g. c #993399",
+"h. c #9933CC",
+"j. c #9933FF",
+"k. c #996600",
+"l. c #996633",
+"z. c #996666",
+"x. c #996699",
+"c. c #9966CC",
+"v. c #9966FF",
+"b. c #999900",
+"n. c #999933",
+"m. c #999966",
+"M. c #9999CC",
+"N. c #9999FF",
+"B. c #99CC00",
+"V. c #99CC33",
+"C. c #99CC66",
+"Z. c #99CC99",
+"A. c #99CCCC",
+"S. c #99CCFF",
+"D. c #99FF00",
+"F. c #99FF33",
+"G. c #99FF66",
+"H. c #99FF99",
+"J. c #99FFCC",
+"K. c #CC0033",
+"L. c #CC0066",
+"P. c #CC0099",
+"I. c #CC00CC",
+"U. c #CC00FF",
+"Y. c #CC3300",
+"T. c #CC3333",
+"R. c #CC3366",
+"E. c #CC3399",
+"W. c #CC33CC",
+"Q. c #CC33FF",
+"!. c #CC6600",
+"~. c #CC6633",
+"^. c #CC6666",
+"/. c #CC6699",
+"(. c #CC66CC",
+"). c #CC66FF",
+"_. c #CC9900",
+"`. c #CC9933",
+"'. c #CC9966",
+"]. c #CC9999",
+"[. c #CC99CC",
+"{. c #CC99FF",
+"}. c #CCCC00",
+"|. c #CCCC33",
+" X c #CCCC66",
+".X c #CCCC99",
+"XX c #CCCCFF",
+"oX c #CCFF00",
+"OX c #CCFF33",
+"+X c #CCFF66",
+"@X c #CCFF99",
+"#X c #CCFFCC",
+"$X c #CCFFFF",
+"%X c #FF0033",
+"&X c #FF0066",
+"*X c #FF0099",
+"=X c #FF00CC",
+"-X c #FF3300",
+";X c #FF3333",
+":X c #FF3366",
+">X c #FF3399",
+",X c #FF33CC",
+"<X c #FF6600",
+"1X c #FF6633",
+"2X c #FF6666",
+"3X c #FF6699",
+"4X c #FF66CC",
+"5X c #FF9900",
+"6X c #FF9933",
+"7X c #FF9966",
+"8X c #FF9999",
+"9X c #FF99CC",
+"0X c #FFCC00",
+"qX c #FFCC33",
+"wX c #FFCC66",
+"eX c #FFCC99",
+"rX c #FFCCCC",
+"tX c #FFCCCC",
+"yX c #FFCCCC",
+"uX c #FFCCCC",
+"iX c #FFCCCC",
+"pX c #FFCCCC",
+"aX c #FFCCCC",
+"sX c #FFCCCC",
+"dX c #FFCCCC",
+"fX c #FFCCCC",
+"gX c #FFCCCC",
+"hX c #FFCCCC",
+"jX c #FFCCCC",
+"kX c #FFCCCC",
+"lX c #FFCCCC",
+"zX c #FFCCCC",
+"xX c #FFCCCC",
+"cX c #FFCCCC",
+"vX c #FFCCCC",
+"bX c #FFCCCC",
+"nX c #FFCCCC",
+"mX c #FFCCCC",
+"MX c #FFCCCC",
+"NX c #FFCCCC",
+"BX c #FFCCCC",
+"VX c #FFCCCC",
+"CX c #FFCCCC",
+"ZX c #FFCCCC",
+"AX c #FFCCCC",
+"SX c #FFCCCC",
+"DX c #FFCCCC",
+"FX c #FFCCCC",
+"GX c #FFCCCC",
+"HX c #FFCCCC",
+"JX c #FFCCCC",
+"KX c #FFCCCC",
+"LX c #FFCCCC",
+"PX c #FFCCCC",
+"IX c #FFCCCC",
+"UX c #FFCCCC",
+/* pixels */
+"* * * * * * * * * * * * * * * * * * ",
+"* u * * * * u * * * * * * * * * * * ",
+"* u u * * * u u * * * * * * * * * * ",
+"* u 6Xu * * u 6Xu * * * * * * * * * ",
+"* u 6X6Xu * u 6X6Xu * * * * * * * * ",
+"* u 6X6X6Xu u 6X6X6Xu * * * * * * * ",
+"* u 6X6X6X6Xu 6X6X6X6Xu * * * * * * ",
+"* u 6X6X6Xk.u 6X6X6Xk.* * * * * * * ",
+"* u 6X6Xk.* u 6X6Xk.* * * * * * * * ",
+"* u 6Xk.* * u 6Xk.* * * * * * * * * ",
+"* u k.* * * u k.* * * * * * * * * * ",
+"* u * * * * u * * * * * * * * * * * ",
+"* * * * * * * * * * * * * * * * * * "
+};
--- /dev/null
+/* XPM */
+static char *hg_tip[] = {
+/* columns rows colors chars-per-pixel */
+"18 13 256 2 ",
+" c white",
+". c gray80",
+"X c gray60",
+"o c gray40",
+"O c gray20",
+"+ c black",
+"@ c red",
+"# c #CC0000",
+"$ c #990000",
+"% c #660000",
+"& c #330000",
+"* c None",
+"= c #00CC00",
+"- c #009900",
+"; c #006600",
+": c #003300",
+"> c #000033",
+", c #000066",
+"< c #000099",
+"1 c #0000CC",
+"2 c blue",
+"3 c cyan",
+"4 c #33FFFF",
+"5 c #66FFFF",
+"6 c #99FFFF",
+"7 c #CCFFFF",
+"8 c magenta",
+"9 c #FF33FF",
+"0 c #FF66FF",
+"q c #FF99FF",
+"w c #FFCCFF",
+"e c yellow",
+"r c #FFFF33",
+"t c #FFFF66",
+"y c #FFFF99",
+"u c #FFFFCC",
+"i c #003333",
+"p c #003366",
+"a c #003399",
+"s c #0033CC",
+"d c #0033FF",
+"f c #006633",
+"g c #006666",
+"h c #006699",
+"j c #0066CC",
+"k c #0066FF",
+"l c #009933",
+"z c #009966",
+"x c #009999",
+"c c #0099CC",
+"v c #0099FF",
+"b c #00CC33",
+"n c #00CC66",
+"m c #00CC99",
+"M c #00CCCC",
+"N c #00CCFF",
+"B c #00FF33",
+"V c #00FF66",
+"C c #00FF99",
+"Z c #00FFCC",
+"A c #330033",
+"S c #330066",
+"D c #330099",
+"F c #3300CC",
+"G c #3300FF",
+"H c #333300",
+"J c #333366",
+"K c #333399",
+"L c #3333CC",
+"P c #3333FF",
+"I c #336600",
+"U c #336633",
+"Y c #336666",
+"T c #336699",
+"R c #3366CC",
+"E c #3366FF",
+"W c #339900",
+"Q c #339933",
+"! c #339966",
+"~ c #339999",
+"^ c #3399CC",
+"/ c #3399FF",
+"( c #33CC00",
+") c #33CC33",
+"_ c #33CC66",
+"` c #33CC99",
+"' c #33CCCC",
+"] c #33CCFF",
+"[ c #33FF00",
+"{ c #33FF33",
+"} c #33FF66",
+"| c #33FF99",
+" . c #33FFCC",
+".. c #660033",
+"X. c #660066",
+"o. c #660099",
+"O. c #6600CC",
+"+. c #6600FF",
+"@. c #663300",
+"#. c #663333",
+"$. c #663366",
+"%. c #663399",
+"&. c #6633CC",
+"*. c #6633FF",
+"=. c #666600",
+"-. c #666633",
+";. c #666699",
+":. c #6666CC",
+">. c #6666FF",
+",. c #669900",
+"<. c #669933",
+"1. c #669966",
+"2. c #669999",
+"3. c #6699CC",
+"4. c #6699FF",
+"5. c #66CC00",
+"6. c #66CC33",
+"7. c #66CC66",
+"8. c #66CC99",
+"9. c #66CCCC",
+"0. c #66CCFF",
+"q. c #66FF00",
+"w. c #66FF33",
+"e. c #66FF66",
+"r. c #66FF99",
+"t. c #66FFCC",
+"y. c #990033",
+"u. c #990066",
+"i. c #990099",
+"p. c #9900CC",
+"a. c #9900FF",
+"s. c #993300",
+"d. c #993333",
+"f. c #993366",
+"g. c #993399",
+"h. c #9933CC",
+"j. c #9933FF",
+"k. c #996600",
+"l. c #996633",
+"z. c #996666",
+"x. c #996699",
+"c. c #9966CC",
+"v. c #9966FF",
+"b. c #999900",
+"n. c #999933",
+"m. c #999966",
+"M. c #9999CC",
+"N. c #9999FF",
+"B. c #99CC00",
+"V. c #99CC33",
+"C. c #99CC66",
+"Z. c #99CC99",
+"A. c #99CCCC",
+"S. c #99CCFF",
+"D. c #99FF00",
+"F. c #99FF33",
+"G. c #99FF66",
+"H. c #99FF99",
+"J. c #99FFCC",
+"K. c #CC0033",
+"L. c #CC0066",
+"P. c #CC0099",
+"I. c #CC00CC",
+"U. c #CC00FF",
+"Y. c #CC3300",
+"T. c #CC3333",
+"R. c #CC3366",
+"E. c #CC3399",
+"W. c #CC33CC",
+"Q. c #CC33FF",
+"!. c #CC6600",
+"~. c #CC6633",
+"^. c #CC6666",
+"/. c #CC6699",
+"(. c #CC66CC",
+"). c #CC66FF",
+"_. c #CC9900",
+"`. c #CC9933",
+"'. c #CC9966",
+"]. c #CC9999",
+"[. c #CC99CC",
+"{. c #CC99FF",
+"}. c #CCCC00",
+"|. c #CCCC33",
+" X c #CCCC66",
+".X c #CCCC99",
+"XX c #CCCCFF",
+"oX c #CCFF00",
+"OX c #CCFF33",
+"+X c #CCFF66",
+"@X c #CCFF99",
+"#X c #CCFFCC",
+"$X c #CCFFFF",
+"%X c #FF0033",
+"&X c #FF0066",
+"*X c #FF0099",
+"=X c #FF00CC",
+"-X c #FF3300",
+";X c #FF3333",
+":X c #FF3366",
+">X c #FF3399",
+",X c #FF33CC",
+"<X c #FF6600",
+"1X c #FF6633",
+"2X c #FF6666",
+"3X c #FF6699",
+"4X c #FF66CC",
+"5X c #FF9900",
+"6X c #FF9933",
+"7X c #FF9966",
+"8X c #FF9999",
+"9X c #FF99CC",
+"0X c #FFCC00",
+"qX c #FFCC33",
+"wX c #FFCC66",
+"eX c #FFCC99",
+"rX c #FFCCCC",
+"tX c #FFCCCC",
+"yX c #FFCCCC",
+"uX c #FFCCCC",
+"iX c #FFCCCC",
+"pX c #FFCCCC",
+"aX c #FFCCCC",
+"sX c #FFCCCC",
+"dX c #FFCCCC",
+"fX c #FFCCCC",
+"gX c #FFCCCC",
+"hX c #FFCCCC",
+"jX c #FFCCCC",
+"kX c #FFCCCC",
+"lX c #FFCCCC",
+"zX c #FFCCCC",
+"xX c #FFCCCC",
+"cX c #FFCCCC",
+"vX c #FFCCCC",
+"bX c #FFCCCC",
+"nX c #FFCCCC",
+"mX c #FFCCCC",
+"MX c #FFCCCC",
+"NX c #FFCCCC",
+"BX c #FFCCCC",
+"VX c #FFCCCC",
+"CX c #FFCCCC",
+"ZX c #FFCCCC",
+"AX c #FFCCCC",
+"SX c #FFCCCC",
+"DX c #FFCCCC",
+"FX c #FFCCCC",
+"GX c #FFCCCC",
+"HX c #FFCCCC",
+"JX c #FFCCCC",
+"KX c #FFCCCC",
+"LX c #FFCCCC",
+"PX c #FFCCCC",
+"IX c #FFCCCC",
+"UX c #FFCCCC",
+/* pixels */
+"* * * * * X + X X O + + X * * * * * ",
+"* * * * * + o X o + + + * * * * * * ",
+"* * * X X O X o + + + X * * * * * * ",
+"* * X . 7 O + + + * * * * * * * ",
+"* * * 7 . . + + X * * * * * * * ",
+"* * 7 7 + X . + X * * * * * * * * ",
+"* * 7 7 . X O * * * * * * * * * ",
+"* * X + 7 o + * * * * * * * * * ",
+"* * 7 O X X X + X * * * * * * * * * ",
+"* * + o X + + X * * * * * * * * * * ",
+"* X + o + o * * * * * * * * * * * * ",
+"* X o + X * * * * * * * * * * * * * ",
+"* + o * * * * * * * * * * * * * * * "
+};
--- /dev/null
+/* XPM */
+static char *inlet[] = {
+/* columns rows colors chars-per-pixel */
+"24 24 256 2 ",
+" c None",
+". c #FFFF9F",
+"X c #FFFF9C",
+"o c #FFFF9B",
+"O c #FFFF9A",
+"+ c #FFFF98",
+"@ c #FFFF97",
+"# c #FFFF96",
+"$ c #FFFF95",
+"% c #FFFF93",
+"& c #FFFF92",
+"* c #FFFF8F",
+"= c #FFFF8E",
+"- c #FFFE8F",
+"; c #FFFE8C",
+": c #FFFD8E",
+"> c #FFFD8C",
+", c #FFFC8C",
+"< c #FFFB8C",
+"1 c #FFFB8B",
+"2 c #FFFA8C",
+"3 c #FFF98C",
+"4 c #FEFEFE",
+"5 c #FDFDFD",
+"6 c gray99",
+"7 c #FCFA93",
+"8 c gray98",
+"9 c #F8F590",
+"0 c gray97",
+"q c gray96",
+"w c #F5F28D",
+"e c #F4F4F4",
+"r c gray95",
+"t c #F1F1F1",
+"y c gray93",
+"u c #E9E9E9",
+"i c #E7E784",
+"p c #E7E383",
+"a c #E6E6E6",
+"s c #E0DB80",
+"d c #DEDC7F",
+"f c #D7D7D7",
+"g c #D5D5D5",
+"h c #D1CB75",
+"j c gray81",
+"k c #CDCDCD",
+"l c #C7C274",
+"z c #C5C375",
+"x c #C3C3C3",
+"c c #C2BE74",
+"v c #C1C1C1",
+"b c #C0C0C1",
+"n c #BBBBBB",
+"m c gray72",
+"M c #B5B16C",
+"N c gray70",
+"B c #B0B06B",
+"V c #AFAFAF",
+"C c #AAAAAA",
+"Z c #A5A565",
+"A c #A49F5B",
+"S c #949454",
+"D c #949451",
+"F c #939450",
+"G c #929254",
+"H c #929252",
+"J c #92904F",
+"K c #91914E",
+"L c #8E8C4C",
+"P c gray48",
+"I c #79797A",
+"U c #767676",
+"Y c #747475",
+"T c #737047",
+"R c gray44",
+"E c #706C43",
+"W c #706A43",
+"Q c #6E6A43",
+"! c gray42",
+"~ c #676768",
+"^ c #646466",
+"/ c #606062",
+"( c #5E5E60",
+") c #585859",
+"_ c #565658",
+"` c #545237",
+"' c #50502B",
+"] c #4F4F51",
+"[ c #4E4F29",
+"{ c #4E4E29",
+"} c #4E4C2A",
+"| c #4D4C29",
+" . c #4C4C4E",
+".. c #4C4C31",
+"X. c #4C4C28",
+"o. c #4C4B27",
+"O. c #4B4B27",
+"+. c #4B4A27",
+"@. c #4B4927",
+"#. c #4A4B26",
+"$. c #4A492A",
+"%. c #484828",
+"&. c #44422D",
+"*. c #434326",
+"=. c #41422C",
+"-. c #3F3F26",
+";. c #3E3E3F",
+":. c #3E3E26",
+">. c #3D3D3E",
+",. c #3C3C3D",
+"<. c #3A3A3B",
+"1. c #39391E",
+"2. c #393824",
+"3. c #383321",
+"4. c #37361D",
+"5. c #363622",
+"6. c #323234",
+"7. c #2E2D1C",
+"8. c #2B2A1C",
+"9. c #16161A",
+"0. c #131317",
+"q. c #0D0D0F",
+"w. c #0A0905",
+"e. c #09090B",
+"r. c #060606",
+"t. c #040401",
+"y. c #030305",
+"u. c #030304",
+"i. c #020204",
+"p. c #020201",
+"a. c #020100",
+"s. c #010100",
+"d. c #010000",
+"f. c #000002",
+"g. c black",
+"h. c black",
+"j. c black",
+"k. c black",
+"l. c black",
+"z. c black",
+"x. c black",
+"c. c black",
+"v. c black",
+"b. c black",
+"n. c black",
+"m. c black",
+"M. c black",
+"N. c black",
+"B. c black",
+"V. c black",
+"C. c black",
+"Z. c black",
+"A. c black",
+"S. c black",
+"D. c black",
+"F. c black",
+"G. c black",
+"H. c black",
+"J. c black",
+"K. c black",
+"L. c black",
+"P. c black",
+"I. c black",
+"U. c black",
+"Y. c black",
+"T. c black",
+"R. c black",
+"E. c black",
+"W. c black",
+"Q. c black",
+"!. c black",
+"~. c black",
+"^. c black",
+"/. c black",
+"(. c black",
+"). c black",
+"_. c black",
+"`. c black",
+"'. c black",
+"]. c black",
+"[. c black",
+"{. c black",
+"}. c black",
+"|. c black",
+" X c black",
+".X c black",
+"XX c black",
+"oX c black",
+"OX c black",
+"+X c black",
+"@X c black",
+"#X c black",
+"$X c black",
+"%X c black",
+"&X c black",
+"*X c black",
+"=X c black",
+"-X c black",
+";X c black",
+":X c black",
+">X c black",
+",X c black",
+"<X c black",
+"1X c black",
+"2X c black",
+"3X c black",
+"4X c black",
+"5X c black",
+"6X c black",
+"7X c black",
+"8X c black",
+"9X c black",
+"0X c black",
+"qX c black",
+"wX c black",
+"eX c black",
+"rX c black",
+"tX c black",
+"yX c black",
+"uX c black",
+"iX c black",
+"pX c black",
+"aX c black",
+"sX c black",
+"dX c black",
+"fX c black",
+"gX c black",
+"hX c black",
+"jX c black",
+"kX c black",
+"lX c black",
+"zX c black",
+"xX c black",
+"cX c black",
+"vX c black",
+"bX c black",
+"nX c black",
+"mX c black",
+"MX c black",
+"NX c black",
+"BX c black",
+"VX c black",
+"CX c black",
+"ZX c black",
+"AX c black",
+"SX c black",
+"DX c black",
+"FX c black",
+"GX c black",
+"HX c black",
+"JX c black",
+"KX c black",
+"LX c black",
+"PX c black",
+"IX c black",
+"UX c black",
+/* pixels */
+" ",
+" ",
+" ",
+" ",
+" ",
+" x ^ ;.;.;.;.;.;.;.;.) x ",
+" 0 U r.r.r.r.r.r.r.r.r.r.r.r.U 0 ",
+" P r.7.Z *.4.S J J J J L L 7.r.U ",
+" x r.5.d . [ [ . @ @ @ @ @ . d -.r.n ",
+" ( r.c @ @ o.[ @ * * * * * * @ l r._ ",
+" 0 9.-.w * * o.[ * * * * * * * * 9 [ q.y ",
+" f r.Q @ * @ o.o.* * * * * * * * . E r.j ",
+" f r.Q . * * o.[ @ * * * * * * * @ E r.j ",
+" y 0.&.w * * [ [ * * * * * * * * 9 ` r.a ",
+" _ r.l @ @ o.o.* * * * * * * @ h w.] ",
+" N r.-.i . o.[ . @ 9 @ 9 * @ i *.r.N ",
+" ! r.4.M [ 4.S J J J J A M 3.r.^ 0 ",
+" 0 ! r.r.r.r.r.r.r.r.r.r.r.r.^ 0 ",
+" V .6.;.;.;.;.;.;.6. .V ",
+" ",
+" ",
+" ",
+" ",
+" "
+};
--- /dev/null
+/* XPM */
+static char *input[] = {
+/* columns rows colors chars-per-pixel */
+"24 24 256 2 ",
+" c None",
+". c #FFFF93",
+"X c #FFFF92",
+"o c #FFFF91",
+"O c #FFFF90",
+"+ c #FFFF8F",
+"@ c #FFFF8E",
+"# c #FFFF8D",
+"$ c #FFFF8C",
+"% c #FFFF8B",
+"& c #FFFF89",
+"* c #FFFF88",
+"= c #FFFE8B",
+"- c #FFFD8B",
+"; c #FFFD8A",
+": c #FFFC8E",
+"> c #FFFC8D",
+", c #FFFC8B",
+"< c #FFFC8A",
+"1 c #FFFC89",
+"2 c #FFFB8D",
+"3 c #FFFB8C",
+"4 c #FFFB8A",
+"5 c #FFFB89",
+"6 c #FFFB88",
+"7 c #FFFA8C",
+"8 c #FFFA8B",
+"9 c #FFFA88",
+"0 c #FFFA87",
+"q c #FFF98C",
+"w c #FFF98B",
+"e c #FFF98A",
+"r c #FFF989",
+"t c #FFF988",
+"y c #FFF987",
+"u c #FFF88C",
+"i c #FFF88A",
+"p c #FFF889",
+"a c #FFF888",
+"s c #FFF887",
+"d c #FFF78A",
+"f c #FFF789",
+"g c #FFF788",
+"h c #FFF787",
+"j c #FFF785",
+"k c #FFF689",
+"l c #FFF688",
+"z c #FFF687",
+"x c #FFF587",
+"c c #F8F58D",
+"v c gray95",
+"b c #F2F1F2",
+"n c #F1F288",
+"m c gray94",
+"M c #F0F089",
+"N c #EFF0F0",
+"B c #EFEF8A",
+"V c #EEEFEF",
+"C c #EDEC85",
+"Z c #EAE9E6",
+"A c #D9D67D",
+"S c #D5D378",
+"D c #D4D2CE",
+"F c #D4D2CD",
+"G c #D4D27A",
+"H c #D4D178",
+"J c #D4D177",
+"K c #D2D0CF",
+"L c #D1CECA",
+"P c #CFCFD0",
+"I c #CFCDCB",
+"U c #C1BD76",
+"Y c #BEBBB5",
+"T c #B9B6AF",
+"R c #B6B571",
+"E c #B5B4B5",
+"W c #B5B4B4",
+"Q c #B4B6B5",
+"! c #B4B06E",
+"~ c #B2B1B2",
+"^ c #B1B26D",
+"/ c #AFAE6C",
+"( c #A9A59C",
+") c #A8A49C",
+"_ c #A5A097",
+"` c #A49F96",
+"' c #A2A2A2",
+"] c #A09C92",
+"[ c #868558",
+"{ c #858353",
+"} c #848152",
+"| c #848055",
+" . c #847F53",
+".. c #837F52",
+"X. c #837E54",
+"o. c #837D54",
+"O. c #837D52",
+"+. c #837D51",
+"@. c #837B54",
+"#. c #7C7A50",
+"$. c #7C756A",
+"%. c #787164",
+"&. c #767044",
+"*. c #766F6B",
+"=. c #757473",
+"-. c #736D64",
+";. c #726C66",
+":. c #726C65",
+">. c #726C43",
+",. c #726B42",
+"<. c #726B41",
+"1. c #726B40",
+"2. c #726A42",
+"3. c #726A40",
+"4. c #726A3F",
+"5. c #726940",
+"6. c #707051",
+"7. c #6D6A6D",
+"8. c #6B6D51",
+"9. c #6B6A69",
+"0. c #6B6950",
+"q. c #6B6949",
+"w. c #696668",
+"e. c #666560",
+"r. c #666366",
+"t. c #66624C",
+"y. c #65634B",
+"u. c #646467",
+"i. c #636366",
+"p. c #63634C",
+"a. c #635C3C",
+"s. c #4E4732",
+"d. c #473E2E",
+"f. c #453D30",
+"g. c #443F38",
+"h. c #42392A",
+"j. c #40382B",
+"k. c #3E372A",
+"l. c #3D362A",
+"z. c #3C3426",
+"x. c #3C3327",
+"c. c #3C331F",
+"v. c #3B342E",
+"b. c #3B3326",
+"n. c #3B3226",
+"m. c #393937",
+"M. c #393634",
+"N. c #393125",
+"B. c #36323B",
+"V. c #362D1C",
+"C. c #343136",
+"Z. c #322F2A",
+"A. c #302D35",
+"S. c #302C34",
+"D. c #2F2C2E",
+"F. c #2E2D32",
+"G. c #2E2C32",
+"H. c #2E2B2F",
+"J. c #2D2720",
+"K. c #2A2A34",
+"L. c #2A2424",
+"P. c black",
+"I. c black",
+"U. c black",
+"Y. c black",
+"T. c black",
+"R. c black",
+"E. c black",
+"W. c black",
+"Q. c black",
+"!. c black",
+"~. c black",
+"^. c black",
+"/. c black",
+"(. c black",
+"). c black",
+"_. c black",
+"`. c black",
+"'. c black",
+"]. c black",
+"[. c black",
+"{. c black",
+"}. c black",
+"|. c black",
+" X c black",
+".X c black",
+"XX c black",
+"oX c black",
+"OX c black",
+"+X c black",
+"@X c black",
+"#X c black",
+"$X c black",
+"%X c black",
+"&X c black",
+"*X c black",
+"=X c black",
+"-X c black",
+";X c black",
+":X c black",
+">X c black",
+",X c black",
+"<X c black",
+"1X c black",
+"2X c black",
+"3X c black",
+"4X c black",
+"5X c black",
+"6X c black",
+"7X c black",
+"8X c black",
+"9X c black",
+"0X c black",
+"qX c black",
+"wX c black",
+"eX c black",
+"rX c black",
+"tX c black",
+"yX c black",
+"uX c black",
+"iX c black",
+"pX c black",
+"aX c black",
+"sX c black",
+"dX c black",
+"fX c black",
+"gX c black",
+"hX c black",
+"jX c black",
+"kX c black",
+"lX c black",
+"zX c black",
+"xX c black",
+"cX c black",
+"vX c black",
+"bX c black",
+"nX c black",
+"mX c black",
+"MX c black",
+"NX c black",
+"BX c black",
+"VX c black",
+"CX c black",
+"ZX c black",
+"AX c black",
+"SX c black",
+"DX c black",
+"FX c black",
+"GX c black",
+"HX c black",
+"JX c black",
+"KX c black",
+"LX c black",
+"PX c black",
+"IX c black",
+"UX c black",
+/* pixels */
+" ",
+" ",
+" ",
+" Z L D D D D D D D D D D D D D D D D D P I Z ",
+" _ c.d.d.k.d.k.d.k.d.k.d.k.d.k.d.k.d.d.g.J.` ",
+" ( z.q.S J J J J J S S S S J J J S S [ D.7.Z ",
+" ( k.{ . + + + . + . . . . + + . . U g.e.v ",
+" ( z. .+ d h h d h + 0 h d + h + ! F.w.N ",
+" ( z. .+ h h d h + d + + 0 d + ! D.e.N ",
+" ( k. .0 d 0 + 0 0 d d h + . R F.w.N ",
+" ( z. .+ d h d d + + 0 + + / M.7.N ",
+" ( z. .+ h h + 0 d h + d + 6.J.' ",
+" ( k. .+ h + h + + 0 0 + + C 8.B.E ",
+" ( z. .0 h h h h h + d 0 0 . B t.A.E ",
+" ( z. .+ h d h d d h + d + d + B t.F.E ",
+" ( z.{ 0 h d h h + h 0 d h d h + n t.F.E ",
+" ( z.#.. + + + + + + + + + + + + . n 8.C.E ",
+" ` V.s.>.>.4.4.>.4.4.4.4.>.4.4.4.4.&.a.k.Z.Y ",
+" Y %.$.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.*.=.e.T ",
+" ",
+" ",
+" ",
+" ",
+" "
+};
--- /dev/null
+/* XPM */
+static char *italic[] = {
+/* columns rows colors chars-per-pixel */
+"24 24 256 2 ",
+" c black",
+". c #010101",
+"X c #020202",
+"o c gray1",
+"O c #040404",
+"+ c gray2",
+"@ c #060606",
+"# c #070707",
+"$ c gray3",
+"% c #090909",
+"& c gray4",
+"* c #0B0B0B",
+"= c #0C0C0C",
+"- c gray5",
+"; c #0E0E0E",
+": c gray6",
+"> c #101010",
+", c #111111",
+"< c gray7",
+"1 c #131313",
+"2 c gray8",
+"3 c #151515",
+"4 c #161616",
+"5 c gray9",
+"6 c #181818",
+"7 c #191919",
+"8 c gray10",
+"9 c #1B1B1B",
+"0 c gray11",
+"q c #1D1D1D",
+"w c #1E1E1E",
+"e c gray12",
+"r c #202020",
+"t c gray13",
+"y c #222222",
+"u c #232323",
+"i c gray14",
+"p c #252525",
+"a c gray15",
+"s c #272727",
+"d c #282828",
+"f c gray16",
+"g c #2A2A2A",
+"h c gray17",
+"j c #2C2C2C",
+"k c #2D2D2D",
+"l c gray18",
+"z c #2F2F2F",
+"x c gray19",
+"c c #313131",
+"v c #323232",
+"b c gray20",
+"n c #343434",
+"m c #353535",
+"M c gray21",
+"N c #373737",
+"B c gray22",
+"V c #393939",
+"C c #3A3A3A",
+"Z c gray23",
+"A c #3C3C3C",
+"S c gray24",
+"D c #3E3E3E",
+"F c #3F3F3F",
+"G c gray25",
+"H c #414141",
+"J c gray26",
+"K c #434343",
+"L c #444444",
+"P c gray27",
+"I c #464646",
+"U c gray28",
+"Y c #484848",
+"T c #494949",
+"R c gray29",
+"E c #4B4B4B",
+"W c #4C4C4C",
+"Q c gray30",
+"! c #4E4E4E",
+"~ c gray31",
+"^ c #505050",
+"/ c #515151",
+"( c gray32",
+") c #535353",
+"_ c gray33",
+"` c #555555",
+"' c #565656",
+"] c gray34",
+"[ c #585858",
+"{ c gray35",
+"} c #5A5A5A",
+"| c #5B5B5B",
+" . c gray36",
+".. c #5D5D5D",
+"X. c gray37",
+"o. c #5F5F5F",
+"O. c #606060",
+"+. c gray38",
+"@. c #626262",
+"#. c gray39",
+"$. c #646464",
+"%. c #656565",
+"&. c gray40",
+"*. c #676767",
+"=. c #686868",
+"-. c DimGray",
+";. c #6A6A6A",
+":. c gray42",
+">. c #6C6C6C",
+",. c #6D6D6D",
+"<. c gray43",
+"1. c #6F6F6F",
+"2. c gray44",
+"3. c #717171",
+"4. c #727272",
+"5. c gray45",
+"6. c #747474",
+"7. c gray46",
+"8. c #767676",
+"9. c #777777",
+"0. c gray47",
+"q. c #797979",
+"w. c gray48",
+"e. c #7B7B7B",
+"r. c #7C7C7C",
+"t. c gray49",
+"y. c #7E7E7E",
+"u. c gray50",
+"i. c #808080",
+"p. c #818181",
+"a. c gray51",
+"s. c #838383",
+"d. c #848484",
+"f. c gray52",
+"g. c #868686",
+"h. c gray53",
+"j. c #888888",
+"k. c #898989",
+"l. c gray54",
+"z. c #8B8B8B",
+"x. c gray55",
+"c. c #8D8D8D",
+"v. c #8E8E8E",
+"b. c gray56",
+"n. c #909090",
+"m. c gray57",
+"M. c #929292",
+"N. c #939393",
+"B. c gray58",
+"V. c #959595",
+"C. c gray59",
+"Z. c #979797",
+"A. c #989898",
+"S. c gray60",
+"D. c #9A9A9A",
+"F. c #9B9B9B",
+"G. c gray61",
+"H. c #9D9D9D",
+"J. c gray62",
+"K. c #9F9F9F",
+"L. c #A0A0A0",
+"P. c gray63",
+"I. c #A2A2A2",
+"U. c gray64",
+"Y. c #A4A4A4",
+"T. c #A5A5A5",
+"R. c gray65",
+"E. c #A7A7A7",
+"W. c gray66",
+"Q. c #A9A9A9",
+"!. c #AAAAAA",
+"~. c gray67",
+"^. c #ACACAC",
+"/. c gray68",
+"(. c #AEAEAE",
+"). c #AFAFAF",
+"_. c gray69",
+"`. c #B1B1B1",
+"'. c #B2B2B2",
+"]. c gray70",
+"[. c #B4B4B4",
+"{. c gray71",
+"}. c #B6B6B6",
+"|. c #B7B7B7",
+" X c gray72",
+".X c #B9B9B9",
+"XX c gray73",
+"oX c #BBBBBB",
+"OX c #BCBCBC",
+"+X c gray74",
+"@X c gray",
+"#X c gray75",
+"$X c #C0C0C0",
+"%X c #C1C1C1",
+"&X c gray76",
+"*X c #C3C3C3",
+"=X c gray77",
+"-X c #C5C5C5",
+";X c #C6C6C6",
+":X c gray78",
+">X c #C8C8C8",
+",X c gray79",
+"<X c #CACACA",
+"1X c #CBCBCB",
+"2X c gray80",
+"3X c #CDCDCD",
+"4X c #CECECE",
+"5X c gray81",
+"6X c #D0D0D0",
+"7X c gray82",
+"8X c #D2D2D2",
+"9X c LightGray",
+"0X c gray83",
+"qX c #D5D5D5",
+"wX c gray84",
+"eX c #D7D7D7",
+"rX c #D8D8D8",
+"tX c gray85",
+"yX c #DADADA",
+"uX c gray86",
+"iX c gainsboro",
+"pX c #DDDDDD",
+"aX c gray87",
+"sX c #DFDFDF",
+"dX c gray88",
+"fX c #E1E1E1",
+"gX c #E2E2E2",
+"hX c gray89",
+"jX c #E4E4E4",
+"kX c gray90",
+"lX c #E6E6E6",
+"zX c #E7E7E7",
+"xX c gray91",
+"cX c #E9E9E9",
+"vX c #EAEAEA",
+"bX c gray92",
+"nX c #ECECEC",
+"mX c gray93",
+"MX c #EEEEEE",
+"NX c #EFEFEF",
+"BX c gray94",
+"VX c #F1F1F1",
+"CX c gray95",
+"ZX c #F3F3F3",
+"AX c #F4F4F4",
+"SX c gray96",
+"DX c #F6F6F6",
+"FX c gray97",
+"GX c #F8F8F8",
+"HX c #F9F9F9",
+"JX c gray98",
+"KX c #FBFBFB",
+"LX c gray99",
+"PX c #FDFDFD",
+"IX c #FEFEFE",
+"UX c None",
+/* pixels */
+"UXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUX",
+"UXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUX",
+"UXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUX",
+"UXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXsX#X#X#X#X5XUXUX",
+"UXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUX8.# # # # k UXUX",
+"UXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXsXk # # N.5XUXUX",
+"UXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUX=.# # N.UXUXUXUX",
+"UXUXUXUXUXUXUXUXUXUXUXUXUXUXUX&.# # N.UXUXUXUXUX",
+"UXUXUXUXUXUXUXUXUXUXUXUXUXUX&.# # N.UXUXUXUXUXUX",
+"UXUXUXUXUXUXUXUXUXUXUXUXUX=.# # N.UXUXUXUXUXUXUX",
+"UXUXUXUXUXUXUXUXUXUXUXUX&.# # H.UXUXUXUXUXUXUXUX",
+"UXUXUXUXUXUXUXUXUXUXUX&.# # N.UXUXUXUXUXUXUXUXUX",
+"UXUXUXUXUXUXUXUXUXUX=.# # N.UXUXUXUXUXUXUXUXUXUX",
+"UXUXUXUXUXUXUXUXUX&.# # N.UXUXUXUXUXUXUXUXUXUXUX",
+"UXUXUXUXUXUXUXUX&.# # N.UXUXUXUXUXUXUXUXUXUXUXUX",
+"UXUXUXUXUXUXUX&.# # N.UXUXUXUXUXUXUXUXUXUXUXUXUX",
+"UXUXUXUXUXUX&.# # N.UXUXUXUXUXUXUXUXUXUXUXUXUXUX",
+"UXUXUXUXUX&.# # H.UXUXUXUXUXUXUXUXUXUXUXUXUXUXUX",
+"UXUXUX*X&.# # [ DXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUX",
+"UXUXNX# # # # # #XUXUXUXUXUXUXUXUXUXUXUXUXUXUXUX",
+"UXUXUX#X#X#X#X#XNXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUX",
+"UXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUX",
+"UXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUX",
+"UXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUX"
+};
--- /dev/null
+/* XPM */
+static char *join[] = {
+/* columns rows colors chars-per-pixel */
+"24 24 256 2 ",
+" c None",
+". c #FFFFFE",
+"X c #FFFF8E",
+"o c #FFFF8D",
+"O c #FFFF8C",
+"+ c #FFFE87",
+"@ c #FFFE86",
+"# c #FFFB8B",
+"$ c #FFFA8C",
+"% c #FFF789",
+"& c #FFF27F",
+"* c #FFF27E",
+"= c #FFEE7E",
+"- c #FFED7E",
+"; c #FEFFFE",
+": c #FEFEFE",
+"> c #FEFEFD",
+", c #FDFDFD",
+"< c #FDFCFC",
+"1 c #FBFAFA",
+"2 c #F9F9F9",
+"3 c #F9F687",
+"4 c #F8F8F8",
+"5 c #F7F8F7",
+"6 c gray97",
+"7 c #F7F6F6",
+"8 c #F6F6F8",
+"9 c #F6F6F5",
+"0 c gray93",
+"q c #ECECEC",
+"w c gray91",
+"e c #E7E7E8",
+"r c #E7E7E7",
+"t c #E5E5E7",
+"y c #E5E5E2",
+"u c #E2E2E3",
+"i c #E0E0DD",
+"p c gray87",
+"a c #DED479",
+"s c #DBDBDD",
+"d c #DAD9D9",
+"f c #D9DBDC",
+"g c #D9D9D8",
+"h c #D4D5DB",
+"j c #D2D3D6",
+"k c #D2C973",
+"l c #D1C871",
+"z c #CECECD",
+"x c #CDCDCD",
+"c c #CDC172",
+"v c #CCCDCC",
+"b c #C3C3C6",
+"n c #BFC0C3",
+"m c #BEBFC2",
+"M c #BCBEBE",
+"N c #B8B8BB",
+"B c #B7B8BB",
+"V c #B7B46A",
+"C c #B6B7B8",
+"Z c #B2B2B3",
+"A c #B1B1B2",
+"S c #B1B1B1",
+"D c #ADA064",
+"F c #ABABA5",
+"G c #A69A5D",
+"H c #A49B5E",
+"J c #A0A0B5",
+"K c #9C9FA3",
+"L c #9999B6",
+"P c #979797",
+"I c #968D57",
+"U c #959596",
+"Y c #8F9293",
+"T c #8B8253",
+"R c #868050",
+"E c #827A4C",
+"W c #80774F",
+"Q c #7A7D82",
+"! c #78797E",
+"~ c #78734C",
+"^ c #6E737A",
+"/ c #696864",
+"( c #676766",
+") c #666768",
+"_ c #656A6E",
+"` c #646464",
+"' c #636567",
+"] c #616768",
+"[ c #5F6666",
+"{ c #5C5F65",
+"} c #5B5B5C",
+"| c #5B5A54",
+" . c #5A5135",
+".. c #575138",
+"X. c #4F5253",
+"o. c #4E4E52",
+"O. c #4E4C51",
+"+. c #4C4931",
+"@. c #4B4B55",
+"#. c #4B4A46",
+"$. c #4B482F",
+"%. c #4A483F",
+"&. c #484B53",
+"*. c #48484D",
+"=. c #464648",
+"-. c #464646",
+";. c #464644",
+":. c #44494D",
+">. c #424245",
+",. c #424142",
+"<. c #403F2F",
+"1. c #3F3E3F",
+"2. c #3E3F40",
+"3. c #3D3D3C",
+"4. c #3D3B43",
+"5. c #3B3B3D",
+"6. c #3A3A3A",
+"7. c #373736",
+"8. c #37353D",
+"9. c #363635",
+"0. c #343633",
+"q. c #313436",
+"w. c #303235",
+"e. c #303031",
+"r. c #2E2E2B",
+"t. c #2C2D32",
+"y. c #282B28",
+"u. c black",
+"i. c black",
+"p. c black",
+"a. c black",
+"s. c black",
+"d. c black",
+"f. c black",
+"g. c black",
+"h. c black",
+"j. c black",
+"k. c black",
+"l. c black",
+"z. c black",
+"x. c black",
+"c. c black",
+"v. c black",
+"b. c black",
+"n. c black",
+"m. c black",
+"M. c black",
+"N. c black",
+"B. c black",
+"V. c black",
+"C. c black",
+"Z. c black",
+"A. c black",
+"S. c black",
+"D. c black",
+"F. c black",
+"G. c black",
+"H. c black",
+"J. c black",
+"K. c black",
+"L. c black",
+"P. c black",
+"I. c black",
+"U. c black",
+"Y. c black",
+"T. c black",
+"R. c black",
+"E. c black",
+"W. c black",
+"Q. c black",
+"!. c black",
+"~. c black",
+"^. c black",
+"/. c black",
+"(. c black",
+"). c black",
+"_. c black",
+"`. c black",
+"'. c black",
+"]. c black",
+"[. c black",
+"{. c black",
+"}. c black",
+"|. c black",
+" X c black",
+".X c black",
+"XX c black",
+"oX c black",
+"OX c black",
+"+X c black",
+"@X c black",
+"#X c black",
+"$X c black",
+"%X c black",
+"&X c black",
+"*X c black",
+"=X c black",
+"-X c black",
+";X c black",
+":X c black",
+">X c black",
+",X c black",
+"<X c black",
+"1X c black",
+"2X c black",
+"3X c black",
+"4X c black",
+"5X c black",
+"6X c black",
+"7X c black",
+"8X c black",
+"9X c black",
+"0X c black",
+"qX c black",
+"wX c black",
+"eX c black",
+"rX c black",
+"tX c black",
+"yX c black",
+"uX c black",
+"iX c black",
+"pX c black",
+"aX c black",
+"sX c black",
+"dX c black",
+"fX c black",
+"gX c black",
+"hX c black",
+"jX c black",
+"kX c black",
+"lX c black",
+"zX c black",
+"xX c black",
+"cX c black",
+"vX c black",
+"bX c black",
+"nX c black",
+"mX c black",
+"MX c black",
+"NX c black",
+"BX c black",
+"VX c black",
+"CX c black",
+"ZX c black",
+"AX c black",
+"SX c black",
+"DX c black",
+"FX c black",
+"GX c black",
+"HX c black",
+"JX c black",
+"KX c black",
+"LX c black",
+"PX c black",
+"IX c black",
+"UX c black",
+/* pixels */
+" ",
+" ",
+" ",
+" 0 z z p ",
+" Z 7.r.) ",
+" 6 Z 1.t.^ 6 6 8 ",
+" Y ( ( -.2.X.[ [ p ",
+" z =.r.-.-.1.t.K ",
+" r ( 7.1.1.C ",
+" p } 7.F ",
+" r b ",
+" r m m p ",
+" C o.t.7.2.P 6 ",
+" M %. .D V T <.P ",
+" 8 ( $.a X X X G | j ",
+" r :.R X & = + k 2.L ",
+" r o.~ % & = + c 8.J ",
+" Q +.k X X 3 E o.i ",
+" h / .I G ~ #.Z ",
+" p ! o.*.{ B ",
+" 0 0 6 ",
+" ",
+" ",
+" "
+};
--- /dev/null
+/* XPM */
+static char *jsdl[] = {
+/* columns rows colors chars-per-pixel */
+"25 21 256 2 ",
+" c black",
+". c #000055",
+"X c #0000AA",
+"o c blue",
+"O c #002400",
+"+ c #002455",
+"@ c #0024AA",
+"# c #0024FF",
+"$ c #004900",
+"% c #004955",
+"& c #0049AA",
+"* c #0049FF",
+"= c #006D00",
+"- c #006D55",
+"; c #006DAA",
+": c #006DFF",
+"> c #009200",
+", c #009255",
+"< c #0092AA",
+"1 c #0092FF",
+"2 c #00B600",
+"3 c #00B655",
+"4 c #00B6AA",
+"5 c #00B6FF",
+"6 c #00DB00",
+"7 c #00DB55",
+"8 c #00DBAA",
+"9 c #00DBFF",
+"0 c green",
+"q c #00FF55",
+"w c #00FFAA",
+"e c cyan",
+"r c #240000",
+"t c #240055",
+"y c #2400AA",
+"u c #2400FF",
+"i c #242400",
+"p c #242455",
+"a c #2424AA",
+"s c #2424FF",
+"d c #244900",
+"f c #244955",
+"g c #2449AA",
+"h c #2449FF",
+"j c #246D00",
+"k c #246D55",
+"l c #246DAA",
+"z c #246DFF",
+"x c #249200",
+"c c #249255",
+"v c #2492AA",
+"b c #2492FF",
+"n c #24B600",
+"m c #24B655",
+"M c #24B6AA",
+"N c #24B6FF",
+"B c #24DB00",
+"V c #24DB55",
+"C c #24DBAA",
+"Z c #24DBFF",
+"A c #24FF00",
+"S c #24FF55",
+"D c #24FFAA",
+"F c #24FFFF",
+"G c #490000",
+"H c #490055",
+"J c #4900AA",
+"K c #4900FF",
+"L c #492400",
+"P c #492455",
+"I c #4924AA",
+"U c #4924FF",
+"Y c #494900",
+"T c #494955",
+"R c #4949AA",
+"E c #4949FF",
+"W c #496D00",
+"Q c #496D55",
+"! c #496DAA",
+"~ c #496DFF",
+"^ c #499200",
+"/ c #499255",
+"( c #4992AA",
+") c #4992FF",
+"_ c #49B600",
+"` c #49B655",
+"' c #49B6AA",
+"] c #49B6FF",
+"[ c #49DB00",
+"{ c #49DB55",
+"} c #49DBAA",
+"| c #49DBFF",
+" . c #49FF00",
+".. c #49FF55",
+"X. c #49FFAA",
+"o. c #49FFFF",
+"O. c #6D0000",
+"+. c #6D0055",
+"@. c #6D00AA",
+"#. c #6D00FF",
+"$. c #6D2400",
+"%. c #6D2455",
+"&. c #6D24AA",
+"*. c #6D24FF",
+"=. c #6D4900",
+"-. c #6D4955",
+";. c #6D49AA",
+":. c #6D49FF",
+">. c #6D6D00",
+",. c #6D6D55",
+"<. c #6D6DAA",
+"1. c #6D6DFF",
+"2. c #6D9200",
+"3. c #6D9255",
+"4. c #6D92AA",
+"5. c #6D92FF",
+"6. c #6DB600",
+"7. c #6DB655",
+"8. c #6DB6AA",
+"9. c #6DB6FF",
+"0. c #6DDB00",
+"q. c #6DDB55",
+"w. c #6DDBAA",
+"e. c #6DDBFF",
+"r. c #6DFF00",
+"t. c #6DFF55",
+"y. c #6DFFAA",
+"u. c #6DFFFF",
+"i. c #920000",
+"p. c #920055",
+"a. c #9200AA",
+"s. c #9200FF",
+"d. c #922400",
+"f. c #922455",
+"g. c #9224AA",
+"h. c #9224FF",
+"j. c #924900",
+"k. c #924955",
+"l. c #9249AA",
+"z. c #9249FF",
+"x. c #926D00",
+"c. c #926D55",
+"v. c #926DAA",
+"b. c #926DFF",
+"n. c #929200",
+"m. c #929255",
+"M. c #9292AA",
+"N. c #9292FF",
+"B. c #92B600",
+"V. c #92B655",
+"C. c #92B6AA",
+"Z. c #92B6FF",
+"A. c #92DB00",
+"S. c #92DB55",
+"D. c #92DBAA",
+"F. c #92DBFF",
+"G. c #92FF00",
+"H. c #92FF55",
+"J. c #92FFAA",
+"K. c #92FFFF",
+"L. c #B60000",
+"P. c #B60055",
+"I. c #B600AA",
+"U. c #B600FF",
+"Y. c #B62400",
+"T. c #B62455",
+"R. c #B624AA",
+"E. c #B624FF",
+"W. c #B64900",
+"Q. c #B64955",
+"!. c #B649AA",
+"~. c #B649FF",
+"^. c #B66D00",
+"/. c #B66D55",
+"(. c #B66DAA",
+"). c #B66DFF",
+"_. c #B69200",
+"`. c #B69255",
+"'. c #B692AA",
+"]. c #B692FF",
+"[. c #B6B600",
+"{. c #B6B655",
+"}. c #B6B6AA",
+"|. c #B6B6FF",
+" X c #B6DB00",
+".X c #B6DB55",
+"XX c #B6DBAA",
+"oX c #B6DBFF",
+"OX c #B6FF00",
+"+X c #B6FF55",
+"@X c #B6FFAA",
+"#X c #B6FFFF",
+"$X c #DB0000",
+"%X c #DB0055",
+"&X c #DB00AA",
+"*X c #DB00FF",
+"=X c #DB2400",
+"-X c #DB2455",
+";X c #DB24AA",
+":X c #DB24FF",
+">X c #DB4900",
+",X c #DB4955",
+"<X c #DB49AA",
+"1X c #DB49FF",
+"2X c #DB6D00",
+"3X c #DB6D55",
+"4X c #DB6DAA",
+"5X c #DB6DFF",
+"6X c #DB9200",
+"7X c #DB9255",
+"8X c #DB92AA",
+"9X c #DB92FF",
+"0X c #DBB600",
+"qX c #DBB655",
+"wX c #DBB6AA",
+"eX c #DBB6FF",
+"rX c #DBDB00",
+"tX c #DBDB55",
+"yX c #DBDBAA",
+"uX c #DBDBFF",
+"iX c #DBFF00",
+"pX c #DBFF55",
+"aX c #DBFFAA",
+"sX c #DBFFFF",
+"dX c red",
+"fX c #FF0055",
+"gX c #FF00AA",
+"hX c magenta",
+"jX c #FF2400",
+"kX c #FF2455",
+"lX c #FF24AA",
+"zX c #FF24FF",
+"xX c #FF4900",
+"cX c #FF4955",
+"vX c #FF49AA",
+"bX c #FF49FF",
+"nX c #FF6D00",
+"mX c #FF6D55",
+"MX c #FF6DAA",
+"NX c #FF6DFF",
+"BX c #FF9200",
+"VX c #FF9255",
+"CX c #FF92AA",
+"ZX c #FF92FF",
+"AX c #FFB600",
+"SX c #FFB655",
+"DX c #FFB6AA",
+"FX c #FFB6FF",
+"GX c #FFDB00",
+"HX c #FFDB55",
+"JX c #FFDBAA",
+"KX c #FFDBFF",
+"LX c yellow",
+"PX c #FFFF55",
+"IX c #FFFFAA",
+"UX c white",
+/* pixels */
+"UXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUX",
+"UXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUX",
+"UXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUX",
+"UXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUX",
+"UXUXUXUX% UX% % % % % UX% % % UXUXUXUX% UXUXUXUXUX",
+"UXUXUXUX% UX% UXUXUXUXUX% UXUX% UXUXUX% UXUXUXUXUX",
+"UXUXUXUX$ UX$ UXUXUXUXUX% UXUXUX+ UXUX$ UXUXUXUXUX",
+"UXUXUXUX% UX$ UXUXUXUXUX% UXUXUXUX% UX$ UXUXUXUXUX",
+"UXUXUXUX% UX% UXUXUXUXUX% UXUXUXUX% UX% UXUXUXUXUX",
+"UXUXUXUXO UX+ % % $ % UXO UXUXUXUX+ UX+ UXUXUXUXUX",
+"UXUXUXUX% UXUXUXUXUX% UX% UXUXUXUX$ UX% UXUXUXUXUX",
+"UXUXUXUX% UXUXUXUXUX+ UX% UXUXUXUX$ UX% UXUXUXUXUX",
+"UXUXUXUX+ UXUXUXUXUXO UXO UXUXUX% UXUX+ UXUXUXUXUX",
+"UXUXUXUX% UXUXUXUXUX% UX% UXUX% UXUXUX% UXUXUXUXUX",
+"UXUXUXUX+ UX+ % + $ + UXO % O UXUXUXUX+ % % % % UX",
+"UXUXUX% UXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUX",
+"UXUX% UXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUX",
+"UX% UXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUX",
+"UXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUX",
+"UXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUX",
+"UXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUX"
+};
--- /dev/null
+/* XPM */
+static char *label_in_connector[] = {
+/* columns rows colors chars-per-pixel */
+"24 24 256 2 ",
+" c None",
+". c #FFFF8D",
+"X c #FFFC87",
+"o c #FFFB8C",
+"O c #FFFB88",
+"+ c #FFFA85",
+"@ c #FFF884",
+"# c #FFF883",
+"$ c #FFF78A",
+"% c #FFF180",
+"& c #FFEF7A",
+"* c #FFED81",
+"= c #FEFEFE",
+"- c #FDFFFE",
+"; c #FDFDFD",
+": c gray99",
+"> c #FBFBFA",
+", c #FBFAFB",
+"< c #FAFAF9",
+"1 c #F9F9F9",
+"2 c #F9F9F5",
+"3 c #F8F8F8",
+"4 c #F7F7F8",
+"5 c #F7E888",
+"6 c #F6F6F6",
+"7 c #F5F4F4",
+"8 c #F5F086",
+"9 c #F2EB85",
+"0 c #F2EA82",
+"q c gray94",
+"w c #EFEFF2",
+"e c #EBEDEE",
+"r c #EBEAEA",
+"t c #EAEAE9",
+"y c #E8DF80",
+"u c #E6E6E6",
+"i c #E5E5E4",
+"p c #DFDFDF",
+"a c #DFCE7D",
+"s c #DEDEE0",
+"d c #D9DBDC",
+"f c #D7D7D8",
+"g c #D6D5D5",
+"h c #D5CA70",
+"j c #CECECE",
+"k c #CCCCCD",
+"l c #CBC374",
+"z c #C9C06C",
+"x c #BDBDC4",
+"c c #B7B8BB",
+"v c #B5B5B8",
+"b c #B3B3B2",
+"n c #B2B2B4",
+"m c #B2B2B2",
+"M c #B2A765",
+"N c #B1B1C4",
+"B c #AEAEAE",
+"V c #A4A7AC",
+"C c #A1955A",
+"Z c #A0A19F",
+"A c #9EA0A4",
+"S c #96999C",
+"D c #968F56",
+"F c #939393",
+"G c #9292B1",
+"H c #8D8457",
+"J c #8B9094",
+"K c #898D8E",
+"L c #888B90",
+"P c #797975",
+"I c #747475",
+"U c #727272",
+"Y c #6F7075",
+"T c #6E737B",
+"R c #6D6E66",
+"E c #6C7176",
+"W c #68696B",
+"Q c #68643F",
+"! c #68603D",
+"~ c #66603D",
+"^ c #656768",
+"/ c #646463",
+"( c #61676F",
+") c #606667",
+"_ c #5F6666",
+"` c #5F626B",
+"' c #5E6064",
+"] c #5E573C",
+"[ c #5C5C5B",
+"{ c #5C5A3D",
+"} c #5B5D63",
+"| c #5A5444",
+" . c #555042",
+".. c #545450",
+"X. c #524D38",
+"o. c #515452",
+"O. c #4E5158",
+"+. c #4E4D44",
+"@. c #4C4A42",
+"#. c #4B4B3F",
+"$. c #474644",
+"%. c #464649",
+"&. c #464645",
+"*. c #44454A",
+"=. c #444442",
+"-. c #434131",
+";. c #40454E",
+":. c gray25",
+">. c #3F3F40",
+",. c #3F3E3F",
+"<. c #3C3C38",
+"1. c #3A3A39",
+"2. c #393528",
+"3. c #38383D",
+"4. c #353841",
+"5. c #353535",
+"6. c #35343F",
+"7. c #333633",
+"8. c #333330",
+"9. c #303332",
+"0. c #2F2A29",
+"q. c #2C2C32",
+"w. c #2B2E30",
+"e. c black",
+"r. c black",
+"t. c black",
+"y. c black",
+"u. c black",
+"i. c black",
+"p. c black",
+"a. c black",
+"s. c black",
+"d. c black",
+"f. c black",
+"g. c black",
+"h. c black",
+"j. c black",
+"k. c black",
+"l. c black",
+"z. c black",
+"x. c black",
+"c. c black",
+"v. c black",
+"b. c black",
+"n. c black",
+"m. c black",
+"M. c black",
+"N. c black",
+"B. c black",
+"V. c black",
+"C. c black",
+"Z. c black",
+"A. c black",
+"S. c black",
+"D. c black",
+"F. c black",
+"G. c black",
+"H. c black",
+"J. c black",
+"K. c black",
+"L. c black",
+"P. c black",
+"I. c black",
+"U. c black",
+"Y. c black",
+"T. c black",
+"R. c black",
+"E. c black",
+"W. c black",
+"Q. c black",
+"!. c black",
+"~. c black",
+"^. c black",
+"/. c black",
+"(. c black",
+"). c black",
+"_. c black",
+"`. c black",
+"'. c black",
+"]. c black",
+"[. c black",
+"{. c black",
+"}. c black",
+"|. c black",
+" X c black",
+".X c black",
+"XX c black",
+"oX c black",
+"OX c black",
+"+X c black",
+"@X c black",
+"#X c black",
+"$X c black",
+"%X c black",
+"&X c black",
+"*X c black",
+"=X c black",
+"-X c black",
+";X c black",
+":X c black",
+">X c black",
+",X c black",
+"<X c black",
+"1X c black",
+"2X c black",
+"3X c black",
+"4X c black",
+"5X c black",
+"6X c black",
+"7X c black",
+"8X c black",
+"9X c black",
+"0X c black",
+"qX c black",
+"wX c black",
+"eX c black",
+"rX c black",
+"tX c black",
+"yX c black",
+"uX c black",
+"iX c black",
+"pX c black",
+"aX c black",
+"sX c black",
+"dX c black",
+"fX c black",
+"gX c black",
+"hX c black",
+"jX c black",
+"kX c black",
+"lX c black",
+"zX c black",
+"xX c black",
+"cX c black",
+"vX c black",
+"bX c black",
+"nX c black",
+"mX c black",
+"MX c black",
+"NX c black",
+"BX c black",
+"VX c black",
+"CX c black",
+"ZX c black",
+"AX c black",
+"SX c black",
+"DX c black",
+"FX c black",
+"GX c black",
+"HX c black",
+"JX c black",
+"KX c black",
+"LX c black",
+"PX c black",
+"IX c black",
+"UX c black",
+/* pixels */
+" ",
+" ",
+" ",
+" ",
+" ",
+" ",
+" ",
+" 6 N G x 2 g ",
+" j R +.6.4.I u _ S ",
+" p .| z h M ] I e 6 _ q.b ",
+" L -.a X X . l +.L Y T ..,.>.B ",
+" 6 ` { . % * X 9 | _ q.5.>.$.,.5.v ",
+" 6 ` X.5 % & X y .Y ,.,.$.$.5.[ g ",
+" A 0.C 8 . 9 D $.c b b ^ q./ p ",
+" e P 2.Q H ~ #.Z ^ %.u ",
+" e K O.%.} V 4 4 F j ",
+" w s 4 ",
+" ",
+" ",
+" ",
+" ",
+" ",
+" ",
+" "
+};
--- /dev/null
+/* XPM */
+static char *last[] = {
+/* columns rows colors chars-per-pixel */
+"24 24 256 2 ",
+" c None",
+". c #FDFDFD",
+"X c #FCFBF8",
+"o c #F9F7F6",
+"O c #F8F7F7",
+"+ c gray97",
+"@ c #F6F5F3",
+"# c #F5F5F6",
+"$ c gray96",
+"% c #F3F3F3",
+"& c #F1F0EE",
+"* c #F0EFEE",
+"= c #EFEFEF",
+"- c #ECEBE9",
+"; c #EBE9E6",
+": c #EBE8E5",
+"> c #E9E8E6",
+", c #E8E7E5",
+"< c #E7E6E3",
+"1 c #E6E5E3",
+"2 c #E5E3DF",
+"3 c gray88",
+"4 c #E0DDD8",
+"5 c gray86",
+"6 c #CBC9C6",
+"7 c #CAC8C6",
+"8 c #C6C3BF",
+"9 c #8D8980",
+"0 c #687280",
+"q c #687080",
+"w c #656565",
+"e c #606971",
+"r c #5D626A",
+"t c #5B5A57",
+"y c #595A5A",
+"u c #4F9BFF",
+"i c #4F95FF",
+"p c #4E96FF",
+"a c #4E95FF",
+"s c #4E95F9",
+"d c #4E4D4C",
+"f c #4D96FF",
+"g c #4D90F3",
+"h c #4C4B4B",
+"j c #4B90F8",
+"k c #4A8EF4",
+"l c #4A8BEE",
+"z c #4A4949",
+"x c #4A484B",
+"c c #498FF6",
+"v c #498EF5",
+"b c #498BEF",
+"n c #4890F9",
+"m c #488FF8",
+"M c #4787E7",
+"N c #474546",
+"B c #4377CB",
+"V c #434447",
+"C c gray26",
+"Z c #40403F",
+"A c #3F79CF",
+"S c #3F76C8",
+"D c #3E3E3D",
+"F c #3D72C1",
+"G c #3C76CB",
+"H c #3C71BF",
+"J c #3B7AD5",
+"K c #3B6EBF",
+"L c #3B3939",
+"P c #3A6AB7",
+"I c #3976CE",
+"U c #393939",
+"Y c #3875CD",
+"T c #386EC2",
+"R c #3466B4",
+"E c #313131",
+"W c #2A2A2E",
+"Q c #282726",
+"! c #26569B",
+"~ c #265296",
+"^ c #26467B",
+"/ c #255398",
+"( c #21232D",
+") c #1E4782",
+"_ c #1E232E",
+"` c #1E232B",
+"' c #1C4580",
+"] c #1C212B",
+"[ c #1C212A",
+"{ c #1B4073",
+"} c #193968",
+"| c #173763",
+" . c #151F29",
+".. c #151727",
+"X. c #133565",
+"o. c #133062",
+"O. c #131E2B",
+"+. c #131D2B",
+"@. c #12161D",
+"#. c #111B2B",
+"$. c #050D18",
+"%. c #000E25",
+"&. c #00000A",
+"*. c black",
+"=. c black",
+"-. c black",
+";. c black",
+":. c black",
+">. c black",
+",. c black",
+"<. c black",
+"1. c black",
+"2. c black",
+"3. c black",
+"4. c black",
+"5. c black",
+"6. c black",
+"7. c black",
+"8. c black",
+"9. c black",
+"0. c black",
+"q. c black",
+"w. c black",
+"e. c black",
+"r. c black",
+"t. c black",
+"y. c black",
+"u. c black",
+"i. c black",
+"p. c black",
+"a. c black",
+"s. c black",
+"d. c black",
+"f. c black",
+"g. c black",
+"h. c black",
+"j. c black",
+"k. c black",
+"l. c black",
+"z. c black",
+"x. c black",
+"c. c black",
+"v. c black",
+"b. c black",
+"n. c black",
+"m. c black",
+"M. c black",
+"N. c black",
+"B. c black",
+"V. c black",
+"C. c black",
+"Z. c black",
+"A. c black",
+"S. c black",
+"D. c black",
+"F. c black",
+"G. c black",
+"H. c black",
+"J. c black",
+"K. c black",
+"L. c black",
+"P. c black",
+"I. c black",
+"U. c black",
+"Y. c black",
+"T. c black",
+"R. c black",
+"E. c black",
+"W. c black",
+"Q. c black",
+"!. c black",
+"~. c black",
+"^. c black",
+"/. c black",
+"(. c black",
+"). c black",
+"_. c black",
+"`. c black",
+"'. c black",
+"]. c black",
+"[. c black",
+"{. c black",
+"}. c black",
+"|. c black",
+" X c black",
+".X c black",
+"XX c black",
+"oX c black",
+"OX c black",
+"+X c black",
+"@X c black",
+"#X c black",
+"$X c black",
+"%X c black",
+"&X c black",
+"*X c black",
+"=X c black",
+"-X c black",
+";X c black",
+":X c black",
+">X c black",
+",X c black",
+"<X c black",
+"1X c black",
+"2X c black",
+"3X c black",
+"4X c black",
+"5X c black",
+"6X c black",
+"7X c black",
+"8X c black",
+"9X c black",
+"0X c black",
+"qX c black",
+"wX c black",
+"eX c black",
+"rX c black",
+"tX c black",
+"yX c black",
+"uX c black",
+"iX c black",
+"pX c black",
+"aX c black",
+"sX c black",
+"dX c black",
+"fX c black",
+"gX c black",
+"hX c black",
+"jX c black",
+"kX c black",
+"lX c black",
+"zX c black",
+"xX c black",
+"cX c black",
+"vX c black",
+"bX c black",
+"nX c black",
+"mX c black",
+"MX c black",
+"NX c black",
+"BX c black",
+"VX c black",
+"CX c black",
+"ZX c black",
+"AX c black",
+"SX c black",
+"DX c black",
+"FX c black",
+"GX c black",
+"HX c black",
+"JX c black",
+"KX c black",
+"LX c black",
+"PX c black",
+"IX c black",
+"UX c black",
+/* pixels */
+" ",
+" ",
+" ",
+" ",
+" ",
+" = + X ",
+" o D t + . . . ",
+" o W &.e + .i . ",
+" + < ; ; 2 ; 4 Q ) ! 0 .i . ",
+" w @._ _ ( _ _ ..P i ~ e .i . ",
+" N | S K T H H B l k m ! y = .i . ",
+" d ) u i i i i i k l i m %.9 .i . ",
+" N | J S J S S J M i k { d < .i . ",
+" y $. . . . . . .R g | Z < .i . ",
+" < 8 6 6 6 6 8 W ^ | N ; .i . ",
+" D *.d = .i . ",
+" + D d * . . . ",
+" 5 + ",
+" ",
+" ",
+" ",
+" ",
+" ",
+" "
+};
--- /dev/null
+/* XPM */
+static char *link[] = {
+/* columns rows colors chars-per-pixel */
+"24 24 256 2 ",
+" c None",
+". c #FCF7F0",
+"X c #F7F4F0",
+"o c #F3F3F3",
+"O c #F2F7FF",
+"+ c #F1F6FF",
+"@ c #EFEFEF",
+"# c #EEEEEF",
+"$ c #EEEEEE",
+"% c #E7F1FE",
+"& c #E3E7EE",
+"* c #DFEAFC",
+"= c #DCE8FC",
+"- c #D9E8FF",
+"; c #D8E7FC",
+": c #D8E6FE",
+"> c #D8E6FC",
+", c #D8E5FB",
+"< c #D5E3FB",
+"1 c #D1E3FD",
+"2 c #D0E0FB",
+"3 c #CBE0FD",
+"4 c #CBDDFB",
+"5 c #CADDFA",
+"6 c #C7DDFC",
+"7 c #C0D0EB",
+"8 c #B4D5FE",
+"9 c #B4D0FB",
+"0 c #B4CFF9",
+"q c #B1D0FC",
+"w c #AACBFB",
+"e c #A8C7F9",
+"r c #A6C7FA",
+"t c #A1C1F7",
+"y c #989898",
+"u c #96BBF7",
+"i c #93BAF7",
+"p c #89B2F5",
+"a c #808080",
+"s c #7D7B7A",
+"d c #7B7A7A",
+"f c gray48",
+"g c #72A5F5",
+"h c #71A4F4",
+"j c #717171",
+"k c #6DA2F8",
+"l c #68A0F5",
+"z c #659FF6",
+"x c #646464",
+"c c #5E96E8",
+"v c #5A9AFC",
+"b c #5A95F2",
+"n c #5893F2",
+"m c #5294F9",
+"M c gray30",
+"N c #4C8AEF",
+"B c #4B8AF0",
+"V c #4A8CF2",
+"C c #4488F2",
+"Z c #4487F1",
+"A c #4486F0",
+"S c #4385F0",
+"D c #4186F2",
+"F c #4085F1",
+"G c #3F83EF",
+"H c #3D81EF",
+"J c #3D81EE",
+"K c gray24",
+"L c #3C7DE7",
+"P c #3B81EF",
+"I c #3A81F2",
+"U c #3A81F0",
+"Y c #3980F0",
+"T c #393631",
+"R c #3880F1",
+"E c gray22",
+"W c #383531",
+"Q c #357CEF",
+"! c #357BED",
+"~ c #347BED",
+"^ c #3380F6",
+"/ c #337BEE",
+"( c #33322F",
+") c #323232",
+"_ c #323130",
+"` c #313030",
+"' c #3079EE",
+"] c gray19",
+"[ c #2F2F30",
+"{ c #2F2F2F",
+"} c #2E78EF",
+"| c #2D77EE",
+" . c #2876EF",
+".. c #2776F0",
+"X. c #2271EE",
+"o. c #151F2E",
+"O. c #0E0E0E",
+"+. c #050200",
+"@. c #040200",
+"#. c black",
+"$. c black",
+"%. c black",
+"&. c black",
+"*. c black",
+"=. c black",
+"-. c black",
+";. c black",
+":. c black",
+">. c black",
+",. c black",
+"<. c black",
+"1. c black",
+"2. c black",
+"3. c black",
+"4. c black",
+"5. c black",
+"6. c black",
+"7. c black",
+"8. c black",
+"9. c black",
+"0. c black",
+"q. c black",
+"w. c black",
+"e. c black",
+"r. c black",
+"t. c black",
+"y. c black",
+"u. c black",
+"i. c black",
+"p. c black",
+"a. c black",
+"s. c black",
+"d. c black",
+"f. c black",
+"g. c black",
+"h. c black",
+"j. c black",
+"k. c black",
+"l. c black",
+"z. c black",
+"x. c black",
+"c. c black",
+"v. c black",
+"b. c black",
+"n. c black",
+"m. c black",
+"M. c black",
+"N. c black",
+"B. c black",
+"V. c black",
+"C. c black",
+"Z. c black",
+"A. c black",
+"S. c black",
+"D. c black",
+"F. c black",
+"G. c black",
+"H. c black",
+"J. c black",
+"K. c black",
+"L. c black",
+"P. c black",
+"I. c black",
+"U. c black",
+"Y. c black",
+"T. c black",
+"R. c black",
+"E. c black",
+"W. c black",
+"Q. c black",
+"!. c black",
+"~. c black",
+"^. c black",
+"/. c black",
+"(. c black",
+"). c black",
+"_. c black",
+"`. c black",
+"'. c black",
+"]. c black",
+"[. c black",
+"{. c black",
+"}. c black",
+"|. c black",
+" X c black",
+".X c black",
+"XX c black",
+"oX c black",
+"OX c black",
+"+X c black",
+"@X c black",
+"#X c black",
+"$X c black",
+"%X c black",
+"&X c black",
+"*X c black",
+"=X c black",
+"-X c black",
+";X c black",
+":X c black",
+">X c black",
+",X c black",
+"<X c black",
+"1X c black",
+"2X c black",
+"3X c black",
+"4X c black",
+"5X c black",
+"6X c black",
+"7X c black",
+"8X c black",
+"9X c black",
+"0X c black",
+"qX c black",
+"wX c black",
+"eX c black",
+"rX c black",
+"tX c black",
+"yX c black",
+"uX c black",
+"iX c black",
+"pX c black",
+"aX c black",
+"sX c black",
+"dX c black",
+"fX c black",
+"gX c black",
+"hX c black",
+"jX c black",
+"kX c black",
+"lX c black",
+"zX c black",
+"xX c black",
+"cX c black",
+"vX c black",
+"bX c black",
+"nX c black",
+"mX c black",
+"MX c black",
+"NX c black",
+"BX c black",
+"VX c black",
+"CX c black",
+"ZX c black",
+"AX c black",
+"SX c black",
+"DX c black",
+"FX c black",
+"GX c black",
+"HX c black",
+"JX c black",
+"KX c black",
+"LX c black",
+"PX c black",
+"IX c black",
+"UX c black",
+/* pixels */
+" ",
+" ",
+" ",
+" ",
+" ",
+" y ) ) K M X j K ) ) x ",
+" y { { O.+.@ [ +.{ ) x ",
+" s +.@ { ) ",
+" s +.@ 4 8 < w ) ) ",
+" s +.@ ; L u 4 Q 8 { [ ",
+" s +.. ; B | r < Q I 0 ) ) ",
+" s +.7 m I G b g z I G I 8 ( ( ",
+" s +.c ^ Z C Q ..} Z Z Q v o.T ",
+" s +.& k Q G g t p G I B * ) ) ",
+" s +.X O z X.e * | N < ( ) ",
+" s +.@ O b u 6 Z < [ [ ",
+" a +.@ % 3 * 3 { ) ",
+" y ) [ O.+.@ ) +.[ ) x ",
+" y [ { K M X j K { ) x ",
+" ",
+" ",
+" ",
+" ",
+" "
+};
--- /dev/null
+/* XPM */
+static char *macro[] = {
+/* columns rows colors chars-per-pixel */
+"24 24 256 2 ",
+" c None",
+". c #FFFF93",
+"X c #FFFF92",
+"o c #FFFF90",
+"O c #FFFF8F",
+"+ c #FFFF8E",
+"@ c #FFFF8D",
+"# c #FFFF8C",
+"$ c #FFFF8B",
+"% c #FFFF8A",
+"& c #FFFF89",
+"* c #FFFC8E",
+"= c #FFFC8A",
+"- c #FFFB8D",
+"; c #FFFB8C",
+": c #FFFB8B",
+"> c #FFFB8A",
+", c #FFFB89",
+"< c #FFFB88",
+"1 c #FFFA8C",
+"2 c #FFFA8B",
+"3 c #FFFA8A",
+"4 c #FFFA89",
+"5 c #FFFA88",
+"6 c #FFFA87",
+"7 c #FFF98B",
+"8 c #FFF98A",
+"9 c #FFF989",
+"0 c #FFF988",
+"q c #FFF88A",
+"w c #FFF889",
+"e c #FFF888",
+"r c #FFF886",
+"t c #FFF78B",
+"y c #FFF78A",
+"u c #FFF789",
+"i c #FFF788",
+"p c #FFF787",
+"a c #FFF786",
+"s c #FFF785",
+"d c #FFF68A",
+"f c #F9F788",
+"g c #F8F488",
+"h c #F2F189",
+"j c #F2F187",
+"k c #F2F080",
+"l c #F2EF84",
+"z c #F2EF83",
+"x c #F2EF81",
+"c c #DEDB81",
+"v c #DCD97E",
+"b c gray86",
+"n c #D8D47B",
+"m c #D8D17C",
+"M c #D7D7D7",
+"N c #D7D4D4",
+"B c #D6D4D4",
+"V c #D6D3D4",
+"C c #D4D3D3",
+"Z c #D4D2D3",
+"A c #D4D1D2",
+"S c LightGray",
+"D c #D2D1D2",
+"F c #D2CF7A",
+"G c #D1CE78",
+"H c #D1CD78",
+"J c #D1CC78",
+"K c #D1CB7B",
+"L c #D1CB79",
+"P c #D1CB77",
+"I c #D1CA77",
+"U c #D0CF7A",
+"Y c #D0CE79",
+"T c #D0CD7A",
+"R c #D0CC79",
+"E c #D0CB79",
+"W c #CFCC79",
+"Q c #CFCB79",
+"! c #CEC875",
+"~ c #AEAEAE",
+"^ c #AEADAD",
+"/ c #AEACAC",
+"( c #AEABAC",
+") c #A8A5A6",
+"_ c #A8A5A5",
+"` c #A7A6A6",
+"' c #838180",
+"] c #817E50",
+"[ c #817B51",
+"{ c #817B50",
+"} c #7E7C50",
+"| c #7E7C4F",
+" . c #7E7C4E",
+".. c #7E7A50",
+"X. c #7E7951",
+"o. c #7E7850",
+"O. c #7E784F",
+"+. c #7D7656",
+"@. c #7D7454",
+"#. c #7D7353",
+"$. c #7C764E",
+"%. c #787877",
+"&. c #787575",
+"*. c #77787D",
+"=. c #77747A",
+"-. c #767379",
+";. c #757379",
+":. c #74747B",
+">. c #74737A",
+",. c #747178",
+"<. c #747177",
+"1. c #727049",
+"2. c #726F4D",
+"3. c #716E4B",
+"4. c #706D6E",
+"5. c #706D6C",
+"6. c #706A4D",
+"7. c #6C6D72",
+"8. c #6C6C71",
+"9. c #6B686D",
+"0. c #696970",
+"q. c #69676E",
+"w. c #69676D",
+"e. c #69666D",
+"r. c #69656C",
+"t. c #5D5D42",
+"y. c #5D5D40",
+"u. c #5D5C40",
+"i. c #5D5B40",
+"p. c #5C5C41",
+"a. c #5B5B3E",
+"s. c #5B5A3D",
+"d. c #5B593E",
+"f. c #5B593C",
+"g. c #5B583D",
+"h. c #5B583C",
+"j. c #5B573B",
+"k. c #5A5A3F",
+"l. c #595741",
+"z. c #595338",
+"x. c #555355",
+"c. c #55533D",
+"v. c #555148",
+"b. c #54553F",
+"n. c #534E4B",
+"m. c #525039",
+"M. c #51503C",
+"N. c #4F4C37",
+"B. c #4B4732",
+"V. c #484748",
+"C. c #474344",
+"Z. c #47413F",
+"A. c #464448",
+"S. c #454341",
+"D. c #44413F",
+"F. c #413D33",
+"G. c #403C3C",
+"H. c #3B3931",
+"J. c #3A3A3C",
+"K. c #353538",
+"L. c #34343F",
+"P. c #34312D",
+"I. c #34302F",
+"U. c #33333E",
+"Y. c #33323D",
+"T. c #32333E",
+"R. c #32323D",
+"E. c #32313C",
+"W. c #322F3B",
+"Q. c #31313D",
+"!. c #30313D",
+"~. c #2F303C",
+"^. c #2E2B29",
+"/. c #27262A",
+"(. c #27252A",
+"). c #272529",
+"_. c #272327",
+"`. c #272226",
+"'. c #26262A",
+"]. c #26252A",
+"[. c #262429",
+"{. c #262325",
+"}. c #262227",
+"|. c #262125",
+" X c #252127",
+".X c #252123",
+"XX c #231E22",
+"oX c black",
+"OX c black",
+"+X c black",
+"@X c black",
+"#X c black",
+"$X c black",
+"%X c black",
+"&X c black",
+"*X c black",
+"=X c black",
+"-X c black",
+";X c black",
+":X c black",
+">X c black",
+",X c black",
+"<X c black",
+"1X c black",
+"2X c black",
+"3X c black",
+"4X c black",
+"5X c black",
+"6X c black",
+"7X c black",
+"8X c black",
+"9X c black",
+"0X c black",
+"qX c black",
+"wX c black",
+"eX c black",
+"rX c black",
+"tX c black",
+"yX c black",
+"uX c black",
+"iX c black",
+"pX c black",
+"aX c black",
+"sX c black",
+"dX c black",
+"fX c black",
+"gX c black",
+"hX c black",
+"jX c black",
+"kX c black",
+"lX c black",
+"zX c black",
+"xX c black",
+"cX c black",
+"vX c black",
+"bX c black",
+"nX c black",
+"mX c black",
+"MX c black",
+"NX c black",
+"BX c black",
+"VX c black",
+"CX c black",
+"ZX c black",
+"AX c black",
+"SX c black",
+"DX c black",
+"FX c black",
+"GX c black",
+"HX c black",
+"JX c black",
+"KX c black",
+"LX c black",
+"PX c black",
+"IX c black",
+"UX c black",
+/* pixels */
+" ",
+" ",
+" ",
+" ",
+" ",
+" M &.=.=.' *.=.=.=.=.=.=.<.=.=.=.&.M ",
+" M Z./.c.l.J.c.t.t.t.t.t.t.t.a.t.N._.C.M ",
+" M Z.F.+.p v ~.n . O O O O O O O O j +.C.n.M ",
+" ) _.2.l O W W.F . O 6 O 6 6 6 t p O l 2.^.` ",
+" ~ _.| O O P K.F O 6 O p O 6 O p t p O | _.~ ",
+" ~ _.| O O W K.F O O p O p O p O 6 O O } _.~ ",
+" ~ _.| O O W K.F O p t O t p O t p t 6 $./.~ ",
+" ~ /.| 6 O P K.W O O 6 t 6 O p t O 6 O | _.~ ",
+" ~ /.} O O F W.W O O O O O 6 O p p t 6 } /.~ ",
+" ~ /.| O O W K.F O p p p p t p p t 6 O ] /.~ ",
+" ) _.1.j O ! W.F O O t p O p O p p O l 2.XX) ",
+" M Z.H.+.p c K.F . O O O O O O O O j $.C.x.M ",
+" M J.P.c.c.K.c.a.j.a.a.a.a.j.j.a.B.P.n.b ",
+" M 4.7.9.*.7.q.q.q.q.q.q.9.q.q.q.4.M ",
+" ",
+" ",
+" ",
+" ",
+" "
+};
--- /dev/null
+/* XPM */
+static char *macro_call[] = {
+/* columns rows colors chars-per-pixel */
+"24 24 256 2 ",
+" c None",
+". c #FFFF91",
+"X c #FFFF90",
+"o c #FFFF8F",
+"O c #FFFF8E",
+"+ c #FFFF8D",
+"@ c #FFFF8C",
+"# c #FFFF8B",
+"$ c #FFFF8A",
+"% c #FFFF89",
+"& c #FFFE8B",
+"* c #FFFE89",
+"= c #FFFE88",
+"- c #FFFD8C",
+"; c #FFFD8B",
+": c #FFFC8C",
+"> c #FFFC8B",
+", c #FFFC8A",
+"< c #FFFC88",
+"1 c #FFFB8C",
+"2 c #FFFB8B",
+"3 c #FFFB8A",
+"4 c #FFFB89",
+"5 c #FFFA8B",
+"6 c #FFFA8A",
+"7 c #FFFA88",
+"8 c #FFF98B",
+"9 c #FFF98A",
+"0 c #FFF989",
+"q c #FFF988",
+"w c #FFF987",
+"e c #FFF88B",
+"r c #FFF88A",
+"t c #FFF889",
+"y c #FFF887",
+"u c #FFF789",
+"i c #FFF788",
+"p c #FFF787",
+"a c #FFF68A",
+"s c #FFF689",
+"d c #FFF687",
+"f c #F3E67F",
+"g c #F2E881",
+"h c #F1E57F",
+"j c #F0E47E",
+"k c #EEE07E",
+"l c #EEDE7D",
+"z c #EEDE7B",
+"x c #DCDCDB",
+"c c #DBD176",
+"v c #DBD175",
+"b c #DAD174",
+"n c #DACF73",
+"m c #D7CD72",
+"M c #D7CC75",
+"N c #D7CC72",
+"B c #D7CA73",
+"V c #D7CA72",
+"C c #D7CA71",
+"Z c gray84",
+"A c #D6D27E",
+"S c #D5D6D6",
+"D c #D5D5D5",
+"F c #D5CF76",
+"G c #D4CF7C",
+"H c #D4CE7B",
+"J c #D2CE78",
+"K c #D2CC7A",
+"L c #D1CE7D",
+"P c #D1CB75",
+"I c #D0CF79",
+"U c #D0CE7A",
+"Y c #D0CE78",
+"T c #D0CD79",
+"R c #D0CC7A",
+"E c #D0C977",
+"W c #CFCC76",
+"Q c #CFCC75",
+"! c #C4BA70",
+"~ c #C3C3C3",
+"^ c gray76",
+"/ c #C2B86E",
+"( c #C0C0C1",
+") c #C0C0C0",
+"_ c #C0B366",
+"` c gray75",
+"' c gray",
+"] c #BEBDBE",
+"[ c #BEBCBE",
+"{ c #BEBCBD",
+"} c #BDBCBE",
+"| c #BDB064",
+" . c #BCBDBE",
+".. c #BCBABB",
+"X. c #BBBCBD",
+"o. c #BBBABB",
+"O. c #BBBABA",
+"+. c #BBAE63",
+"@. c #BBAD62",
+"#. c #BABBBB",
+"$. c #BAAE63",
+"%. c #BAAD63",
+"&. c #BAAD62",
+"*. c #B9BABC",
+"=. c #B5AB68",
+"-. c #B1A766",
+";. c #AA9C5B",
+":. c #9C9057",
+">. c #878383",
+",. c #838080",
+"<. c #837F7F",
+"1. c #7F7C4D",
+"2. c #7D794F",
+"3. c #7C7A4C",
+"4. c #7C7878",
+"5. c #7C774D",
+"6. c #7C764C",
+"7. c #7C754C",
+"8. c #7C744D",
+"9. c #7B794E",
+"0. c #7A787C",
+"q. c #797B7F",
+"w. c #787575",
+"e. c #77787D",
+"r. c #77777C",
+"t. c #77757A",
+"y. c #77747A",
+"u. c #76777D",
+"i. c #767676",
+"p. c #76757A",
+"a. c #767476",
+"s. c #756A46",
+"d. c #747477",
+"f. c #717072",
+"g. c #706E71",
+"h. c #6F6D71",
+"j. c #6E7074",
+"k. c #6E7073",
+"l. c #6E6F73",
+"z. c #6E6E6F",
+"x. c #6E6D71",
+"c. c #6E6D70",
+"v. c #6E6C70",
+"b. c #6C6A6E",
+"n. c #6B6C70",
+"m. c #6B6A6D",
+"M. c #6A6A6C",
+"N. c #6A6744",
+"B. c #4F4935",
+"V. c #4F4736",
+"C. c #4E4634",
+"Z. c #4E4433",
+"A. c #4D4835",
+"S. c #4D4735",
+"D. c #4D4635",
+"F. c #4D4433",
+"G. c #494537",
+"H. c #3F382D",
+"J. c #3E3931",
+"K. c #3E382E",
+"L. c #3E382D",
+"P. c #3E352B",
+"I. c #3D3A39",
+"U. c #3D3A2E",
+"Y. c #3D392D",
+"T. c #3D382E",
+"R. c #3D382D",
+"E. c #3D3736",
+"W. c #3C3C3D",
+"Q. c #3C3837",
+"!. c #3C3830",
+"~. c #3B3635",
+"^. c #3B3534",
+"/. c #3A3B3C",
+"(. c #3A3938",
+"). c #3A3837",
+"_. c #3A3329",
+"`. c #373941",
+"'. c #34323D",
+"]. c #33343F",
+"[. c #33323D",
+"{. c #333135",
+"}. c #32343E",
+"|. c #32333E",
+" X c #32323D",
+".X c #323034",
+"XX c #322F34",
+"oX c #313236",
+"OX c #31313D",
+"+X c #313136",
+"@X c #313135",
+"#X c #313131",
+"$X c #313035",
+"%X c #313034",
+"&X c #312E33",
+"*X c #312E27",
+"=X c #30313D",
+"-X c #302F2F",
+";X c #2F2E2F",
+":X c #2F2A24",
+">X c #2E2A29",
+",X c #292421",
+"<X c black",
+"1X c black",
+"2X c black",
+"3X c black",
+"4X c black",
+"5X c black",
+"6X c black",
+"7X c black",
+"8X c black",
+"9X c black",
+"0X c black",
+"qX c black",
+"wX c black",
+"eX c black",
+"rX c black",
+"tX c black",
+"yX c black",
+"uX c black",
+"iX c black",
+"pX c black",
+"aX c black",
+"sX c black",
+"dX c black",
+"fX c black",
+"gX c black",
+"hX c black",
+"jX c black",
+"kX c black",
+"lX c black",
+"zX c black",
+"xX c black",
+"cX c black",
+"vX c black",
+"bX c black",
+"nX c black",
+"mX c black",
+"MX c black",
+"NX c black",
+"BX c black",
+"VX c black",
+"CX c black",
+"ZX c black",
+"AX c black",
+"SX c black",
+"DX c black",
+"FX c black",
+"GX c black",
+"HX c black",
+"JX c black",
+"KX c black",
+"LX c black",
+"PX c black",
+"IX c black",
+"UX c black",
+/* pixels */
+" ",
+" ",
+" ",
+" ",
+" ",
+" x >.i.r.r.4.>.4.e.e.e.e.e.r.r.e.r.r.r.i.<.Z ",
+" ` {.*XV.V.V.I.I.B.B.B.B.B.B.V.V.V.V.V.P.;X` ",
+" ~ XXs.k f / '.! g k k k k k k k l l k ;.E.` ",
+" ~ XX1.. o G '.A . o o o o o o o w o w | E.` ",
+" ` {.5.o o m '.G o o w o w w o p p p o +.E.` ",
+" ~ {.1.w o G '.W o p o p w o p o u w w +.E.` ",
+" ~ XX5.o w G '.G o o o p o p u p u p o +.E.` ",
+" ~ {.1.o o W '.G o p o u o o w u p u o +.E.` ",
+" ` {.5.w o W '.W o o p o p p o o p u w | E.` ",
+" ~ {.5.w o G '.W o p o p o o p p p o w -.E.` ",
+" ~ {.1.o o m '.A o o w o o o o o o w o _ {.` ",
+" ~ XXN.c c =.`.-.c m m m m m m m m m n :.J.` ",
+" ` ;X,XH.H.J.'.J.H.H.H.H.H.H.H.H.P.H.P.:X;X` ",
+" Z 4.z.z.h.j.w.i.j.h.j.j.h.h.j.h.h.z.z.z.i.Z ",
+" ",
+" ",
+" ",
+" ",
+" "
+};
--- /dev/null
+/* XPM */
+static char *model[] = {
+/* columns rows colors chars-per-pixel */
+"18 19 256 2 ",
+" c None",
+". c #FFFFB6",
+"X c #FFFFAE",
+"o c #FFFFA8",
+"O c #FFFF9B",
+"+ c #FFFF9A",
+"@ c #FFFF99",
+"# c #FFFF97",
+"$ c #FFFF96",
+"% c #FFFF94",
+"& c #FFFF93",
+"* c #FFFF92",
+"= c #FFFF91",
+"- c #FFFF90",
+"; c #FFFF8F",
+": c #FFFF8E",
+"> c #FFFF87",
+", c #FFFE8F",
+"< c #FFFE8E",
+"1 c #FFFE8D",
+"2 c #FFFE8C",
+"3 c #FFFD8E",
+"4 c #FFFD8D",
+"5 c #FFFC8E",
+"6 c #FFFC8C",
+"7 c #FFFC8B",
+"8 c #FFFC84",
+"9 c #FFFB8C",
+"0 c #FFFA8C",
+"q c #FFFA8A",
+"w c #FFF98C",
+"e c #FFF88C",
+"r c #FDFEAA",
+"t c #FDF88B",
+"y c #FCF88B",
+"u c #F9F9F9",
+"i c #F7F389",
+"p c #F6F488",
+"a c #F4F4F4",
+"s c #F4F3F3",
+"d c #F4F38D",
+"f c #F4F38C",
+"g c #F4F188",
+"h c #F4F187",
+"j c #F4F088",
+"k c #F3F3F3",
+"l c #F3F38D",
+"z c #F3F38B",
+"x c #F3F187",
+"c c #F3F087",
+"v c #F3EF87",
+"b c #F3EE87",
+"n c #F3ED87",
+"m c #F3EC87",
+"M c gray95",
+"N c #F2EC87",
+"B c #F1F1F1",
+"V c #EFF0F0",
+"C c #EEEFEF",
+"Z c #EEEEEE",
+"A c #EEEE82",
+"S c #EDEEEE",
+"D c #ECE985",
+"F c #DFDD80",
+"G c #DCD67C",
+"H c #DADB80",
+"J c gray84",
+"K c #D3D17B",
+"L c #D3CF7B",
+"P c #D2D27B",
+"I c #D2D17A",
+"U c #D2CE7B",
+"Y c #D2CD7B",
+"T c #D1CD7B",
+"R c #D0D07A",
+"E c #D0CF7A",
+"W c #D0CE7A",
+"Q c #CFCF78",
+"! c #CFCD79",
+"~ c #CFCB79",
+"^ c #CFCA7A",
+"/ c #CCC878",
+"( c #CBCB79",
+") c #C8C377",
+"_ c #BAB96E",
+"` c gray72",
+"' c #B6B5B5",
+"] c #B0B0A9",
+"[ c #AEAC6C",
+"{ c #A9AA92",
+"} c #A7A7A7",
+"| c #A7A38E",
+" . c #A7A368",
+".. c #A3A36D",
+"X. c #A39F66",
+"o. c #A29E66",
+"O. c #A1A16D",
+"+. c #A1A165",
+"@. c #A19A65",
+"#. c #A0A169",
+"$. c #A09E67",
+"%. c #9F9EA1",
+"&. c #9F9E9F",
+"*. c #9F9D64",
+"=. c #9E9C64",
+"-. c #9D9D9F",
+";. c #9D9D68",
+":. c #9D9D67",
+">. c #9D9964",
+",. c #9C9E63",
+"<. c #9C9D9F",
+"1. c #9C9D68",
+"2. c #9C9D65",
+"3. c #9C9D63",
+"4. c #9C9C9F",
+"5. c #9C9C9E",
+"6. c #9C9C9D",
+"7. c #9C9C68",
+"8. c #9C9B63",
+"9. c #9C9A63",
+"0. c #9B9B9B",
+"q. c #9B9B63",
+"w. c #9B9A63",
+"e. c #99999A",
+"r. c #969761",
+"t. c #878686",
+"y. c #84845F",
+"u. c #84845C",
+"i. c #797A79",
+"p. c #757351",
+"a. c #737053",
+"s. c #6F7054",
+"d. c #6D6970",
+"f. c #6D696A",
+"g. c #6D674C",
+"h. c #6C6A6A",
+"j. c #6B6870",
+"k. c #6B684C",
+"l. c #6B674C",
+"z. c #6A6868",
+"x. c #6A6854",
+"c. c #69696D",
+"v. c DimGray",
+"b. c #69674B",
+"n. c #68686F",
+"m. c #68674A",
+"M. c #68664B",
+"N. c #67674A",
+"B. c #66676E",
+"V. c #66666E",
+"C. c #66666D",
+"Z. c #66644A",
+"A. c #666449",
+"S. c #65666D",
+"D. c #656666",
+"F. c #656653",
+"G. c #656649",
+"H. c #65656D",
+"J. c #656449",
+"K. c #64644F",
+"L. c #636448",
+"P. c #626148",
+"I. c #5E5E5F",
+"U. c #555145",
+"Y. c #535042",
+"T. c #4F4C3E",
+"R. c #4E4B47",
+"E. c gray30",
+"W. c #484837",
+"Q. c #474445",
+"!. c #47434C",
+"~. c #464644",
+"^. c #46434B",
+"/. c #464244",
+"(. c #454543",
+"). c #454444",
+"_. c #45434B",
+"`. c #45433B",
+"'. c #45424B",
+"]. c #454244",
+"[. c #454243",
+"{. c #45423B",
+"}. c #44454E",
+"|. c #44424A",
+" X c #444244",
+".X c #444243",
+"XX c #44423B",
+"oX c #434342",
+"OX c #43424A",
+"+X c #434241",
+"@X c #434142",
+"#X c #433E3A",
+"$X c #42424A",
+"%X c #42414A",
+"&X c #424149",
+"*X c #404049",
+"=X c #404048",
+"-X c #404041",
+";X c #403F48",
+":X c #403E3E",
+">X c #3F4048",
+",X c #3F3F48",
+"<X c #3F3F41",
+"1X c #3F3F40",
+"2X c #3F3F38",
+"3X c #3F3E41",
+"4X c #3F3E38",
+"5X c #3E3F48",
+"6X c #3D3C41",
+"7X c #3C3935",
+"8X c #3B3834",
+"9X c #3A383E",
+"0X c #38353D",
+"qX c #34323D",
+"wX c #34313D",
+"eX c #33313D",
+"rX c #333032",
+"tX c #322F2F",
+"yX c #31303C",
+"uX c #313036",
+"iX c #312F3C",
+"pX c #312F2F",
+"aX c #302E3F",
+"sX c #2F3037",
+"dX c #2F2F3B",
+"fX c #2E2B3B",
+"gX c #2B2A2A",
+"hX c #2B2A28",
+"jX c black",
+"kX c black",
+"lX c black",
+"zX c black",
+"xX c black",
+"cX c black",
+"vX c black",
+"bX c black",
+"nX c black",
+"mX c black",
+"MX c black",
+"NX c black",
+"BX c black",
+"VX c black",
+"CX c black",
+"ZX c black",
+"AX c black",
+"SX c black",
+"DX c black",
+"FX c black",
+"GX c black",
+"HX c black",
+"JX c black",
+"KX c black",
+"LX c black",
+"PX c black",
+"IX c black",
+"UX c black",
+/* pixels */
+" ",
+" } i.i.i.i.i.i.i.i.i.i.e. ",
+" t.a.[ [ [ [ [ [ [ [ p.:Xt. ",
+" t.r.* 4 4 4 4 4 4 d 3.I.E.e. ",
+" t.r.& ; 4 < : : ; y w.i.%.9Xt. ",
+" t.r.; ; y 3 : 2 ; y [ x.s.P.E.` ",
+" t.r.* y i i i i i i D F F / F.` ",
+" t.r.d $.P.P.K.K.K.K.K.K.u.F x.` ",
+" t.r.d u.p._ _ _ _ _ o.K.| F x.` ",
+" t.r.l u.$.5 & = = F 7.{ l D x.` ",
+" t.r.l u.>.y ; : : p.t.l : D x.` ",
+" t.r.l u.>.y : 2 ; [ a.H & D x.` ",
+" t.r.l u.r.H F F F F :.h.T F x.` ",
+" t.r.d r.U.x.s.s.s.s.x.~.p.F x.` ",
+" t.r.& F / ) ) ) ) / / / W F x.` ",
+" t.r.* 4 9 9 9 9 9 * 9 9 9 F x.` ",
+" t.k.[ [ [ [ [ [ [ [ [ [ [ *.U.` ",
+" } i.i.d.i.i.i.i.i.d.i.i.i.d.i.J ",
+" "
+};
--- /dev/null
+/* XPM */
+static char *model3[] = {
+/* columns rows colors chars-per-pixel */
+"24 24 256 2 ",
+" c None",
+". c #FFFFB6",
+"X c #FFFFAE",
+"o c #FFFFA8",
+"O c #FFFF9B",
+"+ c #FFFF9A",
+"@ c #FFFF99",
+"# c #FFFF97",
+"$ c #FFFF96",
+"% c #FFFF94",
+"& c #FFFF93",
+"* c #FFFF92",
+"= c #FFFF91",
+"- c #FFFF90",
+"; c #FFFF8F",
+": c #FFFF8E",
+"> c #FFFF87",
+", c #FFFE8F",
+"< c #FFFE8E",
+"1 c #FFFE8D",
+"2 c #FFFE8C",
+"3 c #FFFD8E",
+"4 c #FFFD8D",
+"5 c #FFFC8E",
+"6 c #FFFC8C",
+"7 c #FFFC8B",
+"8 c #FFFC84",
+"9 c #FFFB8C",
+"0 c #FFFA8C",
+"q c #FFFA8A",
+"w c #FFF98C",
+"e c #FFF88C",
+"r c #FDFEAA",
+"t c #FDF88B",
+"y c #FCF88B",
+"u c #F9F9F9",
+"i c #F7F389",
+"p c #F6F488",
+"a c #F4F4F4",
+"s c #F4F3F3",
+"d c #F4F38D",
+"f c #F4F38C",
+"g c #F4F188",
+"h c #F4F187",
+"j c #F4F088",
+"k c #F3F3F3",
+"l c #F3F38D",
+"z c #F3F38B",
+"x c #F3F187",
+"c c #F3F087",
+"v c #F3EF87",
+"b c #F3EE87",
+"n c #F3ED87",
+"m c #F3EC87",
+"M c gray95",
+"N c #F2EC87",
+"B c #F1F1F1",
+"V c #EFF0F0",
+"C c #EEEFEF",
+"Z c #EEEEEE",
+"A c #EEEE82",
+"S c #EDEEEE",
+"D c #ECE985",
+"F c #DFDD80",
+"G c #DCD67C",
+"H c #DADB80",
+"J c gray84",
+"K c #D3D17B",
+"L c #D3CF7B",
+"P c #D2D27B",
+"I c #D2D17A",
+"U c #D2CE7B",
+"Y c #D2CD7B",
+"T c #D1CD7B",
+"R c #D0D07A",
+"E c #D0CF7A",
+"W c #D0CE7A",
+"Q c #CFCF78",
+"! c #CFCD79",
+"~ c #CFCB79",
+"^ c #CFCA7A",
+"/ c #CCC878",
+"( c #CBCB79",
+") c #C8C377",
+"_ c #BAB96E",
+"` c gray72",
+"' c #B6B5B5",
+"] c #B0B0A9",
+"[ c #AEAC6C",
+"{ c #A9AA92",
+"} c #A7A7A7",
+"| c #A7A38E",
+" . c #A7A368",
+".. c #A3A36D",
+"X. c #A39F66",
+"o. c #A29E66",
+"O. c #A1A16D",
+"+. c #A1A165",
+"@. c #A19A65",
+"#. c #A0A169",
+"$. c #A09E67",
+"%. c #9F9EA1",
+"&. c #9F9E9F",
+"*. c #9F9D64",
+"=. c #9E9C64",
+"-. c #9D9D9F",
+";. c #9D9D68",
+":. c #9D9D67",
+">. c #9D9964",
+",. c #9C9E63",
+"<. c #9C9D9F",
+"1. c #9C9D68",
+"2. c #9C9D65",
+"3. c #9C9D63",
+"4. c #9C9C9F",
+"5. c #9C9C9E",
+"6. c #9C9C9D",
+"7. c #9C9C68",
+"8. c #9C9B63",
+"9. c #9C9A63",
+"0. c #9B9B9B",
+"q. c #9B9B63",
+"w. c #9B9A63",
+"e. c #99999A",
+"r. c #969761",
+"t. c #878686",
+"y. c #84845F",
+"u. c #84845C",
+"i. c #797A79",
+"p. c #757351",
+"a. c #737053",
+"s. c #6F7054",
+"d. c #6D6970",
+"f. c #6D696A",
+"g. c #6D674C",
+"h. c #6C6A6A",
+"j. c #6B6870",
+"k. c #6B684C",
+"l. c #6B674C",
+"z. c #6A6868",
+"x. c #6A6854",
+"c. c #69696D",
+"v. c DimGray",
+"b. c #69674B",
+"n. c #68686F",
+"m. c #68674A",
+"M. c #68664B",
+"N. c #67674A",
+"B. c #66676E",
+"V. c #66666E",
+"C. c #66666D",
+"Z. c #66644A",
+"A. c #666449",
+"S. c #65666D",
+"D. c #656666",
+"F. c #656653",
+"G. c #656649",
+"H. c #65656D",
+"J. c #656449",
+"K. c #64644F",
+"L. c #636448",
+"P. c #626148",
+"I. c #5E5E5F",
+"U. c #555145",
+"Y. c #535042",
+"T. c #4F4C3E",
+"R. c #4E4B47",
+"E. c gray30",
+"W. c #484837",
+"Q. c #474445",
+"!. c #47434C",
+"~. c #464644",
+"^. c #46434B",
+"/. c #464244",
+"(. c #454543",
+"). c #454444",
+"_. c #45434B",
+"`. c #45433B",
+"'. c #45424B",
+"]. c #454244",
+"[. c #454243",
+"{. c #45423B",
+"}. c #44454E",
+"|. c #44424A",
+" X c #444244",
+".X c #444243",
+"XX c #44423B",
+"oX c #434342",
+"OX c #43424A",
+"+X c #434241",
+"@X c #434142",
+"#X c #433E3A",
+"$X c #42424A",
+"%X c #42414A",
+"&X c #424149",
+"*X c #404049",
+"=X c #404048",
+"-X c #404041",
+";X c #403F48",
+":X c #403E3E",
+">X c #3F4048",
+",X c #3F3F48",
+"<X c #3F3F41",
+"1X c #3F3F40",
+"2X c #3F3F38",
+"3X c #3F3E41",
+"4X c #3F3E38",
+"5X c #3E3F48",
+"6X c #3D3C41",
+"7X c #3C3935",
+"8X c #3B3834",
+"9X c #3A383E",
+"0X c #38353D",
+"qX c #34323D",
+"wX c #34313D",
+"eX c #33313D",
+"rX c #333032",
+"tX c #322F2F",
+"yX c #31303C",
+"uX c #313036",
+"iX c #312F3C",
+"pX c #312F2F",
+"aX c #302E3F",
+"sX c #2F3037",
+"dX c #2F2F3B",
+"fX c #2E2B3B",
+"gX c #2B2A2A",
+"hX c #2B2A28",
+"jX c black",
+"kX c black",
+"lX c black",
+"zX c black",
+"xX c black",
+"cX c black",
+"vX c black",
+"bX c black",
+"nX c black",
+"mX c black",
+"MX c black",
+"NX c black",
+"BX c black",
+"VX c black",
+"CX c black",
+"ZX c black",
+"AX c black",
+"SX c black",
+"DX c black",
+"FX c black",
+"GX c black",
+"HX c black",
+"JX c black",
+"KX c black",
+"LX c black",
+"PX c black",
+"IX c black",
+"UX c black",
+/* pixels */
+" ",
+" } &.&.&.&.&.&.&.&.&.&.&.&.&.C ",
+" a <X7X`.`.`.`.`.`.`.`.`.`.#XtXf.a ",
+" C !.*.i i i i i i i i i i ) <XgXD.V ",
+" a ,X*.# ; ; ; ; ; ; ; ; # Q 2Xt.#Xf.C ",
+" a !.*.# ; ; ; ; ; ; ; ; ; Q dXJ ' gXf.C ",
+" a <X*.; ; ; v ; ; > ; ; # Q dX!.!.0XrXi. ",
+" a !.*.; ; ; ; ; ; ; ; ; ; A *. . .;.U.f. ",
+" a !.r.# ; v v v v v v v v i ; ; ; # k.B. ",
+" a >X*.# L Q.#X<X<X<X<X<X<X<XQ.Q.p.# N.d. ",
+" V !.X.# L qXy.;.;.;.;.;.;. .p.dX| ; N.B. ",
+" a <X*.# L dXF # # # # # O A F.&.X ; g.B. ",
+" a !.*.# Q iXL # ; ; > ; ) F.%.X > ; N.B. ",
+" a ,X*.# Q iXK ; ; ; ; ; T.I.X > ; ; g.B. ",
+" a !.*.# L dXL ; ; > ; ; _ W.{ . > # g.B. ",
+" a ,X*.# Q qXG # # ; # ; O Q E.] O ; N.B. ",
+" a !.*.# L iXy.*.*.*.*.*.*. .F.sX[ ; g.B. ",
+" a ;X*.# G U.Q.Q.Q.<XQ.Q.Q.Q.R.Q.x.# N.B. ",
+" a ,X*.# ; h i v i v i A i i i h i ; N.f. ",
+" a !.X.# ; ; ; ; ; ; ; ; # ; ; ; ; # N.d. ",
+" a <Xr.i v v v v v v v v v v v v v i N.B. ",
+" a Q.7X2X7X2X2X2X2X2X2X2X7X2X2X2X2X2XgXf. ",
+" a } &.&.%.&.&.&.&.&.&.&.%.&.&.&.&.&.&.` ",
+" "
+};
--- /dev/null
+/* XPM */
+static char *networkReferencedLoaded[] = {
+/* columns rows colors chars-per-pixel */
+"22 21 256 2 ",
+" c #040404",
+". c #040484",
+"X c #042F3A",
+"o c #048484",
+"O c #049AFA",
+"+ c gray14",
+"@ c #2F2F64",
+"# c #2FFA9A",
+"$ c #449AA4",
+"% c #6464CF",
+"& c gray48",
+"* c #848484",
+"= c #9A9AFA",
+"- c gray77",
+"; c #FA0404",
+": c #FAFACF",
+"> c #FAFADA",
+", c black",
+"< c black",
+"1 c black",
+"2 c black",
+"3 c black",
+"4 c black",
+"5 c black",
+"6 c black",
+"7 c black",
+"8 c black",
+"9 c black",
+"0 c black",
+"q c black",
+"w c black",
+"e c black",
+"r c black",
+"t c black",
+"y c black",
+"u c black",
+"i c black",
+"p c black",
+"a c black",
+"s c black",
+"d c black",
+"f c black",
+"g c black",
+"h c black",
+"j c black",
+"k c black",
+"l c black",
+"z c black",
+"x c black",
+"c c black",
+"v c black",
+"b c black",
+"n c black",
+"m c black",
+"M c black",
+"N c black",
+"B c black",
+"V c black",
+"C c black",
+"Z c black",
+"A c black",
+"S c black",
+"D c black",
+"F c black",
+"G c black",
+"H c black",
+"J c black",
+"K c black",
+"L c black",
+"P c black",
+"I c black",
+"U c black",
+"Y c black",
+"T c black",
+"R c black",
+"E c black",
+"W c black",
+"Q c black",
+"! c black",
+"~ c black",
+"^ c black",
+"/ c black",
+"( c black",
+") c black",
+"_ c black",
+"` c black",
+"' c black",
+"] c black",
+"[ c black",
+"{ c black",
+"} c black",
+"| c black",
+" . c black",
+".. c black",
+"X. c black",
+"o. c black",
+"O. c black",
+"+. c black",
+"@. c black",
+"#. c black",
+"$. c black",
+"%. c black",
+"&. c black",
+"*. c black",
+"=. c black",
+"-. c black",
+";. c black",
+":. c black",
+">. c black",
+",. c black",
+"<. c black",
+"1. c black",
+"2. c black",
+"3. c black",
+"4. c black",
+"5. c black",
+"6. c black",
+"7. c black",
+"8. c black",
+"9. c black",
+"0. c black",
+"q. c black",
+"w. c black",
+"e. c black",
+"r. c black",
+"t. c black",
+"y. c black",
+"u. c black",
+"i. c black",
+"p. c black",
+"a. c black",
+"s. c black",
+"d. c black",
+"f. c black",
+"g. c black",
+"h. c black",
+"j. c black",
+"k. c black",
+"l. c black",
+"z. c black",
+"x. c black",
+"c. c black",
+"v. c black",
+"b. c black",
+"n. c black",
+"m. c black",
+"M. c black",
+"N. c black",
+"B. c black",
+"V. c black",
+"C. c black",
+"Z. c black",
+"A. c black",
+"S. c black",
+"D. c black",
+"F. c black",
+"G. c black",
+"H. c black",
+"J. c black",
+"K. c black",
+"L. c black",
+"P. c black",
+"I. c black",
+"U. c black",
+"Y. c black",
+"T. c black",
+"R. c black",
+"E. c black",
+"W. c black",
+"Q. c black",
+"!. c black",
+"~. c black",
+"^. c black",
+"/. c black",
+"(. c black",
+"). c black",
+"_. c black",
+"`. c black",
+"'. c black",
+"]. c black",
+"[. c black",
+"{. c black",
+"}. c black",
+"|. c black",
+" X c black",
+".X c black",
+"XX c black",
+"oX c black",
+"OX c black",
+"+X c black",
+"@X c black",
+"#X c black",
+"$X c black",
+"%X c black",
+"&X c black",
+"*X c black",
+"=X c black",
+"-X c black",
+";X c black",
+":X c black",
+">X c black",
+",X c black",
+"<X c black",
+"1X c black",
+"2X c black",
+"3X c black",
+"4X c black",
+"5X c black",
+"6X c black",
+"7X c black",
+"8X c black",
+"9X c black",
+"0X c black",
+"qX c black",
+"wX c black",
+"eX c black",
+"rX c black",
+"tX c black",
+"yX c black",
+"uX c black",
+"iX c black",
+"pX c black",
+"aX c black",
+"sX c black",
+"dX c black",
+"fX c black",
+"gX c black",
+"hX c black",
+"jX c black",
+"kX c black",
+"lX c black",
+"zX c black",
+"xX c black",
+"cX c black",
+"vX c black",
+"bX c black",
+"nX c black",
+"mX c black",
+"MX c black",
+"NX c black",
+"BX c black",
+"VX c black",
+"CX c black",
+"ZX c black",
+"AX c black",
+"SX c black",
+"DX c black",
+"FX c black",
+"GX c black",
+"HX c black",
+"JX c black",
+"KX c black",
+"LX c black",
+"PX c black",
+"IX c black",
+"UX c None",
+/* pixels */
+"UXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUX",
+"UXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUX",
+"UXUXUXUXUXUX* @ . . X + @ & UXUXUXUXUXUXUXUX",
+"UXUXUXUXUX@ @ % . % # O o + UXUXUXUXUXUXUXUX",
+"UXUXUXUX@ $ = . = . O - O % + UXUXUXUXUXUXUX",
+"UXUXUX@ $ # $ % . = + # # % % + UXUXUXUXUXUX",
+"UXUX* @ $ # - @ % X . % # % : + UXUXUXUXUXUX",
+"UXUX% o # - $ % X . % % % % % % % % % @ UXUX",
+"UXUX@ & $ # % . $ % - - - - - - - : : @ UXUX",
+"UXUX. % o O # O o % - : @ UXUX",
+"UXUX. . O # - o $ % - > > > > > : @ UXUX",
+"UXUX@ % = O # O o % - > > > > > : @ UXUX",
+"UXUX* % . $ O o @ % - > > > > > : @ UXUX",
+"UXUXUX. % . $ O + % - : @ UXUX",
+"UXUXUX* . % % $ * % : : : : : : : : : @ UXUX",
+"UXUXUXUX% . . % . % : : : : : : @ @ @ @ UXUX",
+"UXUXUXUXUX& @ . % % : & & & & & @ - - @ UXUX",
+"UXUXUXUXUXUXUXUXUX% : : : : : : @ - @ UXUXUX",
+"UXUXUXUXUXUXUXUXUX% % % % % % % @ @ UXUXUXUX",
+"UXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUX",
+"UXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUX"
+};
--- /dev/null
+/* XPM */
+static char *networkReferencedUnLoaded[] = {
+/* columns rows colors chars-per-pixel */
+"22 21 256 2 ",
+" c #040484",
+". c #042F3A",
+"X c #048484",
+"o c #049AFA",
+"O c gray14",
+"+ c #2F2F64",
+"@ c #2FFA9A",
+"# c #449AA4",
+"$ c #6464CF",
+"% c gray48",
+"& c #848484",
+"* c #9A9AFA",
+"= c gray77",
+"- c #FA0404",
+"; c #FAFACF",
+": c #FAFADA",
+"> c black",
+", c black",
+"< c black",
+"1 c black",
+"2 c black",
+"3 c black",
+"4 c black",
+"5 c black",
+"6 c black",
+"7 c black",
+"8 c black",
+"9 c black",
+"0 c black",
+"q c black",
+"w c black",
+"e c black",
+"r c black",
+"t c black",
+"y c black",
+"u c black",
+"i c black",
+"p c black",
+"a c black",
+"s c black",
+"d c black",
+"f c black",
+"g c black",
+"h c black",
+"j c black",
+"k c black",
+"l c black",
+"z c black",
+"x c black",
+"c c black",
+"v c black",
+"b c black",
+"n c black",
+"m c black",
+"M c black",
+"N c black",
+"B c black",
+"V c black",
+"C c black",
+"Z c black",
+"A c black",
+"S c black",
+"D c black",
+"F c black",
+"G c black",
+"H c black",
+"J c black",
+"K c black",
+"L c black",
+"P c black",
+"I c black",
+"U c black",
+"Y c black",
+"T c black",
+"R c black",
+"E c black",
+"W c black",
+"Q c black",
+"! c black",
+"~ c black",
+"^ c black",
+"/ c black",
+"( c black",
+") c black",
+"_ c black",
+"` c black",
+"' c black",
+"] c black",
+"[ c black",
+"{ c black",
+"} c black",
+"| c black",
+" . c black",
+".. c black",
+"X. c black",
+"o. c black",
+"O. c black",
+"+. c black",
+"@. c black",
+"#. c black",
+"$. c black",
+"%. c black",
+"&. c black",
+"*. c black",
+"=. c black",
+"-. c black",
+";. c black",
+":. c black",
+">. c black",
+",. c black",
+"<. c black",
+"1. c black",
+"2. c black",
+"3. c black",
+"4. c black",
+"5. c black",
+"6. c black",
+"7. c black",
+"8. c black",
+"9. c black",
+"0. c black",
+"q. c black",
+"w. c black",
+"e. c black",
+"r. c black",
+"t. c black",
+"y. c black",
+"u. c black",
+"i. c black",
+"p. c black",
+"a. c black",
+"s. c black",
+"d. c black",
+"f. c black",
+"g. c black",
+"h. c black",
+"j. c black",
+"k. c black",
+"l. c black",
+"z. c black",
+"x. c black",
+"c. c black",
+"v. c black",
+"b. c black",
+"n. c black",
+"m. c black",
+"M. c black",
+"N. c black",
+"B. c black",
+"V. c black",
+"C. c black",
+"Z. c black",
+"A. c black",
+"S. c black",
+"D. c black",
+"F. c black",
+"G. c black",
+"H. c black",
+"J. c black",
+"K. c black",
+"L. c black",
+"P. c black",
+"I. c black",
+"U. c black",
+"Y. c black",
+"T. c black",
+"R. c black",
+"E. c black",
+"W. c black",
+"Q. c black",
+"!. c black",
+"~. c black",
+"^. c black",
+"/. c black",
+"(. c black",
+"). c black",
+"_. c black",
+"`. c black",
+"'. c black",
+"]. c black",
+"[. c black",
+"{. c black",
+"}. c black",
+"|. c black",
+" X c black",
+".X c black",
+"XX c black",
+"oX c black",
+"OX c black",
+"+X c black",
+"@X c black",
+"#X c black",
+"$X c black",
+"%X c black",
+"&X c black",
+"*X c black",
+"=X c black",
+"-X c black",
+";X c black",
+":X c black",
+">X c black",
+",X c black",
+"<X c black",
+"1X c black",
+"2X c black",
+"3X c black",
+"4X c black",
+"5X c black",
+"6X c black",
+"7X c black",
+"8X c black",
+"9X c black",
+"0X c black",
+"qX c black",
+"wX c black",
+"eX c black",
+"rX c black",
+"tX c black",
+"yX c black",
+"uX c black",
+"iX c black",
+"pX c black",
+"aX c black",
+"sX c black",
+"dX c black",
+"fX c black",
+"gX c black",
+"hX c black",
+"jX c black",
+"kX c black",
+"lX c black",
+"zX c black",
+"xX c black",
+"cX c black",
+"vX c black",
+"bX c black",
+"nX c black",
+"mX c black",
+"MX c black",
+"NX c black",
+"BX c black",
+"VX c black",
+"CX c black",
+"ZX c black",
+"AX c black",
+"SX c black",
+"DX c black",
+"FX c black",
+"GX c black",
+"HX c black",
+"JX c black",
+"KX c black",
+"LX c black",
+"PX c black",
+"IX c black",
+"UX c None",
+/* pixels */
+"UXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUX",
+"UXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUX",
+"UXUXUXUXUXUX& + . O + % UXUXUXUXUXUXUXUX",
+"UXUXUXUXUX+ + $ $ @ o X O UXUXUXUXUXUXUXUX",
+"UXUXUXUX+ # * * o = o $ O UXUXUXUXUXUXUX",
+"UXUXUX+ # @ # $ * O @ @ $ $ O UXUXUXUXUXUX",
+"UXUX& + # @ = + $ . $ @ $ ; O UXUXUXUXUXUX",
+"UXUX$ X @ = # $ . $ $ $ $ $ $ $ $ $ + UXUX",
+"UXUX+ % # @ $ # $ = = = = = = = ; ; + UXUX",
+"UXUX $ X o @ o X $ = ; ; ; ; ; ; ; ; + UXUX",
+"UXUX o @ = X # $ = ; : : : : ; ; ; + UXUX",
+"UXUX+ $ * o @ o X $ = ; : : : ; ; ; ; + UXUX",
+"UXUX& $ # o X + $ = ; : : : : ; ; ; + UXUX",
+"UXUXUX $ # o O $ = ; ; ; ; ; ; ; ; + UXUX",
+"UXUXUX& $ $ # & $ ; ; ; ; ; ; ; ; ; + UXUX",
+"UXUXUXUX$ $ $ ; ; ; ; ; ; + + + + UXUX",
+"UXUXUXUXUX% + $ $ ; % % % % % + = = + UXUX",
+"UXUXUXUXUXUXUXUXUX$ ; ; ; ; ; ; + = + UXUXUX",
+"UXUXUXUXUXUXUXUXUX$ $ $ $ $ $ $ + + UXUXUXUX",
+"UXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUX",
+"UXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUX"
+};
--- /dev/null
+/* XPM */
+static char *new_sdl[] = {
+/* columns rows colors chars-per-pixel */
+"18 19 256 2 ",
+" c None",
+". c #FFFFB6",
+"X c #FFFFAE",
+"o c #FFFFA8",
+"O c #FFFF9B",
+"+ c #FFFF9A",
+"@ c #FFFF99",
+"# c #FFFF97",
+"$ c #FFFF96",
+"% c #FFFF94",
+"& c #FFFF93",
+"* c #FFFF92",
+"= c #FFFF91",
+"- c #FFFF90",
+"; c #FFFF8F",
+": c #FFFF8E",
+"> c #FFFF87",
+", c #FFFE8F",
+"< c #FFFE8E",
+"1 c #FFFE8D",
+"2 c #FFFE8C",
+"3 c #FFFD8E",
+"4 c #FFFD8D",
+"5 c #FFFC8E",
+"6 c #FFFC8C",
+"7 c #FFFC8B",
+"8 c #FFFC84",
+"9 c #FFFB8C",
+"0 c #FFFA8C",
+"q c #FFFA8A",
+"w c #FFF98C",
+"e c #FFF88C",
+"r c #FDFEAA",
+"t c #FDF88B",
+"y c #FCF88B",
+"u c #F9F9F9",
+"i c #F7F389",
+"p c #F6F488",
+"a c #F4F4F4",
+"s c #F4F3F3",
+"d c #F4F38D",
+"f c #F4F38C",
+"g c #F4F188",
+"h c #F4F187",
+"j c #F4F088",
+"k c #F3F3F3",
+"l c #F3F38D",
+"z c #F3F38B",
+"x c #F3F187",
+"c c #F3F087",
+"v c #F3EF87",
+"b c #F3EE87",
+"n c #F3ED87",
+"m c #F3EC87",
+"M c gray95",
+"N c #F2EC87",
+"B c #F1F1F1",
+"V c #EFF0F0",
+"C c #EEEFEF",
+"Z c #EEEEEE",
+"A c #EEEE82",
+"S c #EDEEEE",
+"D c #ECE985",
+"F c #DFDD80",
+"G c #DCD67C",
+"H c #DADB80",
+"J c gray84",
+"K c #D3D17B",
+"L c #D3CF7B",
+"P c #D2D27B",
+"I c #D2D17A",
+"U c #D2CE7B",
+"Y c #D2CD7B",
+"T c #D1CD7B",
+"R c #D0D07A",
+"E c #D0CF7A",
+"W c #D0CE7A",
+"Q c #CFCF78",
+"! c #CFCD79",
+"~ c #CFCB79",
+"^ c #CFCA7A",
+"/ c #CCC878",
+"( c #CBCB79",
+") c #C8C377",
+"_ c #BAB96E",
+"` c gray72",
+"' c #B6B5B5",
+"] c #B0B0A9",
+"[ c #AEAC6C",
+"{ c #A9AA92",
+"} c #A7A7A7",
+"| c #A7A38E",
+" . c #A7A368",
+".. c #A3A36D",
+"X. c #A39F66",
+"o. c #A29E66",
+"O. c #A1A16D",
+"+. c #A1A165",
+"@. c #A19A65",
+"#. c #A0A169",
+"$. c #A09E67",
+"%. c #9F9EA1",
+"&. c #9F9E9F",
+"*. c #9F9D64",
+"=. c #9E9C64",
+"-. c #9D9D9F",
+";. c #9D9D68",
+":. c #9D9D67",
+">. c #9D9964",
+",. c #9C9E63",
+"<. c #9C9D9F",
+"1. c #9C9D68",
+"2. c #9C9D65",
+"3. c #9C9D63",
+"4. c #9C9C9F",
+"5. c #9C9C9E",
+"6. c #9C9C9D",
+"7. c #9C9C68",
+"8. c #9C9B63",
+"9. c #9C9A63",
+"0. c #9B9B9B",
+"q. c #9B9B63",
+"w. c #9B9A63",
+"e. c #99999A",
+"r. c #969761",
+"t. c #878686",
+"y. c #84845F",
+"u. c #84845C",
+"i. c #797A79",
+"p. c #757351",
+"a. c #737053",
+"s. c #6F7054",
+"d. c #6D6970",
+"f. c #6D696A",
+"g. c #6D674C",
+"h. c #6C6A6A",
+"j. c #6B6870",
+"k. c #6B684C",
+"l. c #6B674C",
+"z. c #6A6868",
+"x. c #6A6854",
+"c. c #69696D",
+"v. c DimGray",
+"b. c #69674B",
+"n. c #68686F",
+"m. c #68674A",
+"M. c #68664B",
+"N. c #67674A",
+"B. c #66676E",
+"V. c #66666E",
+"C. c #66666D",
+"Z. c #66644A",
+"A. c #666449",
+"S. c #65666D",
+"D. c #656666",
+"F. c #656653",
+"G. c #656649",
+"H. c #65656D",
+"J. c #656449",
+"K. c #64644F",
+"L. c #636448",
+"P. c #626148",
+"I. c #5E5E5F",
+"U. c #555145",
+"Y. c #535042",
+"T. c #4F4C3E",
+"R. c #4E4B47",
+"E. c gray30",
+"W. c #484837",
+"Q. c #474445",
+"!. c #47434C",
+"~. c #464644",
+"^. c #46434B",
+"/. c #464244",
+"(. c #454543",
+"). c #454444",
+"_. c #45434B",
+"`. c #45433B",
+"'. c #45424B",
+"]. c #454244",
+"[. c #454243",
+"{. c #45423B",
+"}. c #44454E",
+"|. c #44424A",
+" X c #444244",
+".X c #444243",
+"XX c #44423B",
+"oX c #434342",
+"OX c #43424A",
+"+X c #434241",
+"@X c #434142",
+"#X c #433E3A",
+"$X c #42424A",
+"%X c #42414A",
+"&X c #424149",
+"*X c #404049",
+"=X c #404048",
+"-X c #404041",
+";X c #403F48",
+":X c #403E3E",
+">X c #3F4048",
+",X c #3F3F48",
+"<X c #3F3F41",
+"1X c #3F3F40",
+"2X c #3F3F38",
+"3X c #3F3E41",
+"4X c #3F3E38",
+"5X c #3E3F48",
+"6X c #3D3C41",
+"7X c #3C3935",
+"8X c #3B3834",
+"9X c #3A383E",
+"0X c #38353D",
+"qX c #34323D",
+"wX c #34313D",
+"eX c #33313D",
+"rX c #333032",
+"tX c #322F2F",
+"yX c #31303C",
+"uX c #313036",
+"iX c #312F3C",
+"pX c #312F2F",
+"aX c #302E3F",
+"sX c #2F3037",
+"dX c #2F2F3B",
+"fX c #2E2B3B",
+"gX c #2B2A2A",
+"hX c #2B2A28",
+"jX c black",
+"kX c black",
+"lX c black",
+"zX c black",
+"xX c black",
+"cX c black",
+"vX c black",
+"bX c black",
+"nX c black",
+"mX c black",
+"MX c black",
+"NX c black",
+"BX c black",
+"VX c black",
+"CX c black",
+"ZX c black",
+"AX c black",
+"SX c black",
+"DX c black",
+"FX c black",
+"GX c black",
+"HX c black",
+"JX c black",
+"KX c black",
+"LX c black",
+"PX c black",
+"IX c black",
+"UX c black",
+/* pixels */
+" ",
+" } i.i.i.i.i.i.i.i.i.i.e. ",
+" t.a.[ [ [ [ [ [ [ [ p.:Xt. ",
+" t.r.* 4 4 4 4 4 4 d 3.I.E.e. ",
+" t.r.& ; 4 < : : ; y w.i.%.9Xt. ",
+" t.r.; ; y 3 : 2 ; y [ x.s.P.E.` ",
+" t.r.* y i i i i i i D F F / F.` ",
+" t.r.d $.P.P.K.K.K.K.K.K.u.F x.` ",
+" t.r.d u.p._ _ _ _ _ o.K.| F x.` ",
+" t.r.l u.$.5 & = = F 7.{ l D x.` ",
+" t.r.l u.>.y ; : : p.t.l : D x.` ",
+" t.r.l u.>.y : 2 ; [ a.H & D x.` ",
+" t.r.l u.r.H F F F F :.h.T F x.` ",
+" t.r.d r.U.x.s.s.s.s.x.~.p.F x.` ",
+" t.r.& F / ) ) ) ) / / / W F x.` ",
+" t.r.* 4 9 9 9 9 9 * 9 9 9 F x.` ",
+" t.k.[ [ [ [ [ [ [ [ [ [ [ *.U.` ",
+" } i.i.d.i.i.i.i.i.d.i.i.i.d.i.J ",
+" "
+};
--- /dev/null
+/* XPM */
+static char *new_sdl2[] = {
+/* columns rows colors chars-per-pixel */
+"24 24 256 2 ",
+" c None",
+". c #FFFFA2",
+"X c #FFFF9F",
+"o c #FFFF98",
+"O c #FFFF97",
+"+ c #FFFF96",
+"@ c #FFFF95",
+"# c #FFFF94",
+"$ c #FFFF93",
+"% c #FFFF92",
+"& c #FFFF91",
+"* c #FFFF90",
+"= c #FFFF8F",
+"- c #FFFF8E",
+"; c #FFFF8D",
+": c #FFFF8C",
+"> c #FFFE8F",
+", c #FFFE8E",
+"< c #FFFD89",
+"1 c #FEFEFE",
+"2 c gray98",
+"3 c #F7F688",
+"4 c #F4F4F5",
+"5 c #F3F38E",
+"6 c #F3F18F",
+"7 c #F1F1F1",
+"8 c #F1F189",
+"9 c #F0F08C",
+"0 c #F0EE89",
+"q c #EFEFF1",
+"w c gray93",
+"e c #EDEA83",
+"r c #EDE880",
+"t c #ECE984",
+"y c #ECE882",
+"u c gray92",
+"i c #EAEAF0",
+"p c #EAE883",
+"a c #E8E8EA",
+"s c #E8E683",
+"d c #E8E381",
+"f c #E7E8EA",
+"g c #E7E7EA",
+"h c #E7E783",
+"j c #E6E7E8",
+"k c #E6E780",
+"l c #E6E6E6",
+"z c #E6E47F",
+"x c #E6E27E",
+"c c #E5DF79",
+"v c #E4E4E4",
+"b c #E4E47D",
+"n c #E4E079",
+"m c #E4DF78",
+"M c #E3E37E",
+"N c #E3E07E",
+"B c #E2E282",
+"V c #E2E079",
+"C c #DBD97D",
+"Z c #CDCB71",
+"A c #CBCB78",
+"S c #C9C477",
+"D c #C8C677",
+"F c #C8C674",
+"G c #C8C377",
+"H c #C7C573",
+"J c #C6C06D",
+"K c #C5C36B",
+"L c #C2BE6E",
+"P c #C1BF73",
+"I c gray",
+"U c #BDB87B",
+"Y c #BCBC9E",
+"T c #B9B76F",
+"R c #B7B46D",
+"E c #AFAF86",
+"W c #ACACAE",
+"Q c #AAAA67",
+"! c #A8A66F",
+"~ c #A7A569",
+"^ c #A6A368",
+"/ c #A4A163",
+"( c #A4A065",
+") c #A3A46E",
+"_ c #A29E62",
+"` c #A0A069",
+"' c #9E9F8D",
+"] c #9B9C69",
+"[ c #9B9B66",
+"{ c #9B9B64",
+"} c #9B9A65",
+"| c #9B9964",
+" . c #9A9865",
+".. c #9999A0",
+"X. c #97979D",
+"o. c #979789",
+"O. c #96969D",
+"+. c #9595A0",
+"@. c #95959F",
+"#. c #95959E",
+"$. c #95955B",
+"%. c #94949E",
+"&. c #94949D",
+"*. c #9393A0",
+"=. c #93939E",
+"-. c #93939D",
+";. c #93935D",
+":. c #92925B",
+">. c #91925B",
+",. c #919259",
+"<. c #91915B",
+"1. c #91915A",
+"2. c #919159",
+"3. c #8F8F5A",
+"4. c #8D8C5E",
+"5. c #8C8D61",
+"6. c #8C8856",
+"7. c gray54",
+"8. c #888861",
+"9. c #88855F",
+"0. c #84855E",
+"q. c #83805E",
+"w. c #83805D",
+"e. c #818052",
+"r. c #7F7E7E",
+"t. c #7F7D5A",
+"y. c #7C7C7F",
+"u. c #7B7B57",
+"i. c #7A7A76",
+"p. c #787855",
+"a. c #787777",
+"s. c #767678",
+"d. c #767677",
+"f. c #767658",
+"g. c #767657",
+"h. c #75765A",
+"j. c #747557",
+"k. c #747376",
+"l. c #737372",
+"z. c #737279",
+"x. c #71705E",
+"c. c #707071",
+"v. c #6F6F54",
+"b. c #6E6E74",
+"n. c #6E6D75",
+"m. c #6D6D6E",
+"M. c #6D6D68",
+"N. c #6B6B70",
+"B. c gray42",
+"V. c #6B6B64",
+"C. c #6B6A64",
+"Z. c #6B6A63",
+"A. c #6A6A64",
+"S. c #69696A",
+"D. c #696846",
+"F. c #696752",
+"G. c #666661",
+"H. c #656651",
+"J. c #656451",
+"K. c #646158",
+"L. c #646157",
+"P. c #636158",
+"I. c #626158",
+"U. c #60604E",
+"Y. c #5F5F5C",
+"T. c #5C5C4E",
+"R. c #5A5A4B",
+"E. c #59584F",
+"W. c #585756",
+"Q. c #585546",
+"!. c #51514A",
+"~. c #4A4B43",
+"^. c #404045",
+"/. c #3B3B45",
+"(. c #363536",
+"). c #313136",
+"_. c black",
+"`. c black",
+"'. c black",
+"]. c black",
+"[. c black",
+"{. c black",
+"}. c black",
+"|. c black",
+" X c black",
+".X c black",
+"XX c black",
+"oX c black",
+"OX c black",
+"+X c black",
+"@X c black",
+"#X c black",
+"$X c black",
+"%X c black",
+"&X c black",
+"*X c black",
+"=X c black",
+"-X c black",
+";X c black",
+":X c black",
+">X c black",
+",X c black",
+"<X c black",
+"1X c black",
+"2X c black",
+"3X c black",
+"4X c black",
+"5X c black",
+"6X c black",
+"7X c black",
+"8X c black",
+"9X c black",
+"0X c black",
+"qX c black",
+"wX c black",
+"eX c black",
+"rX c black",
+"tX c black",
+"yX c black",
+"uX c black",
+"iX c black",
+"pX c black",
+"aX c black",
+"sX c black",
+"dX c black",
+"fX c black",
+"gX c black",
+"hX c black",
+"jX c black",
+"kX c black",
+"lX c black",
+"zX c black",
+"xX c black",
+"cX c black",
+"vX c black",
+"bX c black",
+"nX c black",
+"mX c black",
+"MX c black",
+"NX c black",
+"BX c black",
+"VX c black",
+"CX c black",
+"ZX c black",
+"AX c black",
+"SX c black",
+"DX c black",
+"FX c black",
+"GX c black",
+"HX c black",
+"JX c black",
+"KX c black",
+"LX c black",
+"PX c black",
+"IX c black",
+"UX c black",
+/* pixels */
+" ",
+" w w g f f f f g g 4 ",
+" 4 m.G.V.V.V.V.V.V.Y.d.l ",
+" q !.Z z c c z c h _ (.m.w ",
+" q K.h = = = = = O R b.r.G.l ",
+" q K.c O = = = = O P W.m.(.7. ",
+" g K.z z S H S S S T / Q 6.s. ",
+" q K.s u.~.v.U.U.H.v.U.^.t.d. ",
+" q Y.e g.] 0 0 3 3 3 0.' U d. ",
+" g K.s f.! O = O 3 5.' . L s. ",
+" q K.e f.~ = = = h Q.E X J d. ",
+" g K.e f.~ O = = O C f.Y z i. ",
+" q K.e g.T.0.0.0.0.5.W./._ r. ",
+" q Y.h Z [ [ [ [ [ [ / ~ $.d. ",
+" g H.s O O O O = O O O X L b. ",
+" q !.e.$.$.$.6.$.$.6.$.$.U.b. ",
+" W X.+.X.X.X.X.+.+.X.X...I ",
+" ",
+" ",
+" ",
+" ",
+" ",
+" ",
+" "
+};
--- /dev/null
+/* XPM */
+static char *next[] = {
+/* columns rows colors chars-per-pixel */
+"24 24 256 2 ",
+" c None",
+". c #FDFDFD",
+"X c #FCFBF8",
+"o c #F9F7F6",
+"O c #F8F7F7",
+"+ c gray97",
+"@ c #F6F5F3",
+"# c #F5F5F6",
+"$ c gray96",
+"% c #F3F3F3",
+"& c #F1F0EE",
+"* c #F0EFEE",
+"= c #EFEFEF",
+"- c #ECEBE9",
+"; c #EBE9E6",
+": c #EBE8E5",
+"> c #E9E8E6",
+", c #E8E7E5",
+"< c #E7E6E3",
+"1 c #E6E5E3",
+"2 c #E5E3DF",
+"3 c gray88",
+"4 c #E0DDD8",
+"5 c gray86",
+"6 c #CBC9C6",
+"7 c #CAC8C6",
+"8 c #C6C3BF",
+"9 c #8D8980",
+"0 c #687280",
+"q c #687080",
+"w c #656565",
+"e c #606971",
+"r c #5D626A",
+"t c #5B5A57",
+"y c #595A5A",
+"u c #4F9BFF",
+"i c #4F95FF",
+"p c #4E96FF",
+"a c #4E95FF",
+"s c #4E95F9",
+"d c #4E4D4C",
+"f c #4D96FF",
+"g c #4D90F3",
+"h c #4C4B4B",
+"j c #4B90F8",
+"k c #4A8EF4",
+"l c #4A8BEE",
+"z c #4A4949",
+"x c #4A484B",
+"c c #498FF6",
+"v c #498EF5",
+"b c #498BEF",
+"n c #4890F9",
+"m c #488FF8",
+"M c #4787E7",
+"N c #474546",
+"B c #4377CB",
+"V c #434447",
+"C c gray26",
+"Z c #40403F",
+"A c #3F79CF",
+"S c #3F76C8",
+"D c #3E3E3D",
+"F c #3D72C1",
+"G c #3C76CB",
+"H c #3C71BF",
+"J c #3B7AD5",
+"K c #3B6EBF",
+"L c #3B3939",
+"P c #3A6AB7",
+"I c #3976CE",
+"U c #393939",
+"Y c #3875CD",
+"T c #386EC2",
+"R c #3466B4",
+"E c #313131",
+"W c #2A2A2E",
+"Q c #282726",
+"! c #26569B",
+"~ c #265296",
+"^ c #26467B",
+"/ c #255398",
+"( c #21232D",
+") c #1E4782",
+"_ c #1E232E",
+"` c #1E232B",
+"' c #1C4580",
+"] c #1C212B",
+"[ c #1C212A",
+"{ c #1B4073",
+"} c #193968",
+"| c #173763",
+" . c #151F29",
+".. c #151727",
+"X. c #133565",
+"o. c #133062",
+"O. c #131E2B",
+"+. c #131D2B",
+"@. c #12161D",
+"#. c #111B2B",
+"$. c #050D18",
+"%. c #000E25",
+"&. c #00000A",
+"*. c black",
+"=. c black",
+"-. c black",
+";. c black",
+":. c black",
+">. c black",
+",. c black",
+"<. c black",
+"1. c black",
+"2. c black",
+"3. c black",
+"4. c black",
+"5. c black",
+"6. c black",
+"7. c black",
+"8. c black",
+"9. c black",
+"0. c black",
+"q. c black",
+"w. c black",
+"e. c black",
+"r. c black",
+"t. c black",
+"y. c black",
+"u. c black",
+"i. c black",
+"p. c black",
+"a. c black",
+"s. c black",
+"d. c black",
+"f. c black",
+"g. c black",
+"h. c black",
+"j. c black",
+"k. c black",
+"l. c black",
+"z. c black",
+"x. c black",
+"c. c black",
+"v. c black",
+"b. c black",
+"n. c black",
+"m. c black",
+"M. c black",
+"N. c black",
+"B. c black",
+"V. c black",
+"C. c black",
+"Z. c black",
+"A. c black",
+"S. c black",
+"D. c black",
+"F. c black",
+"G. c black",
+"H. c black",
+"J. c black",
+"K. c black",
+"L. c black",
+"P. c black",
+"I. c black",
+"U. c black",
+"Y. c black",
+"T. c black",
+"R. c black",
+"E. c black",
+"W. c black",
+"Q. c black",
+"!. c black",
+"~. c black",
+"^. c black",
+"/. c black",
+"(. c black",
+"). c black",
+"_. c black",
+"`. c black",
+"'. c black",
+"]. c black",
+"[. c black",
+"{. c black",
+"}. c black",
+"|. c black",
+" X c black",
+".X c black",
+"XX c black",
+"oX c black",
+"OX c black",
+"+X c black",
+"@X c black",
+"#X c black",
+"$X c black",
+"%X c black",
+"&X c black",
+"*X c black",
+"=X c black",
+"-X c black",
+";X c black",
+":X c black",
+">X c black",
+",X c black",
+"<X c black",
+"1X c black",
+"2X c black",
+"3X c black",
+"4X c black",
+"5X c black",
+"6X c black",
+"7X c black",
+"8X c black",
+"9X c black",
+"0X c black",
+"qX c black",
+"wX c black",
+"eX c black",
+"rX c black",
+"tX c black",
+"yX c black",
+"uX c black",
+"iX c black",
+"pX c black",
+"aX c black",
+"sX c black",
+"dX c black",
+"fX c black",
+"gX c black",
+"hX c black",
+"jX c black",
+"kX c black",
+"lX c black",
+"zX c black",
+"xX c black",
+"cX c black",
+"vX c black",
+"bX c black",
+"nX c black",
+"mX c black",
+"MX c black",
+"NX c black",
+"BX c black",
+"VX c black",
+"CX c black",
+"ZX c black",
+"AX c black",
+"SX c black",
+"DX c black",
+"FX c black",
+"GX c black",
+"HX c black",
+"JX c black",
+"KX c black",
+"LX c black",
+"PX c black",
+"IX c black",
+"UX c black",
+/* pixels */
+" ",
+" ",
+" ",
+" ",
+" ",
+" = + ",
+" o D t + ",
+" o W &.e + ",
+" + < ; ; 2 ; 4 Q ) ! 0 ",
+" w @._ _ ( _ _ ..P i ~ e ",
+" N | S K T H H B l k m ! y = ",
+" d ) u i i i i i k l i m %.9 ",
+" N | J S J S S J M i k { d < ",
+" y $. . . . . . .R g | Z < ",
+" < 8 6 6 6 6 8 W ^ | N ; ",
+" D *.d = ",
+" + D d * ",
+" 5 + ",
+" ",
+" ",
+" ",
+" ",
+" ",
+" "
+};
--- /dev/null
+/* XPM */
+static char *nextstate[] = {
+/* columns rows colors chars-per-pixel */
+"24 24 256 2 ",
+" c None",
+". c #FFFF92",
+"X c #FFFF90",
+"o c #FFFF8F",
+"O c #FFFF8E",
+"+ c #FFFF8D",
+"@ c #FFFF8C",
+"# c #FFFF8B",
+"$ c #FFFF8A",
+"% c #FFFF89",
+"& c #FFFD8C",
+"* c #FFFD8B",
+"= c #FFFC8E",
+"- c #FFFC8C",
+"; c #FFFC8B",
+": c #FFFC8A",
+"> c #FFFB8D",
+", c #FFFB8C",
+"< c #FFFB8B",
+"1 c #FFFB8A",
+"2 c #FFFB89",
+"3 c #FFFB88",
+"4 c #FFFA8C",
+"5 c #FFFA8B",
+"6 c #FFFA8A",
+"7 c #FFFA89",
+"8 c #FFF98C",
+"9 c #FFF98B",
+"0 c #FFF98A",
+"q c #FFF988",
+"w c #FFF987",
+"e c #FFF88C",
+"r c #FFF88B",
+"t c #FFF88A",
+"y c #FFF889",
+"u c #FFF888",
+"i c #FFF887",
+"p c #FFF78B",
+"a c #FFF78A",
+"s c #FFF789",
+"d c #FFF788",
+"f c #FFF787",
+"g c #FFF786",
+"h c #FFF785",
+"j c #FFF68A",
+"k c #FFF688",
+"l c #FFF687",
+"z c #FEFEFE",
+"x c #FBFBFB",
+"c c #FBFBFA",
+"v c #F9F9F9",
+"b c #F2F187",
+"n c #F2F183",
+"m c #F2F081",
+"M c #F2EF89",
+"N c #F2EF84",
+"B c #F2EF83",
+"V c gray93",
+"C c #EAEAE9",
+"Z c gray91",
+"A c #E1E1E1",
+"S c #DFE0E1",
+"D c #DDDCDB",
+"F c gainsboro",
+"G c #DBDCDC",
+"H c #D9D9DA",
+"J c gray85",
+"K c #D7D7D7",
+"L c #D7D4D4",
+"P c #D6D4D4",
+"I c #D6D3D4",
+"U c #D5D5D6",
+"Y c #D4D3D3",
+"T c #D4D1D2",
+"R c LightGray",
+"E c #D2D1D2",
+"W c #C4C6C8",
+"Q c #B4B7B9",
+"! c #B1B1B1",
+"~ c #AEAEAE",
+"^ c #AEADAD",
+"/ c #AEACAC",
+"( c #AEABAC",
+") c #A8A5A6",
+"_ c #A8A5A5",
+"` c #A7A7A7",
+"' c #A7A6A6",
+"] c #9C9C9F",
+"[ c #99979A",
+"{ c #8B8B8B",
+"} c #828285",
+"| c #818282",
+" . c #817E4F",
+".. c #817B51",
+"X. c #817B50",
+"o. c #817B4E",
+"O. c #7E7C50",
+"+. c #7E7C4F",
+"@. c #7E7C4E",
+"#. c #7E7A50",
+"$. c #7E7951",
+"%. c #7E784F",
+"&. c #7D7656",
+"*. c #7D7455",
+"=. c #7D7353",
+"-. c #7C754E",
+";. c #7A777E",
+":. c #787575",
+">. c #77787F",
+",. c #77747B",
+"<. c #767379",
+"1. c #757279",
+"2. c #74757C",
+"3. c #74747B",
+"4. c #747178",
+"5. c #737077",
+"6. c #727049",
+"7. c #726F4D",
+"8. c #717173",
+"9. c #716E4B",
+"0. c #706D75",
+"q. c #706D6E",
+"w. c #706D6C",
+"e. c #70684D",
+"r. c #6D6D71",
+"t. c #6C6C73",
+"y. c #6C6B50",
+"u. c #6B676D",
+"i. c #6A6C74",
+"p. c #6A664A",
+"a. c #696970",
+"s. c #69686F",
+"d. c #69666D",
+"f. c #69656C",
+"g. c #65626B",
+"h. c #64696E",
+"j. c #646547",
+"k. c #626244",
+"l. c #626044",
+"z. c #5F5F43",
+"x. c #5D5D42",
+"c. c #5D5D40",
+"v. c #5D5C40",
+"b. c #5D5B41",
+"n. c #5C5D40",
+"m. c #5C5C3F",
+"M. c #5B5B3F",
+"N. c #5B5A3E",
+"B. c #5B593E",
+"V. c #5B583E",
+"C. c #5B583D",
+"Z. c #5B583C",
+"A. c #5B573B",
+"S. c #5A593D",
+"D. c #555355",
+"F. c #555148",
+"G. c #555037",
+"H. c #534D4B",
+"J. c #524F54",
+"K. c #505356",
+"L. c #505052",
+"P. c #505050",
+"I. c #4F5059",
+"U. c #4F4C37",
+"Y. c #4E4C37",
+"T. c #4B4532",
+"R. c #484748",
+"E. c #484746",
+"W. c #474648",
+"Q. c #474344",
+"!. c #47413F",
+"~. c #464448",
+"^. c #454341",
+"/. c #454242",
+"(. c #444244",
+"). c #44413F",
+"_. c #43454B",
+"`. c #434443",
+"'. c #413D33",
+"]. c #403C3C",
+"[. c #3D3D40",
+"{. c #3C4141",
+"}. c #3C3C3E",
+"|. c #3B3931",
+" X c #383636",
+".X c #363535",
+"XX c #353436",
+"oX c #34312D",
+"OX c #342F2F",
+"+X c #323235",
+"@X c #2F2F2F",
+"#X c #2F2D2B",
+"$X c #2E2B29",
+"%X c #27262A",
+"&X c #27252A",
+"*X c #272529",
+"=X c #272327",
+"-X c #272226",
+";X c #26262A",
+":X c #26252A",
+">X c #262429",
+",X c #262325",
+"<X c #262227",
+"1X c #262125",
+"2X c #252127",
+"3X c #252123",
+"4X c #232022",
+"5X c #231E21",
+"6X c black",
+"7X c black",
+"8X c black",
+"9X c black",
+"0X c black",
+"qX c black",
+"wX c black",
+"eX c black",
+"rX c black",
+"tX c black",
+"yX c black",
+"uX c black",
+"iX c black",
+"pX c black",
+"aX c black",
+"sX c black",
+"dX c black",
+"fX c black",
+"gX c black",
+"hX c black",
+"jX c black",
+"kX c black",
+"lX c black",
+"zX c black",
+"xX c black",
+"cX c black",
+"vX c black",
+"bX c black",
+"nX c black",
+"mX c black",
+"MX c black",
+"NX c black",
+"BX c black",
+"VX c black",
+"CX c black",
+"ZX c black",
+"AX c black",
+"SX c black",
+"DX c black",
+"FX c black",
+"GX c black",
+"HX c black",
+"JX c black",
+"KX c black",
+"LX c black",
+"PX c black",
+"IX c black",
+"UX c black",
+/* pixels */
+" ",
+" D ] [ Q ",
+" ~ @X=Xh. ",
+" A V ` }..Xr.S D V ",
+" { }.D.Q.Q.Q.{.D.D ",
+" V r.@XQ.Q..XW.W ",
+" } .X.XJ.K ",
+" } J.D ",
+" K :.,.,.,.,.,.,.g.I.,.r.,.,.,.,.:.K ",
+" K ].@XU.j.p.z.z.m.j.j.z.m.m.m.z.U.=XE.K ",
+" K !.'.&.b o o o o o o . o o o o o N &.Q.H.K ",
+" ) =X7.N o f f f f o p o f f o p f o N 7.@X` ",
+" ~ =X .o f f f o w f o f o o f f f f o .5X~ ",
+" ~ %X+.w p f f f o p w o f f p o f o o +.=X~ ",
+" ~ =X+.o f p f p f o w o f o o f f f o -.%X~ ",
+" ~ =X+.o p f p f o f o f o f w f p w o -.=X~ ",
+" ~ %XO.w w f f p f o w o w o f o f p o +.%X~ ",
+" ~ %X..o f p f p p w w o p p f f p o w .%X~ ",
+" ) =X6.N o f p w o w p f w o p f f o N 7.5X) ",
+" K !.|.&.N o o o o o o o o o o o . N -.Q.D.K ",
+" K }.OXG.m.j.m.m.A.m.m.m.m.m.A.m.T.OXH.D ",
+" K q.s.u.r.r.u.u.u.u.u.u.u.u.u.u.q.K ",
+" ",
+" "
+};
--- /dev/null
+/* XPM */
+static char *open[] = {
+/* columns rows colors chars-per-pixel */
+"24 24 256 2 ",
+" c None",
+". c #FFFF39",
+"X c #FEFEFF",
+"o c #FDFDFD",
+"O c #FDFDFC",
+"+ c #FCFF33",
+"@ c #FBFF32",
+"# c #FBFCFD",
+"$ c #FBFBFC",
+"% c #F8F7F9",
+"& c gray96",
+"* c #F5F4F4",
+"= c #F3FC32",
+"- c #EFFC2E",
+"; c #EFF732",
+": c #EFF72F",
+"> c #EFF630",
+", c #EFEFEF",
+"< c #EEFD2E",
+"1 c #EEFA2F",
+"2 c #EDF22E",
+"3 c #EDEEF0",
+"4 c #ECF531",
+"5 c #ECECEE",
+"6 c #ECECED",
+"7 c #EBF32F",
+"8 c #EAEBED",
+"9 c #E8E9F0",
+"0 c gray91",
+"q c #E7EE2E",
+"w c #E7E7E7",
+"e c #E6E7E9",
+"r c #E5E5EA",
+"t c #E5E5E7",
+"y c #E2EB29",
+"u c #E2E929",
+"i c #E1EA2A",
+"p c #E1E3E8",
+"a c #E1E1E4",
+"s c #E1E1E3",
+"d c #E1E1E1",
+"f c gray88",
+"g c #DFDFDE",
+"h c #DFAB2B",
+"j c #DEDEE0",
+"k c #DEAE27",
+"l c #DDE52C",
+"z c #DCE72A",
+"x c #DCE42C",
+"c c #DCDDDF",
+"v c #DADEE3",
+"b c #D6DD28",
+"n c #D5D5DB",
+"m c #D4A426",
+"M c #D3DB29",
+"N c #D0D1D8",
+"B c #D0D0D0",
+"V c #D0A126",
+"C c #CFD624",
+"Z c #CFCFD4",
+"A c #CF9F27",
+"S c #CEA027",
+"D c #CE9F27",
+"F c #CDD623",
+"G c #CD9E26",
+"H c #CC9F26",
+"J c #CC9C25",
+"K c #CBCE20",
+"L c #CAD721",
+"P c #CACACC",
+"I c #CA9C1F",
+"U c #C99C24",
+"Y c #C79B24",
+"T c #C69A25",
+"R c #C69A24",
+"E c #C59A24",
+"W c #C2C2CB",
+"Q c #C29521",
+"! c #C2941C",
+"~ c #C29320",
+"^ c #C1C81F",
+"/ c #C1C1C9",
+"( c #BF9423",
+") c #BF9420",
+"_ c #BF9323",
+"` c #BEBEC9",
+"' c #BEBEC8",
+"] c #BD9223",
+"[ c #BCBCCA",
+"{ c #BC9221",
+"} c #BC9120",
+"| c #BC9020",
+" . c #BB911A",
+".. c #BB9020",
+"X. c #BA8F1F",
+"o. c #B98F1D",
+"O. c #B8B8B5",
+"+. c #B3B1AE",
+"@. c #AEB0B6",
+"#. c #ADB218",
+"$. c #A7AD16",
+"%. c #A6AC16",
+"&. c #A5AA15",
+"*. c #A5A5AB",
+"=. c #A3AB16",
+"-. c #A3A5B3",
+";. c #A3A5B1",
+":. c #A2A4B3",
+">. c #A0A611",
+",. c #9EA1AC",
+"<. c #9A9A99",
+"1. c #9A781B",
+"2. c #957614",
+"3. c #949E20",
+"4. c #93929D",
+"5. c #909192",
+"6. c #8F959B",
+"7. c #8F8C7F",
+"8. c #8D6D16",
+"9. c #8B981D",
+"0. c #8B6817",
+"q. c #89911E",
+"w. c #898A87",
+"e. c #878789",
+"r. c #838385",
+"t. c #828E1B",
+"y. c #828793",
+"u. c #818282",
+"i. c #808081",
+"p. c #7D7D82",
+"a. c #7C828D",
+"s. c #7B828D",
+"d. c #7A818D",
+"f. c #79808B",
+"g. c #787F8A",
+"h. c #75767A",
+"j. c #74716A",
+"k. c #727271",
+"l. c #6A6A7D",
+"z. c #6A6A6E",
+"x. c #68686D",
+"c. c #674A0C",
+"v. c #606374",
+"b. c #606165",
+"n. c #606060",
+"m. c #5F5F6F",
+"M. c #5F5E6E",
+"N. c #5E5D6E",
+"B. c #5D5E6C",
+"V. c #5D5D6A",
+"C. c #5C5E6F",
+"Z. c #5B5B6C",
+"A. c #585555",
+"S. c #565758",
+"D. c #56555A",
+"F. c #545614",
+"G. c #535860",
+"H. c #535265",
+"J. c #525251",
+"K. c #514208",
+"L. c #4F4F51",
+"P. c #4F4E56",
+"I. c #4E560F",
+"U. c #4C420B",
+"Y. c #4B4C04",
+"T. c #47500E",
+"R. c #474F0D",
+"E. c #464B02",
+"W. c #463505",
+"Q. c #45440A",
+"!. c #433003",
+"~. c #413D15",
+"^. c #404A0B",
+"/. c #40490B",
+"(. c #404401",
+"). c #402E00",
+"_. c #3E4200",
+"`. c #3E2E06",
+"'. c #3E2B0D",
+"]. c #3D4100",
+"[. c #3D2909",
+"{. c #3C4000",
+"}. c #3C3C23",
+"|. c #39240C",
+" X c #38230C",
+".X c #38230B",
+"XX c #362E02",
+"oX c #313142",
+"OX c #313133",
+"+X c #312F08",
+"@X c #312601",
+"#X c #312504",
+"$X c #2F2A28",
+"%X c #2C2C2B",
+"&X c #2A2706",
+"*X c #2A1E05",
+"=X c #281A00",
+"-X c #271A03",
+";X c #26261D",
+":X c #252703",
+">X c #242523",
+",X c #221603",
+"<X c #211703",
+"1X c #211503",
+"2X c #1F2506",
+"3X c #1E1F01",
+"4X c #1D2507",
+"5X c #1D1C17",
+"6X c #1A1C17",
+"7X c #181C02",
+"8X c #181818",
+"9X c #171816",
+"0X c #161C02",
+"qX c #161611",
+"wX c #151719",
+"eX c #060500",
+"rX c #040903",
+"tX c #020001",
+"yX c #000008",
+"uX c black",
+"iX c black",
+"pX c black",
+"aX c black",
+"sX c black",
+"dX c black",
+"fX c black",
+"gX c black",
+"hX c black",
+"jX c black",
+"kX c black",
+"lX c black",
+"zX c black",
+"xX c black",
+"cX c black",
+"vX c black",
+"bX c black",
+"nX c black",
+"mX c black",
+"MX c black",
+"NX c black",
+"BX c black",
+"VX c black",
+"CX c black",
+"ZX c black",
+"AX c black",
+"SX c black",
+"DX c black",
+"FX c black",
+"GX c black",
+"HX c black",
+"JX c black",
+"KX c black",
+"LX c black",
+"PX c black",
+"IX c black",
+"UX c black",
+/* pixels */
+" ",
+" ",
+" % & & ",
+" e L.$X$X*. ",
+" B J.k.r.p.A.<., e.j ",
+" P z., +.p.z.qXZ ",
+" e -.-.,.-., g G.eX8Xn ",
+" e 7.2X0X3X2Xr.` ` W ` W 4.>XOXL.w ",
+" l.Q.K C C C F.wX5X5X9X;X@. , w w , ",
+" H._.- - - ; ^ $.$.$.#.>.}.@. ",
+" m._.q l b b ; + + + . q 3X4. ",
+" m._.l l l ; t.R.T.R.I.Q.rXoXv.m.m.r., ",
+" m.(.q q : t.~.|.+X|.|.'.U.W.@XW.-XeXn ",
+" m._.: : q.&X8.h A A A A A A k ! c.S.e ",
+" m.E.: 3.:X8.A ( ( ( ( ( ( S .K.S.e ",
+" m.Y.$.+X1.m A Q Y Y Y Y Y Q `.H.3 ",
+" h.eXXX2.I ( X.( ( ( ( ( X.`.m.g ",
+" g b.eX&X*X,X,X,X,X3X,X,X*Xj.j ",
+" w 5.g.g.a.a.a.g.g.g.g.y.w ",
+" ",
+" ",
+" ",
+" ",
+" "
+};
--- /dev/null
+/* XPM */
+static char *operator[] = {
+/* columns rows colors chars-per-pixel */
+"24 24 256 2 ",
+" c None",
+". c #FFFFA7",
+"X c #FFFFA2",
+"o c #FFFFA1",
+"O c #FFFF9C",
+"+ c #FFFF9A",
+"@ c #FFFF98",
+"# c #FFFF95",
+"$ c #FFFF94",
+"% c #FFFF93",
+"& c #FFFF92",
+"* c #FFFF91",
+"= c #FFFF90",
+"- c #FFFF8F",
+"; c #FFFF8E",
+": c #FFFF8D",
+"> c #FFFF8C",
+", c #FFFF8B",
+"< c #FFFF8A",
+"1 c #FFFE8A",
+"2 c #FFFE87",
+"3 c #FFFC8C",
+"4 c #FFFB8F",
+"5 c #FEFE9A",
+"6 c #FCF788",
+"7 c #FBF889",
+"8 c #F8F285",
+"9 c #F7F588",
+"0 c #F5EC82",
+"q c #F3F388",
+"w c #F3E681",
+"e c #F3E67E",
+"r c #F3E581",
+"t c #F2E580",
+"y c #F2E480",
+"u c #F2E27E",
+"i c #F1E57D",
+"p c #F0E97F",
+"a c #F0E47E",
+"s c #F0E37F",
+"d c #F0E17F",
+"f c #EFE27F",
+"g c #EFDF7E",
+"h c #EEEB8F",
+"j c #EEEB89",
+"k c #EEEB83",
+"l c #EEE67E",
+"z c #EEE07E",
+"x c #EEE07D",
+"c c #EEDE7D",
+"v c #EEDE7B",
+"b c #EDE77F",
+"n c #EBE57E",
+"m c #EAE98B",
+"M c #E7E17C",
+"N c #E3DE7A",
+"B c #E3DC7A",
+"V c #E0DA78",
+"C c #DEDD80",
+"Z c #DEDD7E",
+"A c #DED376",
+"S c #DDDA81",
+"D c #DCDCDB",
+"F c #DCD575",
+"G c #DCD075",
+"H c #DAD076",
+"J c #DACF75",
+"K c #D7CD72",
+"L c #D7CC72",
+"P c #D7CB71",
+"I c #D7CA73",
+"U c #D7C972",
+"Y c gray84",
+"T c #D5D5D5",
+"R c #D3D171",
+"E c #D3CF73",
+"W c #CDC870",
+"Q c #C7C26C",
+"! c #C7C16C",
+"~ c #C5C675",
+"^ c #C5C269",
+"/ c #C5B768",
+"( c #C3C3C3",
+") c #C3C26B",
+"_ c gray76",
+"` c #C1B366",
+"' c #C0C0C1",
+"] c #C0C0C0",
+"[ c #C0BE68",
+"{ c gray75",
+"} c gray",
+"| c #BEBCBE",
+" . c #BEBCBD",
+".. c #BEBC69",
+"X. c #BEBA68",
+"o. c #BDBCBE",
+"O. c #BDB064",
+"+. c #BCBDBE",
+"@. c #BCBD6D",
+"#. c #BCBCBE",
+"$. c #BCBABA",
+"%. c #BBBCBD",
+"&. c #BBBABB",
+"*. c #BBB863",
+"=. c #BBB664",
+"-. c #BBAD65",
+";. c #BBAD62",
+":. c #BABBBB",
+">. c #BAB766",
+",. c #BAAE63",
+"<. c #B8B565",
+"1. c #B8B564",
+"2. c #B7B465",
+"3. c #B6B463",
+"4. c #B5B462",
+"5. c #B5B264",
+"6. c #B3AE60",
+"7. c #B3AE5F",
+"8. c #ACA75C",
+"9. c #ABA85E",
+"0. c #ABA65C",
+"q. c #ABA55A",
+"w. c #AA9C5B",
+"e. c #A9A75D",
+"r. c #A9A55C",
+"t. c #A7A25A",
+"y. c #A3A15A",
+"u. c #9F9255",
+"i. c #9C9A54",
+"p. c #9C8F56",
+"a. c #928E59",
+"s. c #908E58",
+"d. c #908957",
+"f. c #8D814B",
+"g. c #878383",
+"h. c #868154",
+"j. c #858248",
+"k. c #838348",
+"l. c #837F7F",
+"z. c #817C44",
+"x. c #817B50",
+"c. c #7F7C4E",
+"v. c #7E7E45",
+"b. c #7E7D44",
+"n. c #7C7878",
+"m. c #7C784D",
+"M. c #7C7840",
+"N. c #7A724B",
+"B. c #787944",
+"V. c #77797E",
+"C. c #77787D",
+"Z. c #77777C",
+"A. c #777676",
+"S. c #77757A",
+"D. c #777542",
+"F. c #77747A",
+"G. c #76757A",
+"H. c #767476",
+"J. c #75713D",
+"K. c #756A46",
+"L. c #747477",
+"P. c #73743F",
+"I. c #737346",
+"U. c #73733F",
+"Y. c #73713E",
+"T. c #726F3C",
+"R. c #726D3A",
+"E. c #706E3D",
+"W. c #706D3D",
+"Q. c #6F6F3B",
+"!. c #6F6D71",
+"~. c #6F6D70",
+"^. c #6E7074",
+"/. c #6E6F73",
+"(. c #6E6E6F",
+"). c #6E6D71",
+"_. c #6E6D70",
+"`. c #6E6C70",
+"'. c #6C6D70",
+"]. c #6C693B",
+"[. c #6C693A",
+"{. c #6B6C70",
+"}. c #6B6A6D",
+"|. c #6A6A6C",
+" X c #6A6744",
+".X c #676436",
+"XX c #615F35",
+"oX c #5F5F34",
+"OX c #5D5D33",
+"+X c #595830",
+"@X c #575630",
+"#X c #53522E",
+"$X c #50502F",
+"%X c #50502E",
+"&X c #504F2C",
+"*X c #4F4736",
+"=X c #4E4433",
+"-X c #4D4835",
+";X c #4D4735",
+":X c #4D4635",
+">X c #4D4433",
+",X c #4C4C2A",
+"<X c #474626",
+"1X c #464425",
+"2X c #443E39",
+"3X c #423D39",
+"4X c #3E382D",
+"5X c #3E352B",
+"6X c #3D3A39",
+"7X c #3D3A2E",
+"8X c #3D392D",
+"9X c #3D382E",
+"0X c #3D382D",
+"qX c #3D3736",
+"wX c #3D372E",
+"eX c #3B3B20",
+"rX c #3B3635",
+"tX c #3B3534",
+"yX c #3A3A1F",
+"uX c #3A3736",
+"iX c #3A3636",
+"pX c #3A3329",
+"aX c #333135",
+"sX c #323034",
+"dX c #322F34",
+"fX c #313236",
+"gX c #313136",
+"hX c #313135",
+"jX c #313131",
+"kX c #313035",
+"lX c #313034",
+"zX c #312E33",
+"xX c #312E27",
+"cX c #30301A",
+"vX c #302F2F",
+"bX c #2F2E2F",
+"nX c #2F2B24",
+"mX c #2E2A2A",
+"MX c #292421",
+"NX c black",
+"BX c black",
+"VX c black",
+"CX c black",
+"ZX c black",
+"AX c black",
+"SX c black",
+"DX c black",
+"FX c black",
+"GX c black",
+"HX c black",
+"JX c black",
+"KX c black",
+"LX c black",
+"PX c black",
+"IX c black",
+"UX c black",
+/* pixels */
+" ",
+" ",
+" ",
+" ",
+" ",
+" D g.A.Z.Z.Z.Z.V.V.V.V.V.V.Z.Z.V.Z.Z.Z.A.l.Y ",
+" { aXxX*X*X*X*X*X-X-X-X-X-X-X*X*X*X*X*X5XbX{ ",
+" ( dXK.e e e f g f e w w f f w e g g g t.qX{ ",
+" ( dXN.# e N 6 - - - k f # - M N - - - -.qX{ ",
+" { aXx.Z .X#Xj.h O.oXQ..XZ W #X&Xt.0 - -.qX{ ",
+" ( aXa.J.8.. T.2.Q cXh 2.J.oXf O <XA - -.qX{ ",
+" ( dXd.v.8.O J.*.2.z.. t.v.@X<X#XyXf - 7.qX{ ",
+" ( aXa.T.7.. T.2.Q ,XO *.Q.@XK 0 2.0 - ` qX{ ",
+" { aXh.*.Q.D.J.C *.eXv.Q...t.D.D.v.h 7.f.2X{ ",
+" ( aXN.# [ 8.Z O t.D.~ ..# # 7.9.8 - R u.qX{ ",
+" ( aXc.- # # - - Q i.O # - - # # - 2 # / qX{ ",
+" ( dX XA K K K K A A K K K K K K K K J p.qX{ ",
+" { bXMX5X4X4X5X4X4X4X5X4X4X5X5X5X5X5X5XnXbX{ ",
+" Y n.(.(.!.!.^.^.^.!.!.^.!.^.!.!.!.!.(.(.A.Y ",
+" ",
+" ",
+" ",
+" ",
+" "
+};
--- /dev/null
+/* XPM */
+static char *outlet[] = {
+/* columns rows colors chars-per-pixel */
+"24 24 256 2 ",
+" c None",
+". c #FFFFFE",
+"X c #FFFF92",
+"o c #FFFF8C",
+"O c #FFFF89",
+"+ c #FFFE8A",
+"@ c #FFFE89",
+"# c #FFFE88",
+"$ c #FFF590",
+"% c #FFF282",
+"& c #FFF281",
+"* c #FFF278",
+"= c #FEFEFE",
+"- c #FEFEFD",
+"; c #FEF58C",
+": c #FDFDFD",
+"> c #FDFDFC",
+", c gray99",
+"< c #FCFCFB",
+"1 c #FBFBFC",
+"2 c gray98",
+"3 c #F9F9F9",
+"4 c #F8F7F9",
+"5 c gray97",
+"6 c #F7F086",
+"7 c #F7EB8E",
+"8 c #F6F6F6",
+"9 c #F6F6F5",
+"0 c #F5F6F7",
+"q c #F4F4F4",
+"w c #F4ED87",
+"e c #F4E578",
+"r c #F3EB88",
+"t c #F3E276",
+"y c #F2F3F2",
+"u c gray95",
+"i c #F1E27D",
+"p c #F0F0F1",
+"a c #EFEF7A",
+"s c #EEE088",
+"d c #EDEDEF",
+"f c #ECE87C",
+"g c #EBEAEC",
+"h c #EBE384",
+"j c #E7E7EA",
+"k c #E6E6E7",
+"l c #E5E5E6",
+"z c #E2E2E4",
+"x c #E1E1E2",
+"c c #E0E0E1",
+"v c #DCDCDD",
+"b c #DBDBDC",
+"n c #DADBDE",
+"m c #D9CD79",
+"M c #D8D8D7",
+"N c #D5D5D4",
+"B c #D5C77E",
+"V c #D1D1D2",
+"C c #D0CE7D",
+"Z c #CACACD",
+"A c #C8C977",
+"S c #C8C8C8",
+"D c #C8C073",
+"F c #C4C4C8",
+"G c #C1C1C4",
+"H c #BFBFC2",
+"J c #BCB16B",
+"K c #BBAF6D",
+"L c #BABABB",
+"P c #B8B8B9",
+"I c #B6B6B6",
+"U c #B5B5B7",
+"Y c #B4B4B8",
+"T c #AFAFB0",
+"R c #AEAEB6",
+"E c #ADADAC",
+"W c #ACACAF",
+"Q c #A8A8AD",
+"! c #A8A8AC",
+"~ c #A7A7A8",
+"^ c #A4A36A",
+"/ c #A49B62",
+"( c #A3A4B5",
+") c #A2A2A6",
+"_ c #A1A066",
+"` c #A0A269",
+"' c #9E9E9D",
+"] c #9E9A65",
+"[ c #99999C",
+"{ c #989899",
+"} c #988E5A",
+"| c #959597",
+" . c #939397",
+".. c #919194",
+"X. c #918A60",
+"o. c #8E8F93",
+"O. c #8E8EA8",
+"+. c #8E8E8E",
+"@. c #8E8D92",
+"#. c #8D8D91",
+"$. c #8B8B8E",
+"%. c #8A8B8F",
+"&. c #87878B",
+"*. c #877E50",
+"=. c #837F4E",
+"-. c #82794E",
+";. c #8182A4",
+":. c #807B4E",
+">. c gray49",
+",. c #7C7C7F",
+"<. c #79724D",
+"1. c #77704B",
+"2. c #76797F",
+"3. c #757474",
+"4. c #747475",
+"5. c #736F50",
+"6. c #726B45",
+"7. c #707274",
+"8. c #696147",
+"9. c #636369",
+"0. c #616469",
+"q. c gray37",
+"w. c #5D5D60",
+"e. c #5D563E",
+"r. c #595539",
+"t. c #57595B",
+"y. c #555658",
+"u. c #555142",
+"i. c #545456",
+"p. c #534F3B",
+"a. c #505059",
+"s. c #4E4B50",
+"d. c #4E4B3B",
+"f. c #4C4C4E",
+"g. c #4C492E",
+"h. c #4C4843",
+"j. c #4B4C52",
+"k. c #4B4B4A",
+"l. c #4B4533",
+"z. c #4A4A49",
+"x. c #4A4637",
+"c. c #49483C",
+"v. c #49452C",
+"b. c #484847",
+"n. c #484846",
+"m. c #474748",
+"M. c #46464D",
+"N. c #464642",
+"B. c #45464D",
+"V. c #45442E",
+"C. c #444545",
+"Z. c #444445",
+"A. c #444441",
+"S. c #434346",
+"D. c #434242",
+"F. c #43403D",
+"G. c #414147",
+"H. c #414144",
+"J. c #414143",
+"K. c #41413F",
+"L. c #40423E",
+"P. c #403F45",
+"I. c #3F403D",
+"U. c #3F403A",
+"Y. c #3F3F46",
+"T. c #3E3D41",
+"R. c #3E3C37",
+"E. c #3D3D3E",
+"W. c #3C3D41",
+"Q. c #3B3C3D",
+"!. c #3B3B3E",
+"~. c #3B3B38",
+"^. c #3B3B37",
+"/. c #3A3B40",
+"(. c #3A3A3B",
+"). c #39362D",
+"_. c #383840",
+"`. c #363634",
+"'. c #35353C",
+"]. c #343432",
+"[. c gray20",
+"{. c #302F2A",
+"}. c #2F2F44",
+"|. c #2D2B46",
+" X c #2B2D28",
+".X c #2B2B2F",
+"XX c #2A2B2F",
+"oX c #272720",
+"OX c #242426",
+"+X c black",
+"@X c black",
+"#X c black",
+"$X c black",
+"%X c black",
+"&X c black",
+"*X c black",
+"=X c black",
+"-X c black",
+";X c black",
+":X c black",
+">X c black",
+",X c black",
+"<X c black",
+"1X c black",
+"2X c black",
+"3X c black",
+"4X c black",
+"5X c black",
+"6X c black",
+"7X c black",
+"8X c black",
+"9X c black",
+"0X c black",
+"qX c black",
+"wX c black",
+"eX c black",
+"rX c black",
+"tX c black",
+"yX c black",
+"uX c black",
+"iX c black",
+"pX c black",
+"aX c black",
+"sX c black",
+"dX c black",
+"fX c black",
+"gX c black",
+"hX c black",
+"jX c black",
+"kX c black",
+"lX c black",
+"zX c black",
+"xX c black",
+"cX c black",
+"vX c black",
+"bX c black",
+"nX c black",
+"mX c black",
+"MX c black",
+"NX c black",
+"BX c black",
+"VX c black",
+"CX c black",
+"ZX c black",
+"AX c black",
+"SX c black",
+"DX c black",
+"FX c black",
+"GX c black",
+"HX c black",
+"JX c black",
+"KX c black",
+"LX c black",
+"PX c black",
+"IX c black",
+"UX c black",
+/* pixels */
+" ",
+" ",
+" 5 5 5 ",
+" 5 Y N.E.2.4 ",
+" I E. X3. ",
+" E | >.F.Y.y.o.&.N ",
+" T X`.N.N.Y.oX3.5 ",
+" F f.'.Y.`.o. ",
+" Z f.`.+. ",
+" d +.q.H j ",
+" k E 9.m.Y.m.9.E 5 ",
+" 5 ' I. XE.F.l. XY.' d ",
+" ' h.v.u.f.A C / g.E.) ",
+" v w.oX} } N.6 o $ K e.3.v ",
+" H N.l.m ] Y.t * o h =.s.( ",
+" E '.8.7 ^ Y.e % o a *.}.;. ",
+" Y Y.e.s ^ N.a % o a <.}.O. ",
+" v i.).J ] P.w o X D d.y.F ",
+" ' N.6.5.N.7 ; B 1.R.o.5 ",
+" v o.d.R.N.=.=.p.F.>.v ",
+" k | i.N.'.Y.s.+.v ",
+" 5 N L T Y Z 4 ",
+" ",
+" "
+};
--- /dev/null
+/* XPM */
+static char *output[] = {
+/* columns rows colors chars-per-pixel */
+"24 24 256 2 ",
+" c None",
+". c #FFFF91",
+"X c #FFFF90",
+"o c #FFFF8F",
+"O c #FFFF8E",
+"+ c #FFFF8C",
+"@ c #FCFC8A",
+"# c #F9F88A",
+"$ c #F9F889",
+"% c #F8F88A",
+"& c #F8F889",
+"* c #F8F888",
+"= c #F6F68C",
+"- c #F3F286",
+"; c #F2F289",
+": c #F2F285",
+"> c #F0F089",
+", c #F0F088",
+"< c #F0F087",
+"1 c #EFEF89",
+"2 c #C0C0C0",
+"3 c #B8B8B9",
+"4 c #B7B4AE",
+"5 c #B6B6B5",
+"6 c gray71",
+"7 c #B4B4B4",
+"8 c #B2B2B3",
+"9 c #B2B2B2",
+"0 c #7D7D7F",
+"q c #78787B",
+"w c #737374",
+"e c #66664D",
+"r c #66664C",
+"t c #64644C",
+"y c #63634C",
+"u c #63634B",
+"i c #62614A",
+"p c #36321B",
+"a c #343233",
+"s c #343231",
+"d c #34302C",
+"f c #332F19",
+"g c #323213",
+"h c #322F17",
+"j c #313112",
+"k c #313111",
+"l c #312F14",
+"z c #302D19",
+"x c #2F2F36",
+"c c #2F2F12",
+"v c #2F2F11",
+"b c #2E2D34",
+"n c #2D2D35",
+"m c #2C2D12",
+"M c #2C2C34",
+"N c #2A2A34",
+"B c #090800",
+"V c #080800",
+"C c black",
+"Z c black",
+"A c black",
+"S c black",
+"D c black",
+"F c black",
+"G c black",
+"H c black",
+"J c black",
+"K c black",
+"L c black",
+"P c black",
+"I c black",
+"U c black",
+"Y c black",
+"T c black",
+"R c black",
+"E c black",
+"W c black",
+"Q c black",
+"! c black",
+"~ c black",
+"^ c black",
+"/ c black",
+"( c black",
+") c black",
+"_ c black",
+"` c black",
+"' c black",
+"] c black",
+"[ c black",
+"{ c black",
+"} c black",
+"| c black",
+" . c black",
+".. c black",
+"X. c black",
+"o. c black",
+"O. c black",
+"+. c black",
+"@. c black",
+"#. c black",
+"$. c black",
+"%. c black",
+"&. c black",
+"*. c black",
+"=. c black",
+"-. c black",
+";. c black",
+":. c black",
+">. c black",
+",. c black",
+"<. c black",
+"1. c black",
+"2. c black",
+"3. c black",
+"4. c black",
+"5. c black",
+"6. c black",
+"7. c black",
+"8. c black",
+"9. c black",
+"0. c black",
+"q. c black",
+"w. c black",
+"e. c black",
+"r. c black",
+"t. c black",
+"y. c black",
+"u. c black",
+"i. c black",
+"p. c black",
+"a. c black",
+"s. c black",
+"d. c black",
+"f. c black",
+"g. c black",
+"h. c black",
+"j. c black",
+"k. c black",
+"l. c black",
+"z. c black",
+"x. c black",
+"c. c black",
+"v. c black",
+"b. c black",
+"n. c black",
+"m. c black",
+"M. c black",
+"N. c black",
+"B. c black",
+"V. c black",
+"C. c black",
+"Z. c black",
+"A. c black",
+"S. c black",
+"D. c black",
+"F. c black",
+"G. c black",
+"H. c black",
+"J. c black",
+"K. c black",
+"L. c black",
+"P. c black",
+"I. c black",
+"U. c black",
+"Y. c black",
+"T. c black",
+"R. c black",
+"E. c black",
+"W. c black",
+"Q. c black",
+"!. c black",
+"~. c black",
+"^. c black",
+"/. c black",
+"(. c black",
+"). c black",
+"_. c black",
+"`. c black",
+"'. c black",
+"]. c black",
+"[. c black",
+"{. c black",
+"}. c black",
+"|. c black",
+" X c black",
+".X c black",
+"XX c black",
+"oX c black",
+"OX c black",
+"+X c black",
+"@X c black",
+"#X c black",
+"$X c black",
+"%X c black",
+"&X c black",
+"*X c black",
+"=X c black",
+"-X c black",
+";X c black",
+":X c black",
+">X c black",
+",X c black",
+"<X c black",
+"1X c black",
+"2X c black",
+"3X c black",
+"4X c black",
+"5X c black",
+"6X c black",
+"7X c black",
+"8X c black",
+"9X c black",
+"0X c black",
+"qX c black",
+"wX c black",
+"eX c black",
+"rX c black",
+"tX c black",
+"yX c black",
+"uX c black",
+"iX c black",
+"pX c black",
+"aX c black",
+"sX c black",
+"dX c black",
+"fX c black",
+"gX c black",
+"hX c black",
+"jX c black",
+"kX c black",
+"lX c black",
+"zX c black",
+"xX c black",
+"cX c black",
+"vX c black",
+"bX c black",
+"nX c black",
+"mX c black",
+"MX c black",
+"NX c black",
+"BX c black",
+"VX c black",
+"CX c black",
+"ZX c black",
+"AX c black",
+"SX c black",
+"DX c black",
+"FX c black",
+"GX c black",
+"HX c black",
+"JX c black",
+"KX c black",
+"LX c black",
+"PX c black",
+"IX c black",
+"UX c black",
+/* pixels */
+" ",
+" ",
+" ",
+" ",
+" 2 0 0 w 0 w 0 w 0 w 0 w 0 w 3 ",
+" w B p c f c f h h f c f c f a 4 ",
+" 0 g - o = o - o - o - o = = e x 5 ",
+" w c o o o o o o o o o o o . 1 e x 5 ",
+" 0 c - o o o o o o o o o o o o 1 e x 5 ",
+" w c o o o o o o o o o o o o o o 1 e x 5 ",
+" 0 c - o o o o o o o o o o o o o o 1 e x 5 ",
+" w c o o o o o o o o o o o o o o o o = e d 5 ",
+" 0 c - o o o o o o o o o o o o o o o = e d 5 ",
+" w c o o o o o o o o o o o o o o o 1 e x 5 ",
+" 0 c - o o o o o o o o o o o o o - e x 5 ",
+" w c o o o o o o o o o o o o o 1 e x 5 ",
+" 0 c o o o o o o o o o o o o 1 e x 5 ",
+" w g 1 o - o - o - o - o - - e x 5 ",
+" w C g c c c c c c c c c c c d 4 ",
+" 2 0 0 0 w 0 w 0 w 0 w 0 w 0 3 ",
+" ",
+" ",
+" ",
+" "
+};
--- /dev/null
+/* XPM */
+static char *package[] = {
+/* columns rows colors chars-per-pixel */
+"24 24 256 2 ",
+" c None",
+". c #FFFF96",
+"X c #FFFF95",
+"o c #FFFF94",
+"O c #FFFF93",
+"+ c #FFFF91",
+"@ c #FFFF90",
+"# c #FFFF8F",
+"$ c #FFFF8E",
+"% c #FFFF8D",
+"& c #FFFF8C",
+"* c #FFFF8B",
+"= c #FFFE8D",
+"- c #FFFE8C",
+"; c #FFFE8B",
+": c #FFFE8A",
+"> c #FFFD8C",
+", c #FFFD8B",
+"< c #FFFD8A",
+"1 c #FFFC8C",
+"2 c #FFFC8B",
+"3 c #FFFC8A",
+"4 c #FFFB8C",
+"5 c #FFFB8B",
+"6 c #FFFB8A",
+"7 c #FFFB89",
+"8 c #FFFA8B",
+"9 c #FFFA8A",
+"0 c #FFFA89",
+"q c #FFFA88",
+"w c #FFF98C",
+"e c #FFF98A",
+"r c #FFF989",
+"t c #FFF988",
+"y c #FFF88B",
+"u c #FFF887",
+"i c #FFF78B",
+"p c #FFF789",
+"a c #FCFB8A",
+"s c #F9F989",
+"d c #F2EE86",
+"f c #F2ED84",
+"g c #F1EB85",
+"h c #F0ED84",
+"j c #EFEC84",
+"k c #E6E681",
+"l c #E4DF7F",
+"z c #E4DE80",
+"x c #D9D77B",
+"c c #D9D77A",
+"v c #D9D37A",
+"b c #D0CA73",
+"n c #CCC674",
+"m c #CBCA74",
+"M c #C6C071",
+"N c #C6C06E",
+"B c #C6BF72",
+"V c #BFB96B",
+"C c #BCBC72",
+"Z c #BCBC70",
+"A c #BCBC6F",
+"S c #BCBB6D",
+"D c #BCB96F",
+"F c #BCB96E",
+"G c #BCB96D",
+"H c #BCB86E",
+"J c #BCB86C",
+"K c #BCB86B",
+"L c #BCB76E",
+"P c #BCB76D",
+"I c #BCB76A",
+"U c #BCB66D",
+"Y c #BCB66B",
+"T c #BCB669",
+"R c #BCB56C",
+"E c #B2B2B2",
+"W c #B1B069",
+"Q c #B1AC68",
+"! c #A9A567",
+"~ c #A4A466",
+"^ c #999960",
+"/ c #98985F",
+"( c #98985E",
+") c #98975F",
+"_ c #98975E",
+"` c #98965F",
+"' c #98965E",
+"] c #98955F",
+"[ c #97955D",
+"{ c #939496",
+"} c #939396",
+"| c #93925D",
+" . c #93915D",
+".. c #93905A",
+"X. c #939059",
+"o. c #938E5B",
+"O. c #928F58",
+"+. c #928E58",
+"@. c #928D58",
+"#. c #928C58",
+"$. c #918E58",
+"%. c #918D5A",
+"&. c #918D58",
+"*. c #909191",
+"=. c #909091",
+"-. c #8D8955",
+";. c #848357",
+":. c #848053",
+">. c #847E53",
+",. c #7B7A51",
+"<. c #7A7851",
+"1. c #716D49",
+"2. c #6E6E4C",
+"3. c #696943",
+"4. c #696942",
+"5. c #696843",
+"6. c #69623E",
+"7. c #686843",
+"8. c #686842",
+"9. c #686743",
+"0. c #686742",
+"q. c #686642",
+"w. c #686641",
+"e. c #686540",
+"r. c #68633F",
+"t. c #605F3F",
+"y. c #5F5D3C",
+"u. c #5F5A3A",
+"i. c #5F5939",
+"p. c #58585F",
+"a. c #585858",
+"s. c #58575F",
+"d. c #58575E",
+"f. c #585757",
+"g. c #58573B",
+"h. c #58565D",
+"j. c #585639",
+"k. c #585539",
+"l. c #575842",
+"z. c #545135",
+"x. c #535137",
+"c. c #535136",
+"v. c #534D33",
+"b. c #393430",
+"n. c #383733",
+"m. c #333331",
+"M. c #2F2D24",
+"N. c #2F2C25",
+"B. c #2F2921",
+"V. c #2E2F27",
+"C. c #2E2D26",
+"Z. c #2E2D25",
+"A. c #2E2C25",
+"S. c #2E2C24",
+"D. c #2E2B25",
+"F. c #2E2B24",
+"G. c #2E2B23",
+"H. c #2E2A23",
+"J. c #2E2720",
+"K. c #2B2B2F",
+"L. c #2B2B2E",
+"P. c #161513",
+"I. c #161412",
+"U. c #161312",
+"Y. c #161311",
+"T. c black",
+"R. c black",
+"E. c black",
+"W. c black",
+"Q. c black",
+"!. c black",
+"~. c black",
+"^. c black",
+"/. c black",
+"(. c black",
+"). c black",
+"_. c black",
+"`. c black",
+"'. c black",
+"]. c black",
+"[. c black",
+"{. c black",
+"}. c black",
+"|. c black",
+" X c black",
+".X c black",
+"XX c black",
+"oX c black",
+"OX c black",
+"+X c black",
+"@X c black",
+"#X c black",
+"$X c black",
+"%X c black",
+"&X c black",
+"*X c black",
+"=X c black",
+"-X c black",
+";X c black",
+":X c black",
+">X c black",
+",X c black",
+"<X c black",
+"1X c black",
+"2X c black",
+"3X c black",
+"4X c black",
+"5X c black",
+"6X c black",
+"7X c black",
+"8X c black",
+"9X c black",
+"0X c black",
+"qX c black",
+"wX c black",
+"eX c black",
+"rX c black",
+"tX c black",
+"yX c black",
+"uX c black",
+"iX c black",
+"pX c black",
+"aX c black",
+"sX c black",
+"dX c black",
+"fX c black",
+"gX c black",
+"hX c black",
+"jX c black",
+"kX c black",
+"lX c black",
+"zX c black",
+"xX c black",
+"cX c black",
+"vX c black",
+"bX c black",
+"nX c black",
+"mX c black",
+"MX c black",
+"NX c black",
+"BX c black",
+"VX c black",
+"CX c black",
+"ZX c black",
+"AX c black",
+"SX c black",
+"DX c black",
+"FX c black",
+"GX c black",
+"HX c black",
+"JX c black",
+"KX c black",
+"LX c black",
+"PX c black",
+"IX c black",
+"UX c black",
+/* pixels */
+" ",
+" ",
+" ",
+" ",
+" ",
+" E f.p.s.p.p.p.p.p.p.p.p.p.p.p.p.p.s.s.p.p.E ",
+" { P.z.y.3.9.9.3.9.3.9.3.9.9.3.t.g.g.g.z.P.{ ",
+" { M.# x [ ) ) ) ) ) ) / ) ^ [ x . # # # M.{ ",
+" { M.# -.;.C V V C L V V C W K.b.n # # d M.{ ",
+" { M.# -.M . . # # # . # . d ,.~ m.b . d J.{ ",
+" { M.u [ L # # u # # u # # l 1.. ! b.m u M.{ ",
+" { M.# -.L # u u # i i # u d l.2.,.K.o.# M.{ ",
+" { M.# -.V # # i u # u # i # j l k Q [ u M.{ ",
+" { M.# -.V # u u # u # u # u # # # V -.# M.{ ",
+" { M.# o.N . # # # # # # # # # # . N -.# M.{ ",
+" { M.# -.;.V L L L L L L L V L L V >.-.# M.{ ",
+" { J.# x [ [ ) ) ) ) ) ) ) ) ) ) / [ x # M.{ ",
+" { P.z.y.t.3.6.6.3.9.9.9.9.9.9.6.9.9.y.v.P.{ ",
+" E f.s.s.s.p.s.s.p.p.p.p.p.p.p.s.s.s.s.s.f.E ",
+" ",
+" ",
+" ",
+" ",
+" "
+};
--- /dev/null
+/* XPM */
+static char *partition[] = {
+/* columns rows colors chars-per-pixel */
+"24 24 256 2 ",
+" c None",
+". c #FFFFFE",
+"X c #FFFFA3",
+"o c #FFFF98",
+"O c #FFFF97",
+"+ c #FFFF94",
+"@ c #FFFF93",
+"# c #FFFF92",
+"$ c #FFFF91",
+"% c #FFFF90",
+"& c #FFFF8F",
+"* c #FFFF8E",
+"= c #FFFF8D",
+"- c #FFFF8C",
+"; c #FFFF8A",
+": c #FFFF88",
+"> c #FFFE95",
+", c #FFFE90",
+"< c #FFFE8E",
+"1 c #FFFE8D",
+"2 c #FFFE8C",
+"3 c #FFFE8B",
+"4 c #FFFD90",
+"5 c #FFFD8C",
+"6 c #FFFC8E",
+"7 c #FFFC8B",
+"8 c #FFFC8A",
+"9 c #FFFB8C",
+"0 c #FFFB8B",
+"q c #FFFB8A",
+"w c #FFFB89",
+"e c #FFFA8C",
+"r c #FFF98B",
+"t c #FFF98A",
+"y c #FFF88B",
+"u c #FFF88A",
+"i c #FFF789",
+"p c #FDFDFD",
+"a c #FCFA89",
+"s c #F7F48B",
+"d c #F7F086",
+"f c #F6F487",
+"g c #F6F380",
+"h c #F5F280",
+"j c #F5F27F",
+"k c #F5F186",
+"l c #F5F185",
+"z c #F5F183",
+"x c #F5F087",
+"c c #F5F086",
+"v c #F5F083",
+"b c #F5EE87",
+"n c #F5EE86",
+"m c #F5EE85",
+"M c #F4F4F5",
+"N c #F4F4F3",
+"B c #F4F087",
+"V c #F1EE7E",
+"C c #F1ED83",
+"Z c #F0F0F2",
+"A c #EFF0F1",
+"S c #EEE984",
+"D c #EDEC84",
+"F c #ECEC87",
+"G c #EAEA7D",
+"H c #E6E6E6",
+"J c #E5E5ED",
+"K c #E5E5EC",
+"L c #E5E5EB",
+"P c #E4E4EC",
+"I c #E4E4EB",
+"U c #E4E377",
+"Y c #D8D87E",
+"T c #D7D7D8",
+"R c #D1CC75",
+"E c gray80",
+"W c #CCCB75",
+"Q c #CBC76C",
+"! c #C9C975",
+"~ c #C9C676",
+"^ c #C8C874",
+"/ c #C8C671",
+"( c #C8C573",
+") c #C8C470",
+"_ c #C8C374",
+"` c #C8C371",
+"' c #C8C370",
+"] c #C5C270",
+"[ c #C2C272",
+"{ c #C1C1C5",
+"} c #BCBCC5",
+"| c #BCBCC4",
+" . c #BCBCC3",
+".. c #BCBC68",
+"X. c #BCBC66",
+"o. c #BCBB6E",
+"O. c #BCBA6E",
+"+. c #BCBA6D",
+"@. c #BCB96C",
+"#. c #BCB965",
+"$. c #BCB963",
+"%. c #BCB962",
+"&. c #BCB865",
+"*. c #BCB864",
+"=. c #BCB76C",
+"-. c #BCB76B",
+";. c #BCB66C",
+":. c #BCB66B",
+">. c #BCB665",
+",. c #BCB663",
+"<. c #BBBBC4",
+"1. c #BBBBC3",
+"2. c #BBB76E",
+"3. c #B8B8C1",
+"4. c #B5B26B",
+"5. c #B1AD69",
+"6. c #AAA461",
+"7. c #A3A363",
+"8. c #9A995E",
+"9. c #979862",
+"0. c #979358",
+"q. c #949156",
+"w. c #939360",
+"e. c #938E5A",
+"r. c #92925C",
+"t. c #92915C",
+"y. c #92915A",
+"u. c #92905C",
+"i. c #928E5C",
+"p. c #928E5B",
+"a. c #928E5A",
+"s. c #928E59",
+"d. c #91915A",
+"f. c #8F8F93",
+"g. c #8E8E94",
+"h. c #8E8E93",
+"j. c #8E8E91",
+"k. c #8E8E5D",
+"l. c #8E8E5A",
+"z. c #8E8D5A",
+"x. c #8E8C54",
+"c. c #8E8B5A",
+"v. c #8E8B54",
+"b. c #8E8A54",
+"n. c #8E8952",
+"m. c #8E8950",
+"M. c #8C8858",
+"N. c #88888D",
+"B. c #87834A",
+"V. c #878348",
+"C. c #837E41",
+"Z. c #818046",
+"A. c #7E7E81",
+"S. c #7D7E82",
+"D. c #7B7B7F",
+"F. c #7B7B7E",
+"G. c #7B7851",
+"H. c #76777D",
+"J. c #75757D",
+"K. c #74703D",
+"L. c #73747C",
+"P. c #73734E",
+"I. c #737054",
+"U. c #73704D",
+"Y. c #72726B",
+"T. c #72726A",
+"R. c #727155",
+"E. c #727154",
+"W. c #727153",
+"Q. c #72714F",
+"!. c #72714E",
+"~. c #727055",
+"^. c #727053",
+"/. c #72704E",
+"(. c #72704D",
+"). c #72704C",
+"_. c #72704B",
+"`. c #726F54",
+"'. c #726F53",
+"]. c #726F4C",
+"[. c #717270",
+"{. c #71717A",
+"}. c #716E3E",
+"|. c #706E50",
+" X c #6E6E67",
+".X c #6D6C66",
+"XX c #6C6B3C",
+"oX c #6C693A",
+"OX c #6B6C76",
+"+X c #6B6B4F",
+"@X c #676760",
+"#X c #646461",
+"$X c #646338",
+"%X c #646335",
+"&X c #636448",
+"*X c #636248",
+"=X c #635F35",
+"-X c #626147",
+";X c #5C5B3A",
+":X c #5B5A3A",
+">X c #57574F",
+",X c #57553D",
+"<X c #505036",
+"1X c #4E4E40",
+"2X c #4D4D33",
+"3X c #4B4A33",
+"4X c #4A4932",
+"5X c #3D3C21",
+"6X c #3D3B21",
+"7X c #35341D",
+"8X c #32311B",
+"9X c #31301B",
+"0X c #30301D",
+"qX c #30301C",
+"wX c #30301B",
+"eX c #30301A",
+"rX c #302F18",
+"tX c #2F2E19",
+"yX c #2E2D1A",
+"uX c #2C2D18",
+"iX c #2C2917",
+"pX c #232413",
+"aX c #232113",
+"sX c #18181C",
+"dX c #11111A",
+"fX c #090905",
+"gX c #090805",
+"hX c black",
+"jX c black",
+"kX c black",
+"lX c black",
+"zX c black",
+"xX c black",
+"cX c black",
+"vX c black",
+"bX c black",
+"nX c black",
+"mX c black",
+"MX c black",
+"NX c black",
+"BX c black",
+"VX c black",
+"CX c black",
+"ZX c black",
+"AX c black",
+"SX c black",
+"DX c black",
+"FX c black",
+"GX c black",
+"HX c black",
+"JX c black",
+"KX c black",
+"LX c black",
+"PX c black",
+"IX c black",
+"UX c black",
+/* pixels */
+" ",
+" ",
+" M [. XY.Y.Y.Y.Y.Y.@XA. ",
+" J &XU V d j j j d G ;XD. ",
+" J I.& 4.x.e.e.e.e.0.G.dXA. ",
+" J I.& -X7.] ] W ] ] W Y ;XD. ",
+" J I.& P.d s ~ ~ ] W ~ ~ 6.sXH. ",
+" J I.& ].d e.-Xk.k.k.x.k.0.9.<XH. ",
+" J `.& P.d k.Q O & O & O & O S 2XH. ",
+" J `.& P.b e...O d & & & & & & S 2XH.M ",
+" J I.& +Xd 0.=.& & & & & & & & O S 2X{ ",
+" J I.& P.b k...& & }.5XiXrXXXd & O 0.} ",
+" J I.& P.b 0.=.& O 7XhX7XtXhXB.O & x.} ",
+" J I.& P.b e.=.& & tX7XX & hXK.O & x.} ",
+" J I.& P.d 0.=.& O 5XfXtXiXhXZ.O & x.} ",
+" J I.& ].b e...& O 5XfXtX7XXXi & O x.} ",
+" J `.& P.d 0.=.O & tX7Xo O & & & & x.} ",
+" M >X+X2X& k...& O pXpXO & b b d & x.} ",
+" A J X& 9.=.& & %X%X& & R 5.& O x.} ",
+" @XC.;X] & & & O i i & & & O x.} ",
+" T } OXQ O & & & O & & & & O q.} ",
+" f.C.X.>.X.X.X.>.X.>.>.X.=X} ",
+" E N.f.f.f.f.f.f.f.f.f.f.f.H ",
+" "
+};
--- /dev/null
+/* XPM */
+static char *paste[] = {
+/* columns rows colors chars-per-pixel */
+"24 24 256 2 ",
+" c None",
+". c #101010",
+"X c gray13",
+"o c gray29",
+"O c #CECECE",
+"+ c #EFEFEF",
+"@ c #180800",
+"# c #5A4210",
+"$ c #312100",
+"% c #B58410",
+"& c #D6A529",
+"* c #AD8421",
+"= c #CE9C21",
+"- c #7B5A08",
+"; c #C69C29",
+": c #BD9421",
+"> c #947318",
+", c #8C6B10",
+"< c #AD8410",
+"1 c #6B5208",
+"2 c #BD9418",
+"3 c #635210",
+"4 c #737318",
+"5 c #FFFF31",
+"6 c #6B6B10",
+"7 c #393908",
+"8 c #080800",
+"9 c #BDC629",
+"0 c #9CA521",
+"q c #A5AD21",
+"w c #848C18",
+"e c #ADBD21",
+"r c #424A10",
+"t c #313908",
+"y c #313931",
+"u c #6B737B",
+"i c #081018",
+"p c #E7EFFF",
+"a c #3163E7",
+"s c #002173",
+"d c #B5C6F7",
+"f c #94ADF7",
+"g c #84A5FF",
+"h c #5A84FF",
+"j c #527BEF",
+"k c #0842DE",
+"l c #425284",
+"z c #2952DE",
+"x c #2152E7",
+"c c #1842C6",
+"v c #4A63BD",
+"b c #4A6BE7",
+"n c #3152CE",
+"m c #294AC6",
+"M c #CED6F7",
+"N c #4A5AAD",
+"B c #BDC6F7",
+"V c #F7F7FF",
+"C c #B5B5BD",
+"Z c #A5A5AD",
+"A c #7B7B8C",
+"S c #73739C",
+"D c #080810",
+"F c black",
+"G c black",
+"H c black",
+"J c black",
+"K c black",
+"L c black",
+"P c black",
+"I c black",
+"U c black",
+"Y c black",
+"T c black",
+"R c black",
+"E c black",
+"W c black",
+"Q c black",
+"! c black",
+"~ c black",
+"^ c black",
+"/ c black",
+"( c black",
+") c black",
+"_ c black",
+"` c black",
+"' c black",
+"] c black",
+"[ c black",
+"{ c black",
+"} c black",
+"| c black",
+" . c black",
+".. c black",
+"X. c black",
+"o. c black",
+"O. c black",
+"+. c black",
+"@. c black",
+"#. c black",
+"$. c black",
+"%. c black",
+"&. c black",
+"*. c black",
+"=. c black",
+"-. c black",
+";. c black",
+":. c black",
+">. c black",
+",. c black",
+"<. c black",
+"1. c black",
+"2. c black",
+"3. c black",
+"4. c black",
+"5. c black",
+"6. c black",
+"7. c black",
+"8. c black",
+"9. c black",
+"0. c black",
+"q. c black",
+"w. c black",
+"e. c black",
+"r. c black",
+"t. c black",
+"y. c black",
+"u. c black",
+"i. c black",
+"p. c black",
+"a. c black",
+"s. c black",
+"d. c black",
+"f. c black",
+"g. c black",
+"h. c black",
+"j. c black",
+"k. c black",
+"l. c black",
+"z. c black",
+"x. c black",
+"c. c black",
+"v. c black",
+"b. c black",
+"n. c black",
+"m. c black",
+"M. c black",
+"N. c black",
+"B. c black",
+"V. c black",
+"C. c black",
+"Z. c black",
+"A. c black",
+"S. c black",
+"D. c black",
+"F. c black",
+"G. c black",
+"H. c black",
+"J. c black",
+"K. c black",
+"L. c black",
+"P. c black",
+"I. c black",
+"U. c black",
+"Y. c black",
+"T. c black",
+"R. c black",
+"E. c black",
+"W. c black",
+"Q. c black",
+"!. c black",
+"~. c black",
+"^. c black",
+"/. c black",
+"(. c black",
+"). c black",
+"_. c black",
+"`. c black",
+"'. c black",
+"]. c black",
+"[. c black",
+"{. c black",
+"}. c black",
+"|. c black",
+" X c black",
+".X c black",
+"XX c black",
+"oX c black",
+"OX c black",
+"+X c black",
+"@X c black",
+"#X c black",
+"$X c black",
+"%X c black",
+"&X c black",
+"*X c black",
+"=X c black",
+"-X c black",
+";X c black",
+":X c black",
+">X c black",
+",X c black",
+"<X c black",
+"1X c black",
+"2X c black",
+"3X c black",
+"4X c black",
+"5X c black",
+"6X c black",
+"7X c black",
+"8X c black",
+"9X c black",
+"0X c black",
+"qX c black",
+"wX c black",
+"eX c black",
+"rX c black",
+"tX c black",
+"yX c black",
+"uX c black",
+"iX c black",
+"pX c black",
+"aX c black",
+"sX c black",
+"dX c black",
+"fX c black",
+"gX c black",
+"hX c black",
+"jX c black",
+"kX c black",
+"lX c black",
+"zX c black",
+"xX c black",
+"cX c black",
+"vX c black",
+"bX c black",
+"nX c black",
+"mX c black",
+"MX c black",
+"NX c black",
+"BX c black",
+"VX c black",
+"CX c black",
+"ZX c black",
+"AX c black",
+"SX c black",
+"DX c black",
+"FX c black",
+"GX c black",
+"HX c black",
+"JX c black",
+"KX c black",
+"LX c black",
+"PX c black",
+"IX c black",
+"UX c black",
+/* pixels */
+" ",
+" ",
+" ",
+" F F 8 F X ",
+" F D D . 8 F 5 5 5 F . D D D y ",
+" y F : : r F 5 5 7 5 5 F r : : F o ",
+" 8 : : : r 5 5 7 7 7 5 5 r : : : F ",
+" @ : : @ r 5 5 5 5 5 5 5 r r : : 8 ",
+" @ : : r r r r r r r r r r r : : F ",
+" @ : : : : : : : : : : : : : : : F ",
+" @ : : : ; ; : x x x x x x x x x F ",
+" @ : : : : 2 : x x x ",
+" @ : : : : : : x x x ",
+" @ : : : : : : x x x x ",
+" 8 : : : : : : x x x x x ",
+" @ : : : : : : x x ",
+" F : ; : : : : x x ",
+" y F : : : : : x x x x x x x ",
+" . . i i i i x x ",
+" x x x x x x x a a x x ",
+" V V ",
+" ",
+" ",
+" "
+};
--- /dev/null
+/* XPM */
+static char *previous[] = {
+/* columns rows colors chars-per-pixel */
+"24 24 256 2 ",
+" c None",
+". c #FDFDFD",
+"X c gray99",
+"o c #FCFBF8",
+"O c #FBFBFA",
+"+ c #F8F7F7",
+"@ c #F8F7F6",
+"# c #F7F7F6",
+"$ c #F7F6F6",
+"% c #F6F5F4",
+"& c gray96",
+"* c #F3F3F3",
+"= c #F2F3F3",
+"- c #F0EFEF",
+"; c #F0EFED",
+": c #F0EEED",
+"> c #EEECEB",
+", c #EDEAE6",
+"< c #ECEAE7",
+"1 c #ECE9E6",
+"2 c #E9E8E6",
+"3 c #E8E7E5",
+"4 c #E6E5E3",
+"5 c #E1DED8",
+"6 c #E0E0DF",
+"7 c gray86",
+"8 c #CBC9C6",
+"9 c #CAC9C6",
+"0 c #CAC6C4",
+"q c #C6C3BF",
+"w c #8F8B82",
+"e c #697382",
+"r c #677081",
+"t c #666565",
+"y c #606973",
+"u c #60666B",
+"i c #595856",
+"p c #56565A",
+"a c #509BFF",
+"s c #4E97FF",
+"d c #4E96FF",
+"f c #4E95FF",
+"g c #4E4D4C",
+"h c #4D90F2",
+"j c #4C94FC",
+"k c #4C8FF3",
+"l c #4B95FF",
+"z c #4B90F5",
+"x c #4B8FF4",
+"c c #4B4A49",
+"v c #4A89E9",
+"b c #494847",
+"n c #4890FB",
+"m c #488EF6",
+"M c #488BEF",
+"N c #4888E8",
+"B c #468FF9",
+"V c #46484B",
+"C c #464647",
+"Z c gray27",
+"A c #4275C8",
+"S c #414244",
+"D c #40403F",
+"F c #3F74C5",
+"G c #3E3E3D",
+"H c #3D7AD3",
+"J c #3D3B3A",
+"K c #3A75CB",
+"L c #3A6EBF",
+"P c #3A6DBF",
+"I c #397AD7",
+"U c #39393A",
+"Y c #3776D0",
+"T c #376DC0",
+"R c #346BB6",
+"E c #3369B4",
+"W c #313131",
+"Q c #2A2A2D",
+"! c #285293",
+"~ c #275296",
+"^ c #272726",
+"/ c #24477C",
+"( c #20202B",
+") c #1F4782",
+"_ c #1F467E",
+"` c #1F202C",
+"' c #1E222F",
+"] c #1E1F29",
+"[ c #1C202F",
+"{ c #1B4073",
+"} c #183869",
+"| c #173767",
+" . c #151D29",
+".. c #131E2A",
+"X. c #131D2B",
+"o. c #131D2A",
+"O. c #12305D",
+"+. c #12171C",
+"@. c #113869",
+"#. c #101625",
+"$. c #040C18",
+"%. c #000E26",
+"&. c #00000A",
+"*. c black",
+"=. c black",
+"-. c black",
+";. c black",
+":. c black",
+">. c black",
+",. c black",
+"<. c black",
+"1. c black",
+"2. c black",
+"3. c black",
+"4. c black",
+"5. c black",
+"6. c black",
+"7. c black",
+"8. c black",
+"9. c black",
+"0. c black",
+"q. c black",
+"w. c black",
+"e. c black",
+"r. c black",
+"t. c black",
+"y. c black",
+"u. c black",
+"i. c black",
+"p. c black",
+"a. c black",
+"s. c black",
+"d. c black",
+"f. c black",
+"g. c black",
+"h. c black",
+"j. c black",
+"k. c black",
+"l. c black",
+"z. c black",
+"x. c black",
+"c. c black",
+"v. c black",
+"b. c black",
+"n. c black",
+"m. c black",
+"M. c black",
+"N. c black",
+"B. c black",
+"V. c black",
+"C. c black",
+"Z. c black",
+"A. c black",
+"S. c black",
+"D. c black",
+"F. c black",
+"G. c black",
+"H. c black",
+"J. c black",
+"K. c black",
+"L. c black",
+"P. c black",
+"I. c black",
+"U. c black",
+"Y. c black",
+"T. c black",
+"R. c black",
+"E. c black",
+"W. c black",
+"Q. c black",
+"!. c black",
+"~. c black",
+"^. c black",
+"/. c black",
+"(. c black",
+"). c black",
+"_. c black",
+"`. c black",
+"'. c black",
+"]. c black",
+"[. c black",
+"{. c black",
+"}. c black",
+"|. c black",
+" X c black",
+".X c black",
+"XX c black",
+"oX c black",
+"OX c black",
+"+X c black",
+"@X c black",
+"#X c black",
+"$X c black",
+"%X c black",
+"&X c black",
+"*X c black",
+"=X c black",
+"-X c black",
+";X c black",
+":X c black",
+">X c black",
+",X c black",
+"<X c black",
+"1X c black",
+"2X c black",
+"3X c black",
+"4X c black",
+"5X c black",
+"6X c black",
+"7X c black",
+"8X c black",
+"9X c black",
+"0X c black",
+"qX c black",
+"wX c black",
+"eX c black",
+"rX c black",
+"tX c black",
+"yX c black",
+"uX c black",
+"iX c black",
+"pX c black",
+"aX c black",
+"sX c black",
+"dX c black",
+"fX c black",
+"gX c black",
+"hX c black",
+"jX c black",
+"kX c black",
+"lX c black",
+"zX c black",
+"xX c black",
+"cX c black",
+"vX c black",
+"bX c black",
+"nX c black",
+"mX c black",
+"MX c black",
+"NX c black",
+"BX c black",
+"VX c black",
+"CX c black",
+"ZX c black",
+"AX c black",
+"SX c black",
+"DX c black",
+"FX c black",
+"GX c black",
+"HX c black",
+"JX c black",
+"KX c black",
+"LX c black",
+"PX c black",
+"IX c black",
+"UX c black",
+/* pixels */
+" ",
+" ",
+" ",
+" ",
+" ",
+" ",
+" # 7 ",
+" - g G # ",
+" - b *.G ",
+" , C @./ Q 0 8 8 8 8 0 6 ",
+" 3 G | s R . . . . . .$.p ",
+" 4 V { h k v H K Y Y Y H @.C ",
+" w %.k s v B s s s s s s ) g ",
+" - u ~ k B v A T L L L F O.C ",
+" # r ~ s R #.] ( ` ` ` +.t ",
+" e ~ _ ^ 5 , , , > > # ",
+" y &.Q + ",
+" # i G + ",
+" # ",
+" ",
+" ",
+" ",
+" ",
+" "
+};
--- /dev/null
+/* XPM */
+static char *print[] = {
+/* columns rows colors chars-per-pixel */
+"24 24 256 2 ",
+" c black",
+". c #010101",
+"X c #020202",
+"o c gray1",
+"O c #040404",
+"+ c gray2",
+"@ c #060606",
+"# c #070707",
+"$ c gray3",
+"% c #090909",
+"& c gray4",
+"* c #0B0B0B",
+"= c #0C0C0C",
+"- c gray5",
+"; c #0E0E0E",
+": c gray6",
+"> c #101010",
+", c #111111",
+"< c gray7",
+"1 c #131313",
+"2 c gray8",
+"3 c #151515",
+"4 c #161616",
+"5 c gray9",
+"6 c #181818",
+"7 c #191919",
+"8 c gray10",
+"9 c #1B1B1B",
+"0 c gray11",
+"q c #1D1D1D",
+"w c #1E1E1E",
+"e c gray12",
+"r c #202020",
+"t c gray13",
+"y c #222222",
+"u c #232323",
+"i c gray14",
+"p c #252525",
+"a c gray15",
+"s c #272727",
+"d c #282828",
+"f c gray16",
+"g c #2A2A2A",
+"h c gray17",
+"j c #2C2C2C",
+"k c #2D2D2D",
+"l c gray18",
+"z c #2F2F2F",
+"x c gray19",
+"c c #313131",
+"v c #323232",
+"b c gray20",
+"n c #343434",
+"m c #353535",
+"M c gray21",
+"N c #373737",
+"B c gray22",
+"V c #393939",
+"C c #3A3A3A",
+"Z c gray23",
+"A c #3C3C3C",
+"S c gray24",
+"D c #3E3E3E",
+"F c #3F3F3F",
+"G c gray25",
+"H c #414141",
+"J c gray26",
+"K c #434343",
+"L c #444444",
+"P c gray27",
+"I c #464646",
+"U c gray28",
+"Y c #484848",
+"T c #494949",
+"R c gray29",
+"E c #4B4B4B",
+"W c #4C4C4C",
+"Q c gray30",
+"! c #4E4E4E",
+"~ c gray31",
+"^ c #505050",
+"/ c #515151",
+"( c gray32",
+") c #535353",
+"_ c gray33",
+"` c #555555",
+"' c #565656",
+"] c gray34",
+"[ c #585858",
+"{ c gray35",
+"} c #5A5A5A",
+"| c #5B5B5B",
+" . c gray36",
+".. c #5D5D5D",
+"X. c gray37",
+"o. c #5F5F5F",
+"O. c #606060",
+"+. c gray38",
+"@. c #626262",
+"#. c gray39",
+"$. c #646464",
+"%. c #656565",
+"&. c gray40",
+"*. c #676767",
+"=. c #686868",
+"-. c DimGray",
+";. c #6A6A6A",
+":. c gray42",
+">. c #6C6C6C",
+",. c #6D6D6D",
+"<. c gray43",
+"1. c #6F6F6F",
+"2. c gray44",
+"3. c #717171",
+"4. c #727272",
+"5. c gray45",
+"6. c #747474",
+"7. c gray46",
+"8. c #767676",
+"9. c #777777",
+"0. c gray47",
+"q. c #797979",
+"w. c gray48",
+"e. c #7B7B7B",
+"r. c #7C7C7C",
+"t. c gray49",
+"y. c #7E7E7E",
+"u. c gray50",
+"i. c #808080",
+"p. c #818181",
+"a. c gray51",
+"s. c #838383",
+"d. c #848484",
+"f. c gray52",
+"g. c #868686",
+"h. c gray53",
+"j. c #888888",
+"k. c #898989",
+"l. c gray54",
+"z. c #8B8B8B",
+"x. c gray55",
+"c. c #8D8D8D",
+"v. c #8E8E8E",
+"b. c gray56",
+"n. c #909090",
+"m. c gray57",
+"M. c #929292",
+"N. c #939393",
+"B. c gray58",
+"V. c #959595",
+"C. c gray59",
+"Z. c #979797",
+"A. c #989898",
+"S. c gray60",
+"D. c #9A9A9A",
+"F. c #9B9B9B",
+"G. c gray61",
+"H. c #9D9D9D",
+"J. c gray62",
+"K. c #9F9F9F",
+"L. c #A0A0A0",
+"P. c gray63",
+"I. c #A2A2A2",
+"U. c gray64",
+"Y. c #A4A4A4",
+"T. c #A5A5A5",
+"R. c gray65",
+"E. c #A7A7A7",
+"W. c gray66",
+"Q. c #A9A9A9",
+"!. c #AAAAAA",
+"~. c gray67",
+"^. c #ACACAC",
+"/. c gray68",
+"(. c #AEAEAE",
+"). c #AFAFAF",
+"_. c gray69",
+"`. c #B1B1B1",
+"'. c #B2B2B2",
+"]. c gray70",
+"[. c #B4B4B4",
+"{. c gray71",
+"}. c #B6B6B6",
+"|. c #B7B7B7",
+" X c gray72",
+".X c #B9B9B9",
+"XX c gray73",
+"oX c #BBBBBB",
+"OX c #BCBCBC",
+"+X c gray74",
+"@X c gray",
+"#X c gray75",
+"$X c #C0C0C0",
+"%X c #C1C1C1",
+"&X c gray76",
+"*X c #C3C3C3",
+"=X c gray77",
+"-X c #C5C5C5",
+";X c #C6C6C6",
+":X c gray78",
+">X c #C8C8C8",
+",X c gray79",
+"<X c #CACACA",
+"1X c #CBCBCB",
+"2X c gray80",
+"3X c #CDCDCD",
+"4X c #CECECE",
+"5X c gray81",
+"6X c #D0D0D0",
+"7X c gray82",
+"8X c #D2D2D2",
+"9X c LightGray",
+"0X c gray83",
+"qX c #D5D5D5",
+"wX c gray84",
+"eX c #D7D7D7",
+"rX c #D8D8D8",
+"tX c gray85",
+"yX c #DADADA",
+"uX c gray86",
+"iX c gainsboro",
+"pX c #DDDDDD",
+"aX c gray87",
+"sX c #DFDFDF",
+"dX c gray88",
+"fX c #E1E1E1",
+"gX c #E2E2E2",
+"hX c gray89",
+"jX c #E4E4E4",
+"kX c gray90",
+"lX c #E6E6E6",
+"zX c #E7E7E7",
+"xX c gray91",
+"cX c #E9E9E9",
+"vX c #EAEAEA",
+"bX c gray92",
+"nX c #ECECEC",
+"mX c gray93",
+"MX c #EEEEEE",
+"NX c #EFEFEF",
+"BX c gray94",
+"VX c #F1F1F1",
+"CX c gray95",
+"ZX c #F3F3F3",
+"AX c #F4F4F4",
+"SX c gray96",
+"DX c #F6F6F6",
+"FX c gray97",
+"GX c #F8F8F8",
+"HX c #F9F9F9",
+"JX c gray98",
+"KX c #FBFBFB",
+"LX c gray99",
+"PX c #FDFDFD",
+"IX c #FEFEFE",
+"UX c None",
+/* pixels */
+"UXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUX",
+"UXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUX",
+"UXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUX",
+"UXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUX",
+"UXUXUXUXUXUXUXUXUXNXeXpXpXpXpXpXpXzXFXUXUXUXUXUX",
+"UXUXUXUXUXUXUXUXFX1.n F n F n n n a J.UXUXUXUXUX",
+"UXUXUXUXUXUXUXUX$.9.@X).|.).).@X3Xn u.UXUXUXUXUX",
+"UXUXUXUXUXUXUXFXU |.E.F Q U U eXJ.b.NXUXUXUXUXUX",
+"UXUXUXUXUXUXFX` b.zX$X).|.).@XNXU u.FXUXUXUXUXUX",
+"UXUXUXUXUXUX1.; $XJ.U ` Q U pXV.; q n E.FXUXUXUX",
+"UXUXUXUXUXzXa 1.FX$X).).).|.eX` o.U Q o.J.UXUXUX",
+"UXUXUXUXUX1.5 d F U Q Q Q Q U h.$.u.9.; h.UXUXUX",
+"UXUXUXFX$.$.E.V.b.b.h.b.h.b.V.Q 9.$.u.F h.UXUXUX",
+"UXUXUXFXU q F F n n F n F n F o q u.pX` h.UXUXUX",
+"UXUXUXNXU o.).E.E.J.E.E.E.E.E.@Xd 9.9.9.NXUXUXUX",
+"UXUXUXNXn b.NXeXpXpXpXpXeXpXpXNX` ; o V.UXUXUXUX",
+"UXUXUXFXQ 5 d n n d n d n d n n 5 o.n b.UXUXUXUX",
+"UXUXUXUXeXd ` J.b.b.b.V.b.V.V.q ` 9.5 b.UXUXUXUX",
+"UXUXUXUXUX3X$.F U F U F U F U 5 q u.|.zXUXUXUXUX",
+"UXUXUXUXUXUX$XE.E.E.E.E.E.E.E.|.).zXUXUXUXUXUXUX",
+"UXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUX",
+"UXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUX",
+"UXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUX",
+"UXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUX"
+};
--- /dev/null
+/* XPM */
+static char *priority_input[] = {
+/* columns rows colors chars-per-pixel */
+"24 24 256 2 ",
+" c None",
+". c #FFFF9D",
+"X c #FFFF9A",
+"o c #FFFF96",
+"O c #FFFF94",
+"+ c #FFFF93",
+"@ c #FFFF92",
+"# c #FFFF91",
+"$ c #FFFF90",
+"% c #FFFF8F",
+"& c #FFFF8E",
+"* c #FFFF8D",
+"= c #FFFF8C",
+"- c #FFFF8B",
+"; c #FFFF89",
+": c #FFFE96",
+"> c #FFFE92",
+", c #FFFE8E",
+"< c #FFFC90",
+"1 c #FFFC8A",
+"2 c #FFFC89",
+"3 c #FFFB8C",
+"4 c #FFFB8A",
+"5 c #FFFB89",
+"6 c #FFFA8B",
+"7 c #FFF98A",
+"8 c #FFF989",
+"9 c #FFF988",
+"0 c #FFF987",
+"q c #FFF88B",
+"w c #FFF889",
+"e c #FFF888",
+"r c #FFF78A",
+"t c #FFF789",
+"y c #FFF788",
+"u c #FFF787",
+"i c #FFF786",
+"p c #FFF689",
+"a c #FFF688",
+"s c #FFF687",
+"d c #FFF588",
+"f c #FDFD92",
+"g c #FCFC8F",
+"h c #F8F88D",
+"j c #F7F78D",
+"k c gray95",
+"l c #F2F28F",
+"z c #F2F1F2",
+"x c gray94",
+"c c #EFF0F0",
+"v c #EEEFEF",
+"b c #EAE9E6",
+"n c #DDDA82",
+"m c #DADA76",
+"M c #D8D876",
+"N c #D8D776",
+"B c #D7D5D0",
+"V c #D5D3CE",
+"C c #D4D2CE",
+"Z c #D4D27A",
+"A c #D4D178",
+"S c #D4D177",
+"D c #D4CF72",
+"F c #D3D1CD",
+"G c #D2D1CF",
+"H c #D1CECA",
+"J c #D0CB7D",
+"K c #CFCFD0",
+"L c #CFCF76",
+"P c #CFCDCB",
+"I c #CCCC7D",
+"U c #CBCB75",
+"Y c #C9C670",
+"T c #C8C7C5",
+"R c #C7C66C",
+"E c #C6C66E",
+"W c #C5C571",
+"Q c #C1C278",
+"! c #BEBF79",
+"~ c #BEBBB5",
+"^ c #BDBD6B",
+"/ c #BDBC75",
+"( c #B9B6AF",
+") c #B7B6B5",
+"_ c #B4B4B5",
+"` c #B4B4B4",
+"' c #B1B2B2",
+"] c #A9A59C",
+"[ c #A8A49C",
+"{ c #A5A097",
+"} c #A49F96",
+"| c #A1A2A2",
+" . c #A09C92",
+".. c #9D9A5A",
+"X. c #8D8B5D",
+"o. c #858353",
+"O. c #858052",
+"+. c #848054",
+"@. c #847F53",
+"#. c #837F52",
+"$. c #837E54",
+"%. c #837D54",
+"&. c #837D52",
+"*. c #837B52",
+"=. c #827C6F",
+"-. c #7E7E45",
+";. c #7C7750",
+":. c #7C756A",
+">. c #7B746C",
+",. c #787164",
+"<. c #77706C",
+"1. c #777045",
+"2. c #767473",
+"3. c #757455",
+"4. c #736D44",
+"5. c #736C65",
+"6. c #726F52",
+"7. c #726C66",
+"8. c #726C65",
+"9. c #726C41",
+"0. c #726C40",
+"q. c #726A42",
+"w. c #726A41",
+"e. c #726A40",
+"r. c #726941",
+"t. c #70703E",
+"y. c #6F6E54",
+"u. c #6E6E3B",
+"i. c #6D6D3B",
+"p. c #6D6A6D",
+"a. c #6C6D3B",
+"s. c #6C6A3A",
+"d. c #6C694F",
+"f. c #6B6B3B",
+"g. c #6B6A69",
+"h. c #6B6949",
+"j. c #6B6560",
+"k. c #6A6650",
+"l. c #696668",
+"z. c #68694F",
+"x. c #68683A",
+"c. c #67625F",
+"v. c #67613F",
+"b. c #666637",
+"n. c #666366",
+"m. c #656537",
+"M. c #646467",
+"N. c #646437",
+"B. c #636366",
+"V. c #53514E",
+"C. c #4E4732",
+"Z. c #4D4333",
+"A. c #4B4235",
+"S. c #494723",
+"D. c #473E2E",
+"F. c #443F38",
+"G. c #404023",
+"H. c #40382B",
+"J. c #40382A",
+"K. c #3F372A",
+"L. c #3E372A",
+"P. c #3D362A",
+"I. c #3C3426",
+"U. c #3C3327",
+"Y. c #3C331F",
+"T. c #3B3226",
+"R. c #3A3426",
+"E. c #393837",
+"W. c #393533",
+"Q. c #39342E",
+"!. c #393024",
+"~. c #362D1C",
+"^. c #34323B",
+"/. c #333136",
+"(. c #332F2A",
+"). c #2F2D31",
+"_. c #2F2C2E",
+"`. c #2E2C35",
+"'. c #2E2C34",
+"]. c #2D2B32",
+"[. c #2D2933",
+"{. c #2D292E",
+"}. c #2D2720",
+"|. c #2C2729",
+" X c #1D1D10",
+".X c #1B1611",
+"XX c #1A160F",
+"oX c #18190C",
+"OX c #15160C",
+"+X c #15150A",
+"@X c #13130A",
+"#X c #12120A",
+"$X c #101008",
+"%X c #0F0F07",
+"&X c #0E0E07",
+"*X c #0E0D07",
+"=X c #000002",
+"-X c black",
+";X c black",
+":X c black",
+">X c black",
+",X c black",
+"<X c black",
+"1X c black",
+"2X c black",
+"3X c black",
+"4X c black",
+"5X c black",
+"6X c black",
+"7X c black",
+"8X c black",
+"9X c black",
+"0X c black",
+"qX c black",
+"wX c black",
+"eX c black",
+"rX c black",
+"tX c black",
+"yX c black",
+"uX c black",
+"iX c black",
+"pX c black",
+"aX c black",
+"sX c black",
+"dX c black",
+"fX c black",
+"gX c black",
+"hX c black",
+"jX c black",
+"kX c black",
+"lX c black",
+"zX c black",
+"xX c black",
+"cX c black",
+"vX c black",
+"bX c black",
+"nX c black",
+"mX c black",
+"MX c black",
+"NX c black",
+"BX c black",
+"VX c black",
+"CX c black",
+"ZX c black",
+"AX c black",
+"SX c black",
+"DX c black",
+"FX c black",
+"GX c black",
+"HX c black",
+"JX c black",
+"KX c black",
+"LX c black",
+"PX c black",
+"IX c black",
+"UX c black",
+/* pixels */
+" ",
+" ",
+" ",
+" b H V V V V V V V V V V V V V B T V V K P b ",
+" { Y.D.D.K.K.D.K.K.D.K.K.D.K.C.I.=X.XC.F.}.} ",
+" ] I.d.Z S S D Z S J S Z D n ..=XOXR X._.p.b ",
+" ] K.o.o % % % o % % o % . D oXOXS J ^.j.k ",
+" ] I.@.0 u u u u u % 0 o R OXOXL Q ).j.c ",
+" ] I.@.% % u % u % 0 o W %X%XN ! _.n.c ",
+" ] K.@.0 u u r % u o Y %X%Xm I ).n.c ",
+" ] I.@.% r u % u o ^ OX XL / W.p.c ",
+" ] I.@.% u r r 0 o -.=XG.. 3.|.| ",
+" ] K.@.% u 0 % % u j b.=Xu.j y.^.) ",
+" ] I.@.0 0 u u r % % o b.=Xu.% d.).) ",
+" ] I.@.% u r 0 0 0 % % o u.=Xu.j k.).) ",
+" ] K.o.0 u u u r 0 u u % % b.=Xu.o k.).) ",
+" ] I.;.o % % % % % % % % o o u.=Xu.% 6./.) ",
+" } ~.C.t.t.t.t.t.4.t.t.t.t.4.4.XX=XS.v.K.(.( ",
+" ~ ,.:.5.5.5.5.5.5.5.5.5.5.5.:.=.V.c.<.2.j.( ",
+" ",
+" ",
+" ",
+" ",
+" "
+};
--- /dev/null
+/* XPM */
+static char *procedure[] = {
+/* columns rows colors chars-per-pixel */
+"24 24 256 2 ",
+" c None",
+". c #FFFF9B",
+"X c #FFFF99",
+"o c #FFFF97",
+"O c #FFFF96",
+"+ c #FFFF95",
+"@ c #FFFF94",
+"# c #FFFF93",
+"$ c #FFFF92",
+"% c #FFFF91",
+"& c #FFFF90",
+"* c #FFFF8F",
+"= c #FFFF8E",
+"- c #FFFF8D",
+"; c #FFFF8C",
+": c #FFFF8A",
+"> c #FFFF89",
+", c #FFFC89",
+"< c #FFFB8D",
+"1 c #FFFB8C",
+"2 c #FFFB8B",
+"3 c #FFFB8A",
+"4 c #FFFA8C",
+"5 c #FFFA8B",
+"6 c #FFFA8A",
+"7 c #FFFA89",
+"8 c #FFF98A",
+"9 c #FFF989",
+"0 c #FFF988",
+"q c #FFF987",
+"w c #FFF88A",
+"e c #FFF889",
+"r c #FFF888",
+"t c #FFF789",
+"y c #FFF68A",
+"u c #F9F788",
+"i c #F8F488",
+"p c #F6F585",
+"a c #F6F486",
+"s c #F3F186",
+"d c #F3F086",
+"f c #F2F080",
+"g c #F2EF84",
+"h c #EFEE84",
+"j c #EFEB83",
+"k c #EFEA82",
+"l c #EFEA80",
+"z c #EEED82",
+"x c #EEEA82",
+"c c #E9E380",
+"v c #E8E67D",
+"b c #DFDB81",
+"n c #DCD97E",
+"m c gray86",
+"M c #D8D47B",
+"N c #D7D7D7",
+"B c #D7D4D4",
+"V c #D7D37C",
+"C c #D6D4D4",
+"Z c #D6D3D4",
+"A c #D4D3D3",
+"S c #D4D2D3",
+"D c #D4D1D2",
+"F c LightGray",
+"G c #D2D1D2",
+"H c #D2CF7C",
+"J c #D2CE78",
+"K c #D2CC79",
+"L c #D1CF7B",
+"P c #D1CE7B",
+"I c #D1CE78",
+"U c #D1CB79",
+"Y c #D1CB78",
+"T c #D1CB77",
+"R c #CFCE78",
+"E c #CFCC79",
+"W c #CFCB79",
+"Q c #CFCA7A",
+"! c #CFCA76",
+"~ c #CFC977",
+"^ c #CEC775",
+"/ c #AEAEAE",
+"( c #AEADAD",
+") c #AEACAC",
+"_ c #AEABAC",
+"` c #A8A5A6",
+"' c #A8A4A5",
+"] c #A7A6A6",
+"[ c #838180",
+"{ c #827B53",
+"} c #827956",
+"| c #817E50",
+" . c #817B50",
+".. c #817A4F",
+"X. c #81794E",
+"o. c #7F7D45",
+"O. c #7E7E44",
+"+. c #7E7C50",
+"@. c #7E7C4E",
+"#. c #7E7A50",
+"$. c #7E7A4F",
+"%. c #7E7950",
+"&. c #7E784F",
+"*. c #7E784D",
+"=. c #7D7A7B",
+"-. c #7D7656",
+";. c #7D7454",
+":. c #7A7A43",
+">. c #7A7943",
+",. c #7A7743",
+"<. c #7A7643",
+"1. c #797679",
+"2. c #787877",
+"3. c #787576",
+"4. c #787575",
+"5. c #77787D",
+"6. c #77747A",
+"7. c #757379",
+"8. c #74747B",
+"9. c #74737A",
+"0. c #747177",
+"q. c #727049",
+"w. c #726F4D",
+"e. c #716E4B",
+"r. c #706D6E",
+"t. c #706D6C",
+"y. c #706A4D",
+"u. c #6D6C72",
+"i. c #6D6A70",
+"p. c #6C6C71",
+"a. c #6B686D",
+"s. c #696970",
+"d. c #69686F",
+"f. c #69666D",
+"g. c #68696E",
+"h. c #68686F",
+"j. c #5F5F45",
+"k. c #5E5E44",
+"l. c #5D5D40",
+"z. c #5D5C40",
+"x. c #5C5C41",
+"c. c #5B5A3E",
+"v. c #5B593E",
+"b. c #5B593C",
+"n. c #5B573C",
+"m. c #59583D",
+"M. c #595741",
+"N. c #595338",
+"B. c #555355",
+"V. c #555148",
+"C. c #54553F",
+"Z. c #54533D",
+"A. c #535457",
+"S. c #53533D",
+"D. c #534E4B",
+"F. c #525039",
+"G. c #484747",
+"H. c #484734",
+"J. c #474344",
+"K. c #47413F",
+"L. c #464448",
+"P. c #454341",
+"I. c #44423F",
+"U. c #433F2F",
+"Y. c #413D33",
+"T. c #403C3C",
+"R. c #3F3F3F",
+"E. c #3B3931",
+"W. c #3A3A3C",
+"Q. c #383538",
+"!. c #363231",
+"~. c #353541",
+"^. c #34313D",
+"/. c #34312D",
+"(. c #33303C",
+"). c #32323D",
+"_. c #31323D",
+"`. c #31313D",
+"'. c #30313C",
+"]. c #2F303C",
+"[. c #2E2B29",
+"{. c #2A291B",
+"}. c #29262A",
+"|. c #27262A",
+" X c #27252A",
+".X c #272529",
+"XX c #272227",
+"oX c #272126",
+"OX c #26262A",
+"+X c #262429",
+"@X c #262228",
+"#X c #262227",
+"$X c #262224",
+"%X c #252123",
+"&X c #252027",
+"*X c #232315",
+"=X c #231E22",
+"-X c #040302",
+";X c #020200",
+":X c black",
+">X c black",
+",X c black",
+"<X c black",
+"1X c black",
+"2X c black",
+"3X c black",
+"4X c black",
+"5X c black",
+"6X c black",
+"7X c black",
+"8X c black",
+"9X c black",
+"0X c black",
+"qX c black",
+"wX c black",
+"eX c black",
+"rX c black",
+"tX c black",
+"yX c black",
+"uX c black",
+"iX c black",
+"pX c black",
+"aX c black",
+"sX c black",
+"dX c black",
+"fX c black",
+"gX c black",
+"hX c black",
+"jX c black",
+"kX c black",
+"lX c black",
+"zX c black",
+"xX c black",
+"cX c black",
+"vX c black",
+"bX c black",
+"nX c black",
+"mX c black",
+"MX c black",
+"NX c black",
+"BX c black",
+"VX c black",
+"CX c black",
+"ZX c black",
+"AX c black",
+"SX c black",
+"DX c black",
+"FX c black",
+"GX c black",
+"HX c black",
+"JX c black",
+"KX c black",
+"LX c black",
+"PX c black",
+"IX c black",
+"UX c black",
+/* pixels */
+" ",
+" ",
+" ",
+" ",
+" ",
+" N 3.6.6.[ 5.6.6.6.6.6.6.0.1.=.6.3.N ",
+" N K.|.C.M.R.C.j.j.c.j.c.j.j.{.-XH.}.J.N ",
+" N K.Y.-.q M ].V * * * * * * . o.-Xv { J.D.N ",
+" ` XXw.g * R ^.H * * q q * q o o.-Xp p w.[.] ",
+" / XX@.* * T ~.H * * q * q t o ,.-Xh * ..XX/ ",
+" / |.+.q * H ^.! * q q * q * o o.-Xc * +.XX/ ",
+" / =X@.* * T ^.! * * * q * t o ,.-Xh * @.|./ ",
+" / }.@.* * ! ^.H * * t * q * o ,.-Xh * @.=X/ ",
+" / |.@.q * T ^.R * q t q * q o o.-Xv * -.}./ ",
+" / |...* * H ^.R * t * t t q o ,.-Xg * ..|./ ",
+" ` =Xw.p * ^ ^.H * * q q * t * ,.-Xp g w.=X` ",
+" N K.U.-.p b ^.V o * * * * * . o.-Xv { J.B.N ",
+" N R./.n.C.!.C.n.n.c.n.c.c.j.*X-XU.!.D.m ",
+" N a.a.f.5.u.a.a.f.a.f.f.a.B.R.f.r.N ",
+" ",
+" ",
+" ",
+" ",
+" "
+};
--- /dev/null
+/* XPM */
+static char *procedure_call[] = {
+/* columns rows colors chars-per-pixel */
+"24 24 256 2 ",
+" c None",
+". c #FFFF98",
+"X c #FFFF97",
+"o c #FFFF96",
+"O c #FFFF95",
+"+ c #FFFF94",
+"@ c #FFFF93",
+"# c #FFFF92",
+"$ c #FFFF91",
+"% c #FFFF90",
+"& c #FFFF8F",
+"* c #FFFF8E",
+"= c #FFFF8D",
+"- c #FFFF8C",
+"; c #FFFE8E",
+": c #FFFE8B",
+"> c #FFFD8C",
+", c #FFFD8B",
+"< c #FFFC8D",
+"1 c #FFFC8C",
+"2 c #FFFC8B",
+"3 c #FFFC8A",
+"4 c #FFFB8D",
+"5 c #FFFB8B",
+"6 c #FFFB8A",
+"7 c #FFFB89",
+"8 c #FFFB88",
+"9 c #FFFA8A",
+"0 c #FFFA89",
+"q c #FFFA88",
+"w c #FFF98B",
+"e c #FFF98A",
+"r c #FFF989",
+"t c #FFF988",
+"y c #FFF987",
+"u c #FFF88C",
+"i c #FFF88B",
+"p c #FFF88A",
+"a c #FFF889",
+"s c #FFF888",
+"d c #FFF68A",
+"f c #FFF688",
+"g c #F7EB85",
+"h c #F6EA85",
+"j c #F3EA84",
+"k c #EEE07E",
+"l c #E4DA7E",
+"z c #E1D77E",
+"x c #DED47B",
+"c c #DCDCDB",
+"v c #DCD27B",
+"b c #D7CC75",
+"n c #D7CC74",
+"m c #D7CC73",
+"M c #D7CC72",
+"N c #D7CC70",
+"B c #D7CA74",
+"V c #D7C972",
+"C c #D7C971",
+"Z c gray84",
+"A c #D5D6D6",
+"S c #D5D5D5",
+"D c #C3C3C3",
+"F c gray76",
+"G c #C0C0C1",
+"H c #C0C0C0",
+"J c #C0B265",
+"K c gray75",
+"L c gray",
+"P c #BEBDBE",
+"I c #BEBCBE",
+"U c #BEBCBD",
+"Y c #BDBCBE",
+"T c #BDB064",
+"R c #BCBDBE",
+"E c #BCBABB",
+"W c #BBBCBD",
+"Q c #BBBABB",
+"! c #BBBABA",
+"~ c #BBAE65",
+"^ c #BBAD62",
+"/ c #BBAC62",
+"( c #BABBBB",
+") c #BAAE63",
+"_ c #BAAD63",
+"` c #BAAD62",
+"' c #B9BABC",
+"] c #AA9A5B",
+"[ c #9C9057",
+"{ c #878383",
+"} c #837F7F",
+"| c #817F80",
+" . c #817E7F",
+".. c #7F7D4D",
+"X. c #7D794F",
+"o. c #7C7B4C",
+"O. c #7C7878",
+"+. c #7C774D",
+"@. c #7C774C",
+"#. c #7C764C",
+"$. c #7C744C",
+"%. c #7B754B",
+"&. c #787777",
+"*. c #77797E",
+"=. c #77787D",
+"-. c #777878",
+";. c #77777C",
+":. c #777576",
+">. c #77747A",
+",. c #76777D",
+"<. c #767778",
+"1. c #76747A",
+"2. c #767479",
+"3. c #767476",
+"4. c #756A46",
+"5. c #747477",
+"6. c #6E7074",
+"7. c #6E6F73",
+"8. c #6E6E6F",
+"9. c #6E6D71",
+"0. c #6E6C70",
+"q. c #6D6C70",
+"w. c #6B6B6F",
+"e. c #6B6B6E",
+"r. c #6A686C",
+"t. c #6A6543",
+"y. c #524B37",
+"u. c #524734",
+"i. c #504A36",
+"p. c #4D4835",
+"a. c #4D4735",
+"s. c #443D30",
+"d. c #433D30",
+"f. c #41382C",
+"g. c #40392E",
+"h. c #3D3A39",
+"j. c #3D3A2E",
+"k. c #3D392E",
+"l. c #3D382E",
+"z. c #3D382D",
+"x. c #3D3736",
+"c. c #3C3837",
+"v. c #3B3635",
+"b. c #3B3534",
+"n. c #3A3938",
+"m. c #3A3837",
+"M. c #3A3229",
+"N. c #333035",
+"B. c #323034",
+"V. c #322F33",
+"C. c #31331B",
+"Z. c #313236",
+"A. c #31321C",
+"S. c #31321A",
+"D. c #313136",
+"F. c #313135",
+"G. c #313131",
+"H. c #31311B",
+"J. c #313035",
+"K. c #313034",
+"L. c #31301B",
+"P. c #312F1C",
+"I. c #312F1B",
+"U. c #312E33",
+"Y. c #312E27",
+"T. c #30311B",
+"R. c #30311A",
+"E. c #30301B",
+"W. c #30301A",
+"Q. c #302F2F",
+"!. c #302F1B",
+"~. c #302F1A",
+"^. c #302E1B",
+"/. c #302E1A",
+"(. c #302E19",
+"). c #302D19",
+"_. c #302B24",
+"`. c #2F2E2F",
+"'. c #2E2A2A",
+"]. c #2A2915",
+"[. c #2A2815",
+"{. c #2A2715",
+"}. c #292616",
+"|. c #292615",
+" X c #292421",
+".X c #262522",
+"XX c #262521",
+"oX c #262421",
+"OX c #26231F",
+"+X c #252413",
+"@X c #252313",
+"#X c #232220",
+"$X c #23221F",
+"%X c #21211F",
+"&X c #21201E",
+"*X c black",
+"=X c black",
+"-X c black",
+";X c black",
+":X c black",
+">X c black",
+",X c black",
+"<X c black",
+"1X c black",
+"2X c black",
+"3X c black",
+"4X c black",
+"5X c black",
+"6X c black",
+"7X c black",
+"8X c black",
+"9X c black",
+"0X c black",
+"qX c black",
+"wX c black",
+"eX c black",
+"rX c black",
+"tX c black",
+"yX c black",
+"uX c black",
+"iX c black",
+"pX c black",
+"aX c black",
+"sX c black",
+"dX c black",
+"fX c black",
+"gX c black",
+"hX c black",
+"jX c black",
+"kX c black",
+"lX c black",
+"zX c black",
+"xX c black",
+"cX c black",
+"vX c black",
+"bX c black",
+"nX c black",
+"mX c black",
+"MX c black",
+"NX c black",
+"BX c black",
+"VX c black",
+"CX c black",
+"ZX c black",
+"AX c black",
+"SX c black",
+"DX c black",
+"FX c black",
+"GX c black",
+"HX c black",
+"JX c black",
+"KX c black",
+"LX c black",
+"PX c black",
+"IX c black",
+"UX c black",
+/* pixels */
+" ",
+" ",
+" ",
+" ",
+" ",
+" c { :.;.| | ;.*.*.*.*.*.*.;.;.;.} } ;.:.} Z ",
+" K N.Y.y..X.Xy.p.p.p.p.p.p.p.a.y..XOXu.M.`.K ",
+" D V.4.g ].{.g k k k k k k k k g ].].g ] x.K ",
+" D V.... C.C.X y & & & & & & & X C.P.X T x.K ",
+" D V.+.X P.C.X d & y & y y y & & P.C.X ~ x.K ",
+" D V.+.X C.P.& y d y & d & & y & P.P.& ~ x.K ",
+" D V.+.X P.].X y & & d & y y d X C.P.X ~ x.K ",
+" D N...X P.C.X y & y y & y & y X ].C.X ~ x.K ",
+" K N.+.X C.P.& y y & & d d d y & C.].& ~ x.K ",
+" D N.+.& P.P.& & d y y y & d & X C.P.& ~ x.K ",
+" D N...X P.C.X & & & & & & & & X P.C.X T N.K ",
+" D V.t.l {.+Xx b b b b b b b b z {.+Xx [ c.K ",
+" K `. Xs.OXOXM.M.j.j.M.j.j.j.M.f..XOXf.Y.`.K ",
+" Z O.8.8.:.;.:.7.6.6.6.7.7.6.7.7.:.;.8.8.:.Z ",
+" ",
+" ",
+" ",
+" ",
+" "
+};
--- /dev/null
+/* XPM */
+static char *process[] = {
+/* columns rows colors chars-per-pixel */
+"24 24 256 2 ",
+" c white",
+". c #FFFF92",
+"X c #FFFF90",
+"o c #FFFF8F",
+"O c #FFFF8E",
+"+ c #FFFF8D",
+"@ c #FFFF8C",
+"# c #FFFF8B",
+"$ c #FFFF8A",
+"% c #FFFF89",
+"& c #FFFD8B",
+"* c #FFFC8E",
+"= c #FFFC8B",
+"- c #FFFC8A",
+"; c #FFFB8D",
+": c #FFFB8C",
+"> c #FFFB8A",
+", c #FFFB89",
+"< c #FFFA8C",
+"1 c #FFFA8B",
+"2 c #FFFA8A",
+"3 c #FFFA89",
+"4 c #FFFA88",
+"5 c #FFF98C",
+"6 c #FFF98B",
+"7 c #FFF98A",
+"8 c #FFF989",
+"9 c #FFF987",
+"0 c #FFF88A",
+"q c #FFF889",
+"w c #FFF888",
+"e c #FFF887",
+"r c #FFF78B",
+"t c #FFF78A",
+"y c #FFF789",
+"u c #FFF788",
+"i c #FFF787",
+"p c #FFF786",
+"a c #FFF785",
+"s c #FFF68A",
+"d c #FFF688",
+"f c #FFF687",
+"g c #F2F189",
+"h c #F2F187",
+"j c #F2F183",
+"k c #F2F081",
+"l c #F2EF84",
+"z c #F2EF83",
+"x c #DBDCDC",
+"c c #D7D7D7",
+"v c #D7D4D4",
+"b c #D6D4D4",
+"n c #D6D3D4",
+"m c #D4D3D3",
+"M c #D4D1D2",
+"N c LightGray",
+"B c #D2D1D2",
+"V c #AEAEAE",
+"C c #AEADAD",
+"Z c #AEACAC",
+"A c #AEABAC",
+"S c #A8A5A6",
+"D c #A8A5A5",
+"F c #A7A6A6",
+"G c #817E4F",
+"H c #817B51",
+"J c #817B50",
+"K c #817B4E",
+"L c #7E7C50",
+"P c #7E7C4F",
+"I c #7E7C4E",
+"U c #7E7A50",
+"Y c #7E7951",
+"T c #7E784F",
+"R c #7D7656",
+"E c #7D7455",
+"W c #7D7353",
+"Q c #7C754E",
+"! c #787575",
+"~ c #77747B",
+"^ c #767379",
+"/ c #757279",
+"( c #74757C",
+") c #74757B",
+"_ c #74747B",
+"` c #74737A",
+"' c #747178",
+"] c #747077",
+"[ c #727049",
+"{ c #726F4D",
+"} c #716E4B",
+"| c #706D6E",
+" . c #706D6C",
+".. c #70684D",
+"X. c #6F6E76",
+"o. c #6F6B76",
+"O. c #6D6D71",
+"+. c #6C6C73",
+"@. c #6C6B50",
+"#. c #6B676D",
+"$. c #6A664A",
+"%. c #696970",
+"&. c #69686F",
+"*. c #69666D",
+"=. c #69656C",
+"-. c #626244",
+";. c #5F5F43",
+":. c #5D5D42",
+">. c #5D5D40",
+",. c #5D5C40",
+"<. c #5D5B41",
+"1. c #5C5D40",
+"2. c #5C5C3F",
+"3. c #5C5B3F",
+"4. c #5B5B3F",
+"5. c #5B593E",
+"6. c #5B593D",
+"7. c #5B593C",
+"8. c #5B583E",
+"9. c #5B573B",
+"0. c #5A593D",
+"q. c #555355",
+"w. c #555148",
+"e. c #555037",
+"r. c #534D4B",
+"t. c #4F4C37",
+"y. c #4E4C37",
+"u. c #4B4632",
+"i. c #484748",
+"p. c #474344",
+"a. c #47413F",
+"s. c #464448",
+"d. c #454341",
+"f. c #44413F",
+"g. c #413D33",
+"h. c #403C3C",
+"j. c #3B3931",
+"k. c #34312D",
+"l. c #342F2F",
+"z. c #2E2B29",
+"x. c #27262A",
+"c. c #27252A",
+"v. c #272529",
+"b. c #272327",
+"n. c #272226",
+"m. c #26262A",
+"M. c #26252A",
+"N. c #262429",
+"B. c #262325",
+"V. c #262227",
+"C. c #262125",
+"Z. c #252127",
+"A. c #252123",
+"S. c #231E21",
+"D. c black",
+"F. c black",
+"G. c black",
+"H. c black",
+"J. c black",
+"K. c black",
+"L. c black",
+"P. c black",
+"I. c black",
+"U. c black",
+"Y. c black",
+"T. c black",
+"R. c black",
+"E. c black",
+"W. c black",
+"Q. c black",
+"!. c black",
+"~. c black",
+"^. c black",
+"/. c black",
+"(. c black",
+"). c black",
+"_. c black",
+"`. c black",
+"'. c black",
+"]. c black",
+"[. c black",
+"{. c black",
+"}. c black",
+"|. c black",
+" X c black",
+".X c black",
+"XX c black",
+"oX c black",
+"OX c black",
+"+X c black",
+"@X c black",
+"#X c black",
+"$X c black",
+"%X c black",
+"&X c black",
+"*X c black",
+"=X c black",
+"-X c black",
+";X c black",
+":X c black",
+">X c black",
+",X c black",
+"<X c black",
+"1X c black",
+"2X c black",
+"3X c black",
+"4X c black",
+"5X c black",
+"6X c black",
+"7X c black",
+"8X c black",
+"9X c black",
+"0X c black",
+"qX c black",
+"wX c black",
+"eX c black",
+"rX c black",
+"tX c black",
+"yX c black",
+"uX c black",
+"iX c black",
+"pX c black",
+"aX c black",
+"sX c black",
+"dX c black",
+"fX c black",
+"gX c black",
+"hX c black",
+"jX c black",
+"kX c black",
+"lX c black",
+"zX c black",
+"xX c black",
+"cX c black",
+"vX c black",
+"bX c black",
+"nX c black",
+"mX c black",
+"MX c black",
+"NX c black",
+"BX c black",
+"VX c black",
+"CX c black",
+"ZX c black",
+"AX c black",
+"SX c black",
+"DX c black",
+"FX c black",
+"GX c black",
+"HX c black",
+"JX c black",
+"KX c black",
+"LX c black",
+"PX c black",
+"IX c black",
+"UX c black",
+/* pixels */
+" ",
+" ",
+" ",
+" ",
+" ",
+" c ! ~ ~ ~ ~ ~ ~ X.X.~ ~ ] ~ ~ ~ ! c ",
+" c a.x.t.-.@.;.;.;.2.2.2.;.;.2.;.t.b.p.c ",
+" c a.g.R h o o o o o o . o o o o o h R p.r.c ",
+" S b.{ l o i i i i o r 9 o i 9 r i o l { z.F ",
+" V b.G o i i r o 9 o i o i o 9 i i i o G b.V ",
+" V b.P o i r i i i o i o 9 i o o 9 o o P b.V ",
+" V b.P o i i r i o i o r i o r i i i o Q x.V ",
+" V x.P 9 o i i i o i 9 o i o i o 9 o 9 P S.V ",
+" V x.L o i i r 9 i o i o 9 o i i i i o P z.V ",
+" V x.G o i r i r o i i o r i o i r r o P x.V ",
+" S b.{ l o i i r i i o i o r i i i o l { S.S ",
+" c a.j.R l o o o o o o o o o o o . h Q p.q.c ",
+" c h.l.e.2.-.2.2.2.9.2.9.9.2.9.2.u.l.r.x ",
+" c | X.#.X.#.#.#.&.#.#.#.#.#.#.#.| c ",
+" ",
+" ",
+" ",
+" ",
+" "
+};
--- /dev/null
+/* XPM */
+static char *process_sdl[] = {
+/* columns rows colors chars-per-pixel */
+"24 24 256 2 ",
+" c None",
+". c #FFFF92",
+"X c #FFFF90",
+"o c #FFFF8F",
+"O c #FFFF8E",
+"+ c #FFFF8D",
+"@ c #FFFF8C",
+"# c #FFFF8B",
+"$ c #FFFF8A",
+"% c #FFFF89",
+"& c #FFFD8B",
+"* c #FFFC8E",
+"= c #FFFC8B",
+"- c #FFFC8A",
+"; c #FFFB8D",
+": c #FFFB8C",
+"> c #FFFB8A",
+", c #FFFB89",
+"< c #FFFA8C",
+"1 c #FFFA8B",
+"2 c #FFFA8A",
+"3 c #FFFA89",
+"4 c #FFFA88",
+"5 c #FFF98C",
+"6 c #FFF98B",
+"7 c #FFF98A",
+"8 c #FFF989",
+"9 c #FFF987",
+"0 c #FFF88A",
+"q c #FFF889",
+"w c #FFF888",
+"e c #FFF887",
+"r c #FFF78B",
+"t c #FFF78A",
+"y c #FFF789",
+"u c #FFF788",
+"i c #FFF787",
+"p c #FFF786",
+"a c #FFF785",
+"s c #FFF68A",
+"d c #FFF688",
+"f c #FFF687",
+"g c #F2F189",
+"h c #F2F187",
+"j c #F2F183",
+"k c #F2F081",
+"l c #F2EF84",
+"z c #F2EF83",
+"x c #DBDCDC",
+"c c #D7D7D7",
+"v c #D7D4D4",
+"b c #D6D4D4",
+"n c #D6D3D4",
+"m c #D4D3D3",
+"M c #D4D1D2",
+"N c LightGray",
+"B c #D2D1D2",
+"V c #AEAEAE",
+"C c #AEADAD",
+"Z c #AEACAC",
+"A c #AEABAC",
+"S c #A8A5A6",
+"D c #A8A5A5",
+"F c #A7A6A6",
+"G c #817E4F",
+"H c #817B51",
+"J c #817B50",
+"K c #817B4E",
+"L c #7E7C50",
+"P c #7E7C4F",
+"I c #7E7C4E",
+"U c #7E7A50",
+"Y c #7E7951",
+"T c #7E784F",
+"R c #7D7656",
+"E c #7D7455",
+"W c #7D7353",
+"Q c #7C754E",
+"! c #787575",
+"~ c #77747B",
+"^ c #767379",
+"/ c #757279",
+"( c #74757C",
+") c #74757B",
+"_ c #74747B",
+"` c #74737A",
+"' c #747178",
+"] c #747077",
+"[ c #727049",
+"{ c #726F4D",
+"} c #716E4B",
+"| c #706D6E",
+" . c #706D6C",
+".. c #70684D",
+"X. c #6F6E76",
+"o. c #6F6B76",
+"O. c #6D6D71",
+"+. c #6C6C73",
+"@. c #6C6B50",
+"#. c #6B676D",
+"$. c #6A664A",
+"%. c #696970",
+"&. c #69686F",
+"*. c #69666D",
+"=. c #69656C",
+"-. c #626244",
+";. c #5F5F43",
+":. c #5D5D42",
+">. c #5D5D40",
+",. c #5D5C40",
+"<. c #5D5B41",
+"1. c #5C5D40",
+"2. c #5C5C3F",
+"3. c #5C5B3F",
+"4. c #5B5B3F",
+"5. c #5B593E",
+"6. c #5B593D",
+"7. c #5B593C",
+"8. c #5B583E",
+"9. c #5B573B",
+"0. c #5A593D",
+"q. c #555355",
+"w. c #555148",
+"e. c #555037",
+"r. c #534D4B",
+"t. c #4F4C37",
+"y. c #4E4C37",
+"u. c #4B4632",
+"i. c #484748",
+"p. c #474344",
+"a. c #47413F",
+"s. c #464448",
+"d. c #454341",
+"f. c #44413F",
+"g. c #413D33",
+"h. c #403C3C",
+"j. c #3B3931",
+"k. c #34312D",
+"l. c #342F2F",
+"z. c #2E2B29",
+"x. c #27262A",
+"c. c #27252A",
+"v. c #272529",
+"b. c #272327",
+"n. c #272226",
+"m. c #26262A",
+"M. c #26252A",
+"N. c #262429",
+"B. c #262325",
+"V. c #262227",
+"C. c #262125",
+"Z. c #252127",
+"A. c #252123",
+"S. c #231E21",
+"D. c black",
+"F. c black",
+"G. c black",
+"H. c black",
+"J. c black",
+"K. c black",
+"L. c black",
+"P. c black",
+"I. c black",
+"U. c black",
+"Y. c black",
+"T. c black",
+"R. c black",
+"E. c black",
+"W. c black",
+"Q. c black",
+"!. c black",
+"~. c black",
+"^. c black",
+"/. c black",
+"(. c black",
+"). c black",
+"_. c black",
+"`. c black",
+"'. c black",
+"]. c black",
+"[. c black",
+"{. c black",
+"}. c black",
+"|. c black",
+" X c black",
+".X c black",
+"XX c black",
+"oX c black",
+"OX c black",
+"+X c black",
+"@X c black",
+"#X c black",
+"$X c black",
+"%X c black",
+"&X c black",
+"*X c black",
+"=X c black",
+"-X c black",
+";X c black",
+":X c black",
+">X c black",
+",X c black",
+"<X c black",
+"1X c black",
+"2X c black",
+"3X c black",
+"4X c black",
+"5X c black",
+"6X c black",
+"7X c black",
+"8X c black",
+"9X c black",
+"0X c black",
+"qX c black",
+"wX c black",
+"eX c black",
+"rX c black",
+"tX c black",
+"yX c black",
+"uX c black",
+"iX c black",
+"pX c black",
+"aX c black",
+"sX c black",
+"dX c black",
+"fX c black",
+"gX c black",
+"hX c black",
+"jX c black",
+"kX c black",
+"lX c black",
+"zX c black",
+"xX c black",
+"cX c black",
+"vX c black",
+"bX c black",
+"nX c black",
+"mX c black",
+"MX c black",
+"NX c black",
+"BX c black",
+"VX c black",
+"CX c black",
+"ZX c black",
+"AX c black",
+"SX c black",
+"DX c black",
+"FX c black",
+"GX c black",
+"HX c black",
+"JX c black",
+"KX c black",
+"LX c black",
+"PX c black",
+"IX c black",
+"UX c black",
+/* pixels */
+" ",
+" ",
+" ",
+" ",
+" ",
+" c ! ~ ~ ~ ~ ~ ~ X.X.~ ~ ] ~ ~ ~ ! c ",
+" c a.x.t.-.@.;.;.;.2.2.2.;.;.2.;.t.b.p.c ",
+" c a.g.R h o o o o o o . o o o o o h R p.r.c ",
+" S b.{ l o i i i i o r 9 o i 9 r i o l { z.F ",
+" V b.G o i i r o 9 o i o i o 9 i i i o G b.V ",
+" V b.P o i r i i i o i o 9 i o o 9 o o P b.V ",
+" V b.P o i i r i o i o r i o r i i i o Q x.V ",
+" V x.P 9 o i i i o i 9 o i o i o 9 o 9 P S.V ",
+" V x.L o i i r 9 i o i o 9 o i i i i o P z.V ",
+" V x.G o i r i r o i i o r i o i r r o P x.V ",
+" S b.{ l o i i r i i o i o r i i i o l { S.S ",
+" c a.j.R l o o o o o o o o o o o . h Q p.q.c ",
+" c h.l.e.2.-.2.2.2.9.2.9.9.2.9.2.u.l.r.x ",
+" c | X.#.X.#.#.#.&.#.#.#.#.#.#.#.| c ",
+" ",
+" ",
+" ",
+" ",
+" "
+};
--- /dev/null
+/* XPM */
+static char *process_type[] = {
+/* columns rows colors chars-per-pixel */
+"24 24 256 2 ",
+" c black",
+". c #010101",
+"X c #020202",
+"o c gray1",
+"O c #040404",
+"+ c gray2",
+"@ c #060606",
+"# c #070707",
+"$ c gray3",
+"% c #090909",
+"& c gray4",
+"* c #0B0B0B",
+"= c #0C0C0C",
+"- c gray5",
+"; c #0E0E0E",
+": c gray6",
+"> c #101010",
+", c #111111",
+"< c gray7",
+"1 c #131313",
+"2 c gray8",
+"3 c #151515",
+"4 c #161616",
+"5 c gray9",
+"6 c #181818",
+"7 c #191919",
+"8 c gray10",
+"9 c #1B1B1B",
+"0 c gray11",
+"q c #1D1D1D",
+"w c #1E1E1E",
+"e c gray12",
+"r c #202020",
+"t c gray13",
+"y c #222222",
+"u c #232323",
+"i c gray14",
+"p c #252525",
+"a c gray15",
+"s c #272727",
+"d c #282828",
+"f c gray16",
+"g c #2A2A2A",
+"h c gray17",
+"j c #2C2C2C",
+"k c #2D2D2D",
+"l c gray18",
+"z c #2F2F2F",
+"x c gray19",
+"c c #313131",
+"v c #323232",
+"b c gray20",
+"n c #343434",
+"m c #353535",
+"M c gray21",
+"N c #373737",
+"B c gray22",
+"V c #393939",
+"C c #3A3A3A",
+"Z c gray23",
+"A c #3C3C3C",
+"S c gray24",
+"D c #3E3E3E",
+"F c #3F3F3F",
+"G c gray25",
+"H c #414141",
+"J c gray26",
+"K c #434343",
+"L c #444444",
+"P c gray27",
+"I c #464646",
+"U c gray28",
+"Y c #484848",
+"T c #494949",
+"R c gray29",
+"E c #4B4B4B",
+"W c #4C4C4C",
+"Q c gray30",
+"! c #4E4E4E",
+"~ c gray31",
+"^ c #505050",
+"/ c #515151",
+"( c gray32",
+") c #535353",
+"_ c gray33",
+"` c #555555",
+"' c #565656",
+"] c gray34",
+"[ c #585858",
+"{ c gray35",
+"} c #5A5A5A",
+"| c #5B5B5B",
+" . c gray36",
+".. c #5D5D5D",
+"X. c gray37",
+"o. c #5F5F5F",
+"O. c #606060",
+"+. c gray38",
+"@. c #626262",
+"#. c gray39",
+"$. c #646464",
+"%. c #656565",
+"&. c gray40",
+"*. c #676767",
+"=. c #686868",
+"-. c DimGray",
+";. c #6A6A6A",
+":. c gray42",
+">. c #6C6C6C",
+",. c #6D6D6D",
+"<. c gray43",
+"1. c #6F6F6F",
+"2. c gray44",
+"3. c #717171",
+"4. c #727272",
+"5. c gray45",
+"6. c #747474",
+"7. c gray46",
+"8. c #767676",
+"9. c #777777",
+"0. c gray47",
+"q. c #797979",
+"w. c gray48",
+"e. c #7B7B7B",
+"r. c #7C7C7C",
+"t. c gray49",
+"y. c #7E7E7E",
+"u. c gray50",
+"i. c #808080",
+"p. c #818181",
+"a. c gray51",
+"s. c #838383",
+"d. c #848484",
+"f. c gray52",
+"g. c #868686",
+"h. c gray53",
+"j. c #888888",
+"k. c #898989",
+"l. c gray54",
+"z. c #8B8B8B",
+"x. c gray55",
+"c. c #8D8D8D",
+"v. c #8E8E8E",
+"b. c gray56",
+"n. c #909090",
+"m. c gray57",
+"M. c #929292",
+"N. c #939393",
+"B. c gray58",
+"V. c #959595",
+"C. c gray59",
+"Z. c #979797",
+"A. c #989898",
+"S. c gray60",
+"D. c #9A9A9A",
+"F. c #9B9B9B",
+"G. c gray61",
+"H. c #9D9D9D",
+"J. c gray62",
+"K. c #9F9F9F",
+"L. c #A0A0A0",
+"P. c gray63",
+"I. c #A2A2A2",
+"U. c gray64",
+"Y. c #A4A4A4",
+"T. c #A5A5A5",
+"R. c gray65",
+"E. c #A7A7A7",
+"W. c gray66",
+"Q. c #A9A9A9",
+"!. c #AAAAAA",
+"~. c gray67",
+"^. c #ACACAC",
+"/. c gray68",
+"(. c #AEAEAE",
+"). c #AFAFAF",
+"_. c gray69",
+"`. c #B1B1B1",
+"'. c #B2B2B2",
+"]. c gray70",
+"[. c #B4B4B4",
+"{. c gray71",
+"}. c #B6B6B6",
+"|. c #B7B7B7",
+" X c gray72",
+".X c #B9B9B9",
+"XX c gray73",
+"oX c #BBBBBB",
+"OX c #BCBCBC",
+"+X c gray74",
+"@X c gray",
+"#X c gray75",
+"$X c #C0C0C0",
+"%X c #C1C1C1",
+"&X c gray76",
+"*X c #C3C3C3",
+"=X c gray77",
+"-X c #C5C5C5",
+";X c #C6C6C6",
+":X c gray78",
+">X c #C8C8C8",
+",X c gray79",
+"<X c #CACACA",
+"1X c #CBCBCB",
+"2X c gray80",
+"3X c #CDCDCD",
+"4X c #CECECE",
+"5X c gray81",
+"6X c #D0D0D0",
+"7X c gray82",
+"8X c #D2D2D2",
+"9X c LightGray",
+"0X c gray83",
+"qX c #D5D5D5",
+"wX c gray84",
+"eX c #D7D7D7",
+"rX c #D8D8D8",
+"tX c gray85",
+"yX c #DADADA",
+"uX c gray86",
+"iX c gainsboro",
+"pX c #DDDDDD",
+"aX c gray87",
+"sX c #DFDFDF",
+"dX c gray88",
+"fX c #E1E1E1",
+"gX c #E2E2E2",
+"hX c gray89",
+"jX c #E4E4E4",
+"kX c gray90",
+"lX c #E6E6E6",
+"zX c #E7E7E7",
+"xX c gray91",
+"cX c #E9E9E9",
+"vX c #EAEAEA",
+"bX c gray92",
+"nX c #ECECEC",
+"mX c gray93",
+"MX c #EEEEEE",
+"NX c #EFEFEF",
+"BX c gray94",
+"VX c #F1F1F1",
+"CX c gray95",
+"ZX c #F3F3F3",
+"AX c #F4F4F4",
+"SX c gray96",
+"DX c #F6F6F6",
+"FX c gray97",
+"GX c #F8F8F8",
+"HX c #F9F9F9",
+"JX c gray98",
+"KX c #FBFBFB",
+"LX c gray99",
+"PX c #FDFDFD",
+"IX c #FEFEFE",
+"UX c None",
+/* pixels */
+"UXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUX",
+"UXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUX",
+"UXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUX",
+"UXUXUXUXUX0X#X#X#X#X#X#X#X#X#X#X#X#X0XUXUXUXUXUX",
+"UXUXUXUX;X4 O O O O O O O O O O O O 4 ;XUXUXUXUX",
+"UXUXUX;X4 O O 4 6 r 6 r 6 r 6 r 4 O O 4 ;XUXUXUX",
+"UXUXUX4 O O 1.uX).).).).).).).).uX1.O O 4 UXUXUX",
+"UXUXZ.O O 1.UXJ O O O O O O O O J UX1.O O Z.UXUX",
+"UXUXM O $.FXZ O O ; ; ; ; ; ; O O Z FX$.O M UXUX",
+"UXUXZ O Z.$.O O M jXNXNXNXNXjXM O O $.Z.O Z UXUX",
+"UXUXZ O x.J O Z jXUXUXUXUXUXUXNXZ O J x.O J UXUX",
+"UXUXJ O x._ O x.UXUXUXUXUXUXUXUXx.O _ x.O J UXUX",
+"UXUXJ O x._ O x.UXUXUXUXUXUXUXUXx.O _ x.O Z UXUX",
+"UXUXZ O x.J O Z NXUXUXUXUXUXUXjXZ O J x.O J UXUX",
+"UXUXZ O Z.$.O O M jXNXNXNXNXjXM O O $.Z.O J UXUX",
+"UXUXM O $.FXZ O O ; ; 4 ; 4 ; O O Z FX$.O M UXUX",
+"UXUXZ.O O 9.UXZ O O O O O O O O Z UX9.O O Z.UXUX",
+"UXUXUX4 O O 1.uX).).).).).).).).uX1.O O 4 UXUXUX",
+"UXUXUX;X4 O O 6 6 r 6 r 6 r 6 r 4 O O 4 ;XUXUXUX",
+"UXUXUXUX;X9.O O O O O O O O O O O O 4 ;XUXUXUXUX",
+"UXUXUXUXUXUX;X#X#X#X#X#X#X#X#X#X#X#X0XUXUXUXUXUX",
+"UXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUX",
+"UXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUX",
+"UXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUX"
+};
--- /dev/null
+/* XPM */
+static char *redo[] = {
+/* columns rows colors chars-per-pixel */
+"24 24 256 2 ",
+" c None",
+". c #FDFEFF",
+"X c #FAFBFE",
+"o c #F4F7FD",
+"O c #F1F5FD",
+"+ c #F0F4FD",
+"@ c #EDF1FD",
+"# c #EBF0FC",
+"$ c #E6ECFC",
+"% c #E4EBFC",
+"& c #D5DFFA",
+"* c #D5DEFA",
+"= c #D4DEFA",
+"- c #D2DCFA",
+"; c #D1DCFA",
+": c #D0DAFA",
+"> c #CED9FA",
+", c #CDD9F9",
+"< c #C9D5F8",
+"1 c #B7C7F7",
+"2 c #B6C7F7",
+"3 c #B5C6F7",
+"4 c #B0C2F6",
+"5 c #AFC1F6",
+"6 c #ADC0F6",
+"7 c #ABBEF6",
+"8 c #AABEF5",
+"9 c #A4B9F5",
+"0 c #94ADF3",
+"q c #8FA9F2",
+"w c #8EA8F3",
+"e c #8DA8F2",
+"r c #8DA7F2",
+"t c #86A2F1",
+"y c #839FF1",
+"u c #7F9DF0",
+"i c #7F9CF1",
+"p c #7E9CF0",
+"a c #7D9BF1",
+"s c #7C9AF0",
+"d c #7091EF",
+"f c #6C8EEE",
+"g c #688AEE",
+"h c #678AEE",
+"j c #6084ED",
+"k c #5F83ED",
+"l c #5E83ED",
+"z c #5C81ED",
+"x c #5B81ED",
+"c c #5B80EC",
+"v c #5A80ED",
+"b c #5A80EC",
+"n c #597FEC",
+"m c #577EEC",
+"M c #577DEC",
+"N c #567CEC",
+"B c #557CEB",
+"V c #547BEC",
+"C c #5179EB",
+"Z c #4F77EB",
+"A c #4D76EB",
+"S c #4872EB",
+"D c #4772EB",
+"F c #446FEA",
+"G c #3C69E9",
+"H c #3B68E9",
+"J c #3A66E9",
+"K c #3865E9",
+"L c #3563E8",
+"P c #3463E8",
+"I c #3362E8",
+"U c #2E5EE8",
+"Y c #2A5BE7",
+"T c #295AE7",
+"R c #2556E7",
+"E c #2154E6",
+"W c #2052E6",
+"Q c #1E51E5",
+"! c #1D51E6",
+"~ c #1D50E5",
+"^ c #1A4FE5",
+"/ c #1A4EE5",
+"( c #194EE5",
+") c #184DE5",
+"_ c #184CE5",
+"` c #174CE5",
+"' c #164BE5",
+"] c #144AE4",
+"[ c #1248E4",
+"{ c #0F46E4",
+"} c #0E45E4",
+"| c #0E45E3",
+" . c #0D44E4",
+".. c #0A42E4",
+"X. c #063FE3",
+"o. c #0038E2",
+"O. c black",
+"+. c black",
+"@. c black",
+"#. c black",
+"$. c black",
+"%. c black",
+"&. c black",
+"*. c black",
+"=. c black",
+"-. c black",
+";. c black",
+":. c black",
+">. c black",
+",. c black",
+"<. c black",
+"1. c black",
+"2. c black",
+"3. c black",
+"4. c black",
+"5. c black",
+"6. c black",
+"7. c black",
+"8. c black",
+"9. c black",
+"0. c black",
+"q. c black",
+"w. c black",
+"e. c black",
+"r. c black",
+"t. c black",
+"y. c black",
+"u. c black",
+"i. c black",
+"p. c black",
+"a. c black",
+"s. c black",
+"d. c black",
+"f. c black",
+"g. c black",
+"h. c black",
+"j. c black",
+"k. c black",
+"l. c black",
+"z. c black",
+"x. c black",
+"c. c black",
+"v. c black",
+"b. c black",
+"n. c black",
+"m. c black",
+"M. c black",
+"N. c black",
+"B. c black",
+"V. c black",
+"C. c black",
+"Z. c black",
+"A. c black",
+"S. c black",
+"D. c black",
+"F. c black",
+"G. c black",
+"H. c black",
+"J. c black",
+"K. c black",
+"L. c black",
+"P. c black",
+"I. c black",
+"U. c black",
+"Y. c black",
+"T. c black",
+"R. c black",
+"E. c black",
+"W. c black",
+"Q. c black",
+"!. c black",
+"~. c black",
+"^. c black",
+"/. c black",
+"(. c black",
+"). c black",
+"_. c black",
+"`. c black",
+"'. c black",
+"]. c black",
+"[. c black",
+"{. c black",
+"}. c black",
+"|. c black",
+" X c black",
+".X c black",
+"XX c black",
+"oX c black",
+"OX c black",
+"+X c black",
+"@X c black",
+"#X c black",
+"$X c black",
+"%X c black",
+"&X c black",
+"*X c black",
+"=X c black",
+"-X c black",
+";X c black",
+":X c black",
+">X c black",
+",X c black",
+"<X c black",
+"1X c black",
+"2X c black",
+"3X c black",
+"4X c black",
+"5X c black",
+"6X c black",
+"7X c black",
+"8X c black",
+"9X c black",
+"0X c black",
+"qX c black",
+"wX c black",
+"eX c black",
+"rX c black",
+"tX c black",
+"yX c black",
+"uX c black",
+"iX c black",
+"pX c black",
+"aX c black",
+"sX c black",
+"dX c black",
+"fX c black",
+"gX c black",
+"hX c black",
+"jX c black",
+"kX c black",
+"lX c black",
+"zX c black",
+"xX c black",
+"cX c black",
+"vX c black",
+"bX c black",
+"nX c black",
+"mX c black",
+"MX c black",
+"NX c black",
+"BX c black",
+"VX c black",
+"CX c black",
+"ZX c black",
+"AX c black",
+"SX c black",
+"DX c black",
+"FX c black",
+"GX c black",
+"HX c black",
+"JX c black",
+"KX c black",
+"LX c black",
+"PX c black",
+"IX c black",
+"UX c black",
+/* pixels */
+" ",
+" ",
+" ",
+" ",
+" ",
+" $ f n m y o ",
+" u Y ` { { R U 7 ",
+" u ^ ^ G 0 r R ` R 7 1 ",
+" t ^ ^ L & < u ` ^ 1 u Z ",
+" $ F ` L & u ^ R ` k ",
+" q { J & J R ` k ",
+" q X.k o d ` ^ { m ",
+" 5 Y ^ 9 1 Z k k m t ",
+" k { m @ ",
+" > L { m @ ",
+" > L X.k ",
+" & r 7 ",
+" o Z 5 u u 1 f & D < h Z m m Z m m D & ",
+" o Z 5 u u 5 n < D < h Z Z Z m Z Z Z & ",
+" ",
+" ",
+" ",
+" ",
+" "
+};
--- /dev/null
+/* XPM */
+static char *refresh[] = {
+/* columns rows colors chars-per-pixel */
+"24 24 256 2 ",
+" c black",
+". c #010101",
+"X c #020202",
+"o c gray1",
+"O c #040404",
+"+ c gray2",
+"@ c #060606",
+"# c #070707",
+"$ c gray3",
+"% c #090909",
+"& c gray4",
+"* c #0B0B0B",
+"= c #0C0C0C",
+"- c gray5",
+"; c #0E0E0E",
+": c gray6",
+"> c #101010",
+", c #111111",
+"< c gray7",
+"1 c #131313",
+"2 c gray8",
+"3 c #151515",
+"4 c #161616",
+"5 c gray9",
+"6 c #181818",
+"7 c #191919",
+"8 c gray10",
+"9 c #1B1B1B",
+"0 c gray11",
+"q c #1D1D1D",
+"w c #1E1E1E",
+"e c gray12",
+"r c #202020",
+"t c gray13",
+"y c #222222",
+"u c #232323",
+"i c gray14",
+"p c #252525",
+"a c gray15",
+"s c #272727",
+"d c #282828",
+"f c gray16",
+"g c #2A2A2A",
+"h c gray17",
+"j c #2C2C2C",
+"k c #2D2D2D",
+"l c gray18",
+"z c #2F2F2F",
+"x c gray19",
+"c c #313131",
+"v c #323232",
+"b c gray20",
+"n c #343434",
+"m c #353535",
+"M c gray21",
+"N c #373737",
+"B c gray22",
+"V c #393939",
+"C c #3A3A3A",
+"Z c gray23",
+"A c #3C3C3C",
+"S c gray24",
+"D c #3E3E3E",
+"F c #3F3F3F",
+"G c gray25",
+"H c #414141",
+"J c gray26",
+"K c #434343",
+"L c #444444",
+"P c gray27",
+"I c #464646",
+"U c gray28",
+"Y c #484848",
+"T c #494949",
+"R c gray29",
+"E c #4B4B4B",
+"W c #4C4C4C",
+"Q c gray30",
+"! c #4E4E4E",
+"~ c gray31",
+"^ c #505050",
+"/ c #515151",
+"( c gray32",
+") c #535353",
+"_ c gray33",
+"` c #555555",
+"' c #565656",
+"] c gray34",
+"[ c #585858",
+"{ c gray35",
+"} c #5A5A5A",
+"| c #5B5B5B",
+" . c gray36",
+".. c #5D5D5D",
+"X. c gray37",
+"o. c #5F5F5F",
+"O. c #606060",
+"+. c gray38",
+"@. c #626262",
+"#. c gray39",
+"$. c #646464",
+"%. c #656565",
+"&. c gray40",
+"*. c #676767",
+"=. c #686868",
+"-. c DimGray",
+";. c #6A6A6A",
+":. c gray42",
+">. c #6C6C6C",
+",. c #6D6D6D",
+"<. c gray43",
+"1. c #6F6F6F",
+"2. c gray44",
+"3. c #717171",
+"4. c #727272",
+"5. c gray45",
+"6. c #747474",
+"7. c gray46",
+"8. c #767676",
+"9. c #777777",
+"0. c gray47",
+"q. c #797979",
+"w. c gray48",
+"e. c #7B7B7B",
+"r. c #7C7C7C",
+"t. c gray49",
+"y. c #7E7E7E",
+"u. c gray50",
+"i. c #808080",
+"p. c #818181",
+"a. c gray51",
+"s. c #838383",
+"d. c #848484",
+"f. c gray52",
+"g. c #868686",
+"h. c gray53",
+"j. c #888888",
+"k. c #898989",
+"l. c gray54",
+"z. c #8B8B8B",
+"x. c gray55",
+"c. c #8D8D8D",
+"v. c #8E8E8E",
+"b. c gray56",
+"n. c #909090",
+"m. c gray57",
+"M. c #929292",
+"N. c #939393",
+"B. c gray58",
+"V. c #959595",
+"C. c gray59",
+"Z. c #979797",
+"A. c #989898",
+"S. c gray60",
+"D. c #9A9A9A",
+"F. c #9B9B9B",
+"G. c gray61",
+"H. c #9D9D9D",
+"J. c gray62",
+"K. c #9F9F9F",
+"L. c #A0A0A0",
+"P. c gray63",
+"I. c #A2A2A2",
+"U. c gray64",
+"Y. c #A4A4A4",
+"T. c #A5A5A5",
+"R. c gray65",
+"E. c #A7A7A7",
+"W. c gray66",
+"Q. c #A9A9A9",
+"!. c #AAAAAA",
+"~. c gray67",
+"^. c #ACACAC",
+"/. c gray68",
+"(. c #AEAEAE",
+"). c #AFAFAF",
+"_. c gray69",
+"`. c #B1B1B1",
+"'. c #B2B2B2",
+"]. c gray70",
+"[. c #B4B4B4",
+"{. c gray71",
+"}. c #B6B6B6",
+"|. c #B7B7B7",
+" X c gray72",
+".X c #B9B9B9",
+"XX c gray73",
+"oX c #BBBBBB",
+"OX c #BCBCBC",
+"+X c gray74",
+"@X c gray",
+"#X c gray75",
+"$X c #C0C0C0",
+"%X c #C1C1C1",
+"&X c gray76",
+"*X c #C3C3C3",
+"=X c gray77",
+"-X c #C5C5C5",
+";X c #C6C6C6",
+":X c gray78",
+">X c #C8C8C8",
+",X c gray79",
+"<X c #CACACA",
+"1X c #CBCBCB",
+"2X c gray80",
+"3X c #CDCDCD",
+"4X c #CECECE",
+"5X c gray81",
+"6X c #D0D0D0",
+"7X c gray82",
+"8X c #D2D2D2",
+"9X c LightGray",
+"0X c gray83",
+"qX c #D5D5D5",
+"wX c gray84",
+"eX c #D7D7D7",
+"rX c #D8D8D8",
+"tX c gray85",
+"yX c #DADADA",
+"uX c gray86",
+"iX c gainsboro",
+"pX c #DDDDDD",
+"aX c gray87",
+"sX c #DFDFDF",
+"dX c gray88",
+"fX c #E1E1E1",
+"gX c #E2E2E2",
+"hX c gray89",
+"jX c #E4E4E4",
+"kX c gray90",
+"lX c #E6E6E6",
+"zX c #E7E7E7",
+"xX c gray91",
+"cX c #E9E9E9",
+"vX c #EAEAEA",
+"bX c gray92",
+"nX c #ECECEC",
+"mX c gray93",
+"MX c #EEEEEE",
+"NX c #EFEFEF",
+"BX c gray94",
+"VX c #F1F1F1",
+"CX c gray95",
+"ZX c #F3F3F3",
+"AX c #F4F4F4",
+"SX c gray96",
+"DX c #F6F6F6",
+"FX c gray97",
+"GX c #F8F8F8",
+"HX c #F9F9F9",
+"JX c gray98",
+"KX c #FBFBFB",
+"LX c gray99",
+"PX c #FDFDFD",
+"IX c #FEFEFE",
+"UX c None",
+/* pixels */
+"UXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUX",
+"sXy.NXNXy.NXNXy.NXNXy.NXNXy.NXNXy.NXNXy.NXNXy.sX",
+"@X+ @X@X+ @X@X+ @X@X+ @X@X+ @X@X+ @X@X+ @X@X+ @X",
+"UXUXz z UXz z UXz z UXz z UXz z UXF M UXz z UXUX",
+"sXy.y.f.y.y.f.y.y.y.y.y.y.y.y.y.f.p >.y.y.f.y.sX",
+"@X+ 5X5X+ 5X5X+ sXsX+ sXsX+ sX5X+ 1 @X+ 5X5X+ @X",
+"UXUXz z UXM p NXUXUXNXUXUXNXUXq + F NXNXz z UXUX",
+"sXy.f.y.y.5.B.UXUXUXUXUXUXUXB.+ + =XUXUXB.5.y.sX",
+"@X+ 5XqX+ 5XUXUXUXUXUXUXUXUXM + &.NXUXUXUX5X+ @X",
+"UXNXz p NXUXUXUXUXUXUXUXUXsXz + y.UXUXUXUXUXNXUX",
+"UXUXB.B.UXUXUXUXUXUXUXUXUXy.+ q @XUXUXUXUXUXUXUX",
+"UXUXUXUXUXUXUXUXUXUXUXUXUX5.+ F UXUXUXUXUXUXUXUX",
+"UXUXUXUXUXUXUXUXUXUXUXUXqX+ + >.UXUXUXUXUXUXUXUX",
+"UXUXUXUXUXUXUXUXUXUXUXUX&.+ - ZXUXUXUXUXUXUXUXUX",
+"UXUXUXUXUXUXUXUXUXUXUXzX+ + q ZXUXUXUXUXUXUXUXUX",
+"UXUXUXUXUXUXUXUXUXUXUXP + + ).UXUXUXUXUXUXUXUXUX",
+"UXUXUXUXUXUXUXUXUXUXUXP + F zXUXUXUXUXUXUXUXUXUX",
+"UXUXUXUXUXZXZXUXZXZXA.1 + f.ZXZXUXZXZXUXUXUXUXUX",
+"UXUXUXUXUXz M UXM P v.+ + @XF M UXz M UXUXUXUXUX",
+"UXUXUXzXy.y.y.5.y.f.P >.v.y.y.y.y.y.y.5.zXUXUXUX",
+"UXUXZX).+ 5XqX+ qX5X+ qX5X+ qX5X+ 5XqX+ ).ZXUXUX",
+"UXUXz p NXz p NXp z NXz p NXp z NXz p NXz z UXUX",
+"UXUXB.B.UXB.B.UXB.B.UXB.B.UXB.B.UXB.B.UXB.B.UXUX",
+"UXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUX"
+};
--- /dev/null
+/* XPM */
+static char *reset[] = {
+/* columns rows colors chars-per-pixel */
+"24 24 256 2 ",
+" c None",
+". c #FFFF9D",
+"X c #FFFF9B",
+"o c #FFFF99",
+"O c #FFFF92",
+"+ c #FFFF91",
+"@ c #FFFF90",
+"# c #FFFF8F",
+"$ c #FFFF8E",
+"% c #FFFF8D",
+"& c #FFFE8C",
+"* c #FFFC8D",
+"= c #FFFC8B",
+"- c #FEFF8A",
+"; c #FEF785",
+": c #FDF787",
+"> c #FBFD89",
+", c #FBFB96",
+"< c #FBF889",
+"1 c #FBF486",
+"2 c #FAF695",
+"3 c #FAF386",
+"4 c #F8F083",
+"5 c #F6F286",
+"6 c #F6F186",
+"7 c #F6F086",
+"8 c #F6EF83",
+"9 c #F4E87F",
+"0 c #F3EC83",
+"q c #F3EC81",
+"w c #F3E681",
+"e c #F3E67E",
+"r c #F3E381",
+"t c #F3E380",
+"y c #F3E37F",
+"u c #F2E27D",
+"i c #F0EB82",
+"p c #F0E47E",
+"a c #F0E37F",
+"s c #EFE27F",
+"d c #EFE27E",
+"f c #EFDF7E",
+"g c #EEE77F",
+"h c #EEE07D",
+"j c #EDE980",
+"k c #EBE77F",
+"l c #EBE77E",
+"z c #EBE47F",
+"x c #EAE67F",
+"c c #E9E784",
+"v c #E7E37F",
+"b c #E6E27C",
+"n c #E6DF7D",
+"m c #E4E279",
+"M c #E3DE7B",
+"N c #E3DD79",
+"B c #E3DC77",
+"V c #E0DE7D",
+"C c #DFDF81",
+"Z c #DDD375",
+"A c #DDD275",
+"S c #DDD175",
+"D c #DDD173",
+"F c #DDD076",
+"G c #DDCF75",
+"H c #DCDCDB",
+"J c #DCCE75",
+"K c #DCCD75",
+"L c #DBD676",
+"P c #DACF75",
+"I c #DACF74",
+"U c #D9CB73",
+"Y c #D8CD73",
+"T c #D7CB74",
+"R c #D7CA72",
+"E c gray84",
+"W c #D6D477",
+"Q c #D5D5D5",
+"! c #D2D073",
+"~ c #D0C270",
+"^ c #CFCD70",
+"/ c #CDBF6E",
+"( c #CAC86E",
+") c #CAC76F",
+"_ c #C8C66B",
+"` c #C7C16E",
+"' c #C5B869",
+"] c #C3C3C3",
+"[ c #C3C068",
+"{ c gray76",
+"} c #C1B369",
+"| c #C0C0C1",
+" . c #C0C0C0",
+".. c gray75",
+"X. c #BFB265",
+"o. c #BFB165",
+"O. c gray",
+"+. c #BEBCBE",
+"@. c #BEBCBD",
+"#. c #BDBCBE",
+"$. c #BCBDBE",
+"%. c #BCBCBE",
+"&. c #BCBABA",
+"*. c #BCBA64",
+"=. c #BCAF64",
+"-. c #BBBCBD",
+";. c #BBBABB",
+":. c #BABBBB",
+">. c #BAAD62",
+",. c #B1AE62",
+"<. c #ACAC5E",
+"1. c #ABA85D",
+"2. c #AA9C5B",
+"3. c #A8A75C",
+"4. c #A8A65B",
+"5. c #A7A65C",
+"6. c #A1A058",
+"7. c #9C8F56",
+"8. c #9A9A54",
+"9. c #938F51",
+"0. c #908D58",
+"q. c #908B59",
+"w. c #908957",
+"e. c #8F8B4C",
+"r. c #8F8858",
+"t. c #8F8756",
+"y. c #8C894A",
+"u. c #8B8748",
+"i. c #878383",
+"p. c #878246",
+"a. c #848148",
+"s. c #848044",
+"d. c #837F7F",
+"f. c #817C45",
+"g. c #807F46",
+"h. c #807E4E",
+"j. c #807C44",
+"k. c #807C43",
+"l. c #7F7B4E",
+"z. c #7E7A43",
+"x. c #7C7878",
+"c. c #7A7541",
+"v. c #787642",
+"b. c #78733F",
+"n. c #77797E",
+"m. c #77787D",
+"M. c #77777C",
+"N. c #777676",
+"B. c #77757A",
+"V. c #77747A",
+"C. c #76757A",
+"Z. c #767476",
+"A. c #756A46",
+"S. c #747477",
+"D. c #6F6D71",
+"F. c #6F6D70",
+"G. c #6E7074",
+"H. c #6E6F73",
+"J. c #6E6E6F",
+"K. c #6E6D71",
+"L. c #6E6D70",
+"P. c #6E6C70",
+"I. c #6C6D70",
+"U. c #6B6C70",
+"Y. c #6B6A6D",
+"T. c #6B683B",
+"R. c #6A6A6C",
+"E. c #6A6644",
+"W. c #51502B",
+"Q. c #50502F",
+"!. c #50502E",
+"~. c #504F2D",
+"^. c #504E29",
+"/. c #4F4736",
+"(. c #4E4433",
+"). c #4D4835",
+"_. c #4D4735",
+"`. c #4D4635",
+"'. c #4D4433",
+"]. c #404124",
+"[. c #403F23",
+"{. c #3E382E",
+"}. c #3E352B",
+"|. c #3D3A39",
+" X c #3D3A2E",
+".X c #3D392E",
+"XX c #3D392D",
+"oX c #3D3837",
+"OX c #3D382E",
+"+X c #3D382D",
+"@X c #3D3736",
+"#X c #3C3C23",
+"$X c #3C3A21",
+"%X c #3C3A1F",
+"&X c #3C3837",
+"*X c #3B3837",
+"=X c #3B3635",
+"-X c #3B3534",
+";X c #3A3736",
+":X c #3A3329",
+">X c #393A20",
+",X c #37341E",
+"<X c #36341E",
+"1X c #333135",
+"2X c #323034",
+"3X c #322F34",
+"4X c #313236",
+"5X c #313136",
+"6X c #313135",
+"7X c #313131",
+"8X c #313035",
+"9X c #313034",
+"0X c #312F1A",
+"qX c #312E33",
+"wX c #312E27",
+"eX c #30311A",
+"rX c #302F2F",
+"tX c #302F1B",
+"yX c #2F2E2F",
+"uX c #2F2B24",
+"iX c #2E2A2A",
+"pX c #2C2B18",
+"aX c #292421",
+"sX c #282714",
+"dX c #262415",
+"fX c #1E1D0F",
+"gX c #1B1C10",
+"hX c #18180E",
+"jX c #101009",
+"kX c #101008",
+"lX c #0F0F08",
+"zX c #0E0E07",
+"xX c #040402",
+"cX c #010101",
+"vX c black",
+"bX c black",
+"nX c black",
+"mX c black",
+"MX c black",
+"NX c black",
+"BX c black",
+"VX c black",
+"CX c black",
+"ZX c black",
+"AX c black",
+"SX c black",
+"DX c black",
+"FX c black",
+"GX c black",
+"HX c black",
+"JX c black",
+"KX c black",
+"LX c black",
+"PX c black",
+"IX c black",
+"UX c black",
+/* pixels */
+" ",
+" ",
+" ",
+" ",
+" ",
+" H i.N.M.M.M.M.n.n.n.n.n.n.M.M.n.M.M.M.N.d.E ",
+" ..1XwX/././././.).).).).).)./././././.}.yX.. ",
+" ] 3XA.e e e w f s w w w e s s w e e f 5.@X.. ",
+" ] 3Xl.# 8 n s # # 8 v n 8 # O s B ; # =.@X.. ",
+" ..1Xt.e.zX~.pX5.` jX].~.5.O 9.pX~.dXW } @X.. ",
+" ] 1X9.z.xXO a.xX<.xX) . O c xXf.O z.*.} @X.. ",
+" ] 3Xr.f.xXv z.jX,.xX%X~.3.# gXfX#X; # =.@X.. ",
+" ] 1Xr.p.xX,XxXW ( xX5.C 8 # # 8.pXzXu./ @X.. ",
+" ..1X0.f.xXZ ,XT.` xX' . # 8 c.( O xXb.~ @X.. ",
+" ] 1Xt.u.lX5 j pX,XlX].W.5.2 f.dX~.#Xn X.@X.. ",
+" ] 1Xh.# 8 # O # s 5 s v 5 O O s n ; O X.@X.. ",
+" ] 3XE.Z Z G T G Z Z Z Z G T G Z Z G G 7.1X.. ",
+" ..yXaX{.}.{.}.}.{.{.{.{.}.{.}.}.{.}.}.uXyX.. ",
+" E x.J.J.D.D.D.G.D.G.G.D.G.G.D.D.D.D.J.J.N.E ",
+" ",
+" ",
+" ",
+" ",
+" "
+};
--- /dev/null
+#include "resource.h"\r
+#include "align_center.xpm" \r
+#include "align_left.xpm" \r
+#include "align_right.xpm" \r
+#include "alternative.xpm" \r
+#include "answer.xpm" \r
+#include "arrow.xpm" \r
+#include "blank.xpm" \r
+#include "block.xpm" \r
+#include "block_substructure.xpm" \r
+#include "block_type.xpm" \r
+#include "bold.xpm" \r
+#include "center.xpm" \r
+#include "channel.xpm" \r
+#include "channel_substructure.xpm" \r
+#include "close.xpm" \r
+#include "comment.xpm" \r
+#include "connection.xpm" \r
+#include "content.xpm" \r
+#include "continuous_signal.xpm" \r
+#include "copy.xpm" \r
+#include "create_line.xpm" \r
+#include "create_request.xpm" \r
+#include "cut.xpm" \r
+#include "decision.xpm" \r
+#include "delete.xpm" \r
+#include "down.xpm" \r
+#include "draw_flow_line.xpm" \r
+#include "eli.xpm" \r
+#include "export.xpm" \r
+#include "fileReferencedLoaded.xpm" \r
+#include "fileReferencedUnLoaded.xpm" \r
+#include "first.xpm" \r
+#include "flow_line.xpm" \r
+#include "gate.xpm" \r
+#include "gate_constraint_block.xpm" \r
+#include "gate_constraint_process.xpm" \r
+#include "gate_constraint_service.xpm" \r
+#include "hg_exam.xpm" \r
+#include "hg_note.xpm" \r
+#include "hg_proc.xpm" \r
+#include "hg_see.xpm" \r
+#include "hg_tip.xpm" \r
+#include "inlet.xpm" \r
+#include "input.xpm" \r
+#include "italic.xpm" \r
+#include "join.xpm" \r
+#include "jsdl.xpm" \r
+#include "label_in_connector.xpm" \r
+#include "last.xpm" \r
+#include "link.xpm" \r
+#include "macro.xpm" \r
+#include "macro_call.xpm" \r
+#include "model.xpm" \r
+#include "model3.xpm" \r
+#include "networkReferencedLoaded.xpm" \r
+#include "networkReferencedUnLoaded.xpm" \r
+#include "new_sdl.xpm" \r
+#include "new_sdl2.xpm" \r
+#include "next.xpm" \r
+#include "nextstate.xpm" \r
+#include "open.xpm" \r
+#include "operator.xpm" \r
+#include "outlet.xpm" \r
+#include "output.xpm" \r
+#include "package.xpm" \r
+#include "partition.xpm" \r
+#include "paste.xpm" \r
+#include "previous.xpm" \r
+#include "print.xpm" \r
+#include "priority_input.xpm" \r
+#include "procedure.xpm" \r
+#include "procedure_call.xpm" \r
+#include "process.xpm" \r
+#include "process_sdl.xpm" \r
+#include "process_type.xpm" \r
+#include "redo.xpm" \r
+#include "refresh.xpm" \r
+#include "reset.xpm" \r
+#include "return.xpm" \r
+#include "route.xpm" \r
+#include "save.xpm" \r
+#include "saved.xpm" \r
+#include "save_signal.xpm" \r
+#include "select.xpm" \r
+#include "service.xpm" \r
+#include "service_type.xpm" \r
+#include "set.xpm" \r
+#include "start.xpm" \r
+#include "start_procedure.xpm" \r
+#include "state.xpm" \r
+#include "stop.xpm" \r
+#include "symbol.xpm" \r
+#include "symbol2.xpm" \r
+#include "system.xpm" \r
+#include "system_sdl.xpm" \r
+#include "system_type.xpm" \r
+#include "task.xpm" \r
+#include "text.xpm" \r
+#include "text_extension.xpm" \r
+#include "undo.xpm" \r
+#include "up.xpm" \r
+#include "zoom_in.xpm" \r
+#include "zoom_out.xpm" \r
+ \r
+static char **parray = {\r
+align_center,\r
+align_left,\r
+align_right,\r
+alternative,\r
+answer,\r
+arrow,\r
+blank,\r
+block,\r
+block_substructure,\r
+block_type,\r
+bold,\r
+center,\r
+channel,\r
+channel_substructure,\r
+close,\r
+comment,\r
+connection,\r
+content,\r
+continuous_signal,\r
+copy,\r
+create_line,\r
+create_request,\r
+cut,\r
+decision,\r
+delete,\r
+down,\r
+draw_flow_line,\r
+eli,\r
+export,\r
+fileReferencedLoaded,\r
+fileReferencedUnLoaded,\r
+first,\r
+flow_line,\r
+gate,\r
+gate_constraint_block,\r
+gate_constraint_process,\r
+gate_constraint_service,\r
+hg_exam,\r
+hg_note,\r
+hg_proc,\r
+hg_see,\r
+hg_tip,\r
+inlet,\r
+input,\r
+italic,\r
+join,\r
+jsdl,\r
+label_in_connector,\r
+last,\r
+link,\r
+macro,\r
+macro_call,\r
+model,\r
+model3,\r
+networkReferencedLoaded,\r
+networkReferencedUnLoaded,\r
+new_sdl,\r
+new_sdl2,\r
+next,\r
+nextstate,\r
+open,\r
+operator,\r
+outlet,\r
+output,\r
+package,\r
+partition,\r
+paste,\r
+previous,\r
+print,\r
+priority_input,\r
+procedure,\r
+procedure_call,\r
+process,\r
+process_sdl,\r
+process_type,\r
+redo,\r
+refresh,\r
+reset,\r
+return,\r
+route,\r
+save,\r
+saved,\r
+save_signal,\r
+select,\r
+service,\r
+service_type,\r
+set,\r
+start,\r
+start_procedure,\r
+state,\r
+stop,\r
+symbol,\r
+symbol2,\r
+system,\r
+system_sdl,\r
+system_type,\r
+task,\r
+text,\r
+text_extension,\r
+undo,\r
+up,\r
+zoom_in,\r
+zoom_out,\r
+NULL };\r
+\r
+char * get_xpm(int i) {return parray[i];} \r
--- /dev/null
+#ifndef _RESOURCE_H__\r
+#define _RESOURCE_H__\r
+#define ALIGN_CENTER 0 \r
+#define ALIGN_LEFT 1 \r
+#define ALIGN_RIGHT 2 \r
+#define ALTERNATIVE 3 \r
+#define ANSWER 4 \r
+#define ARROW 5 \r
+#define BLANK 6 \r
+#define BLOCK 7 \r
+#define BLOCK_SUBSTRUCTURE 8 \r
+#define BLOCK_TYPE 9 \r
+#define BOLD 10 \r
+#define CENTER 11 \r
+#define CHANNEL 12 \r
+#define CHANNEL_SUBSTRUCTURE 13 \r
+#define CLOSE 14 \r
+#define COMMENT 15 \r
+#define CONNECTION 16 \r
+#define CONTENT 17 \r
+#define CONTINUOUS_SIGNAL 18 \r
+#define COPY 19 \r
+#define CREATE_LINE 20 \r
+#define CREATE_REQUEST 21 \r
+#define CUT 22 \r
+#define DECISION 23 \r
+#define DELETE 24 \r
+#define DOWN 25 \r
+#define DRAW_FLOW_LINE 26 \r
+#define ELI 27 \r
+#define EXPORT 28 \r
+#define FILEREFERENCEDLOADED 29 \r
+#define FILEREFERENCEDUNLOADED 30 \r
+#define FIRST 31 \r
+#define FLOW_LINE 32 \r
+#define GATE 33 \r
+#define GATE_CONSTRAINT_BLOCK 34 \r
+#define GATE_CONSTRAINT_PROCESS 35 \r
+#define GATE_CONSTRAINT_SERVICE 36 \r
+#define HG_EXAM 37 \r
+#define HG_NOTE 38 \r
+#define HG_PROC 39 \r
+#define HG_SEE 40 \r
+#define HG_TIP 41 \r
+#define INLET 42 \r
+#define INPUT 43 \r
+#define ITALIC 44 \r
+#define JOIN 45 \r
+#define JSDL 46 \r
+#define LABEL_IN_CONNECTOR 47 \r
+#define LAST 48 \r
+#define LINK 49 \r
+#define MACRO 50 \r
+#define MACRO_CALL 51 \r
+#define MODEL 52 \r
+#define MODEL3 53 \r
+#define NETWORKREFERENCEDLOADED 54 \r
+#define NETWORKREFERENCEDUNLOADED 55 \r
+#define NEW_SDL 56 \r
+#define NEW_SDL2 57 \r
+#define NEXT 58 \r
+#define NEXTSTATE 59 \r
+#define OPEN 60 \r
+#define OPERATOR 61 \r
+#define OUTLET 62 \r
+#define OUTPUT 63 \r
+#define PACKAGE 64 \r
+#define PARTITION 65 \r
+#define PASTE 66 \r
+#define PREVIOUS 67 \r
+#define PRINT 68 \r
+#define PRIORITY_INPUT 69 \r
+#define PROCEDURE 70 \r
+#define PROCEDURE_CALL 71 \r
+#define PROCESS 72 \r
+#define PROCESS_SDL 73 \r
+#define PROCESS_TYPE 74 \r
+#define REDO 75 \r
+#define REFRESH 76 \r
+#define RESET 77 \r
+#define RETURN 78 \r
+#define ROUTE 79 \r
+#define SAVE 80 \r
+#define SAVED 81 \r
+#define SAVE_SIGNAL 82 \r
+#define SELECT 83 \r
+#define SERVICE 84 \r
+#define SERVICE_TYPE 85 \r
+#define SET 86 \r
+#define START 87 \r
+#define START_PROCEDURE 88 \r
+#define STATE 89 \r
+#define STOP 90 \r
+#define SYMBOL 91 \r
+#define SYMBOL2 92 \r
+#define SYSTEM 93 \r
+#define SYSTEM_SDL 94 \r
+#define SYSTEM_TYPE 95 \r
+#define TASK 96 \r
+#define TEXT 97 \r
+#define TEXT_EXTENSION 98 \r
+#define UNDO 99 \r
+#define UP 100 \r
+#define ZOOM_IN 101 \r
+#define ZOOM_OUT 102 \r
+char *get_xpm(int i); \r
+#endif \r
--- /dev/null
+/* XPM */
+static char *return[] = {
+/* columns rows colors chars-per-pixel */
+"24 24 256 2 ",
+" c None",
+". c #FFFF56",
+"X c #FFFF52",
+"o c #FFFF50",
+"O c #FFFF4F",
+"+ c #FFFF4E",
+"@ c #FFFF4D",
+"# c #FFFF4C",
+"$ c #FFFF49",
+"% c #FFFF48",
+"& c #FFFF46",
+"* c #FEFEFE",
+"= c #FEFE70",
+"- c #FEFE4A",
+"; c #FDFDFD",
+": c gray99",
+"> c #FBFB52",
+", c #F9F9F9",
+"< c #F8F8F8",
+"1 c gray97",
+"2 c #F7F74A",
+"3 c gray96",
+"4 c #F5F24F",
+"5 c #F4F444",
+"6 c #F3F3F3",
+"7 c #F3F348",
+"8 c gray95",
+"9 c #F1F1F1",
+"0 c #EFEFEF",
+"q c #EEEEED",
+"w c #ECECEC",
+"e c gray92",
+"r c #E4E4E3",
+"t c #E4E478",
+"y c #E3E3E4",
+"u c gray89",
+"i c #E1DC54",
+"p c #E0E2E3",
+"a c gray88",
+"s c #DFDFDF",
+"d c #DDDDDD",
+"f c gainsboro",
+"g c #DCDC37",
+"h c #DADADA",
+"j c gray85",
+"k c #D9D93F",
+"l c #D7D73F",
+"z c #D5D5D4",
+"x c #D5D569",
+"c c #D4D4D6",
+"v c #D4D448",
+"b c #D3D33D",
+"n c #D2D2D2",
+"m c #D2CE48",
+"M c gray81",
+"N c #CBCBCB",
+"B c #CBCB3A",
+"V c #CACBCC",
+"C c #C8C8CA",
+"Z c #C8C83C",
+"A c #C6C6C6",
+"S c #C5C537",
+"D c gray77",
+"F c #BEBE3A",
+"G c #BCBC36",
+"H c #B8B83C",
+"J c #B8B831",
+"K c #B4B487",
+"L c #B2B233",
+"P c #B1AE40",
+"I c #AFAFAF",
+"U c #AEAE32",
+"Y c gray68",
+"T c #ADAD7F",
+"R c gray67",
+"E c #AAAAAB",
+"W c #A8A832",
+"Q c #A7A731",
+"! c #A4A432",
+"~ c #9E9E9D",
+"^ c gray60",
+"/ c #989898",
+"( c #979797",
+") c #96979B",
+"_ c #95979A",
+"` c #949462",
+"' c gray57",
+"] c #8E9198",
+"[ c #8E8E90",
+"{ c #89898D",
+"} c #888889",
+"| c gray53",
+" . c #868686",
+".. c #818181",
+"X. c #818124",
+"o. c #7F7F7E",
+"O. c #7A7A7F",
+"+. c #75754C",
+"@. c #747474",
+"#. c #73731C",
+"$. c #726C2B",
+"%. c #717123",
+"&. c #71711B",
+"*. c #707375",
+"=. c #6F6F1E",
+"-. c #6E6E6F",
+";. c #6B6B6A",
+":. c #6B6B1D",
+">. c #69696B",
+",. c #686820",
+"<. c #68662A",
+"1. c #656626",
+"2. c #626262",
+"3. c gray38",
+"4. c #606065",
+"5. c #5F5F5F",
+"6. c #5F5F25",
+"7. c #5E5F65",
+"8. c #5D5D5D",
+"9. c #59591A",
+"0. c #585847",
+"q. c #555123",
+"w. c #545455",
+"e. c #54532B",
+"r. c #535347",
+"t. c #535317",
+"y. c #525254",
+"u. c #525224",
+"i. c #515119",
+"p. c #4E4E50",
+"a. c #4D4D4C",
+"s. c #4D4D13",
+"d. c #4B4B13",
+"f. c #4A4A4B",
+"g. c #494914",
+"h. c #484B4A",
+"j. c #48484C",
+"k. c #464646",
+"l. c #454548",
+"z. c gray27",
+"x. c #434346",
+"c. c #434312",
+"v. c gray26",
+"b. c #414141",
+"n. c #404014",
+"m. c #3F3F30",
+"M. c #3F3F18",
+"N. c #3E3E13",
+"B. c #3A3A39",
+"V. c #393B3D",
+"C. c #393914",
+"Z. c #39390F",
+"A. c gray22",
+"S. c #373717",
+"D. c #36360E",
+"F. c #363318",
+"G. c #353534",
+"H. c #34373A",
+"J. c #343433",
+"K. c #333334",
+"L. c #33332B",
+"P. c #323232",
+"I. c #303033",
+"U. c #302F34",
+"Y. c #2E2E0E",
+"T. c #2D2E0A",
+"R. c #2D2D0C",
+"E. c #2C2C2B",
+"W. c #282828",
+"Q. c #26260F",
+"!. c #252509",
+"~. c gray14",
+"^. c #21211B",
+"/. c #202021",
+"(. c #1E2025",
+"). c #1E1F25",
+"_. c #1E1E1F",
+"`. c #1D1D00",
+"'. c #1C1C22",
+"]. c #19191B",
+"[. c #181807",
+"{. c #16160A",
+"}. c #151516",
+"|. c #13131B",
+" X c #111111",
+".X c #111102",
+"XX c #10100D",
+"oX c #0F0F05",
+"OX c #0E0E16",
+"+X c #0B0B13",
+"@X c #040406",
+"#X c #040403",
+"$X c #020207",
+"%X c #020200",
+"&X c #000005",
+"*X c #000002",
+"=X c black",
+"-X c black",
+";X c black",
+":X c black",
+">X c black",
+",X c black",
+"<X c black",
+"1X c black",
+"2X c black",
+"3X c black",
+"4X c black",
+"5X c black",
+"6X c black",
+"7X c black",
+"8X c black",
+"9X c black",
+"0X c black",
+"qX c black",
+"wX c black",
+"eX c black",
+"rX c black",
+"tX c black",
+"yX c black",
+"uX c black",
+"iX c black",
+"pX c black",
+"aX c black",
+"sX c black",
+"dX c black",
+"fX c black",
+"gX c black",
+"hX c black",
+"jX c black",
+"kX c black",
+"lX c black",
+"zX c black",
+"xX c black",
+"cX c black",
+"vX c black",
+"bX c black",
+"nX c black",
+"mX c black",
+"MX c black",
+"NX c black",
+"BX c black",
+"VX c black",
+"CX c black",
+"ZX c black",
+"AX c black",
+"SX c black",
+"DX c black",
+"FX c black",
+"GX c black",
+"HX c black",
+"JX c black",
+"KX c black",
+"LX c black",
+"PX c black",
+"IX c black",
+"UX c black",
+/* pixels */
+" ",
+" A ~ ) M ",
+" | E.).) ",
+" s 0 o.B.H.] r s 1 ",
+" 1 -.k.a.k.k.l.B.@.1 ",
+" z p.G.k.k.G.7.s ",
+" r 7.G.G.-.0 ",
+" r 2.2.0 ",
+" 1 z A 1 ",
+" 0 ( U.k.).~.~.5.A ",
+" r l.@X.XoX@X_.|.@XOX~ ",
+" 1 w.@XS.N.U S S L _.@X@XI ",
+" I @X6.m c.i.. 2 #.c.r.@XL.0 ",
+" l.oXl . l s.G Q Q.G = m.@XI ",
+" 0 OXq.. O O X.N.t.U O & ` @X@. ",
+" M @X$.. & O B c.Y.k O & K @X5. ",
+" s @X1.. O O =.Y.D.l O & T @X2. ",
+" 1 ).S.2 O U s.Q Z.=.O . +.@X| ",
+" -.@XP F Y.,.O L N.g t ).oXM ",
+" M }.{.Q.%.5 O O #.i.q.@X7. ",
+" ( @X@X1.i 5 x r.@X@XG.s ",
+" ( _.@Xe.`.L.OX@Xa.s ",
+" s | { o.{ | I 1 ",
+" "
+};
--- /dev/null
+/* XPM */
+static char *route[] = {
+/* columns rows colors chars-per-pixel */
+"24 24 256 2 ",
+" c None",
+". c #FCF7F0",
+"X c #F7F4F0",
+"o c #F3F3F3",
+"O c #F2F7FF",
+"+ c #F1F6FF",
+"@ c #EFEFEF",
+"# c #EEEEEF",
+"$ c #EEEEEE",
+"% c #E7F1FE",
+"& c #E3E7EE",
+"* c #DFEAFC",
+"= c #DCE8FC",
+"- c #D9E8FF",
+"; c #D8E7FC",
+": c #D8E6FE",
+"> c #D8E6FC",
+", c #D8E5FB",
+"< c #D5E3FB",
+"1 c #D1E3FD",
+"2 c #D0E0FB",
+"3 c #CBE0FD",
+"4 c #CBDDFB",
+"5 c #CADDFA",
+"6 c #C7DDFC",
+"7 c #C0D0EB",
+"8 c #B4D5FE",
+"9 c #B4D0FB",
+"0 c #B4CFF9",
+"q c #B1D0FC",
+"w c #AACBFB",
+"e c #A8C7F9",
+"r c #A6C7FA",
+"t c #A1C1F7",
+"y c #989898",
+"u c #96BBF7",
+"i c #93BAF7",
+"p c #89B2F5",
+"a c #808080",
+"s c #7D7B7A",
+"d c #7B7A7A",
+"f c gray48",
+"g c #72A5F5",
+"h c #71A4F4",
+"j c #717171",
+"k c #6DA2F8",
+"l c #68A0F5",
+"z c #659FF6",
+"x c #646464",
+"c c #5E96E8",
+"v c #5A9AFC",
+"b c #5A95F2",
+"n c #5893F2",
+"m c #5294F9",
+"M c gray30",
+"N c #4C8AEF",
+"B c #4B8AF0",
+"V c #4A8CF2",
+"C c #4488F2",
+"Z c #4487F1",
+"A c #4486F0",
+"S c #4385F0",
+"D c #4186F2",
+"F c #4085F1",
+"G c #3F83EF",
+"H c #3D81EF",
+"J c #3D81EE",
+"K c gray24",
+"L c #3C7DE7",
+"P c #3B81EF",
+"I c #3A81F2",
+"U c #3A81F0",
+"Y c #3980F0",
+"T c #393631",
+"R c #3880F1",
+"E c gray22",
+"W c #383531",
+"Q c #357CEF",
+"! c #357BED",
+"~ c #347BED",
+"^ c #3380F6",
+"/ c #337BEE",
+"( c #33322F",
+") c #323232",
+"_ c #323130",
+"` c #313030",
+"' c #3079EE",
+"] c gray19",
+"[ c #2F2F30",
+"{ c #2F2F2F",
+"} c #2E78EF",
+"| c #2D77EE",
+" . c #2876EF",
+".. c #2776F0",
+"X. c #2271EE",
+"o. c #151F2E",
+"O. c #0E0E0E",
+"+. c #050200",
+"@. c #040200",
+"#. c black",
+"$. c black",
+"%. c black",
+"&. c black",
+"*. c black",
+"=. c black",
+"-. c black",
+";. c black",
+":. c black",
+">. c black",
+",. c black",
+"<. c black",
+"1. c black",
+"2. c black",
+"3. c black",
+"4. c black",
+"5. c black",
+"6. c black",
+"7. c black",
+"8. c black",
+"9. c black",
+"0. c black",
+"q. c black",
+"w. c black",
+"e. c black",
+"r. c black",
+"t. c black",
+"y. c black",
+"u. c black",
+"i. c black",
+"p. c black",
+"a. c black",
+"s. c black",
+"d. c black",
+"f. c black",
+"g. c black",
+"h. c black",
+"j. c black",
+"k. c black",
+"l. c black",
+"z. c black",
+"x. c black",
+"c. c black",
+"v. c black",
+"b. c black",
+"n. c black",
+"m. c black",
+"M. c black",
+"N. c black",
+"B. c black",
+"V. c black",
+"C. c black",
+"Z. c black",
+"A. c black",
+"S. c black",
+"D. c black",
+"F. c black",
+"G. c black",
+"H. c black",
+"J. c black",
+"K. c black",
+"L. c black",
+"P. c black",
+"I. c black",
+"U. c black",
+"Y. c black",
+"T. c black",
+"R. c black",
+"E. c black",
+"W. c black",
+"Q. c black",
+"!. c black",
+"~. c black",
+"^. c black",
+"/. c black",
+"(. c black",
+"). c black",
+"_. c black",
+"`. c black",
+"'. c black",
+"]. c black",
+"[. c black",
+"{. c black",
+"}. c black",
+"|. c black",
+" X c black",
+".X c black",
+"XX c black",
+"oX c black",
+"OX c black",
+"+X c black",
+"@X c black",
+"#X c black",
+"$X c black",
+"%X c black",
+"&X c black",
+"*X c black",
+"=X c black",
+"-X c black",
+";X c black",
+":X c black",
+">X c black",
+",X c black",
+"<X c black",
+"1X c black",
+"2X c black",
+"3X c black",
+"4X c black",
+"5X c black",
+"6X c black",
+"7X c black",
+"8X c black",
+"9X c black",
+"0X c black",
+"qX c black",
+"wX c black",
+"eX c black",
+"rX c black",
+"tX c black",
+"yX c black",
+"uX c black",
+"iX c black",
+"pX c black",
+"aX c black",
+"sX c black",
+"dX c black",
+"fX c black",
+"gX c black",
+"hX c black",
+"jX c black",
+"kX c black",
+"lX c black",
+"zX c black",
+"xX c black",
+"cX c black",
+"vX c black",
+"bX c black",
+"nX c black",
+"mX c black",
+"MX c black",
+"NX c black",
+"BX c black",
+"VX c black",
+"CX c black",
+"ZX c black",
+"AX c black",
+"SX c black",
+"DX c black",
+"FX c black",
+"GX c black",
+"HX c black",
+"JX c black",
+"KX c black",
+"LX c black",
+"PX c black",
+"IX c black",
+"UX c black",
+/* pixels */
+" ",
+" ",
+" ",
+" ",
+" ",
+" y ) ) K M X j K ) ) x ",
+" y { { O.+.@ [ +.{ ) x ",
+" s +.@ { ) ",
+" s +.@ 4 8 < w ) ) ",
+" s +.@ ; L u 4 Q 8 { [ ",
+" s +.. ; B | r < Q I 0 ) ) ",
+" s +.7 m I G b g z I G I 8 ( ( ",
+" s +.c ^ Z C Q ..} Z Z Q v o.T ",
+" s +.& k Q G g t p G I B * ) ) ",
+" s +.X O z X.e * | N < ( ) ",
+" s +.@ O b u 6 Z < [ [ ",
+" a +.@ % 3 * 3 { ) ",
+" y ) [ O.+.@ ) +.[ ) x ",
+" y [ { K M X j K { ) x ",
+" ",
+" ",
+" ",
+" ",
+" "
+};
--- /dev/null
+/* XPM */
+static char *save[] = {
+/* columns rows colors chars-per-pixel */
+"24 24 256 2 ",
+" c None",
+". c #FDFDFD",
+"X c gray99",
+"o c #F9F9FA",
+"O c #F8F8FB",
+"+ c #F8F8FA",
+"@ c gray96",
+"# c #F4F4F4",
+"$ c #F3F3F3",
+"% c gray95",
+"& c #F1F1F1",
+"* c #F0F0F1",
+"= c gray94",
+"- c #EFEFEF",
+"; c #ECECEB",
+": c #EBEBEC",
+"> c #E9E9EF",
+", c #E5E5EA",
+"< c #E4E4E8",
+"1 c #E2E2E7",
+"2 c #DBDBE4",
+"3 c #D9D9DE",
+"4 c #D9D9DA",
+"5 c #D6D6D5",
+"6 c #D4D4D9",
+"7 c #D0D0D3",
+"8 c #CDCDD4",
+"9 c #C9C9D1",
+"0 c #C6C6D1",
+"q c #C4C4CD",
+"w c gray76",
+"e c #C0C0C0",
+"r c gray75",
+"t c gray",
+"y c #BDBDBE",
+"u c #BBBBBF",
+"i c #BABABE",
+"p c gray73",
+"a c #B9B9C1",
+"s c #B5B5B4",
+"d c gray69",
+"f c #AEAEB3",
+"g c #AAAAAA",
+"h c #A0A0A3",
+"j c #9C9CA1",
+"k c #9B9B00",
+"l c #999900",
+"z c #98989F",
+"x c #97979F",
+"c c #979793",
+"v c #96969E",
+"b c #95959E",
+"n c #94949F",
+"m c #93939F",
+"M c #93939E",
+"N c #93939B",
+"B c #919100",
+"V c #909000",
+"C c #8C8C86",
+"Z c #8B8B8A",
+"A c #8A8A00",
+"S c #898900",
+"D c #888800",
+"F c #878700",
+"G c #85858D",
+"H c #818100",
+"J c #808080",
+"K c #7E7E00",
+"L c #7D7D00",
+"P c #7C7C84",
+"I c #7C7C7C",
+"U c #7B7B84",
+"Y c #7B7B00",
+"T c #7A7A84",
+"R c #797900",
+"E c #777700",
+"W c #757584",
+"Q c #737383",
+"! c #737300",
+"~ c #727276",
+"^ c #717100",
+"/ c #6E6E7E",
+"( c #6B6B6D",
+") c #676708",
+"_ c #646464",
+"` c #626200",
+"' c #5F5F60",
+"] c #5F5F10",
+"[ c #5F5F00",
+"{ c #5D5D6E",
+"} c #5D5D00",
+"| c #5C5C00",
+" . c #5B5B00",
+".. c #5A5A5A",
+"X. c #5A5A00",
+"o. c #575700",
+"O. c #565600",
+"+. c #555500",
+"@. c #545400",
+"#. c #525200",
+"$. c #515100",
+"%. c #505000",
+"&. c #4F4F00",
+"*. c #4D4D00",
+"=. c #4C4C00",
+"-. c #4B4B4D",
+";. c #4B4B4B",
+":. c #4B4B00",
+">. c gray29",
+",. c #4A4A49",
+"<. c #47474B",
+"1. c #474700",
+"2. c #464651",
+"3. c #444446",
+"4. c #444444",
+"5. c #444400",
+"6. c #434300",
+"7. c #424259",
+"8. c #42424E",
+"9. c #41414E",
+"0. c #414100",
+"q. c #40403F",
+"w. c #3E3E3E",
+"e. c #3D3D46",
+"r. c #3C3C50",
+"t. c #3C3C3C",
+"y. c #3B3B50",
+"u. c #3A3A3A",
+"i. c #393939",
+"p. c #373700",
+"a. c #2C2C3B",
+"s. c #2C2C00",
+"d. c #2A2A00",
+"f. c #292936",
+"g. c #292935",
+"h. c #282835",
+"j. c #272700",
+"k. c #26261F",
+"l. c #262601",
+"z. c #252526",
+"x. c #24241D",
+"c. c #242401",
+"v. c #23231D",
+"b. c #23231C",
+"n. c #222223",
+"m. c #22221D",
+"M. c #222201",
+"N. c #21211D",
+"B. c #212101",
+"V. c #1F1F0C",
+"C. c #1E1E28",
+"Z. c #1E1E1D",
+"A. c #1E1E1C",
+"S. c #1D1D00",
+"D. c #1C1C21",
+"F. c #1C1C01",
+"G. c #1C1C00",
+"H. c #1B1B14",
+"J. c #1B1B00",
+"K. c #1A1A00",
+"L. c #191901",
+"P. c #181800",
+"I. c #171700",
+"U. c gray7",
+"Y. c #121210",
+"T. c #121201",
+"R. c #121200",
+"E. c #111100",
+"W. c #101010",
+"Q. c gray6",
+"!. c #0E0E0D",
+"~. c #0E0E0C",
+"^. c #0E0E00",
+"/. c #0C0C0E",
+"(. c #0B0B0F",
+"). c #0B0B0D",
+"_. c #0A0A00",
+"`. c #090900",
+"'. c #08080E",
+"]. c #060606",
+"[. c #050500",
+"{. c #020202",
+"}. c #010102",
+"|. c #010101",
+" X c #010100",
+".X c #000002",
+"XX c black",
+"oX c black",
+"OX c black",
+"+X c black",
+"@X c black",
+"#X c black",
+"$X c black",
+"%X c black",
+"&X c black",
+"*X c black",
+"=X c black",
+"-X c black",
+";X c black",
+":X c black",
+">X c black",
+",X c black",
+"<X c black",
+"1X c black",
+"2X c black",
+"3X c black",
+"4X c black",
+"5X c black",
+"6X c black",
+"7X c black",
+"8X c black",
+"9X c black",
+"0X c black",
+"qX c black",
+"wX c black",
+"eX c black",
+"rX c black",
+"tX c black",
+"yX c black",
+"uX c black",
+"iX c black",
+"pX c black",
+"aX c black",
+"sX c black",
+"dX c black",
+"fX c black",
+"gX c black",
+"hX c black",
+"jX c black",
+"kX c black",
+"lX c black",
+"zX c black",
+"xX c black",
+"cX c black",
+"vX c black",
+"bX c black",
+"nX c black",
+"mX c black",
+"MX c black",
+"NX c black",
+"BX c black",
+"VX c black",
+"CX c black",
+"ZX c black",
+"AX c black",
+"SX c black",
+"DX c black",
+"FX c black",
+"GX c black",
+"HX c black",
+"JX c black",
+"KX c black",
+"LX c black",
+"PX c black",
+"IX c black",
+"UX c black",
+/* pixels */
+" ",
+" ",
+" ",
+" @ @ @ @ - @ - @ - @ - @ @ @ @ ",
+" g -.<.-.w.f.w.w.f.w.w.f.q.-.3.-.r ",
+" ~ ].S.].( J I I I I I J ..].3.Q.C ",
+" W s.[ a.- 5 z.2.Z.c ",
+" P s.&.f., 5 Z.I.^.j ",
+" P s.&.f.1 0 Z.[ S.x ",
+" W j.&.f.1 8 k.[ j.x ",
+" P s.&.f., 8 Z.o.S.x ",
+" P s.o.f.2 @ @ @ q k.[ j.x ",
+" W S.K ] e.r.<.e.r.e.2.r.w.) K I.x ",
+" P S.A A &.p.1.1.1.1.1.1.o.k F I.x ",
+" P S.F K o.o.o.o.o.o.&.p.p.&.E S.x ",
+" W S.A E ].].].].].].C.{ 7.Q.[ S.x ",
+" P S.A E ].].].].].]... 6 k.o.j.x ",
+" / I.k K ^.].].].].]._ 3 k.` j.x ",
+" G V.E [ ].].].].].].-.3 f H.1.I.x ",
+" - C Q.Q.Q.Q.Q.Q.Q.Q.I.z.D.Q.Q.Q.j ",
+" - a r r r a w r a r f s r r r - ",
+" ",
+" ",
+" "
+};
--- /dev/null
+/* XPM */
+static char *save_signal[] = {
+/* columns rows colors chars-per-pixel */
+"24 24 256 2 ",
+" c None",
+". c #FFFF97",
+"X c #FFFF95",
+"o c #FFFF94",
+"O c #FFFF93",
+"+ c #FFFF92",
+"@ c #FFFF91",
+"# c #FFFF90",
+"$ c #FFFF8F",
+"% c #FFFF8E",
+"& c #FFFF8D",
+"* c #FFFF8C",
+"= c #FFFE8C",
+"- c #FFFD8B",
+"; c #FFFC8C",
+": c #FFFC8B",
+"> c #FFFC8A",
+", c #FFFC89",
+"< c #FFFB8C",
+"1 c #FFFB8B",
+"2 c #FFFB8A",
+"3 c #FFFB89",
+"4 c #FFFA8C",
+"5 c #FFFA8A",
+"6 c #FFFA89",
+"7 c #FFFA88",
+"8 c #FFF98C",
+"9 c #FFF98B",
+"0 c #FFF98A",
+"q c #FFF88A",
+"w c #FFF889",
+"e c #FFF78B",
+"r c #FFF789",
+"t c #FEFEFE",
+"y c #FDFEFD",
+"u c gray99",
+"i c #FCFBFD",
+"p c #FCF78A",
+"a c #FBF889",
+"s c #F9F789",
+"d c #F8F7F8",
+"f c #F8F289",
+"g c gray97",
+"h c #F5F085",
+"j c #F3F4F4",
+"k c #F3F2F2",
+"l c gray95",
+"z c #F2F1F1",
+"x c gray94",
+"c c #EFEFF0",
+"v c #EEEFF0",
+"b c #EEEFEF",
+"n c #EEEEF0",
+"m c #EEEEEE",
+"M c #EEEDF0",
+"N c #E7E6E6",
+"B c #E4DF7D",
+"V c gray88",
+"C c #DECF76",
+"Z c #DDD479",
+"A c #D2D0D0",
+"S c #CDCDCE",
+"D c #CDCDCD",
+"F c #CCCBCB",
+"G c #CCCACD",
+"H c #CBCACC",
+"J c #CACACD",
+"K c #CACACC",
+"L c #C6C6C6",
+"P c #C5C4C8",
+"I c #C3BD70",
+"U c #C2BA6D",
+"Y c #C0BEBE",
+"T c #BDBD6B",
+"R c #BDBD6A",
+"E c #BDBD69",
+"W c #BDBD68",
+"Q c #BDBD67",
+"! c #BDBD66",
+"~ c #BDBD65",
+"^ c #BCBD69",
+"/ c #BCBCBC",
+"( c #B4AF66",
+") c #B2B0B4",
+"_ c #B1A163",
+"` c #B0B0B5",
+"' c #B0A462",
+"] c #AFA360",
+"[ c #AEA662",
+"{ c #ADA562",
+"} c #ADA05F",
+"| c #AD9F5F",
+" . c #ACA05F",
+".. c #AC9F5F",
+"X. c #AC9E5F",
+"o. c #ABABAA",
+"O. c #AAA05C",
+"+. c #AA9F61",
+"@. c #AA9D5F",
+"#. c #A6A3A7",
+"$. c #A5985D",
+"%. c #A3A1A4",
+"&. c #A19B57",
+"*. c #9FA05C",
+"=. c #9D9D9D",
+"-. c #9D8F58",
+";. c #8A8154",
+":. c #7D7551",
+">. c #716E70",
+",. c #6F6648",
+"<. c #6F6645",
+"1. c #6C6544",
+"2. c #685F41",
+"3. c #646366",
+"4. c #605939",
+"5. c #5D5D5C",
+"6. c #5A5235",
+"7. c #58555B",
+"8. c #565557",
+"9. c #535359",
+"0. c #534F52",
+"q. c #4D4D4F",
+"w. c #4D474B",
+"e. c #493C2B",
+"r. c #453D38",
+"t. c #413C34",
+"y. c #403D3D",
+"u. c #3F3E40",
+"i. c #3E3F41",
+"p. c #3C3938",
+"a. c #3C3832",
+"s. c #3C3831",
+"d. c #3A3238",
+"f. c #39342D",
+"g. c #393338",
+"h. c #383638",
+"j. c #383438",
+"k. c #383338",
+"l. c #373438",
+"z. c #373338",
+"x. c #37311F",
+"c. c #363537",
+"v. c #363526",
+"b. c #363238",
+"n. c #323034",
+"m. c #2E2921",
+"M. c #282422",
+"N. c #26252A",
+"B. c #242525",
+"V. c #212222",
+"C. c #1F1A20",
+"Z. c #1E1B1C",
+"A. c #19181B",
+"S. c #191418",
+"D. c #070809",
+"F. c #010000",
+"G. c #000004",
+"H. c #000003",
+"J. c #000002",
+"K. c black",
+"L. c black",
+"P. c black",
+"I. c black",
+"U. c black",
+"Y. c black",
+"T. c black",
+"R. c black",
+"E. c black",
+"W. c black",
+"Q. c black",
+"!. c black",
+"~. c black",
+"^. c black",
+"/. c black",
+"(. c black",
+"). c black",
+"_. c black",
+"`. c black",
+"'. c black",
+"]. c black",
+"[. c black",
+"{. c black",
+"}. c black",
+"|. c black",
+" X c black",
+".X c black",
+"XX c black",
+"oX c black",
+"OX c black",
+"+X c black",
+"@X c black",
+"#X c black",
+"$X c black",
+"%X c black",
+"&X c black",
+"*X c black",
+"=X c black",
+"-X c black",
+";X c black",
+":X c black",
+">X c black",
+",X c black",
+"<X c black",
+"1X c black",
+"2X c black",
+"3X c black",
+"4X c black",
+"5X c black",
+"6X c black",
+"7X c black",
+"8X c black",
+"9X c black",
+"0X c black",
+"qX c black",
+"wX c black",
+"eX c black",
+"rX c black",
+"tX c black",
+"yX c black",
+"uX c black",
+"iX c black",
+"pX c black",
+"aX c black",
+"sX c black",
+"dX c black",
+"fX c black",
+"gX c black",
+"hX c black",
+"jX c black",
+"kX c black",
+"lX c black",
+"zX c black",
+"xX c black",
+"cX c black",
+"vX c black",
+"bX c black",
+"nX c black",
+"mX c black",
+"MX c black",
+"NX c black",
+"BX c black",
+"VX c black",
+"CX c black",
+"ZX c black",
+"AX c black",
+"SX c black",
+"DX c black",
+"FX c black",
+"GX c black",
+"HX c black",
+"JX c black",
+"KX c black",
+"LX c black",
+"PX c black",
+"IX c black",
+"UX c black",
+/* pixels */
+" ",
+" ",
+" ",
+" ",
+" ",
+" ",
+" A S S S S S S S S S S S S S S S S g ",
+" o.Z.F.F.F.F.F.F.F.F.F.F.F.F.F.F.D.F./ ",
+" d 0.v.*.T Q Q T T T Q Q T Q T T $.x.3.b ",
+" #.C.;.. . . . . . . . . . $ . $ ] r.) ",
+" N 8.f.I $ $ $ h $ $ $ $ h $ $ $ C 6.9. ",
+" / S.:.e $ $ h $ $ h $ h $ $ $ e $.a.P ",
+" u.a.U . $ h $ h $ $ $ $ $ h $ C <.9. ",
+" #.N.<.h $ $ h $ $ h $ h h $ $ $ } m.S ",
+" g w.M.( $ $ $ $ h $ $ $ $ $ h $ B 4.>.b ",
+" =.Z.,.e . $ $ $ $ $ $ $ $ $ $ $ ] t.) ",
+"N q.C.<.] +.| | | } } | | | } } &.e.5. ",
+"L B.p.p.l.c.c.a.l.c.a.l.c.c.a.d.c.p.S ",
+" g g c c c c c c c c c c c c c b g ",
+" ",
+" ",
+" ",
+" ",
+" "
+};
--- /dev/null
+/* XPM */
+static char *saved[] = {
+/* columns rows colors chars-per-pixel */
+"32 32 64 1 ",
+" c white",
+". c gray3",
+"X c #101010",
+"o c #181818",
+"O c gray13",
+"+ c gray16",
+"@ c #313131",
+"# c gray26",
+"$ c gray32",
+"% c gray42",
+"& c gray45",
+"* c #7B7B7B",
+"= c gray71",
+"- c gray74",
+"; c #C6C6C6",
+": c #CECECE",
+"> c gray84",
+", c gray97",
+"< c #525242",
+"1 c #6B6B52",
+"2 c #636342",
+"3 c #080800",
+"4 c #101000",
+"5 c #181800",
+"6 c #212100",
+"7 c #292900",
+"8 c #313100",
+"9 c #393900",
+"0 c #424200",
+"q c #4A4A00",
+"w c #525200",
+"e c #5A5A00",
+"r c #636300",
+"t c #6B6B00",
+"y c #737300",
+"u c #7B7B00",
+"i c #848400",
+"p c #8C8C00",
+"a c #949400",
+"s c #9C9C00",
+"d c #CECED6",
+"f c #B5B5BD",
+"g c #A5A5AD",
+"h c #94949C",
+"j c #9C9CA5",
+"k c #84848C",
+"l c #6B6B73",
+"z c #7B7B84",
+"x c #63636B",
+"c c #8C8C9C",
+"v c #737384",
+"b c #292931",
+"n c #212129",
+"m c #313142",
+"M c #181821",
+"N c #212131",
+"B c #101018",
+"V c #181829",
+"C c #080810",
+"Z c #101021",
+"A c #101029",
+"S c black",
+"D c black",
+"F c black",
+/* pixels */
+">>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>",
+">>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>",
+":>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>",
+">>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>",
+">>:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>",
+">>>>>>;----============;=-;>>>>>",
+">:>:>>OSSSSSSSSSSSSSSSSSSS.::>:>",
+">>>>>>M5qSx:::::::::::*S&$S:>>>>",
+">:>:>:V9pSg>:>:>:>:>:>-S&$X>>>:>",
+">>>>>>n8uSj>>>>>>>>>>>-SSSX>:>>>",
+">:>:>>n8uSh>:>:>:>:>:>fS08X:>>:>",
+">>>>>>n8uSj>>>>>>>>>>>=SuwCd>:>>",
+">:>:>:V8uSj>:>:>:>:>:>=StqB>>>>:",
+">>>>>>n8uSj>>>>>>>>>>>=StqC:>:>>",
+">:>:>>n8uSj>:>:>:>:>:>fStqB:>>>>",
+">>>>>>n8uSj>>>>>>>>>>>fStqX:>>:>",
+">:>:>:V7pr<*vzzzzzzz&v1ei0Bd>:>>",
+">>>>>>n6pse33333333343qss9X:>>:>",
+">:>:>>n6ppiiiiiiiiiiiiipa0Cd:>>>",
+">>>>>>n7ppr9990909086679i0B:>>:>",
+">:>:>dV6aa9SSSSSSSSZmmVStqXd>>>>",
+">>>>>>n6paqSSSSSSSS%,,kStqB:>:>>",
+">:>:>>n7pa0SSS.SSSS& hStwC:>>:>",
+">>>>>>V6aaqSSSSSSSS& cSyqXd>:>>",
+">:>:>:B6asqSSSS.SSS& hSywC>>>>:",
+">>>>>>-<66SSSSSSSSSo$$OS43S:>:>>",
+">:>:>>>;NN@@@@@@@@@+oo+@bb#>>>>>",
+">>>>>d>>>>>>>>>>>>>>>>>>>>>>:>:>",
+">:>:>>>d>>>>>>>>>>>>>>>>>>>>>>>>",
+">>>>:>>>:>d>>>>>>d>:>:>:>:>:>:>>",
+":>:>>>:>>>>:>:>:>>>>>>>>>>>>>>:>",
+">>>>>:>>:>:>>>>>>:>:>:>:>:>:>:>>"
+};
--- /dev/null
+/* XPM */
+static char *select[] = {
+/* columns rows colors chars-per-pixel */
+"24 21 256 2 ",
+" c black",
+". c #010101",
+"X c #020202",
+"o c gray1",
+"O c #040404",
+"+ c gray2",
+"@ c #060606",
+"# c #070707",
+"$ c gray3",
+"% c #090909",
+"& c gray4",
+"* c #0B0B0B",
+"= c #0C0C0C",
+"- c gray5",
+"; c #0E0E0E",
+": c gray6",
+"> c #101010",
+", c #111111",
+"< c gray7",
+"1 c #131313",
+"2 c gray8",
+"3 c #151515",
+"4 c #161616",
+"5 c gray9",
+"6 c #181818",
+"7 c #191919",
+"8 c gray10",
+"9 c #1B1B1B",
+"0 c gray11",
+"q c #1D1D1D",
+"w c #1E1E1E",
+"e c gray12",
+"r c #202020",
+"t c gray13",
+"y c #222222",
+"u c #232323",
+"i c gray14",
+"p c #252525",
+"a c gray15",
+"s c #272727",
+"d c #282828",
+"f c gray16",
+"g c #2A2A2A",
+"h c gray17",
+"j c #2C2C2C",
+"k c #2D2D2D",
+"l c gray18",
+"z c #2F2F2F",
+"x c gray19",
+"c c #313131",
+"v c #323232",
+"b c gray20",
+"n c #343434",
+"m c #353535",
+"M c gray21",
+"N c #373737",
+"B c gray22",
+"V c #393939",
+"C c #3A3A3A",
+"Z c gray23",
+"A c #3C3C3C",
+"S c gray24",
+"D c #3E3E3E",
+"F c #3F3F3F",
+"G c gray25",
+"H c #414141",
+"J c gray26",
+"K c #434343",
+"L c #444444",
+"P c gray27",
+"I c #464646",
+"U c gray28",
+"Y c #484848",
+"T c #494949",
+"R c gray29",
+"E c #4B4B4B",
+"W c #4C4C4C",
+"Q c gray30",
+"! c #4E4E4E",
+"~ c gray31",
+"^ c #505050",
+"/ c #515151",
+"( c gray32",
+") c #535353",
+"_ c gray33",
+"` c #555555",
+"' c #565656",
+"] c gray34",
+"[ c #585858",
+"{ c gray35",
+"} c #5A5A5A",
+"| c #5B5B5B",
+" . c gray36",
+".. c #5D5D5D",
+"X. c gray37",
+"o. c #5F5F5F",
+"O. c #606060",
+"+. c gray38",
+"@. c #626262",
+"#. c gray39",
+"$. c #646464",
+"%. c #656565",
+"&. c gray40",
+"*. c #676767",
+"=. c #686868",
+"-. c DimGray",
+";. c #6A6A6A",
+":. c gray42",
+">. c #6C6C6C",
+",. c #6D6D6D",
+"<. c gray43",
+"1. c #6F6F6F",
+"2. c gray44",
+"3. c #717171",
+"4. c #727272",
+"5. c gray45",
+"6. c #747474",
+"7. c gray46",
+"8. c #767676",
+"9. c #777777",
+"0. c gray47",
+"q. c #797979",
+"w. c gray48",
+"e. c #7B7B7B",
+"r. c #7C7C7C",
+"t. c gray49",
+"y. c #7E7E7E",
+"u. c gray50",
+"i. c #808080",
+"p. c #818181",
+"a. c gray51",
+"s. c #838383",
+"d. c #848484",
+"f. c gray52",
+"g. c #868686",
+"h. c gray53",
+"j. c #888888",
+"k. c #898989",
+"l. c gray54",
+"z. c #8B8B8B",
+"x. c gray55",
+"c. c #8D8D8D",
+"v. c #8E8E8E",
+"b. c gray56",
+"n. c #909090",
+"m. c gray57",
+"M. c #929292",
+"N. c #939393",
+"B. c gray58",
+"V. c #959595",
+"C. c gray59",
+"Z. c #979797",
+"A. c #989898",
+"S. c gray60",
+"D. c #9A9A9A",
+"F. c #9B9B9B",
+"G. c gray61",
+"H. c #9D9D9D",
+"J. c gray62",
+"K. c #9F9F9F",
+"L. c #A0A0A0",
+"P. c gray63",
+"I. c #A2A2A2",
+"U. c gray64",
+"Y. c #A4A4A4",
+"T. c #A5A5A5",
+"R. c gray65",
+"E. c #A7A7A7",
+"W. c gray66",
+"Q. c #A9A9A9",
+"!. c #AAAAAA",
+"~. c gray67",
+"^. c #ACACAC",
+"/. c gray68",
+"(. c #AEAEAE",
+"). c #AFAFAF",
+"_. c gray69",
+"`. c #B1B1B1",
+"'. c #B2B2B2",
+"]. c gray70",
+"[. c #B4B4B4",
+"{. c gray71",
+"}. c #B6B6B6",
+"|. c #B7B7B7",
+" X c gray72",
+".X c #B9B9B9",
+"XX c gray73",
+"oX c #BBBBBB",
+"OX c #BCBCBC",
+"+X c gray74",
+"@X c gray",
+"#X c gray75",
+"$X c #C0C0C0",
+"%X c #C1C1C1",
+"&X c gray76",
+"*X c #C3C3C3",
+"=X c gray77",
+"-X c #C5C5C5",
+";X c #C6C6C6",
+":X c gray78",
+">X c #C8C8C8",
+",X c gray79",
+"<X c #CACACA",
+"1X c #CBCBCB",
+"2X c gray80",
+"3X c #CDCDCD",
+"4X c #CECECE",
+"5X c gray81",
+"6X c #D0D0D0",
+"7X c gray82",
+"8X c #D2D2D2",
+"9X c LightGray",
+"0X c gray83",
+"qX c #D5D5D5",
+"wX c gray84",
+"eX c #D7D7D7",
+"rX c #D8D8D8",
+"tX c gray85",
+"yX c #DADADA",
+"uX c gray86",
+"iX c gainsboro",
+"pX c #DDDDDD",
+"aX c gray87",
+"sX c #DFDFDF",
+"dX c gray88",
+"fX c #E1E1E1",
+"gX c #E2E2E2",
+"hX c gray89",
+"jX c #E4E4E4",
+"kX c gray90",
+"lX c #E6E6E6",
+"zX c #E7E7E7",
+"xX c gray91",
+"cX c #E9E9E9",
+"vX c #EAEAEA",
+"bX c gray92",
+"nX c #ECECEC",
+"mX c gray93",
+"MX c #EEEEEE",
+"NX c #EFEFEF",
+"BX c gray94",
+"VX c #F1F1F1",
+"CX c gray95",
+"ZX c #F3F3F3",
+"AX c #F4F4F4",
+"SX c gray96",
+"DX c #F6F6F6",
+"FX c gray97",
+"GX c #F8F8F8",
+"HX c #F9F9F9",
+"JX c gray98",
+"KX c #FBFBFB",
+"LX c gray99",
+"PX c #FDFDFD",
+"IX c #FEFEFE",
+"UX c None",
+/* pixels */
+"UXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUX",
+"UXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUX",
+"UXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUX",
+"UXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUX",
+"UXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUX",
+"UXUXUXO O JXO O JXO O UXUXUXUXUXUXUXUXUXUXUXUXUX",
+"UXUXUXO JXJXUXJXJXUXO JXUXUXUXUXUXUXUXUXUXUXUXUX",
+"UXUXUXUX=XUXUXUXUXUXJXJXUXUXUXUXUXUXUXUXUXUXUXUX",
+"UXUXUXO =XUXUXUXUXUXO UXUXUXUXUXUXUXUXUXUXUXUXUX",
+"UXUXUXO JXUXUXUXUXUXO O JXO O JXO O UXUXUXUXUXUX",
+"UXUXUXJXJXUXUXUXUXUXUXJXJXUXJXJXUXO JXUXUXUXUXUX",
+"UXUXUXO UXUXUXUXUXUXUXUXUXUXUXUXUXJXJXUXUXUXUXUX",
+"UXUXUXO O JXO O UXUXUXUXUXUXUXUXUXO UXUXUXUXUXUX",
+"UXUXUXUXJXJXUXO JXUXUXUXUXUXUXUXUXO JXUXUXUXUXUX",
+"UXUXUXUXUXUXUXJXJXUXUXUXUXUXUXUXUXJXJXUXUXUXUXUX",
+"UXUXUXUXUXUXUXO UXUXUXUXUXUXUXUXUXO UXUXUXUXUXUX",
+"UXUXUXUXUXUXUXO O JXO O JXO O JXO O UXUXUXUXUXUX",
+"UXUXUXUXUXUXUXUXJXJXUXJXJXUXJXJXUXUXUXUXUXUXUXUX",
+"UXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUX",
+"UXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUX",
+"UXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUX"
+};
--- /dev/null
+/* XPM */
+static char *service[] = {
+/* columns rows colors chars-per-pixel */
+"24 24 256 2 ",
+" c None",
+". c #FFFF93",
+"X c #FFFF91",
+"o c #FFFF90",
+"O c #FFFF8F",
+"+ c #FFFF8E",
+"@ c #FFFF8D",
+"# c #FFFF8C",
+"$ c #FFFF8B",
+"% c #FFFC90",
+"& c #FEFC8E",
+"* c #FBF98F",
+"= c #FAF58F",
+"- c #F9F9F9",
+"; c #F9F7F8",
+": c #F8F8F8",
+"> c #F8F58D",
+", c #F7F7F8",
+"< c #F7F6F6",
+"1 c #F6F38A",
+"2 c #F5F5F4",
+"3 c #F5F28B",
+"4 c #F5F28A",
+"5 c #F4F4F4",
+"6 c #F4F38A",
+"7 c gray95",
+"8 c #F2F1F2",
+"9 c #F2EC8A",
+"0 c #F1F1F2",
+"q c #F1F1F1",
+"w c #F1F0F0",
+"e c #F0EEEF",
+"r c #EFEEED",
+"t c #EFEDED",
+"y c #EDEBEB",
+"u c #ECECED",
+"i c #ECE9EA",
+"p c gray92",
+"a c #EBE9EA",
+"s c #EBE9E9",
+"d c #EBE886",
+"f c #E9E9E9",
+"g c #E9E487",
+"h c #E8E9EA",
+"j c #E8E487",
+"k c #E8E388",
+"l c #E7E5E6",
+"z c #E5E085",
+"x c #E1DFE0",
+"c c #DFDFE0",
+"v c gainsboro",
+"b c #DBDCDC",
+"n c #D9D47E",
+"m c #D7D5D6",
+"M c #D5D5D6",
+"N c #D5D2D2",
+"B c #D3D2D2",
+"V c #D2CE7E",
+"C c #D2CE7B",
+"Z c #D2CC81",
+"A c #D1CF7E",
+"S c #CEC979",
+"D c #CCC97B",
+"F c #C9C17B",
+"G c #C7C077",
+"H c #BFBCBF",
+"J c #BFB777",
+"K c #BCB9BC",
+"L c #BCB475",
+"P c #B6B6B7",
+"I c #B3AF6E",
+"U c #B3AE72",
+"Y c #B2AEB1",
+"T c #B2AC6E",
+"R c #B1ACAD",
+"E c #B1AA71",
+"W c #B0ADB0",
+"Q c #AFADB1",
+"! c #AFA9AC",
+"~ c #AEA96B",
+"^ c #ADABAB",
+"/ c #ADA96B",
+"( c #A8A166",
+") c #A7A266",
+"_ c #A4A4A7",
+"` c #A4A165",
+"' c #A3A165",
+"] c #A3A0A2",
+"[ c #A09C65",
+"{ c #9F9D9F",
+"} c #9F9C65",
+"| c #9B9769",
+" . c #938E64",
+".. c #938C61",
+"X. c #90898B",
+"o. c #8F8F94",
+"O. c #8F8A64",
+"+. c #8E865F",
+"@. c #8D8564",
+"#. c #8B898D",
+"$. c #8A8561",
+"%. c #88815F",
+"&. c #878889",
+"*. c #878284",
+"=. c #858488",
+"-. c #848285",
+";. c #827F80",
+":. c #808183",
+">. c #7F7B7E",
+",. c #7C7558",
+"<. c #7B775E",
+"1. c #79797A",
+"2. c #79777A",
+"3. c #78785D",
+"4. c #777172",
+"5. c #756F5B",
+"6. c #736D70",
+"7. c #717071",
+"8. c #706C6F",
+"9. c #6F6B6C",
+"0. c #6D6C6B",
+"q. c #6D6B6D",
+"w. c #6D6B59",
+"e. c #6D6566",
+"r. c #6B6869",
+"t. c #6A6869",
+"y. c #6A6566",
+"u. c #6A6362",
+"i. c #69696A",
+"p. c #696463",
+"a. c #686365",
+"s. c #676669",
+"d. c #676465",
+"f. c #676256",
+"g. c #666165",
+"h. c #656465",
+"j. c #646054",
+"k. c #645D53",
+"l. c #635E52",
+"z. c #625A4C",
+"x. c #615D4E",
+"c. c #605C5F",
+"v. c #5F5A50",
+"b. c #5E5B54",
+"n. c #5D5C60",
+"m. c #5D5B51",
+"M. c #5C5A53",
+"N. c #5C5A50",
+"B. c #5C584A",
+"V. c #5C5651",
+"C. c #5C564D",
+"Z. c #5B5C60",
+"A. c #575259",
+"S. c #56504B",
+"D. c #55514C",
+"F. c #545259",
+"G. c #53534B",
+"H. c #534F4B",
+"J. c #4D4A4C",
+"K. c #4B4749",
+"L. c #47454B",
+"P. c black",
+"I. c black",
+"U. c black",
+"Y. c black",
+"T. c black",
+"R. c black",
+"E. c black",
+"W. c black",
+"Q. c black",
+"!. c black",
+"~. c black",
+"^. c black",
+"/. c black",
+"(. c black",
+"). c black",
+"_. c black",
+"`. c black",
+"'. c black",
+"]. c black",
+"[. c black",
+"{. c black",
+"}. c black",
+"|. c black",
+" X c black",
+".X c black",
+"XX c black",
+"oX c black",
+"OX c black",
+"+X c black",
+"@X c black",
+"#X c black",
+"$X c black",
+"%X c black",
+"&X c black",
+"*X c black",
+"=X c black",
+"-X c black",
+";X c black",
+":X c black",
+">X c black",
+",X c black",
+"<X c black",
+"1X c black",
+"2X c black",
+"3X c black",
+"4X c black",
+"5X c black",
+"6X c black",
+"7X c black",
+"8X c black",
+"9X c black",
+"0X c black",
+"qX c black",
+"wX c black",
+"eX c black",
+"rX c black",
+"tX c black",
+"yX c black",
+"uX c black",
+"iX c black",
+"pX c black",
+"aX c black",
+"sX c black",
+"dX c black",
+"fX c black",
+"gX c black",
+"hX c black",
+"jX c black",
+"kX c black",
+"lX c black",
+"zX c black",
+"xX c black",
+"cX c black",
+"vX c black",
+"bX c black",
+"nX c black",
+"mX c black",
+"MX c black",
+"NX c black",
+"BX c black",
+"VX c black",
+"CX c black",
+"ZX c black",
+"AX c black",
+"SX c black",
+"DX c black",
+"FX c black",
+"GX c black",
+"HX c black",
+"JX c black",
+"KX c black",
+"LX c black",
+"PX c black",
+"IX c black",
+"UX c black",
+/* pixels */
+" ",
+" ",
+" ",
+" ",
+" , r c x r ; ",
+" < H o.4.9.d.d.s.4.#.H < ",
+" P 9.v.w.} [ ~ ~ ) } 5.v.s.R ",
+" e #.L.,.S 9 . O O O O . . S @.v.;.r ",
+" < =.B.| d . O O O O O O O O . 1 J z.>.e ",
+" R J.@.1 O O O O O O O O O O O O O U S._ ",
+" < 6.S.Z O O O O O O O O O O O O O O z k.d.r ",
+" v c.f.z O O O O O O O O O O O O O O . 3.A.m ",
+" v n.f.k O O O O O O O O O O O O O O O 3.A.m ",
+" < 9.S.V O O O O O O O O O O O O O O g k.d.r ",
+" ! K.O.1 O O O O O O O O O O O O O J H.{ ",
+" < >.C.I 1 O O O O O O O O O O O F B.>.r ",
+" r *.C.+.V 1 O O O O O O O n .B.>.l ",
+" < ! d.V.+.) I G S I ( .v.c._ < ",
+" r Y &.9.e.w.e.e.9.*.Q r ",
+" r c m m v e ",
+" ",
+" ",
+" ",
+" "
+};
--- /dev/null
+/* XPM */
+static char *service_type[] = {
+/* columns rows colors chars-per-pixel */
+"24 24 256 2 ",
+" c None",
+". c #FFFFFE",
+"X c #FFFEFE",
+"o c #FEFFFF",
+"O c #FEFEFE",
+"+ c #FEFEFB",
+"@ c #FEFDFD",
+"# c gray99",
+"$ c #FBFBF9",
+"% c #FAFAFC",
+"& c gray98",
+"* c #F8F6F6",
+"= c gray97",
+"- c #F7F6F6",
+"; c #F6F6F6",
+": c #F6F5F5",
+"> c #F5F5F6",
+", c #F5F3F3",
+"< c #F4F5F4",
+"1 c #F3F3F4",
+"2 c #F2F1F1",
+"3 c #F1F2F2",
+"4 c gray94",
+"5 c #EFEFEF",
+"6 c #EEEDED",
+"7 c #EEECEC",
+"8 c #ECECEC",
+"9 c #ECEBEB",
+"0 c gray92",
+"q c #EBEAEA",
+"w c #EBEAE4",
+"e c #EAEBEA",
+"r c #E9E9E2",
+"t c gray91",
+"y c #E8E8E6",
+"u c #E8E7E8",
+"i c #E7E7DD",
+"p c #E7E5E0",
+"a c gray90",
+"s c gray89",
+"d c #E1DDDC",
+"f c #E0E1E1",
+"g c #DFDEDD",
+"h c #DEDDDB",
+"j c #DEDCC8",
+"k c #DDDDDE",
+"l c #DCDCD0",
+"z c #D4D4D5",
+"x c #D4D4D3",
+"c c #D1CECE",
+"v c gray81",
+"b c #CECECF",
+"n c #CECECA",
+"m c #CCCDCD",
+"M c #C1C1C1",
+"N c #C1C0BF",
+"B c gray75",
+"V c gray",
+"C c #BEBCBC",
+"Z c gray69",
+"A c #AEACAC",
+"S c gray68",
+"D c #A8A6A4",
+"F c #A0A0A0",
+"G c #9D9E9E",
+"H c #9D9D9D",
+"J c #9A9A91",
+"K c #979797",
+"L c #949292",
+"P c #938E8E",
+"I c #929090",
+"U c gray57",
+"Y c #8E8E8E",
+"T c #8D8D8D",
+"R c #898989",
+"E c #888888",
+"W c gray53",
+"Q c #86807B",
+"! c gray52",
+"~ c #85857F",
+"^ c #818282",
+"/ c #818182",
+"( c gray50",
+") c #7E7E7F",
+"_ c #7E7E7E",
+"` c #7D7B7B",
+"' c #777676",
+"] c #767777",
+"[ c #767676",
+"{ c #757576",
+"} c #706D6E",
+"| c #6F6F69",
+" . c #6D6D6D",
+".. c #6A6A67",
+"X. c #6A6767",
+"o. c #686868",
+"O. c #666565",
+"+. c #656060",
+"@. c #625E5E",
+"#. c #605F5F",
+"$. c #605E5E",
+"%. c #5F5A5A",
+"&. c #5E5850",
+"*. c #5D5D58",
+"=. c #5D5857",
+"-. c #5C5C5D",
+";. c #5B5757",
+":. c #5A5554",
+">. c #595656",
+",. c #585656",
+"<. c gray34",
+"1. c #565656",
+"2. c #565454",
+"3. c #535053",
+"4. c #535050",
+"5. c #524F50",
+"6. c #515151",
+"7. c #514E4E",
+"8. c #504E4E",
+"9. c #504D4D",
+"0. c #4F4F4E",
+"q. c #4F4E4E",
+"w. c #4E4E4E",
+"e. c #4E4C4E",
+"r. c #4E4B4B",
+"t. c gray30",
+"y. c #4D4B4B",
+"u. c #4D4A49",
+"i. c #4C4C4C",
+"p. c #4B4743",
+"a. c gray29",
+"s. c #494949",
+"d. c #494948",
+"f. c #494646",
+"g. c #474545",
+"h. c #464646",
+"j. c #464545",
+"k. c #464039",
+"l. c gray27",
+"z. c #434242",
+"x. c gray26",
+"c. c #423F40",
+"v. c #41413E",
+"b. c gray25",
+"n. c #3D3939",
+"m. c #3C3A3B",
+"M. c #3C3A3A",
+"N. c #3B3B35",
+"B. c #3B3732",
+"V. c #373231",
+"C. c #363535",
+"Z. c #363130",
+"A. c #322E29",
+"S. c #2F2E2F",
+"D. c #2D2D2D",
+"F. c gray17",
+"G. c #2B2B21",
+"H. c #282828",
+"J. c #282727",
+"K. c #282525",
+"L. c #272522",
+"P. c #252525",
+"I. c #252524",
+"U. c #222121",
+"Y. c #212020",
+"T. c #202020",
+"R. c #201D1E",
+"E. c gray12",
+"W. c #1E1E1E",
+"Q. c #1E1C1C",
+"!. c gray10",
+"~. c #121313",
+"^. c #111111",
+"/. c #0E0D0D",
+"(. c #09090B",
+"). c #020000",
+"_. c #010100",
+"`. c black",
+"'. c black",
+"]. c black",
+"[. c black",
+"{. c black",
+"}. c black",
+"|. c black",
+" X c black",
+".X c black",
+"XX c black",
+"oX c black",
+"OX c black",
+"+X c black",
+"@X c black",
+"#X c black",
+"$X c black",
+"%X c black",
+"&X c black",
+"*X c black",
+"=X c black",
+"-X c black",
+";X c black",
+":X c black",
+">X c black",
+",X c black",
+"<X c black",
+"1X c black",
+"2X c black",
+"3X c black",
+"4X c black",
+"5X c black",
+"6X c black",
+"7X c black",
+"8X c black",
+"9X c black",
+"0X c black",
+"qX c black",
+"wX c black",
+"eX c black",
+"rX c black",
+"tX c black",
+"yX c black",
+"uX c black",
+"iX c black",
+"pX c black",
+"aX c black",
+"sX c black",
+"dX c black",
+"fX c black",
+"gX c black",
+"hX c black",
+"jX c black",
+"kX c black",
+"lX c black",
+"zX c black",
+"xX c black",
+"cX c black",
+"vX c black",
+"bX c black",
+"nX c black",
+"mX c black",
+"MX c black",
+"NX c black",
+"BX c black",
+"VX c black",
+"CX c black",
+"ZX c black",
+"AX c black",
+"SX c black",
+"DX c black",
+"FX c black",
+"GX c black",
+"HX c black",
+"JX c black",
+"KX c black",
+"LX c black",
+"PX c black",
+"IX c black",
+"UX c black",
+/* pixels */
+" ",
+" ",
+" ",
+" ",
+" W ( ( ( ( W ",
+" = M <.;.).).).).).).<.<.M = ",
+" = g.~.).J.<.O.O.| %.<.S.).~.g.= ",
+" 5 ;.).E.K = A G K v = P L.).0.p ",
+" = 0.).A.j ' g.J.E.E.B.0.G g p.).0.5 ",
+" Y ).L.l i n.%.v 5 5 5 5 A V.O. g B.).( ",
+" B E.E.v = c.( 5 n.' v L.E.B ",
+" ' ).g. 0.0. p S.G g.).' ",
+" ' ).g. g.%. = S.K g.).' ",
+" B E.L.v p S.D O.%. v L.E.B ",
+" W ).L.g N L.Y u = z &.0.= p k.).' ",
+" 5 0.).N.i z 0.0.5.0.7.%.0.| p &.).n.5 ",
+" p 0.).L.K = p Y W ( Z P G.).g.g ",
+" 5 g./.).V.;.| Q Q | ;.A.)./.g.5 ",
+" = M 0.5.).).).).).).5.0.B = ",
+" W ( ( ( ( Y ",
+" ",
+" ",
+" ",
+" "
+};
--- /dev/null
+/* XPM */
+static char *set[] = {
+/* columns rows colors chars-per-pixel */
+"24 24 256 2 ",
+" c None",
+". c #FFFFA5",
+"X c #FFFF9B",
+"o c #FFFF9A",
+"O c #FFFF99",
+"+ c #FFFF98",
+"@ c #FFFF96",
+"# c #FFFF95",
+"$ c #FFFF94",
+"% c #FFFF93",
+"& c #FFFF92",
+"* c #FFFF91",
+"= c #FFFF90",
+"- c #FFFF8D",
+"; c #FFFE91",
+": c #FFFE8C",
+"> c #FFFD8D",
+", c #FFFD8B",
+"< c #FFFC8D",
+"1 c #FFFC8C",
+"2 c #FFFC8A",
+"3 c #FFFB8E",
+"4 c #FFFB8D",
+"5 c #FFFB88",
+"6 c #FFF88A",
+"7 c #FFF889",
+"8 c #FFF789",
+"9 c #FEF787",
+"0 c #FAF687",
+"q c #FAF588",
+"w c #F9F587",
+"e c #F9F285",
+"r c #F9F086",
+"t c #F7F486",
+"y c #F7F187",
+"u c #F6F188",
+"i c #F6F186",
+"p c #F5F286",
+"a c #F5F087",
+"s c #F5F086",
+"d c #F5EE86",
+"f c #F5EC86",
+"g c #F5EB86",
+"h c #F2EE82",
+"j c #F2EB81",
+"k c #EFEA82",
+"l c #EEEE92",
+"z c #EDE782",
+"x c #EAE881",
+"c c #E9E57F",
+"v c #E9E47E",
+"b c #E7E07B",
+"n c #E5E37D",
+"m c #E3DE7C",
+"M c #E3DC79",
+"N c #DFDF81",
+"B c #DFDF80",
+"V c #DFDF7C",
+"C c #DFDC7B",
+"Z c #DFDA79",
+"A c #DFD777",
+"S c #DEDB79",
+"D c #DED878",
+"F c #D8D576",
+"G c #D3CF74",
+"H c #D3CE73",
+"J c #D1D074",
+"K c #CBC46D",
+"L c #CAC76F",
+"P c #C9C66F",
+"I c #C9C56F",
+"U c #C9C56E",
+"Y c #C7C16B",
+"T c #BFBC66",
+"R c #BFB968",
+"E c #B5B363",
+"W c #B2B262",
+"Q c #B2B062",
+"! c #B2AD60",
+"~ c #ACA95E",
+"^ c #AAA75D",
+"/ c #A8A75C",
+"( c #A7A65C",
+") c #A3A15A",
+"_ c #A19E59",
+"` c #A0A0A0",
+"' c #9F9F9F",
+"] c gray62",
+"[ c #9D9D9D",
+"{ c #9B9750",
+"} c #838348",
+"| c #817F47",
+" . c #7A7A7D",
+".. c #7A7A7C",
+"X. c #797742",
+"o. c #78797B",
+"O. c #78787B",
+"+. c #767677",
+"@. c #757676",
+"#. c #747475",
+"$. c #726E75",
+"%. c #6F6C73",
+"&. c #6D6E75",
+"*. c #6D6D74",
+"=. c #6D6B72",
+"-. c #6D6A71",
+";. c #6C693B",
+":. c #67656C",
+">. c #5E5B33",
+",. c #5B5A5B",
+"<. c #585830",
+"1. c #535252",
+"2. c #525130",
+"3. c #515236",
+"4. c #515235",
+"5. c #515135",
+"6. c #515133",
+"7. c #515034",
+"8. c #514F35",
+"9. c #514E33",
+"0. c #514E32",
+"q. c #514E31",
+"w. c #514D33",
+"e. c #514D31",
+"r. c #514A30",
+"t. c #50502F",
+"y. c #50502E",
+"u. c #504F30",
+"i. c #504F2D",
+"p. c #504F2C",
+"a. c #504F2B",
+"s. c #504E2B",
+"d. c #504D2B",
+"f. c #504C32",
+"g. c #4C4A28",
+"h. c #4C4A27",
+"j. c #47462A",
+"k. c #434124",
+"l. c #434023",
+"z. c gray25",
+"x. c #403F40",
+"c. c #403F22",
+"v. c #403D22",
+"b. c #3F3D21",
+"n. c #3D3D43",
+"m. c #3D3C21",
+"M. c #3D3B22",
+"N. c #3C3C21",
+"B. c #3B3B1F",
+"V. c #3B3A1F",
+"C. c #3B3A1E",
+"Z. c #3B3920",
+"A. c #39381D",
+"S. c #383820",
+"D. c #37363D",
+"F. c #36373E",
+"G. c #36363D",
+"H. c #36361A",
+"J. c #36353C",
+"K. c #31311C",
+"L. c #31311A",
+"P. c #30301B",
+"I. c #302F1B",
+"U. c #302E1B",
+"Y. c #2F2D19",
+"T. c #2B2B18",
+"R. c #2B2919",
+"E. c #292519",
+"W. c #232313",
+"Q. c #201C14",
+"!. c #1F1D15",
+"~. c #1E1F18",
+"^. c #1E1F17",
+"/. c #1E1C14",
+"(. c #1E1A13",
+"). c #1E1913",
+"_. c #1D1D10",
+"`. c #1D1D0F",
+"'. c #101009",
+"]. c #0E0F08",
+"[. c #0D0C00",
+"{. c #0B0B00",
+"}. c #070600",
+"|. c #040400",
+" X c #030300",
+".X c #030000",
+"XX c #010100",
+"oX c #010000",
+"OX c black",
+"+X c black",
+"@X c black",
+"#X c black",
+"$X c black",
+"%X c black",
+"&X c black",
+"*X c black",
+"=X c black",
+"-X c black",
+";X c black",
+":X c black",
+">X c black",
+",X c black",
+"<X c black",
+"1X c black",
+"2X c black",
+"3X c black",
+"4X c black",
+"5X c black",
+"6X c black",
+"7X c black",
+"8X c black",
+"9X c black",
+"0X c black",
+"qX c black",
+"wX c black",
+"eX c black",
+"rX c black",
+"tX c black",
+"yX c black",
+"uX c black",
+"iX c black",
+"pX c black",
+"aX c black",
+"sX c black",
+"dX c black",
+"fX c black",
+"gX c black",
+"hX c black",
+"jX c black",
+"kX c black",
+"lX c black",
+"zX c black",
+"xX c black",
+"cX c black",
+"vX c black",
+"bX c black",
+"nX c black",
+"mX c black",
+"MX c black",
+"NX c black",
+"BX c black",
+"VX c black",
+"CX c black",
+"ZX c black",
+"AX c black",
+"SX c black",
+"DX c black",
+"FX c black",
+"GX c black",
+"HX c black",
+"JX c black",
+"KX c black",
+"LX c black",
+"PX c black",
+"IX c black",
+"UX c black",
+/* pixels */
+" ",
+" ",
+" ",
+" ",
+" ",
+" ' z.:.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.$.,.' ",
+" +.}.H.B.B.B.B.b.b.b.b.B.b.B.B.B.B.B.b.H.}.+. ",
+" .}.9 @ @ - @ @ @ @ @ @ @ - @ @ @ @ @ - !. . ",
+" .}.d { h.g.b.T J b.h.g.i.A V g.k.c.i.K E.+. ",
+" .[.E }.E l } 2.! }.( N V 9 t N !.`.V z Q. . ",
+" .[.( }.>.^ X X T }.K @ @ - 9 @ Y.H.@ u !. . ",
+" .}.z ;.}.}.b.J Y }.b.t.i.G - @ H.Y.@ t !. . ",
+" .}.u X b j.].W.E }.( N A t - - Y.Y.@ d !.+. ",
+" .}.K X.c . X.}.^ }.Y X @ - 9 @ Y.Y.- d !. . ",
+" .}.b 2.b.2.Y._ K ].b.t.i.G - - b.b.@ d !. . ",
+" .}.t - m V b - 8 k b A V t 8 8 d k 9 d !. . ",
+" .}.d @ - - @ @ - @ @ - @ - - - @ - @ - !.+. ",
+" +.}.8.8.8.8.8.8.2.8.2.2.2.8.2.8.8.i.i.8.}.+. ",
+" ' 1.n.D.D.D.D.D.D.D.D.D.D.D.D.D.D.D.D.D.n.` ",
+" ",
+" ",
+" ",
+" ",
+" "
+};
--- /dev/null
+/* XPM */
+static char *start[] = {
+/* columns rows colors chars-per-pixel */
+"24 24 256 2 ",
+" c None",
+". c #FFFF9C",
+"X c #FFFF99",
+"o c #FFFF97",
+"O c #FFFF96",
+"+ c #FFFF94",
+"@ c #FFFF93",
+"# c #FFFF92",
+"$ c #FFFF91",
+"% c #FFFF90",
+"& c #FFFF8F",
+"* c #FFFF8E",
+"= c #FFFF8D",
+"- c #FFFF8C",
+"; c #FFFF8B",
+": c #FFFE8F",
+"> c #FFFD90",
+", c #FFFC90",
+"< c #FFFA92",
+"1 c #FBFB89",
+"2 c #F9F9F9",
+"3 c #F9F7F8",
+"4 c #F8F8F8",
+"5 c #F8F888",
+"6 c #F7F7F8",
+"7 c #F7F789",
+"8 c #F7F788",
+"9 c #F7F6F6",
+"0 c #F5F5F4",
+"q c #F5F586",
+"w c #F5F28B",
+"e c #F4F4F4",
+"r c #F3F38A",
+"t c #F3ED8B",
+"y c gray95",
+"u c #F2F1F2",
+"i c #F1F1F2",
+"p c #F1F1F1",
+"a c #F1F0F0",
+"s c #F0F083",
+"d c #F0EEEF",
+"f c #EFEF83",
+"g c #EFEEED",
+"h c #EFEDED",
+"j c #EFEC8B",
+"k c #EFEB8B",
+"l c #EEEE87",
+"z c #EEEE81",
+"x c #EDED82",
+"c c #EDEBEB",
+"v c #ECECED",
+"b c #ECE9EA",
+"n c gray92",
+"m c #EBEB81",
+"M c #EBE9EA",
+"N c #EBE9E9",
+"B c #EAEA80",
+"V c #EAE687",
+"C c #EAE589",
+"Z c #E9EA80",
+"A c #E9E9E9",
+"S c #E8E9EA",
+"D c #E7E5E6",
+"F c #E6E77E",
+"G c #E6E57E",
+"H c #E5E57D",
+"J c #E1E17B",
+"K c #E1DFE0",
+"L c #DFDFE0",
+"P c #DFDF81",
+"I c #DFDF7A",
+"U c #DDDD79",
+"Y c gainsboro",
+"T c #DCDA7D",
+"R c #DBDCDC",
+"E c #DAD385",
+"W c #D9D47E",
+"Q c #D9D282",
+"! c #D8D975",
+"~ c #D7D5D6",
+"^ c #D7D581",
+"/ c #D6D675",
+"( c #D5D5D6",
+") c #D5D2D2",
+"_ c #D4D474",
+"` c #D4CF7C",
+"' c #D4CB81",
+"] c #D3D374",
+"[ c #D3D2D2",
+"{ c #D2D273",
+"} c #D2CE7E",
+"| c #CFCD76",
+" . c #CECC72",
+".. c #CCC97B",
+"X. c #C7C470",
+"o. c #C7C07C",
+"O. c #C7C077",
+"+. c #C6C66C",
+"@. c #BFBCBF",
+"#. c #BFBC6C",
+"$. c #BEB676",
+"%. c #BCB9BC",
+"&. c #B9B475",
+"*. c #B7B865",
+"=. c #B6B6B7",
+"-. c #B3AF6E",
+";. c #B2AEB1",
+":. c #B2AD71",
+">. c #B2AC6E",
+",. c #B1ACAD",
+"<. c #B0ADB0",
+"1. c #AFADB1",
+"2. c #AFA9AC",
+"3. c #AEA96B",
+"4. c #ADABAB",
+"5. c #ADA96B",
+"6. c #ABAB5F",
+"7. c #ABAB5D",
+"8. c #A8A166",
+"9. c #A7A266",
+"0. c #A6A65B",
+"q. c #A5A55B",
+"w. c #A4A4A7",
+"e. c #A4A165",
+"r. c #A49F6E",
+"t. c #A3A165",
+"y. c #A3A0A2",
+"u. c #A1A057",
+"i. c #A09C65",
+"p. c #9F9D9F",
+"a. c #9F9C65",
+"s. c #979753",
+"d. c #95954F",
+"f. c #938E64",
+"g. c #938C61",
+"h. c #938B67",
+"j. c #908A66",
+"k. c #90898A",
+"l. c #8F8F94",
+"z. c #8F8A64",
+"x. c #8E865F",
+"c. c #8B898D",
+"v. c #88815F",
+"b. c #878889",
+"n. c #878284",
+"m. c #858488",
+"M. c #848285",
+"N. c #828247",
+"B. c #827F80",
+"V. c #817A5B",
+"C. c #808083",
+"Z. c #7F7A7E",
+"A. c #7B775E",
+"S. c #79797A",
+"D. c #79777A",
+"F. c #78785D",
+"G. c #787846",
+"H. c #777172",
+"J. c #756F5B",
+"K. c #736D70",
+"L. c #717071",
+"P. c #706C6F",
+"I. c #6F703C",
+"U. c #6F6B6C",
+"Y. c #6D6C6B",
+"T. c #6D6B6D",
+"R. c #6D6B59",
+"E. c #6D6566",
+"W. c #6B6869",
+"Q. c #6A6869",
+"!. c #6A6566",
+"~. c #6A6362",
+"^. c #69696A",
+"/. c #696463",
+"(. c #686365",
+"). c #676669",
+"_. c #676465",
+"`. c #676256",
+"'. c #666165",
+"]. c #656465",
+"[. c #646054",
+"{. c #645D53",
+"}. c #635E52",
+"|. c #625A4C",
+" X c #615C4E",
+".X c #605C5F",
+"XX c #5F5950",
+"oX c #5E5B54",
+"OX c #5E5B51",
+"+X c #5D5C60",
+"@X c #5C5D31",
+"#X c #5C5A53",
+"$X c #5C5A50",
+"%X c #5C5A4D",
+"&X c #5C594A",
+"*X c #5C5651",
+"=X c #5B5C60",
+"-X c #595A2F",
+";X c #575259",
+":X c #56504B",
+">X c #55552F",
+",X c #55514C",
+"<X c #545259",
+"1X c #53534B",
+"2X c #534F4B",
+"3X c #50502E",
+"4X c #50502D",
+"5X c #50502C",
+"6X c #4E4E2B",
+"7X c #4D4A4C",
+"8X c #4B4749",
+"9X c #4A4A29",
+"0X c #494928",
+"qX c #484828",
+"wX c #484827",
+"eX c #484727",
+"rX c #474727",
+"tX c #474725",
+"yX c #47454B",
+"uX c #34341D",
+"iX c #2F2F1A",
+"pX c #242414",
+"aX c black",
+"sX c black",
+"dX c black",
+"fX c black",
+"gX c black",
+"hX c black",
+"jX c black",
+"kX c black",
+"lX c black",
+"zX c black",
+"xX c black",
+"cX c black",
+"vX c black",
+"bX c black",
+"nX c black",
+"mX c black",
+"MX c black",
+"NX c black",
+"BX c black",
+"VX c black",
+"CX c black",
+"ZX c black",
+"AX c black",
+"SX c black",
+"DX c black",
+"FX c black",
+"GX c black",
+"HX c black",
+"JX c black",
+"KX c black",
+"LX c black",
+"PX c black",
+"IX c black",
+"UX c black",
+/* pixels */
+" ",
+" ",
+" ",
+" ",
+" 6 g L K g 3 ",
+" 9 @.l.H.U._._.).H.c.@.9 ",
+" =.U.XXR.a.i.3.3.9.a.J.XX).,. ",
+" d n.yXF.` t o o o o & o o ^ z.XXB.g ",
+" 9 m.%Xr./ F & & ! f ! q & f F I o.|.B.g ",
+" ,.7Xf.#.@X>X0./ >XpXwX6.q iX6X@XX.:.:Xw. ",
+" 9 K.:XE eXF . 0.f o 6XF o I >X. f rXj {.).g ",
+" Y .X`.V ! >X6X/ o & >X! o F pX6XrX+.. A.*X~ ",
+" Y +X`.C / f 7 6X! o 6XF & F rXP uXq o F.;X~ ",
+" 9 U.:XE s.I.G.N.f o rX! o ! 6Xo s.d.j {._.g ",
+" 2.8Xf.o *.6.& & & / q & 7 / & & | $.2Xp. ",
+" 9 Z.%X-.o o & & & o & & & o & & ` %XZ.g ",
+" g B.XXV.` 7 & & & & & & & W f.XXD.D ",
+" 9 2.E.*Xx.9.-.X...-.8.f.XX.Xw.9 ",
+" g 1.m.U.E.E.E.E.U.n.1.g ",
+" g L ~ ~ Y d ",
+" ",
+" ",
+" ",
+" "
+};
--- /dev/null
+/* XPM */
+static char *start_procedure[] = {
+/* columns rows colors chars-per-pixel */
+"24 24 256 2 ",
+" c None",
+". c #FFFF92",
+"X c #FFFF91",
+"o c #FFFF90",
+"O c #FFFF8F",
+"+ c #FFFF8E",
+"@ c #FFFF8D",
+"# c #FFFF8C",
+"$ c #FFFF8B",
+"% c #FFFF8A",
+"& c #FFFF89",
+"* c #FFFC8C",
+"= c #FFFC8A",
+"- c #FFFB8C",
+"; c #FFFB8A",
+": c #FFFB89",
+"> c #FFFA8B",
+", c #FFFA8A",
+"< c #FFFA89",
+"1 c #FFF98B",
+"2 c #FFF98A",
+"3 c #FFF989",
+"4 c #FFF988",
+"5 c #FFF987",
+"6 c #FFF88D",
+"7 c #FFF88A",
+"8 c #FFF889",
+"9 c #FFF888",
+"0 c #FFF787",
+"q c #F9F78C",
+"w c #F8F78A",
+"e c #F8F787",
+"r c #F8F487",
+"t c #F2F081",
+"y c #F2EF84",
+"u c #F2EF83",
+"i c #E0DD7F",
+"p c #E0DA80",
+"a c #E0DA7F",
+"s c #DFDD7F",
+"d c #DCD482",
+"f c #DBDCDC",
+"g c #DBD77E",
+"h c #DBD47E",
+"j c #D7D7D7",
+"k c #D7D4D4",
+"l c #D6D4D4",
+"z c #D6D3D4",
+"x c #D4D3D4",
+"c c #D4D3D3",
+"v c #D4D27C",
+"b c #D4D27B",
+"n c #D4D1D2",
+"m c #D4D17D",
+"M c #D4D17C",
+"N c #D4CF7C",
+"B c #D4CF7A",
+"V c #D4CE7C",
+"C c #D4CD7C",
+"Z c #D4CD7B",
+"A c #D4CD78",
+"S c #D4CC78",
+"D c #D4CB79",
+"F c LightGray",
+"G c #D3CF7C",
+"H c #D3CD7D",
+"J c #D3CD79",
+"K c #D3CB7A",
+"L c #D2D1D2",
+"P c #D2D07B",
+"I c #D2D07A",
+"U c #D2D079",
+"Y c #D2CF7B",
+"T c #D2CF7A",
+"R c #D2CF79",
+"E c #D2CD7A",
+"W c #D2CC7D",
+"Q c #D2CB7B",
+"! c #D2CB7A",
+"~ c #AEAEAE",
+"^ c #AEADAD",
+"/ c #AEACAC",
+"( c #AEABAC",
+") c #A8A5A6",
+"_ c #A8A4A5",
+"` c #A7A6A6",
+"' c #848181",
+"] c #817E4F",
+"[ c #817B50",
+"{ c #817A4F",
+"} c #807D7C",
+"| c #7E7C50",
+" . c #7E7A50",
+".. c #7E7A4E",
+"X. c #7E784F",
+"o. c #7E784E",
+"O. c #7D7656",
+"+. c #7D7455",
+"@. c #7D7353",
+"#. c #7C754E",
+"$. c #797776",
+"%. c #787575",
+"&. c #787574",
+"*. c #77777D",
+"=. c #77757A",
+"-. c #767379",
+";. c #767378",
+":. c #757379",
+">. c #74757C",
+",. c #74757B",
+"<. c #74737A",
+"1. c #73737A",
+"2. c #727049",
+"3. c #726F4D",
+"4. c #716E4B",
+"5. c #706D6E",
+"6. c #706D6C",
+"7. c #70684D",
+"8. c #6F6E76",
+"9. c #6F6B76",
+"0. c #6C6A6F",
+"q. c #6C696F",
+"w. c #6C686D",
+"e. c #6B676D",
+"r. c #6A676D",
+"t. c #696970",
+"y. c #69686F",
+"u. c #69686E",
+"i. c #69666D",
+"p. c #68666D",
+"a. c #5D5D41",
+"s. c #5D5C40",
+"d. c #5C5C3F",
+"f. c #5B5B3F",
+"g. c #5B5A3E",
+"h. c #5B593C",
+"j. c #5B583D",
+"k. c #5B583C",
+"l. c #5A5A3E",
+"z. c #5A5943",
+"x. c #59593D",
+"c. c #59563B",
+"v. c #585640",
+"b. c #57533F",
+"n. c #55563F",
+"m. c #55553F",
+"M. c #555355",
+"N. c #55533E",
+"B. c #555148",
+"V. c #53513D",
+"C. c #535038",
+"Z. c #534E4B",
+"A. c #52513C",
+"S. c #525039",
+"D. c #4D4932",
+"F. c #484748",
+"G. c #474344",
+"H. c #47413F",
+"J. c #464448",
+"K. c #454341",
+"L. c #44423F",
+"P. c #444148",
+"I. c #424146",
+"U. c #413D33",
+"Y. c #403C3C",
+"T. c #3E404B",
+"R. c #3E3D4B",
+"E. c #3E3D4A",
+"W. c #3E3C4B",
+"Q. c #3E3C4A",
+"!. c #3E3B4B",
+"~. c #3E3B4A",
+"^. c #3E3A4B",
+"/. c #3E3A4A",
+"(. c #3D3F49",
+"). c #3D3D49",
+"_. c #3D3C4B",
+"`. c #3D3C4A",
+"'. c #3D3C49",
+"]. c #3D3B4A",
+"[. c #3D3B49",
+"{. c #3C3A48",
+"}. c #3B3931",
+"|. c #39393C",
+" X c #34312D",
+".X c #342F2F",
+"XX c #2E2B29",
+"oX c #2D2B30",
+"OX c #27262A",
+"+X c #27252A",
+"@X c #272529",
+"#X c #272327",
+"$X c #272226",
+"%X c #272126",
+"&X c #26262A",
+"*X c #262429",
+"=X c #262228",
+"-X c #262227",
+";X c #262224",
+":X c #262125",
+">X c #252127",
+",X c #252123",
+"<X c #231E21",
+"1X c black",
+"2X c black",
+"3X c black",
+"4X c black",
+"5X c black",
+"6X c black",
+"7X c black",
+"8X c black",
+"9X c black",
+"0X c black",
+"qX c black",
+"wX c black",
+"eX c black",
+"rX c black",
+"tX c black",
+"yX c black",
+"uX c black",
+"iX c black",
+"pX c black",
+"aX c black",
+"sX c black",
+"dX c black",
+"fX c black",
+"gX c black",
+"hX c black",
+"jX c black",
+"kX c black",
+"lX c black",
+"zX c black",
+"xX c black",
+"cX c black",
+"vX c black",
+"bX c black",
+"nX c black",
+"mX c black",
+"MX c black",
+"NX c black",
+"BX c black",
+"VX c black",
+"CX c black",
+"ZX c black",
+"AX c black",
+"SX c black",
+"DX c black",
+"FX c black",
+"GX c black",
+"HX c black",
+"JX c black",
+"KX c black",
+"LX c black",
+"PX c black",
+"IX c black",
+"UX c black",
+/* pixels */
+" ",
+" ",
+" ",
+" ",
+" ",
+" j $.*.*.' *.*.*.8.8.*.*.*.} *.*.$.j ",
+" j H.OXD.a.J.b.d.a.d.d.a.d.b.XXb.D.#XG.j ",
+" j H.U.O.q p R.g . O O . O . g R.s q O.G.Z.j ",
+" ) #X3.y O N R.N O O 5 O 0 O N |.N . y 3.XX` ",
+" ~ #X] O O N R.N O O 5 q O O N R.N O O ] #X~ ",
+" ~ OX| 5 O N R.N O 0 O 0 O O N R.N O O | #X~ ",
+" ~ <X..O 5 N |.N O O 5 5 O O v |.N O 5 #.OX~ ",
+" ~ XX| O O N R.N O 0 O O 0 O N R.N O O ..#X~ ",
+" ~ OX#.5 O N R.N O 5 q 0 O O N R.N O O ..OX~ ",
+" ~ OX] O O N R.N O O 0 O 0 O v R.N O O ] OX~ ",
+" ) #X3.t O N |.N O 0 5 q 0 O N |.N O y 3.<X) ",
+" j H.}.O.0 s R.d O O O O O O g R.p q #.G.M.j ",
+" j |. Xb.b.|.b.d.d.d.d.d.c.b.G.v.D..XZ.f ",
+" j 5.0.e.$.0.e.e.e.e.e.e.0.$.0.e.5.j ",
+" ",
+" ",
+" ",
+" ",
+" "
+};
--- /dev/null
+/* XPM */
+static char *state[] = {
+/* columns rows colors chars-per-pixel */
+"24 24 256 2 ",
+" c None",
+". c #FFFF90",
+"X c #FFFF8F",
+"o c #FFFF8E",
+"O c #FFFF8D",
+"+ c #FFFF8C",
+"@ c #FFFF8B",
+"# c #FFFF8A",
+"$ c #FFFF89",
+"% c #FFFE8D",
+"& c #FFFD8B",
+"* c #FFFD8A",
+"= c #FFFC8E",
+"- c #FFFC8C",
+"; c #FFFC8A",
+": c #FFFC89",
+"> c #FFFB8D",
+", c #FFFB8C",
+"< c #FFFB8B",
+"1 c #FFFB8A",
+"2 c #FFFB89",
+"3 c #FFFA8C",
+"4 c #FFFA8B",
+"5 c #FFFA8A",
+"6 c #FFFA89",
+"7 c #FFF98B",
+"8 c #FFF98A",
+"9 c #FFF989",
+"0 c #FFF988",
+"q c #FFF88C",
+"w c #FFF88B",
+"e c #FFF88A",
+"r c #FFF889",
+"t c #FFF888",
+"y c #FFF887",
+"u c #FFF886",
+"i c #FFF78B",
+"p c #FFF78A",
+"a c #FFF789",
+"s c #FFF788",
+"d c #FFF787",
+"f c #FFF786",
+"g c #FFF68B",
+"h c #FFF68A",
+"j c #FFF689",
+"k c #FFF688",
+"l c #F3F3F4",
+"z c #F3F2F3",
+"x c #F3EE88",
+"c c #F2F2F3",
+"v c #F2F1F1",
+"b c #F2F186",
+"n c #F2F184",
+"m c #F2F183",
+"M c #F2F084",
+"N c #F2EF84",
+"B c #F2EF80",
+"V c #D7D6D6",
+"C c #D0CFCE",
+"Z c gray81",
+"A c #CECCCD",
+"S c gray76",
+"D c #C2BFC0",
+"F c #C2BFBF",
+"G c #B7B7B7",
+"H c #B7B3B3",
+"J c #B4B4B5",
+"K c #B4B1B0",
+"L c #AEAEAE",
+"P c #AEACAC",
+"I c #AEABAC",
+"U c #A9A9A9",
+"Y c #A9A7A7",
+"T c #A9A6A6",
+"R c #A9A5A6",
+"E c #827E51",
+"W c #827C51",
+"Q c #827A51",
+"! c #827A50",
+"~ c #7E7C50",
+"^ c #7E7A50",
+"/ c #7E7A4E",
+"( c #7E7850",
+") c #7E784F",
+"_ c #7B7653",
+"` c #7B7454",
+"' c #7A734B",
+"] c #7A7253",
+"[ c #78757D",
+"{ c #75747C",
+"} c #757279",
+"| c #757259",
+" . c #74747C",
+".. c #74747B",
+"X. c #747077",
+"o. c #746F76",
+"O. c #73747B",
+"+. c #727071",
+"@. c #726F67",
+"#. c #716C53",
+"$. c #6F6E76",
+"%. c #6F6C49",
+"&. c #6F6B76",
+"*. c #6E6C46",
+"=. c #6D6B71",
+"-. c #6D6A71",
+";. c #6D6A70",
+":. c #6D6A47",
+">. c #6D674A",
+",. c #6C6C72",
+"<. c #6A666E",
+"1. c #6A654B",
+"2. c #696970",
+"3. c #69686F",
+"4. c #69666D",
+"5. c #69656C",
+"6. c #68666D",
+"7. c #636065",
+"8. c #626360",
+"9. c #626347",
+"0. c #625D42",
+"q. c #615F5D",
+"w. c #615D62",
+"e. c #615B40",
+"r. c #5F5E43",
+"t. c #5D5D42",
+"y. c #5D5D40",
+"u. c #5D5C40",
+"i. c #5D5C3F",
+"p. c #5D5B41",
+"a. c #5C5C3F",
+"s. c #5B5A3E",
+"d. c #5B593E",
+"f. c #5A5653",
+"g. c #5A553A",
+"h. c #59563A",
+"j. c #544F35",
+"k. c #4E4B4B",
+"l. c #4E4A35",
+"z. c #4D4845",
+"x. c #4C4A36",
+"c. c #48412F",
+"v. c #474243",
+"b. c #413E39",
+"n. c #403E3C",
+"m. c #403D3F",
+"M. c #403D3C",
+"N. c #403C3C",
+"B. c #3A372C",
+"V. c #373436",
+"C. c #373336",
+"Z. c #353135",
+"A. c #34322A",
+"S. c #323236",
+"D. c #322D32",
+"F. c #27262A",
+"G. c #272529",
+"H. c #272226",
+"J. c #272126",
+"K. c #232125",
+"L. c #231F24",
+"P. c #211C22",
+"I. c black",
+"U. c black",
+"Y. c black",
+"T. c black",
+"R. c black",
+"E. c black",
+"W. c black",
+"Q. c black",
+"!. c black",
+"~. c black",
+"^. c black",
+"/. c black",
+"(. c black",
+"). c black",
+"_. c black",
+"`. c black",
+"'. c black",
+"]. c black",
+"[. c black",
+"{. c black",
+"}. c black",
+"|. c black",
+" X c black",
+".X c black",
+"XX c black",
+"oX c black",
+"OX c black",
+"+X c black",
+"@X c black",
+"#X c black",
+"$X c black",
+"%X c black",
+"&X c black",
+"*X c black",
+"=X c black",
+"-X c black",
+";X c black",
+":X c black",
+">X c black",
+",X c black",
+"<X c black",
+"1X c black",
+"2X c black",
+"3X c black",
+"4X c black",
+"5X c black",
+"6X c black",
+"7X c black",
+"8X c black",
+"9X c black",
+"0X c black",
+"qX c black",
+"wX c black",
+"eX c black",
+"rX c black",
+"tX c black",
+"yX c black",
+"uX c black",
+"iX c black",
+"pX c black",
+"aX c black",
+"sX c black",
+"dX c black",
+"fX c black",
+"gX c black",
+"hX c black",
+"jX c black",
+"kX c black",
+"lX c black",
+"zX c black",
+"xX c black",
+"cX c black",
+"vX c black",
+"bX c black",
+"nX c black",
+"mX c black",
+"MX c black",
+"NX c black",
+"BX c black",
+"VX c black",
+"CX c black",
+"ZX c black",
+"AX c black",
+"SX c black",
+"DX c black",
+"FX c black",
+"GX c black",
+"HX c black",
+"JX c black",
+"KX c black",
+"LX c black",
+"PX c black",
+"IX c black",
+"UX c black",
+/* pixels */
+" ",
+" ",
+" ",
+" ",
+" ",
+" l G $.{ [ { { { $.$.{ o.o.{ X.$.G l ",
+" C z.V.l.9.| 0.i.r.i.i.r.i.i.r.r.l.A.k.Z ",
+" 7.B._ b X X X X X X . X X X . . N _ b.@. ",
+" S V.*.N X d X y d X X y i d d X y X b %.b.D ",
+" Y L.E X d d X d X d d X X y X i i X X E L.Y ",
+" L F.~ y i d y X d X X i y X y X d d X _ F.L ",
+" L H./ X d i X d X y d y X i d X d X y ' F.L ",
+" L F.~ X d d y i y X X X i X y y i y X / H.L ",
+" L F./ y y X X d X d y X y X i X d i X / F.L ",
+" L L.E X d d X i d X i y d X y X y y X E H.Y ",
+" F V.*.N X d y d X d X y i d X y d X N >.V.S ",
+" q.A._ N X X X X X X X X X X X . N ' b.o. ",
+" Z v.b.j.r.>.i.g.i.g.i.i.g.i.#.r.c.b.f.V ",
+" l G w.<.$.$.3.<.3.<.<.<.<.$.$.w.G l ",
+" ",
+" ",
+" ",
+" ",
+" "
+};
--- /dev/null
+/* XPM */
+static char *stop[] = {
+/* columns rows colors chars-per-pixel */
+"24 24 256 2 ",
+" c None",
+". c #FFFDFD",
+"X c #FFF4F4",
+"o c #FFEFEF",
+"O c #FFE7E7",
+"+ c #FFE4E4",
+"@ c #FFDADA",
+"# c #FFD3D3",
+"$ c #FFCBCB",
+"% c #FFCACA",
+"& c #FFC9C9",
+"* c #FFC6C6",
+"= c #FFC5C5",
+"- c #FFC3C3",
+"; c #FFBFBF",
+": c #FFB9B9",
+"> c #FFAEAE",
+", c #FF9A9A",
+"< c #FF9999",
+"1 c #FF9898",
+"2 c #FF9191",
+"3 c #FF8A8A",
+"4 c #FF3E3E",
+"5 c #FF3636",
+"6 c #FF2222",
+"7 c #FF1F1F",
+"8 c #FF1717",
+"9 c #FF1616",
+"0 c #FF1313",
+"q c #FF1010",
+"w c #FF0E0E",
+"e c #FF0D0D",
+"r c #FF0808",
+"t c #FF0404",
+"y c #FF0303",
+"u c #FF0202",
+"i c red",
+"p c #A0A0A0",
+"a c #A00000",
+"s c #809090",
+"d c #808181",
+"f c #808080",
+"g c gray47",
+"h c #782424",
+"j c gray25",
+"k c #400000",
+"l c black",
+"z c black",
+"x c black",
+"c c black",
+"v c black",
+"b c black",
+"n c black",
+"m c black",
+"M c black",
+"N c black",
+"B c black",
+"V c black",
+"C c black",
+"Z c black",
+"A c black",
+"S c black",
+"D c black",
+"F c black",
+"G c black",
+"H c black",
+"J c black",
+"K c black",
+"L c black",
+"P c black",
+"I c black",
+"U c black",
+"Y c black",
+"T c black",
+"R c black",
+"E c black",
+"W c black",
+"Q c black",
+"! c black",
+"~ c black",
+"^ c black",
+"/ c black",
+"( c black",
+") c black",
+"_ c black",
+"` c black",
+"' c black",
+"] c black",
+"[ c black",
+"{ c black",
+"} c black",
+"| c black",
+" . c black",
+".. c black",
+"X. c black",
+"o. c black",
+"O. c black",
+"+. c black",
+"@. c black",
+"#. c black",
+"$. c black",
+"%. c black",
+"&. c black",
+"*. c black",
+"=. c black",
+"-. c black",
+";. c black",
+":. c black",
+">. c black",
+",. c black",
+"<. c black",
+"1. c black",
+"2. c black",
+"3. c black",
+"4. c black",
+"5. c black",
+"6. c black",
+"7. c black",
+"8. c black",
+"9. c black",
+"0. c black",
+"q. c black",
+"w. c black",
+"e. c black",
+"r. c black",
+"t. c black",
+"y. c black",
+"u. c black",
+"i. c black",
+"p. c black",
+"a. c black",
+"s. c black",
+"d. c black",
+"f. c black",
+"g. c black",
+"h. c black",
+"j. c black",
+"k. c black",
+"l. c black",
+"z. c black",
+"x. c black",
+"c. c black",
+"v. c black",
+"b. c black",
+"n. c black",
+"m. c black",
+"M. c black",
+"N. c black",
+"B. c black",
+"V. c black",
+"C. c black",
+"Z. c black",
+"A. c black",
+"S. c black",
+"D. c black",
+"F. c black",
+"G. c black",
+"H. c black",
+"J. c black",
+"K. c black",
+"L. c black",
+"P. c black",
+"I. c black",
+"U. c black",
+"Y. c black",
+"T. c black",
+"R. c black",
+"E. c black",
+"W. c black",
+"Q. c black",
+"!. c black",
+"~. c black",
+"^. c black",
+"/. c black",
+"(. c black",
+"). c black",
+"_. c black",
+"`. c black",
+"'. c black",
+"]. c black",
+"[. c black",
+"{. c black",
+"}. c black",
+"|. c black",
+" X c black",
+".X c black",
+"XX c black",
+"oX c black",
+"OX c black",
+"+X c black",
+"@X c black",
+"#X c black",
+"$X c black",
+"%X c black",
+"&X c black",
+"*X c black",
+"=X c black",
+"-X c black",
+";X c black",
+":X c black",
+">X c black",
+",X c black",
+"<X c black",
+"1X c black",
+"2X c black",
+"3X c black",
+"4X c black",
+"5X c black",
+"6X c black",
+"7X c black",
+"8X c black",
+"9X c black",
+"0X c black",
+"qX c black",
+"wX c black",
+"eX c black",
+"rX c black",
+"tX c black",
+"yX c black",
+"uX c black",
+"iX c black",
+"pX c black",
+"aX c black",
+"sX c black",
+"dX c black",
+"fX c black",
+"gX c black",
+"hX c black",
+"jX c black",
+"kX c black",
+"lX c black",
+"zX c black",
+"xX c black",
+"cX c black",
+"vX c black",
+"bX c black",
+"nX c black",
+"mX c black",
+"MX c black",
+"NX c black",
+"BX c black",
+"VX c black",
+"CX c black",
+"ZX c black",
+"AX c black",
+"SX c black",
+"DX c black",
+"FX c black",
+"GX c black",
+"HX c black",
+"JX c black",
+"KX c black",
+"LX c black",
+"PX c black",
+"IX c black",
+"UX c black",
+/* pixels */
+" ",
+" ",
+" p j j p ",
+" g l l g ",
+" d l l d ",
+" d l l d ",
+" @ d l l d ; O ",
+" * 7 2 d l l d , t 5 O ",
+" $ w t t , d l l d , t t t 4 X ",
+" $ w t t t , d l l d , t t t 8 > ",
+" * 8 t t t > s l l s > t t t 8 * ",
+" * 8 t t w h l l h t t t 8 $ ",
+" * 8 t t a k k a t t 8 * ",
+" * 8 t t t t t t 8 * ",
+" # w t t t t 7 $ ",
+" # w t t t t 3 ",
+" * 8 t t t t t t , ",
+" * 8 t t t w t t t t , ",
+" * 8 t t t 2 o * 8 t t t , ",
+" * 8 t t t , * 8 t t t , ",
+" $ w t t t 2 $ 8 t t t 2 ",
+" $ w t t 2 * 8 t t , ",
+" * 7 2 * 7 3 ",
+" @ @ "
+};
--- /dev/null
+/* XPM */
+static char *symbol[] = {
+/* columns rows colors chars-per-pixel */
+"24 24 2 1 ",
+" c white",
+". c black",
+/* pixels */
+" ",
+" ",
+" ",
+" ",
+" ",
+" ",
+" ",
+" ",
+" ",
+" ",
+" ",
+" ",
+" ",
+" ",
+" ",
+" ",
+" ",
+" ",
+" ",
+" ",
+" ",
+" ",
+" ",
+" "
+};
--- /dev/null
+/* XPM */
+static char *symbol2[] = {
+/* columns rows colors chars-per-pixel */
+"20 20 64 1 ",
+" c white",
+". c black",
+"X c black",
+"o c black",
+"O c black",
+"+ c black",
+"@ c black",
+"# c black",
+"$ c black",
+"% c black",
+"& c black",
+"* c black",
+"= c black",
+"- c black",
+"; c black",
+": c black",
+"> c black",
+", c black",
+"< c black",
+"1 c black",
+"2 c black",
+"3 c black",
+"4 c black",
+"5 c black",
+"6 c black",
+"7 c black",
+"8 c black",
+"9 c black",
+"0 c black",
+"q c black",
+"w c black",
+"e c black",
+"r c black",
+"t c black",
+"y c black",
+"u c black",
+"i c black",
+"p c black",
+"a c black",
+"s c black",
+"d c black",
+"f c black",
+"g c black",
+"h c black",
+"j c black",
+"k c black",
+"l c black",
+"z c black",
+"x c black",
+"c c black",
+"v c black",
+"b c black",
+"n c black",
+"m c black",
+"M c black",
+"N c black",
+"B c black",
+"V c black",
+"C c black",
+"Z c black",
+"A c black",
+"S c black",
+"D c black",
+"F c black",
+/* pixels */
+" ",
+" ",
+" ",
+" ",
+" ",
+" ",
+" ",
+" ",
+" ",
+" ",
+" ",
+" ",
+" ",
+" ",
+" ",
+" ",
+" ",
+" ",
+" ",
+" "
+};
--- /dev/null
+/* XPM */
+static char *system[] = {
+/* columns rows colors chars-per-pixel */
+"24 24 256 2 ",
+" c None",
+". c #FFFF9F",
+"X c #FFFF9D",
+"o c #FFFF9C",
+"O c #FFFF9B",
+"+ c #FFFF9A",
+"@ c #FFFF99",
+"# c #FFFF98",
+"$ c #FFFF97",
+"% c #FFFF95",
+"& c #FFFF94",
+"* c #FFFF92",
+"= c #FFFF91",
+"- c #FFFD8C",
+"; c #FFFC8C",
+": c #FFFB8C",
+"> c #FFFA8C",
+", c #FFF98C",
+"< c #FFF88C",
+"1 c #FAF68A",
+"2 c #F7F288",
+"3 c #F6F487",
+"4 c #F4F286",
+"5 c #F4F185",
+"6 c #F4EF86",
+"7 c #F3F185",
+"8 c #F3F085",
+"9 c #F3ED85",
+"0 c #F3EC85",
+"q c #F2ED85",
+"w c #F1EF87",
+"e c #EFED85",
+"r c #EFEC85",
+"t c #EFEB85",
+"y c #EFE986",
+"u c #EFE985",
+"i c #EFE782",
+"p c #EEEC82",
+"a c #EEEB82",
+"s c #EEEA82",
+"d c #EEE882",
+"f c #EDEB80",
+"g c #E1E07C",
+"h c #E1DC7B",
+"j c #E1DB7B",
+"k c #E0E07B",
+"l c #E0DF7B",
+"z c #E0DD7B",
+"x c #E0DC7B",
+"c c #DFDB7B",
+"v c #D6D676",
+"b c #D6CE75",
+"n c #D5D67A",
+"m c #D5D4D2",
+"M c #D3CE72",
+"N c #D3CD72",
+"B c #D3CC72",
+"V c #D3CB72",
+"C c #D3C972",
+"Z c #D2CD72",
+"A c gray81",
+"S c #CBC56F",
+"D c #CBC36F",
+"F c #CAC873",
+"G c #C8C87D",
+"H c #C6C778",
+"J c #C6C573",
+"K c #C6C473",
+"L c #C6C373",
+"P c #C6C173",
+"I c #C4C1C1",
+"U c #C4C173",
+"Y c #C4C170",
+"T c #C4C16B",
+"R c #C1BEBE",
+"E c #BEBFBF",
+"W c #BDBDBE",
+"Q c #AFAA67",
+"! c #ADA565",
+"~ c #A6A362",
+"^ c #A6A262",
+"/ c #A6A062",
+"( c #807F53",
+") c #807D45",
+"_ c #7F7D45",
+"` c #7F794A",
+"' c #797A42",
+"] c #797842",
+"[ c #797742",
+"{ c #6A6833",
+"} c #696642",
+"| c #686731",
+" . c #686431",
+".. c #666230",
+"X. c #656130",
+"o. c #5E5E2D",
+"O. c #5D5A33",
+"+. c #575732",
+"@. c #534D49",
+"#. c #524B44",
+"$. c #514B47",
+"%. c #504A47",
+"&. c #4F4947",
+"*. c #4E4946",
+"=. c #4C4521",
+"-. c #4A4928",
+";. c #494827",
+":. c #494420",
+">. c #48442A",
+",. c #48431F",
+"<. c #46411E",
+"1. c #46401E",
+"2. c #463F41",
+"3. c #463F1E",
+"4. c #45401E",
+"5. c #433E37",
+"6. c #424037",
+"7. c #404136",
+"8. c #404036",
+"9. c #403F36",
+"0. c #403E36",
+"q. c #403E35",
+"w. c #393317",
+"e. c #393117",
+"r. c #383837",
+"t. c #38373B",
+"y. c #36343A",
+"u. c #343339",
+"i. c #333239",
+"p. c #333238",
+"a. c #33321C",
+"s. c #333128",
+"d. c #322C1E",
+"f. c #30281D",
+"g. c #2E261C",
+"h. c #2E251C",
+"j. c #2D261C",
+"k. c #2D251C",
+"l. c #2C261D",
+"z. c #221F13",
+"x. c #221E12",
+"c. c #221D0C",
+"v. c #211C11",
+"b. c #211C0B",
+"n. c #201B11",
+"m. c #181200",
+"M. c #130E09",
+"N. c #130D09",
+"B. c #120C09",
+"V. c #0E0806",
+"C. c black",
+"Z. c black",
+"A. c black",
+"S. c black",
+"D. c black",
+"F. c black",
+"G. c black",
+"H. c black",
+"J. c black",
+"K. c black",
+"L. c black",
+"P. c black",
+"I. c black",
+"U. c black",
+"Y. c black",
+"T. c black",
+"R. c black",
+"E. c black",
+"W. c black",
+"Q. c black",
+"!. c black",
+"~. c black",
+"^. c black",
+"/. c black",
+"(. c black",
+"). c black",
+"_. c black",
+"`. c black",
+"'. c black",
+"]. c black",
+"[. c black",
+"{. c black",
+"}. c black",
+"|. c black",
+" X c black",
+".X c black",
+"XX c black",
+"oX c black",
+"OX c black",
+"+X c black",
+"@X c black",
+"#X c black",
+"$X c black",
+"%X c black",
+"&X c black",
+"*X c black",
+"=X c black",
+"-X c black",
+";X c black",
+":X c black",
+">X c black",
+",X c black",
+"<X c black",
+"1X c black",
+"2X c black",
+"3X c black",
+"4X c black",
+"5X c black",
+"6X c black",
+"7X c black",
+"8X c black",
+"9X c black",
+"0X c black",
+"qX c black",
+"wX c black",
+"eX c black",
+"rX c black",
+"tX c black",
+"yX c black",
+"uX c black",
+"iX c black",
+"pX c black",
+"aX c black",
+"sX c black",
+"dX c black",
+"fX c black",
+"gX c black",
+"hX c black",
+"jX c black",
+"kX c black",
+"lX c black",
+"zX c black",
+"xX c black",
+"cX c black",
+"vX c black",
+"bX c black",
+"nX c black",
+"mX c black",
+"MX c black",
+"NX c black",
+"BX c black",
+"VX c black",
+"CX c black",
+"ZX c black",
+"AX c black",
+"SX c black",
+"DX c black",
+"FX c black",
+"GX c black",
+"HX c black",
+"JX c black",
+"KX c black",
+"LX c black",
+"PX c black",
+"IX c black",
+"UX c black",
+/* pixels */
+" ",
+" ",
+" ",
+" m R I I I I I I I I I I I I I I I I R m ",
+" #.m.c.c.c.c.c.c.c.c.c.c.c.c.c.c.c.c.m.#. ",
+" @.o.n v h g g g g g g g g g g h v n o.@. ",
+" &.{ . $ h c h h h h h h h h c h $ . { &. ",
+" #.| $ 3 =.z.z.z.z.z.z.z.z.z.z.;.6 $ | #. ",
+" &...$ 3 >.` T T T T T T T J O.a.3 $ ..#. ",
+" y.,.$ e g.Q . $ $ $ $ $ $ . _ M.3 $ ,.2. ",
+" y.<.$ e g.~ - - - - - - - $ _ V.6 $ <.y. ",
+" y.<.$ e g.~ $ - 1 - 1 1 - $ [ M.6 $ <.y. ",
+" y.<.$ g d.~ $ - - 1 - - 1 $ [ M.3 $ 3.y. ",
+" y.3.$ 6 g.~ - - 1 - - 1 - . _ V.6 $ <.y. ",
+" y.3.$ e g.! . $ $ $ $ $ $ . _ V.6 $ <.y. ",
+" y.<.$ g g.( J J J J J J T G +.z.3 $ 3.y. ",
+" y.3.$ 6 d.6.5.5.6.6.5.5.5.5.a.} 1 $ <.y. ",
+" y.,.. - h e e e e e e e e e 2 e $ . ,.y. ",
+" y.w.F F b b b b b b b b b b b b S F w.y. ",
+" r.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.r. ",
+" A E E E E E E E E E E E E E E E E E E A ",
+" ",
+" ",
+" "
+};
--- /dev/null
+/* XPM */
+static char *system_sdl[] = {
+/* columns rows colors chars-per-pixel */
+"24 24 256 2 ",
+" c None",
+". c #FFFF9F",
+"X c #FFFF9D",
+"o c #FFFF9C",
+"O c #FFFF9B",
+"+ c #FFFF9A",
+"@ c #FFFF99",
+"# c #FFFF98",
+"$ c #FFFF97",
+"% c #FFFF95",
+"& c #FFFF94",
+"* c #FFFF92",
+"= c #FFFF91",
+"- c #FFFD8C",
+"; c #FFFC8C",
+": c #FFFB8C",
+"> c #FFFA8C",
+", c #FFF98C",
+"< c #FFF88C",
+"1 c #FAF68A",
+"2 c #F7F288",
+"3 c #F6F487",
+"4 c #F4F286",
+"5 c #F4F185",
+"6 c #F4EF86",
+"7 c #F3F185",
+"8 c #F3F085",
+"9 c #F3ED85",
+"0 c #F3EC85",
+"q c #F2ED85",
+"w c #F1EF87",
+"e c #EFED85",
+"r c #EFEC85",
+"t c #EFEB85",
+"y c #EFE986",
+"u c #EFE985",
+"i c #EFE782",
+"p c #EEEC82",
+"a c #EEEB82",
+"s c #EEEA82",
+"d c #EEE882",
+"f c #EDEB80",
+"g c #E1E07C",
+"h c #E1DC7B",
+"j c #E1DB7B",
+"k c #E0E07B",
+"l c #E0DF7B",
+"z c #E0DD7B",
+"x c #E0DC7B",
+"c c #DFDB7B",
+"v c #D6D676",
+"b c #D6CE75",
+"n c #D5D67A",
+"m c #D5D4D2",
+"M c #D3CE72",
+"N c #D3CD72",
+"B c #D3CC72",
+"V c #D3CB72",
+"C c #D3C972",
+"Z c #D2CD72",
+"A c gray81",
+"S c #CBC56F",
+"D c #CBC36F",
+"F c #CAC873",
+"G c #C8C87D",
+"H c #C6C778",
+"J c #C6C573",
+"K c #C6C473",
+"L c #C6C373",
+"P c #C6C173",
+"I c #C4C1C1",
+"U c #C4C173",
+"Y c #C4C170",
+"T c #C4C16B",
+"R c #C1BEBE",
+"E c #BEBFBF",
+"W c #BDBDBE",
+"Q c #AFAA67",
+"! c #ADA565",
+"~ c #A6A362",
+"^ c #A6A262",
+"/ c #A6A062",
+"( c #807F53",
+") c #807D45",
+"_ c #7F7D45",
+"` c #7F794A",
+"' c #797A42",
+"] c #797842",
+"[ c #797742",
+"{ c #6A6833",
+"} c #696642",
+"| c #686731",
+" . c #686431",
+".. c #666230",
+"X. c #656130",
+"o. c #5E5E2D",
+"O. c #5D5A33",
+"+. c #575732",
+"@. c #534D49",
+"#. c #524B44",
+"$. c #514B47",
+"%. c #504A47",
+"&. c #4F4947",
+"*. c #4E4946",
+"=. c #4C4521",
+"-. c #4A4928",
+";. c #494827",
+":. c #494420",
+">. c #48442A",
+",. c #48431F",
+"<. c #46411E",
+"1. c #46401E",
+"2. c #463F41",
+"3. c #463F1E",
+"4. c #45401E",
+"5. c #433E37",
+"6. c #424037",
+"7. c #404136",
+"8. c #404036",
+"9. c #403F36",
+"0. c #403E36",
+"q. c #403E35",
+"w. c #393317",
+"e. c #393117",
+"r. c #383837",
+"t. c #38373B",
+"y. c #36343A",
+"u. c #343339",
+"i. c #333239",
+"p. c #333238",
+"a. c #33321C",
+"s. c #333128",
+"d. c #322C1E",
+"f. c #30281D",
+"g. c #2E261C",
+"h. c #2E251C",
+"j. c #2D261C",
+"k. c #2D251C",
+"l. c #2C261D",
+"z. c #221F13",
+"x. c #221E12",
+"c. c #221D0C",
+"v. c #211C11",
+"b. c #211C0B",
+"n. c #201B11",
+"m. c #181200",
+"M. c #130E09",
+"N. c #130D09",
+"B. c #120C09",
+"V. c #0E0806",
+"C. c black",
+"Z. c black",
+"A. c black",
+"S. c black",
+"D. c black",
+"F. c black",
+"G. c black",
+"H. c black",
+"J. c black",
+"K. c black",
+"L. c black",
+"P. c black",
+"I. c black",
+"U. c black",
+"Y. c black",
+"T. c black",
+"R. c black",
+"E. c black",
+"W. c black",
+"Q. c black",
+"!. c black",
+"~. c black",
+"^. c black",
+"/. c black",
+"(. c black",
+"). c black",
+"_. c black",
+"`. c black",
+"'. c black",
+"]. c black",
+"[. c black",
+"{. c black",
+"}. c black",
+"|. c black",
+" X c black",
+".X c black",
+"XX c black",
+"oX c black",
+"OX c black",
+"+X c black",
+"@X c black",
+"#X c black",
+"$X c black",
+"%X c black",
+"&X c black",
+"*X c black",
+"=X c black",
+"-X c black",
+";X c black",
+":X c black",
+">X c black",
+",X c black",
+"<X c black",
+"1X c black",
+"2X c black",
+"3X c black",
+"4X c black",
+"5X c black",
+"6X c black",
+"7X c black",
+"8X c black",
+"9X c black",
+"0X c black",
+"qX c black",
+"wX c black",
+"eX c black",
+"rX c black",
+"tX c black",
+"yX c black",
+"uX c black",
+"iX c black",
+"pX c black",
+"aX c black",
+"sX c black",
+"dX c black",
+"fX c black",
+"gX c black",
+"hX c black",
+"jX c black",
+"kX c black",
+"lX c black",
+"zX c black",
+"xX c black",
+"cX c black",
+"vX c black",
+"bX c black",
+"nX c black",
+"mX c black",
+"MX c black",
+"NX c black",
+"BX c black",
+"VX c black",
+"CX c black",
+"ZX c black",
+"AX c black",
+"SX c black",
+"DX c black",
+"FX c black",
+"GX c black",
+"HX c black",
+"JX c black",
+"KX c black",
+"LX c black",
+"PX c black",
+"IX c black",
+"UX c black",
+/* pixels */
+" ",
+" ",
+" ",
+" m R I I I I I I I I I I I I I I I I R m ",
+" #.m.c.c.c.c.c.c.c.c.c.c.c.c.c.c.c.c.m.#. ",
+" @.o.n v h g g g g g g g g g g h v n o.@. ",
+" &.{ . $ h c h h h h h h h h c h $ . { &. ",
+" #.| $ 3 =.z.z.z.z.z.z.z.z.z.z.;.6 $ | #. ",
+" &...$ 3 >.` T T T T T T T J O.a.3 $ ..#. ",
+" y.,.$ e g.Q . $ $ $ $ $ $ . _ M.3 $ ,.2. ",
+" y.<.$ e g.~ - - - - - - - $ _ V.6 $ <.y. ",
+" y.<.$ e g.~ $ - 1 - 1 1 - $ [ M.6 $ <.y. ",
+" y.<.$ g d.~ $ - - 1 - - 1 $ [ M.3 $ 3.y. ",
+" y.3.$ 6 g.~ - - 1 - - 1 - . _ V.6 $ <.y. ",
+" y.3.$ e g.! . $ $ $ $ $ $ . _ V.6 $ <.y. ",
+" y.<.$ g g.( J J J J J J T G +.z.3 $ 3.y. ",
+" y.3.$ 6 d.6.5.5.6.6.5.5.5.5.a.} 1 $ <.y. ",
+" y.,.. - h e e e e e e e e e 2 e $ . ,.y. ",
+" y.w.F F b b b b b b b b b b b b S F w.y. ",
+" r.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.r. ",
+" A E E E E E E E E E E E E E E E E E E A ",
+" ",
+" ",
+" "
+};
--- /dev/null
+/* XPM */
+static char *system_type[] = {
+/* columns rows colors chars-per-pixel */
+"24 24 256 2 ",
+" c None",
+". c #FDFDFE",
+"X c #F8F9F9",
+"o c gray97",
+"O c #F1F0F0",
+"+ c #F0EFEF",
+"@ c #EBE9E7",
+"# c #EAE8E6",
+"$ c #DEDBD9",
+"% c #DDDDDD",
+"& c #DDDBD8",
+"* c #D9D8D6",
+"= c #D6D4D3",
+"- c #D5D4D2",
+"; c #D5D3D1",
+": c gray83",
+"> c #D4D3D1",
+", c #D2D0CF",
+"< c #D1CFCD",
+"1 c gray81",
+"2 c #CCC9C7",
+"3 c #C8C6C4",
+"4 c #C8C5C3",
+"5 c #C4C2C0",
+"6 c #C3C3C3",
+"7 c #BABBBB",
+"8 c gray73",
+"9 c #B8B9BA",
+"0 c #B8B9B9",
+"q c #AAA8A6",
+"w c #928D89",
+"e c #8B8682",
+"r c #7C7C7C",
+"t c #767777",
+"y c #706B66",
+"u c #6F6964",
+"i c #6D6863",
+"p c #68625C",
+"a c gray39",
+"s c #626363",
+"d c #5C5650",
+"f c #535454",
+"g c #504A44",
+"h c #4F4741",
+"j c #4E4F4F",
+"k c #4E4741",
+"l c #4C443D",
+"z c #4B433D",
+"x c #4A423C",
+"c c #48403A",
+"v c #433F3B",
+"b c #3E3D3C",
+"n c #3D352E",
+"m c #3B3A39",
+"M c #3A3939",
+"N c #3A3938",
+"B c #393939",
+"V c #272727",
+"C c #251D15",
+"Z c #221911",
+"A c #1E150D",
+"S c #1D140C",
+"D c #191410",
+"F c #18130F",
+"G c #130F0B",
+"H c #101010",
+"J c #100600",
+"K c #0D0300",
+"L c #0B0100",
+"P c #040000",
+"I c black",
+"U c black",
+"Y c black",
+"T c black",
+"R c black",
+"E c black",
+"W c black",
+"Q c black",
+"! c black",
+"~ c black",
+"^ c black",
+"/ c black",
+"( c black",
+") c black",
+"_ c black",
+"` c black",
+"' c black",
+"] c black",
+"[ c black",
+"{ c black",
+"} c black",
+"| c black",
+" . c black",
+".. c black",
+"X. c black",
+"o. c black",
+"O. c black",
+"+. c black",
+"@. c black",
+"#. c black",
+"$. c black",
+"%. c black",
+"&. c black",
+"*. c black",
+"=. c black",
+"-. c black",
+";. c black",
+":. c black",
+">. c black",
+",. c black",
+"<. c black",
+"1. c black",
+"2. c black",
+"3. c black",
+"4. c black",
+"5. c black",
+"6. c black",
+"7. c black",
+"8. c black",
+"9. c black",
+"0. c black",
+"q. c black",
+"w. c black",
+"e. c black",
+"r. c black",
+"t. c black",
+"y. c black",
+"u. c black",
+"i. c black",
+"p. c black",
+"a. c black",
+"s. c black",
+"d. c black",
+"f. c black",
+"g. c black",
+"h. c black",
+"j. c black",
+"k. c black",
+"l. c black",
+"z. c black",
+"x. c black",
+"c. c black",
+"v. c black",
+"b. c black",
+"n. c black",
+"m. c black",
+"M. c black",
+"N. c black",
+"B. c black",
+"V. c black",
+"C. c black",
+"Z. c black",
+"A. c black",
+"S. c black",
+"D. c black",
+"F. c black",
+"G. c black",
+"H. c black",
+"J. c black",
+"K. c black",
+"L. c black",
+"P. c black",
+"I. c black",
+"U. c black",
+"Y. c black",
+"T. c black",
+"R. c black",
+"E. c black",
+"W. c black",
+"Q. c black",
+"!. c black",
+"~. c black",
+"^. c black",
+"/. c black",
+"(. c black",
+"). c black",
+"_. c black",
+"`. c black",
+"'. c black",
+"]. c black",
+"[. c black",
+"{. c black",
+"}. c black",
+"|. c black",
+" X c black",
+".X c black",
+"XX c black",
+"oX c black",
+"OX c black",
+"+X c black",
+"@X c black",
+"#X c black",
+"$X c black",
+"%X c black",
+"&X c black",
+"*X c black",
+"=X c black",
+"-X c black",
+";X c black",
+":X c black",
+">X c black",
+",X c black",
+"<X c black",
+"1X c black",
+"2X c black",
+"3X c black",
+"4X c black",
+"5X c black",
+"6X c black",
+"7X c black",
+"8X c black",
+"9X c black",
+"0X c black",
+"qX c black",
+"wX c black",
+"eX c black",
+"rX c black",
+"tX c black",
+"yX c black",
+"uX c black",
+"iX c black",
+"pX c black",
+"aX c black",
+"sX c black",
+"dX c black",
+"fX c black",
+"gX c black",
+"hX c black",
+"jX c black",
+"kX c black",
+"lX c black",
+"zX c black",
+"xX c black",
+"cX c black",
+"vX c black",
+"bX c black",
+"nX c black",
+"mX c black",
+"MX c black",
+"NX c black",
+"BX c black",
+"VX c black",
+"CX c black",
+"ZX c black",
+"AX c black",
+"SX c black",
+"DX c black",
+"FX c black",
+"GX c black",
+"HX c black",
+"JX c black",
+"KX c black",
+"LX c black",
+"PX c black",
+"IX c black",
+"UX c black",
+/* pixels */
+" ",
+" ",
+" ",
+" = 5 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 5 = ",
+" g P K K K K K K K K K K K K K K K K P g ",
+" h n 5 3 = = = = = = = = = = = = 5 3 n h ",
+" l h = = = = = = = = = = = * h l ",
+" l l + C K K K K K K K K K K C + l l ",
+" l l o A u 5 1 5 q q 3 2 5 u C + l l ",
+" l l + A w t f j a w A o v l ",
+" v d + A e 7 P = o r $ e A + d v ",
+" b u o A e 5 H V a e A + u b ",
+" b u + A e a V H 5 e A o u b ",
+" b u + A e $ r o = P 7 e A + u n ",
+" n u o A w a j f t w A + u b ",
+" b u + C u 5 2 5 q q 5 2 3 y A o u b ",
+" b u + C K K K K J J K K K K C + u n ",
+" b u = 1 < = < = < = 1 < < = u b ",
+" b p $ $ @ @ @ @ @ @ @ @ @ + @ @ $ $ p b ",
+" b G H A H A H A H A D G A G A H A H G b ",
+" 1 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 1 ",
+" ",
+" ",
+" "
+};
--- /dev/null
+/* XPM */
+static char *task[] = {
+/* columns rows colors chars-per-pixel */
+"24 24 256 2 ",
+" c None",
+". c #FFFFA7",
+"X c #FFFFA3",
+"o c #FFFF9B",
+"O c #FFFF99",
+"+ c #FFFF97",
+"@ c #FFFF96",
+"# c #FFFF95",
+"$ c #FFFF94",
+"% c #FFFF93",
+"& c #FFFF92",
+"* c #FFFF91",
+"= c #FFFF90",
+"- c #FFFF8F",
+"; c #FFFF8E",
+": c #FFFF8D",
+"> c #FFFF8C",
+", c #FFFE91",
+"< c #FFFD8C",
+"1 c #FFFC8B",
+"2 c #FFFC88",
+"3 c #FFFA8D",
+"4 c #FFF88B",
+"5 c #FFF889",
+"6 c #FEF68A",
+"7 c #FEF686",
+"8 c #FDFA8F",
+"9 c #FBF98D",
+"0 c #FBF788",
+"q c #FBF486",
+"w c #FAF288",
+"e c #F9F78B",
+"r c #F9F684",
+"t c #F8F58C",
+"y c #F8F288",
+"u c #F7F589",
+"i c #F7EF86",
+"p c #F4F189",
+"a c #F4EF86",
+"s c #F2EA81",
+"d c #F2EA7D",
+"f c #F1F294",
+"g c #F0F18D",
+"h c #F0EA82",
+"j c #F0E882",
+"k c #EFF08A",
+"l c #EFED82",
+"z c #EFEB81",
+"x c #EFEB80",
+"c c #EFEA81",
+"v c #EFE983",
+"b c #EFE87E",
+"n c #EFE781",
+"m c #EEE980",
+"M c #ECEA85",
+"N c #E7E37E",
+"B c #E7E37D",
+"V c #E3DC77",
+"C c #DFDF82",
+"Z c #DFDF80",
+"A c #DFDE80",
+"S c #DFDB79",
+"D c #D3CC72",
+"F c #D2CE72",
+"G c #CDCA70",
+"H c #CAC86F",
+"J c #CAC671",
+"K c #C9C46F",
+"L c #C3C06A",
+"P c #C3BD6A",
+"I c #C3BC6B",
+"U c #BCB867",
+"Y c #BAB866",
+"T c #BAB769",
+"R c #B8B565",
+"E c #B4B364",
+"W c #B1B160",
+"Q c #B0AD63",
+"! c #A8A55B",
+"~ c #A0A0A0",
+"^ c #9F9F9F",
+"/ c gray62",
+"( c #9D9D9D",
+") c #9A9852",
+"_ c #999753",
+"` c #959552",
+"' c #8E8A4E",
+"] c #8D8D4F",
+"[ c #8C8A4D",
+"{ c #8A8648",
+"} c #838247",
+"| c #7C7D46",
+" . c #7A7A7D",
+".. c #7A7A7C",
+"X. c #7A7540",
+"o. c #78797B",
+"O. c #78787B",
+"+. c #77774C",
+"@. c #767677",
+"#. c #757676",
+"$. c #747475",
+"%. c #73703D",
+"&. c #726E75",
+"*. c #6F703C",
+"=. c #6F6C73",
+"-. c #6D6E75",
+";. c #6D6D74",
+":. c #6D6B72",
+">. c #6D6A71",
+",. c #6C6B3B",
+"<. c #6B6B3D",
+"1. c #6B6838",
+"2. c #67656C",
+"3. c #5D5E34",
+"4. c #5B5A5B",
+"5. c #5B5932",
+"6. c #585530",
+"7. c #535252",
+"8. c #515035",
+"9. c #515033",
+"0. c #514F34",
+"q. c #514F33",
+"w. c #514F32",
+"e. c #514E34",
+"r. c #514E32",
+"t. c #514C32",
+"y. c #514C31",
+"u. c #514C30",
+"i. c #514B31",
+"p. c #514B30",
+"a. c #505030",
+"s. c #504F2A",
+"d. c #504E2D",
+"f. c #504E2B",
+"g. c #504D32",
+"h. c #484626",
+"j. c #474526",
+"k. c #434122",
+"l. c #434022",
+"z. c gray25",
+"x. c #404023",
+"c. c #404022",
+"v. c #403F40",
+"b. c #3D3D43",
+"n. c #3D3C22",
+"m. c #3D3B21",
+"M. c #3B3B1F",
+"N. c #3B3A1F",
+"B. c #3B3A1E",
+"V. c #3A3820",
+"C. c #3A3720",
+"Z. c #39381D",
+"A. c #37363D",
+"S. c #36373D",
+"D. c #36363D",
+"F. c #36363C",
+"G. c #36361A",
+"H. c #36353C",
+"J. c #35331B",
+"K. c #31311B",
+"L. c #312F1A",
+"P. c #30301B",
+"I. c #302E1A",
+"U. c #302E19",
+"Y. c #2F2F20",
+"T. c #2E2D18",
+"R. c #2D281A",
+"E. c #2B2B17",
+"W. c #2B2917",
+"Q. c #292518",
+"!. c #272716",
+"~. c #242414",
+"^. c #221F16",
+"/. c #212012",
+"(. c #201C14",
+"). c #1F1D15",
+"_. c #1F1B13",
+"`. c #1E1C14",
+"'. c #1D1E17",
+"]. c #1D1E11",
+"[. c #1D1D11",
+"{. c #1D1A14",
+"}. c #1C1D10",
+"|. c #101109",
+" X c #0F0F08",
+".X c #0D0D07",
+"XX c #090A06",
+"oX c #080800",
+"OX c #070804",
+"+X c #070704",
+"@X c #030000",
+"#X c #020100",
+"$X c #010000",
+"%X c black",
+"&X c black",
+"*X c black",
+"=X c black",
+"-X c black",
+";X c black",
+":X c black",
+">X c black",
+",X c black",
+"<X c black",
+"1X c black",
+"2X c black",
+"3X c black",
+"4X c black",
+"5X c black",
+"6X c black",
+"7X c black",
+"8X c black",
+"9X c black",
+"0X c black",
+"qX c black",
+"wX c black",
+"eX c black",
+"rX c black",
+"tX c black",
+"yX c black",
+"uX c black",
+"iX c black",
+"pX c black",
+"aX c black",
+"sX c black",
+"dX c black",
+"fX c black",
+"gX c black",
+"hX c black",
+"jX c black",
+"kX c black",
+"lX c black",
+"zX c black",
+"xX c black",
+"cX c black",
+"vX c black",
+"bX c black",
+"nX c black",
+"mX c black",
+"MX c black",
+"NX c black",
+"BX c black",
+"VX c black",
+"CX c black",
+"ZX c black",
+"AX c black",
+"SX c black",
+"DX c black",
+"FX c black",
+"GX c black",
+"HX c black",
+"JX c black",
+"KX c black",
+"LX c black",
+"PX c black",
+"IX c black",
+"UX c black",
+/* pixels */
+" ",
+" ",
+" ",
+" ",
+" ",
+" ^ z.2.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.&.4.^ ",
+" @.+XG.M.M.M.M.M.n.M.n.M.n.M.M.M.M.M.n.G.+X@. ",
+" @.+X7 + + + + - - + + + - - + + + + + - ). . ",
+" .+XP s.j.j.h.D o ! G.%.+ - U j.s.j.} i ).@. ",
+" .+XN S ).).S u k 6.).!.S i OX,.f E j.L Q. . ",
+" @.+Xl + E.G.+ + R +XE OXX.- +Xn.' - + 6 ). . ",
+" .+Xb + G.T.- + K +XU X} + ` +X+XT.) u ). . ",
+" .+Xb + T.T.+ - ` +X,.+X6.u o u ,.).+XT Q. . ",
+" .+Xb + E.E.+ b +XG.+.3.+XQ | P . H +XQ Y. . ",
+" @.+Xb + n.n.- l .X' . D XL ' !.s.n.,.l ^. . ",
+" .+Xn - d i 6 7 l i 6 7 l 6 - N S V 7 6 ). . ",
+" .+Xi + - - - - + - + - + - + - + - + - ).@. ",
+" @.+Xs.s.0.0.0.0.0.0.s.0.0.0.s.0.8.0.s.0.+X@. ",
+" ^ 7.b.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.b.~ ",
+" ",
+" ",
+" ",
+" ",
+" "
+};
--- /dev/null
+/* XPM */
+static char *text[] = {
+/* columns rows colors chars-per-pixel */
+"24 24 256 2 ",
+" c None",
+". c #FFFF9C",
+"X c #FFFF9A",
+"o c #FFFF97",
+"O c #FFFF96",
+"+ c #FFFF92",
+"@ c #FFFF91",
+"# c #FFFF90",
+"$ c #FFFF8E",
+"% c #FFFF8C",
+"& c #FCFC8B",
+"* c #F6F6F6",
+"= c #F4F4F4",
+"- c #F3F3F3",
+"; c #F3F38B",
+": c #F3F387",
+"> c gray95",
+", c #F2F2F1",
+"< c #F2F287",
+"1 c #F1F0F0",
+"2 c #F0F0EF",
+"3 c #F0EFEF",
+"4 c #DBDB7E",
+"5 c #D3D37B",
+"6 c #D0D07A",
+"7 c #CFCF7A",
+"8 c #CECECE",
+"9 c #B4B4B4",
+"0 c #B2B2B2",
+"q c #B2B2B1",
+"w c #9E9E65",
+"e c #9C9C65",
+"r c #9C9C63",
+"t c #949159",
+"y c #929295",
+"u c #8F8F91",
+"i c #8B864C",
+"p c #8B864A",
+"a c #8B8649",
+"s c #85855A",
+"d c #808080",
+"f c #797977",
+"g c #6B6C4E",
+"h c #67676A",
+"j c #66666D",
+"k c #666667",
+"l c #666649",
+"z c #65656D",
+"x c #656549",
+"c c #64646D",
+"v c #645E58",
+"b c #626248",
+"n c #504822",
+"m c #4F4F48",
+"M c #4F4722",
+"N c #4E4744",
+"B c #4B4344",
+"V c #4B4320",
+"C c #4A4243",
+"Z c #474746",
+"A c #454544",
+"S c #444444",
+"D c #43434A",
+"F c #42424C",
+"G c #42423B",
+"H c #3F3F48",
+"J c #39393A",
+"K c #393523",
+"L c #37373E",
+"P c #37373A",
+"I c #373737",
+"U c #373735",
+"Y c #343437",
+"T c #343434",
+"R c gray20",
+"E c #323238",
+"W c #2F2F37",
+"Q c #2F2A2E",
+"! c #2A210B",
+"~ c #291F0A",
+"^ c #201812",
+"/ c #1E1516",
+"( c #1E1515",
+") c #1E150F",
+"_ c #1D1414",
+"` c #1C110E",
+"' c black",
+"] c black",
+"[ c black",
+"{ c black",
+"} c black",
+"| c black",
+" . c black",
+".. c black",
+"X. c black",
+"o. c black",
+"O. c black",
+"+. c black",
+"@. c black",
+"#. c black",
+"$. c black",
+"%. c black",
+"&. c black",
+"*. c black",
+"=. c black",
+"-. c black",
+";. c black",
+":. c black",
+">. c black",
+",. c black",
+"<. c black",
+"1. c black",
+"2. c black",
+"3. c black",
+"4. c black",
+"5. c black",
+"6. c black",
+"7. c black",
+"8. c black",
+"9. c black",
+"0. c black",
+"q. c black",
+"w. c black",
+"e. c black",
+"r. c black",
+"t. c black",
+"y. c black",
+"u. c black",
+"i. c black",
+"p. c black",
+"a. c black",
+"s. c black",
+"d. c black",
+"f. c black",
+"g. c black",
+"h. c black",
+"j. c black",
+"k. c black",
+"l. c black",
+"z. c black",
+"x. c black",
+"c. c black",
+"v. c black",
+"b. c black",
+"n. c black",
+"m. c black",
+"M. c black",
+"N. c black",
+"B. c black",
+"V. c black",
+"C. c black",
+"Z. c black",
+"A. c black",
+"S. c black",
+"D. c black",
+"F. c black",
+"G. c black",
+"H. c black",
+"J. c black",
+"K. c black",
+"L. c black",
+"P. c black",
+"I. c black",
+"U. c black",
+"Y. c black",
+"T. c black",
+"R. c black",
+"E. c black",
+"W. c black",
+"Q. c black",
+"!. c black",
+"~. c black",
+"^. c black",
+"/. c black",
+"(. c black",
+"). c black",
+"_. c black",
+"`. c black",
+"'. c black",
+"]. c black",
+"[. c black",
+"{. c black",
+"}. c black",
+"|. c black",
+" X c black",
+".X c black",
+"XX c black",
+"oX c black",
+"OX c black",
+"+X c black",
+"@X c black",
+"#X c black",
+"$X c black",
+"%X c black",
+"&X c black",
+"*X c black",
+"=X c black",
+"-X c black",
+";X c black",
+":X c black",
+">X c black",
+",X c black",
+"<X c black",
+"1X c black",
+"2X c black",
+"3X c black",
+"4X c black",
+"5X c black",
+"6X c black",
+"7X c black",
+"8X c black",
+"9X c black",
+"0X c black",
+"qX c black",
+"wX c black",
+"eX c black",
+"rX c black",
+"tX c black",
+"yX c black",
+"uX c black",
+"iX c black",
+"pX c black",
+"aX c black",
+"sX c black",
+"dX c black",
+"fX c black",
+"gX c black",
+"hX c black",
+"jX c black",
+"kX c black",
+"lX c black",
+"zX c black",
+"xX c black",
+"cX c black",
+"vX c black",
+"bX c black",
+"nX c black",
+"mX c black",
+"MX c black",
+"NX c black",
+"BX c black",
+"VX c black",
+"CX c black",
+"ZX c black",
+"AX c black",
+"SX c black",
+"DX c black",
+"FX c black",
+"GX c black",
+"HX c black",
+"JX c black",
+"KX c black",
+"LX c black",
+"PX c black",
+"IX c black",
+"UX c black",
+/* pixels */
+" ",
+" ",
+" ",
+" ",
+" ",
+" * 3 * * * * * * * * * * * * * ",
+" v ) Q D J H J H J H J H J Z Z 9 ",
+" N ~ t w w w w w w w w w w s L I 9 ",
+" N M . o o o o o o o o o o 4 L Z I 9 ",
+" N M $ $ $ $ $ $ $ $ $ $ o 5 I 8 f I 9 ",
+" Z M $ $ $ $ $ $ $ $ $ $ $ 7 W u y I J 9 ",
+" N M o $ $ $ $ $ $ $ $ $ o 5 Z G G m I k ",
+" N K $ $ $ $ $ $ $ $ $ $ $ $ : : : ; l h ",
+" N M $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ o l h ",
+" N M $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ l h ",
+" Z M . o o o o o o o o o o o o o o . g h ",
+" N ~ i i i i i i i i i i i i i i i i K h ",
+" v ) / / / / / / / / / / / / / / / / ^ f ",
+" * 3 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 * ",
+" ",
+" ",
+" ",
+" ",
+" "
+};
--- /dev/null
+/* XPM */
+static char *text_extension[] = {
+/* columns rows colors chars-per-pixel */
+"24 24 256 2 ",
+" c black",
+". c #010101",
+"X c #020202",
+"o c gray1",
+"O c #040404",
+"+ c gray2",
+"@ c #060606",
+"# c #070707",
+"$ c gray3",
+"% c #090909",
+"& c gray4",
+"* c #0B0B0B",
+"= c #0C0C0C",
+"- c gray5",
+"; c #0E0E0E",
+": c gray6",
+"> c #101010",
+", c #111111",
+"< c gray7",
+"1 c #131313",
+"2 c gray8",
+"3 c #151515",
+"4 c #161616",
+"5 c gray9",
+"6 c #181818",
+"7 c #191919",
+"8 c gray10",
+"9 c #1B1B1B",
+"0 c gray11",
+"q c #1D1D1D",
+"w c #1E1E1E",
+"e c gray12",
+"r c #202020",
+"t c gray13",
+"y c #222222",
+"u c #232323",
+"i c gray14",
+"p c #252525",
+"a c gray15",
+"s c #272727",
+"d c #282828",
+"f c gray16",
+"g c #2A2A2A",
+"h c gray17",
+"j c #2C2C2C",
+"k c #2D2D2D",
+"l c gray18",
+"z c #2F2F2F",
+"x c gray19",
+"c c #313131",
+"v c #323232",
+"b c gray20",
+"n c #343434",
+"m c #353535",
+"M c gray21",
+"N c #373737",
+"B c gray22",
+"V c #393939",
+"C c #3A3A3A",
+"Z c gray23",
+"A c #3C3C3C",
+"S c gray24",
+"D c #3E3E3E",
+"F c #3F3F3F",
+"G c gray25",
+"H c #414141",
+"J c gray26",
+"K c #434343",
+"L c #444444",
+"P c gray27",
+"I c #464646",
+"U c gray28",
+"Y c #484848",
+"T c #494949",
+"R c gray29",
+"E c #4B4B4B",
+"W c #4C4C4C",
+"Q c gray30",
+"! c #4E4E4E",
+"~ c gray31",
+"^ c #505050",
+"/ c #515151",
+"( c gray32",
+") c #535353",
+"_ c gray33",
+"` c #555555",
+"' c #565656",
+"] c gray34",
+"[ c #585858",
+"{ c gray35",
+"} c #5A5A5A",
+"| c #5B5B5B",
+" . c gray36",
+".. c #5D5D5D",
+"X. c gray37",
+"o. c #5F5F5F",
+"O. c #606060",
+"+. c gray38",
+"@. c #626262",
+"#. c gray39",
+"$. c #646464",
+"%. c #656565",
+"&. c gray40",
+"*. c #676767",
+"=. c #686868",
+"-. c DimGray",
+";. c #6A6A6A",
+":. c gray42",
+">. c #6C6C6C",
+",. c #6D6D6D",
+"<. c gray43",
+"1. c #6F6F6F",
+"2. c gray44",
+"3. c #717171",
+"4. c #727272",
+"5. c gray45",
+"6. c #747474",
+"7. c gray46",
+"8. c #767676",
+"9. c #777777",
+"0. c gray47",
+"q. c #797979",
+"w. c gray48",
+"e. c #7B7B7B",
+"r. c #7C7C7C",
+"t. c gray49",
+"y. c #7E7E7E",
+"u. c gray50",
+"i. c #808080",
+"p. c #818181",
+"a. c gray51",
+"s. c #838383",
+"d. c #848484",
+"f. c gray52",
+"g. c #868686",
+"h. c gray53",
+"j. c #888888",
+"k. c #898989",
+"l. c gray54",
+"z. c #8B8B8B",
+"x. c gray55",
+"c. c #8D8D8D",
+"v. c #8E8E8E",
+"b. c gray56",
+"n. c #909090",
+"m. c gray57",
+"M. c #929292",
+"N. c #939393",
+"B. c gray58",
+"V. c #959595",
+"C. c gray59",
+"Z. c #979797",
+"A. c #989898",
+"S. c gray60",
+"D. c #9A9A9A",
+"F. c #9B9B9B",
+"G. c gray61",
+"H. c #9D9D9D",
+"J. c gray62",
+"K. c #9F9F9F",
+"L. c #A0A0A0",
+"P. c gray63",
+"I. c #A2A2A2",
+"U. c gray64",
+"Y. c #A4A4A4",
+"T. c #A5A5A5",
+"R. c gray65",
+"E. c #A7A7A7",
+"W. c gray66",
+"Q. c #A9A9A9",
+"!. c #AAAAAA",
+"~. c gray67",
+"^. c #ACACAC",
+"/. c gray68",
+"(. c #AEAEAE",
+"). c #AFAFAF",
+"_. c gray69",
+"`. c #B1B1B1",
+"'. c #B2B2B2",
+"]. c gray70",
+"[. c #B4B4B4",
+"{. c gray71",
+"}. c #B6B6B6",
+"|. c #B7B7B7",
+" X c gray72",
+".X c #B9B9B9",
+"XX c gray73",
+"oX c #BBBBBB",
+"OX c #BCBCBC",
+"+X c gray74",
+"@X c gray",
+"#X c gray75",
+"$X c #C0C0C0",
+"%X c #C1C1C1",
+"&X c gray76",
+"*X c #C3C3C3",
+"=X c gray77",
+"-X c #C5C5C5",
+";X c #C6C6C6",
+":X c gray78",
+">X c #C8C8C8",
+",X c gray79",
+"<X c #CACACA",
+"1X c #CBCBCB",
+"2X c gray80",
+"3X c #CDCDCD",
+"4X c #CECECE",
+"5X c gray81",
+"6X c #D0D0D0",
+"7X c gray82",
+"8X c #D2D2D2",
+"9X c LightGray",
+"0X c gray83",
+"qX c #D5D5D5",
+"wX c gray84",
+"eX c #D7D7D7",
+"rX c #D8D8D8",
+"tX c gray85",
+"yX c #DADADA",
+"uX c gray86",
+"iX c gainsboro",
+"pX c #DDDDDD",
+"aX c gray87",
+"sX c #DFDFDF",
+"dX c gray88",
+"fX c #E1E1E1",
+"gX c #E2E2E2",
+"hX c gray89",
+"jX c #E4E4E4",
+"kX c gray90",
+"lX c #E6E6E6",
+"zX c #E7E7E7",
+"xX c gray91",
+"cX c #E9E9E9",
+"vX c #EAEAEA",
+"bX c gray92",
+"nX c #ECECEC",
+"mX c gray93",
+"MX c #EEEEEE",
+"NX c #EFEFEF",
+"BX c gray94",
+"VX c #F1F1F1",
+"CX c gray95",
+"ZX c #F3F3F3",
+"AX c #F4F4F4",
+"SX c gray96",
+"DX c #F6F6F6",
+"FX c gray97",
+"GX c #F8F8F8",
+"HX c #F9F9F9",
+"JX c gray98",
+"KX c #FBFBFB",
+"LX c gray99",
+"PX c #FDFDFD",
+"IX c #FEFEFE",
+"UX c None",
+/* pixels */
+"UXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUX",
+"UXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUX",
+"UXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUX",
+"UXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUX",
+"UXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUX",
+"UXUXUXUXUXUXeX] ] ] ] U ] ] ] U ] ] ] U ] U W.UX",
+"UXUXUXUXUXUX:X- U U ] ] U ] U ] ] U ] ] U U W.UX",
+"UXUXUXUXUXUX<X1 eXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUX",
+"UXUXUXUXUXUX<X1 <XUXUXUXUXUXUXUXUXUXUXUXUXUXUXUX",
+"UXUXUXUXUXUX<X1 <XUXUXUXUXUXUXUXUXUXUXUXUXUXUXUX",
+"UXUXUXUXUXUXeX1 <XUXUXUXUXUXUXUXUXUXUXUXUXUXUXUX",
+"UXW.U U ] ] U 0 <XUXUXUXUXUXUXUXUXUXUXUXUXUXUXUX",
+"UXW.U ] U ] U 0 <XUXUXUXUXUXUXUXUXUXUXUXUXUXUXUX",
+"UXUXUXUXUXUXeX1 <XUXUXUXUXUXUXUXUXUXUXUXUXUXUXUX",
+"UXUXUXUXUXUX:X1 <XUXUXUXUXUXUXUXUXUXUXUXUXUXUXUX",
+"UXUXUXUXUXUX<X1 <XUXUXUXUXUXUXUXUXUXUXUXUXUXUXUX",
+"UXUXUXUXUXUX<X1 eXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUX",
+"UXUXUXUXUXUX:X- U ] U ] ] ] U ] ] ] U ] ] U W.UX",
+"UXUXUXUXUXUXeX] ] U ] ] U ] ] U ] U ] ] U U W.UX",
+"UXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUX",
+"UXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUX",
+"UXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUX",
+"UXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUX",
+"UXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUX"
+};
--- /dev/null
+/* XPM */
+static char *undo[] = {
+/* columns rows colors chars-per-pixel */
+"24 24 256 2 ",
+" c None",
+". c #FDFEFF",
+"X c #FAFBFE",
+"o c #F4F7FD",
+"O c #F1F5FD",
+"+ c #F0F4FD",
+"@ c #EDF1FD",
+"# c #EBF0FC",
+"$ c #E6ECFC",
+"% c #E4EBFC",
+"& c #D5DFFA",
+"* c #D5DEFA",
+"= c #D4DEFA",
+"- c #D2DCFA",
+"; c #D1DCFA",
+": c #D0DAFA",
+"> c #CED9FA",
+", c #CDD9F9",
+"< c #C9D5F8",
+"1 c #B7C7F7",
+"2 c #B6C7F7",
+"3 c #B5C6F7",
+"4 c #B0C2F6",
+"5 c #AFC1F6",
+"6 c #ADC0F6",
+"7 c #ABBEF6",
+"8 c #AABEF5",
+"9 c #A4B9F5",
+"0 c #94ADF3",
+"q c #8FA9F2",
+"w c #8EA8F3",
+"e c #8DA8F2",
+"r c #8DA7F2",
+"t c #86A2F1",
+"y c #839FF1",
+"u c #7F9DF0",
+"i c #7F9CF1",
+"p c #7E9CF0",
+"a c #7D9BF1",
+"s c #7C9AF0",
+"d c #7091EF",
+"f c #6C8EEE",
+"g c #688AEE",
+"h c #678AEE",
+"j c #6084ED",
+"k c #5F83ED",
+"l c #5E83ED",
+"z c #5C81ED",
+"x c #5B81ED",
+"c c #5B80EC",
+"v c #5A80ED",
+"b c #5A80EC",
+"n c #597FEC",
+"m c #577EEC",
+"M c #577DEC",
+"N c #567CEC",
+"B c #557CEB",
+"V c #547BEC",
+"C c #5179EB",
+"Z c #4F77EB",
+"A c #4D76EB",
+"S c #4872EB",
+"D c #4772EB",
+"F c #446FEA",
+"G c #3C69E9",
+"H c #3B68E9",
+"J c #3A66E9",
+"K c #3865E9",
+"L c #3563E8",
+"P c #3463E8",
+"I c #3362E8",
+"U c #2E5EE8",
+"Y c #2A5BE7",
+"T c #295AE7",
+"R c #2556E7",
+"E c #2154E6",
+"W c #2052E6",
+"Q c #1E51E5",
+"! c #1D51E6",
+"~ c #1D50E5",
+"^ c #1A4FE5",
+"/ c #1A4EE5",
+"( c #194EE5",
+") c #184DE5",
+"_ c #184CE5",
+"` c #174CE5",
+"' c #164BE5",
+"] c #144AE4",
+"[ c #1248E4",
+"{ c #0F46E4",
+"} c #0E45E4",
+"| c #0E45E3",
+" . c #0D44E4",
+".. c #0A42E4",
+"X. c #063FE3",
+"o. c #0038E2",
+"O. c black",
+"+. c black",
+"@. c black",
+"#. c black",
+"$. c black",
+"%. c black",
+"&. c black",
+"*. c black",
+"=. c black",
+"-. c black",
+";. c black",
+":. c black",
+">. c black",
+",. c black",
+"<. c black",
+"1. c black",
+"2. c black",
+"3. c black",
+"4. c black",
+"5. c black",
+"6. c black",
+"7. c black",
+"8. c black",
+"9. c black",
+"0. c black",
+"q. c black",
+"w. c black",
+"e. c black",
+"r. c black",
+"t. c black",
+"y. c black",
+"u. c black",
+"i. c black",
+"p. c black",
+"a. c black",
+"s. c black",
+"d. c black",
+"f. c black",
+"g. c black",
+"h. c black",
+"j. c black",
+"k. c black",
+"l. c black",
+"z. c black",
+"x. c black",
+"c. c black",
+"v. c black",
+"b. c black",
+"n. c black",
+"m. c black",
+"M. c black",
+"N. c black",
+"B. c black",
+"V. c black",
+"C. c black",
+"Z. c black",
+"A. c black",
+"S. c black",
+"D. c black",
+"F. c black",
+"G. c black",
+"H. c black",
+"J. c black",
+"K. c black",
+"L. c black",
+"P. c black",
+"I. c black",
+"U. c black",
+"Y. c black",
+"T. c black",
+"R. c black",
+"E. c black",
+"W. c black",
+"Q. c black",
+"!. c black",
+"~. c black",
+"^. c black",
+"/. c black",
+"(. c black",
+"). c black",
+"_. c black",
+"`. c black",
+"'. c black",
+"]. c black",
+"[. c black",
+"{. c black",
+"}. c black",
+"|. c black",
+" X c black",
+".X c black",
+"XX c black",
+"oX c black",
+"OX c black",
+"+X c black",
+"@X c black",
+"#X c black",
+"$X c black",
+"%X c black",
+"&X c black",
+"*X c black",
+"=X c black",
+"-X c black",
+";X c black",
+":X c black",
+">X c black",
+",X c black",
+"<X c black",
+"1X c black",
+"2X c black",
+"3X c black",
+"4X c black",
+"5X c black",
+"6X c black",
+"7X c black",
+"8X c black",
+"9X c black",
+"0X c black",
+"qX c black",
+"wX c black",
+"eX c black",
+"rX c black",
+"tX c black",
+"yX c black",
+"uX c black",
+"iX c black",
+"pX c black",
+"aX c black",
+"sX c black",
+"dX c black",
+"fX c black",
+"gX c black",
+"hX c black",
+"jX c black",
+"kX c black",
+"lX c black",
+"zX c black",
+"xX c black",
+"cX c black",
+"vX c black",
+"bX c black",
+"nX c black",
+"mX c black",
+"MX c black",
+"NX c black",
+"BX c black",
+"VX c black",
+"CX c black",
+"ZX c black",
+"AX c black",
+"SX c black",
+"DX c black",
+"FX c black",
+"GX c black",
+"HX c black",
+"JX c black",
+"KX c black",
+"LX c black",
+"PX c black",
+"IX c black",
+"UX c black",
+/* pixels */
+" ",
+" ",
+" ",
+" ",
+" ",
+" o y m k h $ ",
+" 7 U Q { { ^ Y u ",
+" 1 7 R ` R r 0 G ^ ^ u ",
+" Z u 5 Q { u > & L Q ^ t ",
+" k ` R Q u > L ` F $ ",
+" k ^ R J & G { q ",
+" m { ^ ` d o k X.q ",
+" t m k k Z 1 9 ^ Y 5 ",
+" @ m { k ",
+" @ m { L > ",
+" n X.L & ",
+" 5 r & ",
+" & Z Z m m Z m Z h < D & f 1 u u 5 Z o ",
+" & F m Z Z m Z Z h < D < n 7 u u 5 Z o ",
+" ",
+" ",
+" ",
+" ",
+" "
+};
--- /dev/null
+/* XPM */
+static char *up[] = {
+/* columns rows colors chars-per-pixel */
+"24 24 256 2 ",
+" c None",
+". c #FEFFFF",
+"X c #FDFDFD",
+"o c #F9F7F5",
+"O c #F8F8F8",
+"+ c #F7F7F6",
+"@ c #F6F6F6",
+"# c #F6F5F5",
+"$ c gray96",
+"% c #F5F3ED",
+"& c #F4F4F4",
+"* c #F3F3F2",
+"= c #F1EFEB",
+"- c #F0F0EE",
+"; c gray93",
+": c #EDEBEA",
+"> c #ECEBEA",
+", c #EBEAE8",
+"< c #EBE9E6",
+"1 c #EBE9E5",
+"2 c #EAEAE9",
+"3 c #EAE9E7",
+"4 c #E5E3DF",
+"5 c #E2DDD8",
+"6 c #E0E0DF",
+"7 c gainsboro",
+"8 c #CECCC9",
+"9 c #CBC9C6",
+"0 c #CAC8C6",
+"q c #C6C3BF",
+"w c #908C80",
+"e c #697281",
+"r c #687180",
+"t c #656665",
+"y c #62676E",
+"u c #5D626A",
+"i c #595A5B",
+"p c #53524F",
+"a c #5096FF",
+"s c #4F9BFF",
+"d c #4E96FF",
+"f c #4D96FF",
+"g c #4D94FB",
+"h c #4D4C4A",
+"j c #4C96FF",
+"k c #4C95FF",
+"l c #4C8BEC",
+"z c #4C4B4A",
+"x c #4B90F7",
+"c c #4B8FF6",
+"v c #4B4A49",
+"b c #4A91F9",
+"n c #4A90F5",
+"m c #498FF4",
+"M c #488EF6",
+"N c #488EF5",
+"B c #488BEF",
+"V c #4889E8",
+"C c gray28",
+"Z c #464646",
+"A c #454749",
+"S c #4277CB",
+"D c #414242",
+"F c #403F3F",
+"G c #3E3E3E",
+"H c #3E3D3A",
+"J c #3D7AD3",
+"K c #3D74C8",
+"L c #3C7AD4",
+"P c #3C76CB",
+"I c #3C3C3C",
+"U c #3B75CA",
+"Y c #3A6FC0",
+"T c #3A6CBD",
+"R c #3976CD",
+"E c #396EC0",
+"W c #386EC1",
+"Q c #3776D0",
+"! c #3769B5",
+"~ c #3667B3",
+"^ c #323131",
+"/ c #2A2D30",
+"( c #282321",
+") c #275294",
+"_ c #255099",
+"` c #245398",
+"' c #244379",
+"] c #21242D",
+"[ c #204881",
+"{ c #20212A",
+"} c #1E202C",
+"| c #1E202B",
+" . c #1D4781",
+".. c #1C4072",
+"X. c #1C212E",
+"o. c #1A3868",
+"O. c #173764",
+"+. c #151E2A",
+"@. c #131E2B",
+"#. c #131E2A",
+"$. c #131524",
+"%. c #121C2B",
+"&. c #113669",
+"*. c #112F5E",
+"=. c #101E31",
+"-. c #0A1017",
+";. c #050D1B",
+":. c black",
+">. c black",
+",. c black",
+"<. c black",
+"1. c black",
+"2. c black",
+"3. c black",
+"4. c black",
+"5. c black",
+"6. c black",
+"7. c black",
+"8. c black",
+"9. c black",
+"0. c black",
+"q. c black",
+"w. c black",
+"e. c black",
+"r. c black",
+"t. c black",
+"y. c black",
+"u. c black",
+"i. c black",
+"p. c black",
+"a. c black",
+"s. c black",
+"d. c black",
+"f. c black",
+"g. c black",
+"h. c black",
+"j. c black",
+"k. c black",
+"l. c black",
+"z. c black",
+"x. c black",
+"c. c black",
+"v. c black",
+"b. c black",
+"n. c black",
+"m. c black",
+"M. c black",
+"N. c black",
+"B. c black",
+"V. c black",
+"C. c black",
+"Z. c black",
+"A. c black",
+"S. c black",
+"D. c black",
+"F. c black",
+"G. c black",
+"H. c black",
+"J. c black",
+"K. c black",
+"L. c black",
+"P. c black",
+"I. c black",
+"U. c black",
+"Y. c black",
+"T. c black",
+"R. c black",
+"E. c black",
+"W. c black",
+"Q. c black",
+"!. c black",
+"~. c black",
+"^. c black",
+"/. c black",
+"(. c black",
+"). c black",
+"_. c black",
+"`. c black",
+"'. c black",
+"]. c black",
+"[. c black",
+"{. c black",
+"}. c black",
+"|. c black",
+" X c black",
+".X c black",
+"XX c black",
+"oX c black",
+"OX c black",
+"+X c black",
+"@X c black",
+"#X c black",
+"$X c black",
+"%X c black",
+"&X c black",
+"*X c black",
+"=X c black",
+"-X c black",
+";X c black",
+":X c black",
+">X c black",
+",X c black",
+"<X c black",
+"1X c black",
+"2X c black",
+"3X c black",
+"4X c black",
+"5X c black",
+"6X c black",
+"7X c black",
+"8X c black",
+"9X c black",
+"0X c black",
+"qX c black",
+"wX c black",
+"eX c black",
+"rX c black",
+"tX c black",
+"yX c black",
+"uX c black",
+"iX c black",
+"pX c black",
+"aX c black",
+"sX c black",
+"dX c black",
+"fX c black",
+"gX c black",
+"hX c black",
+"jX c black",
+"kX c black",
+"lX c black",
+"zX c black",
+"xX c black",
+"cX c black",
+"vX c black",
+"bX c black",
+"nX c black",
+"mX c black",
+"MX c black",
+"NX c black",
+"BX c black",
+"VX c black",
+"CX c black",
+"ZX c black",
+"AX c black",
+"SX c black",
+"DX c black",
+"FX c black",
+"GX c black",
+"HX c black",
+"JX c black",
+"KX c black",
+"LX c black",
+"PX c black",
+"IX c black",
+"UX c black",
+/* pixels */
+" ",
+" ",
+" ",
+" ",
+" ",
+" % w < ",
+" + u =.A ; ",
+" o e ) c ..F ; ",
+" e ) c d c O.C ; ",
+" + y _ d c l x d O.h ; ",
+" + p :. .~ l c l ! ' :.h ; ",
+" + G / ( $.K d J +.^ G G 7 ",
+" + + 5 ] T d K +.q + + ",
+" = } Y d K +.8 ",
+" < } Y d Q +.9 ",
+" 4 ] Y d K +.9 ",
+" < } K s J +.9 ",
+" ; -.*. .&.;.9 ",
+" + t C h C i 4 ",
+" ",
+" ",
+" ",
+" ",
+" "
+};
--- /dev/null
+/* XPM */
+static char *zoom_in[] = {
+/* columns rows colors chars-per-pixel */
+"24 24 256 2 ",
+" c black",
+". c #010101",
+"X c #020202",
+"o c gray1",
+"O c #040404",
+"+ c gray2",
+"@ c #060606",
+"# c #070707",
+"$ c gray3",
+"% c #090909",
+"& c gray4",
+"* c #0B0B0B",
+"= c #0C0C0C",
+"- c gray5",
+"; c #0E0E0E",
+": c gray6",
+"> c #101010",
+", c #111111",
+"< c gray7",
+"1 c #131313",
+"2 c gray8",
+"3 c #151515",
+"4 c #161616",
+"5 c gray9",
+"6 c #181818",
+"7 c #191919",
+"8 c gray10",
+"9 c #1B1B1B",
+"0 c gray11",
+"q c #1D1D1D",
+"w c #1E1E1E",
+"e c gray12",
+"r c #202020",
+"t c gray13",
+"y c #222222",
+"u c #232323",
+"i c gray14",
+"p c #252525",
+"a c gray15",
+"s c #272727",
+"d c #282828",
+"f c gray16",
+"g c #2A2A2A",
+"h c gray17",
+"j c #2C2C2C",
+"k c #2D2D2D",
+"l c gray18",
+"z c #2F2F2F",
+"x c gray19",
+"c c #313131",
+"v c #323232",
+"b c gray20",
+"n c #343434",
+"m c #353535",
+"M c gray21",
+"N c #373737",
+"B c gray22",
+"V c #393939",
+"C c #3A3A3A",
+"Z c gray23",
+"A c #3C3C3C",
+"S c gray24",
+"D c #3E3E3E",
+"F c #3F3F3F",
+"G c gray25",
+"H c #414141",
+"J c gray26",
+"K c #434343",
+"L c #444444",
+"P c gray27",
+"I c #464646",
+"U c gray28",
+"Y c #484848",
+"T c #494949",
+"R c gray29",
+"E c #4B4B4B",
+"W c #4C4C4C",
+"Q c gray30",
+"! c #4E4E4E",
+"~ c gray31",
+"^ c #505050",
+"/ c #515151",
+"( c gray32",
+") c #535353",
+"_ c gray33",
+"` c #555555",
+"' c #565656",
+"] c gray34",
+"[ c #585858",
+"{ c gray35",
+"} c #5A5A5A",
+"| c #5B5B5B",
+" . c gray36",
+".. c #5D5D5D",
+"X. c gray37",
+"o. c #5F5F5F",
+"O. c #606060",
+"+. c gray38",
+"@. c #626262",
+"#. c gray39",
+"$. c #646464",
+"%. c #656565",
+"&. c gray40",
+"*. c #676767",
+"=. c #686868",
+"-. c DimGray",
+";. c #6A6A6A",
+":. c gray42",
+">. c #6C6C6C",
+",. c #6D6D6D",
+"<. c gray43",
+"1. c #6F6F6F",
+"2. c gray44",
+"3. c #717171",
+"4. c #727272",
+"5. c gray45",
+"6. c #747474",
+"7. c gray46",
+"8. c #767676",
+"9. c #777777",
+"0. c gray47",
+"q. c #797979",
+"w. c gray48",
+"e. c #7B7B7B",
+"r. c #7C7C7C",
+"t. c gray49",
+"y. c #7E7E7E",
+"u. c gray50",
+"i. c #808080",
+"p. c #818181",
+"a. c gray51",
+"s. c #838383",
+"d. c #848484",
+"f. c gray52",
+"g. c #868686",
+"h. c gray53",
+"j. c #888888",
+"k. c #898989",
+"l. c gray54",
+"z. c #8B8B8B",
+"x. c gray55",
+"c. c #8D8D8D",
+"v. c #8E8E8E",
+"b. c gray56",
+"n. c #909090",
+"m. c gray57",
+"M. c #929292",
+"N. c #939393",
+"B. c gray58",
+"V. c #959595",
+"C. c gray59",
+"Z. c #979797",
+"A. c #989898",
+"S. c gray60",
+"D. c #9A9A9A",
+"F. c #9B9B9B",
+"G. c gray61",
+"H. c #9D9D9D",
+"J. c gray62",
+"K. c #9F9F9F",
+"L. c #A0A0A0",
+"P. c gray63",
+"I. c #A2A2A2",
+"U. c gray64",
+"Y. c #A4A4A4",
+"T. c #A5A5A5",
+"R. c gray65",
+"E. c #A7A7A7",
+"W. c gray66",
+"Q. c #A9A9A9",
+"!. c #AAAAAA",
+"~. c gray67",
+"^. c #ACACAC",
+"/. c gray68",
+"(. c #AEAEAE",
+"). c #AFAFAF",
+"_. c gray69",
+"`. c #B1B1B1",
+"'. c #B2B2B2",
+"]. c gray70",
+"[. c #B4B4B4",
+"{. c gray71",
+"}. c #B6B6B6",
+"|. c #B7B7B7",
+" X c gray72",
+".X c #B9B9B9",
+"XX c gray73",
+"oX c #BBBBBB",
+"OX c #BCBCBC",
+"+X c gray74",
+"@X c gray",
+"#X c gray75",
+"$X c #C0C0C0",
+"%X c #C1C1C1",
+"&X c gray76",
+"*X c #C3C3C3",
+"=X c gray77",
+"-X c #C5C5C5",
+";X c #C6C6C6",
+":X c gray78",
+">X c #C8C8C8",
+",X c gray79",
+"<X c #CACACA",
+"1X c #CBCBCB",
+"2X c gray80",
+"3X c #CDCDCD",
+"4X c #CECECE",
+"5X c gray81",
+"6X c #D0D0D0",
+"7X c gray82",
+"8X c #D2D2D2",
+"9X c LightGray",
+"0X c gray83",
+"qX c #D5D5D5",
+"wX c gray84",
+"eX c #D7D7D7",
+"rX c #D8D8D8",
+"tX c gray85",
+"yX c #DADADA",
+"uX c gray86",
+"iX c gainsboro",
+"pX c #DDDDDD",
+"aX c gray87",
+"sX c #DFDFDF",
+"dX c gray88",
+"fX c #E1E1E1",
+"gX c #E2E2E2",
+"hX c gray89",
+"jX c #E4E4E4",
+"kX c gray90",
+"lX c #E6E6E6",
+"zX c #E7E7E7",
+"xX c gray91",
+"cX c #E9E9E9",
+"vX c #EAEAEA",
+"bX c gray92",
+"nX c #ECECEC",
+"mX c gray93",
+"MX c #EEEEEE",
+"NX c #EFEFEF",
+"BX c gray94",
+"VX c #F1F1F1",
+"CX c gray95",
+"ZX c #F3F3F3",
+"AX c #F4F4F4",
+"SX c gray96",
+"DX c #F6F6F6",
+"FX c gray97",
+"GX c #F8F8F8",
+"HX c #F9F9F9",
+"JX c gray98",
+"KX c #FBFBFB",
+"LX c gray99",
+"PX c #FDFDFD",
+"IX c #FEFEFE",
+"UX c None",
+/* pixels */
+"UXUXUXUXUXUXUXUXUXUXUXUXUX;X#X#X#X;XUXUXUXUXUXUX",
+"UXUXUXUXUXUXUXUXUXUXUX).<.# # # # # 9.;XUXUXUXUX",
+"UXUXUXUXUXUXUXUXUXUXE.5 # # # # # # # 5 ;XUXUXUX",
+"UXUXUXUXUXUXUXUXUX).5 # # 5 ~ ] P # # # 5 5XUXUX",
+"UXUXUXUXUXUXUXUXE.5 # # 9.;X).g.5XS. .# # 5 #XUX",
+"UXUXUXUXUXUXUXUXP # # b.UXUXz # 9.UXUX] # # <.UX",
+"UXUXUXUXUXUXUXN.: # e zXUXUXP # b.UXUX).: # # ;X",
+"UXUXUXUXUXUXUXb.# # b.).g.r.e # F r.r.5X~ # # #X",
+"UXUXUXUXUXUXUXN.# # b.F # # # # # # # r.] # # #X",
+"UXUXUXUXUXUXUXN.# # b.g.F F : # e F F [.] # # #X",
+"UXUXUXUXUXUXUXb.# # F mXUXUXF # g.UXUX;Xe # # ;X",
+"UXUXUXUXUXUXUXzXF # # ).UXUXn # 9.UXUX<.# # <.mX",
+"UXUXUXUXUXUXUXUX .# # 5 [.zXg.] [.0XN.# # : [.UX",
+"UXUXUXUXUXUXUX5Xn # # # # n b.b.g.5 # # 5 ).UXUX",
+"UXUXUXUXUXUX5Xz # # e : # # # # # # # 5 E.UXUXUX",
+"UXUXUXUXUX0Xz # # 5 ).b.F # # # # : P E.UXUXUXUX",
+"UXUXUXUX5Xz # # 5 E.UXUXmXg.b.b.b.N.UXUXUXUXUXUX",
+"UXUXUX5Xz # # 5 E.UXUXUXUXUXUXUXUXUXUXUXUXUXUXUX",
+"UXUX0Xz # # 5 E.UXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUX",
+"UX;Xz # # 5 E.UXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUX",
+"UXb.# # 5 E.UXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUX",
+"UXCX9.: E.UXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUX",
+"UXUXUX[.UXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUX",
+"UXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUX"
+};
--- /dev/null
+/* XPM */
+static char *zoom_out[] = {
+/* columns rows colors chars-per-pixel */
+"24 24 256 2 ",
+" c black",
+". c #010101",
+"X c #020202",
+"o c gray1",
+"O c #040404",
+"+ c gray2",
+"@ c #060606",
+"# c #070707",
+"$ c gray3",
+"% c #090909",
+"& c gray4",
+"* c #0B0B0B",
+"= c #0C0C0C",
+"- c gray5",
+"; c #0E0E0E",
+": c gray6",
+"> c #101010",
+", c #111111",
+"< c gray7",
+"1 c #131313",
+"2 c gray8",
+"3 c #151515",
+"4 c #161616",
+"5 c gray9",
+"6 c #181818",
+"7 c #191919",
+"8 c gray10",
+"9 c #1B1B1B",
+"0 c gray11",
+"q c #1D1D1D",
+"w c #1E1E1E",
+"e c gray12",
+"r c #202020",
+"t c gray13",
+"y c #222222",
+"u c #232323",
+"i c gray14",
+"p c #252525",
+"a c gray15",
+"s c #272727",
+"d c #282828",
+"f c gray16",
+"g c #2A2A2A",
+"h c gray17",
+"j c #2C2C2C",
+"k c #2D2D2D",
+"l c gray18",
+"z c #2F2F2F",
+"x c gray19",
+"c c #313131",
+"v c #323232",
+"b c gray20",
+"n c #343434",
+"m c #353535",
+"M c gray21",
+"N c #373737",
+"B c gray22",
+"V c #393939",
+"C c #3A3A3A",
+"Z c gray23",
+"A c #3C3C3C",
+"S c gray24",
+"D c #3E3E3E",
+"F c #3F3F3F",
+"G c gray25",
+"H c #414141",
+"J c gray26",
+"K c #434343",
+"L c #444444",
+"P c gray27",
+"I c #464646",
+"U c gray28",
+"Y c #484848",
+"T c #494949",
+"R c gray29",
+"E c #4B4B4B",
+"W c #4C4C4C",
+"Q c gray30",
+"! c #4E4E4E",
+"~ c gray31",
+"^ c #505050",
+"/ c #515151",
+"( c gray32",
+") c #535353",
+"_ c gray33",
+"` c #555555",
+"' c #565656",
+"] c gray34",
+"[ c #585858",
+"{ c gray35",
+"} c #5A5A5A",
+"| c #5B5B5B",
+" . c gray36",
+".. c #5D5D5D",
+"X. c gray37",
+"o. c #5F5F5F",
+"O. c #606060",
+"+. c gray38",
+"@. c #626262",
+"#. c gray39",
+"$. c #646464",
+"%. c #656565",
+"&. c gray40",
+"*. c #676767",
+"=. c #686868",
+"-. c DimGray",
+";. c #6A6A6A",
+":. c gray42",
+">. c #6C6C6C",
+",. c #6D6D6D",
+"<. c gray43",
+"1. c #6F6F6F",
+"2. c gray44",
+"3. c #717171",
+"4. c #727272",
+"5. c gray45",
+"6. c #747474",
+"7. c gray46",
+"8. c #767676",
+"9. c #777777",
+"0. c gray47",
+"q. c #797979",
+"w. c gray48",
+"e. c #7B7B7B",
+"r. c #7C7C7C",
+"t. c gray49",
+"y. c #7E7E7E",
+"u. c gray50",
+"i. c #808080",
+"p. c #818181",
+"a. c gray51",
+"s. c #838383",
+"d. c #848484",
+"f. c gray52",
+"g. c #868686",
+"h. c gray53",
+"j. c #888888",
+"k. c #898989",
+"l. c gray54",
+"z. c #8B8B8B",
+"x. c gray55",
+"c. c #8D8D8D",
+"v. c #8E8E8E",
+"b. c gray56",
+"n. c #909090",
+"m. c gray57",
+"M. c #929292",
+"N. c #939393",
+"B. c gray58",
+"V. c #959595",
+"C. c gray59",
+"Z. c #979797",
+"A. c #989898",
+"S. c gray60",
+"D. c #9A9A9A",
+"F. c #9B9B9B",
+"G. c gray61",
+"H. c #9D9D9D",
+"J. c gray62",
+"K. c #9F9F9F",
+"L. c #A0A0A0",
+"P. c gray63",
+"I. c #A2A2A2",
+"U. c gray64",
+"Y. c #A4A4A4",
+"T. c #A5A5A5",
+"R. c gray65",
+"E. c #A7A7A7",
+"W. c gray66",
+"Q. c #A9A9A9",
+"!. c #AAAAAA",
+"~. c gray67",
+"^. c #ACACAC",
+"/. c gray68",
+"(. c #AEAEAE",
+"). c #AFAFAF",
+"_. c gray69",
+"`. c #B1B1B1",
+"'. c #B2B2B2",
+"]. c gray70",
+"[. c #B4B4B4",
+"{. c gray71",
+"}. c #B6B6B6",
+"|. c #B7B7B7",
+" X c gray72",
+".X c #B9B9B9",
+"XX c gray73",
+"oX c #BBBBBB",
+"OX c #BCBCBC",
+"+X c gray74",
+"@X c gray",
+"#X c gray75",
+"$X c #C0C0C0",
+"%X c #C1C1C1",
+"&X c gray76",
+"*X c #C3C3C3",
+"=X c gray77",
+"-X c #C5C5C5",
+";X c #C6C6C6",
+":X c gray78",
+">X c #C8C8C8",
+",X c gray79",
+"<X c #CACACA",
+"1X c #CBCBCB",
+"2X c gray80",
+"3X c #CDCDCD",
+"4X c #CECECE",
+"5X c gray81",
+"6X c #D0D0D0",
+"7X c gray82",
+"8X c #D2D2D2",
+"9X c LightGray",
+"0X c gray83",
+"qX c #D5D5D5",
+"wX c gray84",
+"eX c #D7D7D7",
+"rX c #D8D8D8",
+"tX c gray85",
+"yX c #DADADA",
+"uX c gray86",
+"iX c gainsboro",
+"pX c #DDDDDD",
+"aX c gray87",
+"sX c #DFDFDF",
+"dX c gray88",
+"fX c #E1E1E1",
+"gX c #E2E2E2",
+"hX c gray89",
+"jX c #E4E4E4",
+"kX c gray90",
+"lX c #E6E6E6",
+"zX c #E7E7E7",
+"xX c gray91",
+"cX c #E9E9E9",
+"vX c #EAEAEA",
+"bX c gray92",
+"nX c #ECECEC",
+"mX c gray93",
+"MX c #EEEEEE",
+"NX c #EFEFEF",
+"BX c gray94",
+"VX c #F1F1F1",
+"CX c gray95",
+"ZX c #F3F3F3",
+"AX c #F4F4F4",
+"SX c gray96",
+"DX c #F6F6F6",
+"FX c gray97",
+"GX c #F8F8F8",
+"HX c #F9F9F9",
+"JX c gray98",
+"KX c #FBFBFB",
+"LX c gray99",
+"PX c #FDFDFD",
+"IX c #FEFEFE",
+"UX c None",
+/* pixels */
+"UXUXUXUXUXUXUXUXUXUXUXUXUX;X#X#X#X;XUXUXUXUXUXUX",
+"UXUXUXUXUXUXUXUXUXUXUX).<.# # # # # 9.;XUXUXUXUX",
+"UXUXUXUXUXUXUXUXUXUXE.5 # # # # # # # 5 ;XUXUXUX",
+"UXUXUXUXUXUXUXUXUX).5 # # 5 F F F # # # 5 5XUXUX",
+"UXUXUXUXUXUXUXUXE.5 # # 9.;XUXUXUXS. .# # 5 #XUX",
+"UXUXUXUXUXUXUXUXP # # b.UXUXUXUXUXUXUX] # # <.UX",
+"UXUXUXUXUXUXUXN.: # e zXUXUXUXUXUXUXUX).: # # ;X",
+"UXUXUXUXUXUXUXb.# # b.).r.d.r.d.r.d.r.5XQ # # #X",
+"UXUXUXUXUXUXUXN.# # b.F # # # # # # # r.] # # #X",
+"UXUXUXUXUXUXUXN.# # b.d.F F F F F F F [.] # # #X",
+"UXUXUXUXUXUXUXb.# # F mXUXUXUXUXUXUXUX;Xe # # ;X",
+"UXUXUXUXUXUXUXzXF # # ).UXUXUXUXUXUXUX<.# # <.mX",
+"UXUXUXUXUXUXUXUX .# # 5 [.mXUXUXUX0XN.# # : [.UX",
+"UXUXUXUXUXUXUX5Xb # # # # b d.d.r.5 # # 5 ).UXUX",
+"UXUXUXUXUXUX5Xz # # e : # # # # # # # 5 E.UXUXUX",
+"UXUXUXUXUX0Xz # # 5 ).b.F # # # # : P E.UXUXUXUX",
+"UXUXUXUX5Xz # # 5 E.UXUXmXd.b.b.b.N.UXUXUXUXUXUX",
+"UXUXUX5Xz # # 5 E.UXUXUXUXUXUXUXUXUXUXUXUXUXUXUX",
+"UXUX0Xz # # 5 E.UXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUX",
+"UX;Xz # # 5 E.UXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUX",
+"UXb.# # 5 E.UXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUX",
+"UXCX9.: E.UXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUX",
+"UXUXUX[.UXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUX",
+"UXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUX"
+};
--- /dev/null
+PROJECT(lds-runtime)
+
+INCLUDE_DIRECTORIES(${CMAKE_CURRENT_BINARY_DIR})
+INCLUDE_DIRECTORIES(${CMAKE_CURRENT_SOURCE_DIR})
+INCLUDE_DIRECTORIES(${aebutils_SOURCE_DIR})
+# For option...
+INCLUDE_DIRECTORIES(${aebutils_SOURCE_DIR}/aeb)
+INCLUDE_DIRECTORIES(${genaut_SOURCE_DIR}/common/include/IR)
+
+ADD_DEFINITIONS(-DWITH_DEFINE_EXTERNAL_AEL -DWITH_DEFINE_EXTERNAL_FLAGS)
+
+
+
+ADD_LIBRARY(ldsrt
+ ldsvm.cpp
+ )
--- /dev/null
+#ifndef LDS_ALLOCATOR_H
+#define LDS_ALLOCATOR_H
+
+
+
+/**
+ * The purpose of the allocator is to
+ * align memory allocation to 8 bytes borders. This should help
+ * optimize the memory management.
+ * An maybe pool management as well to collect statistics.
+ *
+ * To be used for strings, vectors, maps, list, queues
+ */
+template <typename T ,std::size_t maxSize,int Align = 4>
+struct LdsAllocator
+{
+ public:
+ // traits
+ typedef T * pointer;
+ typedef const T * const_pointer;
+ typedef T & reference;
+ typedef const T & const_reference;
+ typedef T value_type;
+ typedef std::size_t size_type;
+ typedef std::ptrdiff_t difference_type;
+ public:
+
+ LdsAllocator() {}
+
+ LdsAllocator(const LdsAllocator &a) {}
+
+ ~LdsAllocator() {}
+
+ pointer allocate(std::size_t n)
+ {
+ //check max size ...
+ if ( (n < maxSize) && (n <= std::numeric_limits<std::size_t>::max() / sizeof(T)) )
+ {
+ int l = (n * sizeof(T) / Align + 1) * Align;
+ if (void * ptr = std::malloc( ( n * sizeof(T)/Align + 1) * Align ) ) {
+ return static_cast<pointer>(ptr);
+ }
+ }
+ throw std::bad_alloc();
+ }
+
+ void deallocate(pointer ptr, std::size_t n) {
+ std::free(ptr);
+ }
+
+ void construct(pointer p, const_reference val) { new(p) T(val); }
+
+ void destroy(pointer p)
+ {
+ p->~T();
+ }
+
+ size_t max_size() const { return maxSize;}
+
+ template <typename U>
+ struct rebind { typedef LdsAllocator<U,maxSize> other; } ;
+ protected:
+};
+
+template <typename T1,std::size_t S1,int A1,typename T2,std::size_t S2,int A2>
+inline bool operator ==(LdsAllocator<T1,S1,A1> const &,LdsAllocator<T2,S2,A2> const &) {
+ return true;
+}
+
+#endif /*LDS_ALLOCATOR_H*/
--- /dev/null
+#ifndef LDS_MSG_H__
+#define LDS_MSG_H__
+
+#include <aeb/basics/icoqueue.h>
+/* lds Vm Context */
+struct Context;
+
+
+/**
+ *
+ */
+struct LdsMsg
+{
+
+ int m_MsgId;
+ LdsTypeValue *m_Parameters;
+
+ LdsMsg(int msgId,unsigned nbParameters )
+ : m_MsgId(msgId)
+ {}
+ inline int getEvent() const { return m_MsgId ; }
+ /// Needs to be Changed. Erase allocated Parameters
+ ~LdsMsg() {}
+};
+
+template <int nbParam>
+struct FixedSizeLdsMsg : LdsMsg
+{
+ LdsTypeValue m_P[nbParam];
+ FixedSizeLdsMsg(int msgId) : LdsMsg(msgId,nbParam)
+ { m_Parameters = m_P;}
+
+};
+
+struct LdsSignalMsg : public LdsMsg
+{
+ Context *m_Sender,*m_Receiver;
+
+ LdsSignalMsg(int msgId,unsigned nbP) ;
+};
+
+
+/**
+ * timer msg are to be put in the call out queue.
+ * When the timer expires the appropriate calling function
+ * should be called.
+ * I don't know yet if this class should be a template or
+ * not.
+ */
+struct LdsTimerMsg : public LdsMsg, public aeb::icoqueue_node
+{
+ Context *m_Sender;
+ /** Called by Callout Queue
+ * Simply equeue a new message in message queue of Agent.
+ * Something like m_Sender->putMessage(this);
+ */
+ void expired();
+};
+
+#endif
+/*
+ * vim: et sw=2 list:
+ */
--- /dev/null
+#ifndef LDS_OBJECT_H
+#define LDS_OBJECT_H
+
+struct Context;
+/**
+ * Maybe I should Add Pid Type, as well. See how I can do that later
+ * Because, AutomatonType, BlockType and SystemType a different kind au
+ * agents.
+ */
+typedef union {
+ /* Missing Context Pointer for Thread Context ... */
+ void *p; /* Lds Object s a pointer to user data */
+ long i; /* Lds Object is a long int */
+ bool b; /* Lds Object Value is a boolean */
+ double f; /* Lds Object is double value */
+ /* Missing Function Type, Thread ? */
+ int (* CFunction)(void *);
+} LdsValue;
+
+#if DEBUG
+#define check_exp(a,b) (b)
+#else
+#define check_exp(a,b) (b)
+#endif
+
+/**
+ * TypeValue
+ */
+struct LdsTypeValue
+{
+
+ enum Type {
+ Nil = 0
+ ,Boolean
+ ,Integer
+ ,Natural
+ ,Real
+ ,String
+ ,Time
+ ,Duration
+ ,UserData
+ ,Thread
+ ,Function
+ ,Pid
+ } m_Type:4 ; /* 4 bits to define a type 0 - 15 */
+ /* Let try to trust the compiler to optimize bit field set reset */
+ LdsValue m_Value;
+
+ LdsTypeValue() : m_Type(Nil) {}
+ /* Check type functions */
+ inline bool isString() const { return m_Type == String; };
+ inline bool isInteger() const { return m_Type == Integer; };
+ inline bool isNatural() const { return m_Type == Natural; };
+ inline bool isBoolean() const { return m_Type == Boolean; };
+ inline bool isTime() const { return m_Type == Time; };
+ inline bool isDuration() const { return m_Type == Duration; };
+ inline bool isFunction() const { return m_Type == Function; };
+ inline bool isUserData() const { return m_Type == UserData; };
+ inline bool isThread() const { return m_Type == Thread; };
+ inline bool isPid() const { return m_Type == Pid; };
+
+ /* Getters */
+ inline long &get_Integer() { return m_Value.i; };
+ inline bool &get_Boolean() { return m_Value.b; };
+ //inline char *get_String() { return (char *)m_Value.p; };
+ inline char *&get_String() { return (char *&)m_Value.p; };
+ inline void *get_UserData() { return m_Value.p; };
+ inline long &get_Pid() { return m_Value.i; };
+
+
+ /* Inline function to set Values */
+ inline void set_Integer(long l) { m_Type = Integer; m_Value.i = l; };
+ inline void set_long(long l) { m_Type = Integer; m_Value.i = l; };
+ inline void set_Boolean(bool l) { m_Type = Boolean; m_Value.b = l; };
+ inline void set_String(char *s) { m_Type = String ; m_Value.p = s; };
+ inline void set_UserData(void *_u) { m_Type = UserData; m_Value.p = _u; };
+ /* A Thread is a new Context */
+ inline void set_Thread(void *_u) { m_Type = Thread; m_Value.p = _u; };
+ inline void set_Pid(long _u) { m_Type = Pid; m_Value.i = _u; };
+ inline void set_Nil() { m_Type = Nil;};
+
+ /* Copy Operator ... */
+ LdsTypeValue &operator =(const LdsTypeValue &_rv)
+ { if ( this != &_rv)
+ {
+ m_Type = _rv.m_Type;
+ m_Value = _rv.m_Value;
+ } ;
+ return *this;
+ }
+
+ LdsTypeValue &operator =(int l )
+ { set_Integer(l); return *this;}
+
+ LdsTypeValue &operator =(const bool l )
+ { set_Boolean(l); return *this;}
+ /* Add some operators */
+
+ bool operator ==( LdsTypeValue &_rv)
+ { return get_Integer() == _rv.get_Integer();}
+
+ bool operator !=( LdsTypeValue &_rv)
+ { return get_Integer() != _rv.get_Integer();}
+
+ LdsTypeValue &operator !()
+ {
+ LdsTypeValue r;
+ switch (m_Type)
+ {
+ case Boolean: m_Value.b = ! m_Value.b;
+ std::cerr<<"LdsType !() Boolean "<<m_Value.b<<std::endl;
+ break;
+ case Integer: m_Value.i = ! m_Value.i;
+ std::cerr<<"LdsType !() Integer "<<m_Value.i<<std::endl;
+ break;
+ default:
+ std::cerr<<"LdsType !() Invalide type"<<std::endl;
+ }
+ return *this;
+ }
+
+ /// Logical And operator
+ LdsTypeValue operator &&( LdsTypeValue &_rv)
+ {
+ LdsTypeValue r;
+ switch (m_Type)
+ {
+ case Boolean: r.set_Boolean (get_Boolean() && _rv.get_Boolean()); return r;
+ case Integer: r.set_Integer (get_Integer() && _rv.get_Integer()); return r;
+ case String: r.set_Integer (get_Integer() && _rv.get_Integer()); return r;
+ case Pid: r.set_Integer (get_Integer() && _rv.get_Integer()); return r;
+ default: r.set_Integer (get_Integer() && _rv.get_Integer()); return r;
+ }
+ return r;
+ }
+ /// Logical Or operator
+ LdsTypeValue operator ||( LdsTypeValue &_rv)
+ {
+ LdsTypeValue r;
+ switch (m_Type)
+ {
+ case Boolean: r.set_Boolean (get_Boolean() || _rv.get_Boolean()); return r;
+ case Integer: r.set_Integer (get_Integer() || _rv.get_Integer()); return r;
+ case String: r.set_Integer (get_Integer() || _rv.get_Integer()); return r;
+ default: r.set_Integer (get_Integer() || _rv.get_Integer()); return r;
+ }
+ return r;
+ }
+
+ /// + operator
+ LdsTypeValue operator +( LdsTypeValue &_rv)
+ {
+ LdsTypeValue r;
+ switch (m_Type)
+ {
+ case Boolean: r.set_Boolean (get_Boolean() + _rv.get_Boolean()); return r;
+ case Integer: r.set_Integer (get_Integer() + _rv.get_Integer()); return r;
+ /* Contat String */
+ case String: r.set_Integer (get_Integer() + _rv.get_Integer()); return r;
+ default: r.set_Integer (get_Integer() + _rv.get_Integer()); return r;
+ }
+ return r;
+ }
+
+ /// - operator
+ LdsTypeValue operator -( LdsTypeValue &_rv)
+ {
+ LdsTypeValue r;
+ switch (m_Type)
+ {
+ case Boolean: r.set_Boolean (get_Boolean() - _rv.get_Boolean()); return r;
+ case Integer: r.set_Integer (get_Integer() - _rv.get_Integer()); return r;
+ /* Contat String */
+ case String: r.set_Integer (get_Integer() - _rv.get_Integer()); return r;
+ default: r.set_Integer (get_Integer() - _rv.get_Integer()); return r;
+ }
+ return r;
+ }
+ /// * operator
+ LdsTypeValue operator *( LdsTypeValue &_rv)
+ {
+ LdsTypeValue r;
+ switch (m_Type)
+ {
+ case Boolean: r.set_Boolean (get_Boolean() * _rv.get_Boolean()); return r;
+ case Integer: r.set_Integer (get_Integer() * _rv.get_Integer()); return r;
+ /* Contat String */
+ case String: r.set_Integer (get_Integer() * _rv.get_Integer()); return r;
+ default: r.set_Integer (get_Integer() * _rv.get_Integer()); return r;
+ }
+ return r;
+ }
+ /// > operator
+ LdsTypeValue operator >( LdsTypeValue &_rv)
+ {
+ LdsTypeValue r;
+ switch (m_Type)
+ {
+ case Boolean: r.set_Boolean (get_Boolean() > _rv.get_Boolean()); return r;
+ case Integer: r.set_Integer (get_Integer() > _rv.get_Integer()); return r;
+ /* Contat String */
+ case String: r.set_Integer (get_Integer() > _rv.get_Integer()); return r;
+ default: r.set_Integer (get_Integer() > _rv.get_Integer()); return r;
+ }
+ return r;
+ }
+ /// > operator
+ LdsTypeValue operator <( LdsTypeValue &_rv)
+ {
+ LdsTypeValue r;
+ switch (m_Type)
+ {
+ case Boolean: r.set_Boolean (get_Boolean() < _rv.get_Boolean()); return r;
+ case Integer: r.set_Integer (get_Integer() < _rv.get_Integer()); return r;
+ /* Contat String */
+ case String: r.set_Integer (get_Integer() < _rv.get_Integer()); return r;
+ default: r.set_Integer (get_Integer() < _rv.get_Integer()); return r;
+ }
+ return r;
+ }
+ /// > operator
+ LdsTypeValue operator <=( LdsTypeValue &_rv)
+ {
+ LdsTypeValue r;
+ switch (m_Type)
+ {
+ case Boolean: r.set_Boolean (get_Boolean() <= _rv.get_Boolean()); return r;
+ case Integer: r.set_Integer (get_Integer() <= _rv.get_Integer()); return r;
+ /* Contat String */
+ case String: r.set_Integer (get_Integer() <= _rv.get_Integer()); return r;
+ default: r.set_Integer (get_Integer() <= _rv.get_Integer()); return r;
+ }
+ return r;
+ }
+ /// > operator
+ LdsTypeValue operator >=( LdsTypeValue &_rv)
+ {
+ LdsTypeValue r;
+ switch (m_Type)
+ {
+ case Boolean: r.set_Boolean (get_Boolean() >= _rv.get_Boolean()); return r;
+ case Integer: r.set_Integer (get_Integer() >= _rv.get_Integer()); return r;
+ /* Contat String */
+ case String: r.set_Integer (get_Integer() >= _rv.get_Integer()); return r;
+ default: r.set_Integer (get_Integer() >= _rv.get_Integer()); return r;
+ }
+ return r;
+ }
+};
+
+
+/**
+ * LdsVm types and prototypes ....
+ */
+
+/* Stack Index */
+typedef LdsTypeValue *LdsStackId;
+
+/**
+ * Maybe String Type As String has comparison operator
+ *
+ */
+
+/**
+ * Generator should generate an array of the type below. It should be possible
+ * to retrieve the address of an element through this array.
+ * Maybe same technic as ddl type entry, fields
+ * BuiltInType[] = {
+ * { 0,0,"Nil",NULL,NULL}
+ * { 0,0,"Nil",NULL,NULL}
+ * } ;
+ */
+typedef struct LdsType {
+ long max_length;
+ size_t __lds_initial_value;
+ char *__lds_type_name; /* For Debug Purpose Type display name */
+ char *__lds_operators; /* Operators supported by the type */
+ char *__lds_codecs; /* Each type can be encoded and decoded ... */
+} LdsType;
+
+
+struct LdsFunctionProto {
+ unsigned char nbParams;
+ unsigned char isVaargs;
+ unsigned char nbLocVars;
+ unsigned char maxStackSize; /* Can be computed during compilation*/
+ int sizeconstant; /* Not sure for that */
+ int sizecode;
+ const char *fctName; /* NULL or Function Name */
+ /* May be it's better to use a global array for all constants as they
+ can be used somewhere else
+ */
+ LdsTypeValue *Constants; /* Array of Constants used by the function */
+ unsigned short *paramType; /* Array of types for each */
+ /* Missing Local vars, variables used outside the function scope eg
+ globals
+ */
+ // Defined in ldsvm.h to be moved
+ unsigned short *code;
+ //LdsInstruction *code;
+};
+
+struct LdsCFunctionProto {
+ unsigned char nbParams;
+ const char *fctName; /* NULL or Function Name */
+ void (* CFunction)(Context *);
+};
+
+
+struct LdsSignalProto {
+ unsigned char nbParams;
+ const char *fctName; /* NULL or Function Name */
+ void (* CFunction)(Context *);
+};
+
+#endif /*LDS_OBJECT_H*/
--- /dev/null
+#include <stdio.h>
+#include <iostream>
+#include <fstream>
+#include <queue>
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <ldsvm.h>
+
+
+
+#if 1
+#define LDSVM_LOG_DEBUG_FMT(x,args...) do { fprintf(_gLog,x "\n", args); fflush(_gLog);} while (0)
+#define LDSVM_LOG_DEBUG(x) do { fprintf(_gLog,"%s\n",x); fflush(_gLog); } while (0)
+#define LDSVM_LOG_INFO(x,args...) do { fprintf(_gLog,x "\n"); } while(0);
+#define LDSVM_LOG_ERROR_FMT(x,args...) fprintf(_gLog,x "\n",args )
+#else
+
+#define LDSVM_LOG_INFO(x ,args...) printf(x "\n")
+
+#define LDSVM_LOG_DEBUG_FMT(x,args...)
+#define LDSVM_LOG_DEBUG(x)
+#endif
+
+static FILE *_gLog = NULL;
+
+static void open_log(const std::string &fn) {
+ struct stat st;
+ // Check if _gLog directory exists
+ if (stat("log",&st) == -1 ) {
+#ifdef WIN32
+ mkdir("log");
+#else
+ mkdir("log",0777);
+#endif
+ }
+ //
+ std::string _gLogname("log/"); _gLogname.append(fn); _gLogname.append(".log");
+ if ( _gLog) {
+ std::cout<<"open_log "<<fn<<" already open ?"<<std::endl;
+ } else
+ _gLog = fopen(_gLogname.c_str(),"w");
+
+}
+
+static void close_log() {
+ if ( _gLog)
+ fclose(_gLog);
+ _gLog = NULL;
+}
+
+extern fct m_BuiltinOp[];
+
+static void _AEL_NOP(Context *_c)
+{
+ LDSVM_LOG_DEBUG("AEL_NOP");
+ _c->incIP();
+}
+
+static void _AEL_RETURN(Context *_c)
+{
+ LDSVM_LOG_DEBUG("AEL_RETURN");
+}
+
+/**
+ * Change State
+ */
+static void _AEL_ETAT(Context *_c)
+{
+ LDSVM_LOG_DEBUG_FMT("AEL_ETAT %ld",_c->getOpcode(_c->getIP()+1));
+ _c->setState(_c->getOpcode(_c->getIP() + 1));
+ _c->incIP(2);
+}
+
+static void _AEL_JUMP_PLUS(Context *_c)
+{
+ LDSVM_LOG_DEBUG_FMT("AEL_JUMP_PLUS %ld ",_c->getARG1());
+ _c->incIP(2 + _c->getOpcode(_c->getIP() + 1 ));
+}
+
+static void _AEL_JUMP_PLUS_IF(Context *_c)
+{
+ LDSVM_LOG_DEBUG_FMT("AEL_JUMP_PLUS_IF (%ld) (%ld) Accumulator (%ld)"
+ ,_c->getOpcode(_c->getIP())
+ ,_c->getOpcode(_c->getIP()+1)
+ ,_c->AccumulatorAsInt()
+ );
+ if (_c->AccumulatorAsInt() != 0)
+ {
+ _c->incIP(_c->getARG1());
+ } else {
+ _c->incIP(2);
+ }
+}
+
+static void _AEL_JUMP_PLUS_IF_NOT(Context *_c)
+{
+ if (! _c->AccumulatorAsInt()) {
+ LDSVM_LOG_DEBUG_FMT("AEL_JUMP_PLUS_IF_NOT %d %d"
+ ,_c->getOpcode(_c->getIP())
+ ,_c->getOpcode(_c->getIP()+1));
+ _c->incIP(2+_c->getOpcode(_c->getIP()+1));
+ } else {
+ LDSVM_LOG_DEBUG_FMT("AEL_JUMP_PLUS_IF_NOT %d %d accumulator %d"
+ ,_c->getOpcode(_c->getIP())
+ ,_c->getOpcode(_c->getIP()+1)
+ ,_c->AccumulatorAsInt());
+ _c->incIP(2);
+ }
+}
+
+static void _AEL_JUMP_MOINS(Context *_c)
+{
+ LDSVM_LOG_DEBUG_FMT("AEL_JMP_MOINS %ld",_c->getOpcode(_c->getIP()+1));
+ _c->decIP(_c->getARG1()-2);
+}
+
+/**
+ * Where do you JUMP ?
+ */
+static void _AEL_JUMP_IND(Context *_c)
+{
+ /* Place to jump is contained in Variable */
+ LDSVM_LOG_DEBUG_FMT("AEL_JMP_IND %ld %ld index %ld"
+ ,_c->getARG1()
+ ,_c->getARG2()
+ ,_c->Global(_c->getARG2()).get_Integer()
+ );
+ /* Jump constant + variabel */
+ long base = _c->getARG1() + 2*_c->Global(_c->getARG2()).get_Integer();
+ _c->incIP(3+base);
+}
+
+/**
+ * Jump into subroutine
+ * This typically, should create a new execution frame
+ */
+static void _AEL_JSR(Context *_c)
+{
+ LDSVM_LOG_DEBUG_FMT("AEL_JSR %ld",_c->getOpcode(_c->getIP()+1));
+ long fcti = _c->getARG1();
+ _c->incIP(2);
+ _c->precall(fcti,0);
+}
+
+/**
+ * Jump Subroutine Indirect, meanning, that the address of
+ * the function is contained in the FLAG
+ */
+static void _AEL_JSR_IND(Context *_c)
+{
+ LDSVM_LOG_DEBUG_FMT("AEL_JSR_IND %ld",_c->getOpcode(_c->getIP()+1));
+}
+
+/**
+ * Return from procedure call. This typically ends the current
+ * execution frame and returns to the caller.
+ */
+static void _AEL_RTS(Context *_c)
+{
+ LDSVM_LOG_DEBUG_FMT("AEL_RTS %ld",_c->getOpcode(_c->getIP()+1));
+ _c->postcall();
+}
+
+/**
+ * I should Check the Type of the object. (If It's a Timer,
+ * Set The Timer Or else set Register to 1.
+ */
+static void _AEL_SET(Context *_c)
+{
+ LDSVM_LOG_DEBUG_FMT("AEL_SET %ld",_c->getOpcode(_c->getIP()+1));
+ _c->Register(_c->getOpcode(_c->getIP()+1)) = 1;
+ _c->incIP(2);
+}
+
+/**
+ * Check Type
+ */
+static void _AEL_RESET(Context *_c)
+{
+ LDSVM_LOG_DEBUG_FMT("AEL_RESET %ld",_c->getOpcode(_c->getIP()+1));
+ _c->Register(_c->getOpcode(_c->getIP()+1)) = 0;
+ _c->incIP(2);
+}
+
+/**
+ * Save content of FLAG_GLOBAL into FLAG_XXX
+ */
+static void _AEL_CHARGE(Context *_c)
+{
+ switch (_c->getOpcodeModifier())
+ {
+ case STORE_MODIFIER_R:
+ LDSVM_LOG_DEBUG_FMT("AEL_CHARGE Reg(%ld) <- Acc %ld"
+ ,_c->getARG1()
+ ,_c->Accumulator().get_Integer());
+ _c->Register(_c->getOpcode(_c->getIP()+1)) = _c->Register(FLAG_GLOBAL);
+ break;
+ case STORE_MODIFIER_P:
+ LDSVM_LOG_DEBUG_FMT("AEL_CHARGE %ld modif:%ld TODO"
+ ,_c->getOpcode(_c->getIP()+1)
+ ,_c->getOpcodeModifier());
+ std::cerr<<"AEL_CHARGE TODO Store Parameter"<<std::endl;
+ break;
+ case STORE_MODIFIER_V:
+ LDSVM_LOG_DEBUG_FMT("AEL_CHARGE Global(%ld) <- Acc %ld"
+ ,_c->getARG1()
+ ,_c->Accumulator().get_Integer());
+ _c->Global(_c->getOpcode(_c->getIP()+1)) = _c->Register(FLAG_GLOBAL);
+ break;
+ case 0:
+ LDSVM_LOG_DEBUG_FMT("AEL_CHARGE modif:%ld Reg(%ld) <- Acc %ld"
+ ,_c->getOpcodeModifier()
+ ,_c->getARG1()
+ ,_c->AccumulatorAsInt()
+ );
+ _c->Register(_c->getOpcode(_c->getIP()+1)) = _c->Register(FLAG_GLOBAL);
+ break;
+ default:
+ std::cerr<<"AEL_CHARGE WRONG MODIFIER"<<std::endl;
+ ;
+ }
+ _c->incIP(2);
+}
+
+static void _AEL_TEST(Context *_c)
+{
+ switch (_c->getOpcodeModifier())
+ {
+ case STORE_MODIFIER_R:
+ /* Constant */
+ LDSVM_LOG_DEBUG_FMT("AEL_TEST Acc <- constant %ld"
+ , _c->getARG1()
+ );
+ _c->Accumulator().set_Integer( _c->getARG1());
+ break;
+ case STORE_MODIFIER_P:
+ LDSVM_LOG_ERROR_FMT("AEL_TEST PARAMETER Acc <- Global(%ld) Value %ld"
+ ,_c->getOpcode(_c->getIP()+1)
+ ,_c->Global(_c->getOpcode(_c->getIP()+1)).get_Integer());
+ _c->Accumulator() =
+ _c->m_Ef->getParam(_c->getARG(1));
+ break;
+ case STORE_MODIFIER_V:
+ LDSVM_LOG_DEBUG_FMT("AEL_TEST Acc <- Global(%ld) Value %ld"
+ ,_c->getOpcode(_c->getIP()+1)
+ ,_c->Global(_c->getOpcode(_c->getIP()+1)).get_Integer());
+
+ _c->Accumulator() = _c->Global(_c->getOpcode(_c->getIP()+1));
+ break;
+ case 0:
+ default:
+ LDSVM_LOG_DEBUG_FMT("AEL_TEST Acc <- Reg(%ld) Value %ld"
+ ,_c->getOpcode(_c->getIP()+1)
+ ,_c->Register(_c->getOpcode(_c->getIP()+1)).get_Integer());
+
+ _c->Accumulator() = _c->Register(_c->getOpcode(_c->getIP()+1));
+ ;
+ }
+
+ _c->incIP(2);
+}
+
+/**
+ * Send An Internal Event.
+ */
+static void _AEL_LOOP_MSG(Context *_c)
+{
+ static LdsMsg m(0,0);
+ m = LdsMsg(_c->getARG1(),0);
+ LDSVM_LOG_DEBUG_FMT("AEL_LOOP_MSG Signal %ld Missing Parameter handling",_c->getARG1());
+ /** What about the possible parameters ???? */
+ //_c->m_EventQueue.push(_c->getARG1());
+ _c->putMessage(&m);
+ _c->incIP(2);
+}
+
+static void _AEL_CALL(Context *_c)
+{
+ LDSVM_LOG_DEBUG_FMT("AEL_CALL %ld",_c->getOpcode(_c->getIP()+1));
+}
+
+/**
+ * Logical complement
+ */
+static void _AEL_COMPL(Context *_c)
+{
+ LDSVM_LOG_DEBUG_FMT("AEL_COMPL Reg(%ld) <- ! Reg(same)",_c->getARG1());
+ _c->Register(_c->getARG1()) =
+ ! _c->Register(_c->getARG1()) ;
+ _c->incIP(2);
+}
+
+
+static void _AEL_AND(Context *_c)
+{
+ LDSVM_LOG_DEBUG_FMT("AEL_AND Acc <- Reg(%ld) && Reg(%ld)",_c->getARG1(),_c->getARG2());
+ _c->Register(FLAG_GLOBAL) =
+ _c->Register(_c->getOpcode(_c->getIP()+1))
+ && _c->Register(_c->getOpcode(_c->getIP()+2)) ;
+ _c->incIP(3);
+}
+
+static void _AEL_OR(Context *_c)
+{
+ LDSVM_LOG_DEBUG_FMT("AEL_OR Acc <- Reg(%ld)",_c->getARG1());
+ _c->Register(FLAG_GLOBAL) =
+ _c->Register(_c->getARG1())
+ || _c->Register(_c->getARG2()) ;
+ _c->incIP(3);
+}
+
+static void _AEL_PLUS(Context *_c)
+{
+ LDSVM_LOG_DEBUG_FMT("AEL_PLUS Reg(%ld) + Reg(%ld)",_c->getARG1(),_c->getARG2());
+ _c->Accumulator() = _c->Register(_c->getARG1()) + _c->Register(_c->getARG2());
+ _c->incIP(3);
+}
+
+static void _AEL_MOIN(Context *_c)
+{
+ LDSVM_LOG_DEBUG_FMT("AEL_MOIN %ld Acc= %ld - %ld "
+ ,_c->getOpcode(_c->getIP()+1)
+ ,_c->Register(_c->getOpcode(_c->getIP()+1)).get_Integer()
+ ,_c->Register(_c->getOpcode(_c->getIP()+2)).get_Integer()
+ );
+ _c->Register(FLAG_GLOBAL) =
+ _c->Register(_c->getARG1()) - _c->Register(_c->getARG2()) ;
+ _c->incIP(3);
+}
+
+static void _AEL_MUL(Context *_c)
+{
+ LDSVM_LOG_DEBUG_FMT("AEL_MUL %ld",_c->getOpcode(_c->getIP()+1));
+ _c->incIP(3);
+}
+
+/* Compare Accumulator with FLAG -> Result In Accumulator */
+static void _AEL_CMP_EQ(Context *_c)
+{
+ LDSVM_LOG_DEBUG_FMT("AEL_CMP_EQ %ld CMP_EQ Reg(%ld)",_c->AccumulatorAsInt(),_c->getARG1());
+ _c->Accumulator() =
+ _c->Accumulator() == _c->Register(_c->getARG1()) ;
+}
+
+static void _AEL_CMP_NE(Context *_c)
+{
+ LDSVM_LOG_DEBUG_FMT("AEL_CMP_NE %ld CMP_NE Reg(%ld)",_c->AccumulatorAsInt(),_c->getARG1());
+ _c->Accumulator() =
+ _c->Accumulator() != _c->Register(_c->getARG1()) ;
+}
+
+static void _AEL_CMP_GT(Context *_c)
+{
+ LDSVM_LOG_DEBUG_FMT("AEL_CMP_GT %ld CMP_GT Reg(%ld)",_c->AccumulatorAsInt(),_c->getARG1());
+ _c->Accumulator() =
+ _c->Register(_c->getARG1()) > _c->Accumulator();
+}
+
+static void _AEL_CMP_LT(Context *_c)
+{
+ LDSVM_LOG_DEBUG_FMT("AEL_CMP_LT %ld CMP_LT Reg(%ld)",_c->AccumulatorAsInt(),_c->getARG1());
+ _c->Accumulator() =
+ _c->Register(_c->getARG1()) < _c->Accumulator();
+}
+
+static void _AEL_CMP_LE(Context *_c)
+{
+ LDSVM_LOG_DEBUG_FMT("AEL_CMP_LE %ld CMP_LE Reg(%ld)",_c->AccumulatorAsInt(),_c->getARG1());
+ _c->Accumulator() =
+ _c->Register(_c->getARG1()) <= _c->Accumulator();
+}
+
+static void _AEL_CMP_GE(Context *_c)
+{
+ LDSVM_LOG_DEBUG_FMT("AEL_CMP_GE %ld CMP_GE Reg(%ld)",_c->AccumulatorAsInt(),_c->getARG1());
+ _c->Accumulator() =
+ _c->Register(_c->getARG1()) >= _c->Accumulator();
+}
+
+static fct _EQ_OPS[] = {
+ NULL
+ ,_AEL_CMP_EQ
+ ,_AEL_CMP_NE
+ ,_AEL_CMP_GT
+ ,_AEL_CMP_LT
+ ,_AEL_CMP_LE
+ ,_AEL_CMP_GE
+};
+
+
+static void _AEL_EQU(Context *_c)
+{
+ LDSVM_LOG_DEBUG_FMT("AEL_EQU %ld %ld == %ld"
+ ,_c->getOpcode(_c->getIP()+1)
+ ,_c->Accumulator().get_Integer()
+ ,_c->Register(_c->getARG1()).get_Integer()
+ );
+ if (long m = _c->getOpcodeModifier())
+ {
+ if (_EQ_OPS[m])
+ _EQ_OPS[m](_c);
+ } else
+ {
+ _c->Accumulator() =
+ _c->Accumulator() == _c->Register(_c->getARG1()) ;
+ }
+ _c->incIP(2);
+}
+
+/**
+ * Send an Event From current To Dest
+ * Current and Test Are supposed to be Pid's ID
+ * AEL_OUTPUT Evt, From is Context *_c, To ? Event Can Have Parameters
+ */
+static void _AEL_OUTPUT(Context *_c)
+{
+ const LdsSignalProto *proto = &(_c->m_Signals[_c->getOpcode(_c->getIP()+1)]);
+ LDSVM_LOG_DEBUG_FMT("AEL_OUTPUT %ld nbParam=%u"
+ ,_c->getOpcode(_c->getIP()+1)
+ ,proto->nbParams
+ );
+ proto->CFunction(_c);
+ _c->incIP(2 + proto->nbParams);
+}
+
+/**
+ * Reseve Memory in Stack
+ */
+static void _AEL_ALLOCA(Context *_c)
+{
+ LDSVM_LOG_DEBUG_FMT("AEL_ALLOCA %ld",_c->getOpcode(_c->getIP()+1));
+ _c->incIP(3);
+}
+
+/**
+ * Extract Value From ...
+ */
+static void _AEL_EXTRACT(Context *_c)
+{
+ LDSVM_LOG_DEBUG_FMT("AEL_EXTRACT type %ld , Idx=%ld"
+ ,_c->getOpcode(_c->getIP()+1)
+ ,_c->getARG2()
+ );
+ _c->incIP(3);
+}
+
+static void _AEL_END(Context *_c)
+{
+ LDSVM_LOG_DEBUG_FMT("AEL_END SHOULD NEVER BE CALLED %ld",_c->getOpcode(_c->getIP()+1));
+}
+
+
+/**
+ * Context Methods implementation
+ */
+Context::Context(LdsAutomaton *_aut,const LdsFunctionProto *_act,
+ const LdsSignalProto *_sig) :
+ m_Automaton(_aut)
+ , m_Actions(_act)
+ , m_Signals(_sig)
+ , m_IP(0)
+ , m_CurrentState(0)
+ , m_Stack(NULL)
+{
+ initStack();
+ m_Ef = &m_InitialEf;
+ // The registers are below top
+ m_Ef->m_Top = &m_Stack[FLAG_END];
+ m_Ef->m_Base = &m_Stack[0];
+ m_Ef->m_SavedPc = m_Actions[0].code;
+ m_Ef->m_IP = const_cast<LdsInstruction *>(m_Actions[0].code);
+}
+
+Context::~Context()
+{
+ delete [] m_Stack;
+}
+
+void
+Context::initStack()
+{
+ m_Stack = new LdsTypeValue[ MAX_STACK_SIZE];
+ m_Top = &m_Stack[FLAG_END];
+ m_Globals = &m_Stack[FLAG_END];
+ for ( int i = 0 ; i < MAX_STACK_SIZE ; i++)
+ m_Stack[i].set_Nil();
+}
+/**
+ * Setup new execution Frame
+ */
+int Context::precall(int FctIdx,int nbResult)
+{
+ unsigned long _sem = m_Automaton->sem[FctIdx];
+ LdsExecFrame *nef = new LdsExecFrame(m_Ef,NULL);
+ /* LdsExecFrame constructor adds himself to the chained list
+ * Simply update m_Ef to the new Frame
+ */
+ //std::cout<<"Context::precall "<<FctIdx<<" m_Ef="<<m_Ef;
+ //std::cout<<" new EF="<<nef;
+ //std::cout<<" Params ="<<m_Actions[FctIdx].nbParams<<std::endl;
+ LDSVM_LOG_DEBUG_FMT("Context::precall FctIdx= %ld sem=%u , NO EVT Action.nbParams=%u"
+ ,FctIdx
+ ,_sem
+ , m_Actions[_sem].nbParams
+ );
+ m_Ef = nef;
+ setIP(FctIdx);
+ //setIP(_sem);
+ /* Save register */
+ /* Init stack index in new execution Frame */
+ return 0;
+}
+/**
+ *
+ */
+int Context::precall(int FctIdx,LdsMsg *evt,int nbResult)
+{
+ int i = 0;
+ unsigned long _sem = m_Automaton->sem[FctIdx];
+ const LdsSignalProto *proto = &(m_Signals[evt->getEvent()]);
+ LdsExecFrame *nef = new LdsExecFrame(m_Ef,NULL);
+ /* LdsExecFrame constructor adds himself to the chained list
+ * Simply update m_Ef to the new Frame
+ */
+ LDSVM_LOG_DEBUG_FMT("Context::precall FctIdx= %ld sem=%u ,EventId = %u Evt.nbParams=%ld Action.nbParams=%u"
+ ,FctIdx
+ ,_sem
+ ,evt->getEvent()
+ ,proto->nbParams
+ , m_Actions[_sem].nbParams
+ );
+ //std::cout<<"Context::precall MSG "<<FctIdx<<" m_Ef="<<m_Ef;
+ //std::cout<<" new EF="<<nef<<std::endl;
+ nef->m_Top = m_Ef->m_Top + m_Actions[FctIdx].nbParams;
+ m_Ef = nef;
+ // setIP(FctIdx);
+ setIP(_sem);
+ /* Save register */
+ /* Init stack index in new execution Frame */
+ //if (m_Actions[FctIdx].nbParams )
+ if (m_Actions[_sem].nbParams )
+ {
+ LDSVM_LOG_DEBUG_FMT("\tContext::precall copy %u parameters "
+ , m_Actions[_sem].nbParams
+ );
+ for (i = 0 ; i < m_Actions[_sem].nbParams ; i++)
+ {
+ m_Ef->m_Params[i] = &evt->m_Parameters[i];
+ }
+ m_Ef->m_nbParams = m_Actions[_sem].nbParams;
+ }
+ /* Copy Event Parameters in execution Stack*/
+ return 0;
+}
+
+/**
+ * Restore to previous Execution Frame
+ */
+int Context::postcall()
+{
+ // std::cout<<"Context::postCall "<<m_Ef<<std::endl;
+ LdsExecFrame *o = m_Ef;
+ m_Ef = o->m_Prev;
+ m_Ef->m_Next = NULL;
+ delete o;
+ return 0;
+}
+
+/**
+ *
+ */
+LdsTypeValue &
+Context::getCallParam(unsigned i)
+{
+ static LdsTypeValue v;
+ switch (getArgumentModifier(i))
+ {
+ case CP_MODIFIER_G:
+ /* Constant */
+ LDSVM_LOG_DEBUG_FMT("getCallParam Global paramIdx=%ld GVIdx= %ld"
+ , i
+ , getARG(i) & ~LDS_MODIFIER_MASK
+ );
+ return Global(getARG(i) & ~LDS_MODIFIER_MASK);
+ break;
+ case CP_MODIFIER_L:
+ LDSVM_LOG_ERROR_FMT("getCallParam Local (%ld) Value %ld"
+ ,i
+ ,getARG(i) & ~LDS_MODIFIER_MASK);
+ break;
+ case CP_MODIFIER_P:
+ LDSVM_LOG_ERROR_FMT("getCallParam Param (%ld) Value %ld"
+ ,i
+ ,getARG(i) & ~LDS_MODIFIER_MASK);
+ return m_Ef->getParam(getARG(i) & ~LDS_MODIFIER_MASK);
+
+ break;
+ case 0:
+ default:
+ LDSVM_LOG_ERROR_FMT("getCallParam Wrong Modifier (%ld) Value %ld"
+ , i
+ , getArgumentModifier(i)
+ );
+
+ ;
+ }
+ return v;
+}
+
+/**
+ * Put a Message in the message queue. Avoid accessing EventQueue directly
+ */
+void Context::putMessage(LdsMsg *m )
+{
+ // std::cout<<"putMessage TODO push msg"<<m->getEvent()<<std::endl;
+ m_EventQueue.push(m);
+}
+/**
+ * Return 1 when a message was available 0 otherwise
+ */
+int Context::getMessage(LdsMsg **m )
+{
+ if (m_EventQueue.empty())
+ {
+ // std::cout<<"getMessage TODO Empty ?= "<<m_EventQueue.empty()<<std::endl;
+ return 0;
+ }
+ //std::cout<<"getMessage evt="<<m_EventQueue.front()->getEvent()<<std::endl;
+ *m = m_EventQueue.front();
+ m_EventQueue.pop();
+ return 1 ;
+}
+
+/**********************************************
+ * ldsvm class Implementation
+ */
+void ldsvm::lookupRange(Context *_c,long &min,long &max)
+{
+ min = _c->m_Automaton->ptr[_c->getState()];
+ max = _c->m_Automaton->ptr[_c->getState()+1];
+}
+
+/**
+ * ldsvm class Implementation
+ */
+long ldsvm::lookupIdx(Context *_c,long event,long min,long max)
+{
+ long idx = min;
+ //long event = _c->m_EventQueue.front();
+ LDSVM_LOG_DEBUG_FMT("ldsvm::lookupIdx Begin event=%ld state=%d",event,_c->getState());
+ while ( (_c->m_Automaton->evt[idx] != event) && (idx <= max) )
+ {
+// LDSVM_LOG_DEBUG_FMT("ldsvm::lookupIdx event=%d val=%d",event,_c->m_Automanton[idx]);
+ idx++;
+ }
+ if (idx >= max)
+ {
+ return -1;
+ }
+ return idx;
+}
+
+
+/**
+ *
+ *
+ */
+void ldsvm::execute(Context *_c)
+{
+ LdsExecFrame *ef;
+ int protect = 100;
+ long min,max;
+ LdsMsg *msg;
+ while ( _c->getMessage(&msg) )
+ {
+ long opcode;
+ lookupRange(_c,min,max);
+
+ // Process event
+ long _event = msg->getEvent();
+
+ // Compute dest state
+ long idx = lookupIdx(_c,_event,min,max);
+ LDSVM_LOG_DEBUG_FMT("ldsvm::execute min=%ld,max=%ld,Idx=%ld,Event=%ld",min,max,idx,_event );
+ if ( idx == -1)
+ {
+ // Out of range exit or through an exception
+ std::cerr<<" Lookup Exit "<<_event<<" Out of range ["<<min<<".."<<max<<"]"<<idx<<std::endl;
+ break;
+ }
+ // Compute SEM position
+ _c->setIP(_c->m_Automaton->sem[idx]);
+ _c->setState(_c->m_Automaton->eta[idx]);
+ //
+ // std::cerr<<"\nldsvm::execute evt="<<_event<<" Idx="<<idx<<std::endl;
+ _c->precall(idx,msg,0);
+ // Loop over sem until RETURN
+ while ((opcode = _c->getOpcode()) != ::AEL_RETURN )
+ {
+ if (opcode >=0 && opcode < ::AEL_END)
+ {
+ // std::cout<<"Execute OP "<<opcode<<std::endl;
+ // Buildin opcode
+ (*(m_BuiltinOp[opcode]))(_c);
+ } else {
+ // Userdefined opcode C Function Call
+ // std::cout<<"Execute USER OP "<<opcode<<std::endl;
+ LdsCFunctionProto *act = _c->userAction(_c,opcode);
+ if (act && act->fctName)
+ {
+ LDSVM_LOG_DEBUG_FMT("ldsvm::execute C %s %ld",act->fctName,act->nbParams);
+ }
+ }
+ // Proctect against loops
+ if (! protect--)
+ {
+ std::cerr<<"ldsvm::execute Reached protected: Review code"<<std::endl;
+ break;
+ }
+ }
+ _c->postcall();
+ //std::cout<<std::endl;
+ //
+ }
+}
+
+
+/**
+ * Default Constructor
+ */
+ldsvm::ldsvm() {
+ open_log("ldsvm");
+ LDSVM_LOG_INFO("Init ldsvm()");
+ };
+
+#define OPCODE(NUM,OP,SIZE,CLASS) &_##OP ,
+fct m_BuiltinOp[] = {
+#include "ldsOpcode.h"
+ NULL
+};
+
+
+
--- /dev/null
+#ifndef LDSVM_H
+#define LDSVM_H
+#include <lds_object.h>
+#include <lds_msg.h>
+struct LdsMsg;
+typedef unsigned short LdsInstruction;
+enum OpCodes {
+ NullOpcode = -1
+#define OPCODE(NUM,OP,SIZE,CLASS) , OP
+#include "ldsOpcode.h"
+} ;
+#define LDS_MODIFIER_MASK 0xE000
+/* CALL PARAMETER Modifiers */
+#define CP_MODIFIER_START 13
+#define CP_MODIFIER_G 1
+#define CP_MODIFIER_L 2
+#define CP_MODIFIER_P 3
+/* CALL PARAMETER FROM GLOBAL VARIABLE*/
+#define CALL_PARAM_GV(i,v) CP_MODIFIER_G<<CP_MODIFIER_START | v
+/* CALL PARAMETER FROM LOCAL VARIABLE*/
+#define CALL_PARAM_LV(i,v) CP_MODIFIER_L<<CP_MODIFIER_START | i
+/* CALL PARAMETER FROM FUNCTION PARAM VARIABLE*/
+#define CALL_PARAM_PV(i,v) CP_MODIFIER_P<<CP_MODIFIER_START | i
+/* STORE LOAD Modifiers */
+#define STORE_MODIFIER_START 13
+#define STORE_MODIFIER_R 1
+#define STORE_MODIFIER_V 2
+#define STORE_MODIFIER_P 3
+/* Load constant into accumulator */
+#define LOADK(x) AEL_TEST | STORE_MODIFIER_R<<STORE_MODIFIER_START , x
+/* Load Global variable into accumulator */
+#define LOADV(x) AEL_TEST | STORE_MODIFIER_V<<STORE_MODIFIER_START , x
+/* Load Parameter Not sure about mask */
+#define LOADP(i,x) AEL_TEST | STORE_MODIFIER_P<<STORE_MODIFIER_START , i
+
+/* Store Accumulator into register x */
+#define STORE_R(x) AEL_CHARGE | STORE_MODIFIER_R<<STORE_MODIFIER_START , x
+/* Store Accumulator into global Variable x */
+#define STORE_V(x) AEL_CHARGE | STORE_MODIFIER_V<<STORE_MODIFIER_START , x
+/* Store Accumulator into Parameter Variable x */
+#define STORE_P(x) AEL_CHARGE | STORE_MODIFIER_P<<STORE_MODIFIER_START , x
+
+/**/
+#define EXTRACT(var,idx) AEL_EXTRACT , 1 , idx
+/* Missing some macro to create variables */
+
+/* COMPARE MACRO with modifier */
+#define MLDS_CMP_START 13
+#define MLDS_CMP_EQ 1
+#define MLDS_CMP_NE 2
+#define MLDS_CMP_GT 3
+#define MLDS_CMP_LT 4
+#define MLDS_CMP_LE 5
+#define MLDS_CMP_GE 6
+
+#define CMP_EQ(x) AEL_EQU | MLDS_CMP_EQ<<MLDS_CMP_START , x
+#define CMP_NE(x) AEL_EQU | MLDS_CMP_NE<<MLDS_CMP_START , x
+#define CMP_GT(x) AEL_EQU | MLDS_CMP_GT<<MLDS_CMP_START , x
+#define CMP_LT(x) AEL_EQU | MLDS_CMP_LT<<MLDS_CMP_START , x
+#define CMP_LE(x) AEL_EQU | MLDS_CMP_LE<<MLDS_CMP_START , x
+#define CMP_GE(x) AEL_EQU | MLDS_CMP_GE<<MLDS_CMP_START , x
+
+
+
+#define MIN_STACK_SIZE 20
+#define MAX_STACK_SIZE ( 2 * MIN_STACK_SIZE)
+#define CF_MAX_PARAMS 8
+
+enum {
+ FLAG_GLOBAL = 1
+ , FLAG_TMP_1
+ , FLAG_TMP_2
+ , FLAG_TMP_3
+ , FLAG_TMP_4
+ , FLAG_TMP_5
+ , FLAG_END = FLAG_TMP_5
+};
+
+typedef struct _Automaton
+{
+ unsigned short *ptr;
+ unsigned short t_ptr;
+ unsigned short *eta;
+ unsigned short t_eta;
+ unsigned short *evt;
+ unsigned short t_evt;
+ unsigned short *sem;
+ unsigned short t_sem;
+ unsigned short state;
+} LdsAutomaton ;
+
+
+/**
+ * Execution frame handles The current execution Context.
+ * Each time a function is called, we create a new Execution frame.
+ *
+ */
+struct LdsExecFrame
+{
+ LdsExecFrame *m_Prev,*m_Next;
+ /* Always initialize all attributes */
+ LdsExecFrame(LdsExecFrame *p = NULL,LdsExecFrame *n = NULL)
+ : m_Prev(p) , m_Next(n)
+ , m_Top(p?p->m_Top:NULL) ,m_Base(p?p->m_Base:NULL)
+ , m_SavedPc(NULL),m_IP(p?p->m_IP:NULL)
+
+ {
+ if (p && p->m_Next)
+ {
+ m_Next = p->m_Next;
+ p->m_Next = this;
+ m_Next->m_Prev = this;
+ } else if (p) {
+ p->m_Next = this;
+ }
+ }
+ /* Return parameter starting with Index 1*/
+ inline LdsTypeValue &getParam(long i)
+ {return *m_Params[ i -1 ]; }
+
+ /* Need Stack Pointer ...*/
+ LdsStackId m_Top; /* Stack Top for this function call */
+ LdsStackId m_Base;
+ LdsInstruction *m_IP; /* */
+ /* May be use it during the second step */
+ const LdsInstruction *m_SavedPc; /* Program counter value */
+ /* Need Pointer To global Context */
+ /* call status, In case of multithreaded frames */
+ /* Try this for parameter handling ...*/
+ LdsTypeValue *m_Params[CF_MAX_PARAMS];
+ long m_nbParams;
+};
+
+struct Context;
+typedef void (*fct)(Context *);
+/*
+* We need en execution context in order to be able to
+* have several objects running the same vm
+* We need an allocator class
+*/
+struct Context
+{
+ protected:
+ public:
+ typedef std::queue<LdsMsg *> EventQueue;
+
+ Context(LdsAutomaton *_aut,const LdsFunctionProto *_act,const LdsSignalProto *_sigs) ;
+
+ ~Context();
+
+ virtual LdsCFunctionProto* userAction(Context *_c,long opCode) { return NULL; };
+ inline void incIP(int i = 1) { m_Ef->m_IP += i; };
+ inline void decIP(int i = 1) { m_Ef->m_IP -= i; };
+ // Is a SEM entry point
+ inline void setIP(int i = 0)
+ {
+ m_Ef->m_IP = const_cast<LdsInstruction *>(m_Actions[i].code);
+ };
+
+ inline LdsInstruction *getIP(void ) { return m_Ef->m_IP; };
+
+ inline long getOpcode(LdsInstruction *IP) { return *IP ; };
+ inline long getOpcodeModifier() const
+ { return ((*m_Ef->m_IP) & LDS_MODIFIER_MASK)>>STORE_MODIFIER_START ; };
+ inline long getArgumentModifier(int _paramIdx) const
+ { return ((*(m_Ef->m_IP+_paramIdx)) & LDS_MODIFIER_MASK)>>STORE_MODIFIER_START ; };
+
+ inline long getOpcode()
+ { return *(m_Ef->m_IP) & 0x1FFF ; };
+
+ inline void setState( long state ) { m_CurrentState = state; };
+ inline long getState( void ) { return m_CurrentState ; };
+ inline long &AccumulatorAsInt() { return m_Stack[FLAG_GLOBAL].get_Integer(); };
+ inline LdsTypeValue &Register(long reg) { return m_Stack[reg]; };
+ inline LdsTypeValue &Accumulator() { return m_Stack[FLAG_GLOBAL]; };
+ inline LdsTypeValue &Global(unsigned i) { return m_Globals[i];}
+ inline long getARG1() const { return *(m_Ef->m_IP+1); };
+ inline long getARG2() const { return *(m_Ef->m_IP+2); };
+ inline long getARG3() const { return *(m_Ef->m_IP+3); };
+ inline long getARG(int _paramIdx) const { return *(m_Ef->m_IP+_paramIdx); };
+ // Retrieve Call Parameter for Given Parameter Index
+ LdsTypeValue &getCallParam(unsigned i);
+ // For better message processing
+ /// Put a Message in the message queue. Avoid accessing EventQueue directly
+ void putMessage(LdsMsg *m ) ;
+ /// Return 1 when a message was available 0 otherwise
+ int getMessage(LdsMsg **m ) ;
+ // Context Attributes
+ LdsInstruction *m_IP; // Instruction pointer
+ LdsExecFrame m_InitialEf; // Initial Execution Frame
+ LdsExecFrame *m_Ef; // Current Execution Frame
+ LdsStackId m_Stack; // Push Pop
+ LdsStackId m_Top; // Top of the Stack
+ LdsStackId m_Globals; // Where global Variables start in stack
+ long m_CurrentState;
+ LdsAutomaton *m_Automaton;
+ EventQueue m_EventQueue;
+ // Version 1 of automaton description
+ const LdsFunctionProto *m_Actions;
+ const LdsSignalProto *m_Signals;
+
+ /**
+ * Setup new execution Frame
+ */
+ /**
+ * Function invoked when ever a function call is required.
+ * If it's a user defined function, a c function.
+ * In case of LdsFunction, create a new ExecutionFrame
+ */
+ int precall(int FctIdx,int nbResult);
+ int precall(int FctIdx,LdsMsg *evt,int nbResult);
+ /**
+ * Restore to previous Execution Frame
+ */
+ int postcall();
+ protected:
+ void initStack();
+
+};
+
+
+/**
+ * Generic lds vm with builtin instructions.
+ */
+class ldsvm
+{
+ public:
+#define LDSVM_CALL_MEMBER(obj,ptrMbr) ((obj.)*(ptrMbr))
+#define LDSVM_CALL_STATIC_MEMBER(ptrMbr) (*(ptrMbr))
+
+ /**
+ * Creation of the Virtual Machine.
+ *
+ */
+ ldsvm() ;
+
+ ~ldsvm() {};
+
+ void execute(Context *_c);
+ protected:
+ // May this should be protected
+ void lookupRange(Context *,long &min,long &max);
+ //
+ long lookupIdx(Context *,long _ev,long min,long max);
+ /**
+ * Function invoked when ever a function call is required.
+ * If it's a user defined function, a c function.
+ * In case of LdsFunction, create a new ExecutionFrame
+ */
+};
+
+
+#define EXPORT_LDSVM_AUTOMATON(name,class,stub ) \
+ extern "C" { \
+ stub *create_agent_##name(ldsvm &vm) \
+ { \
+ return new class(vm) ; \
+ } \
+ }
+
+/**
+ * vim: et sw=2 ts=2 list:
+ */
+#endif
--- /dev/null
+automaton test_if_else1 is
+ state ST_BEGIN accept
+
+ when EVT_A => same
+ begin
+ IF TEST_IF THEN
+ AEL_DO_TRUE ;
+ ELSE
+ AEL_DO_TRUE1 ;
+ END IF;
+ end EVT_START;
+
+
+ end state ST_BEGIN;
+
+end automaton test_ ;
+
--- /dev/null
+automaton test_if_else2 is
+ state ST_BEGIN accept
+
+ when EVT_A => same
+ begin
+ IF TEST_IF THEN
+ AEL_DO_TRUE ;
+ if ( not AEL_DEDE()) then
+ AEL_LastError ; /* Do Poll Error*/
+ end if;
+ AEL_DO_AIF ;
+ ELSE
+ AEL_DO_TRUE1 ;
+ END IF;
+ AEL_TODO_ALL_THE_TIME;
+ end EVT_START;
+
+
+ end state ST_BEGIN;
+
+end automaton test_ ;
+
--- /dev/null
+#include <iostream>
+#include <fstream>
+#include <queue>
+#include <memory>
+#include <string.h>
+
+
+/* Networking */
+#include <ldsvm.h>
+
+#include <test_expr.h>
+
+class TCExpr : public test_expr_stub
+{
+ public:
+ TCExpr(ldsvm &_vm) : test_expr_stub(_vm)
+ { }
+
+};
+
+int main(int argc,char **argv)
+{
+ long l = 1;
+ ldsvm vm;
+ //test_equal_stub te;
+ TCExpr te(vm);
+ te.signal_EVT_STEP(l);
+ vm.execute(&te);
+}
--- /dev/null
+automaton test_expr is
+
+syntype uchar = Integer default 0 constants >= 0 endsyntype uchar;
+syntype ushort = Integer default 0 constants >= 0 endsyntype ushort;
+
+value type infoArray512 inherits Array <512,uchar>;
+value type infoArray516 inherits Array <516,uchar>;
+
+dcl FLG_A Integer;
+dcl FLG_B Integer;
+dcl FLG_Result Integer;
+
+dcl GVal infoArray512;
+signal EVT_STEP(Integer);
+
+ state ST_IDLE accept
+
+ when EVT_STEP(Val) => ST_STEP1
+ begin
+ FLG_A := 4; FLG_B := 10;
+ FLG_Result := FLG_A + FLG_B;
+ IF FLG_Result = 14
+ THEN
+ OUTPUT EVT_STEP(FLG_Result);
+ ELSE
+ GOTO ST_END;
+ END IF;
+ end EVT_START;
+
+ when EVT_FAIL => same
+ begin
+ end EVT_CONT;
+
+ end state ST_IDLE;
+
+ state ST_STEP1 accept
+ when EVT_STEP(Val) => ST_END
+ begin
+ FLG_A := Val;
+ FLG_B := GVal[2];
+ Gval[1] := 1;
+ output EVT_STEP(FLG_1);
+ end EVT_CONT;
+ end state ST_STEP1;
+
+ state ST_END accept
+ when EVT_STEP(Val) => ST_END
+ begin
+ message('end');
+ end EVT_STEP;
+ end state ST_END;
+end automaton test_expr ;
+
+
+
--- /dev/null
+PROJECT(lds-test)
+
+IF(${CMAKE_BUILD_TYPE} EQUAL "Debug")
+ SET(GENAUT_OPT "-d8")
+ELSE(${CMAKE_BUILD_TYPE} EQUAL "Debug")
+ SET(GENAUT_OPT "-d2")
+ENDIF(${CMAKE_BUILD_TYPE} EQUAL "Debug")
+
+
+INCLUDE_DIRECTORIES(${CMAKE_CURRENT_BINARY_DIR})
+INCLUDE_DIRECTORIES(${CMAKE_CURRENT_SOURCE_DIR})
+INCLUDE_DIRECTORIES(${aebutils_SOURCE_DIR})
+# For option...
+INCLUDE_DIRECTORIES(${aebutils_SOURCE_DIR}/aeb)
+INCLUDE_DIRECTORIES(${genaut_SOURCE_DIR}/common/include/IR)
+INCLUDE_DIRECTORIES(${genaut_SOURCE_DIR}/lds/runtime)
+
+INCLUDE(${rules_SOURCE_DIR}/flex.cmake)
+ADD_DEFINITIONS(-DWITH_DEFINE_EXTERNAL_AEL -DWITH_DEFINE_EXTERNAL_FLAGS)
+
+SET_DIRECTORY_PROPERTIES(PROPERTIES
+ ADDITIONAL_MAKE_CLEAN_FILES "${CMAKE_CURRENT_BINARY_DIR}/*.aac *act *.evt *trc"
+ )
+
+MACRO(TESTLDS ifile ofile exc)
+
+ADD_CUSTOM_COMMAND(
+ SOURCE ${ifile}
+ COMMAND ${CMAKE_CURRENT_BINARY_DIR}/../genaut
+ ARGS -I ${CMAKE_CURRENT_SOURCE_DIR}/ -o . ${GENAUT_OPT} -G lpcm1 -f ${ifile}
+ OUTPUT ${ofile}.aac
+ DEPENDS ${CMAKE_CURRENT_SOURCE_DIR}/${ifile}
+ ${CMAKE_CURRENT_BINARY_DIR}/../genaut
+ COMMENT "genaut lpcm1 files ${ifile} generate ${ofile}")
+
+SET_SOURCE_FILES_PROPERTIES(${CMAKE_CURRENT_BINARY_DIR}/${ofile}.cpp GENERATED)
+SET_SOURCE_FILES_PROPERTIES(${CMAKE_CURRENT_BINARY_DIR}/${ofile}.aac GENERATED)
+SET_SOURCE_FILES_PROPERTIES(${CMAKE_CURRENT_BINARY_DIR}/${ofile}.eta GENERATED)
+SET_SOURCE_FILES_PROPERTIES(${CMAKE_CURRENT_BINARY_DIR}/${ofile}.evt GENERATED)
+SET_SOURCE_FILES_PROPERTIES(${CMAKE_CURRENT_SOURCE_DIR}/${exc}.cpp OBJECT_DEPENDS ${CMAKE_CURRENT_BINARY_DIR}/${ofile}.aac)
+
+ADD_EXECUTABLE(${exc}
+ ${exc}.cpp
+ ${CMAKE_CURRENT_BINARY_DIR}/${ofile}.cpp
+ )
+TARGET_LINK_LIBRARIES(${exc} ldsrt)
+
+ENDMACRO(TESTLDS ifile ofile)
+
+
+
+# SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -D__FILENAME__='\"$(subst ${CMAKE_CURRENT_SOURCE_DIR}/,,$<)\"'")
+
+ADD_CUSTOM_COMMAND(
+ SOURCE tftp.lds
+ COMMAND ${CMAKE_CURRENT_BINARY_DIR}/../genaut
+ ARGS -I ${CMAKE_CURRENT_SOURCE_DIR}/ -o . -G lpcm1 -f tftp.lds
+ OUTPUT tftpclient.aac
+ DEPENDS ${CMAKE_CURRENT_SOURCE_DIR}/tftp.lds
+ ${CMAKE_CURRENT_BINARY_DIR}/../genaut
+ COMMENT "genaut process tftp.lds to tftpclient.aac"
+)
+
+SET_SOURCE_FILES_PROPERTIES(${CMAKE_CURRENT_BINARY_DIR}/tftpclient.cpp GENERATED)
+SET_SOURCE_FILES_PROPERTIES(${CMAKE_CURRENT_BINARY_DIR}/tftpclient.aac GENERATED)
+
+SET_SOURCE_FILES_PROPERTIES(${CMAKE_CURRENT_SOURCE_DIR}/tftp-client.cpp OBJECT_DEPENDS ${CMAKE_CURRENT_BINARY_DIR}/tftpclient.aac)
+
+ADD_EXECUTABLE(tftp-client
+ tftp-client.cpp
+ ${CMAKE_CURRENT_BINARY_DIR}/tftpclient.cpp
+ )
+TARGET_LINK_LIBRARIES(tftp-client ldsrt)
+#
+# tftp server library + example
+#
+ADD_CUSTOM_COMMAND(
+ SOURCE tftps.lds
+ COMMAND ${CMAKE_CURRENT_BINARY_DIR}/../genaut
+ ARGS -I ${CMAKE_CURRENT_SOURCE_DIR}/ -o . -G lpcm1 -f ../automatons/tftps.lds
+ OUTPUT tftps.aac
+ DEPENDS ${CMAKE_CURRENT_SOURCE_DIR}/../automatons/tftps.lds
+ ${CMAKE_CURRENT_BINARY_DIR}/../genaut
+)
+
+SET_SOURCE_FILES_PROPERTIES(${CMAKE_CURRENT_BINARY_DIR}/tftps.cpp GENERATED)
+SET_SOURCE_FILES_PROPERTIES(${CMAKE_CURRENT_BINARY_DIR}/tftps.aac GENERATED)
+
+SET_SOURCE_FILES_PROPERTIES(${CMAKE_CURRENT_SOURCE_DIR}/tftp-server.cpp
+ OBJECT_DEPENDS ${CMAKE_CURRENT_BINARY_DIR}/tftps.aac)
+
+ADD_EXECUTABLE(tftp-server
+ tftp-server.cpp
+ ${CMAKE_CURRENT_BINARY_DIR}/tftps.cpp
+ )
+TARGET_LINK_LIBRARIES(tftp-server ldsrt)
+
+ADD_EXECUTABLE(sizes
+ sizes.cpp
+ )
+TARGET_LINK_LIBRARIES(sizes ldsrt)
+
+TESTLDS(acse.lds acse tacse)
+TESTLDS(equal.lds test_equal tequal)
+TESTLDS(test_while.lds test_while twhile)
+TESTLDS(30_test_expr.lds test_expr 30_test_expr)
+
+TESTLDS(../automatons/cmdown_maint.lds cmdown_maint cmdown)
--- /dev/null
+--
+-- Andre Ebersold
+-- Attempt to make a little model for ACSE
+--
+automaton acse is
+
+-- event or signal ...
+-- evtOnPDU(ACSE_apdu),evtOnAARQ(AARQ_apdu),evtOnAARE(AARE_apdu),evtOnRLRQ(RLRQ_apdu),evtOnRLRE(RLRE_apdu),evtOnABRT(ABRT_apdu)
+--
+-- LOOP_MSG sends an internal msg event.
+-- events can have parameters. This should be possible
+--
+-- Maybe the task should be able to take parameters as well. Ex PDU
+-- Waiting for the real definition
+syntype ACSE_apdu = Integer endsyntype;
+syntype AARQ_apdu = Integer endsyntype;
+syntype AARE_apdu = Integer endsyntype;
+syntype RLRQ_apdu = Integer endsyntype;
+syntype RLRE_apdu = Integer endsyntype;
+syntype RLEQ_apdu = Integer endsyntype;
+syntype ABRT_apdu = Integer endsyntype;
+syntype ACSE_data = Integer endsyntype;
+signal evtOnPDU(ACSE_apdu),evtOnAARQ(AARQ_apdu),evtOnAARE(AARE_apdu),evtOnRLRQ(RLRQ_apdu),evtOnRLRE(RLRE_apdu),evtOnABRT(ABRT_apdu)
+ , evtOnRLEQ(RLEQ_apdu) ;
+signal evtData(ACSE_data);
+
+dcl PDU Integer;
+
+gate lower2acse in with evtOnPDU out with evtData;
+--
+-- Task Should have PDU as Parameter
+--
+task ProcessPDU is
+begin
+ case PDU
+ do -- 0 : AARQ
+ AEL_PPDU_AARQ ;
+ -- AEL_LOOP_MSG(evtOnAARQ);
+ -- As evtOnAARQ takes a parameter, I should use
+ PDU := 2;
+ OUTPUT evtOnAARQ(PDU);
+ do -- 1 : AARE
+ AEL_PPDU_AARE ;
+ -- AEL_LOOP_MSG(evtOnAARE);
+ OUTPUT evtOnAARE(PDU);
+ do -- 2 : RLRQ
+ AEL_PPDU_RLRQ ;
+ -- AEL_LOOP_MSG(evtOnRLRQ);
+ OUTPUT evtOnRLRQ(PDU);
+ do -- 3 : RLRE
+ AEL_PPDU_RLRE ;
+ --AEL_LOOP_MSG(evtOnRLRE);
+ OUTPUT evtOnRLRE(PDU);
+ do -- 4 : ABRT
+ AEL_LOOP_MSG(evtOnABRT);
+ OUTPUT evtOnABRT(PDU);
+ end case;
+end task ProcessPDU ;
+
+task T1 is
+begin
+ AEL_DO_T1;
+ -- AEL_LOOP_MSG(evtOnPDU);
+end task T1;
+
+task T2 is
+begin
+ AEL_DO_T2;
+ -- AEL_LOOP_MSG(evtOnPDU);
+end task T2;
+--
+-- Idle State
+--
+state Idle accept
+ when evtOnPDU(evtParam) => AwaitingPdu
+ begin
+ execute ProcessPDU ;
+ end evtOnPDU;
+ when evtOnAARE(aare) => same
+ begin
+ ALE_evt_AARE_IDLE_KO;
+ end evtOnAARE;
+end state Idle;
+
+--
+-- Awaiting PDU
+--
+state AwaitingPdu accept
+
+ when evtOnPDU(evt) => same
+ begin
+ execute ProcessPDU ;
+ end evtOnPDU;
+ --
+ when evtOnAARQ(aarq) => AwaitingAssociationResponse
+ begin
+ PDU := 1;
+ if test PDU then
+ -- if TEST PDU then
+ begin
+ DO_PDU_SET;
+ execute T1;
+ end;
+ else
+ DO_PDU_NOT_SET;
+ execute T2;
+ goto Idle;
+ end if ;
+ end evtOnAARQ;
+ --
+ when evtOnAARE(aare) => Associated
+ begin
+ if aare.failed then
+ goto Idle ;
+ end if;
+ end evtOnAARE;
+ --
+ when evtOnRLEQ(_v) => AwaitingAssociationResponse
+ begin
+ if (test PDU) then
+ goto Idle;
+ end if;
+ end evtOnRLRQ;
+ --
+ when evtOnRLRE(rlre) => AwaitingAssociationResponse
+ begin
+ AEL_AWAITING_GOTRLRE;
+ end evtOnRLRE;
+ --
+ when evtOnABRT(abrt) => Idle
+ begin
+ end evtOnABRT;
+end state Starting;
+
+state AwaitingAssociationResponse accept
+ -- default processing case
+ when evtOnPDU => same
+ begin
+ execute ProcessPDU ;
+ end evtOnPDU;
+ --
+ when evtOnAARE(aare) => Associated
+ begin
+ PDU := 2;
+ AEL_DO_AARE(aare);
+ end evtOnAARE;
+end state AwaitingAssocitationResponse;
+
+state Authenticating accept
+ -- default processing case
+ when evtOnPDU(pdu) => same
+ begin
+ execute ProcessPDU ;
+ end evtOnPDU;
+ --
+ when evtOnAARE(aare) => Associated
+ begin
+ if Authenticated(aare) then
+ if ( not DoPoll()) then
+ LastError ; /* Do Poll Error*/
+ end if;
+ else
+ DoLogin;
+ end if;
+ if Authenticated(PDU) then
+ ALE_YES;
+ end if;
+ DoPoll ;
+ end Ok;
+
+end state Authentication;
+
+
+state Associated accept
+ -- default processing case
+ when evtOnPDU(pdu) => same
+ begin
+ if ( PDU /= 2) then
+ execute ProcessPDU ;
+ end if;
+ if (PDU /= 3) then
+ execute ProcessPDU ;
+ AThen2;
+ end if;
+ end evtOnPDU;
+ --
+ when evtOnRLRQ(rlrq) => same
+ begin
+ PDU := 3;
+ AEL_DO_IN_ASSOX_RLRQ(rlrq);
+ end evtOnRLRQ;
+ --
+ when evtOnRLRE(rlre) => same
+ begin
+ AEL_DO_IN_ASSOX_RLRE;
+ end evtOnRLRQ;
+ --
+ when evtOnABRT(abrt) => Idle
+ begin
+ end evtOnABRT;
+ --
+ when evtOnAARQ(aarq) => same
+ begin
+ end evtOnAARQ;
+end state Associated;
+
+end automaton acse;
--- /dev/null
+automaton betfan is
+
+
+state Init accept
+ when DoStart => Starting
+ begin
+ DoReadConfig ;
+ FirstRequest ;
+ end DoStart;
+
+end state Init;
+
+state Starting accept
+
+ when Error => FailExit
+ begin
+ CloseSplash;
+ end Error ;
+
+ when Ok => Authenticating
+ begin
+ if (not AutoLogin ) then
+ Show(true);
+ end if;
+ end Ok;
+end state Starting;
+
+state FailExit accept
+ when Exit => FinalQuit
+ begin
+ end Exit;
+
+end state FailExit;
+
+state Authenticating accept
+
+ when Ok => Running
+ begin
+ if Authenticated then
+ StoreCredentialsInConfig;
+ Show(false) ;
+ CloseSplash;
+ if ( not DoPoll) then
+ LastError ; /* Do Poll Error*/
+ end if;
+ else
+ DoLogin;
+ end if;
+
+ DoPoll ;
+
+ end Ok;
+
+ when Advertise => Advertising
+ begin
+ ShowAd;
+ end Advertise;
+
+end state Authentication;
+
+
+state Advertising accept
+
+ when Ok => same
+ begin
+ if (Authenticated ) then
+ StoreCredentialsInConfig;
+ Show(false);
+ CloseSplash;
+ if ( not DoPoll ) then
+ LastError ; /* Do Poll Failed*/
+ end if;
+ goto Running;
+ else
+ DoLogin ;
+ end if;
+ end Ok;
+
+ when Error => FailRetry
+ begin
+ if AutoLogin then
+ EraseCredentialsInConfig ;
+ show(true) ;
+ end if;
+ end Error;
+
+ when Exit => Running
+ begin
+ if not DoPoll then
+ end if;
+ end Exit;
+
+
+end state Advertising;
+
+state FailRetry accept
+
+ when Ok => same
+ begin
+ end Ok;
+
+ when Error => FinalQuit
+ begin
+ end Error;
+
+end state FailRetry;
+
+state Running accept
+
+ when Ok => same
+ begin
+ end Ok;
+
+ when Exit => Closing
+ begin
+ end Exit;
+
+ when Error => FailRetry
+ begin
+ end Error;
+
+
+end state Running;
+
+state Closing accept
+
+end state Closing;
+
+state FinalQuit accept
+end state FinalQuit;
+
+end automaton betfan;
--- /dev/null
+#include <iostream>
+#include <fstream>
+#include <queue>
+#include <memory>
+#include <string.h>
+
+
+/* Networking */
+#include <ldsvm.h>
+
+#include <cmdown_maint.h>
+//#include <cmdown_maint.eta>
+
+
+class cmDownImpl : public cmdown_maint_stub
+{
+ int st ;
+ public:
+ cmDownImpl(ldsvm &_vm) : cmdown_maint_stub(_vm)
+ {
+ getKO() = 0;
+ getOK() = 1;
+ getLOGIN_PH() = 0;
+ getDOWN() = 1;
+ getTRANSFER() = 2;
+ getSWAP() = 3;
+ getPLUGIN() = 4;
+ getCONFIG_RC_FILE() = "config.rc";
+ getDELTA_RC_FILE() = "config.delta.rc";
+ getNEW_CONF_RC_FILE() = "config.new.rc";
+ }
+
+ void AEL_HARD_ANOImpl(long &_s)
+ {
+ st = _s;
+ std::cout<<"AEL_HARD_ANO "<<_s<<std::endl;
+ }
+ void AEL_CHECK_DOWN_ALLOWEDImpl()
+ {
+ std::cout<<"AEL_CHECK_DOWN_ALLOWD ARG1 "<<st<<std::endl;
+ Accumulator() = st;
+ }
+ void AEL_PARSEImpl(char *&conf)
+ {
+ std::cout<<"AEL_PARSE <"<<conf<<"> return 1 ok"<<std::endl;
+ Accumulator() = 1;
+ }
+ void AEL_SEND_STATUSImpl(long &_down,long &ph)
+ {
+ const char *st[] = {"LOGIN","DOWN","TRANSFER","SWAP","PLUGIN"};
+ std::cout<<"AEL_SEND_STATUS "<<st[_down]<<","<<ph<<std::endl;
+ }
+};
+
+void test(ldsvm &vm,long var)
+{
+ std::cout<<"\n* Launch Status ="<<var<<"\n\n";
+ cmDownImpl te(vm);
+ //te.setState(STA_IDLE);
+ //te.setState(1);
+ te.setState(0);
+ te.signal_EVT_LOGIN(var);
+ vm.execute(&te);
+ if (var) {
+ std::cout<<"* Trigger EVT_PLUGIN"<<std::endl;
+ te.signal_EVT_PLUGIN(var);
+ vm.execute(&te);
+ std::cout<<"* Trigger EVT_DELTA_CONFIG state ="<<te.getState()<<std::endl;
+ te.signal_EVT_DELTA_CONFIG();
+ vm.execute(&te);
+ std::cout<<"* Trigger EVT_NEW_CONFIG state="<<te.getState()<<std::endl;
+ te.signal_EVT_NEW_CONFIG();
+ vm.execute(&te);
+ } else
+ {
+ te.signal_EVT_INCOMING_FILE();
+ vm.execute(&te);
+ te.signal_EVT_MAX_WAIT_LOGOUT();
+ vm.execute(&te);
+ }
+}
+
+int main(int argc,char **argv)
+{
+ long var = 0;
+ ldsvm vm;
+ //cmdown_maint_stub te;
+ test(vm,0);
+ test(vm,1);
+}
--- /dev/null
+automaton test_equal is
+
+syntype uchar = Integer default 0 constants >= 0 endsyntype uchar;
+syntype ushort = Integer default 0 constants >= 0 endsyntype ushort;
+
+value type infoArray512 inherits Array <512,uchar>;
+value type infoArray516 inherits Array <516,uchar>;
+
+dcl FLG_TEST Integer;
+dcl FLG_TEST1 Integer;
+dcl GVal infoArray512;
+signal EVT_CONT(Integer);
+
+ state ST_BEGIN accept
+
+ when EVT_START => same
+ begin
+ FLG_TEST := 1;
+ IF AEL_TEST_USER = 5
+ THEN
+ AEL_DO(FLG_TEST);
+ goto ST_RIEN;
+ END IF;
+ IF TEST FLG_TEST
+ THEN
+ FLG_TEST := 10 ;
+ goto ST_RIEN;
+ END IF;
+ IF AEL_1() AND AEL_2()
+ THEN
+ goto ST_RIEN;
+ END IF;
+ OUTPUT EVT_CONT(FLG_TEST);
+ end EVT_START;
+
+ when EVT_CONT(Val) => same
+ begin
+ AEL_DO(Val);
+ AEL_EVT_CONT_IN_BEGIN ;
+ end EVT_CONT;
+
+ end state ST_BEGIN;
+
+ state ST_RIEN accept
+ when EVT_CONT(Val) => ST_BEGIN
+ begin
+ AEL_DO(Val);
+ FLG_TEST := 4;
+ -- Constant Parameter (Expr does not work yet)
+ -- output EVT_CONT(1);
+ output EVT_CONT(FLG_TEST);
+ FLG_TEST := Val;
+ AEL_CALL_EVAL(Val);
+ FLG_TEST1 := GVal[2];
+ Gval[1] := 1;
+ end EVT_CONT;
+ end state ST_RIEN;
+end automaton test_ ;
+
--- /dev/null
+#ifndef LDSVM_VAR_H
+#define LDSVM_VAR_H
+
+template <typename T>
+struct typeTraits
+{
+ typedef T type;
+ typedef T* pointer;
+ typedef const T const_type;
+ typedef T & reference;
+ typedef const T& const_reference;
+};
+
+template <typename T>
+struct typeTraits<const T>
+{
+ typedef T type;
+ typedef T* pointer;
+ typedef const T const_type;
+ typedef T & reference;
+ typedef const T& const_reference;
+};
+
+template <typename T>
+struct typeTraits<T&>
+{
+ typedef T type;
+ typedef T* pointer;
+ typedef const T const_type;
+ typedef T & reference;
+ typedef const T& const_reference;
+};
+
+template <typename T>
+struct typeTraits<const T&>
+{
+ typedef T type;
+ typedef T* pointer;
+ typedef const T const_type;
+ typedef T & reference;
+ typedef const T& const_reference;
+};
+
+
+/**
+ * This class represents a variable. To make it simple
+ * let's just say it's a container that can hold any type
+ *
+ * -Should also support ==, + - * / operators
+ */
+class Variant
+{
+ /**
+ * For auto_ptr
+ */
+ struct AbstractContainer
+ {
+ virtual ~AbstractContainer() {}
+ };
+ // Container
+ template<class T>
+ struct Container : public AbstractContainer {
+ Container( T _in) : m_Value(_in) {}
+ ~Container() {}
+ T m_Value;
+ };
+
+ public:
+ Variant() {}
+
+ template<class T>
+ Variant(T _in) : m_Holder(new Container<typename typeTraits<T>::type>(_in) ) {}
+
+ template<class T>
+ typename typeTraits<T>::pointer getAsPtr() {
+ return & (dynamic_cast<Container<typename typeTraits<T>::type> &>(*m_Holder.get()).m_Value) ;
+ }
+
+ template<typename T>
+ typename typeTraits<T>::reference getAsRef() {
+ return dynamic_cast<Container<typename typeTraits<T>::type> &>(*m_Holder.get()).m_Value;
+ }
+
+ template<typename T>
+ typename typeTraits<T>::const_reference getAsRef() const {
+ return dynamic_cast<Container<typename typeTraits<T>::type> &>(*m_Holder.get()).m_Value;
+ }
+
+ template<typename T>
+ void setAs(typename typeTraits<T>::const_reference _t)
+ {
+
+ m_Holder.reset(new Container<typename typeTraits<T>::type>(_t));
+ }
+
+ template<typename T>
+ Variant &operator =(typename typeTraits<T>::const_reference _t)
+ {
+
+ m_Holder.reset(new Container<typename typeTraits<T>::type>(_t));
+ return *this;
+ }
+
+
+ protected:
+ std::shared_ptr<AbstractContainer> m_Holder;
+};
+#endif /*LDSVM_VAR_H*/
--- /dev/null
+#include <iostream>
+#include <fstream>
+#include <queue>
+#include <memory>
+#include <string.h>
+
+
+/* Networking */
+#include <aeb/net/ip/basic_endpoint.h>
+#include <aeb/net/ip/udp.h>
+#include <aeb/net/socket_base.h>
+#include <aeb/net/basic_datagram_socket.h>
+#if defined(__MINGW32__)
+#include <aeb/net/detail/winsock_init.h>
+#endif
+
+
+#include <ldsvm.h>
+#include <ldsvm_var.h>
+#include <lds_msg.h>
+
+
+
+int main(int argc,char **arv)
+{
+ std::cout<<"Structure Sizes for LDS Vm:"<<std::endl;
+ std::cout<<"LdsType : "<<sizeof(LdsType)<<std::endl;
+ std::cout<<"LdsValue : "<<sizeof(LdsValue)<<std::endl;
+ std::cout<<"LdsTypeValue : "<<sizeof(LdsTypeValue)<<std::endl;
+ std::cout<<"LdsFunctionProto : "<<sizeof(LdsFunctionProto)<<std::endl;
+ std::cout<<"LdsMsg : "<<sizeof(LdsMsg)<<std::endl;
+ std::cout<<"LdsSignalMsg : "<<sizeof(LdsSignalMsg)<<std::endl;
+ std::cout<<"LdsTimerMsg : "<<sizeof(LdsTimerMsg)<<std::endl;
+ std::cout<<"LdsExecFrame : "<<sizeof(LdsExecFrame)<<std::endl;
+ std::cout<<"Context : "<<sizeof(Context)<<std::endl;
+ std::cout<<"ldsvm : "<<sizeof(ldsvm)<<std::endl;
+ return 0;
+}
--- /dev/null
+#include <iostream>
+#include <fstream>
+#include <queue>
+#include <memory>
+#include <string.h>
+
+
+/* Networking */
+#include <ldsvm.h>
+
+#include <acse.h>
+
+class AcseImpl: public acse_stub
+{
+ public:
+ AcseImpl(ldsvm &_vm): acse_stub(_vm)
+ {}
+
+ void AuthenticatedImpl(long &pdu)
+ {
+ std::cout<<"AuthneticatedImpl pdu= "<<pdu<<std::endl;
+ }
+
+ void AEL_DO_AAREImpl(long &pdu)
+ {
+ std::cout<<"AEL_DO_AARE pdu= "<<pdu<<std::endl;
+ }
+ void AEL_DO_IN_ASSOX_RLRQImpl(long &pdu)
+ {
+ std::cout<<"DO_IN_ASSX_RLRQ pdu= "<<pdu<<std::endl;
+ }
+};
+
+/**
+ *
+ */
+void step1(ldsvm &vm,acse_stub &ctx)
+{
+ long l = 2;
+ ctx.signal_evtOnPDU(l);
+ vm.execute(&ctx);
+ long r = ctx.getPDU();
+}
+/**
+ *
+ */
+void step2(ldsvm &vm,acse_stub &ctx)
+{
+ long l = 2;
+ ctx.signal_evtOnPDU(l);
+ vm.execute(&ctx);
+ long r = ctx.getPDU();
+}
+
+
+int main(int argc,char **argv)
+{
+ long l = 1;
+ ldsvm vm;
+ //acse_stub te;
+ AcseImpl te(vm);
+ te.signal_evtOnPDU(l);
+ vm.execute(&te);
+ /* */
+ if (te.getPDU() != 1)
+ std::cerr<<"Failed Initial STEP1 1 != "<<te.getPDU()<<std::endl;
+ step1(vm,te);
+ if (te.getPDU() != 2)
+ std::cerr<<"Failed Initial STEP2 "<<te.getPDU()<<std::endl;
+ step2(vm,te);
+ if (te.getPDU() != 3)
+ std::cerr<<"Failed Initial STEP3 "<<te.getPDU()<<std::endl;
+}
--- /dev/null
+#include <iostream>
+#include <fstream>
+#include <queue>
+#include <memory>
+#include <string.h>
+
+
+/* Networking */
+#include <ldsvm.h>
+
+#include <test_equal.h>
+
+class TEqual : public test_equal_stub
+{
+ public:
+ TEqual(ldsvm &_vm) : test_equal_stub(_vm)
+ { }
+
+ void AEL_DOImpl(long &v)
+ {
+ std::cout<<"AEL_DO val="<<v<<" ";
+ std::cout<<" TEST="<<getFLG_TEST()<<std::endl;
+ }
+};
+
+int main(int argc,char **argv)
+{
+ ldsvm vm;
+ //test_equal_stub te;
+ TEqual te(vm);
+ te.signal_EVT_START();
+ vm.execute(&te);
+}
--- /dev/null
+automaton test_ is
+
+ task do_nothing is
+ begin
+ if FLG_INDEX > 3 then
+ AEL_NOP;
+ end if ;
+ if test FLG_IDX1 > 4 then
+ AEL_TOTO ;
+ end if;
+ end task do_nothing;
+
+ task do_something is
+ begin
+ AEL_DO_1 ;
+ AEL_DO_2 ;
+ AEL_DO_PARAM(TAB1,TAB2);
+ end task do_something;
+
+ state ST_BEGIN accept
+
+ when EVT_START => same
+ begin
+ AEL_TOTO;
+ goto ST_RIEN;
+ end EVT_START;
+
+ when EVT_END => STA_END
+ begin
+ AEL_NOP;
+ end EVT_END;
+ end state ST_BEGIN;
+
+ state STA_END accept
+ when ECT_START => same
+ begin
+ if test FLG_T1 then
+ execute do_nothing ;
+ end if;
+ if not (CALL_FLG_T1(FLG)) then
+ do_something(With1Param,With2param) ;
+ end if;
+ end EVT_START;
+ end state STA_END;
+end automaton test_ ;
+
--- /dev/null
+automaton test_if_else is
+ state ST_BEGIN accept
+
+ when EVT_TIME_OUT_OTS => STA_IDLE
+ begin
+ AEL_STORE_OPERATION(NO_OP);
+ AEL_CLEAN_DATA;
+ if (AEL_TEST_FLAG(FLAG_OTS_REQUEST)) then
+ AEL_RESET_FLAG(FLAG_OTS_REQUEST);
+ AEL_ACTION(AT_PASS_INACTIVE,NIL_SUB_TYPE,TIME_OUT);
+ goto STA_EXIT;
+ else
+ AEL_DEACTIVATED(IM_TIMEOUT);
+ end if;
+ end EVT_TIME_OUT_OTS;
+
+
+ when EVT_A => same
+ begin
+ IF TEST_IF THEN
+ AEL_DO_TRUE ;
+ ELSE
+ AEL_DO_TRUE1 ;
+ END IF;
+ AEL_DO_NEXT ;
+ end EVT_START;
+
+ when EVT_START => same
+ begin
+ IF TEST_IF THEN begin
+ AEL_DO_TRUE ;
+ AEL_DO_TRUE1 ;
+ end ;
+ ELSE begin
+ AEL_DO_ELSE ;
+ AEL_DO_TRUE1 ;
+ AEL_DO_TRUE3 ;
+ end ;
+ END IF;
+ AEL_DO_NEXT ;
+ end EVT_START;
+
+ when EVT_CONFIG => same
+ begin
+ AEL_DO_ELSE ;
+ AEL_DO_TRUE1 ;
+ AEL_DO_TRUE3 ;
+ end EVT_CONFIG ;
+
+ when EVT_NEW_CONFIG => same
+ begin
+ if TEST_IF
+ then
+ if AEL_CHECK_NEW_CONFIG
+ then
+ AEL_LOOP_MSG (EVT_NEW_CONFIG_OK) ;
+ else
+ AEL_LOOP_MSG (EVT_BAD_CONFIG) ;
+ end if ;
+ else
+ AEL_LOOP_MSG (EVT_BAD_CONFIG) ;
+ end if ;
+ end EVT_NEW_CONFIG ;
+
+
+ end state ST_BEGIN;
+
+end automaton test_ ;
+
--- /dev/null
+automaton test_switch is
+
+
+ state ST_BEGIN accept
+
+ when EVT_START => same
+ begin
+ case AEL_FINDOLDEST_NODE
+ do AEL_TOTO(X1);
+ do AEL_TATA;
+ do AEL_TOTO(X2,X3);
+ do AEL_TATA;
+ end case ;
+ end EVT_START;
+
+ end state ST_BEGIN;
+
+end automaton test_ ;
+
--- /dev/null
+automaton test_while is
+
+dcl Counter Integer := 4 ;
+
+ state ST_BEGIN accept
+
+ when EVT_START => same
+ begin
+ Counter := 4; -- Because Init Expression Is not implemented yet
+ WHILE Counter > 0
+ LOOP
+ Counter := Counter - 1;
+ AEL_TOTO;
+ end loop;
+ end EVT_START;
+
+ end state ST_BEGIN;
+
+end automaton test_ ;
+
--- /dev/null
+#include <iostream>
+#include <fstream>
+#include <queue>
+#include <memory>
+#include <string.h>
+
+#include <unistd.h>
+/* Networking */
+#include <aeb/net/ip/basic_endpoint.h>
+#include <aeb/net/ip/udp.h>
+#include <aeb/net/socket_base.h>
+#include <aeb/net/basic_datagram_socket.h>
+#if defined(__MINGW32__)
+#include <aeb/net/detail/winsock_init.h>
+#endif
+
+
+#include <ldsvm.h>
+#include <ldsvm_var.h>
+
+//#include <tftpclient.evt>
+
+#include <tftp.h>
+#include <tftpclient.h>
+// Implemetation of stub
+#include <tftp-client.h>
+using namespace aeb::net;
+
+// #define TDBG
+#define TFTP_PORT 69
+
+class tftpclientImpl : public tftpclient_stub
+{
+ protected:
+ tftp_packet m_Packet;
+ public:
+ typedef ip::basic_endpoint<ip::udp> endpoint_type;
+ typedef aeb::net::basic_datagram_socket<aeb::net::ip::udp> socket_type;
+
+ tftpclientImpl(ldsvm &_vm,endpoint_type _ep
+ ) : tftpclient_stub(_vm)
+ , m_NbPackets(1)
+ , m_Endpoint(_ep)
+ , m_ReceiveEndpoint()
+ , vm(_vm)
+ {
+ std::cout<<"tftpclientImpl to"<<m_Endpoint<<std::endl;
+ Accumulator() = 0;
+ }
+ // destructor
+ ~tftpclientImpl()
+ {
+ }
+ /**
+ * Initiating Read process
+ * What do you do if Send fails ?
+ * returns -1
+ */
+ void AEL_SendReadImpl(long &_arg0,long &_arg1)
+ {
+ long len = 4; // opcode
+ m_Packet.u.generic.opcode = htons(RRQ);
+
+ sprintf(m_Packet.u.generic.info,"%s%c%s%c", m_Filename.c_str()
+ , '\0'
+ , filemode[m_Mode]
+ , '\0');
+ len += m_Filename.size() + strlen(filemode[m_Mode]);
+ std::cout<<"SendRead "<<m_Filename<<" to"<<m_Endpoint<<std::endl;
+ int res = m_Socket.sendto(&m_Packet.u.buf,len,m_Endpoint);
+ // Set result
+ Accumulator() = (len == res);
+ }
+ /**
+ * Send Ack to server. Set accumulator accordingly
+ * to check if ok or not
+ */
+ void AEL_SendAckImpl(long &_packetNumber)
+ {
+ long len = 4; // opcode
+ m_Packet.u.ack.opcode = htons(ACK);
+ int res = m_Socket.sendto(&m_Packet.u.buf,len,m_ReceiveEndpoint);
+#if defined(TDBG)
+ std::cout<<"SendAck "<<m_ReceiveEndpoint<<" "<<ntohs(m_Packet.u.ack.block_number)<<std::endl;
+#endif
+ // Set result
+ Accumulator() = (len == res);
+ }
+ /**
+ * Write result into file
+ */
+ void AEL_WriteReadImpl(long &_fd, long &_buff, long &_len)
+ {
+#if defined(TDBG)
+ std::cout<<"WriteReadImpl "<<m_ReceiveEndpoint<<" "<<ntohs(m_Packet.u.ack.block_number)<<std::endl;
+#endif
+ m_Stream.write(m_Packet.u.data.data,m_Size-4);
+ Accumulator() = 1;
+ }
+ // Test Functions
+ void AEL_TestPacketNumberImpl()
+ {
+#if defined(TDBG)
+ if ( ! ( m_NbPackets == ntohs(m_Packet.u.ack.block_number)) )
+ {
+ std::cout<<"\nTestPacketNumber error "<<m_NbPackets;
+ std::cout<<" packet "<<ntohs(m_Packet.u.ack.block_number)<<std::endl;
+ } else {
+ std::cout<<"Got Packet "<<ntohs(m_Packet.u.ack.block_number)<<" m_NbPackets: "<<m_NbPackets<<std::endl;
+ }
+#endif
+ Accumulator() = (m_NbPackets == ntohs(m_Packet.u.ack.block_number));
+ // m_NbPackets = ntohs(m_Packet.u.ack.block_number);
+ m_NbPackets++ ;
+ }
+ /**
+ * Test Functions. tells when the read operation
+ * ends. When the packet size is lesser than 516 bytes
+ */
+ void AEL_ReadingEndImpl()
+ {
+#if defined(TDBG)
+ std::cout<<"ReadingEndImpl Size="<<m_Size<<" "<<m_Packet.u.error.error_msg<<std::endl;
+#endif
+ Accumulator() = (m_Size<516);
+ }
+ /**
+ *
+ * What do I do if socket creation fails ?
+ */
+ void AEL_StartReadImpl(long &_filename,long &_fd)
+ {
+ size_t found = m_Filename.find_last_of("/\\");
+ aeb::sys::error ec;
+ struct timeval tv = {2,0};
+ aeb::net::ip::udp::rcvtimeo timeout(tv);
+
+ ip::udp p = m_Endpoint.protocol();
+ m_Socket.open(p);
+ //
+ m_Socket.set_option(timeout,ec);
+ if ( found != std::string::npos)
+ {
+
+ m_Stream.open(m_Filename.substr(found+1).c_str()
+ ,std::ofstream::out | std::ofstream::binary);
+ } else
+ {
+ m_Stream.open(m_Filename.c_str(),std::ofstream::out | std::ofstream::binary);
+ }
+ }
+
+ /**
+ * End of processing. Close opened ressources
+ */
+ void AEL_CloseImpl(long &_fd)
+ {
+ m_EndLoad = true;
+#if defined(TDBG)
+ std::cout<<"CloseImpl "<<m_ReceiveEndpoint<<" "<<m_Packet.u.error.error_msg<<std::endl;
+#endif
+ m_Socket.close();
+ m_Stream.close();
+ }
+ // Test Functions
+ void AEL_Message2Impl(long &_msg2,long &_cause)
+ {
+ std::cout<<"Error "<<m_ReceiveEndpoint<<" "<<m_Packet.u.error.error_msg<<std::endl;
+ }
+ /**
+ * Main Entry point to read a file through
+ * this protocol
+ * Missing timeout management can hang
+ */
+ void Load(const std::string &dede,int mode = OCTET )
+ {
+ m_Filename = dede;
+ m_Mode = mode;
+ m_EndLoad = false;
+ m_NbPackets = 1;
+ m_Size = 0;
+
+ signal_EVT_Read();
+ vm.execute(this);
+
+ m_Packet.u.generic.opcode = 0;
+ while ( ! m_EndLoad && ( m_Size =
+ m_Socket.receivefrom(&m_Packet.u.buf
+ ,sizeof(m_Packet)
+ , m_ReceiveEndpoint)) > 0)
+ {
+ std::cout<<"#";
+ std::cout.flush();
+ unsigned short opcode = ntohs(m_Packet.u.generic.opcode);
+ switch (opcode)
+ {
+ case RRQ:
+ signal_EVT_Read();
+ vm.execute(this);
+ break;
+ case WRQ:
+ signal_EVT_Write();
+ vm.execute(this);
+ break;
+ case DATA:
+ signal_EVT_Data();
+ vm.execute(this);
+ break;
+ case ACK:
+ signal_EVT_Ack();
+ vm.execute(this);
+ break;
+ case ERROR:
+ signal_EVT_Error();
+ vm.execute(this);
+ break;
+ default:
+ std::cout<<"Unknown Message "<<m_Size<<std::endl;
+ m_EndLoad = true;
+ ;
+ }
+ // Invalidate data
+ m_Packet.u.generic.opcode = 0;
+ }
+ // Handle time out
+ if (m_Size < 0)
+ {
+ m_Packet.u.generic.opcode = htons(ERROR);
+ sprintf(m_Packet.u.error.error_msg,"Timeout \n");
+ signal_EVT_Error();
+ vm.execute(this);
+ }
+ }
+ protected:
+ ldsvm &vm;
+ std::string m_Filename;
+ std::ofstream m_Stream;
+ int m_NbPackets;
+ int m_Mode;
+ int m_Size;
+ int m_EndLoad;
+ socket_type m_Socket;
+ endpoint_type m_Endpoint;
+ endpoint_type m_ReceiveEndpoint;
+};
+
+
+/**
+ * Test function regarding variant type
+ */
+void test_variant()
+{
+ std::string name("dede");
+ Variant variant(name),v2,c1,c2;
+ std::string r,r2;
+
+ c1 = variant;
+ variant.setAs<std::string>( name );
+ v2.setAs<std::string>(variant.getAsRef<std::string>());
+ r = variant.getAsRef<std::string>();
+ r2 = v2.getAsRef<std::string>();
+
+ std::cout<<"Variant Result "<<r<<" "<<c1.getAsRef<std::string>()<<std::endl;
+ exit(1);
+}
+
+/**
+ * Simple help string
+ */
+void help()
+{
+ std::cout<<"tftp-client -H ip host -l repeat loop -f filename"<<std::endl;
+ exit(1);
+}
+
+/**
+ *
+ * \brief main example program that shows how to use the tftps implementation
+ *
+ *
+ */
+int main(int argc,char **argv)
+{
+ ldsvm vm;
+ tftpclientImpl::endpoint_type ep("172.25.16.146",TFTP_PORT);
+
+ std::string f("/tftpboot/noe4008");
+
+ int ch = 0;
+ int repeat = 1;
+
+ /* Process command line */
+ while ( (ch = getopt(argc,argv,"H:f:l:hvp:")) != -1)
+ {
+ switch (ch)
+ {
+ case 'H':
+ {
+ tftpclientImpl::endpoint_type nep(optarg,TFTP_PORT);
+ ep = nep;
+ }
+ break;
+ case 'f':
+ f = optarg;
+ break;
+ case 'p':
+ {
+ unsigned short _p = atoi(optarg);
+ ep.port(_p);
+ }
+ break;
+ case 'l':
+ repeat = atoi(optarg);
+ break;
+ case 'v':
+ test_variant();
+ break;
+ case 'h':
+ default:
+ help();
+ }
+ }
+
+ tftpclientImpl c(vm,ep);
+ // Main processing loop
+ while (repeat--)
+ {
+ c.Load(f);
+ sleep(1);
+ }
+
+ std::cout<<"Bye "<<argv[0]<<std::endl;
+ return 0;
+}
--- /dev/null
+#ifndef TFTP_CLIENT_H
+#define TFTP_CLIENT_H
+/**
+ * \brief First version of a tftpclient implementation using
+ * the genaut lds automaton generator.
+ *
+ */
+class tftpclient
+{
+ public:
+ // typedef ip::basic_endpoint<ip::udp> endpoint_type;
+
+ enum efilemode {NETASCII
+ , OCTET
+ , MAIL
+ };
+
+
+ enum error_codes {
+ NOTDEFERR
+ , NOTFOUNDERR
+ , ACCESSERR
+ , DISKFULLERR
+ , ILLEGALOPERR
+ , UNKNOWNIDERR
+ , FILEEXISTSERR
+ , UNKNOWNUSERERR
+ };
+
+ /**
+ * Build a tftp client
+ */
+ tftpclient();
+ // destructor
+ ~tftpclient() ;
+
+ /**
+ * Main Entry point to read a file through
+ * this protocol
+ * Missing timeout management can hang
+ * Should Add a state to say if load succeeded or
+ * failed. Void is not the proper return code
+ */
+ void Load(const std::string &dede,int mode = OCTET );
+
+
+};
+
+
+#endif
+
--- /dev/null
+#include <iostream>
+#include <fstream>
+#include <queue>
+#include <memory>
+#include <string.h>
+
+
+/* Networking */
+#include <aeb/net/ip/basic_endpoint.h>
+#include <aeb/net/ip/udp.h>
+#include <aeb/net/socket_base.h>
+#include <aeb/net/basic_datagram_socket.h>
+#if defined(__MINGW32__)
+#include <aeb/net/detail/winsock_init.h>
+#endif
+
+
+#include <ldsvm.h>
+#include <ldsvm_var.h>
+
+//#include <tftps.evt>
+
+#include <tftp.h>
+/* generated header */
+#include <tftps.h>
+// Implemetation of stub
+#include <tftp-client.h>
+using namespace aeb::net;
+
+
+#define TFTP_PORT 69
+
+/**
+ * tftpsImpl implements the automaton that is able
+ * to process one session request ( Read or Write )
+ * for a file.
+ * The serve method should receive a tftp_packet as parameter
+ * for processing
+ *
+ */
+class tftpsImpl : public tftps_stub
+{
+ protected:
+ tftp_packet m_Packet;
+ public:
+ typedef ip::basic_endpoint<ip::udp> endpoint_type;
+ typedef aeb::net::basic_datagram_socket<aeb::net::ip::udp> socket_type;
+
+ tftpsImpl(ldsvm &_vm,endpoint_type _ep ) : tftps_stub(_vm)
+ , m_NbPackets(1)
+ , m_Endpoint(_ep)
+ , m_ReceiveEndpoint(_ep)
+ , vm(_vm)
+ {
+ Accumulator() = 0;
+ }
+ // destructor
+ virtual ~tftpsImpl()
+ {
+ }
+
+ virtual void AEL_CloseImpl( )
+ {
+ std::cout<<"Close"<<std::endl;
+ m_Socket.close();
+ m_EndLoad = true;
+ }
+
+ virtual void AEL_MessageImpl( )
+ {
+ std::cout<<"message"<<std::endl;
+ }
+ virtual void AEL_Message2Impl( )
+ {
+ std::cout<<"Message2"<<std::endl;
+ }
+ virtual void AEL_ReadBufferImpl( )
+ {
+ std::cout<<"ReadBuffer"<<std::endl;
+ }
+ virtual void AEL_ReadingEndImpl( )
+ {
+ std::cout<<"ReadingEnd"<<std::endl;
+ Accumulator() = 1;
+ }
+ virtual void AEL_SendAckImpl( )
+ {
+ std::cout<<"SendAck"<<std::endl;
+ }
+ //
+ virtual void AEL_SendDataImpl(long &_filename,long &_packet_number )
+ {
+ std::cout<<"Server::SendData"<<std::endl;
+ m_Packet.u.generic.opcode = htons(DATA);
+ m_Packet.u.data.block_number = htons(m_NbPackets);
+ memset(m_Packet.u.data.data,0x00,sizeof(m_Packet.u.data.data));
+ int len = sprintf(m_Packet.u.data.data,"UDP_PORT_SIG=5001");
+ len += 4 ;
+ int res = m_Socket.sendto(&m_Packet.u.buf,len,m_ReceiveEndpoint);
+ // Set result
+ }
+ // Send error message
+ virtual void AEL_SendErrorImpl( )
+ {
+ std::cout<<"SendError"<<std::endl;
+ m_Packet.u.error.opcode = htons(DATA);
+ m_Packet.u.error.error_code = htons(AccumulatorAsInt());
+ memset(m_Packet.u.error.error_msg,0x00,sizeof(m_Packet.u.error.error_msg));
+ int len = sprintf(m_Packet.u.error.error_msg,"%s",errormsg[AccumulatorAsInt()]);
+ len += 4 ;
+ int res = m_Socket.sendto(&m_Packet.u.buf,len,m_ReceiveEndpoint);
+ }
+ /**
+ * Should check all incoming parameters to see if it's consistant
+ * and if it can be handled
+ * check file path
+ * check file exists
+ * check if root dir is there
+ * check for ..
+ */
+ virtual void AEL_StartReadImpl(long &_filename )
+ {
+ char a,b;
+ std::string f (m_Packet.u.generic.info);
+ std::string m (&m_Packet.u.generic.info[f.size()+1]);
+ std::cout<<"StartRead "<<" File="<<f<<" mode="<<m<<std::endl;
+ Accumulator() = 0;
+ }
+
+ virtual void AEL_StartWriteImpl(long &filename,long &_fd )
+ {
+ std::cout<<"StartWrite"<<std::endl;
+ }
+
+ virtual void AEL_TestPacketNumberImpl( )
+ {
+ std::cout<<"TestPacketNumber"<<std::endl;
+ }
+ /**
+ * Main entry point that should open the socket,
+ * listen to requests and process them
+ */
+ int Serve(endpoint_type &ep,tftp_packet *p)
+ {
+ m_Mode = 0;
+ m_EndLoad = false;
+ m_NbPackets = 1;
+ m_Size = 0;
+ // Create Socket and listen
+ m_Endpoint = ep;
+ m_ReceiveEndpoint = ep;
+ openSocket();
+ // Handle first request
+ memcpy(&m_Packet,p,sizeof(tftp_packet));
+ do {
+ std::cout<<"Serve::Received "<<m_ReceiveEndpoint<<std::endl;
+ std::cout.flush();
+ unsigned short opcode = ntohs(m_Packet.u.generic.opcode);
+ switch (opcode)
+ {
+ case RRQ:
+ {
+ long b;
+ char *a = "file";
+ char *res ="res";
+ signal_EVT_Read(a,b,res);
+ vm.execute(this);
+ }
+ break;
+ case WRQ:
+ signal_EVT_Write();
+ vm.execute(this);
+ break;
+ case DATA:
+ signal_EVT_Data();
+ vm.execute(this);
+ break;
+ case ACK:
+ signal_EVT_Ack();
+ vm.execute(this);
+ break;
+ case ERROR:
+ signal_EVT_Error();
+ vm.execute(this);
+ break;
+ default:
+ std::cout<<"Unknown Message "<<m_Size<<std::endl;
+ m_EndLoad = true;
+ ;
+ }
+ // Invalidate data
+ m_Packet.u.generic.opcode = 0;
+ }
+ while ( ! m_EndLoad && ( m_Size =
+ m_Socket.receivefrom(&m_Packet.u.buf
+ ,sizeof(m_Packet)
+ , m_ReceiveEndpoint)) >= 0) ;
+ // Handle time out
+ if (!m_EndLoad && m_Size < 0)
+ {
+ m_Packet.u.generic.opcode = htons(ERROR);
+ sprintf(m_Packet.u.error.error_msg,"Timeout \n");
+ signal_EVT_Error();
+ vm.execute(this);
+ }
+ return 0;
+ }
+ protected:
+ void openSocket()
+ {
+ aeb::sys::error ec;
+ struct timeval tv = {2,0};
+ aeb::net::ip::udp::rcvtimeo timeout(tv);
+
+ ip::udp p = m_Endpoint.protocol();
+ m_Socket.open(p);
+ //
+ m_Socket.set_option(timeout,ec);
+ }
+ protected:
+ ldsvm &vm;
+ int m_NbPackets;
+ int m_Mode;
+ int m_Size;
+ int m_EndLoad;
+ socket_type m_Socket;
+ endpoint_type m_Endpoint;
+ endpoint_type m_ReceiveEndpoint;
+};
+
+
+/**
+ * tftpserver class holds multiple instances of tftpsImpl
+ * depends on the number of requests
+ */
+class tftpserver
+{
+ public:
+ typedef ip::basic_endpoint<ip::udp> endpoint_type;
+ typedef aeb::net::basic_datagram_socket<aeb::net::ip::udp> socket_type;
+
+ tftpserver(endpoint_type &ep) : m_Endpoint(ep)
+ {
+ openSocket();
+ }
+
+ void serve(ldsvm &_vm)
+ {
+
+ tftpsImpl server(_vm,m_Endpoint);
+ long m_Size = 0;
+ m_Packet.u.generic.opcode = 0;
+ while ( ( m_Size =
+ m_Socket.receivefrom(&m_Packet.u.buf
+ ,sizeof(m_Packet)
+ , m_ReceiveEndpoint)) >= 0)
+ {
+ std::cout<<"tftp::Received "<<m_ReceiveEndpoint<<std::endl;
+ std::cout.flush();
+ unsigned short opcode = ntohs(m_Packet.u.generic.opcode);
+ server.Serve(m_ReceiveEndpoint,&m_Packet);
+ }
+ // Handle time out
+ if (m_Size < 0)
+ {
+ m_Packet.u.generic.opcode = htons(ERROR);
+ }
+ m_Socket.close();
+ }
+
+ protected:
+ void openSocket()
+ {
+ aeb::sys::error ec;
+ // struct timeval tv = {20,0};
+ // aeb::net::ip::udp::rcvtimeo timeout(tv);
+
+ ip::udp p = m_Endpoint.protocol();
+ m_Socket.open(p);
+ //
+ // m_Socket.set_option(timeout,ec);
+ m_Socket.bind(m_Endpoint);
+ }
+ protected:
+ tftp_packet m_Packet;
+ endpoint_type m_Endpoint;
+ endpoint_type m_ReceiveEndpoint;
+ socket_type m_Socket;
+};
+
+void help()
+{
+}
+/**
+ *
+ *
+ */
+int main(int argc,char **argv)
+{
+ std::string f;
+ long repeat;
+ char ch;
+ ldsvm vm;
+ tftpsImpl::endpoint_type ep("127.0.0.1",TFTP_PORT);
+ /* Process command line */
+ while ( (ch = getopt(argc,argv,"H:f:l:hp:")) != -1)
+ {
+ switch (ch)
+ {
+ case 'H':
+ {
+ tftpsImpl::endpoint_type nep(optarg,TFTP_PORT);
+ ep = nep;
+ }
+ break;
+ case 'f':
+ f = optarg;
+ break;
+ case 'p':
+ {
+ unsigned short _p = atoi(optarg);
+ ep.port(_p);
+ }
+ break;
+ case 'l':
+ repeat = atoi(optarg);
+ break;
+ case 'h':
+ default:
+ help();
+ }
+ }
+ std::cout<<"Hello tftp-server "<<ep<<std::endl;
+ //tftpsImpl server(ep,(LdsAutomaton *)&t_aut_tftps);
+ tftpserver server(ep);
+ server.serve(vm);
+ std::cout<<"Bye tftp-server "<<ep<<std::endl;
+}
+/**
+ * ex: set et sw=2 ts=2 list:
+ */
--- /dev/null
+#ifndef TFTP_H
+#define TFTP_H
+
+enum packet_type {RRQ=1, WRQ, DATA, ACK, ERROR};
+
+enum efilemode {NETASCII, OCTET, MAIL};
+
+static const char *filemode[] = {
+ "netascii",
+ "octet",
+ "mail"
+};
+
+enum error_codes {NOTDEFERR, NOTFOUNDERR, ACCESSERR, DISKFULLERR,
+ ILLEGALOPERR, UNKNOWNIDERR, FILEEXISTSERR,
+ UNKNOWNUSERERR};
+
+static const char *errormsg[] = {
+ "Not defined, see error message",
+ "File not found",
+ "Access violation",
+ "Disk full or allocation exceeded",
+ "Illegal TFTP operation",
+ "Unknown transfer ID",
+ "File already exists",
+ "No such user"
+};
+
+typedef struct generic_packet {
+ short unsigned opcode; /* 1-2 */
+ char info[514];
+} generic_packet;
+
+typedef struct data_packet {
+ short unsigned opcode; /* 3 */
+ short unsigned block_number;
+ char data[512];
+} data_packet;
+
+typedef struct ack_packet {
+ short unsigned opcode; /* 4 */
+ short unsigned block_number;
+} ack_packet;
+
+typedef struct error_packet {
+ short unsigned opcode; /* 5 */
+ short unsigned error_code;
+ char error_msg[512];
+} error_packet;
+
+typedef struct tftp_packet {
+ union {
+ char buf;
+ generic_packet generic;
+ data_packet data;
+ ack_packet ack;
+ error_packet error;
+ } u;
+} tftp_packet;
+
+#endif /*TFTP_H*/
--- /dev/null
+automaton tftpclient is
+-- Events
+-- signal EVT_Read(host,port,filename)
+-- signal EVT_Write(host,port,filename)
+-- signal EVT_Ack(PacketNumber)
+-- signal EVT_Data(Buffer,PacketNumber)
+-- signal EVT_Error(cause)
+signal EVT_gotfile(String);
+dcl FLG_fd Integer;
+dcl FLG_buffer String;
+dcl FLG_length Integer;
+dcl FLG_cause Integer;
+dcl FLG_filename String;
+dcl FLG_packetNumber Integer;
+dcl FLG_MSG1,FLG_MSG2,FLG_MSG3 String := 'Test TOTO';
+timer T_timeout ;
+ --
+ -- Idle state
+ --
+ state STA_Idle accept
+
+ when EVT_Read => STA_Reading
+ begin
+ -- Open file
+ AEL_StartRead(FLG_filename,FLG_fd);
+ -- send ReadReq
+ AEL_SendRead(FLG_filename,FLG_packetNumber);
+ set (now + 100,T_timeout);
+ end EVT_Read;
+
+ when EVT_Write => STA_Writing
+ begin
+ AEL_StartWrite(FLG_filename,FLG_fd);
+ AEL_SendWrite(FLG_filename);
+ end EVT_START;
+
+ when EVT_Ack => same
+ begin
+ AEL_Message(FLG_MSG1);
+ --AEL_Message('FLG_MSG1 test');
+ end EVT_END;
+ end state ST_BEGIN;
+
+ -- Reading ....
+ state STA_Reading accept
+ when EVT_Data => same
+ begin
+ if ( AEL_TestPacketNumber )
+ then
+ AEL_WriteRead(FLG_fd,FLG_buffer,FLG_length);
+ AEL_SendAck(FLG_packetNumber);
+ -- Reset timeout
+ set (now + 100,T_timeout);
+ else
+ -- AEL_Close(FLG_fd);
+ AEL_SendAck(FLG_packetNumber);
+ -- goto STA_Idle;
+ end if;
+ if AEL_ReadingEnd then
+ AEL_Close(FLG_fd);
+ reset (T_timeout);
+ output EVT_gotfile(FLG_filename) to this;
+ goto STA_Idle;
+ end if;
+ end EVT_Data;
+
+ when EVT_Ack => same
+ begin
+ AEL_Message(FLG_MSG2);
+ end EVT_Ack;
+
+ when EVT_Error => same
+ begin
+ AEL_Message2(FLG_MSG3,FLG_cause);
+ AEL_Close(FLG_fd);
+ goto STA_Idle;
+ end EVT_Error;
+
+ end state STA_Reading;
+
+ --
+ --
+ --
+ state STA_Writing accept
+ when EVT_Data => same
+ begin
+ AEL_Message2(FLG_MSG3,FLG_cause);
+ end EVT_Data;
+
+ when EVT_Ack => same
+ begin
+ AEL_ReadBuffer(FLG_fd,FLG_buffer);
+ AEL_SendData(FLG_buffer,FLG_packetNumber);
+ end EVT_Ack;
+
+ when EVT_Error => same
+ begin
+ goto STA_Idle;
+ end EVT_Error;
+ end state STA_Writing;
+
+
+end automaton test_ ;
+
--- /dev/null
+#include <iostream>
+#include <fstream>
+#include <queue>
+#include <memory>
+#include <string.h>
+
+
+/* Networking */
+#include <ldsvm.h>
+
+#include <test_while.h>
+
+
+int main(int argc,char **argv)
+{
+ ldsvm vm;
+ test_while_stub te(vm);
+ te.signal_EVT_START();
+ vm.execute(&te);
+}
--- /dev/null
+#ifndef UAUDP_H
+#define UAUDP_H
+
+
+enum uaudp_packet_type {
+ CONNECT
+ , CONNECT_ACK
+ , RELEASE
+ , RELEASE_ACK
+ , KEEPALIVE
+ , KEEPALIVE_ACK
+ , NACK
+ , DATA
+ , DATA_ACK
+};
+
+typedef struct {
+ unsigned char opcode;
+} uaudp_generic_packet;
+
+typedef struct {
+ unsigned char opcode;
+ char info[512];
+} uaudp_connect_packet;
+
+typedef struct {
+ unsigned char opcode;
+ unsigned short seq_number;
+} uaudp_nack_packet;
+
+typedef struct {
+ unsigned char opcode;
+ unsigned short expe_seq_number;
+ unsigned short sent_seq_number;
+ char info[516];
+} uaudp_data_packet;
+
+/**
+ *
+ */
+typedef struct {
+ union {
+ uaudp_connect_packet connect;
+ uaudp_connect_ack_packet connect_ack;
+ uaudp_generic_packet release;
+ uaudp_generic_packet release_ack;
+ uaudp_generic_packet keepalive;
+ uaudp_generic_packet keepalive_ack;
+ uaudp_nack_packet nack;
+ uaudp_data_packet data;
+ uaudp_data_packet ack;
+ char buffer;
+ } u;
+} uaudp;
+
+#endif /*UAUDP_H*/