*DECK FFSLFLH 
USETEXT TEXTFFS 
      PROC FFSLFLH ;
*CALL COPYRITE
# TITLE FFSLFLH - FTP LAYER HANDLER.                                   #
  
      BEGIN                            # FFSLFLH                       #
# 
**    FFSLFLH - FTP LAYER HANDLER 
* 
*     A. LIM                           04/19/88 
* 
*     FFSLFLH PROCESSES ALL INDICATIONS PASSED TO THE FTP LAYER.
* 
*     ENTRY   INDICATION = COMMON BLOCK CONTAINS THE INDICATION 
*                          CODE AND ANY NECESSARY PARAMETERS. 
* 
*     EXIT    INDICATION PROCESSED, AND 
*             REQUEST MADE TO CONNECTION MANAGEMENT LAYER.
* 
*     METHOD  FFSLFLH IS CALLED BY THE MAIN LOOP *FFSXPES*
*             WHENEVER A NON-NULL INDICATION IS DETECTED
*             IN THE FTP INTERFACE INDICATIONS COMMON BLOCK.
*             THE INDICATION IS VALIDATED AND A TRIGGER IS
*             GENERATED FROM IT.
* 
*             SOME INDICATIONS NEED TO BE PROCESSED FURTHER 
*             TO GENERATE THE APPROPRIATE TRIGGERS. 
* 
*             THE TRIGGER IS THEN USED TO PERFORM STATE 
*             TABLE PROCESSING. 
* 
*             THE FTP STATE IS CONTAINED IN THIS ROUTINE. 
# 
  
  
# 
***   PROC FFSLFLH - XREF LIST BEGIN
# 
      XREF
        BEGIN 
        PROC FFSCHLP;                  # PROCESS HELP COMMAND          #
        PROC FFSEABT;                  # ABORT WUTH DAYFILE MESSAGE    #
        PROC FFSLCRP;                  # FTP CONN. MANAGEMENT LAYER    #
        PROC FFSRADT;                  # ACTION DATA TRANSFER          #
        PROC FFSRCDT;                  # COMPLETE DATA TRANSFER        #
        PROC FFSRPDT;                  # PREPROCESS DATA TRANSFER      #
        PROC FFSRSDT;                  # SETUP FOR DATA TRANSFER       #
        PROC FFSUCDA;                  # CONVERT FROM DISPLAY TO ASCII #
        PROC FFSUCIA;                  # CONVERT IPA TO BINARY         #
        PROC FFSUDFN;                  # DISCONNECT FROM NETWORK       #
        FUNC FFSULLN I;                # LINE LENGTH                   #
        PROC FFSUPFC;                  # SYNTAX CHECKING/PARSING PARAMS#
        PROC FFSUSRM;                  # SEND RESPONSE MESSAGE         #
        PROC FFSUSMS;                  # SEND A MESSAGE ON DESINATED CN#
        PROC FFSUSUV;                  # SET USER VALIDATIONS          #
        PROC FFSUVUC;                  # VALIDATE USER CHARGE          #
        PROC FFSUVUI;                  # VALIDATE USER/PASSWORD INFORM #
        PROC FFSUWTB;                  # WRITE TO THE TRACE BUFFER     #
        PROC ABORT;                    # ABORT APPLICATION.            #
        PROC CHANGE;                   # CHANGE FILE ATTRIBUTES        #
        PROC MESSAGE;                  # SEND MESSAGE TO DAYFILE       #
        PROC PURGE;                    # PURGE FILE FROM CATALOG       #
        PROC RETERN;                   # RETURN A FILE                 #
        PROC XDXB;                     # CONVERT DISPLAY TO BINARY     #
        FUNC FFSUPCP B;                # PROCESS COMMAND PARAMETER     #
        FUNC XCDD    C(10);            # CONVERT TO DECIMAL DISP. CODE #
        END 
# 
****
# 
  
      CONTROL EJECT;
      CONTROL PRESET; 
  
# 
**    FTP LAYER STATE TABLE.
* 
*     THE TABLE CONSIST OF A 2-DIMENSIONAL ARRAY [STATE , EVENT]. 
*     EACH ELEMENT HAS 2 PARTS VIZ. 
*         1 - THE ACTION TO BE PERFORMED
*         2 - THE NEXT STATE
* 
*     NOTE:  THE TABLE HAS NO INDICATION CODE SINCE THIS IS THE 
*            TOP LAYER. 
# 
  
      ARRAY FTP$ST$TBL [0:FTP$MX$ST, 0:FTP$MX$EVT] S(1);
        BEGIN                        # FTP$ST$TBL                     # 
  
# 
*       ACTION TO BE PERFORMED. 
# 
  
        ITEM FTP$ST$ACT S:FTA$CDS (00,00,12) = [
#             STATE    EVENT   ACTION                                  #
          [ # IDLE,    CCNC  # S"FTA$I220", 
            # WTUV,    CCNC  # S"FTA$ABORT",
            # URWP,    CCNC  # S"FTA$ABORT",
            # 2UWP,    CCNC  # S"FTA$ABORT",
            # WDNC,    CCNC  # S"FTA$ABORT",
            # UVWA,    CCNC  # S"FTA$ABORT",
            # UVWC,    CCNC  # S"FTA$PSCF", 
            # UVWF,    CCNC  # S"FTA$ABORT",
            # WPCE,    CCNC  # S"FTA$ABORT",
            # WPCS,    CCNC  # S"FTA$ABORT",
            # WCCP,    CCNC  # S"FTA$ABORT",
            # WCCC,    CCNC  # S"FTA$ABORT",
            # XFER,    CCNC  # S"FTA$ABORT",
            # DXQP,    CCNC  # S"FTA$ABORT",
            # WPCP,    CCNC  # S"FTA$ABORT",
            # WDCE,    CCNC  # S"FTA$ABORT" ] 
  
          [ # IDLE,    USER  # S"FTA$ABORT",
            # WTUV,    USER  # S"FTA$PASS", 
            # URWP,    USER  # S"FTA$PASS", 
            # 2UWP,    USER  # S"FTA$PASS", 
            # WDNC,    USER  # S"FTA$ABORT",
            # UVWA,    USER  # S"FTA$I503", 
            # UVWC,    USER  # S"FTA$ABORT",
            # UVWF,    USER  # S"FTA$PASS", 
            # WPCE,    USER  # S"FTA$I503", 
            # WPCS,    USER  # S"FTA$I503", 
            # WCCP,    USER  # S"FTA$I503", 
            # WCCC,    USER  # S"FTA$NOOP", 
            # XFER,    USER  # S"FTA$I503", 
            # DXQP,    USER  # S"FTA$I503", 
            # WPCP,    USER  # S"FTA$I503", 
            # WDCE,    USER  # S"FTA$I503" ]
  
          [ # IDLE,    UPVT  # S"FTA$ABORT",
            # WTUV,    UPVT  # S"FTA$I230", 
            # URWP,    UPVT  # S"FTA$I230", 
            # 2UWP,    UPVT  # S"FTA$I230", 
            # WDNC,    UPVT  # S"FTA$ABORT",
            # UVWA,    UPVT  # S"FTA$I503", 
            # UVWC,    UPVT  # S"FTA$ABORT",
            # UVWF,    UPVT  # S"FTA$I230", 
            # WPCE,    UPVT  # S"FTA$I503", 
            # WPCS,    UPVT  # S"FTA$I503", 
            # WCCP,    UPVT  # S"FTA$I503", 
            # WCCC,    UPVT  # S"FTA$NOOP", 
            # XFER,    UPVT  # S"FTA$I503", 
            # DXQP,    UPVT  # S"FTA$I503", 
            # WPCP,    UPVT  # S"FTA$I503", 
            # WDCE,    UPVT  # S"FTA$I503" ]
  
          [ # IDLE,    UPVF  # S"FTA$ABORT",
            # WTUV,    UPVF  # S"FTA$ACCT", 
            # URWP,    UPVF  # S"FTA$ACCT", 
            # 2UWP,    UPVF  # S"FTA$ACCT", 
            # WDNC,    UPVF  # S"FTA$ABORT",
            # UVWA,    UPVF  # S"FTA$I503", 
            # UVWC,    UPVF  # S"FTA$ABORT",
            # UVWF,    UPVF  # S"FTA$ACCT", 
            # WPCE,    UPVF  # S"FTA$I503", 
            # WPCS,    UPVF  # S"FTA$I503", 
            # WCCP,    UPVF  # S"FTA$I503", 
            # WCCC,    UPVF  # S"FTA$NOOP", 
            # XFER,    UPVF  # S"FTA$I503", 
            # DXQP,    UPVF  # S"FTA$I503", 
            # WPCP,    UPVF  # S"FTA$I503", 
            # WDCE,    UPVF  # S"FTA$I503" ]
  
          [ # IDLE,    PWVT  # S"FTA$ABORT",
            # WTUV,    PWVT  # S"FTA$ABORT",
            # URWP,    PWVT  # S"FTA$I230", 
            # 2UWP,    PWVT  # S"FTA$I230", 
            # WDNC,    PWVT  # S"FTA$ABORT",
            # UVWA,    PWVT  # S"FTA$I503", 
            # UVWC,    PWVT  # S"FTA$ABORT",
            # UVWF,    PWVT  # S"FTA$ABORT",
            # WPCE,    PWVT  # S"FTA$I503", 
            # WPCS,    PWVT  # S"FTA$I503", 
            # WCCP,    PWVT  # S"FTA$I503", 
            # WCCC,    PWVT  # S"FTA$NOOP", 
            # XFER,    PWVT  # S"FTA$I503", 
            # DXQP,    PWVT  # S"FTA$I503", 
            # WPCP,    PWVT  # S"FTA$I503", 
            # WDCE,    PWVT  # S"FTA$I503" ]
  
          [ # IDLE,    PWVF  # S"FTA$ABORT",
            # WTUV,    PWVF  # S"FTA$ABORT",
            # URWP,    PWVF  # S"FTA$ACCT", 
            # 2UWP,    PWVF  # S"FTA$ACCT", 
            # WDNC,    PWVF  # S"FTA$ABORT",
            # UVWA,    PWVF  # S"FTA$I503", 
            # UVWC,    PWVF  # S"FTA$ABORT",
            # UVWF,    PWVF  # S"FTA$ABORT",
            # WPCE,    PWVF  # S"FTA$I503", 
            # WPCS,    PWVF  # S"FTA$I503", 
            # WCCP,    PWVF  # S"FTA$I503", 
            # WCCC,    PWVF  # S"FTA$NOOP", 
            # XFER,    PWVF  # S"FTA$I503", 
            # DXQP,    PWVF  # S"FTA$I503", 
            # WPCP,    PWVF  # S"FTA$I503", 
            # WDCE,    PWVF  # S"FTA$I503" ]
  
          [ # IDLE,    PSSI  # S"FTA$ABORT",
            # WTUV,    PSSI  # S"FTA$I530", 
            # URWP,    PSSI  # S"FTA$I530", 
            # 2UWP,    PSSI  # S"FTA$B2UR", 
            # WDNC,    PSSI  # S"FTA$ABORT",
            # UVWA,    PSSI  # S"FTA$I503", 
            # UVWC,    PSSI  # S"FTA$ABORT",
            # UVWF,    PSSI  # S"FTA$ABORT",
            # WPCE,    PSSI  # S"FTA$I503", 
            # WPCS,    PSSI  # S"FTA$I503", 
            # WCCP,    PSSI  # S"FTA$I503", 
            # WCCC,    PSSI  # S"FTA$NOOP", 
            # XFER,    PSSI  # S"FTA$I503", 
            # DXQP,    PSSI  # S"FTA$I503", 
            # WPCP,    PSSI  # S"FTA$I503", 
            # WDCE,    PSSI  # S"FTA$I503" ]
  
          [ # IDLE,    USRI  # S"FTA$ABORT",
            # WTUV,    USRI  # S"FTA$I530", 
            # URWP,    USRI  # S"FTA$I530", 
            # 2UWP,    USRI  # S"FTA$B2UR", 
            # WDNC,    USRI  # S"FTA$ABORT",
            # UVWA,    USRI  # S"FTA$I503", 
            # UVWC,    USRI  # S"FTA$ABORT",
            # UVWF,    USRI  # S"FTA$B2UR", 
            # WPCE,    USRI  # S"FTA$I503", 
            # WPCS,    USRI  # S"FTA$I503", 
            # WCCP,    USRI  # S"FTA$I503", 
            # WCCC,    USRI  # S"FTA$NOOP", 
            # XFER,    USRI  # S"FTA$I503", 
            # DXQP,    USRI  # S"FTA$I503", 
            # WPCP,    USRI  # S"FTA$I503", 
            # WDCE,    USRI  # S"FTA$I503" ]
  
          [ # IDLE,    ACCV  # S"FTA$ABORT",
            # WTUV,    ACCV  # S"FTA$I530", 
            # URWP,    ACCV  # S"FTA$I530", 
            # 2UWP,    ACCV  # S"FTA$I530", 
            # WDNC,    ACCV  # S"FTA$ABORT",
            # UVWA,    ACCV  # S"FTA$I230", 
            # UVWC,    ACCV  # S"FTA$ABORT",
            # UVWF,    ACCV  # S"FTA$CMOK", 
            # WPCE,    ACCV  # S"FTA$I503", 
            # WPCS,    ACCV  # S"FTA$I503", 
            # WCCP,    ACCV  # S"FTA$I503", 
            # WCCC,    ACCV  # S"FTA$NOOP", 
            # XFER,    ACCV  # S"FTA$I503", 
            # DXQP,    ACCV  # S"FTA$I503", 
            # WPCP,    ACCV  # S"FTA$I503", 
            # WDCE,    ACCV  # S"FTA$I503" ]
  
          [ # IDLE,    ACCI  # S"FTA$ABORT",
            # WTUV,    ACCI  # S"FTA$I530", 
            # URWP,    ACCI  # S"FTA$I530", 
            # 2UWP,    ACCI  # S"FTA$I530", 
            # WDNC,    ACCI  # S"FTA$ABORT",
            # UVWA,    ACCI  # S"FTA$BACC", 
            # UVWC,    ACCI  # S"FTA$ABORT",
            # UVWF,    ACCI  # S"FTA$B2AC", 
            # WPCE,    ACCI  # S"FTA$I503", 
            # WPCS,    ACCI  # S"FTA$I503", 
            # WCCP,    ACCI  # S"FTA$I503", 
            # WCCC,    ACCI  # S"FTA$NOOP", 
            # XFER,    ACCI  # S"FTA$I503", 
            # DXQP,    ACCI  # S"FTA$I503", 
            # WPCP,    ACCI  # S"FTA$I503", 
            # WDCE,    ACCI  # S"FTA$I503" ]
  
          [ # IDLE,    SLUV  # S"FTA$SUVD", 
            # WTUV,    SLUV  # S"FTA$ABORT",
            # URWP,    SLUV  # S"FTA$ABORT",
            # 2UWP,    SLUV  # S"FTA$ABORT",
            # WDNC,    SLUV  # S"FTA$ABORT",
            # UVWA,    SLUV  # S"FTA$ABORT",
            # UVWC,    SLUV  # S"FTA$ABORT",
            # UVWF,    SLUV  # S"FTA$ABORT",
            # WPCE,    SLUV  # S"FTA$ABORT",
            # WPCS,    SLUV  # S"FTA$ABORT",
            # WCCP,    SLUV  # S"FTA$ABORT",
            # WCCC,    SLUV  # S"FTA$ABORT",
            # XFER,    SLUV  # S"FTA$ABORT",
            # DXQP,    SLUV  # S"FTA$ABORT",
            # WPCP,    SLUV  # S"FTA$ABORT",
            # WDCE,    SLUV  # S"FTA$ABORT" ] 
  
          [ # IDLE,    LUVF  # S"FTA$SUVF", 
            # WTUV,    LUVF  # S"FTA$ABORT",
            # URWP,    LUVF  # S"FTA$ABORT",
            # 2UWP,    LUVF  # S"FTA$ABORT",
            # WDNC,    LUVF  # S"FTA$ABORT",
            # UVWA,    LUVF  # S"FTA$ABORT",
            # UVWC,    LUVF  # S"FTA$ABORT",
            # UVWF,    LUVF  # S"FTA$ABORT",
            # WPCE,    LUVF  # S"FTA$ABORT",
            # WPCS,    LUVF  # S"FTA$ABORT",
            # WCCP,    LUVF  # S"FTA$ABORT",
            # WCCC,    LUVF  # S"FTA$ABORT",
            # XFER,    LUVF  # S"FTA$ABORT",
            # DXQP,    LUVF  # S"FTA$ABORT",
            # WPCP,    LUVF  # S"FTA$ABORT",
            # WDCE,    LUVF  # S"FTA$ABORT" ] 
  
          [ # IDLE,    UCMD  # S"FTA$ABORT",
            # WTUV,    UCMD  # S"FTA$BADR", 
            # URWP,    UCMD  # S"FTA$BADR", 
            # 2UWP,    UCMD  # S"FTA$BADR", 
            # WDNC,    UCMD  # S"FTA$ABORT",
            # UVWA,    UCMD  # S"FTA$BADR", 
            # UVWC,    UCMD  # S"FTA$ABORT",
            # UVWF,    UCMD  # S"FTA$BADR", 
            # WPCE,    UCMD  # S"FTA$BADR", 
            # WPCS,    UCMD  # S"FTA$BADR", 
            # WCCP,    UCMD  # S"FTA$BADR", 
            # WCCC,    UCMD  # S"FTA$NOOP", 
            # XFER,    UCMD  # S"FTA$BADR", 
            # DXQP,    UCMD  # S"FTA$BADR", 
            # WPCP,    UCMD  # S"FTA$BADR", 
            # WDCE,    UCMD  # S"FTA$BADR" ]
  
          [ # IDLE,    BSYN  # S"FTA$ABORT",
            # WTUV,    BSYN  # S"FTA$BPRM", 
            # URWP,    BSYN  # S"FTA$BPRM", 
            # 2UWP,    BSYN  # S"FTA$BPRM", 
            # WDNC,    BSYN  # S"FTA$ABORT",
            # UVWA,    BSYN  # S"FTA$BPRM", 
            # UVWC,    BSYN  # S"FTA$ABORT",
            # UVWF,    BSYN  # S"FTA$BPRM", 
            # WPCE,    BSYN  # S"FTA$BPRM", 
            # WPCS,    BSYN  # S"FTA$BPRM", 
            # WCCP,    BSYN  # S"FTA$BPRM", 
            # WCCC,    BSYN  # S"FTA$NOOP", 
            # XFER,    BSYN  # S"FTA$BPRM", 
            # DXQP,    BSYN  # S"FTA$BPRM", 
            # WPCP,    BSYN  # S"FTA$BPRM", 
            # WDCE,    BSYN  # S"FTA$BPRM" ]
  
          [ # IDLE,    UNSC  # S"FTA$ABORT",
            # WTUV,    UNSC  # S"FTA$CUNS", 
            # URWP,    UNSC  # S"FTA$CUNS", 
            # 2UWP,    UNSC  # S"FTA$CUNS", 
            # WDNC,    UNSC  # S"FTA$ABORT",
            # UVWA,    UNSC  # S"FTA$CUNS", 
            # UVWC,    UNSC  # S"FTA$ABORT",
            # UVWF,    UNSC  # S"FTA$CUNS", 
            # WPCE,    UNSC  # S"FTA$CUNS", 
            # WPCS,    UNSC  # S"FTA$CUNS", 
            # WCCP,    UNSC  # S"FTA$CUNS", 
            # WCCC,    UNSC  # S"FTA$NOOP", 
            # XFER,    UNSC  # S"FTA$CUNS", 
            # DXQP,    UNSC  # S"FTA$CUNS", 
            # WPCP,    UNSC  # S"FTA$CUNS", 
            # WDCE,    UNSC  # S"FTA$CUNS" ]
  
          [ # IDLE,    NOOP  # S"FTA$ABORT",
            # WTUV,    NOOP  # S"FTA$CMOK", 
            # URWP,    NOOP  # S"FTA$CMOK", 
            # 2UWP,    NOOP  # S"FTA$CMOK", 
            # WDNC,    NOOP  # S"FTA$ABORT",
            # UVWA,    NOOP  # S"FTA$CMOK", 
            # UVWC,    NOOP  # S"FTA$ABORT",
            # UVWF,    NOOP  # S"FTA$CMOK", 
            # WPCE,    NOOP  # S"FTA$I503", 
            # WPCS,    NOOP  # S"FTA$CMOK", 
            # WCCP,    NOOP  # S"FTA$I503", 
            # WCCC,    NOOP  # S"FTA$NOOP", 
            # XFER,    NOOP  # S"FTA$I503", 
            # DXQP,    NOOP  # S"FTA$I503", 
            # WPCP,    NOOP  # S"FTA$I503", 
            # WDCE,    NOOP  # S"FTA$I503" ]
  
          [ # IDLE,    PORT  # S"FTA$ABORT",
            # WTUV,    PORT  # S"FTA$I530", 
            # URWP,    PORT  # S"FTA$I530", 
            # 2UWP,    PORT  # S"FTA$I530", 
            # WDNC,    PORT  # S"FTA$ABORT",
            # UVWA,    PORT  # S"FTA$I503", 
            # UVWC,    PORT  # S"FTA$ABORT",
            # UVWF,    PORT  # S"FTA$PORT", 
            # WPCE,    PORT  # S"FTA$I503", 
            # WPCS,    PORT  # S"FTA$I503", 
            # WCCP,    PORT  # S"FTA$I503", 
            # WCCC,    PORT  # S"FTA$NOOP", 
            # XFER,    PORT  # S"FTA$I503", 
            # DXQP,    PORT  # S"FTA$I503", 
            # WPCP,    PORT  # S"FTA$I503", 
            # WDCE,    PORT  # S"FTA$I503" ]
  
          [ # IDLE,    PASV  # S"FTA$ABORT",
            # WTUV,    PASV  # S"FTA$I530", 
            # URWP,    PASV  # S"FTA$I530", 
            # 2UWP,    PASV  # S"FTA$I530", 
            # WDNC,    PASV  # S"FTA$ABORT",
            # UVWA,    PASV  # S"FTA$I503", 
            # UVWC,    PASV  # S"FTA$ABORT",
            # UVWF,    PASV  # S"FTA$PASV", 
            # WPCE,    PASV  # S"FTA$I503", 
            # WPCS,    PASV  # S"FTA$I227", 
            # WCCP,    PASV  # S"FTA$I503", 
            # WCCC,    PASV  # S"FTA$NOOP", 
            # XFER,    PASV  # S"FTA$I503", 
            # DXQP,    PASV  # S"FTA$I503", 
            # WPCP,    PASV  # S"FTA$I503", 
            # WDCE,    PASV  # S"FTA$I503" ]
  
          [ # IDLE,    PCNE  # S"FTA$ABORT",
            # WTUV,    PCNE  # S"FTA$ABORT",
            # URWP,    PCNE  # S"FTA$ABORT",
            # 2UWP,    PCNE  # S"FTA$ABORT",
            # WDNC,    PCNE  # S"FTA$ABORT",
            # UVWA,    PCNE  # S"FTA$ABORT",
            # UVWC,    PCNE  # S"FTA$ABORT",
            # UVWF,    PCNE  # S"FTA$ABORT",
            # WPCE,    PCNE  # S"FTA$I227", 
            # WPCS,    PCNE  # S"FTA$ABORT",
            # WCCP,    PCNE  # S"FTA$ABORT",
            # WCCC,    PCNE  # S"FTA$ABORT",
            # XFER,    PCNE  # S"FTA$ABORT",
            # DXQP,    PCNE  # S"FTA$ABORT",
            # WPCP,    PCNE  # S"FTA$I150", 
            # WDCE,    PCNE  # S"FTA$ABORT" ] 
  
          [ # IDLE,    TYPE  # S"FTA$ABORT",
            # WTUV,    TYPE  # S"FTA$I530", 
            # URWP,    TYPE  # S"FTA$I530", 
            # 2UWP,    TYPE  # S"FTA$I530", 
            # WDNC,    TYPE  # S"FTA$ABORT",
            # UVWA,    TYPE  # S"FTA$I503", 
            # UVWC,    TYPE  # S"FTA$ABORT",
            # UVWF,    TYPE  # S"FTA$TYPE", 
            # WPCE,    TYPE  # S"FTA$I503", 
            # WPCS,    TYPE  # S"FTA$TYPE", 
            # WCCP,    TYPE  # S"FTA$I503", 
            # WCCC,    TYPE  # S"FTA$NOOP", 
            # XFER,    TYPE  # S"FTA$I503", 
            # DXQP,    TYPE  # S"FTA$I503", 
            # WPCP,    TYPE  # S"FTA$I503", 
            # WDCE,    TYPE  # S"FTA$I503" ]
  
          [ # IDLE,    STRU  # S"FTA$ABORT",
            # WTUV,    STRU  # S"FTA$I530", 
            # URWP,    STRU  # S"FTA$I530", 
            # 2UWP,    STRU  # S"FTA$I530", 
            # WDNC,    STRU  # S"FTA$ABORT",
            # UVWA,    STRU  # S"FTA$I503", 
            # UVWC,    STRU  # S"FTA$ABORT",
            # UVWF,    STRU  # S"FTA$STRU", 
            # WPCE,    STRU  # S"FTA$I503", 
            # WPCS,    STRU  # S"FTA$STRU", 
            # WCCP,    STRU  # S"FTA$I503", 
            # WCCC,    STRU  # S"FTA$NOOP", 
            # XFER,    STRU  # S"FTA$I503", 
            # DXQP,    STRU  # S"FTA$I503", 
            # WPCP,    STRU  # S"FTA$I503", 
            # WDCE,    STRU  # S"FTA$I503" ]
  
          [ # IDLE,    MODE  # S"FTA$ABORT",
            # WTUV,    MODE  # S"FTA$I530", 
            # URWP,    MODE  # S"FTA$I530", 
            # 2UWP,    MODE  # S"FTA$I530", 
            # WDNC,    MODE  # S"FTA$ABORT",
            # UVWA,    MODE  # S"FTA$I503", 
            # UVWC,    MODE  # S"FTA$ABORT",
            # UVWF,    MODE  # S"FTA$MODE", 
            # WPCE,    MODE  # S"FTA$I503", 
            # WPCS,    MODE  # S"FTA$MODE", 
            # WCCP,    MODE  # S"FTA$I503", 
            # WCCC,    MODE  # S"FTA$NOOP", 
            # XFER,    MODE  # S"FTA$I503", 
            # DXQP,    MODE  # S"FTA$I503", 
            # WPCP,    MODE  # S"FTA$I503", 
            # WDCE,    MODE  # S"FTA$I503" ]
  
          [ # IDLE,    RETS  # S"FTA$ABORT",
            # WTUV,    RETS  # S"FTA$I530", 
            # URWP,    RETS  # S"FTA$I530", 
            # 2UWP,    RETS  # S"FTA$I530", 
            # WDNC,    RETS  # S"FTA$ABORT",
            # UVWA,    RETS  # S"FTA$I503", 
            # UVWC,    RETS  # S"FTA$ABORT",
            # UVWF,    RETS  # S"FTA$IADC", 
            # WPCE,    RETS  # S"FTA$I503", 
            # WPCS,    RETS  # S"FTA$I150", 
            # WCCP,    RETS  # S"FTA$I503", 
            # WCCC,    RETS  # S"FTA$NOOP", 
            # XFER,    RETS  # S"FTA$I503", 
            # DXQP,    RETS  # S"FTA$I503", 
            # WPCP,    RETS  # S"FTA$I503", 
            # WDCE,    RETS  # S"FTA$I503" ]
  
          [ # IDLE,    STOS  # S"FTA$ABORT",
            # WTUV,    STOS  # S"FTA$I530", 
            # URWP,    STOS  # S"FTA$I530", 
            # 2UWP,    STOS  # S"FTA$I530", 
            # WDNC,    STOS  # S"FTA$ABORT",
            # UVWA,    STOS  # S"FTA$I503", 
            # UVWC,    STOS  # S"FTA$ABORT",
            # UVWF,    STOS  # S"FTA$IADC", 
            # WPCE,    STOS  # S"FTA$I503", 
            # WPCS,    STOS  # S"FTA$I150", 
            # WCCP,    STOS  # S"FTA$I503", 
            # WCCC,    STOS  # S"FTA$NOOP", 
            # XFER,    STOS  # S"FTA$I503", 
            # DXQP,    STOS  # S"FTA$I503", 
            # WPCP,    STOS  # S"FTA$I503", 
            # WDCE,    STOS  # S"FTA$I503" ]
  
          [ # IDLE,    APPE  # S"FTA$ABORT",
            # WTUV,    APPE  # S"FTA$I530", 
            # URWP,    APPE  # S"FTA$I530", 
            # 2UWP,    APPE  # S"FTA$I530", 
            # WDNC,    APPE  # S"FTA$ABORT",
            # UVWA,    APPE  # S"FTA$I503", 
            # UVWC,    APPE  # S"FTA$ABORT",
            # UVWF,    APPE  # S"FTA$IADC", 
            # WPCE,    APPE  # S"FTA$I503", 
            # WPCS,    APPE  # S"FTA$I150", 
            # WCCP,    APPE  # S"FTA$I503", 
            # WCCC,    APPE  # S"FTA$NOOP", 
            # XFER,    APPE  # S"FTA$I503", 
            # DXQP,    APPE  # S"FTA$I503", 
            # WPCP,    APPE  # S"FTA$I503", 
            # WDCE,    APPE  # S"FTA$I503" ]
  
          [ # IDLE,    RETC  # S"FTA$ABORT",
            # WTUV,    RETC  # S"FTA$I530", 
            # URWP,    RETC  # S"FTA$I530", 
            # 2UWP,    RETC  # S"FTA$I530", 
            # WDNC,    RETC  # S"FTA$ABORT",
            # UVWA,    RETC  # S"FTA$I503", 
            # UVWC,    RETC  # S"FTA$ABORT",
            # UVWF,    RETC  # S"FTA$IPDC", 
            # WPCE,    RETC  # S"FTA$I503", 
            # WPCS,    RETC  # S"FTA$I150", 
            # WCCP,    RETC  # S"FTA$I503", 
            # WCCC,    RETC  # S"FTA$NOOP", 
            # XFER,    RETC  # S"FTA$I503", 
            # DXQP,    RETC  # S"FTA$I503", 
            # WPCP,    RETC  # S"FTA$I503", 
            # WDCE,    RETC  # S"FTA$I503" ]
  
          [ # IDLE,    STOC  # S"FTA$ABORT",
            # WTUV,    STOC  # S"FTA$I530", 
            # URWP,    STOC  # S"FTA$I530", 
            # 2UWP,    STOC  # S"FTA$I530", 
            # WDNC,    STOC  # S"FTA$ABORT",
            # UVWA,    STOC  # S"FTA$I503", 
            # UVWC,    STOC  # S"FTA$ABORT",
            # UVWF,    STOC  # S"FTA$IPDC", 
            # WPCE,    STOC  # S"FTA$I503", 
            # WPCS,    STOC  # S"FTA$I150", 
            # WCCP,    STOC  # S"FTA$I503", 
            # WCCC,    STOC  # S"FTA$NOOP", 
            # XFER,    STOC  # S"FTA$I503", 
            # DXQP,    STOC  # S"FTA$I503", 
            # WPCP,    STOC  # S"FTA$I503", 
            # WDCE,    STOC  # S"FTA$I503" ]
  
          [ # IDLE,    FANT  # S"FTA$ABORT",
            # WTUV,    FANT  # S"FTA$I530", 
            # URWP,    FANT  # S"FTA$I530", 
            # 2UWP,    FANT  # S"FTA$I530", 
            # WDNC,    FANT  # S"FTA$ABORT",
            # UVWA,    FANT  # S"FTA$I503", 
            # UVWC,    FANT  # S"FTA$ABORT",
            # UVWF,    FANT  # S"FTA$I550", 
            # WPCE,    FANT  # S"FTA$I503", 
            # WPCS,    FANT  # S"FTA$A550", 
            # WCCP,    FANT  # S"FTA$I503", 
            # WCCC,    FANT  # S"FTA$NOOP", 
            # XFER,    FANT  # S"FTA$I503", 
            # DXQP,    FANT  # S"FTA$I503", 
            # WPCP,    FANT  # S"FTA$I503", 
            # WDCE,    FANT  # S"FTA$I503" ]
  
          [ # IDLE,    ABXF  # S"FTA$ABORT",
            # WTUV,    ABXF  # S"FTA$ABORT",
            # URWP,    ABXF  # S"FTA$ABORT",
            # 2UWP,    ABXF  # S"FTA$ABORT",
            # WDNC,    ABXF  # S"FTA$ABORT",
            # UVWA,    ABXF  # S"FTA$ABORT",
            # UVWC,    ABXF  # S"FTA$ABORT",
            # UVWF,    ABXF  # S"FTA$NOOP", 
            # WPCE,    ABXF  # S"FTA$B226", 
            # WPCS,    ABXF  # S"FTA$ADCN", 
            # WCCP,    ABXF  # S"FTA$B226", 
            # WCCC,    ABXF  # S"FTA$NOOP", 
            # XFER,    ABXF  # S"FTA$ICDC", 
            # DXQP,    ABXF  # S"FTA$NOOP", 
            # WPCP,    ABXF  # S"FTA$B226", 
            # WDCE,    ABXF  # S"FTA$NOOP" ]
  
          [ # IDLE,    CNCD  # S"FTA$ABORT",
            # WTUV,    CNCD  # S"FTA$ABORT",
            # URWP,    CNCD  # S"FTA$ABORT",
            # 2UWP,    CBCD  # S"FTA$ABORT",
            # WDNC,    CNCD  # S"FTA$ABORT",
            # UVWA,    CNCD  # S"FTA$ABORT",
            # UVWC,    CNCD  # S"FTA$ABORT",
            # UVWF,    CNCD  # S"FTA$ABORT",
            # WPCE,    CNCD  # S"FTA$ABORT",
            # WPCS,    CNCD  # S"FTA$ADCN", 
            # WCCP,    CNCD  # S"FTA$ADTC", 
            # WCCC,    CNCD  # S"FTA$NOOP", 
            # XFER,    CNCD  # S"FTA$ABORT",
            # DXQP,    CNCD  # S"FTA$ABORT",
            # WPCP,    CNCD  # S"FTA$ABORT",
            # WDCE,    CNCD  # S"FTA$ABORT" ] 
  
          [ # IDLE,    DATA  # S"FTA$ABORT",
            # WTUV,    DATA  # S"FTA$ABORT",
            # URWP,    DATA  # S"FTA$ABORT",
            # 2UWP,    DATA  # S"FTA$ABORT",
            # WDNC,    DATA  # S"FTA$NOOP", 
            # UVWA,    DATA  # S"FTA$ABORT",
            # UVWC,    DATA  # S"FTA$ABORT",
            # UVWF,    DATA  # S"FTA$ABORT",
            # WPCE,    DATA  # S"FTA$ABORT",
            # WPCS,    DATA  # S"FTA$ABORT",
            # WCCP,    DATA  # S"FTA$ABORT",
            # WCCC,    DATA  # S"FTA$NOOP", 
            # XFER,    DATA  # S"FTA$DATA", 
            # DXQP,    DATA  # S"FTA$DATA", 
            # WPCP,    DATA  # S"FTA$ABORT",
            # WDCE,    DATA  # S"FTA$NOOP" ]
  
          [ # IDLE,    FCRL  # S"FTA$ABORT",
            # WTUV,    FCRL  # S"FTA$ABORT",
            # URWP,    FCRL  # S"FTA$ABORT",
            # 2UWP,    FCRL  # S"FTA$ABORT",
            # WDNC,    FCRL  # S"FTA$NOOP", 
            # UVWA,    FCRL  # S"FTA$ABORT",
            # UVWC,    FCRL  # S"FTA$ABORT",
            # UVWF,    FCRL  # S"FTA$ABORT",
            # WPCE,    FCRL  # S"FTA$ABORT",
            # WPCS,    FCRL  # S"FTA$ABORT",
            # WCCP,    FCRL  # S"FTA$ABORT",
            # WCCC,    FCRL  # S"FTA$NOOP", 
            # XFER,    FCRL  # S"FTA$DATA", 
            # DXQP,    FCRL  # S"FTA$DATA", 
            # WPCP,    FCRL  # S"FTA$ABORT",
            # WDCE,    FCRL  # S"FTA$NOOP" ]
  
          [ # IDLE,    CDCL  # S"FTA$ABORT",
            # WTUV,    CDCL  # S"FTA$ABORT",
            # URWP,    CDCL  # S"FTA$ABORT",
            # 2UWP,    CDCL  # S"FTA$ABORT",
            # WDNC,    CDCL  # S"FTA$NOOP", 
            # UVWA,    CDCL  # S"FTA$ABORT",
            # UVWC,    CDCL  # S"FTA$ABORT",
            # UVWF,    CDCL  # S"FTA$ABORT",
            # WPCE,    CDCL  # S"FTA$ABORT",
            # WPCS,    CDCL  # S"FTA$ABORT",
            # WCCP,    CDCL  # S"FTA$ABORT",
            # WCCC,    CDCL  # S"FTA$NOOP", 
            # XFER,    CDCL  # S"FTA$ACDC", 
            # DXQP,    CDCL  # S"FTA$C226", 
            # WPCP,    CDCL  # S"FTA$ABORT",
            # WDCE,    CDCL  # S"FTA$S226" ]
  
          [ # IDLE,    NOOD  # S"FTA$ABORT",
            # WTUV,    NOOD  # S"FTA$ABORT",
            # URWP,    NOOD  # S"FTA$ABORT",
            # 2UWP,    NOOD  # S"FTA$ABORT",
            # WDNC,    NOOD  # S"FTA$NOOP", 
            # UVWA,    NOOD  # S"FTA$ABORT",
            # UVWC,    NOOD  # S"FTA$ABORT",
            # UVWF,    NOOD  # S"FTA$ABORT",
            # WPCE,    NOOD  # S"FTA$ABORT",
            # WPCS,    NOOD  # S"FTA$ABORT",
            # WCCP,    NOOD  # S"FTA$ABORT",
            # WCCC,    NOOD  # S"FTA$NOOP", 
            # XFER,    NOOD  # S"FTA$ICDC", 
            # DXQP,    NOOD  # S"FTA$QUIT", 
            # WPCP,    NOOD  # S"FTA$ABORT",
            # WDCE,    NOOD  # S"FTA$NOOP" ]
  
          [ # IDLE,    RNFR  # S"FTA$ABORT",
            # WTUV,    RNFR  # S"FTA$I530", 
            # URWP,    RNFR  # S"FTA$I530", 
            # 2UWP,    RNFR  # S"FTA$I530", 
            # WDNC,    RNFR  # S"FTA$ABORT",
            # UVWA,    RNFR  # S"FTA$I503", 
            # UVWC,    RNFR  # S"FTA$ABORT",
            # UVWF,    RNFR  # S"FTA$RNFR", 
            # WPCE,    RNFR  # S"FTA$I503", 
            # WPCS,    RNFR  # S"FTA$RNFR", 
            # WCCP,    RNFR  # S"FTA$I503", 
            # WCCC,    RNFR  # S"FTA$NOOP", 
            # XFER,    RNFR  # S"FTA$I503", 
            # DXQP,    RNFR  # S"FTA$I503", 
            # WPCP,    RNFR  # S"FTA$I503", 
            # WDCE,    RNFR  # S"FTA$I503" ]
  
          [ # IDLE,    RNTO  # S"FTA$ABORT",
            # WTUV,    RNTO  # S"FTA$I530", 
            # URWP,    RNTO  # S"FTA$I530", 
            # 2UWP,    RNTO  # S"FTA$I530", 
            # WDNC,    RNTO  # S"FTA$ABORT",
            # UVWA,    RNTO  # S"FTA$I503", 
            # UVWC,    RNTO  # S"FTA$ABORT",
            # UVWF,    RNTO  # S"FTA$RNTO", 
            # WPCE,    RNTO  # S"FTA$I503", 
            # WPCS,    RNTO  # S"FTA$RNTO", 
            # WCCP,    RNTO  # S"FTA$I503", 
            # WCCC,    RNTO  # S"FTA$NOOP", 
            # XFER,    RNTO  # S"FTA$I503", 
            # DXQP,    RNTO  # S"FTA$I503", 
            # WPCP,    RNTO  # S"FTA$I503", 
            # WDCE,    RNTO  # S"FTA$I503" ]
  
          [ # IDLE,    IRNS  # S"FTA$ABORT",
            # WTUV,    IRNS  # S"FTA$I530", 
            # URWP,    IRNS  # S"FTA$I530", 
            # 2UWP,    IRNS  # S"FTA$I530", 
            # WDNC,    IRNS  # S"FTA$ABORT",
            # UVWA,    IRNS  # S"FTA$I503", 
            # UVWC,    IRNS  # S"FTA$ABORT",
            # UVWF,    IRNS  # S"FTA$I503", 
            # WPCE,    IRNS  # S"FTA$I503", 
            # WPCS,    IRNS  # S"FTA$I503", 
            # WCCP,    IRNS  # S"FTA$I503", 
            # WCCC,    IRNS  # S"FTA$NOOP", 
            # XFER,    IRNS  # S"FTA$I503", 
            # DXQP,    IRNS  # S"FTA$I503", 
            # WPCP,    IRNS  # S"FTA$I503", 
            # WDCE,    IRNS  # S"FTA$I503" ]
  
          [ # IDLE,    DELE  # S"FTA$ABORT",
            # WTUV,    DELE  # S"FTA$I530", 
            # URWP,    DELE  # S"FTA$I530", 
            # 2UWP,    DELE  # S"FTA$I530", 
            # WDNC,    DELE  # S"FTA$ABORT",
            # UVWA,    DELE  # S"FTA$I503", 
            # UVWC,    DELE  # S"FTA$ABORT",
            # UVWF,    DELE  # S"FTA$DELE", 
            # WPCE,    DELE  # S"FTA$I503", 
            # WPCS,    DELE  # S"FTA$DELE", 
            # WCCP,    DELE  # S"FTA$I503", 
            # WCCC,    DELE  # S"FTA$NOOP", 
            # XFER,    DELE  # S"FTA$I503", 
            # DXQP,    DELE  # S"FTA$I503", 
            # WPCP,    DELE  # S"FTA$I503", 
            # WDCE,    DELE  # S"FTA$I503" ]
  
          [ # IDLE,    LNLS  # S"FTA$ABORT",
            # WTUV,    LNLS  # S"FTA$I530", 
            # URWP,    LNLS  # S"FTA$I530", 
            # 2UWP,    LNLS  # S"FTA$I530", 
            # WDNC,    LNLS  # S"FTA$ABORT",
            # UVWA,    LNLS  # S"FTA$I503", 
            # UVWC,    LNLS  # S"FTA$ABORT",
            # UVWF,    LNLS  # S"FTA$IADC", 
            # WPCE,    LNLS  # S"FTA$I503", 
            # WPCS,    LNLS  # S"FTA$I150", 
            # WCCP,    LNLS  # S"FTA$I503", 
            # WCCC,    LNLS  # S"FTA$NOOP", 
            # XFER,    LNLS  # S"FTA$I503", 
            # DXQP,    LNLS  # S"FTA$I503", 
            # WPCP,    LNLS  # S"FTA$I503", 
            # WDCE,    LNLS  # S"FTA$I503" ]
  
          [ # IDLE,    HELP  # S"FTA$ABORT",
            # WTUV,    HELP  # S"FTA$HELP", 
            # URWP,    HELP  # S"FTA$I530", 
            # 2UWP,    HELP  # S"FTA$I530", 
            # WDNC,    HELP  # S"FTA$ABORT",
            # UVWA,    HELP  # S"FTA$I503", 
            # UVWC,    HELP  # S"FTA$ABORT",
            # UVWF,    HELP  # S"FTA$HELP", 
            # WPCE,    HELP  # S"FTA$I503", 
            # WPCS,    HELP  # S"FTA$HELP", 
            # WCCP,    HELP  # S"FTA$I503", 
            # WCCC,    HELP  # S"FTA$NOOP", 
            # XFER,    HELP  # S"FTA$I503", 
            # DXQP,    HELP  # S"FTA$I503", 
            # WPCP,    HELP  # S"FTA$I503", 
            # WDCE,    HELP  # S"FTA$I503" ]
  
          [ # IDLE,    QUIT  # S"FTA$ABORT",
            # WTUV,    QUIT  # S"FTA$ICCC", 
            # URWP,    QUIT  # S"FTA$ICCC", 
            # 2UWP,    QUIT  # S"FTA$ICCC", 
            # WDNC,    QUIT  # S"FTA$ABORT",
            # UVWA,    QUIT  # S"FTA$ICCC", 
            # UVWC,    QUIT  # S"FTA$ABORT",
            # UVWF,    QUIT  # S"FTA$ICCC", 
            # WPCE,    QUIT  # S"FTA$I503", 
            # WPCS,    QUIT  # S"FTA$ICCC", 
            # WCCP,    QUIT  # S"FTA$ICCC", 
            # WCCC,    QUIT  # S"FTA$NOOP", 
            # XFER,    QUIT  # S"FTA$NOOP", 
            # DXQP,    QUIT  # S"FTA$NOOP", 
            # WPCP,    QUIT  # S"FTA$I503", 
            # WDCE,    QUIT  # S"FTA$ICCC" ]
  
          [ # IDLE,    CTAB  # S"FTA$ABORT",
            # WTUV,    CTAB  # S"FTA$ABORT",
            # URWP,    CTAB  # S"FTA$ABORT",
            # 2UWP,    CTAB  # S"FTA$ABORT",
            # WDNC,    CTAB  # S"FTA$ABORT",
            # UVWA,    CTAB  # S"FTA$ABORT",
            # UVWC,    CTAB  # S"FTA$ABORT",
            # UVWF,    CTAB  # S"FTA$NOOP", 
            # WPCE,    CTAB  # S"FTA$ADCN", 
            # WPCS,    CTAB  # S"FTA$ADCN", 
            # WCCP,    CTAB  # S"FTA$ADCN", 
            # WCCC,    CTAB  # S"FTA$QUIT", 
            # XFER,    CTAB  # S"FTA$A426", 
            # DXQP,    CTAB  # S"FTA$QUIT", 
            # WPCP,    CTAB  # S"FTA$ADCN", 
            # WDCE,    CTAB  # S"FTA$NOOP" ]
  
          [ # IDLE,    ACAF  # S"FTA$ABORT",
            # WTUV,    ACAF  # S"FTA$ABORT",
            # URWP,    ACAF  # S"FTA$ABORT",
            # 2UWP,    ACAF  # S"FTA$ABORT",
            # WDNC,    ACAF  # S"FTA$ABORT",
            # UVWA,    ACAF  # S"FTA$ABORT",
            # UVWC,    ACAF  # S"FTA$ABORT",
            # UVWF,    ACAF  # S"FTA$ABORT",
            # WPCE,    ACAF  # S"FTA$ABORT",
            # WPCS,    ACAF  # S"FTA$ABORT",
            # WCCP,    ACAF  # S"FTA$QUIT", 
            # WCCC,    ACAF  # S"FTA$NOOP", 
            # XFER,    ACAF  # S"FTA$ABORT",
            # DXQP,    ACAF  # S"FTA$ABORT",
            # WPCP,    ACAF  # S"FTA$ABORT",
            # WDCE,    ACAF  # S"FTA$ABORT" ] 
  
          [ # IDLE,    CDAB  # S"FTA$ABORT",
            # WTUV,    CDAB  # S"FTA$ABORT",
            # URWP,    CDAB  # S"FTA$ABORT",
            # 2UWP,    CDAB  # S"FTA$ABORT",
            # WDNC,    CDAB  # S"FTA$NOOP", 
            # UVWA,    CDAB  # S"FTA$ABORT",
            # UVWC,    CDAB  # S"FTA$ABORT",
            # UVWF,    CDAB  # S"FTA$ABORT",
            # WPCE,    CDAB  # S"FTA$ABORT",
            # WPCS,    CDAB  # S"FTA$ABORT",
            # WCCP,    CDAB  # S"FTA$I426", 
            # WCCC,    CDAB  # S"FTA$NOOP", 
            # XFER,    CDAB  # S"FTA$A426", 
            # DXQP,    CDAB  # S"FTA$QUIT", 
            # WPCP,    CDAB  # S"FTA$ABORT",
            # WDCE,    CDAB  # S"FTA$NOOP" ]
  
          [ # IDLE,    CTCL  # S"FTA$ABORT",
            # WTUV,    CTCL  # S"FTA$ABORT",
            # URWP,    CTCL  # S"FTA$ABORT",
            # 2UWP,    CTCL  # S"FTA$ABORT",
            # WDNC,    CTCL  # S"FTA$ABORT",
            # UVWA,    CTCL  # S"FTA$ABORT",
            # UVWC,    CTCL  # S"FTA$ABORT",
            # UVWF,    CTCL  # S"FTA$NOOP", 
            # WPCE,    CTCL  # S"FTA$ADCN", 
            # WPCS,    CTCL  # S"FTA$ADCN", 
            # WCCP,    CTCL  # S"FTA$ADCN", 
            # WCCC,    CTCL  # S"FTA$QUIT", 
            # XFER,    CTCL  # S"FTA$A426", 
            # DXQP,    CTCL  # S"FTA$QUIT", 
            # WPCP,    CTCL  # S"FTA$ADCN", 
            # WDCE,    CTCL  # S"FTA$NOOP" ]
  
          [ # IDLE,    INCM  # S"FTA$ABORT",
            # WTUV,    INCM  # S"FTA$IXXX", 
            # URWP,    INCM  # S"FTA$IXXX", 
            # 2UWP,    INCM  # S"FTA$IXXX", 
            # WDNC,    INCM  # S"FTA$ABORT",
            # UVWA,    INCM  # S"FTA$IXXX", 
            # UVWC,    INCM  # S"FTA$ABORT",
            # UVWF,    INCM  # S"FTA$USER2",
            # WPCE,    INCM  # S"FTA$I503", 
            # WPCS,    INCM  # S"FTA$IXXX", 
            # WCCP,    INCM  # S"FTA$I503", 
            # WCCC,    INCM  # S"FTA$NOOP", 
            # XFER,    INCM  # S"FTA$I503", 
            # DXQP,    INCM  # S"FTA$I503", 
            # WPCP,    INCM  # S"FTA$I503", 
            # WDCE,    INCM  # S"FTA$I503" ]
  
          [ # IDLE,    CDAS  # S"FTA$ABORT",
            # WTUV,    CDAS  # S"FTA$ABORT",
            # URWP,    CDAS  # S"FTA$ABORT",
            # 2UWP,    CDAS  # S"FTA$ABORT",
            # WDNC,    CDAS  # S"FTA$NOOP", 
            # UVWA,    CDAS  # S"FTA$ABORT",
            # UVWC,    CDAS  # S"FTA$ABORT",
            # UVWF,    CDAS  # S"FTA$ABORT",
            # WPCE,    CDAS  # S"FTA$ABORT",
            # WPCS,    CDAS  # S"FTA$NOOP", 
            # WCCP,    CDAS  # S"FTA$NOOP", 
            # WCCC,    CDAS  # S"FTA$NOOP", 
            # XFER,    CDAS  # S"FTA$NOOP", 
            # DXQP,    CDAS  # S"FTA$QUIT", 
            # WPCP,    CDAS  # S"FTA$ABORT",
            # WDCE,    CDAS  # S"FTA$NOOP" ]
  
          [ # IDLE,    SYST  # S"FTA$ABORT",
            # WTUV,    SYST  # S"FTA$SYST", 
            # URWP,    SYST  # S"FTA$I530", 
            # 2UWP,    SYST  # S"FTA$I530", 
            # WDNC,    SYST  # S"FTA$ABORT",
            # UVWA,    SYST  # S"FTA$I503", 
            # WVWC,    SYST  # S"FTA$ABORT",
            # UVWF,    SYST  # S"FTA$SYST", 
            # WPCE,    SYST  # S"FTA$I503", 
            # WPCS,    SYST  # S"FTA$SYST", 
            # WCCP,    SYST  # S"FTA$I503", 
            # WCCC,    SYST  # S"FTA$NOOP", 
            # XFER,    SYST  # S"FTA$I503", 
            # DXQP,    SYST  # S"FTA$I503", 
            # WPCP,    SYST  # S"FTA$I503", 
            # WDCE,    SYST  # S"FTA$I503" ]
  
          [ # IDLE,    ALLO  # S"FTA$ABORT",
            # WTUV,    ALLO  # S"FTA$I530", 
            # URWP,    ALLO  # S"FTA$I530", 
            # 2UWP,    ALLO  # S"FTA$I530", 
            # WDNC,    ALLO  # S"FTA$ABORT",
            # UVWA,    ALLO  # S"FTA$I503", 
            # UVWC,    ALLO  # S"FTA$ABORT",
            # UVWF,    ALLO  # S"FTA$I202", 
            # WPCE,    ALLO  # S"FTA$I503", 
            # WPCS,    ALLO  # S"FTA$I503", 
            # WCCP,    ALLO  # S"FTA$I503", 
            # WCCC,    ALLO  # S"FTA$NOOP", 
            # XFER,    ALLO  # S"FTA$I503", 
            # DXQP,    ALLO  # S"FTA$I503", 
            # WPCP,    ALLO  # S"FTA$I503", 
            # WDCE,    ALLO  # S"FTA$I503" ]
  
          [ # IDLE,    SITE  # S"FTA$ABORT",
            # WTUV,    SITE  # S"FTA$I530", 
            # URWP,    SITE  # S"FTA$I530", 
            # 2UWP,    SITE  # S"FTA$I530", 
            # WDNC,    SITE  # S"FTA$SITE", 
            # UVWA,    SITE  # S"FTA$I503", 
            # UVWC,    SITE  # S"FTA$SITE", 
            # UVWF,    SITE  # S"FTA$SITE", 
            # WPCE,    SITE  # S"FTA$I503", 
            # WPCS,    SITE  # S"FTA$I503", 
            # WCCP,    SITE  # S"FTA$I503", 
            # WCCC,    SITE  # S"FTA$NOOP", 
            # XFER,    SITE  # S"FTA$I503", 
            # DXQP,    SITE  # S"FTA$I503", 
            # WPCP,    SITE  # S"FTA$I503", 
            # WDCE,    SITE  # S"FTA$I503" ]];
  
# 
*       NEXT STATE FOLLOWING COMPLETION OF ACTION.
# 
  
        ITEM FTP$ST$NXT S:FTS$CDS (00,12,12) = [
#           STATE      EVENT NEXT-STATE                                #
          [ # IDLE,    CCNC  # S"FTS$WTUV", 
            # WTUV,    CCNC  # S"FTS$IDLE", 
            # URWP,    CCNC  # S"FTS$IDLE", 
            # 2UWP,    CCNC  # S"FTS$IDLE", 
            # WDNC,    CCNC  # S"FTS$IDLE", 
            # UVWA,    CCNC  # S"FTS$IDLE", 
            # UVWC,    CCNC  # S"FTS$UVWF", 
            # UVWF,    CCNC  # S"FTS$IDLE", 
            # WPCE,    CCNC  # S"FTS$IDLE", 
            # WPCS,    CCNC  # S"FTS$IDLE", 
            # WCCP,    CCNC  # S"FTS$IDLE", 
            # WCCC,    CCNC  # S"FTS$IDLE", 
            # XFER,    CCNC  # S"FTS$IDLE", 
            # DXQP,    CCNC  # S"FTS$IDLE", 
            # WPCP,    CCNC  # S"FTS$IDLE", 
            # WDCE,    CCNC  # S"FTS$IDLE" ]
  
          [ # IDLE,    USER  # S"FTS$IDLE", 
            # WTUV,    USER  # S"FTS$URWP", 
            # URWP,    USER  # S"FTS$URWP", 
            # 2UWP,    USER  # S"FTS$2UWP", 
            # WDNC,    USER  # S"FTS$IDLE", 
            # UVWA,    USER  # S"FTS$UVWA", 
            # UVWC,    USER  # S"FTS$IDLE", 
            # UVWF,    USER  # S"FTS$2UWP", 
            # WPCE,    USER  # S"FTS$WPCE", 
            # WPCS,    USER  # S"FTS$WPCS", 
            # WCCP,    USER  # S"FTS$WCCP", 
            # WCCC,    USER  # S"FTS$WCCC", 
            # XFER,    USER  # S"FTS$XFER", 
            # DXQP,    USER  # S"FTS$DXQP", 
            # WPCP,    USER  # S"FTS$WPCP", 
            # WDCE,    USER  # S"FTS$WDCE" ]
  
          [ # IDLE,    UPVT  # S"FTS$IDLE", 
            # WTUV,    UPVT  # S"FTS$UVWF", 
            # URWP,    UPVT  # S"FTS$UVWF", 
            # 2UWP,    UPVT  # S"FTS$UVWF", 
            # WDNC,    UPVT  # S"FTS$IDLE", 
            # UVWA,    UPVT  # S"FTS$UVWA", 
            # UVWC,    UPVT  # S"FTS$IDLE", 
            # UVWF,    UPVT  # S"FTS$UVWF", 
            # WPCE,    UPVT  # S"FTS$WPCE", 
            # WPCS,    UPVT  # S"FTS$WPCS", 
            # WCCP,    UPVT  # S"FTS$WCCP", 
            # WCCC,    UPVT  # S"FTS$WCCC", 
            # XFER,    UPVT  # S"FTS$XFER", 
            # DXQP,    UPVT  # S"FTS$DXQP", 
            # WPCP,    UPVT  # S"FTS$WPCP", 
            # WDCE,    UPVT  # S"FTS$WDCE" ]
  
          [ # IDLE,    UPVF  # S"FTS$IDLE", 
            # WTUV,    UPVF  # S"FTS$UVWA", 
            # URWP,    UPVF  # S"FTS$UVWA", 
            # 2UWP,    UPVF  # S"FTS$UVWA", 
            # WDNC,    UPVF  # S"FTS$IDLE", 
            # UVWA,    UPVF  # S"FTS$UVWA", 
            # UVWC,    UPVF  # S"FTS$IDLE", 
            # UVWF,    UPVF  # S"FTS$UVWA", 
            # WPCE,    UPVF  # S"FTS$WPCE", 
            # WPCS,    UPVF  # S"FTS$WPCS", 
            # WCCP,    UPVF  # S"FTS$WCCP", 
            # WCCC,    UPVF  # S"FTS$WCCC", 
            # XFER,    UPVF  # S"FTS$XFER", 
            # DXQP,    UPVF  # S"FTS$DXQP", 
            # WPCP,    UPVF  # S"FTS$WPCP", 
            # WDCE,    UPVF  # S"FTS$WDCE" ]
  
          [ # IDLE,    PWVT  # S"FTS$IDLE", 
            # WTUV,    PWVT  # S"FTS$IDLE", 
            # URWP,    PWVT  # S"FTS$UVWF", 
            # 2UWP,    PWVT  # S"FTS$UVWF", 
            # WDNC,    PWVT  # S"FTS$IDLE", 
            # UVWA,    PWVT  # S"FTS$UVWA", 
            # UVWC,    PWVT  # S"FTS$IDLE", 
            # UVWF,    PWVT  # S"FTS$IDLE", 
            # WPCE,    PWVT  # S"FTS$WPCE", 
            # WPCS,    PWVT  # S"FTS$WPCS", 
            # WCCP,    PWVT  # S"FTS$WCCP", 
            # WCCC,    PWVT  # S"FTS$WCCC", 
            # XFER,    PWVT  # S"FTS$XFER", 
            # DXQP,    PWVT  # S"FTS$DXQP", 
            # WPCP,    PWVT  # S"FTS$WPCP", 
            # WDCE,    PWVT  # S"FTS$WDCE" ]
  
          [ # IDLE,    PWVF  # S"FTS$IDLE", 
            # WTUV,    PWVF  # S"FTS$IDLE", 
            # URWP,    PWVF  # S"FTS$UVWA", 
            # 2UWP,    PWVF  # S"FTS$UVWA", 
            # WDNC,    PWVF  # S"FTS$IDLE", 
            # UVWA,    PWVF  # S"FTS$UVWA", 
            # UVWC,    PWVF  # S"FTS$IDLE", 
            # UVWF,    PWVF  # S"FTS$IDLE", 
            # WPCE,    PWVF  # S"FTS$WPCE", 
            # WPCS,    PWVF  # S"FTS$WPCS", 
            # WCCP,    PWVF  # S"FTS$WCCP", 
            # WCCC,    PWVF  # S"FTS$WCCC", 
            # XFER,    PWVF  # S"FTS$XFER", 
            # DXQP,    PWVF  # S"FTS$DXQP", 
            # WPCP,    PWVF  # S"FTS$WPCP", 
            # WDCE,    PWVF  # S"FTS$WDCE" ]
  
          [ # IDLE,    PSSI  # S"FTS$IDLE", 
            # WTUV,    PSSI  # S"FTS$WTUV", 
            # URWP,    PSSI  # S"FTS$WTUV", 
            # 2UWP,    PSSI  # S"FTS$UVWF", 
            # WDNC,    PSSI  # S"FTS$IDLE", 
            # UVWA,    PSSI  # S"FTS$UVWA", 
            # UVWC,    PSSI  # S"FTS$IDLE", 
            # UVWF,    PSSI  # S"FTS$IDLE", 
            # WPCE,    PSSI  # S"FTS$WPCE", 
            # WPCS,    PSSI  # S"FTS$WPCS", 
            # WCCP,    PSSI  # S"FTS$WCCP", 
            # WCCC,    PSSI  # S"FTS$WCCC", 
            # XFER,    PSSI  # S"FTS$XFER", 
            # DXQP,    PSSI  # S"FTS$DXQP", 
            # WPCP,    PSSI  # S"FTS$WPCP", 
            # WDCE,    PSSI  # S"FTS$WDCE" ]
  
          [ # IDLE,    USRI  # S"FTS$IDLE", 
            # WTUV,    USRI  # S"FTS$WTUV", 
            # URWP,    USRI  # S"FTS$WTUV", 
            # 2UWP,    USRI  # S"FTS$UVWF", 
            # WDNC,    USRI  # S"FTS$IDLE", 
            # UVWA,    USRI  # S"FTS$UVWA", 
            # UVWC,    USRI  # S"FTS$IDLE", 
            # UVWF,    USRI  # S"FTS$UVWF", 
            # WPCE,    USRI  # S"FTS$WPCE", 
            # WPCS,    USRI  # S"FTS$WPCS", 
            # WCCP,    USRI  # S"FTS$WCCP", 
            # WCCC,    USRI  # S"FTS$WCCC", 
            # XFER,    USRI  # S"FTS$XFER", 
            # DXQP,    USRI  # S"FTS$DXQP", 
            # WPCP,    USRI  # S"FTS$WPCP", 
            # WDCE,    USRI  # S"FTS$WDCE" ]
  
          [ # IDLE,    ACCV  # S"FTS$IDLE", 
            # WTUV,    ACCV  # S"FTS$WTUV", 
            # URWP,    ACCV  # S"FTS$URWP", 
            # 2UWP,    ACCV  # S"FTS$2UWP", 
            # WDNC,    ACCV  # S"FTS$IDLE", 
            # UVWA,    ACCV  # S"FTS$UVWF", 
            # UVWC,    ACCV  # S"FTS$IDLE", 
            # UVWF,    ACCV  # S"FTS$UVWF", 
            # WPCE,    ACCV  # S"FTS$WPCE", 
            # WPCS,    ACCV  # S"FTS$WPCS", 
            # WCCP,    ACCV  # S"FTS$WCCP", 
            # WCCC,    ACCV  # S"FTS$WCCC", 
            # XFER,    ACCV  # S"FTS$XFER", 
            # DXQP,    ACCV  # S"FTS$DXQP", 
            # WPCP,    ACCV  # S"FTS$WPCP", 
            # WDCE,    ACCV  # S"FTS$WDCE" ]
  
          [ # IDLE,    ACCI  # S"FTS$IDLE", 
            # WTUV,    ACCI  # S"FTS$WTUV", 
            # URWP,    ACCI  # S"FTS$URWP", 
            # 2UWP,    ACCI  # S"FTS$2UWP", 
            # WDNC,    ACCI  # S"FTS$IDLE", 
            # UVWA,    ACCI  # S"FTS$UVWA", 
            # UVWC,    ACCI  # S"FTS$IDLE", 
            # UVWF,    ACCI  # S"FTS$UVWF", 
            # WPCE,    ACCI  # S"FTS$WPCE", 
            # WPCS,    ACCI  # S"FTS$WPCS", 
            # WCCP,    ACCI  # S"FTS$WCCP", 
            # WCCC,    ACCI  # S"FTS$WCCC", 
            # XFER,    ACCI  # S"FTS$XFER", 
            # DXQP,    ACCI  # S"FTS$DXQP", 
            # WPCP,    ACCI  # S"FTS$WPCP", 
            # WDCE,    ACCI  # S"FTS$WDCE" ]
  
          [ # IDLE,    SLUV  # S"FTS$UVWC", 
            # WTUV,    SLUV  # S"FTS$IDLE", 
            # URWP,    SLUV  # S"FTS$IDLE", 
            # 2UWP,    SLUV  # S"FTS$IDLE", 
            # WDNC,    SLUV  # S"FTS$IDLE", 
            # UVWA,    SLUV  # S"FTS$IDLE", 
            # UVWC,    SLUV  # S"FTS$IDLE", 
            # UVWF,    SLUV  # S"FTS$IDLE", 
            # WPCE,    SLUV  # S"FTS$IDLE", 
            # WPCS,    SLUV  # S"FTS$IDLE", 
            # WCCP,    SLUV  # S"FTS$IDLE", 
            # WCCC,    SLUV  # S"FTS$IDLE", 
            # XFER,    SLUV  # S"FTS$IDLE", 
            # DXQP,    SLUV  # S"FTS$IDLE", 
            # WPCP,    SLUV  # S"FTS$IDLE", 
            # WDCE,    SLUV  # S"FTS$IDLE" ]
  
          [ # IDLE,    LUVF  # S"FTS$UVWC", 
            # WTUV,    LUVF  # S"FTS$IDLE", 
            # URWP,    LUVF  # S"FTS$IDLE", 
            # 2UWP,    LUVF  # S"FTS$IDLE", 
            # WDNC,    LUVF  # S"FTS$IDLE", 
            # UVWA,    LUVF  # S"FTS$IDLE", 
            # UVWC,    LUVF  # S"FTS$IDLE", 
            # UVWF,    LUVF  # S"FTS$IDLE", 
            # WPCE,    LUVF  # S"FTS$IDLE", 
            # WPCS,    LUVF  # S"FTS$IDLE", 
            # WCCP,    LUVF  # S"FTS$IDLE", 
            # WCCC,    LUVF  # S"FTS$IDLE", 
            # XFER,    LUVF  # S"FTS$IDLE", 
            # DXQP,    LUVF  # S"FTS$IDLE", 
            # WPCP,    LUVF  # S"FTS$IDLE", 
            # WDCE,    LUVF  # S"FTS$IDLE" ]
  
          [ # IDLE,    UCMD  # S"FTS$IDLE", 
            # WTUV,    UCMD  # S"FTS$WTUV", 
            # URWP,    UCMD  # S"FTS$URWP", 
            # 2UWP,    UCMD  # S"FTS$2UWP", 
            # WDNC,    UCMD  # S"FTS$IDLE", 
            # UVWA,    UCMD  # S"FTS$UVWA", 
            # UVWC,    UCMD  # S"FTS$IDLE", 
            # UVWF,    UCMD  # S"FTS$UVWF", 
            # WPCE,    UCMD  # S"FTS$WPCE", 
            # WPCS,    UCMD  # S"FTS$WPCS", 
            # WCCP,    UCMD  # S"FTS$WCCP", 
            # WCCC,    UCMD  # S"FTS$WCCC", 
            # XFER,    UCMD  # S"FTS$XFER", 
            # DXQP,    UCMD  # S"FTS$DXQP", 
            # WPCP,    UCMD  # S"FTS$WPCP", 
            # WDCE,    UCMD  # S"FTS$WDCE" ]
  
          [ # IDLE,    BSYN  # S"FTS$IDLE", 
            # WTUV,    BSYN  # S"FTS$WTUV", 
            # URWP,    BSYN  # S"FTS$WTUV", 
            # 2UWP,    BSYN  # S"FTS$UVWF", 
            # WDNC,    BSYN  # S"FTS$IDLE", 
            # UVWA,    BSYN  # S"FTS$UVWA", 
            # UVWC,    BSYN  # S"FTS$IDLE", 
            # UVWF,    BSYN  # S"FTS$UVWF", 
            # WPCE,    BSYN  # S"FTS$WPCE", 
            # WPCS,    BSYN  # S"FTS$WPCS", 
            # WCCP,    BSYN  # S"FTS$WCCP", 
            # WCCC,    BSYN  # S"FTS$WCCC", 
            # XFER,    BSYN  # S"FTS$XFER", 
            # DXQP,    BSYN  # S"FTS$DXQP", 
            # WPCP,    BSYN  # S"FTS$WPCP", 
            # WDCE,    BSYN  # S"FTS$WDCE" ]
  
          [ # IDLE,    UNSC  # S"FTS$IDLE", 
            # WTUV,    UNSC  # S"FTS$WTUV", 
            # URWP,    UNSC  # S"FTS$URWP", 
            # 2UWP,    UNSC  # S"FTS$2UWP", 
            # WDNC,    UNSC  # S"FTS$IDLE", 
            # UVWA,    UNSC  # S"FTS$UVWA", 
            # UVWC,    UNSC  # S"FTS$IDLE", 
            # UVWF,    UNSC  # S"FTS$UVWF", 
            # WPCE,    UNSC  # S"FTS$WPCE", 
            # WPCS,    UNSC  # S"FTS$WPCS", 
            # WCCP,    UNSC  # S"FTS$WCCP", 
            # WCCC,    UNSC  # S"FTS$WCCC", 
            # XFER,    UNSC  # S"FTS$XFER", 
            # DXQP,    UNSC  # S"FTS$DXQP", 
            # WPCP,    UNSC  # S"FTS$WPCP", 
            # WDCE,    UNSC  # S"FTS$WDCE" ]
  
          [ # IDLE,    NOOP  # S"FTS$IDLE", 
            # WTUV,    NOOP  # S"FTS$WTUV", 
            # URWP,    NOOP  # S"FTS$URWP", 
            # 2UWP,    NOOP  # S"FTS$2UWP", 
            # WDNC,    NOOP  # S"FTS$IDLE", 
            # UVWA,    NOOP  # S"FTS$UVWA", 
            # UVWC,    NOOP  # S"FTS$IDLE", 
            # UVWF,    NOOP  # S"FTS$UVWF", 
            # WPCE,    NOOP  # S"FTS$WPCE", 
            # WPCS,    NOOP  # S"FTS$WPCS", 
            # WCCP,    NOOP  # S"FTS$WCCP", 
            # WCCC,    NOOP  # S"FTS$WCCC", 
            # XFER,    NOOP  # S"FTS$XFER", 
            # DXQP,    NOOP  # S"FTS$DXQP", 
            # WPCP,    NOOP  # S"FTS$WPCP", 
            # WDCE,    NOOP  # S"FTS$WDCE" ]
  
          [ # IDLE,    PORT  # S"FTS$IDLE", 
            # WTUV,    PORT  # S"FTS$WTUV", 
            # URWP,    PORT  # S"FTS$URWP", 
            # 2UWP,    PORT  # S"FTS$2UWP", 
            # WDNC,    PORT  # S"FTS$IDLE", 
            # UVWA,    PORT  # S"FTS$UVWA", 
            # UVWC,    PORT  # S"FTS$IDLE", 
            # UVWF,    PORT  # S"FTS$UVWF", 
            # WPCE,    PORT  # S"FTS$WPCE", 
            # WPCS,    PORT  # S"FTS$WPCS", 
            # WCCP,    PORT  # S"FTS$WCCP", 
            # WCCC,    PORT  # S"FTS$WCCC", 
            # XFER,    PORT  # S"FTS$XFER", 
            # DXQP,    PORT  # S"FTS$DXQP", 
            # WPCP,    PORT  # S"FTS$WPCP", 
            # WDCE,    PORT  # S"FTS$WDCE" ]
  
          [ # IDLE,    PASV  # S"FTS$IDLE", 
            # WTUV,    PASV  # S"FTS$WTUV", 
            # URWP,    PASV  # S"FTS$URWP", 
            # 2UWP,    PASV  # S"FTS$2UWP", 
            # WDNC,    PASV  # S"FTS$IDLE", 
            # UVWA,    PASV  # S"FTS$UVWA", 
            # UVWC,    PASV  # S"FTS$IDLE", 
            # UVWF,    PASV  # S"FTS$WPCE", 
            # WPCE,    PASV  # S"FTS$WPCE", 
            # WPCS,    PASV  # S"FTS$WPCS", 
            # WCCP,    PASV  # S"FTS$WCCP", 
            # WCCC,    PASV  # S"FTS$WCCC", 
            # XFER,    PASV  # S"FTS$XFER", 
            # DXQP,    PASV  # S"FTS$DXQP", 
            # WPCP,    PASV  # S"FTS$WPCP", 
            # WDCE,    PASV  # S"FTS$WDCE" ]
  
          [ # IDLE,    PCNE  # S"FTS$IDLE", 
            # WTUV,    PCNE  # S"FTS$IDLE", 
            # URWP,    PCNE  # S"FTS$IDLE", 
            # 2UWP,    PCNE  # S"FTS$IDLE", 
            # WDNC,    PCNE  # S"FTS$IDLE", 
            # UVWA,    PCNE  # S"FTS$IDLE", 
            # UVWC,    PCNE  # S"FTS$IDLE", 
            # UVWF,    PCNE  # S"FTS$IDLE", 
            # WPCE,    PCNE  # S"FTS$WPCS", 
            # WPCS,    PCNE  # S"FTS$IDLE", 
            # WCCP,    PCNE  # S"FTS$IDLE", 
            # WCCC,    PCNE  # S"FTS$WCCC", 
            # XFER,    PCNE  # S"FTS$IDLE", 
            # DXQP,    PCNE  # S"FTS$IDLE", 
            # WPCP,    PCNE  # S"FTS$WCCP", 
            # WDCE,    PCNE  # S"FTS$IDLE" ]
  
          [ # IDLE,    TYPE  # S"FTS$IDLE", 
            # WTUV,    TYPE  # S"FTS$WTUV", 
            # URWP,    TYPE  # S"FTS$URWP", 
            # 2UWP,    TYPE  # S"FTS$2UWP", 
            # WDNC,    TYPE  # S"FTS$IDLE", 
            # UVWA,    TYPE  # S"FTS$UVWA", 
            # UVWC,    TYPE  # S"FTS$IDLE", 
            # UVWF,    TYPE  # S"FTS$UVWF", 
            # WPCE,    TYPE  # S"FTS$WPCE", 
            # WPCS,    TYPE  # S"FTS$WPCS", 
            # WCCP,    TYPE  # S"FTS$WCCP", 
            # WCCC,    TYPE  # S"FTS$WCCC", 
            # XFER,    TYPE  # S"FTS$XFER", 
            # DXQP,    TYPE  # S"FTS$DXQP", 
            # WPCP,    TYPE  # S"FTS$WPCP", 
            # WDCE,    TYPE  # S"FTS$WDCE" ]
  
          [ # IDLE,    STRU  # S"FTS$IDLE", 
            # WTUV,    STRU  # S"FTS$WTUV", 
            # URWP,    STRU  # S"FTS$URWP", 
            # 2UWP,    STRU  # S"FTS$2UWP", 
            # WDNC,    STRU  # S"FTS$IDLE", 
            # UVWA,    STRU  # S"FTS$UVWA", 
            # UVWC,    STRU  # S"FTS$IDLE", 
            # UVWF,    STRU  # S"FTS$UVWF", 
            # WPCE,    STRU  # S"FTS$WPCE", 
            # WPCS,    STRU  # S"FTS$WPCS", 
            # WCCP,    STRU  # S"FTS$WCCP", 
            # WCCC,    STRU  # S"FTS$WCCC", 
            # XFER,    STRU  # S"FTS$XFER", 
            # DXQP,    STRU  # S"FTS$DXQP", 
            # WPCP,    STRU  # S"FTS$WPCP", 
            # WDCE,    STRU  # S"FTS$WDCE" ]
  
          [ # IDLE,    MODE  # S"FTS$IDLE", 
            # WTUV,    MODE  # S"FTS$WTUV", 
            # URWP,    MODE  # S"FTS$URWP", 
            # 2UWP,    MODE  # S"FTS$2UWP", 
            # WDNC,    MODE  # S"FTS$IDLE", 
            # UVWA,    MODE  # S"FTS$UVWA", 
            # UVWC,    MODE  # S"FTS$IDLE", 
            # UVWF,    MODE  # S"FTS$UVWF", 
            # WPCE,    MODE  # S"FTS$WPCE", 
            # WPCS,    MODE  # S"FTS$WPCS", 
            # WCCP,    MODE  # S"FTS$WCCP", 
            # WCCC,    MODE  # S"FTS$WCCC", 
            # XFER,    MODE  # S"FTS$XFER", 
            # DXQP,    MODE  # S"FTS$DXQP", 
            # WPCP,    MODE  # S"FTS$WPCP", 
            # WDCE,    MODE  # S"FTS$WDCE" ]
  
          [ # IDLE,    RETS  # S"FTS$IDLE", 
            # WTUV,    RETS  # S"FTS$WTUV", 
            # URWP,    RETS  # S"FTS$URWP", 
            # 2UWP,    RETS  # S"FTS$2UWP", 
            # WDNC,    RETS  # S"FTS$IDLE", 
            # UVWA,    RETS  # S"FTS$UVWA", 
            # UVWC,    RETS  # S"FTS$IDLE", 
            # UVWF,    RETS  # S"FTS$WCCP", 
            # WPCE,    RETS  # S"FTS$WPCE", 
            # WPCS,    RETS  # S"FTS$WCCP", 
            # WCCP,    RETS  # S"FTS$WCCP", 
            # WCCC,    RETS  # S"FTS$WCCC", 
            # XFER,    RETS  # S"FTS$XFER", 
            # DXQP,    RETS  # S"FTS$DXQP", 
            # WPCP,    RETS  # S"FTS$WPCP", 
            # WDCE,    RETS  # S"FTS$WDCE" ]
  
          [ # IDLE,    STOS  # S"FTS$IDLE", 
            # WTUV,    STOS  # S"FTS$WTUV", 
            # URWP,    STOS  # S"FTS$URWP", 
            # 2UWP,    STOS  # S"FTS$2UWP", 
            # WDNC,    STOS  # S"FTS$IDLE", 
            # UVWA,    STOS  # S"FTS$UVWA", 
            # UVWC,    STOS  # S"FTS$IDLE", 
            # UVWF,    STOS  # S"FTS$WCCP", 
            # WPCE,    STOS  # S"FTS$WPCE", 
            # WPCS,    STOS  # S"FTS$WCCP", 
            # WCCP,    STOS  # S"FTS$WCCP", 
            # WCCC,    STOS  # S"FTS$WCCC", 
            # XFER,    STOS  # S"FTS$XFER", 
            # DXQP,    STOS  # S"FTS$DXQP", 
            # WPCP,    STOS  # S"FTS$WPCP", 
            # WDCE,    STOS  # S"FTS$WDCE" ]
  
          [ # IDLE,    APPE  # S"FTS$IDLE", 
            # WTUV,    APPE  # S"FTS$WTUV", 
            # URWP,    APPE  # S"FTS$URWP", 
            # 2UWP,    APPE  # S"FTS$2UWP", 
            # WDNC,    APPE  # S"FTS$IDLE", 
            # UVWA,    APPE  # S"FTS$UVWA", 
            # UVWC,    APPE  # S"FTS$IDLE", 
            # UVWF,    APPE  # S"FTS$WCCP", 
            # WPCE,    APPE  # S"FTS$WPCE", 
            # WPCS,    APPE  # S"FTS$WCCP", 
            # WCCP,    APPE  # S"FTS$WCCP", 
            # WCCC,    APPE  # S"FTS$WCCC", 
            # XFER,    APPE  # S"FTS$XFER", 
            # DXQP,    APPE  # S"FTS$DXQP", 
            # WPCP,    APPE  # S"FTS$WPCP", 
            # WDCE,    APPE  # S"FTS$WDCE" ]
  
          [ # IDLE,    RETC  # S"FTS$IDLE", 
            # WTUV,    RETC  # S"FTS$WTUV", 
            # URWP,    RETC  # S"FTS$URWP", 
            # 2UWP,    RETC  # S"FTS$2UWP", 
            # WDNC,    RETC  # S"FTS$IDLE", 
            # UVWA,    RETC  # S"FTS$UVWA", 
            # UVWC,    RETC  # S"FTS$IDLE", 
            # UVWF,    RETC  # S"FTS$WPCP", 
            # WPCE,    RETC  # S"FTS$WPCE", 
            # WPCS,    RETC  # S"FTS$WCCP", 
            # WCCP,    RETC  # S"FTS$WCCP", 
            # WCCC,    RETC  # S"FTS$WCCC", 
            # XFER,    RETC  # S"FTS$XFER", 
            # DXQP,    RETC  # S"FTS$DXQP", 
            # WPCP,    RETC  # S"FTS$WPCP", 
            # WDCE,    RETC  # S"FTS$WDCE" ]
  
          [ # IDLE,    STOC  # S"FTS$IDLE", 
            # WTUV,    STOC  # S"FTS$WTUV", 
            # URWP,    STOC  # S"FTS$URWP", 
            # 2UWP,    STOC  # S"FTS$2UWP", 
            # WDNC,    STOC  # S"FTS$IDLE", 
            # UVWA,    STOC  # S"FTS$UVWA", 
            # UVWC,    STOC  # S"FTS$IDLE", 
            # UVWF,    STOC  # S"FTS$WPCP", 
            # WPCE,    STOC  # S"FTS$WPCE", 
            # WPCS,    STOC  # S"FTS$WCCP", 
            # WCCP,    STOC  # S"FTS$WCCP", 
            # WCCC,    STOC  # S"FTS$WCCC", 
            # XFER,    STOC  # S"FTS$XFER", 
            # DXQP,    STOC  # S"FTS$DXQP", 
            # WPCP,    STOC  # S"FTS$WPCP", 
            # WDCE,    STOC  # S"FTS$WDCE" ]
  
          [ # IDLE,    FANT  # S"FTS$IDLE", 
            # WTUV,    FANT  # S"FTS$WTUV", 
            # URWP,    FANT  # S"FTS$URWP", 
            # 2UWP,    FANT  # S"FTS$2UWP", 
            # WDNC,    FANT  # S"FTS$IDLE", 
            # UVWA,    FANT  # S"FTS$UVWA", 
            # UVWC,    FANT  # S"FTS$IDLE", 
            # UVWF,    FANT  # S"FTS$UVWF", 
            # WPCE,    FANT  # S"FTS$WPCE", 
            # WPCS,    FANT  # S"FTS$WPCS", 
            # WCCP,    FANT  # S"FTS$WCCP", 
            # WCCC,    FANT  # S"FTS$WCCC", 
            # XFER,    FANT  # S"FTS$XFER", 
            # DXQP,    FANT  # S"FTS$DXQP", 
            # WPCP,    FANT  # S"FTS$WPCP", 
            # WDCE,    FANT  # S"FTS$WDCE" ]
  
          [ # IDLE,    ABXF  # S"FTS$IDLE", 
            # WTUV,    ABXF  # S"FTS$IDLE", 
            # URWP,    ABXF  # S"FTS$IDLE", 
            # 2UWP,    ABXF  # S"FTS$IDLE", 
            # WDNC,    ABXF  # S"FTS$IDLE", 
            # UVWA,    ABXF  # S"FTS$IDLE", 
            # UVWC,    ABXF  # S"FTS$IDLE", 
            # UVWF,    ABXF  # S"FTS$UVWF", 
            # WPCE,    ABXF  # S"FTS$WDCE", 
            # WPCS,    ABXF  # S"FTS$WDCE", 
            # WCCP,    ABXF  # S"FTS$WDCE", 
            # WCCC,    ABXF  # S"FTS$WCCC", 
            # XFER,    ABXF  # S"FTS$WDCE", 
            # DXQP,    ABXF  # S"FTS$DXQP", 
            # WPCP,    ABXF  # S"FTS$WDCE", 
            # WDCE,    ABXF  # S"FTS$WDCE" ]
  
          [ # IDLE,    CNCD  # S"FTS$IDLE", 
            # WTUV,    CNCD  # S"FTS$IDLE", 
            # URWP,    CNCD  # S"FTS$IDLE", 
            # 2UWP,    CNCD  # S"FTS$IDLE", 
            # WDNC,    CNCD  # S"FTS$IDLE", 
            # UVWA,    CNCD  # S"FTS$IDLE", 
            # UVWC,    CNCD  # S"FTS$IDLE", 
            # UVWF,    CNCD  # S"FTS$IDLE", 
            # WPCE,    CNCD  # S"FTS$IDLE", 
            # WPCS,    CNCD  # S"FTS$WDCE", 
            # WCCP,    CNCD  # S"FTS$XFER", 
            # WCCC,    CNCD  # S"FTS$WCCC", 
            # XFER,    CNCD  # S"FTS$IDLE", 
            # DXQP,    CNCD  # S"FTS$IDLE", 
            # WPCP,    CNCD  # S"FTS$IDLE", 
            # WDCE,    CNCD  # S"FTS$IDLE" ]
  
          [ # IDLE,    DATA  # S"FTS$IDLE", 
            # WTUV,    DATA  # S"FTS$IDLE", 
            # URWP,    DATA  # S"FTS$IDLE", 
            # 2UWP,    DATA  # S"FTS$IDLE", 
            # WDNC,    DATA  # S"FTS$WDNC", 
            # UVWA,    DATA  # S"FTS$IDLE", 
            # UVWC,    DATA  # S"FTS$IDLE", 
            # UVWF,    DATA  # S"FTS$IDLE", 
            # WPCE,    DATA  # S"FTS$IDLE", 
            # WPCS,    DATA  # S"FTS$IDLE", 
            # WCCP,    DATA  # S"FTS$IDLE", 
            # WCCC,    DATA  # S"FTS$WCCC", 
            # XFER,    DATA  # S"FTS$XFER", 
            # DXQP,    DATA  # S"FTS$DXQP", 
            # WPCP,    DATA  # S"FTS$IDLE", 
            # WDCE,    DATA  # S"FTS$WDCE" ]
  
          [ # IDLE,    FCRL  # S"FTS$IDLE", 
            # WTUV,    FCRL  # S"FTS$IDLE", 
            # URWP,    FCRL  # S"FTS$IDLE", 
            # 2UWP,    FCRL  # S"FTS$IDLE", 
            # WDNC,    FCRL  # S"FTS$WDNC", 
            # UVWA,    FCRL  # S"FTS$IDLE", 
            # UVWC,    FCRL  # S"FTS$IDLE", 
            # UVWF,    FCRL  # S"FTS$IDLE", 
            # WPCE,    FCRL  # S"FTS$IDLE", 
            # WPCS,    FCRL  # S"FTS$IDLE", 
            # WCCP,    FCRL  # S"FTS$IDLE", 
            # WCCC,    FCRL  # S"FTS$WCCC", 
            # XFER,    FCRL  # S"FTS$XFER", 
            # DXQP,    FCRL  # S"FTS$DXQP", 
            # WPCP,    FCRL  # S"FTS$IDLE", 
            # WDCE,    FCRL  # S"FTS$WDCE" ]
  
          [ # IDLE,    CDCL  # S"FTS$IDLE", 
            # WTUV,    CDCL  # S"FTS$IDLE", 
            # URWP,    CDCL  # S"FTS$IDLE", 
            # 2UWP,    CDCL  # S"FTS$IDLE", 
            # WDNC,    CDCL  # S"FTS$UVWC", 
            # UVWA,    CDCL  # S"FTS$IDLE", 
            # UVWC,    CDCL  # S"FTS$IDLE", 
            # UVWF,    CDCL  # S"FTS$IDLE", 
            # WPCE,    CDCL  # S"FTS$IDLE", 
            # WPCS,    CDCL  # S"FTS$IDLE", 
            # WCCP,    CDCL  # S"FTS$IDLE", 
            # WCCC,    CDCL  # S"FTS$WCCC", 
            # XFER,    CDCL  # S"FTS$UVWF", 
            # DXQP,    CDCL  # S"FTS$WCCC", 
            # WPCP,    CDCL  # S"FTS$IDLE", 
            # WDCE,    CDCL  # S"FTS$UVWF" ]
  
          [ # IDLE,    NOOD  # S"FTS$IDLE", 
            # WTUV,    NOOD  # S"FTS$IDLE", 
            # URWP,    NOOD  # S"FTS$IDLE", 
            # 2UWP,    NOOD  # S"FTS$IDLE", 
            # WDNC,    NOOD  # S"FTS$WDNC", 
            # UVWA,    NOOD  # S"FTS$IDLE", 
            # UVWC,    NOOD  # S"FTS$IDLE", 
            # UVWF,    NOOD  # S"FTS$IDLE", 
            # WPCE,    NOOD  # S"FTS$IDLE", 
            # WPCS,    NOOD  # S"FTS$IDLE", 
            # WCCP,    NOOD  # S"FTS$IDLE", 
            # WCCC,    NOOD  # S"FTS$WCCC", 
            # XFER,    NOOD  # S"FTS$WDCE", 
            # DXQP,    NOOD  # S"FTS$DXQP", 
            # WPCP,    NOOD  # S"FTS$IDLE", 
            # WDCE,    NOOD  # S"FTS$WDCE" ]
  
          [ # IDLE,    RNFR  # S"FTS$IDLE", 
            # WTUV,    RNFR  # S"FTS$WTUV", 
            # URWP,    RNFR  # S"FTS$URWP", 
            # 2UWP,    RNFR  # S"FTS$2UWP", 
            # WDNC,    RNFR  # S"FTS$IDLE", 
            # UVWA,    RNFR  # S"FTS$UVWA", 
            # UVWC,    RNFR  # S"FTS$IDLE", 
            # UVWF,    RNFR  # S"FTS$UVWF", 
            # WPCE,    RNFR  # S"FTS$WPCE", 
            # WPCS,    RNFR  # S"FTS$WPCS", 
            # WCCP,    RNFR  # S"FTS$WCCP", 
            # WCCC,    RNFR  # S"FTS$WCCC", 
            # XFER,    RNFR  # S"FTS$XFER", 
            # DXQP,    RNFR  # S"FTS$DXQP", 
            # WPCP,    RNFR  # S"FTS$WPCP", 
            # WDCE,    RNFR  # S"FTS$WDCE" ]
  
          [ # IDLE,    RNTO  # S"FTS$IDLE", 
            # WTUV,    RNTO  # S"FTS$WTUV", 
            # URWP,    RNTO  # S"FTS$URWP", 
            # 2UWP,    RNTO  # S"FTS$2UWP", 
            # WDNC,    RNTO  # S"FTS$IDLE", 
            # UVWA,    RNTO  # S"FTS$UVWA", 
            # UVWC,    RNTO  # S"FTS$IDLE", 
            # UVWF,    RNTO  # S"FTS$UVWF", 
            # WPCE,    RNTO  # S"FTS$WPCE", 
            # WPCS,    RNTO  # S"FTS$WPCS", 
            # WCCP,    RNTO  # S"FTS$WCCP", 
            # WCCC,    RNTO  # S"FTS$WCCC", 
            # XFER,    RNTO  # S"FTS$XFER", 
            # DXQP,    RNTO  # S"FTS$DXQP", 
            # WPCP,    RNTO  # S"FTS$WPCP", 
            # WDCE,    RNTO  # S"FTS$WDCE" ]
  
          [ # IDLE,    IRNS  # S"FTS$IDLE", 
            # WTUV,    IRNS  # S"FTS$WTUV", 
            # URWP,    IRNS  # S"FTS$URWP", 
            # 2UWP,    IRNS  # S"FTS$2UWP", 
            # WDNC,    IRNS  # S"FTS$IDLE", 
            # UVWA,    IRNS  # S"FTS$UVWA", 
            # UVWC,    IRNS  # S"FTS$IDLE", 
            # UVWF,    IRNS  # S"FTS$UVWF", 
            # WPCE,    IRNS  # S"FTS$WPCE", 
            # WPCS,    IRNS  # S"FTS$WPCS", 
            # WCCP,    IRNS  # S"FTS$WCCP", 
            # WCCC,    IRNS  # S"FTS$WCCC", 
            # XFER,    IRNS  # S"FTS$XFER", 
            # DXQP,    IRNS  # S"FTS$DXQP", 
            # WPCP,    IRNS  # S"FTS$WPCP", 
            # WDCE,    IRNS  # S"FTS$WDCE" ]
  
          [ # IDLE,    DELE  # S"FTS$IDLE", 
            # WTUV,    DELE  # S"FTS$WTUV", 
            # URWP,    DELE  # S"FTS$URWP", 
            # 2UWP,    DELE  # S"FTS$2UWP", 
            # WDNC,    DELE  # S"FTS$IDLE", 
            # UVWA,    DELE  # S"FTS$UVWA", 
            # UVWC,    DELE  # S"FTS$IDLE", 
            # UVWF,    DELE  # S"FTS$UVWF", 
            # WPCE,    DELE  # S"FTS$WPCE", 
            # WPCS,    DELE  # S"FTS$WPCS", 
            # WCCP,    DELE  # S"FTS$WCCP", 
            # WCCC,    DELE  # S"FTS$WCCC", 
            # XFER,    DELE  # S"FTS$XFER", 
            # DXQP,    DELE  # S"FTS$DXQP", 
            # WPCP,    DELE  # S"FTS$WPCP", 
            # WDCE,    DELE  # S"FTS$WDCE" ]
  
          [ # IDLE,    LNLS  # S"FTS$IDLE", 
            # WTUV,    LNLS  # S"FTS$WTUV", 
            # URWP,    LNLS  # S"FTS$URWP", 
            # 2UWP,    LNLS  # S"FTS$2UWP", 
            # WDNC,    LNLS  # S"FTS$IDLE", 
            # UVWA,    LNLS  # S"FTS$UVWA", 
            # UVWC,    LNLS  # S"FTS$IDLE", 
            # UVWF,    LNLS  # S"FTS$WCCP", 
            # WPCE,    LNLS  # S"FTS$WPCE", 
            # WPCS,    LNLS  # S"FTS$WCCP", 
            # WCCP,    LNLS  # S"FTS$WCCP", 
            # WCCC,    LNLS  # S"FTS$WCCC", 
            # XFER,    LNLS  # S"FTS$XFER", 
            # DXQP,    LNLS  # S"FTS$DXQP", 
            # WPCP,    LNLS  # S"FTS$WPCP", 
            # WDCE,    LNLS  # S"FTS$WDCE" ]
  
          [ # IDLE,    HELP  # S"FTS$IDLE", 
            # WTUV,    HELP  # S"FTS$WTUV", 
            # URWP,    HELP  # S"FTS$URWP", 
            # 2UWP,    HELP  # S"FTS$2UWP", 
            # WDNC,    HELP  # S"FTS$IDLE", 
            # UVWA,    HELP  # S"FTS$UVWA", 
            # UVWC,    HELP  # S"FTS$IDLE", 
            # UVWF,    HELP  # S"FTS$UVWF", 
            # WPCE,    HELP  # S"FTS$WPCE", 
            # WPCS,    HELP  # S"FTS$WPCS", 
            # WCCP,    HELP  # S"FTS$WCCP", 
            # WCCC,    HELP  # S"FTS$WCCC", 
            # XFER,    HELP  # S"FTS$XFER", 
            # DXQP,    HELP  # S"FTS$DXQP", 
            # WPCP,    HELP  # S"FTS$WPCP", 
            # WDCE,    HELP  # S"FTS$WDCE" ]
  
          [ # IDLE,    QUIT  # S"FTS$IDLE", 
            # WTUV,    QUIT  # S"FTS$WCCC", 
            # URWP,    QUIT  # S"FTS$WCCC", 
            # 2UWP,    QUIT  # S"FTS$WCCC", 
            # WDNC,    QUIT  # S"FTS$IDLE", 
            # UVWA,    QUIT  # S"FTS$WCCC", 
            # UVWC,    QUIT  # S"FTS$IDLE", 
            # UVWF,    QUIT  # S"FTS$WCCC", 
            # WPCE,    QUIT  # S"FTS$WPCE", 
            # WPCS,    QUIT  # S"FTS$WCCC", 
            # WCCP,    QUIT  # S"FTS$WCCC", 
            # WCCC,    QUIT  # S"FTS$WCCC", 
            # XFER,    QUIT  # S"FTS$DXQP", 
            # DXQP,    QUIT  # S"FTS$DXQP", 
            # WPCP,    QUIT  # S"FTS$WPCP", 
            # WDCE,    QUIT  # S"FTS$WCCC" ]
  
          [ # IDLE,    CTAB  # S"FTS$IDLE", 
            # WTUV,    CTAB  # S"FTS$IDLE", 
            # URWP,    CTAB  # S"FTS$IDLE", 
            # 2UWP,    CTAB  # S"FTS$IDLE", 
            # WDNC,    CTAB  # S"FTS$IDLE", 
            # UVWA,    CTAB  # S"FTS$IDLE", 
            # UVWC,    CTAB  # S"FTS$IDLE", 
            # UVWF,    CTAB  # S"FTS$UVWC", 
            # WPCE,    CTAB  # S"FTS$WDNC", 
            # WPCS,    CTAB  # S"FTS$WDNC", 
            # WCCP,    CTAB  # S"FTS$WDNC", 
            # WCCC,    CTAB  # S"FTS$IDLE", 
            # XFER,    CTAB  # S"FTS$WDNC", 
            # DXQP,    CTAB  # S"FTS$IDLE", 
            # WPCP,    CTAB  # S"FTS$WDNC", 
            # WDCE,    CTAB  # S"FTS$WDNC" ]
  
          [ # IDLE,    ACAF  # S"FTS$IDLE", 
            # WTUV,    ACAF  # S"FTS$IDLE", 
            # URWP,    ACAF  # S"FTS$IDLE", 
            # 2UWP,    ACAF  # S"FTS$IDLE", 
            # WDNC,    ACAF  # S"FTS$IDLE", 
            # UVWA,    ACAF  # S"FTS$IDLE", 
            # UVWC,    ACAF  # S"FTS$IDLE", 
            # UVWF,    ACAF  # S"FTS$IDLE", 
            # WPCE,    ACAF  # S"FTS$IDLE", 
            # WPCS,    ACAF  # S"FTS$IDLE", 
            # WCCP,    ACAF  # S"FTS$IDLE", 
            # WCCC,    ACAF  # S"FTS$WCCC", 
            # XFER,    ACAF  # S"FTS$IDLE", 
            # DXQP,    ACAF  # S"FTS$IDLE", 
            # WPCP,    ACAF  # S"FTS$IDLE", 
            # WDCE,    ACAF  # S"FTS$IDLE" ]
  
          [ # IDLE,    CDAB  # S"FTS$IDLE", 
            # WTUV,    CDAB  # S"FTS$IDLE", 
            # URWP,    CDAB  # S"FTS$IDLE", 
            # 2UWP,    CDAB  # S"FTS$IDLE", 
            # WDNC,    CDAB  # S"FTS$UVWC", 
            # UVWA,    CDAB  # S"FTS$IDLE", 
            # UVWC,    CDAB  # S"FTS$IDLE", 
            # UVWF,    CDAB  # S"FTS$IDLE", 
            # WPCE,    CDAB  # S"FTS$IDLE", 
            # WPCS,    CDAB  # S"FTS$IDLE", 
            # WCCP,    CDAB  # S"FTS$UVWF", 
            # WCCC,    CDAB  # S"FTS$WCCC", 
            # XFER,    CDAB  # S"FTS$UVWF", 
            # DXQP,    CDAB  # S"FTS$DXQP", 
            # WPCP,    CDAB  # S"FTS$IDLE", 
            # WDCE,    CDAB  # S"FTS$UVWF" ]
  
          [ # IDLE,    CTCL  # S"FTS$IDLE", 
            # WTUV,    CTCL  # S"FTS$IDLE", 
            # URWP,    CTCL  # S"FTS$IDLE", 
            # 2UWP,    CTCL  # S"FTS$IDLE", 
            # WDNC,    CTCL  # S"FTS$IDLE", 
            # UVWA,    CTCL  # S"FTS$IDLE", 
            # UVWC,    CTCL  # S"FTS$IDLE", 
            # UVWF,    CTCL  # S"FTS$UVWC", 
            # WPCE,    CTCL  # S"FTS$WDNC", 
            # WPCS,    CTCL  # S"FTS$WDNC", 
            # WCCP,    CTCL  # S"FTS$WDNC", 
            # WCCC,    CTCL  # S"FTS$IDLE", 
            # XFER,    CTCL  # S"FTS$WDNC", 
            # DXQP,    CTCL  # S"FTS$IDLE", 
            # WPCP,    CTCL  # S"FTS$WDNC", 
            # WDCE,    CTCL  # S"FTS$WDNC" ]
  
          [ # IDLE,    INCM  # S"FTS$IDLE", 
            # WTUV,    INCM  # S"FTS$WTUV", 
            # URWP,    INCM  # S"FTS$URWP", 
            # 2UWP,    INCM  # S"FTS$2UWP", 
            # WDNC,    INCM  # S"FTS$IDLE", 
            # UVWA,    INCM  # S"FTS$UVWA", 
            # UVWC,    INCM  # S"FTS$IDLE", 
            # UVWF,    INCM  # S"FTS$UVWF", 
            # WPCE,    INCM  # S"FTS$WPCE", 
            # WPCS,    INCM  # S"FTS$WPCS", 
            # WCCP,    INCM  # S"FTS$WCCP", 
            # WCCC,    INCM  # S"FTS$WCCC", 
            # XFER,    INCM  # S"FTS$XFER", 
            # DXQP,    INCM  # S"FTS$DXQP", 
            # WPCP,    INCM  # S"FTS$WPCP", 
            # WDCE,    INCM  # S"FTS$WDCE" ]
  
          [ # IDLE,    CDAS  # S"FTS$IDLE", 
            # WTUV,    CDAS  # S"FTS$IDLE", 
            # URWP,    CDAS  # S"FTS$IDLE", 
            # 2UWP,    CDAS  # S"FTS$IDLE", 
            # WDNC,    CDAS  # S"FTS$UVWC", 
            # UVWA,    CDAS  # S"FTS$IDLE", 
            # UVWC,    CDAS  # S"FTS$IDLE", 
            # UVWF,    CDAS  # S"FTS$IDLE", 
            # WPCE,    CDAS  # S"FTS$IDLE", 
            # WPCS,    CDAS  # S"FTS$UVWF", 
            # WCCP,    CDAS  # S"FTS$UVWF", 
            # WCCC,    CDAS  # S"FTS$WCCC", 
            # XFER,    CDAS  # S"FTS$UVWF", 
            # DXQP,    CDAS  # S"FTS$DXQP", 
            # WPCP,    CDAS  # S"FTS$IDLE", 
            # WDCE,    CDAS  # S"FTS$UVWF" ]
  
          [ # IDLE,    SYST  # S"FTS$IDLE", 
            # WTUV,    SYST  # S"FTS$WTUV", 
            # URWP,    SYST  # S"FTS$URWP", 
            # 2UWP,    SYST  # S"FTS$2UWP", 
            # WDNC,    SYST  # S"FTS$IDLE", 
            # UVWA,    SYST  # S"FTS$UVWA", 
            # WVWC,    SYST  # S"FTS$IDLE", 
            # UVWF,    SYST  # S"FTS$UVWF", 
            # WPCE,    SYST  # S"FTS$WPCE", 
            # WPCS,    SYST  # S"FTS$WPCS", 
            # WCCP,    SYST  # S"FTS$WCCP", 
            # WCCC,    SYST  # S"FTS$WCCC", 
            # XFER,    SYST  # S"FTS$XFER", 
            # DXQP,    SYST  # S"FTS$DXQP", 
            # WPCP,    SYST  # S"FTS$WPCP", 
            # WDCE,    SYST  # S"FTS$WDCE" ]
  
          [ # IDLE,    ALLO  # S"FTS$IDLE", 
            # WTUV,    ALLO  # S"FTS$WTUV", 
            # URWP,    ALLO  # S"FTS$URWP", 
            # 2UWP,    ALLO  # S"FTS$2UWP", 
            # WDNC,    ALLO  # S"FTS$IDLE", 
            # UVWA,    ALLO  # S"FTS$UVWA", 
            # UVWC,    ALLO  # S"FTS$IDLE", 
            # UVWF,    ALLO  # S"FTS$UVWF", 
            # WPCE,    ALLO  # S"FTS$WPCE", 
            # WPCS,    ALLO  # S"FTS$WPCS", 
            # WCCP,    ALLO  # S"FTS$WCCP", 
            # WCCC,    ALLO  # S"FTS$WCCC", 
            # XFER,    ALLO  # S"FTS$XFER", 
            # DXQP,    ALLO  # S"FTS$DXQP", 
            # WPCP,    ALLO  # S"FTS$WPCP", 
            # WDCE,    ALLO  # S"FTS$WDCE" ]
  
          [ # IDLE,    SITE  # S"FTS$IDLE", 
            # WTUV,    SITE  # S"FTS$WTUV", 
            # URWP,    SITE  # S"FTS$URWP", 
            # 2UWP,    SITE  # S"FTS$2UWP", 
            # WDNC,    SITE  # S"FTS$IDLE", 
            # UVWA,    SITE  # S"FTS$UVWA", 
            # UVWC,    SITE  # S"FTS$IDLE", 
            # UVWF,    SITE  # S"FTS$UVWF", 
            # WPCE,    SITE  # S"FTS$WPCE", 
            # WPCS,    SITE  # S"FTS$WPCS", 
            # WCCP,    SITE  # S"FTS$WCCP", 
            # WCCC,    SITE  # S"FTS$WCCC", 
            # XFER,    SITE  # S"FTS$XFER", 
            # DXQP,    SITE  # S"FTS$DXQP", 
            # WPCP,    SITE  # S"FTS$WPCP", 
            # WDCE,    SITE  # S"FTS$WDCE" ]];
  
        END # FTP$ST$TBL     #
  
      CONTROL EJECT;
# 
*     INCOMING INDICATIONS ARE MAPPED INTO A TRIGGER. 
*     SOME INDICATIONS DO NOT MAP DIRECTLY INTO A TRIGGER,
*     FURTHER PROCESSING IS REQUIRED TO GENERATE THE APPROPRIATE
*     TRIGGER.
# 
  
      ARRAY INDMAP [ICM"ICDATAV" : ICM"ICABTXFR"] S(1); 
        BEGIN 
        ITEM IND$MAP     U(00,00,60) =
         [ # ICDATAV     # FTE$CDS"FTE$DATA", 
           # ICPASVCONE  # FTE$CDS"FTE$PCNE", 
           # ICCONCMP    # FTE$CDS"FTE$CCNC", 
           # ICFCREL     # FTE$CDS"FTE$FCRL", 
           # ICCONCLSD   # FTE$CDS"FTE$CTCL", 
           # ICNODATA    # FTE$CDS"FTE$NOOD", 
           # ICUVALID    # FTE$CDS"FTE$SLUV", 
           # ICACFAIL    # FTE$CDS"FTE$ACAF", 
           # ICCONABT    # FTE$CDS"FTE$CTAB", 
           # ICCONABS    # FTE$CDS"FTE$CDAS", 
           # ICABTXFR    # FTE$CDS"FTE$ABXF" ]; 
        END 
  
# 
*     SWITCH ON INCOMING INDICATIONS. 
* 
*     NOTE:  FOR THOSE INDICATIONS THAT ARE DIRECTLY MAPPED 
*            INTO A TRIGGER VIA THE *IND$MAP* TABLE, NO 
*            FURTHER PROCESSING IS REQUIRED I.E. GOES TO
*            LABEL *IND$END*. 
# 
  
 SWITCH IND$JMP   : ICM 
         IND$DATA : ICDATAV,                # DATA AVAILABLE           #
         IND$END  : ICPASVCONE,             # PASSIVE CN. ESTABLISHED  #
         IND$CNCP : ICCONCMP,               # CONNECTION COMPLETED     #
         IND$END  : ICFCREL,                # FLOW CONTROL RELEASED    #
         IND$CNCL : ICCONCLSD,              # CONNECTION CLOSED        #
         IND$NODA : ICNODATA,               # NO DATA AVAILABLE        #
         IND$SLUV : ICUVALID,               # SET LOCAL VALIDN (CLIENT)#
         IND$END  : ICACFAIL,               # ACTIVE CN ATTEMPT FAILURE#
         IND$CNAB : ICCONABT,               # CN ABORTED - UNSOLICITED #
         IND$END  : ICCONABS,               # CN ABORTED - SOLICITED   #
         IND$END  : ICABTXFR;               # ABORT DATA TRANSFER      #
  
# 
*     THIS IS A SECOND MAP TABLE FOR DATA AVAILABLE (NOT ON DATA
*     CONNECTION) INDICATION. 
# 
  
      ARRAY CMDMAP [ABOR$CMD : USER$CMD] S(1);
        BEGIN 
        ITEM CMD$MAP     U(00,00,60) =
          [# ABOR$CMD    # FTE$CDS"FTE$UNSC", 
           # ACCT$CMD    # FTE$CDS"FTE$ACCV", 
           # ALLO$CMD    # FTE$CDS"FTE$ALLO", 
           # APPE$CMD    # FTE$CDS"FTE$APPE", 
           # CDUP$CMD    # FTE$CDS"FTE$UNSC", 
  
           # CWD$CMD     # FTE$CDS"FTE$UNSC", 
           # DELE$CMD    # FTE$CDS"FTE$DELE", 
           # HELP$CMD    # FTE$CDS"FTE$HELP", 
           # LIST$CMD    # FTE$CDS"FTE$LNLS", 
           # MODE$CMD    # FTE$CDS"FTE$MODE", 
  
           # MKD$$CMD    # FTE$CDS"FTE$UNSC", 
           # NLST$CMD    # FTE$CDS"FTE$LNLS", 
           # NOOP$CMD    # FTE$CDS"FTE$NOOP", 
           # PASS$CMD    # FTE$CDS"FTE$PWVF", 
           # PASV$CMD    # FTE$CDS"FTE$PASV", 
  
           # PORT$CMD    # FTE$CDS"FTE$PORT", 
           # PWD$CMD     # FTE$CDS"FTE$UNSC", 
           # QUIT$CMD    # FTE$CDS"FTE$QUIT", 
           # REIN$CMD    # FTE$CDS"FTE$UNSC", 
           # REST$CMD    # FTE$CDS"FTE$UNSC", 
  
           # RETR$CMD    # FTE$CDS"FTE$RETS", 
           # RMD$CMD     # FTE$CDS"FTE$UNSC", 
           # RNFR$CMD    # FTE$CDS"FTE$RNFR", 
           # RNTO$CMD    # FTE$CDS"FTE$RNTO", 
           # SITE$CMD    # FTE$CDS"FTE$SITE", 
  
           # SMNT$CMD    # FTE$CDS"FTE$UNSC", 
           # STAT$CMD    # FTE$CDS"FTE$UNSC", 
           # STOR$CMD    # FTE$CDS"FTE$STOS", 
           # STOU$CMD    # FTE$CDS"FTE$UNSC", 
           # STRU$CMD    # FTE$CDS"FTE$STRU", 
  
           # SYST$CMD    # FTE$CDS"FTE$SYST", 
           # TYPE$CMD    # FTE$CDS"FTE$TYPE", 
           # USER$CMD    # FTE$CDS"FTE$USER"];
        END 
  
# 
*     SWITCH ON ACTION. 
# 
  
 SWITCH ACTION$SW : FTA$CDS            # ACTION SWITCH                 #
           A$I220  : FTA$I220,         # ISSUE 220 RSP                 #
           A$PASS  : FTA$PASS,         # PROMPT FOR PASSWORD           #
           A$I230  : FTA$I230,         # ISSUE 230 RSP                 #
           A$ACCT  : FTA$ACCT,         # PROMPT FOR ACCOUNTING INFO    #
           A$I530  : FTA$I530,         # ISSUE 530 RSP                 #
           A$USER2 : FTA$USER2,        # 502 RSP. SECOND USER COMMAND  #
           A$I503  : FTA$I503,         # INVALID SEQUENCE OF CMDS      #
           A$SUVD  : FTA$SUVD,         # SET LOCAL USER VALIDATION     #
           A$SUVF  : FTA$SUVF,         # SET LOCAL USER VALIDN FAILED  #
           A$BACC  : FTA$BACC,         # BAD ACCOUNT COMMAND ENTRY     #
           A$B2AC  : FTA$B2AC,         # BAD 2ND ACCT COMMAND          #
           A$B2UR  : FTA$B2UR,         # BAD 2ND USER COMMAND          #
           A$BADR  : FTA$BADR,         # SEND 500 RSP, BAD CMD         #
           A$BPRM  : FTA$BPRM,         # SEND 501 RSP, BAD PARAMS      #
           A$CUNS  : FTA$CUNS,         # SEND 502 RSP, CMD UNSUPPORTED #
           A$CMOK  : FTA$CMOK,         # SEND 200 RSP, CMD O.K.        #
           A$PORT  : FTA$PORT,         # PROCESS PORT CMD              #
           A$PASV  : FTA$PASV,         # PROCESS PASV CMD - INIT PC    #
           A$I227  : FTA$I227,         # SEND 227 RSP, GOING PASSIVE   #
           A$I150  : FTA$I150,         # SEND 150 RSP, OPENING DATA... #
           A$TYPE  : FTA$TYPE,         # PROCESS TYPE CMD              #
           A$STRU  : FTA$STRU,         # PROCESS STRU CMD              #
           A$MODE  : FTA$MODE,         # PROCESS MODE CMD              #
           A$IADC  : FTA$IADC,         # INIT. ACTIVE DATA CONNECT     #
           A$IPDC  : FTA$IPDC,         # INIT. PASSIVE DATA CONNECT    #
           A$ADCN  : FTA$ADCN,         # ABORT DATA CONNECTION         #
           A$A226  : FTA$A226,         # CLOSE DATA CN, ISSUE 226 MSG  #
           A$B226  : FTA$B226,         # ABORT DATA CN, ISSUE 226 MSG  #
           A$PRTV  : FTA$PRTV,         # PROTOCOL VIOLATION - ABORT    #
           A$ADTC  : FTA$ADTC,         # ACTION DATA XFER COMMAND      #
           A$DATA  : FTA$DATA,         # PROCESS DATA                  #
           A$C226  : FTA$C226,         # SEND 226 RESPONSE,CLS CTRL CN #
           A$S226  : FTA$S226,         # SEND 226 RESPONSE             #
           A$ACDC  : FTA$ACDC,         # COMPLETE DATA XFR, SEND 226   #
           A$ICDC  : FTA$ICDC,         # COMPLETE DATA TRANSFER        #
           A$RNFR  : FTA$RNFR,         # PROCESS RNFR COMMAND          #
           A$RNTO  : FTA$RNTO,         # PROCESS RNTO                  #
           A$DELE  : FTA$DELE,         # PROCESS DELE                  #
           A$HELP  : FTA$HELP,         # PROCESS HELP COMMAND          #
           A$ICCC  : FTA$ICCC,         # CLOSE CONTROL CN              #
           A$QUIT  : FTA$QUIT,         # PROCESS QUIT COMMAND          #
           A$ADNO  : FTA$ADNO,         # ABORT DATA CN, NETOFF, END    #
           A$I426  : FTA$I426,         # ISSUE 426 MSG                 #
           A$A426  : FTA$A426,         # ABORT TRANSFER,ISSUE 426 MSG  #
           A$PSCF  : FTA$PSCF,         # PRESET SITECOM PARAMETERS     #
           A$ABORT : FTA$ABORT,        # ABORT APPLICATION             #
           A$NOOP  : FTA$NOOP,         # NO ACTION                     #
           A$IXXX  : FTA$IXXX,         # ISSUE XXX MESSAGE (XXX PRESET)#
           A$I550  : FTA$I550,         # ISSUE 550 MSG                 #
           A$A550  : FTA$A550,         # ISSUE 550 MSG, LST/ON DATA C/N#
           A$SYST  : FTA$SYST,         # PROCESS SYST COMMAND          #
           A$I202  : FTA$I202,         # ISSUE 202 MSG                 #
           A$SITE  : FTA$SITE,         # PROCESS SITE COMMAND          #
           A$END   : FTA$END; 
  
      CONTROL EJECT;
  
# 
*     INTERNAL VARIABLES
# 
  
      DEF  TWOBLWDS           #"                    "#; 
      DEF  SPACE$1            #" "#;
  
      ITEM BLPASS$       C(7) = "       ";
      ITEM CALLTYPE         U ; 
      ITEM CHAR$VAL      C(1) ; 
      ITEM CMD$NUM            ; 
      ITEM CVT$NUM            ; 
      ITEM DESTDIS      C(20) ; 
      ITEM DONE             B ; 
      ITEM ERROR$F          B ; 
      ITEM FAM$NAME         U ; 
      ITEM I                  ; 
      ITEM II               U ; 
      ITEM III              U ; 
      ITEM LEN$CHAR         I ; 
      ITEM MSGNO            I ; 
      ITEM NXTPOS           U ; 
      ITEM PROJECT$N    C(20) ; 
      ITEM STATUS$          U ; 
      ITEM TENCHAR      C(10) ; 
      ITEM TRFRTYPE         I ; 
      ITEM USER$NUMBER      U ; 
      ITEM CHG$MSG$ADDR     U ;        # MSG ADDR RETURNED FROM FFSUVUC#
  
      ARRAY BADCHG  [00:00] S(4);      # BAD CHARGE FROM CLIENT        #
        BEGIN 
        ITEM BADCH      C(00,00,31) = 
          [" FFSLFLH - BAD CHG. FROM CLIENT"];
        ITEM BADZB0     U(03,06,54) = [0];
        END 
  
      ARRAY BADIND  [00:00] S(4);      # BAD INDICATION FROM CM        #
        BEGIN 
        ITEM BID$MSG    C(00,00,34) = 
          [" FFSLFLH - BAD INDICATION FROM CM."]; 
        ITEM BID$ZBYTE  U(03,24,36) = [0];
        END 
  
      ARRAY BADTRFRTP [00:00] S(4);   # BAD TRANSFER TYPE MESSAGE      #
        BEGIN 
        ITEM BTYP$TEXT C(00,00,30) = [" FFSLFLH - BAD TRANSFER TYPE. "];
        ITEM BTYP$END  U(03,00,60) = [0]; 
        END 
  
      ARRAY PROTVIO [00:00] S(4);      # PROTOCOL VIOLATION            #
        BEGIN 
        ITEM PROTVL  C(00,00,30) =
          [" FFSLFLH - PROTOCOL VIOLATION."]; 
        ITEM PROTZ1  U(03,00,60) = [0]; 
        END 
  
      DEF M227SZ$    # 7 #;            # SIZE OF 227 RESPONSE MESSAGE  #
      DEF USER2SIZ   # 8 #;            # SIZE OF SECOND USER RSP MSG   #
      DEF BADCHGSIZ  # 7 #;            # SIZE OF BAD CHARGE RSP MSG    #
      DEF BAD2USIZ   # 8 #;            # SIZE OF BAD 2ND USER RSP MSG  #
      DEF BAD2ASIZ   # 8 #;            # SIZE OF BAD 2ND ACCT RSP MSG  #
  
      ARRAY M227 [0:0] S(M227SZ$);
        BEGIN 
        ITEM M227TEXT  C(00, 00, 27) = ["227 ENTERING PASSIVE MODE ("]; 
        ITEM M227HADD  C(02, 42, 33); 
        ITEM M227ZB    U(06, 00, 60) = [0]; 
        END 
  
      ARRAY USER2[0:0] S(USER2SIZ);    # MESSAGE FOR SECOND USER CMMD  #
        BEGIN 
        ITEM USER2LN1  C(00,00,28) = ["502-COMMAND NOT IMPLEMENTED."];
        ITEM USER2END1 U(02,48,12) = [0]; 
        ITEM USER2LN2A C(03,00,30) = ["502 SECOND USER NOT SUPPORTED,"];
        ITEM USER2LN2B C(06,00,17) = [" COMMAND IGNORED."]; 
        ITEM USER2END2 U(07,42,18) = [0]; 
        END 
  
      ARRAY BADACC[0:0] S(BADCHGSIZ);  # MESSAGE FOR BAD ACCOUNT CMD   #
        BEGIN 
        ITEM BACC$HDR  C(00,00,04) = ["530-"];
        ITEM BACC$MSG  C(00,24,34); 
        ITEM BACC$END1 U(03,48,12) = [0]; 
        ITEM BACC$LN2  C(04,00,26) = ["530 RETRY ACCOUNT COMMAND."];
        ITEM BACC$END2 U(06,36,24) = [0]; 
        END 
  
      ARRAY BAD2USER[0:0] S(BAD2USIZ); # MESSAGE FOR BAD 2ND USER CMD  #
        BEGIN 
        ITEM BAD2U$LN1  C(00,00,32) = 
                                   ["501-INVALID SECOND USER COMMAND."];
        ITEM BAD2U$END1 U(03,12,48) = [0];
        ITEM BAD2U$LN2  C(04,00,31) = 
                                   ["501 PREVIOUS USER STILL ACTIVE."]; 
        ITEM BAD2U$END2 U(07,06,54) = [0];
        END 
  
      ARRAY BAD2ACCT[0:0] S(BAD2ASIZ); # MESSAGE FOR BAD 2ND ACCT CMD  #
        BEGIN 
        ITEM BAD2A$LN1  C(00,00,32) = 
                                   ["501-INVALID SECOND ACCT COMMAND."];
        ITEM BAD2A$END1 U(03,12,48) = [0];
        ITEM BAD2A$LN2  C(04,00,31) = 
                                   ["501 PREVIOUS ACCT STILL ACTIVE."]; 
        ITEM BAD2A$END2 U(07,06,54) = [0];
        END 
  
      ARRAY NODATA  [00:00] S(6);      # NO OUTSTANDING DATA RECEIVED. #
        BEGIN 
        ITEM NOD$MSG    C(00,00,51) = 
          ["FFSLFLH - NO OUTSTANDING DATA IND. ON NON DATA C/N."];
        ITEM NOD$ZBYTE  U(05,06,54) = [0];
        END 
  
      ARRAY SORANGE [00:00] S(6);     # STATE OUT OF RANGE             #
        BEGIN 
        ITEM SOR$STUB  C(00,00,10) = [" FFSLFLH -"];
        ITEM SOR$MSG   C(01,00,20) = [" STATE OUT OF RANGE,"];
        ITEM SOR$ST    C(03,00,10) = [" STATE =  "];
        ITEM SOR$STCD  C(04,00,10); 
        ITEM SOR$END   U(05,00,60) = [0]; 
        END 
  
      ARRAY STTBABT [00:00] S(8);     # STATE TABLE ABORT MESSAGE      #
        BEGIN 
        ITEM ABT$STUB  C(00,00,10) = [" FFSLFLH -"];
        ITEM ABT$MSG   C(01,00,20) = [" STTB HANDLER ABORTS"];
        ITEM ABT$ST    C(03,00,10) = [", STATE = "];
        ITEM ABT$STCD  C(04,00,10); 
        ITEM ABT$TRG   C(05,00,10) = [", TRIG = "]; 
        ITEM ABT$TRGCD C(06,00,10); 
        ITEM ABT$END   U(07,00,60) = [0]; 
        END 
  
      BASED ARRAY TEMP$PTR S(1) ; 
        BEGIN 
        ITEM TEMP$WORD   U(00,00,60) ;
        END 
  
      BASED ARRAY TEMP$PTR1 S(1) ;
        BEGIN 
        ITEM TEMP$WORD1  U(00,00,60) ;
        END 
  
      ITEM DOLLAR$1     C(10) = "$$$$$$$$$$" ;
      ITEM IDENTIFIER   C(10) = "FTP LAYER " ;
      ITEM DOLLAR$2     C(10) = "$$$$$$$$$$" ;
  
      ITEM INDICATION$C C(10) = "INDICATION" ;
      ITEM INDICATION$F     I = 0 ; 
      ITEM CONNECTION$C C(10) = "CON - TYPE" ;
      ITEM FTPSTATE$C   C(10) = "CUR- STATE" ;
      ITEM FTPSTATE         I = 0 ; 
      ITEM TRIGGER$C    C(10) = "TRIGGER IS" ;
      ITEM TRIGGER          I = 0 ; 
      ITEM ACTION$C     C(10) = "EX- ACTION" ;
      ITEM ACTION           I = 0 ; 
      ITEM NEXT$ST$C    C(10) = "NEXT STATE" ;
      ITEM NEXT$ST          I = 0 ; 
      ITEM NEW$REQ          I = 0 ; 
      ITEM LENCHAR          I;         # MESSAGE LENGTH IN CHARACTERS  #
  
  
      CONTROL EJECT;
      PROC PFTPCMD; 
# TITLE PFTPCMD - PROCESS FTP COMMANDS.                                #
  
      BEGIN                            # PFTPCMD                       #
# 
**    PFTPCMD - PROCESS FTP COMMANDS. 
* 
*     AML                              04/20/88 
* 
*     THIS EMBEDDED PROCEDURE PROCESSES FTP COMMANDS, AND 
*     GENERATES AN APPROPRIATE TRIGGER. 
* 
*     ENTRY   CMD$NUM = COMMAND NUMBER OF A LEGITIMATE FTP COMMAND. 
*             TRIGGER = TRIGGER GENERATED FROM *CMD$MAP*
* 
*     EXIT    TRIGGER = TRIGGER GENERATED FOR THE COMMAND IDENTIFIED
*                       BY CMD$NUM. 
* 
*     METHOD  USE THE CMD$NUM AS INDEX INTO THE COMMAND JUMP TABLE
*             *CMD$JMP* TO JUMP TO PERFORM THE APPROPRIATE ACTION 
*             FOR COMMANDS THAT REQUIRE FURTHER REFINEMENT TO OBTAIN
*             THE APPROPRIATE TRIGGER.
* 
*             NOTE:  1) FOR COMMANDS THAT MAP DIRECTLY INTO A TRIGGER,
*                       THE ACTION ON THE JUMP TABLE IS NOOP I.E. GOES
*                       TO LABEL *CMD$END*. 
* 
*                    2) FOR COMMANDS THAT REQUIRE FURHTER REFINEMENT, 
*                       THE TRIGGER IS PRESETTED IN *CMD$MAP* TO A
*                       VALID TRIGGER.
# 
  
# 
*     SWITCH ON COMMAND NUMBER. 
* 
*     NOTE:  FOR THOSE COMMANDS THAT ARE DIRECTLY MAPPED
*            INTO A TRIGGER VIA THE *CMD$MAP* TABLE, NO 
*            FURTHER PROCESSING IS REQUIRED I.E. GOTO 
*            LABEL *CMD$END*. 
# 
  
 SWITCH CMD$JMP                          # SWITCH ON COMMAND NUMBER    #
         CMD$END,                        # ABOR - UNSUPPORTED          #
         ACCT$P$CMD,                     # ACCT                        #
         CMD$END,                        # ALLO - TRIGGER FROM CMD$MAP #
         APPE$P$CMD,                     # APPE                        #
         CMD$END,                        # CDUP - UNSUPPORTED          #
  
         CMD$END,                        # CWD  - UNSUPPORTED          #
         CMD$END,                        # DELE - TRIGGER FROM CMD$MAP #
         CMD$END,                        # HELP - TRIGGER FROM CMD$MAP #
         LIST$P$CMD,                     # LIST                        #
         MODE$P$CMD,                     # MODE                        #
  
         CMD$END,                        # MKD  - UNSUPPORTED          #
         NLST$P$CMD,                     # NLST                        #
         CMD$END,                        # NOOP - TRIGGER FROM CMD$MAP #
         PASS$P$CMD,                     # PASS                        #
         CMD$END,                        # PASV - TRIGGER FROM CMD$MAP #
  
         PORT$P$CMD,                     # PORT                        #
         CMD$END,                        # PWD  - UNSUPPORTED          #
         CMD$END,                        # QUIT - TRIGGER FROM CMD$MAP #
         CMD$END,                        # REIN - UNSUPPORTED          #
         CMD$END,                        # REST - UNSUPPORTED          #
  
         RETR$P$CMD,                     # RETR                        #
         CMD$END,                        # RMD  - UNSUPPORTED          #
         RNFR$P$CMD,                     # RNFR                        #
         RNTO$P$CMD,                     # RNTO                        #
         CMD$END,                        # SITE - TRIGGER FROM CMD$MAP #
  
         CMD$END,                        # SMNT - UNSUPPORTED          #
         CMD$END,                        # STAT - UNSUPPORTED          #
         STOR$P$CMD,                     # STOR                        #
         CMD$END,                        # STOU - UNSUPPORTED          #
         STRU$P$CMD,                     # STRU                        #
  
         CMD$END,                        # SYST - TRIGGER FROM CMD$MAP #
         CMD$END,                        # TYPE - TRIGGER FROM CMD$MAP #
         USER$P$CMD,                     # USER                        #
         CMD$END ;
  
      CONTROL EJECT;
# 
*     START OF EMBEDDED PROCEDURE PFTPCMD.
# 
  
      GOTO CMD$JMP[CMD$NUM];           # JUMP TO DO FURTHER PROCESSING #
  
  
ACCT$P$CMD:                            # ACCT COMMAND                  #
  
      C<00,20>PROJECT$N = C<00,20>PAR$VAL20[2] ;
      FFSUVUC(PAR$VALUE[1],            # DEPARTMENT NUMBER             #
              PROJECT$N,               # PROJECT NUMBER                #
              STATUS$,                 # STATUS RESPONSE               #
              CHG$MSG$ADDR ) ;         # ADDRESS OF ERROR MESSAGE      #
  
      IF STATUS$ EQ VRS$STATUS"VRS$VALID" 
      THEN
        BEGIN 
        TRIGGER = FTE$CDS"FTE$ACCV";   # ACCT COMMAND VALID            #
        END 
      ELSE
        BEGIN 
        IF STATUS$ EQ VRS$STATUS"VRS$NOUSER"
        THEN
          BEGIN 
          MSGNO =MSG$503;              # INVALID SEQUENCE              #
          TRIGGER = FTE$CDS"FTE$INCM";
          END 
        ELSE
          BEGIN 
          TRIGGER = FTE$CDS"FTE$ACCI";  # INVALID ACCT COMMAND         #
          END 
        END 
  
      GOTO CMD$END ;
  
  
APPE$P$CMD:                            # APPE COMMAND                  #
  
      TRFRTYPE = TRTYPE"APPE";         # TRANSFER TYPE IS APPE         #
      STATUS$ = 0;
      IF (FTPSTATE EQ FTS$CDS"FTS$UVWF" OR EPTFLAG EQ FTPC$)
      THEN                             # FTP COMMAND IS EXPECTED      # 
        BEGIN 
        FFSRPDT (TRFRTYPE, STATUS$, RSPCT);  # PREPROCESS DATA XFER   # 
        END 
      IF STATUS$ NQ 0 
      THEN
        BEGIN                          # FILE ACTION NOT TAKEN         #
        TRIGGER = STATUS$;
        END 
  
      GOTO CMD$END ;
  
  
LIST$P$CMD:                            # LIST COMMAND                  #
  
      TRFRTYPE = TRTYPE"LIST";         # TRANSFER TYPE IS LIST         #
      CLHEAD = TRUE;
      CLFULL = TRUE;
      IF NOT FFSUPCP
      THEN
        BEGIN                          # BAD SYNTAX                    #
        TRIGGER = FTE$CDS"FTE$BSYN";
        END 
  
      GOTO CMD$END ;
  
  
MODE$P$CMD:                            # MODE COMMAND                  #
# 
*     SUPPORTS ONLY STREAM MODE.
*     OTHERWISE, SEND 504.
# 
      IF C<0, 1>PAR$VALUE[1] NQ MODE$S
      THEN
        BEGIN 
        MSGNO = MSG$504;
        TRIGGER = FTE$CDS"FTE$INCM";
        END 
  
      GOTO CMD$END ;
  
  
NLST$P$CMD:                            # NLST COMMAND                  #
  
      TRFRTYPE = TRTYPE"LIST";         # TRANSFER TYPE IS NLST         #
      CLHEAD = FALSE; 
      CLFULL = FALSE; 
      IF NOT FFSUPCP
      THEN
        BEGIN                          # SYNTAX ERROR                  #
        TRIGGER = FTE$CDS"FTE$BSYN";
        END 
  
      GOTO CMD$END ;
  
  
PASS$P$CMD:                            # PASS COMMAND                  #
  
      IF PARA$NUM[0] EQ 1 
      THEN
        BEGIN 
        FAM$NAME = 0 ;
        END 
      ELSE
        BEGIN 
        FAM$NAME = PAR$VALUEN[2] ;     # FAMILY NAME                   #
        END 
  
      FFSUVUI(  FAM$NAME,              # FAMILY NAME                   #
                USER$NUMBER,           # USER NUMBER, GIVEN IN USER CMD#
                PAR$VALUEN[1],         # PASSWORD                      #
                STATUS$); 
  
      IF STATUS$ EQ VRS$STATUS"VRS$VALID" 
      THEN
        BEGIN                          # USER/PASS VALID,CHARGE NOT REQ#
        TRIGGER = FTE$CDS"FTE$PWVT" ; 
        END 
      ELSE
        BEGIN                          # INVALID OR CHARGE REQUIRED    #
        IF STATUS$ EQ VRS$STATUS"VRS$CHGREQ"
        THEN
          BEGIN 
          TRIGGER = FTE$CDS"FTE$PWVF"; # USER/PASS VALID, CHARGE REQD  #
          END 
        ELSE
          BEGIN 
          IF STATUS$ EQ VRS$STATUS"VRS$USER2" 
          THEN
            BEGIN 
            MSGNO = MSG$503;           # INVALID SEQUENCE              #
            TRIGGER = FTE$CDS"FTE$INCM";
            END 
          ELSE
            BEGIN 
            TRIGGER = FTE$CDS"FTE$PSSI";  # INVALID USER/PASS          #
            END 
          END 
        END 
  
      GOTO CMD$END ;
  
  
PORT$P$CMD:                            # PORT COMMAND                  #
  
      FOR I = 1 STEP 1 UNTIL 6
      DO
        BEGIN                          # CHECK AND STORE THE 4 IP..    #
                                       # ..ADDRESS AND 2 PORT ADDRESS  #
        LEN$CHAR = 0; 
        C<0, PAR$LEN[I]>LEN$CHAR = C<0, PAR$LEN[I]>PAR$VALUE[I];
        XDXB( LEN$CHAR,                # PARAM VALUE                   #
              1,
              CVT$NUM);                # CONVERTED NUMBER              #
  
        IF CVT$NUM GR 255 
        THEN
          BEGIN 
          TRIGGER = FTE$CDS"FTE$BSYN" ; 
          END 
  
        END 
  
      GOTO CMD$END ;
  
  
RETR$P$CMD:                               # RETR COMMAND               #
  
      TRFRTYPE = TRTYPE"RETR";            # TRANFER TYPE IS "RETR"     #
      STATUS$ = 0;
      IF (FTPSTATE EQ FTS$CDS"FTS$UVWF" OR EPTFLAG EQ FTPC$)
      THEN                             # FTP COMMAND IS EXPECTED      # 
        BEGIN 
        FFSRPDT (TRFRTYPE, STATUS$, RSPCT);  # PREPROCESS DATA XFER   # 
        END 
  
      IF STATUS$ EQ 0 
      THEN
        BEGIN                             # NO ERRORS ENCOUNTERED      #
        IF EPTFLAG EQ FTPC$ 
        THEN
          BEGIN                           # CLIENT MODE                #
          TRIGGER = FTE$CDS"FTE$RETC" ;   # CLIENT TRIGGER             #
          END 
        END 
  
      ELSE
        BEGIN                          # FILE ACTION NOT TAKEN         #
        TRIGGER = STATUS$;
        END 
  
      GOTO CMD$END ;
  
  
RNFR$P$CMD:                            # RNFR COMMAND                  #
  
      IF RNTOFN NQ 0
      THEN
        BEGIN 
        TRIGGER = FTE$CDS"FTE$IRNS";   # INVALID RENAME SEQUENCE       #
        END 
  
      GOTO CMD$END ;
  
  
RNTO$P$CMD:                            # RNTO COMMAND                  #
  
      IF RNFRFN EQ 0
      THEN
        BEGIN 
        TRIGGER = FTE$CDS"FTE$IRNS";   # INVALID RENAME SEQUENCE       #
        END 
  
      GOTO CMD$END ;
  
  
STOR$P$CMD:                               # STOR COMMAND               #
  
      TRFRTYPE = TRTYPE"STOR";            # TRANSFER TYPE IS STORE     #
      STATUS$ = 0;
      IF (FTPSTATE EQ FTS$CDS"FTS$UVWF" OR EPTFLAG EQ FTPC$)
      THEN                             # FTP COMMAND IS EXPECTED      # 
        BEGIN 
        FFSRPDT (TRFRTYPE, STATUS$, RSPCT);  # PREPROCESS DATA XFER   # 
        END 
  
      IF STATUS$ EQ 0 
      THEN
        BEGIN                             # NO ERRORS ENCOUNTERED      #
        IF EPTFLAG EQ FTPC$ 
        THEN
          BEGIN                           # CLIENT MODE                #
          TRIGGER = FTE$CDS"FTE$STOC" ;   # CLIENT TRIGGER             #
          END 
        END 
  
      ELSE
        BEGIN                          # FILE ACTION NOT TAKEN         #
        TRIGGER = STATUS$;
        END 
  
      GOTO CMD$END ;
  
  
STRU$P$CMD:                            # STRU COMMAND                  #
# 
*     SUPPORT ONLY FILE STRUCTURE.
*     OTHERWISE, SEND 504.
# 
      IF C<0, 1>PAR$VALUE[1] NQ STRU$F
      THEN
        BEGIN 
        MSGNO = MSG$504;
        TRIGGER = FTE$CDS"FTE$INCM";
        END 
  
      GOTO CMD$END ;
  
  
USER$P$CMD:                            # USER COMMAND                  #
  
      IF PARA$NUM[0] EQ 1 
      THEN
        BEGIN 
        TRIGGER = FTE$CDS"FTE$USER";   # USER NAME ONLY                #
        END 
      ELSE
        BEGIN                          # USER AND PASSWORD GIVEN       #
                                       # GOTO VALIDATE THEM            #
        IF PARA$NUM[0] EQ 2 
        THEN
          BEGIN 
          FFSUVUI(0,                   # DEFAULT FAMILY                #
                  PAR$VALUEN[1],       # USER NUMBER                   #
                  PAR$VALUEN[2],       # PASSWORD                      #
                  STATUS$); 
          END 
  
        ELSE
          BEGIN 
          FFSUVUI(PAR$VALUEN[3],       # FAMILY NAME                   #
                  PAR$VALUEN[1],       # USER NUMBER                   #
                  PAR$VALUEN[2],       # PASSWORD                      #
                  STATUS$); 
          END 
  
        IF STATUS$ EQ VRS$STATUS"VRS$VALID" 
        THEN
          BEGIN                        # USER/PASS VALID,CHARGE NOT REQ#
          TRIGGER = FTE$CDS"FTE$UPVT" ; 
          END 
        ELSE
          BEGIN 
          IF STATUS$ EQ VRS$STATUS"VRS$CHGREQ"
          THEN
            BEGIN                      # USER/PASS VALID, CHARGE REQD  #
            TRIGGER = FTE$CDS"FTE$UPVF";
            END 
          ELSE
            BEGIN 
            IF STATUS$ EQ VRS$STATUS"VRS$USER2" 
            THEN
              BEGIN 
              MSGNO = MSG$503;
              TRIGGER = FTE$CDS"FTE$INCM";
              END 
            ELSE
              BEGIN                    # USER/PASS INVALID             #
              TRIGGER = FTE$CDS"FTE$USRI";
              END 
            END 
          END 
        END 
  
      GOTO CMD$END ;
  
  
CMD$END:  
  
      RETURN; 
  
      END                              # PFTPCMD                       #
  
  
      CONTROL EJECT;
# 
**    START MAIN PROCEDURE. 
* 
# 
  
# 
*     CALL *FFSUWTB* TO WRITE THE INDICATION BLOCK TO 
*     THE CIRCULAR TRACE BUFFER *CTB*.
# 
  
      BTYPE = IND$;                    # BLOCK TYPE IS INDICATION      #
      LNAME = S"LFTP";                 # LAYER NAME IS FTP             #
      FFSUWTB;                         # WRITE INDICATION BLOCK TO CTB #
  
      REQ$RCODE[RFTPCM$] = 0 ;         # CLEAR THE REQUEST CODE        #
      REQ$ADDR [RFTPCM$] = 0 ;         # CLEAR THE ADDRESS             #
      MORE$T   [0]       = 0 ;         # PRESET TO NO MULTIPLE RESPONSE#
      PFM$T    [0]       = 0 ;         # PRESET TO NO PFM TEXT         #
      STATUS$            = NEC ;       # PRESET TO NO ERROR CODE       #
  
      INDICATION$F = IND$ICODE[ICMFTP$];     # GET INDICATION CODE     #
      FTPSTATE     = FTP$CUR$ST[0] ;         # GET CURRENT STATE       #
  
      IF (FTPSTATE GQ FTS$CDS"FTS$END") 
      THEN
        BEGIN                          # STATE OUT OF RANGE            #
        SOR$STCD = XCDD (FTPSTATE);    # CURRENT STATE CODE            #
        FFSEABT(SORANGE);              # DAYFILE MESSAGE AND ABORT     #
        END 
  
  
      IF   (INDICATION$F GR ICM"NULL")
        OR (INDICATION$F LS ICM"ICMAX") 
      THEN
        BEGIN                               # INDICATION WITHIN RANGE  #
        TRIGGER = IND$MAP[INDICATION$F];    # CONVERT IT TO A TRIGGER  #
        END 
      ELSE
        BEGIN 
        FFSEABT(BADIND);                    # BAD INDICATION, ABORT    #
        END 
  
  
      CONTROL EJECT;
# 
**    GO PROCESS INDICATIONS THAT REQUIRE FURTHER REFINEMENT. 
* 
*     NOTE:  1) FOR INDICATIONS THAT MAP DIRECTLY INTO A TRIGGER, 
*               THE ACTION ON THE JUMP TABLE IS NOOP I.E. GOES
*               TO LABEL *IND$END*. 
* 
*            2) FOR INDICATIONS THAT REQUIRE FURHTER PROCESSING 
*               TO DETERMINE THE TRIGGER, THE TRIGGER IS PRESETTED
*               IN *IND$MAP* TO A VALID TRIGGER. (THE SELECTION 
*               OF THE TRIGGER COULD BE RANDOM).
# 
  
      GOTO IND$JMP[INDICATION$F]; 
  
  
IND$DATA: 
# 
*     DATA AVAILABLE. 
# 
      IF IND$CTYPE[ICMFTP$] NQ CTYPE"CTDATA"
      THEN
        BEGIN                          # NOT ON DATA CONNECTION        #
  
        P<TBUFF> = IND$ADDR[ICMFTP$];  # CALL COMMAND PARSER TO PARSE..#
        FFSUPFC( TBUFF[0],             # ..THE COMMAND                 #
                 IND$LEN[ICMFTP$],
                 CMD$NUM) ; 
  
        IF (CMD$NUM LS ABOR$CMD) OR (CMD$NUM GR USER$CMD) 
        THEN
          BEGIN                             # ERROR ENCOUNTERED IN CMD #
          IF CMD$NUM EQ ERR$500 
          THEN
            BEGIN 
            TRIGGER = FTE$CDS"FTE$UCMD" ;   # UNRECOGNIZED COMMAND     #
            END 
          ELSE
            BEGIN 
            TRIGGER = FTE$CDS"FTE$BSYN" ;   # SYNTAX ERROR             #
            END 
          END 
  
        ELSE
          BEGIN                             # GOOD COMMAND             #
          TRIGGER = CMD$MAP[CMD$NUM];       # GET TRIGGER FROM CMD MAP #
          PFTPCMD;                          # PROCESS FTP COMMAND TO.. #
          END                               #..GENERATE A TRIGGER.     #
  
        END                                 # NOT ON DATA CONNECTION   #
  
        GOTO IND$END; 
  
  
IND$CNCP:                              # CONNECTION COMPLTED           #
  
      IF IND$CTYPE[ICMFTP$] EQ CTYPE"CTDATA"
      THEN
        BEGIN 
        TRIGGER = FTE$CDS"FTE$CNCD";   # DATA CONNECTION COMPLETED     #
        END 
  
      GOTO IND$END ;
  
  
IND$CNCL:                              # CONNECTION CLOSED             #
  
      IF IND$CTYPE[ICMFTP$] EQ CTYPE"CTDATA"
      THEN
        BEGIN 
        TRIGGER = FTE$CDS"FTE$CDCL";   # DATA CONNECTION CLOSED        #
        END 
  
      GOTO IND$END ;
  
  
IND$NODA:                              # NO OUTSTANDING DATA           #
  
      IF    (IND$CTYPE[ICMFTP$] EQ CTYPE"CTDATA") 
        AND ((TRFRTYPE EQ TRTYPE"RETR") OR (TRFRTYPE EQ TRTYPE"LIST"))
      THEN
        BEGIN                          # ONLY GENERATED FOR RETR/LIST  #
        TRIGGER = FTE$CDS"FTE$NOOD";   # NO OUTSTANDING DATA TRIGGER   #
        END 
      ELSE
        BEGIN 
        FFSEABT(NODATA);               # DAYFILE MESSAGE AND ABORT     #
        END 
  
      GOTO IND$END ;
  
  
IND$SLUV:                              # SET LOCAL USER VALIDATION     #
  
# 
*       LOCAL USER VALIDATION (CLIENT CONNECT). 
*       USE PFP BLOCK PASSED FROM C/S TO "VALIDATE" USER SO WE GET BACK 
*       A VALIDATION BLOCK FROM CPM. THEN SAVE THE CHARGE BLOCK FROM
*       C/S FOR LATER ACTIONS THAT MAY BE NEEDED. 
# 
  
# 
*     VALIDATE USER - CHECK HAS INTER-HOST PERMISSION 
# 
  
      P<PFB$FMT> = IND$ADDR[ICMFTP$] + 1 + CSHDRWRD; # SKIP CS HEADER  #
      IF B<0, 42>PFB$WORD2 NQ 0 
      THEN
        BEGIN                          # USER NAME DEFINED             #
        FFSUVUI(PFB$FAMILY, 
                PFB$USER, 
                BLPASS$,               # DO NOT VALIDATE PASSWORD      #
                STATUS$); 
  
        IF     (STATUS$ NQ VRS$STATUS"VRS$VALID") 
           AND (STATUS$ NQ VRS$STATUS"VRS$CHGREQ")
        THEN
          BEGIN                        # LOCAL USER VALIDATION FAILED  #
          TRIGGER = FTE$CDS"FTE$LUVF" ; 
          GOTO IND$END; 
          END 
        END 
      ELSE
        BEGIN                          # USER NAME ALL ZEROS           #
        P<VAL$BLOCK> = LOC(JOB$VAL);
        VAL$FAMILY = PFB$FAMILY;
        VAL$INDEX  = PFB$INDEX; 
        VAL$ALMW = 0; 
        VAL$ACLS = 0; 
        VAL$AACW = 0; 
        P<AACW>  = LOC(VAL$AACW); 
        AAC$CCNR = TRUE;               # FORCE NO CHARGE PROCESSING    #
        AAC$CPLK = TRUE;               # SET INTER-HOST ACCESS ALLOWED #
        END 
  
# 
*     MOVE CHARGE INFO TO JOB$CHG BLOCK.
# 
      P<TEMP$PTR> = LOC(JOB$CHG); 
      P<TEMP$PTR1> = IND$ADDR[ICMFTP$] + PFP$LEN      # ---> CHARGE  #
                                       + CSHDRWRD + 1;
      FOR I = 0 STEP 1 UNTIL 3
      DO
        BEGIN 
        TEMP$WORD[I] = TEMP$WORD1[I]; 
        END 
  
      TRIGGER = FTE$CDS"FTE$SLUV" ; 
  
      GOTO IND$END ;
  
  
IND$CNAB:                              # CONNECTION ABORTED-UNSOLICITED#
  
      IF IND$CTYPE[ICMFTP$] EQ CTYPE"CTDATA"
      THEN
        BEGIN 
        TRIGGER = FTE$CDS"FTE$CDAB" ;  # DATA CONNECTION ABORTED       #
        END 
  
      GOTO IND$END ;
  
  
  
IND$END:  
  
      IND$ICODE[ICMFTP$] = 0 ;         # CLEAR INDICATION CODE         #
  
  
  
      CONTROL EJECT;
# 
*     ALL INDICATIONS HAS MAPPED INTO A PROPER TRIGGER. 
*     PERFORM THE APPROPRIATE ACTION BASED ON CURRENT 
*     STATE AND TRIGGER.
# 
      ACTION   = FTP$ST$ACT[FTPSTATE,TRIGGER];  # GET ACTION           #
      NEXT$ST  = FTP$ST$NXT[FTPSTATE,TRIGGER];  # GET NEXT STATE       #
  
      REQ$LEN[RFTPCM$]   = FMSGSIZ$ ;           # PRESET TO MSG LENGTH #
      REQ$RCODE[RFTPCM$] = RCM"RCSENDAT";       # PRESET TO SEND DATA  #
  
      GOTO ACTION$SW[ACTION] ;
  
  
      BEGIN                               # EXECUTE APPROPRIATE ACTION #
  
A$I220: 
# 
*     SEND 220 RESPONSE MESSAGE 
# 
        RNFRFN = 0;                       # CLEAR RENAME FILE NAMES    #
        RNTOFN = 0; 
  
        RSPCT = CTYPE"CTCTRL" ;           # SEND MSG OVER CTRL C/N     #
        FFSUSRM(RSPCT, MSG$220, NOPFM$);  # SEND 220 MESSAGE           #
  
        GOTO A$END ;
  
  
A$PASS: 
# 
*     SAVE THE USER NUMBER IN USER$NUMBER 
*     SEND 331 FOR PASSWORD.
# 
        USER$NUMBER = PAR$VALUEN[1];
        FFSUSRM(RSPCT, MSG$331, NOPFM$);
  
        GOTO A$END ;
  
  
A$I230: 
# 
*     USER AND PASSWORD VALID 
*     SET USER VALIDATIONS. 
*     SEND OUT 230 RESPONSE MSG 
# 
  
        CALLTYPE = 0; 
        FFSUSUV(CALLTYPE);             # SET USER VALIDATIONS ROUTINE  #
        FFSUSRM(RSPCT, MSG$230, NOPFM$);  # SEND 220 MESSAGE           #
  
        GOTO A$END ;
  
A$ACCT: 
# 
*     USER/PASSWORD VALID, NEED ACCOUNTING INFORMATION
*     SET USER VALIDATIONS. 
*     SEND 332 TO REQUEST ACCOUNTING INFORMATION. 
# 
  
        CALLTYPE = 0; 
        FFSUSUV(CALLTYPE);             # SET USER VALIDATIONS ROUTINE  #
        FFSUSRM(RSPCT, MSG$332, NOPFM$);
  
        GOTO A$END ;
  
A$I530: 
# 
*     USER/PASSWORD INVALID 
*     SEND 530 RESPONSE MSG 
*     IF STATUS$ IS GREATER THAN S"VRS$ERROR" THEN CLOSE CONTROL CN,
*     WHICH WILL EVENTUALLY CAUSE A NETOFF. 
# 
        FFSUSRM(RSPCT, MSG$530, NOPFM$);
        IF STATUS$ GQ VRS$STATUS"VRS$ERROR" 
        THEN
          BEGIN 
          GOTO A$ICCC1;                     # EXIT TO CLOSE CTRL CN    #
          END 
  
        GOTO A$END ;
  
  
A$USER2:  
# 
*     ISSUE 502 MULTILINE RSP - SECOND USER NOT SUPPORTED.
# 
  
        P<TBUFF> = LOC(USER2);
  
        FFSUSMS (RSPCT, TBUFF, USER2SIZ);   # 2ND USER NOT SPPTED RSP  #
  
        GOTO A$END ;
  
  
A$I503: 
# 
*     INVALID SEQUENCE COMMAND. 
*     SEND 503 RESPONSE MESSAGE.
# 
  
        FFSUSRM(RSPCT, MSG$503, NOPFM$);
  
        GOTO A$END ;
  
  
A$SUVD: 
# 
*     SET USER VALIDATED. (FOR CLIENT ONLY) 
*     SET VALIDATIONS. CHECK IF CHARGE NEEDED. IF CHARGE WAS VALIDATED
*     (AND THUS SET) BY THE CLIENT'S USER, THEN NEED TO SET IT HERE.
# 
  
        RSPCT = CTYPE"CTCS" ;          # SET CONNECTION TYPE TO C/S    #
  
        IF B<0, 42>PFB$WORD2 NQ 0 
        THEN
          BEGIN                        # USER-NAME GIVEN               #
          CALLTYPE = 0; 
          FFSUSUV(CALLTYPE);
          END 
        ELSE
          BEGIN                        # NO USER-NAME - SET USER INDEX #
          CALLTYPE = 1; 
          FFSUSUV(CALLTYPE);
          END 
  
        IF JBC$VALID
        THEN
          BEGIN 
          FFSUVUC(JBC$CHARGE, 
                  JBC$PROJCT, 
                  STATUS$,             # STATUS RESPONSE               #
                  CHG$MSG$ADDR );      # ADDRESS OF ERROR MESSAGE      #
  
          IF STATUS$ NQ VRS$STATUS"VRS$VALID" 
          THEN
            BEGIN 
            MESSAGE (CHG$MSG$ADDR, 0);
            MESSAGE (BADCHG, 0);
            ABORT;
            END 
          END 
# 
*       CALL CONNECTION MANAGEMENT LAYER TO SEND LOCAL CONNECT VALID. 
# 
        REQ$RCODE[RFTPCM$] = RCM"RCLCNML";
        REQ$CTYPE[RFTPCM$] = CTYPE"CTCS"; 
        REQ$LEN[RFTPCM$]   = IND$LEN[ICMFTP$];
        REQ$ADDR[RFTPCM$]  = IND$ADDR[ICMFTP$]; 
        FFSLCRP;
  
        GOTO A$END ;
  
  
A$SUVF: 
# 
*     SET USER VALIDATION FAILED (CLIENT ONLY)
*     SEND LOCAL VALIDATION FAILED REQUEST TO CMGNT.
# 
  
        REQ$RCODE[RFTPCM$] = RCM"RCLCABN";
        REQ$CTYPE[RFTPCM$] = CTYPE"CTCS"; 
        REQ$LEN[RFTPCM$]   = IND$LEN[ICMFTP$];
        REQ$ADDR[RFTPCM$]  = IND$ADDR[ICMFTP$]; 
        FFSLCRP;
  
        GOTO A$END ;
  
A$BACC: 
# 
*     INVALID ACCOUNT COMMAND ARGUMENTS 
*     SEND   530-NOT LOGGED IN. 
*            530-***ERROR MESSAGE**** RETURNED FROM SETCHG
*            530 RETRY ACCOUNT COMMAND. 
# 
        FTP$HYPHEN [MSG$530] = "-"; 
        FFSUSRM(RSPCT, MSG$530, NOPFM$);
  
        P<TBUFF> = CHG$MSG$ADDR;                # CHARGE ERROR MSG ADDR#
        BACC$MSG = C<0,FFSULLN(TBUFF,4)>TBF$TXT;
        FFSUSMS (RSPCT, BADACC, BADCHGSIZ);     # SEND BAD ACCOUNT RSP #
  
        GOTO A$END ;
  
A$B2UR: 
# 
*     BAD SECONDARY USER COMMAND
*     SEND   501-SYNTAX ERROR IN PARAMETERS OR ARGUMENTS. 
*            501-INVALID SECOND USER COMMAND. 
*            501 PREVIOUS USER STILL ACTIVE.
# 
        FTP$HYPHEN [MSG$501] = "-"; 
        FFSUSRM(RSPCT, MSG$501, NOPFM$);    # NORMAL 501 WITH HYPHEN   #
        P<TBUFF> = LOC(BAD2USER); 
        FFSUSMS (RSPCT, TBUFF, BAD2USIZ);   # BAD 2ND USER COMMAND RSP #
  
        GOTO A$END; 
  
A$B2AC: 
# 
*     BAD SECONDARY ACCT COMMAND
*     SEND   501-SYNTAX ERROR IN PARAMETERS OR ARGUMENTS. 
*            501-INVALID SECOND ACCT COMMAND. 
*            501 PREVIOUS ACCT STILL ACTIVE.
# 
        FTP$HYPHEN [MSG$501] = "-"; 
        FFSUSRM(RSPCT, MSG$501, NOPFM$);    # NORMAL 501 WITH HYPHEN   #
        P<TBUFF> = LOC(BAD2ACCT); 
        FFSUSMS (RSPCT, TBUFF, BAD2ASIZ);   # BAD 2ND ACCT COMMAND RSP #
  
        GOTO A$END; 
  
  
A$BADR: 
# 
*     UNRECOGNIZED COMMAND
*     SEND 500 RESPONSE MSG 
# 
        FFSUSRM(RSPCT, MSG$500, NOPFM$);
  
        GOTO A$END ;
  
  
A$BPRM: 
# 
*     BAD COMMAND SYNTAX
*     SEND 501 RESPONSE MSG 
# 
  
        FFSUSRM(RSPCT, MSG$501, NOPFM$);
  
        GOTO A$END ;
  
A$CUNS: 
# 
*     UN-SUPPORTED COMMANDS 
*     SEND 502 RESPONSE MSG 
# 
  
        FFSUSRM(RSPCT, MSG$502, NOPFM$);
  
        GOTO A$END ;
  
  
A$CMOK: 
# 
*     PROCESS NOOP COMMANDS 
*     SEND 200 RESPONSE MSG (COMMAND O.K. ) 
# 
        FFSUSRM(RSPCT, MSG$200, NOPFM$);
  
        GOTO A$END ;
  
  
A$PORT: 
# 
*     PROCESS PORT COMMAND. 
*     SAVE PORT ATTRIBUTES IN PORT$ATTB ARRAY.
*     CONVERT TO IP ADDRESS AND PLUG INTO DATA CN TABLE ENTRY.
*     SEND 200 RESPONSE MSG (COMMAND O.K. ) IF COMMAND WENT O.K.
# 
        DESTDIS = TWOBLWDS; 
        II = 44;
        NXTPOS = 0; 
                                       # STORE THE 4 IP ADDRESSES      #
                                       # AND 2 PORT ADDRESSES          #
  
        FOR I = 1 STEP 1 UNTIL 6
        DO
          BEGIN              # ALL ADDRESSES SHOULD BE O.K AT THIS TIME#
          PORT$A$B[I] = 0;
          C<0, PAR$LEN[I]>PORT$A$B[I] = C<0,PAR$LEN[I]>PAR$VALUE[I] ; 
          IF I LS 5 
          THEN
            BEGIN                      # I < 5 - BUILD DISP IP ADDRESS #
            C<NXTPOS, PAR$LEN[I]>DESTDIS = C<0, PAR$LEN[I]>PAR$VALUE[I];
            NXTPOS = NXTPOS + PAR$LEN[I]; 
            IF I LS 4 
            THEN
              BEGIN 
              C<NXTPOS, 1>DESTDIS = ".";
              NXTPOS = NXTPOS + 1;
              END 
            END                        # I < 5                         #
          ELSE
            BEGIN                      # I=5,6 - BLD BINARY PORT ADDR. #
            LEN$CHAR = 0; 
            XDXB(PORT$A$B[I], 1, LEN$CHAR); 
            B<II, 8>STATUS$ = B<52 ,8>LEN$CHAR; 
            II = II + 8;
            END 
  
          END                          # FOR I = 1 TO 6                #
  
        P<TBUFF> = LOC(ACN$TDADDR[CTYPE"CTDATA"]);
        FFSUCIA(DESTDIS, TBUFF);       # CONVERT IPA INTO CCT ENTRY    #
        ACN$DTCPIU[CTYPE"CTDATA"] = TRUE; 
        ACN$DTCPRT[CTYPE"CTDATA"] = STATUS$;
  
        FFSUSRM(RSPCT, MSG$200, NOPFM$);   # SEND 200 RESPONSE MESSAGE #
  
        GOTO A$END ;
  
  
A$PASV: 
# 
*     PROCESS PASV COMMAND. 
*     INITIATE PASSIVE CONNECTION ON DATA CONNECTION. 
*     BECAUSE INITIATED BY PASV COMMAND, CLEAR SOURCE PORT SO THAT
*     ONE IS ALLOCATED BY THE DI. 
# 
  
        ACN$STCPIU[CTYPE"CTDATA"] = FALSE;
        ACN$STCPRT[CTYPE"CTDATA"] = 0;
  
        GOTO A$IPDC1; 
  
  
A$I227: 
# 
*     1) FORMAT 227 MESSAGE (H1,H2,H3,H4,P1,P2).
*        MAXIMUM ADDRESS SIZE IS 23 CHARACTERS (EXCLUDING BRACKETS).
*        SEND 227 RESPONSE MSG. 
*     2) IN SERVER MODE, LIST OFF DATA CONNECTION.
* 
*     NOTE: - SOURE IP ADDRESS IN DISPLAY_CODE IS IN
*             SIPA$DC[0] DEFINED IN TEXTFFS.
*             IT IS SAVED DURING INITIALIZATION BY *FFSIP*. 
# 
  
# 
*     EXTRACT NETWORK AND HOST ADDRESSES FROM SIPA ARRAY. 
# 
        DONE = FALSE; 
        M227HADD = " "; 
        FOR I = 0 STEP 1
           WHILE (NOT DONE) 
           AND   (I LQ 23)
        DO
          BEGIN 
          CHAR$VAL = C<I, 1>SIPA$DC[0]; 
          IF    (CHAR$VAL GQ "0") 
            AND (CHAR$VAL LQ "9") 
          THEN
            BEGIN 
            C<I, 1>M227HADD = CHAR$VAL; 
            END 
          ELSE
            BEGIN                      # CHAR NQ 0 - 9                 #
            IF CHAR$VAL EQ "."
            THEN
              BEGIN 
              C<I, 1>M227HADD = ",";
              END 
            ELSE
              BEGIN                    # PUT COMMA AFTER LAST CHARACTER#
              C<I, 1>M227HADD = ",";
              II = I + 1; 
              DONE = TRUE;
              END 
            END                        # CHAR NQ 0 - 9                 #
          END                          # DO WHILE                      #
# 
*     EXTRACT PORT, CONVERT TO DISPLAY DIGITS AND PUT IN 227 MESSAGE. 
# 
        STATUS$ = ACN$STCPRT[CTYPE"CTDATA"];
        FOR III = 44 STEP 8 UNTIL 52
        DO
          BEGIN 
          NXTPOS  = 0;
          B<52, 8>NXTPOS = B<III, 8>STATUS$;
          TENCHAR = XCDD(NXTPOS);      # CONVERT 8-BITS TO DISPLAY     #
  
          FOR I = 0 STEP 1 UNTIL 9
          DO
            BEGIN                      # EXTRACT CONVERTED DIGITS      #
            IF C<I, 1>TENCHAR NQ SPACE$1
            THEN
              BEGIN                    # II IS CURRENT POSN IN M227HADD#
              C<II, 1>M227HADD = C<I, 1>TENCHAR;
              II = II + 1;
              END 
            END                        # FOR I = 0 - 9                 #
          C<II, 1>M227HADD = ","; 
          II = II + 1;
          END                          # FOR III = 44 , 52             #
  
        C<II - 1, 1>M227HADD = ")";    # TRAILING BRACKET              #
# 
*     SEND 227 RESPONSE VIA A SEND DATA REQUEST TO *FFSLCRP*. 
# 
  
        P<TBUFF> = LOC(M227); 
        FFSUSMS (RSPCT, TBUFF, M227SZ$);
# 
*     IN SERVER MODE, LIST OFF DATA CONNECTION. 
# 
        IF EPTFLAG EQ FTPS$ 
        THEN
          BEGIN 
          REQ$RCODE[RFTPCM$] = RCM"RCSDATAD";   # REQUEST TO LST/OFF   #
          REQ$CTYPE[RFTPCM$] = CTYPE"CTDATA";   # DATA CONNECTION      #
          REQ$LEN[RFTPCM$]   = 0; 
          REQ$ADDR[RFTPCM$]  = 0; 
          FFSLCRP;
          END 
  
        GOTO A$END ;
  
  
A$I150: 
# 
*     1) SEND 150 RESPONSE MSG (OPENING DATA CONNECTION). 
*     2) IN SERVER MODE, LIST/ON DATA CONNECTION. 
# 
  
        FFSUSRM(RSPCT, MSG$150, NOPFM$);
  
        IF EPTFLAG EQ FTPS$ 
        THEN
          BEGIN                                   # SERVER MODE        #
          REQ$RCODE[RFTPCM$] = RCM"RCRDATAD";     # REQUEST TO LIST/ON #
          REQ$CTYPE[RFTPCM$] = CTYPE"CTDATA";     # DATA CONNECTION    #
          REQ$LEN[RFTPCM$]   = 0; 
          REQ$ADDR[RFTPCM$]  = 0; 
          FFSLCRP;
          END 
  
        GOTO A$END ;
  
  
A$TYPE: 
# 
*     PROCESS THE *TYPE* COMMAND. 
# 
        IF (PARA$NUM LS 1)
        THEN
          BEGIN 
          FFSUSRM(RSPCT, MSG$200, NOPFM$);
          TPTTYPE[0] = "A"; 
          TPTTYPE2[0] = "N";
          END 
  
        ELSE IF (PAR$VALUE[1] EQ A$0) 
        THEN
          BEGIN 
          IF (PARA$NUM LS 2)
          THEN
            BEGIN 
            FFSUSRM(RSPCT, MSG$200, NOPFM$);
            TPTTYPE[0] = "A"; 
            TPTTYPE2[0] = "N";
            END 
          ELSE IF (PAR$VALUE[2] EQ C$0) 
          THEN
            BEGIN 
            FFSUSRM(RSPCT, MSG$504D, NOPFM$); 
            END 
          ELSE IF (PAR$VALUE[2] EQ N$0) 
          THEN
            BEGIN 
            FFSUSRM(RSPCT, MSG$200, NOPFM$);
            TPTTYPE[0] = "A"; 
            TPTTYPE2[0] = "N";
            END 
          ELSE IF (PAR$VALUE[2] EQ T$0) 
          THEN
            BEGIN 
            FFSUSRM(RSPCT, MSG$504C, NOPFM$); 
            END 
          ELSE
            BEGIN 
            FFSUSRM(RSPCT, MSG$501A, NOPFM$); 
            END 
          END 
  
        ELSE IF (PAR$VALUE[1] EQ E$0) 
        THEN
          BEGIN 
          FFSUSRM(RSPCT, MSG$504A, NOPFM$); 
          END 
  
        ELSE IF (PAR$VALUE[1] EQ I$0) 
        THEN
          BEGIN 
          FFSUSRM(RSPCT, MSG$200, NOPFM$);
          TPTTYPE[0] = "I"; 
          END 
  
        ELSE IF (PAR$VALUE[1] EQ L$0) 
        THEN
          BEGIN 
          FFSUSRM(RSPCT, MSG$504B, NOPFM$); 
          END 
  
        ELSE
          BEGIN 
          FFSUSRM(RSPCT, MSG$501A, NOPFM$); 
          END 
  
        GOTO A$END ;
  
A$STRU: 
# 
*     SEND 200 RESPONSE MSG (COMMAND O.K. ) 
*     PROCESS STRU COMMAND
# 
        FFSUSRM(RSPCT, MSG$200, NOPFM$);
        TPTSTRU[0] = C<0,1>PAR$VALUE[1] ; # SAVE THE STRUCTURE CODE    #
  
        GOTO A$END ;
  
  
A$MODE: 
# 
*     SEND 200 RESPONSE MSG (COMMAND O.K. ) 
*     PROCESS MODE COMMAND
# 
        FFSUSRM(RSPCT, MSG$200, NOPFM$);
        TPTMODE[0] = C<0,1>PAR$VALUE[1] ; # SAVE THE MODE CODE         #
  
        GOTO A$END ;
  
  
A$IADC: 
# 
*       ISSUE 150 MESSAGE.
*       CHECK IF IP ADDRESS IS PRESENT. 
*       IF NOT: 
*           SET IP ADDRESS TO THAT OF CONTROL CONNECTION. 
*       SEND REQUEST TO CONNECTION MANAGEMENT TO INITIATE 
*       ACTIVE DATA CONNECTION. 
# 
  
        FFSUSRM(RSPCT, MSG$150, NOPFM$);
  
        IF ACN$DIPFIU[CTYPE"CTDATA"] EQ IP$FIUSTAT"NONE"
        THEN
          BEGIN                        # SET IP ADR TO THAT OF CTRL CN #
          ACN$DIPFIU[CTYPE"CTDATA"] = ACN$DIPFIU[CTYPE"CTCTRL"];
          ACN$DIPNET[CTYPE"CTDATA"] = ACN$DIPNET[CTYPE"CTCTRL"];
          ACN$DIPHST[CTYPE"CTDATA"] = ACN$DIPHST[CTYPE"CTCTRL"];
          ACN$DTCPIU[CTYPE"CTDATA"] = ACN$DTCPIU[CTYPE"CTCTRL"];
          ACN$DTCPRT[CTYPE"CTDATA"] = ACN$DTCPRT[CTYPE"CTCTRL"];
          END 
  
        ACN$STCPIU[CTYPE"CTDATA"]   = TRUE; 
        ACN$STCPRT[CTYPE"CTDATA"]   = TP$PT$FTPD; 
  
        ACN$SNODR[CTYPE"CTDATA"] = TRUE; # ALLOW NO OUTSTANDING DATA   #
  
        REQ$RCODE[RFTPCM$] = RCM"RCIACON";
        REQ$CTYPE[RFTPCM$] = CTYPE"CTDATA";      # ON DATA CONNECTION  #
        FFSLCRP;
  
        GOTO A$END; 
  
  
A$IPDC: 
# 
*       INITIATE PASSIVE DATA CONNECTION. 
*       NOT FROM PASV COMMAND SO USE CTRL CN SOURCE PORT. 
* 
# 
  
        ACN$STCPIU[CTYPE"CTDATA"] = TRUE; 
        ACN$STCPRT[CTYPE"CTDATA"] = ACN$STCPRT[CTYPE"CTCTRL"];
  
        GOTO A$IPDC1; 
  
  
A$IPDC1:  
        ACN$DTCPIU[CTYPE"CTDATA"] = TRUE; 
        ACN$DTCPRT[CTYPE"CTDATA"] = TP$PT$FTPD;  # WELL-KNOWN DATA PORT#
  
        ACN$SNODR[CTYPE"CTDATA"] = TRUE; # ALLOW NO OUTSTANDING DATA   #
  
        REQ$RCODE[RFTPCM$] = RCM"RCIPCON";
        REQ$CTYPE[RFTPCM$] = CTYPE"CTDATA";      # ON DATA CONNECTION  #
        FFSLCRP;
  
        GOTO A$END; 
  
  
A$ADTC: 
# 
*     SET UP TO PROCESS THE DATA TRANSFER COMMAND.
*     IF RETR, BEGIN TO TRANSFER DATA...
*     NOTE:- TRFRTYPE IS SET IN INDICATION PROCESSING.
# 
  
        IF   (TRFRTYPE LS TRTYPE"RETR") 
          OR (TRFRTYPE GR TRTYPE"LIST") 
        THEN
          BEGIN 
          FFSEABT(BADTRFRTP) ;         # ABORT - BAD TRANSFER TYPE     #
          END 
  
        FFSRSDT(TRFRTYPE, STATUS$, RSPCT); # PERFORM SETUP/POSITIONING #
  
        IF STATUS$ NQ 0 
        THEN
          BEGIN                        # DISK ERRORS                   #
          GOTO A$ADTC1;                # EXIT TO ABORT DATA CN         #
          END 
  
        IF   (TRFRTYPE EQ TRTYPE"RETR") 
          OR (TRFRTYPE EQ TRTYPE"LIST") 
        THEN
          BEGIN                        # RETR/LIST - SEND TILL F/CTRL  #
          FFSRADT(TRFRTYPE, STATUS$,   # ACTION DATA TRANSFER          #
                  RSPCT); 
          IF STATUS$ EQ 550            # 550 MSG ALREADY SENT          #
          THEN
            BEGIN 
            GOTO A$ADTC1;              # GOTO ABORT DATA CONNECTION    #
            END 
          END 
  
        GOTO A$END ;
  
  
A$ADTC1:  
# 
*******************************NOTE*************************************
*     THE CODE HERE IS A KLUDGE NEEDED BECAUSE UNIX SYSTEMS SOMETIMES  *
*     DO NOT HANDLE A RESET ON THE DATA CONNECTION PROPERLY, AND MAY   *
*     HANG. THIS CODE WILL INSTEAD CLOSE THE DATA CONNECTION AND FORCE *
*     A STATE CHANGE NOT VIA THE STATE TABLES. THE STATE CHANGE IS DONE*
*     TO GET THE FTP LAYER TO A STATE IN WHICH IT WILL PROCESS THE     *
*     *DATA-CONNECTION-CLOSED* RESPONSE CORRECTLY I.E. WITHOUT SENDING *
*     OUT A 226 MESSAGE ETC.                                           *
*******************************NOTE*************************************
# 
  
        NEXT$ST = FTS$CDS"FTS$WDCE";   # NEXT STATE IS WAIT-DATA-CLOSE #
        MSGOK   = FALSE;               # DO NOT SEND 226 MESSAGE       #
  
A$ADTC2:  
# 
*     CLEAR NO-OUTSTANDING-DATA INDICATIONS REQUIRED
*     CLOSE DATA CONNECTION 
*     RETURN THE FILE IF NECESSARY. 
# 
        ACN$SNODR[CTYPE"CTDATA"] = FALSE; 
  
        REQ$RCODE[RFTPCM$] = RCM"RCCLSCON" ;
        REQ$CTYPE[RFTPCM$] = CTYPE"CTDATA";      # ON DATA CONNECTION  #
        FFSLCRP;
  
        IF EPTFLAG EQ FTPS$ 
        THEN
          BEGIN 
          RETERN(MBT);                 # RETURN THE FILE               #
          END 
  
        GOTO A$END ;
A$A226: 
# 
*     SEND 226 RESPONSE MSG (CLOSING DATA CONNECTION).
*     CONTINUE ON TO CLOSE DATA CONNECTION. 
# 
  
        FFSUSRM(RSPCT, MSG$226, NOPFM$);
  
        GOTO A$ADTC2; 
  
  
A$B226: 
# 
*     SEND 226 RESPONSE MSG (CLOSING DATA CONNECTION).
*     CONTINUE ON TO ABORT DATA CONNECTION. 
# 
  
        FFSUSRM(RSPCT, MSG$226, NOPFM$);
  
        GOTO A$ADCN;
  
  
A$ADCN:                                # ABORT DATA CONNECTION         #
# 
*     CLEAR NO-OUTSTANDING-DATA INDICATIONS REQUIRED
*     ABORT DATA CONNECTION 
# 
        ACN$SNODR[CTYPE"CTDATA"] = FALSE; 
  
        REQ$RCODE[RFTPCM$] = RCM"RCABTDAT" ;
        REQ$CTYPE[RFTPCM$] = CTYPE"CTDATA";      # ON DATA CONNECTION  #
        FFSLCRP;
  
        IF EPTFLAG EQ FTPS$ 
        THEN
          BEGIN 
          RETERN(MBT);                 # RETURN THE FILE               #
          END 
  
        GOTO A$END ;
  
  
A$PRTV:                                # PROTOCOL VIOLATION - ABORT    #
# 
*     PROTOCOL VIOLATION - ABORT. 
# 
        MESSAGE (PROTVIO,0) ; 
        ABORT ; 
  
  
A$DATA:                                # PROCESS DATA                  #
  
# 
*       RETR,LIST - SEND DATA UNTIL FLOW CONTROL NO LONGER RELEASED.
*       APPE,STOR - PROCESS THE BLOCK RECEIVED. 
*       ROUTINE FFSRADT IS THE DATA HANDLER CALLING ROUTINE.
# 
  
        OUTFCR = TRUE;                 # SET FLOW CONTROL RELEASED     #
        FFSRADT(TRFRTYPE, STATUS$,     # ACTION DATA TRANSFER          #
                RSPCT); 
        IF STATUS$ EQ 550 
        THEN
          BEGIN                        # CODE/SET BAD - 550 SENT       #
          GOTO A$ADTC1;                # GO ON TO ABORT DATA CONNECTION#
          END 
  
        GOTO A$END ;
  
  
A$C226:                                # SEND 226 RESPONSE,CLS CTRL CN #
# 
*     COMPLETE THE DATA TRANSFER. 
*     ISSUE 226.
*     CLOSE CONTROL CONNECTION. 
# 
  
        FFSRCDT(TRFRTYPE, STATUS$, RSPCT); # DATA COMPLETION PROCESSOR #
  
        FFSUSRM(RSPCT, MSG$226, NOPFM$);   # SEND 226 RESPONSE MESSAGE #
  
        REQ$RCODE[RFTPCM$] = RCM"RCCLSCON" ;
        REQ$CTYPE[RFTPCM$] = CTYPE"CTCTRL"; # ON CONTROL CONNECTION    #
        REQ$ADDR [RFTPCM$] = 0 ;
        REQ$LEN  [RFTPCM$] = 0 ;
        FFSLCRP ;                      # CALL LOWER LAYER TO CLOSE CTCN#
  
        GOTO A$END ;
  
  
A$ACDC:                                # ISSUE CLOSE DATA CONNECTION   #
# 
*     COMPLETE DATA TRANSFER. 
*     SEND 226 RESPONSE MESSAGE.
# 
  
        FFSRCDT(TRFRTYPE, STATUS$,         # COMPLETE DATA TRANSFER    #
                RSPCT); 
  
        FFSUSRM(RSPCT, MSG$226, NOPFM$);   # SEND 226 RESPONSE MESSAGE #
  
        GOTO A$END ;
  
  
A$ICDC:                                # ISSUE CLOSE DATA CONNECTION   #
# 
*     COMPLETE DATA TRANSFER. 
# 
  
        FFSRCDT(TRFRTYPE, STATUS$,     # COMPLETE DATA TRANSFER        #
                RSPCT); 
  
        GOTO A$END ;
  
A$S226:                                # SEND 226 RESPONSE MESSAGE     #
# 
*     SEND 226 RESPONSE MESSAGE.
# 
  
        IF MSGOK
        THEN
          BEGIN                              # O.K. TO SEND MESSAGE    #
          FFSUSRM(RSPCT, MSG$226, NOPFM$);   # SEND 226 RESPONSE MSG   #
          END 
        ELSE
          BEGIN                              # NOT O.K. TO SEND MESSAGE#
          MSGOK = TRUE;                      # MSG NOT SENT, RESET IT..#
          END                                #..FOR NEXT ITERATION.    #
  
        GOTO A$END ;
  
  
A$RNFR:                                # PROCESS RNFR COMMAND          #
# 
*     PROCESS RNFR ( RENAME FROM ) COMMAND. 
*     SAVE RENAME FROM FILE NAME. 
*     SEND A 350 MESSAGE. 
# 
        RNFRFN = PAR$VALUEN[1] ;       # SAVE THE OLD PFN              #
        FFSUSRM(RSPCT, MSG$350, NOPFM$);
  
        GOTO A$END ;
  
  
A$RNTO:                                # PROCESS RNTO                  #
# 
*     PROCESS RNTO ( RENAME TO ) COMMAND. 
*     CALL CHANGE ROUTINE TO CHANGE FILE NAME.
# 
        READMODE = FALSE;              # DO NOT CHANGE THE MODE TO..   #
                                       #..READ AUTOMATICALLY           #
        IF FFSUPCP
        THEN
          BEGIN                        # NO ERROR IN CHANGE PARAMETERS #
          RNTOFN      = PAR$VALUEN[1]; # GET RENAME TO FILE NAME       #
          MBT$LFN[0]  = C<0,7>RNFRFN;  # LFN = OLD FILE NAME           #
          MBT$PFN[0]  = C<0,7>RNFRFN;  # PFN = OLD FILE NAME           #
          MBT$NFN[0]  = C<0,7>RNTOFN;  # NFN = NEW FILE NAME           #
          IF MBT$PWU[0] EQ 0
          THEN
            BEGIN                      # NO FILE PASSWORD SPECIFIED    #
            MBT$PWU[0] = O"77777777777777";  # DO NOT CHANGE CURRENT PW#
            END 
  
          CHANGE(MBT , STATUS$, LOC(PFM$T[0]) , RNTOFN ) ;
  
                                       # DONE WITH RENAME SEQUENCE     #
          RNTOFN = 0;                  # CLEAR RENAME TO FILE NAME     #
          RNFRFN = 0 ;                 # CLEAR RENAME FROM FILE NAME   #
  
          IF STATUS$ EQ NEC 
          THEN
            BEGIN                              # PFM SUCCESSFUL        #
            FFSUSRM(RSPCT, MSG$250, NOPFM$);   # 250 MESSAGE           #
            END 
          ELSE
            BEGIN                              # PFM UNSUCCESSFUL      #
            IF PFM$T[0] NQ 0
            THEN
              BEGIN                            # PFM TEXT EXIST        #
              FFSUSRM(RSPCT, MSG$550, PFM$);
              END 
            ELSE
              BEGIN                            # NO PFM TEXT EXIST     #
              FFSUSRM(RSPCT, MSG$550, NOPFM$);
              END 
            END 
          END 
  
        ELSE                           # PARAMETER SYNTAX ERROR        #
          BEGIN 
          FFSUSRM(RSPCT, MSG$501, NOPFM$);
          END 
  
        READMODE = TRUE;               # RESET MODE TO DEFAULT TO READ #
  
  
        GOTO A$END ;
  
  
A$DELE:                                # PROCESS DELE                  #
# 
*     PROCESS DELE ( DELETE FILE FROM CATALOG ) COMMAND.
*     CALL PURGE ROUTINE TO PURGE THE FILE. 
# 
        IF FFSUPCP
        THEN
          BEGIN                        # NO ERROR IN PARAMETERS        #
          PURGE (MBT, STATUS$, LOC(PFM$T[0])) ;  # PURGE THE FILE      #
  
          IF STATUS$ EQ NEC 
          THEN
            BEGIN                              # PFM SUCCESSFUL        #
            FFSUSRM(RSPCT, MSG$250, NOPFM$);   # 250 MESSAGE           #
            END 
          ELSE
            BEGIN                              # PFM UNSUCCESSFUL      #
            IF PFM$T[0] NQ 0
            THEN
              BEGIN                            # PFM TEXT EXIST        #
              FFSUSRM(RSPCT, MSG$550, PFM$);
              END 
            ELSE
              BEGIN                            # NO PFM TEXT EXIST     #
              FFSUSRM(RSPCT, MSG$550, NOPFM$);
              END 
            END 
          END 
  
        ELSE                           # PARAMETER SYNTAX ERROR        #
          BEGIN 
          FFSUSRM(RSPCT, MSG$501, NOPFM$);
          END 
  
        GOTO A$END ;
  
  
A$HELP:                                # PROCESS HELP COMMAND          #
# 
*     PROCESS HELP COMMAND. 
# 
        FFSCHLP;
  
        GOTO A$END; 
  
  
A$ICCC:                                # ISSUE 221 AND CLOSE CONTROL CN#
# 
*     ISSUE 221 - LOGOUT MESSAGE. 
*     GOTO CLOSE CONTROL CONNECTION.
# 
  
        FFSUSRM(RSPCT, MSG$221, NOPFM$);
  
        GOTO A$ICCC1; 
  
  
A$ICCC1:  
# 
*     CLOSE CONTROL CONNECTION. 
# 
        REQ$RCODE[RFTPCM$] = RCM"RCCLSCON" ;
        REQ$CTYPE[RFTPCM$] = CTYPE"CTCTRL" ;     # ON CONTROL CN.      #
        FFSLCRP;
  
        GOTO A$END ;
  
  
A$QUIT: 
# 
*     ENDING APPLICATION - NETOFF.
# 
        FFSUDFN(NORESTART$);           # DISCONNECT FROM NETWORK       #
  
        GOTO A$END ;
  
A$ADNO:                                # ABORT DATA CN, NETOFF, END    #
# 
*     CLEAR NO-OUTSTANDING-DATA INDICATIONS REQUIRED
*     ABORT DATA CONNECTION.
*     THEN NETOFF.
# 
        ACN$SNODR[CTYPE"CTDATA"] = FALSE; 
        REQ$RCODE[RFTPCM$] = RCM"RCABTDAT" ;
        REQ$CTYPE[RFTPCM$] = CTYPE"CTDATA";      # ON DATA CONNECTION  #
        REQ$ADDR [RFTPCM$] = 0 ;
        REQ$LEN  [RFTPCM$] = 0 ;
        FFSLCRP ;                      # CALL LOWER LAYER TO ABORT DCN #
  
        FFSUDFN(NORESTART$);           # DISCONNECT FROM NETWORK       #
  
        GOTO A$END ;
  
  
A$A426:                                # ABORT TRANSFER,ISSUE 426 MSG  #
# 
*     ABORT TRANSFER. 
*     THEN PROCEED TO ISSUE 426 RESPONSE MESSAGE. 
# 
        REQ$RCODE[RFTPCM$] = RCM"RCABTDAT" ;
        REQ$CTYPE[RFTPCM$] = CTYPE"CTDATA"; 
        REQ$ADDR [RFTPCM$] = 0 ;
        REQ$LEN  [RFTPCM$] = 0 ;
        FFSLCRP ; 
  
        IF EPTFLAG EQ FTPS$ 
        THEN
          BEGIN 
          RETERN(MBT);                 # RETURN THE FILE               #
          END 
  
        GOTO A$I426;
  
A$I426:                                # ISSUE 426 MSG                 #
# 
*     CLEAR NO-OUTSTANDING-DATA INDICATIONS REQUIRED
*     ISSUE 426 RESPONSE MESSAGE. 
# 
        ACN$SNODR[CTYPE"CTDATA"] = FALSE; 
        FFSUSRM(RSPCT, MSG$426, NOPFM$);
  
        GOTO A$END ;
  
  
A$PSCF:                                # PRESET SITECOM PARAMETERS     #
# 
*     PRESET SITECOM PARAMETERS.
*     SET SITE PARAMETERS TO DEFAULTS.
# 
        SITECS    = DFLTCS;            # USE CURRENT DEFAULT CS        #
        SITEFSC   = 0;                 # FSC = 0                       #
        SITEFT    = DFLTFT;            # USE CURRENT DEFAULT FT        #
        SITETRUNC = FALSE;             # TRUNCATE DEFAULTS TO NO       #
        SITERDEOI = FALSE;             # READ END OF INFORMATION TO NO #
        TPTMODE   = MODE$S;            # MODE DEFAULTS TO STREAM       #
        TPTSTRU   = STRU$F;            # STRUCTURE DEFAULTS TO FILE    #
        TPTTYPE   = TYPE$A;            # TYPE DEFAULTS TO ASCII        #
  
        GOTO A$END ;
  
  
A$ABORT:                               # ABORT APPLICATION             #
# 
*     ABORT APPLICATION.
# 
        ABT$STCD = XCDD (FTPSTATE);    # CURRENT STATE CODE            #
        ABT$TRGCD = XCDD (TRIGGER);    # CURRENT TRIGGER CODE          #
        FFSEABT (STTBABT);             # DAYFILE ERROR MSG THEN ABORT  #
  
        GOTO A$END ;
  
  
A$NOOP:                                # NO ACTION                     #
# 
*     NO ACTIONS ACTION.
# 
  
        GOTO A$END ;
  
  
A$I550: 
# 
*     ISSUE 550 - FILE ACTION NOT TAKEN RESPONSE MESSAGE. 
*     NOTE: - PFM$T IS SET IN INDICATION PROCESSING BY *FFSRPDT*. 
# 
        IF PFM$T[0] EQ 0
        THEN
          BEGIN                        # NO PFM TEXT INCLUDED          #
          FFSUSRM(RSPCT, MSG$550, NOPFM$);
          END 
        ELSE
          BEGIN                        # PFM TEXT INCLUDED             #
          FFSUSRM(RSPCT, MSG$550, PFM$);
          END 
  
        GOTO A$END; 
  
  
A$A550: 
# 
*     1) LST/ON DATA CONNECTION.
*     2) GOTO A$I550 TO ISSUE THE 550 RESPONSE MESSAGE. 
* 
# 
  
        REQ$RCODE[RFTPCM$] = RCM"RCRDATAD";   # REQUEST TO LST/ON      #
        REQ$CTYPE[RFTPCM$] = CTYPE"CTDATA";   # DATA CONNECTION        #
        REQ$LEN[RFTPCM$]   = 0; 
        REQ$ADDR[RFTPCM$]  = 0; 
        FFSLCRP;
  
        GOTO A$I550;                          # GOTO ISSUE 550 RESPONSE#
  
  
A$IXXX: 
# 
*     SEND A PRESET RESPONSE MESSAGE. 
*     MSGNO SET TO A MESSAGE NUMBER, AND PFM TEXT EXIST.
# 
  
        FFSUSRM(RSPCT, MSGNO, NOPFM$);
  
        GOTO A$END; 
  
A$SYST: 
# 
*     PROCESS SYST COMMAND
*     SEND   215 NOS SYSTEM TYPE, NOS S.T.U - VVV/WWW, FTP X.Y - ZZZ. 
# 
        FFSUSRM(RSPCT, MSG$215, NOPFM$);    # NORMAL 215               #
  
        GOTO A$END; 
  
A$I202: 
# 
*     SEND   202 RESPONSE MESSAGE.
# 
        FFSUSRM(RSPCT, MSG$202, NOPFM$);    # NORMAL 202               #
  
        GOTO A$END; 
  
A$SITE: 
# 
*     PROCESS THE SITE COMMAND ... MODIFY DEFAULT CODE SET AND/OR 
*     FILE TYPE.
# 
        IF FFSUPCP
        THEN
          BEGIN 
          DFLTCS = SITECS;
          DFLTFT = SITEFT;
          FFSUSRM(RSPCT, MSG$200, NOPFM$);  # NORMAL 200               #
          END 
        ELSE
          BEGIN 
          FFSUSRM(RSPCT, MSG$501, NOPFM$);  # ABNORMAL 501             #
          END 
  
        GOTO A$END; 
  
A$END:  
  
      END                              # EXECUTE APPROPRIATE ACTION    #
  
  
      IF    (NEXT$ST EQ FTS$CDS"FTS$IDLE")
         OR (NEXT$ST GQ FTS$CDS"FTS$END") 
      THEN
        BEGIN                          # STATE OUT OF RANGE            #
        SOR$STCD = XCDD (NEXT$ST);     # CURRENT STATE CODE            #
        FFSEABT(SORANGE);              # DAYFILE MESSAGE AND ABORT     #
        END 
  
      FTP$TRIG[0]   = TRIGGER ;        # SAVE TRIGGER IN DEBUG BUFFER  #
      FTP$LST$ST[0] = FTPSTATE ;       # CURRENT BECOMES LAST          #
      FTP$CUR$ST[0] = NEXT$ST ;        # NEW STATE BECOMES CURRENT     #
  
      RETURN; 
  
      END                              # FFSLFLH                       #
  
      TERM
