/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
*
*  Produce simplified form from ISH file.
*
*       Parameters:
*           1st = Input File Name
*           2nd = Output File Name
*           3rd = Logging level
*           4th = Logging Filter #1
*           5th = Logging Filter #2
*
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
* Date:       Developer  PR/CR #   Description of changes
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
*
* 03/10/2011  ras        ????      Created.
*
* 06/06/2012  ras        ????      Added AW1-AW4 (Automated Present Weather)
*                                  Corrected problem when OC1 was missing
*
* 06/21/2012  ras        ????      Modified Wind Dir logic to set value to 990 when
*                                  Type code is 'V'
*                                  Added MW4 (Manual Present Weather)
*
* 03/24/2015  ras        ????      Added GDx logic to fill in Sky Cover info when GF1
*                                  is missing.
*
* 05/04/2016  ras        ????      May The Fourth be with you as you seek and destroy
*                                  the bug in the AT1 element that causes the false
*                                  detection of AWx, AUx, and MWx elements.
*
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */

import java.io.*;
//import java.lang.Math.*;
import java.util.Date;
import java.util.*;
//import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.text.NumberFormat;
import java.text.DecimalFormat;

/**
 *   Mainline logic.
 */
public class ishJava
{
    static String sProgramName      = "ishJava.java";
    static String sDebugName        = "ishJava";
    static String sInFileName       = "";
    static String sOutFileName      = "";
    static FileOutputStream fDebug  = null;

    static boolean bVerbose         = false;
    static boolean bOnce            = false;
    static boolean bStdErr          = false;

    static String sOutputRecord     = "";
    static String sControlSection   = "";
    static String sMandatorySection = "";
    static int    iCounter          = 0;
    static int    iLength           = 0;
    static int    iOffset           = 25;
    static int    iObsKey           = 0;
    static int    iWork             = 0;
    static String[] sWW1234;
    static String[] sAW1234;
    static float  fWork             = 0;
    static float  fWorkSave         = 0;
    static String sConcat           = "";
    static String sConcatDate       = "";
    static String sConcatMonth      = "";
    static String sMessage          = "";

    static final int    iPROD           = 0;                   // Only print basic run info
    static final int    iDEBUG          = 1;                   // Print lots of info, such as debug messages
    static int          iLogLevel       = 0;                   // Default value for this run.
    static String       p_sFilter1      = "None";
    static String       p_sFilter2      = "None";

    static NumberFormat  fmt03 = new DecimalFormat("000");         // 3-char int   (keep leading zeros)
    static NumberFormat fmt4_1 = new DecimalFormat("#0.0");        // 4-char float
    static NumberFormat fmt6_1 = new DecimalFormat("###0.0");      // 6-char float
    static NumberFormat fmt5_2 = new DecimalFormat("##0.00");      // 5-char float
    static NumberFormat  fmt02 = new DecimalFormat("#0");          // 2-char int

//  Fields making up the Control Data Section.
    static String sCDS          = "";
    static String sCDS_Fill1    = "";
    static String sCDS_ID       = "";
    static String sCDS_Wban     = "";
    static String sCDS_Year     = "";
    static String sCDS_Month    = "";
    static String sCDS_Day      = "";
    static String sCDS_Hour     = "";
    static String sCDS_Minute   = "";
    static String sCDS_Source   = "";
    static String sCDS_Fill2    = "";
    static String sCDS_Type     = "";
    static String sCDS_Fill3    = "";
//  Fields making up the Mandatory Data Section.
    static String sMDS          = "";
    static String sMDS_Dir      = "";
    static String sMDS_DirQ     = "";
    static String sMDS_DirType  = "";
    static String sMDS_Spd      = "";
    static String sMDS_Fill2    = "";
    static String sMDS_Clg      = "";
    static String sMDS_Fill3    = "";
    static String sMDS_Vsb      = "";
    static String sMDS_Fill4    = "";
    static String sMDS_TempSign = "";
    static String sMDS_Temp     = "";
    static String sMDS_Fill5    = "";
    static String sMDS_DewpSign = "";
    static String sMDS_Dewp     = "";
    static String sMDS_Fill6    = "";
    static String sMDS_Slp      = "";
    static String sMDS_Fill7    = "";

//  REM offset
    static int    iREM_IndexOf  = 0;

//  Fields making up the OC1 element
//    Sample Element=[OC1...]
    static int    iOC1_IndexOf  = 0;
    static int    iOC1_Length   = 8;
    static String sOC1          = "";
    static String sOC1_Fill1    = "";
    static String sOC1_Gus      = "";
    static String sOC1_Fill2    = "";

//  Fields making up the GF1 element
    static int    iGF1_IndexOf  = 0;
    static int    iGF1_Length   = 26;
    static String sGF1          = "";
    static String sGF1_Fill1    = "";
    static String sGF1_Skc      = "";
    static String sGF1_Fill2    = "";
    static String sGF1_Low      = "";
    static String sGF1_Fill3    = "";
    static String sGF1_Med      = "";
    static String sGF1_Fill4    = "";
    static String sGF1_Hi       = "";
    static String sGF1_Fill5    = "";

//  Fields making up the GDx element (Only need 1st 6 bytes) // 03/24/2015  ras
    static int    iGDx_IndexOf  = 0;
    static int    iGDx_Length   = 6;
    static String sGDx          = "";   // Length 6
    static String sGDx_Cov1     = "";   // Length 1
    static String sGDx_Cov2     = "";   // Length 2
    static String sGDx_Skc      = "";

//    static int    iMW_Counter   = 0;
//  Fields making up the MW1-7 elements
    static int    iMW1_IndexOf  = 0;
    static int    iMW1_Length   = 6;
    static String sMW1          = "";
    static String sMW1_Fill1    = "";
    static String sMW1_Ww       = "";
    static String sMW1_Fill2    = "";

    static int    iMW2_IndexOf  = 0;
    static int    iMW2_Length   = 6;
    static String sMW2          = "";
    static String sMW2_Fill1    = "";
    static String sMW2_Ww       = "";
    static String sMW2_Fill2    = "";

    static int    iMW3_IndexOf  = 0;
    static int    iMW3_Length   = 6;
    static String sMW3          = "";
    static String sMW3_Fill1    = "";
    static String sMW3_Ww       = "";
    static String sMW3_Fill2    = "";

    static int    iMW4_IndexOf  = 0;
    static int    iMW4_Length   = 6;
    static String sMW4          = "";
    static String sMW4_Fill1    = "";
    static String sMW4_Ww       = "";
    static String sMW4_Fill2    = "";

//  Fields making up the AY1 element
    static int    iAY1_IndexOf  = 0;
    static int    iAY1_Length   = 8;
    static String sAY1          = "";
    static String sAY1_Fill1    = "";
    static String sAY1_Pw       = "";
    static String sAY1_Fill2    = "";

//  Fields making up the MA1 element
    static int    iMA1_IndexOf  = 0;
    static int    iMA1_Length   = 15;
    static String sMA1          = "";
    static String sMA1_Fill1    = "";
    static String sMA1_Alt      = "";
    static String sMA1_Fill2    = "";
    static String sMA1_Stp      = "";
    static String sMA1_Fill3    = "";

// Max/Min fields
    static String sMaxTemp      = "";
    static String sMinTemp      = "";

//  Fields making up the KA1 element
    static int    iKA1_IndexOf  = 0;
    static int    iKA1_Length   = 13;
    static String sKA1          = "";
    static String sKA1_Fill1    = "";
    static String sKA1_Code     = "";
    static String sKA1_Temp     = "";
    static String sKA1_Fill2    = "";

//  Fields making up the KA2 element
    static int    iKA2_IndexOf  = 0;
    static int    iKA2_Length   = 13;
    static String sKA2          = "";
    static String sKA2_Fill1    = "";
    static String sKA2_Code     = "";
    static String sKA2_Temp     = "";
    static String sKA2_Fill2    = "";

// Precip fields
    static String sPcp01        = "*****";
    static String sPcp01t       = " ";
    static String sPcp06        = "*****";
    static String sPcp06t       = " ";
    static String sPcp24        = "*****";
    static String sPcp24t       = " ";
    static String sPcp12        = "*****";
    static String sPcp12t       = " ";

//  Fields making up the AA1 element
    static int    iAA1_IndexOf  = 0;
    static int    iAA1_Length   = 11;
    static String sAA1          = "";
    static String sAA1_Fill1    = "";
    static String sAA1_Hours    = "";
    static String sAA1_Pcp      = "";
    static String sAA1_Trace    = "";
    static String sAA1_Fill2    = "";

//  Fields making up the AA2 element
    static int    iAA2_IndexOf  = 0;
    static int    iAA2_Length   = 11;
    static String sAA2          = "";
    static String sAA2_Fill1    = "";
    static String sAA2_Hours    = "";
    static String sAA2_Pcp      = "";
    static String sAA2_Trace    = "";
    static String sAA2_Fill2    = "";

//  Fields making up the AA3 element
    static int    iAA3_IndexOf  = 0;
    static int    iAA3_Length   = 11;
    static String sAA3          = "";
    static String sAA3_Fill1    = "";
    static String sAA3_Hours    = "";
    static String sAA3_Pcp      = "";
    static String sAA3_Trace    = "";
    static String sAA3_Fill2    = "";

//  Fields making up the AA4 element
    static int    iAA4_IndexOf  = 0;
    static int    iAA4_Length   = 11;
    static String sAA4          = "";
    static String sAA4_Fill1    = "";
    static String sAA4_Hours    = "";
    static String sAA4_Pcp      = "";
    static String sAA4_Trace    = "";
    static String sAA4_Fill2    = "";

//  Fields making up the AJ1 element
    static int    iAJ1_IndexOf  = 0;
    static int    iAJ1_Length   = 17;
    static String sAJ1          = "";
    static String sAJ1_Fill1    = "";
    static String sAJ1_Sd       = "";
    static String sAJ1_Fill2    = "";

//  Fields making up the AW1-4 elements
    static int    iAW1_IndexOf  = 0;
    static int    iAW1_Length   = 6;
    static String sAW1          = "";
    static String sAW1_Fill1    = "";
    static String sAW1_Zz       = "";
    static String sAW1_Fill2    = "";

    static int    iAW2_IndexOf  = 0;
    static int    iAW2_Length   = 6;
    static String sAW2          = "";
    static String sAW2_Fill1    = "";
    static String sAW2_Zz       = "";
    static String sAW2_Fill2    = "";

    static int    iAW3_IndexOf  = 0;
    static int    iAW3_Length   = 6;
    static String sAW3          = "";
    static String sAW3_Fill1    = "";
    static String sAW3_Zz       = "";
    static String sAW3_Fill2    = "";

    static int    iAW4_IndexOf  = 0;
    static int    iAW4_Length   = 6;
    static String sAW4          = "";
    static String sAW4_Fill1    = "";
    static String sAW4_Zz       = "";
    static String sAW4_Fill2    = "";

    static int    iAT1_IndexOf  = 0;
    static int    iAT2_IndexOf  = 0;
    static int    iAT3_IndexOf  = 0;
    static int    iAT4_IndexOf  = 0;
    static int    iAT5_IndexOf  = 0;
    static int    iAT6_IndexOf  = 0;
    static int    iAT7_IndexOf  = 0;
    static int    iAT8_IndexOf  = 0;
    static int    iATx_Length   = 12;
    static int    iATx_Cut      = 0;

    static String sHeader       = "  USAF  WBAN YR--MODAHRMN DIR SPD GUS CLG SKC L M H  VSB "+
          "MW MW MW MW AW AW AW AW W TEMP DEWP    SLP   ALT    STP MAX MIN PCP01 "+
          "PCP06 PCP24 PCPXX SD\n";

    public static void main(String[] args)
    {
//        logIt(fDebug, iPROD, false, "---------------------------- Begin "+sProgramName);          // Append output to log.
//        logIt(fDebug, iPROD, false, "Number of args found=["+args.length+"]");                    // Append output to log.

// Process args
        if (args.length <= 1)
        {
            bStdErr=true;
            logIt(fDebug, iPROD, false, "Error. Input and Output filenames required.");            // Append output to log.
            System.exit(77);
        }

        if (args.length >= 2)
        {
            sInFileName     = args[0];
            sOutFileName    = args[1];
        }

        if (args.length >= 3)
        {
            if (args[2].equals("0") ||
                args[2].equals("1"))
            {
                iLogLevel = Integer.parseInt(args[2]);                      // Safe to convert to int.
            }
            else
            {
                logIt(fDebug, iPROD, false, "Invalid log message level parameter=["+args[2]+"].  Must be 0 or 1.  Defaulting to ["+iLogLevel+"]");
            }
        }

        if (args.length >= 4)
        {
            p_sFilter1 = args[3];
        }

        if (args.length >= 5)
        {
            p_sFilter2 = args[4];
        }

//        sOutFileName  = sInFileName+".java.out";

        logIt(fDebug, iDEBUG, false, "        Input Filename=["+sInFileName+"]");                // Append output to log.
        logIt(fDebug, iDEBUG, false, "       Output Filename=["+sOutFileName+"]");               // Append output to log.
        logIt(fDebug, iDEBUG, false, "         Logging Level=["+iLogLevel+"]");                  // Append output to log.
        logIt(fDebug, iDEBUG, false, "1st Log Message Filter=["+p_sFilter1+"]");
        logIt(fDebug, iDEBUG, false, "2nd Log Message Filter=["+p_sFilter2+"]");
// End of args

        try
        {
            BufferedReader fInReader        = new BufferedReader(new FileReader(sInFileName));

            FileWriter fFixed               = new FileWriter(sOutFileName);
            BufferedWriter fFixedWriter     = new BufferedWriter(fFixed);

            fFixedWriter.write(sHeader);           // Put header into output file.

            try
            {
                String line     = null;
                String lineHold = null;

                while (( line = fInReader.readLine()) != null)
                {
                    iCounter++;
//                    iOffset         = 25;
                    iLength         = line.length();
//                    logIt(fDebug, iDEBUG, false, "Record # "+iCounter+" had iLength=["+iLength+"]");
//                    System.out.println(line);

// See where the REM section begins
                    iREM_IndexOf    = line.indexOf("REM");
                    if (iREM_IndexOf == -1)
                    {
                        iREM_IndexOf = 9999;      // If no REM section then set to high value
                    }

                    getCDS(line);   //  Fields making up the Control Data Section.

                    sConcat      = sCDS_ID+"-"+sCDS_Wban+"-"+sCDS_Year+"-"+sCDS_Month+"-"+sCDS_Day+" "+sCDS_Hour+":"+sCDS_Minute;
                    sConcatDate  = sCDS_Year+"-"+sCDS_Month+"-"+sCDS_Day;
                    sConcatMonth = sCDS_Year+"-"+sCDS_Month;


// =-=-=-=-=-=-=-=-=-=-=-=-=-= Filter out all but a certain station/date =-=-=-=-=-=-=-=-=-=-=-=-=-=
//                    if ( (! sConcatDate.equals("2011-01-01")) && (! sConcatDate.equals("2010-01-02")) )
//                    if ( (! sConcatDate.equals("2012-04-12")) )           // Whole Day
//                    if ( (! sConcatMonth.equals("2009-04")) )           // Whole month
//                    {
//                        continue;
//                    }
//
//                    logIt(fDebug, iDEBUG, false, "line=["+line+"] ");
//
//                    logIt(fDebug, iDEBUG, false, "Record # "+iCounter+" had sConcat=["+sConcat+"]");
//
//                    if (iCounter >= 100)
//                    {
//                        logIt(fDebug, iDEBUG, false, "Max count reached.  Stopping...");
//                        fFixedWriter.flush();
//                        fFixedWriter.close();
//                        System.exit(22);
//                    }
// =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= Done =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=


// If there is a generated record for an AT1 element, skip it
//                    iAT1_IndexOf    = line.indexOf("AT1");
//                    if (iAT1_IndexOf > 0)
                    if (sCDS_Source.equals("O"))
                    {
                        logIt(fDebug, iDEBUG, false, "Found summary record generated to hold AT1 element in ["+sConcat+"] Source=["+sCDS_Source+"] Skipping record...");
                        continue;
                    }

//                    logIt(fDebug, iDEBUG, false, "================================ Source=["+sCDS_Source+"] Type=["+sCDS_Type+"]");
                    if (sCDS_Type.equals("SOD "))
                    {
                        iAT1_IndexOf    = line.indexOf("AT1");
                        iAT2_IndexOf    = line.indexOf("AT2");
                        iAT3_IndexOf    = line.indexOf("AT3");
                        iAT4_IndexOf    = line.indexOf("AT4");
                        iAT5_IndexOf    = line.indexOf("AT5");
                        iAT6_IndexOf    = line.indexOf("AT6");
                        iAT7_IndexOf    = line.indexOf("AT7");
                        iAT8_IndexOf    = line.indexOf("AT8");

                        if (iAT1_IndexOf > 0)
                        {
                            iATx_Cut = iAT1_IndexOf - iAT1_IndexOf + iATx_Length;
                        }
                        if (iAT2_IndexOf > 0)
                        {
                            iATx_Cut = iAT2_IndexOf - iAT1_IndexOf + iATx_Length;
                        }
                        if (iAT3_IndexOf > 0)
                        {
                            iATx_Cut = iAT3_IndexOf - iAT1_IndexOf + iATx_Length;
                        }
                        if (iAT4_IndexOf > 0)
                        {
                            iATx_Cut = iAT4_IndexOf - iAT1_IndexOf + iATx_Length;
                        }
                        if (iAT5_IndexOf > 0)
                        {
                            iATx_Cut = iAT5_IndexOf - iAT1_IndexOf + iATx_Length;
                        }
                        if (iAT6_IndexOf > 0)
                        {
                            iATx_Cut = iAT6_IndexOf - iAT1_IndexOf + iATx_Length;
                        }
                        if (iAT7_IndexOf > 0)
                        {
                            iATx_Cut = iAT7_IndexOf - iAT1_IndexOf + iATx_Length;
                        }
                        if (iAT8_IndexOf > 0)
                        {
                            iATx_Cut = iAT8_IndexOf - iAT1_IndexOf + iATx_Length;
                        }

//                        logIt(fDebug, iDEBUG, false, "Found SOD record in ["+sConcat+"] AT1=["+iAT1_IndexOf+"] AT2=["+iAT2_IndexOf+"] AT3=["+iAT3_IndexOf+"] AT4=["+iAT4_IndexOf
//                                                                                    +"] AT5=["+iAT5_IndexOf+"] AT6=["+iAT6_IndexOf+"] AT7=["+iAT7_IndexOf+"] AT8=["+iAT8_IndexOf
//                                                                                    +"] Length=["+iATx_Cut+"]");
                        if (iAT1_IndexOf > 0)
                        {
                            lineHold = line.substring(0,iAT1_IndexOf)+line.substring(iAT1_IndexOf+iATx_Cut,iLength);
                            line = lineHold;                                                // Rip out the AT elements and continue processing...
                            logIt(fDebug, iDEBUG, false, "Removed ATx elements for length of "+iATx_Cut+" characters");
//                            logIt(fDebug, iDEBUG, false, "Old line=["+line+"]");
//                            logIt(fDebug, iDEBUG, false, "New line=["+lineHold+"]");
                        }
//                        continue;
                    }

                    getMDS(line);   //  Fields making up the Mandatory Data Section.
                    getOC1(line);   //  Fields making up the OC1 element.
                    getGDx(line);   //  Fields making up the GDx element.	// 03/24/2015  ras
                    getGF1(line);   //  Fields making up the GF1 element.
                    getMW1(line);   //  Fields making up the MW1 element.
                    getMW2(line);   //  Fields making up the MW2 element.
                    getMW3(line);   //  Fields making up the MW3 element.
                    getMW4(line);   //  Fields making up the MW3 element.       // 06/21/2012  ras
                    getAY1(line);   //  Fields making up the AY1 element.
                    getMA1(line);   //  Fields making up the MA1 element.
                    sMaxTemp        = "***";
                    sMinTemp        = "***";
                    getKA1(line);   //  Fields making up the KA1 element.
                    getKA2(line);   //  Fields making up the KA2 element.
                    sPcp01          = "*****";
                    sPcp01t         = " ";
                    sPcp06          = "*****";
                    sPcp06t         = " ";
                    sPcp24          = "*****";
                    sPcp24t         = " ";
                    sPcp12          = "*****";
                    sPcp12t         = " ";
                    getAA1(line);   //  Fields making up the AA1 element.
                    getAA2(line);   //  Fields making up the AA2 element.
                    getAA3(line);   //  Fields making up the AA3 element.
                    getAA4(line);   //  Fields making up the AA4 element.
                    getAJ1(line);   //  Fields making up the AJ1 element.
                    getAW1(line);   //  Fields making up the AW1 element.       // 06/06/2012  ras
                    getAW2(line);   //  Fields making up the AW2 element.       // 06/06/2012  ras
                    getAW3(line);   //  Fields making up the AW3 element.       // 06/06/2012  ras
                    getAW4(line);   //  Fields making up the AW4 element.       // 06/06/2012  ras

// Begin formatting output record..............................................................

// Post-processing format changes
                    if ( sCDS_Wban.equals("99999") )    // Show WBAN=99999 as missing "*****" in output file
                    {
                        sCDS_Wban   = "*****";
                    }
// Build Control Data Section
                    sControlSection = sCDS_ID+" "+sCDS_Wban+" "+sCDS_Year+sCDS_Month+sCDS_Day+sCDS_Hour+sCDS_Minute;

// Sort Present Weather elements
                    sWW1234 = new String[] {sMW1_Ww,sMW2_Ww,sMW3_Ww,sMW4_Ww};
                    Arrays.sort(sWW1234);

// Sort Present Weather (Automated) elements
                    sAW1234 = new String[] {sAW1_Zz,sAW2_Zz,sAW3_Zz,sAW4_Zz};
                    Arrays.sort(sAW1234);

// Build Mandatory Data Section + the rest of the record
                    sMandatorySection = sMDS_Dir+" "+sMDS_Spd+" "+sOC1_Gus+" "+sMDS_Clg
                        +" "+sGF1_Skc+" "+sGF1_Low+" "+sGF1_Med+" "+sGF1_Hi+" "+sMDS_Vsb
                        +" "+sWW1234[3]+" "+sWW1234[2]+" "+sWW1234[1]+" "+sWW1234[0]
                        +" "+sAW1234[3]+" "+sAW1234[2]+" "+sAW1234[1]+" "+sAW1234[0]+" "+sAY1_Pw
                        +" "+sMDS_Temp+" "+sMDS_Dewp+" "+sMDS_Slp+" "+sMA1_Alt+" "+sMA1_Stp
                        +" "+sMaxTemp+" "+sMinTemp+" "+sPcp01+sPcp01t+sPcp06+sPcp06t+sPcp24+sPcp24t+sPcp12+sPcp12t
                        +sAJ1_Sd;

                    sOutputRecord = sControlSection+" "+sMandatorySection;  // Put it all together
                    fFixedWriter.write(sOutputRecord+"\n");                 // Write out the record

                }  // while read

            }
            catch (IOException ex) {
                System.err.println(sProgramName+": IOException 2. Error=[" + ex.getMessage()+"]");
                System.err.println(sProgramName+": Stack trace follows:");
                ex.printStackTrace();
                System.exit(2);
            }

            fInReader.close();
            fFixedWriter.flush();
            fFixedWriter.close();

        } catch (Exception e) {                                                               //Catch exception if any
            sMessage=sProgramName+": Unspecified Exception 1. Error=[" + e.getMessage()+"]";
            bStdErr=true;
            logIt(fDebug, iPROD, false, sMessage);         // Append output to log.
            System.err.println(sProgramName+": Stack trace follows:");
            e.printStackTrace();
            System.exit(1);
        }

        logIt(fDebug, iDEBUG, false, "Processed "+iCounter+" records");
        logIt(fDebug, iDEBUG, false, "Done.");

    }   // End of main()

//=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
// formatInt - Right-justifies an int.
//=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
    public static String formatInt(int i, int len)
    {
        final String blanks = "                 ";
        String s = Integer.toString(i);
        if (s.length() < len)
            s = blanks.substring(0, len - s.length()) + s;
        return s;
    }


//=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
// formatFloat - Right-justifies a float.
//=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
    public static String formatFloat(float i, int len)
    {
        final String blanks = "                 ";
        String s = Float.toString(i);
        if (s.length() < len)
            s = blanks.substring(0, len - s.length()) + s;
        return s;
    }


//=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
// getCDS - Get CDS section and format its output.
//=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
    public static void getCDS(String p_sRecd)
    {
        //  Extract fields making up the Control Data Section.
        sCDS            = p_sRecd.substring(0,60);
        sCDS_Fill1      = p_sRecd.substring(0,4);
        sCDS_ID         = p_sRecd.substring(4,10);
        sCDS_Wban       = p_sRecd.substring(10,15);
        sCDS_Year       = p_sRecd.substring(15,19);
        sCDS_Month      = p_sRecd.substring(19,21);
        sCDS_Day        = p_sRecd.substring(21,23);
        sCDS_Hour       = p_sRecd.substring(23,25);
        sCDS_Minute     = p_sRecd.substring(25,27);
        sCDS_Source     = p_sRecd.substring(27,28);
        sCDS_Fill2      = p_sRecd.substring(28,41);
        sCDS_Type       = p_sRecd.substring(41,45);
        sCDS_Fill3      = p_sRecd.substring(45,60);
    }  // End of getCDS


//=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
// getMDS - Get MDS section and format its output.
//=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
    public static void getMDS(String p_sRecd)
    {
        //  Extract fields making up the Mandatory Data Section.
        sMDS            = p_sRecd.substring(60,105);
        sMDS_Dir        = p_sRecd.substring(60,63);
        sMDS_DirQ       = p_sRecd.substring(63,64);
        sMDS_DirType    = p_sRecd.substring(64,65);
        sMDS_Spd        = p_sRecd.substring(65,69);
        sMDS_Fill2      = p_sRecd.substring(69,70);
        sMDS_Clg        = p_sRecd.substring(70,75);
        sMDS_Fill3      = p_sRecd.substring(75,78);
        sMDS_Vsb        = p_sRecd.substring(78,84);
        sMDS_Fill4      = p_sRecd.substring(84,87);
        sMDS_TempSign   = p_sRecd.substring(87,88);
        sMDS_Temp       = p_sRecd.substring(88,92);
        sMDS_Fill5      = p_sRecd.substring(92,93);
        sMDS_DewpSign   = p_sRecd.substring(93,94);
        sMDS_Dewp       = p_sRecd.substring(94,98);
        sMDS_Fill6      = p_sRecd.substring(98,99);
        sMDS_Slp        = p_sRecd.substring(99,104);
        sMDS_Fill7      = p_sRecd.substring(104,105);

        if(sMDS_Dir.equals("999"))
        {
            sMDS_Dir = "***";
        }

        if(sMDS_DirType.equals("V"))                        // 06/21/2012  ras
        {
            sMDS_Dir = "990";
        }

//        logIt(fDebug, iDEBUG, false, "sInFileName=["+sInFileName+"] DateTime=["+sConcat+"] sMDS_Dir=["+sMDS_Dir+"] sMDS_DirQ=["+sMDS_DirQ+"] sMDS_DirType=["+sMDS_DirType+"]");     // temporary - ras

        if(sMDS_Spd.equals("9999"))
        {
            sMDS_Spd = "***";
        }
        else
        {
//                      System.out.println("sMDS=["+sMDS+"] Spd=["+sMDS_Spd+"]");
          iWork     = Integer.parseInt(sMDS_Spd);                   // Convert to integer
//                      System.out.println("iWork=["+iWork+"]");
          iWork     = (int)(((float)iWork / 10.0) * 2.237 + .5);    // Convert Meters Per Second to Miles Per Hour
//                      System.out.println("iWork=["+iWork+"]");
//                      sMDS_Spd  = fmt3.format(iWork);
          sMDS_Spd  = formatInt(iWork,3);
//                      System.out.println("Spd=["+sMDS_Spd+"]");
//          logIt(fDebug, iDEBUG, false, "sInFileName=["+sInFileName+"] DateTime=["+sConcat+"] sMDS_Spd=["+sMDS_Spd+"]");     // temporary - ras
        }

        if(sMDS_Clg.equals("99999"))
        {
            sMDS_Clg = "***";
        }
        else
        {
            try
            {
                iWork     = Integer.parseInt(sMDS_Clg);                 // Convert to integer
            }
            catch (Exception e)
            {
                logIt(fDebug, iDEBUG, false, "sInFileName=["+sInFileName+"] DateTime=["+sConcat+"] sMDS_Clg value could not be converted to integer=["+sMDS_Clg+"]");
                sMDS_Clg   = "***";                                     // Data error.  Set to missing.
            }
            if( ! sMDS_Clg.equals("***") )
            {
                iWork     = (int)(((float)iWork * 3.281) / 100.0 + .5);   // Convert Meters to Hundreds of Feet
                sMDS_Clg  = formatInt(iWork,3);
//                logIt(fDebug, iDEBUG, false, "sInFileName=["+sInFileName+"] DateTime=["+sConcat+"] sMDS_Clg=["+sMDS_Clg+"]");     // temporary - ras
            }
        }

        if(sMDS_Vsb.equals("999999"))
        {
            sMDS_Vsb = "****";
        }
        else
        {
            fWork     = Float.parseFloat(sMDS_Vsb);                 // Convert to floating point
            fWork     = ((float)(fWork * (float) 0.000625));                // Convert Meters to Miles using CDO's value
//            fWork     = ((float)(fWork * (float) 0.000621371192237334));    // Convert Meters to Miles
            fWorkSave = fWork;                                      // Save this value for possible display
            if (fWork > 99.9)
            {
               fWork = (float)99.0;                                 // Set to value that will fit
            }

            if (fWork == (float)10.058125)                          // Match CDO       2011-04-28  ras
            {
               logIt(fDebug, iDEBUG, false, "sInFileName=["+sInFileName+"] DateTime=["+sConcat+"] sMDS_Vsb value rounded to 10 miles");
               fWork = (float)10.0;
            }
            sMDS_Vsb = fmt4_1.format(fWork);
            sMDS_Vsb = String.format("%4s",sMDS_Vsb);
        }

        if(sMDS_Temp.equals("9999"))
        {
            sMDS_Temp = "****";
        }
        else
        {
//                        System.out.println(sMDS_Temp);
            iWork     = Integer.parseInt(sMDS_Temp);     // Convert to integer
            if (sMDS_TempSign.equals("-"))
            {
                iWork*=-1;
            }
            if(iWork < -178)
            {
              iWork = (int)(((float)iWork / 10.0) * 1.8 + 32.0 - .5);  // Handle temps below 0F
            }
            else
            {
              iWork = (int)(((float)iWork / 10.0) * 1.8 + 32.0 + .5);
            }
            sMDS_Temp = formatInt(iWork,4);
//                        System.out.println(sMDS_Temp);
        }

        if(sMDS_Dewp.equals("9999"))
        {
            sMDS_Dewp = "****";
        }
        else
        {
//                        System.out.println(sMDS_Dewp);
            iWork     = Integer.parseInt(sMDS_Dewp);     // Convert to integer
            if (sMDS_DewpSign.equals("-"))
            {
                iWork*=-1;
            }
            if(iWork < -178)
            {
              iWork = (int)(((float)iWork / 10.0) * 1.8 + 32.0 - .5);  // Handle temps below 0F
            }
            else
            {
              iWork = (int)(((float)iWork / 10.0) * 1.8 + 32.0 + .5);
            }
            sMDS_Dewp = formatInt(iWork,4);
//                        System.out.println(sMDS_Dewp);
        }

        if(sMDS_Slp.equals("99999"))
        {
            sMDS_Slp = "******";
        }
        else
        {
            fWork     = Float.parseFloat(sMDS_Slp);                 // Convert to floating point
            fWork     = ((float)(fWork / 10.0));                    // Convert convert Hectopascals to Millibars
            sMDS_Slp  = fmt6_1.format(fWork);
            sMDS_Slp = String.format("%6s",sMDS_Slp);
        }
    }  // End of getMDS


//=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
// getGDx - Get highest GDx element (can be 1 thru 6) and format its output.
//=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
    public static void getGDx(String p_sRecd)
    {
        int iGDx_Looper = 6;
        sGDx            = "";
        sGDx_Cov1       = "";
        sGDx_Cov2       = "";
        iGDx_IndexOf 	= 0;
        sGDx_Skc        = "***";

    while ( iGDx_Looper > 0 )
    {
        iGDx_IndexOf = p_sRecd.indexOf("GD"+Integer.toString(iGDx_Looper));

        if ( (iGDx_IndexOf >= 0) && (iGDx_IndexOf < iREM_IndexOf) )
        {
//     	   logIt(fDebug, iDEBUG, false, "GD"+Integer.toString(iGDx_Looper)+" found.");
           iGDx_Looper = -1;
           continue;
        }
        iGDx_Looper--;
    }

    if ( (iGDx_IndexOf >= 0) && (iGDx_IndexOf < iREM_IndexOf) )
        {
            sGDx        = p_sRecd.substring(iGDx_IndexOf,iGDx_IndexOf+iGDx_Length);
            sGDx_Cov1   = sGDx.substring(3,4);
            sGDx_Cov2   = sGDx.substring(4,6);

            try
            {
                iWork       = Integer.parseInt(sGDx_Cov1);   // Convert to integer
            }
            catch (Exception e)
            {
                logIt(fDebug, iDEBUG, false, "sInFileName=["+sInFileName+"] DateTime=["+sConcat+"] sGDx_Cov1 value could not be converted to integer=["+sGDx_Cov1+"]");
                iWork = 999;
                sGDx_Skc   = "***";                                     // Data error.  Set to missing.
            }

            if( iWork < 9 )
            {
                switch (iWork)
                {
                   case 0:  sGDx_Skc = "CLR";
                			break;
                   case 1:  sGDx_Skc = "FEW";
                            break;
                   case 2:  sGDx_Skc = "SCT";
                   			break;
                   case 3:  sGDx_Skc = "BKN";
                   			break;
                   case 4:  sGDx_Skc = "OVC";
                   			break;
                   case 5:  sGDx_Skc = "OBS";
                   			break;
                   case 6:  sGDx_Skc = "POB";
                   			break;
                   default: sGDx_Skc = "***";
          					break;
                }
            }
            else
            {
                try
                {
                    iWork       = Integer.parseInt(sGDx_Cov2);   // Convert to integer
                }
                catch (Exception e)
                {
                    logIt(fDebug, iDEBUG, false, "sInFileName=["+sInFileName+"] DateTime=["+sConcat+"] sGDx_Cov2 value could not be converted to integer=["+sGDx_Cov2+"]");
                    iWork = 999;
                    sGDx_Skc   = "***";                                     // Data error.  Set to missing.
                }

                switch (iWork)
                {
                   case 0:  sGDx_Skc = "CLR";
                			break;
                   case 1:
                   case 2:  sGDx_Skc = "FEW";
                   			break;
                   case 3:
                   case 4:
                   case 11:
                   case 12:
                   case 13: sGDx_Skc = "SCT";
                   			break;
                   case 5:
                   case 6:
                   case 7:
                   case 14:
                   case 15:
                   case 16: sGDx_Skc = "BKN";
                   			break;
                   case 8:
                   case 17:
                   case 18:
                   case 19: sGDx_Skc = "OVC";
                   			break;
                   case 9:
                   case 10: sGDx_Skc = "POB";
                   			break;
                   default: sGDx_Skc = "***";
          					break;
                }

            }
        }

    }  // End of getGDx


//=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
// getOC1 - Get OC1 element and format its output.
//=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
    public static void getOC1(String p_sRecd)
    {
        sOC1            = "";
        sOC1_Fill1      = "";
        sOC1_Gus        = "***";
        sOC1_Fill2      = "";
        iOC1_IndexOf    = p_sRecd.indexOf("OC1");
        if ( (iOC1_IndexOf >= 0) && (iOC1_IndexOf < iREM_IndexOf) )
        {
            sOC1        = p_sRecd.substring(iOC1_IndexOf,iOC1_IndexOf+iOC1_Length);
            sOC1_Fill1  = sOC1.substring(1,3);  // 3
            sOC1_Gus    = sOC1.substring(3,7);  // 4
            sOC1_Fill2  = sOC1.substring(7,8);  // 1

            if(sOC1_Gus.equals("9999"))                             // 06/06/2012  ras
            {
                sOC1_Gus    = "***";
//                logIt(fDebug, iDEBUG, false, "sInFileName=["+sInFileName+"] DateTime=["+sConcat+"] sOC1_Gus missing=["+sOC1_Gus+"]");     // temporary - ras
            }
            else
            {
                try
                {
                    iWork   = Integer.parseInt(sOC1_Gus);                   // Convert to integer
                }
                catch (Exception e)
                {
                    logIt(fDebug, iDEBUG, false, "sInFileName=["+sInFileName+"] DateTime=["+sConcat+"] sOC1_Gus value could not be converted to integer=["+sOC1_Gus+"]");
                    sOC1_Gus = "***";             // Data error.  Set to missing.
                }
                if( ! sOC1_Gus.equals("***") )
                {
                    iWork       = (int)(((float)iWork / 10.0) * 2.237 + .5);    // Convert Meters Per Second to Miles Per Hour
                    sOC1_Gus    = formatInt(iWork,3);
//                    logIt(fDebug, iDEBUG, false, "sInFileName=["+sInFileName+"] DateTime=["+sConcat+"] sOC1_Gus=["+sOC1_Gus+"]");     // temporary - ras
                }
            }
        }
    }  // End of getOC1


//=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
// getGF1 - Get GF1 element and format its output.
//=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
    public static void getGF1(String p_sRecd)
    {
        sGF1            = "";
        sGF1_Fill1      = "";
        sGF1_Skc        = "***";
        sGF1_Fill2      = "";
        sGF1_Low        = "*";
        sGF1_Fill3      = "";
        sGF1_Med        = "*";
        sGF1_Fill4      = "";
        sGF1_Hi         = "*";
        sGF1_Fill5      = "";
        iGF1_IndexOf    = p_sRecd.indexOf("GF1");
        if ( (iGF1_IndexOf >= 0) && (iGF1_IndexOf < iREM_IndexOf) )
        {
            sGF1        = p_sRecd.substring(iGF1_IndexOf,iGF1_IndexOf+iGF1_Length);
            sGF1_Fill1  = sGF1.substring(1,3);
            sGF1_Skc    = sGF1.substring(3,5);
            sGF1_Fill2  = sGF1.substring(5,11);
            sGF1_Low    = sGF1.substring(11,13);
            sGF1_Fill3  = sGF1.substring(13,20);
            sGF1_Med    = sGF1.substring(20,22);
            sGF1_Fill4  = sGF1.substring(22,23);
            sGF1_Hi     = sGF1.substring(23,25);
            sGF1_Fill5  = sGF1.substring(25,26);
         }
         else					// Use GDx info when GF1 is missing			// 03/24/2015  ras
         {
        	 if ( iGDx_IndexOf > 0 )
        	 {
        		 logIt(fDebug, iDEBUG, false, "GDx found. Using GDx in place of GF1 info.");
                 sGF1_Skc    = sGDx_Skc;
                 sGF1_Low    = "*";
                 sGF1_Med    = "*";
                 sGF1_Hi     = "*";
        	 }
         }

        if ( (iGF1_IndexOf >= 0) && (iGF1_IndexOf < iREM_IndexOf) )
        {
            if(sGF1_Skc.equals("99"))
            {
                sGF1_Skc    = "***";
            }
            else
            {
//                            System.out.println("DateTime=["+sConcat+"] GF1=["+sGF1+"]  Skc=["+sGF1_Skc+"]");
                try
                {
                    iWork       = Integer.parseInt(sGF1_Skc);   // Convert to integer
                }
                catch (Exception e)
                {
                    logIt(fDebug, iDEBUG, false, "sInFileName=["+sInFileName+"] DateTime=["+sConcat+"] sGF1_Skc value could not be converted to integer=["+sGF1_Skc+"]");
                    sGF1_Skc   = "***";                                     // Data error.  Set to missing.
                }
                if( ! sGF1_Skc.equals("***") )
                {
                    if(iWork == 0)                          { sGF1_Skc = "CLR"; }
                    else { if((iWork >= 1) && (iWork <= 4)) { sGF1_Skc = "SCT"; }
                    else { if((iWork >= 5) && (iWork <= 7)) { sGF1_Skc = "BKN"; }
                    else { if(iWork == 8)                   { sGF1_Skc = "OVC"; }
                    else { if(iWork == 9)                   { sGF1_Skc = "OBS"; }
                    else { if(iWork == 10)                  { sGF1_Skc = "POB"; }}}}}}
                }
            }
            if(sGF1_Low.equals("99"))       // Low cloud type
            {
              sGF1_Low = "*";
            }
            else
            {
                sGF1_Low = sGF1_Low.substring(1,2);
            }

            if(sGF1_Med.equals("99"))       // Med cloud type
            {
              sGF1_Med = "*";
            }
            else
            {
                sGF1_Med = sGF1_Med.substring(1,2);
            }

            if(sGF1_Hi.equals("99"))        // High cloud type
            {
              sGF1_Hi = "*";
            }
            else
            {
                sGF1_Hi = sGF1_Hi.substring(1,2);
            }
        }
    }  // End of getGF1


//=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
// getMW1 - Get MW1 element and format its output.
//=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
    public static void getMW1(String p_sRecd)
    {
        sMW1            = "";
        sMW1_Fill1      = "";
        sMW1_Ww         = "**";
        sMW1_Fill2      = "";
        iMW1_IndexOf    = p_sRecd.indexOf("MW1");
        if ( (iMW1_IndexOf >= 0) && (iMW1_IndexOf < iREM_IndexOf) )
        {
            sMW1        = p_sRecd.substring(iMW1_IndexOf,iMW1_IndexOf+iMW1_Length);
            sMW1_Fill1  = sMW1.substring(1,3);  // 3
            sMW1_Ww     = sMW1.substring(3,5);  // 2
            sMW1_Fill2  = sMW1.substring(5,6);  // 1
//                        System.out.println("MW1=["+sMW1+"] Ww=["+sMW1_Ww+"]");
        }
    }  // End of getMW1


//=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
// getMW2 - Get MW2 element and format its output.
//=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
    public static void getMW2(String p_sRecd)
    {
        sMW2            = "";
        sMW2_Fill1      = "";
        sMW2_Ww         = "**";
        sMW2_Fill2      = "";
        iMW2_IndexOf    = p_sRecd.indexOf("MW2");
        if ( (iMW2_IndexOf >= 0) && (iMW2_IndexOf < iREM_IndexOf) )
        {
            sMW2        = p_sRecd.substring(iMW2_IndexOf,iMW2_IndexOf+iMW2_Length);
            sMW2_Fill1  = sMW2.substring(1,3);  // 3
            sMW2_Ww     = sMW2.substring(3,5);  // 2
            sMW2_Fill2  = sMW2.substring(5,6);  // 1
//                        System.out.println("MW2=["+sMW2+"] Ww=["+sMW2_Ww+"]");
        }
    }  // End of getMW2


//=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
// getMW3 - Get MW3 element and format its output.
//=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
    public static void getMW3(String p_sRecd)
    {
        sMW3            = "";
        sMW3_Fill1      = "";
        sMW3_Ww         = "**";
        sMW3_Fill2      = "";
        iMW3_IndexOf    = p_sRecd.indexOf("MW3");
        if ( (iMW3_IndexOf >= 0) && (iMW3_IndexOf < iREM_IndexOf) )
        {
            sMW3        = p_sRecd.substring(iMW3_IndexOf,iMW3_IndexOf+iMW3_Length);
            sMW3_Fill1  = sMW3.substring(1,3);  // 3
            sMW3_Ww     = sMW3.substring(3,5);  // 2
            sMW3_Fill2  = sMW3.substring(5,6);  // 1
//                        System.out.println("MW3=["+sMW3+"] Ww=["+sMW3_Ww+"]");
        }
    }  // End of getMW3


//=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
// getMW4 - Get MW4 element and format its output.
//=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
    public static void getMW4(String p_sRecd)
    {
        sMW4            = "";
        sMW4_Fill1      = "";
        sMW4_Ww         = "**";
        sMW4_Fill2      = "";
        iMW4_IndexOf    = p_sRecd.indexOf("MW4");
        if ( (iMW4_IndexOf >= 0) && (iMW4_IndexOf < iREM_IndexOf) )
        {
            sMW4        = p_sRecd.substring(iMW4_IndexOf,iMW4_IndexOf+iMW4_Length);
            sMW4_Fill1  = sMW4.substring(1,3);  // 3
            sMW4_Ww     = sMW4.substring(3,5);  // 2
            sMW4_Fill2  = sMW4.substring(5,6);  // 1
//            logIt(fDebug, iDEBUG, false, "sInFileName=["+sInFileName+"] DateTime=["+sConcat+"] sMW4_Ww=["+sMW4_Ww+"]");     // temporary - ras
        }
    }  // End of getMW4


//=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
// getAY1 - Get AY1 element and format its output.
//=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
    public static void getAY1(String p_sRecd)
    {
        sAY1            = "";
        sAY1_Fill1      = "";
        sAY1_Pw         = "*";
        sAY1_Fill2      = "";
        iAY1_IndexOf    = p_sRecd.indexOf("AY1");
        if ( (iAY1_IndexOf >= 0) && (iAY1_IndexOf < iREM_IndexOf) )
        {
            sAY1        = p_sRecd.substring(iAY1_IndexOf,iAY1_IndexOf+iAY1_Length);
            sAY1_Fill1  = sAY1.substring(1,3);  // 3
            sAY1_Pw     = sAY1.substring(3,4);  // 1
            sAY1_Fill2  = sAY1.substring(4,8);  // 4
//                        System.out.println("AY1=["+sAY1+"] Pw=["+sAY1_Pw+"]");
        }
    }  // End of getAY1


//=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
// getMA1 - Get MA1 element and format its output.
//=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
    public static void getMA1(String p_sRecd)
    {
        sMA1            = "";
        sMA1_Fill1      = "";
        sMA1_Alt        = "*****";
        sMA1_Fill2      = "";
        sMA1_Stp        = "******";
        sMA1_Fill3      = "";
        iMA1_IndexOf    = p_sRecd.indexOf("MA1");
        if ( (iMA1_IndexOf >= 0) && (iMA1_IndexOf < iREM_IndexOf) )
        {
            sMA1        = p_sRecd.substring(iMA1_IndexOf,iMA1_IndexOf+iMA1_Length);
            sMA1_Fill1  = sMA1.substring(1,3);      // 3
            sMA1_Alt    = sMA1.substring(3,8);      // 5
            sMA1_Fill2  = sMA1.substring(8,9);      // 1
            sMA1_Stp    = sMA1.substring(9,14);     // 5
            sMA1_Fill3  = sMA1.substring(14,15);    // 1

            if(sMA1_Alt.equals("99999"))
            {
                sMA1_Alt    = "*****";
            }
            else
            {
                try
                {
                    fWork       = Float.parseFloat(sMA1_Alt);                 // Convert to floating point
                }
                catch (Exception e)
                {
                    logIt(fDebug, iDEBUG, false, "sInFileName=["+sInFileName+"] DateTime=["+sConcat+"] sMA1_Alt value could not be converted to floating point=["+sMA1_Alt+"]");
                    sMA1_Alt  = "*****";                                      // Data error.  Set to missing.
                }
                if( ! sMA1_Alt.equals("*****") )
                {
                    fWork       = ((float)((fWork / 10.0)*100.0) / (float) 3386.39);    // Convert Hectopascals to Inches
                    sMA1_Alt    = fmt5_2.format(fWork);
                    sMA1_Alt    = String.format("%5s",sMA1_Alt);
                }
            }
            if(sMA1_Stp.equals("99999"))
            {
                sMA1_Stp    = "******";
            }
            else
            {
                try
                {
                    fWork       = Float.parseFloat(sMA1_Stp);                 // Convert to floating point
                }
                catch (Exception e)
                {
                    logIt(fDebug, iDEBUG, false, "sInFileName=["+sInFileName+"] DateTime=["+sConcat+"] sMA1_Stp value could not be converted to floating point=["+sMA1_Stp+"]");
                    sMA1_Stp  = "******";                                     // Data error.  Set to missing.
                }
                if( ! sMA1_Stp.equals("******") )
                {
                    fWork     	= ((float)(fWork / 10.0));                    // Convert convert Hectopascals to Millibars
                    sMA1_Stp  	= fmt6_1.format(fWork);
                    sMA1_Stp    = String.format("%6s",sMA1_Stp);
                }
            }
        }
    }  // End of getMA1


//=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
// getKA1 - Get KA1 element and format its output.
//=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
    public static void getKA1(String p_sRecd)
    {
        sKA1            = "";
        sKA1_Fill1      = "";
        sKA1_Code       = "*";
        sKA1_Temp       = "***";
        sKA1_Fill2      = "";
        iKA1_IndexOf    = p_sRecd.indexOf("KA1");
        if ( (iKA1_IndexOf >= 0) && (iKA1_IndexOf < iREM_IndexOf) )
        {
            sKA1        = p_sRecd.substring(iKA1_IndexOf,iKA1_IndexOf+iKA1_Length);
            sKA1_Fill1  = sKA1.substring(1,6);   // 6
            sKA1_Code   = sKA1.substring(6,7);   // 1
            sKA1_Temp   = sKA1.substring(7,12);  // 5
            sKA1_Fill2  = sKA1.substring(12,13); // 1
//                        System.out.println("KA1=["+sKA1+"] Code=["+sKA1_Code+"] Temp=["+sKA1_Temp+"]");
            if(sKA1_Temp.equals("+9999"))
            {
                sKA1_Temp   = "***";
            }
            else
            {
                try
                {
                    fWork       = Float.parseFloat(sKA1_Temp);                  // Convert to floating point
                }
                catch (Exception e)
                {
                    logIt(fDebug, iDEBUG, false, "sInFileName=["+sInFileName+"] DateTime=["+sConcat+"] sKA1_Temp value could not be converted to floating point=["+sKA1_Temp+"]");
                    sKA1_Temp  = "***";                                         // Data error.  Set to missing.
                }
                if( ! sKA1_Temp.equals("***") )
                {
                    if(fWork < -178)
                    {
                        fWork = (int)(((float)fWork / 10.0) * 1.8 + 32.0 - .5);  // Handle temps below 0F
                    }
                    else
                    {
                        fWork = (int)(((float)fWork / 10.0) * 1.8 + 32.0 + .5);
                    }
                    if(sKA1_Code.equals("N"))
                    {
                        sMinTemp = formatInt( (int) fWork,3);
                    }
                    else
                    {
                        if(sKA1_Code.equals("M"))
                        {
                            sMaxTemp = formatInt( (int) fWork,3);
                        }
                    }
                }
            }
        }
    }  // End of getKA1


//=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
// getKA2 - Get KA2 element and format its output.
//=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
    public static void getKA2(String p_sRecd)
    {
        sKA2            = "";
        sKA2_Fill1      = "";
        sKA2_Code       = "*";
        sKA2_Temp       = "***";
        sKA2_Fill2      = "";
        iKA2_IndexOf    = p_sRecd.indexOf("KA2");
        if ( (iKA2_IndexOf >= 0) && (iKA2_IndexOf < iREM_IndexOf) )
        {
            sKA2        = p_sRecd.substring(iKA2_IndexOf,iKA2_IndexOf+iKA2_Length);
            sKA2_Fill1  = sKA2.substring(1,6);   // 6
            sKA2_Code   = sKA2.substring(6,7);   // 1
            sKA2_Temp   = sKA2.substring(7,12);  // 5
            sKA2_Fill2  = sKA2.substring(12,13); // 1
//                        System.out.println("KA2=["+sKA2+"] Code=["+sKA2_Code+"] Temp=["+sKA2_Temp+"]");
            if(sKA2_Temp.equals("+9999"))
            {
                sKA2_Temp   = "***";
            }
            else
            {
                try
                {
                    fWork       = Float.parseFloat(sKA2_Temp);                 // Convert to floating point
                }
                catch (Exception e)
                {
                    logIt(fDebug, iDEBUG, false, "sInFileName=["+sInFileName+"] DateTime=["+sConcat+"] sKA2_Temp value could not be converted to floating point=["+sKA2_Temp+"]");
                    sKA2_Temp = "***";             // Data error.  Set to missing.
                }
                if( ! sKA2_Temp.equals("***") )
                {
                    if(fWork < -178)
                    {
                        fWork = (int)(((float)fWork / 10.0) * 1.8 + 32.0 - .5);  // Handle temps below 0F
                    }
                    else
                    {
                        fWork = (int)(((float)fWork / 10.0) * 1.8 + 32.0 + .5);
                    }
                    if(sKA2_Code.equals("N"))
                    {
                        sMinTemp = formatInt( (int) fWork,3);
                    }
                    else
                    {
                        if(sKA2_Code.equals("M"))
                        {
                            sMaxTemp = formatInt( (int) fWork,3);
                        }
                    }
                }
            }
        }
    }  // End of getKA2


//=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
// getAA1 - Get AA1 element and format its output.
//=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
    public static void getAA1(String p_sRecd)
    {
        sAA1            = "";
        sAA1_Fill1      = "";
        sAA1_Hours      = "";
        sAA1_Pcp        = "";
        sAA1_Trace      = "";
        sAA1_Fill2      = "";
        iAA1_IndexOf    = p_sRecd.indexOf("AA1");
        if ( (iAA1_IndexOf >= 0) && (iAA1_IndexOf < iREM_IndexOf) )
        {
            sAA1        = p_sRecd.substring(iAA1_IndexOf,iAA1_IndexOf+iAA1_Length);
            sAA1_Fill1  = sAA1.substring(1,3);   // 3
            sAA1_Hours  = sAA1.substring(3,5);   // 2
            sAA1_Pcp    = sAA1.substring(5,9);   // 4
            sAA1_Trace  = sAA1.substring(9,10);  // 1
            sAA1_Fill2  = sAA1.substring(10,11); // 1
//                        System.out.println("AA1=["+sAA1+"] Pcp=["+sAA1_Pcp+"]");
            if( sAA1_Pcp.equals("9999") )
            {
                sAA1_Pcp = "*****";
            }
            else
            {
                try
                {
                    fWork         = Float.parseFloat(sAA1_Pcp);       // Convert to floating point
                }
                catch (Exception e)
                {
                    logIt(fDebug, iDEBUG, false, "sInFileName=["+sInFileName+"] DateTime=["+sConcat+"] AA1_Pcp value could not be converted to floating point=["+sAA1_Pcp+"]");
                    sAA1_Pcp = "*****";             // Data error.  Set to missing.
                }
                if( ! sAA1_Pcp.equals("*****") )
                {
                    setPcp(sAA1_Hours,sAA1_Trace);
                }
            }
        }
    }  // End of getAA1


//=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
// getAA2 - Get AA2 element and format its output.
//=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
    public static void getAA2(String p_sRecd)
    {
        sAA2            = "";
        sAA2_Fill1      = "";
        sAA2_Hours      = "";
        sAA2_Pcp        = "";
        sAA2_Trace      = "";
        sAA2_Fill2      = "";
        iAA2_IndexOf    = p_sRecd.indexOf("AA2");
        if ( (iAA2_IndexOf >= 0) && (iAA2_IndexOf < iREM_IndexOf) )
        {
//                        System.out.println("DateTime=["+sConcat+"] iAA2_IndexOf=["+iAA2_IndexOf+"] iAA2_Length=["+iAA2_Length+"] Line Length=["+iLength+"]");
            sAA2        = p_sRecd.substring(iAA2_IndexOf,iAA2_IndexOf+iAA2_Length);
            sAA2_Fill1  = sAA2.substring(1,3);   // 3
            sAA2_Hours  = sAA2.substring(3,5);   // 2
            sAA2_Pcp    = sAA2.substring(5,9);   // 4
            sAA2_Trace  = sAA2.substring(9,10);  // 1
            sAA2_Fill2  = sAA2.substring(10,11); // 1
//                        System.out.println("AA2=["+sAA2+"] Pcp=["+sAA2_Pcp+"]");
            if( sAA2_Pcp.equals("9999") )
            {
                sAA2_Pcp = "*****";
            }
            else
            {
                try
                {
                    fWork         = Float.parseFloat(sAA2_Pcp);       // Convert to floating point
                }
                catch (Exception e)
                {
                    logIt(fDebug, iDEBUG, false, "sInFileName=["+sInFileName+"] DateTime=["+sConcat+"] AA2_Pcp value could not be converted to floating point=["+sAA2_Pcp+"]");
                    sAA2_Pcp = "*****";             // Data error.  Set to missing.
                }
                if( ! sAA2_Pcp.equals("*****") )
                {
                    setPcp(sAA2_Hours,sAA2_Trace);
                }
            }
        }
    }  // End of getAA2


//=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
// getAA3 - Get AA3 element and format its output.
//=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
    public static void getAA3(String p_sRecd)
    {
        sAA3            = "";
        sAA3_Fill1      = "";
        sAA3_Hours      = "";
        sAA3_Pcp        = "";
        sAA3_Trace      = "";
        sAA3_Fill2      = "";
        iAA3_IndexOf    = p_sRecd.indexOf("AA3");
        if ( (iAA3_IndexOf >= 0) && (iAA3_IndexOf < iREM_IndexOf) )
        {
//                        System.out.println("DateTime=["+sConcat+"] iAA3_IndexOf=["+iAA3_IndexOf+"] iAA3_Length=["+iAA3_Length+"] Line Length=["+iLength+"]");
            sAA3        = p_sRecd.substring(iAA3_IndexOf,iAA3_IndexOf+iAA3_Length);
            sAA3_Fill1  = sAA3.substring(1,3);   // 3
            sAA3_Hours  = sAA3.substring(3,5);   // 2
            sAA3_Pcp    = sAA3.substring(5,9);   // 4
            sAA3_Trace  = sAA3.substring(9,10);  // 1
            sAA3_Fill2  = sAA3.substring(10,11); // 1
//                        System.out.println("AA3=["+sAA3+"] Pcp=["+sAA3_Pcp+"]");
            if( sAA3_Pcp.equals("9999") )
            {
                sAA3_Pcp = "*****";
            }
            else
            {
                try
                {
                    fWork         = Float.parseFloat(sAA3_Pcp);       // Convert to floating point
                }
                catch (Exception e)
                {
                    logIt(fDebug, iPROD, false, "sInFileName=["+sInFileName+"] DateTime=["+sConcat+"] AA3_Pcp value could not be converted to floating point=["+sAA3_Pcp+"]");
                    sAA3_Pcp = "*****";             // Data error.  Set to missing.
                }
                if( ! sAA3_Pcp.equals("*****") )
                {
                    setPcp(sAA3_Hours,sAA3_Trace);
                }
            }
        }
    }  // End of getAA3


//=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
// getAA4 - Get AA4 element and format its output.
//=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
    public static void getAA4(String p_sRecd)
    {
        sAA4            = "";
        sAA4_Fill1      = "";
        sAA4_Hours      = "";
        sAA4_Pcp        = "";
        sAA4_Trace      = "";
        sAA4_Fill2      = "";
        iAA4_IndexOf    = p_sRecd.indexOf("AA4");
        if ( (iAA4_IndexOf >= 0) && (iAA4_IndexOf < iREM_IndexOf) )
        {
//                        System.out.println("DateTime=["+sConcat+"] iAA4_IndexOf=["+iAA4_IndexOf+"] iAA4_Length=["+iAA4_Length+"] Line Length=["+iLength+"]");
            sAA4        = p_sRecd.substring(iAA4_IndexOf,iAA4_IndexOf+iAA4_Length);
            sAA4_Fill1  = sAA4.substring(1,3);   // 3
            sAA4_Hours  = sAA4.substring(3,5);   // 2
            sAA4_Pcp    = sAA4.substring(5,9);   // 4
            sAA4_Trace  = sAA4.substring(9,10);  // 1
            sAA4_Fill2  = sAA4.substring(10,11); // 1
//                        System.out.println("AA4=["+sAA4+"] Pcp=["+sAA4_Pcp+"]");
            if( sAA4_Pcp.equals("9999") )
            {
                sAA4_Pcp = "*****";
            }
            else
            {
                try
                {
                    fWork         = Float.parseFloat(sAA4_Pcp);       // Convert to floating point
                }
                catch (Exception e)
                {
                    logIt(fDebug, iDEBUG, false, "sInFileName=["+sInFileName+"] DateTime=["+sConcat+"] AA4_Pcp value could not be converted to floating point=["+sAA4_Pcp+"]");
                    sAA4_Pcp = "*****";             // Data error.  Set to missing.
                }
                if( ! sAA4_Pcp.equals("*****") )
                {
                    setPcp(sAA4_Hours,sAA4_Trace);
                }
            }
        }
    }  // End of getAA4


//=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
// setPcp - Take AA elements and set Precip values.
//=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
    public static void setPcp(String p_sHours, String p_sTrace)
    {
        fWork         = (fWork / (float) 10.0) * (float) .03937008;       // Convert precip depths from Millimeters to Inches
        if( p_sHours.equals("01") )
        {
          sPcp01      = fmt5_2.format(fWork);
          sPcp01      = String.format("%5s",sPcp01);
          if( p_sTrace.equals("2") )
          {
            sPcp01t = "T";
          }
        }
        else
        {
            if( p_sHours.equals("06") )
            {
                sPcp06      = fmt5_2.format(fWork);
                sPcp06      = String.format("%5s",sPcp06);
                if( p_sTrace.equals("2") )
                {
                    sPcp06t = "T";
                }
            }
            else
            {
                if( p_sHours.equals("24") )
                {
                    sPcp24      = fmt5_2.format(fWork);
                    sPcp24      = String.format("%5s",sPcp24);
                    if( p_sTrace.equals("2") )
                    {
                        sPcp24t = "T";
                    }
                }
                else
                {
                    sPcp12      = fmt5_2.format(fWork);
                    sPcp12      = String.format("%5s",sPcp12);
                    if( p_sTrace.equals("2") )
                    {
                        sPcp12t = "T";
                    }
                }
            }
        }
    }  // End of setPcp


//=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
// getAJ1 - Get AJ1 element and format its output.
//=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
    public static void getAJ1(String p_sRecd)
    {
        sAJ1            = "";
        sAJ1_Fill1      = "";
        sAJ1_Sd         = "**";
        sAJ1_Fill2      = "";
        iAJ1_IndexOf    = p_sRecd.indexOf("AJ1");
        if ( (iAJ1_IndexOf >= 0) && (iAJ1_IndexOf < iREM_IndexOf) )
        {
            sAJ1        = p_sRecd.substring(iAJ1_IndexOf,iAJ1_IndexOf+iAJ1_Length);
            sAJ1_Fill1  = sAJ1.substring(1,3);  // 3
            sAJ1_Sd     = sAJ1.substring(3,7);  // 4
            sAJ1_Fill2  = sAJ1.substring(7,17); // 10
//                        System.out.println("AJ1_Fill1=["+sAJ1_Fill1+"] Sd=["+sAJ1_Sd+"]");
            if( sAJ1_Sd.equals("9999") )
            {
                sAJ1_Sd         = "**";
            }
            else
            {
              try
              {
                  fWork = Float.parseFloat(sAJ1_Sd);       // Convert to floating point
              }
              catch (Exception e)
              {
                  logIt(fDebug, iDEBUG, false, "sInFileName=["+sInFileName+"] DateTime=["+sConcat+"] sAJ1_Sd value could not be converted to floating point=["+sAJ1_Sd+"]");
                  sAJ1_Sd   = "**";             // Data error.  Set to missing.
              }
              if( ! sAJ1_Sd.equals("**") )
              {
                  iWork     = (int) (fWork * (float) .3937008 + .5);       // Convert precip depths from Millimeters to Inches
                  sAJ1_Sd   = fmt02.format(iWork);
                  sAJ1_Sd   = String.format("%2s",sAJ1_Sd);
              }
            }
        }
    }  // End of getAJ1


//=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
// getAW1 - Get AW1 element and format its output.
//=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
    public static void getAW1(String p_sRecd)
    {
        sAW1            = "";
        sAW1_Fill1      = "";
        sAW1_Zz         = "**";
        sAW1_Fill2      = "";
        iAW1_IndexOf    = p_sRecd.indexOf("AW1");
        if ( (iAW1_IndexOf >= 0) && (iAW1_IndexOf < iREM_IndexOf) )
        {
            sAW1        = p_sRecd.substring(iAW1_IndexOf,iAW1_IndexOf+iAW1_Length);
            sAW1_Fill1  = sAW1.substring(1,3);  // 3
            sAW1_Zz     = sAW1.substring(3,5);  // 2
            sAW1_Fill2  = sAW1.substring(5,6);  // 1
//            logIt(fDebug, iDEBUG, false, "sInFileName=["+sInFileName+"] DateTime=["+sConcat+"] sAW1_Zz=["+sAW1_Zz+"]");     // temporary - ras
        }
    }  // End of getAW1


//=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
// getAW2 - Get AW2 element and format its output.
//=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
    public static void getAW2(String p_sRecd)
    {
        sAW2            = "";
        sAW2_Fill1      = "";
        sAW2_Zz         = "**";
        sAW2_Fill2      = "";
        iAW2_IndexOf    = p_sRecd.indexOf("AW2");
        if ( (iAW2_IndexOf >= 0) && (iAW2_IndexOf < iREM_IndexOf) )
        {
            sAW2        = p_sRecd.substring(iAW2_IndexOf,iAW2_IndexOf+iAW2_Length);
            sAW2_Fill1  = sAW2.substring(1,3);  // 3
            sAW2_Zz     = sAW2.substring(3,5);  // 2
            sAW2_Fill2  = sAW2.substring(5,6);  // 1
//            logIt(fDebug, iDEBUG, false, "sInFileName=["+sInFileName+"] DateTime=["+sConcat+"] sAW2_Zz=["+sAW2_Zz+"]");     // temporary - ras
        }
    }  // End of getAW2


//=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
// getAW3 - Get AW3 element and format its output.
//=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
    public static void getAW3(String p_sRecd)
    {
        sAW3            = "";
        sAW3_Fill1      = "";
        sAW3_Zz         = "**";
        sAW3_Fill2      = "";
        iAW3_IndexOf    = p_sRecd.indexOf("AW3");
        if ( (iAW3_IndexOf >= 0) && (iAW3_IndexOf < iREM_IndexOf) )
        {
            sAW3        = p_sRecd.substring(iAW3_IndexOf,iAW3_IndexOf+iAW3_Length);
            sAW3_Fill1  = sAW3.substring(1,3);  // 3
            sAW3_Zz     = sAW3.substring(3,5);  // 2
            sAW3_Fill2  = sAW3.substring(5,6);  // 1
//            logIt(fDebug, iDEBUG, false, "sInFileName=["+sInFileName+"] DateTime=["+sConcat+"] sAW3_Zz=["+sAW3_Zz+"]");     // temporary - ras
        }
    }  // End of getAW3


//=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
// getAW4 - Get AW4 element and format its output.
//=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
    public static void getAW4(String p_sRecd)
    {
        sAW4            = "";
        sAW4_Fill1      = "";
        sAW4_Zz         = "**";
        sAW4_Fill2      = "";
        iAW4_IndexOf    = p_sRecd.indexOf("AW4");
        if ( (iAW4_IndexOf >= 0) && (iAW4_IndexOf < iREM_IndexOf) )
        {
            sAW4        = p_sRecd.substring(iAW4_IndexOf,iAW4_IndexOf+iAW4_Length);
            sAW4_Fill1  = sAW4.substring(1,3);  // 3
            sAW4_Zz     = sAW4.substring(3,5);  // 2
            sAW4_Fill2  = sAW4.substring(5,6);  // 1
//          logIt(fDebug, iDEBUG, false, "sInFileName=["+sInFileName+"] DateTime=["+sConcat+"] sAW4_Zz=["+sAW4_Zz+"]");     // temporary - ras
        }
    }  // End of getAW4


//=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
// logIt - Append records to the log file.
//=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
    public static int logIt(FileOutputStream p_fDebug, int p_iLogLevel, boolean p_bFilter, String p_sIn)
    {
        int iRetCode=99;                                        // Set default return code to something crazy.
        String sMessageFormatted="";

        SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        Date now = new Date();
        sMessageFormatted=sProgramName+": "+format.format(now)+"_"+p_sIn;

        if (bStdErr)
        {
            System.err.println(sMessageFormatted);              // Error   mode will echo message to standard error
        }

        if (bVerbose)
        {
            System.out.println(sMessageFormatted);              // Verbose mode will echo message to screen
        }

        if (iLogLevel < p_iLogLevel)                            // 04/01/2009  ras
        {
            return 0;                                           // No logging for this
        }

        if (p_bFilter)                                          // 04/01/2009  ras
        {
            if  (p_sFilter1.equals("None"))                     // 04/01/2009  ras
            {
            }
            else
            {
                if  (sConcat.equals(p_sFilter1)  ||             // 04/01/2009  ras    // Life is good
                     sConcat.equals(p_sFilter2))
                {
                }
                else
                {
                    return 0;                                   // 04/01/2009  ras    // No logging for this
                }
            }
        }

        try {
            p_fDebug = new FileOutputStream (sDebugName+".debug", true);                // Append mode.
            new PrintStream(p_fDebug).println (format.format(now)+"_"+p_sIn);           // Write output to debug log.
            iRetCode=0;                                                                 // Good.
            p_fDebug.close();
        }
        catch (IOException e) {
            System.out.println("5. Unable to open debug log");
            System.err.println(sProgramName+": Stack trace follows:");
            e.printStackTrace();
            System.exit(5);
        }
        catch (Exception e) {
            iRetCode=6;                                                                 // An error occurred.
            System.err.println(sProgramName+": Unspecified Exception in logIt. Error=[" + e.getMessage()+"]");
            System.err.println(sProgramName+": Stack trace follows:");
            e.printStackTrace();
            System.exit(6);
        }
        return iRetCode;
    }  // End of logIt

}
