From pbear at ned.gsfc.nasa.gov  Wed Oct  1 14:24:15 2003
From: pbear at ned.gsfc.nasa.gov (pbear CVS)
Date: Wed Oct  1 13:24:18 2003
Subject: [Pangalactic-commits] fixed grid configuration;
	both configdbbrowser and configuregrid extend
	new class configuredisplay
Message-ID: <200310011724.h91HOFtY014278@ned.gsfc.nasa.gov>

Modified files:
PanGalactic/pangalactic/client/modules/psm/pgefgrid.py 1.56 1.57
PanGalactic/pangalactic/enterprise/workflow/workflowgrid.py 1.5 1.6
PanGalactic/pangalactic/utils/__init__.py 1.3 1.4
PanGalactic/pangalactic/utils/basegrid.py 1.10 1.11
PanGalactic/pangalactic/utils/configdbbrowser.py 1.3 1.4
PanGalactic/pangalactic/utils/dbbrowser.py 1.2 1.3
PanGalactic/pangalactic/utils/pgefdatatable.py 1.3 1.4
PanGalactic/pangalactic/utils/customizegrid.py 1.3 None

Log message:
fixed grid configuration; both configdbbrowser and configuregrid extend new class configuredisplay


Index: PanGalactic/pangalactic/utils/pgefdatatable.py
diff -u PanGalactic/pangalactic/utils/pgefdatatable.py:1.3 PanGalactic/pangalactic/utils/pgefdatatable.py:1.4
--- PanGalactic/pangalactic/utils/pgefdatatable.py:1.3	Wed Sep 24 12:03:13 2003
+++ PanGalactic/pangalactic/utils/pgefdatatable.py	Wed Oct  1 13:24:14 2003
@@ -23,6 +23,8 @@
     # required methods for the wxPyGridTableBase interface
 
     def GetDisplayMapping(self):
+        #print "pgefdatatable.getdisplaymapping"
+        #print self.display_mapping
         return self.display_mapping
 
     def GetNumberRows(self):
@@ -135,19 +137,26 @@
             return None
 
     def SetDisplayMapping(self, mapping):
+        #print "pgefdatatable.setdisplaymapping"
         if mapping:
             self.display_mapping = mapping
+            #print "display_mapping", self.display_mapping
             self.identifiers = [entry[0] for entry in self.display_mapping]
+            #print "mapping", mapping[0]
+            #print "identifiers", self.identifiers[0]
             #msg = wxGridTableMessage(self, wxGRIDTABLE_REQUEST_VIEW_GET_VALUES)
             #self.RefreshGrid()
             #self.GetView().ProcessTableMessage(msg)
             #print 'identifiers are: %s' % self.identifiers
         elif self._data:
+            #print "no mapping, table data"
             #self.identifiers = self._data[0].__dict__.keys()
             #self.display_mapping = zip(self.identifiers, self.identifiers)
 
             self.identifiers = [z[1].replace('self.','') for z in self._data[0]._gridmap]
             self.display_mapping = [(z[1].replace('self.',''), z[0]) for z in self._data[0]._gridmap]
+            #print "display_mapping", self.display_mapping
+            #print "identifiers", self.identifiers[0]
 
     def DeleteObject(self, ndx):
         if ndx:       

Index: PanGalactic/pangalactic/utils/dbbrowser.py
diff -u PanGalactic/pangalactic/utils/dbbrowser.py:1.2 PanGalactic/pangalactic/utils/dbbrowser.py:1.3
--- PanGalactic/pangalactic/utils/dbbrowser.py:1.2	Tue Sep 16 15:11:53 2003
+++ PanGalactic/pangalactic/utils/dbbrowser.py	Wed Oct  1 13:24:14 2003
@@ -66,7 +66,6 @@
         
         
     def ClearGrid(self):
-
         gridrows = self.grid.GetNumberRows()
         if gridrows > 0:
             self.grid.DeleteRows(0, gridrows)
@@ -137,7 +136,9 @@
         collection_name = self.GetRootitems().GetStringSelection()
         tmpsize = wxSize(750, 500)
         testframe = toolframe.toolFrame(self, -1, 'Config DB Browser', wxDefaultPosition, tmpsize)
-        testframe.mainpanel = configdbbrowser.ConfigDbBrowser(testframe, -1, dbroot = self.dbroot, collection_name = collection_name)
+        testframe.mainpanel = configdbbrowser.ConfigDbBrowser(testframe, -1,
+                                                              dbroot = self.dbroot,
+                                                              collection_name = collection_name)
         testframe.CentreOnParent()
         testframe.Show(true)
         

Index: PanGalactic/pangalactic/enterprise/workflow/workflowgrid.py
diff -u PanGalactic/pangalactic/enterprise/workflow/workflowgrid.py:1.5 PanGalactic/pangalactic/enterprise/workflow/workflowgrid.py:1.6
--- PanGalactic/pangalactic/enterprise/workflow/workflowgrid.py:1.5	Thu Aug 28 14:21:47 2003
+++ PanGalactic/pangalactic/enterprise/workflow/workflowgrid.py	Wed Oct  1 13:24:13 2003
@@ -9,8 +9,6 @@
 import mx.DateTime
 import pangalactic.utils.basegrid as basegrid
 import pangalactic.utils.pdfoptions as pdfoptions
-from pangalactic.utils.customizegrid import *
-
 
 # just a note for my benefit in case I have the same problem. --vwk
 #

Index: PanGalactic/pangalactic/client/modules/psm/pgefgrid.py
diff -u PanGalactic/pangalactic/client/modules/psm/pgefgrid.py:1.56 PanGalactic/pangalactic/client/modules/psm/pgefgrid.py:1.57
--- PanGalactic/pangalactic/client/modules/psm/pgefgrid.py:1.56	Wed Sep 24 16:02:13 2003
+++ PanGalactic/pangalactic/client/modules/psm/pgefgrid.py	Wed Oct  1 13:24:13 2003
@@ -5,7 +5,7 @@
 from wxPython.lib.gridmovers import wxGridColMover, EVT_GRID_COL_MOVE
 
 import pangalactic.enterprise.productmodelversion
-from pangalactic.utils.customizegrid import *
+from pangalactic.utils.configuregrid import *
 
 import quickcreate
 import os
@@ -46,117 +46,6 @@
     grid columns and to fill a row of data given the data in a list format"""
     def __init__(self, parent, id, savename = None, dbroot = None, intable = None):
         basegrid.BaseGrid.__init__(self, parent, id, savename, dbroot, intable)
-#        self.SetColLabelSize(48)
-#        self.AutoSizeColumns(true)
-
-#        if intable:
-#            self.table = intable
-#        else:
-#            self.table = pgefdatatable.PgefDataTable()
-#        self.SetTable(self.table, true)
-
-#        self.moveTo = None
-#        self.DropVariable = None
-#        self._displayed_objs = []
-#        self.allow_config_flag = 1
-#        self.already_showing_config = 0
-#        self.dbroot = dbroot
-#        self.savename = savename
-#        self.DisplayMapping = self.RetrieveDisplay()
-#        self.table.SetDisplayMapping(self.DisplayMapping)        
-
-#        evthandler = pgefevents.PgefDragDropHandler(self)            
-
-#        EVT_MOTION(self.GetGridWindow(), self.OnMove)
-#        EVT_MOTION(self.GetGridRowLabelWindow(), self.OnMove)
-#        EVT_GRID_COL_SIZE(self, self.OnColResize)
-#        EVT_GRID_CELL_LEFT_CLICK(self, self.OnLeftClick)
-#        EVT_GRID_LABEL_LEFT_CLICK(self, self.OnLeftClick)
-#        EVT_GRID_CELL_RIGHT_CLICK(self, self.OnRightDown)
-#        EVT_MENU(self, pdfoptions.ID_CREATEPDF_POPUP, self.DumpToPdf)
-#        EVT_MENU(self, ID_POPUP_CONFIG_GRID, self.ConfigGrid)
-#        EVT_MENU(self, ID_POPUP_CLEAR_SELECTION, self.OnClearSelection)
-
-#        self.PushEventHandler(evthandler)
-#        wxGridColMover(self)
-#        self.SetDefaultCellOverflow(false)
-#        self.FitInside()
-#        EVT_GRID_COL_MOVE(self,self.GetId(),self.OnColMove)
-#        EVT_MENU(self, ID_POPUP_QUICKCREATE, self.QuickCreate)
-
-
-    # Event method called when a column move needs to take place
-#    def OnColMove(self, evt):
-#        frm = evt.GetMoveColumn()       # Column being moved
-#        to = evt.GetBeforeColumn()      # Before which column to insert
-#        #print "oncolmove", frm, to
-#        self.GetTable().MoveColumn(frm, to)
-#        self.AutoSizeColumns()
-        
-##    def SetColumnAttr(self, typelist = None):
-##        if typelist == None:
-##            raise dataobjects.pgefexceptions.RequiredDataError, 'a column type list must be provided'
-##        column = 0
-        
-##        for columntype in typelist:
-##            attr = wxGridCellAttr()
-##            if columntype == 'bool':
-##                attr.SetEditor(wxGridCellBoolEditor())
-##                attr.SetReadOnly(false)
-
-##            elif columntype == 'image':
-##                attr.SetBackgroundColour(wxGREEN)
-###                attr.SetRenderer(MyCustomRenderer(self.gridimage))
-##                attr.SetReadOnly(true)
-                
-##            else:
-##                attr.SetEditor(wxGridCellTextEditor())             
-##                attr.SetReadOnly(true)
-
-##            self.SetColAttr(column, attr)
-            
-##            if columntype == 'bool':
-##                self.SetColFormatBool(column) 
-                
-##            column += 1
-            
-##    def OnLeftClick(self, event):
-##        if event.GetId() == self.GetId():
-##            temprow = event.GetRow()
-##            tempcol = event.GetCol()
-##            if temprow == wxNOT_FOUND:
-##                self.DropVariable = None
-##            #elif tempcol != 0:
-##                #self.DropVariable = None
-##            else:
-##                self.DropVariable = temprow
-                
-##            if event.GetCol() == 1:
-##                row = event.GetRow()
-##                col = event.GetCol()
-##                oldvalue = self.GetCellValue(row, col)
-##                if oldvalue:
-##                    self.SetCellValue(row, col, '')
-##                else:
-##                    self.SetCellValue(row, col, 'Y')
-##            event.Skip()
-
-##    def OnColResize(self, event):
-##        if event.GetId() == self.GetId():
-##            try:
-##                self.ForceRefresh()
-##            except:
-##                self.Refresh(true)
-            
-##    def OnMove(self, event):
-##        """Initiates the drag and drop operation if the control key is pressed"""
-##        if event.LeftIsDown() and self.DropVariable != None:
-##            self.StartDragOperation(self.DropVariable)
-##        else:
-##            event.Skip()
-            
-##    def OnClearSelection(self, event):
-##        self.ClearSelection()
             
     def OnRightDown(self, event):
         if event.GetId() == self.GetId():
@@ -176,183 +65,6 @@
             
             self.PopupMenuXY(menu, x, y)
             
-##    def StartDragOperation(self, selectedrow):
-##        """Handles the data encapsulation and packaging for the drag and drop"""
-
-##        if selectedrow < 0:
-##            return false
-
-##        itemid = self.GetObjectOid(selectedrow) 
-##        if itemid == '':
-##            return false
-        
-##        data = [None, itemid, "GRID", self.GetId()]
-##        datapickle = cPickle.dumps(data, 1)
-##        dragitem = wxCustomDataObject(wxCustomDataFormat("PGEF_Item"))
-##        dragitem.SetData(datapickle)
-##        dropSource = wxDropSource(self)
-##        dropSource.SetData(dragitem)
-##        result = dropSource.DoDragDrop(true)
-        
-##    def CanConfigDisplay(self):
-##        if self.table._data:
-##            return 1
-##        else:
-##            return None
-
-##    def ClearGrid(self):
-##        self.table.ClearTableBase()
-        
-##    def GetDataObj(self, ndx):
-##        return self.table._data[ndx]
-            
-##    def RefreshFromObjects(self):
-##        self.table.RefreshGrid()
-##        self.FitInside()
-
-##    def AddData(self, data):
-##        if isinstance(data, types.ListType):
-##            for obj in data:
-##                self.table.AddData(obj)
-##        else:
-##            self.table.AddData(data)
-##        self.AutoSizeColumns(true)
-##        self.FitInside()
-            
-
-##    def DefaultBackgroundColour(self):
-##        """Reset the grid background for all rows to the default colour."""
-##        nrows = self.GetNumberRows()
-##        self.BeginBatch()
-##        somecol = 0
-##        for row in range(nrows):
-##            #print "set bg colour for row: " + str(row)
-##            # get the attr for the wxAttrKind.Row (= 3)
-##            # GetAttr needs the type of attr to get, despite what the docs say
-##            if attr:
-##                attr.SetBackgroundColour(self.GetDefaultCellBackgroundColour())
-##                self.SetRowAttr(row, attr)
-##            found = true
-##        self.EndBatch()
-        
-        
-##    def ResetBackgroundColour(self, value):
-##        nrows = self.GetNumberRows()
-##        self.BeginBatch()
-##        for row in range(nrows):
-##            if self.GetObjectOid(row) == value:
-##                #print "set bg colour for row: " + str(row)
-##                # get the attr for the wxAttrKind.Row (= 3)
-##                # GetAttr needs the type of attr to get, despite what the docs say
-##                attr = self.GetTable().GetAttr(row, 0, 3)
-##                if attr:
-##                    attr.SetBackgroundColour(self.GetDefaultCellBackgroundColour())
-##                    self.SetRowAttr(row, attr)
-##                found = true
-
-##        self.EndBatch()           
-        
-        
-##    def DumpToPdf(self, event = None):
-##        gridrows = self.GetNumberRows()
-##        if gridrows <= 0:
-##            return
-##        dlg = pdfoptions.PDFOptions(self)
-##        dlg.Layout()
-##        result = dlg.ShowModal()
-##        if result == wxID_OK:
-##            filename = dlg.filename.GetValue()
-##            if not filename.endswith('.pdf'):
-##                filename += '.pdf'
-            
-##            if dlg.portrait.GetValue():
-##                page_orientation = 'portrait'
-##            else:
-##                page_orientation = 'landscape'
-                
-##            hide_gridlines = dlg.hide_gridlines.GetValue()
-            
-##            if dlg.table_or_list.GetValue():
-##                tabular = 0
-##            else:
-##                tabular = 1
-                
-##            title = dlg.pdftitle.GetValue()
-##            footer = dlg.footertext.GetValue()
-            
-##            temp = objectreport.ObjectReport(filename, 
-##                                             self.table._data,
-##                                             title,
-##                                             footer,
-##                                             orientation = page_orientation,
-##                                             tabular = tabular,
-##                                             hidegridlines = hide_gridlines)
-            
-##            temp.display_map = self.DisplayMapping
-##            temp.generate()
-            
-##    def RetrieveDisplay(self):
-##        done = None
-##        if self.dbroot and self.savename:
-##            if self.dbroot.has_key('config_grid'):
-##                if self.dbroot['config_grid'].has_key(self.savename):
-##                    done = self.dbroot['config_grid'][self.savename]
-##        else:
-##            config = ConfigParser.ConfigParser()
-##            tmppath = os.path.join("data", "grid.ini")
-##            if os.path.exists(tmppath):
-##                config.read(tmppath)
-##                temp = config.get(self.savename, 'display')
-##                temp = temp.replace("'", "")
-##                temp = temp[2:-2]
-##                temp = temp.split('), (')
-##                done = [element.split(',') for element in temp]
-##        return done
-                
-            
-##    def SaveDisplay(self, display_list):
-##        print "save display config", display_list
-##        if self.dbroot:
-##            print "save to zodb"
-##            temp = {}
-##            temp[self.savename] = display_list
-##            self.dbroot['config_grid'] = temp
-##            get_transaction().commit()
-            
-##        if self.savename:
-##            print 'save to file'
-##            config = ConfigParser.ConfigParser()
-##            tmppath = os.path.join("data", "grid.ini")
-##            if os.path.exists(tmppath):
-##                print "ini exists"
-##                config.read(tmppath)
-##                if config.has_section(self.savename):
-##                    print "removing section"
-##                    config.remove_section(self.savename)
-##            outfile = open(tmppath,'ab')
-##            config.add_section(self.savename)
-##            config.set(self.savename, 'display',display_list)
-##            config.write(outfile)
-##            outfile.close()
-            
-##    def ConfigGrid(self, event = None):
-##        #if not self.already_showing_config:
-##        #print 'call config screen'
-##        tmpsize = wxSize(750, 500)
-##        #testframe = toolframe.toolFrame(self, -1, 'Config Grid Display', wxDefaultPosition, tmpsize)
-##        testframe = wxDialog(self, -1, 'Config Grid Display', wxDefaultPosition, tmpsize,
-##                    style = wxCAPTION | wxSYSTEM_MENU | wxTHICK_FRAME )
-##        print "configgrid", self.DisplayMapping
-##        testframe.mainpanel = CustomizeGrid(testframe, -1, disp_objs = self.table._data, old_mapping = self.DisplayMapping)
-##        testframe.CentreOnParent()
-##        result = testframe.ShowModal()
-##        if result == wxID_OK:
-##            self.DisplayMapping = testframe.mainpanel.GetDisplayList()
-##            print 'getdisplaylist returned: %s' % self.DisplayMapping
-##            self.SaveDisplay(self.DisplayMapping)
-##            self.table.SetDisplayMapping(self.DisplayMapping)
-##            self.table.RefreshGrid()
-##            self.AutoSizeColumns()
             
     def QuickCreate(self, event = None):
         result = quickcreate.showQuickCreate(self)
@@ -363,10 +75,6 @@
         #result = self.DataManager.quickCreate(result)
         #print result
             
-
-##    def GetObjectOid(self, row):
-##        return self.table.GetObjectOid(row)
-                
 
 #---------------------------------------------------------------------------
 

Index: PanGalactic/pangalactic/utils/__init__.py
diff -u PanGalactic/pangalactic/utils/__init__.py:1.3 PanGalactic/pangalactic/utils/__init__.py:1.4
--- PanGalactic/pangalactic/utils/__init__.py:1.3	Tue Jul  8 22:14:13 2003
+++ PanGalactic/pangalactic/utils/__init__.py	Wed Oct  1 13:24:14 2003
@@ -4,7 +4,8 @@
 'configdbbrowser',
 'configdbbrowser_wdr',
 'convertimage',
-'customizegrid',
+'configuregrid',
+'configuredisplay',
 'customizegrid_wdr',
 'datamanager',
 'data_utils',

Index: PanGalactic/pangalactic/utils/basegrid.py
diff -u PanGalactic/pangalactic/utils/basegrid.py:1.10 PanGalactic/pangalactic/utils/basegrid.py:1.11
--- PanGalactic/pangalactic/utils/basegrid.py:1.10	Thu Sep 25 13:33:34 2003
+++ PanGalactic/pangalactic/utils/basegrid.py	Wed Oct  1 13:24:14 2003
@@ -12,7 +12,7 @@
 from pangalactic.utils import pgefexceptions    
 from pangalactic.utils import pgefdatatable     
 
-from pangalactic.utils.customizegrid import *
+from pangalactic.utils.configuregrid import *
 
 ID_POPUP_CONFIG_GRID = wxNewId()
 ID_POPUP_CLEAR_SELECTION = wxNewId()
@@ -40,6 +40,7 @@
     grid columns and to fill a row of data given the data in a list format"""
     def __init__(self, parent, id, savename = None, dbroot = None, intable = None):
         wxGrid.__init__(self, parent, id)
+        #print "\nbasegrid.init"
         self.SetColLabelSize(48)
         self.AutoSizeColumns(true)
 
@@ -57,10 +58,17 @@
         self.dbroot = dbroot
         self.savename = savename
         if len(self.table.GetDisplayMapping()) == 0:
+            #print "basegrid.init.displaymapping empty", savename
             self.DisplayMapping = self.RetrieveDisplay()
+            #if self.DisplayMapping:
+                #print "displaymapping", self.DisplayMapping[0]
+            #else:
+                #print "displaymapping", self.DisplayMapping
             self.table.SetDisplayMapping(self.DisplayMapping)
         else:
+            #print "basegrid.init.displaymapping exists", savename
             self.DisplayMapping = self.table.GetDisplayMapping()
+        self.RefreshDisplay(self.DisplayMapping)
 
         evthandler = pgefevents.PgefDragDropHandler(self)            
 
@@ -79,6 +87,7 @@
         self.SetDefaultCellOverflow(false)
         self.FitInside()
         EVT_GRID_COL_MOVE(self,self.GetId(),self.OnColMove)
+        #print "end basegrid.init"
 
 
     # Event method called when a column move needs to take place
@@ -345,72 +354,91 @@
 
 
     def RetrieveDisplay(self):
+        #print "basegrid.retrievedisplay", self.savename
         done = None
         if self.dbroot and self.savename:
+            #print "dbroot and savename"
             if self.dbroot.has_key('config_grid'):
+                #print "config_grid"
                 if self.dbroot['config_grid'].has_key(self.savename):
+                    #print "have key", self.savename
                     done = self.dbroot['config_grid'][self.savename]
         else:
+            #print "not (dbroot and savename)"
             config = ConfigParser.ConfigParser()
             tmppath = os.path.join("data", "grid.ini")
             if os.path.exists(tmppath):
+                #print "have ini file"
                 config.read(tmppath)
                 temp = config.get(self.savename, 'display')
                 temp = temp.replace("'", "")
                 temp = temp[2:-2]
                 temp = temp.split('), (')
                 done = [element.split(',') for element in temp]
+        #print "end retrievedisplay"
         return done
                 
             
     def SaveDisplay(self, display_list):
-        print "save display config", display_list
+        #print "save display config"
+        #if display_list:
+            #print "displaylist", display_list[0]
+        #else:
+            #print "displaylist", display_list
         if self.dbroot:
-            print "save to zodb"
+            #print "save to zodb"
             temp = {}
             temp[self.savename] = display_list
             self.dbroot['config_grid'] = temp
             get_transaction().commit()
             
         if self.savename:
-            print 'save to file'
+            #print 'save to file', self.savename
             config = ConfigParser.ConfigParser()
             tmppath = os.path.join("data", "grid.ini")
             if os.path.exists(tmppath):
-                print "ini exists"
+                #print "ini exists"
                 config.read(tmppath)
                 if config.has_section(self.savename):
-                    print "removing section"
+                    #print "removing section"
                     config.remove_section(self.savename)
-            outfile = open(tmppath,'ab')
+
+#            outfile = open(tmppath, 'ab') # config is in memory; don't append; overwrite.
+            outfile = open(tmppath, "w+")
             config.add_section(self.savename)
-            config.set(self.savename, 'display',display_list)
+            config.set(self.savename, 'display', display_list)
             config.write(outfile)
             outfile.close()
             
     def ConfigGrid(self, event = None):
-        print "basegrid.configgrid"
+        #print "basegrid.configgrid"
         #if not self.already_showing_config:
         #print 'call config screen'
         tmpsize = wxSize(750, 500)
         testframe = wxDialog(self, -1, 'Config Grid Display', wxDefaultPosition, tmpsize,
                     style = wxCAPTION | wxSYSTEM_MENU | wxTHICK_FRAME )
-        print "configgrid", self.DisplayMapping
-        testframe.mainpanel = CustomizeGrid(testframe, -1,
+        #if self.DisplayMapping:
+            #print "oldmapping", self.DisplayMapping[0]
+        #else:
+            #print "oldmapping", self.DisplayMapping
+        testframe.mainpanel = ConfigureGrid(testframe, -1,
                                             disp_objs = self.table._data,
                                             old_mapping = self.DisplayMapping)
         testframe.CentreOnParent()
         result = testframe.ShowModal()
         if result == wxID_OK:
+            #print "ok to save"
             self.DisplayMapping = testframe.mainpanel.GetDisplayList()
-            print 'getdisplaylist returned: %s' % self.DisplayMapping
+            #if self.DisplayMapping:
+                #print "newmapping", self.DisplayMapping[0]
+            #else:
+                #print "newmapping", self.DisplayMapping
             self.SaveDisplay(self.DisplayMapping)
             self.RefreshDisplay(self.DisplayMapping)
-#            self.table.SetDisplayMapping(self.DisplayMapping)
-#            self.table.RefreshGrid()
-#            self.AutoSizeColumns()
+
 
     def RefreshDisplay(self, displaymapping = None):
+        #print "basegrid.refreshdisplay"
         if displaymapping:
             self.table.SetDisplayMapping(displaymapping)
         else:

Index: PanGalactic/pangalactic/utils/configdbbrowser.py
diff -u PanGalactic/pangalactic/utils/configdbbrowser.py:1.3 PanGalactic/pangalactic/utils/configdbbrowser.py:1.4
--- PanGalactic/pangalactic/utils/configdbbrowser.py:1.3	Wed Jun 25 04:32:12 2003
+++ PanGalactic/pangalactic/utils/configdbbrowser.py	Wed Oct  1 13:24:14 2003
@@ -1,81 +1,37 @@
 #!/bin/env python
 #----------------------------------------------------------------------------
 # Name:         configdbbrowser.py
-# Author:       XXXX
-# Created:      XX/XX/XX
+# Author:       
+# Created:      
 # Copyright:    
 #----------------------------------------------------------------------------
 
 from wxPython.wx import *
-from pangalactic.utils.configdbbrowser_wdr import *
 from wxPython.lib.mixins.listctrl import wxColumnSorterMixin
+from pangalactic.utils.configuredisplay import ConfigureDisplay
 
 # WDR: classes
 
 DISPLAY_CONFIG = "display_config"
 
-class ConfigDbBrowser(wxPanel, wxColumnSorterMixin):
+class ConfigDbBrowser(ConfigureDisplay, wxColumnSorterMixin):
     def __init__(self, parent, id,
-        pos = wxPyDefaultPosition, size = wxPyDefaultSize,
-        style = wxTAB_TRAVERSAL, dbroot = None, collection_name = None):
-        wxPanel.__init__(self, parent, id, pos, size, style)
-        self.Parent = parent
+                 pos = wxPyDefaultPosition,
+                 size = wxPyDefaultSize,
+                 style = wxTAB_TRAVERSAL,
+                 dbroot = None,
+                 collection_name = None):
+        ConfigureDisplay.__init__(self, parent, id, pos, size, style)
+        self.collection_name = collection_name
         self.dbroot = dbroot
-        self.collection_name = collection_name        
-
-        self.attr_list = self.CreateAttributeList()
         self.current_config = {}
-        
-        ConfigDisplayFunc(self, true)
-        self.grid = self.GetGridMap()
-        wxColumnSorterMixin.__init__(self, 1)
         self.Setup()
-        self.ReloadSelections()
         
-        # WDR: handler declarations for ConfigDbBrowser
-        EVT_BUTTON(self, ID_BITMAPBUTTON_UP, self.OnMoveUp)
-        EVT_BUTTON(self, ID_BITMAPBUTTON_DOWN, self.OnMoveDown)
         EVT_BUTTON(self, wxID_CANCEL, self.OnCancel)
-        EVT_BUTTON(self, wxID_OK, self.OnOK)
-        EVT_BUTTON(self, ID_BTN_REMOVEALL, self.OnRemoveAll)
-        EVT_BUTTON(self, ID_BTN_REMOVE, self.OnRemove)
-        EVT_BUTTON(self, ID_BTN_ADD, self.OnAdd)
-        EVT_BUTTON(self, ID_BTN_ADDALL, self.OnAddAll)
-        EVT_LIST_ITEM_SELECTED(self, ID_LISTCTRL_SHOWN, self.OnShownItemClick)
-
-    # WDR: methods for ConfigDbBrowser
-
-    def GetBitmapbuttonDown(self):
-        return wxPyTypeCast( self.FindWindowById(ID_BITMAPBUTTON_DOWN), "wxBitmapButton" )
-
-    def GetBitmapbuttonUp(self):
-        return wxPyTypeCast( self.FindWindowById(ID_BITMAPBUTTON_UP), "wxBitmapButton" )
-
-    def GetGridMap(self):
-        return wxPyTypeCast( self.FindWindowById(ID_GRID_MAP), "wxGrid" )
-
-    def GetCancel(self):
-        return wxPyTypeCast( self.FindWindowById(wxID_CANCEL), "wxButton" )
-
-    def GetOk(self):
-        return wxPyTypeCast( self.FindWindowById(wxID_OK), "wxButton" )
-
-    def GetBtnRemoveall(self):
-        return wxPyTypeCast( self.FindWindowById(ID_BTN_REMOVEALL), "wxBitmapButton" )
-
-    def GetBtnAdd(self):
-        return wxPyTypeCast( self.FindWindowById(ID_BTN_ADD), "wxBitmapButton" )
 
-    def GetBtnAddall(self):
-        return wxPyTypeCast( self.FindWindowById(ID_BTN_ADDALL), "wxBitmapButton" )
-
-    def GetListctrlShown(self):
-        return wxPyTypeCast( self.FindWindowById(ID_LISTCTRL_SHOWN), "wxListCtrl" )
-
-    def GetListctrlAvailable(self):
-        return wxPyTypeCast( self.FindWindowById(ID_LISTCTRL_AVAILABLE), "wxListCtrl" )
     
     def Setup(self):
+        #print "configdbb.setup"
         self.GetListctrlAvailable().ClearAll()
         self.GetListctrlAvailable().InsertColumn(0, "Attribute Names")
         self.GetListctrlAvailable().SetColumnWidth(0, wxLIST_AUTOSIZE_USEHEADER)
@@ -89,14 +45,18 @@
             self.grid.DeleteRows(0, rows)
         self.grid.SetColLabelValue(0, 'Attribute Name')
         self.grid.SetColLabelValue(1, 'Display Name')
-        self.grid.SetColSize(0,200)
-        self.grid.SetColSize(1,200)
+        self.grid.SetColSize(0, 200)
+        self.grid.SetColSize(1, 200)
+        self.attr_list = self.CreateAttributeList()
         if self.attr_list:
+            #print "have attr_list"
             self.FillAvailable()
-        self.grid.MakeCellVisible(0,0)
+        self.grid.MakeCellVisible(0, 0)
+        self.ReloadSelections()
             
     def CreateAttributeList(self):
         """Creates the list of all available attribute names in the entire collection"""
+        #print "configdbb.createattributelist"
         temp = {}
         collection = self.dbroot[self.collection_name]
         if isinstance(collection, list):
@@ -109,27 +69,33 @@
             
     def ReloadSelections(self):
         """Reloads the shown listctrl with the previous selections and also updates the grid"""
+        #print "configdbb.reloadselections"
         
         #Get the list of tuples that are attr name and display name
         if self.dbroot.has_key(DISPLAY_CONFIG):
+            #print "have display_config"
             if self.dbroot[DISPLAY_CONFIG].has_key(self.collection_name):
+                #print "displaymapping", DISPLAY_CONFIG, self.collection_name
                 selections = self.dbroot[DISPLAY_CONFIG][self.collection_name]
     
                 #loop through th elist and set the item as selected in the available listctrl
                 for attrname, dispname in selections:
+                    #print "attrname, dispname: (%s, %s)" % (attrname, dispname)
                     ndx = self.GetListctrlAvailable().FindItem(-1, attrname)
-                    self.GetListctrlAvailable().SetItemState ( ndx, wxLIST_STATE_SELECTED, wxLIST_STATE_SELECTED)
+                    self.GetListctrlAvailable().SetItemState (ndx, wxLIST_STATE_SELECTED, wxLIST_STATE_SELECTED)
     
                     #move all the selected entries to the shown listctrl
                     self.MoveSelections(self.GetListctrlAvailable(), self.GetListctrlShown())
     
                 #once again loop the list and put the display name into the grid
                 for attrname, dispname in selections:
+                    #print "displaynames (%s, %s)" % (attrname, dispname)
                     ndx = self.GetListctrlShown().FindItem(-1, attrname)
-                    self.grid.SetCellValue(ndx,1, dispname)
+                    self.grid.SetCellValue(ndx, 1, dispname)
         
             
     def SaveConfig(self):
+        #print "saveconfig"
         disp_list = self.GetDisplayList()
         if not self.current_config:
             self.ReadConfig()
@@ -139,12 +105,17 @@
         get_transaction().commit()
             
     def ReadConfig(self):
+        #print "configdbb.readconfig"
         try:
             self.current_config = self.dbroot[DISPLAY_CONFIG]
+            #print "current_config"
+            #print self.current_config
         except:
+            #print "======> exception"
             self.current_config = {}
     
     def GetDisplayList(self):
+        #print "configdbb.getdisplaylist"
         numrows = self.grid.GetNumberRows()
         temp = []
         for x in range(numrows):
@@ -153,150 +124,7 @@
             temp.append((cell_zero, cell_one))
         return temp
         
-    def GetListCtrl(self):
-        return self.GetListctrlAvailable()  
-    
-    def _getSelectedIndices( self, list_widget, state =  wxLIST_STATE_SELECTED): 
-        indices = [] 
-        found = 1 
-        lastFound = -1 
-        while found: 
-                index = list_widget.GetNextItem( 
-                        lastFound, 
-                        wxLIST_NEXT_ALL, 
-                        state, 
-                ) 
-                if index == -1: 
-                        break 
-                else: 
-                        lastFound = index 
-                        indices.append( index ) 
-        return indices  
-    
-    def FillAvailable(self):
-        if self.attr_list:
-            temp_list = zip(range(len(self.attr_list)), self.attr_list)
-            self.itemDataMap = {}
-            for ndx, attr_string in temp_list:
-                self.itemDataMap[ndx] = attr_string
-                self.GetListctrlAvailable().InsertStringItem(ndx,attr_string)
-                self.GetListctrlAvailable().SetItemData(ndx, ndx)
-            self.GetListctrlAvailable().SetColumnWidth(0, wxLIST_AUTOSIZE)
-            self.SortListItems(0,true)
-            
-    def LookupData(self, text):
-        for key, value in self.itemDataMap.items():
-            if value == text:
-                return key
-            
-            
-    def MoveSelections(self, from_list, to_list, move_all = None):
-        remove_from_grid = 0
-        if move_all:
-            selected_ndxs = range(from_list.GetItemCount())
-        else:
-            selected_ndxs = self._getSelectedIndices(from_list)
-            
-        if from_list == self.GetListctrlShown():
-            remove_from_grid = 1
-
-        for ndx in selected_ndxs:
-            move_text = from_list.GetItemText(ndx)
-            move_data = self.LookupData(move_text)
-            to_list.InsertStringItem(to_list.GetItemCount(), move_text)
-            to_list.SetItemData(to_list.GetItemCount() -1, move_data)
-            
-            if not remove_from_grid:
-                self.grid.AppendRows(1)
-                map_ndx = self.grid.GetNumberRows()
-            
-                self.grid.SetCellValue(map_ndx -1,0, move_text)
-                self.grid.SetReadOnly(map_ndx -1,0)
-                self.grid.SetCellBackgroundColour(map_ndx -1,0, wxLIGHT_GREY)
-            
-        selected_ndxs.sort()
-        selected_ndxs.reverse()
-        for ndx in selected_ndxs:
-            from_list.DeleteItem(ndx)
-            if remove_from_grid:
-                self.grid.DeleteRows(ndx, 1)
-                
-    def MoveInList(self, list_obj, direction):
-        #get the selected text and text
-        current_ndx = self._getSelectedIndices(self.GetListctrlShown())
-        #since _getSelected returns a list, convert it to a single integer
-        current_ndx = current_ndx[0]
-        
-        if current_ndx == 0 and direction == -1:
-            return
-        if current_ndx == list_obj.GetItemCount() - 1 and direction == 1:
-            return
-        
-        selected_text = list_obj.GetItemText(current_ndx)
-        selected_data = list_obj.GetItemData(current_ndx)
-        
-        #delete the current item
-        list_obj.DeleteItem(current_ndx)
-        
-        #re-insert the item at current_ndx -1
-        if direction > 0:
-            new_index = current_ndx + 1
-        elif direction < 0:
-            new_index = current_ndx - 1
-        list_obj.InsertStringItem(new_index, selected_text)
-        
-        #reset its data as well
-        list_obj.SetItemData(new_index , selected_data)
-        
-        #re-select it so we can move it again if needed
-        list_obj.SetItemState(new_index, wxLIST_STATE_SELECTED, wxLIST_STATE_SELECTED)
-        list_obj.EnsureVisible(new_index)
-
-        #move the item in the grid to keep them synced
-        self.MoveInGrid(self.grid, current_ndx, direction)
-    
-    def MoveInGrid(self, grid_obj, current_ndx, direction):
-        if current_ndx == 0 and direction == -1:
-            return
-        if current_ndx == grid_obj.GetNumberRows() -1 and direction == 1:
-            return
-        current_row_data = []
-        grid_obj.ClearSelection()
-        for x in range(grid_obj.GetNumberCols()):
-            current_row_data.append(grid_obj.GetCellValue(current_ndx, x))
-            
-        #delete the current item
-        grid_obj.DeleteRows(current_ndx, 1)
-        
-        #re-insert the item at current_ndx -1
-        if direction > 0:
-            new_index = current_ndx + 1
-        elif direction < 0:
-            new_index = current_ndx - 1
-            
-        grid_obj.InsertRows(new_index, 1)
-        grid_obj.SetCellBackgroundColour(new_index, 0, wxLIGHT_GREY)
-        grid_obj.SelectRow(new_index)
-        for x in range(len(current_row_data)):
-            grid_obj.SetCellValue(new_index,x, current_row_data[x])
-
-                               
-        
-    # WDR: handler implementations for ConfigDbBrowser
     
-    def OnShownItemClick(self, event):
-        currentItem = event.m_itemIndex
-        self.grid.ClearSelection()
-        self.grid.MakeCellVisible(currentItem, 0)
-        self.grid.SelectRow(currentItem)
-        
-
-    def OnMoveUp(self, event):
-        self.MoveInList(self.GetListctrlShown(), -1)
-
-    def OnMoveDown(self, event):
-        self.MoveInList(self.GetListctrlShown(), 1)
-
     def OnCancel(self, event):
         self.Parent.Close()
 
@@ -304,27 +132,3 @@
         self.SaveConfig()
         self.Parent.Close()
         
-    def OnRemoveAll(self, event):
-        self.grid.BeginBatch()
-        self.GetListctrlShown().DeleteAllItems()
-        self.GetListctrlAvailable().DeleteAllItems()
-        self.FillAvailable()
-        rows = self.grid.GetNumberRows()
-        self.grid.DeleteRows(0, rows)
-        self.grid.EndBatch()
-
-    def OnRemove(self, event):
-        self.MoveSelections(self.GetListctrlShown(), self.GetListctrlAvailable())
-        self.SortListItems(0,true)
- 
-    def OnAdd(self, event):
-        self.MoveSelections(self.GetListctrlAvailable(), self.GetListctrlShown())
-            
-    def OnAddAll(self, event):
-        self.grid.BeginBatch()
-        self.MoveSelections(self.GetListctrlAvailable(), self.GetListctrlShown(), move_all = 1)
-        self.grid.EndBatch()
-        #evt = wxSizeEvent( self.Parent.GetSize() )
-        #wxPostEvent(self.Parent, evt)
-        self.Parent.ProcessEvent(wxSizeEvent(self.Parent.GetSize()))
-

From pbear at ned.gsfc.nasa.gov  Wed Oct  1 14:27:56 2003
From: pbear at ned.gsfc.nasa.gov (pbear CVS)
Date: Wed Oct  1 13:27:58 2003
Subject: [Pangalactic-commits] fixed grid configuration;
	both configdbbrowser and configuregrid extend
	new class configuredisplay
Message-ID: <200310011727.h91HRuVJ014355@ned.gsfc.nasa.gov>

Modified files:
PanGalactic/pangalactic/utils/configuredisplay.py None 1.1

Log message:
fixed grid configuration; both configdbbrowser and configuregrid extend new class configuredisplay


From pbear at ned.gsfc.nasa.gov  Wed Oct  1 14:28:21 2003
From: pbear at ned.gsfc.nasa.gov (pbear CVS)
Date: Wed Oct  1 13:28:22 2003
Subject: [Pangalactic-commits] fixed grid configuration;
	both configdbbrowser and configuregrid extend
	new class configuredisplay
Message-ID: <200310011728.h91HSLUI014396@ned.gsfc.nasa.gov>

Modified files:
PanGalactic/pangalactic/utils/configuregrid.py None 1.1

Log message:
fixed grid configuration; both configdbbrowser and configuregrid extend new class configuredisplay


From waterbug at ned.gsfc.nasa.gov  Wed Oct  1 14:35:29 2003
From: waterbug at ned.gsfc.nasa.gov (waterbug CVS)
Date: Wed Oct  1 13:35:30 2003
Subject: [Pangalactic-commits] Add _pk and _fk attributes.
Message-ID: <200310011735.h91HZT30014581@ned.gsfc.nasa.gov>

Modified files:
PanGalactic/pangalactic/enterprise/assemblycomponentusage.py 1.15 1.16
PanGalactic/pangalactic/enterprise/category.py 1.3 1.4
PanGalactic/pangalactic/enterprise/dmcomponentusage.py 1.8 1.9
PanGalactic/pangalactic/enterprise/docmaster.py 1.9 1.10
PanGalactic/pangalactic/enterprise/docrep.py 1.12 1.13
PanGalactic/pangalactic/enterprise/docversion.py 1.10 1.11
PanGalactic/pangalactic/enterprise/drfile.py 1.6 1.7
PanGalactic/pangalactic/enterprise/pgefobject.py 1.24 1.25
PanGalactic/pangalactic/enterprise/productmaster.py 1.15 1.16
PanGalactic/pangalactic/enterprise/productmodelmaster.py 1.16 1.17
PanGalactic/pangalactic/enterprise/productmodelversion.py 1.19 1.20
PanGalactic/pangalactic/enterprise/productversion.py 1.18 1.19

Log message:
Add _pk and _fk attributes.


Index: PanGalactic/pangalactic/enterprise/productmodelmaster.py
diff -u PanGalactic/pangalactic/enterprise/productmodelmaster.py:1.16 PanGalactic/pangalactic/enterprise/productmodelmaster.py:1.17
--- PanGalactic/pangalactic/enterprise/productmodelmaster.py:1.16	Mon Sep 29 14:39:59 2003
+++ PanGalactic/pangalactic/enterprise/productmodelmaster.py	Wed Oct  1 13:35:27 2003
@@ -1,4 +1,4 @@
-# $Id: productmodelmaster.py,v 1.16 2003/09/29 18:39:59 waterbug Exp $
+# $Id: productmodelmaster.py,v 1.17 2003/10/01 17:35:27 waterbug Exp $
 
 """
 Version-independent product model data.
@@ -10,7 +10,7 @@
       default one? ...
 """
 
-__version__ = "$Revision: 1.16 $"[11:-2]
+__version__ = "$Revision: 1.17 $"[11:-2]
 
 from pangalactic.enterprise.project import Project
 from pangalactic.enterprise.productmaster import ProductMaster
@@ -46,6 +46,14 @@
     # These are the fields that will appear in when an item is
     # placed in a grid.  The format for each field is [ Label,
     # attribute, field_type ].
+    _fk = {'_project' : ['project_id',
+                         'project_id_context'],
+           '_of_master' : ['of_pm_id',
+                           'of_pm_id_context'],
+           '_of_version' : ['of_pv_id',
+                            'of_pm_id',
+                            'of_pm_id_context']
+          }
     _gridmap = [
                 ['Part\nNumber', 'self.of_pm_id', 'string'],
                 ['Part\nVersion', 'self.of_pv_id', 'string'],
@@ -54,16 +62,22 @@
                 ['Model\nName', 'self.short_description', 'string'],
                 ['Model\nOwner', 'self.owner', 'string']
                ]
+    _pk = [
+           'id',
+           'of_pv_id',
+           'of_pm_id',
+           'of_pm_id_context'
+          ]
     _schema_ext = {
-                       'of_pm_id'                 : 'str',
-                       'of_pm_id_context'         : 'str',
-                       'of_pv_id'                 : 'str',
-                       'frame_of_reference'       : 'str',
-                       'life_cycle_stage'         : 'str',
-                       'model_definition_context' : 'str',
-                       'model_view'               : 'str',
-                       'step_subtype'             : 'str'
-                      }
+                   'of_pm_id'                 : 'str',
+                   'of_pm_id_context'         : 'str',
+                   'of_pv_id'                 : 'str',
+                   'frame_of_reference'       : 'str',
+                   'life_cycle_stage'         : 'str',
+                   'model_definition_context' : 'str',
+                   'model_view'               : 'str',
+                   'step_subtype'             : 'str'
+                  }
     _schema = _schema_ext.copy()
     _schema.update(ProductMaster._schema)
     # These are the minimum fields that must be filled in before
@@ -73,10 +87,10 @@
     # this info is used by the PgerObjectRegistry and
     # PgerObjectFactory.
     _refd = {
-                   '_project'    : 'Project',
-                   '_of_master'  : 'ProductMaster',
-                   '_of_version' : 'ProductVersion'
-                  }
+             '_project'    : 'Project',
+             '_of_master'  : 'ProductMaster',
+             '_of_version' : 'ProductVersion'
+            }
     # Standard abbreviation for the class name (used in the
     # PgerObjectRegistry to compute the names of foreign key
     # constraints)

Index: PanGalactic/pangalactic/enterprise/docversion.py
diff -u PanGalactic/pangalactic/enterprise/docversion.py:1.10 PanGalactic/pangalactic/enterprise/docversion.py:1.11
--- PanGalactic/pangalactic/enterprise/docversion.py:1.10	Mon Sep 29 14:39:59 2003
+++ PanGalactic/pangalactic/enterprise/docversion.py	Wed Oct  1 13:35:27 2003
@@ -1,10 +1,10 @@
-# $Id: docversion.py,v 1.10 2003/09/29 18:39:59 waterbug Exp $
+# $Id: docversion.py,v 1.11 2003/10/01 17:35:27 waterbug Exp $
 
 """
 Version-specific attributes of a document.
 """
 
-__version__ = "$Revision: 1.10 $"[11:-2]
+__version__ = "$Revision: 1.11 $"[11:-2]
 
 from pangalactic.enterprise.pgefobject import PgefObject
 from pangalactic.enterprise.docmaster import DocMaster as DM
@@ -29,18 +29,24 @@
                            ]
     _excluded_fields = PgefObject._excluded_fields
     _excluded_fields += _excluded_fields_ext
+    _fk = {'_of_master' : ['of_dm_id',
+                           'of_dm_id_context']
+          }
     _gridmap = [
                 ['Title', 'self._of_master.name'],
                 ['Abstract' , 'self.abstract']
                ]
+    _pk = [
+           'id',
+           'of_dm_id',
+           'of_dm_id_context'
+          ]
     _properties = PgefObject._properties.copy()
     _required = [
                  'id',
                  'creator'
                 ]
-    _refd = {
-                   '_of_master' : 'DocMaster'
-                  }
+    _refd = {'_of_master' : 'DocMaster'}
     _schema_ext = {
                    'of_dm_id'         : 'str',
                    'of_dm_id_context' : 'str',

Index: PanGalactic/pangalactic/enterprise/productmaster.py
diff -u PanGalactic/pangalactic/enterprise/productmaster.py:1.15 PanGalactic/pangalactic/enterprise/productmaster.py:1.16
--- PanGalactic/pangalactic/enterprise/productmaster.py:1.15	Mon Sep 29 14:47:56 2003
+++ PanGalactic/pangalactic/enterprise/productmaster.py	Wed Oct  1 13:35:27 2003
@@ -1,10 +1,10 @@
-# $Id: productmaster.py,v 1.15 2003/09/29 18:47:56 pbear Exp $
+# $Id: productmaster.py,v 1.16 2003/10/01 17:35:27 waterbug Exp $
 
 """
 Version-independent product data.
 """
 
-__version__ = "$Revision: 1.15 $"[11:-2]
+__version__ = "$Revision: 1.16 $"[11:-2]
 
 from pangalactic.enterprise.pgefobject import PgefObject
 from pangalactic.enterprise.project import Project
@@ -37,6 +37,9 @@
     _excluded_dump = ['Mark', 'Drag']
     # These are the fields that will appear in when an item is placed in a grid.
     # The format for each field is [ Label, attribute, field_type ].
+    _fk = {'_project' : ['project_id',
+                         'project_id_context']
+          }
     _gridmap = [
                 ['Part\nNumber','self.id', 'string'],
                 ['Name\nCode','self.name', 'string'],
@@ -45,6 +48,7 @@
                 ['Created','self.create_datetime', 'string'],
                 ['Creator','self.creator', 'string']
                ]
+    _pk = ['id', 'id_context']
     _schema_ext = {
                        'project_id'         : 'str',
                        'project_id_context' : 'str',

Index: PanGalactic/pangalactic/enterprise/docrep.py
diff -u PanGalactic/pangalactic/enterprise/docrep.py:1.12 PanGalactic/pangalactic/enterprise/docrep.py:1.13
--- PanGalactic/pangalactic/enterprise/docrep.py:1.12	Mon Sep 29 14:39:59 2003
+++ PanGalactic/pangalactic/enterprise/docrep.py	Wed Oct  1 13:35:27 2003
@@ -1,10 +1,10 @@
-# $Id: docrep.py,v 1.12 2003/09/29 18:39:59 waterbug Exp $
+# $Id: docrep.py,v 1.13 2003/10/01 17:35:27 waterbug Exp $
 
 """
 A representation or format of a document.
 """
 
-__version__ = "$Revision: 1.12 $"[11:-2]
+__version__ = "$Revision: 1.13 $"[11:-2]
 
 from pangalactic.enterprise.pgefobject import PgefObject
 from pangalactic.enterprise.docversion import DocVersion as DV
@@ -32,16 +32,22 @@
     _excluded_fields = PgefObject._excluded_fields
     _excluded_fields += _excluded_fields_ext
     _excluded_dump = []
+    _fk = {'of_version' : ['of_dv_id',
+                           'of_dm_id',
+                           'of_dm_id_context']
+          }
     _gridmap = [
                 ['Title', 'self._of_version.name'],
                 ['Abstract' , 'self._of_version.abstract'],
                 ['Type' , 'self.Type']
                ]
+    _pk = ['id',
+           'of_dv_id',
+           'of_dm_id',
+           'of_dm_id_context']
     _properties = PgefObject._properties.copy()
     _required = []
-    _refd = {
-                   '_of_version' : 'DocVersion'
-                  }
+    _refd = {'_of_version' : 'DocVersion'}
     _schema_ext = {
                    'of_dv_id'         : 'str',
                    'of_dm_id'         : 'str',

Index: PanGalactic/pangalactic/enterprise/docmaster.py
diff -u PanGalactic/pangalactic/enterprise/docmaster.py:1.9 PanGalactic/pangalactic/enterprise/docmaster.py:1.10
--- PanGalactic/pangalactic/enterprise/docmaster.py:1.9	Mon Sep 29 14:39:59 2003
+++ PanGalactic/pangalactic/enterprise/docmaster.py	Wed Oct  1 13:35:27 2003
@@ -1,10 +1,10 @@
-# $Id: docmaster.py,v 1.9 2003/09/29 18:39:59 waterbug Exp $
+# $Id: docmaster.py,v 1.10 2003/10/01 17:35:27 waterbug Exp $
 
 """
 Version-independent attributes of a document.
 """
 
-__version__ = "$Revision: 1.9 $"[11:-2]
+__version__ = "$Revision: 1.10 $"[11:-2]
 
 from pangalactic.enterprise.pgefobject import PgefObject
 
@@ -24,20 +24,22 @@
     _default_display_names = {}
     _default_display_types = {}
     # _excluded_fields are those inherited from PgefObject
+    _fk = {}
     _gridmap = [
                 ['Title', 'self.name'],
                 ['Type' , 'self.doc_type_code']
                ]
     _properties = PgefObject._properties.copy()
-    _required = [
-                 'id'
-                ]
+    _required = ['id']
+    # when we create a DocType class, refd will contain that, but
+    # in the meantime, it's empty ...
+    _pk = ['id', 'id_context']
     _refd = {}
     _schema_ext = {
-                       'doc_type_code'         : 'str',
-                       'doc_type_code_context' : 'str',
-                       'structural_role'       : 'str'
-                      }
+                   'doc_type_code'         : 'str',
+                   'doc_type_code_context' : 'str',
+                   'structural_role'       : 'str'
+                  }
     _schema = _schema_ext.copy()
     _schema.update(PgefObject._schema)
     _std_abbrev = 'dm'

Index: PanGalactic/pangalactic/enterprise/assemblycomponentusage.py
diff -u PanGalactic/pangalactic/enterprise/assemblycomponentusage.py:1.15 PanGalactic/pangalactic/enterprise/assemblycomponentusage.py:1.16
--- PanGalactic/pangalactic/enterprise/assemblycomponentusage.py:1.15	Mon Sep 29 14:39:59 2003
+++ PanGalactic/pangalactic/enterprise/assemblycomponentusage.py	Wed Oct  1 13:35:27 2003
@@ -1,11 +1,11 @@
-# $Id: assemblycomponentusage.py,v 1.15 2003/09/29 18:39:59 waterbug Exp $
+# $Id: assemblycomponentusage.py,v 1.16 2003/10/01 17:35:27 waterbug Exp $
 
 """
 The relationship between an assembled product and a part that is
 used in it.
 """
 
-__version__ = "$Revision: 1.15 $"[11:-2]
+__version__ = "$Revision: 1.16 $"[11:-2]
 
 from pangalactic.utils import oid
 from pangalactic.enterprise.pgefobject import PgefObject
@@ -29,13 +29,25 @@
     _default_display_names = {}
     _default_display_types = {}
     # _excluded_fields are those inherited from PgefObject
+    _fk = {'_assembly' : ['assembly_id',
+                          'assembly_of_pmm_id',
+                          'assembly_of_pv_id',
+                          'assembly_of_pm_id',
+                          'assembly_of_pm_id_context'],
+           '_component' : ['component_id',
+                           'component_of_pmm_id',
+                           'component_of_pv_id',
+                           'component_of_pm_id',
+                           'component_of_pm_id_context']
+          }
     _gridmap =  [
-                 ['Type','self.subtype', 'string'],
-                 ['Assembly PN','self.assembly_of_pm_id', 'string'],
-                 ['Component PN','self.component_of_pm_id', 'string'],
-                 ['Delete','self.Delete', 'boolean'],
-                 ['Ref Designator','self.ref_designator', 'string']
+                 ['Type', 'self.subtype', 'string'],
+                 ['Assembly PN', 'self.assembly_of_pm_id', 'string'],
+                 ['Component PN', 'self.component_of_pm_id', 'string'],
+                 ['Delete', 'self.Delete', 'boolean'],
+                 ['Ref Designator', 'self.ref_designator', 'string']
                 ]
+    _pk = ['pgef_oid']
     _properties = PgefObject._properties.copy()
     _schema_ext = {
                    'assembly_id'                : 'str',
@@ -59,7 +71,7 @@
     # is used by the PgerObjectRegistry and the
     # PgerObjectFactory.
     _refd = {'_assembly' : 'ProductModelVersion',
-                   '_component' : 'ProductModelVersion'}
+             '_component' : 'ProductModelVersion'}
     # Standard abbreviation for the class name (used in the
     # PgerObjectRegistry to compute the names of foreign key
     # constraints)

Index: PanGalactic/pangalactic/enterprise/category.py
diff -u PanGalactic/pangalactic/enterprise/category.py:1.3 PanGalactic/pangalactic/enterprise/category.py:1.4
--- PanGalactic/pangalactic/enterprise/category.py:1.3	Mon Sep 15 16:08:59 2003
+++ PanGalactic/pangalactic/enterprise/category.py	Wed Oct  1 13:35:27 2003
@@ -1,4 +1,4 @@
-# $Id: category.py,v 1.3 2003/09/15 20:08:59 waterbug Exp $
+# $Id: category.py,v 1.4 2003/10/01 17:35:27 waterbug Exp $
 
 """
 A data element that supports customizable object taxonomies.
@@ -17,13 +17,16 @@
     _default_display_types = {}
     # _excluded_fields are those inherited from PgefObject
     _excluded_dump = []
+    _fk = {}
     _gridmap =  [ 
                  ['ID', 'self.id'],
                  ['Name' , 'self.name'],
                  ['Definition' , 'self.long_description']
                 ]
+    _pk = ['id', 'id_context']
     _properties = PgefObject._properties.copy()
     _schema = PgefObject._schema.copy()
+    _refd = {}
     _required = [
                  'id',
                  'creator',

Index: PanGalactic/pangalactic/enterprise/drfile.py
diff -u PanGalactic/pangalactic/enterprise/drfile.py:1.6 PanGalactic/pangalactic/enterprise/drfile.py:1.7
--- PanGalactic/pangalactic/enterprise/drfile.py:1.6	Mon Sep 29 14:39:59 2003
+++ PanGalactic/pangalactic/enterprise/drfile.py	Wed Oct  1 13:35:27 2003
@@ -1,10 +1,10 @@
-# $Id: drfile.py,v 1.6 2003/09/29 18:39:59 waterbug Exp $
+# $Id: drfile.py,v 1.7 2003/10/01 17:35:27 waterbug Exp $
 
 """
 A file that contains an instance of a document.
 """
 
-__version__ = "$Revision: 1.6 $"[11:-2]
+__version__ = "$Revision: 1.7 $"[11:-2]
 
 from pangalactic.enterprise.pgeffile import PgefFile
 from pangalactic.enterprise.docversion import DocVersion as DV
@@ -21,40 +21,49 @@
                             'of_dm_id',
                             'of_dm_id_context',
                             'of_dv_id'
+                            'of_dr_id'
                            ]
     _excluded_fields = PgefFile._excluded_fields
     _excluded_fields += _excluded_fields_ext
     _excluded_dump = []
+    _fk = {'DocRep' : ['of_dm_id',
+                       'of_dm_id_context',
+                       'of_dv_id'
+                       'of_dr_id']
+          }
     _gridmap = []
+    _pk = ['pgef_oid']
     _properties = PgefFile._properties.copy()
     _required = []
-    _refd = {}
+    _refd = {'_of_dr' : 'DocRep'}
     _schema_ext = {
-                   'dm_id'          : 'str',
-                   'dm_id_context'  : 'str',
-                   'dv_id'          : 'str',
-                   'dr_id'          : 'str'
+                   'of_dm_id'          : 'str',
+                   'of_dm_id_context'  : 'str',
+                   'of_dv_id'          : 'str',
+                   'of_dr_id'          : 'str'
                   }
     _schema = _schema_ext.copy()
     _schema.update(PgefFile._schema)
     _std_abbrev = 'df'
 
     def __init__(self, email=None, schema=_schema, 
-                 dv=None, **kw):
+                 dr=None, **kw):
         PgefFile.__init__(self, email=email,
                           schema=schema, **kw)
         # if a dv is passed in, use it ...
-        if dv.__class__.__name__ == 'DocVersion':
-            self._of_version = dv
+        if dr.__class__.__name__ == 'DocRep':
+            self._of_dr = dr
         else:
             # if not, create one ...
+            drid      = kw.get('of_dr_id', '1')
             dvid      = kw.get('of_dv_id', '1')
             dvdmid    = kw.get('of_dm_id', 
                                'Document Master Identifier')
             dvdmidc   = kw.get('of_dm_id_context', 'PGER')
-            self._of_version = DV(id=dvid,
-                                  of_dm_id=dvdmid,
-                                  of_dm_id_context=dvdmidc)
+            self._of_dr = DR(id=drid,
+                             of_dv_id=dvid,
+                             of_dm_id=dvdmid,
+                             of_dm_id_context=dvdmidc)
         # pull in _of_master from the _of_version so we don't
         # have to go nuts with blah.blah.blah to get to
         # attributes of my parents ...

Index: PanGalactic/pangalactic/enterprise/dmcomponentusage.py
diff -u PanGalactic/pangalactic/enterprise/dmcomponentusage.py:1.8 PanGalactic/pangalactic/enterprise/dmcomponentusage.py:1.9
--- PanGalactic/pangalactic/enterprise/dmcomponentusage.py:1.8	Mon Sep 29 14:39:59 2003
+++ PanGalactic/pangalactic/enterprise/dmcomponentusage.py	Wed Oct  1 13:35:27 2003
@@ -1,10 +1,10 @@
-# $Id: dmcomponentusage.py,v 1.8 2003/09/29 18:39:59 waterbug Exp $
+# $Id: dmcomponentusage.py,v 1.9 2003/10/01 17:35:27 waterbug Exp $
 
 """
 An occurance of a document as a component of another document.
 """
 
-__version__ = "$Revision: 1.8 $"[11:-2]
+__version__ = "$Revision: 1.9 $"[11:-2]
 
 from pangalactic.enterprise.pgefobject import PgefObject
 
@@ -18,14 +18,18 @@
     _default_display_names = {}
     _default_display_types = {}
     # _excluded_fields are those inherited from PgefObject
+    _fk = {'_assembly_dm' :  ['assembly_dm_id',
+                              'assembly_dm_id_context'],
+           '_component_dm' : ['component_dm_id',
+                              'component_dm_id_context']
+          }
     _excluded_dump = []
     _gridmap = []
+    _pk = ['pgef_oid']
     _properties = PgefObject._properties.copy()
+    _refd = {'_assembly_dm'  : 'DocMaster',
+             '_component_dm' : 'DocMaster'}
     _required = []
-    # TODO:  implement _refd as:
-    #            '_parent_doc' : 'DocMaster',
-    #            '_child_doc'  : 'DocMaster'
-    _refd = {}
     _schema_ext = {
                    'assembly_dm_id'          : 'str',
                    'assembly_dm_id_context'  : 'str',
@@ -39,7 +43,7 @@
     _std_abbrev = 'dcu'
 
     def __init__(self, email=None, schema=_schema,
-                 _parent_doc=None, _child_doc=None, **kw):
+                 _assembly_dm=None, _component_dm=None, **kw):
         # TODO:  this needs serious work -- should be set up
         # similar to ACU.
         PgefObject.__init__(self, email=email,

Index: PanGalactic/pangalactic/enterprise/pgefobject.py
diff -u PanGalactic/pangalactic/enterprise/pgefobject.py:1.24 PanGalactic/pangalactic/enterprise/pgefobject.py:1.25
--- PanGalactic/pangalactic/enterprise/pgefobject.py:1.24	Mon Sep 29 14:39:59 2003
+++ PanGalactic/pangalactic/enterprise/pgefobject.py	Wed Oct  1 13:35:27 2003
@@ -1,8 +1,8 @@
-# $Id: pgefobject.py,v 1.24 2003/09/29 18:39:59 waterbug Exp $
+# $Id: pgefobject.py,v 1.25 2003/10/01 17:35:27 waterbug Exp $
 
 """
 The Mother of all PGEF application classes.
-@version: $Revision: 1.24 $
+@version: $Revision: 1.25 $
 """
 
 # TODO:
@@ -24,7 +24,7 @@
 #               should we jettison this?
 #               Nope.
 
-__version__ = "$Revision: 1.24 $"[11:-2]
+__version__ = "$Revision: 1.25 $"[11:-2]
 
 import types
 import string
@@ -101,6 +101,11 @@
                            'Mark' and 'Drag' attributes given to
                            objects in a grid).
 
+    @type _fk:  dictionary
+    @cvar _fk:  each attribute in _refd mapped to the list of
+                _schema attributes that constitute its foreign
+                key
+
     @type _gridmap:  list of lists
     @cvar _gridmap:  defines which attributes are to be displayed
                      when the object is presented in a grid, in
@@ -110,6 +115,10 @@
 
                        - C{_gridmap = [ [display_name, attr_name, type], ...]}
 
+    @type _pk:  list
+    @cvar _pk:  _schema attributes that constitute the primary
+                key for this class
+
     @type _properties:  dictionary
     @cvar _properties:  the names and types of all attributes
                         that are computed as Python properties
@@ -148,7 +157,9 @@
                         'mod_datetime'
                        ]
     _excluded_dump = []
+    _fk = {}
     _gridmap = []
+    _pk = []
     _properties = {}
     _required = []
     _refd = {}

Index: PanGalactic/pangalactic/enterprise/productmodelversion.py
diff -u PanGalactic/pangalactic/enterprise/productmodelversion.py:1.19 PanGalactic/pangalactic/enterprise/productmodelversion.py:1.20
--- PanGalactic/pangalactic/enterprise/productmodelversion.py:1.19	Mon Sep 29 14:39:59 2003
+++ PanGalactic/pangalactic/enterprise/productmodelversion.py	Wed Oct  1 13:35:27 2003
@@ -1,10 +1,10 @@
-# $Id: productmodelversion.py,v 1.19 2003/09/29 18:39:59 waterbug Exp $
+# $Id: productmodelversion.py,v 1.20 2003/10/01 17:35:27 waterbug Exp $
 
 """
 Version-dependent product model data.
 """
 
-__version__ = "$Revision: 1.19 $"[11:-2]
+__version__ = "$Revision: 1.20 $"[11:-2]
 
 from pangalactic.enterprise.project import Project
 from pangalactic.enterprise.productversion import ProductVersion
@@ -37,6 +37,18 @@
     # comparisions between ProductModelVersion Objects
     _excluded_fields = ['create_datetime', 'pger_create_datetime', 'pgef_oid']
     _excluded_dump = ['Mark', 'Drag']
+    _fk = {'_project' : ['project_id',
+                         'project_id_context'],
+           '_of_master' : ['of_pm_id',
+                           'of_pm_id_context'],
+           '_of_version' : ['of_pv_id',
+                            'of_pm_id',
+                            'of_pm_id_context'],
+           '_of_model_master' : ['of_pmm_id',
+                                 'of_pv_id',
+                                 'of_pm_id',
+                                 'of_pm_id_context']
+          }
     # These are the fields that will appear in when an item is
     # placed in a grid.  The format for each field is [ Label,
     # attribute, field_type ].
@@ -47,12 +59,19 @@
                 ['Model\nVersion', 'self.id', 'string'],
                 ['Model\nVersion\nOwner', 'self.owner', 'string']
                ]
+    _pk = [
+           'id',
+           'of_pmm_id',
+           'of_pv_id',
+           'of_pm_id',
+           'of_pm_id_context'
+          ]
     _schema_ext = {
-                       'of_pv_id'                 : 'str',
-                       'of_pmm_id'                : 'str',
-                       'has_parts_flag'           : 'bool',
-                       'has_parts_lists_flag'     : 'bool'
-                      }
+                   'of_pv_id'                 : 'str',
+                   'of_pmm_id'                : 'str',
+                   'has_parts_flag'           : 'bool',
+                   'has_parts_lists_flag'     : 'bool'
+                  }
     _schema = _schema_ext.copy()
     _schema.update(ProductVersion._schema)
     # These are the minimum fields that must be filled in before
@@ -65,17 +84,17 @@
     # PgerObjectFactory.
     # TODO: implement _owner, _creator, etc. ...
     _refd = {
-                   # '_owner' : 'Person',
-                   # '_creator' : 'Person',
-                   # '_modifier' : 'Person',
-                   # '_pger_owner' : 'Person',
-                   # '_pger_creator' : 'Person',
-                   # '_pger_modifier' : 'Person',
-                   '_project'         : 'Project',
-                   '_of_master'       : 'ProductMaster',
-                   '_of_version'      : 'ProductVersion',
-                   '_of_model_master' : 'ProductModelMaster'
-                  }
+             # '_owner' : 'Person',
+             # '_creator' : 'Person',
+             # '_modifier' : 'Person',
+             # '_pger_owner' : 'Person',
+             # '_pger_creator' : 'Person',
+             # '_pger_modifier' : 'Person',
+             '_project'         : 'Project',
+             '_of_master'       : 'ProductMaster',
+             '_of_version'      : 'ProductVersion',
+             '_of_model_master' : 'ProductModelMaster'
+            }
     # Standard abbreviation for the class name (used in the
     # PgerObjectRegistry to compute the names of foreign key
     # constraints)

Index: PanGalactic/pangalactic/enterprise/productversion.py
diff -u PanGalactic/pangalactic/enterprise/productversion.py:1.18 PanGalactic/pangalactic/enterprise/productversion.py:1.19
--- PanGalactic/pangalactic/enterprise/productversion.py:1.18	Mon Sep 29 14:39:59 2003
+++ PanGalactic/pangalactic/enterprise/productversion.py	Wed Oct  1 13:35:27 2003
@@ -1,12 +1,12 @@
-# $Id: productversion.py,v 1.18 2003/09/29 18:39:59 waterbug Exp $
+# $Id: productversion.py,v 1.19 2003/10/01 17:35:27 waterbug Exp $
 
 """
 Version-dependent product data.
 
-@version: $Revision: 1.18 $
+@version: $Revision: 1.19 $
 """
 
-__version__ = "$Revision: 1.18 $"[11:-2]
+__version__ = "$Revision: 1.19 $"[11:-2]
 
 from pangalactic.enterprise.pgefobject import PgefObject
 from pangalactic.enterprise.project import Project
@@ -38,6 +38,11 @@
     # comparisions between ProductVersion Objects
     _excluded_fields = ['create_datetime', 'pger_create_datetime', 'pgef_oid']
     _excluded_dump = ['Mark', 'Drag']
+    _fk = {'_project' : ['project_id',
+                         'project_id_context'],
+           '_of_master' : ['of_pm_id',
+                           'of_pm_id_context']
+          }
     # These are the fields that will appear in when an item is
     # placed in a grid.  The format for each field is [ Label,
     # attribute, field_type ].
@@ -49,6 +54,11 @@
                 ['Version\nCreated','self.create_datetime', 'string'],
                 ['Version\nCreator','self.creator', 'string']
                ]
+    _pk = [
+           'id',
+           'of_pm_id',
+           'of_pm_id_context'
+          ]
     _schema_ext = {
                        'of_pm_id'           : 'str',
                        'of_pm_id_context'   : 'str',
@@ -66,9 +76,9 @@
     # is used by the PgerObjectRegistry and the
     # PgerObjectFactory.
     _refd = {
-                   '_project' : 'Project',
-                   '_of_master' : 'ProductMaster'
-                  }
+             '_project' : 'Project',
+             '_of_master' : 'ProductMaster'
+            }
  
     # Standard abbreviation for the class name (used in the
     # PgerObjectRegistry to compute the names of foreign key

From pbear at ned.gsfc.nasa.gov  Wed Oct  1 14:43:47 2003
From: pbear at ned.gsfc.nasa.gov (pbear CVS)
Date: Wed Oct  1 13:43:48 2003
Subject: [Pangalactic-commits] fixed doublearrow remove when list is empty
Message-ID: <200310011743.h91HhlUo014885@ned.gsfc.nasa.gov>

Modified files:
PanGalactic/pangalactic/utils/configuredisplay.py 1.1 1.2

Log message:
fixed doublearrow remove when list is empty


Index: PanGalactic/pangalactic/utils/configuredisplay.py
diff -u PanGalactic/pangalactic/utils/configuredisplay.py:1.1 PanGalactic/pangalactic/utils/configuredisplay.py:1.2
--- PanGalactic/pangalactic/utils/configuredisplay.py:1.1	Wed Oct  1 13:27:55 2003
+++ PanGalactic/pangalactic/utils/configuredisplay.py	Wed Oct  1 13:43:46 2003
@@ -245,6 +245,8 @@
         event.Skip()
         
     def OnRemoveAll(self, event):
+        if self.GetListctrlShown().GetItemCount() == 0:
+            return
         self.grid.BeginBatch()
         self.GetListctrlShown().DeleteAllItems()
         self.GetListctrlAvailable().DeleteAllItems()
@@ -256,7 +258,7 @@
 
     def OnRemove(self, event):
         self.MoveSelections(self.GetListctrlShown(), self.GetListctrlAvailable())
-        self.SortListItems(0,true)
+        self.SortListItems(0, true)
  
     def OnAdd(self, event):
         self.MoveSelections(self.GetListctrlAvailable(), self.GetListctrlShown())

From pbear at ned.gsfc.nasa.gov  Wed Oct  1 16:29:25 2003
From: pbear at ned.gsfc.nasa.gov (pbear CVS)
Date: Wed Oct  1 15:29:26 2003
Subject: [Pangalactic-commits] added edit to pgefgrid rclick popup menu
Message-ID: <200310011929.h91JTP8u017688@ned.gsfc.nasa.gov>

Modified files:
PanGalactic/pangalactic/client/fnord.py 1.62 1.63
PanGalactic/pangalactic/client/modules/psm/pgefgrid.py 1.57 1.58
PanGalactic/pangalactic/client/modules/psm/psmtool.py 1.113 1.114
PanGalactic/pangalactic/utils/basegrid.py 1.11 1.12

Log message:
added edit to pgefgrid rclick popup menu


Index: PanGalactic/pangalactic/client/modules/psm/pgefgrid.py
diff -u PanGalactic/pangalactic/client/modules/psm/pgefgrid.py:1.57 PanGalactic/pangalactic/client/modules/psm/pgefgrid.py:1.58
--- PanGalactic/pangalactic/client/modules/psm/pgefgrid.py:1.57	Wed Oct  1 13:24:13 2003
+++ PanGalactic/pangalactic/client/modules/psm/pgefgrid.py	Wed Oct  1 15:29:23 2003
@@ -48,32 +48,31 @@
         basegrid.BaseGrid.__init__(self, parent, id, savename, dbroot, intable)
             
     def OnRightDown(self, event):
+#        print "onrightdown"
         if event.GetId() == self.GetId():
             #print self.table.display_mapping
             #print self.table.identifiers
             menu = wxMenu()
             x,y = event.GetPosition()
-            menu.Append(basegrid.ID_POPUP_CLEAR_SELECTION, 'Clear current selections')
-            menu.AppendSeparator()
+            y -= self.GetColLabelSize()
+            curr_row = self.YToRow(y)
+#            print "curr_row", curr_row
+            if curr_row >= 0:
+                self.SelectRow(curr_row)
+
+            menu.Append(basegrid.ID_POPUP_CLEAR_SELECTION, 'Clear current selection')
+#            menu.AppendSeparator()
             if self.allow_config_flag:
                 if self.CanConfigDisplay():
                     menu.Append(basegrid.ID_POPUP_CONFIG_GRID, 'Configure grid column display...')
-                    menu.AppendSeparator()
+#                    menu.AppendSeparator()
             menu.Append(pdfoptions.ID_CREATEPDF_POPUP, 'Create PDF...') 
             menu.AppendSeparator()
             menu.Append(quickcreate.ID_POPUP_QUICKCREATE, 'Quick create...') 
+            menu.Append(basegrid.ID_POPUP_EDIT, 'Edit...') 
             
             self.PopupMenuXY(menu, x, y)
             
-            
-    def QuickCreate(self, event = None):
-        result = quickcreate.showQuickCreate(self)
-        if result:
-            print 'in psmtools, quickcreate'
-            print 'sending %s to create function' % str(result)
-        #print self.dbroot.GetParent()
-        #result = self.DataManager.quickCreate(result)
-        #print result
             
 
 #---------------------------------------------------------------------------

Index: PanGalactic/pangalactic/client/fnord.py
diff -u PanGalactic/pangalactic/client/fnord.py:1.62 PanGalactic/pangalactic/client/fnord.py:1.63
--- PanGalactic/pangalactic/client/fnord.py:1.62	Fri Sep 26 15:47:10 2003
+++ PanGalactic/pangalactic/client/fnord.py	Wed Oct  1 15:29:23 2003
@@ -139,6 +139,7 @@
                  ID_FILE_NEWPV  : "ProductVersion",
                  ID_FILE_NEWPMV : "ProductModelVersion"}
 
+
 #sys.path.append (os.path.join (os.getcwd(), "pangalactic", "client", 'modules', 'psm'))
 #sys.path.append (os.path.join (os.getcwd(), "pangalactic", "client", 'modules', 'plm'))
 

Index: PanGalactic/pangalactic/client/modules/psm/psmtool.py
diff -u PanGalactic/pangalactic/client/modules/psm/psmtool.py:1.113 PanGalactic/pangalactic/client/modules/psm/psmtool.py:1.114
--- PanGalactic/pangalactic/client/modules/psm/psmtool.py:1.113	Mon Sep 29 14:47:56 2003
+++ PanGalactic/pangalactic/client/modules/psm/psmtool.py	Wed Oct  1 15:29:23 2003
@@ -9,7 +9,7 @@
 This module is the main application code for the pgef client interface
 """
 
-__version__ = "$Revision: 1.113 $"[11:-2]
+__version__ = "$Revision: 1.114 $"[11:-2]
 
 import os
 import sys
@@ -46,7 +46,7 @@
 from pangalactic.utils.mixin_security import Security_Mixin
 from pangalactic.utils.securitymanager import actions 
 
-import pangalactic.utils.pgefexceptions
+import pangalactic.utils.basegrid as basegrid
 
 from pangalactic.client.modules.psm import toolbarpanel
 from pangalactic.client.modules.psm import searchframe
@@ -263,6 +263,11 @@
         EVT_MENU(self.product_version_grid, quickcreate.ID_POPUP_QUICKCREATE, self.QuickCreate)
         EVT_MENU(self.model_master_grid, quickcreate.ID_POPUP_QUICKCREATE, self.QuickCreate)
 
+        EVT_MENU(self.itemgrid, basegrid.ID_POPUP_EDIT, self.onGridPopupEdit)
+        EVT_MENU(self.product_master_grid, basegrid.ID_POPUP_EDIT, self.onGridPopupEdit)
+        EVT_MENU(self.product_version_grid, basegrid.ID_POPUP_EDIT, self.onGridPopupEdit)
+        EVT_MENU(self.model_master_grid, basegrid.ID_POPUP_EDIT, self.onGridPopupEdit)
+
         EVT_RIGHT_DOWN(self.tree, self.OnRightDown)
         EVT_TREE_ITEM_EXPANDING(self, self.tID, self.OnItemExpanding)
         #EVT_TREE_ITEM_COLLAPSED(self, self.tID, self.OnItemCollapsed)
@@ -295,11 +300,11 @@
             currentgrid = self.product_version_grid
         elif GRIDLIST[currentpage] == "ProductMaster":
             currentgrid = self.product_master_grid
-        return currentgrid
+        return (currentgrid, GRIDLIST[currentpage])
             
 
     def ExportProperties(self):
-        currentgrid = self.GetCurrentGrid()
+        currentgrid, gridname = self.GetCurrentGrid()
         nrows = currentgrid.GetNumberRows()   # sometimes the grid has one empty row
         if nrows == 0:
             dlg = wxMessageDialog(self, "There is no point generating an Excel file.  The grid is empty.",
@@ -428,19 +433,6 @@
             
             
     def FillEditFrame(self, nodedata):
-##        if nodedata[0] == "GRID":
-##            print "changing nodedata[0] from GRID to TOPLEVEL. Why?"
-##            nodedata[0] = 'TOPLEVEL'
-#
-#        # don't change the notebook page if the editor is already up
-#        pane = 1
-#        if self.itemeditform:
-##            if self.itemeditform.IsShown():
-#            pane = self.itemeditform.editnb.GetSelection()
-#        
-#        self.ShowEditFrame(pane, splitter = 1, nodedata = nodedata)
-#        self.itemeditform.SetMode(pane)
-
         pane = 1                
         product_id = nodedata[1]
         self.ShowEditFrame(pane, 1, ["TREE", product_id, "ProductModelVersion"])
@@ -580,7 +572,7 @@
        
 
     def OnGridToPdf(self, event = None):
-        currentgrid = self.GetCurrentGrid()
+        currentgrid, gridname = self.GetCurrentGrid()
         nrows = currentgrid.GetNumberRows()   # sometimes the grid has one empty row
         if nrows == 0:
             dlg = wxMessageDialog(self, "The grid is empty.  There is no point generating a PDF.", "A message from PGEF",
@@ -937,7 +929,7 @@
         self.SelectGridRowByItemId(itemid)
 
     def SelectGridRowByItemId(self, itemid):
-        currentgrid = self.GetCurrentGrid()
+        currentgrid, gridname = self.GetCurrentGrid()
         rowcount = currentgrid.GetNumberRows()
         currentgrid.ClearSelection()
         for row in range(0, rowcount):
@@ -1532,6 +1524,15 @@
             wxEndBusyCursor()
             wxSafeYield()
 
+    def onGridPopupEdit(self, event):
+        currentgrid, gridname = self.GetCurrentGrid()
+        selectedrow = currentgrid.GetSelectedRows()
+#        print "selectedrows", selectedrow
+        if selectedrow:
+#            print "selectedrow", selectedrow[0]
+            product_id = currentgrid.GetObjectOid(selectedrow[0])
+            self.processGridDClick(product_id, gridname, selectedrow)
+
 
     def onPMVGridDClick(self, event):
         product_id = event.GetEventObject().GetObjectOid(event.GetRow())
@@ -1578,9 +1579,9 @@
                 print "pane???  what pane???"
                 
             self.ShowEditFrame(pane, 1, ["GRID", product_id, product_type])
-            self.itemeditform.SetMode(0)
-            self.itemgrid.SelectRow(row_ndx)
-            self.topWindow.toppanel.GetItemWidget().SetSelection(row_ndx + 1)
+            self.itemeditform.SetMode(pane)
+#            self.itemgrid.SelectRow(row_ndx)
+#            self.topWindow.toppanel.GetItemWidget().SetSelection(row_ndx + 1)
             wxEndBusyCursor()
             dlg.Destroy()
 
@@ -1594,8 +1595,8 @@
             else:
                 print "pane???  what pane???"
             self.ShowEditFrame(pane, 1, ["GRID", product_id, product_type])
-            self.itemeditform.SetMode(0)
-            self.itemgrid.SelectRow(row_ndx)
+            self.itemeditform.SetMode(pane)
+#            self.itemgrid.SelectRow(row_ndx)
 
         else:
             dlg = wxMessageDialog(self, "I'm sorry Steve, I can't do that...", "Unable to comply",
@@ -1604,7 +1605,7 @@
             wxSafeYield()
             
     def QuickCreate(self, event = None):
-        #print "psmtool.quickcreate"
+        print "psmtool.quickcreate"
         create_results = quickcreate.showQuickCreate(self)
         if create_results:
             #print 'in psmtools, quickcreate'

Index: PanGalactic/pangalactic/utils/basegrid.py
diff -u PanGalactic/pangalactic/utils/basegrid.py:1.11 PanGalactic/pangalactic/utils/basegrid.py:1.12
--- PanGalactic/pangalactic/utils/basegrid.py:1.11	Wed Oct  1 13:24:14 2003
+++ PanGalactic/pangalactic/utils/basegrid.py	Wed Oct  1 15:29:24 2003
@@ -16,6 +16,7 @@
 
 ID_POPUP_CONFIG_GRID = wxNewId()
 ID_POPUP_CLEAR_SELECTION = wxNewId()
+ID_POPUP_EDIT = wxNewId()
 
 class MyCustomRenderer(wxPyGridCellRenderer):
     def __init__(self,bmp):
@@ -284,35 +285,6 @@
 ##        self.EndBatch()           
         
         
-##    def DumpToPdf(self, event = None):
-##        gridrows = self.GetNumberRows()
-##        if gridrows <= 0:
-##            return
-##        dlg = pdfoptions.PDFOptions(self)
-##        dlg.Layout()
-##        result = dlg.ShowModal()
-##        if result == wxID_OK:
-##            filename = dlg.filename.GetValue()
-##            if not filename.endswith('.pdf'):
-##                filename += '.pdf'
-            
-##            landscape = dlg.landscape.GetValue()
-##            temp = objectreport.ObjectReport(filename, 
-##                                                self.table._data,
-##                                                landscape) #,
-##                                                #dlg.pdftitle.GetValue(), 
-##                                                #dlg.footertext.GetValue())
-            
-            
-##            temp.table_format = dlg.table_or_list.GetValue()
-##            temp.Title = dlg.pdftitle.GetValue()
-##            temp.footer_text = dlg.footertext.GetValue()
-                
-##            if dlg.show_gridlines.GetValue():
-##                temp.showGridLines()
-                
-##            temp.display_map = self.DisplayMapping
-##            temp.Generate()
             
     def DumpToPdf(self, event = None):
         gridrows = self.GetNumberRows()

From pbear at ned.gsfc.nasa.gov  Wed Oct  1 17:45:43 2003
From: pbear at ned.gsfc.nasa.gov (pbear CVS)
Date: Wed Oct  1 16:45:46 2003
Subject: [Pangalactic-commits] changed Exit to Close on local database
	browser
Message-ID: <200310012045.h91Kjhj8019771@ned.gsfc.nasa.gov>

Modified files:
PanGalactic/pangalactic/client/fnord.py 1.63 1.64
PanGalactic/pangalactic/client/modules/psm/pgefgrid.py 1.58 1.59
PanGalactic/pangalactic/client/modules/psm/psmtool.py 1.114 1.115

Log message:
changed Exit to Close on local database browser


Index: PanGalactic/pangalactic/client/modules/psm/psmtool.py
diff -u PanGalactic/pangalactic/client/modules/psm/psmtool.py:1.114 PanGalactic/pangalactic/client/modules/psm/psmtool.py:1.115
--- PanGalactic/pangalactic/client/modules/psm/psmtool.py:1.114	Wed Oct  1 15:29:23 2003
+++ PanGalactic/pangalactic/client/modules/psm/psmtool.py	Wed Oct  1 16:45:42 2003
@@ -9,7 +9,7 @@
 This module is the main application code for the pgef client interface
 """
 
-__version__ = "$Revision: 1.114 $"[11:-2]
+__version__ = "$Revision: 1.115 $"[11:-2]
 
 import os
 import sys
@@ -272,7 +272,8 @@
         EVT_TREE_ITEM_EXPANDING(self, self.tID, self.OnItemExpanding)
         #EVT_TREE_ITEM_COLLAPSED(self, self.tID, self.OnItemCollapsed)
         EVT_TREE_SEL_CHANGED(self, self.tID, self.OnTreeActivate)
-        EVT_LEFT_DCLICK(self.tree, self.OnLeftDClick) 
+#        EVT_LEFT_DCLICK(self.tree, self.OnLeftDClick) 
+        EVT_LEFT_DCLICK(self.tree, self.OnEditComponent) 
         EVT_COMBOBOX(self, ID_CHOICE_VIEW, self.SelectView)
         
         EVT_NOTEBOOK_PAGE_CHANGED(self, self.remainingSpace.GetId(), self.pageChanged)
@@ -382,13 +383,13 @@
 #            menu.Append(ID_TREE_RIGHTPOPUP_TOPLEVEL, 'Show Top Level Items', "Display the default hierarchy")
 #            menu.SetHelpString(ID_TREE_RIGHTPOPUP_TOPLEVEL, "Display the toplevel hierarchy")
             
-        menu.Append(ID_TREE_RIGHTPOPUP_EDIT, 'Edit/View Product', "Edit this product")
-        menu.Append(ID_TREE_RIGHTPOPUP_SHOWPROJECT, 'View Project Data', "Show the project data window")
-        menu.Append(ID_TREE_RIGHTPOPUP_DUMPTOPDF, 'Create PDF...', 'Show PDF Options dialog')
+        menu.Append(ID_TREE_RIGHTPOPUP_EDIT, 'Edit...', "Edit this product")
+        menu.Append(ID_TREE_RIGHTPOPUP_SHOWPROJECT, 'View Project Data...', "View project data")
+        menu.Append(ID_TREE_RIGHTPOPUP_DUMPTOPDF, 'Generate PDF...', 'Show the PDF creation options')
         menu.SetHelpString(ID_TREE_RIGHTPOPUP_EDIT, "Edit this product")
-        menu.SetHelpString(ID_TREE_RIGHTPOPUP_SHOWPROJECT, "Show the project data window")
+        menu.SetHelpString(ID_TREE_RIGHTPOPUP_SHOWPROJECT, "View project data")
         menu.AppendSeparator()
-        menu.Append(ID_TREE_RIGHTPOPUP_QUICKCREATE, 'Quick create...')
+        menu.Append(ID_TREE_RIGHTPOPUP_QUICKCREATE, 'Quick create...', "Create a set of products")
             
         self.PopupMenuXY(menu, event.GetX(), event.GetY())
         
@@ -432,26 +433,30 @@
             pass
             
             
-    def FillEditFrame(self, nodedata):
-        pane = 1                
-        product_id = nodedata[1]
-        self.ShowEditFrame(pane, 1, ["TREE", product_id, "ProductModelVersion"])
-
-
-    def OnLeftDClick(self, event):
-        point = event.GetPosition()
-        tree = event.GetEventObject()
-        node, flags = tree.HitTest(point)
-        if node.IsOk():
-            nodedata = tree.GetPyData(node)
-            if node == tree.GetRootItem():
-                if nodedata[1] == "ROOT":
-                    return
-            wxSafeYield()
-            wxBeginBusyCursor()
-
-            self.FillEditFrame(nodedata)
-            wxEndBusyCursor()
+#    def FillEditFrame(self, nodedata):
+#        print "psmtool.filleditframe", nodedata
+#        pane = 1                
+#        product_id = nodedata[1]
+#        print "product_id", product_id
+#        self.ShowEditFrame(pane, 1, ["TREE", product_id, "ProductModelVersion"])
+#        self.itemeditform.SetMode(pane)
+
+## duplicate of OnEditComponent -vwk
+##
+##    def OnLeftDClick(self, event):
+##        point = event.GetPosition()
+##        tree = event.GetEventObject()
+##        node, flags = tree.HitTest(point)
+##        if node.IsOk():
+##            nodedata = tree.GetPyData(node)
+##            if node == tree.GetRootItem():
+##                if nodedata[1] == "ROOT":
+##                    return
+
+##            wxSafeYield()
+##            wxBeginBusyCursor()
+##            self.FillEditFrame(nodedata)
+##            wxEndBusyCursor()
         
 
     def RebuildMainTree(self):
@@ -866,15 +871,17 @@
             self.ToolMenu = None
         mb.Refresh()
 
-    def ShowDBBrowser(self):
-        tmpsize = wxSize(750, 500)
-        dbframe = toolframe.toolFrame(self, -1, 'DB Browser', wxDefaultPosition, tmpsize)
-        dbframe.mainpanel = dbbrowser.zodbbrowser(dbframe, -1, zodbroot = self.DataManager.localDB.dbroot)
-        dbframe.mainpanel.FillChoice()
-        dbframe.mainpanel.SelectDict("IDRDict")
-        dbframe.mainpanel.OnRefresh()
-        dbframe.CentreOnParent()
-        dbframe.Show(true)
+##    def ShowDBBrowser(self):
+##        tmpsize = wxSize(750, 500)
+##        dbframe = toolframe.toolFrame(self, -1, 'Local Database Browser', wxDefaultPosition, tmpsize)
+##        dbframe.menuBar.SetLabel(toolframe.ID_FILE_EXIT, '&Close')
+##        dbframe.menuBar.SetHelpString(toolframe.ID_FILE_EXIT, "Close this window")
+##        dbframe.mainpanel = dbbrowser.zodbbrowser(dbframe, -1, zodbroot = self.DataManager.localDB.dbroot)
+##        dbframe.mainpanel.FillChoice()
+##        dbframe.mainpanel.SelectDict("IDRDict")
+##        dbframe.mainpanel.OnRefresh()
+##        dbframe.CentreOnParent()
+##        dbframe.Show(true)
         
     def CloseDown(self):
         if self.DataManager.user._loggedin:
@@ -1512,15 +1519,24 @@
 
             
     def OnEditComponent(self, event):
+        print "psmtool.oneditcomponent"
         node = self.tree.GetSelection()
         if node.IsOk():
             nodedata = self.tree.GetPyData(node)
+            print "nodedata", nodedata
             if node == self.tree.GetRootItem():
                 if nodedata[1] == "ROOT":
                     return
 
             wxBeginBusyCursor()
-            self.FillEditFrame(nodedata)
+
+#            self.FillEditFrame(nodedata)  # only called here now, so moved code here.
+
+            pane = 1                
+            product_id = nodedata[1]
+#            print "product_id", product_id
+            self.ShowEditFrame(pane, 1, ["TREE", product_id, "ProductModelVersion"])
+            self.itemeditform.SetMode(pane)
             wxEndBusyCursor()
             wxSafeYield()
 

Index: PanGalactic/pangalactic/client/fnord.py
diff -u PanGalactic/pangalactic/client/fnord.py:1.63 PanGalactic/pangalactic/client/fnord.py:1.64
--- PanGalactic/pangalactic/client/fnord.py:1.63	Wed Oct  1 15:29:23 2003
+++ PanGalactic/pangalactic/client/fnord.py	Wed Oct  1 16:45:41 2003
@@ -725,8 +725,9 @@
 
     def OnDBBrowser(self, event):
         tmpsize = wxSize(750, 500)
-        testframe = toolframe.toolFrame(self, -1, 'DB Browser', wxDefaultPosition, tmpsize)
-        filename = self.DataManager.localDBfilename
+        testframe = toolframe.toolFrame(self, -1, 'Local Database Browser', wxDefaultPosition, tmpsize)
+        testframe.menuBar.SetLabel(toolframe.ID_FILE_EXIT, '&Close')
+        testframe.menuBar.SetHelpString(toolframe.ID_FILE_EXIT, "Close this window")
         testframe.mainpanel = dbbrowser.zodbbrowser(testframe, -1, zodbroot = self.DataManager.dbroot)
         testframe.mainpanel.FillChoice()
         testframe.CentreOnParent()

Index: PanGalactic/pangalactic/client/modules/psm/pgefgrid.py
diff -u PanGalactic/pangalactic/client/modules/psm/pgefgrid.py:1.58 PanGalactic/pangalactic/client/modules/psm/pgefgrid.py:1.59
--- PanGalactic/pangalactic/client/modules/psm/pgefgrid.py:1.58	Wed Oct  1 15:29:23 2003
+++ PanGalactic/pangalactic/client/modules/psm/pgefgrid.py	Wed Oct  1 16:45:42 2003
@@ -66,7 +66,7 @@
                 if self.CanConfigDisplay():
                     menu.Append(basegrid.ID_POPUP_CONFIG_GRID, 'Configure grid column display...')
 #                    menu.AppendSeparator()
-            menu.Append(pdfoptions.ID_CREATEPDF_POPUP, 'Create PDF...') 
+            menu.Append(pdfoptions.ID_CREATEPDF_POPUP, 'Generate PDF...') 
             menu.AppendSeparator()
             menu.Append(quickcreate.ID_POPUP_QUICKCREATE, 'Quick create...') 
             menu.Append(basegrid.ID_POPUP_EDIT, 'Edit...') 

From waterbug at ned.gsfc.nasa.gov  Thu Oct  2 13:19:59 2003
From: waterbug at ned.gsfc.nasa.gov (waterbug CVS)
Date: Thu Oct  2 12:20:03 2003
Subject: [Pangalactic-commits] Default for refd objs is None;
	constructor kwargs for refd objs are now same
	as attr names for them.
Message-ID: <200310021619.h92GJxNX030815@ned.gsfc.nasa.gov>

Modified files:
PanGalactic/pangalactic/enterprise/assemblycomponentusage.py 1.16 1.17
PanGalactic/pangalactic/enterprise/pgefobject.py 1.25 1.26
PanGalactic/pangalactic/enterprise/productmaster.py 1.16 1.17
PanGalactic/pangalactic/enterprise/productmodelmaster.py 1.17 1.18
PanGalactic/pangalactic/enterprise/productmodelversion.py 1.20 1.21
PanGalactic/pangalactic/enterprise/productversion.py 1.19 1.20

Log message:
Default for refd objs is None; constructor kwargs for refd objs are now same as attr names for them.


Index: PanGalactic/pangalactic/enterprise/pgefobject.py
diff -u PanGalactic/pangalactic/enterprise/pgefobject.py:1.25 PanGalactic/pangalactic/enterprise/pgefobject.py:1.26
--- PanGalactic/pangalactic/enterprise/pgefobject.py:1.25	Wed Oct  1 13:35:27 2003
+++ PanGalactic/pangalactic/enterprise/pgefobject.py	Thu Oct  2 12:19:57 2003
@@ -1,8 +1,8 @@
-# $Id: pgefobject.py,v 1.25 2003/10/01 17:35:27 waterbug Exp $
+# $Id: pgefobject.py,v 1.26 2003/10/02 16:19:57 waterbug Exp $
 
 """
 The Mother of all PGEF application classes.
-@version: $Revision: 1.25 $
+@version: $Revision: 1.26 $
 """
 
 # TODO:
@@ -24,7 +24,7 @@
 #               should we jettison this?
 #               Nope.
 
-__version__ = "$Revision: 1.25 $"[11:-2]
+__version__ = "$Revision: 1.26 $"[11:-2]
 
 import types
 import string
@@ -216,24 +216,33 @@
         self.state = kw.get('state', '')
         # create an oid if one isn't passed in ...
         self.pgef_oid = kw.get('pgef_oid', oid.generate(email))
-        # use schema, if they are passed in ...
-        if 'schema' in kw:
-            self._schema = kw.get('schema')
+        # use schema, pk, and fk if they are passed in; otherwise, use the
+        # class's _schema, _fk, and _pk ...
+        self._schema = kw.get('schema', self._schema)
+        self._fk = kw.get('fk', self._fk)
+        self._pk = kw.get('pk', self._pk)
         # loop over _schema; set values from kw args or
         # defaults ...
         for a in self._schema:
             if a != 'pgef_oid' and self._schema[a] == 'str':
                 setattr(self, a, kw.get(a, ''))
-                # self.__dict__[a] = kw.get(a, '')
             elif self._schema[a] == 'DateTime':
                 setattr(self, a, kw.get(a, None))
-                # self.__dict__[a] = kw.get(a, None)
             elif self._schema[a] == 'int':
                 setattr(self, a, kw.get(a, 0))
-                # self.__dict__[a] = kw.get(a, 0)
             elif self._schema[a] == 'bool':
                 setattr(self, a, kw.get(a, False))
-                # self.__dict__[a] = kw.get(a, False)
+        # loop over _refd; set values from kw args or
+        # defaults ...
+        for a in self._refd:
+            if kw.get(a).__class__.__name__ == self._refd[a]:
+                setattr(self, a, kw[a])
+            else:
+                setattr(self, a, None)
+                ###### DEBUGGING ########
+                # print '%s passed in is not %s type ...' % (a, 
+                #                                self._refd[a])
+                # print 'setting %s to None.' % a
         # if no oid is passed in, assume we are a new instance,
         # and record our creation/mod datetime ...
         if not kw.get('pgef_oid'):
@@ -327,23 +336,16 @@
         Output a human-readable string presentation for a
         PgefObject.
         """
-##        outstring = '\n_____________________________________\n'
-##        outstring += self.__class__.__name__
-##        attribs = self.__dict__.keys()
-##        attribs.sort()
-##        for a in attribs:
-##            astring = "   .%s = %s" % (a, str(self.__dict__[a]))
-##            outstring = outstring + "\n" + astring
-##        outstring += '\n_____________________________________\n'
-
-        outstring = "\n\n"
+        outstring = "\n"
         outstring += self.__class__.__name__
         attribs = self.__dict__.keys()
         attribs.sort()
         for a in attribs:
             if isinstance(self.__dict__[a], PgefObject):
-                astring = "   .%s = %s (%s)" % \
-                          (a, self.__dict__[a].__class__.__name__, self.__dict__[a].pgef_oid)
+                astring = "   .%s = %s (pgef_oid=%s)" % \
+                          (a, 
+                           repr(self.__dict__[a]),
+                           self.__dict__[a].pgef_oid)
             else:
                 astring = "   .%s = %s" % (a, str(self.__dict__[a]))
             outstring = outstring + "\n" + astring
@@ -355,7 +357,7 @@
         Populate certain attributes of a PgefObject that should
         be populated at creation time.
         """
-        self.project = currentproject
+        self._project = currentproject
             # project should be pushed down into specific
             # subtypes; doesn't make sense for all objects
             # also:  now every project has to have a

Index: PanGalactic/pangalactic/enterprise/productversion.py
diff -u PanGalactic/pangalactic/enterprise/productversion.py:1.19 PanGalactic/pangalactic/enterprise/productversion.py:1.20
--- PanGalactic/pangalactic/enterprise/productversion.py:1.19	Wed Oct  1 13:35:27 2003
+++ PanGalactic/pangalactic/enterprise/productversion.py	Thu Oct  2 12:19:57 2003
@@ -1,12 +1,12 @@
-# $Id: productversion.py,v 1.19 2003/10/01 17:35:27 waterbug Exp $
+# $Id: productversion.py,v 1.20 2003/10/02 16:19:57 waterbug Exp $
 
 """
 Version-dependent product data.
 
-@version: $Revision: 1.19 $
+@version: $Revision: 1.20 $
 """
 
-__version__ = "$Revision: 1.19 $"[11:-2]
+__version__ = "$Revision: 1.20 $"[11:-2]
 
 from pangalactic.enterprise.pgefobject import PgefObject
 from pangalactic.enterprise.project import Project
@@ -92,72 +92,27 @@
     _pmm_cache = []
     _pmm_cache_datetime = ''
 
-    def __init__(self, email=None, schema=_schema,
-                 project=None, pm=None, **kw):
+    def __init__(self, email=None, schema=_schema, **kw):
         """
         Optional keyword arguments:
-        - pm is a ProductMaster object.
-        - project is a Project object
         - id is required to be unique within the context of the
             _of_master.id and _of_master.id_context.
         - other recognized kw args for ProductVersion are:
+            - _project (a Project instance)
+            - _of_master (a ProductMaster instance)
             - email
             - name
             - has_docs_flag
         """
         PgefObject.__init__(self, email=email,
                             schema=schema, **kw)
-        # if a ProductMaster is passed in, use it ...
-        if pm.__class__.__name__ == 'ProductMaster':
-            self._of_master = pm
-        # if not, create one ...
-        elif kw.get('pm_id'):
-            pmkw = kw.copy()
-            pmkw['id'] = kw['pm_id']
-            pmkw['id_context'] = kw.get('pm_id_context', 'PGER')
-            self._of_master = PM(**pmkw)
-        else:
-            pmprojid  = kw.get('project_id', 'NOPROJECT')
-            pmprojidc = kw.get('project_id_context', 'NOCONTEXT')
-            pmid      = kw.get('of_pm_id', 'Default PN')
-            pmidc     = kw.get('of_pm_id_context', 'PGER')
-            self._of_master = PM(project_id=pmprojid,
-                                 project_id_context=pmprojidc,
-                                 id=pmid,
-                                 id_context=pmidc)
-        # set "foreign key" attributes from referenced objects
-        self.of_pm_id = self._of_master.id
-        self.of_pm_id_context = self._of_master.id_context
-        # default is for project to be the same as the
-        # _of_master's project ...
-        self._project = self._of_master._project
-        self.project_id = self._project.id
-        self.project_id_context = self._project.id_context
-        # however, a passed-in Project object or keywords will
-        # override this ...
-        if project.__class__.__name__ == 'Project':
-            self._project = project
-            self.project_id = project.id
-            self.project_id_context = project.id_context
-            kw['project_id'] = project.id
-            kw['project_id_context'] = project.id_context
-            # Must set project kw args here for 2 reasons:
-            # (1) if a Project object and project_id are both
-            # passed in, the object overrides
-            # (2) for use in the creation of a default
-            # ProductMaster (see below), if necessary.
-        elif kw.get('project_id'):
-        # else, if keyword args are present, use them ...
-            projid  = kw.get('project_id')
-            projidc = kw.get('project_id_context', 'PGER')
-                      # (may want to raise an exception if a
-                      # project_id_context is not present)
-            email     = kw.get("email", "unknown")
-            self._project = Project(email=email,
-                                    id=projid,
-                                    id_context=projidc)
-            self.project_id = self._project.id
-            self.project_id_context = self._project.id_context
-        # If no id is passed in, assign default revision of '1'
-        self.id = kw.get('id', '1')
- 
+        pm = getattr(self, '_of_master', None)
+        if pm:
+            self.of_pm_id = pm.id
+            self.of_pm_id_context = pm.id_context
+            # inherit project only if I didn't get one from init
+            if not getattr(self, '_project', None):
+                self._project = pm._project
+                self.project_id = pm.project_id
+                self.project_id_context = pm.project_id_context
+

Index: PanGalactic/pangalactic/enterprise/assemblycomponentusage.py
diff -u PanGalactic/pangalactic/enterprise/assemblycomponentusage.py:1.16 PanGalactic/pangalactic/enterprise/assemblycomponentusage.py:1.17
--- PanGalactic/pangalactic/enterprise/assemblycomponentusage.py:1.16	Wed Oct  1 13:35:27 2003
+++ PanGalactic/pangalactic/enterprise/assemblycomponentusage.py	Thu Oct  2 12:19:57 2003
@@ -1,11 +1,11 @@
-# $Id: assemblycomponentusage.py,v 1.16 2003/10/01 17:35:27 waterbug Exp $
+# $Id: assemblycomponentusage.py,v 1.17 2003/10/02 16:19:57 waterbug Exp $
 
 """
 The relationship between an assembled product and a part that is
 used in it.
 """
 
-__version__ = "$Revision: 1.16 $"[11:-2]
+__version__ = "$Revision: 1.17 $"[11:-2]
 
 from pangalactic.utils import oid
 from pangalactic.enterprise.pgefobject import PgefObject
@@ -77,8 +77,7 @@
     # constraints)
     _std_abbrev = 'acu'
 
-    def __init__(self, email=None, schema=_schema,
-                 assembly=None, component=None, **kw):
+    def __init__(self, email=None, schema=_schema, **kw):
         """
         The Assembly Component Usage represents the relationship
         between a product (the I{component}) and another product
@@ -109,45 +108,18 @@
         """
         PgefObject.__init__(self, email=email, 
                             schema=schema, **kw)
-        if assembly.__class__.__name__ == 'ProductModelVersion':
-            self._assembly = assembly
-        else:
-            # if no assembly PMV is passed in, create one from
-            # keyword args ...
-            pmvid    = kw.get('assembly_id')
-            pmvpmmid = kw.get('assembly_of_pmm_id')
-            pmvpvid  = kw.get('assembly_of_pv_id')
-            pmvpmid  = kw.get('assembly_of_pm_id')
-            pmvpmidc = kw.get('assembly_of_pm_id_context')
-            self._assembly  = PMV(id=pmvid,
-                                  of_pmm_id=pmvpmmid,
-                                  of_pv_id=pmvpvid,
-                                  of_pm_id=pmvpmid,
-                                  of_pm_id_context=pmvpmidc)
-        if component.__class__.__name__ == 'ProductModelVersion':
-            self._component = component
-        else:
-            # if no component PMV is passed in, create one from
-            # keyword args ...
-            pmvid    = kw.get('component_id')
-            pmvpmmid = kw.get('component_of_pmm_id')
-            pmvpvid  = kw.get('component_of_pv_id')
-            pmvpmid  = kw.get('component_of_pm_id')
-            pmvpmidc = kw.get('component_of_pm_id_context')
-            self._component  = PMV(id=pmvid,
-                                   of_pmm_id=pmvpmmid,
-                                   of_pv_id=pmvpvid,
-                                   of_pm_id=pmvpmid,
-                                   of_pm_id_context=pmvpmidc)
-        # set "foreign key" attributes from referenced objects:
-        self.assembly_id                = self._assembly.id
-        self.assembly_of_pmm_id         = self._assembly.of_pmm_id
-        self.assembly_of_pv_id          = self._assembly.of_pv_id
-        self.assembly_of_pm_id          = self._assembly.of_pm_id
-        self.assembly_of_pm_id_context  = self._assembly.of_pm_id_context
-        self.component_id               = self._component.id
-        self.component_of_pmm_id        = self._component.of_pmm_id
-        self.component_of_pv_id         = self._component.of_pv_id
-        self.component_of_pm_id         = self._component.of_pm_id
-        self.component_of_pm_id_context = self._component.of_pm_id_context
+        assy = getattr(self, '_assembly', None)
+        comp = getattr(self, '_component', None)
+        if assy:
+            self.assembly_id                = assy.id
+            self.assembly_of_pmm_id         = assy.of_pmm_id
+            self.assembly_of_pv_id          = assy.of_pv_id
+            self.assembly_of_pm_id          = assy.of_pm_id
+            self.assembly_of_pm_id_context  = assy.of_pm_id_context
+        if comp: 
+            self.component_id               = comp.id
+            self.component_of_pmm_id        = comp.of_pmm_id
+            self.component_of_pv_id         = comp.of_pv_id
+            self.component_of_pm_id         = comp.of_pm_id
+            self.component_of_pm_id_context = comp.of_pm_id_context
 

Index: PanGalactic/pangalactic/enterprise/productmaster.py
diff -u PanGalactic/pangalactic/enterprise/productmaster.py:1.16 PanGalactic/pangalactic/enterprise/productmaster.py:1.17
--- PanGalactic/pangalactic/enterprise/productmaster.py:1.16	Wed Oct  1 13:35:27 2003
+++ PanGalactic/pangalactic/enterprise/productmaster.py	Thu Oct  2 12:19:57 2003
@@ -1,10 +1,10 @@
-# $Id: productmaster.py,v 1.16 2003/10/01 17:35:27 waterbug Exp $
+# $Id: productmaster.py,v 1.17 2003/10/02 16:19:57 waterbug Exp $
 
 """
 Version-independent product data.
 """
 
-__version__ = "$Revision: 1.16 $"[11:-2]
+__version__ = "$Revision: 1.17 $"[11:-2]
 
 from pangalactic.enterprise.pgefobject import PgefObject
 from pangalactic.enterprise.project import Project
@@ -77,8 +77,7 @@
     _pv_cache = []
     _pv_cache_datetime = ''
 
-    def __init__(self, email=None, schema=_schema,
-                 project=None, **kw):
+    def __init__(self, email=None, schema=_schema, **kw):
         """
         Initialize
             - id must be unique within the id_context 
@@ -86,33 +85,16 @@
               and project)
             - id_context must be a valid id_context
               (default is the user's organization identifier)
-            - project is a Project object
             - email is the creator's email address
             - other recognized kw args for ProductMaster are:
+                - _project (a Project object)
                 - name
                 - has_docs_flag
         """
         PgefObject.__init__(self, email=email,
                             schema=schema, **kw)
-        # ... if project_id/id_context are passed in, use them;
-        if project.__class__.__name__ == 'Project':
-            self._project = project
-        elif kw.get('project_id'):
-            # or, if kw args are present, use them ...
-            # of course, need to check whether the project exists or
-            # whether the user has permissions to create a project
-            # ...
-            projid = kw.get('project_id')
-            projidc = kw.get('project_id_context', 'PGER')
-                      # (may want to raise an exception if a
-                      # project_id_context is not present)
-            email = kw.get("email", "unknown")
-            self._project = Project(email=email,
-                                    id=projid,
-                                    id_context=projidc)
-        else:
-            # last resort:  create the default 'NOPROJECT' ...
-            self._project = Project()
-        self.project_id = self._project.id
-        self.project_id_context = self._project.id_context
+        project = getattr(self, '_project', None)
+        if project:
+            self.project_id = project.id
+            self.project_id_context = project.id_context
 

Index: PanGalactic/pangalactic/enterprise/productmodelmaster.py
diff -u PanGalactic/pangalactic/enterprise/productmodelmaster.py:1.17 PanGalactic/pangalactic/enterprise/productmodelmaster.py:1.18
--- PanGalactic/pangalactic/enterprise/productmodelmaster.py:1.17	Wed Oct  1 13:35:27 2003
+++ PanGalactic/pangalactic/enterprise/productmodelmaster.py	Thu Oct  2 12:19:57 2003
@@ -1,4 +1,4 @@
-# $Id: productmodelmaster.py,v 1.17 2003/10/01 17:35:27 waterbug Exp $
+# $Id: productmodelmaster.py,v 1.18 2003/10/02 16:19:57 waterbug Exp $
 
 """
 Version-independent product model data.
@@ -10,7 +10,7 @@
       default one? ...
 """
 
-__version__ = "$Revision: 1.17 $"[11:-2]
+__version__ = "$Revision: 1.18 $"[11:-2]
 
 from pangalactic.enterprise.project import Project
 from pangalactic.enterprise.productmaster import ProductMaster
@@ -96,16 +96,15 @@
     # constraints)
     _std_abbrev = 'pmm'
 
-    def __init__(self, email=None, schema=_schema,
-                 project=None, pv=None, **kw):
+    def __init__(self, email=None, schema=_schema, **kw):
         """Parameters:
-        - pv is a ProductVersion object.
-        - project is a Project object
         - email is the user's email address
         - id is required to be unique within the context of the
             _of_version.id, _of_version._of_master.id, and
             _of_version._of_master.id_context.
         - other recognized kw args for ProductModelMaster are:
+            - _of_version is a ProductVersion instance
+            - _project is a Project instance
             - name
             - model_view ('design', 'usage', 'manufacturing',
                           etc.)
@@ -113,59 +112,16 @@
             - has_docs_flag
         """
         ProductMaster.__init__(self, email=email,
-                               schema=schema,
-                               project=project, **kw)
-        # if a Project object has been passed in, use it ...
-        if project.__class__.__name__ == 'Project':
-            self._project = project
-            self.project_id = project.id
-            self.project_id_context = project.id_context
-            kw['project_id'] = project.id
-            kw['project_id_context'] = project.id_context
-            # Must set project kw args here for 2 reasons:
-            # (1) if a Project object and project_id are both
-            # passed in, the object overrides
-            # (2) for use in the creation of a default
-            # ProductVersion (see below), if necessary.
-        elif kw.get('project_id'):
-        # or, if keyword args are present, use them ...
-            projid  = kw.get('project_id')
-            projidc = kw.get('project_id_context', 'PGER')
-            self._project = Project(id=projid,
-                                    id_context=projidc)
-            self.project_id = self._project.id
-            self.project_id_context = self._project.id_context
-        else:
-            self._project = None
-        # if a pv is passed in, use it ...
-        if pv.__class__.__name__ == 'ProductVersion':
-            self._of_version = pv
-        else:
-            # if not, create one ...
-            pvprojid  = kw.get('project_id', 'NOPROJECT')
-            pvprojidc = kw.get('project_id_context', 'NOCONTEXT')
-            pvid      = kw.get('of_pv_id', '1')
-            pvpmid    = kw.get('of_pm_id', 'Default PN')
-            pvpmidc   = kw.get('of_pm_id_context', 'PGER')
-            self._of_version = PV(project_id=pvprojid, 
-                                  project_id_context=pvprojidc,
-                                  id=pvid,
-                                  of_pm_id=pvpmid,
-                                  of_pm_id_context=pvpmidc)
-        # pull in _of_master from the _of_version so we don't
-        # have to go nuts with blah.blah.blah to get to
-        # attributes of my parents ...
-        self._of_master = self._of_version._of_master
-        # if self._project has not be set above, use
-        # self._of_master's project ...
-        if not self._project:
-            self._project = self._of_master._project
-            self.project_id = self._project.id
-            self.project_id_context = self._project.id_context
-        # set "foreign key" attributes from referenced objects:
-        self.of_pv_id = self._of_version.id
-        self.of_pm_id = self._of_master.id
-        self.of_pm_id_context = self._of_master.id_context
-        # if no model id is passed in, assign a default ...
-        self.id = kw.get('id', 'Default Model ID')
+                               schema=schema, **kw)
+        pv = getattr(self, '_of_version', None)
+        if pv:
+            self._of_master = pv._of_master
+            self.of_pv_id = pv.id
+            self.of_pm_id = pv.of_pm_id
+            self.of_pm_id_context = pv.of_pm_id_context
+            # inherit project only if I didn't get one from init
+            if not getattr(self, '_project', None):
+                self._project = pv._project
+                self.project_id = pv.project_id
+                self.project_id_context = pv.project_id_context
 

Index: PanGalactic/pangalactic/enterprise/productmodelversion.py
diff -u PanGalactic/pangalactic/enterprise/productmodelversion.py:1.20 PanGalactic/pangalactic/enterprise/productmodelversion.py:1.21
--- PanGalactic/pangalactic/enterprise/productmodelversion.py:1.20	Wed Oct  1 13:35:27 2003
+++ PanGalactic/pangalactic/enterprise/productmodelversion.py	Thu Oct  2 12:19:57 2003
@@ -1,10 +1,10 @@
-# $Id: productmodelversion.py,v 1.20 2003/10/01 17:35:27 waterbug Exp $
+# $Id: productmodelversion.py,v 1.21 2003/10/02 16:19:57 waterbug Exp $
 
 """
 Version-dependent product model data.
 """
 
-__version__ = "$Revision: 1.20 $"[11:-2]
+__version__ = "$Revision: 1.21 $"[11:-2]
 
 from pangalactic.enterprise.project import Project
 from pangalactic.enterprise.productversion import ProductVersion
@@ -100,8 +100,7 @@
     # constraints)
     _std_abbrev = 'pmv'
 
-    def __init__(self, email=None, schema=_schema,
-                 project=None, pmm=None, **kw):
+    def __init__(self, email=None, schema=_schema, **kw):
         """
         Initialize
             - pmm is a ProductModelMaster object
@@ -124,63 +123,18 @@
                 - has_parts_lists_flag
         """
         ProductVersion.__init__(self, email=email,
-                                schema=schema,
-                                project=project, **kw)
-        # if a Project object has been passed in, use it ...
-        if project.__class__.__name__ == 'Project':
-            self._project = project
-            self.project_id = project.id
-            self.project_id_context = project.id_context
-            kw['project_id'] = project.id
-            kw['project_id_context'] = project.id_context
-            # Must set project kw args here for 2 reasons:
-            # (1) if a Project object and project_id are both
-            # passed in, the object overrides
-            # (2) for use in the creation of a default
-            # ProductModelMaster (see below), if necessary.
-        elif kw.get('project_id'):
-        # else, if keyword args are present, use them ...
-            projid  = kw.get('project_id')
-            projidc = kw.get('project_id_context', 'PGER')
-                      # (may want to raise an exception if a
-                      # project_id_context is not present)
-            self._project = Project(id=projid,
-                                    id_context=projidc)
-            self.project_id = self._project.id
-            self.project_id_context = self._project.id_context
-        else:
-            self._project = None
-        # if a pmm is passed in, use it ...
-        if pmm.__class__.__name__ == 'ProductModelMaster':
-            self._of_model_master = pmm
-        else:
-            # if not, create one ...
-            pmmprojid  = kw.get('project_id', 'NOPROJECT')
-            pmmprojidc = kw.get('project_id_context', 'PGER')
-            pmmid      = kw.get('of_pmm_id', 'Default Model ID')
-            pmmpvid    = kw.get('of_pv_id', '1')
-            pmmpmid    = kw.get('of_pm_id', 'Default PN')
-            pmmpmidc   = kw.get('of_pm_id_context', 'PGER')
-            self._of_model_master = PMM(project_id=pmmprojid,
-                                        project_id_context=pmmprojidc,
-                                        id=pmmid,
-                                        of_pv_id=pmmpvid,
-                                        of_pm_id=pmmpmid,
-                                        of_pm_id_context=pmmpmidc)
-        # pull in _of_master and _of_version from the
-        # _of_model_master so we don't have to go nuts with
-        # blah.blah.blah to get to attributes of my parents ...
-        self._of_master = self._of_model_master._of_master
-        self._of_version = self._of_model_master._of_version
-        # if self._project has not be set above, use
-        # self._of_master's project ...
-        if not self._project:
-            self._project = self._of_master._project
-            self.project_id = self._project.id
-            self.project_id_context = self._project.id_context
-        # set "foreign key" attributes from referenced objects:
-        self.of_pmm_id = self._of_model_master.id
-        self.of_pv_id = self._of_version.id
-        self.of_pm_id = self._of_master.id
-        self.of_pm_id_context = self._of_master.id_context
+                                schema=schema, **kw)
+        pmm = getattr(self, '_of_model_master', None)
+        if pmm:
+            self._of_version = pmm._of_version
+            self._of_master = pmm._of_master
+            self.of_pmm_id = pmm.id
+            self.of_pv_id = pmm.of_pv_id
+            self.of_pm_id = pmm.of_pm_id
+            self.of_pm_id_context = pmm.of_pm_id_context
+            # inherit project only if I didn't get one from init
+            if not getattr(self, '_project', None):
+                self._project = pmm._project
+                self.project_id = pmm.project_id
+                self.project_id_context = pmm.project_id_context
 

From waterbug at ned.gsfc.nasa.gov  Thu Oct  2 14:39:08 2003
From: waterbug at ned.gsfc.nasa.gov (waterbug CVS)
Date: Thu Oct  2 13:39:09 2003
Subject: [Pangalactic-commits] Clean up some scripts and test data.
Message-ID: <200310021739.h92Hd8j9031916@ned.gsfc.nasa.gov>

Modified files:
PanGalactic/src/sql/insertTestData.sql None 1.1
PanGalactic/src/sql/createPgerDbTables.sql 1.62 1.63
PanGalactic/src/sql/dropPgerDbTables.sql 1.22 1.23
PanGalactic/src/sql/emptyPgerDbTables.sql 1.23 1.24
PanGalactic/src/sql/insertRefData.sql 1.2 1.3
PanGalactic/src/sql/populate_pgerdb.sh 1.1 1.2
PanGalactic/src/sql/insertPgerDbTestData.sql 1.5 None

Log message:
Clean up some scripts and test data.


Index: PanGalactic/src/sql/emptyPgerDbTables.sql
diff -u PanGalactic/src/sql/emptyPgerDbTables.sql:1.23 PanGalactic/src/sql/emptyPgerDbTables.sql:1.24
--- PanGalactic/src/sql/emptyPgerDbTables.sql:1.23	Wed Aug 20 01:54:58 2003
+++ PanGalactic/src/sql/emptyPgerDbTables.sql	Thu Oct  2 13:39:06 2003
@@ -52,6 +52,7 @@
 DELETE FROM doc_rep;
 DELETE FROM doc_version;
 DELETE FROM doc_master;
+DELETE FROM doc_type;
 DELETE FROM product_instance;
 DELETE FROM product_model_version;
 DELETE FROM product_model_master;

Index: PanGalactic/src/sql/insertRefData.sql
diff -u PanGalactic/src/sql/insertRefData.sql:1.2 PanGalactic/src/sql/insertRefData.sql:1.3
--- PanGalactic/src/sql/insertRefData.sql:1.2	Wed Aug 20 01:54:58 2003
+++ PanGalactic/src/sql/insertRefData.sql	Thu Oct  2 13:39:06 2003
@@ -1,267 +1,207 @@
-/* PGEFDB organization and user test data initialization script.
- * */
+/* PGERDB reference data initialization.  */
 
-/* $Id: insertRefData.sql,v 1.2 2003/08/20 05:54:58 waterbug Exp $ */
+/* $Id: insertRefData.sql,v 1.3 2003/10/02 17:39:06 waterbug Exp $  */
+
+/* This script sets up the default identification contexts for
+ * PGEF objects, and is required before the PGERDB can be
+ * populated.  */
 
 BEGIN;
 SET CONSTRAINTS ALL DEFERRED;
 
-INSERT INTO project
+INSERT INTO id_context
 (
-        pgef_oid,
-        id,             -- primary key
-        id_context      -- primary key
+        name, -- primary key
+        pgef_class,
+        owner,
+        owner_context
 ) 
 VALUES
 (
-        'test.project.1',
-        'H2G2',
-        'TEST'
+        'PGER', 
+        'IdContext', 
+        'admin', 
+        'PGER'
 );
 
-INSERT INTO project
+INSERT INTO id_context
 (
-        pgef_oid,
-        id,             -- primary key
-        id_context      -- primary key
+        name, -- primary key
+        pgef_class,
+        owner,
+        owner_context
+) 
+VALUES
+(
+        'NOCONTEXT', 
+        'IdContext', 
+        'admin', 
+        'PGER'
+);
+
+INSERT INTO id_context
+(
+        name, -- primary key
+        pgef_class,
+        owner,
+        owner_context
+) 
+VALUES
+(
+        'DEMO', 
+        'IdContext', 
+        'admin',
+        'PGER'
+);
+
+INSERT INTO id_context
+(
+        name, -- primary key
+        pgef_class,
+        owner,
+        owner_context
+) 
+VALUES
+(
+        'TEST', 
+        'IdContext', 
+        'admin',
+        'PGER'
+);
+
+INSERT INTO id_context
+(
+        name, -- primary key
+        pgef_class,
+        owner,
+        owner_context
+) 
+VALUES
+(
+        'CAGE', 
+        'IdContext', 
+        'admin',
+        'PGER'
+);
+
+INSERT INTO id_context
+(
+        name, -- primary key
+        pgef_class,
+        owner,
+        owner_context
 ) 
 VALUES
 (
-        'test.project.2',
-        'TEST',
-        'TEST'
+        'FSC', 
+        'IdContext', 
+        'admin',
+        'PGER'
 );
 
 INSERT INTO person
 (
         pgef_oid,
-        id,             -- primary key
-        id_context,     -- primary key
+        pgef_class,
+        id,               -- primary key
+        id_context,       -- primary key
         email,
-        fname,
-        mi_or_name,
-        lname,
-        position_title,
-        role,
         org_id,
         org_id_context,
-        phone,
         god_flag
 ) 
 VALUES
 (
-        'test.person1',
-        'banzai@banzai.earth',
+        'admin@default.person.1',
+        'Person', 
+        'admin',
+        'PGER',
+        'admin@default',
+        'PGEF',
         'PGER',
-        'banzai@banzai.earth',
-        'Buckaroo',
-        '',
-        'Banzai',
-        'Genius-at-Large',
-        'Big Kahuna',
-        'BANZA',
-        'TEST',
-        'buckafone',
         '1'
 );
 
-INSERT INTO person
+INSERT INTO organization
 (
         pgef_oid,
-        id,             -- primary key
-        id_context,     -- primary key
-        email,
-        fname,
-        mi_or_name,
-        lname,
-        position_title,
-        role,
-        org_id,
-        org_id_context,
-        phone
+        pgef_class,
+        id,               -- primary key
+        id_context        -- primary key
 ) 
 VALUES
 (
-        'test.person2',
-        'bigboote@yoyodyne.planet10',
-        'PGER',
-        'bigboote@yoyodyne.planet10',
-        'John',
-        '',
-        'Bigboote',
-        'Ubergeek',
-        'Hive Admin',
-        'YOYOD',
-        'TEST',
-        'yoyofone'
+        'PGEF',
+        'Organization', 
+        'PGEF', 
+        'PGER'
 );
 
-INSERT INTO person
+INSERT INTO organization
 (
         pgef_oid,
-        id,             -- primary key
-        id_context,     -- primary key
-        email,
-        fname,
-        mi_or_name,
-        lname,
-        position_title,
-        role,
-        org_id,
-        org_id_context,
-        phone
-) 
+        pgef_class,
+        id,               -- primary key
+        id_context        -- primary key
+)
 VALUES
 (
-        'test.person3',
-        'smallberries@yoyodyne.planet10',
-        'TEST',
-        'smallberries@yoyodyne.planet10',
-        'John',
-        '',
-        'Smallberries',
-        'Schlemiel',
-        'Hive Lackey',
-        'YOYOD',
-        'TEST',
-        'yoyofone'
+        'DLA',
+        'Organization', 
+        'DLA', 
+        'PGER'
 );
 
-INSERT INTO person
+INSERT INTO project
 (
         pgef_oid,
-        id,             -- primary key
-        id_context,     -- primary key
-        email,
-        fname,
-        mi_or_name,
-        lname,
-        position_title,
-        role,
-        org_id,
-        org_id_context,
-        phone
+        pgef_class,
+        id,               -- primary key
+        id_context,       -- primary key
+        short_description
 ) 
 VALUES
 (
-        'test.person4',
-        'lizardo@yoyodyne.planet10',
-        'TEST',
-        'lizardo@yoyodyne.planet10',
-        'John', 
-        '', 
-        'Whorfin', 
-        '', 
-        'Hive Master',
-        'YOYOD',
-        'TEST',
-        'yoyofone'
+        'NOPROJECT',
+        'Project', 
+        'NOPROJECT', 
+        'NOCONTEXT',
+        'No project specified'
 );
 
-INSERT INTO organization
+INSERT INTO doc_master
 (
         pgef_oid,
-        pgef_class,
-        id,
-        id_context,
-        pgef_security_mask,
+        id,               -- primary key
+        id_context,       -- primary key
         name,
-        short_description,
-        long_description,
-        pger_owner,
-        pger_owner_context,
-        pger_creator,
-        pger_creator_context,
-        pger_create_datetime,
-        pger_modifier,
-        pger_modifier_context,
-        pger_mod_datetime,
-        owner,
-        owner_context,
-        creator,
-        creator_context,
-        create_datetime,
-        modifier,
-        modifier_context,
-        mod_datetime,
-        pgef_org_name_code,
-        name1,
-        name2,
-        name3,
-        name4,
-        name5,
-        country_code,
-        street_address1,
-        street_address2,
-        city,
-        state_or_country,
-        zip_or_postal_zone,
-        phone,
-        association_cage,
-        status_code,
-        type_code,
-        replacement_cage,
-        sic_code1,
-        sic_code2,
-        sic_code3,
-        sic_code4
+        short_description
 ) 
 VALUES
 (
-'org.yoyo1', '', 'YOYOD', 'TEST', '0', 'Yoyodyne Propulsion Systems', '', '', 'admin', 'PGER', 'admin', 'PGER', '2003-02-25 22:18:15.275408-05', 'admin', 'PGER', '2003-02-25 22:18:15.275408-05', 'admin', 'PGER', 'admin', 'PGER', '2003-02-25 22:18:15.275408-05', 'admin', 'PGER', '2003-02-25 22:18:15.275408-05', 'YOYODYNE', 'Yoyodyne Propulsion Systems', '', '', '', '', '1', '', '', 'Grovers Mills', 'NJ', '', '', '', '', '', '', '', '', '', ''
+        'admin@fsc.doc_master.1',
+        'FSC Doc Master', 
+        'FSC',
+        'FSC Doc Master',
+        'Federal Supply Classifications Document Master'
 );
 
-INSERT INTO organization
+INSERT INTO doc_type
 (
         pgef_oid,
-        pgef_class,
-        id,
-        id_context,
-        pgef_security_mask,
+        id,               -- primary key
+        id_context,       -- primary key
         name,
-        short_description,
-        long_description,
-        pger_owner,
-        pger_owner_context,
-        pger_creator,
-        pger_creator_context,
-        pger_create_datetime,
-        pger_modifier,
-        pger_modifier_context,
-        pger_mod_datetime,
-        owner,
-        owner_context,
-        creator,
-        creator_context,
-        create_datetime,
-        modifier,
-        modifier_context,
-        mod_datetime,
-        pgef_org_name_code,
-        name1,
-        name2,
-        name3,
-        name4,
-        name5,
-        country_code,
-        street_address1,
-        street_address2,
-        city,
-        state_or_country,
-        zip_or_postal_zone,
-        phone,
-        association_cage,
-        status_code,
-        type_code,
-        replacement_cage,
-        sic_code1,
-        sic_code2,
-        sic_code3,
-        sic_code4
-)
+        short_description
+) 
 VALUES
 (
-'org.banzai1', '', 'BANZA', 'TEST', '0', 'Banzai Institute', '', '', 'admin', 'PGER', 'admin', 'PGER', '2003-02-25 22:18:15.275408-05', 'admin', 'PGER', '2003-02-25 22:18:15.275408-05', 'admin', 'PGER', 'admin', 'PGER', '2003-02-25 22:18:15.275408-05', 'admin', 'PGER', '2003-02-25 22:18:15.275408-05', 'BANZAI', 'Banzai Institute', '', '', '', '', '1', '', '', 'Holland Township', 'NJ', '', '', '', '', '', '', '', '', '', ''
+        'admin@fsc.doc_type.1',
+        'Unknown', 
+        'PGER',
+        'Unknown Document Type',
+        'Default type for unidentified document types.'
 );
+
 
 END;

Index: PanGalactic/src/sql/createPgerDbTables.sql
diff -u PanGalactic/src/sql/createPgerDbTables.sql:1.62 PanGalactic/src/sql/createPgerDbTables.sql:1.63
--- PanGalactic/src/sql/createPgerDbTables.sql:1.62	Tue Sep 30 13:49:30 2003
+++ PanGalactic/src/sql/createPgerDbTables.sql	Thu Oct  2 13:39:06 2003
@@ -1,6 +1,6 @@
 /* Pan Galactic Engineering Repository Database (PGERDB) Table Creation Script */
 
-/* $Id: createPgerDbTables.sql,v 1.62 2003/09/30 17:49:30 waterbug Exp $
+/* $Id: createPgerDbTables.sql,v 1.63 2003/10/02 17:39:06 waterbug Exp $
  * 
  * *** TO DO ***
  *     -- TBR (Text-Based Requirements)
@@ -2217,12 +2217,12 @@
         /* The name of the file's role.  Valid values TBD, will
          * probably include 'content', 'template', 'stylesheet',
          * etc.  */
-    dr_id               TEXT NOT NULL,
-    dv_id               TEXT NOT NULL,
-    dm_id               TEXT NOT NULL,
-    dm_id_context       TEXT NOT NULL,
+    of_dr_id                 TEXT NOT NULL,
+    of_dv_id                 TEXT NOT NULL,
+    of_dm_id                 TEXT NOT NULL,
+    of_dm_id_context         TEXT NOT NULL,
     CONSTRAINT dr_file_has_dr
-        FOREIGN KEY (dr_id, dv_id, dm_id, dm_id_context)
+        FOREIGN KEY (of_dr_id, of_dv_id, of_dm_id, of_dm_id_context)
         REFERENCES doc_rep
         ON DELETE CASCADE
         INITIALLY DEFERRED

Index: PanGalactic/src/sql/dropPgerDbTables.sql
diff -u PanGalactic/src/sql/dropPgerDbTables.sql:1.22 PanGalactic/src/sql/dropPgerDbTables.sql:1.23
--- PanGalactic/src/sql/dropPgerDbTables.sql:1.22	Wed Aug 20 01:54:58 2003
+++ PanGalactic/src/sql/dropPgerDbTables.sql	Thu Oct  2 13:39:06 2003
@@ -50,6 +50,7 @@
 DROP TABLE doc_rep CASCADE;
 DROP TABLE doc_version CASCADE;
 DROP TABLE doc_master CASCADE;
+DROP TABLE doc_type CASCADE;
 DROP TABLE product_instance CASCADE;
 DROP TABLE product_model_version CASCADE;
 DROP TABLE product_model_master CASCADE;

Index: PanGalactic/src/sql/populate_pgerdb.sh
diff -u PanGalactic/src/sql/populate_pgerdb.sh:1.1 PanGalactic/src/sql/populate_pgerdb.sh:1.2
--- PanGalactic/src/sql/populate_pgerdb.sh:1.1	Sun Jun 15 21:39:02 2003
+++ PanGalactic/src/sql/populate_pgerdb.sh	Thu Oct  2 13:39:06 2003
@@ -1,11 +1,10 @@
 #!/bin/bash
 
-# $Id: populate_pgerdb.sh,v 1.1 2003/06/16 01:39:02 radix Exp $
+# $Id: populate_pgerdb.sh,v 1.2 2003/10/02 17:39:06 waterbug Exp $
 
-psql pgerdb < insertPgerDbReferenceData.sql
-psql pgerdb < copyOrganizations.psql
-psql pgerdb < insertPgerDbTestData.sql
 psql pgerdb < insertRefData.sql
+psql pgerdb < copyOrganizations.psql
+psql pgerdb < insertTestData.sql
 psql pgerdb < copyCats.psql
 psql pgerdb < insertProductMasters.sql
 psql pgerdb < insertProductVersions.sql

From waterbug at ned.gsfc.nasa.gov  Thu Oct  2 14:40:31 2003
From: waterbug at ned.gsfc.nasa.gov (waterbug CVS)
Date: Thu Oct  2 13:40:33 2003
Subject: [Pangalactic-commits] Fix so no overlaps with test and ref data
	inserts.
Message-ID: <200310021740.h92HeVN7031968@ned.gsfc.nasa.gov>

Modified files:
PanGalactic/data/organizations.tsv 1.2 1.3

Log message:
Fix so no overlaps with test and ref data inserts.


Index: PanGalactic/data/organizations.tsv
diff -u PanGalactic/data/organizations.tsv:1.2 PanGalactic/data/organizations.tsv:1.3
--- PanGalactic/data/organizations.tsv:1.2	Fri Sep 26 14:15:59 2003
+++ PanGalactic/data/organizations.tsv	Thu Oct  2 13:40:30 2003
@@ -1,5 +1,3 @@
-admin@default.organization.1	Organization	PGEF	TEST	0	\N			admin	PGER	admin	PGER	2003-09-25 21:48:00.88844	admin	PGER	2003-09-25 21:48:00.88844	admin	PGER	admin	PGER	2003-09-25 21:48:00.88844	admin	PGER	2003-09-25 21:48:00.88844	\N						1														
-admin@default.organization.2	Organization	DLA	TEST	0	\N			admin	PGER	admin	PGER	2003-09-25 21:48:00.88844	admin	PGER	2003-09-25 21:48:00.88844	admin	PGER	admin	PGER	2003-09-25 21:48:00.88844	admin	PGER	2003-09-25 21:48:00.88844	\N						1														
 test.organization.1	Organization	11139	TEST	0				admin	PGER	admin	PGER	2003-02-26 00:05:34.749062	admin	PGER	2003-02-26 00:05:34.749062	admin	PGER	admin	PGER	2003-02-26 00:05:34.749062	admin	PGER	2003-02-26 00:05:34.749062	DEUTSCH	DEUTSCH CO THE	ENGINEERED CONNECTING DEVICES				1	5733 W WHITTIER AVE		HEMET	CA	92545	909-765-2200	17419	A	A		3678			
 test.organization.2	Organization	03550	TEST	0				admin	PGER	admin	PGER	2003-02-26 00:05:34.749062	admin	PGER	2003-02-26 00:05:34.749062	admin	PGER	admin	PGER	2003-02-26 00:05:34.749062	admin	PGER	2003-02-26 00:05:34.749062	VANGUARD	VANGUARD ELECTRONICS COMPANY					1	7412 PRINCE DRIVE		HUNTINGTON BEACH	CA	92647-4553	714-842-3330	     	A	A		3671			
 test.organization.3	Organization	55801	TEST	0				admin	PGER	admin	PGER	2003-02-26 00:05:34.749062	admin	PGER	2003-02-26 00:05:34.749062	admin	PGER	admin	PGER	2003-02-26 00:05:34.749062	admin	PGER	2003-02-26 00:05:34.749062	CDI	COMPENSATED DEVICES INC					1	22 COREY ST		MELROSE	MA	02176-4696	781-665-1071	     	A	A					
@@ -12,11 +10,8 @@
 test.organization.10	Organization	77820	TEST	0				admin	PGER	admin	PGER	2003-02-26 00:05:34.749062	admin	PGER	2003-02-26 00:05:34.749062	admin	PGER	admin	PGER	2003-02-26 00:05:34.749062	admin	PGER	2003-02-26 00:05:34.749062	AMPHENOL	AMPHENOL AEROSPACE OPERATIONS					1	40-60 DELAWARE ST		SIDNEY	NY	13838	607-563-5011	     	A	A		3678			
 test.organization.11	Organization	34156	TEST	0				admin	PGER	admin	PGER	2003-02-26 00:05:34.749062	admin	PGER	2003-02-26 00:05:34.749062	admin	PGER	admin	PGER	2003-02-26 00:05:34.749062	admin	PGER	2003-02-26 00:05:34.749062	SEMICOA	SEMICOA					1	333 MCCORMICK AVE		COSTA MESA	CA	92626-3422	714-979-1900	     	A	A		3674			
 test.organization.12	Organization	06324	TEST	0				admin	PGER	admin	PGER	2003-02-26 00:05:34.749062	admin	PGER	2003-02-26 00:05:34.749062	admin	PGER	admin	PGER	2003-02-26 00:05:34.749062	admin	PGER	2003-02-26 00:05:34.749062	GLENAIR	GLENAIR INC					1	1211 AIR WAY		GLENDALE	CA	91201-2497	818-247-6000	06324	A	A		3643			
-org.yoyo1	Organization	YOYOD	TEST	0	Yoyodyne Propulsion Systems			admin	PGER	admin	PGER	2003-02-25 22:18:15.275408	admin	PGER	2003-02-25 22:18:15.275408	admin	PGER	admin	PGER	2003-02-25 22:18:15.275408	admin	PGER	2003-02-25 22:18:15.275408	YOYODYNE	Yoyodyne Propulsion Systems					1			Grovers Mills	NJ										
 test.organization.13	Organization	55123	TEST	0				admin	PGER	admin	PGER	2003-02-26 00:05:34.749062	admin	PGER	2003-02-26 00:05:34.749062	admin	PGER	admin	PGER	2003-02-26 00:05:34.749062	admin	PGER	2003-02-26 00:05:34.749062	KINETICSYS	KINETICSYSTEMS COMPANY LLC					1	900 NORTH STATE STREET		LOCKPORT	IL	60441-2230	815-838-0005	     	A	A		3625			
 test.organization.14	Organization	52202	TEST	0				admin	PGER	admin	PGER	2003-02-26 00:05:34.749062	admin	PGER	2003-02-26 00:05:34.749062	admin	PGER	admin	PGER	2003-02-26 00:05:34.749062	admin	PGER	2003-02-26 00:05:34.749062	MODULARDEV	MODULAR DEVICES INC	DBA				1	ONE RONED ROAD		SHIRLEY	NY	11967-4706	631-345-3100	     	A	A		3651			
 test.organization.16	Organization	0LSP2	TEST	0				admin	PGER	admin	PGER	2003-02-26 00:05:34.749062	admin	PGER	2003-02-26 00:05:34.749062	admin	PGER	admin	PGER	2003-02-26 00:05:34.749062	admin	PGER	2003-02-26 00:05:34.749062	SPECCTRL	SPECTRUM CONTROL INC	ELECTROMAGNETIC DIV				1	8061 AVONIA RD		FAIRVIEW	PA	16415-2829	814-474-1571	33095	A	A		3675	3679		
 test.organization.17	Organization	1FS71	TEST	0				admin	PGER	admin	PGER	2003-02-26 00:05:34.749062	admin	PGER	2003-02-26 00:05:34.749062	admin	PGER	admin	PGER	2003-02-26 00:05:34.749062	admin	PGER	2003-02-26 00:05:34.749062	WALCO	WALCO CORP	ADHESIVE TAPES DIV				1	1651 E SUTTER RD		GLENSHAW	PA	15116-1700	412-486-4400	     	A	F					
 test.organization.18	Organization	0AKS0	TEST	0				admin	PGER	admin	PGER	2003-02-26 00:05:34.749062	admin	PGER	2003-02-26 00:05:34.749062	admin	PGER	admin	PGER	2003-02-26 00:05:34.749062	admin	PGER	2003-02-26 00:05:34.749062	RAMENTRPRS	RAM ENTERPRISES INC					1	24940 AVENUE TIBBITTS		SANTA CLARITA	CA	91355-3426	661-257-0800	     	A	A		5063			
-tester1@default.organization.1	Organization	TO1	TEST	0	\N			admin	PGER	admin	PGER	2003-09-25 21:48:01.225522	admin	PGER	2003-09-25 21:48:01.225522	admin	PGER	admin	PGER	2003-09-25 21:48:01.225522	admin	PGER	2003-09-25 21:48:01.225522	TORG1	Test Organization 1					US	42 Hitchhikers Blvd		Spamville	MD	00000									
-org.banzai1	Organization	BANZA	TEST	0	Banzai Institute			admin	PGER	admin	PGER	2003-02-25 22:18:15.275408	admin	PGER	2003-02-25 22:18:15.275408	admin	PGER	admin	PGER	2003-02-25 22:18:15.275408	admin	PGER	2003-02-25 22:18:15.275408	BANZAI	Banzai Institute					1			Holland Township	NJ										

From pbear at ned.gsfc.nasa.gov  Thu Oct  2 16:31:25 2003
From: pbear at ned.gsfc.nasa.gov (pbear CVS)
Date: Thu Oct  2 15:31:27 2003
Subject: [Pangalactic-commits] add overdue times to workflows;
	colourization of wfinstances; send object not string in quickcreate
Message-ID: <200310021931.h92JVPcd001010@ned.gsfc.nasa.gov>

Modified files:
PanGalactic/pangalactic/enterprise/pgefadvisory.py 1.33 1.34
PanGalactic/pangalactic/enterprise/workflow/wfactivity.py 1.9 1.10
PanGalactic/pangalactic/enterprise/workflow/wfexecutionobject.py 1.11 1.12
PanGalactic/pangalactic/enterprise/workflow/wffactory.py 1.5 1.6
PanGalactic/pangalactic/enterprise/workflow/wfinstanceoverview.py 1.3 1.4
PanGalactic/pangalactic/enterprise/workflow/wfprocess.py 1.12 1.13
PanGalactic/pangalactic/enterprise/workflow/wfprocessoverview.py 1.13 1.14
PanGalactic/pangalactic/enterprise/workflow/workflow_wizard.py 1.15 1.16
PanGalactic/pangalactic/enterprise/workflow/workflowgrid.py 1.6 1.7
PanGalactic/pangalactic/enterprise/workflow/workflowgrid.wdr 1.2 1.3
PanGalactic/pangalactic/enterprise/workflow/workflowgrid_wdr.py 1.2 1.3
PanGalactic/pangalactic/utils/basegrid.py 1.12 1.13
PanGalactic/pangalactic/utils/datamanager.py 1.33 1.34

Log message:
add overdue times to workflows; colourization of wfinstances; send object not string in quickcreate


Index: PanGalactic/pangalactic/enterprise/pgefadvisory.py
diff -u PanGalactic/pangalactic/enterprise/pgefadvisory.py:1.33 PanGalactic/pangalactic/enterprise/pgefadvisory.py:1.34
--- PanGalactic/pangalactic/enterprise/pgefadvisory.py:1.33	Mon Sep 15 16:08:59 2003
+++ PanGalactic/pangalactic/enterprise/pgefadvisory.py	Thu Oct  2 15:31:22 2003
@@ -1,11 +1,11 @@
-# $Id: pgefadvisory.py,v 1.33 2003/09/15 20:08:59 waterbug Exp $
+# $Id: pgefadvisory.py,v 1.34 2003/10/02 19:31:22 pbear Exp $
 
 """
 Base class for documents that report conditions related to the
 usability of a product.
 """
 
-__version__ = "$Revision: 1.33 $"[11:-2]
+__version__ = "$Revision: 1.34 $"[11:-2]
 
 import os.path
 import string
@@ -54,25 +54,31 @@
         Initialize PgefAdvisory.
         """
         Document.__init__(self, **kw)
+
         # XXX TO DO:  make center_acronym a computed attribute
         # (and name it _center_acronym)
         self.center_acronym = acronym
+
         # XXX TO DO:  change attachments to _attachments
         self.attachments = []  ## list of tuples: (label, filename)
         # for the interim, set the attributes; eventually, method
         # calls can be added to the list of attributes
+
         self.part_refs = kw.get('part_refs', [])  # list of PartRef objects
-        self._workflow_str = "INITIATED"    # self.GetState()
-        self._next_workflow_str = "DRAFT"   # self.GetNextState()
-        # this needs to reflect length of workflow state -tbd -vwk
-        self.due_datetime = mx.DateTime.now()
+
+# leave this here...  I use it to generate old data -vwk
+#
+#        now = mx.DateTime.DateFromTicks(mx.DateTime.now())
+#        earlier = now + mx.DateTime.RelativeDateTime(days=-85)
+#
+#        self.pger_create_datetime = earlier
+#        self.pger_mod_datetime    = earlier
+#        self.create_datetime      = earlier
+#        self.mod_datetime         = earlier
+
 
     def __getattr__(self, name):
-        if name == '_due_datetime':
-            return getDisplayDateTime(self.due_datetime)
-        elif name == '_due_date':
-            return getDisplayDate(self.due_datetime)
-        elif name == '_pretty_doc_type':
+        if name == '_pretty_doc_type':
             return self.getPrettyDocType()
         else:
             return Document.__getattr__(self, name)
@@ -87,12 +93,12 @@
     def GetCreateDateStr(self):
         return self._create_date
 
-    def SetDueDate(self, due_datetime):
-        self.due_datetime = due_datetime
+#    def SetDueDate(self, due_datetime):
+#        self.due_datetime = due_datetime
 
-    def SetWorkflowState(self, statestr, nextstatestr):
-        self._workflowstr = statestr
-        self._next_workflowstr = nextstatestr
+#    def SetWorkflowState(self, statestr, nextstatestr):
+#        self._workflowstr = statestr
+#        self._next_workflowstr = nextstatestr
 
     def SetAttachments(self, attachments):
         self.attachments = attachments

Index: PanGalactic/pangalactic/enterprise/workflow/wfactivity.py
diff -u PanGalactic/pangalactic/enterprise/workflow/wfactivity.py:1.9 PanGalactic/pangalactic/enterprise/workflow/wfactivity.py:1.10
--- PanGalactic/pangalactic/enterprise/workflow/wfactivity.py:1.9	Fri Sep 26 10:10:50 2003
+++ PanGalactic/pangalactic/enterprise/workflow/wfactivity.py	Thu Oct  2 15:31:23 2003
@@ -65,6 +65,8 @@
         self.canstart = 0
         self.fields = fields
 
+    def getDuration(self):
+        return int(self.fields["duration"])
 
     def changeState(self, newState):
         # wfmc specification

Index: PanGalactic/pangalactic/utils/basegrid.py
diff -u PanGalactic/pangalactic/utils/basegrid.py:1.12 PanGalactic/pangalactic/utils/basegrid.py:1.13
--- PanGalactic/pangalactic/utils/basegrid.py:1.12	Wed Oct  1 15:29:24 2003
+++ PanGalactic/pangalactic/utils/basegrid.py	Thu Oct  2 15:31:23 2003
@@ -248,6 +248,10 @@
                 self.SetRowAttr(row, attr)
             found = true
         
+    def SetColBackgroundColour(self, col, colour):
+        numrows = self.GetNumberRows()
+        for row in range(numrows):
+            self.SetCellBackgroundColour(row, col, colour)
         
     def SetRowBackgroundColour(self, rowlist, colour):
         numcols = self.GetNumberCols()

Index: PanGalactic/pangalactic/enterprise/workflow/wfprocessoverview.py
diff -u PanGalactic/pangalactic/enterprise/workflow/wfprocessoverview.py:1.13 PanGalactic/pangalactic/enterprise/workflow/wfprocessoverview.py:1.14
--- PanGalactic/pangalactic/enterprise/workflow/wfprocessoverview.py:1.13	Fri Sep 26 15:47:11 2003
+++ PanGalactic/pangalactic/enterprise/workflow/wfprocessoverview.py	Thu Oct  2 15:31:23 2003
@@ -79,8 +79,11 @@
 
         self.actinfo = [("Activity", 100, "activity"),
                         ("Time Frame\n(days)", 100, "duration"),
+                        ("Late\n(days)", 100, "late"),
+                        ("Very Late\n(days)", 100, "very_late"),
+                        ("WAAAAY Overdue\n(days)", 130, "lost_cause"),
                         ("Description", 400, "description")]
-        self.transinfo = [("From", 200, "to"), ("To", 200, "to")]
+        self.transinfo = [("From", 200, "from"), ("To", 200, "to")]
 
 
         self.parent = parent
@@ -168,11 +171,6 @@
 
     def OnWorkflowWizard(self, event):
         #print "CreateWorkflow"
-        # tuples of displayed_label, duration, and dictionary key
-#        actinfo = [("Activity", 100, "activity"),
-#                   ("Time Frame\n(days)", 100, "duration"),
-#                   ("Description", 400, "description")]
-#        transinfo = [("From", 200, "from"), ("To", 200, "to")]
         tmpsize = wxSize(750, 600)
         WizardFrame = toolframe.toolFrame(self, -1, "Workflow Wizard", wxDefaultPosition, tmpsize)
         Wizard = workflow_wizard.WorkflowWizard(WizardFrame, self.State, self.DataManager,
@@ -238,12 +236,6 @@
     def OnWorkflowEdit(self, event):
         # popup the editor, initialized with the selected workflow from the grid
         #print "EditWorkflow"
-
-#        actinfo = [("Activity", 100, "activity"),
-#                   ("Time Frame\n(days)", 100, "duration"),
-#                   ("Description", 400, "description")]
-#        transinfo = [("From", 200, "to"), ("To", 200, "to")]
-
         tmpsize = wxSize(750, 600)
         EditorFrame = toolframe.toolFrame(self, -1, "Workflow Editor", wxDefaultPosition, tmpsize)
         Editor = workflow_wizard.WorkflowWizard(EditorFrame, self.State, self.DataManager,

Index: PanGalactic/pangalactic/enterprise/workflow/wfprocess.py
diff -u PanGalactic/pangalactic/enterprise/workflow/wfprocess.py:1.12 PanGalactic/pangalactic/enterprise/workflow/wfprocess.py:1.13
--- PanGalactic/pangalactic/enterprise/workflow/wfprocess.py:1.12	Mon Sep 29 13:35:50 2003
+++ PanGalactic/pangalactic/enterprise/workflow/wfprocess.py	Thu Oct  2 15:31:23 2003
@@ -6,11 +6,14 @@
 @see: L{WfExecutionObject <pangalactic.enterprise.workflow.wfexecutionobject>},  L{WfActivity <pangalactic.enterprise.workflow.wfactivity>}
 """
 
+import types
+import mx.DateTime
+import pangalactic.utils.datetimes as datetimes
+
 from pangalactic.enterprise.workflow.wfexecutionstates import *
 from pangalactic.enterprise.workflow.wfexceptions import *
 from pangalactic.enterprise.workflow.wfexecutionobject import WfExecutionObject
 from pangalactic.enterprise.workflow.wftransition import WfTransition
-import types
 
 class WfProcess(WfExecutionObject):
     """
@@ -37,11 +40,12 @@
     _properties = {"activityId" : "str",
                    "defaultStartId" : "str"}
 
-    _instancegridmap = [["Workflow Data",   "self.wfdata_name",         "string", ""],
-                        ["Template\nName",  "self.name",                "string", ""],
-                        ["# Steps",         "self._nstates",            "string", ""],
-                        ["Status",          "self._activity_name",      "string", ""],
-                        ["Pending\nAction", "self._next_activity_name", "string", ""]]
+    _instancegridmap = [["Workflow Data",   "self.wfdata_name",            "string", ""],
+                        ["Template\nName",  "self.name",                   "string", ""],
+                        ["# Steps",         "self._nstates",               "string", ""],
+                        ["Status",          "self._activity_name",         "string", ""],
+                        ["Status Date",     "self._activity_due_date_str", "string", "colour"],
+                        ["Pending\nAction", "self._next_activity_name",    "string", ""]]
                      
 
     def __init__(self, name, activities, transitiondict, transitions, canstartlist, defaultstart):
@@ -81,6 +85,8 @@
         self._CreateDateStr = self.GetCreateDateStr()
         self._activity_name = "N/A"
         self._next_activity_name = ""
+        self._activity_date = ""
+        self._activity_due_date = ""
         self.activityId = None
         self.wfdata = None
         self.wfdata_name = ""
@@ -124,20 +130,31 @@
 
 
     def initiate(self, wfdata):
-        print "wfprocess.initiate", self.defaultstartid
-        if self.defaultstartid:
-            self.activities[self.defaultstartid].changeState(OPEN_NOTSTARTED)
+#        print "wfprocess.initiate", self.defaultstartid
         self.activityId = self.defaultstartid
-        self._activity_name = self.activities[self.activityId].getName()
+        if self.activityId:
+            current_activity = self.activities[self.activityId]
+            current_activity.changeState(OPEN_NOTSTARTED)
+            self._activity_name = current_activity.getName()
+#            now = mx.DateTime.DateFromTicks(mx.DateTime.now())
+            now = mx.DateTime.DateFromTicks(wfdata.create_datetime)
+            duedate = now + mx.DateTime.RelativeDateTime(days=current_activity.getDuration())
+            self._activity_due_date = duedate
+            self._activity_due_date_str = datetimes.getDisplayDate(duedate)
+
+        self.getNextActivityName()
+        self.SetData(wfdata)
 
+
+    def getNextActivityName(self):
         nexttranslist = self.transitions[self.activityId]
         #print "next transitions", nexttranslist
         if len(nexttranslist) > 0:
             nextid = nexttranslist[0]
             nexttransition = self.transitionsdict[nextid]
             self._next_activity_name = self.activities[nexttransition.to_activity].getName()
-        self.SetData(wfdata)
-            
+        return ""
+        
     def changeState(self, newState):
         # wfmc specification
         

Index: PanGalactic/pangalactic/enterprise/workflow/workflowgrid_wdr.py
diff -u PanGalactic/pangalactic/enterprise/workflow/workflowgrid_wdr.py:1.2 PanGalactic/pangalactic/enterprise/workflow/workflowgrid_wdr.py:1.3
--- PanGalactic/pangalactic/enterprise/workflow/workflowgrid_wdr.py:1.2	Mon Jun 30 15:52:06 2003
+++ PanGalactic/pangalactic/enterprise/workflow/workflowgrid_wdr.py	Thu Oct  2 15:31:23 2003
@@ -10,6 +10,7 @@
 from wxPython.grid import *
 
 
+
 # Window functions
 
 WF_PROCESS_NAME = wxNewId()
@@ -36,7 +37,7 @@
     item4 = wxStaticBoxSizer( item5, wxVERTICAL )
     
     item6 = wxGrid( parent, WF_ACTIVITY_GRID, wxDefaultPosition, wxSize(200,160), wxWANTS_CHARS )
-    item6.CreateGrid( 10, 3 )
+    item6.CreateGrid( 10, 6 )
     item4.AddWindow( item6, 0, wxGROW|wxALIGN_CENTER_VERTICAL|wxALL, 5 )
 
     item7 = wxBoxSizer( wxHORIZONTAL )

Index: PanGalactic/pangalactic/enterprise/workflow/wfexecutionobject.py
diff -u PanGalactic/pangalactic/enterprise/workflow/wfexecutionobject.py:1.11 PanGalactic/pangalactic/enterprise/workflow/wfexecutionobject.py:1.12
--- PanGalactic/pangalactic/enterprise/workflow/wfexecutionobject.py:1.11	Mon Sep 29 13:35:50 2003
+++ PanGalactic/pangalactic/enterprise/workflow/wfexecutionobject.py	Thu Oct  2 15:31:23 2003
@@ -53,9 +53,6 @@
         self.fields = {}
 
 
-#    def SetDataManager(self, datamgr):
-#        self.DataManager = datamgr
-
     def GetData(self):
         # must be overridden by subclass
         pass

Index: PanGalactic/pangalactic/enterprise/workflow/wfinstanceoverview.py
diff -u PanGalactic/pangalactic/enterprise/workflow/wfinstanceoverview.py:1.3 PanGalactic/pangalactic/enterprise/workflow/wfinstanceoverview.py:1.4
--- PanGalactic/pangalactic/enterprise/workflow/wfinstanceoverview.py:1.3	Fri Sep 26 15:47:11 2003
+++ PanGalactic/pangalactic/enterprise/workflow/wfinstanceoverview.py	Thu Oct  2 15:31:23 2003
@@ -11,24 +11,14 @@
 # Copyright:    
 #----------------------------------------------------------------------------
 
+import mx.DateTime
 from wxPython.wx import *
 from wxPython.grid import *
-#import os.path
-
-#import shutil
 
 from pangalactic.enterprise.workflow.wfprocessoverview import WfProcessOverview, WorkflowState
 from workflowgrid import WorkflowGrid, WF_EDIT, WF_VIEW
-#import workflow_wizard
 import wfdatatable
 
-#import pangalactic.utils.toolstate     as toolstate
-#import pangalactic.utils.pgdialogs     as pgdialogs
-#import pangalactic.utils.toolframe     as toolframe
-
-#WF_WIZARD = wxNewId()
-#WF_SAVE = wxNewId()
-
 
 class WfInstanceOverview(WfProcessOverview):
     """
@@ -69,13 +59,69 @@
         self.gridtable = wfdatatable.WfDataTable()
         if len(datalist) > 0:
             self.gridtable.setGridMap(datalist[0]._instancegridmap)
-#            print "instance.table.displaymapping", self.gridtable.GetDisplayMapping()
             self.grid = WorkflowGrid(self, -1, savename = tablename,
                                      dbroot = self.DataManager.dbroot, intable = self.gridtable)
             self.grid.SetSize(self.parent.GetClientSize())
             self.FillGrid(datalist)
-
+            self.setColourByDueDate(datalist)
+            
             EVT_MENU(self.grid, WF_EDIT, self.OnWorkflowEdit)
             EVT_MENU(self.grid, WF_VIEW, self.OnWorkflowView)
         
         
+    def setColourByDueDate(self, wfobj_list):
+        msg = "alertgrid.setcolour"
+        #print msg
+        somecol = None
+        displaymap = wfobj_list[0]._instancegridmap
+
+        for ndx in range(len(displaymap)):
+            colinfo = displaymap[ndx] 
+            if colinfo[3] == "colour":
+                somecol = ndx
+
+        if somecol == None:
+            return
+
+        for row in range(self.grid.GetNumberRows()):
+            wfobj = self.grid.GetDataObj(row)
+            msg += "set bg colour for row: " + str(row)
+            colour = wxLIGHT_GREY
+
+            now = mx.DateTime.DateFromTicks(mx.DateTime.now())
+            duedate = wfobj._activity_due_date
+            wfobj_fields = wfobj.getActivity(wfobj.activityId).GetFields()
+            #print wfobj_fields
+            late = int(wfobj_fields["late"])
+            very_late = int(wfobj_fields["very_late"])
+            lost_cause = int(wfobj_fields["lost_cause"])
+
+            #print duedate, late, very_late, lost_cause
+
+            if duedate + mx.DateTime.RelativeDateTime(days=(+lost_cause)) <= now:
+                colour = wxColour(225, 0, 0)
+                msg += "; Waaay Overdue"
+            elif duedate + mx.DateTime.RelativeDateTime(days=(+very_late)) <= now:
+                colour = wxTheColourDatabase.FindColour("CORAL")
+                msg += "; Very Late"
+            elif duedate + mx.DateTime.RelativeDateTime(days=(+late)) <= now:
+                colour = wxTheColourDatabase.FindColour("YELLOW")
+                msg += "; Late"
+            else:
+                colour = wxColour(0, 240, 80)
+                msg += "; on time"
+
+            self.grid.SetCellBackgroundColour(row, somecol, colour)
+            #print msg
+
+##        get the attr for the wxAttrKind.Row (= 3)
+##        GetAttr needs the type of attr to get, despite what the docs say
+##        The values are:
+##        
+##        wxGridCellAttr.Any         (Any == 0)
+##        wxGridCellAttr.Default
+##        wxGridCellAttr.Cell
+##        wxGridCellAttr.Row
+##        wxGridCellAttr.Col
+##        wxGridCellAttr.Merged
+

Index: PanGalactic/pangalactic/enterprise/workflow/wffactory.py
diff -u PanGalactic/pangalactic/enterprise/workflow/wffactory.py:1.5 PanGalactic/pangalactic/enterprise/workflow/wffactory.py:1.6
--- PanGalactic/pangalactic/enterprise/workflow/wffactory.py:1.5	Mon Sep 29 13:35:50 2003
+++ PanGalactic/pangalactic/enterprise/workflow/wffactory.py	Thu Oct  2 15:31:23 2003
@@ -10,10 +10,10 @@
 
 DEFAULT_WORKFLOW = ("WF0",
                     
-                    {0:{"activity":"Initiated", "duration":"28", "description":"Initial Draft"},
-                     1:{"activity":"Draft",     "duration":"28", "description":"Final Draft"},
-                     2:{"activity":"Approved",  "duration":"14", "description":"Approved for Release"},
-                     3:{"activity":"Released",  "duration":"21", "description":"Released to Distribution List"}},
+                    {0:{"activity":"Initiated", "duration":"28", "late":"7",  "very_late":"30", "lost_cause":"60", "description":"Initial Draft"},
+                     1:{"activity":"Draft",     "duration":"28", "late":"14", "very_late":"60", "lost_cause":"30", "description":"Final Draft"},
+                     2:{"activity":"Approved",  "duration":"14", "late":"30", "very_late":"60", "lost_cause":"30", "description":"Approved for Release"},
+                     3:{"activity":"Released",  "duration":"21", "late":"30", "very_late":"30", "lost_cause":"90", "description":"Released to Distribution List"}},
                     
                     {0:{"from":"Initiated", "to":"Draft"},
                      1:{"from":"Draft",     "to":"Approved"},
@@ -100,12 +100,14 @@
         obj.oid = pgef_oid
         obj.pgef_oid = pgef_oid
         activities[pgef_oid] = obj
+        #print "activity", obj
         a_old2new[akey] = pgef_oid
 
         # synchronize the default start activity
         if akey == wfobj.defaultstartid:
             newwfobj.defaultstartid = pgef_oid
 
+    #print "activities", activities
     transitionsdict = {}
     t_old2new = {}
     for tkey, tvalue in wfobj.transitionsdict.items():

Index: PanGalactic/pangalactic/enterprise/workflow/workflowgrid.py
diff -u PanGalactic/pangalactic/enterprise/workflow/workflowgrid.py:1.6 PanGalactic/pangalactic/enterprise/workflow/workflowgrid.py:1.7
--- PanGalactic/pangalactic/enterprise/workflow/workflowgrid.py:1.6	Wed Oct  1 13:24:13 2003
+++ PanGalactic/pangalactic/enterprise/workflow/workflowgrid.py	Thu Oct  2 15:31:23 2003
@@ -82,7 +82,7 @@
 
 #        print "wfgrid.table.displaymapping", self.table.GetDisplayMapping()
 
-
+        
     def RefreshFromObjects(self):
         #simplified refresh
         #print "wfgrid.refresh"

Index: PanGalactic/pangalactic/enterprise/workflow/workflow_wizard.py
diff -u PanGalactic/pangalactic/enterprise/workflow/workflow_wizard.py:1.15 PanGalactic/pangalactic/enterprise/workflow/workflow_wizard.py:1.16
--- PanGalactic/pangalactic/enterprise/workflow/workflow_wizard.py:1.15	Thu Sep  4 16:04:25 2003
+++ PanGalactic/pangalactic/enterprise/workflow/workflow_wizard.py	Thu Oct  2 15:31:23 2003
@@ -78,6 +78,7 @@
 
         self.act_labels = []
         for actinfo in self.ActInfo:
+            print "actinfo", actinfo
             self.act_labels.append(actinfo[2])
 
         self.trans_labels = []
@@ -208,21 +209,18 @@
             
 
     def createWorkflow(self, name, activities, transitions):
-        #print "wizard.createWorkflow"
+        print "wizard.createWorkflow"
 
-#        process = wfprocess.WfProcess(name, {}, {}, canstartlist = [0], defaultstart = 0)
         process = wffactory.simpleWfProcess(name)
 
         activitydict = {}
         wfdata = None
         for akey, avalue in activities.items():
-            #print "akey", akey
-            #print "akey", akey, "; avalue", avalue
-#            wfactivity = wfactivity.WfActivity(avalue["activity"], avalue, wfdata, process.pgef_oid)
+            print "akey", akey, "; avalue", avalue
             wfactivity = wffactory.newWfActivity(avalue["activity"], process.pgef_oid, avalue, wfdata)
             activitydict[wfactivity.pgef_oid] = wfactivity
             self.DataManager.Add([wfactivity])
-        #print "activitydict", activitydict
+        print "activitydict", activitydict
         
         fromlist = []
         tolist = []
@@ -266,17 +264,16 @@
 
 
     def Save(self, event = None):
-        #print "workflow_wizard.save"
+        print "workflow_wizard.save"
         if self.DataManager.creatingWorkflow:
             self.DataManager.creatingWorkflow = false
             transitions = self.GetTransitions()
             activities = self.GetActivities()
 
             name = self.GetName()
-            #print "name <", name, ">"
+            print "name <", name, ">"
             if name:
                 self.workflow = self.createWorkflow(name, activities, transitions)
-#                self.workflow.setDataManager(self.DataManager)
                 self.DataManager.addWorkflow(self.workflow)
                 self.displayWgt.AddData(self.workflow)
                 self.saved_workflow = true
@@ -346,15 +343,34 @@
         row = 0
         key_col = 0
         time_col = 1
-        desc_col = 2
+        time_late_col = 2
+        time_very_late_col = 3
+        time_lost_cause_col = 4
+        desc_col = 5
         
         for akey, avalue in wfobj.activities.items():
             #print akey, avalue.fields
             self.activitygrid.SetCellValue(row, key_col, avalue.fields["activity"])
             self.activitygrid.SetCellValue(row, time_col, avalue.fields["duration"])
+            self.activitygrid.SetCellValue(row, time_late_col, avalue.fields["late"])
+            self.activitygrid.SetCellValue(row, time_very_late_col, avalue.fields["very_late"])
+            self.activitygrid.SetCellValue(row, time_lost_cause_col, avalue.fields["lost_cause"])
             self.activitygrid.SetCellValue(row, desc_col, avalue.fields["description"])
             row += 1
 
+        red = wxColour(225, 0, 0)
+        orange = wxTheColourDatabase.FindColour("CORAL")
+        yellow = wxTheColourDatabase.FindColour("YELLOW")
+        self.SetColBackgroundColour(self.activitygrid, time_lost_cause_col, red)
+        self.SetColBackgroundColour(self.activitygrid, time_very_late_col, orange)
+        self.SetColBackgroundColour(self.activitygrid, time_late_col, yellow)
+
+
+    def SetColBackgroundColour(self, grid, col, colour):
+        numrows = grid.GetNumberRows()
+        for row in range(numrows):
+            grid.SetCellBackgroundColour(row, col, colour)
+        
         
     def SetActivities(self, activitydict):
         for row, value in activitydict.items():

Index: PanGalactic/pangalactic/utils/datamanager.py
diff -u PanGalactic/pangalactic/utils/datamanager.py:1.33 PanGalactic/pangalactic/utils/datamanager.py:1.34
--- PanGalactic/pangalactic/utils/datamanager.py:1.33	Mon Sep 29 13:35:50 2003
+++ PanGalactic/pangalactic/utils/datamanager.py	Thu Oct  2 15:31:23 2003
@@ -1,6 +1,6 @@
 # $Source: /repo/step_testbed/PanGalactic/pangalactic/utils/datamanager.py,v $
 
-__version__ = "$Revision: 1.33 $"[11:-2]
+__version__ = "$Revision: 1.34 $"[11:-2]
 
 import time
 import mx.DateTime
@@ -92,6 +92,10 @@
         product_model_version = None
         
         PartNumber, Revision, ModelType, ModelRev  = data_list
+
+        #tbd make a project object and pass it in...
+        #project = Project(self.currentProject)
+        
         if PartNumber:
             #print 'Creating product master'
             product_master = ProductMaster(id = PartNumber,
@@ -100,21 +104,21 @@
             
         if product_master and Revision:
             #print 'Creating product version'
-            product_version = ProductVersion(pm = product_master,
+            product_version = ProductVersion(_of_master = product_master,
                                              project_id = self.currentProject,
                                              id = Revision,
                                              id_context = self.currentProject)
             
         if product_version and ModelType:
             #print 'Creating product model master'
-            product_model_master = ProductModelMaster(pv = product_version,
+            product_model_master = ProductModelMaster(_of_version = product_version,
                                                       project_id = self.currentProject,
                                                       id = ModelType,
                                                       id_context = self.currentProject)
             
         if product_model_master and ModelRev:
             #print 'Creating product model version'
-            product_model_version = ProductModelVersion(pmm = product_model_master,
+            product_model_version = ProductModelVersion(_of_model_master = product_model_master,
                                                         project_id = self.currentProject,
                                                         id = ModelRev,
                                                         id_context = self.currentProject)

From waterbug at ned.gsfc.nasa.gov  Thu Oct  2 22:50:36 2003
From: waterbug at ned.gsfc.nasa.gov (waterbug CVS)
Date: Thu Oct  2 21:50:38 2003
Subject: [Pangalactic-commits] Add scripts to setup and populate as separate
	database for unit tests.
Message-ID: <200310030150.h931oaRu005903@ned.gsfc.nasa.gov>

Modified files:
PanGalactic/src/sql/populate_pgertestdb.sh None 1.1
PanGalactic/src/sql/setup_pgertestdb.sh None 1.1

Log message:
Add scripts to setup and populate as separate database for unit tests.


From waterbug at ned.gsfc.nasa.gov  Thu Oct  2 22:58:54 2003
From: waterbug at ned.gsfc.nasa.gov (waterbug CVS)
Date: Thu Oct  2 21:58:55 2003
Subject: [Pangalactic-commits] Renamed setup_testpgerdb.sh and
	populate_testpgerdb.sh.
Message-ID: <200310030158.h931wsTO005973@ned.gsfc.nasa.gov>

Modified files:
PanGalactic/src/sql/populate_testpgerdb.sh None 1.1
PanGalactic/src/sql/setup_testpgerdb.sh None 1.1
PanGalactic/src/sql/README 1.4 1.5
PanGalactic/src/sql/populate_pgertestdb.sh 1.1 None
PanGalactic/src/sql/setup_pgertestdb.sh 1.1 None

Log message:
Renamed setup_testpgerdb.sh and populate_testpgerdb.sh.


Index: PanGalactic/src/sql/README
diff -u PanGalactic/src/sql/README:1.4 PanGalactic/src/sql/README:1.5
--- PanGalactic/src/sql/README:1.4	Sun Jun 15 21:39:02 2003
+++ PanGalactic/src/sql/README	Thu Oct  2 21:58:53 2003
@@ -1,10 +1,9 @@
-(1) insertPgerDbReferenceData.sql loads basic data that are
-needed to satisfy referential integrity constraints for some
-default values, so it needs to be run before any other data is
-added to PGERDB.
+(1) insertRefData.sql loads basic data that are needed to satisfy
+referential integrity constraints for some default values, so it
+needs to be run before any other data is added to PGERDB.
 
-(2) insertPgerDbTestData.sql loads data required by the test
-scripts in pangalactic.test
+(2) insertTestData.sql loads data required by the test scripts in
+pangalactic.test
 
 (3) The following are the shell and python scripts and data:
 
@@ -45,9 +44,6 @@
                         using the tablesunsorted file
 insertACUs.sql ........ inserts test data for
                         AssemblyComponentUsages
-insertPgerDbReferenceData.sql ... inserts reference data needed
-                        for all pgerdb data and applications
-insertPgerDbTestData.sql ... inserts basic test data
 insertProductMasters.sql ... inserts test data for ProductMasters
 insertProductModelMasters.sql ... inserts test data for 
                         ProductModelMasters
@@ -55,7 +51,8 @@
                         ProductModelVersions
 insertProductVersions.sql ... inserts test data for 
                         ProductVersions
-insertRefData.sql ..... inserts reference data used in tests
+insertRefData.sql ..... inserts reference data
+insertTestData.sql .... inserts basic test data
 listalters ............ generates a sorted list of all altered
                         tables
 listtables ............ generates a sorted list of all created
@@ -67,9 +64,13 @@
                         listtablesunsorted > tablesunsorted)
 populate_pgerdb.sh .... runs all scripts to load PGERDB with
                         reference data and test data
+populate_testpgerdb.sh ... runs all scripts to load the test PGERDB
+                        with reference data and test data
 README ................ this file
-setup_pgerdb.sh ......  creates PGERDB (if necessary) and runs
+setup_pgerdb.sh ....... creates PGERDB (if necessary) and runs
                         the create script
+setup_testpgerdb.sh ... creates a separate PGERDB for unit tests and
+                        runs the create script
 tables ................ a sorted list of all created tables
                         (created using listtables > tables)
 

From waterbug at ned.gsfc.nasa.gov  Thu Oct  2 23:15:12 2003
From: waterbug at ned.gsfc.nasa.gov (waterbug CVS)
Date: Thu Oct  2 22:15:13 2003
Subject: [Pangalactic-commits] Add unit test script for p.repo.factory.
Message-ID: <200310030215.h932FC2V006301@ned.gsfc.nasa.gov>

Modified files:
PanGalactic/pangalactic/test/ut_repofactory.py None 1.1
PanGalactic/pangalactic/test/IDTEST 1.12 1.13
PanGalactic/pangalactic/test/test_db_addrow.py 1.8 1.9
PanGalactic/pangalactic/test/test_db_addrows.py 1.1 1.2
PanGalactic/pangalactic/test/test_sql.py 1.5 1.6

Log message:
Add unit test script for p.repo.factory.


Index: PanGalactic/pangalactic/test/test_db_addrows.py
diff -u PanGalactic/pangalactic/test/test_db_addrows.py:1.1 PanGalactic/pangalactic/test/test_db_addrows.py:1.2
--- PanGalactic/pangalactic/test/test_db_addrows.py:1.1	Fri Sep 26 22:28:13 2003
+++ PanGalactic/pangalactic/test/test_db_addrows.py	Thu Oct  2 22:15:10 2003
@@ -1,4 +1,4 @@
-# $Id: test_db_addrows.py,v 1.1 2003/09/27 02:28:13 waterbug Exp $
+# $Id: test_db_addrows.py,v 1.2 2003/10/03 02:15:10 waterbug Exp $
 
 """
 Test for inserting a row using pangalactic.repo.db module
@@ -10,10 +10,14 @@
 import time, os
 from pprint import pprint
 from twisted.internet import reactor
-from twisted.enterprise import adbapi
 from pangalactic.repo.db import PgerDb
 from pangalactic.utils import oid
+from pangalactic.enterprise.productmaster import ProductMaster as PM
+from pangalactic.enterprise.productversion import ProductVersion as PV
+from pangalactic.enterprise.project import Project
+from pangalactic.utils.factory import PgefFactory as PF
 
+factory = PF()
 db = PgerDb()
 
 f = open('IDTEST')
@@ -27,46 +31,21 @@
 f.write(testid)
 f.close()
 
-pmid = testid
-pvid = testid + 'A'
+pmid = 'MD-' + testid
+pmname = 'Mr. Dynamo ' + testid
 
-dict = {
-        'product_version' : [
-            [('pgef_oid', testoid2),
-             ('name', 'Mr. Dynamo addRows' + testid + ' Version A'),
-             ('id', pvid),
-             ('id_context', 'TEST'),
-             ('of_pm_id', pmid),
-             ('of_pm_id_context', 'TEST'),
-             ('project_id', 'TEST'),
-             ('project_id_context', 'TEST')]
-            ],
-        'product_master' : [
-            [('pgef_oid', testoid1),
-             ('name', 'Mr. Dynamo addRows' + testid),
-             ('id', pmid),
-             ('id_context', 'TEST'),
-             ('project_id', 'TEST'),
-             ('project_id_context', 'TEST')]
-            ]
-        }
-
-pprint(dict)
-
-db.addRows(dict)
-
-print 'product_master:'
-print '  id = "%s"' % pmid
-print '  id_context = "%s"' % 'TEST'
-print
-print 'product_version:'
-print '  id = "%s"' % pvid
-print '  of_pm_id = "%s"' % testid
-print '  of_pm_id_context = "%s"' % 'TEST'
-print
+p = Project(pgef_oid='test.project.1', id='TEST', id_context='TEST')
+pm = PM(id=pmid, id_context='TEST', name=pmname, _project=p)
+pv = PV(_of_master=pm, id='A')
+
+pme = factory.extract(pm)
+pve = factory.extract(pv)
+
+extracts = [pme, pve]
+
+db.addRows(extracts)
 
 def success(stuff):
-    # now stuff is a tuple, (result, logmsg)
     pprint(stuff)
     reactor.stop()
 
@@ -74,15 +53,12 @@
     print error
     reactor.stop()
 
-res = db.doPgerdbQuery('pgef_object', 
-                       ('pgef_class', 'Product%'),
-                       ('name', 'Mr. Dynamo%')
-                      )
-
 res.addCallbacks(success, failure)
 
 reactor.run() # start the main loop
 
-time.sleep(1)
 
-reactor.stop()
+res = db.doPgerdbQuery('pgef_object', 1,
+                       ('pgef_class', 'Product%'),
+                       ('name', 'Mr. Dynamo%')
+                      )

Index: PanGalactic/pangalactic/test/test_db_addrow.py
diff -u PanGalactic/pangalactic/test/test_db_addrow.py:1.8 PanGalactic/pangalactic/test/test_db_addrow.py:1.9
--- PanGalactic/pangalactic/test/test_db_addrow.py:1.8	Mon Sep 15 16:38:32 2003
+++ PanGalactic/pangalactic/test/test_db_addrow.py	Thu Oct  2 22:15:10 2003
@@ -1,4 +1,4 @@
-# $Id: test_db_addrow.py,v 1.8 2003/09/15 20:38:32 waterbug Exp $
+# $Id: test_db_addrow.py,v 1.9 2003/10/03 02:15:10 waterbug Exp $
 
 """
 Test for inserting a row using pangalactic.repo.db module
@@ -8,6 +8,7 @@
 """
 
 import time, os
+from pprint import pprint
 from twisted.internet import reactor
 from twisted.enterprise import adbapi
 from pangalactic.repo.db import PgerDb
@@ -25,20 +26,21 @@
 f.write(testid)
 f.close()
 
-db.addRow('product_master', pgef_oid=testoid, name='Mr. Dynamo', 
-               id=testid, id_context='TEST', 
-               project_id='TEST', project_id_context='TEST')
-
 def success(stuff):
     # now stuff is a tuple, (result, logmsg)
-    print stuff
+    pprint(stuff)
     reactor.stop()
 
 def failure(error):
     print error
     reactor.stop()
 
-res = db.doPgerdbQuery('product_master', ('name', 'Mr. Dynamo'))
+db.addRow('product_master', pgef_oid=testoid, name='Mr. Dynamo', 
+               id=testid, id_context='TEST', 
+               project_id='TEST', project_id_context='TEST')
+
+res = db.doPgerdbQuery('product_master', 0,
+                       ('name', 'Mr. Dynamo'))
 res.addCallbacks(success, failure)
 
 reactor.run() # start the main loop
@@ -46,3 +48,4 @@
 time.sleep(1)
 
 reactor.stop()
+

Index: PanGalactic/pangalactic/test/IDTEST
diff -u PanGalactic/pangalactic/test/IDTEST:1.12 PanGalactic/pangalactic/test/IDTEST:1.13
--- PanGalactic/pangalactic/test/IDTEST:1.12	Fri Sep 26 22:20:06 2003
+++ PanGalactic/pangalactic/test/IDTEST	Thu Oct  2 22:15:10 2003
@@ -1 +1 @@
-166
\ No newline at end of file
+189
\ No newline at end of file

Index: PanGalactic/pangalactic/test/test_sql.py
diff -u PanGalactic/pangalactic/test/test_sql.py:1.5 PanGalactic/pangalactic/test/test_sql.py:1.6
--- PanGalactic/pangalactic/test/test_sql.py:1.5	Fri Sep 26 22:20:06 2003
+++ PanGalactic/pangalactic/test/test_sql.py	Thu Oct  2 22:15:11 2003
@@ -1,4 +1,4 @@
-# $Id: test_sql.py,v 1.5 2003/09/27 02:20:06 waterbug Exp $
+# $Id: test_sql.py,v 1.6 2003/10/03 02:15:11 waterbug Exp $
 
 """
 Functional tests for pangalactic.utils.sql module
@@ -16,7 +16,7 @@
 
     def test_1_equals(self):
         """CASE:  one string column, '=' operator"""
-        cmd = buildSelect('product_master',
+        cmd = buildSelect('product_master', 0,
                           ('id_context', 'TEST', '='))
         expected = ('SELECT * FROM ONLY product_master WHERE id_context = %s', 
                     'TEST')
@@ -24,7 +24,7 @@
 
     def test_2_equals_and_like(self):
         """CASE:  several string columns; like and ="""
-        cmd = buildSelect('product_master',
+        cmd = buildSelect('product_master', 0,
                           ('id_context', 'TEST', '='),
                           ('name', 'Mr. F')
                          )
@@ -33,7 +33,7 @@
 
     def test_3_in_sequence(self):
         """CASE:  one column and a sequence of values"""
-        cmd = buildSelect('alert', 
+        cmd = buildSelect('alert', 0,
                           ('doc_number', 
                            ("XG4-D-02-03", 
                             "XG4-D-02-05", 
@@ -43,7 +43,7 @@
 
     def test_4_date_interval(self):
         """CASE:  date interval"""
-        cmd = buildSelect('alert',
+        cmd = buildSelect('alert', 0,
                           ('doc_issue_date', '2002-04-01', '>'),
                           ('doc_issue_date', '2002-05-01', '<')
                          )
@@ -52,7 +52,7 @@
 
     def test_5_sort(self):
         """CASE:  order by one column"""
-        cmd = buildSelect('alert',
+        cmd = buildSelect('alert', 0,
                           ('doc_issue_date', '2002-04-01', '>'),
                           sort='doc_issue_date')
         expected = ('SELECT * FROM ONLY alert WHERE doc_issue_date > %s ORDER BY doc_issue_date', '2002-04-01')
@@ -60,7 +60,7 @@
 
     def test_6_multi_sort(self):
         """CASE:  order by multiple columns"""
-        cmd = buildSelect('alert',
+        cmd = buildSelect('alert', 0,
                           ('doc_issue_date', '2002-04-01', '>'),
                           sort=('doc_issue_date', 'doc_designator')
                          )

From waterbug at ned.gsfc.nasa.gov  Thu Oct  2 23:33:54 2003
From: waterbug at ned.gsfc.nasa.gov (waterbug CVS)
Date: Thu Oct  2 22:33:55 2003
Subject: [Pangalactic-commits] Clean out obsolete self-test code (keep the
	function; update later).
Message-ID: <200310030233.h932Xsln006382@ned.gsfc.nasa.gov>

Modified files:
PanGalactic/pangalactic/repo/factory.py 1.25 1.26

Log message:
Clean out obsolete self-test code (keep the function; update later).


Index: PanGalactic/pangalactic/repo/factory.py
diff -u PanGalactic/pangalactic/repo/factory.py:1.25 PanGalactic/pangalactic/repo/factory.py:1.26
--- PanGalactic/pangalactic/repo/factory.py:1.25	Mon Sep 29 14:45:26 2003
+++ PanGalactic/pangalactic/repo/factory.py	Thu Oct  2 22:33:52 2003
@@ -1,11 +1,11 @@
-# $Id: factory.py,v 1.25 2003/09/29 18:45:26 waterbug Exp $
+# $Id: factory.py,v 1.26 2003/10/03 02:33:52 waterbug Exp $
 
 """
 Pan Galactic Object Factory module
-@version: $Revision: 1.25 $
+@version: $Revision: 1.26 $
 """
 
-__version__ = "$Revision: 1.25 $"[11:-2]
+__version__ = "$Revision: 1.26 $"[11:-2]
 
 import types
 from pprint import pprint
@@ -49,34 +49,59 @@
     def test(self, classname):
         """
         Test the factory.
-        
-        @param classname:  the name of a class that occurs in
-                           self._registry.pger_objects.values()
         """
-        print '  - class is:   %s' % classname
-        print """  - initparms for '%s' objects are:""" % classname
-        pprint(self._registry.obj_init_parms[classname])
+        pass
 
     def makeExtracts(self, reslist):
         """
-        Convert a pyPgSQL resultset into an S-expression-style
-        list of strings and integers for transport.
+        Convert a pyPgSQL resultset into "extract" format (see
+        L{pangalactic.utils.factory}).
         """
-        extractlist = []
+        extracts = []
         if reslist:
             for res in reslist:
                 obj = self._registry.pgerdb_classes[res.pgef_class]
                 schema = obj._schema
                 module = obj.__module__
-                data = [ [a, self.cook(getattr(res, a), schema[a])] 
-                         for a in schema ]
+                s = [ (a, self.cook(getattr(res, a), schema[a]))
+                      for a in schema ]
+                if obj._refd:
+                    # strictly for testing purposes!
+                    r = [ (a, 'pgef_oid')
+                          for a in obj._refd ]
+                    s += r
+                instdict = dict(s)
                 name = module + '.' + res.pgef_class
-                extr = [ name, data ]
-                extractlist.append(extr)
-            return extractlist
+                extr = [ name, instdict ]
+                extracts.append(extr)
+            return extracts
         else:
             return []
 
+    def extracts2Records(self, extracts):
+        """
+        Take a list of extracts and convert them to a list of
+        "records" for use in the addRows() method of
+        L{pangalactic.repo.db.PgerDb}.
+
+        @type extracts:   a list
+        @param extracts:  a list of extracts -- see
+                          L{pangalactic.utils.factory.extract}
+
+        @rtype:  list
+        @return: a list of "records".  A record has the following
+                 structure:  [tablename, {colname : value, ...}]
+        """
+        recs = []
+        for e in extracts:
+            classname = e[0].split('.')[-1]
+            schema = self._registry.pgef_classes[classname]._schema
+            table = self._registry.getTableName(classname)
+            for a in e[1]:
+                e[1][a] = self._factory.uncook(e[1][a], schema[a])
+            recs.append([table, e[1]])
+        return recs
+
     def unmakeObject(self, obj):
         """
         Take an object and return its attributes as a dictionary
@@ -118,8 +143,8 @@
         for row in resultsets:
             # create kw dict for initialization string ...
             initparms = {}
-            for i in schema:
-                initparms[i] = getattr(row, i)
+            for a in schema:
+                initparms[a] = getattr(row, a)
             # initialize the object 
             o = klass(**initparms)
             objectlist.append(o)

From waterbug at ned.gsfc.nasa.gov  Sat Oct  4 01:26:10 2003
From: waterbug at ned.gsfc.nasa.gov (waterbug CVS)
Date: Sat Oct  4 00:26:12 2003
Subject: [Pangalactic-commits] Mods for working tests;
	even a real twisted-trial-style unit test,
	and test_db_addrows works! (RARR!!)
Message-ID: <200310040426.h944QAaD025106@ned.gsfc.nasa.gov>

Modified files:
PanGalactic/pangalactic/test/test_factory_extracts2Records.py None 1.1
PanGalactic/pangalactic/test/ut_sql.py None 1.1
PanGalactic/pangalactic/test/IDTEST 1.13 1.14
PanGalactic/pangalactic/test/test_db_addrow.py 1.9 1.10
PanGalactic/pangalactic/test/test_db_addrows.py 1.2 1.3
PanGalactic/pangalactic/test/test_sql.py 1.6 1.7
PanGalactic/pangalactic/test/ut_repofactory.py 1.1 1.2

Log message:
Mods for working tests; even a real twisted-trial-style unit test, and test_db_addrows works!  (RARR!!)


Index: PanGalactic/pangalactic/test/IDTEST
diff -u PanGalactic/pangalactic/test/IDTEST:1.13 PanGalactic/pangalactic/test/IDTEST:1.14
--- PanGalactic/pangalactic/test/IDTEST:1.13	Thu Oct  2 22:15:10 2003
+++ PanGalactic/pangalactic/test/IDTEST	Sat Oct  4 00:26:08 2003
@@ -1 +1 @@
-189
\ No newline at end of file
+220
\ No newline at end of file

Index: PanGalactic/pangalactic/test/test_db_addrow.py
diff -u PanGalactic/pangalactic/test/test_db_addrow.py:1.9 PanGalactic/pangalactic/test/test_db_addrow.py:1.10
--- PanGalactic/pangalactic/test/test_db_addrow.py:1.9	Thu Oct  2 22:15:10 2003
+++ PanGalactic/pangalactic/test/test_db_addrow.py	Sat Oct  4 00:26:08 2003
@@ -1,4 +1,4 @@
-# $Id: test_db_addrow.py,v 1.9 2003/10/03 02:15:10 waterbug Exp $
+# $Id: test_db_addrow.py,v 1.10 2003/10/04 04:26:08 waterbug Exp $
 
 """
 Test for inserting a row using pangalactic.repo.db module
@@ -16,18 +16,17 @@
 
 db = PgerDb()
 
-f = open(os.getcwd() + '/IDTEST')
+f = open('IDTEST')
 savedid = f.read()
 testoid = oid.generate('test')
 
 testid = str(int(savedid) + 1)
 f.close()
-f = open(os.getcwd() + '/IDTEST', 'w')
+f = open('IDTEST', 'w')
 f.write(testid)
 f.close()
 
 def success(stuff):
-    # now stuff is a tuple, (result, logmsg)
     pprint(stuff)
     reactor.stop()
 
@@ -35,17 +34,16 @@
     print error
     reactor.stop()
 
-db.addRow('product_master', pgef_oid=testoid, name='Mr. Dynamo', 
-               id=testid, id_context='TEST', 
-               project_id='TEST', project_id_context='TEST')
+def ifNone(x):
+    if not x:
+        res = db.doPgerdbQuery('product_master', 0,
+                                ('name', 'Mr. Dynamo'))
+        res.addCallbacks(success, failure)
+
+out = db.addRow('product_master', pgef_oid=testoid, name='Mr. Dynamo', 
+                id=testid, id_context='TEST', 
+                project_id='TEST', project_id_context='TEST')
+out.addCallback(ifNone)
 
-res = db.doPgerdbQuery('product_master', 0,
-                       ('name', 'Mr. Dynamo'))
-res.addCallbacks(success, failure)
-
-reactor.run() # start the main loop
-
-time.sleep(1)
-
-reactor.stop()
+reactor.run()
 

Index: PanGalactic/pangalactic/test/test_db_addrows.py
diff -u PanGalactic/pangalactic/test/test_db_addrows.py:1.2 PanGalactic/pangalactic/test/test_db_addrows.py:1.3
--- PanGalactic/pangalactic/test/test_db_addrows.py:1.2	Thu Oct  2 22:15:10 2003
+++ PanGalactic/pangalactic/test/test_db_addrows.py	Sat Oct  4 00:26:08 2003
@@ -1,4 +1,4 @@
-# $Id: test_db_addrows.py,v 1.2 2003/10/03 02:15:10 waterbug Exp $
+# $Id: test_db_addrows.py,v 1.3 2003/10/04 04:26:08 waterbug Exp $
 
 """
 Test for inserting a row using pangalactic.repo.db module
@@ -15,9 +15,11 @@
 from pangalactic.enterprise.productmaster import ProductMaster as PM
 from pangalactic.enterprise.productversion import ProductVersion as PV
 from pangalactic.enterprise.project import Project
-from pangalactic.utils.factory import PgefFactory as PF
+from pangalactic.repo.factory import PgerObjectFactory as POF
+from pangalactic.repo.registry import PgerObjectRegistry as POR
 
-factory = PF()
+reg = POR()
+fac = POF(reg)
 db = PgerDb()
 
 f = open('IDTEST')
@@ -31,19 +33,26 @@
 f.write(testid)
 f.close()
 
+projid = 'MD' + testid
+projname = 'MD' + testid + ' Project'
 pmid = 'MD-' + testid
-pmname = 'Mr. Dynamo ' + testid
+pmname = 'MD-' + testid + ' Model Mr. Dynamo'
+pvname = 'MD-' + testid + ' Version A'
 
-p = Project(pgef_oid='test.project.1', id='TEST', id_context='TEST')
+# create test objects
+p = Project(id=projid, id_context='TEST', name=projname)
+p.popTestData()
 pm = PM(id=pmid, id_context='TEST', name=pmname, _project=p)
-pv = PV(_of_master=pm, id='A')
+pm.popTestData()
+pv = PV(_of_master=pm, id='A', name=pvname)
+pv.popTestData()
+
+pe = fac.extract(p)
+pme = fac.extract(pm)
+pve = fac.extract(pv)
 
-pme = factory.extract(pm)
-pve = factory.extract(pv)
-
-extracts = [pme, pve]
-
-db.addRows(extracts)
+extracts = [pe, pme, pve]
+recs = fac.extracts2Records(extracts)
 
 def success(stuff):
     pprint(stuff)
@@ -53,12 +62,14 @@
     print error
     reactor.stop()
 
-res.addCallbacks(success, failure)
+def ifNone(x):
+    if not x:
+        res = db.doPgerdbQuery('pgef_object', 1,
+                               ('name', 'MD'))
+        res.addCallbacks(success, failure)
 
-reactor.run() # start the main loop
+out = db.addRows(recs)
+out.addCallback(ifNone)
 
+reactor.run()
 
-res = db.doPgerdbQuery('pgef_object', 1,
-                       ('pgef_class', 'Product%'),
-                       ('name', 'Mr. Dynamo%')
-                      )

Index: PanGalactic/pangalactic/test/test_sql.py
diff -u PanGalactic/pangalactic/test/test_sql.py:1.6 PanGalactic/pangalactic/test/test_sql.py:1.7
--- PanGalactic/pangalactic/test/test_sql.py:1.6	Thu Oct  2 22:15:11 2003
+++ PanGalactic/pangalactic/test/test_sql.py	Sat Oct  4 00:26:08 2003
@@ -1,4 +1,4 @@
-# $Id: test_sql.py,v 1.6 2003/10/03 02:15:11 waterbug Exp $
+# $Id: test_sql.py,v 1.7 2003/10/04 04:26:08 waterbug Exp $
 
 """
 Functional tests for pangalactic.utils.sql module
@@ -15,7 +15,7 @@
 class SqlGenerationTest(unittest.TestCase):
 
     def test_1_equals(self):
-        """CASE:  one string column, '=' operator"""
+        """CASE:  build a SELECT by one string column, '=' operator"""
         cmd = buildSelect('product_master', 0,
                           ('id_context', 'TEST', '='))
         expected = ('SELECT * FROM ONLY product_master WHERE id_context = %s', 
@@ -23,7 +23,7 @@
         self.assertEquals(expected, cmd)
 
     def test_2_equals_and_like(self):
-        """CASE:  several string columns; like and ="""
+        """CASE:  build a SELECT by several string columns; like and ="""
         cmd = buildSelect('product_master', 0,
                           ('id_context', 'TEST', '='),
                           ('name', 'Mr. F')
@@ -32,7 +32,7 @@
         self.assertEquals(expected, cmd)
 
     def test_3_in_sequence(self):
-        """CASE:  one column and a sequence of values"""
+        """CASE:  build a SELECT by one column with a sequence of values"""
         cmd = buildSelect('alert', 0,
                           ('doc_number', 
                            ("XG4-D-02-03", 
@@ -42,7 +42,7 @@
         self.assertEquals(expected, cmd)
 
     def test_4_date_interval(self):
-        """CASE:  date interval"""
+        """CASE:  build a SELECT by date interval"""
         cmd = buildSelect('alert', 0,
                           ('doc_issue_date', '2002-04-01', '>'),
                           ('doc_issue_date', '2002-05-01', '<')
@@ -51,7 +51,7 @@
         self.assertEquals(expected, cmd)
 
     def test_5_sort(self):
-        """CASE:  order by one column"""
+        """CASE:  build a SELECT with order by one column"""
         cmd = buildSelect('alert', 0,
                           ('doc_issue_date', '2002-04-01', '>'),
                           sort='doc_issue_date')
@@ -59,7 +59,7 @@
         self.assertEquals(expected, cmd)
 
     def test_6_multi_sort(self):
-        """CASE:  order by multiple columns"""
+        """CASE:  build a SELECT with order by multiple columns"""
         cmd = buildSelect('alert', 0,
                           ('doc_issue_date', '2002-04-01', '>'),
                           sort=('doc_issue_date', 'doc_designator')
@@ -67,30 +67,21 @@
         expected = ('SELECT * FROM ONLY alert WHERE doc_issue_date > %s ORDER BY doc_issue_date, doc_designator,', '2002-04-01')
         self.assertEquals(expected, cmd)
 
-    def test_7_insert_from_args(self):
-        """CASE:  insert a record into a table (using arg signature)"""
-        cmd = buildInsert('product_master',
-                          ('id', '123'),
-                          ('id_context', 'TEST')
-                         )
-        expected = ('INSERT INTO product_master (id, id_context) VALUES (%s, %s)', '123', 'TEST')
-        self.assertEquals(expected, cmd)
-
-    def test_8_insert_from_kws(self):
-        """CASE:  insert a record into a table (using kw signature)"""
-        cmd = buildInsert('product_master',
-                          **{'id' : '123',
-                             'id_context' : 'TEST'}
-                         )
-        expected = ('INSERT INTO product_master (id_context, id) VALUES (%s, %s)', 'TEST', '123')
-        self.assertEquals(expected, cmd)
-
-    def test_9_sqlinsert_from_args(self):
-        """CASE:  sql string to insert a record into a table (using arg signature)"""
-        cmd = buildSQLInsert('product_master',
-                          ('id', '123'),
-                          ('id_context', 'TEST')
-                         )
-        expected = ("""INSERT INTO product_master (id, id_context) VALUES ('123', 'TEST')""")
-        self.assertEquals(expected, cmd)
+    def test_7_buildInsert(self):
+        """CASE:  build an INSERT statement + parameter list"""
+        result = buildInsert('product_master',
+                             {'id' : '123',
+                              'id_context' : 'TEST'}
+                            )
+        expected = ('INSERT INTO product_master (id_context, id) VALUES (%s, %s)', ('TEST', '123'))
+        self.assertEquals(expected, result)
+
+#     def test_9_buildTransaction(self):
+#         """CASE:  sql string to insert a record into a table (using arg signature)"""
+#         cmd = buildInsert('product_master',
+#                           ('id', '123'),
+#                           ('id_context', 'TEST')
+#                          )
+#         expected = ("""INSERT INTO product_master (id, id_context) VALUES ('123', 'TEST')""")
+#         self.assertEquals(expected, cmd)
 

Index: PanGalactic/pangalactic/test/ut_repofactory.py
diff -u PanGalactic/pangalactic/test/ut_repofactory.py:1.1 PanGalactic/pangalactic/test/ut_repofactory.py:1.2
--- PanGalactic/pangalactic/test/ut_repofactory.py:1.1	Thu Oct  2 22:15:11 2003
+++ PanGalactic/pangalactic/test/ut_repofactory.py	Sat Oct  4 00:26:08 2003
@@ -1,4 +1,4 @@
-# $Id: ut_repofactory.py,v 1.1 2003/10/03 02:15:11 waterbug Exp $
+# $Id: ut_repofactory.py,v 1.2 2003/10/04 04:26:08 waterbug Exp $
 
 """
 Unit tests for pangalactic.repo.factory module
@@ -7,101 +7,102 @@
 from twisted.trial import unittest
 from twisted.internet import reactor
 from pangalactic.repo.db import PgerDb
-from pangalactic.repo.factory import PgerObjectFactory
-from pangalactic.repo.registry import PgerObjectRegistry
-
-typename = 'ProductMaster'
-
-def success(objectlist):
-    print objectlist
-    for o in objectlist:
-        print o
-    print "\n***  %s %s object(s) found.  ***\n" % (len(objectlist), typename)
-    reactor.stop()
-
-def failure(error):
-    print error
-    reactor.stop()
-
-db = PgerDb()
-registry = PgerObjectRegistry()
-factory = PgerObjectFactory(registry)
-
-result = db.doPgerdbQuery('product_master', 0, ['id_context', 'TEST', '='])
-result.addCallbacks(lambda x: factory.makeObjects(typename, x)).addCallbacks(success, failure)
-
-reactor.run() # start the main loop
-
-"""
-Functional test for pangalactic.repo.factory module 
-*** using non-deferred input ***
-  - connects to PostgreSQL using adbapi.py
-  - executes *synchronous* query
-  - runs factory.makeobjects on result
-  - outputs resulting list of objects
-"""
-
-from pyPgSQL import PgSQL
-from pangalactic.repo.factory import PgerObjectFactory
-from pangalactic.repo.registry import PgerObjectRegistry
-
-registry = PgerObjectRegistry()
-factory = PgerObjectFactory(registry)
-
-conn = PgSQL.connect(database='pgerdb')
-curs = conn.cursor()
-curs.execute('SELECT * from product_model_version where name = %s', 
-            ('HOG-42'))
-result = curs.fetchall()
-print result
-objectlist = factory.makeObjects('ProductModelVersion', result)
-for o in objectlist:
-    print o
-
-"""
-Functional test of pangalactic.repo.factory.PgefObjectFactory
-test(classname) method
-"""
-__version__ = "$Revision: 1.1 $"[11:-2]
-
-import sys
 from pangalactic.repo.registry import PgerObjectRegistry as POR
 from pangalactic.repo.factory import PgerObjectFactory as POF
 
-registry = POR()
-factory = POF(registry)
-
-print "dir(): %s" % dir()
-print
-print "dir(factory): %s" % dir(factory)
-
-for classname in registry.pgerdb_classes:
-    print """\nRunning factory.test('%s'):\n""" % classname
-    factory.test(classname)
-
-# $Id: ut_repofactory.py,v 1.1 2003/10/03 02:15:11 waterbug Exp $
-
-"""
-Functional test for pangalactic.repo.db module
-  - connects to PostgreSQL using adbapi.py
-  - executes asynchronous query
-  - outputs result of callback
-"""
-
-import sys
-from twisted.enterprise import adbapi
-from pangalactic.repo.db import PgerDb as PDB
-from pangalactic.repo.registry import PgerObjectRegistry as POR
-from pangalactic.repo.factory import PgerObjectFactory as POF
-from pangalactic.enterprise.productversion import ProductVersion as PV
+class RepoFactoryTest(unittest.TestCase):
 
-db = PDB()
-registry = POR()
-factory = POF(registry)
-
-print """\nRunning factory.unmake on ProductVersion:\n"""
-pv = PV()
-dict, t = factory.unmakeObject(pv)
-print 'table is:  %s' % t
-print 'dict is:'
-print dict
+    def __init__(self):
+        self.registry = POR()
+        self.factory = POF(self.registry)
+
+
+    def test_1_factory_extracts2Records(self):
+        """CASE:  PgerObjectFactory self-test"""
+        input = [['foo.bar.baz.Project', 
+                    {'id_context': 'TEST',
+                     'id': 'H2G2',
+                     'name': 'HitchHikers Guide'}]]
+        expected = [['project', 
+                    {'id_context': 'TEST',
+                     'id': 'H2G2',
+                     'name': 'HitchHikers Guide'}]]
+        output = self.factory.extracts2Records(input)
+        self.assertEquals(expected, output)
+
+
+# typename = 'ProductMaster'
+# 
+# def success(objectlist):
+#     print objectlist
+#     for o in objectlist:
+#         print o
+#     print "\n***  %s %s object(s) found.  ***\n" % (len(objectlist), typename)
+#     reactor.stop()
+# 
+# def failure(error):
+#     print error
+#     reactor.stop()
+# 
+# db = PgerDb()
+# registry = PgerObjectRegistry()
+# factory = PgerObjectFactory(registry)
+# 
+# result = db.doPgerdbQuery('product_master', 0, ['id_context', 'TEST', '='])
+# result.addCallbacks(lambda x: factory.makeObjects(typename, x)).addCallbacks(success, failure)
+# 
+# reactor.run() # start the main loop
+# 
+# """
+# Functional test for pangalactic.repo.factory module 
+# *** using non-deferred input ***
+#   - connects to PostgreSQL using adbapi.py
+#   - executes *synchronous* query
+#   - runs factory.makeobjects on result
+#   - outputs resulting list of objects
+# """
+# 
+# from pyPgSQL import PgSQL
+# from pangalactic.repo.factory import PgerObjectFactory
+# from pangalactic.repo.registry import PgerObjectRegistry
+# 
+# registry = PgerObjectRegistry()
+# factory = PgerObjectFactory(registry)
+# 
+# conn = PgSQL.connect(database='pgerdb')
+# curs = conn.cursor()
+# curs.execute('SELECT * from product_model_version where name = %s', 
+#             ('HOG-42'))
+# result = curs.fetchall()
+# print result
+# objectlist = factory.makeObjects('ProductModelVersion', result)
+# for o in objectlist:
+#     print o
+# 
+# 
+# # $Id: ut_repofactory.py,v 1.2 2003/10/04 04:26:08 waterbug Exp $
+# 
+# """
+# Functional test for pangalactic.repo.db module
+#   - connects to PostgreSQL using adbapi.py
+#   - executes asynchronous query
+#   - outputs result of callback
+# """
+# 
+# import sys
+# from twisted.enterprise import adbapi
+# from pangalactic.repo.db import PgerDb as PDB
+# from pangalactic.repo.registry import PgerObjectRegistry as POR
+# from pangalactic.repo.factory import PgerObjectFactory as POF
+# from pangalactic.enterprise.productversion import ProductVersion as PV
+# 
+# db = PDB()
+# registry = POR()
+# factory = POF(registry)
+# 
+# print """\nRunning factory.unmake on ProductVersion:\n"""
+# pv = PV()
+# dict, t = factory.unmakeObject(pv)
+# print 'table is:  %s' % t
+# print 'dict is:'
+# print dict

From waterbug at ned.gsfc.nasa.gov  Sat Oct  4 01:51:25 2003
From: waterbug at ned.gsfc.nasa.gov (waterbug CVS)
Date: Sat Oct  4 00:51:26 2003
Subject: [Pangalactic-commits] More test fixes and renaming of
	test_factory_async.py to test_factory_makeObjects.py.
Message-ID: <200310040451.h944pP9u025216@ned.gsfc.nasa.gov>

Modified files:
PanGalactic/pangalactic/test/test_factory_makeObjects.py None 1.1
PanGalactic/pangalactic/test/README 1.14 1.15
PanGalactic/pangalactic/test/test_factory_sync.py 1.4 1.5
PanGalactic/pangalactic/test/test_factory_test.py 1.5 1.6
PanGalactic/pangalactic/test/test_factory_async.py 1.8 None

Log message:
More test fixes and renaming of test_factory_async.py to test_factory_makeObjects.py.


Index: PanGalactic/pangalactic/test/test_factory_test.py
diff -u PanGalactic/pangalactic/test/test_factory_test.py:1.5 PanGalactic/pangalactic/test/test_factory_test.py:1.6
--- PanGalactic/pangalactic/test/test_factory_test.py:1.5	Mon Sep 15 16:38:32 2003
+++ PanGalactic/pangalactic/test/test_factory_test.py	Sat Oct  4 00:51:24 2003
@@ -2,20 +2,17 @@
 Functional test of pangalactic.repo.factory.PgefObjectFactory
 test(classname) method
 """
-__version__ = "$Revision: 1.5 $"[11:-2]
+__version__ = "$Revision: 1.6 $"[11:-2]
 
-import sys
-from pangalactic.repo.registry import PgerObjectRegistry as POR
-from pangalactic.repo.factory import PgerObjectFactory as POF
+# TODO:  the factory self-test code has been scrapped -- needs to
+# be re-implemented when time allows.
 
-registry = POR()
-factory = POF(registry)
+# import sys
+# from pangalactic.repo.registry import PgerObjectRegistry as POR
+# from pangalactic.repo.factory import PgerObjectFactory as POF
+# 
+# registry = POR()
+# factory = POF(registry)
 
-print "dir(): %s" % dir()
-print
-print "dir(factory): %s" % dir(factory)
-
-for classname in registry.pgerdb_classes:
-    print """\nRunning factory.test('%s'):\n""" % classname
-    factory.test(classname)
+print "\nThis test has been deactivated for refurbishment.\n"
 

Index: PanGalactic/pangalactic/test/README
diff -u PanGalactic/pangalactic/test/README:1.14 PanGalactic/pangalactic/test/README:1.15
--- PanGalactic/pangalactic/test/README:1.14	Mon Sep  8 15:50:24 2003
+++ PanGalactic/pangalactic/test/README	Sat Oct  4 00:51:24 2003
@@ -1,20 +1,24 @@
-$Id: README,v 1.14 2003/09/08 19:50:24 waterbug Exp $
+$Id: README,v 1.15 2003/10/04 04:51:24 waterbug Exp $
 
 Pan Galactic Engineering Repository Test Scripts
 ================================================
 Package:  pangalactic.repo
 Prep:     These tests require the test data to be
           loaded into PgerDb -- run the script:
-          Pangalactic/src/sql/insertPgerDbTestData.sql
+          Pangalactic/src/sql/populate_pgerdb.sh
+              (TODO:  set up a separate test database: 
+                      "testpgerdb")
 Graph:
 
 test_glimpse_getfulltext.py
 test_sql.py
 test_db_runquery.py
 test_db_runsequencequery.py
-test_db_addrow.py           test_registry.py
-            \               /
+test_db_addrow.py
+test_db_addrows.py        test_registry.py
+            \              /
         test_factory_test.py
+        test_factory_extracts2Records.py
         test_factory_sync.py
         test_factory_async.py
         test_factory_unmake.py

Index: PanGalactic/pangalactic/test/test_factory_sync.py
diff -u PanGalactic/pangalactic/test/test_factory_sync.py:1.4 PanGalactic/pangalactic/test/test_factory_sync.py:1.5
--- PanGalactic/pangalactic/test/test_factory_sync.py:1.4	Mon Sep 15 16:38:32 2003
+++ PanGalactic/pangalactic/test/test_factory_sync.py	Sat Oct  4 00:51:24 2003
@@ -1,4 +1,4 @@
-# $Id: test_factory_sync.py,v 1.4 2003/09/15 20:38:32 waterbug Exp $
+# $Id: test_factory_sync.py,v 1.5 2003/10/04 04:51:24 waterbug Exp $
 
 """
 Functional test for pangalactic.repo.factory module 
@@ -19,10 +19,13 @@
 conn = PgSQL.connect(database='pgerdb')
 curs = conn.cursor()
 curs.execute('SELECT * from product_model_version where name = %s', 
-            ('HOG-42'))
+             ('HOG-42'))
 result = curs.fetchall()
+print "\nQuery result is:"
 print result
-objectlist = factory.makeObjects('ProductModelVersion', result)
-for o in objectlist:
+objs = factory.makeObjects('ProductModelVersion', result)
+print "\nObjects returned by factory.makeObjects() are:"
+for o in objs:
     print o
+print
 

From waterbug at ned.gsfc.nasa.gov  Sat Oct  4 02:11:34 2003
From: waterbug at ned.gsfc.nasa.gov (waterbug CVS)
Date: Sat Oct  4 01:11:36 2003
Subject: [Pangalactic-commits] Mods and rename of test_factory_unmake.py to
	test_factory_unmakeObject.py.
Message-ID: <200310040511.h945BYWw025318@ned.gsfc.nasa.gov>

Modified files:
PanGalactic/pangalactic/test/test_factory_unmakeObject.py None 1.1
PanGalactic/pangalactic/test/README 1.15 1.16
PanGalactic/pangalactic/test/test_factory_unmake.py 1.6 None

Log message:
Mods and rename of test_factory_unmake.py to test_factory_unmakeObject.py.


Index: PanGalactic/pangalactic/test/README
diff -u PanGalactic/pangalactic/test/README:1.15 PanGalactic/pangalactic/test/README:1.16
--- PanGalactic/pangalactic/test/README:1.15	Sat Oct  4 00:51:24 2003
+++ PanGalactic/pangalactic/test/README	Sat Oct  4 01:11:33 2003
@@ -1,4 +1,4 @@
-$Id: README,v 1.15 2003/10/04 04:51:24 waterbug Exp $
+$Id: README,v 1.16 2003/10/04 05:11:33 waterbug Exp $
 
 Pan Galactic Engineering Repository Test Scripts
 ================================================
@@ -20,7 +20,7 @@
         test_factory_test.py
         test_factory_extracts2Records.py
         test_factory_sync.py
-        test_factory_async.py
+        test_factory_makeObjects.py
         test_factory_unmake.py
                  |
         test_pger_getresultsets.py

From waterbug at ned.gsfc.nasa.gov  Sat Oct  4 02:14:26 2003
From: waterbug at ned.gsfc.nasa.gov (waterbug CVS)
Date: Sat Oct  4 01:14:27 2003
Subject: [Pangalactic-commits] Mods for building transactional inserts.
Message-ID: <200310040514.h945EQxM025352@ned.gsfc.nasa.gov>

Modified files:
PanGalactic/pangalactic/utils/sql.py 1.3 1.4

Log message:
Mods for building transactional inserts.


Index: PanGalactic/pangalactic/utils/sql.py
diff -u PanGalactic/pangalactic/utils/sql.py:1.3 PanGalactic/pangalactic/utils/sql.py:1.4
--- PanGalactic/pangalactic/utils/sql.py:1.3	Fri Sep 26 22:22:30 2003
+++ PanGalactic/pangalactic/utils/sql.py	Sat Oct  4 01:14:24 2003
@@ -1,10 +1,10 @@
 """SQL Tools"""
 
-# $Id: sql.py,v 1.3 2003/09/27 02:22:30 waterbug Exp $
+# $Id: sql.py,v 1.4 2003/10/04 05:14:24 waterbug Exp $
 
 import re, types
 
-def buildSelect(table, subtypes=0, *args, **kw):
+def buildSelect(table, subtypes, *args, **kw):
     """
     Take a table name and a list of args and build a set of
     SQL SELECT arguments from them that can be used directly as a
@@ -30,18 +30,22 @@
     @param kw:    I{sort} specifies sort order.  Can be 
                   either a string (a column name) or a list or
                   tuple of column names
+
+    @rtype:   tuple
+    @return:  SQL command string + (optional) arg list
     """
     # specify logic (later on, we might enable 'OR' ...)
     connector = 'AND'
     # create re to remove final connector from sqlstmt ...
     conn_re = re.compile(' %s$' % connector)
     # build sql statement ...
-    if subtypes == 0:
-        # search *only* in the specified table
-        sqlstmt = 'SELECT * FROM ONLY ' + table + ' WHERE'
-    else:
+    if subtypes == 1:
         # search the specified table and all its subtypes
         sqlstmt = 'SELECT * FROM ' + table + ' WHERE'
+    else:
+        # DEFAULT CASE:
+        # search *only* in the specified table
+        sqlstmt = 'SELECT * FROM ONLY ' + table + ' WHERE'
     arl = []
     for a in args:
         sqlargs = _argmunge(a)
@@ -92,48 +96,36 @@
         selectargs = (sqlstmt,)
     return selectargs
 
-def buildInsert(table, *args, **kw):
+def buildInsert(table, parmdict):
     """
-    Take a table name and either a list of sequences (lists or
-    tuples) of args or a set of kw args and build a set of SQL
-    insert arguments from them that can be used directly as a
-    complete set of arguments for the PgSQL cursor.execute()
-    function.
-
-    B{Important}:  either an arg tuple/list I{or} a kw dictionary
-    should be supplied, but I{not} both!  If a kw dictionary is
-    supplied, it will take precedence.
+    Take a table name a {colname:value} dictionary and build a
+    set of arguments for use in PgSQL.cursor.execute().
 
     @type table:  string
     @param table: name of the table to insert into
 
-    @type args:   list of lists or list of tuples
-    @param args:  a set of sequences (lists or tuples) of SQL 
-                  element tuples in which each tuple has the form:
-                    - element[0] = column name
-                    - element[1] = value to be assigned
-
-    @type kw:     dictionary (of kw args)
-    @param kw:    kw args should be of the form:
-                    - kw[column name] = value to be assigned
+    @type parmdict:     dictionary
+    @param parmdict:    a dictionary of the form:
+                          - {colname : value, ...}
+
+    @rtype:   tuple
+    @return:  a 2-tuple whose elements are:
+                [1] the SQL statement formatted for PgSQL with
+                    %s dummy variables
+                [2] the tuple of values to be inserted
     """
     # build sql arguments for PgSQL ...
     sqlstmt = 'INSERT INTO ' + table + ' ('
     dum = '('
-    arl = []
-    if kw:
-        newargs = zip(kw.keys(), kw.values())
-    elif args:
-        newargs = args
-    for pair in newargs:
-        sqlstmt = sqlstmt + """%s, """ % pair[0]
-        dum = dum + """%s, """
-        arl.append(pair[1])
+    parms = ()
+    for parm in parmdict:
+        sqlstmt += '%s, ' % parm
+        dum += '%s, '
+        parms += (parmdict[parm],)
     sqlstmt = sqlstmt[:-2]
     dum = dum[:-2]
     sqlstmt = sqlstmt + ') VALUES ' + dum + ')'
-    insertargs = (sqlstmt,) + tuple(arl)
-    return insertargs
+    return (sqlstmt, parms)
 
 def buildSQLInsert(table, *args, **kw):
     """
@@ -161,35 +153,35 @@
     sqlstmt = 'INSERT INTO ' + table + ' ('
     values = '('
     if kw:
-        newargs = zip(kw.keys(), kw.valuesues())
+        coldict = kw
     elif args:
-        newargs = args
-    for pair in newargs:
-        sqlstmt = sqlstmt + """%s, """ % pair[0]
-        values = values + """'%s', """ % pair[1]
+        coldict = dict(args)
+    for col in coldict:
+        sqlstmt = sqlstmt + """%s, """ % col
+        values = values + """'%s', """ % coldict[col]
     sqlstmt = sqlstmt[:-2]
     values = values[:-2]
     sqlstmt = sqlstmt + ') VALUES ' + values + ')'
     return sqlstmt
 
-def buildTransaction(parmdict):
+def buildTransaction(records):
     """
     Build an SQL command string to add a series of rows in a
     single transaction.
     """
     sqlstmt = """SET CONSTRAINTS ALL DEFERRED;\n"""
-    for table in parmdict.keys():
-        print '\n  doing table = "%s"' % table
-        for arglist in parmdict[table]:
-            print '    doing arglist = "%s"' % str(arglist)
-            # sqlstmt += buildSQLInsert(table, *arglist) + ';\n'
-            s = buildSQLInsert(table, *arglist) + ';\n'
-            print '    - output of buildSQLInsert is:'
-            print s
-            sqlstmt += s
+    allparms = ()
+    for rec in records:
+        print '\n    doing parmdict = %s' % str(rec[1])
+        sqlcmd, parms = buildInsert(rec[0], rec[1])
+        print '\n    - output of buildInsert is:'
+        print sqlcmd
+        sqlstmt += sqlcmd + '; '
+        allparms += parms
     print
-    print 'sqlstmt = "%s"' % sqlstmt
-    return sqlstmt
+    print '\nsqlstmt = "%s"' % sqlstmt
+    print '\nallparms = "%s"\n' % str(allparms)
+    return sqlstmt, allparms
 
 def _argmunge(arg):
     """Munges a tuple into a column name, search value, and

From waterbug at ned.gsfc.nasa.gov  Sat Oct  4 02:18:20 2003
From: waterbug at ned.gsfc.nasa.gov (waterbug CVS)
Date: Sat Oct  4 01:18:21 2003
Subject: [Pangalactic-commits] Clean ups.
Message-ID: <200310040518.h945IKJ4025391@ned.gsfc.nasa.gov>

Modified files:
PanGalactic/pangalactic/utils/sql.py 1.4 1.5

Log message:
Clean ups.


Index: PanGalactic/pangalactic/utils/sql.py
diff -u PanGalactic/pangalactic/utils/sql.py:1.4 PanGalactic/pangalactic/utils/sql.py:1.5
--- PanGalactic/pangalactic/utils/sql.py:1.4	Sat Oct  4 01:14:24 2003
+++ PanGalactic/pangalactic/utils/sql.py	Sat Oct  4 01:18:19 2003
@@ -1,6 +1,6 @@
 """SQL Tools"""
 
-# $Id: sql.py,v 1.4 2003/10/04 05:14:24 waterbug Exp $
+# $Id: sql.py,v 1.5 2003/10/04 05:18:19 waterbug Exp $
 
 import re, types
 
@@ -127,43 +127,6 @@
     sqlstmt = sqlstmt + ') VALUES ' + dum + ')'
     return (sqlstmt, parms)
 
-def buildSQLInsert(table, *args, **kw):
-    """
-    Build an SQL command that can be used directly by PgSQL
-    cursor.execute() to insert a row.
-
-    B{Important}:  either an arg tuple/list I{or} a kw dictionary
-    should be supplied, but I{not} both!  If a kw dictionary is
-    supplied, it will take precedence.
-
-    @type table:  string
-    @param table: name of the table to insert into
-
-    @type args:   list of lists or list of tuples
-    @param args:  a set of sequences (lists or tuples) of SQL 
-                  element tuples in which each tuple has the form:
-                    - element[0] = column name
-                    - element[1] = value to be assigned
-
-    @type kw:     dictionary (of kw args)
-    @param kw:    kw args should be of the form:
-                    - kw[column name] = value to be assigned
-    """
-    # build sql statement ...
-    sqlstmt = 'INSERT INTO ' + table + ' ('
-    values = '('
-    if kw:
-        coldict = kw
-    elif args:
-        coldict = dict(args)
-    for col in coldict:
-        sqlstmt = sqlstmt + """%s, """ % col
-        values = values + """'%s', """ % coldict[col]
-    sqlstmt = sqlstmt[:-2]
-    values = values[:-2]
-    sqlstmt = sqlstmt + ') VALUES ' + values + ')'
-    return sqlstmt
-
 def buildTransaction(records):
     """
     Build an SQL command string to add a series of rows in a
@@ -172,15 +135,9 @@
     sqlstmt = """SET CONSTRAINTS ALL DEFERRED;\n"""
     allparms = ()
     for rec in records:
-        print '\n    doing parmdict = %s' % str(rec[1])
         sqlcmd, parms = buildInsert(rec[0], rec[1])
-        print '\n    - output of buildInsert is:'
-        print sqlcmd
         sqlstmt += sqlcmd + '; '
         allparms += parms
-    print
-    print '\nsqlstmt = "%s"' % sqlstmt
-    print '\nallparms = "%s"\n' % str(allparms)
     return sqlstmt, allparms
 
 def _argmunge(arg):

From waterbug at ned.gsfc.nasa.gov  Sat Oct  4 02:31:00 2003
From: waterbug at ned.gsfc.nasa.gov (waterbug CVS)
Date: Sat Oct  4 01:31:01 2003
Subject: [Pangalactic-commits] More test clean-ups.
Message-ID: <200310040531.h945V0YT025506@ned.gsfc.nasa.gov>

Modified files:
PanGalactic/pangalactic/test/README 1.16 1.17
PanGalactic/pangalactic/test/test_pger_getobjects.py 1.2 1.3
PanGalactic/pangalactic/test/test_pger_getresultsets.py 1.7 1.8
PanGalactic/pangalactic/test/test_pger_gettuplers.py 1.6 1.7

Log message:
More test clean-ups.


Index: PanGalactic/pangalactic/test/test_pger_getresultsets.py
diff -u PanGalactic/pangalactic/test/test_pger_getresultsets.py:1.7 PanGalactic/pangalactic/test/test_pger_getresultsets.py:1.8
--- PanGalactic/pangalactic/test/test_pger_getresultsets.py:1.7	Fri Sep 26 22:20:06 2003
+++ PanGalactic/pangalactic/test/test_pger_getresultsets.py	Sat Oct  4 01:30:59 2003
@@ -1,4 +1,4 @@
-# $Id: test_pger_getresultsets.py,v 1.7 2003/09/27 02:20:06 waterbug Exp $
+# $Id: test_pger_getresultsets.py,v 1.8 2003/10/04 05:30:59 waterbug Exp $
 
 """
 Functional test for pangalactic.repo.pger module
@@ -18,7 +18,8 @@
 def success(resultsets):
     schema = pgr._registry.pgerdb_classes[typename]._schema
     if resultsets:
-        print "\nRESULT SETS"
+        print "\n==========="
+        print "RESULT SETS"
         print "==========="
         for r in resultsets:
             pprint(r)
@@ -28,24 +29,27 @@
                 t = schema[a]
                 val = getattr(r, a)
                 print '  %s = %s' % (a, pgr._factory.cook(val, t))
+        print "\n========"
         print "EXTRACTS"
         print "========"
         pprint(pgr._factory.makeExtracts(resultsets))
     else:
         print "\nResult is empty:\n"
         print resultsets
+    reactor.stop()
 
 def failure(error):
     print error
+    reactor.stop()
 
-db = PgerDb()
-pgr = Pger(db)
+pgrdb = PgerDb()
+pgr = Pger(pgrdb)
 
 out = pgr.getResultSets(typename,
                         name='Mr. Fusion')
 
 out.addCallbacks(success, failure)
 
-reactor.run() # start the main loop
-print 'stopped.'
+reactor.run()
+print '\n - end of test -'
 

Index: PanGalactic/pangalactic/test/test_pger_gettuplers.py
diff -u PanGalactic/pangalactic/test/test_pger_gettuplers.py:1.6 PanGalactic/pangalactic/test/test_pger_gettuplers.py:1.7
--- PanGalactic/pangalactic/test/test_pger_gettuplers.py:1.6	Mon Sep 15 16:38:32 2003
+++ PanGalactic/pangalactic/test/test_pger_gettuplers.py	Sat Oct  4 01:30:59 2003
@@ -1,4 +1,4 @@
-# $Id: test_pger_gettuplers.py,v 1.6 2003/09/15 20:38:32 waterbug Exp $
+# $Id: test_pger_gettuplers.py,v 1.7 2003/10/04 05:30:59 waterbug Exp $
 
 """
 Functional test of Pger getting a result set for a list of docs
@@ -36,5 +36,7 @@
                    returntype='resultsets'))
 result.addCallbacks(success, failure)
 
-reactor.run() # start the main loop
+reactor.run()
+
+print "\n- end of test -"
 

Index: PanGalactic/pangalactic/test/README
diff -u PanGalactic/pangalactic/test/README:1.16 PanGalactic/pangalactic/test/README:1.17
--- PanGalactic/pangalactic/test/README:1.16	Sat Oct  4 01:11:33 2003
+++ PanGalactic/pangalactic/test/README	Sat Oct  4 01:30:59 2003
@@ -1,4 +1,4 @@
-$Id: README,v 1.16 2003/10/04 05:11:33 waterbug Exp $
+$Id: README,v 1.17 2003/10/04 05:30:59 waterbug Exp $
 
 Pan Galactic Engineering Repository Test Scripts
 ================================================
@@ -18,10 +18,10 @@
 test_db_addrows.py        test_registry.py
             \              /
         test_factory_test.py
-        test_factory_extracts2Records.py
         test_factory_sync.py
+        test_factory_extracts2Records.py
         test_factory_makeObjects.py
-        test_factory_unmake.py
+        test_factory_unmakeObject.py
                  |
         test_pger_getresultsets.py
         test_pger_gettuplers.py

Index: PanGalactic/pangalactic/test/test_pger_getobjects.py
diff -u PanGalactic/pangalactic/test/test_pger_getobjects.py:1.2 PanGalactic/pangalactic/test/test_pger_getobjects.py:1.3
--- PanGalactic/pangalactic/test/test_pger_getobjects.py:1.2	Fri Sep 26 22:20:06 2003
+++ PanGalactic/pangalactic/test/test_pger_getobjects.py	Sat Oct  4 01:30:59 2003
@@ -1,4 +1,4 @@
-# $Id: test_pger_getobjects.py,v 1.2 2003/09/27 02:20:06 waterbug Exp $
+# $Id: test_pger_getobjects.py,v 1.3 2003/10/04 05:30:59 waterbug Exp $
 
 """
 Functional test for pangalactic.repo.pger module
@@ -14,7 +14,9 @@
 from pangalactic.repo.pger import Pger
 
 def success(olist):
+    print "Object list:"
     pprint(olist)
+    print "\nObjects:"
     for obj in olist:
         print obj
     reactor.stop()
@@ -29,5 +31,7 @@
 out = pgr.getObjects('Project', id='H2G2')
 out.addCallbacks(success, failure)
 
-reactor.run() # start the main loop
+reactor.run()
+
+print '\n- end of test -'
 

From waterbug at ned.gsfc.nasa.gov  Sat Oct  4 19:38:27 2003
From: waterbug at ned.gsfc.nasa.gov (waterbug CVS)
Date: Sat Oct  4 18:38:29 2003
Subject: [Pangalactic-commits] Renamed test_pger_add.py to
	test_pger_addObjects.py.
Message-ID: <200310042238.h94McRHT028351@ned.gsfc.nasa.gov>

Modified files:
PanGalactic/pangalactic/test/test_pger_addObjects.py None 1.1
PanGalactic/pangalactic/test/test_pger_add.py 1.8 None

Log message:
Renamed test_pger_add.py to test_pger_addObjects.py.


From waterbug at ned.gsfc.nasa.gov  Sat Oct  4 20:22:15 2003
From: waterbug at ned.gsfc.nasa.gov (waterbug CVS)
Date: Sat Oct  4 19:22:17 2003
Subject: [Pangalactic-commits] Updates for better test data.
Message-ID: <200310042322.h94NMFh9028457@ned.gsfc.nasa.gov>

Modified files:
PanGalactic/pangalactic/test/test_pger_addObjects.py 1.1 1.2

Log message:
Updates for better test data.


Index: PanGalactic/pangalactic/test/test_pger_addObjects.py
diff -u PanGalactic/pangalactic/test/test_pger_addObjects.py:1.1 PanGalactic/pangalactic/test/test_pger_addObjects.py:1.2
--- PanGalactic/pangalactic/test/test_pger_addObjects.py:1.1	Sat Oct  4 18:38:25 2003
+++ PanGalactic/pangalactic/test/test_pger_addObjects.py	Sat Oct  4 19:22:14 2003
@@ -1,4 +1,4 @@
-# $Id: test_pger_addObjects.py,v 1.1 2003/10/04 22:38:25 waterbug Exp $
+# $Id: test_pger_addObjects.py,v 1.2 2003/10/04 23:22:14 waterbug Exp $
 
 """
 Functional test for pangalactic.repo.Pger.addObjects()
@@ -9,37 +9,56 @@
     pger_mod_datetime for all committed objects)
 """
 
-import time, os
+import time
+from pprint import pprint
 from twisted.internet import reactor
-from twisted.enterprise import adbapi
 from pangalactic.repo.db import PgerDb
-from pangalactic.repo.pger import Pger
 from pangalactic.utils import oid
-from pangalactic.enterprise.productmaster import ProductMaster
+from pangalactic.enterprise.productmaster import ProductMaster as PM
+from pangalactic.enterprise.productversion import ProductVersion as PV
 from pangalactic.enterprise.project import Project
+from pangalactic.repo.factory import PgerObjectFactory as POF
+from pangalactic.repo.registry import PgerObjectRegistry as POR
+from pangalactic.repo.pger import Pger
 
-db = PgerDb()
-pgr = Pger(db)
-
-f = open(os.getcwd() + '/IDTEST')
-nextid = f.read()
-newoid = oid.generate('test')
+reg = POR()
+fac = POF(reg)
+pgrdb = PgerDb()
+pgr = Pger(pgrdb)
+
+f = open('IDTEST')
+savedid = f.read()
+testoid1 = oid.generate('test')
+testoid2 = oid.generate('test')
 
-nextid = str(int(nextid) + 1)
+testid = str(int(savedid) + 1)
 f.close()
-f = open(os.getcwd() + '/IDTEST', 'w')
-f.write(nextid)
+f = open('IDTEST', 'w')
+f.write(testid)
 f.close()
 
-testname = 'Mr. Test-Pger-addObjects()-' + nextid
-proj = Project(id='TEST', id_context='TEST')
-pm = ProductMaster(name=testname, id=nextid, id_context='TEST', project=proj)
-print pm
-pmlist = [pm]
-dts = pgr.addObjects(pmlist)
-print 'dts = %s' % dts
+projid = 'MD' + testid
+projname = 'MD' + testid + ' Project'
+pmid = 'MD-' + testid
+pmname = 'MD-' + testid + ' Model Mr. Dynamo'
+pvname = 'MD-' + testid + ' Version A'
+
+# create test objects
+p = Project(id=projid, id_context='TEST', name=projname)
+p.popTestData()
+pm = PM(id=pmid, id_context='TEST', name=pmname, _project=p)
+pm.popTestData()
+pv = PV(_of_master=pm, id='A', name=pvname)
+pv.popTestData()
+
+olist = [p, pm, pv]
+
+dts = pgr.addObjects(olist)
+
+reactor.run()
 
-reactor.run() # start the main loop
-time.sleep(1)
 reactor.stop()
+
+print 'dts is %s\n' % dts
+print '- test is complete -'
 

From waterbug at ned.gsfc.nasa.gov  Sat Oct  4 20:25:45 2003
From: waterbug at ned.gsfc.nasa.gov (waterbug CVS)
Date: Sat Oct  4 19:25:46 2003
Subject: [Pangalactic-commits] Renamed test_pger_addextracts.py to
	test_pger_addExtracts.py.
Message-ID: <200310042325.h94NPjjW028525@ned.gsfc.nasa.gov>

Modified files:
PanGalactic/pangalactic/test/test_pger_addExtracts.py None 1.1
PanGalactic/pangalactic/test/IDTEST 1.14 1.15
PanGalactic/pangalactic/test/README 1.17 1.18
PanGalactic/pangalactic/test/test_db_addrows.py 1.3 1.4
PanGalactic/pangalactic/test/test_pger_addextracts.py 1.2 None

Log message:
Renamed test_pger_addextracts.py to test_pger_addExtracts.py.


Index: PanGalactic/pangalactic/test/test_db_addrows.py
diff -u PanGalactic/pangalactic/test/test_db_addrows.py:1.3 PanGalactic/pangalactic/test/test_db_addrows.py:1.4
--- PanGalactic/pangalactic/test/test_db_addrows.py:1.3	Sat Oct  4 00:26:08 2003
+++ PanGalactic/pangalactic/test/test_db_addrows.py	Sat Oct  4 19:25:44 2003
@@ -1,4 +1,4 @@
-# $Id: test_db_addrows.py,v 1.3 2003/10/04 04:26:08 waterbug Exp $
+# $Id: test_db_addrows.py,v 1.4 2003/10/04 23:25:44 waterbug Exp $
 
 """
 Test for inserting a row using pangalactic.repo.db module
@@ -7,7 +7,6 @@
   - outputs result of callback
 """
 
-import time, os
 from pprint import pprint
 from twisted.internet import reactor
 from pangalactic.repo.db import PgerDb

Index: PanGalactic/pangalactic/test/IDTEST
diff -u PanGalactic/pangalactic/test/IDTEST:1.14 PanGalactic/pangalactic/test/IDTEST:1.15
--- PanGalactic/pangalactic/test/IDTEST:1.14	Sat Oct  4 00:26:08 2003
+++ PanGalactic/pangalactic/test/IDTEST	Sat Oct  4 19:25:44 2003
@@ -1 +1 @@
-220
\ No newline at end of file
+224
\ No newline at end of file

Index: PanGalactic/pangalactic/test/README
diff -u PanGalactic/pangalactic/test/README:1.17 PanGalactic/pangalactic/test/README:1.18
--- PanGalactic/pangalactic/test/README:1.17	Sat Oct  4 01:30:59 2003
+++ PanGalactic/pangalactic/test/README	Sat Oct  4 19:25:44 2003
@@ -1,4 +1,4 @@
-$Id: README,v 1.17 2003/10/04 05:30:59 waterbug Exp $
+$Id: README,v 1.18 2003/10/04 23:25:44 waterbug Exp $
 
 Pan Galactic Engineering Repository Test Scripts
 ================================================
@@ -28,7 +28,7 @@
         test_pger_getobjects.py
                  |
         test_pger_create.py
-        test_pger_add.py
+        test_pger_addObjects.py
                  |
         test_pger_pb.py
                  |

From waterbug at ned.gsfc.nasa.gov  Sat Oct  4 20:32:20 2003
From: waterbug at ned.gsfc.nasa.gov (waterbug CVS)
Date: Sat Oct  4 19:32:21 2003
Subject: [Pangalactic-commits] Remove obsolete jelly test.
Message-ID: <200310042332.h94NWKCi028576@ned.gsfc.nasa.gov>

Modified files:
PanGalactic/pangalactic/test/test_xmlrpc_jelly_get.py 1.4 None

Log message:
Remove obsolete jelly test.


From waterbug at ned.gsfc.nasa.gov  Sat Oct  4 20:35:45 2003
From: waterbug at ned.gsfc.nasa.gov (waterbug CVS)
Date: Sat Oct  4 19:35:46 2003
Subject: [Pangalactic-commits] Remove obsolete test.
Message-ID: <200310042335.h94NZjrJ028627@ned.gsfc.nasa.gov>

Modified files:
PanGalactic/pangalactic/test/test_pger_trans_add.py 1.4 None

Log message:
Remove obsolete test.


From waterbug at ned.gsfc.nasa.gov  Sun Oct  5 01:52:18 2003
From: waterbug at ned.gsfc.nasa.gov (waterbug CVS)
Date: Sun Oct  5 00:52:20 2003
Subject: [Pangalactic-commits] Add test for factory.extractall() method
	(jelly was never this good!! :^) and some general updates.
Message-ID: <200310050452.h954qIHK029300@ned.gsfc.nasa.gov>

Modified files:
PanGalactic/pangalactic/test/test_factory_extractall.py None 1.1
PanGalactic/pangalactic/test/README 1.18 1.19
PanGalactic/pangalactic/test/test_pger_create.py 1.7 1.8
PanGalactic/pangalactic/test/test_pger_getresultsets.py 1.8 1.9
PanGalactic/pangalactic/test/test_xmlrpc_getobjects.py 1.6 1.7

Log message:
Add test for factory.extractall() method (jelly was never this good!! :^) and some general updates.


Index: PanGalactic/pangalactic/test/test_xmlrpc_getobjects.py
diff -u PanGalactic/pangalactic/test/test_xmlrpc_getobjects.py:1.6 PanGalactic/pangalactic/test/test_xmlrpc_getobjects.py:1.7
--- PanGalactic/pangalactic/test/test_xmlrpc_getobjects.py:1.6	Mon Sep 15 16:38:32 2003
+++ PanGalactic/pangalactic/test/test_xmlrpc_getobjects.py	Sun Oct  5 00:52:17 2003
@@ -1,4 +1,4 @@
-# $Id: test_xmlrpc_getobjects.py,v 1.6 2003/09/15 20:38:32 waterbug Exp $
+# $Id: test_xmlrpc_getobjects.py,v 1.7 2003/10/05 04:52:17 waterbug Exp $
 
 """
 Functional test for pangalactic.repo.xmlrpc.PgerXmlrpcService
@@ -31,11 +31,15 @@
     print "\n***  RECONSTITUTED OBJECTS ***\n"
     olist = []
     for x in stuff:
-        o = pgr._factory.reconstitute(x)
+        o = pgr._factory.rebuild(x)
         olist.append(o)
     pprint(olist)
     print
     print "\n***  %s %s(s) found.  ***\n" % (len(olist), typename)
+    if olist:
+        print """Here's what the first one looks like:"""
+        print
+        print olist[0]
     reactor.stop()
 
 def failure(error):
@@ -44,11 +48,10 @@
 
 db = PgerDb()
 pgr = Pger(db)
-x = PgerXmlrpcService(pgr)
+xmlsrv = PgerXmlrpcService(pgr)
 
-x.xmlrpc_getObjects(typename, 'name=Mr. Fusion').addCallbacks(success, failure)
+res = xmlsrv.xmlrpc_getObjects(typename, 0, 0, ['name', 'Mr. Fusion'])
+res.addCallbacks(success, failure)
 
-reactor.run() # start the main loop
-
-# reactor.run(installSignalHandlers=0) # start the main loop
+reactor.run()
 

Index: PanGalactic/pangalactic/test/README
diff -u PanGalactic/pangalactic/test/README:1.18 PanGalactic/pangalactic/test/README:1.19
--- PanGalactic/pangalactic/test/README:1.18	Sat Oct  4 19:25:44 2003
+++ PanGalactic/pangalactic/test/README	Sun Oct  5 00:52:17 2003
@@ -1,13 +1,13 @@
-$Id: README,v 1.18 2003/10/04 23:25:44 waterbug Exp $
+$Id: README,v 1.19 2003/10/05 04:52:17 waterbug Exp $
 
 Pan Galactic Engineering Repository Test Scripts
 ================================================
 Package:  pangalactic.repo
 Prep:     These tests require the test data to be
-          loaded into PgerDb -- run the script:
+          loaded into pgerdb -- run the script:
           Pangalactic/src/sql/populate_pgerdb.sh
-              (TODO:  set up a separate test database: 
-                      "testpgerdb")
+          (TODO:  set up a separate test database: 
+          "testpgerdb")
 Graph:
 
 test_glimpse_getfulltext.py
@@ -27,14 +27,13 @@
         test_pger_gettuplers.py
         test_pger_getobjects.py
                  |
-        test_pger_create.py
+        test_pger_addExtracts.py
         test_pger_addObjects.py
+        test_pger_create.py
                  |
         test_pger_pb.py
                  |
         test_xmlrpc_getobjects.py
         test_xmlrpc_addobjects.py
         test_xmlrpc_createpm.py
-                 |
-        test_pger_trans_add.py
 

Index: PanGalactic/pangalactic/test/test_pger_create.py
diff -u PanGalactic/pangalactic/test/test_pger_create.py:1.7 PanGalactic/pangalactic/test/test_pger_create.py:1.8
--- PanGalactic/pangalactic/test/test_pger_create.py:1.7	Sat Jul  5 05:02:18 2003
+++ PanGalactic/pangalactic/test/test_pger_create.py	Sun Oct  5 00:52:17 2003
@@ -1,4 +1,4 @@
-# $Id: test_pger_create.py,v 1.7 2003/07/05 09:02:18 waterbug Exp $
+# $Id: test_pger_create.py,v 1.8 2003/10/05 04:52:17 waterbug Exp $
 
 """
 Functional test for pangalactic.repo.pger.createProductMaster
@@ -8,7 +8,7 @@
   - reports oid of the new Product Master
 """
 
-import time, os
+import time
 from twisted.internet import reactor
 from twisted.enterprise import adbapi
 from pangalactic.repo.registry import PgerObjectRegistry
@@ -23,21 +23,24 @@
 registry = PgerObjectRegistry('pgerdb', 'pangalactic', 'enterprise')
 repo = Pger(db, registry)
 
-f = open(os.getcwd() + '/IDTEST')
+f = open('IDTEST')
 nextid = f.read()
 newoid = oid.generate('test')
 
 nextid = str(int(nextid) + 1)
 f.close()
-f = open(os.getcwd() + '/IDTEST', 'w')
+f = open('IDTEST', 'w')
 f.write(nextid)
 f.close()
 
-pmoid = repo.createProductMaster(pgef_oid=newoid, name='Mr. Test', id=nextid, id_context='TEST',
-                                 project_id='TEST', project_id_context='TEST')
+pmoid = repo.createProductMaster(pgef_oid=newoid, 
+                                 name='Mr. Test',
+                                 id=nextid, id_context='TEST',
+                                 project_id='TEST',
+                                 project_id_context='TEST')
 print 'pmoid = %s' % pmoid
 
-reactor.run(installSignalHandlers=0) # start the main loop
+reactor.run()
 time.sleep(1)
 reactor.stop()
 

Index: PanGalactic/pangalactic/test/test_pger_getresultsets.py
diff -u PanGalactic/pangalactic/test/test_pger_getresultsets.py:1.8 PanGalactic/pangalactic/test/test_pger_getresultsets.py:1.9
--- PanGalactic/pangalactic/test/test_pger_getresultsets.py:1.8	Sat Oct  4 01:30:59 2003
+++ PanGalactic/pangalactic/test/test_pger_getresultsets.py	Sun Oct  5 00:52:17 2003
@@ -1,4 +1,4 @@
-# $Id: test_pger_getresultsets.py,v 1.8 2003/10/04 05:30:59 waterbug Exp $
+# $Id: test_pger_getresultsets.py,v 1.9 2003/10/05 04:52:17 waterbug Exp $
 
 """
 Functional test for pangalactic.repo.pger module
@@ -32,7 +32,7 @@
         print "\n========"
         print "EXTRACTS"
         print "========"
-        pprint(pgr._factory.makeExtracts(resultsets))
+        pprint(pgr._factory.resultsets2Extracts(resultsets))
     else:
         print "\nResult is empty:\n"
         print resultsets
@@ -45,7 +45,7 @@
 pgrdb = PgerDb()
 pgr = Pger(pgrdb)
 
-out = pgr.getResultSets(typename,
+out = pgr.getResultSets(typename, 0, 0,
                         name='Mr. Fusion')
 
 out.addCallbacks(success, failure)

From waterbug at ned.gsfc.nasa.gov  Sun Oct  5 03:35:28 2003
From: waterbug at ned.gsfc.nasa.gov (waterbug CVS)
Date: Sun Oct  5 02:35:29 2003
Subject: [Pangalactic-commits] Empty _refd for Organization, and caveat as
	to why. ; ^)
Message-ID: <200310050635.h956ZS1P029752@ned.gsfc.nasa.gov>

Modified files:
PanGalactic/pangalactic/enterprise/organization.py 1.7 1.8

Log message:
Empty _refd for Organization, and caveat as to why. ;^)


Index: PanGalactic/pangalactic/enterprise/organization.py
diff -u PanGalactic/pangalactic/enterprise/organization.py:1.7 PanGalactic/pangalactic/enterprise/organization.py:1.8
--- PanGalactic/pangalactic/enterprise/organization.py:1.7	Mon Sep 15 16:08:59 2003
+++ PanGalactic/pangalactic/enterprise/organization.py	Sun Oct  5 02:35:27 2003
@@ -1,4 +1,4 @@
-# $Id: organization.py,v 1.7 2003/09/15 20:08:59 waterbug Exp $
+# $Id: organization.py,v 1.8 2003/10/05 06:35:27 waterbug Exp $
 
 """
 A business entity comprised of personnel and other resources.
@@ -26,6 +26,12 @@
                  'Identifier',
                  'Type']
     _properties = PgefObject._properties.copy()
+    _refd = {} # Keep this empty, or things could get real UGLY!
+               # (Person refs Org, but Org has the usual
+               # "creator", etc., so it could get quite circular
+               # in a hurry.  For sanity's sake, all Orgs in PGER
+               # will be regarded as Immaculately Conceived,
+               # though we suspect the Sysadmin was involved. ;^)
     _schema_ext = {
                    'pgef_org_name_code' : 'str',
                    'name1'              : 'str',
@@ -51,7 +57,7 @@
                   }
     _schema = PgefObject._schema.copy()
     _schema.update(_schema_ext)
-    std_abbrev = 'org'
+    _std_abbrev = 'org'
 
     def __init__(self, email=None, schema=_schema, **kw):
         # PgefObject.__init__() creates the pgef_oid ...

From waterbug at ned.gsfc.nasa.gov  Sun Oct  5 06:33:06 2003
From: waterbug at ned.gsfc.nasa.gov (waterbug CVS)
Date: Sun Oct  5 05:33:08 2003
Subject: [Pangalactic-commits] Improvements to factory.rebuildall() ... much
	more forgiving now!
Message-ID: <200310050933.h959X6gh007756@ned.gsfc.nasa.gov>

Modified files:
PanGalactic/pangalactic/utils/factory.py 1.2 1.3

Log message:
Improvements to factory.rebuildall() ... much more forgiving now!


Index: PanGalactic/pangalactic/utils/factory.py
diff -u PanGalactic/pangalactic/utils/factory.py:1.2 PanGalactic/pangalactic/utils/factory.py:1.3
--- PanGalactic/pangalactic/utils/factory.py:1.2	Mon Sep 29 01:31:44 2003
+++ PanGalactic/pangalactic/utils/factory.py	Sun Oct  5 05:33:05 2003
@@ -1,15 +1,16 @@
-# $Id: factory.py,v 1.2 2003/09/29 05:31:44 waterbug Exp $
+# $Id: factory.py,v 1.3 2003/10/05 09:33:05 waterbug Exp $
 
 """
 Functions to extract persistable data from
 L{pangalactic.enterprise} objects.
-@version: $Revision: 1.2 $
+@version: $Revision: 1.3 $
 """
 
-__version__ = "$Revision: 1.2 $"[11:-2]
+__version__ = "$Revision: 1.3 $"[11:-2]
 
 import types
 import string
+from pprint import pprint
 from mx.DateTime.ISO import ParseDateTime
 from pangalactic.utils import utils
 from pangalactic.utils.registry import PgefRegistry
@@ -23,72 +24,134 @@
     def __init__(self):
         self._registry = PgefRegistry()
 
-    def cook(self, a, datatype):
+    def cook(self, attr, datatype):
         """
         Convert an attribute to a string or an int in preparation for
         its use in protocols that require clear-text encoding.
+
+        @type attr:   any type
+        @param attr:  an attribute to be converted
+
+        @type datatype:   string
+        @param datatype:  the name of the type to which the
+                          attribute is to be converted
         """
         # *_datetime attributes:
         # pypgsql returns a DateTime object, which can't
         # be jellied, so convert to GMT string ...
         if datatype == 'DateTime':
-            if a:
-                return str(a)
+            if attr:
+                return str(attr)
             else:
                 return ''
         # *_flag attributes:
         # pypgsql returns a PgBoolean object, which can't be
         # jellied, so convert value to 0 or 1 ...
         if datatype == 'bool':
-            # print "%s is a flag -- setting it to 1 or 0." % a
-            if a:
+            # print "%s is a flag -- setting it to 1 or 0." % attr
+            if attr:
                 return 1
             else:
                 return 0
         # special case:  for a null, pypgsql returns a
         # None object, which can't be jellied, so convert
         # to an empty string ...
-        if isinstance(a, types.NoneType):
-            # print "%s is None -- setting it to an empty string." % a
+        if isinstance(attr, types.NoneType):
+            # print "%s is None -- setting it to an empty string." % attr
             return ''
         else:
-            return a
+            return attr
 
     def extract(self, obj):
         """
-        Extract persistable data from an object into an
-        S-expression-style list of strings and integers for
-        transport.
+        Extract persistable data from an object into a
+        format suitable for transport over the wire.  The extract
+        format is:
+
+            [classname, instance dict]
+
+        ... where 
+
+           - "instance dict" is a dictionary of the
+             persistable attributes (those in obj._schema), and 
+           
+           - "refd objs dictionary" is a dictionary that maps the
+             attribute name of any PgefObject subtypes that this
+             type references to the pgef_oid of the instance refd
+             by this obj.
+
+        For example:
+
+            [ 'product_master',
+              { 'id' : 'spam',
+                'id_context' : 'eggs', ...}
+            ]
+
+        @type obj:   L{pangalactic.enterprise.pgefobject.PgefObject}
+        @param obj:  an object from which _schema instance data is
+                     to be extracted
         """
-        data = [ [a, self.cook(getattr(obj, a), obj._schema[a])] 
-                 for a in obj._schema ]
+        # get _schema instance values for obj ...
+        s = [ (a, self.cook(getattr(obj, a), obj._schema[a]))
+              for a in obj._schema ]
+        instdict = dict(s)
         name = obj.__module__ + '.' + obj.__class__.__name__
-        extr = [ name, data ]
+        extr = [name, instdict]
         return extr
 
-    def extractall(self, obj):
+    def extractall(self, objs, classnames=[]):
         """
-        Extract persistable data from an object I{and} from all
-        the objects on which it depends (those in its _referenced
-        attribute) and return all the extracts in a list.
+        Extract persistable data from a list of objects I{and}
+        from all the objects on which each object depends (those
+        in its _refd attribute) recursively (until no
+        further referenced objects are found) and return all the
+        resulting extracts in a list.
+
+        @type objs:   list of
+                      L{pangalactic.enterprise.pgefobject.PgefObject}
+        @param objs:  a list of objects from which _schema instance data is
+                      to be extracted
+
+        @type types:   list of classnames
+        @param types:  limits the classes to be extracted ([],
+                       which is the default, indicates all
+                       classes)
+
+        @returntype:  list of extracts
         """
-        extracts = [self.extract(obj)]
-        objs = [getattr(obj, a) for a in obj._referenced]
         # DEBUGGING
         # print 'Begin: objs are %s' % str(objs)
+        extracts = []
         while objs:
             refdobjs = []
             for o in objs:
-                extracts.append(self.extract(o))
-                refdobjs += [getattr(o, a) 
-                                for a in o._referenced]
-            objs = refdobjs
+                if o:
+                    toextract = []
+                    if classnames:
+                        if o.__class__.__name__ in classnames:
+                            extracts.append(self.extract(o))
+                        for a in o._refd:
+                            if o._refd[a] in classnames:
+                                toextract.append(a)
+                    else:
+                        extracts.append(self.extract(o))
+                        toextract = o._refd.keys()
+                    refdobjs += [getattr(o, a)
+                                    for a in toextract]
+            objs = utils.unique(refdobjs)
         return utils.unique(extracts)
 
     def uncook(self, value, datatype):
         """
         Convert a value from a string or an int to the specified
         type.
+
+        @type value:   string
+        @param value:  value to be converted to the specified
+                       type
+
+        @type datatype:   string
+        @param datatype:  name of the specified type
         """
         if datatype == 'DateTime':
             if value:
@@ -107,15 +170,155 @@
         else:
             return value
 
-    def reconstitute(self, data):
+    def rebuild(self, extr, objs=[]):
         """
-        Use data produced by extract() to reconstruct an object
-        of the type specified in the data.
+        Reconstruct an object from an extract and a list of
+        candidates to use for its referenced objects (i.e., those
+        in _refd).  (Use case:  update of an object of which the
+        referenced objects already exist locally.)
+
+        @type extr:   a list (see
+                      L{pangalatic.utils.factory.extract}
+        @param extr:  an extract (see
+                      L{pangalatic.utils.factory.extract}
+
+        @type objs:   list of L{pangalactic.enterprise.pgefobject.PgefObject}
+        @param objs:  a list of objects from which the referenced
+                      objects of the object being rebuilt can be
+                      selected
         """
-        classname = string.split(data[0], '.')[-1]
-        classobj = self._registry.pgef_classes[classname]
+        classpath = extr[0]
+        classname = string.split(classpath, '.')[-1]
+        klass = self._registry.pgef_classes[classname]
         kw = {}
-        for a in data[1]:
-            kw[a[0]] = self.uncook(a[1], classobj._schema[a[0]])
-        return classobj(**kw)
+        for a in klass._schema:
+            kw[a] = self.uncook(extr[1][a], klass._schema[a])
+        if klass._refd:
+            for a in klass._refd:
+                for o in objs:
+                    if (o.__class__.__name__ == klass._refd[a]
+                        and ([getattr(o, pka) for pka in o._pk]
+                             == [kw[fka] for fka in klass._fk[a]])):
+                        kw[a] = o
+                    else:
+                        kw[a] = None
+        return klass(**kw)
+
+    def rebuildall(self, extracts, objs=[]):
+        """
+        Take a list of extracts and reconstruct the collection of
+        objects.
+
+        @type extracts:  list
+        @param extracts: a list of extracts to be rebuilt into
+                         objects.
+
+        @type objs:  list
+        @param objs: a list of instances for use in the
+                     rebuilding process (candidates for objects
+                     that may be referenced by the extracts but
+                     may not be among the extracts that were
+                     passed in).
+
+        @rtype:  list
+        @return: a rat's nest of objects
+        """
+        built = [] # instances that have been built
+        # make a list of all classes in the extracts
+        cnames = utils.unique([string.split(e[0], '.')[-1]
+                               for e in extracts])
+        print 'cnames = %s' % str(cnames)
+        # build a dictionary of lists of extracts by class
+        edict = {}
+        for cname in cnames:
+            edict[cname] = []
+            for e in extracts:
+                if cname == string.split(e[0], '.')[-1]:
+                    edict[cname].append(e)
+        print 'edict = %s' % str(edict)
+        # make a dictionary of lists of instances by class
+        byclass = {}
+        for c in cnames:
+            byclass[c] = [self.rebuild(e, objs) for e in edict[c]]
+        for o in objs:
+            c = o.__class__.__name__
+            if c in byclass:
+                byclass[c].append(o)
+            else:
+                byclass[c] = [o]
+        print 'byclass = %s' % str(byclass)
+        # so in theory, at this point everything is rebuilt.
+        # now hook up as many refs as we can ... using the
+        # registry a little bit:
+        for c in cnames:
+            print '- adding refs to %s instances ...' % c
+            refd = self._registry.pgef_classes[c]._refd
+            print '  - refd is %s' % str(refd)
+            if refd:
+                for attr in refd:
+                    print '  - %s has type %s' % (attr, refd[attr])
+                    print '  - looking for %s instances' % refd[attr]
+                    if refd[attr] in byclass:
+                        print '  - we have %s instances' % refd[attr]
+                        for o in byclass[c]:
+                            print '  - looking at fk attrs of %s' % repr(o)
+                            fkattrs = o._fk[attr]
+                            fkvals = [getattr(o, a)
+                                         for a in fkattrs]
+                            print '  - fk vals are %s' % str(fkvals)
+                            for oo in byclass[refd[attr]]:
+                                pkattrs = oo._pk
+                                pkvals = [getattr(oo, a)
+                                             for a in pkattrs]
+                                if fkvals == pkvals:
+                                    setattr(o, attr, oo)
+                                break
+            built += byclass[c]
+        return built
+
+#         built = []  # classes of refd objs that have been built
+#         pgef_classes = self._registry.pgef_classes
+#         # make a list of all classes in the extracts
+#         cnames = utils.unique([string.split(e[0], '.')[-1]
+#                                for e in extracts])
+#         print 'cnames is:'
+#         pprint(cnames)
+#         # instantiate objects for the class(es) that have no
+#         # references first ...
+#         print 'doing classes w/out refs ...'
+#         for cname in cnames:
+#             print '  - class:  %s' % cname
+#             if not pgef_classes[cname]._refd:
+#                 objs += [self.rebuild(e) for e in
+#                          edict[cname]]
+#                 del edict[cname]
+#                 built.append(cname)
+#                 print '      edict is: %s' % str(edict)
+#                 print '      built is: %s' % str(built)
+#         # then iterate over the other classes, in as many passes
+#         # as it takes ...
+#         print 'now doing rest of classes ...'
+#         while edict:
+#             newbuilt = []
+#             for cname in edict:
+#                 # Sets would make this a lot easier!
+#                 logic = (False in [a in built
+#                          for a in pgef_classes[cname]._refd.values()])
+#                 print '  - class:  %s ...' % cname
+#                 print '    refd:   %s ...' % str(pgef_classes[cname]._refd.values())
+#                 print '    logic:  %s ...' % logic
+#                 if not logic:
+#                     objs += [self.rebuild(e, objs) for e in
+#                              edict[cname]]
+#                     newbuilt.append(cname)
+#                     print '      newbuilt is: %s' % str(newbuilt)
+#             for cn in newbuilt:
+#                 del edict[cn]
+#             built += newbuilt
+#             print '      built is: %s' % str(built)
+#             if not newbuilt:
+#                 print """Sorry, not enough info; couldn't build all objects."""
+#                 break
+#         print 'built objs:  %s' % str(objs)
+#         return objs
 

From waterbug at ned.gsfc.nasa.gov  Sun Oct  5 06:40:00 2003
From: waterbug at ned.gsfc.nasa.gov (waterbug CVS)
Date: Sun Oct  5 05:40:02 2003
Subject: [Pangalactic-commits] More little refinements.
Message-ID: <200310050940.h959e0r5007853@ned.gsfc.nasa.gov>

Modified files:
PanGalactic/pangalactic/test/README 1.19 1.20
PanGalactic/pangalactic/test/test_xmlrpc_getobjects.py 1.7 1.8

Log message:
More little refinements.


Index: PanGalactic/pangalactic/test/README
diff -u PanGalactic/pangalactic/test/README:1.19 PanGalactic/pangalactic/test/README:1.20
--- PanGalactic/pangalactic/test/README:1.19	Sun Oct  5 00:52:17 2003
+++ PanGalactic/pangalactic/test/README	Sun Oct  5 05:39:59 2003
@@ -1,4 +1,4 @@
-$Id: README,v 1.19 2003/10/05 04:52:17 waterbug Exp $
+$Id: README,v 1.20 2003/10/05 09:39:59 waterbug Exp $
 
 Pan Galactic Engineering Repository Test Scripts
 ================================================
@@ -19,6 +19,7 @@
             \              /
         test_factory_test.py
         test_factory_sync.py
+        test_factory_extractall.py
         test_factory_extracts2Records.py
         test_factory_makeObjects.py
         test_factory_unmakeObject.py
@@ -26,11 +27,9 @@
         test_pger_getresultsets.py
         test_pger_gettuplers.py
         test_pger_getobjects.py
-                 |
         test_pger_addExtracts.py
         test_pger_addObjects.py
         test_pger_create.py
-                 |
         test_pger_pb.py
                  |
         test_xmlrpc_getobjects.py

Index: PanGalactic/pangalactic/test/test_xmlrpc_getobjects.py
diff -u PanGalactic/pangalactic/test/test_xmlrpc_getobjects.py:1.7 PanGalactic/pangalactic/test/test_xmlrpc_getobjects.py:1.8
--- PanGalactic/pangalactic/test/test_xmlrpc_getobjects.py:1.7	Sun Oct  5 00:52:17 2003
+++ PanGalactic/pangalactic/test/test_xmlrpc_getobjects.py	Sun Oct  5 05:39:59 2003
@@ -1,4 +1,4 @@
-# $Id: test_xmlrpc_getobjects.py,v 1.7 2003/10/05 04:52:17 waterbug Exp $
+# $Id: test_xmlrpc_getobjects.py,v 1.8 2003/10/05 09:39:59 waterbug Exp $
 
 """
 Functional test for pangalactic.repo.xmlrpc.PgerXmlrpcService
@@ -19,27 +19,26 @@
 typename = 'ProductMaster'
 
 def success(stuff):
-    print "\n***  EXTRACT LIST  ***\n"
+    print "\n***  XMLRPC Command:"
+    print """     Server.getObjects('ProductMaster', 1, 0, ['name', 'Mr. Fusion'])\n"""
+    print "***  Extract list obtained as result:"
+    print "===================================="
     pprint(stuff)
-    print "\n***  END OF EXTRACT LIST  ***\n"
-    print
-    print "\n***  INDIVIDUAL OBJECT EXTRACTS  ***\n"
-
-    for x in stuff:
-        pprint(x)
-
-    print "\n***  RECONSTITUTED OBJECTS ***\n"
+    print "===================================="
+    print "\n***  Rebuilt objects:"
     olist = []
     for x in stuff:
         o = pgr._factory.rebuild(x)
         olist.append(o)
-    pprint(olist)
-    print
-    print "\n***  %s %s(s) found.  ***\n" % (len(olist), typename)
+    print "%s %s(s) found" % (len(olist), typename)
     if olist:
-        print """Here's what the first one looks like:"""
-        print
+        print "===================================="
+        pprint(olist)
+        print "===================================="
+        print """\nHere's the first %s:""" % typename
+        print "===================================="
         print olist[0]
+        print "===================================="
     reactor.stop()
 
 def failure(error):
@@ -50,7 +49,7 @@
 pgr = Pger(db)
 xmlsrv = PgerXmlrpcService(pgr)
 
-res = xmlsrv.xmlrpc_getObjects(typename, 0, 0, ['name', 'Mr. Fusion'])
+res = xmlsrv.xmlrpc_getObjects(typename, 1, 0, ['name', 'Mr. Fusion'])
 res.addCallbacks(success, failure)
 
 reactor.run()

From waterbug at ned.gsfc.nasa.gov  Sun Oct  5 18:24:51 2003
From: waterbug at ned.gsfc.nasa.gov (waterbug CVS)
Date: Sun Oct  5 17:24:54 2003
Subject: [Pangalactic-commits] Some more test tweaks.
Message-ID: <200310052124.h95LOpos010869@ned.gsfc.nasa.gov>

Modified files:
PanGalactic/pangalactic/test/IDTEST 1.15 1.16
PanGalactic/pangalactic/test/test_db_addrow.py 1.10 1.11
PanGalactic/pangalactic/test/test_sql.py 1.7 1.8
PanGalactic/pangalactic/test/ut_sql.py 1.1 1.2

Log message:
Some more test tweaks.


Index: PanGalactic/pangalactic/test/IDTEST
diff -u PanGalactic/pangalactic/test/IDTEST:1.15 PanGalactic/pangalactic/test/IDTEST:1.16
--- PanGalactic/pangalactic/test/IDTEST:1.15	Sat Oct  4 19:25:44 2003
+++ PanGalactic/pangalactic/test/IDTEST	Sun Oct  5 17:24:50 2003
@@ -1 +1 @@
-224
\ No newline at end of file
+228
\ No newline at end of file

Index: PanGalactic/pangalactic/test/ut_sql.py
diff -u PanGalactic/pangalactic/test/ut_sql.py:1.1 PanGalactic/pangalactic/test/ut_sql.py:1.2
--- PanGalactic/pangalactic/test/ut_sql.py:1.1	Sat Oct  4 00:26:08 2003
+++ PanGalactic/pangalactic/test/ut_sql.py	Sun Oct  5 17:24:50 2003
@@ -1,4 +1,4 @@
-# $Id: ut_sql.py,v 1.1 2003/10/04 04:26:08 waterbug Exp $
+# $Id: ut_sql.py,v 1.2 2003/10/05 21:24:50 waterbug Exp $
 
 """
 Functional tests for pangalactic.utils.sql module
@@ -7,7 +7,7 @@
 from pyPgSQL import PgSQL
 from pangalactic.utils.sql import buildSelect
 from pangalactic.utils.sql import buildInsert
-from pangalactic.utils.sql import buildSQLInsert
+from pangalactic.utils.sql import buildTransactionalInsert
 from twisted.trial import unittest
 
 # TODO:  need more test data ...
@@ -76,7 +76,7 @@
         expected = ('INSERT INTO product_master (id_context, id) VALUES (%s, %s)', ('TEST', '123'))
         self.assertEquals(expected, result)
 
-#     def test_9_buildTransaction(self):
+#     def test_9_buildTransactionalInsert(self):
 #         """CASE:  sql string to insert a record into a table (using arg signature)"""
 #         cmd = buildInsert('product_master',
 #                           ('id', '123'),

Index: PanGalactic/pangalactic/test/test_db_addrow.py
diff -u PanGalactic/pangalactic/test/test_db_addrow.py:1.10 PanGalactic/pangalactic/test/test_db_addrow.py:1.11
--- PanGalactic/pangalactic/test/test_db_addrow.py:1.10	Sat Oct  4 00:26:08 2003
+++ PanGalactic/pangalactic/test/test_db_addrow.py	Sun Oct  5 17:24:50 2003
@@ -1,4 +1,4 @@
-# $Id: test_db_addrow.py,v 1.10 2003/10/04 04:26:08 waterbug Exp $
+# $Id: test_db_addrow.py,v 1.11 2003/10/05 21:24:50 waterbug Exp $
 
 """
 Test for inserting a row using pangalactic.repo.db module
@@ -20,10 +20,10 @@
 savedid = f.read()
 testoid = oid.generate('test')
 
-testid = str(int(savedid) + 1)
+tmpid = str(int(savedid) + 1)
 f.close()
 f = open('IDTEST', 'w')
-f.write(testid)
+f.write(tmpid)
 f.close()
 
 def success(stuff):
@@ -40,7 +40,9 @@
                                 ('name', 'Mr. Dynamo'))
         res.addCallbacks(success, failure)
 
-out = db.addRow('product_master', pgef_oid=testoid, name='Mr. Dynamo', 
+testid = 'MD-' + tmpid
+testname = testid + ' Model Mr. Dynamo'
+out = db.addRow('product_master', pgef_oid=testoid, name=testname, 
                 id=testid, id_context='TEST', 
                 project_id='TEST', project_id_context='TEST')
 out.addCallback(ifNone)

Index: PanGalactic/pangalactic/test/test_sql.py
diff -u PanGalactic/pangalactic/test/test_sql.py:1.7 PanGalactic/pangalactic/test/test_sql.py:1.8
--- PanGalactic/pangalactic/test/test_sql.py:1.7	Sat Oct  4 00:26:08 2003
+++ PanGalactic/pangalactic/test/test_sql.py	Sun Oct  5 17:24:50 2003
@@ -1,4 +1,4 @@
-# $Id: test_sql.py,v 1.7 2003/10/04 04:26:08 waterbug Exp $
+# $Id: test_sql.py,v 1.8 2003/10/05 21:24:50 waterbug Exp $
 
 """
 Functional tests for pangalactic.utils.sql module
@@ -7,7 +7,6 @@
 from pyPgSQL import PgSQL
 from pangalactic.utils.sql import buildSelect
 from pangalactic.utils.sql import buildInsert
-from pangalactic.utils.sql import buildSQLInsert
 from twisted.trial import unittest
 
 # TODO:  need more test data ...
@@ -76,12 +75,7 @@
         expected = ('INSERT INTO product_master (id_context, id) VALUES (%s, %s)', ('TEST', '123'))
         self.assertEquals(expected, result)
 
-#     def test_9_buildTransaction(self):
-#         """CASE:  sql string to insert a record into a table (using arg signature)"""
-#         cmd = buildInsert('product_master',
-#                           ('id', '123'),
-#                           ('id_context', 'TEST')
-#                          )
-#         expected = ("""INSERT INTO product_master (id, id_context) VALUES ('123', 'TEST')""")
-#         self.assertEquals(expected, cmd)
+#     def test_9_buildTransactionalInsert(self):
+#         """CASE:  build a transactional series of INSERT
+#         commands as a single statement + parameter list"""
 

From waterbug at ned.gsfc.nasa.gov  Sun Oct  5 18:27:00 2003
From: waterbug at ned.gsfc.nasa.gov (waterbug CVS)
Date: Sun Oct  5 17:27:02 2003
Subject: [Pangalactic-commits] Renamed buildTransaction to
	buildTransactionalInsert (will need a transactional update, etc.)
Message-ID: <200310052127.h95LR0hV010931@ned.gsfc.nasa.gov>

Modified files:
PanGalactic/pangalactic/utils/sql.py 1.5 1.6

Log message:
Renamed buildTransaction to buildTransactionalInsert (will need a transactional update, etc.)


Index: PanGalactic/pangalactic/utils/sql.py
diff -u PanGalactic/pangalactic/utils/sql.py:1.5 PanGalactic/pangalactic/utils/sql.py:1.6
--- PanGalactic/pangalactic/utils/sql.py:1.5	Sat Oct  4 01:18:19 2003
+++ PanGalactic/pangalactic/utils/sql.py	Sun Oct  5 17:26:58 2003
@@ -1,6 +1,6 @@
 """SQL Tools"""
 
-# $Id: sql.py,v 1.5 2003/10/04 05:18:19 waterbug Exp $
+# $Id: sql.py,v 1.6 2003/10/05 21:26:58 waterbug Exp $
 
 import re, types
 
@@ -127,7 +127,7 @@
     sqlstmt = sqlstmt + ') VALUES ' + dum + ')'
     return (sqlstmt, parms)
 
-def buildTransaction(records):
+def buildTransactionalInsert(records):
     """
     Build an SQL command string to add a series of rows in a
     single transaction.

From waterbug at ned.gsfc.nasa.gov  Sun Oct  5 18:28:47 2003
From: waterbug at ned.gsfc.nasa.gov (waterbug CVS)
Date: Sun Oct  5 17:28:48 2003
Subject: [Pangalactic-commits] Mods to support transactional inserts, etc.
Message-ID: <200310052128.h95LSlfU010987@ned.gsfc.nasa.gov>

Modified files:
PanGalactic/pangalactic/repo/db.py 1.22 1.23

Log message:
Mods to support transactional inserts, etc.


Index: PanGalactic/pangalactic/repo/db.py
diff -u PanGalactic/pangalactic/repo/db.py:1.22 PanGalactic/pangalactic/repo/db.py:1.23
--- PanGalactic/pangalactic/repo/db.py:1.22	Fri Sep 26 22:26:50 2003
+++ PanGalactic/pangalactic/repo/db.py	Sun Oct  5 17:28:45 2003
@@ -1,10 +1,10 @@
 """
 Pan Galactic Engineering Repository Database Interface
 
-@version: $Revision: 1.22 $
+@version: $Revision: 1.23 $
 """
 
-__version__ = "$Revision: 1.22 $"[11:-2]
+__version__ = "$Revision: 1.23 $"[11:-2]
 # $Source: /repo/step_testbed/PanGalactic/pangalactic/repo/db.py,v $
 
 # Twisted imports ...
@@ -12,7 +12,7 @@
 from twisted.internet import defer
 from twisted.python import log, reflect
 # Pan Galactic imports ...
-from pangalactic.utils import sql
+from pangalactic.utils import sql, utils
 
 
 class PgerDb(adbapi.ConnectionPool):
@@ -36,8 +36,9 @@
         @param table: name of the table to search
 
         @type subtypes:  boolean
-        @param subtypes: whether to search all subtype tables or
-                         only the specified table
+        @param subtypes: whether to search only the specified
+                         table (False) or to include all subtype
+                         tables (True)
 
         @type args:   list of tuples
         @param args:  a list of tuples, in which each tuple has the
@@ -62,71 +63,57 @@
 
     def addRow(self, table, *args, **kw):
         """
-        Add a row, submitted either as a list of tuple arguments
-        (args) or a set of keyword arguments (kw), to a specified
-        table.
+        Add a row to the specified table.
 
         @type table:  string
         @param table: name of the table to search
 
-        @type args:   list of tuples
-        @param args:  a list of tuples, in which each tuple has the
-                      form:
-                        - arg[0] = column name
-                        - arg[1] = value to assign
-
-        @kw:          a dictionary of the form:
-                        - key    = column name
-                        - value  = value to assign
-        """
-        if args:
-            insertargs = args
-            # print 'got args ...'
-            # print 'insertargs are %s' % insertargs
-        elif kw:
-            insertargs = [ (x, kw[x]) for x in kw.keys() ]
-            # print 'got keywords ...'
-            # print 'insertargs are %s' % insertargs
-        sqlargs = sql.buildInsert(table, *insertargs)
-        d = self.runOperation(*sqlargs)
-        logmsg = 'addRow done: %s table updated.' % table
+        @type args:   list
+        @param args:  a list of 2-tuples:
+                      [(colname, value), ...]
+
+        @type kw:     dictionary
+        @param kw:    {colname : value, ...}
+        """
+        parmdict = kw or dict(args)
+        sqlcmd, parms = sql.buildInsert(table, parmdict)
+        d = self.runOperation(sqlcmd, *parms)
+        logmsg = 'addRow:  1 row added to %s table.' % table
         d.addCallback(lambda x: self._addRowDone(x, logmsg))
         d.addErrback(self.operationError)
+        return d
 
-    def addRows(self, parmdict):
+    def _addRowDone(self, d, logmsg):
+        """Callback for addRow success.
         """
-        Add a series of rows.
+        log.msg("%s operation %s" % (reflect.qual(self.__class__), logmsg))
+        return d
 
-        @type parmdict:  dictionary
-        @param parmdict: dictionary of table names mapped to
-                         a list of lists of row attribute/value
-                         tuples:
-
-                         {'product_master' : [ 
-                            [(id, '101'), ...],
-                            [(id, '102'), ...]],
-                          'product_version' : [
-                            [(id, '1001'), ...],
-                            [(id, '1002'), ...]], ...
-                            }
-        """
-        tables = parmdict.keys()
-        sqlstmt = sql.buildTransaction(parmdict)
-        d = self.runOperation(sqlstmt)
-        logmsg = 'addRows done: tables %s updated.' % str(tables)
+    def addRows(self, records):
+        """
+        Add a series of rows, in a single transaction, from a
+        list of records (for a description of "records", see
+        L{pangalactic.repo.factory.extracts2Records}).
+
+        @type records:  list
+        @param records: a list of records -- see
+                        L{pangalactic.utils.factory} for the
+                        definition of an extract
+        """
+        tables = utils.unique([rec[0] for rec in records])
+        sqlstmt, parms = sql.buildTransactionalInsert(records)
+        d = self.runOperation(sqlstmt, *parms)
+        logmsg = 'addRows: rows added to tables %s.' % str(tables)
         d.addCallback(lambda x: self._addRowsDone(x, logmsg))
         d.addErrback(self.interactionError)
-
-    def _addRowDone(self, d, logmsg):
-        """Callback for addRow success.
-        """
-        return (d, log.msg("%s operation %s" % (reflect.qual(self.__class__), logmsg)))
+        return d
 
     def _addRowsDone(self, d, logmsg):
         """
         Callback for addRows success.
         """
-        return (d, log.msg("%s operation %s" % (reflect.qual(self.__class__), logmsg)))
+        log.msg("%s operation %s" % (reflect.qual(self.__class__), logmsg))
+        return d
 
     def operationDone(self, done):
         """

From waterbug at ned.gsfc.nasa.gov  Sun Oct  5 18:30:19 2003
From: waterbug at ned.gsfc.nasa.gov (waterbug CVS)
Date: Sun Oct  5 17:30:21 2003
Subject: [Pangalactic-commits] Fixes to the conversion of resultsets to
	extracts.
Message-ID: <200310052130.h95LUJDo011049@ned.gsfc.nasa.gov>

Modified files:
PanGalactic/pangalactic/repo/factory.py 1.26 1.27

Log message:
Fixes to the conversion of resultsets to extracts.


Index: PanGalactic/pangalactic/repo/factory.py
diff -u PanGalactic/pangalactic/repo/factory.py:1.26 PanGalactic/pangalactic/repo/factory.py:1.27
--- PanGalactic/pangalactic/repo/factory.py:1.26	Thu Oct  2 22:33:52 2003
+++ PanGalactic/pangalactic/repo/factory.py	Sun Oct  5 17:30:17 2003
@@ -1,11 +1,11 @@
-# $Id: factory.py,v 1.26 2003/10/03 02:33:52 waterbug Exp $
+# $Id: factory.py,v 1.27 2003/10/05 21:30:17 waterbug Exp $
 
 """
 Pan Galactic Object Factory module
-@version: $Revision: 1.26 $
+@version: $Revision: 1.27 $
 """
 
-__version__ = "$Revision: 1.26 $"[11:-2]
+__version__ = "$Revision: 1.27 $"[11:-2]
 
 import types
 from pprint import pprint
@@ -52,24 +52,19 @@
         """
         pass
 
-    def makeExtracts(self, reslist):
+    def resultsets2Extracts(self, resultsets):
         """
-        Convert a pyPgSQL resultset into "extract" format (see
-        L{pangalactic.utils.factory}).
+        Convert a sequence of pyPgSQL resultsets into "extract"
+        format (see L{pangalactic.utils.factory}).
         """
         extracts = []
-        if reslist:
-            for res in reslist:
+        if resultsets:
+            for res in resultsets:
                 obj = self._registry.pgerdb_classes[res.pgef_class]
                 schema = obj._schema
                 module = obj.__module__
                 s = [ (a, self.cook(getattr(res, a), schema[a]))
                       for a in schema ]
-                if obj._refd:
-                    # strictly for testing purposes!
-                    r = [ (a, 'pgef_oid')
-                          for a in obj._refd ]
-                    s += r
                 instdict = dict(s)
                 name = module + '.' + res.pgef_class
                 extr = [ name, instdict ]
@@ -98,7 +93,7 @@
             schema = self._registry.pgef_classes[classname]._schema
             table = self._registry.getTableName(classname)
             for a in e[1]:
-                e[1][a] = self._factory.uncook(e[1][a], schema[a])
+                e[1][a] = self.uncook(e[1][a], schema[a])
             recs.append([table, e[1]])
         return recs
 
@@ -114,9 +109,8 @@
         """
         kw = {}
         table = self._registry.getTableName(obj.__class__.__name__)
-        for a in self._registry.table_cols[table]:
-            if obj.__dict__.get(a): # populate kw[a] iff p.a exists
-                kw[a] = obj.__dict__[a]
+        for a in obj._schema:
+                kw[a] = getattr(obj, a)
         return (kw, table)
 
     def makeObjects(self, classname, resultsets):

From waterbug at ned.gsfc.nasa.gov  Sun Oct  5 18:31:50 2003
From: waterbug at ned.gsfc.nasa.gov (waterbug CVS)
Date: Sun Oct  5 17:31:51 2003
Subject: [Pangalactic-commits] Fixed report to explicitly show an empty refd.
Message-ID: <200310052131.h95LVoBU011104@ned.gsfc.nasa.gov>

Modified files:
PanGalactic/pangalactic/repo/registry.py 1.33 1.34

Log message:
Fixed report to explicitly show an empty refd.


Index: PanGalactic/pangalactic/repo/registry.py
diff -u PanGalactic/pangalactic/repo/registry.py:1.33 PanGalactic/pangalactic/repo/registry.py:1.34
--- PanGalactic/pangalactic/repo/registry.py:1.33	Mon Sep 29 14:45:26 2003
+++ PanGalactic/pangalactic/repo/registry.py	Sun Oct  5 17:31:49 2003
@@ -1,9 +1,9 @@
 """
 Pan Galactic Engineering Repository Object Registry
-@version: $Revision: 1.33 $
+@version: $Revision: 1.34 $
 """
  
-__version__ = "$Revision: 1.33 $"[11:-2]
+__version__ = "$Revision: 1.34 $"[11:-2]
 # $Source: /repo/step_testbed/PanGalactic/pangalactic/repo/registry.py,v $
 
 import string, re
@@ -382,6 +382,8 @@
                 if nolisting:
                     for x in nolisting:
                         print '                           %s' % x
+            else:
+                print '  Referenced Objects:      ... none'
             print '  PgerDb Table:            %s'% t
             print '  Columns:'
             print '      ---------------------------------------------'

From waterbug at ned.gsfc.nasa.gov  Sun Oct  5 18:34:31 2003
From: waterbug at ned.gsfc.nasa.gov (waterbug CVS)
Date: Sun Oct  5 17:34:32 2003
Subject: [Pangalactic-commits] Mods to utilize new db transactional inserts
	+ factory extracts2Records method.
Message-ID: <200310052134.h95LYV3Z011147@ned.gsfc.nasa.gov>

Modified files:
PanGalactic/pangalactic/repo/pger.py 1.42 1.43

Log message:
Mods to utilize new db transactional inserts + factory extracts2Records method.


Index: PanGalactic/pangalactic/repo/pger.py
diff -u PanGalactic/pangalactic/repo/pger.py:1.42 PanGalactic/pangalactic/repo/pger.py:1.43
--- PanGalactic/pangalactic/repo/pger.py:1.42	Fri Sep 26 22:32:46 2003
+++ PanGalactic/pangalactic/repo/pger.py	Sun Oct  5 17:34:30 2003
@@ -1,9 +1,9 @@
 """
 Pan Galactic Entropy Reverser module
-@version: $Revision: 1.42 $
+@version: $Revision: 1.43 $
 """
 
-__version__ = "$Revision: 1.42 $"[11:-2]
+__version__ = "$Revision: 1.43 $"[11:-2]
 # $Source: /repo/step_testbed/PanGalactic/pangalactic/repo/pger.py,v $
 
 import time
@@ -103,8 +103,8 @@
         @type  refs:  integer
         @param refs:  specifies whether to include the objects
                       referenced by the specified class.
-                        - 0:  do not get references
-                        - 1: get all references
+                          0:  do not get references
+                          1:  get all references
                       (in future, refs may specify how many
                       reference levels to follow ...)
 
@@ -112,8 +112,8 @@
         @param subtypes:  specifies whether to include only the
                           specified class (the default) or all
                           subtypes.
-                            - 0:  only this type
-                            - 1:  include subtypes
+                              0:  only this type
+                              1:  include subtypes
 
         @param kw:  keyword arguments of the form:
                         key:   an attribute of the object
@@ -361,26 +361,10 @@
                         L{pangalactic.enterprise.pgefobject.PgefObject}
         @param olist:   a list of PGEF objects
         """
-        # set datetime stamp for this operation
-        dt = time.strftime("%Y-%m-%d %H:%M:%S")
-        for o in olist:
-            # possible TO DO item:
-            # group objects in olist by type and add them in
-            # order of potential dependencies ... or else do
-            # entire list in a single transaction -- probably
-            # better, but might want to have that as an option or
-            # even a completely separate method.
-            kw, table = self._factory.unmakeObject(o)
-            kw['pger_create_datetime'] = dt
-            kw['pger_mod_datetime'] = dt
-            addargs = [ (k, kw[k]) for k in kw ]
-            # DEBUG: print kw
-            # DEBUG: print 'object type is %s' % o.__class__.__name__
-            # DEBUG: print 'table is %s' % table
-            self._pgerdb.addRow(table, *addargs)
-        return dt
+        extracts = [self._factory.extract(o) for o in olist]
+        return self.addExtracts(extracts)
 
-    def addExtracts(self, elist):
+    def addExtracts(self, extracts):
         """
         Add a list of extracts of PGEF objects to PGERDB.
            - add a row to the appropriate PGERDB table for each
@@ -399,20 +383,14 @@
         """
         # TODO:  role-based authorization checks based on object
         # type, etc.
+        parmdict = {}
         dt = time.strftime("%Y-%m-%d %H:%M:%S")
-        for e in elist:
-            classpath, args = e[0], e[1]
-            cname = classpath.split('.')[-1]
-            table = self._registry.getTableName(cname)
-            args.append(['pger_create_datetime', dt])
-            args.append(['pger_mod_datetime', dt])
-            # uncook args for PostgreSQL-compatible types
-            schema = self._registry.pgef_classes[cname]._schema
-            for arg in args:
-                arg[1] = self._factory.uncook(arg[1], schema[arg[0]])
-            print 'table = %s' % table
-            print 'args = %s' % args
-            self._pgerdb.addRow(table, *args)
+        parmdict['pger_create_datetime'] = dt
+        parmdict['pger_mod_datetime'] = dt
+        for e in extracts:
+            e[1].update(parmdict)
+        recs = self._factory.extracts2Records(extracts)
+        self._pgerdb.addRows(recs)
         return dt
 
     def createProductMaster(self, id, id_context, project_id, project_id_context, **kw):

From waterbug at ned.gsfc.nasa.gov  Sun Oct  5 18:36:06 2003
From: waterbug at ned.gsfc.nasa.gov (waterbug CVS)
Date: Sun Oct  5 17:36:07 2003
Subject: [Pangalactic-commits] Mods to XMLRPC code and method signatures to
	utilize new back-end capabilities.
Message-ID: <200310052136.h95La64A011209@ned.gsfc.nasa.gov>

Modified files:
PanGalactic/pangalactic/repo/xmlrpc.py 1.20 1.21

Log message:
Mods to XMLRPC code and method signatures to utilize new back-end capabilities.


Index: PanGalactic/pangalactic/repo/xmlrpc.py
diff -u PanGalactic/pangalactic/repo/xmlrpc.py:1.20 PanGalactic/pangalactic/repo/xmlrpc.py:1.21
--- PanGalactic/pangalactic/repo/xmlrpc.py:1.20	Sun Sep 21 16:23:22 2003
+++ PanGalactic/pangalactic/repo/xmlrpc.py	Sun Oct  5 17:36:05 2003
@@ -1,9 +1,9 @@
 """
 PGER XML-RPC Interfaces module
-@version: $Revision: 1.20 $
+@version: $Revision: 1.21 $
 """
 
-__version__ = "$Revision: 1.20 $"[11:-2]
+__version__ = "$Revision: 1.21 $"[11:-2]
 # $Source: /repo/step_testbed/PanGalactic/pangalactic/repo/xmlrpc.py,v $
 
 from twisted.web import xmlrpc
@@ -41,12 +41,20 @@
 
     def xmlrpc_test_echoargs(self, *args):
         """xmlrpc request for echo of args."""
-        l = list(args)
-        return l
+        if args:
+            l = list(args)
+            return l
+        else:
+            s = """Nothin' from nothin' LEAVES nothin', """
+            s += """ya gotta have somethin' ...!"""
+            return s
 
-    def xmlrpc_getObjects(self, *args):
-        """xmlrpc get objects:  gets the set of objects that
-        exactly match a specified set of attribute-value pairs.
+    def xmlrpc_getObjects(self, typename, refs, subtypes, *args):
+        """
+        XMLRPC getObjects:  get the set of objects that exactly
+        match a specified set of attribute-value pairs, returning
+        the result encoded in the "extract" format -- see
+        L{pangalactic.utils.factory.extract})
 
         usage:  getObjects([object type], [kw-string, ...])
         
@@ -55,14 +63,19 @@
         XMLRPC doesn't support keyword parameters; they are
         quoted strings that will be parsed by the server).
         """
-        if len(args) > 1:
-            typename = args[0]
-            kw = keywordify(args[1:])
-            if kw:
-                res = self.PGER.getResultSets(typename, **kw)
-            else:
-                res = self.PGER.getResultSets(typename)
-            res.addCallback(self.PGER._factory.makeExtracts)
+        if args:
+            kw = {}
+            tuples = []
+            for a in args:
+                if a and isinstance(a, list):
+                    tuples.append(a)
+                if a and isinstance(a, dict):
+                    kw.update(a)
+            if tuples:
+                kw.update(dict(tuples))
+            res = self.PGER.getResultSets(typename, refs,
+                                          subtypes, **kw)
+            res.addCallback(self.PGER._factory.resultsets2Extracts)
             res.addCallbacks(succeed, fail)
             return res
         else:
@@ -79,8 +92,7 @@
         # creating the (classname, kw) from that.  But this is
         # easier for now ...
         if elist:
-            olist = [self.PGER._factory.reconstitute(e) for e in elist]
-            return self.PGER.addObjects(olist)
+            return self.PGER.addExtracts(elist)
         else:
             return """I'm sorry, Dave, I'm afraid I can't do that."""
 

From waterbug at ned.gsfc.nasa.gov  Mon Oct  6 01:23:33 2003
From: waterbug at ned.gsfc.nasa.gov (waterbug CVS)
Date: Mon Oct  6 00:23:35 2003
Subject: [Pangalactic-commits] New p.repo.factory method records2RowKeys().
Message-ID: <200310060423.h964NX95012067@ned.gsfc.nasa.gov>

Modified files:
PanGalactic/pangalactic/repo/factory.py 1.27 1.28

Log message:
New p.repo.factory method records2RowKeys().


Index: PanGalactic/pangalactic/repo/factory.py
diff -u PanGalactic/pangalactic/repo/factory.py:1.27 PanGalactic/pangalactic/repo/factory.py:1.28
--- PanGalactic/pangalactic/repo/factory.py:1.27	Sun Oct  5 17:30:17 2003
+++ PanGalactic/pangalactic/repo/factory.py	Mon Oct  6 00:23:31 2003
@@ -1,11 +1,11 @@
-# $Id: factory.py,v 1.27 2003/10/05 21:30:17 waterbug Exp $
+# $Id: factory.py,v 1.28 2003/10/06 04:23:31 waterbug Exp $
 
 """
 Pan Galactic Object Factory module
-@version: $Revision: 1.27 $
+@version: $Revision: 1.28 $
 """
 
-__version__ = "$Revision: 1.27 $"[11:-2]
+__version__ = "$Revision: 1.28 $"[11:-2]
 
 import types
 from pprint import pprint
@@ -96,6 +96,28 @@
                 e[1][a] = self.uncook(e[1][a], schema[a])
             recs.append([table, e[1]])
         return recs
+
+    def records2RowKeys(self, records):
+        """
+        Take a list of records and extracts the rowkeys -- i.e.,
+        the values of the primary key for each record.
+
+        @type extracts:   a list
+        @param extracts:  a list of records -- see
+                          L{pangalactic.repo.factory.extracts2Records}
+
+        @rtype:  list
+        @return: a list of "rowkeys".  A rowkey has the following
+                 structure:  [tablename, {pkcolname : value, ...}]
+        """
+        rowkeys = []
+        for rec in records:
+            pk = self._registry.table_pkeys[rec[0]]
+            key = {}
+            for a in pk:
+                key[a] = rec[1][a]
+            rowkeys.append([rec[0], key])
+        return rowkeys
 
     def unmakeObject(self, obj):
         """

From waterbug at ned.gsfc.nasa.gov  Mon Oct  6 01:24:41 2003
From: waterbug at ned.gsfc.nasa.gov (waterbug CVS)
Date: Mon Oct  6 00:24:43 2003
Subject: [Pangalactic-commits] ... and a test for
	p.repo.factory.records2RowKeys().
Message-ID: <200310060424.h964Ofoj012109@ned.gsfc.nasa.gov>

Modified files:
PanGalactic/pangalactic/test/test_factory_records2RowKeys.py None 1.1

Log message:
.. and a test for p.repo.factory.records2RowKeys().


From waterbug at ned.gsfc.nasa.gov  Mon Oct  6 01:30:59 2003
From: waterbug at ned.gsfc.nasa.gov (waterbug CVS)
Date: Mon Oct  6 00:31:01 2003
Subject: [Pangalactic-commits] Somewhat more concise coding,
	+ docstring correction.
Message-ID: <200310060430.h964UxwR012153@ned.gsfc.nasa.gov>

Modified files:
PanGalactic/pangalactic/repo/factory.py 1.28 1.29

Log message:
Somewhat more concise coding, + docstring correction.


Index: PanGalactic/pangalactic/repo/factory.py
diff -u PanGalactic/pangalactic/repo/factory.py:1.28 PanGalactic/pangalactic/repo/factory.py:1.29
--- PanGalactic/pangalactic/repo/factory.py:1.28	Mon Oct  6 00:23:31 2003
+++ PanGalactic/pangalactic/repo/factory.py	Mon Oct  6 00:30:58 2003
@@ -1,11 +1,11 @@
-# $Id: factory.py,v 1.28 2003/10/06 04:23:31 waterbug Exp $
+# $Id: factory.py,v 1.29 2003/10/06 04:30:58 waterbug Exp $
 
 """
 Pan Galactic Object Factory module
-@version: $Revision: 1.28 $
+@version: $Revision: 1.29 $
 """
 
-__version__ = "$Revision: 1.28 $"[11:-2]
+__version__ = "$Revision: 1.29 $"[11:-2]
 
 import types
 from pprint import pprint
@@ -102,9 +102,9 @@
         Take a list of records and extracts the rowkeys -- i.e.,
         the values of the primary key for each record.
 
-        @type extracts:   a list
-        @param extracts:  a list of records -- see
-                          L{pangalactic.repo.factory.extracts2Records}
+        @type records:   a list
+        @param records:  a list of records -- see
+                         L{pangalactic.repo.factory.extracts2Records}
 
         @rtype:  list
         @return: a list of "rowkeys".  A rowkey has the following
@@ -113,9 +113,8 @@
         rowkeys = []
         for rec in records:
             pk = self._registry.table_pkeys[rec[0]]
-            key = {}
-            for a in pk:
-                key[a] = rec[1][a]
+            pks = [(a, rec[1][a]) for a in pk]
+            key = dict(pks)
             rowkeys.append([rec[0], key])
         return rowkeys
 

From waterbug at ned.gsfc.nasa.gov  Mon Oct  6 01:41:22 2003
From: waterbug at ned.gsfc.nasa.gov (waterbug CVS)
Date: Mon Oct  6 00:41:24 2003
Subject: [Pangalactic-commits] Add new function buildSelectFromRowKeys()
Message-ID: <200310060441.h964fMqZ012198@ned.gsfc.nasa.gov>

Modified files:
PanGalactic/pangalactic/utils/sql.py 1.6 1.7

Log message:
Add new function buildSelectFromRowKeys()


Index: PanGalactic/pangalactic/utils/sql.py
diff -u PanGalactic/pangalactic/utils/sql.py:1.6 PanGalactic/pangalactic/utils/sql.py:1.7
--- PanGalactic/pangalactic/utils/sql.py:1.6	Sun Oct  5 17:26:58 2003
+++ PanGalactic/pangalactic/utils/sql.py	Mon Oct  6 00:41:21 2003
@@ -1,6 +1,6 @@
 """SQL Tools"""
 
-# $Id: sql.py,v 1.6 2003/10/05 21:26:58 waterbug Exp $
+# $Id: sql.py,v 1.7 2003/10/06 04:41:21 waterbug Exp $
 
 import re, types
 
@@ -95,6 +95,22 @@
         # is needed ...
         selectargs = (sqlstmt,)
     return selectargs
+
+def buildSelectFromRowKeys(rowkeys):
+    """
+    Take a list of rowkeys (for def of a rowkey, see
+    L{pangalactic.repo.factory.records2RowKeys}) and
+    return an SQL select statement that will select the
+    corresponding rows from the appropriate tables.
+    """
+    allsql = ''
+    allargs = []
+    for rk in rowkeys:
+        args = [(a, rk[1][a], '=') for a in rk[1]]
+        parms = buildSelect(rk[0], 0, *args)
+        allsql += parms[0] + '; '
+        allargs += parms[1:]
+    return allsql, allargs
 
 def buildInsert(table, parmdict):
     """

From waterbug at ned.gsfc.nasa.gov  Mon Oct  6 01:42:18 2003
From: waterbug at ned.gsfc.nasa.gov (waterbug CVS)
Date: Mon Oct  6 00:42:20 2003
Subject: [Pangalactic-commits] ... and add a test for
	buildSelectFromRowKeys().
Message-ID: <200310060442.h964gIow012227@ned.gsfc.nasa.gov>

Modified files:
PanGalactic/pangalactic/test/test_sql.py 1.8 1.9

Log message:
.. and add a test for buildSelectFromRowKeys().


Index: PanGalactic/pangalactic/test/test_sql.py
diff -u PanGalactic/pangalactic/test/test_sql.py:1.8 PanGalactic/pangalactic/test/test_sql.py:1.9
--- PanGalactic/pangalactic/test/test_sql.py:1.8	Sun Oct  5 17:24:50 2003
+++ PanGalactic/pangalactic/test/test_sql.py	Mon Oct  6 00:42:16 2003
@@ -1,81 +1,157 @@
-# $Id: test_sql.py,v 1.8 2003/10/05 21:24:50 waterbug Exp $
+# $Id: test_sql.py,v 1.9 2003/10/06 04:42:16 waterbug Exp $
 
 """
 Functional tests for pangalactic.utils.sql module
 """
 
+from pprint import pprint
 from pyPgSQL import PgSQL
 from pangalactic.utils.sql import buildSelect
+from pangalactic.utils.sql import buildSelectFromRowKeys
 from pangalactic.utils.sql import buildInsert
-from twisted.trial import unittest
+from pangalactic.utils import oid
+from pangalactic.enterprise.productmaster import ProductMaster as PM
+from pangalactic.enterprise.productversion import ProductVersion as PV
+from pangalactic.enterprise.project import Project
+from pangalactic.repo.factory import PgerObjectFactory as POF
+from pangalactic.repo.registry import PgerObjectRegistry as POR
 
 # TODO:  need more test data ...
 
-class SqlGenerationTest(unittest.TestCase):
-
-    def test_1_equals(self):
-        """CASE:  build a SELECT by one string column, '=' operator"""
-        cmd = buildSelect('product_master', 0,
-                          ('id_context', 'TEST', '='))
-        expected = ('SELECT * FROM ONLY product_master WHERE id_context = %s', 
-                    'TEST')
-        self.assertEquals(expected, cmd)
-
-    def test_2_equals_and_like(self):
-        """CASE:  build a SELECT by several string columns; like and ="""
-        cmd = buildSelect('product_master', 0,
-                          ('id_context', 'TEST', '='),
-                          ('name', 'Mr. F')
-                         )
-        expected = ('SELECT * FROM ONLY product_master WHERE id_context = %s AND name ILIKE %s', 'TEST', '%Mr. F%')
-        self.assertEquals(expected, cmd)
-
-    def test_3_in_sequence(self):
-        """CASE:  build a SELECT by one column with a sequence of values"""
-        cmd = buildSelect('alert', 0,
-                          ('doc_number', 
-                           ("XG4-D-02-03", 
-                            "XG4-D-02-05", 
-                            "XG4-D-02-07")))
-        expected = ("SELECT * FROM ONLY alert WHERE doc_number IN ('XG4-D-02-03', 'XG4-D-02-05', 'XG4-D-02-07')",)
-        self.assertEquals(expected, cmd)
-
-    def test_4_date_interval(self):
-        """CASE:  build a SELECT by date interval"""
-        cmd = buildSelect('alert', 0,
-                          ('doc_issue_date', '2002-04-01', '>'),
-                          ('doc_issue_date', '2002-05-01', '<')
-                         )
-        expected = ('SELECT * FROM ONLY alert WHERE doc_issue_date > %s AND doc_issue_date < %s', '2002-04-01', '2002-05-01')
-        self.assertEquals(expected, cmd)
-
-    def test_5_sort(self):
-        """CASE:  build a SELECT with order by one column"""
-        cmd = buildSelect('alert', 0,
-                          ('doc_issue_date', '2002-04-01', '>'),
-                          sort='doc_issue_date')
-        expected = ('SELECT * FROM ONLY alert WHERE doc_issue_date > %s ORDER BY doc_issue_date', '2002-04-01')
-        self.assertEquals(expected, cmd)
-
-    def test_6_multi_sort(self):
-        """CASE:  build a SELECT with order by multiple columns"""
-        cmd = buildSelect('alert', 0,
-                          ('doc_issue_date', '2002-04-01', '>'),
-                          sort=('doc_issue_date', 'doc_designator')
-                         )
-        expected = ('SELECT * FROM ONLY alert WHERE doc_issue_date > %s ORDER BY doc_issue_date, doc_designator,', '2002-04-01')
-        self.assertEquals(expected, cmd)
-
-    def test_7_buildInsert(self):
-        """CASE:  build an INSERT statement + parameter list"""
-        result = buildInsert('product_master',
-                             {'id' : '123',
-                              'id_context' : 'TEST'}
-                            )
-        expected = ('INSERT INTO product_master (id_context, id) VALUES (%s, %s)', ('TEST', '123'))
-        self.assertEquals(expected, result)
-
-#     def test_9_buildTransactionalInsert(self):
-#         """CASE:  build a transactional series of INSERT
-#         commands as a single statement + parameter list"""
+print '==================================='
+print """CASE:  build a SELECT by one string column, '=' operator"""
+print '-----------------------------------'
+cmd = buildSelect('product_master', 0,
+                  ('id_context', 'TEST', '='))
+print 'cmd is:'
+print str(cmd)
+print '    -----------------------------------'
+print """    expected: 'SELECT * FROM ONLY product_master WHERE id_context = %s', 
+            'TEST'"""
+print '==================================='
+print
+print
+print '==================================='
+print """CASE:  build a SELECT by several string columns; like and ="""
+print '-----------------------------------'
+cmd = buildSelect('product_master', 0,
+                  ('id_context', 'TEST', '='),
+                  ('name', 'Mr. F')
+                 )
+print 'cmd is:'
+print str(cmd)
+print '-----------------------------------'
+print """expected:  ('SELECT * FROM ONLY product_master WHERE id_context = %s AND name ILIKE %s', 'TEST', '%Mr. F%')"""
+print '==================================='
+print
+print
+print '==================================='
+print """CASE:  build a SELECT by one column with a sequence of values"""
+print '-----------------------------------'
+cmd = buildSelect('alert', 0,
+                  ('doc_number', 
+                   ("XG4-D-02-03", 
+                    "XG4-D-02-05", 
+                    "XG4-D-02-07")))
+print 'cmd is:'
+print str(cmd)
+print '-----------------------------------'
+print """expected:  ("SELECT * FROM ONLY alert WHERE doc_number IN ('XG4-D-02-03', 'XG4-D-02-05', 'XG4-D-02-07')",)"""
+print '==================================='
+print
+print
+print '==================================='
+print """CASE:  build a SELECT by date interval"""
+print '-----------------------------------'
+cmd = buildSelect('alert', 0,
+                  ('doc_issue_date', '2002-04-01', '>'),
+                  ('doc_issue_date', '2002-05-01', '<')
+                 )
+print 'cmd is:'
+print str(cmd)
+print '-----------------------------------'
+print """expected:  ('SELECT * FROM ONLY alert WHERE doc_issue_date > %s AND doc_issue_date < %s', '2002-04-01', '2002-05-01')"""
+print '==================================='
+print
+print
+print '==================================='
+print """CASE:  build a SELECT with order by one column"""
+print '-----------------------------------'
+cmd = buildSelect('alert', 0,
+                  ('doc_issue_date', '2002-04-01', '>'),
+                  sort='doc_issue_date')
+print 'cmd is:'
+print str(cmd)
+print '-----------------------------------'
+print """expected = ('SELECT * FROM ONLY alert WHERE doc_issue_date > %s ORDER BY doc_issue_date', '2002-04-01')"""
+print '==================================='
+print
+print
+print '==================================='
+print """CASE:  build a SELECT with order by multiple columns"""
+print '-----------------------------------'
+cmd = buildSelect('alert', 0,
+                  ('doc_issue_date', '2002-04-01', '>'),
+                  sort=('doc_issue_date', 'doc_designator')
+                 )
+print 'cmd is:'
+print str(cmd)
+print '-----------------------------------'
+print """expected:  ('SELECT * FROM ONLY alert WHERE doc_issue_date > %s ORDER BY doc_issue_date, doc_designator,', '2002-04-01')"""
+print '==================================='
+print
+print
+print '==================================='
+print """CASE:  build an INSERT statement + parameter list"""
+cmd = buildInsert('product_master',
+                     {'id' : '123',
+                      'id_context' : 'TEST'}
+                    )
+print 'cmd is:'
+print str(cmd)
+print '-----------------------------------'
+print """expected:  ('INSERT INTO product_master (id_context, id) VALUES (%s, %s)', ('TEST', '123'))"""
+print '==================================='
+print
+print
+print '==================================='
+print """CASE:  build a SELECT statement + parameter list from records"""
+f = open('IDTEST')
+savedid = f.read()
+testoid1 = oid.generate('test')
+testoid2 = oid.generate('test')
+
+testid = str(int(savedid) + 1)
+f.close()
+f = open('IDTEST', 'w')
+f.write(testid)
+f.close()
+
+projid = 'MD' + testid
+projname = 'MD' + testid + ' Project'
+pmid = 'MD-' + testid
+pmname = 'MD-' + testid + ' Model Mr. Dynamo'
+pvname = 'MD-' + testid + ' Version A'
+
+# create test objects
+p = Project(id=projid, id_context='TEST', name=projname)
+p.popTestData()
+pm = PM(id=pmid, id_context='TEST', name=pmname, _project=p)
+pm.popTestData()
+pv = PV(_of_master=pm, id='A', name=pvname)
+pv.popTestData()
+
+reg = POR()
+fac = POF(reg)
+pe = fac.extract(p)
+pme = fac.extract(pm)
+pve = fac.extract(pv)
+
+extracts = [pe, pme, pve]
+recs = fac.extracts2Records(extracts)
+keys = fac.records2RowKeys(recs)
+cmd = buildSelectFromRowKeys(keys)
+print 'cmd is:'
+pprint(cmd)
+print '==================================='
 

From waterbug at ned.gsfc.nasa.gov  Mon Oct  6 02:11:20 2003
From: waterbug at ned.gsfc.nasa.gov (waterbug CVS)
Date: Mon Oct  6 01:11:21 2003
Subject: [Pangalactic-commits] A gleeful renaming (esp. for Harry Potter
	fans ... heh ; ^).
Message-ID: <200310060511.h965BKRs012321@ned.gsfc.nasa.gov>

Modified files:
PanGalactic/pangalactic/utils/factory.py 1.3 1.4

Log message:
A gleeful renaming (esp. for Harry Potter fans ... heh ;^).


Index: PanGalactic/pangalactic/utils/factory.py
diff -u PanGalactic/pangalactic/utils/factory.py:1.3 PanGalactic/pangalactic/utils/factory.py:1.4
--- PanGalactic/pangalactic/utils/factory.py:1.3	Sun Oct  5 05:33:05 2003
+++ PanGalactic/pangalactic/utils/factory.py	Mon Oct  6 01:11:18 2003
@@ -1,12 +1,12 @@
-# $Id: factory.py,v 1.3 2003/10/05 09:33:05 waterbug Exp $
+# $Id: factory.py,v 1.4 2003/10/06 05:11:18 waterbug Exp $
 
 """
 Functions to extract persistable data from
 L{pangalactic.enterprise} objects.
-@version: $Revision: 1.3 $
+@version: $Revision: 1.4 $
 """
 
-__version__ = "$Revision: 1.3 $"[11:-2]
+__version__ = "$Revision: 1.4 $"[11:-2]
 
 import types
 import string
@@ -170,12 +170,12 @@
         else:
             return value
 
-    def rebuild(self, extr, objs=[]):
+    def remember(self, extr, objs=[]):
         """
-        Reconstruct an object from an extract and a list of
-        candidates to use for its referenced objects (i.e., those
-        in _refd).  (Use case:  update of an object of which the
-        referenced objects already exist locally.)
+        Re-member (wink ;^) an object from an extract and a list
+        of candidates to use for its referenced objects (i.e.,
+        those in _refd).  (Use case:  update of an object of
+        which the referenced objects already exist locally.)
 
         @type extr:   a list (see
                       L{pangalatic.utils.factory.extract}
@@ -184,7 +184,7 @@
 
         @type objs:   list of L{pangalactic.enterprise.pgefobject.PgefObject}
         @param objs:  a list of objects from which the referenced
-                      objects of the object being rebuilt can be
+                      objects of the object being remembered can be
                       selected
         """
         classpath = extr[0]
@@ -204,18 +204,18 @@
                         kw[a] = None
         return klass(**kw)
 
-    def rebuildall(self, extracts, objs=[]):
+    def rememberAll(self, extracts, objs=[]):
         """
         Take a list of extracts and reconstruct the collection of
         objects.
 
         @type extracts:  list
-        @param extracts: a list of extracts to be rebuilt into
+        @param extracts: a list of extracts to be remembered into
                          objects.
 
         @type objs:  list
         @param objs: a list of instances for use in the
-                     rebuilding process (candidates for objects
+                     remembering process (candidates for objects
                      that may be referenced by the extracts but
                      may not be among the extracts that were
                      passed in).
@@ -223,7 +223,7 @@
         @rtype:  list
         @return: a rat's nest of objects
         """
-        built = [] # instances that have been built
+        remembered = [] # instances that have been remembered
         # make a list of all classes in the extracts
         cnames = utils.unique([string.split(e[0], '.')[-1]
                                for e in extracts])
@@ -239,7 +239,7 @@
         # make a dictionary of lists of instances by class
         byclass = {}
         for c in cnames:
-            byclass[c] = [self.rebuild(e, objs) for e in edict[c]]
+            byclass[c] = [self.remember(e, objs) for e in edict[c]]
         for o in objs:
             c = o.__class__.__name__
             if c in byclass:
@@ -247,7 +247,7 @@
             else:
                 byclass[c] = [o]
         print 'byclass = %s' % str(byclass)
-        # so in theory, at this point everything is rebuilt.
+        # so in theory, at this point everything is remembered.
         # now hook up as many refs as we can ... using the
         # registry a little bit:
         for c in cnames:
@@ -273,52 +273,6 @@
                                 if fkvals == pkvals:
                                     setattr(o, attr, oo)
                                 break
-            built += byclass[c]
-        return built
-
-#         built = []  # classes of refd objs that have been built
-#         pgef_classes = self._registry.pgef_classes
-#         # make a list of all classes in the extracts
-#         cnames = utils.unique([string.split(e[0], '.')[-1]
-#                                for e in extracts])
-#         print 'cnames is:'
-#         pprint(cnames)
-#         # instantiate objects for the class(es) that have no
-#         # references first ...
-#         print 'doing classes w/out refs ...'
-#         for cname in cnames:
-#             print '  - class:  %s' % cname
-#             if not pgef_classes[cname]._refd:
-#                 objs += [self.rebuild(e) for e in
-#                          edict[cname]]
-#                 del edict[cname]
-#                 built.append(cname)
-#                 print '      edict is: %s' % str(edict)
-#                 print '      built is: %s' % str(built)
-#         # then iterate over the other classes, in as many passes
-#         # as it takes ...
-#         print 'now doing rest of classes ...'
-#         while edict:
-#             newbuilt = []
-#             for cname in edict:
-#                 # Sets would make this a lot easier!
-#                 logic = (False in [a in built
-#                          for a in pgef_classes[cname]._refd.values()])
-#                 print '  - class:  %s ...' % cname
-#                 print '    refd:   %s ...' % str(pgef_classes[cname]._refd.values())
-#                 print '    logic:  %s ...' % logic
-#                 if not logic:
-#                     objs += [self.rebuild(e, objs) for e in
-#                              edict[cname]]
-#                     newbuilt.append(cname)
-#                     print '      newbuilt is: %s' % str(newbuilt)
-#             for cn in newbuilt:
-#                 del edict[cn]
-#             built += newbuilt
-#             print '      built is: %s' % str(built)
-#             if not newbuilt:
-#                 print """Sorry, not enough info; couldn't build all objects."""
-#                 break
-#         print 'built objs:  %s' % str(objs)
-#         return objs
+            remembered += byclass[c]
+        return remembered
 

From waterbug at ned.gsfc.nasa.gov  Mon Oct  6 04:47:01 2003
From: waterbug at ned.gsfc.nasa.gov (waterbug CVS)
Date: Mon Oct  6 03:47:03 2003
Subject: [Pangalactic-commits] Add _pk and _fk attrs and removed
	FillSampleProject class method (superceded by popTestData
	instance method).
Message-ID: <200310060747.h967l1Cd012927@ned.gsfc.nasa.gov>

Modified files:
PanGalactic/pangalactic/enterprise/project.py 1.10 1.11

Log message:
Add _pk and _fk attrs and removed FillSampleProject class method (superceded by popTestData instance method).


Index: PanGalactic/pangalactic/enterprise/project.py
diff -u PanGalactic/pangalactic/enterprise/project.py:1.10 PanGalactic/pangalactic/enterprise/project.py:1.11
--- PanGalactic/pangalactic/enterprise/project.py:1.10	Mon Sep 29 14:39:59 2003
+++ PanGalactic/pangalactic/enterprise/project.py	Mon Oct  6 03:46:59 2003
@@ -1,22 +1,20 @@
-# $Id: project.py,v 1.10 2003/09/29 18:39:59 waterbug Exp $
+# $Id: project.py,v 1.11 2003/10/06 07:46:59 waterbug Exp $
 
 """
 Project metadata.
 """
 
-__version__ = "$Revision: 1.10 $"[11:-2]
+__version__ = "$Revision: 1.11 $"[11:-2]
 
 from pangalactic.enterprise.pgefobject import PgefObject
 
-def FillSampleProject(project):
+def FillSampleProject(proj):
     """
     Fills in some test data.
     """
-    project.name = 'TP'
-    project.short_description = 'Test Project'
-    project.owner = 'joe@schmoe.com'
-    project.creator = 'moi@moi.com'
-    
+    proj.name = 'TP'
+    proj.short_description = 'Test Project'
+
 class Project(PgefObject):
     """
     I encapsulate all data about a Project.
@@ -30,6 +28,7 @@
                         'pger_create_datetime',
                         'pgef_oid']
     _excluded_dump = []
+    _fk = {}
     # These are the fields that will appear in when a Project is
     # placed in a grid.  The format for each field is 
     # [ Label, attribute, field_type ].
@@ -41,6 +40,7 @@
                 ['Created','self.create_datetime', 'string'],
                 ['Creator','self.creator', 'string']
                ]
+    _pk = ['id', 'id_context']
     _schema_ext = {}
     _schema = _schema_ext.copy()
     _schema.update(PgefObject._schema)

From waterbug at ned.gsfc.nasa.gov  Mon Oct  6 09:20:41 2003
From: waterbug at ned.gsfc.nasa.gov (waterbug CVS)
Date: Mon Oct  6 08:20:43 2003
Subject: [Pangalactic-commits] Test for Pger method _getRefRowKeys.
Message-ID: <200310061220.h96CKfCF015438@ned.gsfc.nasa.gov>

Modified files:
PanGalactic/pangalactic/test/test_pger_getRefRowKeys.py None 1.1

Log message:
Test for Pger method _getRefRowKeys.


From pbear at ned.gsfc.nasa.gov  Mon Oct  6 15:37:11 2003
From: pbear at ned.gsfc.nasa.gov (pbear CVS)
Date: Mon Oct  6 14:37:13 2003
Subject: [Pangalactic-commits] added vanilla implementations of current
	wfprocess activities; more tbd rsn
Message-ID: <200310061837.h96IbBOO020077@ned.gsfc.nasa.gov>

Modified files:
PanGalactic/pangalactic/enterprise/pgefadvisory.py 1.34 1.35
PanGalactic/pangalactic/enterprise/workflow/wfactivity_implementation.py None 1.1
PanGalactic/pangalactic/enterprise/workflow/wfactivity.py 1.10 1.11
PanGalactic/pangalactic/enterprise/workflow/wfexecutionobject.py 1.12 1.13
PanGalactic/pangalactic/enterprise/workflow/wfprocess.py 1.13 1.14
PanGalactic/pangalactic/enterprise/workflow/wfprocessoverview.py 1.14 1.15
PanGalactic/pangalactic/enterprise/workflow/workflow_wizard.py 1.16 1.17
PanGalactic/pangalactic/utils/datamanager.py 1.34 1.35
PanGalactic/pangalactic/utils/localdb.py 1.32 1.33

Log message:
added vanilla implementations of current wfprocess activities; more tbd rsn


Index: PanGalactic/pangalactic/enterprise/workflow/wfprocessoverview.py
diff -u PanGalactic/pangalactic/enterprise/workflow/wfprocessoverview.py:1.14 PanGalactic/pangalactic/enterprise/workflow/wfprocessoverview.py:1.15
--- PanGalactic/pangalactic/enterprise/workflow/wfprocessoverview.py:1.14	Thu Oct  2 15:31:23 2003
+++ PanGalactic/pangalactic/enterprise/workflow/wfprocessoverview.py	Mon Oct  6 14:37:09 2003
@@ -345,7 +345,6 @@
                             transitions = editor.GetTransitions()
                             activities = editor.GetActivities()
                             wfobj = editor.Save()
-                            #print "wfobj", wfobj
                             if wfobj:
                                 self.grid.AddData(wfobj, wxLIGHT_GREY)
                         dlg.Destroy()
@@ -430,7 +429,7 @@
         print "workflowoverview.Setupforlocalmode tbd"
 
     def Commit(self):
-        #print "workflowoverview.commit"
+        print "workflowoverview.commit"
 
         if self.DataManager.UncommittedWorkflows():
             #print "have uncommitted workflows"

Index: PanGalactic/pangalactic/enterprise/pgefadvisory.py
diff -u PanGalactic/pangalactic/enterprise/pgefadvisory.py:1.34 PanGalactic/pangalactic/enterprise/pgefadvisory.py:1.35
--- PanGalactic/pangalactic/enterprise/pgefadvisory.py:1.34	Thu Oct  2 15:31:22 2003
+++ PanGalactic/pangalactic/enterprise/pgefadvisory.py	Mon Oct  6 14:37:09 2003
@@ -1,11 +1,11 @@
-# $Id: pgefadvisory.py,v 1.34 2003/10/02 19:31:22 pbear Exp $
+# $Id: pgefadvisory.py,v 1.35 2003/10/06 18:37:09 pbear Exp $
 
 """
 Base class for documents that report conditions related to the
 usability of a product.
 """
 
-__version__ = "$Revision: 1.34 $"[11:-2]
+__version__ = "$Revision: 1.35 $"[11:-2]
 
 import os.path
 import string
@@ -69,8 +69,7 @@
 # leave this here...  I use it to generate old data -vwk
 #
 #        now = mx.DateTime.DateFromTicks(mx.DateTime.now())
-#        earlier = now + mx.DateTime.RelativeDateTime(days=-85)
-#
+#        earlier = now + mx.DateTime.RelativeDateTime(days=-15)
 #        self.pger_create_datetime = earlier
 #        self.pger_mod_datetime    = earlier
 #        self.create_datetime      = earlier

Index: PanGalactic/pangalactic/enterprise/workflow/workflow_wizard.py
diff -u PanGalactic/pangalactic/enterprise/workflow/workflow_wizard.py:1.16 PanGalactic/pangalactic/enterprise/workflow/workflow_wizard.py:1.17
--- PanGalactic/pangalactic/enterprise/workflow/workflow_wizard.py:1.16	Thu Oct  2 15:31:23 2003
+++ PanGalactic/pangalactic/enterprise/workflow/workflow_wizard.py	Mon Oct  6 14:37:09 2003
@@ -78,7 +78,7 @@
 
         self.act_labels = []
         for actinfo in self.ActInfo:
-            print "actinfo", actinfo
+            #print "actinfo", actinfo
             self.act_labels.append(actinfo[2])
 
         self.trans_labels = []
@@ -209,18 +209,18 @@
             
 
     def createWorkflow(self, name, activities, transitions):
-        print "wizard.createWorkflow"
+        #print "wizard.createWorkflow"
 
         process = wffactory.simpleWfProcess(name)
 
         activitydict = {}
         wfdata = None
         for akey, avalue in activities.items():
-            print "akey", akey, "; avalue", avalue
+            #print "akey", akey, "; avalue", avalue
             wfactivity = wffactory.newWfActivity(avalue["activity"], process.pgef_oid, avalue, wfdata)
             activitydict[wfactivity.pgef_oid] = wfactivity
-            self.DataManager.Add([wfactivity])
-        print "activitydict", activitydict
+            self.DataManager.add([wfactivity])
+        #print "activitydict", activitydict
         
         fromlist = []
         tolist = []
@@ -243,7 +243,7 @@
 #            transition = wftransition.WfTransition(translist[0], translist[1], process.pgef_oid)
             transition = wffactory.newWfTransition(process.pgef_oid, translist[0], translist[1])
             transitiondict[transition.pgef_oid] = transition
-            self.DataManager.Add([transition])
+            self.DataManager.add([transition])
         #print "transitiondict", transitiondict
             
         tolist.sort()
@@ -264,14 +264,14 @@
 
 
     def Save(self, event = None):
-        print "workflow_wizard.save"
+        #print "workflow_wizard.save"
         if self.DataManager.creatingWorkflow:
             self.DataManager.creatingWorkflow = false
             transitions = self.GetTransitions()
             activities = self.GetActivities()
 
             name = self.GetName()
-            print "name <", name, ">"
+            #print "name <", name, ">"
             if name:
                 self.workflow = self.createWorkflow(name, activities, transitions)
                 self.DataManager.addWorkflow(self.workflow)
@@ -282,17 +282,17 @@
                 return None
   
         else:
-        #    print "not creating a workflow"
+            #print "not creating a workflow"
             return None
 
     def SaveChanges(self):
-        print "wfwizard.savechanges"
+        #print "wfwizard.savechanges"
         transitions = self.GetTransitions()
         activities = self.GetActivities()
         name = self.GetName()
-        print "name <", name, ">"
-        print "activities", activities
-        print "transitions", transitions
+        #print "name <", name, ">"
+        #print "activities", activities
+        #print "transitions", transitions
         if name:
             if self.workflow:
                 self.workflow.SetActivities(activities)

Index: PanGalactic/pangalactic/enterprise/workflow/wfprocess.py
diff -u PanGalactic/pangalactic/enterprise/workflow/wfprocess.py:1.13 PanGalactic/pangalactic/enterprise/workflow/wfprocess.py:1.14
--- PanGalactic/pangalactic/enterprise/workflow/wfprocess.py:1.13	Thu Oct  2 15:31:23 2003
+++ PanGalactic/pangalactic/enterprise/workflow/wfprocess.py	Mon Oct  6 14:37:09 2003
@@ -44,7 +44,7 @@
                         ["Template\nName",  "self.name",                   "string", ""],
                         ["# Steps",         "self._nstates",               "string", ""],
                         ["Status",          "self._activity_name",         "string", ""],
-                        ["Status Date",     "self._activity_due_date_str", "string", "colour"],
+                        ["Due Date",        "self._activity_due_date_str", "string", "colour"],
                         ["Pending\nAction", "self._next_activity_name",    "string", ""]]
                      
 
@@ -129,9 +129,29 @@
         self.defaultstartid = activityid
 
 
-    def initiate(self, wfdata):
+##    def setDataManager(self, datamgr):
+##        print "wfprocess.setdatamanager"
+##        self._DataManager = datamgr
+##        for akey, aobj in self.activities.items():
+##            aobj.setDataManager(self._DataManager)
+
+        
+##    def clearDataManager(self):
+##        print "wfprocess.cleardatamanager"
+##        self._DataManager = None
+##        for akey, aobj in self.activities.items():
+##            aobj.clearDataManager()
+
+        
+    def initiate(self, wfdata, datamgr):
+        """
+        Start a wfprocess instance.  Only a wfprocess instance has a wfdata object.
+        """
 #        print "wfprocess.initiate", self.defaultstartid
         self.activityId = self.defaultstartid
+#        self.setDataManager(datamgr)
+        self.SetData(wfdata)
+
         if self.activityId:
             current_activity = self.activities[self.activityId]
             current_activity.changeState(OPEN_NOTSTARTED)
@@ -141,9 +161,8 @@
             duedate = now + mx.DateTime.RelativeDateTime(days=current_activity.getDuration())
             self._activity_due_date = duedate
             self._activity_due_date_str = datetimes.getDisplayDate(duedate)
-
-        self.getNextActivityName()
-        self.SetData(wfdata)
+            current_activity.startActivity(datamgr)
+            self.getNextActivityName()
 
 
     def getNextActivityName(self):
@@ -164,7 +183,6 @@
                 self.fields["currentStatus"] = newState
                 self.fields["lastStatusUpdate"] = now
                 eventaudit = wfeventaudit.WfEventAudit(self, wfeventaudittypes.processStateChanged, self.oid)
-                #self.DataManager.Save([eventaudit])
                 historyevent = wfeventaudit.WfEventAudit(self.getName(),
                                                          wfeventaudittypes.processStateChanged,
                                                          self.oid)

Index: PanGalactic/pangalactic/enterprise/workflow/wfexecutionobject.py
diff -u PanGalactic/pangalactic/enterprise/workflow/wfexecutionobject.py:1.12 PanGalactic/pangalactic/enterprise/workflow/wfexecutionobject.py:1.13
--- PanGalactic/pangalactic/enterprise/workflow/wfexecutionobject.py:1.12	Thu Oct  2 15:31:23 2003
+++ PanGalactic/pangalactic/enterprise/workflow/wfexecutionobject.py	Mon Oct  6 14:37:09 2003
@@ -45,7 +45,6 @@
         self.parentId = parentId  # WorkEffort ID of the parent runtime object (null for process)
         self.name = wfname
         self.description = ""
-#        self.DataManager = None
         self.history = []
 #        timetuple = mx.DateTime.now()
 #        self.create_datetime = timetuple.strftime("%m/%d/%Y %H:%M:%S") #time.strftime("%m/%d/%Y %H:%M:%S", footuple)

Index: PanGalactic/pangalactic/enterprise/workflow/wfactivity.py
diff -u PanGalactic/pangalactic/enterprise/workflow/wfactivity.py:1.10 PanGalactic/pangalactic/enterprise/workflow/wfactivity.py:1.11
--- PanGalactic/pangalactic/enterprise/workflow/wfactivity.py:1.10	Thu Oct  2 15:31:23 2003
+++ PanGalactic/pangalactic/enterprise/workflow/wfactivity.py	Mon Oct  6 14:37:09 2003
@@ -10,9 +10,11 @@
 from pangalactic.enterprise.workflow.wfexecutionstates import *
 from pangalactic.enterprise.workflow.wfexecutionobject import WfExecutionObject
 
+import pangalactic.enterprise.workflow.wfactivity_implementation as wfactivity_impl
 import pangalactic.enterprise.workflow.wfeventaudit as wfeventaudit
 import pangalactic.enterprise.workflow.wfeventaudittypes as wfeventaudittypes
 
+
 class WfActivity(WfExecutionObject):
     """
     This is the primary building block for a workflow.  For now, only these
@@ -77,7 +79,6 @@
                 self.fields["currentStatus"] = newState
                 self.fields["lastStatusUpdate"] = now
                 eventaudit = wfeventaudit.WfEventAudit(self, wfeventaudittypes.activityStateChanged, self.oid)
-#                self.DataManager.Save([eventaudit])
                 historyevent = wfeventaudit.WfEventAudit(self.getName(),
                                                          wfeventaudittypes.activityStateChanged,
                                                          self.oid)
@@ -132,11 +133,18 @@
         except TransitionNotAllowed:
             raise CannotComplete, "Transition Not Allowed"
 
-
+##    def setDataManager(self, datamgr):
+##        print "wfactivity.setdatamanager"
+##        self._DataManager = datamgr
+
+##    def clearDataManager(self):
+##        print "wfactivity.cleardatamanager"
+##        self._DataManager = None
+        
     ## Starts or activates this activity
-    def startActivity(self):
+    def startActivity(self, datamgr):
         # wfmc specification
-        print "startActivity needs more work"
+        print "startActivity is under construction"
 
         try:
             self.changeState(OPEN_RUNNING)
@@ -145,8 +153,18 @@
         except TransitionNotAllowed:
             raise CannotStart, "Transition Not Allowed"
 
-# start an automatic activity; we're not doing that yet --wvk
-#        ## egad, the GOO that these calls invoke!!!    --vwk
+        print "get the activity name"
+        activity_name = self.fields["activity"]
+        print "call the start method"
+        wfactivity_impl.startActivity(activity_name, datamgr)
+        print "method finished"
+
+
+# only here until code above includes all this stuff
+#
+#        start an automatic activity; we're not doing that yet --wvk
+#        egad, the GOO that these calls invoke!!!    --vwk
+#
 #        executor = WfActivityImplementationFact.getConcretImplementation(type, self)
 #        executor.run()
 #        self.setResult(executor.getResult())

Index: PanGalactic/pangalactic/utils/datamanager.py
diff -u PanGalactic/pangalactic/utils/datamanager.py:1.34 PanGalactic/pangalactic/utils/datamanager.py:1.35
--- PanGalactic/pangalactic/utils/datamanager.py:1.34	Thu Oct  2 15:31:23 2003
+++ PanGalactic/pangalactic/utils/datamanager.py	Mon Oct  6 14:37:10 2003
@@ -1,6 +1,6 @@
 # $Source: /repo/step_testbed/PanGalactic/pangalactic/utils/datamanager.py,v $
 
-__version__ = "$Revision: 1.34 $"[11:-2]
+__version__ = "$Revision: 1.35 $"[11:-2]
 
 import time
 import mx.DateTime
@@ -260,8 +260,8 @@
             pmms = self.server.GetPmmByProject(projectlist[0])
             #print 'items for project: %s are: %s' % (projectlist[0], data)
         except Exception, e:
-            print e
             print "no items in project"
+            print e
             return
 
         if data:
@@ -739,7 +739,6 @@
 
     def addWorkflow(self, wf_obj):
         self.localDB.Add([wf_obj])
-
 
   
     def getWfProcessTemplates(self):

Index: PanGalactic/pangalactic/utils/localdb.py
diff -u PanGalactic/pangalactic/utils/localdb.py:1.32 PanGalactic/pangalactic/utils/localdb.py:1.33
--- PanGalactic/pangalactic/utils/localdb.py:1.32	Fri Sep 26 15:47:12 2003
+++ PanGalactic/pangalactic/utils/localdb.py	Mon Oct  6 14:37:10 2003
@@ -1410,10 +1410,15 @@
         #print "localdb.SaveWfProcessInstance"
         for wfobj in wflist:
             try:
+                #print "attempt to delete wfobj.pgef_oid"
                 del self.dbroot[self.WFPROCESS][wfobj.pgef_oid]
+                #print "deleted"
             except:
+                #print "EXCEPTION"
                 pass
+                
             self.dbroot[self.WFPROCESS][wfobj.pgef_oid] = wfobj
+            #print "added", wfobj.pgef_oid
         self.Commit()
 
 
@@ -1426,10 +1431,15 @@
                 self.SaveWfProcessTemplate([wfobj])
 
             if recurse:
+                #print "recurse to subobjects"
                 for akey, avalue in wfobj.activities.items():
+                    #print "wfactivity"
                     self.SaveWfActivity([avalue])
+                    #print "saved wfactivity"
                 for tkey, tvalue in wfobj.transitionsdict.items():
+                    #print "wftransition"
                     self.SaveWfTransition([tvalue])
+                    #print "saved wftransition"
                 
 
 

From pbear at ned.gsfc.nasa.gov  Mon Oct  6 17:31:43 2003
From: pbear at ned.gsfc.nasa.gov (pbear CVS)
Date: Mon Oct  6 16:31:45 2003
Subject: [Pangalactic-commits] A bit more tweaking to wfprocess instances
Message-ID: <200310062031.h96KVhl5021123@ned.gsfc.nasa.gov>

Modified files:
PanGalactic/pangalactic/enterprise/workflow/wfactivity.py 1.11 1.12
PanGalactic/pangalactic/enterprise/workflow/wfactivity_implementation.py 1.1 1.2
PanGalactic/pangalactic/enterprise/workflow/wfexceptions.py 1.2 1.3
PanGalactic/pangalactic/enterprise/workflow/wfprocess.py 1.14 1.15

Log message:
A bit more tweaking to wfprocess instances


Index: PanGalactic/pangalactic/enterprise/workflow/wfactivity.py
diff -u PanGalactic/pangalactic/enterprise/workflow/wfactivity.py:1.11 PanGalactic/pangalactic/enterprise/workflow/wfactivity.py:1.12
--- PanGalactic/pangalactic/enterprise/workflow/wfactivity.py:1.11	Mon Oct  6 14:37:09 2003
+++ PanGalactic/pangalactic/enterprise/workflow/wfactivity.py	Mon Oct  6 16:31:42 2003
@@ -14,6 +14,7 @@
 import pangalactic.enterprise.workflow.wfeventaudit as wfeventaudit
 import pangalactic.enterprise.workflow.wfeventaudittypes as wfeventaudittypes
 
+DataManager = None
 
 class WfActivity(WfExecutionObject):
     """
@@ -120,6 +121,7 @@
     def activate(self):
         # wfmc specification
         ## make sure we aren't already running
+        #print "current_activity", self.getState()
         if self.getState() == OPEN_RUNNING:
             raise AlreadyRunning
         self.startActivity()
@@ -133,18 +135,20 @@
         except TransitionNotAllowed:
             raise CannotComplete, "Transition Not Allowed"
 
-##    def setDataManager(self, datamgr):
-##        print "wfactivity.setdatamanager"
-##        self._DataManager = datamgr
-
-##    def clearDataManager(self):
-##        print "wfactivity.cleardatamanager"
-##        self._DataManager = None
+    def setDataManager(self, datamgr):
+        #print "wfactivity.setdatamanager"
+        global DataManager
+        DataManager = datamgr
+
+    def clearDataManager(self):
+        #print "wfactivity.cleardatamanager"
+        global DataManager
+        DataManager = None
         
     ## Starts or activates this activity
-    def startActivity(self, datamgr):
+    def startActivity(self):
         # wfmc specification
-        print "startActivity is under construction"
+        #print "startActivity is under construction"
 
         try:
             self.changeState(OPEN_RUNNING)
@@ -153,11 +157,8 @@
         except TransitionNotAllowed:
             raise CannotStart, "Transition Not Allowed"
 
-        print "get the activity name"
-        activity_name = self.fields["activity"]
-        print "call the start method"
-        wfactivity_impl.startActivity(activity_name, datamgr)
-        print "method finished"
+        global DataManager
+        wfactivity_impl.startActivity(self, DataManager)
 
 
 # only here until code above includes all this stuff

Index: PanGalactic/pangalactic/enterprise/workflow/wfprocess.py
diff -u PanGalactic/pangalactic/enterprise/workflow/wfprocess.py:1.14 PanGalactic/pangalactic/enterprise/workflow/wfprocess.py:1.15
--- PanGalactic/pangalactic/enterprise/workflow/wfprocess.py:1.14	Mon Oct  6 14:37:09 2003
+++ PanGalactic/pangalactic/enterprise/workflow/wfprocess.py	Mon Oct  6 16:31:42 2003
@@ -15,6 +15,8 @@
 from pangalactic.enterprise.workflow.wfexecutionobject import WfExecutionObject
 from pangalactic.enterprise.workflow.wftransition import WfTransition
 
+DataManager = None
+
 class WfProcess(WfExecutionObject):
     """
     Any methods required by WfMC are commented as such.
@@ -79,7 +81,9 @@
         self.canstartlist = canstartlist
         self.defaultstartid = defaultstart
         self.requester = None
-
+        self.nextTransList = []
+        self.activityId = None
+        
         self._nstates = self.howManyStep()
         self._nsteps = len(self.transitionsdict)
         self._CreateDateStr = self.GetCreateDateStr()
@@ -87,7 +91,7 @@
         self._next_activity_name = ""
         self._activity_date = ""
         self._activity_due_date = ""
-        self.activityId = None
+
         self.wfdata = None
         self.wfdata_name = ""
         
@@ -129,18 +133,20 @@
         self.defaultstartid = activityid
 
 
-##    def setDataManager(self, datamgr):
-##        print "wfprocess.setdatamanager"
-##        self._DataManager = datamgr
-##        for akey, aobj in self.activities.items():
-##            aobj.setDataManager(self._DataManager)
+    def setDataManager(self, datamgr):
+        #print "wfprocess.setdatamanager"
+        global DataManager
+        DataManager = datamgr
+        for akey, aobj in self.activities.items():
+            aobj.setDataManager(DataManager)
 
         
-##    def clearDataManager(self):
-##        print "wfprocess.cleardatamanager"
-##        self._DataManager = None
-##        for akey, aobj in self.activities.items():
-##            aobj.clearDataManager()
+    def clearDataManager(self):
+        #print "wfprocess.cleardatamanager"
+        global DataManager
+        DataManager = None
+        for akey, aobj in self.activities.items():
+            aobj.clearDataManager()
 
         
     def initiate(self, wfdata, datamgr):
@@ -148,32 +154,16 @@
         Start a wfprocess instance.  Only a wfprocess instance has a wfdata object.
         """
 #        print "wfprocess.initiate", self.defaultstartid
-        self.activityId = self.defaultstartid
-#        self.setDataManager(datamgr)
         self.SetData(wfdata)
-
-        if self.activityId:
-            current_activity = self.activities[self.activityId]
-            current_activity.changeState(OPEN_NOTSTARTED)
-            self._activity_name = current_activity.getName()
-#            now = mx.DateTime.DateFromTicks(mx.DateTime.now())
-            now = mx.DateTime.DateFromTicks(wfdata.create_datetime)
-            duedate = now + mx.DateTime.RelativeDateTime(days=current_activity.getDuration())
-            self._activity_due_date = duedate
-            self._activity_due_date_str = datetimes.getDisplayDate(duedate)
-            current_activity.startActivity(datamgr)
-            self.getNextActivityName()
+        self.setDataManager(datamgr)
+        self.activityId = self.defaultstartid
+        current_activity = self.activities[self.activityId]
+        current_activity.changeState(OPEN_NOTSTARTED)
+        #print "current_activity", current_activity.getState()
+        self.startActivity(current_activity)
+        self.getNextActivityData(current_activity)
 
 
-    def getNextActivityName(self):
-        nexttranslist = self.transitions[self.activityId]
-        #print "next transitions", nexttranslist
-        if len(nexttranslist) > 0:
-            nextid = nexttranslist[0]
-            nexttransition = self.transitionsdict[nextid]
-            self._next_activity_name = self.activities[nexttransition.to_activity].getName()
-        return ""
-        
     def changeState(self, newState):
         # wfmc specification
         
@@ -305,17 +295,32 @@
         # this was synchronized in java
         if activity <> CLOSED_COMPLETED:
             raise WfException, "Activity state is not completed"
-        self.queueNext(activity) ## do we need this???
+        self.queueNext(activity)
     
 
     ## Queues the next activities for processing
     def queueNext(self, fromActivity):
-        nextTrans = self.transitions[fromActivity]
-        if len(nextTrans) > 0:
-            for trans in nextTrans:
-                toActivityid = self.transitionsdict[trans].to_activity
-                toActivity = self.activities[toActivityId]
-                self.startActivity(toActivity)
+        toActivity = self.getNextActivityData(fromActivity)
+        self.startActivity(toActivity)
+
+    ## Queues the next activities for processing
+    def getNextActivityData(self, fromActivity):
+        self.nextTransList = self.transitions[fromActivity.oid]
+        if len(self.nextTransList) > 0:
+            nextTransId = self.nextTransList[0]
+            nextTransObj = self.transitionsdict[nextTransId]
+            toActivity = self.activities[nextTransObj.to_activity]
+
+            self._activity_name = fromActivity.getName()
+            self._next_activity_name = toActivity.getName()
+
+#            now = mx.DateTime.DateFromTicks(mx.DateTime.now())
+            now = mx.DateTime.DateFromTicks(self.wfdata.create_datetime)
+            duedate = now + mx.DateTime.RelativeDateTime(days=fromActivity.getDuration())
+            self._activity_due_date = duedate
+            self._activity_due_date_str = datetimes.getDisplayDate(duedate)
+            return toActivity
+
         else:
              self.finishProcess()
         
@@ -324,6 +329,7 @@
     def startActivity(self, activity):
         try:
             activity.activate()
+            #print "current_activity", activity.getState()
             self.activityId = activity.oid
         except AlreadyRunning, e:
             raise WfException, "Activity already running"

Index: PanGalactic/pangalactic/enterprise/workflow/wfactivity_implementation.py
diff -u PanGalactic/pangalactic/enterprise/workflow/wfactivity_implementation.py:1.1 PanGalactic/pangalactic/enterprise/workflow/wfactivity_implementation.py:1.2
--- PanGalactic/pangalactic/enterprise/workflow/wfactivity_implementation.py:1.1	Mon Oct  6 14:37:09 2003
+++ PanGalactic/pangalactic/enterprise/workflow/wfactivity_implementation.py	Mon Oct  6 16:31:42 2003
@@ -9,8 +9,10 @@
 approved_complete  = None
 released_complete  = None
 
-def startActivity(activityName, datamanager):
-    print "wfactivity_impl.startActivity", activityName, datamanager
+def startActivity(activity, datamanager):
+    print "wfactivity_impl.startActivity"
+    activityName = activity.fields["activity"]
+    #print "activityName", activityName
     if activityName == "initiated":
         initiated_impl(datamanager)
     elif activityName == "draft":

Index: PanGalactic/pangalactic/enterprise/workflow/wfexceptions.py
diff -u PanGalactic/pangalactic/enterprise/workflow/wfexceptions.py:1.2 PanGalactic/pangalactic/enterprise/workflow/wfexceptions.py:1.3
--- PanGalactic/pangalactic/enterprise/workflow/wfexceptions.py:1.2	Thu Jul  3 16:34:27 2003
+++ PanGalactic/pangalactic/enterprise/workflow/wfexceptions.py	Mon Oct  6 16:31:42 2003
@@ -61,6 +61,10 @@
     def __init__(self, arg = None):
         WfException.__init__(self, arg)
 
+class CannotStart(WfException):
+    def __init__(self, arg = None):
+        WfException.__init__(self, arg)
+
 class CannotStop(WfException):
     def __init__(self, arg = None):
         WfException.__init__(self, arg)

From pbear at ned.gsfc.nasa.gov  Mon Oct  6 18:09:35 2003
From: pbear at ned.gsfc.nasa.gov (pbear CVS)
Date: Mon Oct  6 17:09:36 2003
Subject: [Pangalactic-commits] added some flavouring to implementations of
	current wfprocess activities
Message-ID: <200310062109.h96L9Zpw022008@ned.gsfc.nasa.gov>

Modified files:
PanGalactic/pangalactic/enterprise/workflow/wfactivity.py 1.12 1.13
PanGalactic/pangalactic/enterprise/workflow/wfactivity_implementation.py 1.2 1.3
PanGalactic/pangalactic/enterprise/workflow/wfprocess.py 1.15 1.16
PanGalactic/pangalactic/utils/datamanager.py 1.35 1.36

Log message:
added some flavouring to implementations of current wfprocess activities


Index: PanGalactic/pangalactic/enterprise/workflow/wfactivity_implementation.py
diff -u PanGalactic/pangalactic/enterprise/workflow/wfactivity_implementation.py:1.2 PanGalactic/pangalactic/enterprise/workflow/wfactivity_implementation.py:1.3
--- PanGalactic/pangalactic/enterprise/workflow/wfactivity_implementation.py:1.2	Mon Oct  6 16:31:42 2003
+++ PanGalactic/pangalactic/enterprise/workflow/wfactivity_implementation.py	Mon Oct  6 17:09:33 2003
@@ -2,7 +2,7 @@
 The implementations of each wfactivity object (L{WfActivity <pangalactic.enterprise.workflow.wfactivity>}).
 """
 
-from pangalactic.utils.datamanager import *
+from pangalactic.utils.datamanager import * #initiatedActivity, draftActivity, approvedActivity, releasedActivity
 
 initiated_complete = None
 draft_complete     = None
@@ -12,34 +12,38 @@
 def startActivity(activity, datamanager):
     print "wfactivity_impl.startActivity"
     activityName = activity.fields["activity"]
-    #print "activityName", activityName
-    if activityName == "initiated":
-        initiated_impl(datamanager)
-    elif activityName == "draft":
-        draft_impl(datamanager)
-    elif activityName == "approved":
-        approved_impl(datamanager)
-    elif activityName == "released":
-        released_impl(datamanager)
+    print "activityName", activityName
+    if activityName == "Initiated":
+        initiated_impl(activity, datamanager)
+    elif activityName == "Draft":
+        draft_impl(activity, datamanager)
+    elif activityName == "Approved":
+        approved_impl(activity, datamanager)
+    elif activityName == "Released":
+        released_impl(activity, datamanager)
 
     
-def initiated_impl(datamanager):
+def initiated_impl(activity, datamanager):
     print "wfactivity_impl.initiated"
+    datamanager.initiatedActivity(activity)
     initiated_complete = 1
     
 
-def draft_impl(datamanager):
+def draft_impl(activity, datamanager):
     print "wfactivity_impl.draft"
+    datamanager.draftActivity(activity)
     draft_complete = 1
 
 
-def approved_impl(datamanager):
+def approved_impl(activity, datamanager):
     print "wfactivity_impl.approved"
+    datamanager.approvedActivity(activity)
     approved_complete = 1
 
 
-def released_impl(datamanager):
+def released_impl(activity, datamanager):
     print "wfactivity_impl.released"
+    datamanager.releasedActivity(activity)
     released_complete = 1
 
 

Index: PanGalactic/pangalactic/enterprise/workflow/wfactivity.py
diff -u PanGalactic/pangalactic/enterprise/workflow/wfactivity.py:1.12 PanGalactic/pangalactic/enterprise/workflow/wfactivity.py:1.13
--- PanGalactic/pangalactic/enterprise/workflow/wfactivity.py:1.12	Mon Oct  6 16:31:42 2003
+++ PanGalactic/pangalactic/enterprise/workflow/wfactivity.py	Mon Oct  6 17:09:33 2003
@@ -121,7 +121,7 @@
     def activate(self):
         # wfmc specification
         ## make sure we aren't already running
-        #print "current_activity", self.getState()
+        print "wfactivity.activate"
         if self.getState() == OPEN_RUNNING:
             raise AlreadyRunning
         self.startActivity()
@@ -148,7 +148,7 @@
     ## Starts or activates this activity
     def startActivity(self):
         # wfmc specification
-        #print "startActivity is under construction"
+        print "wfactivity.startActivity"
 
         try:
             self.changeState(OPEN_RUNNING)

Index: PanGalactic/pangalactic/enterprise/workflow/wfprocess.py
diff -u PanGalactic/pangalactic/enterprise/workflow/wfprocess.py:1.15 PanGalactic/pangalactic/enterprise/workflow/wfprocess.py:1.16
--- PanGalactic/pangalactic/enterprise/workflow/wfprocess.py:1.15	Mon Oct  6 16:31:42 2003
+++ PanGalactic/pangalactic/enterprise/workflow/wfprocess.py	Mon Oct  6 17:09:33 2003
@@ -153,15 +153,14 @@
         """
         Start a wfprocess instance.  Only a wfprocess instance has a wfdata object.
         """
-#        print "wfprocess.initiate", self.defaultstartid
+        print "wfprocess.initiate", self.defaultstartid
         self.SetData(wfdata)
         self.setDataManager(datamgr)
         self.activityId = self.defaultstartid
         current_activity = self.activities[self.activityId]
         current_activity.changeState(OPEN_NOTSTARTED)
         #print "current_activity", current_activity.getState()
-        self.startActivity(current_activity)
-        self.getNextActivityData(current_activity)
+        self.start()
 
 
     def changeState(self, newState):
@@ -286,14 +285,14 @@
             raise AlreadyRunning, "Process is already running"
 
         startValue = self.activities[self.defaultstartid]
-        self.startValue.changeState(OPEN_RUNNING)
         self.startActivity(startValue)
+        self.getNextActivityData(startValue)
     
     
     def activityComplete(self, activity): 
         # wfmc specification
         # this was synchronized in java
-        if activity <> CLOSED_COMPLETED:
+        if activity.getState() <> CLOSED_COMPLETED:
             raise WfException, "Activity state is not completed"
         self.queueNext(activity)
     

Index: PanGalactic/pangalactic/utils/datamanager.py
diff -u PanGalactic/pangalactic/utils/datamanager.py:1.35 PanGalactic/pangalactic/utils/datamanager.py:1.36
--- PanGalactic/pangalactic/utils/datamanager.py:1.35	Mon Oct  6 14:37:10 2003
+++ PanGalactic/pangalactic/utils/datamanager.py	Mon Oct  6 17:09:33 2003
@@ -1,6 +1,6 @@
 # $Source: /repo/step_testbed/PanGalactic/pangalactic/utils/datamanager.py,v $
 
-__version__ = "$Revision: 1.35 $"[11:-2]
+__version__ = "$Revision: 1.36 $"[11:-2]
 
 import time
 import mx.DateTime
@@ -757,7 +757,7 @@
     def commit(self, unsavedobjs, upload = True):
         #tbd - need to actually pass upload flag or determine it based on document interfaces
 
-        #print "datamanager.commit"
+        print "datamanager.commit"
 
         if self.user._loggedin:
             if len(unsavedobjs) > 0:
@@ -865,3 +865,21 @@
         self.refresh = False
 
 
+    def initiatedActivity(self, activity):
+        print "datamanager.initiated", activity.getName()
+        print "notify the ptbs that wfprocess has been initiated"
+
+
+    def draftActivity(self, activity):
+        print "datamanager.draft", activity.getName()
+        print "notify the ptbs that wfprocess is now draft"
+
+
+    def approvedActivity(self, activity):
+        print "datamanager.approved", activity.getName()
+        print "notify the ptbs that wfprocess is at approval stage"
+
+
+    def releasedActivity(self, activity):
+        print "datamanager.released", activity.getName()
+        print "notify the ptbs that wfprocess is at approval stage"

From waterbug at ned.gsfc.nasa.gov  Mon Oct  6 18:16:33 2003
From: waterbug at ned.gsfc.nasa.gov (waterbug CVS)
Date: Mon Oct  6 17:16:35 2003
Subject: [Pangalactic-commits] Some test updates.
Message-ID: <200310062116.h96LGXg4022334@ned.gsfc.nasa.gov>

Modified files:
PanGalactic/pangalactic/test/test_db_getByRowKey.py None 1.1
PanGalactic/pangalactic/test/test_factory_extract2Record.py None 1.1
PanGalactic/pangalactic/test/test_factory_record2RowKey.py None 1.1
PanGalactic/pangalactic/test/test_pger_getRefdRowKeys.py None 1.1
PanGalactic/pangalactic/test/test_pger_getResultSets.py None 1.1
PanGalactic/pangalactic/test/IDTEST 1.16 1.17
PanGalactic/pangalactic/test/README 1.20 1.21
PanGalactic/pangalactic/test/test_db_addrows.py 1.4 1.5
PanGalactic/pangalactic/test/test_pger_addExtracts.py 1.1 1.2
PanGalactic/pangalactic/test/test_sql.py 1.9 1.10
PanGalactic/pangalactic/test/test_xmlrpc_addobjects.py 1.8 1.9
PanGalactic/pangalactic/test/test_xmlrpc_getobjects.py 1.8 1.9
PanGalactic/pangalactic/test/ut_repofactory.py 1.2 1.3
PanGalactic/pangalactic/test/test_factory_extracts2Records.py 1.1 None
PanGalactic/pangalactic/test/test_factory_records2RowKeys.py 1.1 None
PanGalactic/pangalactic/test/test_pger_getRefRowKeys.py 1.1 None
PanGalactic/pangalactic/test/test_pger_getresultsets.py 1.9 None

Log message:
Some test updates.


Index: PanGalactic/pangalactic/test/test_xmlrpc_getobjects.py
diff -u PanGalactic/pangalactic/test/test_xmlrpc_getobjects.py:1.8 PanGalactic/pangalactic/test/test_xmlrpc_getobjects.py:1.9
--- PanGalactic/pangalactic/test/test_xmlrpc_getobjects.py:1.8	Sun Oct  5 05:39:59 2003
+++ PanGalactic/pangalactic/test/test_xmlrpc_getobjects.py	Mon Oct  6 17:16:32 2003
@@ -1,4 +1,4 @@
-# $Id: test_xmlrpc_getobjects.py,v 1.8 2003/10/05 09:39:59 waterbug Exp $
+# $Id: test_xmlrpc_getobjects.py,v 1.9 2003/10/06 21:16:32 waterbug Exp $
 
 """
 Functional test for pangalactic.repo.xmlrpc.PgerXmlrpcService
@@ -25,10 +25,10 @@
     print "===================================="
     pprint(stuff)
     print "===================================="
-    print "\n***  Rebuilt objects:"
+    print "\n***  Remembered objects:"
     olist = []
     for x in stuff:
-        o = pgr._factory.rebuild(x)
+        o = pgr._factory.remember(x)
         olist.append(o)
     print "%s %s(s) found" % (len(olist), typename)
     if olist:
@@ -49,7 +49,7 @@
 pgr = Pger(db)
 xmlsrv = PgerXmlrpcService(pgr)
 
-res = xmlsrv.xmlrpc_getObjects(typename, 1, 0, ['name', 'Mr. Fusion'])
+res = xmlsrv.xmlrpc_getObjects(typename, 1, 0, [['name', 'Mr. Fusion']])
 res.addCallbacks(success, failure)
 
 reactor.run()

Index: PanGalactic/pangalactic/test/test_xmlrpc_addobjects.py
diff -u PanGalactic/pangalactic/test/test_xmlrpc_addobjects.py:1.8 PanGalactic/pangalactic/test/test_xmlrpc_addobjects.py:1.9
--- PanGalactic/pangalactic/test/test_xmlrpc_addobjects.py:1.8	Wed Sep 24 11:07:00 2003
+++ PanGalactic/pangalactic/test/test_xmlrpc_addobjects.py	Mon Oct  6 17:16:32 2003
@@ -1,4 +1,4 @@
-# $Id: test_xmlrpc_addobjects.py,v 1.8 2003/09/24 15:07:00 waterbug Exp $
+# $Id: test_xmlrpc_addobjects.py,v 1.9 2003/10/06 21:16:32 waterbug Exp $
 
 """
 Functional test for pangalactic.repo.xmlrpc.xmlrpc_addProductMaster
@@ -8,40 +8,64 @@
   - reports oid of the new Product Master
 """
 
-import time, os
+from pprint import pprint
 from twisted.internet import reactor
+from twisted.enterprise import adbapi
+from pangalactic.utils import oid
 from pangalactic.repo.db import PgerDb
 from pangalactic.repo.pger import Pger
 from pangalactic.repo.xmlrpc import PgerXmlrpcService
 from pangalactic.enterprise.productmaster import ProductMaster as PM
 from pangalactic.enterprise.productversion import ProductVersion as PV
+from pangalactic.enterprise.project import Project
 
-db = PgerDb()
-pgr = Pger(db)
-x = PgerXmlrpcService(pgr)
-
-def getTestID():
-    f = open('IDTEST')
-    savedid = f.read()
-    testid = str(int(savedid) + 1)
-    f.close()
-    f = open('IDTEST', 'w')
-    f.write(testid)
-    f.close()
-    return testid
-
-pmtestid = getTestID()
-pmtestname = 'Mr. PM Test-Xmlrpc.addObjects()-' + pmtestid
-pm = PM(id=pmtestid, id_context='TEST', name=pmtestname,
-        project_id='TEST', project_id_context='TEST')
-epmlist = [pgr._factory.extract(pm)]
-dt = x.xmlrpc_addObjects(epmlist)
-print 'pm.id = %s' % pm.id
-print 'pm.id_context = %s' % pm.id_context
-print 'pm.project_id = %s' % pm.project_id
-print 'pm.project_id_context = %s' % pm.project_id_context
-print 'ProductMaster dt = %s' % dt
+pgrdb = PgerDb()
+PGER = Pger(pgrdb)
+xmlrpcsrv = PgerXmlrpcService(PGER)
+
+f = open('IDTEST')
+savedid = f.read()
+testoid1 = oid.generate('test')
+testoid2 = oid.generate('test')
+
+testid = str(int(savedid) + 1)
+f.close()
+f = open('IDTEST', 'w')
+f.write(testid)
+f.close()
+
+projid = 'MTPaE' + testid
+projname = 'MTPaE' + testid + ' Project'
+pmid = 'MTPaE-' + testid
+pmname = 'MTPaE-' + testid + ' Model Mr. Dynamo'
+pvname = 'MTPaE-' + testid + ' Version A'
+
+# create test objects
+p = Project(id=projid, id_context='TEST', name=projname)
+p.popTestData()
+pm = PM(id=pmid, id_context='TEST', name=pmname, _project=p)
+pm.popTestData()
+pv = PV(_of_master=pm, id='A', name=pvname)
+pv.popTestData()
+
+extract = PGER._factory.extract
+pe  = extract(p)
+pme = extract(pm)
+pve = extract(pv)
+
+extracts = [pe, pme, pve]
+
+def success(res):
+    pprint(res)
+    reactor.stop()
+
+def failure(error):
+    print error
+    reactor.stop()
 
-reactor.run() # start the main loop
-print 'stopped.'
+res = xmlrpcsrv.xmlrpc_addObjects(extracts)
+res.addCallbacks(success, failure)
+
+reactor.run()
+print '- end of test -'
 

Index: PanGalactic/pangalactic/test/README
diff -u PanGalactic/pangalactic/test/README:1.20 PanGalactic/pangalactic/test/README:1.21
--- PanGalactic/pangalactic/test/README:1.20	Sun Oct  5 05:39:59 2003
+++ PanGalactic/pangalactic/test/README	Mon Oct  6 17:16:31 2003
@@ -1,4 +1,4 @@
-$Id: README,v 1.20 2003/10/05 09:39:59 waterbug Exp $
+$Id: README,v 1.21 2003/10/06 21:16:31 waterbug Exp $
 
 Pan Galactic Engineering Repository Test Scripts
 ================================================
@@ -20,7 +20,7 @@
         test_factory_test.py
         test_factory_sync.py
         test_factory_extractall.py
-        test_factory_extracts2Records.py
+        test_factory_extract2Record.py
         test_factory_makeObjects.py
         test_factory_unmakeObject.py
                  |

Index: PanGalactic/pangalactic/test/IDTEST
diff -u PanGalactic/pangalactic/test/IDTEST:1.16 PanGalactic/pangalactic/test/IDTEST:1.17
--- PanGalactic/pangalactic/test/IDTEST:1.16	Sun Oct  5 17:24:50 2003
+++ PanGalactic/pangalactic/test/IDTEST	Mon Oct  6 17:16:31 2003
@@ -1 +1 @@
-228
\ No newline at end of file
+269
\ No newline at end of file

Index: PanGalactic/pangalactic/test/ut_repofactory.py
diff -u PanGalactic/pangalactic/test/ut_repofactory.py:1.2 PanGalactic/pangalactic/test/ut_repofactory.py:1.3
--- PanGalactic/pangalactic/test/ut_repofactory.py:1.2	Sat Oct  4 00:26:08 2003
+++ PanGalactic/pangalactic/test/ut_repofactory.py	Mon Oct  6 17:16:32 2003
@@ -1,4 +1,4 @@
-# $Id: ut_repofactory.py,v 1.2 2003/10/04 04:26:08 waterbug Exp $
+# $Id: ut_repofactory.py,v 1.3 2003/10/06 21:16:32 waterbug Exp $
 
 """
 Unit tests for pangalactic.repo.factory module
@@ -17,7 +17,7 @@
         self.factory = POF(self.registry)
 
 
-    def test_1_factory_extracts2Records(self):
+    def test_1_factory_extract2Record(self):
         """CASE:  PgerObjectFactory self-test"""
         input = [['foo.bar.baz.Project', 
                     {'id_context': 'TEST',
@@ -27,7 +27,7 @@
                     {'id_context': 'TEST',
                      'id': 'H2G2',
                      'name': 'HitchHikers Guide'}]]
-        output = self.factory.extracts2Records(input)
+        output = self.factory.extract2Record(input)
         self.assertEquals(expected, output)
 
 
@@ -80,7 +80,7 @@
 #     print o
 # 
 # 
-# # $Id: ut_repofactory.py,v 1.2 2003/10/04 04:26:08 waterbug Exp $
+# # $Id: ut_repofactory.py,v 1.3 2003/10/06 21:16:32 waterbug Exp $
 # 
 # """
 # Functional test for pangalactic.repo.db module

Index: PanGalactic/pangalactic/test/test_db_addrows.py
diff -u PanGalactic/pangalactic/test/test_db_addrows.py:1.4 PanGalactic/pangalactic/test/test_db_addrows.py:1.5
--- PanGalactic/pangalactic/test/test_db_addrows.py:1.4	Sat Oct  4 19:25:44 2003
+++ PanGalactic/pangalactic/test/test_db_addrows.py	Mon Oct  6 17:16:31 2003
@@ -1,4 +1,4 @@
-# $Id: test_db_addrows.py,v 1.4 2003/10/04 23:25:44 waterbug Exp $
+# $Id: test_db_addrows.py,v 1.5 2003/10/06 21:16:31 waterbug Exp $
 
 """
 Test for inserting a row using pangalactic.repo.db module
@@ -19,7 +19,7 @@
 
 reg = POR()
 fac = POF(reg)
-db = PgerDb()
+pgerdb = PgerDb()
 
 f = open('IDTEST')
 savedid = f.read()
@@ -51,7 +51,7 @@
 pve = fac.extract(pv)
 
 extracts = [pe, pme, pve]
-recs = fac.extracts2Records(extracts)
+recs = [fac.extract2Record(e) for e in extracts]
 
 def success(stuff):
     pprint(stuff)
@@ -61,14 +61,13 @@
     print error
     reactor.stop()
 
-def ifNone(x):
-    if not x:
-        res = db.doPgerdbQuery('pgef_object', 1,
-                               ('name', 'MD'))
-        res.addCallbacks(success, failure)
+def verify(x):
+    res = pgerdb.doPgerdbQuery('pgef_object', 1,
+                           ('name', 'MD'))
+    res.addCallbacks(success, failure)
 
-out = db.addRows(recs)
-out.addCallback(ifNone)
+out = pgerdb.addRows(recs)
+out.addCallback(verify)
 
 reactor.run()
 

Index: PanGalactic/pangalactic/test/test_pger_addExtracts.py
diff -u PanGalactic/pangalactic/test/test_pger_addExtracts.py:1.1 PanGalactic/pangalactic/test/test_pger_addExtracts.py:1.2
--- PanGalactic/pangalactic/test/test_pger_addExtracts.py:1.1	Sat Oct  4 19:25:44 2003
+++ PanGalactic/pangalactic/test/test_pger_addExtracts.py	Mon Oct  6 17:16:32 2003
@@ -1,4 +1,4 @@
-# $Id: test_pger_addExtracts.py,v 1.1 2003/10/04 23:25:44 waterbug Exp $
+# $Id: test_pger_addExtracts.py,v 1.2 2003/10/06 21:16:32 waterbug Exp $
 
 """
 Functional test for pangalactic.repo.Pger.addExtracts()
@@ -9,54 +9,62 @@
     pger_mod_datetime for all committed data)
 """
 
-import time, os
+from pprint import pprint
 from twisted.internet import reactor
 from twisted.enterprise import adbapi
+from pangalactic.utils import oid
 from pangalactic.repo.db import PgerDb
 from pangalactic.repo.pger import Pger
-from pangalactic.utils import oid
-from pangalactic.enterprise.productmaster import ProductMaster
+from pangalactic.enterprise.productmaster import ProductMaster as PM
+from pangalactic.enterprise.productversion import ProductVersion as PV
 from pangalactic.enterprise.project import Project
 
-db = PgerDb()
-pgr = Pger(db)
+pgrdb = PgerDb()
+PGER = Pger(pgrdb)
 
-f = open(os.getcwd() + '/IDTEST')
-nextid = f.read()
-newoid = oid.generate('test')
+f = open('IDTEST')
+savedid = f.read()
+testoid1 = oid.generate('test')
+testoid2 = oid.generate('test')
 
-nextid = str(int(nextid) + 1)
+testid = str(int(savedid) + 1)
 f.close()
-f = open(os.getcwd() + '/IDTEST', 'w')
-f.write(nextid)
+f = open('IDTEST', 'w')
+f.write(testid)
 f.close()
 
-testname = 'Mr. Test-Pger-addExtracts()-' + nextid
-proj = Project(id='TEST', id_context='TEST')
-pm = ProductMaster(name=testname, id=nextid, 
-                   id_context='TEST', project=proj,
-                   owner='admin',
-                   owner_context='PGER',
-                   creator='admin',
-                   creator_context='PGER',
-                   modifier='admin',
-                   modifier_context='PGER',
-                   pger_owner='admin',
-                   pger_owner_context='PGER',
-                   pger_creator='admin',
-                   pger_creator_context='PGER',
-                   pger_modifier='admin',
-                   pger_modifier_context='PGER'
-                   )
-print 'ProductMaster:'
-print pm
-ext = pgr._factory.extract(pm)
-print 'extract: %s' % ext
-elist = [ext]
-dts = pgr.addExtracts(elist)
-print 'dts = %s' % dts
-
-reactor.run() # start the main loop
-time.sleep(1)
-reactor.stop()
+projid = 'MTPaE' + testid
+projname = 'MTPaE' + testid + ' Project'
+pmid = 'MTPaE-' + testid
+pmname = 'MTPaE-' + testid + ' Model Mr. Dynamo'
+pvname = 'MTPaE-' + testid + ' Version A'
+
+# create test objects
+p = Project(id=projid, id_context='TEST', name=projname)
+p.popTestData()
+pm = PM(id=pmid, id_context='TEST', name=pmname, _project=p)
+pm.popTestData()
+pv = PV(_of_master=pm, id='A', name=pvname)
+pv.popTestData()
+
+extract = PGER._factory.extract
+pe  = extract(p)
+pme = extract(pm)
+pve = extract(pv)
+
+extracts = [pe, pme, pve]
+
+def success(result):
+    for defres in result:
+        defres.addCallback(lambda x: pprint(x))
+    reactor.stop()
+
+def failure(error):
+    print error
+    reactor.stop()
+
+res = PGER.addExtracts(extracts)
+res.addCallbacks(success, failure)
+
+reactor.run()
 

Index: PanGalactic/pangalactic/test/test_sql.py
diff -u PanGalactic/pangalactic/test/test_sql.py:1.9 PanGalactic/pangalactic/test/test_sql.py:1.10
--- PanGalactic/pangalactic/test/test_sql.py:1.9	Mon Oct  6 00:42:16 2003
+++ PanGalactic/pangalactic/test/test_sql.py	Mon Oct  6 17:16:32 2003
@@ -1,4 +1,4 @@
-# $Id: test_sql.py,v 1.9 2003/10/06 04:42:16 waterbug Exp $
+# $Id: test_sql.py,v 1.10 2003/10/06 21:16:32 waterbug Exp $
 
 """
 Functional tests for pangalactic.utils.sql module
@@ -7,7 +7,7 @@
 from pprint import pprint
 from pyPgSQL import PgSQL
 from pangalactic.utils.sql import buildSelect
-from pangalactic.utils.sql import buildSelectFromRowKeys
+from pangalactic.utils.sql import buildSelectFromRowKey
 from pangalactic.utils.sql import buildInsert
 from pangalactic.utils import oid
 from pangalactic.enterprise.productmaster import ProductMaster as PM
@@ -148,10 +148,12 @@
 pve = fac.extract(pv)
 
 extracts = [pe, pme, pve]
-recs = fac.extracts2Records(extracts)
-keys = fac.records2RowKeys(recs)
-cmd = buildSelectFromRowKeys(keys)
-print 'cmd is:'
-pprint(cmd)
+recs = [fac.extract2Record(e) for e in extracts]
+rowkeys = [fac.record2RowKey(rec) for rec in recs]
+for rk in rowkeys:
+    cmd = buildSelectFromRowKey(rk)
+    print '  ---------------------------------'
+    print '  cmd for %s is:\n  ' % rk[0]
+    pprint(cmd)
 print '==================================='
 

From pbear at ned.gsfc.nasa.gov  Mon Oct  6 18:28:31 2003
From: pbear at ned.gsfc.nasa.gov (pbear CVS)
Date: Mon Oct  6 17:28:33 2003
Subject: [Pangalactic-commits] remove datamanager import from
	wfactivity_implementation
Message-ID: <200310062128.h96LSVJB022590@ned.gsfc.nasa.gov>

Modified files:
PanGalactic/pangalactic/enterprise/workflow/wfactivity_implementation.py 1.3 1.4

Log message:
remove datamanager import from wfactivity_implementation


Index: PanGalactic/pangalactic/enterprise/workflow/wfactivity_implementation.py
diff -u PanGalactic/pangalactic/enterprise/workflow/wfactivity_implementation.py:1.3 PanGalactic/pangalactic/enterprise/workflow/wfactivity_implementation.py:1.4
--- PanGalactic/pangalactic/enterprise/workflow/wfactivity_implementation.py:1.3	Mon Oct  6 17:09:33 2003
+++ PanGalactic/pangalactic/enterprise/workflow/wfactivity_implementation.py	Mon Oct  6 17:28:30 2003
@@ -2,7 +2,7 @@
 The implementations of each wfactivity object (L{WfActivity <pangalactic.enterprise.workflow.wfactivity>}).
 """
 
-from pangalactic.utils.datamanager import * #initiatedActivity, draftActivity, approvedActivity, releasedActivity
+#from pangalactic.utils.datamanager import initiatedActivity, draftActivity, approvedActivity, releasedActivity
 
 initiated_complete = None
 draft_complete     = None

From pbear at ned.gsfc.nasa.gov  Tue Oct  7 11:53:50 2003
From: pbear at ned.gsfc.nasa.gov (pbear CVS)
Date: Tue Oct  7 10:53:52 2003
Subject: [Pangalactic-commits] added new workflow template option;
	fixed rclick menu on template grid;
	wizard now has dropdown for workflow activity names
Message-ID: <200310071453.h97Ero38031580@ned.gsfc.nasa.gov>

Modified files:
PanGalactic/pangalactic/enterprise/workflow/wfactivity.py 1.13 1.14
PanGalactic/pangalactic/enterprise/workflow/wfactivity_implementation.py 1.4 1.5
PanGalactic/pangalactic/enterprise/workflow/wfdatatable.py 1.6 1.7
PanGalactic/pangalactic/enterprise/workflow/wffactory.py 1.6 1.7
PanGalactic/pangalactic/enterprise/workflow/wfprocess.py 1.16 1.17
PanGalactic/pangalactic/enterprise/workflow/wfprocessoverview.py 1.15 1.16
PanGalactic/pangalactic/enterprise/workflow/workflow_wizard.py 1.17 1.18
PanGalactic/pangalactic/utils/datamanager.py 1.36 1.37

Log message:
added new workflow template option; fixed rclick menu on template grid; wizard now has dropdown for workflow activity names


Index: PanGalactic/pangalactic/enterprise/workflow/wfprocessoverview.py
diff -u PanGalactic/pangalactic/enterprise/workflow/wfprocessoverview.py:1.15 PanGalactic/pangalactic/enterprise/workflow/wfprocessoverview.py:1.16
--- PanGalactic/pangalactic/enterprise/workflow/wfprocessoverview.py:1.15	Mon Oct  6 14:37:09 2003
+++ PanGalactic/pangalactic/enterprise/workflow/wfprocessoverview.py	Tue Oct  7 10:53:48 2003
@@ -169,7 +169,7 @@
         dlg.Destroy()
 
 
-    def OnWorkflowWizard(self, event):
+    def OnWorkflowWizard(self, event = None):
         #print "CreateWorkflow"
         tmpsize = wxSize(750, 600)
         WizardFrame = toolframe.toolFrame(self, -1, "Workflow Wizard", wxDefaultPosition, tmpsize)
@@ -265,11 +265,6 @@
     def OnWorkflowView(self, event):
         # popup the viewer, initialized with the selected workflow from the grid
         #print "ViewWorkflow"
-
-#        actinfo = [("Activity", 100, "activity"),
-#                   ("Time Frame\n(days)", 100, "duration"),
-#                   ("Description", 400, "description")]
-#        transinfo = [("From", 200, "to"), ("To", 200, "to")]
 
         tmpsize = wxSize(750, 600)
         ViewerFrame = toolframe.toolFrame(self, -1, "Workflow Viewer", wxDefaultPosition, tmpsize)

Index: PanGalactic/pangalactic/enterprise/workflow/wfactivity.py
diff -u PanGalactic/pangalactic/enterprise/workflow/wfactivity.py:1.13 PanGalactic/pangalactic/enterprise/workflow/wfactivity.py:1.14
--- PanGalactic/pangalactic/enterprise/workflow/wfactivity.py:1.13	Mon Oct  6 17:09:33 2003
+++ PanGalactic/pangalactic/enterprise/workflow/wfactivity.py	Tue Oct  7 10:53:48 2003
@@ -121,7 +121,7 @@
     def activate(self):
         # wfmc specification
         ## make sure we aren't already running
-        print "wfactivity.activate"
+        #print "wfactivity.activate"
         if self.getState() == OPEN_RUNNING:
             raise AlreadyRunning
         self.startActivity()
@@ -148,7 +148,7 @@
     ## Starts or activates this activity
     def startActivity(self):
         # wfmc specification
-        print "wfactivity.startActivity"
+        #print "wfactivity.startActivity"
 
         try:
             self.changeState(OPEN_RUNNING)

Index: PanGalactic/pangalactic/enterprise/workflow/wfprocess.py
diff -u PanGalactic/pangalactic/enterprise/workflow/wfprocess.py:1.16 PanGalactic/pangalactic/enterprise/workflow/wfprocess.py:1.17
--- PanGalactic/pangalactic/enterprise/workflow/wfprocess.py:1.16	Mon Oct  6 17:09:33 2003
+++ PanGalactic/pangalactic/enterprise/workflow/wfprocess.py	Tue Oct  7 10:53:48 2003
@@ -91,6 +91,7 @@
         self._next_activity_name = ""
         self._activity_date = ""
         self._activity_due_date = ""
+        self._activity_due_date_str = ""
 
         self.wfdata = None
         self.wfdata_name = ""
@@ -153,7 +154,7 @@
         """
         Start a wfprocess instance.  Only a wfprocess instance has a wfdata object.
         """
-        print "wfprocess.initiate", self.defaultstartid
+        #print "wfprocess.initiate", self.defaultstartid
         self.SetData(wfdata)
         self.setDataManager(datamgr)
         self.activityId = self.defaultstartid

Index: PanGalactic/pangalactic/enterprise/workflow/wfactivity_implementation.py
diff -u PanGalactic/pangalactic/enterprise/workflow/wfactivity_implementation.py:1.4 PanGalactic/pangalactic/enterprise/workflow/wfactivity_implementation.py:1.5
--- PanGalactic/pangalactic/enterprise/workflow/wfactivity_implementation.py:1.4	Mon Oct  6 17:28:30 2003
+++ PanGalactic/pangalactic/enterprise/workflow/wfactivity_implementation.py	Tue Oct  7 10:53:48 2003
@@ -2,7 +2,8 @@
 The implementations of each wfactivity object (L{WfActivity <pangalactic.enterprise.workflow.wfactivity>}).
 """
 
-#from pangalactic.utils.datamanager import initiatedActivity, draftActivity, approvedActivity, releasedActivity
+# do not directly import initiatedActivity, draftActivity, approvedActivity, releasedActivity from DataManager
+# it would lead to a compile-time circular dependency.  ick.
 
 initiated_complete = None
 draft_complete     = None
@@ -10,9 +11,9 @@
 released_complete  = None
 
 def startActivity(activity, datamanager):
-    print "wfactivity_impl.startActivity"
+    #print "wfactivity_impl.startActivity"
     activityName = activity.fields["activity"]
-    print "activityName", activityName
+    #print "activityName", activityName
     if activityName == "Initiated":
         initiated_impl(activity, datamanager)
     elif activityName == "Draft":
@@ -24,32 +25,32 @@
 
     
 def initiated_impl(activity, datamanager):
-    print "wfactivity_impl.initiated"
+    #print "wfactivity_impl.initiated"
     datamanager.initiatedActivity(activity)
     initiated_complete = 1
     
 
 def draft_impl(activity, datamanager):
-    print "wfactivity_impl.draft"
+    #print "wfactivity_impl.draft"
     datamanager.draftActivity(activity)
     draft_complete = 1
 
 
 def approved_impl(activity, datamanager):
-    print "wfactivity_impl.approved"
+    #print "wfactivity_impl.approved"
     datamanager.approvedActivity(activity)
     approved_complete = 1
 
 
 def released_impl(activity, datamanager):
-    print "wfactivity_impl.released"
+    #print "wfactivity_impl.released"
     datamanager.releasedActivity(activity)
     released_complete = 1
 
 
 def isComplete(activityName):
     result = eval(activityName + "_complete")
-    print result
+    print "wfactivity_imple.isComplete", result
     return result
 
 

Index: PanGalactic/pangalactic/enterprise/workflow/wfdatatable.py
diff -u PanGalactic/pangalactic/enterprise/workflow/wfdatatable.py:1.6 PanGalactic/pangalactic/enterprise/workflow/wfdatatable.py:1.7
--- PanGalactic/pangalactic/enterprise/workflow/wfdatatable.py:1.6	Thu Sep  4 16:04:25 2003
+++ PanGalactic/pangalactic/enterprise/workflow/wfdatatable.py	Tue Oct  7 10:53:48 2003
@@ -33,7 +33,6 @@
         # self.display_mapping = []  ## list of tuples : (attribute name, column label), 1 per column
         self._datadict = {}
         self._UseDefaultMapping = false
-#        print "wfdatatable.display_mapping", self.display_mapping
 
 
     def SetDefaultMapping(self):

Index: PanGalactic/pangalactic/enterprise/workflow/wffactory.py
diff -u PanGalactic/pangalactic/enterprise/workflow/wffactory.py:1.6 PanGalactic/pangalactic/enterprise/workflow/wffactory.py:1.7
--- PanGalactic/pangalactic/enterprise/workflow/wffactory.py:1.6	Thu Oct  2 15:31:23 2003
+++ PanGalactic/pangalactic/enterprise/workflow/wffactory.py	Tue Oct  7 10:53:48 2003
@@ -10,10 +10,18 @@
 
 DEFAULT_WORKFLOW = ("WF0",
                     
-                    {0:{"activity":"Initiated", "duration":"28", "late":"7",  "very_late":"30", "lost_cause":"60", "description":"Initial Draft"},
-                     1:{"activity":"Draft",     "duration":"28", "late":"14", "very_late":"60", "lost_cause":"30", "description":"Final Draft"},
-                     2:{"activity":"Approved",  "duration":"14", "late":"30", "very_late":"60", "lost_cause":"30", "description":"Approved for Release"},
-                     3:{"activity":"Released",  "duration":"21", "late":"30", "very_late":"30", "lost_cause":"90", "description":"Released to Distribution List"}},
+                    {0:{"activity":"Initiated", "duration":"28",
+                        "late":"7",  "very_late":"14", "lost_cause":"21",
+                        "description":"Initial Draft"},
+                     1:{"activity":"Draft",     "duration":"28",
+                        "late":"15", "very_late":"30", "lost_cause":"45",
+                        "description":"Final Draft"},
+                     2:{"activity":"Approved",  "duration":"14",
+                        "late":"30", "very_late":"60", "lost_cause":"90",
+                        "description":"Approved for Release"},
+                     3:{"activity":"Released",  "duration":"21",
+                        "late":"10", "very_late":"20", "lost_cause":"30",
+                        "description":"Released to Distribution List"}},
                     
                     {0:{"from":"Initiated", "to":"Draft"},
                      1:{"from":"Draft",     "to":"Approved"},

Index: PanGalactic/pangalactic/enterprise/workflow/workflow_wizard.py
diff -u PanGalactic/pangalactic/enterprise/workflow/workflow_wizard.py:1.17 PanGalactic/pangalactic/enterprise/workflow/workflow_wizard.py:1.18
--- PanGalactic/pangalactic/enterprise/workflow/workflow_wizard.py:1.17	Mon Oct  6 14:37:09 2003
+++ PanGalactic/pangalactic/enterprise/workflow/workflow_wizard.py	Tue Oct  7 10:53:48 2003
@@ -16,6 +16,7 @@
 import pangalactic.enterprise.workflow.wffactory    as wffactory
 
 import pangalactic.utils.pdfoptions as pdfoptions
+import pangalactic.utils.basegrid as basegrid
  
 WF_START = wxNewId()
 
@@ -72,9 +73,9 @@
         self.ActInfo = actinfo        #info is a list of tuples ("column label", column_width)
         self.TransInfo = transinfo    #info is a list of tuples ("column label", column_width)
         self.DataManager = datamgr
-        self.DataManager.creatingWorkflow = true
+        self.DataManager.creatingWorkflow = True
 
-        WorkflowFunc(self, true)
+        WorkflowFunc(self, True)
 
         self.act_labels = []
         for actinfo in self.ActInfo:
@@ -88,27 +89,33 @@
         self.Parent = parent
 
         self.workflow = None
-        self.saved_workflow = true
+        self.saved_workflow = True
 
         self.activitygrid = self.GetActGridWgt()
-        self.activitygrid.EnableEditing(false)
+        self.activitygrid.EnableEditing(False)
         self.activitygrid.SetColMinimalWidth (-1, 1)
         for ndx in range(len(self.ActInfo)):
             colinfo = self.ActInfo[ndx]
             self.activitygrid.SetColSize(ndx, colinfo[1])
             self.activitygrid.SetColLabelValue(ndx, colinfo[0])
+
         self.activitygrid.SetRowLabelSize(40)
-        self.activitygrid.EnableEditing(true)
+        self.activitygrid.EnableEditing(True)
+        editor = wxGridCellChoiceEditor(["Initiated", "Draft", "Approved", "Released"], False)
+#        print "editor", editor
+        for row in range(self.activitygrid.GetNumberRows()):
+#            print "row"
+            self.activitygrid.SetCellEditor(row, 0, editor)
 
         self.transitiongrid = self.GetTransGridWgt()
-        self.transitiongrid.EnableEditing(false)
+        self.transitiongrid.EnableEditing(False)
         self.transitiongrid.SetColMinimalWidth (-1, 1)
         for ndx in range(len(self.TransInfo)):
             colinfo = self.TransInfo[ndx]
             self.transitiongrid.SetColSize(ndx, colinfo[1])
             self.transitiongrid.SetColLabelValue(ndx, colinfo[0])
         self.transitiongrid.SetRowLabelSize(40)
-        self.transitiongrid.EnableEditing(true)
+        self.transitiongrid.EnableEditing(True)
 
         self.MoveTo = None
 
@@ -130,6 +137,7 @@
         EVT_GRID_CELL_RIGHT_CLICK(self.activitygrid, self.OnActRightDown)
         EVT_GRID_CELL_CHANGE(self.activitygrid, self.OnCellChange)
 
+        EVT_GRID_LABEL_LEFT_CLICK(self, self.OnSelectCell)
         EVT_GRID_SELECT_CELL(self, self.OnSelectCell)
 #        EVT_GRID_EDITOR_SHOWN(self, self.OnEditorShown)
 #        EVT_GRID_EDITOR_HIDDEN(self, self.OnEditorHidden)
@@ -145,11 +153,13 @@
 
 
     def setDisplayWgt(self, wgt):
+        #print "wfwizard.setdisplaywgt"
         self.displayWgt = wgt
 
 
     def setStartActivity(self, event):
         print "wfwizard.setstartactivity", self.ActSelectedRow
+        self.startRow = self.ActSelectedRow
         
 
     def OnActRightDown(self, event):
@@ -170,7 +180,6 @@
             #print self.table.display_mapping
             #print self.table.identifiers
             menu = wxMenu()
-            x,y = event.GetPosition()
             menu.Append(basegrid.ID_POPUP_CLEAR_SELECTION, 'Clear current selections')
             menu.Append(WF_START, "Start here")
 #            menu.AppendSeparator()
@@ -179,7 +188,7 @@
 #                    menu.Append(basegrid.ID_POPUP_CONFIG_GRID, 'Config grid display...')
 #                    menu.AppendSeparator()
 #            menu.Append(pdfoptions.ID_CREATEPDF_POPUP, 'Create PDF...') 
-            
+            y += self.activitygrid.GetColLabelSize()
             self.PopupMenuXY(menu, x, y)
             
     def OnTransRightDown(self, event):
@@ -266,7 +275,7 @@
     def Save(self, event = None):
         #print "workflow_wizard.save"
         if self.DataManager.creatingWorkflow:
-            self.DataManager.creatingWorkflow = false
+            self.DataManager.creatingWorkflow = False
             transitions = self.GetTransitions()
             activities = self.GetActivities()
 
@@ -276,7 +285,7 @@
                 self.workflow = self.createWorkflow(name, activities, transitions)
                 self.DataManager.addWorkflow(self.workflow)
                 self.displayWgt.AddData(self.workflow)
-                self.saved_workflow = true
+                self.saved_workflow = True
                 return self.workflow
             else:
                 return None
@@ -300,7 +309,7 @@
                 self.workflow.SetName(name)
                 self.DataManager.update(self.workflow)
             else:
-                self.DataManager.creatingWorkflow = true
+                self.DataManager.creatingWorkflow = True
                 self.workflow = self.Save()
             self.displayWgt.AddData(self.workflow)
             return self.workflow
@@ -335,10 +344,6 @@
                 activities.append(to_activity)
 
             row += 1
-#        self.transitiongrid.RefreshFromObjects()
-#        self.transitiongrid.AutoSizeColumns(true)
-
-#        self.SetActivities(activities)
         
         row = 0
         key_col = 0
@@ -432,7 +437,7 @@
         keypressed = evt.KeyCode()
         if keypressed <> WXK_RETURN and keypressed <> WXK_TAB:
             #print "keypressed"
-            self.saved_workflow = false
+            self.saved_workflow = False
             evt.Skip()
             return
 
@@ -440,7 +445,7 @@
     def OnActKeyDown(self, evt):
         keypressed = evt.KeyCode()
         if keypressed <> WXK_RETURN and keypressed <> WXK_TAB:
-            self.saved_workflow = false
+            self.saved_workflow = False
             evt.Skip()
             return
 
@@ -464,7 +469,7 @@
     def OnTransKeyDown(self, evt):
         keypressed = evt.KeyCode()
         if keypressed <> WXK_RETURN and keypressed <> WXK_TAB:
-            self.saved_workflow = false
+            self.saved_workflow = False
             evt.Skip()
             return
 
@@ -546,7 +551,7 @@
         
     def OnGenerateTransitions(self, event = None):
 #        print "onGeneratetransitions"
-        self.saved_workflow = false
+        self.saved_workflow = False
         actlist = []
         for ndx in range(self.activitygrid.GetNumberRows()):
             actname = self.activitygrid.GetCellValue(ndx, 0)

Index: PanGalactic/pangalactic/utils/datamanager.py
diff -u PanGalactic/pangalactic/utils/datamanager.py:1.36 PanGalactic/pangalactic/utils/datamanager.py:1.37
--- PanGalactic/pangalactic/utils/datamanager.py:1.36	Mon Oct  6 17:09:33 2003
+++ PanGalactic/pangalactic/utils/datamanager.py	Tue Oct  7 10:53:48 2003
@@ -1,6 +1,6 @@
 # $Source: /repo/step_testbed/PanGalactic/pangalactic/utils/datamanager.py,v $
 
-__version__ = "$Revision: 1.36 $"[11:-2]
+__version__ = "$Revision: 1.37 $"[11:-2]
 
 import time
 import mx.DateTime
@@ -866,20 +866,20 @@
 
 
     def initiatedActivity(self, activity):
-        print "datamanager.initiated", activity.getName()
-        print "notify the ptbs that wfprocess has been initiated"
+        #print "datamanager.initiated", activity.getName()
+        print "notify the ptbs that wfprocess is at " + activity.getName() + " stage"
 
 
     def draftActivity(self, activity):
-        print "datamanager.draft", activity.getName()
-        print "notify the ptbs that wfprocess is now draft"
+        #print "datamanager.draft", activity.getName()
+        print "notify the ptbs that wfprocess is at " + activity.getName() + " stage"
 
 
     def approvedActivity(self, activity):
-        print "datamanager.approved", activity.getName()
-        print "notify the ptbs that wfprocess is at approval stage"
+        #print "datamanager.approved", activity.getName()
+        print "notify the ptbs that wfprocess is at " + activity.getName() + " stage"
 
 
     def releasedActivity(self, activity):
-        print "datamanager.released", activity.getName()
-        print "notify the ptbs that wfprocess is at approval stage"
+        #print "datamanager.released", activity.getName()
+        print "notify the ptbs that wfprocess is at " + activity.getName() + " stage"

From waterbug at ned.gsfc.nasa.gov  Tue Oct  7 14:33:55 2003
From: waterbug at ned.gsfc.nasa.gov (waterbug CVS)
Date: Tue Oct  7 13:33:55 2003
Subject: [Pangalactic-commits] Oops.
Message-ID: <200310071733.h97HXttL003826@ned.gsfc.nasa.gov>

Modified files:
PanGalactic/pangalactic/client/tests/IDTEST None 1.1

Log message:
Oops.


From waterbug at ned.gsfc.nasa.gov  Tue Oct  7 14:34:42 2003
From: waterbug at ned.gsfc.nasa.gov (waterbug CVS)
Date: Tue Oct  7 13:34:43 2003
Subject: [Pangalactic-commits] I shouldnt have done that.
Message-ID: <200310071734.h97HYgcZ003867@ned.gsfc.nasa.gov>

Modified files:
PanGalactic/pangalactic/client/tests/IDTEST 1.1 None

Log message:
I shouldnt have done that.


From pbear at ned.gsfc.nasa.gov  Tue Oct  7 14:53:56 2003
From: pbear at ned.gsfc.nasa.gov (pbear CVS)
Date: Tue Oct  7 13:53:58 2003
Subject: [Pangalactic-commits] More tweaking for wfprocesses
Message-ID: <200310071753.h97Hrurg004077@ned.gsfc.nasa.gov>

Modified files:
PanGalactic/pangalactic/enterprise/pgefadvisory.py 1.35 1.36
PanGalactic/pangalactic/enterprise/workflow/wfinstanceoverview.py 1.4 1.5
PanGalactic/pangalactic/enterprise/workflow/wfprocess.py 1.17 1.18

Log message:
More tweaking for wfprocesses


Index: PanGalactic/pangalactic/enterprise/pgefadvisory.py
diff -u PanGalactic/pangalactic/enterprise/pgefadvisory.py:1.35 PanGalactic/pangalactic/enterprise/pgefadvisory.py:1.36
--- PanGalactic/pangalactic/enterprise/pgefadvisory.py:1.35	Mon Oct  6 14:37:09 2003
+++ PanGalactic/pangalactic/enterprise/pgefadvisory.py	Tue Oct  7 13:53:54 2003
@@ -1,11 +1,11 @@
-# $Id: pgefadvisory.py,v 1.35 2003/10/06 18:37:09 pbear Exp $
+# $Id: pgefadvisory.py,v 1.36 2003/10/07 17:53:54 pbear Exp $
 
 """
 Base class for documents that report conditions related to the
 usability of a product.
 """
 
-__version__ = "$Revision: 1.35 $"[11:-2]
+__version__ = "$Revision: 1.36 $"[11:-2]
 
 import os.path
 import string
@@ -37,17 +37,15 @@
     _defaultgridmap = [["Center",          "self.center_acronym",     "string", ""],
                        ["Type" ,           "self._pretty_doc_type",   "string", ""],
                        ["Document ID",     "self.id",                 "string", ""],
+                       ["Title",           "self.name",               "string", ""],
                        ["Date",            "self._create_date",       "string", ""]]
-#                       ["Status",          "self._workflow_str",      "string", ""],
-#                       ["Pending\nAction", "self._next_workflow_str", "string", ""],
-#                       ["Due Date",        "self._due_date",          "string", "colour"]]
+
     _gridmap = [["Center",          "self.center_acronym",     "string", ""],
                 ["Type" ,           "self._pretty_doc_type",   "string", ""],
                 ["Document ID",     "self.id",                 "string", ""],
+                ["Title",           "self.name",               "string", ""],
                 ["Date",            "self._create_date",       "string", ""]]
-#                ["Status",          "self._workflow_str",      "string", ""],
-#                ["Pending\nAction", "self._next_workflow_str", "string", ""],
-#                ["Due Date",        "self._due_date",      "string", "colour"]]
+
     
     def __init__(self, acronym="", **kw):
         """
@@ -83,6 +81,7 @@
             return Document.__getattr__(self, name)
 
     def setName(self, name):
+        print "name", name
         self.name = name
  
     def getPrettyDocType(self):

Index: PanGalactic/pangalactic/enterprise/workflow/wfinstanceoverview.py
diff -u PanGalactic/pangalactic/enterprise/workflow/wfinstanceoverview.py:1.4 PanGalactic/pangalactic/enterprise/workflow/wfinstanceoverview.py:1.5
--- PanGalactic/pangalactic/enterprise/workflow/wfinstanceoverview.py:1.4	Thu Oct  2 15:31:23 2003
+++ PanGalactic/pangalactic/enterprise/workflow/wfinstanceoverview.py	Tue Oct  7 13:53:54 2003
@@ -79,6 +79,7 @@
             colinfo = displaymap[ndx] 
             if colinfo[3] == "colour":
                 somecol = ndx
+                break
 
         if somecol == None:
             return

Index: PanGalactic/pangalactic/enterprise/workflow/wfprocess.py
diff -u PanGalactic/pangalactic/enterprise/workflow/wfprocess.py:1.17 PanGalactic/pangalactic/enterprise/workflow/wfprocess.py:1.18
--- PanGalactic/pangalactic/enterprise/workflow/wfprocess.py:1.17	Tue Oct  7 10:53:48 2003
+++ PanGalactic/pangalactic/enterprise/workflow/wfprocess.py	Tue Oct  7 13:53:54 2003
@@ -46,6 +46,7 @@
                         ["Template\nName",  "self.name",                   "string", ""],
                         ["# Steps",         "self._nstates",               "string", ""],
                         ["Status",          "self._activity_name",         "string", ""],
+                        ["Status Date",     "self._activity_date_str",     "string", ""],
                         ["Due Date",        "self._activity_due_date_str", "string", "colour"],
                         ["Pending\nAction", "self._next_activity_name",    "string", ""]]
                      
@@ -317,6 +318,8 @@
 #            now = mx.DateTime.DateFromTicks(mx.DateTime.now())
             now = mx.DateTime.DateFromTicks(self.wfdata.create_datetime)
             duedate = now + mx.DateTime.RelativeDateTime(days=fromActivity.getDuration())
+            self._activity_date = now + mx.DateTime.RelativeDateTime(days=+1)
+            self._activity_date_str = datetimes.getDisplayDate(self._activity_date)
             self._activity_due_date = duedate
             self._activity_due_date_str = datetimes.getDisplayDate(duedate)
             return toActivity

From bmuir at ned.gsfc.nasa.gov  Tue Oct  7 14:59:06 2003
From: bmuir at ned.gsfc.nasa.gov (bmuir CVS)
Date: Tue Oct  7 13:59:09 2003
Subject: [Pangalactic-commits] initial cut of version tree.. works for all
	tabs except PMV tab
Message-ID: <200310071759.h97Hx6RO004318@ned.gsfc.nasa.gov>

Modified files:
PanGalactic/PanGalactic_wingide_proj 1.28 1.29
PanGalactic/pangalactic/client/modules/psm/itemeditframe.py 1.103 1.104
PanGalactic/pangalactic/client/modules/psm/psmtool.py 1.115 1.116
PanGalactic/pangalactic/utils/data_utils.py 1.4 1.5
PanGalactic/pangalactic/utils/datamanager.py 1.37 1.38
PanGalactic/pangalactic/utils/localdb.py 1.33 1.34

Log message:
initial cut of version tree.. works for all tabs except PMV tab


Index: PanGalactic/pangalactic/utils/data_utils.py
diff -u PanGalactic/pangalactic/utils/data_utils.py:1.4 PanGalactic/pangalactic/utils/data_utils.py:1.5
--- PanGalactic/pangalactic/utils/data_utils.py:1.4	Thu Aug 28 14:41:45 2003
+++ PanGalactic/pangalactic/utils/data_utils.py	Tue Oct  7 13:59:04 2003
@@ -9,14 +9,23 @@
     # if we have a pmv, compound key is
     # (id, of_pmm_id, of_pv_id, of_pm_id, of_pm_id_context)
         
+#    if obj.__class__.__name__ == 'ProductModelVersion':
     if obj.__class__.__name__ == 'ProductModelVersion':
         # DEBUGGING
         # print "creating compound key for obj of class %s" % obj.__class__.__name__
         # print 'class of obj._of_model_master is %s' % obj._of_model_master.__class__.__name__
         # print 'class of obj._of_version is %s' % obj._of_version.__class__.__name__
-        temp = (obj.id, obj._of_model_master.id, obj._of_version.id, obj._of_master.id, obj._of_master.id_context)
+        temp = (obj.of_pm_id, obj.of_pm_id_context, obj.of_pv_id, obj.of_pmm_id, obj.id)
+    elif obj.__class__.__name__ == 'ProductModelMaster':
+        temp = (obj.of_pm_id, obj.of_pm_id_context, obj.of_pv_id, obj.id)
+    elif obj.__class__.__name__ == 'ProductVersion':
+        temp = (obj.of_pm_id, obj.of_pm_id_context, obj.id)
+    elif obj.__class__.__name__ == 'ProductMaster':
+        temp = (obj.id)
+        
+        
         #print temp
-        return temp
+    return temp
     #else:
     #    print '---------------------------------------------'
     #    print 'create compoundkey: returning None'
@@ -25,7 +34,7 @@
 
 def createACUSearchByComponent(acu_obj):
     search_str = []
-    value_list = createCompoundKey(acu_obj)
+    value_list = createCompoundKey(acu_obj, 'ProductModelVersion')
     name_list = ('component_id=', 'component_of_pmm_id=', 'component_of_pv_id=', 'component_of_pm_id=', 'component_of_pm_id_context=')
     for ndx in range(5):
         search_str.append(name_list[ndx] + value_list[ndx])
@@ -35,7 +44,7 @@
 
 def createACUSearchByAssembly(acu_obj):
     search_str = []
-    value_list = createCompoundKey(acu_obj)
+    value_list = createCompoundKey(acu_obj, 'ProductModelVersion')
     name_list = ('assembly_id=', 'assembly_of_pmm_id=', 'assembly_of_pv_id=', 'assembly_of_pm_id=', 'assembly_of_pm_id_context=')
     for ndx in range(5):
         search_str.append(name_list[ndx] + value_list[ndx])

Index: PanGalactic/pangalactic/utils/datamanager.py
diff -u PanGalactic/pangalactic/utils/datamanager.py:1.37 PanGalactic/pangalactic/utils/datamanager.py:1.38
--- PanGalactic/pangalactic/utils/datamanager.py:1.37	Tue Oct  7 10:53:48 2003
+++ PanGalactic/pangalactic/utils/datamanager.py	Tue Oct  7 13:59:04 2003
@@ -1,6 +1,6 @@
 # $Source: /repo/step_testbed/PanGalactic/pangalactic/utils/datamanager.py,v $
 
-__version__ = "$Revision: 1.37 $"[11:-2]
+__version__ = "$Revision: 1.38 $"[11:-2]
 
 import time
 import mx.DateTime
@@ -101,6 +101,7 @@
             product_master = ProductMaster(id = PartNumber,
                                            project_id = self.currentProject,
                                            id_context = self.currentProject)
+            print product_master
             
         if product_master and Revision:
             #print 'Creating product version'
@@ -108,6 +109,7 @@
                                              project_id = self.currentProject,
                                              id = Revision,
                                              id_context = self.currentProject)
+            print product_version
             
         if product_version and ModelType:
             #print 'Creating product model master'
@@ -863,6 +865,24 @@
             self.localDB.Add(unsavedobjs)
 
         self.refresh = False
+        
+    def getVersionTreeObjects(self, root_object):
+        objs = []
+        if self.user._loggedin:
+            print 'logged in'
+            if root_object.__class__.__name__ == 'ProductMaster':
+                objs = self.server.GetPvByPm(root_object._of_pm_id, root_object._of_pm_id_context)
+            elif root_object.__class__.__name__ == 'ProductVersion':
+                objs = self.server.GetPmmByPv(root_object._of_pm_id, root_object._of_pm_id_context, root_object._of_pv_id)
+            elif root_object.__class__.__name__ == 'ProductModelMaster':
+                objs = self.server.GetPmvByPm(root_object._of_pm_id, root_object._of_pm_id_context, root_object._of_pv_id, root_object._of_pmm_id)
+            elif root_object.__class__.__name__ == 'ProductModelVersion':
+                return None
+        else:
+            print 'not logged in'
+            objs = self.localDB.getVersionTreeObjects(root_object)
+            return objs
+            
 
 
     def initiatedActivity(self, activity):

Index: PanGalactic/pangalactic/client/modules/psm/itemeditframe.py
diff -u PanGalactic/pangalactic/client/modules/psm/itemeditframe.py:1.103 PanGalactic/pangalactic/client/modules/psm/itemeditframe.py:1.104
--- PanGalactic/pangalactic/client/modules/psm/itemeditframe.py:1.103	Mon Sep 29 15:18:19 2003
+++ PanGalactic/pangalactic/client/modules/psm/itemeditframe.py	Tue Oct  7 13:59:03 2003
@@ -1,6 +1,6 @@
 # $Source: /repo/step_testbed/PanGalactic/pangalactic/client/modules/psm/itemeditframe.py,v $
 
-__version__ = "$Revision: 1.103 $"[11:-2]
+__version__ = "$Revision: 1.104 $"[11:-2]
 
 # Python imports
 import copy
@@ -1160,7 +1160,7 @@
         elif self.pm_pv_form.CreatingProductVersion:
             temp_master = self.pm_pv_form.temp_pm
             #print "temp_master", temp_master
-            save_object = ProductVersion(pm = temp_master, project_id = self.DataManager.currentProject,
+            save_object = ProductVersion(_of_master = temp_master, project_id = self.DataManager.currentProject,
                                          id_context = self.DataManager.currentProject)
             self.pm_pv_form.FillPVWithFormData(save_object)
             save_object.state = pangalactic.utils.objectstatus.ADD
@@ -1168,8 +1168,10 @@
             
         elif self.pmm_pmv_form.CreatingProductModelMaster:
             temp_version = self.pm_pv_form.temp_pv
-            save_object = ProductModelMaster(pv = temp_version, project_id = self.DataManager.currentProject,
+            print temp_version
+            save_object = ProductModelMaster(_of_version = temp_version, project_id = self.DataManager.currentProject,
                                              id_context = self.DataManager.currentProject)
+            print save_object
             self.pmm_pmv_form.FillPMMWithFormData(save_object)
             save_object.state = pangalactic.utils.objectstatus.ADD
             self.pmm_pmv_form.temp_pmm = save_object
@@ -1177,7 +1179,7 @@
         elif self.pmm_pmv_form.CreatingProductModelVersion:
             #print "  creating a pmv"
             temp_model_master = self.pmm_pmv_form.temp_pmm
-            save_object = ProductModelVersion(pmm = temp_model_master,
+            save_object = ProductModelVersion(_of_model_master = temp_model_master,
                                               project_id = self.DataManager.currentProject,
                                               id_context = self.DataManager.currentProject)
             self.pmm_pmv_form.FillPMVWithFormData(save_object)

Index: PanGalactic/pangalactic/client/modules/psm/psmtool.py
diff -u PanGalactic/pangalactic/client/modules/psm/psmtool.py:1.115 PanGalactic/pangalactic/client/modules/psm/psmtool.py:1.116
--- PanGalactic/pangalactic/client/modules/psm/psmtool.py:1.115	Wed Oct  1 16:45:42 2003
+++ PanGalactic/pangalactic/client/modules/psm/psmtool.py	Tue Oct  7 13:59:03 2003
@@ -9,7 +9,7 @@
 This module is the main application code for the pgef client interface
 """
 
-__version__ = "$Revision: 1.115 $"[11:-2]
+__version__ = "$Revision: 1.116 $"[11:-2]
 
 import os
 import sys
@@ -51,6 +51,7 @@
 from pangalactic.client.modules.psm import toolbarpanel
 from pangalactic.client.modules.psm import searchframe
 from pangalactic.client.modules.psm import pgefmaintree
+from pangalactic.client.modules.psm import pgefversiontree
 from pangalactic.client.modules.psm import mystuffoptions
 from pangalactic.client.modules.psm import projectframe
 from pangalactic.client.modules.psm import quickcreate
@@ -205,7 +206,7 @@
         self.tree_notebook.AddPage(self.tree, 'Assembly')
         
         self.version_tree_ID = wxNewId()
-        self.version_tree = pgefmaintree.PgefMainTree(self.tree_notebook, self.version_tree_ID, self.DataManager)
+        self.version_tree = pgefversiontree.PgefVersionTree(self.tree_notebook, self.version_tree_ID, self.DataManager)
         self.version_tree.SetToolTip(wxToolTip("A hierarchy of the currently selected product.\n" +
                                                "Click on a product to highlight its data in the Products grid.\n" +
                                                "Doubleclick on a product to display the Product Editor."))
@@ -257,6 +258,10 @@
         EVT_GRID_CELL_LEFT_DCLICK(self.product_master_grid, self.onPMGridDClick)
         EVT_GRID_CELL_LEFT_DCLICK(self.model_master_grid, self.onMMGridDClick)
         EVT_GRID_CELL_LEFT_DCLICK(self.product_version_grid, self.onPVGridDClick)
+        
+        EVT_GRID_CELL_LEFT_CLICK(self.product_master_grid, self.onGridGlickGetVersions)
+        EVT_GRID_CELL_LEFT_CLICK(self.model_master_grid, self.onGridGlickGetVersions)
+        EVT_GRID_CELL_LEFT_CLICK(self.product_version_grid, self.onGridGlickGetVersions)
 
         EVT_MENU(self.itemgrid, quickcreate.ID_POPUP_QUICKCREATE, self.QuickCreate)
         EVT_MENU(self.product_master_grid, quickcreate.ID_POPUP_QUICKCREATE, self.QuickCreate)
@@ -278,8 +283,13 @@
         
         EVT_NOTEBOOK_PAGE_CHANGED(self, self.remainingSpace.GetId(), self.pageChanged)
         
-    def testgridfunc(self, event):
+        
+    def onGridGlickGetVersions(self, event):
         print 'model master grid was clicked'
+        ndx = event.GetRow()
+        obj = event.GetEventObject().GetDataObj(ndx)
+        objs = self.version_tree.LoadTreefromObjects(self.DataManager, obj)
+        print objs
         
     # WDR: methods for MyFrame
     def SelectView(self, event):
@@ -290,6 +300,7 @@
         currentpage = self.remainingSpace.GetSelection()
         if currentpage != 0:
             self.tree_notebook.SetSelection(1)
+            print 'changed tree'
     
     def GetCurrentGrid(self):
         currentpage = self.remainingSpace.GetSelection()

Index: PanGalactic/pangalactic/utils/localdb.py
diff -u PanGalactic/pangalactic/utils/localdb.py:1.33 PanGalactic/pangalactic/utils/localdb.py:1.34
--- PanGalactic/pangalactic/utils/localdb.py:1.33	Mon Oct  6 14:37:10 2003
+++ PanGalactic/pangalactic/utils/localdb.py	Tue Oct  7 13:59:04 2003
@@ -961,10 +961,11 @@
             return self.dbroot[searchdict][id]
         except:
             return None
-        
-    def SaveObject(self, savedict, id, obj):
-        #eventuall remove this when all calls have been renamed
-        self.saveObject(savedict, id, obj)
+
+    # remove next time you see me
+    #def SaveObject(self, savedict, id, obj):
+        ##eventuall remove this when all calls have been renamed
+        #self.saveObject(savedict, id, obj)
 
     def saveObject(self, savedict, id, obj):
         #print "localdb.saveobject", savedict, id
@@ -972,10 +973,26 @@
             self.dbroot[savedict][id] = obj
             self.dbroot[self.OIDLOOKUP][obj.pgef_oid] = savedict
             #print "saved local object", savedict, id
-        except:
-            print "Eek.  An EXCEPTION.  localdb.SaveObject"
-#            pass
-        
+            compound_key = data_utils.createCompoundKey(obj)
+            print 'compound_key is:', compound_key
+            self.saveCompoundKey(obj, compound_key)
+        except Exception, e:
+            print "Eek.  An EXCEPTION.  localdb.saveObject"
+            print e
+            import traceback
+            traceback.print_exc()
+
+    def saveCompoundKey(self, obj, key):
+        if obj.__class__.__name__ == 'ProductModelVersion':
+            dictname = self.PMVBYPRIMARYKEY
+        elif obj.__class__.__name__ == 'ProductModelMaster':
+            dictname = self.PMMBYPRIMARYKEY
+        elif obj.__class__.__name__ == 'ProductVersion':
+            dictname = self.PVBYPRIMARYKEY
+        elif obj.__class__.__name__ == 'ProductMaster':
+            dictname = self.PMBYPRIMARYKEY
+        self.dbroot[dictname][key] = obj
+
 
     def AppendUncommittedData(self, uncommitteddict, unsavedlist):
         tmplist = self.dbroot[uncommitteddict]
@@ -1232,7 +1249,7 @@
         #print "localdb.add"
         if unsavedlist:
             for obj in unsavedlist:
-                self.SaveObject(self.UNCOMMITTEDOBJECTS, obj.pgef_oid, obj)
+                self.saveObject(self.UNCOMMITTEDOBJECTS, obj.pgef_oid, obj)
                 
         self.Commit()
 
@@ -1517,6 +1534,45 @@
         
     def GetWfEventAuditDict(self):
         return self.dbroot[self.WFEVENTAUDIT]
+    
+    def getPvByPm(self, pm_id, pm_context):
+        results = []
+        dict_contents = self.dbroot[self.PVBYPRIMARYKEY].items()
+        print 'pvbyprimary:',dict_contents
+        for key, object in dict_contents:
+            if key[:-1] == (pm_id, pm_context):
+                results.append(object)
+        return results
+    
+
+    def getPmmByPv(self, pm_id, pm_context, pv_id):
+        results = []
+        dict_contents = self.dbroot[self.PMMBYPRIMARYKEY].items()
+        for key, object in dict_contents:
+            if key[:-1] == (pm_id, pm_context, pv_id):
+                results.append(object)
+        return results
+           
+            
+    def getPmvByPmm(self, pm_id, pm_context, pv_id, pmm_id):
+        results = []
+        dict_contents = self.dbroot[self.PMVBYPRIMARYKEY].items()
+        for key, object in dict_contents:
+            if key[:-1] == (pm_id, pm_context, pv_id, pmm_id):
+                results.append(object)
+        return results
+    
+    def getVersionTreeObjects(self, root_object):
+        objs = []
+        if root_object.__class__.__name__ == 'ProductMaster':
+                objs = self.getPvByPm(root_object.id, root_object.id_context)
+        elif root_object.__class__.__name__ == 'ProductVersion':
+            objs = self.getPmmByPv(root_object.of_pm_id, root_object.of_pm_id_context, root_object.id)
+        elif root_object.__class__.__name__ == 'ProductModelMaster':
+            objs = self.getPmvByPmm(root_object.of_pm_id, root_object.of_pm_id_context, root_object.of_pv_id, root_object.id)
+        elif root_object.__class__.__name__ == 'ProductModelVersion':
+            return None
+        return objs
 
     
 

Index: PanGalactic/PanGalactic_wingide_proj
diff -u PanGalactic/PanGalactic_wingide_proj:1.28 PanGalactic/PanGalactic_wingide_proj:1.29
--- PanGalactic/PanGalactic_wingide_proj:1.28	Thu Sep 25 13:33:33 2003
+++ PanGalactic/PanGalactic_wingide_proj	Tue Oct  7 13:59:03 2003
@@ -421,164 +421,164 @@
                          {'visual-state': {'first-line': 0,
         'selection_start': 0,
         'selection_end': 0},
-                          'display-font-size': {},
                           'last-window-loc': (110,
         100,
         650,
-        1010)}),
+        1010),
+                          'display-font-size': {}}),
                         ('../../../../usr/lib/python2.2/site-packages/report'\
                          'lab/lib/pagesizes.py',
                          {'visual-state': {'first-line': 0,
         'selection_start': 741,
         'selection_end': 741},
-                          'display-font-size': {},
                           'last-window-loc': (407,
         309,
         650,
-        1000)}),
+        1000),
+                          'display-font-size': {}}),
                         ('../../../../usr/lib/python2.2/site-packages/report'\
                          'lab/pdfgen/canvas.py',
                          {'visual-state': {'first-line': 0,
         'selection_start': 758,
         'selection_end': 758},
-                          'display-font-size': {},
                           'last-window-loc': (110,
         110,
         650,
-        1000)}),
+        1000),
+                          'display-font-size': {}}),
                         ('../../../../usr/lib/python2.2/site-packages/report'\
                          'lab/platypus/__init__.py',
                          {'visual-state': {'first-line': 0,
         'selection_start': 0,
         'selection_end': 0},
-                          'display-font-size': {},
                           'last-window-loc': (40,
         40,
         650,
-        1070)}),
+        1070),
+                          'display-font-size': {}}),
                         ('../../../../usr/lib/python2.2/site-packages/report'\
                          'lab/platypus/doctemplate.py',
                          {'visual-state': {'first-line': 223,
         'selection_start': 9291,
         'selection_end': 9291},
-                          'display-font-size': {},
                           'last-window-loc': (399,
         97,
         875,
-        1028)}),
+        1028),
+                          'display-font-size': {}}),
                         ('../../../../usr/lib/python2.2/site-packages/report'\
                          'lab/platypus/flowables.py',
                          {'visual-state': {'first-line': 115,
         'selection_start': 0,
         'selection_end': 0},
-                          'display-font-size': {},
                           'last-window-loc': (40,
         20,
         976,
-        1090)}),
+        1090),
+                          'display-font-size': {}}),
                         ('../../../../usr/lib/python2.2/site-packages/report'\
                          'lab/platypus/tables.py',
                          {'visual-state': {'first-line': 101,
         'selection_start': 4035,
         'selection_end': 4035},
-                          'display-font-size': {},
                           'last-window-loc': (410,
         132,
         1042,
-        846)}),
+        846),
+                          'display-font-size': {}}),
                         ('../../../../usr/lib/python2.2/site-packages/wxPyth'\
                          'on/controls.py',
                          {'visual-state': {'first-line': 936,
-        'selection_start': 39504,
-        'selection_end': 39504},
-                          'display-font-size': {},
+        'selection_start': 36664,
+        'selection_end': 36664},
                           'last-window-loc': (30,
         20,
         650,
-        1090)}),
+        1090),
+                          'display-font-size': {}}),
                         ('../../../../usr/lib/python2.2/site-packages/wxPyth'\
                          'on/events.py',
                          {'visual-state': {'first-line': 780,
         'selection_start': 33308,
         'selection_end': 33308},
-                          'display-font-size': {},
                           'last-window-loc': (40,
         30,
         650,
-        1080)}),
+        1080),
+                          'display-font-size': {}}),
                         ('../../../../usr/lib/python2.2/site-packages/wxPyth'\
                          'on/grid.py',
                          {'visual-state': {'first-line': 1226,
-        'selection_start': 54180,
-        'selection_end': 54180},
+        'selection_start': 52431,
+        'selection_end': 52431},
                           'ignored_exceptions': {1292: 1},
-                          'display-font-size': {},
                           'last-window-loc': (90,
         90,
         650,
-        1020)}),
+        1020),
+                          'display-font-size': {}}),
                         ('../../../../usr/lib/python2.2/site-packages/wxPyth'\
                          'on/lib/gridmovers.py',
-                         {'visual-state': {'first-line': 183,
-        'selection_start': 7750,
-        'selection_end': 7750},
+                         {'visual-state': {'first-line': 0,
+        'selection_start': 6047,
+        'selection_end': 6047},
                           'ignored_exceptions': {248: 1},
-                          'display-font-size': {},
                           'last-window-loc': (110,
         110,
         650,
-        1000)}),
+        1000),
+                          'display-font-size': {}}),
                         ('../../../../usr/lib/python2.2/site-packages/wxPyth'\
                          'on/py/shell.py',
                          {'visual-state': {'first-line': 182,
-        'selection_start': 9111,
-        'selection_end': 9111},
-                          'display-font-size': {},
+        'selection_start': 6523,
+        'selection_end': 6523},
                           'last-window-loc': (50,
         40,
         650,
-        1070)}),
+        1070),
+                          'display-font-size': {}}),
                         ('../../../../usr/lib/python2.2/site-packages/wxPyth'\
                          'on/windows.py',
-                         {'visual-state': {'first-line': 162,
-        'selection_start': 6587,
-        'selection_end': 6587},
+                         {'visual-state': {'first-line': 0,
+        'selection_start': 7756,
+        'selection_end': 7756},
                           'ignored_exceptions': {641: 1},
-                          'display-font-size': {},
                           'last-window-loc': (100,
         100,
         650,
-        1010)}),
+        1010),
+                          'display-font-size': {}}),
                         ('../../../../usr/lib/python2.2/site-packages/wxPyth'\
                          'on/wx.py',
-                         {'visual-state': {'first-line': 1594,
-        'selection_start': 55998,
-        'selection_end': 55998},
-                          'display-font-size': {},
+                         {'visual-state': {'first-line': 0,
+        'selection_start': 54712,
+        'selection_end': 54712},
                           'last-window-loc': (20,
         10,
         650,
-        1090)}),
+        1090),
+                          'display-font-size': {}}),
                         ('../../../../usr/lib/python2.2/sre_parse.py',
                          {'visual-state': {'first-line': 0,
-        'selection_start': 1947,
-        'selection_end': 1947},
+        'selection_start': 343,
+        'selection_end': 343},
                           'ignored_exceptions': {138: 1},
-                          'display-font-size': {},
                           'last-window-loc': (80,
         80,
         650,
-        1030)}),
+        1030),
+                          'display-font-size': {}}),
                         ('../../../../usr/local/lib/python2.2/site-packages/'\
                          'twisted/spread/jelly.py',
                          {'visual-state': {'first-line': 741,
         'selection_start': 0,
         'selection_end': 0},
-                          'display-font-size': {},
                           'last-window-loc': (413,
         56,
         650,
-        1070)}),
+        1070),
+                          'display-font-size': {}}),
                         ('../../../../usr/tmp/@15162.2',
                          {'visual-state': {'first-line': 0,
         'selection_start': 286,
@@ -595,42 +595,52 @@
         'selection_end': 1153},
                           'display-font-size': {}}),
                         ('../../../../windows/arena/PanGalactic/pangalactic/'\
+                         'client/fnord.py',
+                         {'visual-state': {'first-line': 975,
+        'selection_start': 40699,
+        'selection_end': 40699},
+                          'last-window-loc': (80,
+        70,
+        650,
+        1040),
+                          'display-font-size': {}}),
+                        ('../../../../windows/arena/PanGalactic/pangalactic/'\
                          'client/fnord_py22.iss',
                          {'visual-state': {'first-line': 0,
         'selection_start': 1203,
         'selection_end': 1203},
+                          'display-font-size': {},
                           'last-window-loc': (50,
         50,
         1126,
-        1060),
-                          'display-font-size': {}}),
+        1060)}),
                         ('../../.wingide/preferences',
                          {'visual-state': {'first-line': 0,
         'selection_start': 339,
         'selection_end': 339},
-                          'display-font-size': {},
                           'last-window-loc': (724,
         79,
         650,
-        709)}),
+        709),
+                          'display-font-size': {}}),
                         ('../../Desktop/Wing',
                          {'visual-state': {'first-line': 0,
         'selection_start': 0,
         'selection_end': 0},
-                          'display-font-size': {},
                           'last-window-loc': (40,
         40,
         650,
-        1070)}),
+        1070),
+                          'display-font-size': {}}),
                         ('../../IDE',
                          {'visual-state': {'first-line': 0,
         'selection_start': 0,
         'selection_end': 0},
-                          'display-font-size': {},
                           'last-window-loc': (50,
         50,
         650,
-        1060)}),
+        1060),
+                          'display-font-size': {}}),
                         ('../../tables.py',
                          {'visual-state': {'first-line': 281,
         'selection_start': 12545,
@@ -653,143 +663,143 @@
         'selection_start': 3012,
         'selection_end': 3012},
                           'ignored_exceptions': {104: 1},
-                          'display-font-size': {},
                           'last-window-loc': (60,
         60,
         650,
-        1050)}),
+        1050),
+                          'display-font-size': {}}),
                         ('../../usr/lib/python2.1/site-packages/wxPython/win'\
                          'dows.py',
                          {'visual-state': {'first-line': 235,
         'selection_start': 13055,
         'selection_end': 13055},
-                          'display-font-size': {},
                           'last-window-loc': (90,
         90,
         650,
-        1020)}),
+        1020),
+                          'display-font-size': {}}),
                         ('../../usr/lib/python2.1/site-packages/wxPython/wx.'\
                          'py',
                          {'visual-state': {'first-line': 1535,
         'selection_start': 53214,
         'selection_end': 53214},
-                          'display-font-size': {},
                           'last-window-loc': (199,
         34,
         650,
-        1010)}),
+        1010),
+                          'display-font-size': {}}),
                         ('../../usr/lib/python2.2/site-packages/logging/prop'\
                          'erties.py',
                          {'visual-state': {'first-line': 36,
         'selection_start': 1986,
         'selection_end': 1986},
                           'ignored_exceptions': {104: 1},
-                          'display-font-size': {},
                           'last-window-loc': (70,
         70,
         650,
-        1040)}),
+        1040),
+                          'display-font-size': {}}),
                         ('../../usr/lib/python2.2/site-packages/wxPython/mis'\
                          'c.py',
                          {'visual-state': {'first-line': 87,
         'selection_start': 3289,
         'selection_end': 3289},
-                          'display-font-size': {},
                           'last-window-loc': (520,
         86,
         650,
-        1010)}),
+        1010),
+                          'display-font-size': {}}),
                         ('../../usr/lib/wingide/keymap.emacs',
                          {'visual-state': {'first-line': 0,
         'selection_start': 1170,
         'selection_end': 1170},
-                          'display-font-size': {},
                           'last-window-loc': (470,
         35,
         650,
-        1080)}),
+        1080),
+                          'display-font-size': {}}),
                         ('../../usr/local/lib/python2.1/UserList.py',
                          {'visual-state': {'first-line': 0,
         'selection_start': 1256,
         'selection_end': 1256},
                           'ignored_exceptions': {28: 1},
-                          'display-font-size': {},
                           'last-window-loc': (60,
         60,
         650,
-        1050)}),
+        1050),
+                          'display-font-size': {}}),
                         ('../../usr/local/lib/python2.1/site-packages/ZODB/P'\
                          'ersistentMapping.py',
                          {'visual-state': {'first-line': 51,
         'selection_start': 4779,
         'selection_end': 4779},
-                          'display-font-size': {},
                           'last-window-loc': (60,
         60,
         650,
-        1050)}),
+        1050),
+                          'display-font-size': {}}),
                         ('../../usr/local/lib/python2.1/sre_compile.py',
-                         {'display-font-size': {},
-                          'last-window-loc': (90,
+                         {'last-window-loc': (90,
         90,
         650,
-        1020)}),
+        1020),
+                          'display-font-size': {}}),
                         ('../../usr/local/lib/python2.1/sre_parse.py',
                          {'ignored_exceptions': {132: 1},
-                          'display-font-size': {},
                           'last-window-loc': (70,
         70,
         650,
-        1040)}),
+        1040),
+                          'display-font-size': {}}),
                         ('../../usr/local/lib/python2.2/site-packages/ZODB/C'\
                          'onnection.py',
                          {'visual-state': {'first-line': 131,
         'selection_start': 6488,
         'selection_end': 6496},
-                          'display-font-size': {},
                           'last-window-loc': (50,
         40,
         650,
-        1070)}),
+        1070),
+                          'display-font-size': {}}),
                         ('../../usr/local/lib/python2.2/site-packages/ZODB/T'\
                          'ransaction.py',
                          {'visual-state': {'first-line': 162,
         'selection_start': 5754,
         'selection_end': 5754},
-                          'display-font-size': {},
                           'last-window-loc': (677,
         24,
         650,
-        1080)}),
+        1080),
+                          'display-font-size': {}}),
                         ('../../usr/local/lib/python2.2/site-packages/twiste'\
                          'd/cred/identity.py',
                          {'visual-state': {'first-line': 25,
         'selection_start': 1419,
         'selection_end': 1419},
-                          'display-font-size': {},
                           'last-window-loc': (389,
         48,
         650,
-        1031)}),
+        1031),
+                          'display-font-size': {}}),
                         ('../../usr/local/lib/python2.2/sre_parse.py',
                          {'visual-state': {'first-line': 69,
         'selection_start': 2084,
         'selection_end': 2084},
                           'ignored_exceptions': {138: 1},
-                          'display-font-size': {},
                           'last-window-loc': (60,
         60,
         650,
-        1050)}),
+        1050),
+                          'display-font-size': {}}),
                         ('../../usr/local/lib/python2.2/xmlrpclib.py',
                          {'visual-state': {'first-line': 898,
         'selection_start': 26996,
         'selection_end': 26996},
-                          'display-font-size': {},
                           'last-window-loc': (564,
         85,
         768,
-        1000)}),
+        1000),
+                          'display-font-size': {}}),
                         ('../../usr/tmp/@10039.2',
                          {'visual-state': {'first-line': 179,
         'selection_start': 7954,
@@ -810,65 +820,75 @@
                          {'visual-state': {'first-line': 0,
         'selection_start': 326,
         'selection_end': 326},
+                          'display-font-size': {},
                           'last-window-loc': (155,
         15,
         836,
-        1014),
-                          'display-font-size': {}}),
+        1014)}),
                         ('../../wbgmapper.py.bak',
                          {'visual-state': {'first-line': 0,
         'selection_start': 0,
         'selection_end': 0},
+                          'display-font-size': {},
                           'last-window-loc': (100,
         100,
         650,
-        1010),
-                          'display-font-size': {}}),
+        1010)}),
                         ('../../windows/arena/test/setup.py',
                          {'visual-state': {'first-line': 0,
         'selection_start': 0,
         'selection_end': 843},
-                          'display-font-size': {},
                           'last-window-loc': (0,
         28,
         650,
-        1000)}),
+        1000),
+                          'display-font-size': {}}),
+                        ('../PanGalactic_bak/pangalactic/enterprise/productv'\
+                         'ersion.py',
+                         {'visual-state': {'first-line': 54,
+        'selection_start': 0,
+        'selection_end': 0},
+                          'display-font-size': {},
+                          'last-window-loc': (20,
+        10,
+        650,
+        1090)}),
                         ('../Twisted/twisted/python/mvc.py',
                          {'visual-state': {'first-line': 0,
         'selection_start': 1878,
         'selection_end': 1878},
+                          'display-font-size': {},
                           'last-window-loc': (498,
         28,
         792,
-        935),
-                          'display-font-size': {}}),
+        935)}),
                         ('../Twisted/twisted/web/woven/controller.py',
                          {'visual-state': {'first-line': 0,
         'selection_start': 0,
         'selection_end': 0},
+                          'display-font-size': {},
                           'last-window-loc': (730,
         96,
         650,
-        826),
-                          'display-font-size': {}}),
+        826)}),
                         ('../Twisted/twisted/web/woven/model.py',
                          {'visual-state': {'first-line': 0,
         'selection_start': 1317,
         'selection_end': 1317},
+                          'display-font-size': {},
                           'last-window-loc': (704,
         0,
         650,
-        981),
-                          'display-font-size': {}}),
+        981)}),
                         ('../Twisted/twisted/web/woven/view.py',
                          {'visual-state': {'first-line': 0,
         'selection_start': 140,
         'selection_end': 140},
+                          'display-font-size': {},
                           'last-window-loc': (821,
         216,
         650,
-        720),
-                          'display-font-size': {}}),
+        720)}),
                         ('../cf_exec/cf.wpr',
                          {'open-windows': (('manager',
         (('Project: cf.wpr (arena/cf_exec)',
@@ -902,11 +922,11 @@
                          {'visual-state': {'first-line': 0,
         'selection_start': 282,
         'selection_end': 282},
+                          'display-font-size': {},
                           'last-window-loc': (60,
         19,
         650,
-        1020),
-                          'display-font-size': {}}),
+        1020)}),
                         ('../nepp/nepp.wpr',
                          {'open-windows': (('manager',
         (('Project: nepp.wpr (arena/nepp)',
@@ -944,199 +964,134 @@
         'selection_start': 8245,
         'selection_end': 8245}}),
                         ('../pbear/foo.py',
-                         {'display-font-size': {},
-                          'last-window-loc': (100,
+                         {'last-window-loc': (100,
         100,
         650,
-        674)}),
+        674),
+                          'display-font-size': {}}),
                         ('../temp/sp_activity_invoice.py',
                          {'visual-state': {'first-line': 469,
         'selection_start': 946,
         'selection_end': 946},
-                          'display-font-size': {},
                           'last-window-loc': (253,
         0,
         943,
-        1040)}),
+        1040),
+                          'display-font-size': {}}),
                         ('../wbgmapper.py',
                          {'visual-state': {'first-line': 0,
         'selection_start': 548,
         'selection_end': 548},
+                          'display-font-size': {},
                           'last-window-loc': (110,
         110,
         650,
-        1000),
-                          'display-font-size': {}}),
+        1000)}),
                         ('.gnome-desktop/wxPython',
-                         {'display-font-size': {},
-                          'last-window-loc': (884,
+                         {'last-window-loc': (884,
         51,
         650,
-        1090)}),
+        1090),
+                          'display-font-size': {}}),
                         ('.wingide/preferences',
                          {'visual-state': {'first-line': 0,
         'selection_start': 0,
         'selection_end': 0},
-                          'display-font-size': {},
                           'last-window-loc': (0,
         28,
         650,
-        1000)}),
+        1000),
+                          'display-font-size': {}}),
                         ('Demo.desktop',
-                         {'display-font-size': {},
-                          'last-window-loc': (4,
+                         {'last-window-loc': (4,
         38,
         650,
-        1090)}),
+        1090),
+                          'display-font-size': {}}),
                         ('PanGalactic_wingide_proj',
-                         {'open-windows': (('source',
-        (('editor',
-          'file:/usr/lib/python2.2/site-packages/wxPython/py/shell.py',
-          {'first-line': 182,
-           'selection_start': 9111,
-           'selection_end': 9111}),),
-        (50,
-         40,
-         650,
-         1070)),
-        ('source',
-         (('editor',
-           'file:/usr/lib/python2.2/site-packages/wxPython/events.py',
-           {'first-line': 780,
-            'selection_start': 33308,
-            'selection_end': 33308}),),
-         (40,
-          30,
-          650,
-          1080)),
-        ('source',
-         (('editor',
-           'file:/home/bmuir/arena/PanGalactic/pangalactic/client/fnord.py',
-           {'first-line': 463,
-            'selection_start': 20438,
-            'selection_end': 20438}),),
-         (424,
-          112,
-          971,
-          851)),
+                         {'open-windows': (('manager',
+        (('Project: PanGalactic_wingide_proj (arena/PanGalactic)',
+          {}),),
+        (58,
+         10,
+         340,
+         883)),
         ('source',
          (('editor',
            'file:/home/bmuir/arena/PanGalactic/pangalactic/client/modules/ps'\
-           'm/psmtool.py',
-           {'first-line': 540,
-            'selection_start': 24797,
-            'selection_end': 24797}),),
-         (406,
-          52,
-          1034,
-          904)),
+           'm/pgefversiontree.py',
+           {'first-line': 47,
+            'selection_start': 3691,
+            'selection_end': 3691}),),
+         (333,
+          120,
+          969,
+          987)),
         ('source',
          (('editor',
-           'file:/home/bmuir/arena/PanGalactic/pangalactic/client/modules/ps'\
-           'm/itemeditframe.py',
-           {'first-line': 363,
-            'selection_start': 18109,
-            'selection_end': 18109}),),
-         (494,
-          22,
-          956,
-          933)),
+           'file:/home/bmuir/arena/PanGalactic/pangalactic/utils/data_utils.'\
+           'py',
+           {'first-line': 3,
+            'selection_start': 645,
+            'selection_end': 1392}),),
+         (485,
+          137,
+          1039,
+          936)),
         ('source',
          (('editor',
            'file:/home/bmuir/arena/PanGalactic/pangalactic/client/modules/ps'\
-           'm/productdataform.py',
-           {'first-line': 198,
-            'selection_start': 8168,
-            'selection_end': 8168}),),
-         (502,
-          102,
-          993,
-          875)),
-        ('source',
-         (('editor',
-           'file:/usr/lib/python2.2/site-packages/wxPython/controls.py',
-           {'first-line': 936,
-            'selection_start': 39504,
-            'selection_end': 39504}),),
-         (30,
-          20,
-          650,
-          1090)),
-        ('source',
-         (('editor',
-           'file:/usr/lib/python2.2/site-packages/wxPython/wx.py',
-           {'first-line': 1594,
-            'selection_start': 55998,
-            'selection_end': 55998}),),
-         (20,
-          10,
-          650,
-          1090)),
-        ('source',
-         (('editor',
-           'file:/usr/lib/python2.2/site-packages/wxPython/windows.py',
-           {'first-line': 162,
-            'selection_start': 6587,
-            'selection_end': 6587}),),
-         (100,
-          100,
-          650,
-          1010)),
-        ('source',
-         (('editor',
-           'file:/usr/lib/python2.2/site-packages/wxPython/lib/gridmovers.py',
-           {'first-line': 183,
-            'selection_start': 7750,
-            'selection_end': 7750}),),
-         (110,
-          110,
-          650,
-          1000)),
+           'm/pgeftree.py',
+           {'first-line': 209,
+            'selection_start': 10839,
+            'selection_end': 10864}),),
+         (424,
+          23,
+          998,
+          971)),
         ('source',
          (('editor',
-           'file:/usr/lib/python2.2/site-packages/wxPython/grid.py',
-           {'first-line': 1226,
-            'selection_start': 54180,
-            'selection_end': 54180}),),
-         (90,
-          90,
-          650,
-          1020)),
+           'file:/home/bmuir/arena/PanGalactic/pangalactic/utils/datamanager'\
+           '.py',
+           {'first-line': 812,
+            'selection_start': 9745,
+            'selection_end': 9795}),),
+         (407,
+          47,
+          1053,
+          1040)),
         ('source',
          (('editor',
-           'file:/usr/lib/python2.2/sre_parse.py',
-           {'first-line': 0,
-            'selection_start': 1947,
-            'selection_end': 1947}),),
-         (80,
-          80,
-          650,
-          1030)),
-        ('manager',
-         (('Debugger',
-           {}),),
-         (30,
-          20,
-          650,
-          1090)),
-        ('manager',
-         (('Project: PanGalactic_wingide_proj (arena/PanGalactic)',
-           {}),),
-         (35,
-          18,
-          526,
-          908)),
+           'file:/home/bmuir/arena/PanGalactic/pangalactic/utils/localdb.py',
+           {'first-line': 1498,
+            'selection_start': 35786,
+            'selection_end': 35786}),),
+         (454,
+          67,
+          961,
+          1050)),
         ('source',
          (('editor',
            'file:/home/bmuir/arena/PanGalactic/pangalactic/client/modules/ps'\
-           'm/pgeftree.py',
-           {'first-line': 275,
-            'selection_start': 13686,
-            'selection_end': 13686}),),
+           'm/psmtool.py',
+           {'first-line': 277,
+            'selection_start': 138606,
+            'selection_end': 138606}),),
          (415,
-          23,
-          998,
-          971))),
+          56,
+          1034,
+          904)),
+        ('source',
+         (('editor',
+           'file:/home/bmuir/arena/PanGalactic/pangalactic/utils/xmlrpcinter'\
+           'face.py',
+           {'first-line': 54,
+            'selection_start': 2213,
+            'selection_end': 2213}),),
+         (521,
+          36,
+          953,
+          1066))),
                           'mgr-window-loc': {'mixin_security.py (arena/PanGa'\
         'lactic/pangalactic/client/dataobjects)': (450,
         219,
@@ -1168,6 +1123,10 @@
                        293,
                        562,
                        613),
+        'gridmovers.py (/usr/lib/python2.2/site-packages/wxPython/lib)': (110,
+        110,
+        650,
+        1000),
         'Project: PanGalactic_wingide_proj (arena/PanGalactic_bak)': (35,
         31,
         551,
@@ -1193,24 +1152,22 @@
                          28,
                          650,
                          1000),
+        'shell.py (/usr/lib/python2.2/site-packages/wxPython/py)': (50,
+        40,
+        650,
+        1070),
         'view.py (arena/Twisted/twisted/web/woven)': (821,
         216,
         650,
         720),
-        'itemeditframe.py (arena/PanGalactic_bak/pangalactic/client/modules/'\
-        'psm)': (209,
-                 127,
-                 1045,
-                 1000),
+        'data_utils.py (arena/PanGalactic/pangalactic/client/dataobjects)': (436,
+        43,
+        760,
+        1000),
         'objectreport.py (arena/PanGalactic/pangalactic/client/io)': (429,
         293,
         835,
         744),
-        'test_xmlrpcinterface.py (arena/PanGalactic/pangalactic/client/tests'\
-        ')': (80,
-              60,
-              650,
-              1050),
         'customizegrid_wdr.py (arena/PanGalactic/pangalactic/utils)': (20,
         10,
         650,
@@ -1248,10 +1205,10 @@
         9,
         650,
         1000),
-        'fnord_py22.iss (/windows/arena/PanGalactic/pangalactic/client)': (50,
-        50,
-        1126,
-        1060),
+        'windows.py (/usr/lib/python2.2/site-packages/wxPython)': (100,
+        100,
+        650,
+        1010),
         'advisory.py (arena/PanGalactic/pangalactic/client/io)': (401,
         281,
         849,
@@ -1260,18 +1217,19 @@
                        500,
                        600,
                        200),
-        'Suspicious Indentation in File': (786,
-        571,
-        510,
-        266),
+        'httpserverinterface.py (arena/PanGalactic_bak/pangalactic/client/su'\
+        'pport)': (314,
+                   96,
+                   762,
+                   1000),
         'pgefdatatable.py (arena/PanGalactic/pangalactic/client/modules/psm)': (311,
         35,
         788,
         1045),
-        'datamanager.py (arena/PanGalactic/pangalactic/utils)': (398,
-        43,
-        1053,
-        1040),
+        'textreport.py (arena/PanGalactic/pangalactic/client/io)': (30,
+        20,
+        650,
+        1090),
         'dbbrowser.py (arena/PanGalactic_bak/pangalactic/client/support)': (250,
         40,
         890,
@@ -1280,11 +1238,10 @@
                                  110,
                                  650,
                                  1000),
-        'httpserverinterface.py (arena/PanGalactic_bak/pangalactic/client/su'\
-        'pport)': (314,
-                   96,
-                   762,
-                   1000),
+        'Suspicious Indentation in File': (786,
+        571,
+        510,
+        266),
         'customizegrid.py (arena/PanGalactic/pangalactic/client/modules/psm)': (591,
         24,
         877,
@@ -1293,6 +1250,10 @@
                      20,
                      650,
                      1090),
+        'wx.py (/usr/lib/python2.2/site-packages/wxPython)': (20,
+        10,
+        650,
+        1090),
         'itemsearchform.py (arena/PanGalactic/pangalactic/client/modules/psm'\
         ')': (449,
               40,
@@ -1307,6 +1268,10 @@
                51,
                650,
                867),
+        'pgefmaintree.py (arena/PanGalactic/pangalactic/client/modules/psm)': (110,
+        70,
+        650,
+        1040),
         'pagesizes.py (/usr/lib/python2.2/site-packages/reportlab/lib)': (407,
         309,
         650,
@@ -1315,14 +1280,22 @@
         150,
         746,
         966),
+        'basegrid.py (arena/PanGalactic/pangalactic/utils)': (287,
+        53,
+        650,
+        1060),
+        'plmconvert.py (arena/PanGalactic/pangalactic/client/modules/plm)': (560,
+        7,
+        650,
+        1090),
         'xlate_list.py_new (arena/PanGalactic/pangalactic/tools)': (862,
         78,
         650,
         1040),
-        'tables.py (/usr/lib/python2.2/site-packages/reportlab/platypus)': (438,
-        114,
-        1042,
-        846),
+        'datamanager.py (arena/PanGalactic/pangalactic/utils)': (398,
+        43,
+        1053,
+        1040),
         'itemdataform_wdr.py (arena/PanGalactic/pangalactic/client/modules/p'\
         'sm)': (130,
                 110,
@@ -1345,11 +1318,10 @@
                                    462,
                                    640,
                                    276),
-        'pgefmaintree.py (arena/PanGalactic_bak/pangalactic/client/modules/p'\
-        'sm)': (110,
-                70,
-                650,
-                1040),
+        'pgefgrid.py (arena/PanGalactic/pangalactic/client/modules/psm)': (442,
+        114,
+        941,
+        801),
         'setup.py (arena/PanGalactic/pangalactic/client)': (80,
         80,
         1137,
@@ -1366,22 +1338,26 @@
         12,
         907,
         1000),
-        'link.py (arena/PanGalactic_bak/pangalactic/common)': (203,
-        52,
+        'dbbrowser.py (arena/PanGalactic/pangalactic/client/support)': (426,
+        24,
         650,
-        1080),
-        'test_nauo.py (arena/PanGalactic_bak/pangalactic/client/tests)': (391,
-        276,
+        1000),
+        'searchframe.py (arena/PanGalactic/pangalactic/client/modules/psm)': (0,
+        28,
+        894,
+        1000),
+        'model.py (arena/Twisted/twisted/web/woven)': (704,
+        0,
         650,
-        852),
+        981),
         'untitled-2.py': (80,
                           80,
                           650,
                           1030),
-        'sm_pdf_tables.py (arena/PanGalactic/pangalactic/client/io)': (411,
-        191,
-        829,
-        890),
+        'controls.py (/usr/lib/python2.2/site-packages/wxPython)': (30,
+        20,
+        650,
+        1090),
         'test_zodb.py': (712,
                          299,
                          758,
@@ -1391,9 +1367,9 @@
                    20,
                    650,
                    1000),
-        'itemeditframe.py (arena/PanGalactic/pangalactic/client/modules/psm)': (494,
-        22,
-        956,
+        'itemeditframe.py (arena/PanGalactic/pangalactic/client/modules/psm)': (502,
+        129,
+        957,
         933),
         'partslisttreeframe.py (arena/PanGalactic/pangalactic/client/modules'\
         '/psm)': (605,
@@ -1404,10 +1380,10 @@
                            474,
                            500,
                            296),
-        'canvas.py (/usr/lib/python2.2/site-packages/reportlab/pdfgen)': (110,
-        110,
+        'productmodelversion.py (arena/PanGalactic/pangalactic/enterprise)': (40,
+        30,
         650,
-        1000),
+        1080),
         'pgefdatatable.py (arena/PanGalactic/pangalactic/common/utils)': (40,
         40,
         650,
@@ -1416,44 +1392,50 @@
         146,
         650,
         971),
-        'pdfreport.py (arena/PanGalactic/pangalactic/client/io)': (401,
-        60,
-        949,
-        836),
+        'reportlab_blocks.py (arena/PanGalactic/pangalactic/client/io)': (410,
+        61,
+        650,
+        1010),
+        'flowables.py (/usr/lib/python2.2/site-packages/reportlab/platypus)': (40,
+        20,
+        976,
+        1090),
         'controller.py (arena/Twisted/twisted/web/woven)': (730,
         96,
         650,
         826),
-        'itemdataform.wdr (arena/PanGalactic/pangalactic/client/modules/psm)': (100,
+        'person.py (arena/PanGalactic_bak/pangalactic/common)': (100,
         90,
         650,
         1020),
-        'itemdroptarget.py (arena/PanGalactic_bak/pangalactic/client/modules'\
-        '/psm)': (417,
-                  196,
-                  916,
-                  748),
+        'tables.py (/usr/lib/python2.2/site-packages/reportlab/platypus)': (438,
+        114,
+        1042,
+        846),
         'productfilerelationship.py (arena/PanGalactic/pangalactic/common)': (100,
         100,
         650,
         1010),
-        'xlator.py (arena/PanGalactic/pangalactic/tools)': (425,
-        31,
-        866,
-        1000),
+        'data_utils.py (arena/PanGalactic/pangalactic/utils)': (485,
+        133,
+        1039,
+        936),
         'test_pgefobject.py (arena/PanGalactic_bak/pangalactic/client/tests)': (0,
         28,
         650,
         1000),
-        'flowables.py (/usr/lib/python2.2/site-packages/reportlab/platypus)': (40,
-        20,
-        976,
-        1090),
-        'checkedoutgrid.py (arena/PanGalactic/pangalactic/client/modules/psm'\
-        ')': (414,
-              46,
-              924,
-              1000),
+        'pdfreport.py (arena/PanGalactic/pangalactic/client/io)': (401,
+        60,
+        949,
+        836),
+        'configdbbrowser.py (arena/PanGalactic/pangalactic/utils)': (343,
+        48,
+        828,
+        1000),
+        'project.py (arena/PanGalactic/pangalactic/common)': (411,
+        138,
+        650,
+        982),
         'partslistform.py (arena/PanGalactic/pangalactic/client/modules/psm)': (407,
         32,
         870,
@@ -1470,18 +1452,22 @@
         21,
         650,
         1000),
-        'Select files': (550,
-                         450,
-                         500,
-                         300),
+        'link.py (arena/PanGalactic_bak/pangalactic/common)': (203,
+        52,
+        650,
+        1080),
+        'fnord_py22.iss (/windows/arena/PanGalactic/pangalactic/client)': (50,
+        50,
+        1126,
+        1060),
         'pgefadvisory.py (arena/PanGalactic/pangalactic/enterprise)': (60,
         60,
         848,
         1050),
-        'plmconvert.py (arena/PanGalactic/pangalactic/client/modules/plm)': (560,
-        7,
-        650,
-        1090),
+        'sm_pdf_tables.py (arena/PanGalactic/pangalactic/client/io)': (411,
+        191,
+        829,
+        890),
         'partslistfilerelationship.py (arena/PanGalactic/pangalactic/common)': (30,
         20,
         650,
@@ -1490,10 +1476,6 @@
         28,
         650,
         1000),
-        'person.py (arena/PanGalactic_bak/pangalactic/common)': (100,
-        90,
-        650,
-        1020),
         'object_report.py (arena/cf_exec)': (666,
         61,
         750,
@@ -1532,14 +1514,22 @@
                 50,
                 650,
                 1060),
-        'dbbrowser.py (arena/PanGalactic/pangalactic/client/support)': (426,
-        24,
+        'events.py (/usr/lib/python2.2/site-packages/wxPython)': (40,
+        30,
         650,
+        1080),
+        'xlator.py (arena/PanGalactic/pangalactic/tools)': (425,
+        31,
+        866,
         1000),
         'sp_activity_invoice.py (arena/temp)': (253,
         0,
         943,
         1040),
+        'toolbarpanel.py (arena/PanGalactic/pangalactic/client/modules/psm)': (440,
+        167,
+        814,
+        882),
         'toolframe.py (arena/PanGalactic/pangalactic/client)': (336,
         45,
         1037,
@@ -1549,10 +1539,11 @@
               254,
               916,
               748),
-        'pgefgrid.py (arena/PanGalactic/pangalactic/client/modules/psm)': (442,
-        114,
-        941,
-        801),
+        'pgefmaintree.py (arena/PanGalactic_bak/pangalactic/client/modules/p'\
+        'sm)': (110,
+                70,
+                650,
+                1040),
         'localdb.py (arena/PanGalactic/pangalactic/utils)': (445,
         63,
         835,
@@ -1570,22 +1561,31 @@
               97,
               875,
               1028),
-        'reportlab_blocks.py (arena/PanGalactic/pangalactic/client/io)': (410,
-        61,
+        'sre_parse.py (/usr/lib/python2.2)': (80,
+        80,
         650,
-        1010),
+        1030),
         'Save Files?': (0,
                         28,
                         500,
                         1000),
+        '__init__.py (/usr/lib/python2.2/site-packages/reportlab)': (110,
+        100,
+        650,
+        1010),
         'jelly.py (/usr/local/lib/python2.2/site-packages/twisted/spread)': (413,
         56,
         650,
         1070),
-        'pgeftree.py (arena/PanGalactic_bak/pangalactic/client/modules/psm)': (120,
-        80,
+        'pystrptime.py (arena/PanGalactic/pangalactic/utils)': (100,
+        100,
         650,
-        1030),
+        1010),
+        'itemdroptarget.py (arena/PanGalactic_bak/pangalactic/client/modules'\
+        '/psm)': (417,
+                  196,
+                  916,
+                  748),
         'test_gidep_alert.py (arena/PanGalactic_bak/pangalactic/client/tests'\
         ')': (0,
               28,
@@ -1611,22 +1611,24 @@
         31,
         750,
         1068),
-        'pgeftree.py (arena/PanGalactic/pangalactic/client/modules/psm)': (415,
+        'pgeftree.py (arena/PanGalactic/pangalactic/client/modules/psm)': (424,
         23,
         998,
         971),
+        'checkedoutgrid.py (arena/PanGalactic/pangalactic/client/modules/psm'\
+        ')': (414,
+              46,
+              924,
+              1000),
         'File open failed': (545,
                              553,
                              510,
                              93),
-        'productmodelversion.py (arena/PanGalactic/pangalactic/enterprise)': (40,
-        30,
-        650,
-        1080),
-        '__init__.py (/usr/lib/python2.2/site-packages/reportlab)': (110,
-        100,
-        650,
-        1010),
+        'test_xmlrpcinterface.py (arena/PanGalactic/pangalactic/client/tests'\
+        ')': (80,
+              60,
+              650,
+              1050),
         'nauo.py (arena/PanGalactic_bak/pangalactic/common)': (30,
         10,
         650,
@@ -1636,14 +1638,14 @@
                102,
                993,
                875),
+        'productmodelmaster.py (arena/PanGalactic/pangalactic/enterprise)': (70,
+        50,
+        650,
+        1060),
         'Interactive Python Shell': (559,
                                      196,
                                      1006,
                                      620),
-        'model.py (arena/Twisted/twisted/web/woven)': (704,
-        0,
-        650,
-        981),
         'localdb.py (arena/PanGalactic/pangalactic/common/utils)': (30,
         20,
         650,
@@ -1656,9 +1658,13 @@
         293,
         562,
         613),
-        'searchframe.py (arena/PanGalactic/pangalactic/client/modules/psm)': (0,
-        28,
-        894,
+        'productmaster.py (arena/PanGalactic/pangalactic/enterprise)': (60,
+        40,
+        650,
+        1070),
+        'fnord_py22.iss (arena/PanGalactic/pangalactic/client)': (267,
+        55,
+        1092,
         1000),
         'pgefedittree.py (arena/PanGalactic_bak/pangalactic/client/modules/p'\
         'sm)': (278,
@@ -1694,10 +1700,10 @@
                68,
                759,
                1050),
-        'fnord_py22.iss (arena/PanGalactic/pangalactic/client)': (267,
-        55,
-        1092,
-        1000),
+        'grid.py (/usr/lib/python2.2/site-packages/wxPython)': (90,
+        90,
+        650,
+        1020),
         'test_gidep_problem_advisory.py (arena/PanGalactic_bak/pangalactic/c'\
         'lient/tests)': (0,
                          28,
@@ -1711,26 +1717,31 @@
         115,
         650,
         932),
-        'pgefmaintree.py (arena/PanGalactic/pangalactic/client/modules/psm)': (110,
-        70,
+        'pgeftree.py (arena/PanGalactic_bak/pangalactic/client/modules/psm)': (120,
+        80,
         650,
-        1040),
+        1030),
         'xmlrpcinterface.py (arena/PanGalactic/pangalactic/utils)': (512,
         32,
-        650,
+        953,
         1066),
-        'toolbarpanel.py (arena/PanGalactic/pangalactic/client/modules/psm)': (440,
-        167,
-        814,
-        882),
+        'Select files': (550,
+                         450,
+                         500,
+                         300),
         'psmtool.py (arena/PanGalactic_bak/pangalactic/client/modules/psm)': (410,
         91,
         822,
         1000),
-        'data_utils.py (arena/PanGalactic/pangalactic/client/dataobjects)': (436,
-        43,
-        760,
-        1000),
+        'fnord.py (/windows/arena/PanGalactic/pangalactic/client)': (80,
+        70,
+        650,
+        1040),
+        'itemeditframe.py (arena/PanGalactic_bak/pangalactic/client/modules/'\
+        'psm)': (209,
+                 127,
+                 1045,
+                 1000),
         'Open File': (550,
                       350,
                       500,
@@ -1743,6 +1754,10 @@
         15,
         825,
         1090),
+        'otherdocform.py (arena/PanGalactic/pangalactic/client/modules/psm)': (546,
+        46,
+        875,
+        1000),
         'test_person.py (arena/PanGalactic_bak/pangalactic/client/tests)': (0,
         28,
         650,
@@ -1751,19 +1766,27 @@
         109,
         999,
         931),
+        'productversion.py (arena/PanGalactic_bak/pangalactic/enterprise)': (20,
+        10,
+        650,
+        1090),
         'xlate_list.py (arena/PanGalactic/pangalactic/tools)': (509,
         42,
         928,
         1000),
-        'otherdocform.py (arena/PanGalactic/pangalactic/client/modules/psm)': (546,
-        46,
-        875,
+        'canvas.py (/usr/lib/python2.2/site-packages/reportlab/pdfgen)': (110,
+        110,
+        650,
         1000),
         'propertiesform.py (arena/PanGalactic/pangalactic/client/modules/psm'\
         ')': (568,
               215,
               997,
               861),
+        'test_nauo.py (arena/PanGalactic_bak/pangalactic/client/tests)': (391,
+        276,
+        650,
+        852),
         'wbgmapper.py': (155,
                          15,
                          836,
@@ -1772,10 +1795,10 @@
         538,
         510,
         123),
-        'textreport.py (arena/PanGalactic/pangalactic/client/io)': (30,
-        20,
+        'itemdataform.wdr (arena/PanGalactic/pangalactic/client/modules/psm)': (100,
+        90,
         650,
-        1090),
+        1020),
         'configdbbrowser.py (arena/PanGalactic/pangalactic/client/support)': (269,
         159,
         877,
@@ -1784,10 +1807,6 @@
         111,
         650,
         1000),
-        'pgefadvisory.py (arena/PanGalactic/pangalactic/client/modules/dm)': (135,
-        44,
-        650,
-        1070),
         'role.py (arena/PanGalactic/pangalactic/common)': (90,
         90,
         650,
@@ -1796,10 +1815,10 @@
         28,
         650,
         1000),
-        'Project: PanGalactic_wingide_proj (arena/PanGalactic)': (35,
-        18,
-        526,
-        908),
+        'Project: PanGalactic_wingide_proj (arena/PanGalactic)': (58,
+        10,
+        340,
+        883),
         'mvc.py (arena/Twisted/twisted/python)': (498,
         28,
         792,
@@ -1825,12 +1844,12 @@
         246,
         920,
         841),
-        'project.py (arena/PanGalactic/pangalactic/common)': (411,
-        138,
+        'pgefadvisory.py (arena/PanGalactic/pangalactic/client/modules/dm)': (135,
+        44,
         650,
-        982),
-        'fnord.py (arena/PanGalactic/pangalactic/client)': (424,
-        112,
+        1070),
+        'fnord.py (arena/PanGalactic/pangalactic/client)': (383,
+        152,
         971,
         851),
         'baseobjecttest.py (arena/PanGalactic_bak/pangalactic/client/tests)': (271,
@@ -1881,11 +1900,11 @@
         '[(z[0], z[1]) for z in x]',
         "[(z[0], z[1].replace('self.','')) for z in x]"]}),
                         ('code/lst1.py',
-                         {'display-font-size': {},
-                          'last-window-loc': (569,
+                         {'last-window-loc': (569,
         75,
         650,
-        1090)}),
+        1090),
+                          'display-font-size': {}}),
                         ('configdbbrowser.py',
                          {'visual-state': {'first-line': 0,
         'selection_start': 332,
@@ -1898,201 +1917,201 @@
                          {'visual-state': {'first-line': 0,
         'selection_start': 0,
         'selection_end': 0},
-                          'display-font-size': {},
                           'last-window-loc': (50,
         50,
         650,
-        1060)}),
+        1060),
+                          'display-font-size': {}}),
                         ('hack.py',
-                         {'display-font-size': {},
-                          'last-window-loc': (60,
+                         {'last-window-loc': (60,
         60,
         650,
-        1050)}),
+        1050),
+                          'display-font-size': {}}),
                         ('oid_doc.txt',
-                         {'display-font-size': {},
-                          'last-window-loc': (324,
+                         {'last-window-loc': (324,
         80,
         1262,
-        705)}),
+        705),
+                          'display-font-size': {}}),
                         ('pangalactic/Twisted/doc/examples/xmlrpc.py',
                          {'visual-state': {'first-line': 0,
         'selection_start': 0,
         'selection_end': 0},
-                          'display-font-size': {},
                           'last-window-loc': (40,
         40,
         650,
-        1070)}),
+        1070),
+                          'display-font-size': {}}),
                         ('pangalactic/client/README',
                          {'visual-state': {'first-line': 97,
         'selection_start': 4195,
         'selection_end': 4195},
+                          'display-font-size': {},
                           'last-window-loc': (423,
         6,
         650,
-        1000),
-                          'display-font-size': {}}),
+        1000)}),
                         ('pangalactic/client/checkout.txt',
                          {'visual-state': {'first-line': 0,
         'selection_start': 1307,
         'selection_end': 1307},
-                          'display-font-size': {},
                           'last-window-loc': (112,
         44,
         1399,
-        1070)}),
+        1070),
+                          'display-font-size': {}}),
                         ('pangalactic/client/dataobjects/constants.py',
                          {'visual-state': {'first-line': 0,
         'selection_start': 176,
         'selection_end': 176},
-                          'display-font-size': {},
                           'last-window-loc': (487,
         51,
         650,
-        568)}),
+        568),
+                          'display-font-size': {}}),
                         ('pangalactic/client/dataobjects/data_utils.py',
                          {'visual-state': {'first-line': 0,
         'selection_start': 1041,
         'selection_end': 1041},
+                          'display-font-size': {},
                           'last-window-loc': (436,
         43,
         760,
-        1000),
-                          'display-font-size': {}}),
+        1000)}),
                         ('pangalactic/client/dataobjects/datamanager.py',
                          {'visual-state': {'first-line': 0,
         'selection_start': 105,
         'selection_end': 105},
-                          'display-font-size': {},
                           'last-window-loc': (405,
         12,
         907,
-        1000)}),
+        1000),
+                          'display-font-size': {}}),
                         ('pangalactic/client/dataobjects/datamanager.py_new',
                          {'visual-state': {'first-line': 0,
         'selection_start': 1468,
         'selection_end': 1468},
-                          'display-font-size': {},
                           'last-window-loc': (462,
         116,
         650,
-        1001)}),
+        1001),
+                          'display-font-size': {}}),
                         ('pangalactic/client/dataobjects/epimsproject.py',
                          {'visual-state': {'first-line': 0,
         'selection_start': 676,
         'selection_end': 676},
-                          'display-font-size': {},
                           'last-window-loc': (239,
         259,
         759,
-        642)}),
+        642),
+                          'display-font-size': {}}),
                         ('pangalactic/client/dataobjects/idr.py',
                          {'visual-state': {'first-line': 0,
         'selection_start': 947,
         'selection_end': 947},
+                          'display-font-size': {},
                           'last-window-loc': (508,
         155,
         650,
-        825),
-                          'display-font-size': {}}),
+        825)}),
                         ('pangalactic/client/dataobjects/item.py',
                          {'visual-state': {'first-line': 53,
         'selection_start': 3895,
         'selection_end': 3895},
-                          'display-font-size': {},
                           'last-window-loc': (741,
         89,
         709,
-        877)}),
+        877),
+                          'display-font-size': {}}),
                         ('pangalactic/client/dataobjects/localdb.py',
                          {'visual-state': {'first-line': 0,
         'selection_start': 1012,
         'selection_end': 1012},
-                          'display-font-size': {},
                           'last-window-loc': (388,
         109,
         999,
-        931)}),
+        931),
+                          'display-font-size': {}}),
                         ('pangalactic/client/dataobjects/mixin_security.py',
                          {'visual-state': {'first-line': 0,
         'selection_start': 783,
         'selection_end': 783},
+                          'display-font-size': {},
                           'last-window-loc': (450,
         219,
         989,
-        936),
-                          'display-font-size': {}}),
+        936)}),
                         ('pangalactic/client/dataobjects/nauo.py',
                          {'visual-state': {'first-line': 0,
         'selection_start': 52,
         'selection_end': 52},
-                          'display-font-size': {},
                           'last-window-loc': (701,
         167,
         650,
-        875)}),
+        875),
+                          'display-font-size': {}}),
                         ('pangalactic/client/dataobjects/nedobject.py',
-                         {'display-font-size': {},
-                          'last-window-loc': (383,
+                         {'last-window-loc': (383,
         137,
         1118,
-        737)}),
+        737),
+                          'display-font-size': {}}),
                         ('pangalactic/client/dataobjects/objectstatus.py',
                          {'visual-state': {'first-line': 0,
         'selection_start': 322,
         'selection_end': 322},
+                          'display-font-size': {},
                           'last-window-loc': (216,
         327,
         650,
-        565),
-                          'display-font-size': {}}),
+        565)}),
                         ('pangalactic/client/dataobjects/part.py',
                          {'visual-state': {'first-line': 0,
         'selection_start': 615,
         'selection_end': 632},
-                          'display-font-size': {},
                           'last-window-loc': (569,
         58,
         650,
-        1011)}),
+        1011),
+                          'display-font-size': {}}),
                         ('pangalactic/client/dataobjects/partslist.py',
                          {'visual-state': {'first-line': 20,
         'selection_start': 677,
         'selection_end': 677},
-                          'display-font-size': {},
                           'last-window-loc': (367,
         172,
         1000,
-        1000)}),
+        1000),
+                          'display-font-size': {}}),
                         ('pangalactic/client/dataobjects/pdmdocument.py',
                          {'visual-state': {'first-line': 0,
         'selection_start': 240,
         'selection_end': 240},
+                          'display-font-size': {},
                           'last-window-loc': (607,
         54,
         650,
-        854),
-                          'display-font-size': {}}),
+        854)}),
                         ('pangalactic/client/dataobjects/pdmexceptions.py',
                          {'visual-state': {'first-line': 0,
         'selection_start': 0,
         'selection_end': 0},
-                          'display-font-size': {},
                           'last-window-loc': (411,
         51,
         650,
-        1050)}),
+        1050),
+                          'display-font-size': {}}),
                         ('pangalactic/client/dataobjects/pdmobject.py',
                          {'visual-state': {'first-line': 209,
         'selection_start': 8740,
         'selection_end': 8740},
                           'ignored_exceptions': {124: 1},
-                          'display-font-size': {},
                           'last-window-loc': (463,
         108,
         935,
-        966)}),
+        966),
+                          'display-font-size': {}}),
                         ('pangalactic/client/dataobjects/pdmobjecttest.py',
                          {'visual-state': {'first-line': 0,
         'selection_start': 472,
@@ -2105,60 +2124,60 @@
                          {'visual-state': {'first-line': 8,
         'selection_start': 547,
         'selection_end': 547},
-                          'display-font-size': {},
                           'last-window-loc': (501,
         46,
         650,
-        1000)}),
+        1000),
+                          'display-font-size': {}}),
                         ('pangalactic/client/dataobjects/safelistappend.py',
                          {'visual-state': {'first-line': 0,
         'selection_start': 575,
         'selection_end': 575},
-                          'display-font-size': {},
                           'last-window-loc': (394,
         22,
         901,
-        1000)}),
+        1000),
+                          'display-font-size': {}}),
                         ('pangalactic/client/dataobjects/securitymanager.py',
                          {'visual-state': {'first-line': 117,
         'selection_start': 4536,
         'selection_end': 4536},
+                          'display-font-size': {},
                           'last-window-loc': (432,
         51,
         650,
-        867),
-                          'display-font-size': {}}),
+        867)}),
                         ('pangalactic/client/dataobjects/user.py',
                          {'visual-state': {'first-line': 0,
         'selection_start': 1213,
         'selection_end': 1213},
-                          'display-font-size': {},
                           'last-window-loc': (455,
         50,
         650,
-        1000)}),
+        1000),
+                          'display-font-size': {}}),
                         ('pangalactic/client/dataobjects/uuid.py',
                          {'visual-state': {'first-line': 0,
         'selection_start': 144,
         'selection_end': 144},
-                          'display-font-size': {},
                           'last-window-loc': (477,
         244,
         984,
-        697)}),
+        697),
+                          'display-font-size': {}}),
                         ('pangalactic/client/fnord.iss',
                          {'visual-state': {'first-line': 0,
         'selection_start': 0,
         'selection_end': 0},
-                          'display-font-size': {},
                           'last-window-loc': (50,
         50,
         1061,
-        1060)}),
+        1060),
+                          'display-font-size': {}}),
                         ('pangalactic/client/fnord.py',
-                         {'visual-state': {'first-line': 463,
-        'selection_start': 20438,
-        'selection_end': 20438},
+                         {'visual-state': {'first-line': 327,
+        'selection_start': 13154,
+        'selection_end': 13154},
                           'which-pyexec': {'linux': 'project'},
                           'which-rundir': {'linux': 'project'},
                           'env-vars': {'linux': []},
@@ -2171,8 +2190,8 @@
                           'buildcmd': {'linux': ''},
                           'pypath': {'linux': ''},
                           'showargsdialog': 1,
-                          'last-window-loc': (424,
-        112,
+                          'last-window-loc': (383,
+        152,
         971,
         851),
                           'rundir': {'linux': ''},
@@ -2182,168 +2201,168 @@
                          {'visual-state': {'first-line': 0,
         'selection_start': 1694,
         'selection_end': 1694},
-                          'display-font-size': {},
                           'last-window-loc': (267,
         55,
         1092,
-        1000)}),
+        1000),
+                          'display-font-size': {}}),
                         ('pangalactic/client/images/ToolkitImages.py',
                          {'visual-state': {'first-line': 911,
         'selection_start': 0,
         'selection_end': 0},
-                          'display-font-size': {},
                           'last-window-loc': (60,
         40,
         650,
-        1070)}),
+        1070),
+                          'display-font-size': {}}),
                         ('pangalactic/client/images/maketoolkitimages.py',
                          {'visual-state': {'first-line': 0,
         'selection_start': 1018,
         'selection_end': 1018},
-                          'display-font-size': {},
                           'last-window-loc': (70,
         70,
         650,
-        1040)}),
+        1040),
+                          'display-font-size': {}}),
                         ('pangalactic/client/io/acrobatwrapper.py',
                          {'visual-state': {'first-line': 0,
         'selection_start': 5,
         'selection_end': 5},
-                          'display-font-size': {},
                           'last-window-loc': (182,
         5,
         875,
-        1090)}),
+        1090),
+                          'display-font-size': {}}),
                         ('pangalactic/client/io/advisory.py',
                          {'visual-state': {'first-line': 242,
         'selection_start': 8074,
         'selection_end': 8074},
-                          'display-font-size': {},
                           'last-window-loc': (401,
         281,
         849,
-        1030)}),
+        1030),
+                          'display-font-size': {}}),
                         ('pangalactic/client/io/objectreport.py',
                          {'visual-state': {'first-line': 46,
         'selection_start': 2867,
         'selection_end': 2867},
-                          'display-font-size': {},
                           'last-window-loc': (429,
         293,
         835,
-        744)}),
+        744),
+                          'display-font-size': {}}),
                         ('pangalactic/client/io/pdfoptions.py',
                          {'visual-state': {'first-line': 25,
         'selection_start': 2357,
         'selection_end': 2357},
+                          'display-font-size': {},
                           'last-window-loc': (399,
         246,
         920,
-        841),
-                          'display-font-size': {}}),
+        841)}),
                         ('pangalactic/client/io/pdfreport.py',
                          {'visual-state': {'first-line': 2,
         'selection_start': 882,
         'selection_end': 882},
+                          'display-font-size': {},
                           'last-window-loc': (401,
         60,
         949,
-        836),
-                          'display-font-size': {}}),
+        836)}),
                         ('pangalactic/client/io/reportlab_blocks.py',
                          {'visual-state': {'first-line': 286,
         'selection_start': 9996,
         'selection_end': 9996},
-                          'display-font-size': {},
                           'last-window-loc': (410,
         61,
         650,
-        1010)}),
+        1010),
+                          'display-font-size': {}}),
                         ('pangalactic/client/io/sm_pdf_tables.py',
                          {'visual-state': {'first-line': 45,
         'selection_start': 2017,
         'selection_end': 2017},
-                          'display-font-size': {},
                           'last-window-loc': (411,
         191,
         829,
-        890)}),
+        890),
+                          'display-font-size': {}}),
                         ('pangalactic/client/io/textreport.py',
                          {'visual-state': {'first-line': 0,
         'selection_start': 0,
         'selection_end': 0},
-                          'display-font-size': {},
                           'last-window-loc': (30,
         20,
         650,
-        1090)}),
+        1090),
+                          'display-font-size': {}}),
                         ('pangalactic/client/io/treereport.py',
                          {'visual-state': {'first-line': 0,
         'selection_start': 1205,
         'selection_end': 1205},
+                          'display-font-size': {},
                           'last-window-loc': (403,
         19,
         917,
-        1000),
-                          'display-font-size': {}}),
+        1000)}),
                         ('pangalactic/client/loginclass.py',
                          {'visual-state': {'first-line': 0,
         'selection_start': 1521,
         'selection_end': 1521},
-                          'display-font-size': {},
                           'last-window-loc': (560,
         150,
         746,
-        966)}),
+        966),
+                          'display-font-size': {}}),
                         ('pangalactic/client/modules/dm/dmtool.py',
                          {'visual-state': {'first-line': 302,
         'selection_start': 13459,
         'selection_end': 13459},
-                          'display-font-size': {},
                           'last-window-loc': (208,
         107,
         1068,
-        896)}),
+        896),
+                          'display-font-size': {}}),
                         ('pangalactic/client/modules/dm/gidep_problem_adviso'\
                          'ry.py',
                          {'visual-state': {'first-line': 0,
         'selection_start': 0,
         'selection_end': 0},
-                          'display-font-size': {},
                           'last-window-loc': (0,
         28,
         650,
-        1000)}),
+        1000),
+                          'display-font-size': {}}),
                         ('pangalactic/client/modules/dm/nasa_advisory_gui.py',
                          {'visual-state': {'first-line': 247,
         'selection_start': 14139,
         'selection_end': 14143},
-                          'display-font-size': {},
                           'last-window-loc': (90,
         90,
         650,
-        1020)}),
+        1020),
+                          'display-font-size': {}}),
                         ('pangalactic/client/modules/dm/pgefadvisory.py',
                          {'visual-state': {'first-line': 0,
         'selection_start': 0,
         'selection_end': 0},
+                          'display-font-size': {},
                           'last-window-loc': (135,
         44,
         650,
-        1070),
-                          'display-font-size': {}}),
+        1070)}),
                         ('pangalactic/client/modules/plm/epimsevent.py',
-                         {'display-font-size': {},
-                          'last-window-loc': (60,
+                         {'last-window-loc': (60,
         60,
         650,
-        1050)}),
+        1050),
+                          'display-font-size': {}}),
                         ('pangalactic/client/modules/plm/epimsgrid.py',
-                         {'display-font-size': {},
-                          'last-window-loc': (609,
+                         {'last-window-loc': (609,
         55,
         650,
-        1040)}),
+        1040),
+                          'display-font-size': {}}),
                         ('pangalactic/client/modules/plm/ms2file.py',
                          {'visual-state': {'first-line': 23,
         'selection_start': 1541,
@@ -2352,65 +2371,65 @@
                          {'visual-state': {'first-line': 171,
         'selection_start': 7775,
         'selection_end': 7775},
-                          'display-font-size': {},
                           'last-window-loc': (560,
         7,
         650,
-        1090)}),
+        1090),
+                          'display-font-size': {}}),
                         ('pangalactic/client/modules/plm/plmtool.py',
                          {'visual-state': {'first-line': 18,
         'selection_start': 0,
         'selection_end': 0},
-                          'display-font-size': {},
                           'last-window-loc': (373,
         50,
         885,
-        1076)}),
+        1076),
+                          'display-font-size': {}}),
                         ('pangalactic/client/modules/psm/aboutbox.py',
                          {'visual-state': {'first-line': 0,
         'selection_start': 1193,
         'selection_end': 1193},
+                          'display-font-size': {},
                           'last-window-loc': (550,
         82,
         751,
-        1000),
-                          'display-font-size': {}}),
+        1000)}),
                         ('pangalactic/client/modules/psm/aboutbox_wdr.py',
                          {'visual-state': {'first-line': 0,
         'selection_start': 747,
         'selection_end': 747},
-                          'display-font-size': {},
                           'last-window-loc': (0,
         16,
         885,
-        1070)}),
+        1070),
+                          'display-font-size': {}}),
                         ('pangalactic/client/modules/psm/bitmaps.py',
                          {'visual-state': {'first-line': 19,
         'selection_start': 705,
         'selection_end': 705},
-                          'display-font-size': {},
                           'last-window-loc': (80,
         60,
         650,
-        1050)}),
+        1050),
+                          'display-font-size': {}}),
                         ('pangalactic/client/modules/psm/bitmaps_wdr.py',
                          {'visual-state': {'first-line': 0,
         'selection_start': 0,
         'selection_end': 0},
-                          'display-font-size': {},
                           'last-window-loc': (90,
         70,
         650,
-        1040)}),
+        1040),
+                          'display-font-size': {}}),
                         ('pangalactic/client/modules/psm/checkedoutgrid.py',
                          {'visual-state': {'first-line': 0,
         'selection_start': 107,
         'selection_end': 107},
+                          'display-font-size': {},
                           'last-window-loc': (414,
         46,
         924,
-        1000),
-                          'display-font-size': {}}),
+        1000)}),
                         ('pangalactic/client/modules/psm/clientgui.py',
                          {'visual-state': {'first-line': 2914,
         'selection_start': 1031,
@@ -2436,50 +2455,50 @@
                          {'visual-state': {'first-line': 58,
         'selection_start': 3372,
         'selection_end': 3372},
+                          'display-font-size': {},
                           'last-window-loc': (591,
         24,
         877,
-        1000),
-                          'display-font-size': {}}),
+        1000)}),
                         ('pangalactic/client/modules/psm/dataforms.wdr',
-                         {'display-font-size': {},
-                          'last-window-loc': (60,
+                         {'last-window-loc': (60,
         60,
         650,
-        1050)}),
+        1050),
+                          'display-font-size': {}}),
                         ('pangalactic/client/modules/psm/dataforms_wdr.py',
                          {'visual-state': {'first-line': 0,
         'selection_start': 59402,
         'selection_end': 59402},
-                          'display-font-size': {},
                           'last-window-loc': (127,
         75,
         650,
-        1036)}),
+        1036),
+                          'display-font-size': {}}),
                         ('pangalactic/client/modules/psm/docdroptarget.py',
                          {'visual-state': {'first-line': 0,
         'selection_start': 208,
         'selection_end': 208},
+                          'display-font-size': {},
                           'last-window-loc': (625,
         139,
         761,
-        806),
-                          'display-font-size': {}}),
+        806)}),
                         ('pangalactic/client/modules/psm/gridforms_wdr.py',
                          {'visual-state': {'first-line': 28,
         'selection_start': 0,
         'selection_end': 0},
-                          'display-font-size': {},
                           'last-window-loc': (190,
         88,
         801,
-        1040)}),
+        1040),
+                          'display-font-size': {}}),
                         ('pangalactic/client/modules/psm/gridformsgui.py',
-                         {'display-font-size': {},
-                          'last-window-loc': (80,
+                         {'last-window-loc': (80,
         80,
         650,
-        1030)}),
+        1030),
+                          'display-font-size': {}}),
                         ('pangalactic/client/modules/psm/hack.py',
                          {'last-window-loc': (60,
         60,
@@ -2489,279 +2508,284 @@
                          {'visual-state': {'first-line': 0,
         'selection_start': 921,
         'selection_end': 921},
+                          'display-font-size': {},
                           'last-window-loc': (473,
         9,
         765,
-        797),
-                          'display-font-size': {}}),
+        797)}),
                         ('pangalactic/client/modules/psm/itemdataform.wdr',
                          {'visual-state': {'first-line': 0,
         'selection_start': 0,
         'selection_end': 0},
-                          'display-font-size': {},
                           'last-window-loc': (100,
         90,
         650,
-        1020)}),
+        1020),
+                          'display-font-size': {}}),
                         ('pangalactic/client/modules/psm/itemdataform_wdr.py',
                          {'visual-state': {'first-line': 54,
         'selection_start': 3803,
         'selection_end': 3803},
-                          'display-font-size': {},
                           'last-window-loc': (130,
         110,
         650,
-        1000)}),
+        1000),
+                          'display-font-size': {}}),
                         ('pangalactic/client/modules/psm/itemdroptarget.py',
                          {'visual-state': {'first-line': 0,
         'selection_start': 34,
         'selection_end': 34},
+                          'display-font-size': {},
                           'last-window-loc': (597,
         254,
         916,
-        748),
-                          'display-font-size': {}}),
+        748)}),
                         ('pangalactic/client/modules/psm/itemeditframe.py',
-                         {'visual-state': {'first-line': 363,
-        'selection_start': 18109,
-        'selection_end': 18109},
-                          'display-font-size': {},
-                          'last-window-loc': (494,
-        22,
-        956,
-        933)}),
+                         {'visual-state': {'first-line': 0,
+        'selection_start': 196944,
+        'selection_end': 196944},
+                          'last-window-loc': (502,
+        129,
+        957,
+        933),
+                          'display-font-size': {}}),
                         ('pangalactic/client/modules/psm/itemsearchform.py',
                          {'visual-state': {'first-line': 68,
         'selection_start': 2,
         'selection_end': 2},
+                          'display-font-size': {},
                           'last-window-loc': (449,
         40,
         919,
-        1000),
-                          'display-font-size': {}}),
+        1000)}),
                         ('pangalactic/client/modules/psm/loginform.wdr',
                          {'visual-state': {'first-line': 0,
         'selection_start': 0,
         'selection_end': 0},
-                          'display-font-size': {},
                           'last-window-loc': (60,
         60,
         650,
-        1050)}),
+        1050),
+                          'display-font-size': {}}),
                         ('pangalactic/client/modules/psm/loginform_wdr.py',
                          {'visual-state': {'first-line': 0,
         'selection_start': 0,
         'selection_end': 0},
-                          'display-font-size': {},
                           'last-window-loc': (0,
         28,
         650,
-        1000)}),
+        1000),
+                          'display-font-size': {}}),
                         ('pangalactic/client/modules/psm/nedgrid.py',
-                         {'display-font-size': {},
-                          'last-window-loc': (375,
+                         {'last-window-loc': (375,
         36,
         1116,
-        824)}),
+        824),
+                          'display-font-size': {}}),
                         ('pangalactic/client/modules/psm/otherdocform.py',
                          {'visual-state': {'first-line': 100,
         'selection_start': 7615,
         'selection_end': 7615},
+                          'display-font-size': {},
                           'last-window-loc': (546,
         46,
         875,
-        1000),
-                          'display-font-size': {}}),
+        1000)}),
                         ('pangalactic/client/modules/psm/partslistform.py',
                          {'visual-state': {'first-line': 0,
         'selection_start': 1359,
         'selection_end': 1359},
-                          'display-font-size': {},
                           'last-window-loc': (407,
         32,
         870,
-        1000)}),
+        1000),
+                          'display-font-size': {}}),
                         ('pangalactic/client/modules/psm/partslisttreeframe.'\
                          'py',
                          {'visual-state': {'first-line': 0,
         'selection_start': 2207,
         'selection_end': 2207},
-                          'display-font-size': {},
                           'last-window-loc': (605,
         95,
         795,
-        933)}),
+        933),
+                          'display-font-size': {}}),
                         ('pangalactic/client/modules/psm/partslistview.py',
                          {'visual-state': {'first-line': 0,
         'selection_start': 0,
         'selection_end': 0},
-                          'display-font-size': {},
                           'last-window-loc': (544,
         17,
         650,
-        1070)}),
+        1070),
+                          'display-font-size': {}}),
                         ('pangalactic/client/modules/psm/pdmdoctree.py',
                          {'visual-state': {'first-line': 94,
         'selection_start': 5877,
         'selection_end': 5877},
-                          'display-font-size': {},
                           'last-window-loc': (419,
         302,
         650,
-        1078)}),
+        1078),
+                          'display-font-size': {}}),
                         ('pangalactic/client/modules/psm/pdmedittree.py',
                          {'visual-state': {'first-line': 0,
         'selection_start': 1911,
         'selection_end': 1919},
-                          'display-font-size': {},
                           'last-window-loc': (293,
         205,
         918,
-        915)}),
+        915),
+                          'display-font-size': {}}),
                         ('pangalactic/client/modules/psm/pdmgrid.py',
                          {'visual-state': {'first-line': 13,
         'selection_start': 2033,
         'selection_end': 2033},
-                          'display-font-size': {},
                           'last-window-loc': (482,
         64,
         900,
-        1000)}),
+        1000),
+                          'display-font-size': {}}),
                         ('pangalactic/client/modules/psm/pdmtree.py',
                          {'visual-state': {'first-line': 263,
         'selection_start': 11514,
         'selection_end': 11514},
-                          'display-font-size': {},
                           'last-window-loc': (518,
         45,
         872,
-        1000)}),
+        1000),
+                          'display-font-size': {}}),
                         ('pangalactic/client/modules/psm/pdmtreeevents.py',
-                         {'display-font-size': {},
-                          'last-window-loc': (110,
+                         {'last-window-loc': (110,
         110,
         650,
-        1000)}),
+        1000),
+                          'display-font-size': {}}),
                         ('pangalactic/client/modules/psm/pgefdatatable.py',
                          {'visual-state': {'first-line': 124,
         'selection_start': 7162,
         'selection_end': 7162},
+                          'display-font-size': {},
                           'last-window-loc': (311,
         35,
         788,
-        1045),
-                          'display-font-size': {}}),
+        1045)}),
                         ('pangalactic/client/modules/psm/pgefdoctree.py',
                          {'visual-state': {'first-line': 236,
         'selection_start': 10886,
         'selection_end': 10886},
-                          'display-font-size': {},
                           'last-window-loc': (474,
         52,
         650,
-        1060)}),
+        1060),
+                          'display-font-size': {}}),
                         ('pangalactic/client/modules/psm/pgefedittree.py',
-                         {'visual-state': {'first-line': 154,
+                         {'visual-state': {'first-line': 149,
         'selection_start': 8036,
         'selection_end': 8036},
-                          'display-font-size': {},
                           'last-window-loc': (519,
         99,
         969,
-        987)}),
+        987),
+                          'display-font-size': {}}),
                         ('pangalactic/client/modules/psm/pgefgrid.py',
-                         {'visual-state': {'first-line': 222,
-        'selection_start': 14313,
-        'selection_end': 14313},
-                          'display-font-size': {},
+                         {'visual-state': {'first-line': 0,
+        'selection_start': 19268,
+        'selection_end': 19268},
                           'last-window-loc': (442,
         114,
         941,
-        801)}),
+        801),
+                          'display-font-size': {}}),
                         ('pangalactic/client/modules/psm/pgefmaintree.py',
                          {'visual-state': {'first-line': 0,
         'selection_start': 0,
         'selection_end': 0},
-                          'display-font-size': {},
                           'last-window-loc': (110,
         70,
         650,
-        1040)}),
+        1040),
+                          'display-font-size': {}}),
                         ('pangalactic/client/modules/psm/pgeftree.py',
-                         {'visual-state': {'first-line': 275,
-        'selection_start': 13686,
-        'selection_end': 13686},
-                          'display-font-size': {},
-                          'last-window-loc': (415,
+                         {'visual-state': {'first-line': 209,
+        'selection_start': 10839,
+        'selection_end': 10864},
+                          'last-window-loc': (424,
         23,
         998,
-        971)}),
+        971),
+                          'display-font-size': {}}),
+                        ('pangalactic/client/modules/psm/pgefversiontree.py',
+                         {'visual-state': {'first-line': 47,
+        'selection_start': 3691,
+        'selection_end': 3691},
+                          'last-window-loc': (333,
+        120,
+        969,
+        987),
+                          'display-font-size': {}}),
                         ('pangalactic/client/modules/psm/productdataform.py',
-                         {'visual-state': {'first-line': 198,
-        'selection_start': 8168,
-        'selection_end': 8168},
-                          'breakpoints': {251: (0,
-        None,
-        1,
-        0)},
+                         {'visual-state': {'first-line': 0,
+        'selection_start': 1018,
+        'selection_end': 1018},
+                          'display-font-size': {},
                           'last-window-loc': (502,
         102,
         993,
-        875),
-                          'display-font-size': {}}),
+        875)}),
                         ('pangalactic/client/modules/psm/projectframe.py',
                          {'visual-state': {'first-line': 0,
         'selection_start': 0,
         'selection_end': 0},
-                          'display-font-size': {},
                           'last-window-loc': (50,
         50,
         650,
-        1060)}),
+        1060),
+                          'display-font-size': {}}),
                         ('pangalactic/client/modules/psm/propertiesform.py',
                          {'visual-state': {'first-line': 0,
         'selection_start': 1194,
         'selection_end': 1194},
+                          'display-font-size': {},
                           'last-window-loc': (568,
         215,
         997,
-        861),
-                          'display-font-size': {}}),
+        861)}),
                         ('pangalactic/client/modules/psm/psmevents.py',
-                         {'last-window-loc': (750,
+                         {'display-font-size': {},
+                          'last-window-loc': (750,
         255,
         704,
-        599),
-                          'display-font-size': {}}),
+        599)}),
                         ('pangalactic/client/modules/psm/psmtool.py',
-                         {'visual-state': {'first-line': 540,
-        'selection_start': 24797,
-        'selection_end': 24797},
+                         {'visual-state': {'first-line': 277,
+        'selection_start': 138606,
+        'selection_end': 138606},
                           'show-eol': 0,
-                          'display-font-size': {},
-                          'show-whitespace': 0,
-                          'last-window-loc': (406,
-        52,
+                          'last-window-loc': (415,
+        56,
         1034,
-        904)}),
+        904),
+                          'show-whitespace': 0,
+                          'display-font-size': {}}),
                         ('pangalactic/client/modules/psm/quickcreate.py',
                          {'visual-state': {'first-line': 0,
         'selection_start': 1752,
         'selection_end': 1752},
-                          'display-font-size': {},
                           'last-window-loc': (486,
         31,
         750,
-        1068)}),
+        1068),
+                          'display-font-size': {}}),
                         ('pangalactic/client/modules/psm/searchframe.py',
                          {'visual-state': {'first-line': 114,
         'selection_start': 8680,
         'selection_end': 8680},
-                          'display-font-size': {},
                           'last-window-loc': (0,
         28,
         894,
-        1000)}),
+        1000),
+                          'display-font-size': {}}),
                         ('pangalactic/client/modules/psm/temp.txt',
                          {'visual-state': {'first-line': 0,
         'selection_start': 0,
@@ -2770,29 +2794,29 @@
                          {'visual-state': {'first-line': 0,
         'selection_start': 224,
         'selection_end': 224},
-                          'display-font-size': {},
                           'last-window-loc': (179,
         40,
         650,
-        1080)}),
+        1080),
+                          'display-font-size': {}}),
                         ('pangalactic/client/modules/psm/toolbarpanel.py',
                          {'visual-state': {'first-line': 0,
         'selection_start': 1868,
         'selection_end': 1868},
+                          'display-font-size': {},
                           'last-window-loc': (440,
         167,
         814,
-        882),
-                          'display-font-size': {}}),
+        882)}),
                         ('pangalactic/client/modules/psm/toolpanel_wdr.py',
                          {'visual-state': {'first-line': 0,
         'selection_start': 0,
         'selection_end': 0},
+                          'display-font-size': {},
                           'last-window-loc': (70,
         70,
         650,
-        1040),
-                          'display-font-size': {}}),
+        1040)}),
                         ('pangalactic/client/nedtoolkit.py',
                          {'which-pyexec': {'linux': 'project'},
                           'which-rundir': {'linux': 'project'},
@@ -2816,29 +2840,29 @@
                          {'visual-state': {'first-line': 0,
         'selection_start': 0,
         'selection_end': 0},
-                          'display-font-size': {},
                           'last-window-loc': (835,
         18,
         650,
-        1070)}),
+        1070),
+                          'display-font-size': {}}),
                         ('pangalactic/client/pgpdm.cfg',
                          {'visual-state': {'first-line': 0,
         'selection_start': 34,
         'selection_end': 46},
-                          'display-font-size': {},
                           'last-window-loc': (539,
         277,
         650,
-        714)}),
+        714),
+                          'display-font-size': {}}),
                         ('pangalactic/client/pgpdm.log',
                          {'visual-state': {'first-line': 0,
         'selection_start': 141901,
         'selection_end': 141901},
-                          'display-font-size': {},
                           'last-window-loc': (163,
         212,
         1169,
-        862)}),
+        862),
+                          'display-font-size': {}}),
                         ('pangalactic/client/pgpdm.py',
                          {'visual-state': {'first-line': 1085,
         'selection_start': 180,
@@ -2980,60 +3004,60 @@
                           'visual-state': {'first-line': 0,
         'selection_start': 2,
         'selection_end': 2},
-                          'display-font-size': {},
-                          'show-whitespace': 0,
                           'last-window-loc': (372,
         241,
         996,
-        617)}),
+        617),
+                          'show-whitespace': 0,
+                          'display-font-size': {}}),
                         ('pangalactic/client/proxyclass.py',
-                         {'last-window-loc': (644,
+                         {'display-font-size': {},
+                          'last-window-loc': (644,
         182,
         650,
-        628),
-                          'display-font-size': {}}),
+        628)}),
                         ('pangalactic/client/setup.py',
                          {'visual-state': {'first-line': 0,
         'selection_start': 772,
         'selection_end': 772},
-                          'display-font-size': {},
                           'last-window-loc': (80,
         80,
         1137,
-        1030)}),
+        1030),
+                          'display-font-size': {}}),
                         ('pangalactic/client/support/SOAP.py',
-                         {'display-font-size': {},
-                          'last-window-loc': (111,
+                         {'last-window-loc': (111,
         110,
         650,
-        1000)}),
+        1000),
+                          'display-font-size': {}}),
                         ('pangalactic/client/support/configdbbrowser.py',
                          {'visual-state': {'first-line': 0,
         'selection_start': 145,
         'selection_end': 145},
+                          'display-font-size': {},
                           'last-window-loc': (269,
         159,
         877,
-        995),
-                          'display-font-size': {}}),
+        995)}),
                         ('pangalactic/client/support/configdbbrowser_wdr.py',
                          {'visual-state': {'first-line': 58,
         'selection_start': 9709,
         'selection_end': 9709},
-                          'display-font-size': {},
                           'last-window-loc': (483,
         68,
         759,
-        1050)}),
+        1050),
+                          'display-font-size': {}}),
                         ('pangalactic/client/support/convert.py',
                          {'visual-state': {'first-line': 0,
         'selection_start': 415,
         'selection_end': 415},
-                          'display-font-size': {},
                           'last-window-loc': (897,
         175,
         650,
-        684)}),
+        684),
+                          'display-font-size': {}}),
                         ('pangalactic/client/support/dbbrowser.py',
                          {'visual-state': {'first-line': 84,
         'selection_start': 3814,
@@ -3060,11 +3084,11 @@
                          {'visual-state': {'first-line': 0,
         'selection_start': 0,
         'selection_end': 0},
-                          'display-font-size': {},
                           'last-window-loc': (60,
         60,
         1160,
-        1050)}),
+        1050),
+                          'display-font-size': {}}),
                         ('pangalactic/client/support/documentation',
                          {'last-window-loc': (362,
         33,
@@ -3074,20 +3098,20 @@
                          {'visual-state': {'first-line': 64,
         'selection_start': 3416,
         'selection_end': 3416},
+                          'display-font-size': {},
                           'last-window-loc': (483,
         57,
         836,
-        1063),
-                          'display-font-size': {}}),
+        1063)}),
                         ('pangalactic/client/support/httpserverinterface.py',
                          {'visual-state': {'first-line': 0,
         'selection_start': 482,
         'selection_end': 482},
-                          'display-font-size': {},
                           'last-window-loc': (314,
         96,
         762,
-        1000)}),
+        1000),
+                          'display-font-size': {}}),
                         ('pangalactic/client/support/nedtoolkit_project_wing'\
                          'ide',
                          {'open-files': ['file:/home/bmuir/arena/pgpdm/datao'\
@@ -3103,15 +3127,6 @@
          31,
          340,
          963)),),
-                          'expr-history': ['import os',
-        'from pydoc import *',
-        'help(isinstance)',
-        'import unittest',
-        'help(unittest)',
-        'q',
-        'quit',
-        'dir()',
-        'dir(unittest)'],
                           'mgr-window-loc': {'Debug Properties: pgpdm.py (ar'\
         'ena/nedtoolkit)': (521,
                             332,
@@ -3186,8 +3201,8 @@
         46,
         650,
         1000),
-        'advisory.py (arena/pgpdm/io)': (235,
-        82,
+        'gridformsgui.py (arena/pgpdm/modules/psm)': (80,
+        80,
         650,
         1030),
         'item.py (arena/pgpdm/dataobjects)': (741,
@@ -3234,26 +3249,26 @@
         255,
         704,
         599),
-        'Suspicious Indentation in File': (545,
-        467,
-        510,
-        266),
-        'aboutbox.py (arena/pgpdm/modules/psm)': (550,
-        82,
-        751,
-        1000),
-        'convert.py (arena/pgpdm/support)': (897,
-        175,
-        650,
-        684),
         'unittestgui.py (arena/pgpdm/tests)': (70,
         70,
         650,
         1040),
+        'aboutbox.py (arena/pgpdm/modules/psm)': (550,
+        82,
+        751,
+        1000),
         'Debugger': (4,
                      28,
                      650,
                      993),
+        'Suspicious Indentation in File': (545,
+        467,
+        510,
+        266),
+        'convert.py (arena/pgpdm/support)': (897,
+        175,
+        650,
+        684),
         'loginform.wdr (arena/pgpdm/modules/psm)': (60,
         60,
         650,
@@ -3262,10 +3277,10 @@
         51,
         650,
         1070),
-        'Debug Properties: nedtoolkit.py (arena/nedtoolkit)': (297,
-        164,
-        557,
-        536),
+        'searchframe.py (arena/pgpdm/modules/psm)': (370,
+        86,
+        954,
+        1000),
         'tasks.txt (arena/pgpdm/support)': (422,
         39,
         976,
@@ -3286,6 +3301,10 @@
         60,
         650,
         1050),
+        'loginform_wdr.py (arena/pgpdm/modules/psm)': (0,
+        28,
+        650,
+        1000),
         'itemsearchform.py (arena/pgpdm/modules/psm)': (435,
         49,
         650,
@@ -3298,10 +3317,10 @@
                                  300,
                                  600,
                                  600),
-        'proxy.txt': (30,
-                      79,
-                      650,
-                      1080),
+        'test_nasa_advisory.py (arena/pgpdm/tests)': (422,
+        55,
+        1063,
+        1000),
         'Debug Properties: pgpdm.py (arena/pgpdm)': (521,
         332,
         614,
@@ -3330,10 +3349,6 @@
         150,
         500,
         400),
-        'Source Browser': (364,
-                           27,
-                           650,
-                           752),
         'unittest.py (arena/pgpdm/tests)': (95,
         64,
         650,
@@ -3358,10 +3373,10 @@
                           60,
                           650,
                           1050),
-        'objectreport.py (arena/pgpdm/io)': (404,
-        94,
-        963,
-        794),
+        'tasks.txt (arena/pgpdm)': (369,
+                                    44,
+                                    650,
+                                    1090),
         'gridforms_wdr.py (arena/pgpdm/modules/psm)': (190,
         88,
         801,
@@ -3378,10 +3393,10 @@
         70,
         650,
         1040),
-        'ToolkitImages.py (arena/pgpdm/images)': (60,
-        40,
-        650,
-        1070),
+        'test_pdmobject.py (arena/pgpdm/support)': (475,
+        90,
+        919,
+        724),
         'psmtool.py (arena/pgpdm_old/modules/psm)': (80,
         80,
         650,
@@ -3418,10 +3433,10 @@
         13,
         754,
         1000),
-        'Project: untitled_1.wpr': (54,
-                                    44,
-                                    340,
-                                    1090),
+        'clientgui.py (arena/pgpdm/modules/psm) #1': (332,
+        84,
+        1120,
+        673),
         'basewxpythontest.py (arena/pgpdm/tests)': (750,
         96,
         650,
@@ -3454,14 +3469,14 @@
         90,
         858,
         983),
-        'Project: nedserver_project (arena/ned_server)': (28,
-        24,
-        340,
+        'acrobatwrapper.py (arena/pgpdm/io)': (182,
+        5,
+        875,
         1090),
-        'loginclass.py (arena/pgpdm)': (560,
-        150,
-        746,
-        966),
+        'Confirm overwrite': (545,
+                              550,
+                              510,
+                              100),
         'Attach to Debug Process': (547,
                                     435,
                                     506,
@@ -3518,8 +3533,8 @@
                                  6,
                                  650,
                                  1000),
-        'gridformsgui.py (arena/pgpdm/modules/psm)': (80,
-        80,
+        'advisory.py (arena/pgpdm/io)': (235,
+        82,
         650,
         1030),
         'oid_doc.txt': (324,
@@ -3538,10 +3553,10 @@
                                       161,
                                       650,
                                       1010),
-        'searchframe.py (arena/pgpdm/modules/psm)': (370,
-        86,
-        954,
-        1000),
+        'Debug Properties: nedtoolkit.py (arena/nedtoolkit)': (297,
+        164,
+        557,
+        536),
         'Disk file is newer': (545,
                                546,
                                510,
@@ -3550,10 +3565,10 @@
                              100,
                              441,
                              1000),
-        'aboutbox_wdr.py (arena/pgpdm/tests/modules/psm)': (671,
-        29,
-        871,
-        1000),
+        'Source Browser': (364,
+                           27,
+                           650,
+                           752),
         'Debug Properties: clientgui.py (arena/nedtoolkit/modules/psm)': (521,
         332,
         557,
@@ -3562,18 +3577,18 @@
                             30,
                             340,
                             718),
-        'clientgui.py (arena/pgpdm/modules/psm) #1': (332,
-        84,
-        1120,
-        673),
+        'Project: untitled_1.wpr': (54,
+                                    44,
+                                    340,
+                                    1090),
         'nauo.py (arena/pgpdm/dataobjects)': (701,
         167,
         650,
         875),
-        'Confirm overwrite': (545,
-                              550,
-                              510,
-                              100),
+        'loginclass.py (arena/pgpdm)': (560,
+        150,
+        746,
+        966),
         'properties.py (/usr/lib/python2.1/site-packages/logging)': (60,
         60,
         650,
@@ -3639,18 +3654,18 @@
         108,
         935,
         966),
-        'acrobatwrapper.py (arena/pgpdm/io)': (182,
-        5,
-        875,
+        'Project: nedserver_project (arena/ned_server)': (28,
+        24,
+        340,
         1090),
         'test_pdmobject.py (arena/pgpdm/tests)': (386,
         36,
         650,
         1000),
-        'test_datamanager.py (arena/pgpdm/tests)': (477,
-        25,
-        838,
-        861),
+        'bitmaps_wdr.py (arena/pgpdm/modules/psm)': (90,
+        70,
+        650,
+        1040),
         'rdbinterface.py (arena/ned_server)': (338,
         41,
         650,
@@ -3683,18 +3698,18 @@
         124,
         949,
         836),
-        'test_nasa_advisory.py (arena/pgpdm/tests)': (422,
-        55,
-        1063,
-        1000),
+        'proxy.txt': (30,
+                      79,
+                      650,
+                      1080),
         'epimsproject.py (arena/pgpdm/dataobjects)': (239,
         259,
         759,
         642),
-        'test_pdmobject.py (arena/pgpdm/support)': (475,
-        90,
-        919,
-        724),
+        'ToolkitImages.py (arena/pgpdm/images)': (60,
+        40,
+        650,
+        1070),
         'clientgui.py (arena/pgpdm/modules/psm)': (369,
         374,
         1120,
@@ -3747,10 +3762,14 @@
                                     30,
                                     295,
                                     1000),
-        'bitmaps_wdr.py (arena/pgpdm/modules/psm)': (90,
-        70,
-        650,
-        1040),
+        'aboutbox_wdr.py (arena/pgpdm/tests/modules/psm)': (671,
+        29,
+        871,
+        1000),
+        'test_datamanager.py (arena/pgpdm/tests)': (477,
+        25,
+        838,
+        861),
         'Project: herbtutor.wpr (arena/herbtutor)': (16,
         34,
         340,
@@ -3791,10 +3810,6 @@
         60,
         650,
         1050),
-        'objectreport.py (arena/pgpdm)': (835,
-        18,
-        650,
-        1070),
         'runall.py (arena/pgpdm/tests)': (660,
         60,
         650,
@@ -3851,10 +3866,10 @@
         107,
         970,
         945),
-        'tasks.txt (arena/pgpdm)': (369,
-                                    44,
-                                    650,
-                                    1090),
+        'objectreport.py (arena/pgpdm/io)': (404,
+        94,
+        963,
+        794),
         'Bad file name': (545,
                           550,
                           510,
@@ -3871,10 +3886,10 @@
                                        45,
                                        1037,
                                        1000),
-        'loginform_wdr.py (arena/pgpdm/modules/psm)': (0,
-        28,
+        'objectreport.py (arena/pgpdm)': (835,
+        18,
         650,
-        1000),
+        1070),
         'Could not start debug process': (545,
         553,
         510,
@@ -3914,7 +3929,16 @@
         'test_user.py (arena/pgpdm/tests)': (401,
         21,
         893,
-        1000)}}),
+        1000)},
+                          'expr-history': ['import os',
+        'from pydoc import *',
+        'help(isinstance)',
+        'import unittest',
+        'help(unittest)',
+        'q',
+        'quit',
+        'dir()',
+        'dir(unittest)']}),
                         ('pangalactic/client/support/pgefclient_wingide',
                          {'mgr-window-loc': {'Project: pgefclient_wingide (a'\
         'rena/PanGalactic/pangalactic/client/support)': (35,
@@ -3933,11 +3957,11 @@
                          {'visual-state': {'first-line': 0,
         'selection_start': 0,
         'selection_end': 0},
-                          'display-font-size': {},
                           'last-window-loc': (703,
         221,
         650,
-        470)}),
+        470),
+                          'display-font-size': {}}),
                         ('pangalactic/client/support/security_temp.py',
                          {'visual-state': {'first-line': 0,
         'selection_start': 14,
@@ -3950,28 +3974,28 @@
                          {'visual-state': {'first-line': 0,
         'selection_start': 0,
         'selection_end': 0},
+                          'display-font-size': {},
                           'last-window-loc': (686,
         115,
         650,
-        932),
-                          'display-font-size': {}}),
+        932)}),
                         ('pangalactic/client/support/sessionlog1.py',
-                         {'last-window-loc': (429,
+                         {'display-font-size': {},
+                          'last-window-loc': (429,
         67,
         650,
-        932),
-                          'display-font-size': {}}),
+        932)}),
                         ('pangalactic/client/support/tasks.txt',
                          {'visual-state': {'first-line': 167,
         'selection_start': 16153,
         'selection_end': 16153},
                           'show-eol': 0,
-                          'display-font-size': {},
-                          'show-whitespace': 0,
                           'last-window-loc': (262,
         17,
         1166,
-        1015)}),
+        1015),
+                          'show-whitespace': 0,
+                          'display-font-size': {}}),
                         ('pangalactic/client/support/test_itemsearchform.py',
                          {'visual-state': {'first-line': 0,
         'selection_start': 700,
@@ -3992,65 +4016,65 @@
                          {'visual-state': {'first-line': 0,
         'selection_start': 0,
         'selection_end': 0},
-                          'display-font-size': {},
                           'last-window-loc': (791,
         147,
         650,
-        510)}),
+        510),
+                          'display-font-size': {}}),
                         ('pangalactic/client/support/unknown:untitled-1.py',
                          {'visual-state': {'first-line': 0,
         'selection_start': 81,
         'selection_end': 81},
                           'show-eol': 0,
-                          'display-font-size': {'linux': ('lucidatypewriter',
-        24)},
-                          'show-whitespace': 0,
                           'last-window-loc': (362,
         33,
         911,
-        1090)}),
+        1090),
+                          'show-whitespace': 0,
+                          'display-font-size': {'linux': ('lucidatypewriter',
+        24)}}),
                         ('pangalactic/client/support/unknown:untitled-2.py',
                          {'visual-state': {'first-line': 0,
         'selection_start': 0,
         'selection_end': 0},
-                          'display-font-size': {},
                           'last-window-loc': (60,
         60,
         650,
-        1050)}),
+        1050),
+                          'display-font-size': {}}),
                         ('pangalactic/client/support/unknown:untitled-3.py',
-                         {'display-font-size': {},
-                          'last-window-loc': (825,
+                         {'last-window-loc': (825,
         128,
         650,
-        574)}),
+        574),
+                          'display-font-size': {}}),
                         ('pangalactic/client/support/unknown:untitled-4.py',
-                         {'display-font-size': {},
-                          'last-window-loc': (755,
+                         {'last-window-loc': (755,
         196,
         761,
-        806)}),
+        806),
+                          'display-font-size': {}}),
                         ('pangalactic/client/support/unknown:untitled-5.py',
                          {'visual-state': {'first-line': 0,
         'selection_start': 55,
         'selection_end': 55},
-                          'display-font-size': {},
                           'last-window-loc': (640,
         140,
         650,
-        876)}),
+        876),
+                          'display-font-size': {}}),
                         ('pangalactic/client/support/unknown:untitled-6.py',
-                         {'display-font-size': {},
-                          'last-window-loc': (80,
+                         {'last-window-loc': (80,
         70,
         650,
-        1040)}),
+        1040),
+                          'display-font-size': {}}),
                         ('pangalactic/client/support/unknown:untitled-7.py',
-                         {'display-font-size': {},
-                          'last-window-loc': (417,
+                         {'last-window-loc': (417,
         225,
         1136,
-        861)}),
+        861),
+                          'display-font-size': {}}),
                         ('pangalactic/client/support/unknown:untitled_1.wpr',
                          {'open-files': []}),
                         ('pangalactic/client/support/unknown:untitled_2.wpr',
@@ -4059,66 +4083,66 @@
                          {'visual-state': {'first-line': 0,
         'selection_start': 200,
         'selection_end': 200},
-                          'display-font-size': {},
                           'last-window-loc': (447,
         146,
         650,
-        971)}),
+        971),
+                          'display-font-size': {}}),
                         ('pangalactic/client/support/xmlrpclib_orig.py',
                          {'visual-state': {'first-line': 831,
         'selection_start': 28416,
         'selection_end': 28416},
+                          'display-font-size': {},
                           'last-window-loc': (518,
         34,
         768,
-        1000),
-                          'display-font-size': {}}),
+        1000)}),
                         ('pangalactic/client/support/xmlrpclib_proxy.py',
                          {'visual-state': {'first-line': 960,
         'selection_start': 33811,
         'selection_end': 33811},
                           'show-eol': 0,
+                          'display-font-size': {},
+                          'show-whitespace': 0,
                           'last-window-loc': (420,
         28,
         761,
-        829),
-                          'show-whitespace': 0,
-                          'display-font-size': {}}),
+        829)}),
                         ('pangalactic/client/tasks.txt',
                          {'show-eol': 1,
-                          'display-font-size': {},
-                          'show-whitespace': 1,
                           'last-window-loc': (369,
         44,
         650,
-        1090)}),
+        1090),
+                          'show-whitespace': 1,
+                          'display-font-size': {}}),
                         ('pangalactic/client/temp/aboutbox.py',
                          {'visual-state': {'first-line': 0,
         'selection_start': 929,
         'selection_end': 929},
-                          'display-font-size': {},
                           'last-window-loc': (114,
         34,
         650,
-        1000)}),
+        1000),
+                          'display-font-size': {}}),
                         ('pangalactic/client/temp/aboutbox_wdr.py',
                          {'visual-state': {'first-line': 0,
         'selection_start': 1353,
         'selection_end': 1353},
-                          'display-font-size': {},
                           'last-window-loc': (794,
         36,
         650,
-        1060)}),
+        1060),
+                          'display-font-size': {}}),
                         ('pangalactic/client/temp/test_aboutbox.py',
                          {'visual-state': {'first-line': 0,
         'selection_start': 0,
         'selection_end': 598},
-                          'display-font-size': {},
                           'last-window-loc': (361,
         78,
         650,
-        1050)}),
+        1050),
+                          'display-font-size': {}}),
                         ('pangalactic/client/temptest.py',
                          {'visual-state': {'first-line': 0,
         'selection_start': 118,
@@ -4146,20 +4170,20 @@
                          {'visual-state': {'first-line': 0,
         'selection_start': 1994,
         'selection_end': 1994},
-                          'display-font-size': {},
                           'last-window-loc': (372,
         32,
         960,
-        995)}),
+        995),
+                          'display-font-size': {}}),
                         ('pangalactic/client/tests/baseobjecttest.py',
                          {'visual-state': {'first-line': 0,
         'selection_start': 1816,
         'selection_end': 1816},
-                          'display-font-size': {},
                           'last-window-loc': (271,
         188,
         749,
-        898)}),
+        898),
+                          'display-font-size': {}}),
                         ('pangalactic/client/tests/basewxpythontest.py',
                          {'visual-state': {'first-line': 0,
         'selection_start': 140,
@@ -4173,20 +4197,20 @@
                          {'visual-state': {'first-line': 11,
         'selection_start': 2702,
         'selection_end': 2702},
-                          'display-font-size': {},
                           'last-window-loc': (671,
         29,
         871,
-        1000)}),
+        1000),
+                          'display-font-size': {}}),
                         ('pangalactic/client/tests/objecttestcase.py',
                          {'visual-state': {'first-line': 0,
         'selection_start': 419,
         'selection_end': 419},
-                          'display-font-size': {},
                           'last-window-loc': (563,
         262,
         876,
-        767)}),
+        767),
+                          'display-font-size': {}}),
                         ('pangalactic/client/tests/runall.py',
                          {'visual-state': {'first-line': 0,
         'selection_start': 857,
@@ -4315,527 +4339,545 @@
                          {'visual-state': {'first-line': 0,
         'selection_start': 0,
         'selection_end': 0},
-                          'display-font-size': {},
                           'last-window-loc': (415,
         50,
         650,
-        1000)}),
+        1000),
+                          'display-font-size': {}}),
                         ('pangalactic/client/tests/test_datamanager.py',
                          {'visual-state': {'first-line': 0,
         'selection_start': 2,
         'selection_end': 2},
+                          'display-font-size': {},
                           'last-window-loc': (0,
         28,
         650,
-        1000),
-                          'display-font-size': {}}),
+        1000)}),
                         ('pangalactic/client/tests/test_epimsproject.py',
                          {'visual-state': {'first-line': 0,
         'selection_start': 69,
         'selection_end': 69},
+                          'display-font-size': {},
                           'last-window-loc': (769,
         104,
         650,
-        1000),
-                          'display-font-size': {}}),
+        1000)}),
                         ('pangalactic/client/tests/test_gidep_alert.py',
                          {'visual-state': {'first-line': 0,
         'selection_start': 57,
         'selection_end': 57},
-                          'display-font-size': {},
                           'last-window-loc': (0,
         28,
         650,
-        1000)}),
+        1000),
+                          'display-font-size': {}}),
                         ('pangalactic/client/tests/test_gidep_problem_adviso'\
                          'ry.py',
                          {'visual-state': {'first-line': 0,
         'selection_start': 68,
         'selection_end': 68},
-                          'display-font-size': {},
                           'last-window-loc': (0,
         28,
         650,
-        1000)}),
+        1000),
+                          'display-font-size': {}}),
                         ('pangalactic/client/tests/test_idr.py',
                          {'visual-state': {'first-line': 0,
         'selection_start': 663,
         'selection_end': 663},
-                          'display-font-size': {},
                           'last-window-loc': (367,
         79,
         650,
-        1000)}),
+        1000),
+                          'display-font-size': {}}),
                         ('pangalactic/client/tests/test_item.py',
                          {'visual-state': {'first-line': 0,
         'selection_start': 2471,
         'selection_end': 2508},
+                          'display-font-size': {},
                           'last-window-loc': (117,
         19,
         650,
-        1000),
-                          'display-font-size': {}}),
+        1000)}),
                         ('pangalactic/client/tests/test_itemdataform.py',
                          {'visual-state': {'first-line': 3,
         'selection_start': 2278,
         'selection_end': 2342},
+                          'display-font-size': {},
                           'last-window-loc': (483,
         83,
         920,
-        1000),
-                          'display-font-size': {}}),
+        1000)}),
                         ('pangalactic/client/tests/test_itemeditframe.py',
                          {'visual-state': {'first-line': 0,
         'selection_start': 2,
         'selection_end': 2},
+                          'display-font-size': {},
                           'last-window-loc': (0,
         28,
         650,
-        1000),
-                          'display-font-size': {}}),
+        1000)}),
                         ('pangalactic/client/tests/test_itemsearchform.py',
                          {'visual-state': {'first-line': 0,
         'selection_start': 891,
         'selection_end': 891},
-                          'display-font-size': {},
                           'last-window-loc': (654,
         95,
         650,
-        1000)}),
+        1000),
+                          'display-font-size': {}}),
                         ('pangalactic/client/tests/test_localdb.py',
                          {'visual-state': {'first-line': 0,
         'selection_start': 689,
         'selection_end': 689},
+                          'display-font-size': {},
                           'last-window-loc': (692,
         83,
         650,
-        697),
-                          'display-font-size': {}}),
+        697)}),
                         ('pangalactic/client/tests/test_loginform.py',
                          {'visual-state': {'first-line': 0,
         'selection_start': 121,
         'selection_end': 121},
+                          'display-font-size': {},
                           'last-window-loc': (876,
         488,
         650,
-        1000),
-                          'display-font-size': {}}),
+        1000)}),
                         ('pangalactic/client/tests/test_nasa_advisory.py',
                          {'visual-state': {'first-line': 0,
         'selection_start': 843,
         'selection_end': 843},
-                          'display-font-size': {},
                           'last-window-loc': (422,
         55,
         1063,
-        1000)}),
+        1000),
+                          'display-font-size': {}}),
                         ('pangalactic/client/tests/test_nauo.py',
                          {'visual-state': {'first-line': 0,
         'selection_start': 146,
         'selection_end': 146},
-                          'display-font-size': {},
                           'last-window-loc': (391,
         276,
         650,
-        852)}),
+        852),
+                          'display-font-size': {}}),
                         ('pangalactic/client/tests/test_otherdocform.py',
                          {'visual-state': {'first-line': 34,
         'selection_start': 4862,
         'selection_end': 4862},
+                          'display-font-size': {},
                           'last-window-loc': (372,
         65,
         920,
-        984),
-                          'display-font-size': {}}),
+        984)}),
                         ('pangalactic/client/tests/test_part.py',
                          {'visual-state': {'first-line': 0,
         'selection_start': 266,
         'selection_end': 266},
-                          'display-font-size': {},
                           'last-window-loc': (440,
         21,
         650,
-        1000)}),
+        1000),
+                          'display-font-size': {}}),
                         ('pangalactic/client/tests/test_partslist.py',
                          {'visual-state': {'first-line': 0,
         'selection_start': 97,
         'selection_end': 97},
-                          'display-font-size': {},
                           'last-window-loc': (497,
         33,
         831,
-        1000)}),
+        1000),
+                          'display-font-size': {}}),
                         ('pangalactic/client/tests/test_partslistform.py',
                          {'visual-state': {'first-line': 0,
         'selection_start': 157,
         'selection_end': 183},
+                          'display-font-size': {},
                           'last-window-loc': (306,
         150,
         1139,
-        991),
-                          'display-font-size': {}}),
+        991)}),
                         ('pangalactic/client/tests/test_pdmobject.py',
                          {'visual-state': {'first-line': 0,
         'selection_start': 17,
         'selection_end': 17},
-                          'display-font-size': {},
                           'last-window-loc': (386,
         36,
         650,
-        1000)}),
+        1000),
+                          'display-font-size': {}}),
                         ('pangalactic/client/tests/test_person.py',
                          {'visual-state': {'first-line': 0,
         'selection_start': 63,
         'selection_end': 63},
-                          'display-font-size': {},
                           'last-window-loc': (0,
         28,
         650,
-        1000)}),
+        1000),
+                          'display-font-size': {}}),
                         ('pangalactic/client/tests/test_pgefobject.py',
                          {'visual-state': {'first-line': 0,
         'selection_start': 42,
         'selection_end': 42},
-                          'display-font-size': {},
                           'last-window-loc': (0,
         28,
         650,
-        1000)}),
+        1000),
+                          'display-font-size': {}}),
                         ('pangalactic/client/tests/test_pgpdm.py',
                          {'visual-state': {'first-line': 0,
         'selection_start': 677,
         'selection_end': 677},
+                          'display-font-size': {},
                           'last-window-loc': (447,
         16,
         650,
-        1000),
-                          'display-font-size': {}}),
+        1000)}),
                         ('pangalactic/client/tests/test_product.py',
                          {'visual-state': {'first-line': 0,
         'selection_start': 260,
         'selection_end': 260},
-                          'display-font-size': {},
                           'last-window-loc': (0,
         28,
         650,
-        1000)}),
+        1000),
+                          'display-font-size': {}}),
                         ('pangalactic/client/tests/test_propertiesform.py',
                          {'visual-state': {'first-line': 0,
         'selection_start': 890,
         'selection_end': 890},
-                          'display-font-size': {},
                           'last-window-loc': (387,
         58,
         650,
-        1000)}),
+        1000),
+                          'display-font-size': {}}),
                         ('pangalactic/client/tests/test_psmtool.py',
                          {'visual-state': {'first-line': 0,
         'selection_start': 944,
         'selection_end': 944},
+                          'display-font-size': {},
                           'last-window-loc': (706,
         53,
         792,
-        823),
-                          'display-font-size': {}}),
+        823)}),
                         ('pangalactic/client/tests/test_user.py',
                          {'visual-state': {'first-line': 1,
         'selection_start': 265,
         'selection_end': 265},
-                          'display-font-size': {},
                           'last-window-loc': (351,
         36,
         650,
-        1000)}),
+        1000),
+                          'display-font-size': {}}),
                         ('pangalactic/client/tests/test_xmlrpcinterface.py',
                          {'visual-state': {'first-line': 0,
         'selection_start': 146,
         'selection_end': 146},
-                          'display-font-size': {},
                           'last-window-loc': (80,
         60,
         650,
-        1050)}),
+        1050),
+                          'display-font-size': {}}),
                         ('pangalactic/client/tests/unittest.py',
                          {'visual-state': {'first-line': 0,
         'selection_start': 49742,
         'selection_end': 49742},
-                          'display-font-size': {},
                           'last-window-loc': (95,
         64,
         650,
-        1000)}),
+        1000),
+                          'display-font-size': {}}),
                         ('pangalactic/client/tests/unittestgui.py',
                          {'visual-state': {'first-line': 0,
         'selection_start': 0,
         'selection_end': 0},
-                          'display-font-size': {},
                           'last-window-loc': (70,
         70,
         650,
-        1040)}),
+        1040),
+                          'display-font-size': {}}),
                         ('pangalactic/client/toolframe.py',
                          {'visual-state': {'first-line': 35,
         'selection_start': 1954,
         'selection_end': 1954},
-                          'display-font-size': {},
                           'last-window-loc': (336,
         45,
         1037,
-        1000)}),
+        1000),
+                          'display-font-size': {}}),
                         ('pangalactic/client/wxButtonBar.py',
-                         {'display-font-size': {},
-                          'last-window-loc': (100,
+                         {'last-window-loc': (100,
         100,
         650,
-        1010)}),
+        1010),
+                          'display-font-size': {}}),
                         ('pangalactic/common/assemblycomponentusage.py',
                          {'visual-state': {'first-line': 0,
         'selection_start': 5766,
         'selection_end': 5766},
-                          'display-font-size': {},
                           'last-window-loc': (0,
         626,
         650,
-        1080)}),
+        1080),
+                          'display-font-size': {}}),
                         ('pangalactic/common/document.py',
                          {'visual-state': {'first-line': 0,
         'selection_start': 0,
         'selection_end': 0},
-                          'display-font-size': {},
                           'last-window-loc': (40,
         30,
         650,
-        1080)}),
+        1080),
+                          'display-font-size': {}}),
                         ('pangalactic/common/link.py',
                          {'visual-state': {'first-line': 0,
         'selection_start': 285,
         'selection_end': 285},
-                          'display-font-size': {},
                           'last-window-loc': (203,
         52,
         650,
-        1080)}),
+        1080),
+                          'display-font-size': {}}),
                         ('pangalactic/common/nauo.py',
                          {'visual-state': {'first-line': 0,
         'selection_start': 0,
         'selection_end': 0},
-                          'display-font-size': {},
                           'last-window-loc': (30,
         10,
         650,
-        1090)}),
+        1090),
+                          'display-font-size': {}}),
                         ('pangalactic/common/partslistfilerelationship.py',
                          {'visual-state': {'first-line': 0,
         'selection_start': 0,
         'selection_end': 0},
-                          'display-font-size': {},
                           'last-window-loc': (30,
         20,
         650,
-        1090)}),
+        1090),
+                          'display-font-size': {}}),
                         ('pangalactic/common/person.py',
                          {'visual-state': {'first-line': 0,
         'selection_start': 1679,
         'selection_end': 1679},
-                          'display-font-size': {},
                           'last-window-loc': (424,
         130,
         650,
-        990)}),
+        990),
+                          'display-font-size': {}}),
                         ('pangalactic/common/pgefobject.py',
                          {'visual-state': {'first-line': 0,
         'selection_start': 1234,
         'selection_end': 1234},
-                          'display-font-size': {},
                           'last-window-loc': (595,
         9,
         650,
-        1000)}),
+        1000),
+                          'display-font-size': {}}),
                         ('pangalactic/common/product.py',
                          {'visual-state': {'first-line': 0,
         'selection_start': 1064,
         'selection_end': 1064},
-                          'display-font-size': {},
                           'last-window-loc': (426,
         162,
         650,
-        958)}),
+        958),
+                          'display-font-size': {}}),
                         ('pangalactic/common/productcomponentusage.py',
                          {'visual-state': {'first-line': 0,
         'selection_start': 430,
         'selection_end': 430},
-                          'display-font-size': {},
                           'last-window-loc': (624,
         129,
         650,
-        1000)}),
+        1000),
+                          'display-font-size': {}}),
                         ('pangalactic/common/productfilerelationship.py',
                          {'visual-state': {'first-line': 0,
         'selection_start': 0,
         'selection_end': 0},
-                          'display-font-size': {},
                           'last-window-loc': (100,
         100,
         650,
-        1010)}),
+        1010),
+                          'display-font-size': {}}),
                         ('pangalactic/common/productmaster.py',
                          {'visual-state': {'first-line': 64,
         'selection_start': 4554,
         'selection_end': 4554},
-                          'display-font-size': {},
                           'last-window-loc': (71,
         111,
         650,
-        1000)}),
+        1000),
+                          'display-font-size': {}}),
                         ('pangalactic/common/productmodelmaster.py',
                          {'visual-state': {'first-line': 90,
         'selection_start': 4477,
         'selection_end': 4477},
-                          'display-font-size': {},
                           'last-window-loc': (478,
         164,
         650,
-        713)}),
+        713),
+                          'display-font-size': {}}),
                         ('pangalactic/common/productmodelversion.py',
                          {'visual-state': {'first-line': 0,
         'selection_start': 1165,
         'selection_end': 1165},
-                          'display-font-size': {},
                           'last-window-loc': (131,
         101,
         650,
-        883)}),
+        883),
+                          'display-font-size': {}}),
                         ('pangalactic/common/productversion.py',
                          {'visual-state': {'first-line': 86,
         'selection_start': 4325,
         'selection_end': 4325},
-                          'display-font-size': {},
                           'last-window-loc': (413,
         44,
         650,
-        1000)}),
+        1000),
+                          'display-font-size': {}}),
                         ('pangalactic/common/project.py',
                          {'visual-state': {'first-line': 29,
         'selection_start': 0,
         'selection_end': 0},
-                          'display-font-size': {},
                           'last-window-loc': (411,
         138,
         650,
-        982)}),
+        982),
+                          'display-font-size': {}}),
                         ('pangalactic/common/role.py',
                          {'visual-state': {'first-line': 0,
         'selection_start': 0,
         'selection_end': 0},
-                          'display-font-size': {},
                           'last-window-loc': (90,
         90,
         650,
-        1020)}),
+        1020),
+                          'display-font-size': {}}),
                         ('pangalactic/common/utils/datamanager.py',
                          {'visual-state': {'first-line': 0,
         'selection_start': 261,
         'selection_end': 261},
+                          'display-font-size': {},
                           'last-window-loc': (522,
         27,
         846,
-        752),
-                          'display-font-size': {}}),
+        752)}),
                         ('pangalactic/common/utils/dbbrowser.py',
                          {'visual-state': {'first-line': 111,
         'selection_start': 6011,
         'selection_end': 6016},
-                          'display-font-size': {},
                           'last-window-loc': (100,
         100,
         650,
-        1010)}),
+        1010),
+                          'display-font-size': {}}),
                         ('pangalactic/common/utils/localdb.py',
                          {'visual-state': {'first-line': 105,
         'selection_start': 5263,
         'selection_end': 5263},
+                          'display-font-size': {},
                           'last-window-loc': (30,
         20,
         650,
-        1090),
-                          'display-font-size': {}}),
+        1090)}),
                         ('pangalactic/common/utils/pgefdatatable.py',
                          {'visual-state': {'first-line': 0,
         'selection_start': 1169,
         'selection_end': 1174},
-                          'display-font-size': {},
                           'last-window-loc': (40,
         40,
         650,
-        1070)}),
+        1070),
+                          'display-font-size': {}}),
                         ('pangalactic/enterprise/pgefadvisory.py',
                          {'visual-state': {'first-line': 0,
         'selection_start': 0,
         'selection_end': 0},
+                          'display-font-size': {},
                           'last-window-loc': (60,
         60,
         848,
-        1050),
-                          'display-font-size': {}}),
+        1050)}),
                         ('pangalactic/enterprise/pgefobject.py',
                          {'visual-state': {'first-line': 0,
         'selection_start': 0,
         'selection_end': 0},
+                          'display-font-size': {},
                           'last-window-loc': (50,
         50,
         650,
-        1060),
-                          'display-font-size': {}}),
-                        ('pangalactic/enterprise/productmodelversion.py',
-                         {'visual-state': {'first-line': 21,
+        1060)}),
+                        ('pangalactic/enterprise/productmaster.py',
+                         {'visual-state': {'first-line': 0,
         'selection_start': 0,
         'selection_end': 0},
-                          'display-font-size': {},
+                          'last-window-loc': (60,
+        40,
+        650,
+        1070),
+                          'display-font-size': {}}),
+                        ('pangalactic/enterprise/productmodelmaster.py',
+                         {'visual-state': {'first-line': 83,
+        'selection_start': 4948,
+        'selection_end': 4948},
+                          'last-window-loc': (70,
+        50,
+        650,
+        1060),
+                          'display-font-size': {}}),
+                        ('pangalactic/enterprise/productmodelversion.py',
+                         {'visual-state': {'first-line': 112,
+        'selection_start': 5665,
+        'selection_end': 5665},
                           'last-window-loc': (40,
         30,
         650,
-        1080)}),
+        1080),
+                          'display-font-size': {}}),
                         ('pangalactic/enterprise/productversion.py',
-                         {'visual-state': {'first-line': 75,
+                         {'visual-state': {'first-line': 96,
         'selection_start': 0,
         'selection_end': 0},
+                          'display-font-size': {},
                           'last-window-loc': (110,
         110,
         650,
-        1000),
-                          'display-font-size': {}}),
+        1000)}),
                         ('pangalactic/herbtutor/Cayenne.txt',
-                         {'display-font-size': {},
-                          'last-window-loc': (4,
+                         {'last-window-loc': (4,
         55,
         650,
-        1090)}),
+        1090),
+                          'display-font-size': {}}),
                         ('pangalactic/herbtutor/Cayenne.xml',
-                         {'display-font-size': {},
-                          'last-window-loc': (30,
+                         {'last-window-loc': (30,
         30,
         650,
-        1080)}),
+        1080),
+                          'display-font-size': {}}),
                         ('pangalactic/herbtutor/MENU.PY',
-                         {'display-font-size': {},
-                          'last-window-loc': (40,
+                         {'last-window-loc': (40,
         40,
         650,
-        680)}),
+        680),
+                          'display-font-size': {}}),
                         ('pangalactic/herbtutor/herbs',
-                         {'display-font-size': {},
-                          'last-window-loc': (763,
+                         {'last-window-loc': (763,
         256,
         650,
-        700)}),
+        700),
+                          'display-font-size': {}}),
                         ('pangalactic/herbtutor/herbtutor.py',
                          {'show-eol': 0,
-                          'display-font-size': {},
-                          'show-whitespace': 0,
                           'last-window-loc': (430,
         116,
         777,
-        635)}),
+        635),
+                          'show-whitespace': 0,
+                          'display-font-size': {}}),
                         ('pangalactic/herbtutor/herbtutor.wpr',
                          {'open-files': [],
                           'mgr-window-loc': {'Project: untitled_3.wpr': (28,
@@ -4862,34 +4904,34 @@
         24,
         340,
         1090)},
-                          'display-font-size': {},
                           'last-window-loc': (382,
         51,
         650,
-        1090)}),
+        1090),
+                          'display-font-size': {}}),
                         ('pangalactic/herbtutor/herbxml.py',
-                         {'display-font-size': {},
-                          'last-window-loc': (571,
+                         {'last-window-loc': (571,
         5,
         774,
-        1121)}),
+        1121),
+                          'display-font-size': {}}),
                         ('pangalactic/herbtutor/menu.py',
-                         {'display-font-size': {},
-                          'last-window-loc': (489,
+                         {'last-window-loc': (489,
         64,
         650,
-        1060)}),
+        1060),
+                          'display-font-size': {}}),
                         ('pangalactic/herbtutor/test.py',
                          {'last-window-loc': (103,
         77,
         650,
         1050)}),
                         ('pangalactic/herbtutor/unknown:untitled-1.py',
-                         {'display-font-size': {},
-                          'last-window-loc': (254,
+                         {'last-window-loc': (254,
         82,
         650,
-        635)}),
+        635),
+                          'display-font-size': {}}),
                         ('pangalactic/herbtutor/unknown:untitled_1.wpr',
                          {'open-files': []}),
                         ('pangalactic/herbtutor/unknown:untitled_2.wpr',
@@ -4897,77 +4939,77 @@
                         ('pangalactic/herbtutor/unknown:untitled_3.wpr',
                          {'open-files': []}),
                         ('pangalactic/ned_client/client.py',
-                         {'display-font-size': {},
-                          'last-window-loc': (137,
+                         {'last-window-loc': (137,
         27,
         742,
-        754)}),
+        754),
+                          'display-font-size': {}}),
                         ('pangalactic/ned_client/clientgui.py',
-                         {'display-font-size': {},
-                          'last-window-loc': (129,
+                         {'last-window-loc': (129,
         58,
         922,
-        734)}),
+        734),
+                          'display-font-size': {}}),
                         ('pangalactic/ned_client/dataforms_wdr.py',
-                         {'display-font-size': {},
-                          'last-window-loc': (80,
+                         {'last-window-loc': (80,
         80,
         650,
-        694)}),
+        694),
+                          'display-font-size': {}}),
                         ('pangalactic/ned_client/httpserverinterface.py',
-                         {'display-font-size': {},
-                          'last-window-loc': (175,
+                         {'last-window-loc': (175,
         14,
         797,
-        754)}),
+        754),
+                          'display-font-size': {}}),
                         ('pangalactic/ned_client/modules/plm/ms2filemain.py',
-                         {'display-font-size': {},
-                          'last-window-loc': (110,
+                         {'last-window-loc': (110,
         110,
         650,
-        664)}),
+        664),
+                          'display-font-size': {}}),
                         ('pangalactic/ned_client/modules/plm/plmtool.py',
-                         {'display-font-size': {},
-                          'last-window-loc': (365,
+                         {'last-window-loc': (365,
         29,
         650,
-        754)}),
+        754),
+                          'display-font-size': {}}),
                         ('pangalactic/ned_client/modules/psm/clientgui.py',
-                         {'display-font-size': {},
-                          'last-window-loc': (114,
+                         {'last-window-loc': (114,
         45,
         999,
-        726)}),
+        726),
+                          'display-font-size': {}}),
                         ('pangalactic/ned_client/modules/psm/psmtool.py',
-                         {'display-font-size': {},
-                          'last-window-loc': (184,
+                         {'last-window-loc': (184,
         31,
         783,
-        724)}),
+        724),
+                          'display-font-size': {}}),
                         ('pangalactic/ned_client/ned/constants.py',
-                         {'display-font-size': {},
-                          'last-window-loc': (172,
+                         {'last-window-loc': (172,
         62,
         650,
-        754)}),
+        754),
+                          'display-font-size': {}}),
                         ('pangalactic/ned_client/ned/datamanager.py',
-                         {'display-font-size': {},
-                          'last-window-loc': (50,
+                         {'last-window-loc': (50,
         40,
         650,
-        734)}),
+        734),
+                          'display-font-size': {}}),
                         ('pangalactic/ned_client/ned/item.py',
-                         {'display-font-size': {},
-                          'last-window-loc': (104,
+                         {'last-window-loc': (104,
         112,
         692,
-        705)}),
+        705),
+                          'display-font-size': {}}),
                         ('pangalactic/ned_client/ned/partslist.py',
-                         {'display-font-size': {},
-                          'last-window-loc': (214,
+                         {'last-window-loc': (214,
         84,
         1008,
-        536)}),
+        536),
+                          'display-font-size': {}}),
                         ('pangalactic/ned_client/ned_client',
                          {'open-files': [],
                           'mgr-window-loc': {'Source Browser': (375,
@@ -4979,61 +5021,61 @@
                             340,
                             751)}}),
                         ('pangalactic/ned_client/nedtoolkit.py',
-                         {'display-font-size': {},
-                          'last-window-loc': (152,
+                         {'last-window-loc': (152,
         62,
         897,
-        724)}),
+        724),
+                          'display-font-size': {}}),
                         ('pangalactic/ned_client/pdmtool.py',
-                         {'display-font-size': {},
-                          'last-window-loc': (40,
+                         {'last-window-loc': (40,
         40,
         857,
-        734)}),
+        734),
+                          'display-font-size': {}}),
                         ('pangalactic/ned_client/psmtool.py',
-                         {'display-font-size': {},
-                          'last-window-loc': (166,
+                         {'last-window-loc': (166,
         34,
         875,
-        714)}),
+        714),
+                          'display-font-size': {}}),
                         ('pangalactic/ned_client/unknown:untitled-1.py',
-                         {'display-font-size': {},
-                          'last-window-loc': (790,
+                         {'last-window-loc': (790,
         79,
         650,
-        704)}),
+        704),
+                          'display-font-size': {}}),
                         ('pangalactic/ned_client/unknown:untitled-2.py',
-                         {'display-font-size': {},
-                          'last-window-loc': (40,
+                         {'last-window-loc': (40,
         30,
         847,
-        744)}),
+        744),
+                          'display-font-size': {}}),
                         ('pangalactic/ned_client/unknown:untitled_1.wpr',
                          {'open-files': []}),
                         ('pangalactic/ned_client/wxButtonBar.py',
-                         {'display-font-size': {},
-                          'last-window-loc': (110,
+                         {'last-window-loc': (110,
         110,
         890,
-        664)}),
+        664),
+                          'display-font-size': {}}),
                         ('pangalactic/ned_data_objects/datamanager.py',
-                         {'display-font-size': {},
-                          'last-window-loc': (30,
+                         {'last-window-loc': (30,
         30,
         650,
-        744)}),
+        744),
+                          'display-font-size': {}}),
                         ('pangalactic/ned_data_objects/item.py',
-                         {'display-font-size': {},
-                          'last-window-loc': (521,
+                         {'last-window-loc': (521,
         73,
         650,
-        724)}),
+        724),
+                          'display-font-size': {}}),
                         ('pangalactic/ned_data_objects/nauo.py',
-                         {'display-font-size': {},
-                          'last-window-loc': (100,
+                         {'last-window-loc': (100,
         31,
         650,
-        744)}),
+        744),
+                          'display-font-size': {}}),
                         ('pangalactic/ned_server/ned_server',
                          {'open-files': [],
                           'mgr-window-loc': {'Source Browser': (375,
@@ -5058,11 +5100,11 @@
          340,
          831)),)}),
                         ('pangalactic/ned_server/nedbroker.py',
-                         {'display-font-size': {},
-                          'last-window-loc': (30,
+                         {'last-window-loc': (30,
         30,
         650,
-        744)}),
+        744),
+                          'display-font-size': {}}),
                         ('pangalactic/ned_server/nedserver_project',
                          {'open-files': [],
                           'mgr-window-loc': {'Project: nedserver_project (ar'\
@@ -5074,76 +5116,76 @@
                          {'visual-state': {'first-line': 243,
         'selection_start': 9763,
         'selection_end': 9763},
-                          'display-font-size': {},
                           'last-window-loc': (338,
         41,
         650,
-        754)}),
+        754),
+                          'display-font-size': {}}),
                         ('pangalactic/ned_server/unknown:untitled_1.wpr',
                          {'open-files': []}),
                         ('pangalactic/ned_server/unknown:untitled_2.wpr',
                          {'open-files': []}),
                         ('pangalactic/nedold/modules/psm/clientgui.py',
-                         {'display-font-size': {},
-                          'last-window-loc': (30,
+                         {'last-window-loc': (30,
         30,
         650,
-        1080)}),
+        1080),
+                          'display-font-size': {}}),
                         ('pangalactic/nedtoolkit/dataobjects/constants.py',
-                         {'display-font-size': {},
-                          'last-window-loc': (97,
+                         {'last-window-loc': (97,
         59,
         650,
-        754)}),
+        754),
+                          'display-font-size': {}}),
                         ('pangalactic/nedtoolkit/dataobjects/datamanager.py',
-                         {'display-font-size': {},
-                          'last-window-loc': (385,
+                         {'last-window-loc': (385,
         28,
         650,
-        754)}),
+        754),
+                          'display-font-size': {}}),
                         ('pangalactic/nedtoolkit/dataobjects/item.py',
-                         {'display-font-size': {},
-                          'last-window-loc': (71,
+                         {'last-window-loc': (71,
         83,
         650,
-        714)}),
+        714),
+                          'display-font-size': {}}),
                         ('pangalactic/nedtoolkit/dataobjects/nedobject.py',
-                         {'display-font-size': {},
-                          'last-window-loc': (401,
+                         {'last-window-loc': (401,
         53,
         650,
-        724)}),
+        724),
+                          'display-font-size': {}}),
                         ('pangalactic/nedtoolkit/modules/psm/clientgui.py',
-                         {'display-font-size': {},
-                          'last-window-loc': (380,
+                         {'last-window-loc': (380,
         31,
         811,
-        1089)}),
+        1089),
+                          'display-font-size': {}}),
                         ('pangalactic/nedtoolkit/modules/psm/gridforms_wdr.p'\
                          'y',
-                         {'display-font-size': {},
-                          'last-window-loc': (70,
+                         {'last-window-loc': (70,
         70,
         650,
-        1040)}),
+        1040),
+                          'display-font-size': {}}),
                         ('pangalactic/nedtoolkit/modules/psm/gridformsgui.py',
-                         {'display-font-size': {},
-                          'last-window-loc': (80,
+                         {'last-window-loc': (80,
         80,
         650,
-        1030)}),
+        1030),
+                          'display-font-size': {}}),
                         ('pangalactic/nedtoolkit/modules/psm/nedgrid.py',
-                         {'display-font-size': {},
-                          'last-window-loc': (815,
+                         {'last-window-loc': (815,
         33,
         650,
-        1069)}),
+        1069),
+                          'display-font-size': {}}),
                         ('pangalactic/nedtoolkit/modules/psm/psmtool.py',
-                         {'display-font-size': {},
-                          'last-window-loc': (30,
+                         {'last-window-loc': (30,
         30,
         650,
-        744)}),
+        744),
+                          'display-font-size': {}}),
                         ('pangalactic/nedtoolkit/nedtoolkit.py',
                          {'which-pyexec': {'linux': 'project'},
                           'which-rundir': {'linux': 'project'},
@@ -5169,11 +5211,11 @@
         1090)}),
                         ('pangalactic/nedtoolkit/support/httpserverinterface'\
                          '.py',
-                         {'display-font-size': {},
-                          'last-window-loc': (420,
+                         {'last-window-loc': (420,
         28,
         845,
-        754)}),
+        754),
+                          'display-font-size': {}}),
                         ('pangalactic/nedtoolkit/support/nedtoolkit_project_'\
                          'wingide',
                          {'open-files': [],
@@ -5209,13 +5251,13 @@
                         ('pangalactic/nedtoolkit/support/unknown:untitled-1.'\
                          'py',
                          {'show-eol': 0,
-                          'display-font-size': {'linux': ('lucidatypewriter',
-        24)},
-                          'show-whitespace': 0,
                           'last-window-loc': (362,
         33,
         911,
-        1090)}),
+        1090),
+                          'show-whitespace': 0,
+                          'display-font-size': {'linux': ('lucidatypewriter',
+        24)}}),
                         ('pangalactic/nedtoolkit/support/unknown:untitled_1.'\
                          'wpr',
                          {'open-files': []}),
@@ -5223,11 +5265,11 @@
                          {'visual-state': {'first-line': 372,
         'selection_start': 17113,
         'selection_end': 17113},
-                          'display-font-size': {},
                           'last-window-loc': (80,
         80,
         650,
-        1030)}),
+        1030),
+                          'display-font-size': {}}),
                         ('pangalactic/pgpdm_test/support/nedtoolkit_project_'\
                          'wingide',
                          {'open-windows': (('manager',
@@ -5249,134 +5291,170 @@
                          {'visual-state': {'first-line': 0,
         'selection_start': 311,
         'selection_end': 311},
-                          'display-font-size': {},
                           'last-window-loc': (509,
         42,
         928,
-        1000)}),
+        1000),
+                          'display-font-size': {}}),
                         ('pangalactic/tools/xlate_list.py_new',
                          {'visual-state': {'first-line': 0,
         'selection_start': 0,
         'selection_end': 0},
-                          'display-font-size': {},
                           'last-window-loc': (862,
         78,
         650,
-        1040)}),
+        1040),
+                          'display-font-size': {}}),
                         ('pangalactic/tools/xlator.py',
                          {'visual-state': {'first-line': 0,
         'selection_start': 334,
         'selection_end': 334},
-                          'display-font-size': {},
                           'last-window-loc': (425,
         31,
         866,
-        1000)}),
+        1000),
+                          'display-font-size': {}}),
+                        ('pangalactic/utils/basegrid.py',
+                         {'visual-state': {'first-line': 187,
+        'selection_start': 7413,
+        'selection_end': 7413},
+                          'last-window-loc': (287,
+        53,
+        650,
+        1060),
+                          'display-font-size': {}}),
+                        ('pangalactic/utils/configdbbrowser.py',
+                         {'visual-state': {'first-line': 143,
+        'selection_start': 0,
+        'selection_end': 0},
+                          'last-window-loc': (343,
+        48,
+        828,
+        1000),
+                          'display-font-size': {}}),
                         ('pangalactic/utils/customizegrid_wdr.py',
                          {'visual-state': {'first-line': 0,
         'selection_start': 0,
         'selection_end': 0},
+                          'display-font-size': {},
                           'last-window-loc': (20,
         10,
         650,
-        1090),
+        1090)}),
+                        ('pangalactic/utils/data_utils.py',
+                         {'visual-state': {'first-line': 3,
+        'selection_start': 645,
+        'selection_end': 1392},
+                          'last-window-loc': (485,
+        137,
+        1039,
+        936),
                           'display-font-size': {}}),
                         ('pangalactic/utils/datamanager.py',
-                         {'visual-state': {'first-line': 0,
-        'selection_start': 64109,
-        'selection_end': 64109},
-                          'last-window-loc': (398,
-        43,
+                         {'visual-state': {'first-line': 812,
+        'selection_start': 9745,
+        'selection_end': 9795},
+                          'display-font-size': {},
+                          'last-window-loc': (407,
+        47,
         1053,
-        1040),
-                          'display-font-size': {}}),
+        1040)}),
                         ('pangalactic/utils/localdb.py',
-                         {'visual-state': {'first-line': 279,
-        'selection_start': 11885,
-        'selection_end': 11893},
-                          'last-window-loc': (445,
-        63,
-        835,
-        1050),
-                          'display-font-size': {}}),
+                         {'visual-state': {'first-line': 1498,
+        'selection_start': 35786,
+        'selection_end': 35786},
+                          'display-font-size': {},
+                          'last-window-loc': (454,
+        67,
+        961,
+        1050)}),
                         ('pangalactic/utils/objectreport.py',
                          {'visual-state': {'first-line': 14,
         'selection_start': 2953,
         'selection_end': 2953},
+                          'display-font-size': {},
                           'last-window-loc': (666,
         61,
         750,
-        1008),
-                          'display-font-size': {}}),
+        1008)}),
                         ('pangalactic/utils/pdfreport.py',
                          {'visual-state': {'first-line': 0,
         'selection_start': 1761,
         'selection_end': 1761},
+                          'display-font-size': {},
                           'last-window-loc': (501,
         15,
         825,
-        1090),
-                          'display-font-size': {}}),
+        1090)}),
                         ('pangalactic/utils/pgefdatatable.py',
                          {'visual-state': {'first-line': 6,
         'selection_start': 1389,
         'selection_end': 1389},
+                          'display-font-size': {},
                           'last-window-loc': (408,
         15,
         850,
-        1080),
-                          'display-font-size': {}}),
-                        ('pangalactic/utils/xmlrpcinterface.py',
-                         {'visual-state': {'first-line': 0,
-        'selection_start': 0,
-        'selection_end': 0},
-                          'last-window-loc': (512,
-        32,
+        1080)}),
+                        ('pangalactic/utils/pystrptime.py',
+                         {'visual-state': {'first-line': 435,
+        'selection_start': 875,
+        'selection_end': 875},
+                          'display-font-size': {},
+                          'last-window-loc': (100,
+        100,
         650,
-        1066),
-                          'display-font-size': {}}),
+        1010)}),
+                        ('pangalactic/utils/xmlrpcinterface.py',
+                         {'visual-state': {'first-line': 54,
+        'selection_start': 2213,
+        'selection_end': 2213},
+                          'display-font-size': {},
+                          'last-window-loc': (521,
+        36,
+        953,
+        1066)}),
                         ('proxy.txt',
                          {'visual-state': {'first-line': 16,
         'selection_start': 4388,
         'selection_end': 4419},
-                          'display-font-size': {},
                           'last-window-loc': (30,
         79,
         650,
-        1080)}),
+        1080),
+                          'display-font-size': {}}),
                         ('tambo1.txt',
                          {'visual-state': {'first-line': 0,
         'selection_start': 1457,
         'selection_end': 1457},
-                          'display-font-size': {},
                           'last-window-loc': (420,
         399,
         650,
-        711)}),
+        711),
+                          'display-font-size': {}}),
                         ('temp/unnamed_wdr.py',
                          {'visual-state': {'first-line': 0,
         'selection_start': 1979,
         'selection_end': 2040},
-                          'display-font-size': {},
                           'last-window-loc': (20,
         20,
         650,
-        1090)}),
+        1090),
+                          'display-font-size': {}}),
                         ('unknown:untitled-1.py',
-                         {'display-font-size': {},
-                          'last-window-loc': (712,
+                         {'last-window-loc': (712,
         299,
         758,
-        626)}),
+        626),
+                          'display-font-size': {}}),
                         ('unknown:untitled-2.py',
                          {'visual-state': {'first-line': 0,
         'selection_start': 19,
         'selection_end': 19},
-                          'display-font-size': {},
                           'last-window-loc': (80,
         80,
         650,
-        1030)}),
+        1030),
+                          'display-font-size': {}}),
                         ('unknown:untitled_2.wpr',
                          {'open-windows': (('manager',
         (('Project: untitled_2.wpr',
@@ -5394,20 +5472,20 @@
          551,
          708)),)}),
                         ('unnamed_wdr.py',
-                         {'display-font-size': {},
-                          'last-window-loc': (215,
+                         {'last-window-loc': (215,
         35,
         650,
-        754)}),
+        754),
+                          'display-font-size': {}}),
                         ('xmlrpclib-1.0.1/xmlrpclib_proxy.py',
                          {'visual-state': {'first-line': 1193,
         'selection_start': 39617,
         'selection_end': 39617},
-                          'display-font-size': {},
                           'last-window-loc': (475,
         19,
         916,
-        1080)})]
+        1080),
+                          'display-font-size': {}})]
 version = '1.0'
 which-console = {'linux': 'default'}
 which-env-vars = {'linux': 'default'}

From bmuir at ned.gsfc.nasa.gov  Tue Oct  7 15:03:38 2003
From: bmuir at ned.gsfc.nasa.gov (bmuir CVS)
Date: Tue Oct  7 14:03:39 2003
Subject: [Pangalactic-commits] added versiontree to repository
Message-ID: <200310071803.h97I3co6004551@ned.gsfc.nasa.gov>

Modified files:
PanGalactic/pangalactic/client/modules/psm/pgefversiontree.py None 1.1

Log message:
added versiontree to repository


From bmuir at ned.gsfc.nasa.gov  Tue Oct  7 15:06:48 2003
From: bmuir at ned.gsfc.nasa.gov (bmuir CVS)
Date: Tue Oct  7 14:06:50 2003
Subject: [Pangalactic-commits] removed some debug prints
Message-ID: <200310071806.h97I6mgh004652@ned.gsfc.nasa.gov>

Modified files:
PanGalactic/pangalactic/client/modules/psm/pgefversiontree.py 1.1 1.2
PanGalactic/pangalactic/utils/localdb.py 1.34 1.35

Log message:
removed some debug prints


Index: PanGalactic/pangalactic/utils/localdb.py
diff -u PanGalactic/pangalactic/utils/localdb.py:1.34 PanGalactic/pangalactic/utils/localdb.py:1.35
--- PanGalactic/pangalactic/utils/localdb.py:1.34	Tue Oct  7 13:59:04 2003
+++ PanGalactic/pangalactic/utils/localdb.py	Tue Oct  7 14:06:47 2003
@@ -1538,7 +1538,6 @@
     def getPvByPm(self, pm_id, pm_context):
         results = []
         dict_contents = self.dbroot[self.PVBYPRIMARYKEY].items()
-        print 'pvbyprimary:',dict_contents
         for key, object in dict_contents:
             if key[:-1] == (pm_id, pm_context):
                 results.append(object)

Index: PanGalactic/pangalactic/client/modules/psm/pgefversiontree.py
diff -u PanGalactic/pangalactic/client/modules/psm/pgefversiontree.py:1.1 PanGalactic/pangalactic/client/modules/psm/pgefversiontree.py:1.2
--- PanGalactic/pangalactic/client/modules/psm/pgefversiontree.py:1.1	Tue Oct  7 14:03:36 2003
+++ PanGalactic/pangalactic/client/modules/psm/pgefversiontree.py	Tue Oct  7 14:06:46 2003
@@ -159,7 +159,6 @@
             
         
         objs = datamanager.getVersionTreeObjects(version_obj)
-        print 'tree objs:',objs
         
         if objs: 
             self.SetItemHasChildren(version_node, true)
@@ -182,17 +181,4 @@
             self.Expand(pv_treeid)
         if temp_pmm:
             self.Expand(pmm_treeid)
-            
-
-        #if objs: 
-            #self.SetItemHasChildren(rootnode, true)
-
-            #for obj in objs:
-                #if obj.state <> objectstatus.DELETE:
-                    
-                    #foo = obj.of_pm_id + "." + obj.of_pm_id_context
-                    #treeid = self.AppendItem(rootnode, foo)
-                    #self.SetPyData(treeid, ['version', obj.pgef_oid])
-                    #self.SetItemImage(treeid, self.itemicon)
-                    #self.SetItemImage(treeid, self.itemicon, wxTreeItemIcon_Selected)            
-            #self.Expand(rootnode)
+ 

From bmuir at ned.gsfc.nasa.gov  Tue Oct  7 15:12:32 2003
From: bmuir at ned.gsfc.nasa.gov (bmuir CVS)
Date: Tue Oct  7 14:12:33 2003
Subject: [Pangalactic-commits] fixed names in version tree
Message-ID: <200310071812.h97ICW57004815@ned.gsfc.nasa.gov>

Modified files:
PanGalactic/pangalactic/client/modules/psm/pgefversiontree.py 1.2 1.3
PanGalactic/pangalactic/utils/datamanager.py 1.38 1.39

Log message:
fixed names in version tree


Index: PanGalactic/pangalactic/client/modules/psm/pgefversiontree.py
diff -u PanGalactic/pangalactic/client/modules/psm/pgefversiontree.py:1.2 PanGalactic/pangalactic/client/modules/psm/pgefversiontree.py:1.3
--- PanGalactic/pangalactic/client/modules/psm/pgefversiontree.py:1.2	Tue Oct  7 14:06:46 2003
+++ PanGalactic/pangalactic/client/modules/psm/pgefversiontree.py	Tue Oct  7 14:12:30 2003
@@ -150,7 +150,7 @@
             version_node = pv_treeid
             
         if temp_pmm:
-            spam = temp_pm.id + "." + temp_pm.id_context + '.' + temp_pmm.id
+            spam = temp_pm.id + "." + temp_pm.id_context + '.' + temp_pv.id + '.' + temp_pmm.id
             pmm_treeid = self.AppendItem(pv_treeid, spam)
             self.Expand(pmm_treeid)
             version_obj = temp_pmm

Index: PanGalactic/pangalactic/utils/datamanager.py
diff -u PanGalactic/pangalactic/utils/datamanager.py:1.38 PanGalactic/pangalactic/utils/datamanager.py:1.39
--- PanGalactic/pangalactic/utils/datamanager.py:1.38	Tue Oct  7 13:59:04 2003
+++ PanGalactic/pangalactic/utils/datamanager.py	Tue Oct  7 14:12:30 2003
@@ -1,6 +1,6 @@
 # $Source: /repo/step_testbed/PanGalactic/pangalactic/utils/datamanager.py,v $
 
-__version__ = "$Revision: 1.38 $"[11:-2]
+__version__ = "$Revision: 1.39 $"[11:-2]
 
 import time
 import mx.DateTime
@@ -101,7 +101,7 @@
             product_master = ProductMaster(id = PartNumber,
                                            project_id = self.currentProject,
                                            id_context = self.currentProject)
-            print product_master
+            #print product_master
             
         if product_master and Revision:
             #print 'Creating product version'
@@ -109,7 +109,7 @@
                                              project_id = self.currentProject,
                                              id = Revision,
                                              id_context = self.currentProject)
-            print product_version
+            #print product_version
             
         if product_version and ModelType:
             #print 'Creating product model master'

From bmuir at ned.gsfc.nasa.gov  Tue Oct  7 15:19:20 2003
From: bmuir at ned.gsfc.nasa.gov (bmuir CVS)
Date: Tue Oct  7 14:19:22 2003
Subject: [Pangalactic-commits] removed prints from data-utils
Message-ID: <200310071819.h97IJKAV004999@ned.gsfc.nasa.gov>

Modified files:
PanGalactic/pangalactic/utils/data_utils.py 1.5 1.6

Log message:
removed prints from data-utils


Index: PanGalactic/pangalactic/utils/data_utils.py
diff -u PanGalactic/pangalactic/utils/data_utils.py:1.5 PanGalactic/pangalactic/utils/data_utils.py:1.6
--- PanGalactic/pangalactic/utils/data_utils.py:1.5	Tue Oct  7 13:59:04 2003
+++ PanGalactic/pangalactic/utils/data_utils.py	Tue Oct  7 14:19:19 2003
@@ -6,10 +6,10 @@
 from pangalactic.enterprise.docrep                 import DocRep
 
 def createCompoundKey(obj):
+    print obj
     # if we have a pmv, compound key is
     # (id, of_pmm_id, of_pv_id, of_pm_id, of_pm_id_context)
         
-#    if obj.__class__.__name__ == 'ProductModelVersion':
     if obj.__class__.__name__ == 'ProductModelVersion':
         # DEBUGGING
         # print "creating compound key for obj of class %s" % obj.__class__.__name__
@@ -23,14 +23,7 @@
     elif obj.__class__.__name__ == 'ProductMaster':
         temp = (obj.id)
         
-        
-        #print temp
     return temp
-    #else:
-    #    print '---------------------------------------------'
-    #    print 'create compoundkey: returning None'
-    #    print '---------------------------------------------'
-    
 
 def createACUSearchByComponent(acu_obj):
     search_str = []

From bmuir at ned.gsfc.nasa.gov  Tue Oct  7 15:23:06 2003
From: bmuir at ned.gsfc.nasa.gov (bmuir CVS)
Date: Tue Oct  7 14:23:07 2003
Subject: [Pangalactic-commits] added obj checknig in save object
Message-ID: <200310071823.h97IN6Bn005065@ned.gsfc.nasa.gov>

Modified files:
PanGalactic/pangalactic/utils/localdb.py 1.35 1.36

Log message:
added obj checknig in save object


Index: PanGalactic/pangalactic/utils/localdb.py
diff -u PanGalactic/pangalactic/utils/localdb.py:1.35 PanGalactic/pangalactic/utils/localdb.py:1.36
--- PanGalactic/pangalactic/utils/localdb.py:1.35	Tue Oct  7 14:06:47 2003
+++ PanGalactic/pangalactic/utils/localdb.py	Tue Oct  7 14:23:05 2003
@@ -973,14 +973,17 @@
             self.dbroot[savedict][id] = obj
             self.dbroot[self.OIDLOOKUP][obj.pgef_oid] = savedict
             #print "saved local object", savedict, id
-            compound_key = data_utils.createCompoundKey(obj)
-            print 'compound_key is:', compound_key
-            self.saveCompoundKey(obj, compound_key)
+            if obj.__class__.__name__ in ['ProductModelVersion', 'ProductModelMaster', 'ProductVersion', 'ProductMaster']:
+                compound_key = data_utils.createCompoundKey(obj)
+                #print 'compound_key is:', compound_key
+                self.saveCompoundKey(obj, compound_key)
         except Exception, e:
             print "Eek.  An EXCEPTION.  localdb.saveObject"
             print e
             import traceback
             traceback.print_exc()
+            
+    
 
     def saveCompoundKey(self, obj, key):
         if obj.__class__.__name__ == 'ProductModelVersion':

From bmuir at ned.gsfc.nasa.gov  Tue Oct  7 15:24:24 2003
From: bmuir at ned.gsfc.nasa.gov (bmuir CVS)
Date: Tue Oct  7 14:24:25 2003
Subject: [Pangalactic-commits] remove the print yet again
Message-ID: <200310071824.h97IOO1d005124@ned.gsfc.nasa.gov>

Modified files:
PanGalactic/pangalactic/utils/data_utils.py 1.6 1.7

Log message:
remove the print yet again


Index: PanGalactic/pangalactic/utils/data_utils.py
diff -u PanGalactic/pangalactic/utils/data_utils.py:1.6 PanGalactic/pangalactic/utils/data_utils.py:1.7
--- PanGalactic/pangalactic/utils/data_utils.py:1.6	Tue Oct  7 14:19:19 2003
+++ PanGalactic/pangalactic/utils/data_utils.py	Tue Oct  7 14:24:22 2003
@@ -6,7 +6,7 @@
 from pangalactic.enterprise.docrep                 import DocRep
 
 def createCompoundKey(obj):
-    print obj
+    #print obj
     # if we have a pmv, compound key is
     # (id, of_pmm_id, of_pv_id, of_pm_id, of_pm_id_context)
         

From bmuir at ned.gsfc.nasa.gov  Tue Oct  7 15:27:51 2003
From: bmuir at ned.gsfc.nasa.gov (bmuir CVS)
Date: Tue Oct  7 14:27:52 2003
Subject: [Pangalactic-commits] removed cruft
Message-ID: <200310071827.h97IRp2W005176@ned.gsfc.nasa.gov>

Modified files:
PanGalactic/pangalactic/utils/localdb.py 1.36 1.37

Log message:
removed cruft


Index: PanGalactic/pangalactic/utils/localdb.py
diff -u PanGalactic/pangalactic/utils/localdb.py:1.36 PanGalactic/pangalactic/utils/localdb.py:1.37
--- PanGalactic/pangalactic/utils/localdb.py:1.36	Tue Oct  7 14:23:05 2003
+++ PanGalactic/pangalactic/utils/localdb.py	Tue Oct  7 14:27:49 2003
@@ -962,10 +962,6 @@
         except:
             return None
 
-    # remove next time you see me
-    #def SaveObject(self, savedict, id, obj):
-        ##eventuall remove this when all calls have been renamed
-        #self.saveObject(savedict, id, obj)
 
     def saveObject(self, savedict, id, obj):
         #print "localdb.saveobject", savedict, id

From bmuir at ned.gsfc.nasa.gov  Tue Oct  7 15:35:03 2003
From: bmuir at ned.gsfc.nasa.gov (bmuir CVS)
Date: Tue Oct  7 14:35:05 2003
Subject: [Pangalactic-commits] changed label creation in pgefversiontree
Message-ID: <200310071835.h97IZ3dx005227@ned.gsfc.nasa.gov>

Modified files:
PanGalactic/pangalactic/client/modules/psm/pgefversiontree.py 1.3 1.4

Log message:
changed label creation in pgefversiontree


Index: PanGalactic/pangalactic/client/modules/psm/pgefversiontree.py
diff -u PanGalactic/pangalactic/client/modules/psm/pgefversiontree.py:1.3 PanGalactic/pangalactic/client/modules/psm/pgefversiontree.py:1.4
--- PanGalactic/pangalactic/client/modules/psm/pgefversiontree.py:1.3	Tue Oct  7 14:12:30 2003
+++ PanGalactic/pangalactic/client/modules/psm/pgefversiontree.py	Tue Oct  7 14:35:01 2003
@@ -166,8 +166,8 @@
             for obj in objs:
                 if obj.state <> objectstatus.DELETE:
                     
-                    foo = obj.of_pm_id + "." + obj.of_pm_id_context
-                    treeid = self.AppendItem(version_node, foo)
+                    treelabel = self.createTreeLabel(obj)
+                    treeid = self.AppendItem(version_node, treelabel)
                     self.SetPyData(treeid, ['version', obj.pgef_oid])
                     self.SetItemImage(treeid, self.itemicon)
                     self.SetItemImage(treeid, self.itemicon, wxTreeItemIcon_Selected)  
@@ -181,4 +181,15 @@
             self.Expand(pv_treeid)
         if temp_pmm:
             self.Expand(pmm_treeid)
+            
+    def createTreeLabel(self, obj):
+        if obj.__class__.__name__ == 'ProductModelVersion':
+            temp = '%s.%s.%s.%s.%s' % (obj.of_pm_id, obj.of_pm_id_context, obj.of_pv_id, obj.of_pmm_id, obj.id)
+        elif obj.__class__.__name__ == 'ProductModelMaster':
+            temp = '%s.%s.%s.%s' % (obj.of_pm_id, obj.of_pm_id_context, obj.of_pv_id, obj.id)
+        elif obj.__class__.__name__ == 'ProductVersion':
+            temp = '%s.%s.%s' % (obj.of_pm_id, obj.of_pm_id_context, obj.id)
+        elif obj.__class__.__name__ == 'ProductMaster':
+            temp = '%s.%s' % (obj.id, obj.id_context)
+        return temp
  

From waterbug at ned.gsfc.nasa.gov  Tue Oct  7 15:46:08 2003
From: waterbug at ned.gsfc.nasa.gov (waterbug CVS)
Date: Tue Oct  7 14:46:08 2003
Subject: [Pangalactic-commits] Updated unit test for new XmlrpcInterface.
Message-ID: <200310071846.h97Ik89a005317@ned.gsfc.nasa.gov>

Modified files:
PanGalactic/pangalactic/client/tests/test_xmlrpcinterface.py 1.4 1.5

Log message:
Updated unit test for new XmlrpcInterface.


Index: PanGalactic/pangalactic/client/tests/test_xmlrpcinterface.py
diff -u PanGalactic/pangalactic/client/tests/test_xmlrpcinterface.py:1.4 PanGalactic/pangalactic/client/tests/test_xmlrpcinterface.py:1.5
--- PanGalactic/pangalactic/client/tests/test_xmlrpcinterface.py:1.4	Sat Sep 20 18:15:19 2003
+++ PanGalactic/pangalactic/client/tests/test_xmlrpcinterface.py	Tue Oct  7 14:46:06 2003
@@ -1,90 +1,59 @@
-import dataobjects.item
-import dataobjects.nauo
-import dataobjects.user
-import dataobjects.part
-import xmlrpclib
+# $Source: /repo/step_testbed/PanGalactic/pangalactic/client/tests/test_xmlrpcinterface.py,v $
 
+"""
+Functional test for pangalactic.util.xmlrpcinterface
+  - this test code assumes there is a PGER Server instance
+    running
+"""
+
+import os
+from pprint import pprint
+from pangalactic.utils.xmlrpcinterface import XmlrpcInterface
+from pangalactic.enterprise.project import Project
+from pangalactic.enterprise.productmaster import ProductMaster as PM
+from pangalactic.enterprise.productversion import ProductVersion as PV
+from pangalactic.enterprise.productmodelmaster import ProductModelMaster as PMM
+from pangalactic.enterprise.productmodelversion import ProductModelVersion as PMV
+
+f = open('../../test/IDTEST')
+savedid = f.read()
+
+testid = str(int(savedid) + 1)
+f.close()
+f = open('../../test/IDTEST', 'w')
+f.write(testid)
+f.close()
+
+# create test data
+teststring = 'XMLRPC-Test-' 
+projid = teststring + testid
+projname = teststring + testid + ' Project'
+pmid = teststring + testid + '-PM'
+pmname = teststring + testid + ' Product (Master)'
+pvname = teststring + testid + ' Product, Version A'
+pvid = teststring + testid + '-PV'
+pmmid = teststring + testid + '-PMM'
+pmvid = teststring + testid + '-PMV'
+pmmname = teststring + testid + ' Model (Master)'
+pmvname = teststring + testid + ' Model, Version A-1'
+
+# create test objects
+p = Project(id=projid, id_context='TEST', name=projname)
+p.popTestData()
+pm = PM(id=pmid, id_context='TEST', _project=p, name=pmname)
+pm.popTestData()
+pv = PV(id=pvid, id_context='TEST', _of_master=pm, name=pvname)
+pv.popTestData()
+pmm = PMM(id=pmmid, id_context='TEST', _of_version=pv, name=pmmname)
+pmm.popTestData()
+pmv = PMV(id=pmvid, id_context='TEST', _of_model_master=pmm, name=pmvname)
+pmv.popTestData()
+
+xcli = XmlrpcInterface('beeblebrox.gsfc.nasa.gov', '8080')
+
+# create a pm just for getting its pv's ...
+h2g2 = Project(id='H2G2', id_context='TEST')
+pm1 = PM(id='HOG', id_context='TEST', _project=h2g2)
+res = xcli.getPvByPm(pm1)
+print res[0]
 
-
-class XmlrpcInterface:
-    def __init__(self, server, port):
-        self._SERVER = server
-        self._PORT = port
-        self._RPC = None
-    
-    def Connect(self):
-        self._RPC =  xmlrpclib.Server('%s%s:%s' % ('http://' , self._SERVER, self._PORT))
-        
-    def Disconnect(self):
-        self._SERVER = None
-        self._PORT = None
-        self._RPC = None
-        
-    def GetItemByProject(self, project):
-        return self._RPC.GetItemByProject(project)
-    
-    def GetItem(self, ItemId):
-        return self._RPC.GetItem(ItemId)
-
-    def GetNauo(self, NauoId):
-        return self._RPC.GetNAUO(NauoId)
-
-    def GetNauosByAssemblyID(self, AssemblyId):
-        return self._RPC.GetNauosByAssemblyId(AssemblyId)
-
-    def GetNauosByComponentID(self, ComponentId):
-        return self._RPC.GetNAUOsByComponentID(ComponentId)
-
-    def GetPerson(self, UserName):
-        return self._RPC.GetPerson(UserName)
-
-    def GetPersonRoles(self, UserName):
-        return self._RPC.GetPersonRoles(UserName)
-
-    def GetProject(self, project):
-        return self._RPC.GetProject(project)
-
-    def SearchItem(self, ItemId):
-        return self._RPC.SearchItem(ItemId)
-
-    def AddItem(self, itemobj):
-        return self._RPC.AddItem(itemobj)
-
-    def AddNauo(self, nauoobj):
-        return self._RPC.AddNauo(nauoobj)
-
-    def DelObjects(self, objlist):
-        return self._RPC.DelObjects(objlist)
-
-    def AddObjects(self, objlist):
-        return self._RPC.AddObjects(objlist)
-
-    def DelNauo(self, nauo):
-        return self._RPC.delNauo(nauo)
-
-    def DelIdr(self, idr):
-        return self._RPC.delIdr(idr)
-
-    def AddPartsList(self, partslist):
-        return self._RPC.AddPartsList(partslist)
-
-    def GetPartsList(self, partslistid):
-        return self._RPC.GetPartsList(partslistid)
-
-    def AddDocument(self, doc):
-        return self._RPC.AddDocument(doc)
-
-    def GetDocument(self, docid):
-        return self._RPC.GetDocument(docid)
-
-    def AddIDR(self, idr):
-        return self._RPC.AddIDR(idr)
-
-    def GetIDR(self, idrid):
-        return self._RPC.GetIDR(idrid)
-
-    def GetIDRByDocumentID(self, docid):
-        return self._RPC.GetIDRByDocumentID(docid)
-
-    def GetIDRByItemID(self, itemid):
-        return self._RPC.GetIDRByItemID(itemid)

From pbear at ned.gsfc.nasa.gov  Tue Oct  7 16:16:16 2003
From: pbear at ned.gsfc.nasa.gov (pbear CVS)
Date: Tue Oct  7 15:16:18 2003
Subject: [Pangalactic-commits] More tweaking for wfprocesses
Message-ID: <200310071916.h97JGGbe006011@ned.gsfc.nasa.gov>

Modified files:
PanGalactic/pangalactic/enterprise/pgefadvisory.py 1.36 1.37
PanGalactic/pangalactic/utils/localdb.py 1.37 1.38

Log message:
More tweaking for wfprocesses


Index: PanGalactic/pangalactic/enterprise/pgefadvisory.py
diff -u PanGalactic/pangalactic/enterprise/pgefadvisory.py:1.36 PanGalactic/pangalactic/enterprise/pgefadvisory.py:1.37
--- PanGalactic/pangalactic/enterprise/pgefadvisory.py:1.36	Tue Oct  7 13:53:54 2003
+++ PanGalactic/pangalactic/enterprise/pgefadvisory.py	Tue Oct  7 15:16:14 2003
@@ -1,11 +1,11 @@
-# $Id: pgefadvisory.py,v 1.36 2003/10/07 17:53:54 pbear Exp $
+# $Id: pgefadvisory.py,v 1.37 2003/10/07 19:16:14 pbear Exp $
 
 """
 Base class for documents that report conditions related to the
 usability of a product.
 """
 
-__version__ = "$Revision: 1.36 $"[11:-2]
+__version__ = "$Revision: 1.37 $"[11:-2]
 
 import os.path
 import string
@@ -67,7 +67,7 @@
 # leave this here...  I use it to generate old data -vwk
 #
 #        now = mx.DateTime.DateFromTicks(mx.DateTime.now())
-#        earlier = now + mx.DateTime.RelativeDateTime(days=-15)
+#        earlier = now + mx.DateTime.RelativeDateTime(days=-10)
 #        self.pger_create_datetime = earlier
 #        self.pger_mod_datetime    = earlier
 #        self.create_datetime      = earlier

Index: PanGalactic/pangalactic/utils/localdb.py
diff -u PanGalactic/pangalactic/utils/localdb.py:1.37 PanGalactic/pangalactic/utils/localdb.py:1.38
--- PanGalactic/pangalactic/utils/localdb.py:1.37	Tue Oct  7 14:27:49 2003
+++ PanGalactic/pangalactic/utils/localdb.py	Tue Oct  7 15:16:15 2003
@@ -183,8 +183,8 @@
             #print "localdb.savepmv:", prod._of_master.id
             self.dbroot[self.PRODUCTMODELVERSION][prod.pgef_oid] = prod
             self.dbroot[self.OIDLOOKUP][prod.pgef_oid] = self.PRODUCTMODELVERSION
-            compound_key = data_utils.createCompoundKey(prod)
-            self.dbroot[self.PMVBYPRIMARYKEY][compound_key] = prod
+            #compound_key = data_utils.createCompoundKey(prod)
+            #self.dbroot[self.PMVBYPRIMARYKEY][compound_key] = prod
 #            self.SavePMVParents(prod)
         self.Commit()
         
@@ -971,17 +971,23 @@
             #print "saved local object", savedict, id
             if obj.__class__.__name__ in ['ProductModelVersion', 'ProductModelMaster', 'ProductVersion', 'ProductMaster']:
                 compound_key = data_utils.createCompoundKey(obj)
-                #print 'compound_key is:', compound_key
-                self.saveCompoundKey(obj, compound_key)
+                self.saveCompoundKey(obj, compound_key)        
+
         except Exception, e:
-            print "Eek.  An EXCEPTION.  localdb.saveObject"
-            print e
-            import traceback
-            traceback.print_exc()
+            print "Eek.  An EXCEPTION.  localdb.saveObject", e
+#            print e
+#            import traceback
+#            traceback.print_exc()
             
-    
 
+    def makeCompoundKey(self, obj):
+        compound_key = None
+        if obj.__class__.__name__ in ['ProductModelVersion', 'ProductModelMaster', 'ProductVersion', 'ProductMaster']:
+            compound_key = data_utils.createCompoundKey(obj)
+        return compound_key
+ 
     def saveCompoundKey(self, obj, key):
+        dictname = None
         if obj.__class__.__name__ == 'ProductModelVersion':
             dictname = self.PMVBYPRIMARYKEY
         elif obj.__class__.__name__ == 'ProductModelMaster':
@@ -990,7 +996,8 @@
             dictname = self.PVBYPRIMARYKEY
         elif obj.__class__.__name__ == 'ProductMaster':
             dictname = self.PMBYPRIMARYKEY
-        self.dbroot[dictname][key] = obj
+        if dictname:
+            self.dbroot[dictname][key] = obj
 
 
     def AppendUncommittedData(self, uncommitteddict, unsavedlist):

From waterbug at ned.gsfc.nasa.gov  Tue Oct  7 16:45:55 2003
From: waterbug at ned.gsfc.nasa.gov (waterbug CVS)
Date: Tue Oct  7 15:45:56 2003
Subject: [Pangalactic-commits] First cut at XmlrpcInterface -- still more
	methods to do!
Message-ID: <200310071945.h97Jjt2M006768@ned.gsfc.nasa.gov>

Modified files:
PanGalactic/pangalactic/utils/xmlrpcinterface.py 1.7 1.8

Log message:
First cut at XmlrpcInterface -- still more methods to do!


Index: PanGalactic/pangalactic/utils/xmlrpcinterface.py
diff -u PanGalactic/pangalactic/utils/xmlrpcinterface.py:1.7 PanGalactic/pangalactic/utils/xmlrpcinterface.py:1.8
--- PanGalactic/pangalactic/utils/xmlrpcinterface.py:1.7	Fri Sep 26 14:42:57 2003
+++ PanGalactic/pangalactic/utils/xmlrpcinterface.py	Tue Oct  7 15:45:53 2003
@@ -1,3 +1,12 @@
+# $Source: /repo/step_testbed/PanGalactic/pangalactic/utils/xmlrpcinterface.py,v $
+
+"""
+PanGalactic Client XMLRPC Interfaces
+
+@version: $Revision: 1.8 $
+"""
+
+__version__ = "$Revision: 1.8 $"[11:-2]
 
 import xmlrpclib
 import types
@@ -38,13 +47,15 @@
             if isinstance(object_list, types.ListType):
                 extracts = [ self._factory.extract(o) 
                              for o in object_list ]
-                date_time_stamp = self._RPC.addObjects(extracts)
+                newexts = self._RPC.addObjects(extracts)
+                newobjects = self._factory.rememberAll(newexts)
             else:
                 extracts = [ self._factory.extract(o) ]
-                date_time_stamp = self._RPC.addObjects(extracts)
+                newexts = self._RPC.addObjects(extracts)
+                newobjects = self._factory.rememberAll(newexts)
                 #print 'sent one object extract:'
                 #print extracts
-            return date_time_stamp
+            return newobjects
                 
         
     # TODO: implement this ...
@@ -61,44 +72,59 @@
 #                 return 1
 
 
-    def GetDataByOid(self, dataname, fieldname, oid):
+    def getObjects(self, classname, fields, refs=0, subtypes=0,
+                   objs=[]):
+        # eventually call only this?  --vwk 23may2003
+        data = self._RPC.getObjects(dataname, refs, subtypes, fields)
+        if data:
+            if refs:
+                return [self._factory.rememberAll(data, objs)]
+            else:
+                return [self._factory.remember(data, objs)]
+
+    def getDataByOid(self, dataname, fieldname, oid):
         # eventually call only this?  --vwk 23may2003
         # e.g., GetDataByOid("ProjectModelVersion", "pgef_oid", obj.pgef_oid)
-        data = self._RPC.getObjects(dataname, '%s=%s' % (fieldname, oid))
+        crit = dict([fieldname, oid])
+        data = self._RPC.getObjects(dataname, 0, 0, crit)
         if data:
-            return [self._factory.reconstitute(x) for x in data]
-        
-    def getPvByPm(self, pm_id, pm_id_context):
-        args = ('of_pm_id=%s' % pm_id,
-                'of_pm_id_context=%s' % pm_id_context)
-        data = self._RPC.getObjects('ProductVersion', *args)
+            return [self._factory.rememberAll(data)]
+
+    def getPvByPm(self, pm):
+        crit = {'of_pm_id' : pm.id,
+                'of_pm_id_context' : pm.id_context}
+        data = self._RPC.getObjects('ProductVersion', 0, 0, crit)
         if data:
-            return [self._factory.reconstitute(x) for x in data]
-        
-    def getPmmByPv(self, pm_id, pm_id_context, pv_id):
-        args = ('of_pm_id=%s' % pm_id,
-                'of_pm_id_context=%s' % pm_id_context, 
-                'of_pv_id=%s'%pv_id)
-        data = self._RPC.getObjects('ProductModelMaster', *args)
+            return [self._factory.remember(x, [pm])
+                    for x in data]
+
+    def getPmmByPv(self, pv):
+        crit = {'of_pm_id' : pv.of_pm_id,
+                'of_pm_id_context' : pv.of_pm_id_context,
+                'of_pv_id' : pv.id}
+        data = self._RPC.getObjects('ProductModelMaster', 0, 0, crit)
         if data:
-            return [self._factory.reconstitute(x) for x in data]
-        
-    def getPmvByPmm(self, pm_id, pm_id_context, pv_id, pmm_id):
-        args = ('of_pm_id=%s' % pm_id,
-                'of_pm_id_context=%s' % pm_id_context, 
-                'of_pv_id=%s'%pv_id,
-                'of_pmm_id=%s'%pmm_id)
-        data = self._RPC.getObjects('ProductModelMaster', *args)
+            return [self._factory.remember(x, [pv, pv._of_master])
+                    for x in data]
+
+    def getPmvByPmm(self, pmm):
+        crit = {'of_pm_id' : pmm.of_pm_id,
+                'of_pm_id_context' : pmm.of_pm_id_context,
+                'of_pv_id' : pmm.of_pv_id}
+                'of_pmm_id' : pmm.id)
+        data = self._RPC.getObjects('ProductModelMaster', crit)
         if data:
-            return [self._factory.reconstitute(x) for x in data]       
+            return [self._factory.remember(x, [pmm, pmm._of_version, pmm._of_master])
+                    for x in data]
 
     def GetPmByProject(self, project):
         #print "getpmbyproject"
         #print 'ProductMaster' + ' ' + 'project = %s' % project
         data = self._RPC.getObjects('ProductMaster', 'project_id=%s' % project)
         if data:
-            return [self._factory.reconstitute(x) for x in data]
-    
+            return [self._factory.remember(x, [pmm, pmm._of_version, pmm._of_master])
+                    for x in data]
+
     def GetPmmByProject(self, project):
         #print "getpmmbyproject"
         #print 'ProductModelMaster' + ' ' + 'project = %s' % project

From waterbug at ned.gsfc.nasa.gov  Tue Oct  7 16:55:52 2003
From: waterbug at ned.gsfc.nasa.gov (waterbug CVS)
Date: Tue Oct  7 15:55:53 2003
Subject: [Pangalactic-commits] All getXByProject methods done.
Message-ID: <200310071955.h97Jtqvp007086@ned.gsfc.nasa.gov>

Modified files:
PanGalactic/pangalactic/utils/xmlrpcinterface.py 1.8 1.9

Log message:
All getXByProject methods done.


Index: PanGalactic/pangalactic/utils/xmlrpcinterface.py
diff -u PanGalactic/pangalactic/utils/xmlrpcinterface.py:1.8 PanGalactic/pangalactic/utils/xmlrpcinterface.py:1.9
--- PanGalactic/pangalactic/utils/xmlrpcinterface.py:1.8	Tue Oct  7 15:45:53 2003
+++ PanGalactic/pangalactic/utils/xmlrpcinterface.py	Tue Oct  7 15:55:50 2003
@@ -3,10 +3,10 @@
 """
 PanGalactic Client XMLRPC Interfaces
 
-@version: $Revision: 1.8 $
+@version: $Revision: 1.9 $
 """
 
-__version__ = "$Revision: 1.8 $"[11:-2]
+__version__ = "$Revision: 1.9 $"[11:-2]
 
 import xmlrpclib
 import types
@@ -80,7 +80,7 @@
             if refs:
                 return [self._factory.rememberAll(data, objs)]
             else:
-                return [self._factory.remember(data, objs)]
+                return [self._factory.rememberAll(data, objs)]
 
     def getDataByOid(self, dataname, fieldname, oid):
         # eventually call only this?  --vwk 23may2003
@@ -112,41 +112,44 @@
                 'of_pm_id_context' : pmm.of_pm_id_context,
                 'of_pv_id' : pmm.of_pv_id}
                 'of_pmm_id' : pmm.id)
-        data = self._RPC.getObjects('ProductModelMaster', crit)
+        data = self._RPC.getObjects('ProductModelMaster', 0, 0, crit)
         if data:
             return [self._factory.remember(x, [pmm, pmm._of_version, pmm._of_master])
                     for x in data]
 
-    def GetPmByProject(self, project):
+    def GetPmByProject(self, project, objs=[]):
         #print "getpmbyproject"
         #print 'ProductMaster' + ' ' + 'project = %s' % project
-        data = self._RPC.getObjects('ProductMaster', 'project_id=%s' % project)
+        data = self._RPC.getObjects('ProductMaster', 1, 0,
+                                    {'project_id' : project})
         if data:
-            return [self._factory.remember(x, [pmm, pmm._of_version, pmm._of_master])
-                    for x in data]
+            return self._factory.rememberAll(data, objs)
 
-    def GetPmmByProject(self, project):
+    def GetPmmByProject(self, project, objs=[]):
         #print "getpmmbyproject"
         #print 'ProductModelMaster' + ' ' + 'project = %s' % project
-        data = self._RPC.getObjects('ProductModelMaster', 'project_id=%s' % project)
+        data = self._RPC.getObjects('ProductModelMaster', 1, 0,
+                                    {'project_id' : project})
         if data:
-            return [self._factory.reconstitute(x) for x in data]
-    
-    def GetPvByProject(self, project):
+            return self._factory.rememberAll(data, objs)
+
+    def GetPvByProject(self, project, objs=[]):
         #print "getpvbyproject"
         #print 'ProductVersion' + ' ' + 'project = %s' % project
-        data = self._RPC.getObjects('ProductVersion', 'project_id=%s' % project)
+        data = self._RPC.getObjects('ProductVersion', 1, 0,
+                                    {'project_id' : project})
         if data:
-            return [self._factory.reconstitute(x) for x in data]
-    
-    def GetPmvByProject(self, project):
+            return self._factory.rememberAll(data, objs)
+
+    def GetPmvByProject(self, project, objs=[]):
         #print "getpmvbyproject"
         #print 'ProductModelVersion' + ' ' + 'project = %s' % project
-        data = self._RPC.getObjects('ProductModelVersion', 'project_id=%s' % project)
+        data = self._RPC.getObjects('ProductModelVersion', 1, 0,
+                                    {'project_id' : project})
         if data:
-            return [self._factory.reconstitute(x) for x in data]
-    
-    def GetPMV(self, ItemId):
+            return self._factory.rememberAll(data, objs)
+
+    def GetPMV(self, ItemId, objs=[]):
         data = self._RPC.getObjects('ProductModelVersion', 'pgef_oid=%s' % ItemId)
         if data:
             return [self._factory.reconstitute(x) for x in data]

From waterbug at ned.gsfc.nasa.gov  Tue Oct  7 16:56:41 2003
From: waterbug at ned.gsfc.nasa.gov (waterbug CVS)
Date: Tue Oct  7 15:56:43 2003
Subject: [Pangalactic-commits] Bug fixes.
Message-ID: <200310071956.h97JufKT007141@ned.gsfc.nasa.gov>

Modified files:
PanGalactic/pangalactic/utils/factory.py 1.4 1.5

Log message:
Bug fixes.


Index: PanGalactic/pangalactic/utils/factory.py
diff -u PanGalactic/pangalactic/utils/factory.py:1.4 PanGalactic/pangalactic/utils/factory.py:1.5
--- PanGalactic/pangalactic/utils/factory.py:1.4	Mon Oct  6 01:11:18 2003
+++ PanGalactic/pangalactic/utils/factory.py	Tue Oct  7 15:56:40 2003
@@ -1,12 +1,12 @@
-# $Id: factory.py,v 1.4 2003/10/06 05:11:18 waterbug Exp $
+# $Id: factory.py,v 1.5 2003/10/07 19:56:40 waterbug Exp $
 
 """
 Functions to extract persistable data from
 L{pangalactic.enterprise} objects.
-@version: $Revision: 1.4 $
+@version: $Revision: 1.5 $
 """
 
-__version__ = "$Revision: 1.4 $"[11:-2]
+__version__ = "$Revision: 1.5 $"[11:-2]
 
 import types
 import string
@@ -37,25 +37,20 @@
                           attribute is to be converted
         """
         # *_datetime attributes:
-        # pypgsql returns a DateTime object, which can't
-        # be jellied, so convert to GMT string ...
         if datatype == 'DateTime':
             if attr:
                 return str(attr)
             else:
                 return ''
         # *_flag attributes:
-        # pypgsql returns a PgBoolean object, which can't be
-        # jellied, so convert value to 0 or 1 ...
         if datatype == 'bool':
             # print "%s is a flag -- setting it to 1 or 0." % attr
             if attr:
                 return 1
             else:
                 return 0
-        # special case:  for a null, pypgsql returns a
-        # None object, which can't be jellied, so convert
-        # to an empty string ...
+        # special case:  for a null, pypgsql returns a None
+        # object, so convert to an empty string ...
         if isinstance(attr, types.NoneType):
             # print "%s is None -- setting it to an empty string." % attr
             return ''
@@ -172,7 +167,7 @@
 
     def remember(self, extr, objs=[]):
         """
-        Re-member (wink ;^) an object from an extract and a list
+        Re-member (heh ;^) an object from an extract and a list
         of candidates to use for its referenced objects (i.e.,
         those in _refd).  (Use case:  update of an object of
         which the referenced objects already exist locally.)
@@ -195,13 +190,12 @@
             kw[a] = self.uncook(extr[1][a], klass._schema[a])
         if klass._refd:
             for a in klass._refd:
+                kw[a] = None
                 for o in objs:
                     if (o.__class__.__name__ == klass._refd[a]
                         and ([getattr(o, pka) for pka in o._pk]
                              == [kw[fka] for fka in klass._fk[a]])):
                         kw[a] = o
-                    else:
-                        kw[a] = None
         return klass(**kw)
 
     def rememberAll(self, extracts, objs=[]):
@@ -227,7 +221,7 @@
         # make a list of all classes in the extracts
         cnames = utils.unique([string.split(e[0], '.')[-1]
                                for e in extracts])
-        print 'cnames = %s' % str(cnames)
+        # print 'cnames = %s' % str(cnames)
         # build a dictionary of lists of extracts by class
         edict = {}
         for cname in cnames:
@@ -235,7 +229,7 @@
             for e in extracts:
                 if cname == string.split(e[0], '.')[-1]:
                     edict[cname].append(e)
-        print 'edict = %s' % str(edict)
+        # print 'edict = %s' % str(edict)
         # make a dictionary of lists of instances by class
         byclass = {}
         for c in cnames:
@@ -246,33 +240,33 @@
                 byclass[c].append(o)
             else:
                 byclass[c] = [o]
-        print 'byclass = %s' % str(byclass)
+        # print 'byclass = %s' % str(byclass)
         # so in theory, at this point everything is remembered.
         # now hook up as many refs as we can ... using the
         # registry a little bit:
         for c in cnames:
-            print '- adding refs to %s instances ...' % c
+            # print '- adding refs to %s instances ...' % c
             refd = self._registry.pgef_classes[c]._refd
-            print '  - refd is %s' % str(refd)
+            # print '  - refd is %s' % str(refd)
             if refd:
                 for attr in refd:
-                    print '  - %s has type %s' % (attr, refd[attr])
-                    print '  - looking for %s instances' % refd[attr]
+                    # print '  - %s has type %s' % (attr, refd[attr])
+                    # print '  - looking for %s instances' % refd[attr]
                     if refd[attr] in byclass:
-                        print '  - we have %s instances' % refd[attr]
+                        # print '  - we have %s instances' % refd[attr]
                         for o in byclass[c]:
-                            print '  - looking at fk attrs of %s' % repr(o)
+                            # print '  - looking at fk attrs of %s' % repr(o)
                             fkattrs = o._fk[attr]
                             fkvals = [getattr(o, a)
                                          for a in fkattrs]
-                            print '  - fk vals are %s' % str(fkvals)
+                            # print '  - fk vals are %s' % str(fkvals)
                             for oo in byclass[refd[attr]]:
                                 pkattrs = oo._pk
                                 pkvals = [getattr(oo, a)
                                              for a in pkattrs]
                                 if fkvals == pkvals:
                                     setattr(o, attr, oo)
-                                break
+                                    break
             remembered += byclass[c]
         return remembered
 

From pbear at ned.gsfc.nasa.gov  Tue Oct  7 17:00:08 2003
From: pbear at ned.gsfc.nasa.gov (pbear CVS)
Date: Tue Oct  7 16:00:09 2003
Subject: [Pangalactic-commits] fixed typo
Message-ID: <200310072000.h97K08di007221@ned.gsfc.nasa.gov>

Modified files:
PanGalactic/pangalactic/utils/xmlrpcinterface.py 1.9 1.10

Log message:
fixed typo


Index: PanGalactic/pangalactic/utils/xmlrpcinterface.py
diff -u PanGalactic/pangalactic/utils/xmlrpcinterface.py:1.9 PanGalactic/pangalactic/utils/xmlrpcinterface.py:1.10
--- PanGalactic/pangalactic/utils/xmlrpcinterface.py:1.9	Tue Oct  7 15:55:50 2003
+++ PanGalactic/pangalactic/utils/xmlrpcinterface.py	Tue Oct  7 16:00:07 2003
@@ -3,10 +3,10 @@
 """
 PanGalactic Client XMLRPC Interfaces
 
-@version: $Revision: 1.9 $
+@version: $Revision: 1.10 $
 """
 
-__version__ = "$Revision: 1.9 $"[11:-2]
+__version__ = "$Revision: 1.10 $"[11:-2]
 
 import xmlrpclib
 import types
@@ -110,8 +110,8 @@
     def getPmvByPmm(self, pmm):
         crit = {'of_pm_id' : pmm.of_pm_id,
                 'of_pm_id_context' : pmm.of_pm_id_context,
-                'of_pv_id' : pmm.of_pv_id}
-                'of_pmm_id' : pmm.id)
+                'of_pv_id' : pmm.of_pv_id,
+                'of_pmm_id' : pmm.id}
         data = self._RPC.getObjects('ProductModelMaster', 0, 0, crit)
         if data:
             return [self._factory.remember(x, [pmm, pmm._of_version, pmm._of_master])

From waterbug at ned.gsfc.nasa.gov  Tue Oct  7 17:03:35 2003
From: waterbug at ned.gsfc.nasa.gov (waterbug CVS)
Date: Tue Oct  7 16:03:36 2003
Subject: [Pangalactic-commits] Mods to enterprise objects.
Message-ID: <200310072003.h97K3ZPr007371@ned.gsfc.nasa.gov>

Modified files:
PanGalactic/pangalactic/enterprise/pgefobject.py 1.26 1.27
PanGalactic/pangalactic/enterprise/productmaster.py 1.17 1.18
PanGalactic/pangalactic/enterprise/productmodelversion.py 1.21 1.22

Log message:
Mods to enterprise objects.


Index: PanGalactic/pangalactic/enterprise/productmodelversion.py
diff -u PanGalactic/pangalactic/enterprise/productmodelversion.py:1.21 PanGalactic/pangalactic/enterprise/productmodelversion.py:1.22
--- PanGalactic/pangalactic/enterprise/productmodelversion.py:1.21	Thu Oct  2 12:19:57 2003
+++ PanGalactic/pangalactic/enterprise/productmodelversion.py	Tue Oct  7 16:03:33 2003
@@ -1,10 +1,10 @@
-# $Id: productmodelversion.py,v 1.21 2003/10/02 16:19:57 waterbug Exp $
+# $Id: productmodelversion.py,v 1.22 2003/10/07 20:03:33 waterbug Exp $
 
 """
 Version-dependent product model data.
 """
 
-__version__ = "$Revision: 1.21 $"[11:-2]
+__version__ = "$Revision: 1.22 $"[11:-2]
 
 from pangalactic.enterprise.project import Project
 from pangalactic.enterprise.productversion import ProductVersion
@@ -84,12 +84,6 @@
     # PgerObjectFactory.
     # TODO: implement _owner, _creator, etc. ...
     _refd = {
-             # '_owner' : 'Person',
-             # '_creator' : 'Person',
-             # '_modifier' : 'Person',
-             # '_pger_owner' : 'Person',
-             # '_pger_creator' : 'Person',
-             # '_pger_modifier' : 'Person',
              '_project'         : 'Project',
              '_of_master'       : 'ProductMaster',
              '_of_version'      : 'ProductVersion',

Index: PanGalactic/pangalactic/enterprise/pgefobject.py
diff -u PanGalactic/pangalactic/enterprise/pgefobject.py:1.26 PanGalactic/pangalactic/enterprise/pgefobject.py:1.27
--- PanGalactic/pangalactic/enterprise/pgefobject.py:1.26	Thu Oct  2 12:19:57 2003
+++ PanGalactic/pangalactic/enterprise/pgefobject.py	Tue Oct  7 16:03:33 2003
@@ -1,8 +1,8 @@
-# $Id: pgefobject.py,v 1.26 2003/10/02 16:19:57 waterbug Exp $
+# $Id: pgefobject.py,v 1.27 2003/10/07 20:03:33 waterbug Exp $
 
 """
 The Mother of all PGEF application classes.
-@version: $Revision: 1.26 $
+@version: $Revision: 1.27 $
 """
 
 # TODO:
@@ -24,7 +24,7 @@
 #               should we jettison this?
 #               Nope.
 
-__version__ = "$Revision: 1.26 $"[11:-2]
+__version__ = "$Revision: 1.27 $"[11:-2]
 
 import types
 import string
@@ -35,23 +35,6 @@
 from pangalactic.utils import datetimes
 from pangalactic.utils import pgefexceptions
 
-def FillSampleObject(sampleobj):
-    """
-    Fill an object's attributes with some sample data.
-
-    @type sampleobj:   L{pangalactic.enterprise.pgefobject.PgefObject}
-    @param sampleobj:  the instance whose attributes are to be filled
-    """
-    sampleobj.pgef_oid = "1234"
-    sampleobj.objtype = None
-    sampleobj.state = ""
-    sampleobj.owner = "me"
-    sampleobj.id = "idthis"
-    sampleobj.project = "Philadelphia Experiment"
-    sampleobj.creator = "Einstein"
-    sampleobj.create_datetime = time.strftime("%Y/%m/%d %H:%M:%S")
-    sampleobj.InitialCommitDateTime = ""
-
 class PgefObject(object, pb.Cacheable, pb.RemoteCache):
     """
     This is the base class for all of the Pgef data classes.
@@ -559,4 +542,25 @@
                        + a)
                 raise pgefexceptions.RequiredDataError, msg
         return True
+
+    def popTestData(self):
+        """
+        Populate an instance's unpopulated attributes with some
+        test data.  (This method may be extended in subclasses.)
+        """
+        # this id is not very useful for testing, but a test
+        # script will have to set it to something anyway ...
+        self.id = self.id or "idthis"
+        self.id_context = self.id_context or "TEST"
+        # make sure foreign keys to "person" table are valid for
+        # testing purposes ...
+        for a in ['owner',
+                  'creator',
+                  'modifier',
+                  'pger_owner',
+                  'pger_creator',
+                  'pger_modifier']:
+            if not getattr(self, a):
+                setattr(self, a, 'tester1@default')
+                setattr(self, a + '_context', 'TEST')
 

Index: PanGalactic/pangalactic/enterprise/productmaster.py
diff -u PanGalactic/pangalactic/enterprise/productmaster.py:1.17 PanGalactic/pangalactic/enterprise/productmaster.py:1.18
--- PanGalactic/pangalactic/enterprise/productmaster.py:1.17	Thu Oct  2 12:19:57 2003
+++ PanGalactic/pangalactic/enterprise/productmaster.py	Tue Oct  7 16:03:33 2003
@@ -1,26 +1,14 @@
-# $Id: productmaster.py,v 1.17 2003/10/02 16:19:57 waterbug Exp $
+# $Id: productmaster.py,v 1.18 2003/10/07 20:03:33 waterbug Exp $
 
 """
 Version-independent product data.
 """
 
-__version__ = "$Revision: 1.17 $"[11:-2]
+__version__ = "$Revision: 1.18 $"[11:-2]
 
 from pangalactic.enterprise.pgefobject import PgefObject
 from pangalactic.enterprise.project import Project
 
-def FillSampleProductMaster(pm):
-    """
-    Fill in some test data.
-
-    @type pm: L{pangalactic.enterprise.productmaster.ProductMaster}
-    @param pm: object to be populated.
-    """
-    pm.name = 'test Name Code'
-    pm.short_description = 'Test Name'
-    pm.owner = 'joe@schmoe.com'
-    pm.creator = 'moi@moi.com'    
-
 class ProductMaster(PgefObject):
     """
     I encapsulate the version-independent data about a product.
@@ -97,4 +85,14 @@
         if project:
             self.project_id = project.id
             self.project_id_context = project.id_context
+
+    def popTestData(self):
+        """
+        Populate an instance's unpopulated attributes with some
+        test data.
+        """
+        PgefObject.popTestData(self)
+        self.name = self.name or 'Test ProductMaster'
+        self.short_description = (self.short_description or
+                        'This is a ProductMaster for testing')
 

From pbear at ned.gsfc.nasa.gov  Tue Oct  7 17:15:04 2003
From: pbear at ned.gsfc.nasa.gov (pbear CVS)
Date: Tue Oct  7 16:15:07 2003
Subject: [Pangalactic-commits] fixed compound key stuff
Message-ID: <200310072015.h97KF4Np007731@ned.gsfc.nasa.gov>

Modified files:
PanGalactic/pangalactic/utils/data_utils.py 1.7 1.8
PanGalactic/pangalactic/utils/xmlrpcinterface.py 1.10 1.11

Log message:
fixed compound key stuff


Index: PanGalactic/pangalactic/utils/data_utils.py
diff -u PanGalactic/pangalactic/utils/data_utils.py:1.7 PanGalactic/pangalactic/utils/data_utils.py:1.8
--- PanGalactic/pangalactic/utils/data_utils.py:1.7	Tue Oct  7 14:24:22 2003
+++ PanGalactic/pangalactic/utils/data_utils.py	Tue Oct  7 16:15:03 2003
@@ -27,7 +27,7 @@
 
 def createACUSearchByComponent(acu_obj):
     search_str = []
-    value_list = createCompoundKey(acu_obj, 'ProductModelVersion')
+    value_list = createCompoundKey(acu_obj)#, 'ProductModelVersion')
     name_list = ('component_id=', 'component_of_pmm_id=', 'component_of_pv_id=', 'component_of_pm_id=', 'component_of_pm_id_context=')
     for ndx in range(5):
         search_str.append(name_list[ndx] + value_list[ndx])
@@ -36,13 +36,20 @@
 
 
 def createACUSearchByAssembly(acu_obj):
-    search_str = []
-    value_list = createCompoundKey(acu_obj, 'ProductModelVersion')
-    name_list = ('assembly_id=', 'assembly_of_pmm_id=', 'assembly_of_pv_id=', 'assembly_of_pm_id=', 'assembly_of_pm_id_context=')
+#    search_str = []
+#    value_list = createCompoundKey(acu_obj)#, 'ProductModelVersion')
+#    name_list = ('assembly_id=', 'assembly_of_pmm_id=', 'assembly_of_pv_id=', 'assembly_of_pm_id=', 'assembly_of_pm_id_context=')
+#    for ndx in range(5):
+#        search_str.append(name_list[ndx] + value_list[ndx])
+#
+#    return tuple(search_str)
+    search_str = {}
+    value_list = createCompoundKey(acu_obj)#, 'ProductModelVersion')
+    name_list = ('assembly_id', 'assembly_of_pmm_id', 'assembly_of_pv_id', 'assembly_of_pm_id', 'assembly_of_pm_id_context')
     for ndx in range(5):
-        search_str.append(name_list[ndx] + value_list[ndx])
+        search_str[name_list[ndx]] = value_list[ndx]
 
-    return tuple(search_str)
+    return search_str
     
     
 def createACUAssemblyTuple(acu_obj):

Index: PanGalactic/pangalactic/utils/xmlrpcinterface.py
diff -u PanGalactic/pangalactic/utils/xmlrpcinterface.py:1.10 PanGalactic/pangalactic/utils/xmlrpcinterface.py:1.11
--- PanGalactic/pangalactic/utils/xmlrpcinterface.py:1.10	Tue Oct  7 16:00:07 2003
+++ PanGalactic/pangalactic/utils/xmlrpcinterface.py	Tue Oct  7 16:15:03 2003
@@ -3,10 +3,10 @@
 """
 PanGalactic Client XMLRPC Interfaces
 
-@version: $Revision: 1.10 $
+@version: $Revision: 1.11 $
 """
 
-__version__ = "$Revision: 1.10 $"[11:-2]
+__version__ = "$Revision: 1.11 $"[11:-2]
 
 import xmlrpclib
 import types
@@ -175,12 +175,14 @@
             return [self._factory.reconstitute(x) for x in data]
 
     def GetAcusByCompKey(self, comp_key):
-        #print "getacusbycompkey"
+        print "getacusbycompkey"
         #print 'comp key was: %s' % repr(comp_key)
-        data = self._RPC.getObjects('AssemblyComponentUsage', *comp_key)
+        #data = self._RPC.getObjects('AssemblyComponentUsage', 1, 0, *comp_key)
+        print "compkey", comp_key
+        data = self._RPC.getObjects('AssemblyComponentUsage', 1, 0, comp_key)
         #print 'reply was: \n %s' % data
         if data:
-            return [self._factory.reconstitute(x) for x in data]
+            return self._factory.rememberAll(data)
 
     def GetPerson(self, user_tuple):
         data = self._RPC.getObjects('Person', *UserName)

From waterbug at ned.gsfc.nasa.gov  Wed Oct  8 00:29:29 2003
From: waterbug at ned.gsfc.nasa.gov (waterbug CVS)
Date: Tue Oct  7 23:29:30 2003
Subject: [Pangalactic-commits] Singularized buildSelectFromRowKey().
Message-ID: <200310080329.h983TTbG013131@ned.gsfc.nasa.gov>

Modified files:
PanGalactic/pangalactic/utils/sql.py 1.7 1.8

Log message:
Singularized buildSelectFromRowKey().


Index: PanGalactic/pangalactic/utils/sql.py
diff -u PanGalactic/pangalactic/utils/sql.py:1.7 PanGalactic/pangalactic/utils/sql.py:1.8
--- PanGalactic/pangalactic/utils/sql.py:1.7	Mon Oct  6 00:41:21 2003
+++ PanGalactic/pangalactic/utils/sql.py	Tue Oct  7 23:29:27 2003
@@ -1,6 +1,6 @@
 """SQL Tools"""
 
-# $Id: sql.py,v 1.7 2003/10/06 04:41:21 waterbug Exp $
+# $Id: sql.py,v 1.8 2003/10/08 03:29:27 waterbug Exp $
 
 import re, types
 
@@ -96,21 +96,13 @@
         selectargs = (sqlstmt,)
     return selectargs
 
-def buildSelectFromRowKeys(rowkeys):
+def buildSelectFromRowKey(rowkey):
     """
-    Take a list of rowkeys (for def of a rowkey, see
-    L{pangalactic.repo.factory.records2RowKeys}) and
-    return an SQL select statement that will select the
-    corresponding rows from the appropriate tables.
+    Build arguments for a select from a rowkey (for def of a
+    rowkey, see L{pangalactic.repo.factory.record2RowKey}).
     """
-    allsql = ''
-    allargs = []
-    for rk in rowkeys:
-        args = [(a, rk[1][a], '=') for a in rk[1]]
-        parms = buildSelect(rk[0], 0, *args)
-        allsql += parms[0] + '; '
-        allargs += parms[1:]
-    return allsql, allargs
+    args = [(a, rowkey[1][a], '=') for a in rowkey[1]]
+    return buildSelect(rowkey[0], 0, *args)
 
 def buildInsert(table, parmdict):
     """

From waterbug at ned.gsfc.nasa.gov  Wed Oct  8 00:31:32 2003
From: waterbug at ned.gsfc.nasa.gov (waterbug CVS)
Date: Tue Oct  7 23:31:33 2003
Subject: [Pangalactic-commits] Some more work; probably not done yet, but all
	Get[x]ByProject and GetAcusByCompKey appear to work now.
Message-ID: <200310080331.h983VWuj013229@ned.gsfc.nasa.gov>

Modified files:
PanGalactic/pangalactic/utils/xmlrpcinterface.py 1.11 1.12

Log message:
Some more work; probably not done yet, but all Get[x]ByProject and GetAcusByCompKey appear to work now.


Index: PanGalactic/pangalactic/utils/xmlrpcinterface.py
diff -u PanGalactic/pangalactic/utils/xmlrpcinterface.py:1.11 PanGalactic/pangalactic/utils/xmlrpcinterface.py:1.12
--- PanGalactic/pangalactic/utils/xmlrpcinterface.py:1.11	Tue Oct  7 16:15:03 2003
+++ PanGalactic/pangalactic/utils/xmlrpcinterface.py	Tue Oct  7 23:31:30 2003
@@ -3,10 +3,10 @@
 """
 PanGalactic Client XMLRPC Interfaces
 
-@version: $Revision: 1.11 $
+@version: $Revision: 1.12 $
 """
 
-__version__ = "$Revision: 1.11 $"[11:-2]
+__version__ = "$Revision: 1.12 $"[11:-2]
 
 import xmlrpclib
 import types
@@ -152,7 +152,7 @@
     def GetPMV(self, ItemId, objs=[]):
         data = self._RPC.getObjects('ProductModelVersion', 'pgef_oid=%s' % ItemId)
         if data:
-            return [self._factory.reconstitute(x) for x in data]
+            return [self._factory.remember(x) for x in data]
 
     def GetCategories(self, context):
         # Category is a subclass of DataElement.  FSC is a
@@ -160,19 +160,19 @@
         print "xmlrpc.getcategories"
         data = self._RPC.getObjects('Category', "id_context=%s" % context)
         if data:
-            return [self._factory.reconstitute(x) for x in data]
+            return [self._factory.remember(x) for x in data]
 
     def GetOrganizations(self):
         print "xmlrpc.getorgs"
         data = self._RPC.getObjects('Organization', "id_context=DEMO")  ## NOT staying.  Demo only!!  --vwk 28feb2003
         if data:
-            return [self._factory.reconstitute(x) for x in data]
+            return [self._factory.remember(x) for x in data]
 
     def GetOrganization(self, ObjId):
         print "getorganization"
         data = self._RPC.getObjects('Organization', 'pgef_oid=%s' % ObjId)
         if data:
-            return [self._factory.reconstitute(x) for x in data]
+            return [self._factory.remember(x) for x in data]
 
     def GetAcusByCompKey(self, comp_key):
         print "getacusbycompkey"
@@ -187,19 +187,19 @@
     def GetPerson(self, user_tuple):
         data = self._RPC.getObjects('Person', *UserName)
         if data:
-            return [self._factory.reconstitute(x) for x in data]
+            return [self._factory.remember(x) for x in data]
 
     def GetPersonRoles(self, UserName):
         data = self._RPC.getObjects('Role', 'UserId=%s' % UserName)
         if data:
-            return [self._factory.reconstitute(x) for x in data]
+            return [self._factory.remember(x) for x in data]
 
     #def GetProject(self, project):
 
     def SearchPMV(self, search_tuple):
         data = self._RPC.getObjects('ProductModelVersion', *search_tuple)
         if data:
-            return [self._factory.reconstitute(x) for x in data]
+            return [self._factory.remember(x) for x in data]
 
     #def AddItem(self, itemobj):
 
@@ -216,14 +216,14 @@
     def GetPartsList(self, partslistid):
         data = self._RPC.getObjects('PartsList', 'pgef_oid=%s' % partslistid)
         if data:
-            return [self._factory.reconstitute(x) for x in data]
+            return [self._factory.remember(x) for x in data]
 
     #def AddDocument(self, doc):
 
     def GetDocument(self, docid):
         data = self._RPC.getObjects('Document' , 'pgef_oid=%s' % docid)
         if data:
-            return [self._factory.reconstitute(x) for x in data]
+            return [self._factory.remember(x) for x in data]
 
     #def DelPdr(self, pdr):
 
@@ -232,17 +232,17 @@
     def GetPdr(self, pdrid):
         data = self._RPC.getObjects('ProductDocumentRelationship', 'pgef_oid=%s' % pdrid)
         if data:
-            return [self._factory.reconstitute(x) for x in data]
+            return [self._factory.remember(x) for x in data]
 
     def GetPDRByDocumentID(self, docid):
         data = self._RPC.getObjects('ProductDocumentRelationship', 'document=%s' % docid)
         if data:
-            return [self._factory.reconstitute(x) for x in data]
+            return [self._factory.remember(x) for x in data]
 
     def GetPDRByItemID(self, itemid):
         data = self._RPC.getObjects('ProductDocumentRelationship', 'document=%s' % itemid)
         if data:
-            return [self._factory.reconstitute(x) for x in data]
+            return [self._factory.remember(x) for x in data]
 
 # OBE vwk 28oct02
 #    def DelIdr(self, idr):

From waterbug at ned.gsfc.nasa.gov  Wed Oct  8 00:33:22 2003
From: waterbug at ned.gsfc.nasa.gov (waterbug CVS)
Date: Tue Oct  7 23:33:23 2003
Subject: [Pangalactic-commits] Added test for GetAcusByCompKey() (expected:
	gets one acu from test data).
Message-ID: <200310080333.h983XMJr013271@ned.gsfc.nasa.gov>

Modified files:
PanGalactic/pangalactic/client/tests/test_xmlrpcinterface.py 1.5 1.6

Log message:
Added test for GetAcusByCompKey() (expected:  gets one acu from test data).


Index: PanGalactic/pangalactic/client/tests/test_xmlrpcinterface.py
diff -u PanGalactic/pangalactic/client/tests/test_xmlrpcinterface.py:1.5 PanGalactic/pangalactic/client/tests/test_xmlrpcinterface.py:1.6
--- PanGalactic/pangalactic/client/tests/test_xmlrpcinterface.py:1.5	Tue Oct  7 14:46:06 2003
+++ PanGalactic/pangalactic/client/tests/test_xmlrpcinterface.py	Tue Oct  7 23:33:21 2003
@@ -52,8 +52,27 @@
 xcli = XmlrpcInterface('beeblebrox.gsfc.nasa.gov', '8080')
 
 # create a pm just for getting its pv's ...
+
 h2g2 = Project(id='H2G2', id_context='TEST')
 pm1 = PM(id='HOG', id_context='TEST', _project=h2g2)
 res = xcli.getPvByPm(pm1)
+print res[0]
+
+# ACU test
+
+comp_key = {
+            'assembly_id'                : '1',
+            'assembly_of_pmm_id'         : 'Default Model',
+            'assembly_of_pv_id'          : '42',
+            'assembly_of_pm_id'          : 'HOG',
+            'assembly_of_pm_id_context'  : 'TEST',
+            'component_id'               : '1',
+            'component_of_pmm_id'        : 'Default Model',
+            'component_of_pv_id'         : '3B',
+            'component_of_pm_id'         : 'IDrive',
+            'component_of_pm_id_context' : 'TEST'
+           }
+
+res = xcli.GetAcusByCompKey(comp_key)
 print res[0]
 

From waterbug at ned.gsfc.nasa.gov  Wed Oct  8 00:35:51 2003
From: waterbug at ned.gsfc.nasa.gov (waterbug CVS)
Date: Tue Oct  7 23:35:52 2003
Subject: [Pangalactic-commits] More upgrades to server unit tests.
Message-ID: <200310080335.h983ZplJ013313@ned.gsfc.nasa.gov>

Modified files:
PanGalactic/pangalactic/test/IDTEST 1.17 1.18
PanGalactic/pangalactic/test/README 1.21 1.22
PanGalactic/pangalactic/test/test_db_getByRowKey.py 1.1 1.2
PanGalactic/pangalactic/test/test_factory_record2RowKey.py 1.1 1.2
PanGalactic/pangalactic/test/test_pger_addExtracts.py 1.2 1.3
PanGalactic/pangalactic/test/test_xmlrpc_getobjects.py 1.9 1.10

Log message:
More upgrades to server unit tests.


Index: PanGalactic/pangalactic/test/test_pger_addExtracts.py
diff -u PanGalactic/pangalactic/test/test_pger_addExtracts.py:1.2 PanGalactic/pangalactic/test/test_pger_addExtracts.py:1.3
--- PanGalactic/pangalactic/test/test_pger_addExtracts.py:1.2	Mon Oct  6 17:16:32 2003
+++ PanGalactic/pangalactic/test/test_pger_addExtracts.py	Tue Oct  7 23:35:50 2003
@@ -1,12 +1,10 @@
-# $Id: test_pger_addExtracts.py,v 1.2 2003/10/06 21:16:32 waterbug Exp $
+# $Source: /repo/step_testbed/PanGalactic/pangalactic/test/test_pger_addExtracts.py,v $
 
 """
 Functional test for pangalactic.repo.Pger.addExtracts()
   - initializes PgerDb, PgerObjectRegistry, and Pger
   - executes Pger interface call:
     - addExtracts()
-  - returns a datetime stamp (the pger_create_datetime and
-    pger_mod_datetime for all committed data)
 """
 
 from pprint import pprint
@@ -55,8 +53,7 @@
 extracts = [pe, pme, pve]
 
 def success(result):
-    for defres in result:
-        defres.addCallback(lambda x: pprint(x))
+    pprint(result)
     reactor.stop()
 
 def failure(error):

Index: PanGalactic/pangalactic/test/test_db_getByRowKey.py
diff -u PanGalactic/pangalactic/test/test_db_getByRowKey.py:1.1 PanGalactic/pangalactic/test/test_db_getByRowKey.py:1.2
--- PanGalactic/pangalactic/test/test_db_getByRowKey.py:1.1	Mon Oct  6 17:16:31 2003
+++ PanGalactic/pangalactic/test/test_db_getByRowKey.py	Tue Oct  7 23:35:49 2003
@@ -1,4 +1,4 @@
-# $Id: test_db_getByRowKey.py,v 1.1 2003/10/06 21:16:31 waterbug Exp $
+# $Id: test_db_getByRowKey.py,v 1.2 2003/10/08 03:35:49 waterbug Exp $
 
 """
 Test for inserting a row using pangalactic.repo.db module
@@ -18,32 +18,40 @@
 fac = POF(reg)
 pgerdb = PgerDb()
 
-rowkeys = [['project', {'id' : 'H2G2',
-                        'id_context' : 'TEST'}],
-           ['product_master', {'id' : 'HOG',
-                               'id_context' : 'TEST'}],
-           ['product_version', {'id' : '42',
+rk1 = ['project', {'id' : 'H2G2',
+                        'id_context' : 'TEST'}]
+
+rk2 = ['product_master', {'id' : 'HOG',
+                               'id_context' : 'TEST'}]
+
+rk3 = ['product_version', {'id' : '42',
                                 'id_context' : 'PGER',
-                                'of_pm_id' : 'HOG'}],
-           ['product_master', {'id' : 'IDrive',
+                                'of_pm_id' : 'HOG'}]
+
+rk4 = ['product_master', {'id' : 'IDrive',
                                'id_context' : 'TEST'}]
-          ]
 
-for rk in rowkeys:
+def success(stuff):
+    print '========================================='
+    print 'pgef_class is %s' % stuff[0].pgef_class
+    print 'results are:'
+    pprint(stuff)
+
+def failure(error):
+    print error
+
+a = pgerdb.getByRowKey(rk1)
+a.addCallbacks(success, failure)
 
-    def success(stuff):
-        print '========================================='
-        print 'pgef_class is %s' % stuff[0].pgef_class
-        print 'results are:'
-        pprint(stuff)
-        reactor.stop()
+b = pgerdb.getByRowKey(rk2)
+b.addCallbacks(success, failure)
 
-    def failure(error):
-        print error
-        reactor.stop()
+c = pgerdb.getByRowKey(rk3)
+c.addCallbacks(success, failure)
 
-    d = pgerdb.getByRowKey(rk)
-    d.addCallbacks(success, failure)
+d = pgerdb.getByRowKey(rk4)
+d.addCallbacks(success, failure)
 
-    reactor.run()
+reactor.run()
 
+reactor.stop()

Index: PanGalactic/pangalactic/test/test_factory_record2RowKey.py
diff -u PanGalactic/pangalactic/test/test_factory_record2RowKey.py:1.1 PanGalactic/pangalactic/test/test_factory_record2RowKey.py:1.2
--- PanGalactic/pangalactic/test/test_factory_record2RowKey.py:1.1	Mon Oct  6 17:16:32 2003
+++ PanGalactic/pangalactic/test/test_factory_record2RowKey.py	Tue Oct  7 23:35:50 2003
@@ -11,14 +11,14 @@
 fac = POF(reg)
 extracts = fac.extractall([pm])
 print '====================='
-print 'extracts:'
+print 'extracts (%s):' % len(extracts)
 print extracts
 recs = [fac.extract2Record(e) for e in extracts]
 print '====================='
-print 'records:'
+print 'records (%s):' % len(recs)
 print recs
 rowkeys = [fac.record2RowKey(rec) for rec in recs]
 print '====================='
-print 'rowkeys:'
-print pprint(rowkeys)
+print 'rowkeys (%s):' % len(rowkeys)
+print rowkeys
 

Index: PanGalactic/pangalactic/test/IDTEST
diff -u PanGalactic/pangalactic/test/IDTEST:1.17 PanGalactic/pangalactic/test/IDTEST:1.18
--- PanGalactic/pangalactic/test/IDTEST:1.17	Mon Oct  6 17:16:31 2003
+++ PanGalactic/pangalactic/test/IDTEST	Tue Oct  7 23:35:49 2003
@@ -1 +1 @@
-269
\ No newline at end of file
+291
\ No newline at end of file

Index: PanGalactic/pangalactic/test/README
diff -u PanGalactic/pangalactic/test/README:1.21 PanGalactic/pangalactic/test/README:1.22
--- PanGalactic/pangalactic/test/README:1.21	Mon Oct  6 17:16:31 2003
+++ PanGalactic/pangalactic/test/README	Tue Oct  7 23:35:49 2003
@@ -1,4 +1,4 @@
-$Id: README,v 1.21 2003/10/06 21:16:31 waterbug Exp $
+$Id: README,v 1.22 2003/10/08 03:35:49 waterbug Exp $
 
 Pan Galactic Engineering Repository Test Scripts
 ================================================
@@ -16,17 +16,21 @@
 test_db_runsequencequery.py
 test_db_addrow.py
 test_db_addrows.py        test_registry.py
+test_db_getByRowKey.py
             \              /
         test_factory_test.py
         test_factory_sync.py
         test_factory_extractall.py
         test_factory_extract2Record.py
         test_factory_makeObjects.py
+        test_factory_record2RowKey.py
         test_factory_unmakeObject.py
                  |
-        test_pger_getresultsets.py
+        test_pger_get.py
+        test_pger_getResultSets.py
         test_pger_gettuplers.py
         test_pger_getobjects.py
+        test_pger_getRefdRowKeys.py
         test_pger_addExtracts.py
         test_pger_addObjects.py
         test_pger_create.py

Index: PanGalactic/pangalactic/test/test_xmlrpc_getobjects.py
diff -u PanGalactic/pangalactic/test/test_xmlrpc_getobjects.py:1.9 PanGalactic/pangalactic/test/test_xmlrpc_getobjects.py:1.10
--- PanGalactic/pangalactic/test/test_xmlrpc_getobjects.py:1.9	Mon Oct  6 17:16:32 2003
+++ PanGalactic/pangalactic/test/test_xmlrpc_getobjects.py	Tue Oct  7 23:35:50 2003
@@ -1,4 +1,4 @@
-# $Id: test_xmlrpc_getobjects.py,v 1.9 2003/10/06 21:16:32 waterbug Exp $
+# $Id: test_xmlrpc_getobjects.py,v 1.10 2003/10/08 03:35:50 waterbug Exp $
 
 """
 Functional test for pangalactic.repo.xmlrpc.PgerXmlrpcService
@@ -26,19 +26,17 @@
     pprint(stuff)
     print "===================================="
     print "\n***  Remembered objects:"
-    olist = []
-    for x in stuff:
-        o = pgr._factory.remember(x)
-        olist.append(o)
+    olist = pgr._factory.rememberAll(stuff)
     print "%s %s(s) found" % (len(olist), typename)
     if olist:
         print "===================================="
         pprint(olist)
         print "===================================="
-        print """\nHere's the first %s:""" % typename
-        print "===================================="
-        print olist[0]
+        print """\nHere they are:"""
         print "===================================="
+        for o in olist:
+            print o
+            print "===================================="
     reactor.stop()
 
 def failure(error):

From waterbug at ned.gsfc.nasa.gov  Wed Oct  8 00:37:32 2003
From: waterbug at ned.gsfc.nasa.gov (waterbug CVS)
Date: Tue Oct  7 23:37:33 2003
Subject: [Pangalactic-commits] Add test for getResultSets with refs=1.
Message-ID: <200310080337.h983bW85013354@ned.gsfc.nasa.gov>

Modified files:
PanGalactic/pangalactic/test/test_pger_getResultSetsWithRefs.py None 1.1

Log message:
Add test for getResultSets with refs=1.


From waterbug at ned.gsfc.nasa.gov  Wed Oct  8 00:39:37 2003
From: waterbug at ned.gsfc.nasa.gov (waterbug CVS)
Date: Tue Oct  7 23:39:39 2003
Subject: [Pangalactic-commits] A heaping helping of new server code.
Message-ID: <200310080339.h983dbN0013400@ned.gsfc.nasa.gov>

Modified files:
PanGalactic/pangalactic/repo/db.py 1.23 1.24
PanGalactic/pangalactic/repo/factory.py 1.29 1.30
PanGalactic/pangalactic/repo/pger.py 1.43 1.44
PanGalactic/pangalactic/repo/xmlrpc.py 1.21 1.22

Log message:
A heaping helping of new server code.


Index: PanGalactic/pangalactic/repo/factory.py
diff -u PanGalactic/pangalactic/repo/factory.py:1.29 PanGalactic/pangalactic/repo/factory.py:1.30
--- PanGalactic/pangalactic/repo/factory.py:1.29	Mon Oct  6 00:30:58 2003
+++ PanGalactic/pangalactic/repo/factory.py	Tue Oct  7 23:39:36 2003
@@ -1,11 +1,11 @@
-# $Id: factory.py,v 1.29 2003/10/06 04:30:58 waterbug Exp $
+# $Id: factory.py,v 1.30 2003/10/08 03:39:36 waterbug Exp $
 
 """
 Pan Galactic Object Factory module
-@version: $Revision: 1.29 $
+@version: $Revision: 1.30 $
 """
 
-__version__ = "$Revision: 1.29 $"[11:-2]
+__version__ = "$Revision: 1.30 $"[11:-2]
 
 import types
 from pprint import pprint
@@ -52,71 +52,80 @@
         """
         pass
 
-    def resultsets2Extracts(self, resultsets):
+    def resultset2Extract(self, res):
         """
-        Convert a sequence of pyPgSQL resultsets into "extract"
-        format (see L{pangalactic.utils.factory}).
+        Convert a pyPgSQL resultset into an "extract"
+        (see L{pangalactic.utils.factory.extract}).
         """
-        extracts = []
-        if resultsets:
-            for res in resultsets:
-                obj = self._registry.pgerdb_classes[res.pgef_class]
-                schema = obj._schema
-                module = obj.__module__
-                s = [ (a, self.cook(getattr(res, a), schema[a]))
-                      for a in schema ]
-                instdict = dict(s)
-                name = module + '.' + res.pgef_class
-                extr = [ name, instdict ]
-                extracts.append(extr)
-            return extracts
-        else:
-            return []
+        obj = self._registry.pgerdb_classes[res.pgef_class]
+        schema = obj._schema
+        module = obj.__module__
+        s = [ (a, self.cook(getattr(res, a), schema[a]))
+              for a in schema ]
+        instdict = dict(s)
+        name = module + '.' + res.pgef_class
+        e = [ name, instdict ]
+        return e
+
+    def resultlist2Extract(self, reslist):
+        """
+        Convert a pyPgSQL resultlist into an "extract"
+        (see L{pangalactic.utils.factory.extract}).
+        """
+        # This code depends on the fact that 'pgef_class' is the
+        # second attribute in *all* PGER tables (because it is
+        # the second attribute of PgefObject).
+        obj = self._registry.pgerdb_classes[reslist[1]]
+        schema = obj._schema
+        module = obj.__module__
+        s = [ (a, self.cook(reslist[self._registry.table_cols.index(a)],
+                            schema[a]))
+               for a in schema ]
+        instdict = dict(s)
+        name = module + '.' + res.pgef_class
+        e = [ name, instdict ]
+        return e
 
-    def extracts2Records(self, extracts):
+    def extract2Record(self, e):
         """
         Take a list of extracts and convert them to a list of
         "records" for use in the addRows() method of
         L{pangalactic.repo.db.PgerDb}.
 
-        @type extracts:   a list
-        @param extracts:  a list of extracts -- see
-                          L{pangalactic.utils.factory.extract}
+        @type e:   list
+        @param e:  an extract -- see
+                   L{pangalactic.utils.factory.extract}
 
         @rtype:  list
-        @return: a list of "records".  A record has the following
-                 structure:  [tablename, {colname : value, ...}]
+        @return: a "record", which has the following structure:
+                 [tablename, {colname : value, ...}]
         """
-        recs = []
-        for e in extracts:
-            classname = e[0].split('.')[-1]
-            schema = self._registry.pgef_classes[classname]._schema
-            table = self._registry.getTableName(classname)
-            for a in e[1]:
-                e[1][a] = self.uncook(e[1][a], schema[a])
-            recs.append([table, e[1]])
-        return recs
-
-    def records2RowKeys(self, records):
-        """
-        Take a list of records and extracts the rowkeys -- i.e.,
-        the values of the primary key for each record.
-
-        @type records:   a list
-        @param records:  a list of records -- see
-                         L{pangalactic.repo.factory.extracts2Records}
+        classname = e[0].split('.')[-1]
+        schema = self._registry.pgef_classes[classname]._schema
+        table = self._registry.getTableName(classname)
+        for a in e[1]:
+            e[1][a] = self.uncook(e[1][a], schema[a])
+        rec = [table, e[1]]
+        return rec
+
+    def record2RowKey(self, record):
+        """
+        Take a record and extract the rowkey -- i.e., the values
+        of the primary key.
+
+        @type record:   list
+        @param record:  a "record" -- see
+                        L{pangalactic.repo.factory.extract2Record}
 
         @rtype:  list
         @return: a list of "rowkeys".  A rowkey has the following
                  structure:  [tablename, {pkcolname : value, ...}]
         """
-        rowkeys = []
-        for rec in records:
-            pk = self._registry.table_pkeys[rec[0]]
-            pks = [(a, rec[1][a]) for a in pk]
-            key = dict(pks)
-            rowkeys.append([rec[0], key])
-        return rowkeys
+        pk = self._registry.table_pkeys[record[0]]
+        pks = [(a, record[1][a]) for a in pk]
+        key = dict(pks)
+        rowkey = [record[0], key]
+        return rowkey
 
     def unmakeObject(self, obj):
         """

Index: PanGalactic/pangalactic/repo/db.py
diff -u PanGalactic/pangalactic/repo/db.py:1.23 PanGalactic/pangalactic/repo/db.py:1.24
--- PanGalactic/pangalactic/repo/db.py:1.23	Sun Oct  5 17:28:45 2003
+++ PanGalactic/pangalactic/repo/db.py	Tue Oct  7 23:39:36 2003
@@ -1,10 +1,10 @@
 """
 Pan Galactic Engineering Repository Database Interface
 
-@version: $Revision: 1.23 $
+@version: $Revision: 1.24 $
 """
 
-__version__ = "$Revision: 1.23 $"[11:-2]
+__version__ = "$Revision: 1.24 $"[11:-2]
 # $Source: /repo/step_testbed/PanGalactic/pangalactic/repo/db.py,v $
 
 # Twisted imports ...
@@ -29,7 +29,7 @@
 
     def doPgerdbQuery(self, table, subtypes, *args, **kw):
         """
-        Runs a query submitted as a list of args against a
+        Run a query submitted as a list of args against a
         specified table.
 
         @type table:  string
@@ -61,6 +61,20 @@
         else:
             raise TypeError, 'I need at least one search parameter'
 
+    def getByRowKey(self, rowkey):
+        """
+        Get the resultset for this rowkey.
+
+        @type rowkey:  list
+        @param rowkey: a rowkey (for more about rowkeys, see
+                       L{pangalactic.repo.factory.record2RowKey})
+
+        @rtype:   a PgResultSet
+        @return:  the result set that matches this rowkey.
+        """
+        sqlargs = sql.buildSelectFromRowKey(rowkey)
+        return self.runQuery(*sqlargs)
+
     def addRow(self, table, *args, **kw):
         """
         Add a row to the specified table.
@@ -93,7 +107,7 @@
         """
         Add a series of rows, in a single transaction, from a
         list of records (for a description of "records", see
-        L{pangalactic.repo.factory.extracts2Records}).
+        L{pangalactic.repo.factory.extract2Record}).
 
         @type records:  list
         @param records: a list of records -- see
@@ -104,40 +118,40 @@
         sqlstmt, parms = sql.buildTransactionalInsert(records)
         d = self.runOperation(sqlstmt, *parms)
         logmsg = 'addRows: rows added to tables %s.' % str(tables)
-        d.addCallback(lambda x: self._addRowsDone(x, logmsg))
+        d.addCallback(lambda x: self._addRowsConfirm(x, logmsg))
         d.addErrback(self.interactionError)
         return d
 
-    def _addRowsDone(self, d, logmsg):
+    def _addRowsConfirm(self, d, logmsg):
         """
         Callback for addRows success.
         """
-        log.msg("%s operation %s" % (reflect.qual(self.__class__), logmsg))
+        log.msg("%s %s" % (reflect.qual(self.__class__), logmsg))
         return d
 
     def operationDone(self, done):
         """
         Callback for database operation success.
         """
-        log.msg("%s Operation Done: %s" % (reflect.qual(self.__class__), done))
+        log.msg("%s Operation done: %s" % (reflect.qual(self.__class__), done))
 
     def operationError(self, error):
         """
         Callback for database operation failure.
         """
-        log.msg("%s Operation Failed: %s" % (reflect.qual(self.__class__), error))
+        log.msg("%s Operation failed: %s" % (reflect.qual(self.__class__), error))
         log.err(error)
 
     def interactionDone(self, done):
         """
         Callback for database interaction success.
         """
-        log.msg("%s Interaction Done: %s" % (reflect.qual(self.__class__), done))
+        log.msg("%s Interaction done: %s" % (reflect.qual(self.__class__), done))
 
     def interactionError(self, error):
         """
         Callback for database interaction failure.
         """
-        log.msg("%s Interaction Failed: %s" % (reflect.qual(self.__class__), error))
+        log.msg("%s Interaction failed: %s" % (reflect.qual(self.__class__), error))
         log.err(error)
 

Index: PanGalactic/pangalactic/repo/pger.py
diff -u PanGalactic/pangalactic/repo/pger.py:1.43 PanGalactic/pangalactic/repo/pger.py:1.44
--- PanGalactic/pangalactic/repo/pger.py:1.43	Sun Oct  5 17:34:30 2003
+++ PanGalactic/pangalactic/repo/pger.py	Tue Oct  7 23:39:36 2003
@@ -1,21 +1,22 @@
 """
 Pan Galactic Entropy Reverser module
-@version: $Revision: 1.43 $
+@version: $Revision: 1.44 $
 """
 
-__version__ = "$Revision: 1.43 $"[11:-2]
+__version__ = "$Revision: 1.44 $"[11:-2]
 # $Source: /repo/step_testbed/PanGalactic/pangalactic/repo/pger.py,v $
 
 import time
+from pprint import pprint
 from mx.DateTime.ISO import ParseDateTime
 # Twisted imports ...
 from twisted.internet import defer
 from twisted.spread import pb
 from twisted.enterprise import adbapi
-from twisted.python import log
+from twisted.python import log, reflect
 # PanGalactic imports ...
-from pangalactic.utils import pgefexceptions
 from pangalactic.utils import oid
+from pangalactic.utils import utils
 from pangalactic.repo.pgerpb import DefaultPgerPerspective
 from pangalactic.repo.registry import PgerObjectRegistry
 from pangalactic.repo.factory import PgerObjectFactory
@@ -86,7 +87,7 @@
         """
         pb.Service.startService(self)
 
-    def getResultSets(self, typename, refs=1, subtypes=0, **kw):
+    def getResultSets(self, typename, refs=0, subtypes=0, **kw):
         """
         From the table corresponding to the specified type, get
         all PGERDB rows that match the supplied kw parameters.
@@ -103,7 +104,7 @@
         @type  refs:  integer
         @param refs:  specifies whether to include the objects
                       referenced by the specified class.
-                          0:  do not get references
+                          0:  (default) do not get refs
                           1:  get all references
                       (in future, refs may specify how many
                       reference levels to follow ...)
@@ -112,12 +113,15 @@
         @param subtypes:  specifies whether to include only the
                           specified class (the default) or all
                           subtypes.
-                              0:  only this type
+                              0:  (default) only this type
                               1:  include subtypes
 
         @param kw:  keyword arguments of the form:
                         key:   an attribute of the object
                         value: the value to be selected by
+
+        @rtype:  list
+        @return: list of pyPgSQL result sets
         """
         table = self._registry.getTableName(typename)
         if kw:
@@ -126,19 +130,59 @@
             for a in kw.keys():
                 if not a in self._registry.table_cols[table]:
                     raise ValueError, '%s is not in the schema of %s' % (a, typename)
-                dbargs.append((a, kw[a]))
+                dbargs.append((a, kw[a], '='))
             # TODO: implement refs and subtypes ...
-            rset = self._pgerdb.doPgerdbQuery(table, 0, *dbargs)
-            rset.addErrback(log.err)
-            return rset
+            dres = self._pgerdb.doPgerdbQuery(table, 0, *dbargs)
+            dres.addErrback(log.err)
+            if not refs:
+                return dres
+            else:
+                dres.addCallback(self._getRefdRowKeys)
+                dres.addCallback(lambda x:
+                        [self._pgerdb.getByRowKey(rk)
+                         for rk in x])
+                dres.addCallback(defer.gatherResults)
+                return dres
         else:
-            # return a deferred empty list -- has to be deferred
-            # because that's the expected result (maybe raise an
-            # error when we have better error handling).
             d = defer.Deferred()
             d.callback([])
             return d
 
+
+    def _getRefdRowKeys(self, rsets):
+        """
+        Get all rowkeys of objects referenced by a list of
+        resultsets (including rowkeys of the objects represented
+        in the resultsets themselves).
+        """
+        if rsets:
+            rowkeys = []
+            for rs in rsets:
+                cname = rs.pgef_class
+                table = self._registry.getTableName(cname)
+                klass = self._registry.pgef_classes[cname]
+                refd = klass._refd
+                pk = klass._pk
+                fk = klass._fk
+                rowdict = {}
+                for key in pk:
+                    rowdict[key] = getattr(rs, key)
+                rk = [table, rowdict]
+                rowkeys.append(rk)
+                if refd:
+                    for a in refd:
+                        table = self._registry.getTableName(refd[a])
+                        refdpk = self._registry.pgef_classes[refd[a]]._pk
+                        rowdict = {}
+                        for key in refdpk:
+                            rowdict[key] = getattr(rs, 
+                                               fk[a][refdpk.index(key)])
+                        rk = [table, rowdict]
+                        rowkeys.append(rk)
+            return rowkeys
+        else:
+            return []
+
     def getObjects(self, typename, refs=1, subtypes=0, **kw):
         """
         Get all PGEF objects of a specified type that match the
@@ -190,12 +234,7 @@
             return result.addCallback(lambda res: 
                                       self._factory.makeObjects(tn, res))
         else:
-            # for now, return all objects.
-            result = self._pgerdb.doPgerdbQuery(table, 0)
-            result.addErrback(log.err)
-            return result.addCallback(lambda res:
-                                      self._factory.makeObjects(tn, res))
-        # might need some more error handling here ...
+            raise ValueError, 'No criteria were supplied.'
 
     def getDisplayMappings(self, typename=None):
         """
@@ -377,21 +416,61 @@
              pger_create_datetime and pger_mod_datetime for all
              the committed objects
 
-        @type elist:    a list of extracts of instances of subclasses of 
-                        L{pangalactic.enterprise.pgefobject.PgefObject}
-        @param elist:   a list of extracts of PGEF objects
+        @type extracts:  list
+        @param extracts: list of extracts of instances of subclasses of
+                         L{pangalactic.enterprise.pgefobject.PgefObject}
+
+        @rtype:  list
+        @return: list of extracts the PGEF objects
+                 L{pangalactic.enterprise.pgefobject.PgefObject}
+                 that were added
         """
         # TODO:  role-based authorization checks based on object
         # type, etc.
-        parmdict = {}
         dt = time.strftime("%Y-%m-%d %H:%M:%S")
-        parmdict['pger_create_datetime'] = dt
-        parmdict['pger_mod_datetime'] = dt
+        datetimes = {}
+        datetimes['pger_create_datetime'] = dt
+        datetimes['pger_mod_datetime'] = dt
         for e in extracts:
-            e[1].update(parmdict)
-        recs = self._factory.extracts2Records(extracts)
-        self._pgerdb.addRows(recs)
-        return dt
+            e[1].update(datetimes)
+        recs = [self._factory.extract2Record(e)
+                                         for e in extracts]
+        d = self._pgerdb.addRows(recs)
+        d.addCallback(lambda x: self._verifyAddExtract(recs))
+        d.addCallback(lambda x:
+                      [self._factory.resultset2Extract(rsl[0])
+                       for rsl in x])
+        return d
+        # okay, the "rsl[0]" is because _verifyAddExtract returns
+        # a list of *lists* of resultsets (sheesh!), but there
+        # is only one resultset in each list because getByRowKey
+        # just returns one record (it had better!) -- hence the
+        # rsl[0] is safe ...  if weird
+
+    def _verifyAddExtract(self, recs):
+        """
+        Verify that a list of records have been added to PGERDB
+        by doing a query on the rowkeys of the records to check
+        that they are in the database.
+
+        @type records:   list
+        @param records:  a list of records -- see
+                         L{pangalactic.repo.factory.extract2Record}
+        """
+        return defer.gatherResults(
+            [self._pgerdb.getByRowKey(
+                self._factory.record2RowKey(rec))
+                for rec in recs])
+
+    def _addExtractsError(self, error):
+        """
+        Callback for error in addExtracts.
+
+        @type error:   a deferred error
+        @param error:  the error propagated by failure of a deferred 
+        """
+        log.msg("%s addExtracts failed: %s" % (reflect.qual(self.__class__), error))
+        log.err(error)
 
     def createProductMaster(self, id, id_context, project_id, project_id_context, **kw):
         """Creates a ProductMaster in PGER from kw data

Index: PanGalactic/pangalactic/repo/xmlrpc.py
diff -u PanGalactic/pangalactic/repo/xmlrpc.py:1.21 PanGalactic/pangalactic/repo/xmlrpc.py:1.22
--- PanGalactic/pangalactic/repo/xmlrpc.py:1.21	Sun Oct  5 17:36:05 2003
+++ PanGalactic/pangalactic/repo/xmlrpc.py	Tue Oct  7 23:39:36 2003
@@ -1,9 +1,9 @@
 """
 PGER XML-RPC Interfaces module
-@version: $Revision: 1.21 $
+@version: $Revision: 1.22 $
 """
 
-__version__ = "$Revision: 1.21 $"[11:-2]
+__version__ = "$Revision: 1.22 $"[11:-2]
 # $Source: /repo/step_testbed/PanGalactic/pangalactic/repo/xmlrpc.py,v $
 
 from twisted.web import xmlrpc
@@ -49,50 +49,70 @@
             s += """ya gotta have somethin' ...!"""
             return s
 
-    def xmlrpc_getObjects(self, typename, refs, subtypes, *args):
+    def xmlrpc_getObjects(self, typename, refs,
+                                subtypes, criteria):
         """
         XMLRPC getObjects:  get the set of objects that exactly
         match a specified set of attribute-value pairs, returning
-        the result encoded in the "extract" format -- see
+        the result as a list of "extracts" -- see
         L{pangalactic.utils.factory.extract})
 
-        usage:  getObjects([object type], [kw-string, ...])
-        
-        ... where kw-strings have the form: 'param=value'
-        (i.e., they are not real keyword parameters since
-        XMLRPC doesn't support keyword parameters; they are
-        quoted strings that will be parsed by the server).
+        @type typename:   string
+        @param typename:  the name of a class that extends
+                          L{pangalactic.enterprise.pgefobject.PgefObject}
+
+        @type refs:   boolean
+        @param refs:  whether to return all referenced objects or
+                      only the specified class
+                          0:  (default) only the specified class
+                          1:  include all reference objects
+
+        @type subtypes:   boolean
+        @param subtypes:  whether to return all subtypes of the
+                          requested type or not
+                              0:  (default) not
+                              1:  include all subtypes
+
+        @type criteria:   list or dictionary
+        @param criteria:  the selection criteria can take either
+                          of two forms:
+                              - list:  a list of [attr, value] pairs
+                              - dict:  a dictionary: {attr : value, ...}
         """
-        if args:
-            kw = {}
-            tuples = []
-            for a in args:
-                if a and isinstance(a, list):
-                    tuples.append(a)
-                if a and isinstance(a, dict):
-                    kw.update(a)
-            if tuples:
-                kw.update(dict(tuples))
+        if criteria:
+            if isinstance(criteria, list):
+                kw = dict(criteria)
+            elif isinstance(criteria, dict):
+                kw = criteria
             res = self.PGER.getResultSets(typename, refs,
                                           subtypes, **kw)
-            res.addCallback(self.PGER._factory.resultsets2Extracts)
-            res.addCallbacks(succeed, fail)
+            if refs:
+                res.addCallback(lambda x:
+                            [self.PGER._factory.resultset2Extract(rsl[0])
+                             for rsl in x])
+            else:
+                res.addCallback(lambda x:
+                            [self.PGER._factory.resultset2Extract(rs)
+                             for rs in x])
             return res
         else:
             return """I'm sorry, Dave, I'm afraid I can't do that."""
 
-    def xmlrpc_addObjects(self, elist):
+    def xmlrpc_addObjects(self, extracts):
         """xmlrpc method to add objects.
 
-        usage:  addObjects(list of jellied objects)
+        usage:  addObjects(list of extracts)
         """
         # TODO: it would be more efficient to convert the extract
         # directly into the (classname, kw) used by PgerDb's
         # addRow(), rather than making an object and then
         # creating the (classname, kw) from that.  But this is
         # easier for now ...
-        if elist:
-            return self.PGER.addExtracts(elist)
+        if extracts:
+            # need some error checking here!
+            # also, could make it so arg could be either a single
+            # extract or a list of extracts ...
+            return self.PGER.addExtracts(extracts)
         else:
             return """I'm sorry, Dave, I'm afraid I can't do that."""
 

From waterbug at ned.gsfc.nasa.gov  Wed Oct  8 02:53:01 2003
From: waterbug at ned.gsfc.nasa.gov (waterbug CVS)
Date: Wed Oct  8 01:53:03 2003
Subject: [Pangalactic-commits] Replaced GetAcusByCompKey() with
	GetAcusByAssembly(), which takes a PMV object as its arg.
Message-ID: <200310080553.h985r1b9013930@ned.gsfc.nasa.gov>

Modified files:
PanGalactic/pangalactic/utils/xmlrpcinterface.py 1.12 1.13

Log message:
Replaced GetAcusByCompKey() with GetAcusByAssembly(), which takes a PMV object as its arg.


Index: PanGalactic/pangalactic/utils/xmlrpcinterface.py
diff -u PanGalactic/pangalactic/utils/xmlrpcinterface.py:1.12 PanGalactic/pangalactic/utils/xmlrpcinterface.py:1.13
--- PanGalactic/pangalactic/utils/xmlrpcinterface.py:1.12	Tue Oct  7 23:31:30 2003
+++ PanGalactic/pangalactic/utils/xmlrpcinterface.py	Wed Oct  8 01:52:59 2003
@@ -3,14 +3,15 @@
 """
 PanGalactic Client XMLRPC Interfaces
 
-@version: $Revision: 1.12 $
+@version: $Revision: 1.13 $
 """
 
-__version__ = "$Revision: 1.12 $"[11:-2]
+__version__ = "$Revision: 1.13 $"[11:-2]
 
 import xmlrpclib
 import types
 from pangalactic.utils.factory import PgefFactory
+from pangalactic.enterprise.assemblycomponentusage import AssemblyComponentUsage as ACU
 
 
 #getObjects('Product', 'name=Mr. Fusion')
@@ -174,13 +175,17 @@
         if data:
             return [self._factory.remember(x) for x in data]
 
-    def GetAcusByCompKey(self, comp_key):
-        print "getacusbycompkey"
-        #print 'comp key was: %s' % repr(comp_key)
-        #data = self._RPC.getObjects('AssemblyComponentUsage', 1, 0, *comp_key)
-        print "compkey", comp_key
-        data = self._RPC.getObjects('AssemblyComponentUsage', 1, 0, comp_key)
-        #print 'reply was: \n %s' % data
+    def GetAcusByAssembly(self, assembly):
+        """
+        Get all AssemblyComponentUsages in which the argument (a
+        L{pangalactic.enterprise.productmodelversion.ProductModelVersion}
+        is the _assembly (the object that contains the _component
+        object).
+        """
+        print "in xmlrpcinterface.GetAcusByAssembly"
+        acu = ACU(_assembly=assembly)
+        keydict = dict([(a, getattr(acu, a)) for a in ACU._fk['_assembly']])
+        data = self._RPC.getObjects('AssemblyComponentUsage', 1, 0, keydict)
         if data:
             return self._factory.rememberAll(data)
 

From waterbug at ned.gsfc.nasa.gov  Wed Oct  8 02:56:30 2003
From: waterbug at ned.gsfc.nasa.gov (waterbug CVS)
Date: Wed Oct  8 01:56:31 2003
Subject: [Pangalactic-commits] Substituted new GetAcusByAssembly() method
	for GetAcusByCompKey().
Message-ID: <200310080556.h985uUCs014000@ned.gsfc.nasa.gov>

Modified files:
PanGalactic/pangalactic/utils/datamanager.py 1.39 1.40

Log message:
Substituted new GetAcusByAssembly() method for GetAcusByCompKey().


Index: PanGalactic/pangalactic/utils/datamanager.py
diff -u PanGalactic/pangalactic/utils/datamanager.py:1.39 PanGalactic/pangalactic/utils/datamanager.py:1.40
--- PanGalactic/pangalactic/utils/datamanager.py:1.39	Tue Oct  7 14:12:30 2003
+++ PanGalactic/pangalactic/utils/datamanager.py	Wed Oct  8 01:56:29 2003
@@ -1,6 +1,6 @@
 # $Source: /repo/step_testbed/PanGalactic/pangalactic/utils/datamanager.py,v $
 
-__version__ = "$Revision: 1.39 $"[11:-2]
+__version__ = "$Revision: 1.40 $"[11:-2]
 
 import time
 import mx.DateTime
@@ -356,9 +356,9 @@
         objlist = []
 
         for id in AssemblyIDList:
-            #print "checking " + id
+            print "checking " + id
             temp_obj = self.localDB.GetItem(id)
-            objlist = self.server.GetAcusByCompKey(createACUSearchByAssembly(temp_obj))
+            objlist = self.server.GetAcusByAssembly(temp_obj)
 
             if not objlist:
                 return None

From waterbug at ned.gsfc.nasa.gov  Wed Oct  8 04:57:07 2003
From: waterbug at ned.gsfc.nasa.gov (waterbug CVS)
Date: Wed Oct  8 03:57:09 2003
Subject: [Pangalactic-commits] Test for GetAcusByAssembly().
Message-ID: <200310080757.h987v77V015427@ned.gsfc.nasa.gov>

Modified files:
PanGalactic/pangalactic/client/tests/test_xmlrpcinterface.py 1.6 1.7

Log message:
Test for GetAcusByAssembly().


Index: PanGalactic/pangalactic/client/tests/test_xmlrpcinterface.py
diff -u PanGalactic/pangalactic/client/tests/test_xmlrpcinterface.py:1.6 PanGalactic/pangalactic/client/tests/test_xmlrpcinterface.py:1.7
--- PanGalactic/pangalactic/client/tests/test_xmlrpcinterface.py:1.6	Tue Oct  7 23:33:21 2003
+++ PanGalactic/pangalactic/client/tests/test_xmlrpcinterface.py	Wed Oct  8 03:57:05 2003
@@ -14,6 +14,7 @@
 from pangalactic.enterprise.productversion import ProductVersion as PV
 from pangalactic.enterprise.productmodelmaster import ProductModelMaster as PMM
 from pangalactic.enterprise.productmodelversion import ProductModelVersion as PMV
+from pangalactic.enterprise.assemblycomponentusage import AssemblyComponentUsage as ACU
 
 f = open('../../test/IDTEST')
 savedid = f.read()
@@ -60,19 +61,12 @@
 
 # ACU test
 
-comp_key = {
-            'assembly_id'                : '1',
-            'assembly_of_pmm_id'         : 'Default Model',
-            'assembly_of_pv_id'          : '42',
-            'assembly_of_pm_id'          : 'HOG',
-            'assembly_of_pm_id_context'  : 'TEST',
-            'component_id'               : '1',
-            'component_of_pmm_id'        : 'Default Model',
-            'component_of_pv_id'         : '3B',
-            'component_of_pm_id'         : 'IDrive',
-            'component_of_pm_id_context' : 'TEST'
-           }
+pmvHOG = PMV(id='1', 
+             of_pmm_id='Default Model',
+             of_pv_id='42',
+             of_pm_id='HOG',
+             of_pm_id_context='TEST')
 
-res = xcli.GetAcusByCompKey(comp_key)
-print res[0]
+res = xcli.GetAcusByAssembly(pmvHOG)
+print res
 

From waterbug at ned.gsfc.nasa.gov  Wed Oct  8 06:18:44 2003
From: waterbug at ned.gsfc.nasa.gov (waterbug CVS)
Date: Wed Oct  8 05:18:46 2003
Subject: [Pangalactic-commits] First cut at a wrapper for Express Engine.
Message-ID: <200310080918.h989Iidb016265@ned.gsfc.nasa.gov>

Modified files:
PanGalactic/pangalactic/repo/expressengine.py None 1.1

Log message:
First cut at a wrapper for Express Engine.


From pbear at ned.gsfc.nasa.gov  Wed Oct  8 12:30:49 2003
From: pbear at ned.gsfc.nasa.gov (pbear CVS)
Date: Wed Oct  8 11:30:50 2003
Subject: [Pangalactic-commits] changed from obj._of_xxx.id to obj.of_xxx_id;
	only get pmvs on login; typo in xmlrpc
Message-ID: <200310081530.h98FUnXb022161@ned.gsfc.nasa.gov>

Modified files:
PanGalactic/pangalactic/client/modules/psm/itemdroptarget.py 1.30 1.31
PanGalactic/pangalactic/client/modules/psm/itemeditframe.py 1.104 1.105
PanGalactic/pangalactic/client/modules/psm/pgefdoctree.py 1.18 1.19
PanGalactic/pangalactic/client/modules/psm/pgefedittree.py 1.30 1.31
PanGalactic/pangalactic/client/modules/psm/pgeftree.py 1.27 1.28
PanGalactic/pangalactic/client/modules/psm/pgefversiontree.py 1.4 1.5
PanGalactic/pangalactic/client/modules/psm/psmtool.py 1.116 1.117
PanGalactic/pangalactic/utils/datamanager.py 1.40 1.41
PanGalactic/pangalactic/utils/localdb.py 1.38 1.39
PanGalactic/pangalactic/utils/xmlrpcinterface.py 1.13 1.14

Log message:
changed from obj._of_xxx.id to obj.of_xxx_id; only get pmvs on login; typo in xmlrpc


Index: PanGalactic/pangalactic/client/modules/psm/pgeftree.py
diff -u PanGalactic/pangalactic/client/modules/psm/pgeftree.py:1.27 PanGalactic/pangalactic/client/modules/psm/pgeftree.py:1.28
--- PanGalactic/pangalactic/client/modules/psm/pgeftree.py:1.27	Mon Sep 29 15:18:19 2003
+++ PanGalactic/pangalactic/client/modules/psm/pgeftree.py	Wed Oct  8 11:30:46 2003
@@ -9,7 +9,7 @@
 import pangalactic.utils.objectstatus as objectstatus
 import cPickle, types
 
-__version__ = "$Revision: 1.27 $"[11:-2]
+__version__ = "$Revision: 1.28 $"[11:-2]
 
 
 class PgefTree(wxTreeCtrl):
@@ -185,20 +185,21 @@
                     print "  maybe need to rebuild datamanager.nauoIDs?"
                     print "  nauonodes", NauoNodes
             
-        #print "num nauonodes:" + str(len(NauoNodes))
+        #print "num nauonodes", len(NauoNodes)
         #print "nauonodes:", NauoNodes
         treeid = roottreenode
         for id in NauoNodes:
             nauoobj = parent.DataManager.localDB.GetNauo(id)
-            #print "nauoobj", id
+            #print "nauoobj", nauoobj
             itemobj = nauoobj._component
+            #print "itemobj", itemobj
 
             if itemobj and nauoobj.state <> objectstatus.DELETE:
                 #print "itemobj", itemobj
                 #print "nauoobj.component:", nauoobj.component, "; action: ", str(nauoobj.state)
                 #print "product id:", itemobj.id, "; action:", itemobj.state, "; parent:", itemobj.has_parts_flag
 
-                foo = itemobj._of_master.id + "." + itemobj._of_version.id
+                foo = itemobj.of_pm_id + "." + itemobj.of_pv_id
                 #print "appending foo", foo
                 treeid = self.AppendItem(roottreenode, foo)
                 self.SetPyData(treeid, [nauoobj.pgef_oid, itemobj.pgef_oid])
@@ -244,7 +245,7 @@
             #print itemobj.name, itemobj.has_parts_flag
             if itemobj.state <> objectstatus.DELETE:
                 #print "appending", itemobj.name
-                foo = itemobj._of_master.id + "." + itemobj._of_version.id
+                foo = itemobj.of_pm_id + "." + itemobj.of_pv_id
                 treeid = self.AppendItem(roottreenode, foo)
                 self.SetPyData(treeid, ['TOPLEVEL', itemobj.pgef_oid])
                 self.SetItemImage(treeid, self.itemicon)

Index: PanGalactic/pangalactic/client/modules/psm/itemdroptarget.py
diff -u PanGalactic/pangalactic/client/modules/psm/itemdroptarget.py:1.30 PanGalactic/pangalactic/client/modules/psm/itemdroptarget.py:1.31
--- PanGalactic/pangalactic/client/modules/psm/itemdroptarget.py:1.30	Mon Sep 29 15:18:19 2003
+++ PanGalactic/pangalactic/client/modules/psm/itemdroptarget.py	Wed Oct  8 11:30:46 2003
@@ -9,7 +9,7 @@
 from wxPython.wx import wxCustomDataObject, wxCustomDataFormat, wxPyDropTarget
 from wxPython.wx import true, false, wxPoint, wxTreeItemIcon_Selected
 
-__version__ = "$Revision: 1.30 $"[11:-2]
+__version__ = "$Revision: 1.31 $"[11:-2]
 
 #constants
 
@@ -202,7 +202,7 @@
 
             # create the new tree node
             dropobj = [newnauo.pgef_oid, dropitem.pgef_oid]
-            foo = dropitem._of_master.id + "." + dropitem._of_version.id
+            foo = dropitem.of_pm_id + "." + dropitem.of_pv_id
             id = self.tree.AppendItem(targetnode, foo)
             self.tree.SetItemImage(id, self.tree.itemicon)
             self.tree.SetItemImage(id, self.tree.itemicon, wxTreeItemIcon_Selected)

Index: PanGalactic/pangalactic/utils/xmlrpcinterface.py
diff -u PanGalactic/pangalactic/utils/xmlrpcinterface.py:1.13 PanGalactic/pangalactic/utils/xmlrpcinterface.py:1.14
--- PanGalactic/pangalactic/utils/xmlrpcinterface.py:1.13	Wed Oct  8 01:52:59 2003
+++ PanGalactic/pangalactic/utils/xmlrpcinterface.py	Wed Oct  8 11:30:47 2003
@@ -3,10 +3,10 @@
 """
 PanGalactic Client XMLRPC Interfaces
 
-@version: $Revision: 1.13 $
+@version: $Revision: 1.14 $
 """
 
-__version__ = "$Revision: 1.13 $"[11:-2]
+__version__ = "$Revision: 1.14 $"[11:-2]
 
 import xmlrpclib
 import types
@@ -113,7 +113,7 @@
                 'of_pm_id_context' : pmm.of_pm_id_context,
                 'of_pv_id' : pmm.of_pv_id,
                 'of_pmm_id' : pmm.id}
-        data = self._RPC.getObjects('ProductModelMaster', 0, 0, crit)
+        data = self._RPC.getObjects('ProductModelVersion', 0, 0, crit)
         if data:
             return [self._factory.remember(x, [pmm, pmm._of_version, pmm._of_master])
                     for x in data]
@@ -148,6 +148,7 @@
         data = self._RPC.getObjects('ProductModelVersion', 1, 0,
                                     {'project_id' : project})
         if data:
+            #print "have data", len(data)
             return self._factory.rememberAll(data, objs)
 
     def GetPMV(self, ItemId, objs=[]):
@@ -164,13 +165,13 @@
             return [self._factory.remember(x) for x in data]
 
     def GetOrganizations(self):
-        print "xmlrpc.getorgs"
+        print "xmlrpc.getorganizations"
         data = self._RPC.getObjects('Organization', "id_context=DEMO")  ## NOT staying.  Demo only!!  --vwk 28feb2003
         if data:
             return [self._factory.remember(x) for x in data]
 
     def GetOrganization(self, ObjId):
-        print "getorganization"
+        print "xmlrpc.getorganization"
         data = self._RPC.getObjects('Organization', 'pgef_oid=%s' % ObjId)
         if data:
             return [self._factory.remember(x) for x in data]
@@ -182,11 +183,13 @@
         is the _assembly (the object that contains the _component
         object).
         """
-        print "in xmlrpcinterface.GetAcusByAssembly"
+        #print "in xmlrpcinterface.GetAcusByAssembly"
         acu = ACU(_assembly=assembly)
         keydict = dict([(a, getattr(acu, a)) for a in ACU._fk['_assembly']])
+        #print "keydict", keydict
         data = self._RPC.getObjects('AssemblyComponentUsage', 1, 0, keydict)
         if data:
+            #print "have data"
             return self._factory.rememberAll(data)
 
     def GetPerson(self, user_tuple):

Index: PanGalactic/pangalactic/client/modules/psm/pgefversiontree.py
diff -u PanGalactic/pangalactic/client/modules/psm/pgefversiontree.py:1.4 PanGalactic/pangalactic/client/modules/psm/pgefversiontree.py:1.5
--- PanGalactic/pangalactic/client/modules/psm/pgefversiontree.py:1.4	Tue Oct  7 14:35:01 2003
+++ PanGalactic/pangalactic/client/modules/psm/pgefversiontree.py	Wed Oct  8 11:30:46 2003
@@ -28,7 +28,7 @@
 
         self.DeleteAllItems()
         rootitem = datamanager.localDB.GetItem(rootitemid)
-        foo = rootitem._of_master.id + "." + rootitem._of_version.id
+        foo = rootitem.of_pm_id + "." + rootitem.of_pv_id
         self.nodeStack.append(self.AddRoot(foo))
         rootnode = self.GetRootItem()
 

Index: PanGalactic/pangalactic/client/modules/psm/itemeditframe.py
diff -u PanGalactic/pangalactic/client/modules/psm/itemeditframe.py:1.104 PanGalactic/pangalactic/client/modules/psm/itemeditframe.py:1.105
--- PanGalactic/pangalactic/client/modules/psm/itemeditframe.py:1.104	Tue Oct  7 13:59:03 2003
+++ PanGalactic/pangalactic/client/modules/psm/itemeditframe.py	Wed Oct  8 11:30:46 2003
@@ -1,6 +1,6 @@
 # $Source: /repo/step_testbed/PanGalactic/pangalactic/client/modules/psm/itemeditframe.py,v $
 
-__version__ = "$Revision: 1.104 $"[11:-2]
+__version__ = "$Revision: 1.105 $"[11:-2]
 
 # Python imports
 import copy
@@ -1223,21 +1223,21 @@
         elif self.pm_pv_form.EditingProductMaster:
             #print 'editing Product Master'
             olditem = self.DataManager.localDB.GetItem(itemid)
-            save_object = olditem._of_master
+            save_object = olditem #._of_master
             self.pm_pv_form.FillPMWithFormData(save_object)
             save_object.state = pangalactic.utils.objectstatus.MODIFY
             
         elif self.pm_pv_form.EditingProductVersion:
             #print 'editing Product Version'
             olditem = self.DataManager.localDB.GetItem(itemid)
-            save_object = olditem._of_version
+            save_object = olditem #._of_version
             self.pm_pv_form.FillPVWithFormData(save_object)
             save_object.state = pangalactic.utils.objectstatus.MODIFY
             
         elif self.pmm_pmv_form.EditingProductModelMaster:
             #print 'editing Product Model Master'
             olditem = self.DataManager.localDB.GetItem(itemid)
-            save_object = olditem._of_model_master
+            save_object = olditem #._of_model_master
             self.pmm_pmv_form.FillPMMWithFormData(save_object)
             save_object.state = pangalactic.utils.objectstatus.MODIFY
             

Index: PanGalactic/pangalactic/client/modules/psm/pgefdoctree.py
diff -u PanGalactic/pangalactic/client/modules/psm/pgefdoctree.py:1.18 PanGalactic/pangalactic/client/modules/psm/pgefdoctree.py:1.19
--- PanGalactic/pangalactic/client/modules/psm/pgefdoctree.py:1.18	Wed Sep 17 13:12:24 2003
+++ PanGalactic/pangalactic/client/modules/psm/pgefdoctree.py	Wed Oct  8 11:30:46 2003
@@ -54,7 +54,7 @@
         #print "pgefdoctree: loadtreefrompls"
         self.DeleteAllItems()
         rootitem = datamanager.localDB.GetItem(rootitemid)
-        foo = rootitem._of_master.id + "." + rootitem._of_version.id
+        foo = rootitem.of_pm_id + "." + rootitem.of_pv_id
         self.nodeStack.append(self.AddRoot(foo))
         rootnode = self.GetRootItem()
 
@@ -147,7 +147,7 @@
 
         self.DeleteAllItems()
         rootitem = datamanager.localDB.GetItem(rootitemid)
-        foo = rootitem._of_master.id + "." + rootitem._of_version.id
+        foo = rootitem.of_pm_id + "." + rootitem.of_pv_id
         self.nodeStack.append(self.AddRoot(foo))
         rootnode = self.GetRootItem()
 

Index: PanGalactic/pangalactic/client/modules/psm/pgefedittree.py
diff -u PanGalactic/pangalactic/client/modules/psm/pgefedittree.py:1.30 PanGalactic/pangalactic/client/modules/psm/pgefedittree.py:1.31
--- PanGalactic/pangalactic/client/modules/psm/pgefedittree.py:1.30	Mon Sep 29 15:18:19 2003
+++ PanGalactic/pangalactic/client/modules/psm/pgefedittree.py	Wed Oct  8 11:30:46 2003
@@ -34,7 +34,7 @@
 
         self.DeleteAllItems()
         rootitem = datamanager.localDB.GetItem(rootitemid)
-        foo = rootitem._of_master.id + "." + rootitem._of_version.id
+        foo = rootitem.of_pm_id + "." + rootitem.of_pv_id
         self.nodeStack.append(self.AddRoot(foo))
         rootnode = self.GetRootItem()
 
@@ -98,12 +98,12 @@
         if classname == "ProductMaster":
             foo = rootitem.id
         elif classname == "ProductModelMaster":
-            foo = rootitem._of_master.id + "." + rootitem._of_version.id
+            foo = rootitem.of_pm_id + "." + rootitem.of_pv_id
         elif classname == "ProductVersion":
-            foo = rootitem._of_master.id + "." + rootitem.id
+            foo = rootitem.of_pm_id + "." + rootitem.id
         elif classname == "ProductModelVersion":
-            foo = rootitem._of_master.id + "." + rootitem._of_version.id
-#        foo = rootitem._of_master.id + "." + rootitem._of_version.id
+            foo = rootitem.of_pm_id + "." + rootitem.of_pv_id
+
         self.nodeStack.append(self.AddRoot(foo))
 #        self.nodeStack.append(self.AddRoot(rootitem.name))  changed name to foo here and below.  vwk.
         rootnode = self.GetRootItem()
@@ -201,11 +201,7 @@
                 #print "component: " + itemobj.id
                 
                 if itemobj and nauoobj.state <> objectstatus.DELETE:
-#                    if len(itemobj.name) > 0:
-#                        foo = itemobj.name
-#                    else:
-#                        foo = itemobj.id
-                    foo = itemobj._of_master.id + "." + itemobj._of_version.id
+                    foo = itemobj.of_pm_id + "." + itemobj.of_pv_id
                     treeid = self.AppendItem(rootnode, foo)
                     self.SetPyData(treeid, [nauoobj.pgef_oid, itemobj.pgef_oid])
                     self.SetItemImage(treeid, self.itemicon)

Index: PanGalactic/pangalactic/client/modules/psm/psmtool.py
diff -u PanGalactic/pangalactic/client/modules/psm/psmtool.py:1.116 PanGalactic/pangalactic/client/modules/psm/psmtool.py:1.117
--- PanGalactic/pangalactic/client/modules/psm/psmtool.py:1.116	Tue Oct  7 13:59:03 2003
+++ PanGalactic/pangalactic/client/modules/psm/psmtool.py	Wed Oct  8 11:30:46 2003
@@ -9,7 +9,7 @@
 This module is the main application code for the pgef client interface
 """
 
-__version__ = "$Revision: 1.116 $"[11:-2]
+__version__ = "$Revision: 1.117 $"[11:-2]
 
 import os
 import sys
@@ -285,11 +285,11 @@
         
         
     def onGridGlickGetVersions(self, event):
-        print 'model master grid was clicked'
+        #print 'model master grid was clicked'
         ndx = event.GetRow()
         obj = event.GetEventObject().GetDataObj(ndx)
         objs = self.version_tree.LoadTreefromObjects(self.DataManager, obj)
-        print objs
+        #print objs
         
     # WDR: methods for MyFrame
     def SelectView(self, event):
@@ -300,7 +300,7 @@
         currentpage = self.remainingSpace.GetSelection()
         if currentpage != 0:
             self.tree_notebook.SetSelection(1)
-            print 'changed tree'
+            #print 'changed tree'
     
     def GetCurrentGrid(self):
         currentpage = self.remainingSpace.GetSelection()
@@ -978,7 +978,7 @@
                
 
     def ItemClicked(self, itemobj):  #ndx):
-        #print "psmtool.itemclicked", itemobj._of_master.id
+        #print "psmtool.itemclicked"
 #        itemid = self.itemgrid.GetObjectOid(ndx)
         itemid = itemobj.pgef_oid
         self.State.treeroot = itemid
@@ -1093,47 +1093,6 @@
                 #print "numitems", numitems
                 self.FillItemWidgetFromProject(project)
 
-##                localitemdict = self.DataManager.localDB.GetLocalProducts(project, pmv = 1)
-##                itemlist = []
-##                for objid, obj in localitemdict.items():
-##                    localobj = localitemdict[objid]
-##                    if localobj.name:
-##                        foo = localobj._of_master.id + "." + localobj._of_version.id + " (" + localobj.name + ")"
-##                    else:
-##                        foo = localobj._of_master.id + "." + localobj._of_version.id
-##                    itemlist.append([foo, obj])
-
-###                if len(itemlist) == 0:
-###                    wxEndBusyCursor()
-###                    if dlg:
-###                        dlg.Destroy()
-###                    return
-###                else:
-##                if len(itemlist) > 0:
-##                    itemlist.sort()
-
-##                    # moved this here so Export is only enabled if there is stuff to export
-##                    wgt = self.Parent.menuBar.FindMenuItem('File', 'Export')
-##                    self.Parent.menuBar.Enable(wgt, true)
-
-##                    self.FillGridWithProducts(self.itemgrid, itemlist)
-##                    self.itemgrid.ClearGrid()
-##                    self.itemgrid.DefaultBackgroundColour()
-##                    self.itemgrid.ClearSelection()
-
-##                    self.itemgrid.BeginBatch()
-##                    for name, item in itemlist:
-##                        self.itemgrid.AddData(item)
-
-##                    self.itemgrid.MakeCellVisible(0, 0)
-##                    self.itemgrid.EndBatch()
-##                    self.topWindow.toppanel.FillItemWidget(itemlist, "Select a Product Model")
-##                    self.itemlistcount = len(itemlist)
-
-##    #                wgt = self.topWindow.toppanel.GetItemWidget()
-##    #                wgt.Enable(true)
-##    #                wgt.SetSelection(0)
-
                 if numitems > 0:
                     wgt = self.Parent.menuBar.FindMenuItem('File', 'Export')
                     self.Parent.menuBar.Enable(wgt, true)
@@ -1225,9 +1184,9 @@
                 if classname == "ProductModelVersion":
                     #print "  append pmv"
                     if newitem.name:
-                        foo = newitem._of_master.id + "." + newitem._of_version.id + " (" + newitem.name + ")"
+                        foo = newitem.of_pm_id + "." + newitem.of_pv_id + " (" + newitem.name + ")"
                     else:
-                        foo = newitem._of_master.id + "." + newitem._of_version.id
+                        foo = newitem.of_pm_id + "." + newitem.of_pv_id
                     wgt.AddData(foo, newitem)
 
                     # commented out for now.  don't automatically change the selected item.  vwk
@@ -1273,15 +1232,15 @@
                     pm_list.append([item.id, item])
 
                 elif classname == "ProductModelMaster":
-                    foo = item._of_master.id + "." + item._of_version.id
+                    foo = item.of_pm_id + "." + item.of_pv_id
                     pmm_list.append([foo, item])
 
                 elif classname == "ProductVersion":
-                    foo = item._of_master.id + "." + item.id
+                    foo = item.of_pm_id + "." + item.id
                     pv_list.append([foo, item])
 
                 elif classname == "ProductModelVersion":
-                    foo = item._of_master.id + "." + item._of_version.id
+                    foo = item.of_pm_id + "." + item.of_pv_id
                     pmv_list.append([foo, item])
 
             pm_list.sort()
@@ -1311,29 +1270,13 @@
         itemlist = []
         for item in localpmvs:
             if item.name:
-                foo = item._of_master.id + "." + item._of_version.id + " (" + item.name + ")"
+                foo = item.of_pm_id + "." + item.of_pv_id + " (" + item.name + ")"
             else:
-                foo = item._of_master.id + "." + item._of_version.id
+                foo = item.of_pm_id + "." + item.of_pv_id
             itemlist.append([foo, item])
         itemlist.sort()
         self.topWindow.toppanel.FillItemWidget(itemlist, "Select a Product Model")
 
-#        self.FillItemWidget(localpmvs)
-#        widget.SetSelection(0)
-
-
-#    def FillItemWidget(self, itemlist):
-#        print "psmtool.fillitemwgt"
-#        widget = self.topWindow.toppanel.GetItemWidget()
-#        widget.Clear()
-#        widget.Append('Select a Product Model')
-#        for item in itemlist:
-#            if item.name:
-#                foo = item._of_master.id + "." + item._of_version.id + " (" + item.name + ")"
-#            else:
-#                foo = item._of_master.id + "." + item._of_version.id
-#            widget.Append(foo)
-#        widget.SetSelection(0)
 
     def FillGridWithProducts(self, grid, productlist):
         #print "fillgridwithproducts"
@@ -1530,11 +1473,11 @@
 
             
     def OnEditComponent(self, event):
-        print "psmtool.oneditcomponent"
+        #print "psmtool.oneditcomponent"
         node = self.tree.GetSelection()
         if node.IsOk():
             nodedata = self.tree.GetPyData(node)
-            print "nodedata", nodedata
+            #print "nodedata", nodedata
             if node == self.tree.GetRootItem():
                 if nodedata[1] == "ROOT":
                     return
@@ -1632,7 +1575,7 @@
             wxSafeYield()
             
     def QuickCreate(self, event = None):
-        print "psmtool.quickcreate"
+        #print "psmtool.quickcreate"
         create_results = quickcreate.showQuickCreate(self)
         if create_results:
             #print 'in psmtools, quickcreate'

Index: PanGalactic/pangalactic/utils/datamanager.py
diff -u PanGalactic/pangalactic/utils/datamanager.py:1.40 PanGalactic/pangalactic/utils/datamanager.py:1.41
--- PanGalactic/pangalactic/utils/datamanager.py:1.40	Wed Oct  8 01:56:29 2003
+++ PanGalactic/pangalactic/utils/datamanager.py	Wed Oct  8 11:30:47 2003
@@ -1,6 +1,6 @@
 # $Source: /repo/step_testbed/PanGalactic/pangalactic/utils/datamanager.py,v $
 
-__version__ = "$Revision: 1.40 $"[11:-2]
+__version__ = "$Revision: 1.41 $"[11:-2]
 
 import time
 import mx.DateTime
@@ -257,9 +257,11 @@
         try:
             #data = self.server.CallServerFunction(projectlist,'GetItemByProject', self.auth)
             data = self.server.GetPmvByProject(projectlist[0])
-            pms = self.server.GetPmByProject(projectlist[0])
-            pvs = self.server.GetPvByProject(projectlist[0])
-            pmms = self.server.GetPmmByProject(projectlist[0])
+
+            # only need to get the lowest level???  --vwk 8oct2003
+            #pms = self.server.GetPmByProject(projectlist[0])
+            #pvs = self.server.GetPvByProject(projectlist[0])
+            #pmms = self.server.GetPmmByProject(projectlist[0])
             #print 'items for project: %s are: %s' % (projectlist[0], data)
         except Exception, e:
             print "no items in project"
@@ -289,6 +291,7 @@
 
 
         if len(tempobjlist) > 0:
+            #print len(tempobjlist)
             self.localDB.Save(tempobjlist)
 
             # tbd - need to revisit after the project info is ironed out as this will not work for more than 1 project
@@ -350,15 +353,16 @@
     
     def getNAUOByAssemblyID(self, AssemblyIDList, NauoID = 'ROOT'):
         """Retrieves all of the NAUOs associated with an AssemblyID"""
-        #print "getnauobyassemblyid"
+        #print "datamanager.getnauobyassemblyid"
 
         retlist = []
         objlist = []
 
         for id in AssemblyIDList:
-            print "checking " + id
+            #print "checking " + id
             temp_obj = self.localDB.GetItem(id)
             objlist = self.server.GetAcusByAssembly(temp_obj)
+            #print "len objlist", len(objlist)
 
             if not objlist:
                 return None
@@ -371,15 +375,18 @@
                     continue
 
                 if obj.__class__.__name__ == "AssemblyComponentUsage":
-#                if isinstance(obj, AssemblyComponentUsage):
                     nauoobjs.append(obj)
+                    #print "appending", obj.__class__.__name__
+                    #print obj
                 elif obj.__class__.__name__ == "ProductModelVersion":
-#                elif isinstance(obj, ProductModelVersion):
                     itemobjs.append(obj)
+                    #print "appending", obj.__class__.__name__
+                    #print obj
 
             if len(nauoobjs) > 0:
                 updatedacuobjs = []
                 nauoids = []
+                #print "saving nauoobjs", len(nauoobjs)
                 updatedacuobjs = self.localDB.Save(nauoobjs)
 
                 #add the nauos to the projectobject dictionary in localdb
@@ -406,14 +413,13 @@
         
         for obj in objlist:
             if obj.__class__.__name__ == "AssemblyComponentUsage":
-#            if isinstance(obj, AssemblyComponentUsage):
                 nauo = self.localDB.GetNauo(obj.pgef_oid)
                 retlist.append(nauo)
 
             elif obj.__class__.__name__ == "ProductModelVersion":
-#            elif isinstance(obj, ProductModelVersion):
                 item = self.localDB.GetItem(obj.pgef_oid)
                 retlist.append(item)
+        #print "len retlist", len(retlist)
         return retlist
 
 
@@ -869,17 +875,17 @@
     def getVersionTreeObjects(self, root_object):
         objs = []
         if self.user._loggedin:
-            print 'logged in'
+            #print 'logged in'
             if root_object.__class__.__name__ == 'ProductMaster':
-                objs = self.server.GetPvByPm(root_object._of_pm_id, root_object._of_pm_id_context)
+                objs = self.server.getPvByPm(root_object)
             elif root_object.__class__.__name__ == 'ProductVersion':
-                objs = self.server.GetPmmByPv(root_object._of_pm_id, root_object._of_pm_id_context, root_object._of_pv_id)
+                objs = self.server.getPmmByPv(root_object)
             elif root_object.__class__.__name__ == 'ProductModelMaster':
-                objs = self.server.GetPmvByPm(root_object._of_pm_id, root_object._of_pm_id_context, root_object._of_pv_id, root_object._of_pmm_id)
+                objs = self.server.getPmvByPmm(root_object)
             elif root_object.__class__.__name__ == 'ProductModelVersion':
                 return None
         else:
-            print 'not logged in'
+            #print 'not logged in'
             objs = self.localDB.getVersionTreeObjects(root_object)
             return objs
             

Index: PanGalactic/pangalactic/utils/localdb.py
diff -u PanGalactic/pangalactic/utils/localdb.py:1.38 PanGalactic/pangalactic/utils/localdb.py:1.39
--- PanGalactic/pangalactic/utils/localdb.py:1.38	Tue Oct  7 15:16:15 2003
+++ PanGalactic/pangalactic/utils/localdb.py	Wed Oct  8 11:30:47 2003
@@ -263,7 +263,6 @@
         
     def SaveACU(self, aculist):
         #print "localdb.SaveACU"
-        #import pprint
         retlist = []
         for acuobj in aculist:
             try:
@@ -275,20 +274,19 @@
             component_tuple = data_utils.createACUComponentTuple(acuobj)
             
             if not self.dbroot[self.ACUBYASSEMBLY].has_key((assembly_tuple, component_tuple)):
-                #print "no key", assembly_tuple, component_tuple
+                #print "no acubyassembly key", assembly_tuple, component_tuple
                 updated_acu = self.updateACU(acuobj)
                 self.dbroot[self.ACUDICT][updated_acu.pgef_oid] = updated_acu
                 self.dbroot[self.ACUBYASSEMBLY][(assembly_tuple, component_tuple)] = updated_acu
-                #pprint.pprint(acuobj.__dict__)
                 retlist.append(updated_acu)
             else:
-                #print "have key", assembly_tuple, component_tuple
+                #print "have acubyassembly key", assembly_tuple, component_tuple
                 updated_acu = self.dbroot[self.ACUBYASSEMBLY][(assembly_tuple, component_tuple)]
                 self.dbroot[self.ACUDICT][updated_acu.pgef_oid] = updated_acu  # add this to fix itemdropdown selection bug??? vwk
                 retlist.append(updated_acu)
                 
         self.Commit()
-        #print "len retlist", len(retlist)#, retlist
+        #print "len retlist", len(retlist)
         #print "acudict", self.GetACUDict()
         return retlist
         
@@ -302,11 +300,13 @@
         if assembly_pmv:
             acu_obj._assembly = assembly_pmv
         else:
+            #print "saving assemblypmv"
             self.SavePMV([acu_obj._assembly])
             
         if component_pmv:
             acu_obj._component = component_pmv
         else:
+            #print "saving componentpmv"
             self.SavePMV([acu_obj._component])
             
         return acu_obj
@@ -658,6 +658,8 @@
         
     
     def getProductByCompoundKey(self, comp_key, type):
+        #print "localdb.getproductbycompoundkey"
+        dict = None
         if type == 'pmv':
             dict = self.PMVBYPRIMARYKEY
         elif type == 'pmm':
@@ -666,12 +668,18 @@
             dict = self.PVBYPRIMARYKEY
         elif type == 'pm':
             dict = self.PMBYPRIMARYKEY
-            
-        temp = self.dbroot[dict][comp_key]
-        if temp:
-            return temp
-        else:
-            return None
+
+        if dict:
+            try:
+                temp = self.dbroot[dict][comp_key]
+                if temp:
+                    #print "found", temp
+                    return temp
+            except:
+                #print "no product for key", comp_key, "in dict", dict
+                return None
+
+        return None
 
 
     def GetDocumentDict(self):
@@ -1019,15 +1027,10 @@
         #print "localdb.save"
         retlist = []
         if unsavedlist:
-            #print "have unsaved list + len: " + str(len(unsavedlist))
+            #print "have unsaved list; len: " + str(len(unsavedlist))
             for obj in unsavedlist:
-                #print type(obj)
-                #print isinstance(obj,ProductModelVersion)
-                #print obj.__class__.__name__
-                # print "have obj"
-                #if isinstance(obj, nauo.NAUO):
+                #print obj.__class__.__name__, obj.id, obj.name
                 if obj.__class__.__name__ == "AssemblyComponentUsage":
-#                if isinstance(obj, AssemblyComponentUsage): #pcu
                     #print "localdb.save.acu"
                     if self.dbroot[self.ACUDICT].has_key(obj.pgef_oid):
                         #print "have key"
@@ -1037,19 +1040,17 @@
                             #print "have state"
                             #print "obj.state " + str(obj.state)
                             if override:
-                                #print "override", obj.pgef_oid
+                                #print "override", obj.pgef_oid, obj.id
                                 retlist.extend(self.SaveACU([obj]))
                         else:
-                            #print "no state", obj.pgef_oid
+                            #print "no state", obj.pgef_oid, obj.id
                             retlist.extend(self.SaveACU([obj]))
                     else:
-                        #print "no key", obj.pgef_oid
+                        #print "no key", obj.pgef_oid, obj.id
                         retlist.extend(self.SaveACU([obj]))
 
                 elif obj.__class__.__name__ == "ProductModelVersion":
-#                elif isinstance(obj, ProductModelVersion):
                     #print "have ProductModelVersion"
-                    #print obj.pgpdm_oid
                     if self.dbroot[self.ITEMDICT].has_key(obj.pgef_oid):
                         #print "have key"
                         #print "obj state: " + str(obj.state)
@@ -1240,8 +1241,7 @@
 #                        retlist.extend(self.SaveWfEventAudit([obj]))
                         self.SaveWfTransition([obj])
                 else:
-                    print "have unknown obj to save"
-                    #print repr(obj)
+                    print "have unknown obj to save", obj.__class__.__name__, obj.id
         self.Commit()
         #print "retlist", retlist
         return retlist

From waterbug at ned.gsfc.nasa.gov  Wed Oct  8 21:28:58 2003
From: waterbug at ned.gsfc.nasa.gov (waterbug CVS)
Date: Wed Oct  8 20:29:00 2003
Subject: [Pangalactic-commits] Updates.
Message-ID: <200310090028.h990SwLl028607@ned.gsfc.nasa.gov>

Modified files:
PanGalactic/src/xml/pgerdb.dtd None 1.1
PanGalactic/src/xml/pgefdb.dtd 1.1.1.1 None

Log message:
Updates.


From waterbug at ned.gsfc.nasa.gov  Wed Oct  8 21:30:01 2003
From: waterbug at ned.gsfc.nasa.gov (waterbug CVS)
Date: Wed Oct  8 20:30:02 2003
Subject: [Pangalactic-commits] Clean-up.
Message-ID: <200310090030.h990U1ak028656@ned.gsfc.nasa.gov>

Modified files:
PanGalactic/pangalactic/repo/glimpseserver.py 1.7 1.8

Log message:
Clean-up.


Index: PanGalactic/pangalactic/repo/glimpseserver.py
diff -u PanGalactic/pangalactic/repo/glimpseserver.py:1.7 PanGalactic/pangalactic/repo/glimpseserver.py:1.8
--- PanGalactic/pangalactic/repo/glimpseserver.py:1.7	Tue Jul 15 14:20:42 2003
+++ PanGalactic/pangalactic/repo/glimpseserver.py	Wed Oct  8 20:29:59 2003
@@ -2,14 +2,13 @@
 PGER GlimpseServer module:  a very simple Python wrapper for
 the server interface of the full-text search engine, Glimpse.
 
-@version: $Revision: 1.7 $
+@version: $Revision: 1.8 $
 """
 
-__version__ = "$Revision: 1.7 $"[11:-2]
+__version__ = "$Revision: 1.8 $"[11:-2]
 # $Source: /repo/step_testbed/PanGalactic/pangalactic/repo/glimpseserver.py,v $
 
 import os
-from twisted.spread import pb
 from twisted.internet.utils import getProcessOutput
 
 class GlimpseServer:

From waterbug at ned.gsfc.nasa.gov  Wed Oct  8 21:32:10 2003
From: waterbug at ned.gsfc.nasa.gov (waterbug CVS)
Date: Wed Oct  8 20:32:11 2003
Subject: [Pangalactic-commits] Mods to use ACU in tests.
Message-ID: <200310090032.h990WASW028716@ned.gsfc.nasa.gov>

Modified files:
PanGalactic/pangalactic/test/IDTEST 1.18 1.19
PanGalactic/pangalactic/test/test_pger_getResultSetsWithRefs.py 1.1 1.2
PanGalactic/pangalactic/test/test_xmlrpc_getobjects.py 1.10 1.11

Log message:
Mods to use ACU in tests.


Index: PanGalactic/pangalactic/test/test_xmlrpc_getobjects.py
diff -u PanGalactic/pangalactic/test/test_xmlrpc_getobjects.py:1.10 PanGalactic/pangalactic/test/test_xmlrpc_getobjects.py:1.11
--- PanGalactic/pangalactic/test/test_xmlrpc_getobjects.py:1.10	Tue Oct  7 23:35:50 2003
+++ PanGalactic/pangalactic/test/test_xmlrpc_getobjects.py	Wed Oct  8 20:32:08 2003
@@ -1,4 +1,4 @@
-# $Id: test_xmlrpc_getobjects.py,v 1.10 2003/10/08 03:35:50 waterbug Exp $
+# $Id: test_xmlrpc_getobjects.py,v 1.11 2003/10/09 00:32:08 waterbug Exp $
 
 """
 Functional test for pangalactic.repo.xmlrpc.PgerXmlrpcService
@@ -16,18 +16,18 @@
 from pangalactic.repo.pger import Pger
 from pangalactic.repo.xmlrpc import PgerXmlrpcService
 
-typename = 'ProductMaster'
+typename = 'AssemblyComponentUsage'
 
 def success(stuff):
     print "\n***  XMLRPC Command:"
-    print """     Server.getObjects('ProductMaster', 1, 0, ['name', 'Mr. Fusion'])\n"""
+    print """     Server.getObjects('AssemblyComponentUsage', 1, 0, ['assembly_of_pm_id', 'HOG'])\n"""
     print "***  Extract list obtained as result:"
     print "===================================="
     pprint(stuff)
     print "===================================="
     print "\n***  Remembered objects:"
     olist = pgr._factory.rememberAll(stuff)
-    print "%s %s(s) found" % (len(olist), typename)
+    print "%s objects found" % len(olist)
     if olist:
         print "===================================="
         pprint(olist)
@@ -47,7 +47,7 @@
 pgr = Pger(db)
 xmlsrv = PgerXmlrpcService(pgr)
 
-res = xmlsrv.xmlrpc_getObjects(typename, 1, 0, [['name', 'Mr. Fusion']])
+res = xmlsrv.xmlrpc_getObjects(typename, 1, 0, [['assembly_of_pm_id', 'HOG']])
 res.addCallbacks(success, failure)
 
 reactor.run()

Index: PanGalactic/pangalactic/test/IDTEST
diff -u PanGalactic/pangalactic/test/IDTEST:1.18 PanGalactic/pangalactic/test/IDTEST:1.19
--- PanGalactic/pangalactic/test/IDTEST:1.18	Tue Oct  7 23:35:49 2003
+++ PanGalactic/pangalactic/test/IDTEST	Wed Oct  8 20:32:08 2003
@@ -1 +1 @@
-291
\ No newline at end of file
+298
\ No newline at end of file

Index: PanGalactic/pangalactic/test/test_pger_getResultSetsWithRefs.py
diff -u PanGalactic/pangalactic/test/test_pger_getResultSetsWithRefs.py:1.1 PanGalactic/pangalactic/test/test_pger_getResultSetsWithRefs.py:1.2
--- PanGalactic/pangalactic/test/test_pger_getResultSetsWithRefs.py:1.1	Tue Oct  7 23:37:31 2003
+++ PanGalactic/pangalactic/test/test_pger_getResultSetsWithRefs.py	Wed Oct  8 20:32:08 2003
@@ -1,4 +1,4 @@
-# $Id: test_pger_getResultSetsWithRefs.py,v 1.1 2003/10/08 03:37:31 waterbug Exp $
+# $Id: test_pger_getResultSetsWithRefs.py,v 1.2 2003/10/09 00:32:08 waterbug Exp $
 
 """
 Functional test for pangalactic.repo.pger module
@@ -13,7 +13,7 @@
 from pangalactic.repo.db import PgerDb
 from pangalactic.repo.pger import Pger
 
-typename = "ProductModelVersion"
+typename = "AssemblyComponentUsage"
 
 def success(resultsets):
     pprint(resultsets)
@@ -27,7 +27,7 @@
 pgr = Pger(pgrdb)
 
 out = pgr.getResultSets(typename, 1, 0,
-                        name='Blooper Twanging Assembly')
+                        assembly_of_pm_id='HOG')
 
 out.addCallbacks(success, failure)
 

From bmuir at ned.gsfc.nasa.gov  Thu Oct  9 14:00:20 2003
From: bmuir at ned.gsfc.nasa.gov (bmuir CVS)
Date: Thu Oct  9 13:00:23 2003
Subject: [Pangalactic-commits] highlight of selected object in the version
	tree
Message-ID: <200310091700.h99H0KO0004904@ned.gsfc.nasa.gov>

Modified files:
PanGalactic/pangalactic/client/modules/psm/pgefversiontree.py 1.5 1.6

Log message:
highlight of selected object in the version tree


Index: PanGalactic/pangalactic/client/modules/psm/pgefversiontree.py
diff -u PanGalactic/pangalactic/client/modules/psm/pgefversiontree.py:1.5 PanGalactic/pangalactic/client/modules/psm/pgefversiontree.py:1.6
--- PanGalactic/pangalactic/client/modules/psm/pgefversiontree.py:1.5	Wed Oct  8 11:30:46 2003
+++ PanGalactic/pangalactic/client/modules/psm/pgefversiontree.py	Thu Oct  9 13:00:19 2003
@@ -26,59 +26,60 @@
     def LoadTreefromProject(self, datamanager, rootitemid, rootpdrid, currentdata = None):
         """Loads the tree from the dicts in the DataManager"""
 
-        self.DeleteAllItems()
-        rootitem = datamanager.localDB.GetItem(rootitemid)
-        foo = rootitem.of_pm_id + "." + rootitem.of_pv_id
-        self.nodeStack.append(self.AddRoot(foo))
-        rootnode = self.GetRootItem()
-
-        if rootitem.has_parts_lists_flag:
-            self.SetItemHasChildren(rootnode, true)
-            
-            if datamanager.user._loggedin:
-                if not self.IsExpanded(rootnode): 
-                    datamanager.getPDRByItemID([rootitemid])
-
-        self.SetPyData(rootnode, [rootpdrid, rootitemid])
-        self.SetItemImage(rootnode, self.itemicon)
-        self.SetItemImage(rootnode, self.itemicon, wxTreeItemIcon_Selected)
-
-        lookupid = rootitemid
-        tmppdrid = rootpdrid
-
-        PdrNodes = []
-        highlightednode = None
-        if datamanager.pdrIDs.has_key(lookupid):
-            #print "found lookupid"
-            PdrNodes = datamanager.pdrIDs[lookupid]
-
-        elif datamanager.inLocalMode:
-            for pdrid, pdrobj in datamanager.localDB.GetPDRDict().items():
-                if pdrobj.pgef_oid == rootitemid:
-                    PdrNodes.append(pdrid)
-
-        for id in PdrNodes:
-            pdrobj = datamanager.localDB.GetPDR(id)
-            plobj = datamanager.localDB.GetPartsList(pdrobj.pgef_oid)
-
-            if plobj:
-                treeid = self.AppendItem(rootnode, plobj.id)
-                self.SetPyData(treeid, [pdrobj.pgef_oid, plobj.pgef_oid])
-                self.SetItemImage(treeid, self.partslisticon)
-                self.SetItemImage(treeid, self.partslisticon, wxTreeItemIcon_Selected)
-
-                if currentdata:
-                    if plobj.pgef_oid == currentdata[1] and pdrobj.pgef_oid == currentdata[0]:
-                        #print "found a node to highlight: " + str(plobj.identification)
-                        highlightednode = treeid
-
-        self.SortChildren(rootnode)
-        self.Expand(rootnode)
-
-        if highlightednode:
-            self.SelectItem(highlightednode)
-        else:
-            self.SelectItem(rootnode)
+        #self.DeleteAllItems()
+        #rootitem = datamanager.localDB.GetItem(rootitemid)
+        #foo = rootitem.of_pm_id + "." + rootitem.of_pv_id
+        #self.nodeStack.append(self.AddRoot(foo))
+        #rootnode = self.GetRootItem()
+
+        #if rootitem.has_parts_lists_flag:
+            #self.SetItemHasChildren(rootnode, true)
+            
+            #if datamanager.user._loggedin:
+                #if not self.IsExpanded(rootnode): 
+                    #datamanager.getPDRByItemID([rootitemid])
+
+        #self.SetPyData(rootnode, [rootpdrid, rootitemid])
+        #self.SetItemImage(rootnode, self.itemicon)
+        #self.SetItemImage(rootnode, self.itemicon, wxTreeItemIcon_Selected)
+
+        #lookupid = rootitemid
+        #tmppdrid = rootpdrid
+
+        #PdrNodes = []
+        #highlightednode = None
+        #if datamanager.pdrIDs.has_key(lookupid):
+            ##print "found lookupid"
+            #PdrNodes = datamanager.pdrIDs[lookupid]
+
+        #elif datamanager.inLocalMode:
+            #for pdrid, pdrobj in datamanager.localDB.GetPDRDict().items():
+                #if pdrobj.pgef_oid == rootitemid:
+                    #PdrNodes.append(pdrid)
+
+        #for id in PdrNodes:
+            #pdrobj = datamanager.localDB.GetPDR(id)
+            #plobj = datamanager.localDB.GetPartsList(pdrobj.pgef_oid)
+
+            #if plobj:
+                #treeid = self.AppendItem(rootnode, plobj.id)
+                #self.SetPyData(treeid, [pdrobj.pgef_oid, plobj.pgef_oid])
+                #self.SetItemImage(treeid, self.partslisticon)
+                #self.SetItemImage(treeid, self.partslisticon, wxTreeItemIcon_Selected)
+
+                #if currentdata:
+                    #if plobj.pgef_oid == currentdata[1] and pdrobj.pgef_oid == currentdata[0]:
+                        ##print "found a node to highlight: " + str(plobj.identification)
+                        #highlightednode = treeid
+
+        #self.SortChildren(rootnode)
+        #self.Expand(rootnode)
+
+        #if highlightednode:
+            #self.SelectItem(highlightednode)
+        #else:
+            #self.SelectItem(rootnode)
+        pass
             
     def buildVersionString(self, obj):
         if obj.__class__.__name__ == 'ProductModelVersion':
@@ -155,8 +156,6 @@
             self.Expand(pmm_treeid)
             version_obj = temp_pmm
             version_node = pmm_treeid
-            
-            
         
         objs = datamanager.getVersionTreeObjects(version_obj)
         
@@ -181,6 +180,7 @@
             self.Expand(pv_treeid)
         if temp_pmm:
             self.Expand(pmm_treeid)
+        self.SelectItem(version_node)
             
     def createTreeLabel(self, obj):
         if obj.__class__.__name__ == 'ProductModelVersion':

From pbear at ned.gsfc.nasa.gov  Thu Oct  9 14:05:20 2003
From: pbear at ned.gsfc.nasa.gov (pbear CVS)
Date: Thu Oct  9 13:05:21 2003
Subject: [Pangalactic-commits] call xmlrpcinterface.getObjects instead of
	getxxx; not fully tested.  best of luck.
Message-ID: <200310091705.h99H5KNT004985@ned.gsfc.nasa.gov>

Modified files:
PanGalactic/pangalactic/client/modules/psm/productdataform.py 1.28 1.29
PanGalactic/pangalactic/enterprise/workflow/wfinstanceoverview.py 1.5 1.6
PanGalactic/pangalactic/utils/datamanager.py 1.41 1.42
PanGalactic/pangalactic/utils/xmlrpcinterface.py 1.14 1.15

Log message:
call xmlrpcinterface.getObjects instead of getxxx; not fully tested.  best of luck.


Index: PanGalactic/pangalactic/client/modules/psm/productdataform.py
diff -u PanGalactic/pangalactic/client/modules/psm/productdataform.py:1.28 PanGalactic/pangalactic/client/modules/psm/productdataform.py:1.29
--- PanGalactic/pangalactic/client/modules/psm/productdataform.py:1.28	Mon Sep 29 14:47:56 2003
+++ PanGalactic/pangalactic/client/modules/psm/productdataform.py	Thu Oct  9 13:05:17 2003
@@ -113,7 +113,7 @@
         
     def EnablePV(self, state):
         self.GetPvDesc().SetEditable(state)
-        self.GetPvRevision().SetEditable(state)
+        self.GetPvRevision().SetEditable(false)
         self.GetPvName().SetEditable(state)
         self.GetPvNomenclature() .SetEditable(state)
         self.GetPvPoc().SetEditable(state)
@@ -158,7 +158,7 @@
         if self.GetTogglePm().GetValue():
             self.GetPmIdentifier().SetFocus()
         elif self.GetTogglePv().GetValue():
-            self.GetPvRevision().SetFocus()
+            self.GetPvName().SetFocus()
         
     def EditingMode(self):
         #print "productdataform.pmpv.editingmode"
@@ -325,7 +325,6 @@
     
     def SavePM(self, pmv):
         self.FillPMWithFormData(pmv._of_master)
-        
     
     def SavePV(self,pmv):
         self.FillPVWithFormData(pmv._of_version)
@@ -473,7 +472,7 @@
         
     def EnablePMV(self, state):
         self.GetPmvDesc().SetEditable(state)
-        self.GetPmvRevision().SetEditable(state)
+        self.GetPmvRevision().SetEditable(false)
         self.GetPmvName().SetEditable(state)
         self.GetPmvNomenclature() .SetEditable(state)
         self.GetPmvPoc().SetEditable(state)
@@ -518,7 +517,7 @@
         if self.GetTogglePmm().GetValue():
             self.GetPmmIdentifier().SetFocus()
         elif self.GetTogglePmv().GetValue():
-            self.GetPmvRevision().SetFocus()
+            self.GetPmvName().SetFocus()
         
     def EditingMode(self):
         #print "productdataform.pmmpmv.editingmode"

Index: PanGalactic/pangalactic/enterprise/workflow/wfinstanceoverview.py
diff -u PanGalactic/pangalactic/enterprise/workflow/wfinstanceoverview.py:1.5 PanGalactic/pangalactic/enterprise/workflow/wfinstanceoverview.py:1.6
--- PanGalactic/pangalactic/enterprise/workflow/wfinstanceoverview.py:1.5	Tue Oct  7 13:53:54 2003
+++ PanGalactic/pangalactic/enterprise/workflow/wfinstanceoverview.py	Thu Oct  9 13:05:18 2003
@@ -26,7 +26,7 @@
 
     The metadata for all the workflows stored in the local database are displayed
     in a grid, one per row.
-    
+     
     You can right click on a row (which will select it), and see a menu.  More on
     this in workflowgrid.
     

Index: PanGalactic/pangalactic/utils/datamanager.py
diff -u PanGalactic/pangalactic/utils/datamanager.py:1.41 PanGalactic/pangalactic/utils/datamanager.py:1.42
--- PanGalactic/pangalactic/utils/datamanager.py:1.41	Wed Oct  8 11:30:47 2003
+++ PanGalactic/pangalactic/utils/datamanager.py	Thu Oct  9 13:05:18 2003
@@ -1,6 +1,6 @@
 # $Source: /repo/step_testbed/PanGalactic/pangalactic/utils/datamanager.py,v $
 
-__version__ = "$Revision: 1.41 $"[11:-2]
+__version__ = "$Revision: 1.42 $"[11:-2]
 
 import time
 import mx.DateTime
@@ -256,13 +256,29 @@
         
         try:
             #data = self.server.CallServerFunction(projectlist,'GetItemByProject', self.auth)
-            data = self.server.GetPmvByProject(projectlist[0])
 
-            # only need to get the lowest level???  --vwk 8oct2003
+            #data = self.server.GetPmvByProject(projectlist[0])
             #pms = self.server.GetPmByProject(projectlist[0])
             #pvs = self.server.GetPvByProject(projectlist[0])
             #pmms = self.server.GetPmmByProject(projectlist[0])
+
+            # only need to get the lowest level???  --vwk 8oct2003
+            # need to make sure we get all the referenced objects filled in.  pass in objs
+
+            fieldnames = {"project_id" : projectlist[0]}
+            data = self.server.getObjects("ProductModelVersion", fields = fieldnames, refs = 1, subtypes = 0, objs = [])
+
+            #fieldnames = {"project_id" : projectlist[0]}
+            #pvs = self.server.getObjects("ProductVersion", fields = fieldnames, refs = 1, subtypes = 0, objs = [])
+
+            #fieldnames = {"project_id" : projectlist[0]}
+            #pms = self.server.getObjects("ProductMaster", fields = fieldnames, refs = 1, subtypes = 0, objs = [])
+
+            #fieldnames = {"project_id" : projectlist[0]}
+            #pmms = self.server.getObjects("ProductModelMaster", fields = fieldnames, refs = 1, subtypes = 0, objs = [])
+
             #print 'items for project: %s are: %s' % (projectlist[0], data)
+            
         except Exception, e:
             print "no items in project"
             print e
@@ -472,7 +488,9 @@
                 self.addNauoIDsEntry(nobj, nauo2add, nauo_dict)
 
     def getItem(self, itemid):
-        obj = self.server.GetPMV(itemid)
+        #obj = self.server.GetPMV(itemid)
+        fieldnames = {"pgef_oid" : itemid}
+        obj = self.server.getObject("ProductModelVersion", fields = fieldnames, refs = 1, subtypes = 0, objs = [])
         if obj:
             return obj
         else:
@@ -876,13 +894,29 @@
         objs = []
         if self.user._loggedin:
             #print 'logged in'
-            if root_object.__class__.__name__ == 'ProductMaster':
-                objs = self.server.getPvByPm(root_object)
-            elif root_object.__class__.__name__ == 'ProductVersion':
-                objs = self.server.getPmmByPv(root_object)
-            elif root_object.__class__.__name__ == 'ProductModelMaster':
-                objs = self.server.getPmvByPmm(root_object)
-            elif root_object.__class__.__name__ == 'ProductModelVersion':
+            classname = root_object.__class__.__name
+            if classname == 'ProductMaster':
+                fieldnames = {'of_pm_id'         : root_object.id,
+                              'of_pm_id_context' : root_object.id_context}
+                objs = self.server.getObjects(classname, fields = fieldnames, refs = 1, subtypes = 0, objs = [root_object])
+                #objs = self.server.getPvByPm(root_object)
+
+            elif classname == 'ProductVersion':
+                fieldnames = {'of_pm_id'         : root_object.of_pm_id,
+                              'of_pm_id_context' : root_object.of_pm_id_context,
+                              'of_pv_id'         : root_object.id}
+                objs = self.server.getObjects(classname, fields = fieldnames, refs = 1, subtypes = 0, objs = [root_object])
+                #objs = self.server.getPmmByPv(root_object)
+
+            elif classname == 'ProductModelMaster':
+                fieldnames = {'of_pm_id'         : root_object.of_pm_id,
+                              'of_pm_id_context' : root_object.of_pm_id_context,
+                              'of_pv_id'         : root_object.of_pv_id,
+                              'of_pmm_id'        : root_object.id}
+                objs = self.server.getObjects(classname, fields = fieldnames, refs = 1, subtypes = 0, objs = [root_object])
+                #objs = self.server.getPmvByPmm(root_object)
+
+            elif classname == 'ProductModelVersion':
                 return None
         else:
             #print 'not logged in'

Index: PanGalactic/pangalactic/utils/xmlrpcinterface.py
diff -u PanGalactic/pangalactic/utils/xmlrpcinterface.py:1.14 PanGalactic/pangalactic/utils/xmlrpcinterface.py:1.15
--- PanGalactic/pangalactic/utils/xmlrpcinterface.py:1.14	Wed Oct  8 11:30:47 2003
+++ PanGalactic/pangalactic/utils/xmlrpcinterface.py	Thu Oct  9 13:05:18 2003
@@ -3,10 +3,10 @@
 """
 PanGalactic Client XMLRPC Interfaces
 
-@version: $Revision: 1.14 $
+@version: $Revision: 1.15 $
 """
 
-__version__ = "$Revision: 1.14 $"[11:-2]
+__version__ = "$Revision: 1.15 $"[11:-2]
 
 import xmlrpclib
 import types
@@ -73,88 +73,91 @@
 #                 return 1
 
 
-    def getObjects(self, classname, fields, refs=0, subtypes=0,
-                   objs=[]):
-        # eventually call only this?  --vwk 23may2003
-        data = self._RPC.getObjects(dataname, refs, subtypes, fields)
-        if data:
-            if refs:
-                return [self._factory.rememberAll(data, objs)]
-            else:
-                return [self._factory.rememberAll(data, objs)]
-
-    def getDataByOid(self, dataname, fieldname, oid):
-        # eventually call only this?  --vwk 23may2003
-        # e.g., GetDataByOid("ProjectModelVersion", "pgef_oid", obj.pgef_oid)
-        crit = dict([fieldname, oid])
-        data = self._RPC.getObjects(dataname, 0, 0, crit)
-        if data:
-            return [self._factory.rememberAll(data)]
-
-    def getPvByPm(self, pm):
-        crit = {'of_pm_id' : pm.id,
-                'of_pm_id_context' : pm.id_context}
-        data = self._RPC.getObjects('ProductVersion', 0, 0, crit)
-        if data:
-            return [self._factory.remember(x, [pm])
-                    for x in data]
-
-    def getPmmByPv(self, pv):
-        crit = {'of_pm_id' : pv.of_pm_id,
-                'of_pm_id_context' : pv.of_pm_id_context,
-                'of_pv_id' : pv.id}
-        data = self._RPC.getObjects('ProductModelMaster', 0, 0, crit)
-        if data:
-            return [self._factory.remember(x, [pv, pv._of_master])
-                    for x in data]
+    def getObjects(self, classname, fields, refs=0, subtypes=0, objs=[]):
+        """
+        Retrieve the objects specified by the field-value pairs in fieldvaluedict.
+        
+        @type classname: string
+        @param classname: class name of desired objects
 
-    def getPmvByPmm(self, pmm):
-        crit = {'of_pm_id' : pmm.of_pm_id,
-                'of_pm_id_context' : pmm.of_pm_id_context,
-                'of_pv_id' : pmm.of_pv_id,
-                'of_pmm_id' : pmm.id}
-        data = self._RPC.getObjects('ProductModelVersion', 0, 0, crit)
-        if data:
-            return [self._factory.remember(x, [pmm, pmm._of_version, pmm._of_master])
-                    for x in data]
+        @type fields: dictionary
+        @param fields: search criteria as attribute:value pairs
 
-    def GetPmByProject(self, project, objs=[]):
-        #print "getpmbyproject"
-        #print 'ProductMaster' + ' ' + 'project = %s' % project
-        data = self._RPC.getObjects('ProductMaster', 1, 0,
-                                    {'project_id' : project})
-        if data:
-            return self._factory.rememberAll(data, objs)
+        @type refs: integer (0 or 1)
+        @param refs: flag for whether or not referenced object are also retrieved.
 
-    def GetPmmByProject(self, project, objs=[]):
-        #print "getpmmbyproject"
-        #print 'ProductModelMaster' + ' ' + 'project = %s' % project
-        data = self._RPC.getObjects('ProductModelMaster', 1, 0,
-                                    {'project_id' : project})
-        if data:
-            return self._factory.rememberAll(data, objs)
+        @type subtypes: integer (0 or 1)
+        @param subtypes: flag for whether or not subclasses of classname are also retrieved.
 
-    def GetPvByProject(self, project, objs=[]):
-        #print "getpvbyproject"
-        #print 'ProductVersion' + ' ' + 'project = %s' % project
-        data = self._RPC.getObjects('ProductVersion', 1, 0,
-                                    {'project_id' : project})
+        @type objs: list 
+        @param objs: objects to be hooked up.  Don't worry if you pass an irrelevent object.
+        """
+        # eventually call only this?  --vwk 23may2003
+        data = self._RPC.getObjects(dataname, refs, subtypes, fields)
         if data:
-            return self._factory.rememberAll(data, objs)
+            return [self._factory.rememberAll(data, objs)]
 
-    def GetPmvByProject(self, project, objs=[]):
-        #print "getpmvbyproject"
-        #print 'ProductModelVersion' + ' ' + 'project = %s' % project
-        data = self._RPC.getObjects('ProductModelVersion', 1, 0,
-                                    {'project_id' : project})
-        if data:
-            #print "have data", len(data)
-            return self._factory.rememberAll(data, objs)
 
-    def GetPMV(self, ItemId, objs=[]):
-        data = self._RPC.getObjects('ProductModelVersion', 'pgef_oid=%s' % ItemId)
-        if data:
-            return [self._factory.remember(x) for x in data]
+##    def getPvByPm(self, pm):
+##        crit = {'of_pm_id' : pm.id,
+##                'of_pm_id_context' : pm.id_context}
+##        data = self._RPC.getObjects('ProductVersion', 0, 0, crit)
+##        if data:
+##            return [self._factory.remember(x, [pm])
+##                    for x in data]
+
+##    def getPmmByPv(self, pv):
+##        crit = {'of_pm_id' : pv.of_pm_id,
+##                'of_pm_id_context' : pv.of_pm_id_context,
+##                'of_pv_id' : pv.id}
+##        data = self._RPC.getObjects('ProductModelMaster', 0, 0, crit)
+##        if data:
+##            return [self._factory.remember(x, [pv, pv._of_master])
+##                    for x in data]
+
+##    def getPmvByPmm(self, pmm):
+##        crit = {'of_pm_id' : pmm.of_pm_id,
+##                'of_pm_id_context' : pmm.of_pm_id_context,
+##                'of_pv_id' : pmm.of_pv_id,
+##                'of_pmm_id' : pmm.id}
+##        data = self._RPC.getObjects('ProductModelVersion', 0, 0, crit)
+##        if data:
+##            return [self._factory.remember(x, [pmm, pmm._of_version, pmm._of_master])
+##                    for x in data]
+
+##    def GetPmByProject(self, project, objs=[]):
+##        #print "getpmbyproject"
+##        #print 'ProductMaster' + ' ' + 'project = %s' % project
+##        data = self._RPC.getObjects('ProductMaster', 1, 0, {'project_id' : project})
+##        if data:
+##            return self._factory.rememberAll(data, objs)
+
+##    def GetPmmByProject(self, project, objs=[]):
+##        #print "getpmmbyproject"
+##        #print 'ProductModelMaster' + ' ' + 'project = %s' % project
+##        data = self._RPC.getObjects('ProductModelMaster', 1, 0, {'project_id' : project})
+##        if data:
+##            return self._factory.rememberAll(data, objs)
+
+##    def GetPvByProject(self, project, objs=[]):
+##        #print "getpvbyproject"
+##        #print 'ProductVersion' + ' ' + 'project = %s' % project
+##        data = self._RPC.getObjects('ProductVersion', 1, 0, {'project_id' : project})
+##        if data:
+##            return self._factory.rememberAll(data, objs)
+
+##    def GetPmvByProject(self, project, objs=[]):
+##        #print "getpmvbyproject"
+##        #print 'ProductModelVersion' + ' ' + 'project = %s' % project
+##        data = self._RPC.getObjects('ProductModelVersion', 1, 0, {'project_id' : project})
+##        if data:
+##            #print "have data", len(data)
+##            return self._factory.rememberAll(data, objs)
+
+##    def GetPMV(self, ItemId, objs=[]):
+##        data = self._RPC.getObjects('ProductModelVersion', 'pgef_oid=%s' % ItemId)
+##        if data:
+##            return [self._factory.remember(x) for x in data]
 
     def GetCategories(self, context):
         # Category is a subclass of DataElement.  FSC is a

From pbear at ned.gsfc.nasa.gov  Thu Oct  9 14:33:24 2003
From: pbear at ned.gsfc.nasa.gov (pbear CVS)
Date: Thu Oct  9 13:33:27 2003
Subject: [Pangalactic-commits] call xmlrpcinterface.getObjects instead of
	getxxx; not fully tested.  best of luck.
Message-ID: <200310091733.h99HXO0g005746@ned.gsfc.nasa.gov>

Modified files:
PanGalactic/pangalactic/utils/datamanager.py 1.42 1.43
PanGalactic/pangalactic/utils/xmlrpcinterface.py 1.15 1.16

Log message:
call xmlrpcinterface.getObjects instead of getxxx; not fully tested.  best of luck.


Index: PanGalactic/pangalactic/utils/datamanager.py
diff -u PanGalactic/pangalactic/utils/datamanager.py:1.42 PanGalactic/pangalactic/utils/datamanager.py:1.43
--- PanGalactic/pangalactic/utils/datamanager.py:1.42	Thu Oct  9 13:05:18 2003
+++ PanGalactic/pangalactic/utils/datamanager.py	Thu Oct  9 13:33:23 2003
@@ -1,6 +1,6 @@
 # $Source: /repo/step_testbed/PanGalactic/pangalactic/utils/datamanager.py,v $
 
-__version__ = "$Revision: 1.42 $"[11:-2]
+__version__ = "$Revision: 1.43 $"[11:-2]
 
 import time
 import mx.DateTime
@@ -490,7 +490,7 @@
     def getItem(self, itemid):
         #obj = self.server.GetPMV(itemid)
         fieldnames = {"pgef_oid" : itemid}
-        obj = self.server.getObject("ProductModelVersion", fields = fieldnames, refs = 1, subtypes = 0, objs = [])
+        obj = self.server.getObjects("ProductModelVersion", fields = fieldnames, refs = 1, subtypes = 0, objs = [])
         if obj:
             return obj
         else:
@@ -501,7 +501,9 @@
 
     
     def getDocument(self, docid):
-        obj = self.server.GetDocument(docid)
+        #obj = self.server.GetDocument(docid)
+        fieldnames = {"pgef_oid" : docid}
+        obj = self.server.getObjects("Document", fields = fieldnames, refs = 0, subtypes = 1, objs = [])
         if obj:
             return obj
         else:
@@ -523,8 +525,10 @@
         print "Document retrieval is not yet implemented"
         return
 
-        for id in ItemIdList:
-            objlist = self.server.GetPDRByItemID(id)
+        for objid in ItemIdList:
+            #objlist = self.server.GetPDRByItemID(objid)
+            fieldnames = {"document" : objid}
+            objlist = self.server.getObjects("ProductDocumentRelationship", fields = fieldnames, refs = 1, subtypes = 0, objs = [])
             pdrids = []
             pdrobjs = []
             itemobjs = []
@@ -535,18 +539,16 @@
                 if obj.IsEmpty():
                     continue
 
-                if obj.__class__.__name__ == "ProductDocumentRelationship":
-#                if isinstance(obj, ProductDocumentRelationship):
+                classname = obj.__class__.__name__
+                if classname == "ProductDocumentRelationship":
                     pdrids.append(obj.pgef_oid)
                     pdrobjs.append(obj)
 
-                elif obj.__class__.__name__ == "PartsList":
-#                elif isinstance(obj, PartsList):
+                elif classname == "PartsList":
                     self.partsListIDs[obj.pgef_oid] = obj.id
                     partslistobjs.append(obj)
 
-                elif obj.__class__.__name__ == "Document":
-#                elif isinstance(obj, Document):
+                elif classname == "Document":
                     self.documentIDs[obj.pgef_oid] = obj.id
                     documentobjs.append(obj)
 

Index: PanGalactic/pangalactic/utils/xmlrpcinterface.py
diff -u PanGalactic/pangalactic/utils/xmlrpcinterface.py:1.15 PanGalactic/pangalactic/utils/xmlrpcinterface.py:1.16
--- PanGalactic/pangalactic/utils/xmlrpcinterface.py:1.15	Thu Oct  9 13:05:18 2003
+++ PanGalactic/pangalactic/utils/xmlrpcinterface.py	Thu Oct  9 13:33:23 2003
@@ -3,10 +3,10 @@
 """
 PanGalactic Client XMLRPC Interfaces
 
-@version: $Revision: 1.15 $
+@version: $Revision: 1.16 $
 """
 
-__version__ = "$Revision: 1.15 $"[11:-2]
+__version__ = "$Revision: 1.16 $"[11:-2]
 
 import xmlrpclib
 import types
@@ -14,8 +14,6 @@
 from pangalactic.enterprise.assemblycomponentusage import AssemblyComponentUsage as ACU
 
 
-#getObjects('Product', 'name=Mr. Fusion')
-
 class XmlrpcInterface:
     def __init__(self, server, port, proxy = None, proxyport = None):
         if proxy and proxyport:
@@ -59,7 +57,7 @@
             return newobjects
                 
         
-    # TODO: implement this ...
+    # TODO: implement this ... 
 #     def addAlerts(self, object_list):
 #         if object_list:
 #             try:
@@ -75,7 +73,7 @@
 
     def getObjects(self, classname, fields, refs=0, subtypes=0, objs=[]):
         """
-        Retrieve the objects specified by the field-value pairs in fieldvaluedict.
+        Retrieve the objects that have the field-value pairs in fieldvaluedict.
         
         @type classname: string
         @param classname: class name of desired objects
@@ -93,72 +91,11 @@
         @param objs: objects to be hooked up.  Don't worry if you pass an irrelevent object.
         """
         # eventually call only this?  --vwk 23may2003
-        data = self._RPC.getObjects(dataname, refs, subtypes, fields)
+        data = self._RPC.getObjects(classname, refs, subtypes, fields)
         if data:
             return [self._factory.rememberAll(data, objs)]
 
 
-##    def getPvByPm(self, pm):
-##        crit = {'of_pm_id' : pm.id,
-##                'of_pm_id_context' : pm.id_context}
-##        data = self._RPC.getObjects('ProductVersion', 0, 0, crit)
-##        if data:
-##            return [self._factory.remember(x, [pm])
-##                    for x in data]
-
-##    def getPmmByPv(self, pv):
-##        crit = {'of_pm_id' : pv.of_pm_id,
-##                'of_pm_id_context' : pv.of_pm_id_context,
-##                'of_pv_id' : pv.id}
-##        data = self._RPC.getObjects('ProductModelMaster', 0, 0, crit)
-##        if data:
-##            return [self._factory.remember(x, [pv, pv._of_master])
-##                    for x in data]
-
-##    def getPmvByPmm(self, pmm):
-##        crit = {'of_pm_id' : pmm.of_pm_id,
-##                'of_pm_id_context' : pmm.of_pm_id_context,
-##                'of_pv_id' : pmm.of_pv_id,
-##                'of_pmm_id' : pmm.id}
-##        data = self._RPC.getObjects('ProductModelVersion', 0, 0, crit)
-##        if data:
-##            return [self._factory.remember(x, [pmm, pmm._of_version, pmm._of_master])
-##                    for x in data]
-
-##    def GetPmByProject(self, project, objs=[]):
-##        #print "getpmbyproject"
-##        #print 'ProductMaster' + ' ' + 'project = %s' % project
-##        data = self._RPC.getObjects('ProductMaster', 1, 0, {'project_id' : project})
-##        if data:
-##            return self._factory.rememberAll(data, objs)
-
-##    def GetPmmByProject(self, project, objs=[]):
-##        #print "getpmmbyproject"
-##        #print 'ProductModelMaster' + ' ' + 'project = %s' % project
-##        data = self._RPC.getObjects('ProductModelMaster', 1, 0, {'project_id' : project})
-##        if data:
-##            return self._factory.rememberAll(data, objs)
-
-##    def GetPvByProject(self, project, objs=[]):
-##        #print "getpvbyproject"
-##        #print 'ProductVersion' + ' ' + 'project = %s' % project
-##        data = self._RPC.getObjects('ProductVersion', 1, 0, {'project_id' : project})
-##        if data:
-##            return self._factory.rememberAll(data, objs)
-
-##    def GetPmvByProject(self, project, objs=[]):
-##        #print "getpmvbyproject"
-##        #print 'ProductModelVersion' + ' ' + 'project = %s' % project
-##        data = self._RPC.getObjects('ProductModelVersion', 1, 0, {'project_id' : project})
-##        if data:
-##            #print "have data", len(data)
-##            return self._factory.rememberAll(data, objs)
-
-##    def GetPMV(self, ItemId, objs=[]):
-##        data = self._RPC.getObjects('ProductModelVersion', 'pgef_oid=%s' % ItemId)
-##        if data:
-##            return [self._factory.remember(x) for x in data]
-
     def GetCategories(self, context):
         # Category is a subclass of DataElement.  FSC is a
         # Category; it's passed in as the context
@@ -205,63 +142,34 @@
         if data:
             return [self._factory.remember(x) for x in data]
 
-    #def GetProject(self, project):
-
     def SearchPMV(self, search_tuple):
         data = self._RPC.getObjects('ProductModelVersion', *search_tuple)
         if data:
             return [self._factory.remember(x) for x in data]
 
-    #def AddItem(self, itemobj):
-
-    #def AddNauo(self, nauoobj):
-
-    #def DelObjects(self, objlist):
-
-    #def AddObjects(self, objlist):
-
-    #def DelNauo(self, nauo):
-
-    #def AddPartsList(self, partslist):
-
-    def GetPartsList(self, partslistid):
-        data = self._RPC.getObjects('PartsList', 'pgef_oid=%s' % partslistid)
-        if data:
-            return [self._factory.remember(x) for x in data]
-
-    #def AddDocument(self, doc):
-
-    def GetDocument(self, docid):
-        data = self._RPC.getObjects('Document' , 'pgef_oid=%s' % docid)
-        if data:
-            return [self._factory.remember(x) for x in data]
+##    def GetPartsList(self, partslistid):
+##        data = self._RPC.getObjects('PartsList', 'pgef_oid=%s' % partslistid)
+##        if data:
+##            return [self._factory.remember(x) for x in data]
 
-    #def DelPdr(self, pdr):
+##    def GetDocument(self, docid):
+##        data = self._RPC.getObjects('Document' , 'pgef_oid=%s' % docid)
+##        if data:
+##            return [self._factory.remember(x) for x in data]
 
-    #def AddPdr(self, pdr):
 
-    def GetPdr(self, pdrid):
-        data = self._RPC.getObjects('ProductDocumentRelationship', 'pgef_oid=%s' % pdrid)
-        if data:
-            return [self._factory.remember(x) for x in data]
+##    def GetPdr(self, pdrid):
+##        data = self._RPC.getObjects('ProductDocumentRelationship', 'pgef_oid=%s' % pdrid)
+##        if data:
+##            return [self._factory.remember(x) for x in data]
 
-    def GetPDRByDocumentID(self, docid):
-        data = self._RPC.getObjects('ProductDocumentRelationship', 'document=%s' % docid)
-        if data:
-            return [self._factory.remember(x) for x in data]
+##    def GetPDRByDocumentID(self, docid):
+##        data = self._RPC.getObjects('ProductDocumentRelationship', 'document=%s' % docid)
+##        if data:
+##            return [self._factory.remember(x) for x in data]
 
-    def GetPDRByItemID(self, itemid):
-        data = self._RPC.getObjects('ProductDocumentRelationship', 'document=%s' % itemid)
-        if data:
-            return [self._factory.remember(x) for x in data]
+##    def GetPDRByItemID(self, itemid):
+##        data = self._RPC.getObjects('ProductDocumentRelationship', 'document=%s' % itemid)
+##        if data:
+##            return [self._factory.remember(x) for x in data]
 
-# OBE vwk 28oct02
-#    def DelIdr(self, idr):
-#
-#    def AddIDR(self, idr):
-#
-#    def GetIDR(self, idrid):
-#
-#    def GetIDRByDocumentID(self, docid):
-#
-#    def GetIDRByItemID(self, itemid):

From waterbug at ned.gsfc.nasa.gov  Fri Oct 10 12:36:50 2003
From: waterbug at ned.gsfc.nasa.gov (waterbug CVS)
Date: Fri Oct 10 11:36:55 2003
Subject: [Pangalactic-commits] Tweak (mainly to test cvstoys ;^).
Message-ID: <200310101536.h9AFao46019442@ned.gsfc.nasa.gov>

Modified files:
PanGalactic/INSTALL 1.9 1.10

Log message:
Tweak (mainly to test cvstoys ;^).


Index: PanGalactic/INSTALL
diff -u PanGalactic/INSTALL:1.9 PanGalactic/INSTALL:1.10
--- PanGalactic/INSTALL:1.9	Thu Aug 21 14:00:26 2003
+++ PanGalactic/INSTALL	Fri Oct 10 11:36:49 2003
@@ -34,7 +34,7 @@
 
 (1) Required for All PGEF Configurations:
 
-    - Python (version 2.3 is recommended; 2.2.3 at minimum)
+    - Python (version 2.3.2 or greater is recommended; 2.2.3 at minimum)
       http://python.org
       Configuration:  Python has several binary installers for
       various platforms and can also be compiled and installed from
@@ -217,4 +217,4 @@
      twistd -f pger.tap
 
 -----------------------------------------------------------------
-$Id: INSTALL,v 1.9 2003/08/21 18:00:26 waterbug Exp $
+$Id: INSTALL,v 1.10 2003/10/10 15:36:49 waterbug Exp $

From pbear at ned.gsfc.nasa.gov  Tue Oct 14 12:51:38 2003
From: pbear at ned.gsfc.nasa.gov (pbear CVS)
Date: Tue Oct 14 11:51:41 2003
Subject: [Pangalactic-commits] fixed typo in getVersionTreeObjects
Message-ID: <200310141551.h9EFpcfr001596@ned.gsfc.nasa.gov>

Modified files:
PanGalactic/pangalactic/utils/datamanager.py 1.43 1.44
PanGalactic/pangalactic/utils/xmlrpcinterface.py 1.17 1.18

Log message:
fixed typo in getVersionTreeObjects


Index: PanGalactic/pangalactic/utils/datamanager.py
diff -u PanGalactic/pangalactic/utils/datamanager.py:1.43 PanGalactic/pangalactic/utils/datamanager.py:1.44
--- PanGalactic/pangalactic/utils/datamanager.py:1.43	Thu Oct  9 13:33:23 2003
+++ PanGalactic/pangalactic/utils/datamanager.py	Tue Oct 14 11:51:37 2003
@@ -1,6 +1,6 @@
 # $Source: /repo/step_testbed/PanGalactic/pangalactic/utils/datamanager.py,v $
 
-__version__ = "$Revision: 1.43 $"[11:-2]
+__version__ = "$Revision: 1.44 $"[11:-2]
 
 import time
 import mx.DateTime
@@ -896,7 +896,7 @@
         objs = []
         if self.user._loggedin:
             #print 'logged in'
-            classname = root_object.__class__.__name
+            classname = root_object.__class__.__name__
             if classname == 'ProductMaster':
                 fieldnames = {'of_pm_id'         : root_object.id,
                               'of_pm_id_context' : root_object.id_context}

Index: PanGalactic/pangalactic/utils/xmlrpcinterface.py
diff -u PanGalactic/pangalactic/utils/xmlrpcinterface.py:1.17 PanGalactic/pangalactic/utils/xmlrpcinterface.py:1.18
--- PanGalactic/pangalactic/utils/xmlrpcinterface.py:1.17	Fri Oct 10 11:02:49 2003
+++ PanGalactic/pangalactic/utils/xmlrpcinterface.py	Tue Oct 14 11:51:37 2003
@@ -3,10 +3,10 @@
 """
 PanGalactic Client XMLRPC Interfaces
 
-@version: $Revision: 1.17 $
+@version: $Revision: 1.18 $
 """
 
-__version__ = "$Revision: 1.17 $"[11:-2]
+__version__ = "$Revision: 1.18 $"[11:-2]
 
 import xmlrpclib
 import types
@@ -91,7 +91,7 @@
         @param objs: objects to be hooked up.  Don't worry if you pass an irrelevent object.
         """
         # eventually call only this?  --vwk 23may2003
-        print "xmlrpc.getObjects", classname
+        print "xmlrpc.getObjects", classname, fields, refs, subtypes
         data = self._RPC.getObjects(classname, refs, subtypes, fields)
         if data:
             return self._factory.rememberAll(data, objs)

From pbear at ned.gsfc.nasa.gov  Tue Oct 14 14:02:30 2003
From: pbear at ned.gsfc.nasa.gov (pbear CVS)
Date: Tue Oct 14 13:02:32 2003
Subject: [Pangalactic-commits] fixed more typos in getversiontreeobjects
Message-ID: <200310141702.h9EH2UIu002579@ned.gsfc.nasa.gov>

Modified files:
PanGalactic/pangalactic/utils/datamanager.py 1.44 1.45
PanGalactic/pangalactic/utils/xmlrpcinterface.py 1.18 1.19

Log message:
fixed more typos in getversiontreeobjects


Index: PanGalactic/pangalactic/utils/datamanager.py
diff -u PanGalactic/pangalactic/utils/datamanager.py:1.44 PanGalactic/pangalactic/utils/datamanager.py:1.45
--- PanGalactic/pangalactic/utils/datamanager.py:1.44	Tue Oct 14 11:51:37 2003
+++ PanGalactic/pangalactic/utils/datamanager.py	Tue Oct 14 13:02:29 2003
@@ -1,6 +1,6 @@
 # $Source: /repo/step_testbed/PanGalactic/pangalactic/utils/datamanager.py,v $
 
-__version__ = "$Revision: 1.44 $"[11:-2]
+__version__ = "$Revision: 1.45 $"[11:-2]
 
 import time
 import mx.DateTime
@@ -893,37 +893,38 @@
         self.refresh = False
         
     def getVersionTreeObjects(self, root_object):
-        objs = []
+        #print "datamanager.getversiontreeobjects", root_object
+        objlist = []
         if self.user._loggedin:
             #print 'logged in'
             classname = root_object.__class__.__name__
             if classname == 'ProductMaster':
-                fieldnames = {'of_pm_id'         : root_object.id,
-                              'of_pm_id_context' : root_object.id_context}
-                objs = self.server.getObjects(classname, fields = fieldnames, refs = 1, subtypes = 0, objs = [root_object])
-                #objs = self.server.getPvByPm(root_object)
+                fieldnames = {'id'         : root_object.id,
+                              'id_context' : root_object.id_context}
+                objlist = self.server.getObjects(classname, fields = fieldnames, refs = 1, subtypes = 0, objs = [root_object])
+                #objlist = self.server.getPvByPm(root_object)
 
             elif classname == 'ProductVersion':
                 fieldnames = {'of_pm_id'         : root_object.of_pm_id,
                               'of_pm_id_context' : root_object.of_pm_id_context,
-                              'of_pv_id'         : root_object.id}
-                objs = self.server.getObjects(classname, fields = fieldnames, refs = 1, subtypes = 0, objs = [root_object])
-                #objs = self.server.getPmmByPv(root_object)
+                              'id'               : root_object.id}
+                objlist = self.server.getObjects(classname, fields = fieldnames, refs = 1, subtypes = 0, objs = [root_object])
+                #objlist = self.server.getPmmByPv(root_object)
 
             elif classname == 'ProductModelMaster':
                 fieldnames = {'of_pm_id'         : root_object.of_pm_id,
                               'of_pm_id_context' : root_object.of_pm_id_context,
                               'of_pv_id'         : root_object.of_pv_id,
-                              'of_pmm_id'        : root_object.id}
-                objs = self.server.getObjects(classname, fields = fieldnames, refs = 1, subtypes = 0, objs = [root_object])
-                #objs = self.server.getPmvByPmm(root_object)
+                              'id'               : root_object.id}
+                objlist = self.server.getObjects(classname, fields = fieldnames, refs = 1, subtypes = 0, objs = [root_object])
+                #objlist = self.server.getPmvByPmm(root_object)
 
             elif classname == 'ProductModelVersion':
                 return None
         else:
             #print 'not logged in'
-            objs = self.localDB.getVersionTreeObjects(root_object)
-            return objs
+            objlist = self.localDB.getVersionTreeObjects(root_object)
+            return objlist
             
 
 

Index: PanGalactic/pangalactic/utils/xmlrpcinterface.py
diff -u PanGalactic/pangalactic/utils/xmlrpcinterface.py:1.18 PanGalactic/pangalactic/utils/xmlrpcinterface.py:1.19
--- PanGalactic/pangalactic/utils/xmlrpcinterface.py:1.18	Tue Oct 14 11:51:37 2003
+++ PanGalactic/pangalactic/utils/xmlrpcinterface.py	Tue Oct 14 13:02:29 2003
@@ -3,10 +3,10 @@
 """
 PanGalactic Client XMLRPC Interfaces
 
-@version: $Revision: 1.18 $
+@version: $Revision: 1.19 $
 """
 
-__version__ = "$Revision: 1.18 $"[11:-2]
+__version__ = "$Revision: 1.19 $"[11:-2]
 
 import xmlrpclib
 import types
@@ -91,7 +91,7 @@
         @param objs: objects to be hooked up.  Don't worry if you pass an irrelevent object.
         """
         # eventually call only this?  --vwk 23may2003
-        print "xmlrpc.getObjects", classname, fields, refs, subtypes
+        print "xmlrpc.getObjects", classname #, fields, refs, subtypes
         data = self._RPC.getObjects(classname, refs, subtypes, fields)
         if data:
             return self._factory.rememberAll(data, objs)

From pbear at ned.gsfc.nasa.gov  Tue Oct 14 17:20:39 2003
From: pbear at ned.gsfc.nasa.gov (pbear CVS)
Date: Tue Oct 14 16:20:42 2003
Subject: [Pangalactic-commits] moved alert tests to nars
Message-ID: <200310142020.h9EKKdUR007540@ned.gsfc.nasa.gov>

Modified files:
PanGalactic/pangalactic/client/tests/runall.py 1.3 1.4
PanGalactic/pangalactic/client/tests/test_gidep_alert.py 1.4 None
PanGalactic/pangalactic/client/tests/test_gidep_problem_advisory.py 1.4 None
PanGalactic/pangalactic/client/tests/test_nasa_advisory.py 1.4 None

Log message:
moved alert tests to nars


Index: PanGalactic/pangalactic/client/tests/runall.py
diff -u PanGalactic/pangalactic/client/tests/runall.py:1.3 PanGalactic/pangalactic/client/tests/runall.py:1.4
--- PanGalactic/pangalactic/client/tests/runall.py:1.3	Sat Sep 20 18:15:19 2003
+++ PanGalactic/pangalactic/client/tests/runall.py	Tue Oct 14 16:20:38 2003
@@ -9,9 +9,6 @@
 import test_localdb
 import test_aboutbox
 import test_itemeditframe
-import test_gidep_problem_advisory
-import test_gidep_alert
-import test_nasa_advisory
 import test_psmtool
 import test_itemdataform
 import test_itemsearchform
@@ -35,9 +32,6 @@
     all_tests.addTest(test_datamanager.suite())
 #core    all_tests.addTest(test_aboutbox.suite())
     all_tests.addTest(test_itemeditframe.suite())
-    all_tests.addTest(test_gidep_problem_advisory.suite())
-    all_tests.addTest(test_gidep_alert.suite())
-    all_tests.addTest(test_nasa_advisory.suite())
 #core    all_tests.addTest(test_psmtool.suite())
     all_tests.addTest(test_itemdataform.suite())
     all_tests.addTest(test_itemsearchform.suite())
@@ -48,8 +42,6 @@
     all_tests.addTest(test_partslistview.suite())
     all_tests.addTest(test_propertiesform.suite())
     all_tests.addTest(test_searchframe.suite())
-    
-    
     
     return all_tests
 

From bmuir at ned.gsfc.nasa.gov  Wed Oct 15 12:03:21 2003
From: bmuir at ned.gsfc.nasa.gov (bmuir CVS)
Date: Wed Oct 15 11:03:23 2003
Subject: [Pangalactic-commits] updated aboutbox tests,
	and half of datamanager tests
Message-ID: <200310151503.h9FF3Lk3017652@ned.gsfc.nasa.gov>

Modified files:
PanGalactic/pangalactic/client/modules/psm/aboutbox.py 1.2 1.3
PanGalactic/pangalactic/client/modules/psm/aboutbox.wdr 1.2 1.3
PanGalactic/pangalactic/client/modules/psm/aboutbox_wdr.py 1.2 1.3
PanGalactic/pangalactic/client/tests/test_aboutbox.py 1.1.1.1 1.2
PanGalactic/pangalactic/client/tests/test_datamanager.py 1.7 1.8
PanGalactic/pangalactic/client/tests/unittest.py 1.1.1.1 None
PanGalactic/pangalactic/client/tests/unittestgui.py 1.1.1.1 None

Log message:
updated aboutbox tests, and half of datamanager tests


Index: PanGalactic/pangalactic/client/modules/psm/aboutbox_wdr.py
diff -u PanGalactic/pangalactic/client/modules/psm/aboutbox_wdr.py:1.2 PanGalactic/pangalactic/client/modules/psm/aboutbox_wdr.py:1.3
--- PanGalactic/pangalactic/client/modules/psm/aboutbox_wdr.py:1.2	Wed Mar 12 17:07:20 2003
+++ PanGalactic/pangalactic/client/modules/psm/aboutbox_wdr.py	Wed Oct 15 11:03:19 2003
@@ -3,20 +3,23 @@
 # Do not modify this file, all changes will be lost!
 #-----------------------------------------------------------------------------
 
+# -*- coding: iso-8859-1 -*-
+
 # Include wxWindows' modules
 from wxPython.wx import *
+from wxPython.grid import *
 
 # Window functions
 
-ID_TEXT = wxNewId()
-ID_VERSION = wxNewId()
-ID_BUILD_DATE = wxNewId()
-ID_BUTTON_ABOUTOK = wxNewId()
-ID_LINE = wxNewId()
-ID_STATICBITMAP_PYTHON = wxNewId()
-ID_STATICBITMAP_WXPYTHON = wxNewId()
+ID_TEXT = 10000
+ID_VERSION = 10001
+ID_BUILD_DATE = 10002
+ID_BUTTON_ABOUTOK = 10003
+ID_LINE = 10004
+ID_STATICBITMAP_PYTHON = 10005
+ID_STATICBITMAP_WXPYTHON = 10006
 
-def AboutFunc( parent, call_fit = true, set_sizer = true ):
+def AboutFunc( parent, call_fit = True, set_sizer = True ):
     item0 = wxBoxSizer( wxVERTICAL )
     
     item1 = wxFlexGridSizer( 0, 2, 0, 0 )
@@ -39,10 +42,10 @@
 
     item0.AddSizer( item1, 1, wxGROW|wxALIGN_CENTER_VERTICAL|wxALL, 5 )
 
-    item0.AddSpacer( 20, 20, 0, wxALIGN_CENTRE|wxALL, 5 )
+    item0.AddSpacer( 20, 20, 0, wxALIGN_CENTER|wxALL, 5 )
 
     item6 = wxButton( parent, ID_BUTTON_ABOUTOK, "OK", wxDefaultPosition, wxDefaultSize, 0 )
-    item0.AddWindow( item6, 0, wxALIGN_CENTRE|wxALL, 5 )
+    item0.AddWindow( item6, 0, wxALIGN_CENTER|wxALL, 5 )
 
     item7 = wxStaticLine( parent, ID_LINE, wxDefaultPosition, wxSize(20,-1), wxLI_HORIZONTAL )
     item0.AddWindow( item7, 0, wxGROW|wxALIGN_CENTER_VERTICAL|wxALL, 5 )
@@ -50,17 +53,17 @@
     item8 = wxBoxSizer( wxHORIZONTAL )
     
     item9 = wxStaticBitmap( parent, ID_STATICBITMAP_PYTHON, About( 0 ), wxDefaultPosition, wxDefaultSize )
-    item8.AddWindow( item9, 0, wxALIGN_CENTRE|wxALL, 5 )
+    item8.AddWindow( item9, 0, wxALIGN_CENTER|wxALL, 5 )
 
     item10 = wxStaticBitmap( parent, ID_STATICBITMAP_WXPYTHON, About( 1 ), wxDefaultPosition, wxDefaultSize )
-    item8.AddWindow( item10, 0, wxALIGN_CENTRE|wxALL, 5 )
+    item8.AddWindow( item10, 0, wxALIGN_CENTER|wxALL, 5 )
 
-    item0.AddSizer( item8, 0, wxALIGN_CENTRE|wxALL, 5 )
+    item0.AddSizer( item8, 0, wxALIGN_CENTER|wxALL, 5 )
 
-    if set_sizer == true:
-        parent.SetAutoLayout( true )
+    if set_sizer == True:
+        parent.SetAutoLayout( True )
         parent.SetSizer( item0 )
-        if call_fit == true:
+        if call_fit == True:
             item0.Fit( parent )
             item0.SetSizeHints( parent )
     

Index: PanGalactic/pangalactic/client/tests/test_aboutbox.py
diff -u PanGalactic/pangalactic/client/tests/test_aboutbox.py:1.1.1.1 PanGalactic/pangalactic/client/tests/test_aboutbox.py:1.2
--- PanGalactic/pangalactic/client/tests/test_aboutbox.py:1.1.1.1	Mon Nov  4 14:47:26 2002
+++ PanGalactic/pangalactic/client/tests/test_aboutbox.py	Wed Oct 15 11:03:20 2003
@@ -1,20 +1,20 @@
 import unittest
 import modules.psm.aboutbox
 from wxPython.wx import *
-wxInitAllImageHandlers()
+
 
 class AboutBox(unittest.TestCase):
     def Title(self):
         print '\nAboutbox tests'
         
     def testCreateAboutbox(self):
-
+        app = wxPySimpleApp()
         self.VERSION = 'TEST'
         self.BUILD_DATE = '111111'
         dlg = None
-        dlg = modules.psm.aboutbox.AboutBox(NULL, -1, "About PGEF", wxPoint(20,20), wxSize(500,340))
-        dlg.GetVersion().SetLabel(str(VERSION))
-        dlg.GetBuildDate().SetLabel(str(BUILD_DATE))
+        dlg = modules.psm.aboutbox.AboutBox(None, -1, "About PGEF", wxPoint(20,20), wxSize(500,340))
+        dlg.GetVersion().SetLabel(str(self.VERSION))
+        dlg.GetBuildDate().SetLabel(str(self.BUILD_DATE))
         dlg.CentreOnParent()
         assert dlg != None, 'Couldnt create AboutBox'
 
@@ -31,4 +31,5 @@
 
 
 if __name__ == '__main__':
-    main()        
\ No newline at end of file
+    main()  
+

Index: PanGalactic/pangalactic/client/modules/psm/aboutbox.py
diff -u PanGalactic/pangalactic/client/modules/psm/aboutbox.py:1.2 PanGalactic/pangalactic/client/modules/psm/aboutbox.py:1.3
--- PanGalactic/pangalactic/client/modules/psm/aboutbox.py:1.2	Wed Jan  8 12:56:56 2003
+++ PanGalactic/pangalactic/client/modules/psm/aboutbox.py	Wed Oct 15 11:03:19 2003
@@ -9,7 +9,6 @@
         style = wxDEFAULT_DIALOG_STYLE ):
         wxFrame.__init__(self, parent, id, title, pos, size, style)
         AboutFunc( self, true )
-        
         # WDR: handler declarations for AboutBox
         EVT_BUTTON(self, ID_BUTTON_ABOUTOK, self.onOK)
 

Index: PanGalactic/pangalactic/client/tests/test_datamanager.py
diff -u PanGalactic/pangalactic/client/tests/test_datamanager.py:1.7 PanGalactic/pangalactic/client/tests/test_datamanager.py:1.8
--- PanGalactic/pangalactic/client/tests/test_datamanager.py:1.7	Fri Jun 27 03:24:49 2003
+++ PanGalactic/pangalactic/client/tests/test_datamanager.py	Wed Oct 15 11:03:20 2003
@@ -1,6 +1,6 @@
 import unittest
 import types, os
-import pangalactic.enterprise.product
+#import pangalactic.enterprise.product
 from pangalactic.utils import datamanager
 from pangalactic.utils import securitymanager
 import pangalactic.utils.pgefexceptions
@@ -52,6 +52,9 @@
         
     def testValidLogin(self):
         self.dm = datamanager.DataManager(self, true)
+        self.dm.serverName = 'ned.gsfc.nasa.gov'
+        self.dm.serverPort = '8080'
+        self.dm.createServer()
         self.WatchDog = securitymanager.SecurityManager(self.dm)
         result = self.dm.login('tstuser','test')
         self.dm.localDB.Commit()
@@ -70,20 +73,11 @@
         del self.dm
         del self.WatchDog
         
-    def testGetItemsByProject(self):
-        self.dm = datamanager.DataManager(self, true)
-        self.WatchDog = securitymanager.SecurityManager(self.dm)
-        self.dm.login('tstuser','test')
-        self.dm.localDB.Commit()
-        self.dm.getItemsByProject(['TEST'])
-        #self.dm.localDB.Commit()
-        assert len(self.dm.topLevelItemIDs) > 0, 'Error retrieving items for the test project'
-        self.dm.localDB.db.close()
-        del self.dm
-        del self.WatchDog
-        
     def testFillProjectList(self):
         self.dm = datamanager.DataManager(self, true)
+        self.dm.serverName = 'ned.gsfc.nasa.gov'
+        self.dm.serverPort = '8080'
+        self.dm.createServer()
         self.WatchDog = securitymanager.SecurityManager(self.dm)
         
         self.dm.login('tstuser','test')
@@ -93,155 +87,70 @@
         assert len(self.dm.projects) > 0, 'Error retrieving items for the test project'
         self.dm.localDB.db.close()
         del self.dm
-        del self.WatchDog
-        
-    def testGetNAUOByAssemblyID(self):
-        self.dm = datamanager.DataManager(self, true)
-        self.WatchDog = securitymanager.SecurityManager(self.dm)
-        self.dm.login('tstuser','test')
-        result = self.dm.getNAUOByAssemblyID(['ned.gsfc.nasa.gov__tstuser__1'])
-        #self.dm.localDB.Commit()
-        assert len(result) > 0, 'Error retrieving items by AssemblyID'
-        self.dm.localDB.db.close()
-        del self.dm
-        del self.WatchDog
-        
-    def testGetItem(self):
-        self.dm = datamanager.DataManager(self, true)
-        self.WatchDog = securitymanager.SecurityManager(self.dm)
-        self.dm.login('tstuser','test')
-        result = self.dm.getItem('ned.gsfc.nasa.gov__tstuser__1')
-        self.dm.localDB.Commit()
-        assert len(result) > 0, 'Error retrieving item by ID'
-        self.dm.localDB.db.close()
-        del self.dm
-        del self.WatchDog
+        del self.WatchDog    
         
-    
-    def testGetParentNauosForItemID_None(self):
+    def testQuickCreate(self):
         self.dm = datamanager.DataManager(self, true)
+        self.dm.serverName = 'ned.gsfc.nasa.gov'
+        self.dm.serverPort = '8080'
+        self.dm.createServer()
         self.WatchDog = securitymanager.SecurityManager(self.dm)
         
         self.dm.login('tstuser','test')
-        childitem = pangalactic.enterprise.product.Product()
-        dataobjects.item.FillSampleItem(childitem)
-        childitem.pgef_oid = 'xxxx'
-        result = self.dm.getParentNauosForItemID(childitem)
-        self.dm.localDB.Commit()
-        assert len(result) == 0, 'Error should not have found NAUOs'
-        self.dm.localDB.db.close()
-        del self.dm
-        del self.WatchDog
-        
-    def testAddNauo(self):
-        self.dm = datamanager.DataManager(self, true)
-        self.WatchDog = securitymanager.SecurityManager(self.dm)
-        self.dm.localDB.Clear()
-        self.dm.login('tstuser','test')
-        oldlength = len(self.dm.localDB.dbroot['UncommittedObjects'].keys())
-        #parentnauo = nauo.NAUO()
-        parentnauo = acu.AssemblyComponentUsage(subtype = 'nauo')
-        parentnauo.assembly = '-1'
-        parentnauo.component = '1'
-        self.dm.addNAUO(parentnauo, 'TOPLEVEL')
-        self.dm.localDB.Commit()
-        
-        #childnauo = nauo.NAUO()
-        childnauo = acu.AssemblyComponentUsage(subtype = 'nauo')
-        childnauo.assembly = '1'
-        childnauo.component = '2'
-        self.dm.addNAUO(childnauo, parentnauo)
+        results = self.dm.quickCreate(['1', '2', '3', '4'])
+
         self.dm.localDB.Commit()
         
-        newlength = len(self.dm.localDB.dbroot['UncommittedObjects'].keys())
-        assert (newlength - oldlength) == 2, 'No NAUOs found'
+        assert len(results) == 4, 'Error performing quickCreate'
         self.dm.localDB.db.close()
         del self.dm
         del self.WatchDog
         
-    def testGetParentNauosForItemID_Some(self):
+
+    def testsetCurrentProject(self):
         self.dm = datamanager.DataManager(self, true)
+        self.dm.serverName = 'ned.gsfc.nasa.gov'
+        self.dm.serverPort = '8080'
+        self.dm.createServer()
         self.WatchDog = securitymanager.SecurityManager(self.dm)
         
         self.dm.login('tstuser','test')
-        self.dm.setCurrentProject('TEST')
-        parentitem = dataobjects.item.Item()
-        dataobjects.item.FillSampleItem(parentitem)
-        #parentnauo = nauo.NAUO()
-        parentnauo = acu.AssemblyComponentUsage(subtype = 'nauo')
-        parentnauo.assembly = '-1'
-        parentnauo.component = parentitem.pgef_oid
-        childitem = dataobjects.item.Item()
-        dataobjects.item.FillSampleItem(childitem)
-        #childnauo = nauo.NAUO()
-        childnauo = acu.AssemblyComponentUsage(subtype = 'nauo')
-        childnauo.assembly = parentitem.pgef_oid
-        childnauo.component = childitem.pgef_oid
-        self.dm.localDB.Save([childnauo, parentnauo, parentitem, childitem])
-        result = self.dm.getParentNauosForItemID(childitem)
+        self.dm.setCurrentProject('testing')
+
         self.dm.localDB.Commit()
-        assert len(result) > 0, 'Error could not retrieve NAUOs'
+        assert self.dm.currentProject == 'testing', 'Error performing setCurrentProject'
         self.dm.localDB.db.close()
         del self.dm
-        del self.WatchDog
-            
-    def testGetChildNauosForItemID_None(self):
-        self.dm = datamanager.DataManager(self, true)
-        self.WatchDog = securitymanager.SecurityManager(self.dm)
+        del self.WatchDog  
         
-        self.dm.login('tstuser','test')
-        childitem = dataobjects.item.Item()
-        dataobjects.item.FillSampleItem(childitem)
-        childitem.pgef_oid = 'xxxx'
-        result = self.dm.getChildNauosForItemID(childitem)
-        self.dm.localDB.Commit()
-        assert len(result) == 0, 'Error should not have found NAUOs'
-        self.dm.localDB.db.close()
-        del self.dm
-        del self.WatchDog
-            
-    def testGetChildNauosForItemID_Some(self):
+    def testgetItemsByProject(self):
         self.dm = datamanager.DataManager(self, true)
+        self.dm.serverName = 'ned.gsfc.nasa.gov'
+        self.dm.serverPort = '8080'
+        self.dm.createServer()
         self.WatchDog = securitymanager.SecurityManager(self.dm)
         
         self.dm.login('tstuser','test')
-        self.dm.setCurrentProject('TEST')
-        parentitem = dataobjects.item.Item()
-        dataobjects.item.FillSampleItem(parentitem)
-        parentnauo = acu.AssemblyComponentUsage(subtype='nauo')
-        parentnauo.assembly = '-1'
-        parentnauo.component = parentitem.pgef_oid
-        childitem = dataobjects.item.Item()
-        dataobjects.item.FillSampleItem(childitem)
-        childnauo = acu.AssemblyComponentUsage(subtype='nauo')
-        childnauo.assembly = parentitem.pgef_oid
-        childnauo.component = childitem.pgef_oid
-        self.dm.localDB.Save([childnauo, parentnauo, parentitem, childitem])
-        result = self.dm.getChildNauosForItemID(parentitem)
+        num_objs = self.dm.getItemsByProject(['H2G2'])
+
         self.dm.localDB.Commit()
-        assert len(result) > 0, 'Error could not retrieve NAUOs'
+        assert num_objs > 1, 'Error - No data returned for getItemsByProject'
         self.dm.localDB.db.close()
         del self.dm
-        del self.WatchDog        
-            
+        del self.WatchDog  
+        
 def suite():
     suite = unittest.TestSuite()
-    #suite.addTest(DataManagerTestCase("testGetItemsByProject"))
     suite.addTest(DataManagerTestCase("Title"))
     suite.addTest(DataManagerCreationTest("testCreation"))
     suite.addTest(DataManagerTestCase("testGetServerList"))
     suite.addTest(DataManagerTestCase("testCreateServer"))
-    #suite.addTest(DataManagerTestCase("testValidLogin"))
-    suite.addTest(DataManagerTestCase("testInvalidLogin"))
-    #suite.addTest(DataManagerTestCase("testFillProjectList"))
-    #suite.addTest(DataManagerTestCase("testGetNAUOByAssemblyID"))
-    #suite.addTest(DataManagerTestCase("testGetItem"))
-    #suite.addTest(DataManagerTestCase("testGetParentNauosForItemID_None"))
-    #suite.addTest(DataManagerTestCase("testGetParentNauosForItemID_Some"))
-    #suite.addTest(DataManagerTestCase("testGetChildNauosForItemID_None"))
-    #suite.addTest(DataManagerTestCase("testGetChildNauosForItemID_Some"))
-    suite.addTest(DataManagerTestCase("testAddNauo"))
-    
+    suite.addTest(DataManagerTestCase("testValidLogin"))
+    #suite.addTest(DataManagerTestCase("testInvalidLogin"))
+    suite.addTest(DataManagerTestCase("testFillProjectList"))
+    suite.addTest(DataManagerTestCase("testQuickCreate"))
+    suite.addTest(DataManagerTestCase("testsetCurrentProject"))
+    suite.addTest(DataManagerTestCase("testgetItemsByProject"))
     return suite
 
 def main():

From pbear at ned.gsfc.nasa.gov  Wed Oct 15 12:12:20 2003
From: pbear at ned.gsfc.nasa.gov (pbear CVS)
Date: Wed Oct 15 11:12:21 2003
Subject: [Pangalactic-commits] updated tests for nasa_advisory, gidep_alert,
	and gidep_problem_advisory
Message-ID: <200310151512.h9FFCKlg017863@ned.gsfc.nasa.gov>

Modified files:
PanGalactic/pangalactic/utils/advisoryreport.py 1.3 1.4
PanGalactic/pangalactic/utils/datepanel.py 1.1 1.2
PanGalactic/pangalactic/utils/reportlab_blocks.py 1.3 1.4

Log message:
updated tests for nasa_advisory, gidep_alert, and gidep_problem_advisory


Index: PanGalactic/pangalactic/utils/reportlab_blocks.py
diff -u PanGalactic/pangalactic/utils/reportlab_blocks.py:1.3 PanGalactic/pangalactic/utils/reportlab_blocks.py:1.4
--- PanGalactic/pangalactic/utils/reportlab_blocks.py:1.3	Wed Jun 25 04:32:12 2003
+++ PanGalactic/pangalactic/utils/reportlab_blocks.py	Wed Oct 15 11:12:18 2003
@@ -54,12 +54,13 @@
     
 def LogoBlock(canvas, x, y, width, height, label_lines, show_center = None, imagename = None):
     """x, y are lower left coordinates"""
-    #print "logoblock"
+    #print "blocks.logoblock"
     canvas.saveState()
 
     try:
         #logo = PIL_Image.open(imagename)
         logoimage = ToolkitImages.getmeatballImage()
+        #print "have logoimage"
         logo = convertimage.wx2PIL(logoimage)
         drawsize = (65, 55) # logo.size
         #print "logo size", drawsize, logo.size
@@ -83,6 +84,7 @@
        canvas.drawString(xplus, yplus, label_lines[2])
                       
     canvas.restoreState()
+    #print "end blocks.logoblock"
     
 
 def TwoTitleBlock(canvas, x, y, width, height, label_lines, font = HelveticaBold, fontsize = FontSize):

Index: PanGalactic/pangalactic/utils/advisoryreport.py
diff -u PanGalactic/pangalactic/utils/advisoryreport.py:1.3 PanGalactic/pangalactic/utils/advisoryreport.py:1.4
--- PanGalactic/pangalactic/utils/advisoryreport.py:1.3	Sat Aug 23 23:56:42 2003
+++ PanGalactic/pangalactic/utils/advisoryreport.py	Wed Oct 15 11:12:18 2003
@@ -4,7 +4,7 @@
 Output formatting functions for the PgefAdvisory document class
 and its subtypes.
 """
-__version__ = "$Revision: 1.3 $"[11:-2]
+__version__ = "$Revision: 1.4 $"[11:-2]
 
 # Python imports
 import types
@@ -67,7 +67,7 @@
         @param filepath:  path of file into which XML is to be
                           written
         """
-        print "advisoryreport.init"
+        #print "advisoryreport.init"
         self.filename = filepath
         self.author = ""
         self.creationdate = ""
@@ -76,7 +76,7 @@
         self.docname = docname
         self.layoutname = self.docname + "_layout.pgef"
         self.numrows = 0
-        print "layoutname", self.layoutname
+        #print "layoutname", self.layoutname
         self.forminfo = []
         self.docinfo = []
         self.remnant_ndxs = []
@@ -92,12 +92,12 @@
         """
         Generate a PDF formatted advisory document.
         """
-        print "pgefadvisory.generatePDF"
-        print "name", self.docname
+        #print "advisoryreport.generatePDF"
+        #print "name", self.docname
         #print "shdesc", doc.short_description
         self._setData(docdata)
         retval = self._generatePDF(attachments)
-        #print "end pgefadvisory.Generate", retval
+        #print "end advisory.Generate", retval
         return retval
 
 
@@ -110,8 +110,10 @@
                        generated
 
         """
-        print "pgefadvisory.generatexml"
-        self._generateXML([], doc.__dict__)
+        #print "advisory._generatexml"
+        retval = self._generateXML([], doc.__dict__)
+        #print "end generatexml"
+        return retval
 
 
     def _loadLayoutFile(self, layoutfilename):
@@ -147,10 +149,10 @@
             elif line.startswith("<layout>"):
                 layout = True
             elif line.startswith("<continuationfields>"):
-#                print "start remnant"
+                #print "start remnant"
                 getremnants = True
             elif line.startswith("</continuationfields>"):
-#                print "end remnant"
+                #print "end remnant"
                 getremnants = False
             elif line.startswith("<formlayout>"):
                 formlayout = True
@@ -241,13 +243,13 @@
 
 
     def _setData(self, datalist):
-        #print "\n\nadvisoryreport.setdata"
+        #print "advisoryreport.setdata"
         for ndx in range(len(self.docinfo)):
             olditem = self.docinfo[ndx]
             tmplist = list(olditem)
             tmplist[1] = datalist[ndx]
             self.docinfo[ndx] = tmplist
-        #print "\n\n"
+
         
     def _generateFirstPage(self, canvas, doc):
         #print "firstpage"
@@ -352,13 +354,16 @@
                 imagename = iteminfo[1]
 #                nasa1 = "National Aeronautics and"
 #                nasa2 = "Space Administration"
+                #print "itemlabel", itemlabel
                 label_lines = itemlabel
 #                label_lines.append(nasa1)
 #                label_lines.append(nasa2)
 #                label_lines.append(itemlabel)
                 #print "show_center", self.show_center
                 blocks.LogoBlock(self.canvas, x, y, width, height, label_lines, self.show_center, imagename)
+                #print "end logo; start box"
                 blocks.Box(self.canvas, x, y, width, height)
+                #print "end logo block"
                 
             elif itemstyle == IMAGE:
                 pass
@@ -369,6 +374,7 @@
         y = self.margin - blocks.TinyFontSize*2 - 4
         blocks.TinyPrint(self.canvas, x, y, self.formrev)
         self.canvas.restoreState()
+        #print "end emptyform"
 
 
     def _fillForm(self):
@@ -403,7 +409,7 @@
             topdown_y = self.margin + ((row-1) * self.rowsize)
             y = hspace - topdown_y
 
-#            print ndx, itemlabel, row, span, "x1y1", x, y, width, height
+#            #print ndx, itemlabel, row, span, "x1y1", x, y, width, height
 
             if itemstyle == NORMAL:
                 blocks.SingleLineBlock(self.canvas, x, y, itemlabel, width, height, iteminfo[1], CourierBold, FontSize)
@@ -479,7 +485,6 @@
                 except:
                     print "unable to attach image", filename
            
-
         return elements
 
 
@@ -546,7 +551,7 @@
 
         
     def _generatePDF(self, attachment_filenames):
-        #print "advisoryreport.generate", self.filename
+        #print "advisoryreport._generatepdf", self.filename
         self._setup()
 
         elements = []
@@ -575,6 +580,7 @@
 
             elif docstyle == PARAGRAPH:
                 tmplist = self.remnant[ndx][0].split("\n\n")
+                #print "remnant[%i] %s" % (ndx, self.remnant[ndx])
                 #print "tmplist", tmplist
                 if len(tmplist) > 0:
                     if len(tmplist[0]) > 0:
@@ -582,6 +588,8 @@
                         for paratext in tmplist:
                             elements.append(Paragraph(paratext, style)) #styleSheet['Normal']))
 #                        elements.append(FrameBreak())
+                #else:
+                    #print "empty remnant; skip it"
 
         imglist = []
         imglist = self._getImageList(attachment_filenames)
@@ -601,6 +609,7 @@
 
 
     def _generateXML(self, outputdata, classdict):
+        #print "_generatexml"
         xmllist = []
         dtdlist = []
         datalist = []
@@ -655,11 +664,13 @@
         xmllist.extend(datalist)
         xmllist.append('</' + self.docname + '>')
 
-#        for item in xmllist:
-#            print item
+        #for item in xmllist:
+        #    print item
 
         xmlfile = open(self.filename, 'w')
         for item in xmllist:
             xmlfile.write(item + "\n")
         xmlfile.close()
+        #print "end _generatexml"
+        return "generated"
 

Index: PanGalactic/pangalactic/utils/datepanel.py
diff -u PanGalactic/pangalactic/utils/datepanel.py:1.1 PanGalactic/pangalactic/utils/datepanel.py:1.2
--- PanGalactic/pangalactic/utils/datepanel.py:1.1	Wed Jun 25 01:25:03 2003
+++ PanGalactic/pangalactic/utils/datepanel.py	Wed Oct 15 11:12:18 2003
@@ -143,11 +143,12 @@
         else:
             return None
 
+    def GetFormattedDateStr(self, formatstr = None):
+        return self.GetDateStr(formatstr)
+    
     def GetDateStr(self, formatstr = None):
         # returns  if format is not specified
 
-        #print "datepanel.GetDateStr"
-        #print "format", formatstr
         #print "default_fmt", DEFAULT_FMT
         y = self.YearWgt.GetValue()
         m = self.MonthWgt.GetSelection()

From bmuir at ned.gsfc.nasa.gov  Wed Oct 15 13:51:15 2003
From: bmuir at ned.gsfc.nasa.gov (bmuir CVS)
Date: Wed Oct 15 12:51:15 2003
Subject: [Pangalactic-commits] removed itemdataform,
	it was replaced by productdataform, also updated test_loginform
Message-ID: <200310151651.h9FGpFBU019651@ned.gsfc.nasa.gov>

Modified files:
PanGalactic/pangalactic/client/modules/psm/itemeditframe.py 1.105 1.106
PanGalactic/pangalactic/client/modules/psm/itemdataform.py 1.13 None
PanGalactic/pangalactic/client/modules/psm/itemdataform.wdr 1.2 None
PanGalactic/pangalactic/client/modules/psm/itemdataform_wdr.py 1.3 None
PanGalactic/pangalactic/client/tests/test_productdataform.py None 1.1
PanGalactic/pangalactic/client/tests/runall.py 1.4 1.5
PanGalactic/pangalactic/client/tests/test_itemsearchform.py 1.1.1.1 1.2
PanGalactic/pangalactic/client/tests/test_loginform.py 1.1.1.1 1.2
PanGalactic/pangalactic/client/tests/test_partslistform.py 1.1.1.1 1.2
PanGalactic/pangalactic/client/tests/test_itemdataform.py 1.1.1.1 None
PanGalactic/pangalactic/utils/datamanager.py 1.45 1.46
PanGalactic/pangalactic/utils/localdb.py 1.39 1.40
PanGalactic/pangalactic/utils/xmlrpcinterface.py 1.19 1.20

Log message:
removed itemdataform, it was replaced by productdataform, also updated test_loginform


Index: PanGalactic/pangalactic/client/tests/runall.py
diff -u PanGalactic/pangalactic/client/tests/runall.py:1.4 PanGalactic/pangalactic/client/tests/runall.py:1.5
--- PanGalactic/pangalactic/client/tests/runall.py:1.4	Tue Oct 14 16:20:38 2003
+++ PanGalactic/pangalactic/client/tests/runall.py	Wed Oct 15 12:51:12 2003
@@ -10,7 +10,7 @@
 import test_aboutbox
 import test_itemeditframe
 import test_psmtool
-import test_itemdataform
+import test_productdataform
 import test_itemsearchform
 import test_loginform
 import test_otherdocform
@@ -22,26 +22,26 @@
 
 def runTest():
     all_tests = unittest.TestSuite()
-    all_tests.addTest(test_pgefobject.suite())
-    all_tests.addTest(test_product.suite())
-    all_tests.addTest(test_pcu.suite())
-    all_tests.addTest(test_part.suite())
-    all_tests.addTest(test_partslist.suite())
-    all_tests.addTest(test_person.suite())
-    all_tests.addTest(test_localdb.suite())    
+    #all_tests.addTest(test_pgefobject.suite())
+    #all_tests.addTest(test_product.suite())
+    #all_tests.addTest(test_pcu.suite())
+    #all_tests.addTest(test_part.suite())
+    #all_tests.addTest(test_partslist.suite())
+    #all_tests.addTest(test_person.suite())
+    #all_tests.addTest(test_localdb.suite())    
     all_tests.addTest(test_datamanager.suite())
-#core    all_tests.addTest(test_aboutbox.suite())
-    all_tests.addTest(test_itemeditframe.suite())
-#core    all_tests.addTest(test_psmtool.suite())
-    all_tests.addTest(test_itemdataform.suite())
-    all_tests.addTest(test_itemsearchform.suite())
-    all_tests.addTest(test_loginform.suite())
-    all_tests.addTest(test_otherdocform.suite())
-    all_tests.addTest(test_partslistform.suite())
-    all_tests.addTest(test_partslistsearch.suite())
-    all_tests.addTest(test_partslistview.suite())
-    all_tests.addTest(test_propertiesform.suite())
-    all_tests.addTest(test_searchframe.suite())
+    all_tests.addTest(test_aboutbox.suite())
+    #all_tests.addTest(test_itemeditframe.suite())
+    #all_tests.addTest(test_psmtool.suite())
+    #all_tests.addTest(test_productdataform.suite())
+    #all_tests.addTest(test_itemsearchform.suite())
+    #all_tests.addTest(test_loginform.suite())
+    #all_tests.addTest(test_otherdocform.suite())
+    #all_tests.addTest(test_partslistform.suite())
+    #all_tests.addTest(test_partslistsearch.suite())
+    #all_tests.addTest(test_partslistview.suite())
+    #all_tests.addTest(test_propertiesform.suite())
+    #all_tests.addTest(test_searchframe.suite())
     
     return all_tests
 

Index: PanGalactic/pangalactic/utils/xmlrpcinterface.py
diff -u PanGalactic/pangalactic/utils/xmlrpcinterface.py:1.19 PanGalactic/pangalactic/utils/xmlrpcinterface.py:1.20
--- PanGalactic/pangalactic/utils/xmlrpcinterface.py:1.19	Tue Oct 14 13:02:29 2003
+++ PanGalactic/pangalactic/utils/xmlrpcinterface.py	Wed Oct 15 12:51:13 2003
@@ -3,10 +3,10 @@
 """
 PanGalactic Client XMLRPC Interfaces
 
-@version: $Revision: 1.19 $
+@version: $Revision: 1.20 $
 """
 
-__version__ = "$Revision: 1.19 $"[11:-2]
+__version__ = "$Revision: 1.20 $"[11:-2]
 
 import xmlrpclib
 import types
@@ -27,7 +27,7 @@
         self.Connect()
         
     def Connect(self):
-        print '%s%s:%s' % ('http://' , self._SERVER, self._PORT)
+        #print '%s%s:%s' % ('http://' , self._SERVER, self._PORT)
         self._RPC =  xmlrpclib.Server('%s%s:%s' % ('http://' , self._SERVER, self._PORT))
         
     def Disconnect(self):
@@ -91,7 +91,7 @@
         @param objs: objects to be hooked up.  Don't worry if you pass an irrelevent object.
         """
         # eventually call only this?  --vwk 23may2003
-        print "xmlrpc.getObjects", classname #, fields, refs, subtypes
+        #print "xmlrpc.getObjects", classname
         data = self._RPC.getObjects(classname, refs, subtypes, fields)
         if data:
             return self._factory.rememberAll(data, objs)

Index: PanGalactic/pangalactic/utils/localdb.py
diff -u PanGalactic/pangalactic/utils/localdb.py:1.39 PanGalactic/pangalactic/utils/localdb.py:1.40
--- PanGalactic/pangalactic/utils/localdb.py:1.39	Wed Oct  8 11:30:47 2003
+++ PanGalactic/pangalactic/utils/localdb.py	Wed Oct 15 12:51:13 2003
@@ -1240,8 +1240,31 @@
                         #print "no key", obj.pgef_oid
 #                        retlist.extend(self.SaveWfEventAudit([obj]))
                         self.SaveWfTransition([obj])
+                elif obj.__class__.__name__ == "Project":
+#                elif isinstance(obj, WfTransition):
+                    #print "localdb.save.wfeventaudit"
+                    if self.dbroot[self.PROJECTOBJECTS].has_key(obj.pgef_oid):
+                        #print "have key"
+                        #print "objid: " + obj.pgef_oid
+                        #print "obj state: " + str(obj.state)
+                        if self.dbroot[self.PROJECTOBJECTS][obj.pgef_oid].state:
+                            #print "have state"
+                            #print "obj.state " + str(obj.state)
+                            if override:
+                                #print "override", obj.pgef_oid
+#                                retlist.extend(self.SaveWfEventAudit([obj])) 
+                                self.dbroot[self.PROJECTOBJECTS][obj.pgef_oid] = obj
+                        else:
+                            #print "no state", obj.pgef_oid
+#                            retlist.extend(self.SaveWfEventAudit([obj]))
+                            self.dbroot[self.PROJECTOBJECTS][obj.pgef_oid] = obj
+                    else:
+                        #print "no key", obj.pgef_oid
+#                        retlist.extend(self.SaveWfEventAudit([obj]))
+                        self.dbroot[self.PROJECTOBJECTS][obj.pgef_oid] = obj
                 else:
                     print "have unknown obj to save", obj.__class__.__name__, obj.id
+                   
         self.Commit()
         #print "retlist", retlist
         return retlist

Index: PanGalactic/pangalactic/client/tests/test_itemsearchform.py
diff -u PanGalactic/pangalactic/client/tests/test_itemsearchform.py:1.1.1.1 PanGalactic/pangalactic/client/tests/test_itemsearchform.py:1.2
--- PanGalactic/pangalactic/client/tests/test_itemsearchform.py:1.1.1.1	Mon Nov  4 14:47:26 2002
+++ PanGalactic/pangalactic/client/tests/test_itemsearchform.py	Wed Oct 15 12:51:12 2003
@@ -8,21 +8,20 @@
         
     def testCreation(self):
         testframe = wxFrame(None, -1, 'Test Frame')
-        testframe.itemdataform = None
+        testframe.productdataform = None
         testframe.itemsearchform = modules.psm.itemsearchform.ItemSearchForm(testframe, -1)
         assert testframe.itemsearchform != None, 'Couldnt create ItemSearchForm'
         del testframe.itemsearchform
         
     def testPrepareQueryItem(self):
         testframe = wxFrame(None, -1, 'Test Frame')
-        testframe.itemdataform = None
+        testframe.productdataform = None
         testframe.itemsearchform = modules.psm.itemsearchform.ItemSearchForm(testframe, -1)
         testframe.itemsearchform.GetTextctrlNameCode().SetValue('testnamecode')
         testframe.itemsearchform.GetComboItemType().SetValue('Board')
         queryitem = testframe.itemsearchform.PrepareQueryItem()
         assert queryitem.name == 'testnamecode', 'NameCode incorrect'
         assert queryitem.short_description == 'testnamecode', 'Name incorrect'
-##==> (postgres) removed from schema        assert queryitem.Type == 'Board'
         del testframe.itemsearchform
 
 def suite():

Index: PanGalactic/pangalactic/client/modules/psm/itemeditframe.py
diff -u PanGalactic/pangalactic/client/modules/psm/itemeditframe.py:1.105 PanGalactic/pangalactic/client/modules/psm/itemeditframe.py:1.106
--- PanGalactic/pangalactic/client/modules/psm/itemeditframe.py:1.105	Wed Oct  8 11:30:46 2003
+++ PanGalactic/pangalactic/client/modules/psm/itemeditframe.py	Wed Oct 15 12:51:12 2003
@@ -1,6 +1,6 @@
 # $Source: /repo/step_testbed/PanGalactic/pangalactic/client/modules/psm/itemeditframe.py,v $
 
-__version__ = "$Revision: 1.105 $"[11:-2]
+__version__ = "$Revision: 1.106 $"[11:-2]
 
 # Python imports
 import copy
@@ -13,7 +13,6 @@
 from pangalactic.client.dataobjects import partslistinfo
 from pangalactic.client.dataobjects import partslistmap
 
-#from pangalactic.client.modules.psm import itemdataform 
 from pangalactic.client.modules.psm import otherdocform 
 from pangalactic.client.modules.psm import partslistform
 from pangalactic.client.modules.psm import partslistview 
@@ -129,7 +128,6 @@
         self.vsplitter.SetMinimumPaneSize(20)
         self.vsplitter.SplitVertically(self.itemtree, self.editnb, 175)
 
-#        EVT_BUTTON(self, itemdataform.DELETE_BUTTON, self.OnDeleteNauo)
         EVT_BUTTON(self, productdataform.DELETE_MM_MV, self.OnDeleteNauo)
 
         EVT_BUTTON(self, productdataform.ID_NEW_MM_MV, self.onNewProduct)

Index: PanGalactic/pangalactic/client/tests/test_loginform.py
diff -u PanGalactic/pangalactic/client/tests/test_loginform.py:1.1.1.1 PanGalactic/pangalactic/client/tests/test_loginform.py:1.2
--- PanGalactic/pangalactic/client/tests/test_loginform.py:1.1.1.1	Mon Nov  4 14:47:26 2002
+++ PanGalactic/pangalactic/client/tests/test_loginform.py	Wed Oct 15 12:51:12 2003
@@ -1,5 +1,5 @@
 import unittest
-import loginclass
+from pangalactic.utils import loginclass
 from wxPython.wx import *
 
 class TestLoginForm(unittest.TestCase):
@@ -7,10 +7,11 @@
         print '\nLoginform suite'
         
     def testCreation(self):
+        app = wxPySimpleApp()
         testframe = wxFrame(None, -1, 'Test Frame')
         testframe.loginclass = None
         testframe.loginclass = loginclass.LoginClass(testframe,-1,'testing login')
-        assert testframe.loginclass != None, 'Couldnt create ItemDataform'
+        assert testframe.loginclass != None, 'Couldnt create LoginForm'
 
 def suite():
     loginform_suite = unittest.TestSuite()

Index: PanGalactic/pangalactic/client/tests/test_partslistform.py
diff -u PanGalactic/pangalactic/client/tests/test_partslistform.py:1.1.1.1 PanGalactic/pangalactic/client/tests/test_partslistform.py:1.2
--- PanGalactic/pangalactic/client/tests/test_partslistform.py:1.1.1.1	Mon Nov  4 14:47:26 2002
+++ PanGalactic/pangalactic/client/tests/test_partslistform.py	Wed Oct 15 12:51:12 2003
@@ -14,7 +14,7 @@
         testframe.partslistform = None
         testframe.State = support.psmstate.PSMState()
         testframe.partslistform = modules.psm.partslistform.PartsListForm(testframe,-1,testframe.State)
-        assert testframe.partslistform != None, 'Couldnt create ItemDataform'
+        assert testframe.partslistform != None, 'Couldnt create PartsListform'
         
      
     def testRootMode(self):

Index: PanGalactic/pangalactic/utils/datamanager.py
diff -u PanGalactic/pangalactic/utils/datamanager.py:1.45 PanGalactic/pangalactic/utils/datamanager.py:1.46
--- PanGalactic/pangalactic/utils/datamanager.py:1.45	Tue Oct 14 13:02:29 2003
+++ PanGalactic/pangalactic/utils/datamanager.py	Wed Oct 15 12:51:13 2003
@@ -1,6 +1,6 @@
 # $Source: /repo/step_testbed/PanGalactic/pangalactic/utils/datamanager.py,v $
 
-__version__ = "$Revision: 1.45 $"[11:-2]
+__version__ = "$Revision: 1.46 $"[11:-2]
 
 import time
 import mx.DateTime
@@ -178,9 +178,7 @@
         else:
             proxyhost = None
             proxyport = None
-            
-#        self.server = support.httpserverinterface.HTTPServerInterface(self.serverName, self.serverPort,
-#                                                                      proxyhost, proxyport)
+
         self.server = xmlrpcinterface.XmlrpcInterface(self.serverName, self.serverPort,
                                                       proxyhost, proxyport)
         
@@ -321,6 +319,7 @@
             self.localDB.SetProjectObjects(projectobjects)
         else:
             print "no data"
+        return len(tempobjlist)
 
     def save(self, savelist):
         self.localDB.Save(savelist)

From bmuir at ned.gsfc.nasa.gov  Wed Oct 15 13:54:18 2003
From: bmuir at ned.gsfc.nasa.gov (bmuir CVS)
Date: Wed Oct 15 12:54:19 2003
Subject: [Pangalactic-commits] updated runall for available tests
Message-ID: <200310151654.h9FGsIFP019679@ned.gsfc.nasa.gov>

Modified files:
PanGalactic/pangalactic/client/tests/runall.py 1.5 1.6

Log message:
updated runall for available tests


Index: PanGalactic/pangalactic/client/tests/runall.py
diff -u PanGalactic/pangalactic/client/tests/runall.py:1.5 PanGalactic/pangalactic/client/tests/runall.py:1.6
--- PanGalactic/pangalactic/client/tests/runall.py:1.5	Wed Oct 15 12:51:12 2003
+++ PanGalactic/pangalactic/client/tests/runall.py	Wed Oct 15 12:54:17 2003
@@ -1,24 +1,24 @@
 import unittest
-import test_pgefobject
-import test_product
-import test_pcu
-import test_part
-import test_partslist
-import test_person
+#import test_pgefobject
+#import test_product
+#import test_pcu
+#import test_part
+#import test_partslist
+#import test_person
 import test_datamanager
-import test_localdb
+#import test_localdb
 import test_aboutbox
-import test_itemeditframe
-import test_psmtool
-import test_productdataform
-import test_itemsearchform
+#import test_itemeditframe
+#import test_psmtool
+#import test_productdataform
+#import test_itemsearchform
 import test_loginform
-import test_otherdocform
-import test_partslistform
-import test_partslistsearch
-import test_partslistview
-import test_propertiesform
-import test_searchframe
+#import test_otherdocform
+#import test_partslistform
+#import test_partslistsearch
+#import test_partslistview
+#import test_propertiesform
+#import test_searchframe
 
 def runTest():
     all_tests = unittest.TestSuite()
@@ -35,7 +35,7 @@
     #all_tests.addTest(test_psmtool.suite())
     #all_tests.addTest(test_productdataform.suite())
     #all_tests.addTest(test_itemsearchform.suite())
-    #all_tests.addTest(test_loginform.suite())
+    all_tests.addTest(test_loginform.suite())
     #all_tests.addTest(test_otherdocform.suite())
     #all_tests.addTest(test_partslistform.suite())
     #all_tests.addTest(test_partslistsearch.suite())

From bmuir at ned.gsfc.nasa.gov  Wed Oct 15 14:26:35 2003
From: bmuir at ned.gsfc.nasa.gov (bmuir CVS)
Date: Wed Oct 15 13:26:37 2003
Subject: [Pangalactic-commits] fixed searchframe tests
Message-ID: <200310151726.h9FHQZVZ020472@ned.gsfc.nasa.gov>

Modified files:
PanGalactic/pangalactic/client/tests/test_searchframe.py 1.1.1.1 1.2

Log message:
fixed searchframe tests


Index: PanGalactic/pangalactic/client/tests/test_searchframe.py
diff -u PanGalactic/pangalactic/client/tests/test_searchframe.py:1.1.1.1 PanGalactic/pangalactic/client/tests/test_searchframe.py:1.2
--- PanGalactic/pangalactic/client/tests/test_searchframe.py:1.1.1.1	Mon Nov  4 14:47:26 2002
+++ PanGalactic/pangalactic/client/tests/test_searchframe.py	Wed Oct 15 13:26:33 2003
@@ -1,20 +1,23 @@
 import unittest
 import modules.psm.searchframe
-import dataobjects.datamanager
+from pangalactic.utils import datamanager
 import support.psmstate
 from wxPython.wx import *
 
 class TestSearchFrame(unittest.TestCase):
+    def Title(self):
+        print '\nSearchFrame suite'
     def testCreateSearchFrame(self):
         state = support.psmstate.PSMState()
         testframe = wxFrame(None, -1, 'Test Frame')
-        dm = dataobjects.datamanager.DataManager(testframe, true)
+        dm = datamanager.DataManager(testframe, true)
         searchframe = None
         searchframe = modules.psm.searchframe.SearchFrame(testframe, -1, 'Search', dm)
         assert searchframe != None, 'Couldnt create AboutBox'
 
 def suite():
     searchframe_suite = unittest.TestSuite()
+    searchframe_suite.addTest(TestSearchFrame("Title"))
     searchframe_suite.addTest(TestSearchFrame("testCreateSearchFrame"))
     return searchframe_suite
 

From pbear at ned.gsfc.nasa.gov  Wed Oct 15 14:48:03 2003
From: pbear at ned.gsfc.nasa.gov (pbear CVS)
Date: Wed Oct 15 13:48:05 2003
Subject: [Pangalactic-commits] fixed alert xml output
Message-ID: <200310151748.h9FHm3iI020853@ned.gsfc.nasa.gov>

Modified files:
PanGalactic/pangalactic/enterprise/pgefadvisory.py 1.37 1.38
PanGalactic/pangalactic/utils/advisoryreport.py 1.4 1.5

Log message:
fixed alert xml output


Index: PanGalactic/pangalactic/enterprise/pgefadvisory.py
diff -u PanGalactic/pangalactic/enterprise/pgefadvisory.py:1.37 PanGalactic/pangalactic/enterprise/pgefadvisory.py:1.38
--- PanGalactic/pangalactic/enterprise/pgefadvisory.py:1.37	Tue Oct  7 15:16:14 2003
+++ PanGalactic/pangalactic/enterprise/pgefadvisory.py	Wed Oct 15 13:48:01 2003
@@ -1,11 +1,11 @@
-# $Id: pgefadvisory.py,v 1.37 2003/10/07 19:16:14 pbear Exp $
+# $Id: pgefadvisory.py,v 1.38 2003/10/15 17:48:01 pbear Exp $
 
 """
 Base class for documents that report conditions related to the
 usability of a product.
 """
 
-__version__ = "$Revision: 1.37 $"[11:-2]
+__version__ = "$Revision: 1.38 $"[11:-2]
 
 import os.path
 import string
@@ -81,7 +81,7 @@
             return Document.__getattr__(self, name)
 
     def setName(self, name):
-        print "name", name
+        #print "name", name
         self.name = name
  
     def getPrettyDocType(self):

Index: PanGalactic/pangalactic/utils/advisoryreport.py
diff -u PanGalactic/pangalactic/utils/advisoryreport.py:1.4 PanGalactic/pangalactic/utils/advisoryreport.py:1.5
--- PanGalactic/pangalactic/utils/advisoryreport.py:1.4	Wed Oct 15 11:12:18 2003
+++ PanGalactic/pangalactic/utils/advisoryreport.py	Wed Oct 15 13:48:02 2003
@@ -4,7 +4,7 @@
 Output formatting functions for the PgefAdvisory document class
 and its subtypes.
 """
-__version__ = "$Revision: 1.4 $"[11:-2]
+__version__ = "$Revision: 1.5 $"[11:-2]
 
 # Python imports
 import types
@@ -110,8 +110,8 @@
                        generated
 
         """
-        #print "advisory._generatexml"
-        retval = self._generateXML([], doc.__dict__)
+        #print "advisory.generatexml"
+        retval = self._generateXML(doc)
         #print "end generatexml"
         return retval
 
@@ -608,13 +608,16 @@
         return "generated"
 
 
-    def _generateXML(self, outputdata, classdict):
-        #print "_generatexml"
+    def _generateXML(self, doc):
+        #print "advisory._generatexml"
         xmllist = []
         dtdlist = []
         datalist = []
 
+        outputdata = doc.outputdata
+        classdict = doc.__dict__
         outputdata_elements = ", ".join(outputdata)
+        #print "outputdata \n%s\n" % outputdata
         
         # DTD
         xmllist.append('<?xml version="1.0" standalone="yes"?>')

From bmuir at ned.gsfc.nasa.gov  Wed Oct 15 15:57:05 2003
From: bmuir at ned.gsfc.nasa.gov (bmuir CVS)
Date: Wed Oct 15 14:57:05 2003
Subject: [Pangalactic-commits] fixed part of the pgefobject tests
Message-ID: <200310151857.h9FIv5Nq021785@ned.gsfc.nasa.gov>

Modified files:
PanGalactic/pangalactic/client/tests/baseobjecttest.py 1.7 1.8
PanGalactic/pangalactic/client/tests/runall.py 1.6 1.7
PanGalactic/pangalactic/client/tests/test_pgefobject.py 1.3 1.4

Log message:
fixed part of the pgefobject tests


Index: PanGalactic/pangalactic/client/tests/runall.py
diff -u PanGalactic/pangalactic/client/tests/runall.py:1.6 PanGalactic/pangalactic/client/tests/runall.py:1.7
--- PanGalactic/pangalactic/client/tests/runall.py:1.6	Wed Oct 15 12:54:17 2003
+++ PanGalactic/pangalactic/client/tests/runall.py	Wed Oct 15 14:57:03 2003
@@ -1,5 +1,5 @@
 import unittest
-#import test_pgefobject
+import test_pgefobject
 #import test_product
 #import test_pcu
 #import test_part
@@ -18,11 +18,11 @@
 #import test_partslistsearch
 #import test_partslistview
 #import test_propertiesform
-#import test_searchframe
+import test_searchframe
 
 def runTest():
     all_tests = unittest.TestSuite()
-    #all_tests.addTest(test_pgefobject.suite())
+    all_tests.addTest(test_pgefobject.suite())
     #all_tests.addTest(test_product.suite())
     #all_tests.addTest(test_pcu.suite())
     #all_tests.addTest(test_part.suite())
@@ -41,7 +41,7 @@
     #all_tests.addTest(test_partslistsearch.suite())
     #all_tests.addTest(test_partslistview.suite())
     #all_tests.addTest(test_propertiesform.suite())
-    #all_tests.addTest(test_searchframe.suite())
+    all_tests.addTest(test_searchframe.suite())
     
     return all_tests
 

Index: PanGalactic/pangalactic/client/tests/test_pgefobject.py
diff -u PanGalactic/pangalactic/client/tests/test_pgefobject.py:1.3 PanGalactic/pangalactic/client/tests/test_pgefobject.py:1.4
--- PanGalactic/pangalactic/client/tests/test_pgefobject.py:1.3	Wed Jun 25 03:43:51 2003
+++ PanGalactic/pangalactic/client/tests/test_pgefobject.py	Wed Oct 15 14:57:03 2003
@@ -1,13 +1,13 @@
 import unittest
 
-import pangalactic.enterprise.pgefobject
+from pangalactic.enterprise import pgefobject
 import baseobjecttest
 
 
 class PGEFObjectTestCase(baseobjecttest.BaseObjectTests):  
     def setUp(self):
-            self.obj1 = dataobjects.pgefobject.PGEFObject()
-            self.obj2 = dataobjects.pgefobject.PGEFObject()
+            self.obj1 = pgefobject.PgefObject()
+            self.obj2 = pgefobject.PgefObject()
     def Title(self):
         print '\nPGEFobject suite'
 
@@ -17,11 +17,11 @@
     suite.addTest(PGEFObjectTestCase("testDefaultObjectValues"))
     suite.addTest(PGEFObjectTestCase("testIsEqual"))
     suite.addTest(PGEFObjectTestCase("testIsEmpty"))
-    suite.addTest(PGEFObjectTestCase("testIsNotEmpty"))
-    suite.addTest(PGEFObjectTestCase("testConvertDataToList"))
-    suite.addTest(PGEFObjectTestCase("testAllDisplayTypesFilledIn"))
-    suite.addTest(PGEFObjectTestCase("testDataMemberNames"))
-    suite.addTest(PGEFObjectTestCase("testValidate"))
+    #suite.addTest(PGEFObjectTestCase("testIsNotEmpty"))
+    #suite.addTest(PGEFObjectTestCase("testConvertDataToList"))
+    #suite.addTest(PGEFObjectTestCase("testAllDisplayTypesFilledIn"))
+    #suite.addTest(PGEFObjectTestCase("testDataMemberNames"))
+    #suite.addTest(PGEFObjectTestCase("testValidate"))
     return suite
 
 def main():

Index: PanGalactic/pangalactic/client/tests/baseobjecttest.py
diff -u PanGalactic/pangalactic/client/tests/baseobjecttest.py:1.7 PanGalactic/pangalactic/client/tests/baseobjecttest.py:1.8
--- PanGalactic/pangalactic/client/tests/baseobjecttest.py:1.7	Fri Jun 27 03:24:49 2003
+++ PanGalactic/pangalactic/client/tests/baseobjecttest.py	Wed Oct 15 14:57:03 2003
@@ -1,10 +1,10 @@
 # $Source: /repo/step_testbed/PanGalactic/pangalactic/client/tests/baseobjecttest.py,v $
 
 import unittest
-import dataobjects.objectstatus
+#import pangalactic.utils.objectstatus
 from pangalactic.utils import pgefexceptions
 
-__version__ = "$Revision: 1.7 $"[11:-2]
+__version__ = "$Revision: 1.8 $"[11:-2]
 
 class BaseObjectTests(unittest.TestCase):
         
@@ -21,16 +21,12 @@
         #assert self.obj1.pgef_oid == None , 'incorrect initial value for oid'
         assert self.obj1.state == '', 'Status not empty'
         assert self.obj1.owner == '', 'incorrect initial value for Point of Contact'
-        assert self.obj1.project == '', 'Incorrect initial value for ProjectNameCode'
         assert self.obj1.creator == '', 'Incorrect initial value for Creator'
-        assert self.obj1.version == '', 'Incorrect initial value for Version'
-        assert self.obj1.create_datetime != '', 'Incorrect initial value for CreationDateTime'
-        assert self.obj1.mod_datetime == '', 'Incorrect initial value for ModifiedDateTime'
     
     def testIsEqual(self):
         """Check to see that the IsEqual method functions properly"""
-        pangalactic.enterprise.pgefobject.FillSampleObject(self.obj1)
-        pangalactic.enterprise.pgefobject.FillSampleObject(self.obj2)
+        self.obj1.popTestData()
+        self.obj2.popTestData()
         assert self.obj1.IsEqual(self.obj2), 'Object1 and object2 are not equal'
         
     def testIsEmpty(self):
@@ -70,7 +66,7 @@
     suite.addTest(BaseObjectTests("testIsEqual"))
     suite.addTest(BaseObjectTests("testIsEmpty"))
     suite.addTest(BaseObjectTests("testIsNotEmpty"))
-    suite.addTest(BaseObjectTests("testConvertDataToList"))
-    suite.addTest(BaseObjectTests("testDataMemberNames"))
+    #suite.addTest(BaseObjectTests("testConvertDataToList"))
+    #suite.addTest(BaseObjectTests("testDataMemberNames"))
     #suite.addTest(BaseObjectTests("testValidate"))
     return suite

From waterbug at ned.gsfc.nasa.gov  Wed Oct 15 19:49:49 2003
From: waterbug at ned.gsfc.nasa.gov (waterbug CVS)
Date: Wed Oct 15 18:49:51 2003
Subject: [Pangalactic-commits] Add document table.
Message-ID: <200310152249.h9FMnnto023634@ned.gsfc.nasa.gov>

Modified files:
PanGalactic/src/sql/createPgerDbTables.sql 1.63 1.64

Log message:
Add document table.


Index: PanGalactic/src/sql/createPgerDbTables.sql
diff -u PanGalactic/src/sql/createPgerDbTables.sql:1.63 PanGalactic/src/sql/createPgerDbTables.sql:1.64
--- PanGalactic/src/sql/createPgerDbTables.sql:1.63	Thu Oct  2 13:39:06 2003
+++ PanGalactic/src/sql/createPgerDbTables.sql	Wed Oct 15 18:49:47 2003
@@ -1,6 +1,6 @@
 /* Pan Galactic Engineering Repository Database (PGERDB) Table Creation Script */
 
-/* $Id: createPgerDbTables.sql,v 1.63 2003/10/02 17:39:06 waterbug Exp $
+/* $Id: createPgerDbTables.sql,v 1.64 2003/10/15 22:49:47 waterbug Exp $
  * 
  * *** TO DO ***
  *     -- TBR (Text-Based Requirements)
@@ -1245,6 +1245,45 @@
     CONSTRAINT dr_has_of_version
         FOREIGN KEY (of_dv_id, of_dm_id, of_dm_id_context)
         REFERENCES doc_version
+        ON UPDATE CASCADE
+        ON DELETE CASCADE
+        DEFERRABLE
+)
+INHERITS (pgef_object);
+
+
+CREATE TABLE document
+    /* Document is a container object that provides access to the
+     * current version of a document and all related objects.
+     * Document is the primary object that applications will deal
+     * directly with.  */
+(
+    pgef_oid                 TEXT UNIQUE,
+        /* (This attribute is inherited from PgefObject.)
+         * pgef_oid is constructed as the concatenation of the
+         * transaction owner's id and the timestamp of the
+         * transaction in Universal Time.  */
+    pgef_class               TEXT DEFAULT 'Document',
+        /* pgef_class indicates what type of application object a
+         * given database row is mapped into.  The default
+         * pgef_class for each table is set at table creation
+         * time, but it may be overridden for any specific row
+         * and set to a custom application object class.  */
+    master                   TEXT,
+        /* pgef_oid of the associated DocMaster.  */
+    current_version          TEXT,
+        /* pgef_oid of the latest DocVersion associated with that
+         * DocMaster.  */
+    PRIMARY KEY (pgef_oid),
+    CONSTRAINT doc_has_master
+        FOREIGN KEY (master)
+        REFERENCES doc_master(pgef_oid)
+        ON UPDATE CASCADE
+        ON DELETE CASCADE
+        DEFERRABLE,
+    CONSTRAINT doc_has_current_version
+        FOREIGN KEY (current_version)
+        REFERENCES doc_version(pgef_oid)
         ON UPDATE CASCADE
         ON DELETE CASCADE
         DEFERRABLE

From pbear at ned.gsfc.nasa.gov  Thu Oct 16 12:17:22 2003
From: pbear at ned.gsfc.nasa.gov (pbear CVS)
Date: Thu Oct 16 11:17:25 2003
Subject: [Pangalactic-commits] added test for workflow creation
Message-ID: <200310161517.h9GFHMFK029537@ned.gsfc.nasa.gov>

Modified files:
PanGalactic/pangalactic/client/tests/test_workflow_wizard.py None 1.1
PanGalactic/pangalactic/client/tests/runall.py 1.7 1.8
PanGalactic/pangalactic/enterprise/workflow/wfprocessoverview.py 1.16 1.17
PanGalactic/pangalactic/enterprise/workflow/workflow_wizard.py 1.18 1.19
PanGalactic/pangalactic/utils/datamanager.py 1.46 1.47

Log message:
added test for workflow creation


Index: PanGalactic/pangalactic/client/tests/runall.py
diff -u PanGalactic/pangalactic/client/tests/runall.py:1.7 PanGalactic/pangalactic/client/tests/runall.py:1.8
--- PanGalactic/pangalactic/client/tests/runall.py:1.7	Wed Oct 15 14:57:03 2003
+++ PanGalactic/pangalactic/client/tests/runall.py	Thu Oct 16 11:17:20 2003
@@ -19,6 +19,7 @@
 #import test_partslistview
 #import test_propertiesform
 import test_searchframe
+import test_workflow_wizard
 
 def runTest():
     all_tests = unittest.TestSuite()
@@ -42,6 +43,7 @@
     #all_tests.addTest(test_partslistview.suite())
     #all_tests.addTest(test_propertiesform.suite())
     all_tests.addTest(test_searchframe.suite())
+    all_tests.addTest(test_workflow_wizard.suite())
     
     return all_tests
 

Index: PanGalactic/pangalactic/utils/datamanager.py
diff -u PanGalactic/pangalactic/utils/datamanager.py:1.46 PanGalactic/pangalactic/utils/datamanager.py:1.47
--- PanGalactic/pangalactic/utils/datamanager.py:1.46	Wed Oct 15 12:51:13 2003
+++ PanGalactic/pangalactic/utils/datamanager.py	Thu Oct 16 11:17:21 2003
@@ -1,6 +1,6 @@
 # $Source: /repo/step_testbed/PanGalactic/pangalactic/utils/datamanager.py,v $
 
-__version__ = "$Revision: 1.46 $"[11:-2]
+__version__ = "$Revision: 1.47 $"[11:-2]
 
 import time
 import mx.DateTime
@@ -743,6 +743,10 @@
         return obj
 
 
+    def getActivity(self, oid):
+        obj = self.localDB.GetLocalObject(self.localDB.WFACTIVITY, oid)
+        return obj
+        
     def getUncommittedWorkflows(self):
         return self.localDB.getUncommittedWorkflows()
     

Index: PanGalactic/pangalactic/enterprise/workflow/wfprocessoverview.py
diff -u PanGalactic/pangalactic/enterprise/workflow/wfprocessoverview.py:1.16 PanGalactic/pangalactic/enterprise/workflow/wfprocessoverview.py:1.17
--- PanGalactic/pangalactic/enterprise/workflow/wfprocessoverview.py:1.16	Tue Oct  7 10:53:48 2003
+++ PanGalactic/pangalactic/enterprise/workflow/wfprocessoverview.py	Thu Oct 16 11:17:20 2003
@@ -146,8 +146,11 @@
 
             
     def FillGrid(self, workflowlist):
-        # duh.
-        #print "wfprocessoverview.fillgrid", workflowlist
+        """
+        Gee.  I guess this fills the grid.
+        """
+
+        # print "wfprocessoverview.fillgrid", workflowlist
         if self.grid:
             if len(workflowlist) > 0:
                 self.workflowlist = workflowlist
@@ -216,8 +219,8 @@
                               'Yes', 'No', size = wxSize(250, 120))
                         result = dlg.ShowModal()
                         if result == wxID_OK:
-                            transitions = wizard.GetTransitions()
-                            activities = wizard.GetActivities()
+                            #transitions = wizard.GetTransitions()
+                            #activities = wizard.GetActivities()
                             wfobj = wizard.Save()
                             #print "wfobj", wfobj
                             if wfobj:
@@ -337,8 +340,8 @@
                               'Yes', 'No', size = wxSize(250, 120))
                         result = dlg.ShowModal()
                         if result == wxID_OK:
-                            transitions = editor.GetTransitions()
-                            activities = editor.GetActivities()
+                            #transitions = editor.GetTransitions()
+                            #activities = editor.GetActivities()
                             wfobj = editor.Save()
                             if wfobj:
                                 self.grid.AddData(wfobj, wxLIGHT_GREY)
@@ -481,18 +484,3 @@
         print "workflowoverview.gridtopdf tbd"
 
 
-#----------------------------------------------------------------------------
-if __name__ == '__main__':
-
-    class MyApp(wxApp):
-            
-        def OnInit(self):
-            frame = wxFrame(NULL, -1, "Workflow Workflow", wxDefaultPosition, wxSize(800, 600))
-            main = WorkflowOverview(frame,-1, wxDefaultPosition, wxSize(800, 600))   
-            frame.Show(true)
-            self.SetTopWindow(frame)
-            return true 
-    
-    #----------------------------------------------------------------------------
-    app = MyApp(0)
-    app.MainLoop()

Index: PanGalactic/pangalactic/enterprise/workflow/workflow_wizard.py
diff -u PanGalactic/pangalactic/enterprise/workflow/workflow_wizard.py:1.18 PanGalactic/pangalactic/enterprise/workflow/workflow_wizard.py:1.19
--- PanGalactic/pangalactic/enterprise/workflow/workflow_wizard.py:1.18	Tue Oct  7 10:53:48 2003
+++ PanGalactic/pangalactic/enterprise/workflow/workflow_wizard.py	Thu Oct 16 11:17:20 2003
@@ -117,6 +117,8 @@
         self.transitiongrid.SetRowLabelSize(40)
         self.transitiongrid.EnableEditing(True)
 
+        self.displayWgt = None
+
         self.MoveTo = None
 
         self.ActNextRow = 0
@@ -218,7 +220,7 @@
             
 
     def createWorkflow(self, name, activities, transitions):
-        #print "wizard.createWorkflow"
+        print "wizard.createWorkflow"
 
         process = wffactory.simpleWfProcess(name)
 
@@ -284,7 +286,8 @@
             if name:
                 self.workflow = self.createWorkflow(name, activities, transitions)
                 self.DataManager.addWorkflow(self.workflow)
-                self.displayWgt.AddData(self.workflow)
+                if self.displayWgt:
+                     self.displayWgt.AddData(self.workflow)
                 self.saved_workflow = True
                 return self.workflow
             else:
@@ -311,7 +314,8 @@
             else:
                 self.DataManager.creatingWorkflow = True
                 self.workflow = self.Save()
-            self.displayWgt.AddData(self.workflow)
+            if self.displayWgt:
+                self.displayWgt.AddData(self.workflow)
             return self.workflow
         else:
             return None

From bmuir at ned.gsfc.nasa.gov  Thu Oct 16 14:22:20 2003
From: bmuir at ned.gsfc.nasa.gov (bmuir CVS)
Date: Thu Oct 16 13:22:22 2003
Subject: [Pangalactic-commits] fixed the rest of the tests for pgefobject
Message-ID: <200310161722.h9GHMKHC031051@ned.gsfc.nasa.gov>

Modified files:
PanGalactic/pangalactic/client/tests/baseobjecttest.py 1.8 1.9
PanGalactic/pangalactic/client/tests/test_pgefobject.py 1.4 1.5

Log message:
fixed the rest of the tests for pgefobject


Index: PanGalactic/pangalactic/client/tests/baseobjecttest.py
diff -u PanGalactic/pangalactic/client/tests/baseobjecttest.py:1.8 PanGalactic/pangalactic/client/tests/baseobjecttest.py:1.9
--- PanGalactic/pangalactic/client/tests/baseobjecttest.py:1.8	Wed Oct 15 14:57:03 2003
+++ PanGalactic/pangalactic/client/tests/baseobjecttest.py	Thu Oct 16 13:22:19 2003
@@ -4,7 +4,7 @@
 #import pangalactic.utils.objectstatus
 from pangalactic.utils import pgefexceptions
 
-__version__ = "$Revision: 1.8 $"[11:-2]
+__version__ = "$Revision: 1.9 $"[11:-2]
 
 class BaseObjectTests(unittest.TestCase):
         
@@ -31,17 +31,19 @@
         
     def testIsEmpty(self):
         """Check to see that the IsEmpty returns true when the object is empty"""
-        assert self.obj1.IsEmpty() == 1 , 'New object should have been empty'
+        result = self.obj1.IsEmpty()
+        assert result == 1 , 'New object should have been empty'
         
     def testIsNotEmpty(self):
         """Check to see that the IsEmpty returns false when the object is empty"""
         self.obj1.creator = '123'
-        assert self.obj1.IsEmpty() == None , 'Object should not have been empty'
+        result = self.obj1.IsEmpty()
+        assert result == False , 'Object should not have been empty'
         self.obj1.creator = ''
         
     def testConvertDataToList(self):
         """Check to see that ConvertDataToList returns the proper number of entries"""
-        temp = self.obj1.ConvertDataToList()
+        temp = self.obj1.convertDataToList()
         assert len(temp) == len(self.obj1._gridmap)
         
     def testDataMemberNames(self):
@@ -66,7 +68,7 @@
     suite.addTest(BaseObjectTests("testIsEqual"))
     suite.addTest(BaseObjectTests("testIsEmpty"))
     suite.addTest(BaseObjectTests("testIsNotEmpty"))
-    #suite.addTest(BaseObjectTests("testConvertDataToList"))
-    #suite.addTest(BaseObjectTests("testDataMemberNames"))
-    #suite.addTest(BaseObjectTests("testValidate"))
+    suite.addTest(BaseObjectTests("testConvertDataToList"))
+    suite.addTest(BaseObjectTests("testDataMemberNames"))
+    suite.addTest(BaseObjectTests("testValidate"))
     return suite

Index: PanGalactic/pangalactic/client/tests/test_pgefobject.py
diff -u PanGalactic/pangalactic/client/tests/test_pgefobject.py:1.4 PanGalactic/pangalactic/client/tests/test_pgefobject.py:1.5
--- PanGalactic/pangalactic/client/tests/test_pgefobject.py:1.4	Wed Oct 15 14:57:03 2003
+++ PanGalactic/pangalactic/client/tests/test_pgefobject.py	Thu Oct 16 13:22:19 2003
@@ -17,11 +17,10 @@
     suite.addTest(PGEFObjectTestCase("testDefaultObjectValues"))
     suite.addTest(PGEFObjectTestCase("testIsEqual"))
     suite.addTest(PGEFObjectTestCase("testIsEmpty"))
-    #suite.addTest(PGEFObjectTestCase("testIsNotEmpty"))
-    #suite.addTest(PGEFObjectTestCase("testConvertDataToList"))
-    #suite.addTest(PGEFObjectTestCase("testAllDisplayTypesFilledIn"))
-    #suite.addTest(PGEFObjectTestCase("testDataMemberNames"))
-    #suite.addTest(PGEFObjectTestCase("testValidate"))
+    suite.addTest(PGEFObjectTestCase("testIsNotEmpty"))
+    suite.addTest(PGEFObjectTestCase("testConvertDataToList"))
+    suite.addTest(PGEFObjectTestCase("testDataMemberNames"))
+    suite.addTest(PGEFObjectTestCase("testValidate"))
     return suite
 
 def main():

From pbear at ned.gsfc.nasa.gov  Thu Oct 16 14:24:51 2003
From: pbear at ned.gsfc.nasa.gov (pbear CVS)
Date: Thu Oct 16 13:24:51 2003
Subject: [Pangalactic-commits] addef test for workflow factory;
	fixed firstcap to camelcap method calls
Message-ID: <200310161724.h9GHOpwk031126@ned.gsfc.nasa.gov>

Modified files:
PanGalactic/pangalactic/client/tests/test_wffactory.py None 1.1
PanGalactic/pangalactic/enterprise/workflow/wffactory.py 1.7 1.8
PanGalactic/pangalactic/utils/xmlrpcinterface.py 1.20 1.21

Log message:
addef test for workflow factory; fixed firstcap to camelcap method calls


Index: PanGalactic/pangalactic/enterprise/workflow/wffactory.py
diff -u PanGalactic/pangalactic/enterprise/workflow/wffactory.py:1.7 PanGalactic/pangalactic/enterprise/workflow/wffactory.py:1.8
--- PanGalactic/pangalactic/enterprise/workflow/wffactory.py:1.7	Tue Oct  7 10:53:48 2003
+++ PanGalactic/pangalactic/enterprise/workflow/wffactory.py	Thu Oct 16 13:24:49 2003
@@ -4,8 +4,8 @@
 
 import copy
 
-from pangalactic.enterprise.workflow.wfprocess import WfProcess
-from pangalactic.enterprise.workflow.wfactivity import WfActivity
+from pangalactic.enterprise.workflow.wfprocess    import WfProcess
+from pangalactic.enterprise.workflow.wfactivity   import WfActivity
 from pangalactic.enterprise.workflow.wftransition import WfTransition
 
 DEFAULT_WORKFLOW = ("WF0",

Index: PanGalactic/pangalactic/utils/xmlrpcinterface.py
diff -u PanGalactic/pangalactic/utils/xmlrpcinterface.py:1.20 PanGalactic/pangalactic/utils/xmlrpcinterface.py:1.21
--- PanGalactic/pangalactic/utils/xmlrpcinterface.py:1.20	Wed Oct 15 12:51:13 2003
+++ PanGalactic/pangalactic/utils/xmlrpcinterface.py	Thu Oct 16 13:24:49 2003
@@ -3,10 +3,10 @@
 """
 PanGalactic Client XMLRPC Interfaces
 
-@version: $Revision: 1.20 $
+@version: $Revision: 1.21 $
 """
 
-__version__ = "$Revision: 1.20 $"[11:-2]
+__version__ = "$Revision: 1.21 $"[11:-2]
 
 import xmlrpclib
 import types
@@ -97,7 +97,7 @@
             return self._factory.rememberAll(data, objs)
 
 
-    def GetCategories(self, context):
+    def getCategories(self, context):
         # Category is a subclass of DataElement.  FSC is a
         # Category; it's passed in as the context
         print "xmlrpc.getcategories"
@@ -105,13 +105,13 @@
         if data:
             return [self._factory.remember(x) for x in data]
 
-    def GetOrganizations(self):
+    def getOrganizations(self):
         print "xmlrpc.getorganizations"
         data = self._RPC.getObjects('Organization', "id_context=DEMO")  ## NOT staying.  Demo only!!  --vwk 28feb2003
         if data:
             return [self._factory.remember(x) for x in data]
 
-    def GetOrganization(self, ObjId):
+    def getOrganization(self, ObjId):
         print "xmlrpc.getorganization"
         data = self._RPC.getObjects('Organization', 'pgef_oid=%s' % ObjId)
         if data:

From waterbug at ned.gsfc.nasa.gov  Thu Oct 16 15:01:41 2003
From: waterbug at ned.gsfc.nasa.gov (waterbug CVS)
Date: Thu Oct 16 14:01:44 2003
Subject: [Pangalactic-commits] Cat -> Category in FSC test data.
Message-ID: <200310161801.h9GI1fFp031990@ned.gsfc.nasa.gov>

Modified files:
PanGalactic/data/cats.tsv 1.3 1.4

Log message:
Cat -> Category in FSC test data.


Index: PanGalactic/data/cats.tsv
diff -u PanGalactic/data/cats.tsv:1.3 PanGalactic/data/cats.tsv:1.4
--- PanGalactic/data/cats.tsv:1.3	Fri Aug 29 14:54:21 2003
+++ PanGalactic/data/cats.tsv	Thu Oct 16 14:01:39 2003
@@ -1,645 +1,645 @@
-\N	Cat	1005	FSC	0	Guns, through 30mm	Guns, through 30mm	 Includes Machine Guns; Brushes, Machine Gun and Pistol. Excludes Turrets, Aircraft.	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
-\N	Cat	1010	FSC	0	Guns, over 30mm up to 75mm	Guns, over 30mm up to 75mm	 Includes Breech Mechanisms; Mounts; Grenade Launchers for Integral-Cartridge Grenades, Single-Shot or Auto-Loading or Automatic-Firing. 	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
-\N	Cat	1015	FSC	0	Guns, 75mm through 125mm	Guns, 75mm through 125mm	 Includes Breech Mechanisms; Mounts; Rammers. 	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
-\N	Cat	1020	FSC	0	Guns, over 125mm through 150mm	Guns, over 125mm through 150mm	 Includes Breech Mechanisms; Power Drives; Gun Shields. 	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
-\N	Cat	1025	FSC	0	Guns, over 150mm through 200mm	Guns, over 150mm through 200mm	 Includes Firing Platforms; Mounts; Gun Shields. 	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
-\N	Cat	1030	FSC	0	Guns, over 200mm through 300mm	Guns, over 200mm through 300mm	 Includes Gun Yokes; Rammers; Reflectors. 	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
-\N	Cat	1035	FSC	0	Guns, over 300mm	Guns, over 300mm	 Includes Breech Mechanisms; Training Gears; Power Drives. 	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
-\N	Cat	1040	FSC	0	Chemical Weapons and Equipment	Chemical Weapons and Equipment	 Includes Flame Throwers; Smoke Generators. 	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
-\N	Cat	1045	FSC	0	Launchers, Torpedo and Depth Charge	Launchers, Torpedo and Depth Charge	 Includes Depth Charge Tracks; Torpedo Tubes. 	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
-\N	Cat	1055	FSC	0	Launchers, Rocket and Pyrotechnic	Launchers, Rocket and Pyrotechnic	 Includes Airborne Rocket Launchers adaptable to guided missile use. Excludes Specifically designed Airborne Guided Missile Launchers; Jettisonable Rocket Launchers; Launcher Fairings designed for specific airframes; Rifle Grenade Launchers; Grenade Launchers for Integral-Cartridge Grenades, Single-Shot or Auto-Loading or Automatic Firing.	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
-\N	Cat	1070	FSC	0	Nets and Booms, Ordnance	Nets and Booms, Ordnance	Note-This class includes nets and booms for harbor defense only.  	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
-\N	Cat	1075	FSC	0	Degaussing and Mine Sweeping Equipment	Degaussing and Mine Sweeping Equipment	  	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
-\N	Cat	1080	FSC	0	Camouflage and Deception Equipment	Camouflage and Deception Equipment	 Includes Dummy Artillery, Aircraft and Vehicles; Garnished Nets. 	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
-\N	Cat	1090	FSC	0	Assemblies Interchangeable Between Weapons in Two or More Classes	Assemblies Interchangeable Between Weapons in Two or More Classes	 Includes Components and Accessories used on or with weapons falling in two or more classes of Group 10. 	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
-\N	Cat	1095	FSC	0	Miscellaneous Weapons	Miscellaneous Weapons	 Includes Line Throwing Guns; Catapult Guns; Bayonets; Saluting Guns; Signal Guns; Flare Guns; Barrage Balloons; Accessories, not elsewhere classifiable, for weapons in this group; Expendable Bomb Dispensers. 	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
-\N	Cat	1105	FSC	0	Nuclear Bombs	Nuclear Bombs	Note-This class includes nuclear weapons (including bombs), which are designed to be dropped from an aircraft. Includes Ballistic cases, tail assemblies, retardation devices, and other peculiar components which are not classifiable elsewhere. Excludes Parachute canopies and canopy hardware.	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
-\N	Cat	1110	FSC	0	Nuclear Projectiles	Nuclear Projectiles	Note- This class includes nuclear weapons which are designed to be propelled from a recoilless rifle, gun, howitzer, or the like, and which are not designed to be self-propelled. Includes Ogive sections, body sections, bases, and other peculiar components which are not classifiable elsewhere. 	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
-\N	Cat	1115	FSC	0	Nuclear Warheads and Warhead Sections	Nuclear Warheads and Warhead Sections	Note This class includes nuclear warheads (without or assembled with case sections, adaption kits, and/or fuzing and firing components) which are to be used in or with bombs, rockets, projectiles, missiles, demolition charges, or the like. Also includes case sections, nose cones, flare sections, center sections, and auxiliary structural components of missiles, rockets, and re-entry vehicles which are designed or constructed for exclusive use with or for housing of nuclear warheads and/or warhead sections. Includes Components and parts peculiar to the warhead or warhead section, which are not classifiable in more specific classes. Excludes Such components as fuzing and firing devices, nuclear components, high explosive components, classifiable in more specific classes, and items such as projectiles and bombs which include the entire outer case of a weapon.	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
-\N	Cat	1120	FSC	0	Nuclear Depth Charges	Nuclear Depth Charges	Note-This class includes nuclear weapons which consist of depth charge bodies assembled with nuclear warheads. It includes training weapons and all specially designed components which are not classifiable elsewhere.  	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
-\N	Cat	1125	FSC	0	Nuclear Demolition Charges	Nuclear Demolition Charges	Note-This class includes nuclear weapons which are designed to be emplaced in or near a structure, area, or the like, which is to be destroyed. The weapons may include accessories. Includes Outer cases, case sections, and other peculiar components, which are not classifiable elsewhere. 	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
-\N	Cat	1127	FSC	0	Nuclear Rockets	Nuclear Rockets	Note-This class includes nuclear weapons, consisting of rocket bodies assembled with nuclear warheads, which comprise a single item of supply and are issued as such. Includes Components peculiar to assembled rockets which are not classifiable elsewhere. Excludes Rocket Motors; Warhead Components; Rocket Components classified in other FSC classes.	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
-\N	Cat	1130	FSC	0	Conversion Kits, Nuclear Ordnance	Conversion Kits, Nuclear Ordnance	Note-This class includes collections of items used for the purpose of converting nuclear weapons from one configuration to another.  	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
-\N	Cat	1135	FSC	0	Fuzing and Firing Devices, Nuclear Ordnance	Fuzing and Firing Devices, Nuclear Ordnance	 Includes such items as fuzes, power supplies, firing sets, x-units, cables, safing devices, adaption kits, and re-entry vehicle nuclear ordnance arming and fuzing systems. 	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
-\N	Cat	1140	FSC	0	Nuclear Components	Nuclear Components	 Includes All components which contain or simulate nuclear active materials. Excludes end items, such as bombs, projectiles, warheads, and the like.	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
-\N	Cat	1145	FSC	0	Explosive and Pyrotechnic Components, Nuclear Ordnance	Explosive and Pyrotechnic Components, Nuclear Ordnance	Note-This class includes actual and simulated explosive and pyrotechnic components peculiar to all nuclear ordnance end items, such as bombs, demolition charges, rockets, projectiles, warheads, and related systems. Excluded from this class are all explosive and pyrotechnic components designed for other than nuclear ordnance applications.  	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
-\N	Cat	1190	FSC	0	Specialized Test and Handling Equipment, Nuclear Ordnance	Specialized Test and Handling Equipment, Nuclear Ordnance	 Includes Specially designed trucks and trailers for nuclear ordnance; Specially designed slings and hoists; Operational, test, and setting devices, and cradles; Conditioning Kits and Sets, Controlled Environment. Excludes Hand tools; Instruments for use on both nuclear ordnance and other equipment; Basic types of electrical and electronic test instruments, including those specially designed, such as ammeters, voltmeters, ohmmeters, multimeters, and similar instruments, as shown in the indexes in the FSC.	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
-\N	Cat	1195	FSC	0	Miscellaneous Nuclear Ordnance	Miscellaneous Nuclear Ordnance	 Includes Items common to more than one class or items not properly fitting into the foregoing classes of nuclear ordnance. 	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
-\N	Cat	1210	FSC	0	Fire Control Directors	Fire Control Directors	  	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
-\N	Cat	1220	FSC	0	Fire Control Computing Sights and Devices	Fire Control Computing Sights and Devices	  	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
-\N	Cat	1230	FSC	0	Fire Control Systems, Complete	Fire Control Systems, Complete	Note-This class includes only complete fire control systems. Anything less than a complete system, such as individual end items, assemblies, parts, attachments, or accessories for use in fire control systems are classified in classes other than this class.  	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
-\N	Cat	1240	FSC	0	Optical Sighting and Ranging Equipment	Optical Sighting and Ranging Equipment	 Includes Periscopes for Submarines; Range and Height Finders; Telescopic Sights; Optical Instruments Integrated with Fire Control Equipment. 	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
-\N	Cat	1250	FSC	0	Fire Control Stabilizing Mechanisms	Fire Control Stabilizing Mechanisms	  	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
-\N	Cat	1260	FSC	0	Fire Control Designating and Indicating Equipment	Fire Control Designating and Indicating Equipment	 Includes Turret, Gun, Torpedo Mount, and Searchlight Indicating Equipment; Target Designating Equipment; Synchro Systems. 	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
-\N	Cat	1265	FSC	0	Fire Control Transmitting and Receiving Equipment, except Airborne	Fire Control Transmitting and Receiving Equipment, except Airborne	 Includes Fire Control Transmitters, Transmitter-Receivers, Receivers, Receiver-Regulators. Excludes Fire Control Transmitting and Receiving Equipment, Specially Designed for use on or with Fire Control Radar Equipment.	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
-\N	Cat	1270	FSC	0	Aircraft Gunnery Fire Control Components	Aircraft Gunnery Fire Control Components	 Includes Turrets, Aircraft; Computers, specifically designed; Complete Gyro Mechanisms. Excludes Gun Chargers; Ammunition Boxes; Gun Heaters; Field and Link Chutes; Ammunition Boosters; Gyro Components; Complete Fire Control Systems.	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
-\N	Cat	1280	FSC	0	Aircraft Bombing Fire Control Components	Aircraft Bombing Fire Control Components	 Includes Computers, specifically designed; Complete Gyro Mechanisms; Optical Instruments for Bombing Fire Control. Excludes Gyro Components; Optical Elements, such as Lens, Prisms, Filters.	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
-\N	Cat	1285	FSC	0	Fire Control Radar Equipment, except Airborne	Fire Control Radar Equipment, except Airborne	 Includes Radar Sets, Assemblies, Subassemblies, and Components Specially Designed for use on or with Fire Control Equipment. 	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
-\N	Cat	1287	FSC	0	Fire Control Sonar Equipment	Fire Control Sonar Equipment	Note-This class includes airborne, shipborne, and submarineborne sonar sets, assemblies, subassemblies, and components designed specificially for use with underwater fire control equipment.  	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
-\N	Cat	1290	FSC	0	Miscellaneous Fire Control Equipment	Miscellaneous Fire Control Equipment	 Includes Fuze Setters; Ordnance Cable Systems; Aiming Circles; Flash and Sound Ranging Sets; Fire Control Components and Subassemblies Not Classifiable in Other Classes of Group 12. 	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
-\N	Cat	1305	FSC	0	Ammunition, through 30mm	Ammunition, through 30mm	 Includes Components. 	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
-\N	Cat	1310	FSC	0	Ammunition, over 30mm up to 75mm	Ammunition, over 30mm up to 75mm	 Includes Components, except Fuzes and Primers; Chemical Warfare Cartridges. Excludes Fuzes and Primers.	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
-\N	Cat	1315	FSC	0	Ammunition, 75mm through 125mm	Ammunition, 75mm through 125mm	 Includes Components, except Fuzes and Primers; Pyrotechnic Cartridges and Projectiles; Chemical Warfare Cartridges and Projectiles. Excludes Fuzes and Primers.	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
-\N	Cat	1320	FSC	0	Ammunition, over 125mm	Ammunition, over 125mm	 Includes Components, except Fuzes and Primers; Chemical Warfare Projectiles. Excludes Fuzes and Primers.	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
-\N	Cat	1325	FSC	0	Bombs	Bombs	 Includes Components; Photoflash Bombs; Chemical Warfare Bombs; Bomb Clusters. 	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
-\N	Cat	1330	FSC	0	Grenades	Grenades	 Includes Components; Hand and Rifle Grenades; Smoke Grenades. Excludes Firing Devices (Launchers).	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
-\N	Cat	1336	FSC	0	Guided Missile Warheads and Explosive Components	Guided Missile Warheads and Explosive Components	 Includes Warheads Containing Military Chemical Agents; Exercise Heads, Guided Missile. Excludes Atomic Ordnance Warheads; All other Warheads for use on other than guided missiles; Liquid Propulsion Units; Rocket Engines (Liquid Propellant Units); JATO Units; Rocket Motors (Solid Propellant Units) for Guided Missiles; Solid Fuel Propulsion Units; Propellant Chemicals encased in consumable containers, such as squibs and cartridges for insertion into missile propulsion systems as integral parts.	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
-\N	Cat	1337	FSC	0	Guided Missile and Space Vehicle Explosive Propulsion Units, Solid Fuel; and Components	Guided Missile and Space Vehicle Explosive Propulsion Units, Solid Fuel; and Components	 Includes Rocket Motors (Solid Propellant Units) for Guided Missiles, Explosive-Loaded; All Explosive Components for Guided Missile and Space Vehicle Solid Fuel Propulsion Units; Solid Propellants encased in consumable containers, such as squibs and cartridges, intended for insertion into missile propulsion systems as integral parts. Excludes Rocket Motors (Solid Propellant Units) for Guided Missiles, Inert-Loaded or Empty; All Inert (Nonexplosive) Components for Guided Missile and Space Vehicle Solid Fuel Propulsion Units; Guided Missile Warheads and Components; Rocket Propulsion Units; Rocket Motors (Solid Propellant Units) for Rockets; Solid Propellants predetermined to specific quantity and quality, but packaged in reusable containers.	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
-\N	Cat	1338	FSC	0	Guided Missile and Space Vehicle Inert Propulsion Units, Solid Fuel; and Components.	Guided Missile and Space Vehicle Inert Propulsion Units, Solid Fuel; and Components.	 Includes Rocket Motors (Solid Propellant Units) for Guided Missiles, Inert-Loaded or Empty; All Inert (Nonexplosive) Components for Guided Missile and Space Vehicle Solid Fuel Propulsion Units. Excludes Rocket Motors (Solid Propellant Units) for Guided Missiles, Explosive-Loaded; Guided Missile Warheads and Components; Rocket Propulsion Units; Rocket Motors (Solid Propellant Units) for Rockets.	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
-\N	Cat	1340	FSC	0	Rockets, Rocket Ammunition and Rocket Components	Rockets, Rocket Ammunition and Rocket Components	 Includes Complete Rounds; Explosive Components, Including Warheads; Pyrotechnic Rockets; Solid Fuel JATO Units; Rocket Motors (Solid Propellant Units) for Rockets; Covers, Protective Rocket Warhead; Jettisonable Rocket Launchers; Conditioning Kits and Sets, Controlled Environment; and other peculiar components which are not classified elsewhere. Excludes Nuclear rockets, Nuclear warheads; all other warheads for use on other than rockets; and rockets with built-in guiding devices.	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
-\N	Cat	1345	FSC	0	Land Mines	Land Mines	 Includes Components; Antipersonnel Mines; Antitank Mines; Fuzes. 	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
-\N	Cat	1346	FSC	0	Remote Munitions	Remote Munitions	Munitions items/systems that are not held by the soldier but are deployed for future activation. They may be put in place separately by the soldier or delivered from vehicles or aircraft by mechanical distribution methods. They may be command controlled or may use self - initiated firing systems that do not require soldier monitoring. All items in this class can be armed/disarmed remotely. Remote Munition Items and Systems used singularly or in combination to defeat a variety of threats; Fuzes; Safe and Arming devises; Self Destruction Mechanisms; Communication Modules; Command and Control systems and various other pertinent components. 	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
-\N	Cat	1350	FSC	0	Underwater Mine and Components, Inert	Underwater Mine and Components, Inert	 Includes Parachute Packs; Inert Mine Cases; Booster Cans; Clock Delays; Clock Starters; Search Coils; Extenders. 	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
-\N	Cat	1351	FSC	0	Underwater Mines and Components, Explosive	Underwater Mines and Components, Explosive	 Includes Loaded Cases; Boosters; Detonators. 	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
-\N	Cat	1352	FSC	0	Underwater Mine Disposal Inert Devices	Underwater Mine Disposal Inert Devices	Note: Version of Underwater Mine Disposal Explosive Device without destructive charge. Intended for underwater mine hunting and reconnaissance. May also be used for training purposes. Includes: Complete operating units, such as an underwater mine reconnaissance device, as well as component parts, practice, training, blank, and dummies. Excludes: Torpedo Inert components, depth charges, and underwater mines.	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
-\N	Cat	1353	FSC	0	Underwater Mine Disposal Explosive Devices	Underwater Mine Disposal Explosive Devices	Note: Complete explosive devices, including destructive charge. It is fired, guided to target and detonated from a vessel or other remote site. Includes Complete explosive device, including ammunition, detonating charge, and component parts. Excludes Underwater Mine Explosive Components (FSC 1351), Torpedo Explosive Components (FSC 1356), Military Chemical Agents (FSC 1365).	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
-\N	Cat	1355	FSC	0	Torpedos and Components, Inert	Torpedos and Components, Inert	  	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
-\N	Cat	1356	FSC	0	Torpedos and Components, Explosive	Torpedos and Components, Explosive	 Includes Warheads; Boosters; Detonators. 	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
-\N	Cat	1360	FSC	0	Depth Charges and Components, Inert	Depth Charges and Components, Inert	 Includes Inert Firing Mechanisms; Pistols without Detonators; Extenders. 	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
-\N	Cat	1361	FSC	0	Depth Charges and Components, Explosive	Depth Charges and Components, Explosive	 Includes Cases; Boosters; Detonators. 	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
-\N	Cat	1365	FSC	0	Military Chemical Agents	Military Chemical Agents	 Includes War Gases; Screening Smokes; Incendiary and thickening Agents; Signaling Smokes. Excludes Ammunition containing Military Chemical Agents.	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
-\N	Cat	1367	FSC	0	Tactical Sets, Kits, and Outfits	Tactical Sets, Kits, and Outfits	A collection of items, which are used for a specific purpose. Each collection must include at least one item of ordnance classified in Group 13. Ordnance may be non-lethal (as defined in the Department of Defense Directive 3000.3). These sets, kits and outfits may include such items as uniforms, weapons, body armor, and the like. By themselves, each of these components belongs in an FSC other than 1367.  	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
-\N	Cat	1370	FSC	0	Pyrotechnics	Pyrotechnics	 Includes Flares; Signals; Fireworks; Pistol Rocket Signals. Excludes Pyrotechnic Cartridges and Projectiles; Photoflash Bombs; Pyrotechnic Rockets.	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
-\N	Cat	1375	FSC	0	Demolition Materials	Demolition Materials	 Includes Items for construction, quarrying and demolition work such as Dynamite and other explosives packed in cylindrical paper cartridges or in bags, Demolition Charges, Blasting Caps, Blasting Time Fuses, Detonating Cord, Demolition Firing Devices; Booby Trap Mechanisms; Bangalore Torpedoes; Inert accessories and components such as Blasting Machines, Priming Adapters, and Detonating Cord Clips. Excludes Liquid Propellant Fuels and Oxidizers; Solid Propellants encased in consumable containers, for insertion into missile propulsion systems as integral parts; Guided Missile Explosive Devices; Safety-in-Flight Explosive Items and Devices such as, Impulse Cartridges, Delay Cartridges, Aircraft Ejection Seat Catapults, Aircraft Canopy Removers, and similar items, as shown in the indexes to the FSC, Solid Propellants, predetermined to specific quantity and quality, packaged in reusable containers; Nuclear Ordnance Components; Rocket and Guided Missile Motors, Warheads, and Propulsion Sections.	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
-\N	Cat	1376	FSC	0	Bulk Explosives	Bulk Explosives	 Includes Solid Propellants, predetermined to specific quantity and quality, packaged in reusable containers; Explosive Loaded Devices and Components as shown in the indexes to the FSC. Excludes Liquid Propellant Fuels and Oxidizers; Solid Propellants encased in consumable containers, for insertion into missile propulsion systems as integral parts; Guided Missile Explosive Devices; Blasting and Demolition Materials; Safety-in-Flight Explosive Items and Devices such as Impulse Cartridges, Delay Cartridges, Aircraft Ejection Seat Catapults, Aircraft Canopy Removers; Rocket and Guided Missile Motors, Warheads, and Propulsion Sections; similiar items, as shown in the indexes to the FSC.	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
-\N	Cat	1430	FSC	0	Guided Missile Remote Control Systems	Guided Missile Remote Control Systems	Note-This class includes airborne and nonairborne guided missile remote control systems, components, and accessories, designed specifically for use therewith. Excluded from this class are fire control assemblies, subassemblies, and components modified for use with guided missile remote control systems, and fire control assemblies designed specifically for shipboard use. Includes Specially Designed Components of Guided Missile Remote Control Systems. Excludes Guided Missile Internal (Built-in) Control Systems; Components used in both guided missiles and other than guided missiles (including fire control components).	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
-\N	Cat	1440	FSC	0	Launchers, Guided Missile	Launchers, Guided Missile	 Includes Airborne and Nonairborne Guided Missile Launchers. Excludes Aircraft Launchers; Rocket Launchers.	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
-\N	Cat	1377	FSC	0	Cartridge and Propellant Actuated Devices and Components	Cartridge and Propellant Actuated Devices and Components	Note-This class includes safety-in-flight explosive items, consisting of a quantity of propellant (either encased in a cartridge or in molded form) and a means of activation, designed to be inserted into or attached to one or more devices to provide the energy required to operate devices requiring a time delay, or not requiring a time delay, in their operating sequence. Also included are devices designed to utilize energy generated by the items described above. Includes Impulse Cartridges; Delay Cartridges; Engine Starter Cartridges (explosive filled); Fire Extinguisher Cartridges (used to activate by remote control); Aircraft Ejection Seat Catapults; Rocket Motors (Solid Propellant Units) for Aircraft Ejection Seats; Aircraft Canopy Removers; Thrusters, propellant and cartridge actuated; Initiators; Explosive Bolts and Explosive Bolt Cartridges; Cutters, cartridge or propellant actuated, Reefing Line; Powder actuated Tool Cartridges; Explosive Loaded Devices and Components which are not specifically classified elsewhere. Excludes Liquid Propellant Fuels and Oxidizers; Solid Propellants, encased in consumable containers for insertion into missile propulsion systems as an integral part; Guided Missile Explosive Devices; Bulk and Solid Propellants, predetermined to specific quantity and quality, packaged in reusable containers; Blasting and Demolition Materials; Rocket Motors, Warheads and Propulsion Sections for Rockets and Guided Missiles.	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
-\N	Cat	1385	FSC	0	Surface Use Explosive Ordnance Disposal Tools and Equipment	Surface Use Explosive Ordnance Disposal Tools and Equipment	Note-This class includes only specialized tools and equipment developed for and used by qualified Explosive Ordnance Disposal (EOD) personnel.  Excludes Nonspecialized or common tools and equipment not developed exclusively for use by qualified EOD personnel; specialized demolition material; explosive loaded shaped charges.	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
-\N	Cat	1386	FSC	0	Underwater Use Explosive Ordnance Disposal and Swimmer Weapons Systems Tools and Equipment	Underwater Use Explosive Ordnance Disposal and Swimmer Weapons Systems Tools and Equipment	Note-This class includes only specialized tools and equipment developed for and used by qualified Explosive Ordnance Disposal (EOD), personnel, Underwater Demolition Teams (UDT), and/or Sea-Air-Land (SEAL) personnel  Excludes Nonspecialized or common tools not developed exclusively for use by qualified EOD, UDT, and/or SEAL personnel; specialized demolition material; explosive loaded shaped charges	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
-\N	Cat	1390	FSC	0	Fuzes and Primers	Fuzes and Primers	Note-This class includes only fuzes and primers for use in ammunition classified in Classes 1310, 1315, and 1320.  Excludes Fuzes and Primers for ammunition not classified in Classes 1310, 1315, and 1320.	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
-\N	Cat	1395	FSC	0	Miscellaneous Ammunition	Miscellaneous Ammunition	 Includes Ammunition Shapes, such as Blanks, Disks, Slugs, Cups, and Rotating Bands (Shell Bands). 	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
-\N	Cat	1398	FSC	0	Specialized Ammunition Handling and Servicing Equipment	Specialized Ammunition Handling and Servicing Equipment	 Includes Handling and servicing equipment specially designed for use on or with rockets and conventional ammunition. Excludes Handling and servicing equipment specially designed for use on or with rocket and pyrotechnic launchers; Ammunition maintenance and repair shop specialized equipment; Handling equipment specially designed for aircraft or airfield use.	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
-\N	Cat	1410	FSC	0	Guided Missiles	Guided Missiles	Note-This class includes only complete guided missiles, with or without warheads and explosive components, whether in assembled or unassembled form. End items, assemblies, parts, attachments, or accessories for use in or on guided missiles are classified in classes other than this class. Includes Complete Drones, initially designed as missiles, but converted to drone use. 	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
-\N	Cat	1420	FSC	0	Guided Missile Components	Guided Missile Components	 Includes Structural Components; Components and Accessories Specially Designed for use on or with guided missiles, including Complete Gyro Mechanisms, Hydraulic Pumps, Automatic Pilot Mechanisms and Specially Designed Assemblies, and Electronic Guidance Equipment installed in missiles. Excludes Electronic Remote Guidance Equipment used to guide missiles; Solid and Liquid Propellant Units; Components of Gyro Mechanisms.	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
-\N	Cat	1425	FSC	0	Guided Missile Systems, Complete	Guided Missile Systems, Complete	Note-This class includes only complete guided missile systems. Anything less than a complete system, such as individual end items, assemblies, parts, attachments, or accessories for use in guided missile systems are classified in classes other than this class.  Excludes Guided Missile Subsystems.	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
-\N	Cat	1427	FSC	0	Guided Missile Subsystems	Guided Missile Subsystems	Note-This class includes only combinations or assemblies of two or more end items, each of which is properly classified in other classes of this group, identified as single items of supply. Excluded from this class are individual end items, assemblies, subassemblies, attachments, accessories or parts classified in other classes of this group, not combined as single items of supply.  Excludes Complete Guided Missile Systems.	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
-\N	Cat	1450	FSC	0	Guided Missile Handling and Servicing Equipment	Guided Missile Handling and Servicing Equipment	 Includes Specially Designed Trucks and Trailers for use in transporting guided missiles; Specially Designed Slings, Hoists, Jacks, and Blowers; Self-propelled Vehicles and Trailers, Specially Designed for Guided Missile Handling or Servicing; Covers, Guided Missile; Conditioning Kits and Sets, Controlled Environment. Excludes Guided Missile Launchers (FSC 1440); Aircraft Handling and Servicing Equipment (FSC 1730).	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
-\N	Cat	1510	FSC	0	Aircraft, Fixed Wing	Aircraft, Fixed Wing	Note-This class includes only complete aircraft. End items, assemblies, parts, attachments, or accessories for use in or on fixed wing aircraft are classified in classes other than this class.  	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
-\N	Cat	1520	FSC	0	Aircraft, Rotary Wing	Aircraft, Rotary Wing	Note-This class includes only complete aircraft. End items, assemblies, parts, attachments, or accessories for use in or on rotary wing aircraft are classified in classes other than this class. Includes Helicopters. 	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
-\N	Cat	1540	FSC	0	Gliders	Gliders	Note-This class includes only complete gliders. End items, assemblies, parts, attachments, or accessories for use in or on gliders are classified in classes other than this class. Includes Motorized Gliders. 	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
-\N	Cat	1550	FSC	0	Drones	Drones	Note-This class includes only complete drones. End items, assemblies, parts, attachments, or accessories for use in or on drones are classified in classes other than this class. Includes Drones specifically designed for such uses as targets, training, surveillance, missile evaluation, and photographic reconnaissance. Excludes Piloted aircraft and guided missiles converted to drone use.	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
-\N	Cat	1560	FSC	0	Airframe Structural Components	Airframe Structural Components	Note-This class includes fabricated system parts that are permanently attached or peculiar to the integral airframe of an aircraft, such as support structural components, spars, ribs, ailerons, stabilizers, bulkheads. Includes Flight Control Surfaces; Internal and External Auxiliary Fuel Tanks; Exhaust Systems; Pylons, Trim Tabs; Aircraft. Excludes Fitted Covers; Helicopter Rotor Brake System Components; Aircraft Loose Equipment and Alternate Mission Configuration Equipment stored on board the aircraft.	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
-\N	Cat	1610	FSC	0	Aircraft Propellers and Components	Aircraft Propellers and Components	 Includes Aircraft Propellers; Propeller Blades, Cams, Cones, Hubs, Nuts, and Spinners; Test Clubs; Synchronizers; Power Control Units; Integral Oil Control Measures and Propeller Governors. Excludes Rotary Rudder and Rotary Wing Blades (FSC 1615).	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
-\N	Cat	1615	FSC	0	Helicopter Rotor Blades, Drive Mechanisms and Components.	Helicopter Rotor Blades, Drive Mechanisms and Components.	Note-This class includes miscellaneous component parts specifically designed for, and used exclusively in, helicopter drive mechanisms and rotor blades when not specifically classified elsewhere in the FSC indexes. Includes Helicopter dynamic components and specially designed parts that transmit power from the aircraft power plant to the rotary wing and rotary rudder. Also included in this class are Rotors; Blades; Rotor Blade, Trim, Tabs; Blade Sets; Yokes; Clutches and Transmissions. Excludes Propellers (FSC 1610); Rotor Brake Systems Components (FSC 1630); Rotor Blade Hydraulic Folding System Components (FSC 1650); Hydraulic Servo System Components (FSC 1650).	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
-\N	Cat	1620	FSC	0	Aircraft Landing Gear Components	Aircraft Landing Gear Components	 Includes Shock Struts and Components; Installation Elements, such as Torsion Bars, Vibration Links, Drag Struts; Landing Gear Trunions, Axles and Shimmy Dampeners; Specially designed hydraulic power steering system components. Excludes Mounting Braces and Mounting Plates permanently installed on aircraft (FSC 1680); Landing Wheels, Skis, and Floats (FSC 1630); Wheel Brakes and Wheel Brake Cylinders (FSC 1630).	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
-\N	Cat	1630	FSC	0	Aircraft Wheel and Brake Systems	Aircraft Wheel and Brake Systems	 Includes Skis; Floats; Tracks; Landing Wheel Skid Detectors; Valves specifically designed for use with hydraulic or pneumatic wheel and brake systems; Helicopter Rotor Brake System Components. Excludes Landing Gear Axles (FSC 1620).	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
-\N	Cat	1640	FSC	0	Aircraft Control Cable Products	Aircraft Control Cable Products	Note - Wire rope, with attachments or terminations and pulleys, used in aircraft control applications, will be classified in this class. Includes Wire Rope; Single Leg Wire Assemblies; Wire Strands; Control Pulleys; Turnbuckle Lock Clips and other wire rope attachments and terminations. Excludes General use Chain and Wire Rope (FSC 4010); general use Pulleys (FSC 3020); general use Miscellaneous Hardware (FSC 5340); general use Fittings for Rope, Cable and Chain (FSC 4030).	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
-\N	Cat	1650	FSC	0	Aircraft Hydraulic, Vacuum, and De-icing System Components	Aircraft Hydraulic, Vacuum, and De-icing System Components	Note-This class includes only those components specifically designed for aircraft use. Includes Hydraulic and Pneumatic Accumulators, Pumps, Motors, Actuating Cylinders, and Filters; De-icing Boots; Fluid Type De-icing Pumps, Valves and Filters; Vacuum System Oil Separators; Pneumatic Pressurization Equipment other than that for pressurizing cabins and compartments. Excludes Jet Engine Hydraulic Components (FSC 2840); Valves specifically designed for air conditioning, heating, ventilating, cabin pressurizing, and thermal de-icing (FSC 1660); Valves specifically designed for use with Aircraft Engines (FSC 2840); Guided Missiles and Guided Missile Engines (FSC 1338), Landing Gear (FSC 1620), Wheel and Brake System Components (FSC 1630); Oxygen Breathing System Components (FSC 1660); In-flight Refueling System Hydraulic components (FSC 1680); Specifically designed hydraulic power steering system components (FSC 1620).	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
-\N	Cat	1660	FSC	0	Aircraft Air Conditioning, Heating, and Pressurizing Equipment	Aircraft Air Conditioning, Heating, and Pressurizing Equipment	Note-This class includes components specifically designed for use in aircraft air conditioning, heating, and pressurizing equipment. Also included are specially designed components of oxygen breathing systems used in aircraft. Includes Cabin Supercharging Equipment; Canisters; Cylinder Assemblies; Masks; Fixed Oxygen System; Specially Designed Aircraft Valves; Cabin Pressure Regulators; Heat Exchangers; Air Expansion Turbines; Aircraft Heaters; Ventilating System Components; Air Conditioning and Heating Duct Assemblies; Thermal De-icing Equipment; Cabin and Compartment Pressurizing Equipment; Air Diffusers; Cabin Pressure Selectors; Liquid Oxygen Converters. Excludes Oxygen Pressure Signals and Warning Devices; Tubing; Ground Type Heaters and Coolers; Pressurizing Equipment other than that used for Cabin and Compartment Pressurization; Fluid De-icing Equipment; Valves specifically designed for use with Aircraft Engines, Guided Missiles, and Guided Missile Engines.	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
-\N	Cat	1670	FSC	0	Parachutes; Aerial Pick Up, Delivery, Recovery Systems; and Cargo Tie Down Equipment	Parachutes; Aerial Pick Up, Delivery, Recovery Systems; and Cargo Tie Down Equipment	Note-Includes specifically designed items, sets, and systems for air-to-air, air-to-surface, and surface-to-air delivery, pick up, and recovery operations, unless parts, attachments, assemblies, for use in or on such systems (i.e., space vehicle aerial recovery systems) are specifically indexed to other classes of the FSC (i.e., Transmitting Radio Buoys and Direction Finding Subsystem Components).  Excludes Fitting Assemblies built into the aircraft structure.	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
-\N	Cat	1680	FSC	0	Miscellaneous Aircraft Accessories and Components	Miscellaneous Aircraft Accessories and Components	 Includes Control Assemblies, Push-Pull; Brace, Positioning Cargo Ramp stowed on board; Cockpit Mounted Control Quadrants; Actuators, Electro-Mechanical and Mechanical; Ventilators; Relief Tubes; Map Holders; Aerial Glider Towing Accessories attached to Aircraft; Belts, Safety and Lap; Harness, Shoulder and Safety; Litter Attaching Supports;Electric Windshield Wipers;Aircraft Onboard Inert Gas Generators;Aircraft Furniture;Aircraft Mounted Winches and Hoists;In-Flight Refueling System Components, including Fuel Components;Aircraft Curtains;Cable Tension Regulators;Sun Visors;Rear-View Mirrors;Mechanical Transmissions, Gearboxes and Constant Speed drives Specially designed for aircraft. Excludes Engine Mounted Control Assemblies; Fitted Covers, Aircraft Pylons; Helicopter Roter Brake System Components; Helicopter Automatic Stabilization Equipment.	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
-\N	Cat	1710	FSC	0	Aircraft Landing Equipment.	Aircraft Landing Equipment.	 Includes Aircraft Arresting Barriers. Excludes Airport Runway Marker Lights (FSC 6220).	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
-\N	Cat	1720	FSC	0	Aircraft Launching Equipment	Aircraft Launching Equipment	 Includes Catapults. Excludes Guided Missile Launchers (FSC 1440) and Space Vehicle Launchers (FSC 1840).	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
-\N	Cat	1730	FSC	0	Aircraft Ground Servicing Equipment	Aircraft Ground Servicing Equipment	Note-This class excludes "vehicular components" such as those listed under FSC's 2520, 2530, 2540, 2590. Includes Energizers; Engine Preheaters; Mooring Assemblies; Wheel Chocks; Beaching Equipment; Aileron, Elevator, and Rudder Locks; Passenger Loading Ramps; Maintenance Platforms; Aircraft Maintenance and Boarding Ladders; Aircraft Maintenance Slings and Hoists; Aircraft Fin Tilting Jacks; Airfield Specialized Lift Trucks and Trailers; Fitted Covers for Airframe Components; Aircraft Engine Covers. Excludes Airfield Specialized Trucks and Trailers designed primarily for transporting aircraft assemblies (FSC 1740); Maintenance Stands designed for support of aircraft assemblies during repair or overhaul (FSC 4920); Test Stands (FSC 4920); General Purpose Jacks (FSC 5120); Slings (FSC 3940), and Hoists (FSC 3950); Trailers (FSC 2330), Liquid Oxygen, Aircraft Servicing (FSC 1660).	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
-\N	Cat	1740	FSC	0	Airfield Specialized Trucks and Trailers	Airfield Specialized Trucks and Trailers	Note-This class excludes "vehicular components" such as those listed under FSC's 2520, 2530, and 2590. Includes Airfield Specialized Trucks and Trailers designed primarily for transporting aircraft assemblies; Trailers: Afterburner, Engine, Propeller, Fuselage, and Wing; Trucks, Aircraft Fuselage and Aircraft Wing; Skids, Engine Transport; Stands, Engine Transport; Bomb Trailers, Airfield; Trucks, Crashed Aircraft Removing. Excludes Airfield Specialized Lift Trucks (FSC 3930), and Trailers (FSC 2330); Highway Type Trucks (FSC 2320), and Trailers (FSC 2330); Cargo Loading and Unloading Trailers (FSC 2330) and Trucks (FSC 2320).	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
-\N	Cat	1810	FSC	0	Space Vehicles	Space Vehicles	Note-This class includes only complete space vehicles, whether in assembled or unassembled form.  	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
-\N	Cat	1820	FSC	0	Space Vehicle Components	Space Vehicle Components	 Includes Structural Components; Components and Accessories specially designed for installation in or on Space Vehicles; Internal (Built-in) Control Systems. Excludes Remote Guidance Equipment.	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
-\N	Cat	1830	FSC	0	Space Vehicle Remote Control Systems	Space Vehicle Remote Control Systems	 Includes Specifically designed Components of Space Vehicle Remote Control Systems. Excludes Internal (Built-in) Control Systems; Components designed for use with both Guided Missile and Space Vehicle Systems.	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
-\N	Cat	1840	FSC	0	Space Vehicle Launchers	Space Vehicle Launchers	 Includes Launchers specifically designed for Space Vehicles. Excludes Launchers used with both Guided Missiles and Space Vehicles.	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
-\N	Cat	1850	FSC	0	Space Vehicle Handling and Servicing Equipment	Space Vehicle Handling and Servicing Equipment	Note-This class does not include space vehicle aerial recovery system which are classified in Class 1670. Includes Specially designed Trucks and Trailers for use in transporting Space Vehicles; Specially designed Slings, Hoists, Jacks, and Blowers, Self-propelled Vehicles, specially designed for space vehicle handling or servicing; Covers, space vehicle Excludes Equipment used in handling or servicing both Guided Missile and Space Vehicles.	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
-\N	Cat	1860	FSC	0	Space Survival Equipment	Space Survival Equipment	 Includes Food and Water Production Equipment; Air Production Equipment; Shelter Equipment; Power Generation and Conversion Equipment. Excludes Items which are integral components of Space Vehicles.	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
-\N	Cat	1905	FSC	0	Combat Ships and Landing Vessels	Combat Ships and Landing Vessels	 Includes Aircraft Carriers; Battleships; Cruisers; Destroyers; Submarines; Frigates and Corvettes; Gunboats; Motor Torpedo Boats; Subchasers; Landing Barges; Minelaying and Mine Sweeping Craft. 	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
-\N	Cat	1910	FSC	0	Transport Vessels, Passenger and Troop	Transport Vessels, Passenger and Troop	  	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
-\N	Cat	1915	FSC	0	Cargo and Tanker Vessels	Cargo and Tanker Vessels	  	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
-\N	Cat	1920	FSC	0	Fishing Vessels	Fishing Vessels	  	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
-\N	Cat	1925	FSC	0	Special Service Vessels	Special Service Vessels	 Includes Tugs; Towboats; Fire Boats; Ice Breakers; Repair Ships; Tender Vessels (Buoy, Lighthouse, Destroyer); Lightships; Cable Ships; Salvage and Submarine Rescue Vessels. Excludes Combat Vessels; Dredges.	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
-\N	Cat	1930	FSC	0	Barges and Lighters, Cargo	Barges and Lighters, Cargo	 Includes Aircraft Lighters, Car Floats, and other Transportation Barges, Depot Barges; Scows. 	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
-\N	Cat	1935	FSC	0	Barges and Lighters, Special Purpose	Barges and Lighters, Special Purpose	 Includes Derrick, Piledriver, and Rock Cutter Barges; Barrage Balloon, Catapult Lighter, and Torpedo Testing Barges; Concrete Mixing Plant, Mechanical Bank Grader, and other Bank Revetment Barges; Fire, Smudge Removal, and other Pump Barges; Houseboats, except Yacht Type; Power Plant Barges; Refrigeration Barges; Barge Mounted Cranes, Flexible Towed Barges. Excludes Combat Landing Barges.	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
-\N	Cat	1940	FSC	0	Small Craft	Small Craft	 Includes Powered and Unpowered Small Craft; Lifesaving Boats; Airplane Crash Boats; Reconnaissance Boats; Yachts; Pneumatic Boats. Excludes Fishing Craft; Life Rafts, including Pneumatic; Bridge Floats and Pontoons.	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
-\N	Cat	1945	FSC	0	Pontoons and Floating Docks	Pontoons and Floating Docks	 Includes Camels; Pontoon Stanchions; Pontoon Ramps. Excludes Floating Drydocks; Bridge Floats and Pontoons; Pontoon Hardware (Jewelry).	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
-\N	Cat	1950	FSC	0	Floating Drydocks	Floating Drydocks	  	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
-\N	Cat	1955	FSC	0	Dredges	Dredges	 Includes Dredges, without Hull; Ocean-Going Dredges; Floating Dredges. 	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
-\N	Cat	1990	FSC	0	Miscellaneous Vessels	Miscellaneous Vessels	 Includes Commercial Sailing Vessels. 	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
-\N	Cat	2010	FSC	0	Ship and Boat Propulsion Components	Ship and Boat Propulsion Components	 Includes Propulsion Shafts; Ship Proppellers. Marine Transmissions, Reverse and Reduction Gear Type. Excludes Engines (FSC 2810, 2815); Turbines (FSC 2825, 2835, 2840).	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
-\N	Cat	2020	FSC	0	Rigging and Rigging Gear	Rigging and Rigging Gear	 Includes Masts; Kingposts; Sail Booms; Shipborne Booms not attached to Cranes and Derricks. Excludes Tackle Blocks.	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
-\N	Cat	2030	FSC	0	Deck Machinery	Deck Machinery	 Includes Steering Gears and Controls; Boat Davits. 	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
-\N	Cat	2040	FSC	0	Marine Hardware and Hull Items	Marine Hardware and Hull Items	 Includes Anchors; Grapnels; Sea Anchors; Watertight Doors; Ship Ventilators; Hatches; Manholes; Scuttles; Air Ports; Fenders; Sea Chests; Scuppers; Rudders; Stern Tubes; Chain Pipes; Hawse Pipes; Boiler Uptakes and Stacks; Chocks; Mast and Boom Fittings; Oars; Paddles; Oarlocks. 	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
-\N	Cat	2050	FSC	0	Buoys	Buoys	  	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
-\N	Cat	2060	FSC	0	Commercial Fishing Equipment	Commercial Fishing Equipment	  Excludes Fishing Vessels.	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
-\N	Cat	2090	FSC	0	Miscellaneous Ship and Marine Equipment	Miscellaneous Ship and Marine Equipment	 Includes Sails; Chain Ladders; Rope Ladders; Marine Furniture. 	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
-\N	Cat	2210	FSC	0	Locomotives	Locomotives	Note-This class includes only complete locomotives and tenders. End items, assemblies, parts, attachments, or accessories for use in or on locomotives and tenders are classified in classes other than this class.  Excludes Self-Propelled Cars.	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
-\N	Cat	2220	FSC	0	Rail Cars	Rail Cars	Note-This class includes only complete rail cars. End items, assemblies, parts, attachments, or accessories for use in or on rail cars are classified in classes other than this class. Includes Trailed Cars; Self-Propelled Cars. Excludes Aerial Tramway Cars.	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
-\N	Cat	2230	FSC	0	Right-of-Way Construction and Maintenance Equipment, Railroad	Right-of-Way Construction and Maintenance Equipment, Railroad	 Includes Rail Laying, Joining and Shifting Equipment; Self-propelled and Car Mounted Cranes. Excludes Hand Tools (FSG 51).	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
-\N	Cat	2240	FSC	0	Locomotive and Rail Car Accessories and Components	Locomotive and Rail Car Accessories and Components	 Includes Brake Beams and Components; Couplers; Trucks and Components; Journals and Components; Wheel Sets and Components. Excludes Railroad Furniture (FSG 71).	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
-\N	Cat	2250	FSC	0	Track Material, Railroad	Track Material, Railroad	 Includes Railroad Rails; Railroad Tie Plates; Railroad Turnouts and Components; Railroad Spikes. Excludes Ballast (FSC 5610); Railroad Ties (FSC 5510).	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
-\N	Cat	2305	FSC	0	Ground Effect Vehicles	Ground Effect Vehicles	  	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
-\N	Cat	2310	FSC	0	Passenger Motor Vehicles	Passenger Motor Vehicles	Note-This class includes only complete passenger motor vehicles, and chassic therefor. Any end items, assemblies, parts, attachments, or accessories, other than complete chassis, for use in or on passenger motor vehicles are classified in classes other than this class. Includes Cars, Motor, Highway; Busses; Chassis, Passenger Motor Vehicle; Hearses; Ambulances. Excludes Amphibious Personnel Carriers; All Truck Chassis.	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
-\N	Cat	2320	FSC	0	Trucks and Truck Tractors, Wheeled	Trucks and Truck Tractors, Wheeled	Note-This class includes only complete wheel mounted trucks and truck tractors, and chassis therefor. Any end items, assemblies, parts, attachments, or accessories other than complete chassis, for use in or on such trucks or truck tractors are classified in classes other than this class. The combined chassis and body of a special purpose truck, such as a machine shop, mobile laundry, or dental laboratory, is classified in this class. The complete mobile unit, consisting of chassis, body, and additional equipment, as in an equipped truck mounted machine shop, is excluded from this class. Includes Panel, Delivery and Pick Up Trucks, Tactical and Administrative Military Cargo Carrying Vehicles, including Wheel Mounted Amphibian Vehicles; Truck Tractors and Trailer Combinations; Armored Cars. Excludes Fire Trucks; Special Construction Type Earth and Rock Hauling Trucks; Motorized Air Compressors; Motorized Concrete Mixers; Construction Specialized Machinery Generally; Specially designed trucks for use in and around airfields, hangers, and warehouses; Tracked and Halftracked Vehicles.	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
-\N	Cat	2330	FSC	0	Trailers	Trailers	Note-This class includes only complete trailers, and chassis therefor. Any end items, assemblies, parts, attachments, or accessories, other than complete chassis, for use in or on trailers are classified in classes other than this class. The combined chassis and body of a special purpose trailer, such as a machine shop, mobile laundry, or dental laboratory, is classified in this class. The complete mobile unit, consisting of chassis, body, and additional equipment, as in an equipped trailermounted machine shop, is excluded from this class. Includes Semitrailers; Semitrailer Dollies; Cargo Trailers; Passenger and House Trailers; Special Purpose Trailers, such as Ammunition. Excludes Fire Fighting Trailers; Specially designed trailers for use in and around airfields, hangers, and warehouses.	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
-\N	Cat	2340	FSC	0	Motorcycles, Motor Scooters, and Bicycles	Motorcycles, Motor Scooters, and Bicycles	Note-This class includes only complete motorcycles, complete motor scooters, and complete bicycles. End items, assemblies, parts, attachments, or accessories for use in or on motorcycles, motor scooters, or bicycles are classified in classes other than this class. Includes Sidecars; Tricycles. Excludes Children's Wheeled Goods.	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
-\N	Cat	2350	FSC	0	Combat, Assault, and Tactical Vehicles, Tracked	Combat, Assault, and Tactical Vehicles, Tracked	Note-This class includes only complete combat, assault, and tactical tracked vehicles, and chassis. Any end items, assemblies, parts, attachments, or accessories, other than complete chassis, for use in or on such vehicles are classified in classes other than this class. Includes Tanks and Tracked Self-Propelled Weapons and Vehicles with or without amphibian capabilities; Armored Halftracks; Self-Propelled Sleds; and Self-Propelled Flame Throwers. Excludes Wheel Mounted Vehicles.	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
-\N	Cat	2410	FSC	0	Tractor, Full Tracked, Low Speed	Tractor, Full Tracked, Low Speed	Note-This class includes only complete low speed, full track tractors, and chassis. Any end items, assemblies, parts, attachments, or accessories, other than complete chassis, for use in or on low speed, full track tractors, are classified in classes other than this class.  Excludes High Speed Tractors (FSC 2430); Armored Dozer-Scrapper Combination Tractors (FSC 2350).	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
-\N	Cat	2420	FSC	0	Tractors, Wheeled	Tractors, Wheeled	Note-This class includes only complete wheeled tractors, and chassis. Any end items, assemblies, parts, attachments, or accessories, other than complete chassis, for use in or on wheeled tractors, are classified in classes other than this class. Includes Agricultural Tractors; High Speed Tractors; Industrial Tractors. Excludes Aircraft Towing Tractors and Crashed Aircraft Moving Tractors (FSC 1740); Aircraft Towing-Power Servicing Tractors (FSC 1730); Warehouse Tractors (FSC 3930).	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
-\N	Cat	2430	FSC	0	Tractors, Full Tracked, High Speed	Tractors, Full Tracked, High Speed	Note-This class includes only complete high speed track laying tractors, and chassis. Any end items, assemblies, parts, attachments, or accessories, other than complete chassis, for use in or on high speed track laying tractors, are classified in classes other than this class.  Excludes Low Speed Tractor (FSC 2410); Armored Dozer-Scraper Combination Tractors (FSC 2350).	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
-\N	Cat	2510	FSC	0	Vehicular Cab, Body, and Frame Structural Components	Vehicular Cab, Body, and Frame Structural Components	 Includes Leaf Type Vehicular Springs; Suspension Type Shock Absorbers. Excludes Vehicular Hardware (FSG 53); Specialized Vehicular Furniture (FSC 2540).	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
-\N	Cat	2520	FSC	0	Vehicular Power Transmission Components	Vehicular Power Transmission Components	 Includes Transfer Transmission Assemblies; Clutch Assemblies; Universal Joints; Propeller Shafts; Automotive Torque Converters; Power Takeoffs. 	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
-\N	Cat	2530	FSC	0	Vehicular Brake, Steering, Axle, Wheel, and Track Components.	Vehicular Brake, Steering, Axle, Wheel, and Track Components.	 Includes Turrent Brakes; Clutch Brakes, Tank Turret. 	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
-\N	Cat	2540	FSC	0	Vehicular Furniture and Accessories	Vehicular Furniture and Accessories	 Includes Automobile Seat Covers; Shock Absorbers; Bumpers; Windshield Wipers; Bumper Guards; Mirrors, Rear View and Side View; Vehicle Heaters. Excludes Speedometers (FSC 6680); Suspension Type Shock Absorbers (FSC 2510).	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
-\N	Cat	2541	FSC	0	Weapons Systems Specific Vehicular Accessories	Weapons Systems Specific Vehicular Accessories	 Includes: Accessory Kits and Boxes, Parts Kits, and individual components used in the repair and/or modification of Weapons System type Vehicles such as Tanks, Personnel Carriers, Mobile Howitzers, and the like. Excludes: Items used in the repair and/or modifications of Commercial Type Vehicles (FSC 2540), vehicular type light fixtures (FSC 6220), and electronic switches, parts kits, and modification kits (FSG 59).	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
-\N	Cat	2590	FSC	0	Miscellaneous Vehicular Components	Miscellaneous Vehicular Components	 Includes Attachments for Tanks, Self-propelled Weapons, and High Speed Tractors; A-frames and Winches specifically designed for truck mounting; Cranes and Crane Booms for Wrecker Trucks. 	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
-\N	Cat	2610	FSC	0	Tires and Tubes, Pneumatic, Except Aircraft	Tires and Tubes, Pneumatic, Except Aircraft	  Excludes Aircraft Pneumatic Tires and Tubes.	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
-\N	Cat	2620	FSC	0	Tires and Tubes, Pneumatic, Aircraft	Tires and Tubes, Pneumatic, Aircraft	  	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
-\N	Cat	2630	FSC	0	Tires, Solid and Cushion	Tires, Solid and Cushion	 Includes Rubber Track Laying Treads. 	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
-\N	Cat	2640	FSC	0	Tire Rebuilding and Tire and Tube Repair Materials	Tire Rebuilding and Tire and Tube Repair Materials	 Includes Tread Gum; Cold Patches; Friction Cord Fabric; Vulcanizing Patches; Padding Stock; Quick-Cure Gum; Tire and Tube Repair Kits; Camelback; Valves; Valve Cores. Excludes Vulcanizing Machinery and Equipment.	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
-\N	Cat	2805	FSC	0	Gasoline Reciprocating Engines, Except Aircraft; and Components	Gasoline Reciprocating Engines, Except Aircraft; and Components	 Includes Gas Reciprocating Engines; All Gasoline Reciprocating Engines except Aircraft Prime Moving. Excludes Engine Accessories (FSC 2990).	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
-\N	Cat	2810	FSC	0	Gasoline Reciprocating Engines, Aircraft Prime Mover; and Components	Gasoline Reciprocating Engines, Aircraft Prime Mover; and Components	Note Engines and components classified in this FSC must be desinged specifically for use as/on an aircraft prime mover. Auxiliary engines and their components will be classified in the appropriate FSC elsewhere in FSG 28. Includes Complete Engine Assemblies; Piston Rings; Cylinders; Pistons; Camshafts; Crankshafts. Excludes Fuel System Components (Carburetors; Carburetor Floats; Fuel Pumps; Fuel Controls; Fuel Valves) (FSC 2915); Electrical System Components (Spark Plug Adapters; Ignition Distributors; Ignition Coils, Electrical Starters) (FSC 2925); Engine Cooling System Components (Engine Oil Coolers; Cooling Radiators) (FSC 2935); Engine Air/Oil Cleaners/Filters/Strainers (FSC 2945); Miscellaneous Engine Accessories (Pneumatic Starters, Cowling Mounts, Control Assemblies) (FSC 2995).	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
-\N	Cat	2815	FSC	0	Diesel Engines and Components	Diesel Engines and Components	 Includes Automotive, Industrial, Marine, Locomotive, and all other types of Diesel and Semi-Diesel Engines. Excludes Engines Accessories (FSC 2990).	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
-\N	Cat	2820	FSC	0	Steam Engines, Reciprocating; and Components	Steam Engines, Reciprocating; and Components	  	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
-\N	Cat	2825	FSC	0	Steam Turbines and Components	Steam Turbines and Components	 Includes Mercury Vapor Turbines. 	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
-\N	Cat	2830	FSC	0	Water Turbines and Water Wheels; and Components	Water Turbines and Water Wheels; and Components	  	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
-\N	Cat	2835	FSC	0	Gas Turbines and Jet Engines; Non-Aircraft Prime Mover, Aircraft Non-Prime Mover, and Components	Gas Turbines and Jet Engines; Non-Aircraft Prime Mover, Aircraft Non-Prime Mover, and Components	Note Engines and Components classified in this FSC are primarily for use on non-aircraft prime mover (e.g., Naval ship applications), aircraft non-prime mover (e.g., airframe mounted auxiliary power units), and for aircraft ground support equipment (e.g., start carts). Includes Airflow Deflectors; Combustion Chambers, Compressors, Turbines, Accessory Gear Boxes and their Components. Excludes Components for Gas Turbines and Jet Engines, Aircraft Prime Mover (FSC 2840); Engine Fuel Systems (FSC 2910); Engine Electrical Systems (FSC 2920); Engine Cooling Systems (FSC 2930); Engine Air/Oil Cleaners/Filters/Strainers (FSC 2940); Engine Accessories (Air Duct Heaters, Engine Mounted Control Assemblies) (FSC 2990).	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
-\N	Cat	2840	FSC	0	Gas Turbines and Jet Engines, Aircraft, Prime Moving; and Components	Gas Turbines and Jet Engines, Aircraft, Prime Moving; and Components	Note Engines and Components classified in this FSC are intended for use as/on aircraft and/or guided missile prime movers. Includes Compressor and Turbine Rotors; Blades; Combustion Chamber; Accessory Gear Box; Afterburner; Exhaust Cone; Reservoirs, Hydraulic; Tank, Oil. Excludes Oil, Air, Anti-icing, and Hydraulic Regulators, Valves, and Pumps specially designed for Gas Turbines and Jet Engines (FSC 2995); Control Assemblies, Push-Pull (FSC 2995); Engine Mounted Control Assemblies (FSC 2995); Fuel System Components (FSC 2915); Engine Electrical System Components (FSC 2925); Engine Cooling System Components (FSC 2935); Engine Air/Oil Cleaner/Filter/Strainers (FSC 2945).	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
-\N	Cat	2845	FSC	0	Rocket Engines and Components	Rocket Engines and Components	 Includes Rocket Prime Movers, Liquid Type, including Liquid Jet Assisted Take Off (JATO) Units, for use in aircraft, rockets, and guided missiles; Liquid Propellants encased in consumable containers, intended for insertion into missile propulsion systems as integral parts. Excludes Rocket Motors - Solid Propellant Units (FSC 1337); Liquid Propellants predetermined to specific quantity and quality, but packaged in reusable containers; Solid Propellant Squibs and Cartridges, whether intended for insertion into Liquid Propellent Systems or not (FSC 1337).	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
-\N	Cat	2850	FSC	0	Gasoline Rotary Engines and Components	Gasoline Rotary Engines and Components	  	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
-\N	Cat	2895	FSC	0	Miscellaneous Engines and Components	Miscellaneous Engines and Components	 Includes Wind and Compressed Air Engines. 	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
-\N	Cat	2910	FSC	0	Engine Fuel System Components, Nonaircraft	Engine Fuel System Components, Nonaircraft	 Includes Carburetors; Fuel Pumps; Engine Fuel Filters; Fuel Tanks; Components for all engines except Aircraft and Guided Missile Prime Moving. 	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
-\N	Cat	2915	FSC	0	Engine Fuel System Components, Aircraft and Missile Prime Movers	Engine Fuel System Components, Aircraft and Missile Prime Movers	Note Fuel components specially designed for propulsion fuel systems, aircraft and missiles are to be placed in this FSC. Includes Carburetors; Fuel Pumps; Engine Fuel Filters; Fuel Controls, Jet Engine; Fuel Primers; Water Injection Controls and Valves; Fuel Valves Fuel Flow Regulators; Components of Smoke Abatement Systems. Excludes Aircraft Fuel Tanks (FSC 1560); In-flight Refueling System Fuel Components (FSC 1680). Fuel System Components not specifically designed for use with Aircraft Engines or Missile Prime-movers.	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
-\N	Cat	2920	FSC	0	Engine Electrical System Components, Nonaircraft	Engine Electrical System Components, Nonaircraft	 Includes Generators; Magnetos; Spark Plugs; Ignition Coils; Ignition Distributors; Engine Voltage Regulators; Ignition Harness Assemblies; Starting Motors for Engines. Excludes Vehicular Lighting Fixtures (FSC 6220) and Aircraft Generators (FSC 2925).	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
-\N	Cat	2925	FSC	0	Engine Electrical System Components, Aircraft Prime Moving	Engine Electrical System Components, Aircraft Prime Moving	Note Items designed for specific use on aircraft and guided missile prime movers are to be placed in this FSC. Includes Magnetos; Igniters (Spark Plugs); Ignition Coils; Ignition Distributors; Engine Voltage Regulators; Ignition Harness Assemblies; Starting Motors for Engines; Engine Accessory Generators. Excludes Aircraft Lighting Fixtures (FSC 6220); Auxiliary Aircraft Generators (FSC 6115).	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
-\N	Cat	2930	FSC	0	Engine Cooling System Components, Nonaircraft	Engine Cooling System Components, Nonaircraft	 Includes Cooling Fans; Radiators; Water Pumps; Water Hose Assemblies; Engine Coolant Filters; Components for all Engines except Aircraft and Guided Missile Prime Moving. 	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
-\N	Cat	2935	FSC	0	Engine System Cooling Components, Aircraft Prime Moving	Engine System Cooling Components, Aircraft Prime Moving	Note This class includes only cooling system components for aircraft and/or guided missile prime movers only. Includes Radiators; Cooling System Pumps; Water Hose Assemblies; Lubricating Oil Coolers and Control Valves; Oil Temperature Regulators. Excludes Cooling System Components not specifically designed for use with Aircraft Engines.	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
-\N	Cat	2940	FSC	0	Engine Air and Oil Filters, Strainers, and Cleaners, Nonaircraft	Engine Air and Oil Filters, Strainers, and Cleaners, Nonaircraft	 Includes Components for all Engines except Aircraft and Guided Missile Prime Moving. Excludes Air and Oil Filters (FSC 4310, 4330), Strainers (FSC 4730) and Cleaners (FSC 4310) not specifically designed for use with engines.	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
-\N	Cat	2945	FSC	0	Engine Air and Oil Filters, Cleaners, Aircraft Prime Moving	Engine Air and Oil Filters, Cleaners, Aircraft Prime Moving	Note Items placed in this FSC should be specifically designed for use on aircraft or guided missile prime movers only. Includes Air Filters; Oil Filters; Strainers; Cleaners. Excludes Fuel Filters (FSC 2915); Items designed for other than Engines.	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
-\N	Cat	2950	FSC	0	Turbosupercharger and components	Turbosupercharger and components	Note All turbosuperchargers and their components not elsewhere classifiable will be classified in this FSC. Includes Turbosupercharged Regulators; Engine Turbosuperchargers. Excludes Engine Integrated Superchargers (FSG 28).	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
-\N	Cat	2990	FSC	0	Miscellaneous Engine Accessories, Nonaircraft	Miscellaneous Engine Accessories, Nonaircraft	 Includes Engine Dynafocal Suspension Mounts; Engine Driven Superchargers (not integrated with engine); Starter Cranks; Engine Starter Ropes; Exhaust Mufflers; Hand Inertia Starters; Air Duck Heaters; Engine Governors; Intake Mufflers; Combustion Type Starters; Miscellaneous Accessories for all Engines except Aircraft and Guided Missile Prime Moving. Excludes Electrical Starters Non-Aircraft (FSC 2920); Aircraft (FSC 2925).	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
-\N	Cat	2995	FSC	0	Miscellaneous Engine Accessories, Aircraft	Miscellaneous Engine Accessories, Aircraft	Note Items classified in this class must be specifically designed for use with aircraft or quided missile primemovers only. Includes Engine Dynafocal Suspension Mounts; Engine Cowling Mounts; Engine Mounted Control Assemblies; Pneumatic Starters; Push-Pull Control Assemblies;Specially designed Jet Engine Air, Oil, Anti-icing and Hydraulic Regulators; Valves and Pumps; Starting Units. Excludes Exhaust System; (FSC 1560); Jet Engine Hydraulic Reservoirs (FSC 2840); Jet Engine Oil Tanks (FSC 2840); Electrical Starters (FSC 2925); Cockpit Mounted Control Quadrants (FSC 1680); Aircraft Engine Covers (FSC 1730).	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
-\N	Cat	3010	FSC	0	Torque Converters and Speed Changers	Torque Converters and Speed Changers	 Includes Fluid Couplings; Nonvehicular Clutches and Couplings; Horizontal Right Angle Drive Gear Units. Excludes Automotive Torque Converters (FSC 2520); Vehicular Power Transmission Components (FSC 2520); Rotary Aircraft Transmission Gear Units (FSC 1615).	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
-\N	Cat	3020	FSC	0	Gears, Pulleys, Sprockets, and Transmission Chain	Gears, Pulleys, Sprockets, and Transmission Chain	 Includes Power Transmission Chain; Matched Gear Sets. Excludes Reduction Gears (FSC 3010).	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
-\N	Cat	3030	FSC	0	Belting, Drive Belts, Fan Belts, and Accessories	Belting, Drive Belts, Fan Belts, and Accessories	 Includes Belt Lacings; Belt Pins. 	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
-\N	Cat	3040	FSC	0	Miscellaneous Power Transmission Equipment	Miscellaneous Power Transmission Equipment	 Includes Shafts and Shafting; Collars; Gearshafts; Ball Joints; Actuating Cylinders. 	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
-\N	Cat	3110	FSC	0	Bearings, Antifriction, Unmounted	Bearings, Antifriction, Unmounted	Note This class includes bearings that generally have roller or balls confined by an inner and outer ring to relieve friction in/on/around rotating/moving mechanisms. Includes Ball Bearings; Roller Bearings; Balls; Races. Excludes Plain Bearings (FSC 3120); Jewel Bearings (FSC 3120)	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
-\N	Cat	3120	FSC	0	Bearings, Plain, Unmounted	Bearings, Plain, Unmounted	Note Bearings in this class are generally one piece that retain and position moving and/or rotating parts. They may have lubrication grooves/fittings/facilities or include pre-lubrication. Includes Sleeve Bearings; Split Bearings; Washer Type Bearings; Jewel Bearings. Excludes Antifriction Bearings (FSC 3110); Mounted Bearings (FSC 3130).	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
-\N	Cat	3130	FSC	0	Bearings, Mounted	Bearings, Mounted	Note This class includes bearings that generally have roller or balls confined by an inner and outer ring to relieve friction in/on/around rotating/moving mechanisms. Includes Pillow Block Units; Cartridge Units; Flange Units; Takeup Units; Hanger Box Units; Flat Box Units; Step Box Units. Excludes Antifriction Bearings (FSC 3110); Plain Unmounted Bearings (FSC 3120).	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
-\N	Cat	3210	FSC	0	Sawmill and Planing Mill Machinery	Sawmill and Planing Mill Machinery	  	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
-\N	Cat	3220	FSC	0	Woodworking Machines	Woodworking Machines	 Includes Mortisers; Tenoners; Veneer Lathes. Excludes Hand Held Power Driven Tools; Hand Held Tools Operated by Flexible Shaft.	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
-\N	Cat	3230	FSC	0	Tools and Attachments for Woodworking Machinery	Tools and Attachments for Woodworking Machinery	 Includes Circular and Band Saw Blades; Cutter Heads; Jointer and Notcher Heads; Cutters. Excludes Head Turning Tools.	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
-\N	Cat	3405	FSC	0	Saws and Filing Machines	Saws and Filing Machines	 Includes Cutoff Machines; Saw Blade Dressing Machines; Retoothing Machines. 	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
-\N	Cat	3408	FSC	0	Machining Centers and Way-Type Machines	Machining Centers and Way-Type Machines	Note-The following definitions apply to "Machining Centers" and "Way-type Machines".  a. "Machining Center", refers to a multipurpose numerically controlled machine tool for the complete and automatic machining of parts requiring multiple operations such as milling, drilling, tapping, boring, and reaming, having an integral tool storage device and an integral means for positioning various faces of the work piece. It must have facilities for automatic interchanging of varied cutting tools between successive operations. Excluded from this class are multipurpose numerically controlled machine tools, such as Boring-Drilling-Milling Machines, which require the use of an attachment or accessory for tool storage and/or to position the various faces of a work piece. These types of equipment are classified in other appropriate classes within group 34.  b. "Way-type Machine", refers to a special machine tool of station type design consisting of individually mounted self-contained machining units and facilities for indexing the work piece to each station in a predetermined sequence. The machining unit(s) may be disassembled and rearranged to accommodate different work piece configurations. Machine is capable of performing single or multiple operations on the work piece simultaneously or in sequence to each station.  	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
-\N	Cat	3410	FSC	0	Electrical and Ultrasonic Erosion Machines	Electrical and Ultrasonic Erosion Machines	 Includes Electrical Discharge Machines; Electrolytic Grinding Machines. 	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
-\N	Cat	3411	FSC	0	Boring Machines	Boring Machines	  	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
-\N	Cat	3412	FSC	0	Broaching Machines	Broaching Machines	  	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
-\N	Cat	3413	FSC	0	Drilling and Tapping Machines	Drilling and Tapping Machines	 Includes Multiple Spindle Drilling-Tapping Machines. Excludes Way-Type Machines.	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
-\N	Cat	3414	FSC	0	Gear Cutting and Finishing Machines.	Gear Cutting and Finishing Machines.	  	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
-\N	Cat	3415	FSC	0	Grinding Machines	Grinding Machines	  Excludes Electrolytic Grinding Machines.	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
-\N	Cat	3416	FSC	0	Lathes	Lathes	 Includes Screw Machines Excludes Speed Lathes; Metal Spinning Lathes; Cartridge Case and Shell Lathes.	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
-\N	Cat	3417	FSC	0	Milling Machines	Milling Machines	  	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
-\N	Cat	3418	FSC	0	Planers and Shapers	Planers and Shapers	 Includes Combination Shaper-Planers. Excludes Gear Shapers; Planer Type Milling Machines.	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
-\N	Cat	3419	FSC	0	Miscellaneous Machine Tools	Miscellaneous Machine Tools	 Includes Gun Rifling Machines; Speed Lathes. 	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
-\N	Cat	3422	FSC	0	Rolling Mills and Drawing Machines	Rolling Mills and Drawing Machines	  	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
-\N	Cat	3424	FSC	0	Metal Heat Treating and Non-Thermal Treating Equipment	Metal Heat Treating and Non-Thermal Treating Equipment	 Includes Hardening, Annealing, Tempering, Normalizing, Cyaniding, and Carburizing Equipment; Furnaces, Flue Welding, Non-Thermal Stress Relieving Systems. 	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
-\N	Cat	3426	FSC	0	Metal Finishing Equipment	Metal Finishing Equipment	 Includes Galvanizing, Tinning, Oiling, Pickling; Electroplating, and Anodizing Equipment. 	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
-\N	Cat	3431	FSC	0	Electric Arc Welding Equipment	Electric Arc Welding Equipment	 Includes Gas Shielded Arc Welding Machines; Arc Bonding Machines; Semi-Automatic and Automatic Arc Welding Machines. Excludes Welding Supplies, and Associated Equipment such as: Flux Recovery Mchines; Flux Dispensers; Tacker Panels; Welding Panels.	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
-\N	Cat	3432	FSC	0	Electric Resistance Welding Equipment	Electric Resistance Welding Equipment	 Includes Electric Resistance Brazing Machines; Band Saw Brazers; Stored Energy Resistance Welding Machines. Excludes Electric Induction Brazing and Soldering Machines.	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
-\N	Cat	3433	FSC	0	Gas Welding, Heat Cutting, and Metalizing Equipment	Gas Welding, Heat Cutting, and Metalizing Equipment	 Includes Metal Spray Guns; Arc Cutting Machines; Torches and Tips; Gas Brazing Machines; Flame Cutting Machines; Vacuum Metalizers; Spark Discharge Metalizers. Excludes Welding Supplies; Disintegrating Machines.	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
-\N	Cat	3436	FSC	0	Welding Positioners and Manipulators	Welding Positioners and Manipulators	 Includes Welding Tables. 	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
-\N	Cat	3438	FSC	0	Miscellaneous Welding Equipment	Miscellaneous Welding Equipment	 Includes Thermite Welding Equipment; Flux Recovery Machines; Flux Dispensers; Arc Converters; Welding Panels. 	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
-\N	Cat	3439	FSC	0	Miscellaneous Welding, Soldering, and Brazing Supplies and Accessories	Miscellaneous Welding, Soldering, and Brazing Supplies and Accessories	 Includes Soldering Irons; Welding Electrodes and Rods; Brazing Fluxes; Soldering Fluxes; Solder. 	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
-\N	Cat	3441	FSC	0	Bending and Forming Machines	Bending and Forming Machines	  Excludes Wire and Metal Ribbon Forming Machines.	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
-\N	Cat	3442	FSC	0	Hydraulic and Pneumatic Presses, Power Driven	Hydraulic and Pneumatic Presses, Power Driven	 Includes Metal Powder Compacting Presses. 	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
-\N	Cat	3443	FSC	0	Mechanical Presses, Power Driven	Mechanical Presses, Power Driven	 Includes Metal Powder Compacting Presses. 	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
-\N	Cat	3444	FSC	0	Manual Presses	Manual Presses	 Includes Arbor, Straightening, Forcing, and Assembly Presses. 	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
-\N	Cat	3445	FSC	0	Punching and Shearing Machines	Punching and Shearing Machines	  	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
-\N	Cat	3446	FSC	0	Forging Machinery and Hammers	Forging Machinery and Hammers	  Excludes Forging Presses.	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
-\N	Cat	3447	FSC	0	Wire and Metal Ribbon Forming Machines	Wire and Metal Ribbon Forming Machines	  Excludes Roll Forming Machines.	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
-\N	Cat	3448	FSC	0	Riveting Machines	Riveting Machines	  Excludes Power Driven Hand Riveting Machines.	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
-\N	Cat	3449	FSC	0	Miscellaneous Secondary Metal Forming and Cutting Machines	Miscellaneous Secondary Metal Forming and Cutting Machines	 Includes Metal Spinning Lathes. 	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
-\N	Cat	3450	FSC	0	Machine Tools, Portable	Machine Tools, Portable	 Includes Portable Abrasive Cutting Machines; Portable Drilling Machines; Portable Slotters and Shapers. Excludes Stationary Type Machine Tools mounted on portable devices such as wheel or leg type stands.	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
-\N	Cat	3455	FSC	0	Cutting Tools for Machine Tools	Cutting Tools for Machine Tools	 Includes Broaches; Files; Milling Cutters; Reamers; Saws. Excludes Flame Cutting Tools.	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
-\N	Cat	3456	FSC	0	Cutting and Forming Tools for Secondary Metalworking Machinery	Cutting and Forming Tools for Secondary Metalworking Machinery	  	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
-\N	Cat	3460	FSC	0	Machine Tool accessories	Machine Tool accessories	  Excludes Abrasive Wheels, Cones, and other Abrasive Attachments for use only on Hand Held Power Tools.	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
-\N	Cat	3461	FSC	0	Accessories for Secondary Metalworking Machinery	Accessories for Secondary Metalworking Machinery	  Excludes Parts Feeders.	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
-\N	Cat	3465	FSC	0	Production Jigs, Fixtures, and Templates	Production Jigs, Fixtures, and Templates	Note-This class includes jigs, fixtures, and templates used in conjection with the metalworking machinery classified in Group 34. Jigs, fixtures, and templates used in conjunction with maintenance and repair shop specialized equipment are classified in Group 49.  	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
-\N	Cat	3470	FSC	0	Machine Shop Sets, Kits, and Outfits	Machine Shop Sets, Kits, and Outfits	  	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
-\N	Cat	3510	FSC	0	Laundry and Dry Cleaning Equipment	Laundry and Dry Cleaning Equipment	 Includes Washing Machines; Extractors; Wringers; Drying Tumblers; Ironers; Presses; Starching Machines; Marking Equipment; Mobile Laundry and Dry Cleaning Units. 	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
-\N	Cat	3520	FSC	0	Shoe Repairing Equipment	Shoe Repairing Equipment	 Includes Shoe Sewing Machines; Mobile Shoe Repair Shops. 	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
-\N	Cat	3530	FSC	0	Industrial Sewing Machines and Mobile Textile Repair Shops	Industrial Sewing Machines and Mobile Textile Repair Shops	  Excludes Shoe Sewing Machines.	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
-\N	Cat	3540	FSC	0	Wrapping and Packaging Machinery	Wrapping and Packaging Machinery	 Includes Filling Machines; Container Capping Machines; Label Applying Machines; Package Sealing Machines; Paperboard Box, Case and Tray Making Machines; Strapping Machines; Stapling Machines, except Office Type. Excludes Paperboard Manufacturing Machinery.	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
-\N	Cat	3550	FSC	0	Vending and Coin Operated Machines	Vending and Coin Operated Machines	 Includes Fare Recording Devices; Parking Meters; Turnstiles; Coin Operated Phonographs. Excludes Coin and Currency Handling Machines; Coin Operated Scales.	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
-\N	Cat	3590	FSC	0	Miscellaneous Service and Trade Equipment	Miscellaneous Service and Trade Equipment	 Includes Manicure Tables. 	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
-\N	Cat	3605	FSC	0	Food Products Machinery and Equipment	Food Products Machinery and Equipment	 Includes Industrial Food Products Equipment. Excludes Kitchen and Galley Equipment.	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
-\N	Cat	3610	FSC	0	Printing, Duplicating, and Bookbinding Equipment	Printing, Duplicating, and Bookbinding Equipment	 Includes Offset Presses; Typesetting Machinery; Bookbinding Machinery; Photoengraving Machinery; Printing Type; Rules; Leads; Slugs; Line Gages; Quoins; Plate Hooks; Gelatine Process Machines; Spirit Process Machines; Stencil Process Machines; Offset Process Machines; Photostat Machines; Blueprint Printing and Developing Machines; Print Shop Furniture. Excludes Microfilm Machines.	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
-\N	Cat	3611	FSC	0	Industrial Marking Machines	Industrial Marking Machines	Note-Marking machines which make permanent indentations in metal are classified in Group 34.  Excludes Marking Machines, Laundry; Printing Machine, Label; Printing Press, Label; Embossing Machines, Office Type; and Marking Machines, Office Type.	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
-\N	Cat	3615	FSC	0	Pulp and Paper Industries Machinery	Pulp and Paper Industries Machinery	 Includes Chippers; Digestors; Beaters; Bleaching Equipment; Paperboard Manufacturing Machinery. Excludes Paperboard Box, Case and Tray Making Machines.	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
-\N	Cat	3620	FSC	0	Rubber and Plastics Working Machinery	Rubber and Plastics Working Machinery	 Includes Plasticators; Presses; Synthetic Rubber Working Machinery; Thread Extruding Machinery; Vulcanizing Machinery. Excludes Protective Covering Laminating Presses; Tire Maintenance and Repair Equipment.	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
-\N	Cat	3625	FSC	0	Textile Industries Machinery	Textile Industries Machinery	 Includes Cotton Ginning Machinery; Looms; Button Covering Machines; Rope Laying Machines; Lace Machines. 	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
-\N	Cat	3630	FSC	0	Clay and Concrete Products Industries Machinery	Clay and Concrete Products Industries Machinery	 Includes Brickmaking Machinery. 	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
-\N	Cat	3635	FSC	0	Crystal and Glass Industries Machinery	Crystal and Glass Industries Machinery	 Includes Optical Goods Manufacturing Machinery. Excludes Ophthalmic Lens Cutting, Drilling, Edging, and Grinding Machines; Specialized Semiconductor, Microcircuit, and Printed Circuit Board Manufacturing Machinery.	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
-\N	Cat	3640	FSC	0	Tobacco Manufacturing Machinery	Tobacco Manufacturing Machinery	  	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
-\N	Cat	3645	FSC	0	Leather Tanning and Leather Working Industries Machinery	Leather Tanning and Leather Working Industries Machinery	  	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
-\N	Cat	3650	FSC	0	Chemical and Pharmaceutical Products Manufacturing Machinery	Chemical and Pharmaceutical Products Manufacturing Machinery	 Includes Crushers and Mills for Chemical Materials; Pharmaceutical Briquetting and Tabletting Presses; Chemical Explosive Manufacturing Machinery. Excludes Construction Materials Crushers, Mills and Pulverizers; Plastic Products Manufacturing Machinery; Pharmaceutical Products Wrapping and Packaging Machinery; Laboratory and Shop Type Mills and Mixers.	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
-\N	Cat	3655	FSC	0	Gas Generating and Dispensing Systems, Fixed or Mobile	Gas Generating and Dispensing Systems, Fixed or Mobile	Note-Included in this class are gaseous dispensing systems, both mobile and installed. Includes liquefied gaseous storage tanks, mounted on a common base with, or integral to, gas generating equipment included in this class. Also includes those liquefied gaseous storage tanks, either trailer mounted or skid mounted, used to store liquefied gaseous products until needed. Excluded from this class are those storage tanks designed to be used as an integral part of guided missile propellant servicing trailers, rocket power plants or test stations, and aircraft oxygen converters which are classified as specified by the indexes and structure of the FSC.  Excludes Meteorological Equipment.	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
-\N	Cat	3660	FSC	0	Industrial Size Reduction Machinery	Industrial Size Reduction Machinery	Note-This class includes general use machinery related to two or more manufacturing industries.  Excludes Chemical Products and Construction and Mining Type Crushing, Pulverizing, Screening and Mixing Machinery; Maintenance and Repair Shop Type Mixers.	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
-\N	Cat	3670	FSC	0	Specialized Semiconductor, Microcircuit, and Printed Circuit Board Manufacturing Machinery	Specialized Semiconductor, Microcircuit, and Printed Circuit Board Manufacturing Machinery	Note-This class includes, and is restricted to, equipment specifically designed for manufacturing semiconductor devices (FSC 5961), microcircuits (FSC 5962), and printed circuit boards (FSC 5998). Excludes items for which more suitable classes are specifically prescribed by the indexes and structure of the FSC. Includes Substrate Preparation Equipment; Circuit Pattern Forming Equipment; Interconnecting and Packaging Equipment. Excludes Assembly Machines for Mounting Discrete Components on Printed Wiring Boards.	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
-\N	Cat	3680	FSC	0	Foundry Machinery, Related Equipment and Supplies	Foundry Machinery, Related Equipment and Supplies	 Includes Molding Machines; Tumbling Mills, Foundry Dextrine; Core Paste. Excludes Crucible Furnaces; Cupola Furnaces; Foundry Hand Tools.	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
-\N	Cat	3685	FSC	0	Specialized Metal Container Manufacturing Machinery and Related Equipment	Specialized Metal Container Manufacturing Machinery and Related Equipment	Note-This class includes only those machines specifically designed for manufacturing metal containers. Closing machines designed to seam the tops of filled containers will be classified in Class 3540. Includes Drum and Jerrican Manufacturing Machinery; Specially Designed Container Leak Testing Machines; Can Making Machinery. 	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
-\N	Cat	3690	FSC	0	Specialized Ammunition and Ordnance Machinery and Related Equipment	Specialized Ammunition and Ordnance Machinery and Related Equipment	 Includes Ammunition and Explosive Loading (Filling and Assembling) Specialized Machinery; Small Arms Ammunition Manufacturing Machinery; Artillery and Anti-Aircraft Shell Manufacturing Machinery. Excludes Ammunition and Weapons Maintenance and Repair Shop Specialized Equipment; Nonspecialized or Standard Machinery not designed exclusively for manufacturing or assembling ammunition and ordnance equipment.	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
-\N	Cat	3693	FSC	0	Industrial Assembly Machines	Industrial Assembly Machines	Note-This class includes equipment specifically designed to assemble prefabricated components without further design machining of the components. Equipment designed to perform combined machining and assembling operations which result in material removal are classified in classes other than this class. Also excluded are items for which more specific classifications are suitable. Includes Industrial Production Type Power Screwdriving Machines; Circuit Card Assembly Machines. Excludes Specialized Ammunition and Ordnance Assembly Machines; Wrapping and Packaging Machinery; Metalworking Machinery; Hand Tools.	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
-\N	Cat	3694	FSC	0	Clean Work Stations, Controlled Environment, and Related Equipment	Clean Work Stations, Controlled Environment, and Related Equipment	 Includes Laminar and Nonlaminar Flow Enclosures; Dust Controlled Facilities; Air Showers. 	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
-\N	Cat	3695	FSC	0	Miscellaneous Special Industry Machinery	Miscellaneous Special Industry Machinery	 Includes Communication Wire Dispenser Fabricating Machinery; Specialized Logging Equipment; Petroleum Refinery Machinery; Shoemaking Machinery; Production Type Impregnating Equipment. Excludes Opthalmic Lens Cutting and Grinding Machinery; Clothing Impregnating Equipment.	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
-\N	Cat	3710	FSC	0	Soil Preparation Equipment	Soil Preparation Equipment	 Includes Harrows; Plows; Seed Drills; Seeder Attachments; Sprayers. 	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
-\N	Cat	3720	FSC	0	Harvesting Equipment	Harvesting Equipment	 Includes Hayrakers; Mowers. Excludes Mower Attachments (FSC 3750); Sickle Bar Attachments (FSC 3750).	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
-\N	Cat	3730	FSC	0	Dairy, Poultry, and Livestock Equipment	Dairy, Poultry, and Livestock Equipment	  	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
-\N	Cat	3740	FSC	0	Pest, Disease, and Frost Control Equipment	Pest, Disease, and Frost Control Equipment	 Includes Atomizers; Delousing Outfits; Dusters; Fly Swatters; Flypaper; Fog Generators; Sprayers; Traps. Excludes Self Pressurized Spray Kits (FSC 4940).	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
-\N	Cat	3750	FSC	0	Gardening Implements and Tools	Gardening Implements and Tools	 Includes Garden Tractors, Walking Type; Lawn Mowers, Powered and Nonpowered; Hedge Trimers; Lawn Seeders; Fertilizer Spreaders; Gardening Rakes, Forks, Hoes, and Other Gardening Tools. 	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
-\N	Cat	3770	FSC	0	Saddlery, Harness, Whips, and Related Animal Furnishings	Saddlery, Harness, Whips, and Related Animal Furnishings	 Includes Dog Harnesses; Leads. 	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
-\N	Cat	3805	FSC	0	Earth Moving and Excavating Equipment	Earth Moving and Excavating Equipment	 Includes Scrapers; Ditchers; Loaders; Graders; Special Construction Type Earth and Rock Hauling Trucks and Trailers; Special Individual Work and Power Sections of Construction Equipment with a quick connect/disconnect capability. The Power Section is designed to be coupled with a Work Section to form a functional piece of Construction Equipment. Excludes Standard Tractors (FSG 24); Trailers (FSC 2330); Trucks (FSC 2320).	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
-\N	Cat	3810	FSC	0	Cranes and Crane-Shovels	Cranes and Crane-Shovels	 Includes Cranes; Crane-Semitractors; Crane-Shovels; Crane-Tractors. Excludes Barge Mounted Cranes (FSC 1935); Locomotive Cranes (FSC 2230).	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
-\N	Cat	3815	FSC	0	Crane and Crane-Shovel Attachments	Crane and Crane-Shovel Attachments	 Includes Backhoes; Buckets; Dippers; Fairleads; Gantries; Grapples; Lifting Magnets; Shovels; Wrecking Balls. 	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
-\N	Cat	3820	FSC	0	Mining, Rock Drilling, Earth Boring, and Related Equipment	Mining, Rock Drilling, Earth Boring, and Related Equipment	 Includes Augers; Crushers; Crushing, Screening, and Washing Plants and Units; Drilling Machines; Paving Breakers; Rock Drills. Excludes Tampers (FSC 3895).	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
-\N	Cat	3825	FSC	0	Road Clearing, Cleaning, and Marking Equipment	Road Clearing, Cleaning, and Marking Equipment	 Includes Pavement Scrubbing Machines; Snow Removal Units; Sweepers; Road Marking Machines; Vacuum Cleaners; Water Distributors; Weed Burners. Excludes Standard Tractors with Road Clearing or Cleaning Attachments (FSC 2410, 2420, 2430); Timber Sawing Equipment (FSC 5130, 5110).	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
-\N	Cat	3830	FSC	0	Truck and Tractor Attachments	Truck and Tractor Attachments	 Includes Angledozers; Augers; Backhoes; Bullclams; Bulldozer-Shovels; Cranes; Grubbers; Loaders; Rakes; Rippers; Rollers; Scarifiers; Snow Removal Units; Snowplows; Sweepers; Treedozers. 	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
-\N	Cat	3835	FSC	0	Petroleum Production and Distribution Equipment	Petroleum Production and Distribution Equipment	 Includes Well Heads; Pumping Equipment; Gas Distribution Equipment. 	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
-\N	Cat	3895	FSC	0	Miscellaneous Construction Equipment	Miscellaneous Construction Equipment	 Includes Asphalt Elevators; Asphalt Heaters; Asphalt Kettles; Asphalt Transfer Equipment; Batching Plants; Stabilizing and Compacting Equipment; Concrete Mixers (All Types); Concrete Vibrators; Bituminous and Concrete Pavers; Asphalt Distributors; Sheepfoot Rollers; Rooters; Rippers; Pile Drivers; Bitumen Heaters; Cable Laying, Lashing, Spinning, and Reeling Equipment. Excludes Earth Moving and Excavating Equipment (FSC 3805 & 3810); Pile Driving Attachments for Cranes and Crane-Shovels (FSC 3815); Special Individual Work and Power Sections of Construction Equipment with a quick connect/disconnect capability (FSC 3805).	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
-\N	Cat	3910	FSC	0	Conveyors	Conveyors	 Includes Pneumatic Tube Systems; Portable, Stationary, Powered, and Nonpowered Conveyors; Conveyor Feeders. 	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
-\N	Cat	3915	FSC	0	Materials Feeders	Materials Feeders	Note-Materials Handling equipment included in this class is restricted to those materials feeders and parts feeders that serve as a conveying device, and by which the rate of delivery of bulk materials, packages, or objects may be controlled. Items included in this class are synchronized with companion machinery, feeding predetermined amounts, by volume, of specific materials accurately and continuesly from storage bins or hoppers to process or mixing machines, and are interchangable between machines. Excluded from this class are conveyor feeders (i.e., apron, belt, chain, flight, pan, etc., adapted for feeder service) that are classifiable in Class 3910 and/or Class 3895, as appropriate. Includes Dry Materials Feeders; Parts Feeders Excludes Aggregate and Fines Feeders; Conveyor Feeders; Water Purification Dry Chemical Feeders.	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
-\N	Cat	3920	FSC	0	Material Handling Equipment, Nonself-Propelled	Material Handling Equipment, Nonself-Propelled	 Includes Dolly Trucks; Pushcarts; Handcarts; Wheelbarrows; Hand Trucks; Materials Handling Trailers. Excludes Conveyors.	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
-\N	Cat	3930	FSC	0	Warehouse Trucks and Tractors, Self-Propelled	Warehouse Trucks and Tractors, Self-Propelled	 Includes Tug Jockeys; Fork Lift Trucks; Platform Trucks; Straddle Trucks. 	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
-\N	Cat	3940	FSC	0	Blocks, Tackle, Rigging, and Slings	Blocks, Tackle, Rigging, and Slings	  Excludes Load Chain; Chain and Metal Rope Fittings; Wire Rope; Hoists; Ship Rigging.	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
-\N	Cat	3950	FSC	0	Winches, Hoists, Cranes, and Derricks	Winches, Hoists, Cranes, and Derricks	 Includes Windlasses: Capstans: Ore Bridges: Gypsies: Warehouse Cranes: Wharf Cranes, Mobile or Fixed: Overhead Traveling Cranes. Excludes Crane-Shovels (FSC 3810); Barge Mounted Cranes (FSC 1935); Winches for Integral Mounting on Trucks or Tractors (FSC 3830); Locomotive Cranes (FSC 2230).	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
-\N	Cat	3960	FSC	0	Freight Elevators	Freight Elevators	  	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
-\N	Cat	3990	FSC	0	Miscellaneous Materials Handling Equipment	Miscellaneous Materials Handling Equipment	 Includes Skids; Pallets. Excludes Airfield Engine Transport Skids.	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
-\N	Cat	4010	FSC	0	Chain and Wire Rope	Chain and Wire Rope	Note-Chain and wire rope, with attachments or terminations will be classified in this class when they are for general use. a. Chain is a series of flexible links and/or rings fitted into one another used for supporting, lifting,restraining, dragging, or transmitting power. b. Wire rope is formed from strands of twisted wire. Includes Bead Chain; Weldless Chain; Single Leg Chain Assemblies; Wire Rope; Wire Cord; Single Leg Wire Assemblies. Excludes Power Transmission Chain (FSC 3020); Slings.	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
-\N	Cat	4020	FSC	0	Fiber Rope, Cordage, and Twine	Fiber Rope, Cordage, and Twine	Note-Fiber rope is classified in this class when it is bulk material or for general use. Items with attachments and/or terminations are identified in this class unless a more specific item name is used. a. Fiber rope is flexible twisted strands of manila, nylon or other fiber. b. Cordage is ropes or cords used in rigging (see item name definitions for parameters). c. Twine is two or more strands twisted together. Includes Fibrous Cord Assemblies; Fibrous Cord; Fibrous Rope; Fibrous Twine. Excludes Wire Rope (FSC 4010); Slings (FSC 3940).	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
-\N	Cat	4030	FSC	0	Fittings for Rope, Cable, and Chain	Fittings for Rope, Cable, and Chain	Note All items, including specially designed, will be classified in this FSC. Fittings classified in this FSC are items used in conjunction with chain, rope, and are attached to perform certain functions, (e.g., hooks, shackles, and wedges) refer to item name definitions for parameters. Includes Anchor Guys; Wire Stranded Bands; Wire Rope Clamps; Cargo Hooks; Shackles; Swivels; Rope Terminals; Rope Wedges. Excludes Clamp Blocks (FSC 5340); Support Hooks (FSC 5340).	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
-\N	Cat	4240	FSC	0	Safety and Rescue Equipment	Safety and Rescue Equipment	 Includes Portable Fire Escapes; Safety Nets, Nonbuoyant. Excludes Divers' Suits; Fixed Fire Escapes.	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
-\N	Cat	4250	FSC	0	Recycling and Reclamation Equipment	Recycling and Reclamation Equipment	 Includes Material and Machinery designed to remove, neutralize and/or prepare for possible re-use of substances otherwise considered to be un-reclaimable. 	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
-\N	Cat	4310	FSC	0	Compressors and Vacuum Pumps	Compressors and Vacuum Pumps	 Includes Truck Mounted and Trailer Mounted Compressors. Excludes Refrigeration Compressors (FSC 4130).	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
-\N	Cat	4320	FSC	0	Power and Hand Pumps	Power and Hand Pumps	  Excludes Laboratory Jet Pumps (FSG 65 and 66).	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
-\N	Cat	4110	FSC	0	Refrigeration Equipment	Refrigeration Equipment	Note-This class includes only complete refrigeration equipment, whether refrigerated from an integral or remote mechanical refrigeration unit or system. Also included in this class are refrigeration plants, and complete "packaged" refrigeration units and systems containing a power driven compressor, condenser, evaporator, and all other necessary components to refrigerate an enclosed space. Nonoperating accessories such as ice trays, shelves, and panels are included in this class. Excluded from this class are operating components, assemblies, parts, attachments, or accessories, for use in or on complete refrigeration equipment, plants, systems, or the "packaged" refrigeration units, and which are to be classified in Class 4130, or as otherwise specifically prescribed by the indexes and structure of the FSC. Includes Grocery Type Display Cases; Ice Cream Cabinets; Drinking Fountains (except Portable and stationary types classified in Class 4510); Professional and Scientific Refrigerators; Rivet Coolers; Photographic Refrigerators; Mortuary Refrigerators; Household and Commercial Refrigerators; Grocery Type Showcases; and other types of refrigeration equipment of the commissary or food store type. Excludes Cafeteria Type Refrigerated Display Cases; Soda Fountains; Milk, Soda, and/or Ice Cream Dispensers; Cold Food Counters; Carbonators; Combination Heated-Refrigerated Food Serving Equipment; Cafeteria Type Showcases; Chilling Equipment Used for Display and Serving of Food (see Class 7310 for these items). Also excluded from this class are refrigeration components (see Class 4130).	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
-\N	Cat	4120	FSC	0	Air Conditioning Equipment	Air Conditioning Equipment	Note-This class includes only complete air conditioning equipment, systems, and plants. Also included are specially designed nonoperating accessories such as a window panel used with a window type air conditioning unit to facilitate mounting. Excluded from this class are operating components, assemblies, parts, attachments, or accessories for use in or on air conditioning equipment, which are to be classified in Class 4130, or as otherwise specifically prescribed by the indexes and structure of the FSC. Includes Store Type Units; Window and Room Type Units; Marine, and Vehicular Air Conditioning Units; Air Conditioning Plants and Systems. Excludes Air Conditioning Components (FSC 4130, or as otherwise specifically prescribed by the indexes and structure of the FSC).	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
-\N	Cat	4130	FSC	0	Refrigeration and Air Conditioning Components	Refrigeration and Air Conditioning Components	 Includes Heat Exchanger Equipment; Refrigerant Strainers; Refrigeration Compressors; Air Conditioning and Refrigeration Servicing Equipment, such as Charging and testing manifolds, Lines and Units; Operating Components of Refrigeration and Air Conditioning Equipment, Plants, and Systems classified in classes 4110 and 4120. Excludes Refrigeration and Air Conditioning Plants (see classes 4110 and 4120): Collections of Refrigeration Components "packaged" as a unit including a refrigeration compressor, condenser, evaporator, etc., specifically designed and tailored for applications such as walk-in type refrigerators. Individual components of the "packaged" unit will be classified in class 4130, or as otherwise specifically prescribed by the indexes and structure of the FSC. The complete "package" unit will be classified in class 4110.	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
-\N	Cat	4140	FSC	0	Fans, Air Circulators, and Blower Equipment	Fans, Air Circulators, and Blower Equipment	Note-Fans and impellers which are specifically designed for use with specific individual types of equipment are to be classified in the same classes as their next higher assemblies or in the appropriate components or accessories classes (as in Group 25 or 29 or Class 1680) as prescribed by the indexes and structure of the FSC. Includes Wall Type Fans; Pedestal Type Fans; Household Type and Attic Type Exhaust Fans; Floor Fans; Forged Draft Exhaust and Disposal Kits; Fans, Air Circulators, and Blower Equipment, whether designated as "industrial" or "nonindustrial" by application and/or use. Excludes Combination Heater-Fans (FSC 4520).	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
-\N	Cat	4150	FSC	0	Vortex Tubes and Other Related Cooling Tubes	Vortex Tubes and Other Related Cooling Tubes	 Includes Tool Grinding spot coolers; machining spot coolers; electronic equipment spot coolers; and electronic cabinet spot coolers. Excludes Refrigeration and Air Conditioning Plants (Classes 4110 and 4120); Air Conditioning Components and Cooler Unit, Air (Class 4130); Cooler, Air, Evaporative (Class 4120) and Pipe and Tube (Group 47).	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
-\N	Cat	4210	FSC	0	Fire Fighting Equipment	Fire Fighting Equipment	 Includes Fire Extinguishers; Fire Axes; Fire Rakes; Fire Beaters; Fire Trucks; Fire Hose; Play Pipes; Hose Fittings having one or more Fire Hose End Connections; Fire Hose Reels; Fire Fighting Trailers; Fire Hydrants; Sprinkler Heads. Excludes Wrecking Bars (FSC 5120, 1385).	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
-\N	Cat	4220	FSC	0	Marine Lifesaving and Diving Equipment	Marine Lifesaving and Diving Equipment	 Includes Diving and Salvage Apparatus, including Pressurized Divers' Suits; Rescue Nets, Buoyant; Inflatable Life Vests; Life Rafts. Excludes Lifesaving Boats (FSC 1940).	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
-\N	Cat	4230	FSC	0	Decontaminating and Impregnating Equipment	Decontaminating and Impregnating Equipment	Note-Excludes production type equipment designed for impregnation of metal castings and electronic components, processing of leather and textiles, and for similar industrial processing operations.  	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
-\N	Cat	4235	FSC	0	Hazardous Material Spill Containment and Clean-up Equipment and Material	Hazardous Material Spill Containment and Clean-up Equipment and Material	 Includes Secondary Spill Containment Sumps; Liquid Spill Containment Pallets; Spill Containment Basins; Spill Containment Systems; Absorbent, Sorbent and Blotting Materials. 	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
-\N	Cat	4330	FSC	0	Centrifugals, Separators, and Pressure and Vacuum Filters	Centrifugals, Separators, and Pressure and Vacuum Filters	  Excludes Laboratory Centrifuges (FSG 65 and 66); Water Purification Filters (FSC 4610).	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
-\N	Cat	4410	FSC	0	Industrial Boilers	Industrial Boilers	 Includes Steam Boilers, over 15 pounds WSP. Marine Boilers; Boiler Drums; Water Heaters, Low Pressure (over 100 gallon recovery capacity). 	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
-\N	Cat	4420	FSC	0	Heat Exchangers and Steam Condensers	Heat Exchangers and Steam Condensers	  	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
-\N	Cat	4430	FSC	0	Industrial Furnaces, Kilns, Lehrs, and Ovens	Industrial Furnaces, Kilns, Lehrs, and Ovens	 Includes Crucible Furnaces; Cupola Furnaces. Excludes Food Industry Ovens (FSC 7310); Metal Heat Treating Furnaces (FSC 3424); Laboratory Type Furnaces (FSC 6640).	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
-\N	Cat	4440	FSC	0	Driers, Dehydrators, and Anhydrators	Driers, Dehydrators, and Anhydrators	 Includes Evaporators. 	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
-\N	Cat	4460	FSC	0	Air Purification Equipment	Air Purification Equipment	 Includes Electronic Precipitators; Dust Collection Equipment. Excludes Fan and Blower Equipment (FSC 4140); Air Conditioning Equipment (FSC 4120).	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
-\N	Cat	4470	FSC	0	Nuclear Reactors	Nuclear Reactors	Note-This class includes all types of nuclear reactors and those items which are specifically designed for use within nuclear reactors, their primary cooling systems, auxiliary fluid systems, special propulsion plant systems, handling and servicing equipment, electrical and control systems, and associated special test and water chemistry control items. Excluded from this class are those items for which more specific classifications are suitable. Includes Refueling Machines; Ion Chamber Seals; Thermal Barriers; Control Rods; Steam Generators, Pressurized Water; Reactor Vessel Shells; Handling Carts; Hoisting Units, New and Spent Cartridge. 	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
-\N	Cat	4510	FSC	0	Plumbing Fixtures and Accessories	Plumbing Fixtures and Accessories	 Includes Bathtubs; Commodes; Lavatories; Shower Cabinets; Sinks; Water Closets; Accessories and Component Parts, such as Dispensers, Faucets, Holders, Racks, Shower Heads, Flush Valves and Stop Valves. Excludes Fittings and Specialties for Hose, Pipe and Tube (FSC 4730).	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
-\N	Cat	4520	FSC	0	Space and Water Heating Equipment	Space and Water Heating Equipment	 Includes Boilers, 15 pounds WSP and under (for boilers over 15 pounds WSP, see FSC 4410); Domestic Water Storage Tanks through 100 gallon capacity; Fireplace Heaters; Furnaces; Space Heaters; Heating Radiators; Immersion Heaters; Water Heaters, through 100 gallon recovery capacity (for heaters over 100 gallons recovery capacity, see FSC 4410). Excludes Vehicle Heaters; (FSC 2540); Aircraft Heaters (FSC 1660).	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
-\N	Cat	4530	FSC	0	Fuel Burning Equipment Units	Fuel Burning Equipment Units	 Includes Oil Burners; Stokers; Gas Burners. 	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
-\N	Cat	4540	FSC	0	Waste Disposal Equipment	Waste Disposal Equipment	 Includes Compactors; Destructors; Garbage Disposals; Incinerators; Septic Tanks. 	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
-\N	Cat	4610	FSC	0	Water Purification Equipment	Water Purification Equipment	 Includes Demineralizers; Filtration Equipment; Ice and Snow Melters. Excludes Water Purification Compounds (FSC 6810 and 7930); Water Softening Compounds (FSC 6810 and 7930).	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
-\N	Cat	4620	FSC	0	Water Distillation Equipment, Marine and Industrial	Water Distillation Equipment, Marine and Industrial	  Excludes Laboratory Distillation Apparatus (FSC 6640).	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
-\N	Cat	4630	FSC	0	Sewage Treatment Equipment	Sewage Treatment Equipment	  	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
-\N	Cat	4710	FSC	0	Pipe, Tube and Rigid Tubing	Pipe, Tube and Rigid Tubing	 Includes Culvert Pipes; Culvert Pipe Connector Bands; Metallic Pipes; Plastic Pipes; Tubes and Rigid Tubing and their assemblies. Excludes Air Conditioning-Heating Pipes (FSC 4520); Asbestos and Cement, Bituminized Fiber, Clay and Concrete Pipes (FSC 5630); Conduit Pipes and their assemblies (FSC 5975); Downspout Pipes (FSC 5670); Exhaust Pipes (FSC 1560, 2990, and  4520); Fire Extinguishing Systems Pipes and Tubes and their assemblies (FSC 4210); Flexible Tubing (FSC 4720); Glass Tubing (FSC 6640, and 9340); Laboratory Tubes (FSC 6640); Medical and Surgical Tubes (FSC 6515).	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
-\N	Cat	4720	FSC	0	Hose and Flexible Tubing	Hose and Flexible Tubing	 Includes Air Duct, Metallic, Nonmetallic, and Textile Fiber Hoses and their assemblies; Flexible Tubing and their assemblies. Excludes Conduit and their assemblies (FSC 5975); Laboratory Tubes (FSC 6640); Medical and Surgical Tubes (FSC 6515); Rigid Tubing and their assemblies (FSC 4710).	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
-\N	Cat	4730	FSC	0	Hose, Pipe, Tube, Lubrication, and Railing Fittings	Hose, Pipe, Tube, Lubrication, and Railing Fittings	 Includes Adapters; Bends; Caps; Clamps; Connectors; Couplings; Crosses; Elbows; Expansion Joints; Ferrules; Flanges; Laterals; Lubrication Fittings; Manifolds; Nipples; Nozzles; Outlets; Plugs; Reducers; Swing and Swivel Joints; Tees; Traps; Unions; Wyes. Excludes Air Conditioning-Heating Fittings (FSC 4520); Bituminized Fiber and Concrete Fittings (FSC 5630); Conduit Boxes and Fittings (FSC 5975); Downspout Fittings (FSC 5670); Medical and Surgical Fittings (FSC 6515); Laboratory Fittings (FSC 6640); Post Caps and Rail Ends (FSC 5660); Machine Thread Bushings and Plugs (FSC 5365).	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
-\N	Cat	4810	FSC	0	Valves, Powered	Valves, Powered	 Includes Electric Motor Operated Valves; Hydraulic Operated Valves; Solenoid Operated Valves. Excludes Engine Intake and Exhaust valves (FSC 2990, 2815); Valves specifically designed for use with fire fighting equipment (FSC 4210); plumbing equipment, and the like (FSC 4540).	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
-\N	Cat	4820	FSC	0	Valves, Nonpowered	Valves, Nonpowered	 Includes Automatic Nonpowered Valves; Gate, Globe, Angle, Check, and Relief Valves; Cocks. Excludes Fire Hydrants (FSC 4210); Sprinkler Heads (FSC 4210); Valves specifically designed for use with fire fighting Equipment (FSC 4210); plumbing equipment, and the like (FSC 4540).	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
-\N	Cat	4910	FSC	0	Motor Vehicle Maintenance and Repair Shop Specialized Equipment	Motor Vehicle Maintenance and Repair Shop Specialized Equipment	 Includes Automotive Lifts; Wheel Aligners; Brake Service Equipment; Tire Maintenance and Repair Equipment; Test stands and test equipment specially designed for use with motor vehicles. Excludes Hand Tools (FSG 51); Lubrication and Fuel Dispensing Equipment (FSC 4930); Basic types of electrical and electronic test instruments, including those specifically designed, such as ammeters, voltmeters, ohmmeters, multimeters, and similar instruments as shown in the indexes in the FSC (FSC 6625).	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
-\N	Cat	4920	FSC	0	Aircraft Maintenance and Repair Shop Specialized Equipment	Aircraft Maintenance and Repair Shop Specialized Equipment	 Includes Maintenance stands designed for support of aircraft assemblies during repair or overhaul; Test Stands and Test Equipment specially designed for maintenance and repair of aircraft components such as: engines, generators, hydraulic systems, armament, automatic pilot, fire control, flight control, and navigational systems. Excludes Hand Tools; Airfield Maintenance Platforms; Basic types of electrical and electronic test instruments, including those specially designed, such as ammeters, voltmeters ohmmeters, multimeters, and similar instruments, as shown in the indexes to the FSC; Test Apparatus used for both communications and other electrical and electronic equipment.	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
-\N	Cat	4921	FSC	0	Torpedo Maintenance, Repair, and Checkout Specialized Equipment	Torpedo Maintenance, Repair, and Checkout Specialized Equipment	 Includes Specially designed maintenance, test, checkout, and repair shop specialized equipment for maintenance and repair of torpedoes, torpedo components; adapters, fixtures, inspection and holding fixtures, leveling jack assemblies, fuel filling and syphon assemblies, control surface adapter and protractor assemblies, afterbody cradle adapter and tilting mount assemblies, pressure air heater assemblies, motor drier and puller assemblies, test stand levels and stands for overhaul, maintenance, test, checkout, and repair of torpedo and torpedo components, test panels, fixtures, and test sets for electrical circuits, firing circuits and torpedo test sets. Excludes Specially designed maintenance test, checkout and repair shop specialized equipment for maintenance and repair of ammunition, guided missiles, rockets, fire control, space vehicles, underwater mines, depth charges and nuclear ordnance. Also excludes "basic" types of electrical and electronic test instruments, such as ammeters, voltmeters, ohmmeters, multimeters, galvanometers and similar instruments.	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
-\N	Cat	4923	FSC	0	Depth Charges and Underwater Mines Maintenance, Repair, and Checkout Specialized Equipment	Depth Charges and Underwater Mines Maintenance, Repair, and Checkout Specialized Equipment	 Includes Specially designed maintenance, test, checkout and repair shop specialized equipment for maintenance and repair of depth charges and underwater mines; adapters, inspection, test and holding fixtures; stands for overhaul, maintenance, test, checkout, and repair of underwater mines and depth charges; test fixtures, panels plus assemblies and test sets for leak test, pressure test, firing circuits and timing devices. Excludes Specially designed maintenance, test, checkout, and repair shop equipment designed for nuclear ordnance, guided missiles, ammunition, torpedoes, rockets, fire control, space vehicles and "basic" types of electrical and electronic test instruments.	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
-\N	Cat	4925	FSC	0	Ammunition Maintenance, Repair, and Checkout Specialized Equipment	Ammunition Maintenance, Repair, and Checkout Specialized Equipment	 Includes Specially designed maintenance, test, checkout, and repair shop specialized equipment, for maintenance and repair of ammunition items; adapters, ammunition feeders and hoppers; inspection and holding fixtures; linkers, linkers-delinkers, and delinkers to assemble and disassemble ammunition belts; surveillance ovens; explosimeters; primer firing device fixtures; mandrels; repositioning machines; gas bomb service kits; test fixtures; panels; plug assemblies; and test sets for ammunition maintenance, checkout and repair. Excludes Maintenance, repair, checkout and test equipment specially designed for use with guided missiles, guided missile remote control systems, guided missile systems; fire control; nuclear ordnance; rockets, underwater mines and depth charges; torpedoes; space vehicles and test equipment for aircraft weapon launchers; basic types of electrical and electronic test instruments, such as ammeters, voltmeters, ohmmeters, multimeters, and similar instruments, as shown in the indexes to the FSC.	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
-\N	Cat	4927	FSC	0	Rocket Maintenance, Repair and Checkout Specialized Equipment	Rocket Maintenance, Repair and Checkout Specialized Equipment	 Includes Specially designed maintenance, test, checkout, and repair shop specialized equipment for maintenance and repair of rockets and rocket components; rocket maintenance stands; test stands; fixtures; jigs; and shop equipment designed for maintenance and repair of rockets, rocket motors and other rocket components. Excludes Specially designed maintenance, test, checkout, and repair shop equipment specifically designed for nuclear ordnance, guided missiles, fire control, torpedoes, underwater mines, depth charges, ammunition, space vehicles; test equipment for aircraft rocket launchers and "basic" types of electrical and electronic test instruments, such as ammeters, voltmeters, ohmmeters, multimeters, galvanometers and similar instruments.	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
-\N	Cat	4930	FSC	0	Lubrication and Fuel Dispensing Equipment	Lubrication and Fuel Dispensing Equipment	 Includes Hand Grease Guns; Centralized Lubrication Systems; Hydrostatic Lubricators; Oil and Gasoline Dispensing Pumps; Fuel Oil Dispensing Pumps; Hand Oilers; Grease Dispensers; Pressure Gun Attachments; Sight Feed Lubricators. Excludes Alemite and Lubrication Fittings (FSC 4730).	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
-\N	Cat	4931	FSC	0	Fire Control Maintenance and Repair Shop Specialized Equipment	Fire Control Maintenance and Repair Shop Specialized Equipment	 Includes Specially Designed Test Equipment, Maintenance Fixtures and Stands. Excludes Instruments for use on both Fire Control and other Equipment; Airborne Fire Control Maintenance and Repair Shop Equipment.	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
-\N	Cat	4933	FSC	0	Weapons Maintenance and Repair Shop Specialized Equipment	Weapons Maintenance and Repair Shop Specialized Equipment	 Includes Maintenance Stands, Fixtures, and Jigs. Excludes Atomic Ordnance Maintenance and Repair Shop Specialized Equipment; Airborne Weapons Maintenance and Repair Shop Equipment.	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
-\N	Cat	4935	FSC	0	Guided Missile Maintenance, Repair, and Checkout Specialized Equipment	Guided Missile Maintenance, Repair, and Checkout Specialized Equipment	 Includes Checkout equipment and test equipment specially designed for use with guided missiles and guided missile remote control systems. Excludes Specially designed internal (built-in) checkout equipment for guided missile remote control systems; Basic types of electrical and electronic test instruments, including those specially designed, such as ammeters, voltmeters, ohmmeters, multimeters, and similar instruments, as shown in the indexes to the FSC; Test Apparatus used for both communications and other electrical and electronic equipment.	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
-\N	Cat	4940	FSC	0	Miscellaneous Maintenance and Repair Shop Specialized Equipment	Miscellaneous Maintenance and Repair Shop Specialized Equipment	 Includes Paint Spraying Equipment. Excludes Hand Tools (FSG 51).	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
-\N	Cat	4960	FSC	0	Space Vehicle Maintenance, Repair, and Checkout Specialized Equipment	Space Vehicle Maintenance, Repair, and Checkout Specialized Equipment	 Includes Checkout and Test Equipment specially designed for use with Space Vehicles, including Remote Control Systems. Excludes Checkout and Test Equipment used with both Guided Missiles and Space Vehicles; Specially designed Internal (Built-in) Checkout Equipment for Remote Control Systems; Basic types of Electrical and Electronic Test Instruments, including those specially designed, such as ammeters, ohmmeters, multimeters, and similar instruments, as shown in the indexes to the FSC.	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
-\N	Cat	4970	FSC	0	Multiple Guided Weapons, Specialized Maintenance and Repair Shop Equipment	Multiple Guided Weapons, Specialized Maintenance and Repair Shop Equipment	Note Maintenance, test, checkout and repair shop equipment designed to test, maintain, fault isolate and repair multiple guided weapon systems. For equipment designed to be used with only one specific system see the individual FSC indexed (i.e., 4921, 4927, 4935).  	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
-\N	Cat	5110	FSC	0	Hand Tools, Edged, Nonpowered	Hand Tools, Edged, Nonpowered	 Includes Chisels; Files; Pipe Cutters; Rasps; Saws; Screw Plates; Axes; Hatchets; Machetes. 	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
-\N	Cat	5120	FSC	0	Hand Tools, Nonedged, Nonpowered	Hand Tools, Nonedged, Nonpowered	 Includes Hammers; Picks; Pliers, except pliers for cutting only; Screwdrivers; Shovels; Construction Rakes, Forks and Hoes; Jacks, including Contractors' Jacks; Wrecking Bars; Glue Pots; Blowtorches. Excludes Craftsman's Measuring Tools; Gardening Rakes, Forks, Hoes, and other Garden Tools.	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
-\N	Cat	5130	FSC	0	Hand Tools, Power Driven	Hand Tools, Power Driven	 Includes Drills; Riveters; Portable Electric Saws; Pneumatic Tools; Abrasive Wheels, Cones, and other Abrasive Attachments for use only on Hand Held Power Tools. 	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
-\N	Cat	5133	FSC	0	Drill Bits, Counterbores, and Countersinks: Hand and Machine	Drill Bits, Counterbores, and Countersinks: Hand and Machine	  	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
-\N	Cat	5136	FSC	0	Taps, Dies, and Collets; Hand and Machine	Taps, Dies, and Collets; Hand and Machine	  Excludes Punching, Stamping, and Marking Dies.	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
-\N	Cat	5140	FSC	0	Tool and Hardware Boxes	Tool and Hardware Boxes	  	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
-\N	Cat	5180	FSC	0	Sets, Kits, and Outfits of Hand Tools	Sets, Kits, and Outfits of Hand Tools	Note-This class includes sets, kits and outfits consisting of several different items classifiable either in a single class or in several classes. Excluded from this class are sets, kits and outfits consisting of variations (such as size or color) of an item. Classify these items in the same class as the individual item.  	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
-\N	Cat	5210	FSC	0	Measuring Tools, Craftsmen's	Measuring Tools, Craftsmen's	Note-This class does not include special inspection gages, which are classified in Class 5220. Includes Calipers; Levels; Micrometers; Plumb Bobs; Precision Tapes; Squares; Angle Gages; Center Gages; Depth Gages; Draw Gages; Drill Point Gages; Fillet and Radius Gages; Glaziers' Gages; Height Gages (Vernier); Planer Gages; Rivet Selector Gages; Saw Tooth Set Gages; Screw Pitch Gages; Surface Gages; Telescoping Gages; Thickness Gages; Tube Bead Gages; Tube Flare Gages; Twist Drill Gages; Twist Drill and Rod Gages; Twist Drill and Tap Gages; Taper-Wire-Thickness Gages; Wire Gages; Tool Setting Planer and Shaper Gages; Gage Blocks. 	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
-\N	Cat	5220	FSC	0	Inspection Gages and Precision Layout Tools	Inspection Gages and Precision Layout Tools	Note-Special inspection gages are included in this class. Includes Go and Not-Go Gages, including Plug, Ring, Snap, Thread, and Length Gages; Profile Gages; Fixture Gages; Special Inspection Gages. 	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
-\N	Cat	5280	FSC	0	Sets, Kits, and Outfits of Measuring Tools	Sets, Kits, and Outfits of Measuring Tools	  	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
-\N	Cat	5305	FSC	0	Screws	Screws	  	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
-\N	Cat	5306	FSC	0	Bolts	Bolts	  	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
-\N	Cat	5307	FSC	0	Studs	Studs	  	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
-\N	Cat	5310	FSC	0	Nuts and Washers	Nuts and Washers	Note Nuts and washers, including specially designed, are to be classified in this FSC. a. Nuts are a small metal block made in a variety of shapes such as square and hexagonal which is drilled and internally threaded. b. Washers are a perforated piece of metal, leather, or other materials of various shapes or forms. They are used primarily as a seat for a bolt, nut, screw, rivet or nail to distribute pressure and prevent endwise motion over an area and/or to prevent movement between two parts by means of restraining features created by the shape of its edges. Includes Locknuts; Eye Nuts; Plain Nuts; Castellated Nuts; Wing Nuts; Plate Nuts; Push on Nuts; Concave and Convex Washers; Flat Washers; Keyed Washers; Lock Washers; Shouldered Washers; Split Washers. Excludes Bearing Thrust Washers (FSC 3120); Shims (FSC 5365); Ring Spacers (FSC 5365); Plate Spacers (FSC 5365); Lock Rings (FSC 5365).	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
-\N	Cat	5315	FSC	0	Nails, Machine Keys, and Pins	Nails, Machine Keys, and Pins	Note Nails, machine keys, and pins, including specially designed, will be classified in this FSC. a. Nails are slender, usually pointed fasteners with a head, and designed for insertion by impact. b. Machine keys are items generally inserted between two items, usually in a groove, to prevent relative rotation e.g., shaft and hub. c. Pins are cylindrical items of various materials used to align/attach two or more parts together and may allow for angular movement. Includes Dowel Pins, Split Pins; Spikes; Tacks; Nonoffice Type Staples; Machine Keys; Brads; Shouldered Pins; Cotter Pins; Nails. Excludes Shafts (FSC 3040); Lock Keys (FSC 5340).	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
-\N	Cat	5320	FSC	0	Rivets	Rivets	  	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
-\N	Cat	5325	FSC	0	Fastening Devices	Fastening Devices	 Includes Eyelets; Grommets; Aircraft Cowling Fasteners; Textile Fasteners; Retaining Rings; Threaded Inserts. 	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
-\N	Cat	5330	FSC	0	Packing and Gasket Materials	Packing and Gasket Materials	Note This FSC includes only seals and gaskets designed for standard use. Seals, gaskets and packing are made from materials specifically designed and constructed to resist deterioration from the action of heat, gas, chemicals, liquids, and used to fill a cavity and create a tight seal. Similar materials used to make seals, gaskets, and packing are available in bulk form, refer to FSG 93, FSG 80, and FSG 83. Includes General Purpose Oil Grease, Air, Liquid, Gas, and chemical Seals; Oakum; Prefabricated Gaskets and Seals designed for a single specific application. Excludes O-Rings (FSC 5331); Bulk material items, such as; Rubber, Cork, and Asbestos Sheets and Strips (FSG 93); Liquid Gasket Materials (RTV, Permatex, etc.) (FSG 80); RFI and EMI Seals and Gaskets (FSC 5999), and all Seal Retainers.	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
-\N	Cat	5331	FSC	0	O-Ring	O-Ring	  Excludes Packing and Gasket Material (FSC 5330).	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
-\N	Cat	5335	FSC	0	Metal Screening	Metal Screening	Note Metal Screening is a perforated plate or cylinder or a meshed wire fabric usually mounted and used to separate coarse from finer parts. Includes Insect Screening; Industrial Metal Cloth; Industrial Metal Mesh. Excludes Fencing (FSC 5660).	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
-\N	Cat	5340	FSC	0	Hardware, Commercial	Hardware, Commercial	Note Common hardware designed primarily for commercial use will be classified in this FSC. Hardware is the physical, tangible and permanent components of end items that may not be classified elsewhere. It consists also of common items that are commonly used in construction and/or manufacturing (e.g., hinges, door locks). Includes Access Covers; Bumpers; Casters; Cabinet and Door Hardware; Clevises; Hinges; Latches; Straps and Strapping; Turnbuckles; Webbed Straps. Excludes Weapons System Hardware (FSC 5342).	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
-\N	Cat	5341	FSC	0	Brackets	Brackets	Note All brackets, including specially designed for specific use an/or application, will be classified in this FSC. Brackets are items of rigid construction that sustain a secondary item. Includes Angle Brackets; Double Angle Brackets; Mounting Brackets. Excludes Corner Braces (FSC 5340); "T" Braces (FSC 5340); Mending Plates (FSC 5340).	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
-\N	Cat	5342	FSC	0	Hardware, Weapon System	Hardware, Weapon System	Note Hardware designed for weapon systems unique applications will be classified in this FSC. Includes Adapters; Anchor Plates and Straps; Anodes; Bellows; Couplings; Control Rods; Access Doors; Fairleads; Mounts; Tie Rods; Yokes. Excludes Commercial Hardware (FSC 5340).	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
-\N	Cat	5345	FSC	0	Disks and Stones, Abrasive	Disks and Stones, Abrasive	 Includes Abrasive Belts and Belting; Hones; Abrasive Wheels, Multiapplication. Excludes Dental Abrasives; Abrasive Cones, and other Abrasive Attachments for equipment.	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
-\N	Cat	5350	FSC	0	Abrasive Materials	Abrasive Materials	 Includes Cloth; Papers; Powders; Abrasive Polishing Compounds; Metal Finishing Abrasives; Industrial Diamonds; Diamond Dust; Rouge. 	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
-\N	Cat	5355	FSC	0	Knobs and Pointers	Knobs and Pointers	 Includes Knobs, including Calibrated Knobs; Dials, Scale. 	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
-\N	Cat	5360	FSC	0	Coil, Flat, Leaf, and Wire Springs	Coil, Flat, Leaf, and Wire Springs	Note-All springs, including specially designed, will be classified in this FSC. A spring is an elastic mechanical device that regains its original shape after being compressed, extended or deflected. Includes Compression Springs; Torsion Springs; Leaf Spring Assemblies; Flat Springs; Extension Springs. 	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
-\N	Cat	5365	FSC	0	Bushings, Rings, Shims, and Spacers	Bushings, Rings, Shims, and Spacers	Note-All items, including specially designed, will be  classified in this FSC. a. A bushing is cylindrical in shape, hollow, and designed primarily to be inserted into a hole to reduce the effective inside diameter of the hole, and to protect the body structure about the hole from damage resulting from stress, strain, and vibration. b. A ring is cylindrical in shape, usually flat with a center hole. Rings are multi-applicational. See specific item name for designated usage. c. A shim is a thin, sometimes tapered, piece of material used to fill in space between things. See specific item name for dimensional parameters. d. A spacer is a device for holding two members at a given distance from each other. Includes Externally Threaded Rings; Keyed and Serrated Lock Rings; Dee Rings; Instrument Retaining Rings; Shim Sets and Assortments; Plate Spacers; Ring Spacers; Sleeve Spacers; Stepped Spacers; Spacer Sets and Assortments; Sleeve Bushings; Machine Threaded Bushings; Machine Threaded Plugs. Excludes Sleeve Bearings (FSC 3120); Pipe Threaded Plugs (FSC 4730); Piston Rings (FSC 2520, 2805, 2810, 2815, 2825, 2990, 3040, 4310, and 4820); Retaining Rings (FSC 5325); Shim Stock (FSC 9515).	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
-\N	Cat	5410	FSC	0	Prefabricated and Portable Buildings	Prefabricated and Portable Buildings	 Includes Prefabricated Panels; Inflatable Shelters; Metal Screens and Metal Windows. 	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
-\N	Cat	5411	FSC	0	Rigid Wall Shelters	Rigid Wall Shelters	 Includes Expandable and nonexpandable shelters. 	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
-\N	Cat	5419	FSC	0	Collective Modular Support System	Collective Modular Support System	Note Includes Self-Contained habitat, containing facilities normally expected in a "Rest and Recreational" area, such as; billeting, food services, laundry, shower/hygiene services, recreational and support services that enhance morale and welfare.  	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
-\N	Cat	5420	FSC	0	Bridges, Fixed and Floating	Bridges, Fixed and Floating	 Includes Special Bridge Erection Equipment; Bridge Floats and Pontoons; Tramways; Trestles. Excludes Pontoons and Floating Docks (FSC 1945).	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
-\N	Cat	5430	FSC	0	Storage Tanks	Storage Tanks	 Includes Assembled and Unassembled Tanks for storage only; Enclosures for Pressure and Vacuum Tanks; Petroleum Bulk Storage Tanks. Excludes Boiler Tanks (FSC 4410); Hot Water Tanks (FSC 4520).	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
-\N	Cat	5440	FSC	0	Scaffolding Equipment and Concrete Forms	Scaffolding Equipment and Concrete Forms	 Includes Prefabricated Concrete Placing Forms; Builders' Ladders and Stepladders; Suspension stages. Excludes Aircraft Ladders (FSC 1730); Fire Fighting Ladders (FSC 4210); Maintenance Ladders (FSC 4940); Marine Vessel Ladders (FSC 2090); Vehicle Ladders (FSC 2540).	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
-\N	Cat	5445	FSC	0	Prefabricated Tower Structures	Prefabricated Tower Structures	 Includes Power Transmission Towers; Radar Towers; Searchlight Towers; Control Towers; Prefabricated Tower Components, such as Anchor Rails, Tie Rods, Braces, Steps, Guy Assemblies; Specialized Tower Hardware. 	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
-\N	Cat	5450	FSC	0	Miscellaneous Prefabricated Structures	Miscellaneous Prefabricated Structures	 Includes Bleachers; Grandstands. 	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
-\N	Cat	5510	FSC	0	Lumber and Related Basic Wood Materials	Lumber and Related Basic Wood Materials	 Includes Dimensional Lumber; Wood Flooring; Mine Timbers; Poles; Railroad Ties; Wood Siding; Molding; Stakes. Excludes Millwork (FSC 5520); Plywood and Veneer (FSC 5530); Prefabricated Non-Wood Items (FSC 5670).	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
-\N	Cat	5520	FSC	0	Millwork	Millwork	 Includes Door Frames; Doors; Window Frames; Window Sashes. Excludes Molding (FSC 5510); Prefabricated Non-Wood Items (FSC 5670).	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
-\N	Cat	5530	FSC	0	Plywood and Veneer	Plywood and Veneer	 Includes Plywood and Veneered Panels. 	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
-\N	Cat	5610	FSC	0	Mineral Construction Materials, Bulk	Mineral Construction Materials, Bulk	 Includes Asphalt; Cinders; Gravel; Lime; Sand; Rough Dimension Stone, including Rubble; Cement; Ballast. Excludes Block, Shaped; Brick.	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
-\N	Cat	5620	FSC	0	Tile, Brick and Block	Tile, Brick and Block	 Includes Concrete Building Block; Cinder Block; Slag Brick; Cut Stone; Cut and Polished Stone; Ceramic Floor and Wall Tile; Architectural Terra Cotta; Concrete Slabs and Grilles. Excludes Glass Building Block (FSC 9340)	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
-\N	Cat	5630	FSC	0	Pipe and Conduit, Nonmetallic	Pipe and Conduit, Nonmetallic	 Includes Concrete Pipe and Conduit; Clay Pipe and Conduit for underground use; Drain Tile; Nonmetallic Pipe Fittings for underground use. Excludes Nonmetallic Pipe, Conduit, and Fittings for laboratory or electrical use; Hose and Tubing, Flexible Nonmetallic.	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
-\N	Cat	5640	FSC	0	Wallboard, Building Paper, and Thermal Insulation Materials	Wallboard, Building Paper, and Thermal Insulation Materials	 Includes Paper Building Board; Ceiling Board; Gypsum Board; Insulating Board; Plasterboard; Soundproofing Board; Tar Paper; Wallpaper; Mineral Wool; Glass Wool Batts; Pipe Covering. Excludes Electrical Insulation Materials.	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
-\N	Cat	5650	FSC	0	Roofing and Siding Materials	Roofing and Siding Materials	 Includes Roofing (all materials), including Sheet Metal; Roofing Felt; Roll Roofing; Roofing Tile; Shingles. Excludes Tar Paper; Bulk Sheet Metal Roofing and Siding; Wood Siding.	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
-\N	Cat	5660	FSC	0	Fencing, Fences, Gates and Components	Fencing, Fences, Gates and Components	  	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
-\N	Cat	5670	FSC	0	Building Components, Prefabricated	Building Components, Prefabricated	Note-Items specified as wooden are classified in 5520 Includes Door Frames; Window Frames; Window Sashes; Eave Troughs (Gutters); Gratings; Grilles; Shutters; Fixed Fire Escapes; Mounted Partitions. Excludes Plumbing and associated components such as Sinks; Wallbaord and items classified as furniture.	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
-\N	Cat	5675	FSC	0	Nonwood Construction Lumber and Related Materials	Nonwood Construction Lumber and Related Materials	 Includes Nonwood Dimensional Lumber; Flooring; Special Turning and Carvings; Nonwood Veneer. Excludes Millwork and Wood Veneer (FSCs 5520 and 5530); Items specified as Wooden (FSC 5510).	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
-\N	Cat	5680	FSC	0	Miscellaneous Construction Materials	Miscellaneous Construction Materials	 Includes Expanded Metal Lath; Airplane Landing Mats; Traction Mats. 	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
-\N	Cat	5805	FSC	0	Telephone and Telegraph Equipment	Telephone and Telegraph Equipment	  	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
-\N	Cat	5810	FSC	0	Communications Security Equipment and Components	Communications Security Equipment and Components	  	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
-\N	Cat	5811	FSC	0	Other Cryptologic Equipment and Components	Other Cryptologic Equipment and Components	  	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
-\N	Cat	5815	FSC	0	Teletype and Facsimile Equipment	Teletype and Facsimile Equipment	 Includes Ticker Tape and Sigtot Equipment. 	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
-\N	Cat	5820	FSC	0	Radio and Television Communication Equipment, Except Airborne	Radio and Television Communication Equipment, Except Airborne	 Includes Telemetering Equipment. Excludes Home Type Radio and Television Equipment.	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
-\N	Cat	5821	FSC	0	Radio and Television Communication Equipment, Airborne	Radio and Television Communication Equipment, Airborne	 Includes Telemetering Equipment. 	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
-\N	Cat	5825	FSC	0	Radio Navigation Equipment, Except Airborne	Radio Navigation Equipment, Except Airborne	 Includes Loran Equipment; Shoran Equipment; Direction Finding Equipment. 	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
-\N	Cat	5826	FSC	0	Radio Navigation Equipment, Airborne	Radio Navigation Equipment, Airborne	 Includes Loran Equipment; Shoran Equipment; Direction Finding Equipment. 	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
-\N	Cat	5830	FSC	0	Intercommunication and Public Address Systems, Except Airborne	Intercommunication and Public Address Systems, Except Airborne	 Includes Wired Audio Systems; Office Type Systems; Shipboard Systems; Tank Systems. 	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
-\N	Cat	5831	FSC	0	Intercommunication and Public Address Systems, Airborne	Intercommunication and Public Address Systems, Airborne	  	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
-\N	Cat	5835	FSC	0	Sound Recording and Reproducing Equipment	Sound Recording and Reproducing Equipment	  Excludes Phonographs, Home Type; Dictating Machines.	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
-\N	Cat	5836	FSC	0	Video Recording and Reproducing Equipment	Video Recording and Reproducing Equipment	Note This class includes, and is restricted to electronic video equipment such as video monitors, televisions, cameras, printers and recorders/reproducers used with miscellaneous communication equipment. Also included is associated equipment such as cleaners, splicers, rewinders, reels and tapes designed for use with video recording-reproducing equipment. Excluded from the class is photographic type equipment (Group 67), ADP type computer monitors (Group 70), and video equipment which includes radio receivers/transmitters (properly classified in more specific classes in Group 58).  	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
-\N	Cat	5840	FSC	0	Radar Equipment, Except Airborne	Radar Equipment, Except Airborne	Note-Radar assemblies and subassemblies designed specifically for use with fire control equipment or guided missiles are excluded from this class and are included in the appropriate classes of Group 12 or Group 14.  	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
-\N	Cat	5841	FSC	0	Radar Equipment, Airborne	Radar Equipment, Airborne	Note-Radar assemblies and subassemblies designed specifically for use with fire control equipment or guided missiles are excluded from this class and are included in the appropriate classes of Group 12 or Group 14.  	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
-\N	Cat	5845	FSC	0	Underwater Sound Equipment	Underwater Sound Equipment	Note-This class excludes items specifically designed for fire control sonar systems. Includes Sonar Equipment; Underwater Listening Equipment; Sonobuoys; Sonobuoy Launchers; Fathometers; Sofar Equipment. 	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
-\N	Cat	5850	FSC	0	Visible and Invisible Light Communication Equipment	Visible and Invisible Light Communication Equipment	Note-This class includes only communication types of infrared equipment. Excluded from this class are infrared assemblies, subassemblies, and components designed specifically for use in fire control systems, guided missile systems, test and maintenance specialized equipment, night vision equipment, and other noncommunication types of equipment. Includes Heliographs. 	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
-\N	Cat	5855	FSC	0	Night Vision Equipment, Emitted and Reflected Radiation	Night Vision Equipment, Emitted and Reflected Radiation	Note-This class includes image forming devices and associated aids, their subassemblies and components, utilizing passive and/or active techniques for detection, observation, and identification of terrain and objects at night, while maintaining concealment afforded by darkness. Includes items having multiapplication for purposes of fire control, and/or night observation, and/or detection. Excluded from this class are items for which more specific classifications are suitable as prescribed by the structure and indexes of the FSC. Includes Sighting and Observation Devices, Target Detectors and Locators, Remote Viewing Systems utilizing heat radiation emitted from object(s), associated Radiation Sources, Image Converters and Image Intensifiers, Optical Cells and other components designed for Night Vision Equipment.  Holders and Lens used with Infrared Equipment are also included in this FSC. Excludes Optical Sighting devices which incorporate both day and night viewing characteristics within an integral unit for fire control purpose, nonnight vision type items designed for use with guided missiles, communications, or laboratory equipment, and Optical Elements, such as Lens, Prisms, Windows.	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
-\N	Cat	5860	FSC	0	Stimulated Coherent Radiation Devices, Components, and Accessories	Stimulated Coherent Radiation Devices, Components, and Accessories	Note-This class includes, and is restricted to, devices the operation of which is based on principles involving the stimulated emission of radiation, and to associated components and accessories directly related to stimulated coherent radiation techniques. The methods for producing the radiation are those obtained by LASER (Light Amplification by Stimulated Emission of Radiation) and by MASER (Microwave and/or Molecular Amplification by Stimulated Emission of Radiation) techniques. Only those items specifically designed for stimulated coherent radiation applications, and having no other application, are to be included in this class. Assemblies or major systems containing such devices are excluded from this class.  	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
-\N	Cat	5865	FSC	0	Electronic Countermeasures, Counter-Countermeasures and Quick Reaction Capability Equipment	Electronic Countermeasures, Counter-Countermeasures and Quick Reaction Capability Equipment	Note-This class includes, and is restricted to, passive and active electronic equipment, systems, and subsystems designed to prevent or reduce an enemy's effective use of radiated electromagnetic energy or designed to insure our own effective use of radiated electromagnetic energy. Includes Electronic Countermeasures, Electronic Counter-Countermeasures, Electronic Support Measures, and Quick Reaction Capability Equipment and components specially designed therefore which are not classifiable elsewhere in the FSC Structure. Excluded from this class are non-electronic items which are properly classified in more specific classes in accordance with the FSC structure and indexes.  	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
-\N	Cat	5895	FSC	0	Miscellaneous Communication Equipment	Miscellaneous Communication Equipment	Note-This class includes miscellaneous communication equipment that is not classified in more specific classes (see the NOTE for FSG 58). Includes Modems. Excludes Electronic Countermeasures Equipment.	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
-\N	Cat	5905	FSC	0	Resistors	Resistors	 Includes Varistors; Resistive ballast Tubes; Rheostats; Resistor Networks; Resistor Mounting Hardware; Thermistors. Excludes Resistance Wire.	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
-\N	Cat	5910	FSC	0	Capacitors	Capacitors	 Includes Interference Filter Capacitors; Capacitor Mounting Hardware. Excludes Semiconductor Devices and Associated Hardware.	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
-\N	Cat	5915	FSC	0	Filters and Networks	Filters and Networks	Note-This class includes those filters and networks which consist of a combination of resistors, capacitors, or coils, but not a combination of resistors only (classified in 5905), capacitors only (classified in 5910), or coils only (classified in 5950).  	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
-\N	Cat	5920	FSC	0	Fuses, Arrestors, Absorbers, and Protectors	Fuses, Arrestors, Absorbers, and Protectors	 Includes Fuseholders; Fuse Boxes; Fuse Posts; Fuse Links; Fuse Blocks; Current Limiters; Corona Balls; Electrostatic Dischargers. Excludes Circuit Breakers.	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
-\N	Cat	5925	FSC	0	Circuit Breakers	Circuit Breakers	 Includes Circuit Breakers and Cutouts. Excludes Relays.	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
-\N	Cat	5930	FSC	0	Switches	Switches	 Includes Rotary, Knife, Toggle, Push Button, Mercury, Thermostatic, and Differential Pressure Switches. Excludes Switchgear.	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
-\N	Cat	5935	FSC	0	Connectors, Electrical	Connectors, Electrical	 Includes Plugs; Jacks; Receptacles, Electronic Component Sockets and Associated Accessories Excludes Interconnectors, Fiber Optic	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
-\N	Cat	5940	FSC	0	Lugs, Terminals, and Terminal Strips	Lugs, Terminals, and Terminal Strips	 Includes Binding Posts; Battery Clips; Stud Terminals; Test Clips. Excludes Caps, Electrical; Clips, Electrical; and Contacts, Electrical.	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
-\N	Cat	5945	FSC	0	Relays and Solenoids	Relays and Solenoids	 Includes Electromagnetic Actuators. Excludes Contractors.	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
-\N	Cat	5950	FSC	0	Coils and Transformers	Coils and Transformers	 Includes Coils, except ignition and magneto; coil assemblies; magnetic amplifiers; reactors; transformers. 	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
-\N	Cat	5955	FSC	0	Oscillators and Piezoelectric Crystals	Oscillators and Piezoelectric Crystals	 Includes Crystal Units, Processed Unmounted Crystals, Crystal Controlled Oscillators and Noncrystal Controlled Oscillators Excludes Crystal Controlled Oscillators and Noncrystal Controlled Oscillators which meet the definition of the term "electronic module" as defined for FSC 5963 and Microcircuits	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
-\N	Cat	5960	FSC	0	Electron Tubes and Associated Hardware	Electron Tubes and Associated Hardware	 Includes Rectifying Tubes; Photoelectric Tubes; Electron Vibrator Tubes. Excludes Transistors; Tube Sockets; X-ray Tubes; Semiconductor Devices and Associated Hardware.	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
-\N	Cat	5961	FSC	0	Semiconductor Devices and Associated Hardware	Semiconductor Devices and Associated Hardware	 Includes Semiconductor Assemblies; Semiconductor Diodes; Semiconductor Rectifiers, Semiconductor Thyristors; Transistors; Unitized Semiconductors; Associated Hardware except Sockets. Excludes Microcircuits; Optoelectronic Devices and Associated Hardware.	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
-\N	Cat	5962	FSC	0	Microcircuits, Electronic	Microcircuits, Electronic	Note-(1) A microcircuit is defined as follows: A small circuit having a high equivalent circuit element density, which is considered as a single part composed of interconnected elements placed and/or formed on or within a single substrate to perform an electronic circuit function. The elements may be formed on or within a semiconductor material substrate; may consist of conductive film(s) formed on an insulating substrate; or may be a combination of one or both of these types with discrete elements.  (2) The term "microcircuit", as applied to circuit devices included in this class, is delimited to exclude items consisting solely of interconnected "microcomponents" (discrete miniaturized components). Also excluded are items fabricated in the form of monolithic thick-film or thin-film structures that in themselves are not functional electronic circuits (e.g., Capacitors, Resistors, Transistors, or "arrays" thereof). Includes Integrated Circuit Devices; Integrated Circuit Modules, Integrated Electronic Devices: Hybrid, Magnetic, Molecular, Opto-Electronic, and Thin Film. Excludes Single Circuit Elements such as Capacitors; Resistors; Diodes and Transistors; Printed Circuit Boards and Circuit Card Assemblies; and Filters and Networks.	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
-\N	Cat	5963	FSC	0	Electronic Modules	Electronic Modules	Note-The term "electronic module" as used in this class designates an electronic component designed for use in various equipment or end item applications, and capable of controlling voltage and/or current to produce gain, oscillation, switching, or similar integral electronic functions. It consists of a collection of miniaturized electronic parts and/or elements in a single replaceable package with plug-in mounting which will also complete the required electrical connections. It is not normally subject to disassembly as distinguished from such items as CIRCUIT CARD ASSEMBLY and ELECTRONIC COMPONENTS ASSEMBLY. These modules conform to industry or government specifications/standards that define all physical dimensions and electrical parameters required to promote commonality and ensure proper operational performance.  Excludes MICROCIRCUITS; Electronic Test Equipment Plug-In Units.	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
-\N	Cat	5965	FSC	0	Headsets, Handsets, Microphones and Speakers	Headsets, Handsets, Microphones and Speakers	  	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
-\N	Cat	5970	FSC	0	Electrical Insulators and Insulating Materials	Electrical Insulators and Insulating Materials	 Includes Tube, Knob, Cleat, Strain, and Standoff Insulators; Feed Thru Insulators; Bead Insulators; Varnish Cambric Tape; Friction Tape. 	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
-\N	Cat	5975	FSC	0	Electrical Hardware and Supplies	Electrical Hardware and Supplies	 Includes Conduit; Raceways; Face Plates; Condulets; Outlet and Junction Boxes; Pole Line Hardware, not elsewhere classifiable. 	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
-\N	Cat	5977	FSC	0	Electrical Contact Brushes and Electrodes	Electrical Contact Brushes and Electrodes	 Includes Brushes for electrical rotating equipment; Carbon Stock for Brushes; Brush Arm and Holders; Lighting Electrodes. Excludes Anodes; Cathodes; Welding Electrodes.	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
-\N	Cat	5980	FSC	0	Optoelectronic Devices and Associated Hardware	Optoelectronic Devices and Associated Hardware	 Includes Optoelectronic devices and assemblies which display numeric, alpha-numeric, symbolic, or graphic information, emitters, and nondisplay optoelectronic devices, such as couplers, detectors, and switches which perform an active function in an electronic system% Excludes electric lighting fixtures, lamps, and associated hardware%	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
-\N	Cat	5985	FSC	0	Antennas, Waveguides, and Related Equipment	Antennas, Waveguides, and Related Equipment	 Includes Aerials; Masts; Tower Equipment; Attenuators; Couplers; Transmission Lines. Excludes Tower Structures.	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
-\N	Cat	5990	FSC	0	Synchros and Resolvers	Synchros and Resolvers	  Excludes Synchro Systems; Servo Mechanisms.	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
-\N	Cat	5995	FSC	0	Cable, Cord, and Wire Assemblies: Communication Equipment	Cable, Cord, and Wire Assemblies: Communication Equipment	Note-This class includes only those types of cable, cord, and Wire Assemblies and Sets (and Wiring Harnesses) used on or with equipment and components covered by Groups 58 and 59. Cable, Cord, Wire Assemblies, and Sets (Wiring Harnesses) used on or with equipment classified in FSC Groups other than Groups 58 or 59 are classified in FSC Class 6150 if multiapplication, or classified with the next higher classifiable assembly if specially designed.  Excludes Cable Assemblies, Fiber Optic.	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
-\N	Cat	5996	FSC	0	Amplifiers	Amplifiers	 Includes Audio Amplifiers, Complementary Amplifiers, Amplifiers, Operational Amplifiers, Power Amplifiers, Radio Frequency Amplifiers, Signal Amplifiers, and Video Amplifiers. Excludes multi-functional items such as Amplifier-Detector, Amplifier-Mixer and microcircuit devices.	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
-\N	Cat	5998	FSC	0	Electrical and Electronic assemblies, Boards, Cards, and Associated Hardware	Electrical and Electronic assemblies, Boards, Cards, and Associated Hardware	  Excludes circuit card and electronic component assemblies which can be identified to a more definitive Approved Item Name.	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
-\N	Cat	5999	FSC	0	Miscellaneous Electrical and Electronic Components	Miscellaneous Electrical and Electronic Components	 Includes Permanent Magnets and Magnetostriction Elements; Caps, Clips, and Contacts, Electrical. 	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
-\N	Cat	6010	FSC	0	Fiber Optic Conductors	Fiber Optic Conductors	Note-Included in this class are bulk discrete fibers.  	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
-\N	Cat	6015	FSC	0	Fiber Optic Cables	Fiber Optic Cables	Note-Included in this class are one or more discrete fiber optic conductors with a common protective covering in bulk form. May include electrical conductors/cables and/or reinforcing material.  	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
-\N	Cat	6020	FSC	0	Fiber Optic Cable Assemblies and Harnesses	Fiber Optic Cable Assemblies and Harnesses	Note-Included in this class are items used for communication and/or data transmission having one or more fiber optic conductors/cables with processed end(s) or terminated in fitting(s). Excluded from this class are items used for illumination and/or image transmission.  	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
-\N	Cat	6021	FSC	0	Fiber Optic Switches	Fiber Optic Switches	Note-Included in this class are switches used for line selection in fiber optic systems.  	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
-\N	Cat	6030	FSC	0	Fiber Optic Devices	Fiber Optic Devices	Note Included in this class are such items as transmitters, receivers, multiplexers, demultiplexers, modulators, demodulators, repeaters, attenuators, filters, integrated optical ciruuits, and the like, used in fiber optic systems.  	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
-\N	Cat	6032	FSC	0	Fiber Optic Light Sources and Photo Detectors	Fiber Optic Light Sources and Photo Detectors	Note Included in this class are light emitting and laser diodes and photo detectors used in fiber optic systems.  	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
-\N	Cat	6035	FSC	0	Fiber Optic Light Transfer and Image Transfer Devices	Fiber Optic Light Transfer and Image Transfer Devices	Note-Included in this class are fiber optic devices used for illumination and/or image transmission. Excluded from this class are items used for communication and/or data transmission.  	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
-\N	Cat	6060	FSC	0	Fiber Optic Interconnectors	Fiber Optic Interconnectors	Note Included in this class are all types of fiber optic terminations, such as connectors, dividers, couplers, rotary and nonrotary joints, splitters, mixers and splicers and the like.  Excludes electrical connectors	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
-\N	Cat	6070	FSC	0	Fiber Optic Accessories and Supplies	Fiber Optic Accessories and Supplies	Note-Included in this class are mode stripping materials, index matching materials and other related supplies. Excluded from this class are hardware and supplies common to both electrical and fiber optic applications which are classifiable on FSC 5975.  	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
-\N	Cat	6080	FSC	0	Fiber Optic Kits and Sets	Fiber Optic Kits and Sets	Note-Included in this class are kits and sets which consist of fiber optic components only; fiber optic components and related parts; fiber optic components and related tools; or fiber optic components, related parts and related tools. Excluded from this class are tool kits and sets which are classifiable in FSC 5180; test sets/instruments classifiable in FSG 66; and end item sets/equipment utilizing fiber optic components which are classifiable in the applicable equipment FSC.  	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
-\N	Cat	6099	FSC	0	Miscellaneous Fiber Optic Components	Miscellaneous Fiber Optic Components	Note-Included in this class are fiber optic items which are not classifiable in a more specific class. (See the "Note" for FSG 60.)  	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
-\N	Cat	6105	FSC	0	Motors, Electrical	Motors, Electrical	  Excludes Starting Motors for Engines.	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
-\N	Cat	6110	FSC	0	Electrical Control Equipment	Electrical Control Equipment	 Includes Contactors; Motor Controllers; Power Servomechanisms; Switchgear; Voltage Regulators. Excludes Automatic Pilot Mechanisms; Relays; Resistors.	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
-\N	Cat	6115	FSC	0	Generators and Generator Sets, Electrical	Generators and Generator Sets, Electrical	 Includes Engine, Turbine, Wind, and Hand Driven Generator Sets and Auxiliary Aircraft Generators. Excludes Motor-Converters; Motor-Generator Sets; Engine Generators; Engine Accessory Generators.	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
-\N	Cat	6116	FSC	0	Fuel Cell Power Units, Components, and Accessories	Fuel Cell Power Units, Components, and Accessories	Note-This class includes items that are designed to produce an electromotive force directly from an oxidation-reduction type of chemical reaction. A complete power unit must include tanks, pumps, and associated control equipment, and requires a continuous, uninterrupted supply of liquid or gaseous fuel and oxidizers. Includes Complete Functioning Fuel Cell Power Units; Fuel Cells; Fuel Cell Assemblies or Modules; Fuel Cell Reactant Chambers; Fuel Feed Mechanisms; Electrolyte Heaters; Heat Exchangers; and other internal components peculiar to, and used exclusively on or with, Fuel Cell Power Units classified in this class. Excludes Primary Batteries (FSC 6135); Secondary Batteries (FSC 6140); Generators and Generating Sets (FSC 6115); and items for which more suitable classes are specifically prescribed by the indexes and structure of the FSC.	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
-\N	Cat	6117	FSC	0	Solar Electric Power Systems	Solar Electric Power Systems	Note-This class includes items which are designed for the direct conversion of solar energy into electrical power.  	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
-\N	Cat	6120	FSC	0	Transformers: Distribution and Power Station	Transformers: Distribution and Power Station	Note This class includes transformers with a kilovolt-ampere rating above 1 kva.  Excludes Potential and Current Transformers	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
-\N	Cat	6125	FSC	0	Converters, Electrical, Rotating	Converters, Electrical, Rotating	Note-This class includes devices employing mechanical rotation for changing electrical energy from one form to another (i.e., AC to AC, DC to DC, AC to DC, and DC to AC). Excluded from this class are electrical generators and generator sets (FSC 6115). Includes Complete Battery Charging Equipment, Rotating; Dynamotors; Motor-Converters; Motor-Generator Sets; Phase Converters; Rotating Equipment; Synchronous Converters. Excludes Nonrotating Equipment.	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
-\N	Cat	6130	FSC	0	Converters, Electrical, Nonrotating	Converters, Electrical, Nonrotating	Note This class includes devices employing a means other than mechanical rotation for changing electrical energy from one form to another (i.e., AC to AC, DC to DC, AC to DC, and DC to AC). Includes Complete Battery Charging Equipment, Nonrotating; Power Supplies, Multiapplication. Excludes Rectifying Tubes; (FSC 5960); Rectifying Crystals (FSC 5961); Rotating Equipment (FSC 6125); Transformers (FSC 5950); and Semiconductor Devices and Associated Hardware (FSC 5961).	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
-\N	Cat	6135	FSC	0	Batteries, Nonrechargeable	Batteries, Nonrechargeable	 Includes Cells and Dry Batteries; Nuclear Batteries. 	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
-\N	Cat	6140	FSC	0	Batteries, Rechargeable	Batteries, Rechargeable	 Includes Rechargeable Cells and Batteries. 	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
-\N	Cat	6145	FSC	0	Wire and Cable, Electrical	Wire and Cable, Electrical	Note-This class includes only bulk electrical wire and cable. Excluded from this class are electrical wire and cable items of definite length either with processed ends, or terminated in fittings. Includes Insulated and Noninsulated, Wire and Cable, such as, Antenna Wire, Coaxial Cable, Fuse and Resistance Wire, and Magnet Wire. Excludes Radio Frequency Transmission Line (FSC 5985); Fiber Optic Cable (FSC 6015); Communication Cable Assemblies (FSC 5995); Distribution and Power Transmission Cable Assemblies (FSC 6150).	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
-\N	Cat	6150	FSC	0	Miscellaneous Electric Power and Distribution Equipment	Miscellaneous Electric Power and Distribution Equipment	 Includes Appliance and Extension Cords; Electric Power and Distribution Cable with Attachments, Multiapplication; Common Components of Electrical Rotating Equipment, such as End Bells and Frames. 	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
-\N	Cat	6160	FSC	0	Miscellaneous Battery Retaining Fixtures and Liners	Miscellaneous Battery Retaining Fixtures and Liners	 Includes Battery Boxes, Covers, Liners, Racks, Retainers, and Trays. 	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
-\N	Cat	6210	FSC	0	Indoor and Outdoor Electric Lighting Fixtures	Indoor and Outdoor Electric Lighting Fixtures	 Includes Airport, Railroad Platform, Stadium, and Street Lighting Fixtures. Excludes Nonelectrical Outdoor Fixtures; Signal Fixtures; Nonelectrical Indoor Fixtures.	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
-\N	Cat	6220	FSC	0	Electric Vehicular Lights and Fixtures	Electric Vehicular Lights and Fixtures	 Includes Automotive, Marine, Railroad, and Aircraft Lights and Fixtures. Excludes Nonelectrical Vehicular Fixtures.	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
-\N	Cat	6230	FSC	0	Electric Portable and Hand Lighting Equipment	Electric Portable and Hand Lighting Equipment	 Includes Floodlights; Searchlights; Extension Lights. Excludes Nonelectrical Portable and Hand Lighting Equipment; Signal and Alarm Equipment.	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
-\N	Cat	6240	FSC	0	Electric Lamps	Electric Lamps	 Includes Fluorescent Lamps; Incandescent Lamps, Large and Miniature; Mercury Lamps; Sodium Lamps. 	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
-\N	Cat	6250	FSC	0	Ballasts, Lampholders, and Starters	Ballasts, Lampholders, and Starters	  	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
-\N	Cat	6260	FSC	0	Nonelectrical Lighting Fixtures	Nonelectrical Lighting Fixtures	 Includes Lanterns, Nonelectrical; Hand and Portable Carbide Lamps; Candles. 	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
-\N	Cat	6310	FSC	0	Traffic and Transit Signal Systems	Traffic and Transit Signal Systems	  Excludes Railroad Signals.	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
-\N	Cat	6320	FSC	0	Shipboard Alarm and Signal Systems	Shipboard Alarm and Signal Systems	  	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
-\N	Cat	6330	FSC	0	Railroad Signal and Warning Devices	Railroad Signal and Warning Devices	 Includes Railroad Gates; Flasher Lights; Block Signals. Excludes Semaphore Flag Signals.	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
-\N	Cat	6340	FSC	0	Aircraft Alarm and Signal Systems	Aircraft Alarm and Signal Systems	 Includes Oxygen Pressure Signals and Warning Devices; such as Air Pressure Warning Signals, Aircraft Crew Warning Signals, Altitude Warning Signals, Alarm Controls, Audible Landing Gear Alarms. Excludes Aircraft Engine Oil and Fuel Warning Devices.	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
-\N	Cat	6350	FSC	0	Miscellaneous Alarm, Signal, and Security Detection Systems	Miscellaneous Alarm, Signal, and Security Detection Systems	 Includes Anti-intrusion Alarm Systems; Foghorns; Gongs; Chimes; Bells; Burglar Alarm Systems; Fire Alarms; Police Alarm Systems; Sounding Devices; Manual Gas Alarms; Landing Wands. Excludes Loran; Radar; Sonar; Engine Oil and Fuel Warning Devices; Aircraft Oxygen Warning Devices.	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
-\N	Cat	6505	FSC	0	Drugs and Biologicals	Drugs and Biologicals	Only items specifically formulated for human use are appropriate to this class. Includes all drugs, medicinal grade chemicals, and Biologicals subject to the Federal Food, Drug and Cosmetic Act, listed in the Monograph section of the U.S. Pharmacopeia or the National Formulary or covered by the United States Adopted Names (USAN). Other nations may apply their own legal documents. Excludes medicated cosmetics and toiletries classifiable in FSC 6508 and in vitro diagnostic substances and reagents classifiable in FSC 6550, and Veterinary Drugs and Biologicals classifiable in FSC 6509.	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
-\N	Cat	6508	FSC	0	Medicated Cosmetics and Toiletries	Medicated Cosmetics and Toiletries	 Includes medicated cosmetics and toiletries that have been determined to be drugs in accordance with the Federal Food, Drug, and Cosmetic Act. Excludes nonmedicated cosmetics and toiletries which are classifiable in Group 85.	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
-\N	Cat	6509	FSC	0	Drugs and Biologicals, Veterinary Use	Drugs and Biologicals, Veterinary Use	 Includes All Drugs, medicinal grade chemical, and Biologicals subject to the provisions of the Department of Agriculture (Veterinary Drugs and Biologicals) specifically formulated for Veterinary use. Other Nations may apply their own legal documents. Excludes Drugs and Biologicals specifically formulated for Human use classifiable in FSC 6505.	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
-\N	Cat	6510	FSC	0	Surgical Dressing Materials	Surgical Dressing Materials	 Includes Bandages, Compresses, Dressings, Gauze, Pads, Sponges, and impregnated surgical dressing materials. 	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
-\N	Cat	6515	FSC	0	Medical and Surgical Instruments, Equipment, and Supplies	Medical and Surgical Instruments, Equipment, and Supplies	 Includes Anesthesia Apparatus; Blood Transfusion Apparatus; Oxygen Therapy Apparatus; Respirators; Orthopedic Supplies; Arch Supports; Clinical Thermometers; Sutures; Hearing Aids; Veterinary Equipment; Endoscopes, Fiber Optic. Excludes Opthalmic Instruments, Equipment, and Supplies; Non-Medical Endoscopes.	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
-\N	Cat	6520	FSC	0	Dental Instruments, Equipment, and Supplies	Dental Instruments, Equipment, and Supplies	 Includes Dental Engines; Dental Laboratory Equipment; Operating Chairs; Orthodontic Appliances; Teeth; Dental Metals; Dental Abrasives; Dental Laboratory Furniture. 	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
-\N	Cat	6525	FSC	0	X-ray Equipment and Supplies: Medical, Dental, Veterinary	X-ray Equipment and Supplies: Medical, Dental, Veterinary	 Includes Medical X-ray Film; Medical X-Ray Film Viewing Equipment; Medical X-Ray Film Processing and Finishing Equipment and Supplies; X-Ray Tubes. Excludes Industrial X-Ray Equipment.	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
-\N	Cat	6530	FSC	0	Hospital Furniture, Equipment, Utensils, and Supplies	Hospital Furniture, Equipment, Utensils, and Supplies	 Includes Orthopedic Equipment; Operating Lights; Physiotherapy Equipment; Sterilizers; WheelChairs; Litters; Hospital Beds; Restraint Equipment. 	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
-\N	Cat	6532	FSC	0	Hospital and Surgical Clothing and Related Special Purpose Items	Hospital and Surgical Clothing and Related Special Purpose Items	 Includes Only those clothing items which are required exclusively for use in hospital operations, or in medical or dental facilities, which have no functional counterpart elsewhere in Federal Organizations participating in the Federal Catalog System. Excludes General purpose items of clothing and fabricated textile material.	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
-\N	Cat	6540	FSC	0	Ophthalmic Instruments, Equipment, and Supplies	Ophthalmic Instruments, Equipment, and Supplies	 Includes Ophthalmic Lens Cutting and Grinding Machine; Ophthalmic Lenses and Lens Blanks; Spectacle Frames; Ophthalmological and Optometric Instruments, Equipment, and Supplies. Excludes Optical Lens Cutting and Grinding Machines: Ophthalmoscope and Otoscope Set; Surgical Instruments and Supplies that can be used by other medical disciplines; i.e., sutures, eye pads, eye shields, eye bath, and the like.	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
-\N	Cat	6545	FSC	0	Replenishable Field Medical Sets, Kits, and Outfits	Replenishable Field Medical Sets, Kits, and Outfits	  Excludes Sets and kits which can be logically classified in another FSC Class in Group 65, such as Insect Sting Kit; Otoscope and Opthalmoscope Set; In Vitro Diagnostic Test Kits; and the like.	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
-\N	Cat	6550	FSC	0	In Vitro Diagnostic Substances, Reagents, Test Kits and Sets	In Vitro Diagnostic Substances, Reagents, Test Kits and Sets	 Includes In vitro diagnostic aids, such as test tablets, test slides, test strips, test cards, test papers, test solutions, reagents; sets and kits designated for in vitro qualitative and quantitative tests on specimens, such as blood, urine, feces, and the like, for the purposes of aiding in the medical diagnosis of disease, determining body organ dysfunction, or other abnormal conditions. Excludes In vitro diagnostic substances classifiable in FSC 6505.	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
-\N	Cat	6605	FSC	0	Navigational Instruments	Navigational Instruments	 Includes Azimuths; Sextants; Octants; Compasses; Plotting Boards; Underwater Log Equipment; Air Position Indicators; Drift Meters. 	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
-\N	Cat	6610	FSC	0	Flight Instruments	Flight Instruments	 Includes Air Speed Indicators; Rate of Climb Indicators; Bank and Turn Indicators; Pitot Tubes; Gyro Horizon Indicators; Attitude Gyro Indicators. Excludes Navigational Instruments (FSC 6605).	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
-\N	Cat	6615	FSC	0	Automatic Pilot Mechanisms and Airborne Gyro Components	Automatic Pilot Mechanisms and Airborne Gyro Components	Note Included in this class are gyro components of guided missiles. Excluded are complete gyro mechanisms and nonairborne gyro components, both of which are classified in the same classes as their next higher assemblies. Includes Automatic Pilot Regulators; Directional, Vertical, Bank and Turn, and Hydraulic Surface Gyro Controls; Airborne and Shipborne Automatic Pilot Mechanisms; Helicopter Automatic Stabilization Equipment. Excludes Automatic Pilot Training Devices (FSC 6930); and Automatic Pilot Mechanisms, Guided Missile (FSC 1420).	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
-\N	Cat	6620	FSC	0	Engine Instruments	Engine Instruments	Note-Instruments designed for use on both engines and other than engines are not included in this class and should be classified in the appropriate instruments class of Group 66. Includes All Engine Instruments, including Aircraft, Marine, and Vehicular; Fuel Pressure Gages; Manifold Pressure Gages; Oil Pressure Gages; Fuel Mixture Indicators; Engine Oil and Fuel Warning Devices. 	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
-\N	Cat	6625	FSC	0	Electrical and Electronic Properties Measuring and Testing Instruments	Electrical and Electronic Properties Measuring and Testing Instruments	Note-This class includes all "basic" types of electrical and electronic test instruments, such as ammeters, voltmeters, ohmmeters, multimeters, and similar instruments, even if specially designed. Excluded from this class by the modifier "except specially designed" are test instruments, other than "basic" instruments, which are specially designed for use with atomic ordnance, fire control, guided missile, motor vehicle, aircraft, or photographic equipment. Such specially designed test instruments are to be classified in other classes in the Federal Supply Classification.  This class includes communications test equipment, infrared test equipment designed for communication, and night vision maintenance and test specialized equipment. Includes Test Leads and Test Lead Attachments; Test instruments designed for communication equipment; Test instruments designed for use with electronic equipment classified in two or more FSC groups. Excludes Radiac Equipment	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
-\N	Cat	6630	FSC	0	Chemical Analysis Instruments	Chemical Analysis Instruments	 Includes Acidity (pH) Meters; Gas Analyzers; Alakalinity Measuring Instruments; Colorimeters. Excludes Gas Detecting Equipment; Manual Gas Alarms; Chemicals; In Vitro Diagnostic Substances and Reagents.	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
-\N	Cat	6635	FSC	0	Physical Properties Testing and Inspection	Physical Properties Testing and Inspection	 Includes Destructive and Nondestructive Inspection Equipment such as Fluorescent Penetrant Inspection Units; Magnetic Inspection Units; Industrial X-Ray Machines; Industrial X-Ray Film; Tensiometers; Material Hardness Testers. Excludes General prupose Measuring Tools (FSC 5210) and Precision Measuring Tools and Inspection Gages (FSC 5220).	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
-\N	Cat	6720	FSC	0	Cameras, Still Picture	Cameras, Still Picture	 Includes Aerial, Mapping, Microfilm, Photocopy, and Studio Cameras. Excludes X-Ray Cameras (FSC 6525), and Industrial X-Ray Machine (FSC 6635).	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
-\N	Cat	6730	FSC	0	Photographic Projection Equipment	Photographic Projection Equipment	 Includes Screens; Viewers; Photomap Projectors; Integrated Viewers/Printer and Microform storage and retrieval systems. 	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
-\N	Cat	6636	FSC	0	Environmental Chambers and Related Equipment	Environmental Chambers and Related Equipment	Note This class includes only those environmental chambers used exclusively to perform controlled tests, under simulated conditions, to determine physical damage and/or changes in operating characteristics for equipments and components such as Humidity; Immersion; Moisture; Altitude; Explosion; Thermal Shock; Sand and Dust; Flammability; Seal. Environmental chambers included in this class provide data regarding service life and behavior of various items equivalent to actual service conditions existing in the field. Includes Chambers; Wind Tunnels; Enclosures specifically designed to simulate an environmental condition; Weatherometers; Fadeometers; Specially designed equipment and components exclusively related to environmental chambers. Excludes General purpose prefabricated buildings, chambers, panels, and components (FSC 5410); Controlled Environmental Conditioning Kits and Sets (FSC 4240); Baths (FSC 4510); Ovens (FSC 7310); Kilns (FSC 3630); Radiosonde Baseline Check Sets (FSC 6660); Divers Recompression Chambers (FSC 4220); Altitude Training Decompression Chambers (FSC 6930); and Chambers used as training devices (FSC 6930); Checkout and Test Equipment (FSC 6625); Chemical Analysis Instruments (FSC 6630); Electrical and Electronic Properties Measuring and Testing Instruments (FSC 6625); and Meteorological Instruments (FSC 6660).	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
-\N	Cat	6640	FSC	0	Laboratory Equipment and Supplies	Laboratory Equipment and Supplies	 Includes Laboratory Glassware; Laboratory Funnels; Laboratory Furnaces; Glass Beads; Laboratory White Sand; Litmus Paper; Paper Filters; Insect Transfixion Pins; Laboratory Glass Wool; Laboratory Furniture, except Dental Laboratory. Excludes Instruments covered by other classes in group 66; Dental Laboratory Equipment; Laboratory Scales and Balances; In Vitro Diagnostic Substances and Reagents.	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
-\N	Cat	6645	FSC	0	Time Measuring Instruments	Time Measuring Instruments	 Includes Clocks; Job Recording Devices; Time Recorders; Time Stamps, Watch and Clock Movements; Watches. 	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
-\N	Cat	6650	FSC	0	Optical Instruments, Test Equipment, Components and Accessories	Optical Instruments, Test Equipment, Components and Accessories	 Includes Binoculars; Magnifiers; Microscopes; Periscopes; Telescopes; Optical Elements; such as Lens, Prisms, Windows; Optical Benches and Associated Devices; Endoscopes, Fiber Optics (Non-Medical). Excludes Fire Control Instruments, Optical; Surveying Instruments, Optical; Photogrammetric Instruments; Octants; and Sextants; Optical Instruments Integrated with Fire Control Equipment; Opthalmological Instruments; Electronic Fiber Optic Test Equipment; Medical Endoscopes.	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
-\N	Cat	6655	FSC	0	Geophysical Instruments	Geophysical Instruments	 Includes Geodetic, Oceanographic and Seismographic Instruments. Excludes Telescopes.	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
-\N	Cat	6660	FSC	0	Meteorological Instruments and Apparatus	Meteorological Instruments and Apparatus	 Includes Meteorological Ballons; Radiosonde Sets; Radarsonde Sets. 	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
-\N	Cat	6665	FSC	0	Hazard-Detecting Instruments and Apparatus	Hazard-Detecting Instruments and Apparatus	 Includes Radiac Equipment; Gas Detecting Equipment; Land Mine Detecting Equipment. Excludes Manual Gas Alarms (FSC 6350).	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
-\N	Cat	6670	FSC	0	Scales and Balances	Scales and Balances	 Includes Coin Operated, Household, Industrial, Postal, and Laboratory Scales and Balances. 	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
-\N	Cat	6675	FSC	0	Drafting, Surveying, and Mapping Instruments	Drafting, Surveying, and Mapping Instruments	 Includes Drawing Instruments, Drafting Tools; Engineering and Architectural Scales; Levels; Transits; Photogrammetric Instruments; Astrolabes; Level Rods; Plane Tables; Surveying Altimeters; Theodolites. Excludes Surveyors' Tapes.	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
-\N	Cat	6680	FSC	0	Liquid and Gas Flow, Liquid Level, and Mechanical Motion Measuring Instruments	Liquid and Gas Flow, Liquid Level, and Mechanical Motion Measuring Instruments	 Includes Liquid Level Float Instruments; Revolution Counters; Speedometers; Rotation Measuring Instruments and Apparatus; Oxygen Flow Indicators; Tachometers, including Engine Tachometers. Excludes Combination Instruments; (FSC 6695); Meteorological Instruments (FSC 6660); and Automatic Control Valves (FSG 48).	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
-\N	Cat	6685	FSC	0	Pressure, Temperature, and Humidity Measuring and Controlling Instruments	Pressure, Temperature, and Humidity Measuring and Controlling Instruments	 Includes Thermometers, including Engine Thermometers; Pressure Gages; Thermocouple Leads; Resistance Bulbs. Excludes Clinical Therometers; (FSC 6515); Thermostatic and Differential Pressure Switches (FSC 5930); and Meteorological Instruments (FSC 6660).	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
-\N	Cat	6695	FSC	0	Combination and Miscellaneous Instruments	Combination and Miscellaneous Instruments	 Includes Flow-Pressure Instruments; Taximeters; Dynamometers. Excludes Dental, Medical, Surgical, and Veterinary Instruments.	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
-\N	Cat	6710	FSC	0	Cameras, Motion Picture	Cameras, Motion Picture	 Includes Aerial and Mapping Cameras. Excludes Television Cameras, Nonairborne (FSC 5820); Television Cameras, Airborne (FSC 5821); Video Cameras (FSC 5836).	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
-\N	Cat	6740	FSC	0	Photographic Developing and Finishing Equipment	Photographic Developing and Finishing Equipment	 Includes Editing Equipment; Enlargers; Driers; Pressers; Printers; Washers. 	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
-\N	Cat	6750	FSC	0	Photographic Supplies	Photographic Supplies	 Includes Sensitized Photographic Paper; Special Purpose Photographic Chemicals; Unprocessed Film; Photoflash Lamps. Excludes X-Ray Film (Medical Class 6525 or Industrial Class 6635); Electrographic (Facsimile) Paper for direct electrostatic printing or copying (FSC 7530).	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
-\N	Cat	6760	FSC	0	Photographic Equipment and Accessories	Photographic Equipment and Accessories	 Includes Light Meters; Tripods; Filters; Range-finders; Photographic Floodlight Fixtures; Lenses; Specialized Photographic Test Equipment. Excludes Lamps (bulbs) (FSC 6240); Photoflash Lamps (FSC 6750).	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
-\N	Cat	6770	FSC	0	Film, Processed	Film, Processed	 Includes Motion Picture Film, Silent and Sound; Still Picture Film. Excludes X-Ray Film (Medical class 6525 or Industrial class 6635); Training and Educational Film (FSC 6910); Processed Microfilm (FSC 7670).	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
-\N	Cat	6780	FSC	0	Photographic Sets, Kits, and Outfits	Photographic Sets, Kits, and Outfits	  	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
-\N	Cat	6810	FSC	0	Chemicals	Chemicals	 Includes Naphtha Solvents; Water Softening Compounds; Tanning Materials, Natural or Synthetic; Dextrines and Starches; Inedible Gelatins; Acetone; Propellant Chemicals, Bulk, not Specialized Solely for Guided Missile Use. Excludes Medicinal Chemicals; Gases; Foundry dextrines; Radiographic and Photographic Chemicals; In Vitro Diagnostic Substances and Reagents.	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
-\N	Cat	6820	FSC	0	Dyes	Dyes	 Includes Household Tints 	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
-\N	Cat	6830	FSC	0	Gases: Compressed and Liquefied	Gases: Compressed and Liquefied	 Includes Fuel Gases. Excludes Military Chemical Gases; Medical Gases; Empty Gas Cylinders and their caps, valves, and valve spare parts.	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
-\N	Cat	6840	FSC	0	Pest Control Agents and Disinfectants	Pest Control Agents and Disinfectants	 Includes Insect Repellents; Fungicides; Insecticides; Rodenticides; Weed Killers. Excludes Personal Deodorants.	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
-\N	Cat	6850	FSC	0	Miscellaneous Chemical Specialties	Miscellaneous Chemical Specialties	 Includes Antifogging Compounds; Wetting Agents; Etching and Fountain Solutions for Lithographing; Blanket Repair Solutions for Lithographing; Antifreeze. 	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
-\N	Cat	6910	FSC	0	Training Aids	Training Aids	 Includes Mockups; Cutaway Models; Scale Models; Training Films; Training Aid Maps; Navigational Training Aids; Flight Instrument Training Aids; Aircraft Instrument Training Aids; Vehicle Training Aids; Engine Instrument Training Aids; Hydraulic System Training Aids; Cutaway, Mockup, or Sectionalized Ammunition only; Training Equipment normally used in classroom training. Excludes Drill, Dummy, Exercise, Practice, or Simulated Ammunition and Weapons.	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
-\N	Cat	6920	FSC	0	Armament Training Devices	Armament Training Devices	 Includes Bombing Trainers; Gunnery Trainers; Tow Targets; Gunnery Targets; Guided Missile Training Sets. Excludes Target Drones; Drones for such use as training, surveillance, missile evaluation, and photographic reconnaissance; Atomic Ordnance Training Devices; Training Aids; Drill, Dummy, Exercise, Practice, or Simulated Ammunition and Weapons.	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
-\N	Cat	6930	FSC	0	Operation Training Devices	Operation Training Devices	 Includes Link Trainers; Automatic Pilot Training Devices; Drift Meter Training Devices; Celestial Navigation Trainers; Dead Reckoning Navigation Trainers; Instrument Flying and Landing Trainers; Terrain Projection Trainers; All operational training devices except communication and armament. Excludes Training Aids.	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
-\N	Cat	6940	FSC	0	Communication Training Devices	Communication Training Devices	 Includes Supersonic Radar Trainers; Navigational Radar Trainers; Search and Detecting Radar Trainers; Code Practice Equipment. Excludes Training Aids.	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
-\N	Cat	7010	FSC	0	ADPE System Configuration	ADPE System Configuration	Note-a group of general purpose analog, digital, or hybrid electronic or electromechanical devices that are interconnected to operate as a system. Frequently referred to as an ADP system, although the term "system" is not considered definitive. Includes an assembly of devices consisting of a central processing unit (CPU) and the necessary input/output devices, accessorial devices, analog measurement devices, software and/or firmware required to perform the desired objectives. Also includes sub-assemblies and units in which input/output devices, CPUs, and/or accessorial devices or components are incorporated into a single assembly or unit. A specially designed device incorporated into a system shall not influence the classification of the base assembly or unit.  	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
-\N	Cat	7020	FSC	0	ADP Central Processing Unit (CPU, Computer), Analog	ADP Central Processing Unit (CPU, Computer), Analog	Note-An analog is a representation in one form of a physical condition existing in another form (e.g., the level of mercury in a tube represents temperature in a thermometer; the angular position of a needle represents speed on a speedometer). This class includes only CPUs that accept as inputs the electrical equivalent of physical conditions such as flow, temperature, pressure, angular position or voltage and perform computations by manipulating these electrical equivalents to produce results for further use.  	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
-\N	Cat	7021	FSC	0	ADP Central Processing Unit (CPU, Computer), Digital	ADP Central Processing Unit (CPU, Computer), Digital	Note-Digital refers to the representation of discrete numbers, symbols and alphabetic characters by a predetermined, coded combination of electrical impulses. This class includes only CPUs that accept information represented by digital impulses. Specifically, a device capable of performing sequences of arithmetic and logic operations (a program) not only on data but also on the program which is contained in its internal memory (storage) without intervention of an operator.  	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
-\N	Cat	7022	FSC	0	ADP Central Processing Unit (CPU, Computer), Hybrid	ADP Central Processing Unit (CPU, Computer), Hybrid	Note-Hybrid refers to a combination of analog and digital capability as defined in Classes 7020 and 7021 with conversion capability required for intercommunication.  	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
-\N	Cat	7025	FSC	0	ADP Input/Output and Storage Devices	ADP Input/Output and Storage Devices	Note This class includes devices used to control and transfer information to and from a Computer (as modified). The input device is used for transferring data and instructions into a computer. The output device is used to transfer results of processing by the computer to ADP peripheral devices. Input/output devices combine the above functions in the same device. This class includes printers, display units, disk drive units (magnetic, optical and floptical), tape drive units, terminals, data entry devices and transfer units. Also includes Optical Compact Disk (CD) devices used for the storage and retrieval of data and firmware.  	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
-\N	Cat	7030	FSC	0	ADP Software	ADP Software	Note-Software is a series of instructions or statements in a form acceptable to a CPU, designed to cause the ADPE configuration to execute an operation or operations; or a collection of data in a form capable of being processed and operated on by a computer. Includes System programs, such as operating systems, assemblers, compilers, executive routines, interpreters, translators; utility programs, such as sort/merge programs, media conversion, maintenance diagnostic programs; and application programs, such as payroll, inventory control, and engineering analysis programs. Excludes Software designed to Government specifications to satisfy the requirements of a particular user or for use with ADPE properly classifiable in an FSG other than FSG 70.   Also excludes operating manuals and programmers' manuals properly classified in FSG 76.	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
-\N	Cat	7035	FSC	0	ADP Support Equipment	ADP Support Equipment	Note This class includes various devices and associated control units which are designed for use in combination or conjunction with an ADPE configuration but are not part of the configuration itself.   ADP support equipment includes magnetic tape testing, certifying, and cleaning equipment; disk pack testing, certifying and cleaning equipment; tape equipment, rewinders, splicers, spoolers and card reconditioners.  Included in this class are complete units and components of related general purpose commercially available support equipment which are not specifically designed for use as part of a system such as a weapon system, control system, digital image processing system, missile system, communication system or navigation system. Also included are support control systems and components not specifically designed for use with process control such as automatic machine tool processing operations in which flow, pressure, temperature or other parameters are controlled by instrument regulations in automatic machine tool and process operations.  	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
-\N	Cat	7040	FSC	0	Punched Card Equipment	Punched Card Equipment	 Includes Collating machines, key punch machines, tabulating machines; verifiers; reproducers; summary punches, sorters; interpreters. Excludes Card actuated machines designed for use with an ADPE system.	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
-\N	Cat	7042	FSC	0	Mini and Micro Computer Control Devices	Mini and Micro Computer Control Devices	 Includes Mini or micro computers used as control mechanisms where computer technology is essential in controlling, monitoring, measuring, and directing processes, devices, instruments or other equipment. Excludes Mini and micro computer control devices which are designed specifically for use in and/or integral to higher order systems, e.g., aircraft fire control systems, numerically controlled machine tools, sequence controlled printing equipment, motion measuring instruments, office information system equipment, and the like.	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
-\N	Cat	7045	FSC	0	ADP Supplies	ADP Supplies	Note This class includes ADP tape seal bands, reels and hubs, carrying cases, canisters, and the like. Also includes all nonrecorded magnetic recording media designed to be used with ADP equipment, such as magnetic tape, removable disk packs, magnetic cards, cassettes, and diskettes. Also includes Optical Disks used for the storage of data.  	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
-\N	Cat	7050	FSC	0	ADP Components	ADP Components	Note-This class includes ADP Component Assemblies that are parts of analog, digital or hybrid data processing devices. Excluded from the class are items for which more specific classifications are suitable. The FSC structure and indexes will govern the classification of those items permitted classification in a single class only.  	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
-\N	Cat	7105	FSC	0	Household Furniture	Household Furniture	 Includes Bedsprings, Open Style (All-metallic); Folding Chairs; Camp Furniture; Mirrors, Wall Mounting and Furniture Types; Smoking Stands. Excludes Hospital Beds and Bedsprings; Ash Trays; Mattresses; Bedsprings, Box Style (Fabric Covered).	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
-\N	Cat	7110	FSC	0	Office Furniture	Office Furniture	 Includes Filing Cabinets; Safes; Post Office Furniture; School Furniture; Blackboards. Excludes Dental X-Ray Film Protective Safes; Visible Record Equipment.	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
-\N	Cat	7125	FSC	0	Cabinets, Lockers, Bins, and Shelving	Cabinets, Lockers, Bins, and Shelving	 Includes Kitchen Cabinets; Sectional Shelving. Excludes Foot Lockers; Filing Cabinets.	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
-\N	Cat	7195	FSC	0	Miscellaneous Furniture and Fixtures	Miscellaneous Furniture and Fixtures	 Includes Stone, Clay, and Concrete Furniture; Auditorium and Theater Furniture; Library Furniture; Cashier Stands. 	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
-\N	Cat	7210	FSC	0	Household Furnishings	Household Furnishings	 Includes Household Furnishings of Textiles, Plastics, Paper, Rubber, and other materials; Sheets, Pillows, Blankets, and other Bedding; Insect Bars; Tablecloths; Towels; Steamer Rugs; Mattresses; Bedsprings, Box style (Fabric Covered); Bedspring and Mattress Sets. Excludes Floor Coverings; Curtains; Draperies; Paper Napkins; Paper Doilies; Bedsprings, Open Style (All-Metallic).	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
-\N	Cat	7220	FSC	0	Floor Coverings	Floor Coverings	 Includes Linoleum; Rubber and Asphalt Tile; Carpets; Rugs; Rug Pads. Excludes Vehicular Floor Mats.	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
-\N	Cat	7230	FSC	0	Draperies, Awnings, and Shades	Draperies, Awnings, and Shades	 Includes Curtains; Specialized Hardware and Fittings for Curtains, Draperies, Venetian Blinds, and Window Shades. 	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
-\N	Cat	7240	FSC	0	Household and Commercial Utility Containers	Household and Commercial Utility Containers	 Includes Refuse Cans; Sprinkling Cans; Clothes Hampers; Household Basket; Fabric Utility Containers. 	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
-\N	Cat	7290	FSC	0	Miscellaneous Household and Commercial Furnishings and Appliances	Miscellaneous Household and Commercial Furnishings and Appliances	 Includes Fireplace Sets; Vases and Urns; Household Sewing Machines. 	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
-\N	Cat	7310	FSC	0	Food Cooking, Baking, and Serving Equipment	Food Cooking, Baking, and Serving Equipment	Note-This class includes warming and/or chilling equipment used for the display and serving of food. Includes Warming and/or Chilling Tables, Stationary and Portable; Serving Carts; Field and Mobile Baking Ovens; Toasters; Waffle Irons; Grills; Special Aircraft, Marine, and Railway Type Food Cooking Equipment; Utensils with Integral Heating Units; Cafeteria Type Display Cases and Showcases; Soda Fountains; Milk, Soda, and/or Ice Cream Dispensers; Cold Food Counters; Combination Heated-Refrigerated Food Serving Equipment; Carbonators; and other types of refrigerated food serving and display equipment commonly used in cafeterias, mess hall kitchens, and the like. Excludes Carts other than Serving; Commissary or Food Store Type Refrigeration Equipment; Commercial Household, or Professional and Scientific Refrigerators; Drinking Fountains; (see Class 4110 for items excluded from Class 7310).	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
-\N	Cat	7320	FSC	0	Kitchen Equipment and Appliances	Kitchen Equipment and Appliances	 Includes Dishwashing Machines; Food Slicing Machines; Food Mixers; Utility Carts Specially designed for use in Kitchen and Dining Area. Excludes Sinks; Serving Carts (see Class 7310 for Food Serving Carts).	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
-\N	Cat	7330	FSC	0	Kitchen Hand Tools and Utensils	Kitchen Hand Tools and Utensils	 Includes Pots; Pans; Can Openers; Graters; Food Mashers; Cleavers; Vacuum Bottles and Jugs. Excludes Utensils with Integral Heating Units; Knives; Forks; Spoons.	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
-\N	Cat	7340	FSC	0	Cutlery and Flatware	Cutlery and Flatware	 Includes Knives; Forks; Spoons; Hunting Knives. 	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
-\N	Cat	7350	FSC	0	Tableware	Tableware	 Includes China and Earthenware; Glassware; Paper Plates and Cups. 	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
-\N	Cat	7360	FSC	0	Sets, Kits, Outfits and Modules, Food Preperation and Serving	Sets, Kits, Outfits and Modules, Food Preperation and Serving	  	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
-\N	Cat	7420	FSC	0	Accounting and Calculating Machines	Accounting and Calculating Machines	 Includes Accounting and adding machines and electronic calculators. Excludes Punched card system machines; Machines or devices that can be applied to a variety of problems by the internal execution of a series of instructions, not limited to specific keystroke functions, but controlled by a general purpose data processing language.	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
-\N	Cat	7430	FSC	0	Typewriters and Office Type Composing Machines	Typewriters and Office Type Composing Machines	 Includes Typewriters and office type composing machines with built-in electric/electronic functions such as margins, headings, tabs, centering and related actions. Excludes Typewriters and office type composing machines which are designed primarily for use as a component of an ADPE system or that are user programmable, and that can be applied to a variety of applications by the internal execution of a series of instructions, not limited to specific keystroke functions, but controlled by some form of general purpose data processing language.	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
-\N	Cat	7435	FSC	0	Office Information System Equipment	Office Information System Equipment	 Includes Minicomputer and microcomputer controlled systems specifically designed for user programmable processing of the office information application; Connected peripheral equipment; Automatic repetitive typewriters; Text editing typewriters and video display text editing typewriters. Excludes General purpose ADPE which is designed primarily to be applied through the internal execution of a series of instructions, not limited to specific keystroke functions, but controlled by a general purpose data processing language, to process a variety of applications such as financial management, logistics, scientific, communications, and the like.	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
-\N	Cat	7450	FSC	0	Office Type Sound Recording and Reproducing Machines	Office Type Sound Recording and Reproducing Machines	 Includes Dictating Machines; Transcribing Machines; Combination Dictating and Transcribing Machines. Excludes Communication Type Sound Recording and Reproducing Machines.	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
-\N	Cat	7460	FSC	0	Visible Record Equipment	Visible Record Equipment	 Includes Manually operated and power operated visible record equipment; visible index files, rotary and stationary; specially designed components, such as Wire and Bar Pockets, Cover Plates, Stop Wires, and Channel Stops; Control Boards; Binder Racks; devices and systems designed to automatically store and retrieve hard copy documents. For those microform automatic retrieval systems that contain an integral viewer or view/printer, see Class 6730. 	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
-\N	Cat	7490	FSC	0	Miscellaneous Office Machines	Miscellaneous Office Machines	 Includes Addressing Machines; Check Handling Machines; Coin Counting Machines; Mailing Machines, Currency Handling Machines. Excludes Pencil Sharpeners; Staplers, Office Type; Duplicating Equipment.	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
-\N	Cat	7510	FSC	0	Office Supplies	Office Supplies	 Includes Crayons; Erasers; File Holders; Writing Ink; Printing Ink; Paper Fasteners; Pencils; Penholders and Pen Points; Rulers, Office Type; Art Supplies; Tape, Pressure Sensitive Adhesive. Excludes Office Devices; Fountain Pens; Artists' Brushes; Paper Stationery; Record Forms; Mechanical Pencils.	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
-\N	Cat	7520	FSC	0	Office Devices and Accessories	Office Devices and Accessories	 Includes Copyholders; Fountain Pens and Pen Desk Sets; Pencil Sharpeners; Paper Punches; Staplers, Office Type; Artists' Accessories, such as Easels, Airbrushes; Slide Rules. 	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
-\N	Cat	7530	FSC	0	Stationery and Record Forms	Stationery and Record Forms	 Includes Business Forms; Record Books; Surveyors' Computation Forms; Electric Accounting Machine (EAM) Cards; Forms approved for use within individual government activities. Excludes Standard forms approved for government-wide use.	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
-\N	Cat	7540	FSC	0	Standard Forms	Standard Forms	 Includes Only those standard forms approved for government-wide use by the government activities empowered to do so (such as the U.S. Bureau of the Budget and the U.S. General Accounting Office, and similar organizations in other NATO countries). Excludes Forms approved for use within individual government activities.	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
-\N	Cat	7610	FSC	0	Books and Pamphlets	Books and Pamphlets	 Includes Technical and Nontechnical Books and Pamphlets; Regulations; Instruction Manuals; Technical Orders. Excludes Sheet and Book Music; Periodicals; Bibles.	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
-\N	Cat	7630	FSC	0	Newspapers and Periodicals	Newspapers and Periodicals	  	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
-\N	Cat	7640	FSC	0	Maps, Atlases, Charts, and Globes	Maps, Atlases, Charts, and Globes	  Excludes Training Aid Maps	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
-\N	Cat	7641	FSC	0	Aeronautical Maps, Charts and Geodetic Products	Aeronautical Maps, Charts and Geodetic Products	  	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
-\N	Cat	7642	FSC	0	Hydrographic Maps, Charts and Geodetic Products	Hydrographic Maps, Charts and Geodetic Products	  	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
-\N	Cat	7643	FSC	0	Topographic Maps, Charts and Geodetic Products	Topographic Maps, Charts and Geodetic Products	  	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
-\N	Cat	7644	FSC	0	Digital Maps, Charts and Geodetic Products	Digital Maps, Charts and Geodetic Products	  	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
-\N	Cat	7650	FSC	0	Drawings and Specifications	Drawings and Specifications	 Includes Federal, Military, and Departmental Specifications. 	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
-\N	Cat	7660	FSC	0	Sheet and Book Music	Sheet and Book Music	  Excludes Hymnbooks.	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
-\N	Cat	7670	FSC	0	Microfilm, Processed	Microfilm, Processed	  	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
-\N	Cat	7690	FSC	0	Miscellaneous Printed Matter	Miscellaneous Printed Matter	 Includes Decals; Printed Posters; Printed Labels. Excludes Sheet and Book Music.	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
-\N	Cat	7710	FSC	0	Musical Instruments	Musical Instruments	Note-This class includes only complete musical instruments. Assemblies, parts, attachments, or accessories for use in or on musical instruments are classified in classes other than this class.  Excludes Phonographs; Radios; Television Sets.	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
-\N	Cat	7720	FSC	0	Musical Instrument Parts and Accessories	Musical Instrument Parts and Accessories	 Includes Instrument Cases; Music Stands; Tuning Forks. 	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
-\N	Cat	7730	FSC	0	Phonographs, Radios, and Television Sets: Home Type	Phonographs, Radios, and Television Sets: Home Type	Note-This class includes only complete home-type phonographs, complete home-type radios, and complete home-type television sets. End items, assemblies, parts, attachments, or accessories for use in or on the above are classified in classes other than this class. Includes Combination Sets. Excludes Coin Operated Phonographs; Wire and Tape Recorders.	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
-\N	Cat	7740	FSC	0	Phonograph Records	Phonograph Records	  Excludes Training Aid Records.	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
-\N	Cat	7810	FSC	0	Athletic and Sporting Equipment	Athletic and Sporting Equipment	 Includes Baseball Equipment; Basketballs; Boxing Gloves; Fencing Masks; Fishing Tackle, except Commercial; Handballs; Shin Guards, Hockey. Excludes Athletic and Sports Clothing.	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
-\N	Cat	7820	FSC	0	Games, Toys, and Wheeled Goods	Games, Toys, and Wheeled Goods	 Includes Baby Carriages; Checkers; Doll Carriages; Dolls; Playing Cards; Velocipedes; Handicraft Kits, not elsewhere classifiable. 	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
-\N	Cat	7830	FSC	0	Recreational and Gymnastic Equipment	Recreational and Gymnastic Equipment	 Includes Slides; Swings; Amusement Park and Shooting Gallery Equipment; Play Yard and Playground Equipment; Billiard and Pool Tables and Equipment; Gymnasium Equipment. 	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
-\N	Cat	7910	FSC	0	Floor Polishers and Vacuum Cleaning Equipment	Floor Polishers and Vacuum Cleaning Equipment	 Includes Domestic and Industrial Vacuum Cleaning Equipment; Carpet Sweepers. Excludes Self-propelled and Trailer Mounted Vacuum Cleaners.	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
-\N	Cat	7920	FSC	0	Brooms, Brushes, Mops, and Sponges	Brooms, Brushes, Mops, and Sponges	 Includes Squeegees; Whisk Brooms. Excludes Hair Brushes; Toothbrushes; Paint and Artists' Brushes.	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
-\N	Cat	7930	FSC	0	Cleaning and Polishing Compounds and Preparations	Cleaning and Polishing Compounds and Preparations	 Includes Scouring Powders; Washing Compounds; Detergents; Nontoilet Soaps; Automobile and Household Polishes and Waxes. Excludes Shaving Soap; Toilet Soap; Abrasive Polishing Compounds; Metal Finishing Abrasives; Surgical Detergents.	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
-\N	Cat	8010	FSC	0	Paints, Dopes, Varnishes, and Related Products	Paints, Dopes, Varnishes, and Related Products	 Includes Water Paints; Oil Paints and Latex; Driers; Paint Primers; Lacquers; Paint Sealers; Pigments for Coloring; Stains; Turpentine; Paint Removers. Excludes Acetone, Wood and Wall Fillers.	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
-\N	Cat	8020	FSC	0	Paint and Artists' Brushes	Paint and Artists' Brushes	  Excludes Airbrushes.	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
-\N	Cat	8030	FSC	0	Preservative and Sealing Compounds	Preservative and Sealing Compounds	 Includes Fire Resistant Compounds; Water Resistant Compounds; Weather Resistant Compounds; Belt Dressing; Antiseize Compounds; Calking and Glazing Compounds; Putties; Wood and Metal Fillers. Excludes Food Preservative Compounds.	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
-\N	Cat	8040	FSC	0	Adhesives	Adhesives	 Includes Glue; Mucilage; Sizes; Adhesive Cements. 	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
-\N	Cat	8105	FSC	0	Bags and Sacks	Bags and Sacks	 Includes Shipping and Protective Envelopes; Liners for Bags and Sacks; Textile and Paper Laminated Shipping Bags; Closures for Bags and Sacks. 	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
-\N	Cat	8110	FSC	0	Drums and Cans	Drums and Cans	 Includes Barrels; Kegs; Shipping and Storage Pails; Collapsible Tubes; Mailing and Filing Tubes; Closures for Drums and Cans. 	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
-\N	Cat	8115	FSC	0	Boxes, Cartons, and Crates	Boxes, Cartons, and Crates	 Includes Shoe Boxes; Beer Cases; Pill Boxes; Piano Cases; Engine Boxes; Bombsight Boxes. Excludes Special boxes, packages, and containers designed primarily for shipping, storage, and handling of ammunition, nuclear ordnance, explosives, guided missiles, military chemical agents; and repairable/reusable containers specially designed for specialized equipment such as the "Shipping and Storage Container" for components of aircraft, space vehicles, automotive vehicles, ships, ground communication equipment.	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
-\N	Cat	8120	FSC	0	Commercial and Industrial Gas Cylinders	Commercial and Industrial Gas Cylinders	Note-This class includes empty commercial and industrial gas cylinders and their caps, valves, and valve spare parts.  Excludes Filled gas cylinders and items related to gaseous and liquefied gaseous dispensing systems, both mobile and installed. All components of installed gas dispensing systems are classified by "application" or "function" with the end equipment for which designed.	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
-\N	Cat	8125	FSC	0	Bottles and Jars	Bottles and Jars	 Includes Shipping Jugs and Carboys; Ampoules. 	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
-\N	Cat	8130	FSC	0	Reels and Spools	Reels and Spools	  	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
-\N	Cat	8135	FSC	0	Packaging and Packing Bulk Materials	Packaging and Packing Bulk Materials	 Includes Wrapping Paper; Moisture Vapor Barrier Paper; Excelsior; Wadding for Packing; Corrugated Paper; Baling Bands, Baling Ties; Shipping Tags; Gummed Paper Tape; Separators; Box Liners; Packaging Staples; Baling Wire; Preformed Cushioning Inserts. Excludes Adhesives; Aluminum Foil other than for food handling and processing.	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
-\N	Cat	8140	FSC	0	Ammunition and Nuclear Ordnance Boxes, Packages and Special Containers	Ammunition and Nuclear Ordnance Boxes, Packages and Special Containers	Note-This class includes only containers and fittings which are specifically designed for the storage, handling, and shipping of ammunition, explosives, and military chemical agents. Includes All shipping and storage containers specially designed for guided missiles, major missile sections, missile warheads, and other guided missile components. Excludes General Purpose Containers, Shipping and storage reusable/repairable containers specially designed for components of aircraft, space vehicles, automotive vehicles, ships, and ground communication equipment.	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
-\N	Cat	8145	FSC	0	Specialized Shipping and Storage Containers	Specialized Shipping and Storage Containers	Note-This class includes only reusable and repairable containers specially designed for shipping and storage of specialized equipment; i.e., shipping and storage containers for components of aircraft, space vehicles, automotive vehicles, ships, ground communication equipment, etc. Includes Specially designed components (not elsewhere classifiable) peculiar to special shipping and storage containers as delimited under this class. Excludes General purpose containers; specially designed containers for ammunition, nuclear ordnance, explosives, military chemical agents and guided missile components. Excluded from this class are items for which more specific classifications are suitable. The FSC Indexes and Structure will govern the classification of those items permitted classification in a single class only.	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
-\N	Cat	8305	FSC	0	Textile Fabrics	Textile Fabrics	Note-This class includes only textiles in bulk. Excluded from this class are items that are precut or preformed, thus limiting their usefulness to specific applications. Such items are classified in the same class as the item or items for which designed, or in such other class as is appropriate. Includes Canvas Materials; Plastic Fabrics; Felt Materials; Netting, Plastic and Textile; Oilcloth; Textile Scrap. Excludes Carpeting.	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
-\N	Cat	8310	FSC	0	Yarn and Thread	Yarn and Thread	  	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
-\N	Cat	8315	FSC	0	Notions and Apparel Findings	Notions and Apparel Findings	 Includes Buttons; Dressmakers' Pins; Needles; Shoulder Pads; Embroideries; Stamped Art Goods for Embroidery and Art Needlework; Hair Nets; Sewing Kits. Excludes Yarn; Thread; General Purpose Buckles.	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
-\N	Cat	8320	FSC	0	Padding and Stuffing Materials	Padding and Stuffing Materials	 Includes Feathers and Downs, Processed; Spanish Moss, Processed; Cotton Wadding and Batting; Kapok. Excludes Feathers and Downs, Unprocessed.	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
-\N	Cat	8325	FSC	0	Fur Materials	Fur Materials	Note-This class includes only fur materials in bulk. Excluded from this class are items that are precut or preformed, thus limiting their usefulness to specific applications. Such items are classified in the same class as the item or items for which designed, or in such other class as is appropriate. Includes Crosses; Sacs; Fur Plates; Fur Mats. 	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
-\N	Cat	8330	FSC	0	Leather	Leather	 Includes Garment Leather; Patent Leather; Glove Leather; Shoe Leather; Upholstery Leather; Industrial Leather. Excludes Belting; Shoe Findings.	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
-\N	Cat	8335	FSC	0	Shoe Findings and Soling Materials	Shoe Findings and Soling Materials	 Includes Counters; Taps; Shoe Laces; Lasts and Last Sole Patterns; Ornamental Shoe Buckles and Bows. 	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
-\N	Cat	8340	FSC	0	Tents and Tarpaulins	Tents and Tarpaulins	Note-Fitted covers which are specifically designed for use on or with specific individual types of equipment are excluded from this class and are to be classified in the same classes as the items for which they are designed, or in such other classes as are appropriate. Includes Tent Pins; Tent Poles; Multiple purpose covers of woven or unwoven fabrics, not for permanent installation. 	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
-\N	Cat	8345	FSC	0	Flags and Pennants	Flags and Pennants	 Includes Signalling Flags; Flagstaffs; Signal Shapes; Flagpoles; Flagstaff Trucks; Speed Cones; Flagstaff Belts; Semaphore Flags. 	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
-\N	Cat	8405	FSC	0	Outerwear, Men's	Outerwear, Men's	 Includes Uniforms, Military and Nonmilitary; Civilian Outerwear; Headwear; Work Clothing (Ordinary Nonsafety); Shirts; Trousers; Coats. Excludes Items included in other classes such as Special Purpose Clothing; Helmets, Steel and Plastic; Safety Clothing; Handwear; Footwear.	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
-\N	Cat	8410	FSC	0	Outerwear, Women's	Outerwear, Women's	 Includes Uniforms, Military and Nonmilitary; Civilian Outerwear; Headwear; Work Clothing (Ordinary Nonsafety); Shirts; Skirts; Blouses. Excludes Items included in other classes such as Special Purpose Clothing; Helmets, Steel and Plastic; Safety Clothing; Handwear; Footwear.	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
-\N	Cat	8415	FSC	0	Clothing, Special Purpose	Clothing, Special Purpose	Note-This class includes conventional winter, summer, and intermediate flight clothing ensembles and their components. Excluded from this class are specialized antiexposure, antigravity, partial pressure, and full pressure, flight ensembles and their specialized components. Includes Special Purpose Headwear, including Helmets, except Ballistic Protective; Safety and Protective Clothing; Athletic Clothing; Safety, Combat, Protective, and Work Gloves; Submarine Deck Exposure Clothing; Flight Clothing Components designed for use with both Specialized and Conventional Ensembles. Excludes Sporting and Athletic Gloves; Athletic Footwear; Safety Footwear; Personal Armor; Special Hospital and Surgical Clothing. Excludes special purpose clothing wherein the primary purpose is ballistic resistant protection. This class will include common use components of both ballistic and conventional end items.	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
-\N	Cat	8420	FSC	0	Underwear and Nightwear, Men's	Underwear and Nightwear, Men's	  	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
-\N	Cat	8425	FSC	0	Underwear and Nightwear, Women's	Underwear and Nightwear, Women's	 Includes Corsets; Girdles. 	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
-\N	Cat	8430	FSC	0	Footwear, Men's	Footwear, Men's	 Includes Rubber Footwear; Athletic Footwear; Safety Footwear; Submarine Deck Exposure Footwear. 	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
-\N	Cat	8435	FSC	0	Footwear, Women's	Footwear, Women's	 Includes Rubber Footwear; Athletic Footwear; Safety Footwear. 	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
-\N	Cat	8440	FSC	0	Hoisery, Handwear, and Clothing Accessories, Men's	Hoisery, Handwear, and Clothing Accessories, Men's	 Includes Handkerchiefs; Suspenders; Garters; Belts; Dress Handwear; Leggings, Nonsafety Type. 	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
-\N	Cat	8445	FSC	0	Hoisery, Handwear, and Clothing Accessories, Women's	Hoisery, Handwear, and Clothing Accessories, Women's	 Includes Handkerchiefs; Garters; Belts; Neckerchiefs; Handbags; Dress Handwear; Leggings, Nonsafety Type. 	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
-\N	Cat	8450	FSC	0	Children's and Infants' Apparel and Accessories	Children's and Infants' Apparel and Accessories	 Includes Footwear; Outerwear; Headwear; Handwear; Underwear; Nightwear. 	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
-\N	Cat	8455	FSC	0	Badges and Insignia	Badges and Insignia	Note-This class includes only items worn or carried on the person.  Excludes Nonpersonal Insignia.	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
-\N	Cat	8460	FSC	0	Luggage	Luggage	 Includes Foot Lockers; Brief Cases; Trunks; Suitcases. Excludes Duffel Bags; Musette Bags	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
-\N	Cat	8465	FSC	0	Individual Equipment	Individual Equipment	 Includes Musette Bags; Duffel Bags; Ammunition Belts; Pistol Belts; Handcuffs; Packboards; Sleeping Bags; Knapsacks; Hikers' Packs; Sunglasses; Skis; Snowshoes; Swords with Scabbards. Excludes Toilet Articles; Mess Gear; Fabric Utility Containers.	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
-\N	Cat	8470	FSC	0	Armor, Personal	Armor, Personal	 Includes Clothing specially designed for use as personal armor. Excludes All specialized flight clothing and accessories which may contain ballistic resistant properties as a secondary function. Excludes special purpose clothing wherein the primary function is for purposes other than ballistic protection	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
-\N	Cat	8475	FSC	0	Specialized Flight Clothing and Accessories	Specialized Flight Clothing and Accessories	 Includes Specialized Antiexposure, Antigravity, Partial Pressure, and Full Pressure Ensembles, and Specialized Components therefor, including Unpressurized Protective Helmets, Eye Protective Devices, and items with Sound Attenuating Features. Excludes Conventional Winter, Summer, and Intermediate Flight Clothing Ensembles, and Components therefor; Components designed for use with both Specialized and Conventional Flight Clothing Ensembles.	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
-\N	Cat	8510	FSC	0	Perfumes, Toilet Preparations, and Powders	Perfumes, Toilet Preparations, and Powders	 Includes Colognes; Cosmetics; Deodorants; Depilatories; Toilet Waters. 	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
-\N	Cat	8520	FSC	0	Toilet Soap, Shaving Preparations, and Dentifrices	Toilet Soap, Shaving Preparations, and Dentifrices	 Includes Toothpaste; Shaving Soap. Excludes Medicated Soaps.	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
-\N	Cat	8530	FSC	0	Personal Toiletry Articles	Personal Toiletry Articles	 Includes Hair Brushes; Nail Brushes; Nail Files; Toothbrushes; Manicure and Pedicure Implements; Razors and Blades. Excludes Dental Floss.	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
-\N	Cat	8540	FSC	0	Toiletry Paper Products	Toiletry Paper Products	 Includes Facial Tissues; Paper Toilet Seat Covers; Toilet Paper; Paper Napkins; Doilies. Excludes Towel Dispensers; Paper Plates and Cups.	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
-\N	Cat	8710	FSC	0	Forage and Feed	Forage and Feed	 Includes Hay; Manufactured Feed; Straw; Zoological Animal Food. 	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
-\N	Cat	8720	FSC	0	Fertilizers	Fertilizers	 Includes Natural and Synthetic Fertilizers; Peat Moss; Animal Manures. 	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
-\N	Cat	8730	FSC	0	Seeds and Nursery Stock	Seeds and Nursery Stock	 Includes Cut Flowers. 	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
-\N	Cat	8810	FSC	0	Live Animals, Raised for Food	Live Animals, Raised for Food	  	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
-\N	Cat	8820	FSC	0	Live Animals, Not Raised for Food	Live Animals, Not Raised for Food	  	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
-\N	Cat	8905	FSC	0	Meat, Poultry, and Fish	Meat, Poultry, and Fish	 Includes Game Birds; Shellfish; Sausage Casings. 	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
-\N	Cat	8910	FSC	0	Dairy Foods and Eggs	Dairy Foods and Eggs	 Includes Ice Cream; Frozen Custards; Ice Cream Mixes; Rennet; Milk Sherbets; Ices. 	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
-\N	Cat	8915	FSC	0	Fruits and Vegetables	Fruits and Vegetables	 Includes Baked Beans; Juices. 	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
-\N	Cat	8920	FSC	0	Bakery and Cereal Products	Bakery and Cereal Products	 Includes Flour; Prepared Flour; Prepared Cereals; Macaroni. 	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
-\N	Cat	8925	FSC	0	Sugar, Confectionery, and Nuts	Sugar, Confectionery, and Nuts	 Includes Candy; Chewing Gum; Honey; Maple Syrup. 	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
-\N	Cat	8930	FSC	0	Jams, Jellies, and Preserves	Jams, Jellies, and Preserves	  	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
-\N	Cat	8935	FSC	0	Soups and Bouillons	Soups and Bouillons	  	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
-\N	Cat	8940	FSC	0	Special Dietary Foods and Food Specialty Preparations	Special Dietary Foods and Food Specialty Preparations	 Includes Infant Foods; Potato Chips; Prepared Pie and Cake Fillings. 	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
-\N	Cat	8945	FSC	0	Food, Oils and Fats	Food, Oils and Fats	  	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
-\N	Cat	8950	FSC	0	Condiments and Related Products	Condiments and Related Products	 Includes Salad Dressings; Spices; Seasonings; Flavoring Extracts; Yeast; Olives. 	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
-\N	Cat	8955	FSC	0	Coffee, Tea, and Cocoa	Coffee, Tea, and Cocoa	 Includes Postum; Yerba Mate; Chicory. 	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
-\N	Cat	8960	FSC	0	Beverages, Nonalcoholic	Beverages, Nonalcoholic	 Includes Soft Drinks; Ice. 	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
-\N	Cat	8965	FSC	0	Beverages, Alcoholic	Beverages, Alcoholic	 Includes Beer; Whisky; Wine; Liqueur. Excludes Sacramental Wine and Medicinal grade Brandy, Whisky, and Wine.	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
-\N	Cat	8970	FSC	0	Composite Food Packages	Composite Food Packages	 Includes Ration Packs and Emergency Rations; Care Packages. 	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
-\N	Cat	8975	FSC	0	Tobacco Products	Tobacco Products	 Includes Snuff; Cigarettes; Cigars. 	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
-\N	Cat	9110	FSC	0	Fuels, Solid	Fuels, Solid	 Includes Ration Heating Tablets; Cordwood; Charcoal; Briquettes; Coke. Excludes Peat.	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
-\N	Cat	9130	FSC	0	Liquid Propellants and Fuels, Petroleum Base	Liquid Propellants and Fuels, Petroleum Base	Note-This class includes liquid propellants with more than 50 percent or higher petroleum content. Includes All Aviation Gasoline; JP-1, 3, 4, and 5 Jet Fuel; Combat Vehicle and Automotive Gasoline (all types and grades); Liquid Propellants, Bulk; Liquid Propellants, predetermined to specific quantity and quality, packaged in reusable containers. Excludes Solid Propellants; Liquid Propellants, encased in consumable containers, for insertion into missile propulsion systems as integral parts.	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
-\N	Cat	9135	FSC	0	Liquid Propellant Fuels and Oxidizers, Chemical Base	Liquid Propellant Fuels and Oxidizers, Chemical Base	Note-This class includes liquid propellants with more than 50 percent or higher chemical content. Includes Liquid chemicals designed exclusively for use as propellant fuels and oxidizers; Liquid Propellants, Bulk; Liquid Propellants, predetermined to specific quantity and quality, packaged in reusable containers. Excludes Multiple-use chemicals, such as Nitrogen, Technical; Ammonia, Technical; Furfuryl Alcohol, Technical; Aniline, Technical; Solid Propellants; Liquid Propellants, encased in consumable containers, for insertion into missile propulsion systems as integral parts.	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
-\N	Cat	9140	FSC	0	Fuel Oils	Fuel Oils	 Includes Light Burner Fuels; Diesel Fuels; Kerosine; Military Specification Type Residuals; Special and Heavy Grade Turbine Vessel Propulsion Fuels; Federal Specification Heavy Burner Fuels; Bunker "C" Commercial Grade Fuel; Heavy Fuel and other Black (Boiler Type) Fuels; Illuminating Oils. 	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
-\N	Cat	9150	FSC	0	Oils and Greases: Cutting, Lubricating, and Hydraulic	Oils and Greases: Cutting, Lubricating, and Hydraulic	 Includes Petrolatum, except USP. Excludes Rust Preventive Compounds; Antiseizing Compounds; Petrolatum, USP.	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
-\N	Cat	9160	FSC	0	Miscellaneous Waxes, Oils, and Fats	Miscellaneous Waxes, Oils, and Fats	 Includes Animal, Vegetable, and Petroleum Waxes; Wool Grease (Lanolin); Tallow; Marine Oils; Coconut Oil; Soap Stock; Essential Oils, except USP or NF grades. Excludes Edible Fats and Oils; Household and Automobile Waxes.	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
-\N	Cat	9310	FSC	0	Paper and Paperboard	Paper and Paperboard	 Includes Book Paper Stock; Newsprint; Paperboard; Bulk Paper Materials. Excludes Corrugated Paper; Wrapping Paper; Building Board; Insulating Board; Stationery; Construction Paper; Paper Towels; Facial Tissues; Blank Books; Containers; Shipping and Identification Tags.	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
-\N	Cat	9320	FSC	0	Rubber Fabricated Materials	Rubber Fabricated Materials	 Includes Natural and Synthetic Rubber Fabricated Materials, such as Rubber Sheets, Structural Rubber Shapes, Strips. 	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
-\N	Cat	9330	FSC	0	Plastics Fabricated Materials	Plastics Fabricated Materials	 Includes Cellulose Acetate and other plastics; Bars, Rods, Sheets, and Strips. Excludes Cable, Fiber Optic.	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
-\N	Cat	9340	FSC	0	Glass Fabricated Materials	Glass Fabricated Materials	 Includes Glass Rods, Bars, and Tubing; Optical Glass Blanks; Structural and Building Glass; Glass Blocks. Excludes Insulators (FSC 5970); Ophthalmic Glass Blanks (FSC 6540); and Cable, Fiber Optics (FSCs 6015 and 6615).	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
-\N	Cat	9350	FSC	0	Refractories and Fire Surfacing Materials	Refractories and Fire Surfacing Materials	  	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
-\N	Cat	9390	FSC	0	Miscellaneous Fabricated Nonmetallic Materials	Miscellaneous Fabricated Nonmetallic Materials	 Includes Cork Fabricated Basic Materials; Asbestos Fabricated Materials; Manufactured Mica; Minerals for scientific and technical use (cut but not mounted); Pottery Supplies; Catgut and Wormgut; Vegetable Brush Fibers; Bagasse. 	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
-\N	Cat	9410	FSC	0	Crude Grades of Plant Materials	Crude Grades of Plant Materials	 Includes Flavoring Materials; Crude Drugs of Plant-Origin; Crude Materials for Perfume; Tobacco, Unmanufactured. 	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
-\N	Cat	9420	FSC	0	Fibers:  Vegetable, Animal, and Synthetic	Fibers:  Vegetable, Animal, and Synthetic	 Includes Cotton, Wool, Silk, Horsehair, Rayon, and Nylon Fibers. 	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
-\N	Cat	9430	FSC	0	Miscellaneous Crude Animal Products, Inedible	Miscellaneous Crude Animal Products, Inedible	 Includes Feathers and Downs, Unprocessed; Ivory; Bristles; Hides and Fur Skins, Crude. 	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
-\N	Cat	9440	FSC	0	Miscellaneous Crude Agricultural and Forestry Products	Miscellaneous Crude Agricultural and Forestry Products	 Includes Cereal Grains; Sugar Crops; Crude Rubber. 	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
-\N	Cat	9450	FSC	0	Nonmetallic Scrap, Except Textile	Nonmetallic Scrap, Except Textile	  	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
-\N	Cat	9505	FSC	0	Wire, Nonelectrical	Wire, Nonelectrical	Note- This class contains bulk material only. Specially designed items should be placed in a more appropriate class. Wire is a thin, flexible, continuous length of metal, usually of circular cross-section. Includes Bulk Nonelectrical Wire Excludes Wire having electrical resistivity or conductivity rating (FSC 6145).	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
-\N	Cat	9510	FSC	0	Bars and Rods	Bars and Rods	Note This class contains bulk material only. Specially designed items should be placed in a more appropriae class. a. Bars are elongated pieces of metal of simple uniform cross-sections usually rectangular, circular, or hexagonal produced by forging or hot-rolling, also known as barstock. b. Rods are thin round metal bar, differentiated by dimensional parameters, listed in the item name definition. Includes Metal Bars and Rods Excludes Muck Bar (FSC 9640); Rods for Wire (FSC 9640); Sheet Bar (FSC 9640); Threaded Rods (FSC 5306); Grooved Rod (FSC 5340).	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
-\N	Cat	9515	FSC	0	Plate, Sheet, Strip, Foil, and Leaf	Plate, Sheet, Strip, Foil, and Leaf	Note-This class contains bulk material only. Specially designed items should be placed in a more appropriate class. The items covered by this class are all similar in that they are flat, generally rolled metal, the difference is covered by dsimensional parameters in the item name definition. Includes Armor Plate; Black Plate; Floor Plate; Leaf; Perforated Sheet and Strip; Shim Stock. Excludes Bale Ties (FSC 8135); Baling Bands (FSC 8135); Mending Plates (FSC 5340); Mounting Plates (FSC 5340); T Plates (FSC 5340).	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
-\N	Cat	9520	FSC	0	Structural Shapes	Structural Shapes	Note-This class contains bulk material only. Specially designed items should be placed in a more appropriate class. This class includes items usually used in building, bridge and similar construction, such as, I beams, angles, and the like. Includes Bar Size Shapes (under 3 inches); Metal Piles and Piling; Angles; Channels; Tees; Zees. Excludes Plate, Sheet and Strip Materials (FSC 9515).	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
-\N	Cat	9525	FSC	0	Wire, Nonelectrical, Nonferrous Base Metal	Wire, Nonelectrical, Nonferrous Base Metal	  Excludes Wire having electrical resistivity or conductivity rating.	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
-\N	Cat	9530	FSC	0	Bars and Rods, Nonferrous Base Metal	Bars and Rods, Nonferrous Base Metal	  	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
-\N	Cat	9535	FSC	0	Plate, Sheet, Strip, and Foil; Nonferrous Base Metal	Plate, Sheet, Strip, and Foil; Nonferrous Base Metal	 Includes Leaf; Perforated Sheet and Strips. 	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
-\N	Cat	9540	FSC	0	Structural Shapes, Nonferrous Base Metal	Structural Shapes, Nonferrous Base Metal	 Includes Angles; Channels; Tees; Zees. 	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
-\N	Cat	9545	FSC	0	Plate, Sheet, Strip, Foil, and Wire: Precious Metal	Plate, Sheet, Strip, Foil, and Wire: Precious Metal	 Includes Bars; Leaf; Ribbon; Rods; Tubing. Excludes Precious Metals for dental use.	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
-\N	Cat	9610	FSC	0	Ores	Ores	Note-Only bulk material will be identified in this class. Ores are a naturally occurring material from which economically valuable minerals can be obtained. Includes Bauxite; Ferrous Ores; Lead Ores; Precious Metal Ores; Radioactive Metal Ores; Zinc Ores. 	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
-\N	Cat	9620	FSC	0	Minerals, Natural and Synthetic	Minerals, Natural and Synthetic	Note-Only bulk material will be identified in this class. Minerals are naturally occurring substances with a characteristic chemical composition that can be expressed by a formula. Includes Clays and other Earths; Mica; Asbestos; Crude Petroleum; Graphite. Excludes Gravel (FSC 5610); Sand (FSC 5610); Abrasives (FSC 5350); Refractory Clays (FSC 9350).	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
-\N	Cat	9630	FSC	0	Additive Metal Materials	Additive Metal Materials	Note-Only bulk material will be identified in this class. Additive metal materials are those which are added to metals to improve their characteristics as required (e.g., lead added to steel to improve the machinability). Includes Alloying Additives (Aluminum, Antimony, Copper, and Others). Excludes Fuel Inhibiting Additives (FSC 6850).	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
-\N	Cat	9640	FSC	0	Iron and Steel Primary and Semifinished Products	Iron and Steel Primary and Semifinished Products	Note-Only bulk material will be identified in this class. a. Primary products are raw unfinished ingots, pigs, that require refinement to be usable. b. Semi-finished items are primary products that have been refined to a state that requires further manufacturing processes to its final, usable state. Includes Ingots; Pigs; Billets; Blooms; Muck Bar; Rods for Wire; Sheet Bar; Skelp; Tube Rounds. 	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
-\N	Cat	9650	FSC	0	Nonferrous Base Metal Refinery and Intermediate Forms	Nonferrous Base Metal Refinery and Intermediate Forms	Note-Only Bulk material will be identified in this class. a. Refinery Forms are raw unfinished ingots, pigs, that require refinement to be usable. b. Intermediate forms are primary products that have been refined to a state that requires further manufacturing processes to its final, usable state. Includes Ingots; Slabs. 	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
-\N	Cat	9660	FSC	0	Precious Metals Primary Forms	Precious Metals Primary Forms	Note-Only bulk material will be identified in this class. Primary Forms are raw unfinished ingots, pigs, that require refinement to be usable and are made of precious metals. Includes Bullion; Ingot. 	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
-\N	Cat	9670	FSC	0	Iron and Steel Scrap	Iron and Steel Scrap	  	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
-\N	Cat	9680	FSC	0	Nonferrous Scrap	Nonferrous Scrap	  	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
-\N	Cat	9905	FSC	0	Signs, Advertising Displays, and Identification Plates	Signs, Advertising Displays, and Identification Plates	 Includes Electric Signs; Sign Boards; Display Stands; Mannequins and other display forms; Printed Signs; General Purpose Identification Tags and Blanks, Nonpersonal; Plates and Tags for specific applications. 	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
-\N	Cat	9910	FSC	0	Jewelry	Jewelry	 Includes Jewelers' Findings; Precious Stones, Cut; Costume Jewelry; Natural Gems and Ornamental Stones, Cut. Excludes Watches; Clocks; Tableware; Scientific Instruments; Toilet Articles; Smokers' Articles; Industrial Diamonds.	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
-\N	Cat	9915	FSC	0	Collectors' and/or Historical Items	Collectors' and/or Historical Items	 Includes Antiques; Artifacts; Coins; Stamps; Rare Books; Works of Art, Collectors and/or Historical Gems; Jewelry, and Cut Precious Stones; Natural History Items. 	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
-\N	Cat	9920	FSC	0	Smokers' Articles and Matches	Smokers' Articles and Matches	 Includes Cigarette Lighters; Lighter Fluid; Pipe Reamers; Ash Trays; Tobacco Humidors; Packaged Cigarette Paper. Excludes Ash receivers and lighters specifically designed for installation in or on equipment.	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
-\N	Cat	9925	FSC	0	Ecclesiastical Equipment, Furnishings, and Supplies	Ecclesiastical Equipment, Furnishings, and Supplies	 Includes Vestments; Altars; Communion Sets; Ecclesiastical Candelabra; Chalices; Patens; Altar Cloths; Ecclesiastical Statuary; Sacramental Wine. 	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
-\N	Cat	9930	FSC	0	Memorials; Cemeterial and Mortuary Equipment and Supplies	Memorials; Cemeterial and Mortuary Equipment and Supplies	 Includes Grave Markers; Burial Vaults; Burial Urns; Caskets; Burial Boxes; Morticians' Supplies; Monuments; Gasket Shipping Cases. Excludes Hearses; Mortuary Refrigerators.	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
-\N	Cat	9999	FSC	0	Miscellaneous Items	Miscellaneous Items	 Includes only those items which cannot conceivably be classified in any existing classes 	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
+\N	Category	1005	FSC	0	Guns, through 30mm	Guns, through 30mm	 Includes Machine Guns; Brushes, Machine Gun and Pistol. Excludes Turrets, Aircraft.	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
+\N	Category	1010	FSC	0	Guns, over 30mm up to 75mm	Guns, over 30mm up to 75mm	 Includes Breech Mechanisms; Mounts; Grenade Launchers for Integral-Cartridge Grenades, Single-Shot or Auto-Loading or Automatic-Firing. 	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
+\N	Category	1015	FSC	0	Guns, 75mm through 125mm	Guns, 75mm through 125mm	 Includes Breech Mechanisms; Mounts; Rammers. 	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
+\N	Category	1020	FSC	0	Guns, over 125mm through 150mm	Guns, over 125mm through 150mm	 Includes Breech Mechanisms; Power Drives; Gun Shields. 	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
+\N	Category	1025	FSC	0	Guns, over 150mm through 200mm	Guns, over 150mm through 200mm	 Includes Firing Platforms; Mounts; Gun Shields. 	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
+\N	Category	1030	FSC	0	Guns, over 200mm through 300mm	Guns, over 200mm through 300mm	 Includes Gun Yokes; Rammers; Reflectors. 	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
+\N	Category	1035	FSC	0	Guns, over 300mm	Guns, over 300mm	 Includes Breech Mechanisms; Training Gears; Power Drives. 	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
+\N	Category	1040	FSC	0	Chemical Weapons and Equipment	Chemical Weapons and Equipment	 Includes Flame Throwers; Smoke Generators. 	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
+\N	Category	1045	FSC	0	Launchers, Torpedo and Depth Charge	Launchers, Torpedo and Depth Charge	 Includes Depth Charge Tracks; Torpedo Tubes. 	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
+\N	Category	1055	FSC	0	Launchers, Rocket and Pyrotechnic	Launchers, Rocket and Pyrotechnic	 Includes Airborne Rocket Launchers adaptable to guided missile use. Excludes Specifically designed Airborne Guided Missile Launchers; Jettisonable Rocket Launchers; Launcher Fairings designed for specific airframes; Rifle Grenade Launchers; Grenade Launchers for Integral-Cartridge Grenades, Single-Shot or Auto-Loading or Automatic Firing.	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
+\N	Category	1070	FSC	0	Nets and Booms, Ordnance	Nets and Booms, Ordnance	Note-This class includes nets and booms for harbor defense only.  	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
+\N	Category	1075	FSC	0	Degaussing and Mine Sweeping Equipment	Degaussing and Mine Sweeping Equipment	  	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
+\N	Category	1080	FSC	0	Camouflage and Deception Equipment	Camouflage and Deception Equipment	 Includes Dummy Artillery, Aircraft and Vehicles; Garnished Nets. 	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
+\N	Category	1090	FSC	0	Assemblies Interchangeable Between Weapons in Two or More Classes	Assemblies Interchangeable Between Weapons in Two or More Classes	 Includes Components and Accessories used on or with weapons falling in two or more classes of Group 10. 	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
+\N	Category	1095	FSC	0	Miscellaneous Weapons	Miscellaneous Weapons	 Includes Line Throwing Guns; Catapult Guns; Bayonets; Saluting Guns; Signal Guns; Flare Guns; Barrage Balloons; Accessories, not elsewhere classifiable, for weapons in this group; Expendable Bomb Dispensers. 	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
+\N	Category	1105	FSC	0	Nuclear Bombs	Nuclear Bombs	Note-This class includes nuclear weapons (including bombs), which are designed to be dropped from an aircraft. Includes Ballistic cases, tail assemblies, retardation devices, and other peculiar components which are not classifiable elsewhere. Excludes Parachute canopies and canopy hardware.	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
+\N	Category	1110	FSC	0	Nuclear Projectiles	Nuclear Projectiles	Note- This class includes nuclear weapons which are designed to be propelled from a recoilless rifle, gun, howitzer, or the like, and which are not designed to be self-propelled. Includes Ogive sections, body sections, bases, and other peculiar components which are not classifiable elsewhere. 	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
+\N	Category	1115	FSC	0	Nuclear Warheads and Warhead Sections	Nuclear Warheads and Warhead Sections	Note This class includes nuclear warheads (without or assembled with case sections, adaption kits, and/or fuzing and firing components) which are to be used in or with bombs, rockets, projectiles, missiles, demolition charges, or the like. Also includes case sections, nose cones, flare sections, center sections, and auxiliary structural components of missiles, rockets, and re-entry vehicles which are designed or constructed for exclusive use with or for housing of nuclear warheads and/or warhead sections. Includes Components and parts peculiar to the warhead or warhead section, which are not classifiable in more specific classes. Excludes Such components as fuzing and firing devices, nuclear components, high explosive components, classifiable in more specific classes, and items such as projectiles and bombs which include the entire outer case of a weapon.	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
+\N	Category	1120	FSC	0	Nuclear Depth Charges	Nuclear Depth Charges	Note-This class includes nuclear weapons which consist of depth charge bodies assembled with nuclear warheads. It includes training weapons and all specially designed components which are not classifiable elsewhere.  	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
+\N	Category	1125	FSC	0	Nuclear Demolition Charges	Nuclear Demolition Charges	Note-This class includes nuclear weapons which are designed to be emplaced in or near a structure, area, or the like, which is to be destroyed. The weapons may include accessories. Includes Outer cases, case sections, and other peculiar components, which are not classifiable elsewhere. 	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
+\N	Category	1127	FSC	0	Nuclear Rockets	Nuclear Rockets	Note-This class includes nuclear weapons, consisting of rocket bodies assembled with nuclear warheads, which comprise a single item of supply and are issued as such. Includes Components peculiar to assembled rockets which are not classifiable elsewhere. Excludes Rocket Motors; Warhead Components; Rocket Components classified in other FSC classes.	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
+\N	Category	1130	FSC	0	Conversion Kits, Nuclear Ordnance	Conversion Kits, Nuclear Ordnance	Note-This class includes collections of items used for the purpose of converting nuclear weapons from one configuration to another.  	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
+\N	Category	1135	FSC	0	Fuzing and Firing Devices, Nuclear Ordnance	Fuzing and Firing Devices, Nuclear Ordnance	 Includes such items as fuzes, power supplies, firing sets, x-units, cables, safing devices, adaption kits, and re-entry vehicle nuclear ordnance arming and fuzing systems. 	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
+\N	Category	1140	FSC	0	Nuclear Components	Nuclear Components	 Includes All components which contain or simulate nuclear active materials. Excludes end items, such as bombs, projectiles, warheads, and the like.	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
+\N	Category	1145	FSC	0	Explosive and Pyrotechnic Components, Nuclear Ordnance	Explosive and Pyrotechnic Components, Nuclear Ordnance	Note-This class includes actual and simulated explosive and pyrotechnic components peculiar to all nuclear ordnance end items, such as bombs, demolition charges, rockets, projectiles, warheads, and related systems. Excluded from this class are all explosive and pyrotechnic components designed for other than nuclear ordnance applications.  	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
+\N	Category	1190	FSC	0	Specialized Test and Handling Equipment, Nuclear Ordnance	Specialized Test and Handling Equipment, Nuclear Ordnance	 Includes Specially designed trucks and trailers for nuclear ordnance; Specially designed slings and hoists; Operational, test, and setting devices, and cradles; Conditioning Kits and Sets, Controlled Environment. Excludes Hand tools; Instruments for use on both nuclear ordnance and other equipment; Basic types of electrical and electronic test instruments, including those specially designed, such as ammeters, voltmeters, ohmmeters, multimeters, and similar instruments, as shown in the indexes in the FSC.	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
+\N	Category	1195	FSC	0	Miscellaneous Nuclear Ordnance	Miscellaneous Nuclear Ordnance	 Includes Items common to more than one class or items not properly fitting into the foregoing classes of nuclear ordnance. 	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
+\N	Category	1210	FSC	0	Fire Control Directors	Fire Control Directors	  	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
+\N	Category	1220	FSC	0	Fire Control Computing Sights and Devices	Fire Control Computing Sights and Devices	  	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
+\N	Category	1230	FSC	0	Fire Control Systems, Complete	Fire Control Systems, Complete	Note-This class includes only complete fire control systems. Anything less than a complete system, such as individual end items, assemblies, parts, attachments, or accessories for use in fire control systems are classified in classes other than this class.  	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
+\N	Category	1240	FSC	0	Optical Sighting and Ranging Equipment	Optical Sighting and Ranging Equipment	 Includes Periscopes for Submarines; Range and Height Finders; Telescopic Sights; Optical Instruments Integrated with Fire Control Equipment. 	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
+\N	Category	1250	FSC	0	Fire Control Stabilizing Mechanisms	Fire Control Stabilizing Mechanisms	  	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
+\N	Category	1260	FSC	0	Fire Control Designating and Indicating Equipment	Fire Control Designating and Indicating Equipment	 Includes Turret, Gun, Torpedo Mount, and Searchlight Indicating Equipment; Target Designating Equipment; Synchro Systems. 	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
+\N	Category	1265	FSC	0	Fire Control Transmitting and Receiving Equipment, except Airborne	Fire Control Transmitting and Receiving Equipment, except Airborne	 Includes Fire Control Transmitters, Transmitter-Receivers, Receivers, Receiver-Regulators. Excludes Fire Control Transmitting and Receiving Equipment, Specially Designed for use on or with Fire Control Radar Equipment.	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
+\N	Category	1270	FSC	0	Aircraft Gunnery Fire Control Components	Aircraft Gunnery Fire Control Components	 Includes Turrets, Aircraft; Computers, specifically designed; Complete Gyro Mechanisms. Excludes Gun Chargers; Ammunition Boxes; Gun Heaters; Field and Link Chutes; Ammunition Boosters; Gyro Components; Complete Fire Control Systems.	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
+\N	Category	1280	FSC	0	Aircraft Bombing Fire Control Components	Aircraft Bombing Fire Control Components	 Includes Computers, specifically designed; Complete Gyro Mechanisms; Optical Instruments for Bombing Fire Control. Excludes Gyro Components; Optical Elements, such as Lens, Prisms, Filters.	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
+\N	Category	1285	FSC	0	Fire Control Radar Equipment, except Airborne	Fire Control Radar Equipment, except Airborne	 Includes Radar Sets, Assemblies, Subassemblies, and Components Specially Designed for use on or with Fire Control Equipment. 	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
+\N	Category	1287	FSC	0	Fire Control Sonar Equipment	Fire Control Sonar Equipment	Note-This class includes airborne, shipborne, and submarineborne sonar sets, assemblies, subassemblies, and components designed specificially for use with underwater fire control equipment.  	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
+\N	Category	1290	FSC	0	Miscellaneous Fire Control Equipment	Miscellaneous Fire Control Equipment	 Includes Fuze Setters; Ordnance Cable Systems; Aiming Circles; Flash and Sound Ranging Sets; Fire Control Components and Subassemblies Not Classifiable in Other Classes of Group 12. 	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
+\N	Category	1305	FSC	0	Ammunition, through 30mm	Ammunition, through 30mm	 Includes Components. 	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
+\N	Category	1310	FSC	0	Ammunition, over 30mm up to 75mm	Ammunition, over 30mm up to 75mm	 Includes Components, except Fuzes and Primers; Chemical Warfare Cartridges. Excludes Fuzes and Primers.	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
+\N	Category	1315	FSC	0	Ammunition, 75mm through 125mm	Ammunition, 75mm through 125mm	 Includes Components, except Fuzes and Primers; Pyrotechnic Cartridges and Projectiles; Chemical Warfare Cartridges and Projectiles. Excludes Fuzes and Primers.	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
+\N	Category	1320	FSC	0	Ammunition, over 125mm	Ammunition, over 125mm	 Includes Components, except Fuzes and Primers; Chemical Warfare Projectiles. Excludes Fuzes and Primers.	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
+\N	Category	1325	FSC	0	Bombs	Bombs	 Includes Components; Photoflash Bombs; Chemical Warfare Bombs; Bomb Clusters. 	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
+\N	Category	1330	FSC	0	Grenades	Grenades	 Includes Components; Hand and Rifle Grenades; Smoke Grenades. Excludes Firing Devices (Launchers).	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
+\N	Category	1336	FSC	0	Guided Missile Warheads and Explosive Components	Guided Missile Warheads and Explosive Components	 Includes Warheads Containing Military Chemical Agents; Exercise Heads, Guided Missile. Excludes Atomic Ordnance Warheads; All other Warheads for use on other than guided missiles; Liquid Propulsion Units; Rocket Engines (Liquid Propellant Units); JATO Units; Rocket Motors (Solid Propellant Units) for Guided Missiles; Solid Fuel Propulsion Units; Propellant Chemicals encased in consumable containers, such as squibs and cartridges for insertion into missile propulsion systems as integral parts.	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
+\N	Category	1337	FSC	0	Guided Missile and Space Vehicle Explosive Propulsion Units, Solid Fuel; and Components	Guided Missile and Space Vehicle Explosive Propulsion Units, Solid Fuel; and Components	 Includes Rocket Motors (Solid Propellant Units) for Guided Missiles, Explosive-Loaded; All Explosive Components for Guided Missile and Space Vehicle Solid Fuel Propulsion Units; Solid Propellants encased in consumable containers, such as squibs and cartridges, intended for insertion into missile propulsion systems as integral parts. Excludes Rocket Motors (Solid Propellant Units) for Guided Missiles, Inert-Loaded or Empty; All Inert (Nonexplosive) Components for Guided Missile and Space Vehicle Solid Fuel Propulsion Units; Guided Missile Warheads and Components; Rocket Propulsion Units; Rocket Motors (Solid Propellant Units) for Rockets; Solid Propellants predetermined to specific quantity and quality, but packaged in reusable containers.	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
+\N	Category	1338	FSC	0	Guided Missile and Space Vehicle Inert Propulsion Units, Solid Fuel; and Components.	Guided Missile and Space Vehicle Inert Propulsion Units, Solid Fuel; and Components.	 Includes Rocket Motors (Solid Propellant Units) for Guided Missiles, Inert-Loaded or Empty; All Inert (Nonexplosive) Components for Guided Missile and Space Vehicle Solid Fuel Propulsion Units. Excludes Rocket Motors (Solid Propellant Units) for Guided Missiles, Explosive-Loaded; Guided Missile Warheads and Components; Rocket Propulsion Units; Rocket Motors (Solid Propellant Units) for Rockets.	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
+\N	Category	1340	FSC	0	Rockets, Rocket Ammunition and Rocket Components	Rockets, Rocket Ammunition and Rocket Components	 Includes Complete Rounds; Explosive Components, Including Warheads; Pyrotechnic Rockets; Solid Fuel JATO Units; Rocket Motors (Solid Propellant Units) for Rockets; Covers, Protective Rocket Warhead; Jettisonable Rocket Launchers; Conditioning Kits and Sets, Controlled Environment; and other peculiar components which are not classified elsewhere. Excludes Nuclear rockets, Nuclear warheads; all other warheads for use on other than rockets; and rockets with built-in guiding devices.	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
+\N	Category	1345	FSC	0	Land Mines	Land Mines	 Includes Components; Antipersonnel Mines; Antitank Mines; Fuzes. 	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
+\N	Category	1346	FSC	0	Remote Munitions	Remote Munitions	Munitions items/systems that are not held by the soldier but are deployed for future activation. They may be put in place separately by the soldier or delivered from vehicles or aircraft by mechanical distribution methods. They may be command controlled or may use self - initiated firing systems that do not require soldier monitoring. All items in this class can be armed/disarmed remotely. Remote Munition Items and Systems used singularly or in combination to defeat a variety of threats; Fuzes; Safe and Arming devises; Self Destruction Mechanisms; Communication Modules; Command and Control systems and various other pertinent components. 	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
+\N	Category	1350	FSC	0	Underwater Mine and Components, Inert	Underwater Mine and Components, Inert	 Includes Parachute Packs; Inert Mine Cases; Booster Cans; Clock Delays; Clock Starters; Search Coils; Extenders. 	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
+\N	Category	1351	FSC	0	Underwater Mines and Components, Explosive	Underwater Mines and Components, Explosive	 Includes Loaded Cases; Boosters; Detonators. 	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
+\N	Category	1352	FSC	0	Underwater Mine Disposal Inert Devices	Underwater Mine Disposal Inert Devices	Note: Version of Underwater Mine Disposal Explosive Device without destructive charge. Intended for underwater mine hunting and reconnaissance. May also be used for training purposes. Includes: Complete operating units, such as an underwater mine reconnaissance device, as well as component parts, practice, training, blank, and dummies. Excludes: Torpedo Inert components, depth charges, and underwater mines.	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
+\N	Category	1353	FSC	0	Underwater Mine Disposal Explosive Devices	Underwater Mine Disposal Explosive Devices	Note: Complete explosive devices, including destructive charge. It is fired, guided to target and detonated from a vessel or other remote site. Includes Complete explosive device, including ammunition, detonating charge, and component parts. Excludes Underwater Mine Explosive Components (FSC 1351), Torpedo Explosive Components (FSC 1356), Military Chemical Agents (FSC 1365).	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
+\N	Category	1355	FSC	0	Torpedos and Components, Inert	Torpedos and Components, Inert	  	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
+\N	Category	1356	FSC	0	Torpedos and Components, Explosive	Torpedos and Components, Explosive	 Includes Warheads; Boosters; Detonators. 	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
+\N	Category	1360	FSC	0	Depth Charges and Components, Inert	Depth Charges and Components, Inert	 Includes Inert Firing Mechanisms; Pistols without Detonators; Extenders. 	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
+\N	Category	1361	FSC	0	Depth Charges and Components, Explosive	Depth Charges and Components, Explosive	 Includes Cases; Boosters; Detonators. 	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
+\N	Category	1365	FSC	0	Military Chemical Agents	Military Chemical Agents	 Includes War Gases; Screening Smokes; Incendiary and thickening Agents; Signaling Smokes. Excludes Ammunition containing Military Chemical Agents.	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
+\N	Category	1367	FSC	0	Tactical Sets, Kits, and Outfits	Tactical Sets, Kits, and Outfits	A collection of items, which are used for a specific purpose. Each collection must include at least one item of ordnance classified in Group 13. Ordnance may be non-lethal (as defined in the Department of Defense Directive 3000.3). These sets, kits and outfits may include such items as uniforms, weapons, body armor, and the like. By themselves, each of these components belongs in an FSC other than 1367.  	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
+\N	Category	1370	FSC	0	Pyrotechnics	Pyrotechnics	 Includes Flares; Signals; Fireworks; Pistol Rocket Signals. Excludes Pyrotechnic Cartridges and Projectiles; Photoflash Bombs; Pyrotechnic Rockets.	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
+\N	Category	1375	FSC	0	Demolition Materials	Demolition Materials	 Includes Items for construction, quarrying and demolition work such as Dynamite and other explosives packed in cylindrical paper cartridges or in bags, Demolition Charges, Blasting Caps, Blasting Time Fuses, Detonating Cord, Demolition Firing Devices; Booby Trap Mechanisms; Bangalore Torpedoes; Inert accessories and components such as Blasting Machines, Priming Adapters, and Detonating Cord Clips. Excludes Liquid Propellant Fuels and Oxidizers; Solid Propellants encased in consumable containers, for insertion into missile propulsion systems as integral parts; Guided Missile Explosive Devices; Safety-in-Flight Explosive Items and Devices such as, Impulse Cartridges, Delay Cartridges, Aircraft Ejection Seat Catapults, Aircraft Canopy Removers, and similar items, as shown in the indexes to the FSC, Solid Propellants, predetermined to specific quantity and quality, packaged in reusable containers; Nuclear Ordnance Components; Rocket and Guided Missile Motors, Warheads, and Propulsion Sections.	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
+\N	Category	1376	FSC	0	Bulk Explosives	Bulk Explosives	 Includes Solid Propellants, predetermined to specific quantity and quality, packaged in reusable containers; Explosive Loaded Devices and Components as shown in the indexes to the FSC. Excludes Liquid Propellant Fuels and Oxidizers; Solid Propellants encased in consumable containers, for insertion into missile propulsion systems as integral parts; Guided Missile Explosive Devices; Blasting and Demolition Materials; Safety-in-Flight Explosive Items and Devices such as Impulse Cartridges, Delay Cartridges, Aircraft Ejection Seat Catapults, Aircraft Canopy Removers; Rocket and Guided Missile Motors, Warheads, and Propulsion Sections; similiar items, as shown in the indexes to the FSC.	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
+\N	Category	1430	FSC	0	Guided Missile Remote Control Systems	Guided Missile Remote Control Systems	Note-This class includes airborne and nonairborne guided missile remote control systems, components, and accessories, designed specifically for use therewith. Excluded from this class are fire control assemblies, subassemblies, and components modified for use with guided missile remote control systems, and fire control assemblies designed specifically for shipboard use. Includes Specially Designed Components of Guided Missile Remote Control Systems. Excludes Guided Missile Internal (Built-in) Control Systems; Components used in both guided missiles and other than guided missiles (including fire control components).	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
+\N	Category	1440	FSC	0	Launchers, Guided Missile	Launchers, Guided Missile	 Includes Airborne and Nonairborne Guided Missile Launchers. Excludes Aircraft Launchers; Rocket Launchers.	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
+\N	Category	1377	FSC	0	Cartridge and Propellant Actuated Devices and Components	Cartridge and Propellant Actuated Devices and Components	Note-This class includes safety-in-flight explosive items, consisting of a quantity of propellant (either encased in a cartridge or in molded form) and a means of activation, designed to be inserted into or attached to one or more devices to provide the energy required to operate devices requiring a time delay, or not requiring a time delay, in their operating sequence. Also included are devices designed to utilize energy generated by the items described above. Includes Impulse Cartridges; Delay Cartridges; Engine Starter Cartridges (explosive filled); Fire Extinguisher Cartridges (used to activate by remote control); Aircraft Ejection Seat Catapults; Rocket Motors (Solid Propellant Units) for Aircraft Ejection Seats; Aircraft Canopy Removers; Thrusters, propellant and cartridge actuated; Initiators; Explosive Bolts and Explosive Bolt Cartridges; Cutters, cartridge or propellant actuated, Reefing Line; Powder actuated Tool Cartridges; Explosive Loaded Devices and Components which are not specifically classified elsewhere. Excludes Liquid Propellant Fuels and Oxidizers; Solid Propellants, encased in consumable containers for insertion into missile propulsion systems as an integral part; Guided Missile Explosive Devices; Bulk and Solid Propellants, predetermined to specific quantity and quality, packaged in reusable containers; Blasting and Demolition Materials; Rocket Motors, Warheads and Propulsion Sections for Rockets and Guided Missiles.	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
+\N	Category	1385	FSC	0	Surface Use Explosive Ordnance Disposal Tools and Equipment	Surface Use Explosive Ordnance Disposal Tools and Equipment	Note-This class includes only specialized tools and equipment developed for and used by qualified Explosive Ordnance Disposal (EOD) personnel.  Excludes Nonspecialized or common tools and equipment not developed exclusively for use by qualified EOD personnel; specialized demolition material; explosive loaded shaped charges.	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
+\N	Category	1386	FSC	0	Underwater Use Explosive Ordnance Disposal and Swimmer Weapons Systems Tools and Equipment	Underwater Use Explosive Ordnance Disposal and Swimmer Weapons Systems Tools and Equipment	Note-This class includes only specialized tools and equipment developed for and used by qualified Explosive Ordnance Disposal (EOD), personnel, Underwater Demolition Teams (UDT), and/or Sea-Air-Land (SEAL) personnel  Excludes Nonspecialized or common tools not developed exclusively for use by qualified EOD, UDT, and/or SEAL personnel; specialized demolition material; explosive loaded shaped charges	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
+\N	Category	1390	FSC	0	Fuzes and Primers	Fuzes and Primers	Note-This class includes only fuzes and primers for use in ammunition classified in Classes 1310, 1315, and 1320.  Excludes Fuzes and Primers for ammunition not classified in Classes 1310, 1315, and 1320.	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
+\N	Category	1395	FSC	0	Miscellaneous Ammunition	Miscellaneous Ammunition	 Includes Ammunition Shapes, such as Blanks, Disks, Slugs, Cups, and Rotating Bands (Shell Bands). 	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
+\N	Category	1398	FSC	0	Specialized Ammunition Handling and Servicing Equipment	Specialized Ammunition Handling and Servicing Equipment	 Includes Handling and servicing equipment specially designed for use on or with rockets and conventional ammunition. Excludes Handling and servicing equipment specially designed for use on or with rocket and pyrotechnic launchers; Ammunition maintenance and repair shop specialized equipment; Handling equipment specially designed for aircraft or airfield use.	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
+\N	Category	1410	FSC	0	Guided Missiles	Guided Missiles	Note-This class includes only complete guided missiles, with or without warheads and explosive components, whether in assembled or unassembled form. End items, assemblies, parts, attachments, or accessories for use in or on guided missiles are classified in classes other than this class. Includes Complete Drones, initially designed as missiles, but converted to drone use. 	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
+\N	Category	1420	FSC	0	Guided Missile Components	Guided Missile Components	 Includes Structural Components; Components and Accessories Specially Designed for use on or with guided missiles, including Complete Gyro Mechanisms, Hydraulic Pumps, Automatic Pilot Mechanisms and Specially Designed Assemblies, and Electronic Guidance Equipment installed in missiles. Excludes Electronic Remote Guidance Equipment used to guide missiles; Solid and Liquid Propellant Units; Components of Gyro Mechanisms.	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
+\N	Category	1425	FSC	0	Guided Missile Systems, Complete	Guided Missile Systems, Complete	Note-This class includes only complete guided missile systems. Anything less than a complete system, such as individual end items, assemblies, parts, attachments, or accessories for use in guided missile systems are classified in classes other than this class.  Excludes Guided Missile Subsystems.	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
+\N	Category	1427	FSC	0	Guided Missile Subsystems	Guided Missile Subsystems	Note-This class includes only combinations or assemblies of two or more end items, each of which is properly classified in other classes of this group, identified as single items of supply. Excluded from this class are individual end items, assemblies, subassemblies, attachments, accessories or parts classified in other classes of this group, not combined as single items of supply.  Excludes Complete Guided Missile Systems.	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
+\N	Category	1450	FSC	0	Guided Missile Handling and Servicing Equipment	Guided Missile Handling and Servicing Equipment	 Includes Specially Designed Trucks and Trailers for use in transporting guided missiles; Specially Designed Slings, Hoists, Jacks, and Blowers; Self-propelled Vehicles and Trailers, Specially Designed for Guided Missile Handling or Servicing; Covers, Guided Missile; Conditioning Kits and Sets, Controlled Environment. Excludes Guided Missile Launchers (FSC 1440); Aircraft Handling and Servicing Equipment (FSC 1730).	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
+\N	Category	1510	FSC	0	Aircraft, Fixed Wing	Aircraft, Fixed Wing	Note-This class includes only complete aircraft. End items, assemblies, parts, attachments, or accessories for use in or on fixed wing aircraft are classified in classes other than this class.  	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
+\N	Category	1520	FSC	0	Aircraft, Rotary Wing	Aircraft, Rotary Wing	Note-This class includes only complete aircraft. End items, assemblies, parts, attachments, or accessories for use in or on rotary wing aircraft are classified in classes other than this class. Includes Helicopters. 	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
+\N	Category	1540	FSC	0	Gliders	Gliders	Note-This class includes only complete gliders. End items, assemblies, parts, attachments, or accessories for use in or on gliders are classified in classes other than this class. Includes Motorized Gliders. 	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
+\N	Category	1550	FSC	0	Drones	Drones	Note-This class includes only complete drones. End items, assemblies, parts, attachments, or accessories for use in or on drones are classified in classes other than this class. Includes Drones specifically designed for such uses as targets, training, surveillance, missile evaluation, and photographic reconnaissance. Excludes Piloted aircraft and guided missiles converted to drone use.	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
+\N	Category	1560	FSC	0	Airframe Structural Components	Airframe Structural Components	Note-This class includes fabricated system parts that are permanently attached or peculiar to the integral airframe of an aircraft, such as support structural components, spars, ribs, ailerons, stabilizers, bulkheads. Includes Flight Control Surfaces; Internal and External Auxiliary Fuel Tanks; Exhaust Systems; Pylons, Trim Tabs; Aircraft. Excludes Fitted Covers; Helicopter Rotor Brake System Components; Aircraft Loose Equipment and Alternate Mission Configuration Equipment stored on board the aircraft.	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
+\N	Category	1610	FSC	0	Aircraft Propellers and Components	Aircraft Propellers and Components	 Includes Aircraft Propellers; Propeller Blades, Cams, Cones, Hubs, Nuts, and Spinners; Test Clubs; Synchronizers; Power Control Units; Integral Oil Control Measures and Propeller Governors. Excludes Rotary Rudder and Rotary Wing Blades (FSC 1615).	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
+\N	Category	1615	FSC	0	Helicopter Rotor Blades, Drive Mechanisms and Components.	Helicopter Rotor Blades, Drive Mechanisms and Components.	Note-This class includes miscellaneous component parts specifically designed for, and used exclusively in, helicopter drive mechanisms and rotor blades when not specifically classified elsewhere in the FSC indexes. Includes Helicopter dynamic components and specially designed parts that transmit power from the aircraft power plant to the rotary wing and rotary rudder. Also included in this class are Rotors; Blades; Rotor Blade, Trim, Tabs; Blade Sets; Yokes; Clutches and Transmissions. Excludes Propellers (FSC 1610); Rotor Brake Systems Components (FSC 1630); Rotor Blade Hydraulic Folding System Components (FSC 1650); Hydraulic Servo System Components (FSC 1650).	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
+\N	Category	1620	FSC	0	Aircraft Landing Gear Components	Aircraft Landing Gear Components	 Includes Shock Struts and Components; Installation Elements, such as Torsion Bars, Vibration Links, Drag Struts; Landing Gear Trunions, Axles and Shimmy Dampeners; Specially designed hydraulic power steering system components. Excludes Mounting Braces and Mounting Plates permanently installed on aircraft (FSC 1680); Landing Wheels, Skis, and Floats (FSC 1630); Wheel Brakes and Wheel Brake Cylinders (FSC 1630).	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
+\N	Category	1630	FSC	0	Aircraft Wheel and Brake Systems	Aircraft Wheel and Brake Systems	 Includes Skis; Floats; Tracks; Landing Wheel Skid Detectors; Valves specifically designed for use with hydraulic or pneumatic wheel and brake systems; Helicopter Rotor Brake System Components. Excludes Landing Gear Axles (FSC 1620).	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
+\N	Category	1640	FSC	0	Aircraft Control Cable Products	Aircraft Control Cable Products	Note - Wire rope, with attachments or terminations and pulleys, used in aircraft control applications, will be classified in this class. Includes Wire Rope; Single Leg Wire Assemblies; Wire Strands; Control Pulleys; Turnbuckle Lock Clips and other wire rope attachments and terminations. Excludes General use Chain and Wire Rope (FSC 4010); general use Pulleys (FSC 3020); general use Miscellaneous Hardware (FSC 5340); general use Fittings for Rope, Cable and Chain (FSC 4030).	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
+\N	Category	1650	FSC	0	Aircraft Hydraulic, Vacuum, and De-icing System Components	Aircraft Hydraulic, Vacuum, and De-icing System Components	Note-This class includes only those components specifically designed for aircraft use. Includes Hydraulic and Pneumatic Accumulators, Pumps, Motors, Actuating Cylinders, and Filters; De-icing Boots; Fluid Type De-icing Pumps, Valves and Filters; Vacuum System Oil Separators; Pneumatic Pressurization Equipment other than that for pressurizing cabins and compartments. Excludes Jet Engine Hydraulic Components (FSC 2840); Valves specifically designed for air conditioning, heating, ventilating, cabin pressurizing, and thermal de-icing (FSC 1660); Valves specifically designed for use with Aircraft Engines (FSC 2840); Guided Missiles and Guided Missile Engines (FSC 1338), Landing Gear (FSC 1620), Wheel and Brake System Components (FSC 1630); Oxygen Breathing System Components (FSC 1660); In-flight Refueling System Hydraulic components (FSC 1680); Specifically designed hydraulic power steering system components (FSC 1620).	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
+\N	Category	1660	FSC	0	Aircraft Air Conditioning, Heating, and Pressurizing Equipment	Aircraft Air Conditioning, Heating, and Pressurizing Equipment	Note-This class includes components specifically designed for use in aircraft air conditioning, heating, and pressurizing equipment. Also included are specially designed components of oxygen breathing systems used in aircraft. Includes Cabin Supercharging Equipment; Canisters; Cylinder Assemblies; Masks; Fixed Oxygen System; Specially Designed Aircraft Valves; Cabin Pressure Regulators; Heat Exchangers; Air Expansion Turbines; Aircraft Heaters; Ventilating System Components; Air Conditioning and Heating Duct Assemblies; Thermal De-icing Equipment; Cabin and Compartment Pressurizing Equipment; Air Diffusers; Cabin Pressure Selectors; Liquid Oxygen Converters. Excludes Oxygen Pressure Signals and Warning Devices; Tubing; Ground Type Heaters and Coolers; Pressurizing Equipment other than that used for Cabin and Compartment Pressurization; Fluid De-icing Equipment; Valves specifically designed for use with Aircraft Engines, Guided Missiles, and Guided Missile Engines.	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
+\N	Category	1670	FSC	0	Parachutes; Aerial Pick Up, Delivery, Recovery Systems; and Cargo Tie Down Equipment	Parachutes; Aerial Pick Up, Delivery, Recovery Systems; and Cargo Tie Down Equipment	Note-Includes specifically designed items, sets, and systems for air-to-air, air-to-surface, and surface-to-air delivery, pick up, and recovery operations, unless parts, attachments, assemblies, for use in or on such systems (i.e., space vehicle aerial recovery systems) are specifically indexed to other classes of the FSC (i.e., Transmitting Radio Buoys and Direction Finding Subsystem Components).  Excludes Fitting Assemblies built into the aircraft structure.	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
+\N	Category	1680	FSC	0	Miscellaneous Aircraft Accessories and Components	Miscellaneous Aircraft Accessories and Components	 Includes Control Assemblies, Push-Pull; Brace, Positioning Cargo Ramp stowed on board; Cockpit Mounted Control Quadrants; Actuators, Electro-Mechanical and Mechanical; Ventilators; Relief Tubes; Map Holders; Aerial Glider Towing Accessories attached to Aircraft; Belts, Safety and Lap; Harness, Shoulder and Safety; Litter Attaching Supports;Electric Windshield Wipers;Aircraft Onboard Inert Gas Generators;Aircraft Furniture;Aircraft Mounted Winches and Hoists;In-Flight Refueling System Components, including Fuel Components;Aircraft Curtains;Cable Tension Regulators;Sun Visors;Rear-View Mirrors;Mechanical Transmissions, Gearboxes and Constant Speed drives Specially designed for aircraft. Excludes Engine Mounted Control Assemblies; Fitted Covers, Aircraft Pylons; Helicopter Roter Brake System Components; Helicopter Automatic Stabilization Equipment.	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
+\N	Category	1710	FSC	0	Aircraft Landing Equipment.	Aircraft Landing Equipment.	 Includes Aircraft Arresting Barriers. Excludes Airport Runway Marker Lights (FSC 6220).	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
+\N	Category	1720	FSC	0	Aircraft Launching Equipment	Aircraft Launching Equipment	 Includes Catapults. Excludes Guided Missile Launchers (FSC 1440) and Space Vehicle Launchers (FSC 1840).	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
+\N	Category	1730	FSC	0	Aircraft Ground Servicing Equipment	Aircraft Ground Servicing Equipment	Note-This class excludes "vehicular components" such as those listed under FSC's 2520, 2530, 2540, 2590. Includes Energizers; Engine Preheaters; Mooring Assemblies; Wheel Chocks; Beaching Equipment; Aileron, Elevator, and Rudder Locks; Passenger Loading Ramps; Maintenance Platforms; Aircraft Maintenance and Boarding Ladders; Aircraft Maintenance Slings and Hoists; Aircraft Fin Tilting Jacks; Airfield Specialized Lift Trucks and Trailers; Fitted Covers for Airframe Components; Aircraft Engine Covers. Excludes Airfield Specialized Trucks and Trailers designed primarily for transporting aircraft assemblies (FSC 1740); Maintenance Stands designed for support of aircraft assemblies during repair or overhaul (FSC 4920); Test Stands (FSC 4920); General Purpose Jacks (FSC 5120); Slings (FSC 3940), and Hoists (FSC 3950); Trailers (FSC 2330), Liquid Oxygen, Aircraft Servicing (FSC 1660).	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
+\N	Category	1740	FSC	0	Airfield Specialized Trucks and Trailers	Airfield Specialized Trucks and Trailers	Note-This class excludes "vehicular components" such as those listed under FSC's 2520, 2530, and 2590. Includes Airfield Specialized Trucks and Trailers designed primarily for transporting aircraft assemblies; Trailers: Afterburner, Engine, Propeller, Fuselage, and Wing; Trucks, Aircraft Fuselage and Aircraft Wing; Skids, Engine Transport; Stands, Engine Transport; Bomb Trailers, Airfield; Trucks, Crashed Aircraft Removing. Excludes Airfield Specialized Lift Trucks (FSC 3930), and Trailers (FSC 2330); Highway Type Trucks (FSC 2320), and Trailers (FSC 2330); Cargo Loading and Unloading Trailers (FSC 2330) and Trucks (FSC 2320).	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
+\N	Category	1810	FSC	0	Space Vehicles	Space Vehicles	Note-This class includes only complete space vehicles, whether in assembled or unassembled form.  	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
+\N	Category	1820	FSC	0	Space Vehicle Components	Space Vehicle Components	 Includes Structural Components; Components and Accessories specially designed for installation in or on Space Vehicles; Internal (Built-in) Control Systems. Excludes Remote Guidance Equipment.	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
+\N	Category	1830	FSC	0	Space Vehicle Remote Control Systems	Space Vehicle Remote Control Systems	 Includes Specifically designed Components of Space Vehicle Remote Control Systems. Excludes Internal (Built-in) Control Systems; Components designed for use with both Guided Missile and Space Vehicle Systems.	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
+\N	Category	1840	FSC	0	Space Vehicle Launchers	Space Vehicle Launchers	 Includes Launchers specifically designed for Space Vehicles. Excludes Launchers used with both Guided Missiles and Space Vehicles.	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
+\N	Category	1850	FSC	0	Space Vehicle Handling and Servicing Equipment	Space Vehicle Handling and Servicing Equipment	Note-This class does not include space vehicle aerial recovery system which are classified in Class 1670. Includes Specially designed Trucks and Trailers for use in transporting Space Vehicles; Specially designed Slings, Hoists, Jacks, and Blowers, Self-propelled Vehicles, specially designed for space vehicle handling or servicing; Covers, space vehicle Excludes Equipment used in handling or servicing both Guided Missile and Space Vehicles.	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
+\N	Category	1860	FSC	0	Space Survival Equipment	Space Survival Equipment	 Includes Food and Water Production Equipment; Air Production Equipment; Shelter Equipment; Power Generation and Conversion Equipment. Excludes Items which are integral components of Space Vehicles.	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
+\N	Category	1905	FSC	0	Combat Ships and Landing Vessels	Combat Ships and Landing Vessels	 Includes Aircraft Carriers; Battleships; Cruisers; Destroyers; Submarines; Frigates and Corvettes; Gunboats; Motor Torpedo Boats; Subchasers; Landing Barges; Minelaying and Mine Sweeping Craft. 	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
+\N	Category	1910	FSC	0	Transport Vessels, Passenger and Troop	Transport Vessels, Passenger and Troop	  	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
+\N	Category	1915	FSC	0	Cargo and Tanker Vessels	Cargo and Tanker Vessels	  	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
+\N	Category	1920	FSC	0	Fishing Vessels	Fishing Vessels	  	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
+\N	Category	1925	FSC	0	Special Service Vessels	Special Service Vessels	 Includes Tugs; Towboats; Fire Boats; Ice Breakers; Repair Ships; Tender Vessels (Buoy, Lighthouse, Destroyer); Lightships; Cable Ships; Salvage and Submarine Rescue Vessels. Excludes Combat Vessels; Dredges.	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
+\N	Category	1930	FSC	0	Barges and Lighters, Cargo	Barges and Lighters, Cargo	 Includes Aircraft Lighters, Car Floats, and other Transportation Barges, Depot Barges; Scows. 	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
+\N	Category	1935	FSC	0	Barges and Lighters, Special Purpose	Barges and Lighters, Special Purpose	 Includes Derrick, Piledriver, and Rock Cutter Barges; Barrage Balloon, Catapult Lighter, and Torpedo Testing Barges; Concrete Mixing Plant, Mechanical Bank Grader, and other Bank Revetment Barges; Fire, Smudge Removal, and other Pump Barges; Houseboats, except Yacht Type; Power Plant Barges; Refrigeration Barges; Barge Mounted Cranes, Flexible Towed Barges. Excludes Combat Landing Barges.	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
+\N	Category	1940	FSC	0	Small Craft	Small Craft	 Includes Powered and Unpowered Small Craft; Lifesaving Boats; Airplane Crash Boats; Reconnaissance Boats; Yachts; Pneumatic Boats. Excludes Fishing Craft; Life Rafts, including Pneumatic; Bridge Floats and Pontoons.	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
+\N	Category	1945	FSC	0	Pontoons and Floating Docks	Pontoons and Floating Docks	 Includes Camels; Pontoon Stanchions; Pontoon Ramps. Excludes Floating Drydocks; Bridge Floats and Pontoons; Pontoon Hardware (Jewelry).	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
+\N	Category	1950	FSC	0	Floating Drydocks	Floating Drydocks	  	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
+\N	Category	1955	FSC	0	Dredges	Dredges	 Includes Dredges, without Hull; Ocean-Going Dredges; Floating Dredges. 	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
+\N	Category	1990	FSC	0	Miscellaneous Vessels	Miscellaneous Vessels	 Includes Commercial Sailing Vessels. 	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
+\N	Category	2010	FSC	0	Ship and Boat Propulsion Components	Ship and Boat Propulsion Components	 Includes Propulsion Shafts; Ship Proppellers. Marine Transmissions, Reverse and Reduction Gear Type. Excludes Engines (FSC 2810, 2815); Turbines (FSC 2825, 2835, 2840).	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
+\N	Category	2020	FSC	0	Rigging and Rigging Gear	Rigging and Rigging Gear	 Includes Masts; Kingposts; Sail Booms; Shipborne Booms not attached to Cranes and Derricks. Excludes Tackle Blocks.	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
+\N	Category	2030	FSC	0	Deck Machinery	Deck Machinery	 Includes Steering Gears and Controls; Boat Davits. 	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
+\N	Category	2040	FSC	0	Marine Hardware and Hull Items	Marine Hardware and Hull Items	 Includes Anchors; Grapnels; Sea Anchors; Watertight Doors; Ship Ventilators; Hatches; Manholes; Scuttles; Air Ports; Fenders; Sea Chests; Scuppers; Rudders; Stern Tubes; Chain Pipes; Hawse Pipes; Boiler Uptakes and Stacks; Chocks; Mast and Boom Fittings; Oars; Paddles; Oarlocks. 	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
+\N	Category	2050	FSC	0	Buoys	Buoys	  	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
+\N	Category	2060	FSC	0	Commercial Fishing Equipment	Commercial Fishing Equipment	  Excludes Fishing Vessels.	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
+\N	Category	2090	FSC	0	Miscellaneous Ship and Marine Equipment	Miscellaneous Ship and Marine Equipment	 Includes Sails; Chain Ladders; Rope Ladders; Marine Furniture. 	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
+\N	Category	2210	FSC	0	Locomotives	Locomotives	Note-This class includes only complete locomotives and tenders. End items, assemblies, parts, attachments, or accessories for use in or on locomotives and tenders are classified in classes other than this class.  Excludes Self-Propelled Cars.	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
+\N	Category	2220	FSC	0	Rail Cars	Rail Cars	Note-This class includes only complete rail cars. End items, assemblies, parts, attachments, or accessories for use in or on rail cars are classified in classes other than this class. Includes Trailed Cars; Self-Propelled Cars. Excludes Aerial Tramway Cars.	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
+\N	Category	2230	FSC	0	Right-of-Way Construction and Maintenance Equipment, Railroad	Right-of-Way Construction and Maintenance Equipment, Railroad	 Includes Rail Laying, Joining and Shifting Equipment; Self-propelled and Car Mounted Cranes. Excludes Hand Tools (FSG 51).	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
+\N	Category	2240	FSC	0	Locomotive and Rail Car Accessories and Components	Locomotive and Rail Car Accessories and Components	 Includes Brake Beams and Components; Couplers; Trucks and Components; Journals and Components; Wheel Sets and Components. Excludes Railroad Furniture (FSG 71).	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
+\N	Category	2250	FSC	0	Track Material, Railroad	Track Material, Railroad	 Includes Railroad Rails; Railroad Tie Plates; Railroad Turnouts and Components; Railroad Spikes. Excludes Ballast (FSC 5610); Railroad Ties (FSC 5510).	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
+\N	Category	2305	FSC	0	Ground Effect Vehicles	Ground Effect Vehicles	  	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
+\N	Category	2310	FSC	0	Passenger Motor Vehicles	Passenger Motor Vehicles	Note-This class includes only complete passenger motor vehicles, and chassic therefor. Any end items, assemblies, parts, attachments, or accessories, other than complete chassis, for use in or on passenger motor vehicles are classified in classes other than this class. Includes Cars, Motor, Highway; Busses; Chassis, Passenger Motor Vehicle; Hearses; Ambulances. Excludes Amphibious Personnel Carriers; All Truck Chassis.	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
+\N	Category	2320	FSC	0	Trucks and Truck Tractors, Wheeled	Trucks and Truck Tractors, Wheeled	Note-This class includes only complete wheel mounted trucks and truck tractors, and chassis therefor. Any end items, assemblies, parts, attachments, or accessories other than complete chassis, for use in or on such trucks or truck tractors are classified in classes other than this class. The combined chassis and body of a special purpose truck, such as a machine shop, mobile laundry, or dental laboratory, is classified in this class. The complete mobile unit, consisting of chassis, body, and additional equipment, as in an equipped truck mounted machine shop, is excluded from this class. Includes Panel, Delivery and Pick Up Trucks, Tactical and Administrative Military Cargo Carrying Vehicles, including Wheel Mounted Amphibian Vehicles; Truck Tractors and Trailer Combinations; Armored Cars. Excludes Fire Trucks; Special Construction Type Earth and Rock Hauling Trucks; Motorized Air Compressors; Motorized Concrete Mixers; Construction Specialized Machinery Generally; Specially designed trucks for use in and around airfields, hangers, and warehouses; Tracked and Halftracked Vehicles.	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
+\N	Category	2330	FSC	0	Trailers	Trailers	Note-This class includes only complete trailers, and chassis therefor. Any end items, assemblies, parts, attachments, or accessories, other than complete chassis, for use in or on trailers are classified in classes other than this class. The combined chassis and body of a special purpose trailer, such as a machine shop, mobile laundry, or dental laboratory, is classified in this class. The complete mobile unit, consisting of chassis, body, and additional equipment, as in an equipped trailermounted machine shop, is excluded from this class. Includes Semitrailers; Semitrailer Dollies; Cargo Trailers; Passenger and House Trailers; Special Purpose Trailers, such as Ammunition. Excludes Fire Fighting Trailers; Specially designed trailers for use in and around airfields, hangers, and warehouses.	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
+\N	Category	2340	FSC	0	Motorcycles, Motor Scooters, and Bicycles	Motorcycles, Motor Scooters, and Bicycles	Note-This class includes only complete motorcycles, complete motor scooters, and complete bicycles. End items, assemblies, parts, attachments, or accessories for use in or on motorcycles, motor scooters, or bicycles are classified in classes other than this class. Includes Sidecars; Tricycles. Excludes Children's Wheeled Goods.	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
+\N	Category	2350	FSC	0	Combat, Assault, and Tactical Vehicles, Tracked	Combat, Assault, and Tactical Vehicles, Tracked	Note-This class includes only complete combat, assault, and tactical tracked vehicles, and chassis. Any end items, assemblies, parts, attachments, or accessories, other than complete chassis, for use in or on such vehicles are classified in classes other than this class. Includes Tanks and Tracked Self-Propelled Weapons and Vehicles with or without amphibian capabilities; Armored Halftracks; Self-Propelled Sleds; and Self-Propelled Flame Throwers. Excludes Wheel Mounted Vehicles.	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
+\N	Category	2410	FSC	0	Tractor, Full Tracked, Low Speed	Tractor, Full Tracked, Low Speed	Note-This class includes only complete low speed, full track tractors, and chassis. Any end items, assemblies, parts, attachments, or accessories, other than complete chassis, for use in or on low speed, full track tractors, are classified in classes other than this class.  Excludes High Speed Tractors (FSC 2430); Armored Dozer-Scrapper Combination Tractors (FSC 2350).	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
+\N	Category	2420	FSC	0	Tractors, Wheeled	Tractors, Wheeled	Note-This class includes only complete wheeled tractors, and chassis. Any end items, assemblies, parts, attachments, or accessories, other than complete chassis, for use in or on wheeled tractors, are classified in classes other than this class. Includes Agricultural Tractors; High Speed Tractors; Industrial Tractors. Excludes Aircraft Towing Tractors and Crashed Aircraft Moving Tractors (FSC 1740); Aircraft Towing-Power Servicing Tractors (FSC 1730); Warehouse Tractors (FSC 3930).	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
+\N	Category	2430	FSC	0	Tractors, Full Tracked, High Speed	Tractors, Full Tracked, High Speed	Note-This class includes only complete high speed track laying tractors, and chassis. Any end items, assemblies, parts, attachments, or accessories, other than complete chassis, for use in or on high speed track laying tractors, are classified in classes other than this class.  Excludes Low Speed Tractor (FSC 2410); Armored Dozer-Scraper Combination Tractors (FSC 2350).	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
+\N	Category	2510	FSC	0	Vehicular Cab, Body, and Frame Structural Components	Vehicular Cab, Body, and Frame Structural Components	 Includes Leaf Type Vehicular Springs; Suspension Type Shock Absorbers. Excludes Vehicular Hardware (FSG 53); Specialized Vehicular Furniture (FSC 2540).	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
+\N	Category	2520	FSC	0	Vehicular Power Transmission Components	Vehicular Power Transmission Components	 Includes Transfer Transmission Assemblies; Clutch Assemblies; Universal Joints; Propeller Shafts; Automotive Torque Converters; Power Takeoffs. 	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
+\N	Category	2530	FSC	0	Vehicular Brake, Steering, Axle, Wheel, and Track Components.	Vehicular Brake, Steering, Axle, Wheel, and Track Components.	 Includes Turrent Brakes; Clutch Brakes, Tank Turret. 	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
+\N	Category	2540	FSC	0	Vehicular Furniture and Accessories	Vehicular Furniture and Accessories	 Includes Automobile Seat Covers; Shock Absorbers; Bumpers; Windshield Wipers; Bumper Guards; Mirrors, Rear View and Side View; Vehicle Heaters. Excludes Speedometers (FSC 6680); Suspension Type Shock Absorbers (FSC 2510).	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
+\N	Category	2541	FSC	0	Weapons Systems Specific Vehicular Accessories	Weapons Systems Specific Vehicular Accessories	 Includes: Accessory Kits and Boxes, Parts Kits, and individual components used in the repair and/or modification of Weapons System type Vehicles such as Tanks, Personnel Carriers, Mobile Howitzers, and the like. Excludes: Items used in the repair and/or modifications of Commercial Type Vehicles (FSC 2540), vehicular type light fixtures (FSC 6220), and electronic switches, parts kits, and modification kits (FSG 59).	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
+\N	Category	2590	FSC	0	Miscellaneous Vehicular Components	Miscellaneous Vehicular Components	 Includes Attachments for Tanks, Self-propelled Weapons, and High Speed Tractors; A-frames and Winches specifically designed for truck mounting; Cranes and Crane Booms for Wrecker Trucks. 	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
+\N	Category	2610	FSC	0	Tires and Tubes, Pneumatic, Except Aircraft	Tires and Tubes, Pneumatic, Except Aircraft	  Excludes Aircraft Pneumatic Tires and Tubes.	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
+\N	Category	2620	FSC	0	Tires and Tubes, Pneumatic, Aircraft	Tires and Tubes, Pneumatic, Aircraft	  	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
+\N	Category	2630	FSC	0	Tires, Solid and Cushion	Tires, Solid and Cushion	 Includes Rubber Track Laying Treads. 	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
+\N	Category	2640	FSC	0	Tire Rebuilding and Tire and Tube Repair Materials	Tire Rebuilding and Tire and Tube Repair Materials	 Includes Tread Gum; Cold Patches; Friction Cord Fabric; Vulcanizing Patches; Padding Stock; Quick-Cure Gum; Tire and Tube Repair Kits; Camelback; Valves; Valve Cores. Excludes Vulcanizing Machinery and Equipment.	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
+\N	Category	2805	FSC	0	Gasoline Reciprocating Engines, Except Aircraft; and Components	Gasoline Reciprocating Engines, Except Aircraft; and Components	 Includes Gas Reciprocating Engines; All Gasoline Reciprocating Engines except Aircraft Prime Moving. Excludes Engine Accessories (FSC 2990).	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
+\N	Category	2810	FSC	0	Gasoline Reciprocating Engines, Aircraft Prime Mover; and Components	Gasoline Reciprocating Engines, Aircraft Prime Mover; and Components	Note Engines and components classified in this FSC must be desinged specifically for use as/on an aircraft prime mover. Auxiliary engines and their components will be classified in the appropriate FSC elsewhere in FSG 28. Includes Complete Engine Assemblies; Piston Rings; Cylinders; Pistons; Camshafts; Crankshafts. Excludes Fuel System Components (Carburetors; Carburetor Floats; Fuel Pumps; Fuel Controls; Fuel Valves) (FSC 2915); Electrical System Components (Spark Plug Adapters; Ignition Distributors; Ignition Coils, Electrical Starters) (FSC 2925); Engine Cooling System Components (Engine Oil Coolers; Cooling Radiators) (FSC 2935); Engine Air/Oil Cleaners/Filters/Strainers (FSC 2945); Miscellaneous Engine Accessories (Pneumatic Starters, Cowling Mounts, Control Assemblies) (FSC 2995).	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
+\N	Category	2815	FSC	0	Diesel Engines and Components	Diesel Engines and Components	 Includes Automotive, Industrial, Marine, Locomotive, and all other types of Diesel and Semi-Diesel Engines. Excludes Engines Accessories (FSC 2990).	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
+\N	Category	2820	FSC	0	Steam Engines, Reciprocating; and Components	Steam Engines, Reciprocating; and Components	  	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
+\N	Category	2825	FSC	0	Steam Turbines and Components	Steam Turbines and Components	 Includes Mercury Vapor Turbines. 	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
+\N	Category	2830	FSC	0	Water Turbines and Water Wheels; and Components	Water Turbines and Water Wheels; and Components	  	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
+\N	Category	2835	FSC	0	Gas Turbines and Jet Engines; Non-Aircraft Prime Mover, Aircraft Non-Prime Mover, and Components	Gas Turbines and Jet Engines; Non-Aircraft Prime Mover, Aircraft Non-Prime Mover, and Components	Note Engines and Components classified in this FSC are primarily for use on non-aircraft prime mover (e.g., Naval ship applications), aircraft non-prime mover (e.g., airframe mounted auxiliary power units), and for aircraft ground support equipment (e.g., start carts). Includes Airflow Deflectors; Combustion Chambers, Compressors, Turbines, Accessory Gear Boxes and their Components. Excludes Components for Gas Turbines and Jet Engines, Aircraft Prime Mover (FSC 2840); Engine Fuel Systems (FSC 2910); Engine Electrical Systems (FSC 2920); Engine Cooling Systems (FSC 2930); Engine Air/Oil Cleaners/Filters/Strainers (FSC 2940); Engine Accessories (Air Duct Heaters, Engine Mounted Control Assemblies) (FSC 2990).	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
+\N	Category	2840	FSC	0	Gas Turbines and Jet Engines, Aircraft, Prime Moving; and Components	Gas Turbines and Jet Engines, Aircraft, Prime Moving; and Components	Note Engines and Components classified in this FSC are intended for use as/on aircraft and/or guided missile prime movers. Includes Compressor and Turbine Rotors; Blades; Combustion Chamber; Accessory Gear Box; Afterburner; Exhaust Cone; Reservoirs, Hydraulic; Tank, Oil. Excludes Oil, Air, Anti-icing, and Hydraulic Regulators, Valves, and Pumps specially designed for Gas Turbines and Jet Engines (FSC 2995); Control Assemblies, Push-Pull (FSC 2995); Engine Mounted Control Assemblies (FSC 2995); Fuel System Components (FSC 2915); Engine Electrical System Components (FSC 2925); Engine Cooling System Components (FSC 2935); Engine Air/Oil Cleaner/Filter/Strainers (FSC 2945).	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
+\N	Category	2845	FSC	0	Rocket Engines and Components	Rocket Engines and Components	 Includes Rocket Prime Movers, Liquid Type, including Liquid Jet Assisted Take Off (JATO) Units, for use in aircraft, rockets, and guided missiles; Liquid Propellants encased in consumable containers, intended for insertion into missile propulsion systems as integral parts. Excludes Rocket Motors - Solid Propellant Units (FSC 1337); Liquid Propellants predetermined to specific quantity and quality, but packaged in reusable containers; Solid Propellant Squibs and Cartridges, whether intended for insertion into Liquid Propellent Systems or not (FSC 1337).	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
+\N	Category	2850	FSC	0	Gasoline Rotary Engines and Components	Gasoline Rotary Engines and Components	  	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
+\N	Category	2895	FSC	0	Miscellaneous Engines and Components	Miscellaneous Engines and Components	 Includes Wind and Compressed Air Engines. 	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
+\N	Category	2910	FSC	0	Engine Fuel System Components, Nonaircraft	Engine Fuel System Components, Nonaircraft	 Includes Carburetors; Fuel Pumps; Engine Fuel Filters; Fuel Tanks; Components for all engines except Aircraft and Guided Missile Prime Moving. 	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
+\N	Category	2915	FSC	0	Engine Fuel System Components, Aircraft and Missile Prime Movers	Engine Fuel System Components, Aircraft and Missile Prime Movers	Note Fuel components specially designed for propulsion fuel systems, aircraft and missiles are to be placed in this FSC. Includes Carburetors; Fuel Pumps; Engine Fuel Filters; Fuel Controls, Jet Engine; Fuel Primers; Water Injection Controls and Valves; Fuel Valves Fuel Flow Regulators; Components of Smoke Abatement Systems. Excludes Aircraft Fuel Tanks (FSC 1560); In-flight Refueling System Fuel Components (FSC 1680). Fuel System Components not specifically designed for use with Aircraft Engines or Missile Prime-movers.	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
+\N	Category	2920	FSC	0	Engine Electrical System Components, Nonaircraft	Engine Electrical System Components, Nonaircraft	 Includes Generators; Magnetos; Spark Plugs; Ignition Coils; Ignition Distributors; Engine Voltage Regulators; Ignition Harness Assemblies; Starting Motors for Engines. Excludes Vehicular Lighting Fixtures (FSC 6220) and Aircraft Generators (FSC 2925).	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
+\N	Category	2925	FSC	0	Engine Electrical System Components, Aircraft Prime Moving	Engine Electrical System Components, Aircraft Prime Moving	Note Items designed for specific use on aircraft and guided missile prime movers are to be placed in this FSC. Includes Magnetos; Igniters (Spark Plugs); Ignition Coils; Ignition Distributors; Engine Voltage Regulators; Ignition Harness Assemblies; Starting Motors for Engines; Engine Accessory Generators. Excludes Aircraft Lighting Fixtures (FSC 6220); Auxiliary Aircraft Generators (FSC 6115).	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
+\N	Category	2930	FSC	0	Engine Cooling System Components, Nonaircraft	Engine Cooling System Components, Nonaircraft	 Includes Cooling Fans; Radiators; Water Pumps; Water Hose Assemblies; Engine Coolant Filters; Components for all Engines except Aircraft and Guided Missile Prime Moving. 	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
+\N	Category	2935	FSC	0	Engine System Cooling Components, Aircraft Prime Moving	Engine System Cooling Components, Aircraft Prime Moving	Note This class includes only cooling system components for aircraft and/or guided missile prime movers only. Includes Radiators; Cooling System Pumps; Water Hose Assemblies; Lubricating Oil Coolers and Control Valves; Oil Temperature Regulators. Excludes Cooling System Components not specifically designed for use with Aircraft Engines.	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
+\N	Category	2940	FSC	0	Engine Air and Oil Filters, Strainers, and Cleaners, Nonaircraft	Engine Air and Oil Filters, Strainers, and Cleaners, Nonaircraft	 Includes Components for all Engines except Aircraft and Guided Missile Prime Moving. Excludes Air and Oil Filters (FSC 4310, 4330), Strainers (FSC 4730) and Cleaners (FSC 4310) not specifically designed for use with engines.	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
+\N	Category	2945	FSC	0	Engine Air and Oil Filters, Cleaners, Aircraft Prime Moving	Engine Air and Oil Filters, Cleaners, Aircraft Prime Moving	Note Items placed in this FSC should be specifically designed for use on aircraft or guided missile prime movers only. Includes Air Filters; Oil Filters; Strainers; Cleaners. Excludes Fuel Filters (FSC 2915); Items designed for other than Engines.	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
+\N	Category	2950	FSC	0	Turbosupercharger and components	Turbosupercharger and components	Note All turbosuperchargers and their components not elsewhere classifiable will be classified in this FSC. Includes Turbosupercharged Regulators; Engine Turbosuperchargers. Excludes Engine Integrated Superchargers (FSG 28).	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
+\N	Category	2990	FSC	0	Miscellaneous Engine Accessories, Nonaircraft	Miscellaneous Engine Accessories, Nonaircraft	 Includes Engine Dynafocal Suspension Mounts; Engine Driven Superchargers (not integrated with engine); Starter Cranks; Engine Starter Ropes; Exhaust Mufflers; Hand Inertia Starters; Air Duck Heaters; Engine Governors; Intake Mufflers; Combustion Type Starters; Miscellaneous Accessories for all Engines except Aircraft and Guided Missile Prime Moving. Excludes Electrical Starters Non-Aircraft (FSC 2920); Aircraft (FSC 2925).	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
+\N	Category	2995	FSC	0	Miscellaneous Engine Accessories, Aircraft	Miscellaneous Engine Accessories, Aircraft	Note Items classified in this class must be specifically designed for use with aircraft or quided missile primemovers only. Includes Engine Dynafocal Suspension Mounts; Engine Cowling Mounts; Engine Mounted Control Assemblies; Pneumatic Starters; Push-Pull Control Assemblies;Specially designed Jet Engine Air, Oil, Anti-icing and Hydraulic Regulators; Valves and Pumps; Starting Units. Excludes Exhaust System; (FSC 1560); Jet Engine Hydraulic Reservoirs (FSC 2840); Jet Engine Oil Tanks (FSC 2840); Electrical Starters (FSC 2925); Cockpit Mounted Control Quadrants (FSC 1680); Aircraft Engine Covers (FSC 1730).	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
+\N	Category	3010	FSC	0	Torque Converters and Speed Changers	Torque Converters and Speed Changers	 Includes Fluid Couplings; Nonvehicular Clutches and Couplings; Horizontal Right Angle Drive Gear Units. Excludes Automotive Torque Converters (FSC 2520); Vehicular Power Transmission Components (FSC 2520); Rotary Aircraft Transmission Gear Units (FSC 1615).	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
+\N	Category	3020	FSC	0	Gears, Pulleys, Sprockets, and Transmission Chain	Gears, Pulleys, Sprockets, and Transmission Chain	 Includes Power Transmission Chain; Matched Gear Sets. Excludes Reduction Gears (FSC 3010).	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
+\N	Category	3030	FSC	0	Belting, Drive Belts, Fan Belts, and Accessories	Belting, Drive Belts, Fan Belts, and Accessories	 Includes Belt Lacings; Belt Pins. 	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
+\N	Category	3040	FSC	0	Miscellaneous Power Transmission Equipment	Miscellaneous Power Transmission Equipment	 Includes Shafts and Shafting; Collars; Gearshafts; Ball Joints; Actuating Cylinders. 	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
+\N	Category	3110	FSC	0	Bearings, Antifriction, Unmounted	Bearings, Antifriction, Unmounted	Note This class includes bearings that generally have roller or balls confined by an inner and outer ring to relieve friction in/on/around rotating/moving mechanisms. Includes Ball Bearings; Roller Bearings; Balls; Races. Excludes Plain Bearings (FSC 3120); Jewel Bearings (FSC 3120)	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
+\N	Category	3120	FSC	0	Bearings, Plain, Unmounted	Bearings, Plain, Unmounted	Note Bearings in this class are generally one piece that retain and position moving and/or rotating parts. They may have lubrication grooves/fittings/facilities or include pre-lubrication. Includes Sleeve Bearings; Split Bearings; Washer Type Bearings; Jewel Bearings. Excludes Antifriction Bearings (FSC 3110); Mounted Bearings (FSC 3130).	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
+\N	Category	3130	FSC	0	Bearings, Mounted	Bearings, Mounted	Note This class includes bearings that generally have roller or balls confined by an inner and outer ring to relieve friction in/on/around rotating/moving mechanisms. Includes Pillow Block Units; Cartridge Units; Flange Units; Takeup Units; Hanger Box Units; Flat Box Units; Step Box Units. Excludes Antifriction Bearings (FSC 3110); Plain Unmounted Bearings (FSC 3120).	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
+\N	Category	3210	FSC	0	Sawmill and Planing Mill Machinery	Sawmill and Planing Mill Machinery	  	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
+\N	Category	3220	FSC	0	Woodworking Machines	Woodworking Machines	 Includes Mortisers; Tenoners; Veneer Lathes. Excludes Hand Held Power Driven Tools; Hand Held Tools Operated by Flexible Shaft.	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
+\N	Category	3230	FSC	0	Tools and Attachments for Woodworking Machinery	Tools and Attachments for Woodworking Machinery	 Includes Circular and Band Saw Blades; Cutter Heads; Jointer and Notcher Heads; Cutters. Excludes Head Turning Tools.	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
+\N	Category	3405	FSC	0	Saws and Filing Machines	Saws and Filing Machines	 Includes Cutoff Machines; Saw Blade Dressing Machines; Retoothing Machines. 	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
+\N	Category	3408	FSC	0	Machining Centers and Way-Type Machines	Machining Centers and Way-Type Machines	Note-The following definitions apply to "Machining Centers" and "Way-type Machines".  a. "Machining Center", refers to a multipurpose numerically controlled machine tool for the complete and automatic machining of parts requiring multiple operations such as milling, drilling, tapping, boring, and reaming, having an integral tool storage device and an integral means for positioning various faces of the work piece. It must have facilities for automatic interchanging of varied cutting tools between successive operations. Excluded from this class are multipurpose numerically controlled machine tools, such as Boring-Drilling-Milling Machines, which require the use of an attachment or accessory for tool storage and/or to position the various faces of a work piece. These types of equipment are classified in other appropriate classes within group 34.  b. "Way-type Machine", refers to a special machine tool of station type design consisting of individually mounted self-contained machining units and facilities for indexing the work piece to each station in a predetermined sequence. The machining unit(s) may be disassembled and rearranged to accommodate different work piece configurations. Machine is capable of performing single or multiple operations on the work piece simultaneously or in sequence to each station.  	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
+\N	Category	3410	FSC	0	Electrical and Ultrasonic Erosion Machines	Electrical and Ultrasonic Erosion Machines	 Includes Electrical Discharge Machines; Electrolytic Grinding Machines. 	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
+\N	Category	3411	FSC	0	Boring Machines	Boring Machines	  	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
+\N	Category	3412	FSC	0	Broaching Machines	Broaching Machines	  	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
+\N	Category	3413	FSC	0	Drilling and Tapping Machines	Drilling and Tapping Machines	 Includes Multiple Spindle Drilling-Tapping Machines. Excludes Way-Type Machines.	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
+\N	Category	3414	FSC	0	Gear Cutting and Finishing Machines.	Gear Cutting and Finishing Machines.	  	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
+\N	Category	3415	FSC	0	Grinding Machines	Grinding Machines	  Excludes Electrolytic Grinding Machines.	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
+\N	Category	3416	FSC	0	Lathes	Lathes	 Includes Screw Machines Excludes Speed Lathes; Metal Spinning Lathes; Cartridge Case and Shell Lathes.	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
+\N	Category	3417	FSC	0	Milling Machines	Milling Machines	  	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
+\N	Category	3418	FSC	0	Planers and Shapers	Planers and Shapers	 Includes Combination Shaper-Planers. Excludes Gear Shapers; Planer Type Milling Machines.	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
+\N	Category	3419	FSC	0	Miscellaneous Machine Tools	Miscellaneous Machine Tools	 Includes Gun Rifling Machines; Speed Lathes. 	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
+\N	Category	3422	FSC	0	Rolling Mills and Drawing Machines	Rolling Mills and Drawing Machines	  	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
+\N	Category	3424	FSC	0	Metal Heat Treating and Non-Thermal Treating Equipment	Metal Heat Treating and Non-Thermal Treating Equipment	 Includes Hardening, Annealing, Tempering, Normalizing, Cyaniding, and Carburizing Equipment; Furnaces, Flue Welding, Non-Thermal Stress Relieving Systems. 	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
+\N	Category	3426	FSC	0	Metal Finishing Equipment	Metal Finishing Equipment	 Includes Galvanizing, Tinning, Oiling, Pickling; Electroplating, and Anodizing Equipment. 	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
+\N	Category	3431	FSC	0	Electric Arc Welding Equipment	Electric Arc Welding Equipment	 Includes Gas Shielded Arc Welding Machines; Arc Bonding Machines; Semi-Automatic and Automatic Arc Welding Machines. Excludes Welding Supplies, and Associated Equipment such as: Flux Recovery Mchines; Flux Dispensers; Tacker Panels; Welding Panels.	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
+\N	Category	3432	FSC	0	Electric Resistance Welding Equipment	Electric Resistance Welding Equipment	 Includes Electric Resistance Brazing Machines; Band Saw Brazers; Stored Energy Resistance Welding Machines. Excludes Electric Induction Brazing and Soldering Machines.	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
+\N	Category	3433	FSC	0	Gas Welding, Heat Cutting, and Metalizing Equipment	Gas Welding, Heat Cutting, and Metalizing Equipment	 Includes Metal Spray Guns; Arc Cutting Machines; Torches and Tips; Gas Brazing Machines; Flame Cutting Machines; Vacuum Metalizers; Spark Discharge Metalizers. Excludes Welding Supplies; Disintegrating Machines.	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
+\N	Category	3436	FSC	0	Welding Positioners and Manipulators	Welding Positioners and Manipulators	 Includes Welding Tables. 	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
+\N	Category	3438	FSC	0	Miscellaneous Welding Equipment	Miscellaneous Welding Equipment	 Includes Thermite Welding Equipment; Flux Recovery Machines; Flux Dispensers; Arc Converters; Welding Panels. 	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
+\N	Category	3439	FSC	0	Miscellaneous Welding, Soldering, and Brazing Supplies and Accessories	Miscellaneous Welding, Soldering, and Brazing Supplies and Accessories	 Includes Soldering Irons; Welding Electrodes and Rods; Brazing Fluxes; Soldering Fluxes; Solder. 	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
+\N	Category	3441	FSC	0	Bending and Forming Machines	Bending and Forming Machines	  Excludes Wire and Metal Ribbon Forming Machines.	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
+\N	Category	3442	FSC	0	Hydraulic and Pneumatic Presses, Power Driven	Hydraulic and Pneumatic Presses, Power Driven	 Includes Metal Powder Compacting Presses. 	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
+\N	Category	3443	FSC	0	Mechanical Presses, Power Driven	Mechanical Presses, Power Driven	 Includes Metal Powder Compacting Presses. 	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
+\N	Category	3444	FSC	0	Manual Presses	Manual Presses	 Includes Arbor, Straightening, Forcing, and Assembly Presses. 	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
+\N	Category	3445	FSC	0	Punching and Shearing Machines	Punching and Shearing Machines	  	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
+\N	Category	3446	FSC	0	Forging Machinery and Hammers	Forging Machinery and Hammers	  Excludes Forging Presses.	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
+\N	Category	3447	FSC	0	Wire and Metal Ribbon Forming Machines	Wire and Metal Ribbon Forming Machines	  Excludes Roll Forming Machines.	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
+\N	Category	3448	FSC	0	Riveting Machines	Riveting Machines	  Excludes Power Driven Hand Riveting Machines.	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
+\N	Category	3449	FSC	0	Miscellaneous Secondary Metal Forming and Cutting Machines	Miscellaneous Secondary Metal Forming and Cutting Machines	 Includes Metal Spinning Lathes. 	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
+\N	Category	3450	FSC	0	Machine Tools, Portable	Machine Tools, Portable	 Includes Portable Abrasive Cutting Machines; Portable Drilling Machines; Portable Slotters and Shapers. Excludes Stationary Type Machine Tools mounted on portable devices such as wheel or leg type stands.	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
+\N	Category	3455	FSC	0	Cutting Tools for Machine Tools	Cutting Tools for Machine Tools	 Includes Broaches; Files; Milling Cutters; Reamers; Saws. Excludes Flame Cutting Tools.	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
+\N	Category	3456	FSC	0	Cutting and Forming Tools for Secondary Metalworking Machinery	Cutting and Forming Tools for Secondary Metalworking Machinery	  	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
+\N	Category	3460	FSC	0	Machine Tool accessories	Machine Tool accessories	  Excludes Abrasive Wheels, Cones, and other Abrasive Attachments for use only on Hand Held Power Tools.	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
+\N	Category	3461	FSC	0	Accessories for Secondary Metalworking Machinery	Accessories for Secondary Metalworking Machinery	  Excludes Parts Feeders.	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
+\N	Category	3465	FSC	0	Production Jigs, Fixtures, and Templates	Production Jigs, Fixtures, and Templates	Note-This class includes jigs, fixtures, and templates used in conjection with the metalworking machinery classified in Group 34. Jigs, fixtures, and templates used in conjunction with maintenance and repair shop specialized equipment are classified in Group 49.  	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
+\N	Category	3470	FSC	0	Machine Shop Sets, Kits, and Outfits	Machine Shop Sets, Kits, and Outfits	  	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
+\N	Category	3510	FSC	0	Laundry and Dry Cleaning Equipment	Laundry and Dry Cleaning Equipment	 Includes Washing Machines; Extractors; Wringers; Drying Tumblers; Ironers; Presses; Starching Machines; Marking Equipment; Mobile Laundry and Dry Cleaning Units. 	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
+\N	Category	3520	FSC	0	Shoe Repairing Equipment	Shoe Repairing Equipment	 Includes Shoe Sewing Machines; Mobile Shoe Repair Shops. 	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
+\N	Category	3530	FSC	0	Industrial Sewing Machines and Mobile Textile Repair Shops	Industrial Sewing Machines and Mobile Textile Repair Shops	  Excludes Shoe Sewing Machines.	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
+\N	Category	3540	FSC	0	Wrapping and Packaging Machinery	Wrapping and Packaging Machinery	 Includes Filling Machines; Container Capping Machines; Label Applying Machines; Package Sealing Machines; Paperboard Box, Case and Tray Making Machines; Strapping Machines; Stapling Machines, except Office Type. Excludes Paperboard Manufacturing Machinery.	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
+\N	Category	3550	FSC	0	Vending and Coin Operated Machines	Vending and Coin Operated Machines	 Includes Fare Recording Devices; Parking Meters; Turnstiles; Coin Operated Phonographs. Excludes Coin and Currency Handling Machines; Coin Operated Scales.	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
+\N	Category	3590	FSC	0	Miscellaneous Service and Trade Equipment	Miscellaneous Service and Trade Equipment	 Includes Manicure Tables. 	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
+\N	Category	3605	FSC	0	Food Products Machinery and Equipment	Food Products Machinery and Equipment	 Includes Industrial Food Products Equipment. Excludes Kitchen and Galley Equipment.	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
+\N	Category	3610	FSC	0	Printing, Duplicating, and Bookbinding Equipment	Printing, Duplicating, and Bookbinding Equipment	 Includes Offset Presses; Typesetting Machinery; Bookbinding Machinery; Photoengraving Machinery; Printing Type; Rules; Leads; Slugs; Line Gages; Quoins; Plate Hooks; Gelatine Process Machines; Spirit Process Machines; Stencil Process Machines; Offset Process Machines; Photostat Machines; Blueprint Printing and Developing Machines; Print Shop Furniture. Excludes Microfilm Machines.	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
+\N	Category	3611	FSC	0	Industrial Marking Machines	Industrial Marking Machines	Note-Marking machines which make permanent indentations in metal are classified in Group 34.  Excludes Marking Machines, Laundry; Printing Machine, Label; Printing Press, Label; Embossing Machines, Office Type; and Marking Machines, Office Type.	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
+\N	Category	3615	FSC	0	Pulp and Paper Industries Machinery	Pulp and Paper Industries Machinery	 Includes Chippers; Digestors; Beaters; Bleaching Equipment; Paperboard Manufacturing Machinery. Excludes Paperboard Box, Case and Tray Making Machines.	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
+\N	Category	3620	FSC	0	Rubber and Plastics Working Machinery	Rubber and Plastics Working Machinery	 Includes Plasticators; Presses; Synthetic Rubber Working Machinery; Thread Extruding Machinery; Vulcanizing Machinery. Excludes Protective Covering Laminating Presses; Tire Maintenance and Repair Equipment.	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
+\N	Category	3625	FSC	0	Textile Industries Machinery	Textile Industries Machinery	 Includes Cotton Ginning Machinery; Looms; Button Covering Machines; Rope Laying Machines; Lace Machines. 	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
+\N	Category	3630	FSC	0	Clay and Concrete Products Industries Machinery	Clay and Concrete Products Industries Machinery	 Includes Brickmaking Machinery. 	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
+\N	Category	3635	FSC	0	Crystal and Glass Industries Machinery	Crystal and Glass Industries Machinery	 Includes Optical Goods Manufacturing Machinery. Excludes Ophthalmic Lens Cutting, Drilling, Edging, and Grinding Machines; Specialized Semiconductor, Microcircuit, and Printed Circuit Board Manufacturing Machinery.	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
+\N	Category	3640	FSC	0	Tobacco Manufacturing Machinery	Tobacco Manufacturing Machinery	  	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
+\N	Category	3645	FSC	0	Leather Tanning and Leather Working Industries Machinery	Leather Tanning and Leather Working Industries Machinery	  	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
+\N	Category	3650	FSC	0	Chemical and Pharmaceutical Products Manufacturing Machinery	Chemical and Pharmaceutical Products Manufacturing Machinery	 Includes Crushers and Mills for Chemical Materials; Pharmaceutical Briquetting and Tabletting Presses; Chemical Explosive Manufacturing Machinery. Excludes Construction Materials Crushers, Mills and Pulverizers; Plastic Products Manufacturing Machinery; Pharmaceutical Products Wrapping and Packaging Machinery; Laboratory and Shop Type Mills and Mixers.	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
+\N	Category	3655	FSC	0	Gas Generating and Dispensing Systems, Fixed or Mobile	Gas Generating and Dispensing Systems, Fixed or Mobile	Note-Included in this class are gaseous dispensing systems, both mobile and installed. Includes liquefied gaseous storage tanks, mounted on a common base with, or integral to, gas generating equipment included in this class. Also includes those liquefied gaseous storage tanks, either trailer mounted or skid mounted, used to store liquefied gaseous products until needed. Excluded from this class are those storage tanks designed to be used as an integral part of guided missile propellant servicing trailers, rocket power plants or test stations, and aircraft oxygen converters which are classified as specified by the indexes and structure of the FSC.  Excludes Meteorological Equipment.	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
+\N	Category	3660	FSC	0	Industrial Size Reduction Machinery	Industrial Size Reduction Machinery	Note-This class includes general use machinery related to two or more manufacturing industries.  Excludes Chemical Products and Construction and Mining Type Crushing, Pulverizing, Screening and Mixing Machinery; Maintenance and Repair Shop Type Mixers.	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
+\N	Category	3670	FSC	0	Specialized Semiconductor, Microcircuit, and Printed Circuit Board Manufacturing Machinery	Specialized Semiconductor, Microcircuit, and Printed Circuit Board Manufacturing Machinery	Note-This class includes, and is restricted to, equipment specifically designed for manufacturing semiconductor devices (FSC 5961), microcircuits (FSC 5962), and printed circuit boards (FSC 5998). Excludes items for which more suitable classes are specifically prescribed by the indexes and structure of the FSC. Includes Substrate Preparation Equipment; Circuit Pattern Forming Equipment; Interconnecting and Packaging Equipment. Excludes Assembly Machines for Mounting Discrete Components on Printed Wiring Boards.	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
+\N	Category	3680	FSC	0	Foundry Machinery, Related Equipment and Supplies	Foundry Machinery, Related Equipment and Supplies	 Includes Molding Machines; Tumbling Mills, Foundry Dextrine; Core Paste. Excludes Crucible Furnaces; Cupola Furnaces; Foundry Hand Tools.	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
+\N	Category	3685	FSC	0	Specialized Metal Container Manufacturing Machinery and Related Equipment	Specialized Metal Container Manufacturing Machinery and Related Equipment	Note-This class includes only those machines specifically designed for manufacturing metal containers. Closing machines designed to seam the tops of filled containers will be classified in Class 3540. Includes Drum and Jerrican Manufacturing Machinery; Specially Designed Container Leak Testing Machines; Can Making Machinery. 	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
+\N	Category	3690	FSC	0	Specialized Ammunition and Ordnance Machinery and Related Equipment	Specialized Ammunition and Ordnance Machinery and Related Equipment	 Includes Ammunition and Explosive Loading (Filling and Assembling) Specialized Machinery; Small Arms Ammunition Manufacturing Machinery; Artillery and Anti-Aircraft Shell Manufacturing Machinery. Excludes Ammunition and Weapons Maintenance and Repair Shop Specialized Equipment; Nonspecialized or Standard Machinery not designed exclusively for manufacturing or assembling ammunition and ordnance equipment.	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
+\N	Category	3693	FSC	0	Industrial Assembly Machines	Industrial Assembly Machines	Note-This class includes equipment specifically designed to assemble prefabricated components without further design machining of the components. Equipment designed to perform combined machining and assembling operations which result in material removal are classified in classes other than this class. Also excluded are items for which more specific classifications are suitable. Includes Industrial Production Type Power Screwdriving Machines; Circuit Card Assembly Machines. Excludes Specialized Ammunition and Ordnance Assembly Machines; Wrapping and Packaging Machinery; Metalworking Machinery; Hand Tools.	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
+\N	Category	3694	FSC	0	Clean Work Stations, Controlled Environment, and Related Equipment	Clean Work Stations, Controlled Environment, and Related Equipment	 Includes Laminar and Nonlaminar Flow Enclosures; Dust Controlled Facilities; Air Showers. 	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
+\N	Category	3695	FSC	0	Miscellaneous Special Industry Machinery	Miscellaneous Special Industry Machinery	 Includes Communication Wire Dispenser Fabricating Machinery; Specialized Logging Equipment; Petroleum Refinery Machinery; Shoemaking Machinery; Production Type Impregnating Equipment. Excludes Opthalmic Lens Cutting and Grinding Machinery; Clothing Impregnating Equipment.	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
+\N	Category	3710	FSC	0	Soil Preparation Equipment	Soil Preparation Equipment	 Includes Harrows; Plows; Seed Drills; Seeder Attachments; Sprayers. 	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
+\N	Category	3720	FSC	0	Harvesting Equipment	Harvesting Equipment	 Includes Hayrakers; Mowers. Excludes Mower Attachments (FSC 3750); Sickle Bar Attachments (FSC 3750).	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
+\N	Category	3730	FSC	0	Dairy, Poultry, and Livestock Equipment	Dairy, Poultry, and Livestock Equipment	  	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
+\N	Category	3740	FSC	0	Pest, Disease, and Frost Control Equipment	Pest, Disease, and Frost Control Equipment	 Includes Atomizers; Delousing Outfits; Dusters; Fly Swatters; Flypaper; Fog Generators; Sprayers; Traps. Excludes Self Pressurized Spray Kits (FSC 4940).	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
+\N	Category	3750	FSC	0	Gardening Implements and Tools	Gardening Implements and Tools	 Includes Garden Tractors, Walking Type; Lawn Mowers, Powered and Nonpowered; Hedge Trimers; Lawn Seeders; Fertilizer Spreaders; Gardening Rakes, Forks, Hoes, and Other Gardening Tools. 	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
+\N	Category	3770	FSC	0	Saddlery, Harness, Whips, and Related Animal Furnishings	Saddlery, Harness, Whips, and Related Animal Furnishings	 Includes Dog Harnesses; Leads. 	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
+\N	Category	3805	FSC	0	Earth Moving and Excavating Equipment	Earth Moving and Excavating Equipment	 Includes Scrapers; Ditchers; Loaders; Graders; Special Construction Type Earth and Rock Hauling Trucks and Trailers; Special Individual Work and Power Sections of Construction Equipment with a quick connect/disconnect capability. The Power Section is designed to be coupled with a Work Section to form a functional piece of Construction Equipment. Excludes Standard Tractors (FSG 24); Trailers (FSC 2330); Trucks (FSC 2320).	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
+\N	Category	3810	FSC	0	Cranes and Crane-Shovels	Cranes and Crane-Shovels	 Includes Cranes; Crane-Semitractors; Crane-Shovels; Crane-Tractors. Excludes Barge Mounted Cranes (FSC 1935); Locomotive Cranes (FSC 2230).	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
+\N	Category	3815	FSC	0	Crane and Crane-Shovel Attachments	Crane and Crane-Shovel Attachments	 Includes Backhoes; Buckets; Dippers; Fairleads; Gantries; Grapples; Lifting Magnets; Shovels; Wrecking Balls. 	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
+\N	Category	3820	FSC	0	Mining, Rock Drilling, Earth Boring, and Related Equipment	Mining, Rock Drilling, Earth Boring, and Related Equipment	 Includes Augers; Crushers; Crushing, Screening, and Washing Plants and Units; Drilling Machines; Paving Breakers; Rock Drills. Excludes Tampers (FSC 3895).	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
+\N	Category	3825	FSC	0	Road Clearing, Cleaning, and Marking Equipment	Road Clearing, Cleaning, and Marking Equipment	 Includes Pavement Scrubbing Machines; Snow Removal Units; Sweepers; Road Marking Machines; Vacuum Cleaners; Water Distributors; Weed Burners. Excludes Standard Tractors with Road Clearing or Cleaning Attachments (FSC 2410, 2420, 2430); Timber Sawing Equipment (FSC 5130, 5110).	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
+\N	Category	3830	FSC	0	Truck and Tractor Attachments	Truck and Tractor Attachments	 Includes Angledozers; Augers; Backhoes; Bullclams; Bulldozer-Shovels; Cranes; Grubbers; Loaders; Rakes; Rippers; Rollers; Scarifiers; Snow Removal Units; Snowplows; Sweepers; Treedozers. 	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
+\N	Category	3835	FSC	0	Petroleum Production and Distribution Equipment	Petroleum Production and Distribution Equipment	 Includes Well Heads; Pumping Equipment; Gas Distribution Equipment. 	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
+\N	Category	3895	FSC	0	Miscellaneous Construction Equipment	Miscellaneous Construction Equipment	 Includes Asphalt Elevators; Asphalt Heaters; Asphalt Kettles; Asphalt Transfer Equipment; Batching Plants; Stabilizing and Compacting Equipment; Concrete Mixers (All Types); Concrete Vibrators; Bituminous and Concrete Pavers; Asphalt Distributors; Sheepfoot Rollers; Rooters; Rippers; Pile Drivers; Bitumen Heaters; Cable Laying, Lashing, Spinning, and Reeling Equipment. Excludes Earth Moving and Excavating Equipment (FSC 3805 & 3810); Pile Driving Attachments for Cranes and Crane-Shovels (FSC 3815); Special Individual Work and Power Sections of Construction Equipment with a quick connect/disconnect capability (FSC 3805).	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
+\N	Category	3910	FSC	0	Conveyors	Conveyors	 Includes Pneumatic Tube Systems; Portable, Stationary, Powered, and Nonpowered Conveyors; Conveyor Feeders. 	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
+\N	Category	3915	FSC	0	Materials Feeders	Materials Feeders	Note-Materials Handling equipment included in this class is restricted to those materials feeders and parts feeders that serve as a conveying device, and by which the rate of delivery of bulk materials, packages, or objects may be controlled. Items included in this class are synchronized with companion machinery, feeding predetermined amounts, by volume, of specific materials accurately and continuesly from storage bins or hoppers to process or mixing machines, and are interchangable between machines. Excluded from this class are conveyor feeders (i.e., apron, belt, chain, flight, pan, etc., adapted for feeder service) that are classifiable in Class 3910 and/or Class 3895, as appropriate. Includes Dry Materials Feeders; Parts Feeders Excludes Aggregate and Fines Feeders; Conveyor Feeders; Water Purification Dry Chemical Feeders.	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
+\N	Category	3920	FSC	0	Material Handling Equipment, Nonself-Propelled	Material Handling Equipment, Nonself-Propelled	 Includes Dolly Trucks; Pushcarts; Handcarts; Wheelbarrows; Hand Trucks; Materials Handling Trailers. Excludes Conveyors.	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
+\N	Category	3930	FSC	0	Warehouse Trucks and Tractors, Self-Propelled	Warehouse Trucks and Tractors, Self-Propelled	 Includes Tug Jockeys; Fork Lift Trucks; Platform Trucks; Straddle Trucks. 	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
+\N	Category	3940	FSC	0	Blocks, Tackle, Rigging, and Slings	Blocks, Tackle, Rigging, and Slings	  Excludes Load Chain; Chain and Metal Rope Fittings; Wire Rope; Hoists; Ship Rigging.	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
+\N	Category	3950	FSC	0	Winches, Hoists, Cranes, and Derricks	Winches, Hoists, Cranes, and Derricks	 Includes Windlasses: Capstans: Ore Bridges: Gypsies: Warehouse Cranes: Wharf Cranes, Mobile or Fixed: Overhead Traveling Cranes. Excludes Crane-Shovels (FSC 3810); Barge Mounted Cranes (FSC 1935); Winches for Integral Mounting on Trucks or Tractors (FSC 3830); Locomotive Cranes (FSC 2230).	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
+\N	Category	3960	FSC	0	Freight Elevators	Freight Elevators	  	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
+\N	Category	3990	FSC	0	Miscellaneous Materials Handling Equipment	Miscellaneous Materials Handling Equipment	 Includes Skids; Pallets. Excludes Airfield Engine Transport Skids.	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
+\N	Category	4010	FSC	0	Chain and Wire Rope	Chain and Wire Rope	Note-Chain and wire rope, with attachments or terminations will be classified in this class when they are for general use. a. Chain is a series of flexible links and/or rings fitted into one another used for supporting, lifting,restraining, dragging, or transmitting power. b. Wire rope is formed from strands of twisted wire. Includes Bead Chain; Weldless Chain; Single Leg Chain Assemblies; Wire Rope; Wire Cord; Single Leg Wire Assemblies. Excludes Power Transmission Chain (FSC 3020); Slings.	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
+\N	Category	4020	FSC	0	Fiber Rope, Cordage, and Twine	Fiber Rope, Cordage, and Twine	Note-Fiber rope is classified in this class when it is bulk material or for general use. Items with attachments and/or terminations are identified in this class unless a more specific item name is used. a. Fiber rope is flexible twisted strands of manila, nylon or other fiber. b. Cordage is ropes or cords used in rigging (see item name definitions for parameters). c. Twine is two or more strands twisted together. Includes Fibrous Cord Assemblies; Fibrous Cord; Fibrous Rope; Fibrous Twine. Excludes Wire Rope (FSC 4010); Slings (FSC 3940).	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
+\N	Category	4030	FSC	0	Fittings for Rope, Cable, and Chain	Fittings for Rope, Cable, and Chain	Note All items, including specially designed, will be classified in this FSC. Fittings classified in this FSC are items used in conjunction with chain, rope, and are attached to perform certain functions, (e.g., hooks, shackles, and wedges) refer to item name definitions for parameters. Includes Anchor Guys; Wire Stranded Bands; Wire Rope Clamps; Cargo Hooks; Shackles; Swivels; Rope Terminals; Rope Wedges. Excludes Clamp Blocks (FSC 5340); Support Hooks (FSC 5340).	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
+\N	Category	4240	FSC	0	Safety and Rescue Equipment	Safety and Rescue Equipment	 Includes Portable Fire Escapes; Safety Nets, Nonbuoyant. Excludes Divers' Suits; Fixed Fire Escapes.	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
+\N	Category	4250	FSC	0	Recycling and Reclamation Equipment	Recycling and Reclamation Equipment	 Includes Material and Machinery designed to remove, neutralize and/or prepare for possible re-use of substances otherwise considered to be un-reclaimable. 	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
+\N	Category	4310	FSC	0	Compressors and Vacuum Pumps	Compressors and Vacuum Pumps	 Includes Truck Mounted and Trailer Mounted Compressors. Excludes Refrigeration Compressors (FSC 4130).	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
+\N	Category	4320	FSC	0	Power and Hand Pumps	Power and Hand Pumps	  Excludes Laboratory Jet Pumps (FSG 65 and 66).	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
+\N	Category	4110	FSC	0	Refrigeration Equipment	Refrigeration Equipment	Note-This class includes only complete refrigeration equipment, whether refrigerated from an integral or remote mechanical refrigeration unit or system. Also included in this class are refrigeration plants, and complete "packaged" refrigeration units and systems containing a power driven compressor, condenser, evaporator, and all other necessary components to refrigerate an enclosed space. Nonoperating accessories such as ice trays, shelves, and panels are included in this class. Excluded from this class are operating components, assemblies, parts, attachments, or accessories, for use in or on complete refrigeration equipment, plants, systems, or the "packaged" refrigeration units, and which are to be classified in Class 4130, or as otherwise specifically prescribed by the indexes and structure of the FSC. Includes Grocery Type Display Cases; Ice Cream Cabinets; Drinking Fountains (except Portable and stationary types classified in Class 4510); Professional and Scientific Refrigerators; Rivet Coolers; Photographic Refrigerators; Mortuary Refrigerators; Household and Commercial Refrigerators; Grocery Type Showcases; and other types of refrigeration equipment of the commissary or food store type. Excludes Cafeteria Type Refrigerated Display Cases; Soda Fountains; Milk, Soda, and/or Ice Cream Dispensers; Cold Food Counters; Carbonators; Combination Heated-Refrigerated Food Serving Equipment; Cafeteria Type Showcases; Chilling Equipment Used for Display and Serving of Food (see Class 7310 for these items). Also excluded from this class are refrigeration components (see Class 4130).	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
+\N	Category	4120	FSC	0	Air Conditioning Equipment	Air Conditioning Equipment	Note-This class includes only complete air conditioning equipment, systems, and plants. Also included are specially designed nonoperating accessories such as a window panel used with a window type air conditioning unit to facilitate mounting. Excluded from this class are operating components, assemblies, parts, attachments, or accessories for use in or on air conditioning equipment, which are to be classified in Class 4130, or as otherwise specifically prescribed by the indexes and structure of the FSC. Includes Store Type Units; Window and Room Type Units; Marine, and Vehicular Air Conditioning Units; Air Conditioning Plants and Systems. Excludes Air Conditioning Components (FSC 4130, or as otherwise specifically prescribed by the indexes and structure of the FSC).	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
+\N	Category	4130	FSC	0	Refrigeration and Air Conditioning Components	Refrigeration and Air Conditioning Components	 Includes Heat Exchanger Equipment; Refrigerant Strainers; Refrigeration Compressors; Air Conditioning and Refrigeration Servicing Equipment, such as Charging and testing manifolds, Lines and Units; Operating Components of Refrigeration and Air Conditioning Equipment, Plants, and Systems classified in classes 4110 and 4120. Excludes Refrigeration and Air Conditioning Plants (see classes 4110 and 4120): Collections of Refrigeration Components "packaged" as a unit including a refrigeration compressor, condenser, evaporator, etc., specifically designed and tailored for applications such as walk-in type refrigerators. Individual components of the "packaged" unit will be classified in class 4130, or as otherwise specifically prescribed by the indexes and structure of the FSC. The complete "package" unit will be classified in class 4110.	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
+\N	Category	4140	FSC	0	Fans, Air Circulators, and Blower Equipment	Fans, Air Circulators, and Blower Equipment	Note-Fans and impellers which are specifically designed for use with specific individual types of equipment are to be classified in the same classes as their next higher assemblies or in the appropriate components or accessories classes (as in Group 25 or 29 or Class 1680) as prescribed by the indexes and structure of the FSC. Includes Wall Type Fans; Pedestal Type Fans; Household Type and Attic Type Exhaust Fans; Floor Fans; Forged Draft Exhaust and Disposal Kits; Fans, Air Circulators, and Blower Equipment, whether designated as "industrial" or "nonindustrial" by application and/or use. Excludes Combination Heater-Fans (FSC 4520).	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
+\N	Category	4150	FSC	0	Vortex Tubes and Other Related Cooling Tubes	Vortex Tubes and Other Related Cooling Tubes	 Includes Tool Grinding spot coolers; machining spot coolers; electronic equipment spot coolers; and electronic cabinet spot coolers. Excludes Refrigeration and Air Conditioning Plants (Classes 4110 and 4120); Air Conditioning Components and Cooler Unit, Air (Class 4130); Cooler, Air, Evaporative (Class 4120) and Pipe and Tube (Group 47).	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
+\N	Category	4210	FSC	0	Fire Fighting Equipment	Fire Fighting Equipment	 Includes Fire Extinguishers; Fire Axes; Fire Rakes; Fire Beaters; Fire Trucks; Fire Hose; Play Pipes; Hose Fittings having one or more Fire Hose End Connections; Fire Hose Reels; Fire Fighting Trailers; Fire Hydrants; Sprinkler Heads. Excludes Wrecking Bars (FSC 5120, 1385).	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
+\N	Category	4220	FSC	0	Marine Lifesaving and Diving Equipment	Marine Lifesaving and Diving Equipment	 Includes Diving and Salvage Apparatus, including Pressurized Divers' Suits; Rescue Nets, Buoyant; Inflatable Life Vests; Life Rafts. Excludes Lifesaving Boats (FSC 1940).	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
+\N	Category	4230	FSC	0	Decontaminating and Impregnating Equipment	Decontaminating and Impregnating Equipment	Note-Excludes production type equipment designed for impregnation of metal castings and electronic components, processing of leather and textiles, and for similar industrial processing operations.  	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
+\N	Category	4235	FSC	0	Hazardous Material Spill Containment and Clean-up Equipment and Material	Hazardous Material Spill Containment and Clean-up Equipment and Material	 Includes Secondary Spill Containment Sumps; Liquid Spill Containment Pallets; Spill Containment Basins; Spill Containment Systems; Absorbent, Sorbent and Blotting Materials. 	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
+\N	Category	4330	FSC	0	Centrifugals, Separators, and Pressure and Vacuum Filters	Centrifugals, Separators, and Pressure and Vacuum Filters	  Excludes Laboratory Centrifuges (FSG 65 and 66); Water Purification Filters (FSC 4610).	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
+\N	Category	4410	FSC	0	Industrial Boilers	Industrial Boilers	 Includes Steam Boilers, over 15 pounds WSP. Marine Boilers; Boiler Drums; Water Heaters, Low Pressure (over 100 gallon recovery capacity). 	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
+\N	Category	4420	FSC	0	Heat Exchangers and Steam Condensers	Heat Exchangers and Steam Condensers	  	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
+\N	Category	4430	FSC	0	Industrial Furnaces, Kilns, Lehrs, and Ovens	Industrial Furnaces, Kilns, Lehrs, and Ovens	 Includes Crucible Furnaces; Cupola Furnaces. Excludes Food Industry Ovens (FSC 7310); Metal Heat Treating Furnaces (FSC 3424); Laboratory Type Furnaces (FSC 6640).	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
+\N	Category	4440	FSC	0	Driers, Dehydrators, and Anhydrators	Driers, Dehydrators, and Anhydrators	 Includes Evaporators. 	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
+\N	Category	4460	FSC	0	Air Purification Equipment	Air Purification Equipment	 Includes Electronic Precipitators; Dust Collection Equipment. Excludes Fan and Blower Equipment (FSC 4140); Air Conditioning Equipment (FSC 4120).	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
+\N	Category	4470	FSC	0	Nuclear Reactors	Nuclear Reactors	Note-This class includes all types of nuclear reactors and those items which are specifically designed for use within nuclear reactors, their primary cooling systems, auxiliary fluid systems, special propulsion plant systems, handling and servicing equipment, electrical and control systems, and associated special test and water chemistry control items. Excluded from this class are those items for which more specific classifications are suitable. Includes Refueling Machines; Ion Chamber Seals; Thermal Barriers; Control Rods; Steam Generators, Pressurized Water; Reactor Vessel Shells; Handling Carts; Hoisting Units, New and Spent Cartridge. 	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
+\N	Category	4510	FSC	0	Plumbing Fixtures and Accessories	Plumbing Fixtures and Accessories	 Includes Bathtubs; Commodes; Lavatories; Shower Cabinets; Sinks; Water Closets; Accessories and Component Parts, such as Dispensers, Faucets, Holders, Racks, Shower Heads, Flush Valves and Stop Valves. Excludes Fittings and Specialties for Hose, Pipe and Tube (FSC 4730).	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
+\N	Category	4520	FSC	0	Space and Water Heating Equipment	Space and Water Heating Equipment	 Includes Boilers, 15 pounds WSP and under (for boilers over 15 pounds WSP, see FSC 4410); Domestic Water Storage Tanks through 100 gallon capacity; Fireplace Heaters; Furnaces; Space Heaters; Heating Radiators; Immersion Heaters; Water Heaters, through 100 gallon recovery capacity (for heaters over 100 gallons recovery capacity, see FSC 4410). Excludes Vehicle Heaters; (FSC 2540); Aircraft Heaters (FSC 1660).	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
+\N	Category	4530	FSC	0	Fuel Burning Equipment Units	Fuel Burning Equipment Units	 Includes Oil Burners; Stokers; Gas Burners. 	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
+\N	Category	4540	FSC	0	Waste Disposal Equipment	Waste Disposal Equipment	 Includes Compactors; Destructors; Garbage Disposals; Incinerators; Septic Tanks. 	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
+\N	Category	4610	FSC	0	Water Purification Equipment	Water Purification Equipment	 Includes Demineralizers; Filtration Equipment; Ice and Snow Melters. Excludes Water Purification Compounds (FSC 6810 and 7930); Water Softening Compounds (FSC 6810 and 7930).	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
+\N	Category	4620	FSC	0	Water Distillation Equipment, Marine and Industrial	Water Distillation Equipment, Marine and Industrial	  Excludes Laboratory Distillation Apparatus (FSC 6640).	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
+\N	Category	4630	FSC	0	Sewage Treatment Equipment	Sewage Treatment Equipment	  	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
+\N	Category	4710	FSC	0	Pipe, Tube and Rigid Tubing	Pipe, Tube and Rigid Tubing	 Includes Culvert Pipes; Culvert Pipe Connector Bands; Metallic Pipes; Plastic Pipes; Tubes and Rigid Tubing and their assemblies. Excludes Air Conditioning-Heating Pipes (FSC 4520); Asbestos and Cement, Bituminized Fiber, Clay and Concrete Pipes (FSC 5630); Conduit Pipes and their assemblies (FSC 5975); Downspout Pipes (FSC 5670); Exhaust Pipes (FSC 1560, 2990, and  4520); Fire Extinguishing Systems Pipes and Tubes and their assemblies (FSC 4210); Flexible Tubing (FSC 4720); Glass Tubing (FSC 6640, and 9340); Laboratory Tubes (FSC 6640); Medical and Surgical Tubes (FSC 6515).	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
+\N	Category	4720	FSC	0	Hose and Flexible Tubing	Hose and Flexible Tubing	 Includes Air Duct, Metallic, Nonmetallic, and Textile Fiber Hoses and their assemblies; Flexible Tubing and their assemblies. Excludes Conduit and their assemblies (FSC 5975); Laboratory Tubes (FSC 6640); Medical and Surgical Tubes (FSC 6515); Rigid Tubing and their assemblies (FSC 4710).	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
+\N	Category	4730	FSC	0	Hose, Pipe, Tube, Lubrication, and Railing Fittings	Hose, Pipe, Tube, Lubrication, and Railing Fittings	 Includes Adapters; Bends; Caps; Clamps; Connectors; Couplings; Crosses; Elbows; Expansion Joints; Ferrules; Flanges; Laterals; Lubrication Fittings; Manifolds; Nipples; Nozzles; Outlets; Plugs; Reducers; Swing and Swivel Joints; Tees; Traps; Unions; Wyes. Excludes Air Conditioning-Heating Fittings (FSC 4520); Bituminized Fiber and Concrete Fittings (FSC 5630); Conduit Boxes and Fittings (FSC 5975); Downspout Fittings (FSC 5670); Medical and Surgical Fittings (FSC 6515); Laboratory Fittings (FSC 6640); Post Caps and Rail Ends (FSC 5660); Machine Thread Bushings and Plugs (FSC 5365).	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
+\N	Category	4810	FSC	0	Valves, Powered	Valves, Powered	 Includes Electric Motor Operated Valves; Hydraulic Operated Valves; Solenoid Operated Valves. Excludes Engine Intake and Exhaust valves (FSC 2990, 2815); Valves specifically designed for use with fire fighting equipment (FSC 4210); plumbing equipment, and the like (FSC 4540).	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
+\N	Category	4820	FSC	0	Valves, Nonpowered	Valves, Nonpowered	 Includes Automatic Nonpowered Valves; Gate, Globe, Angle, Check, and Relief Valves; Cocks. Excludes Fire Hydrants (FSC 4210); Sprinkler Heads (FSC 4210); Valves specifically designed for use with fire fighting Equipment (FSC 4210); plumbing equipment, and the like (FSC 4540).	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
+\N	Category	4910	FSC	0	Motor Vehicle Maintenance and Repair Shop Specialized Equipment	Motor Vehicle Maintenance and Repair Shop Specialized Equipment	 Includes Automotive Lifts; Wheel Aligners; Brake Service Equipment; Tire Maintenance and Repair Equipment; Test stands and test equipment specially designed for use with motor vehicles. Excludes Hand Tools (FSG 51); Lubrication and Fuel Dispensing Equipment (FSC 4930); Basic types of electrical and electronic test instruments, including those specifically designed, such as ammeters, voltmeters, ohmmeters, multimeters, and similar instruments as shown in the indexes in the FSC (FSC 6625).	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
+\N	Category	4920	FSC	0	Aircraft Maintenance and Repair Shop Specialized Equipment	Aircraft Maintenance and Repair Shop Specialized Equipment	 Includes Maintenance stands designed for support of aircraft assemblies during repair or overhaul; Test Stands and Test Equipment specially designed for maintenance and repair of aircraft components such as: engines, generators, hydraulic systems, armament, automatic pilot, fire control, flight control, and navigational systems. Excludes Hand Tools; Airfield Maintenance Platforms; Basic types of electrical and electronic test instruments, including those specially designed, such as ammeters, voltmeters ohmmeters, multimeters, and similar instruments, as shown in the indexes to the FSC; Test Apparatus used for both communications and other electrical and electronic equipment.	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
+\N	Category	4921	FSC	0	Torpedo Maintenance, Repair, and Checkout Specialized Equipment	Torpedo Maintenance, Repair, and Checkout Specialized Equipment	 Includes Specially designed maintenance, test, checkout, and repair shop specialized equipment for maintenance and repair of torpedoes, torpedo components; adapters, fixtures, inspection and holding fixtures, leveling jack assemblies, fuel filling and syphon assemblies, control surface adapter and protractor assemblies, afterbody cradle adapter and tilting mount assemblies, pressure air heater assemblies, motor drier and puller assemblies, test stand levels and stands for overhaul, maintenance, test, checkout, and repair of torpedo and torpedo components, test panels, fixtures, and test sets for electrical circuits, firing circuits and torpedo test sets. Excludes Specially designed maintenance test, checkout and repair shop specialized equipment for maintenance and repair of ammunition, guided missiles, rockets, fire control, space vehicles, underwater mines, depth charges and nuclear ordnance. Also excludes "basic" types of electrical and electronic test instruments, such as ammeters, voltmeters, ohmmeters, multimeters, galvanometers and similar instruments.	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
+\N	Category	4923	FSC	0	Depth Charges and Underwater Mines Maintenance, Repair, and Checkout Specialized Equipment	Depth Charges and Underwater Mines Maintenance, Repair, and Checkout Specialized Equipment	 Includes Specially designed maintenance, test, checkout and repair shop specialized equipment for maintenance and repair of depth charges and underwater mines; adapters, inspection, test and holding fixtures; stands for overhaul, maintenance, test, checkout, and repair of underwater mines and depth charges; test fixtures, panels plus assemblies and test sets for leak test, pressure test, firing circuits and timing devices. Excludes Specially designed maintenance, test, checkout, and repair shop equipment designed for nuclear ordnance, guided missiles, ammunition, torpedoes, rockets, fire control, space vehicles and "basic" types of electrical and electronic test instruments.	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
+\N	Category	4925	FSC	0	Ammunition Maintenance, Repair, and Checkout Specialized Equipment	Ammunition Maintenance, Repair, and Checkout Specialized Equipment	 Includes Specially designed maintenance, test, checkout, and repair shop specialized equipment, for maintenance and repair of ammunition items; adapters, ammunition feeders and hoppers; inspection and holding fixtures; linkers, linkers-delinkers, and delinkers to assemble and disassemble ammunition belts; surveillance ovens; explosimeters; primer firing device fixtures; mandrels; repositioning machines; gas bomb service kits; test fixtures; panels; plug assemblies; and test sets for ammunition maintenance, checkout and repair. Excludes Maintenance, repair, checkout and test equipment specially designed for use with guided missiles, guided missile remote control systems, guided missile systems; fire control; nuclear ordnance; rockets, underwater mines and depth charges; torpedoes; space vehicles and test equipment for aircraft weapon launchers; basic types of electrical and electronic test instruments, such as ammeters, voltmeters, ohmmeters, multimeters, and similar instruments, as shown in the indexes to the FSC.	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
+\N	Category	4927	FSC	0	Rocket Maintenance, Repair and Checkout Specialized Equipment	Rocket Maintenance, Repair and Checkout Specialized Equipment	 Includes Specially designed maintenance, test, checkout, and repair shop specialized equipment for maintenance and repair of rockets and rocket components; rocket maintenance stands; test stands; fixtures; jigs; and shop equipment designed for maintenance and repair of rockets, rocket motors and other rocket components. Excludes Specially designed maintenance, test, checkout, and repair shop equipment specifically designed for nuclear ordnance, guided missiles, fire control, torpedoes, underwater mines, depth charges, ammunition, space vehicles; test equipment for aircraft rocket launchers and "basic" types of electrical and electronic test instruments, such as ammeters, voltmeters, ohmmeters, multimeters, galvanometers and similar instruments.	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
+\N	Category	4930	FSC	0	Lubrication and Fuel Dispensing Equipment	Lubrication and Fuel Dispensing Equipment	 Includes Hand Grease Guns; Centralized Lubrication Systems; Hydrostatic Lubricators; Oil and Gasoline Dispensing Pumps; Fuel Oil Dispensing Pumps; Hand Oilers; Grease Dispensers; Pressure Gun Attachments; Sight Feed Lubricators. Excludes Alemite and Lubrication Fittings (FSC 4730).	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
+\N	Category	4931	FSC	0	Fire Control Maintenance and Repair Shop Specialized Equipment	Fire Control Maintenance and Repair Shop Specialized Equipment	 Includes Specially Designed Test Equipment, Maintenance Fixtures and Stands. Excludes Instruments for use on both Fire Control and other Equipment; Airborne Fire Control Maintenance and Repair Shop Equipment.	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
+\N	Category	4933	FSC	0	Weapons Maintenance and Repair Shop Specialized Equipment	Weapons Maintenance and Repair Shop Specialized Equipment	 Includes Maintenance Stands, Fixtures, and Jigs. Excludes Atomic Ordnance Maintenance and Repair Shop Specialized Equipment; Airborne Weapons Maintenance and Repair Shop Equipment.	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
+\N	Category	4935	FSC	0	Guided Missile Maintenance, Repair, and Checkout Specialized Equipment	Guided Missile Maintenance, Repair, and Checkout Specialized Equipment	 Includes Checkout equipment and test equipment specially designed for use with guided missiles and guided missile remote control systems. Excludes Specially designed internal (built-in) checkout equipment for guided missile remote control systems; Basic types of electrical and electronic test instruments, including those specially designed, such as ammeters, voltmeters, ohmmeters, multimeters, and similar instruments, as shown in the indexes to the FSC; Test Apparatus used for both communications and other electrical and electronic equipment.	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
+\N	Category	4940	FSC	0	Miscellaneous Maintenance and Repair Shop Specialized Equipment	Miscellaneous Maintenance and Repair Shop Specialized Equipment	 Includes Paint Spraying Equipment. Excludes Hand Tools (FSG 51).	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
+\N	Category	4960	FSC	0	Space Vehicle Maintenance, Repair, and Checkout Specialized Equipment	Space Vehicle Maintenance, Repair, and Checkout Specialized Equipment	 Includes Checkout and Test Equipment specially designed for use with Space Vehicles, including Remote Control Systems. Excludes Checkout and Test Equipment used with both Guided Missiles and Space Vehicles; Specially designed Internal (Built-in) Checkout Equipment for Remote Control Systems; Basic types of Electrical and Electronic Test Instruments, including those specially designed, such as ammeters, ohmmeters, multimeters, and similar instruments, as shown in the indexes to the FSC.	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
+\N	Category	4970	FSC	0	Multiple Guided Weapons, Specialized Maintenance and Repair Shop Equipment	Multiple Guided Weapons, Specialized Maintenance and Repair Shop Equipment	Note Maintenance, test, checkout and repair shop equipment designed to test, maintain, fault isolate and repair multiple guided weapon systems. For equipment designed to be used with only one specific system see the individual FSC indexed (i.e., 4921, 4927, 4935).  	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
+\N	Category	5110	FSC	0	Hand Tools, Edged, Nonpowered	Hand Tools, Edged, Nonpowered	 Includes Chisels; Files; Pipe Cutters; Rasps; Saws; Screw Plates; Axes; Hatchets; Machetes. 	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
+\N	Category	5120	FSC	0	Hand Tools, Nonedged, Nonpowered	Hand Tools, Nonedged, Nonpowered	 Includes Hammers; Picks; Pliers, except pliers for cutting only; Screwdrivers; Shovels; Construction Rakes, Forks and Hoes; Jacks, including Contractors' Jacks; Wrecking Bars; Glue Pots; Blowtorches. Excludes Craftsman's Measuring Tools; Gardening Rakes, Forks, Hoes, and other Garden Tools.	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
+\N	Category	5130	FSC	0	Hand Tools, Power Driven	Hand Tools, Power Driven	 Includes Drills; Riveters; Portable Electric Saws; Pneumatic Tools; Abrasive Wheels, Cones, and other Abrasive Attachments for use only on Hand Held Power Tools. 	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
+\N	Category	5133	FSC	0	Drill Bits, Counterbores, and Countersinks: Hand and Machine	Drill Bits, Counterbores, and Countersinks: Hand and Machine	  	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
+\N	Category	5136	FSC	0	Taps, Dies, and Collets; Hand and Machine	Taps, Dies, and Collets; Hand and Machine	  Excludes Punching, Stamping, and Marking Dies.	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
+\N	Category	5140	FSC	0	Tool and Hardware Boxes	Tool and Hardware Boxes	  	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
+\N	Category	5180	FSC	0	Sets, Kits, and Outfits of Hand Tools	Sets, Kits, and Outfits of Hand Tools	Note-This class includes sets, kits and outfits consisting of several different items classifiable either in a single class or in several classes. Excluded from this class are sets, kits and outfits consisting of variations (such as size or color) of an item. Classify these items in the same class as the individual item.  	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
+\N	Category	5210	FSC	0	Measuring Tools, Craftsmen's	Measuring Tools, Craftsmen's	Note-This class does not include special inspection gages, which are classified in Class 5220. Includes Calipers; Levels; Micrometers; Plumb Bobs; Precision Tapes; Squares; Angle Gages; Center Gages; Depth Gages; Draw Gages; Drill Point Gages; Fillet and Radius Gages; Glaziers' Gages; Height Gages (Vernier); Planer Gages; Rivet Selector Gages; Saw Tooth Set Gages; Screw Pitch Gages; Surface Gages; Telescoping Gages; Thickness Gages; Tube Bead Gages; Tube Flare Gages; Twist Drill Gages; Twist Drill and Rod Gages; Twist Drill and Tap Gages; Taper-Wire-Thickness Gages; Wire Gages; Tool Setting Planer and Shaper Gages; Gage Blocks. 	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
+\N	Category	5220	FSC	0	Inspection Gages and Precision Layout Tools	Inspection Gages and Precision Layout Tools	Note-Special inspection gages are included in this class. Includes Go and Not-Go Gages, including Plug, Ring, Snap, Thread, and Length Gages; Profile Gages; Fixture Gages; Special Inspection Gages. 	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
+\N	Category	5280	FSC	0	Sets, Kits, and Outfits of Measuring Tools	Sets, Kits, and Outfits of Measuring Tools	  	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
+\N	Category	5305	FSC	0	Screws	Screws	  	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
+\N	Category	5306	FSC	0	Bolts	Bolts	  	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
+\N	Category	5307	FSC	0	Studs	Studs	  	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
+\N	Category	5310	FSC	0	Nuts and Washers	Nuts and Washers	Note Nuts and washers, including specially designed, are to be classified in this FSC. a. Nuts are a small metal block made in a variety of shapes such as square and hexagonal which is drilled and internally threaded. b. Washers are a perforated piece of metal, leather, or other materials of various shapes or forms. They are used primarily as a seat for a bolt, nut, screw, rivet or nail to distribute pressure and prevent endwise motion over an area and/or to prevent movement between two parts by means of restraining features created by the shape of its edges. Includes Locknuts; Eye Nuts; Plain Nuts; Castellated Nuts; Wing Nuts; Plate Nuts; Push on Nuts; Concave and Convex Washers; Flat Washers; Keyed Washers; Lock Washers; Shouldered Washers; Split Washers. Excludes Bearing Thrust Washers (FSC 3120); Shims (FSC 5365); Ring Spacers (FSC 5365); Plate Spacers (FSC 5365); Lock Rings (FSC 5365).	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
+\N	Category	5315	FSC	0	Nails, Machine Keys, and Pins	Nails, Machine Keys, and Pins	Note Nails, machine keys, and pins, including specially designed, will be classified in this FSC. a. Nails are slender, usually pointed fasteners with a head, and designed for insertion by impact. b. Machine keys are items generally inserted between two items, usually in a groove, to prevent relative rotation e.g., shaft and hub. c. Pins are cylindrical items of various materials used to align/attach two or more parts together and may allow for angular movement. Includes Dowel Pins, Split Pins; Spikes; Tacks; Nonoffice Type Staples; Machine Keys; Brads; Shouldered Pins; Cotter Pins; Nails. Excludes Shafts (FSC 3040); Lock Keys (FSC 5340).	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
+\N	Category	5320	FSC	0	Rivets	Rivets	  	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
+\N	Category	5325	FSC	0	Fastening Devices	Fastening Devices	 Includes Eyelets; Grommets; Aircraft Cowling Fasteners; Textile Fasteners; Retaining Rings; Threaded Inserts. 	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
+\N	Category	5330	FSC	0	Packing and Gasket Materials	Packing and Gasket Materials	Note This FSC includes only seals and gaskets designed for standard use. Seals, gaskets and packing are made from materials specifically designed and constructed to resist deterioration from the action of heat, gas, chemicals, liquids, and used to fill a cavity and create a tight seal. Similar materials used to make seals, gaskets, and packing are available in bulk form, refer to FSG 93, FSG 80, and FSG 83. Includes General Purpose Oil Grease, Air, Liquid, Gas, and chemical Seals; Oakum; Prefabricated Gaskets and Seals designed for a single specific application. Excludes O-Rings (FSC 5331); Bulk material items, such as; Rubber, Cork, and Asbestos Sheets and Strips (FSG 93); Liquid Gasket Materials (RTV, Permatex, etc.) (FSG 80); RFI and EMI Seals and Gaskets (FSC 5999), and all Seal Retainers.	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
+\N	Category	5331	FSC	0	O-Ring	O-Ring	  Excludes Packing and Gasket Material (FSC 5330).	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
+\N	Category	5335	FSC	0	Metal Screening	Metal Screening	Note Metal Screening is a perforated plate or cylinder or a meshed wire fabric usually mounted and used to separate coarse from finer parts. Includes Insect Screening; Industrial Metal Cloth; Industrial Metal Mesh. Excludes Fencing (FSC 5660).	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
+\N	Category	5340	FSC	0	Hardware, Commercial	Hardware, Commercial	Note Common hardware designed primarily for commercial use will be classified in this FSC. Hardware is the physical, tangible and permanent components of end items that may not be classified elsewhere. It consists also of common items that are commonly used in construction and/or manufacturing (e.g., hinges, door locks). Includes Access Covers; Bumpers; Casters; Cabinet and Door Hardware; Clevises; Hinges; Latches; Straps and Strapping; Turnbuckles; Webbed Straps. Excludes Weapons System Hardware (FSC 5342).	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
+\N	Category	5341	FSC	0	Brackets	Brackets	Note All brackets, including specially designed for specific use an/or application, will be classified in this FSC. Brackets are items of rigid construction that sustain a secondary item. Includes Angle Brackets; Double Angle Brackets; Mounting Brackets. Excludes Corner Braces (FSC 5340); "T" Braces (FSC 5340); Mending Plates (FSC 5340).	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
+\N	Category	5342	FSC	0	Hardware, Weapon System	Hardware, Weapon System	Note Hardware designed for weapon systems unique applications will be classified in this FSC. Includes Adapters; Anchor Plates and Straps; Anodes; Bellows; Couplings; Control Rods; Access Doors; Fairleads; Mounts; Tie Rods; Yokes. Excludes Commercial Hardware (FSC 5340).	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
+\N	Category	5345	FSC	0	Disks and Stones, Abrasive	Disks and Stones, Abrasive	 Includes Abrasive Belts and Belting; Hones; Abrasive Wheels, Multiapplication. Excludes Dental Abrasives; Abrasive Cones, and other Abrasive Attachments for equipment.	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
+\N	Category	5350	FSC	0	Abrasive Materials	Abrasive Materials	 Includes Cloth; Papers; Powders; Abrasive Polishing Compounds; Metal Finishing Abrasives; Industrial Diamonds; Diamond Dust; Rouge. 	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
+\N	Category	5355	FSC	0	Knobs and Pointers	Knobs and Pointers	 Includes Knobs, including Calibrated Knobs; Dials, Scale. 	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
+\N	Category	5360	FSC	0	Coil, Flat, Leaf, and Wire Springs	Coil, Flat, Leaf, and Wire Springs	Note-All springs, including specially designed, will be classified in this FSC. A spring is an elastic mechanical device that regains its original shape after being compressed, extended or deflected. Includes Compression Springs; Torsion Springs; Leaf Spring Assemblies; Flat Springs; Extension Springs. 	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
+\N	Category	5365	FSC	0	Bushings, Rings, Shims, and Spacers	Bushings, Rings, Shims, and Spacers	Note-All items, including specially designed, will be  classified in this FSC. a. A bushing is cylindrical in shape, hollow, and designed primarily to be inserted into a hole to reduce the effective inside diameter of the hole, and to protect the body structure about the hole from damage resulting from stress, strain, and vibration. b. A ring is cylindrical in shape, usually flat with a center hole. Rings are multi-applicational. See specific item name for designated usage. c. A shim is a thin, sometimes tapered, piece of material used to fill in space between things. See specific item name for dimensional parameters. d. A spacer is a device for holding two members at a given distance from each other. Includes Externally Threaded Rings; Keyed and Serrated Lock Rings; Dee Rings; Instrument Retaining Rings; Shim Sets and Assortments; Plate Spacers; Ring Spacers; Sleeve Spacers; Stepped Spacers; Spacer Sets and Assortments; Sleeve Bushings; Machine Threaded Bushings; Machine Threaded Plugs. Excludes Sleeve Bearings (FSC 3120); Pipe Threaded Plugs (FSC 4730); Piston Rings (FSC 2520, 2805, 2810, 2815, 2825, 2990, 3040, 4310, and 4820); Retaining Rings (FSC 5325); Shim Stock (FSC 9515).	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
+\N	Category	5410	FSC	0	Prefabricated and Portable Buildings	Prefabricated and Portable Buildings	 Includes Prefabricated Panels; Inflatable Shelters; Metal Screens and Metal Windows. 	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
+\N	Category	5411	FSC	0	Rigid Wall Shelters	Rigid Wall Shelters	 Includes Expandable and nonexpandable shelters. 	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
+\N	Category	5419	FSC	0	Collective Modular Support System	Collective Modular Support System	Note Includes Self-Contained habitat, containing facilities normally expected in a "Rest and Recreational" area, such as; billeting, food services, laundry, shower/hygiene services, recreational and support services that enhance morale and welfare.  	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
+\N	Category	5420	FSC	0	Bridges, Fixed and Floating	Bridges, Fixed and Floating	 Includes Special Bridge Erection Equipment; Bridge Floats and Pontoons; Tramways; Trestles. Excludes Pontoons and Floating Docks (FSC 1945).	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
+\N	Category	5430	FSC	0	Storage Tanks	Storage Tanks	 Includes Assembled and Unassembled Tanks for storage only; Enclosures for Pressure and Vacuum Tanks; Petroleum Bulk Storage Tanks. Excludes Boiler Tanks (FSC 4410); Hot Water Tanks (FSC 4520).	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
+\N	Category	5440	FSC	0	Scaffolding Equipment and Concrete Forms	Scaffolding Equipment and Concrete Forms	 Includes Prefabricated Concrete Placing Forms; Builders' Ladders and Stepladders; Suspension stages. Excludes Aircraft Ladders (FSC 1730); Fire Fighting Ladders (FSC 4210); Maintenance Ladders (FSC 4940); Marine Vessel Ladders (FSC 2090); Vehicle Ladders (FSC 2540).	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
+\N	Category	5445	FSC	0	Prefabricated Tower Structures	Prefabricated Tower Structures	 Includes Power Transmission Towers; Radar Towers; Searchlight Towers; Control Towers; Prefabricated Tower Components, such as Anchor Rails, Tie Rods, Braces, Steps, Guy Assemblies; Specialized Tower Hardware. 	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
+\N	Category	5450	FSC	0	Miscellaneous Prefabricated Structures	Miscellaneous Prefabricated Structures	 Includes Bleachers; Grandstands. 	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
+\N	Category	5510	FSC	0	Lumber and Related Basic Wood Materials	Lumber and Related Basic Wood Materials	 Includes Dimensional Lumber; Wood Flooring; Mine Timbers; Poles; Railroad Ties; Wood Siding; Molding; Stakes. Excludes Millwork (FSC 5520); Plywood and Veneer (FSC 5530); Prefabricated Non-Wood Items (FSC 5670).	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
+\N	Category	5520	FSC	0	Millwork	Millwork	 Includes Door Frames; Doors; Window Frames; Window Sashes. Excludes Molding (FSC 5510); Prefabricated Non-Wood Items (FSC 5670).	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
+\N	Category	5530	FSC	0	Plywood and Veneer	Plywood and Veneer	 Includes Plywood and Veneered Panels. 	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
+\N	Category	5610	FSC	0	Mineral Construction Materials, Bulk	Mineral Construction Materials, Bulk	 Includes Asphalt; Cinders; Gravel; Lime; Sand; Rough Dimension Stone, including Rubble; Cement; Ballast. Excludes Block, Shaped; Brick.	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
+\N	Category	5620	FSC	0	Tile, Brick and Block	Tile, Brick and Block	 Includes Concrete Building Block; Cinder Block; Slag Brick; Cut Stone; Cut and Polished Stone; Ceramic Floor and Wall Tile; Architectural Terra Cotta; Concrete Slabs and Grilles. Excludes Glass Building Block (FSC 9340)	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
+\N	Category	5630	FSC	0	Pipe and Conduit, Nonmetallic	Pipe and Conduit, Nonmetallic	 Includes Concrete Pipe and Conduit; Clay Pipe and Conduit for underground use; Drain Tile; Nonmetallic Pipe Fittings for underground use. Excludes Nonmetallic Pipe, Conduit, and Fittings for laboratory or electrical use; Hose and Tubing, Flexible Nonmetallic.	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
+\N	Category	5640	FSC	0	Wallboard, Building Paper, and Thermal Insulation Materials	Wallboard, Building Paper, and Thermal Insulation Materials	 Includes Paper Building Board; Ceiling Board; Gypsum Board; Insulating Board; Plasterboard; Soundproofing Board; Tar Paper; Wallpaper; Mineral Wool; Glass Wool Batts; Pipe Covering. Excludes Electrical Insulation Materials.	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
+\N	Category	5650	FSC	0	Roofing and Siding Materials	Roofing and Siding Materials	 Includes Roofing (all materials), including Sheet Metal; Roofing Felt; Roll Roofing; Roofing Tile; Shingles. Excludes Tar Paper; Bulk Sheet Metal Roofing and Siding; Wood Siding.	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
+\N	Category	5660	FSC	0	Fencing, Fences, Gates and Components	Fencing, Fences, Gates and Components	  	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
+\N	Category	5670	FSC	0	Building Components, Prefabricated	Building Components, Prefabricated	Note-Items specified as wooden are classified in 5520 Includes Door Frames; Window Frames; Window Sashes; Eave Troughs (Gutters); Gratings; Grilles; Shutters; Fixed Fire Escapes; Mounted Partitions. Excludes Plumbing and associated components such as Sinks; Wallbaord and items classified as furniture.	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
+\N	Category	5675	FSC	0	Nonwood Construction Lumber and Related Materials	Nonwood Construction Lumber and Related Materials	 Includes Nonwood Dimensional Lumber; Flooring; Special Turning and Carvings; Nonwood Veneer. Excludes Millwork and Wood Veneer (FSCs 5520 and 5530); Items specified as Wooden (FSC 5510).	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
+\N	Category	5680	FSC	0	Miscellaneous Construction Materials	Miscellaneous Construction Materials	 Includes Expanded Metal Lath; Airplane Landing Mats; Traction Mats. 	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
+\N	Category	5805	FSC	0	Telephone and Telegraph Equipment	Telephone and Telegraph Equipment	  	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
+\N	Category	5810	FSC	0	Communications Security Equipment and Components	Communications Security Equipment and Components	  	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
+\N	Category	5811	FSC	0	Other Cryptologic Equipment and Components	Other Cryptologic Equipment and Components	  	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
+\N	Category	5815	FSC	0	Teletype and Facsimile Equipment	Teletype and Facsimile Equipment	 Includes Ticker Tape and Sigtot Equipment. 	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
+\N	Category	5820	FSC	0	Radio and Television Communication Equipment, Except Airborne	Radio and Television Communication Equipment, Except Airborne	 Includes Telemetering Equipment. Excludes Home Type Radio and Television Equipment.	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
+\N	Category	5821	FSC	0	Radio and Television Communication Equipment, Airborne	Radio and Television Communication Equipment, Airborne	 Includes Telemetering Equipment. 	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
+\N	Category	5825	FSC	0	Radio Navigation Equipment, Except Airborne	Radio Navigation Equipment, Except Airborne	 Includes Loran Equipment; Shoran Equipment; Direction Finding Equipment. 	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
+\N	Category	5826	FSC	0	Radio Navigation Equipment, Airborne	Radio Navigation Equipment, Airborne	 Includes Loran Equipment; Shoran Equipment; Direction Finding Equipment. 	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
+\N	Category	5830	FSC	0	Intercommunication and Public Address Systems, Except Airborne	Intercommunication and Public Address Systems, Except Airborne	 Includes Wired Audio Systems; Office Type Systems; Shipboard Systems; Tank Systems. 	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
+\N	Category	5831	FSC	0	Intercommunication and Public Address Systems, Airborne	Intercommunication and Public Address Systems, Airborne	  	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
+\N	Category	5835	FSC	0	Sound Recording and Reproducing Equipment	Sound Recording and Reproducing Equipment	  Excludes Phonographs, Home Type; Dictating Machines.	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
+\N	Category	5836	FSC	0	Video Recording and Reproducing Equipment	Video Recording and Reproducing Equipment	Note This class includes, and is restricted to electronic video equipment such as video monitors, televisions, cameras, printers and recorders/reproducers used with miscellaneous communication equipment. Also included is associated equipment such as cleaners, splicers, rewinders, reels and tapes designed for use with video recording-reproducing equipment. Excluded from the class is photographic type equipment (Group 67), ADP type computer monitors (Group 70), and video equipment which includes radio receivers/transmitters (properly classified in more specific classes in Group 58).  	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
+\N	Category	5840	FSC	0	Radar Equipment, Except Airborne	Radar Equipment, Except Airborne	Note-Radar assemblies and subassemblies designed specifically for use with fire control equipment or guided missiles are excluded from this class and are included in the appropriate classes of Group 12 or Group 14.  	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
+\N	Category	5841	FSC	0	Radar Equipment, Airborne	Radar Equipment, Airborne	Note-Radar assemblies and subassemblies designed specifically for use with fire control equipment or guided missiles are excluded from this class and are included in the appropriate classes of Group 12 or Group 14.  	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
+\N	Category	5845	FSC	0	Underwater Sound Equipment	Underwater Sound Equipment	Note-This class excludes items specifically designed for fire control sonar systems. Includes Sonar Equipment; Underwater Listening Equipment; Sonobuoys; Sonobuoy Launchers; Fathometers; Sofar Equipment. 	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
+\N	Category	5850	FSC	0	Visible and Invisible Light Communication Equipment	Visible and Invisible Light Communication Equipment	Note-This class includes only communication types of infrared equipment. Excluded from this class are infrared assemblies, subassemblies, and components designed specifically for use in fire control systems, guided missile systems, test and maintenance specialized equipment, night vision equipment, and other noncommunication types of equipment. Includes Heliographs. 	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
+\N	Category	5855	FSC	0	Night Vision Equipment, Emitted and Reflected Radiation	Night Vision Equipment, Emitted and Reflected Radiation	Note-This class includes image forming devices and associated aids, their subassemblies and components, utilizing passive and/or active techniques for detection, observation, and identification of terrain and objects at night, while maintaining concealment afforded by darkness. Includes items having multiapplication for purposes of fire control, and/or night observation, and/or detection. Excluded from this class are items for which more specific classifications are suitable as prescribed by the structure and indexes of the FSC. Includes Sighting and Observation Devices, Target Detectors and Locators, Remote Viewing Systems utilizing heat radiation emitted from object(s), associated Radiation Sources, Image Converters and Image Intensifiers, Optical Cells and other components designed for Night Vision Equipment.  Holders and Lens used with Infrared Equipment are also included in this FSC. Excludes Optical Sighting devices which incorporate both day and night viewing characteristics within an integral unit for fire control purpose, nonnight vision type items designed for use with guided missiles, communications, or laboratory equipment, and Optical Elements, such as Lens, Prisms, Windows.	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
+\N	Category	5860	FSC	0	Stimulated Coherent Radiation Devices, Components, and Accessories	Stimulated Coherent Radiation Devices, Components, and Accessories	Note-This class includes, and is restricted to, devices the operation of which is based on principles involving the stimulated emission of radiation, and to associated components and accessories directly related to stimulated coherent radiation techniques. The methods for producing the radiation are those obtained by LASER (Light Amplification by Stimulated Emission of Radiation) and by MASER (Microwave and/or Molecular Amplification by Stimulated Emission of Radiation) techniques. Only those items specifically designed for stimulated coherent radiation applications, and having no other application, are to be included in this class. Assemblies or major systems containing such devices are excluded from this class.  	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
+\N	Category	5865	FSC	0	Electronic Countermeasures, Counter-Countermeasures and Quick Reaction Capability Equipment	Electronic Countermeasures, Counter-Countermeasures and Quick Reaction Capability Equipment	Note-This class includes, and is restricted to, passive and active electronic equipment, systems, and subsystems designed to prevent or reduce an enemy's effective use of radiated electromagnetic energy or designed to insure our own effective use of radiated electromagnetic energy. Includes Electronic Countermeasures, Electronic Counter-Countermeasures, Electronic Support Measures, and Quick Reaction Capability Equipment and components specially designed therefore which are not classifiable elsewhere in the FSC Structure. Excluded from this class are non-electronic items which are properly classified in more specific classes in accordance with the FSC structure and indexes.  	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
+\N	Category	5895	FSC	0	Miscellaneous Communication Equipment	Miscellaneous Communication Equipment	Note-This class includes miscellaneous communication equipment that is not classified in more specific classes (see the NOTE for FSG 58). Includes Modems. Excludes Electronic Countermeasures Equipment.	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
+\N	Category	5905	FSC	0	Resistors	Resistors	 Includes Varistors; Resistive ballast Tubes; Rheostats; Resistor Networks; Resistor Mounting Hardware; Thermistors. Excludes Resistance Wire.	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
+\N	Category	5910	FSC	0	Capacitors	Capacitors	 Includes Interference Filter Capacitors; Capacitor Mounting Hardware. Excludes Semiconductor Devices and Associated Hardware.	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
+\N	Category	5915	FSC	0	Filters and Networks	Filters and Networks	Note-This class includes those filters and networks which consist of a combination of resistors, capacitors, or coils, but not a combination of resistors only (classified in 5905), capacitors only (classified in 5910), or coils only (classified in 5950).  	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
+\N	Category	5920	FSC	0	Fuses, Arrestors, Absorbers, and Protectors	Fuses, Arrestors, Absorbers, and Protectors	 Includes Fuseholders; Fuse Boxes; Fuse Posts; Fuse Links; Fuse Blocks; Current Limiters; Corona Balls; Electrostatic Dischargers. Excludes Circuit Breakers.	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
+\N	Category	5925	FSC	0	Circuit Breakers	Circuit Breakers	 Includes Circuit Breakers and Cutouts. Excludes Relays.	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
+\N	Category	5930	FSC	0	Switches	Switches	 Includes Rotary, Knife, Toggle, Push Button, Mercury, Thermostatic, and Differential Pressure Switches. Excludes Switchgear.	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
+\N	Category	5935	FSC	0	Connectors, Electrical	Connectors, Electrical	 Includes Plugs; Jacks; Receptacles, Electronic Component Sockets and Associated Accessories Excludes Interconnectors, Fiber Optic	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
+\N	Category	5940	FSC	0	Lugs, Terminals, and Terminal Strips	Lugs, Terminals, and Terminal Strips	 Includes Binding Posts; Battery Clips; Stud Terminals; Test Clips. Excludes Caps, Electrical; Clips, Electrical; and Contacts, Electrical.	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
+\N	Category	5945	FSC	0	Relays and Solenoids	Relays and Solenoids	 Includes Electromagnetic Actuators. Excludes Contractors.	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
+\N	Category	5950	FSC	0	Coils and Transformers	Coils and Transformers	 Includes Coils, except ignition and magneto; coil assemblies; magnetic amplifiers; reactors; transformers. 	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
+\N	Category	5955	FSC	0	Oscillators and Piezoelectric Crystals	Oscillators and Piezoelectric Crystals	 Includes Crystal Units, Processed Unmounted Crystals, Crystal Controlled Oscillators and Noncrystal Controlled Oscillators Excludes Crystal Controlled Oscillators and Noncrystal Controlled Oscillators which meet the definition of the term "electronic module" as defined for FSC 5963 and Microcircuits	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
+\N	Category	5960	FSC	0	Electron Tubes and Associated Hardware	Electron Tubes and Associated Hardware	 Includes Rectifying Tubes; Photoelectric Tubes; Electron Vibrator Tubes. Excludes Transistors; Tube Sockets; X-ray Tubes; Semiconductor Devices and Associated Hardware.	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
+\N	Category	5961	FSC	0	Semiconductor Devices and Associated Hardware	Semiconductor Devices and Associated Hardware	 Includes Semiconductor Assemblies; Semiconductor Diodes; Semiconductor Rectifiers, Semiconductor Thyristors; Transistors; Unitized Semiconductors; Associated Hardware except Sockets. Excludes Microcircuits; Optoelectronic Devices and Associated Hardware.	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
+\N	Category	5962	FSC	0	Microcircuits, Electronic	Microcircuits, Electronic	Note-(1) A microcircuit is defined as follows: A small circuit having a high equivalent circuit element density, which is considered as a single part composed of interconnected elements placed and/or formed on or within a single substrate to perform an electronic circuit function. The elements may be formed on or within a semiconductor material substrate; may consist of conductive film(s) formed on an insulating substrate; or may be a combination of one or both of these types with discrete elements.  (2) The term "microcircuit", as applied to circuit devices included in this class, is delimited to exclude items consisting solely of interconnected "microcomponents" (discrete miniaturized components). Also excluded are items fabricated in the form of monolithic thick-film or thin-film structures that in themselves are not functional electronic circuits (e.g., Capacitors, Resistors, Transistors, or "arrays" thereof). Includes Integrated Circuit Devices; Integrated Circuit Modules, Integrated Electronic Devices: Hybrid, Magnetic, Molecular, Opto-Electronic, and Thin Film. Excludes Single Circuit Elements such as Capacitors; Resistors; Diodes and Transistors; Printed Circuit Boards and Circuit Card Assemblies; and Filters and Networks.	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
+\N	Category	5963	FSC	0	Electronic Modules	Electronic Modules	Note-The term "electronic module" as used in this class designates an electronic component designed for use in various equipment or end item applications, and capable of controlling voltage and/or current to produce gain, oscillation, switching, or similar integral electronic functions. It consists of a collection of miniaturized electronic parts and/or elements in a single replaceable package with plug-in mounting which will also complete the required electrical connections. It is not normally subject to disassembly as distinguished from such items as CIRCUIT CARD ASSEMBLY and ELECTRONIC COMPONENTS ASSEMBLY. These modules conform to industry or government specifications/standards that define all physical dimensions and electrical parameters required to promote commonality and ensure proper operational performance.  Excludes MICROCIRCUITS; Electronic Test Equipment Plug-In Units.	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
+\N	Category	5965	FSC	0	Headsets, Handsets, Microphones and Speakers	Headsets, Handsets, Microphones and Speakers	  	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
+\N	Category	5970	FSC	0	Electrical Insulators and Insulating Materials	Electrical Insulators and Insulating Materials	 Includes Tube, Knob, Cleat, Strain, and Standoff Insulators; Feed Thru Insulators; Bead Insulators; Varnish Cambric Tape; Friction Tape. 	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
+\N	Category	5975	FSC	0	Electrical Hardware and Supplies	Electrical Hardware and Supplies	 Includes Conduit; Raceways; Face Plates; Condulets; Outlet and Junction Boxes; Pole Line Hardware, not elsewhere classifiable. 	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
+\N	Category	5977	FSC	0	Electrical Contact Brushes and Electrodes	Electrical Contact Brushes and Electrodes	 Includes Brushes for electrical rotating equipment; Carbon Stock for Brushes; Brush Arm and Holders; Lighting Electrodes. Excludes Anodes; Cathodes; Welding Electrodes.	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
+\N	Category	5980	FSC	0	Optoelectronic Devices and Associated Hardware	Optoelectronic Devices and Associated Hardware	 Includes Optoelectronic devices and assemblies which display numeric, alpha-numeric, symbolic, or graphic information, emitters, and nondisplay optoelectronic devices, such as couplers, detectors, and switches which perform an active function in an electronic system% Excludes electric lighting fixtures, lamps, and associated hardware%	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
+\N	Category	5985	FSC	0	Antennas, Waveguides, and Related Equipment	Antennas, Waveguides, and Related Equipment	 Includes Aerials; Masts; Tower Equipment; Attenuators; Couplers; Transmission Lines. Excludes Tower Structures.	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
+\N	Category	5990	FSC	0	Synchros and Resolvers	Synchros and Resolvers	  Excludes Synchro Systems; Servo Mechanisms.	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
+\N	Category	5995	FSC	0	Cable, Cord, and Wire Assemblies: Communication Equipment	Cable, Cord, and Wire Assemblies: Communication Equipment	Note-This class includes only those types of cable, cord, and Wire Assemblies and Sets (and Wiring Harnesses) used on or with equipment and components covered by Groups 58 and 59. Cable, Cord, Wire Assemblies, and Sets (Wiring Harnesses) used on or with equipment classified in FSC Groups other than Groups 58 or 59 are classified in FSC Class 6150 if multiapplication, or classified with the next higher classifiable assembly if specially designed.  Excludes Cable Assemblies, Fiber Optic.	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
+\N	Category	5996	FSC	0	Amplifiers	Amplifiers	 Includes Audio Amplifiers, Complementary Amplifiers, Amplifiers, Operational Amplifiers, Power Amplifiers, Radio Frequency Amplifiers, Signal Amplifiers, and Video Amplifiers. Excludes multi-functional items such as Amplifier-Detector, Amplifier-Mixer and microcircuit devices.	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
+\N	Category	5998	FSC	0	Electrical and Electronic assemblies, Boards, Cards, and Associated Hardware	Electrical and Electronic assemblies, Boards, Cards, and Associated Hardware	  Excludes circuit card and electronic component assemblies which can be identified to a more definitive Approved Item Name.	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
+\N	Category	5999	FSC	0	Miscellaneous Electrical and Electronic Components	Miscellaneous Electrical and Electronic Components	 Includes Permanent Magnets and Magnetostriction Elements; Caps, Clips, and Contacts, Electrical. 	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
+\N	Category	6010	FSC	0	Fiber Optic Conductors	Fiber Optic Conductors	Note-Included in this class are bulk discrete fibers.  	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
+\N	Category	6015	FSC	0	Fiber Optic Cables	Fiber Optic Cables	Note-Included in this class are one or more discrete fiber optic conductors with a common protective covering in bulk form. May include electrical conductors/cables and/or reinforcing material.  	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
+\N	Category	6020	FSC	0	Fiber Optic Cable Assemblies and Harnesses	Fiber Optic Cable Assemblies and Harnesses	Note-Included in this class are items used for communication and/or data transmission having one or more fiber optic conductors/cables with processed end(s) or terminated in fitting(s). Excluded from this class are items used for illumination and/or image transmission.  	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
+\N	Category	6021	FSC	0	Fiber Optic Switches	Fiber Optic Switches	Note-Included in this class are switches used for line selection in fiber optic systems.  	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
+\N	Category	6030	FSC	0	Fiber Optic Devices	Fiber Optic Devices	Note Included in this class are such items as transmitters, receivers, multiplexers, demultiplexers, modulators, demodulators, repeaters, attenuators, filters, integrated optical ciruuits, and the like, used in fiber optic systems.  	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
+\N	Category	6032	FSC	0	Fiber Optic Light Sources and Photo Detectors	Fiber Optic Light Sources and Photo Detectors	Note Included in this class are light emitting and laser diodes and photo detectors used in fiber optic systems.  	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
+\N	Category	6035	FSC	0	Fiber Optic Light Transfer and Image Transfer Devices	Fiber Optic Light Transfer and Image Transfer Devices	Note-Included in this class are fiber optic devices used for illumination and/or image transmission. Excluded from this class are items used for communication and/or data transmission.  	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
+\N	Category	6060	FSC	0	Fiber Optic Interconnectors	Fiber Optic Interconnectors	Note Included in this class are all types of fiber optic terminations, such as connectors, dividers, couplers, rotary and nonrotary joints, splitters, mixers and splicers and the like.  Excludes electrical connectors	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
+\N	Category	6070	FSC	0	Fiber Optic Accessories and Supplies	Fiber Optic Accessories and Supplies	Note-Included in this class are mode stripping materials, index matching materials and other related supplies. Excluded from this class are hardware and supplies common to both electrical and fiber optic applications which are classifiable on FSC 5975.  	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
+\N	Category	6080	FSC	0	Fiber Optic Kits and Sets	Fiber Optic Kits and Sets	Note-Included in this class are kits and sets which consist of fiber optic components only; fiber optic components and related parts; fiber optic components and related tools; or fiber optic components, related parts and related tools. Excluded from this class are tool kits and sets which are classifiable in FSC 5180; test sets/instruments classifiable in FSG 66; and end item sets/equipment utilizing fiber optic components which are classifiable in the applicable equipment FSC.  	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
+\N	Category	6099	FSC	0	Miscellaneous Fiber Optic Components	Miscellaneous Fiber Optic Components	Note-Included in this class are fiber optic items which are not classifiable in a more specific class. (See the "Note" for FSG 60.)  	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
+\N	Category	6105	FSC	0	Motors, Electrical	Motors, Electrical	  Excludes Starting Motors for Engines.	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
+\N	Category	6110	FSC	0	Electrical Control Equipment	Electrical Control Equipment	 Includes Contactors; Motor Controllers; Power Servomechanisms; Switchgear; Voltage Regulators. Excludes Automatic Pilot Mechanisms; Relays; Resistors.	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
+\N	Category	6115	FSC	0	Generators and Generator Sets, Electrical	Generators and Generator Sets, Electrical	 Includes Engine, Turbine, Wind, and Hand Driven Generator Sets and Auxiliary Aircraft Generators. Excludes Motor-Converters; Motor-Generator Sets; Engine Generators; Engine Accessory Generators.	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
+\N	Category	6116	FSC	0	Fuel Cell Power Units, Components, and Accessories	Fuel Cell Power Units, Components, and Accessories	Note-This class includes items that are designed to produce an electromotive force directly from an oxidation-reduction type of chemical reaction. A complete power unit must include tanks, pumps, and associated control equipment, and requires a continuous, uninterrupted supply of liquid or gaseous fuel and oxidizers. Includes Complete Functioning Fuel Cell Power Units; Fuel Cells; Fuel Cell Assemblies or Modules; Fuel Cell Reactant Chambers; Fuel Feed Mechanisms; Electrolyte Heaters; Heat Exchangers; and other internal components peculiar to, and used exclusively on or with, Fuel Cell Power Units classified in this class. Excludes Primary Batteries (FSC 6135); Secondary Batteries (FSC 6140); Generators and Generating Sets (FSC 6115); and items for which more suitable classes are specifically prescribed by the indexes and structure of the FSC.	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
+\N	Category	6117	FSC	0	Solar Electric Power Systems	Solar Electric Power Systems	Note-This class includes items which are designed for the direct conversion of solar energy into electrical power.  	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
+\N	Category	6120	FSC	0	Transformers: Distribution and Power Station	Transformers: Distribution and Power Station	Note This class includes transformers with a kilovolt-ampere rating above 1 kva.  Excludes Potential and Current Transformers	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
+\N	Category	6125	FSC	0	Converters, Electrical, Rotating	Converters, Electrical, Rotating	Note-This class includes devices employing mechanical rotation for changing electrical energy from one form to another (i.e., AC to AC, DC to DC, AC to DC, and DC to AC). Excluded from this class are electrical generators and generator sets (FSC 6115). Includes Complete Battery Charging Equipment, Rotating; Dynamotors; Motor-Converters; Motor-Generator Sets; Phase Converters; Rotating Equipment; Synchronous Converters. Excludes Nonrotating Equipment.	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
+\N	Category	6130	FSC	0	Converters, Electrical, Nonrotating	Converters, Electrical, Nonrotating	Note This class includes devices employing a means other than mechanical rotation for changing electrical energy from one form to another (i.e., AC to AC, DC to DC, AC to DC, and DC to AC). Includes Complete Battery Charging Equipment, Nonrotating; Power Supplies, Multiapplication. Excludes Rectifying Tubes; (FSC 5960); Rectifying Crystals (FSC 5961); Rotating Equipment (FSC 6125); Transformers (FSC 5950); and Semiconductor Devices and Associated Hardware (FSC 5961).	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
+\N	Category	6135	FSC	0	Batteries, Nonrechargeable	Batteries, Nonrechargeable	 Includes Cells and Dry Batteries; Nuclear Batteries. 	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
+\N	Category	6140	FSC	0	Batteries, Rechargeable	Batteries, Rechargeable	 Includes Rechargeable Cells and Batteries. 	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
+\N	Category	6145	FSC	0	Wire and Cable, Electrical	Wire and Cable, Electrical	Note-This class includes only bulk electrical wire and cable. Excluded from this class are electrical wire and cable items of definite length either with processed ends, or terminated in fittings. Includes Insulated and Noninsulated, Wire and Cable, such as, Antenna Wire, Coaxial Cable, Fuse and Resistance Wire, and Magnet Wire. Excludes Radio Frequency Transmission Line (FSC 5985); Fiber Optic Cable (FSC 6015); Communication Cable Assemblies (FSC 5995); Distribution and Power Transmission Cable Assemblies (FSC 6150).	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
+\N	Category	6150	FSC	0	Miscellaneous Electric Power and Distribution Equipment	Miscellaneous Electric Power and Distribution Equipment	 Includes Appliance and Extension Cords; Electric Power and Distribution Cable with Attachments, Multiapplication; Common Components of Electrical Rotating Equipment, such as End Bells and Frames. 	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
+\N	Category	6160	FSC	0	Miscellaneous Battery Retaining Fixtures and Liners	Miscellaneous Battery Retaining Fixtures and Liners	 Includes Battery Boxes, Covers, Liners, Racks, Retainers, and Trays. 	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
+\N	Category	6210	FSC	0	Indoor and Outdoor Electric Lighting Fixtures	Indoor and Outdoor Electric Lighting Fixtures	 Includes Airport, Railroad Platform, Stadium, and Street Lighting Fixtures. Excludes Nonelectrical Outdoor Fixtures; Signal Fixtures; Nonelectrical Indoor Fixtures.	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
+\N	Category	6220	FSC	0	Electric Vehicular Lights and Fixtures	Electric Vehicular Lights and Fixtures	 Includes Automotive, Marine, Railroad, and Aircraft Lights and Fixtures. Excludes Nonelectrical Vehicular Fixtures.	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
+\N	Category	6230	FSC	0	Electric Portable and Hand Lighting Equipment	Electric Portable and Hand Lighting Equipment	 Includes Floodlights; Searchlights; Extension Lights. Excludes Nonelectrical Portable and Hand Lighting Equipment; Signal and Alarm Equipment.	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
+\N	Category	6240	FSC	0	Electric Lamps	Electric Lamps	 Includes Fluorescent Lamps; Incandescent Lamps, Large and Miniature; Mercury Lamps; Sodium Lamps. 	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
+\N	Category	6250	FSC	0	Ballasts, Lampholders, and Starters	Ballasts, Lampholders, and Starters	  	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
+\N	Category	6260	FSC	0	Nonelectrical Lighting Fixtures	Nonelectrical Lighting Fixtures	 Includes Lanterns, Nonelectrical; Hand and Portable Carbide Lamps; Candles. 	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
+\N	Category	6310	FSC	0	Traffic and Transit Signal Systems	Traffic and Transit Signal Systems	  Excludes Railroad Signals.	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
+\N	Category	6320	FSC	0	Shipboard Alarm and Signal Systems	Shipboard Alarm and Signal Systems	  	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
+\N	Category	6330	FSC	0	Railroad Signal and Warning Devices	Railroad Signal and Warning Devices	 Includes Railroad Gates; Flasher Lights; Block Signals. Excludes Semaphore Flag Signals.	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
+\N	Category	6340	FSC	0	Aircraft Alarm and Signal Systems	Aircraft Alarm and Signal Systems	 Includes Oxygen Pressure Signals and Warning Devices; such as Air Pressure Warning Signals, Aircraft Crew Warning Signals, Altitude Warning Signals, Alarm Controls, Audible Landing Gear Alarms. Excludes Aircraft Engine Oil and Fuel Warning Devices.	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
+\N	Category	6350	FSC	0	Miscellaneous Alarm, Signal, and Security Detection Systems	Miscellaneous Alarm, Signal, and Security Detection Systems	 Includes Anti-intrusion Alarm Systems; Foghorns; Gongs; Chimes; Bells; Burglar Alarm Systems; Fire Alarms; Police Alarm Systems; Sounding Devices; Manual Gas Alarms; Landing Wands. Excludes Loran; Radar; Sonar; Engine Oil and Fuel Warning Devices; Aircraft Oxygen Warning Devices.	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
+\N	Category	6505	FSC	0	Drugs and Biologicals	Drugs and Biologicals	Only items specifically formulated for human use are appropriate to this class. Includes all drugs, medicinal grade chemicals, and Biologicals subject to the Federal Food, Drug and Cosmetic Act, listed in the Monograph section of the U.S. Pharmacopeia or the National Formulary or covered by the United States Adopted Names (USAN). Other nations may apply their own legal documents. Excludes medicated cosmetics and toiletries classifiable in FSC 6508 and in vitro diagnostic substances and reagents classifiable in FSC 6550, and Veterinary Drugs and Biologicals classifiable in FSC 6509.	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
+\N	Category	6508	FSC	0	Medicated Cosmetics and Toiletries	Medicated Cosmetics and Toiletries	 Includes medicated cosmetics and toiletries that have been determined to be drugs in accordance with the Federal Food, Drug, and Cosmetic Act. Excludes nonmedicated cosmetics and toiletries which are classifiable in Group 85.	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
+\N	Category	6509	FSC	0	Drugs and Biologicals, Veterinary Use	Drugs and Biologicals, Veterinary Use	 Includes All Drugs, medicinal grade chemical, and Biologicals subject to the provisions of the Department of Agriculture (Veterinary Drugs and Biologicals) specifically formulated for Veterinary use. Other Nations may apply their own legal documents. Excludes Drugs and Biologicals specifically formulated for Human use classifiable in FSC 6505.	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
+\N	Category	6510	FSC	0	Surgical Dressing Materials	Surgical Dressing Materials	 Includes Bandages, Compresses, Dressings, Gauze, Pads, Sponges, and impregnated surgical dressing materials. 	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
+\N	Category	6515	FSC	0	Medical and Surgical Instruments, Equipment, and Supplies	Medical and Surgical Instruments, Equipment, and Supplies	 Includes Anesthesia Apparatus; Blood Transfusion Apparatus; Oxygen Therapy Apparatus; Respirators; Orthopedic Supplies; Arch Supports; Clinical Thermometers; Sutures; Hearing Aids; Veterinary Equipment; Endoscopes, Fiber Optic. Excludes Opthalmic Instruments, Equipment, and Supplies; Non-Medical Endoscopes.	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
+\N	Category	6520	FSC	0	Dental Instruments, Equipment, and Supplies	Dental Instruments, Equipment, and Supplies	 Includes Dental Engines; Dental Laboratory Equipment; Operating Chairs; Orthodontic Appliances; Teeth; Dental Metals; Dental Abrasives; Dental Laboratory Furniture. 	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
+\N	Category	6525	FSC	0	X-ray Equipment and Supplies: Medical, Dental, Veterinary	X-ray Equipment and Supplies: Medical, Dental, Veterinary	 Includes Medical X-ray Film; Medical X-Ray Film Viewing Equipment; Medical X-Ray Film Processing and Finishing Equipment and Supplies; X-Ray Tubes. Excludes Industrial X-Ray Equipment.	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
+\N	Category	6530	FSC	0	Hospital Furniture, Equipment, Utensils, and Supplies	Hospital Furniture, Equipment, Utensils, and Supplies	 Includes Orthopedic Equipment; Operating Lights; Physiotherapy Equipment; Sterilizers; WheelChairs; Litters; Hospital Beds; Restraint Equipment. 	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
+\N	Category	6532	FSC	0	Hospital and Surgical Clothing and Related Special Purpose Items	Hospital and Surgical Clothing and Related Special Purpose Items	 Includes Only those clothing items which are required exclusively for use in hospital operations, or in medical or dental facilities, which have no functional counterpart elsewhere in Federal Organizations participating in the Federal Catalog System. Excludes General purpose items of clothing and fabricated textile material.	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
+\N	Category	6540	FSC	0	Ophthalmic Instruments, Equipment, and Supplies	Ophthalmic Instruments, Equipment, and Supplies	 Includes Ophthalmic Lens Cutting and Grinding Machine; Ophthalmic Lenses and Lens Blanks; Spectacle Frames; Ophthalmological and Optometric Instruments, Equipment, and Supplies. Excludes Optical Lens Cutting and Grinding Machines: Ophthalmoscope and Otoscope Set; Surgical Instruments and Supplies that can be used by other medical disciplines; i.e., sutures, eye pads, eye shields, eye bath, and the like.	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
+\N	Category	6545	FSC	0	Replenishable Field Medical Sets, Kits, and Outfits	Replenishable Field Medical Sets, Kits, and Outfits	  Excludes Sets and kits which can be logically classified in another FSC Class in Group 65, such as Insect Sting Kit; Otoscope and Opthalmoscope Set; In Vitro Diagnostic Test Kits; and the like.	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
+\N	Category	6550	FSC	0	In Vitro Diagnostic Substances, Reagents, Test Kits and Sets	In Vitro Diagnostic Substances, Reagents, Test Kits and Sets	 Includes In vitro diagnostic aids, such as test tablets, test slides, test strips, test cards, test papers, test solutions, reagents; sets and kits designated for in vitro qualitative and quantitative tests on specimens, such as blood, urine, feces, and the like, for the purposes of aiding in the medical diagnosis of disease, determining body organ dysfunction, or other abnormal conditions. Excludes In vitro diagnostic substances classifiable in FSC 6505.	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
+\N	Category	6605	FSC	0	Navigational Instruments	Navigational Instruments	 Includes Azimuths; Sextants; Octants; Compasses; Plotting Boards; Underwater Log Equipment; Air Position Indicators; Drift Meters. 	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
+\N	Category	6610	FSC	0	Flight Instruments	Flight Instruments	 Includes Air Speed Indicators; Rate of Climb Indicators; Bank and Turn Indicators; Pitot Tubes; Gyro Horizon Indicators; Attitude Gyro Indicators. Excludes Navigational Instruments (FSC 6605).	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
+\N	Category	6615	FSC	0	Automatic Pilot Mechanisms and Airborne Gyro Components	Automatic Pilot Mechanisms and Airborne Gyro Components	Note Included in this class are gyro components of guided missiles. Excluded are complete gyro mechanisms and nonairborne gyro components, both of which are classified in the same classes as their next higher assemblies. Includes Automatic Pilot Regulators; Directional, Vertical, Bank and Turn, and Hydraulic Surface Gyro Controls; Airborne and Shipborne Automatic Pilot Mechanisms; Helicopter Automatic Stabilization Equipment. Excludes Automatic Pilot Training Devices (FSC 6930); and Automatic Pilot Mechanisms, Guided Missile (FSC 1420).	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
+\N	Category	6620	FSC	0	Engine Instruments	Engine Instruments	Note-Instruments designed for use on both engines and other than engines are not included in this class and should be classified in the appropriate instruments class of Group 66. Includes All Engine Instruments, including Aircraft, Marine, and Vehicular; Fuel Pressure Gages; Manifold Pressure Gages; Oil Pressure Gages; Fuel Mixture Indicators; Engine Oil and Fuel Warning Devices. 	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
+\N	Category	6625	FSC	0	Electrical and Electronic Properties Measuring and Testing Instruments	Electrical and Electronic Properties Measuring and Testing Instruments	Note-This class includes all "basic" types of electrical and electronic test instruments, such as ammeters, voltmeters, ohmmeters, multimeters, and similar instruments, even if specially designed. Excluded from this class by the modifier "except specially designed" are test instruments, other than "basic" instruments, which are specially designed for use with atomic ordnance, fire control, guided missile, motor vehicle, aircraft, or photographic equipment. Such specially designed test instruments are to be classified in other classes in the Federal Supply Classification.  This class includes communications test equipment, infrared test equipment designed for communication, and night vision maintenance and test specialized equipment. Includes Test Leads and Test Lead Attachments; Test instruments designed for communication equipment; Test instruments designed for use with electronic equipment classified in two or more FSC groups. Excludes Radiac Equipment	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
+\N	Category	6630	FSC	0	Chemical Analysis Instruments	Chemical Analysis Instruments	 Includes Acidity (pH) Meters; Gas Analyzers; Alakalinity Measuring Instruments; Colorimeters. Excludes Gas Detecting Equipment; Manual Gas Alarms; Chemicals; In Vitro Diagnostic Substances and Reagents.	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
+\N	Category	6635	FSC	0	Physical Properties Testing and Inspection	Physical Properties Testing and Inspection	 Includes Destructive and Nondestructive Inspection Equipment such as Fluorescent Penetrant Inspection Units; Magnetic Inspection Units; Industrial X-Ray Machines; Industrial X-Ray Film; Tensiometers; Material Hardness Testers. Excludes General prupose Measuring Tools (FSC 5210) and Precision Measuring Tools and Inspection Gages (FSC 5220).	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
+\N	Category	6720	FSC	0	Cameras, Still Picture	Cameras, Still Picture	 Includes Aerial, Mapping, Microfilm, Photocopy, and Studio Cameras. Excludes X-Ray Cameras (FSC 6525), and Industrial X-Ray Machine (FSC 6635).	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
+\N	Category	6730	FSC	0	Photographic Projection Equipment	Photographic Projection Equipment	 Includes Screens; Viewers; Photomap Projectors; Integrated Viewers/Printer and Microform storage and retrieval systems. 	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
+\N	Category	6636	FSC	0	Environmental Chambers and Related Equipment	Environmental Chambers and Related Equipment	Note This class includes only those environmental chambers used exclusively to perform controlled tests, under simulated conditions, to determine physical damage and/or changes in operating characteristics for equipments and components such as Humidity; Immersion; Moisture; Altitude; Explosion; Thermal Shock; Sand and Dust; Flammability; Seal. Environmental chambers included in this class provide data regarding service life and behavior of various items equivalent to actual service conditions existing in the field. Includes Chambers; Wind Tunnels; Enclosures specifically designed to simulate an environmental condition; Weatherometers; Fadeometers; Specially designed equipment and components exclusively related to environmental chambers. Excludes General purpose prefabricated buildings, chambers, panels, and components (FSC 5410); Controlled Environmental Conditioning Kits and Sets (FSC 4240); Baths (FSC 4510); Ovens (FSC 7310); Kilns (FSC 3630); Radiosonde Baseline Check Sets (FSC 6660); Divers Recompression Chambers (FSC 4220); Altitude Training Decompression Chambers (FSC 6930); and Chambers used as training devices (FSC 6930); Checkout and Test Equipment (FSC 6625); Chemical Analysis Instruments (FSC 6630); Electrical and Electronic Properties Measuring and Testing Instruments (FSC 6625); and Meteorological Instruments (FSC 6660).	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
+\N	Category	6640	FSC	0	Laboratory Equipment and Supplies	Laboratory Equipment and Supplies	 Includes Laboratory Glassware; Laboratory Funnels; Laboratory Furnaces; Glass Beads; Laboratory White Sand; Litmus Paper; Paper Filters; Insect Transfixion Pins; Laboratory Glass Wool; Laboratory Furniture, except Dental Laboratory. Excludes Instruments covered by other classes in group 66; Dental Laboratory Equipment; Laboratory Scales and Balances; In Vitro Diagnostic Substances and Reagents.	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
+\N	Category	6645	FSC	0	Time Measuring Instruments	Time Measuring Instruments	 Includes Clocks; Job Recording Devices; Time Recorders; Time Stamps, Watch and Clock Movements; Watches. 	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
+\N	Category	6650	FSC	0	Optical Instruments, Test Equipment, Components and Accessories	Optical Instruments, Test Equipment, Components and Accessories	 Includes Binoculars; Magnifiers; Microscopes; Periscopes; Telescopes; Optical Elements; such as Lens, Prisms, Windows; Optical Benches and Associated Devices; Endoscopes, Fiber Optics (Non-Medical). Excludes Fire Control Instruments, Optical; Surveying Instruments, Optical; Photogrammetric Instruments; Octants; and Sextants; Optical Instruments Integrated with Fire Control Equipment; Opthalmological Instruments; Electronic Fiber Optic Test Equipment; Medical Endoscopes.	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
+\N	Category	6655	FSC	0	Geophysical Instruments	Geophysical Instruments	 Includes Geodetic, Oceanographic and Seismographic Instruments. Excludes Telescopes.	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
+\N	Category	6660	FSC	0	Meteorological Instruments and Apparatus	Meteorological Instruments and Apparatus	 Includes Meteorological Ballons; Radiosonde Sets; Radarsonde Sets. 	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
+\N	Category	6665	FSC	0	Hazard-Detecting Instruments and Apparatus	Hazard-Detecting Instruments and Apparatus	 Includes Radiac Equipment; Gas Detecting Equipment; Land Mine Detecting Equipment. Excludes Manual Gas Alarms (FSC 6350).	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
+\N	Category	6670	FSC	0	Scales and Balances	Scales and Balances	 Includes Coin Operated, Household, Industrial, Postal, and Laboratory Scales and Balances. 	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
+\N	Category	6675	FSC	0	Drafting, Surveying, and Mapping Instruments	Drafting, Surveying, and Mapping Instruments	 Includes Drawing Instruments, Drafting Tools; Engineering and Architectural Scales; Levels; Transits; Photogrammetric Instruments; Astrolabes; Level Rods; Plane Tables; Surveying Altimeters; Theodolites. Excludes Surveyors' Tapes.	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
+\N	Category	6680	FSC	0	Liquid and Gas Flow, Liquid Level, and Mechanical Motion Measuring Instruments	Liquid and Gas Flow, Liquid Level, and Mechanical Motion Measuring Instruments	 Includes Liquid Level Float Instruments; Revolution Counters; Speedometers; Rotation Measuring Instruments and Apparatus; Oxygen Flow Indicators; Tachometers, including Engine Tachometers. Excludes Combination Instruments; (FSC 6695); Meteorological Instruments (FSC 6660); and Automatic Control Valves (FSG 48).	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
+\N	Category	6685	FSC	0	Pressure, Temperature, and Humidity Measuring and Controlling Instruments	Pressure, Temperature, and Humidity Measuring and Controlling Instruments	 Includes Thermometers, including Engine Thermometers; Pressure Gages; Thermocouple Leads; Resistance Bulbs. Excludes Clinical Therometers; (FSC 6515); Thermostatic and Differential Pressure Switches (FSC 5930); and Meteorological Instruments (FSC 6660).	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
+\N	Category	6695	FSC	0	Combination and Miscellaneous Instruments	Combination and Miscellaneous Instruments	 Includes Flow-Pressure Instruments; Taximeters; Dynamometers. Excludes Dental, Medical, Surgical, and Veterinary Instruments.	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
+\N	Category	6710	FSC	0	Cameras, Motion Picture	Cameras, Motion Picture	 Includes Aerial and Mapping Cameras. Excludes Television Cameras, Nonairborne (FSC 5820); Television Cameras, Airborne (FSC 5821); Video Cameras (FSC 5836).	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
+\N	Category	6740	FSC	0	Photographic Developing and Finishing Equipment	Photographic Developing and Finishing Equipment	 Includes Editing Equipment; Enlargers; Driers; Pressers; Printers; Washers. 	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
+\N	Category	6750	FSC	0	Photographic Supplies	Photographic Supplies	 Includes Sensitized Photographic Paper; Special Purpose Photographic Chemicals; Unprocessed Film; Photoflash Lamps. Excludes X-Ray Film (Medical Class 6525 or Industrial Class 6635); Electrographic (Facsimile) Paper for direct electrostatic printing or copying (FSC 7530).	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
+\N	Category	6760	FSC	0	Photographic Equipment and Accessories	Photographic Equipment and Accessories	 Includes Light Meters; Tripods; Filters; Range-finders; Photographic Floodlight Fixtures; Lenses; Specialized Photographic Test Equipment. Excludes Lamps (bulbs) (FSC 6240); Photoflash Lamps (FSC 6750).	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
+\N	Category	6770	FSC	0	Film, Processed	Film, Processed	 Includes Motion Picture Film, Silent and Sound; Still Picture Film. Excludes X-Ray Film (Medical class 6525 or Industrial class 6635); Training and Educational Film (FSC 6910); Processed Microfilm (FSC 7670).	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
+\N	Category	6780	FSC	0	Photographic Sets, Kits, and Outfits	Photographic Sets, Kits, and Outfits	  	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
+\N	Category	6810	FSC	0	Chemicals	Chemicals	 Includes Naphtha Solvents; Water Softening Compounds; Tanning Materials, Natural or Synthetic; Dextrines and Starches; Inedible Gelatins; Acetone; Propellant Chemicals, Bulk, not Specialized Solely for Guided Missile Use. Excludes Medicinal Chemicals; Gases; Foundry dextrines; Radiographic and Photographic Chemicals; In Vitro Diagnostic Substances and Reagents.	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
+\N	Category	6820	FSC	0	Dyes	Dyes	 Includes Household Tints 	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
+\N	Category	6830	FSC	0	Gases: Compressed and Liquefied	Gases: Compressed and Liquefied	 Includes Fuel Gases. Excludes Military Chemical Gases; Medical Gases; Empty Gas Cylinders and their caps, valves, and valve spare parts.	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
+\N	Category	6840	FSC	0	Pest Control Agents and Disinfectants	Pest Control Agents and Disinfectants	 Includes Insect Repellents; Fungicides; Insecticides; Rodenticides; Weed Killers. Excludes Personal Deodorants.	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
+\N	Category	6850	FSC	0	Miscellaneous Chemical Specialties	Miscellaneous Chemical Specialties	 Includes Antifogging Compounds; Wetting Agents; Etching and Fountain Solutions for Lithographing; Blanket Repair Solutions for Lithographing; Antifreeze. 	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
+\N	Category	6910	FSC	0	Training Aids	Training Aids	 Includes Mockups; Cutaway Models; Scale Models; Training Films; Training Aid Maps; Navigational Training Aids; Flight Instrument Training Aids; Aircraft Instrument Training Aids; Vehicle Training Aids; Engine Instrument Training Aids; Hydraulic System Training Aids; Cutaway, Mockup, or Sectionalized Ammunition only; Training Equipment normally used in classroom training. Excludes Drill, Dummy, Exercise, Practice, or Simulated Ammunition and Weapons.	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
+\N	Category	6920	FSC	0	Armament Training Devices	Armament Training Devices	 Includes Bombing Trainers; Gunnery Trainers; Tow Targets; Gunnery Targets; Guided Missile Training Sets. Excludes Target Drones; Drones for such use as training, surveillance, missile evaluation, and photographic reconnaissance; Atomic Ordnance Training Devices; Training Aids; Drill, Dummy, Exercise, Practice, or Simulated Ammunition and Weapons.	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
+\N	Category	6930	FSC	0	Operation Training Devices	Operation Training Devices	 Includes Link Trainers; Automatic Pilot Training Devices; Drift Meter Training Devices; Celestial Navigation Trainers; Dead Reckoning Navigation Trainers; Instrument Flying and Landing Trainers; Terrain Projection Trainers; All operational training devices except communication and armament. Excludes Training Aids.	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
+\N	Category	6940	FSC	0	Communication Training Devices	Communication Training Devices	 Includes Supersonic Radar Trainers; Navigational Radar Trainers; Search and Detecting Radar Trainers; Code Practice Equipment. Excludes Training Aids.	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
+\N	Category	7010	FSC	0	ADPE System Configuration	ADPE System Configuration	Note-a group of general purpose analog, digital, or hybrid electronic or electromechanical devices that are interconnected to operate as a system. Frequently referred to as an ADP system, although the term "system" is not considered definitive. Includes an assembly of devices consisting of a central processing unit (CPU) and the necessary input/output devices, accessorial devices, analog measurement devices, software and/or firmware required to perform the desired objectives. Also includes sub-assemblies and units in which input/output devices, CPUs, and/or accessorial devices or components are incorporated into a single assembly or unit. A specially designed device incorporated into a system shall not influence the classification of the base assembly or unit.  	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
+\N	Category	7020	FSC	0	ADP Central Processing Unit (CPU, Computer), Analog	ADP Central Processing Unit (CPU, Computer), Analog	Note-An analog is a representation in one form of a physical condition existing in another form (e.g., the level of mercury in a tube represents temperature in a thermometer; the angular position of a needle represents speed on a speedometer). This class includes only CPUs that accept as inputs the electrical equivalent of physical conditions such as flow, temperature, pressure, angular position or voltage and perform computations by manipulating these electrical equivalents to produce results for further use.  	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
+\N	Category	7021	FSC	0	ADP Central Processing Unit (CPU, Computer), Digital	ADP Central Processing Unit (CPU, Computer), Digital	Note-Digital refers to the representation of discrete numbers, symbols and alphabetic characters by a predetermined, coded combination of electrical impulses. This class includes only CPUs that accept information represented by digital impulses. Specifically, a device capable of performing sequences of arithmetic and logic operations (a program) not only on data but also on the program which is contained in its internal memory (storage) without intervention of an operator.  	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
+\N	Category	7022	FSC	0	ADP Central Processing Unit (CPU, Computer), Hybrid	ADP Central Processing Unit (CPU, Computer), Hybrid	Note-Hybrid refers to a combination of analog and digital capability as defined in Classes 7020 and 7021 with conversion capability required for intercommunication.  	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
+\N	Category	7025	FSC	0	ADP Input/Output and Storage Devices	ADP Input/Output and Storage Devices	Note This class includes devices used to control and transfer information to and from a Computer (as modified). The input device is used for transferring data and instructions into a computer. The output device is used to transfer results of processing by the computer to ADP peripheral devices. Input/output devices combine the above functions in the same device. This class includes printers, display units, disk drive units (magnetic, optical and floptical), tape drive units, terminals, data entry devices and transfer units. Also includes Optical Compact Disk (CD) devices used for the storage and retrieval of data and firmware.  	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
+\N	Category	7030	FSC	0	ADP Software	ADP Software	Note-Software is a series of instructions or statements in a form acceptable to a CPU, designed to cause the ADPE configuration to execute an operation or operations; or a collection of data in a form capable of being processed and operated on by a computer. Includes System programs, such as operating systems, assemblers, compilers, executive routines, interpreters, translators; utility programs, such as sort/merge programs, media conversion, maintenance diagnostic programs; and application programs, such as payroll, inventory control, and engineering analysis programs. Excludes Software designed to Government specifications to satisfy the requirements of a particular user or for use with ADPE properly classifiable in an FSG other than FSG 70.   Also excludes operating manuals and programmers' manuals properly classified in FSG 76.	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
+\N	Category	7035	FSC	0	ADP Support Equipment	ADP Support Equipment	Note This class includes various devices and associated control units which are designed for use in combination or conjunction with an ADPE configuration but are not part of the configuration itself.   ADP support equipment includes magnetic tape testing, certifying, and cleaning equipment; disk pack testing, certifying and cleaning equipment; tape equipment, rewinders, splicers, spoolers and card reconditioners.  Included in this class are complete units and components of related general purpose commercially available support equipment which are not specifically designed for use as part of a system such as a weapon system, control system, digital image processing system, missile system, communication system or navigation system. Also included are support control systems and components not specifically designed for use with process control such as automatic machine tool processing operations in which flow, pressure, temperature or other parameters are controlled by instrument regulations in automatic machine tool and process operations.  	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
+\N	Category	7040	FSC	0	Punched Card Equipment	Punched Card Equipment	 Includes Collating machines, key punch machines, tabulating machines; verifiers; reproducers; summary punches, sorters; interpreters. Excludes Card actuated machines designed for use with an ADPE system.	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
+\N	Category	7042	FSC	0	Mini and Micro Computer Control Devices	Mini and Micro Computer Control Devices	 Includes Mini or micro computers used as control mechanisms where computer technology is essential in controlling, monitoring, measuring, and directing processes, devices, instruments or other equipment. Excludes Mini and micro computer control devices which are designed specifically for use in and/or integral to higher order systems, e.g., aircraft fire control systems, numerically controlled machine tools, sequence controlled printing equipment, motion measuring instruments, office information system equipment, and the like.	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
+\N	Category	7045	FSC	0	ADP Supplies	ADP Supplies	Note This class includes ADP tape seal bands, reels and hubs, carrying cases, canisters, and the like. Also includes all nonrecorded magnetic recording media designed to be used with ADP equipment, such as magnetic tape, removable disk packs, magnetic cards, cassettes, and diskettes. Also includes Optical Disks used for the storage of data.  	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
+\N	Category	7050	FSC	0	ADP Components	ADP Components	Note-This class includes ADP Component Assemblies that are parts of analog, digital or hybrid data processing devices. Excluded from the class are items for which more specific classifications are suitable. The FSC structure and indexes will govern the classification of those items permitted classification in a single class only.  	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
+\N	Category	7105	FSC	0	Household Furniture	Household Furniture	 Includes Bedsprings, Open Style (All-metallic); Folding Chairs; Camp Furniture; Mirrors, Wall Mounting and Furniture Types; Smoking Stands. Excludes Hospital Beds and Bedsprings; Ash Trays; Mattresses; Bedsprings, Box Style (Fabric Covered).	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
+\N	Category	7110	FSC	0	Office Furniture	Office Furniture	 Includes Filing Cabinets; Safes; Post Office Furniture; School Furniture; Blackboards. Excludes Dental X-Ray Film Protective Safes; Visible Record Equipment.	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
+\N	Category	7125	FSC	0	Cabinets, Lockers, Bins, and Shelving	Cabinets, Lockers, Bins, and Shelving	 Includes Kitchen Cabinets; Sectional Shelving. Excludes Foot Lockers; Filing Cabinets.	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
+\N	Category	7195	FSC	0	Miscellaneous Furniture and Fixtures	Miscellaneous Furniture and Fixtures	 Includes Stone, Clay, and Concrete Furniture; Auditorium and Theater Furniture; Library Furniture; Cashier Stands. 	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
+\N	Category	7210	FSC	0	Household Furnishings	Household Furnishings	 Includes Household Furnishings of Textiles, Plastics, Paper, Rubber, and other materials; Sheets, Pillows, Blankets, and other Bedding; Insect Bars; Tablecloths; Towels; Steamer Rugs; Mattresses; Bedsprings, Box style (Fabric Covered); Bedspring and Mattress Sets. Excludes Floor Coverings; Curtains; Draperies; Paper Napkins; Paper Doilies; Bedsprings, Open Style (All-Metallic).	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
+\N	Category	7220	FSC	0	Floor Coverings	Floor Coverings	 Includes Linoleum; Rubber and Asphalt Tile; Carpets; Rugs; Rug Pads. Excludes Vehicular Floor Mats.	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
+\N	Category	7230	FSC	0	Draperies, Awnings, and Shades	Draperies, Awnings, and Shades	 Includes Curtains; Specialized Hardware and Fittings for Curtains, Draperies, Venetian Blinds, and Window Shades. 	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
+\N	Category	7240	FSC	0	Household and Commercial Utility Containers	Household and Commercial Utility Containers	 Includes Refuse Cans; Sprinkling Cans; Clothes Hampers; Household Basket; Fabric Utility Containers. 	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
+\N	Category	7290	FSC	0	Miscellaneous Household and Commercial Furnishings and Appliances	Miscellaneous Household and Commercial Furnishings and Appliances	 Includes Fireplace Sets; Vases and Urns; Household Sewing Machines. 	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
+\N	Category	7310	FSC	0	Food Cooking, Baking, and Serving Equipment	Food Cooking, Baking, and Serving Equipment	Note-This class includes warming and/or chilling equipment used for the display and serving of food. Includes Warming and/or Chilling Tables, Stationary and Portable; Serving Carts; Field and Mobile Baking Ovens; Toasters; Waffle Irons; Grills; Special Aircraft, Marine, and Railway Type Food Cooking Equipment; Utensils with Integral Heating Units; Cafeteria Type Display Cases and Showcases; Soda Fountains; Milk, Soda, and/or Ice Cream Dispensers; Cold Food Counters; Combination Heated-Refrigerated Food Serving Equipment; Carbonators; and other types of refrigerated food serving and display equipment commonly used in cafeterias, mess hall kitchens, and the like. Excludes Carts other than Serving; Commissary or Food Store Type Refrigeration Equipment; Commercial Household, or Professional and Scientific Refrigerators; Drinking Fountains; (see Class 4110 for items excluded from Class 7310).	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
+\N	Category	7320	FSC	0	Kitchen Equipment and Appliances	Kitchen Equipment and Appliances	 Includes Dishwashing Machines; Food Slicing Machines; Food Mixers; Utility Carts Specially designed for use in Kitchen and Dining Area. Excludes Sinks; Serving Carts (see Class 7310 for Food Serving Carts).	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
+\N	Category	7330	FSC	0	Kitchen Hand Tools and Utensils	Kitchen Hand Tools and Utensils	 Includes Pots; Pans; Can Openers; Graters; Food Mashers; Cleavers; Vacuum Bottles and Jugs. Excludes Utensils with Integral Heating Units; Knives; Forks; Spoons.	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
+\N	Category	7340	FSC	0	Cutlery and Flatware	Cutlery and Flatware	 Includes Knives; Forks; Spoons; Hunting Knives. 	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
+\N	Category	7350	FSC	0	Tableware	Tableware	 Includes China and Earthenware; Glassware; Paper Plates and Cups. 	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
+\N	Category	7360	FSC	0	Sets, Kits, Outfits and Modules, Food Preperation and Serving	Sets, Kits, Outfits and Modules, Food Preperation and Serving	  	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
+\N	Category	7420	FSC	0	Accounting and Calculating Machines	Accounting and Calculating Machines	 Includes Accounting and adding machines and electronic calculators. Excludes Punched card system machines; Machines or devices that can be applied to a variety of problems by the internal execution of a series of instructions, not limited to specific keystroke functions, but controlled by a general purpose data processing language.	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
+\N	Category	7430	FSC	0	Typewriters and Office Type Composing Machines	Typewriters and Office Type Composing Machines	 Includes Typewriters and office type composing machines with built-in electric/electronic functions such as margins, headings, tabs, centering and related actions. Excludes Typewriters and office type composing machines which are designed primarily for use as a component of an ADPE system or that are user programmable, and that can be applied to a variety of applications by the internal execution of a series of instructions, not limited to specific keystroke functions, but controlled by some form of general purpose data processing language.	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
+\N	Category	7435	FSC	0	Office Information System Equipment	Office Information System Equipment	 Includes Minicomputer and microcomputer controlled systems specifically designed for user programmable processing of the office information application; Connected peripheral equipment; Automatic repetitive typewriters; Text editing typewriters and video display text editing typewriters. Excludes General purpose ADPE which is designed primarily to be applied through the internal execution of a series of instructions, not limited to specific keystroke functions, but controlled by a general purpose data processing language, to process a variety of applications such as financial management, logistics, scientific, communications, and the like.	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
+\N	Category	7450	FSC	0	Office Type Sound Recording and Reproducing Machines	Office Type Sound Recording and Reproducing Machines	 Includes Dictating Machines; Transcribing Machines; Combination Dictating and Transcribing Machines. Excludes Communication Type Sound Recording and Reproducing Machines.	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
+\N	Category	7460	FSC	0	Visible Record Equipment	Visible Record Equipment	 Includes Manually operated and power operated visible record equipment; visible index files, rotary and stationary; specially designed components, such as Wire and Bar Pockets, Cover Plates, Stop Wires, and Channel Stops; Control Boards; Binder Racks; devices and systems designed to automatically store and retrieve hard copy documents. For those microform automatic retrieval systems that contain an integral viewer or view/printer, see Class 6730. 	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
+\N	Category	7490	FSC	0	Miscellaneous Office Machines	Miscellaneous Office Machines	 Includes Addressing Machines; Check Handling Machines; Coin Counting Machines; Mailing Machines, Currency Handling Machines. Excludes Pencil Sharpeners; Staplers, Office Type; Duplicating Equipment.	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
+\N	Category	7510	FSC	0	Office Supplies	Office Supplies	 Includes Crayons; Erasers; File Holders; Writing Ink; Printing Ink; Paper Fasteners; Pencils; Penholders and Pen Points; Rulers, Office Type; Art Supplies; Tape, Pressure Sensitive Adhesive. Excludes Office Devices; Fountain Pens; Artists' Brushes; Paper Stationery; Record Forms; Mechanical Pencils.	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
+\N	Category	7520	FSC	0	Office Devices and Accessories	Office Devices and Accessories	 Includes Copyholders; Fountain Pens and Pen Desk Sets; Pencil Sharpeners; Paper Punches; Staplers, Office Type; Artists' Accessories, such as Easels, Airbrushes; Slide Rules. 	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
+\N	Category	7530	FSC	0	Stationery and Record Forms	Stationery and Record Forms	 Includes Business Forms; Record Books; Surveyors' Computation Forms; Electric Accounting Machine (EAM) Cards; Forms approved for use within individual government activities. Excludes Standard forms approved for government-wide use.	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
+\N	Category	7540	FSC	0	Standard Forms	Standard Forms	 Includes Only those standard forms approved for government-wide use by the government activities empowered to do so (such as the U.S. Bureau of the Budget and the U.S. General Accounting Office, and similar organizations in other NATO countries). Excludes Forms approved for use within individual government activities.	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
+\N	Category	7610	FSC	0	Books and Pamphlets	Books and Pamphlets	 Includes Technical and Nontechnical Books and Pamphlets; Regulations; Instruction Manuals; Technical Orders. Excludes Sheet and Book Music; Periodicals; Bibles.	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
+\N	Category	7630	FSC	0	Newspapers and Periodicals	Newspapers and Periodicals	  	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
+\N	Category	7640	FSC	0	Maps, Atlases, Charts, and Globes	Maps, Atlases, Charts, and Globes	  Excludes Training Aid Maps	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
+\N	Category	7641	FSC	0	Aeronautical Maps, Charts and Geodetic Products	Aeronautical Maps, Charts and Geodetic Products	  	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
+\N	Category	7642	FSC	0	Hydrographic Maps, Charts and Geodetic Products	Hydrographic Maps, Charts and Geodetic Products	  	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
+\N	Category	7643	FSC	0	Topographic Maps, Charts and Geodetic Products	Topographic Maps, Charts and Geodetic Products	  	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
+\N	Category	7644	FSC	0	Digital Maps, Charts and Geodetic Products	Digital Maps, Charts and Geodetic Products	  	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
+\N	Category	7650	FSC	0	Drawings and Specifications	Drawings and Specifications	 Includes Federal, Military, and Departmental Specifications. 	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
+\N	Category	7660	FSC	0	Sheet and Book Music	Sheet and Book Music	  Excludes Hymnbooks.	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
+\N	Category	7670	FSC	0	Microfilm, Processed	Microfilm, Processed	  	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
+\N	Category	7690	FSC	0	Miscellaneous Printed Matter	Miscellaneous Printed Matter	 Includes Decals; Printed Posters; Printed Labels. Excludes Sheet and Book Music.	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
+\N	Category	7710	FSC	0	Musical Instruments	Musical Instruments	Note-This class includes only complete musical instruments. Assemblies, parts, attachments, or accessories for use in or on musical instruments are classified in classes other than this class.  Excludes Phonographs; Radios; Television Sets.	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
+\N	Category	7720	FSC	0	Musical Instrument Parts and Accessories	Musical Instrument Parts and Accessories	 Includes Instrument Cases; Music Stands; Tuning Forks. 	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
+\N	Category	7730	FSC	0	Phonographs, Radios, and Television Sets: Home Type	Phonographs, Radios, and Television Sets: Home Type	Note-This class includes only complete home-type phonographs, complete home-type radios, and complete home-type television sets. End items, assemblies, parts, attachments, or accessories for use in or on the above are classified in classes other than this class. Includes Combination Sets. Excludes Coin Operated Phonographs; Wire and Tape Recorders.	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
+\N	Category	7740	FSC	0	Phonograph Records	Phonograph Records	  Excludes Training Aid Records.	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
+\N	Category	7810	FSC	0	Athletic and Sporting Equipment	Athletic and Sporting Equipment	 Includes Baseball Equipment; Basketballs; Boxing Gloves; Fencing Masks; Fishing Tackle, except Commercial; Handballs; Shin Guards, Hockey. Excludes Athletic and Sports Clothing.	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
+\N	Category	7820	FSC	0	Games, Toys, and Wheeled Goods	Games, Toys, and Wheeled Goods	 Includes Baby Carriages; Checkers; Doll Carriages; Dolls; Playing Cards; Velocipedes; Handicraft Kits, not elsewhere classifiable. 	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
+\N	Category	7830	FSC	0	Recreational and Gymnastic Equipment	Recreational and Gymnastic Equipment	 Includes Slides; Swings; Amusement Park and Shooting Gallery Equipment; Play Yard and Playground Equipment; Billiard and Pool Tables and Equipment; Gymnasium Equipment. 	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
+\N	Category	7910	FSC	0	Floor Polishers and Vacuum Cleaning Equipment	Floor Polishers and Vacuum Cleaning Equipment	 Includes Domestic and Industrial Vacuum Cleaning Equipment; Carpet Sweepers. Excludes Self-propelled and Trailer Mounted Vacuum Cleaners.	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
+\N	Category	7920	FSC	0	Brooms, Brushes, Mops, and Sponges	Brooms, Brushes, Mops, and Sponges	 Includes Squeegees; Whisk Brooms. Excludes Hair Brushes; Toothbrushes; Paint and Artists' Brushes.	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
+\N	Category	7930	FSC	0	Cleaning and Polishing Compounds and Preparations	Cleaning and Polishing Compounds and Preparations	 Includes Scouring Powders; Washing Compounds; Detergents; Nontoilet Soaps; Automobile and Household Polishes and Waxes. Excludes Shaving Soap; Toilet Soap; Abrasive Polishing Compounds; Metal Finishing Abrasives; Surgical Detergents.	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
+\N	Category	8010	FSC	0	Paints, Dopes, Varnishes, and Related Products	Paints, Dopes, Varnishes, and Related Products	 Includes Water Paints; Oil Paints and Latex; Driers; Paint Primers; Lacquers; Paint Sealers; Pigments for Coloring; Stains; Turpentine; Paint Removers. Excludes Acetone, Wood and Wall Fillers.	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
+\N	Category	8020	FSC	0	Paint and Artists' Brushes	Paint and Artists' Brushes	  Excludes Airbrushes.	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
+\N	Category	8030	FSC	0	Preservative and Sealing Compounds	Preservative and Sealing Compounds	 Includes Fire Resistant Compounds; Water Resistant Compounds; Weather Resistant Compounds; Belt Dressing; Antiseize Compounds; Calking and Glazing Compounds; Putties; Wood and Metal Fillers. Excludes Food Preservative Compounds.	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
+\N	Category	8040	FSC	0	Adhesives	Adhesives	 Includes Glue; Mucilage; Sizes; Adhesive Cements. 	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
+\N	Category	8105	FSC	0	Bags and Sacks	Bags and Sacks	 Includes Shipping and Protective Envelopes; Liners for Bags and Sacks; Textile and Paper Laminated Shipping Bags; Closures for Bags and Sacks. 	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
+\N	Category	8110	FSC	0	Drums and Cans	Drums and Cans	 Includes Barrels; Kegs; Shipping and Storage Pails; Collapsible Tubes; Mailing and Filing Tubes; Closures for Drums and Cans. 	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
+\N	Category	8115	FSC	0	Boxes, Cartons, and Crates	Boxes, Cartons, and Crates	 Includes Shoe Boxes; Beer Cases; Pill Boxes; Piano Cases; Engine Boxes; Bombsight Boxes. Excludes Special boxes, packages, and containers designed primarily for shipping, storage, and handling of ammunition, nuclear ordnance, explosives, guided missiles, military chemical agents; and repairable/reusable containers specially designed for specialized equipment such as the "Shipping and Storage Container" for components of aircraft, space vehicles, automotive vehicles, ships, ground communication equipment.	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
+\N	Category	8120	FSC	0	Commercial and Industrial Gas Cylinders	Commercial and Industrial Gas Cylinders	Note-This class includes empty commercial and industrial gas cylinders and their caps, valves, and valve spare parts.  Excludes Filled gas cylinders and items related to gaseous and liquefied gaseous dispensing systems, both mobile and installed. All components of installed gas dispensing systems are classified by "application" or "function" with the end equipment for which designed.	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
+\N	Category	8125	FSC	0	Bottles and Jars	Bottles and Jars	 Includes Shipping Jugs and Carboys; Ampoules. 	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
+\N	Category	8130	FSC	0	Reels and Spools	Reels and Spools	  	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
+\N	Category	8135	FSC	0	Packaging and Packing Bulk Materials	Packaging and Packing Bulk Materials	 Includes Wrapping Paper; Moisture Vapor Barrier Paper; Excelsior; Wadding for Packing; Corrugated Paper; Baling Bands, Baling Ties; Shipping Tags; Gummed Paper Tape; Separators; Box Liners; Packaging Staples; Baling Wire; Preformed Cushioning Inserts. Excludes Adhesives; Aluminum Foil other than for food handling and processing.	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
+\N	Category	8140	FSC	0	Ammunition and Nuclear Ordnance Boxes, Packages and Special Containers	Ammunition and Nuclear Ordnance Boxes, Packages and Special Containers	Note-This class includes only containers and fittings which are specifically designed for the storage, handling, and shipping of ammunition, explosives, and military chemical agents. Includes All shipping and storage containers specially designed for guided missiles, major missile sections, missile warheads, and other guided missile components. Excludes General Purpose Containers, Shipping and storage reusable/repairable containers specially designed for components of aircraft, space vehicles, automotive vehicles, ships, and ground communication equipment.	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
+\N	Category	8145	FSC	0	Specialized Shipping and Storage Containers	Specialized Shipping and Storage Containers	Note-This class includes only reusable and repairable containers specially designed for shipping and storage of specialized equipment; i.e., shipping and storage containers for components of aircraft, space vehicles, automotive vehicles, ships, ground communication equipment, etc. Includes Specially designed components (not elsewhere classifiable) peculiar to special shipping and storage containers as delimited under this class. Excludes General purpose containers; specially designed containers for ammunition, nuclear ordnance, explosives, military chemical agents and guided missile components. Excluded from this class are items for which more specific classifications are suitable. The FSC Indexes and Structure will govern the classification of those items permitted classification in a single class only.	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
+\N	Category	8305	FSC	0	Textile Fabrics	Textile Fabrics	Note-This class includes only textiles in bulk. Excluded from this class are items that are precut or preformed, thus limiting their usefulness to specific applications. Such items are classified in the same class as the item or items for which designed, or in such other class as is appropriate. Includes Canvas Materials; Plastic Fabrics; Felt Materials; Netting, Plastic and Textile; Oilcloth; Textile Scrap. Excludes Carpeting.	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
+\N	Category	8310	FSC	0	Yarn and Thread	Yarn and Thread	  	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
+\N	Category	8315	FSC	0	Notions and Apparel Findings	Notions and Apparel Findings	 Includes Buttons; Dressmakers' Pins; Needles; Shoulder Pads; Embroideries; Stamped Art Goods for Embroidery and Art Needlework; Hair Nets; Sewing Kits. Excludes Yarn; Thread; General Purpose Buckles.	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
+\N	Category	8320	FSC	0	Padding and Stuffing Materials	Padding and Stuffing Materials	 Includes Feathers and Downs, Processed; Spanish Moss, Processed; Cotton Wadding and Batting; Kapok. Excludes Feathers and Downs, Unprocessed.	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
+\N	Category	8325	FSC	0	Fur Materials	Fur Materials	Note-This class includes only fur materials in bulk. Excluded from this class are items that are precut or preformed, thus limiting their usefulness to specific applications. Such items are classified in the same class as the item or items for which designed, or in such other class as is appropriate. Includes Crosses; Sacs; Fur Plates; Fur Mats. 	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
+\N	Category	8330	FSC	0	Leather	Leather	 Includes Garment Leather; Patent Leather; Glove Leather; Shoe Leather; Upholstery Leather; Industrial Leather. Excludes Belting; Shoe Findings.	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
+\N	Category	8335	FSC	0	Shoe Findings and Soling Materials	Shoe Findings and Soling Materials	 Includes Counters; Taps; Shoe Laces; Lasts and Last Sole Patterns; Ornamental Shoe Buckles and Bows. 	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
+\N	Category	8340	FSC	0	Tents and Tarpaulins	Tents and Tarpaulins	Note-Fitted covers which are specifically designed for use on or with specific individual types of equipment are excluded from this class and are to be classified in the same classes as the items for which they are designed, or in such other classes as are appropriate. Includes Tent Pins; Tent Poles; Multiple purpose covers of woven or unwoven fabrics, not for permanent installation. 	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
+\N	Category	8345	FSC	0	Flags and Pennants	Flags and Pennants	 Includes Signalling Flags; Flagstaffs; Signal Shapes; Flagpoles; Flagstaff Trucks; Speed Cones; Flagstaff Belts; Semaphore Flags. 	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
+\N	Category	8405	FSC	0	Outerwear, Men's	Outerwear, Men's	 Includes Uniforms, Military and Nonmilitary; Civilian Outerwear; Headwear; Work Clothing (Ordinary Nonsafety); Shirts; Trousers; Coats. Excludes Items included in other classes such as Special Purpose Clothing; Helmets, Steel and Plastic; Safety Clothing; Handwear; Footwear.	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
+\N	Category	8410	FSC	0	Outerwear, Women's	Outerwear, Women's	 Includes Uniforms, Military and Nonmilitary; Civilian Outerwear; Headwear; Work Clothing (Ordinary Nonsafety); Shirts; Skirts; Blouses. Excludes Items included in other classes such as Special Purpose Clothing; Helmets, Steel and Plastic; Safety Clothing; Handwear; Footwear.	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
+\N	Category	8415	FSC	0	Clothing, Special Purpose	Clothing, Special Purpose	Note-This class includes conventional winter, summer, and intermediate flight clothing ensembles and their components. Excluded from this class are specialized antiexposure, antigravity, partial pressure, and full pressure, flight ensembles and their specialized components. Includes Special Purpose Headwear, including Helmets, except Ballistic Protective; Safety and Protective Clothing; Athletic Clothing; Safety, Combat, Protective, and Work Gloves; Submarine Deck Exposure Clothing; Flight Clothing Components designed for use with both Specialized and Conventional Ensembles. Excludes Sporting and Athletic Gloves; Athletic Footwear; Safety Footwear; Personal Armor; Special Hospital and Surgical Clothing. Excludes special purpose clothing wherein the primary purpose is ballistic resistant protection. This class will include common use components of both ballistic and conventional end items.	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
+\N	Category	8420	FSC	0	Underwear and Nightwear, Men's	Underwear and Nightwear, Men's	  	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
+\N	Category	8425	FSC	0	Underwear and Nightwear, Women's	Underwear and Nightwear, Women's	 Includes Corsets; Girdles. 	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
+\N	Category	8430	FSC	0	Footwear, Men's	Footwear, Men's	 Includes Rubber Footwear; Athletic Footwear; Safety Footwear; Submarine Deck Exposure Footwear. 	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
+\N	Category	8435	FSC	0	Footwear, Women's	Footwear, Women's	 Includes Rubber Footwear; Athletic Footwear; Safety Footwear. 	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
+\N	Category	8440	FSC	0	Hoisery, Handwear, and Clothing Accessories, Men's	Hoisery, Handwear, and Clothing Accessories, Men's	 Includes Handkerchiefs; Suspenders; Garters; Belts; Dress Handwear; Leggings, Nonsafety Type. 	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
+\N	Category	8445	FSC	0	Hoisery, Handwear, and Clothing Accessories, Women's	Hoisery, Handwear, and Clothing Accessories, Women's	 Includes Handkerchiefs; Garters; Belts; Neckerchiefs; Handbags; Dress Handwear; Leggings, Nonsafety Type. 	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
+\N	Category	8450	FSC	0	Children's and Infants' Apparel and Accessories	Children's and Infants' Apparel and Accessories	 Includes Footwear; Outerwear; Headwear; Handwear; Underwear; Nightwear. 	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
+\N	Category	8455	FSC	0	Badges and Insignia	Badges and Insignia	Note-This class includes only items worn or carried on the person.  Excludes Nonpersonal Insignia.	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
+\N	Category	8460	FSC	0	Luggage	Luggage	 Includes Foot Lockers; Brief Cases; Trunks; Suitcases. Excludes Duffel Bags; Musette Bags	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
+\N	Category	8465	FSC	0	Individual Equipment	Individual Equipment	 Includes Musette Bags; Duffel Bags; Ammunition Belts; Pistol Belts; Handcuffs; Packboards; Sleeping Bags; Knapsacks; Hikers' Packs; Sunglasses; Skis; Snowshoes; Swords with Scabbards. Excludes Toilet Articles; Mess Gear; Fabric Utility Containers.	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
+\N	Category	8470	FSC	0	Armor, Personal	Armor, Personal	 Includes Clothing specially designed for use as personal armor. Excludes All specialized flight clothing and accessories which may contain ballistic resistant properties as a secondary function. Excludes special purpose clothing wherein the primary function is for purposes other than ballistic protection	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
+\N	Category	8475	FSC	0	Specialized Flight Clothing and Accessories	Specialized Flight Clothing and Accessories	 Includes Specialized Antiexposure, Antigravity, Partial Pressure, and Full Pressure Ensembles, and Specialized Components therefor, including Unpressurized Protective Helmets, Eye Protective Devices, and items with Sound Attenuating Features. Excludes Conventional Winter, Summer, and Intermediate Flight Clothing Ensembles, and Components therefor; Components designed for use with both Specialized and Conventional Flight Clothing Ensembles.	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
+\N	Category	8510	FSC	0	Perfumes, Toilet Preparations, and Powders	Perfumes, Toilet Preparations, and Powders	 Includes Colognes; Cosmetics; Deodorants; Depilatories; Toilet Waters. 	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
+\N	Category	8520	FSC	0	Toilet Soap, Shaving Preparations, and Dentifrices	Toilet Soap, Shaving Preparations, and Dentifrices	 Includes Toothpaste; Shaving Soap. Excludes Medicated Soaps.	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
+\N	Category	8530	FSC	0	Personal Toiletry Articles	Personal Toiletry Articles	 Includes Hair Brushes; Nail Brushes; Nail Files; Toothbrushes; Manicure and Pedicure Implements; Razors and Blades. Excludes Dental Floss.	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
+\N	Category	8540	FSC	0	Toiletry Paper Products	Toiletry Paper Products	 Includes Facial Tissues; Paper Toilet Seat Covers; Toilet Paper; Paper Napkins; Doilies. Excludes Towel Dispensers; Paper Plates and Cups.	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
+\N	Category	8710	FSC	0	Forage and Feed	Forage and Feed	 Includes Hay; Manufactured Feed; Straw; Zoological Animal Food. 	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
+\N	Category	8720	FSC	0	Fertilizers	Fertilizers	 Includes Natural and Synthetic Fertilizers; Peat Moss; Animal Manures. 	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
+\N	Category	8730	FSC	0	Seeds and Nursery Stock	Seeds and Nursery Stock	 Includes Cut Flowers. 	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
+\N	Category	8810	FSC	0	Live Animals, Raised for Food	Live Animals, Raised for Food	  	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
+\N	Category	8820	FSC	0	Live Animals, Not Raised for Food	Live Animals, Not Raised for Food	  	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
+\N	Category	8905	FSC	0	Meat, Poultry, and Fish	Meat, Poultry, and Fish	 Includes Game Birds; Shellfish; Sausage Casings. 	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
+\N	Category	8910	FSC	0	Dairy Foods and Eggs	Dairy Foods and Eggs	 Includes Ice Cream; Frozen Custards; Ice Cream Mixes; Rennet; Milk Sherbets; Ices. 	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
+\N	Category	8915	FSC	0	Fruits and Vegetables	Fruits and Vegetables	 Includes Baked Beans; Juices. 	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
+\N	Category	8920	FSC	0	Bakery and Cereal Products	Bakery and Cereal Products	 Includes Flour; Prepared Flour; Prepared Cereals; Macaroni. 	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
+\N	Category	8925	FSC	0	Sugar, Confectionery, and Nuts	Sugar, Confectionery, and Nuts	 Includes Candy; Chewing Gum; Honey; Maple Syrup. 	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
+\N	Category	8930	FSC	0	Jams, Jellies, and Preserves	Jams, Jellies, and Preserves	  	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
+\N	Category	8935	FSC	0	Soups and Bouillons	Soups and Bouillons	  	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
+\N	Category	8940	FSC	0	Special Dietary Foods and Food Specialty Preparations	Special Dietary Foods and Food Specialty Preparations	 Includes Infant Foods; Potato Chips; Prepared Pie and Cake Fillings. 	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
+\N	Category	8945	FSC	0	Food, Oils and Fats	Food, Oils and Fats	  	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
+\N	Category	8950	FSC	0	Condiments and Related Products	Condiments and Related Products	 Includes Salad Dressings; Spices; Seasonings; Flavoring Extracts; Yeast; Olives. 	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
+\N	Category	8955	FSC	0	Coffee, Tea, and Cocoa	Coffee, Tea, and Cocoa	 Includes Postum; Yerba Mate; Chicory. 	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
+\N	Category	8960	FSC	0	Beverages, Nonalcoholic	Beverages, Nonalcoholic	 Includes Soft Drinks; Ice. 	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
+\N	Category	8965	FSC	0	Beverages, Alcoholic	Beverages, Alcoholic	 Includes Beer; Whisky; Wine; Liqueur. Excludes Sacramental Wine and Medicinal grade Brandy, Whisky, and Wine.	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
+\N	Category	8970	FSC	0	Composite Food Packages	Composite Food Packages	 Includes Ration Packs and Emergency Rations; Care Packages. 	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
+\N	Category	8975	FSC	0	Tobacco Products	Tobacco Products	 Includes Snuff; Cigarettes; Cigars. 	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
+\N	Category	9110	FSC	0	Fuels, Solid	Fuels, Solid	 Includes Ration Heating Tablets; Cordwood; Charcoal; Briquettes; Coke. Excludes Peat.	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
+\N	Category	9130	FSC	0	Liquid Propellants and Fuels, Petroleum Base	Liquid Propellants and Fuels, Petroleum Base	Note-This class includes liquid propellants with more than 50 percent or higher petroleum content. Includes All Aviation Gasoline; JP-1, 3, 4, and 5 Jet Fuel; Combat Vehicle and Automotive Gasoline (all types and grades); Liquid Propellants, Bulk; Liquid Propellants, predetermined to specific quantity and quality, packaged in reusable containers. Excludes Solid Propellants; Liquid Propellants, encased in consumable containers, for insertion into missile propulsion systems as integral parts.	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
+\N	Category	9135	FSC	0	Liquid Propellant Fuels and Oxidizers, Chemical Base	Liquid Propellant Fuels and Oxidizers, Chemical Base	Note-This class includes liquid propellants with more than 50 percent or higher chemical content. Includes Liquid chemicals designed exclusively for use as propellant fuels and oxidizers; Liquid Propellants, Bulk; Liquid Propellants, predetermined to specific quantity and quality, packaged in reusable containers. Excludes Multiple-use chemicals, such as Nitrogen, Technical; Ammonia, Technical; Furfuryl Alcohol, Technical; Aniline, Technical; Solid Propellants; Liquid Propellants, encased in consumable containers, for insertion into missile propulsion systems as integral parts.	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
+\N	Category	9140	FSC	0	Fuel Oils	Fuel Oils	 Includes Light Burner Fuels; Diesel Fuels; Kerosine; Military Specification Type Residuals; Special and Heavy Grade Turbine Vessel Propulsion Fuels; Federal Specification Heavy Burner Fuels; Bunker "C" Commercial Grade Fuel; Heavy Fuel and other Black (Boiler Type) Fuels; Illuminating Oils. 	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
+\N	Category	9150	FSC	0	Oils and Greases: Cutting, Lubricating, and Hydraulic	Oils and Greases: Cutting, Lubricating, and Hydraulic	 Includes Petrolatum, except USP. Excludes Rust Preventive Compounds; Antiseizing Compounds; Petrolatum, USP.	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
+\N	Category	9160	FSC	0	Miscellaneous Waxes, Oils, and Fats	Miscellaneous Waxes, Oils, and Fats	 Includes Animal, Vegetable, and Petroleum Waxes; Wool Grease (Lanolin); Tallow; Marine Oils; Coconut Oil; Soap Stock; Essential Oils, except USP or NF grades. Excludes Edible Fats and Oils; Household and Automobile Waxes.	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
+\N	Category	9310	FSC	0	Paper and Paperboard	Paper and Paperboard	 Includes Book Paper Stock; Newsprint; Paperboard; Bulk Paper Materials. Excludes Corrugated Paper; Wrapping Paper; Building Board; Insulating Board; Stationery; Construction Paper; Paper Towels; Facial Tissues; Blank Books; Containers; Shipping and Identification Tags.	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
+\N	Category	9320	FSC	0	Rubber Fabricated Materials	Rubber Fabricated Materials	 Includes Natural and Synthetic Rubber Fabricated Materials, such as Rubber Sheets, Structural Rubber Shapes, Strips. 	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
+\N	Category	9330	FSC	0	Plastics Fabricated Materials	Plastics Fabricated Materials	 Includes Cellulose Acetate and other plastics; Bars, Rods, Sheets, and Strips. Excludes Cable, Fiber Optic.	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
+\N	Category	9340	FSC	0	Glass Fabricated Materials	Glass Fabricated Materials	 Includes Glass Rods, Bars, and Tubing; Optical Glass Blanks; Structural and Building Glass; Glass Blocks. Excludes Insulators (FSC 5970); Ophthalmic Glass Blanks (FSC 6540); and Cable, Fiber Optics (FSCs 6015 and 6615).	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
+\N	Category	9350	FSC	0	Refractories and Fire Surfacing Materials	Refractories and Fire Surfacing Materials	  	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
+\N	Category	9390	FSC	0	Miscellaneous Fabricated Nonmetallic Materials	Miscellaneous Fabricated Nonmetallic Materials	 Includes Cork Fabricated Basic Materials; Asbestos Fabricated Materials; Manufactured Mica; Minerals for scientific and technical use (cut but not mounted); Pottery Supplies; Catgut and Wormgut; Vegetable Brush Fibers; Bagasse. 	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
+\N	Category	9410	FSC	0	Crude Grades of Plant Materials	Crude Grades of Plant Materials	 Includes Flavoring Materials; Crude Drugs of Plant-Origin; Crude Materials for Perfume; Tobacco, Unmanufactured. 	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
+\N	Category	9420	FSC	0	Fibers:  Vegetable, Animal, and Synthetic	Fibers:  Vegetable, Animal, and Synthetic	 Includes Cotton, Wool, Silk, Horsehair, Rayon, and Nylon Fibers. 	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
+\N	Category	9430	FSC	0	Miscellaneous Crude Animal Products, Inedible	Miscellaneous Crude Animal Products, Inedible	 Includes Feathers and Downs, Unprocessed; Ivory; Bristles; Hides and Fur Skins, Crude. 	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
+\N	Category	9440	FSC	0	Miscellaneous Crude Agricultural and Forestry Products	Miscellaneous Crude Agricultural and Forestry Products	 Includes Cereal Grains; Sugar Crops; Crude Rubber. 	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
+\N	Category	9450	FSC	0	Nonmetallic Scrap, Except Textile	Nonmetallic Scrap, Except Textile	  	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
+\N	Category	9505	FSC	0	Wire, Nonelectrical	Wire, Nonelectrical	Note- This class contains bulk material only. Specially designed items should be placed in a more appropriate class. Wire is a thin, flexible, continuous length of metal, usually of circular cross-section. Includes Bulk Nonelectrical Wire Excludes Wire having electrical resistivity or conductivity rating (FSC 6145).	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
+\N	Category	9510	FSC	0	Bars and Rods	Bars and Rods	Note This class contains bulk material only. Specially designed items should be placed in a more appropriae class. a. Bars are elongated pieces of metal of simple uniform cross-sections usually rectangular, circular, or hexagonal produced by forging or hot-rolling, also known as barstock. b. Rods are thin round metal bar, differentiated by dimensional parameters, listed in the item name definition. Includes Metal Bars and Rods Excludes Muck Bar (FSC 9640); Rods for Wire (FSC 9640); Sheet Bar (FSC 9640); Threaded Rods (FSC 5306); Grooved Rod (FSC 5340).	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
+\N	Category	9515	FSC	0	Plate, Sheet, Strip, Foil, and Leaf	Plate, Sheet, Strip, Foil, and Leaf	Note-This class contains bulk material only. Specially designed items should be placed in a more appropriate class. The items covered by this class are all similar in that they are flat, generally rolled metal, the difference is covered by dsimensional parameters in the item name definition. Includes Armor Plate; Black Plate; Floor Plate; Leaf; Perforated Sheet and Strip; Shim Stock. Excludes Bale Ties (FSC 8135); Baling Bands (FSC 8135); Mending Plates (FSC 5340); Mounting Plates (FSC 5340); T Plates (FSC 5340).	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
+\N	Category	9520	FSC	0	Structural Shapes	Structural Shapes	Note-This class contains bulk material only. Specially designed items should be placed in a more appropriate class. This class includes items usually used in building, bridge and similar construction, such as, I beams, angles, and the like. Includes Bar Size Shapes (under 3 inches); Metal Piles and Piling; Angles; Channels; Tees; Zees. Excludes Plate, Sheet and Strip Materials (FSC 9515).	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
+\N	Category	9525	FSC	0	Wire, Nonelectrical, Nonferrous Base Metal	Wire, Nonelectrical, Nonferrous Base Metal	  Excludes Wire having electrical resistivity or conductivity rating.	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
+\N	Category	9530	FSC	0	Bars and Rods, Nonferrous Base Metal	Bars and Rods, Nonferrous Base Metal	  	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
+\N	Category	9535	FSC	0	Plate, Sheet, Strip, and Foil; Nonferrous Base Metal	Plate, Sheet, Strip, and Foil; Nonferrous Base Metal	 Includes Leaf; Perforated Sheet and Strips. 	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
+\N	Category	9540	FSC	0	Structural Shapes, Nonferrous Base Metal	Structural Shapes, Nonferrous Base Metal	 Includes Angles; Channels; Tees; Zees. 	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
+\N	Category	9545	FSC	0	Plate, Sheet, Strip, Foil, and Wire: Precious Metal	Plate, Sheet, Strip, Foil, and Wire: Precious Metal	 Includes Bars; Leaf; Ribbon; Rods; Tubing. Excludes Precious Metals for dental use.	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
+\N	Category	9610	FSC	0	Ores	Ores	Note-Only bulk material will be identified in this class. Ores are a naturally occurring material from which economically valuable minerals can be obtained. Includes Bauxite; Ferrous Ores; Lead Ores; Precious Metal Ores; Radioactive Metal Ores; Zinc Ores. 	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
+\N	Category	9620	FSC	0	Minerals, Natural and Synthetic	Minerals, Natural and Synthetic	Note-Only bulk material will be identified in this class. Minerals are naturally occurring substances with a characteristic chemical composition that can be expressed by a formula. Includes Clays and other Earths; Mica; Asbestos; Crude Petroleum; Graphite. Excludes Gravel (FSC 5610); Sand (FSC 5610); Abrasives (FSC 5350); Refractory Clays (FSC 9350).	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
+\N	Category	9630	FSC	0	Additive Metal Materials	Additive Metal Materials	Note-Only bulk material will be identified in this class. Additive metal materials are those which are added to metals to improve their characteristics as required (e.g., lead added to steel to improve the machinability). Includes Alloying Additives (Aluminum, Antimony, Copper, and Others). Excludes Fuel Inhibiting Additives (FSC 6850).	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
+\N	Category	9640	FSC	0	Iron and Steel Primary and Semifinished Products	Iron and Steel Primary and Semifinished Products	Note-Only bulk material will be identified in this class. a. Primary products are raw unfinished ingots, pigs, that require refinement to be usable. b. Semi-finished items are primary products that have been refined to a state that requires further manufacturing processes to its final, usable state. Includes Ingots; Pigs; Billets; Blooms; Muck Bar; Rods for Wire; Sheet Bar; Skelp; Tube Rounds. 	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
+\N	Category	9650	FSC	0	Nonferrous Base Metal Refinery and Intermediate Forms	Nonferrous Base Metal Refinery and Intermediate Forms	Note-Only Bulk material will be identified in this class. a. Refinery Forms are raw unfinished ingots, pigs, that require refinement to be usable. b. Intermediate forms are primary products that have been refined to a state that requires further manufacturing processes to its final, usable state. Includes Ingots; Slabs. 	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
+\N	Category	9660	FSC	0	Precious Metals Primary Forms	Precious Metals Primary Forms	Note-Only bulk material will be identified in this class. Primary Forms are raw unfinished ingots, pigs, that require refinement to be usable and are made of precious metals. Includes Bullion; Ingot. 	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
+\N	Category	9670	FSC	0	Iron and Steel Scrap	Iron and Steel Scrap	  	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
+\N	Category	9680	FSC	0	Nonferrous Scrap	Nonferrous Scrap	  	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
+\N	Category	9905	FSC	0	Signs, Advertising Displays, and Identification Plates	Signs, Advertising Displays, and Identification Plates	 Includes Electric Signs; Sign Boards; Display Stands; Mannequins and other display forms; Printed Signs; General Purpose Identification Tags and Blanks, Nonpersonal; Plates and Tags for specific applications. 	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
+\N	Category	9910	FSC	0	Jewelry	Jewelry	 Includes Jewelers' Findings; Precious Stones, Cut; Costume Jewelry; Natural Gems and Ornamental Stones, Cut. Excludes Watches; Clocks; Tableware; Scientific Instruments; Toilet Articles; Smokers' Articles; Industrial Diamonds.	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
+\N	Category	9915	FSC	0	Collectors' and/or Historical Items	Collectors' and/or Historical Items	 Includes Antiques; Artifacts; Coins; Stamps; Rare Books; Works of Art, Collectors and/or Historical Gems; Jewelry, and Cut Precious Stones; Natural History Items. 	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
+\N	Category	9920	FSC	0	Smokers' Articles and Matches	Smokers' Articles and Matches	 Includes Cigarette Lighters; Lighter Fluid; Pipe Reamers; Ash Trays; Tobacco Humidors; Packaged Cigarette Paper. Excludes Ash receivers and lighters specifically designed for installation in or on equipment.	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
+\N	Category	9925	FSC	0	Ecclesiastical Equipment, Furnishings, and Supplies	Ecclesiastical Equipment, Furnishings, and Supplies	 Includes Vestments; Altars; Communion Sets; Ecclesiastical Candelabra; Chalices; Patens; Altar Cloths; Ecclesiastical Statuary; Sacramental Wine. 	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
+\N	Category	9930	FSC	0	Memorials; Cemeterial and Mortuary Equipment and Supplies	Memorials; Cemeterial and Mortuary Equipment and Supplies	 Includes Grave Markers; Burial Vaults; Burial Urns; Caskets; Burial Boxes; Morticians' Supplies; Monuments; Gasket Shipping Cases. Excludes Hearses; Mortuary Refrigerators.	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332
+\N	Category	9999	FSC	0	Miscellaneous Items	Miscellaneous Items	 Includes only those items which cannot conceivably be classified in any existing classes 	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	admin	PGER	2003-07-23 02:08:52.069332	admin	PGER	2003-07-23 02:08:52.069332

From bmuir at ned.gsfc.nasa.gov  Thu Oct 16 15:10:07 2003
From: bmuir at ned.gsfc.nasa.gov (bmuir CVS)
Date: Thu Oct 16 14:10:08 2003
Subject: [Pangalactic-commits] removed baseobjecttest and integrated it into
	test_pgefobject
Message-ID: <200310161810.h9GIA7Xs032068@ned.gsfc.nasa.gov>

Modified files:
PanGalactic/pangalactic/client/tests/test_pgefobject.py 1.5 1.6
PanGalactic/pangalactic/client/tests/baseobjecttest.py 1.9 None

Log message:
removed baseobjecttest and integrated it into test_pgefobject


Index: PanGalactic/pangalactic/client/tests/test_pgefobject.py
diff -u PanGalactic/pangalactic/client/tests/test_pgefobject.py:1.5 PanGalactic/pangalactic/client/tests/test_pgefobject.py:1.6
--- PanGalactic/pangalactic/client/tests/test_pgefobject.py:1.5	Thu Oct 16 13:22:19 2003
+++ PanGalactic/pangalactic/client/tests/test_pgefobject.py	Thu Oct 16 14:10:05 2003
@@ -1,16 +1,74 @@
 import unittest
-
+from pangalactic.utils import pgefexceptions
 from pangalactic.enterprise import pgefobject
-import baseobjecttest
+#import baseobjecttest
 
 
-class PGEFObjectTestCase(baseobjecttest.BaseObjectTests):  
+class PGEFObjectTestCase(unittest.TestCase):  
     def setUp(self):
-            self.obj1 = pgefobject.PgefObject()
-            self.obj2 = pgefobject.PgefObject()
+        self.obj1 = pgefobject.PgefObject()
+        self.obj2 = pgefobject.PgefObject()
+            
+    def tearDown(self):
+        del self.obj1
+        del self.obj2
+        
     def Title(self):
         print '\nPGEFobject suite'
+        
+    def testDefaultObjectValues(self):
+        """Check to see if the object is created with the correct default values"""
+        #print self.obj1.pgef_oid
+        #assert self.obj1.pgef_oid == None , 'incorrect initial value for oid'
+        assert self.obj1.state == '', 'Status not empty'
+        assert self.obj1.owner == '', 'incorrect initial value for Point of Contact'
+        assert self.obj1.creator == '', 'Incorrect initial value for Creator'
+    
+    def testIsEqual(self):
+        """Check to see that the IsEqual method functions properly"""
+        self.obj1.popTestData()
+        self.obj2.popTestData()
+        assert self.obj1.IsEqual(self.obj2), 'Object1 and object2 are not equal'
+        
+    def testIsEmpty(self):
+        """Check to see that the IsEmpty returns true when the object is empty"""
+        result = self.obj1.IsEmpty()
+        assert result == 1 , 'New object should have been empty'
+        
+    def testIsNotEmpty(self):
+        """Check to see that the IsEmpty returns false when the object is empty"""
+        self.obj1.creator = '123'
+        result = self.obj1.IsEmpty()
+        assert result == False , 'Object should not have been empty'
+        self.obj1.creator = ''
+        
+    def testConvertDataToList(self):
+        """Check to see that ConvertDataToList returns the proper number of entries"""
+        temp = self.obj1.convertDataToList()
+        assert len(temp) == len(self.obj1._gridmap)
+        
+    def testDataMemberNames(self):
+        """Check to make sure that we have headings for all columns"""
+        temp = self.obj1.DataMemberNames()
+        assert len(temp) == len(self.obj1._gridmap)
+        
+    def testValidate(self):
+        """Check to make sure that if all required fields are not filled in that we receive
+        an exception"""
+        self.obj1._required = []
+        self.obj1._required.append('test_name')
+        self.obj1.test_name = ''
+        self.assertRaises(pgefexceptions.RequiredDataError, self.obj1.Validate)
+        self.obj1._required.remove('test_name')
 
+    def testBuild(self):
+        self.obj1 = pgefobject.PgefObject()
+        self.obj2 = pgefobject.PgefObject()
+        self.obj1.popTestData()
+        self.obj2.build(self.obj1.__dict__)
+        assert self.obj1.IsEqual(self.obj2), 'Object1 and object2 are not equal'
+        
+        
 def suite():
     suite = unittest.TestSuite()
     suite.addTest(PGEFObjectTestCase("Title"))
@@ -21,6 +79,8 @@
     suite.addTest(PGEFObjectTestCase("testConvertDataToList"))
     suite.addTest(PGEFObjectTestCase("testDataMemberNames"))
     suite.addTest(PGEFObjectTestCase("testValidate"))
+    suite.addTest(PGEFObjectTestCase("testBuild"))
+    
     return suite
 
 def main():

From pbear at ned.gsfc.nasa.gov  Thu Oct 16 16:18:32 2003
From: pbear at ned.gsfc.nasa.gov (pbear CVS)
Date: Thu Oct 16 15:18:33 2003
Subject: [Pangalactic-commits] fixed getcategories and getorganizations
Message-ID: <200310161918.h9GJIWAn032731@ned.gsfc.nasa.gov>

Modified files:
PanGalactic/pangalactic/enterprise/pgefadvisory.py 1.38 1.39
PanGalactic/pangalactic/enterprise/workflow/wfinstanceoverview.py 1.6 1.7
PanGalactic/pangalactic/utils/xmlrpcinterface.py 1.21 1.22

Log message:
fixed getcategories and getorganizations


Index: PanGalactic/pangalactic/enterprise/pgefadvisory.py
diff -u PanGalactic/pangalactic/enterprise/pgefadvisory.py:1.38 PanGalactic/pangalactic/enterprise/pgefadvisory.py:1.39
--- PanGalactic/pangalactic/enterprise/pgefadvisory.py:1.38	Wed Oct 15 13:48:01 2003
+++ PanGalactic/pangalactic/enterprise/pgefadvisory.py	Thu Oct 16 15:18:30 2003
@@ -1,11 +1,11 @@
-# $Id: pgefadvisory.py,v 1.38 2003/10/15 17:48:01 pbear Exp $
+# $Id: pgefadvisory.py,v 1.39 2003/10/16 19:18:30 pbear Exp $
 
 """
 Base class for documents that report conditions related to the
 usability of a product.
 """
 
-__version__ = "$Revision: 1.38 $"[11:-2]
+__version__ = "$Revision: 1.39 $"[11:-2]
 
 import os.path
 import string
@@ -66,12 +66,12 @@
 
 # leave this here...  I use it to generate old data -vwk
 #
-#        now = mx.DateTime.DateFromTicks(mx.DateTime.now())
-#        earlier = now + mx.DateTime.RelativeDateTime(days=-10)
-#        self.pger_create_datetime = earlier
-#        self.pger_mod_datetime    = earlier
-#        self.create_datetime      = earlier
-#        self.mod_datetime         = earlier
+        now = mx.DateTime.DateFromTicks(mx.DateTime.now())
+        earlier = now + mx.DateTime.RelativeDateTime(days=-45)
+        self.pger_create_datetime = earlier
+        self.pger_mod_datetime    = earlier
+        self.create_datetime      = earlier
+        self.mod_datetime         = earlier
 
 
     def __getattr__(self, name):

Index: PanGalactic/pangalactic/enterprise/workflow/wfinstanceoverview.py
diff -u PanGalactic/pangalactic/enterprise/workflow/wfinstanceoverview.py:1.6 PanGalactic/pangalactic/enterprise/workflow/wfinstanceoverview.py:1.7
--- PanGalactic/pangalactic/enterprise/workflow/wfinstanceoverview.py:1.6	Thu Oct  9 13:05:18 2003
+++ PanGalactic/pangalactic/enterprise/workflow/wfinstanceoverview.py	Thu Oct 16 15:18:30 2003
@@ -86,7 +86,7 @@
 
         for row in range(self.grid.GetNumberRows()):
             wfobj = self.grid.GetDataObj(row)
-            msg += "set bg colour for row: " + str(row)
+            msg += "\nrow: " + str(row)
             colour = wxLIGHT_GREY
 
             now = mx.DateTime.DateFromTicks(mx.DateTime.now())
@@ -99,19 +99,27 @@
 
             #print duedate, late, very_late, lost_cause
 
-            if duedate + mx.DateTime.RelativeDateTime(days=(+lost_cause)) <= now:
-                colour = wxColour(225, 0, 0)
-                msg += "; Waaay Overdue"
-            elif duedate + mx.DateTime.RelativeDateTime(days=(+very_late)) <= now:
+            if now >= duedate + mx.DateTime.RelativeDateTime(days=(+lost_cause)):
+                colour = wxColour(240, 50, 50)
+                #colour = wxTheColourDatabase.FindColour("ORANGE")
+                msg += "; Waaay Overdue (%i) " % lost_cause
+            elif now >= duedate + mx.DateTime.RelativeDateTime(days=(+very_late)):
                 colour = wxTheColourDatabase.FindColour("CORAL")
-                msg += "; Very Late"
-            elif duedate + mx.DateTime.RelativeDateTime(days=(+late)) <= now:
-                colour = wxTheColourDatabase.FindColour("YELLOW")
-                msg += "; Late"
+                msg += "; Very Late (%i) " % very_late
+            elif now >= duedate + mx.DateTime.RelativeDateTime(days=(+late)):
+                colour = wxColour(255, 255, 50)
+                #colour = wxTheColourDatabase.FindColour("YELLOW")
+                msg += "; Late (%i) " % late
+            elif now >= duedate:
+                colour = wxTheColourDatabase.FindColour("YELLOW GREEN")
+                #colour = wxColour(130, 230, 0)
+                msg += "; Sort of Late "
             else:
-                colour = wxColour(0, 240, 80)
-                msg += "; on time"
+                #colour = wxColour(80, 240, 100)
+                colour = wxTheColourDatabase.FindColour("LIME GREEN")
+                msg += "; on time "
 
+            msg += repr(colour)
             self.grid.SetCellBackgroundColour(row, somecol, colour)
             #print msg
 

Index: PanGalactic/pangalactic/utils/xmlrpcinterface.py
diff -u PanGalactic/pangalactic/utils/xmlrpcinterface.py:1.21 PanGalactic/pangalactic/utils/xmlrpcinterface.py:1.22
--- PanGalactic/pangalactic/utils/xmlrpcinterface.py:1.21	Thu Oct 16 13:24:49 2003
+++ PanGalactic/pangalactic/utils/xmlrpcinterface.py	Thu Oct 16 15:18:30 2003
@@ -3,10 +3,10 @@
 """
 PanGalactic Client XMLRPC Interfaces
 
-@version: $Revision: 1.21 $
+@version: $Revision: 1.22 $
 """
 
-__version__ = "$Revision: 1.21 $"[11:-2]
+__version__ = "$Revision: 1.22 $"[11:-2]
 
 import xmlrpclib
 import types
@@ -100,14 +100,16 @@
     def getCategories(self, context):
         # Category is a subclass of DataElement.  FSC is a
         # Category; it's passed in as the context
-        print "xmlrpc.getcategories"
-        data = self._RPC.getObjects('Category', "id_context=%s" % context)
+        print "xmlrpc.getcategories", context
+        crit = {"id_context" : context}
+        data = self._RPC.getObjects('Category', 0, 0, crit)
         if data:
             return [self._factory.remember(x) for x in data]
 
-    def getOrganizations(self):
-        print "xmlrpc.getorganizations"
-        data = self._RPC.getObjects('Organization', "id_context=DEMO")  ## NOT staying.  Demo only!!  --vwk 28feb2003
+    def getOrganizations(self, context):
+        print "xmlrpc.getorganizations", context
+        crit = {"id_context" : context}
+        data = self._RPC.getObjects('Organization', 0, 0, crit)
         if data:
             return [self._factory.remember(x) for x in data]
 

From pbear at ned.gsfc.nasa.gov  Thu Oct 16 18:19:46 2003
From: pbear at ned.gsfc.nasa.gov (pbear CVS)
Date: Thu Oct 16 17:19:48 2003
Subject: [Pangalactic-commits] adjust colours;
	add yellow for time period between due date and late
Message-ID: <200310162119.h9GLJkjj002453@ned.gsfc.nasa.gov>

Modified files:
PanGalactic/pangalactic/enterprise/pgefadvisory.py 1.39 1.40
PanGalactic/pangalactic/enterprise/workflow/wfinstanceoverview.py 1.7 1.8
PanGalactic/pangalactic/enterprise/workflow/workflow_wizard.py 1.19 1.20
PanGalactic/pangalactic/utils/datamanager.py 1.47 1.48
PanGalactic/pangalactic/utils/localdb.py 1.40 1.41

Log message:
adjust colours; add yellow for time period between due date and late


Index: PanGalactic/pangalactic/enterprise/workflow/wfinstanceoverview.py
diff -u PanGalactic/pangalactic/enterprise/workflow/wfinstanceoverview.py:1.7 PanGalactic/pangalactic/enterprise/workflow/wfinstanceoverview.py:1.8
--- PanGalactic/pangalactic/enterprise/workflow/wfinstanceoverview.py:1.7	Thu Oct 16 15:18:30 2003
+++ PanGalactic/pangalactic/enterprise/workflow/wfinstanceoverview.py	Thu Oct 16 17:19:44 2003
@@ -100,23 +100,20 @@
             #print duedate, late, very_late, lost_cause
 
             if now >= duedate + mx.DateTime.RelativeDateTime(days=(+lost_cause)):
-                colour = wxColour(240, 50, 50)
-                #colour = wxTheColourDatabase.FindColour("ORANGE")
+                colour = wxTheColourDatabase.FindColour("MAROON")
+                self.grid.SetCellTextColour(row, somecol, wxWHITE)
                 msg += "; Waaay Overdue (%i) " % lost_cause
             elif now >= duedate + mx.DateTime.RelativeDateTime(days=(+very_late)):
-                colour = wxTheColourDatabase.FindColour("CORAL")
+                colour = wxTheColourDatabase.FindColour("RED")
                 msg += "; Very Late (%i) " % very_late
             elif now >= duedate + mx.DateTime.RelativeDateTime(days=(+late)):
-                colour = wxColour(255, 255, 50)
-                #colour = wxTheColourDatabase.FindColour("YELLOW")
+                colour = wxTheColourDatabase.FindColour("CORAL")
                 msg += "; Late (%i) " % late
             elif now >= duedate:
-                colour = wxTheColourDatabase.FindColour("YELLOW GREEN")
-                #colour = wxColour(130, 230, 0)
+                colour = wxTheColourDatabase.FindColour("YELLOW")
                 msg += "; Sort of Late "
             else:
-                #colour = wxColour(80, 240, 100)
-                colour = wxTheColourDatabase.FindColour("LIME GREEN")
+                colour = wxTheColourDatabase.FindColour("GREEN")
                 msg += "; on time "
 
             msg += repr(colour)

Index: PanGalactic/pangalactic/enterprise/workflow/workflow_wizard.py
diff -u PanGalactic/pangalactic/enterprise/workflow/workflow_wizard.py:1.19 PanGalactic/pangalactic/enterprise/workflow/workflow_wizard.py:1.20
--- PanGalactic/pangalactic/enterprise/workflow/workflow_wizard.py:1.19	Thu Oct 16 11:17:20 2003
+++ PanGalactic/pangalactic/enterprise/workflow/workflow_wizard.py	Thu Oct 16 17:19:44 2003
@@ -20,6 +20,13 @@
  
 WF_START = wxNewId()
 
+key_col = 0
+time_col = 1
+time_late_col = 2
+time_very_late_col = 3
+time_lost_cause_col = 4
+desc_col = 5
+        
 class WorkflowWizard(wxPanel):
     """
     Saving from this gui creates a WfProcess, as well as a WfActivity for each
@@ -101,6 +108,16 @@
 
         self.activitygrid.SetRowLabelSize(40)
         self.activitygrid.EnableEditing(True)
+
+        purple = wxTheColourDatabase.FindColour("MAROON")
+        red = wxTheColourDatabase.FindColour("RED")
+        orange = wxTheColourDatabase.FindColour("CORAL")
+        yellow = wxTheColourDatabase.FindColour("YELLOW")
+        self.SetColForegroundColour(self.activitygrid, time_lost_cause_col, wxWHITE)
+        self.SetColBackgroundColour(self.activitygrid, time_lost_cause_col, purple)
+        self.SetColBackgroundColour(self.activitygrid, time_very_late_col, red)
+        self.SetColBackgroundColour(self.activitygrid, time_late_col, orange)
+
         editor = wxGridCellChoiceEditor(["Initiated", "Draft", "Approved", "Released"], False)
 #        print "editor", editor
         for row in range(self.activitygrid.GetNumberRows()):
@@ -141,8 +158,8 @@
 
         EVT_GRID_LABEL_LEFT_CLICK(self, self.OnSelectCell)
         EVT_GRID_SELECT_CELL(self, self.OnSelectCell)
-#        EVT_GRID_EDITOR_SHOWN(self, self.OnEditorShown)
-#        EVT_GRID_EDITOR_HIDDEN(self, self.OnEditorHidden)
+        EVT_GRID_EDITOR_SHOWN(self, self.OnEditorShown)
+        EVT_GRID_EDITOR_HIDDEN(self, self.OnEditorHidden)
 
         EVT_KEY_DOWN(self.activitygrid, self.OnActKeyDown)
         EVT_KEY_DOWN(self.transitiongrid, self.OnTransKeyDown)
@@ -350,13 +367,6 @@
             row += 1
         
         row = 0
-        key_col = 0
-        time_col = 1
-        time_late_col = 2
-        time_very_late_col = 3
-        time_lost_cause_col = 4
-        desc_col = 5
-        
         for akey, avalue in wfobj.activities.items():
             #print akey, avalue.fields
             self.activitygrid.SetCellValue(row, key_col, avalue.fields["activity"])
@@ -367,13 +377,6 @@
             self.activitygrid.SetCellValue(row, desc_col, avalue.fields["description"])
             row += 1
 
-        red = wxColour(225, 0, 0)
-        orange = wxTheColourDatabase.FindColour("CORAL")
-        yellow = wxTheColourDatabase.FindColour("YELLOW")
-        self.SetColBackgroundColour(self.activitygrid, time_lost_cause_col, red)
-        self.SetColBackgroundColour(self.activitygrid, time_very_late_col, orange)
-        self.SetColBackgroundColour(self.activitygrid, time_late_col, yellow)
-
 
     def SetColBackgroundColour(self, grid, col, colour):
         numrows = grid.GetNumberRows()
@@ -381,6 +384,12 @@
             grid.SetCellBackgroundColour(row, col, colour)
         
         
+    def SetColForegroundColour(self, grid, col, colour):
+        numrows = grid.GetNumberRows()
+        for row in range(numrows):
+            grid.SetCellTextColour(row, col, colour)
+        
+        
     def SetActivities(self, activitydict):
         for row, value in activitydict.items():
             for col in range(len(value)):
@@ -416,12 +425,18 @@
 
 
     def OnEditorShown(self, event):
-#        print "OnEditorShown: (%d,%d) %s" % (event.GetRow(), event.GetCol(), event.GetPosition())
+        # print "OnEditorShown: (%d,%d) %s" % (event.GetRow(), event.GetCol(), event.GetPosition())
+        if event.GetId() == self.activitygrid.GetId():
+            if event.GetCol() == time_lost_cause_col:
+                self.activitygrid.SetCellTextColour(event.GetRow(), time_lost_cause_col, wxBLACK)
         event.Skip()
 
 
     def OnEditorHidden(self, event):
-#        print "OnEditorHidden: (%d,%d) %s" % (event.GetRow(), event.GetCol(), event.GetPosition())
+        # print "OnEditorHidden: (%d,%d) %s" % (event.GetRow(), event.GetCol(), event.GetPosition())
+        if event.GetId() == self.activitygrid.GetId():
+            if event.GetCol() == time_lost_cause_col:
+                self.activitygrid.SetCellTextColour(event.GetRow(), time_lost_cause_col, wxWHITE)
         event.Skip()
 
 

Index: PanGalactic/pangalactic/enterprise/pgefadvisory.py
diff -u PanGalactic/pangalactic/enterprise/pgefadvisory.py:1.39 PanGalactic/pangalactic/enterprise/pgefadvisory.py:1.40
--- PanGalactic/pangalactic/enterprise/pgefadvisory.py:1.39	Thu Oct 16 15:18:30 2003
+++ PanGalactic/pangalactic/enterprise/pgefadvisory.py	Thu Oct 16 17:19:44 2003
@@ -1,11 +1,11 @@
-# $Id: pgefadvisory.py,v 1.39 2003/10/16 19:18:30 pbear Exp $
+# $Id: pgefadvisory.py,v 1.40 2003/10/16 21:19:44 pbear Exp $
 
 """
 Base class for documents that report conditions related to the
 usability of a product.
 """
 
-__version__ = "$Revision: 1.39 $"[11:-2]
+__version__ = "$Revision: 1.40 $"[11:-2]
 
 import os.path
 import string
@@ -66,12 +66,12 @@
 
 # leave this here...  I use it to generate old data -vwk
 #
-        now = mx.DateTime.DateFromTicks(mx.DateTime.now())
-        earlier = now + mx.DateTime.RelativeDateTime(days=-45)
-        self.pger_create_datetime = earlier
-        self.pger_mod_datetime    = earlier
-        self.create_datetime      = earlier
-        self.mod_datetime         = earlier
+#        now = mx.DateTime.DateFromTicks(mx.DateTime.now())
+#        earlier = now + mx.DateTime.RelativeDateTime(days=-45)
+#        self.pger_create_datetime = earlier
+#        self.pger_mod_datetime    = earlier
+#        self.create_datetime      = earlier
+#        self.mod_datetime         = earlier
 
 
     def __getattr__(self, name):

Index: PanGalactic/pangalactic/utils/datamanager.py
diff -u PanGalactic/pangalactic/utils/datamanager.py:1.47 PanGalactic/pangalactic/utils/datamanager.py:1.48
--- PanGalactic/pangalactic/utils/datamanager.py:1.47	Thu Oct 16 11:17:21 2003
+++ PanGalactic/pangalactic/utils/datamanager.py	Thu Oct 16 17:19:45 2003
@@ -1,6 +1,6 @@
 # $Source: /repo/step_testbed/PanGalactic/pangalactic/utils/datamanager.py,v $
 
-__version__ = "$Revision: 1.47 $"[11:-2]
+__version__ = "$Revision: 1.48 $"[11:-2]
 
 import time
 import mx.DateTime
@@ -264,16 +264,20 @@
             # need to make sure we get all the referenced objects filled in.  pass in objs
 
             fieldnames = {"project_id" : projectlist[0]}
-            data = self.server.getObjects("ProductModelVersion", fields = fieldnames, refs = 1, subtypes = 0, objs = [])
+            data = self.server.getObjects("ProductModelVersion",
+                                          fields = fieldnames, refs = 1, subtypes = 0, objs = [])
 
             #fieldnames = {"project_id" : projectlist[0]}
-            #pvs = self.server.getObjects("ProductVersion", fields = fieldnames, refs = 1, subtypes = 0, objs = [])
+            #pvs = self.server.getObjects("ProductVersion",
+            #                             fields = fieldnames, refs = 1, subtypes = 0, objs = [])
 
             #fieldnames = {"project_id" : projectlist[0]}
-            #pms = self.server.getObjects("ProductMaster", fields = fieldnames, refs = 1, subtypes = 0, objs = [])
+            #pms = self.server.getObjects("ProductMaster",
+            #                             fields = fieldnames, refs = 1, subtypes = 0, objs = [])
 
             #fieldnames = {"project_id" : projectlist[0]}
-            #pmms = self.server.getObjects("ProductModelMaster", fields = fieldnames, refs = 1, subtypes = 0, objs = [])
+            #pmms = self.server.getObjects("ProductModelMaster",
+            #                              fields = fieldnames, refs = 1, subtypes = 0, objs = [])
 
             #print 'items for project: %s are: %s' % (projectlist[0], data)
             
@@ -308,7 +312,8 @@
             #print len(tempobjlist)
             self.localDB.Save(tempobjlist)
 
-            # tbd - need to revisit after the project info is ironed out as this will not work for more than 1 project
+            # tbd - need to revisit after the project info is ironed out
+            # as this will not work for more than 1 project
             # in the server call.
             currproject = projectlist[0]
             projectobjects = self.localDB.GetProjectObjects()
@@ -471,10 +476,8 @@
 
     def addNauoIDsEntry(self, nauo2add, parentnauo, nauo_dict):
         #print "addnauoidsentry"
-        # assemblyid                          parent nauoid : [child nauoid, ...]
-        #'0498C96D-41D4-8B8F-A4B0-F21958EA': {'TOPLEVEL'                         : ['ned.gsfc.nasa.gov__pbear__138']}
-        #'02818D7A-3F1C-17BD-0CD3-C5686251': {'ned.gsfc.nasa.gov__pbear__138'    : ['000FECF5-EE7D-C1C7-E62B-BFD5F6AF']},
-        #'03E0BB71-A6AA-15C8-908A-F93639A2': {'01964FA5-C877-8153-2DF9-D046CB93' : ['0220C03E-A304-86D6-91B1-8A0F92B6']},
+        # {assemblyid : {parent nauoid : [child nauoid, ...]},
+        #  assemblyid : {parent nauoid : [child nauoid, ...]}}
         
         itemobj = self.localDB.GetItem(nauo2add._assembly.pgef_oid) # problems
         if not itemobj:
@@ -489,7 +492,8 @@
     def getItem(self, itemid):
         #obj = self.server.GetPMV(itemid)
         fieldnames = {"pgef_oid" : itemid}
-        obj = self.server.getObjects("ProductModelVersion", fields = fieldnames, refs = 1, subtypes = 0, objs = [])
+        obj = self.server.getObjects("ProductModelVersion",
+                                     fields = fieldnames, refs = 1, subtypes = 0, objs = [])
         if obj:
             return obj
         else:
@@ -502,7 +506,8 @@
     def getDocument(self, docid):
         #obj = self.server.GetDocument(docid)
         fieldnames = {"pgef_oid" : docid}
-        obj = self.server.getObjects("Document", fields = fieldnames, refs = 0, subtypes = 1, objs = [])
+        obj = self.server.getObjects("Document", fields =
+                                     fieldnames, refs = 0, subtypes = 1, objs = [])
         if obj:
             return obj
         else:
@@ -527,7 +532,8 @@
         for objid in ItemIdList:
             #objlist = self.server.GetPDRByItemID(objid)
             fieldnames = {"document" : objid}
-            objlist = self.server.getObjects("ProductDocumentRelationship", fields = fieldnames, refs = 1, subtypes = 0, objs = [])
+            objlist = self.server.getObjects("ProductDocumentRelationship",
+                                             fields = fieldnames, refs = 1, subtypes = 0, objs = [])
             pdrids = []
             pdrobjs = []
             itemobjs = []
@@ -786,7 +792,8 @@
         
         
     def commit(self, unsavedobjs, upload = True):
-        #tbd - need to actually pass upload flag or determine it based on document interfaces
+        #tbd - need to actually pass upload flag or
+        #      determine it based on document interfaces
 
         print "datamanager.commit"
 
@@ -904,14 +911,16 @@
             if classname == 'ProductMaster':
                 fieldnames = {'id'         : root_object.id,
                               'id_context' : root_object.id_context}
-                objlist = self.server.getObjects(classname, fields = fieldnames, refs = 1, subtypes = 0, objs = [root_object])
+                objlist = self.server.getObjects(classname, fields = fieldnames,
+                                                 refs = 1, subtypes = 0, objs = [root_object])
                 #objlist = self.server.getPvByPm(root_object)
 
             elif classname == 'ProductVersion':
                 fieldnames = {'of_pm_id'         : root_object.of_pm_id,
                               'of_pm_id_context' : root_object.of_pm_id_context,
                               'id'               : root_object.id}
-                objlist = self.server.getObjects(classname, fields = fieldnames, refs = 1, subtypes = 0, objs = [root_object])
+                objlist = self.server.getObjects(classname, fields = fieldnames,
+                                                 refs = 1, subtypes = 0, objs = [root_object])
                 #objlist = self.server.getPmmByPv(root_object)
 
             elif classname == 'ProductModelMaster':
@@ -919,7 +928,8 @@
                               'of_pm_id_context' : root_object.of_pm_id_context,
                               'of_pv_id'         : root_object.of_pv_id,
                               'id'               : root_object.id}
-                objlist = self.server.getObjects(classname, fields = fieldnames, refs = 1, subtypes = 0, objs = [root_object])
+                objlist = self.server.getObjects(classname, fields = fieldnames,
+                                                 refs = 1, subtypes = 0, objs = [root_object])
                 #objlist = self.server.getPmvByPmm(root_object)
 
             elif classname == 'ProductModelVersion':

Index: PanGalactic/pangalactic/utils/localdb.py
diff -u PanGalactic/pangalactic/utils/localdb.py:1.40 PanGalactic/pangalactic/utils/localdb.py:1.41
--- PanGalactic/pangalactic/utils/localdb.py:1.40	Wed Oct 15 12:51:13 2003
+++ PanGalactic/pangalactic/utils/localdb.py	Thu Oct 16 17:19:45 2003
@@ -282,7 +282,9 @@
             else:
                 #print "have acubyassembly key", assembly_tuple, component_tuple
                 updated_acu = self.dbroot[self.ACUBYASSEMBLY][(assembly_tuple, component_tuple)]
-                self.dbroot[self.ACUDICT][updated_acu.pgef_oid] = updated_acu  # add this to fix itemdropdown selection bug??? vwk
+                self.dbroot[self.ACUDICT][updated_acu.pgef_oid] = updated_acu
+                # add the above to fix itemdropdown selection bug??? vwk
+
                 retlist.append(updated_acu)
                 
         self.Commit()
@@ -407,7 +409,9 @@
                 #print c.__class__
                 #pprint.pprint(c.__dict__)
                 childobj = self.GetItem(nobj._component.pgef_oid)
-                if currentproject and childobj.project_id == currentproject: # add project_context = "DEMO" or something similar
+                if currentproject and childobj.project_id == currentproject:
+                    # add project_context = "DEMO" or something similar to the above line
+                    
                     #print "keeping", nid, "->", childobj.id, childobj.short_description
                     objdict[nid] = nobj
 
@@ -555,7 +559,8 @@
     def GetProductModelVersionDict(self):
         return self.dbroot[self.PRODUCTMODELVERSION]
 
-    def GetLocalProducts(self, currentproject = None, pm = None, pmm = None, pv = None, pmv = None, all = None):
+    def GetLocalProducts(self, currentproject = None,
+                         pm = None, pmm = None, pv = None, pmv = None, all = None):
         #print "localdb.getlocalproducts", currentproject
         dict_list = []
         if pm or all:
@@ -714,11 +719,15 @@
         # isinstance is specifically used here for groups of classes
         tmpdict = {}
         for docid, doc in self.dbroot[self.DOCUMENTDICT].items():
-            if isinstance(doc, document.Document) and not isinstance(doc, PgefAdvisory) and not isinstance(doc, partslist.PartsList):
+            if isinstance(doc, document.Document) and not \
+               isinstance(doc, PgefAdvisory) and not \
+               isinstance(doc, partslist.PartsList):
                 if doc.state <> None:
                     tmpdict[docid] = doc
         for docid, doc in self.dbroot[self.UNCOMMITTEDOBJECTS].items():
-            if isinstance(doc, document.Document) and not isinstance(doc, PgefAdvisory) and not isinstance(doc, partslist.PartsList):
+            if isinstance(doc, document.Document) and not \
+               isinstance(doc, PgefAdvisory) and not \
+               isinstance(doc, partslist.PartsList):
                 if doc.state <> objectstatus.DELETE:
                     tmpdict[docid] = doc
         return tmpdict
@@ -977,7 +986,10 @@
             self.dbroot[savedict][id] = obj
             self.dbroot[self.OIDLOOKUP][obj.pgef_oid] = savedict
             #print "saved local object", savedict, id
-            if obj.__class__.__name__ in ['ProductModelVersion', 'ProductModelMaster', 'ProductVersion', 'ProductMaster']:
+            if obj.__class__.__name__ in ['ProductModelVersion',
+                                          'ProductModelMaster',
+                                          'ProductVersion',
+                                          'ProductMaster']:
                 compound_key = data_utils.createCompoundKey(obj)
                 self.saveCompoundKey(obj, compound_key)        
 
@@ -990,7 +1002,10 @@
 
     def makeCompoundKey(self, obj):
         compound_key = None
-        if obj.__class__.__name__ in ['ProductModelVersion', 'ProductModelMaster', 'ProductVersion', 'ProductMaster']:
+        if obj.__class__.__name__ in ['ProductModelVersion',
+                                      'ProductModelMaster',
+                                      'ProductVersion',
+                                      'ProductMaster']:
             compound_key = data_utils.createCompoundKey(obj)
         return compound_key
  
@@ -1593,11 +1608,17 @@
     def getVersionTreeObjects(self, root_object):
         objs = []
         if root_object.__class__.__name__ == 'ProductMaster':
-                objs = self.getPvByPm(root_object.id, root_object.id_context)
+                objs = self.getPvByPm(root_object.id,
+                                      root_object.id_context)
         elif root_object.__class__.__name__ == 'ProductVersion':
-            objs = self.getPmmByPv(root_object.of_pm_id, root_object.of_pm_id_context, root_object.id)
+            objs = self.getPmmByPv(root_object.of_pm_id,
+                                   root_object.of_pm_id_context,
+                                   root_object.id)
         elif root_object.__class__.__name__ == 'ProductModelMaster':
-            objs = self.getPmvByPmm(root_object.of_pm_id, root_object.of_pm_id_context, root_object.of_pv_id, root_object.id)
+            objs = self.getPmvByPmm(root_object.of_pm_id,
+                                    root_object.of_pm_id_context,
+                                    root_object.of_pv_id,
+                                    root_object.id)
         elif root_object.__class__.__name__ == 'ProductModelVersion':
             return None
         return objs

From waterbug at ned.gsfc.nasa.gov  Thu Oct 16 21:09:59 2003
From: waterbug at ned.gsfc.nasa.gov (waterbug CVS)
Date: Thu Oct 16 20:10:01 2003
Subject: [Pangalactic-commits] Add document_map view to PGERDB.
Message-ID: <200310170009.h9H09xhQ004661@ned.gsfc.nasa.gov>

Modified files:
PanGalactic/src/sql/createPgerDbViews.sql None 1.1

Log message:
Add document_map view to PGERDB.


From waterbug at ned.gsfc.nasa.gov  Thu Oct 16 21:12:07 2003
From: waterbug at ned.gsfc.nasa.gov (waterbug CVS)
Date: Thu Oct 16 20:12:09 2003
Subject: [Pangalactic-commits] Add "tag" attribute to pv, pmv, and dv,
	+ tweaks to document table.
Message-ID: <200310170012.h9H0C775004727@ned.gsfc.nasa.gov>

Modified files:
PanGalactic/src/sql/createPgerDbTables.sql 1.64 1.65

Log message:
Add "tag" attribute to pv, pmv, and dv, + tweaks to document table.


Index: PanGalactic/src/sql/createPgerDbTables.sql
diff -u PanGalactic/src/sql/createPgerDbTables.sql:1.64 PanGalactic/src/sql/createPgerDbTables.sql:1.65
--- PanGalactic/src/sql/createPgerDbTables.sql:1.64	Wed Oct 15 18:49:47 2003
+++ PanGalactic/src/sql/createPgerDbTables.sql	Thu Oct 16 20:12:05 2003
@@ -1,6 +1,6 @@
 /* Pan Galactic Engineering Repository Database (PGERDB) Table Creation Script */
 
-/* $Id: createPgerDbTables.sql,v 1.64 2003/10/15 22:49:47 waterbug Exp $
+/* $Id: createPgerDbTables.sql,v 1.65 2003/10/17 00:12:05 waterbug Exp $
  * 
  * *** TO DO ***
  *     -- TBR (Text-Based Requirements)
@@ -710,6 +710,9 @@
          * applicable -- if not applicable, the defaults are
          * used).  Defined as a foreign key referencing the
          * project table.  */
+    tag                      TEXT,
+        /* [CVS] A string identifier used to identify a
+         * baseline, release, or version.  */
     has_docs_flag            BOOLEAN DEFAULT FALSE,
         /* A computed attribute: TRUE if the ProductVersion
          * occurs in a ProductVersionDocrel; otherwise, FALSE.
@@ -909,6 +912,9 @@
          * applicable -- if not applicable, the defaults are
          * used).  Defined as a foreign key referencing the
          * project table.  */
+    tag                      TEXT,
+        /* [CVS] A string identifier used to identify a
+         * baseline, release, or version.  */
     has_docs_flag            BOOLEAN DEFAULT FALSE,
         /* (Inherited from ProductVersion.)
          * A computed attribute: TRUE if the ProductModelVersion
@@ -1177,6 +1183,9 @@
          *                           this may map to an element tag)
          * 'annotation' ............ (name is optional)
          * */
+    tag                      TEXT,
+        /* [CVS] A string identifier used to identify a
+         * baseline, release, or version.  */
     content                  TEXT DEFAULT '',
         /* The plain text content of the document.  For a
          * document with structural_role = 'annotation', this is
@@ -1254,9 +1263,9 @@
 
 CREATE TABLE document
     /* Document is a container object that provides access to the
-     * current version of a document and all related objects.
-     * Document is the primary object that applications will deal
-     * directly with.  */
+     * current version of a document and all of its constituent
+     * objects.  Document is the primary object that applications
+     * will deal directly with.  */
 (
     pgef_oid                 TEXT UNIQUE,
         /* (This attribute is inherited from PgefObject.)
@@ -1271,19 +1280,10 @@
          * and set to a custom application object class.  */
     master                   TEXT,
         /* pgef_oid of the associated DocMaster.  */
-    current_version          TEXT,
-        /* pgef_oid of the latest DocVersion associated with that
-         * DocMaster.  */
     PRIMARY KEY (pgef_oid),
     CONSTRAINT doc_has_master
         FOREIGN KEY (master)
         REFERENCES doc_master(pgef_oid)
-        ON UPDATE CASCADE
-        ON DELETE CASCADE
-        DEFERRABLE,
-    CONSTRAINT doc_has_current_version
-        FOREIGN KEY (current_version)
-        REFERENCES doc_version(pgef_oid)
         ON UPDATE CASCADE
         ON DELETE CASCADE
         DEFERRABLE

From waterbug at ned.gsfc.nasa.gov  Fri Oct 17 17:49:33 2003
From: waterbug at ned.gsfc.nasa.gov (waterbug CVS)
Date: Fri Oct 17 16:49:35 2003
Subject: [Pangalactic-commits] Fix for duplicate extracts/objects problem.
Message-ID: <200310172049.h9HKnXeS018361@ned.gsfc.nasa.gov>

Modified files:
PanGalactic/pangalactic/repo/pger.py 1.44 1.45

Log message:
Fix for duplicate extracts/objects problem.


Index: PanGalactic/pangalactic/repo/pger.py
diff -u PanGalactic/pangalactic/repo/pger.py:1.44 PanGalactic/pangalactic/repo/pger.py:1.45
--- PanGalactic/pangalactic/repo/pger.py:1.44	Tue Oct  7 23:39:36 2003
+++ PanGalactic/pangalactic/repo/pger.py	Fri Oct 17 16:49:32 2003
@@ -1,9 +1,9 @@
 """
 Pan Galactic Entropy Reverser module
-@version: $Revision: 1.44 $
+@version: $Revision: 1.45 $
 """
 
-__version__ = "$Revision: 1.44 $"[11:-2]
+__version__ = "$Revision: 1.45 $"[11:-2]
 # $Source: /repo/step_testbed/PanGalactic/pangalactic/repo/pger.py,v $
 
 import time
@@ -132,7 +132,7 @@
                     raise ValueError, '%s is not in the schema of %s' % (a, typename)
                 dbargs.append((a, kw[a], '='))
             # TODO: implement refs and subtypes ...
-            dres = self._pgerdb.doPgerdbQuery(table, 0, *dbargs)
+            dres = self._pgerdb.doPgerdbQuery(table, subtypes, *dbargs)
             dres.addErrback(log.err)
             if not refs:
                 return dres
@@ -142,6 +142,7 @@
                         [self._pgerdb.getByRowKey(rk)
                          for rk in x])
                 dres.addCallback(defer.gatherResults)
+                dres.addCallback(utils.unique)
                 return dres
         else:
             d = defer.Deferred()

From waterbug at ned.gsfc.nasa.gov  Fri Oct 17 17:49:55 2003
From: waterbug at ned.gsfc.nasa.gov (waterbug CVS)
Date: Fri Oct 17 16:49:57 2003
Subject: [Pangalactic-commits] pgefobject.py
Message-ID: <200310172049.h9HKntCc018415@ned.gsfc.nasa.gov>

Modified files:
PanGalactic/pangalactic/enterprise/document.py 1.10 1.11
PanGalactic/pangalactic/enterprise/docversion.py 1.11 1.12
PanGalactic/pangalactic/enterprise/pgefobject.py 1.27 1.28
PanGalactic/pangalactic/enterprise/productversion.py 1.20 1.21

Log message:
pgefobject.py


Index: PanGalactic/pangalactic/enterprise/document.py
diff -u PanGalactic/pangalactic/enterprise/document.py:1.10 PanGalactic/pangalactic/enterprise/document.py:1.11
--- PanGalactic/pangalactic/enterprise/document.py:1.10	Mon Sep 15 16:08:59 2003
+++ PanGalactic/pangalactic/enterprise/document.py	Fri Oct 17 16:49:53 2003
@@ -1,10 +1,10 @@
-# $Id: document.py,v 1.10 2003/09/15 20:08:59 waterbug Exp $
+# $Id: document.py,v 1.11 2003/10/17 20:49:53 waterbug Exp $
 
 """
 The Mother of all document types in PGEF.
 """
 
-__version__ = "$Revision: 1.10 $"[11:-2]
+__version__ = "$Revision: 1.11 $"[11:-2]
 
 import string
 from pangalactic.enterprise.pgefobject import PgefObject
@@ -16,23 +16,32 @@
 def FillSampleDocument(document):
     document.creator = 'Test Harness'
 
-class Document(DocVersion):
+class Document(PgefObject):
     """
     I encapsulate the most generic document attributes and
     behaviors.  All document types subclass me.
+
+    The function of Document is primarily to provide an
+    application-level interface adaptable to the many contexts in
+    which a document concept can be found.  Its methods should
+    probably define an Interface (as in the Twisted and Zope
+    component architectures.
     """
-    # all computed attributes are Dublin Core
     _default_display_order = []
     _default_display_names = {}
     _default_display_types = {}
-    _excluded_fields = DocVersion._excluded_fields
+    _excluded_fields = PgefObject._excluded_fields
     _gridmap = [
                 ['Title',   'self.Title'],
                 ['Creator', 'self.Creator'],
                 ['Rev',     'self.Revision'],
                 ['Date',    'self.Date'],
-                ['Type',    'self.Type']
+                ['Type',    'self.DocTypeCode']
+                # we may want to substitute DocType() or even
+                # PrettyDocType() here ...
                ]
+    # These are from the Dublin Core, and are computed from the
+    # attributes of the associated DocMaster and DocVersion:
     _properties = {
                    'Title'       : 'str',
                    'Identifier'  : 'str',
@@ -40,30 +49,45 @@
                    'Revision'    : 'str',
                    'Description' : 'str',
                    'Date'        : 'str',
-                   'Type'        : 'str'
+                   'DocTypeCode' : 'str'
+                  }
+    _refd = {
+             '_master' : 'DocMaster'
+            }
+    _required = ['master', 'current_version']
+    _schema_ext = {
+                   'master' : 'str'
                   }
-    _required = []
-    _schema_ext = {}
     _schema = _schema_ext.copy()
-    _schema.update(DocVersion._schema)
+    _schema.update(PgefObject._schema)
     _searchabletext = True
     _std_abbrev = 'doc'
 
     def __init__(self, email=None, schema=_schema, **kw):
-        DocVersion.__init__(self, email=email,
+        PgefObject.__init__(self, email=email,
                             schema=schema, **kw)
         for a in kw:
             if a in self._properties:
                 setattr(self, a, kw[a])
+        cv = getattr(self, '_current_version', None)
+        if cv:
+            self._master = cv._of_master
+            self.id = self._master.id
+            self.id_context = self._master.id_context
 
     def deleteAttr(self):
         raise TypeError, 'Cannot delete attribute'
 
     def getTitle(self):
-        return self._of_master.name
+        # What if a document's Title changes?  It is actually the
+        # 'name' attribute of the current DocVersion that
+        # changes.  DocVersions formed before the change would
+        # have a different Title from those formed after the
+        # change.
+        return self._current_version.name
 
     def setTitle(self, value):
-        self._of_master.name = value
+        self._current_version.__dict__['name'] = value
 
     Title = property(getTitle,
                      setTitle,
@@ -71,11 +95,10 @@
                      'Title')
 
     def getIdentifier(self):
-        return self._of_master.id
+        return self._current_version._of_master.id
 
     def setIdentifier(self, value):
-        self._of_master.id = value
-        self.of_dm_id = value
+        self._master.__dict__['id'] = value
 
     Identifier = property(getIdentifier,
                           setIdentifier,
@@ -83,10 +106,17 @@
                           'Identifier')
 
     def getCreator(self):
-        return self.creator
+        # for now, 'creator' is taken to be the id of the initial
+        # creator of the document -- i.e., of the DocMaster.
+        # Actually, we probably want the "full name" of the
+        # person, so it will need to be computed.  (Need to look
+        # it up when Document is initialized, or else assign a
+        # real Person object -- say, _creator -- to Document and
+        # find the full name from that.)
+        return self._master.creator
 
     def setCreator(self, value):
-        self.__dict__['creator'] = value
+        self._master.__dict__['creator'] = value
 
     Creator = property(getCreator,
                        setCreator,
@@ -94,10 +124,10 @@
                        'Creator')
 
     def getRevision(self):
-        return self.id
+        return self._current_version.id
 
     def setRevision(self, value):
-        self.__dict__['id'] = value
+        self._current_version.__dict__['id'] = value
 
     Revision = property(getRevision,
                         setRevision,
@@ -105,10 +135,10 @@
                         'Revision')
 
     def getDescription(self):
-        return self.long_description
+        return self._master.long_description
 
     def setDescription(self, value):
-        self.__dict__['long_description'] = value
+        self.__master.__dict__['long_description'] = value
 
     Description = property(getDescription,
                            setDescription,
@@ -116,7 +146,7 @@
                            'Description')
 
     def getDate(self):
-        return self._create_date
+        return self._master._create_date
 
     def setDate(self, value):
         # 'setDate' is an error because the date should not be
@@ -130,19 +160,20 @@
                     deleteAttr,
                     'Date')
 
-    def getType(self):
-        return self._of_master.doc_type_code
+    def getDocTypeCode(self):
+        return self._master.doc_type_code
 
-    def setType(self, value):
-        self.__dict__['_of_master'].doc_type_code = value
+    def setDocTypeCode(self, value):
+        self._master.__dict__['doc_type_code'] = value
 
-    Type = property(getType,
-                    setType,
-                    deleteAttr,
-                    'Type')
+    DocTypeCode = property(getDocTypeCode,
+                           setDocTypeCode,
+                           deleteAttr,
+                           'DocTypeCode')
 
     def getDocType(self):
-        return self.doc_type_code_context + "_" + self.doc_type_code
+        return (self._master.doc_type_code_context 
+                + "_" + self._master.doc_type_code)
     
     def getPrettyDocType(self):
         tmpcode = self.doc_type_code.replace("_", " ")

Index: PanGalactic/pangalactic/enterprise/docversion.py
diff -u PanGalactic/pangalactic/enterprise/docversion.py:1.11 PanGalactic/pangalactic/enterprise/docversion.py:1.12
--- PanGalactic/pangalactic/enterprise/docversion.py:1.11	Wed Oct  1 13:35:27 2003
+++ PanGalactic/pangalactic/enterprise/docversion.py	Fri Oct 17 16:49:53 2003
@@ -1,10 +1,10 @@
-# $Id: docversion.py,v 1.11 2003/10/01 17:35:27 waterbug Exp $
+# $Id: docversion.py,v 1.12 2003/10/17 20:49:53 waterbug Exp $
 
 """
 Version-specific attributes of a document.
 """
 
-__version__ = "$Revision: 1.11 $"[11:-2]
+__version__ = "$Revision: 1.12 $"[11:-2]
 
 from pangalactic.enterprise.pgefobject import PgefObject
 from pangalactic.enterprise.docmaster import DocMaster as DM
@@ -46,10 +46,13 @@
                  'id',
                  'creator'
                 ]
-    _refd = {'_of_master' : 'DocMaster'}
+    _refd = {
+             '_of_master' : 'DocMaster',
+            }
     _schema_ext = {
                    'of_dm_id'         : 'str',
                    'of_dm_id_context' : 'str',
+                   'tag'              : 'str',
                    'content'          : 'str',
                    'abstract'         : 'str'
                   }
@@ -58,23 +61,14 @@
     _std_abbrev = 'dv'
 
     def __init__(self, email=None, schema=_schema,
-                 dm=None, **kw):
+                 _of_master=None, **kw):
         # PgefObject.__init__() creates the pgef_oid ...
         PgefObject.__init__(self, email=email,
                             schema=schema, **kw)
-        if dm.__class__.__name__ == 'DocMaster':
-            self._of_master = dm
-        # if not, create one ...
-        else:
-            dmid = kw.get('of_dm_id', 
-                          'Document Master Identifier')
-            dmidc = kw.get('of_dm_id_context', 'PGER')
-            self._of_master = DM(email=email,
-                                 id=dmid,
-                                 id_context=dmidc)
-        # set "foreign key" attributes from referenced dm ...
-        self.of_dm_id = self._of_master.id
-        self.of_dm_id_context = self._of_master.id_context
+        if _of_master.__class__.__name__ == 'DocMaster':
+            self._of_master = _of_master
+            self.of_dm_id = self._of_master.id
+            self.of_dm_id_context = self._of_master.id_context
 
     def __getattr__(self, name):
         return PgefObject.__getattr__(self, name)

Index: PanGalactic/pangalactic/enterprise/pgefobject.py
diff -u PanGalactic/pangalactic/enterprise/pgefobject.py:1.27 PanGalactic/pangalactic/enterprise/pgefobject.py:1.28
--- PanGalactic/pangalactic/enterprise/pgefobject.py:1.27	Tue Oct  7 16:03:33 2003
+++ PanGalactic/pangalactic/enterprise/pgefobject.py	Fri Oct 17 16:49:53 2003
@@ -1,8 +1,8 @@
-# $Id: pgefobject.py,v 1.27 2003/10/07 20:03:33 waterbug Exp $
+# $Id: pgefobject.py,v 1.28 2003/10/17 20:49:53 waterbug Exp $
 
 """
 The Mother of all PGEF application classes.
-@version: $Revision: 1.27 $
+@version: $Revision: 1.28 $
 """
 
 # TODO:
@@ -24,7 +24,7 @@
 #               should we jettison this?
 #               Nope.
 
-__version__ = "$Revision: 1.27 $"[11:-2]
+__version__ = "$Revision: 1.28 $"[11:-2]
 
 import types
 import string
@@ -105,12 +105,17 @@
     @type _properties:  dictionary
     @cvar _properties:  the names and types of all attributes
                         that are computed as Python properties
-                        and their types.
+                        and their types.  (_properties define the
+                        "external view" of the object, whereas
+                        _schema defines the "internal view".)
                           - C{{ attr_name : type, ... }}
 
     @type _schema:  dictionary
     @cvar _schema:  defines the persistable attributes of
-                    PgefObject and their type names:
+                    PgefObject and their type names.  (_schema
+                    defines the "internal view" of the object,
+                    whereas _properties define the "external
+                    view".)
                       - C{{ attr_name : type, ... }}
 
     @type _refd:  dictionary
@@ -148,6 +153,7 @@
     _refd = {}
     _schema = {
                'pgef_oid'              : 'str',
+               'pgef_class'            : 'str',
                'id'                    : 'str',
                'id_context'            : 'str',
                'pgef_security_mask'    : 'int',

Index: PanGalactic/pangalactic/enterprise/productversion.py
diff -u PanGalactic/pangalactic/enterprise/productversion.py:1.20 PanGalactic/pangalactic/enterprise/productversion.py:1.21
--- PanGalactic/pangalactic/enterprise/productversion.py:1.20	Thu Oct  2 12:19:57 2003
+++ PanGalactic/pangalactic/enterprise/productversion.py	Fri Oct 17 16:49:53 2003
@@ -1,12 +1,12 @@
-# $Id: productversion.py,v 1.20 2003/10/02 16:19:57 waterbug Exp $
+# $Id: productversion.py,v 1.21 2003/10/17 20:49:53 waterbug Exp $
 
 """
 Version-dependent product data.
 
-@version: $Revision: 1.20 $
+@version: $Revision: 1.21 $
 """
 
-__version__ = "$Revision: 1.20 $"[11:-2]
+__version__ = "$Revision: 1.21 $"[11:-2]
 
 from pangalactic.enterprise.pgefobject import PgefObject
 from pangalactic.enterprise.project import Project
@@ -60,10 +60,12 @@
            'of_pm_id_context'
           ]
     _schema_ext = {
+                       'id'                 : 'int',
                        'of_pm_id'           : 'str',
                        'of_pm_id_context'   : 'str',
                        'project_id'         : 'str',
                        'project_id_context' : 'str',
+                       'tag'                : 'str',
                        'has_docs_flag'      : 'bool'
                       }
     _schema = _schema_ext.copy()

From waterbug at ned.gsfc.nasa.gov  Tue Oct 21 15:45:42 2003
From: waterbug at ned.gsfc.nasa.gov (waterbug CVS)
Date: Tue Oct 21 14:45:45 2003
Subject: [Pangalactic-commits] Only references a DocMaster (_master) now.
Message-ID: <200310211845.h9LIjgwo031675@ned.gsfc.nasa.gov>

Modified files:
PanGalactic/pangalactic/enterprise/document.py 1.11 1.12

Log message:
Only references a DocMaster (_master) now.


Index: PanGalactic/pangalactic/enterprise/document.py
diff -u PanGalactic/pangalactic/enterprise/document.py:1.11 PanGalactic/pangalactic/enterprise/document.py:1.12
--- PanGalactic/pangalactic/enterprise/document.py:1.11	Fri Oct 17 16:49:53 2003
+++ PanGalactic/pangalactic/enterprise/document.py	Tue Oct 21 14:45:40 2003
@@ -1,10 +1,10 @@
-# $Id: document.py,v 1.11 2003/10/17 20:49:53 waterbug Exp $
+# $Id: document.py,v 1.12 2003/10/21 18:45:40 waterbug Exp $
 
 """
 The Mother of all document types in PGEF.
 """
 
-__version__ = "$Revision: 1.11 $"[11:-2]
+__version__ = "$Revision: 1.12 $"[11:-2]
 
 import string
 from pangalactic.enterprise.pgefobject import PgefObject
@@ -54,7 +54,7 @@
     _refd = {
              '_master' : 'DocMaster'
             }
-    _required = ['master', 'current_version']
+    _required = ['master']
     _schema_ext = {
                    'master' : 'str'
                   }
@@ -69,11 +69,6 @@
         for a in kw:
             if a in self._properties:
                 setattr(self, a, kw[a])
-        cv = getattr(self, '_current_version', None)
-        if cv:
-            self._master = cv._of_master
-            self.id = self._master.id
-            self.id_context = self._master.id_context
 
     def deleteAttr(self):
         raise TypeError, 'Cannot delete attribute'

From pbear at ned.gsfc.nasa.gov  Tue Oct 21 18:25:21 2003
From: pbear at ned.gsfc.nasa.gov (pbear CVS)
Date: Tue Oct 21 17:25:24 2003
Subject: [Pangalactic-commits] new document stuff
Message-ID: <200310212125.h9LLPLKw002693@ned.gsfc.nasa.gov>

Modified files:
PanGalactic/pangalactic/client/modules/psm/aboutbox_wdr.py 1.3 1.4
PanGalactic/pangalactic/client/modules/psm/itemeditframe.py 1.106 1.107
PanGalactic/pangalactic/client/modules/psm/pgefdoctree.py 1.19 1.20
PanGalactic/pangalactic/client/modules/psm/pgefedittree.py 1.31 1.32
PanGalactic/pangalactic/client/modules/psm/productdataform.py 1.29 1.30
PanGalactic/pangalactic/client/modules/psm/productdataform.wdr 1.2 1.3
PanGalactic/pangalactic/client/modules/psm/productdataform_wdr.py 1.3 1.4
PanGalactic/pangalactic/client/modules/psm/psmtool.py 1.117 1.118
PanGalactic/pangalactic/client/modules/psm/toolpanel_wdr.py 1.2 1.3
PanGalactic/pangalactic/enterprise/docmaster.py 1.10 1.11
PanGalactic/pangalactic/enterprise/docrep.py 1.13 1.14
PanGalactic/pangalactic/enterprise/document.py 1.12 1.13
PanGalactic/pangalactic/enterprise/docversion.py 1.12 1.13
PanGalactic/pangalactic/enterprise/drfile.py 1.7 1.8
PanGalactic/pangalactic/enterprise/pgefadvisory.py 1.40 1.41
PanGalactic/pangalactic/utils/basegrid.py 1.13 1.14
PanGalactic/pangalactic/utils/datamanager.py 1.48 1.49
PanGalactic/pangalactic/utils/localdb.py 1.41 1.42
PanGalactic/pangalactic/utils/pgefdatatable.py 1.4 1.5
PanGalactic/pangalactic/utils/xmlrpcinterface.py 1.22 1.23

Log message:
new document stuff


Index: PanGalactic/pangalactic/enterprise/docmaster.py
diff -u PanGalactic/pangalactic/enterprise/docmaster.py:1.10 PanGalactic/pangalactic/enterprise/docmaster.py:1.11
--- PanGalactic/pangalactic/enterprise/docmaster.py:1.10	Wed Oct  1 13:35:27 2003
+++ PanGalactic/pangalactic/enterprise/docmaster.py	Tue Oct 21 17:25:18 2003
@@ -1,10 +1,10 @@
-# $Id: docmaster.py,v 1.10 2003/10/01 17:35:27 waterbug Exp $
+# $Id: docmaster.py,v 1.11 2003/10/21 21:25:18 pbear Exp $
 
 """
 Version-independent attributes of a document.
 """
 
-__version__ = "$Revision: 1.10 $"[11:-2]
+__version__ = "$Revision: 1.11 $"[11:-2]
 
 from pangalactic.enterprise.pgefobject import PgefObject
 
@@ -51,4 +51,8 @@
 
     def getDocType(self):
         return self.doc_type_code_context + "_" + self.doc_type_code
+
+    def getPrettyDocType(self):
+        tmpcode = self.doc_type_code.replace("_", " ")
+        return self.doc_type_code_context.upper() + " " + string.capwords(tmpcode)
 

Index: PanGalactic/pangalactic/utils/xmlrpcinterface.py
diff -u PanGalactic/pangalactic/utils/xmlrpcinterface.py:1.22 PanGalactic/pangalactic/utils/xmlrpcinterface.py:1.23
--- PanGalactic/pangalactic/utils/xmlrpcinterface.py:1.22	Thu Oct 16 15:18:30 2003
+++ PanGalactic/pangalactic/utils/xmlrpcinterface.py	Tue Oct 21 17:25:19 2003
@@ -3,10 +3,10 @@
 """
 PanGalactic Client XMLRPC Interfaces
 
-@version: $Revision: 1.22 $
+@version: $Revision: 1.23 $
 """
 
-__version__ = "$Revision: 1.22 $"[11:-2]
+__version__ = "$Revision: 1.23 $"[11:-2]
 
 import xmlrpclib
 import types
@@ -126,13 +126,13 @@
         is the _assembly (the object that contains the _component
         object).
         """
-        #print "in xmlrpcinterface.GetAcusByAssembly"
+        print "in xmlrpcinterface.GetAcusByAssembly"
         acu = ACU(_assembly=assembly)
         keydict = dict([(a, getattr(acu, a)) for a in ACU._fk['_assembly']])
         #print "keydict", keydict
         data = self._RPC.getObjects('AssemblyComponentUsage', 1, 0, keydict)
         if data:
-            #print "have data"
+            print "have acus"
             return self._factory.rememberAll(data)
 
     def GetPerson(self, user_tuple):

Index: PanGalactic/pangalactic/client/modules/psm/pgefedittree.py
diff -u PanGalactic/pangalactic/client/modules/psm/pgefedittree.py:1.31 PanGalactic/pangalactic/client/modules/psm/pgefedittree.py:1.32
--- PanGalactic/pangalactic/client/modules/psm/pgefedittree.py:1.31	Wed Oct  8 11:30:46 2003
+++ PanGalactic/pangalactic/client/modules/psm/pgefedittree.py	Tue Oct 21 17:25:18 2003
@@ -89,7 +89,7 @@
 
     def LoadTreefromObjects(self, datamanager, rootitemid, rootnauoid, currentdata = None, product_type = None):
         """Loads the tree from the dicts in the DataManager"""
-        #print "pgefedittree: loadtreefromobjects"
+        print "pgefedittree.loadtreefromobjects"
 
         #print "refresh: " + str(self.DataManager.refresh)
         self.DeleteAllItems()
@@ -164,7 +164,7 @@
 
         else:
             if self.DataManager.inLocalMode:
-                #print "localmode", self.DataManager.currentProject
+                print "localmode", self.DataManager.currentProject
                 localnauos = self.DataManager.localDB.GetLocalNauos(self.DataManager.currentProject)
                 #print "localnauos"
                 #import pprint
@@ -175,7 +175,7 @@
                 #print "NauoNodes", NauoNodes
 
             else:
-                #print "logged in"
+                print "logged in"
                 if self.DataManager.nauoIDs.has_key(lookupid):
                     #import pprint
                     #print "NauoIDs"
@@ -184,7 +184,7 @@
                     NauoLookup = self.DataManager.nauoIDs[lookupid]
                     #print "NauoLookup"
                     #pprint.pprint(NauoLookup)
-                    NauoNodes = NauoLookup[tmpnauoid]  ## ??? needs checking when we can login
+                    NauoNodes = NauoLookup[tmpnauoid]  ## ??? tbd. needs checking when we can login
 
                 else:
                     print "pgefedittree.loadtreefromobjects logged in; no match for lookupid", lookupid
@@ -218,5 +218,7 @@
             self.SelectItem(highlightednode)
         else:
             self.SelectItem(rootnode)
+
+        print "end pgefedittree.loadtreefromobjects"
 
 

Index: PanGalactic/pangalactic/enterprise/docrep.py
diff -u PanGalactic/pangalactic/enterprise/docrep.py:1.13 PanGalactic/pangalactic/enterprise/docrep.py:1.14
--- PanGalactic/pangalactic/enterprise/docrep.py:1.13	Wed Oct  1 13:35:27 2003
+++ PanGalactic/pangalactic/enterprise/docrep.py	Tue Oct 21 17:25:18 2003
@@ -1,10 +1,10 @@
-# $Id: docrep.py,v 1.13 2003/10/01 17:35:27 waterbug Exp $
+# $Id: docrep.py,v 1.14 2003/10/21 21:25:18 pbear Exp $
 
 """
 A representation or format of a document.
 """
 
-__version__ = "$Revision: 1.13 $"[11:-2]
+__version__ = "$Revision: 1.14 $"[11:-2]
 
 from pangalactic.enterprise.pgefobject import PgefObject
 from pangalactic.enterprise.docversion import DocVersion as DV
@@ -59,28 +59,20 @@
     _schema.update(PgefObject._schema)
     _std_abbrev = 'dr'
 
-    def __init__(self, email=None, schema=_schema,
-                 dv=None, **kw):
+    def __init__(self, _of_version, email=None, schema=_schema, **kw):
         # PgefObject.__init__() creates the pgef_oid ...
-        PgefObject.__init__(self, email=email, 
-                            schema=schema, **kw)
-        # if a DocVersion (dv) is passed in, use it ...
-        if dv.__class__.__name__ == 'DocVersion':
-            self._of_version = dv
-        # if not, create one ...
-        else:
-            dvid = kw.get('of_dv_id', '1')
-            dvdmid = kw.get('of_dm_id', 'Default Doc ID')
-            dvdmidc = kw.get('of_dm_id_context', 'PGER')
-            self._of_version = DV(email=email,
-                                  id=dvid,
-                                  of_dm_id=dvdmid,
-                                  of_dm_id_context=dvdmidc)
+        PgefObject.__init__(self, email=email, schema=schema, **kw)
+
+        try:
+            assert _of_version.__class__.__name__ == 'DocVersion'
+        except:
+            raise TypeError, "Expecting DocVersion instance as second argument"
+
+        self._of_version = _of_version
         # set "foreign key" attributes from referenced dv ...
         self.of_dv_id = self._of_version.id
         self.of_dm_id = self._of_version.of_dm_id
         self.of_dm_id_context = self._of_version.of_dm_id_context
-        # set "convenience" attribute referencing DocMaster ...
-        self._of_master = self._of_version._of_master
+
 
 

Index: PanGalactic/pangalactic/utils/pgefdatatable.py
diff -u PanGalactic/pangalactic/utils/pgefdatatable.py:1.4 PanGalactic/pangalactic/utils/pgefdatatable.py:1.5
--- PanGalactic/pangalactic/utils/pgefdatatable.py:1.4	Wed Oct  1 13:24:14 2003
+++ PanGalactic/pangalactic/utils/pgefdatatable.py	Tue Oct 21 17:25:19 2003
@@ -129,6 +129,12 @@
 
     #--------------------------------------------------
     # Methods added for pgef purposes.
+
+    def getObject(self, row):
+        temp_obj = self._data[row]
+        return temp_obj
+    
+
     def GetObjectOid(self, row):
         temp_obj = self._data[row]
         try:

Index: PanGalactic/pangalactic/enterprise/drfile.py
diff -u PanGalactic/pangalactic/enterprise/drfile.py:1.7 PanGalactic/pangalactic/enterprise/drfile.py:1.8
--- PanGalactic/pangalactic/enterprise/drfile.py:1.7	Wed Oct  1 13:35:27 2003
+++ PanGalactic/pangalactic/enterprise/drfile.py	Tue Oct 21 17:25:18 2003
@@ -1,10 +1,10 @@
-# $Id: drfile.py,v 1.7 2003/10/01 17:35:27 waterbug Exp $
+# $Id: drfile.py,v 1.8 2003/10/21 21:25:18 pbear Exp $
 
 """
 A file that contains an instance of a document.
 """
 
-__version__ = "$Revision: 1.7 $"[11:-2]
+__version__ = "$Revision: 1.8 $"[11:-2]
 
 from pangalactic.enterprise.pgeffile import PgefFile
 from pangalactic.enterprise.docversion import DocVersion as DV
@@ -46,26 +46,20 @@
     _schema.update(PgefFile._schema)
     _std_abbrev = 'df'
 
-    def __init__(self, email=None, schema=_schema, 
-                 dr=None, **kw):
-        PgefFile.__init__(self, email=email,
-                          schema=schema, **kw)
-        # if a dv is passed in, use it ...
-        if dr.__class__.__name__ == 'DocRep':
-            self._of_dr = dr
-        else:
-            # if not, create one ...
-            drid      = kw.get('of_dr_id', '1')
-            dvid      = kw.get('of_dv_id', '1')
-            dvdmid    = kw.get('of_dm_id', 
-                               'Document Master Identifier')
-            dvdmidc   = kw.get('of_dm_id_context', 'PGER')
-            self._of_dr = DR(id=drid,
-                             of_dv_id=dvid,
-                             of_dm_id=dvdmid,
-                             of_dm_id_context=dvdmidc)
+    def __init__(self, _of_dr, email=None, schema=_schema, **kw):
+        PgefFile.__init__(self, email=email, schema=schema, **kw)
+
+        try:
+            assert _of_dr.__class__.__name__ == 'DocRep'
+        except:
+            raise TypeError, "Expecting a DocRep instance as argument 2"
+
+        self._of_dr = dr
         # pull in _of_master from the _of_version so we don't
         # have to go nuts with blah.blah.blah to get to
         # attributes of my parents ...
-        self._of_master = self._of_version._of_master
+        self.of_dm_id = self._of_dr._of_version._of_master.id
+        self.of_dm_id_context = self._of_dr._of_version._of_master.id_context
+        self.of_dv_id = self._of_dr._of_version.id
+        self.of_dr_id = self._of_dr.id
 

Index: PanGalactic/pangalactic/enterprise/pgefadvisory.py
diff -u PanGalactic/pangalactic/enterprise/pgefadvisory.py:1.40 PanGalactic/pangalactic/enterprise/pgefadvisory.py:1.41
--- PanGalactic/pangalactic/enterprise/pgefadvisory.py:1.40	Thu Oct 16 17:19:44 2003
+++ PanGalactic/pangalactic/enterprise/pgefadvisory.py	Tue Oct 21 17:25:18 2003
@@ -1,11 +1,11 @@
-# $Id: pgefadvisory.py,v 1.40 2003/10/16 21:19:44 pbear Exp $
+# $Id: pgefadvisory.py,v 1.41 2003/10/21 21:25:18 pbear Exp $
 
 """
 Base class for documents that report conditions related to the
 usability of a product.
 """
 
-__version__ = "$Revision: 1.40 $"[11:-2]
+__version__ = "$Revision: 1.41 $"[11:-2]
 
 import os.path
 import string
@@ -67,7 +67,7 @@
 # leave this here...  I use it to generate old data -vwk
 #
 #        now = mx.DateTime.DateFromTicks(mx.DateTime.now())
-#        earlier = now + mx.DateTime.RelativeDateTime(days=-45)
+#        earlier = now + mx.DateTime.RelativeDateTime(days=-40)
 #        self.pger_create_datetime = earlier
 #        self.pger_mod_datetime    = earlier
 #        self.create_datetime      = earlier

Index: PanGalactic/pangalactic/client/modules/psm/toolpanel_wdr.py
diff -u PanGalactic/pangalactic/client/modules/psm/toolpanel_wdr.py:1.2 PanGalactic/pangalactic/client/modules/psm/toolpanel_wdr.py:1.3
--- PanGalactic/pangalactic/client/modules/psm/toolpanel_wdr.py:1.2	Tue Sep 16 15:11:53 2003
+++ PanGalactic/pangalactic/client/modules/psm/toolpanel_wdr.py	Tue Oct 21 17:25:18 2003
@@ -8,9 +8,9 @@
 
 # Window functions
 
-ID_TEXT = 10000
-ID_PROJECT = 10001
-ID_ITEM = 10002
+ID_TEXT = wxNewId()
+ID_PROJECT = wxNewId()
+ID_ITEM = wxNewId()
 
 def TopPanelFunc( parent, call_fit = true, set_sizer = true ):
     item0 = wxFlexGridSizer( 0, 7, 0, 0 )

Index: PanGalactic/pangalactic/utils/basegrid.py
diff -u PanGalactic/pangalactic/utils/basegrid.py:1.13 PanGalactic/pangalactic/utils/basegrid.py:1.14
--- PanGalactic/pangalactic/utils/basegrid.py:1.13	Thu Oct  2 15:31:23 2003
+++ PanGalactic/pangalactic/utils/basegrid.py	Tue Oct 21 17:25:19 2003
@@ -425,4 +425,7 @@
     def GetObjectOid(self, row):
         return self.table.GetObjectOid(row)
                 
+    def getObject(self, row):
+        return self.table.getObject(row)
+                
 

Index: PanGalactic/pangalactic/client/modules/psm/aboutbox_wdr.py
diff -u PanGalactic/pangalactic/client/modules/psm/aboutbox_wdr.py:1.3 PanGalactic/pangalactic/client/modules/psm/aboutbox_wdr.py:1.4
--- PanGalactic/pangalactic/client/modules/psm/aboutbox_wdr.py:1.3	Wed Oct 15 11:03:19 2003
+++ PanGalactic/pangalactic/client/modules/psm/aboutbox_wdr.py	Tue Oct 21 17:25:18 2003
@@ -11,13 +11,13 @@
 
 # Window functions
 
-ID_TEXT = 10000
-ID_VERSION = 10001
-ID_BUILD_DATE = 10002
-ID_BUTTON_ABOUTOK = 10003
-ID_LINE = 10004
-ID_STATICBITMAP_PYTHON = 10005
-ID_STATICBITMAP_WXPYTHON = 10006
+ID_TEXT = wxNewId()
+ID_VERSION = wxNewId()
+ID_BUILD_DATE = wxNewId()
+ID_BUTTON_ABOUTOK = wxNewId()
+ID_LINE = wxNewId()
+ID_STATICBITMAP_PYTHON = wxNewId()
+ID_STATICBITMAP_WXPYTHON = wxNewId()
 
 def AboutFunc( parent, call_fit = True, set_sizer = True ):
     item0 = wxBoxSizer( wxVERTICAL )

Index: PanGalactic/pangalactic/client/modules/psm/pgefdoctree.py
diff -u PanGalactic/pangalactic/client/modules/psm/pgefdoctree.py:1.19 PanGalactic/pangalactic/client/modules/psm/pgefdoctree.py:1.20
--- PanGalactic/pangalactic/client/modules/psm/pgefdoctree.py:1.19	Wed Oct  8 11:30:46 2003
+++ PanGalactic/pangalactic/client/modules/psm/pgefdoctree.py	Tue Oct 21 17:25:18 2003
@@ -47,21 +47,37 @@
         self.DeleteAllItems()
         self.nodeStack.append(self.AddRoot("Documents"))
         rootnode = self.GetRootItem()
+
+    def getTreeLabelForProduct(self, obj):
+        classname = obj.__class__.__name__
+        if classname == "ProductMaster":
+            foo = obj.id
+        elif classname == "ProductModelMaster":
+            foo = obj.of_pm_id + "." + obj.of_pv_id
+        elif classname == "ProductVersion":
+            foo = obj.of_pm_id + "." + obj.id
+        elif classname == "ProductModelVersion":
+            foo = obj.of_pm_id + "." + obj.of_pv_id
+        return foo
         
     def LoadTreefromPartsLists(self, datamanager, rootitemid, rootpdrid, currentdata):
         """Loads the tree from the dicts in the DataManager"""
-
         #print "pgefdoctree: loadtreefrompls"
         self.DeleteAllItems()
         rootitem = datamanager.localDB.GetItem(rootitemid)
-        foo = rootitem.of_pm_id + "." + rootitem.of_pv_id
+
+        #foo = rootitem.of_pm_id + "." + rootitem.of_pv_id
+        foo = self.getTreeLabelForProduct(rootitem)
         self.nodeStack.append(self.AddRoot(foo))
         rootnode = self.GetRootItem()
 
+        if rootitem.__class__.__name__ <> "ProductModelVersion":
+            print "No partslist tree to build yet (not a pmv)"
+            return
+        
         if rootitem.has_parts_lists_flag:
             if datamanager.user._loggedin:
                 if not self.IsExpanded(rootnode): 
-
                     #print "call getpdrs"
                     datamanager.getPDRByItemID([rootitemid])
 
@@ -69,7 +85,6 @@
         self.SetItemImage(rootnode, self.itemicon)
         self.SetItemImage(rootnode, self.itemicon, wxTreeItemIcon_Selected)
 
-
         lookupid = rootitemid
         tmppdrid = rootpdrid
 
@@ -110,7 +125,6 @@
             #print "pdrobj", pdrobj
             plobj = datamanager.localDB.GetPartsList(pdrobj.document)
 
-
             if plobj:
                 treeid = self.AppendItem(rootnode, plobj.id)
                 self.SetPyData(treeid, [pdrobj.pgef_oid, plobj.pgef_oid])
@@ -119,24 +133,19 @@
 
                 if currentdata:
                     if plobj.pgef_oid == currentdata[1] and pdrobj.pgef_oid == currentdata[0]:
-
                         highlightednode = treeid
 
         #print "childcount", childcount
         if childcount > 0:
-
             self.SetItemHasChildren(rootnode, true)
             
         self.SortChildren(rootnode)
-
-
         self.Expand(rootnode)
-        if highlightednode:
 
+        if highlightednode:
             self.SelectItem(highlightednode)
         else:
             self.SelectItem(rootnode)
-
         #print "end pgefdoctree.loadtreefrompartslists"
 
 
@@ -147,7 +156,8 @@
 
         self.DeleteAllItems()
         rootitem = datamanager.localDB.GetItem(rootitemid)
-        foo = rootitem.of_pm_id + "." + rootitem.of_pv_id
+        foo = self.getTreeLabelForProduct(rootitem)
+        #foo = rootitem.of_pm_id + "." + rootitem.of_pv_id
         self.nodeStack.append(self.AddRoot(foo))
         rootnode = self.GetRootItem()
 
@@ -156,17 +166,18 @@
         self.SetItemImage(rootnode, self.itemicon, wxTreeItemIcon_Selected)
         self.SelectItem(rootnode)
 
+        if rootitem.__class__.__name__ <> "ProductModelVersion":
+            print "No document tree to build yet (not a pmv)"
+            return
+        
         if rootitem.has_parts_lists_flag:
             #print "has docs"
             if datamanager.user._loggedin:
                 #print "logged in"
                 if not self.IsExpanded(rootnode):
                     #print "calling getpdrs"
-
                     datamanager.getPDRByItemID([rootitemid])
 
-
-
         lookupid = rootitemid
         tmppdrid = rootpdrid
 
@@ -219,21 +230,16 @@
             docobj = datamanager.localDB.GetDocument(pdrobj.document)
             #print "back from getdocument"
 
-
-
             if docobj:
                 #print "found doc in zodb"
-
                 treeid = self.AppendItem(rootnode, docobj.id)
                 self.SetPyData(treeid, [pdrobj.pgef_oid, docobj.pgef_oid])
                 self.SetItemImage(treeid, self.documenticon)
                 self.SetItemImage(treeid, self.documenticon, wxTreeItemIcon_Selected)
 
-
                 if currentdata:
                     # print "currentdata"
                     if docobj.pgef_oid == currentdata[1] and pdrobj.pgef_oid == currentdata[0]:
-
                         highlightednode = treeid
 
 #            else:
@@ -241,15 +247,12 @@
 
         if childcount > 0:
             #print "set child flag on"
-
             self.SetItemHasChildren(rootnode, true)
             
         self.SortChildren(rootnode)
 
-
         self.Expand(rootnode)
         if highlightednode:
-
             self.SelectItem(highlightednode)
         else:
             self.SelectItem(rootnode)

Index: PanGalactic/pangalactic/client/modules/psm/productdataform_wdr.py
diff -u PanGalactic/pangalactic/client/modules/psm/productdataform_wdr.py:1.3 PanGalactic/pangalactic/client/modules/psm/productdataform_wdr.py:1.4
--- PanGalactic/pangalactic/client/modules/psm/productdataform_wdr.py:1.3	Fri Apr  4 13:43:27 2003
+++ PanGalactic/pangalactic/client/modules/psm/productdataform_wdr.py	Tue Oct 21 17:25:18 2003
@@ -3,8 +3,11 @@
 # Do not modify this file, all changes will be lost!
 #-----------------------------------------------------------------------------
 
+# -*- coding: iso-8859-1 -*-
+
 # Include wxWindows' modules
 from wxPython.wx import *
+from wxPython.grid import *
 
 # Window functions
 
@@ -30,7 +33,7 @@
 DELETE_MM_MV = wxNewId()
 ID_MM_MV_CLOSE = wxNewId()
 
-def PMM_PMV_Func( parent, call_fit = true, set_sizer = true ):
+def PMM_PMV_Func( parent, call_fit = True, set_sizer = True ):
     item0 = wxBoxSizer( wxVERTICAL )
     
     item1 = wxBoxSizer( wxVERTICAL )
@@ -39,27 +42,29 @@
     
     item3 = wxBoxSizer( wxHORIZONTAL )
     
-    item4 = wxBoxSizer( wxVERTICAL )
+    item4 = wxBoxSizer( wxHORIZONTAL )
     
     item5 = wxStaticText( parent, ID_TEXT, "Part Number:", wxDefaultPosition, wxDefaultSize, 0 )
     item4.AddWindow( item5, 0, wxALIGN_CENTER_VERTICAL|wxLEFT|wxRIGHT, 5 )
 
-    item6 = wxTextCtrl( parent, ID_PART_NUMBER, "", wxDefaultPosition, wxSize(180,-1), 0 )
-    item4.AddWindow( item6, 0, wxALIGN_CENTER_VERTICAL|wxLEFT|wxRIGHT, 5 )
+    item6 = wxStaticText( parent, ID_PART_NUMBER, "                                 ", wxDefaultPosition, wxDefaultSize, 0 )
+    item6.SetForegroundColour( wxBLUE )
+    item4.AddWindow( item6, 0, wxALIGN_CENTER|wxALL, 5 )
 
-    item3.AddSizer( item4, 0, wxALIGN_CENTRE|wxLEFT|wxRIGHT, 5 )
+    item3.AddSizer( item4, 0, wxALIGN_CENTER_VERTICAL|wxLEFT, 5 )
 
-    item7 = wxBoxSizer( wxVERTICAL )
+    item7 = wxBoxSizer( wxHORIZONTAL )
     
     item8 = wxStaticText( parent, ID_TEXT, "Version:", wxDefaultPosition, wxDefaultSize, 0 )
     item7.AddWindow( item8, 0, wxALIGN_CENTER_VERTICAL|wxLEFT|wxRIGHT, 5 )
 
-    item9 = wxTextCtrl( parent, ID_VERSION, "", wxDefaultPosition, wxSize(160,-1), 0 )
-    item7.AddWindow( item9, 0, wxALIGN_CENTER_VERTICAL|wxLEFT|wxRIGHT, 5 )
+    item9 = wxStaticText( parent, ID_VERSION, "                           ", wxDefaultPosition, wxDefaultSize, 0 )
+    item9.SetForegroundColour( wxBLUE )
+    item7.AddWindow( item9, 0, wxALIGN_CENTER|wxALL, 5 )
 
-    item3.AddSizer( item7, 0, wxALIGN_CENTRE|wxLEFT|wxRIGHT, 5 )
+    item3.AddSizer( item7, 0, wxALIGN_CENTER_VERTICAL|wxLEFT, 5 )
 
-    item2.AddSizer( item3, 0, wxALIGN_CENTRE|wxLEFT|wxRIGHT|wxBOTTOM, 5 )
+    item2.AddSizer( item3, 0, wxGROW|wxALIGN_CENTER_VERTICAL|wxALL, 5 )
 
     item10 = wxBoxSizer( wxHORIZONTAL )
     
@@ -173,40 +178,40 @@
     
     item42 = wxButton( parent, ID_NEW_MM_MV, "New", wxDefaultPosition, wxDefaultSize, 0 )
     item42.SetToolTip( wxToolTip("Create a new component in the currently selected project") )
-    item41.AddWindow( item42, 0, wxALIGN_CENTRE|wxLEFT, 5 )
+    item41.AddWindow( item42, 0, wxALIGN_CENTER|wxLEFT, 5 )
 
     item43 = wxButton( parent, ID_EDIT_MM_MV, "Edit", wxDefaultPosition, wxDefaultSize, 0 )
     item43.SetToolTip( wxToolTip("Edit the selected component") )
-    item41.AddWindow( item43, 0, wxALIGN_CENTRE, 5 )
+    item41.AddWindow( item43, 0, wxALIGN_CENTER, 5 )
 
     item44 = wxButton( parent, ID_SAVE_MM_MV, "Save", wxDefaultPosition, wxDefaultSize, 0 )
     item44.SetToolTip( wxToolTip("Save the component to local storage") )
-    item41.AddWindow( item44, 0, wxALIGN_CENTRE, 5 )
+    item41.AddWindow( item44, 0, wxALIGN_CENTER, 5 )
 
     item45 = wxButton( parent, ID_RESET_MM_MV_FORM, "Cancel", wxDefaultPosition, wxDefaultSize, 0 )
     item45.SetToolTip( wxToolTip("Reset (clear) the fields for an unsaved component") )
-    item41.AddWindow( item45, 0, wxALIGN_CENTRE|wxRIGHT, 5 )
+    item41.AddWindow( item45, 0, wxALIGN_CENTER|wxRIGHT, 5 )
 
     item46 = wxButton( parent, DELETE_MM_MV, "Delete", wxDefaultPosition, wxDefaultSize, 0 )
     item46.SetToolTip( wxToolTip("Delete the association between the parent and child components") )
-    item41.AddWindow( item46, 0, wxALIGN_CENTRE|wxLEFT|wxRIGHT, 5 )
+    item41.AddWindow( item46, 0, wxALIGN_CENTER|wxLEFT|wxRIGHT, 5 )
 
-    item40.AddSizer( item41, 0, wxALIGN_CENTRE|wxALL, 5 )
+    item40.AddSizer( item41, 0, wxALIGN_CENTER|wxALL, 5 )
 
     item47 = wxBoxSizer( wxHORIZONTAL )
     
     item48 = wxButton( parent, ID_MM_MV_CLOSE, "Close", wxDefaultPosition, wxDefaultSize, 0 )
     item48.SetToolTip( wxToolTip("Close the window") )
-    item47.AddWindow( item48, 0, wxALIGN_CENTRE|wxRIGHT, 5 )
+    item47.AddWindow( item48, 0, wxALIGN_CENTER|wxRIGHT, 5 )
 
-    item40.AddSizer( item47, 0, wxALIGN_CENTRE|wxALL, 5 )
+    item40.AddSizer( item47, 0, wxALIGN_CENTER|wxALL, 5 )
 
-    item0.AddSizer( item40, 0, wxALIGN_CENTRE|wxLEFT|wxRIGHT|wxBOTTOM, 0 )
+    item0.AddSizer( item40, 0, wxALIGN_CENTER|wxLEFT|wxRIGHT|wxBOTTOM, 0 )
 
-    if set_sizer == true:
-        parent.SetAutoLayout( true )
+    if set_sizer == True:
+        parent.SetAutoLayout( True )
         parent.SetSizer( item0 )
-        if call_fit == true:
+        if call_fit == True:
             item0.Fit( parent )
             item0.SetSizeHints( parent )
     
@@ -231,7 +236,7 @@
 DELETE_M_V = wxNewId()
 ID_M_V_CLOSE = wxNewId()
 
-def PM_PV_Func( parent, call_fit = true, set_sizer = true ):
+def PM_PV_Func( parent, call_fit = True, set_sizer = True ):
     item0 = wxBoxSizer( wxVERTICAL )
     
     item1 = wxBoxSizer( wxHORIZONTAL )
@@ -350,40 +355,40 @@
     
     item35 = wxButton( parent, ID_NEW_M_V, "New", wxDefaultPosition, wxDefaultSize, 0 )
     item35.SetToolTip( wxToolTip("Create a new component in the currently selected project") )
-    item34.AddWindow( item35, 0, wxALIGN_CENTRE|wxLEFT, 5 )
+    item34.AddWindow( item35, 0, wxALIGN_CENTER|wxLEFT, 5 )
 
     item36 = wxButton( parent, ID_EDIT_M_V, "Edit", wxDefaultPosition, wxDefaultSize, 0 )
     item36.SetToolTip( wxToolTip("Edit the selected component") )
-    item34.AddWindow( item36, 0, wxALIGN_CENTRE, 5 )
+    item34.AddWindow( item36, 0, wxALIGN_CENTER, 5 )
 
     item37 = wxButton( parent, ID_SAVE_M_V, "Save", wxDefaultPosition, wxDefaultSize, 0 )
     item37.SetToolTip( wxToolTip("Save the component to local storage") )
-    item34.AddWindow( item37, 0, wxALIGN_CENTRE, 5 )
+    item34.AddWindow( item37, 0, wxALIGN_CENTER, 5 )
 
     item38 = wxButton( parent, ID_RESET_M_V_FORM, "Cancel", wxDefaultPosition, wxDefaultSize, 0 )
     item38.SetToolTip( wxToolTip("Reset (clear) the fields for an unsaved component") )
-    item34.AddWindow( item38, 0, wxALIGN_CENTRE|wxRIGHT, 5 )
+    item34.AddWindow( item38, 0, wxALIGN_CENTER|wxRIGHT, 5 )
 
     item39 = wxButton( parent, DELETE_M_V, "Delete", wxDefaultPosition, wxDefaultSize, 0 )
     item39.SetToolTip( wxToolTip("Delete the association between the parent and child components") )
-    item34.AddWindow( item39, 0, wxALIGN_CENTRE|wxLEFT|wxRIGHT, 5 )
+    item34.AddWindow( item39, 0, wxALIGN_CENTER|wxLEFT|wxRIGHT, 5 )
 
-    item33.AddSizer( item34, 0, wxALIGN_CENTRE|wxALL, 5 )
+    item33.AddSizer( item34, 0, wxALIGN_CENTER|wxALL, 5 )
 
     item40 = wxBoxSizer( wxHORIZONTAL )
     
     item41 = wxButton( parent, ID_M_V_CLOSE, "Close", wxDefaultPosition, wxDefaultSize, 0 )
     item41.SetToolTip( wxToolTip("Close the window") )
-    item40.AddWindow( item41, 0, wxALIGN_CENTRE|wxRIGHT, 5 )
+    item40.AddWindow( item41, 0, wxALIGN_CENTER|wxRIGHT, 5 )
 
-    item33.AddSizer( item40, 0, wxALIGN_CENTRE|wxALL, 5 )
+    item33.AddSizer( item40, 0, wxALIGN_CENTER|wxALL, 5 )
 
-    item0.AddSizer( item33, 0, wxALIGN_CENTRE|wxLEFT|wxRIGHT|wxBOTTOM, 0 )
+    item0.AddSizer( item33, 0, wxALIGN_CENTER|wxLEFT|wxRIGHT|wxBOTTOM, 0 )
 
-    if set_sizer == true:
-        parent.SetAutoLayout( true )
+    if set_sizer == True:
+        parent.SetAutoLayout( True )
         parent.SetSizer( item0 )
-        if call_fit == true:
+        if call_fit == True:
             item0.Fit( parent )
             item0.SetSizeHints( parent )
     

Index: PanGalactic/pangalactic/client/modules/psm/productdataform.py
diff -u PanGalactic/pangalactic/client/modules/psm/productdataform.py:1.29 PanGalactic/pangalactic/client/modules/psm/productdataform.py:1.30
--- PanGalactic/pangalactic/client/modules/psm/productdataform.py:1.29	Thu Oct  9 13:05:17 2003
+++ PanGalactic/pangalactic/client/modules/psm/productdataform.py	Tue Oct 21 17:25:18 2003
@@ -19,7 +19,7 @@
 class PM_PV_Form(wxPanel, Security_Mixin):
     def __init__(self, parent, id, state,
         pos = wxPyDefaultPosition, size = wxPyDefaultSize,
-        style = wxTAB_TRAVERSAL ):
+        style = wxTAB_TRAVERSAL):
         wxPanel.__init__(self, parent, id, pos, size, style)
         self.parent = parent
         self.State = state
@@ -30,7 +30,7 @@
         self.temp_pm = None
         self.temp_pv = None
         
-        PM_PV_Func( self, true )
+        PM_PV_Func(self, true)
         
         # WDR: handler declarations for PM_PV_Form
         EVT_RADIOBUTTON(self, ID_TOGGLE_PV, self.Select_PV)
@@ -39,58 +39,58 @@
     # WDR: methods for PM_PV_Form
 
     def GetPvRevision(self):
-        return wxPyTypeCast( self.FindWindowById(ID_PV_REVISION), "wxTextCtrl" )
+        return wxPyTypeCast(self.FindWindowById(ID_PV_REVISION), "wxTextCtrl")
 
     def GetButtonMVClose(self):
-        return wxPyTypeCast( self.FindWindowById(ID_BUTTON_M_V_CLOSE), "wxButton" )
+        return wxPyTypeCast(self.FindWindowById(ID_BUTTON_M_V_CLOSE), "wxButton")
 
     def GetDeleteMVForm(self):
-        return wxPyTypeCast( self.FindWindowById(DELETE_M_V), "wxButton" )
+        return wxPyTypeCast(self.FindWindowById(DELETE_M_V), "wxButton")
 
     def GetResetMVForm(self):
-        return wxPyTypeCast( self.FindWindowById(ID_RESET_M_V_FORM), "wxButton" )
+        return wxPyTypeCast(self.FindWindowById(ID_RESET_M_V_FORM), "wxButton")
 
     def GetSaveMV(self):
-        return wxPyTypeCast( self.FindWindowById(ID_SAVE_M_V), "wxButton" )
+        return wxPyTypeCast(self.FindWindowById(ID_SAVE_M_V), "wxButton")
 
     def GetEditMV(self):
-        return wxPyTypeCast( self.FindWindowById(ID_EDIT_M_V), "wxButton" )
+        return wxPyTypeCast(self.FindWindowById(ID_EDIT_M_V), "wxButton")
 
     def GetNewMV(self):
-        return wxPyTypeCast( self.FindWindowById(ID_NEW_M_V), "wxButton" )
+        return wxPyTypeCast(self.FindWindowById(ID_NEW_M_V), "wxButton")
 
     def GetPvDesc(self):
-        return wxPyTypeCast( self.FindWindowById(ID_PV_DESC), "wxTextCtrl" )
+        return wxPyTypeCast(self.FindWindowById(ID_PV_DESC), "wxTextCtrl")
 
     def GetPvNomenclature(self):
-        return wxPyTypeCast( self.FindWindowById(ID_PV_NOMENCLATURE), "wxTextCtrl" )
+        return wxPyTypeCast(self.FindWindowById(ID_PV_NOMENCLATURE), "wxTextCtrl")
 
     def GetPvPoc(self):
-        return wxPyTypeCast( self.FindWindowById(ID_PV_POC), "wxTextCtrl" )
+        return wxPyTypeCast(self.FindWindowById(ID_PV_POC), "wxTextCtrl")
 
     def GetPvName(self):
-        return wxPyTypeCast( self.FindWindowById(ID_PV_NAME), "wxTextCtrl" )
+        return wxPyTypeCast(self.FindWindowById(ID_PV_NAME), "wxTextCtrl")
 
     def GetPmDesc(self):
-        return wxPyTypeCast( self.FindWindowById(ID_PM_DESC), "wxTextCtrl" )
+        return wxPyTypeCast(self.FindWindowById(ID_PM_DESC), "wxTextCtrl")
 
     def GetPmNomenclature(self):
-        return wxPyTypeCast( self.FindWindowById(ID_PM_NOMENCLATURE), "wxTextCtrl" )
+        return wxPyTypeCast(self.FindWindowById(ID_PM_NOMENCLATURE), "wxTextCtrl")
 
     def GetPmPoc(self):
-        return wxPyTypeCast( self.FindWindowById(ID_PM_POC), "wxTextCtrl" )
+        return wxPyTypeCast(self.FindWindowById(ID_PM_POC), "wxTextCtrl")
 
     def GetPmName(self):
-        return wxPyTypeCast( self.FindWindowById(ID_PM_NAME), "wxTextCtrl" )
+        return wxPyTypeCast(self.FindWindowById(ID_PM_NAME), "wxTextCtrl")
 
     def GetPmIdentifier(self):
-        return wxPyTypeCast( self.FindWindowById(ID_PM_IDENTIFIER), "wxTextCtrl" )
+        return wxPyTypeCast(self.FindWindowById(ID_PM_IDENTIFIER), "wxTextCtrl")
 
     def GetTogglePv(self):
-        return wxPyTypeCast( self.FindWindowById(ID_TOGGLE_PV), "wxRadioButton" )
+        return wxPyTypeCast(self.FindWindowById(ID_TOGGLE_PV), "wxRadioButton")
 
     def GetTogglePm(self):
-        return wxPyTypeCast( self.FindWindowById(ID_TOGGLE_PM), "wxRadioButton" )
+        return wxPyTypeCast(self.FindWindowById(ID_TOGGLE_PM), "wxRadioButton")
     
     def ClearCreateEditFlags(self):
         self.CreatingProductMaster = 0
@@ -375,7 +375,7 @@
 class PMM_PMV_Form(wxPanel, Security_Mixin):
     def __init__(self, parent, id,state,
         pos = wxPyDefaultPosition, size = wxPyDefaultSize,
-        style = wxTAB_TRAVERSAL ):
+        style = wxTAB_TRAVERSAL):
         wxPanel.__init__(self, parent, id, pos, size, style)
         self.parent = parent
         self.State = state 
@@ -386,7 +386,7 @@
         self.temp_pmm = None
         self.temp_pmv = None
         
-        PMM_PMV_Func( self, true )
+        PMM_PMV_Func(self, true)
         
         # WDR: handler declarations for PMM_PMV_Form
         EVT_RADIOBUTTON(self, ID_TOGGLE_PMV, self.Select_PMV)
@@ -395,64 +395,64 @@
     # WDR: methods for PMM_PMV_Form
 
     def GetMmMvClose(self):
-        return wxPyTypeCast( self.FindWindowById(ID_MM_MV_CLOSE), "wxButton" )
+        return wxPyTypeCast(self.FindWindowById(ID_MM_MV_CLOSE), "wxButton")
 
     def GetDeleteMmMvForm(self):
-        return wxPyTypeCast( self.FindWindowById(DELETE_MM_MV), "wxButton" )
+        return wxPyTypeCast(self.FindWindowById(DELETE_MM_MV), "wxButton")
 
     def GetResetMmMvForm(self):
-        return wxPyTypeCast( self.FindWindowById(ID_RESET_MM_MV_FORM), "wxButton" )
+        return wxPyTypeCast(self.FindWindowById(ID_RESET_MM_MV_FORM), "wxButton")
 
     def GetSaveMmMv(self):
-        return wxPyTypeCast( self.FindWindowById(ID_SAVE_MM_MV), "wxButton" )
+        return wxPyTypeCast(self.FindWindowById(ID_SAVE_MM_MV), "wxButton")
 
     def GetEditMmMv(self):
-        return wxPyTypeCast( self.FindWindowById(ID_EDIT_MM_MV), "wxButton" )
+        return wxPyTypeCast(self.FindWindowById(ID_EDIT_MM_MV), "wxButton")
 
     def GetNewMmMv(self):
-        return wxPyTypeCast( self.FindWindowById(ID_NEW_MM_MV), "wxButton" )
+        return wxPyTypeCast(self.FindWindowById(ID_NEW_MM_MV), "wxButton")
 
     def GetPmvDesc(self):
-        return wxPyTypeCast( self.FindWindowById(ID_PMV_DESC), "wxTextCtrl" )
+        return wxPyTypeCast(self.FindWindowById(ID_PMV_DESC), "wxTextCtrl")
 
     def GetPmvNomenclature(self):
-        return wxPyTypeCast( self.FindWindowById(ID_PMV_NOMENCLATURE), "wxTextCtrl" )
+        return wxPyTypeCast(self.FindWindowById(ID_PMV_NOMENCLATURE), "wxTextCtrl")
 
     def GetPmvPoc(self):
-        return wxPyTypeCast( self.FindWindowById(ID_PMV_POC), "wxTextCtrl" )
+        return wxPyTypeCast(self.FindWindowById(ID_PMV_POC), "wxTextCtrl")
 
     def GetPmvName(self):
-        return wxPyTypeCast( self.FindWindowById(ID_PMV_NAME), "wxTextCtrl" )
+        return wxPyTypeCast(self.FindWindowById(ID_PMV_NAME), "wxTextCtrl")
 
     def GetPmvRevision(self):
-        return wxPyTypeCast( self.FindWindowById(ID_PMV_REVISION), "wxTextCtrl" )
+        return wxPyTypeCast(self.FindWindowById(ID_PMV_REVISION), "wxTextCtrl")
 
     def GetTogglePmv(self):
-        return wxPyTypeCast( self.FindWindowById(ID_TOGGLE_PMV), "wxRadioButton" )
+        return wxPyTypeCast(self.FindWindowById(ID_TOGGLE_PMV), "wxRadioButton")
 
     def GetTogglePmm(self):
-        return wxPyTypeCast( self.FindWindowById(ID_TOGGLE_PMM), "wxRadioButton" )
+        return wxPyTypeCast(self.FindWindowById(ID_TOGGLE_PMM), "wxRadioButton")
 
     def GetPmmDesc(self):
-        return wxPyTypeCast( self.FindWindowById(ID_PMM_DESC), "wxTextCtrl" )
+        return wxPyTypeCast(self.FindWindowById(ID_PMM_DESC), "wxTextCtrl")
 
     def GetPmmNomenclature(self):
-        return wxPyTypeCast( self.FindWindowById(ID_PMM_NOMENCLATURE), "wxTextCtrl" )
+        return wxPyTypeCast(self.FindWindowById(ID_PMM_NOMENCLATURE), "wxTextCtrl")
 
     def GetPmmPoc(self):
-        return wxPyTypeCast( self.FindWindowById(ID_PMM_POC), "wxTextCtrl" )
+        return wxPyTypeCast(self.FindWindowById(ID_PMM_POC), "wxTextCtrl")
 
     def GetPmmName(self):
-        return wxPyTypeCast( self.FindWindowById(ID_PMM_NAME), "wxTextCtrl" )
+        return wxPyTypeCast(self.FindWindowById(ID_PMM_NAME), "wxTextCtrl")
 
     def GetPmmIdentifier(self):
-        return wxPyTypeCast( self.FindWindowById(ID_PMM_IDENTIFIER), "wxTextCtrl" )
+        return wxPyTypeCast(self.FindWindowById(ID_PMM_IDENTIFIER), "wxTextCtrl")
 
     def GetVersion(self):
-        return wxPyTypeCast( self.FindWindowById(ID_VERSION), "wxTextCtrl" )
+        return wxPyTypeCast(self.FindWindowById(ID_VERSION), "wxStaticText")
 
     def GetPartNumber(self):
-        return wxPyTypeCast( self.FindWindowById(ID_PART_NUMBER), "wxTextCtrl" )
+        return wxPyTypeCast(self.FindWindowById(ID_PART_NUMBER), "wxStaticText")
     
     def ClearCreateEditFlags(self):
         self.CreatingProductModelMaster = 0
@@ -466,8 +466,8 @@
         self.GetPmmName().SetEditable(state)
         self.GetPmmNomenclature() .SetEditable(state)
         self.GetPmmPoc().SetEditable(state)
-        self.GetPartNumber().SetEditable(false)
-        self.GetVersion().SetEditable(false)
+        #self.GetPartNumber().SetEditable(false)
+        #self.GetVersion().SetEditable(false)
         
         
     def EnablePMV(self, state):
@@ -476,8 +476,8 @@
         self.GetPmvName().SetEditable(state)
         self.GetPmvNomenclature() .SetEditable(state)
         self.GetPmvPoc().SetEditable(state)
-        self.GetPartNumber().SetEditable(false)
-        self.GetVersion().SetEditable(false)
+        #self.GetPartNumber().SetEditable(false)
+        #self.GetVersion().SetEditable(false)
         
         
     def BrowseMode(self, gotroot):
@@ -597,14 +597,14 @@
         #print "end creatingmode"
         
     
-    def SetMasterAndVersionData(self, of_master, of_version):
+    def SetMasterAndVersionData(self, master_id, version_id):
         #print "productdataform.setmasterandversiondata"
-        if of_master:
-            #print "of_master", of_master
-            self.GetPartNumber().SetValue(of_master.id)
-        if of_version:
-            #print "of_version", of_version
-            self.GetVersion().SetValue(of_version.id)
+        if master_id:
+            #print "master", master_id
+            self.GetPartNumber().SetLabel(master_id)
+        if version_id:
+            #print "version", version_id
+            self.GetVersion().SetLabel(version_id)
 
 
     def FillFormWithPMMData(self, PMM):

Index: PanGalactic/pangalactic/client/modules/psm/psmtool.py
diff -u PanGalactic/pangalactic/client/modules/psm/psmtool.py:1.117 PanGalactic/pangalactic/client/modules/psm/psmtool.py:1.118
--- PanGalactic/pangalactic/client/modules/psm/psmtool.py:1.117	Wed Oct  8 11:30:46 2003
+++ PanGalactic/pangalactic/client/modules/psm/psmtool.py	Tue Oct 21 17:25:18 2003
@@ -9,7 +9,7 @@
 This module is the main application code for the pgef client interface
 """
 
-__version__ = "$Revision: 1.117 $"[11:-2]
+__version__ = "$Revision: 1.118 $"[11:-2]
 
 import os
 import sys
@@ -76,7 +76,6 @@
 ID_PSM_SEARCH_ITEMS = wxNewId()
 ID_EDITFRAME_ITEM = wxNewId()
 ID_EDITFRAME_PARTS = wxNewId()
-#ID_TREE_RIGHTPOPUP_TOPLEVEL = wxNewId()
 ID_TREE_RIGHTPOPUP_EDIT = wxNewId()
 ID_TREE_RIGHTPOPUP_SHOWPROJECT = wxNewId()
 ID_TREE_RIGHTPOPUP_DUMPTOPDF = wxNewId()
@@ -245,23 +244,21 @@
         EVT_MENU(self.Parent, ID_PSM_SEARCH_ITEMS, self.OnSearchItems)
         EVT_MENU(self.Parent, ID_EDITFRAME_ITEM, self.OnEditItem)
         EVT_MENU(self.Parent, ID_EDITFRAME_PARTS, self.OnEditParts)
-#        EVT_MENU(self, ID_TREE_RIGHTPOPUP_TOPLEVEL, self.RedrawTreeAndGrid)
         EVT_MENU(self, ID_TREE_RIGHTPOPUP_EDIT, self.OnEditComponent)
         EVT_MENU(self, ID_TREE_RIGHTPOPUP_SHOWPROJECT, self.OnShowProjectFrame)
         EVT_MENU(self, ID_TREE_RIGHTPOPUP_DUMPTOPDF, self.tree.DumpToPdf)
         EVT_MENU(self, ID_TREE_RIGHTPOPUP_QUICKCREATE, self.QuickCreate)
         
-#        EVT_BUTTON(self, toolbarpanel.TOPLEVELITEMS_BUTTON, self.RedrawTreeAndGrid)
         EVT_CHOICE(self, toolbarpanel.ID_PROJECT, self.OnProjectClick)
         EVT_CHOICE(self, toolbarpanel.ID_ITEM, self.OnItemClick)
-        EVT_GRID_CELL_LEFT_DCLICK(self.itemgrid, self.onPMVGridDClick)
-        EVT_GRID_CELL_LEFT_DCLICK(self.product_master_grid, self.onPMGridDClick)
-        EVT_GRID_CELL_LEFT_DCLICK(self.model_master_grid, self.onMMGridDClick)
-        EVT_GRID_CELL_LEFT_DCLICK(self.product_version_grid, self.onPVGridDClick)
-        
-        EVT_GRID_CELL_LEFT_CLICK(self.product_master_grid, self.onGridGlickGetVersions)
-        EVT_GRID_CELL_LEFT_CLICK(self.model_master_grid, self.onGridGlickGetVersions)
-        EVT_GRID_CELL_LEFT_CLICK(self.product_version_grid, self.onGridGlickGetVersions)
+        EVT_GRID_CELL_LEFT_DCLICK(self.itemgrid, self.onProductGridDClick)
+        EVT_GRID_CELL_LEFT_DCLICK(self.product_master_grid, self.onProductGridDClick)
+        EVT_GRID_CELL_LEFT_DCLICK(self.model_master_grid, self.onProductGridDClick)
+        EVT_GRID_CELL_LEFT_DCLICK(self.product_version_grid, self.onProductGridDClick)
+        
+        EVT_GRID_CELL_LEFT_CLICK(self.product_master_grid, self.onGridClickGetVersions)
+        EVT_GRID_CELL_LEFT_CLICK(self.model_master_grid, self.onGridClickGetVersions)
+        EVT_GRID_CELL_LEFT_CLICK(self.product_version_grid, self.onGridClickGetVersions)
 
         EVT_MENU(self.itemgrid, quickcreate.ID_POPUP_QUICKCREATE, self.QuickCreate)
         EVT_MENU(self.product_master_grid, quickcreate.ID_POPUP_QUICKCREATE, self.QuickCreate)
@@ -275,19 +272,19 @@
 
         EVT_RIGHT_DOWN(self.tree, self.OnRightDown)
         EVT_TREE_ITEM_EXPANDING(self, self.tID, self.OnItemExpanding)
-        #EVT_TREE_ITEM_COLLAPSED(self, self.tID, self.OnItemCollapsed)
         EVT_TREE_SEL_CHANGED(self, self.tID, self.OnTreeActivate)
-#        EVT_LEFT_DCLICK(self.tree, self.OnLeftDClick) 
         EVT_LEFT_DCLICK(self.tree, self.OnEditComponent) 
         EVT_COMBOBOX(self, ID_CHOICE_VIEW, self.SelectView)
         
         EVT_NOTEBOOK_PAGE_CHANGED(self, self.remainingSpace.GetId(), self.pageChanged)
         
         
-    def onGridGlickGetVersions(self, event):
+    def onGridClickGetVersions(self, event):
         #print 'model master grid was clicked'
         ndx = event.GetRow()
-        obj = event.GetEventObject().GetDataObj(ndx)
+        grid = event.GetEventObject()
+        obj = grid.GetDataObj(ndx)
+        grid.SelectRow(ndx)
         objs = self.version_tree.LoadTreefromObjects(self.DataManager, obj)
         #print objs
         
@@ -443,32 +440,6 @@
         if not self.Allowed(actions.DELETEITEM):
             pass
             
-            
-#    def FillEditFrame(self, nodedata):
-#        print "psmtool.filleditframe", nodedata
-#        pane = 1                
-#        product_id = nodedata[1]
-#        print "product_id", product_id
-#        self.ShowEditFrame(pane, 1, ["TREE", product_id, "ProductModelVersion"])
-#        self.itemeditform.SetMode(pane)
-
-## duplicate of OnEditComponent -vwk
-##
-##    def OnLeftDClick(self, event):
-##        point = event.GetPosition()
-##        tree = event.GetEventObject()
-##        node, flags = tree.HitTest(point)
-##        if node.IsOk():
-##            nodedata = tree.GetPyData(node)
-##            if node == tree.GetRootItem():
-##                if nodedata[1] == "ROOT":
-##                    return
-
-##            wxSafeYield()
-##            wxBeginBusyCursor()
-##            self.FillEditFrame(nodedata)
-##            wxEndBusyCursor()
-        
 
     def RebuildMainTree(self):
         projectndx = self.topWindow.toppanel.GetProjectWidget().GetSelection() 
@@ -831,11 +802,6 @@
 #                    self.DataManager.getLocalNauosByAssemblyID(treetuple[1], treetuple[0], self.State.currentproject)
                 
     
-#    def UpdateMenuBar(self):
-#        pass
-#        #self.AddToolMenu()
-##        self.AddToolHelp()
-
     def AddToolMenu(self):
         """Dynamically adds the tools menu to the client apps main menu.  Also sets 
            the initial state for some of the menu items."""
@@ -882,17 +848,6 @@
             self.ToolMenu = None
         mb.Refresh()
 
-##    def ShowDBBrowser(self):
-##        tmpsize = wxSize(750, 500)
-##        dbframe = toolframe.toolFrame(self, -1, 'Local Database Browser', wxDefaultPosition, tmpsize)
-##        dbframe.menuBar.SetLabel(toolframe.ID_FILE_EXIT, '&Close')
-##        dbframe.menuBar.SetHelpString(toolframe.ID_FILE_EXIT, "Close this window")
-##        dbframe.mainpanel = dbbrowser.zodbbrowser(dbframe, -1, zodbroot = self.DataManager.localDB.dbroot)
-##        dbframe.mainpanel.FillChoice()
-##        dbframe.mainpanel.SelectDict("IDRDict")
-##        dbframe.mainpanel.OnRefresh()
-##        dbframe.CentreOnParent()
-##        dbframe.Show(true)
         
     def CloseDown(self):
         if self.DataManager.user._loggedin:
@@ -1133,14 +1088,6 @@
                 self.tree.SetPyData(rootnode,['ROOT', 'ROOT'])
                 numitems = self.FillGridFromProject(project)
                 self.FillItemWidgetFromProject(project)
-#                self.itemgrid.table.RefreshGrid()
-#                self.product_master_grid.table.RefreshGrid()
-#                self.product_version_grid.table.RefreshGrid()
-#                self.model_master_grid.table.RefreshGrid()
-
-                #wgt = self.topWindow.toppanel.GetItemWidget()
-                #wgt.Enable(true)
-                #wgt.SetSelection(0)
 
                 if numitems > 0:
                     wgt = self.Parent.menuBar.FindMenuItem('File', 'Export')
@@ -1149,10 +1096,6 @@
                 self.UpdateWindows()
             self.SecureMenu()
             wxEndBusyCursor()
-#        self.itemgrid.AutoSizeColumns(true)
-#        self.product_master_grid.AutoSizeColumns(true)
-#        self.product_version_grid.AutoSizeColumns(true)
-#        self.model_master_grid.AutoSizeColumns(true)
         #print "end psmtool.onprojectclick"
 
     def UpdateWindows(self):
@@ -1206,10 +1149,6 @@
                     wgt.AddData(newitem, wxLIGHT_GREY)
                     self.SelectGridRowByItemId(newitem.pgef_oid)
                     wgt.AutoSizeColumns(true)
-#                    self.itemgrid.AutoSizeColumns(true)
-#                    self.product_master_grid.AutoSizeColumns(true)
-#                    self.product_version_grid.AutoSizeColumns(true)
-#                    self.model_master_grid.AutoSizeColumns(true)
 
         
     def RedrawTreeAndGrid(self, event = None):
@@ -1248,11 +1187,6 @@
             pmm_list.sort()
             pv_list.sort()
 
-#            print "pm", pm_list
-#            print "pv", pv_list
-#            print "pmm", pmm_list
-#            print "pmv", pmv_list
-
             self.FillGridWithProducts(self.itemgrid, pmv_list)
             self.FillGridWithProducts(self.model_master_grid, pmm_list)
             self.FillGridWithProducts(self.product_master_grid, pm_list)
@@ -1501,32 +1435,33 @@
         if selectedrow:
 #            print "selectedrow", selectedrow[0]
             product_id = currentgrid.GetObjectOid(selectedrow[0])
-            self.processGridDClick(product_id, gridname, selectedrow)
+            self.editGridObject(product_id, gridname)
 
 
-    def onPMVGridDClick(self, event):
-        product_id = event.GetEventObject().GetObjectOid(event.GetRow())
-        self.processGridDClick(product_id, 'ProductModelVersion', event.GetRow())
-    
-    def onPMGridDClick(self, event):
-        product_id = event.GetEventObject().GetObjectOid(event.GetRow())
-        self.processGridDClick(product_id, 'ProductMaster', event.GetRow())
-
-    def onMMGridDClick(self, event):
-        product_id = event.GetEventObject().GetObjectOid(event.GetRow())
-        self.processGridDClick(product_id, 'ProductModelMaster', event.GetRow())
-
-    def onPVGridDClick (self, event):
-        product_id = event.GetEventObject().GetObjectOid(event.GetRow())
-        self.processGridDClick(product_id, 'ProductVersion', event.GetRow())
+    def onProductGridDClick (self, event):
+        row = event.GetRow()
+        grid = event.GetEventObject()
+        grid.SelectRow(row)
+        if grid == self.itemgrid:
+            classname = "ProductModelVersion"
+        elif grid == self.product_master_grid:
+            classname = "ProductMaster"
+        elif grid == self.product_version_grid:
+            classname = "ProductVersion"
+        elif grid == self.model_master_grid:
+            classname = "ProductModelMaster"
+        else:
+            event.skip()
+            return
+
+        product_id = grid.GetObjectOid(row)
+        product = grid.getObject(row)
+        print "call editgridobject", product.name
+        self.editGridObject(product_id, classname)
         
             
-    def processGridDClick(self, product_id, product_type, row_ndx):
-        #print "psmtool.processgriddclick", product_id, product_type
-        #if event.GetId() == ID_ITEM_SEARCH_GRID:
-            #return false
-        #print '_data is: ', event.GetEventObject().table._data
-        #print 'oid in data is: ', event.GetEventObject().table._data[0].pgef_oid
+    def editGridObject(self, product_id, product_type):
+        print "psmtool.editgridobject", product_id, product_type
 
         dlg = None
         if self.DataManager.user._loggedin:
@@ -1539,8 +1474,7 @@
             dlg.CentreOnParent()
             dlg.Show(true)
             wxSafeYield()
-            #itemid = event.GetEventObject().GetObjectOid(event.GetRow())
-            #print 'oid from grid is: ',itemid
+
             if product_type in ["ProductModelVersion", "ProductModelMaster"]:
                 pane = 1
             elif product_type in ["ProductMaster", "ProductVersion"]:
@@ -1550,14 +1484,10 @@
                 
             self.ShowEditFrame(pane, 1, ["GRID", product_id, product_type])
             self.itemeditform.SetMode(pane)
-#            self.itemgrid.SelectRow(row_ndx)
-#            self.topWindow.toppanel.GetItemWidget().SetSelection(row_ndx + 1)
             wxEndBusyCursor()
             dlg.Destroy()
 
         elif self.inLocalMode():
-            #itemid = event.GetEventObject().GetObjectOid(event.GetRow())
-            #print 'itemid is: %s' % itemid
             if product_type in ["ProductModelVersion", "ProductModelMaster"]:
                 pane = 1
             elif product_type in ["ProductMaster", "ProductVersion"]:
@@ -1566,7 +1496,6 @@
                 print "pane???  what pane???"
             self.ShowEditFrame(pane, 1, ["GRID", product_id, product_type])
             self.itemeditform.SetMode(pane)
-#            self.itemgrid.SelectRow(row_ndx)
 
         else:
             dlg = wxMessageDialog(self, "I'm sorry Steve, I can't do that...", "Unable to comply",
@@ -1584,21 +1513,20 @@
             if results[0]:
                 #print "  quick pm"
                 self.UpdateWgts(results[0])
-#                self.product_master_grid.AddData(results[0], wxLIGHT_GREY)
+
             if results[1]:
                 #print "  quick pv"
                 self.UpdateWgts(results[1])
-#                self.product_version_grid.AddData(results[1], wxLIGHT_GREY)
+
             if results[2]:
                 #print "  quick pmm"
                 self.UpdateWgts(results[2])
-#                self.model_master_grid.AddData(results[2], wxLIGHT_GREY)
+
             if results[3]:
                 #print "  quick pmv"
                 self.UpdateWgts(results[3])
-#                self.itemgrid.AddData(results[3], wxLIGHT_GREY)
-        
 
+        
 #____________________________________________________________________________________
 
 if __name__ == '__main__':

Index: PanGalactic/pangalactic/client/modules/psm/itemeditframe.py
diff -u PanGalactic/pangalactic/client/modules/psm/itemeditframe.py:1.106 PanGalactic/pangalactic/client/modules/psm/itemeditframe.py:1.107
--- PanGalactic/pangalactic/client/modules/psm/itemeditframe.py:1.106	Wed Oct 15 12:51:12 2003
+++ PanGalactic/pangalactic/client/modules/psm/itemeditframe.py	Tue Oct 21 17:25:18 2003
@@ -1,6 +1,6 @@
 # $Source: /repo/step_testbed/PanGalactic/pangalactic/client/modules/psm/itemeditframe.py,v $
 
-__version__ = "$Revision: 1.106 $"[11:-2]
+__version__ = "$Revision: 1.107 $"[11:-2]
 
 # Python imports
 import copy
@@ -237,7 +237,7 @@
         self.SetupPane(which_pane, nodedata)
 
     def setCurrentProduct(self, nodedata):
-        #print "itemeditframe.setcurrentproduct"
+        print "itemeditframe.setcurrentproduct"
         #print "nodedata: " + str(nodedata)
         #print 'tempproduct type:', self.tempproduct.__class__.__name__
         self.rootitemid = nodedata[1]
@@ -258,23 +258,27 @@
                     self.tempproduct.build(self.currentproduct.__dict__)
             except IndexError:
                 pass
+
+        print "end setcurrentproduct"
         
 
     def SetupPane(self, which_pane, nodedata):
-        #print "itemeditframe.SetupPane"
+        print "itemeditframe.SetupPane"
         #print "  pane: " + str(which_pane)
         #print "  nodedata: " + str(nodedata)
         #print "  rootitemid: " + str(self.rootitemid)
         #print "  rootnauoid: " + str(self.rootnauoid)
 
         self.setCurrentProduct(nodedata)
+        print "set pane selection"
         self.editnb.SetSelection(which_pane)
+        print "pane selected"
 
         if which_pane == self.PMM_PMVPage or which_pane == self.PM_PVPage or which_pane == self.PropertiesPage:
-            # print "  setting up for item"
+            print "  setting up for item"
             #print '  rootitemid, rootnauoid are [%s, %s]' % (self.rootitemid, self.rootnauoid)
-            self.BuildItemTree(self.rootitemid, self.rootnauoid)
-            #print "  built tree"
+            self.BuildItemTree(self.rootitemid, self.rootnauoid) # done in pagechanged
+            print "  built tree"
             root = self.itemtree.GetRootItem()
 #            print "  have root item", root
             
@@ -282,46 +286,54 @@
             rootdata = self.itemtree.GetPyData(root)
             #print "  rootdata:" + str(rootdata)
             nodeid = rootdata[1]
-            #print "  about to call getitem"
+            print "  about to call getitem"
             treedata = self.DataManager.localDB.GetItem(nodeid)
             #print "  treedata", treedata
             if treedata:
-                #print "  have treedata", treedata.id
+                print "  have treedata", treedata.id
                 self.currentproduct.build(treedata.__dict__)
                 self.tempproduct.build(self.currentproduct.__dict__)
                 classname = self.tempproduct.__class__.__name__
-                #print "  classname", classname
+                print "  classname", classname
+                print "  tempproduct", self.tempproduct.name
                 
                 if classname == 'ProductModelVersion':
+                    print "  master", self.tempproduct.of_pm_id
                     self.pm_pv_form.FillFormWithPMData(self.tempproduct._of_master)
                     self.pm_pv_form.FillFormWithPVData(self.tempproduct._of_version)
                     self.pmm_pmv_form.FillFormWithPMMData(self.tempproduct._of_model_master)
-                    self.pmm_pmv_form.SetMasterAndVersionData(self.tempproduct._of_master,
-                                                              self.tempproduct._of_version)
+                    self.pmm_pmv_form.SetMasterAndVersionData(self.tempproduct.of_pm_id,
+                                                              self.tempproduct.of_pv_id)
                     self.pmm_pmv_form.FillFormWithPMVData(self.tempproduct)
                     self.pmm_pmv_form.GetTogglePmv().SetValue(1)
 
                 elif classname == 'ProductModelMaster':
+                    print "  model", self.tempproduct.of_pm_id
                     self.pm_pv_form.FillFormWithPMData(self.tempproduct._of_master)
                     self.pm_pv_form.FillFormWithPVData(self.tempproduct._of_version)
                     self.pmm_pmv_form.FillFormWithPMMData(self.tempproduct)
-                    self.pmm_pmv_form.SetMasterAndVersionData(self.tempproduct._of_master,
-                                                              self.tempproduct._of_version)
+                    self.pmm_pmv_form.SetMasterAndVersionData(self.tempproduct.of_pm_id,
+                                                              self.tempproduct.of_pv_id)
                     self.pmm_pmv_form.clearPMV()
                     self.pmm_pmv_form.GetTogglePmm().SetValue(1)
 
                 elif classname == 'ProductVersion':
+                    print "  version", self.tempproduct.of_pm_id
                     self.pmm_pmv_form.clearPMM()
                     self.pmm_pmv_form.clearPMV()
                     self.pm_pv_form.FillFormWithPMData(self.tempproduct._of_master)
                     self.pm_pv_form.FillFormWithPVData(self.tempproduct)
+                    self.pmm_pmv_form.SetMasterAndVersionData(self.tempproduct.of_pm_id,
+                                                              self.tempproduct.id)
                     self.pm_pv_form.GetTogglePv().SetValue(1)
 
                 elif classname == 'ProductMaster':
+                    print "  tempproduct master", self.tempproduct.id
                     #print "setup for productmaster"
                     self.pmm_pmv_form.clearPMM()
                     self.pmm_pmv_form.clearPMV()
                     self.pm_pv_form.FillFormWithPMData(self.tempproduct)
+                    self.pmm_pmv_form.SetMasterAndVersionData(self.tempproduct.id, "")
                     self.pm_pv_form.clearPV()
                     self.pm_pv_form.GetTogglePm().SetValue(1)
             else:
@@ -342,7 +354,7 @@
 
         elif which_pane == self.PartsListPage or which_pane == self.PartDataPage:
             #print "setting up for pl"
-            self.BuildDocTree(self.rootitemid, self.rootnauoid)
+            self.BuildDocTree(self.rootitemid, self.rootnauoid) # done in pagechanged
             root = self.doctree.GetRootItem()
             self.doctree.SelectItem(root)
             self.partslistform.BrowseMode(True)
@@ -357,7 +369,7 @@
 
         elif which_pane == self.OtherDocPage:
             #print "setting up for doc"
-            self.BuildOtherDocTree(self.rootitemid, self.rootnauoid)
+            self.BuildOtherDocTree(self.rootitemid, self.rootnauoid) # done in pagechanged
             root = self.otherdoctree.GetRootItem()
             self.otherdoctree.SelectItem(root)
             self.otherdocform.BrowseMode(True)
@@ -405,7 +417,9 @@
         self.currentpage = self.editnb.GetSelection()
 
         #if self.currentpage == self.ItemPage or self.currentpage == self.PropertiesPage:
-        if self.currentpage == self.PMM_PMVPage or self.currentpage == self.PM_PVPage or self.currentpage == self.PropertiesPage:
+        if self.currentpage == self.PMM_PMVPage or \
+           self.currentpage == self.PM_PVPage or \
+           self.currentpage == self.PropertiesPage:
             if self.itemtree:
                 root = self.itemtree.GetRootItem()
                 if root.IsOk():
@@ -505,7 +519,7 @@
 
    
     def PageChanged(self, event = None):
-        #print "itemeditframe.pagechanged"
+        print "itemeditframe.pagechanged"
         self.currentpage = self.editnb.GetSelection()
         #print 'page changed.currentpage:', self.currentpage
         
@@ -613,13 +627,6 @@
     def EditingMode(self, whichpane):
         #print 'itemeditframe.editmode'
         self.editingtab = self.currentpage
-        #self.pm_pv_form.EditingMode()
-        #self.pmm_pmv_form.EditingMode()
-        #self.partslistform.EditingMode()
-        #self.otherdocform.EditingMode()
-        #self.DataManager.creatingItem = True
-        #self.DataManager.creatingPartsList = True
-        #self.DataManager.creatingDocument = True
         if whichpane == self.PMM_PMVPage: 
             self.pm_pv_form.BrowseMode(True)
             self.pmm_pmv_form.EditingMode()
@@ -656,7 +663,6 @@
             self.DataManager.creatingPartsList = False
             self.DataManager.creatingItem = False
         
-        
 
     def CreatingMode(self, whichpane):
         """Handles the setting of the correct mode based
@@ -676,6 +682,7 @@
             self.DataManager.creatingItem = True
             self.DataManager.creatingPartsList = False
             self.DataManager.creatingDocument = False
+
         elif whichpane == self.PM_PVPage:
             self.pmm_pmv_form.BrowseMode(True)
             self.partslistform.BrowseMode(True)
@@ -684,6 +691,7 @@
             self.DataManager.creatingItem = True
             self.DataManager.creatingPartsList = False
             self.DataManager.creatingDocument = False
+
         elif whichpane == self.PartsListPage:
             self.pm_pv_form.BrowseMode(True)
             self.pmm_pmv_form.BrowseMode(True)
@@ -692,6 +700,7 @@
             self.DataManager.creatingItem = False
             self.DataManager.creatingPartsList = True
             self.DataManager.creatingDocument = False
+
         elif whichpane == self.OtherDocPage:
             self.partslistform.BrowseMode(True)
             self.pm_pv_form.BrowseMode(True)
@@ -975,13 +984,8 @@
                 if node == self.itemtree.GetRootItem():
                     #print "have root"
                     self.BrowseMode(True)
-#                    if self.currentpage == self.PMM_PMVPage:
-#                        self.pmm_pmv_form.BrowseMode(True)
-#                    elif self.currentpage == self.PM_PVPage:
-#                        self.pm_pv_form.BrowseMode(True)
                         
                     obj = self.itemtree.GetPyData(node)
-                    
                     if obj[0] == 'New':
                         self.itemtree.DeleteAllItems()
                         self.pmm_pmv_form.clearForm()
@@ -1027,11 +1031,6 @@
                             self.pmm_pmv_form.ResetForm(temp_obj._of_model_master, temp_obj._of_version)
                         elif classname == "ProductModelMaster":
                             self.pmm_pmv_form.ResetForm(temp_obj, temp_obj._of_version)
-                        
-#                        if self.currentpage == self.PMM_PMVPage:
-#                            self.pmm_pmv_form.ResetForm(temp_obj._of_master, temp_obj)
-#                        elif self.currentpage == self.PM_PVPage:
-#                            self.pm_pv_form.ResetForm(temp_obj._of_model, temp_obj._of_version)
                     else:
                         #print "clearform"
                         if self.currentpage == self.PMM_PMVPage:
@@ -1379,7 +1378,6 @@
         link.InitObject(self.State.currentproject, self.DataManager.user.id)
         self.DataManager.localDB.Add([link])
 
-
         allprojlist = self.DataManager.localDB.GetProjectObjects()
         if allprojlist.has_key(self.State.currentproject):
             projlist = self.DataManager.localDB.GetProjectObjects()[self.State.currentproject]
@@ -1499,7 +1497,8 @@
             else:
                 self.ImportPartsListFrame.sb.ClearServer()
 
-            self.PLMtool = PLMTool(self.ImportPartsListFrame, self, self.State, self.DataManager, -1, wxDefaultPosition, defsize)
+            self.PLMtool = PLMTool(self.ImportPartsListFrame, self, self.State, self.DataManager,
+                                   -1, wxDefaultPosition, defsize)
             # self.PLMtool.SetImportFileName(self.partslistform.GetImportDataPath())
             self.PLMtool.SetColumnInfo(self.currentpartslist._ColumnInfo, self.partslistview.partslistgrid.GetNumberCols())
             self.ImportPartsListFrame.CentreOnParent()
@@ -1605,8 +1604,8 @@
         self.rootitemid = None
         self.rootnauoid = None
 
-#        if self.ImportPartsListFrame:                not used??? vwk
-#            self.OnCloseImportPartsListFrame()
+        if self.ImportPartsListFrame:
+            self.OnCloseImportPartsListFrame()
 
         self.Show(False)
 
@@ -1626,7 +1625,7 @@
 
     
     def BuildItemTree(self, itemid, nauoid, currentdata = None, product_type = None):
-        #print "itemeditframe.builditemtree"
+        print "itemeditframe.builditemtree"
 
         #print  "itemid: " + str(itemid)
         if itemid == None and nauoid == None:
@@ -1679,12 +1678,11 @@
             self.rootobject = self.DataManager.localDB.GetItem(treeitemdata[1])
             #print "root", self.rootobject.pgef_oid, self.rootobject.id, self.rootobject.name
             treedlg.Destroy()
-        #print "end builditemtree"
+        print "end builditemtree"
 
 
     def BuildDocTree(self, itemid, pdrid = None, currentdata = None):
         #print "builddoctree"
-
         #print "itemid: " + str(itemid)
         if itemid == None and pdrid == None:
             #print "new node"
@@ -1716,7 +1714,6 @@
 
             self.partslistform.ClearForm()
 
-
             if self.currenttree <> "DOC":
                 #print "not a doc tree; making one"
                 self.doctree = pgefdoctree.PgefDocTree(self.vsplitter, self.tID, self.DataManager)
@@ -1725,24 +1722,19 @@
                 self.currenttree = "DOC"
 
             self.doctree.DeleteAllItems() # remove when lines below are working
-
             self.doctree.LoadTreefromPartsLists(self.DataManager, itemid, pdrid, currentdata)
 
             treeitemdata = self.doctree.GetPyData(self.doctree.GetRootItem())
-
-            self.rootobject = self.DataManager.localDB.GetItem(treeitemdata[1])
+            if treeitemdata:
+                self.rootobject = self.DataManager.localDB.GetItem(treeitemdata[1])
 
             treedlg.Destroy()
 
 
-
-
     def BuildOtherDocTree(self, itemid, pdrid = None, currentdata = None):
-
         #print "\nbuildotherdoctree"
         #print "itemid: " + str(itemid)
         if itemid == None and pdrid == None:
-
             if self.currenttree <> "OTHERDOC":
                 self.otherdoctree = pgefdoctree.PgefDocTree(self.vsplitter, self.tID, self.DataManager)
                 self.otherdoctree.SetToolTip(wxToolTip("A hierarchical display of the currently selected document."))
@@ -1780,7 +1772,8 @@
 
             self.otherdoctree.LoadTreefromOtherDocuments(self.DataManager, itemid, pdrid, currentdata)
             treeitemdata = self.otherdoctree.GetPyData(self.otherdoctree.GetRootItem())
-            self.rootobject = self.DataManager.localDB.GetItem(treeitemdata[1])
+            if treeitemdata:
+                self.rootobject = self.DataManager.localDB.GetItem(treeitemdata[1])
             treedlg.Destroy()
 
 
@@ -1881,12 +1874,8 @@
                 if treeitem == self.itemtree.GetRootItem():
                     # it's the root node
                     self.BrowseMode(True)
-#                    self.pm_pv_form.BrowseMode(True)
-#                    self.pmm_pmv_form.BrowseMode(True)
                 else:
                     self.BrowseMode(False)
-#                    self.pm_pv_form.BrowseMode(False)
-#                    self.pmm_pmv_form.BrowseMode(False)
 
         elif self.currentpage == self.PartDataPage:
             treeitem = event.GetItem()
@@ -2036,9 +2025,8 @@
                 self.pmm_pmv_form.clearForm()
                 self.partslistform.ClearForm()
                 self.otherdocform.ClearForm()
-                
-
         return retval
+
     
     def DiscardChanges(self):
         if self.DataManager.creatingPartsList:
@@ -2071,9 +2059,7 @@
             doc._UploadFileName = self.currentdocument._UploadFileName
 
             try:
-
                 doc.Validate()
-                
             except RequiredDataError, e:
                 dlg = wxMessageDialog(self, e.__dict__['args'], "Required Document Data Missing!!!", wxOK | wxICON_ERROR)
                 dlg.ShowModal()
@@ -2090,7 +2076,6 @@
         return False
 
     def SavePLChanges(self):
-
         #print "savePLChanges"
         if self.DataManager.creatingPartsList:
             #print "creating"
@@ -2112,9 +2097,7 @@
                 pl._UploadFileName = self.currentpartslist._UploadFileName
 
             try:
-
                 pl.Validate()
-                
                 if wxPlatform == '__WXMSW__':
                     if not self.PLM_Converted:
                         raise RequiredDataError, "You have not provided a spreadsheet"
@@ -2185,13 +2168,11 @@
 
 
     def SaveChanges(self, event = None):
-
         # print "savechanges"
 
         itemretval = self.SaveItemChanges()
         plretval = self.SavePLChanges()
         docretval = self.SaveDocChanges()
-
 
         if itemretval or plretval or docretval:
             # print "saved something"

Index: PanGalactic/pangalactic/enterprise/document.py
diff -u PanGalactic/pangalactic/enterprise/document.py:1.12 PanGalactic/pangalactic/enterprise/document.py:1.13
--- PanGalactic/pangalactic/enterprise/document.py:1.12	Tue Oct 21 14:45:40 2003
+++ PanGalactic/pangalactic/enterprise/document.py	Tue Oct 21 17:25:18 2003
@@ -1,18 +1,20 @@
-# $Id: document.py,v 1.12 2003/10/21 18:45:40 waterbug Exp $
+# $Id: document.py,v 1.13 2003/10/21 21:25:18 pbear Exp $
 
 """
 The Mother of all document types in PGEF.
 """
 
-__version__ = "$Revision: 1.12 $"[11:-2]
+__version__ = "$Revision: 1.13 $"[11:-2]
 
 import string
+
 from pangalactic.enterprise.pgefobject import PgefObject
 from pangalactic.enterprise.docmaster  import DocMaster
 from pangalactic.enterprise.docversion import DocVersion
 from pangalactic.enterprise.docrep     import DocRep
 from pangalactic.enterprise.drfile     import DrFile
 
+
 def FillSampleDocument(document):
     document.creator = 'Test Harness'
 
@@ -54,25 +56,75 @@
     _refd = {
              '_master' : 'DocMaster'
             }
-    _required = ['master']
+#    _required = ['master_oid']  # for the time being, don't require any fields
+    _required = []
     _schema_ext = {
-                   'master' : 'str'
+                   'master_oid' : 'str'
                   }
     _schema = _schema_ext.copy()
     _schema.update(PgefObject._schema)
     _searchabletext = True
     _std_abbrev = 'doc'
 
+
     def __init__(self, email=None, schema=_schema, **kw):
-        PgefObject.__init__(self, email=email,
-                            schema=schema, **kw)
+        PgefObject.__init__(self, email=email, schema=schema, **kw)
         for a in kw:
             if a in self._properties:
                 setattr(self, a, kw[a])
 
+        self._versions = {}
+        self._master = DocMaster()
+        v = DocVersion(_of_master = self._master)
+        self.setCurrentVersion(v)
+
+        self._reps = {}
+        self._drfiles = {}
+
     def deleteAttr(self):
         raise TypeError, 'Cannot delete attribute'
 
+    def addRep(self, rep, drfiles = None):
+        repdict = self._reps.get(rep.of_dv_id, {})
+        repdict[rep.pgef_oid] = rep        
+        self._reps[rep.of_dv_id] = repdict
+        if drfiles:
+            for drfile in drfiles:
+                self.addDrFile(drfile)
+
+    def getRep(self, vid, repoid):
+        repdict = self._versions[vid]
+        return repdict.get(repoid, None)
+
+
+    def addDrFile(self, drfile):
+        drfiledict = self._drfiles.get(drfile._of_dr.pgef_oid, {})
+        drfiledict[drfile.pgef_oid] = drfile        
+        self._drfiles[drfile.of_dr.pgef_oid] = drfiledict
+
+
+    def getDrFile(self, repoid, drfileoid):
+        drfiledict = self._drfiles[repoid]
+        return drfiledict.get(drfileoid, None)
+
+        
+    def getCurrentVersion(self):
+        max = -1
+        for vid in self._versions:
+            intid = int(vid)
+            if intid > max:
+                max = intid
+        return self._versions[str(max)]
+
+
+    def setCurrentVersion(self, v):
+        self._versions[v.id] = v
+
+    CurrentVersion = property(getCurrentVersion,
+                              setCurrentVersion,
+                              deleteAttr,
+                              "CurrentVersion")
+        
     def getTitle(self):
         # What if a document's Title changes?  It is actually the
         # 'name' attribute of the current DocVersion that
@@ -84,10 +136,7 @@
     def setTitle(self, value):
         self._current_version.__dict__['name'] = value
 
-    Title = property(getTitle,
-                     setTitle,
-                     deleteAttr,
-                     'Title')
+    Title = property(getTitle, setTitle, deleteAttr, 'Title')
 
     def getIdentifier(self):
         return self._current_version._of_master.id
@@ -113,10 +162,7 @@
     def setCreator(self, value):
         self._master.__dict__['creator'] = value
 
-    Creator = property(getCreator,
-                       setCreator,
-                       deleteAttr,
-                       'Creator')
+    Creator = property(getCreator, setCreator, deleteAttr, 'Creator')
 
     def getRevision(self):
         return self._current_version.id
@@ -150,10 +196,7 @@
         # create_datetime (a DateTime object) via its API.
         raise TypeError, 'Date is a read-only, computed attribute.'
 
-    Date = property(getDate,
-                    setDate,
-                    deleteAttr,
-                    'Date')
+    Date = property(getDate, setDate, deleteAttr, 'Date')
 
     def getDocTypeCode(self):
         return self._master.doc_type_code
@@ -167,10 +210,9 @@
                            'DocTypeCode')
 
     def getDocType(self):
-        return (self._master.doc_type_code_context 
-                + "_" + self._master.doc_type_code)
+        return self._master.getDocType()
+
     
     def getPrettyDocType(self):
-        tmpcode = self.doc_type_code.replace("_", " ")
-        return self.doc_type_code_context.upper() + " " + string.capwords(tmpcode)
+        return self._master.getPrettyDocType()
 

Index: PanGalactic/pangalactic/enterprise/docversion.py
diff -u PanGalactic/pangalactic/enterprise/docversion.py:1.12 PanGalactic/pangalactic/enterprise/docversion.py:1.13
--- PanGalactic/pangalactic/enterprise/docversion.py:1.12	Fri Oct 17 16:49:53 2003
+++ PanGalactic/pangalactic/enterprise/docversion.py	Tue Oct 21 17:25:18 2003
@@ -1,10 +1,10 @@
-# $Id: docversion.py,v 1.12 2003/10/17 20:49:53 waterbug Exp $
+# $Id: docversion.py,v 1.13 2003/10/21 21:25:18 pbear Exp $
 
 """
 Version-specific attributes of a document.
 """
 
-__version__ = "$Revision: 1.12 $"[11:-2]
+__version__ = "$Revision: 1.13 $"[11:-2]
 
 from pangalactic.enterprise.pgefobject import PgefObject
 from pangalactic.enterprise.docmaster import DocMaster as DM
@@ -60,15 +60,18 @@
     _schema.update(PgefObject._schema)
     _std_abbrev = 'dv'
 
-    def __init__(self, email=None, schema=_schema,
-                 _of_master=None, **kw):
+    def __init__(self, _of_master, email=None, schema=_schema, **kw):
         # PgefObject.__init__() creates the pgef_oid ...
         PgefObject.__init__(self, email=email,
                             schema=schema, **kw)
-        if _of_master.__class__.__name__ == 'DocMaster':
-            self._of_master = _of_master
-            self.of_dm_id = self._of_master.id
-            self.of_dm_id_context = self._of_master.id_context
+        try:
+            assert _of_master.__class__.__name__ == 'DocMaster'
+        except:
+            raise TypeError, "Expecting a DocMaster instance as argument 2"
+
+        self._of_master = _of_master
+        self.of_dm_id = self._of_master.id
+        self.of_dm_id_context = self._of_master.id_context
 
     def __getattr__(self, name):
         return PgefObject.__getattr__(self, name)

Index: PanGalactic/pangalactic/utils/datamanager.py
diff -u PanGalactic/pangalactic/utils/datamanager.py:1.48 PanGalactic/pangalactic/utils/datamanager.py:1.49
--- PanGalactic/pangalactic/utils/datamanager.py:1.48	Thu Oct 16 17:19:45 2003
+++ PanGalactic/pangalactic/utils/datamanager.py	Tue Oct 21 17:25:19 2003
@@ -1,6 +1,6 @@
 # $Source: /repo/step_testbed/PanGalactic/pangalactic/utils/datamanager.py,v $
 
-__version__ = "$Revision: 1.48 $"[11:-2]
+__version__ = "$Revision: 1.49 $"[11:-2]
 
 import time
 import mx.DateTime
@@ -289,23 +289,30 @@
         if data:
             for item in data:
                 tempobjlist.append(item)
-                tempids[item.pgef_oid] = {"type" : "ProductModelVersion"}
-
-        if pms:
-#            print "pms", len(pms)
-            for item in pms:
-                tempobjlist.append(item)
-                tempids[item.pgef_oid] = {"type" : "ProductMaster"}
-        if pvs:
-#            print "pvs", len(pvs)
-            for item in pvs:
-                tempobjlist.append(item)
-                tempids[item.pgef_oid] = {"type" : "ProductVersion"}
-        if pmms:
-#            print "pmms", len(pmms)
-            for item in pmms:
-                tempobjlist.append(item)
-                tempids[item.pgef_oid] = {"type" : "ProductModelMaster"}
+                classname = item.__class__.__name__
+                tempids[item.pgef_oid] = {"type" : classname}
+                if classname == "ProductModelVersion":
+                    print "retrieving a", classname
+                    print " ~", item.name
+                    print " ~ master", item._of_master.id
+                    print " ~ version", item._of_version.id
+                    print " ~ model", item._of_model_master.id
+
+##        if pms:
+###            print "pms", len(pms)
+##            for item in pms:
+##                tempobjlist.append(item)
+##                tempids[item.pgef_oid] = {"type" : "ProductMaster"}
+##        if pvs:
+###            print "pvs", len(pvs)
+##            for item in pvs:
+##                tempobjlist.append(item)
+##                tempids[item.pgef_oid] = {"type" : "ProductVersion"}
+##        if pmms:
+###            print "pmms", len(pmms)
+##            for item in pmms:
+##                tempobjlist.append(item)
+##                tempids[item.pgef_oid] = {"type" : "ProductModelMaster"}
 
 
         if len(tempobjlist) > 0:
@@ -373,7 +380,7 @@
     
     def getNAUOByAssemblyID(self, AssemblyIDList, NauoID = 'ROOT'):
         """Retrieves all of the NAUOs associated with an AssemblyID"""
-        #print "datamanager.getnauobyassemblyid"
+        print "datamanager.getnauobyassemblyid"
 
         retlist = []
         objlist = []
@@ -402,11 +409,13 @@
                     itemobjs.append(obj)
                     #print "appending", obj.__class__.__name__
                     #print obj
+                else:
+                    print "ignoring", obj.__class__.__name__
 
             if len(nauoobjs) > 0:
                 updatedacuobjs = []
                 nauoids = []
-                #print "saving nauoobjs", len(nauoobjs)
+                print "saving nauoobjs", len(nauoobjs)
                 updatedacuobjs = self.localDB.Save(nauoobjs)
 
                 #add the nauos to the projectobject dictionary in localdb
@@ -427,6 +436,7 @@
                     self.nauoIDs[id] = {NauoID:nauoids}
 
             if len(itemobjs) > 0:
+                print "saving items", len(itemobjs)
                 self.localDB.Save(itemobjs)
        
             break # only do the first one for now
@@ -439,7 +449,11 @@
             elif obj.__class__.__name__ == "ProductModelVersion":
                 item = self.localDB.GetItem(obj.pgef_oid)
                 retlist.append(item)
+            else:
+                print "not returning", obj.__class__.__name__
+
         #print "len retlist", len(retlist)
+        print "end datamanager.getnauobyassemblyid"
         return retlist
 
 

Index: PanGalactic/pangalactic/utils/localdb.py
diff -u PanGalactic/pangalactic/utils/localdb.py:1.41 PanGalactic/pangalactic/utils/localdb.py:1.42
--- PanGalactic/pangalactic/utils/localdb.py:1.41	Thu Oct 16 17:19:45 2003
+++ PanGalactic/pangalactic/utils/localdb.py	Tue Oct 21 17:25:19 2003
@@ -5,7 +5,6 @@
 import base64
 import string
 
-#import pangalactic.enterprise.user
 import pangalactic.enterprise.document as document
 import pangalactic.enterprise.partslist as partslist
 
@@ -195,6 +194,7 @@
         @type objlist: a python list
         @param objlist: the list of model masters to be cached
         """
+        #print "localdb.savepmm"
         for mod in objlist:
             self.dbroot[self.PRODUCTMODELMASTER][mod.pgef_oid] = mod
             self.dbroot[self.OIDLOOKUP][mod.pgef_oid] = self.PRODUCTMODELMASTER
@@ -208,7 +208,7 @@
         @type objlist:  a python list
         @param objlist: the list of Product Masters to be cached
         """
-        #print 'in SavePM'
+        #print 'localdb.SavePM'
         for mod in objlist:
             self.dbroot[self.PRODUCTMASTER][mod.pgef_oid] = mod
             self.dbroot[self.OIDLOOKUP][mod.pgef_oid] = self.PRODUCTMASTER
@@ -221,7 +221,7 @@
         @type objlist:  a python list
         @param objlist: the list of Product Versions to be cached
         """
-        #print 'in SavePV'
+        #print 'localdb.SavePV'
         for mod in objlist:
             self.dbroot[self.PRODUCTVERSION][mod.pgef_oid] = mod
             self.dbroot[self.OIDLOOKUP][mod.pgef_oid] = self.PRODUCTVERSION
@@ -1083,7 +1083,6 @@
                         self.SavePMV([obj])
                         
                 elif obj.__class__.__name__ == "PartsList":
-#                elif isinstance(obj, partslist.PartsList):
                     #print "have partslist"
 
                     if self.dbroot[self.PARTSLISTDICT].has_key(obj.pgef_oid):
@@ -1096,7 +1095,6 @@
                         self.SavePartsList([obj])
 
                 elif obj.__class__.__name__ == "ProductDocumentRelationship":
-#                elif isinstance(obj, ProductDocumentRelationship):
                     #print "save pdr " + obj.pgef_oid
 
                     if self.dbroot[self.PDRDICT].has_key(obj.pgef_oid):
@@ -1129,7 +1127,6 @@
                         self.SaveDocument([obj])
                         
                 elif obj.__class__.__name__ == "ProductModelMaster":
-#                elif isinstance(obj,ProductModelMaster):
                     #print 'found a ProductModelMaster'
                     if self.dbroot[self.PRODUCTMODELMASTER].has_key(obj.pgef_oid):
                         if self.dbroot[self.PRODUCTMODELMASTER][obj.pgef_oid].state:
@@ -1141,7 +1138,6 @@
                         self.SavePMM([obj]) 
                         
                 elif obj.__class__.__name__ == "ProductVersion":
-#                elif isinstance(obj,ProductVersion):
                     #print 'found a ProductVersion'
                     if self.dbroot[self.PRODUCTVERSION].has_key(obj.pgef_oid):
                         if self.dbroot[self.PRODUCTVERSION][obj.pgef_oid].state:
@@ -1153,7 +1149,6 @@
                         self.SavePV([obj])  
                         
                 elif obj.__class__.__name__ == "ProductMaster":
-#                elif isinstance(obj,ProductMaster):
                     #print 'found a ProductMaster'
                     if self.dbroot[self.PRODUCTMASTER].has_key(obj.pgef_oid):
                         if self.dbroot[self.PRODUCTMASTER][obj.pgef_oid].state:
@@ -1165,7 +1160,6 @@
                         self.SavePM([obj])
                         
                 elif obj.__class__.__name__ == "WfProcess":
-#                elif isinstance(obj, WfProcess):
                     #print "localdb.save.wfprocess"
                     if self.dbroot[self.WFPROCESS].has_key(obj.pgef_oid):
                         #print "have key"
@@ -1177,18 +1171,14 @@
                             if override:
                                 #print "override", obj.pgef_oid
                                 self.SaveWfProcess([obj])
-#                                retlist.extend(self.SaveWfProcess([obj]))
                         else:
                             #print "no state", obj.pgef_oid
                             self.SaveWfProcess([obj])
-#                            retlist.extend(self.SaveWfProcess([obj]))
                     else:
                         #print "no key", obj.pgef_oid
                         self.SaveWfProcess([obj])
-#                        retlist.extend(self.SaveWfProcess([obj]))
 
                 elif obj.__class__.__name__ == "WfActivity":
-#                elif isinstance(obj, WfActivity):
                     #print "localdb.save.wfactivity"
                     if self.dbroot[self.WFACTIVITY].has_key(obj.pgef_oid):
                         #print "have key"
@@ -1199,19 +1189,15 @@
                             #print "obj.state " + str(obj.state)
                             if override:
                                 #print "override", obj.pgef_oid
-#                                retlist.extend(self.SaveWfActivity([obj]))
                                 self.SaveWfActivity([obj])
                         else:
                             #print "no state", obj.pgef_oid
-#                            retlist.extend(self.SaveWfActivity([obj]))
                             self.SaveWfActivity([obj])
                     else:
                         #print "no key", obj.pgef_oid
-#                        retlist.extend(self.SaveWfActivity([obj]))
                         self.SaveWfActivity([obj])
 
                 elif obj.__class__.__name__ == "WfEventAudit":
-#                elif isinstance(obj, WfEventAudit):
                     #print "localdb.save.wfeventaudit"
                     if self.dbroot[self.WFEVENTAUDIT].has_key(obj.pgef_oid):
                         #print "have key"
@@ -1222,20 +1208,15 @@
                             #print "obj.state " + str(obj.state)
                             if override:
                                 #print "override", obj.pgef_oid
-#                                retlist.extend(self.SaveWfEventAudit([obj])) 
                                 self.SaveWfEventAudit([obj])
                         else:
                             #print "no state", obj.pgef_oid
-#                            retlist.extend(self.SaveWfEventAudit([obj]))
                             self.SaveWfEventAudit([obj])
                     else:
                         #print "no key", obj.pgef_oid
-#                        retlist.extend(self.SaveWfEventAudit([obj]))
                         self.SaveWfEventAudit([obj])
 
                 elif obj.__class__.__name__ == "WfTransition":
-#                elif isinstance(obj, WfTransition):
-                    #print "localdb.save.wfeventaudit"
                     if self.dbroot[self.WFTRANSITION].has_key(obj.pgef_oid):
                         #print "have key"
                         #print "objid: " + obj.pgef_oid
@@ -1245,19 +1226,14 @@
                             #print "obj.state " + str(obj.state)
                             if override:
                                 #print "override", obj.pgef_oid
-#                                retlist.extend(self.SaveWfEventAudit([obj])) 
                                 self.SaveWfTransition([obj])
                         else:
                             #print "no state", obj.pgef_oid
-#                            retlist.extend(self.SaveWfEventAudit([obj]))
                             self.SaveWfTransition([obj])
                     else:
                         #print "no key", obj.pgef_oid
-#                        retlist.extend(self.SaveWfEventAudit([obj]))
                         self.SaveWfTransition([obj])
                 elif obj.__class__.__name__ == "Project":
-#                elif isinstance(obj, WfTransition):
-                    #print "localdb.save.wfeventaudit"
                     if self.dbroot[self.PROJECTOBJECTS].has_key(obj.pgef_oid):
                         #print "have key"
                         #print "objid: " + obj.pgef_oid
@@ -1267,15 +1243,12 @@
                             #print "obj.state " + str(obj.state)
                             if override:
                                 #print "override", obj.pgef_oid
-#                                retlist.extend(self.SaveWfEventAudit([obj])) 
                                 self.dbroot[self.PROJECTOBJECTS][obj.pgef_oid] = obj
                         else:
                             #print "no state", obj.pgef_oid
-#                            retlist.extend(self.SaveWfEventAudit([obj]))
                             self.dbroot[self.PROJECTOBJECTS][obj.pgef_oid] = obj
                     else:
                         #print "no key", obj.pgef_oid
-#                        retlist.extend(self.SaveWfEventAudit([obj]))
                         self.dbroot[self.PROJECTOBJECTS][obj.pgef_oid] = obj
                 else:
                     print "have unknown obj to save", obj.__class__.__name__, obj.id
@@ -1300,7 +1273,6 @@
 
     def RemovePartsList(self, obj):
         if obj.__class__.__name__ == "PartsList":
-#        if isinstance(obj, partslist.PartsList):
             if self.dbroot[self.PARTSLISTDICT].has_key(obj.pgef_oid):
                 del self.dbroot[self.PARTSLISTDICT][obj.pgef_oid]  
         elif isinstance(obj, types.StringType):
@@ -1320,7 +1292,6 @@
 
     def RemoveItem(self, item):
         if item.__class__.__name__ == "ProductModelVersion":
-#        if isinstance(item, ProductModelVersion):
             if self.dbroot[self.ITEMDICT].has_key(item.pgef_oid):
                 del self.dbroot[self.ITEMDICT][item.pgef_oid]  
         elif isinstance(item, types.StringType):
@@ -1333,7 +1304,6 @@
                 
     def RemoveACU(self, acuobj):
         if acuobj.__class__.__name__ == "AssemblyComponentUsage":
-#        if isinstance(acuobj, AssemblyComponentUsage):
             if self.dbroot[self.ACUDICT].has_key(acuobj.pgef_oid):
 
                 del self.dbroot[self.ACUDICT][acuobj.pgef_oid]
@@ -1400,7 +1370,6 @@
 
         for wfid, wfobj in uncommitted_dict.items():
             if wfobj.__class__.__name__ == "WfProcess":
-#            if isinstance(wfobj, WfProcess):
                 if objdict.has_key(wfid):
                     if wfobj.state <> objectstatus.DELETE:
                         tmpobj = self.GetWfProcess(wfobj.pgef_oid)
@@ -1501,7 +1470,6 @@
                     #print "wftransition"
                     self.SaveWfTransition([tvalue])
                     #print "saved wftransition"
-                
 
 
     def SaveWfProcessTemplate(self, wflist):

From waterbug at ned.gsfc.nasa.gov  Tue Oct 21 18:28:44 2003
From: waterbug at ned.gsfc.nasa.gov (waterbug CVS)
Date: Tue Oct 21 17:28:46 2003
Subject: [Pangalactic-commits] Added attrs symbolic_tag and content.
Message-ID: <200310212128.h9LLSiYH002857@ned.gsfc.nasa.gov>

Modified files:
PanGalactic/pangalactic/enterprise/docversion.py 1.13 1.14

Log message:
Added attrs symbolic_tag and content.


Index: PanGalactic/pangalactic/enterprise/docversion.py
diff -u PanGalactic/pangalactic/enterprise/docversion.py:1.13 PanGalactic/pangalactic/enterprise/docversion.py:1.14
--- PanGalactic/pangalactic/enterprise/docversion.py:1.13	Tue Oct 21 17:25:18 2003
+++ PanGalactic/pangalactic/enterprise/docversion.py	Tue Oct 21 17:28:43 2003
@@ -1,10 +1,10 @@
-# $Id: docversion.py,v 1.13 2003/10/21 21:25:18 pbear Exp $
+# $Id: docversion.py,v 1.14 2003/10/21 21:28:43 waterbug Exp $
 
 """
 Version-specific attributes of a document.
 """
 
-__version__ = "$Revision: 1.13 $"[11:-2]
+__version__ = "$Revision: 1.14 $"[11:-2]
 
 from pangalactic.enterprise.pgefobject import PgefObject
 from pangalactic.enterprise.docmaster import DocMaster as DM
@@ -52,9 +52,8 @@
     _schema_ext = {
                    'of_dm_id'         : 'str',
                    'of_dm_id_context' : 'str',
-                   'tag'              : 'str',
-                   'content'          : 'str',
-                   'abstract'         : 'str'
+                   'symbolic_tag'     : 'str',
+                   'content'          : 'str'
                   }
     _schema = _schema_ext.copy()
     _schema.update(PgefObject._schema)

From waterbug at ned.gsfc.nasa.gov  Tue Oct 21 18:29:25 2003
From: waterbug at ned.gsfc.nasa.gov (waterbug CVS)
Date: Tue Oct 21 17:29:26 2003
Subject: [Pangalactic-commits] Added attrs digital_flag and purpose.
Message-ID: <200310212129.h9LLTPkW002890@ned.gsfc.nasa.gov>

Modified files:
PanGalactic/pangalactic/enterprise/docrep.py 1.14 1.15

Log message:
Added attrs digital_flag and purpose.


Index: PanGalactic/pangalactic/enterprise/docrep.py
diff -u PanGalactic/pangalactic/enterprise/docrep.py:1.14 PanGalactic/pangalactic/enterprise/docrep.py:1.15
--- PanGalactic/pangalactic/enterprise/docrep.py:1.14	Tue Oct 21 17:25:18 2003
+++ PanGalactic/pangalactic/enterprise/docrep.py	Tue Oct 21 17:29:23 2003
@@ -1,10 +1,10 @@
-# $Id: docrep.py,v 1.14 2003/10/21 21:25:18 pbear Exp $
+# $Id: docrep.py,v 1.15 2003/10/21 21:29:23 waterbug Exp $
 
 """
 A representation or format of a document.
 """
 
-__version__ = "$Revision: 1.14 $"[11:-2]
+__version__ = "$Revision: 1.15 $"[11:-2]
 
 from pangalactic.enterprise.pgefobject import PgefObject
 from pangalactic.enterprise.docversion import DocVersion as DV
@@ -51,7 +51,9 @@
     _schema_ext = {
                    'of_dv_id'         : 'str',
                    'of_dm_id'         : 'str',
-                   'of_dm_id_context' : 'str'
+                   'of_dm_id_context' : 'str',
+                   'digital_flag'     : 'str',
+                   'purpose'          : 'str'
                   }
     # when the client can use Python 2.3 and we can use Sets,
     # this will become a lot easier ...

From waterbug at ned.gsfc.nasa.gov  Tue Oct 21 18:30:23 2003
From: waterbug at ned.gsfc.nasa.gov (waterbug CVS)
Date: Tue Oct 21 17:30:24 2003
Subject: [Pangalactic-commits] Added attribute symbolic_tag.
Message-ID: <200310212130.h9LLUNQ8002975@ned.gsfc.nasa.gov>

Modified files:
PanGalactic/pangalactic/enterprise/productversion.py 1.21 1.22

Log message:
Added attribute symbolic_tag.


Index: PanGalactic/pangalactic/enterprise/productversion.py
diff -u PanGalactic/pangalactic/enterprise/productversion.py:1.21 PanGalactic/pangalactic/enterprise/productversion.py:1.22
--- PanGalactic/pangalactic/enterprise/productversion.py:1.21	Fri Oct 17 16:49:53 2003
+++ PanGalactic/pangalactic/enterprise/productversion.py	Tue Oct 21 17:30:21 2003
@@ -1,12 +1,12 @@
-# $Id: productversion.py,v 1.21 2003/10/17 20:49:53 waterbug Exp $
+# $Id: productversion.py,v 1.22 2003/10/21 21:30:21 waterbug Exp $
 
 """
 Version-dependent product data.
 
-@version: $Revision: 1.21 $
+@version: $Revision: 1.22 $
 """
 
-__version__ = "$Revision: 1.21 $"[11:-2]
+__version__ = "$Revision: 1.22 $"[11:-2]
 
 from pangalactic.enterprise.pgefobject import PgefObject
 from pangalactic.enterprise.project import Project
@@ -65,7 +65,7 @@
                        'of_pm_id_context'   : 'str',
                        'project_id'         : 'str',
                        'project_id_context' : 'str',
-                       'tag'                : 'str',
+                       'symbolic_tag'       : 'str',
                        'has_docs_flag'      : 'bool'
                       }
     _schema = _schema_ext.copy()

From waterbug at ned.gsfc.nasa.gov  Tue Oct 21 18:32:30 2003
From: waterbug at ned.gsfc.nasa.gov (waterbug CVS)
Date: Tue Oct 21 17:32:32 2003
Subject: [Pangalactic-commits] Docstring clarifications.
Message-ID: <200310212132.h9LLWUEW003085@ned.gsfc.nasa.gov>

Modified files:
PanGalactic/pangalactic/repo/factory.py 1.30 1.31

Log message:
Docstring clarifications.


Index: PanGalactic/pangalactic/repo/factory.py
diff -u PanGalactic/pangalactic/repo/factory.py:1.30 PanGalactic/pangalactic/repo/factory.py:1.31
--- PanGalactic/pangalactic/repo/factory.py:1.30	Tue Oct  7 23:39:36 2003
+++ PanGalactic/pangalactic/repo/factory.py	Tue Oct 21 17:32:28 2003
@@ -1,17 +1,18 @@
-# $Id: factory.py,v 1.30 2003/10/08 03:39:36 waterbug Exp $
+# $Id: factory.py,v 1.31 2003/10/21 21:32:28 waterbug Exp $
 
 """
 Pan Galactic Object Factory module
-@version: $Revision: 1.30 $
+@version: $Revision: 1.31 $
 """
 
-__version__ = "$Revision: 1.30 $"[11:-2]
+__version__ = "$Revision: 1.31 $"[11:-2]
 
 import types
 from pprint import pprint
 from twisted.internet import defer
 from twisted.python import log
 from pangalactic.utils.factory import PgefFactory
+from pangalactic.utils import utils
 
 class PgerObjectFactory(PgefFactory):
     """
@@ -54,7 +55,7 @@
 
     def resultset2Extract(self, res):
         """
-        Convert a pyPgSQL resultset into an "extract"
+        Convert a pyPgSQL PgResultSet into an "extract"
         (see L{pangalactic.utils.factory.extract}).
         """
         obj = self._registry.pgerdb_classes[res.pgef_class]
@@ -158,7 +159,7 @@
                            pger_objects attribute of
                            L{pangalactic.repo.registry.PgerObjectRegistry}
         @type resultsets:  L{twisted.internet.defer.Deferred}
-        @param resultsets: a deferred list of resultsets from
+        @param resultsets: a deferred list of PgResultSets from
                            L{pangalactic.repo.db.PgerDb}
         """
         klass = self._registry.pgerdb_classes[classname]

From waterbug at ned.gsfc.nasa.gov  Wed Oct 22 15:06:26 2003
From: waterbug at ned.gsfc.nasa.gov (waterbug CVS)
Date: Wed Oct 22 14:06:27 2003
Subject: [Pangalactic-commits] Tweaks to Document and DocVersion ... ;)
Message-ID: <200310221806.h9MI6QZG016877@ned.gsfc.nasa.gov>

Modified files:
PanGalactic/pangalactic/enterprise/document.py 1.13 1.14
PanGalactic/pangalactic/enterprise/docversion.py 1.14 1.15

Log message:
Tweaks to Document and DocVersion ... ;)


Index: PanGalactic/pangalactic/enterprise/docversion.py
diff -u PanGalactic/pangalactic/enterprise/docversion.py:1.14 PanGalactic/pangalactic/enterprise/docversion.py:1.15
--- PanGalactic/pangalactic/enterprise/docversion.py:1.14	Tue Oct 21 17:28:43 2003
+++ PanGalactic/pangalactic/enterprise/docversion.py	Wed Oct 22 14:06:25 2003
@@ -1,10 +1,10 @@
-# $Id: docversion.py,v 1.14 2003/10/21 21:28:43 waterbug Exp $
+# $Id: docversion.py,v 1.15 2003/10/22 18:06:25 waterbug Exp $
 
 """
 Version-specific attributes of a document.
 """
 
-__version__ = "$Revision: 1.14 $"[11:-2]
+__version__ = "$Revision: 1.15 $"[11:-2]
 
 from pangalactic.enterprise.pgefobject import PgefObject
 from pangalactic.enterprise.docmaster import DocMaster as DM
@@ -52,7 +52,7 @@
     _schema_ext = {
                    'of_dm_id'         : 'str',
                    'of_dm_id_context' : 'str',
-                   'symbolic_tag'     : 'str',
+                   'revision'         : 'str',
                    'content'          : 'str'
                   }
     _schema = _schema_ext.copy()
@@ -67,10 +67,10 @@
             assert _of_master.__class__.__name__ == 'DocMaster'
         except:
             raise TypeError, "Expecting a DocMaster instance as argument 2"
-
         self._of_master = _of_master
         self.of_dm_id = self._of_master.id
         self.of_dm_id_context = self._of_master.id_context
+        self.revision = kw.get('revision', self.id)
 
     def __getattr__(self, name):
         return PgefObject.__getattr__(self, name)

Index: PanGalactic/pangalactic/enterprise/document.py
diff -u PanGalactic/pangalactic/enterprise/document.py:1.13 PanGalactic/pangalactic/enterprise/document.py:1.14
--- PanGalactic/pangalactic/enterprise/document.py:1.13	Tue Oct 21 17:25:18 2003
+++ PanGalactic/pangalactic/enterprise/document.py	Wed Oct 22 14:06:25 2003
@@ -1,10 +1,10 @@
-# $Id: document.py,v 1.13 2003/10/21 21:25:18 pbear Exp $
+# $Id: document.py,v 1.14 2003/10/22 18:06:25 waterbug Exp $
 
 """
 The Mother of all document types in PGEF.
 """
 
-__version__ = "$Revision: 1.13 $"[11:-2]
+__version__ = "$Revision: 1.14 $"[11:-2]
 
 import string
 
@@ -42,6 +42,8 @@
                 # we may want to substitute DocType() or even
                 # PrettyDocType() here ...
                ]
+    # this is a mapped class (not PGEF Core)
+    _mapped = True
     # These are from the Dublin Core, and are computed from the
     # attributes of the associated DocMaster and DocVersion:
     _properties = {
@@ -56,8 +58,8 @@
     _refd = {
              '_master' : 'DocMaster'
             }
-#    _required = ['master_oid']  # for the time being, don't require any fields
-    _required = []
+#    _required = ['master_oid']
+    _required = []  # for the time being, don't require any fields
     _schema_ext = {
                    'master_oid' : 'str'
                   }
@@ -72,22 +74,31 @@
         for a in kw:
             if a in self._properties:
                 setattr(self, a, kw[a])
-
+        self._master = kw.get('_master', DocMaster(email=email))
         self._versions = {}
-        self._master = DocMaster()
-        v = DocVersion(_of_master = self._master)
-        self.setCurrentVersion(v)
-
+        v = DocVersion(_of_master=self._master, id='1')
+        self._current_version = v
         self._reps = {}
         self._drfiles = {}
 
     def deleteAttr(self):
         raise TypeError, 'Cannot delete attribute'
 
-    def addRep(self, rep, drfiles = None):
-        repdict = self._reps.get(rep.of_dv_id, {})
-        repdict[rep.pgef_oid] = rep        
-        self._reps[rep.of_dv_id] = repdict
+    def addRep(self, files=None,
+               rev=self._current_version.revision, **kw):
+        """
+        Add a new document representation.  (This will create a
+        DocRep object and add it to the representations of the
+        current version (or of another version, if a "rev" is
+        specified.
+        """
+        try:
+            assert rev in self._revisions
+        except:
+            raise ValueError, "rev must be in self._revisions"
+        repdict = self._reps.get(vid, {})
+        repdict[rep.pgef_oid] = rep
+        self._reps[vid] = repdict
         if drfiles:
             for drfile in drfiles:
                 self.addDrFile(drfile)
@@ -120,10 +131,10 @@
     def setCurrentVersion(self, v):
         self._versions[v.id] = v
 
-    CurrentVersion = property(getCurrentVersion,
+    _current_version = property(getCurrentVersion,
                               setCurrentVersion,
                               deleteAttr,
-                              "CurrentVersion")
+                              "_current_version")
         
     def getTitle(self):
         # What if a document's Title changes?  It is actually the
@@ -165,15 +176,47 @@
     Creator = property(getCreator, setCreator, deleteAttr, 'Creator')
 
     def getRevision(self):
-        return self._current_version.id
+        """
+        Get the revision identifier for the Document's current
+        version.
+        """
+        return self._current_version.revision
 
     def setRevision(self, value):
-        self._current_version.__dict__['id'] = value
+        """
+        Assign a revision identifier to the current version.
+        (Interestingly enough, the Document provides a context
+        within which a uniqueness rule can be enforced.)
+        """
+        try:
+            assert value not in [v.revision for v in
+                                 self._versions.values()]
+        except:
+            raise ValueError, "Revision identifiers must be unique."
+        self._current_version.__dict__['revision'] = value
 
     Revision = property(getRevision,
                         setRevision,
                         deleteAttr,
                         'Revision')
+
+    def getRevisions(self):
+        """
+        Get the list of revision identifiers for this Document.
+        """
+        return [v.revision for v in self._versions]
+
+    def setRevisions(self, value):
+        # 'setDate' is an error because the date should not be
+        # set from a string -- interfaces should always provided
+        # validated date-creation widgets, and then update
+        # create_datetime (a DateTime object) via its API.
+        raise TypeError, '_revisions is a read-only, computed attribute.'
+
+    _revisions = property(getRevisions,
+                          setRevisions,
+                          deleteAttr,
+                          '_revisions')
 
     def getDescription(self):
         return self._master.long_description

From waterbug at ned.gsfc.nasa.gov  Wed Oct 22 16:55:40 2003
From: waterbug at ned.gsfc.nasa.gov (waterbug CVS)
Date: Wed Oct 22 15:55:42 2003
Subject: [Pangalactic-commits] symbolic_tag -> revision
Message-ID: <200310221955.h9MJte9X019750@ned.gsfc.nasa.gov>

Modified files:
PanGalactic/pangalactic/enterprise/productversion.py 1.22 1.23

Log message:
symbolic_tag -> revision


Index: PanGalactic/pangalactic/enterprise/productversion.py
diff -u PanGalactic/pangalactic/enterprise/productversion.py:1.22 PanGalactic/pangalactic/enterprise/productversion.py:1.23
--- PanGalactic/pangalactic/enterprise/productversion.py:1.22	Tue Oct 21 17:30:21 2003
+++ PanGalactic/pangalactic/enterprise/productversion.py	Wed Oct 22 15:55:39 2003
@@ -1,12 +1,12 @@
-# $Id: productversion.py,v 1.22 2003/10/21 21:30:21 waterbug Exp $
+# $Id: productversion.py,v 1.23 2003/10/22 19:55:39 waterbug Exp $
 
 """
 Version-dependent product data.
 
-@version: $Revision: 1.22 $
+@version: $Revision: 1.23 $
 """
 
-__version__ = "$Revision: 1.22 $"[11:-2]
+__version__ = "$Revision: 1.23 $"[11:-2]
 
 from pangalactic.enterprise.pgefobject import PgefObject
 from pangalactic.enterprise.project import Project
@@ -65,7 +65,7 @@
                        'of_pm_id_context'   : 'str',
                        'project_id'         : 'str',
                        'project_id_context' : 'str',
-                       'symbolic_tag'       : 'str',
+                       'revision'           : 'str',
                        'has_docs_flag'      : 'bool'
                       }
     _schema = _schema_ext.copy()

From pbear at ned.gsfc.nasa.gov  Thu Oct 23 16:06:22 2003
From: pbear at ned.gsfc.nasa.gov (pbear CVS)
Date: Thu Oct 23 15:06:27 2003
Subject: [Pangalactic-commits] removed image_wdr directories; fixed imports;
	regenerated ToolkitImages
Message-ID: <200310231906.h9NJ6MVw000487@ned.gsfc.nasa.gov>

Modified files:
PanGalactic/setup.py 1.15 1.16
PanGalactic/pangalactic/client/fnord.py 1.64 1.65
PanGalactic/pangalactic/client/setup.py 1.7 1.8
PanGalactic/pangalactic/client/dataobjects/securitymanager.py 1.13 None
PanGalactic/pangalactic/client/images/img2py.py 1.1.1.1 1.2
PanGalactic/pangalactic/client/images/img2xpm.py 1.1.1.1 1.2
PanGalactic/pangalactic/client/images/maketoolkitimages.py 1.3 1.4
PanGalactic/pangalactic/client/modules/psm/doctreeframe.py 1.14 1.15
PanGalactic/pangalactic/client/modules/psm/itemeditframe.py 1.107 1.108
PanGalactic/pangalactic/client/modules/psm/partslisttreeframe.py 1.19 1.20
PanGalactic/pangalactic/client/modules/psm/partslistview.py 1.10 1.11
PanGalactic/pangalactic/client/modules/psm/pgefedittree.py 1.32 1.33
PanGalactic/pangalactic/client/modules/psm/propertiesform.py 1.10 1.11
PanGalactic/pangalactic/client/modules/psm/psmtool.py 1.118 1.119
PanGalactic/pangalactic/client/modules/psm/aboutbox.py 1.3 None
PanGalactic/pangalactic/client/modules/psm/aboutbox_wdr.py 1.4 None
PanGalactic/pangalactic/client/modules/psm/configgrid_wdr.py 1.2 None
PanGalactic/pangalactic/client/modules/psm/customizegrid.py 1.8 None
PanGalactic/pangalactic/client/modules/psm/foreigngrid.wdr 1.1.1.1 None
PanGalactic/pangalactic/client/modules/psm/foreigngrid_wdr.py 1.1.1.1 None
PanGalactic/pangalactic/client/modules/psm/test_aboutbox.py 1.1.1.1 None
PanGalactic/pangalactic/client/support/datepanel.py 1.5 None
PanGalactic/pangalactic/client/support/pgefscrolledwindow.py 1.2 None
PanGalactic/pangalactic/client/tests/test_aboutbox.py 1.2 1.3
PanGalactic/pangalactic/enterprise/document.py 1.14 1.15
PanGalactic/pangalactic/enterprise/pgefadvisory.py 1.41 1.42
PanGalactic/pangalactic/utils/aboutbox.py None 1.1
PanGalactic/pangalactic/utils/aboutbox_gui.py None 1.1
PanGalactic/pangalactic/utils/customizegrid_gui.py None 1.1
PanGalactic/pangalactic/utils/ToolkitImages.py 1.1 1.2
PanGalactic/pangalactic/utils/__init__.py 1.4 1.5
PanGalactic/pangalactic/utils/configuredisplay.py 1.2 1.3
PanGalactic/pangalactic/utils/datamanager.py 1.49 1.50
PanGalactic/pangalactic/utils/localdb.py 1.42 1.43
PanGalactic/pangalactic/utils/securitymanager.py 1.3 1.4
PanGalactic/pangalactic/utils/xmlrpcinterface.py 1.23 1.24
PanGalactic/pangalactic/utils/configdbbrowser_wdr.py 1.1 None
PanGalactic/pangalactic/utils/customizegrid_wdr.py 1.1 None

Log message:
removed image_wdr directories; fixed imports; regenerated ToolkitImages


Index: PanGalactic/pangalactic/client/modules/psm/partslisttreeframe.py
diff -u PanGalactic/pangalactic/client/modules/psm/partslisttreeframe.py:1.19 PanGalactic/pangalactic/client/modules/psm/partslisttreeframe.py:1.20
--- PanGalactic/pangalactic/client/modules/psm/partslisttreeframe.py:1.19	Fri Sep 26 15:47:11 2003
+++ PanGalactic/pangalactic/client/modules/psm/partslisttreeframe.py	Thu Oct 23 15:06:18 2003
@@ -2,18 +2,22 @@
 
 import copy
 from wxPython.wx import *
+
 import pangalactic.enterprise.partslist as partslist
-from pangalactic.client.modules.psm import partslistview 
-import pangalactic.client.modules.psm.partslistform as partslistform
-import pangalactic.client.modules.psm.pgefdoctree as pgefdoctree
-import pangalactic.client.modules.psm.doctreeframe as doctreeframe
+
 from pangalactic.utils.securitymanager import actions as security_actions
 from pangalactic.utils.pgefexceptions import RequiredDataError
 from pangalactic.utils import objectstatus
 from pangalactic.utils import preferences
 import pangalactic.utils.toolframe as toolframe
-import dataobjects.partslistinfo as partslistinfo
-import dataobjects.partslistmap as partslistmap
+
+from pangalactic.client.modules.psm import partslistview 
+import pangalactic.client.modules.psm.partslistform as partslistform
+import pangalactic.client.modules.psm.pgefdoctree as pgefdoctree
+import pangalactic.client.modules.psm.doctreeframe as doctreeframe
+
+import pangalactic.client.dataobjects.partslistinfo as partslistinfo
+import pangalactic.client.dataobjects.partslistmap as partslistmap
 
 
 try:
@@ -21,7 +25,7 @@
 except:
     print "partslisttreeframe.plmimport.failed"
 
-__version__ = "$Revision: 1.19 $"[11:-2]
+__version__ = "$Revision: 1.20 $"[11:-2]
 
 
 class PartsListTreeFrame(doctreeframe.DocTreeFrame):

Index: PanGalactic/pangalactic/client/modules/psm/partslistview.py
diff -u PanGalactic/pangalactic/client/modules/psm/partslistview.py:1.10 PanGalactic/pangalactic/client/modules/psm/partslistview.py:1.11
--- PanGalactic/pangalactic/client/modules/psm/partslistview.py:1.10	Tue May 27 06:45:13 2003
+++ PanGalactic/pangalactic/client/modules/psm/partslistview.py	Thu Oct 23 15:06:18 2003
@@ -1,19 +1,16 @@
-from wxPython.wx import wxPanel, wxTAB_TRAVERSAL, wxPyTypeCast, wxPyDefaultPosition, wxPyDefaultSize, true, false
-from wxPython.grid import *
-from partslistview_wdr import *
 import os
 import string
 
-#import pgefgrid
+from wxPython.wx import wxPanel, wxTAB_TRAVERSAL, wxPyTypeCast, wxPyDefaultPosition, wxPyDefaultSize, true, false
+from wxPython.grid import *
 
+from pangalactic.client.modules.psm.partslistview_wdr import *
+import pangalactic.client.support.httpdownload as httpdownload
 
 try:
     import modules.plm.ms2file as ms2file
 except:
-    print "Can you say L-i-n-u-x?"
-
-    
-
+    print "It's L-i-n-u-x.  What's with this MSExcel hoohah?"
 
 
 class PartsListView(wxPanel):
@@ -25,8 +22,6 @@
         self.DataManager = None
         self._loggedin = false
         
-        #log.debug(repr("current project: %s" % self.State.currentproject))
-
         self.EpimsNames = ["Part ID", "Project Name Code", "Spec", "Generic", "MFR", "NSN", "CAGE Code", "Name Code", "FSC Code", "Description", "Package Type", "Specification", "Screening Specification", "Failure Rate Level", "NASA NSPAR Number", "Lot Date Code", "Quantity", "Serial Number"]
 
         self.partslistgrid = wxGrid(self, ID_FOREIGN_PARTSLISTVIEW)
@@ -59,7 +54,7 @@
                 #print "header file exists"
             else:
                 if self._loggedin:
-                    retval = support.httpdownload.DownloadFile(tmpdir, self.schemafilename, user, host, port, "dictionary")
+                    retval = httpdownload.DownloadFile(tmpdir, self.schemafilename, user, host, port, "dictionary")
                 else:
                     #print "Parts Lists are not available in local mode"
                     return
@@ -100,7 +95,7 @@
                 else:
 #                    print "self.LoggedIn: " + str(self.LoggedIn)
                     if self._loggedin:
-                        retval = support.httpdownload.DownloadFile(tmpdir, pl._UploadFileName, user, host, port, "parts_list")
+                        retval = httpdownload.DownloadFile(tmpdir, pl._UploadFileName, user, host, port, "parts_list")
                     else:
                         #print "Parts Lists are not available in local mode"
                         dlg.Destroy()

Index: PanGalactic/pangalactic/utils/__init__.py
diff -u PanGalactic/pangalactic/utils/__init__.py:1.4 PanGalactic/pangalactic/utils/__init__.py:1.5
--- PanGalactic/pangalactic/utils/__init__.py:1.4	Wed Oct  1 13:24:14 2003
+++ PanGalactic/pangalactic/utils/__init__.py	Thu Oct 23 15:06:20 2003
@@ -1,16 +1,22 @@
 __all__ = [
+'aboutbox',
+'aboutbox_gui',
+'acrobat5',
 'acrobatwrapper',
+'advisoryfonts',
+'advisoryreport',
 'basegrid',
 'configdbbrowser',
-'configdbbrowser_wdr',
 'convertimage',
 'configuregrid',
 'configuredisplay',
-'customizegrid_wdr',
+'customizegrid_gui',
 'datamanager',
 'data_utils',
+'datepanel',
 'dbbrowser',
 'dbbrowser_wdr',
+'factory',
 'httpupload',
 'localdb',
 'loginclass',
@@ -27,10 +33,12 @@
 'pgdialogs',
 'pgdialogs_wdr',
 'pgefdatatable',
+'pgefevents',
 'preferences',
 'proxyclass',
 'proxydialog_wdr',
 'pystrptime',
+'registry',
 'reportlab_blocks',
 'securitymanager',
 'serverclass',
@@ -39,8 +47,8 @@
 'toolframe',
 'ToolkitImages',
 'toolstate',
+'utils',
 'xmlrpcinterface',
 'xmlrpclib_proxy'
-'utils',
 'xlate_list',
 'xlator']

Index: PanGalactic/pangalactic/client/modules/psm/pgefedittree.py
diff -u PanGalactic/pangalactic/client/modules/psm/pgefedittree.py:1.32 PanGalactic/pangalactic/client/modules/psm/pgefedittree.py:1.33
--- PanGalactic/pangalactic/client/modules/psm/pgefedittree.py:1.32	Tue Oct 21 17:25:18 2003
+++ PanGalactic/pangalactic/client/modules/psm/pgefedittree.py	Thu Oct 23 15:06:18 2003
@@ -89,7 +89,7 @@
 
     def LoadTreefromObjects(self, datamanager, rootitemid, rootnauoid, currentdata = None, product_type = None):
         """Loads the tree from the dicts in the DataManager"""
-        print "pgefedittree.loadtreefromobjects"
+        #print "pgefedittree.loadtreefromobjects"
 
         #print "refresh: " + str(self.DataManager.refresh)
         self.DeleteAllItems()
@@ -164,7 +164,7 @@
 
         else:
             if self.DataManager.inLocalMode:
-                print "localmode", self.DataManager.currentProject
+                #print "localmode", self.DataManager.currentProject
                 localnauos = self.DataManager.localDB.GetLocalNauos(self.DataManager.currentProject)
                 #print "localnauos"
                 #import pprint
@@ -175,7 +175,7 @@
                 #print "NauoNodes", NauoNodes
 
             else:
-                print "logged in"
+                #print "logged in"
                 if self.DataManager.nauoIDs.has_key(lookupid):
                     #import pprint
                     #print "NauoIDs"
@@ -219,6 +219,6 @@
         else:
             self.SelectItem(rootnode)
 
-        print "end pgefedittree.loadtreefromobjects"
+        #print "end pgefedittree.loadtreefromobjects"
 
 

Index: PanGalactic/setup.py
diff -u PanGalactic/setup.py:1.15 PanGalactic/setup.py:1.16
--- PanGalactic/setup.py:1.15	Wed Jun 25 04:10:33 2003
+++ PanGalactic/setup.py	Thu Oct 23 15:06:16 2003
@@ -4,7 +4,7 @@
 
 # created 2002/09/14 Steve Waterbury
 
-__revision__ = "$Id: setup.py,v 1.15 2003/06/25 08:10:33 waterbug Exp $"
+__revision__ = "$Id: setup.py,v 1.16 2003/10/23 19:06:16 pbear Exp $"
 
 from distutils.core import setup
 from distutils.command.install_data import install_data
@@ -52,16 +52,16 @@
                   'pangalactic.utils'
                   ],
       data_files = [('pangalactic', ['pangalactic/plugins.tml']),
-                    ("aboutbox_wdr", 
-                         ["pangalactic/client/modules/psm/aboutbox_wdr/About_0.png", 
-                          "pangalactic/client/modules/psm/aboutbox_wdr/About_1.png"]),
-                    ("configgrid_wdr", 
-                         ["pangalactic/client/modules/psm/configgrid_wdr/ConfigBitmapsFunc_0.png",
-                          "pangalactic/client/modules/psm/configgrid_wdr/ConfigBitmapsFunc_1.png",
-                          "pangalactic/client/modules/psm/configgrid_wdr/ConfigBitmapsFunc_2.png",
-                          "pangalactic/client/modules/psm/configgrid_wdr/ConfigBitmapsFunc_3.png",
-                          "pangalactic/client/modules/psm/configgrid_wdr/ConfigBitmapsFunc_4.png",
-                          "pangalactic/client/modules/psm/configgrid_wdr/ConfigBitmapsFunc_5.png"]),
+#                    ("aboutbox_wdr", 
+#                         ["pangalactic/client/modules/psm/aboutbox_wdr/About_0.png", 
+#                          "pangalactic/client/modules/psm/aboutbox_wdr/About_1.png"]),
+#                    ("configgrid_wdr", 
+#                         ["pangalactic/client/modules/psm/configgrid_wdr/ConfigBitmapsFunc_0.png",
+#                          "pangalactic/client/modules/psm/configgrid_wdr/ConfigBitmapsFunc_1.png",
+#                          "pangalactic/client/modules/psm/configgrid_wdr/ConfigBitmapsFunc_2.png",
+#                          "pangalactic/client/modules/psm/configgrid_wdr/ConfigBitmapsFunc_3.png",
+#                          "pangalactic/client/modules/psm/configgrid_wdr/ConfigBitmapsFunc_4.png",
+#                          "pangalactic/client/modules/psm/configgrid_wdr/ConfigBitmapsFunc_5.png"]),
                     ("io", 
                          ["pangalactic/client/io/gidep_problem_advisory_layout.pgef", 
                           "pangalactic/client/io/nasa_advisory_layout.pgef", 

Index: PanGalactic/pangalactic/client/setup.py
diff -u PanGalactic/pangalactic/client/setup.py:1.7 PanGalactic/pangalactic/client/setup.py:1.8
--- PanGalactic/pangalactic/client/setup.py:1.7	Wed Sep 10 13:18:09 2003
+++ PanGalactic/pangalactic/client/setup.py	Thu Oct 23 15:06:17 2003
@@ -17,13 +17,16 @@
 
 setup(name="Pan-Galactic PGEF",
       scripts=["fnord.py"],
-      data_files=[("aboutbox_wdr", ["modules/psm/aboutbox_wdr/About_0.png", "modules/psm/aboutbox_wdr/About_1.png"]),
-                  ("configgrid_wdr", ["modules/psm/configgrid_wdr/ConfigBitmapsFunc_0.png",
-                                      "modules/psm/configgrid_wdr/ConfigBitmapsFunc_1.png",
-                                      "modules/psm/configgrid_wdr/ConfigBitmapsFunc_2.png",
-                                      "modules/psm/configgrid_wdr/ConfigBitmapsFunc_3.png",
-                                      "modules/psm/configgrid_wdr/ConfigBitmapsFunc_4.png",
-                                      "modules/psm/configgrid_wdr/ConfigBitmapsFunc_5.png"]),
-                  ("io", ["io/gidep_problem_advisory_layout.pgef", "io/nasa_advisory_layout.pgef", "io/nasa_form_1544_layout.pgef"]),
+      data_files=[("io", ["io/gidep_problem_advisory_layout.pgef", "io/nasa_advisory_layout.pgef", "io/nasa_form_1544_layout.pgef"]),
                   ("help", ["help/help.htm", "help/widgetTest.htm", "help/widgetTest.py"]),
                   (".", ["images/meatball_new.gif"])])
+#      data_files=[("aboutbox_wdr", ["modules/psm/aboutbox_wdr/About_0.png", "modules/psm/aboutbox_wdr/About_1.png"]),
+#                  ("configgrid_wdr", ["modules/psm/configgrid_wdr/ConfigBitmapsFunc_0.png",
+#                                      "modules/psm/configgrid_wdr/ConfigBitmapsFunc_1.png",
+#                                      "modules/psm/configgrid_wdr/ConfigBitmapsFunc_2.png",
+#                                      "modules/psm/configgrid_wdr/ConfigBitmapsFunc_3.png",
+#                                      "modules/psm/configgrid_wdr/ConfigBitmapsFunc_4.png",
+#                                      "modules/psm/configgrid_wdr/ConfigBitmapsFunc_5.png"]),
+#                  ("io", ["io/gidep_problem_advisory_layout.pgef", "io/nasa_advisory_layout.pgef", "io/nasa_form_1544_layout.pgef"]),
+#                  ("help", ["help/help.htm", "help/widgetTest.htm", "help/widgetTest.py"]),
+#                  (".", ["images/meatball_new.gif"])])

Index: PanGalactic/pangalactic/client/tests/test_aboutbox.py
diff -u PanGalactic/pangalactic/client/tests/test_aboutbox.py:1.2 PanGalactic/pangalactic/client/tests/test_aboutbox.py:1.3
--- PanGalactic/pangalactic/client/tests/test_aboutbox.py:1.2	Wed Oct 15 11:03:20 2003
+++ PanGalactic/pangalactic/client/tests/test_aboutbox.py	Thu Oct 23 15:06:19 2003
@@ -1,5 +1,5 @@
 import unittest
-import modules.psm.aboutbox
+import pangalactic.utils.aboutbox
 from wxPython.wx import *
 
 

Index: PanGalactic/pangalactic/client/modules/psm/propertiesform.py
diff -u PanGalactic/pangalactic/client/modules/psm/propertiesform.py:1.10 PanGalactic/pangalactic/client/modules/psm/propertiesform.py:1.11
--- PanGalactic/pangalactic/client/modules/psm/propertiesform.py:1.10	Fri Jun 20 04:44:50 2003
+++ PanGalactic/pangalactic/client/modules/psm/propertiesform.py	Thu Oct 23 15:06:18 2003
@@ -1,12 +1,11 @@
+import os
+
 from wxPython.wx import wxPanel, wxPyDefaultPosition, wxPyDefaultSize, wxTAB_TRAVERSAL, wxDialog, wxDefaultPosition, wxSize
 from wxPython.wx import wxTHICK_FRAME, wxStaticText, wxPoint, wxDefaultSize, wxALIGN_CENTRE, wxSafeYield
 from wxPython.grid import *
-from propertiesform_wdr import *
-import os
-from pangalactic.client.support import httpdownload
-
-
 
+from pangalactic.client.modules.psm.propertiesform_wdr import *
+from pangalactic.client.support import httpdownload
 
 
 class PropertiesForm(wxPanel):

Index: PanGalactic/pangalactic/enterprise/pgefadvisory.py
diff -u PanGalactic/pangalactic/enterprise/pgefadvisory.py:1.41 PanGalactic/pangalactic/enterprise/pgefadvisory.py:1.42
--- PanGalactic/pangalactic/enterprise/pgefadvisory.py:1.41	Tue Oct 21 17:25:18 2003
+++ PanGalactic/pangalactic/enterprise/pgefadvisory.py	Thu Oct 23 15:06:19 2003
@@ -1,11 +1,11 @@
-# $Id: pgefadvisory.py,v 1.41 2003/10/21 21:25:18 pbear Exp $
+# $Id: pgefadvisory.py,v 1.42 2003/10/23 19:06:19 pbear Exp $
 
 """
 Base class for documents that report conditions related to the
 usability of a product.
 """
 
-__version__ = "$Revision: 1.41 $"[11:-2]
+__version__ = "$Revision: 1.42 $"[11:-2]
 
 import os.path
 import string
@@ -91,13 +91,6 @@
     def GetCreateDateStr(self):
         return self._create_date
 
-#    def SetDueDate(self, due_datetime):
-#        self.due_datetime = due_datetime
-
-#    def SetWorkflowState(self, statestr, nextstatestr):
-#        self._workflowstr = statestr
-#        self._next_workflowstr = nextstatestr
-
     def SetAttachments(self, attachments):
         self.attachments = attachments
 
@@ -118,37 +111,8 @@
         # fill in a subject widget with title from metadata form
         pass
 
-
-#     def Generate(self, docdata, tmpdir, attachments):
-#         """
-#         Generate a PDF formatted advisory document.
-#         """
-#         print "pgefadvisory.Generate"
-#         print self._upload_file_name
-#         print "name", self.name
-#         print self.getDocName()
-#         #print "shdesc", self.short_description
-# 
-#         advisoryrpt = AdvisoryReport(self._upload_file_name + ".pdf",
-#                                      self.getDocName(),
-#                                      self.short_description)
-#         advisoryrpt.SetData(docdata)
-#         retval = advisoryrpt.generate(attachments)
-#         #print "end pgefadvisory.Generate", retval
-#         return retval
-# 
-#     def GenerateXML(self, tmpdir):
-#         print "pgefadvisory.generatexml"
-# 
-#         advisoryrpt = AdvisoryReport(self._upload_file_name + ".xml",
-#                                      self.getDocName(),
-#                                      self.short_description)
-#         advisoryrpt.generateXML(tmpdir, [], self.__dict__)
-          
-
     def GetFields(self):
         return self.__dict__
-
 
     def SetData(self, advisory):
         # ??? _should_ work.

Index: PanGalactic/pangalactic/client/images/img2xpm.py
diff -u PanGalactic/pangalactic/client/images/img2xpm.py:1.1.1.1 PanGalactic/pangalactic/client/images/img2xpm.py:1.2
--- PanGalactic/pangalactic/client/images/img2xpm.py:1.1.1.1	Mon Nov  4 14:47:22 2002
+++ PanGalactic/pangalactic/client/images/img2xpm.py	Thu Oct 23 15:06:17 2003
@@ -1,4 +1,14 @@
-#!/usr/bin/env python
+#----------------------------------------------------------------------
+# Name:        wxPython.tools.img2xpm
+# Purpose:     Convert an image to XPM format
+#
+# Author:      Robin Dunn
+#
+# RCS-ID:      $Id: img2xpm.py,v 1.2 2003/10/23 19:06:17 pbear Exp $
+# Copyright:   (c) 2002 by Total Control Software
+# Licence:     wxWindows license
+#----------------------------------------------------------------------
+
 """
 img2xpm.py  -- convert several image formats to XPM
 
@@ -22,80 +32,19 @@
 """
 
 
-import sys, os, glob, getopt, string
-from wxPython.wx import *
-
-wxInitAllImageHandlers()
-
-
-def convert(file, maskClr, outputDir, outputName):
-    if string.lower(os.path.splitext(file)[1]) == ".ico":
-        icon = wxIcon(file, wxBITMAP_TYPE_ICO)
-        img = wxBitmapFromIcon(icon)
-    else:
-        img = wxBitmap(file, wxBITMAP_TYPE_ANY)
-
-    if not img.Ok():
-        return 0, file + " failed to load!"
-    else:
-        if maskClr:
-            om = img.GetMask()
-            mask = wxMaskColour(img, maskClr)
-            img.SetMask(mask)
-            if om is not None:
-                om.Destroy()
-        if outputName:
-            newname = outputName
-        else:
-            newname = os.path.join(outputDir, os.path.basename(os.path.splitext(file)[0]) + ".xpm")
-        if img.SaveFile(newname, wxBITMAP_TYPE_XPM):
-            return 1, file + " converted to " + newname
-        else:
-            img = wxImageFromBitmap(img)
-            if img.SaveFile(newname, wxBITMAP_TYPE_XPM):
-                return 1, "ok"
-            else:
-                return 0, file + " failed to save!"
-
-
-
-def main(args):
-    if not args or ("-h" in args):
-        print __doc__
-        return
-
-    outputDir = ""
-    maskClr = None
-    outputName = None
-
-    try:
-        opts, fileArgs = getopt.getopt(args, "m:n:o:")
-    except getopt.GetoptError:
-        print __doc__
-        return
-
-    for opt, val in opts:
-        if opt == "-m":
-            maskClr = val
-        elif opt == "-n":
-            outputName = val
-        elif opt == "-o":
-            outputDir = val
-
-    if not fileArgs:
-        print __doc__
-        return
-
-    for arg in fileArgs:
-        for file in glob.glob(arg):
-            if not os.path.isfile(file):
-                continue
-            ok, msg = convert(file, maskClr, outputDir, outputName)
-            print msg
+import sys
+import img2img
+from wxPython import wx
+
+def main():
+    # some bitmap related things need to have a wxApp initialized...
+    if wx.wxGetApp() is None:
+        app = wx.wxPySimpleApp()
+    img2img.main(sys.argv[1:], wx.wxBITMAP_TYPE_XPM, ".xpm", __doc__)
 
 
+if __name__ == '__main__':
+    main()
 
-if __name__ == "__main__":
-    main(sys.argv[1:])
 
 

Index: PanGalactic/pangalactic/client/modules/psm/doctreeframe.py
diff -u PanGalactic/pangalactic/client/modules/psm/doctreeframe.py:1.14 PanGalactic/pangalactic/client/modules/psm/doctreeframe.py:1.15
--- PanGalactic/pangalactic/client/modules/psm/doctreeframe.py:1.14	Fri Sep 26 15:47:11 2003
+++ PanGalactic/pangalactic/client/modules/psm/doctreeframe.py	Thu Oct 23 15:06:18 2003
@@ -1,5 +1,8 @@
 # $Source: /repo/step_testbed/PanGalactic/pangalactic/client/modules/psm/doctreeframe.py,v $
 
+import types
+import copy
+
 from wxPython.wx import *
 from wxPython.grid import *
 
@@ -7,17 +10,14 @@
 import pangalactic.enterprise.partslist as partslist
 import pangalactic.enterprise.productmodelversion as productmodelversion
 
-import types
-import pgefdoctree 
-import pangalactic.utils.basegrid as basegrid
-#import pgefgrid
-import treeframe 
-import copy
-
 from pangalactic.utils.pgefexceptions import RequiredDataError
+import pangalactic.utils.basegrid as basegrid
 import pangalactic.utils.ToolkitImages as ToolkitImages
 
-__version__ = "$Revision: 1.14 $"[11:-2]
+import pangalactic.client.modules.psm.pgefdoctree as pgefdoctree
+import pangalactic.client.modules.psm.treeframe as treeframe 
+
+__version__ = "$Revision: 1.15 $"[11:-2]
 
 
 NEW_MODE = 1

Index: PanGalactic/pangalactic/enterprise/document.py
diff -u PanGalactic/pangalactic/enterprise/document.py:1.14 PanGalactic/pangalactic/enterprise/document.py:1.15
--- PanGalactic/pangalactic/enterprise/document.py:1.14	Wed Oct 22 14:06:25 2003
+++ PanGalactic/pangalactic/enterprise/document.py	Thu Oct 23 15:06:19 2003
@@ -1,10 +1,10 @@
-# $Id: document.py,v 1.14 2003/10/22 18:06:25 waterbug Exp $
+# $Id: document.py,v 1.15 2003/10/23 19:06:19 pbear Exp $
 
 """
 The Mother of all document types in PGEF.
 """
 
-__version__ = "$Revision: 1.14 $"[11:-2]
+__version__ = "$Revision: 1.15 $"[11:-2]
 
 import string
 
@@ -80,18 +80,22 @@
         self._current_version = v
         self._reps = {}
         self._drfiles = {}
+        self._dumdumbells = {}  #hahahaha  vwk.  
+        
 
     def deleteAttr(self):
         raise TypeError, 'Cannot delete attribute'
 
-    def addRep(self, files=None,
-               rev=self._current_version.revision, **kw):
+    def addRep(self, files=None, rev=None, **kw):
         """
         Add a new document representation.  (This will create a
         DocRep object and add it to the representations of the
         current version (or of another version, if a "rev" is
         specified.
         """
+        if not rev:
+            rev = self._current_version.revision
+            
         try:
             assert rev in self._revisions
         except:

Index: PanGalactic/pangalactic/client/images/maketoolkitimages.py
diff -u PanGalactic/pangalactic/client/images/maketoolkitimages.py:1.3 PanGalactic/pangalactic/client/images/maketoolkitimages.py:1.4
--- PanGalactic/pangalactic/client/images/maketoolkitimages.py:1.3	Thu Nov  7 11:55:11 2002
+++ PanGalactic/pangalactic/client/images/maketoolkitimages.py	Thu Oct 23 15:06:17 2003
@@ -42,12 +42,20 @@
     "-a -n GreenDot greendot.gif ToolkitImages.py",
     "-a -n meatball meatball_new.gif ToolkitImages.py",
     "-a -n fulltwisted twistedlogofull.png ToolkitImages.py",
-    "-a -n twisted twistedlogo.png ToolkitImages.py"
-                 
+    "-a -n twisted twistedlogo.png ToolkitImages.py",
+
+    "-a -n LeftArrow left_arrow.png ToolkitImages.py",
+    "-a -n RightArrow right_arrow.png ToolkitImages.py",
+    "-a -n UpArrow up_arrow.png ToolkitImages.py",
+    "-a -n DownArrow down_arrow.png ToolkitImages.py",
+    "-a -n DblLeftArrow dbl_left_arrow.png ToolkitImages.py",
+    "-a -n DblRightArrow dbl_right_arrow.png ToolkitImages.py"
     ]
 
 
 for line in command_lines:
+    print "line", line
     args = string.split(line)
+    print "args", args
     img2py.main(args)
 

Index: PanGalactic/pangalactic/client/modules/psm/itemeditframe.py
diff -u PanGalactic/pangalactic/client/modules/psm/itemeditframe.py:1.107 PanGalactic/pangalactic/client/modules/psm/itemeditframe.py:1.108
--- PanGalactic/pangalactic/client/modules/psm/itemeditframe.py:1.107	Tue Oct 21 17:25:18 2003
+++ PanGalactic/pangalactic/client/modules/psm/itemeditframe.py	Thu Oct 23 15:06:18 2003
@@ -1,6 +1,6 @@
 # $Source: /repo/step_testbed/PanGalactic/pangalactic/client/modules/psm/itemeditframe.py,v $
 
-__version__ = "$Revision: 1.107 $"[11:-2]
+__version__ = "$Revision: 1.108 $"[11:-2]
 
 # Python imports
 import copy
@@ -192,7 +192,7 @@
                     self.currentproduct = ProductModelMaster(id_context = self.DataManager.currentProject)
                     self.tempproduct = ProductModelMaster(id_context = self.DataManager.currentProject)
         except:
-            print "  exception.currentproject", self.DataManager.currentProject
+            print "itemeditframe.setup.exception: building default productmaster instances"
             self.currentproduct = ProductMaster(id_context = self.DataManager.currentProject)
             self.tempproduct = ProductMaster(id_context = self.DataManager.currentProject)
             
@@ -237,7 +237,7 @@
         self.SetupPane(which_pane, nodedata)
 
     def setCurrentProduct(self, nodedata):
-        print "itemeditframe.setcurrentproduct"
+        #print "itemeditframe.setcurrentproduct"
         #print "nodedata: " + str(nodedata)
         #print 'tempproduct type:', self.tempproduct.__class__.__name__
         self.rootitemid = nodedata[1]
@@ -258,27 +258,26 @@
                     self.tempproduct.build(self.currentproduct.__dict__)
             except IndexError:
                 pass
-
-        print "end setcurrentproduct"
+        #print "end setcurrentproduct"
         
 
     def SetupPane(self, which_pane, nodedata):
-        print "itemeditframe.SetupPane"
+        #print "itemeditframe.SetupPane"
         #print "  pane: " + str(which_pane)
         #print "  nodedata: " + str(nodedata)
         #print "  rootitemid: " + str(self.rootitemid)
         #print "  rootnauoid: " + str(self.rootnauoid)
 
         self.setCurrentProduct(nodedata)
-        print "set pane selection"
+        #print "set pane selection"
         self.editnb.SetSelection(which_pane)
-        print "pane selected"
+        #print "pane selected"
 
         if which_pane == self.PMM_PMVPage or which_pane == self.PM_PVPage or which_pane == self.PropertiesPage:
-            print "  setting up for item"
+            #print "  setting up for item"
             #print '  rootitemid, rootnauoid are [%s, %s]' % (self.rootitemid, self.rootnauoid)
             self.BuildItemTree(self.rootitemid, self.rootnauoid) # done in pagechanged
-            print "  built tree"
+            #print "  built tree"
             root = self.itemtree.GetRootItem()
 #            print "  have root item", root
             
@@ -286,19 +285,19 @@
             rootdata = self.itemtree.GetPyData(root)
             #print "  rootdata:" + str(rootdata)
             nodeid = rootdata[1]
-            print "  about to call getitem"
+            #print "  about to call getitem"
             treedata = self.DataManager.localDB.GetItem(nodeid)
             #print "  treedata", treedata
             if treedata:
-                print "  have treedata", treedata.id
+                #print "  have treedata", treedata.id
                 self.currentproduct.build(treedata.__dict__)
                 self.tempproduct.build(self.currentproduct.__dict__)
                 classname = self.tempproduct.__class__.__name__
-                print "  classname", classname
-                print "  tempproduct", self.tempproduct.name
+                #print "  classname", classname
+                #print "  tempproduct", self.tempproduct.name
                 
                 if classname == 'ProductModelVersion':
-                    print "  master", self.tempproduct.of_pm_id
+                    #print "  master", self.tempproduct.of_pm_id
                     self.pm_pv_form.FillFormWithPMData(self.tempproduct._of_master)
                     self.pm_pv_form.FillFormWithPVData(self.tempproduct._of_version)
                     self.pmm_pmv_form.FillFormWithPMMData(self.tempproduct._of_model_master)
@@ -308,7 +307,7 @@
                     self.pmm_pmv_form.GetTogglePmv().SetValue(1)
 
                 elif classname == 'ProductModelMaster':
-                    print "  model", self.tempproduct.of_pm_id
+                    #print "  model", self.tempproduct.of_pm_id
                     self.pm_pv_form.FillFormWithPMData(self.tempproduct._of_master)
                     self.pm_pv_form.FillFormWithPVData(self.tempproduct._of_version)
                     self.pmm_pmv_form.FillFormWithPMMData(self.tempproduct)
@@ -318,7 +317,7 @@
                     self.pmm_pmv_form.GetTogglePmm().SetValue(1)
 
                 elif classname == 'ProductVersion':
-                    print "  version", self.tempproduct.of_pm_id
+                    #print "  version", self.tempproduct.of_pm_id
                     self.pmm_pmv_form.clearPMM()
                     self.pmm_pmv_form.clearPMV()
                     self.pm_pv_form.FillFormWithPMData(self.tempproduct._of_master)
@@ -328,8 +327,7 @@
                     self.pm_pv_form.GetTogglePv().SetValue(1)
 
                 elif classname == 'ProductMaster':
-                    print "  tempproduct master", self.tempproduct.id
-                    #print "setup for productmaster"
+                    #print "  master", self.tempproduct.id
                     self.pmm_pmv_form.clearPMM()
                     self.pmm_pmv_form.clearPMV()
                     self.pm_pv_form.FillFormWithPMData(self.tempproduct)
@@ -519,7 +517,7 @@
 
    
     def PageChanged(self, event = None):
-        print "itemeditframe.pagechanged"
+        #print "itemeditframe.pagechanged"
         self.currentpage = self.editnb.GetSelection()
         #print 'page changed.currentpage:', self.currentpage
         
@@ -614,7 +612,7 @@
             self.otherdocform.FillObjectWithFormData(self.currentdocument)
             
         else:
-            print "wtf"
+            print "itemeditframe.pagechanged: invalid page"
 
     def BrowseMode(self, gotroot):
         #print "itemeditframe.browsemode"
@@ -1165,10 +1163,10 @@
             
         elif self.pmm_pmv_form.CreatingProductModelMaster:
             temp_version = self.pm_pv_form.temp_pv
-            print temp_version
+            #print "tempversion", temp_version
             save_object = ProductModelMaster(_of_version = temp_version, project_id = self.DataManager.currentProject,
                                              id_context = self.DataManager.currentProject)
-            print save_object
+            #print "saveobject", save_object
             self.pmm_pmv_form.FillPMMWithFormData(save_object)
             save_object.state = pangalactic.utils.objectstatus.ADD
             self.pmm_pmv_form.temp_pmm = save_object
@@ -1625,7 +1623,7 @@
 
     
     def BuildItemTree(self, itemid, nauoid, currentdata = None, product_type = None):
-        print "itemeditframe.builditemtree"
+        #print "itemeditframe.builditemtree"
 
         #print  "itemid: " + str(itemid)
         if itemid == None and nauoid == None:
@@ -1678,7 +1676,7 @@
             self.rootobject = self.DataManager.localDB.GetItem(treeitemdata[1])
             #print "root", self.rootobject.pgef_oid, self.rootobject.id, self.rootobject.name
             treedlg.Destroy()
-        print "end builditemtree"
+        #print "end builditemtree"
 
 
     def BuildDocTree(self, itemid, pdrid = None, currentdata = None):

Index: PanGalactic/pangalactic/client/images/img2py.py
diff -u PanGalactic/pangalactic/client/images/img2py.py:1.1.1.1 PanGalactic/pangalactic/client/images/img2py.py:1.2
--- PanGalactic/pangalactic/client/images/img2py.py:1.1.1.1	Mon Nov  4 14:47:22 2002
+++ PanGalactic/pangalactic/client/images/img2py.py	Thu Oct 23 15:06:17 2003
@@ -1,6 +1,17 @@
-#!/usr/bin/env python
+#----------------------------------------------------------------------
+# Name:        wxPython.tools.img2py
+# Purpose:     Convert an image to Python code.
+#
+# Author:      Robin Dunn
+#
+# RCS-ID:      $Id: img2py.py,v 1.2 2003/10/23 19:06:17 pbear Exp $
+# Copyright:   (c) 2002 by Total Control Software
+# Licence:     wxWindows license
+#----------------------------------------------------------------------
+
+
 """
-img2py.py  --  Convert an image to XPM format and embed it in a Python
+img2py.py  --  Convert an image to PNG format and embed it in a Python
                module with appropriate code so it can be loaded into
                a program at runtime.  The benefit is that since it is
                Python source code it can be delivered as a .pyc or
@@ -22,45 +33,42 @@
                    specify a name that should be used to customize the access
                    fucntions, (getNameBitmap, etc.)
 
+    -c             Maintain a catalog of names that can be used to reference
+                   images.  Catalog can be accessed via catalog and index attributes
+                   of the module.  If the -n <name> option is specified then <name>
+                   is used for the catalog key and index value, otherwise
+                   the filename without any path or extension is used as the key.
+
     -a             This flag specifies that the python_file should be appended
                    to instead of overwritten.  This in combination with -n will
                    allow you to put multiple images in one Python source file.
 
     -u             Don't use compression.  Leaves the data uncompressed.
 
+    -i             Also output a function to return the image as a wxIcon.
+
 """
 
+#
+# Changes:
+#    - Cliff Wells <LogiplexSoftware@earthlink.net>
+#      20021206: Added catalog (-c) option.
+#
 
 
-import sys, os, glob, getopt, tempfile, string
+import sys, os, glob, getopt, tempfile
 import cPickle, cStringIO, zlib
-import img2xpm
+import img2img
+from wxPython import wx
 
 
 def crunch_data(data, compressed):
-    # convert the lines to a Python list, pickle it and compress the result.
-    lines = []
-    for line in data:
-        if line[0] == "\"":
-            # the line is typically (but not always):
-            #      [quote] <data> [quote][comma][newline]
-
-            # chop one char from the front
-            line = line[1:]
-
-            # now find the final quote and truncate there
-            quote = string.rfind(line, "\"")
-
-            # and append the remaining data to our list
-            lines.append(line[:quote])
-
-
-    # pickle, crunch and convert it to a form suitable for embedding in code
-    data = cPickle.dumps(lines)
+    # compress it?
     if compressed:
         data = zlib.compress(data, 9)
-    data = repr(data)
 
+    # convert to a printable format, so it can be in a Python source file
+    data = repr(data)
 
     # This next bit is borrowed from PIL.  It is used to wrap the text intelligently.
     fp = cStringIO.StringIO()
@@ -107,13 +115,19 @@
         print __doc__
         return
 
+    # some bitmap related things need to have a wxApp initialized...
+    if wx.wxGetApp() is None:
+        app = wx.wxPySimpleApp()
+
     append = 0
     compressed = 1
     maskClr = None
     imgName = ""
+    icon = 0
+    catalog = 0
 
     try:
-        opts, fileArgs = getopt.getopt(args, "aun:m:")
+        opts, fileArgs = getopt.getopt(args, "auicn:m:")
     except getopt.GetoptError:
         print __doc__
         return
@@ -127,6 +141,10 @@
             imgName = val
         elif opt == "-m":
             maskClr = val
+        elif opt == "-i":
+            icon = 1
+        elif opt == "-c":
+            catalog = 1
 
     if len(fileArgs) != 2:
         print __doc__
@@ -136,12 +154,12 @@
 
     # convert the image file to a temporary file
     tfname = tempfile.mktemp()
-    ok, msg = img2xpm.convert(image_file, maskClr, None, tfname)
+    ok, msg = img2img.convert(image_file, maskClr, None, tfname, wx.wxBITMAP_TYPE_PNG, ".png")
     if not ok:
         print msg
         return
 
-    data = open(tfname, "r").readlines()
+    data = open(tfname, "rb").read()
     data = crunch_data(data, compressed)
     os.unlink(tfname)
 
@@ -150,30 +168,85 @@
     else:
         out = open(python_file, "w")
 
+    if catalog:
+        pyPath, pyFile = os.path.split(python_file)
+        imgPath, imgFile = os.path.split(image_file)
+
+        if not imgName:
+            imgName = os.path.splitext(imgFile)[0]
+            print "\nWarning: -n not specified. Using filename (%s) for catalog entry." % imgName
+
+        old_index = []
+        if append:
+            # check to see if catalog exists already (file may have been created
+            # with an earlier version of img2py or without -c option)
+            oldSysPath = sys.path[:]
+            sys.path = [pyPath] # make sure we don't import something else by accident
+            mod = __import__(os.path.splitext(pyFile)[0])
+            if 'index' not in dir(mod):
+                print "\nWarning: %s was originally created without catalog." % python_file
+                print "         Any images already in file will not be cataloged.\n"
+                out.write("\n# ***************** Catalog starts here *******************")
+                out.write("\n\ncatalog = {}\n")
+                out.write("index = []\n\n")
+                out.write("class ImageClass: pass\n\n")
+            else: # save a copy of the old index so we can warn about duplicate names
+                old_index[:] = mod.index[:]
+            del mod
+            sys.path = oldSysPath[:]
+
     out.write("#" + "-" * 70 + "\n")
     if not append:
         out.write("# This file was generated by %s\n#\n" % sys.argv[0])
-        out.write("from wxPython.wx import wxBitmapFromXPMData, wxImageFromBitmap\n")
+        out.write("from wxPython.wx import wxImageFromStream, wxBitmapFromImage\n")
+        if icon:
+            out.write("from wxPython.wx import wxEmptyIcon\n")
         if compressed:
-            out.write("import cPickle, zlib\n\n\n")
+            out.write("import cStringIO, zlib\n\n\n")
         else:
-            out.write("import cPickle\n\n\n")
+            out.write("import cStringIO\n\n\n")
+
+        if catalog:
+            out.write("catalog = {}\n")
+            out.write("index = []\n\n")
+            out.write("class ImageClass: pass\n\n")
 
     if compressed:
         out.write("def get%sData():\n"
-                  "    return cPickle.loads(zlib.decompress(\n%s))\n\n"
+                  "    return zlib.decompress(\n%s)\n\n"
                   % (imgName, data))
     else:
         out.write("def get%sData():\n"
-                  "    return cPickle.loads(\n%s)\n\n"
+                  "    return \\\n%s\n\n"
                   % (imgName, data))
 
 
     out.write("def get%sBitmap():\n"
-              "    return wxBitmapFromXPMData(get%sData())\n\n"
+              "    return wxBitmapFromImage(get%sImage())\n\n"
               "def get%sImage():\n"
-              "    return wxImageFromBitmap(get%sBitmap())\n\n"
+              "    stream = cStringIO.StringIO(get%sData())\n"
+              "    return wxImageFromStream(stream)\n\n"
               % tuple([imgName] * 4))
+    if icon:
+        out.write("def get%sIcon():\n"
+                  "    icon = wxEmptyIcon()\n"
+                  "    icon.CopyFromBitmap(get%sBitmap())\n"
+                  "    return icon\n\n"
+                  % tuple([imgName] * 2))
+
+    if catalog:
+        if imgName in old_index:
+            print "Warning: %s already in catalog." % imgName
+            print "         Only the last entry will be accessible.\n"
+        old_index.append(imgName)
+        out.write("index.append('%s')\n" % imgName)
+        out.write("catalog['%s'] = ImageClass()\n" % imgName)
+        out.write("catalog['%s'].getData = get%sData\n" % tuple([imgName] * 2))
+        out.write("catalog['%s'].getImage = get%sImage\n" % tuple([imgName] * 2))
+        out.write("catalog['%s'].getBitmap = get%sBitmap\n" % tuple([imgName] * 2))
+        if icon:
+            out.write("catalog['%s'].getIcon = get%sIcon\n" % tuple([imgName] * 2))
+        out.write("\n\n")
 
     if imgName:
         n_msg = ' using "%s"' % imgName
@@ -188,8 +261,4 @@
 
 if __name__ == "__main__":
     main(sys.argv[1:])
-
-
-
-
 

Index: PanGalactic/pangalactic/client/fnord.py
diff -u PanGalactic/pangalactic/client/fnord.py:1.64 PanGalactic/pangalactic/client/fnord.py:1.65
--- PanGalactic/pangalactic/client/fnord.py:1.64	Wed Oct  1 16:45:41 2003
+++ PanGalactic/pangalactic/client/fnord.py	Thu Oct 23 15:06:16 2003
@@ -19,6 +19,7 @@
 from pangalactic.utils.loginclass import *
 from pangalactic.utils.proxyclass import *
 from pangalactic.utils.serverclass import *
+from pangalactic.utils.aboutbox import AboutBox
 
 from pangalactic.utils import oid
 from pangalactic.utils import dbbrowser
@@ -28,32 +29,12 @@
 from pangalactic.utils import toolstate
 from pangalactic.utils import toolframe
 from pangalactic.utils import ToolkitImages
-#import modules
+
 from pangalactic.client.modules.psm import searchframe
 from pangalactic.client.modules.psm import psmtool
 
-try:
-    from pangalactic.client.modules.plm import plmtool
-except:
-    print "fnord.plmimport.failed"
-    
-## Imports of the following two modules are handled in the event handler
-##         that actually starts the respective tool
-##
-## import modules.psm.psmtool imported in OnActivateTool
-## import modules.plm.plmtool imported in OnActivateTool
-##
-##
-## Imports of these two modules are handled in the MainFrame constructor
-##
-## if sys.platform == 'win32':
-##    import modules.plm.plmtool
-##
-## import modules.psm.psmtool
-
 workingdir = os.getcwd()
 
-# constants
 VERSION = "1.0 rc9.0"
 BUILD_DATE = "02/05/2003"
 
@@ -62,10 +43,8 @@
 ID_FILE_NEWPMM = wxNewId()
 ID_FILE_NEWPM = wxNewId()
 ID_FILE_NEWPRODUCT = wxNewId()
-#ID_FILE_NEWCOMPONENT = wxNewId()
 ID_FILE_NEWDOCUMENT = wxNewId()
 ID_FILE_NEWPARTSLIST = wxNewId()
-#ID_TOOL_NARS = wxNewId()
 
 ID_TOOL_DOC_NEW = wxNewId()
 ID_TOOL_DOC_EDIT = wxNewId()
@@ -125,12 +104,7 @@
 ID_PREF_TOOLTIPS = wxNewId()
 ID_PREF_OUTPUTDIR = wxNewId()
 ID_PREF_SHOWLOGINCONFIRMED = wxNewId()
-
-
-ID_HORIZONTAL_SASH = wxNewId() #5901
-
-PSM = 0
-PLM = 1
+ID_HORIZONTAL_SASH = wxNewId()
 
 PGEF_TITLE = "Pan-Galactic PGEF (PGEF)"
 
@@ -140,12 +114,6 @@
                  ID_FILE_NEWPMV : "ProductModelVersion"}
 
 
-#sys.path.append (os.path.join (os.getcwd(), "pangalactic", "client", 'modules', 'psm'))
-#sys.path.append (os.path.join (os.getcwd(), "pangalactic", "client", 'modules', 'plm'))
-
-#ToolImports = [(ID_TOOL_PSM, 'psmtool'), (ID_TOOL_PLM, 'plmtool')]
-
-
 class PgefState(toolstate.ToolState):
     def __init__(self):
         toolstate.ToolState.__init__(self)
@@ -267,8 +235,6 @@
             EVT_MENU(self, ID_TOOL_CHECKOUT, self.OnCheckout)
             EVT_MENU(self, ID_TOOL_VIEW_CHECKEDOUT, self.OnViewCheckedOut)
             
-#            EVT_MENU(self, ID_TOOL_NARS, self.OnNars)
-
             EVT_MENU(self, ID_TOOL_DOC_NEW, self.OnNewDocument)
             EVT_MENU(self, ID_TOOL_PL_NEW, self.OnNewPartsList)
             EVT_TOOL(self, ID_TOOL_GRIDTOPDF, self.OnGridToPdf)
@@ -410,8 +376,6 @@
         self.menuBar.Append(menu, "&File")
 
         menu = wxMenu()
-#        menu.Append(ID_TOOL_NARS, 'NAR&S...', "Access the NARS application")
-
         docmenu = wxMenu()
         docmenu.Append(ID_TOOL_DOC_NEW, "&New...", "New Document")
         docmenu.Append(ID_TOOL_DOC_EDIT, "&Edit...", "Edit Document")
@@ -430,7 +394,6 @@
         menu.Append(ID_TOOL_DBBROWSER, "Local Database &Browser...", "Browse the local database dictionaries")
         self.menuBar.Append(menu, "&Tools")
 
-        # Repository menu
         menu = wxMenu()
         menu.Append(ID_FILE_COMMIT, "&Commit Changes", "Commit changes to database")
         menu.Enable(ID_FILE_COMMIT, false)
@@ -478,36 +441,18 @@
     def GetPSMTool(self):
         return self.psmtool
     
-#        if self.IsToolLoaded(ID_TOOL_PSM):
-#            return self.Tools[self.ToolPtr][1]
     
     def CheckAndLoadTool(self, toolid):
         #print "checkandloadtool"  #, self.Tools
         self.InitializeTool(-1)
-#        for id, module, toolname in self.Tools:
-#            print id, module, toolname
-#            if id == toolid and module == None:
-#                self.InitializeTool(id)
-                
-#    def IsToolLoaded(self, toolid):
-#        for id, module, toolname in self.Tools:
-#            if id == toolid:
-#                if module == None:
-#                    return None
-#                else:
-#                    return true
                 
     def OnExportProperties(self, event):
         self.psmtool.ExportProperties()
-#        self.Tools[self.ToolPtr][1].ExportProperties()
         
     def OnServerCombo(self, event = None):
         #print "onservercombo"
         if self.DataManager.inLocalMode:
             #print "localmode"
-#            if not self.IsToolLoaded(ID_TOOL_PSM):
-#                self.CheckAndLoadTool(ID_TOOL_PSM)
-#            self.Tools[self.ToolPtr][1].SetupForLocalMode()
             self.psmtool.SetupForLocalMode()
             self.sb.ShowImage(false)
 
@@ -515,52 +460,29 @@
             #print "loginmode"
             self.menuBar.Enable(ID_FILE_LOGIN, true)
             self.psmtool.SetupForLogin()
-#            self.Tools[self.ToolPtr][1].SetupForLogin()
             self.sb.ShowImage(true)
                     
     def OnCheckout(self, event):
         """Wrapper method that calls the tools Checkout method"""
         self.psmtool.Checkout()
 
-#        if self.IsToolLoaded(ID_TOOL_PSM):
-#            self.Tools[self.ToolPtr][1].Checkout()
-            
     def OnViewCheckedOut(self, event):
         self.psmtool.ShowCheckedOutGrid()
-#        if self.IsToolLoaded(ID_TOOL_PSM):
-#            self.Tools[self.ToolPtr][1].ShowCheckedOutGrid()
                 
     def OnSearch(self, event):
-#        self.CheckAndLoadTool(ID_TOOL_PSM)
         self.psmtool.OnSearchItems()
-#        self.Tools[self.ToolPtr][1].OnSearchItems()
         
     def OnNewComponent(self, event):
         print "fnord.onnewcomponent"
-#        self.CheckAndLoadTool(ID_TOOL_PSM)
         product_id = event.GetId()
         product_type = PRODUCT_TYPES[product_id]
         self.psmtool.OnNewItem(product_type)
-#        self.Tools[self.ToolPtr][1].OnNewItem()
         
     def OnNewPartsList(self, event):
         self.psmtool.OnNewParts()
-#        self.Tools[self.ToolPtr][1].OnNewParts()
         
     def OnNewDocument(self, event):
         self.psmtool.OnNewDoc()
-#        self.Tools[self.ToolPtr][1].OnNewDoc()
-        
-#    def OnNars(self, event):
-#        print "fnord.onnars"
-#        from nars import NarsFrame
-#        already_loaded = true        
-#        narsframe = NarsFrame(self, -1, wxDefaultPosition, wxSize(800, 600))
-#        narsframe.setDataManager(self.DataManager)
-#        narsframe.CentreOnParent()                              
-#        narsframe.Show(true)
-#        narsframe.ConfigureStatusBar(narsframe.sb.GetSizeTuple()[0])
-
         
     def OnClearLocalDB(self, event):
         if self.DataManager.uncommittedData():
@@ -574,7 +496,6 @@
             self.DataManager.clearLocalDB()
             self.DataManager.packLocalDB()
             self.psmtool.ClearTreeAndGrid()
-#            self.Tools[self.ToolPtr][1].ClearTreeAndGrid()
 
     def onSelectMode(self, event):
         id = event.GetId()
@@ -719,9 +640,7 @@
 
     def OnSize(self, event):
         self.psmtool.OnSize(event)
-#        for id, tool, dontcare in self.Tools: 
-#            if tool:
-#                tool.OnSize(event)
+
 
     def OnDBBrowser(self, event):
         tmpsize = wxSize(750, 500)
@@ -747,7 +666,6 @@
     
     def OnGridToPdf(self, event = None):
         self.psmtool.OnGridToPdf()
-#        self.Tools[self.ToolPtr][1].OnGridToPdf()
         
     def OnGetMyStuff(self, event=None):
         if self.DataManager.user._loggedin:
@@ -767,59 +685,23 @@
             self.SearchFrame.Show(false)
             self.SearchFrame = None
         
-#    def SaveActiveTool(self, event):
-#        if self.ToolPtr > -1:
-#            self.Tools[self.ToolPtr][1].LocalCommit()
                 
     def CommitTool(self, event):
         self.psmtool.Commit()
-#        self.Tools[self.ToolPtr][1].Commit()
 
     def CloseActiveTool (self, event):
         self.psmtool.CloseTool(event)
         self.psmtool = None
         self.SetTitle(PGEF_TITLE)
-
-#        if self.ToolPtr > -1:
-#            self.Tools[self.ToolPtr][1].CloseTool(event)
-#            self.Tools[self.ToolPtr][1] = None
-#            self.SetTitle (PGEF_TITLE)
-
-        # look through the list of tools and
-        # activate the first one found
-#        self.ToolPtr = -1
-#        ndx = 0
-
-#        for id, tool, dontcare in self.Tools:
-#            if tool:
-#                tool.Show(true)
-##                tool.UpdateMenuBar()
-#                self.SetTitle (PGEF_TITLE)# + " - " + tool.GetTitle())
-#                self.ToolPtr = ndx
-#                break
-#            ndx += 1
-
         self.psmtool.Show(true)
         self.psmtool.UpdateMenuBar()
 
 
     def CloseTools(self, event):
         self.psmtool.CloseTool(event)
-
-#        for ndx in range (len (self.Tools)):
-#            if self.Tools[ndx][1]:
-#                self.Tools[ndx][1].CloseTool(event)
-#                self.Tools[ndx][1] = None
-
-#        if self.PLMtool:
-#            self.PLMtool.CloseDown()
-            
-#        self.ToolPtr = -1
-        self.SetTitle (PGEF_TITLE)
+        self.SetTitle(PGEF_TITLE)
         
     def OnAbout(self, event):
-        from modules.psm.aboutbox import AboutBox
-
         dlg = AboutBox(self, -1, "About PGEF", wxDefaultPosition, wxSize(300, 200))
         dlg.GetVersion().SetLabel(str(VERSION))
         dlg.GetBuildDate().SetLabel(str(BUILD_DATE))

Index: PanGalactic/pangalactic/client/modules/psm/psmtool.py
diff -u PanGalactic/pangalactic/client/modules/psm/psmtool.py:1.118 PanGalactic/pangalactic/client/modules/psm/psmtool.py:1.119
--- PanGalactic/pangalactic/client/modules/psm/psmtool.py:1.118	Tue Oct 21 17:25:18 2003
+++ PanGalactic/pangalactic/client/modules/psm/psmtool.py	Thu Oct 23 15:06:18 2003
@@ -9,7 +9,7 @@
 This module is the main application code for the pgef client interface
 """
 
-__version__ = "$Revision: 1.118 $"[11:-2]
+__version__ = "$Revision: 1.119 $"[11:-2]
 
 import os
 import sys
@@ -17,7 +17,6 @@
 import time
 import types
 
-#wxPython Constants
 from wxPython.wx import *
 from wxPython.grid import *
 try:
@@ -33,9 +32,6 @@
 from pangalactic.enterprise.role                import Role
 from pangalactic.enterprise.pgefobject          import PgefObject
 
-from pangalactic.client.support import psmstate
-from pangalactic.client.support import httpdownload
-
 from pangalactic.utils import datamanager
 from pangalactic.utils import dbbrowser
 from pangalactic.utils import objectstatus
@@ -45,9 +41,10 @@
 from pangalactic.utils import ToolkitImages
 from pangalactic.utils.mixin_security import Security_Mixin
 from pangalactic.utils.securitymanager import actions 
-
 import pangalactic.utils.basegrid as basegrid
 
+from pangalactic.client.support     import psmstate
+from pangalactic.client.support     import httpdownload
 from pangalactic.client.modules.psm import toolbarpanel
 from pangalactic.client.modules.psm import searchframe
 from pangalactic.client.modules.psm import pgefmaintree
@@ -97,7 +94,6 @@
 def CreateTool(parent, datamgr, ID, pos, size, debug = 0):
     return PSMTool(parent, datamgr, ID, pos, wxSize(1,1))
 
-
         
 class PSMTool(wxPanel, Security_Mixin):
     '''This class encapsulates the main client window'''
@@ -290,7 +286,7 @@
         
     # WDR: methods for MyFrame
     def SelectView(self, event):
-        print 'selected'
+        print 'psmtool.selectview'
         
         
     def pageChanged(self, event):
@@ -632,7 +628,7 @@
             tmplist = self.DataManager.getItem(itemid)
             tmpobj = None
             if isinstance(tmplist, types.ListType):
-                print "a list, what is going on?"
+                print "checking out a list, what is going on?"
                 #for tmpobj in tmplist:
                 #    print "list item tmpobj", tmpobj.id, tmpobj.name
             elif isinstance(tmplist, PgefObject):
@@ -686,6 +682,7 @@
         """Save any changes made; retrieve the data from the local storage device
            and send it to the server."""
 
+        print "psmtool.commit"
         import pprint
         #print "datamanager.commit.projectobjects"
         pprint.pprint(self.DataManager.localDB.GetProjectObjects())
@@ -738,11 +735,15 @@
                 dlg.ShowModal()
                 dlg.Destroy()
             else:
-                print "local mode; do nothing???"
+                print "psmtool.commit: local mode; do nothing???"
 #                self.DataManager.localDB.SaveUnsavedNauoIds(self.DataManager.UnsavedNauoIDs)
 
             if not closing:
-                self.OnProjectClick()
+                wgt = self.topWindow.toppanel.GetProjectWidget()
+                ndx = wgt.GetSelection()
+                project = wgt.GetStringSelection()
+                print "psmtool.commit", project, ndx
+                self.changeProject(ndx, project)
             
         else:
             #dlg = wxDialog(self, -1, "A Message from PGPDM", wxDefaultPosition, defsize, wxTHICK_FRAME)
@@ -757,6 +758,7 @@
         pass
         
     def UpdateForLogin(self):
+        print "\npsmtool.updateforlogin"
         if self.DataManager.user._loggedin:
             self.topWindow.toppanel.FillProjectWidget(self.DataManager.projects, "Select a Project")
             wgt = self.topWindow.toppanel.GetItemWidget()
@@ -766,8 +768,13 @@
             self.model_master_grid.ClearGrid()
             self.product_version_grid.ClearGrid()
             self.product_master_grid.ClearGrid()
-#            self.topWindow.toppanel.GetButtonTopLevel().Enable(true)
             self.State.currentuser = self.DataManager.user.id
+
+#            wgt = self.topWindow.toppanel.GetProjectWidget()
+#            ndx = wgt.GetSelection()
+#            project = wgt.GetStringSelection()
+#            print "psmtool.updateforlogin", project, ndx
+#            self.changeProject(ndx, project)
             self.OnProjectClick()
 
 
@@ -995,24 +1002,25 @@
 
 
     def OnProjectClick(self, event = None):
-        #print "psmtool.onprojectclick"
+        print "\npsmtool.onprojectclick"
         wgt = self.topWindow.toppanel.GetProjectWidget()
+        project = wgt.GetStringSelection()
         ndx = wgt.GetSelection()
-
-        #print 'currentproject: %s' % self.State.currentproject
-        #print "project ndx", ndx
+        print "project, ndx", project, ndx
         if ndx == 0:
             if self.State.currentproject:
                 wgt.SetStringSelection(self.State.currentproject)
                 wgt.SetSelection(wgt.FindString(self.State.currentproject))
                 self.DataManager.setCurrentProject(self.State.currentproject)
-                #print "have project"
-                #print self.State.currentproject
-            else:
-                #print "abort"
-                return
+                project = wgt.GetStringSelection()
+                ndx = wgt.GetSelection()
+
+        self.changeProject(ndx, project)
+
+    def changeProject(self, ndx, project):
+        print "\npsmtool.changeProject"
+        print "project ndx", project, ndx
 
-        project = wgt.GetStringSelection()
         self.DataManager.setCurrentProject(project)
             
         if self.itemeditform:
@@ -1025,6 +1033,7 @@
         dlg = None
 
         if self.DataManager.user._loggedin:
+            print "psmtool.changeproject.logged in"
             wxBeginBusyCursor()
             try:
                 self.topWindow.toppanel.GetItemWidget().SetFocus()
@@ -1035,17 +1044,14 @@
                 dlg.CentreOnParent()
                 dlg.Show(true)
 
-#                self.remainingSpace.SetPageText(self.remainingSpace.GetSelection(), "Product Models")
                 self.tree.DeleteAllItems()
                 self.State.currentproject = project
                 self.DataManager.localDB.SaveState("PSMState", self.State)
                 self.DataManager.getItemsByProject([project])
 
-                #print "onprojectclick->showtoplevelitems"
                 self.ShowTopLevelItems()
 
                 numitems = self.FillGridFromProject(project)
-                #print "numitems", numitems
                 self.FillItemWidgetFromProject(project)
 
                 if numitems > 0:
@@ -1064,7 +1070,7 @@
             wxEndBusyCursor()
 
         else:
-            #print "psmtool.onprojectclick.notloggedin"
+            print "psmtool.changeProject.notloggedin"
             wxSafeYield()
             wxBeginBusyCursor()
             wxSafeYield()
@@ -1096,7 +1102,7 @@
                 self.UpdateWindows()
             self.SecureMenu()
             wxEndBusyCursor()
-        #print "end psmtool.onprojectclick"
+        print "end psmtool.changeProject"
 
     def UpdateWindows(self):
         if self.projectframe:
@@ -1305,10 +1311,14 @@
             wgt.SetSelection(wgt.FindString(self.State.currentproject))
             wgt.SetStringSelection(self.State.currentproject)
         self.State.currentuser = self.DataManager.user.id
-        self.OnProjectClick()
+
+        wgt = self.topWindow.toppanel.GetProjectWidget()
+        ndx = wgt.GetSelection()
+        project = wgt.GetStringSelection()
+        print "psmtool.setupforlocalmode", project, ndx
+        self.changeProject(ndx, project)
         
     def SetupForLogin(self):
-#        self.topWindow.toppanel.GetButtonTopLevel().Enable(true)
         wgt = self.Parent.menuBar.FindMenuItem('Repository','Get Marked Items')
         self.Parent.menuBar.Enable(wgt, true)
         
@@ -1456,7 +1466,7 @@
 
         product_id = grid.GetObjectOid(row)
         product = grid.getObject(row)
-        print "call editgridobject", product.name
+        #print "call editgridobject", product.name
         self.editGridObject(product_id, classname)
         
             

Index: PanGalactic/pangalactic/utils/configuredisplay.py
diff -u PanGalactic/pangalactic/utils/configuredisplay.py:1.2 PanGalactic/pangalactic/utils/configuredisplay.py:1.3
--- PanGalactic/pangalactic/utils/configuredisplay.py:1.2	Wed Oct  1 13:43:46 2003
+++ PanGalactic/pangalactic/utils/configuredisplay.py	Thu Oct 23 15:06:20 2003
@@ -8,7 +8,7 @@
 
 from wxPython.wx import *
 from wxPython.lib.mixins.listctrl import wxColumnSorterMixin
-from pangalactic.utils.customizegrid_wdr import *
+from pangalactic.utils.customizegrid_gui import *
 
 class ConfigureDisplay(wxPanel, wxColumnSorterMixin):
     def __init__(self, parent, id,

Index: PanGalactic/pangalactic/utils/localdb.py
diff -u PanGalactic/pangalactic/utils/localdb.py:1.42 PanGalactic/pangalactic/utils/localdb.py:1.43
--- PanGalactic/pangalactic/utils/localdb.py:1.42	Tue Oct 21 17:25:19 2003
+++ PanGalactic/pangalactic/utils/localdb.py	Thu Oct 23 15:06:20 2003
@@ -887,6 +887,7 @@
     def GetDFRByDocument(self, pgef_oid):
         print "localdb.getdfrbydocument"
         print "attempting to get a dfr.  What is a dfr?  It used to be a DocumentFileRelationship."
+        print "it is now [err... will be] a dumdumbell."
         return {}
         localdfrs = self.GetDFRDict()
 #        print "localdfrs", localdfrs

Index: PanGalactic/pangalactic/utils/securitymanager.py
diff -u PanGalactic/pangalactic/utils/securitymanager.py:1.3 PanGalactic/pangalactic/utils/securitymanager.py:1.4
--- PanGalactic/pangalactic/utils/securitymanager.py:1.3	Fri Sep 26 15:47:12 2003
+++ PanGalactic/pangalactic/utils/securitymanager.py	Thu Oct 23 15:06:20 2003
@@ -1,4 +1,3 @@
-import pangalactic.enterprise.pgefobject
 import pangalactic.enterprise.person
 import pangalactic.enterprise.role
 
@@ -21,38 +20,38 @@
 class Action:
     def __init__(self):
         
-        self.ADDALL = 20
-        self.ADDITEM = 21
-        self.ADDPDR = 22
-        self.ADDDOCUMENT = 23
-        self.ADDNAUO = 24
+        self.ADDALL       = 20
+        self.ADDITEM      = 21
+        self.ADDPDR       = 22
+        self.ADDDOCUMENT  = 23
+        self.ADDNAUO      = 24
         self.ADDPARTSLIST = 25
         
 
-        self.MODIFYALL = 10
-        self.MODIFYITEM = 11
-        self.MODIFYPDR = 12
-        self.MODIFYDOCUMENT = 13
-        self.MODIFYNAUO = 14
+        self.MODIFYALL       = 10
+        self.MODIFYITEM      = 11
+        self.MODIFYPDR       = 12
+        self.MODIFYDOCUMENT  = 13
+        self.MODIFYNAUO      = 14
         self.MODIFYPARTSLIST = 15
         
-        self.DELETEALL = 30
-        self.DELETEITEM = 31
-        self.DELETEPDR = 32
-        self.DELETEDOCUMENT = 33
-        self.DELETENAUO = 34
+        self.DELETEALL       = 30
+        self.DELETEITEM      = 31
+        self.DELETEPDR       = 32
+        self.DELETEDOCUMENT  = 33
+        self.DELETENAUO      = 34
         self.DELETEPARTSLIST = 35
         
-        self.LINKALL = 40
-        self.LINKITEM = 41
-        self.LINKDOCUMENT = 42
+        self.LINKALL       = 40
+        self.LINKITEM      = 41
+        self.LINKDOCUMENT  = 42
         self.LINKPARTSLIST = 44
         
-        self.VIEWALL = 50
-        self.VIEWITEM = 51
-        self.VIEWPDR = 52
-        self.VIEWDOCUMENT = 53
-        self.VIEWNAUO = 54
+        self.VIEWALL       = 50
+        self.VIEWITEM      = 51
+        self.VIEWPDR       = 52
+        self.VIEWDOCUMENT  = 53
+        self.VIEWNAUO      = 54
         self.VIEWPARTSLIST = 55
         
         self.ACCESSALERTS = 60
@@ -106,8 +105,6 @@
         self._User = user
         
     def MakeUser(self, userdict):
-        #print "makeuser"
-        #print userdict
         self._User.build(userdict)
         
     def GetUser(self):
@@ -134,17 +131,14 @@
             temp[role.RoleCode] = templist
         self._User.comp_role_bit_mask = temp
         self._Roles = temp
-        #print temp.items()
 
         
     def GetRoles(self, project):
         currentrole = []
-        #print 'in getroles _roles is <%s>' % repr(self._Roles.items())
         if self._Roles:
             for role, projects in self._Roles.items():
                 if project in projects:
                     currentrole.append(role)
-            #print 'leaving getroles - currentrole is <%s>' % repr(currentrole)
             return currentrole
         else:
             if self._DataManager.inLocalMode:
@@ -153,7 +147,6 @@
     def GetActions(self, project):
         actions = []
         myroles = self.GetRoles(project)
-        #print 'in GetActions roles for project %s <%s>' % (project, myroles)
         
         if roles.P in myroles:
             actions = action_role_xref[roles.P][:]            
@@ -190,8 +183,7 @@
         if object:
             if 'P' in role:
                 if action == objectstatus.DELETE or action == objectstatus.MODIFY:
-                    #if object.owner == _DataManager.user.UserID:
-                    if object.owner == _DataManager.user.id:
+                    if object.owner == self._DataManager.user.id:
                         return true
                     elif action == objectstatus.ADD:
                         return true
@@ -200,20 +192,20 @@
                     
             if object.type == 'Alert':
                 if ('ADA' in role or 'GC' in role):
-                        return true
+                    return true
                 if ('CS' in role and action == objectstatus.MODIFY):
-                        return true
+                    return true
                 else:
                     return false
                 if 'A' in role:
                     return false
                     
             if ('FAM' in role and len(role) == 1):
-                    return false
+                return false
     
     def CanRetrieveAlerts(self):
         if ('ADA' in role or 'GC' in role or 'A' in role or 'CS' in role):
-               return true
+            return true
         else:
             return false
         

Index: PanGalactic/pangalactic/utils/datamanager.py
diff -u PanGalactic/pangalactic/utils/datamanager.py:1.49 PanGalactic/pangalactic/utils/datamanager.py:1.50
--- PanGalactic/pangalactic/utils/datamanager.py:1.49	Tue Oct 21 17:25:19 2003
+++ PanGalactic/pangalactic/utils/datamanager.py	Thu Oct 23 15:06:20 2003
@@ -1,6 +1,6 @@
 # $Source: /repo/step_testbed/PanGalactic/pangalactic/utils/datamanager.py,v $
 
-__version__ = "$Revision: 1.49 $"[11:-2]
+__version__ = "$Revision: 1.50 $"[11:-2]
 
 import time
 import mx.DateTime
@@ -17,7 +17,8 @@
 from pangalactic.utils.data_utils import *
 from pangalactic.utils import preferences
 import pangalactic.utils.objectstatus as objectstatus
-import pangalactic.utils.httpupload
+import pangalactic.utils.httpupload as httpupload
+import pangalactic.enterprise.role as role
 
 from pangalactic.enterprise.person                      import Person
 from pangalactic.enterprise.document                    import Document
@@ -208,19 +209,19 @@
                 ##print 'roles in datamanager are <%s>' % repr(roles)
                 
                 tmp_roles = []
-                tmp_role = pangalactic.enterprise.role.Role()
+                tmp_role = role.Role()
                 tmp_role.RoleCode = 'GDA'
                 tmp_role.Userid = username
                 tmp_role.project_id = 'H2G2'
                 tmp_roles.append(tmp_role)
         
-                tmp_role = pangalactic.enterprise.role.Role()
+                tmp_role = role.Role()
                 tmp_role.RoleCode = 'GDA'
                 tmp_role.Userid = username
                 tmp_role.project_id = 'foo'
                 tmp_roles.append(tmp_role)
                 
-                tmp_role = pangalactic.enterprise.role.Role()
+                tmp_role = role.Role()
                 tmp_role.RoleCode = 'GDA'
                 tmp_role.Userid = username
                 tmp_role.project_id = 'bar'
@@ -291,12 +292,12 @@
                 tempobjlist.append(item)
                 classname = item.__class__.__name__
                 tempids[item.pgef_oid] = {"type" : classname}
-                if classname == "ProductModelVersion":
-                    print "retrieving a", classname
-                    print " ~", item.name
-                    print " ~ master", item._of_master.id
-                    print " ~ version", item._of_version.id
-                    print " ~ model", item._of_model_master.id
+                #if classname == "ProductModelVersion":
+                    #print "retrieving a", classname
+                    #print " ~", item.name
+                    #print " ~ master", item._of_master.id
+                    #print " ~ version", item._of_version.id
+                    #print " ~ model", item._of_model_master.id
 
 ##        if pms:
 ###            print "pms", len(pms)
@@ -330,7 +331,7 @@
             projectobjects[currproject] = tempids
             self.localDB.SetProjectObjects(projectobjects)
         else:
-            print "no data"
+            print "datamanager.getitemsbyproject: no data found."
         return len(tempobjlist)
 
     def save(self, savelist):
@@ -380,7 +381,7 @@
     
     def getNAUOByAssemblyID(self, AssemblyIDList, NauoID = 'ROOT'):
         """Retrieves all of the NAUOs associated with an AssemblyID"""
-        print "datamanager.getnauobyassemblyid"
+        #print "datamanager.getnauobyassemblyid"
 
         retlist = []
         objlist = []
@@ -409,13 +410,13 @@
                     itemobjs.append(obj)
                     #print "appending", obj.__class__.__name__
                     #print obj
-                else:
-                    print "ignoring", obj.__class__.__name__
+                #else:
+                #    print "ignoring", obj.__class__.__name__
 
             if len(nauoobjs) > 0:
                 updatedacuobjs = []
                 nauoids = []
-                print "saving nauoobjs", len(nauoobjs)
+                #print "saving nauoobjs", len(nauoobjs)
                 updatedacuobjs = self.localDB.Save(nauoobjs)
 
                 #add the nauos to the projectobject dictionary in localdb
@@ -436,7 +437,7 @@
                     self.nauoIDs[id] = {NauoID:nauoids}
 
             if len(itemobjs) > 0:
-                print "saving items", len(itemobjs)
+                #print "saving items", len(itemobjs)
                 self.localDB.Save(itemobjs)
        
             break # only do the first one for now
@@ -449,11 +450,11 @@
             elif obj.__class__.__name__ == "ProductModelVersion":
                 item = self.localDB.GetItem(obj.pgef_oid)
                 retlist.append(item)
-            else:
-                print "not returning", obj.__class__.__name__
+            #else:
+            #    print "not returning", obj.__class__.__name__
 
         #print "len retlist", len(retlist)
-        print "end datamanager.getnauobyassemblyid"
+        #print "end datamanager.getnauobyassemblyid"
         return retlist
 
 
@@ -572,8 +573,7 @@
                     documentobjs.append(obj)
 
                 else:
-                    print "found what?"
-                    print repr(obj)
+                    print "found what?  a", obj.__class__.__name__
 
             if len(partslistobjs) > 0:
                 self.localDB.Save(partslistobjs)
@@ -593,7 +593,7 @@
                     if pdr.name in ["document", "parts_list"]:
                         newpdrs.append(pdr)
                     else:
-                        print "retrieved an unknown pdr"
+                        print "retrieved a pdr that is neither a document nor a parts_list"
 
                 self.localDB.Save(newpdrs)
 
@@ -852,12 +852,12 @@
 #                            if isinstance(obj, PartsList):
                                 if upload:
                                     if os.path.exists(obj._UploadFileName):
-                                        retval = support.httpupload.UploadFile(self.State.workingdir,
-                                                                               obj._UploadFileName, "parts_list",
-                                                                               obj.PartsListID,
-                                                                               self.user,
-                                                                               self.serverName,
-                                                                               self.serverPort)
+                                        retval = httpupload.UploadFile(self.State.workingdir,
+                                                                       obj._UploadFileName, "parts_list",
+                                                                       obj.PartsListID,
+                                                                       self.user,
+                                                                       self.serverName,
+                                                                       self.serverPort)
                                     if retval == "Upload Failed":
                                         print retval
                                     #else:
@@ -868,13 +868,13 @@
                             elif isinstance(obj, Document):
                                 if upload:
                                     if os.path.exists(obj._UploadFileName):
-                                        retval = support.httpupload.UploadFile(self.State.workingdir,
-                                                                               obj._UploadFileName,
-                                                                               "document",
-                                                                               obj.pgef_oid,
-                                                                               self.user,
-                                                                               self.serverName,
-                                                                               self.serverPort)
+                                        retval = httpupload.UploadFile(self.State.workingdir,
+                                                                       obj._UploadFileName,
+                                                                       "document",
+                                                                       obj.pgef_oid,
+                                                                       self.user,
+                                                                       self.serverName,
+                                                                       self.serverPort)
                                         testdir = "/home/pbear/PanGalactic/pangalactic/client/support/"
                                         testfilename = "twistedupload.py"
                                         upval = os.popen3(testdir + testfilename + " " +

Index: PanGalactic/pangalactic/utils/ToolkitImages.py
diff -u PanGalactic/pangalactic/utils/ToolkitImages.py:1.1 PanGalactic/pangalactic/utils/ToolkitImages.py:1.2
--- PanGalactic/pangalactic/utils/ToolkitImages.py:1.1	Wed Jun 25 01:25:03 2003
+++ PanGalactic/pangalactic/utils/ToolkitImages.py	Thu Oct 23 15:06:20 2003
@@ -1,1776 +1,1740 @@
 #----------------------------------------------------------------------
-# This file was Generated by maketoolkitimages.py
+# This file was generated by maketoolkitimages.py
 #
-from wxPython.wx import wxBitmapFromXPMData, wxImageFromBitmap
-import cPickle, zlib
+from wxPython.wx import wxImageFromStream, wxBitmapFromImage
+import cStringIO, zlib
 
 
 def getBlueDocIcon_16Data():
-    return cPickle.loads(zlib.decompress(
-'x\xda\xd3\xc8)0\xe4\nV74S\x00"c\x05Cu\xae\xc4`\xf5\x08\x85d\x05e70\x00\xf3\
-\xf5@|\x03 \x80\xf2\x15\x80|\xbf\xfc\xbcT\x08G\x0f\x0e\x14@\x00*\x18\x01\x01\
-z\x11z\xd8\x04\xc1\xa2\x18\x82 Q4A\x88\xb1\xa8\x82\x11\xd8T\x0evA\xa4`B\xf8\
-\x08\r\x00\x05\xf5\x00\xf2\xec__' ))
+    return zlib.decompress(
+'x\xda\xeb\x0c\xf0s\xe7\xe5\x92\xe2b``\xe0\xf5\xf4p\t\x02\xd2\x02 \xcc\xc1\
+\x06$\xe5?\xffO\x04R,\xc5N\x9e!\x1c@P\xc3\x91\xd2\x01\xe4\xa7x\xba8\x86T\xcc\
+INIIJ\xfb\xf1\xff\xfd\xebz6%\x06eas\xe5]\x12\xdc=\x1f\x1f\xf3\xe7\xf5\xca\
+\xe8\x08T\xf2M[\xff\xff"o\xa2\xd2\xb1\xb4\x14\xef\x0b\xb1\xde\x93\x18o\xf0$\
+\x1e\\.!Y\xf0 \xc0s\n\xe3\x8b\x87\xcd9\x12\'\xe3\x1c\xd8\x17\xb3\xf1p3KH\xce\
+\x9c!)!ap\xd9\xc2\xb1\xf7\x82\x0f\xabyC\x0c\x03\x83\xc8\x16\x19~\x81]_\xdf\
+\x02\xedc\xf0t\xf5sY\xe7\x94\xd0\x04\x00J\x185\x80' )
 
 def getBlueDocIcon_16Bitmap():
-    return wxBitmapFromXPMData(getBlueDocIcon_16Data())
+    return wxBitmapFromImage(getBlueDocIcon_16Image())
 
 def getBlueDocIcon_16Image():
-    return wxImageFromBitmap(getBlueDocIcon_16Bitmap())
+    stream = cStringIO.StringIO(getBlueDocIcon_16Data())
+    return wxImageFromStream(stream)
 
 #----------------------------------------------------------------------
 def getBlueDocpIcon_16Data():
-    return cPickle.loads(zlib.decompress(
-'x\xda\xd3\xc8)0\xe4\nV74S\x00"\x13\x05Cu\xae\xc4`\xf5|\x85d\x05\xa7\x9c\xc4\
-\xe4l0/\x02\xc8Sv\x03\x030_\x0f\xc47\x00\x02(_\x01\xc8\xf7\xcb\xcfK\x85p\xf4\
-\xe0@\x01\x04\xa0\x82\x11\x10\xa0\x17\xa1\x87M\x10,\x8a!\x08\x12E\x13\x84\
-\x18\x0b\x17\xcc\x07\x02\x88\x04\xb2 H\x1c\x8b`D>q*q\x98\x19A\x81`\x04\x86 R\
-0!|\x84\x06\x80\x82z\x00ZLe\x10' ))
+    return zlib.decompress(
+'x\xda\xeb\x0c\xf0s\xe7\xe5\x92\xe2b``\xe0\xf5\xf4p\t\x02\xd2\x02 \xcc\xc1\
+\x06$\xe5?\xffO\x04R,\xc5N\x9e!\x1c@P\xc3\x91\xd2\x01\xe4\xb7x\xba8\x86T\xcc\
+\xd9:\xd9\x9b\xef\x80\x02\x87\x0b{\xaa\xe3\xa5\xdf\xf2W\x8f\xb8\x06\xef\xce\
+\xc8\xe5\xf8\xe7k\xa5\xdd\xfc\x81\x8dS\xc8\xb2\xbf\xa4\xb5\x85s\xa2\xf5\x89c\
+\x16\xf2\x8fn\xea\x89\xd4\xbdku\xde$`\xfex\x8do\xcev\xef\x06\xa9\x96\xea\x93\
+Q\x97N\xe8\x1c:\x94$\x93l(\xcf\xbb\xda\xee\xa1fW\xe8\x82\xd0r6\xc9M\xbc\x12;\
+\x99{\x15_\x1d\n\x14\x0f=\xe0\xf3:\xf2t\xf5\x07\xfb\x84\xa5\xb5\x0c\nEr\x0e;\
+\x1f\x1f>\xf4=\xb8\xb6!\xf6\xaeE\x9d\xc1\xf5\x05\xa5\tI@\xf70x\xba\xfa\xb9\
+\xacsJh\x02\x00\x87\x8dI\xae' )
 
 def getBlueDocpIcon_16Bitmap():
-    return wxBitmapFromXPMData(getBlueDocpIcon_16Data())
+    return wxBitmapFromImage(getBlueDocpIcon_16Image())
 
 def getBlueDocpIcon_16Image():
-    return wxImageFromBitmap(getBlueDocpIcon_16Bitmap())
+    stream = cStringIO.StringIO(getBlueDocpIcon_16Data())
+    return wxImageFromStream(stream)
 
 #----------------------------------------------------------------------
 def getBlueDocdIcon_16Data():
-    return cPickle.loads(zlib.decompress(
-'x\xda\xd3\xc8)0\xe4\nV74S\x00"\x13\x05Cu\xae\xc4`\xf5|\x85d\x05\xa7\x9c\xc4\
-\xe4l0/\x02\xc8Sv\x03\x030_\x0f\xc47\x00\x02(_\x01\xc8\xf7\xcb\xcfK\x85p\xf4\
-\xe0@\x01\x04\xa0\x82\x11\x10\xa0\x17\xa1\x87M\x10,\x8a!\x08\x12E\x13\x84\
-\x18\x0b\x17\xcc\x07\x02\x88\x04\xb2 H\x1c\x8b`\x04\r\x04\xb1X\x84\xcdIp\x00\
-\x17D\n&\x84\x8f\xd0\x00PP\x0f\x00c1eU' ))
+    return zlib.decompress(
+'x\xda\xeb\x0c\xf0s\xe7\xe5\x92\xe2b``\xe0\xf5\xf4p\t\x02\xd2\x02 \xcc\xc1\
+\x06$\xe5?\xffO\x04R,\xc5N\x9e!\x1c@P\xc3\x91\xd2\x01\xe47x\xba8\x86T\xcc9;y\
+/\xdf\x01\x05\x8e\x16GI\x8f_\xff\xfa\xb3\x1e]\xb8\xc2w\xad\xad\xc1\xfe\xcaJs\
+\xc9\xa7v_\x9a:\x14\x9dv\x061\xb6\x1b\xc8\xac\xf8\xbeB\xf7\x93\xa5\x99\xd1\
+\xd5\xe2e!&*\x15V\xa7\xd5~m\x9b\xcf`\xcbq\xb6kiE@\xe6\xb6\x99\x11\xa5g\xd4\
+\xe49_\xdb-\x9cU$\xbe\xc2\xf4\xec\x02\xc7m\x8cr\x7fe6p\t$\x18\xb0_\xda\xc1u\
+\x89\xc1\xe6\xa4\xb7b\x1b\x07C\xd9\xb1\xe9\xc7\x9e\x07\xefm\x88\xbd\xbb\xb2W\
+\xf7\xf5$\xc3\xc7b@\xb70x\xba\xfa\xb9\xacsJh\x02\x00\xac\xf9I\xd0' )
 
 def getBlueDocdIcon_16Bitmap():
-    return wxBitmapFromXPMData(getBlueDocdIcon_16Data())
+    return wxBitmapFromImage(getBlueDocdIcon_16Image())
 
 def getBlueDocdIcon_16Image():
-    return wxImageFromBitmap(getBlueDocdIcon_16Bitmap())
+    stream = cStringIO.StringIO(getBlueDocdIcon_16Data())
+    return wxImageFromStream(stream)
 
 #----------------------------------------------------------------------
 def getRedDocaIcon_16Data():
-    return cPickle.loads(zlib.decompress(
-'x\xda\xd3\xc8)0\xe4\nV74S\x00"c\x05Cu\xae\xc4`\xf5\x08\x85d\x05e70\x00\xf3\
-\xf5 |\x03 \x00\xf3\x15\x80|\xbf\xfc\xbcT\x08G\x0f\x0e\x14@\x00*\x18\x01\x01\
-z\x11z\xd8\x04\xc1\xa2\x18\x82 Q\x84 \xd0\xc0\x08\xa8\xb1H\x82\x11\x10\xf5\
-\xc8\x82`u\x18\x82P#\xd1T\xea\x11\xab\x92hA8\xc0/\x88\x14L\x08\x1f\xa1\x01\
-\xa0\xa0\x1e\x00wB[\xc3' ))
+    return zlib.decompress(
+'x\xda\xeb\x0c\xf0s\xe7\xe5\x92\xe2b``\xe0\xf5\xf4p\t\x02\xd2\x02 \xcc\xc1\
+\x06$\xe5?\xffO\x04R,\xc5N\x9e!\x1c@P\xc3\x91\xd2\x01\xe47z\xba8\x86T\xcc\
+\xd9:\xd9\x9b\xef\x80\x02\x87\x0b{j\xe2\xfb\xfa\x88\xd8\x1b\xe7\xbd\x9c?\xe6\
+_\x8e\x94d\xcag`\x9e\xb8\xf1\xc3\xf5\xcad\xa7\xf6\x8dK\x92\xe7\xc4\x1bn\xd1\
+\xbe\xc9hx`\xf3n\xd3#g,\xbc\x85\xef\xbe\x95Z\xc0\xf40Khw\xb8\xa3\xe0\xe4\x95\
+\xb6\xcbc\x96|WNx\xcaqk\xe5\xc3;l\x1e\xc7\xef\x9dW\xa9\xb3\xbdU.\xcb\xbc\xe4\
+\xf35\x0e\xee_\x8c\x0b\xc4\xcd#\x9e<\xe7\xeb\xe8amx\xd9\xed\xe3\xe5>\x95qw\
+\x15\x83d\xae\x16g\x82B\xbb<\xd01\x0c\x9e\xae~.\xeb\x9c\x12\x9a\x00\x8aNHj' )
 
 def getRedDocaIcon_16Bitmap():
-    return wxBitmapFromXPMData(getRedDocaIcon_16Data())
+    return wxBitmapFromImage(getRedDocaIcon_16Image())
 
 def getRedDocaIcon_16Image():
-    return wxImageFromBitmap(getRedDocaIcon_16Bitmap())
+    stream = cStringIO.StringIO(getRedDocaIcon_16Data())
+    return wxImageFromStream(stream)
 
 #----------------------------------------------------------------------
 def getRedBlackDoc_16Data():
-    return cPickle.loads(zlib.decompress(
-'x\xda\xd3\xc8)0\xe4\nV74S\x00"c\x05Cu\xae\xc4`u=\x85d\x05\xa7\x9c\xc4\xe4l0\
-/\x02\xc8Svs3\x00\x020_\x01\xc8\xf7\xcb\xcfK\x85p\xf4\xe0@\x01\x04\xa0\x82\
-\x11\x10\xa0\x17\xa1\x87M\x10,\x8a!\x08\x12E\x13\x84\x18\x8b*\x18\x81M\xe5`\
-\x17D\n&\x84\x8f\xd0\x00PP\x0f\x00\x05\n_u' ))
+    return zlib.decompress(
+"x\xda\xeb\x0c\xf0s\xe7\xe5\x92\xe2b``\xe0\xf5\xf4p\t\x02\xd2\x02 \xcc\xc1\
+\x06$\xe5?\xffO\x04R,\xc5N\x9e!\x1c@P\xc3\x91\xd2\x01\xe4'z\xba8\x86T\xccy;\
+\xf9\xb4P\x83\x02\x87\xeb\xce\x07M\xff\xff\xdf2\xf3\x92\xce\xee\xb9\xb2!\xf5\
+r\xac\xa1\r\xdf\x0b\x86\x03Na\x9b\x02\x1d\x12\x1a\xbf/=|C\xad5\xeaq\xd4\xa6J\
+\x0ew\xab\xed\xbe\x7f\xb6x7\xc8\xa9\xf8\x16\xe9_j\xb4g\xf9\xf0\xff\xf2\xa1i\
+\xf3\x1f|e\xb6cd\x88\xe8x\xb1\xefq\x7f\xeb\xd7\x15~\x07\xa2\xdffZK(v\xb8\xb6\
+\x85\x01-c\xf0t\xf5sY\xe7\x94\xd0\x04\x00\xdc\xf0>\xec" )
 
 def getRedBlackDoc_16Bitmap():
-    return wxBitmapFromXPMData(getRedBlackDoc_16Data())
+    return wxBitmapFromImage(getRedBlackDoc_16Image())
 
 def getRedBlackDoc_16Image():
-    return wxImageFromBitmap(getRedBlackDoc_16Bitmap())
+    stream = cStringIO.StringIO(getRedBlackDoc_16Data())
+    return wxImageFromStream(stream)
 
 #----------------------------------------------------------------------
 def getItemIcon_16Data():
-    return cPickle.loads(zlib.decompress(
-'x\xda}\x8f\xb1\x0e\xc20\x0cD\xf7~E$\x860\x9d\x94\x01$V\x90\x18\xf1\xd0\xc5k\
-U1Qa\xfe\x7f\xc2\xe76\xa4T\x88S\x94\xe4^.\xb1\xb3\x9f^\xa5\xebs9&\x1f\x87Tr7\
-\xf4\x19iL\xe7i\x18\x1f\xe1\xcc\xdd\xee\x1a\n/\xf4\xa7P\xf8\xe4\xfef\xcf{\
-\x18\xe5\xe1%\xb4\x1cRp\xcd\xbb\x06\xa1f\x8aoHV\xe9\xff\xe4\xaf7I<8\xf3\x05B\
-\x15\x8e\x94k\x85\x10UcRU\x05\x15\xd2\x99\xcf\xe6IHM"\x88s\xdfJ\xbb\x1eU\xe2\
-\xfa\n\x1a\xfb\xb4\r\x9c\x7f\xb4\x86h\xc9O\xa1h\x9eI\x16\x12\xd9|\x93(\x9a\
-\xc7\x1b\x0e\xccc\xa4' ))
+    return zlib.decompress(
+'x\xda\x014\x01\xcb\xfe\x89PNG\r\n\x1a\n\x00\x00\x00\rIHDR\x00\x00\x00\x10\
+\x00\x00\x00\x10\x08\x06\x00\x00\x00\x1f\xf3\xffa\x00\x00\x00\x04sBIT\x08\
+\x08\x08\x08|\x08d\x88\x00\x00\x00\xebIDATx\x9c\xadS;\xb2\xc3 \x0c\\\xe1\x14\
+9\x0e\x85\x0b\x8e\xe4\xbcw!\x1d\x89\x82\x82\xe3\xa8 \xe15\x91F\xd8r\xf7\x98\
+\xd1`\x90vY}L\x946Dk~\xde\xd3\x9f)m\x14\xc5\xa5;pm\x152\x042\x04\xb5\xd5\x0b\
+\xa1g^\x0c\xc0\xac\xadN\x19\xb2Xmu\x02\x98\x97\xf8\xf3EDr\x07\xa6\xb4\x81\
+\xfe\xb5\x06\xf3\xf3\x9ej\x00,\xff\xc8w\xa9\x81\xcaV\xb9\xba\xfbo\xefW\\Rvf6\
+R\x19\x82\xb2\x17SP\xf6bJ\x00\x80\x99-E\xa2\xb4\xd9\xc1\x07\xe5\x9c\xf1|<\
+\xa1\xf79g\xf4\xde\x01\x00e/Fd\xf2\x99\xd9$\xfb.\xe8\xee}\x1a\xcb\xcc\xf3\
+\xe1\xeb\xe1\x15\xe8+\x91\xaf\xb7\x1ew\xc1\xcb?Ob\xce9\n\x8d\tz\xef\x0b\xc0\
+\xe7\x7fKp\x1c\xc7-\xe0L\xe8c\x97I\xf4C"C\x96\x97\xb4#\xc0\xb7\xfa\x11\x81_\
+\xd1\xdf\xe7\x81\xaf\x9f_\x02\x80?\xe4`\xf2\x01BX7\xb0\x00\x00\x00\x00IEND\
+\xaeB`\x82\xc9J\x83k' )
 
 def getItemIcon_16Bitmap():
-    return wxBitmapFromXPMData(getItemIcon_16Data())
+    return wxBitmapFromImage(getItemIcon_16Image())
 
 def getItemIcon_16Image():
-    return wxImageFromBitmap(getItemIcon_16Bitmap())
+    stream = cStringIO.StringIO(getItemIcon_16Data())
+    return wxImageFromStream(stream)
 
 #----------------------------------------------------------------------
 def getCopyData():
-    return cPickle.loads(zlib.decompress(
-'x\xdau\x901\n\xc30\x0cE\xf7\x9cB\xd0\xc1\x99\x84\rI\xe8\xdcB/\x90Ek\xc8\x18\
-\x83r\xff\xa9\x92\xdcP[I\x9e\x8d\xe1\x7f?\x84q\x9f\xf7\xd4\xcd!M\x90F\x18 \
-\x85n\x99\x03\xc2\n\xaf\xbc\xac\x9b%\x96\xf4\x88\xc23Z&\xcd\x1f\xc32h~G]\xbf\
-\xdcRJ4|I\xc2\xbf\xadKBW\xa2l6Z\x93\xd8\x0e\xaeM\xc4R\x12;S\x86\xe8\x84\x93\
-\xa9\x97\xdeD\x95\xeb\xc7;\xb3\xe0\xcc\xa3\xbc2\x0f\xee~\t\xbf0\xde[\xaa' ))
+    return zlib.decompress(
+'x\xda\xeb\x0c\xf0s\xe7\xe5\x92\xe2b``\xe0\xf5\xf4p\t\x02\xd2\x02@\xcc\xcf\
+\xc1\x06$\xdf\x16\xfb\xeb\x03)\x96b\'\xcf\x10\x0e \xa8\xe1H\xe9\x00\xf2\xe7x\
+\xba8\x86T\xccY:\xc9\x91\xef\xb0\x02\x0f\xcb\xf6\xa9\xfc6\xa7\xcf\x9f2<n\x93\
+=\xff\xa8bP\xf5\n\x9e2\x03\xc7\xdc\xf0M\x07\x98\xf8\xb3\xbb\xd9O\x8a\xff\x9b\
+\xc0\xd0\xb0jY\xbb\xca\xf4\x86\xe5\xb9\xaf"\x9d\xef4\x06;,\xab\xba\xa6\xeaR\
+\x13\xb4d\xcb!\xff:\x86\x1b\x0bO\x05\xb8\x94e\x14<x\xfb\xbd\x94\x9bQ\x81\x81\
+y\x81\x07\xa7a~n\xf6\x84+\x8d\xe5\x8f\x0e\xda\xda\xcf\x9a\\\xc2\x16[\x9dq<\
+\xee\xfb\x82\xf52)o;\xf7\x9bd\x95\x14Le\xf8,\x9f\xde|\xea\x01\xdb\xd4\x87*\
+\x17/\x1d\x9c\x9b\xf3\xc8\x9e\xf1O\xff\xec\x97\xbc_\x1bS\xce\x06\xef\xde{\
+\x0c\xe8N\x06OW?\x97uN\tM\x00\xd5\xeeY-' )
 
 def getCopyBitmap():
-    return wxBitmapFromXPMData(getCopyData())
+    return wxBitmapFromImage(getCopyImage())
 
 def getCopyImage():
-    return wxImageFromBitmap(getCopyBitmap())
+    stream = cStringIO.StringIO(getCopyData())
+    return wxImageFromStream(stream)
 
 #----------------------------------------------------------------------
 def getFindData():
-    return cPickle.loads(zlib.decompress(
-"x\xda\x8d\x90\xb1\x0e\xc3 \x0cD\xf7|\x85\xa5\x0et:\x99\xaaE\xdd\x91\xba2da\
-\xad\xb2F\xa2\xff?\x15\xdb@a\xeb%\xcb\xbd\x1cG\xec\xeb\xf9\xf1\xdb\xee|\xa0\
-\xfa>\xc8\xbb\xed\xbd\xbbL\x07]^*\xf5E|\xe0\xc0\x91\xd5\x93\xf8\xc8\xb1\xfb$\
-\xfe\xc9\xf2\xa8\x87\xf8;\xdf\xba'\x15\x9a\x88f\x98E\xc8\x98\xa0\x84\x14ft\
-\x08\x14!H\xf2m@\xaa0YE\x87\xb5\xbdXe\xedX!,\xfaW\x12s\xd2.jx\xfd%\x0b\xfe\
-\x8e\xb7\t\xd3\xd4\xa9\x13\xdb\x98#\xa9l,\x04\x1d\xd2\xa2iK\x0b\xc4\x17\x17\
-\xb8\\\x0f" ))
+    return zlib.decompress(
+'x\xda\x016\x01\xc9\xfe\x89PNG\r\n\x1a\n\x00\x00\x00\rIHDR\x00\x00\x00\x10\
+\x00\x00\x00\x10\x08\x06\x00\x00\x00\x1f\xf3\xffa\x00\x00\x00\x04sBIT\x08\
+\x08\x08\x08|\x08d\x88\x00\x00\x00\xedIDATx\x9c\x8d\x93\xbd\x91\xc3 \x10\x85\
+?{T\x88\x02\x8aPp\xc1\x86\x94A\x19\x04\n\x08\x1cP\x82\x03\x07\x94\xa1p\x0bQ\
+\xe0N\xee\x02\x19\t\x06t\xd6\x9bQ\xc0\x8a\xf7\xde\xfeqS\xd5_:\x08N{\xe1\xe3\
+\x7f\x12\x00\x86\xff.-\xabob\xd6D\x96\xd5cM$$\xe9\x0bdwk\xe2\xa9P\x16\x19z\
+\xc4Q\x84\xe7k\xaa\\\x01\xc4\xd5g\x80{\xe3\xfe\xa9-#>\xe2\x1e\xf3\xb3gY\x8f\
+\x0f\x8a\x1e\x04\xa7\r9\x93\xb6\x94\xa7\xca\xb9\x118\x835\x11q "\x151\xe3\
+\xab@M\xd0\xa6\xb1\x973\xd0\xd4\x13,\x9a\x18\x92t\x97gY\xfd\xde\x07q\x9b`\
+\xd9\x8b&\x83\xe0\x94\xf1S/lS\xc8\xee~\xf6\xf8\xb9\xbe_M!\xe3\xad\x8a5\xc79$\
+AU\xcf\xa7P\x92\xf3(\x83\xd3\xaa\xde\xe9gj\xdc\x01n2\x86\xfd1\x95{\xf0\xed15\
+\x02\xbd%\xba$p\xf6\x9c\xaf\xe2\x0f^\xe6o\xf5\xb8\xbd\x88]\x00\x00\x00\x00IE\
+ND\xaeB`\x82\xfb"\x80$' )
 
 def getFindBitmap():
-    return wxBitmapFromXPMData(getFindData())
+    return wxBitmapFromImage(getFindImage())
 
 def getFindImage():
-    return wxImageFromBitmap(getFindBitmap())
+    stream = cStringIO.StringIO(getFindData())
+    return wxImageFromStream(stream)
 
 #----------------------------------------------------------------------
 def getNewData():
-    return cPickle.loads(zlib.decompress(
-'x\xda\xd3\xc8)0\xe4\nV74S04U0V0T\xe7J\x0cV\xd7SHVp\xcaIL\xce\x06\xf3"\x80<e\
-70\x00\xf3\x15@|g\x03\x10\x84\xf2Q\x01LP\x0f\nP\x05#\xc0\x00"\x8a.\x18\xa1\
-\x87M%H-\x9a H|p\x0b"\x00B\x10=\x94\xf4\x00\xd2|R\xfe' ))
+    return zlib.decompress(
+"x\xda\xeb\x0c\xf0s\xe7\xe5\x92\xe2b``\xe0\xf5\xf4p\t\x02\xd2\x02@\xcc\xcf\
+\xc1\x06$\xdf\x16\xfb\xeb\x03)\x96b'\xcf\x10\x0e \xa8\xe1H\xe9\x00\xf2\xc3=]\
+\x1cC*\xe6$\xdb\x14<8P\xcf\xc6\xc5\xc0mt\xfc\xe0A\xc6\xf5\x8f\x98\xd9\xf9\
+\x12:\x0c\x17r\xff\xf9\xf1\x99Y\xfbX*c\x1b\xe3\x8f\x03\xfd\xf6\xf6\x06<\x8a'\
+\x19\xf8\xc4\xf8x\xa6ox\x10\xd0}\xb5\xac\xa4\xd9\xa3\x8c\xd1\xcc \xeb@\x82\
+\x01\x83\xb2\xac\xc2q\xc3\x93l\t\xa7uZ\x18\x18\xb2\xb8\x94\x1ag/\x97V\x03Z\
+\xc1\xe0\xe9\xea\xe7\xb2\xce)\xa1\t\x00\xcd\x8c.1" )
 
 def getNewBitmap():
-    return wxBitmapFromXPMData(getNewData())
+    return wxBitmapFromImage(getNewImage())
 
 def getNewImage():
-    return wxImageFromBitmap(getNewBitmap())
+    stream = cStringIO.StringIO(getNewData())
+    return wxImageFromStream(stream)
 
 #----------------------------------------------------------------------
 def getOpenData():
-    return cPickle.loads(zlib.decompress(
-'x\xdam\x901\n\xc30\x0cE\xf7\x9cB\xd0\xc1\x9d>\xf6\x90\x90\xb9\x85\xae\x19\
-\xb2h\r\x19\x13P\xef?\xb5\x96#\xc5u\xf3\x85\x87\xf7\x90d\xd0}\x7f\xa7n\x0ei\
-\xa0\xd4SO)t\xcb\x1c@+=\xf6e\xdd\x94\xe4K\xb7\x97F\x992?c.\xe5)\xf3\x18\xc7\
-\x18\x0b\xb3\xf5\x1fLM\x1a\t\xe0OB\x1f.\xc6a\xb2\x8c\xd9\x86"\xc1\xc2(9?\x82\
-\xf0Q\xb54\xc7m\'<\xd5\xce\xc9bR\xa4r\xbe\xb3v&\x7f\x9cK\xcf\xc5A\xfcJ\xf8\
-\x00\x8b\x1aU\xa3' ))
+    return zlib.decompress(
+"x\xda\xeb\x0c\xf0s\xe7\xe5\x92\xe2b``\xe0\xf5\xf4p\t\x02\xd2\x02@\xcc\xcf\
+\xc1\x06$\xdf\x16\xfb\xeb\x03)\x96b'\xcf\x10\x0e \xa8\xe1H\xe9\x00\xf2'{\xba\
+8\x86T\xccY:\xc9\x91\xef\xb0\x02\x0f\x8b\xba(\xfb\xbc\xad\xfe\x8f3\xeb\xc4\
+\xda=\xde2\x06\x1a8\x9a,\xd9\x970!\xfd\xe6\xd4\x9a\x197g\xdbk\xdd\x91\x9d\
+\xf2\xe5\xed\xd9\x1c\x7f\x87I\xcd\xafb\x85\x8e_\xe6\xb8\x1a(!\xef\xd6\xad-\
+\xa1\xc1\xa72\xd1\xbf\x81\xc7\xe5\x91\xd2\r\x8d{\xbdb\x12F?{\xde\xc5\x9d\x97\
+x\xe4\xfa\xe1\xea-\xcb'\xe7\xb3}e\xb7H\x88f\x15\xcc\xaf\x17\xf8P\xe0u\x99?v\
+\xe9\x13\xa5'J\x9b\x19g\xcf,\xdf\xc0\xed\xfc\xfc\x01'\xcfa\xad\xfb\x823\xde\
+\x1d\\\x7f6\xfa*{F\xaaS\xfb\x9b\x83jU@\xe71x\xba\xfa\xb9\xacsJh\x02\x00%\xc6\
+Q\xd8" )
 
 def getOpenBitmap():
-    return wxBitmapFromXPMData(getOpenData())
+    return wxBitmapFromImage(getOpenImage())
 
 def getOpenImage():
-    return wxImageFromBitmap(getOpenBitmap())
+    stream = cStringIO.StringIO(getOpenData())
+    return wxImageFromStream(stream)
 
 #----------------------------------------------------------------------
 def getLinkData():
-    return cPickle.loads(zlib.decompress(
-'x\xda\xd3\xc8)0\xe4\nV74S\x00"#\x05Cu\xae\xc4`u=\x85d\x05\xa7\x9c\xc4\xe4l0\
-O\x01\xc8Sv\x03\x03(\x1f\x15@\x04\xf5\x80@\x01B\x82\x08\xa8\xa0\x02\x1c\x81\
-\x08\x84 D1\x9a \xa6Jlf\x82\xe4a@\x0ff\xbb\x82\x1eT\xb1\x02\x98\x80\xb9\x13j\
-\x0b\xd8LTA=\xa89p\x1fA\x05\xd0\x04aV#\x0b* )\'[\x10n\xa6\x1e\x00\x97\xf6@\
-\xc1' ))
+    return zlib.decompress(
+'x\xda\xeb\x0c\xf0s\xe7\xe5\x92\xe2b``\xe0\xf5\xf4p\t\x02\xd2\x02 \xcc\xc1\
+\x06$\xe5?\xffO\x04R,\xc5N\x9e!\x1c@P\xc3\x91\xd2\x01\xe47y\xba8\x86T\xccY\
+\x1ad\xc8w@A \xe8q\xc1\xff\xfa\xb7\xbcje+y\xe7]\xb8\xe5\xf1(`KC\xd1\xcd\xd9\
+\xdfK\x9a\xa2\x13\xa2\xee\xed\xd1\xb6+bm\x99d\x9e\xce\xc6\xdd\x1f\x93\xbar\
+\xcd\xado\xbc\\\xca\xa1Rm\xea\x8dE\xa96E\x95[\x12\xaen\x8b\xfd\xf8\xe6\x13\
+\xdbEA\xd7\xe3rE\xc1\xdc\x15\n\xffV\x08]\x12\x0b\x89Q3\xda\xba\xe0\xd9\x03\
+\xde\xe8\xe2\x86\xfb\x86G\x95\x16\xc8|\x94\xe2\xb0\xf2\xa8/\xd0\xf9p\xf3P\
+\xc3\xac+\xdcL\xca\x19\xb6\xe9\xcf\xb4C\x81\xaea\xf0t\xf5sY\xe7\x94\xd0\x04\
+\x00\x0eJI\xeb' )
 
 def getLinkBitmap():
-    return wxBitmapFromXPMData(getLinkData())
+    return wxBitmapFromImage(getLinkImage())
 
 def getLinkImage():
-    return wxImageFromBitmap(getLinkBitmap())
+    stream = cStringIO.StringIO(getLinkData())
+    return wxImageFromStream(stream)
 
 #----------------------------------------------------------------------
 def getPasteData():
-    return cPickle.loads(zlib.decompress(
-'x\xdam\x8f1\n\xc30\x0cE\xf7\x9c\xc2\xd0\xc1\x05\x83\x90\x87\x14\xcf-t\xd5\
-\x90\xc5k\xc8\x98\x80{\xff\xa9\x92l\xd7(\xcd\x0b1\xf9\xcf_\x10\xdd\x8fO\x9c\
-\x16\x1f\x1f.\xce\x8e\x0f?\xad\x8b\x07\xb7\xb9\xe7\xb1n\xbb&\xe2tC&\xa1\xe6 \
-\xf9\xadhv\x92_(\x8f\xe6"9a\xea\xfd\xdc\xfb\x88\xado\x19\x12\x18#E@\xce\xd0.\
-\xea\xcf\x95R\x80U\xd6\x8f!\xdb$X\xd90r`%UN2\x08DW2\x90\x95<,\xef\x7f3\\4\
-\xe97^\xd7<5\xeb6\xd4\x11\t_\xd3\xcdd+' ))
+    return zlib.decompress(
+"x\xda\xeb\x0c\xf0s\xe7\xe5\x92\xe2b``\xe0\xf5\xf4p\t\x02\xd2\x02@\xcc\xcf\
+\xc1\x06$\xdf\x16\xfb\xeb\x03)\x96b'\xcf\x10\x0e \xa8\xe1H\xe9\x00\xf2\x17y\
+\xba8\x86T\xccY:y#\xdfa\x05\x1e\x97\xf5S\xd9\xed^\xdb\xad^|\xbc\xee\x1a\xaf\
+\xec/O\x9e\x89\xb7\x18'\xb2\x14x.\xbe\xc3\x14\xf1\xe1\x9dN\xf7\xec%\xfcz'\
+\x16)\x9d|\xa6\x93\xc9\xf7B\x9e\xc1!\xee\xd4\xac\x1c>\x93I\x05\xdf\xb7>xw\
+\xc2\xbb2\xc2\xf1\xe4\x85;\x8a;\x9df\x89\xdd\x91\x9d\xf4\xa1\x8e\xf1\xea\x92\
+w\xd5\x8b\x97\xb5\xee]T\x96&%4'\xd4\xa2\x95i7\x07C\xc3\x1e\x9b\xb6\xa8M\xea\
+\r\xbdu\xff\xcf\xa7\xb3L\xb6\xf2\xdb`\xb9\xad\xf3\xdbVg\x87\xfbn\xfc\x96S\
+\x15\x9af-\x91\xdf\xfc\xdd\xc0Q\x9f\xf9\xd1y'\xad\x92\xf7_Yw-w\xf9\xfd\xe3\
+\xc8\xceF\xa0k\x19<]\xfd\\\xd69%4\x01\x00\x15\x1a\\\xba" )
 
 def getPasteBitmap():
-    return wxBitmapFromXPMData(getPasteData())
+    return wxBitmapFromImage(getPasteImage())
 
 def getPasteImage():
-    return wxImageFromBitmap(getPasteBitmap())
+    stream = cStringIO.StringIO(getPasteData())
+    return wxImageFromStream(stream)
 
 #----------------------------------------------------------------------
 def getPSMData():
-    return cPickle.loads(zlib.decompress(
-'x\xda\xd3\xc8)0\xe4\nV74S\x00"\x13\x05Cu\xae\xc4`u=\x85d\x05\xa7\x9c\xc4\
-\xe4l0/\x1f\xc8S60p\x03\x020_\x01\xc8\xf7\xcb\xcfK\x05s"@\x92 )\x03\x03\xa8$\
-\x10\xe8\x81\x01\x98\x89$\x18\x01\x04\x14\x08b3\x13$\x0ce \t\xea\xe5\xe7\xeb\
-\xa1\x0b\x02\xc5`\xa2PA\xa0i\xf9`\x006\x16&\x88P\x89"\x083\x13&\x08u\x0c\x04\
-\x03\x01D\x10\xeel\xb0\x17H\x16\x84{\x10n\xa6\x1e\x00\xa4\x15SO' ))
+    return zlib.decompress(
+'x\xda\xeb\x0c\xf0s\xe7\xe5\x92\xe2b``\xe0\xf5\xf4p\t\x02\xd2\x02 \xcc\xc1\
+\x06$\xe5?\xffO\x04R,\xc5N\x9e!\x1c@P\xc3\x91\xd2\x01\xe4O\xf6tq\x0c\xa9\x98\
+s4\xc8P\xe8\xb0\x02\xcfd\x1e\xe7\x7f\xff\xa3\xd8\x84v\x1d\xb9"a\xfd6\xb6=\
+\x8bY\xa51\xc5C\xf3\x83\xc4u\xcbm\xbe\x0cS\x9c\xf6\x87++1l\xd9\xb7\xae\xbfEs\
+\xe6\xc1\xed?n*\xf4N\xb0\xbd\xd9\x1c\xd8\xc9\xa5k\xac\xe5?\xd1\r\xa8\xec\x82\
+\xf4\x85h\xab\xa9W\x12\xbaD\xf9\xd5\x8c\x0f9mH\xea\xae\xda\xd3Z\xbe\xe6)\xeb\
+\x14\'\xaf\x85\xaaQ\x1fm\xfe\x8b$\x1a\xef<\xaa(~`\x9a\xef\xc9:\xae@~\xd1\x88\
+\xfdk\xe7\xd6\x97\xac~\xfe\xef\xbf\xb6}\xd9\x03\xc1\xd2\x0fLs\x17X\x05\xef\
+\xda\x7f\xe3:\xd0y\x0c\x9e\xae~.\xeb\x9c\x12\x9a\x00R\x81Q\xfb' )
 
 def getPSMBitmap():
-    return wxBitmapFromXPMData(getPSMData())
+    return wxBitmapFromImage(getPSMImage())
 
 def getPSMImage():
-    return wxImageFromBitmap(getPSMBitmap())
+    stream = cStringIO.StringIO(getPSMData())
+    return wxImageFromStream(stream)
 
 #----------------------------------------------------------------------
 def getPLMData():
-    return cPickle.loads(zlib.decompress(
-'x\xda\xd3\xc8)0\xe4\nV74S\x00"\x13\x05Cu\xae\xc4`u=\x85d\x05\xa7\x9c\xc4\
-\xe4l0/\x1f\xc8S60p\x03\x020_\x01\xc8\xf7\xcb\xcfK\x05s"@\x92 )\x03\x03\xa8$\
-\x10\xe8\x81\x01\x98\x89$\x18\x01\x04\x14\x08b3\x13$\x0ce \t\xea\xe5\xe7\xeb\
-\xa1\x0b\x02\xc5`\xa2PA\xa0i\xf9`\x006\x16&\x88P\x89"\x083\x13&\x08u\x0c\x04\
-\x03\x01D\x10\xeel\xb0\x17H\x16\x84{\x10n\xa6\x1e\x00\xa4\x15SO' ))
+    return zlib.decompress(
+'x\xda\xeb\x0c\xf0s\xe7\xe5\x92\xe2b``\xe0\xf5\xf4p\t\x02\xd2\x02 \xcc\xc1\
+\x06$\xe5?\xffO\x04R,\xc5N\x9e!\x1c@P\xc3\x91\xd2\x01\xe4O\xf6tq\x0c\xa9\x98\
+s4\xc8P\xe8\xb0\x02\xcfd\x1e\xe7\x7f\xff\xa3\xd8\x84v\x1d\xb9"a\xfd6\xb6=\
+\x8bY\xa51\xc5C\xf3\x83\xc4u\xcbm\xbe\x0cS\x9c\xf6\x87++1l\xd9\xb7\xae\xbfEs\
+\xe6\xc1\xed?n*\xf4N\xb0\xbd\xd9\x1c\xd8\xc9\xa5k\xac\xe5?\xd1\r\xa8\xec\x82\
+\xf4\x85h\xab\xa9W\x12\xbaD\xf9\xd5\x8c\x0f9mH\xea\xae\xda\xd3Z\xbe\xe6)\xeb\
+\x14\'\xaf\x85\xaaQ\x1fm\xfe\x8b$\x1a\xef<\xaa(~`\x9a\xef\xc9:\xae@~\xd1\x88\
+\xfdk\xe7\xd6\x97\xac~\xfe\xef\xbf\xb6}\xd9\x03\xc1\xd2\x0fLs\x17X\x05\xef\
+\xda\x7f\xe3:\xd0y\x0c\x9e\xae~.\xeb\x9c\x12\x9a\x00R\x81Q\xfb' )
 
 def getPLMBitmap():
-    return wxBitmapFromXPMData(getPLMData())
+    return wxBitmapFromImage(getPLMImage())
 
 def getPLMImage():
-    return wxImageFromBitmap(getPLMBitmap())
+    stream = cStringIO.StringIO(getPLMData())
+    return wxImageFromStream(stream)
 
 #----------------------------------------------------------------------
 def getDMData():
-    return cPickle.loads(zlib.decompress(
-'x\xda\xd3\xc8)0\xe4\nV74S\x00"\x13\x05Cu\xae\xc4`u=\x85d\x05\xa7\x9c\xc4\
-\xe4l0/\x1f\xc8S60p\x03\x020_\x01\xc8\xf7\xcb\xcfK\x05s"@\x92 )\x03\x03\xa8$\
-\x10\xe8\x81\x01\x98\x89$\x18\x01\x04\x14\x08b3\x13$\x0ce \t\xea\xe5\xe7\xeb\
-\xa1\x0b\x02\xc5`\xa2PA\xa0i\xf9`\x006\x16&\x88P\x89"\x083\x13&\x08u\x0c\x04\
-\x03\x01D\x10\xeel\xb0\x17H\x16\x84{\x10n\xa6\x1e\x00\xa4\x15SO' ))
+    return zlib.decompress(
+'x\xda\xeb\x0c\xf0s\xe7\xe5\x92\xe2b``\xe0\xf5\xf4p\t\x02\xd2\x02 \xcc\xc1\
+\x06$\xe5?\xffO\x04R,\xc5N\x9e!\x1c@P\xc3\x91\xd2\x01\xe4O\xf6tq\x0c\xa9\x98\
+s4\xc8P\xe8\xb0\x02\xcfd\x1e\xe7\x7f\xff\xa3\xd8\x84v\x1d\xb9"a\xfd6\xb6=\
+\x8bY\xa51\xc5C\xf3\x83\xc4u\xcbm\xbe\x0cS\x9c\xf6\x87++1l\xd9\xb7\xae\xbfEs\
+\xe6\xc1\xed?n*\xf4N\xb0\xbd\xd9\x1c\xd8\xc9\xa5k\xac\xe5?\xd1\r\xa8\xec\x82\
+\xf4\x85h\xab\xa9W\x12\xbaD\xf9\xd5\x8c\x0f9mH\xea\xae\xda\xd3Z\xbe\xe6)\xeb\
+\x14\'\xaf\x85\xaaQ\x1fm\xfe\x8b$\x1a\xef<\xaa(~`\x9a\xef\xc9:\xae@~\xd1\x88\
+\xfdk\xe7\xd6\x97\xac~\xfe\xef\xbf\xb6}\xd9\x03\xc1\xd2\x0fLs\x17X\x05\xef\
+\xda\x7f\xe3:\xd0y\x0c\x9e\xae~.\xeb\x9c\x12\x9a\x00R\x81Q\xfb' )
 
 def getDMBitmap():
-    return wxBitmapFromXPMData(getDMData())
+    return wxBitmapFromImage(getDMImage())
 
 def getDMImage():
-    return wxImageFromBitmap(getDMBitmap())
+    stream = cStringIO.StringIO(getDMData())
+    return wxImageFromStream(stream)
 
 #----------------------------------------------------------------------
 def getGridItemData():
-    return cPickle.loads(zlib.decompress(
-'x\xda}\x8f\xb1\n\xc30\x0cD\xf7|\xc5A\x07w\x12\x18J\xa1k\x0b\xfd\x81,\xb7\
-\x86\x8c\r\xb8\xff?U\xa7\xc4\x0e1\xa1\x87\xb1}\x8f\xb3d]\x97o\x1e\xc6\x94\
-\xef\xf0uCN\xc34&\xc3\x8c\xe72\xcd\x9fppwy\x87\xc2\x17\xf9G(<\xe5_\xa1-/\x99\
-k\xbd\xed\xd0\x08\xd0\x8eP\xac\xd2\xff\xc9\xb3\x9aA\xb8\xf1\r\x1ai\x8e\xa8\
-\xb3B+$\x94$Y\xacB9\xed\xf0d\x83\xc5\x82\xa8\xf4\x9e\xf4\xe7\xd1\xe5\xf0\\5\
-\xf5Otp\x9d\xa8kT\x93\xadQ|\x1e\xed\xe8\xc6l\xb3\xdb\x0f\xee6U\x90' ))
+    return zlib.decompress(
+"x\xda\xeb\x0c\xf0s\xe7\xe5\x92\xe2b``\xe0\xf5\xf4p\t\x02\xd2\x02 \xcc\xc1\
+\x06$\xe5?\xffO\x04R,\xc5N\x9e!\x1c@P\xc3\x91\xd2\x01\xe4\xdf\xf2tq\x0c\xa9\
+\x9837\xd8\x90\x8fE\x91c\xce\xde\x88\x1f2]\xda\xdfV\xdat\x1ejz\x1e0\xa3@\x94\
+-|\x9b\xa5\xd0f=\xe3\xe6\x86\x8a\x9b&\xee\x89{\xbf\xbe\xbd\xbf,\xd4\xa4\xe6\
+\xde\x11#\x163^3^\xa3'\x1c3\x94\xab\xe3\x18b\xda~\\\xd6w\x969\xf0\xd0\x9e)\
+\xc4\xf1\xde\x11\xb3\xb3\xb7\xbd\xc3\xfe\x7f]\xb0}_XG\x8aGg\xebV\x1d\xbeO\
+\x7f\xf7n?vr\xc2S\xee\xbc\x94+\x87\x0e\x9eq\xe74\xe3]\xb5\xab\x93\xb1a\xa6x\
+\xddM\x93\xf3\xea\xad\x82\x17\xa71\n:\x86\x86\xb7\xad\xd6\xbfX\x9aV\xc6\x90}\
+T\xf7\x88y\xf2A\xdb<\xc5t\x81\xe5!3\xf8b\x7f\x17\tu\xbe\x98\xe1\xa2\xb4jE)C\
+\xe8]\x96\x9d\xff\x0e\x17\xd5\x1a=Ya\xfb\x9e\x99\x7f\x9f\xefg\xed\xfd\xc7lT\
+\xce\x9f\xac>\xbcM-mAU\xedU\x8b\xff\x0c\xb74-'\xd4-\xaa\xf5\x02\xfa\x92\xc1\
+\xd3\xd5\xcfe\x9dSB\x13\x00\xcd\x91u\x16" )
 
 def getGridItemBitmap():
-    return wxBitmapFromXPMData(getGridItemData())
+    return wxBitmapFromImage(getGridItemImage())
 
 def getGridItemImage():
-    return wxImageFromBitmap(getGridItemBitmap())
+    stream = cStringIO.StringIO(getGridItemData())
+    return wxImageFromStream(stream)
 
 #----------------------------------------------------------------------
 def getwxPythonLogoData():
-    return cPickle.loads(zlib.decompress(
-'x\xdau}iw\xdb:\xb2\xed\xf7\xfb+\x94C\x8aN$\x92\x16\'Q\xa2H.N\x92\xe7\xc8Cl\
-\xd3\xc9Jb;\x1e\xe2x\xa0g;\xb1\xe3\xdf\xfe@\xd6.\xe8\xf4\xed\xfb\x1a+\x89\
-\x0e\x9a\x04P\x05\xa0P\xc3F\xf1\xfd\xc5\xb5\xf5?[sV\xaf\xd7r\x9d\x96m\xb9n\
-\xcb\x9e\xfb\x9f\x83\xad\xb9~\xd5\xfa\xd1Rz\xbdI\xda\xeb5\x15\xfb]Q\x91]\x1c\
-\xfc8o\xfe3\xee\xd4\xff\x7f:I\x079\xfd\xff\xddnS\xe1\x0c\xc7\xd9\xb0\xa9xS\
-\xeb\x8a\xbc\xc8\x9d\x9c*^[ME\x9e{c\xea\xe3\x83)_I\x9b\x8aVPW\x8c\xdd\xdc\
-\x1e\xd0\x13_gOdM\xc5\xc7Hv\xeb4\x15\xa3\xb8y\xc5r\\\x8f\x9exj\x06\xde\x9f\
-\xf43\xdfm*\xfe4\xaf\x8c\xed|<\xa0\x8a\xa8\xa9\xc8\xadl\x98{M\xc5\xb5\xde4\
-\xdaK\x07\xe3\xa2\xa90*\xd9\xed\xb8\xa9\x18\xdb\xcd+^\xee\x8e\xa9\xe2\xd6\
-\xa9+\xb2,\xb3\xf3\t\x91\x9f4\xdd\x0e\xfb\xee\x80\xf8Q\x8d\xea\x8aI6\xf1\'T\
-\xf1j\xc8\n\xab\xa9h\x8f\x98A\x05U$V]QL\xfa\xbeO\x15\xf9\xb4\xae\xb0\xf2I\
-\xdf"\x06}W\x88\xb8\xac\x00-\x0b\xedf\x9a\xdca\xafG\x15?\xa8\xc2\xeb\x15="n\
-\xbf!n\xe8\r\x07\x18\xfa\x16MC?\xb7\x0b\x1a\xfa7\xad\xe9\xa5\x98\xf4,\xaa\
-\xf8\xa2\xd2\xdc{}\xcc\xfd\xef\x868\xb7\xe7Z.M\xe5C\xc3\xa0\xc2\xc9\xd3\x82&\
-j\xbb\x19z\xe6\xa5\x93\x9c\xa6a\xa5a\x90?\xf0\xfd1Uh\xf4\x8a\x9d\xe7\xe3\xbc\
-\xa9(C\xf9\nU\x1c;</\x05\xd1\xf2\xa1l*\xfc\xbc\x97\xd3\xbc\xac5\xbd\x8c{i\
-\x965\xc4\xfd3\xd7\x0c\xcc\x9e\xd8c\xa7\xffO\xfdD\xd6L\xd4\xb0\x18f\x98\xb9\
-\t\xd6\xc7\xc0\x1e\x10qW\xb6|\xc5o*z]\xac\xf41\xa8\xfd\x10H\xe2\x06M\x85\xdf\
-\xf4"\xb83\xe8\xd1\xbc(\xcd\n\x1aX~> ~$\xcdn\x18{EV\xd0D}\nx\xe8`\xd0\x97f\
-\xe8\xc3\xc1\xd0\xce\xa8\xc2l\xb8\xee\xa5\x9e\xe5\xd0Jvt"n0\x18R\xc5RC\xbe]\
-\x8cm\x87\xf8\xa1x\rO3\xdf\x1b\xd2\xdc\xf6\x9b\n\xc7\xab\x0b\xf52\xeb\xb6\
-\xdfT\x9c\x86\xd4h\xdf\xeb\x13?\xde5+\xc8\x1a\xd4\x85\xb6\x07-\x98^\x9a\x83\
-\xfcu\x1a\x87\x95z\xd8\xd9{\x16\xd6z\xbf\xa0\n\xbd\x19\xd8p<\x1cf\xc4\x8f\
-\xc9\x88\xc9\x1fS\x85\xd1,\xdc\xdeD,\\\xa2\xb6l\xba\xf5\xdd|\xec\x13\x83\xde\
-\xd9\xb2Qzb\xa7Y\x1fC1M)-\x87\x9b\xe6\t\xd7r&.\x91\xff\xd2\x92\xc4\xd1r\xd87\
-\xe58\x88|\xb5\x19X\x9a\xa6NFO\xfcj*\xb2~Z`\xab\xef5\xe3\xf0\xc4\xae\xf5\xe8\
-\x89%\x8d\xa5CJO\x18\xcd*\x1c\xf4\xfd!\x0b\x03S6J,\xbc\x99\xcan\x89\xc9a\xb3\
-_\x9c\x9e\x9d\xdb\xb4\xc6\x86r\x1c`a\x8a5V\xf8`\xf2{\xdeb,^\xbf4\xe3\xc8\xf2\
-\xcc\xa5W\xfe\x99k\xc8/\x86\x855\xee5K{\x81\xf7m\x1f\xe2\xf3\xc9\x95\xbd\xd0\
-\x82i5,\xcczi\x9a\x11\x0b\'\x06\x11W\xa4}b\xe1\xa6\x85-V`\x8b\xbd\x98\xb2["\
-\xff\x9c\xf7m\x06\xf2\'\x91l\x94\xc8_\x8f\xe4+D\xfe\xbc-\x1b\xa5\x8am\xda\
-\xc8\xbdl\x02\x91\xf3R\xca6\x88Aw\x95l\x836a\x97$\xae\x9b\xf62Z\x96?\x9b\x1d\
-e\x8f\xc7=\x87\x18\xb4%\xc7\x01\x9e&\xb2\xd1\x9c\x16\xdd\xaf.\xb6i\x8em\xfaf\
-\xca\'\x88A?H\xc0\xdaEoB\x15\x9b\xf4J\xd1\x13"\x86dr3tw\xe8\x0e!\xa5Z4Q\xde\
-\xd8\x85<\xcd\x9b\xfd2\x9c\x0c\xb3!\r}\x1a\xca^\xa8b\xdf\x92\xc4\x11\xb5{\
-\xcdD\r\x9dA\x91\xd2\x13\x8bM\xb7vj\x0fA\xdchD\xeb4\xb3@\\X\xa2\x17\x1f\xe2\
-\xe2\xde\x95\xbd\xd0\x06j7B\xc9\x17L\x1e\x10-\x9f\x9b\x81M\xf2\xc9\x10\xc4M:\
-\xb2\x82&\xfbw,+ .\x9a\xa1\x17\xe2p\xc5\xec_\xd0\xe2\xb7\x87\x1ef\xff\xb1Y\
-\x96N\xdfq\x1c\x9a\xca\xfbY\x1b4\xd9_i\xe1\x16\x99\x8d\xb9\xfd\x93`i\xb3<]BE\
-\x91\xa1"$9\xd6\xf7{C\x9c\x95t\xaa{\xe2\xbc\x85\x80\r$?H\xc0\x0eC\x92\x0eC\
-\x07Ol\x90\x1cs\xeaB<%\x19$\x04_A\x07N\x12\xca6\x88\x96\x95J\xbeBC\xff\x94P\
-\xc5\xb0\x87\x8a\xd6\xec\x15\x9c\xfb\xcd\n\xea\xbb}\xc7\'\xe2,\x9a\x97\xe1\
-\xd0M\xa9\xe2\x99v\xe5X(58+#~\x05\x8a\xc0\xa3)\x89#Z"\x03ZN:\xa4\x8a\xebf\
-\x03\x89]\x9c\xbaD\\4{\x85hi\xcf*hY\xf6\x15\xf9\n\xcd\xadN<\xcd}\x7fH\x15[\
-\xa4K\x89c~@s{\xe8\xd2\x82\xe9\x17\x03"\xae\xd0H\xdd\xc8\x87\x1e\xd1\xf2@\
-\xa7\x98S\xf4\x86T1\xc6\xd9\xe0\xb0\xd8\xf2\xd1hQ\x80\xda\xab\x86\x85\xb9#t)\
-\xa2\xe5\x894\x94L\xe8A\xb4p\'6\xcd\xcb\xb07\xa4\x85;&\xe90\x10\xfa\x07U<\
-\x93\xb4\xccR\x0f\xc4]B\x0f\x12\x8d\x12-\xddf\x13\x8a3\xcc\xf2\x89\x96m\x12\
-\xc1\xce\xd0J\x89\x96\xf9\x86\xa7\x99/\x94\t\x9a\xca\xdbf\x9d\x16i\xe1\x14\
-\xf4\x84\xebB\xdb\xca \x94F\xa6\xec\x96\xa8]#\x9eZ\xf6\x18b\xfc\x1dt`\xa1\
-\x19\x11\xb5\x87\xe0G\xdfF\xc5\xb8\xc3\xe3\xc8\xa8\xe2W\xd3h>\x14\xf2dHb\x9c\
-\xe4\xc7p\x92\xf5\x86\x8d\x18?\xae\xe4\x13D\xfeS(\xdbp\xe8\x15K\xd2\x925\xaf\
-\x94\r\xb5\x99\x9d\xf6\xc1\xa0\xaa#\xdb\xa0\nc\x84M\xd8\x07\xc7\xceB\xe6zJ\
-\x15\x95#\x1b\xa5WN\x9b\n\xaf\xefy\x90t\'\xb3\n\xda/I\xcc\x92\x0e\x0c\xcae\
-\x05\xa4\xd4[\xb3\xd6\x85*\xc5\xe7\xfe&\x8d\xc3J\xf3\x9cf\xff\xb8Y\x1fb\x14~\
-J\xdb4iX(\x94 Qh\xb2y\x03\r\xc74\xd2\xef\xcd\xb2\xcc\xc5q\x03j;\x8dB2\x10\
-\xcb\x16\x9a\xc1\x8fY/\xb4\x1c\x1e\x02\xe6GA\x15\x13\x129\xe3\xba4\x15\x83)i\
-}B\x97\x82\xd6G+\xc8J-\xc8\xe4T\x97\x8dR\x85\xd2\xe2\x15\x04\x05\xde6\xe5\
-\x13tF\xfd5\xb1\xf8\x0bT\x8c\x1b\xb9\xee:Be\xa1W\xd6\xe8X\xebIM\xe9\x9a\x8c\
-\x11+\xf7\xa0I\x0fb\xd9(U\xa8!O%\xac\x82\x1ftF\xd9\xe2\xdc#\x16\xa6\xa4nd\
-\xbe\x03\x16\xf6H\x11\xf0R\x1b\xe7\\\xd8\xb0P\x9c\x14\x0eX\x18\x92\xc93\xc9}\
-\x9c\xfb\xbb\rq\xe3|\xec\xe2(\xd8\xd6XU\x80\x1ed\x91P\xf2\x85n\t\xb5G\x91\
-\xb4\x10\x83.H\x18XBg\xa3\x8a\xc7\x86\x85\x93\xa2\xb6q\xe8l\x08\xb1\x91\x0b\
-\xf0\xf4\x0b\xc9 \xdfgm<L\xb8\x17p\xec\x9a$\xbf\x9f9\xe0\xe9b(\x1b\xa5\x8a\
-\xbb\x16\x04}\n;j\xa3\x99\xca~\x9a\xbb>\xb1\xd0\x07\x93\x8bAA\x15\xfb\xb6l\
-\x83*\xe6\x9bq\x0c\x1c?\x87\x08~oI\x06\xd1\xae\xbc\x89\xe58\x88\xc9\xeb\xb3n\
-\x89\x85\xa6\xc1S\xe9Q\xc5*i(c\xa9K\xbd#-\xb8\xe8\xa7=\xa2\xf6,\x96\x03\xa3\
-\x8a\xf7\x0e\xaf\xa0\x82\x18\xd4!Y\xd8\x97z\xd0Q\x97\x18$\x146b\x90\x86\xd3t\
-hA\x06}o\xf1\xd0\xa1\x17\x9e\xd1\xcc\t\x03\xc6\xa5\x8a\x85f\xe62\'\x1d\xa4D\
-\x8bOr\xac/\x14zZ0\xddf\xe8\xb6\xd0\x9dl\xaa(g\xc4\xd1+w$O\xbd|\\@\\\xf0a\
-\xe1B\xf9\x1eir\xe8\xb4`\xbe\x91t\x18O\x86\x90\xb8\xeb8\xf8\n{H\x15!\x1d\x16\
-\xfd\xbe\xd3\'~l\x85\xd8\xc8.\xf8q\xe7r\xa3\x109\x7fh\xd1\xd9\xc3\xde\x80f\
-\xff\xa5aP6\x10g6|\x06\rq\xb9\x9d\xf50\xf4n)\x9f\xa0\x89\xdah6\xd0\xd0/2X\
-\xd1w\xcd+\x83\x9e0\xab\xb1_h\xb2\xfbckB\xb2p\x95x:q&\x10\x8e\x1fh*\xfdb2\
-\xa6\x03\xc7i\x0e`\xa1\x9d\xf7\x07T\xf1\xd8\x92\xb4\xc0\xac&c5-\n\x9c/w\x01\
-\xb6\xa9\x0f\x01\xbb#_\x81<\x9do1\xd7\xc7\xb4N{\n\x1d\'u!\xf9\x11r\x1b\xd0\
-\x82\x7f`W\xf6\'\xb0\xb4\xaaY\x1b\xc4\x8f#\x12[inci/\x94\xb2\r\x9a\xfdq#\xb6\
-\x1c\xdb\xe9\xc16=\xedb\xef\x17PHvM\xd9(ql\xd0\xbc\xe2\t\xe9\xe0Q\x85\xd6\
-\x96\xafP\xc5\xfbJvK,,\xb0\x1b\x86\xfd\x01Ux\xa1\x9c(<1%\xb7K6\xc4\x92\xbaWd\
-\xa3XA\xae|\x85*VigO\x06iJ\xd3\xa0\xd2q\xd2\xcf2\x88\x9c3R\x14m7u\xa0\x9eOy\
-\x15Bc+y\x8by\xd8b;\xcd\x82\xb1\x84\x94\xb6\xa8b\xa5i\xa3\xe8\xe79\\\x04\x1e\
-\x8cw\xdfC\x1b\xcf\xb6d!M\xd4\xef\x12\x87\xf8\x18\xeb\xd4\xf3d\xb7T\xe1\xc4\
-\xd0\xc7\x8a\x01&\x8a\x0f\x8b!\x8c\xd5\n\x8a\x91\x9fA\xa7k5\x8dN\x9cq\x81U\
-\xa86\x0c*r\xa1\xf6P\xc5VS1H\x07\x1e\x96e\x9b\xa4\xd40\x9d\x80\x85\xbf\x03\
-\x9e\x17\xbc\xb2\xda\x85\t\xe8\x0e\x88\xb8\xf7M/\xc2H\x1a\xe2H\xfaL\x1c\x9b\
-\x14\xc3>\x11\xf75\x91\xafP\x853\xe3\x18U(#90Z\x96o\x95|\x82\xa8\x8dH\x1d\
-\xed\x0b\x81B\x8bN%O^\xaf\xdf\xf3i\x05}\xc6\x82\x91zahA\x85ck\xed\xcd\x91\
-\xb4PE/\x90\xdd\x12\x0b7,\xc91\xaa\xf8\xe2@\xc2\xb0\xd4>\xa6\xbd/8\n\x0bg\
-\xa5$3ab\xc3LX#\x9d.\x13:\x1dU|\xee\xca\'Hl\xed\x8e \x93\xb31\xad\xb1>-\x07q\
-\xe2`\xd1\xddc\x8d\x8d\xd9(R\x9aF\x05\xbb2\x98\t\xbb\x01\xc4g\x81C\xab\x08\
-\xe54PE.\x97\xc3\x90\xe6\xe5\xa7\xc3\x92\x1f\xf3rI\x03\xebe6\xfc0\xab\xb36h\
-\x1a\x9c\xae\xa4\x85\xa6\xe1-\x91\xe3\xa0\x8aQ(\xc7A<\xfdn\xcb6\xa8\xe2\xc2\
-\x82\x8b\xd1\xc2Q\xf0\xc7\x85,L\xb1\xb3\x1f\x1a\x9eN&\x13\x7f\x02\xdb#\xc2\
-\x91\x94\xd3*\xfcg\x8e<\x02\x13\xa1\xc1\xfa\x8d\xd2\xbb\xd4\xc2Y\x99\xe3\xdc\
-_\x81\x0fe8\x04\xc7\n\xf2\xb0\n\xeb\x16\nZ*\x1b\x85,\xbciv\xa5\xeb\x8a\xcd\
-\x00\x16\x96\x90\x0e\xe3\x94\xc8\xdf\xd2\xb0\xc5\n\x8f*65\x1ck9\x0c\xefa\xd3\
-hQ\x14\x16\x1cU\xbf\xd8\xd9\xe5\x92A\xf3\xcf\x1cUX^\xcfK\x9b\xa1\xf7\xa8\xdb\
-\xdc\xcd\xc6\xd4\xe8\x19\xc9B?\xb5\xd9\x8dM\x82\xde\xcd&`\xe1\x87\x16\xf3\
-\x14Z\xf02\x1c\xbbu\xa1\xc3\x02\x1a\xbd?\xc4\xa1\xf5=\x91O\x10\xd7\x97U\xd9\
-\x0b\xbc_t\x12\n\x16\xa3"\xa3\xb3\xc1\xc9-\x08\x94#G\x8e\x94*\xe6M\xd9\x06M\
-\xd4Z\xd3Fa\xe5>\x04\xec\xf1\xec\tZ\xc9Q \xb9N\x8b\x7f\xde\xc2F\xee\xe1\xe0;\
-+!\xc6YO>\xef\xd0T\xbalWv<\x96R)Ul\x87\xbc\x1c r\xda1\xce\xfd\x01\xdc\x1d\
-\xd7\x95l\x14\xfeB\r^\'\x17\x07\xce\xc1\x88\xa9\x85\xf7\xabOm\xf4r?%j\xd7\
-\x1b\xf2\x87\xf9 \x05\xf9\xdb\x06\xcf-N\x8f.[\xd1cT\xfc\x9ab\xdf\xb2M\xf8\
-\x89\x8c\x91\xa1TX\xefJ\xc8\x8f1\x0e\xf1\x1e\xc9\xb1\\\xea\xa7\xa3)\xb9\xd3\
-\x8b\xd4\xa5\xf5\xf1uJ\xa6W>\xe9\xc3\xb5G\xf2T\xa8E\xa0v,\x97%\x8e\xe8\xbf\
-\x92ZTl\x07r\x1c\xb4\xc6\x86\r\xb5i\x91\x0e\xf1\xc4\x06\xd6\xe90\x85M\xf8n\
-\xf6\x04U\xac\x90\xadn\xfb\x16$\xee\xb4\xc5S\xc9\xce\xd0HvK\x8bN\x89e\xa3T\
-\xb1\x14\xf2\xbc\xc0\x16["\xefWo\x90\xe3\x89t\xf6\n\xf1t)\x86\xef\x82Ms\x8b\
-\xb4\x9c\x9e0\xb3\x89\xc9\xbb6\x13\x07\x17t\xe4\xc9F\x89\xeb\x0f\xac\xa0A\
-\xe9\xfdg\xce\x81\x1c\x9b\xe4v\xb3+\xdb\xbc=\xfa\xd8\x84\x8fm\xf2\x9e\xe7ch9\
-\xbdY\x1bTqA\x15\x8e8\xc6a\x04\x90\xfb8\xf7\x86XR\xc6\xec\t\xe2\xd8\x92.\x89\
-#\x8eufO@s$\x938\x1f\xf6\xe1>\xfe\xa3\xc9F\xb1\xc6H\x16\xa6\x99\x85-6\xc2a\
-\x91\x0f\xc0\x8fs\x12\xb0~\xdf\xc3\x11\xbd`\xf0Z\xc7\x1a\xb3h\x1a2\xa1}\xd2\
-\x1a\xb3iI\t\xc1\x87\xf0B\x9b\xb7\x98\xb0p)@Ej\xe0X\xa8\xa3D\x8bO>\xb6\xbc.4\
-\xf46\xa4T\x81\xf3\xf6O%_!\xe2\x96\x15\xd6a\xb0>\xb6\xc8\xde\x17\xda\xbaEO\
-\xdc*\xb2\r\x9a\xec%\x07fS\x8e\n\xcd\x95\x03\x03\x83f\x03#~\x9c$\x88$\xda\
-\x109\xf7\xcd\xd9 \xb4\x11\x07~\x98uRXm\xa1(\x12\x83\x9eu\x88q\xf6\xd3\rM\
-\xf9\x044\x148\xcbs\x1f\x96\xc5\xcd\xec\tb\xe1\xa9B\xbe\x0b\xb1^\xa0\xc2ud\
-\xb7T\xb1k\xf0H\xa1\xe4}R\xc9\x8b\x9f\xa7,\xf9m\xf9\n\xc2>\x1d,\xfe\x1c\x82\
-\xbe \rV(\x92Cbrd\x91}\xdb\x1fc\x13\xdad\xac\x8a\x9d\x8f\x8a\x82\xddr\xfd!q\
-\xec\x9e\xcf[\xf1?R\xf2pz\x08\x89C\x1c[\xa1x\xe5@*\xbd\x7f\x10\x91H\xd9\xae<\
-\xd3\x10\xb0\x1bB\xb0E\x1d\xec\xfd\x01*6\xdb\xb4>\xc4\x96#\x8e\xf5IeI\'}\x98\
-\xe6\xdfK\xf9\n\xb1\xf0\x98\xbc\xe7\xd6x\xd0\'~\xa404\x0b64?\xc2\xc0\xf3lT,6\
-mx\x96\x10\x1fP\xf2(^\x99\x8f\'\x16-\x98m\x12\xb0\xe3~\n/\xed\x84T\x85\xfe$\
-\xed\x11\xb5\x1b%\x8c\x80\t\xbc,\xdb4\x0e\x7fh\xa5T\xf1\x97\x0f\x0b\xcf\xa7n\
-\xaf`G\t\xbd\x99&\xaa\xa2\xfd\xe2\n\x05\x9e\x9e\xd8\xe10\xc7\x00\x1b(nX8\xc8\
-\x8b\x0c\xe2\xf3\x06\xc1\xd8t\x8c\xb9\xdd$\x7f\xb2-TZ\x9a\xb9\xcd\x88\x99\\ \
-\xa2\x19B:\xa4Y\xd1\x88-\xd5\x95\xdd\xd2+\xdf:\xe0\x98\xe5\x13\xf9\x06I\x87\
-\xa2\xe8\xc1\xcd\xb0\xa3\xc9^\xa8B\xe7\x10\xa7\x0c?\xc960\xfb\xfa\x88_A\xc5&\
-G#-\xf8\xe8\xbb\x0es\x0c\xae\xac\x81\'_\x81\x13a\x04\xf3>\x85R\xb3C\xde\x9e\
-\xd4w\xe1\x93\x0eCI-\xd1\x12\xd3\xc0\xfc\xbc\x80&\x1d\x90\r4\xc8X\x16\xc6R\
-\x8cC:,\x92\xd3\xde\xaf\x0b\x89\xbe\x08q\xe4\x1c\xd2\xa1oA|z\x88\xbf|4\x11\
-\x14\x1e@:\xa4!/\x07\x98o\x8b\nB\xbe>\xbb\xb1\xc9n\x18\x08\x1d\x86*6ln\x94\
-\x14\x92\x7f\xe6\xa6\xb2Q:_\x8eKYA\xfc\xc8(\xa2i\te\x93\x16\x8c\xab`%\x8f\
-\xb1\xb4\xe7g\xbdP\xc5\x9e#{\xa16\x9eI\x06\r\x85\xb6E<\xfd\xdd\xcc\x9c7\xf6\
-\x86.\\\xbf\xa1l\x03\xbe\x8bJ\x8e\x03QQU\xb6A\\\xbf\xb7\xe4+pC\x91\xc8\xe9\
-\xf9\x1c\xd3Zg\xcf7\x1f\xc0\xab\x1aw\xeb\x81\x85\xb3W\x88\x85\xbbT\x91\x0b\
-\x15\x8eD\xdf\x06\xcd\xad\xe3Zp2\x15\x88\x04\xa4\xcc\xa0+\x07b\x9cC6\x07&\
-\x82\xc2\x0e\x14\x92\xcf!\xb6X\x0eeb\r\xbb\xd2\xf1<(h\xbc\xa3\\\xacuG\x01vc\
-\x027\xe5\x14N{\xb1\xfc\xe9\x89\xf3\x11\xa4e\nY\xf8F6\xa1\'\xe4\t=\xb1\x80\
-\x91\n!<\xa1\xc9\x86B\xd2\x13\xc2\xb1\x99\xec_d%\xb9\xc2\x8c\xa2\xddp\xa0A\
-\xd0\x8f\xa1\xb0\xfel\x86\xee\x0e\xdc\x01\x8c\x80g\x0b\x9a\xf4dB\x0c\xd2M`YX\
-A{*\xe5\xd0!\x83\xe8\xd0\x1a\x17\xfe\x181>\x86\xd0\xf4a&\xfc6\xe5+4\xfbiC\
-\xed8\x15:,\xac\x02\x9aJ\xc1C\xb8\xc2\xb7I\xdb\x1aKmk@\xd6I_\x88 "\xff\x96\
-\xf4SO\xcc%t\xdc\x08\xb1\x13\x17\xeaW\xe2\xca\xa1\xd3\xec\xafq(\xbe\x0f\xe90\
--\x11\x14N\xb1\xa3"\x04Br\x0f\x9e\xab\x03\x97\'\x1b\x1c3K\x00d\x06`\xd0m\xc8\
-\xc4\x81A\xc70V\xb3!\xc2\xb5\x17\x06\xf6m\x06#\xe0\x17\x85\xaf\x85\x06\x0b\r\
-e\xb9\x8b\x80\x7f\x0e\x93g\xb9y\xc5\x9bx\xbeK\x15;\xa4\xd1\xfb\x93\x1c2\xe8>\
-\x90\xd4B\x06Qp\xc9\xcbzP7^H\xb0yB=\xc7\x81\xc3\xb1y\x07\xda\xc5\x84\xe3\xfb\
-,q\xbf\x91\\\xb7\x866d\xd0<I\xed\xc1\xa4\x0f~l\xcez\x01^*\x96\xe3\xa0\x8a.\
-\x9d\xb7\xb6\xc5\xd6\xfc\xdb\xacQ\xaaxf\xac\xd3\x04J\xde\xa9.\x1b\xa5%u\xd6B\
-\xfc\xd6\x865\x9f\x90cfRx\xec\xd8\x9d\xbd\x02{\x9f\xe2/\xb9\xcf.\x93\xd7\xd9\
-\x13T\xf1\xc4\xc8\x9d\x14\x8b\xae0\x81vq\x10\x9fk\xd3\x11\xed\xf4m\x1cZ\x7fY\
-!\xc9\xa1\x05\'\xcdD\xf5\xad\xdce_p\xc9m\x80c6C\xd2\xd8\xf4\xca4n\x14\x87\
-\x96\xc2\xd8\x9e\t\x9cn\x03R\xbe3g\x88\xc8\xea-\xb9\xd3\x85\xda\x0c\x8d\xfe\
-\xac#9F\x15\x1dX\'\xfd\x1e4\x94}\x17\xa8\x9b>x\xfa\xd4\xc297F$`\xaa\xc0\xe3<\
-\x80\xd8z\x8a\x81T\xb1\x10n\xb9\x0f\x81\xa9\xe1\x08\xde;\x92\x96\xbeP\xf2\
-\x88\x85\xd7\tp\x06\x16V\xe1\x8f\xd9T\x12\xc7\xbe\x06\xb2Qz\xa2\xb2%\x0b\xe9\
-\x89KR6\xfd\x9c\xa3\xd5m\xb6\n\nDh\x86]\xe0a\xc6p\xa7_\x98\xb2\x82\x18T6<\
-\x1d\xb8\xbe\x0f\xdb\xf4\xa4\x92O\x00q\xe7\xcaq\x10\x83\xfe(\x88x\xf7\x80\
-\xb8\x9b \xb0\x9c\x8d\xa1\x07\x1d\xb9\x10[lgO\xc9/%\x848PH\xf3S\xec\x86\x14\
-\xbba\x9b15\x85C\x03\xd3C\xe0al\x98\xd5\xef\x19\x12\xd0\x83\xc8\xf9\x12\xcb\
-\'h7\xfcv\xe4\xd0i\xa4E#\x82=\xcfs!\x1dF\x16\x0e-\x0b\x03\xdb\xb2(\x82\xe7\
-\xb2j\xfd\xbb+\x89\x83\xa3\x8a\xe1/^N\x90\xb3_\x01D\x1f\x03d6`\xad\xf5\xd8Qe\
-+\x98l\x17g\xe5G\x15H\x95\x02O\xb8dX\xa5B\xed\x81\x82\xd6\xe6n\xb1\xb4\x1f\
-\xe8\x04\xf2\x85*\x89\x88\x15q\xcc\x16:\x1d\xc2>\x89l\x94*,\x03\x90\x91\x0c\
-\xc6\xc8+#\x00\xd2\x01\xcd\xedE\x0b\x12f\x80\xf3eBaRo\xd2C\x1c\xe8m\xd6\x06l\
-d\x12\x17\x9e\xcfN\xea\x08\xd2aP@\xcb9i\xc9i &\x17\xd0O\xebB\xa7\xd8\x08\x91\
-U\x0e\xd7\xe6&\x02\xcb\x03\x88\x0b5B\xb4\x9a\x97\xf6+\\\xe1\xd9\xd8\x85\xb8\
-\x98\xf5\x02d\x86)GJk}\xc7\x90\xaf\x10\xd7_t\xf9\x04U\x98.@G\x16\x16\xbf\xc7\
-\xa1V\x0f,|\xa1\xa1\xd7\x81\x00\xe2\xd8\xaa\t(\x0f\xebt\xbb\x1d\xd9\x0bU|+\
-\xc9\x890\x19\xc0#\xf0c\nx\xe5\x10V\xf4\xd9\x8c\x16\x84\xe2m\x80l\\\xbc\xf2\
-\x13v\xb6t\xdc\xed3\xc8\x86\x81mG\x8c\xebK\x81\x88\xb8\xb2\x00\xe5\xe1\x98x\
-\x8746\xd7\x9d\x80c\xfa\xac\x17h\xd2\x90\xa7\x1e\xcb\xd3-\x151`\x07N\x95\x17\
-\xd9-\x18\xf4\x87qJ6\xce\xa8\x96d\xb2G\x1c\x0b\x03\xf9\x04q\xac\xd3\xc2\xf9\
-\xc2\xb0\xa4\x9e\x83\x80?k}\x1fuY\x81HQ\x17Q\xd1\x14\xd4\x8eT\x84}\xfap!\r$\
-\xd7=\xaa0u\x88`V\x14\x97"9t\x1c\xe2\xae|\x82*\xde\xd1Ih\x8dS\x8eV\xb7\xe48\
-\xe0\xd9,\x81\xbaaUr\xd3\x86\xdaS`\xd1\x998\xe6{\xbc\x91\xbf\xc86 \xa5\xbe\
-\xaa\xd8\xa6\x19\x96\xd4\x90\xc1>\x19\xa2\xb3\x1b3Z\x10\xaf\x8c\xa1\xd4L\xc0\
-\xb1\x96)\x1b%\x01;&\x1bh0\xe9aI\xdd\xc9%\x05\x1b9\x9b\xb5\x01\xf7\xb1\x0e\
-\xa9\xcdp\x8f}\x12(\xeex\x02\xf7q\xd8\x91\xd4\x12\xd7O`\xcf\xe5\x13D\x9b\x1e\
-I\xe2\xf6\x86\x8c\x93^ q\xd1\x1f\x8fm\xe2\xa9\xab\xb25\x0fo\xf1\xb0\x99\xec\
-\xc2\xcd\x0b\xc0p\xe2\xb6$\x9fx\xea\xb5\xe1\x98\xb1}\xec\xdb\x0e\xcf>6\xf23\
-\xc3=\x86\xa8\xd0\x1d\xe8\x1f.\xef}W\x0e\x1d _\x96tcF\xfd*\x08\xe7s\x1c\xf9\
-\x0b\xce\xfd\xc2\x87\xb9\xf2\x1e\xde\xd1\xfe\xc0\x87s\x87qJ\x1c\xb1z\x0c\xe4\
-\x134/:)\x02\xde\xb8\x07]\xea0\x82\x97\xd6\xc2:5m\x9c\x84)v\xa5\xe9\x01\x1e\
-\xe5\x81\xa7k-\xd9\x0b1\xa8\x8a\x11\xd3\xeaC\xf4\x1dN)f!\x0c:\xa2eU\x95OP\
-\xc5i\x8b\x99<\xa6}\x9b\xcaF\x19\xa6\xa5\xd1\xf1Z\x17\x12\xb0:\xb7\xc1\x08U\
-\x8dW\x10B%W#\xc91\xaa\xf8f\xcaW\x88A\x89.\x9f \x06\xad\xcc\xc6A+9\xa8\xe4+\
-\xc4\xb1s\x8a\xbc\x8fe \xe4\xd2\x00\xf8\xc9\x86M\xb8JaA\xcbv-Z\xb8_\x0c\xc4\
-\xc4-\xa8\xa3/6\xaf\x0f\x86\x89+8=r,\\C\x97\x8d\x02\x03\xef\xc8\x91\xc2\x08 \
-\xf5k<\x18b\xa2\xeeg\xbd\x10O\x17I\xd0\xa7R\xfb<T\x80\xd7\xee\xe3\x88\x9eo\
-\x03\x94\xc6\xda\xe79Y|\xb63\xee\x13\x93\x7f\xd8\x00\x94\xb1:\xfa\xce\xc0J.\
-\xc0\x8f\x12\x17\x1e\n\x07>\x94;Kv\x0b~\x18\xf2\t\xa2\xd6\n \xd8|\xf0\xe3K3\
-\x0e7s\xd8\x1d\xf6)f\xc5\x08\x06\xde\xd8b\xe2 \xfaZ\xe4\xfdrk\\\x16m\xb1\x0e\
-\x85\xd1\xd31\x96\xd4;\x08\xa5\xdc\x86M\xb8\x1e\xca6\x80\xfe!\xdfg6\xb4\x10\
-\xb2\xd9!oqj\r\x11\xf2\xfd\xc41\x0b\xf6\x08\x94\x8cSr\xb0\x82\x0cW6J\xcba\
-\xbb\xa4\xb8G\xd6\x07\xb5\xd7SH\xfe\x14fB\x9b4Gw\xec!\x18\xbbDX\xda\xc1\xb8o\
-\x83\xda\x11\xa4e\n\xf2\x1dF2\xf5q\xf0\xed\xb7\xb9\x8215\xba\xec\x05\xfe \
-\x87\xa5\x14\xa6\xf2\xa8#i\xc1U\x95\x08\x98\t\x17\xb4\xd8\xael\x83\x9eX\xeb\
-\xc0\xaf\xeda\xb2\x17\x08\x8f;\x988\xd8\x1ef\x05H@\x06\xab \x9b\xbdB\xe4_\
-\xb8\x10\x17C\x00S\xbe(\x08\xd7\xba\xd0\xa5\xaeh^\xec\x9c#4#\xc6)e\x08_\xef\
-\x93\xa2(6:\x9c\xa1\x03RG\x85,`\x14#\xf9\xb5{u\xa1^L\x1e\x18\x88\x8b\x19\xdb\
-c\x81\xb8\xdf.6\xe1\x18\xc2\xf1\x17\xa3\x90X\x95\\\x83\xfbg\xc2\x18\xa3K\x92\
-AN]\xc8\x01\xc0\xf0\x86>\x0e\xbe\x83@vKO<\x98\xb2[\xc0^g\x15 \x7f\x8ahB\x1f;\
-\xfbG\xc3\x0f\x7f2`\xf8\xfe\xfd\xec\x15\xc0\x92\xda\xd8b>\x96\xd4)[Z\xc2\xfa\
-\xa2\xdd` :\x9bCw\xe8\xcc\x06F\x15\xd7\x1ab\xe2)N\xa0\x1et~\x97yzb\xf0\x13\
-\x08NOu\x9e[\xf8P\x16I\x06\r\x07.6\xd0\xb8\xa4+D\xf9\x04\xd7\x7ft\xc4\x92\
-\xb2>\xd4\xafO\x14J\xf3\x84\xf6I[\xec\xb4\x94#\xa5i\xd0\x08\x99\xd1\xf3\n\
-\xa0\x7f.\x08`\'\xb4@\xc4,\xae"\x16(@d\xb6p\xa9f8\x84\x05\xfc\xb7\xcd\xf3\
-\x82 \xd7\x1eod\x96\x96{\xba|\xa5 \xa3\x88!V6\xa2\xf7\x17\x08\x92\xe7\x0cy\
-\x7f\xe3\xe0\xa3\x03l\xf1\x1f\x8bG\n\xf1\xb9\x90@\x180\x94\xf8\xa7\x9c\x17\
-\x1cI\xbd\x0e\xe2\xb7y\x9f\x88\xbb\x1c\xc9n\xa1\x9eSlm\x92r\x0c8\xed\x00\xa8\
-\xc3\x17\x1e\xaa\x00\x11^\x0b>\xe9mI\x0b\xa2\xa2\xeb\x8c \xcaPaN\x11\xe0\x1e\
-b\xd1E\t6\xe1\x00\x9b\xf0\xbd\x0e\x17\x01\xdb\xb7\x86E\x9e\xef\x01\xef\xca=\
-\x1b\x18V\x0e\xb4\xa7\x0cmb\xab\xf1x\xd6\x06\x0cM\x86\x04\x08u\xb4\xe1\xe9\
-\x90\xb0\xf8cq4\x10\x0b}\x169,\xb5\xa7\x11@G\x96\x03@j$\xc9\xa7\x8ae\xf8\x0c\
-\xfc>\xb8\xbedH~\x00+\x19r\xa3Xt\xaf\x1a\x8f\x14\xc2\xe0\xbe#{\xc1\xa2\xb3d\
-\x05\xad\xa0s\xf2\x08\xa4\xbe\x0f\x07\xc0eG\xb6\x81P<\xcd\xed\xa0`8\xe1;L\
-\x83\xe70~\xcc\x96\x8dR\xc5\x83\x83\x03\xc7\xe3\xcb_\x0c\\r\nZt]FT\xb9pw\xdc\
-\x10\x0b\xb3\xa2\x8fM\x98L\x11M\xc8\xe13xVp\xe0\x8c\x11\xf4\xfb\xd8A\xa4\xb9\
-\x07\xf2?\xd8\xb2\x17b\xd0\xde\xacQ\xe2GoVA;\xca(e/@2\xb5!\x1csH\xfe\xe7\n\
-\x91w\xf6\x07i\x1an?y}\xaa\x08\xa6X\xc9\xec\xc5\xffD\xd8\xe2q\x9a\xc2\xe4y\
-\xaf\xc8FiI}e\x9d\x8eW\xa1\xcd\x91U\x04\x97\xe6\x165\xde@\xf0\xc2}\x89\xe48\
-\xe0\x0b\x06\xb0m\xe0#\x92\xf8\x8d\x01T.\xf4\xd3{\xba\x96\xe5\xba6\xec\xcaO\
-\xe4\xda\x13f7\x14\xf8\x83\x19\x93\xa9\xe2/\x1f\x9e,\x0crF\x97\x8e]\xa8\x1b,\
-\x1d|H\x87\xebXvK\x15\x7f[<\rPi}S\xf6\x82\x1bC\x8c\xa8\xe2\x8bl\xcf\x0co`\
-\x1d\xb77{\x85\xa6\xd2\x94\xe4c\xb2S\x1b\x12\x97\xbd\xd6\x9d\x08\xb1h\x0e\
-\xe8^\xd3\xd0\xc7c\xbe\xc4\xfa2\x05"s\x0c\x00\x95J.\xa4\xbe\xeba\xb2\xcf\x19\
-\x1e\xc5:\xee\xc8\x83\x8f\x8d}\x8e\xa7&\x0e\x8b1\x0c\x89\x16\x8b\x9c\x02"\'\
-\x98\x8d\x03\xf0l\xc6\x19\xf8\x90\xc9\x1fX~p\x94\xb8\xe5\xc8\x95L\x15\xbb\
-\xa5l\x83fN\x0b\x11G\xe6\xdb\x82\xd3\x04\xb0\x02\x1b\x0e\xc4\x16C\xac<\x9cs!\
-\x00\xcb9\xbb]JDW\x86|\x91\xed\xcc\x95\x8d\x02kM\x9e\xbc|\xe2@\\<\x00\xcaSd`\
-aF~\xed~\x96B\xe7\xff\xce\x88*\x0b\xc2\xe0\x9b\x8a\xd8\xc9\x00\xb4h\x1d\xb6\
-\x1ayi\xb3`KaX\x9d\x03D\x91\xf2\x1d\xde[M\xb6\x01\x9fR\x87\x99\x0c~\xfcV\x11\
-\x9bg\xb5x\x01qS\x97q\x17\xb9J\x10^!\x84qW\x14\x17\x1d\xc5Pi\x05\rY\x8e\xf9}\
-\x04B\x1c\xd9\x0b\xf1\xe3\xdc\xe0q\x00P\xf61\x94O\x10\x83\xfe\xda<Qx\xa2\xa7\
-!\xc0\xed\xc3\'\xed\xcbm\x8a+\x11\x87\x16\x84\xe3\x90\xd1\xb6l\x8a\x0e1\xb7\
-\t\xc3\x1b\x06\x88\xac.\x13\xac\xd1\x9dX\x08\xa4\x1eUX0|)o\x19\xe2\xa2\xe08\
-\xf27R\x15\x06c{\x0cx6\t\xe9\xa1P\xad\xe9\x89\xed\x11\x04\xfd\x18Z\x8eI\xbbr\
-\x92\x15`\xd0g\xdebc\xf0\xe3\xa5B\x8c\xcf\xc3\x16[\xd5\xe5\x13\xc4\x8f\x8c\
-\xac\xf9\xa1\xef\xc0\x03\xaf(ptOp\xaa\x7fb\x9c\x12\xfbq\xcfX\xa3\xe7\xdd\xd0\
-\x9f=\x81\x00D\x85\xb8:\xdf\x14\xbe#\x89\x9b\xa6\x1c\xb38!\x0ck\xbf.\xd4\xa8\
-!yJO<\xccz\xc1\x1d\tG\x92\x8f%\xc5@\x8c\x1c\xc1\xc7\xccD|\xdf\xc7\x05\xb2\
-\x9e\x81\xc9f\xbf\xa5\x12\xcai\xa0\'R\x86#\xf3\x85\xbam\\\x9a\xe8\xf3\x9d\
-\x80\xaf\x11\xd3\x02IwH\'\xd0@(\xbd\xc4\xe4\x98\xe4\xa9\x9f\r\xa0K\xb9%\x00T\
-\x05\x0c\x1au\xca\x03C,\xe9\x91\xfc\x96\xe9d\x80\xcb\xe7\xf3\xb4\xa4\x86\xf5\
-\x1d\x08\xd2\xb5M\xd9\x0b-\xcb\xaf\xa5\x1c\x07\x02v\xb3F\x11;\xd1\xc8Xu}\xf8\
->\x17\r\xc0\xa3\x1c\x1c\xf3\x93P\xce-Ux\x04\\\x9a\xf8)n=\xefZ\xf2\t\xe8c\xb6\
-l\x03\x10\x89)\xa0^>\xe6\xf6\x83+\xdb\xa0y\xd9\x9d\x92.\xe5:pC\x15]\x80Jr`Y*\
-\x866\r`\xf2\x1c$\xc0\xe5XCb\x90F\xd2\xc1\xcd8\xc0\x9dw\x00+\xc8\x11o\xd8p\
-\x00\xc2\xf2`\xdf\xfe-e\xa3\x18\xa9\xc2;\x1bb++\x01:\x1a\xc3:\xa9p\x015e\xb0\
-\xf1\x18\x08Da\x02\x02\xae\x0e\x18\xf0\xc0\x05T\xe3\xd5\x82\xe68\x06\x0c\'6\
-\xb9[l1\xb3\x91\xb8\x9e\x9f\x8f\x018\xb4\xc98\xcbz)\x1c\xdd\x03Zt\xf6x\x00\
-\xe2^\xbb\xf2\thl\xb8[-t\x1a@\xbd\x88\x85\xc3\xc2\x07\xd4k\xd3\x05\x00"\xc3\
-\x19\xf5\x9b\xfc\x85\x03\xdb\x87\xad\x9e3\xdeA\xa6Qp\xe5H\xa1*0\xaa\xc2\x83\
-\x1f&\xc0\x81c38\xdfC\xc0.OaG-\xa8\xe0i\x06,\xdc-\xbd"\x94\x07\xc4N\x9e\x811\
-\x12Z01h?\x06p\xc9\x87\n\xb7\xac\xf34`%\x7f\xa2q\xd8\x19_\xa8\xebP\xa4\xd9\
-\xf2{p\xa8\xbe7\xb0\xf8\xf9\n\xa2EW2\xdd\xfe\x18\x17.7K\xa4s\xe0D\x0bk\x91|\
-\x85\xa8\x9d\xe8\xf0\xb0Z\x90\x0eq \x9f -G\x8f\x01\xc4\xe8#6\xdfn\xe1$d\xcc\
-\xd5o\xba\xbc\x91:\x03x\x9d\x8e\x02r\xa9\xd5\xff#[]\x87\xc4e<\xffn\x04\x9c\
-\x01\x83\x05\x8ft\xd9-\x90\x08tD\x17V\x06\x8f\xb3\xee\xca6\x10\xf43\x81\x0f\
-\xb2\x01|\xac\\H\x07\x8fU\x16\xda\xfb\x960\xc5pG\x93\x93yHW\'\xa3\x19XstJ\
-\xd9(\xa0\t\x01\x10D)_\x98\xb2\x80\xd9,\xfap\x0e\x93\xd8\xf2&\x0eB\x8b\x87\t\
-!\x00\xdc\x1c\x1c\xd3\x01\xe6\xf0\x19zo\x07\x88\xde\xf7ph\x1d\xc7\xb2\x17j\
-\xe3\xc0f\x9eB\xe2\x06\x14GN\xc7|\xbdc\xcc!=\x1b\x97\xcf\xdb\x1d\xd8\xd9\x19\
-\xf4 eF\x1cp\xe3\x0c\x8f\x12\x9aac\xbf\xfc@n\x86\xb1\x85+\x11\xdfb90b\xf2\
-\x11\xed\xfd\xf1\xa4\x8f\x8b(\xc7\n\xd2\x8e\xb0\x13\xb2\xe0t\x0e\x9c\xbbc\
-\x91\xf7\x0bG#\xb7;\xc0K\x15|c\xa8\x04>\xc8a\x9cc%\x9f \xe9\xf0\xcd\x91\xe3\
-\xa0\'\xa6\x1e\x04\x1b_\xbcx\xd2\xb1\x1b\\\x9c\xb7\x8b\x1d\xe0Pl\x9c\x95\xef\
-\x81\xec*,T\x1c\xcc*\x80r\xadx\x1c8\xc5t\xbeI\xce\x92NG\xb8\xa5`\x8c\xa2>{\
-\x05\x19SF\x88{\x0c\xb0\xb4+\x13\x99[8k\xc2\xa6J>\xd8\xbc\xc0}\xe4S\n\x94\r\
-\x84\xe5\t\xd7^\x07\xc0\x14v\xed}%\x7f\x90/\x15\x92S\x0b\x82m\x82\xb3r\x81\
-\x01\x98\x19\x9c*\xbfB\x8a\xbey\xec\xeb\xbbq\xe5Hq\xcbw\xd6hN\xf8dK\xbeB<uG\
-\x10}\xecw\xf8\x04[\xbd\xc6\x11\x90\xd8*\xe5H\x01\xacg\xa0\x9fL\xe6A"G\xc8\
-\x068eo\x13\xf9\x04\x80K\x88$\n\xc5\x001>\xc6\x18\xf1}\xc2\x1bDE\'=\x84\xb0\
-\xdeu\x01)\xcaa\xf2|\xd4\xb0M\xfb8\xe6]\x03;\x9b3/X1\xc2\x93\x1c6v\xc8\xb3\
-\xe9x\x8cp?!\xd0\x91Sx\xd0\x0c6;\xb2\x17\xaax\r$\xb5T\xd1m\xf1\n\x82\xfa\x15\
-\x9a\xb2[b\xd0\xb3*\xdb\xa0\'\xba\xbal\x03J^\x89\x108\x83\x05\xd78w\x87\x05\
-\x19\x14\x11<\xcaI{\xf0\xb2\x9cU\xfc\n\xc4\xc5\x0exjs\x14\xf0\xae\xcb\xaf`Y\
-\x1a\x1e\xcc\xfb\x02\x8e\xbbuSV\xd0\x92\xca\x01\x9c.8\x1fJ\x01\xf0\xb5P\xbf\
-\xa0\x07q\x86\x10\x86\x02~\xe7\x10V\x0f\xce\xe1\x9f6\xd2\xc1\xb0.u\xd0\xe2M\
-\x88[\xbe*\x83\x9f\x06\x00?\x05\x16L\x1e\xde\xb7\xae\x07\x81\xd2\x87B\xf2\
-\xc9\x04\xc6\x88\xd5\xe2l\x04\xb0O\x06\x16~nF:\xe9Oz\xb0\nl\x88\x1c\x8f\xcd&\
-\xad\x85\xf3\x85\x91]G%\xb6i\x0ej\x7f\x92L\xae\xcfF\x80\xe3\x02\xc4\xf8,\xec\
-\xb9\x03C\xf6B+\xe8W\xcc\xe3\x80p\xbct\xe4\xbc\x10\xf9\xd7\xa4|\xf7\xc6\x9c\
-\xab\xe2\xd9\x81v\x91\xc3z\xddg\x00\x04\xa3\xc2\xfb\xa4\x18\x89#\x1b\x06\xde\
-\x02Y\xf3=g\x82H\xc0\x16\xa3n\x18Y\xee\x90\xb2i\xa7)t\xedW\x001\xfc\x02[\xec\
-F\x85\x1d\xe5\xc2\xe4\x99\xd7pX\xa4x\xe2\x94\x8f\xb51\x18\xb4\x1cs\x88\x02\
-\xe8\xc1\x96\x0b)\xe5Cc\xcb\xe1\xc8\xccml\xa0\x9dX\xb6\x81+"t\xf0\xa5\xc2\
-\xe2#\x06-\xaa\x00-\xf2\xcd\xfa\xaf\xb6\x9c\x06$X\xd2e\x05\x92E\x91\x9br\x98\
-q\xe6\x16\x8b\x8f\x02\x8e\xbd~\xaf\x10Wg\xb7\xed\xa3\x83H\xb3\x8d\x83\xef\t\
-\x11\x9a"\xb3\x91\xfb\x87}\xb0\x05$\x8c\x0f\xa3\xb9\xef#\xf6\x1a3\xc4j2A\x9c\
-p\x8a\xd0b\n\x85$K\x90\x88\xc3\x86\xc4]\xea\x00\xec3\x81\x8b\xf1\x13e\x90q\
-\xebB\x1a\n]v\x9a\xb8|gu\x0f\x9bPh[\xc0\xd1\xcf\x9e\x80c\xb7\xc5\xfc\xc0\xfd\
-\xca\x15\x15\xd2\xc1\x83\xcaR\xd1Z\xf7\xebB\xe7\xbe.\x9f\xc0-_E>A\x0bf\x89\
-\xb1\x81,\xa4\xb7\xe4+8\xf8\\SV\x00\x955\x1b\x07\xb10\xae\xe4\x13\xc4\xb1\
-\x1f\x1a\x1c\xcc\x03\x04\xdb\x16\x19\x92\xc8\x01\x99{\x8d\xcf(`\x8bW;\xccST|\
-\xb5$\x0b\x89\xc9-\xd2\xe8\'\xe3\x14,|\x88\x80u\xe2\x88\x95\xc6\x08\xb31\xdc\
-\xe9\xa9#\xdb\xa0\'\x16\x1c`\xae\x18x\xd0J\x80\xec\x1a#i\x95\xa7\xca\x81Q\
-\xc5\xc7J\xce-dr\x82d@6nN\xff,!\x0b\xfb8\xf8\x1em\xd9(n\x0bN\xb1\xc5\xc6\xd8\
-b\x19\xe7\x0f\xe2\xcb\x81\x7f\xba\xb8V1@\xa8\xe472\xc8\xb8\x03 3,>\x92\n`{>\
-\xf2I\xc8F\xd1\xc7\x91\x1c\x07=\x11\xd2&,\xf2\t0\x02\xb6\x07$B\x86\x83o\x95\
-\xec\x86\xf1\x801h\xaf\x15\xb0N\xec\xeb\xdbV\x801\x9a0\xda\x85\x0c\x9at<\xec\
-SE\xcfB|\x9f\x01T\x8b\x14L\x11\x87\x07\x16\xeeu\x89 (_\xdb[f\xa8F\x06\xa8FK\
-\x97mP\x85\x1fJ\x06a\xad\x07\xb2\x82\x96\xf6i,_\xa1\x8a3h\xd2\x0e\xdbb\xef\
-\xc8e"4#\xa8\x1b6i\xe3=\x99\x08\xec\xd5\x01\xe6\xca\xc6\xc2\x8d\\\xd9(M\xc3\
-\x072\x13\xc6\xee\x10\\_1%?\x80Pe$\x93\x07{?\x9cU\x00v\xc2\xf8\x8f\t\xc3M\
-\x15\xf9\x04\xad\xa0\xd76.*\xf9\xb0\x1b\n\x1d(\x02No\xf1.\x84;\x9d\xd5\xd1^)\
-+h\x05\x9d(\xf2\x15$\x9e\x88\x01~\xe2\x94\x87\xbb\x94\xf4.\xcb\'8\xc5\xb6\
-\x12`\x04&\x80W*\x14\x14\xf6\'6v\xb6A\xb0\x824\x1b\xe3"\x8a\xeap \x04\x07\
-\xdfO\x97\x17.\xebRmd;\xc9\x01\xe5\xf1\x19R4A\xac\xe0\'\x87\xe3\xfa\xf0\xa1\
-\x18\x8c\xcaJq4\x06\x0c\xb2\x91i\xbeb\x827\xf8}(W6\xdcr\x83\x1c\xe6\xec\x1bA\
-\xab\x1d\xaf\x0f/\xbe\xd1\x014\x81\x1d\x88k6\xc9\x8f\xba\x90\x0cb,>\xbb\xb2~\
-\xe8L>Gh\x12\x92tE\x0f\xe6\xec\x11g\x08q\x00\x04\xfdc \xee\xe1\x81\xc9\xc7\
-\x96l\x83\x9e8/\x99\x16\xac1\x97T\xc9&\xc2M\xc7I\x0ci\x99C\xfd\xda\x03\xd4K(\
-y\xb8\x06=c!Ux\x86l\x94v\xf6{S\xbeB\xcbr7A\xc4\xbb\x8f\xdb>O\xb3\'h\x9d\xbe\
-\xb5!\xd8\xfap\x99h\x81l\x14^|\x8a\xf2\x0c\xc6\x8cs\xccu\xc9Sd\x91\x00\\\xbd\
-\x18\xe38\xf9\xc6\xb1\x13\xce\x88\xd1I\x90^\xab\x0f\x98\xe7\x01+\x8a|6\xdc\
-\xabd\xad\xf5\x0b\xac1\xa5\r\x9cA\x1f\xcaD\xd0\x01b\xc6\x02\xb5\x1f8\xa7J\
-\x1f\x87\xc5wx\xbf\x86|\xb7\xa9\xad\x00\xf8X@\xfb\xcc\x19R4\x81\xfe\xb15B\
-\x1a\x16NH\xd6W\xe5+\xc4\xa0?\x0c\x80\xe0\xeb\xc7\xa7|\xa7\xa8\x87E\xd7bD\
-\x15\xbbK\xd78\xa5\x0c\'\x13\xebq>%\xbe\x94\x97"\xc0-3b< -\xcdp\x00\xdda~\
-\xf6\nUh|\xc3\xdf\x82\xed\xf13\x06\xde\x81\x95\xcd?!\x8cw\xc6\x19t*\x9c\xa6\
-\xec\x0b\x9e\xf2\xed|\x0f\xdes\x83n\xa6\xf8\xc3\x1c\x8e\xaa[(\x02\x16\xa7\
-\x93J\x1c\x08\x94\x02"gJ!_Kf\x91x\xc2\x19%\x14C8w\x14\xa0\x198k\xc2g\xbe\xd1\
-\xee`\xe1\xda0\xbddZ\x89\xb6-\x1b\x85\xdb\xb6\x02\x8a\x80\xef\x01\x7f4\x00mb\
-\xd0\x91n\xb1\xd4\xa6C\xeb\x9f9]V\xd05\xb5_\xae|\x05\x0b\x97\xe6\xa5\xf0}\
-\xdc)\xfaY\x01c4\x01q%4i\xd1-b\'\x9cq\xc9\x83\x16<\x84&\x9d\xb9\x8c\xc7\x8d\
-\x801J\xe1\x93\xbe\t\x10{e\x90\xde\'\x0b\xfb\x85\xa3+\xa3\x12>\xfa\x0c\x0c\
-\xfaQ\x01\xb9\xe3a\xab\x97\x80h\xd6\xce\x1cZ\x1f\x1a\xd4\xc0\x0c\'\xd0#\x07S\
-\xfaX0y({\x81\xbd\xaf\xe2\xbc\xcdp\xaa/pr\xb5\x0c7\xfd\xbes(>E\x08\xeb\xb7\r\
-\xa8\xb9\xe5\xd2\xde\x7f\x9b\xca\x91\x12\x0b\x15\xdab\xde\x90o\xa6\x1c\xb4\
-\xe5\xd0\x11\xae5\xe5+\xc4\xe4\x1f\xb1|\x027\x97fO\x0ch\xa2pf\x8f\xf9\xcc\
-\x8eG\xfc\n\xe6e#\x94\x15\xb8\xe9\xa7!\xbb\x87\x8d\r\x14xH\x9f4\x86\x0f\xe5R\
-\xe7i\x00B\xf5\xde\x91\x93\x8d3\x1b\xb4\xb8)\xce\xa8y\x9db\x8d\xbe\x8d\r\xf4\
-@\x1a\x8a%\x94M\xa4\x91\xe4|J}($;#\xc4\x80{\x8c.\xb5\xb0+\'\xd0a.m\xec\xca\
-\x14\x1c\xdb\xafd\x1b\xc4\xa0\xcft\x00\x8f\xf3\xb1\x87e\xa9!(<D\xd0\xef3\xef\
-\xdb!\xf6\xad\xeb\xc8^\xe0\r\x9c5J\x9bp\x89\x8e5k\xc0\x16\xdf\xc0\x00`\x88\
-\xf3\xa0\xbd\xb3\x80\xfdr\xb1\xb4;\n\x0e\x0b^t\xfb\x86l\x94\x16\xdd\x83+\xbb\
-\xc5mAN\xc3\xe2s\x10\x94s\xbb8l\xab\xb7\x91m\xad\x80\xe6\xf8\x82\\72\xe1\xc3\
-N@\xb7l\xc4\x11EO|\'Y\xe8\x16\xec"\x189\x00P1\x8a\xa0\x9cuK\\Oh\xe8\xc2\xae\
-\xc6}\xd3%\x00\xc93>\xd53\x086\x97\xfdt\xddP\xf2\x838vAk=+x\x05]\xcb\x91\xb2\
-}\x8b\xec/\x1e\xebA\x07\x0e$\xdd\x00\xfbv\xaa\x02\r5\x81\xf9vE\xf1\x97L\xecA\
-\xa2e3\xe0\xa1\xf3\xf5\xc1X6\x8a\xab\xa1p\xdd\xf4\xd9\x16{a\xacB\n\x0c\xfcH\
-\xe7W\xe0a=1\xb1\x91\xf9\xa6\x9f\xd5\xe1\x15\x045\xf0\xa3\xcb\xfb\x05\x91"\
-\xdf\x83\ng\x03\x84\xf5\xd8A\xd0\x8f\xb37\\\xc4@2q\xf6\x06\x17Y\x9b\n\x0e/|\
-\xabd\xb7\xb4\xc5n\x18\rU\x002\x92\xb2Ym\xc3\x16{\x9b5\nS\x83\xb3\x02r\x06\
-\x88\xd8\xe2\x03\x07\xbdx\xb3n\x89\xa7\xe7\x9c\xe4\xcd\xc5\x92\xda\xd1qXp~\
-\x87\xf5Y\x1bp\xfc{\xe4\x81\xaf\x0b\xed(\x13\xc1\xe9>\\Ho\x01+$p\xfdf\xa1\
-\x1c)\xe6\xc5\x91\xbd\xd0\xae\xbc*\x11\xd2\xe3\xc4h\xaf|x2\xf0`\xdb\x04n+\
-\x87\x8f\xeds\xc9\xdd\x02\xec\xf3\xd1\x92\xe4#m\x91\x03\xe18\x81\xa4\xf3\xc9\
-U1\xcc\xc6pU\xb4g\xdd"WV%\x1b\x05\xa49\x92s\x8b\x99\xd3\x90u%\x87^xc\xc9\x99\
-C\x88\xd3\x92\xaf \xc3\xa1){!\x16\xfe\xe4\xd8+gM\xf8\xa3\xcb6ps\xda\xc3-\xce\
-!4\xfa\xc1l\xa4\xc4\xe4k\x85L\r\xbf\xef\xa2B\x05~,\x87n\xf9\xd9\x95mP\xc5:y\
-\xbf\xea\xdb\xd8\xf0}r8\x9f\xb5\xadKz\xc5\xeeO\xa0mM\xa7\x80\xd0\xf8X\xfc\
-\x01\x9c\xd49\xa7;\xfd\xa9\xc26eL\xef\xd4D^\'\x1bG\xe3\x0e\xe3\xa5\n\xa8\xc5\
-{\x0cJ\xb3\xb1\xe8\xfe\x98\xb2\x17\\#\x98"\xe3\x92\x8b\xd8|\x1f\x9e\xef1\xfb\
-`+\x05AaN <dH3cz\xbf2\xc6\x88\x9d\x7f\xbf\x18\xa8\xc3\x98\xef3\x07\xa6F\x01\
-\xeb\xe4\x9d\x1c\x07\x16L\x90 \xaf\x13_0\\\x0ee\xa3T\xe1V\x08\xa4Z\xd0a\xfa\
-\x1d\xd9\x0bU\xfc\x01\xd4\xab\x18\x00\x0e\xf4\x05\xb2\xd0c\x05m7\x94\xddBa\
-\x85\xf2\xed\r\xa0|G\x94\xb3K\xact\xdc\x07\xb2T\xc4\xa29xp`\x01V\xc0\xc9\xd5\
-Vq\xf7m\xd8\xe7\xadnB(\rp\xde\xbe\xb4ax\x0f\xb0`R\x06/p\xf6\xdb\xcf\x90\xb89\
-\xc7oo]9R@\xf0*\xdc\xf0w`\xae<B\xff\xb0\xf8\xb0\xb8\xa2\xd8\xeb\xa4\xc7\xd0\
-\xd9M\xdc\x8cu\xf9\xd2\xd5\x8a\xce\xeb\x03\xa7\xe9>\xe3\x838G\xc4\xdeH\x0e\
-\x1d\x80\xc3@>\x81$\x1a\xb1\xac\xc0\x8e\x8a\x81\xba\xe1\xc3b7\x06`\xc8\xe7d@\
-6;\x11P\xf1\xd7EV\x9e\x02i\xadL\x13X\'\x8ei\xdd\x92f`\x89S\r1`N\x91a#\x00\
-\xb1@\xd7\xe5\xc4\xf6\x81,|\x1c\xc9q\x10\xc7\xc2.\xddM\x18\xf2\x813\x01\xc7\
-\\\x8e\xe0\x9dP@\xb7W\x17\x1aX\xc0\xe4#"\x113\x8a \x83\xe8\xbbd\xd4\xef\x00\
-\xbb\xb2\xd2\xe5+\xc8\xdd\x11\xcaq\xc0I]\x01\xa74\xe4\x14\xf6\x14\xf3\x9c\
-\xf4=\xf8\xc7\xd6\x03\xf9\nM\xd4\xeb\x14\xf7\n\xf8.\xe0_]>\x01\xf1i"\xde`\
-\xc1\x97\xf3\xdb\x90\xbd`\xab3\xcc\x93\xf5\xc2+S\xd2B<\xb5K\xd9\x06\xb10P\
-\x10\xb1\xeaa\xe1v\x19\xeb\xc4Y$\x0c\xbeE\x91c^\xfa\x0c\xa0\xe2\x1b\x87\xab#\
-9\x0e\xe0.p\xd1@\xe6ts\x19\xeb\xc4)\xdc\x8e\xe0\xcc\x98\xb0\x96S1^\x8a\xb3j|\
-e\xe0\x12#3\xde\x14I\x0b1yY\xaa\x1bp\x96\x7f\x02xR"\xed\x8f5I\x1cU\xfc4\xe4+\
-TQ2\x92)\xc7\x19\x15R:\xcb\xacN\x00K\xdd"\xa5\x8c\xd0\xd7a\xf1!|\xed\xe58\
-\x81\xdeE\xb2Q\xaa\xf8\x1bK~P\x859\x02D\x82#E\xe3\x98\x0fOT\x0c\x1c\xf9\nU8\
-\x8c\xb9\xb2a\x12o\xce^\xa1\n\x7f\xf6\x04\xae\x99\xa8dz\x15.\xd4\xf3\x88SA\
-\xb1\x8d\xec\xa1b\xc8\xb7\x16\x07\x01\x0f\x1db<\xa1};\xf6\xf8\x1eN\xce0\x0bv\
-\xfd.\x8c\xe4+T\xb1\x1aS\xc6\x03\x99(n\x9e\x81\\\x13\xcc\xcb\x1d9U\xec\x9c\
-\x81\xf5=J\xf6"\x8e_\xa4o<\xd7d/\xd8/\x15D0\xdf\xf6\xf9I\\\x1f\x16\x13\xe4\
-\x97z+\xc9(\x12F\x00-~\x87!V\x16X\xb8\x87k\xe1\x03\xbe\x16nvd\xa3Tq\x1c2\x0b\
-\xe1\xc9{h\x03w\xc1\t\xda\xf6d\x05\x0c<#\x90#%\x06uH\xed)\xbc\xdc&jKG>\x01\
-\xfcX$\xbb\xc5%E\x8a\x9a\x17\xde\x10\xd9oG|f\xb3n\xb9\xde\x01\xb6\x87o`\xfeh\
-\xe1\xb0\xe0\xfb\x95\xb7|"O8\xbbz\x05\xecF\x0f\xd8\x8d\x0e\x94\xbc\t\x1b\xab\
-\x17\x1a"xC\xd0\xd2\xf2\x00\xf6\x19 \x13\xd6\x95\xec\x05sk\xc6\xf2\x15\xaap\
-\x0cY\x81hS\x08\x08\rG\xbc\xff\x92;\xdd\x16:?\x8c\x91Y\xa3@C\x99\xd8\x95.\
-\xf8qJ\x17/\xc6\xd2m{\x1fAJyP\x14\x0fc\x00\xa88\xd3\xa2c\xcaq\xd0\xecW\xa5l\
-\x14\xd1Y\x15\x18\x81\x0c\x87\xf8\x83\xc5\xd3\x00i\xb9\xc3\xa9mX\xb5\xfe\xc8\
-`\x8e\x1e\xa4eQ\xc9^0\r*d\x10\'\x00\xbd\x05rx\xe0cW~\xd6\xe5\xcc\x01\xf3\r\
-\xaf\x93\xb0\x82\xf0\x01\x83@6J\x15{\xa1|\x85\xa6\xf2q6\x0e\x9a\x17%\xe1n1s\
-\xc7\xb3F\xe9\t\x97S\x0eqJ\xaa%\x84\x9e\xa5F\x7f;{\x05\x190)\xc4)\xa44\x14\
-\x81S\x95\xf9\x01\xae[#9s@c\x93\x18w\xa5\xbe\xfe\xd6\xe2=\x07\xafd\xe9!5\x96\
-\x07\x85\xb5\x0f\xac\xa4\x846Et\xcee)_0<m\xb3-\x86\x89*\xc8\xad\xef\x8d\'c\
-\xe4\xc9\xd3\x90i1u\x10\x7f!u\xc3\x9d%\x15\x81`\xf3db\xe76\x96v\x0e~\xd8\x0c\
-\xd3\xf2\xe0\x88\xe8\x84\xbc`Pa\x93P\x9a\xe4>\xc0\x1cA {!\x8eM9|\xcdF\xd1J\
-\x04D\x04{zKF\x87qX\xf0\xd0\x91\xbdd\xe4S\xc2\xf92\x18\xa6n\xe3S\xd2\x80\xe8\
-\xf6} \x11\x0eY\xfdJ\x11\xb1:d\r\x96\xef\xbf\x1ci@\xc93\x00\xd3`\xe8\nk9/\
-\x0e\xc4\x16\xc7\xf8F\xfc}\x0f\x07^\x96\'rc\x0b\x11\r\xa0\xdf\xcf\x00\'P\x81\
-H\x80\xcf\xb8-V\xcf\x8fU\xd9\x06\xed\xec\xcfp\xfe\x8d9k\xc2\xbe\x14J\xf0LD\
-\x9c\xb4\x8a\xbf\xed\xa32\x90\x8b\x93!op21v\x1f\x1f\xc5\xf2\x15z\xe2\xb0\x03\
-\xac\x02g\x08\x89*\xd9\x06\x04}W\xf2\x03\xeeA\r\xa1\xd6\x01\x0c\xbc#\xfe~\
-\x14\xeb\xebc\x06\xd9\xf0\x9d\x80\x97Y\xb7\xc8m\xab\x03\xfc\xc4\xd9,\x1e]\
-\xb9\xa4p\x83\x9b4\x83\xbe\xccC\xb2\xc2\x01]\x1f~\xdcA\x17`0\xbed\xf4c\xd6\
-\x060\x9bSlu\x17[\xfd\x02S\x99r\xf2\x9bcC\x92OO\x9c\xc0\x03\xdf\xef\xfb\xf4\
-\x84\xd5\xc2\x89<\x9e\xe0\xab\x08S\xe4v\xe9\x01\x12pk\xf3\x06B\xe4l\x93n-6f4\
-\xbd\xc2\x89\xc0\x18\xb3y\xed"\x04\xce\xd7K\'%\xb0,\xbd\x14nl9\xd9\xbc\x92\
-\xf9\xe2\'\x7f\xa5\xea\xba-\x89\x03\x83:\x88\x9c9\x10\xc1\xcf!\x94+v\x98e-\
-\xd9-\x04l)\xdb\xa0\x8a+\x83\xaed\xd6\x85\xe6\xa5++\x90J?\x96\xaf\x10\x9379K\
-Q\n;\xca\xd0\xf8\t\xc8\xd3;\r\x1f\xa5\xca .\xcc\x16/\x871\xbeE\xd1Ez\x9c\xc2\
-\xb1\x1aj\xf7#\x9c/\x9c\x16\xaf\x17K\x16\xe2\xfe\xcbH>A\\w\x03@\x8a\x1c\x9c\
-\x95K\x81|\x05h}\x03"\x98S\x1e\x8eg\xaf\xd0\xbc\xac\xc4@\xba\xb9\xfcm0\x0f9D\
-\xf8+\x11\xeb\xb6|\x02\xa9\x9f+\xb9\x1cp\xcd\x95Az\x8c.=\x00\x88"\xe7+\x00I\
-\x85\xfcAl&\x1c\xda\x92|b\xb2\xcf\t\x85\xd8g\xf0\x17\x0bW\xde\x8c\xbd\xc4U\
-\xd9:\x8aAG\x01\xef\xb9\x0c\xca\xc4\x9a\xc1\x03\x83\xaa\xf0\x89O1\x1f\x97\
-\x15~\x9a\xc0\x18\xf5a\x9b&\x9e|\x05\xe9\x1cB\xd9(\x8c\xf7\x08\xc9M86\xbf\
-\x1c\xc8\'`\x03\x85</\xf0\x8fe\x18\xba\xcdf\xb5\xce\xb05\xfe\xa4\xd0\x05#C\
-\x19\xf6\xaa&\xf2\t\x1az\x8b\xbf\r\xe6#\xba\xb2\xd3\x95\x15p\xb9\xf2\x07\xa5\
-<\x867\x8cp6\x0c0Q7dG\xf9\xfd\t\xae\xfeY\x16\x8bq<\x113J\xcdE\xd0/\x98U\xd0D\
-](,\xfa PJ\x13;\x8a\x9d*\x8a\xc3!,D\xcdO]\xc0\xd6|\xc4<#\x86\x9c\xf1\xb7\x8e\
-68\xf1\x95\x8b\x94\xfe1E\x02\xd2\xc2G\x90\xfc/\xc3\xa3&8\xd5\xbf\xf1\x87\xad\
-8\xa9\xc82\xe5\xdd\x18\xd7\x854\xb6\x04\xa1x\x0fw\xdf\xf6:\xc0L\x0c\xb1o\x87\
-\x01\xc4\x85\x0f\xa5\xf7\xba\x8b]9\x81O\xe9\x90s\x88\xc8d\xc8\xae\xec\x16\
-\xa8NF\xa9\xb1J{\xc1\x9f\xbeb\x95\xd6\xc0\xb1V\x17jT\xe7n\xf1\xca^%\x89C\xe4\
-,\x91\xaf\xe0$\x8cd\xa3\x88Y\xb4\xb1\x81X\x83\r\r\xf9\x04Ul9\x88\xcd\xf3G\
-\xfe\x169y\x96\xdd\xc7\xfd\x06\xba4!\xc4+\x0c\xefXA\x80\xdb\x87O\xe9\xc4\x92\
-\xbdP\xc5\x84Sc\xf1W"\xd2\x11fn\x00#\xd1\r\x81\xbaae\xf3\x8a\xf3L\xb0\xb2\
-\xd9\xa3\x1b\xfe\x13\xb1\x07\xa9b\xc2\x8b\x9f\xad\xc6G\x03P\rN\x08\xe2\x04\
-\x88\xe0\xb9p\x88x\x01w\x0beb\x97|l\xc3\xcc\x81\t\x98\x92\x8bq<\xc9\xa1J^sZM\
-\x96c\xc7th\x15u\x86mZ\x0e\xb3ni\xef\xabd\x13\n\xa9\r\xbd\xf0n\x84x\x83\x0f\
-\xb7\xed=\xee{\x14\xec\xe8^eE\x91\xc5\xd6W\x05\x92\x7f\x82\xfcR]\xfe\x90\xe4\
-\xd8\xa7\x8a\xdfm\x84J\x06\xfc\xd5\x0c\x03\xd1j\x06\x83u:\x80\xe1p\x9a\r\xd7\
-\x92#\x85\x07\xcd\x813\x83\xb7z\xca\x1f\x81d\xc7\xbf\x19\xcaW\xa8\xa2\xdb\
-\x01\xb2\x8bs\xee\xa8#\xd9-\x0e>\x0b[\x9d\x93w\xb6\xa7\x80H\xf0\x87\xbe\xbe#\
-\x83n\xc1\x8e\xaaa\x1bP/\xce\xaaq\xc9\xb7k\xf9\x16\xf8\x11\'\xae) \x93U[\xbe\
-BO\x84#\xa4\xd7b\xf0\xe4\x91%\xbb\xa5\x8ao\xf0\xb0\n\xbd\x10\xf7=X1\x9a@S\
-\x1az\xb2\r8\x10\x19c\xd4\xc7T\xaek\xf2\x15\xa4\xb5\xe2\x8ftq\x9e\xde\xf3\
-\x18+\xd9\xc7J>%X\xa3\x9f\x8f1\x95\x8f\x08P9\x8c\xe7\x1fp\xe2+\x17\xcb\xf2\
-\x8e1W\x9cw\xc3\xe7\xef\xcf\xf9\xe0\xd8\x1ag\xb2\xb1\xe0\xcc\x08\xf8\xebr)\
-\xdf\xf5\xe2\r\xe4B:\xec\x84\xb2\r\xa4\x1a\xb4e\x05\xc0\x82\x0c*\xf1`\xef/\
-\x84\xc8\xa7\xc4\xaaS\xe0\xcanqI\x00\x11+a#\xc3\xa1\xca`0\x07\x07\xdfwS\x0e\
-\x0c\xb9\x18K90b\xe1w\xba\xb8U\x14\x19\xe4\xc7\x99J(\xa4\x82\xb37\x0c+\xd9\
-\x06t)U\xbeB\x15\xc7\xb3q c,\xe3Os\x88\xf1{\xce\x7f*qJ\x0cm\xe2 \xf9]\x87\
-\xe7\x16\xb6\xe9\x16\x89-\xdb/p\x91\xbe\x17\x01:\xcbhJ\x93?\xc1\xc5\xceP\x9f\
-3a\r\xa0\x9f\xde1\xd4\x8bS\xa7\x8d9O\x8d\x0f&?\x94r\x1cD\xfe!\xc3\x92\xf8\
-\x1a\xe3\x0f\xe4b\xcc{\x90\x96\x9b\x0e\x00\xbac\xa8\n\xc7\x11\xbf\x02ZnB\xec\
-\xec!t\xcbkS>\x81K\x02$r\x062\xfb\\\xa0\x01\xda\xc4\x17\x0c\x1f\xe0\x92w}XZ\
-\xde\x149\xaal\xe8\x0e\x15_\xfa\xe6\xef\xf2l\xc8\xa1s\xfeS\xc4\xe7\x8a!\x14\
-\xc5!\xbc\xb4>\x7f\x97\xe7]\x02\x9c\x92\x8f\x15tJ\xc1\x94"\xe5t\xeb[\xb3^\
-\x90\x10$\x01\x021C\xb4\xfa\x8e\xbf\xda\xc5\xde/\x85q\x17\x9c\x1e\xf8\xd5f&\
-\xc3\x9d\xbeM\x17\xd9\xeaT\xaepUD@2\xf17\xa8n\r\xd9(\xe2\xd9\x1cju`Ff\x90\
-\xc9B\xc6\x00\xf9\xe7J\xf2\xa9\xc2s!\x83|l\xc2e\x92\xb8\xae/o\x84\x10D\xc2\
-\x1f\xa76\xbefB\xf2c\x92\xf27\xdb\x9el\x80\'\xc70#\xd7\xf9K$}H\xdc\x8f1\xae\
-\x00\x14\x80F\x9e\'|ha}|\xe3\x0c2Ch(#\x05_d\xe3\xef7|\xc0\xd7\xf62\x1b\x15\
-\xdf\x03\xd9\x0bU\x04:\xf7\x02c\xe4\xd6\x92\x1c\x83\x91\xa8\xcbW\xe0\x99\xe0\
-O-x\x88\x9aor:\xa9\t\xb4\x8bU:\tE\x0b\xf0\xa0e\xa4(\xda\xf9\x10\xba\xf6F$i\
-\xa1\'~0\xaa\x82\xbf\x91\xda\xb5y\x1apD\x8fg\xbd\x10\x93\x87\xb3^\xa8\xc2\
-\xeeP$\xc0\xe2\x94T\xdf\x19v\x92#\x14\xbf\x81+\xcc\x13\x0e`>C\xed\x19\x0cag;\
-\x1a\xa0\t\xf8r\xf1\x9cgI\x16\xc2jtd\xa3\xc8\xab\xe0\xc8\'\x90\xde\x13\xdf\
-\x06\x93\xe9\xe8N4|\xee\x85\x13\x82lq\xd2*\xbe,\xe9\x97@e\xf1W\xa9w\xa0\x07\
-\t\xcd\x19\x15\x11\x90\x19\xecP\xfdR\xca\n\xdc\'T\xf0\x05\xb2\x1c;\xfbP\x03\
-\xb2k\x00\'\xd3q\x80\x8fA\x15\x98\xca\xa5\xa9\x1c\x07M\xe5\n\xe3\xd88e\xc8\
-\x86&i\xc1\x9d\xf7H\x8e\x94^\xd9S%\xc7 >9W\x96\xc7\x1f<\xe5\x1b\x10|\x85h\
-\xe0\xca^`W\x9a\xb2\x17@\x12\xbbr`\x98JW\xd2\x82\xa9\x9c\xbd\x82KW\n3\x19\
-\x88\x99\xf36"\x016|[\x9fY\xe4\xb8\x109\xd3\x11\xbe\r\xc6\xc1\xfa\xb6\'{\x81\
-1\xc2\xb9\x7fl\xe4\xbb0a\xbeel\x9cm\xa3\xc2\xe1\x13\xe8\xa4\x8d\xa4\x11\x05t\
-\xba\xbd\x08\x10\t\xfe"\xec3I\\\xb7\x9f\xe2\x93\xa8\xf3\n>\xc3\xc3\x1c\xfb\
-\xa5\x01f\xd1\xc3nx\xe7 \xe7\x8e\x83\xfd\xf2JY\xce\x8a\xdc\x01\xa8$\xc4\xc7\
-\x8ee\x1e\x92{\x1d\xdfL\xe1KW\xd7|\x8a\xf1\xa5\x9a\xc0\x04~\x8c\xf3n\\\x91Sv\
-8p=h\x9f\xc8\x05-\x0cmZ0\x87#90\xaaX`Cb\x0c\xc3\xfb+\x9f/\x13\xcc\xedgG\xbe\
-\x02\xae\xbb\xb2[|\xc8iV\x81K\xdf\xfc\x91.\xce\x15\xaeG\x00\x94Y\x10\xf4\x1e\
-\xac\xd7\x94\xb34\xc7|\xc3\x9fCG\xdft|\xe2\x91\xf3\xe4\xad\xb4\x01\xf6\xe1\
-\xcfx-G\x08\x1d\xf1e\xeb\xd56v\x14\xc7\x81\x02d\x03.2\x9cs\xcb\x16t\x07\x06\
-\x93\x1eqJ\x19\xfe\xde\xbc?E\x16+\xfe\x08\xb5\xaf\x02\xfb\xe5\xc2O\xb7\xab\
-\xc9^\xa8\xa2\xe4\x0f}q\x02\x0c/\xc2\xa7\xaf\xf82\xcb\x9a\x06 \xd7\x04G\xa36\
-{\x85*>X\x92AH\xceh\xcb^\x90\x12\x93\xb1_lXm\x86\xf2\tZ\xa7\xfb\t\xf7\x82\
-\xeb\xc7\xab\x81|\x82X\x98\xe9\xb2\x17\x04\xa7\x19T\xc2\xea\xe8\xda\xacQ\\\
-\x12\xe0\xd46\xac\x9f\x9e\x93\xd4\xcesN\r>"I\xe7\xa4\xac\xc0_r\xf6\x97\x14+y\
-\xd9\x04\x10\xa3\x07\xddA)e\xb7\x08\n\xf3\x97\xbf,\xa0L\xee8\xabW\x8e`\xdb\
-\x11\x7f\xd7\x8bs\xcb\x1dv\x91\xb7\xa7\x0f!m\xcf\x9e \x9e&\xb3q\x10\x83\xa6\
-\x0cJ\x9b@H;0\xcd\xfb>\xacy\x95?~\xe4\xe0\xf3j\xf31\x80m\xfc\x85\xcb\xef\xb1\
-\x1c\x18"#\x0c\xaeeO\xde\x1ao1\x97Y\x18\xcanq\xcb\xd7e\t\x03\r\xe5\x83\x8a\
-\x1c\x11|w\xe5\xa2B8\x9f\xe3Q]\\U\xc93\x08\xb6\x92\x13\xc6\xb0\xc7\xf9%\x80\
-\x94\x1asbV\x0bj\x0f\x87\x8d/\x13 \x11X\xa5u\xf9B\x7f\x0ffSB\x87E:\xcc\x90\
-\x1a\xbc\xcd\t\xc92\xe0P\xc6\xbc\xb3\x07\xd8\xd9\xebtug\x92\x17\x88\x14\xbd\
-\xd3\xf0\xbdW\x8e\x89?\x90\xa5e\xd7_~#\xef\x17!v\xc5\x89\x03\xcf\xd5:b\xaf\
-\x13\x1f^\xdaE\x1d\xe08\x8b\xbf\x0c\x87\xd8k>\x81\xa7w\xdaA\x00\xa2\x0f{N\
-\xef\x00\x95\xc5\x9f\xf2Y!\xaf\xf5`\xd2\xb3\xa1k[L>d\x90\x95\xf0+\x9c\x81\
-\x8a\xbft\xc5\xba\xe5"2\x82f94\xa5\x82\xf1\x0e}\x80\'\x9d\x11@\x14>\x0e\xcf>\
-\xc4x\xd6\xc3\xc1\xd7\xe7\xefGqF\xe1\x1b\xec}\xa1n`{\xb4\x00\xd3r8\xf3\xf5\
-\xec\x95q\xe3>\xdeb\xf0\x82\xcf9fX\x85\xe3DO\x87\x9c\xb5IB\xac8\xa7\x1b\xdfW\
-/9I\xd3\x00\x87\x85m\xc8\n\x18\x12\x0c\xa0\xe2\xcb\x1bC2FR\x99\xab\xe2\xa6\
-\x94\xaf\xe0f[\x8b\xe7\x05:\xddE\x08\xf7 W|\xb1\x99\xa7\x9c\xbe\xa0\x92m \
-\x7fr\x1b\xdb\x94s0\xff\xd4%\x83\x10\t\xb0`\x9cqLK\rd\x1bP\xe1B\xf9\n\xa2\
-\xb3$\xd8\xc6\x05\x7fu\xf8\xa0+{\xa1\xf5\xf1\xcb@r\x13\x06>~wd\x1bXA\xfc=\
-\xad\x0cm(\x95\xac\xc0\xb7\xb0\xbaH\xe3\xc4Z\xdfG\x05a\xe3\x14L^b\x10\x16K\
-\xed\x1b\xceB\xc3\xb78\xe7q\xde\xca\x14\x19\xef\x0390zBC\x8e\x19\xa9\xc2\xfd\
-\xe14,\xac\xe4-q\xec\xd5\x01\x93\r\x06aq\x92\xb7g|\x88\xd6\x1f\x00\x00\xb1\
-\x17\xc8q\x00\xe1\xce\x9f\xdf\xe3/\xc2\x9e\xcd\x9e ~\xa8- \xee8\xc9\xdb\x85\
-\x8a\xaf\xffx0g\x7f[r\x1c\xc8mK\xca\x9503\xb1\x82\x1c\xfe\x16\x16c\x9d\xecY\
-\xa3\xc8\xd9\x15!\xc0\xcd\xaa\xd3\x06\'z\x1a\xe2\xfb@\x8e\x05\xe1\xc8\xf6\
-\xfe\xc0\x92\x8d\xd2\x13\xbb\x8e\x1c\x07\x9e\x98\xb5\x81;4\xael\x03Y\x9a\xc9\
-\xb93(2\xa0\x90\xe69b\xc5Aa\x8faI\x9c\x9ab\xc9\x06\xcc\xb3\x00\xfc\xc5\xa1\r\
-d\x8d\xf9\xca\xff\to\xc2\x14:L\xc2\x90\x00\xa4\xa6\x98S;H[\xc4\xe18\x9d1\x13\
-\x9c\xc9w\xab\x92\xaf\xe0\xcb\x1bt\xc7\xca+\xf8s\x84\xe7\x1c|\xe4K\x8a\x97\
-\x9cn\x8c\x91]\x07\xf4\xa5\xbcl\xc2_/\xfd\xad\xb3\xd9\x04\xb5\xe7\x85\xaf\
-\xa7\xdb\xf0\x07=\xbb\x00\x93f\xb8\x0fdu\xe1\xe7\xe7\xed\xb1\xc8`\x9f\x02;\
-\xea@\xe5oa\xf1\xc7\x8fl90\x18\xab-\xb8\xb2\xf8K\x9b\x87\x15b\x16\x0e\'\x8aS\
-\xb8Q\x06\n\x1b\xb2\x02\x17\xd8\x9b\x91\xda\xcd\xffh^8\xc1\xd2\x04X\xb8\x0c)\
-\x87\xc6\x054\xd8\r\x06.\xb1\x1a\xa8k\xb2[\xdc:j\xe18I\x81"(Zr\xe8\xc8se\xca\
-W\xa09"]P]\xe84Md\x05\xf0A\xaa|\x05\tQg\xb4\xd0\x13\xde\xacQ\xa4\x81\x9b\x8d\
-\x838v+\x9f\x80@\x19"\x88\x91\xb3\xfd\x92\xd0\x17\xa5\xc5"\x03\xfcv\x14\xc8^\
-\xe0\xb6\xe5\x108;!\xdft\xdc\'t\xf8\xb3\x99\x16\x0e\x1cV\xf2:S\xe0r8\xb8\xf4\
-DBZ\xec0T<s~)\x86%\xa5\x9cA\x86\x95<_Ct\xc5\x03\xc7\xb4\x11\x84#\x7f`\xeb\
-\x05\xc1i\xa1o\x00\xbb\x01\xbf\x94\xc7;\xea\xbb\x01a\xc0\xba\x94\xa2c{\xf0\
-\xe5\xc0v +\xa8\x8d\xc0\xc1\xd2fg\xf9\x16\xebt\x19"#!\xeeW\xa6\x9c\xdd\xe3/>\
-Q?\xe0\xd3\xf4\xbd\x86\x18\x1fG\x8a\x9e8\xae\xee\xf1\x17\r8\x15T\x1f\xee\xe3\
-e2h\x069\xe3\xd8vfO\x00S\xd3\x02R%\xc7V\x9frN\x15F \x96]|q\xab\x8f\xb0\xe0\
-\x83!\x1b\xa5\x8a\t\xa7?\xe1\x14\xb2\xbf\x18d\xe3`\xad\xf7]$I`\xf1y\x11!\x8f\
-\xd1\x80?\x82` J\xcc\xdf\xb1z\x1d\xc96\xa0\xd1\xcf\x1a\x85inC\x81gH\xe2.K~\
-\xfe\x9c\xd83\x85l\xf2\xac\x00V\xa1\x9f 8\xedC=/;\x08\xa4\xf2%\xe7\xfd\x00\
-\x11M\x0f\x07\xce\x07\xfe\xe2\x16\x7f\r\xe9\x0c\x1ft\x90\xa9\xc2\xfe\x1a\xf8\
-~T\x0f_\xe9>\x89e\x1b\xa8p\x01)\xeaC\x81\xffH\x01\x99\xc9\x98\x9d]\xbbm\xe4\
-\x99(\x00oX\x9b\xe2\x83R\x8c\xb8\xeb;\xb2Q$\xcb\xe6\xccO\x03\x00\x97l|\xddE4\
-\x81/oP\xbaB[~z\xe2}\x02\xd4^\x8a\xf8\\\x9b?\xef\xca\x19\x0f\\:\x1a\xc5^\x00\
-`\xf9\x03c\xad3`i\xf7b\xf8.8\xbf\xf6YW\xb6\x81;g\xb8qXp\xe6Z\x87\xbf\x94\x97\
-\x81\xa7\xad\x96)J\xd9\xaaZ\xd3V\xb7\x95\x88?JKm\xb5\x9b\xa2\xb5:\xad\xa8e\
-\xb4F\xad\xa0\x15\xb7tQ\xc2\x96%\xfe;\x12\xc5n9-W\xfc\xf1Z\xfd\x96\xdf\x1a\
-\xb4\x86\xad^S|YnDyj\x1d\xb7n[\xf7\xa2\xfcn=\xb4\xceZ\xd7\xad\x83\xd6]\xeb\
-\xa8u\xd2:m\xfdl\xfdj\x9d\xb7.Z\x7fZ\xcfbL\x8f\xad\xc3\xd6\x95\xf8})\xfe^k}l\
-e\xad\x9dV\xde\xfa,\xfe\xdei\xa5\xad-Q\xb2V!J\xd6\x94\xfa\xdf\xban\xd2Zh-\
-\x8a\xb2\xdcj\xc8%RVZ\xab\x82\x98D\x10\xc2\xc4h\r)\xeb\x82\x90%A\x8a\x05bt\
-\xf1\xdbhm\x8b\xb2\xd7\xfa\xd4\xda\x14\x7f\xc6 \xa6\xf7\xff!f\x17\xc4\xd4e\
-\xa3\xf5\xae\xf5\xd6\xfa\xd6\x103\xdfz/\xc8\xf9 \x88\xf9\xde\xdao\xcd\xb5\
-\xbe\x8a\xbf\xbf\x08b\xfe\x08\xa2\xd6Z/\xad\xbf\xad\xd7\x86\xcfDL\xda\x10\
-\x93\x81\xa0B\x10\xfb\xb1\xf9\xd74K\xb32\xa7f\xd7\xfc\x872M\x94\xad\xc4TL\
-\xd5l\x9b\x9a\xd91#\xf1\xc70Gf Jl\xeaf(\x8ae\xda\xb28\xa6kz\xa2\xf4M\xdf\x1c\
-\x98C\xb3g\xde\x98O\xe6\xb1y+\xca\xb1yo\xfeFy0\xcfD\xb96\x0f\xcc;\xf3\xc8<1O\
-\xcd\x9f\xe6/\xf3\xdc\xbc0\xff\x98\xcf\xe6\x0f\xf3\xd1<4\xaf\xccKs\xcd\xfchf\
-\xe6\x8e\x99\x9b\x9f\xcd\xd4\xdc2\x0bsb.\x88R\x88\xdf\x8b\xa2,\xff\xaf\xb2b\
-\xae\x8a\xb2\xde\x94%s\xdb\xdc3?\x99\x9b\xe6\xd8lff\xa5\xb5\x0bR6\x04\x19\
-\xff&\xe6\x9d \xe5\xed\xbf\x88\xf9f\xce\x9b\xefE\xf9`~7\xf7\x05As\x82\x98\
-\xdf\r15)O\xe6W\x90B\xc4|1_\xcc\xbf\xe6\xab\x98|\xb3,\xcb\xaa\x9c\x96\xdd2)\
-\x95R-\xdb\xa5Vv\xca\xa84D\x19\x95A\x19\x97\xba\xf8;,\xad\xb2\x10\x84X\xe5\
-\x96 \xa6\xfe\xbd\x00"\xec\x92\x8a\x83\x7f\x89,\xb7\xf4\xca~\xb9i\xfa\xe5?L\
-\x0c\x912(7\xc4\xdf51\xc3\xb2W217\xa5\x03\x82\xa8x\xe6S9\x14320\x8f\xcb\xe3r\
- \x88\xe9\t\x02\x9e\x1aBj2\xbe6\xa5&\xe6\xb6\xbc/\x7f\x97\x0f\xe5Yy]\x1e\x94\
-w\xe5QyR\x9e\x96?\xcb_\xe5yyQ\xfe)\x9f\xcb\x1f\xe5cyX^\x95\x97\xe5Z\xf9\xb1\
-\xcc\xca\x1dQ\x82r\xcd\xcc\x05)\x9f\xcbz\x96\x16\xc4<M\xcc\x14d8\xe5V\xf3\
-\xb7\xd3\x90D\xc4\x14\xe5\xa4\xacg\xe6\x7f\x11S\x97\xf6\xbf\x88\xa1e\xb6P.\
-\x947(\xf5\xef\'A\xc0b\xb9\\\xae\x94\xab\xe2\xcfz\xb9Tn\x97\xf5R\xbb\x01\x19\
-u\xd9+kb>\x95\x9b\xe5\xb8\xdc-7\xcaw\xe5[\xf9\xad\x9c/\xdf\x97\x1f\xca\xef\
-\xe5~9W~-\xbf\x94/\xe5\xdf\xf2UH\x1e\xb3*\xab\xaa\x9aV5Y\xddj\xd4\x90S\x17"\
-\xa6\x9e\xa7\xa4bR\xb6J\x9e\xa3zf\xd6M\xa5r\x051j\xd5\xae\x1ab\xb4\xaaSE\x95\
-Q=5\x9c\xad\x17\xc9\xbd\xe0\xfe\xa8r\xc5\xde\xf8\xd6\x90R\x97\xa0\x8a+\xbd\
-\xaa\x17R\xcf\x0c+\xab\xb2+\xa7r+\xaf\xea\x8b_~5\xa8\x86\xa2\xcc\x99L\x14\
-\x11\xd3\x13\xff\xdfM\xf5T\x1dW\xb7\xe2\xd7}\xf5\xbbz\xa8\xce\xaa\xeb\xea\
-\xa0\xba\xab\x8e\xaa\x93\xea\xb4\xfaY\xfd\xaa\xce\xab\x8b\xeaO\xf5\\\xfd\xa8\
-\x1e\xab\xc3\xea\xaa\xba\xac\xd6\xaa\x8fb\x1f\x119VY\x97\x8f\x15\x93B\xc4\
-\xd0\xcc,7\xbb&\xabv\xaa\xbc\xfa\xcc\xc4\xa4\xd5VCLM\xca\x8d$\xa6.59E5\xa9\
-\x16\xca\xb8\xbam\xf6\xc3\x8d9\xac\x16\xaa\xd5\xd2\xae\x16\xab\xe5j\xa5Z\xad\
-\xd6\xc5@\x97\xaa\xed*l\xc8\xa9\x89\xd9\xab03\xe2\xff\xd9\xac\xc6\xd5n\xb5!~\
-\xbd\xab\xde\xaao\xd5|\xf5\xbe\xfaP}\xaf\xf6\xab\xb9\xeak\xf5\xa5z\xa9\xfeV\
-\xaf\xe2T0\xa7\xe5\xb4\x9aN\xa7\xddi2U\xa6\x99\x10\t\xba\xd8I\xc7\xa5:eb\xb6\
-P\xec\x86\xac\xf6\xb4=u\x049\xab\r1\xda\xb43%8_CL45\xa6\xa3\xe9\xbd $\x98\
-\xc6S}\x1aNG\xd57\xd3\x9a\xdaSg\xeaN\xbdi\x7f\xbaP\xfa\xd3\xc1t8\xedMo\xa6+\
-\r1O\xd3\xe3\xe9Bu;\x15\\\x9f\xfe\x9e>L\xcf\xa6\xd7\xd3\x83\xe9^u7=\x9a\x9eL\
-O\xa7?\xc5\xff\xf3kz>\xbd\x98\xfe\x99\xd6\xc4<O\x7f\x88\x7f\x1f\xa7\x87\xd3\
-\xab\xe9\xe5tm\xfaq\x9aMwDM>\xfd<M\xa7[\xd3b:\x99.L\x17\xa7\xcb\xd3\x95\xe9\
-\xeat}\x1a\x94yI\x82\xe0c\xc5\xdb\xdfn\xc8hO\xb7@\xd0\xd2t[\x94\xceto:7[f\
-\x9f\xa6\x9b\xd3\xf1twzln\x88\xe6E\xd7\xd3\xb7\xe9\xb7\xe9\xfc\xf4\xfd\xf4\
-\xc3\xf4\xbb\xa8\xd9\x9f\xceM\xbf\x8a\x7f\xbfL_\xa6\x7f%17\xd3Wq\xd2\xda\x95\
-\xd9\x15\x8b]\xfc;\xed\x1eL\xbb\xddD\xfcR\xbaj\xb7\xdd\xad\x89\xd1\xba\x9dn$\
-~\x19\xddQ7\xe8\xc6\xe2\x97\xde\r\xbbV\xd7\xee:\xe2\xb7\xdb\xf5\xba}\xf1\xaf\
-\xdf\x1dt\x87\xdd\x9e(7\xdd\xa7\xeeq\xd7\x17c\xb8\xed\x86e-\x06\xac2\xa9\xea\
-\x1dB\x85e\xdaV\xb9$Xy<\xbd\xef\xdew\x7fw\x1f\xba\xcd2;\xeb^w\x0f\xbaw\xdd#\
-\xd1\xe4I\xf7\xb4\xfb\xb3\xfb\xab{\xde\xbd\xe8\xfe\xe9>\x8b\x9a\x1f\xdd\xc7\
-\xeea\xf7J\xfc\xba\xec\xaeu?v\xb3\xeeN7\xef~\x16\xff\x9dv\xb7\xbaEw"~\x9dw\
-\x17\xba\x8b\xdde\xf1k\xa5\xbb\xda]\xef.\x89_\xdb\xdd\xbd\xee\xa7n\xbd\xcc6\
-\xbb\xe3\xeen\xb7f\xd0F\xf7]\xf7\xad\xfbM\xfc\x9e\xef\xbe\xef~\x10\xff~\xef\
-\xeew\xe7\xba_\xbb\xba \xe2K\xf7\xa5y\xeao\xf7U("fbW\x82\x86\x84\x89Y\x91g\
-\xcb\xba\xf8U\x93\xb4U.\x88\xa5}#\x08Z\x9aN\x93n\xf2\x0fi@I\xa2$j\xd2\x16\
-\xafkI\'\x89\x12#\x19%\xfdn\x90\xc4\xa2FO\xc2\xc4J\xecDo:r\x127\xf1\x92~\xf2\
-\xb9\xf9/\xc1\xcfd\x90\x0c\x93^r\x93<%\xc7\xc9mr\x9f\xfcN\x1e\x92\xb3\xe4:\
-\xd9\xef\x1e$wIM\xccQr\x92\x9c\x8a_?E\xdd\xaf\xe4<\xb9\x10\xbf\xff$\xcf\xc9\
-\x0f\xf1\xefcr\x98\\%\x97\xc9\x9a\xf8\xfd1\xc9\x92\xba\xcd\x9d$Ov\xca\xcf\
-\xe2w\x9al\tb\xd4i\x91L\x92\x05\xf1\xf6b\xb2\x9c,\x89-_\x93\xb3l\xd63S\x13s,\
-\xcaJ2M\xe6\xfe=3\xab\xc9z\xb2\x94l\x8bF\xf6\x92O\xf50\x92q\xb2\x9bl$\xef\
-\x92\xb7\xe4[2\xdft\xb4\xd0}\x9f|\x001\x8b\xd5\xbe\xe0\xeb\xf7d?\x99K\xbe&\
-\xeb\xddn\xf7\x8bx\xe6%\xf9+\xfe~\x15z\x91\xa9\x94JML\xa5L\x95\xaeR\xef\x99D\
-Q\x14Ui+\xf5\xbb\x9a\xd2\x11\xffF\x8a\xa1\x8c\x94@\x89\xc5o]\t\x95\xba\x0fK\
-\xb1\x15Gq\xc5oO\xe9+\xc7\xa5\xaf\x0cD\x196\x7f\x0f\x94\x9eR/5\x92h\xedf\x99\
-\xdd(7\xca\x93r\xac\xfcC_\x1b?\xeb\xde+\xf5\xdc\xfc\x16\r<\x88?g\xca\xb5\xf8\
-\xfbB\x0c\xf8@\xb9S\x8e\x94\x13\xe5T\xfc\xf7O\xf1\xe7\x97r\xae\xf4\x93\x0b\
-\x85\x88\xf9#\xfe\x9f\x0be\xbd[\x13RK\xb0\xe7f\x00?\x14\xbfzT\x0e\x95+\xe5\
-\xb2!fM\xf9\xa8d\r1;J\xae|V\xd2\x86\x98-\xa5\x10\xffN\x94\x05eQYVV\xc4\xefUe\
-\xbd!fI\xd9V\xda\xe5^\xd3\xd6\'eS\x19+\xbe\xb2\xabL\x92\r\xe5]C\xce\x86\xc2\
-\xc7f-\x02\x96\xa6\x89\xf9\xa6|S\xe6\x95ff\xde+\xb7\xca\x07\xa5\x9e\x9b\xef\
-\xa2\x81^w_\x99S\xbe*_\x94\x9e\x18\xf0\x8b\xf2WyK^E}K5\xd5R\xb5\xabJ\x9d\xaa\
-oI\xd5\x10\xd3U\x13UQ\x1bB\xaa\x07SU\xdb\xaa\xa6v\xd4^7R\ru\xa4\x06j,\x9e\
-\xd7\xd5P\xb5T[\xad\x89qTW\xf5\xd4\xbeZ\xbf\xeb\xab\x03\xf1\xefP\xed\xa97\
-\xea\x93x\xe7X\xbdU\xefU"\xe6\xb7\xfa\xa0\x9e\xa951\xd7\xea\x86r\xa0\x1e\xa8\
-w\xeaAS\x8e\xd4\x81r\xa2nI1]\x13s\xaa\xde\x08b~\xaa\x8d\x00\xf8\xa5\x121Jr\
-\xae^\x88&\xfe\xa8\xcf\xea\x0f\xf5Q\xad%\xd1\xa1z\xa5^\xaak\xeaG5Sw\xd4\\\
-\xfd,jSuK-\xc4\xbf\x13uA]TU\x9c*\xcb\xea\x8a\xba\xaa\xae\xd3p\xd4muO\xfd\xa4\
-n\xaa5C\xc6\xea\xae\xba\xa1\xd6\xe2\xfb\x9d\xfa\xa6~S\xe7\xc5\xef\xf7\xea\
-\x07\xf5\xbb\xba/~\xf5\xab9\xf1\xf7W\xf5\x8b\xfa\xa2\xfeU\xd7\xc4\xf3\xafBe_\
-\x16*\x89\x10\x00\xedkq\xb4\x1f\xa8\xd3v\xb7\xf9{\xda6\x041I\xfb\xdf\x82yI\
-\x9c6KS\xb1v\xdb\xf4\x91\xeev\xbb\xad\xb5;\xed\x1fj\xd46\xda\xa3v\xd0\x8e\
-\xdbz;l[m\xbb\xed\xb4\xdd\xb6\xd7\xee\xb7\xfd\xba\x99\xf6\xb0\xddk\xdf\xb4\
-\x97\x94\xa7\xf6q\xfb\xb6}\xdf\xfe\xdd~h/\xaa{\xa5(\xd5Y\xfb\xba}\xd0\xbe\
-\x13C8jo$\'\xed\xd3\xf6\xcf\xf6\xaf\xf6y\xfb\xa2\xfd\xa7\xfd\xdc\xfe\xd1~l\
-\x1f\xb6\xaf\xda\x97\xed\xb5\xf6\xc7v\xd6\xdei\xe7\xed\xcf\xed\xb4\xbd\xd5.\
-\xda\x93\xf6B{\xb1\xbd\xdc^i\xaf\xb6\xd7\xdbK\xed\xfd\xeev{\xaf\xfd\xa9\xbd\
-\xd9\x1e\xb7w\xdb\x93\xa4&c1\x99\x11\xb3\x9cl\xb4\xdf\xb5\xdf\xda\xdf\xc4\
-\x9fw\xed\r\xf1\xf7[{\xbe\xfd\xbe\xdd,\xb3\x0f \xa6&Go\x7fo\xef\xb7\xe7\xda\
-\x91\xf8\xfd\xb5\xfd\xa5\xfd\xd2\xfe\xdb~\x15\xa6\x8d\xa9\x95\x9a8f\xb5\xae\
-\x96h\x8a\xa6jmM\xd3:Z\xa4\x19\xdaH\xabI\t\xb4X\xd3\xb5P\xb3\xb4Z<\xdb\x9a\
-\xa3\xb9\x9a\xa7\xf55_\x1bhCQz\xda\x8d\xf6$~\x1fk\xb7\xda\xbd\xf6[{\xd0\xce\
-\xb4\xfb\xd6\xb5v\xa0\xddiG\xda\x89v\xaa\xfd\xd4~i\xe7\xda\x85\xf6G{\xd6Tu\
-\xaf=\xd2~h\x8f\xda\xa16n\x96\xd9\x95F\xcb\xecR\x1b(k\x9a\xa1\xd6\xe4\xbckH\
-\xd9h\x7f\xd4>j\x99\xb6\xa35\xcb\xecV\xb9\x16\x02\xe0\xa0{\xd0\xc845\xb9\x13\
-\x7f+\xc9A7\xd7>k\xa9\xb6\xa5\x15\xdaD[\xd0\x16\xb5emE[\xd5\xd6\xb5%m[\xdb\
-\xd3>i\x9b\xdaX\xdb\xd5\xf6\xda\x0f\xe6\x86\x16h\xef\xb47\xed\x9b\xd6\xeb\
-\xcek\xef\xb5\x0f\xdawm_\x9b\xd3\xbej_\xb4\x17\xed\xaf\xf6*JKX\x17e\xa7\xeaL\
-;\x9e\xda\xed$\x1d\xa5\xa3\n\xfei\x9d\x87\xaa\xd3\x89:Fg\xd4\t:qgU=\x103\xac\
-\xaaz\'\xec\xa8\xa6\xd5\xe9\xb6\xedNO\x0c\xdf\xe9\xecw\xdd\x8e\xdb!\x89\xb6\
-\xdf\xbd\xd4\xae\xb4\xa1\xe2u\xea\xd2\x17e\x07\xc4\xcc\xd5\xa2\xf9^\xa1R\xef\
-\x9c\xba\x1c\x88\x1a\xbf3\xe8|\xd6\x86\x9d^\xe7\xa6\xf3\xd49\xee\xdcv\xee;\
-\xbf;\x0f\x9d\xb3\xceu\xe7\xa0s\xd79\xea\x9ctv5\xbd2\xcc\xeb\xf6Y\xfb\xb4\
-\xf3\xb3\xf3\xabsS\x9dw\x96\xdb\x17\x9d?\x9d\xe7\xce\x8f\xcec\xe7\xb0s\xd5\
-\xb9\xec\xacu>v\xb2\xceN\'\xef|\xee\xa4\x9d\xadN\xd1\x99t\x16:\x8b\x9d\xe5\
-\xceJg\xb5S\x13\xb3\xdeY\xealw\xf6:5)+\xaa\xaa\x8e\xb4E\xf5D\xfd\x84\xc1\xff\
-\xef\xb2\xdf\xa5\x7f7\x05\xb1c\x10\x93i\xf2\x9c\xa9\t\xf9 JM\x0e\x13\xb6+H\
-\xd9\xe8lt\xdeu\xde:\xdf:\xf3\x9d\xf7\x82\x98\x0f\x9d\xef\x9d\xfd\xce\\\xe7k\
-\xe7K\xe7\xa5\xf3\xb7\xf3\xdaiEf\xb4*6\x7f\x19\t\xf5.\xeaFI\xa4Db\xf3EZ\xd4\
-\x89\xd6:Q\xb4[\x1a\xd1(:0\x83(\x8e\xf4(\x8c\xac\xc8\x8e\x9c\xc8\x8d\xbc\xa8\
-\x1f\xf9\xd1 \x1aF\xbd(\xea\xdcDO\xd1qt\x1b11ag1\xf9\xbf\t\xa9\x8bP\xae\xba\
-\xfc\xfbD\xedw\xee\xa3\xdf\xa2`\x99\x9dukB\x1e\xa2\x87\xa8\x96j\x1f\x14*g\
-\xd1ut\x10\xddEG\xd1It\x1a\xfd\x8c~E\xe7\xd1E\xf4\'z\x8e~D\x8f\xd1at\x15]FkQ\
-+\xfa\x18e\xd1N\x94G\x9fEI\xa3\xad\xa8\x88&\xd1B\xb4\x18-G+\xd1j\xb4\x1e\xdd\
-UK\xd1v\xb4\x17}\x8a6\xa3q\xb4\x1bmD\xef\xa2\xb7\xe8\xbe\xf5-\x9a\x8f\xdeG\
-\x1f\xa2\xef\xd1~4\x17\xfd\xd2\xbeF_\x1abV\x051/\xd1\xff\x8f\x8c\x81B\xba\
-\xc7\x9d\xcauGjM\xcc\xdf\x86\x98\xb9\xfa\x9c\xa9\tab\xf8\xf7k\xd42La\xd3V\
-\xc6\xd4\xe8\x1a\x89\xa1\x18\xe7\xe2\x00i\x1b\x9a\xd11"\xc30FF`\xc4\x86n\x84\
-\x86e\xd8\x86c\xb8\xc6\xd7\xd23>G}\xc37\xce\xb5\x8114\xd6\xa3\x9eqc<\x19\xc7\
-\xc6\xadqo\xfc6\x1e\x8c3\xe3\xda80\xee\x8c#\xe3\xc485~\x1a\xbf\x8cs\xe3\xc2\
-\xf8c<\x1b?\x8cG\xe3\xd0Xi\x04\xfc\xb2\xba\xdc\x1e(>N\xfc\xff&\xa4.\xb3\x99\
-\xbb2.\x8d5\xe3\xa31G\xe7\xcc{IL\xbd\xcc2\xa3.\x0f\xd1\x8e\x91\x1b\xaf\xd1g#\
-5\xb6\x8c\xc2\x98\x18\x0b\xc6\xa2\xb1l\xac\x18\xab\xc6\xba\xb1dl\x1b{\xc6\'c\
-\xd3\x18\x1b\xbb\x82\x94\x9a\x98\r\xe3\x9d\xf1&H\xfa&\xca\xbc\xf1\xde\xf8`|7\
-\xf6\x8d9\xe3\xab\xf1\xc5(\xcb\x17\xe3\xaf\xf1j\xb4F\xe6\xa8\x14\x86\xd2t\
-\xd4\x1d%#e\xa4\x8e\x84\xd8\x1auF\xd1\xc8\x18\x8dF\xc1\xa8&&\x1e-\xab3\xbe\
-\xff\'!\x97\xda\x91J\xc4L\xfe\xb5\x0c7;\xfa(\x1c\xfdC\xb7\x19\xed\x913rG\xde\
-\xa8?\xf2G\x03Q\x86\xa3\xde\xe8f\xf44:\x1e\xdd\x8e\xeeG\xbfG\x0f\xa3\xb3\xd1\
-\xf5\xe8`\xb4h\xdc\x8d\x8eF\'\xa3\xd3\xd1\xcf\xd1\xaf\xd1\xf9\xe8b\xf4g\xf4<\
-2#\xa7\x99\x977\xe3\xc7\xe8\xc7hWH\xb8\xc7\xd1\xe1\xe8jt9Z\x1b}\x1ce\xa3\x9d\
-Q>\xfa<JG[\xa3b4\x19-\x8c\x16G\xbb\x912Z\x1e\xad\x8cVG\xeb\xa3\xa5\xd1\xf6ho\
-\xf4i\xf4\x14m\x8e\xfe\x94\xb5(y4\xd7\xbbU\xbb\x1e0\x13\xc13b\x08\xcd\x82\
-\xfekM\xab\xff\x95\xa4\nb\xd6hf\xc6\xa3]A\x8a;\xda\x18\xbd\x1b\xbd\x8d\xbe\
-\x8d\xe6Ey/\xca\x87\xd1wQ\xf6Gs\xa3\xaf\xa3/\xa3\x97\xd1\xdf\xd1\xeb\xe8n\
-\xd4\n\xcc@\xd8\xd0\xc14\x10ju\xa0\x04j\xd0\x0e\xb4\xa0\x13D\x81Xu\xc1(\x08\
-\x82\xc7Q\x1c\xe8\xa2\x84\xc1\xe5\xc8\n\xec\xc0\t\xdc\xc0\x0b\xfa\x81\x1f\
-\x0c\x82a\xd0\x0bn\x82\xa7\xe08\xb8\r\xd6G\xf7\xc1\xef\xe0!8\x0b\xac\xe0:8\
-\x08.\xca\xbb\xe0\xba\xad7\xe7\xd6r{\xb6\xa0\xa8\x1c\x05\'\xc1\x9aFd\xf1\xff\
-\xcb\xc4\xaci\xfaHof\xe6\x9f\xd3\xe0g\xf0K\x94\rA\xceyp\x11\xfc\t\x9e\x83\
-\xf9\xd1\x8f\xe018\x0c\xae\x82\xcb`-\xd8\x1f}\x0cN\xa3,x\x1d\xed\x04y\xf09H\
-\x83\xad\xa0\x08&\xc1B\xb0i,\x06\xcb\xa2\xac\x04\xab\xc1zS\x96\x1a\x92j\xa2\
-\xc2`;\xd8\x0b>\x05\x9b\xc18\xd8\r6\x82w\xc1[\xf0-\x98\x0f\xde\x07\x1f\x82\
-\xef\xc1~0\x17|\r\xbe\x04/\xc1\xdf\xe05h\xc5f,,\xf3\xd8\x10j\xd1\xb2\xd0)T\
-\xd3\xed\xfc{f6\x94\xa3\xe0(\xa0\xff:R\xaf\x0c^zT^"a\x1c\xc7\xf4!\xad\xb8\
-\x1b\'\xf1\xafZ\x0f\x17E\x8d\xdb\xb1\x16\xd7\xb3\xf3(\xc8\xe9\xc4Q|)\xf6\xb9\
-`v\x1c\xc7\xaf#=\x0ec+\xb6c\'vc/\xee\xc7~<\x88\x87q[\x90c\x9b\xabA]\xc8\xb7\
-\xb6*H\xea\xc57\xf1Y\xf0\x14\x1f\xc7\xb7\xf1}\xfc;~\x88\xcf\xe2\xeb\xf8 \xbe\
-\x8b\x8f\xe2\x93\xf8T\x94\x97\xe0g\xfc+>\x8f/\xe2?\xf1s\xfc#\xbe-\x1f\xe3\
-\xc7\xf8A\x15J\xab\x99\xa8\x87\xf1\x95\xb1\xdc\xbe\x8a\xaf\xe2\x93\xa0Hj\x02\
-h\x86.\xe3+\xed?g\xa6j\xaf\xc5\x1f\xe3f\x99e\xf1N\x9c\x8b\xf29N\xe3-Q\x8ax\
-\xd2\x10\xb3\x10\xd7\xe4,\nb\xf6\xc5r[\x8eW\x041\xab\xf1z\xbc\x14o\xc7{\xf1\
-\xa7x3\x1e\xc7\xbb\xf1F\xfc\xee_\xc4\xd4\x84\xac\x80\xa0^\xfc\x16\xff\r\xbe\
-\xc5\xf3\xf1\xfb\xf8C\xfc=\xde\x8f\xe7\xe2\xaf\xf1\x97\xf8%\xfe\x1b\xbf\xc6-\
-\xdd\xd4K\xbd\xd2\xa7zWOtE\x17\x9a\x94(51bf*E\xd5\xf4Km\x92\xd4\xa4\x1c\xc6U\
-\x9bw\xcd\x91\xda\xd1#\xbd\xde\xfc\xff\x9e\x17C\xac\xb2@\xff\x87\xbe\xeb\x9b\
-\xc5\xb1\x1e\xeb\xba\x1e\xea59\x96n\xeb\x8e\xee\xea\x9e\xde\xd7}}\xa0\x0f\
-\xf5}\xb1szzM\xcc\x8d\xfe\xa4\x1f\xeb\xb7\xfa\xbd\xfe[\x7f\xd0\xcf\xf4k\xfd@\
-\xbf\xd3\xebEv\xa4\x9f\xe8G\xfa\xba\xf8\xc5\x84\x9d\xea?\xf5_\xfa\xb9~\xa1\
-\xff\xd1\x9f\xf5\x1f\xfa\xa3~\xa8_\xe9\x97\xfa\x9a\xfeQ\xcf\xf4\x1d\xfdW\\\
-\xe9\xb9\xfeY?\xd5S}\x18\x131[\x82\x9c\xbd\xb2\xdb\xd5\xf4B\'Rf\xdb\xbf\x12\
-\xca\xe8D_\xd0\xeb\x05\xf8\xef\xed\x7f\x18\xd7\xc4\x8c\xf4ff\x16\xf5E}Y_\xd1\
-W\xf5u}I\xdf\xd6\xf7\xc4\x9fO\xfa\xa6>\xd6w\x051\xbe\xbe\xa1\xbf\x13\xe4\xbc\
-\tb\x16\x8do\xfa\xbc\xfe^\xff\xa0\x7f\xd7\xf7\x1bb\xe6\xf4\xaf\xfa\x17\xfdE\
-\xff\xab\xbf\xea\xad\xd0\x0c\xcb\xb0\n\xa7a7<\x12\xd6\xb6\x12\xaaa;\xd4\xc2N\
-\x18\x85F\xf8\x10\x8f\xc2 \x8cC=\x0cC+\xb4\xc3\x9f\xb1\x13\xba\xa1\'J?\xf4\
-\xc3a<\x08U1;\x8fq\xed\x97\x9b3/\x84\xd1G\xa4\xf0\x8c\x1c\xa9\xc3\xb0\x17\
-\x1a\xeaM\xf8\xefY\xa9\xcf\xa1\xa7\xf0)\xac\x89i\x04\xc0qx\x1c\xde\x86\xcb\
-\x82\x98\xfb\xf0w\xf8\x10n\xebg\xe1ux\x10\xde\x85\xbb\x82\x9c\xa3\xf0$<\r\
-\xf7G?\xc3_\xe1\xa2q\x1e^\x84\x7f\xc2\xe7\xf0G\xf8\x18\x9e\tb\x0e\xc3\xab\
-\xf02|\xd1\xd7\xc2\x9a\x98WA\xd4\x9a\xf8\xaf\x8fa\x12f\xe1N\x98\x87\x9f\xc34\
-\xdc\n\x8bp\x12>\xeb\x0b\xe1b\xb8\x1c\xae\x84\xab\xe1z\xb8\x14\x96\xfav\xb8\
-\x17~\x12\xc4l\x86\xe3p7\xdc\x10\xe5]HN\xc69\xf3\xa4!\xa5H^\xa2\r\xb1#\xf6\
-\xbbo\xe1\xb7p>\xdc\xef\xfe\xe7^\xa9\x8d\xe9\x89\xfe^\x10\xf3A\x94\x86\x98\
-\xef\xe1\xf7p?\x9c\x0b\xbf\x86_\xc2\x97\xf0o\xf8*J\xcb\xaa]\x89\x955\xb5\xba\
-Vb\x9d\x84\x8a\xa5ZmK\xb3:Vd\xfd\x11G\xbe\x90\xb9\x96X\x8fVhY\x96mY&I2\xc7:\
-\x113r\xa2\xd7\xe8i\xcf\xea[~\x9d\x1a\xd8\xeaY\xf3\xf1\x8d\xf55~\xb2\x8e\xad\
-[\xeb\xdez\x89\x7f[\x0f\xd6\x99um\x1d\x88R\xcf\xccfh\x99\x8e\xb9 N\xd3c\xf3\
-\xa9!\xe6*\xbe\xb3\xae\xe2#\xeb\xc8:\xb1\x0c\xfd)<\xb5\x0c\x95$\xd8\xbfI\xf9\
-i\xfd\xb2\xfa\x9ds\xeb\xc2\xfa#JC\xcc\xb3\xf5\xc3z\xb4\x0e\xad\xaf\xe1\x95ui\
-\xadY\x1f\xadm\xb1\xd02k\xc7\xca\xad\xcf\x82\x9c\xd4\xf2\xf5\xc7`\xcb*\xac\
-\x89\xb5`-\nb\x96\xad\x15k\xd5Z\x17\xe50\\\x12\xc4\xd8 f=\xa8\x89q\xacmQNu\
-\xcf\xda\xb3>Y\x9b\xd6\xd8*\xc2]k\xc3zg\xbdY\xdf\xacy\xeb\xbd\xf5\xc1\xfanm\
-\x87\xfb\x82\x949\xeb\xab\xb5\x14\xf4\x0517\xe57\xd3k\x9c\xef7\x82\x98~R\x13\
-\xf3\xa5!\xe6\xc5\xaa\xd5\xff\xff=\'B\'\x0b~\tb\xee\xa3\x9a\x98\xbfL\xcc\xab\
-\xf5j\xcd\x8551-\xbb\xf6\xb0U\xf6\xd4\xde\xd6\xbbvb+vm\xbc\x0b\x83\xd3\xd6\
-\xec\x8e\x1d\xd5Z\x8b-\xd4\x05;\xb0c[o\xfe\xe8v(h\xd1m\xbb\xb94m\xdb\xae\xed\
-\x89\xbf\xfb\xa2\xd4\xbf|{`\x0f\xed\x9e}c?\xd9\xc7\xf6\xad}o\xff\x16\xbf\x1f\
-\xec3\xfbZ\xfc?\x07\xe2\x99;\xfb\xa8\xf9sb\x9f\xda?\xed_\xf6\xb9}a\xff\xb1\
-\x9f\xed\x1f\xf6\xa3}h_\x89\xbf\x15\xbb6\xc8\xfe\xf3\\\x19(\x97\xf6\x9a}\xa2\
-\x0e\x955[\x98f\xf6\x8b\xb5\x98\x8c\x15\xcc\xcc\xb3\x95\xd9s\xe1\x8e\x9d\xdb\
-\x9f\xed\xd4\xde\xb2\x0b\xfb\xb5Yl\x13{\xc1^\xb4\x97\xed\xf9\xd1\x8a\xbdj\
-\xaf\x0bR\x96\xecm\xfb\x8f\xd85{\xf6\'\xfbA\xdf\x8c7\xedM{l;\xd6zs\xc6\xac\
-\x07I\xb8kg\xe2\xcf\x86\xfd\xce~\xb3\xbf\xd9\xf3\xf6{\xfb\x83\xfd\xdd\xde\
-\xb7W\xc29{\xde\xfa*~\x8f\xad/\xf6\x8b\xfd\xd7~\xb5[\x8e\xe9\x94N\xe5L\x9d\
-\xd0\xfc\xd6\x84\xaf\xc8y\xdf\x133sdu\x9dzf\xde\xda\'\xc1\x7f\xcf\n\x138P\
-\x8a\xe4\xa3]\x8b\xee\x81\xf2\xaf\x99\xc9\xecG\xb1\xd8\x12\xa7.\xf5/*\xf5\
-\x7f)\x8e\xea\xb4\x1d\xcd)\xac\x9a\x98\x8eS\xabb#\'p\x1e\xf4\xd8\xd1\x1d\xb1\
-\xaa\x9c\x13\xbd&\xa7\xde351\xefD\xc9C\xdbq\x1cW\x14\xcf\xe9;~\x9dg\xac)\x03\
-\xa7\xe7\x9c\xc67\xce\x93s\xec\xfc\xb5o\x9d{\xe7\xb7(L\xcc\xbcy\x8f\x85v\xa1\
-<8\xf5\x8e\xb9\xb3\x0c\x95%\xda\x8c\x94\xffTC\x0fc\xfa\x97\xdc\xb3\xce\xb5s\
-\xe0\x1cZ59\xf5\x0c\xcd\xc8I\x9c}!\x1aT\xe7\xce9rN\x9cS\'\xb2\x7f:\xbf\x041\
-\xe7\xce\x85\xf3\xc79\x133\xf3\xec\xfch\x88\xa9\xb7}\r\xc6\xaf\xa5\xd8\xc6\
-\x7f\x10\xf3\xe8\x1c:W\x82\x04_\x94\x9e\xf8u\xe9\xac9\x1f\x9dL\x90\xb3\xe3\
-\xe4\xceg\'u\xeaY\r\xc5\xf6w\xcdQU\x87\x12\xeb@\xe2[r\xa1|H\x1e\x9c;\xebH\
-\xfd\xefE\xf6\x7f\x97\x7f\x113\x17\xd6\x83\xcf\xec\x9a(.43[\x82\x98\xc2\x998\
-\x0b\x8ea/:\xcb\xce\x8a g\xd5Ywj\xd1\xbc\xe4l;{N\x12~\x12\x7fj\x82\xea_\xf5"\
-{\xb3kb6\x9bR_l\xdfu6\xc4\x9fC\xe7\x9d\xf3\xe6|s\xe6\x9d\xf7\x82\x98\x0f\xce\
-wg_\x10S\xeb\r$\xcd\xbe\x99B%\xa8\xea\xb9\x89\xaa\x9a\x9c\xbe \xe7R\xfb\xef\
-\x99\xf9\xbf\xca\x90\xf7L\xbd\xcc\x1e-!\x9e\xc5\xd0\xe7\xc2\xba\x1c\n\xe9\
-\xc6K\xef\xab\xf3\xc5yq\xfe:\xaf\xce\xc4j\xb9\xa6[\xba\x95;u\xbbn\xe2*\xae\
-\xea&a\xdb\xadI r\xea_43\x9a\xdbq\xddfn\xe6\x85\x95\xbc\xe6\xd4\xc5\x10\xca\
-\xb9P\xa1\xddoB\xb5\xd3]5\x0c\xddT\x10C\xcaO\xd8\x90#t\xcd\xaa^j\x96\x1bU\
-\xb6[/\xb6\xc3x\xa69\xff\xa7}\xf3\xefr\xa59M\xba\x85\x7f\\\xf7\xda\xe1\x81\
-\xd7\xcb\xccs\xebEW\xd7\xd4\xf3R\x93\xd8w\xeb\xe2\xbb\x03w\xe8\xd6n\xdc\x9e{\
-\xe3>\xb9\xc7\xee\xad{\xef\xd6\xc7\xe4\x89^/\xae\r{\x17\xc5v~\xbb\x0f\x82\
-\x98M\xe7\xcc\xbd\x16C\xe72j\x88y/Hyr\x0e\\\x9a\x97\xd4\xa9\x17g-\xd0k\xf1,l\
-\x0b17\xb7\xe6\x9dKs\xf3!\x11\x02@.4.w\xea\xbfI\x1c*\x86\xfa\xd7\x021G\xae\
-\xeb\x9e\xb8\xa7\xeeO\xf1\xe7T\xfc\xfa%\xcay\xf3\xdf\x17M\xf9\xe3>\xbb?Dy\
-\x14\xe5\xd0\xbd\x12\x7f.\xdd5\xf7\xa3\x9b\xb9;n\xee~vSw\xcb-\xdc\x89(\x0b\
-\xa2L\xc4\xefEw\xd9]qW\xdduQ\x96\xdcmw\xaf)\xdb\xa2|\x12e\xd3\x1d\xbb\xbb\
-\xee\x86\xfb\xce}s\xbf\xb9\xf3\xee{\x94\x0f\xeeww\xdf\x9ds\xbf\xba_\xdc\x17\
-\xf7\xaf\xfb\xea\xb6<\xd3+\xbd\xf9v\xe5\xf1\xcc\xd8\xd5;e9Y\x13\xcaXO\xc8\
-\xb1\x93\xe0\xca\xb0;\x7f\xad\xba\x80\x98\xa9\xd7\xf5\xce\xc5\xf0OD\xa9\xffM\
-<&\x86\xc8\xfb\trjb\xae\x04!DLM\x8a\xe2\xa9^\xdb#b\x16Pj\x92\x16]\xcd[m\xc8\
-\xd1\xbc\x8e\x17\xa1\x18(+\x82T\xcd[\x14\xcf\x8d\xbc\xc0\xdbj\x88\xf8.,\x8a\
-\x9a\xa0\xcfB\xbf\xad\xc9\t\xbd:}_\xcbs<\xd7\xf3\xbc\xdfQ\x91\xf4=_\x94\xa3 \
-\x14\x06\xf2\x9aQ\x933\xf0\x12Q\x86\x9eC\xab\xb9&\xc6\xfc\x7f\x91\x8f)\xf6' ))
+    return zlib.decompress(
+'x\xda\x01\xf3\x13\x0c\xec\x89PNG\r\n\x1a\n\x00\x00\x00\rIHDR\x00\x00\x00d\
+\x00\x00\x00+\x08\x06\x00\x00\x00\x8e\xec-\xed\x00\x00\x00\x04sBIT\x08\x08\
+\x08\x08|\x08d\x88\x00\x00\x13\xaaIDATx\x9c\xad\x9c\x1f\x98#I\xf8\xc7?\xb7O\
+\xc3\x0b\r\x05\x03\r\x81\xc0@`!\xb0\x108\x08\x1c\x04\x0e\x02\x07\x81\x83\xc0\
+A`\xa1a \xb0\x10\x18hX\x08\x1c\x04\x16\x06\x0e\x02\x0b\x03\x0b\x03\x0b\x81\
+\x83\xc0B`!\xb0\xd00\xd00P\x10(\xe8\xe7\xb9\x1f\xd4\x9f\xae\xee$\xbb\xfb\xfb\
+=\xbf\xda\'\xd3\x93\xea\xaa\xea\xb7\xde\xef\xfb\xbfz\xf6\x97\xc3\xbe\xfa\x0f\
+\xdf\x92\xe6*\xc4M\x9a{\xdd\xb1\xcd\x08H\xe4\xfc^\r\xa66\xd7\xbf\xc7k$r\xd6w\
+i\xac\x1f\'\xe2?\x82\xa8x\x92{\x8e1\x18\x83\xfd\xd4\xc6=\x1b\xa8\r\xc6\xd1B\
+\xe2\xaeab\xd8M\xb3\x17?\xc7\x8d\xbfD\'5\x18.\xef\xebzs|u\xfcz\xd8lx\xd5z\
+\xf0\xa5\t\xdd\x16- \xfe\x93H\x03\xc6\xcf\xb6\xbas\xfd\xffl\xc2\x95\xfd\xb8\
+\x96x\xba\xcf\xa7\x9d\xb5\x98\xbe\x04\xe4\xf2(7\xff\x07<\xa8;\xeby\x00k\x0b\
+\x06\t$\x9e\xf0\xc3\x97\xc3e-\xf0R\xe1\xbfsA\x0b\xe8hH\xfcH\'\x998I\x0f\x92Y\
+\x9b\xf6\xf8\x00\xb2\xb8q\r\xb1]\x9a\xfc,\x11\xb1\x1a\x92\n\x92\xd8\xeb`8\
+\xe0\xb0?@\r\xda\x18\xcc\xc9j\x8a_\xc7\xd4\x8e\x8a\xf8{\xd2\xd0\xd7\xd6\x18i\
+\xb4\xa9\xbbO?\xffGZ\xf1\x1d\x813t\x84\xa2\x8e\xd9\xfa\x03\x93t\xa9\t\xfcXI\
+\xbfc\xb2\xc4}\x8f\x81\xb7\x84^Y\xf5\x12M\x91\x99\xed\xf7\x15\xd4\xc6\xd2\
+\xe5\xa59\xb1\xc0\x1b\x0fB\x02R\x0bF\xb0c\xc3\x9ab\x19\xe4\xe6zZ\xed\xf8\xf8\
+Y^ \xcd\xcfi\xf7%\x9ak\xffDZ\xfb&\x91+loIICpkr\xa7Y\xc97\xe7J[w\x08o\x81\xe3\
+Y\x10\xafsE3\xba\xf4\xc5W?W\x81\xd1\xda:\x16c\x9cy\xb5\xa0\x88\xb7\xd7\xb5i\
+\x98\x9cxm\xb4?U\x0c\x84[\xdf\xd4W\xccP\xfdca\x14\xe4\x87\x1a\xd4\xe2@m\xae\
+\xb0\xf7\'\xedz0?\x10Iw{\r\xefD\x1f\x87[v\x83\xa73\x923\x9d1\xf9:eX\x8d~\x0e\
+\x04\xa0J+\x8a\xf1\x92\xe9\xb7\x19\xd3jj\xfb\xa4b\xc4\x88Q:bc\xd6H"\x98\xc4i\
+\x808\xd3c\xbcC6V\x0bjk2\xbc\x192\xb5\xdd\x80$\x91{\xaf\x9b\xb1\x97Z\x0cW\
+\xdb\xb4\xfd\x84O\xad\xcf\xfd\xd8\xab\xb3A\x91\xd3n\xb7\x0e\xd2]\x07UG\x1f\
+\x17\xd5\x98\xc8o\xec\x06;t\xaa\xd1\xb5Fk\xf7\x91\x8ac\xef\xc0z\xb2\xe2\xb1~\
+h\xe6\xfc@ \x8e7G\xaa\xb4bs\xda\xf0\xf8\xe9\xd1n\xaa\xa7\x01\xd8?\xefY\xdc\
+\xe5\x80\x0f6\x9a}IJ\xd0\x1a\x95\x08*m\x18b\\d\xe6\xf7\xef\x03\x16\xfc\xb5\
+\xcb\x97\xc4\xfa\xadK\xfc\xfa!\x18]\r\x8fxy\x0e\x08|\x9f!] \xba\x04\xf9\xf0\
+\xcf\x8dk\x18\xec\x00\xcdA\x06\x82\x1a*\xd4k\x05_m\xf7\xe3\xed\x96\xc3a\x8f\
+\x1d\xf9#P\xbcY3\xec\xf7;T\n\xea\xa6\x89{\xcb\xb2t\xe1\xa9\xfbH;TV)\x88\xb2}\
+!\x94\x95H[\xe2}\x05\xa6\x99\xc6\xdc\x85\xfes\xc6_\x03C\xa2\x7fa\xfdn\xab;\
+\xdd&1\xe4\x7f\xcc\x19=\x8f\x98\xef\xad\x94\x191,\x7f\x9fC-\x14O\x1b\x94Q\
+\x90\xc0fTp\xc8\xf6\xac?mY\x8ds\x8chV\xbb\r\xea\xa4\xa0\x86\xe2\xb7%ev\xa4\
+\xd8n\x10\xa3Z\xcf\x9d\xcd\x16\x8c\xde\x8c\x01\xd8\x9a\x07v<B\x0fv\x9f\x1fyZ\
+m1\t\x14\x1f\xd7a+&\xd1\xe4\x7f,\x18\x95#\x06\xd5\x90\xc7\xd7[{k\x08\xc7\xcd\
+\x91\x83:\xa0\xbf\x01\xb7n\x1fS\xc3\xe4\xf5\x84*\xa9\xc8\xea\x8c\xbc\xcc\x99\
+\xbc\x8c\x83T\x1f\x92#\xeb\xde\x86\xbd\xb2\x02\x90\x99\x8c\xe9\xf3\x94Y9\r\
+\x81\xca|\xb4\x80\x1a\x16\x87\x9c\xcd\xeb5\xe5M\x89\xd4\xc2\xf8\xeb\x94\xe9\
+\x97Y$d\x1e\x00o\r\xda\x96\xe4\x12@\xa1O:\x01O"m\r\x11\xac\xdd\xdd\xf5\x9e\
+\xd8<\x14\x00\x1cz{\xb4htZ\x91\xeff\x18\xa31\x18\xf6\xbd\x1d\x1a\xcd\xe2\xed\
+\x8cLgTi\xc5BM\xd1\'\xcd\xe3\xeb-\xc7\xde\x01\xf3\x0c\xcb\xb7\x0b\xccI\x9fKC\
+b\xc1>\xf6\x0f\xf6{\t\x95\xd6h\xd1T\xaa$\xff\xbc\x08C\xf7\xb7;\x8chv\xfb\'\
+\xf6\x9f\x9f0\xa7f\x13\xa62\xacVk\x8e\xc7\xa3\xed\xe8\x81.4\xfd\xaa\x0f\x07\
+\xa8\x92\x8aeo\xc9\xd3\xf1\t\x118J\xc9|\xb0`\xaf\xf6\xc8A`\x0b\x95\xa9\xd8\
+\xdcnX$9\xd5\t\xf4I(\xd3\x92R\x95,\xdf\xe4\x88\x16\xe4\xb3\xe5\xcd\xd3p\xcbF\
+\x17\x81c1\x18@\xdbt;k\x11\xff\xf3{oT\xc1\x19G\xd7\xf7\xaa\xbd\xb00|\x1e\x81\
+\xc0^vP\xc3!\xdb7\x9b\xff\xd5\xb0?\xec9f\x07Lb\xe0\xc9F5\xf3/9\xf2,\xf0+,\
+\xb39\x8f\xc3\x07K\xd0\xd4\xa0D!q\x1a\xbd\x84\xa7\xbb-\xab?r\xf2?gT7\xa5\xed\
+_Cv\x931\xfe6\x01@\xffV\x05&\xef\xfb;;\xe6\x01\xd4>c\xf4\xef\xd8~?\x80\xfc)d\
+e\xd66\x05S8\xbc>0-&\xa0\xed\xf6\x96\x9fWT\x95f\x93m,\xed\x0f`\xde\x18\x06\
+\xc5\x90Q>\x02\x03\xc7\xf1\x91\xe2\xa9h;\xda5\x94\xc3\x92\xc1\xdd\x00\xd9\
+\xd9}\x1c\xd2=\x87\xc3\x8e\xb3v\xc9\xcc\xc6\x00\xc5\xcd\xfb*o\x02\x1d\n\xaf\
+\xc2M\xb7\xa1q\xe96;\x81\xc3\xf1\xc0\xa1\xb7G\xbe\n|q}\x87}\x03\xd2\x16\x86\
+\xc31R+\xf2}\x01\x06\xf4\xefN\x1b\xde\x02G\x98\xff\xb5l\x132\x80jPQ\xa5\xa5e\
+\xd6\x13\xf0\x9b\xbdN~\x9b2>Z@\x98\xc2\xfe\xcb\xce:\xfe\xec\x08\xcf\xc0\xbf0\
+\x1eO\x18\xdc\x0e\x9a\xe5n\x07\x14\xf7+\xb2^\xdfvh`\x07\x9b\xf5\x86\xf5\xaa`\
+(\xc3\xc0\x80\xfd\xe1\xc0>u\xb4o`\xfa\xfb\x94\xcd\xfb\r\xabY\xc1\xe0\xc5\xae\
+\xb9\x97\x9d\xf5A\xbe}\xb4t\xe5\xf9\x8a\xb1\x1a\x07\xce\x05\x8d\x04\xf2\xe5\
+\x9c\xfc\xdd\x9c\xd1\xaf}\xf2\xbb\x19\xabbA\xb1\xce\xcf\xc1\xf9N\x13\x04\x13\
+\xc2\xde\xc8\x1e\x0e*+-L`\xf7\xf7\x93\x95\xa6GPJ\xa1\xdfh\x0e\xb2G\xf5\x94\
+\x1d\xf3\tF\x7f\x8e\xc0\x18T\xa2\xdaq\xf73\xcc\xfeX\xd0\xf7\x8c\xf2m\x0e\xfc\
+C`\x92\x88\xa2\xdf\xef3\xbd\x9b1\x18\x0c\xc1\xc0\xa0\x1cp\xec\x1f\xd9\xab\
+\x1d\xd9mf\xc7~\xb0\x1a4|=dG;|6\x06\x10\xf7\\m3\xf6\xe1p\x88\xa9m6\x1f\x0f\
+\xd4\x89\x1b\xf7\x02\xd3\xc548\xfd~\x92q\xe4\x08)\xec\x0f\x8dU\xe0\x04\xc3\
+\xd180-,\xe5\x1c\xfc\xea~\xc1\xf2\xce\xae9\x1e\x8fY\xad\x1c\x11\xc0\xf2\xdd\
+\x9c\xe2\xfe!\xec\xd5r\xd9 Qn\x13\xb4\xd1%\xac\xed\xec\xa1\xb6\x0f\x1dVc\x0e\
+\xb7;\x0ecG\xd8\'\x18\x8eG\xecx\xc2\xfce\xa8\xd2\ny\xb4\x11\xcap8\xc2\x00\
+\x0f\xbf\xae1b\xe0\x00\x0c-\x03\xd5\xda\x99\xaaNIe>\xcf\x19\x8d&m\x82|K`R\
+\xce8\xf6W\x98\xdf\r\xbb\xcc1\xff\xc1j\x07\t\xa8x\xb9\x0b\xc5G\x95*D \xeb\
+\xb5\x83\t\x12\xc8\xea\x8c*\xa9`\x00*\x95P\xa0,\xd3\xca\x8ey>\xaf,(\xb9\\\
+\xab+\x8a\x1cI\x84\xcd\x87\x8c,\xcb 9\xb2^+D\x84\xc5\xa2b\xb94\xac\xee\x17\
+\xacV\x9b\xb3\xb9M\x92\xdd.\x1f\xbd\xf2\x8f\x8e*M\x8c\xbc\xd9\x9a\x1a\x0b\
+\xf6\x17\x18\xcb\x141\x0237\xfe\x1f\xc3p8D\x12a7x\xe4\xd8;@\x05\x8c\x81G \
+\x83\xcd\x9b\x02c.d\xeftB\xcc\x88 \x01\x86\xd5\x089\xd9gU\xbd\n\xd9\x0b<\xc3\
+d<FIT\xee\xb8\xf1\x13]%6^\x1f\x83\xae\xce\x83\x89\xa9v&q\x05\xc7\x97#J\xc1C\
+\xfa\xc41=\xc2\t\xf8d5\xf1\x12]\xed<\x04\xb4\xd6\x1c\xbf\x95\x94eE\xf5\\\xa1\
+\xb5\xa1z\xd1\x94\xcf\x15\xab\xfbxn\xfb_\xdc,\xf8\x8d\x00\xbc:s65\xd6\xb1\
+\x1b7\xf1\x935\x01\xfd~\xdf\xf6\x83\x05\xe9\x13,\xa6\x19\xc3\xc1\x8e\xc7\x91\
+\x93\x80?!K\x15\x83\xf5\xd0\x8e\xf9\x03\xb6\xcf+\xc6#m\xa5\xcc\xf2\xae1#q\
+\x82\x14\xab.0~\x9e\x04\xc4\xcc\xc60|=dp\x9b\x91)\x18\x9c\xfa\xf6\xc6k8\xfc{\
+d\xfc\xdb\x04\xb9\xd1\x81~\x80\xea\x05\xb46\x96\xc9\xae_\x12!\xd79\xd97\x05o\
+`\xf9\xd7\x8a\xc1\xed\x98\xe2\xb6\xb0\xf3\xfe\x021\xc2p8j\xf1\x03\xcf2oj\\\
+\x9fv\xd1\xa3$\xc6\x160\xdd\xef\x12\xd5\xb9\xce\xc0\xf5\xcd\xdb\xa6\xba-L\
+\xaf\xe2R\xba\x7f\xb4\x00\x8b}n%\xfd\x1e\x86\xafG\x90\x08\xd3\xafs\xb2\x7f\
+\x05\xdeZ5\x1f\xbfQ\x882L\xf4\x10r`\x07\xc5\xfd\x04\xd1\xc2\xe8\xfd\x08\x1ea\
+\xff\xf1\xc8\xfe\xcb\x81\\O\x91G\x81\'\x18\xf4\xa5e;\xe3M\xfa6\xaa\x1cSN\xc0\
+G\x98N\'d7`N\x90\xe9>\xf9\xbfs\xf8\x08|\x06\xdeA\xfef\xc5\xf00\x84"Z\xa4\x86\
+\xf9i\x86\xfa\xac\xe0\tDY\xc1:\xa4;\xfa\xf7\x19|\x04\xf3\xc9\xc0\xdfX3\xfb\
+\x08\xf9b\x89R\x8a\xd9\xd79\xac\xb1Z\xef${\\\x8e\xc9\xf6}\xf8\xe0z\xa4mn.5}\
+\xd2\x16\xcc\xa4\xf3\xc1\x96\x95|\xc2j\xdcY\xcd\xe5S\x8c\x1aF\xcf\x13\xf8"\
+\xec\xd5\x8e\xe9t\x0e\x182\x9d\xb1M\xa6\x14\xcf;&\xef\x06H\n\xe6\xa4)\x0e\
+\x13\xe4\x19\x06w\x19\xe37\x03\xd6II\xbf\xcc\xc8\xfb\x0b\x1e^\xef\xc9z\x8a\
+\x91\x1e\xc2\x11v\xe3#\xe3\xdf\x87\x1c\x0fQ\xad8.Z:`v}\xe7;\xb6v\xf3\x93_GT\
+\x1a\xf4\xc9\n\xcf4\x99!\xfb\x8c\xdd~\x07\xc0p6dVM)\x9e\xd7\x0cgMd59\x8d\xa1\
+\\\xf18zb4\xb4\x82\xa5n2\x9e~\x7fb\xfb\xf1\x91\xdd~\x871\x86\xfe\xa0\xcf$\
+\x9f\x90e}L\r\xd3\xe3\x1c\xbe\x80\x9eh2e}\x91:e\xe4\xff\xae\xd8\xd6\x1bF\xbf\
+N(\x9f\x8f@\x89\xa9\x05\x95z\xc6\xba\x8a\x80\xdb\x8f\xd6\x9a<\x9f\xb2^?\xb6\
+\xfc\xa5\x895\xaf\xe9\xe5\x97\xc3\x97\xea?\x90P\xb6\x08\xad\x0b\x95\x8b\xc4\
+\xc6\xfd\xad+=+P\xda.|\xea\x83\xaf\x0b%0\x9d\xef\x18\x0c2\x8a\xbb\t \x90Fk\
+\x88\x02\x14\x87\x83\x95\xf6\xb8,\xae]\xd1\x90\xc4\x16\x10\xa9\x81\xd70\xb9\
+\x9d\xb0\xba\xcb\x03\x18\xc6\xd3W\x13\x951\x9c\xc4\xf9$\xd8e\xe5\xea\xc6Wy\
+\x05\x95)$UT\xdf\xca\xe84\xd14\'\x8an\r[\xd7j;\xf6V!\xb5\x86|9\xb3\xc9\xed\
+\xc9F[yn(\xee\x9b)6\xdaj\xff\xee5\xaa(\xb6t\x9b\xe7\xff\x15E\xf3\x04]\xaaej\
+\xc7@\r\xb5\xb2\x0cQ\x1a\xb4\x8bhT4>q\xeb\xd4\x8e)\xc6\xb3S\x87\x81\xe2~\x98\
+\xda\x86}\xea\x94q<\x1d\xe0E\xe0\xde@\t\xd3\xb73\xf4\xc91F\x1a\t\x14iT\xbd}\
+\xae\xe2Q\xb1\xa0\xa9\x1b\x0b\x04\xc6\xa0\x9f\xcb+\xfbm\xa4\xf6{E\xf3|9C)E\
+\x9e\x9f\x07\x0c1\x08\x97\xef\xd9U\x97\xeffH"\xacV\x0f\x9dQ\x17\xceCB\xd9\
+\xb9\xf5\xad3"\xb1\xf5*N\xbaa\xc2\x8dj\x18\x1fVp\x8c\xf7\xd8\x8aq\xe7\x13\
+\xae?\x84}6r\xca\x12\xc5\xf2\xf3\x8a\xf5\xdf\x05\xfa\xa5B\x94b\xb6\x9c\x91\
+\xf5\xb2\x8bY\xb06\xd1!\x8fo\x89\x84*\xaf-\xa3\x0b\xe6d\xacy\x8d+\xc9\x1e\
+\xd0Sg\xd1\x08\x98n\x7f\xbe\x9c\x91\xbf\xd5\xf8<\xe3\xa7[\r\xab\xa4\x01\xcc\
+\xe6-\x86\xd5\xfd\x9c\xd5\xbb\x87V\xf8\x1b\xa5+\xcdd\xf0\'nW\x0ea\x12mA\tJ\
+\xa4@\x97\xf6\x8a\x8f*\\u4\x86\xd8\x9d\x8d Q\xe4\x918\xc7\xe6\xcc\x82J\x85\
+\xd5\xb2\x88\xa4\xdd2\xd1\x9f\xe2\xa9\xc4\x9a\x94v\xb8\xde\xac#\xe2\xcb\xe2\
+\x12"6cl\x89Gn2$\xd56\x1cv\x13\xad\x1f\xa4\x19{\xa5\xca\xbc|7w`\xfc\\[\xbd\
+\x83\xd5\xbd\xbd\x82\xdd\xcb\xa6\x97\xb1XTaL\xfeV\x93\xdfY\xff\xe2\xf7\xf0\
+\xaa\x05\xc4\x8fj1>\xa3\xf7\xa6\xc7#\x96\xba\xecJ\xccu#x2\xd6\x97\x086r\x8a\
+\xa3;\x07\x86\x89O\xe1\xc2\x01\x97O\xca\xecG\x1b\xa2hEB\xb4\x13\xce\xd7\x1d0\
+*\x05\xa5\x04\xd5Sd\xb7\x19\x92\n\xd4671\xc6\x06\x07\xdai\x87O\x0e=A\xddd\
+\xd5\x00\xd5\x8be\xe4\xe6C#LEq\x1e\x12\x05\x00:\xbf\xdb\xbd\\1\x84\x91ozu\
+\xed(\xf2b\xf4\xe5\xef(\x03\xc6I\xcb\r\xf0\xe2\x1c\xb0\xa2q\x86\xee\xa0\xcaj\
+\x13\rx\x06\xb8\xa9\xc2\x13L\xe7\xf9q\x02f\xb8\x90\xc9\xfb\xeah\xed4\xc11S\
+\x89u\x9a\xfdAF\x7f\x90\x91\xf5\x14J\xb94\xcc@Ui\xaa\xb2B\x9f\x08\x87Q\x1e\
+\x98\xd6\xe1\xd4\x15N\xf8|b\xf1W#\xe1\xcbeC\xf9\x19\x10\tgL\xf4\xb9J\xdcV\
+\xef\xacO\xf1-\x89\xd1!\x81\x91\x18\xa8\xbc\xad\xad\xfcJ\xf6\xaa5\x1c\xfb\
+\xf6\xeaYV\xe9\xc6\xb4,\x07a\x8ew\xd6!\x008\x89\x05L\x04^\xdcV\x93\xeb&"d\
+\xc7\xf8\xb1\xcdK\x08\xa1\xd5^\xba\xadv\xf4\x07\x19\xde4V\xcf^0\xa2w\xb0B\
+\xb4\x14\'c\xb6\xa8\x87\x91V\xa4\x15\xae\xae\xafz\xa9\x02\xd3\xbd)\x8a\xaf\
+\x9e\xb9\x9ev\xcf\x1e?F\x94`\xb4\x81(\x12\x0b\x14D\xf9Lx\r\xc8_\x95\xd1\x90z\
+@\xb4\xad\xb2\x82u\xe0\x00/\x91\x01G\xac?\xa8K7\xdf@\xd2\x07\x8en\x0eV\x83jc\
+\xcd\x9a6\x91m\xf0\xe1k\xc4\xe4\x0b\xb5\x1d\x1f\xed\xc5>C\xbc4\x8b\xf5\x13Y\
+\xa6P\x99\r4*\' \xdd\xa3\xe0\xf0\x82\\,\x804\xe3Zam\xb3\xbb\x8b\xe7\xe9\x01\
+\x98\xce\xd5\x9fZ\x9a\xd4\xb0\xbc3\xac\xfc=i\xb4#\x060\xd0\x16i\xce+\xf1QI\
+\xdc\xe2\x17\xdfz\xae/U\xb6O\xa9\xb6\xd1}\xf6 \xf4\xddFK7\xde=\xc4\x80u\xfa\
+\xdajHj\x9a\xbc\x84hH\x17\x0c<#\xda\xe5\x8a\x86F{i\xc0\x14\xaa\xe7Hs\xfdo\
+\xce4\xd9\\\x83\x10Ey\x9f\xd5\xac`\x82E\xf5\xcf\x8b\x03\x86\x87\xcdSxf\xd0\
+\x88\xe8\x1a\x1f!\x1b\x1d\x99&i\xc6t\x81\xf0M\xa5*h\xf0\xe53\xf5\xb0a\x89l\
+\x0f\r\x08\x1e\x14\x80\x9e\x07\x06\x8c\x11\xb4;\xae5\'\x85I5F[S`R\xb1\xb9\
+\x85vWh\t\xc2U\xd3\x15\xb7\xd8\xec\x04:\xc5\xd6\xacjC\xd6W\xdf?\x8b\x8f\xb5\
+\xc3\xfb\x8d\xf0"_\xf4\xdd\xed\xbf[\x00}\xf8\xf0\x84\xa4b\x19+\xb0\\Y\rZ\xaf\
+\x15\xa66\xe8\x93\x0e\xf9\xc9\xea\x9d\x05\xa9(\xb66\xe7xw\xee\xe4}\xb3\x01\
+\x83=Q\x8c\xdc\x98{t\xbf\x0f\xfe\x80F2\xa8++\xd1>^O\xc4\x85\xaeN[\xbc?\xe9\
+\xc1\xec]A\xbf\x0f0\xa5\xaa2\x8a\xed\x92\xcc\x9bB\x87\xa1r\xda\x91\xb9\xc7\
+\x99\xe4\xf8\x1d\x0e\x02\xe7\x9e\xc3}k\xf7U\xcf\x9a\xaco\x9dyY6AC\xb7<obP\
+\xa3\xf2\xc55\x81\x88\xfd\x0fX\xf3"\xa9\xa0\xdd1\xb2\x12\xc1\x9ct`\xf8*"rYl\
+\xec\xef\xc9\xb9\xbf\xf1m\xb3\xc9X\xbf\xdf\xd87G\x894$\x1c%\xd6\xdd\xbdf\x16\
+\x90\x1b\xe5\xc2V_\x8a\xc0\xda\x81H\xca\xb3\x1bZ-(q\xea\x02\xb3\x887U\x02\
+\xba\x07Yo\x10BUO|\x8b!?0U>S7\xa6)ct\xfdPl\xaab\xc7\x1e|\xca\xc5p\xf4<\xce4\
+\xb4\xc1\x90\xdaEZ&\x92~\x17\x04\xae\xdfo!\x81\xe5\xdd\x0c\xa3\xcdE0\xc0\xd6\
+\xba\xe2\'\xbej\x95\xbe\xc11\xbc\xdf\x10\x94\x18H}\xa6\xac\xecwo\xaeR\xd5\
+\x9a+\x9d=h\xcfLc\x7f?{C\xbd\xc2I_\x07\x8cs\xbd\r\xfd>\xe9k\xb1\xd01UW\x9a\
+\xf0\xbeT|\x8f\x8e\xf3\x8e\xde\xf5=7q>\xe71\x01\xc0\xc6L\xb6\xc1\x80K@<\xb2~\
+\xffH\x9e\xcf\xd0\xd5<d\xe7\x97\xc0(\n9\xabk]I\xe3\x0c\xa4\xf6EeA\x9a\xe4\
+\xef\xe4\xcd\x87\xb1\x81\xff\xc9`R\x85\xa4\x06^l\xc2\x15\x83\xe2\x89\x96\xda\
+\x96\xba\xa2\xfc\xdc\x9e\xe8\xc5\x1dW[\x03V0UA\x9b\xc5\n\x08\xd2H\xbf\xb6\
+\xa6\xab\xfcV5\x89X\xa7Px\xb6\xdbnR|%7\x9b/&\x80\xad&d=\x851\xd6oP\xd3d\xdb@\
+\x9eO\xa1\x86\xc2\xadr\x1d\x8c\x87\xb3\xfe\x16 \xc6\xc7\xec7\x02Z!7\xc0\x8b\
+\x0e<1\'\xb1Zq\xd2\x84\xb7\xd7k\x83A\x90T9\x00\xdd\xd88\xd2q\xb9\xa4/\x81x\t\
+\xae\x9e!\xeb\xd9\xd1\xa1\xb4\xd2\xa5,\xa20\x04\xc0\xb5\xcbI\xfcAP4F\xbf\x18\
+Tb\xe8\xdff\x94\xc72\x8a\xa4\xccE0\xc0\x9bK\xd3\xf2+\xdd6_LxX?2\xcf\xa7\xac\
+\xef\xb7\x81\xb68\x8c\xce\xef\xa6\xacV\xb6f\xb5r\xdd\x97\xc0xx\xe8S\x14\xeb\
+\xf3\x1b\xf8\xc40i3\x90\x84\xc8a\xfb\x14[\xe0\xc6\xb8\x08IAR\xb9 L\xac\tH\
+\xa5\xc5\x9c\xf8\xa8R\x0c\xad\x1a\xa3\xa9\x9d\x86\xfb!\xdf\xfb\xdb\x92\x0eH\
+\xf6P\xe7\xf2\xd0,\xb3%\x14\xe3K$x\x86\xb9\x84/\xfe\xf9\xdd\xa8\xee\\?\x1e\
+\xfe~\xbc\nV\x9eO\x03\xad+\xd7w-\xc4]\xaf\x15\xab\xd5:\xec\xa7\xbb\xe6/\x87/\
+\xfa?\x80\xfd\x97=\x00\xe3\xdbFR\x05\xac\x992\x06\xdc\xc9\xd7\xc3\xbf{\x1e\
+\x0f\x87N2\xf7\x83\xf6\x13c<\xec\xe1\xb9\xd0Dt\xad\xb5\xba9\x93\x03\xd7\xbf\
+\xf9PG\x89VlzZ&\xe9\x9c\xe1\x17\xc7\xc5-Dd\xde\x9bX-=~\xdd\xb7\xcf>\xae8oc\
+\xe0\xe1\x9f\xcc\x9e\xbf\x9c\x0c\xeaF\xb1\\n\xc2\xba\xab\xfb9*U\xe7\x80d7\
+\xc20\xda\\0OQ4\xe0\x01\xe2\x14;G\xc3\xecKN\x96A\xf9m\x8a\xa4CF\xc3\x95}\xc1\
+\x19\x17\xf6\xa6\xcd\x1b#\xde\xc1g\x19\xe8\xaa<\xdfA\xe2\xb5\xcc\xe9\xd5\xa5\
+\xe0!\x91\xa0i\x83a\x9f\xe3\xd7\xd2\x95X\x9a\xdc\xc2\x18\xd3\x8e\xb2\x1c\xad\
+]\r\x89\xff\xb0\xe8,`\x80\xf0G?\xad <\xb1U`\xfd\xd2\xf0\xe6\x9afxS\x16\xb7\
+\xe2\xbdP\xdco\xad\xa9{\x17\x96l\xb7J\x1b\x9et\xfcX\xefT#\x0f\x9cbM\x14\xb0\
+\xf9{\x00\\q\xd0Q\x88\xaaq~$\xca1}NrIu\x9b5\xda\x11\x98t\x7f&\x96I\xc7C\xe9L\
+Z\xa4\x1d\xddRHd\xf3c\x8d\xfcn\x0b\xc7\x00v\x86Dk.\xdeN\xbf\x9f\x88\xba\xb6\
+\xd9d\xacV\xd5Y\xff\xf2\xce\xb0\\\xceZ\tc\x12\xdbU\xbf\x91\xa6\x86\xe4\t\xe9\
+\x92\x7f\xf9\x1d\xefkQ\x93\xc1iGD\xbc1\xb4K(^4Z\x1b<O\n/\xde\xedFE\xad5\x1c\
+\xed\x8e\xb1\x01\x94kB\x90H\x8b\xe9\x8d\x89\x02\x93D|pk\xc4\x1aq-\x13\x8f\
+\xcf@\xba-\xae\x18\xc3%\xeb\x1e\x12\xab\x0b!c\x18c#\xab0\xde\x07\x06q\xd8\
+\x1b\xc7\xf9\t\xb6Z\x9f\x10@P\xca\xde3\xa7\x0e\xb1\xdd\xa8*f^\x12\xdf\xf1\
+\xcf\xe8\x00\xd6av\xc4N\xfb\xbd\xd5\xdf4\xcb\xf0\xf3\xf91MR;P\xea\x06\xe0k \
+\xfc_ZQ\x887\x08q\xaco\x7f7\x97\x1c\xaao5A\xb7\xf2\xc51D[\xde\\\xac\xd7\xd0\
+\xef\x19\x86C[\x16i\xbf\xf2\xe3<\x83\xee0\xe0Z\xeb\x86\xbf\x1d\xa7\xde\x8a\
+\xba"!\xf0\xda\xd3btw\x0f\xad\xe7\xb4\x19}Qc\x936("\xe7\xa7\xef\xd7\x9c\xfa\
+\xb5~\xdf\x8aB\x98\xfd\xb1$\xf1\xef\xa8\x86\x8d$\xb1\xf4q\x99am\x18\x1d\x03\
+\xda\x1a\x95eY\xa3\x1ducZ\xacv\x9d\x1b=\x89\xd6\xed&i\xf6\x14/\x1e\xdf.\xd9|\
+\xcf\x17\xb4|\x8aM\xd3\xcf\xc7\xc7\xa1z\xe7O\xd8\x1a\x01\xe5L@\xd7\xef\xb7,\
+\xb3\xf6\xd1\xee\xa5"b\xd6\xcb\x90B\xb3:\x9dS*\xa9`\x8ca\xfe\xe7\x12\x80_\
+\xf6\xee?\x0ex\xf8\xf0\xd0\x10\x17\xdb\xd0\xc8\x97x\'z\xb1u\xfa\xcf\xd8\x1dW\
+N#\xa9\x0f\x7f\x8c\xf9\x1d-\t/-\xd0\xf1d]\xf3z\xe1\xc9\xed3\x90\x0b\xc9_\xb7\
+\xf8\x18\xfa\xa3\xbe\xf8l\xc5\xfb\xab\xe80\xeb\xf1\xd3\xba\xf5\xda\xaa/$f\
+\xbd\x0c\x12\x98\xfc\xb6\x00`\xbb-\\\x95A\xd0\'\x8dR\x8a\xe9$o=\xff\x97\xfd\
+\xbe\xfao\xf3a\x136\xd2d\xda\x1d\x82\xbb\x80x\x02cF\x9e\xd5\xa0\xdaa\xeb\x19\
+\xa0\xff\x1b@\xc2\xf8v\xa5V\xba\x05\xb4n\xeb\x80p~p\xd5\x06\xa4\xb5\xff\xd68\
+\xf0\xa5\xfa. \x00\xdb\x8f\x05\x83\xc1 \xcc)\xcb\x92\xe9\xb4\xcd\xec\xcb\xf4\
+\xb5\xbf\xfe\x0f\xa5A\x9ef\x9d\xbb\x9d\x81\x00\x00\x00\x00IEND\xaeB`\x82p\
+\xe3\xf5W' )
 
 def getwxPythonLogoBitmap():
-    return wxBitmapFromXPMData(getwxPythonLogoData())
+    return wxBitmapFromImage(getwxPythonLogoImage())
 
 def getwxPythonLogoImage():
-    return wxImageFromBitmap(getwxPythonLogoBitmap())
+    stream = cStringIO.StringIO(getwxPythonLogoData())
+    return wxImageFromStream(stream)
 
 #----------------------------------------------------------------------
 def getPythonPoweredData():
-    return cPickle.loads(zlib.decompress(
-'x\xda\xcdXMo\xdb0\x0c\xbd\xf7W\x08\xb0\x9c\x0e\x11"4m\xda\xb50\x0cxE\xbb\
-\xe3|\xe8E\xd7\xa2\xd8i\xc5\xb4\xff\x7f\x9aH}\x92\x92\x13\x17]\xd1IH\xa4G\
-\xd1~\xa6)\x93\xb4\xbf\xbc\xfe\xd9\x9f=\x9d\xef\xf7\x17\xe2p\x10\xfbk\xb1??{\
-~:7\xe2E\xdc\xbf>\xbf\xfcB4;\xd4\xedo\xa1#\x9e\x00?<BG,\x01?~\x85\x8ex\x00|u\
-\x07\x1dq\x0f\xf8;6\xc4\x16\xf0\xe1\x12:\xe2\x1d\xe0\x8b[\xe8\x885\xe2\x8b\
-\x9b\xabo\xd7\x88G\xc0\x97w\xd0\x11+\xc0\xb7\x07\xe8\x88\x85\xc3?\xec\xef\
-\x9f\x086xq7\xd0\x11o\xf1b\xf6\xd0\x11w\x80\xef\x1f\xa0\x87\x83W7\xbd\xd0\
-\xdep\x8a\xb5\x94ze\xfb7\x94\xfa\xcd\xed=\x94\xfa\x1d\xed\x8d\x94\x867w\n\
-\xd3j\xa7\xe4\xab)\x9d\xaa\x9d\xb1\x03\xb9\x80\x7f\xed\xc7(\x9fq\x9e\xe5\xf1\
-\x08\xaeoVS\n5u\xd2\xf5I\xcd0Wx&7\xceA\x8e+\x85\\\x18\xbf\xc2\xf5\x81[\xaf\
-\xa0t\xf7\xc4N\xbdoR\xcdn>Yw\n7J\x15\xe5}?)\x99\xe4\x93\x9d\x1d\xaa\xf5q\xac\
-\xdcZQ\x82\xe7\xcd\xdc\xf5\x12\xad\xd9H\xb5\xed\xfanv\x87:Y\xb7\x05[$\xacML\
-\xee4\x1b\xfa\xb3\xa7\xa4\xa4\x8c\xd2o6c%^/\\\xbb\x84\x1f^5\x8cQ\x06~+\xe4\
-\x8a\xe9\xbb\xfbk\xe2z\xb5\x81\te\xdc\xdfx\x85\xa3\xd9\x99\xd1\x8d\x03\xbb\
-\xea\xd68\xd0\xb9\x04NbeIZR\xa6\xc5\xcaJ8C\xf2]i]\xe3N\xa0Wa\x85Z\x9993e\xf1\
-\x14\x13_\xce\xe0\'5\xe2\xbf\xa0\xd6y\x1d\xd9\xb0\xd2\xe9\x0e\xdc\xcaH\x9a(\
-\xcb\x15\xb8\xda\xb4c\xd1>wf\xef!be\x9f\xb4\x98_\xbb\xf0\xb3\x8cR\x97\x94d!Y\
-0!\x0b\xda\xb9\t\x8ck\xac\xec\x068B\xd6V"g\xa0\xa4\xf2\xe4\'\xebC\xdf\xac\
-\x92\x8d\xab|)\xc3sZ[\t\x9cm\xcahIl%^\xb1c;\xf4F\xd3\xcaD\xa9\x1bV\xda\x1c\
-\xa3\x0b\xac\x89\x95K\xcf\xa5\rw\xa6a\xa5^\xa0$V\x96\xb8\x98\xcf+\xa3O\xcc,\
-\x94RWV\xe6\xf8\xc8\xb1\xe11\xf4T\x8c\r\x99%\xb76e\xcc\x06\r\xcc3\xc5\xa9L\
-\x923\xcaq\xca\x90\x03M\x03\xa79\x1bY\xbe\xcc#\xbbc-J\x7f\xf3w\xd1\x8d<\xdb\
-\xa75>\xee\x92\xd2\x8e\x1cR\xc5\xda\x8a\x92T\x04z1\xdb3\xb9H\xcfp\x96\xc79\
-\xdf\xb95eY\x11\x98E\x1fQ\xf9\xe8\x10\xd7\xf7\xf3\xa9\x8e\xb5\xd5CB*\x02\xb3\
-\xb4\x13\xa9\x1c\xe2i\xa5\x1f\xe6U\xac\xad\x9f\xcb:\x8b4\xab\x03"\x97\x88\
-\x98~\x98W\xb1\xb6\x0ex\x18M:\xab\xac\xbb\xba\xa9\x8a*\xc17*\xeb\xc4\xfc8\
-\xaa\xa0_\xc8\xbd\xb4g\xd5AM\xb9T\xf7\x0c\xbe\xf6A\xd9@\xb3\x88\xaf\x02\xfc\
-\x1a\xcb.U\xacm$/\x92+\xab8\x9a\x7f$W\xe2n\x11x\x07x\x0ee\xb1\xb6\x95\xa2I\
-\xae\xe4\xd9\xc2\x86_\xb2\xb2\xa8\xf4L\x99C\x0b\xf9\xc8+\xbd\xaa\x10!\xb9\
-\x12k\xd7\xc2\x971\xdb\x07\x9f\rj\x9b\x9f\xbb\x10i\xb2\xbc86Z\xd9.\xb7H\x06\
-\x10|\x07nB}\x10\xe5\xc5\x9d \xfa\xf8\xbc\x86y\xf2\xe5RQ\x993@\xac\x07Z5P\
-\x94OvWf\x99B\x9e\xe7}X_,\x9dS\x94\x89\x9c$\x9a@\x9c!QF\x90\xacS\xca\xe3<\
-\xa2\xe5\x17\x04\x9aEx\xcc\x14E\x9e`\x99\xa3\xa9\x9f\xdf\xdf\x8eP\n\x9a\xc8\
-\xcd\xeavJ\xff\xd8\x9b\x17\xad\x1d\xca\x93.\xcc\xd7\xe8\x1f\xa7\x14\xb4Zi\
-\xbe1\xebF&=\xa6_\xbe\xdb\x1e\xf9V\xa0\xdf\xdd\xfe\xf3\xcf\x13\x9f\xf8\x11\
-\xe6\xb3>5}\xc0\x075\xfd\x17\x19\xafZq' ))
+    return zlib.decompress(
+'x\xda\x01r\t\x8d\xf6\x89PNG\r\n\x1a\n\x00\x00\x00\rIHDR\x00\x00\x00n\x00\
+\x00\x00,\x08\x06\x00\x00\x00\x84\xcb\x8d\x9c\x00\x00\x00\x04sBIT\x08\x08\
+\x08\x08|\x08d\x88\x00\x00\t)IDATx\x9c\xed\\?h\xdc\xc8\x1a\xff\xc9^\x8cx\x88\
+CE\n\x15*Tl!\x0es\xe7b9\xb60A<\xb6Hq\xf0\\\xbc\xc2\x85\t\x82\x98c\x8b\x14W\
+\xbc\xc2\x1c.6\xe0\xc2E\x8a\x14.\x96#\x81%l\xb1\x859\x16\x9fylq\xc5r\xa4\x08\
+\xc7r(W\x1c*R\xa8H\xa1"\x85x\xa8\x10\xc1\xef\xf4\x8ax\xc6\xa3\xd9\x914\x92v/\
+\xbe\xbc|\xb0\xc8\xbb\xdf\xdf\x99o>\xcd\xa7\xef\x1bYQ66\xf1W\x81\xf4\xfe\xb3\
+t\x9d\xf2\x95\xe7\x0f\x94u\xca_%(\xb7\xc9q\xebvLS\xb8M\x8e\xfd`\x8e\xbb\xedN\
+\x92\x85\x0f\xe5\xcc?\xc5q\x1f\x8b\x93d\xe1\xcfp\xe6J\x1c\x97\xfe\xf1\xdf\
+\xe6\x8eqG7\x7f\x8f\xdc\xc6\xe2n\x9b|ecs\xa5\xce\xdcT\x94\x8dF\x02\x88\xd3t]\
+G\xb7\xdbE\x92$\xe8t:K\xd7(\x8a\x90$\t\xe5#\xf4\xf4wo\n\xec\xec\xd1A\xf3\xf8\
+2\xf9\xbc\x9e\xaa\xf2y\xbbVm?\xd2t\xa0(\x1b\x8f\x1aM6\x0b\xca\xc6f\xa3\x0f\
+\x80T\xd7\xf5tp2H\xfd\xd7~:\xfbi\x96\x06o\x82\xcc\xd5\x7f\xed\xa7\x83\x93Aj\
+\x18F\xca\xd3\x0fN\x06\xa9\xae\xeb)\x00\xfa\xe1\xf1\x86a\x14\xca\x17\xe9\xa9\
+"\x9f\xe0\xf3\xf44\xb5?\x83wG)\xdcQ\xdax\xdek3^\x1b\x00 u\x1c\'\xf5_\xfbir\
+\x95\xe4~\x827\x01\x1d<K\xef\xbf\xf6S\xc7q2\x03g\xf1\x84\xafL>\xf9\x90\xc9\n\
+\xde\x04R\xf2\t\x9e8\x8d\xf0\xad\xca~\x11\x9e\xce]\x03\x07\xb6\xaaF\xa8(\xd1\
+\xf0}\x1fA\x10\xc0\xb2,\x84aH\x7f\xb3m\x9b^\xa3(\x82\xeb\xba\x00\x80\xe9\xf9\
+\x94\xd2\x07A\x00\xdf\xf7s\xe5\xf9\xbe\x8f\xe9\xf9\x14\x00\xb0\xbf\xbf\x8f \
+\x08`\xdb6\x00\xc00\x8c\x8c>\xcb\xb20\x99L0=\x9f\xa2\xdb\xed\xc20\x8cR\xf9A\
+\x10 \x8a"\xf4\x1f\xf6\xe1\xba.\xa2(Z\xa9\xfd"\xbch>\xab&4\xd2\x8e+\xca\x0cm\
+\xdb\xa6\x93\t\x00\xa3\xd1\x08\xc3\xb3!\x1d8\x99\x14\xc30\xe8\xe0\t=\xe1%\
+\x0e\xe0\xe5\xd9\xb6\r]\xd71<\x1bb\xfe\xd3<#/O\x1f\xcf_&\x7f\xef\x9f{\xd4\
+\xbe:\xf6\xf7\x1f\xf61<\x1bR\x1de\xfa\x8b\xe6W\xd6\x81\xa5\x99Iz\xffYZ\x96\
+\xce\xfb\xbeOW\x95\xef\xfb\x98\x8c\'\x08\xc3\x10/_\xbeD\x18\x86\x98\x8c\'\
+\x19\xfc\xecr\x96\xf9.Z\xb1<>\x0cC\xcc\xe7s\x84a\x88\xe1\xd90\x83\'\x93F\xf0\
+"\xfe"\xf9\xbc=\xbc<^\x1fK\x0f\x00\xae\xeb\xa2\xff\xb0O\x1d_\xa6\xbf\xe9|\
+\x03%\x8e\x93}\xfe\xe2W\xd8\xfe\xc1>\x0c\xc3\xa0\xb7\xab\xfd\x83\xfd\x0c\xfe\
+\xde\xd7\xf7\x96V,\x19\xb4a\x18\xe8?\xecS\xbceY\x99h\x16\xe9+\xc3\x13\xf9\
+\x8e\xe3,\xc9\x17\xd9S&\x8f\xa57\x0c\x83F"\xd1Sf\x9f\x0c\x94\xcd\xbd\xf0VY\
+\xf5\x81\x99\xac*2\xf9\xae\xeb\xa2\xdb\xed.\xed\x11\xc0\xcdm\x88\xd0\xb1{\
+\xc7d<\xc1\xfe\xc1~f\xaf\x99L&\xf0</W_QD\x15\xd9\xc3\xd2\xce.gt\x91\x95\xc9\
+\xe3\xe9\xc9-\x90\x1d\x07\x89\xc8<y\xb2Pt\xfb\\r\\\x9d*\x07\xbb\xaa\xd8\xc8a\
+\xaf\xc0\x8d\xd3\xc8\xed\x07@f\xef \x93\xcb\xef5\xc4\x89"}e{X\x91=\x84V\x14q\
+E{"K\x0f\xdc$2\xfc8\xf2\xe4U\x85\xf4\xfe\xb3\x94w\xde\x06OPG0\xbb\xaa\xc20\
+\xcc\xec\x0f\xf3\xf9\x1cA\x10d\x9cF\xe8\x86gC\x8cF#\x84a\x88(\x8ahd\x86a\xb8\
+D\x9f\xa7\xafl\x0f\x13\xd9C~#\xb4U\xf7\\\x9e~p<X\x1a\x87\x88\xb7\t\xf0\xbei\
+\xe5!\xaa@YVi\xdb6<\xcf[\x8a\x1cQ\xe4\xb1\xfcy\xab\xb4J\xc4\x89\xeca\xb3\xd2\
+\xa6\x11g\xdb6TU\x15\x8e#O^]`#\xafY\xbd\xeb\x1a\xf8\x15\xc9ge\xf3\xf9|\xc9i\
+\x04\x8a\xb2DY}e\x11R%K\xac\x13q$\xebe\xef lD\xaf"\xe2x\xd8\x00\x9aW\xefkgQ\
+\xd7\x85Yi~I\xfa\xaa\xf8\xbc,\xb7j\x16\xca:O\xa4k\x15@|U\xb9r"\x82\xb2,O\x08\
+L5]\x8a\xbf\x02}U<\xa9\xcc\xb0YnQV\xccVfx\xf9\xc4yEY\xaa\xb0;\xc1v\x17$\xa0\
+\xb5\x8a^\x99m\xdb\xb0,\x0b\xc0\xcdsW\xe6VWbTU\xfe2\xfa\xaaxR\x99\x01n\xf6\
+\xa8\xa2\xac\xb8\xa9~\xe0}\xf7`gg\xe7f\xef\x1f\xb9\xd2\xceK\xef?K7\xb1\xb37\
+\x90\xa2\xce\x03o\x8a(\x8a\xa0}\xa6\xc14\xcd\xf7\xb5\xc2\x1f\xa6\x99\x16\x08\
+v\xf6V\xc7/A_\x07\xff\xf6\xed[\xf8\xbf\xfbhm\xb5`\x9a&<\xcf\x83\xaa\xaaX,\
+\x16\x00\x80\xf1xL\xf7\xca\xa6\xfau]\xc7\xb7\xff\xfa\x16G\xdf\x1dA\xfbL\x83\
+\xf7\xab\x97m\rI\x80r]\xe1\xaf\x0fL\xff)\xb3\x82X(ZIU\xf9e\xe8\x1b\xe0\xc9\
+\xef\xe4\x16\x99\x97\x157\xd1\xef8\x0e\x86O\x87\xb4\x08\xdd?\xecc>\x9f\x8b\
+\xc7\x9b\x03\xf5\x1c\x97\xd3AVU5\x1b)\xbc!M:\xcf\x02\x19\xb9\xfa\x1a\xe2\xcb\
+\xf8\xaa\xd2\xf1`\x18\x06F\xe3\x11\x1c\xc7\xc1|>\x87{\xe0V\xdaZ\x80:\x8f\x03\
+\xcc\x8a\'Y\x17\xb9\x92\r\xd9q\x1c\xe8\xba.\xcd\'\xa2\'t\xf4w\xce\xe9\xa4\
+\xc3\x9c\xc7Wf\x0f\xcf\xcf\xf3-\xd9_Q\xbe\x88\x9e\\WQ\xcb\xac\x95U\x92{4\xdb\
+\x1fco-\xa4/F\x9f\xc7\xae\'\x9d\xa4\xd6<\x1fO\xcf\xca\x9fL&x\xf2\xf8\xc9\xcd\
+\x06\xce\xe9g\xf1u\xe5\x93\x1a)\xe1[\xb2\xff\x1ad\xe5\xe7\xd1\x13\xbaU\xd427\
+\x95\xdf~|\x84/\xff1\x90\xe6\xf0\xde\xa7\xc2G\xdf\x1d\xc1\xb2,X\x96\x05M\xd3\
+2W]\xd7\xd1n\xb7\xd1\xdaj\xc1\xff\xddG\x1c\xc7t\x10\xae\xeb\xc24\xcdB\xfa\
+\xed\xedm*\xdf4M,~Y \x08\x02j\x02\xab\x9f\xe0\x93$\xa9%\xbf\xddn\xa3\xf3U\
+\x07\xbd^\x8f\xf25\xb5?\x8f\x9e\xd0m\x7f\xb1\r\xdb\xb6\xa1i\x1aTU\xc5\x8b\
+\x9f_d\xc6W\x96\xa0(\xcf\x1f(\xef\x0f\x0bUt\\\x92$p\xfe\xee\xd0\x8ew\x1c\xc7\
+X,\x164\x0bSU\x15Q\x14\xa1\xdb\xed\xd2\xc1\xb0\x1d\xe6\xab\xab\xabBz\xefW\
+\x0f\x9d\xaf:\xb0,\x0b\x9e\xe7\xe1\xe9\xf7O\x11\xc715\x81\xd5\xefy\x1e./.q\
+\xe0\x1e\xd4\x92\x1f\xc71\xee\xdc\xb9\xb3\xc4\xd7\xc4\xfe"\xfa(\x8a`\x9a&\
+\x00@\xd34,\x16\x8b\xa5\xf1\x95:\xee\xd5\xc5\xa3ME\xd9\x80\xf2\xeaB>\xea\xbc\
+):\x9d\x0e\x0e\xbf9\x84\xa6i\x88\xe3\x18\xbe\xef\xe3\xf4\xe4\x14\xd1\x7f"\
+\x8cGc\xd8\x9f\xdb0M\x13\x86a\xc04M\xa8\x7fS\xe9\xf3\xd1\xd5\xd5\x15F\xa3\
+\x11\x8e\x8f\x8e\xf1\xe2\xe7\x17x\xfa\xfdS\xb4\xb6Zt\xbfh\xb7\xdbH\xde%\xe8\
+\xf5z\x99\x15\xc9\x9e\xba\xb2m\x9b\xeaWU\x15\xc9\xbb$#\xbf\xc8\x1e^>\xf9\x10\
+\xbb\x1e\x9f>\xc6\xd5\x1fW\xd4\x1e\x91\xfde\xf2[[\xad\xa5\xf1\xf2r5M\x03\x80\
+\xca\x11Gj\x95\xb5\xf68\xbe\xdfe\xdb6\x8e\x8e\x8f`\xdb6\xad8\xb0\xfd4\xbe\
+\xd2@\xf6\x02\xb2\x1f\xf0\x95\x06\xbe?F\xce\x84\x90=iz>\xcd\xed\x8f\xe5\xd9\
+\xc3\xda.\xea\xa7\x89ZN\xac\xbe\xba\xf2\xd9\xf1\xb2\x0f\xf9\x00\x1a\xedq\xd4\
+q\xca\xf3\x07J\x9d\x8e\xb7L\xff\xadJ5_T\x0bd\xcf\x84\x88\xce|\xf0\x1d\xe9<{D\
+\xf4\xac\x9dl\xcb\xe9\xc9\xe3\'\xf4\x8c\xcb\xaa\xfa{"\xe7U\xe9\x1e\xb0=\xb9\
+\x8d<D\x11T\xed\xbfU\xad\xe6\xf3\xd5w2\x81y\xdfY\xfa\xbc\xfe\x1bk\x17\x89X\
+\xc2/\xeaFDQ$<\xc3RG>_\xcb\xe4\xcf\xe0\xc8D\x1c\xef\x9b\xa5[\xa5L\xe4U\xed\
+\xbf\xb1\xb5;R}\xe7\xfbcE\x11GnKy\xdfE\x1d\xe9\xd3\x93S8=\x07\xb3\xcb\x19\
+\xee}}\x0f\xd3\xf3)t]_\x8a \x99\x15\xcf\xda/+\xbfh\xbc\xfc\x19\x9c2\xfd\xa2\
+\x80\x12\x1eAW^]<\xcaMX\xae\xb3\xca\xdd\xbb\xbb\xb0,\x0b\x8b\xc5\x02\xc7G\
+\xc7\x08\xc3\x10A\x10 \x8ec\x04A \xac\xdd\xb5\xdbm\x9a}\xed\xde\xdd\xc5\xe17\
+\x87\xd8\xbd\xbb\x8b^\xafG\xb3/\xb2\x08Z[-Jo\x9a&\xc5\xf3\xdf\xf3\xe8\xed\
+\xcfm\xf4z=l\x7f\xb1\x8d^\xaf\x87\xe4]\x82\xd9\xbfg\x08\xc3p\xc9\xfe\xa5\xac\
+\x8e\x03\xde\xfe2\xf92\xe3\x05\xca\xb3J\xe5\xf9\x03Eyu!>\xb6.}b9\xe7\xe4\xb2\
+\xf0\xa4\xae\xe0S\xe5\xa4\xb0\x88\x9e=n.C/:\xe1\xec8N\xaa\xaaj\xa5\x93\xc6\
+\xb2\xf6\xf3r\xca\xe8\xf3\xf8\x88\xfe2\xbf\x94\xbe\xf4\xb1\x14}2\xd5|\x01\
+\xc4q,]}\x17\xd1\x8f\xc7c\x9aR\x93\xefE\xf4\xbc|bg\x1c\xc7\xd5\xba\x11;{\x80\
+7\x95\x96O\xe4\x14\xd1\x17\xf1\x01\x80\xf2\xdb\x8f\xa5\xb9F\xe5\xd7\xac\xd8\
+\xb7s*u\x03\xb8\xaa~Y\xf5\x9d\x00\xafG\xb6*\xdf\xa8\xba\xbf\x06\xfby\xfa">\
+\x99W\xb2j\xbd\x1fW\xfa>\\^u{\x1d\xef\xa5\xad\x03>\xb0\xfd2\x8e\xabuX\xa8\
+\xf6Kz\x15\xdb\xf3k\xa7\xaf\n\xb7\xc8\x9e\xda\xa7\xbcr\x9dWf\xac\xec`\x08\
+\xdd\xba\xe8\xcb\xe4\xd4\xc5\xf3t\x15\xed\x91\r\x8a\xb5\xbd\x03\xfe\xff\xf6\
+\xdew\x1e\xac\xeb}\xf0O/\xef\xaf\x01\xfe2/\xef\xd7\x81\x8f\xc5\x99\x1f\xf5\
+\xbf\xcb\x90\x85\xdb\xee\xccO\xff\xa0\xa6&|\xfa\x97P7\xf0?\x82^\xa4B(N\xc0\
+\x01\x00\x00\x00\x00IEND\xaeB`\x82m\xe8\xcc)' )
 
 def getPythonPoweredBitmap():
-    return wxBitmapFromXPMData(getPythonPoweredData())
+    return wxBitmapFromImage(getPythonPoweredImage())
 
 def getPythonPoweredImage():
-    return wxImageFromBitmap(getPythonPoweredBitmap())
+    stream = cStringIO.StringIO(getPythonPoweredData())
+    return wxImageFromStream(stream)
 
 #----------------------------------------------------------------------
 def getGreenDotData():
-    return cPickle.loads(zlib.decompress(
-'x\xda=\x93KO\xeb0\x10\x85\xf7\xfc\x8aH\x01z\x05m\xe58\x8e\x93\x00\x8dp\x1c{\
-G\xbb@B\x88]\t\xa5PJ\x1f\x14(\xf0\xeb\xaf\xed3\xa9T)\xfa<\x0f\x1f\x9f\x99\
-\xfe[n\x92\xa3\xdb^\xc2#\xf7\x93I\x94\xf4\x8e\xa6\xb7=\x15\xb5Q\\\xea\x86\
-\x95:\xf0\xc4\xb3\x15VY\x11\xf8\xc6s\xaa\x1b\x95"\xce=3]K\x06.\x03\x8bR0\xe4\
-\xef=KmM\x8ex\xed\x99\xeb\xd2p\xf0\xd8s\xa3-o\xc0o\xe8o\x94@}\xdfs&\xac\xc9T\
-\xe0\xe3P/\x1aE\xf5#\xcf\x89\xd0Y\x82\xfc*\xe4k\xdbH\xc4/\xd1\xcfJ\x01~\xf2\
-\\8=\n\xf92\xe8\x13V\xe7E\xe0\xe7\xa0G\x98\xa2A<\x0e\xfd\x9d\x1f\x89\t\xfc\
-\x17\xfa\x89R\xa6\x88\xef<\xe7N_\xc1\x02\xa7\x94_p\xf00\xf8\xe7\xee\xb3\xb8\
-\xbf\x08\xfe\n#K\xd4?B\x7f\xadH\x7f\xebYkg\x0f\xf2?=\x0b\x97\x9f!>\xa7\xf7\
-\x19\x89\xfe\xbf\x98\x97\xe64\xaf\x17\xaaWT\xffJ\xfe\x98\x04\xbc\x82\xff\x86\
-\x93\x7f:\xf4\xd7\xba\xf3\xe7\x1d\xf7\xd9\xce\xff\x0f\xe8u~!~\x8fy9\x7f\xc0W\
-\xf0\xaf1\xe4\xf7\x96\xea\x8d\x80_\xd7\xf0C)\xba\xff\x0b\xfb\xa18\xedG\x1e\
-\xfcs\xef!?N\xc3|D#\x0b\xe4\x0f0o\xc3Ho\xe4x\xbc^\xcd\x02\x9c`\x18\r\xa7e<Cr\
-\xc99\x9a-=\x1b7|\x838\xa3e(R\x88[\xd0\xf0;\xf1\x0f\x9ek\xb7\xdc5xCf\xd54\
-\xeco,{\xc9i\xd9/`\x9eU\x19\xf8\x07\xcb~0#\xa3\xb8\xa1\xe1\xad\x83\x1ea\xb4\
-\x01O\xbb\xb8\x04\x9fc\x99j\x99\x83\x05\xdeg\xbb\xf7%\x18\xbe\x92t\xdf\x0cf9\
-\xf3\xf0\xe7\xbd\x83>\xa5XgV\x14\r\xef\xd7\xfe\x13\xd1\xc1\xe4\xfc:>>9=\x1c\
-\xac\xcfF\x83\xcb\x8b\xaa\x7f5\xa4\x83\x84\xa7"\xabd.\x0b\x1c\xac\xcb\xd1\
-\x80m\xab\xfd\xec\xe3s\x82\x8d\xfbz\xddl\xa7}\xb9{\xaa\x9e\xe9 \xdel\xfb\xd9\
-|?\xab^\xb0#\xa1\xa4\xbf\xd8\xcd\xde\x96h\xfa\xc7\xe3\r\xcb\xe6\x8b\xf9\x0f\
-\xdd\xd2~?\xc6+\xb6}\xbf\x19w\xc2\xda\xfan\x14\xc7z|P\x1aE\x0fJ\xb5$}\xf8\
-\x1f=J\r\xe2' ))
+    return zlib.decompress(
+'x\xda\x01\xb8\x01G\xfe\x89PNG\r\n\x1a\n\x00\x00\x00\rIHDR\x00\x00\x00\x0c\
+\x00\x00\x00\x0c\x08\x06\x00\x00\x00Vu\\\xe7\x00\x00\x00\x04sBIT\x08\x08\x08\
+\x08|\x08d\x88\x00\x00\x01oIDATx\x9c]\x92?kTQ\x10\xc5\x7f\xf7\xeeCF\x0c2H\
+\x90\xab\xb1x\xfe)^\x08\xc8+,"6\xafL\x99\x8f\x13H\x13\xbf\x81\xe5\x16\x16),\
+\xb6L#naa\x111\xe5\x16"\xdb\xc4\xdc\xf2\x11\x122\xc5\x1a\x07\t\\\x8b\xdd\xd5\
+$\xe70L3g\x869\x9c\x10\xe2\x80\xeb\xf8\xfd\xe7W\xc9g\x19\xa9\x84\xa7\x0f\x9f\
+\x07n!,\x05\x17\x97\xe7e\xef\xf3\x1e\xa3\xd9\x08\x1a\x10Q\xd4\x95\xedj\x9b\
+\xb7/w\xc3\r\xc1\xc9\xe9q\xe9>t\xd8+C\x9f$\xd2j\x8dV\x8aV\x8achV\x86\xf5;\
+\xee\xde\xb9\x17"\xc0\xcex\x87\xfeE\x8f\xac*\xaa\x8a\x8a\xa0\x95"(\r\x9bP+\
+\xc3~\x08@<9=.#\x1b!*\x88\x08"\xe08\x00\xb2\xa8\x96\x96\x03\xbepqy^\xe2\xf8\
+\xfb\x18V\x00Y\x08*EH8\x86\x03\x86\xe18)%\xb2e\xe2\xf2\x19\xa9\xfe;!\xf8\x82\
+\xfd\xa2\x1b0\xbf\x1c\xbb\xa6\x83\x19\xf8\xccqw\xfc\xca0\x0c\xb9F\x80|6\xa5^\
+\xa9\x89\xeb\x8f7BK\x8b\x9b\xe3f\x98\xcdE\xfeow\xcf\x94\t\xed\xac\xe1\xd1\
+\xfd\xb5\x10B\x1c\xf0\xed\xe7\xd7\xd2\x1dtH#H\x92\xb9SI\x91J\xe1\xca\xf1\xec\
+\xec\xa7}\xd6\x1fl\x04B\x1c\x10\xe2\x80\xa3|T\x9a\xf7M\x91\x91\x14=\xd4\x92&\
+\xa9\xa4I*[\x87[ej\xd3\xb2\x9c\x0b\xb7\xa3\xf1\xe9\xc7\xc7\x92=\x03\xd0j\xcb\
+\xebgon\xc4\xe3/\x13\x86\x94tcF\xf6\xa5\x00\x00\x00\x00IEND\xaeB`\x82[\x05\
+\xbdE' )
 
 def getGreenDotBitmap():
-    return wxBitmapFromXPMData(getGreenDotData())
+    return wxBitmapFromImage(getGreenDotImage())
 
 def getGreenDotImage():
-    return wxImageFromBitmap(getGreenDotBitmap())
+    stream = cStringIO.StringIO(getGreenDotData())
+    return wxImageFromStream(stream)
 
 #----------------------------------------------------------------------
 def getmeatballData():
-    return cPickle.loads(zlib.decompress(
-'x\xda\xcdZmw\xda\xc6\x12\xfe\xde_\xb1\xb5\xb1\x1d\x03\xd9"\t!\xc9\xd8>\xd6\
-\x0b\xdc\xc4\xb1M\x127\tMO\xdc\x10\xc7\xb1\x818\x10L\xdc\x84\xbc\xfc\xf6;\
-\x9aY\t\t$\xb1\x02\xb7\xa9\xf6\xb4\xc7LV\xbb\xcf\xce<3;;\xda{\xef\x87\xca/\
-\xa7[\xa6\xc6\x8c\nS\x14\x85\xa9[\xbftN\xb7\xd6\x19;g\xce\xfb\xcey\x1f\x7f*\
-\xfe\xcfu\xaf\xe1\xd5\x1a\x06\n\xb6Q\xe0x\xb6\xed\x90\xe0\x19\n*\xfec\xa2\
-\xe0w\x14\xb8\x15\xa7\xe96Q\xf0\x10\x05UU\xb34\x05\x05;\xdc\x17(&\xb4\n\n\
-\xc6,\x14\xd0\x18\x87(\xb0\x1d[\xb1\t\x96\x19\xe0\x00$(h\xd1,\x8a\xab8\x1e\n\
-\xbeN{4Pp\x14\x003\x05\xb0/(\xd0U\xdd\xd6iP\x8e8\x9a\xcd\x064\x14\\P\x8f*\
-\xf4\xa1Am\x16\xf4h\xd2j\xf7\xf0\x15\xb7\xe6\xd5\x04\x8eM\xec\xd1hz\xb6PPU\
-\xbc\xd24\xc4+]Z\x8bg[6\r\xda@\x81\xa6jU\x8d\x80\xd5Q\xa0*~C\xc1\x1f\xe1+\
-\x8e\x8e\x82\x01\xcdb\xf8\r\x05\xfb\xb4|\x1b\x9a\x8b\x82cR\xb2]u\xab(X\xdb\n\
-_i\x1ak~\x0f\xc6\xc5,\xbaJ8,\xc2aiV\x95\xf4q\x8f\xc6p\xab\xd5*-\x8e\x05k\x81\
-\x87,\x87\x02C\xaf9\x86\x86\x82\x02\x8d\xe1h\xbaFH{\xf4\x8a\xd1\xd0\x1b4\xcb\
-#B\xea\xbav\x83f\xf9Fv1}\xc6\xa0`\x03\x81i\x9e\xa6h\xf4\n\'\xe8\x8a\xa7x\x0e\
-\n\x9ad\x17\xb0[\x8d\xa6}\x1b\x8ca\x8a1\xbe\x0b\x06\xa9\x8a`PG\x90\x0e\x1a\
-\xad\xe5j\xfa\n\xf58\x08_\x11Z\xdf\xe7\xc4\xa0\x86!\x184\x0c\xa6\x85\x86\x82\
-_Q`\x9af\xcd\xa1Wj(\xa8)\xba\xa3\x93\x82\x1e\xd0j\x1b\x9e\xea\xd1j\xcf\x821@\
-!((\x93\xb1\xc1\x08\xc2\x1b\xda\\ \rh\xf9!\xa0\x94#\x184"\x9fS\x1c\xcb!\xe8-\
-\x1e\x08\\\x0b\x05\x7fb\x0f\xcb\xb1<\x9b^yJ\x02\xd5\xd4M\xe2\xc7\x80\xd3\xa0\
-!\x83\x1c\x1aT\x07\x96\x91\xd6\xf7\x08X\xc3o(\xd0h\xb5\xa82\x14Thq\xaa\xa3;4\
-\xed--_\xf3\x1b\n^\x91\xc0\tW{M\x83Z~C\xc1GA:\xdf2(x!V\x1b\xba\xd8\x89\x80n\
-\xe9&Y\xff\xf5\xb4\x07)\xd9 S\xbaJE\x18{\x83\x90\x82-M\x9aeW\xac\x16xH\xaf\
-\x14iP\xcb\xb2-\xea\xf1[`\x17\xa3J=&D\x07?\\\x90\xc6\xee\xe3\x18\xa6k8\x06\
-\xe1X\'~\xd4\xdc\x86`\xf2%\xad\xd6\xf0\x1b\n^R\x0c2\xc1+Ip\xe3\x0bN\x06\x1f.\
-\xf0\xd7_\xe4\xd6\x15[s\x89O\xe7\xd4\x7f\x1aMJ<\x14\x90\xfe6i!\x168\x03\t\
-\xea\x14;+a\xa8\xdc\x15~\xdeT\x1a\x84\xfb\x7fd\xa5\xa6\xe7\tK\xbf\x17\xcc\
-\x0f\x89~?\xf0QC(\xf44\x10\x04\x81\xb0OH}\xe2\x93\xe9?\x93\xfe*\xa6f\x12\xd2\
-\xe7"f\xf9\xfeC4\xa6i5\xb7\xe2VQ\xa0\x8bA\xc3@\xf8x*\x10F\xa1\xc5\x81\xbb\
-\x89i\xdf\x89\x18\xee\x06\xfa\xf8$\xf8dh5\xb2\xc1\x13rk]kh\xa4\xc2\x1fd\xc7J\
-\xb5Q%\x05\xb9\xc1,\x01[J\x14\xb3,C7\xc8\xf4\x07\xc2\xcf\xdd`/yC\xd3\x1a\x9e\
-"\x82i\x99\x809\xa1\x19\n\xc1\x8eUQhq\xaa\xd8K\xaaAh\xf8\x9bf\xa9\xd4\xf4\
-\x1a\xd9\xc5\x13\x91\xc0\xf1\xdc0\x98\xde\xd1\xc3Y\x1b\xdb\x80\xdd\xfds\x07P\
-[\xac\xc4\x0e\xd8zb+\xb0\r\xb6\xf9_\x80ZL\x858\xdb\xf6\xee@\xcfKB\xbd\xcf\
-\xea\x92 \xa3m\xe7\xdf\x86\xba\xcf\xcaK\xc0\x9cRb\xf7\xdf\x81\n)nNh\x1b\t$\
-\xd1\x96\x00Z\xcd\x07U[B\x87:\xab%\xc8\r\x88\x12y\x9e\x01\xf8\x854T\x93YK\
-\x98\xbb\xce*\xecc\xca\xbf\xfd-\rTg\x170\x8e$\xd4\xd1\xd2\xdc\x1cg.D..|a\x9f\
-d\xb9\xda]\x00g\x18\xf9\xbb\xc3nr,\xe4-{\xb7\x10h\t\xfaI\xbaUQb\xcaK\xd0\x1e\
-A,\xb3\xab\x9cz73g\xdf\x80\x1e=9\xa8}\xa9\xe9\xde\xb3\xc9L\x04\xcd\x03\x96g\
-\x02\xfd,\x17\xac\x92M\x7f\x039D\xf0\xb4\xd9-\xfc6V\x88\xb4\xeb\xc2\xc0\xc9@\
-\x0brq\xf5M\xca&\xc9\xd8\x07\xf0\xeb2\xbbf\xc7\xec\x04{:K\xed^\xd36\x99\x9b{\
-\x17C\xe3\x8d\xec\x16\xf0<qX\x97\xbd\x9c\x8b\x9e=f\x83\x05\x92\xe0~\x91t352\
-\xef)\xf3\x80\xfd\xbe\xf4\\\x0ej3\xc5\xdb\xd9\x8c>\x02H\x90\xe2\x8b\t\xd6\
-\x97\x8a\x08E1\xef\x03v\x08\xc1\xc9\x97\x8c\xe46\xd6V\xca\x80\xfb0\x10\xc5K\
-\xd2\xe1\t\x10":Y{\x05\x1a<\x828;\x82QJ1\xe8\x0b\xa1\xa6;\xc00\xa2Ou\xc6\xf5\
-\xfc\xdf\xbd%\x81\xde\x00\xb8C\x18\xedR\x84?\xc9t\xe5$e88\xe5\x86Z\x1c\x03G\
-\xd7\xc1\xff\xebs=Xn\x98G\xe0D#h-\x08sG\x89@S\xa1\xa6\xaf\xbc\'\x91\x02\xfa\
-\xcf8\x07\xd0\x13\xa0U\x1b`\xb6\x84F5\xf9$p\x981\xecc\xf6P2N\xcad\xb5\xcf\
-\x80\x97\x04s\x04\x01\xef\x12]P\xcb\x93\xaff\x83\xa8Ii\nN\xd6H\x90\xacX:d\
-\x7f\xb0\xdf\x11d\x17x\xaaB\xb4\x18c\xd4\x96\x86\x9a\xbd\xe7\x9f\xb3\xa7\x92\
-A]\x87\xb1\x1a\xa9\x9c\x1f\xc2\x96\xdd\x06\x98]h#\xd0\xa4\n\xdbI\'c\xe7J\x84\
-\x9a\xbd\xef|\x86\xb8\'\xeb\xd1:{\x91\xc0\xd9\xb7\xe0\x8aE\x84\xe9D\x80>\x01\
-\x1b\x18b\x06I\xa8\x83\x85y=\xcb\x91\xab2 B4\x91\xb9\x06>\xfe\x1a\x81\xd9\
-\xc5(\xfa\x83\x9d\xc5\x98-\tU\x93p\x99\xe3\x1c\xa7\x00\x06\x19)\xfd}\x01\xb0\
-\xba\xe8@]\x04:\x02\n\x94\x00\xe4o\x98\xf0\xac\xe7\x87zo\xe1\xf4\xa3\x85\x9a\
-\x9f\xd5\xec\x08M>\x8a\x98\x9c\xfc\xdd\x02\xc3\x7f\xc2\\7\xfeN[\x0e\xea\x8dT\
-\x16\x94g\x0f:\x84\xfe\xdb\x00\xb5\x88Z\xed"\xcc\x1f"?8N\x8c\x12\x96\x0cTsf\
-\x9a\xf9\x89\xc9@\x97s\xe9\xca|+Cho\xb1\xbf\x84\x8e8\xfc\xcd\xe10w"\xa2\x82\
-\nc\xd4R\xa9$\x01u\x94\x90\xe9L\xc3\xb9\x16n\xbb,\xa1^\xa2D@j\xa0\xcb\x16D\
-\xcd\xd73\xd3u\xc2\xfd);\x8e\xa7A]K\x8b\xa9\x83\xc8\xf1\x96$\x8a\xa0\xc84\
-\xbc\x0fb\x0b\x1a\x03+\xfb\x90m\xb6\xc0\xd0}\xb6\x15*\xa0(2\xcf:\xa6\xe6\'\
-\xc0\xd0\xf6\xccA/\xdez\tP\xd7\xe2Z-\xa5\xd2\xfbR\xa4\x80\x0c\x8fy\xaa\xd0\
-\xc5\x04\x12\xed\xe9\xe3\x01\xa4\x16\xb6\x11\x06xz\x0e#\x9aR!\xaf-\x02\xd4\
-\x0e\xf4\xc9\xd2\xeb\xfeb\x02\xdcf\xbc\x10H\x02\xbe\xbe\x82\xff\x7f\x9c;\x8b\
-u\x01\xe2\x03\xf6\'\x84\xa6\x92\x90}\x85Q\xfd\xe5=D\xfdj\x00\xf5\x1a~Uc\xef\
-\xcd\xc6\x80\xfeb\xa8\xc73\x9b\xe8\xec\x86\xeb\xe7\xe5\xe4HO\x80\x14\xdf\x81\
-\x8d~\xdc|\x1d\xe1z\r4\xb6\xc7\xbea\xb8\x8f>\xe7\x10\x05(n\x1bb\xa9\x03XP\
-\xf0\xbcL9\x11d@\x1d\xceA}\x1c\xe9\\\xc0!p"\xbe\x01\x7f\xbd`\x9c\xfbKx\x94x\
-\xc2\xbdIt\x0e\nSmN\xe7\xd1)\xd3\'\xabi\xd5D\xf0\xadH\xf9|\x80\xda\xed\x03\
-\x11Z\xa2.r\x8e\xae\x92\x1c\x97\x87\x89\xf5\xa7\x80H\xe3X\xc2\x17O\x82\xbay\
-\xb5j\x86\xfe\x1e\xaf\xaf\xf6\xd1\xa7I\xc7&0\xf1\x18\x0e\xdb\xc9l\xf7M9\xe0\
-\xf3\xf5Dr\xb7[\xd6\xe2\xc9\xae\xd5\xcf\x0bu \xd6^\x89\xbd2\xdd\x08/Y\xf6\
-\xa9\xec\n\xeb\x04E\xd8\xe7\x0b\x98\x12R\xf4e)q\xf36\x1fWw\xe6\xb8\xba\x03,\
-\xdaH\x81\xf2 \xac\xb0\xb4b\x8c\xa6\x7f}\x05\xee\xb6\r\xefvb&\xfd\x01V\xb1\
-\x85uL\xf8\xaf\x17\xa9\xd3\xe4"@q\x8e\x00\xbb\xa0\x97\x8bX-\xf4*\x92\x0b\x94\
-\xf8\x90\x1dp_\xcb\xf7\xa6K\xe1\xfe\xbf\x9e\x89\xb2\xd99D\xd2\x02\xdf\xe0\
-\xd1\x85F\xd3\xa2o\xd1\xc2\x0f\x0ff\xde\xe4\x0b\xa1v#\xe5\x9ebl\xad%\x1e\xdf\
-\x0c\xc8\xfc\x15\xdc\\\xb9(\x0fMi\xf4\x14\xf4\\\xe4iF\x8e\xdb\x86%\xe8U"\x07\
-8\xc7\x8e\xb7\xb81\xbe\x10\xb5\xa3z\x98\xccEW\xdf\t\xc3\x82\xcf\xe9"\xdf\xc4\
-H\x19\x04\x9f=\xdeG#\x0e"\x89\x90&F:\xa4o4<\xc9\xd4;\xf2P\x19\xee\xe1E0\xda\
-\xe2\xf4\xae\x16\xd3LW\x98\xd3\xcfK\xdf\x88\x04}\x9c\x91\x9e\xef-H\xc8\x17@\
-\xdd\xe4\x95\x1c\x19\xfe\xec\xe4~!\xad\x8by~\x9b/\xea=\x10^\x91|\x8e[P\x07\
-\xe8\xc1$\xde\\\x0c\xc8\xf7\xf9\xac\x07\x169\x93,\xa5\xd9\x08\xb4\x93\xa3\
-\xda*>\x8f?\x02?\xae\x8a:\xdc2@\xcb\x82\x81\xb2\x9f\x8b\xfc\x8d5\x9a\xacw@QG\
-2P\x8b\\\xcf\xc8r\x16\xb7!8M\x0b\xbc\x9e*\xcd2E\xcaf8O!t\xaeB\xe8\x03\xd2u\
-\x80|\x14x\x0eq\x97\x83+\xf9\x1c/I,\xb6\x1c\xc6\xe4\xc2\x0c\x81\x82"\xfd\xa6\
-<\xd4\xc79\xbeH\xa9x~-\x86\xe0\xc8:\xef2\xde\xba\x0e\x8b\x9b\xb7\xb1\xea\xc2\
-\x91\xc8\xad\xca\xf9\xbe\xb1&}G\xfd\x9e\xa0O\r\xe2\xf0>\x98\xff\xd9\\\x98\
-\x91\xa9\x0f\xec%~\x88\xab\xe4\xfd\x1c\x1c\x85\xf8L\xe4:u\x1e?bC\xce\xe4sl.0\
-\x1dg\xc6\xcc\xa9\xeb\\%\x1e\xc5s\x7f\xb9V#\xeb?J\xb9\x8a0X\xe2\xf3\xf0\xf4\
-\x0b\x01\x13\xa3\x97\x17\xe6\xa99\x0b\xec\xe5\xd8\xca?\x01\xcc\xf6\x82\x92dz\
-\xcd+\xba\x05\xf8\xa3\xd5c\x0bX\x02j<\xc7z\x12F\xc0\t\x84\xa5\x01\xd0\xe1@\
-\xca\xf1\xc6\x02N9\x12\xc2&\xb8\x1bM=\x7f{A\x01H\xe2cP9A\xb3c<\xd1\x17#L62\
-\x9d\xa7.\xd8\xabA \xdb\x01\x07\xac!\xc3\xa7\xe9\xde\x04\x0f\x96;\x9c\x92\
-\xa4\xa5oY\xec\xf3\xf9\xa9G\xe0\xf1g\xb1\xf8x4\xe3\x16\x93\xd4\xda\xd5\x10O\
-\x04Ogj\r\xc1g\xe4\xfaj\x17B\xba3\xae\xe4\x97"\x02}\\\xa7\xe8\xf1fIG\xeb\xad\
-zwe\'\x02\xb4\x1d\t\xf5w\xddZwq\xcdF\x15f2%\xbf\x01,\xd3\xe4\xee\xb1H\\]\xe8\
-\xe0\xb9\xfd2\xa1\xce\xba,\xb4\xf2\x12@\xa5\xa0\x96y;\x81\x81\x93\xb0R\xba\
-\x1aT\xf9\x9bA\x0b\xa1\xc2q\x8e\x9d\xb2\xcf\x89\x19\xa7\xb7\x82f\xa9m\xdf\
-\xdd\x950\x1f\xe8\x8b\x94\xfb\x16\xc7+^W(\xe7\xbc\'\x98\t\xb5\x05\xbb\xd2nxD\
-\xfe*u8\xfc\xe7\xee\x07\xceT\xadY\xecT\xdef[s\x91\xb6~\x070\x0b3\xe5P\xb9g-M\
-\xaboRo@i+\xc1\xbc\xc9\xcc\x9e\x96"@u\xa5Kb\xc9\xed;\x9e\x89\x7f\xc2U\xdb"?\
-\xcb\x01\xf3\xf2\xe7_`\xf6\x13\xec\xac\xf8j\xcd\\\x96\xf9\xa9w\xad\xa7[E_|\
-\xe2\xf5?\x04\xb5b\xa5\xf9;\x82\xca\xff\x0f\xfc\t^\xb5' ))
+    return zlib.decompress(
+'x\xda\x01^\x0e\xa1\xf1\x89PNG\r\n\x1a\n\x00\x00\x00\rIHDR\x00\x00\x00S\x00\
+\x00\x00F\x08\x06\x00\x00\x00\xb0\xa9\xa8(\x00\x00\x00\x04sBIT\x08\x08\x08\
+\x08|\x08d\x88\x00\x00\x0e\x15IDATx\x9c\xcd\\-t\xab\xca\x16\xfe\xde[\x15#\
+\xae\x18q\xc4\x88\x8a\x11G "\x10\x15\x88\n\xc4\x11\x88\n\xc4\x15\x88\n\xc4\
+\x11\x11OD\\\x11q\x05\xe2\x88\x88+"*\x10\x15\x88\n\xc4\x11\x11G \x8e@T *\x10\
+\x11\x88\x8a\x11\x11\x88\nD\xc4\x88\xac5O\x10h~ !\x7f\xed\xddkm\x11\x023\xc3\
+\xc7\xfe\x9b\xbd7\xfcG.\xa4\xc2\xbf\x8c\xf2\xa9\x80(\xf2\xfa7\xff\xca\xc1\
+\x18\xfb\xc4\x15u\xa3\xab\xcf\x9c<y\x8e\x11\xfd\x8a\x11\xfc\x0c\x91\x0b\xd1\
+\xf9:\xe3F\x87u\xe7\xa0\xef8\xa0_\xff= \xff\xe7\xa3%3x\x0c\xe0\x8dF\x07\x81\
+\xb7\x8f\xb4\x9e\x86(\x8a>]z?\x04L\x99\x03\xfa\xad\x06qF\x00\xdbh\xd0\x1f`\
+\xf40\xba\xf8<M\xf4\xdfK\x0e\x9e\xbe\xa4\xd0t\x03\xf4\x9a|\x08\x90\x000\xf6\
+\xc7 W\x04\xa6a \x9f\x17\x1f2gE\x17\x01Sd9\x9c;\x17\x86a@L\xd3KL\x01\xcf\x1b\
+\x81q\xde\xfa\x7f\xf2\x92\x82S\x86\xd1\x8f\x0f\x92R)\xcf\x0f\xe6\xe8\xc7\x08\
+Z\x8fc\x12\x85\xe7\x1e\xba&\xe3F\xc7\xe0\xaf>,\xc3\xd8{\xae\xe7y\xa0_8\x92\
+\xe7\xe4b\xeb\xc9\xf3\x1c\xc1Sx>0\x85\xc8`\xdeZ\xf0<\xef\\C\xb6R\xfeV \x8d\
+\x13dy\xbe\xffd\x00\xb2\xc8a\x9a&\x86\xfd\xc1\xd9\xd7"\xa5\xc4\xe0\x7fCh\xd7\
+\xfc<\x0e(\xfa\x1d\xc3\xb6\xacs\xac\xad31\xc6\x90w\x04s\x958\xe7\x88\x9f\xe3\
+\xb3y~\xe7\xde\x01c\x0c\xe3\x7f\xc6\x80\\Hu\n\x87a\xa8\x00\x1c\xcd\x8e\xe34\
+\x1e7MSQJO\x1a\xbb\x8d\t\x81\xca\x9e\xd3\x93\xee[.\xa4\x1a\xfe5T\x00\xea\xdf\
+\'\x81\xe9\xfb\xfeYn\xce\xfd\xee*\xc6\xd8\x1ax\xbc\xa7+B\xc8E\xc0\xac8{=\x1e\
+P\xcf\x1b)\x00\xaa\x98\xe5\xa7\x83\x19<\x05\xe7\x93\x14\xce\x15\xdd\x01\xdc\
+\xa0?\xb8\x18\xa0"\xcd\x8e\x06r\xecyk\xc7\x8f\x02\xf3\x10\xd5\xa6\x94\xaat\
+\xba-\x01q\x1c+\xd7u\x15\xa5T\x11\xca.*\x81\xfb\xf8\x18 \x8d\x1b}\xeb\xbf\
+\x83\xc1L\xd3\xa4\xf3"\xb5\x9e\xa6\xe4B\xaa<+\x94a\x9a\x8a\xf7t\xa5i\x9a\xb2\
+\xee,5~\x18\xd5cN~\x86\x8as\xfei`RB\xf6\xde\xb7(r\xe5y^- M\xe7\x1c\x0c&g\xdd\
+o\xbaXH\x95%\xf1\xces\x8c\x1b\xbd\xb4;o\x85\n\xc3\xee\xa0\xda\x8e}V\x07e[N\
+\xe3\xfd\x16o\xb9J~\xc7\xca\xfd\xee\xd6\xe76i\xda\xc1`:\xb6\xdbyq\x8eS.n\x97\
+4l\x82\x93\xbc\n%\x17rm\xe1m|\to\xef\xfb\xfe\xda\xfd&i\xaa\xc2 P\xfdA\xbf>g\
+\x12E\xad\xf8t\x063\x8e\xa3\x83\x16\x96$\x89\n\x83\xa0\xfe\xcd\x18[\x93\xba\
+\xf1\xc3Hi=\xad\xf5\x86\xe2x\xb7D_\x8a\x93D(1\x13j\x12E\xca\xf7\xfd:\xfci\
+\x02\xfbh0\x0f]\x94\\\xc8\xad\x18\xb2\x92\xc6J\xa5\xda\x1cY\xf5\x7f1\xcb?\
+\x14HJ\xa9\xf2}_\x85A\xa0\xc20\\\xd3\x10\xf7\xbb\xbb\x1f\xa3.@\x8e\x1fF\x07-\
+\x8aP\xa6\xe4BnI\x1ecL\x197z\xb98\xd7\xddi\x1f\xab1\x8ey\x90\x073!\xca\xf3<5\
+\x89"5\x89"\x15\xc7Q\x19\x8e-\x1f~\x17 \xe5B\xaaN\xdbIrE\xf6\x9d\xb2F\x94R\
+\x88i\x06\xdd\xb2N\xce\x1a\xc9\x85\x04\x00\xf0k~\xd4\xf6q\x1f\x8d\x1fF0nLH)\
+\x01\x94s\x05O!\x82\xc7\x00@\x99(\x19\xfe=\xec4\xd6\xdeD\x87{\xef\x1e\xbc\
+\xc0\xa2(\x00J\xc1\xff8\xf8\xd2-\xaa\x1e\xa4\x98\t\xf0\x9e~\xfa\x80\xe5\xa8\
+\x18\xfe5D\x92$\xd0{\x06\xa4,PH\x89\xe2\xad@\xf0\x14b\xf2s\x02\xe00 \x81\x0e\
+\x99\xf6C\xa5\xb2"\xb9\x90\xe8\xdf\xbb\x08\xc2\xf3\xa4\xe2\x8a\xb9\x04!\x80i\
+\x18H^\x8e\x93vJ\x08,\xdb\x86m;`_\x18\x8aE\x01\xcc\x0b\xc8E)\x00\xd1$F!sdY\
+\x06\xfa\x85"M\x0f\x9bggA\xad\x12\xf5c(\xcb2\xe8=\x1d\xc0y\xc0\xe4_(\xc4[\
+\x8e8I`\x18&\xd2\x97\xee\xf9IB\x19l\xcb\x84ug\x81_s\x14R"\x7f\x13\xcb\xff(\
+\xb2$A\x9ad\x90Wef>\xcf\xf3\xa3L\xcaN\xc9\xd4\xbe\x1e_\xb7\x19{\x1e\x0c\xdb\
+\x86\xa1\x9fK5\x97\xb6x& %\xa0\xf7\xb4\xbd7L\x08\xe08e\xc6_\xd34\x14R\xd6\
+\x92\x08\x94@\xa6K \x8b\xb9\x80\x94\x12\xe9k\x0e\xb9,3\x8f=\x0f\xfds\xa8y\
+\x9e\xe7\xe0\xd7\xbc\xf3@\x9bd\xdc\xe8\x88\x93\xe4h3\xd1F\x8c\xb1\x1aP\xfe\
+\x85\x96\x00m\x90\xa6i0n\rh\xdc\x86qK\xb7@\x04J\xb5\x16\xaf\x02Y\x96\x82P\
+\x8a$\xcd\x1a\x9de\xe5\x00\xbbP\xab\x9a\x9f\xa2\xe2\x00j\xbbf\xddY\x88~E\'\
+\x8d\xb5Jy\x9eC\xfb\xaa!{\xcd\x90\xfcN\xa0\xdd\xbeK\xbem;\xb0,\x13\x94R0FQ\
+\xc8\xf2|r\x05\xc8E)\x89\xc5[\x8e,\xcd r\x01\xc8\x02\xf4\x0b\xc3d2)\x9d\xe6\
+\x89\xd4*\x99\xb6e!\xfa\x1d\x9f4\xf8$\x8a\xa0\xf7\xb4\x93$\xbc\x8d*\t\x8d~\
+\xc7\x98\x84!\x0c\xc3x/\xb0m\xa8rul\x12E\xc8\xa6\x02\x8c20\x8dB\xce%\xa2_\
+\xd1Ns\x11\xc71\x8c\xdb\xfd\xb5&`\x07\x98\xec\x0b;\xf9iQB\x90\xcf\x8b\xb3\
+\xab:P\xdaO\x7f<\x86}\xef \xfe\x19\xad\xb5\xd3\xd0%\x80\x84R`^ \x08\x02L\x96\
+\xdaa\x9a&\xc8\x1f\x04E\x9ew\x8a\n\x0c\xc3D\xfc\xdcM\xb3\x1a\xc1\x14"\x83\
+\xf6\xb5\xd9qPJ\xf7\x82\xbcz\x8e\\H\xf4\xfb\xfd-\xb3A\ti\xb4w\xbb\x88\xf7t\
+\x0c\xfa\x0e\xf4\x9e\x0e!(8\x97\xb5\xd4\x94\xfdI\x02\x9cr\x88\x99@*R\x04\xc1\
+\xa4\xf6\xfa\xb6\xe5\x80^\x13`.\x91\xcf\x8b\x83LOg\xbb\xd9\xb4-\x9aD\xcdI\
+\x8d\xb6\x8d>\xef\xe9\xf59\xdeF\xf6\xb9\xca[\xae\x8e3\xe8\x0f\x1a\xc7\xc9\
+\xa6bkN\xde\xd3\x95\xe7y*\x0c\x02\x15\xc7\x91\n\xc3\x89\xca\xdfvo\xebL\xd3\\\
+\x1bc5wzL\xce\xa1k\xfe\xa2Q2\x83\xc7\x00\xfd~\xbf\x11|1\x13[\x95=)%\xe8\x1f\
+\xb4\xfe\x9dM\x05\xb8\xc6jS!\x17r+\xd8n\x1a\x07\x004\xdd\x80|\xcbaY\x16\xcco\
+&4\xc6!\xaf$\xf2|9\x8ei\x83\xb1w\xb3\x11\xfd\x8e\x91\x0bQzoM+\xc7X\x86tZOC\
+\xbf\xef"{\x15pl\xa7\xd1\xf6yC\x0f\xa3\x7fv7*\x14\xb3\x1c\x84\xd1\x9d\xe7\
+\x00-\xde\\\xbc\x8a\xd6\x0b\xc4\xeb6\x08\x84\x10\xb8\xdf\xddZ\x95\x8by\x0e\
+\x80-\xf7\xbb\x80s\xe7\xae\x85I\x94\x10\xd0\x96Rk8\x1e#}\xcd\xa0i\x1c\x00 !Q\
+\xc8R\xd5\xf85_\x03r\xf2\x14\xc2q\xdd\xfaw\xa5\x8e\xbaf@7tX\xa6\x05\xb9(\x90\
+\xa5\x19`7\xab\xaa7\xda\x0ff6\x13\xd0\xd9\xfex\xb9qo\x9e\xbf\xb5{7B\x9a\x9d\
+\x89\xef\xfb\xad\xe7V\xdd\x1d\xfd{\x07\x00\xa0\x19\x06\xda\\\x92n\x1a\xa0\
+\x94"\xcf\x0b\x00\x04\x842\xe4\xb3\x1c\x93\x9f\xd1\x96\x9d\xd3o\r\xb8\xae[\
+\xcfc-%\xcf\x1d\xb8\xd0\xb5\xf2\xe6\xfd\x87\xa0\xf4\xc87\xed\x1ey_\r={\xcdv\
+\xfe_S\x93\xee[wV\xab\xfdhK\xd9\xcb\x85\xacK\xbfU6z5\x9bn\xde\x1a\xaa\x98\
+\x17\x8aq\xa6\xc2pR\xda\xc8\xe7\xb4\xd1\xfeM\xa2H\xb9\x8e\xa3L\xd3TZOSd9\x86\
+\xa6i\xads\xa7\xd3TE\xcbq\xe5B*\xcf\xf3\xd6\nur!\x95\x98\t\xe5?\x06\xdb\xb6z\
+Oie_R\xb8\xe2F5_\xb5\x7f\xad\x0fA\x96\xdb\xb5U*U\xdd\xaf{/+o\xcd\xbfj0\xbf\
+\xd9 \x84 }\xc9@\x97\xa9\xaex\x9a@\xbf\xa2\xd0o6lpQ4&Hv\xc5\x83\x9a\xa6\xd56\
+\x13\x00\xd2\x97\xa4\xde\x16\x9a\x96\r\x00\x08\x1eCx\xde\x10\x96e\xaeI#\xbf1\
+vF\x17\xe4\x8f\x8e\xa1\xdd\xa1\x92Y\x15\xee\x1d\xc7Qq\x1cm]+\xd2L\x89\x99\
+\xa8%5x\nT\x92$*\x8e\xa3\xb5.\x8at\x9a\xd6\xc9\xe1\xa65\xb4\xd5w\xaa\xda\xd2\
+>.\xe6E}M\x92$J.\xa4b\x8c5F\x1cr!\xd5\xf8G{\x02<\x0c\xc3Ns6\xda\xcc.\x92\x19\
+E\x11Ls\xbb\xbf\x88\xf5\xde\xfb\xcf\xf5e\x92#/\nd\x99\x80;xwR\x84\x94\x01\
+\xb4ug\xa1x\xdd\x96\x08\xdb\xb6\x1b\xe7\r\xc3\x10\xe4\x8a x\x0cP\xec\x90TBH\
+\xddD\xa6\xdf\x94\xeb\x18\x8fFp]\x17\xba\xb1\xbd\xee\xfe\xb0\xbd\xa9K\x9e\
+\x12g\xb6\xf5\xff\x00\xa8\xa5\xaez\xca\xf1\xafm\xe9\xac\xb8j{Y\xbd\xbek\t\
+\xa0-\x06$\x84\xd4uw\xdf\xf7\x95s\xef\x94\xe5\xe2y\xb1\x15\xb3Vct\x9d\xcfu\
+\xdd\xc69\xbb\xda\xccF\xc9d\xb4\xdd\xbbU;\x1b\xc7v@\tA\xbccK\x16<\x06[v\xae\
+\xff\xbfu\tH\x9e\x13$\xcfq\xe3\xf5\xc6\xcdz8\xd2\xbfw f\x05\x06\xf7}\x14o\
+\xa5\x94\x86O!\x92\x97t\xcb\xd3\x0f\x87}\xa4/)\xe4\xdb\xfbn-}I!DV\x1e\xcf\
+\xb7wq\xeeJ\x98\xb5J\xd5\xf6t/\xed\xf2\xcaM\\\xd9LQ\xe4j\xfc0R\xb6\xed\xa8\
+\xc1\xf7~\xe3\x93\xdal\xbc\xaa:\'\xd2i\xa6\x1c\xc7Q\xd9KZK\xae\xf5\xcd\xdc\
+\xf6\xd0/\xef;"\xe7\xdeYk\xb4J\xa7\xa9\xb2\x1d[1J\x95\xa1\x1b\xadR]\xfb\x81o\
+\xeb\xbb"\xd2"\xb1\x86nl\xdds.\xb2n\x9a\xd4t\xb0\xa9\x04\xab\xf5\xb45q\xdf\
+\xack\xa7\xd3\xed\t7\x9b\t*\x15\x8f\x7fE\xf5\xb6R\xa4Y=~\x9b\xc9\x19\xff\x18\
+\xa98\x8e\x94x\xcd;\xdd\xd4\xaa\xba\xee2\x19M\xd76\xd5\xeb;\x9b\xa5\xa6\x83\
+\xe94}\x07\xc0u\x97{\xe2P\xe5o\xefvI\x14\xf9Z\xa9\x961\xb6\xf3I\x9b\xe6\xba\
+\xe4\xf1\xafZm\x83\xc5k\xae\xf2\xac\xb4qb&j\xbb\\\xdf\xe04U\xc1SP{\xd5\xcd\
+\xff\xe5B\xaa\xec5U\x9e\xe7\xad\xad)\x0c\xdec\xca\xd1p\xb8\x06\xd0.\x0f\xbd\
+\xd9uw\x12\x98\xd5\xd3\r\x9e\x02\xe5\xfb\xbe\xb2\x1d{gP\xdb\x95\xdd\x16\xc7\
+\xb6\xa9\rdi\xf4\'Q\xa4\xd24\xa9\x1b\xa6\xaa\x87v\xe8\xbcr\xb1]\xc3\xef\xca\
+\x9c\xf3\xe3\xc1\xccE\xa6\xe2_\xd1\xceX\xf3\x12,\x17\xb2n\xc6\n\xc3P\x85a\
+\xa8\xe28R\xa6u\xfa\x83\x143\xb1\xe6\x07\x0e\xe9\xb8k\x8aI\xf7\x82Y\xccr\x15\
+\x86\xa1J~\xc7\x8d\xa2~i\xae\xd2r\xc5,W\xc1S\xa0\x9c\xfb\xf6\xf0\xecP\xf6}_\
+\xc9\xb7\xa2\x06r3E\xb7\xef!w\x06\xb3\x98\x17*I\x84\xca^R%Wb\xb5$M\xcfv3\xfb\
+\x98\xf7\xf45\xfb\xb6\xaa\xd6\xe7`\xd3\xb2\xb7\x9c\xd0\xea\x0e\xcb4\xcd\xd2\
+\xcc4t/\x1f\x04\xa6x\xcd\xb7\x02\xde\x8a\x8f\xb1O\x87\xb2\xe3\x94!O\x1cGj\
+\xfcc\xb4\x02\xe8\xe8l-\x83\x8e\xedn\xddO\xd5\xf3\x04\xbc;\xa3\xd5c@i\xe3\
+\x0f\x02s\xd7\x9f\x97Tu\xce\xb8\x1a?\x8c\x94H35\x89\xdem\xf4\xf0\xaf\xe1Y\
+\x1e\xe8j\xf6\xbf\x8ao7\xc1Z\xe5A\x7f\xb0\xd5\x0e^E\x18g\x01\xb3\x98\x9f\xb7\
+\x03\xad\x02\xc6\xb6\x1c5\x89\xa2\xda1l\x02\xb6\xaa)\xd9\xf3q\xe6F\xd3\xde\
+\xbdw\xd5\xa2\xd8\xb6]4nt\x05B\xd6R\x86\xbc\xb7\xdd\xb3~\x12\x98r!\x95mus\
+\x04\x8c\xef\x97 \xce\xb8\xf2<O\xa5\xd3T%I\xb2\xcc\x01l\xdb\xa9\xcdp\xe4d-X\
+\x8e\xd7\x16\x1e5I\xff\xae\x9c\xc3\xd1`\xb6\xddL\t\xde;\x10\xc1S\xa0\xe8\x0e\
+\x95\xa4\x84(\xdf\xf7\x95\x98\x89\xb2w\xfd\xeb\xfe\xb8\xcf\xba\xb3\x8e\x8e\
+\x0f7Y.\xb6\xb7\xb7\xadkmy\x01\xe0,`6I\'\xe7\xbc\xd1\xfb5\xaa\\O\xabw6\xe7\
+\xf6\xd4]\xb8\xda}\xad\xae}\xd5\xa6nr\xd7\xfc\xe5Q`\xeeS\xb5\xb6\x85QJU\x7f\
+\xd0Wb&T\x1c\xc7;\x1d\xc0\xb9yu\xae\xcd\xa0\xbdZ[S\xf0\xbe\xb9\xed\xbd\x08\
+\x98\xbb2I\xe6\xadQ/\xb0^,!erb&T\xf0\x14(v\xa6\xf7|\x18ck6\x8eR\xaaxOo\x0c\
+\xa3\xe8\xb2\xbd\xbaI\x18\x06\xfd\x81\x8a\xc2\xc9\xd6\xf18\x8e\x8f\x06\xb3\
+\xf3\x07O\xdc\xef.F\x0f~c\xa7X\xbc|\x97\x9b^s\x14E\n\xc6\xd8\xf2=o\x86\xe8W\
+\xb4U\x83g\x9c\xa1(P\xd7h\x0e\xa1\xcd\xea\xa8qk\xc0\xb81 \xe7\x12r.\x91\x179\
+\x08\x00c\x99\xc5g\x8c\xc1\xbc1\xd7\xae\xa1\x84\xc0\xb4\xcb\xba<cU%\xb4\xccg\
+v\xed+j\xa2\x83^\x91\x16\xb9\x80v\xad\xed<\x87s\x8e\xb1\xef\x83Q\x8a\xf1\xc3\
+\x18\xe1SY\x18\xe3=\xbd~\x10\x94\x10\x14@Y\x95k J) \xe5A\xed3\x94RX\x96\x05\
+\xe3V\x07\xb9\xa2\x90o\x05\xf2\xa2h\xad\x893V\xd6\xf5\xabd7\xe7\xbc{I\xb7\
+\x8d\x0e\x15\xe5]\xefMj=M\xc5q\xf9\xc6\xc2f\x92u5\xee\xdb\xc7\x9c\xf3\x8b\
+\xbd\x1e\xdd\xc6\xabo\xe7^\xdcf\xaer\xd3\xce\xa8\x042n\x0c\xc2\xff\xed\xdcTe\
+\xfd00\xe5b=\\b\x8c\xa9\xec5\xddY.\xfd\xb7\xf2)\x0e\xe7l`\xca\xc5{\xb7Y\x92$\
+\x9d\xdew\xdc\xf5N\xf9\xa5xW<yN \x0f\xf2\xe6M\x14>\xf8\xc8\x96\x1dk{{6\t\x81\
+\xf7\x8f\xb7\xd63\xf9\x99tHGpW:\xfa\xeb1\xc9s\x8c\xc9s\x0c\xbd\xa7\xc1\x1b\
+\xec\xff*\x8bnZ\xe8\xf7\x07\xf0G#\xd0\x96\xe6\xafKPS(\x17\x85\x93\xb3\x03\t\
+\x1c\xf9\xf9\xb2\xe49F\x96\t\xd8\x7f:\xa0t\xd9\xe9\xf6s\x02\xc7qv^g\xddY\xc8\
+\xa6\xd9\x87}}k\x93xOG\x1cM.\xf6\xcd\xb8\x83\xc1L\x9ec\x88Y\x0e\xcb\xb6@\xc9\
+zq^\x08\x81\xe1\xdfCL\xc2\xc9Y\x17y\x0e\xfa\x88o\xc4\x1d\x04f\xf5\xd5*\xfeU_\
+k:\xdd\xa4\xc9\xcf\t\x86\xc3\xe1\xa7I\xe0*\x197:\xfc X\xeb\x90\xbb\x14u\x063\
+\x9b\xa6 s\x02nt_\xd4\xe8\xc7\xe8C\xbe\xc0\xd5D\x94R\xf8\xbe\x0f\xfb\xcf\xe6\
+\x06\xb0KPw\xc9lj\xc8\xecH]\xec\xe9\xb9\x88q\x86\xc9c\x08\xdd<\xbf\x83\xd9G\
+\xdd\xbd\xf9\t\x1e\xd8\xfe\xd3\x86\\H\x88\xd7\x1c\xce\xfde@u\xbf\xbb\xcb9\
+\xc4\xa7\x00\t|\xc2\x97]+\xca\xf3\x1c\xc1c\xf9\xb2\xd31q\xa7a\x98\x18zCX\xdf\
+\xcc\xf3/\xeeH\xfa40\x9b\xa8\xc8\x04\xa2t\xfb\xe5U\xb9\x90\xe0\xd7\x0c\xfa\
+\x8dy\x8a\x82\\\x9c\xfe\x0f\xd2\x8c\x96\xb7\xe9$\'\x8b\x00\x00\x00\x00IEND\
+\xaeB`\x828\x18\x10Y' )
 
 def getmeatballBitmap():
-    return wxBitmapFromXPMData(getmeatballData())
+    return wxBitmapFromImage(getmeatballImage())
 
 def getmeatballImage():
-    return wxImageFromBitmap(getmeatballBitmap())
+    stream = cStringIO.StringIO(getmeatballData())
+    return wxImageFromStream(stream)
 
 #----------------------------------------------------------------------
 def getfulltwistedData():
-    return cPickle.loads(zlib.decompress(
-"x\xda\xed]iW\xdb\xcc\x0e\xfe~\x7f\x85x\x81\xb4e\x11\t\x01\x12\xd6\x03a\t\
-\xfb\xbe\xa8\xf4\xd0\xb2\x85\xb0\xef\x10\xa0\xc0o\xbf\x9eQKd\n\xad'\xb6c;X:\
-\xf7\x9c\xfbNI2\x1e?\xa3\x914Z>\x1f\x9f\xa7\xfe\xb7\xf4)\x9dJ\x82\xfa_{g\x17\
-\xb4\x7f\xfa\xdf\xd6\xd2\xa7z\x80\x1d\xc8\x1do\xed\x1c\xe9\xfflS\xffY?\x9aV\
-\xac\x07\x8eH\r\x0cw)\xd6\x03\x0f\xa8\x06\x86\xba\x15\xeb\x81\x8c\x1e\xc8\
-\x0e+\xd6\x03C\xfa#]c\x8a\xf5\xc0\xbd\xfe\xd2\xcev\xc5z\xa0U\x7f$\xdd\xa9X\
-\x0f|\xd7\x03\xa9\xacb=\xb0\xa8?2\x96S\xac\x07\x92\xfa/FF\x15\xeb\x81-=0\x9c\
-R\xac\x07\xee\xf4\xcf\x0eu(\xd6\x03\xab\xfa;\xb2\x19\xc5z\xe0I\x0ft\r)\xd6\
-\x03\xa4?\xd21\xa2X\x0f\xb4\xe8\x81tR1?\x9c\xfeH*\xadX\x0ft\xe8\xbf\xd0\xcf\
-\xc6\xeb\x91\xd3\x03#\xdd\x8a\xf5\x00\xe8\x89\xe5\x86\x15\xeb\x81g=\xd0=\xa6\
-X\x0f\x8c\xe8\x8fd\xdb\x15\xeb\x81\x19\x9eX\xa7b=p\xc0\x13\xcb*\xd6\x03i\xfd\
-\x1d\xed9\xc5z\xe0\\\x7f$9\xaa\x98\x1f_\xff\xc5XJ\xb1\x1e\xb8\xd1\x7f\xa1\
-\x9f\x8d\xd7\xa3\x85'\x96Q\xcc\xab\xae\xffB\xbfI^\x8f;=\x90\x19Q\xccp\xd0\
-\x1f\xe9J*\xd6\x03\x17\xfa/:\xd2\x8a\xf5\xc0#O\xacK\xb1\x1e\xa8\xe3\x89u+\
-\xd6\x03\xbb\x0c\xa9a\xc5j\xe0\xbfO\xfc\xe6\xc6\x14\xff\xa7\xfe\"\xa1\x9fV?\
-\x1b\xaf\xc7\xa5\x1e\xe8\xeeT\xcc\x1f\xe1\x89\xe9w\xa9?R\xd4\x7f\xd1\x99S\
-\xac?\x82\xfc\xe64ry\xa6z\xa0=\xa5\x98\x97\x90'\xd6\xa1X\x0f\xa4xb\x19\xc5\
-\xbcb\x8c\xf5!\xc5\x8cB\xc6\xfa\x88b=\xd0\xc8\xafR?\x9d\x1e\x98\xd2\x03\x99\
-\xb4b=0\xc7\x13\xd3\xef\x92w\x03c\xbd[1\xa3\x90\xb1\xae\x91\xcb\x80a\xack\
-\xd2\x03\xa7<\xb1v\xc5z`\x99W\xacS\xb1\x1e\xe8a\xacg\x15\xf3\xe3\xf3&\xcc)\
-\xd6\x03\x9f\x19R\xa3\x8a\x19\xb8\xbc\tS\x8a\xf5\xc0\xa0\x1e\xd0o\x92\xd7\
-\xe3\x99\xb1\x9eQ\xac\x07\x9a\x18RC\x8a\xf5\xc07\x86\x94&=\xb0\xc6\x13K*\xd6\
-\x03c<\xb1\xb4b~8\xc6z\x97b=\xb0\xcf\x13\xebV\xcc\xbbA\x7fG\xc7\xb0b=p\xad\
-\xff\xa2}L1od^1\xfd.y\xea\xbc\t;\x15\xf36\xe5M\x98U\xcc\x1b\x88\xb1\xaeI\x0f\
-\xfc\xe077\xaaX\x0f\x8c\xf2\x8ai\x99\xa3\x07\xbaYlu(f\xb1\xc5\x13\xcb(\xe6\
-\xad\xce\x13\x1bR\xac\x07\xb2\xfa/\x92#\x8a\xf5\xc0\x12\xbf\xca\xa4b=p\xccb+\
-\xadX\x0f|\xe5\x89u)\xe6\x8f\xf0\xc44\xf1\x02\xe9yd\x86\x15\xeb\x81y~s\xfaq\
-\x19\x1f,\x1d\xda\x15\xb3<\xe5\x89i\t\xab\x07\xd6\x19\xebY\xc5z\xa0\x93!\x95\
-S\xccr]\x0f\xe8M\xc9\xeb\xd1\xad\x07r)\xc5\xbc@,\x1d:\x14\xeb\x813\x9e\x98&\
-\xc6\x07c}H1\xbfJ\x86\x94~\\=\xf0\x93'\x96T\xac\x07NxbZ\xc2\xea\x81\r\x9e\
-\x98\x06*\xcbu\xde\x84\xdd\x8a\xf5\xc0\x1eCJoK=\xd0\xcf\x90\x1aS\xcc\x12\x86\
-7a\xbbb=P\xd2\x03\x9d\x9a\xf4\xc00K\x87\xacb=\xb0\xc2\x90\xd2\x8f\xcb;\x8a\
-\xdf\xdc\xa8b\xde\xea<\xb1\x94b=p\xc8X\xd7@e\xf9\xc1\x13\xcb(\xd6\x03\xcd<1\
-\xbd-y\x91Y|\x8e(\xd6\x03;<\xb1\xa4b=\xd0\xce+\xa6\x89\xff\x827a\x97b\x16(\
-\xbc\t\xf5\xf1\xc1\xbf\xc2\x9bpX1\xcf\x94\xc5\xa7>,Y|\xb2\xd8\xd2@e\xc9\xcf'\
-a\xa7b=0\xcdX\xd7\xdb\x92\x01\xc3\x90\xca)\xd6\x03\x0b\xfc\xe6\xb4\x10\xe2\
-\xad\xce\x13\xd3\xa4\x07\n\xbcb\x1d\x8a\xf5@/OL\x1f\x1fz \xc1X\x1fR\xac\x07\
-\xae\x18R\xfa\xb0dX\xf2&\xd4@\xd5\x03\x13\xbcbi\xc5\xac\x9f\xf0\xc4\xf4\xb6\
-\xe4\x03\x87'\xd6\xad\x98\x0fO\xde\x84Z\x08\xf1\xab\xd4\x03\xfaM\xf2z\xac\
-\xf0\xc4\xda\x15\xeb\x81I\xc6\xba>>\xf8\xb0\xe0M\x98U\xac\x07\xc6\x19\xeb\
-\xfa\xb0\xd4\x03\xb3\x8c\xf5Q\xc5z`\x93\xa5CJ1o >\t\xf5\xb6\xe4\x05\xe2\x89e\
-\x143pybC\x8aYZ2\xa4\xf4\xbb\xe4\xf5\xe0W\x99T\xac\x07\xfax\xc5\xf4\xf1\xa1\
-\x07\x8a\x8c\xf5.\xc5z\xa0\x81!\xa5\x0fK\x06?c}X1\xff,\xbf9\xad\x1a\xf0_\xf0\
-&\xd4\xdb\x92\xdf>OL?\x9d\x1e\x18\xe0\x89i\xa5\x8eE0c]\xbfK~8\xc6\xfa\xa8b\
-\xde\xd9\xbcb\xfa\xf8`\xc1\xc6+\xd6\xa1\x98\x05\x1b\x9f\x84\xfa\xb0d\xe1\xc8\
-\x13\x1bR\xcc\x80aH\x8d(\xe6=\xa7\xbfC+9\xbf\xce[\x96\x0e\xfa\xe9x70\xd6\xb5\
-R\xc7\xfa)OL\xbfK^ >p\xb4\n\xcb\xc2\x80\xdf\x9cF.\x8bq^\xb1v\xc5\x8c\x0f\x96\
-\x0e\xfa\xb0\xd4\x03y\x9e\x98\x969,\xd8X\xae\xe7\x14\xf3\xf9\xc2\x90\xd2\x12\
-\x96\x85\xa3\x1e\xd0\xcf\xc6\xeb\x91c\xack\xa5\x8e\xc5\x16oB\xfd.Y\xc0\xf2\
-\xc4\xb4\n\xcbo\x9f!\xa5\x91\xcb\xc2\x91W,\xa9\x9872K\x87\xb4bV\x15\x18\xebZ\
-\xe6\xb00\xe0\x89u+\xd6\x03]\xac\\i\t\xcb\x12\x86\x95\xab1\xc5\xfc^xbZ\xa9c)\
-\xc5\x9bP\xbfK\x06?oB\xad\xc2\xf2<\x18R\x1a\xb9\xfc\xe6X|j\xe2\xd7\xc0GtJ1o1\
-\x9e\x98\x969\xbc\xd5y\x13f\x14\xeb\x81/<1-a\xf9(\xe0\x93pD1?\x0b\xaf\x98V\
-\xeaX\x06\xb1\xd6\xa7\xdf%\xab\n\xbc\t\xb5\n\xcb\xd0\xe6\x89iM\x80\xd5\r\xc6\
-\xba&~\xd9\x0c)\xad\xf7\xb02\xc1\x9bP\xcb\x1c=\xb0\xcdX\xefT\xcc\x82\x8d7\
-\xa1\x96\xb0,\xc7\x18R9\xc5\x0cK~s\xfa<\xe1\x8d\xcc+\xa6\xdf%+\xce\xbc\t;\
-\x14\xb3:\xca\x13\xd3\x9a\x00\xff\noBM\xac[\xb2\\\xd7z\x0f\xeb\xb8<1-s\xf4\
-\xc0-oBmj\xf1\x02\xf1&\xd4\x12\x96\xff\x82'\xd6\xad\x98UI\xc6\xba\xd6\xcf\
-\xf9\x9cc\xac\xebm\xc9\xb6\x18o\xc2v\xc5\xfc\x1a\x18\xebZ\x13\xe0\x05\xe2\
-\x89ibs\x85!\xa5\xf5\x1e\xc6:\x1b\x12\xfaq\xf9/xb\xda\xd4\xe2]\xc9\x13\xd3\
-\x12\x96\xf7>OL\x03\x95\xf5 \x9e\x98\xd6\xcf\xf9g\xf9\xc0\xd1\xdb\x92U'^\xb1\
-\xa4bF2oB\xad\t0\xa4\xf8\xc0\xd1\xc4\xb0dHi\xbd\x87\xf1\xc1\x90\xd2\x8f\xcbV\
-#CJky\xbc\x1e<1\xad\xb1\xf2\x9a\xf2\xc44PY\xa0\xb0\\\xd7\xfa9\x1f\xf3\xbc\t\
-\xf5\xb6\xe4\xf3\x85\xe5\xba\xb6FXQd\xb1\xa55\x01>,x\xc54\xf1\xf6`\xe9\xa0\
-\xf5\x1e\x16\x17\xfaK\xf5\xc3\xf2z\xcc3\xa4\xb4\xd5\xcc\xb0d\xe9\xa05V\xd6qy\
-b\x1a\xa8\xac\xe2\xf3&\xd4\xfa9?-oB\xbd-\xf94eHik\x84w\x14c]\x0b!>\nxb\x9aX\
-\xe22\xd6\xb5\xde\xc3O\xcb\x9bP\x1f\x1f\xac\x062\xd6\xb5\xd5\xcc\xe6\noB}X\
-\xb2B\xc2\x13\xd3@\xe5m\xcaX\xd7\xfa9\x9b<\xbc\t\xf5\xb6d\xb5\x98'\xa6\xad\
-\x11V\x15\xf4\x80\x16A#\xbfM\xaf\x98b\xaa\n\xc5\x80\x8b)\x06\\L1\xe0b\x8a)\
-\x06\\L1\xe0b\x8a)\x06\\L1\xe0b\x8a\x01\x17SL1\xe0b\x8a\x01\xf7\xd1\t\x81\
-\xe0\x0c\xe6\xe2\x85\x88\x01W\rj\x86A\xa8\xd7\xdc\x00\x8d\xf1r\xc4\x80\xf3\
-\x93\x12\xd0\x04\xfd\xbf\xe0\xa6\xb8\x15z\xa1'^\x96\x18p\xfe\xd0\x00\xb4\x08\
-\xb0\xfd\xe6\xbexab\xc0\xf9A)h\x7f\x03n\xf5\x90\x86\x0e\xe8\x8c\x97'\x06\x9c\
-\xb7fB\x17d\xde\x84\x1bs\x16\xba\xe3E\x8a\x01\xe7\x15%\xe1\xe2/`c.Y\x96k!^\
-\xaa\x18p\xee\xe9\x12\xae\xff\t7\xe6{\xb8\x89\x97+\x06\x9c;:\x80s\x87pS\xbc\
-\x05W\xf1\x92\xc5\x80\xab\x94va\xcf\x00l\xccE\xd8\x87\xc3x\xe9b\xc0\x99\xd3\
-\x11\x1c\x1b\xc3\x8d\xf9\x01z\xe3\xe5\x8b\x01gFw*\xcd\xa8b\xbe\x85\xedx\tc\
-\xc09\xa5S\xcbL(\xb9\x80\x9b\xe2\x13\x98\x81\xd9x)c\xc0\xfd\x9b\xae\xa0\xd5%\
-\xd8~s\x0e\xba\xe2\xe5\x8c\x01\xf7w3a\x15\x86=\x82\x9b\xe2u\x18\x82\xa5xYc\
-\xc0\xbdMI\x18\xf1\x10l\xbfy\x0c\xf2\xf1\xd2\xc6\x80\xfb\x93\xc6]\xebm\xef\
-\xcb\xb9I\x98\x8a\x178\x06\\\x99\n\xd0\x00\xd3>\xc1\x8dy>\x96s1\xe0~\xd3\x04\
-\xdc\x1b\x81\xe7\x00V\xe0k\x05&\xc4r\x8c\xb6\x18p\x8b0\nk\x8eAS\x82\x05h\xd6\
-!\x97\x8b\x16\xec\xea\x0c!\xf7\x0c\xdf\x01c\xc0\xa9\xaa\xbc\x1f\xf5\xe1\xdb\
-\xe0\xb3\x11d\xbe\xd8>\xfd\x036\x8d\xe5\xdc'\xd8\xf8\xe0\x80\xfb\xef\xe3J\
-\xb8o\xf0\xd3\xe8\xf6`\xfc\x8fp\xf2%x2v\xa3<\xc2\xc7\x16s\x1f\xf4H\xed\x01DB\
-\xe709\xc3#q\x0c\xcf\t\xc84\xe3 \x9aA\xce\xfa{\\\x8c\x01\xf7\x91h\x17\x1a\
-\x0c@r\x0e\x8d(\xa5\xda\x08d \x81M/c\xfd\xd8\x8a\xa6Gk/\xf6`\x0c\xb8\x0fB\
-\x038h\x00\x8dkhA\xe9\xad\xeb\xfb\x05\xae\xcf\x90z\x19\x9f\x85vc\xc8\xa5\xb1\
-\x03c\xc0\xd5<\xe5\xa1\x13M\xac\xcb.L\x8aOg0+\x80\xd5\x8dI,\x1f\xd1\x17\xf8`\
-\x08\xb9i(aO\x0c\xb8\x9a\x96m0f\x00\x88\x02^bY\x08]\xe3=\xfe\x99\xb1\x85\x02\
-2\xcd\x96\xf4+\x1a\x82\xee\x02n0\x06\\\x8d\xd2\x01n\x19@\xe1\x1c\xb7^\xa0\
-\x90\x80nx~\xe7\xef\xaep@j\x87\x985\x84\\\x16:>\x94\t\xf1a\x00\xb7g\x04\xb7{\
-\x900*\xfeUC\xdb\x17\xd0\x048\xc4\x8c\xb1w\xee\x08c\xc0\xd5\x14\x1d\xa3\xc9\
-\xe5U\x1d\xb4X2\xed7%1\x8d\xa5\x7f::\x1e\xb0\xec*\xb9\xc3\x1d4\xcd\x84\xd8\
-\x84[L\xc4\x80\xab\x05J\xc06\x1e\x1be$\x9c\nys\x81'\xe8\xd4S\xf7Mx\xea\x10g\
-\x8c\xed\xd6\xed\x18p\xb5@\xb3F/~_8;\xfa1\x87'\x06\x9f]\xc5\x1f\xe2w;p\xc18\
-\xe3k\x18S1\xe0\xa2L\xeb\xb8o\x00\x99,\x828\x18{p\xc8XFeqOX\xad\xc9w\xaa\x91\
-\xfc\xf5p\x86\x04\xc6\x80\x8b(-\x19\x01f\x04\xc7\xc4\xab\xcec\xa5\x91o\xe3\
-\xb8\x02\xf2H\x9e4\xfe\xa6)\x9c\xc6\x18p\x11\xa3y\x9c\x87\x13\x03\x17\xec\
-\x04\x96+\x83L\xe3\xbeq\xe8\x91\xe4\x15\xfc*\x00sZAL\xc9\x19\x1ec\x0c\xb8\
-\x08\xd12v\x19\xc8\x95\x13X\x14\xaf\xf7\x06\xbb\xd1m|o\tF\xc57\x0e\x00\x19\
-\x7f\x03\xe1\x1a\xc6\x80\x8b\x04\xe5a\xd2(dh\x1f\xfb_^m\x13.\xe09x\x11R^\x82\
->\xac\x13\x8e\xe3g\xfcn\x08\xe3ah\xc39\xacM\xc0\xd5P\x00f\x01>\xa3\xc9K\x9d\
-\xc5r1\xc1F\xcbF\xf52\x8f\xe1\x0b\xfe\x90\x92\x13\x16\x8c\xbfa\x13?\xd5\x1c\
-\xe4j*\x00s\xc3\xc8\x15q\x82\xdf\xc4\xeb\xfc\x89OX\x0f\xder\x01K\"\x0ci\n\
-\xe6\x8d\xbf\xe1;\xce\xd5\xa0\x84\xab\t\xc0%`\xd7\xc0\xd9Z\x84G[\xac\x07\x90\
-\xc9Q\x9a\x83\x14\x94\x1c\xfe\x16RY\x1b\xcbC\x02M\xb3\xc3N,\x83\xa6\x0ec\xc0\
-\x85\x8cN\x91\xc8\xc4E{F\xc25\x0csd\x06\x82\x05\xfd\xb9f\xca\xa239\xb7\x88\
-\x83/\xbf7H\xf5d*\xe7\x1e\xb1\x81b\xc0\x85\x88\x1a\xe9\xa7\xd11\xb5\x81\xd2\
-\xa2\xbd6>\xe8\x16~KUrz\x847Q9\x15z\t\x0e\xc04,]\x05B\xcdc\x0c\xb8PP?\x99X\
-\xa5W(\xf3\xa6.q\xbd\x02\xddl\xe1\xe5\xf3w\xd8\xeaP^\xf5\x92t\x08\xf7P\xce\
-\xf8W\x07(\x19[\xa9A\xd3.\xb4\x90\xf3\xa0\xc7>B\x11\x931k\xe9W\x95\x95w\x98\
-\x14\xd6c\x02\xae\xacC\xd3\xc9\xa72\x96d\xb3eBP\x1aL]%-\x91\x97r\x91\xb6RS\
-\x9468\x9a\x1eA\xde\x00|u\xe5q;\x86q\xdb\x91\xde\xe7p\x1e\xed\x94\x14s\xd8\
-\x06\xd3\x08\xe1iHS!\xf2\x12.\x92\x80\xeb\xa0m\xa3z \x9b\xc2A\xd1\x03_\x81\\\
-;A\xee\xc4l\xd6q\xd8\xe1\xf7\xb5\xda`\xbff\x9c\tQo\xd9\xc7+1\xe0\xaaM\xcbxat\
-\x14\xfd\xc0\xb2\xd2>\x01\xc3\xe8\xcdm\xc2\x02\x9c\xbe|+\xc2\x9c\xc3\x1b\xd8\
-44\x8a\xd9L\xe3\x93\xb1\x9c[\xc5\x0b\xc4\x18p\xd5\xa2<t\x92\x89|j\xa1r\xae;B\
-\x02\x9f=t\xed\xb6B\x97pXd\xc8i\xa8g\x96v\xc5\x13\xfd\xc0U\xf34CZ\xc7\xa8\
-\x02.RFC\x02\xba\x8d\xfcXg\xb6j\x1e\x9f</\xc45\x0c \xc0\xf3\xcd\xf1\xec\x1e\
-\xf1A\x00&I\xfb\xc6\x90\xbb\xb0\xe9\x83\xb1\xd1\xe0\x0be\xe8\xd1H\xb5\x97G\
-\xcf)\x0c\xfaTt\xb0Dw\xe26\xe1\xd2\xb2\x86\x9d\xe5N\xcc\n\x9by\x90\x88\xcc\
-\x8f\xd6\x02\xf5DP\xc2E\x04p\x08\x97tk\x923O2;\xe1\x19{\xa9\x1e\xfc\xe2\x13\
-\xb8\x17G\xeb\r\x1d\x90S\xa8\xca\x8c\xafn\x87P\xb5\xb9zp7\x06\x9c\x1f\xb4\
-\x8ewF/bF\x14)\xea\x84\x8cq\x8a\xb2)\xcf\xe0\xb9pX$-;\xd8\x99\t\x91\x81f\x91\
-\x97\xbaE%\xf3\x8b/\xeb\x1bb\xc0yL\xce[\xacq\xf8\xe2=\xe5\x85~T\xa2z\xa8\x06\
-\xdf[\x16p\x99\xae\x1c\x1f\x91\xbbB:\x1eB\x9b\xb16\xd7G9\x9c\x8a\x01\xe7\x15\
-\rR\x17\x99dO\xd5\xd3\x8d\x08\t\xcac\x1a\xea\xab\xc6k\xd0'n\x13R\x0e\xd3h\
-\x8a\xf0\x13n\x85\x97p\x8f\xbe\x98;n(\x1aw\xad\xa1\x07\xdc!\x98\x84\x8bOC\
-\x91\xca\x91\x19\xd3x_E\xb0\xfd\xe6\xcf\xd0\xf62\xfb\x01\xd8w\xb8Y\x9eP\xba\
-\xd6\x0ei\xc0X*oY@\xcdG\x02p!v\x8bL\x82\xc9^\x1f\xb4\xb9\x1a\x8e\xe8\x9a\xea\
-!\x08\xfe\t\xdf\xc43\x1c8\xac\xb4Y\x84O\xb0.\xeeh\x8b\x15\xb8\xa7\x8fC\x1f\
-\xc6\x14b\xb7\x08\xc2\x03\x99dO\x9dc\x9b\xf0\xd6-9\xaep\xe9<^\xa4\xe8\xf0\
-\x9a^\x151\x94u\x95\xae\xa8\xdb\xa1\xd1\xb2 \xac\xddE\xb8\xa9 \xc9\xf0\x11\
-\x97\xe3#\xb52\xcd\xed\xca(;\xa1(\xdc\x03)x2\xa9%\x82\xab\xe0\xe4F\xb3\x1b\
-\x9b\xe0\xd0`NO\xb6\x9a\xc0\xce\x03D\xbb\xa8\xdc.\xe9\x06\xae\x8c\x93o\x160\
-\x06\\\x05\xd4\x83&a\x8a\xebp'\x0e\x93^\xa3T\x9a\x94v\x9c\xe0_\xab\x88\\\xd3\
-\x8e\xd6\r\x9d\x03\xae\x013bF&qw\x05\x94%^{\x8c\xd2\x16/\xe8 6\x1a*\xa7\x94\
-\xc1\xbdB\x1d\x0c\x8b\xb4\xbaA\xba\x83\xb4ch\xfc\xf6\xd6\xad\xe1\xd8\x9b\x92\
-\xed\x19Y\xe6\x14`\x13\x9dI\x999(\x9b.yK\xba\x99\xa8\x06r\xeb\xac\xc0-\x99\
-\xc0\xad9\xb6R\xdd\xd1\x00\x0c\x19\xb85J\xd4(^\xd6W\xc7\xd7\xf4;p\x8d\xbf]\
-\x12\x87\xb6\x12\xd1\x07t\xf3\xe2@\xbe\x84^Gp{\xb6\xfe\xb2L\xdb\x8ec\x82\xf9\
-R\xbf\xdceUe\xc9:\xbf\xd4/\xc16E\xc1/\x12\x01?\xdc\xaa\x91k\xa0\x88e\xd7\xc0\
-\xbc\xe3\x0c\xfc\xef8\xfa\xa2\xe4K\xc7k\x0e\x7fK\xccK\x879a\xa7T\xeey?e\x81\
-\x80\x0c2\xc9fE\xf5\xa4S81\x00\xea\x0e<D\xe4\xb6!\x127\r\x8d4c\xb0\xf8\xb3\
-\xd4+\xbcx\x97\x8e?y\x84\x87\xf4\x1apE=r\x8c\x8euB,\xc3m\x19\xf6\x8c\xea\xd2\
-Ie?\x85&m\x82\x1b0\x15\x99\xcb\xad\x88\x84'\xa9\x023\xceoC\x8f\xe1\xd3\x8b\
-\x17\xb5\x07\x9a\xe1\xd1\xb1K!G=6\xc0MZ\xdfsC\xce\xea\xf6\xe6`\x8f\xca.\x9d1\
-\x83\xe2\x0eEh\x85\xb2\x89\xd1\x03\xfd4m`blC\x94JBD(<\xa9\x8bL\xc2\x14\xf7\
-\xa9\x1c\xfa\xd3f\x1dON\xe1\xfa@\xd2*\\\x83)t\x06\x99S\x92\xb5D\xbe\x18\xb92\
-\xce\x85\xe6\xb9kIU\x83\x06#\xf45b1q\x91\x8a\xf8]\xc3^\x03\xc8\xdd\x0bG0X\
-\xda\xd81\xd4\xfb\xc62\xbf\xe1\x14\xdaM\xcc\x04X\xa5Eq;2l\xf0Y\xa9/\xc6\x80\
-\xf3\xc9\x1d\xbcn\x10\xa6\x98\xb5\x05\x80O\xc0w\xf4\x03l\xb7p#\xaeA\x13F\x19\
-\xa7D\xe5j\xe9\xea\xd2\xde\xb9\xfb\xa4\x08;\x14\xc5\xc2\x85Q\xcci@\x930\xc5]\
-\x11\x8dk\xa9\xff\x0e\xcb3\x18T\xe6\xa5\xb2\xf6\xb5d`\xa2\xa8@\x83vq\xfdU\
-\x80q\x83\x99-D6C5\x92\x89\xd0[d\xe2\xdb\xea\xb2\x15\xbdJ\xe0\x9ag`[\xc5!q\
-\x1c\xee\x02\x1a\xcc\xeaQ\x98\x18\xca\x0e7\xa9\x07|\x16\xe1\xf26\x11M\x84>\
-\xb4,9\x93b\xcf\x93\xf2\xfe\x02\xdb=\x89\"\xc9\xe2\xb6x\xed\xf7\xd4o\x92\xed\
-\x85R\xfb\xda\x87-\x03\x0b|!\xd2\x1d\x1d\"\x9b\x08\xddc)\xdb\x8f\x8e\x0f\xa1\
-4,\x89X\xb19,b\xc1\xe5\xd1:\x06\x1dTv\xf0\x8e\x18\x94m\x18\xb6\x0e\xder\x90\
-\xe6\r\xec\x18\x84\xbf\x87=\x16\xa4\x86\x01\xa7\xe5\x1c\x99\x1cb%\x92\x8d\
-\xd4\xc6\xe8\xa4b\xc8\xf5Q\xb3\xc8_\xf8\x89%\x83o\xda\xb4\x15\xc6?0*\x83x\\\
-\x03E\xbb\"^=\t!o\x00\xb9I\xdc\x16\xafl\x00\xae+\x82[\x1aS$\xf5\xc9\xac\x91\
-\xf6\xd5hs\xd58\x97m\xd1\x88\xe7\xady\xc0q\x98b\xd6\xc0\x99\xb0'\xa2q\xa7q\
-\x1b\xcc\x8e\xd6\x92%e:\x05\xdc\x87\x0c\xee\x04\x06\xf1L\x98\x18\x1b\x96\x1e\
-wb`\xf8$k\xa4$aM\x14$4\xb8\xeb\xd4\x01\xe0\x03\xb2g=\\8\x96\x91\xcf\x90\x11\
-\x9f\xcc\xd1:\x99\x1c\xa5\xb7\xb6\x03}\xd3\xe0\x00\xbf\x15\xb2\xad\x00w\x14\
-\x1b\r\x81\xd3\x14<\x1b\x94\xdf*Z6\xae\xb4Z\x1b\x1c}\xaa\xdf\x96\xa9\xb0mT\
-\xf7hVT\xc0<\x84!\xa3\xd0Ry\x80/\xa3r\x9f\x8cSt\xdd\"\x91\x06\\\xcef\x06LR+:\
-\xb7\x147E\t\xd39l\xa6\x7f9&>C\xb9\x9f\xc3.\x9c\x18T\xdd\\\x87{\xea\x105~O\r\
-\xe4b\x1fJ\x90?\xbf\xe4i,\xd8*\xa6\xc4\x80\xab\x8a\xb90\x80\xb7\x96\x06\x06B\
-vtP=9\xd7\xc9N\xe0J\xc8\x8e#x\xdf^\\\x83\x1f\xb2i\x1b\xf6\xa1\xc9}\xe7\xb2\
-\xcd\xed\\0\xd8\x14\x9f\xa1\xbc)\xe6\xf1\x9c\xec\xdad\x17\xc5\x80\xab\x1am\
-\xc0\x9d8\xae~\x8aWze`\x06\x14p\x1f\xca\x17_\x1d4\xf1f\x90e\x0bI\x9d\xaf\xcb\
-\xe88l\x12\t1\x1d\xb4\x8b\xce/\xd6.\xe8@v\xec\xc2\xfe7\x0c\x98\t\x8c/\xef\
-\xabBu\xaf\x1a\x80L\xe2\xaa-\x0f\xc0\xa4\x9d\xda\xeb.\x82\xaf\xe1Z\x12m\xdf\
-\x06i\x8eL\xeeq\xc7l\xb3\xca\x19\xb9O\xe4&j~\xb7\x88\xcf\x05\xdcD0<)bw\xa9]\
-\xf4\xa7\x1c*\xc1'\x91\xb6\xb2\x01\xc7d\xd2K0I\xb2\xd8s9@\xa8\x80\xe3\"\xb8q\
-\x8a6\x8d\xae\xd7\x0fE8\xe6wp\x9eaZgi\x88e\xf7I?\xce\xfc\xb5/b\x01/\xe3\x00L\
-\xff\xa8\x07\xa7\xe9\xfd\xbc\xd1C!Q\xda\x8d*]\xce\x88\xe2\xa9\xf38\x8b\xea\
-\xd8\xec\xc2eQ\xa3\xa4\xc3\xc0\nV\t-\x1b\xe2\xf8\xcf\x1b\xc5\xc7I\x89\xdb\
-\x8cN\xcaf7\x88\xc6#\xf1\x91\xea!\x8d\xff#X\xbc\x1fF\xc5_\xdf\x18U%9\x06\x99\
-Gz\x81_\xa1\x9cX\x9d\x80\xaf&\xe0%{\x95\x10\x93\xec\x84+,\xd7\xb4KB\x06\x9d\
-\xc6\xc7\x9d\xdb\x14\x83\x18p^\xc86xp\xa0?\r\xe2.\xde\twG\xb7A'\x86-\x18y\
-\xb3\x9ed\xafQ}\x93\x19\x92\x0e\xde>X5\xb0\x9aG\x84\xfb$\x0ff1-Y\x98\x8fD5\
-\xcc\x88\x00n\xcb\xc0{\xd5\x0e\xf2h\xbd1\xea\xc70\xf7\xaaT3Z\x90q\x1e'L(\xb3\
-\x13z\xd0\xa4{\xe0\x13\xdaB*\xb1\xaf\x82\x10\xaa]\xd1\xfb5\x06\x9c\x0b\xda#\
-\xb3\xca\xe3\xd3\xb0$l\xcb\x1583\xba\x9a/\xdb}uh\x92\x0c\x93\x01Y>\xf5\x1a\
-\x87\x0c\x82\xa7\x8a\xb6\xean=\xb4\x05\xf5\x15\xf1\x055\xc6\x80sK\xc5\x8a\
-\xc2\x88vD!\xd3i,\x1a\xc4e\xac\xc3\xd5\xaf\x9b\x0b\x13\x07/\xd9^\xf5\xa2Q\
-\x9b\xca\xef\xaf\x9e\xb8\x83\xf2XW!\xe4\xbec\\\xcc\xc6\x85\xdev\x8c\x8f\x15W\
-\xe7\xcd\xc0\x11I)i\xa2M\xb5\xd2>\x9c\x18@t\x16e\xa8\xf9\x88Ay\x8a46\xbeTYB(\
-_\xd27\x1a\x85=\xd9m\xe4\xee\x10gs\x85\x1ap\x8d.\xa3r3\x16\x10\xa4\x87\xed\
-\x0c\xfc(\xbf\xdams;\xaf\x195\xf9\xd8\xa66\xb1\xbd\xbeXGk\xd9l\xb8\xc3\xfa\
-\x8aC\xe1[C\xdb\x1e)\xb4\x80\xebG\"/\xe0\xb1k\xab(T\xf0\xbc&f/v\x8a\xef?2\
-\x80\xdb1l\x8b\nrmp\xf1\xcba<!\xcc\x8e\xef\x15w\x96\x98\xb6\xdd\x14\xc7\x80\
-\xfb\x07-z\x98[\xf5\x13z_^l\x0f\xdc\xc0\x89g\x89\x82'\x96\x0c.\x1b'\x19\xba2\
-8\xfegD\xff\xd4\x1e[\xbd\xceI<\x82r\xc4\xdb<\xadW8\xbb\x02\x8e\x88\x83>\x06\
-\xdc\xbb4\x8d\xdb\xe4u\xc7\x18\xd9\x9e(\xf5\x97\xdb\n\x13\xfe\x82\xe3\x022SF\
-\x05w\xbe\xdanOf\xfe\xf8\xf7\xbc\xb8\xdcJ\xc1y\xc5[d\x82\xd60\x06\xdc_i\xc5\
-\xa3^\x7f\x7fV^K\tx\x8c\x93\xdb\x16o\xa7v\x07\x84\x01\xd8\xd6`\x8c\xca\xb7\
-\x9f\x1b\xef\x94\x14\xdb\x14\x17u\x1b\xd0\x89\x95\xeb\xb1M\x90\x88\x01\xf7\
-\x1e}\x87s\xa8\xf7\x89\xbfc\x97\xcd\x95\xbcZ\xf1K\xccB\xbf\x90@\x030b`\x8c\
-\xb4\xd2\x0f1\x8b\xaf\x7fq\x9f|\x11\t7\thw\xb1\r\xa7)\x06\xdc\x1b\xd4\t3>\
-\x97\xb3/\xc2\x89H\xefK\xc0\x95\x91\xb7\xecEs\xb3Y\x80\x0f\x983p\x9f\x8c\x8b\
-\xb8\x94\x0e\xba\xffG\t\xb2\x92\xa5#\x96\xcd\x8a\xb7b\xe2\x9c\xf2\n\xde\xc4\
-\x80\xb3S\x02g\xaa\xd2UA\x15Q-\xd3=\x99J\xd4&q\x1c\xf6\xe0\xa5\x81%\xddj\xab\
-\xde{D\xcen\"V\xa8|]\xf5\x13w+^\xa3\x19z\xa0\x18p/\xd4\xe2Sc\xc9\xb7o<\xb7m\
-\xb1\xb4#\x06\xf9SW\xb6>7\xf5F\xd9\t\xd2}2F\x19\x03\xc5\xbfl\xf0\xcc\xb90xJ\
-\x96)\xb2\x11\x03N\xa9\xc4\xe7xR5\xb8\xb1\xc3`^t\xc4*\xc0\x90\xa3\x94\x98\
-\x11(k_M\x16h\xb3\x067\x17\xcd\"\xf3\xe2'^\x19\xde\x9e\xcc`\xfee\xb6\x8bp\
-\x88\x95\xeb\xb9}\x81\x17g\r<\xe2\xf7\x127\xab\n\xb6\xb2\x95y$f\xb1\xf3\x0f\
-\xa7\xc6:\xdc\xdb\xb2\x1fL\xaa\xf7^\xd0\xb8\xf8\xa5C\xfcY\xc1l\x87a\x17\x93\
-\xe5\x97\x86n,\xf9\xa6@\x01\x17h\xc4\xef\x124\xb8.*\xe3\xc6j\x9dE)g7\xffr\
-\x18\xfd\x10\x7f\xd9@Y\x93\xbc\x06\x90m\x82\x87\\\xa8\x0e\x1d\"\x88>\t;X\xb9\
-|o\xc0\xa5\x8fx\xa4\x1e\xe2f``\xfb\r\xa4\x19\xd1Nm\t\xee\xde\xb4\x1a\x1f!'\n\
->_\x1a\x84\xae\x9f\xc0\x91\xb8\xcb\xdd\x85\x92A6\xeb\xdb\xb567\xa4\x94u\xe1\
-\x1e\xdf\xc4C\xfcPGj\x07uC!`\xb8\xe9\x18[H\xd9\xe6\xf5\x80+\xf8\x1a2)\xe1\
-\xb893\x90m?A\x16B\\5\nvz7\x94\x1c\xb6ED\xc9\x9aQ\xd3\x91\xd7rn\x14;\xe8\x83\
-\x1c\xa99Z\xa1\xa0\xc1\xa68\xf7\xc6.\xff\x89\x13X\xf6^\x81x%\xa7`\xd2\xf5\
-\xaa$\x12[\xee\xf0\xb2\xe2\x1b\xd1\xb7\xdc\xb8(B\x1cZ]\xac\xe4\n\xe5\xe8\x03\
-\x1c\xa970\x89\xc1\x83m\x05\xa7DQ\x98q(k5S\xd0\xae-\xd0\x03:\x16\x80\xbc\xa4\
-\xef\x069\xf3\xab\xc2\xc1\x9c\x873\x8f\x9f\xb7E\xa4~\x9b\xd5\x02\xfd\xb3\x80\
-\xd9Mm\x03n\t\x8a8\x1c\x02\xd9v%z\xfd\x15\xe0\xc0\xd2\xe6zm9\x05G\xb4+\xe4\
-\xc8\x12\xec\xa1s}i\xc2vy\xb5\x85~\\\xd6\xcd\xd0\xd5\xcb\r\xa9\xaa~\xfeX1\
-\xa4U\xe3\xcf\xc5Z\x05\xdc!\xf5\x86\xe0(]\xc5\x06\xdb\x85\xda\xef\xc4\xe7>\
-\x92\x17_e:6\xc8N\x18\xc4{Q\x0f$\x0f_`\xab*\n\xc1\xa1\x0b\xc8\xd5\xc3\xb8-\
-\xa3\xb7f\x00\xd7\x073!\x80\xdb\x1a\xc8\x8e\x83\x8b\xaf\xba\x91.\x91=R6\x0f\
-\x05\x9a1\xe9W*@\x90\xa1\x16\xf2\xd7\xc6\xbe\xc7\xf2\xcd\xc1:\xe6]\xfc\xda\
-\x17\xbc\xac-\xc0\xf5\xe0Q(\x8e\xd2qQ\xfe\xa5\t\xe7\xde\xb0\x94\xd7\xe0\xe6\
-\xe50\xed\xa03\xa3\x97\x96y\xc9\x0cM\xc0\xe5+{\xd7\x1f\xbe\x86\x84hY^\x8f\
-\x93.\x8e\xd6\xbe\xaa\x94\x8c\xa8\n\xe0:\xb0%\x04\xb2m\x1a@\\\xbc\x1f\xd2\
-\xfb\xde\xfa\xcf\xfa\xe2k\x8a\x9cG\x1d\x17\xe1H4Z\xea\xc7\xd9*\x9aE\x97(\r\
-\xb2\x8c\x8bo\x1a\x84\xc3\xe8\x03\xae\x00\xa30\x1d\x02\xd9\x96\xb3u\x14\x9d\
-\xfaGN\xd4\x04]\x80\xf3\xac\xa9[\x18\x15\xdf]\x87\xd7U\xdd^\x05\xdc\xb3N\x90\
-\xb2\xcb\xa9\xe8\xe2\xd7\x1fa\x95\"\r\xb8#\xa0Px\xdc\xaem{\xb7\x01\xc8K\td\
-\xbb\x95\xbd\x82\x9d\x00\x9eO\x96\xed\xea\xa0+\x17O\xd7G#\xbe\x96\x8c\xf0\
-\x15p\rt\x1e\x02\xb0\r\xc3\x81\xc8\x8eZ\xf6t\x0b\xcc`\x9b\xac\x8d\t&]]\xbd\
-\x96s\xe5\x02\x86\xd6\x8c\xd0\xcd\xa92\x82\xa9h\x02n\x1dGB\xe0\xe2=#iu\xf6z8\
-\xa3-[\x93\x8f\x06\n\xf2n\xf8\xc4R\xfa\xcb\x94t\xd9\xde)k+\xa0\x1d\xa1#\xb5\
-\x07F\x02?R\x95\x93\xb4L\xd7\xe8U\x13\xcbv\x91\xf1\x9a\x80\x82\xe7}\n\x8d\
-\xb2ci\xc9\x16T\xea\xd6\x01u\xea[\x8d\x12\xdf\x8d\x86\x04\x1c\x1b\x15\x98\
-\xf7\x83\xd3\x96\xdd\xd9!n\x16\xdc\xdf\xe4\x0e\xe2\x14\x96-\xde;\x9c\x0bp[\
-\x95`\x0fR\xa2\x1bu{\xc5uI~\xc7\xfe\xed\x89\xf0\xd4H\xbaEN\xb1;p9\xd7\x85\
-\xb2\xab|\x9f+\xb3\xa1\xdf\xe6\x8a\x18\xc0\x9d\x00\x9fk\x12\xa5Y9\x00\x1d\
-\xae\x03\xf0\x13\xbez\xe3\xaa\xe4\xf8m\xc2U\x17iy^\xe52\xc8&\x96-\xd8^\xe1\
-\xf7\\\xc3\xac\xf8\x9e3\n\x12n\xdfq\x03\xe5\xbd\xad[\x7fg\xbb\xad\x9cb\xc4\
-\xaf\xb6\x0e\xb1+`\xc8\xf5Q\x93\x88\x10)\xc0\x80q\x08c\x1a@t\x98NY6j1\xc0\
-\xe7i@\xd9\xf7\xab\xc9e\x84a\t\xe6\xdf\xbcK\x8e\xf0\xe5\xfd\"\xdcR_\xc0\x87\
-\xeb)\xdd\x883\xe8\x12M\xe2\xd4~\x82,\x8c\xb3\x81\x17\x01>K\x16\x87\xc4\\\
-\x1a\xad\xcd\xe3\xf2\xfb(Q\x95\x18\xe0\xaa\xc7\xc3]\x05\x0e\xb9g[\xf3\xef#\
-\xc7W\xecO6W\xc1B\xa0\xd2z\x01\xa4z\xf0\x15\xdd:\xb2\x87\xb1Z\t\x84\x01\x04`\
-~sQ\x9c\xc5\x0f\xdf\xdc,\xfc\xbb\x17\xe1\x16\xac\x8a\xab\xed]K\xd7\t2\x14a@\
-\x1c\xeb\xd6\xfc];d\xda\xb1z\xe5\xa8\x03I\xa2\xe9\xc1\xcf\x10l\xecH\x11Z\x85\
-\xbc\xb2\x96\x9b\xfe&#\x8eA\xaa\xe6\t\nr\xc3\x14p^\xd45\x19\xc3q\x97s\xe9\
-\x17\xc5\xccj\x16p|$\x05\x1d\x1dw\x82\x97B\xce\xfd|\xb7\x19\xf8\xbd\xf0\xe1%\
-\xe1\x08\x83L\xfei\xa1r4_\x02\xc6\xc1\xad\x13{\xcf\xd6b\xa9Z\x80\x0b(\x11:\
-\x89'\x01\x1f\xad\xc30+\xec\xbcS\xd8\x7fC\x9e\\\xe24\x96C\x11\xce\x02\x9d\
-\xef\x0eJ\x87\xcc'\xd7\x91\xcfs\x014M\n4\x11:\ty*\x06\xac\xcd\xf5\xe2\x80\
-\xf0\x16.\xd82\x10Z\xf1+\x96\xdd\x0e\xcb8\x13\xe0\x06y\xc2\x1f\xa2\xc1\xcd!-\
-\xb8\xac\xc6b/\xb9\xfd\x01\x8e\xd4\x17_\x16e\x02\x86\xdc\t,\xda\xee\rZ\x7f]^\
-\x9d\x89\xe8\xe0\xbcu\xf8\x049\xc7\x16\x92\xf9\xfb;.sC\xa6-3i.\xc0D\xe8\x80\
-\x8b\xd9\xb8\x0b\x19\xf4&\x16xB\xd4\xea\x9d\xc6\x0eK\xbf\xfbf\xcbN\x18\x0et\
-\x86\xbb\xa2\xaa\x9c\xa5\x02\x90\xbb\xd2?u\x81\x96\x9b\x0eE\xb9\xae\x0e\x1a\
-\xa1\xe1\x80\xe5\xdc:\x8d\x89zJ\xbb6\xcfa\x90\xe6\xcd\x0c^z\x94k\xff\xfbb.\
-\xd8^5\xe1\xa9\x80\x89\xb7\x01C.\x8b\x07\x7f\x1c4\x87.\xaa\xebz\xe2/\xc4\xeb\
-\x97\x19\r\xd2\xa2\xcb\xb9\xa8\xd6wK\x01\xbf\xe6\x10\x95\\=\x84\xb1\xe0\x13m\
-H\x06\xe6\xdcP\x1a\x83<\xe8\xbfB\xd9B\x9e\xc6{\x97\xf7+\x9bx\x10\x82\xb7\x1c\
-\xaa\xa2\xd2\xaa\x11F\xd0\x90\xcb\xbe\xa8\xe7?p=PSF^\xc0\r\xe0\xa3+\xe8\xef\
-\xc0MH\nK\x87\xael~\x1e\xfb\x02\xf6\xce\xd5A\x0e;\x01)\x1d\xe0\x1cZEVA\x13\
-\xba\x8b\xde[WU\xf8B\xf3~C\xd8\x18d\x1d\xdb\x03\xf7\xce\x05\xeb\x8e\xde\xa7\
-\xb2;\xba\r\x9e\\}\xdb9\xb4\x84\xaa5HH[\x1fu\xe2G\x85\xdb\x05\xc9R\x81\xcd.\
-\xcbc\x9c\xd2M\xc8\xdelH\x00\x97\x80\xaf\x98\xa5<\x96\x1b9nT\xa5TB\xb8\xb8\
-\x08K\"1\xa7\x07\xb6]\x1d\xa5%h\x80B\xe8DI(\x007HK\xbf\xf6\xf1\x81-\x87|\x96\
->\x12\xdc\xd6`[\x9a\tp\xe5j\xc3\xdd\xc2\xb3\xad?u#bh\x00\xf7_\xb0S\xb8\xc1V\
-\xb1\xb4%\xa1\xbf,\xc2X\xe0\x99\x10\xd5\x0b\x0b\x95vd\x13\xb8\xb3J\xfbp]F\
-\xcc\xe9\xd4\xc8O\xd0\x16\x02\xc0\xfd\x17\xb4\x84\x1b\xfb\xa3d\xcc\x0cu\x8b\
-\x7fo\xa4\x89\x0f \xe7>c\x9d(\xd50\x07\xee\x12\xfd:q\xd7\x16\x03\xf3\xdb\x04\
-\xbb\xa6\xaf\xf8\xa1\x8f\xd4\x1e\x1cz\xd3\x1e=\x819\x11\x83\x86p\x16\xa8G\
-\xcc\xff\xd4\x9e\x07Qms\x00\xdc\xa5\x1a\xcdP\x97\xad;l\xeb+\xbd\xae>`\x17I\
-\x80\x80K\xd2\xdfZd\x0c\xe1\x948bzh\xbaF\xe1\xb6\t\xb2m\xc8\xa4\xcbj,\xdd\
-\xb6\xa8\x92\xcb7\xcf\x86\x11Q\xa3\xf3\x03\x01n\xe8\x9f-\x1f30/ w\x03\xd9\
-\x1a<Z\x07\xe8PX\xa5\xdd\xe4\xa6@\xeb\x96\xa5\xab\x95\xaf\xf9w\xe1\xec\xdd0\
-\xfen\xec\xfeX\x80\xdb\x85aG~\xfc\xa2e\xd8\x97\x8f\xd6]\x98\x81\x93\x1a\x02[\
-\x1dtQ\xf9\xe9V\\\xe6\xcc\xaf\xdaZ}$\xf0\xef\x01U\x05\\\xa2&\xfc \x80{0\xba\
-\xbcz\x80^\xf1\xd9~\xba\xad\x11\xb8-\x88\x1e8\xd6\xffqYbgD\xc8\xb6itV)\x1e)\
-\x88\x98\xdf*\x03.\t\x8dh\x9a\x97:C\xcdba\x92\x155G\x0b\x1b\xdf\x81t[|q\x17\
-\xc9\x07K\xa2\xf1\xdb1\xde:^\xdfIl\xc6 \x00W5?\xdc\"\x1cT\xa4\x87\xa9\xeaG\
-\x9d\xe2@NGZ\x9b\xbb\x85o\xc2\t[\x87\xbdXr%)\xf3\x024\x9f\x0c\xbbB\xa8\x1e\
-\xd95\xea\x87\xcb[\x16\x98\x9b\x9c\xfb\xb4-\xa1\xad\t\xa2\xea\x10\xceA\xce\
-\xe6\xe0\xedv\xf1\x1c\xc3\xd0%\xf2.\xe6p\xbf\xa2oy\x80\xeb\xdaK\x84\x9e\xf3\
-\xa0`\xd7 \x8e\x89Wu\x8bW\x11\x84\xdc\x84\x90m\xbb0\xeb**\xe6\xc1RO\xca\xeb\
-\x91#7\xfe\xbb\xa1\xda\x02\\\x86\x16<\xb2\xebnE\x0b\xf0A\"\x88\x92C\xf8\x1c\
-\xbaEv\xc2!\xa2\xab-xA\xb2\xb0N7\xb8\xd3l\xd3PO\xfd\xb5Q\xcc\x06\xe1\n\xbc\
-\x8c\xfb\x18\xa05\x94\x8e\xd2\xad\x88\xc0m\x0c\x96EK\xa4\x84\xab\xa4\xa1\x12\
-L\xa1\xac\xe8\xb9\xea\x89\xbb\xe8\x1c\x13\x14y\xc0\xa5\xc0\xfb\x16\x19\xe7\
-\x96U7%\xae\xc7NCoB\xf4Q\x83hf9m`G\xbe\x19\x04\x0f\xd2\xb6\x1c\x00\xef\"\xa4\
-\xd3\xf0\x8cwQ.H\xd8H~\x85\x8b\xcf\x0b\xef\xdc<^\x86\x1ariL\xd9\xb2\x13\xdc\
-\xa9\x17\x134`\x83\xc4\xa5\xcb\x0c\xfc?=zG\xd1\x04\x9c:J\x07}T\xebo\xe1X\xd8\
-V)\xda\x0c%\xd8J\xd6A\xb5+\xc2Lw\\\xa9\x00'P\xc2\xa9?V\xfa\x8ar\x1eg\x8b-c\"\
-j\x80[\x82j\x04\x15}\x81\xf2f_\xc7\x12\x95B\x06\xb7a(\xd8\xea\xd05\xb8L\x89n\
-\xb15\xac\\\x14\x8a\x0b\x92\xb7\x97~\xc74\x15%\xc0\xddS\xb52\xaf\xeeQ\x06\
-\x15\xce\x86\xcaQ\xd2\x0fk\xb6\xec\x04w\xcd\x03NE\x83\xa59|\xc6-\xcb\x0c9\
-\x15\xcf\xde\xee\xf1\xb3\xb7\xfa\x94\r\xe1\x03\xe0\x9a\xa9\x9aU\x86\xd2\xb6\
-\nG\xc9\xd0\xdc\xb5\x9e\x81\x0c\x14Bt\xd7v}\xc9\x961\xff;\xf4^\x866%\xe0\xd0\
-\xe3,\x90\x15\xf4\xa3\x06\x89\xc7W[\x9dP\xfd\x16\x19%\xf8&j\xb85\xe1D\xe0r.\
-\x8b\xbbB\x0b\xea\xc7kW\x1d\xb8\xaeI\xba+>\xd9Jb\x94\xe0@d\xe7g,k\xd8\xdb\
-\xa4\x9e&\xf2:,\xdd\xc3\xab\xad\x04t\xc3s@\xafxD\x94\x9f\xe9\x81\xef\xb0\x16\
- \xdc&Qf'tA\xceC\xa5!\x87\xc7o\x84\xaav\x8a\xbfh\xf0\xf8\xd2\xef\x8b\xa8n\
-\x12\xb2#5\x1f\xa8s\xe2UP!\xee\x07$\xe7\xe6(\x89\xd2%\xeb\xaef\xfb\x9d\xa8\
-\xbf{\n'\xef|W/\xc9\nw\x8d4\xe4\xe9\xb3\x17p\x87B\x07\xb8o\x96.\x15\xb4\x8dX\
-\xc0v,\x07\x15NA}\xd5K\x80\rb\x8b(b:\xed\xd2%}\x0cG/Vx\x0f\xec\xd1\xe3_\x9f\
-\xbdS<{\x1e\xce<m\xf8>\x0c\x03\x9e\xb5\x0c\xf1\x04p\xf5\x81\xb6\xc8\xb0\x07\
-\x15.K\xcb\x10\xab\xd9\x13\xe2\x82dv\xc2\x01\xba+f?K\xe5\xde`\x870\xea\xe0\
-\x13;\x98B\xe9\x9d\xf36\x0b\xa4\xdd\x96{\x11 \xe0\x06,\x83<L\xfe\xafI\xec\
-\x12\xb3\xbb\xae\xb8\xa3\x96\xa9\xe1\xd2\x86\xe5\xd4\x94EK\x93r\xa3E\xaa\x94\
-h\xd9\x15\xc2i\x97\x99,\xc80\xf31\xec\xf5\xf4h=\x87]\xca\x07\r\xb8\x1f0\x1c\
-\xbak%\x15T\xd8#\xec\xe6\xbd*\xfc\xe2\x85x\xd1\xbd.s\xe6\xfbDi|\x80I\xa3\xd2\
-\xf8\xe7p$\xee_\x0ea\xde\xe3'\xed\x80\x95\xe0\x00W\x80\x87\xd0F\xa4=\xd8\xc2\
-\x1c\x87\xc0\xcf\xc2\xd5\xd7$\xb3\x13\x0e\xd1\x8d\xa5^\x07$n\x10\x06i\xae\
-\x82\x9b\xd2'\\\x16oi\x01\xb3\x9e>\xed*6\xbaJ\xbf\xa9\xd8\x0f\x97\x84\xe1P\
-\x07@\xf6C\xbf-\x13\xa2\xdf\xa7\xdf\x91\x05\x14\xea\xd0]vB\x1dHu\xa0\x17JX\
-\xe9v\xcb\x08H\xa4<\xef\x87!O\x90*\xf9\xe1\x96\xb1;\xf4\xf1\xb6i(b9\xa8p\x03\
->\xfb\x10@P\x10\xed0\xdb,Y\xe7\xe6\xdb\x16 CR\x03s\xe3O;\x81<\xcd\x8a\xbb\
-\xd6]\x8f\xdf\xd60\xa5\xb0jGj\x136\x06\xda\"\xc39?\x8a\x8a\x1d\xea\xb8\xdb\"\
-/\x1d\xc2\xbd\xb6\xdb\xc6\x0bW\x8d\xbf\xd3\xb0/\xd2\x84\x92\xd6\xe6p\x1fi\
-\xb3 \x1a\x93#\xec\x90\xb7G\xeb\xba\xb5\xd9z\xaa\x01\xb8F\xcbV\x89F\x8c\xedg\
-8\xfc\xc3a\xb9\x02K\x1e\xcd~^|\xeb\xbc\xcb\x8c\x8d\x15\xcc\xd8\xb2\x13\xbcJ\
-\x84,\xc1\x9dl\xd4\xe9R\x02\xbfa,Q\xa7\xdf\x80\x1b\x87\xe3H\x80\xed;\xde\x8b\
-\xc3n]\xdc\xb5\x16,\r\xc4\xadwn\xcb2\x97\xf2\"\xa4r\xd3\x954\xfa\t2\x1f-\xf3\
-n\x93\xb9\xca\xb4\xc2\x06\x11\xc3;\xe8\xf1]\xab\xbaV;D\xdf\x00\xd7\x849\x8cF\
-\xa9\x85\x03\xba~\x95R\xd8N7b\xe4\xab\xab\x8e\x80#\"\xec\x08\xad\xefrs\x94\
-\x16-9\xdc#\xba\xcc\x9c\xfbP\xca\xfaT\x14q\x9d\xb2\xe6\x9b\xf6\xf8h\x1d'\xf4\
-\x03p\x1b\xb0\x19\t\xb0eqO\xcc\xfa\x0e\x8f\xf0w\xf8b\xbb\x88\x96\xbd\xc3\xca\
-Zv\xd7\xc1\xa8\xf8\x96r\xe5\xceJ\x1d\xbc\x97\xe2]\x9d\xe2\xb5O\xcaJ\x1fu\x8b\
-,\x90e\x97\x12\xf9\x8dP,l\xf4\x1ap?\xb05\x12p;\x7f\xd5\x9a\xdb\x9e?0\x81\xa7\
-\xc2\x7f\x9f1\x96\xd7\x9b6\x9dh\xc0V\xb9\xb3\x92k~\xe9/\xbb#\x7fS\x1e\xe7\
-\xc5-\xef<\xcez,I3\xd0H\x9e\x01n\x90\xf6)\x1a\xf9\x9f#63\xa1\xff\x8d\xd6\xdc\
-\xc76\xd7\xc3<\x99l\xa3k\x9b\x8a<\xe6\xca\xe2M\xc3\x1d\x94\xf3\xb8\xf20\x8cu\
-\xbe\xaf\xce&,\xdb\xe6\xff\xc5S9G8M\x9e\x00n\x16J\x91\xb0JUkn\x99\xd5\xdeD\
-\xefy\xa8\xee@V\xf6\x18t\x94\xd3\x99\x06\x149\xf3\xa7x\xef*\xa4r\x07d\xe9\
-\xd35\x1c\xa9\xd2\x1a=\xc37\\\x14JR\xaf\xc7:99\x08K\xff\xebMC\x07\xddQ6\x12\
-\x1e\xb7k[\xfe\xc0\xf5?\x8a_\xad\x93\xac]t\xe7\xe0\xd6bR\xdeZ\xb8t[t\x89k\
-\xfe<\x9cU9\x95\xfb\x13H\xdf\xe4\xa8\xc7o\xf7\t\x1f\xa8\xe2\x9b\x86\x044D\
-\xa4z\x87\xbd5\xf7\x17\xf8w\xfe@\x1f\x1e`\xf99\x13\x7f\xeddx@\xf6{Yw\xda\xcf\
-(\x1c\x8a\x12\x18\xf3\x01\xacV\x0e.Et4x\x9c\tQ\x84m\xdbvv,\xe1>\xe1L$\x8e\
-\xd2:\x18\x11\x1e\xb7C\xdasx\xdd=\x0c;\"\xd8&\xf9N\\E\xc1\xb2r\x17\xc5A\xbd\
-\xef\xca\xa9\xf0\x08W/\xde\xf9\x04L\x04\xe6\xd3\x1c\x86z\xe1G\xbc\x81\x0e\
-\xf0\xb6\xd5T\x1f\x1e\x92\x91\x84[\x84\x07\xda\x89\x84l{B)}\xbe\x83Yk\xee\
-\x12\xf5\xc8\xe3\xe5\x8f\xbe/\xab\xb8!\xfe\xfd\xc1\x95\xdb\xa2\x08\x03\"!%\
-\x01\xfb\x01o\xe7!Q\xe8\xcb\xdaJ\x9e\x1f\xec\xcf\xe8\xd8h8\xa4\x93\x88\\^\
-\xed\x8a\xfc\x81Nh\xa9\xe0\xb0\xcb\x81\xcc\x88\xba\x04\x19\xaeY\xc2\xb2E\x9b\
-\xb4l^7\xf7\x13\xc7\xd0.^@\x1b\xdc\x87@Yy\xb4\x952\x04\xf46\xf1\xa8\x80M\xb6\
-\xed\xfc\xee\x91\xda\r_\"\xa1\xb9\xcd`\xb38\x12\x97\xa0\xd2\xd6\xdc\xd3\xf0Y\
-\x84,\x16`\x13\x8bZ\x1eu\x8a\x82\xcfMx\xe0j\x0b>[\n\x8a\xbc\x1e\xbc\x0e\xc9\
-\x86\xee\xa3\x9c,\x97\x01\xed\x1e\xcf\xeb\x16\x00\xffq\xa46F\xc4L\x98\xb0]^\
-\xad\xa1;\x1d\xe4\xd4V \xa6\x19\xdb)I2\x0b\xca]v@\x9b\xb4\x88\xf1\"d+\xdcMR\
-\x95\x1a\xf2xv\x838\"6\xee\x1bG\xeaLD\x0e\xd3\xd7\xe1\x95\x0f.\xbfo\x07\xf6\
-\xde\x0c\xb6i\xc2<\xb9\xcbN\xb8\x82E\x11U\xd2\x152\xb8\xfd\x04\x19\xd76\x04\
-\x0f>\xfcF\xd1\x06\xb9W\x80\xcb\xd0YDd\x9c\xf7\xe1\x95S\x7f\x88\x7f\xb7\x95;\
-\x87\xe9@\x16O\x84\xb0\xd5_OSJ$Cm\xfb\xd4\x03\xfb\xcc\x96\xa8\xfd\x87\xd1\
-\x80\xd6\xab\xeb\x8b\x88\x9ck\xa1S1\xef%\x97jo\x11\x1e\xb1Y|_\x17\x1d\xbb:L\
-\xdaE\xe6U\x1e\x96\xaa\x9e%\xfb\xaf\xdb\xcf\rqwrH\xd7>i\x89\x9f_\xa9qo^mmQ\
-\x06\xa2\"\xe7d\xb1\xbf\x1bJ\xbb\x94\xcf\x174\xfaK\x81vW\x89\xa9\x0ed\x01\
-\xec\x9b\xaa]^9\x0f\x1c8FY\x8e\xe2\xc4'Po\x91\xc3\xbb\xd4S\\\x8a\x88\x94\xeb\
-\xa3\"y\x19^ybA\xad\xc7e\xb9\xb1k\x98\x90\xd5\xa4\\VN\xf2\x9a\xa7-\xe5\xa1 \
-\\\xde\r>\x05\x0e,\xd9\x1a\xcd\xfd\xf3\xf2~\n\xba#\xd3\xd9\xca\x1e^9\t\x85\
-\x00_p\t\xb6!)*\xb9\xedb1TkU@y/\xbc\x8c\x17\xbe\xfc\xca\x89-n\xd0q\xb4\xc8\
-\x14\x8dD\x04rY\xbc\x175\x1b\x97\x00\x03\x92\xcf\x17\xd4I\xf2\x9c\x08\x9b\
-\x99\xd0%\x02\xce\xa7,P\xf8\xd3\x14t\x04\xa6\xa8\xc2\xf0\xa4N\xcb\xa8-E\x04t\
-\x13\xb6[\xcfL\x00\xe1\xf0H2;\xa1\x9f\xfaC\xb5>'P\xa0r\x9c\xca)~\xf5I\xc2\
-\xff=\xb5\xc6A\x00\xe6ed:[\xa5\xb1\xf2\xf0J\xf7|n\xab\x072\xe5i\xfd\"\x0f.\
-\xb2\xf0\xd2V\x8e\xc2\xafJ\xa1\x97\xe4A\x88y#<F\x04r\xf6\xf0\xca6\x18\x84\
-\xea\xc8\xe7-\x18\x13\x97Dy\xbc\x0e\xd9\xaa\xb4\xa2,G1N\xfeH\xffG\xf8wn\x83\
-\xc3\x9c\x86\xd3\x80\xcb\r\x1ai\x10\xb8!f^\x8d\xa8\x8c%Z\x11\x97W;T\x08\x95U\
-zk\xe9j R&\xc7}\x9a]\x9eN\xbd\xcc\xdaJ\xc0%|\x8f\xc8-\x84Ix\xa5{\xab//\xdc2\
-\x1d4\x12\xb25:\xb6\xb9h\x12\x98\xf6e~\xdf\xf1\x81\x9c\xf5v0J\x84\x9e\x08y\
-\x01\x1b\x19b(\xc3+\x1b\xc8\xafy\xcfX\xd6\xb1t2\x84\xcda\xfeU\xb8h\xf2\xb0\
-\xe4\x93^9\x8c\x13\xfe\x95z8&\x8a\x08\xe8F@\xc6cM y\x1f\t!\x82\x18\xf3\xd0\
-\x89\xe1Z\x99-\xf8f+ \xe1O\xab\x16\xc2c\xa3\n\xc0\x15\x14\xb3\x99\x8c\x0c\
-\xe4rpo\x0b\xaf\xf4x\xde\xb6$\xe6\xee\x90\xe9\xb8\x83 \x03\x07:}J\x86\"\x9b\
-\x1b\xd9\xb7\x82\x84\x1b\xd0\x15\x11\xc8M\xc3\xb6\xa8\x03\xbe\x01^\xe5\x9cw\
-\xe3\x8a-\xaa\xe4)T\xebQ\x841(\x88D\x99\x92O\xb5\x8e\xbbl\xe6\x99\xaf\x150\
-\xa7 *\xc9\xd1*T|C\x1c|w\xe0\xf6\xe6\xb0\x04\xd3\";a\x1e\xe7B\xf6\xbcu\xd0c\
-\x0b\x1c\xd8\xf4e3\xac[\x08\xa8\xa4\x1f\x97\x8b\x92\xabM\xd0\x1a\x11\xc8=\
-\x83\x8c\xe8]\xc6\xac\x8b\xfd\xfe\x1dgmN\x864\x86\xed(=\xa2\xb2\x85~\xe5S2T\
-\xab\xf5\xf6\x03(*=\x10@\xa3\xa3\xcax\x15\xf3\xb2\x08\x04V:\xefg\x18\x93\xa5\
-\xe9a%dp\xbb\x12\xcd2\x01\xfcJ\x86\x9a\xa3\x81\xa0\xaa\x98'`\x15\xa2\x91\x9b\
-_\xb4\x96\xa9Y\xe85\xdb\x15\xcc{\x0fd\xe5\xa4\x86\x90E\xd3\x9c`J\x84\xc9\x9f\
-b+\xf8\x11\xa7\x92\xc5Up\xd3M\xd5\x83\xc6 ?\xf1!\"G\xeb\x85\xbdm\x08\x98\\\
-\xaeo\xc1\xa5pm.\x87\xcel\x1a\xa6o\xb2-\x89O\xe1\xec\x0f\xb6\xe2\x89\x01\x01\
-N\xdd\xb5>E\xe5z\x1ffE&\xc4)\x9c;<t\xda\xa9W:\x86\xe0<d\xcf\xf5Y\xa4\xea\x0c\
-X\x86\x91?\xb2\xf7\t\x1a\xddB\xc5\xab^[\xaa\xd0\xf4yD@\xd7\x8a\x03b\xde\x0b\
-\xfft\xd7\x9eX\xbaP\xb9\xb4\x16\xfa\x16![)\xaf\xc1\x94\xe8\x9c\xd0\x82\x83\
-\xfe\xc4\xc2@#6y\xd0W\xd0\xc3n\x827\xd4\x1b\x11\x13\xa2\x08{\xc2\x84\xd8\xc0\
-\xbf\xcd{\xc5\x16\xd6\xb3E\x9b!;J;\xc4]i\x12\xba|\xfa\x95^\xba\xf1\xa8\xa3\
-\xa0\xa7\x1d\xa1\xa7q\x9a\xa2\x91\xf1\xd5G\x13\x98\x14\xf9\xf6\xb7\xef\xcc\
-\xba\x856lu\x99\x9eC\xf5\x143\xf8$\xca\x1a&\xc1\x9f\xc0\x81>\x9a\x16\xe1\t\
-\xa1\x02\x1c_\xa2\x14#r\xb4\x9e\x89\xd6\xb3\x05K\xe6\xfd\x199\x97\x13\x95\
-\xdc\x0ei/d\xd9\t'`\x0f\x1cx\xf0\xe94\xe8\xf4\xb4\x11\xb9\x0f=\xef\x0f=/\x18\
-\xe0\x9f\x848\xc0r\x94n#\xc9\xfa$\xfd\xf0\xf0\x12R\xd9\x03\rt\x12\xb2g*\xd1\
-\x92\xb8?i\xf6\xe9d\xb1\xd7X\n)\xe0T&D;\xa6#\"\xe7\xf6\x04\xe4:a\xe9W\xf6\
-\xf9\xbeH\x89V\r\xd2\xc2\x16|\xd5\"Z\xae'}\n\x1cH[o\xb1\xd3kh\xf8\x038\x9d9\
-\x85Q1!\xcem5\xe6.i\x15Gm \\\x0fY\xce|+\xc8B>\x19\xba\xf5\xc9LXB?p\xe1\x1b\
-\xe0T\x17\xbb4F#\xe3\xeb\t\xe7_\x9c\xba=pgk!\xd2\x1a*\xe9V\x82Yj\x14\xe5(\
-\xe6|)\xcbQ\x82\x95\x8a\x9b\xb7\x05\x088E\x04\x93\x11\xd1\xe7:\xf1\xf5\xfd`\
-\x12\xc6(\\\x8a\xc1\x0e\xdc\x81\x0c\x1c\xd8\xf1em'\x91\xfc\x03D\xe5\xfdR\x9d\
-\xd2\xbf*\x8a\x87\x87\x17l\xf5\xbd\x0b\xb0\x13\xba\xec\x04Y\xd6p\x87.|QY\xbe\
-\xe35\xfa\x89\x87\xff\xfc\x95p\x1c\x9b\x11\x95j\xe8Y\xe0\xa3\xb5\x07n(lM\xec\
-\xf6D{\xcb\x02\x14\xd1\x9f\xcc\xb0\x06q\xf1\x17\xc9#\xf5e\x89h&\"\xa0+\xd1O\
-\xdc\x0b\xd9\\\xb3\xb8\x80\xf2\xe6\xda\x1f\xb7\xd3\x0c\x16\xc8\x7f$T\tpJ\xfd\
-\xee\x8b\x08\xe4\xc2w\xd4_\xca\x800\x9f\xb2\x13\xfa\xf0+V\x03\x07U\x03\x9c*1\
-\xd3\x15C\xce\xdc\x1bFe\xab\xb9\x07\x9a|\x82[\x03,U\x07\x04\xd5\x04\x9c\x8a\
-\xcd\x98\xafr\xa3\x9fh\xf3\x9a\xad{\xe1\x86\xcbZ\xea\xefG\xfa\xcd\x13T\x8d\
-\xaa\n86\xe6[(\x86\x92\xa3\x18<H\t\x8f\xdb\xbdO\xd9\t-\x7fmTT\x03\x80S\xfd\t\
-G\xe3\xa3\xf5\x9f\x9c\xb3\xf9\x05\xa7|Z\xb1Q[\x97\xb2\x1a\x05\x9c\xda\xafW\
-\xf0\x14\x83\xee/\x81\xdc\xcfX\xbe\xf9\xf8i\x99[~\xdc\xd8<\xe1\x15`\xb5_}0\
-\x80\xe3$\x8f\xf8h}\xef(\x95\x81\x03C>\xfdJ\xcb\x9b\x15xk\x18p\xaa\xef\xc9n\
-\x0c\xb9?C\tD\x9b\xe1\x01(\xf9\x12\x83\x97\x81mZ\x0c\xe6\xa5\x07\t8\x15\xc75\
-\x19\x91\x06\xc0\xd5a\xc2\x84\x88S\xf9\x01\xc3\xbel\xc8,n!\x04F\x81\x02\x8e\
-\xf5\xb9\xb3\x18r\x9aG\xb0\x9cd=H\x0f>\xc5\x17\x9f!\x06\xf9\xba\x83\x07\x9c\
-\xba\x19l\xf4\xa9\x9avtx\x06\x0f\xa0Cd'\x9c\xf9\xf2+\xd3\xd6J\x17\x82}\xd9a\
-\x00\x9c\xa2U\x97]\xad\xa2\xcd-\xd4!\xc4\xce!>\xfa\"\xf3\x17\xacU\x0e\xfeM\
-\x87\x04p*\x13b\x98\xd2\x1f\x10lih\x15\xd9\t\x8bp\x00~\x849\xa4\xad\xd5=\x0c\
-\xc3k\x0e\x0f\xe0\x14-\x84\xac\xd4\xbc\xff<\x88\xa3\xe2\xf9\xdb\xc0\x9f8\x95\
-cX\xc0\xb0\xbc\xe3P\x01N\x1d'\x17\x1f\xc8U\xd2\xfb\xaae\x93?1x\x17\xbe\x85\
-\x8b\xd7\x00\xe0T\x89\x99\xdb\xc8d\xb6\xba\xe1\"\x940%j\xad\xe7|\xe9\x9cS\
-\x84]<\x0c\xd3\xeb\r\x1f\xe0\x14\xddE\xa6}f\xe5q _\xc4\xf3n\xc0\xa6/\xbf\x92\
-\xb1E\x9b\xc4\x80\xfb\x0bm\x84,[\xca\xeb\xbc\x81#\xf1\xac?\xd0\x9fJ\xa2\xad\
-\xb8\x81\xe1{\xb3!\x05\x9cr}^\xd5(\xe4V\xa8\x9c\xac3\x8d\xb3\xe8G\xad\xe4u\
-\xb8\x13UGb\xc09\xbc\x83H\x84\xac0\x96{\xae\x83\x1f\"B\xa3\x13\xfc\xe9\x9d\
-\x90\xb1V\x0eBJ!\x06\x9c\xa2-\xba\xa8%\xc0\xd1\x86\xcd*\xf5'\xb1\xe8\xc2\xd6\
-\x10%\x06\x9c\xb1C\xb86bJJ\xb0/\x80\xb0\xe8Cg\x9c_p\x0b\x99U\x1a9\xc0)\xba\
-\xa2\\\xc4\xe1\xb6n\xcb\x1b\xf0\xabgY\xceZ\xa9\xb0\xbf\xcbH\x00NeB\x0cD\xa63\
-\xf5\x1b1n\x98\x12\x97W\x88;\xbeH\xd0\x81*g'\xd44\xe0\xb4\x8a\x1dQ\xab\xb5St\
-\xc29\xa4]_\x9eb\x05\x81\xa2\xf1\x16#\x048\x84e_;\x9f\xfa\x03\x84z,\x17\xdbo\
-\x84/\xbe\xc0\xed\x16V *\x14!\xc0)\xcaPS\x84L\x88k\x917\xd0\x03\x8d>\x15/\
-\x9bq\xd5\xa8#\x06\xdc?(\x01G\xb8\x1a\x81\xc35\x03C\xb6fK+\xbel\x94U\xfc\x81\
-Q\x82[\x04\x01\xa7/\x83B_Ex\r\xd6\x84\x02\x9f\xf4\xa99\xee\x10\xfe\x88\xda\
-\xab\x8b&\xe0\x00\xe6\xf0\x80\x06C\x0b\xbau\x92\x8d\xbf;\xd0\x8f\x99\x0eZ+0\
-\x87\x10\x03\xaez\xd4Ca\xcc\x84\x98\x86f\xd1G\xf4\x9bO\x1e\xb7\x9f\xb6\x9e\
-\xa8Q\x03\xdc\x7f\x10Q\xfa\xe4S\x9b\x1f7f\x82t\xbdN\xf9\x14f5\x08\x03Q}e\xd5\
-\xa8\x80\xe9'\xedB[h\xdau\x14!K=\xc2*}\xf2\xe5\xae\xb4\x08\x19\xbc\xc3\xe8\
-\xbe\xb1O\xd1\x06\x9c\xb6\x00)\x0c\x85\xab\x07\xb1O\xcc\xe9\x16\xfd\xc9\xb6\
-\xed\xc6N\x8a\xf6\xdb\xaa\x01\xc0\xa9\x02\xfd\x18\xb0w\xae\x97\xa4U\x9a\xc0\
-\x19_\xe6\x83\xa1\xcaN\xf8\xc0\x80S\xa5\x0e\xd3\x01Bn\x18es\\\xa0\x13_\xfcz\
-\xcd\xd4\x84\xd1\x7fS5\x028\xe5\x10\x1e\x0b\xc4!<is\xbd\xa6`\x01\xfc\xb8O\
-\x98\xa1#\xa8\r\x8a\xb4\x95\xfa\x9a\x8e\xf1s\x95!wm\xeb\x9dp\x89\xfe$\xc3|\
-\xc69\xac\x95w\xf4_\xadH8\xa6\x02\xe4\xab\xd8\xb1\xb5(:E[\x96#\xf9\x91\x9d\
-\xd0G]P\xa8\x9d\x17T;Gj\x99&\xab\x02\xb9a\xb8\x84\xfc\xcbo&\xc9\x9f\n\xed\
-\xc3\x94\xc0\xdaz;5\x088%mF|\xea\xd4R\xce\x1b(\xe7\xccwP\x07\xfa\x01\xf1\x82\
-\xf5\x14wXk\xef\xa6&\x01\xa7\xe8;\x9c\xf8\x04\xb64|\x85r\xde\xc0\x1c\xee\x81\
-?\x1e\xb7\xef\xb5\xf8Zj\x17p\x007\xe0O\xd9\xab+\x9b\x83\xd7\x9f$\xe6Gl\xab\
-\xcd\x97R\xcb\x80S\x99\x10\xd3\x1e\xfb\xc4\xaeAf'\xf4\xf9\xd2\x9c\xf3\x04\
-\xe6\xa0\xa7V_Im\x03N\xd1\xa8\x87a\xe9\xe3\"M\xa5\r\x8a>\x85\x8b'\xa8\x96\
-\xdfG\xcd\x03N%\xe5yQ\x06\xeb\t\x1b\xa9,w\x1a\xe1\xd1\x97\xa3t\xcc\x9amm\xd3\
-\x07\x00\x9c\xf2\xce\x1d\xbb\xb2\"\x8b\xb0D\xcb/\xdf\xd6\x03\xa3\xbe4\xfe^\
-\xb7f\xb9X\xeb\xaf\xe2c\x00N\xd17\xac\xb4\xad\xdc\x1a\xec\x8b\xef\x99\xc76_\
-\x8e\xd2/\x96\x04\xfd\x08\xef\xe1\xc3\x00\x0e`\xb9\xa2\x02\xfd\xab\xb6\xbc\
-\x81E\x9f\n>\x9f\xe1\xd2\xc7x\t\x1f\tp\xaa\x04X\xde0\x7f\xff\x80\xca\xb1\xb5\
-\t\xcb\x00\xf1\xa3\x9aS\t\xbaBZZ+\x06\x9c\x07\x94r\xdc\xcd\xbe\x8fFD@P\x1d\
-\xfa\x93\x9d\xd0\x8a\xdb\xf8\x91\xd6\xff\xc3\x01N\xb5\xcft\x92\t\xb1iA\xb3\
-\xfc\x99C\xcc\xfab\x95\xde\xd2\xec\xc7Z\xfc\x8f\x088\xa5\xf8o\xff\xb3J\xa5,z\
-\xf5\x19\xfc\xe9c\xbd\r\x1f\x8f>$\xe0\x94k\xe3\x01O\xde9\"\xb7\xa0_x\xdc2\
-\xd4\x01\xde\xa7\xe9\x14u\x19\x88\x9e\x18p\x1f\x89\xbe\xc1\xd3\x9b\xd9\tI\
-\xa1S5R\xbf/\xb2\xed\x08\xe1\x83\xd2\x07\x06\x9c\xca\x84\x18}\xa5\x9b\x9d\
-\x88\x82\xcf\x00\x0f\xbe\xd4\xa4\xcbB\xa2&\xb2\x13b\xc0UD[\xb4\xf3\x92\xa6\
-\xf2\r\xcb\x9e\xfe:\xecE?z\x7f\xdd\xe3\x16}\xe4\xf5\xfe\xf0\x80Su\xe7\xeeu@\
-\x90\xbc\xc5l\xf6\xc5\x052\x83\r\x88\x1f{\xb1c\xc0)*\xc06\xca\xec\x84Y\x7f\
-\xb2\x130\xff\xd1\xd1\x16\x03\xeeO\x1a\xc0v_2\"\x06\xe1.\x86[\x0c\xb8\xd7\
-\xb4\xedK_\x98A\\\x8a\xc1\x16\x03\xee-\xaa\xf7\xa1}\xe6&4R\xbc\xb21\xe0\xde\
-\xa1S\xf06Ka\x18O\xe3E\x8d\x01\xf77\xea\xa0q\x8f\xfco\xd30N\xf1Y\x1a\x03\xce\
-\x01-z\xd0\xbc\xa3\x0f\x97\xe3\x85\x8c\x01\xe7\x94\x8e\xc0]\t\xb06\x9c\x8a\
-\x171\x06\x9c\t\xe5\xe1\xa1B\x7f\xdc\xba\xad\x0cDL1\xe0\x1c\xd3\x1aVpyO[\xb1\
-U\x1a\x03\xaeRZ\x82q\x83k\xae\x02~\x85\xa5x\xd1b\xc0\xb9\xa1$49\x06\\W\xbc\\\
-1\xe0\xbc\xa0\xaf\x98\xa5\x7f\x95\xb8\x19\x12M*c\x8a\x01\xe7\x92R\xb0N\xc5\
-\xbfD\xf0>\xc4z[\x0c8\xaf\xa9\x11\x1f\xde\x84\xdb\x83\xad\xb3VL1\xe0<\xa3\
-\x0cu\xbfjD\xa2\xca@db\xe9\x16\x03\xce?j\xb0\xe5\xe5\x7f\x8e\x17$\x06\x9c\
-\xbf\x84pE\xd9_\xd9\tS\xb1l\x8b\x01W\r:\xc4!\xba\x83\xd8*\x8d\x01\x17S\x0c\
-\xb8\x98b\x8a\x01\x17S\x0c\xb8\x98b\xc0\xc5\x14S\x0c\xb8\x98b\xc0\xc5\x14S\
-\x0c\xb8\x98b\xc0\xc5\x14\x03\xee\x7f[\xf8\x7fx\xe5\x08\xfb" ))
+    return zlib.decompress(
+'x\xda\x8d|uXSo\xdc7"R\xd2\x8dt\x8aHJJ\x190\x11)\'\xdd \x8c\x1e!\x8c\x0e\xa5\
+\x19\xa5\xa8\x13\x87\x80\x8cF:\x86\xd2%(!\x9d\x03\xa6 9z\xc0\x84\x11\xef\xe1\
+\xf7\xbc\xcf\xff\xcf\xae\x8bk\xd7\xb6s\xees\xc7\xf7\xfb\x89;H|j\xa0MK}\x83\
+\x9a\x84\x84\x84V\xe7\xb1\xd63\x12\x92+\x8a\x97\x7f\x94\xe4\xc07\xb8\xe6\xd6\
+\x12\xe0\x8d\xcc\xef\xa1\x8e1%\xf0\n\xa3tJ !\xe1\'\xd1\xd1z`\x1c\xf4i\xab\
+\xe5\x9e\xeb\xe6\x02\x11{|\x0e\x89\xe7\x8f\xa2\x12\xcc\x00\x911w\xbf\xb0\xe8\
+~\x1ee\xee%+\xd1\xc0\xd0!\xf1\\\xf6\x9e\x96On\'\x19\xab3\xd8!\x8a\x9a]\\\x8f\
+!\xe9:\xabh\xb1\xcc\x032\xf6\xe7\xbe\xb9\x9d\xb1\xff\x1c\xd8X\x9d\x19\x93\
+\xae3\xeae,\xb2\x89K%QJu\xd33\x1bg\xf0G\xfd\xccWF\xdf#Xj/E\x8e>F\xde\x95V\
+\xfeNP%,\x8d\xac\rY\r\xdd]\r^\x18\xc2\x1a\xa7Mp\xd3\x90GW?<\x8dn\xa5\x7f\xd9\
+a/3\x1bG\xc5\x15\xdda~7\xa3J\x96#\xf9}\xf4\xff\xf9C\x9e\xd1\'G\nda\x87\xef\
+\xa7V\xfa\xd8\xeaGz\'\x1a$=\xee\xe9\xabw\xfdmz7\x03\xc8I\x12*\x9f\xbf\x83P\
+\x11\x7f\xc4U\x89\x1c\x84\xf9\'\x9b\xacz\x9b\x97\x8b\xe5A;\x93\x18\x8e\xaaS\
+\x16+\x8a\xc3E#\x98\x19A\x8c\xc2:\x1b\x7f~p\xe0H3\xe1w,\xf3\x9a\xa5\xff4J\
+\xd1t}\x86\xdf \xf9\xdb\xf6\xe2\x07\xe6\xce\xa9\\\xe4O\xed^\xf3\x9b\xe6\xdd=\
+\xae\xb1(\xb1\xcf[\xee\x19\x83\xce;Dz\xd1\x97\xe8/\x1d\x84\xf0\xdd\xcc\xb0\
+\x06\x8a^sU\xe0\xe7\x7fw\x1c8\x1e. \xb0\xd2\xee$\xbb\x94wD\xe6\x11\x0cv\xdf\
+\xe7y\xb8\x1d%\x1d\x18\xb9\x96\xc6\x8c\xe9Y\xe5\xf55\xd3\x85\xed\xce\xad\xd0\
+\xd0.\rt\x87\xef\xdc\x14}r\xf5QUB\xca\xde\xadt\x1c\xd9\x18\xdf\x98\xa9\x16-\
+\x89E&F\xe95\xc4\xe2vdZ\xf5\x82\x8c\x83c\x18\xc7\xc5@<\xbaH\x808SA\t\x02\x93\
+-\xc7G\xf1SZ\x9e5%\x1fF\xeb\x838w\n%t\xcd\x11\xb1\xbb\x82\x9b\xa7Mzc1~\x8b/W\
+gzH\x97\x96\x80\xfb\x9a\x93f<\xc9\xa1f\x9a\xe0\xe11\xe5\xc6\xfb\xd3L\x0c\xbd\
+\xb2\xfd\xc1@i\x8a\xac\x90\xe6\xc4%\xe5\xa7&\xb0\x12\x149\xc9w\x9b+0\xed\xd8\
+\xc0\r\xc9\xc3P\xce\xa5x\x90g\xf2#x\x13\xe9F\xc5\xec\x89\xe5\xac\x8b\x0c\x1d\
+\xcd\xd7\x9bR\xc0M\xcd\xd7\xd9\xaae\x8b\xc9\x1e\x90@\xb49c\x8a\xaf\xdc\xf7\
+\xe1\xbd\x0ff\x89q \xe0B\x93\xf7\xba\x04\x15{\xf8\x80>\xc6\x12\x12\xb9z\x1d\
+\xb1\xdaF\xf1K\xca\xca7\xe9\x06\xae2\xcf\x91\x03\xb7\x0e;t\xf6\x04\xe5\x86\
+\x14\x7f\xde.}\xec=\xdaJ\xbf\xac\xff\x8e\'\xd6XB&\xf2\x06\xf95\xa0&$$\x8b\
+\xca\xe4C\xf8<\x06\x85\x97\xc2\x94x\xb54\xe5T\xb0\x89\t6\xbe\x8b\x83Coz\xf2S\
+i\xa9\xbd\x05\xdb\x81z\xcb\x8e\xe6\xb1\x8c\x89\xc9\x03\xcc\x84=r\x85\xbfh0\
+\xf9\xdc\xbe\x13\xdd\xe3tO\x8e\x83H~*\xd7\xf6\xb6\xb8\x17\xaf6\xe0,\xc7\x117\
+r\x82=\xcf\xda\x15\x8c\x91\xe8/\xe3N\xda#\xb5r\xb4\xd2\xe6\xbdr1\x17\xef\xb7\
+\xf9Y\xa2\x7f\xf2\xa2\xb9NR\x00.\x98\x80\xfa7E8\xd6\xf0\xc4l\xfb\xcf\xfe\xf0\
+\xde\xf71\xb4\xe6\xa0x\xe4\x82\xed\xe0\xa0\x90xn%\x07\xb4~\xf2\xcd5\xdc\xf0\
+\x86\xd6\xb8\'\xa6\xc7S\x91\xa8;NbO\x9a\x11/\x8a\xfa\xe2\x95\xe5\xd7OL\x7f\
+\xf7\x9cGU\xd7P\xd4\x99\x06\xe8\x93r\xc6\xe0l\xcdy\xf0\x9b\xd5`\\\xa4\x15\
+\x03\xd9\xbfU\rc\x13\x9b\x7f;\xa5\xf1\xd4\xc0\xf8\xde#\xa8\xda\xb0\xbf\x15\
+\xa6Z\xf8H\x01\x027\x12\x99z\xec\x1d\x181\xc8\xdfY!\xaf!\xdf\x98\xc1F&\xac#&\
+\xc6\xec\xf5\xda\xe3\xddI\x98\xdf\xbf\xb3\x82\xbb;\xf2\xba\x8cS$\xfa?\x97\
+\x8a\x87\xb5Y]\x81\xd00\x8bz\xde6\xb0@\xc8\x1c\xd1\xd6\xb4\x1e\x0eo\x9f\xb05\
+tt\xe0\xd5\xb4\xcc\x18\x9d,\xce\x97j7r\xa3j\xf2\xee3\x90\tO\xe9\xe8[\xfb\xdb\
+h\xfb\x9a\xdd??_\x8d\x9c\x12O{\tsu8q\x9c\xfdY\x97)k\x9dQU.S\x8b\xe146\xd9\
+\xca\xa7\xd1\x99E0\xc4\t\x0ch\xd6\x1eYp\xf7f\x9cg\x08\xb6\xe8\x80\x11"\xc6&\
+\xb10\xa7\t\x14(\xe2\xadv\x18k\xe0\x82\x9f\x7f\x80j\xf4\xbe\xe6\x03\x16PV\
+\x04\xbd\xa3r\x95\x02\xda\xe4\xef\x1b\xe5\xd1\xc6\n\xccO\xa9|\x14\xc3\x9b\
+\xcf\xef\xe5\x83\xb3)z}\x8bGr\xff\xe9kq\xf7FzI\xa81~\xa2\xf01\xf8\xd4\xb3m\n\
+m\xf7\xe5\x1e\x9f\xf7\x8a\xc9\x96\x95\x00\x1e\xcc\xb1\x1cN\x15nws\xac\r\xfd\
+\x91\xe1\xca(\x01\xf7\xb3\xb9v\x86\x06\rm;kanW\xf7u\xe0\xb1\xa8O\xdbW\x8b/\
+\xac\xdf\x19 \xde\x00\x81\x7f\x7fR\xce0(\x02\x1e\x9aw\x0f\xb8\x97\xe1\'\x8c\
+\xd4fJ\xd5\xc20\x1d\xc2\x99\xbd\xeap\x92\'E\xbegB\xb3\xd4~?\xf8\xe2|g\x02\
+\xc6\x93\xbd\n\x86&l\nqu\x80vs\xdb\x08\xe0\x7f\xfa\xbc\xad;\x9a\x98\t\xf3\
+\x96u\xea\xce\x18(HF\x9fy\x042\x9eX\xecf\xe9wa\x88A\xdf\x83\x92\xdd\x8a\xfc\
+\xf0\'k\xf4\xfb\x1d}#\xd7&\xcb\xd5\xa4\xf3\x95\\\xaa!\xc7G\x88/\xe4\xcc\xe87\
+o\xcf\x06~+\x1b\xdc\xbc\xbe\xc4\xdd\xdb\xa1\x81v\xc0\x04l\xd5\xaa\r\xe5n\xb9\
+\xdbI;"_\xa7\x8b\xe9\x7f\xd16\x98\xd0\xbc\xd6%\xa3bw\xf0A\x98\xea\x0f\xe4\
+\x87\xc4\x0f3J\xf4m\x95\xe7\xe9\xc2\x02w\x9dx\xd4\xfeu"vk\xbc\x8e\x90\xbf\
+\xd5^6\xe6\xa1\x8d2\x8f\x1f\x17\x16 \x0b\'\x02\xf4\xbf\xd1\xd29pt\xc2\xe6\rZ\
+\xa6j$\xa2\x9b%\xe5\xae\xef\xb3FQa\x1e\xfbrSl\x18(\x85S\xea\x8di\xa5\x0b3\
+\xb4%F\x9e^\x00}5\x05s@:\xe3\x12[}\xb9\x1dO\xb2F\x8b\xfcI\xcd\xb5\xd9\xa2\
+\xf8_\xd6\xcdC\xb5 \x18Ey\xe87Z\x0f\x8e\xf9\xf6B\x94P\x9e\x18\xb5+2nf\xab\
+\xec\xb0m\x10\xea#\xdd\xa2ngx\xbd\xbf&\x06\xfdE@\xbf\xe9\xd0cIQy\xad\xd1@\
+\x9c\xdc\x16\xacn\xfc\x94\xe5Z\xad\x05\xb1\xed,\xf0\xef\xce\x9d9f\xf6\xbe\
+\xd4\xd1u\x82Lc4\xc8SHP\x99\x9e\xdf+1+\x01\xd9\xf8EP\x87\xe9\x99\xd5\xf1\x93\
+q\x94XT\xd5-\x7f)w\x12\xc6\xca\xdfj\xfc\xb8\xc0\xcaQ\x8d\xaf\xb4t\xeb\xd0\
+\xd9\xafoF\xd8\x86\x12\x07\x8f\xc0\xc4\x89\x1b\xc9\xcb\xed\x82h\xc6aH\xde\
+\xf3T!\xc6\xf4\xc0\x95WK\xe7\xd6\xbd!R\xe6\xf4Q\x9f\xd9?\xcc\x82b\x0f\x01<1\
+\x81\xbaey_)-\x05Z\xfe\xab\xa8#9\xc0\xa1S\xd1gT>\xd6os|*\xdbR\xb09l\xf6M~X\
+\xa5\x03\xc7\x8f\xc8\xe5\xac\xb0\x1dm\x1fn\x8a#\xdfp\xe6K\xd4\r\xe6\xb5\x9e\
+\xda: \x02\xdd\xb6g\xa2\xa7\xaf\xebp\x99\x02\x9a\xcb\x8c\t\x95\x8e\x82*<_\
+\x8d~`!\xddf\xbe\xe1O\x08\x9e\xd4\xc1jen\x19@6\xa7:RF=%JPFm\xabO\x8b\xf2{u\
+\xb5\x0e1\x85h\x93X9r\xf1\x03p\x81\x9d\xd21\r\xc3\xa0\x14\xafl:f\x8a\xbb\x03\
+\x15\xeb\xaf\xb1\xb7\x98\xfc\xacE\xcb\x7f\x1c\x02G14\xe5\x99q\xc4\xbd\xfa\
+\xa7\xb2\x1d\xd0\xf8\xef1\x99\xb1\xc9\xc4/%i\x0e;\x00\x02\xaf:\x029\xe0k\xef\
+\xffL\xfa\x16\\\xb0L(I\xfe^0\xe8\xfcv|M\x9e\xbfe\xcc\x02\xf5[\xac\xb8\xc0\
+\xbf{\xb1\xdfJ\xc53\ng~Z\xfe\xdd\xa1\x8c"Yj_\x9b{\x1f\xb3\x17l\xde\xad\xc8\
+\xbf)\xd4T\xbb\x8d[Tb\xdc\x83\xe9\xb1*L\xc1\x04"?\xa82*\xe8\xa4\xbf\xc6.\x0f\
+\x1fm\xe0\x82r\x16\x19\x13\xa4\x84\\\x91\xa6\x1e\xac?|\xb9\xa3\xf0$\xbe\xdcS\
+\x8a\x0fg\xf3\xc5\xa8\x01\xac\x1d\xb8\xfav\xb9\x99\x96\x85\xad\x9a\xf6\xe5\
+\xa9\x19\x1d\xee\x87 \xedK\xab\xb8\xd5`\x0e\nr\xd8\xab\x96fi\x1d\xe9\xa8\xfe\
+\xed\'\x88|\xe8:dc%+\xc4\xc7`\r\xf1(\xe79i\x8c\x03\xa5\x89\tN\xb5\xd1\xe4\
+\x9a\xfeX\xa3\xef\xddc\xda\xbd\xcc\x84\xb5;\xcf\x9b\n\xaf\x02C\xad\x8e\xb7f\
+\x9b\x88-\xa6\x8az\xa9\x9cZ\x82B\x14\xdez\xc7S`\x04\x0eM\x81i=3\xb5d~\xa5}\
+\x1f;\xe6\xc0\x9bQ\xef\xcf\x92\xba\xc4`\xf3(\xbf\xbd\xa5\xeb\xfb\xf9\xa9\xd9\
+\xf9\xb3\x81!\xeb\x90\xf8\xab\xcch\xde=5\xfa\xd2Y}?V\x9b\xa97\x0b\x85\xc6\
+\xb8\xad]A\xe1\xfal\x1eb\xf6\xc8\xd3@\x93|%\xb7/\xb6\xae\xffq^\tU\xcb\x8a\
+\x80\x85\x1f\xae\xae\xfdl\xaf\xf2EY.\xb4\xb1\xec\xb6\xdet\xc8g\t]\xbd6C\x07\
+\xbe\x99\xf2\x9d\x90\x17\xdc\x14S0Fk\xb2\xfa\xf1\x84\xfd\xd6\x18\x94\x98\x0c\
+\x8d\xa3\x1bU\x03\x08<\x1e\xc0\x08\x8c\xf9O\xfd\x87*&\xf5,\xfa\xcb\xc1t\x00\
+\x1c\xe4Ld6\xb8\x86\xde\x00R\xec\xf9\xac\xc3\x01b!\xbf{[\xcd\xeb\xde\x89s\
+\x18\x8d\xa8\xa7\xae(\x8d\xa6\xd8\xbd\xc6\x92\xc0046\xf7\xdbX\x8f/\xcd^\xa6\
+\xb9\x95\xcf\x0er?{<c\x947\xa0K\x86\xa1w\xab\xc0M\xcd\xcc\xb5\xb8\xe9P,\x03\
+\xfb\xf7\xcd\x9c\xb0\x8fa\xa3\xfeJx6/F{^1\xdeY"\x0e\xca+\x91XZ\xfa;\xe78\x9f\
+\xef\xbev8eg\x7f\x15\x82\xf4\n\xc9\xca\xab\xc4\xdd;\x9b\xe1H\'>\xcc8K"J\xcc\
+\x1e\xe9\xfc\x05\x97\xbc\xa8\xb4\x07)\xbd@\x1e\x88\xc6\xb6V\x06f\xcf\xa2\xb6\
+\xdc|Ry\xd0\xd5\xc3W\xf5\xa6\x11\xf7\x8b `\xe6g\xb7>\xe3B\xa0.2\xc4\x8f-\xc2\
+Kt\xd7\xdc\xac\x1e\x86\xb1jN\x97\x9a1(\xa7^\xdd\x19\xf70\xfcw\xd3\xe9\xe6\
+\xa4\xb2\xcc\r\x9c\xbd\x9b\x94 \xb4\x13\xaff=\x15\x0b\x04\xd8\x89z\xf2=\x87\
+\xceI\x914\'\xea\xe2\x1d\\\x96\x96n\x8dD\x97:\xacd\xfe\xd7[\x1c\xd9I\xeb\x82\
+\x1b\xf6\xe5\x90`\x04\xb3\x03F\x91\xa6\xab8\x1cq!\xe8\x01\x81\xae\xc4\xff\
+\xacI\xfe\xa7R\xf8\xa8\xf6\x01C\xbbF\x8d*v\xa4N\xe2\xfa\xe4\x1b\x90$\x95c\
+\x1d\xbd\x95#\x8e\x01?\xbc\xe9Y\xa47/2?\xe5\x86Z\xe1V\x05X\xfe5\x8a\x9ca\xef\
+\x8e>s\x05n\x92\x0ct**\xf8M\xc72\xc5\xc7\xb9\x96\xb3p\xec\x96B\xfd\xf2LH\xf3\
+X\xcf \xbf\xea\xef>\xfa\x82\xb7<>\x8fx\xd8\xaaa\xf7\xcfq%)\xd6\x14\x08\x95(~\
+\x00\xd17\xa2\xed\xe6X\x87\x8f\x1aes7\xe1\xebi\xb7\x16\xbf|\xf5:;{\xfc\xe2T^\
+\xdf\x03\xea\xde\xe7\xcb\rdH\xe3/3\x13V\x7f\x9b\x9d\xb0\xd9_x\xb5MG.\x84\t\
+\xf6\xb7C\x1d\x053\x1a\xb1\x17\xce\xb7\x9d\x88\xd1)I\x01\x92\xb51\xd9\x1d1O\
+\xf2\xf1\xd9\xb7\x9b\xdb\xaeBQb\xf0\xcf\xdb\x93\xec\'.\rr\xca\xa9c\xee\xd4\
+\xdf\x0fzY\x80+\xa7\x9f<\x9d:\xfc\x15(_\x00\xa5\xd2I\x7fZ\xd4\x9b\\\x89\xbf\
+\xc7}\x91\xe9X\xb4\x13m~\r\x8ej__\xbf\x95\xba\xe5\xa8\xa6\xa6VwNH\xb9z\xd5\
+\xcc\xcc\xec\xf7\xc5\xcf\x1c\xfa\x87\xc1v\x9d\x17\x04\x8d2M\x8f\xf1\x8f;#&1\
+\x8b\x15/\xf7\xa5Y\xf4D#E2\xa9.\x8c_\x1e5\xe4\xd3?@@\x82\xc2NC\x16\xb1\xf3\
+\x91\x8d\x9a,\xa0\xe9\x13\x17\xabi\x04\xfa\xc2\xfc\xf5\xf1\xd1\xbd\xc8\xe8\
+\x93\xb6/\xff>\x9eu\x03\xbf\x11\xf7\x03\x15|/\x08\x84\xaf\'\xaa/\xd4\x1b\x1a\
+\x1aT\x89\xd9\xb0X\x90\xa7\xe4k\xeb\x9bU\xa9e\x06w\x8e\xbf\xd1\xa6\x1aS\x17\
+\xbbK~\x93o\xd1q\xe0\xc3\xe8\x0e\xe9\xe3\x98\xf4\xc7~+\x1f\xb0$\xae\xdd\x89\
+\xaa\x98j\x1a\x8e\xbc\xb6\xd4\xfey;\x19\x01\xd1\xb9\xa1d\xe4\x99>\xfb\xf7\
+\xdb\xf7\\\x88E\x16\xdbv%\x97\xdet\xeb}\x13\x13\xca.\x86\x95\x07\xf3\xb2y\
+\xb4\xefx\xae\xa5.\x8d\xf7\xa5\x95\x96\n6\x957.$RA\xb0\xbbj\xf4\xbd\xbe\t\
+\xcc?o\xcbJ\xc3Ig+&\xdd\xa3j\xc5\xe0\t\x15\x82\xee3&,\xa0*h\x93\xdfM\x07\x88\
+\xf6\x03\x8eQ<\x03\'_<\x15\xe6\xe6\xad~\xa6\x93\xec\x05\x1d\xaf\x1b\xbd\xbe\
+\xdd~\x9bsE+v\x92y\x89\xbb\x0c2\xf4\xfa\xd3\xda\x01\x92\xab\xe5\x00\xaef\x05\
+\x97\x9b2RZ\x91\x96i&Y\xd6\x83\x81\xc1$\x1c\xfe\x12r\xcc^\xfd\x93C\xec\xb6\
+\x7f\xf7\xed \x82J\xd43\x87?\xd5\xd1\x1c11hu\xfaMN\xe5{\x9b\x84\xbe\x11\x00o\
+\xba{!v\t\x82{o\x98A\xd5G\x1f#W\xba\xf0\xcd\xa6Jz\x9e\x98\xb8`\xd7g\xf8AO\
+\x8c\xed\x13#H\x97\xccc\x1e\xc9\xa51\x19\x07"\xffB\xc9\x94\x85\xc5;\x89\xfe\
+\xfc\t\x1e\x91\xdb\xf7\x94\xe9\xedy\xea=f\x06}\xad\x95\x9a"\x99\xebT@+\x8a\
+\xca\xca\xbdt\nH\xb8\x94\xd0t\xef\x96\x01+0\xc4\xdb\x89V\xd8\x82p\xb2Q\x0c\
+\x0b\xb2\x10\x96-$v\xa9\xc5\x0f\xd6e\x97\xa0\xe6Q\xdb\xaa%\xa5\xd4=\xadW0\
+\xdb\x9f\xbf\x1e\x97`\x82\xc3l\xa4\x15\xc4\xe1\xa4\x93\x02\xd5x/\xd5\x11%\
+\xe2\xfb\x8e\xbb\xbe\xc5\x0fO8\xbb\xbd\x05\xa3\xf8]\xc3C\xce\xad\xcf\x9dx&c\
+\xf51B\xc7Qu\xc6o\x86\xd2\xcf\x06>\xbb\xddpS\xfdG\xbc\x9bC2vk\xdd\x14{$\xda\
+\xe3\xb1\xaf\xb63\'\xec\xf7\xde\xa1\xf3\xc8\xa0\xb4tc\xe0(.\xd3\xe75\xe4c\
+\xa3\x8f5B\x04N\xdc\x86\xd7C1=\x80k\x98\x82\x95\x8c\xb5\x10\xf8\xa1\xba\xbb\
+\xe1|\x80f9\x89P\xa2o\xae\xc0\xa5\xe8\x94\xff\x01M\'Rf\x14\xea\xcc\xb3\xbe\
+\xbf\xd4u\xda\x837=\xaf\x82Y\xfed\x85\xc8\xd07\xcd\xbc\xb3\xa4\x986>\x88\x06\
+\xc0\x98\xd0\rm)}\xb9\xf4\xb5\x8d\x1bj\x97\xe8bb\xe2c\xf3A\xf9\x0fZ\xf9\xfb\
+\x18\x8c\x07\x10,\xfbm\xfdD&\x8bG\xa8\xaf\x04\xca\xef~\x83E\xadEm\xc6t\xc6&\
+\xd7\xa0f\x1e\xd2\xee\x99\x0c{\xf5\xd0\xa6l\xba\xbd\x7f\x7f\xeb\x03\xb2\xfc\
+\xef\x14\xd0I\x91\xba;!\xfeG\xa0p)\'M\xb2p\xee\\\x0e\xba\xd8\x8e\xee\xa8\xde\
+_E\xa8\xfa\xfc\xf3\x13Gj@\x8e)|\xf6\xe5\xee\x92I6\x9d\n\xccNa\x84\x1c\x0fY\
+\xfe\x94\xd7w\xb0`\xabW\xd351\xf9Z\xe4\x05=\xbb\xf9\xcd\xc0\x9e\x0fS\xfe\xde\
+\x7f/S\rp?}\xa9\xcf\x88\x12:L\xc0\x80\x8c\xd6\x9de=\xb1@0\xf6\x0e\xaa\x9b\
+\xf1\xf4\xae\x0bs\xce\xaa\xd4\xa8x\x9f7KU\x95\xac\xdd\x0cR\x94\xdcD\x9dY\x86\
+\xbce\xca{\xd8\xb4]\xf1\xa5T\xbcF"\x0f\xbe\xe0\x12\xac\x18\x15\x96\xa5"\x9be\
+ \xe0=v\xbd\xab\xe8^ad\x82\xa5\x89\x89\xb4\xea7h"\x12%\xf6\xb7\xa1\x95\xa9\
+\xbe\xb4\xd4\xd6\xf3k\x13\x83\x02q\xfa\x91?+8\xb4bVQ\'\x1fj5\xfeO?{\x80,\xa3\
+\xb8\x1e\x10^\xd2\xf6\x18EX\xc7\xc5\x97w\x90\xe3E\xa1\xa3\x90\xbe~\xbcZg?\
+\xc3\x82E\xa8\x1b \x98\x01\xe01G\x1cJ\xe1\xbfc\xc7\xf4kr8i\xba\xf8\x03\x96$\
+\xa1^A.\xbc\x13\xf2r\xfdw\x80AP\xc3X.<fD\x93\x05\xf1\xce\xecEdm\xbcY\xcd_-]\
+\xad\xcf\xd9\xc8\xc5\xa9\x8c\xcaC+\xd5\x05\xae\x92d\xc2\xd1\x0f?\x14\xc6F\
+\xf1\xf37\xc2\xdd\x8d@/\xd5|f\xbd\x9a\xa4\x04/\xc9\x99\xb5\x9aQ\x89~-i\xf5T\
+\xd40\x84s\xee\xd7\xe7m\xb4K\x9a\xb0\x0e\xd3\'f\n\xa4i\xe4\x0f\x97Z\xce:\x9b\
+rf\xbfW\xd8H\xbc\x87\xdaP\xb4\xdf\xdc\x83\x90!2\xc0*\xd4\x08t\xa6\xfbZ\xc5\
+\xb3v4\xb4\xff\xe53\xf8|\xce\'\x8e>\x9fa\xf3:o\xcb4\xe5\x8b\x8a\x8f\xa7\xf8t\
+A\xf4S;o\xe8\x9dey\xb7\x1a\xec\x1a\xa9\xab\xf5\xb9\xdc\xcd\xe28G\xf7SV\x96\
+\xc3\x12\x1f\xf4\xf7\x9dF\xad\xe3\x1c\x1c\xea\xfb\x99&\x1d!22-:\xfa\xaa\xf1E\
+A\x16\xb6T\x8cZ*O7\xec\xe2\xbc\xe5\xe8\xa3\xdff\xfb?\xb3G7WH\x0b\xdd\x167.r3\
+\xae\xbf\x13\x01\xcc\xd4B\xdb\xa1\xe5\xad\xe6\x0b\x1e0\x0b\xe3)\xf6\xca\xd1\
+\xc5\x84F\xa6\x1c\x8c,i\xdaR\x14@!\x9e\x11\xf6\xf96xM\x1e\xbf2}\xb1\x91\xdd\
+\x14\xecO\xceq\xde\xa6\xde\xc2\xf4\xf5?\x15/\x01\x9eI\xef\xeb\xf0\xde\xdf\
+\x1d\nc\xe2iUd\x7fl\x04\xe0\xc2M\x8f\xa0\xa4\x10#\x99\xd9h*+\n \xf6\xc2\rw\
+\xf2i\xb9\xda\x8e\xff\xe6\x1aVO\xfc\x8ap\x06XC~Q\x94\x92\xb4\xb3\xff\xf5\xac\
+\xa3|+\x1c\xd0\xc47\x9d\xb36*\xe0\xbf\xd5\x8awB\xa2XZ\xb8\x88\xf3u7\xc3\xd6\
+\xf5\xf7f\x8d\xdf\x8e\xa8H0l\x93\\\xaa\x07\x10\xa5t\xd7d\xb9k_\xe8\x1d\x10\
+\xcaD\xf01\x86i\xbf\x89;\xce\x81\xe6\xfc\xcf\x08\xec\xac\xd26\xa7\rP\xa4\xbb\
+\xe1m\xcc\x14\xcfS\x97l\xf7\x87l\x93f\xfd\xce\xb3Z\xa7Z\x7f\xe6_\x92\x03\xfc\
+\xb1\xd1\xc7Wv\x1fL^\x81<y\xe4\x9a\xb2:j\xca~\x15*l\x97\xe8\xce\x9b?\xae\xd0\
+\x99\x19\x1a\x1e\xb8\x19\x9c\x1d\xdfZ\xf9\xf6\xf9\xbe\x99Q{MX\x1f\xfdf;\xc8q\
+\xa4\x07P\xd0Ui\x9b\x06!-\xa5\xa5\xd4\x17s.\xfa\xd6\x08\x1af\xb4\xc8S\xc4\
+\xb2\xaeR>\xfa\x8f\xa2r\x8c\xc3\xe3\xad\x9c\x8f\xab\xf9n}O\xdd\xe9\x00\x95\
+\x01\xd6\xf2\xbe\xcfl\xf7]\x86~\xd0 $\xbc\x0f\x9b\xc3\xe4u\x0bg9\x99\x1b+Cc\
+\x15y\x852jw\x91\xa5\xd3\\\x03\xe0\xf5\xc7\xec\x06,$/\xa9|\xb3i\xa5;C6\xda\
+\x85,>\x11\xd4*\xcd\x8c\x9e\x00\xd8\xcb\x02\x82E~+\x15L\xbdu\xd3\x80\xd8\xab\
+$\xb0~\x03\xc0\xf2\xaa;\xfdw\x94{y\xde\x83d]R\x17\x1c<<u\xff~\xabx3\xa9\xf5W\
+W\x8di\xc48\xe0\xdd\xc9\xbb\xc0\x87\x01z\xd1\xf8\xcf\x1fN4S\x97~7J\x99\x8c\
+\xef\xdb9\xa9\x0f\xfb~\x9a\x04\xe9\xa7?vtF^\xf7~\x91u\xdfd\xc2@kP\xe6\xf13\
+\x05\xe6\xfa\x08\x07F+C\x7f\x88%\xe0Peh\xa2-\xb3\x8d\x16><\rxW\xc0i\xf2$\x9d\
+\x8c8]\xc8\x96\xde\x905GT\x05D6\xe1\xac\xa7\x8e\xa3(z\\\x7f%B\x15\xb0]\x87\
+\xa0\xde\xc2\xd8\x93V\xba^_w\xf0,\xbe"/\xdc\xba\x12\x04}\xeb\xe2[P`l\x8e\x88\
+\xfd\xad\xb6\xd63\xf5\xab\xe6\xf1\xfc\xedr\xb3\xa8I\xfd!\x13P\xf0\x86\xfeH\
+\x80\xf0\xaf\x7f\xf2\x80V\x13%\xeaxF\xb9\xda\xf4\xb5\xc1\xc5\xe0\x94]\xafg\
+\x97\xd5\x86\xfc\x8aU\xddq\xe1\x8f\x8f\xf5\xcf\x0b\xcc\x9b\x8f\xb2\xda^\x00\
+\x1c\xa1\x13\x91#\xacC)\xad\xb9\xc1"\xd3\xcc\x7fm\xc5&?\xad\xb8\x14.SV\t55\
+\x89\x15so\xfb\xc2\xb6\x14^\x95^\x9a=s\xca\xa7T\xdd\xd4t}/\x92\xc9\xf7\xec\
+\xc2vi\xaf\r\xcd\xfe\xe8=$\x11\x8f\xf7\xf3<]J\xb1l\xe5\x18\xc2O\x9fal\x80t\
+\xd1\x9e;\x8f\xc7\x98\xb6\x1aN3\xf9\xf8\xf9i\xce\xe7\xea\xa7\x93\xcd\xb6\x8d\
+\xcb\x10\xd3\xb6\xb4\xf5NZS\xd7vP\x96O@\x16\x08\x00\x8e\xe3/N\x18\x80\xc4\
+\xc1n\x04\x02b\x12p\xf6\xf8\xc8\xbb\xf5\xef7\xe4E\xe8$\xcf\xdb\xf0{\xff\xec\
+\xf8\x04\xce\xa4\x99\x14\x15\x15-\xcf"z\x9e\x9bw\xa3\x9d\xf6\xed\xee\xc2\x89\
+QH(\x16\x9d3s\x9d\xf9\xfe\xf1\xc8\xd3>\xfc\xe3\x00:\x9b\xa9\xb3g}\xd1\xc1\
+\xae\x9dw\x03\xdc\x8d\x86j$\xfed\x7f\xedN\xc9_.\x91\xee}c\xcc\x0e\xd1\xce\
+\xddF\xa3\xdd\x83\x8e\xb9F\xd11b\xf0\xe2LY@l\xd5\x9co\xea\x0b@u\x13\x962\x96\
+k$\x19\xd1\xb7\x1b\xb5\x9c\x1b\xe4\xc4\xe0\x0f\x99<l\x1a\xd0=\xf9\x9bb\x8f\
+\xd3c\x82^\xd7\x7f#9{,(\xea`Tl\x18\xcc~`\x15D?\x94\xb4\x92\xbd:\xa1%9\xe4\'\
+\x06\x1f\xd5)\x054%`g\x8a\x9b\xdc\xf5\xc7\xd3qdjC\r\xd2\xee\xcc\x82\xbfu\xd2\
+\xc7\xb5\xca%tG3\x17?\xdb2\x02\xccui\xcd\x94\xec\x9cO\xaf%\x01\x02\x13\xcc\
+\x02$\x8d\xf3\n\xa0\x10\x01\xd5Yjc\x00x~\x93\xdc\xe89)|{\x0c\xae\xb1~?\xbb\
+\xb4\xf4q\xe7\x06\xe4\x9fT\x9b\x9c\x05\xe2\x0fQ\x03F+M\xa3\xf9lh\xf6\xc1\xbb\
+B\xb7\x1ba\xd8"\xde6\x00P\xee\x11\xac\x08\x1e\xcc \xc6\xd6\x1d\xa3\xf90\xbc]\
+w\xe5\x96\xfa\xcf\xefq\x0e\xed\xea0\x0b\xc6\xb0^\x19\x07\\\x06P/<T\x13\xfe=\
+\xa9\x9f\xec\xbb+ d\x1f\x002\x8c\xba\x83\xa77\x17\xe1\xd8"\x11"\xcd \x02M\
+\xf3\xf7E\xe9_\xa1\xed\xba\x1f\xc6\x1a8\x16\xcfOYL\xeb\xa8\xa2nVJ=\x94\xa7\
+\xe4\xbdg\xa0\x1e\x94M\x10X\xba\xf2\x9f\x91\x1f_\xa6|\xa4\n\x14\xca0\x1b\xa2\
+\xcb|9\xd3U\xa1$q\x0bN\xfa\xabz\xec\xa7|\xdc\x92r\xb7\xaf\xdeV\xeb\xe1\xe8\
+\xd4\xab\xf4].\x10\xe38O\xbd\x17\xc1\xefm\xa7\xef\xa7_\x93\xf5\x8b\xb7O\xfc\
+\xef\x02\xca\x01`\xaa\xa2A\xc0\x19\x8e\t\x8fHn\x9dN\xf7*F\xe1\x7f\xfbE\x86=\
+\xec\xfb\xc1\x02r\x08\xf6\xe6i\x8f)\xbf\xdaW#l\x84\xa2W\xd9\x80c\xb5\x84\xa7\
+\xa8\xd4\xab\x0f\xdc\xae\xb4&}RZj\x7f\xe9g\xbd#m\x89X\xee\xef!\xe5\xcd\x14J\
+\x01\x88\xe8\xc6`\x9d\xfa5\xb2\x1f7>C,\xea\xbf\x13Pb\xbf\x83m]\x12\x7f\xd5\
+\x89*\xddo\xca\xea\xf3\xb7\x89\x8f\xdcn\xd8&\xad\xdd\x96q\xf0\xf8\xa8\x9c\
+\xea\xc0\x17\xbe\xa0\rd\x83x\xb6"\xee\xfb\x98\x05\xa2C\xa5N%1\x81\xec\x01\
+\x7f\xd2b\xdda+\x9e\xc4\r\xa9XA\xab`\x91\x10y\x9c\x81&3\x8fg\xab\xbf\x1a\xe6\
+kv\x7f\x06<[\xd9t\x8d\x91\xab\xb7\xa42\xdc\x94\x9eUg\xcfuF\xdc\x1a\x01\xf9\
+\xb7\xaaa\xa2\xc5\x99\x03\xe0lRPQ>\xe7\x8f\x0f\xde\'T\xbeY>\xdcE\xdb\xd8\xc3\
+\xc7\x01+\x1a\xea\xd7,I\x86\xf0U\x12I\xc6"\xcd\xd1\x12B<cM\x0c\xec\x0e\xba\
+\xf7\xb9{\xc7c\xac.\xca\x9a\xd8\x82R\x97\xdaUj\x8a\xd5\xf5&l\xea\xe5\x8aX"\
+\xde\xc6\x07n\xc0&}B\xe6\xed;\'Ik1\x9c\x9e\x18/\xf5\xf4t\x08\'\x98\x05\\T\
+\xe8\x86|\x08 Ha\xc4l6\xf9\x10\x9em\xc5\xe6\xd8E\xc3z\n:_\xfe\x01\xf3\xdb~\
+\x93k\\\xca\x1ab\xd1Y#\xb1\xf8|\xf4N\'\x82\x04K\xc8|\x9b\x14Xo\xa0\xa8i\xebh\
+\xc1\xe6\x89)D\xa0d\x17\xe8\x01Vf\x021\xea\x8dm:m]\xe7\xbf>\x9d\xad\xbd\xf0\
+\xb72/a\xd3\x85\x1c\xa0\xf1\xb0\t\xfd\xc4\xf4\xc8\xed\xa9\xc918*\x88\xb1\x1e\
+\r\xf8u\xe0\xb1\x1eR\x00Y\x96u\xd1\xd1\xa8\xde|\xd9Z\xd4\xa5\x8a/\x1e\xdb\\\
+\xdb_?\x91\x1a\xa92b\x01\xa5\x07N\xbf\xb0\xea\x85E\x89\xacE\\\xc1\xa0sw\xd6\
+\xb3\x12o\xdcg[\xd1\x1f\x8b\xa9\xf6\x1e\x1f\x95\xce\x87R\xfd\x01=\xb6\x89>\
+\x11\xb7@<\x98\x07_\x98\xab\x86\xa2\x89\xeb\x0f\xc7\xc7mXkg\x92\xc5\xdd\xc1,\
+\x0f\x8e\x1fT;\xb9_\xb9\x18\xd0\xf6a\x94_y_\xd2\xb41\xcaN\xc0\xab\xf5\xfa\
+\xab\xc4FNF\xa8\xf6\xc2\x00\xbe\xc8\xe1\x07\xe2\x15\x83s\x86\xba1\xaa\r\t5\
+\xc2\x8b\x8f\r\xc1,\x1djk\xa25\x19\x06E\xd2?\xbfB\xbb\xfes)\xe6T\xe0\xb2N\
+\xda.~\x10\xde\xe6_\xfdw\xda\t\xb6\xb4\xe2\xd0\xaf"\x86\xa68\x9e\xd6nW\x0e\n\
+C\xa9[\x12\xb9\x04\xcdK%{\xfe\xd1\x10Va\xce\xa66\xd46\x0e\x19}\xf1%9\xda+\
+\xe6\xf3u@i\xce1\x7f@~\xfa\xb4\xa0f\xa1\x02\xe3\x1f\xffo\x9a\x10\x05G\xfam\
+\xf2\x0f\xf9\xb9\xbf3U7\x96v\xce\xed\xd7:\x97\x12R\xa6\xe7\x87\xca\xe1\xfb\
+\x08\x9d1[Y4\xfa\xf2\xc9W\xaf\xa2\xa1F\xd7\xab\xd5\x87p\xf9m\x0f3\xffg\x1a#\
+\xcf\xce*hD\x9f\x8f\xb4\xdf\xdd\x80O\x96f\tru-\x18ya\xa9\xd7W\x13f\x11h%\xca\
+\xdd+@I\xba\xa1\xfb\x12\x0c\x88=\xd5\xb5\x17H\x02\xab\x16X\xcb\x1fD\x98\x1c\
+\xaa\xa1\x01<A#\xd6\x92+([\xdbr\x04h\x10O\xaf\xc0\xb9\xb3\xa4\x90\'UB\xe5s\
+\xf7q\xe6O\x14U\xa9\x1b\xac\x82\xd7\xdf\xfaK?\x1c%\xf5\xa5R-\x90\xd6{\x1cl\
+\xe6\xcfY\xed\x1e\xabd\x9fIq\xbd\x98\xb7\xb4M\x91\x92\\\xd4\x9d\xc4\xc2\t\
+\xd1\x00)]~-\xac\x93P\xb9T\xa0\xcd\x96\xc4\xd0\xc6(\xa0H?\x88,.P\xba\x9c%`\
+\x06\xcb\xd1\\\r\xce6\xca\x93\x1e\xcb\'\xb8^{\xfcN\xe3L#\x16:5\x1fw\x18\xce3\
+S\xe9\xf9M\xa7>-\xf2\xbd\x03l\x04\xe5\xf3\xde\x9e\xd1\xea\xaaM\xe13\xffW\x12\
+\xfd\t\x15\x1b\xceI$\xb6\xdc\xd2\x88\x96\xdd3U8\x8a\x9f2\xaa\x80 \xb0\xab\
+\x96\xc6r\xd0\x06\xf7\xd1@\x86N\xfb\x9f\x82\xc0\x80Ry\xac\x89\x14\xd9\xdf\
+\xc7\x98?\x94f\x15\xf5\x04\x0c\x80\xa8\xa66\x03\x19\xa0U\xfd\xf0,&6!\x7f\x8f\
+\x9f\xb3F\xb8\x8e\\\xdf"dSoY\xd96|2(\xf21\xe0\x0e\xa1\x1fS>7\xee%4\xb8\x07\
+\x7f\x90\xf4"\xb1G\x8a*|\x0c\x9e\x07\xe4<\x97]\x80\'\x07%\x02r\xe9\n\xbe\x99\
+\xf5\xb4\xbe\x12\x83#j\x14\x85\xe1\x86g\n\x00\xbf\x8f@\xc8z}U\xd65\xed-\xf2\
+\xb9S&\xe3\x7f\x1f\x13"\xaf\r\xe1\x8bS^\xdf[\xec\x9f\x14\x05\xe4ak\xe1\x87\
+\x9c\xf2\xdbe\xab\x1d\xcc?a\xa40\xb3\xef\xfa/\xc6\x08\xb9a\x1f\xe5\xf5e\x89i\
+r?.\xbe$\x0f\x0e\x0e\xde\xd3\x18;/ ?\xcey\xeb\xe6\x91y\xc6j\x9b\x87S\xa9\xa8\
+\xac\xac\xbeuz|\x06\xb1\x10\xa4$\xe5>\xcd\xa1(\'\x080\xb4%*\x9f5\x14)\x9fN\
+\xc5\x8fk\x90\x01\x15\xc1\xe1p\xd2\x91\x86\xdc\xbd\xff\x0e/.\xa2\xf65\xaf\
+\x10\xd2\xceC\x82w/b\xe2\xd1_\xfe\xe4\x86\xac\xe57h2\xd3\xd3\xd3\'\x9cK\x91\
+\xf2\xbeZ\xbf\xe8Q[ a\xab\xbe\xb2\xe6\x95R\xe4\xfd\x956\xd5i\xcb\xa8\xd0\xf1\
+\xb8\x92\xbb\xe7\xd5\xc8\x89\xe0\x81\x9f%\xe9`MS\xbf\x9a\x8c\x9b\x95 \xe2\
+\xf7\xbb\x837\xbb\x821\x10\x8br\xc3\xae\xa2\xb1[\xa8/\t\xb3\xda\x9d5e\x06LH,\
+\xea\xe7\xa2\xdb\xbc\xb9\x87\xc3\xedK\x03\x197\xe3\x19\xec=U \'0b\xe4\xc3\
+\xfb\xb4\xc8\x19\r}KQ\x15\xfb\x1bz\xe9\x1br\xcb<\xd4I\x7f\xea\x93\xea\x8f\
+\xa9X4\xf8\xdb|h\x1c\x9b\x85\x9c\xfc\x90\x9b\xeb1\x8a\xf8x$\xde\xb6Y\xe2\xed\
+i\xf6\xe8Z\x92\xf9\xb8\xa7\xb3\x8d9\xc6?\rx^c^\x05\xba\xf8J\xfb\xd2\x98\xb7\
+\t\xae\xed\xf0[\xfb\xc2\xbd\xbc@\xfdH\xe9\xa1pJ[n\x87\xc8\xbcRq\x0e\n\xf2\
+\xf1\xac#\xbe\xddU5\r\xe4\xe0p-Q\xe7\x03\x8a\xfc\xb5\x98\xf1\x14lZ\xfb(\xa7\
+\xcd\xfb\xa1`\xa3\xb0\x80.w\xbf0\x90\xb2\'\xa2\xb0\xc5\xa8;l\x93R\xcf\xbf\
+\xf0>\x06\x07\x07q\xd2\xa1\xa2\xec?RF\xdd\x9f{q\xab)\x10\x04\xbe?\x0f\xbeW\
+\x9f\xb1\x93C\xcc\xf7\xed\xbf\xfd\x9f\tX\xfb\xbb\x9c\xbb)\x06H\xd9\x10\xbe\
+\xa8lqiy}M\x9f\x07\xebW\xf7\xee\x9f\xdc\x0f\x83\x8d-v\xa9\xdd\xfd0|\x03[\xa6\
+\xe2!\xe2\xe9\x86\xec\xbc\xbb\xdd\xf36RO-\t\x83\x83el\xe4F\x85nL6\xba)\x08\
+\xe8\x18\x1a\xf1\xc2\xbf\xaa5\xa5\xfa\xbfQu\xe1Ev\xd3}z&\x7f1Z\x94[\xf4\x01\
+\xc1O\x99\x80*\x9e\xfc\x86\x9b\xd1\xb0\xc1ZE,\xcc\xa8(\xa6Y$\x95\xb8\x02\xc6\
+f,\x1f\xc6\xae@\x92\x02\xe6l\xe8h)\xd3i\xa9\xff\xe7\xc9\x8b\x04\x92\x06Y\xfc\
+\x9e \x02\xf8a\x07\x8e\xf2$\xa4\x18\xfc\xb1\xb7\xd1h\xd1\xc1\xfbb\xd0\x87\
+\x11;\xcec\xf5G\x8b\xa0\x07\x12\xfd-c\xf7BK4\x0c\xa7\xde\n[4\xb6\x0b\xeb<\
+\x0c\x99\xc9\x1e\x0f\x9d\xa9\x90\x98pT\xb0[~\x03\x99\xb1\xc6N\xad\x92L\x93\
+\xac\xfcJ\xc4o\xe3\x9d9\x1em\xb5\xb1\x93\xe5\xeey\xff\r\xd6`oK\xcc\xe2n@\x17\
+\r\xf6\xc7\xd7\x1ceA,~\xb5\xc8y\xff\xf2\xb5\xdeY=:\x94\xd1\x7f\x1b\x92\rGe\
+\x18\x16\x8d\xd9\xa6\xea\x00%X \x0e\xcf\xad\x03\xd4MC\xc4\x91\x10N\x16\xd0z\
+\xfd;W1\xca\xa8\x9724%\x8fR}\xb9\xdf~\x92xr\xf5\xf9\xcext\xe8\x06*\xa4\xd8VO\
+\xd4\x8d\xaaa\x886\x17\x83\xa6\xee\xfd\xeb\x86\x8fN\xd7\x88\xd2\xae\xa9`\xed\
+\xed\x92\x0c}\x0b\xe1t\xe0\x98\x14\xc2\x14\x85\xb5jL\x92\x1e\xeb\xf3\xea\xa4\
+\x97\x05<\xf4\xc6\xf6\xcd~\x17\xeb\x7f\xe1\xc5c\xe1\xa7w\x12\xe9A\xef\xb0\
+\xa6r&i\xa3\xf1\xceo\x08\xbfB\xb2\xb2\x1f\x18\xcck\x03\x1a\xc7\x7f\x04\xbc\
+\xf5R\xbb\xab\xda\x14\x10\xae?}\x81\xba\x05\x87\xf1\x8c\xa5\xdd\xd2Y\x99\xeb\
+\xd9E\xc9\xcf2\xa0c\xbeEn\x1bEj\x07q\x06\xb0-Kq3\x0f\x94\x0by\xd8\x9a\x9c\
+\xdd\xab\xb4I~\x9f4\ro"\x85\xa3hF+\\fv\xd5\xe8\xc3\xednz<\xab\xfc\xac\xa0\
+\x15\xe1\xc50g\x9cz\x88\x04(hL^u]\xf3\xf3\x96\xfb\xeeP\xb8\xfb\xfe\x97\xa5\
+\xd7\xd9\xe5\x9a\xfe\xd6\x161~\x8b\x0cE\xaf\xcd\xfcg\x9e\xecJ\x1a\x9b\xc4\
+\xeeDJ\xce\xbb\xbc>(/\x83\xd2\x01u\xebD\x0c\x13\xb9B(\xa3W\x8f{\\W\xcb\xc5\
+\x1e`\xc6Vjg\xca\x8e\xad\xcd&\xe6\xd4a\xaaI\x19a9\xbc\xf3N\x16\x8a\x1f \xdf\
+\x08~\xc4\xf7@h\xe1O\xa5*\xcf\xd0\xa7R7k\x93ySuNE\x7f-eDT&\xc3\xcab\xaaX\t\
+\xdf\xe7\xd4\xe4g\xc6\xf1n\xc5\xa5*\xd2\xdb\xd7K\xf9gz\x8f\x9a~1\x0f\xe1\xf1\
+\xf2\xfa\x1e\x91yab\xab\x1b\x15\xb33W\'\xeb\xaax\xc8:\xac\x19L\x97\nD\xa0\
+\xbax1\x94\x1e\xf1\x8b\xfbvV\xb0_\xc4[\xbbs_}\x19\x82\x9a7\xa4\xb00\x8f\x1d\
+\xbd{\x87\xfb\xcc\xaa\xb9\xbc\xc3\x97{\xa6:\x7f\xeeSpv\xe4\x93\xd7\x03\x9a\
+\xf8\xe5\x1d\x11\x9d;\xab\xc7^\xbc*\xf8\xe1O\xab\xc1\xea\xe9\xb7\xe0Q\t{$\
+\xbf\xbc1B\x00%\xa8\xab\x13\xef\xe26\xd5\xda\x14\xfe\xee\xdc9+P\xae\x91\x9dU\
+@\x03\x02\'\xe0\xfd\xa4\xa8\x92\xcb\x95t\xe1\x0e\xdfO+=b\xa1\xb3E\x81\xf1\
+\x00((\xa7vm\xae\x96\x1d\xf28?`\x00\xa0\xb2\x9e\x18\x06fyj\xc2:3\x14P\x9eB\
+\xdee\xc4S\xb9:\x11\x8a\x94\xca\xfbU\x9f\x08"\x8c\xba\xaeYY\xdc\x93\x1b\xc5\
+\xd4\xd5\xae\x0fs\xc4\xd7I*\xb4B\x065\xfd\xaa\x9a\xe2\xfbR\xef\x18z\xe3\xc6\
+\xe67\xaa\x91\xc4\xd5\x88{F5\x1a\xbf\xa2Q\x03o3\xf3\x03\xe8\xfa\xe2_T\xe0\
+\xce\xfe\xda\xbf\xe0V\n\xfcDXV\xa3\xf3M\x96z\xde\x1f\xe1\x9cq\x9e\x91\xfak\
+\x1e\xcd,\xfa2\xf0\x89\x92\xfa@\r\rZ]\xcf\xc3\xcf+ZH!y\x15f\x95\xb3\xaa\xc1\
+\x1cn~~\xd0\xf7\xb7$\xa7#\xf5\x19QL\x87\xc9\xb5\xc9RZ\x8e\x19Fp\x9b\xf2wR|\
+\x9cw\xbbdQ)\xb8\xb4mZ\xe5\xb9\x05\x9b\xc9\xf8\xee\xe3\x1b\x194\xe0q\x80\xf0\
+\xfc9\xc1 I\x008\xc6\xea\x0e\x99\x15H\x82<\xa5`\xcc\xa07H\xf3\x16\x9a\xc5\
+\xdb\xa3\x05\x1e\x9e\xebFy\xcc\xe8U\xc1%\x8d\xd3\xe5\xf8G\x1cq\x94Q\x9f\xcf;\
+\xc8\xa2\xc3\xfa\xc5U\xa9G1\xefn\xbc\x0f\xca\x8e_O[\xb7\x9c\xdc\x87\xa3(\x01\
+\xf9\xb3\xd5\xc3\nY\xd7GFj/ :\xf4\x1f\xad\xd0\x8d\x12\xac\xff\xddvT\xcc\xacn\
+\xae\xa7\x9a\x01\xe7O\x825\xdeu\x15\xbf\xcd\xb2\xf7\xb28\x90 \xd4H\xac\xcefO\
+^\xc8\x1e\xc9\x1f\x84\x87g\x9f\xf5\x15\x13\x1a\x96\x94[&\xdb\x81\xa6O\x11\
+\x0e\xc1\x85/\x93\xbdR\xb6\x14\x00\xa8\xde.Q=!\x97\xb0\x03\x81Y\xfei\xcc\xe7\
+\x0c\xdc\xc3;\xf0aZ\xcat\xa9\xadH\x01\xf50+\xea\x15\xa0\x1a\xdd\xf8\xa5\x02"\
+)\xdd\xf6\xb3K\x8d\xdf\x84\xb7\xf2\xd6\x8eN\xdbX\x01\xb1\xe1\x8c\xbc\xa1\x83\
+\xb1\x97\xe5\x89\xbf:\xf9#iO\x92\x97\xbdE^[+\xbb\x8d\xf5\xd2\xcc^\xd1\x9a\
+\x1cL\rsS\xdd\xbe4\xab\xd3\x16\xa5\x8e\xbb(\r24T\x882\xaa\x9e\xa5^tH\xf1e\
+\xfe\n\xe0\xca\xbe\xd4\xd6\xd6\xe4\xb5\xe3\x9b\xc1\xec?+\xe3\xaa\xd4;\x92\
+\x85/\xf6\xcf\xa8\xa5\xa2f]L@\xdc**;\x82\x1a\x02\x87\x9f&sM\xfch~\xe2\xb9\
+\xb7\x13u\xed&lIR\xfew/\x00\x97\xf5U\xdb\xfd\xc9\x1b\xc8_\x1c\x14\x8f*#^<`\
+\xb8\x8f\x19[0\xb9\xad\xe6d\xfad\x9a\x84$\xed\xefJ\xe2RP9s +\xe8\x15\xaeq\
+\xbc\x98\xbf\x99\xd2\x01\xe9|sU\x9b\x05\xf4\xfc\xbe\x8e\x9b\xf0\x9d\xa6,\xc0\
+.\x8clU\xd5w\xd4&\x16\x01\x1a{\x08\xc8\xe5\x93\xd6\x85\xb3\xeb.Wj$\xba`\xf3#\
+\x06\xeavr\x8d6#J\x1fI\xfe\x88\xccHr\x13\xadVo\xab)1\xe6\x96\x8f\xad\x11U\
+\x16=jR\xb0\xa2\x85n\x8apd\xe4\x8a\xa3JVEA\xb1\x0e\x86\xa9S&\x1fn\xc9\xdd\
+\xfb\x1a]`\x0b\xd2\x9f7a\xb4I\tTO\xe9\xd9\x00y\xb6\xbdY\xbd{\xa0\x1e~\xa8\nn\
+y\x05s\xea\x80\xe1\xc2i\xfa\x88L+\xb9\x89k\xfb\x1eI\xe3jC]*5\tn\x82\x05\xf4\
+\xaf*pN\xc1\xf6\x83\xc8U\x92|\x11\x870V\xa3\xcc\x125\xa5\xa0u\xb9\x999_n\xf7\
+\xbb\x98i\x0b7\x87\xab?\xa2\x0f7\xb1\xf5\xa9\xf4\x93r\x8bJ\x8c\xbezi\x85\xd6\
+S\xb1\xb8\xc6\x9c\x90v6\xc9\x98^3Yn\x97o\\l\xd1\x0e\xa4d\xabW\xfcm*\x13\xcf<\
+\x15\xa3\xfd6\x0f6No{R\t[r\xef\x91w\x08\x9az\x8b\x9fPg\xaf\x02B\xb8\xd9\xc8\
+\xfbp\xe0@\xe3\xfe\xf9\xed\xf8\xc6\xbcg\xb5\'\xffM$\x1e\xfd\xc1\xe7\xb9\xdd\
+\xa8\xb1\xb3h\x11\x1a\xd3\xbc\xd6_\xf3y\xab<Hn\x83\xdc\xc9B\x94\xa7\xe4\x08\
+\x87b\xeb\x95\xad\x9b\x8f\xd8\x1aH\xb9z\xf5\xe7\xa1\xbbUteX\xf7\x91j\xb0\x01\
+\xef6\xccz5\xd8\xe1a\xcc\x80J\x9d\xbb\xaa\xdfw\x9b+S0\xac\x94[\x08\xfc\x91\
+\xbc\xfe\x17\xfdj\xe7ZN\xee^N\xa7\xbbSw\x82\xa4\xa8\xf2\xb6BTz\xe9`:\xf6\x16\
+\x00f\xe2\x87c\xfc6\xc7\xc9\x02\'\xcco;\\},\xff\xe7\x93r\xbe\xfa\xec\r\xa1\
+\xc8\x0f\x8cv\xdf\x0f)v\xdf\xbcsT\x109\xe8\xc3B\x94S5\x07\xdf\x87n\xb7\xb6\
+\xa6\x92_\x03\x8c@\xafoqJ^R\x13\xe9\x86W\xdb\x91\xee\x7f\xfay\xb2\xb0am\x96\
+\n#\xe7\xc0\xd1\xa9R7\xa9\x92\xcb\xce\xaf\xfa\x03iJ\x98G\xce\xff\xfa\xbc\x83\
+\x8b<\xde5$\x81i\x83|\x18\x9f\x12\x192\xe2WfM#\xe5a(\xd2\xc7N\xb8F/\xefZ\xb2\
+\xd4\xa5\xcf\xdb\xa5\x94\xd2\x9d\xef\xd3F#\\\xa0\xb1\xb4kS\x03\xdeb>\xdc\xda\
+\xe9\x8f\x86\x9a-C\xf4\x0e\x9fv\xc8\xd0\x0c8\xcb\x99k\xb3\xe9\xbd\xb5\xcd\
+\x87r<"\xd2\xda<\x8a\xf2\xb5o\xbf\x87\xc75u\x10DN\xfdr\xf4\x88!QK_?\xc4``\
+\x8e\xe5\xb1\xb4\xff\xbe\x04\x16\xfa-\x96\x1dV\x94\x94\x96\xfa\x18|\xb2\xf4\
+\xb221).-\xe5-x\xe5o\xd7\x90*\xc1\x12(I`\xe2\xb9"]\xff\x0e\xfe\x8c\xb9\xfe@4\
+\x16\x8ai\x81\xb7\xd4I\n\xb4\xc2\xa7\x02\xba<\xb7b\xb7>\n\xeb\x00\xf6gK\xe9\
+\x94\x871\x89w\x12{\xab\x9f\xe9\xfcc\x1bz\x12\x9cdK\xea\xcb\xad\x89\xfd\xc2~\
+*\x9dBe\xcfc\xe9\xc3\x1d\x8fTm\x90\x02\x0c@\xca\x07\xa7Q\xde\x96\xca\xb8\x97\
+n\xc8|\xf6[\xa09\xc0\xe9s\xc4\x8d\xb8\xc2\xbf\xf65\xeba\xd4+Eo\x0c\x8d\x1d\
+\xb5r\xdf\xfd\xa7\xcf\xbb\x8f\xa6\xd1\x1f[[\xc9\xf3 gF\x9b\xbd\x83$\xae\xddA\
+U\xdc,g\xae\xbb\xb6\xc7O\t\x14\xe9a\x15M\xdcNA\x88ty\xefw\xaf#\xd2\x85[*\xca\
+\xc2\xa2\xb6\xb5\x81\x80\xe9y\xf5j\xf7NL]K#U\xb2\xb7l\xe6\xa0-u^?\x91\t\x8e\
+\xf27U\xbe\xe7\x0f`\xfb~S\xb3\x94{Z>9\xbaRj{\x88\xd1){Uo\xdc\xb6C\x10}\x8d\
+\x05t\xa5Kf2\xc2\xbd\x11]\xf7f`\x8e1\xa9\x99\xc0\xa17\xbd\x10\x1b\xbaX\xb1\
+\xf5\xf0\xb8Q\x10.\x18\x95\xf4\x129\x8c\\\xcd\xa7\x7f`\xd7\xd4\x01G\xb5\xabr\
+50:MU\x95\xac1_\xae+\x87?\xb19\xadO\xfb9y6\x8c\xcc\x93i\x04\xe8\x90\xc1\xae\
+\xd7\x18\x8c7P\xffQ3\x97Y\xfc\xf1r\x97CB\xe2,WYK\x95\x89\xc95\x9b\xa9\xdc\
+\xad\xf4(h\xb8a|\xe4\xca\x948\x13P\xabt\xe1\xdc\x10\x82\x9ci\xb4\x0b\xb1@\
+\x86\xc6CJl9\x9c\xca\x11\xfb\x12J\x18W}\xc8\xf0;\x87\xe8\xa4\x8d\xf82\xb5z\
+\xe2\xe21]\xe3s\xc5C\x9dU\x7f\xecf\xe41\xa6\xf1\xea\xe5\xda\xce\x08D\xab\xbc\
+ L\x91\xd6\x9a\xf0\xa2\xcc\xe4\xf9\xc8\xaf\xe7A\x8c\x9dw}C0\x87\xef\xd0"\xdd\
+\xbezY\xb2\xca\xa9\xd1\xbf\xd5\xee\x83Y\xaa\xa0\\\x85n\x15\xd0g\xdb;e\xd0n6\
+\xdb\x18\xe1\'y\t7\xee\xd7\xf4\xe6\\\xff~a\xff\x90\xdb\xb5\xab\xdf\x07J\r7\
+\xcbr\t-@\x9e=3\x01\xe83\xa3p&\xb3\xf8.\xdd\xfa\x9f=\xcb\xf1\xcb\xed\x1b\xb9\
+\xd7\x08\xdd\xe1:\xe2\x816\xec\x00!\x7f\x11\x19}j\xde\x94\xb0\xf5=h\xffjnS\
+\xb8g\x17\x1aZ:\xf1\x15\xfdE@\'\xbd^/\x9aC\x95\x9b0\x1e\xff\xbb\xd8k\xc6f\
+\xe1b\xe5\x14s\x15\xc8\x87)X"x\xf9v\x8dDt\xa1\xdb\xf5\xef\x93\xaax{\x8e\x9e\
+\xd9\xd9\xa5\xca\xf7U\x80+\xa2\xe9\xfa\xf7n\xac\x13\xf0\x9e\xb8\xc6\x8c\xf3b\
+m7\xc0Xt\xc9d|M\xa1\xd4I\xff\x9d\xdd8\xee\x9f\xf8W\xe5\x15\xba\xe8\xd0\xb9\
+\xcd\x89\x9b\xa3*\xcd3$\xcd\x1c\x1b\x0f3g\x7f~c\x8c\xcfI.\xd9t\xb5i\xa3,\xa5\
+*8\x9b\x02\x83n3^;\xdf\xec\xd1\xc5\xdc\xffQC\xd3\xd3Z\x8dH\xadvt\x1c\xb9\xea\
+\x8d\xcc\xa7\xd0\xe2\xc3\x15%%\xf3\xf7\xd7\xc48p8!\x8f_\x85\x9a\x9f\x8av\xaa\
+\x1e~\xde\xae0k\xc5\xf4]\xb7\xb2@\x0c\x07(\xe47\xb8yl\xf3\xac\xe4RM\xc1<\x1c\
+",\x10\xf9\x8c\xbb\xc8\x93tZ\x9e\xd4\xa5\xdfY\xc1\xc3\xb0\x96\x80-@/s\xf7\
+\xaeWN\xfa\xbdbtz\x91\xd5\xee\xfbi\xa8)V/\xa1vG%\xb8\xa6\xbc\xae\n\xf4\x81\
+\xf1\x13s\x11\xf3\xea(hP&;T\xa2\xac\xd6\xe8\xc7\xb0y]\xedtCmR\xe3\x97t\x03\
+\x87J\xad\xd5\xef[3x\xcb\xe0[\x86\x91j\x92Ee\x1d\x85SO\xb6\xe1\xa6\xf4\xac\
+\xa7r9_\x9f\xfa;\xf5Z\xcf\xb1>5y\xef.\xebe\xc1\x96\x9e\x193\xcb\x08\xaf\x0e\
+\xdbtl\xbak\xb38\xfd\xaa1\xefH\xd0\x9d\xbb\xb7\x83\x10\xee.\xfc\xfel\xc0\x9e\
+\x83\xfc[\x9b%\xd2-_\xe9V\xe2\xdcd\xbb9\xecP\x10\xad\xcd\x14 \r\xed\x0f}8\t\
+\xf9\xe4X\x84\xc0\x9b"D\x00rl\xf6\xe5\xd4\x05,\xe0t\xaf\xe2DI\x81\x18\xb5\
+\xab\xa5_\xa3\xe1\xd4c\x0c\x13wonS\xec\x80\xf3S\x96\x82\xb1\xc1\xeb\xfd5\xbf\
+\xb3\x8f\xa6\xcc\x0b=L\xb5\xa7y\x7f\xbe{8Vg\x1bpSD\xe7!\x0bh<\xabl7J\xe4@*\
+\xb3\xa1B\xdb\x9b\xaa\x81\xf9\xfeq.\x7f3MI\x8b\x90D\xbf\xa5\xa5CK\xd5\xe18\
+\xb3\xa9\xad\xba\xcb\xeb\x89\x0c\xb8\x86\x023\xd8\xa4\xbe\xe1]\x92D??T\xd7\
+\xc9r\x8f:\xdcN\xfb\xc5\xdb\xa7~\xe9\x1c[\x8e\x1c\xe4\xce\xf7\\\x14\xc0\xa1\
+\x0b\x16\xf24y\xec`f4YP\x11\xef"\xee\xab\xa8;\xc0\xee\xa5Ov\x88\xb3\xac\xdfm\
+^\xad\x13\xd6\x9f\xfc\x12{\xc4W\xbd\xdc\xf6\xc25\xd4\xb2\xb2|0"~I\xb9X|}\xc5\
+\xd8#\xf5\x99\x89\xb4\x91\x11\x02?\xa91G\x1e\xbf\xbb\xf8\xb3o\x15\xc6\x17uPB\
+\xdf\xa1\x7f/\x9c\x120\xf2a<FS6K_8\x10\x90\xc3\xa9\x9d\x80\x87\xdc\x9a\x9dI\
+\xafg\xe9a\xc9\xc9*\xcf\xafG\x91\x00"\xf8\xd18\x89\xa0-\x98\xe5\x81\xc9\xc4\
+\xacf\xb7/\xf7\'f\x17\xe8[\xd1&\xad\x190C\xaf\xec\xcf\xa9\x13\x9bq\xdeD\x1f1\
+\xf8hf\xb1\x05\x02$\xf8\xc3\x0cej\xc2j=%bB\x16\xae\xb8\x17!|K\xa4\xb4\xb4B/\
+\x0f\x07~\xe4\t\x02\xb7\x13\xc2\xbf\xde\xec\xb2=\xfd\xab\xa8l\x1e\xcf\xb6\
+\xb9\x14r\xd7\x14\x88\x1f\xc2\xc9\xed\x19\x0bV\xe5T\xa1\xf9\xa9\xa1\xb3\x9e\
+\xa3W\xe1G\x97\x06\xbd\x91\x0c|9\xc9\x1cw\xf8\x8c\x9cD\xef1,\xba\xb5(\xad\
+\x91s`M\x10-,\xe0\x8d\xc8M\xbaq\x9fW\xe2\xbf=*\xe5\xc7TCxJi\xcd \x97/\r\xad\
+\xd5\x12\xc2:Q\x80\xaa/:\xab\xc5\xcc\xe8\xc6>\xe0\xd3+2\xea6\xf3]j\xdc\xf0T\
+\xe4\xca.\xbe\xe2\xd4r\xd2\x1e\xd3Z\x99\xd6\x08w6f\xb4b s\xc2E\xc4\x9c\xdd\
+\xbb\xf6\xe7V\xee\x87Qm\x01\x1a\xcd\xaf7\xb7-\x03"N$j$\x8c\xd8\xff\\\x19\r\
+\x9fGo-\x04\xe4\xd6\xab\xd3>x\xca\x8e\x99\xd2\xfa\xc0\x08\x90\xdd&lU\xb9b\
+\xc4\xc7o-Y\x10p\x8a\xe2b\xf7X2(\x96X\x14^\xea\xe5@,\n/\x97\xeb\xb2\xe6\xee\
+\xbf#\r\xed\xb9-\xfa2tC\xb0E\xdf\x03e\xba\xf0\xa1Jb\xb4\xba\x95\x1e\xbc\xa4\
+\xa8\xace\xc6\xd8)S\x96h\xe9k6\xbe=\xcf^\xb4\xf0\xca\x96Pz\x82\xfb\xc65\xefl\
+vh>\x18\xaf\x86\x12C\xeabF\xb9\xdb\xfbh \xda\x1fW\x83\r\xceZ\x8e\xaa\xe7\x89\
+{\xb40J\xabN5\x1d\xa6\x8d\xe0\xfe\x08\x88\x9f\x83\xee\xda\x0eR\xbcO\xadE\x1f\
+\xd7kj\xe2w1\x97\x83Wk\xdbmTM\x1d#\x1e\xdb\xc8\x17\x8e\xad\x87\x1d\xf9M6\xf1\
+6\x07\xd2XN[Oe\xf9qY\xef\xb0\xd7\'\t\xe8\x8c\xaa5\xc2\x8b\xdbTu\xd2\xbf\xf1\
+\x1f\x10^\xd3\xf9\x167m\xa8\xf5\xd7\xf4\x10c\xb0\x7fCU\x15\xb1\x84U\x88\xc5\
+\xb34}\xec\x146r\xde;.|\xfe\xda\x83\x8cx\x87\xe9&\xa9d\xd3i\xc0\xdey\x84Z\
+\xee\xb0\xbf\xe0\xecR\xc5\xaf\xd1\x83L\x06i\xbb\xd6\xce\xfe\x9d\xf0\xce\x91+\
+5H|\xd9\xd3X\x97C~@\x17\x04\xb3\x8c\x80\xc4[\xf4\xd9\xe1\xefVG*C\x11\x10?\
+\x9b\xa9\x0fG\\\x1ar\xfe6\xde\xc9j\xf1w\xc8oz\x82Y\x0eO\x8e\xb6\x1c\xf5"\xf5\
+V\xbf\x87?P\xe7k5,\x94\r\xe7s\xe4\x8b\xc6\xfe]u{\xf2qA\xdd\x14\xff[0C\xf7Y$\
+\n\xedc\x19\xbc(\xc1R\xff\x01\xa7\x91\xf5+)*b\x1ep\x00\xc3S6\xa7\xa2\xa3E\
+\x0bW9\xa3\x99\x14q?6\xce\xa2\x0e\x83\xf3\xe4[\xce\x96pAR\x91\x1fB\xef\xf5@\
+\xe8\xa0\x86\x99.m5\xb3\xdf\xc4\xf8\xfa\xbe\xf9-\x0e\xdc\xadh\x13\xa1&N\x17\
+\xda\x16\xa9\r\xad"\x0e\xabC\xcdY\xbe\x07\x07\xe9\xe4,|\x9f\xda\x0bS\xc9:\
+\x8a\x90\xbc\xd1\x1b\xa3\xd7E\x9cL\xe9\xa0\xb6:\xba\x8d;\xdcR\xcd\x90\xed\
+\x98\xf3\xfd\x14l21\x04>~\xfa\xeb=\x0f$\xf5\'Ij-\xce\xcfg\xd4\x87\xae\xefE\
+\x85\xd8\x13\xef^Q\xca\x87\x8e\xef\x98l\xe3r\xda\xe2\xd9\xad\t\xa5\xa5+\xa5\
+\xa5t\x84F\xc3\x1f\xc9ya\x9f+e+\xca\xab\x82]\x16\xacY\xbe\x9fK\x0f\xbf\xec9\
+\xe8\xf5\xcf\x9e\x1b\x0e\xbc\x88J\xfa<\xe5Z\xd0/\x00\x7f\xbe\xd4\x19\xc2\xdd\
+\xdb\xe2%\xbcNT\x81\xe1Q_\xa5W\x16>N\xf5\x05\xba\xdeP\x7fR\xce\xfb%\x98#.\
+\xbau\xbbFB\xc9\xb6\xa9\x9e\t\x8d\x12#o\xfb>\xbf\xfa[\xe98\x18\x908C6!\x99\
+\xbf \xc1\xf5\x85\x85q\x0e\xc3S\x9c_"\xa62\x83\xb2s\xac\xb4\xd9\x14\x90\xe2\
+\xdbI\xc7\x07\xdaMF\xa0\x88\xb7\xdea%\x05\r\xeb\x9f?\x08\x7f\xa5\xf5\xf2\xe2\
+\xe68\xf8\xe1\xc7\x13\x03\xdd\xf5\xa0\xb8z#)\x80\xcc\xae\x88)\x19&_>6\x10\
+\xf1+d^\xe0\xaf\xb2\x17\xaf]\xef\xb8cR\x05*\xd8\xac\x84\x13\x18L%z\xfd\x13X\
+\x1b\xdf9lJ\x1e\xaa\x91y\x98\x89G\x1b;\xdc\xe6\xeb\x03j\xd5\x92\xf3\xaf\x9a\
+\xd6A\xd7\xf5\xd7\x1f\x15\x18EK(\xda\xf51fT\xad-oGBTI\xc7\xbbi\x89\xbbwp\xc2\
+\xa6\xde\xb7\xdc\xcfBg\x1cp\xba\x19,\xb8\xe0\x85\xcf\xb5\x14A\xd97\xa5c\xb3Q\
+\r\x05T\x00W\xf8\xc1\xcc\xb6\xceb\xd2.c\x19\xb0\xbc%\xab\xe8\x9d2\xe2\x10\r\
+\x06]\xb2\xcetl\xa3\xd1\xb0u^*\xad\x9c\xeaaM\x9aq\xf6IR\xbdm\xbf\x1c\xa7qp\
+\xb8^\xc8\xd9\xfb\x84\xd2\xea\xc5\xdb\x81\xef\xde]\xad$y\x1c\x97N=\tI|\x87]\
+\xf6\xc3\x0fo^p`9\xa2\x86O?\xaf\x04/\x84vB\x8d\x9c>-\x14\xb6<\xeaI\xaa j\x1b\
+\xe9!\xd4\x0b\xc7\xdc\x96\n\x7f(\xc7\x96\x0b\n\xe0K\x11\xa0C\xd9n\xef\xe7K\
+\x07\xe5!e+n\xb3;W\xbf\xeeN\x83\xaa}\xdd\x97\x89\x11\x91M\x11\xcc\x03\xfac\
+\xf9\xd4\xda\x16\x88\xbf\xb1\xb2/\xfd\xaf\xbbY\xb9\xb3\x00\xbe\x8cB]aY\xb9b/\
+VQ\xdc\xa1\x1f\x1f\x06\xf4fK\xce\xb0\xc9\x8d\x95\xdc\xe3\x8ag\x88\x19\xcfc\
+\xa3\xc2\x86\xb8\xd6J\xa3\xb4\xfa\xaf\xd2!-\x86l\xa0\xd7\x16\x8a\x03%\x0b\
+\xa8\xf9\xfd\\\xaeGk\x8d\x0b\xe6P\xd9 \x07\xdc\x8b^W\x9ex~\xca\x14\x13\xaac\
+\x1b\x83\xf2\xbb\x12@`B,ZV5\xf6\xd4\x0c\xa9\x8bn%\xfdpC\x1e!}n\xc3\x17;\xf5?\
+\xe6VX]z8X\xcb^#}\xcb\xa4\xbf\n\xf4\xd7\x18wa\x95I\xbeA\xc5\x0es\xc3\x13M\
+\x93\x89\x1eO\x02?\xa5\xed\xa6\x0f\xd2\xeb\xdd\x9a\xf8\x06\xf4\x86\xc2\x99,\
+\xb4\x8e\x13^\x81\xb2\x05M\xa9\xc9\x97\x04\xfb\x81\xc0\x03\xfa~\x1cFC\rq\xa8\
+\xe1\xca\xd0\xe3\xa7G!\xf3X9\xe5\xd4L\x0cZ=\xcc\xa1\x7f\xe7\x85)\xdb\xc4J,\
+\xf6\xf7\x8d"oi\x9cF\xe5y\xcb\x92\xf2\xf8(\xa2F\xc2\xcaP8\x1cW\x08UC\xc4\xd7\
+L\xb9\xdd\x19\xc2\xe3\xf9?\x1b.\xd7Hp\x9d\x1a\xa7\x06T\xe4\x89\xa1\xb2q\x7fE\
+\xd7\x15\x04#\x86\x9e\x9a\xd43\x17\xbd6\x8d\x19\xbcG\x98\xa9p\xc9T\xc2\x91O\
+\x99g3\xd9H*.\x00\x04U}\xd0\xab\x0eS\xbd\x17\xa0\x93\x8e\x9cz9\x1a!\xb7Z\xaf\
+^\xee\x8b\x7f\xbeY\xe0\x0e\x180s\x9e\xdc\x1d\\t\xea\x82\xed\x8b\x858A\xcf\
+\xa1\x9fp\xc7V\x818\xc5\xc2{\x85)\xde2\x84\x83\xf0\x9e\xcc\xa8\xe1O\xc3\\d\
+\x0f\\\xa4\x05\x80\xce\xb7\xe6\x88\xc8V$\xbc\xb0\xbd\xd9\xfd&\xda\xb2\xd8\
+\xc6\x04\x08\x1d\x9b\xc4P\xf3\xf4|\xe7?\xdb\xbb\x8d\r\xb2\x97\xb1\x8d<pO*\
+\xa0\xb6\x02\xd7\xd9\xddl\x98t\x8c\xea\xb9\xf5\xcc\xd7.\xcc\xfd\xc1\xd7\x11\
+\xdbU)o\xa5\x17H\xfb\xed\xc6A\xd5$\xe4\xe4\xd2\xb8\xdf[\xbb5\xe3fw\x82L\xdb\
+\xcf\xa1\x16\xb9\xb4\x1b-\xf5\x11\xf3\xaa\x1c\x80"\x83_;\x8e\x8f-\x0f\x13\
+\xd3\x99\xfe\xf5b\xcc\x92k\x14=\xfe\xf5\xc79\x82\x19\x97\xa9\x04/U\\i\xa9\
+\x07\xdf\x10\xf6\xa4\xc2+\xa7r\xc5\xe6\r\xf9S\x81\xc07\xae\xe3\xca\x85<\xaa\
+\x8e#\xa0@\xd8rU\x12\x87\x07o\xc6H\xe6\xee\x81f>V\xd1\x86\xdf\x0e\xf6\xd4\
+\x1c\xab\xebY\xcf\x84b\xca\x85m\x9e`\x9e\xe5\xfd\xeb\xf6=u\xfbc<q-\x9c\xd2`\
+\xdev\n\xd6,\x97&\xeen\x81\xa0mMh.\x17\xd0\xb9^A<\\\xad$\xd6\xc4\xc1\x9c$\
+\xf5\x1ey\x83\xa6G1\xfeU\xc1\xea\x8e\xdcC\xaa\xf1u~Y\xab\xc1Dzl-\xc6-\xfa\
+\xd5R|\xab\xf7\xc3Q\x11$\xdb\x97\xe5\x9d\x17\xde(Q\x9dg\x8e]of<\x15\xff\xc5\
+\x7f;\x94}\xb04\xee\x0f\xc0=\xeeNGS\xc5*\xfa\xa0\xc4f\xac!\xb6|\xa3\xed\xfap\
+i\n\xc8\x8b\xa7u\'P%\xdcj\xdc\xaeC5\xb4\xe94e5\x93\xc8\x10\xe30\xed\xd1\xd8\
+\x8dJ\xf9\x00\xf3\xf6P\xceR\xb4\x0b\\j\xe78\xad\x9b\xbbG\xc00\xa3\x87\x82\
+\xbe\xd6V\x07qP\x90\xd7/T\x8aQ\xa7\xcf5\xc7<\xd6NG6\xdd\xfe\xee;\xe7\xfa\xbc\
+d\xcb\xcd\xf8\x81T\x7f\xfa\xe6\xf4Q]\xad\x18eg\xe7\x9a\xd9\x0c8\xa4m[\x93#]X\
+r\xb3R\xc6\xd57S\xed\xbd\xa3B\x02\xbe)V\x12\x8ez\xe0M\x9f\x06\xf5\xe1\xe2\
+\xb6`\x80fPKa\x82\xde.}\xfd\x86.\x02W\x86\x1f?\xdd\x91\x1c~Gv\xb2\xf8\x13;\
+\x16\xbc\xact\xdc\xd3\x97\xdc\xf0\xe2|\xd2\x17\xb0e!O\x86mI\x03\xbb"\xa9(\
+\xa3v+>)\x95V\x05\xdb\xaa\xf2n{\xbe\x96\xcd2\xe0\xe2k\x15\xd6\tQW\x04\x81\
+\xd9\xd0_\x8d\x02\xde\xf5\xf0`\xfe\xa9l+\\\xf4\xcb\xd04\xca|X\x9e#\x9c-T\x12\
+_\xc7\xfb\xde\xbf\x17hbB\x8b\x9d?)9\x1eD\x91\xdf1vp\xcc$\xdbJ\xcd\xcd\xd4\
+\xda\xcf\x0c[b)X_\xd9\x91\xb3\x89Z\r\xaeY\x19\xad\n\x96=\xb8\x83j\x8d\x17\
+\x83\xa7\x1cikJ\x9dG\xaa\x03,\xc5\x02<\x14b1\x89;x.\xd2K\xa9\'\x88]\n\x98\rT\
+_\x06\x12Q\xcf!\xa1\x02\xf5`\x96\x86\xd6\xcd\x9cM=\x16%F=:\x15\xd8^`V\x19_Z\
+\x9aR\xf2\xec\xba\x12\xfd\x80\xa6\x9f\xc8\x13\xfd8y\'\x0b\xaf\xb9o\\\x0f\xa7\
+\x02\xf7\xac\xf0\x18\xa0WW[\nt\xf5\x1e\x13\x0e\x0b\x172g\xb3\x15K\xe3_\xcc8\
+\x8ex\x05`\x7f}\xe7\xe3\xe1\x9e\x9a\xdb\\\xb1\xe94U\xa7\xc3\xbc\x81\xd59\xd6\
+\xb4K\xc8\xe8\x87\x06\xea0\x82\xde\xfc\xd58c\x03\x1f}\x94\xea\xf0\xb5v\xfcf\
+\xf1\xa26\x04\x02\x86\xd2C+\xbfy\x18\xfb0\x1eD\x84\xf1q&\x91\x9dhv\x1e\xa9\
+\x9dq \x85p\xd3\xbdV\xce\xaf4e\x12\xeb\xd2\xb6\x16\xfc\xc6\xf2\xa1n\x7f4\x7f\
+\xee\xdff\xc7:" \n\x96\x16\xeb\x8d\x0bD\xf5\xa37#\xef\xbc\x0e\xdc\x1cB#\xa6Q\
+b\x1bg\xbd\xe5\xb3\x1c\xa5:\x7f\x19\xe2p\x8d\xc6\x7f*K\xe1\xcbf\xad\n\xa2\
+\xae\x15\x7fx^\x19bp{\x93RkE\xb1[\xcb\xf9e\x9f\x85\x1eb\xa31\xae\x8a\xd7\xad\
+\xd1\x97\x17\x03\x1dE\xd5\xad\xb9\xa5)\x93\x9f+\xf6dI\x0fP\xf1`\x90[\x92u\
+\x86\x15+zc\xaf\xe4\xfa\xdd\xdbq\xde\xe1\x803\xcd\xe8\xac\xa2y\xfbC y=m]\x8c\
+\xc8@\x03\xf9Z\xe4\xe5\xb8\xd7\xe6\xc0\xd1\xc2\x87\xd5\xee1\xbb\xd1\x16\xf6\
+\xd3uT\xd51\xb1\x19J\xaf\xe3\xbe\r\xbd\xeb_\xdb^I7\xe6)U\xd6P\xe6[ (\x11\x9a\
+\x80\xed\xee\xa1E\xcc\x0c\xed\xb1^\\\xb4\x06\xd7\xfb;|\xe1\xcdA\xc3-*\xa3\'\
+\xb5\xf3t\x9c4\xc2j\xdb\xd3\xe8\xb2\xbd\xa5\x92\xa8\xa5\x89\xf3\xcd\x1c]\xaf\
+\xdb\xfa\x07\xb3C\x8f\xbe\xc2/D\xd6\xfd\xbcx\xcb\xafc\xf0]\xce<\xd5\xdf\xe7\
+\xd0\xf1\x8d\x98r\xa0\xda\x8f\x8c\xc4;u-X\x92Fo\xf4v.^4\x85\xf9\xeb\x1cM\xbe\
+\x99\xb0t\xfc`\x8a\xd9\t\xff^\xf7\x9a\xf6d\xadO\xb8\x86\xb0g\x9c8R\xf7\xa3|;\
+\x15\x97k}\xc4@\x96+K+\x9a\xba\x04\x1eD\x91\xfd\xc1\xa5~\xcb\xa2\xb6:|<p:\
+\xad?\xb3on\xcft\xb7\x07\x7f\xd6|]\xaf)\x12\xf0\x1a"1m\xb24]\xaez\xd1\x9cV\
+\xef\xbel\x97\xa6\x90\xaa\x8b9\x84\xf2\xc69T\xb5RJ\xa6\x81D\xdf\xe4)c\x99_\
+\x08)\x1d\n\xf8p\xbb\xfck\xcb\xed\xed\xc0\x87-\xa1B\x10\x90\xae\xc0\xe5\x7f@\
+vX\xe7\xa9\xf6\x7f\x8e-\x0f\x11\x16\x90m\x02cx\xbc?j\xd1\x1d\x87I\x87\x88\
+\xa5\\\xcd#,q\xed_6\xee\xfb\x05X~\rw\x1e\x02\\\xbc\xe4\xcd\x19[e\x92f\xb8\
+\x02\x13\xea\x7f\xc1{\xf2[\xb9\xc2W\xffy\xc2\xaa\xd5\xa9\xa8\xa2\x81RMY$\xa6\
+0\x97\x1e\xa2\xed6\xd08uT\x07\x16\x99\x13\x87\xef\xaf\x93KF3\xa17\xde(\x98n\
+\xbb\xbb\x86\xde8\x13-)\xed\xf8\xe4=&_\xa2j\xf3=\xbc\xfa\x8ej\x93\rm\xea\xd2\
+\r\xae\xb1\xe4r\t\xf8\xd2\xd7\x95\xc2\tGV\xf4j\xf5\x06Ua8MD\xed\xcc\x16\xff7\
+\x9d\x1bDv\x7fu\xb2\x07\xe6\xd3U\xc1zM\x01\xe14\xc7Ms\xe6\x9a\xdcq\x7f\x8a\
+\xe1\x17\xec"\xf4\x951@}\xf2\xb9\x93\xee\xc6\xd6\xa9\xfe\xa7D\xfc\xdf\xfe\
+\xd0\xf8E@i\x90\xb5\x844\xa68I\xb8[\xdeA/F\x02\x81\xeb\xbd\xfd\x84\n\x83\xf7\
+1\x98\xa63gW\x02\xe7-\xd7\xe2\xa4\x96\xc3pD\xff\xa6\x95\xfd\\\xee\x18\xdd\
+\xdd\xd7\x97i\xa8\x11n\x81HqGwA\xe5\x95R,\x80`m5\xf7\xfc\xf3\xf5,>\xcf\x8dz\
+\x0c\x12\x19\x0b*\xa1\xac\xcd\xa9\x05\x97S\x1c\xca^\xd2\xba\xeeO|3\xf8.Rb#\
+\xb3\x89\rH\xa1\xf4\x17\x12cN\xde\xfb\xa6\xbd1\xe3\xc8g\xc4\xdb\xfe>\xad\x80\
+p\xd3 \xea`\x0f\x93+z\xde\xc3\x87{e\xe8\xb9\xe0\x17I{\xd0*y([y\x16P\xed\x89\
+\xe6\xd2\x1fV\x89\xea$[t\xc7MzvX\xd7\xbd0\xa5\xbbu\xa6i\x13k\xdc\x96\x1f\xd4\
+\x01\xd9b\xeb\xc8\x02\x06t\x11\xf8#\x8f\x0f\xd7\xdc\x1c^-\xc4\x10^\xcf\x8a.z\
+S\xb8^\xfcp\xbb:\xb9p2\xc4\xee.6\x8a_~\xdb\xbf\xc0\xad\xaf0\xdb\x9bF\xdfC\
+\xea\x9c\xcf\x8a\x8f\x14\xcc\x82\x9d\x88\xb7\x87\xc6n\x1dw"Eq\xa9\x13+\xc0@U\
+\xb7V\x85\x89\xad"\x8f\xaam\x8c,l=\xdf\xca\x15\x1a\xc7\x14\xd8%]r\x98s\x9e\
+\xd5~\xc6F\xc4\xdd\xed\xf5\x86\xe1\r\xd3\x8fU#\x14\xb8\xca\xe1s\xc0\xce"\xe3\
+\xc0\x1a\xef\xf0\xbbw\xc2\xa6\xb0>\x06\xdc\xee\xe2\x0f\xb3W\xcb$6x\x1c\xc1{\
+\x17\xd3\x8a\xa3\xc8\x88~\x86\x9e\xffN.]-\x90\xd0um\xba1*\xbfE|jJ\xee\x15\
+\xad\xe9\xcf\xf9\x00\xccb\xbf\xbf\xea\xa2\x93\xde~7\xa0x\xd5j\x9a\xe9wV\xc8\
+\xf0Q\xdd\xac\xcb\xcc\x10\r\xb2P`\x08\xefE\x17r\xed\xf2\xd4E+\xbc\x03\xea\
+\x13\x19\xb1K\x19ty\x8e\xe2\xa9\x89\xc9=\n\xc2\x83\xc2\xcb\x05<J\xb5!B\xb8X\
+\xca\xe5\x89(\xfb\xcb\x85l\xb8\xa0r\xaaQ(%gN^H\xf1\xe7R\xf1\x01M\xe6\xa0S\
+\xbc\x1c\x08\xcc\x00bd\xac\xc4\xfej8\xb5y\x94.l\x0c\xc6\x0f\x85\xfd\xa8\x19\
+\xd0*O\xa4\xfa\xfdI9\x01U,\xea\x1e\x9c\xdd\xa5&\xef\x809R\xd6\x82\x92*\xd3\
+\x1dKj\xb2)\x90p\xf8w\x1f\xa9v\x04\x93L\xc1f\xae\x8e\x0b\xd6H\x08\xd1h\x02i?\
+\xeb\xd2\xba\xd3u7\xc0\xfer\x03@E\x8by\x1f\x91)\xce\x81\xbf5\xd5\x83\xf4\'\
+\x7f\x02V+\xc6\x81\xd2\x02\xe1\x91\x038\\1x\x14J,D\xb9&\r\xa8\x94\'&\xce\xd7\
+\xfe \\l\xe7\xb9|\'\xf9k\xa5O\xe8/\x02\xfd5\xad\xf4\x10\x08\x03\x9a\xec\xebM\
+\xa9\x83\xf0\x96#\x8b\xc3\xa7\x13E\x06$\x8b\xcaqK\xca\x19\xf3\xbf\x10\xbe\ty\
+Z\xd8\xa9?\xd9_\x19\xd01\xb3.\xa9K\xed\xaa\x87=\x8c\x05\xafN\xd9z}\xf9\xe1\
+\xcf\xb1\xf1\xfb^\x8fD<\x87\x94{\xe9N\xfd\xf8\x96\xc3g\x08\xb9e4\xc0E\xf2\
+\xfa\xbb\x99\x83F\xc9\x1b\xb9\x80\xb9\xff[>\x88\x92\x17?\x15\xa5\x1f\x93\xff\
+\xb9\xff\xf36\x1c\xf5\x12\xe6*\x00G-\xf3M\xdf\xfc\xad\x14\x9cA!\xfa\x89\xb9\
+\xe8\xf2\x94P\x1e\x8b"I\xc6\xa0\xf3p@\xfdH\xcc\xbe\xe3\xfdY\x04\xe0\x98\xc9r\
+y!\xc6&\xd7\x1c\xb1\x1c\x83\x9a3\x14\xffm\x06,6\x1a\xaa\x96,\x908\x91t\xb4\
+\x1f\xce\xa4Hz\r\xe1\xac\x9d\xa1i\xb4\xcdy(\xab\xa1}$\'\x84\xf3b\xff\xc3wq\
+\xb1\x19@\xbe\x9e\xd9\xad\x05\xbdr\xd2\x9a:\xe3i\xca\x1cUZj\x8fQ\x04XG\x1eU\
+\x88;\xc0\xde\x11}\xc4U}\xf6\xab?\xe0\xb8KyR\xa2\xa7\xfd\xa0\xf7\x9d\x16g\
+\x91T\x14\xfe\xf3N\x17\xa7\xc4\x1c9\x05\xa1[\xa4i\xa0Rl\x9bz\xadQ\x03\xe9/\
+\xe2\x15\x1d\xbd\xf4\x9a6\xaf\xba\x96\t\xe8\xb7kP\x0c\xfa\xcd\x99\x13\xd7\
+\xf5\xe4\xe5\xcb\x8d\xa6\x06\xeab\xaaO\xb6j\xff\x89\x03\xda6m\x05r\x1b\xaa\
+\xebc\xc3^Zz\x14.V^u\x07\xb8\xfc;T\x7f\xec\xb5\xb0\x0e6\xbe\xd3\xdcW\xa2?\n\
+\x90\x906\x8e\x8e\xd8\xfb\xfe\xac)\x8f\xc6\x81\xc0\xd8N\xd4=\x93t\x84\xd4yx\
+\xca\x7f\xa5\xa5\xf3\xe5\x16\xa2\x8c\xea\xb8\xc9p\xa7\xe7\xd2\xa8K\xfd`9\xab\
+g\x18\xf0\xfa\x19g\xca\x11\x97\xc7\xa0\x90\xbd\xcaHvEm\xc8\xea\x16\xf8\xaa\
+\xa9\xc4sb\xd6\xff?\xd0f^\xc1\x9a\xc7\xe3dq\xb9Y30e\xe9\x0bG\xcf+Y$K>\xa8\r\
+\xc2j^\x92\xb0\x15H\xf6 HG\x18"\xd3\n\xf7[\x94/\xec\x9c\xd6V\x94\xd7\xe7J)\
+\xbek\x80\xf7\xb6`5U\x04\x8a\xe1\xa7\xfc\xadL\x07WE\xe0{\xfeq\xfc7\xabl\xcf\
+\xf1h\xab\xf6\xd4\x0cp\x87\\\x83q\x13(l\x8d{Yl\xd5\x95\xbf\xa2a\xbf\x86\x1cd\
+\x16\xa2%\xfa)\xa55\xddo\xbdY\r\xaeJ\xdb\\\xe6\x1b\xbfia\xcc\xde\x0c/\xdb4>P\
+XTbtC\xa6\x16&|\x18\x91.t\xfb_??\x0c\x0b\x97G\xf5\xe0\xd5\xca\x84\xae\xbb!+R\
+\x8a\xafx\xb0T\xb7\xec&\xb0_\xcf\x96\xdd\xb4\x96E\xf4\xbb\x9cm\xc4Q6t\x08\
+\xb4\xc2e\xcfd\x81\xbcD\xfc\x9a\xd5\xf2\x94\xd6#\x81h?\xb0@\xdc~\x9b\xfc\xc3\
+\x95\x02f\x06J\x17\x16\xfes\xa4\x04\xfeRJ=\x02!\x83i\xf3\xa4\x14\x97\x94\xc2\
+k$\xa6\x9e\x8d\xbf\x84\xb1\xa0\xb1@\x95\xd2\xbb\xba\xcaM\xe9\xe8\x97\x1c\x01\
+!\xa56\x94\x17RdB\xcf\xeao\xc3\xa7\xaf\x7f\xa7W\xfd\x0c\xd1\xbf\xbb\x15\xd9\
+\xdcYV_\xe5\xcbM\x81\x1f\xd6b {\x8d.h\xa5\x8f\x1f\xb9\nd\x14%iF\xbc\xf3\xd6\
+\xb5\x0f\x85\xb7\xfe\xee\xdcY\xfc\xf2\xb5(\x8f\xc8\x01\xa8\xdb\x7fV\x93)\x87\
+V\x8e\x1e\xbf\x0b\xda:\xa1}\xcd=\x93\xaf\xa8d\xce4@\xdccD\x86\x7f\xad\xf4\
+\xc4i\xde^\x95\xcd1o\xce\x10\xbe(H\xcd$#fgW-\xed\xaf\xe8\xab\xc0\x8d\xeas\
+\xea/\xbfb\xf2=\x84\x95t\xf4/\xe75Wr\xa9\xfak\x1e\t\xb8G\xddGn\n+Q1\xd7c\xed\
+\x19\xb9b\xe5\xf5\x1d6\xb9\xf2\xf6\x86\x9e7\xf3\x81Y\x18\xad\xc92\x0cpI\x1b\
+\xbe\xdc]j2\xda\x8e\xb6\xe2p\xc1E\\\x901b\xbe?\n\xe4\xc9\x02\x80\xcc"\x8e\
+\x03i\xba\xd3\xd7\xcd!=\x9b\x1d\xf7O\xa5\x10\x8e\xc45\xe6\xbdpBK$!]z\xf9\xab\
+\x12\xb6h;eb`\xae\xb9\x12\xbd`\x8a\x1f\xc5]xC@D\x7f\x9au\xf9o)^{\x8c?a58\xc8\
+e\xc15\xc0\x8d\x18E\x85Q\x052\xdb\x9e\x17Yv{\x8c\xd2b:\x9e?hCs\xf7\xb6\xdd\
+\xf9\xabpR\x00\xdbO\xbeF\xf0UB\x085\xf6F#\x81\xbbs2\x19-"\xbd\xb1\xad\x95B-\
+\xfa%\xdf\xdc.w4\xd5\x01\xed\xf8\xef\xb4\xd5\x1ba\xa0!\x81\x9d\x82h\xfat\xeb\
+\x9b\xc3\xf2Pyu\x81)\xc6\xcb\xbd\xa4\xea\xefA-\xa8f\xe9\\\xb7YWq\x00*\xb59\
+\xe2\x8c\x89\xbe\x8f\xe4\x80\x80\xe5\xefK}\xd8\xe7%FO\x9b\x17\xc9f\x93\xa3\
+\x9cj7\xc0\xd0\xf3\x12%\xf6#\x02\xa27\xaeq\x85\x19m\xc8\x1fy3@q\xe0\x96\x93y\
+F\xa1N\x1f\xca\xd6p\x8a\xf7\n\xbe=\xa6"\xad\xe8\x1b|\x87\x08\x8c0"\xf3Hg\xda\
+\xf8 \xe9\x7f&\x97\x06+f\xc5;}\xb9\xc3\xb0\xf1\xadvvW\x07#\x9c\xab\xd2\xb6\
+\xf6\xde\x81t\x98\xb8{_\xa1{\x9f\xa5\xb4\x922\xa3\xd9\xc4\xe0E\xe7o\x94\x962\
+\x16\xcb\x98R\x16\xce\xd2\xf2\x1b\xdb\xd5a\xda\x8e3\xeag\xb2 \x8e\xb8\xdb\
+\xd0\x99\x16\x89i\xe3\xbakd\x0f\xf8mm\xca\xda:\x9f\xf9r\xc7\xffw\xe0\x08\x83\
+\x06PXLK\x9f\x81L\xf9&]\xba\xb0\x03j\x92I\xe2\xb9\xc7Gy\xfd\xdc\x9d\xf5\xbc\
+\x9f\xf6|BQ\xfc\xed\x1ah\x07\xe4\xc16\xae/\xf5\x0e\\\x9e\xeewe\xa1\xe6\x80M\
+\xa1\x8dy\xf7\xe4\x9d\xb1\xf5w\xcb\xcd\xb0\x84:I\x01\x1d\xa6\xd2\xe2c\x17\r-\
+0wJ1\'\x05\xf9~\xd3\xa7DK\x8a\xaa\x84rM\x89\xfe\x87A\x8c5/\xca\xd8~\x07\xf3\
+\x9e\xb4\xd2\r\xe1\xdds\xde\x13D\xca\x84^T\xf4\x92\x0c\xe1}\x0c\xe7\xeb\xd7\
+\xd8&\xd8\xf5\xa6U\x9c=5\x8e5cV\x83\xb5\xc0Z\xf5\xdf\x0c\xbc\x9fM\xa3\xd5\
+\x91x\xd5,\x83?\x9f\x94%\xe8k\x1c3\xaa$\xa3\xb5\xef\x8f%\xd4\x92\xc9U\x9fr\
+\x94\x96\n\xd2h\x96r:\xf9\xb3\xbe\xb9u\xc1\xf1k\x9d\xeci\xa0\xb1\x16\xb8\xfb\
+\xf4\x1cAb\xe5hE\xce\xbc\xcf\x10\xc7\xfeg\xd6J\xb1\x8d\xfd\xbf\xad\xac\x9d\
+\xfd\x8d\xc5\xcbw\xdd\x8c\xcbvR4\xc7\x81\x07\x041\n6>G\xa1%.w_:\xd7r\xea\xbd\
+\xbd\x1b+\xf1p\x16\xf1\x9b{\xec\xad\xf1X&\x0b\xb20\xc5y~\xff\x9b\x0bi\xdbOqJ\
+\x04U\xd24"Y\xa2?a)C\x92[\x89\xbf\x7f_\x17;5e\x1e\xcf6n\x03\x93G\xadd7>\xae`\
+\x16uWo\x8f)\xa7\x08\xca\x8e\x8f\xdc\xeeR\x87\xcd\xe8_\x0c\x18\xf1E\x1d(\x96\
+Oh;[\x90C\xcd\xa2w\x88y\xc5\x87,m\x89\t(J\x04db\x8a\x9cS\xf7\x95>(Tt\xc8\x8f\
+#\xaezr\xd9\x1c%&HI\xbaQ\xe1\xf2"\xab]Y\xe6\xe9\\\x8a\xd0\x9f\xe0\x13G8?e\
+\x06$p\x08\xe8C\x17\xa0\xc6\xc0O5e\xad\xf4\x05\xec\xe36\xef\x0f\x04>\'\x00I\
+\xf1\xd4\x04\xc6r\x896\xd6\x1f\xf4\xd4?\x16\x1f\xd2\'M\x93w{*F7\xcae+\xe4W\
+\xb6{3\t|.W`\x03]11ys\xc6\x1d\xef\x08\xaf\x12\xe1\x87\xaf\x1d-%G\xd83b^\x9a\
+\xd7\xf9\xb4>y\x8cy\xb6D\xfe$\x881}E\\\x88Q\x01j\xa8y~\xdb\x05\xa5(c\xde\xad\
+x\xbf\x14\x1e\xb4Ot9\xef\xb3x\x8dk\xa4\xbb\x98\xab\\\xc6\x03\x10\xd3,G\xbf\
+\x9d\xa8\n\xc7\x0e\xf8r\x03$\x88,\xac\x9e\xeb\xbe\xd2\x19\x03m/3\x8e\x8c\xa5\
+b\xb0\xfb\x9e\xffn\xcd$\xdd=\xe4m\xa7o\x02t\x88#\xc3\xa0\xc8\x87;\xde"\x80\
+\x9eC\xd4\xf3j\x11 \x0fvp\tK{\x08\xc7[p\xd2\xd5\xee\x12\x05\xf1\x8aR\xb8\x9e\
+\x0e!\xc57\x81\xf0\xb7\xa4\x1b\x17\xf5l\xf1;\x07\x8bg\n\xf47\x80i(\xb1\xa8\
+\xc8\x15@g\xf0\xb9\x90r\xc4\xbd\xda\xbdS\x16h\x17)\xacN}\xa0\x1e\xce\x82\x12\
+\x8d`\xfe\x93s\x9c\x80JH\x9c\xa5\x04Z\x92\xf0\xa3\x06\xd0.)=\xde\x03\xf7\x08\
+%\\d\x8eD\x9eE\xa5\xf4t!O\xd9@L\xf5\xe51@\x01\x9dA\xd1$M`l_c\x97a\xe0Pa\xe7\
+\xd7\xf0;\xbc\xf1V\xc4\xe9G\x08 \x17\x1f\x91\'M?\x82\x87.v\x12\xce:,^c\xd0\
+\xb4\xf8\xe1\xfc#\x81\xdd_jAE\xb0\xbc\x1f\x02\xc0\xa8\x009\xd7\xf8\x05\xa0\
+\xb8d\xc3\xf6\x18h\xb7\xd3=\xb9\xf4\x8f\xf7H|\x99\xd1dd\x0f\xee+<\x95\xd8\
+\xcef\xf2\xd2\x1eE=\x9d\x01\x03Zj\xa0&\xb4\xbb\xaad-\xe1\rZ\xc4\xa9\xadf!\
+\xeba\x9d:\xad/\xb7\x11h\x90\x10\xfe8]\x9e\x1a\xbc\xa4Lw)]\x9e\x0f\x9a\xf4\
+\xd0%M\x9b\x92a\t\x7f\xb8Uu%{\x17\x83y\x1b+\xbaT\xf3\x0e\x04\xc4t\x01\xd6\
+\x8a\xe27\x9f\xdd\x0b\xbb\xb6\x97I\x89%|\x84\x10\xe0\xc0\x83c\x81V\x1e\xbd\
+\xd1\x7f\xb1\xa0\x12\xb7\x1a\x1c\xf3A\xc0\x84\x12\xe8"(&o\x86\xdf\xb5\x8e\
+\xcf%\x99M\x91\xd5F@X\xe7a\x10g\xa7\xca\xc6\xe4\xad\xbf\xc1-\xc9\xa2\xee\xdb\
+\x89\xd7\x019\x91R|\x8d\xfd\xcaD\xc4\'Y/ \xd6Q\x80Z"\xfe\xf0\x829\xbeZ\xfa\
+\xfa\x81\x0eW\xd9\x8f\x02D\x8a\x1b2\xa1\xb21\x8d\rs\xff\\\xaa\x0bf\xa3xh\r\
+\xbe<\x91\xbb\x1cN\x053\x83\x16\xb4E\t\xebT\xa5A\xdd\x85\xd6\xe4\xc374}\xee\
+\xd15\x89\xe8\x0by5\x0f\xb4\x04\xc1\x1c\x8cFX\xe3\xb0\x7f\x19{e\xad\xa7\xceF\
+\xb1#\x04\x98\xb0\xd2\xc1\xf6\x11\x02\xf2\x00\xc3\x93V\xac\x1e\xd8\n$\xd8lU\
+\x02T?A*\x87\xed\x00\x7f:\x7fA;\x84\x07\xca*m\xf2>\xbf\x1d\x0f\xc5\xe4\x1b\
+\xaeP\xbeF\x8b\x00\x08\xd7\xed\xfd\xfcR4\x90\xeaMO&\xa8\r\xfd\xc9\n\xd9=k\
+\xb8\xbe\x01\xfao\x11\x02Z\xf1V\xf8\x95Cr\x11\xfd+$\xf3=\'\x12\x12\xd2\xfc\
+\xcb\xbd\x00\xc1\xae\x9d\xf8\x1e\xf0^\xbb+\x05\xd0r!-0\x00\x1b\x80\x93\xfac<\
+P#!\xac\xe4\xbf\x13\xb13\x0e\xa4A\xba\x06Y\xa6\x1aJ\xec\x86>\'{\x9e:\xd0\xfa\
+\xc2\x01/\x97|\xedUo\x0fG\xb5\xa1\xae\xbb\xbe\xf6\xbc\x19\xe36\x86\xfac2\x99\
+\x83\x8f\xfe\\/\xda\x14\xf31\xb4\xfe\x81\x05:\\\x05\x88\xe9\xc1\x11\x82\xbf\
+\x16\xa3E(\\J\xc8\xfd\x16\x98#N\xe6(e\x99o\xee\xe6oEe@SG%}\xde\xd1t8\xa0dF+\
+\x14\x95\x8a\xe7\xbb\xc1\xd7\xfd\x9fli\x02<\x93 \x95\x07\xcex\xf0\xe4r9\xe8U\
+ay\x80\x1cw\x0fF\xc6\xc1\xf1\xe9G\x80\x84\xf80\x8f+\xde\xb6\xd2/\xdb\xfc\xc0\
+B\x84\xa7\xa8\xbe\xf0\xdb\x93\x14\x97\xe7\xcbp8M\x19axt\x98?R\xc9V\xca\xd3%\
+\xb7\xa6\xc5\xc8\xf2OW\x88\xe5\x01\xd1\xa9p\x19\x80:\x86g:\x1f\x8bem;\nQ4\
+\xe2\x00ZC\\\xbe\xb2-lTP_\x0c\xb8 \xe6i\xc4%\x9e;>eD\x93\r8\xcb=\xdb\xd5\xe0\
+\xcf\xbe\xbe\x97\'\xf6\x1c\xd5\xe3\x1a\x03\xf2LVJDQ\x16\xba\x1d\xd9\xd2\x8bC\
+u)\xbb\x18\xd2\xbb\xe7\xa0\x9cI\x97G\xfc\xf5\xe5S\xcc#\r#\xf5\xb0\xe7\xbd<\
+\x0e\x1c\xe4\xa3\xf2\x10TO\x10;PRs\x8ev\xf3;\'I\x8f\xdewK\x8f\xbb\\A\xe0i^\
+\x8d\xa5\xf9\xcbs\xff\x11\xa2/aN\x02\xa9K\x05e\xde\xb7T\xa9\xd3\x85_\xd5\xe4\
+\xc9\x80\x1d\xc3(\xd9\xaae5@\x87O\x1fL\x1dz\x9d\xdc\xd6#q\xc4\xbe\\\r\x96\
+\xf8\x83\xd8\xbb\x95Q%\xab\xa1\x7f\xf8\x14\x10\xbf\x93\x98\x8b\xcb\xf8\x1bO\
+\xef\x08\x92\xf6\x14\xef\xfb\'\x0fH\xcep;m\x7f\xd6\x07\x88\xb65\x94\xec\x15\
+\x80\xef/\xa9\xe2\xc6R\xff\xe5\x7f\x11\xe041a\xb4\x01=59\x1c\x8b\xecR\xf7}3\
+\'\x9cW\x1cdO\xc3\xa7\xc8\n\xa9\x83G\xae\x00\xc8\x8a\x85j\xdd\xf2\xa4\xa2\
+\x94\xee\xb45\xd2\xe1\xf8B\xc1\xac\xf8\x08\xf7\xb7\xedEq\xd3F\xe6\xb2\xf9l69\
+\xa1\x1b\x12N\xc9Q\xdeU\x88J\x9edlK\x04\x92f%W\xe7\xec\xd3jpF\xbch\xa7\x8c\
+\x13\xaag\x8d\x0c\xa8\xb3\x8aHc\xb2=\xef\xb9I\xeaw\xef\xfd\x04)!\xc5C\'\x7fj\
+\xa0\xa4U` eht\xf2\x9d\x91\x9e\xd1/G\xee\xeaMs\xd0\xf4\xf4uL\xfe\xcf[LJ\x87}\
+\x19\xb7\xde\xff\xed\xc3\x05O\x9a&\xa7\x15}\t\xef\x00\t\xf0\xd2\x01\x19hU<\
+\xb4\x8f\xfa\x7f;=\xed\x8c' )
 
 def getfulltwistedBitmap():
-    return wxBitmapFromXPMData(getfulltwistedData())
+    return wxBitmapFromImage(getfulltwistedImage())
 
 def getfulltwistedImage():
-    return wxImageFromBitmap(getfulltwistedBitmap())
+    stream = cStringIO.StringIO(getfulltwistedData())
+    return wxImageFromStream(stream)
 
 #----------------------------------------------------------------------
 def gettwistedData():
-    return cPickle.loads(zlib.decompress(
-'x\xda\xc5ZkS\xd3@\x14\xfd\xee\xafX\t\r\xd8\xd8\x98\xb4P(1N)m\x11Q\xa3\x02Zu\
-| \x0f\x15\xd0\xe2\x03Q\x9c\xf1\xb7\xcb=-\x90\xb2{\x93\xdd6i\xef\x19u\x8e$9\
-\xbbgw\xef\xdel\x98=:\xf6ol\xcc\xf8\xe5\x8a\xf0=O\xd4<\xe1\xcf\xdc\xd8\xde\
-\x98q\xc4\x8eh\x1cm\xef\x1c\x82U\xce\x99\xd5\xaa\x10\xc0\x17\x89\xafT\t\xe0/\
-\x89/\xd7\x08\xe0\xaf\x88W\xdb\x04\xf0\x7f\xc4\x9b-\x02\xf8{\xdc\xef\x13\xc0\
-7q\xff\x1c\x01|\x95\xf8\\\x93\x00\xfe\x04\xf7\xd7\x08\xe0\xdf\x88\xd7\xda\
-\x04\xf0/\xc4\x17\xcb\x04\xf0\x1a\xf1\xb6O\x00\x7f\x8a\xeb\xd1@p\x1f\xfam\
-\x02\xf8\x06\xf1F\x99\x00\xfe\x15\xd7\xcf\x13\xc0\xff\x12\x9fo\x10\xc0\x7f\
-\xe1\xfee\x02x\x1b\xd7{\x04p\x01}\x04\xf8g\\?O\x00\x7f\x07\x7fZ\x04\xf0y\\\
-\xbfL\x00/\xa2\xbf\x08\xf0g\xb8\xbeF\x00\xbf\x05\x7fV\x08\xe0k\xc4\xcbm\x02\
-\xf8\n\xee_$\x80/\xa1\x7f\x08\xf0\x07ho\x8b\x00\xfe\x1c\xfe\xf9\x04\xf0u\xb4\
-\xc7#\x80\xbf\xc5\xf3*\x04\xf0\x0e\xeeG\x80?\x82?m\x02\xf8\x0b\xe8\xf9\x04p\
-\x9b\xf8\x02\x02\xfc&q<\xae\xd7\xbf\xdf\xd0o\x13\xc0Kx\x1e\x02|\x1f\xedi\x11\
-\xc0?b>\xfa\x04\xf0\x87\xf0\x17\x86\x80\xef\xc0\xaf&\x01\xfc;\x9e\xe7\x11\
-\xc0#\xe8#\x88O\xcd`\xfe\x95\tS\xf4\xf3;\xf0\xb3E\xc0\xf5\x16q\x1f\x01\xde\
-\x82\x1f\x0b\x04\xf0?\xf0\x03\x13\x14\xbc\x8a\xf6\xa1\xc1\xe0\'\xb8\xbeL\x00\
-?\x80?\x98P\xe0\x9f\xe0O\x83\x00~\x8f\xb8\xb7@\x00\xdf\xc5\xf3+\x04\xf0\xc7x\
-\xbeG\x00_\x80\x7f5\x02\xf8\x16\xfa\x8f\x05\n\xfe\x13\xfe\xc1`\xf0S\xb4\x07\
-\x06\x81\xbbx\x1e\x02\xfc\x18~5\t\xe0\x1e\xe6\x9bG\x00\xef\xc2o\x04\xf8]\xf8\
-\x87\t\x0c~\x84\xe7\xcd\x11\xc0\xef\xe3\xfa\x05\x02\xf84\xaeG\x80\xcf\xa1\
-\xff\xe80\xf86\xda\x8b\x05\n^F{\xdb\x04\xf0&\x9eW&\x80\x7f\xc0\xf3\xe6\t\xe0\
-!\xfc@\x80/\xa3\xfdh\x10\xf8,~^!\x80\x17\xe0\x17\x02|\x0f\xfaXP\xe0\r\xf8\
-\xdf \x80\xd7\xf1<\x04\xf8\x19\xda\xe7\x11\xc0\x0fq=\x16,\xf8\x1b\xf8\x89\
-\x04\x00\x1e`~!\xc0\x7f\xa0\xfd-\x02\xf8k\xdc\xef\x13\xc0oc\xfe5\t\xfd\xfc2\
-\xb1\x18Y\xdf\xedLT\xbf\x1b9uwr\xfa\x1d\xcbq\x1ckzB\xfan\xc1\xe9\x85=\x11\
-\xfds\xef/"*\x8e_?tbau\xc6\xac\xef\x96\x9c\xc1(\xb8\xe3\xd4\xef\x06\xce\xf5\
-\x08\xba\xe3\xd3\xb7\x1dU\x84c\xd2w\xeb\x8e:J\xee8\xf4\x97,\x87\x0bk)\x7f}\
-\xdbI\n;g\xfdb\xddI\x0e\xb3T`\xaa?m9ia\x94\x8e\r\xf5%\xef\x83N\xa4\x18\x037\
-\x1f\xfdb\xa4\x98\xf0\x97\x9b@|\x0c\xbay\xe8w,\xf5\x82\x97\xff\xdf\xb1\xc2\
-\xcc\xf5\xe5~"\xe1u\x95\xbeh\xa7\x02m\xfdn\xa4T\xb0/\xfe\x192\x1d\xeb\xeaK\
-\x1e\xc3at\x1cB\xaauag\xa6/mv\xbd\x19v\xd1\xa8\x90\xc9\x0b\x1a\x95\x99\x96\
-\xbe\xbc\xd9\xd1f\x1b\x9b\x10\x10\n\x87I\x05:\xfa\xd2\x83Ql\x0cL\x08\xe4\xfd\
-\xa5!\xc6 ]?\xc5\xfb\xf8RT\xed\x8b)\xe98U_\xee\x94\xed\xaa\x16\xa3S/2c\xd0\
-\x19E\xdfV\x0e\xa9\xa2\xfaI\xf8IRe\x96\xac/\x1b\x1a1\xbd\xbc\x1cly\xb8\x12SA\
-\xa2\xbe\xc2{Fa\xa0u\x96Ae\x96\xa4o\xe0\xfd\xe0\x15\x06\xe9\x98\xd7\x97\x93z\
-=\xc9{&3\xa4Uf\xac\xfe\xb4r\xb3\x93\'D\x10\xea\xacN6\x150\xfa\xae\xadl\xbf<!\
-\xee9\xd2\x80`\xc1\xa9\xb6DU*P\xeb\xcb#\xc8e\xd8\xdb\x8ebBr[\xa2"\x1d+\xf5;\
-\x9a\xde_\xae\xad\xeb7\xf0[\xa2\x9b\xae\xaf(4\x96\x12\xaa~y3\xb8\xdc\x12\xa3\
-\xf4\xcaL\xd6g\x0b\r\xb3)_\xe2\xb6\xc40Y?T\xe6\x0eUWR\xa6<\xbb%\x0e\xa4\x82k\
-\xfarnc\x87Ro\x0cT\x93&\x9e\x8e\x07\xf5\xe5\xdc\x96\xe6}\xfc:i\xd1r\x8b&\x96\
-\n\x06\xf4m\x87-\xf2RC\xe9\x13\x9b\xb0/+\xb3\x98\xbeb\xb3\xe3R\x19\xfb\xf6/\
-\xb5\x95\xdb\xb0.R\xc1\x95\xbe<U\xb8T\x9e4\x06\x92\x87\xec\x86m\x0f\xea\xdbz\
-sj\xd81\xe0\xd2q_\xbf8\xa2\xf7\x89c\xc0n\x89\x9d\x0b\xfd\xbbJ\xef\x85tOa\xb0\
-\xb6\xb0\n\xa1\xd2\xd5H\xb3/\x96\xdf\xd7/G\xca\xeeK\xcb\xbe \xdc\xab\x16X\
-\xa1+\r\xacz\xba1C\x19U\xae\xc6\xdf\xd6\xb3\x92\xde\xb7{- \xf5\xeb\xa62\xcb\
-\x8d\xe9\xfe\xdc||\xfe\xc9\xd3_9\x9di+\n\xfb\xcd\xbb\xae\xc4Lu\xf5\xf0\xf7\
-\xeb\xa1\xab\xf5W\xad\xebm{aO\xc2\x1e\xd1\xfb\xaa\x9c\xff\xd4[\x8f\x94\x96\
-\xea\xe8KT\x1a\xc5\xfb\x05e\xfe\x95\xc7\x80\xcd\xe0\x9a\xef\x05\x8c\xf7\x8b\
-\xcc\xfeS+)\x87)\xb1\xe4N\xf2^\xed\x89W\xe5\xf7\xffP\xfb\xa5\xe6\xba\x8el\
-\x1e\xe3\xc9\xb7\xc4\xfa\xc3\x0f\xb4_jR\xde\x0b\x18ONS\xea\xaf\xbd\x92\xf6KM\
-R\x99\xc1x\xff\xfdgz\xfd\xdb1\xd9\t\x992\x8b\xf1\xfe\x8fV\xfd}\x12i\xefF\xcc\
-\x02a<\xf9\xac\xf9\xfe\xb1W\xd0\xac\x84\x18\x1d\xb5\'\xc7U\xbd\xf7\x9f\xed\
-\xf3??t\xd21\xa3\xc3x\xb2\xab\xfb\xfe\xb7\xbf\x7f\xfe\xd7\xc7(\xb5\xba0\xf2>\
-81}\xff\xff\x94\xf2d3\xef]\xf3\xf3\x87\x83$g\xa13\xad\xe9\xbdu8\xd4\xf9\xcb\
-\x11\xd3\xbb\xa0\xaf\xa3Y48\xd1\xd9\xb0\xe7_\xbf\xd5cPR\xeb0\xefJ;\xee\xf0\
-\xe7o\xbf,\xee\x14aZ\xaf`q\xac\x0f#\x9d?\xd6\xd4\x995\x0b\xef5\xcf\x7f\xbf*N\
-\x11\xb4\xbd\xff\xe2\x8e~\xfe|*\xed"\x81\xe6\x0ea\x1ddr\xfe\xbe\xf7(\xed\x93\
-\x1bS\xe4=\xce\xea\xfbG\xc32>\x7fp\x9c\xe7\x19~\x7fY\x89L\x8f\x1c\xd3\xbd7\
-\xfa\xfe\xb4\xf7\xca\xcc\xfb\xe5j\xd6\xdf\xff6,\xd6{\xb9:\xdb\xcd\xe1\xfb\
-\xe3\x8a\xa7]\xf86\xf3\xf9\xfe\xdb\xd6+\xf2Vs\xfa\xfe+\xc4}K\xa3\xc8\xdb\xd5\
-\x7f\x9e\xf1\xf7\xf7\xaa\x97\xe6}p\x96\xdf\xf7\x7f*\x9e\x1f\x0c\xbct\x04\xba\
-\x85Fv\xbf\x7f\xd1+nL\x8a\xbc\xec\xf4\xd7\x1f\xf6\x8b.\xa6\xc8;\x13\xb9\xea?\
-Y\xeb\xf7[]\xe4m\x99\xff\n\x94\x91\xfe\xcb\xf8\xc9\xa1\\\xe4m\xe6\xfb\xfbO\
-\xeb\xcf\xe2\xf3\xbenXh\x8c\xac\xdf\nb\xeb^.4\xb6r\xfe\xfd\xb7\xce\x80\xd5\
-\x99xo\xa0\xbf\x9e|\x00\x11\x95E\xbe\xfa\xab\x89\xf2\xcf\x85\xc8Y\xdf\xddI(\
-\xbe^\x88\xdc\xf5\x85x\xca\xc9\xdf\xfc\'\xc6\xa1/\xde\xdeQ\xca\xcf\n1\x1e}Q\
-\x9dSx\xdf\x14c\xd3\xbf\xda\xfa.\xe3\x96+\xc6\xa9/N\xd6F\xda\xecF\xdf\xff\
-\xaa\xefb\xde\xbf\x17\xd9\xe8O\x19\xddp!\xff\xc6\xcd@^L\x19\xd7\x1f\xad\xde\
-\x18\xbc\x16\x99\xc4\x10\xf5\x0f\xad\x83\xe0LLL_\x88\xcd\xbf\xae\x98\xa4~\
-\x86q\xae\xef\xfe\x07\xf5C\xce$' ))
+    return zlib.decompress(
+'x\xda\x01\xd4\t+\xf6\x89PNG\r\n\x1a\n\x00\x00\x00\rIHDR\x00\x00\x00{\x00\
+\x00\x00d\x08\x06\x00\x00\x00\xa6GO1\x00\x00\x00\x04sBIT\x08\x08\x08\x08|\
+\x08d\x88\x00\x00\t\x8bIDATx\x9c\xed]-p\xe3H\x16\xfe\xf6\xea\xc0\x82\x03\r\
+\x07,\x10X\x10\xb0@`\x80\xc1\x02\x03\x03\x81\x01\x02\x06\x02\x03\x04\x0c\x04\
+\x06\x18\x04\x08\x1c08 \x10 \x10 \x10 0@ @`\x80A\x80\xc0\x01\x81\x00\x81\x01\
+\x02\x01\x02\x07\x02\x02\x04\x06\x08\xb8J\x0b\xb2\xf2\xc9\x8e\x1c\xff\xf4{\
+\xfa\xb1\xe7\xabz\x95\xb2\xe3H\xed\xfe\xfa}\xfd\xde\xebV\xfa\x97bU\x94\xf8\
+\x89\x8b\xc0?\xban@\xdb\xc8\xf3\x1c\xfe\x9d\xdfu3:\xc1E\x91\x9d$\t\xb4\x89\
+\x06\xcb\xb2\xa0i\x1a\xf2<\xef\xbaI\xad\xe2b\xc8\xf6\xef|h\x13\rI\x92\x00\
+\x00\xa2\x87\x08W\xbf_!\xbc\x0f;nY{8{\xb2\xf3<\x87eY\xb0,\xeb\x8d\'\xe7y\x0e\
+\xc30`\xdbvG\xadk\x17\xbf\x9cs\x80\x96$\t\xac\x99\xb5\xf6\xe6\xf7\xa0\xaa*\
+\x82\xfb\x00\x8a\xa2\xf07\xac#\x9c\xadg\xbb7.F\x1fG\x07\x11\r\xbc\x0e\x8c\
+\xd1\xc7\xd1Y\x07og\xe7\xd9\x95l\xcb\xcc\xc5\xe6\xcc\x84\xe38\x10B\x10\xb6\
+\xac{\x9c\x15\xd9I\x92\xc0\x98\x1a\xc8\xb2L\xfaZ\x8a\xa2 \xb8\x0f\xa0\xaa\
+\xaa|\xc3z\x82\xb3\x91q\xdb\xb61\xfa8"!\x1a\x00\xb2,\xc3\xe8\xe3\x08\xee\x8d\
+Kr\xbd>`\xf0\x9e]E\xd4\xd1C\xc4v\x0f}\xaa\xc3\xf3\xbc\xc1\xcb\xfa\xa0\xc9\
+\x8e\x1e"\x18\x86\xd1JqD\x08\x81 \x080\x9e\x8c\xd9\xef\xc5\x85\xc1\xca\xb8m\
+\xdb\xadV\xc1\xf2<\x87\xa6i\x83\xce\xc9\x07\xe7\xd9Y\x96\xc1\xb2,V\xd9\xde\
+\x87\xa1\xe6\xe4\x83\xf2\xec\xf0>\xc4\xe8\xe3\xa8S\xa2\x81\xff\xe7\xe4C+\xb5\
+\x0e\x86l\xdb\xb6\xa5\xe7gEQ\xe0y\x1eI:U/\xb5\x0eeA\xa5\xf72\x9ee\x19\x8c\
+\xa9qp%l\x17\xea\x11u\x9e\xe7\xb0m\x9b\xacZ\xa6\xaa*\xbc;\x9aA\xc4\x89^{\xb6\
+\x7f\xe7\x1fU\xf2\xdc\x05\xc7q\x10\x04\xc1:u\x12B\xc0\xf3<\xb2t\xaaZ:\xed{N\
+\xdeK\xcf\xa6\xf2\xbc\xa6*X\x92$\x1b\xaf\xa9\x94\xa3B\x9fs\xf2\xdeyv\xe5%\
+\xb2D\xebS\x1d\xf1c\xbcAlUe\xab\xcf\xfd\x8a\xa2 ~\x8c1\xbf\x9eK\xdd\xafB\x15\
+DR\r\x1eR\x14\xab\xa2\xec\x8by\x9eW\n!J\x00\'\x9b\x10\xa2t\x1cg\xe3\xba\xe9S\
+Z\xaa\xaa\xba\xf19EQ\xca\xf81\xde\xf8\\\x10\x04\xd2\xf7\xaf\xdb\xfcz\xdey\
+\x9f\xd6\xad\x17d?\xbf<\x97\xfaT\x97\xee\\UU\xdf\x10\xb8o\x005\r\x8c\xf1dLF\
+\xf8x2.\x9f_\x9e;\xef\xe3^\x90\x1d?\xc6\xa5\xa2(\xd2\x9dj\xce\xcc\x8dN}~y.\
+\xcd\x99y2!\x8e\xe3\x90\x11.\x84(\x83 \xb8l\xb2):T\x08Qz\x9e\xf7f\x00m\xcb\
+\xf6!\xd7Y.\x97\x1b\xd7Y.\x97g%\xeb\x9d\x90\xdd\xa5l\xef\xb3mY\x7f~y&\x95uUU\
+\xcb\xf4)\xbd\x0c\xb2\xa9\xbce~=?Y\xb6\xf7\xd9x2~C\x08\xb5\xaco\xab\xd1\xd9\
+\x91=\xbf\x9e\x93t\xd4\xf6\xfcG5\xef\xb7}\x9f\xed8\xe3,\xc8\xa6\x92\xc2&\t\
+\xa4\xf4\xb8]\n\xb2\xfd](\xa6\xa0\xca\x9aR\xc0\xc1\x92M)\xdb\x9c\x9d~\xca \
+\xa3\x0c\xde\xb6c\x85\xc1\x91=$\xd9>\xb5\x1d\xc7F\xfd\xef\x99>\xd5Ye\x9d\x85\
+\xec\xa6\x8a\xd5)\xc6\x1d(\x9db2\xf9\xfc\xa1\x83j;\x05\xec-\xd9T%G\xae\x14HQ\
+\x14\xe9\x01\xc3\x91\xf2m\x1bGNNF\xf6\xf3\xcb3\x99l\xb3\x157\xfe\xf9\xfa\xb3\
+X\xc9O\x05M\xe9\x13\x95\xa2\xd5\x07\x15eNNB6\xd5\xdc\xc5]\xb6\xfc\xf0\xdb\
+\x875\xd9\xd5\x00\x95\r\xf2\x9a\xe6Y\x8aA_\x1fTT\xa5Vi\xb2\xa9\xe4\x8b\xbbrU\
+YS\xaa#\xfb\x1d\xdaZA\x93\r\xdeN&\x9b*0Q\x14\x85\xbd&\xdd\xe4-\x14\xf5\xf4}\
+\x03\x96C\xd6er\xf2\x93\xc8\xa6\x92mn\t\xdcg\x1c\x91u\xd3w\xa2.\xb5\x9e\x9a\
+\x93\x1fM6U\xc3\xb9\xbd@\xc6[de\xbd\x8d\x15\xb4Sr\xf2\x83\xc9\xa6\xaaX\xb51\
+\xbf\x9dBN\x1b\xb2N\x1d\x87\x1c[j=\x88l\xaa\x8aU\xd7\xb2}l\xfb(\xd2I\xee\x0c\
+\x038<\'\xdfK6U\xee\xdc\x17\xd9\xdeg\x1c\xca\xd3F\xc9\xf7\x90\xedO;\xc9\xa6\
+\\\xa9\xe2\xae6q\x18\xc7\xe0\xe4^\xcc\xd9\x97\x937\x92M\x15Lp\xd7\x91\xb9\
+\x8dc\xdaic\x99v\x97\xac\xbf!\x9bJ\xb69\x02\x9e.\xacMY\xe7.\xb5\xae\xc9\xa6\
+\xdaB;T\xd9\xdeg\x1c\xb2\xde\xc6\nZ\xdd\xe9P\xac\x8a2\xb8\xa7I}\x9a\xb6\xd9P\
+4\xde\x9c\x99\'o\x16\x10B\xac\xff^\xb6\x1dM\xf2(K8\xb7s\x08!\xd6\xd7\x07ed\
+\xdc\xd4p\x8a\x1c\xda\x9c\x99\xeb\x91\x7f(\xe9U\x06P\r>Y\xb2\xb9\x82+\xce)OU\
+\xd52\xcb\xb2\xe69\x9b*\xe7\xe5\x90\xbcz\xb0\xf4\x1e\xe9\xdb$\xcbJ#g\xda\xc4\
+\xe9\xd5\xf3\xf9\xbc,\x8a=\x01\x1aU$\xce\x11\xc9n/\x9a4yk}\xa0\xc9\x92\xc2\
+\x199s\xcd\xd7\xef\xedtiL\xbd(w\x85p\xd4\x88+B\x9b:\xbe\x92\xdbK\x95\xed\xf7\
+\n+\xefV\xd0\xb8\x16=(\x06\xd3x2n\xf4\x04UU\xa5H\x19\xaal\x1f\xb2\x12\xb6\
+\xb7\\J%\xebm\xd4\x88)\xc8\x18\xa2lG\xff\x8d\xf6\x12}\x10\xd9\xc5\xaa(\xf3<\
+\'\x93\xb0mY\xefb[p\x93q\xca6\x97R\x8c\xc7\xc7=\x0e|\xd4z6\xd5(\xefr\xc3\xff\
+!dP\xa9\x19\xa7Rxw\xde\xc1\xbc\x9dD6\xf5\xfc\xc5\xfd\x94\xc5^\xcf`\xdc\x97\
+\xce\xa9\x14\xc9\xf7\xe4h\xa2O"\x9bZ\xd6\xb9k\xc4\xbb\x8ckc\x01\xa7l\xeb\xba\
+\xfe&wf\'\xbb2\xaaH\xb2\xcd\xd51\xce-C}\x93mR\xb2\x8bUQ&I\xc2Vj\xa5^@\xe1\
+\xcc\x088\x95\xe2\xd0h\x9b\x9d\xecJ\xd6\xa9\xd2\x08\xae\x1d-\x9cdp)\x85\xf1\
+\xd9 }\xd0\x8f\xf4Y/\xaa\xd53\xcaR+\'\x19\x9cJ\xe1\xba.\x19/,d\x17\xab\xa2\
+\xcc\xb2\x8c\xc4\x13)6\r\x0cQ\xb6\x15E)\x93\xe4\xb4h\xbbu\xb2+\xb3m\xbb\xd3N\
+\xfd)\xdb-\x92]\xac\x8a2\xfc\x16\xb6.\x97MdP\xedK\xe7R\n!D\xe9\xde\xd2\xcbv\
+\xabd\x17\xab\xa2\xcc\xfe\x97\xb1zT=\x7fm"\xa3\xcfk\xf4\xc0k\x16\xc2%\xdb\
+\xad\x93\xbd\xf6\x80\x1b\xbe\xb9R\x9f\xealdp>\xc1b}\xb1\xce\xef\xbf%U\x16\
+\xc71[\xf1\x82\x83\x0c\xae\'X\x84\x10\xa5\xff\xd5o\xad\xdf;!\xbbX\xbd\xe6\
+\xe4\\eI*2\x9a\x14d\x88\xb2\xdd9\xd9\x95\xb9\xb7.\t)\xd5C\xeaC\x90\xed\xc5b\
+\xd1\xe9\x7f(\xee\xf4$\x814M\xa1\x7f\xd2\xa5\x8fTT\x14\x05y\x9eK\x1f\xcc\xb2\
+}\xe0*\xd5\x89\x06B\x08\xf8_}h\x9a&u\x1dYt~lD\xf1\xa3\x80\xf5\xc5B\xf05\xe8\
+\xac\rB\x088\x8e\x03sf\xae\xdf;\xe6\xec\xed\xf7\xa0\xaa*\xc20\xc4\x87\xdf>H\
+\xb6R\x1e\x9d\x1f\x1b\xf1\xeb\xbf~\x85\xef\xfb\x9d\x9d\xab\xa1\xaa*\x96\x0f\
+\xcb\r\xa2\xfd;\x1f\xdaD\x93&z\xb1X ~\x8c{A4\xd0\x03\xcf\xae#{\xca`\x18t\x87\
+\xb3\xec\xc3\xb9\xcb\xf66:\xf7\xec:\x94\xdf\x15DQ\x04\xeb\x8b\xc5z\x9f\xa6\
+\xa3\x9e\xa8\x0e\xa2\xd1>iH\x9f\xd2\xde\x11\r\xf4\xcc\xb3\xebX~[\xc24M\xf2\
+\xd3\xf0\x9a\x0e\\so\\8\x8e#}/\xd7u\xd9\x07\xaa\x0czK6\xf0*\xeb\x96e!\x8a"\
+\x92\xeb\xcd\xaf\xe7p\x1cg\xfd:\xcfsX\x96%}\xa6\xa6\x10\x02a\x18b\xf4\xe7H\
+\xb6\x89\xac\xe85\xd9\x15\xbc[\x0f\xf3\xf9\xe9\xe7nU\xb2\xadO\xf5\xf5{I\x92\
+\xc0\x98\x1a\xd2i\x9f\xf6I\x83\xef\xfb\xbd<\xb4m\x1b\x83 \x1b\x00\xe28\x86\
+\xfeI?Zj\x9b\x8e?vo\\\x92s\xb0\xfb.\xdb\xdb\x18\x0c\xd9\xc0\xdf\'\xdbN\x8d\
+\x83e\x9dK\xb6\x15EA\x18\x86\xb8\xfa\xe3J\xea:m\xa3W\xd1\xf8N\xac^\x7f\x08!\
+\xb0|X\xc2\xbb\xf3\xde\xfd\xb8\x10\x02A\x10l\x10\x1d=D$g^\x1b\x9f\r\xc4\x8f\
+\xf1\xe0\x88\x06\x06\xe6\xd9uD\x0fQ\xe3y\xda\xe3\xc9x\xe3D]\xe0re{\x1b\xc3\
+\xf0l\xbc\x96U\xe38^\xbf\x1eO\xc6H\x9fR\x8c\'\xe3\xf5{\x8e\xe3`\xb9\\n\x14I4\
+M\x93&ZQ\x94\xd7\xf2\xe9\x80\x89\x06\x06\xe2\xd9\xd9S\x06}\xaa#\xfd\x9e\xee\
+\xf4\\UU7\x88\xdf\xe5\xf9\xc7\xc2\xfaba\xb1X\x0c"\xda\xde\x87\xde\x93\x1d\
+\xde\x870\x0cc\xe3\xbd\xa6T\xaa\x0e\n\xd9\x16B\xc0\xbdu\xdf\xdc{\xc8\xe8-\
+\xd9\xc5\x8f\x02\xb6m\xc3\xf3v\x07cM\xd1\xb6a\x18\x88\x1e"\xa9{\xab\xaa\n\
+\xdf\xf7\x07\x19\x84\xbd\x87^\x92}\xcc:w\x95G\'\x8f\t,\xcb"\x91m\xd7u\xa5\
+\xae\xd1W\xf4\x8el\xff\xce\x87e\x1d\x17\x08\t!\xa4I>G\xd9\xdeFo\xc8.~\x140g\
+\xa6t\x1e|\n\x9a\xaal\xe7\x88\xde\xa4^\xc6g\xa3\x13\xa2\xab\r\x06\xe7N4\xd0#\
+\xb2}\xdfo5\x8f\xadV\xaa\xec\x7f\xcb\x17[\x86\x82\xde\xc8x\x85S\xe6\xecc1\
+\xfas\x04\xdf\xf7/\xc2\x9b\xeb\xe8\x8dgW0g&\x92$aK{\x16\x8b\x05\xa2(\xba8\
+\xa2\x81\x1ezv\x85<\xcf\xe1\xfc\xc7!K\x83\x86\xb2\xc1\x80\x13\xbd%\xbb\x82\
+\xef\xfb\xb0fr\xb2>\xa4\r\x06\x9c\xe8\x9d\x8co\xc34\xe5d\xddu]\x84ax\xf1D\
+\x03\x03 \x1b\x00\xae\xfe\xb8:z\xd7\xa9\x10\xa2\x95\x9d\xaaC\xc2 \xc8\x06\
+\xfe\xaep\xb9.|\xdf\xdf\xfbY\xe3\xb3\x81\xf4)\xbd\xe8\xf9\xb9\t\xbd\x9f\xb3\
+\x9b\x90\xa6)\x0c\xc3@\xfa=}\xf3\xbb\xa1o0\xe0\xc4`<\xbb\x8e\xab\xabWY\xaf\
+\xef8=\x97\r\x06\x9c\x18\xa4g\xd7\x11\x04\x01\x96\xdf\x96po\xdd\x9fA\xd8\x1e\
+\x0c\x9e\xec\x9f8\x1c\x7f\x01^\xfa\x92\xc5\x90q!T\x00\x00\x00\x00IEND\xaeB`\
+\x82\xe2\xfc\xd9\x86' )
 
 def gettwistedBitmap():
-    return wxBitmapFromXPMData(gettwistedData())
+    return wxBitmapFromImage(gettwistedImage())
 
 def gettwistedImage():
-    return wxImageFromBitmap(gettwistedBitmap())
+    stream = cStringIO.StringIO(gettwistedData())
+    return wxImageFromStream(stream)
+
+#----------------------------------------------------------------------
+def getLeftArrowData():
+    return zlib.decompress(
+'x\xda\xeb\x0c\xf0s\xe7\xe5\x92\xe2b``\xe0\xf5\xf4p\t\x02\xd2" \xcc\xc1\x06$\
+{;ey\x81\x14K\xb1\x93g\x08\x07\x10\xd4p\xa4t\x00\xf9O=]\x1cC*\xe6\x9c\xbd\
+\xa2\xcfw\xc8@\xe4\xf8\xc7\xf7\xd9\x82\x1c,\xec\x0e\n\xda\x96LB\x9dO$N\xc86*\
+\x170\xa8\x00\x05\xcaXX\x98,\x1b\x1d\x94\x0co;_\xdch\x1f %vH?\xf3\x92\xce\
+\xdd\xf4\xf7\xa6\xb1\xae=KO\xcf\xf0\xdb:\xbf)\xea\xc9*\xd7us\x1b\xce\x07\xe8\
+\xdcb\x90?\xf0\xaa\xa2[\x97\xaf\xe1\x9e\xf6\x19\xdeY\xe7\x9d\x05\x93\x8f\x86\
+G\x1c\xbf\xb6\xfc\xc7\xab-\'B\x8f\xdc\xe0\xdaVbp\x7fz\xf7\xb2\xc5\x06[\xec\
+\x9c\xb6\xbd`\xbeP\xdd\xce\xb8\xe4\xb9\xc1\x8cX#\xfb\xef\xba\xea\xb3E\xb6\
+\xf3\xee\x97\xf1Z\x9a:I\xf6\xf1I\x11\xf3\x96\xcb[\x7f=M\x98\xb6\x8e\xa5\x91\
+\x8d\xeb\xe9\xbe#G\xb6\xeb\x1c\xe3bX-yS\xb1\xb7m\x8f\xe2\xb10\xb6\x05\r\x93\
+\xde|1\\\xbf\xbe\xd2\xfa\xd6\xba\xf5\xbf\x1c\xbf]\xad\x9fp\xad\xfe\xa7d\xc7\
+\xc1\x86o\\\xfbO\xfe\x8f\xdfP\xfe[%m\xde\x1e)oPh0x\xba\xfa\xb9\xacsJh\x02\
+\x00\xdd\xdfz\xf7' )
+
+def getLeftArrowBitmap():
+    return wxBitmapFromImage(getLeftArrowImage())
+
+def getLeftArrowImage():
+    stream = cStringIO.StringIO(getLeftArrowData())
+    return wxImageFromStream(stream)
+
+#----------------------------------------------------------------------
+def getRightArrowData():
+    return zlib.decompress(
+'x\xda\x01+\x01\xd4\xfe\x89PNG\r\n\x1a\n\x00\x00\x00\rIHDR\x00\x00\x00\x14\
+\x00\x00\x00\x14\x08\x06\x00\x00\x00\x8d\x89\x1d\r\x00\x00\x00\x04sBIT\x08\
+\x08\x08\x08|\x08d\x88\x00\x00\x00\xe2IDATx\x9c\xcd\x94\xa1\x0e\x830\x10\x86\
+\xff\x96\x89\x89\t\xe4d\xe5\xc4\x1ed\x8f\xc4#\xec\x11\xf6\x08\xc8\x89\t$\x8f\
+01\x81<\x81\x98D *\x06\x9d(%\x048\xd6.$\xdb\x9f4\xb9\xe6\xda/\xff]\xda\x13BF\
+XSrU\xda_\x00M\xdb\x18\xd36f\x15\xe0\x10\xc4A\xbf*\xf9\xfc\xd0,T\xba\x84\xcf\
+r\x97\xa8\xe2\xa1r\xa9\x1f\x9c\xa8\xe6\xa1\x02\x80\x01\x00\xfd\xb2\xc9\xac\
+\xb4\x89\xa2\xe6\x81ywF\xed\x00\x15\x03\xc9qka2\x12=\xf0J\x1a\x97"\xd4\xeb\
+\x14\xbaq\x89%GK\xcaJ\x80ny\xbf\xef\x1d\xaaT\x83\x9e\xe4\xe7j\xafp\x88\x81\
+\xa2\x02\xe8\x9e\x03\xe7\x93\x85\rK\x0e\x91Jm\xbf\xc70\x00\x90.\x08\xd5\x1c\
+\xccm\xbcWW\x8dA\x92\x19\x17O\xce\x85\x8c\xaf\xf1\x9b\x9d\xab.\xe8\xeb\r\x01\
+\\\xab\x82\x1c\xfa\xe8\xf7\xf3\xf0\x93\xdeKg\x88\xd4\xa7\xbf\x86\xc3\x00\x00\
+\x00\x00IEND\xaeB`\x82w\x10{\xdb' )
+
+def getRightArrowBitmap():
+    return wxBitmapFromImage(getRightArrowImage())
+
+def getRightArrowImage():
+    stream = cStringIO.StringIO(getRightArrowData())
+    return wxImageFromStream(stream)
+
+#----------------------------------------------------------------------
+def getUpArrowData():
+    return zlib.decompress(
+'x\xda\xeb\x0c\xf0s\xe7\xe5\x92\xe2b``\xe0\xf5\xf4p\t\x02\xd2" \xcc\xc1\x06$\
+{;ey\x81\x14K\xb1\x93g\x08\x07\x10\xd4p\xa4t\x00\xf9\x17<]\x1cC*\xe6\xbc\x9d\
+b(tHA\xc0\xf5\xbf\x907w\xff\x84I\x97\x94+X\xfa\'\x19\xb9\x9f\x10,b\xe9wH|\
+\xa8\xa8\xa1\x11\x1c\x11\x11\x15\xb4bvSb\xdb\x04\x81\x0b\x1b/\xdb\x1f>\xb0\
+\xe1\xf4\xed\xd4g\xcc\x13WL\x10\xde?\x8f\x87AE\xeb\xd4\xd3\xae\xa0\x88=\xff8\
+^0\xce\xdd\xe6\xb0\xfa\xd4\x02\x95UG\x19\x1b\x18\x0b\x96\xeb\xden\x7f\xfa+Er\
+m\xd2\xfe\xf9V\xdbo$\xde\x88Tn|,9\xc1z\xc1=\xf9Ms\xcf5(\xfa\xe4\xc9\x9eY\xcd\
+b\xc5xl\xc3=\x9f\xc9g\xef\x9e\xcd\x0e\xe0\xca\xdd\x1c\xb2\xf1\xb2\xd8\xf4\
+\xd5\xd1\xda\xc6\x0c\xbdsb\x8d\xb7L\xf6`\xf5\x12\x9d\x7fs\x89P\xd17\x0f\xd1\
+\xf3R\xbfc\xff6\xeeg\x98\xf3\xd3 l}\xe3C3\x11f\xcd\xaf\xc9\xf5wod\x9f/\xd05c\
+Z\xdd\x92%\x1d!\x15\x7f\x00\xe87\x06OW?\x97uN\tM\x00p$n\xe8' )
+
+def getUpArrowBitmap():
+    return wxBitmapFromImage(getUpArrowImage())
+
+def getUpArrowImage():
+    stream = cStringIO.StringIO(getUpArrowData())
+    return wxImageFromStream(stream)
+
+#----------------------------------------------------------------------
+def getDownArrowData():
+    return zlib.decompress(
+'x\xda\xeb\x0c\xf0s\xe7\xe5\x92\xe2b``\xe0\xf5\xf4p\t\x02\xd2" \xcc\xc1\x06$\
+{;ey\x81\x14K\xb1\x93g\x08\x07\x10\xd4p\xa4t\x00\xf9\xd7=]\x1cC*\xe6\xbc\x9d\
+\xa2(t\xc8@\xc05>\xc8\x85u\x91\xfb\n\x97\x02\x81\xbe\x03\x81\x16N\xaa\x93\
+\x16+T\xb3\xb8\xb8\xa6\xb20E6v04\xbdHY\x90k\x96)\xdbd\x7f\xd9s\xd6\xfe\xdfi\
+\xc6\x9ea\x9as\x15O\xee\x9d\xa7\xb7e]\xc9\xb2%2{E\xa6}\n\x9b\xf40U~Z\xf2\xed\
+\xf3\xfe\xbc3j\xe5z\xfd\x99\x18_e\xdb\xcf\x9a\xedy\xac+\xfa\xdb\xa7\xabgC\
+\x85v\x84\xd4?\xe0gR\xffn\xf0\x8d\xcb\xa9\xf0q\xfa\ngGo\x93s\x81\xf7\xcf\x1e\
+\x9c\x1d\x9al(;\xe3\xb7\xc1\xce\xb7v\xc5\xc5+\x17\xde2\\W\x14\xb0\xd0\x9c\
+\xef\xf6\x9cM\rE\xb6,y]\x169L>\x8e\xb7\xf5\xf8\xb8\x99T_\xc8\xcc0?\xc2_\xd0\
+\xb0Z\xea\xb5\xc5\x9c\xb9\xff\xfb\x9f\xae\x888\xdev@\xd3m\xd7\xd6\x1d\xa9\
+\x9c\x13\x9a\x18\xf70>\xd4\x08+\x7f\xfaqB,\xd0\x8b\x0c\x9e\xae~.\xeb\x9c\x12\
+\x9a\x00\xdc\x08o\x10' )
+
+def getDownArrowBitmap():
+    return wxBitmapFromImage(getDownArrowImage())
+
+def getDownArrowImage():
+    stream = cStringIO.StringIO(getDownArrowData())
+    return wxImageFromStream(stream)
+
+#----------------------------------------------------------------------
+def getDblLeftArrowData():
+    return zlib.decompress(
+'x\xda\x01R\x01\xad\xfe\x89PNG\r\n\x1a\n\x00\x00\x00\rIHDR\x00\x00\x00\x14\
+\x00\x00\x00\x14\x08\x06\x00\x00\x00\x8d\x89\x1d\r\x00\x00\x00\x04sBIT\x08\
+\x08\x08\x08|\x08d\x88\x00\x00\x01\tIDATx\x9c\xcd\x94!r\xc30\x10E\xdfJ\x05\
+\x01\x05=@\x80\xa1`\x8f\x10\x18X\x98c\x04\xfa\x08>B\x0eP\x10\xd0\x03\x04\x14\
+\xf8\x08\x05\x01\x81\x06\x05\x81\x81&\xc9\x168rdUr\xd3i&\xd3\x9d\xd9\x19\xd9\
+o\xff\xd7.X\x89\x18\xcb-\xc3\xdc\xd4\xed\xae\x86z:\xaa\x9e\x8e\xfa[\x964\x0c\
+\x8bc\xe1\x18K\x1a\xfa\xa2j\xdbf/J1\x1f\x0f9\x81{\xcc\x9b\x85,\xecR\x8c\x15\
+\x93\x13\xacvy\xb3\x90\xc5\x97\x8a\x18;\x10,\x1d\xbc\xbcw\x05\xb3)\x94\xaf5T\
+\xf3$\xf3\xb1\xdaB\xb3\x98t#\xe7\xcc o\x06P\x7f^\xce\xcd\xbe\xe9\xcf&\x14\
+\xbb\xb7\xf4(c,\x8e\xc1\xc8\x94\x1b\x8a\xe7\x19\xee\tv\x07h>\xea\xae\xaa\x9a\
+\x7fgAW\x00,\xdd\xd9\xd1X\xce\xfb\xac\x80Rn\xb4X\xb7Z\xac[\xed\xff]\xc3|z\
+\xc3\x94\xa9\xff\x1eca\x8a\xb1\x0c\x0ccaX\xf8\x13\xeb3\xf5|\xc5+%\xc6\xca5\
+\x0c2\xbb\x1c\x16\xc5\x821\x06\xa4;\xfcK\xfc\xff\x07\xf6\x0b\x9d\xe9\xd2\xa9\
+\xfdu\xa4/\x00\x00\x00\x00IEND\xaeB`\x82\t\xa4\x88\xe0' )
+
+def getDblLeftArrowBitmap():
+    return wxBitmapFromImage(getDblLeftArrowImage())
+
+def getDblLeftArrowImage():
+    stream = cStringIO.StringIO(getDblLeftArrowData())
+    return wxImageFromStream(stream)
+
+#----------------------------------------------------------------------
+def getDblRightArrowData():
+    return zlib.decompress(
+'x\xda\x01M\x01\xb2\xfe\x89PNG\r\n\x1a\n\x00\x00\x00\rIHDR\x00\x00\x00\x14\
+\x00\x00\x00\x14\x08\x06\x00\x00\x00\x8d\x89\x1d\r\x00\x00\x00\x04sBIT\x08\
+\x08\x08\x08|\x08d\x88\x00\x00\x01\x04IDATx\x9c\xe5\x94!\x92\xc20\x18F_R\x04\
+b\x05\x12\x19\x89\xe0\x10\x95\x1cb\x0f\xd2#T"9\x02\x12\x81\xa8\xec\x11\x10\
+\x88\xca\x08\xc4\xca\nD\x04\x10\x04M)i\x1a`\x86\xc1\xec?\x93\xe9L^\xbe\x97\
+\xa4\xd3\xfeB\xc8\x84O\x96\xfc\xa8\xedkB{9[{9\xdbwYP\xd8]\xec\x07c,zB\x80|o\
+\x06\x831&\x1d\xf0\xaf\xa2\xeb\xe1`\x8c\xc9\xa1\xa3\xeb\xe3p0\xc6\x04`\x01\
+\xcc\xc9\xb0\xac\xee\xc2\xf2p{\xaa\x1fP\x13\xc8\xe6c\xc8\n\xf2\xdf4\xcc\x00!\
+\x13\xd1\n7\xda\xb0\xea\x08\xbb\xe5K\x17i\x1af\xc0\xc8\x81\xea\x18\x96\x01\
+\x14\x07\xd0\xdb\xf2%\xd6\nW{\xd0\x7f\xfa\xbe\xf3T1\x9b@U\x83\xde\x95\x90/ +\
+n\x9b\xd7\xf4Yse\x9a+\xf7\x86Z\x1b\xab\xd6\xc6\x92\x15/1!\x13\x84L\xa0i\x0e\
+\xc1\x90\x1f\x88\xb1\x07\xe1\xc3\x84\x93\x86v\x8f\xb0v\xf8\xed\xcb\xff.\xdd{\
+y\xc6\\\xf5~\xbd\xee"?\x10c\xed\xfc\xffk\xb0W\xd3\xfa\xd7)\xd90\x0f=\x00\x00\
+\x00\x00IEND\xaeB`\x82K\x92\x8b\x0f' )
+
+def getDblRightArrowBitmap():
+    return wxBitmapFromImage(getDblRightArrowImage())
+
+def getDblRightArrowImage():
+    stream = cStringIO.StringIO(getDblRightArrowData())
+    return wxImageFromStream(stream)
 

Index: PanGalactic/pangalactic/utils/xmlrpcinterface.py
diff -u PanGalactic/pangalactic/utils/xmlrpcinterface.py:1.23 PanGalactic/pangalactic/utils/xmlrpcinterface.py:1.24
--- PanGalactic/pangalactic/utils/xmlrpcinterface.py:1.23	Tue Oct 21 17:25:19 2003
+++ PanGalactic/pangalactic/utils/xmlrpcinterface.py	Thu Oct 23 15:06:20 2003
@@ -3,10 +3,10 @@
 """
 PanGalactic Client XMLRPC Interfaces
 
-@version: $Revision: 1.23 $
+@version: $Revision: 1.24 $
 """
 
-__version__ = "$Revision: 1.23 $"[11:-2]
+__version__ = "$Revision: 1.24 $"[11:-2]
 
 import xmlrpclib
 import types
@@ -91,9 +91,9 @@
         @param objs: objects to be hooked up.  Don't worry if you pass an irrelevent object.
         """
         # eventually call only this?  --vwk 23may2003
-        #print "xmlrpc.getObjects", classname
         data = self._RPC.getObjects(classname, refs, subtypes, fields)
         if data:
+            foo = self._factory.rememberAll(data, objs)
             return self._factory.rememberAll(data, objs)
 
 

From pbear at ned.gsfc.nasa.gov  Thu Oct 23 16:12:48 2003
From: pbear at ned.gsfc.nasa.gov (pbear CVS)
Date: Thu Oct 23 15:12:50 2003
Subject: [Pangalactic-commits] removed image_wdr directories again
Message-ID: <200310231912.h9NJCmcj000747@ned.gsfc.nasa.gov>

Modified files:
PanGalactic/pangalactic/client/aboutbox_wdr/About_0.png 1.1.1.1 None
PanGalactic/pangalactic/client/aboutbox_wdr/About_1.png 1.1.1.1 None
PanGalactic/pangalactic/client/customizegrid_wdr/ConfigBitmapsFunc_0.png 1.1 None
PanGalactic/pangalactic/client/customizegrid_wdr/ConfigBitmapsFunc_1.png 1.1 None
PanGalactic/pangalactic/client/customizegrid_wdr/ConfigBitmapsFunc_2.png 1.1 None
PanGalactic/pangalactic/client/customizegrid_wdr/ConfigBitmapsFunc_3.png 1.1 None
PanGalactic/pangalactic/client/customizegrid_wdr/ConfigBitmapsFunc_4.png 1.1 None
PanGalactic/pangalactic/client/customizegrid_wdr/ConfigBitmapsFunc_5.png 1.1 None
PanGalactic/pangalactic/client/workflow/__init__.py 1.1 None

Log message:
removed image_wdr directories again


From pbear at ned.gsfc.nasa.gov  Thu Oct 23 16:14:39 2003
From: pbear at ned.gsfc.nasa.gov (pbear CVS)
Date: Thu Oct 23 15:14:40 2003
Subject: [Pangalactic-commits] removed image_wdr directories again
Message-ID: <200310231914.h9NJEdpt000815@ned.gsfc.nasa.gov>

Modified files:
PanGalactic/pangalactic/utils/configdbbrowser_wdr/ConfigBitmapsFunc_0.png 1.1 None
PanGalactic/pangalactic/utils/configdbbrowser_wdr/ConfigBitmapsFunc_1.png 1.1 None
PanGalactic/pangalactic/utils/configdbbrowser_wdr/ConfigBitmapsFunc_2.png 1.1 None
PanGalactic/pangalactic/utils/configdbbrowser_wdr/ConfigBitmapsFunc_3.png 1.1 None
PanGalactic/pangalactic/utils/configdbbrowser_wdr/ConfigBitmapsFunc_4.png 1.1 None
PanGalactic/pangalactic/utils/configdbbrowser_wdr/ConfigBitmapsFunc_5.png 1.1 None
PanGalactic/pangalactic/utils/configgrid_wdr/ConfigBitmapsFunc_0.png 1.1 None
PanGalactic/pangalactic/utils/configgrid_wdr/ConfigBitmapsFunc_1.png 1.1 None
PanGalactic/pangalactic/utils/configgrid_wdr/ConfigBitmapsFunc_2.png 1.1 None
PanGalactic/pangalactic/utils/configgrid_wdr/ConfigBitmapsFunc_3.png 1.1 None
PanGalactic/pangalactic/utils/configgrid_wdr/ConfigBitmapsFunc_4.png 1.1 None
PanGalactic/pangalactic/utils/configgrid_wdr/ConfigBitmapsFunc_5.png 1.1 None

Log message:
removed image_wdr directories again


From pbear at ned.gsfc.nasa.gov  Thu Oct 23 16:16:24 2003
From: pbear at ned.gsfc.nasa.gov (pbear CVS)
Date: Thu Oct 23 15:16:25 2003
Subject: [Pangalactic-commits] added blue arrow images
Message-ID: <200310231916.h9NJGOct000864@ned.gsfc.nasa.gov>

Modified files:
PanGalactic/pangalactic/client/images/dbl_left_arrow.png None 1.1
PanGalactic/pangalactic/client/images/dbl_right_arrow.png None 1.1
PanGalactic/pangalactic/client/images/down_arrow.png None 1.1
PanGalactic/pangalactic/client/images/left_arrow.png None 1.1
PanGalactic/pangalactic/client/images/right_arrow.png None 1.1
PanGalactic/pangalactic/client/images/up_arrow.png None 1.1

Log message:
added blue arrow images


From pbear at ned.gsfc.nasa.gov  Thu Oct 23 16:21:47 2003
From: pbear at ned.gsfc.nasa.gov (pbear CVS)
Date: Thu Oct 23 15:21:49 2003
Subject: [Pangalactic-commits] remove image_wdr directories again
Message-ID: <200310231921.h9NJLlOB000957@ned.gsfc.nasa.gov>

Modified files:
PanGalactic/pangalactic/client/modules/psm/aboutbox_wdr/About_0.png 1.2 None
PanGalactic/pangalactic/client/modules/psm/aboutbox_wdr/About_1.png 1.2 None
PanGalactic/pangalactic/client/modules/psm/configgrid_wdr/ConfigBitmapsFunc_0.png 1.2 None
PanGalactic/pangalactic/client/modules/psm/configgrid_wdr/ConfigBitmapsFunc_1.png 1.2 None
PanGalactic/pangalactic/client/modules/psm/configgrid_wdr/ConfigBitmapsFunc_2.png 1.2 None
PanGalactic/pangalactic/client/modules/psm/configgrid_wdr/ConfigBitmapsFunc_3.png 1.2 None
PanGalactic/pangalactic/client/modules/psm/configgrid_wdr/ConfigBitmapsFunc_4.png 1.2 None
PanGalactic/pangalactic/client/modules/psm/configgrid_wdr/ConfigBitmapsFunc_5.png 1.2 None
PanGalactic/pangalactic/client/support/configdbbrowser_wdr/ConfigBitmapsFunc_0.png 1.1 None
PanGalactic/pangalactic/client/support/configdbbrowser_wdr/ConfigBitmapsFunc_1.png 1.1 None
PanGalactic/pangalactic/client/support/configdbbrowser_wdr/ConfigBitmapsFunc_2.png 1.1 None
PanGalactic/pangalactic/client/support/configdbbrowser_wdr/ConfigBitmapsFunc_3.png 1.1 None
PanGalactic/pangalactic/client/support/configdbbrowser_wdr/ConfigBitmapsFunc_4.png 1.1 None
PanGalactic/pangalactic/client/support/configdbbrowser_wdr/ConfigBitmapsFunc_5.png 1.1 None

Log message:
remove image_wdr directories again


From pbear at ned.gsfc.nasa.gov  Thu Oct 23 16:53:14 2003
From: pbear at ned.gsfc.nasa.gov (pbear CVS)
Date: Thu Oct 23 15:53:16 2003
Subject: [Pangalactic-commits] fixed initial settings
Message-ID: <200310231953.h9NJrEXA001309@ned.gsfc.nasa.gov>

Modified files:
PanGalactic/pangalactic/client/modules/psm/psmtool.py 1.119 1.120

Log message:
fixed initial settings


Index: PanGalactic/pangalactic/client/modules/psm/psmtool.py
diff -u PanGalactic/pangalactic/client/modules/psm/psmtool.py:1.119 PanGalactic/pangalactic/client/modules/psm/psmtool.py:1.120
--- PanGalactic/pangalactic/client/modules/psm/psmtool.py:1.119	Thu Oct 23 15:06:18 2003
+++ PanGalactic/pangalactic/client/modules/psm/psmtool.py	Thu Oct 23 15:53:13 2003
@@ -9,7 +9,7 @@
 This module is the main application code for the pgef client interface
 """
 
-__version__ = "$Revision: 1.119 $"[11:-2]
+__version__ = "$Revision: 1.120 $"[11:-2]
 
 import os
 import sys
@@ -245,7 +245,7 @@
         EVT_MENU(self, ID_TREE_RIGHTPOPUP_DUMPTOPDF, self.tree.DumpToPdf)
         EVT_MENU(self, ID_TREE_RIGHTPOPUP_QUICKCREATE, self.QuickCreate)
         
-        EVT_CHOICE(self, toolbarpanel.ID_PROJECT, self.OnProjectClick)
+        EVT_CHOICE(self, toolbarpanel.ID_PROJECT, self.OnSelectProject)
         EVT_CHOICE(self, toolbarpanel.ID_ITEM, self.OnItemClick)
         EVT_GRID_CELL_LEFT_DCLICK(self.itemgrid, self.onProductGridDClick)
         EVT_GRID_CELL_LEFT_DCLICK(self.product_master_grid, self.onProductGridDClick)
@@ -770,12 +770,12 @@
             self.product_master_grid.ClearGrid()
             self.State.currentuser = self.DataManager.user.id
 
-#            wgt = self.topWindow.toppanel.GetProjectWidget()
-#            ndx = wgt.GetSelection()
-#            project = wgt.GetStringSelection()
-#            print "psmtool.updateforlogin", project, ndx
-#            self.changeProject(ndx, project)
-            self.OnProjectClick()
+            #wgt = self.topWindow.toppanel.GetProjectWidget()
+            #ndx = wgt.GetSelection()
+            #project = wgt.GetStringSelection()
+            #print "psmtool.updateforlogin", project, ndx
+            #self.changeProject(ndx, project)
+            self.OnSelectProject()
 
 
     def OnItemExpanding(self, event):
@@ -1001,8 +1001,8 @@
         #print "end onitemclick"
 
 
-    def OnProjectClick(self, event = None):
-        print "\npsmtool.onprojectclick"
+    def OnSelectProject(self, event = None):
+        print "\npsmtool.onselectproject"
         wgt = self.topWindow.toppanel.GetProjectWidget()
         project = wgt.GetStringSelection()
         ndx = wgt.GetSelection()
@@ -1015,7 +1015,9 @@
                 project = wgt.GetStringSelection()
                 ndx = wgt.GetSelection()
 
-        self.changeProject(ndx, project)
+        if ndx > 0:
+            self.changeProject(ndx, project)
+
 
     def changeProject(self, ndx, project):
         print "\npsmtool.changeProject"
@@ -1321,7 +1323,7 @@
     def SetupForLogin(self):
         wgt = self.Parent.menuBar.FindMenuItem('Repository','Get Marked Items')
         self.Parent.menuBar.Enable(wgt, true)
-        
+       
     def ShowCheckedOutGrid(self):
         # print self.checkoutframe
         if not self.checkoutframe:

From waterbug at ned.gsfc.nasa.gov  Fri Oct 24 15:44:20 2003
From: waterbug at ned.gsfc.nasa.gov (waterbug CVS)
Date: Fri Oct 24 14:44:23 2003
Subject: [Pangalactic-commits] Mods for schema changes (revision attribute,
	etc.).
Message-ID: <200310241844.h9OIiKxs013293@ned.gsfc.nasa.gov>

Modified files:
PanGalactic/src/sql/createPgerDbTables.sql 1.65 1.66
PanGalactic/src/sql/insertACUs.sql 1.4 1.5
PanGalactic/src/sql/insertProductModelMasters.sql 1.3 1.4
PanGalactic/src/sql/insertProductModelVersions.sql 1.4 1.5
PanGalactic/src/sql/insertProductVersions.sql 1.3 1.4

Log message:
Mods for schema changes (revision attribute, etc.).


Index: PanGalactic/src/sql/insertACUs.sql
diff -u PanGalactic/src/sql/insertACUs.sql:1.4 PanGalactic/src/sql/insertACUs.sql:1.5
--- PanGalactic/src/sql/insertACUs.sql:1.4	Fri Aug 29 15:51:36 2003
+++ PanGalactic/src/sql/insertACUs.sql	Fri Oct 24 14:44:19 2003
@@ -1,6 +1,6 @@
 /* PGER Demo NAUO data.  */
 
-/* $Id: insertACUs.sql,v 1.4 2003/08/29 19:51:36 waterbug Exp $ */
+/* $Id: insertACUs.sql,v 1.5 2003/10/24 18:44:19 waterbug Exp $ */
 
 BEGIN;
 SET CONSTRAINTS ALL DEFERRED;
@@ -64,12 +64,12 @@
 'DriveMod1',                           -- ref_designator
 '1',                                 -- assembly_id
 'Default Model',                       -- assembly_of_pmm_id
-'42',                                  -- assembly_of_pv_id
+'1',                                   -- assembly_of_pv_id
 'HOG',                                 -- assembly_of_pm_id
 'TEST',                                -- assembly_of_pm_id_context
 '1',                                 -- component_id
 'Default Model',                       -- component_of_pmm_id
-'3B',                                  -- component_of_pv_id
+'1',                                   -- component_of_pv_id
 'IDrive',                              -- component_of_pm_id
 'TEST'                                 -- component_of_pm_id_context
 );
@@ -133,12 +133,12 @@
 'Brain1',                              -- ref_designator
 '1',                                 -- assembly_id
 'Default Model',                       -- assembly_of_pmm_id
-'42',                                  -- assembly_of_pv_id
+'1',                                   -- assembly_of_pv_id
 'HOG',                                 -- assembly_of_pm_id
 'TEST',                                -- assembly_of_pm_id_context
 '1',                                 -- component_id
 'Default Model',                       -- component_of_pmm_id
-'33',                                  -- component_of_pv_id
+'1',                                   -- component_of_pv_id
 'B57SMB',                              -- component_of_pm_id
 'TEST'                                 -- component_of_pm_id_context
 );
@@ -202,12 +202,12 @@
 'Flux1',                               -- ref_designator
 '1',                                 -- assembly_id
 'Default Model',                       -- assembly_of_pmm_id
-'42',                                  -- assembly_of_pv_id
+'1',                                   -- assembly_of_pv_id
 'HOG',                                 -- assembly_of_pm_id
 'TEST',                                -- assembly_of_pm_id_context
 '1',                                 -- component_id
 'Default Model',                       -- component_of_pmm_id
-'4',                                   -- component_of_pv_id
+'1',                                   -- component_of_pv_id
 'FX-CAP',                              -- component_of_pm_id
 'TEST'                                 -- component_of_pm_id_context
 );
@@ -271,12 +271,12 @@
 'Pwr1',                                -- ref_designator
 '1',                                 -- assembly_id
 'Default Model',                       -- assembly_of_pmm_id
-'42',                                  -- assembly_of_pv_id
+'1',                                   -- assembly_of_pv_id
 'HOG',                                 -- assembly_of_pm_id
 'TEST',                                -- assembly_of_pm_id_context
 '1',                                 -- component_id
 '3D MCAD Model',                       -- component_of_pmm_id
-'A10K',                                -- component_of_pv_id
+'1',                                   -- component_of_pv_id
 'MF Series A',                         -- component_of_pm_id
 'TEST'                                 -- component_of_pm_id_context
 );
@@ -340,12 +340,12 @@
 'OTh1',                                -- ref_designator
 '1',                                 -- assembly_id
 'Default Model',                       -- assembly_of_pmm_id
-'42',                                  -- assembly_of_pv_id
+'1',                                   -- assembly_of_pv_id
 'HOG',                                 -- assembly_of_pm_id
 'TEST',                                -- assembly_of_pm_id_context
 '1',                                 -- component_id
 'Default Model',                       -- component_of_pmm_id
-'A',                                   -- component_of_pv_id
+'1',                                   -- component_of_pv_id
 'OO-1',                                -- component_of_pm_id
 'TEST'                                 -- component_of_pm_id_context
 );
@@ -409,12 +409,12 @@
 'TwAssy1',                             -- ref_designator
 '1',                                 -- assembly_id
 'Default Model',                       -- assembly_of_pmm_id
-'A',                                   -- assembly_of_pv_id
+'1',                                   -- assembly_of_pv_id
 'OO-1',                                -- assembly_of_pm_id
 'TEST',                                -- assembly_of_pm_id_context
 '1',                                 -- component_id
 'Default Model',                       -- component_of_pmm_id
-'TWANG-W01',                           -- component_of_pv_id
+'1',                                   -- component_of_pv_id
 'BTA-20',                              -- component_of_pm_id
 'TEST'                                 -- component_of_pm_id_context
 );
@@ -478,12 +478,12 @@
 'Tw1',                                 -- ref_designator
 '1',                                 -- assembly_id
 'Default Model',                       -- assembly_of_pmm_id
-'TWANG-W01',                           -- assembly_of_pv_id
+'1',                                   -- assembly_of_pv_id
 'BTA-20',                              -- assembly_of_pm_id
 'TEST',                                -- assembly_of_pm_id_context
 '1',                                 -- component_id
 'Default Model',                       -- component_of_pmm_id
-'1',                                 -- component_of_pv_id
+'1',                                   -- component_of_pv_id
 'MMT-01',                              -- component_of_pm_id
 'TEST'                                 -- component_of_pm_id_context
 );
@@ -547,12 +547,12 @@
 'H1',                                  -- ref_designator
 '1',                                 -- assembly_id
 'Default Model',                       -- assembly_of_pmm_id
-'TWANG-W01',                           -- assembly_of_pv_id
+'1',                                   -- assembly_of_pv_id
 'BTA-20',                              -- assembly_of_pm_id
 'TEST',                                -- assembly_of_pm_id_context
 '1',                                 -- component_id
 'Default Model',                       -- component_of_pmm_id
-'1.2',                                 -- component_of_pv_id
+'1',                                   -- component_of_pv_id
 'HM.200',                              -- component_of_pm_id
 'TEST'                                 -- component_of_pm_id_context
 );

Index: PanGalactic/src/sql/createPgerDbTables.sql
diff -u PanGalactic/src/sql/createPgerDbTables.sql:1.65 PanGalactic/src/sql/createPgerDbTables.sql:1.66
--- PanGalactic/src/sql/createPgerDbTables.sql:1.65	Thu Oct 16 20:12:05 2003
+++ PanGalactic/src/sql/createPgerDbTables.sql	Fri Oct 24 14:44:18 2003
@@ -1,6 +1,6 @@
 /* Pan Galactic Engineering Repository Database (PGERDB) Table Creation Script */
 
-/* $Id: createPgerDbTables.sql,v 1.65 2003/10/17 00:12:05 waterbug Exp $
+/* $Id: createPgerDbTables.sql,v 1.66 2003/10/24 18:44:18 waterbug Exp $
  * 
  * *** TO DO ***
  *     -- TBR (Text-Based Requirements)
@@ -710,9 +710,9 @@
          * applicable -- if not applicable, the defaults are
          * used).  Defined as a foreign key referencing the
          * project table.  */
-    tag                      TEXT,
-        /* [CVS] A string identifier used to identify a
-         * baseline, release, or version.  */
+    revision                 TEXT,
+        /* [CVS] A string used to identify a baseline, release,
+         * or version.  */
     has_docs_flag            BOOLEAN DEFAULT FALSE,
         /* A computed attribute: TRUE if the ProductVersion
          * occurs in a ProductVersionDocrel; otherwise, FALSE.
@@ -912,9 +912,10 @@
          * applicable -- if not applicable, the defaults are
          * used).  Defined as a foreign key referencing the
          * project table.  */
-    tag                      TEXT,
-        /* [CVS] A string identifier used to identify a
-         * baseline, release, or version.  */
+    revision                 TEXT,
+        /* (Inherited from ProductVersion.)
+         * [CVS] A string used to identify a baseline, release,
+         * or version.  */
     has_docs_flag            BOOLEAN DEFAULT FALSE,
         /* (Inherited from ProductVersion.)
          * A computed attribute: TRUE if the ProductModelVersion
@@ -1183,19 +1184,15 @@
          *                           this may map to an element tag)
          * 'annotation' ............ (name is optional)
          * */
-    tag                      TEXT,
-        /* [CVS] A string identifier used to identify a
-         * baseline, release, or version.  */
+    revision                 TEXT,
+        /* [CVS] A string used to identify a baseline, release,
+         * or version.  */
     content                  TEXT DEFAULT '',
         /* The plain text content of the document.  For a
          * document with structural_role = 'annotation', this is
          * effectively the document, since it has no structure.
          * For other documents, this could be a derived
          * attribute, or could be NULL.  */
-    abstract                 TEXT DEFAULT '',
-        /* For a structured document that contains a component
-         * named 'abstract', this should be identical to the
-         * full_text of that component.  */
     PRIMARY KEY (id, of_dm_id, of_dm_id_context),
     CONSTRAINT dv_has_of_master
         FOREIGN KEY (of_dm_id, of_dm_id_context)
@@ -1244,12 +1241,20 @@
     of_dm_id                 TEXT,
     of_dm_id_context         TEXT,
         /* These point to the associated DocMaster.  */
-    manifestation            TEXT DEFAULT 'digital',
+    digital_flag             BOOLEAN NOT NULL DEFAULT TRUE,
         /* Maps to STEP product_definition_context.name (which
          * for a document is either 'digital document definition'
          * or 'physical document definition').  Specifies whether
-         * the document is digital or hardcopy.  Values are
-         * 'digital' and 'hardcopy'.  */
+         * the document is digital or hardcopy.  'TRUE' if the
+         * document is digital; 'FALSE' if it is a hardcopy.  */
+    purpose                  TEXT,
+        /* The purpose for this representation -- valid values will be
+         * determined by the application context.  Examples:
+         * 'slide presentation', 'print-ready report', 'web
+         * publishable document', 'interactive tutorial', etc.
+         * Note that the purpose does not specify the format --
+         * that information is specified by the MIME type of
+         * the associated DrFile(s). */
     PRIMARY KEY (id, of_dv_id, of_dm_id, of_dm_id_context),
     CONSTRAINT dr_has_of_version
         FOREIGN KEY (of_dv_id, of_dm_id, of_dm_id_context)
@@ -1457,7 +1462,7 @@
     ref_designator           TEXT DEFAULT '',
         /* If ref_designator is populated, quantity must be '1'.
          * */
-    change_flag              TEXT DEFAULT '',
+    change_flag              BOOLEAN NOT NULL DEFAULT FALSE,
         /* Indicates the item has changed (been added or
          * modified) since the previous version of the parts
          * list.  */

Index: PanGalactic/src/sql/insertProductModelMasters.sql
diff -u PanGalactic/src/sql/insertProductModelMasters.sql:1.3 PanGalactic/src/sql/insertProductModelMasters.sql:1.4
--- PanGalactic/src/sql/insertProductModelMasters.sql:1.3	Fri Aug 29 09:24:12 2003
+++ PanGalactic/src/sql/insertProductModelMasters.sql	Fri Oct 24 14:44:19 2003
@@ -1,6 +1,6 @@
 /* PGER Demo ProductModelMaster data inserts.  */
 
-/* $Id: insertProductModelMasters.sql,v 1.3 2003/08/29 13:24:12 waterbug Exp $ */
+/* $Id: insertProductModelMasters.sql,v 1.4 2003/10/24 18:44:19 waterbug Exp $ */
 
 BEGIN;
 SET CONSTRAINTS ALL DEFERRED;
@@ -135,7 +135,7 @@
 '0',                                     -- has_docs_flag
 '',                                      -- step_subtype
 'icon',                                  -- model_view
-'TWANG-W01',                             -- of_pv_id
+'1',                                     -- of_pv_id
 'BTA-20',                                -- of_pm_id
 'TEST',                                  -- of_pm_id_context
 'concept definition',                    -- frame_of_reference
@@ -204,7 +204,7 @@
 '0',                              -- has_docs_flag
 '',                               -- step_subtype
 'icon',                           -- model_view
-'1.2',                            -- of_pv_id
+'1',                              -- of_pv_id
 'HM.200',                         -- of_pm_id
 'TEST',                           -- of_pm_id_context
 'concept definition',             -- frame_of_reference
@@ -273,7 +273,7 @@
 '0',                          -- has_docs_flag
 '',                           -- step_subtype
 'icon',                       -- model_view
-'3B',                         -- of_pv_id
+'1',                          -- of_pv_id
 'IDrive',                     -- of_pm_id
 'TEST',                       -- of_pm_id_context
 'concept definition',         -- frame_of_reference
@@ -342,7 +342,7 @@
 '0',                                 -- has_docs_flag
 '',                                  -- step_subtype
 'icon',                              -- model_view
-'33',                                -- of_pv_id
+'1',                                 -- of_pv_id
 'B57SMB',                            -- of_pm_id
 'TEST',                              -- of_pm_id_context
 'concept definition',                -- frame_of_reference
@@ -411,7 +411,7 @@
 '0',                          -- has_docs_flag
 '',                           -- step_subtype
 'icon',                       -- model_view
-'4',                          -- of_pv_id
+'1',                          -- of_pv_id
 'FX-CAP',                     -- of_pm_id
 'TEST',                       -- of_pm_id_context
 'concept definition',         -- frame_of_reference
@@ -480,7 +480,7 @@
 '0',                        -- has_docs_flag
 '',                         -- step_subtype
 'icon',                     -- model_view
-'42',                       -- of_pv_id
+'1',                        -- of_pv_id
 'HOG',                      -- of_pm_id
 'TEST',                     -- of_pm_id_context
 'concept definition',       -- frame_of_reference
@@ -549,7 +549,7 @@
 '0',                    -- has_docs_flag
 '',                     -- step_subtype
 'icon',                 -- model_view
-'A10K',                 -- of_pv_id
+'1',                    -- of_pv_id
 'MF Series A',          -- of_pm_id
 'TEST',                 -- of_pm_id_context
 'concept definition',   -- frame_of_reference
@@ -618,7 +618,7 @@
 '0',                         -- has_docs_flag
 '',                          -- step_subtype
 'icon',                      -- model_view
-'A',                         -- of_pv_id
+'1',                         -- of_pv_id
 'OO-1',                      -- of_pm_id
 'TEST',                      -- of_pm_id_context
 'concept definition',        -- frame_of_reference
@@ -687,7 +687,7 @@
 '0',                            -- has_docs_flag
 '',                             -- step_subtype
 'icon',                         -- model_view
-'57',                           -- of_pv_id
+'1',                            -- of_pv_id
 'OO-Def-1',                     -- of_pm_id
 'TEST',                         -- of_pm_id_context
 'concept definition',           -- frame_of_reference

Index: PanGalactic/src/sql/insertProductModelVersions.sql
diff -u PanGalactic/src/sql/insertProductModelVersions.sql:1.4 PanGalactic/src/sql/insertProductModelVersions.sql:1.5
--- PanGalactic/src/sql/insertProductModelVersions.sql:1.4	Fri Aug 29 09:24:12 2003
+++ PanGalactic/src/sql/insertProductModelVersions.sql	Fri Oct 24 14:44:19 2003
@@ -1,6 +1,6 @@
 /* PGER Demo ProductModelVersion data.  */
 
-/* $Id: insertProductModelVersions.sql,v 1.4 2003/08/29 13:24:12 waterbug Exp $ */
+/* $Id: insertProductModelVersions.sql,v 1.5 2003/10/24 18:44:19 waterbug Exp $ */
 
 BEGIN;
 SET CONSTRAINTS ALL DEFERRED;
@@ -31,6 +31,7 @@
 of_pm_id_context,
 project_id,
 project_id_context,
+revision,
 has_docs_flag,
 of_pmm_id,
 of_pv_id,
@@ -63,9 +64,10 @@
 'TEST',                                -- of_pm_id_context
 'H2G2',                                -- project_id
 'TEST',                                -- project_id_context
+'A',                                   -- revision
 '0',                                   -- has_docs_flag
 'Default Model',                       -- of_pmm_id
-'1',                                -- of_pv_id
+'1',                                   -- of_pv_id
 '0',                                   -- has_parts_flag
 '0'                                    -- has_parts_lists_flag
 );
@@ -96,6 +98,7 @@
 of_pm_id_context,
 project_id,
 project_id_context,
+revision,
 has_docs_flag,
 of_pmm_id,
 of_pv_id,
@@ -128,9 +131,10 @@
 'TEST',                             -- of_pm_id_context
 'H2G2',                             -- project_id
 'TEST',                             -- project_id_context
+'A',                                -- revision
 '0',                                -- has_docs_flag
 'Default Model',                    -- of_pmm_id
-'TWANG-W01',                        -- of_pv_id
+'1',                                -- of_pv_id
 '1',                                -- has_parts_flag
 '0'                                 -- has_parts_lists_flag
 );
@@ -161,6 +165,7 @@
 of_pm_id_context,
 project_id,
 project_id_context,
+revision,
 has_docs_flag,
 of_pmm_id,
 of_pv_id,
@@ -193,9 +198,10 @@
 'TEST',                           -- of_pm_id_context
 'H2G2',                           -- project_id
 'TEST',                           -- project_id_context
+'A',                              -- revision
 '0',                              -- has_docs_flag
 'Default Model',                  -- of_pmm_id
-'1.2',                            -- of_pv_id
+'1',                              -- of_pv_id
 '0',                              -- has_parts_flag
 '0'                               -- has_parts_lists_flag
 );
@@ -226,6 +232,7 @@
 of_pm_id_context,
 project_id,
 project_id_context,
+revision,
 has_docs_flag,
 of_pmm_id,
 of_pv_id,
@@ -258,9 +265,10 @@
 'TEST',                       -- of_pm_id_context
 'H2G2',                       -- project_id
 'TEST',                       -- project_id_context
+'A',                          -- revision
 '0',                          -- has_docs_flag
 'Default Model',              -- of_pmm_id
-'3B',                         -- of_pv_id
+'1',                          -- of_pv_id
 '0',                          -- has_parts_flag
 '0'                           -- has_parts_lists_flag
 );
@@ -291,6 +299,7 @@
 of_pm_id_context,
 project_id,
 project_id_context,
+revision,
 has_docs_flag,
 of_pmm_id,
 of_pv_id,
@@ -323,9 +332,10 @@
 'TEST',                              -- of_pm_id_context
 'H2G2',                              -- project_id
 'TEST',                              -- project_id_context
+'A',                                 -- revision
 '0',                                 -- has_docs_flag
 'Default Model',                     -- of_pmm_id
-'33',                                -- of_pv_id
+'1',                                 -- of_pv_id
 '0',                                 -- has_parts_flag
 '0'                                  -- has_parts_lists_flag
 );
@@ -356,6 +366,7 @@
 of_pm_id_context,
 project_id,
 project_id_context,
+revision,
 has_docs_flag,
 of_pmm_id,
 of_pv_id,
@@ -388,9 +399,10 @@
 'TEST',                       -- of_pm_id_context
 'H2G2',                       -- project_id
 'TEST',                       -- project_id_context
+'A',                          -- revision
 '0',                          -- has_docs_flag
 'Default Model',              -- of_pmm_id
-'4',                          -- of_pv_id
+'1',                          -- of_pv_id
 '0',                          -- has_parts_flag
 '0'                           -- has_parts_lists_flag
 );
@@ -421,6 +433,7 @@
 of_pm_id_context,
 project_id,
 project_id_context,
+revision,
 has_docs_flag,
 of_pmm_id,
 of_pv_id,
@@ -453,9 +466,10 @@
 'TEST',                     -- of_pm_id_context
 'H2G2',                     -- project_id
 'TEST',                     -- project_id_context
+'A',                        -- revision
 '0',                        -- has_docs_flag
 'Default Model',            -- of_pmm_id
-'42',                       -- of_pv_id
+'1',                        -- of_pv_id
 '1',                        -- has_parts_flag
 '0'                         -- has_parts_lists_flag
 );
@@ -486,6 +500,7 @@
 of_pm_id_context,
 project_id,
 project_id_context,
+revision,
 has_docs_flag,
 of_pmm_id,
 of_pv_id,
@@ -518,9 +533,10 @@
 'TEST',                 -- of_pm_id_context
 'H2G2',                 -- project_id
 'TEST',                 -- project_id_context
+'A',                    -- revision
 '0',                    -- has_docs_flag
 '3D MCAD Model',        -- of_pmm_id
-'A10K',                 -- of_pv_id
+'1',                    -- of_pv_id
 '0',                    -- has_parts_flag
 '0'                     -- has_parts_lists_flag
 );
@@ -551,6 +567,7 @@
 of_pm_id_context,
 project_id,
 project_id_context,
+revision,
 has_docs_flag,
 of_pmm_id,
 of_pv_id,
@@ -583,9 +600,10 @@
 'TEST',                      -- of_pm_id_context
 'H2G2',                      -- project_id
 'TEST',                      -- project_id_context
+'A',                         -- revision
 '0',                         -- has_docs_flag
 'Default Model',             -- of_pmm_id
-'A',                         -- of_pv_id
+'1',                         -- of_pv_id
 '1',                         -- has_parts_flag
 '0'                          -- has_parts_lists_flag
 );
@@ -616,6 +634,7 @@
 of_pm_id_context,
 project_id,
 project_id_context,
+revision,
 has_docs_flag,
 of_pmm_id,
 of_pv_id,
@@ -648,9 +667,10 @@
 'TEST',                         -- of_pm_id_context
 'H2G2',                         -- project_id
 'TEST',                         -- project_id_context
+'A',                            -- revision
 '0',                            -- has_docs_flag
 'Default Model',                -- of_pmm_id
-'57',                           -- of_pv_id
+'1',                            -- of_pv_id
 '0',                            -- has_parts_flag
 '0'                             -- has_parts_lists_flag
 );

Index: PanGalactic/src/sql/insertProductVersions.sql
diff -u PanGalactic/src/sql/insertProductVersions.sql:1.3 PanGalactic/src/sql/insertProductVersions.sql:1.4
--- PanGalactic/src/sql/insertProductVersions.sql:1.3	Fri Aug 29 09:24:12 2003
+++ PanGalactic/src/sql/insertProductVersions.sql	Fri Oct 24 14:44:19 2003
@@ -1,6 +1,6 @@
 /* PGER Demo ProductVersion data insertion.  */
 
-/* $Id: insertProductVersions.sql,v 1.3 2003/08/29 13:24:12 waterbug Exp $ */
+/* $Id: insertProductVersions.sql,v 1.4 2003/10/24 18:44:19 waterbug Exp $ */
 
 BEGIN;
 SET CONSTRAINTS ALL DEFERRED;
@@ -31,15 +31,16 @@
 of_pm_id_context,
 project_id,
 project_id_context,
+revision,
 has_docs_flag
 )
 VALUES
 (
 'bigboote@yoyodyne.planet10.1036203962.11',
-'1',                            -- id
+'1',                              -- id
 '0',                              -- pgef_security_mask
 'Twanger, Magic, Megawatt',       -- short_description
-'Prototype Twanger Version v1.0',  -- long_description
+'Prototype Twanger Version v1.0', -- long_description
 'bigboote@yoyodyne.planet10',     -- pger_owner
 'PGER',                           -- pger_owner_context
 'bigboote@yoyodyne.planet10',     -- pger_creator
@@ -59,6 +60,7 @@
 'TEST',                           -- of_pm_id_context
 'H2G2',                           -- project_id
 'TEST',                           -- project_id_context
+'1.0',                            -- revision
 '0'                               -- has_docs_flag
 );
 
@@ -88,12 +90,13 @@
 of_pm_id_context,
 project_id,
 project_id_context,
+revision,
 has_docs_flag
 )
 VALUES
 (
 'bigboote@yoyodyne.planet10.1036203962.12',
-'TWANG-W01',                      -- id
+'1',                              -- id
 '0',                              -- pgef_security_mask
 'Preliminary Twanging Assembly',  -- short_description
 '',                               -- long_description
@@ -116,6 +119,7 @@
 'TEST',                           -- of_pm_id_context
 'H2G2',                           -- project_id
 'TEST',                           -- project_id_context
+'TWANG-W01',                      -- revision
 '0'                               -- has_docs_flag
 );
 
@@ -145,12 +149,13 @@
 of_pm_id_context,
 project_id,
 project_id_context,
+revision,
 has_docs_flag
 )
 VALUES
 (
 'bigboote@yoyodyne.planet10.1036203962.13',
-'1.2',                            -- id
+'1',                              -- id
 '0',                              -- pgef_security_mask
 'Mabob, Hoogie',                  -- short_description
 '',                               -- long_description
@@ -173,6 +178,7 @@
 'TEST',                           -- of_pm_id_context
 'H2G2',                           -- project_id
 'TEST',                           -- project_id_context
+'1.2',                            -- revision
 '0'                               -- has_docs_flag
 );
 
@@ -202,12 +208,13 @@
 of_pm_id_context,
 project_id,
 project_id_context,
+revision,
 has_docs_flag
 )
 VALUES
 (
 'bigboote@yoyodyne.planet10.1036203962.14',
-'3B',                           -- id
+'1',                            -- id
 '0',                            -- pgef_security_mask
 'Drive, Improbability',         -- short_description
 'Improbability Drive VROOM-3B', -- long_description
@@ -230,6 +237,7 @@
 'TEST',                         -- of_pm_id_context
 'H2G2',                         -- project_id
 'TEST',                         -- project_id_context
+'3B',                           -- revision
 '0'                             -- has_docs_flag
 );
 
@@ -259,12 +267,13 @@
 of_pm_id_context,
 project_id,
 project_id_context,
+revision,
 has_docs_flag
 )
 VALUES
 (
 'bigboote@yoyodyne.planet10.1036203962.15',
-'33',                                -- id
+'1',                                 -- id
 '0',                                 -- pgef_security_mask
 'Computer, Hyper-Quantum, Subfemto', -- short_description
 'Ridiculously Powerful Computer',    -- long_description
@@ -287,6 +296,7 @@
 'TEST',                              -- of_pm_id_context
 'H2G2',                              -- project_id
 'TEST',                              -- project_id_context
+'33',                                -- revision
 '0'                                  -- has_docs_flag
 );
 
@@ -316,12 +326,13 @@
 of_pm_id_context,
 project_id,
 project_id_context,
+revision,
 has_docs_flag
 )
 VALUES
 (
 'bigboote@yoyodyne.planet10.1036203962.16',
-'4',                          -- id
+'1',                          -- id
 '0',                          -- pgef_security_mask
 'Capacitor, Flux',            -- short_description
 'Flux Capacitor, version 4',  -- long_description
@@ -344,6 +355,7 @@
 'TEST',                       -- of_pm_id_context
 'H2G2',                       -- project_id
 'TEST',                       -- project_id_context
+'4',                          -- revision
 '0'                           -- has_docs_flag
 );
 
@@ -373,12 +385,13 @@
 of_pm_id_context,
 project_id,
 project_id_context,
+revision,
 has_docs_flag
 )
 VALUES
 (
 'banzai@banzai.earth.1036203962.17',
-'42',                       -- id
+'1',                        -- id
 '0',                        -- pgef_security_mask
 'Heart of Gold Spacecraft', -- short_description
 '',                         -- long_description
@@ -401,6 +414,7 @@
 'TEST',                     -- of_pm_id_context
 'H2G2',                     -- project_id
 'TEST',                     -- project_id_context
+'42',                       -- revision
 '0'                         -- has_docs_flag
 );
 
@@ -430,12 +444,13 @@
 of_pm_id_context,
 project_id,
 project_id_context,
+revision,
 has_docs_flag
 )
 VALUES
 (
 'banzai@banzai.earth.1036203962.18',
-'A10K',                        -- id
+'1',                           -- id
 '0',                           -- pgef_security_mask
 'power supply, fusion',        -- short_description
 'Mini-gen, omni-fuel, fusion', -- long_description
@@ -458,6 +473,7 @@
 'TEST',                        -- of_pm_id_context
 'H2G2',                        -- project_id
 'TEST',                        -- project_id_context
+'A10K',                        -- revision
 '0'                            -- has_docs_flag
 );
 
@@ -487,12 +503,13 @@
 of_pm_id_context,
 project_id,
 project_id_context,
+revision,
 has_docs_flag
 )
 VALUES
 (
 'banzai@banzai.earth.1036203962.19',
-'A',                            -- id
+'1',                            -- id
 '0',                            -- pgef_security_mask
 'Overthruster, Oscillation',    -- short_description
 'Oscillation Overthruster, Series 1, Version A', -- long_description
@@ -515,6 +532,7 @@
 'TEST',                         -- of_pm_id_context
 'H2G2',                         -- project_id
 'TEST',                         -- project_id_context
+'A',                            -- revision
 '0'                             -- has_docs_flag
 );
 
@@ -544,12 +562,13 @@
 of_pm_id_context,
 project_id,
 project_id_context,
+revision,
 has_docs_flag
 )
 VALUES
 (
 'lizardo@yoyodyne.planet10.1036203962.20',
-'57',                         -- id
+'1',                          -- id
 '0',                          -- pgef_security_mask
 'Overthruster, Oscillation',  -- short_description
 'Defective Oscillation Overthruster Version 57', -- long_description
@@ -572,6 +591,7 @@
 'TEST',                       -- of_pm_id_context
 'H2G2',                       -- project_id
 'TEST',                       -- project_id_context
+'57',                         -- revision
 '0'                           -- has_docs_flag
 );
 

From pbear at ned.gsfc.nasa.gov  Fri Oct 24 15:52:52 2003
From: pbear at ned.gsfc.nasa.gov (pbear CVS)
Date: Fri Oct 24 14:52:54 2003
Subject: [Pangalactic-commits] moved menu items; fixed test_wffactory;
	added revision tag; added nextxxxid for pv and pmv
Message-ID: <200310241852.h9OIqqwR013898@ned.gsfc.nasa.gov>

Modified files:
PanGalactic/pangalactic/client/fnord.py 1.65 1.66
PanGalactic/pangalactic/client/modules/psm/itemeditframe.py 1.108 1.109
PanGalactic/pangalactic/client/modules/psm/pgeftree.py 1.28 1.29
PanGalactic/pangalactic/client/modules/psm/pgefversiontree.py 1.6 1.7
PanGalactic/pangalactic/client/modules/psm/productdataform.py 1.30 1.31
PanGalactic/pangalactic/client/modules/psm/productdataform.wdr 1.3 1.4
PanGalactic/pangalactic/client/modules/psm/productdataform_wdr.py 1.4 1.5
PanGalactic/pangalactic/client/modules/psm/psmtool.py 1.120 1.121
PanGalactic/pangalactic/client/tests/test_wffactory.py 1.1 1.2
PanGalactic/pangalactic/enterprise/productmaster.py 1.18 1.19
PanGalactic/pangalactic/enterprise/productversion.py 1.23 1.24
PanGalactic/pangalactic/utils/datamanager.py 1.50 1.51

Log message:
moved menu items; fixed test_wffactory; added revision tag; added nextxxxid for pv and pmv


Index: PanGalactic/pangalactic/client/tests/test_wffactory.py
diff -u PanGalactic/pangalactic/client/tests/test_wffactory.py:1.1 PanGalactic/pangalactic/client/tests/test_wffactory.py:1.2
--- PanGalactic/pangalactic/client/tests/test_wffactory.py:1.1	Thu Oct 16 13:24:48 2003
+++ PanGalactic/pangalactic/client/tests/test_wffactory.py	Fri Oct 24 14:52:49 2003
@@ -26,7 +26,7 @@
         assert defaultp <> None and defaultp.__class__.__name__ == "WfProcess", "Unable to create default WfProcess"
         
         simplep = simpleWfProcess()
-        assert simplep <> None and simplep.__class__.__name__ == "WfProcess",, "Unable to create a WfProcess"
+        assert simplep <> None and simplep.__class__.__name__ == "WfProcess", "Unable to create a WfProcess"
 
         from_act = newWfActivity("from", simplep.pgef_oid)
         assert from_act <> None and from_act.__class__.__name__ == "WfActivity", "Unable to create a WfActivity"
@@ -38,10 +38,10 @@
         assert trans <> None and trans.__class__.__name__ == "WfTransition", "Unable to create a WfTransition"
 
         newp = newWfProcess()
-        assert newp <> None and newp.__class__.__name__ == "WfProcess",, "Unable to create a WfProcess"
+        assert newp <> None and newp.__class__.__name__ == "WfProcess", "Unable to create a WfProcess"
 
         copyp = copyWfProcess(defaultp)
-        assert copyp <> None and copyp.__class__.__name__ == "WfProcess",, "Unable to create a WfProcess"
+        assert copyp <> None and copyp.__class__.__name__ == "WfProcess", "Unable to create a WfProcess"
 
 
 def suite():

Index: PanGalactic/pangalactic/enterprise/productmaster.py
diff -u PanGalactic/pangalactic/enterprise/productmaster.py:1.18 PanGalactic/pangalactic/enterprise/productmaster.py:1.19
--- PanGalactic/pangalactic/enterprise/productmaster.py:1.18	Tue Oct  7 16:03:33 2003
+++ PanGalactic/pangalactic/enterprise/productmaster.py	Fri Oct 24 14:52:50 2003
@@ -1,10 +1,10 @@
-# $Id: productmaster.py,v 1.18 2003/10/07 20:03:33 waterbug Exp $
+# $Id: productmaster.py,v 1.19 2003/10/24 18:52:50 pbear Exp $
 
 """
 Version-independent product data.
 """
 
-__version__ = "$Revision: 1.18 $"[11:-2]
+__version__ = "$Revision: 1.19 $"[11:-2]
 
 from pangalactic.enterprise.pgefobject import PgefObject
 from pangalactic.enterprise.project import Project
@@ -38,10 +38,10 @@
                ]
     _pk = ['id', 'id_context']
     _schema_ext = {
-                       'project_id'         : 'str',
-                       'project_id_context' : 'str',
-                       'has_docs_flag'      : 'bool'
-                      }
+                   'project_id'         : 'str',
+                   'project_id_context' : 'str',
+                   'has_docs_flag'      : 'bool'
+                  }
     _schema = _schema_ext.copy()
     _schema.update(PgefObject._schema)
     # Attributes that point to application objects ... this info

Index: PanGalactic/pangalactic/client/fnord.py
diff -u PanGalactic/pangalactic/client/fnord.py:1.65 PanGalactic/pangalactic/client/fnord.py:1.66
--- PanGalactic/pangalactic/client/fnord.py:1.65	Thu Oct 23 15:06:16 2003
+++ PanGalactic/pangalactic/client/fnord.py	Fri Oct 24 14:52:48 2003
@@ -98,7 +98,8 @@
 ID_PREF_STARTUPTOOL = wxNewId()
 ID_PREF_DETACHEDWINDOWS = wxNewId()
 ID_PREF_PROXY = wxNewId()
-ID_PREF_SERVER = wxNewId()
+ID_PREF_SERVER1 = wxNewId()
+ID_PREF_SERVER2 = wxNewId()
 ID_PREF_CLEAR_LOCALDB = wxNewId() 
 ID_PREF_USERID = wxNewId()
 ID_PREF_TOOLTIPS = wxNewId()
@@ -249,7 +250,8 @@
 
             EVT_MENU(self, ID_PREF_STARTUPTOOL, self.OnOptionsStartup)
             EVT_MENU(self, ID_PREF_PROXY, self.OnProxySettings)
-            EVT_MENU(self, ID_PREF_SERVER, self.OnServerSettings)
+            EVT_MENU(self, ID_PREF_SERVER1, self.OnServerSettings)
+            EVT_MENU(self, ID_PREF_SERVER2, self.OnServerSettings)
             EVT_MENU(self, ID_PREF_CLEAR_LOCALDB, self.OnClearLocalDB)
             EVT_MENU(self, ID_PREF_USERID, self.OnSetUserId)
             EVT_MENU(self, ID_PREF_TOOLTIPS, self.OnEnableTooltips)
@@ -363,8 +365,8 @@
         menu.AppendMenu(ID_FILE_NEW, '&New', submenu)
 
         submenu = wxMenu()
-        submenu.Append(ID_FILE_EXPORT_PROPERTIES, "&Properties", "Export properties to a spreadsheet")
-        submenu.Append(ID_TOOL_GRIDTOPDF, "&Grid Data", "Export grid data to a PDF file")
+        submenu.Append(ID_FILE_EXPORT_PROPERTIES, "&Properties...", "Export properties to a spreadsheet")
+        submenu.Append(ID_TOOL_GRIDTOPDF, "&Table Data...", "Export grid data to a PDF file")
         menu.AppendMenu(ID_FILE_EXPORT, "&Export", submenu)
         menu.Enable(ID_FILE_EXPORT, false)
 
@@ -400,40 +402,41 @@
         menu.Append(ID_TOOL_CHECKOUT, "Get &Marked Items", "Get items for local mode")
         menu.Append(ID_TOOL_GETMYSTUFF, "&View My Stuff...", "View anything that's mine")
         menu.Enable(ID_TOOL_GETMYSTUFF, false)        
+        menu.Append(ID_PREF_SERVER1, '&Repository...', 'What repository do I use?')
         self.menuBar.Append(menu, "&Repository")
 
         # Cache menu
         menu = wxMenu()
         menu.Append(ID_TOOL_VIEW_CHECKEDOUT, "&View Marked Data...", "Show marked data checked out from repository")
-        menu.Append(ID_PREF_CLEAR_LOCALDB, '&Clear Local Cache', 'Clear locally stored data', false)
-        menu.AppendSeparator()
+        menu.Append(ID_PREF_CLEAR_LOCALDB, '&Clear Local Database', 'Clear locally stored data', false)
+#        menu.AppendSeparator()
         menu.Append(ID_TOOL_DBBROWSER, "Local Database &Browser...", "Browse the local database dictionaries")
         self.menuBar.Append(menu, "&Cache")
 
         # Options menu
-        menu = wxMenu()
-        # Options.Preferences submenu
+#        menu = wxMenu()
         submenu = wxMenu()
+#        # Options.Preferences submenu
+#        submenu = wxMenu()
         submenu.Append(ID_PREF_TOOLTIPS, 'Show &Tooltips', 'Turn on/off flyover help', true)
         submenu.Append(ID_PREF_SHOWLOGINCONFIRMED, 'Show Login Confirmation', 'Show/hide login confirmation', true)
         submenu.Append(ID_PREF_OUTPUTDIR, 'Set Output Directory...', 'Where do my reports go?')
-        menu.AppendMenu(ID_PREFS, '&Preferences', submenu)
+#        menu.AppendMenu(ID_PREFS, '&Preferences', submenu)
         # Options.Settings submenu
-        submenu = wxMenu()
+#        submenu = wxMenu()
         submenu.Append(ID_PREF_PROXY, '&Proxy...', 'Set your proxy (if any)')
-        submenu.Append(ID_PREF_SERVER, '&Repository...', 'What repository do I use?')
+        submenu.Append(ID_PREF_SERVER2, '&Repository...', 'What repository do I use?')
         submenu.Append(ID_PREF_USERID, '&Userid...', 'Set the locally stored userid', false)
-        menu.AppendMenu(ID_PREFS, '&Settings', submenu)
+#        menu.AppendMenu(ID_PREFS, '&Settings', submenu)
 
-        self.menuBar.Append(menu, "&Options")                
+#        self.menuBar.Append(menu, "&Options")                
+        self.menuBar.Append(submenu, "&Options")                
                         
         menu = wxMenu()
         menu.Append(ID_HELP_ABOUT, "&About", "More information about this program")
-
-        menu.AppendSeparator()
-
+#        menu.AppendSeparator()
         #menu.Append(ID_HELP_TESTING, "Development Use - db browser", "You REALLY don't want to select this")
-        menu.Append(ID_HELP_TESTING1, "html help viewer", "You REALLY don't want to select this")
+        menu.Append(ID_HELP_TESTING1, "Development Use - html help viewer", "You REALLY don't want to select this")
         self.menuBar.Append(menu, "&Help")                
         
         self.SetMenuBar(self.menuBar)
@@ -739,7 +742,8 @@
         self.menuBar.Enable(ID_FILE_LOGOUT, self.DataManager.user._loggedin)
         self.menuBar.Enable(ID_FILE_COMMIT,self.DataManager.user._loggedin) 
         self.menuBar.Enable(ID_PREF_PROXY, not self.DataManager.user._loggedin)
-        self.menuBar.Enable(ID_PREF_SERVER, not self.DataManager.user._loggedin)
+        self.menuBar.Enable(ID_PREF_SERVER1, not self.DataManager.user._loggedin)
+        self.menuBar.Enable(ID_PREF_SERVER2, not self.DataManager.user._loggedin)
         self.menuBar.Enable(ID_PREF_USERID, not self.DataManager.user._loggedin)
         self.menuBar.Enable(ID_PREF_CLEAR_LOCALDB, not self.DataManager.user._loggedin)
         self.menuBar.Enable(ID_TOOL_GETMYSTUFF, self.DataManager.user._loggedin)
@@ -796,7 +800,8 @@
                 self.RemoveSpecialMenu(self.DataManager.user)
                 loggedin = self.DataManager.user._loggedin
                 self.menuBar.Enable(ID_PREF_PROXY, not loggedin)
-                self.menuBar.Enable(ID_PREF_SERVER, not loggedin)
+                self.menuBar.Enable(ID_PREF_SERVER1, not loggedin)
+                self.menuBar.Enable(ID_PREF_SERVER2, not loggedin)
                 self.menuBar.Enable(ID_PREF_USERID, not loggedin)
                 self.menuBar.Enable(ID_FILE_LOGIN, not loggedin)
                 self.menuBar.Enable(ID_FILE_LOGOUT, loggedin)
@@ -909,6 +914,7 @@
 
             
 #----------------------------------------------------------------------------
+
 class MyApp(wxApp):
         
     def OnInit(self):

Index: PanGalactic/pangalactic/client/modules/psm/productdataform.py
diff -u PanGalactic/pangalactic/client/modules/psm/productdataform.py:1.30 PanGalactic/pangalactic/client/modules/psm/productdataform.py:1.31
--- PanGalactic/pangalactic/client/modules/psm/productdataform.py:1.30	Tue Oct 21 17:25:18 2003
+++ PanGalactic/pangalactic/client/modules/psm/productdataform.py	Fri Oct 24 14:52:49 2003
@@ -1,9 +1,12 @@
 from wxPython.wx import *
+
 import pangalactic.enterprise.productmodelversion
 
 from pangalactic.utils.mixin_security import Security_Mixin
 from pangalactic.utils.securitymanager import actions 
-from productdataform_wdr import *
+import pangalactic.utils.preferences as preferences
+
+from pangalactic.client.modules.psm.productdataform_wdr import *
 
 # WDR: classes
 
@@ -29,17 +32,23 @@
         self.EditingProductVersion = 0
         self.temp_pm = None
         self.temp_pv = None
+
+        self.NextPvId = None
         
-        PM_PV_Func(self, true)
+        PM_PV_Func(self, True)
         
         # WDR: handler declarations for PM_PV_Form
         EVT_RADIOBUTTON(self, ID_TOGGLE_PV, self.Select_PV)
         EVT_RADIOBUTTON(self, ID_TOGGLE_PM, self.Select_PM)
+
         
     # WDR: methods for PM_PV_Form
 
     def GetPvRevision(self):
-        return wxPyTypeCast(self.FindWindowById(ID_PV_REVISION), "wxTextCtrl")
+        return wxPyTypeCast(self.FindWindowById(ID_PV_REVISION), "wxStaticText")
+
+    def GetPvRevisionTag(self):
+        return wxPyTypeCast(self.FindWindowById(ID_PV_REVISION_TAG), "wxTextCtrl")
 
     def GetButtonMVClose(self):
         return wxPyTypeCast(self.FindWindowById(ID_BUTTON_M_V_CLOSE), "wxButton")
@@ -92,6 +101,17 @@
     def GetTogglePm(self):
         return wxPyTypeCast(self.FindWindowById(ID_TOGGLE_PM), "wxRadioButton")
     
+    def getNextPvId(self):
+        print "productdataform.getnextpvid"
+        temp = preferences.GetPreference('nextpvid')
+        if temp:
+            self.NextPvId = str(int(temp) + 1)
+        else:
+            self.NextPvId = "0"
+        preferences.prefs['nextpvid'] = self.NextPvId
+        print "nextpvid", self.NextPvId
+
+        
     def ClearCreateEditFlags(self):
         self.CreatingProductMaster = 0
         self.CreatingProductVersion = 0
@@ -105,15 +125,10 @@
         self.GetPmName().SetEditable(state)
         self.GetPmNomenclature().SetEditable(state)
         self.GetPmPoc().SetEditable(state)
-#        self.GetPmDesc().Enable(state)
-#        self.GetPmIdentifier().Enable(state)
-#        self.GetPmName().Enable(state)
-#        self.GetPmNomenclature().Enable(state)
-#        self.GetPmPoc().Enable(state)
         
     def EnablePV(self, state):
         self.GetPvDesc().SetEditable(state)
-        self.GetPvRevision().SetEditable(false)
+        self.GetPvRevisionTag().SetEditable(state)
         self.GetPvName().SetEditable(state)
         self.GetPvNomenclature() .SetEditable(state)
         self.GetPvPoc().SetEditable(state)
@@ -158,7 +173,7 @@
         if self.GetTogglePm().GetValue():
             self.GetPmIdentifier().SetFocus()
         elif self.GetTogglePv().GetValue():
-            self.GetPvName().SetFocus()
+            self.GetPvRevisionTag().SetFocus()
         
     def EditingMode(self):
         #print "productdataform.pmpv.editingmode"
@@ -245,9 +260,11 @@
             self.clearPV()
             self.CreatingProductMaster = 0
             self.CreatingProductVersion = 1
+            self.getNextPvId()
             self.EnablePV(1)
             self.GetPvPoc().SetValue(self.State.currentuser)
             self.GetPvPoc().SetEditable(0)
+            self.GetPvRevision().SetLabel(self.NextPvId)
         self.HighlightFirstWgt()
         #print "end creatingmode"
     
@@ -264,7 +281,8 @@
     def FillFormWithPVData(self, PV):
         if PV == None:
             return
-        self.GetPvRevision().SetValue(PV.id)
+        self.GetPvRevision().SetLabel(PV.id)
+        self.GetPvRevisionTag().SetValue(PV.revision)
         self.GetPvName().SetValue(PV.name)
         self.GetPvPoc().SetValue(PV.creator)
         self.GetPvNomenclature().SetValue(PV.short_description)
@@ -279,7 +297,8 @@
         PM.long_description = self.GetPmDesc().GetValue()
 
     def FillPVWithFormData(self, PV):
-        PV.id = self.GetPvRevision().GetValue()
+        PV.id = self.GetPvRevision().GetLabel()
+        PV.revision = self.GetPvRevisionTag().GetValue()
         PV.name = self.GetPvName().GetValue()
         PV.creator = self.GetPvPoc().GetValue()
         PV.short_description = self.GetPvNomenclature().GetValue()
@@ -290,6 +309,7 @@
         """
         Clears the entire form
         """
+        print "productdataform.clearpmpvform"
         self.clearPM()
         self.clearPV()
             
@@ -298,6 +318,7 @@
         """
         Clears the Product Master portion of the form
         """
+        print "productdataform.clearpm"
         self.GetPmIdentifier().SetValue('')
         self.GetPmName().SetValue('')
         self.GetPmPoc().SetValue('')
@@ -309,7 +330,9 @@
         """
         Clears the Product Version portion of the form
         """
-        self.GetPvRevision().SetValue('')
+        print "productdataform.clearpv"
+        self.GetPvRevision().SetLabel('')
+        self.GetPvRevisionTag().SetValue('')
         self.GetPvName().SetValue('')
         self.GetPvPoc().SetValue('')
         self.GetPvNomenclature().SetValue('')
@@ -317,17 +340,29 @@
         self.temp_pv = None
         
     def ResetForm(self, PM, PV):
+        print "productdataform.resetpmpvform"
         self.clearForm()
         self.FillFormWithPMData(PM)
         self.FillFormWithPVData(PV)
-        self.EnablePM(false)
-        self.EnablePV(false)
-    
+        self.EnablePM(False)
+        self.EnablePV(False)
+            
+    def revertNextPvId(self):
+        print "productdataform.revertnextpvid"
+        nextid = preferences.GetPreference('nextpvid')
+        nextid = int(nextid) - 1
+        preferences.prefs['nextpvid'] = nextid
+        preferences.CreatePreferencesFile(preferences.prefs)
+        self.NextPvId = None
+        print "nextid", nextid
+
     def SavePM(self, pmv):
         self.FillPMWithFormData(pmv._of_master)
+        self.NextPmvId = None
     
     def SavePV(self,pmv):
         self.FillPVWithFormData(pmv._of_version)
+        self.NextPvId = None
 
     def Save(self, pmv):
         self.SavePM(pmv)
@@ -385,8 +420,10 @@
         self.EditingProductModelVersion = 0
         self.temp_pmm = None
         self.temp_pmv = None
+
+        self.NextPmvId = None
         
-        PMM_PMV_Func(self, true)
+        PMM_PMV_Func(self, True)
         
         # WDR: handler declarations for PMM_PMV_Form
         EVT_RADIOBUTTON(self, ID_TOGGLE_PMV, self.Select_PMV)
@@ -425,7 +462,10 @@
         return wxPyTypeCast(self.FindWindowById(ID_PMV_NAME), "wxTextCtrl")
 
     def GetPmvRevision(self):
-        return wxPyTypeCast(self.FindWindowById(ID_PMV_REVISION), "wxTextCtrl")
+        return wxPyTypeCast(self.FindWindowById(ID_PMV_REVISION), "wxStaticText")
+
+    def GetPmvRevisionTag(self):
+        return wxPyTypeCast(self.FindWindowById(ID_PMV_REVISION_TAG), "wxTextCtrl")
 
     def GetTogglePmv(self):
         return wxPyTypeCast(self.FindWindowById(ID_TOGGLE_PMV), "wxRadioButton")
@@ -453,7 +493,17 @@
 
     def GetPartNumber(self):
         return wxPyTypeCast(self.FindWindowById(ID_PART_NUMBER), "wxStaticText")
-    
+
+    def getNextPmvId(self):
+        print "productdataform.getnextpmvid"
+        temp = preferences.GetPreference('nextpmvid')
+        if temp:
+            self.NextPmvId = str(int(temp) + 1)
+        else:
+            self.NextPmvId = "0"
+        preferences.prefs['nextpmvid'] = self.NextPmvId
+        print "nextid", self.NextPmvId
+
     def ClearCreateEditFlags(self):
         self.CreatingProductModelMaster = 0
         self.CreatingProductModelVersion = 0
@@ -466,18 +516,18 @@
         self.GetPmmName().SetEditable(state)
         self.GetPmmNomenclature() .SetEditable(state)
         self.GetPmmPoc().SetEditable(state)
-        #self.GetPartNumber().SetEditable(false)
-        #self.GetVersion().SetEditable(false)
+        #self.GetPartNumber().SetEditable(False)
+        #self.GetVersion().SetEditable(False)
         
         
     def EnablePMV(self, state):
         self.GetPmvDesc().SetEditable(state)
-        self.GetPmvRevision().SetEditable(false)
+        self.GetPmvRevisionTag().SetEditable(state)
         self.GetPmvName().SetEditable(state)
         self.GetPmvNomenclature() .SetEditable(state)
         self.GetPmvPoc().SetEditable(state)
-        #self.GetPartNumber().SetEditable(false)
-        #self.GetVersion().SetEditable(false)
+        #self.GetPartNumber().SetEditable(False)
+        #self.GetVersion().SetEditable(False)
         
         
     def BrowseMode(self, gotroot):
@@ -517,7 +567,7 @@
         if self.GetTogglePmm().GetValue():
             self.GetPmmIdentifier().SetFocus()
         elif self.GetTogglePmv().GetValue():
-            self.GetPmvName().SetFocus()
+            self.GetPmvRevisionTag().SetFocus()
         
     def EditingMode(self):
         #print "productdataform.pmmpmv.editingmode"
@@ -589,9 +639,11 @@
             self.clearPMV()
             self.CreatingProductModelMaster = 0
             self.CreatingProductModelVersion = 1
+            self.getNextPmvId()
             self.EnablePMV(1)
             self.GetPmvPoc().SetValue(self.State.currentuser)
             self.GetPmvPoc().SetEditable(0)
+            self.GetPmvRevision().SetLabel(self.NextPmvId)
             
         self.HighlightFirstWgt()
         #print "end creatingmode"
@@ -620,7 +672,8 @@
     def FillFormWithPMVData(self, PMV):
         if PMV == None:
             return
-        self.GetPmvRevision().SetValue(PMV.id)
+        self.GetPmvRevision().SetLabel(PMV.id)
+        self.GetPmvRevisionTag().SetValue(PMV.revision)
         self.GetPmvName().SetValue(PMV.name)
         self.GetPmvPoc().SetValue(PMV.creator)
         self.GetPmvNomenclature().SetValue(PMV.short_description)
@@ -636,7 +689,8 @@
         
 
     def FillPMVWithFormData(self, PMV):
-        PMV.id = self.GetPmvRevision().GetValue()
+        PMV.id = self.GetPmvRevision().GetLabel()
+        PMV.revision = self.GetPmvRevisionTag().GetValue()
         PMV.name = self.GetPmvName().GetValue()
         PMV.creator = self.GetPmvPoc().GetValue()
         PMV.short_description = self.GetPmvNomenclature().GetValue()
@@ -644,6 +698,7 @@
         
         
     def clearForm(self):
+        print "productdataform.clearpmmpmvform"
         """
         Clears the entire form
         """
@@ -654,7 +709,9 @@
         """
         Clears the Product Model Version portion of a form
         """
-        self.GetPmvRevision().SetValue('')
+        print "productdataform.clearpmv"
+        self.GetPmvRevision().SetLabel('')
+        self.GetPmvRevisionTag().SetValue('')
         self.GetPmvName().SetValue('')
         self.GetPmvPoc().SetValue('')
         self.GetPmvNomenclature().SetValue('')
@@ -665,6 +722,7 @@
         """
         Clears the Product Model Master portion of a form
         """
+        print "productdataform.clearpmm"
         self.GetPmmIdentifier().SetValue('')
         self.GetPmmName().SetValue('')
         self.GetPmmPoc().SetValue('')
@@ -674,12 +732,22 @@
 
         
     def ResetForm(self, PMM, PMV):
+        print "productdataform.resetpmmpmvform"
         self.clearForm()
         self.FillFormWithPMMData(PMM)
         self.FillFormWithPMVData(PMV)
-        self.EnablePMM(false)
-        self.EnablePMV(false)
+        self.EnablePMM(False)
+        self.EnablePMV(False)
     
+    def revertNextPmvId(self):
+        print "productdataform.revertnextpmvid"
+        nextid = preferences.GetPreference('nextpmvid')
+        nextid = int(nextid) - 1
+        preferences.prefs['nextpmvid'] = nextid
+        preferences.CreatePreferencesFile(preferences.prefs)
+        print "nextid", nextid
+        self.NextPmvId = None
+
     def SavePMM(self,pmv):
         self.FillPMMWithFormData(pmv._of_model_master)
     

Index: PanGalactic/pangalactic/client/modules/psm/itemeditframe.py
diff -u PanGalactic/pangalactic/client/modules/psm/itemeditframe.py:1.108 PanGalactic/pangalactic/client/modules/psm/itemeditframe.py:1.109
--- PanGalactic/pangalactic/client/modules/psm/itemeditframe.py:1.108	Thu Oct 23 15:06:18 2003
+++ PanGalactic/pangalactic/client/modules/psm/itemeditframe.py	Fri Oct 24 14:52:49 2003
@@ -1,6 +1,6 @@
 # $Source: /repo/step_testbed/PanGalactic/pangalactic/client/modules/psm/itemeditframe.py,v $
 
-__version__ = "$Revision: 1.108 $"[11:-2]
+__version__ = "$Revision: 1.109 $"[11:-2]
 
 # Python imports
 import copy
@@ -118,13 +118,18 @@
         self.PartDataPage = 4
         self.OtherDocPage = 5
         
-        self.tabnames = {self.PM_PVPage: 'Product',
-        self.PMM_PMVPage: 'Model',
-        self.PropertiesPage: 'Product Properties',
-        self.PartsListPage: 'Parts Lists',
-        self.PartDataPage: 'PartsListData',
-        self.OtherDocPage: 'Documents'}
-    
+        self.tabnames = {self.PM_PVPage:      'Product',
+                         self.PMM_PMVPage:    'Model',
+                         self.PropertiesPage: 'Product Properties',
+                         self.PartsListPage:  'Parts Lists',
+                         self.PartDataPage:   'PartsListData',
+                         self.OtherDocPage:   'Documents'}
+
+        self.DataManager.creatingPMM_PMV = False
+        self.DataManager.creatingPM_PV = False
+        self.DataManager.creatingDocument = False
+        self.DataManager.creatingPartsList = False
+      
         self.vsplitter.SetMinimumPaneSize(20)
         self.vsplitter.SplitVertically(self.itemtree, self.editnb, 175)
 
@@ -500,7 +505,7 @@
         #print 'currentpage in pagechanging is: ' , self.currentpage
         pass
         #if self.currentpage == self.PMM_PMVPage:
-            #self.DataManager.creatingItem = self.UnsavedDataPageChanging("Discard unsaved Product changes?",
+            #self.DataManager.creatingitem = self.UnsavedDataPageChanging("Discard unsaved Product changes?",
             #                                                             self.DataManager.creatingItem, self.currentpage)
 
         #elif self.currentpage == self.PM_PVPage:
@@ -521,7 +526,11 @@
         self.currentpage = self.editnb.GetSelection()
         #print 'page changed.currentpage:', self.currentpage
         
-        if self.DataManager.creatingItem or self.DataManager.creatingPartsList or self.DataManager.creatingDocument:
+        #if self.DataManager.creatingItem or
+        if self.DataManager.creatingPMM_PMV or \
+           self.DataManager.creatingPM_PV or \
+           self.DataManager.creatingPartsList or \
+           self.DataManager.creatingDocument:
             #print "creating/editing something"
             if self.editingtab == self.currentpage:
                 self.EditingMode(self.currentpage)
@@ -632,7 +641,9 @@
             self.otherdocform.BrowseMode(True)
             self.DataManager.creatingDocument = False
             self.DataManager.creatingPartsList = False
-            self.DataManager.creatingItem = True
+            #self.DataManager.creatingItem = False
+            self.DataManager.creatingPM_PV = False
+            self.DataManager.creatingPMM_PMV = True
 
         elif whichpane == self.PM_PVPage:
             self.pm_pv_form.EditingMode()
@@ -641,7 +652,9 @@
             self.otherdocform.BrowseMode(True)
             self.DataManager.creatingDocument = False
             self.DataManager.creatingPartsList = False
-            self.DataManager.creatingItem = True
+            #self.DataManager.creatingItem = False
+            self.DataManager.creatingPM_PV = True
+            self.DataManager.creatingPMM_PMV = False
 
         elif whichpane == self.PartsListPage:
             self.pm_pv_form.BrowseMode(True)
@@ -650,7 +663,9 @@
             self.otherdocform.BrowseMode(True)
             self.DataManager.creatingDocument = False
             self.DataManager.creatingPartsList = True
-            self.DataManager.creatingItem = False
+            #self.DataManager.creatingItem = False
+            self.DataManager.creatingPM_PV = False
+            self.DataManager.creatingPMM_PMV = False
 
         elif whichpane == self.OtherDocPage:
             self.pm_pv_form.BrowseMode(True)
@@ -659,7 +674,9 @@
             self.otherdocform.EditingMode()
             self.DataManager.creatingDocument = True
             self.DataManager.creatingPartsList = False
-            self.DataManager.creatingItem = False
+            #self.DataManager.creatingItem = False
+            self.DataManager.creatingPM_PV = False
+            self.DataManager.creatingPMM_PMV = False
         
 
     def CreatingMode(self, whichpane):
@@ -677,7 +694,9 @@
             self.partslistform.BrowseMode(True)
             self.otherdocform.BrowseMode(True)
             self.pmm_pmv_form.CreatingMode()
-            self.DataManager.creatingItem = True
+            #self.DataManager.creatingItem = True
+            self.DataManager.creatingPMM_PMV = True
+            self.DataManager.creatingPM_PV = False
             self.DataManager.creatingPartsList = False
             self.DataManager.creatingDocument = False
 
@@ -686,7 +705,9 @@
             self.partslistform.BrowseMode(True)
             self.otherdocform.BrowseMode(True)
             self.pm_pv_form.CreatingMode()
-            self.DataManager.creatingItem = True
+            #self.DataManager.creatingItem = True
+            self.DataManager.creatingPM_PV = True
+            self.DataManager.creatingPMM_PMV = False
             self.DataManager.creatingPartsList = False
             self.DataManager.creatingDocument = False
 
@@ -695,7 +716,9 @@
             self.pmm_pmv_form.BrowseMode(True)
             self.otherdocform.BrowseMode(True)
             self.partslistform.CreatingMode()
-            self.DataManager.creatingItem = False
+            #self.DataManager.creatingItem = False
+            self.DataManager.creatingPMM_PMV = False
+            self.DataManager.creatingPM_PV = False
             self.DataManager.creatingPartsList = True
             self.DataManager.creatingDocument = False
 
@@ -704,7 +727,9 @@
             self.pm_pv_form.BrowseMode(True)
             self.pmm_pmv_form.BrowseMode(True)
             self.otherdocform.CreatingMode()
-            self.DataManager.creatingItem = False
+            #self.DataManager.creatingItem = False
+            self.DataManager.creatingPMM_PMV = False
+            self.DataManager.creatingPM_PV = False
             self.DataManager.creatingPartsList = False
             self.DataManager.creatingDocument = True
             
@@ -972,22 +997,29 @@
     
 
     def OnResetProduct(self, event):
-        #print "itemeditframe.onresetproduct"
-        self.DataManager.creatingItem = False
+        print "itemeditframe.onresetproduct"
+        #self.DataManager.creatingItem = False
         self.EditItem = False
         if self.itemtree:
-            #print "have tree"
+            print "have tree"
             node = self.itemtree.GetSelection()
             if node.IsOk():
                 if node == self.itemtree.GetRootItem():
-                    #print "have root"
+                    print "have root"
                     self.BrowseMode(True)
                         
                     obj = self.itemtree.GetPyData(node)
                     if obj[0] == 'New':
+                        print "file->new->productxxx ???"
                         self.itemtree.DeleteAllItems()
-                        self.pmm_pmv_form.clearForm()
-                        self.pm_pv_form.clearForm()
+                        if self.DataManager.creatingPMM_PMV:
+                            self.pmm_pmv_form.clearForm()
+                            self.pmm_pmv_form.revertNextPmvId()
+                            self.DataManager.creatingPMM_PMV = False
+                        if self.DataManager.creatingPM_PV:
+                            self.pm_pv_form.clearForm()
+                            self.pm_pv_form.revertNextPvId()
+                            self.DataManager.creatingPM_PV = False
                         return
                     
                     temp_obj = self.DataManager.localDB.GetItem(obj[1])
@@ -998,17 +1030,13 @@
                         self.pm_pv_form.ResetForm(temp_obj, None)
                     elif classname == "ProductVersion":
                         self.pm_pv_form.ResetForm(temp_obj._of_master, temp_obj)
+                        self.pm_pv_form.revertNextPvId()
                     elif classname == "ProductModelVersion":
                         self.pmm_pmv_form.ResetForm(temp_obj._of_model_master, temp_obj)
+                        self.pmm_pmv_form.revertNextPmvId()
                     elif classname == "ProductModelMaster":
                         self.pmm_pmv_form.ResetForm(temp_obj, None)
                         
-#                    if self.currentpage == self.PMM_PMVPage:
-#                        self.pmm_pmv_form.ResetForm(temp_obj._of_master, temp_obj)
-#
-#                    elif self.currentpage == self.PM_PVPage:
-#                        self.pm_pv_form.ResetForm(temp_obj._of_master, temp_obj)
-
                 else:
                     print "\n\nATTENTION: itemeditframe.resetproduct"
                     print "               have node; is this section of code ever called???"
@@ -1025,8 +1053,10 @@
                             self.pm_pv_form.ResetForm(temp_obj, None)
                         elif classname == "ProductVersion":
                             self.pm_pv_form.ResetForm(temp_obj._of_master, temp_obj)
+                            self.pm_pv_form.revertNextPvId()
                         elif classname == "ProductModelVersion":
                             self.pmm_pmv_form.ResetForm(temp_obj._of_model_master, temp_obj._of_version)
+                            self.pmm_pmv_form.revertNextPmvId()
                         elif classname == "ProductModelMaster":
                             self.pmm_pmv_form.ResetForm(temp_obj, temp_obj._of_version)
                     else:
@@ -1036,22 +1066,37 @@
                         elif self.currentpage == self.PM_PVPage:
                             self.pm_pv_form.clearForm()
             else:
-                #print "onresetproduct.badnode"
+                print "onresetproduct.badnode"
+                if self.currentpage == self.PMM_PMVPage:
+                    self.pmm_pmv_form.clearForm()
+                elif self.currentpage == self.PM_PVPage:
+                    self.pm_pv_form.clearForm()
                 self.BrowseMode(True)
         else:
-            #print "onresetproduct.notree"
+            print "onresetproduct.notree"
+            if self.currentpage == self.PMM_PMVPage:
+                self.pmm_pmv_form.clearForm()
+            elif self.currentpage == self.PM_PVPage:
+                self.pm_pv_form.clearForm()
             self.BrowseMode(True)
+
+        if self.DataManager.creatingPMM_PMV:
+            self.DataManager.creatingPMM_PMV = False
+        if self.DataManager.creatingPM_PV:
+            self.DataManager.creatingPM_PV = False
         self.editingtab = None
 
         
     def OnEditProduct(self, event):
         #print "itemeditframe.oneditproduct", self.currentpage
-        self.DataManager.creatingItem = True
+        #self.DataManager.creatingItem = True
         self.editingtab = self.currentpage
         self.EditItem = True
         # print "edit itemid: " + self.currentproduct.pgpdm_oid
         # print "edit item: " + self.currentproduct.NameCode
         if self.currentpage == self.PM_PVPage:
+            self.DataManager.creatingPM_PV = True
+            self.DataManager.creatingPMM_PMV = False
             #print "edit pm/pv"
             if self.pm_pv_form.GetTogglePm().GetValue():
                 self.pm_pv_form.EditingProductMaster = 1
@@ -1061,6 +1106,8 @@
             self.pm_pv_form.EditingMode()            
 
         elif self.currentpage == self.PMM_PMVPage:
+            self.DataManager.creatingPMM_PMV = True
+            self.DataManager.creatingPM_PV = False
             #print "edit pmm/pmv"
             if self.pmm_pmv_form.GetTogglePmm().GetValue():
                 self.pmm_pmv_form.EditingProductModelMaster = 1
@@ -1096,7 +1143,9 @@
         elif self.currentpage == self.PMM_PMVPage:
             self.pmm_pmv_form.GetNewMmMv().SetFocus()
             
-        self.DataManager.creatingItem = False
+        self.DataManager.creatingPMM_PMV = False
+        self.DataManager.creatingPM_PV = False
+        #self.DataManager.creatingItem = False
         self.DataManager.refresh = True
         ## print "call rebuild from save item"
         self.Parent.GetPSMTool().RebuildMainTree()
@@ -1435,13 +1484,17 @@
         @type event: wxEvent
         @param event: wxEvent Object passed by event loop
         """
-        self.DataManager.creatingItem = True
+        #self.DataManager.creatingItem = True
         #print self.currentpage
         self.editingtab = self.currentpage
         if self.currentpage == self.PMM_PMVPage:
+            self.DataManager.creatingPMM_PMV = True
+            self.DataManager.creatingPM_PV = False
             #print 'on pmm page'
             self.pmm_pmv_form.CreatingMode()
         elif self.currentpage == self.PM_PVPage:
+            self.DataManager.creatingPM_PV = True
+            self.DataManager.creatingPMM_PMV = False
             #print 'on pm page'
             self.pm_pv_form.CreatingMode()
             
@@ -1597,7 +1650,9 @@
 
         self.Parent.GetPSMTool().RebuildMainTree()
         self.DataManager.creatingPartsList = False
-        self.DataManager.creatingItem = False
+        #self.DataManager.creatingItem = False
+        self.DataManager.creatingPMM_PMV = False
+        self.DataManager.creatingPM_PV = False
         self.rootpdrid = None
         self.rootitemid = None
         self.rootnauoid = None
@@ -1839,11 +1894,14 @@
 
             treedata = self.itemtree.GetPyData(treeitem)
             self.currentitemdata = treedata
-            if self.DataManager.creatingItem:
+            #if self.DataManager.creatingItem:
+            if self.DataManager.creatingPM_PV or self.DataManager.creatingPMM_PMV:
                 dlg = wxMessageDialog(self, "Discard unsaved Item changes?",
                                   "Unsaved Data", wxOK | wxCANCEL | wxICON_EXCLAMATION)
                 if dlg.ShowModal() == wxID_OK:
-                    self.DataManager.creatingItem = False
+                    #self.DataManager.creatingItem = False
+                    self.DataManager.creatingPMM_PMV = False
+                    self.DataManager.creatingPM_PV = False
                 else:
                     # print "cancel"
                     browse = False
@@ -1984,7 +2042,8 @@
         #print "itemeditframe.changesmade"
         retval = False
         if self.vsplitter.IsSplit():
-            if self.DataManager.creatingItem:
+            #if self.DataManager.creatingItem:
+            if self.DataManager.creatingPM_PV or self.DataManager.creatingPMM_PMV:
                 tmp = ProductModelVersion(id_context = self.DataManager.currentProject)
                 self.pm_pv_form.FillFormWithPMData(tmp._of_master)
                 self.pm_pv_form.FillFormWithPVData(tmp._of_version)
@@ -2016,7 +2075,11 @@
                     retval = True
             
         else:
-            if self.DataManager.creatingPartsList or self.DataManager.creatingItem or self.DataManager.creatingDocument:
+            #if self.DataManager.creatingItem or
+            if self.DataManager.creatingPMM_PMV or \
+               self.DataManager.creatingPM_PV or \
+               self.DataManager.creatingItem or \
+               self.DataManager.creatingDocument:
                 retval = True
             else:
                 self.pm_pv_form.clearForm()
@@ -2041,9 +2104,17 @@
             preferences.CreatePreferencesFile(preferences.prefs)
             self.otherdocform.NextDocId = str(int(self.otherdocform.NextDocId) - 1)
 
+        if self.DataManager.creatingPMM_PMV:
+            self.pmm_pmv_form.revertNextPmvId()
+
+        if self.DataManager.creatingPM_PV:
+            self.pm_pv_form.revertNextPvId()
+
         self.DataManager.creatingDocument = False
         self.DataManager.creatingPartsList = False
-        self.DataManager.creatingItem = False
+        #self.DataManager.creatingItem = False
+        self.DataManager.creatingPMM_PMV = False
+        self.DataManager.creatingPM_PV = False
 
 
     def SaveDocChanges(self):
@@ -2132,7 +2203,8 @@
 
 
     def SaveItemChanges(self):
-        if self.DataManager.creatingItem:
+        #if self.DataManager.creatingItem:
+        if self.DataManager.creatingPMM_PMV or self.DataManager.creatingPM_PV:
             newitem = ProductModelVersion(id_context = self.DataManager.currentProject)            
             self.pm_pv_form.Save(newitem)
             self.pmm_pmv_form.Save(newitem)
@@ -2149,7 +2221,9 @@
                 self.pmm_pmv_form.EditingMode()
                 return False
 
-            self.DataManager.creatingItem = False
+            #self.DataManager.creatingItem = False
+            self.DataManager.creatingPMM_PMV = False
+            self.DataManager.creatingPM_PV = False
             self.DataManager.localDB.Add([newitem])
             allprojlist = self.DataManager.localDB.GetProjectObjects()
             if allprojlist.has_key(self.State.currentproject):

Index: PanGalactic/pangalactic/client/modules/psm/pgeftree.py
diff -u PanGalactic/pangalactic/client/modules/psm/pgeftree.py:1.28 PanGalactic/pangalactic/client/modules/psm/pgeftree.py:1.29
--- PanGalactic/pangalactic/client/modules/psm/pgeftree.py:1.28	Wed Oct  8 11:30:46 2003
+++ PanGalactic/pangalactic/client/modules/psm/pgeftree.py	Fri Oct 24 14:52:49 2003
@@ -9,7 +9,7 @@
 import pangalactic.utils.objectstatus as objectstatus
 import cPickle, types
 
-__version__ = "$Revision: 1.28 $"[11:-2]
+__version__ = "$Revision: 1.29 $"[11:-2]
 
 
 class PgefTree(wxTreeCtrl):
@@ -258,7 +258,6 @@
                     self.SetItemHasChildren(treeid, true)
 
         self.SortChildren(roottreenode)
-
 
         #print "loadtreefromproject: calling expand"
         self.Expand(roottreenode)

Index: PanGalactic/pangalactic/client/modules/psm/pgefversiontree.py
diff -u PanGalactic/pangalactic/client/modules/psm/pgefversiontree.py:1.6 PanGalactic/pangalactic/client/modules/psm/pgefversiontree.py:1.7
--- PanGalactic/pangalactic/client/modules/psm/pgefversiontree.py:1.6	Thu Oct  9 13:00:19 2003
+++ PanGalactic/pangalactic/client/modules/psm/pgefversiontree.py	Fri Oct 24 14:52:49 2003
@@ -25,7 +25,6 @@
 
     def LoadTreefromProject(self, datamanager, rootitemid, rootpdrid, currentdata = None):
         """Loads the tree from the dicts in the DataManager"""
-
         #self.DeleteAllItems()
         #rootitem = datamanager.localDB.GetItem(rootitemid)
         #foo = rootitem.of_pm_id + "." + rootitem.of_pv_id
@@ -82,14 +81,19 @@
         pass
             
     def buildVersionString(self, obj):
+        #print "pgefversiontree.buildversionstring"
         if obj.__class__.__name__ == 'ProductModelVersion':
-            temp = obj.of_pmm_id + '.' + obj.of_pv_id +  '.' + obj.of_pm_id +  '.' + obj.of_pm_id_context
+            #temp = obj.of_pmm_id + '.' + obj.of_pv_id +  '.' + obj.of_pm_id +  '.' + obj.of_pm_id_context
+            temp = obj.of_pmm_id + '.' + obj.of_pv_id +  '.' + obj.of_pm_id
         elif obj.__class__.__name__ == 'ProductModelMaster':
-            temp = obj.of_pv_id + '.' + obj.of_pm_id + '.' + obj.of_pm_id_context
+            #temp = obj.of_pv_id + '.' + obj.of_pm_id + '.' + obj.of_pm_id_context
+            temp = obj.of_pv_id + '.' + obj.of_pm_id
         elif obj.__class__.__name__ == 'ProductVersion':
-            temp = obj.id + '.' + obj.of_pm_id + '.' + obj.of_pm_id_context
+            #temp = obj.id + '.' + obj.of_pm_id + '.' + obj.of_pm_id_context
+            temp = obj.id + '.' + obj.of_pm_id
         elif obj.__class__.__name__ == 'ProductMaster':
             temp = obj.id
+        #print "temp", temp
         return temp
 
     def LoadTreefromObjects(self, datamanager, rootproduct):
@@ -105,13 +109,14 @@
         temp_pmv = None
         temp_pv = None
 
+        classname = rootproduct.__class__.__name__
 
-        if rootproduct.__class__.__name__ == 'ProductMaster':
+        if classname == 'ProductMaster':
             temp_pm = rootproduct
         else:
             temp_pm = rootproduct._of_master
             
-        if rootproduct.__class__.__name__ == 'ProductVersion':
+        if classname == 'ProductVersion':
             temp_pv = rootproduct
         else:
             try:
@@ -119,8 +124,7 @@
             except AttributeError:
                 pass            
         
-
-        if rootproduct.__class__.__name__ == 'ProductModelMaster':
+        if classname == 'ProductModelMaster':
             temp_pmm = rootproduct
         else:
             try:
@@ -128,30 +132,30 @@
             except AttributeError:
                 pass
             
-        
-        if rootproduct.__class__.__name__ == 'ProductModelVersion':
+        if classname == 'ProductModelVersion':
             temp_pmv = rootproduct
-
-            
         
         rootnode = self.GetRootItem()
         
         if temp_pm:
-            spam = temp_pm.id + "." + temp_pm.id_context
+            #spam = temp_pm.id + "." + temp_pm.id_context
+            spam = temp_pm.id
             pm_treeid = self.AppendItem(rootnode, spam)
             self.Expand(pm_treeid)
             version_obj = temp_pm
             version_node = pm_treeid
 
         if temp_pv:
-            spam = temp_pm.id + "." + temp_pm.id_context + '.' + temp_pv.id
+            #spam = temp_pm.id + "." + temp_pm.id_context + '.' + temp_pv.id
+            spam = temp_pm.id + "." + temp_pv.id
             pv_treeid = self.AppendItem(pm_treeid, spam)
             self.Expand(pv_treeid)
             version_obj = temp_pv
             version_node = pv_treeid
             
         if temp_pmm:
-            spam = temp_pm.id + "." + temp_pm.id_context + '.' + temp_pv.id + '.' + temp_pmm.id
+            #spam = temp_pm.id + "." + temp_pm.id_context + '.' + temp_pv.id + '.' + temp_pmm.id
+            spam = temp_pm.id + "." + temp_pv.id + '.' + temp_pmm.id
             pmm_treeid = self.AppendItem(pv_treeid, spam)
             self.Expand(pmm_treeid)
             version_obj = temp_pmm
@@ -164,15 +168,12 @@
 
             for obj in objs:
                 if obj.state <> objectstatus.DELETE:
-                    
                     treelabel = self.createTreeLabel(obj)
                     treeid = self.AppendItem(version_node, treelabel)
                     self.SetPyData(treeid, ['version', obj.pgef_oid])
                     self.SetItemImage(treeid, self.itemicon)
                     self.SetItemImage(treeid, self.itemicon, wxTreeItemIcon_Selected)  
 
-        
-        
         self.Expand(rootnode)
         if temp_pm:
             self.Expand(pm_treeid)
@@ -183,13 +184,19 @@
         self.SelectItem(version_node)
             
     def createTreeLabel(self, obj):
-        if obj.__class__.__name__ == 'ProductModelVersion':
-            temp = '%s.%s.%s.%s.%s' % (obj.of_pm_id, obj.of_pm_id_context, obj.of_pv_id, obj.of_pmm_id, obj.id)
-        elif obj.__class__.__name__ == 'ProductModelMaster':
-            temp = '%s.%s.%s.%s' % (obj.of_pm_id, obj.of_pm_id_context, obj.of_pv_id, obj.id)
-        elif obj.__class__.__name__ == 'ProductVersion':
-            temp = '%s.%s.%s' % (obj.of_pm_id, obj.of_pm_id_context, obj.id)
-        elif obj.__class__.__name__ == 'ProductMaster':
+        #print "pgefversiontree.createtreelabel"
+        classname = obj.__class__.__name__
+        if classname == 'ProductModelVersion':
+            #temp = '%s.%s.%s.%s.%s' % (obj.of_pm_id, obj.of_pm_id_context, obj.of_pv_id, obj.of_pmm_id, obj.id)
+            temp = '%s.%s.%s.%s' % (obj.of_pm_id, obj.of_pv_id, obj.of_pmm_id, obj.id)
+        elif classname == 'ProductModelMaster':
+            #temp = '%s.%s.%s.%s' % (obj.of_pm_id, obj.of_pm_id_context, obj.of_pv_id, obj.id)
+            temp = '%s.%s.%s' % (obj.of_pm_id, obj.of_pv_id, obj.id)
+        elif classname == 'ProductVersion':
+            #temp = '%s.%s.%s' % (obj.of_pm_id, obj.of_pm_id_context, obj.id)
+            temp = '%s.%s' % (obj.of_pm_id, obj.id)
+        elif classname == 'ProductMaster':
             temp = '%s.%s' % (obj.id, obj.id_context)
+        #print "temp", temp
         return temp
  

Index: PanGalactic/pangalactic/client/modules/psm/productdataform_wdr.py
diff -u PanGalactic/pangalactic/client/modules/psm/productdataform_wdr.py:1.4 PanGalactic/pangalactic/client/modules/psm/productdataform_wdr.py:1.5
--- PanGalactic/pangalactic/client/modules/psm/productdataform_wdr.py:1.4	Tue Oct 21 17:25:18 2003
+++ PanGalactic/pangalactic/client/modules/psm/productdataform_wdr.py	Fri Oct 24 14:52:49 2003
@@ -22,6 +22,7 @@
 ID_PMM_DESC = wxNewId()
 ID_TOGGLE_PMV = wxNewId()
 ID_PMV_REVISION = wxNewId()
+ID_PMV_REVISION_TAG = wxNewId()
 ID_PMV_NAME = wxNewId()
 ID_PMV_POC = wxNewId()
 ID_PMV_NOMENCLATURE = wxNewId()
@@ -127,40 +128,47 @@
     
     item29 = wxFlexGridSizer( 0, 2, 1, 0 )
     item29.AddGrowableCol( 1 )
-    item29.AddGrowableRow( 4 )
+    item29.AddGrowableRow( 5 )
     
-    item30 = wxStaticText( parent, ID_TEXT, "Revision", wxDefaultPosition, wxDefaultSize, 0 )
-    item29.AddWindow( item30, 0, wxALIGN_RIGHT|wxALIGN_CENTER_VERTICAL|wxLEFT|wxRIGHT, 5 )
+    item30 = wxStaticText( parent, ID_TEXT, "Version Id", wxDefaultPosition, wxDefaultSize, 0 )
+    item29.AddWindow( item30, 0, wxALIGN_RIGHT|wxALIGN_CENTER_VERTICAL|wxLEFT|wxRIGHT|wxTOP, 5 )
 
-    item31 = wxTextCtrl( parent, ID_PMV_REVISION, "", wxDefaultPosition, wxSize(230,-1), 0 )
-    item29.AddWindow( item31, 0, wxGROW|wxALIGN_CENTER_VERTICAL|wxRIGHT, 5 )
+    item31 = wxStaticText( parent, ID_PMV_REVISION, "                      ", wxDefaultPosition, wxDefaultSize, 0 )
+    item31.SetForegroundColour( wxBLUE )
+    item29.AddWindow( item31, 0, wxGROW|wxALIGN_CENTER_VERTICAL|wxLEFT|wxRIGHT|wxTOP, 5 )
 
-    item32 = wxStaticText( parent, ID_TEXT, "Name", wxDefaultPosition, wxDefaultSize, 0 )
+    item32 = wxStaticText( parent, ID_TEXT, "Revision", wxDefaultPosition, wxDefaultSize, 0 )
     item29.AddWindow( item32, 0, wxALIGN_RIGHT|wxALIGN_CENTER_VERTICAL|wxLEFT|wxRIGHT, 5 )
 
-    item33 = wxTextCtrl( parent, ID_PMV_NAME, "", wxDefaultPosition, wxSize(230,-1), 0 )
-    item33.SetToolTip( wxToolTip("Name of the component") )
+    item33 = wxTextCtrl( parent, ID_PMV_REVISION_TAG, "", wxDefaultPosition, wxSize(80,-1), 0 )
     item29.AddWindow( item33, 0, wxGROW|wxALIGN_CENTER_VERTICAL|wxRIGHT, 5 )
 
-    item34 = wxStaticText( parent, ID_TEXT, "Point of Contact", wxDefaultPosition, wxDefaultSize, 0 )
+    item34 = wxStaticText( parent, ID_TEXT, "Name", wxDefaultPosition, wxDefaultSize, 0 )
     item29.AddWindow( item34, 0, wxALIGN_RIGHT|wxALIGN_CENTER_VERTICAL|wxLEFT|wxRIGHT, 5 )
 
-    item35 = wxTextCtrl( parent, ID_PMV_POC, "", wxDefaultPosition, wxSize(230,-1), 0 )
-    item35.SetToolTip( wxToolTip("Organization/Point of Contact for this component") )
+    item35 = wxTextCtrl( parent, ID_PMV_NAME, "", wxDefaultPosition, wxSize(230,-1), 0 )
+    item35.SetToolTip( wxToolTip("Name of the component") )
     item29.AddWindow( item35, 0, wxGROW|wxALIGN_CENTER_VERTICAL|wxRIGHT, 5 )
 
-    item36 = wxStaticText( parent, ID_TEXT, "Nomenclature", wxDefaultPosition, wxDefaultSize, 0 )
+    item36 = wxStaticText( parent, ID_TEXT, "Point of Contact", wxDefaultPosition, wxDefaultSize, 0 )
     item29.AddWindow( item36, 0, wxALIGN_RIGHT|wxALIGN_CENTER_VERTICAL|wxLEFT|wxRIGHT, 5 )
 
-    item37 = wxTextCtrl( parent, ID_PMV_NOMENCLATURE, "", wxDefaultPosition, wxSize(300,-1), 0 )
-    item37.SetToolTip( wxToolTip("Code for component name") )
+    item37 = wxTextCtrl( parent, ID_PMV_POC, "", wxDefaultPosition, wxSize(230,-1), 0 )
+    item37.SetToolTip( wxToolTip("Organization/Point of Contact for this component") )
     item29.AddWindow( item37, 0, wxGROW|wxALIGN_CENTER_VERTICAL|wxRIGHT, 5 )
 
-    item38 = wxStaticText( parent, ID_TEXT, "Description", wxDefaultPosition, wxDefaultSize, 0 )
-    item29.AddWindow( item38, 0, wxALIGN_RIGHT|wxLEFT|wxRIGHT, 5 )
+    item38 = wxStaticText( parent, ID_TEXT, "Nomenclature", wxDefaultPosition, wxDefaultSize, 0 )
+    item29.AddWindow( item38, 0, wxALIGN_RIGHT|wxALIGN_CENTER_VERTICAL|wxLEFT|wxRIGHT, 5 )
 
-    item39 = wxTextCtrl( parent, ID_PMV_DESC, "", wxDefaultPosition, wxSize(300,60), wxTE_MULTILINE|wxVSCROLL )
-    item29.AddWindow( item39, 0, wxGROW|wxALIGN_CENTER_VERTICAL|wxRIGHT|wxBOTTOM, 5 )
+    item39 = wxTextCtrl( parent, ID_PMV_NOMENCLATURE, "", wxDefaultPosition, wxSize(300,-1), 0 )
+    item39.SetToolTip( wxToolTip("Code for component name") )
+    item29.AddWindow( item39, 0, wxGROW|wxALIGN_CENTER_VERTICAL|wxRIGHT, 5 )
+
+    item40 = wxStaticText( parent, ID_TEXT, "Description", wxDefaultPosition, wxDefaultSize, 0 )
+    item29.AddWindow( item40, 0, wxALIGN_RIGHT|wxLEFT|wxRIGHT, 5 )
+
+    item41 = wxTextCtrl( parent, ID_PMV_DESC, "", wxDefaultPosition, wxSize(300,60), wxTE_MULTILINE|wxVSCROLL )
+    item29.AddWindow( item41, 0, wxGROW|wxALIGN_CENTER_VERTICAL|wxRIGHT|wxBOTTOM, 5 )
 
     item27.AddSizer( item29, 1, wxGROW|wxRIGHT, 5 )
 
@@ -172,41 +180,41 @@
 
     item0.AddSizer( item1, 1, wxGROW|wxALIGN_CENTER_VERTICAL|wxALL, 5 )
 
-    item40 = wxFlexGridSizer( 5, 0, 0, 0 )
+    item42 = wxFlexGridSizer( 5, 0, 0, 0 )
     
-    item41 = wxBoxSizer( wxHORIZONTAL )
+    item43 = wxBoxSizer( wxHORIZONTAL )
     
-    item42 = wxButton( parent, ID_NEW_MM_MV, "New", wxDefaultPosition, wxDefaultSize, 0 )
-    item42.SetToolTip( wxToolTip("Create a new component in the currently selected project") )
-    item41.AddWindow( item42, 0, wxALIGN_CENTER|wxLEFT, 5 )
+    item44 = wxButton( parent, ID_NEW_MM_MV, "New", wxDefaultPosition, wxDefaultSize, 0 )
+    item44.SetToolTip( wxToolTip("Create a new component in the currently selected project") )
+    item43.AddWindow( item44, 0, wxALIGN_CENTER|wxLEFT, 5 )
 
-    item43 = wxButton( parent, ID_EDIT_MM_MV, "Edit", wxDefaultPosition, wxDefaultSize, 0 )
-    item43.SetToolTip( wxToolTip("Edit the selected component") )
-    item41.AddWindow( item43, 0, wxALIGN_CENTER, 5 )
+    item45 = wxButton( parent, ID_EDIT_MM_MV, "Edit", wxDefaultPosition, wxDefaultSize, 0 )
+    item45.SetToolTip( wxToolTip("Edit the selected component") )
+    item43.AddWindow( item45, 0, wxALIGN_CENTER, 5 )
 
-    item44 = wxButton( parent, ID_SAVE_MM_MV, "Save", wxDefaultPosition, wxDefaultSize, 0 )
-    item44.SetToolTip( wxToolTip("Save the component to local storage") )
-    item41.AddWindow( item44, 0, wxALIGN_CENTER, 5 )
+    item46 = wxButton( parent, ID_SAVE_MM_MV, "Save", wxDefaultPosition, wxDefaultSize, 0 )
+    item46.SetToolTip( wxToolTip("Save the component to local storage") )
+    item43.AddWindow( item46, 0, wxALIGN_CENTER, 5 )
 
-    item45 = wxButton( parent, ID_RESET_MM_MV_FORM, "Cancel", wxDefaultPosition, wxDefaultSize, 0 )
-    item45.SetToolTip( wxToolTip("Reset (clear) the fields for an unsaved component") )
-    item41.AddWindow( item45, 0, wxALIGN_CENTER|wxRIGHT, 5 )
+    item47 = wxButton( parent, ID_RESET_MM_MV_FORM, "Cancel", wxDefaultPosition, wxDefaultSize, 0 )
+    item47.SetToolTip( wxToolTip("Reset (clear) the fields for an unsaved component") )
+    item43.AddWindow( item47, 0, wxALIGN_CENTER|wxRIGHT, 5 )
 
-    item46 = wxButton( parent, DELETE_MM_MV, "Delete", wxDefaultPosition, wxDefaultSize, 0 )
-    item46.SetToolTip( wxToolTip("Delete the association between the parent and child components") )
-    item41.AddWindow( item46, 0, wxALIGN_CENTER|wxLEFT|wxRIGHT, 5 )
+    item48 = wxButton( parent, DELETE_MM_MV, "Delete", wxDefaultPosition, wxDefaultSize, 0 )
+    item48.SetToolTip( wxToolTip("Delete the association between the parent and child components") )
+    item43.AddWindow( item48, 0, wxALIGN_CENTER|wxLEFT|wxRIGHT, 5 )
 
-    item40.AddSizer( item41, 0, wxALIGN_CENTER|wxALL, 5 )
+    item42.AddSizer( item43, 0, wxALIGN_CENTER|wxALL, 5 )
 
-    item47 = wxBoxSizer( wxHORIZONTAL )
+    item49 = wxBoxSizer( wxHORIZONTAL )
     
-    item48 = wxButton( parent, ID_MM_MV_CLOSE, "Close", wxDefaultPosition, wxDefaultSize, 0 )
-    item48.SetToolTip( wxToolTip("Close the window") )
-    item47.AddWindow( item48, 0, wxALIGN_CENTER|wxRIGHT, 5 )
+    item50 = wxButton( parent, ID_MM_MV_CLOSE, "Close", wxDefaultPosition, wxDefaultSize, 0 )
+    item50.SetToolTip( wxToolTip("Close the window") )
+    item49.AddWindow( item50, 0, wxALIGN_CENTER|wxRIGHT, 5 )
 
-    item40.AddSizer( item47, 0, wxALIGN_CENTER|wxALL, 5 )
+    item42.AddSizer( item49, 0, wxALIGN_CENTER|wxALL, 5 )
 
-    item0.AddSizer( item40, 0, wxALIGN_CENTER|wxLEFT|wxRIGHT|wxBOTTOM, 0 )
+    item0.AddSizer( item42, 0, wxALIGN_CENTER|wxLEFT|wxRIGHT|wxBOTTOM, 0 )
 
     if set_sizer == True:
         parent.SetAutoLayout( True )
@@ -225,6 +233,7 @@
 ID_PM_DESC = wxNewId()
 ID_TOGGLE_PV = wxNewId()
 ID_PV_REVISION = wxNewId()
+ID_PV_REVISION_TAG = wxNewId()
 ID_PV_NAME = wxNewId()
 ID_PV_POC = wxNewId()
 ID_PV_NOMENCLATURE = wxNewId()
@@ -304,40 +313,47 @@
     
     item22 = wxFlexGridSizer( 0, 2, 1, 0 )
     item22.AddGrowableCol( 1 )
-    item22.AddGrowableRow( 4 )
+    item22.AddGrowableRow( 5 )
     
-    item23 = wxStaticText( parent, ID_TEXT, "Revision", wxDefaultPosition, wxDefaultSize, 0 )
-    item22.AddWindow( item23, 0, wxALIGN_RIGHT|wxALIGN_CENTER_VERTICAL|wxLEFT|wxRIGHT, 5 )
+    item23 = wxStaticText( parent, ID_TEXT, "Version Id", wxDefaultPosition, wxDefaultSize, 0 )
+    item22.AddWindow( item23, 0, wxALIGN_RIGHT|wxALIGN_CENTER_VERTICAL|wxLEFT|wxRIGHT|wxTOP, 5 )
 
-    item24 = wxTextCtrl( parent, ID_PV_REVISION, "", wxDefaultPosition, wxSize(230,-1), 0 )
-    item22.AddWindow( item24, 0, wxGROW|wxALIGN_CENTER_VERTICAL|wxRIGHT, 5 )
+    item24 = wxStaticText( parent, ID_PV_REVISION, "                                   ", wxDefaultPosition, wxDefaultSize, 0 )
+    item24.SetForegroundColour( wxBLUE )
+    item22.AddWindow( item24, 0, wxGROW|wxALIGN_CENTER_VERTICAL|wxRIGHT|wxTOP, 5 )
 
-    item25 = wxStaticText( parent, ID_TEXT, "Name", wxDefaultPosition, wxDefaultSize, 0 )
+    item25 = wxStaticText( parent, ID_TEXT, "Revision", wxDefaultPosition, wxDefaultSize, 0 )
     item22.AddWindow( item25, 0, wxALIGN_RIGHT|wxALIGN_CENTER_VERTICAL|wxLEFT|wxRIGHT, 5 )
 
-    item26 = wxTextCtrl( parent, ID_PV_NAME, "", wxDefaultPosition, wxSize(230,-1), 0 )
-    item26.SetToolTip( wxToolTip("Name of the component") )
+    item26 = wxTextCtrl( parent, ID_PV_REVISION_TAG, "", wxDefaultPosition, wxSize(200,-1), 0 )
     item22.AddWindow( item26, 0, wxGROW|wxALIGN_CENTER_VERTICAL|wxRIGHT, 5 )
 
-    item27 = wxStaticText( parent, ID_TEXT, "Point of Contact", wxDefaultPosition, wxDefaultSize, 0 )
+    item27 = wxStaticText( parent, ID_TEXT, "Name", wxDefaultPosition, wxDefaultSize, 0 )
     item22.AddWindow( item27, 0, wxALIGN_RIGHT|wxALIGN_CENTER_VERTICAL|wxLEFT|wxRIGHT, 5 )
 
-    item28 = wxTextCtrl( parent, ID_PV_POC, "", wxDefaultPosition, wxSize(230,-1), 0 )
-    item28.SetToolTip( wxToolTip("Organization/Point of Contact for this component") )
+    item28 = wxTextCtrl( parent, ID_PV_NAME, "", wxDefaultPosition, wxSize(230,-1), 0 )
+    item28.SetToolTip( wxToolTip("Name of the component") )
     item22.AddWindow( item28, 0, wxGROW|wxALIGN_CENTER_VERTICAL|wxRIGHT, 5 )
 
-    item29 = wxStaticText( parent, ID_TEXT, "Nomenclature", wxDefaultPosition, wxDefaultSize, 0 )
+    item29 = wxStaticText( parent, ID_TEXT, "Point of Contact", wxDefaultPosition, wxDefaultSize, 0 )
     item22.AddWindow( item29, 0, wxALIGN_RIGHT|wxALIGN_CENTER_VERTICAL|wxLEFT|wxRIGHT, 5 )
 
-    item30 = wxTextCtrl( parent, ID_PV_NOMENCLATURE, "", wxDefaultPosition, wxSize(300,-1), 0 )
-    item30.SetToolTip( wxToolTip("Code for component name") )
+    item30 = wxTextCtrl( parent, ID_PV_POC, "", wxDefaultPosition, wxSize(230,-1), 0 )
+    item30.SetToolTip( wxToolTip("Organization/Point of Contact for this component") )
     item22.AddWindow( item30, 0, wxGROW|wxALIGN_CENTER_VERTICAL|wxRIGHT, 5 )
 
-    item31 = wxStaticText( parent, ID_TEXT, "Description", wxDefaultPosition, wxDefaultSize, 0 )
-    item22.AddWindow( item31, 0, wxALIGN_RIGHT|wxLEFT|wxRIGHT, 5 )
+    item31 = wxStaticText( parent, ID_TEXT, "Nomenclature", wxDefaultPosition, wxDefaultSize, 0 )
+    item22.AddWindow( item31, 0, wxALIGN_RIGHT|wxALIGN_CENTER_VERTICAL|wxLEFT|wxRIGHT, 5 )
+
+    item32 = wxTextCtrl( parent, ID_PV_NOMENCLATURE, "", wxDefaultPosition, wxSize(300,-1), 0 )
+    item32.SetToolTip( wxToolTip("Code for component name") )
+    item22.AddWindow( item32, 0, wxGROW|wxALIGN_CENTER_VERTICAL|wxRIGHT, 5 )
+
+    item33 = wxStaticText( parent, ID_TEXT, "Description", wxDefaultPosition, wxDefaultSize, 0 )
+    item22.AddWindow( item33, 0, wxALIGN_RIGHT|wxLEFT|wxRIGHT, 5 )
 
-    item32 = wxTextCtrl( parent, ID_PV_DESC, "", wxDefaultPosition, wxSize(300,-1), wxTE_MULTILINE|wxVSCROLL )
-    item22.AddWindow( item32, 0, wxGROW|wxRIGHT|wxBOTTOM, 5 )
+    item34 = wxTextCtrl( parent, ID_PV_DESC, "", wxDefaultPosition, wxSize(300,-1), wxTE_MULTILINE|wxVSCROLL )
+    item22.AddWindow( item34, 0, wxGROW|wxRIGHT|wxBOTTOM, 5 )
 
     item20.AddSizer( item22, 1, wxGROW|wxRIGHT, 5 )
 
@@ -349,41 +365,41 @@
 
     item0.AddSizer( item1, 1, wxGROW|wxALIGN_CENTER_VERTICAL|wxALL, 5 )
 
-    item33 = wxFlexGridSizer( 5, 0, 0, 0 )
+    item35 = wxFlexGridSizer( 5, 0, 0, 0 )
     
-    item34 = wxBoxSizer( wxHORIZONTAL )
+    item36 = wxBoxSizer( wxHORIZONTAL )
     
-    item35 = wxButton( parent, ID_NEW_M_V, "New", wxDefaultPosition, wxDefaultSize, 0 )
-    item35.SetToolTip( wxToolTip("Create a new component in the currently selected project") )
-    item34.AddWindow( item35, 0, wxALIGN_CENTER|wxLEFT, 5 )
+    item37 = wxButton( parent, ID_NEW_M_V, "New", wxDefaultPosition, wxDefaultSize, 0 )
+    item37.SetToolTip( wxToolTip("Create a new component in the currently selected project") )
+    item36.AddWindow( item37, 0, wxALIGN_CENTER|wxLEFT, 5 )
 
-    item36 = wxButton( parent, ID_EDIT_M_V, "Edit", wxDefaultPosition, wxDefaultSize, 0 )
-    item36.SetToolTip( wxToolTip("Edit the selected component") )
-    item34.AddWindow( item36, 0, wxALIGN_CENTER, 5 )
+    item38 = wxButton( parent, ID_EDIT_M_V, "Edit", wxDefaultPosition, wxDefaultSize, 0 )
+    item38.SetToolTip( wxToolTip("Edit the selected component") )
+    item36.AddWindow( item38, 0, wxALIGN_CENTER, 5 )
 
-    item37 = wxButton( parent, ID_SAVE_M_V, "Save", wxDefaultPosition, wxDefaultSize, 0 )
-    item37.SetToolTip( wxToolTip("Save the component to local storage") )
-    item34.AddWindow( item37, 0, wxALIGN_CENTER, 5 )
+    item39 = wxButton( parent, ID_SAVE_M_V, "Save", wxDefaultPosition, wxDefaultSize, 0 )
+    item39.SetToolTip( wxToolTip("Save the component to local storage") )
+    item36.AddWindow( item39, 0, wxALIGN_CENTER, 5 )
 
-    item38 = wxButton( parent, ID_RESET_M_V_FORM, "Cancel", wxDefaultPosition, wxDefaultSize, 0 )
-    item38.SetToolTip( wxToolTip("Reset (clear) the fields for an unsaved component") )
-    item34.AddWindow( item38, 0, wxALIGN_CENTER|wxRIGHT, 5 )
+    item40 = wxButton( parent, ID_RESET_M_V_FORM, "Cancel", wxDefaultPosition, wxDefaultSize, 0 )
+    item40.SetToolTip( wxToolTip("Reset (clear) the fields for an unsaved component") )
+    item36.AddWindow( item40, 0, wxALIGN_CENTER|wxRIGHT, 5 )
 
-    item39 = wxButton( parent, DELETE_M_V, "Delete", wxDefaultPosition, wxDefaultSize, 0 )
-    item39.SetToolTip( wxToolTip("Delete the association between the parent and child components") )
-    item34.AddWindow( item39, 0, wxALIGN_CENTER|wxLEFT|wxRIGHT, 5 )
+    item41 = wxButton( parent, DELETE_M_V, "Delete", wxDefaultPosition, wxDefaultSize, 0 )
+    item41.SetToolTip( wxToolTip("Delete the association between the parent and child components") )
+    item36.AddWindow( item41, 0, wxALIGN_CENTER|wxLEFT|wxRIGHT, 5 )
 
-    item33.AddSizer( item34, 0, wxALIGN_CENTER|wxALL, 5 )
+    item35.AddSizer( item36, 0, wxALIGN_CENTER|wxALL, 5 )
 
-    item40 = wxBoxSizer( wxHORIZONTAL )
+    item42 = wxBoxSizer( wxHORIZONTAL )
     
-    item41 = wxButton( parent, ID_M_V_CLOSE, "Close", wxDefaultPosition, wxDefaultSize, 0 )
-    item41.SetToolTip( wxToolTip("Close the window") )
-    item40.AddWindow( item41, 0, wxALIGN_CENTER|wxRIGHT, 5 )
+    item43 = wxButton( parent, ID_M_V_CLOSE, "Close", wxDefaultPosition, wxDefaultSize, 0 )
+    item43.SetToolTip( wxToolTip("Close the window") )
+    item42.AddWindow( item43, 0, wxALIGN_CENTER|wxRIGHT, 5 )
 
-    item33.AddSizer( item40, 0, wxALIGN_CENTER|wxALL, 5 )
+    item35.AddSizer( item42, 0, wxALIGN_CENTER|wxALL, 5 )
 
-    item0.AddSizer( item33, 0, wxALIGN_CENTER|wxLEFT|wxRIGHT|wxBOTTOM, 0 )
+    item0.AddSizer( item35, 0, wxALIGN_CENTER|wxLEFT|wxRIGHT|wxBOTTOM, 0 )
 
     if set_sizer == True:
         parent.SetAutoLayout( True )

Index: PanGalactic/pangalactic/client/modules/psm/psmtool.py
diff -u PanGalactic/pangalactic/client/modules/psm/psmtool.py:1.120 PanGalactic/pangalactic/client/modules/psm/psmtool.py:1.121
--- PanGalactic/pangalactic/client/modules/psm/psmtool.py:1.120	Thu Oct 23 15:53:13 2003
+++ PanGalactic/pangalactic/client/modules/psm/psmtool.py	Fri Oct 24 14:52:49 2003
@@ -9,7 +9,7 @@
 This module is the main application code for the pgef client interface
 """
 
-__version__ = "$Revision: 1.120 $"[11:-2]
+__version__ = "$Revision: 1.121 $"[11:-2]
 
 import os
 import sys
@@ -122,43 +122,47 @@
         self.SetSize (self.Parent.GetClientSize())
 
         # will occupy the space not used by the Layout Algorithm 
-        self.remainingSpace = wxNotebook(self, -1, wxDefaultPosition, wxSize(200,200)) 
+        self.grid_notebook = wxNotebook(self, -1, wxDefaultPosition, wxSize(200, 200)) 
     
         # Create Grid to hold Product model versions
-        self.itemgrid = pgefgrid.PgefGrid(self.remainingSpace, -1, savename = 'psmtool_main_grid',
+        self.itemgrid = pgefgrid.PgefGrid(self.grid_notebook, -1, savename = 'psmtool_main_grid',
                                           dbroot = self.DataManager.localDB.dbroot)
         self.itemgrid.GetGridWindow().SetToolTip(wxToolTip("A tabular display of the data in the products " +
                                                            "of the currently selected project.\n" +
                                                            "Doubleclick on a product to display the Product Editor.\n" +
                                                            "Press <LeftMouse> to drag a Product into the hierarchy."))
         self.itemgrid.EnableEditing(false)
-        self.remainingSpace.AddPage(self.itemgrid, "Product Models")
+        self.grid_notebook.AddPage(self.itemgrid, "Product Models")
+        self.itemgrid.Fit()
         
         #Create grid to hold Product Model Masters
-        self.model_master_grid = pgefgrid.PgefGrid(self.remainingSpace, -1, savename = 'psmtool_model_master_grid',
+        self.model_master_grid = pgefgrid.PgefGrid(self.grid_notebook, -1, savename = 'psmtool_model_master_grid',
                                                    dbroot = self.DataManager.localDB.dbroot)
         self.model_master_grid.EnableEditing(false)
-        self.remainingSpace.AddPage(self.model_master_grid, "Model Masters")
+        self.grid_notebook.AddPage(self.model_master_grid, "Model Masters")
+        self.model_master_grid.Fit()
         
         #Create grid to hold Product Versions
-        self.product_version_grid = pgefgrid.PgefGrid(self.remainingSpace, -1, savename = 'psmtool_product_version_grid',
+        self.product_version_grid = pgefgrid.PgefGrid(self.grid_notebook, -1, savename = 'psmtool_product_version_grid',
                                                       dbroot = self.DataManager.localDB.dbroot)
         self.product_version_grid.EnableEditing(false)
-        self.remainingSpace.AddPage(self.product_version_grid, "Product Versions")
+        self.grid_notebook.AddPage(self.product_version_grid, "Product Versions")
+        self.product_version_grid.Fit()
         
         #Create grid to hold Product Masters
-        self.product_master_grid = pgefgrid.PgefGrid(self.remainingSpace, -1, savename = 'psmtool_product_master_grid',
+        self.product_master_grid = pgefgrid.PgefGrid(self.grid_notebook, -1, savename = 'psmtool_product_master_grid',
                                                      dbroot = self.DataManager.localDB.dbroot)
         self.product_master_grid.EnableEditing(false)
-        self.remainingSpace.AddPage(self.product_master_grid, "Product Masters")
+        self.grid_notebook.AddPage(self.product_master_grid, "Product Masters")
+        self.product_master_grid.Fit()
         
         #create the splitter window that holds the shell window
-        win = wxSplitterWindow(self.remainingSpace, -1, size=(640, 480))
+        win = wxSplitterWindow(self.grid_notebook, -1, size=(640, 480))
         shellWin = shell.Shell(win, -1)
         shellWin.interp.locals['pgef'] = self.Parent
         fillingWin = filling.Filling(win, -1, size = (640, 480), rootObject = self.Parent, rootIsNamespace = 1)
         win.SplitHorizontally(shellWin, fillingWin)
-        self.remainingSpace.AddPage(win, "shell")
+        self.grid_notebook.AddPage(win, "shell")
         
         # Create some layout windows
         # A window like a toolbar
@@ -214,7 +218,7 @@
         
         self.leftWindow = win
 
-        wxLayoutAlgorithm().LayoutWindow(self, self.remainingSpace) 
+        wxLayoutAlgorithm().LayoutWindow(self, self.grid_notebook) 
         self.Layout()
 
         self.itemlistcount = None
@@ -272,11 +276,11 @@
         EVT_LEFT_DCLICK(self.tree, self.OnEditComponent) 
         EVT_COMBOBOX(self, ID_CHOICE_VIEW, self.SelectView)
         
-        EVT_NOTEBOOK_PAGE_CHANGED(self, self.remainingSpace.GetId(), self.pageChanged)
+        EVT_NOTEBOOK_PAGE_CHANGED(self, self.grid_notebook.GetId(), self.pageChanged)
         
         
     def onGridClickGetVersions(self, event):
-        #print 'model master grid was clicked'
+        #print "psmtool.ongridclickgetversions"
         ndx = event.GetRow()
         grid = event.GetEventObject()
         obj = grid.GetDataObj(ndx)
@@ -290,13 +294,13 @@
         
         
     def pageChanged(self, event):
-        currentpage = self.remainingSpace.GetSelection()
+        currentpage = self.grid_notebook.GetSelection()
         if currentpage != 0:
             self.tree_notebook.SetSelection(1)
             #print 'changed tree'
     
     def GetCurrentGrid(self):
-        currentpage = self.remainingSpace.GetSelection()
+        currentpage = self.grid_notebook.GetSelection()
         if GRIDLIST[currentpage] == "ProductModelVersion":
             currentgrid = self.itemgrid
         elif GRIDLIST[currentpage] == "ProductModelMaster":
@@ -532,6 +536,8 @@
             pane = 0
         elif product_type in ["ProductModelMaster", "ProductModelVersion"]:
             pane = 1
+        else:
+            raise TypeError, "I have NO idea what product type this is " + product_type
         self.ShowEditFrame(pane, splitter = 1, nodedata = nodedata)
         self.itemeditform.SetMode(pane, mode = itemeditframe.NEW_MODE)
         #print "end onnewitem"
@@ -758,7 +764,7 @@
         pass
         
     def UpdateForLogin(self):
-        print "\npsmtool.updateforlogin"
+        #print "\npsmtool.updateforlogin"
         if self.DataManager.user._loggedin:
             self.topWindow.toppanel.FillProjectWidget(self.DataManager.projects, "Select a Project")
             wgt = self.topWindow.toppanel.GetItemWidget()
@@ -885,13 +891,13 @@
         elif eID == self.ID_WINDOW_LEFT:
             self.leftWindow.SetDefaultSize(wxSize(event.GetDragRect().width, 600)) #tbd
 
-        wxLayoutAlgorithm().LayoutWindow(self, self.remainingSpace)
-        self.remainingSpace.Refresh()
+        wxLayoutAlgorithm().LayoutWindow(self, self.grid_notebook)
+        self.grid_notebook.Refresh()
     
     
     def OnSize(self, event):
         self.SetSize(self.Parent.GetClientSize())
-        wxLayoutAlgorithm().LayoutWindow(self, self.remainingSpace) 
+        wxLayoutAlgorithm().LayoutWindow(self, self.grid_notebook) 
         self.Layout()
     
         
@@ -1002,11 +1008,11 @@
 
 
     def OnSelectProject(self, event = None):
-        print "\npsmtool.onselectproject"
+        #print "\npsmtool.onselectproject"
         wgt = self.topWindow.toppanel.GetProjectWidget()
         project = wgt.GetStringSelection()
         ndx = wgt.GetSelection()
-        print "project, ndx", project, ndx
+        #print "project, ndx", project, ndx
         if ndx == 0:
             if self.State.currentproject:
                 wgt.SetStringSelection(self.State.currentproject)
@@ -1020,8 +1026,8 @@
 
 
     def changeProject(self, ndx, project):
-        print "\npsmtool.changeProject"
-        print "project ndx", project, ndx
+        #print "\npsmtool.changeProject"
+        #print "project ndx", project, ndx
 
         self.DataManager.setCurrentProject(project)
             
@@ -1035,7 +1041,7 @@
         dlg = None
 
         if self.DataManager.user._loggedin:
-            print "psmtool.changeproject.logged in"
+            #print "psmtool.changeproject.logged in"
             wxBeginBusyCursor()
             try:
                 self.topWindow.toppanel.GetItemWidget().SetFocus()
@@ -1072,7 +1078,7 @@
             wxEndBusyCursor()
 
         else:
-            print "psmtool.changeProject.notloggedin"
+            #print "psmtool.changeProject.notloggedin"
             wxSafeYield()
             wxBeginBusyCursor()
             wxSafeYield()
@@ -1086,7 +1092,7 @@
             if ndx > 0:
                 project = self.topWindow.toppanel.GetProjectWidget().GetStringSelection()
                 #print "project", project
-                #self.remainingSpace.SetPageText(self.remainingSpace.GetSelection(), 'Product Models')
+                #self.grid_notebook.SetPageText(self.grid_notebook.GetSelection(), 'Product Models')
                 self.State.currentproject = project
                 self.tree.nodeStack.append(self.tree.AddRoot(project))
 
@@ -1104,7 +1110,7 @@
                 self.UpdateWindows()
             self.SecureMenu()
             wxEndBusyCursor()
-        print "end psmtool.changeProject"
+        #print "end psmtool.changeProject"
 
     def UpdateWindows(self):
         if self.projectframe:
@@ -1317,7 +1323,7 @@
         wgt = self.topWindow.toppanel.GetProjectWidget()
         ndx = wgt.GetSelection()
         project = wgt.GetStringSelection()
-        print "psmtool.setupforlocalmode", project, ndx
+        #print "psmtool.setupforlocalmode", project, ndx
         self.changeProject(ndx, project)
         
     def SetupForLogin(self):
@@ -1349,36 +1355,25 @@
         
     def ShowTopLevelItems(self):
         dlg = None
-        #print "showtoplevelitems"
+        #print "psmtool.showtoplevelitems"
         #print self.State.currentproject
-        for key, value in self.DataManager.localDB.GetACUDict().items():
+        #for key, value in self.DataManager.localDB.GetACUDict().items():
             #print "acu"
             #print value.name, value.pgef_oid
-            break
+            #break
+
         if self.DataManager.user._loggedin and self.State.currentproject:
             #print "logged in"
             #print "toplevelitemids", self.DataManager.topLevelItemIDs
             try:
-#                wxSafeYield()
-                wxBeginBusyCursor()
-#                dlg = wxDialog(self, -1, "A Message from PGEF", wxDefaultPosition, wxSize(400, 75),
-#                               wxTHICK_FRAME)
-#                msg = wxStaticText(dlg, -1, "PGEF is retrieving the item data...",
-#                               wxPoint (10, 10), wxDefaultSize, wxALIGN_CENTRE)
-#                dlg.CentreOnParent()
-#                dlg.Show(true)
-#                wxSafeYield()
                 self.State.treeroot = self.State.currentproject
                 self.tree.DeleteAllItems() 
                 self.DataManager.clearNauoIDs() 
                 self.tree.LoadTreefromProject(self, self.State.currentproject, self.DataManager.topLevelItemIDs)
                 self.itemgrid.ClearSelection()
                 self.topWindow.toppanel.GetItemWidget().SetSelection(0)
-
-            finally:
-                if dlg:
-                     dlg.Destroy()
-                wxEndBusyCursor()
+            except:
+                pass
 
         else:
             #print "not logged in"
@@ -1397,11 +1392,6 @@
                 #print "Local mode; no TopLevel items"
                 self.DataManager.clearNauoIDs() 
                 self.tree.LoadTreefromProject(self, self.State.currentproject, [])
-
-            #dlg = wxMessageDialog(self, "I'm sorry Steve, I can't do that...", "Unable to comply",
-            #                      wxOK|wxCENTRE|wxICON_EXCLAMATION)
-            #dlg.ShowModal()
-            #wxSafeYield()
         #print "end showtoplevelitems"
 
 
@@ -1429,12 +1419,8 @@
                     return
 
             wxBeginBusyCursor()
-
-#            self.FillEditFrame(nodedata)  # only called here now, so moved code here.
-
             pane = 1                
             product_id = nodedata[1]
-#            print "product_id", product_id
             self.ShowEditFrame(pane, 1, ["TREE", product_id, "ProductModelVersion"])
             self.itemeditform.SetMode(pane)
             wxEndBusyCursor()
@@ -1473,7 +1459,7 @@
         
             
     def editGridObject(self, product_id, product_type):
-        print "psmtool.editgridobject", product_id, product_type
+        #print "psmtool.editgridobject", product_id, product_type
 
         dlg = None
         if self.DataManager.user._loggedin:
@@ -1492,8 +1478,8 @@
             elif product_type in ["ProductMaster", "ProductVersion"]:
                 pane = 0
             else:
-                print "pane???  what pane???"
-                
+                raise TypeError, "I have NO idea what product type this is " + product_type
+                                
             self.ShowEditFrame(pane, 1, ["GRID", product_id, product_type])
             self.itemeditform.SetMode(pane)
             wxEndBusyCursor()
@@ -1505,7 +1491,8 @@
             elif product_type in ["ProductMaster", "ProductVersion"]:
                 pane = 0
             else:
-                print "pane???  what pane???"
+                raise TypeError, "I have NO idea what product type this is " + product_type
+
             self.ShowEditFrame(pane, 1, ["GRID", product_id, product_type])
             self.itemeditform.SetMode(pane)
 
@@ -1519,8 +1506,6 @@
         #print "psmtool.quickcreate"
         create_results = quickcreate.showQuickCreate(self)
         if create_results:
-            #print 'in psmtools, quickcreate'
-            #print 'sending %s to create function' % str(create_results)
             results = self.DataManager.quickCreate(create_results)
             if results[0]:
                 #print "  quick pm"

Index: PanGalactic/pangalactic/enterprise/productversion.py
diff -u PanGalactic/pangalactic/enterprise/productversion.py:1.23 PanGalactic/pangalactic/enterprise/productversion.py:1.24
--- PanGalactic/pangalactic/enterprise/productversion.py:1.23	Wed Oct 22 15:55:39 2003
+++ PanGalactic/pangalactic/enterprise/productversion.py	Fri Oct 24 14:52:50 2003
@@ -1,12 +1,12 @@
-# $Id: productversion.py,v 1.23 2003/10/22 19:55:39 waterbug Exp $
+# $Id: productversion.py,v 1.24 2003/10/24 18:52:50 pbear Exp $
 
 """
 Version-dependent product data.
 
-@version: $Revision: 1.23 $
+@version: $Revision: 1.24 $
 """
 
-__version__ = "$Revision: 1.23 $"[11:-2]
+__version__ = "$Revision: 1.24 $"[11:-2]
 
 from pangalactic.enterprise.pgefobject import PgefObject
 from pangalactic.enterprise.project import Project
@@ -60,7 +60,7 @@
            'of_pm_id_context'
           ]
     _schema_ext = {
-                       'id'                 : 'int',
+                       'id'                 : 'str',
                        'of_pm_id'           : 'str',
                        'of_pm_id_context'   : 'str',
                        'project_id'         : 'str',

Index: PanGalactic/pangalactic/utils/datamanager.py
diff -u PanGalactic/pangalactic/utils/datamanager.py:1.50 PanGalactic/pangalactic/utils/datamanager.py:1.51
--- PanGalactic/pangalactic/utils/datamanager.py:1.50	Thu Oct 23 15:06:20 2003
+++ PanGalactic/pangalactic/utils/datamanager.py	Fri Oct 24 14:52:50 2003
@@ -1,6 +1,6 @@
 # $Source: /repo/step_testbed/PanGalactic/pangalactic/utils/datamanager.py,v $
 
-__version__ = "$Revision: 1.50 $"[11:-2]
+__version__ = "$Revision: 1.51 $"[11:-2]
 
 import time
 import mx.DateTime
@@ -101,6 +101,7 @@
             #print 'Creating product master'
             product_master = ProductMaster(id = PartNumber,
                                            project_id = self.currentProject,
+                                           creator = self.user.id,
                                            id_context = self.currentProject)
             #print product_master
             
@@ -108,6 +109,7 @@
             #print 'Creating product version'
             product_version = ProductVersion(_of_master = product_master,
                                              project_id = self.currentProject,
+                                             creator = self.user.id,
                                              id = Revision,
                                              id_context = self.currentProject)
             #print product_version
@@ -116,6 +118,7 @@
             #print 'Creating product model master'
             product_model_master = ProductModelMaster(_of_version = product_version,
                                                       project_id = self.currentProject,
+                                                      creator = self.user.id,
                                                       id = ModelType,
                                                       id_context = self.currentProject)
             
@@ -123,6 +126,7 @@
             #print 'Creating product model version'
             product_model_version = ProductModelVersion(_of_model_master = product_model_master,
                                                         project_id = self.currentProject,
+                                                        creator = self.user.id,
                                                         id = ModelRev,
                                                         id_context = self.currentProject)
             

From pbear at ned.gsfc.nasa.gov  Fri Oct 24 16:43:25 2003
From: pbear at ned.gsfc.nasa.gov (pbear CVS)
Date: Fri Oct 24 15:43:27 2003
Subject: [Pangalactic-commits] fixed tree redrawing on editor close and on
	product deselect via dropdown
Message-ID: <200310241943.h9OJhPM7014653@ned.gsfc.nasa.gov>

Modified files:
PanGalactic/pangalactic/client/modules/psm/psmtool.py 1.121 1.122
PanGalactic/pangalactic/utils/xmlrpcinterface.py 1.24 1.25

Log message:
fixed tree redrawing on editor close and on product deselect via dropdown


Index: PanGalactic/pangalactic/client/modules/psm/psmtool.py
diff -u PanGalactic/pangalactic/client/modules/psm/psmtool.py:1.121 PanGalactic/pangalactic/client/modules/psm/psmtool.py:1.122
--- PanGalactic/pangalactic/client/modules/psm/psmtool.py:1.121	Fri Oct 24 14:52:49 2003
+++ PanGalactic/pangalactic/client/modules/psm/psmtool.py	Fri Oct 24 15:43:23 2003
@@ -9,7 +9,7 @@
 This module is the main application code for the pgef client interface
 """
 
-__version__ = "$Revision: 1.121 $"[11:-2]
+__version__ = "$Revision: 1.122 $"[11:-2]
 
 import os
 import sys
@@ -133,7 +133,7 @@
                                                            "Press <LeftMouse> to drag a Product into the hierarchy."))
         self.itemgrid.EnableEditing(false)
         self.grid_notebook.AddPage(self.itemgrid, "Product Models")
-        self.itemgrid.Fit()
+        self.itemgrid.Fit() # remove funny blank space in the first row of the grid, if it initially has a scrollbar
         
         #Create grid to hold Product Model Masters
         self.model_master_grid = pgefgrid.PgefGrid(self.grid_notebook, -1, savename = 'psmtool_model_master_grid',
@@ -442,15 +442,16 @@
             
 
     def RebuildMainTree(self):
+        #print "psmtool.rebuildmaintree"
         projectndx = self.topWindow.toppanel.GetProjectWidget().GetSelection() 
         if projectndx > 0:
             itemndx = self.topWindow.toppanel.GetItemWidget().GetSelection()
             if itemndx > 0:
                 itemndx -= 1
-
-            self.tree.DeleteAllItems()
-            self.ShowTopLevelItems()
-
+                #self.tree.DeleteAllItems()
+                itemobj = self.topWindow.toppanel.GetItemObject(itemndx)
+                self.showItem(itemobj)
+                #self.ShowTopLevelItems()
         
     def CloseSearchFrame (self, event = None):
         if self.SearchFrame:
@@ -945,8 +946,8 @@
                self.Commit(closing)
                
 
-    def ItemClicked(self, itemobj):  #ndx):
-        #print "psmtool.itemclicked"
+    def showItem(self, itemobj):  #ndx):
+        #print "psmtool.showitem"
 #        itemid = self.itemgrid.GetObjectOid(ndx)
         itemid = itemobj.pgef_oid
         self.State.treeroot = itemid
@@ -979,6 +980,10 @@
         #print "psmtool.onitemclick"
         ndx = self.topWindow.toppanel.GetItemWidget().GetSelection()
         if ndx == 0:
+            wgt = self.topWindow.toppanel.GetProjectWidget()
+            projndx = wgt.GetSelection()
+            project = wgt.GetString(projndx)
+            self.changeProject(ndx, project)  # not the best way, but it works for now.  vwk
             return
         else:
             ndx -= 1
@@ -998,7 +1003,7 @@
             dlg.CentreOnParent()
             dlg.Show(true)
             wxSafeYield()
-            self.ItemClicked(itemobj)
+            self.showItem(itemobj)
 
         finally:
             if dlg:
@@ -1371,7 +1376,7 @@
                 self.DataManager.clearNauoIDs() 
                 self.tree.LoadTreefromProject(self, self.State.currentproject, self.DataManager.topLevelItemIDs)
                 self.itemgrid.ClearSelection()
-                self.topWindow.toppanel.GetItemWidget().SetSelection(0)
+#                self.topWindow.toppanel.GetItemWidget().SetSelection(0)
             except:
                 pass
 

Index: PanGalactic/pangalactic/utils/xmlrpcinterface.py
diff -u PanGalactic/pangalactic/utils/xmlrpcinterface.py:1.24 PanGalactic/pangalactic/utils/xmlrpcinterface.py:1.25
--- PanGalactic/pangalactic/utils/xmlrpcinterface.py:1.24	Thu Oct 23 15:06:20 2003
+++ PanGalactic/pangalactic/utils/xmlrpcinterface.py	Fri Oct 24 15:43:24 2003
@@ -3,10 +3,10 @@
 """
 PanGalactic Client XMLRPC Interfaces
 
-@version: $Revision: 1.24 $
+@version: $Revision: 1.25 $
 """
 
-__version__ = "$Revision: 1.24 $"[11:-2]
+__version__ = "$Revision: 1.25 $"[11:-2]
 
 import xmlrpclib
 import types
@@ -100,21 +100,21 @@
     def getCategories(self, context):
         # Category is a subclass of DataElement.  FSC is a
         # Category; it's passed in as the context
-        print "xmlrpc.getcategories", context
+        #print "xmlrpc.getcategories", context
         crit = {"id_context" : context}
         data = self._RPC.getObjects('Category', 0, 0, crit)
         if data:
             return [self._factory.remember(x) for x in data]
 
     def getOrganizations(self, context):
-        print "xmlrpc.getorganizations", context
+        #print "xmlrpc.getorganizations", context
         crit = {"id_context" : context}
         data = self._RPC.getObjects('Organization', 0, 0, crit)
         if data:
             return [self._factory.remember(x) for x in data]
 
     def getOrganization(self, ObjId):
-        print "xmlrpc.getorganization"
+        #print "xmlrpc.getorganization"
         data = self._RPC.getObjects('Organization', 'pgef_oid=%s' % ObjId)
         if data:
             return [self._factory.remember(x) for x in data]
@@ -126,13 +126,13 @@
         is the _assembly (the object that contains the _component
         object).
         """
-        print "in xmlrpcinterface.GetAcusByAssembly"
+        #print "in xmlrpcinterface.GetAcusByAssembly"
         acu = ACU(_assembly=assembly)
         keydict = dict([(a, getattr(acu, a)) for a in ACU._fk['_assembly']])
         #print "keydict", keydict
         data = self._RPC.getObjects('AssemblyComponentUsage', 1, 0, keydict)
         if data:
-            print "have acus"
+            #print "have acus"
             return self._factory.rememberAll(data)
 
     def GetPerson(self, user_tuple):

From waterbug at ned.gsfc.nasa.gov  Mon Oct 27 15:02:47 2003
From: waterbug at ned.gsfc.nasa.gov (waterbug CVS)
Date: Mon Oct 27 15:02:58 2003
Subject: [Pangalactic-commits] Default value for pgef_class of a pgef_object
	is its actual Python class.
Message-ID: <200310272002.h9RK2lt2010921@ned.gsfc.nasa.gov>

Modified files:
PanGalactic/pangalactic/enterprise/pgefobject.py 1.28 1.29

Log message:
Default value for pgef_class of a pgef_object is its actual Python class.


Index: PanGalactic/pangalactic/enterprise/pgefobject.py
diff -u PanGalactic/pangalactic/enterprise/pgefobject.py:1.28 PanGalactic/pangalactic/enterprise/pgefobject.py:1.29
--- PanGalactic/pangalactic/enterprise/pgefobject.py:1.28	Fri Oct 17 16:49:53 2003
+++ PanGalactic/pangalactic/enterprise/pgefobject.py	Mon Oct 27 15:02:45 2003
@@ -1,8 +1,8 @@
-# $Id: pgefobject.py,v 1.28 2003/10/17 20:49:53 waterbug Exp $
+# $Id: pgefobject.py,v 1.29 2003/10/27 20:02:45 waterbug Exp $
 
 """
 The Mother of all PGEF application classes.
-@version: $Revision: 1.28 $
+@version: $Revision: 1.29 $
 """
 
 # TODO:
@@ -24,7 +24,7 @@
 #               should we jettison this?
 #               Nope.
 
-__version__ = "$Revision: 1.28 $"[11:-2]
+__version__ = "$Revision: 1.29 $"[11:-2]
 
 import types
 import string
@@ -237,6 +237,9 @@
         if not kw.get('pgef_oid'):
             self.create_datetime = DateTime.now()
             self.mod_datetime = DateTime.now()
+        # if no pgef_class is passed in, use our Python class ...
+        if not kw.get('pgef_class'):
+            self.pgef_class = self.__class__.__name__
 
     def getGridMap(self, order=None, names=None, types=None):
         """

From waterbug at ned.gsfc.nasa.gov  Mon Oct 27 15:16:57 2003
From: waterbug at ned.gsfc.nasa.gov (waterbug CVS)
Date: Mon Oct 27 15:16:59 2003
Subject: [Pangalactic-commits] Make _verifyAddExtract() return a simple list
	of resultsets (instead of a list of lists of rs).
Message-ID: <200310272016.h9RKGvXU011501@ned.gsfc.nasa.gov>

Modified files:
PanGalactic/pangalactic/repo/pger.py 1.45 1.46

Log message:
Make _verifyAddExtract() return a simple list of resultsets (instead of a list of lists of rs).


Index: PanGalactic/pangalactic/repo/pger.py
diff -u PanGalactic/pangalactic/repo/pger.py:1.45 PanGalactic/pangalactic/repo/pger.py:1.46
--- PanGalactic/pangalactic/repo/pger.py:1.45	Fri Oct 17 16:49:32 2003
+++ PanGalactic/pangalactic/repo/pger.py	Mon Oct 27 15:16:56 2003
@@ -1,9 +1,9 @@
 """
 Pan Galactic Entropy Reverser module
-@version: $Revision: 1.45 $
+@version: $Revision: 1.46 $
 """
 
-__version__ = "$Revision: 1.45 $"[11:-2]
+__version__ = "$Revision: 1.46 $"[11:-2]
 # $Source: /repo/step_testbed/PanGalactic/pangalactic/repo/pger.py,v $
 
 import time
@@ -439,14 +439,9 @@
         d = self._pgerdb.addRows(recs)
         d.addCallback(lambda x: self._verifyAddExtract(recs))
         d.addCallback(lambda x:
-                      [self._factory.resultset2Extract(rsl[0])
-                       for rsl in x])
+                      [self._factory.resultset2Extract(rs)
+                       for rs in x])
         return d
-        # okay, the "rsl[0]" is because _verifyAddExtract returns
-        # a list of *lists* of resultsets (sheesh!), but there
-        # is only one resultset in each list because getByRowKey
-        # just returns one record (it had better!) -- hence the
-        # rsl[0] is safe ...  if weird
 
     def _verifyAddExtract(self, recs):
         """
@@ -457,11 +452,18 @@
         @type records:   list
         @param records:  a list of records -- see
                          L{pangalactic.repo.factory.extract2Record}
+
+        @rtype:  list
+        @return: list of resultsets, one for each record added
         """
-        return defer.gatherResults(
+        d = defer.gatherResults(
             [self._pgerdb.getByRowKey(
                 self._factory.record2RowKey(rec))
                 for rec in recs])
+        return d.addCallback(lambda rsl: rsl[0])
+        # rsl[0] is safe here because there should only be one
+        # resultset in the list of resultsets returned for a
+        # given RowKey.
 
     def _addExtractsError(self, error):
         """

From pbear at ned.gsfc.nasa.gov  Mon Oct 27 15:41:43 2003
From: pbear at ned.gsfc.nasa.gov (pbear CVS)
Date: Mon Oct 27 15:41:44 2003
Subject: [Pangalactic-commits] added colour key to workflow instances;
	some bugs fixed
Message-ID: <200310272041.h9RKfhZs012105@ned.gsfc.nasa.gov>

Modified files:
PanGalactic/pangalactic/client/modules/psm/productdataform.py 1.31 1.32
PanGalactic/pangalactic/client/modules/psm/psmtool.py 1.122 1.123
PanGalactic/pangalactic/enterprise/workflow/wfinstanceoverview.py 1.8 1.9
PanGalactic/pangalactic/enterprise/workflow/wfprocessoverview.py 1.17 1.18
PanGalactic/pangalactic/enterprise/workflow/workflow_wizard.py 1.20 1.21
PanGalactic/pangalactic/utils/dbbrowser.py 1.3 1.4

Log message:
added colour key to workflow instances; some bugs fixed


Index: PanGalactic/pangalactic/utils/dbbrowser.py
diff -u PanGalactic/pangalactic/utils/dbbrowser.py:1.3 PanGalactic/pangalactic/utils/dbbrowser.py:1.4
--- PanGalactic/pangalactic/utils/dbbrowser.py:1.3	Wed Oct  1 13:24:14 2003
+++ PanGalactic/pangalactic/utils/dbbrowser.py	Mon Oct 27 15:41:41 2003
@@ -189,6 +189,7 @@
             else:
                 col = 0
                 maxcols = 0
+                # how many columns should there be?
                 try:
                     for obj_id, obj in collection_dict.items():
                         curr_cols = len(obj.__dict__)
@@ -196,16 +197,13 @@
                             maxcols = curr_cols
                 except:
                     print "Eek.  An Exception.  Eek."
-                    print "But seriously..."
-                    print "collection type", type(collection_dict)
+                    print "But seriously...  ungriddable object", obj_id
                     
                 if self.grid.GetNumberCols() > 0:
-                    self.grid.DeleteCols(0,self.grid.GetNumberCols())
-                
-                #for x in range(maxcols):
-                    #self.grid.AppendCols(1)                    
+                    self.grid.DeleteCols(0, self.grid.GetNumberCols())
                 self.grid.AppendCols(maxcols)
 
+                # fill in the grid
                 try:
                     for obj_id, obj in collection_dict.items():
                         col = 0
@@ -215,8 +213,7 @@
                         curr_row += 1
                 except:
                     print "Eek.  Another Exception.  Eek."
-                    print "But seriously..."
-                    print "collection type", type(collection_dict)
+                    print "But seriously...  ungriddable object", obj_id
                     
             self.grid.AutoSizeColumns(true)
 

Index: PanGalactic/pangalactic/client/modules/psm/psmtool.py
diff -u PanGalactic/pangalactic/client/modules/psm/psmtool.py:1.122 PanGalactic/pangalactic/client/modules/psm/psmtool.py:1.123
--- PanGalactic/pangalactic/client/modules/psm/psmtool.py:1.122	Fri Oct 24 15:43:23 2003
+++ PanGalactic/pangalactic/client/modules/psm/psmtool.py	Mon Oct 27 15:41:40 2003
@@ -9,7 +9,7 @@
 This module is the main application code for the pgef client interface
 """
 
-__version__ = "$Revision: 1.122 $"[11:-2]
+__version__ = "$Revision: 1.123 $"[11:-2]
 
 import os
 import sys
@@ -983,7 +983,7 @@
             wgt = self.topWindow.toppanel.GetProjectWidget()
             projndx = wgt.GetSelection()
             project = wgt.GetString(projndx)
-            self.changeProject(ndx, project)  # not the best way, but it works for now.  vwk
+            self.changeProject(ndx, project)  # a bit of overkill, but it works for now.  vwk
             return
         else:
             ndx -= 1

Index: PanGalactic/pangalactic/enterprise/workflow/wfinstanceoverview.py
diff -u PanGalactic/pangalactic/enterprise/workflow/wfinstanceoverview.py:1.8 PanGalactic/pangalactic/enterprise/workflow/wfinstanceoverview.py:1.9
--- PanGalactic/pangalactic/enterprise/workflow/wfinstanceoverview.py:1.8	Thu Oct 16 17:19:44 2003
+++ PanGalactic/pangalactic/enterprise/workflow/wfinstanceoverview.py	Mon Oct 27 15:41:41 2003
@@ -15,10 +15,14 @@
 from wxPython.wx import *
 from wxPython.grid import *
 
+import pangalactic.utils.toolframe as toolframe
+import pangalactic.utils.basegrid as basegrid
 from pangalactic.enterprise.workflow.wfprocessoverview import WfProcessOverview, WorkflowState
-from workflowgrid import WorkflowGrid, WF_EDIT, WF_VIEW
-import wfdatatable
+import pangalactic.enterprise.workflow.workflow_wizard as workflow_wizard
+from pangalactic.enterprise.workflow.workflowgrid import WorkflowGrid, WF_EDIT, WF_VIEW
+import pangalactic.enterprise.workflow.wfdatatable as wfdatatable
 
+WF_COLOURKEY = wxNewId()
 
 class WfInstanceOverview(WfProcessOverview):
     """
@@ -54,6 +58,55 @@
     
         WfProcessOverview.__init__(self, parent, state, datamgr, datalist, tablename, ID, pos, size)
 
+
+    def showColourKey(self, event):
+        #print "wfinstance.showcolourkey"
+        tmpsize = wxSize(100, 115)
+        colourdlg = wxDialog(self, -1, "Key", wxDefaultPosition, tmpsize, wxDEFAULT_DIALOG_STYLE | wxRESIZE_BORDER)
+        vsizer = wxBoxSizer(wxVERTICAL)
+        colourp = wxPanel(colourdlg, -1)
+
+        for ckey, clist in workflow_wizard.colourlist.items():
+            #print ckey, clist
+            coltext = clist[0]
+            forecolour = clist[1]
+            backcolour = clist[2]
+#            attr = wxTextAttr(forecolour, backcolour)
+            foo = wxTextCtrl(colourp, wxNewId(), "", wxDefaultPosition, wxSize(80, -1), wxTE_READONLY)
+            foo.SetForegroundColour(forecolour)
+            foo.SetBackgroundColour(backcolour)
+            foo.SetValue(coltext)
+#            foo.SetDefaultStyle(attr)
+#            foo.AppendText(coltext)
+            vsizer.AddWindow(foo, 0, wxGROW|wxALIGN_CENTER_VERTICAL, 5)
+
+        colourp.SetAutoLayout(True)
+        colourp.SetSizer(vsizer)
+        vsizer.Fit(colourp)
+        vsizer.SetSizeHints(colourp)
+
+        colourdlg.CentreOnParent()
+        colourdlg.Show(True)
+
+##        colourgrid = wxGrid(colourdlg, -1)
+##        colourgrid.CreateGrid(len(workflow_wizard.colourlist), 1)
+##        colourgrid.EnableEditing(False)
+##        row = 0
+##        for ckey, clist in workflow_wizard.colourlist.items():
+##            coltext = clist[0]
+##            forecolour = clist[1]
+##            backcolour = clist[2]
+##            colourgrid.SetCellTextColour(row, 0, forecolour)
+##            colourgrid.SetCellBackgroundColour(row, 0, backcolour)
+##            colourgrid.SetCellValue(row, 0, coltext)
+##            row += 1
+##        colourgrid.SetRowLabelSize(0)
+##        colourgrid.SetColLabelSize(0)
+##        colourgrid.Fit()
+##        colourdlg.CentreOnParent()
+##        colourdlg.Show(True)
+
+
     def setupGrid(self, datalist, tablename):
         #print "instance.setupgrid", tablename
         self.gridtable = wfdatatable.WfDataTable()
@@ -87,7 +140,7 @@
         for row in range(self.grid.GetNumberRows()):
             wfobj = self.grid.GetDataObj(row)
             msg += "\nrow: " + str(row)
-            colour = wxLIGHT_GREY
+            backcolour = wxLIGHT_GREY
 
             now = mx.DateTime.DateFromTicks(mx.DateTime.now())
             duedate = wfobj._activity_due_date
@@ -100,24 +153,31 @@
             #print duedate, late, very_late, lost_cause
 
             if now >= duedate + mx.DateTime.RelativeDateTime(days=(+lost_cause)):
-                colour = wxTheColourDatabase.FindColour("MAROON")
-                self.grid.SetCellTextColour(row, somecol, wxWHITE)
+                colour_ndx = workflow_wizard.lost_cause
+                #colour = wxTheColourDatabase.FindColour("MAROON")
                 msg += "; Waaay Overdue (%i) " % lost_cause
             elif now >= duedate + mx.DateTime.RelativeDateTime(days=(+very_late)):
-                colour = wxTheColourDatabase.FindColour("RED")
+                colour_ndx = workflow_wizard.very_late
+                #colour = wxTheColourDatabase.FindColour("RED")
                 msg += "; Very Late (%i) " % very_late
             elif now >= duedate + mx.DateTime.RelativeDateTime(days=(+late)):
-                colour = wxTheColourDatabase.FindColour("CORAL")
+                colour_ndx = workflow_wizard.late
+                #colour = wxTheColourDatabase.FindColour("CORAL")
                 msg += "; Late (%i) " % late
             elif now >= duedate:
-                colour = wxTheColourDatabase.FindColour("YELLOW")
-                msg += "; Sort of Late "
+                colour_ndx = workflow_wizard.past
+                #colour = wxTheColourDatabase.FindColour("YELLOW")
+                msg += "; Past Due "
             else:
-                colour = wxTheColourDatabase.FindColour("GREEN")
+                colour_ndx = workflow_wizard.ontime
+                #colour = wxTheColourDatabase.FindColour("GREEN")
                 msg += "; on time "
 
-            msg += repr(colour)
-            self.grid.SetCellBackgroundColour(row, somecol, colour)
+            msg += repr(backcolour)
+            backcolour = workflow_wizard.colourlist[colour_ndx][2]
+            forecolour = workflow_wizard.colourlist[colour_ndx][1]
+            self.grid.SetCellBackgroundColour(row, somecol, backcolour)
+            self.grid.SetCellTextColour(row, somecol, forecolour)
             #print msg
 
 ##        get the attr for the wxAttrKind.Row (= 3)

Index: PanGalactic/pangalactic/client/modules/psm/productdataform.py
diff -u PanGalactic/pangalactic/client/modules/psm/productdataform.py:1.31 PanGalactic/pangalactic/client/modules/psm/productdataform.py:1.32
--- PanGalactic/pangalactic/client/modules/psm/productdataform.py:1.31	Fri Oct 24 14:52:49 2003
+++ PanGalactic/pangalactic/client/modules/psm/productdataform.py	Mon Oct 27 15:41:40 2003
@@ -102,14 +102,14 @@
         return wxPyTypeCast(self.FindWindowById(ID_TOGGLE_PM), "wxRadioButton")
     
     def getNextPvId(self):
-        print "productdataform.getnextpvid"
+        #print "productdataform.getnextpvid"
         temp = preferences.GetPreference('nextpvid')
         if temp:
             self.NextPvId = str(int(temp) + 1)
         else:
             self.NextPvId = "0"
         preferences.prefs['nextpvid'] = self.NextPvId
-        print "nextpvid", self.NextPvId
+        #print "nextpvid", self.NextPvId
 
         
     def ClearCreateEditFlags(self):
@@ -309,7 +309,7 @@
         """
         Clears the entire form
         """
-        print "productdataform.clearpmpvform"
+        #print "productdataform.clearpmpvform"
         self.clearPM()
         self.clearPV()
             
@@ -318,7 +318,7 @@
         """
         Clears the Product Master portion of the form
         """
-        print "productdataform.clearpm"
+        #print "productdataform.clearpm"
         self.GetPmIdentifier().SetValue('')
         self.GetPmName().SetValue('')
         self.GetPmPoc().SetValue('')
@@ -330,7 +330,7 @@
         """
         Clears the Product Version portion of the form
         """
-        print "productdataform.clearpv"
+        #print "productdataform.clearpv"
         self.GetPvRevision().SetLabel('')
         self.GetPvRevisionTag().SetValue('')
         self.GetPvName().SetValue('')
@@ -340,7 +340,7 @@
         self.temp_pv = None
         
     def ResetForm(self, PM, PV):
-        print "productdataform.resetpmpvform"
+        #print "productdataform.resetpmpvform"
         self.clearForm()
         self.FillFormWithPMData(PM)
         self.FillFormWithPVData(PV)
@@ -348,13 +348,13 @@
         self.EnablePV(False)
             
     def revertNextPvId(self):
-        print "productdataform.revertnextpvid"
+        #print "productdataform.revertnextpvid"
         nextid = preferences.GetPreference('nextpvid')
         nextid = int(nextid) - 1
         preferences.prefs['nextpvid'] = nextid
         preferences.CreatePreferencesFile(preferences.prefs)
         self.NextPvId = None
-        print "nextid", nextid
+        #print "nextid", nextid
 
     def SavePM(self, pmv):
         self.FillPMWithFormData(pmv._of_master)
@@ -495,14 +495,14 @@
         return wxPyTypeCast(self.FindWindowById(ID_PART_NUMBER), "wxStaticText")
 
     def getNextPmvId(self):
-        print "productdataform.getnextpmvid"
+        #print "productdataform.getnextpmvid"
         temp = preferences.GetPreference('nextpmvid')
         if temp:
             self.NextPmvId = str(int(temp) + 1)
         else:
             self.NextPmvId = "0"
         preferences.prefs['nextpmvid'] = self.NextPmvId
-        print "nextid", self.NextPmvId
+        #print "nextid", self.NextPmvId
 
     def ClearCreateEditFlags(self):
         self.CreatingProductModelMaster = 0
@@ -698,7 +698,7 @@
         
         
     def clearForm(self):
-        print "productdataform.clearpmmpmvform"
+        #print "productdataform.clearpmmpmvform"
         """
         Clears the entire form
         """
@@ -709,7 +709,7 @@
         """
         Clears the Product Model Version portion of a form
         """
-        print "productdataform.clearpmv"
+        #print "productdataform.clearpmv"
         self.GetPmvRevision().SetLabel('')
         self.GetPmvRevisionTag().SetValue('')
         self.GetPmvName().SetValue('')
@@ -722,7 +722,7 @@
         """
         Clears the Product Model Master portion of a form
         """
-        print "productdataform.clearpmm"
+        #print "productdataform.clearpmm"
         self.GetPmmIdentifier().SetValue('')
         self.GetPmmName().SetValue('')
         self.GetPmmPoc().SetValue('')
@@ -732,7 +732,7 @@
 
         
     def ResetForm(self, PMM, PMV):
-        print "productdataform.resetpmmpmvform"
+        #print "productdataform.resetpmmpmvform"
         self.clearForm()
         self.FillFormWithPMMData(PMM)
         self.FillFormWithPMVData(PMV)
@@ -740,12 +740,12 @@
         self.EnablePMV(False)
     
     def revertNextPmvId(self):
-        print "productdataform.revertnextpmvid"
+        #print "productdataform.revertnextpmvid"
         nextid = preferences.GetPreference('nextpmvid')
         nextid = int(nextid) - 1
         preferences.prefs['nextpmvid'] = nextid
         preferences.CreatePreferencesFile(preferences.prefs)
-        print "nextid", nextid
+        #print "nextid", nextid
         self.NextPmvId = None
 
     def SavePMM(self,pmv):

Index: PanGalactic/pangalactic/enterprise/workflow/wfprocessoverview.py
diff -u PanGalactic/pangalactic/enterprise/workflow/wfprocessoverview.py:1.17 PanGalactic/pangalactic/enterprise/workflow/wfprocessoverview.py:1.18
--- PanGalactic/pangalactic/enterprise/workflow/wfprocessoverview.py:1.17	Thu Oct 16 11:17:20 2003
+++ PanGalactic/pangalactic/enterprise/workflow/wfprocessoverview.py	Mon Oct 27 15:41:41 2003
@@ -74,14 +74,13 @@
         @param tablename: A unique name for the grid for the local cache.
         """
     
-#        PGDataPanel.__init__(self, parent, datamgr, ID, pos, size)
         wxPanel.__init__(self, parent, ID, pos, size)
 
         self.actinfo = [("Activity", 100, "activity"),
                         ("Time Frame\n(days)", 100, "duration"),
                         ("Late\n(days)", 100, "late"),
                         ("Very Late\n(days)", 100, "very_late"),
-                        ("WAAAAY Overdue\n(days)", 130, "lost_cause"),
+                        ("Lost Cause?\n(days)", 130, "lost_cause"),
                         ("Description", 400, "description")]
         self.transinfo = [("From", 200, "from"), ("To", 200, "to")]
 

Index: PanGalactic/pangalactic/enterprise/workflow/workflow_wizard.py
diff -u PanGalactic/pangalactic/enterprise/workflow/workflow_wizard.py:1.20 PanGalactic/pangalactic/enterprise/workflow/workflow_wizard.py:1.21
--- PanGalactic/pangalactic/enterprise/workflow/workflow_wizard.py:1.20	Thu Oct 16 17:19:44 2003
+++ PanGalactic/pangalactic/enterprise/workflow/workflow_wizard.py	Mon Oct 27 15:41:41 2003
@@ -26,6 +26,23 @@
 time_very_late_col = 3
 time_lost_cause_col = 4
 desc_col = 5
+
+lost_cause_colour = wxTheColourDatabase.FindColour("MAROON")
+very_late_colour  = wxTheColourDatabase.FindColour("RED")
+late_colour       = wxTheColourDatabase.FindColour("CORAL")
+past_colour       = wxTheColourDatabase.FindColour("YELLOW")
+ontime_colour     = wxTheColourDatabase.FindColour("GREEN")
+
+lost_cause = 4
+very_late = 3
+late = 2
+past = 1
+ontime = 0
+colourlist = {lost_cause : ["Lost Cause?", wxWHITE, lost_cause_colour],
+              very_late  : ["Very Late",   wxBLACK, very_late_colour],
+              late       : ["Late",        wxBLACK, late_colour],
+              past       : ["Past Due",    wxBLACK, past_colour],
+              ontime     : ["On Time",     wxBLACK, ontime_colour]}
         
 class WorkflowWizard(wxPanel):
     """
@@ -109,14 +126,12 @@
         self.activitygrid.SetRowLabelSize(40)
         self.activitygrid.EnableEditing(True)
 
-        purple = wxTheColourDatabase.FindColour("MAROON")
-        red = wxTheColourDatabase.FindColour("RED")
-        orange = wxTheColourDatabase.FindColour("CORAL")
-        yellow = wxTheColourDatabase.FindColour("YELLOW")
-        self.SetColForegroundColour(self.activitygrid, time_lost_cause_col, wxWHITE)
-        self.SetColBackgroundColour(self.activitygrid, time_lost_cause_col, purple)
-        self.SetColBackgroundColour(self.activitygrid, time_very_late_col, red)
-        self.SetColBackgroundColour(self.activitygrid, time_late_col, orange)
+        self.SetColForegroundColour(self.activitygrid, time_lost_cause_col, colourlist[lost_cause][1])
+        self.SetColBackgroundColour(self.activitygrid, time_lost_cause_col, colourlist[lost_cause][2])
+        self.SetColForegroundColour(self.activitygrid, time_very_late_col, colourlist[very_late][1])
+        self.SetColBackgroundColour(self.activitygrid, time_very_late_col, colourlist[very_late][2])
+        self.SetColForegroundColour(self.activitygrid, time_late_col, colourlist[late][1])
+        self.SetColBackgroundColour(self.activitygrid, time_late_col, colourlist[late][2])
 
         editor = wxGridCellChoiceEditor(["Initiated", "Draft", "Approved", "Released"], False)
 #        print "editor", editor

From waterbug at ned.gsfc.nasa.gov  Mon Oct 27 16:44:20 2003
From: waterbug at ned.gsfc.nasa.gov (waterbug CVS)
Date: Mon Oct 27 16:44:21 2003
Subject: [Pangalactic-commits] Fixes to fk dictionary inits.
Message-ID: <200310272144.h9RLiKZA012819@ned.gsfc.nasa.gov>

Modified files:
PanGalactic/pangalactic/repo/registry.py 1.34 1.35

Log message:
Fixes to fk dictionary inits.


Index: PanGalactic/pangalactic/repo/registry.py
diff -u PanGalactic/pangalactic/repo/registry.py:1.34 PanGalactic/pangalactic/repo/registry.py:1.35
--- PanGalactic/pangalactic/repo/registry.py:1.34	Sun Oct  5 17:31:49 2003
+++ PanGalactic/pangalactic/repo/registry.py	Mon Oct 27 16:44:18 2003
@@ -1,9 +1,9 @@
 """
 Pan Galactic Engineering Repository Object Registry
-@version: $Revision: 1.34 $
+@version: $Revision: 1.35 $
 """
  
-__version__ = "$Revision: 1.34 $"[11:-2]
+__version__ = "$Revision: 1.35 $"[11:-2]
 # $Source: /repo/step_testbed/PanGalactic/pangalactic/repo/registry.py,v $
 
 import string, re
@@ -115,7 +115,7 @@
         - key   = view name (PostgreSQL 'relname')
         - value = view columns (a list)
 
-    @ivar constraint_fkey_maps:
+    @ivar constraint_fk_maps:
         - key   = fkey constraint names that point to tables 
                   corresponding to referenced objects
         - value = dictionary with:
@@ -185,7 +185,7 @@
         # build table_* dictionaries ...
         self.table_cols = {}
         self.table_pkeys = {}
-        self.constraint_fkey_maps = {}
+        self.constraint_fk_maps = {}
         self.refd_obj_fk_constraints = {}
         self.obj_init_parms = {}
         self.obj_nonkey_attrs = {}
@@ -222,7 +222,7 @@
             for item in result:
                 self.table_pkeys[tablename].append(item[0])
             # now populate:
-            # (1) self.constraint_fkey_maps[constrname] dictionary
+            # (1) self.constraint_fk_maps[constrname] dictionary
             # (2) self.obj_init_parms[classname] dictionary
             # (3) self.obj_nonkey_attrs[classname] dictionary
             # (2 and 3 are really where the action is ...)
@@ -236,15 +236,14 @@
                 # compute foreign key constraint names ...
                 # print '\n ** computing fk const names for %s\n' % classname
                 std_abbrev = self.pgerdb_classes[classname]._std_abbrev
-                for att in self.refd_objs:
+                for att in self.refd_objs[classname]:
                     constrname = std_abbrev + '_has' + att
+                    sqlcmd = """SELECT tgargs FROM pg_trigger WHERE tgrelid = %s AND """
+                    sqlcmd += """tgconstrname = %s"""
                     # DEBUGGING
-                    # sql = """SELECT tgargs FROM pg_trigger WHERE tgrelid = %s AND \
-                    #                 tgconstrname = %s""" % (oid, constrname)
                     # print '\n ** executing query:'
-                    # print '      %s\n' % sql
-                    curs.execute("""SELECT tgargs FROM pg_trigger WHERE tgrelid = %s AND \
-                                    tgconstrname = %s""", (oid, constrname))
+                    # print '"      %s", (%s, %s)' % (sql, oid, constrname)
+                    curs.execute(sqlcmd, (oid, constrname))
                     result = curs.fetchall()
                     # check whether there is a result here:
                     # the refd_obj could be just a
@@ -253,7 +252,7 @@
                     # name, and no foreign keys.
                     if result:
                         self.refd_obj_fk_constraints[(classname, att)] = constrname
-                        self.constraint_fkey_maps[constrname] = {}
+                        self.constraint_fk_maps[constrname] = {}
                         constr_string = str(result[0][0])
                         constr_list = constr_string.split('\x00')
                         # trim off constraint name, table names,
@@ -267,12 +266,12 @@
                         # the corresponding cols in the
                         # referenced table.
                         while constr_list:
-                            self.constraint_fkey_maps[constrname][constr_list[0]] = constr_list[1]
+                            self.constraint_fk_maps[constrname][constr_list[0]] = constr_list[1]
                             constr_list = constr_list[2:]
                         # add all fkeys in this constraint to the
                         # init parm list (if they aren't already
                         # there).
-                        for k in self.constraint_fkey_maps[constrname]:
+                        for k in self.constraint_fk_maps[constrname]:
                             if k not in obj_init_parm_list:
                                 obj_init_parm_list.append(k)
                         # DEBUG: 

From bmuir at ned.gsfc.nasa.gov  Tue Oct 28 15:00:14 2003
From: bmuir at ned.gsfc.nasa.gov (bmuir CVS)
Date: Tue Oct 28 15:00:16 2003
Subject: [Pangalactic-commits] fixed pgefobject isempty to ignore pgef_class
Message-ID: <200310282000.h9SK0Ed7025185@ned.gsfc.nasa.gov>

Modified files:
PanGalactic/pangalactic/client/tests/test_itemeditframe.py 1.11 1.12
PanGalactic/pangalactic/client/tests/test_pgefobject.py 1.6 1.7
PanGalactic/pangalactic/enterprise/pgefobject.py 1.29 1.30

Log message:
fixed pgefobject isempty to ignore pgef_class


Index: PanGalactic/pangalactic/client/tests/test_pgefobject.py
diff -u PanGalactic/pangalactic/client/tests/test_pgefobject.py:1.6 PanGalactic/pangalactic/client/tests/test_pgefobject.py:1.7
--- PanGalactic/pangalactic/client/tests/test_pgefobject.py:1.6	Thu Oct 16 14:10:05 2003
+++ PanGalactic/pangalactic/client/tests/test_pgefobject.py	Tue Oct 28 15:00:13 2003
@@ -33,7 +33,7 @@
     def testIsEmpty(self):
         """Check to see that the IsEmpty returns true when the object is empty"""
         result = self.obj1.IsEmpty()
-        assert result == 1 , 'New object should have been empty'
+        assert result == True , 'New object should have been empty'
         
     def testIsNotEmpty(self):
         """Check to see that the IsEmpty returns false when the object is empty"""

Index: PanGalactic/pangalactic/enterprise/pgefobject.py
diff -u PanGalactic/pangalactic/enterprise/pgefobject.py:1.29 PanGalactic/pangalactic/enterprise/pgefobject.py:1.30
--- PanGalactic/pangalactic/enterprise/pgefobject.py:1.29	Mon Oct 27 15:02:45 2003
+++ PanGalactic/pangalactic/enterprise/pgefobject.py	Tue Oct 28 15:00:13 2003
@@ -1,8 +1,8 @@
-# $Id: pgefobject.py,v 1.29 2003/10/27 20:02:45 waterbug Exp $
+# $Id: pgefobject.py,v 1.30 2003/10/28 20:00:13 bmuir Exp $
 
 """
 The Mother of all PGEF application classes.
-@version: $Revision: 1.29 $
+@version: $Revision: 1.30 $
 """
 
 # TODO:
@@ -24,7 +24,7 @@
 #               should we jettison this?
 #               Nope.
 
-__version__ = "$Revision: 1.29 $"[11:-2]
+__version__ = "$Revision: 1.30 $"[11:-2]
 
 import types
 import string
@@ -421,6 +421,8 @@
         for a in self._schema:
             value = self.__dict__[a]
             if a in self._excluded_fields:
+                pass
+            elif a == 'pgef_class':
                 pass
             elif (isinstance(value, types.StringType) 
             and value <> "0"

Index: PanGalactic/pangalactic/client/tests/test_itemeditframe.py
diff -u PanGalactic/pangalactic/client/tests/test_itemeditframe.py:1.11 PanGalactic/pangalactic/client/tests/test_itemeditframe.py:1.12
--- PanGalactic/pangalactic/client/tests/test_itemeditframe.py:1.11	Wed Jun 25 03:43:51 2003
+++ PanGalactic/pangalactic/client/tests/test_itemeditframe.py	Tue Oct 28 15:00:13 2003
@@ -4,7 +4,7 @@
 from pangalactic.client.support import psmstate
 from pangalactic.utils import datamanager
 from pangalactic.utils import localdb
-
+from pangalactic.utils import securitymanager
 #import pangalactic.enterprise.productmodelmaster
 import pangalactic.enterprise.document as document
 import pangalactic.enterprise.partslist as partslist
@@ -26,14 +26,14 @@
     
     def testCreateItemEditFrame(self):
         #print 'test create'
+        app = wxPySimpleApp()
         self.itemeditform = None
         self.DisplayWgts = wxFrame(None, -1, 'Display Widget')
         testframe = wxFrame(None, -1, 'Test Frame')
         testframe.State = psmstate.PSMState()
-        #testframe.State = psmstate.PSMState()
-        #testframe.dm = datamanager.DataManager(testframe, true)
-        #nodedata = (None, None)
-        #self.itemeditform = itemeditframe.ItemEditFrame(testframe, testframe.State, 0, 1, nodedata, testframe.dm)
+        testframe.dm = datamanager.DataManager(testframe, true)
+        nodedata = (None, None)
+        self.itemeditform = itemeditframe.ItemEditFrame(testframe, testframe.State, 0, 1, nodedata, testframe.dm)
         #self.itemeditform.SetDisplayWgt(self.DisplayWgts)
         #testframe.dm.localDB.Commit()
        
@@ -299,6 +299,10 @@
         testframe = wxFrame(None, -1, 'Test Frame')
         testframe.State = psmstate.PSMState()
         testframe.dm = datamanager.DataManager(testframe, true)
+        testframe.dm.serverName = 'ned.gsfc.nasa.gov'
+        testframe.dm.serverPort = '8080'
+        testframe.dm.createServer()
+        testframe.WatchDog = securitymanager.SecurityManager(testframe.dm)
         result = testframe.dm.login('tstuser','test')
         testframe.dm.fillProjectList()
         testframe.dm.localDB.Commit()

From pbear at ned.gsfc.nasa.gov  Tue Oct 28 16:53:03 2003
From: pbear at ned.gsfc.nasa.gov (pbear CVS)
Date: Tue Oct 28 16:53:05 2003
Subject: [Pangalactic-commits] small bugfixes
Message-ID: <200310282153.h9SLr36i027083@ned.gsfc.nasa.gov>

Modified files:
PanGalactic/pangalactic/client/fnord.py 1.66 1.67
PanGalactic/pangalactic/client/modules/psm/psmtool.py 1.123 1.124
PanGalactic/pangalactic/enterprise/workflow/wfinstanceoverview.py 1.9 1.10
PanGalactic/pangalactic/utils/datamanager.py 1.51 1.52
PanGalactic/pangalactic/utils/dbbrowser.py 1.4 1.5
PanGalactic/pangalactic/utils/localdb.py 1.43 1.44
PanGalactic/pangalactic/utils/xmlrpcinterface.py 1.25 1.26

Log message:
small bugfixes


Index: PanGalactic/pangalactic/utils/dbbrowser.py
diff -u PanGalactic/pangalactic/utils/dbbrowser.py:1.4 PanGalactic/pangalactic/utils/dbbrowser.py:1.5
--- PanGalactic/pangalactic/utils/dbbrowser.py:1.4	Mon Oct 27 15:41:41 2003
+++ PanGalactic/pangalactic/utils/dbbrowser.py	Tue Oct 28 16:53:01 2003
@@ -8,15 +8,17 @@
 
 from wxPython.wx import *
 from wxPython.grid import *
-from dbbrowser_wdr import *
-import configdbbrowser
+
 import ZODB
 from ZODB import FileStorage, DB
 from ZODB import *
+
 import types
 
-import pprint
-import toolframe
+import pangalactic.utils.toolframe as toolframe
+
+from pangalactic.utils.dbbrowser_wdr import *
+import pangalactic.utils.configdbbrowser as configdbbrowser
 
 DEBUG = 1
 DISPLAY_CONFIG = "display_config"
@@ -70,18 +72,22 @@
         if gridrows > 0:
             self.grid.DeleteRows(0, gridrows)
 
+
     # WDR: handler implementations for zodbbrowser
     def OnClose(self, event):
         self.Parent.Close()
 
+
     def OnRefresh(self, event = None):
         self.ClearGrid()        
         self.FillGrid()
+
             
     def SetDBFile(self, file = None):
         if file:
             self.dbfile = file
 
+
     def AddMenuForStandalone(self):
         mb = self.GetParent().GetMenuBar()
         menu = mb.GetMenu(mb.FindMenu('File'))
@@ -98,11 +104,13 @@
         EVT_MENU(self.Parent, self.FILECLOSE, self.FileClose)
         EVT_MENU(self.Parent, self.FILECONFIG, self.FileConfig)
         
+
     def GetDisplayConfig(self):
         if self.dbroot:
             if self.dbroot.has_key(configdbbrowser.DISPLAY_CONFIG):
                 if self.dbroot[configdbbrowser.DISPLAY_CONFIG]:
                     self.current_config = self.dbroot[configdbbrowser.DISPLAY_CONFIG]
+
         
     def FileOpen(self, event = None):
         wildcard = "ZODB FileStorage (*.fs)|*.fs|" \
@@ -118,9 +126,8 @@
             if self.dbroot.has_key(configdbbrowser.DISPLAY_CONFIG):
                 self.current_config = self.dbroot[configdbbrowser.DISPLAY_CONFIG]
             self.FillChoice()
-            #self.FillGrid()
-
         dlg.Destroy()
+
     
     def FileClose(self, event = None):
         self.dbconnection.close()
@@ -131,6 +138,7 @@
         self.storage = None
         self.ClearGrid()
         self.GetRootitems().Clear()
+
         
     def FileConfig(self, event = None):
         collection_name = self.GetRootitems().GetStringSelection()
@@ -141,6 +149,7 @@
                                                               collection_name = collection_name)
         testframe.CentreOnParent()
         testframe.Show(true)
+
         
     def ResetCols(self, selection):
         if self.current_config.has_key(selection):
@@ -153,7 +162,6 @@
 
             for col in range(len(mapping)):
                 self.grid.SetColLabelValue(col, mapping[col][1])
-        
         
         
     def FillGrid(self, event = None):

Index: PanGalactic/pangalactic/utils/localdb.py
diff -u PanGalactic/pangalactic/utils/localdb.py:1.43 PanGalactic/pangalactic/utils/localdb.py:1.44
--- PanGalactic/pangalactic/utils/localdb.py:1.43	Thu Oct 23 15:06:20 2003
+++ PanGalactic/pangalactic/utils/localdb.py	Tue Oct 28 16:53:01 2003
@@ -77,28 +77,28 @@
     
     #the first part of the tuple is the dict name, the second field is a flag
     #that tells us whether the dict is to be cleared when we call clear localdb
-    dictlist = [ (ITEMDICT,1), 
-                 (NAUODICT,1), 
-                 (PARTSLISTDICT,1), 
-                 (DOCUMENTDICT,1), 
-                 (UNCOMMITTEDOBJECTS,1), 
-                 (PDRDICT,1), 
-                 (DFRDICT,1), 
-                 (DCUDICT,1), 
-                 (PCUDICT,1), 
-                 (ACUDICT,1), 
-                 (PFRDICT,1), 
-                 (PLFRDICT,1), 
-                 (FFILEDICT,1), 
-                 (PRODUCTVERSION,1), 
+    dictlist = [ (ITEMDICT, 1), 
+                 (NAUODICT, 1), 
+                 (PARTSLISTDICT, 1), 
+                 (DOCUMENTDICT, 1), 
+                 (UNCOMMITTEDOBJECTS, 1), 
+                 (PDRDICT, 1), 
+                 (DFRDICT, 1), 
+                 (DCUDICT, 1), 
+                 (PCUDICT, 1), 
+                 (ACUDICT, 1), 
+                 (PFRDICT, 1), 
+                 (PLFRDICT, 1), 
+                 (FFILEDICT, 1), 
+                 (PRODUCTVERSION, 1), 
                  (PRODUCTMASTER, 1), 
-                 (PRODUCTMODELMASTER,1), 
-                 (PRODUCTMODELVERSION,1), 
-                 (UNCOMMITTEDDOCUMENTIDS,1), 
+                 (PRODUCTMODELMASTER, 1), 
+                 (PRODUCTMODELVERSION, 1), 
+                 (UNCOMMITTEDDOCUMENTIDS, 1), 
                  (USER, 0),
-                 (ROLES,0),
-                 (PDRMAP,0),
-                 (PROJECTOBJECTS,0),
+                 (ROLES, 0),
+                 (PDRMAP, 0),
+                 (PROJECTOBJECTS, 0),
                  (PMBYPRIMARYKEY, 1),
                  (PVBYPRIMARYKEY, 1),
                  (PMMBYPRIMARYKEY, 1),

Index: PanGalactic/pangalactic/client/fnord.py
diff -u PanGalactic/pangalactic/client/fnord.py:1.66 PanGalactic/pangalactic/client/fnord.py:1.67
--- PanGalactic/pangalactic/client/fnord.py:1.66	Fri Oct 24 14:52:48 2003
+++ PanGalactic/pangalactic/client/fnord.py	Tue Oct 28 16:53:00 2003
@@ -138,14 +138,14 @@
         self.mytext.SetBackgroundColour('Red')
         self.hsizer.Add(self.mytext, wxALIGN_TOP | wxEXPAND)
         
-        self.statuspanel.SetAutoLayout(true)
+        self.statuspanel.SetAutoLayout(True)
         self.statuspanel.SetSizer(self.hsizer)
         
-        self.sizeChanged = false
+        self.sizeChanged = False
         EVT_SIZE(self, self.OnSize)
         EVT_IDLE(self, self.OnIdle)
         self.Reposition()
-        self.sizeChanged = true
+        self.sizeChanged = True
         
     def SetMsg(self, msgtext):
         self.SetStatusText(" " + msgtext, 1)
@@ -168,7 +168,7 @@
         # Set a flag so the idle time handler will also do the repositioning.
         # It is done this way to get around a buglet where GetFieldRect is not
         # accurate during the EVT_SIZE resulting from a frame maximize.
-        self.sizeChanged = true
+        self.sizeChanged = True
 
     def OnIdle(self, evt):
         if self.sizeChanged:
@@ -180,7 +180,7 @@
         self.statuspanel.SetPosition(wxPoint(rect.x+2, rect.y+2))
         rsize = wxSize(rect.width-4, rect.height-4)
         self.statuspanel.SetSize(rsize)
-        self.sizeChanged = false    
+        self.sizeChanged = False    
         
 class MainFrame(wxFrame):
     """This class encapsulates the main client window"""
@@ -188,13 +188,13 @@
         wxFrame.__init__(self, parent, ID, title,pos, size)
 
         try:
-            self.WorkInProgress = false
+            self.WorkInProgress = False
             self.SearchFrame = None
             self.MyStuffFrame = None
             self.CacheFrame = None
             self.psmtool = None
             self.State = PgefState()
-            self.Closing = false
+            self.Closing = False
             self.ImportPartsListFrame = None
             wxInitAllImageHandlers()
             self.SpecialMenu = None
@@ -266,7 +266,7 @@
             
             showloginconfirm = preferences.GetPreference('ShowLoginConfirmation')
             if showloginconfirm == None:
-                showloginconfirm = true
+                showloginconfirm = True
             self.menuBar.Check(ID_PREF_SHOWLOGINCONFIRMED, int(showloginconfirm))
             
             if not preferences.GetPreference('userid'):
@@ -293,7 +293,7 @@
             
                 sizer.AddSizer(box, 0, wxALIGN_CENTER_VERTICAL|wxALL, 5)
                 dlg.SetSizer(sizer)
-                dlg.SetAutoLayout(true)
+                dlg.SetAutoLayout(True)
                 sizer.Fit(dlg)
     
                 dlg.CentreOnParent()
@@ -311,7 +311,7 @@
 
             self.ActivateTool(ID_TOOL_PSM)
             self.OnServerCombo()
-            wxToolTip_Enable(false)
+            wxToolTip_Enable(False)
 
         except datamanager.LocalStorageError:
             noZODBdlg = wxMessageDialog(self, "PGEF is already running or the local cache is corrupt",
@@ -319,7 +319,7 @@
             noZODBdlg.CentreOnParent()
             noZODBdlg.ShowModal() 
             noZODBdlg.Destroy()
-            self.Close(true)
+            self.Close(True)
             
 
     def SetGaugeRange(self, value):
@@ -368,11 +368,11 @@
         submenu.Append(ID_FILE_EXPORT_PROPERTIES, "&Properties...", "Export properties to a spreadsheet")
         submenu.Append(ID_TOOL_GRIDTOPDF, "&Table Data...", "Export grid data to a PDF file")
         menu.AppendMenu(ID_FILE_EXPORT, "&Export", submenu)
-        menu.Enable(ID_FILE_EXPORT, false)
+        menu.Enable(ID_FILE_EXPORT, False)
 
         menu.Append(ID_FILE_LOGIN, "Log&in", "Login; leave local mode")
         menu.Append(ID_FILE_LOGOUT, "Log&out", "Logout; return to local mode")
-        menu.Enable(ID_FILE_LOGOUT, false)
+        menu.Enable(ID_FILE_LOGOUT, False)
         menu.AppendSeparator()
         menu.Append(ID_FILE_EXIT, "E&xit", "Terminate the program")
         self.menuBar.Append(menu, "&File")
@@ -392,23 +392,23 @@
         menu.AppendSeparator()
 
         menu.Append(ID_TOOL_SEARCH, "&Search...", "Search the database")
-        menu.Enable(ID_TOOL_SEARCH, false)        
+        menu.Enable(ID_TOOL_SEARCH, False)        
         menu.Append(ID_TOOL_DBBROWSER, "Local Database &Browser...", "Browse the local database dictionaries")
         self.menuBar.Append(menu, "&Tools")
 
         menu = wxMenu()
         menu.Append(ID_FILE_COMMIT, "&Commit Changes", "Commit changes to database")
-        menu.Enable(ID_FILE_COMMIT, false)
+        menu.Enable(ID_FILE_COMMIT, False)
         menu.Append(ID_TOOL_CHECKOUT, "Get &Marked Items", "Get items for local mode")
         menu.Append(ID_TOOL_GETMYSTUFF, "&View My Stuff...", "View anything that's mine")
-        menu.Enable(ID_TOOL_GETMYSTUFF, false)        
+        menu.Enable(ID_TOOL_GETMYSTUFF, False)        
         menu.Append(ID_PREF_SERVER1, '&Repository...', 'What repository do I use?')
         self.menuBar.Append(menu, "&Repository")
 
         # Cache menu
         menu = wxMenu()
         menu.Append(ID_TOOL_VIEW_CHECKEDOUT, "&View Marked Data...", "Show marked data checked out from repository")
-        menu.Append(ID_PREF_CLEAR_LOCALDB, '&Clear Local Database', 'Clear locally stored data', false)
+        menu.Append(ID_PREF_CLEAR_LOCALDB, '&Clear Local Database', 'Clear locally stored data', False)
 #        menu.AppendSeparator()
         menu.Append(ID_TOOL_DBBROWSER, "Local Database &Browser...", "Browse the local database dictionaries")
         self.menuBar.Append(menu, "&Cache")
@@ -418,15 +418,15 @@
         submenu = wxMenu()
 #        # Options.Preferences submenu
 #        submenu = wxMenu()
-        submenu.Append(ID_PREF_TOOLTIPS, 'Show &Tooltips', 'Turn on/off flyover help', true)
-        submenu.Append(ID_PREF_SHOWLOGINCONFIRMED, 'Show Login Confirmation', 'Show/hide login confirmation', true)
+        submenu.Append(ID_PREF_TOOLTIPS, 'Show &Tooltips', 'Turn on/off flyover help', True)
+        submenu.Append(ID_PREF_SHOWLOGINCONFIRMED, 'Show Login Confirmation', 'Show/hide login confirmation', True)
         submenu.Append(ID_PREF_OUTPUTDIR, 'Set Output Directory...', 'Where do my reports go?')
 #        menu.AppendMenu(ID_PREFS, '&Preferences', submenu)
         # Options.Settings submenu
 #        submenu = wxMenu()
         submenu.Append(ID_PREF_PROXY, '&Proxy...', 'Set your proxy (if any)')
         submenu.Append(ID_PREF_SERVER2, '&Repository...', 'What repository do I use?')
-        submenu.Append(ID_PREF_USERID, '&Userid...', 'Set the locally stored userid', false)
+        submenu.Append(ID_PREF_USERID, '&Userid...', 'Set the locally stored userid', False)
 #        menu.AppendMenu(ID_PREFS, '&Settings', submenu)
 
 #        self.menuBar.Append(menu, "&Options")                
@@ -457,13 +457,13 @@
         if self.DataManager.inLocalMode:
             #print "localmode"
             self.psmtool.SetupForLocalMode()
-            self.sb.ShowImage(false)
+            self.sb.ShowImage(False)
 
         else:
             #print "loginmode"
-            self.menuBar.Enable(ID_FILE_LOGIN, true)
+            self.menuBar.Enable(ID_FILE_LOGIN, True)
             self.psmtool.SetupForLogin()
-            self.sb.ShowImage(true)
+            self.sb.ShowImage(True)
                     
     def OnCheckout(self, event):
         """Wrapper method that calls the tools Checkout method"""
@@ -530,9 +530,9 @@
         id = event.GetId()
         checked = self.menuBar.FindItemById(id).IsChecked()
         if checked:
-            wxToolTip_Enable(true)
+            wxToolTip_Enable(True)
         else:
-            wxToolTip_Enable(false)
+            wxToolTip_Enable(False)
         event.Skip()
         
     def OnLoginConfirmed(self, event):
@@ -540,9 +540,9 @@
         checked = self.menuBar.FindItemById(id).IsChecked()
 #        print 'pref in menu is %s' % checked
         if checked:
-            preferences.prefs['ShowLoginConfirmation'] = true
+            preferences.prefs['ShowLoginConfirmation'] = True
         else:
-            preferences.prefs['ShowLoginConfirmation'] = false
+            preferences.prefs['ShowLoginConfirmation'] = False
             
         preferences.CreatePreferencesFile(preferences.prefs)
 
@@ -653,7 +653,7 @@
         testframe.mainpanel = dbbrowser.zodbbrowser(testframe, -1, zodbroot = self.DataManager.dbroot)
         testframe.mainpanel.FillChoice()
         testframe.CentreOnParent()
-        testframe.Show(true)
+        testframe.Show(True)
         
     def OnTesting(self, event):
         pass
@@ -675,7 +675,7 @@
             if not self.SearchFrame:
                 self.SearchFrame = searchframe.SearchFrame(self, -1, 'Search', datamanager = self.DataManager)
                 self.SearchFrame.CentreOnParent()
-                self.SearchFrame.Show(true)
+                self.SearchFrame.Show(True)
                 EVT_CLOSE(self.SearchFrame, self.CloseSearchFrame)
                 self.SearchFrame.GetMyStuff()
             else:                
@@ -685,7 +685,7 @@
 #        print self.SearchFrame
         if self.SearchFrame:
 #            print 'in searchframe close'
-            self.SearchFrame.Show(false)
+            self.SearchFrame.Show(False)
             self.SearchFrame = None
         
                 
@@ -696,7 +696,7 @@
         self.psmtool.CloseTool(event)
         self.psmtool = None
         self.SetTitle(PGEF_TITLE)
-        self.psmtool.Show(true)
+        self.psmtool.Show(True)
         self.psmtool.UpdateMenuBar()
 
 
@@ -709,7 +709,7 @@
         dlg.GetVersion().SetLabel(str(VERSION))
         dlg.GetBuildDate().SetLabel(str(BUILD_DATE))
         dlg.CentreOnParent()
-        dlg.Show(true)
+        dlg.Show(True)
     
     def RemoveSpecialMenu(self, userinfo):
         if self.SpecialMenu and userinfo.god_flag:
@@ -725,11 +725,11 @@
         if userinfo.god_flag:
             if self.SpecialMenu == None:
                 self.SpecialMenu = wxMenu()
-                self.SpecialMenu.Append(ID_PGTEST_ITEM, "&Test Mode", "Not Implemented", true)
-                self.SpecialMenu.Append(ID_PGDEV_ITEM, "De&velopment Mode", "Not Implemented", true)
-                self.SpecialMenu.Append(ID_PGPROD_ITEM, "&Production Mode", "Not Implemented", true)
-                self.SpecialMenu.Append(ID_PGPLAY_ITEM, "P&lay Mode", "Not Implemented", true)
-                self.SpecialMenu.Append(ID_PGDEMO_ITEM, "&Demonstration Mode", "Not Implemented", true)
+                self.SpecialMenu.Append(ID_PGTEST_ITEM, "&Test Mode", "Not Implemented", True)
+                self.SpecialMenu.Append(ID_PGDEV_ITEM, "De&velopment Mode", "Not Implemented", True)
+                self.SpecialMenu.Append(ID_PGPROD_ITEM, "&Production Mode", "Not Implemented", True)
+                self.SpecialMenu.Append(ID_PGPLAY_ITEM, "P&lay Mode", "Not Implemented", True)
+                self.SpecialMenu.Append(ID_PGDEMO_ITEM, "&Demonstration Mode", "Not Implemented", True)
                 self.SpecialMenu.AppendSeparator()
                 self.SpecialMenu.Append(ID_TOOL_DBBROWSER, "D&B Browser...")
             self.menuBar.Insert(self.SpecialPos, self.SpecialMenu, "Special") 
@@ -737,7 +737,7 @@
             self.menuBar.Refresh()
 
     def OnLogout(self, event):
-        self.DataManager.user._loggedin = false
+        self.DataManager.user._loggedin = False
         self.menuBar.Enable(ID_FILE_LOGIN, not self.DataManager.user._loggedin)
         self.menuBar.Enable(ID_FILE_LOGOUT, self.DataManager.user._loggedin)
         self.menuBar.Enable(ID_FILE_COMMIT,self.DataManager.user._loggedin) 
@@ -751,15 +751,15 @@
         self.menuBar.Enable(ID_TOOL_CHECKOUT, self.DataManager.user._loggedin)
 
         self.sb.SetServer('Local')
-        self.DataManager.inLocalMode = true
-        self.DataManager.user._loggedin = false
+        self.DataManager.inLocalMode = True
+        self.DataManager.user._loggedin = False
         self.OnServerCombo()
 
     def OnLogin(self, event):
         loginconfirm = preferences.GetPreference('ShowLoginConfirmation')
         dialog = LoginClass(self, -1, "PGEF Login" )
         if loginconfirm == None:
-            loginconfirm = true
+            loginconfirm = True
             
         dialog.GetCheckboxConfirmed().SetValue(int(loginconfirm))
         
@@ -790,13 +790,13 @@
             msg = wxStaticText(dlg, -1, "Please wait while PGEF validates your login...",
                                wxPoint (10, 10), wxDefaultSize, wxALIGN_CENTRE)
             dlg.CentreOnParent()
-            dlg.Show(true)
+            dlg.Show(True)
             wxSafeYield()
 
             if self.DataManager.login(self.DataManager.user.id, self.DataManager.user._Password):
                 self.DataManager.fillProjectList()
-                self.DataManager.user._loggedin = true
-                self.DataManager.inLocalMode = false
+                self.DataManager.user._loggedin = True
+                self.DataManager.inLocalMode = False
                 self.RemoveSpecialMenu(self.DataManager.user)
                 loggedin = self.DataManager.user._loggedin
                 self.menuBar.Enable(ID_PREF_PROXY, not loggedin)
@@ -812,7 +812,7 @@
                 self.menuBar.Enable(ID_PREF_CLEAR_LOCALDB, loggedin)
 
                 self.sb.SetServer('Repository: ' + self.DataManager.serverName)
-                self.sb.ShowImage(true)
+                self.sb.ShowImage(True)
 
                 self.psmtool.UpdateForLogin()
                     
@@ -864,15 +864,15 @@
 
                 self.CloseSearchFrame()
                 self.CloseTools(event)
-                self.Closing = true
-                self.Close(true)
+                self.Closing = True
+                self.Close(True)
             else:
                 dlg = wxMessageDialog(self, "Discard uncommitted changes?",
                                   "About Me", wxOK | wxCANCEL | wxICON_EXCLAMATION)
                 dlg.CentreOnParent()
                 if dlg.ShowModal() == wxID_OK:
                     self.CloseTools()
-                    self.Close(true)
+                    self.Close(True)
                 else:
                     event.Skip()
                 dlg.Destroy()
@@ -883,7 +883,7 @@
             return
             
         if self.psmtool:
-            self.psmtool.Show(true)
+            self.psmtool.Show(True)
         else:
             pos = wxPoint(0,0)
             self.psmtool = psmtool.CreateTool(self, self.DataManager, -1, pos, wxSize(1,1))
@@ -901,7 +901,7 @@
         tbh = self.GetToolBar().GetSizeTuple()[1]
         pos = wxPoint (0, tbh)
         ndx = 0
-        found = false
+        found = False
 
         if sys.platform == 'win32':
             tbh = self.GetToolBar().GetSizeTuple()[1]
@@ -920,11 +920,11 @@
     def OnInit(self):
         self.frame = MainFrame(NULL, -1, PGEF_TITLE, wxDefaultPosition, wxSize(800, 600))
         self.frame.CentreOnParent()                              
-        self.frame.Show(true)
+        self.frame.Show(True)
 
         self.SetTopWindow(self.frame)
         self.frame.ConfigureStatusBar(self.frame.sb.GetSizeTuple()[0])
-        return true
+        return True
 
 #----------------------------------------------------------------------------
 

Index: PanGalactic/pangalactic/client/modules/psm/psmtool.py
diff -u PanGalactic/pangalactic/client/modules/psm/psmtool.py:1.123 PanGalactic/pangalactic/client/modules/psm/psmtool.py:1.124
--- PanGalactic/pangalactic/client/modules/psm/psmtool.py:1.123	Mon Oct 27 15:41:40 2003
+++ PanGalactic/pangalactic/client/modules/psm/psmtool.py	Tue Oct 28 16:53:00 2003
@@ -9,7 +9,7 @@
 This module is the main application code for the pgef client interface
 """
 
-__version__ = "$Revision: 1.123 $"[11:-2]
+__version__ = "$Revision: 1.124 $"[11:-2]
 
 import os
 import sys
@@ -188,9 +188,7 @@
         hbox = wxBoxSizer(wxVERTICAL)
         
         choice_list = ["default", "requirements", "functions", "simulations"]
-
         self.view = wxChoice(self.leftPanel, ID_CHOICE_VIEW, wxPoint(90, 50), wxSize(95, -1), choice_list)
-
         hbox.Add(self.view, 0, wxEXPAND)
         
         self.tree_notebook = wxNotebook(self.leftPanel, -1, wxDefaultPosition, wxSize(200,200)) 
@@ -369,7 +367,6 @@
                 edlg.CentreOnParent()
                 edlg.ShowModal()
                 edlg.Destroy()
-                
         else:
             edlg = wxMessageDialog(self, "No properties were found for export.",
                                    "Export Properties Error",
@@ -384,13 +381,8 @@
         if node.IsOk():
             tree.SelectItem(node)
 
-        menu = wxMenu()
-
         # popup help seems to be ignored....  grrrr
-#        if self.DataManager.user._loggedin:
-#            menu.Append(ID_TREE_RIGHTPOPUP_TOPLEVEL, 'Show Top Level Items', "Display the default hierarchy")
-#            menu.SetHelpString(ID_TREE_RIGHTPOPUP_TOPLEVEL, "Display the toplevel hierarchy")
-            
+        menu = wxMenu()
         menu.Append(ID_TREE_RIGHTPOPUP_EDIT, 'Edit...', "Edit this product")
         menu.Append(ID_TREE_RIGHTPOPUP_SHOWPROJECT, 'View Project Data...', "View project data")
         menu.Append(ID_TREE_RIGHTPOPUP_DUMPTOPDF, 'Generate PDF...', 'Show the PDF creation options')
@@ -448,10 +440,8 @@
             itemndx = self.topWindow.toppanel.GetItemWidget().GetSelection()
             if itemndx > 0:
                 itemndx -= 1
-                #self.tree.DeleteAllItems()
                 itemobj = self.topWindow.toppanel.GetItemObject(itemndx)
                 self.showItem(itemobj)
-                #self.ShowTopLevelItems()
         
     def CloseSearchFrame (self, event = None):
         if self.SearchFrame:
@@ -626,7 +616,10 @@
             self.ShowCheckedOutGrid()
         
 
-    def CheckoutObjects(self, obj_ids, doc_ids, pl_ids, checkout_time = None, get_partslists = None, get_documents = None):
+    def CheckoutObjects(self, obj_ids, doc_ids, pl_ids,
+                        checkout_time = None,
+                        get_partslists = None,
+                        get_documents = None):
         retval = None
         if checkout_time == None:
             checkout_time = time.localtime()
@@ -905,14 +898,11 @@
     def OnTreeActivate(self, event):
         #print "psmtool.ontreeactivate"
         treeobj = self.tree.GetPyData(event.GetItem())
-        #print "treedata", treeobj
         nauoid = treeobj[0]
         itemid = treeobj[1]
         if nauoid == None and itemid == None:
             raise ValueError, "No data"
 
-#        treeobj = self.DataManager.localDB.GetItem(itemid)
-#        print "ontreeactivate: " + treeobj.Name
         self.SelectGridRowByItemId(itemid)
 
     def SelectGridRowByItemId(self, itemid):
@@ -935,44 +925,32 @@
         
         #bryan
         if self.DataManager.uncommittedData():
-
-           #self.DataManager.DebugUnsavedNauoIDs()
-           #self.DataManager.DebugUnsavedItemIDs()
-                          
            dlg = wxMessageDialog(self, "You have uncommitted changes.  Shall I commit them?",
                                  "Warning: Data Loss Imminent", wxYES_NO | wxYES_DEFAULT | wxICON_EXCLAMATION)
-
            if dlg.ShowModal() == wxID_YES:
                self.Commit(closing)
                
 
-    def showItem(self, itemobj):  #ndx):
+    def showItem(self, itemobj):
         #print "psmtool.showitem"
-#        itemid = self.itemgrid.GetObjectOid(ndx)
         itemid = itemobj.pgef_oid
         self.State.treeroot = itemid
         # revisit, may be deprecated due to performance junk
         self.State.currentitem = itemid
 
-#        self.itemgrid.SelectRow(ndx)
         self.tree.DeleteAllItems() 
         self.DataManager.clearNauoIDs()
 
         if self.DataManager.user._loggedin:
-            #print "logged in"
             self.DataManager.getNAUOByAssemblyID([itemid])
-            #print 'psmtool.itemclick call load tree from objects'
-            print "Should the project be the tree root?"
+            print "Should the project be the tree root when logged in?"
             self.tree.LoadTreefromObjects(self, itemid)
 
         elif self.inLocalMode():
             #print "local mode"
-#            itemobj = self.DataManager.localDB.GetItem(itemid)  # commented out - not used? vwk
-#            roottreenode = self.tree.GetRootItem()              # commented out - not used? vwk
             wgt = self.topWindow.toppanel.GetProjectWidget()
             projndx = wgt.GetSelection()
             project = wgt.GetString(projndx)
-            #print "project", project
             self.tree.LoadTreefromProject(self, project, [itemid])
                     
                                                                                     
@@ -1062,7 +1040,7 @@
                 self.DataManager.localDB.SaveState("PSMState", self.State)
                 self.DataManager.getItemsByProject([project])
 
-                self.ShowTopLevelItems()
+                self.buildDefaultTree()
 
                 numitems = self.FillGridFromProject(project)
                 self.FillItemWidgetFromProject(project)
@@ -1138,13 +1116,11 @@
         for ndx in range(len(self.DisplayWgts)):
             wgt = self.DisplayWgts[ndx][0]
             wgttype = self.DisplayWgts[ndx][1]
-            #print "wgttype: " + wgttype
             if wgttype == "SEQUENCE":
                 #print "  update sequence"
                 classname = newitem.__class__.__name__
-                # only put pmvs in the item dropdown
                 if classname == "ProductModelVersion":
-                    #print "  append pmv"
+                    # only put pmvs in the item dropdown
                     if newitem.name:
                         foo = newitem.of_pm_id + "." + newitem.of_pv_id + " (" + newitem.name + ")"
                     else:
@@ -1170,9 +1146,9 @@
                     wgt.AutoSizeColumns(true)
 
         
-    def RedrawTreeAndGrid(self, event = None):
-        #print "psmtool.redrawtreeandgrid"
-        self.ShowTopLevelItems()
+#    def RedrawTreeAndGrid(self, event = None):
+#        #print "psmtool.redrawtreeandgrid"
+#        self.buildDefaultTree()
         
     def FillGridFromProject(self, project):
         #print "psmtool.fillgridfromproject"
@@ -1214,10 +1190,6 @@
 
         
     def FillItemWidgetFromProject(self, project):
-#        widget = self.topWindow.toppanel.GetItemWidget()
-#        widget.Clear()
-#        widget.Append('Select a Product Model')
-
         localitems = self.DataManager.localDB.GetLocalProducts(project, pmv = 1)
         localpmvs = localitems.values()
         itemlist = []
@@ -1312,7 +1284,6 @@
     
     def SetupForLocalMode(self, event = None):
         #print "setupforlocalmode"
-#        self.topWindow.toppanel.GetButtonTopLevel().Enable(false)
         self.FillLocalModeProjectWidget()
         self.Parent.sb.SetServer('Local')
         self.tree.DeleteAllItems()
@@ -1358,46 +1329,33 @@
             # print 'about to set it to none'
             self.checkoutframe = None
         
-    def ShowTopLevelItems(self):
+    def buildDefaultTree(self):
         dlg = None
-        #print "psmtool.showtoplevelitems"
-        #print self.State.currentproject
-        #for key, value in self.DataManager.localDB.GetACUDict().items():
-            #print "acu"
-            #print value.name, value.pgef_oid
-            #break
-
+        #print "psmtool.builddefaulttree"
         if self.DataManager.user._loggedin and self.State.currentproject:
             #print "logged in"
-            #print "toplevelitemids", self.DataManager.topLevelItemIDs
             try:
                 self.State.treeroot = self.State.currentproject
                 self.tree.DeleteAllItems() 
                 self.DataManager.clearNauoIDs() 
                 self.tree.LoadTreefromProject(self, self.State.currentproject, self.DataManager.topLevelItemIDs)
                 self.itemgrid.ClearSelection()
-#                self.topWindow.toppanel.GetItemWidget().SetSelection(0)
             except:
                 pass
-
         else:
             #print "not logged in"
-            #print "toplevelitemids", self.DataManager.topLevelItemIDs
             ndx = self.topWindow.toppanel.GetItemWidget().GetSelection()
             if ndx > 0:
-                #print "call onitemclick"
                 self.OnItemClick()
                 
             elif len(self.DataManager.topLevelItemIDs) > 0:
-                #print "have toplevelitemids"
+                print "have toplevelitemids"
                 self.DataManager.clearNauoIDs() 
                 self.tree.LoadTreefromProject(self, self.State.currentproject, self.DataManager.topLevelItemIDs)
 
             else:
-                #print "Local mode; no TopLevel items"
                 self.DataManager.clearNauoIDs() 
                 self.tree.LoadTreefromProject(self, self.State.currentproject, [])
-        #print "end showtoplevelitems"
 
 
     def BuildTree(self, itemid):

Index: PanGalactic/pangalactic/enterprise/workflow/wfinstanceoverview.py
diff -u PanGalactic/pangalactic/enterprise/workflow/wfinstanceoverview.py:1.9 PanGalactic/pangalactic/enterprise/workflow/wfinstanceoverview.py:1.10
--- PanGalactic/pangalactic/enterprise/workflow/wfinstanceoverview.py:1.9	Mon Oct 27 15:41:41 2003
+++ PanGalactic/pangalactic/enterprise/workflow/wfinstanceoverview.py	Tue Oct 28 16:53:00 2003
@@ -57,54 +57,42 @@
         """
     
         WfProcessOverview.__init__(self, parent, state, datamgr, datalist, tablename, ID, pos, size)
+        self.colourdlg = None
 
 
     def showColourKey(self, event):
         #print "wfinstance.showcolourkey"
-        tmpsize = wxSize(100, 115)
-        colourdlg = wxDialog(self, -1, "Key", wxDefaultPosition, tmpsize, wxDEFAULT_DIALOG_STYLE | wxRESIZE_BORDER)
-        vsizer = wxBoxSizer(wxVERTICAL)
-        colourp = wxPanel(colourdlg, -1)
-
-        for ckey, clist in workflow_wizard.colourlist.items():
-            #print ckey, clist
-            coltext = clist[0]
-            forecolour = clist[1]
-            backcolour = clist[2]
-#            attr = wxTextAttr(forecolour, backcolour)
-            foo = wxTextCtrl(colourp, wxNewId(), "", wxDefaultPosition, wxSize(80, -1), wxTE_READONLY)
-            foo.SetForegroundColour(forecolour)
-            foo.SetBackgroundColour(backcolour)
-            foo.SetValue(coltext)
-#            foo.SetDefaultStyle(attr)
-#            foo.AppendText(coltext)
-            vsizer.AddWindow(foo, 0, wxGROW|wxALIGN_CENTER_VERTICAL, 5)
-
-        colourp.SetAutoLayout(True)
-        colourp.SetSizer(vsizer)
-        vsizer.Fit(colourp)
-        vsizer.SetSizeHints(colourp)
-
-        colourdlg.CentreOnParent()
-        colourdlg.Show(True)
-
-##        colourgrid = wxGrid(colourdlg, -1)
-##        colourgrid.CreateGrid(len(workflow_wizard.colourlist), 1)
-##        colourgrid.EnableEditing(False)
-##        row = 0
-##        for ckey, clist in workflow_wizard.colourlist.items():
-##            coltext = clist[0]
-##            forecolour = clist[1]
-##            backcolour = clist[2]
-##            colourgrid.SetCellTextColour(row, 0, forecolour)
-##            colourgrid.SetCellBackgroundColour(row, 0, backcolour)
-##            colourgrid.SetCellValue(row, 0, coltext)
-##            row += 1
-##        colourgrid.SetRowLabelSize(0)
-##        colourgrid.SetColLabelSize(0)
-##        colourgrid.Fit()
-##        colourdlg.CentreOnParent()
-##        colourdlg.Show(True)
+        if self.colourdlg:
+            if not self.colourdlg.IsShown():
+                self.colourdlg.CentreOnParent()
+                self.colourdlg.Show(True)
+            else:
+                self.colourdlg.Raise()
+            return
+        else:
+            tmpsize = wxSize(150, 115)
+            self.colourdlg = wxFrame(self, -1, "Status Key", wxDefaultPosition, tmpsize)
+            vsizer = wxBoxSizer(wxVERTICAL)
+            colourp = wxPanel(self.colourdlg, -1)
+
+            for ckey, clist in workflow_wizard.colourlist.items():
+                #print ckey, clist
+                coltext = clist[0]
+                forecolour = clist[1]
+                backcolour = clist[2]
+                foo = wxTextCtrl(colourp, wxNewId(), "", wxDefaultPosition, wxSize(80, -1), wxTE_READONLY)
+                foo.SetForegroundColour(forecolour)
+                foo.SetBackgroundColour(backcolour)
+                foo.SetValue(coltext)
+                vsizer.AddWindow(foo, 0, wxGROW|wxALIGN_CENTER_VERTICAL, 5)
+
+            colourp.SetAutoLayout(True)
+            colourp.SetSizer(vsizer)
+            vsizer.Fit(colourp)
+            vsizer.SetSizeHints(colourp)
+
+            self.colourdlg.CentreOnParent()
+            self.colourdlg.Show(True)
 
 
     def setupGrid(self, datalist, tablename):
@@ -145,32 +133,25 @@
             now = mx.DateTime.DateFromTicks(mx.DateTime.now())
             duedate = wfobj._activity_due_date
             wfobj_fields = wfobj.getActivity(wfobj.activityId).GetFields()
-            #print wfobj_fields
+
             late = int(wfobj_fields["late"])
             very_late = int(wfobj_fields["very_late"])
             lost_cause = int(wfobj_fields["lost_cause"])
 
-            #print duedate, late, very_late, lost_cause
-
             if now >= duedate + mx.DateTime.RelativeDateTime(days=(+lost_cause)):
                 colour_ndx = workflow_wizard.lost_cause
-                #colour = wxTheColourDatabase.FindColour("MAROON")
                 msg += "; Waaay Overdue (%i) " % lost_cause
             elif now >= duedate + mx.DateTime.RelativeDateTime(days=(+very_late)):
                 colour_ndx = workflow_wizard.very_late
-                #colour = wxTheColourDatabase.FindColour("RED")
                 msg += "; Very Late (%i) " % very_late
             elif now >= duedate + mx.DateTime.RelativeDateTime(days=(+late)):
                 colour_ndx = workflow_wizard.late
-                #colour = wxTheColourDatabase.FindColour("CORAL")
                 msg += "; Late (%i) " % late
             elif now >= duedate:
                 colour_ndx = workflow_wizard.past
-                #colour = wxTheColourDatabase.FindColour("YELLOW")
                 msg += "; Past Due "
             else:
                 colour_ndx = workflow_wizard.ontime
-                #colour = wxTheColourDatabase.FindColour("GREEN")
                 msg += "; on time "
 
             msg += repr(backcolour)
@@ -179,15 +160,4 @@
             self.grid.SetCellBackgroundColour(row, somecol, backcolour)
             self.grid.SetCellTextColour(row, somecol, forecolour)
             #print msg
-
-##        get the attr for the wxAttrKind.Row (= 3)
-##        GetAttr needs the type of attr to get, despite what the docs say
-##        The values are:
-##        
-##        wxGridCellAttr.Any         (Any == 0)
-##        wxGridCellAttr.Default
-##        wxGridCellAttr.Cell
-##        wxGridCellAttr.Row
-##        wxGridCellAttr.Col
-##        wxGridCellAttr.Merged
 

Index: PanGalactic/pangalactic/utils/datamanager.py
diff -u PanGalactic/pangalactic/utils/datamanager.py:1.51 PanGalactic/pangalactic/utils/datamanager.py:1.52
--- PanGalactic/pangalactic/utils/datamanager.py:1.51	Fri Oct 24 14:52:50 2003
+++ PanGalactic/pangalactic/utils/datamanager.py	Tue Oct 28 16:53:01 2003
@@ -1,6 +1,6 @@
 # $Source: /repo/step_testbed/PanGalactic/pangalactic/utils/datamanager.py,v $
 
-__version__ = "$Revision: 1.51 $"[11:-2]
+__version__ = "$Revision: 1.52 $"[11:-2]
 
 import time
 import mx.DateTime
@@ -784,7 +784,7 @@
 
     def updateWorkflow(self, wf_obj):
         #print "datamanager.updateworkflow"
-        self.localdb.Save([wf_obj], override = true)
+        self.localdb.Save([wf_obj], override = True)
 
     def saveWorkflow(self, wf_obj):
         self.localDB.Save([wf_obj])

Index: PanGalactic/pangalactic/utils/xmlrpcinterface.py
diff -u PanGalactic/pangalactic/utils/xmlrpcinterface.py:1.25 PanGalactic/pangalactic/utils/xmlrpcinterface.py:1.26
--- PanGalactic/pangalactic/utils/xmlrpcinterface.py:1.25	Fri Oct 24 15:43:24 2003
+++ PanGalactic/pangalactic/utils/xmlrpcinterface.py	Tue Oct 28 16:53:01 2003
@@ -3,10 +3,10 @@
 """
 PanGalactic Client XMLRPC Interfaces
 
-@version: $Revision: 1.25 $
+@version: $Revision: 1.26 $
 """
 
-__version__ = "$Revision: 1.25 $"[11:-2]
+__version__ = "$Revision: 1.26 $"[11:-2]
 
 import xmlrpclib
 import types
@@ -98,8 +98,9 @@
 
 
     def getCategories(self, context):
-        # Category is a subclass of DataElement.  FSC is a
-        # Category; it's passed in as the context
+        """
+        Get all Category objects for the given context.
+        """
         #print "xmlrpc.getcategories", context
         crit = {"id_context" : context}
         data = self._RPC.getObjects('Category', 0, 0, crit)
@@ -113,17 +114,11 @@
         if data:
             return [self._factory.remember(x) for x in data]
 
-    def getOrganization(self, ObjId):
-        #print "xmlrpc.getorganization"
-        data = self._RPC.getObjects('Organization', 'pgef_oid=%s' % ObjId)
-        if data:
-            return [self._factory.remember(x) for x in data]
-
     def GetAcusByAssembly(self, assembly):
         """
         Get all AssemblyComponentUsages in which the argument (a
-        L{pangalactic.enterprise.productmodelversion.ProductModelVersion}
-        is the _assembly (the object that contains the _component
+        L{pangalactic.enterprise.productmodelversion.ProductModelVersion})
+        is the _assembly (the object that contains the acu's _component
         object).
         """
         #print "in xmlrpcinterface.GetAcusByAssembly"

From bmuir at ned.gsfc.nasa.gov  Wed Oct 29 14:19:54 2003
From: bmuir at ned.gsfc.nasa.gov (bmuir CVS)
Date: Wed Oct 29 14:19:56 2003
Subject: [Pangalactic-commits] more test fix's
Message-ID: <200310291919.h9TJJsu4003508@ned.gsfc.nasa.gov>

Modified files:
PanGalactic/pangalactic/client/modules/psm/itemeditframe.py 1.109 1.110
PanGalactic/pangalactic/client/tests/test_aboutbox.py 1.3 1.4
PanGalactic/pangalactic/client/tests/test_itemeditframe.py 1.12 1.13

Log message:
more test fix's


Index: PanGalactic/pangalactic/client/modules/psm/itemeditframe.py
diff -u PanGalactic/pangalactic/client/modules/psm/itemeditframe.py:1.109 PanGalactic/pangalactic/client/modules/psm/itemeditframe.py:1.110
--- PanGalactic/pangalactic/client/modules/psm/itemeditframe.py:1.109	Fri Oct 24 14:52:49 2003
+++ PanGalactic/pangalactic/client/modules/psm/itemeditframe.py	Wed Oct 29 14:19:52 2003
@@ -1,6 +1,6 @@
 # $Source: /repo/step_testbed/PanGalactic/pangalactic/client/modules/psm/itemeditframe.py,v $
 
-__version__ = "$Revision: 1.109 $"[11:-2]
+__version__ = "$Revision: 1.110 $"[11:-2]
 
 # Python imports
 import copy
@@ -197,7 +197,7 @@
                     self.currentproduct = ProductModelMaster(id_context = self.DataManager.currentProject)
                     self.tempproduct = ProductModelMaster(id_context = self.DataManager.currentProject)
         except:
-            print "itemeditframe.setup.exception: building default productmaster instances"
+            #print "itemeditframe.setup.exception: building default productmaster instances"
             self.currentproduct = ProductMaster(id_context = self.DataManager.currentProject)
             self.tempproduct = ProductMaster(id_context = self.DataManager.currentProject)
             
@@ -353,7 +353,10 @@
                         elif classname == "ProductModelMaster":
                             self.pmm_pmv_form.GetTogglePmm().SetValue(1)
                 except:
-                    print "  exception; failed to set pane radiobutton"
+                    #print "  exception; failed to set pane radiobutton"
+                    #this try except is here because depending on when we create the form, there may not be 
+                    #a nodedata[2]
+                    pass
 
         elif which_pane == self.PartsListPage or which_pane == self.PartDataPage:
             #print "setting up for pl"
@@ -2204,6 +2207,8 @@
 
     def SaveItemChanges(self):
         #if self.DataManager.creatingItem:
+        print self.DataManager.creatingPMM_PMV
+        print self.DataManager.creatingPM_PV
         if self.DataManager.creatingPMM_PMV or self.DataManager.creatingPM_PV:
             newitem = ProductModelVersion(id_context = self.DataManager.currentProject)            
             self.pm_pv_form.Save(newitem)
@@ -2212,14 +2217,14 @@
             newitem.state = pangalactic.utils.objectstatus.ADD
             newitem.project = self.State.currentproject
 
-            try:
+            if 1:#try:
                 newitem.Validate()
-            except RequiredDataError, e:
-                dlg = wxMessageDialog(self, e.__dict__['args'], "Required Product Data Missing!!!", wxOK | wxICON_ERROR)
-                dlg.ShowModal()
-                dlg.Destroy()
-                self.pmm_pmv_form.EditingMode()
-                return False
+            #except RequiredDataError, e:
+                #dlg = wxMessageDialog(self, e.__dict__['args'], "Required Product Data Missing!!!", wxOK | wxICON_ERROR)
+                #dlg.ShowModal()
+                #dlg.Destroy()
+                #self.pmm_pmv_form.EditingMode()
+                #return False
 
             #self.DataManager.creatingItem = False
             self.DataManager.creatingPMM_PMV = False

Index: PanGalactic/pangalactic/client/tests/test_aboutbox.py
diff -u PanGalactic/pangalactic/client/tests/test_aboutbox.py:1.3 PanGalactic/pangalactic/client/tests/test_aboutbox.py:1.4
--- PanGalactic/pangalactic/client/tests/test_aboutbox.py:1.3	Thu Oct 23 15:06:19 2003
+++ PanGalactic/pangalactic/client/tests/test_aboutbox.py	Wed Oct 29 14:19:52 2003
@@ -12,7 +12,7 @@
         self.VERSION = 'TEST'
         self.BUILD_DATE = '111111'
         dlg = None
-        dlg = modules.psm.aboutbox.AboutBox(None, -1, "About PGEF", wxPoint(20,20), wxSize(500,340))
+        dlg = pangalactic.utils.aboutbox.AboutBox(None, -1, "About PGEF", wxPoint(20,20), wxSize(500,340))
         dlg.GetVersion().SetLabel(str(self.VERSION))
         dlg.GetBuildDate().SetLabel(str(self.BUILD_DATE))
         dlg.CentreOnParent()

Index: PanGalactic/pangalactic/client/tests/test_itemeditframe.py
diff -u PanGalactic/pangalactic/client/tests/test_itemeditframe.py:1.12 PanGalactic/pangalactic/client/tests/test_itemeditframe.py:1.13
--- PanGalactic/pangalactic/client/tests/test_itemeditframe.py:1.12	Tue Oct 28 15:00:13 2003
+++ PanGalactic/pangalactic/client/tests/test_itemeditframe.py	Wed Oct 29 14:19:52 2003
@@ -34,11 +34,11 @@
         testframe.dm = datamanager.DataManager(testframe, true)
         nodedata = (None, None)
         self.itemeditform = itemeditframe.ItemEditFrame(testframe, testframe.State, 0, 1, nodedata, testframe.dm)
-        #self.itemeditform.SetDisplayWgt(self.DisplayWgts)
-        #testframe.dm.localDB.Commit()
+        self.itemeditform.SetDisplayWgt(self.DisplayWgts)
+        testframe.dm.localDB.Commit()
        
-        #assert self.itemeditform != None, "Couldn't create ItemEditFrame"
-        #testframe.dm.localDB.db.close()
+        assert self.itemeditform != None, "Couldn't create ItemEditFrame"
+        testframe.dm.localDB.db.close()
         
     def testSavePLChanges(self):
         #print 'testSavePL'
@@ -59,7 +59,6 @@
 
         testframe.itemeditform = itemeditframe.ItemEditFrame(testframe, testframe.State, 2, 1, nodedata, testframe.dm)
         testframe.itemeditform.SetDisplayWgt(self.DisplayWgts)
-##==> (postgres) removed from schema        temppl.Type = 'test'
         temppl.owner = 'me'
         temppl.id = '1111'
         testframe.itemeditform.partslistform.FillFormWithObjectData(temppl)
@@ -73,34 +72,36 @@
         
     def testSaveItemChanges(self):
         #print 'testsaveItemChanges'
-        tempitem = pangalactic.enterprise.productmodelversion.ProductModelVersion()
-##==> (postgres) removed from schema        tempitem.Type = 'test'
-        productmodelversion.fillSampleProductModelVersion(tempitem)
+        tempitem = productmodelversion.ProductModelVersion()
+        tempitem.popTestData()
         
         self.DisplayWgts = wxFrame(None, -1, 'Display Widget')
         testframe = wxFrame(None, -1, 'Test Frame')
         testframe.State = psmstate.PSMState()
         testframe.dm = datamanager.DataManager(testframe, true)
+        testframe.dm.serverName = 'ned.gsfc.nasa.gov'
+        testframe.dm.serverPort = '8080'
+        testframe.dm.createServer()
+        testframe.WatchDog = securitymanager.SecurityManager(testframe.dm)
         result = testframe.dm.login('tstuser','test')
         testframe.dm.fillProjectList()
         testframe.dm.localDB.Commit()
-        testframe.dm.creatingItem = 1
         nodedata = (None, None)
         testframe.State.currentproject = 'TEST'
         testframe.itemeditform = itemeditframe.ItemEditFrame(testframe, testframe.State, 0, 1, nodedata, testframe.dm)
         testframe.itemeditform.SetDisplayWgt(self.DisplayWgts)
-        testframe.itemeditform.itemform.FillFormWithObjectData(tempitem)
-        testframe.itemeditform.itemform.GetTextctrlLaunchDate().SetValue(time.asctime())
+        testframe.itemeditform.pmm_pmv_form.FillFormWithPMVData(tempitem)
+        testframe.itemeditform.pmm_pmv_form.GetPmvRevisionTag().SetValue('new name')
+        testframe.dm.creatingPMM_PMV = True
         retcode = testframe.itemeditform.SaveItemChanges()
-        #print 'got here 1'
+        print 'got here: retcode is:',retcode
         testframe.dm.localDB.Commit()
         assert retcode == true, 'SaveItemchanges failed'
-        testframe.dm.localDB.db.close()
+        #testframe.dm.localDB.db.close()
         
     def testChangesMade(self):
         #print 'testchangesmade'
         tempitem = productmodelversion.ProductModelVersion()
-##==> (postgres) removed from schema        tempitem.Type = 'test'
         productmodelversion.fillSampleProductModelVersion(tempitem)
         
         self.DisplayWgts = wxFrame(None, -1, 'Display Widget')
@@ -121,8 +122,6 @@
         testitem = productmodelversion.ProductModelVersion()
         testitem.creator = 'me'
         testitem.create_datetime = '12432'
-##==> (postgres) removed from schema        testitem.CriticalityCode = '5'
-##==> (postgres) removed from schema        testitem.LaunchDate = '5555'
         testframe.itemeditform.currentitem = testitem
         
         retval = testframe.itemeditform.ChangesMade()
@@ -133,7 +132,6 @@
         
     def testSaveChanges(self):
         tempitem = producmodelversion.Item()
-##==> (postgres) removed from schema        tempitem.Type = 'test'
         productmodelversion.fillSampleProductModelVersion(tempitem)
         
         self.DisplayWgts = wxFrame(None, -1, 'Display Widget')
@@ -162,7 +160,6 @@
     def testOnSavePartsList(self):
         temppl = partslist.PartsList()
         partslist.FillSamplePartsList(temppl)
-##==> (postgres) removed from schema        temppl.Type = 'test'
         temppl.owner = 'me'
         temppl.id = '1111'
         temppl._upload_file_name = 'sample.xls'
@@ -190,7 +187,6 @@
         
     def testSaveItem(self):
         tempitem = productmodelversion.ProductModelVersion()
-##==> (postgres) removed from schema        tempitem.Type = 'test'
         productmodelversion.fillSampleProductModelVersion(tempitem)
         
         self.DisplayWgts = wxFrame(None, -1, 'Display Widget')
@@ -216,7 +212,6 @@
         
     def testLinkDocument(self):
         tempitem = productmodelversion.ProductModelVersion()
-##==> (postgres) removed from schema        tempitem.Type = 'test'
         productmodelversion.fillSampleProductModelVersion(tempitem)
         
         testdoc = document.Document()
@@ -246,7 +241,6 @@
         
     def testUnlinkDocument(self):
         tempitem = productmodelversion.ProductModelVersion()
-##==> (postgres) removed from schema        tempitem.Type = 'test'
         productmodelversion.fillSampleProductModelVersion(tempitem)
         
         testdoc = document.Document()
@@ -318,7 +312,7 @@
     itemsuite = unittest.TestSuite()
     itemsuite.addTest(ItemEditFrameTest("Title"))
     itemsuite.addTest(ItemEditFrameTest("testCreateItemEditFrame"))
-    #itemsuite.addTest(ItemEditFrameTest("testSaveItemChanges"))
+    itemsuite.addTest(ItemEditFrameTest("testSaveItemChanges"))
     #itemsuite.addTest(ItemEditFrameTest("testSavePLChanges"))
     #itemsuite.addTest(ItemEditFrameTest("testChangesMade"))
     #itemsuite.addTest(ItemEditFrameTest("testSaveChanges"))

From waterbug at ned.gsfc.nasa.gov  Wed Oct 29 17:05:30 2003
From: waterbug at ned.gsfc.nasa.gov (waterbug CVS)
Date: Wed Oct 29 17:05:31 2003
Subject: [Pangalactic-commits] Begin mods to handle mapped classes.
Message-ID: <200310292205.h9TM5UbL004937@ned.gsfc.nasa.gov>

Modified files:
PanGalactic/pangalactic/repo/factory.py 1.31 1.32

Log message:
Begin mods to handle mapped classes.


Index: PanGalactic/pangalactic/repo/factory.py
diff -u PanGalactic/pangalactic/repo/factory.py:1.31 PanGalactic/pangalactic/repo/factory.py:1.32
--- PanGalactic/pangalactic/repo/factory.py:1.31	Tue Oct 21 17:32:28 2003
+++ PanGalactic/pangalactic/repo/factory.py	Wed Oct 29 17:05:28 2003
@@ -1,11 +1,11 @@
-# $Id: factory.py,v 1.31 2003/10/21 21:32:28 waterbug Exp $
+# $Id: factory.py,v 1.32 2003/10/29 22:05:28 waterbug Exp $
 
 """
 Pan Galactic Object Factory module
-@version: $Revision: 1.31 $
+@version: $Revision: 1.32 $
 """
 
-__version__ = "$Revision: 1.31 $"[11:-2]
+__version__ = "$Revision: 1.32 $"[11:-2]
 
 import types
 from pprint import pprint
@@ -58,15 +58,22 @@
         Convert a pyPgSQL PgResultSet into an "extract"
         (see L{pangalactic.utils.factory.extract}).
         """
-        obj = self._registry.pgerdb_classes[res.pgef_class]
-        schema = obj._schema
-        module = obj.__module__
-        s = [ (a, self.cook(getattr(res, a), schema[a]))
-              for a in schema ]
-        instdict = dict(s)
-        name = module + '.' + res.pgef_class
-        e = [ name, instdict ]
-        return e
+        if res.pgef_class in self._registry.pgef_classes:
+            _class = self._registry.pgef_classes[res.pgef_class]
+            if res.pgef_class in self._registry.core_classes:
+                schema = _class._schema
+                module = _class.__module__
+                s = [ (a, self.cook(getattr(res, a), schema[a]))
+                      for a in schema ]
+                instdict = dict(s)
+                name = module + '.' + res.pgef_class
+                e = [ name, instdict ]
+                return e
+            else:
+                pass
+        else:
+            e = """'%s' is not a type known to the registry.""" % res.pgef_class
+            raise TypeError, e
 
     def resultlist2Extract(self, reslist):
         """
@@ -76,7 +83,7 @@
         # This code depends on the fact that 'pgef_class' is the
         # second attribute in *all* PGER tables (because it is
         # the second attribute of PgefObject).
-        obj = self._registry.pgerdb_classes[reslist[1]]
+        obj = self._registry.core_classes[reslist[1]]
         schema = obj._schema
         module = obj.__module__
         s = [ (a, self.cook(reslist[self._registry.table_cols.index(a)],
@@ -149,7 +156,7 @@
         Make PGEF Objects from PgerDb query results.  
         
         More specifically:  take a class name that occurs in the
-        pgerdb_classes or pgef_classes attrs of
+        core_classes or pgef_classes attrs of
         L{pangalactic.repo.registry.PgerObjectRegistry} and an
         adbapi deferred query result and return a list of
         instances of the specified class.
@@ -162,8 +169,8 @@
         @param resultsets: a deferred list of PgResultSets from
                            L{pangalactic.repo.db.PgerDb}
         """
-        klass = self._registry.pgerdb_classes[classname]
-        schema = klass._schema
+        _class = self._registry.core_classes[classname]
+        schema = _class._schema
         objectlist = []
         for row in resultsets:
             # create kw dict for initialization string ...
@@ -171,7 +178,7 @@
             for a in schema:
                 initparms[a] = getattr(row, a)
             # initialize the object 
-            o = klass(**initparms)
+            o = _class(**initparms)
             objectlist.append(o)
         return objectlist
 

From pbear at ned.gsfc.nasa.gov  Wed Oct 29 17:06:57 2003
From: pbear at ned.gsfc.nasa.gov (pbear CVS)
Date: Wed Oct 29 17:06:59 2003
Subject: [Pangalactic-commits] fixed projects vs projectobjects;
	handle traceback in dbbrowser
Message-ID: <200310292206.h9TM6vET005017@ned.gsfc.nasa.gov>

Modified files:
PanGalactic/pangalactic/client/modules/psm/documenttreeframe.py 1.15 1.16
PanGalactic/pangalactic/client/modules/psm/itemeditframe.py 1.110 1.111
PanGalactic/pangalactic/client/modules/psm/partslisttreeframe.py 1.20 1.21
PanGalactic/pangalactic/enterprise/pgefadvisory.py 1.42 1.43
PanGalactic/pangalactic/enterprise/workflow/workflow_wizard.py 1.21 1.22
PanGalactic/pangalactic/utils/datamanager.py 1.52 1.53
PanGalactic/pangalactic/utils/dbbrowser.py 1.5 1.6
PanGalactic/pangalactic/utils/localdb.py 1.44 1.45

Log message:
fixed projects vs projectobjects; handle traceback in dbbrowser


Index: PanGalactic/pangalactic/utils/dbbrowser.py
diff -u PanGalactic/pangalactic/utils/dbbrowser.py:1.5 PanGalactic/pangalactic/utils/dbbrowser.py:1.6
--- PanGalactic/pangalactic/utils/dbbrowser.py:1.5	Tue Oct 28 16:53:01 2003
+++ PanGalactic/pangalactic/utils/dbbrowser.py	Wed Oct 29 17:06:55 2003
@@ -204,8 +204,7 @@
                         if curr_cols > maxcols:
                             maxcols = curr_cols
                 except:
-                    print "Eek.  An Exception.  Eek."
-                    print "But seriously...  ungriddable object", obj_id
+                    print "dbbrowser.fillgrid: Attempt to count an ungriddable object"
                     
                 if self.grid.GetNumberCols() > 0:
                     self.grid.DeleteCols(0, self.grid.GetNumberCols())
@@ -220,8 +219,7 @@
                             col += 1
                         curr_row += 1
                 except:
-                    print "Eek.  Another Exception.  Eek."
-                    print "But seriously...  ungriddable object", obj_id
+                    print "dbbrowser.fillgrid: Attempt to display an ungriddable object"
                     
             self.grid.AutoSizeColumns(true)
 

Index: PanGalactic/pangalactic/client/modules/psm/documenttreeframe.py
diff -u PanGalactic/pangalactic/client/modules/psm/documenttreeframe.py:1.15 PanGalactic/pangalactic/client/modules/psm/documenttreeframe.py:1.16
--- PanGalactic/pangalactic/client/modules/psm/documenttreeframe.py:1.15	Fri Sep 26 15:47:11 2003
+++ PanGalactic/pangalactic/client/modules/psm/documenttreeframe.py	Wed Oct 29 17:06:54 2003
@@ -16,7 +16,7 @@
 import pangalactic.utils.objectstatus as objectstatus
 import pangalactic.utils.preferences as preferences
 
-__version__ = "$Revision: 1.15 $"[11:-2]
+__version__ = "$Revision: 1.16 $"[11:-2]
 
 
 class DocumentTreeFrame(doctreeframe.DocTreeFrame):
@@ -104,7 +104,7 @@
                     projlist = {}
             else:
                 projlist = {}
-            projlist[newdoc.pgef_oid] = {"type": "document"} #vwk
+            projlist[newdoc.pgef_oid] = "document" #vwk
             self.DataManager.localDB.GetProjectObjects()[self.State.currentproject] = projlist
 
             if self.EditMode:

Index: PanGalactic/pangalactic/utils/datamanager.py
diff -u PanGalactic/pangalactic/utils/datamanager.py:1.52 PanGalactic/pangalactic/utils/datamanager.py:1.53
--- PanGalactic/pangalactic/utils/datamanager.py:1.52	Tue Oct 28 16:53:01 2003
+++ PanGalactic/pangalactic/utils/datamanager.py	Wed Oct 29 17:06:55 2003
@@ -1,6 +1,6 @@
 # $Source: /repo/step_testbed/PanGalactic/pangalactic/utils/datamanager.py,v $
 
-__version__ = "$Revision: 1.52 $"[11:-2]
+__version__ = "$Revision: 1.53 $"[11:-2]
 
 import time
 import mx.DateTime
@@ -145,25 +145,25 @@
             #print 'saving a product master', product_master
             #self.localDB.Save([product_master])
             self.localDB.Add([product_master])
-            projlist[product_master.pgef_oid] = {"type" : "pm"}
+            projlist[product_master.pgef_oid] = "pm"
 
         if product_version:
             #print 'saving a product version', product_version
             #self.localDB.Save([product_version])
             self.localDB.Add([product_version])
-            projlist[product_version.pgef_oid] = {"type" : "pv"}
+            projlist[product_version.pgef_oid] = "pv"
 
         if product_model_master:
             #print 'saving a product model master', product_model_master
             #self.localDB.Save([product_model_master])
             self.localDB.Add([product_model_master])
-            projlist[product_model_master.pgef_oid] = {"type" : "pmm"}
+            projlist[product_model_master.pgef_oid] = "pmm"
 
         if product_model_version:
             #print 'saving a product model version', product_model_version
             #self.localDB.Save([product_model_version])
             self.localDB.Add([product_model_version])
-            projlist[product_model_version.pgef_oid] = {"type" : "pmv"}
+            projlist[product_model_version.pgef_oid] = "pmv"
 
         self.localDB.GetProjectObjects()[self.currentProject] = projlist
         return product_master, product_version, product_model_master, product_model_version
@@ -295,7 +295,7 @@
             for item in data:
                 tempobjlist.append(item)
                 classname = item.__class__.__name__
-                tempids[item.pgef_oid] = {"type" : classname}
+                tempids[item.pgef_oid] = classname
                 #if classname == "ProductModelVersion":
                     #print "retrieving a", classname
                     #print " ~", item.name
@@ -307,17 +307,17 @@
 ###            print "pms", len(pms)
 ##            for item in pms:
 ##                tempobjlist.append(item)
-##                tempids[item.pgef_oid] = {"type" : "ProductMaster"}
+##                tempids[item.pgef_oid] = "ProductMaster"
 ##        if pvs:
 ###            print "pvs", len(pvs)
 ##            for item in pvs:
 ##                tempobjlist.append(item)
-##                tempids[item.pgef_oid] = {"type" : "ProductVersion"}
+##                tempids[item.pgef_oid] = "ProductVersion"
 ##        if pmms:
 ###            print "pmms", len(pmms)
 ##            for item in pmms:
 ##                tempobjlist.append(item)
-##                tempids[item.pgef_oid] = {"type" : "ProductModelMaster"}
+##                tempids[item.pgef_oid] = "ProductModelMaster"
 
 
         if len(tempobjlist) > 0:
@@ -429,7 +429,7 @@
                 if projectobjs.has_key(self.currentProject):
                     projdict = projectobjs[self.currentProject]
                     for acuobj in updatedacuobjs:
-                        projdict[acuobj.pgef_oid] = {"type" : "AssemblyComponentUsage"}
+                        projdict[acuobj.pgef_oid] = "AssemblyComponentUsage"
                 projectobjs[self.currentProject] = projdict
                 self.localDB.SetProjectObjects(projectobjs)
                     
@@ -713,7 +713,7 @@
 
         self.localDB.Add([NAUOtoAdd])
         projlist = self.localDB.GetProjectObjects()[self.currentProject]
-        projlist[NAUOtoAdd.pgef_oid] = {"type" : "AssemblyComponentUsage"}
+        projlist[NAUOtoAdd.pgef_oid] = "AssemblyComponentUsage"
         self.localDB.GetProjectObjects()[self.currentProject] = projlist
 
 

Index: PanGalactic/pangalactic/client/modules/psm/itemeditframe.py
diff -u PanGalactic/pangalactic/client/modules/psm/itemeditframe.py:1.110 PanGalactic/pangalactic/client/modules/psm/itemeditframe.py:1.111
--- PanGalactic/pangalactic/client/modules/psm/itemeditframe.py:1.110	Wed Oct 29 14:19:52 2003
+++ PanGalactic/pangalactic/client/modules/psm/itemeditframe.py	Wed Oct 29 17:06:54 2003
@@ -1,6 +1,6 @@
 # $Source: /repo/step_testbed/PanGalactic/pangalactic/client/modules/psm/itemeditframe.py,v $
 
-__version__ = "$Revision: 1.110 $"[11:-2]
+__version__ = "$Revision: 1.111 $"[11:-2]
 
 # Python imports
 import copy
@@ -834,7 +834,7 @@
                     projlist = {}
             else:
                 projlist = {}
-            projlist[newdoc.pgef_oid] = {"type" : "Document"} #vwk
+            projlist[newdoc.pgef_oid] = "document" #vwk
             self.DataManager.localDB.GetProjectObjects()[self.State.currentproject] = projlist
 
             if self.EditDoc:
@@ -926,7 +926,7 @@
                 projlist = {}
         else:
             projlist = {}
-        projlist[link.pgef_oid] = {"type" : "pdr_document"} #vwk
+        projlist[link.pgef_oid] = "pdr_document" #vwk
         self.DataManager.localDB.GetProjectObjects()[self.State.currentproject] = projlist
 
         parent = self.DataManager.localDB.GetItem(self.rootitemid)
@@ -1242,7 +1242,7 @@
             else:
                 #print "new project key"
                 projlist = {}
-            projlist[save_object.pgef_oid] = {"type" : "pmv"} #vwk
+            projlist[save_object.pgef_oid] = "pmv" #vwk
             self.DataManager.localDB.GetProjectObjects()[self.State.currentproject] = projlist
             
             if self.rootitemid == None and self.rootnauoid == None:
@@ -1363,7 +1363,7 @@
                         projlist = {}
                 else:
                     projlist = {}
-                projlist[pl.pgef_oid] = {"type" : "parts_list"} #vwk
+                projlist[pl.pgef_oid] = "parts_list" #vwk
                 self.DataManager.localDB.GetProjectObjects()[self.State.currentproject] = projlist
 
                 if self.EditPL:
@@ -1435,7 +1435,7 @@
                 projlist = {}
         else:
             projlist = {}
-        projlist[link.pgef_oid] = {"type" : "pdr_parts_list"} #vwk
+        projlist[link.pgef_oid] = "pdr_parts_list" #vwk
         self.DataManager.localDB.GetProjectObjects()[self.State.currentproject] = projlist
 
         node = self.doctree.GetSelection()
@@ -2237,7 +2237,7 @@
                     projlist = {}
             else:
                 projlist = {}
-            projlist[newitem.pgef_oid] = {"type" : "pmv"} #vwk
+            projlist[newitem.pgef_oid] = "pmv" #vwk
             self.DataManager.localDB.GetProjectObjects()[self.State.currentproject] = projlist
             return True
 

Index: PanGalactic/pangalactic/client/modules/psm/partslisttreeframe.py
diff -u PanGalactic/pangalactic/client/modules/psm/partslisttreeframe.py:1.20 PanGalactic/pangalactic/client/modules/psm/partslisttreeframe.py:1.21
--- PanGalactic/pangalactic/client/modules/psm/partslisttreeframe.py:1.20	Thu Oct 23 15:06:18 2003
+++ PanGalactic/pangalactic/client/modules/psm/partslisttreeframe.py	Wed Oct 29 17:06:54 2003
@@ -25,7 +25,7 @@
 except:
     print "partslisttreeframe.plmimport.failed"
 
-__version__ = "$Revision: 1.20 $"[11:-2]
+__version__ = "$Revision: 1.21 $"[11:-2]
 
 
 class PartsListTreeFrame(doctreeframe.DocTreeFrame):
@@ -129,7 +129,7 @@
                         projlist = {}
                 else:
                     projlist = {}
-                projlist[partslist.pgef_oid] = {"type": "parts_list"} #vwk
+                projlist[partslist.pgef_oid] = "parts_list" #vwk
                 self.DataManager.localDB.GetProjectObjects()[self.State.currentproject] = projlist
 
                 if self.EditMode:

Index: PanGalactic/pangalactic/enterprise/pgefadvisory.py
diff -u PanGalactic/pangalactic/enterprise/pgefadvisory.py:1.42 PanGalactic/pangalactic/enterprise/pgefadvisory.py:1.43
--- PanGalactic/pangalactic/enterprise/pgefadvisory.py:1.42	Thu Oct 23 15:06:19 2003
+++ PanGalactic/pangalactic/enterprise/pgefadvisory.py	Wed Oct 29 17:06:54 2003
@@ -1,11 +1,11 @@
-# $Id: pgefadvisory.py,v 1.42 2003/10/23 19:06:19 pbear Exp $
+# $Id: pgefadvisory.py,v 1.43 2003/10/29 22:06:54 pbear Exp $
 
 """
 Base class for documents that report conditions related to the
 usability of a product.
 """
 
-__version__ = "$Revision: 1.42 $"[11:-2]
+__version__ = "$Revision: 1.43 $"[11:-2]
 
 import os.path
 import string
@@ -66,12 +66,22 @@
 
 # leave this here...  I use it to generate old data -vwk
 #
-#        now = mx.DateTime.DateFromTicks(mx.DateTime.now())
-#        earlier = now + mx.DateTime.RelativeDateTime(days=-40)
-#        self.pger_create_datetime = earlier
-#        self.pger_mod_datetime    = earlier
-#        self.create_datetime      = earlier
-#        self.mod_datetime         = earlier
+# -55, wf0 -> lost cause
+# -45, wf0 -> very late
+# -35, wf0 -> late
+# -30, wf0 -> past due
+#
+# -90, wf1 -> lost cause
+# -80, wf1 -> very late
+# -60, wf1 -> late
+# -30, wf1 -> past due
+# 
+        now = mx.DateTime.DateFromTicks(mx.DateTime.now())
+        earlier = now + mx.DateTime.RelativeDateTime(days=-90)
+        self.pger_create_datetime = earlier
+        self.pger_mod_datetime    = earlier
+        self.create_datetime      = earlier
+        self.mod_datetime         = earlier
 
 
     def __getattr__(self, name):

Index: PanGalactic/pangalactic/enterprise/workflow/workflow_wizard.py
diff -u PanGalactic/pangalactic/enterprise/workflow/workflow_wizard.py:1.21 PanGalactic/pangalactic/enterprise/workflow/workflow_wizard.py:1.22
--- PanGalactic/pangalactic/enterprise/workflow/workflow_wizard.py:1.21	Mon Oct 27 15:41:41 2003
+++ PanGalactic/pangalactic/enterprise/workflow/workflow_wizard.py	Wed Oct 29 17:06:55 2003
@@ -159,9 +159,9 @@
 
         EVT_BUTTON(self, WF_ACTMOVEUP_ROW, self.OnMoveUp)
         EVT_BUTTON(self, WF_ACTMOVEDOWN_ROW, self.OnMoveDown)
-        EVT_BUTTON(self, WF_ACTDELETE_ROW, self.OnDeleteRow)
+        EVT_BUTTON(self, WF_ACTDELETE_ROW, self.OnDeleteActivity)
         EVT_BUTTON(self, WF_TRANSGENERATE, self.OnGenerateTransitions)
-        EVT_BUTTON(self, WF_TRANSDELETE_ROW, self.OnDeleteRow)
+        EVT_BUTTON(self, WF_TRANSDELETE_ROW, self.OnDeleteTransition)
 
         EVT_GRID_CELL_LEFT_DCLICK(self.transitiongrid, self.OnEdit)
         EVT_GRID_CELL_CHANGE(self.transitiongrid, self.OnCellChange)
@@ -598,8 +598,24 @@
                 self.transitiongrid.SetCellValue(ndx, 0, actlist[ndx])
                 self.transitiongrid.SetCellValue(ndx, 1, actlist[ndx+1])
 
-    def OnDeleteRow(self, event = None):
-        #print "workflowwizard.deleterow"
+    def OnDeleteActivity(self, event = None):
+        print "workflowwizard.deleteactivity"
+        
+        if self.activitygrid.IsCellEditControlEnabled():
+            self.activitygrid.HideCellEditControl()
+            self.activitygrid.DisableCellEditControl()
+
+        if self.activitygrid.IsSelection():
+            self.activitygrid.ClearSelection()
+
+        if self.ActSelectedRow <> None:
+            self.activitygrid.DeleteRows(self.ActSelectedRow)
+            self.ActSelectedRow = None
+
+
+    def OnDeleteTransition(self, event = None):
+        print "workflowwizard.deletetransition"
+        
         if self.transitiongrid.IsCellEditControlEnabled():
             self.transitiongrid.HideCellEditControl()
             self.transitiongrid.DisableCellEditControl()

Index: PanGalactic/pangalactic/utils/localdb.py
diff -u PanGalactic/pangalactic/utils/localdb.py:1.44 PanGalactic/pangalactic/utils/localdb.py:1.45
--- PanGalactic/pangalactic/utils/localdb.py:1.44	Tue Oct 28 16:53:01 2003
+++ PanGalactic/pangalactic/utils/localdb.py	Wed Oct 29 17:06:55 2003
@@ -52,6 +52,7 @@
     PFRDICT = "PFRDICT"
     PLFRDICT = "PLFRDICT"
     FFILEDICT = "FFILEDICT"
+    PROJECT = 'Project'
     PROJECTOBJECTS = 'ProjectObjects'
     UNCOMMITTEDDOCUMENTIDS = 'UncommittedDocumentIDs'
     UNCOMMITTEDOBJECTS = "UncommittedObjects"
@@ -98,6 +99,7 @@
                  (USER, 0),
                  (ROLES, 0),
                  (PDRMAP, 0),
+                 (PROJECT, 0),
                  (PROJECTOBJECTS, 0),
                  (PMBYPRIMARYKEY, 1),
                  (PVBYPRIMARYKEY, 1),
@@ -968,6 +970,11 @@
         return projects
 
     
+    def GetProjects(self):
+        projects = self.dbroot[self.PROJECT]
+        return projects
+
+    
     def GetRoles(self):
         return self.dbroot[self.ROLES]
     
@@ -1012,13 +1019,14 @@
  
     def saveCompoundKey(self, obj, key):
         dictname = None
-        if obj.__class__.__name__ == 'ProductModelVersion':
+        classname = obj.__class__.__name__
+        if classname == 'ProductModelVersion':
             dictname = self.PMVBYPRIMARYKEY
-        elif obj.__class__.__name__ == 'ProductModelMaster':
+        elif classname == 'ProductModelMaster':
             dictname = self.PMMBYPRIMARYKEY
-        elif obj.__class__.__name__ == 'ProductVersion':
+        elif classname == 'ProductVersion':
             dictname = self.PVBYPRIMARYKEY
-        elif obj.__class__.__name__ == 'ProductMaster':
+        elif classname == 'ProductMaster':
             dictname = self.PMBYPRIMARYKEY
         if dictname:
             self.dbroot[dictname][key] = obj
@@ -1039,14 +1047,19 @@
         self.dbroot[self.PROJECTOBJECTS] = objects
         self.Commit()
 
+    def SetProjects(self, objects):
+        self.dbroot[self.PROJECT] = objects
+        self.Commit()
+
     def Save(self, unsavedlist, override = false):
         #print "localdb.save"
         retlist = []
         if unsavedlist:
             #print "have unsaved list; len: " + str(len(unsavedlist))
             for obj in unsavedlist:
-                #print obj.__class__.__name__, obj.id, obj.name
-                if obj.__class__.__name__ == "AssemblyComponentUsage":
+                classname = obj.__class__.__name__
+                #print classname, obj.id, obj.name
+                if classname == "AssemblyComponentUsage":
                     #print "localdb.save.acu"
                     if self.dbroot[self.ACUDICT].has_key(obj.pgef_oid):
                         #print "have key"
@@ -1065,7 +1078,7 @@
                         #print "no key", obj.pgef_oid, obj.id
                         retlist.extend(self.SaveACU([obj]))
 
-                elif obj.__class__.__name__ == "ProductModelVersion":
+                elif classname == "ProductModelVersion":
                     #print "have ProductModelVersion"
                     if self.dbroot[self.ITEMDICT].has_key(obj.pgef_oid):
                         #print "have key"
@@ -1083,7 +1096,7 @@
                         #print "no key"
                         self.SavePMV([obj])
                         
-                elif obj.__class__.__name__ == "PartsList":
+                elif classname == "PartsList":
                     #print "have partslist"
 
                     if self.dbroot[self.PARTSLISTDICT].has_key(obj.pgef_oid):
@@ -1095,7 +1108,7 @@
                     else:
                         self.SavePartsList([obj])
 
-                elif obj.__class__.__name__ == "ProductDocumentRelationship":
+                elif classname == "ProductDocumentRelationship":
                     #print "save pdr " + obj.pgef_oid
 
                     if self.dbroot[self.PDRDICT].has_key(obj.pgef_oid):
@@ -1127,7 +1140,7 @@
                     else:
                         self.SaveDocument([obj])
                         
-                elif obj.__class__.__name__ == "ProductModelMaster":
+                elif classname == "ProductModelMaster":
                     #print 'found a ProductModelMaster'
                     if self.dbroot[self.PRODUCTMODELMASTER].has_key(obj.pgef_oid):
                         if self.dbroot[self.PRODUCTMODELMASTER][obj.pgef_oid].state:
@@ -1138,7 +1151,7 @@
                     else:
                         self.SavePMM([obj]) 
                         
-                elif obj.__class__.__name__ == "ProductVersion":
+                elif classname == "ProductVersion":
                     #print 'found a ProductVersion'
                     if self.dbroot[self.PRODUCTVERSION].has_key(obj.pgef_oid):
                         if self.dbroot[self.PRODUCTVERSION][obj.pgef_oid].state:
@@ -1149,7 +1162,7 @@
                     else:
                         self.SavePV([obj])  
                         
-                elif obj.__class__.__name__ == "ProductMaster":
+                elif classname == "ProductMaster":
                     #print 'found a ProductMaster'
                     if self.dbroot[self.PRODUCTMASTER].has_key(obj.pgef_oid):
                         if self.dbroot[self.PRODUCTMASTER][obj.pgef_oid].state:
@@ -1160,7 +1173,7 @@
                     else:
                         self.SavePM([obj])
                         
-                elif obj.__class__.__name__ == "WfProcess":
+                elif classname == "WfProcess":
                     #print "localdb.save.wfprocess"
                     if self.dbroot[self.WFPROCESS].has_key(obj.pgef_oid):
                         #print "have key"
@@ -1179,7 +1192,7 @@
                         #print "no key", obj.pgef_oid
                         self.SaveWfProcess([obj])
 
-                elif obj.__class__.__name__ == "WfActivity":
+                elif classname == "WfActivity":
                     #print "localdb.save.wfactivity"
                     if self.dbroot[self.WFACTIVITY].has_key(obj.pgef_oid):
                         #print "have key"
@@ -1198,7 +1211,7 @@
                         #print "no key", obj.pgef_oid
                         self.SaveWfActivity([obj])
 
-                elif obj.__class__.__name__ == "WfEventAudit":
+                elif classname == "WfEventAudit":
                     #print "localdb.save.wfeventaudit"
                     if self.dbroot[self.WFEVENTAUDIT].has_key(obj.pgef_oid):
                         #print "have key"
@@ -1217,7 +1230,7 @@
                         #print "no key", obj.pgef_oid
                         self.SaveWfEventAudit([obj])
 
-                elif obj.__class__.__name__ == "WfTransition":
+                elif classname == "WfTransition":
                     if self.dbroot[self.WFTRANSITION].has_key(obj.pgef_oid):
                         #print "have key"
                         #print "objid: " + obj.pgef_oid
@@ -1234,25 +1247,26 @@
                     else:
                         #print "no key", obj.pgef_oid
                         self.SaveWfTransition([obj])
-                elif obj.__class__.__name__ == "Project":
-                    if self.dbroot[self.PROJECTOBJECTS].has_key(obj.pgef_oid):
+                elif classname == "Project":
+                    print "saving a project.  not project objects"
+                    if self.dbroot[self.PROJECT].has_key(obj.pgef_oid):
                         #print "have key"
                         #print "objid: " + obj.pgef_oid
                         #print "obj state: " + str(obj.state)
-                        if self.dbroot[self.PROJECTOBJECTS][obj.pgef_oid].state:
+                        if self.dbroot[self.PROJECT][obj.pgef_oid].state:
                             #print "have state"
                             #print "obj.state " + str(obj.state)
                             if override:
                                 #print "override", obj.pgef_oid
-                                self.dbroot[self.PROJECTOBJECTS][obj.pgef_oid] = obj
+                                self.dbroot[self.PROJECT][obj.pgef_oid] = obj
                         else:
                             #print "no state", obj.pgef_oid
-                            self.dbroot[self.PROJECTOBJECTS][obj.pgef_oid] = obj
+                            self.dbroot[self.PROJECT][obj.pgef_oid] = obj
                     else:
                         #print "no key", obj.pgef_oid
-                        self.dbroot[self.PROJECTOBJECTS][obj.pgef_oid] = obj
+                        self.dbroot[self.PROJECT][obj.pgef_oid] = obj
                 else:
-                    print "have unknown obj to save", obj.__class__.__name__, obj.id
+                    print "have unknown obj to save", classname, obj.id
                    
         self.Commit()
         #print "retlist", retlist

From waterbug at ned.gsfc.nasa.gov  Wed Oct 29 17:07:22 2003
From: waterbug at ned.gsfc.nasa.gov (waterbug CVS)
Date: Wed Oct 29 17:07:24 2003
Subject: [Pangalactic-commits] Inching toward mapped classes ...
Message-ID: <200310292207.h9TM7M24005047@ned.gsfc.nasa.gov>

Modified files:
PanGalactic/pangalactic/repo/pger.py 1.46 1.47
PanGalactic/pangalactic/repo/pgercred.py 1.4 1.5
PanGalactic/pangalactic/repo/registry.py 1.35 1.36
PanGalactic/pangalactic/repo/xmlrpc.py 1.22 1.23

Log message:
Inching toward mapped classes ...


Index: PanGalactic/pangalactic/repo/xmlrpc.py
diff -u PanGalactic/pangalactic/repo/xmlrpc.py:1.22 PanGalactic/pangalactic/repo/xmlrpc.py:1.23
--- PanGalactic/pangalactic/repo/xmlrpc.py:1.22	Tue Oct  7 23:39:36 2003
+++ PanGalactic/pangalactic/repo/xmlrpc.py	Wed Oct 29 17:07:21 2003
@@ -1,9 +1,9 @@
 """
 PGER XML-RPC Interfaces module
-@version: $Revision: 1.22 $
+@version: $Revision: 1.23 $
 """
 
-__version__ = "$Revision: 1.22 $"[11:-2]
+__version__ = "$Revision: 1.23 $"[11:-2]
 # $Source: /repo/step_testbed/PanGalactic/pangalactic/repo/xmlrpc.py,v $
 
 from twisted.web import xmlrpc
@@ -32,15 +32,21 @@
         self.PGER = pgr
 
     def xmlrpc_yo(self):
-        """xmlrpc yo."""
+        """
+        XMLRPC yo.
+        """
         return 'Yo'
 
     def xmlrpc_openPodBayDoor(self):
-        """xmlrpc request to open the pod bay door."""
+        """
+        XMLRPC request to open the Pod Bay Door.
+        """
         return """I'm sorry, Dave, I'm afraid I can't do that."""
 
     def xmlrpc_test_echoargs(self, *args):
-        """xmlrpc request for echo of args."""
+        """
+        XMLRPC request for echo of arguments.
+        """
         if args:
             l = list(args)
             return l
@@ -49,6 +55,17 @@
             s += """ya gotta have somethin' ...!"""
             return s
 
+    def xmlrpc_echo_binary(self, blob):
+        """
+        XMLRPC request with binary data."""
+        if blob:
+            comment = 'I got this from you'
+            return [comment, blob]
+        else:
+            s = """Nothin' from nothin' LEAVES nothin', """
+            s += """ya gotta have somethin' ...!"""
+            return s
+
     def xmlrpc_getObjects(self, typename, refs,
                                 subtypes, criteria):
         """
@@ -101,30 +118,60 @@
     def xmlrpc_addObjects(self, extracts):
         """xmlrpc method to add objects.
 
-        usage:  addObjects(list of extracts)
+        @type extracts:   list
+        @param extracts:  a list of extracts (for the definition
+                          of extracts, see
+                          L{pangalactic.utils.factory.PgefFactory})
+
+        @rtype:   list
+        @return:  a list of extracts:  the objects that were
+                  added, with any relevant updates (e.g.,
+                  timedate stamps)
         """
-        # TODO: it would be more efficient to convert the extract
-        # directly into the (classname, kw) used by PgerDb's
-        # addRow(), rather than making an object and then
-        # creating the (classname, kw) from that.  But this is
-        # easier for now ...
         if extracts:
-            # need some error checking here!
-            # also, could make it so arg could be either a single
-            # extract or a list of extracts ...
+            return self.PGER.addExtracts(extracts)
+        else:
+            return """I'm sorry, Dave, I'm afraid I can't do that."""
+
+    def xmlrpc_addObjectsAndBlobs(self, extracts, blobs):
+        """xmlrpc method to add objects.
+
+        @type extracts:   list
+        @param extracts:  a list of extracts (for the definition
+                          of extracts, see
+                          L{pangalactic.utils.factory.PgefFactory})
+
+        @type blobs:  list
+        @param blobs: a list of binary objects, which will be
+                      saved to files on the server and referenced
+                      from PgefFile objects.  NOTE:  for each blob,
+                      there should be a corresponding
+                      L{pangalactic.enterprise.pgeffile.PgefFile}
+                      instance in the list of extracts, and they
+                      should occur in the same order in the
+                      extracts as their blob occurs in the blobs
+                      list.
+
+        @rtype:   list
+        @return:  a list of extracts:  the objects that were
+                  added, with any relevant updates (e.g.,
+                  timedate stamps)
+        """
+        if extracts and data:
+            try:
+                res = self.PGER.addExtracts(extracts)
+            except:
+                text = """I'm sorry, Dave, there was a problem"""
+                text += """with your objects."""
+                return text
+            # if the extracts have been added successfully, write
+            # the blobs to files ...
+        elif extracts:
             return self.PGER.addExtracts(extracts)
         else:
             return """I'm sorry, Dave, I'm afraid I can't do that."""
 
     def xmlrpc_createProductMaster(self, *args):
-        # Could define args as keyword args (a la 'parm=value'
-        # syntax), but then XMLRPC won't check anything for us
-        # because it doesn't know from keyword args.  So which
-        # is worse:  plain args and you have to remember the
-        # order, or kw args and you have to remember the
-        # spelling and the weird 'parm=value' syntax ...?
-        # Right now they are split:  required args are strictly
-        # positional and optional args are strictly keywords.
         if args:
             kw = keywordify(args)
             pmoid = self.PGER.createProductMaster(**kw)

Index: PanGalactic/pangalactic/repo/pger.py
diff -u PanGalactic/pangalactic/repo/pger.py:1.46 PanGalactic/pangalactic/repo/pger.py:1.47
--- PanGalactic/pangalactic/repo/pger.py:1.46	Mon Oct 27 15:16:56 2003
+++ PanGalactic/pangalactic/repo/pger.py	Wed Oct 29 17:07:21 2003
@@ -1,9 +1,9 @@
 """
 Pan Galactic Entropy Reverser module
-@version: $Revision: 1.46 $
+@version: $Revision: 1.47 $
 """
 
-__version__ = "$Revision: 1.46 $"[11:-2]
+__version__ = "$Revision: 1.47 $"[11:-2]
 # $Source: /repo/step_testbed/PanGalactic/pangalactic/repo/pger.py,v $
 
 import time
@@ -89,9 +89,51 @@
 
     def getResultSets(self, typename, refs=0, subtypes=0, **kw):
         """
+        (A wrapper interface through which any PgefObject subclass
+        can be requested.)  For core object classes, call
+        _getResultSets.  For mapped object classes, call the
+        specific interface associated with that typename (e.g.,
+        getDocuments), with some reasonable defaults (e.g., for
+        Documents, get only the current version).
+
+        @type  typename:  string
+        @param typename:  the name of a PGER object type (i.e., a
+                          subtype of
+                          L{pangalactic.enterprise.pgefobject.PgefObject})
+
+        @type  refs:  integer
+        @param refs:  specifies whether to include the objects
+                      referenced by the specified class.
+                          0:  (default) do not get refs
+                          1:  get all references
+                      (in future, refs may specify how many
+                      reference levels to follow ...)
+
+        @type  subtypes:  boolean
+        @param subtypes:  specifies whether to include only the
+                          specified class (the default) or all
+                          subtypes.
+                              0:  (default) only this type
+                              1:  include subtypes
+
+        @param kw:  keyword arguments of the form:
+                        key:   an attribute of the object
+                        value: the value to be selected by
+
+        @rtype:  list
+        @return: list of pyPgSQL result sets
+        """
+        if typename in self._registry.mapped_classes:
+            if self._registry.pgef_classes[typename] == 'Document':
+                return self.getDocuments(subtypes, objects=0, **kw)
+        else:
+            return self._getResultSets(typename, refs, subtypes, **kw)
+
+    def _getResultSets(self, typename, refs=0, subtypes=0, **kw):
+        """
         From the table corresponding to the specified type, get
         all PGERDB rows that match the supplied kw parameters.
-           - usage:  getResultSets([object type name], refs, **kw)
+           - usage:  _getResultSets([object type name], refs, **kw)
            - return a list of pyPgSQL ResultSet instances
            - TO DO:  role-based authorization checks based on
              object type, etc.
@@ -101,7 +143,7 @@
                           subtype of
                           L{pangalactic.enterprise.pgefobject.PgefObject})
 
-        @type  refs:  integer
+        @type  refs:  boolean
         @param refs:  specifies whether to include the objects
                       referenced by the specified class.
                           0:  (default) do not get refs
@@ -192,8 +234,8 @@
                                 [refs,] 
                                 [subtypes,] 
                                 **kw)
-           - get any repository object type by attributes
-           - return a list of objects
+           - get repository objects by attributes
+           - return a list of the objects
            - TO DO:  role-based authorization checks based on
              object type, etc.
 
@@ -228,15 +270,79 @@
             dbargs = []
             for a in kw.keys():
                 if not a in self._registry.table_cols[table]:
-                    raise ValueError, '%s is not in the schema of %s' % (a, tn)
+                    e = '%s is not in the table schema of %s' % (a, tn)
+                    raise ValueError, e
                 dbargs.append((a, kw[a]))
-            result = self._pgerdb.doPgerdbQuery(table, 0, *dbargs)
+            result = self._pgerdb.doPgerdbQuery(table, subtypes, *dbargs)
             result.addErrback(log.err)
             return result.addCallback(lambda res: 
                                       self._factory.makeObjects(tn, res))
         else:
             raise ValueError, 'No criteria were supplied.'
 
+    def getDocuments(self, typename, subtypes=0, objects=0, **kw):
+        """
+        Get all Document objects of a specified type that match
+        the supplied kw parameters
+           - usage:  getDocuments([Document subtype], 
+                                  [subtypes,] 
+                                  [objects,] 
+                                  **kw)
+           - get Documents by attributes
+           - return a list of Document objects or resultsets
+           - TO DO:  role-based authorization checks based on
+             Documents type, etc.
+
+        @type  typename:  string
+        @param typename:  the name of the document class (a subtype of
+                          L{pangalactic.enterprise.document.Document})
+
+        @type  subtypes:  boolean
+        @param subtypes:  specifies whether to include only the
+                          specified class (the default) or all
+                          subtypes.
+                            - 0:  only this type
+                            - 1:  include subtypes
+
+        @type  objects:  boolean
+        @param objects:  specifies whether to return objects
+                         of the type specified or resultsets.
+                           - 0:  resultsets
+                           - 1:  objects
+
+        @param kw:  keyword arguments of the form:
+                        key:   an attribute of the object
+                        value: the value to be selected by
+
+        @rtype:   list
+        @return:  list of either resultsets (default, object=0)
+                  or Document (or subtype) objects (object=1).
+        """
+        # TODO: implement refs and subtypes ...
+        view = self._registry.getViewName(typename)
+        viewall = view + '_all'
+        tn = typename
+        if kw:
+            # basic validity check on kw args ...
+            dbargs = []
+            for a in kw.keys():
+                if not a in self._registry.view_cols[view]:
+                    e = '%s is not in the view schema of %s' % (a, tn)
+                    raise ValueError, e
+                dbargs.append((a, kw[a]))
+            if subtypes:
+                result = self._pgerdb.doPgerdbQuery(viewall, 0, *dbargs)
+            else:
+                result = self._pgerdb.doPgerdbQuery(view, 0, *dbargs)
+            result.addErrback(log.err)
+            if objects:
+                return result.addCallback(lambda res: 
+                                      self._factory.makeObjects(tn, res))
+            else:
+                return result
+        else:
+            raise ValueError, 'No criteria were supplied.'
+
     def getDisplayMappings(self, typename=None):
         """
         Given an object type name, return a mapping of attribute
@@ -267,7 +373,7 @@
 
 
     def search(self, typename, refs=1, subtypes=0,
-               returntype='objects', *args):
+               objects=0, *args):
         """
         Search for all records from the table or view that
         matches the specified arguments for the specified type.
@@ -284,6 +390,27 @@
                           subtype of
                           L{pangalactic.enterprise.pgefobject.PgefObject})
 
+        @type  refs:  boolean
+        @param refs:  specifies whether to include the objects
+                      referenced by the specified class.
+                          0:  (default) do not get refs
+                          1:  get all references
+                      (in future, refs may specify how many
+                      reference levels to follow ...)
+
+        @type  subtypes:  boolean
+        @param subtypes:  specifies whether to include only the
+                          specified class (the default) or all
+                          subtypes.
+                              0:  (default) only this type
+                              1:  include subtypes
+
+        @type  objects:  boolean
+        @param objects:  specifies whether to return objects
+                         of the type specified or resultsets.
+                           - 0:  resultsets
+                           - 1:  objects
+
         @type args:   sequence
         @param args:  a list of query element tuples, in which each
                       tuple has the form:
@@ -311,12 +438,6 @@
                         column name) or a list or tuple of column
                         names
 
-                      - B{returntype}:  type of things to return;
-                        the valid returntypes implemented so far are: 
-
-                          - 'objects' ...... PgefObject subtype instances
-                          - 'resultsets' ... database result sets
-
         @rtype:   L{twisted.internet.defer.Deferred}
                   sequence of resultsets or sequence of
                   instances of subtypes of
@@ -334,7 +455,6 @@
                     raise TypeError, e
                 elif a[0] == 'fulltext':
                     # do Glimpse search on fulltext string
-                    # TO DO:  get returntype from call
                     dft = self._searchFulltext(typename, a[1])
                     fulltext = 1
                 else:
@@ -344,7 +464,7 @@
                 # TODO: implement refs and subtypes ...
                 result = self._pgerdb.doPgerdbQuery(table, 0, *dbargs)
                 result.addErrback(log.err)
-            if returntype == 'objects':
+            if objects:
                 return result.addCallback(lambda res: 
                             self._factory.makeObjects(typename, res))
             else:

Index: PanGalactic/pangalactic/repo/pgercred.py
diff -u PanGalactic/pangalactic/repo/pgercred.py:1.4 PanGalactic/pangalactic/repo/pgercred.py:1.5
--- PanGalactic/pangalactic/repo/pgercred.py:1.4	Fri Sep 26 22:30:49 2003
+++ PanGalactic/pangalactic/repo/pgercred.py	Wed Oct 29 17:07:21 2003
@@ -1,9 +1,9 @@
 """
 Authentication and credentials for PGEF.
-@version: $Revision: 1.4 $
+@version: $Revision: 1.5 $
 """
 
-__version__ = "$Revision: 1.4 $"[11:-2]
+__version__ = "$Revision: 1.5 $"[11:-2]
 # $Source: /repo/step_testbed/PanGalactic/pangalactic/repo/pgercred.py,v $
 
 ## Our hacky authorizer
@@ -36,7 +36,7 @@
         self.db = db
 
     def verifyPlainPassword(self, plaintext):
-        return self.db.doPgerdbQuery('persons', 0,
+        return self.db.doPgerdbQuery('person', 0, 0,
                               ('id',self.name),
                               ('password', md5.md5(plaintext).hexdigest())
                               ).addCallback(self.gotUsers)
@@ -70,6 +70,6 @@
         return self._updatePassword()
 
     def _updatePassword(self):
-        return self.db.runOperation("UPDATE persons SET password='%s' WHERE id='%s';" %
+        return self.db.runOperation("UPDATE person SET password='%s' WHERE id='%s';" %
                                     (self.hashedPassword, self.name))
 

Index: PanGalactic/pangalactic/repo/registry.py
diff -u PanGalactic/pangalactic/repo/registry.py:1.35 PanGalactic/pangalactic/repo/registry.py:1.36
--- PanGalactic/pangalactic/repo/registry.py:1.35	Mon Oct 27 16:44:18 2003
+++ PanGalactic/pangalactic/repo/registry.py	Wed Oct 29 17:07:21 2003
@@ -1,9 +1,9 @@
 """
 Pan Galactic Engineering Repository Object Registry
-@version: $Revision: 1.35 $
+@version: $Revision: 1.36 $
 """
  
-__version__ = "$Revision: 1.35 $"[11:-2]
+__version__ = "$Revision: 1.36 $"[11:-2]
 # $Source: /repo/step_testbed/PanGalactic/pangalactic/repo/registry.py,v $
 
 import string, re
@@ -54,7 +54,7 @@
         L{pangalactic.utils.registry.PgefRegistry}.)
         A dictionary of all application classes that have been
         derived from PgefObject or one of its subclasses and have
-        been mapped into the pgerdb_classes.
+        been mapped into the core_classes.
             - key   = class name
             - value = class object
 
@@ -67,13 +67,25 @@
             - key   = class name
             - value = port on which the glimpseserver is listening
 
-    @ivar pgerdb_classes:
-        pgerdb_classes are the subset of pgef_classes that map
+    @ivar core_classes:
+        core_classes are the subset of pgef_classes that map
         directly to pgerdb tables.  When the PgerObjectRegistry
         initializes, it populates this dictionary by querying the
         PostgreSQL system tables, comparing the candidate object
-        names to the pgef_classes, and copying any matching
-        entries into pgerdb_classes.
+        names to the pgef_classes, checking whether views exist
+        for those classes and if not, copying any matching
+        entries into core_classes.
+            - key   = class name
+            - value = class object
+
+    @ivar mapped_classes:
+        mapped_classes are the subset of pgef_classes that are
+        mapped into pgerdb tables using views.  When the
+        PgerObjectRegistry initializes, it populates this
+        dictionary by querying the PostgreSQL system tables,
+        comparing the candidate object names to the pgef_classes,
+        checking whether views exist for those classes and if so,
+        copying any matching entries into mapped_classes.
             - key   = class name
             - value = class object
 
@@ -100,7 +112,7 @@
         automagically, the following naming rule for foreign key
         constraints is used in pgerdb:
 
-        self.pgerdb_classes[classname]._std_abbrev + '_has' + 
+        self.core_classes[classname]._std_abbrev + '_has' + 
         [attribute name that points to referenced object]
 
     @ivar table_cols:
@@ -169,26 +181,58 @@
         pgerdbtables = []
         for item in result:
             pgerdbtables.append(item[0])
+        # ... and all view names ...
+        conn = PgSQL.connect(database=dbname)
+        curs = conn.cursor()
+        curs.execute("""SELECT c.relname FROM pg_class c \
+                        WHERE c.relkind IN ('v','') \
+                        AND c.relname !~ '^pg_'""")
+        result = curs.fetchall()
+        pgerdbviews = []
+        for item in result:
+            pgerdbviews.append(item[0])
+            # DEBUG
+            # print 'pgerdbviews is ', pgerdbviews
         # use table names to generate a dictionary of possible
-        # pgerdb_class names keyed by  name (mn2cn) ...
-        self.pgerdb_classes = {}
+        # core_classes keyed by name ...
+        self.core_classes = {}
+        self.mapped_classes = {}
         for tname in pgerdbtables:
+            vn = tname + '_view'
             cn = self.getClassName(tname)
             if cn in self.pgef_classes:
-                self.pgerdb_classes[cn] = self.pgef_classes[cn]
-        # initialize self.pgerdb_classes, self.refd_objs,
+                if vn not in pgerdbviews:
+                    self.core_classes[cn] = self.pgef_classes[cn]
+                else:
+                    self.mapped_classes[cn] = self.pgef_classes[cn]
+        # initialize self.refd_objs
         self.refd_objs = {}
-        for oname in self.pgerdb_classes:
-            klass = self.pgerdb_classes[oname]
-            self.refd_objs[oname] = getattr(klass, '_refd',
-                                            None)
-        # build table_* dictionaries ...
+        for oname in self.core_classes:
+            klass = self.core_classes[oname]
+            self.refd_objs[oname] = getattr(klass, '_refd', None)
+        # build table_* and view_* dictionaries ...
         self.table_cols = {}
         self.table_pkeys = {}
         self.constraint_fk_maps = {}
         self.refd_obj_fk_constraints = {}
         self.obj_init_parms = {}
         self.obj_nonkey_attrs = {}
+        self.view_cols = {}
+        for viewname in pgerdbviews:
+            # find the oid for viewname ...
+            curs.execute("SELECT oid FROM pg_class \
+                          WHERE relname = %s", viewname)
+            result = curs.fetchall()
+            oid = result[0][0]
+            # build self.view_cols[viewname] ...
+            self.view_cols[viewname] = []
+            curs.execute("SELECT attname FROM pg_attribute \
+                          WHERE attnum > 0 \
+                          AND attrelid = %s \
+                          ORDER BY attnum", oid)
+            result = curs.fetchall()
+            for item in result:
+                self.view_cols[viewname].append(item[0])
         for tablename in pgerdbtables:
             classname = self.getClassName(tablename)
             # DEBUG: print '\ndoing table %s' % tablename
@@ -231,11 +275,11 @@
             # DEBUG: print '  added pkeys to obj_init_parm_list:  %s' % obj_init_parm_list
             # then see if this obj has any referenced obj's, in
             # which case we need to add their fkeys ...
-            if (classname in self.pgerdb_classes
+            if (classname in self.core_classes
                 and self.refd_objs[classname]):
                 # compute foreign key constraint names ...
                 # print '\n ** computing fk const names for %s\n' % classname
-                std_abbrev = self.pgerdb_classes[classname]._std_abbrev
+                std_abbrev = self.core_classes[classname]._std_abbrev
                 for att in self.refd_objs[classname]:
                     constrname = std_abbrev + '_has' + att
                     sqlcmd = """SELECT tgargs FROM pg_trigger WHERE tgrelid = %s AND """
@@ -291,7 +335,7 @@
                     self.obj_nonkey_attrs[classname][self.table_cols[tablename].index(a)] = a
 #         # create pger_schemas dictionary:
 #         self.pger_schemas = {}
-#         for classname in self.pgerdb_classes:
+#         for classname in self.core_classes:
 #             self.pger_schemas[classname] = Schema(self.table_cols[self.getTableName(classname)])
 #             for refd_class in self.refd_objs[classname]:
 #                 self.pger_schemas[classname].add(refd_class)
@@ -350,6 +394,29 @@
         else:
             return None
 
+    def getViewName(self, oname):
+        """I take a camelcase object name and return an
+        underscore-delimited, lowercase view name.
+        """
+        patt = re.compile('([A-Z])')
+        l = re.split(patt, oname)
+        parts = l[1:]
+        if 0 < len(parts) < 3:
+            tname = string.lower(parts[0] + parts[1]) + '_view'
+            return tname
+        elif len(parts) > 2:
+            tname = parts[0] + parts[1]
+            i = 2
+            while i < len(parts):
+                if i % 2 == 0:
+                    tname = tname + '_'
+                tname = tname + parts[i]
+                i += 1
+            tname = tname.lower() + '_view'
+            return tname
+        else:
+            return None
+
     def report(self):
         """
         I generate a plain text report on the PgerObjectRegistry
@@ -367,12 +434,12 @@
         else:
             print "    - None."
         print '--------------------------------------------------'
-        for classname in self.pgerdb_classes:
-            print '\nObject Class:              %s' % classname
-            print '  Std Abbrev:              %s' % self.pgerdb_classes[classname]._std_abbrev
+        for classname in self.core_classes:
+            print '\nCore Class:              %s' % classname
+            print '  Std Abbrev:              %s' % self.core_classes[classname]._std_abbrev
             print '  Factory Init Parm List:  %s' % str(self.obj_init_parms[classname].values())
             t = self.getTableName(classname)
-            refd = self.pgerdb_classes[classname]._refd
+            refd = self.core_classes[classname]._refd
             if refd:
                 nolisting = []
                 for k in refd:

From waterbug at ned.gsfc.nasa.gov  Wed Oct 29 17:22:39 2003
From: waterbug at ned.gsfc.nasa.gov (waterbug CVS)
Date: Wed Oct 29 17:22:40 2003
Subject: [Pangalactic-commits] More views.
Message-ID: <200310292222.h9TMMdd8005286@ned.gsfc.nasa.gov>

Modified files:
PanGalactic/src/sql/createPgerDbViews.sql 1.1 1.2
PanGalactic/src/sql/setup_pgerdb.sh 1.4 1.5

Log message:
More views.


Index: PanGalactic/src/sql/createPgerDbViews.sql
diff -u PanGalactic/src/sql/createPgerDbViews.sql:1.1 PanGalactic/src/sql/createPgerDbViews.sql:1.2
--- PanGalactic/src/sql/createPgerDbViews.sql:1.1	Thu Oct 16 20:09:57 2003
+++ PanGalactic/src/sql/createPgerDbViews.sql	Wed Oct 29 17:22:37 2003
@@ -2,7 +2,169 @@
 
 /* $Source: /repo/step_testbed/PanGalactic/src/sql/createPgerDbViews.sql,v $ */
 
-CREATE VIEW document_map
+CREATE VIEW document_view
+    (
+        pgef_oid,
+        pgef_class,
+        id,
+        id_context,
+        pgef_security_mask,
+        name,
+        short_description,
+        long_description,
+        pger_owner,
+        pger_owner_context,
+        pger_creator,
+        pger_creator_context,
+        pger_create_datetime,
+        pger_modifier,
+        pger_modifier_context,
+        pger_mod_datetime,
+        owner,
+        owner_context,
+        creator,
+        creator_context,
+        create_datetime,
+        modifier,
+        modifier_context,
+        mod_datetime,
+        master,
+        dm_pgef_oid,
+        dm_pgef_class,
+        dm_id,
+        dm_id_context,
+        dm_pgef_security_mask,
+        dm_name,
+        dm_short_description,
+        dm_long_description,
+        dm_pger_owner,
+        dm_pger_owner_context,
+        dm_pger_creator,
+        dm_pger_creator_context,
+        dm_pger_create_datetime,
+        dm_pger_modifier,
+        dm_pger_modifier_context,
+        dm_pger_mod_datetime,
+        dm_owner,
+        dm_owner_context,
+        dm_creator,
+        dm_creator_context,
+        dm_create_datetime,
+        dm_modifier,
+        dm_modifier_context,
+        dm_mod_datetime,
+        dm_structural_role,
+        dm_doc_type_code,
+        dm_doc_type_code_context,
+        dv_pgef_oid,
+        dv_pgef_class,
+        dv_id,
+        dv_id_context,
+        dv_pgef_security_mask,
+        dv_name,
+        dv_short_description,
+        dv_long_description,
+        dv_pger_owner,
+        dv_pger_owner_context,
+        dv_pger_creator,
+        dv_pger_creator_context,
+        dv_pger_create_datetime,
+        dv_pger_modifier,
+        dv_pger_modifier_context,
+        dv_pger_mod_datetime,
+        dv_owner,
+        dv_owner_context,
+        dv_creator,
+        dv_creator_context,
+        dv_create_datetime,
+        dv_modifier,
+        dv_modifier_context,
+        dv_mod_datetime,
+        dv_of_dm_id,
+        dv_of_dm_id_context,
+        dv_tag,
+        dv_content,
+        dv_abstract,
+        dr_pgef_oid,
+        dr_pgef_class,
+        dr_id,
+        dr_id_context,
+        dr_pgef_security_mask,
+        dr_name,
+        dr_short_description,
+        dr_long_description,
+        dr_pger_owner,
+        dr_pger_owner_context,
+        dr_pger_creator,
+        dr_pger_creator_context,
+        dr_pger_create_datetime,
+        dr_pger_modifier,
+        dr_pger_modifier_context,
+        dr_pger_mod_datetime,
+        dr_owner,
+        dr_owner_context,
+        dr_creator,
+        dr_creator_context,
+        dr_create_datetime,
+        dr_modifier,
+        dr_modifier_context,
+        dr_mod_datetime,
+        dr_of_dv_id,
+        dr_of_dm_id,
+        dr_of_dm_id_context,
+        dr_manifestation,
+        df_pgef_oid,
+        df_pgef_class,
+        df_id,
+        df_id_context,
+        df_pgef_security_mask,
+        df_name,
+        df_short_description,
+        df_long_description,
+        df_pger_owner,
+        df_pger_owner_context,
+        df_pger_creator,
+        df_pger_creator_context,
+        df_pger_create_datetime,
+        df_pger_modifier,
+        df_pger_modifier_context,
+        df_pger_mod_datetime,
+        df_owner,
+        df_owner_context,
+        df_creator,
+        df_creator_context,
+        df_create_datetime,
+        df_modifier,
+        df_modifier_context,
+        df_mod_datetime,
+        df_location,
+        df_user_file_name,
+        df_secured_flag,
+        df_bytes,
+        df_mime_type,
+        df_mime_subtype,
+        df_mime_parameters,
+        df_of_dr_id,
+        df_of_dv_id,
+        df_of_dm_id,
+        df_of_dm_id_context
+    )
+    AS SELECT *
+    FROM ONLY document d, doc_master dm,
+    doc_version dv, doc_rep dr,
+    dr_file df
+    WHERE dm.pgef_oid = d.master
+    AND dv.of_dm_id = dm.id
+    AND dv.of_dm_id_context = dm.id_context
+    AND dr.of_dv_id = dv.id
+    AND dr.of_dm_id = dv.of_dm_id
+    AND dr.of_dm_id_context = dv.of_dm_id_context
+    AND df.of_dr_id = dr.id
+    AND df.of_dv_id = dr.of_dv_id
+    AND df.of_dm_id = dr.of_dm_id
+    AND df.of_dm_id_context = dr.of_dm_id_context;
+
+CREATE VIEW document_all_view
     (
         pgef_oid,
         pgef_class,

Index: PanGalactic/src/sql/setup_pgerdb.sh
diff -u PanGalactic/src/sql/setup_pgerdb.sh:1.4 PanGalactic/src/sql/setup_pgerdb.sh:1.5
--- PanGalactic/src/sql/setup_pgerdb.sh:1.4	Sun Jun 15 21:39:02 2003
+++ PanGalactic/src/sql/setup_pgerdb.sh	Wed Oct 29 17:22:37 2003
@@ -1,6 +1,6 @@
 #!/bin/bash
 
-# $Id: setup_pgerdb.sh,v 1.4 2003/06/16 01:39:02 radix Exp $
+# $Id: setup_pgerdb.sh,v 1.5 2003/10/29 22:22:37 waterbug Exp $
 
 # Creates pgerdb if it doesn't exist yet and builds its tables
 
@@ -8,4 +8,5 @@
     createdb pgerdb
 fi
 psql pgerdb < createPgerDbTables.sql
+psql pgerdb < createPgerDbViews.sql
 

From waterbug at ned.gsfc.nasa.gov  Wed Oct 29 17:26:22 2003
From: waterbug at ned.gsfc.nasa.gov (waterbug CVS)
Date: Wed Oct 29 17:26:23 2003
Subject: [Pangalactic-commits] Oops ... now I remember why that name was
	better.
Message-ID: <200310292226.h9TMQMnT005371@ned.gsfc.nasa.gov>

Modified files:
PanGalactic/src/sql/createPgerDbViews.sql 1.2 1.3

Log message:
Oops ... now I remember why that name was better.


Index: PanGalactic/src/sql/createPgerDbViews.sql
diff -u PanGalactic/src/sql/createPgerDbViews.sql:1.2 PanGalactic/src/sql/createPgerDbViews.sql:1.3
--- PanGalactic/src/sql/createPgerDbViews.sql:1.2	Wed Oct 29 17:22:37 2003
+++ PanGalactic/src/sql/createPgerDbViews.sql	Wed Oct 29 17:26:20 2003
@@ -164,7 +164,7 @@
     AND df.of_dm_id = dr.of_dm_id
     AND df.of_dm_id_context = dr.of_dm_id_context;
 
-CREATE VIEW document_all_view
+CREATE VIEW document_view_all
     (
         pgef_oid,
         pgef_class,

From waterbug at ned.gsfc.nasa.gov  Wed Oct 29 17:27:03 2003
From: waterbug at ned.gsfc.nasa.gov (waterbug CVS)
Date: Wed Oct 29 17:27:04 2003
Subject: [Pangalactic-commits] More notes on classes.
Message-ID: <200310292227.h9TMR326005398@ned.gsfc.nasa.gov>

Modified files:
PanGalactic/doc/rst/NOTES.txt 1.2 1.3

Log message:
More notes on classes.


Index: PanGalactic/doc/rst/NOTES.txt
diff -u PanGalactic/doc/rst/NOTES.txt:1.2 PanGalactic/doc/rst/NOTES.txt:1.3
--- PanGalactic/doc/rst/NOTES.txt:1.2	Tue Jul 15 10:20:19 2003
+++ PanGalactic/doc/rst/NOTES.txt	Wed Oct 29 17:27:01 2003
@@ -3,8 +3,8 @@
 ======================
 
 :Author: Stephen Waterbury <stephen.c.waterbury@nasa.gov>
-:Version: $Revision: 1.2 $
-:Date: $Date: 2003/07/15 14:20:19 $
+:Version: $Revision: 1.3 $
+:Date: $Date: 2003/10/29 22:27:01 $
 
 
 ----------------------------------
@@ -237,31 +237,28 @@
     presentation and format (encoding) of the document.  Each
     DocRep references a unique DocVersion and a unique DocMaster.
 
+*DrFile*
+    The DrFile (document representation file) holds the
+    information associated with a specific content file
+    associated with a DocRep.  Each DrFile references a unique
+    DocRep.
+
 
 Document Management
 ===================
 
-The superclass for all documents in PGEF is Document.  What could
-be simpler?  Ah, but the good ole Document that we all know and
-love contains within it gobs of semantic innards that we tend to
-take for granted, but we do expect them to be there when needed!
-So in PGEF, Document is actually a subtype of DocVersion
-(document version), which acts as the supervisor for the classes
-that do the heavy lifting for Document's extensive collection of
-content, metadata, and presentation apparatus.
-
-Within the PGEF pantheon, DocVersion is the core entity in the
-trinity of DocMaster, DocVersion, and DocRep.  Any particular
-subtype of Document will need a customizable set of Properties
-and membership in any number of Categories -- most of these will
-apply to all versions, and so will be attached to the DocMaster,
-but some of them may also be introduced at the version or
-representation level and so will attach to those objects.  
+The superclass for all documents in PGEF is Document.  In PGEF,
+Document acts as the supervisor for the classes that do the heavy
+lifting for Document's extensive collection of content, metadata,
+and presentation apparatus:  DocMaster, DocVersion, DocRep, and
+DrFile.  Any particular subtype of Document will need a
+customizable set of Properties and membership in any number of
+Categories.  
 
-In summary, a Pan Galactic Document subclasses DocVersion, and
-has the following things:
+Document Attributes
+-------------------
 
-* a *pgef_class*
+* pgef_class
 
   Note that the pgef_class is the semantic definition of a class
   of documents; therefore, it is not the same as a 'Document
@@ -272,25 +269,46 @@
   possible to 'map' a semantic DTD into a Pan Galactic Enterprise
   document class, but that is a separate issue.)
 
-* a *DocMaster* (only one)
+* _master
+
+  The _master is a DocMaster instance, and there is only one
+  DocMaster associated with a Document.
+
+* _current_version
+
+  The _current_version is a DocVersion instance, and there is
+  only one _current_version associated with a document.
+
+* _versions
+
+  The _versions attribute is a dictionary that contains all
+  DocVersion instances associated with a Document, hashed by
+  their 'id' attribute.
+
+* _reps
+
+  The _reps attribute is a dictionary of dictionaries, and
+  contains all DocRep instances associated with a Document.  Its
+  structure is as follows:
+
+    {vid-1 : {repoid-a : DR-a, repoid-b : DR-b, ...},
+     vid-2 : {repoid-c : DR-c, repoid-d : DR-d, ...},
+     ...}
+
+    where vid-n is a DocVersion 'id' attribute, repoid-x is the
+    'pgef_oid' attribute of the DocRep instance DR-x.
 
-* *DocReps* (potentially many)
+Document Repository Operations
+------------------------------
 
-For searches/queries, Document classes will make use of various
-views and tables, depending on the context and which parameters
-are supplied in the search arguments:
-- the doc_masters table
-- the doc_versions table
-- the doc_reps table
-- the doc_mv view (join of doc_masters and doc_versions)
-- the doc_mvr view (join of masters, versions, and reps)
-- various supersets of these views that include tables related to
-the document by foreign keys (e.g., document properties that
-are referenced objects)
+For searches/queries, the Document interface will make use of
+various views and tables, depending on the context and which
+parameters are supplied in the search arguments.
 
-For inserts and updates, transactions at the repository manager
-(Pger) level will write to the necessary tables atomistically.
+For inserts and updates, the repository manager (Pger) will
+execute the required db table and file operations as a
+transaction.
 
 --------
 
-$Id: NOTES.txt,v 1.2 2003/07/15 14:20:19 waterbug Exp $
+$Id: NOTES.txt,v 1.3 2003/10/29 22:27:01 waterbug Exp $

From waterbug at ned.gsfc.nasa.gov  Wed Oct 29 17:28:39 2003
From: waterbug at ned.gsfc.nasa.gov (waterbug CVS)
Date: Wed Oct 29 17:28:40 2003
Subject: [Pangalactic-commits] Placeholder for export method.
Message-ID: <200310292228.h9TMSdfA005451@ned.gsfc.nasa.gov>

Modified files:
PanGalactic/pangalactic/utils/factory.py 1.5 1.6

Log message:
Placeholder for export method.


Index: PanGalactic/pangalactic/utils/factory.py
diff -u PanGalactic/pangalactic/utils/factory.py:1.5 PanGalactic/pangalactic/utils/factory.py:1.6
--- PanGalactic/pangalactic/utils/factory.py:1.5	Tue Oct  7 15:56:40 2003
+++ PanGalactic/pangalactic/utils/factory.py	Wed Oct 29 17:28:37 2003
@@ -1,12 +1,12 @@
-# $Id: factory.py,v 1.5 2003/10/07 19:56:40 waterbug Exp $
+# $Id: factory.py,v 1.6 2003/10/29 22:28:37 waterbug Exp $
 
 """
 Functions to extract persistable data from
 L{pangalactic.enterprise} objects.
-@version: $Revision: 1.5 $
+@version: $Revision: 1.6 $
 """
 
-__version__ = "$Revision: 1.5 $"[11:-2]
+__version__ = "$Revision: 1.6 $"[11:-2]
 
 import types
 import string
@@ -93,6 +93,13 @@
         name = obj.__module__ + '.' + obj.__class__.__name__
         extr = [name, instdict]
         return extr
+
+    def export(self, obj, format='pgx', file=None):
+        """
+        Write the obj out in a specified format to either stdout
+        or to a file.
+        """
+        pass
 
     def extractall(self, objs, classnames=[]):
         """

From waterbug at ned.gsfc.nasa.gov  Wed Oct 29 17:30:36 2003
From: waterbug at ned.gsfc.nasa.gov (waterbug CVS)
Date: Wed Oct 29 17:30:37 2003
Subject: [Pangalactic-commits] Better test ids.
Message-ID: <200310292230.h9TMUar1005525@ned.gsfc.nasa.gov>

Modified files:
PanGalactic/pangalactic/test/test_xmlrpc_addobjects.py 1.9 1.10

Log message:
Better test ids.


Index: PanGalactic/pangalactic/test/test_xmlrpc_addobjects.py
diff -u PanGalactic/pangalactic/test/test_xmlrpc_addobjects.py:1.9 PanGalactic/pangalactic/test/test_xmlrpc_addobjects.py:1.10
--- PanGalactic/pangalactic/test/test_xmlrpc_addobjects.py:1.9	Mon Oct  6 17:16:32 2003
+++ PanGalactic/pangalactic/test/test_xmlrpc_addobjects.py	Wed Oct 29 17:30:35 2003
@@ -1,4 +1,4 @@
-# $Id: test_xmlrpc_addobjects.py,v 1.9 2003/10/06 21:16:32 waterbug Exp $
+# $Id: test_xmlrpc_addobjects.py,v 1.10 2003/10/29 22:30:35 waterbug Exp $
 
 """
 Functional test for pangalactic.repo.xmlrpc.xmlrpc_addProductMaster
@@ -34,18 +34,18 @@
 f.write(testid)
 f.close()
 
-projid = 'MTPaE' + testid
-projname = 'MTPaE' + testid + ' Project'
-pmid = 'MTPaE-' + testid
-pmname = 'MTPaE-' + testid + ' Model Mr. Dynamo'
-pvname = 'MTPaE-' + testid + ' Version A'
+projid = 'XAO-' + testid
+projname = 'XAO-' + testid + ' Project'
+pmid = 'XAO-' + testid
+pmname = 'XAO-' + testid + ' Model Mr. Dynamo'
+pvname = 'XAO-' + testid + ' Version A'
 
 # create test objects
 p = Project(id=projid, id_context='TEST', name=projname)
 p.popTestData()
 pm = PM(id=pmid, id_context='TEST', name=pmname, _project=p)
 pm.popTestData()
-pv = PV(_of_master=pm, id='A', name=pvname)
+pv = PV(_of_master=pm, id='1', name=pvname)
 pv.popTestData()
 
 extract = PGER._factory.extract

From waterbug at ned.gsfc.nasa.gov  Thu Oct 30 02:23:16 2003
From: waterbug at ned.gsfc.nasa.gov (waterbug CVS)
Date: Thu Oct 30 02:23:18 2003
Subject: [Pangalactic-commits] Add some standard PgefObject attrs.
Message-ID: <200310300723.h9U7NGdY009114@ned.gsfc.nasa.gov>

Modified files:
PanGalactic/pangalactic/enterprise/pgefadvisory.py 1.43 1.44

Log message:
Add some standard PgefObject attrs.


Index: PanGalactic/pangalactic/enterprise/pgefadvisory.py
diff -u PanGalactic/pangalactic/enterprise/pgefadvisory.py:1.43 PanGalactic/pangalactic/enterprise/pgefadvisory.py:1.44
--- PanGalactic/pangalactic/enterprise/pgefadvisory.py:1.43	Wed Oct 29 17:06:54 2003
+++ PanGalactic/pangalactic/enterprise/pgefadvisory.py	Thu Oct 30 02:23:15 2003
@@ -1,11 +1,11 @@
-# $Id: pgefadvisory.py,v 1.43 2003/10/29 22:06:54 pbear Exp $
+# $Id: pgefadvisory.py,v 1.44 2003/10/30 07:23:15 waterbug Exp $
 
 """
 Base class for documents that report conditions related to the
 usability of a product.
 """
 
-__version__ = "$Revision: 1.43 $"[11:-2]
+__version__ = "$Revision: 1.44 $"[11:-2]
 
 import os.path
 import string
@@ -45,8 +45,17 @@
                 ["Document ID",     "self.id",                 "string", ""],
                 ["Title",           "self.name",               "string", ""],
                 ["Date",            "self._create_date",       "string", ""]]
+    _mapped = True
+    _properties_ext = {}
+    _properties = _properties_ext.copy()
+    _properties.update(Document._properties)
+    _required = []
+    _schema_ext = {}
+    _schema = _schema_ext.copy()
+    _schema.update(Document._schema)
+    _searchabletext = True
+    _std_abbrev = 'pa'
 
-    
     def __init__(self, acronym="", **kw):
         """
         Initialize PgefAdvisory.

From pbear at ned.gsfc.nasa.gov  Thu Oct 30 07:51:18 2003
From: pbear at ned.gsfc.nasa.gov (pbear CVS)
Date: Thu Oct 30 07:51:20 2003
Subject: [Pangalactic-commits] oops
Message-ID: <200310301251.h9UCpICR011966@ned.gsfc.nasa.gov>

Modified files:
PanGalactic/pangalactic/enterprise/pgefadvisory.py 1.44 1.45

Log message:
oops


Index: PanGalactic/pangalactic/enterprise/pgefadvisory.py
diff -u PanGalactic/pangalactic/enterprise/pgefadvisory.py:1.44 PanGalactic/pangalactic/enterprise/pgefadvisory.py:1.45
--- PanGalactic/pangalactic/enterprise/pgefadvisory.py:1.44	Thu Oct 30 02:23:15 2003
+++ PanGalactic/pangalactic/enterprise/pgefadvisory.py	Thu Oct 30 07:51:17 2003
@@ -1,11 +1,11 @@
-# $Id: pgefadvisory.py,v 1.44 2003/10/30 07:23:15 waterbug Exp $
+# $Id: pgefadvisory.py,v 1.45 2003/10/30 12:51:17 pbear Exp $
 
 """
 Base class for documents that report conditions related to the
 usability of a product.
 """
 
-__version__ = "$Revision: 1.44 $"[11:-2]
+__version__ = "$Revision: 1.45 $"[11:-2]
 
 import os.path
 import string
@@ -85,12 +85,12 @@
 # -60, wf1 -> late
 # -30, wf1 -> past due
 # 
-        now = mx.DateTime.DateFromTicks(mx.DateTime.now())
-        earlier = now + mx.DateTime.RelativeDateTime(days=-90)
-        self.pger_create_datetime = earlier
-        self.pger_mod_datetime    = earlier
-        self.create_datetime      = earlier
-        self.mod_datetime         = earlier
+#        now = mx.DateTime.DateFromTicks(mx.DateTime.now())
+#        earlier = now + mx.DateTime.RelativeDateTime(days=-90)
+#        self.pger_create_datetime = earlier
+#        self.pger_mod_datetime    = earlier
+#        self.create_datetime      = earlier
+#        self.mod_datetime         = earlier
 
 
     def __getattr__(self, name):

From bmuir at ned.gsfc.nasa.gov  Thu Oct 30 11:24:08 2003
From: bmuir at ned.gsfc.nasa.gov (bmuir CVS)
Date: Thu Oct 30 11:24:09 2003
Subject: [Pangalactic-commits] fixed editing mode test
Message-ID: <200310301624.h9UGO8Eh014719@ned.gsfc.nasa.gov>

Modified files:
PanGalactic/pangalactic/client/modules/psm/itemeditframe.py 1.111 1.112
PanGalactic/pangalactic/client/tests/test_itemeditframe.py 1.13 1.14

Log message:
fixed editing mode test


Index: PanGalactic/pangalactic/client/modules/psm/itemeditframe.py
diff -u PanGalactic/pangalactic/client/modules/psm/itemeditframe.py:1.111 PanGalactic/pangalactic/client/modules/psm/itemeditframe.py:1.112
--- PanGalactic/pangalactic/client/modules/psm/itemeditframe.py:1.111	Wed Oct 29 17:06:54 2003
+++ PanGalactic/pangalactic/client/modules/psm/itemeditframe.py	Thu Oct 30 11:24:06 2003
@@ -1,6 +1,6 @@
 # $Source: /repo/step_testbed/PanGalactic/pangalactic/client/modules/psm/itemeditframe.py,v $
 
-__version__ = "$Revision: 1.111 $"[11:-2]
+__version__ = "$Revision: 1.112 $"[11:-2]
 
 # Python imports
 import copy
@@ -637,6 +637,8 @@
     def EditingMode(self, whichpane):
         #print 'itemeditframe.editmode'
         self.editingtab = self.currentpage
+        #print whichpane
+        #print "PMM_PMVPage is:", self.PMM_PMVPage
         if whichpane == self.PMM_PMVPage: 
             self.pm_pv_form.BrowseMode(True)
             self.pmm_pmv_form.EditingMode()

Index: PanGalactic/pangalactic/client/tests/test_itemeditframe.py
diff -u PanGalactic/pangalactic/client/tests/test_itemeditframe.py:1.13 PanGalactic/pangalactic/client/tests/test_itemeditframe.py:1.14
--- PanGalactic/pangalactic/client/tests/test_itemeditframe.py:1.13	Wed Oct 29 14:19:52 2003
+++ PanGalactic/pangalactic/client/tests/test_itemeditframe.py	Thu Oct 30 11:24:07 2003
@@ -277,6 +277,10 @@
         testframe = wxFrame(None, -1, 'Test Frame')
         testframe.State = psmstate.PSMState()
         testframe.dm = datamanager.DataManager(testframe, true)
+        testframe.dm.serverName = 'ned.gsfc.nasa.gov'
+        testframe.dm.serverPort = '8080'
+        testframe.dm.createServer()
+        testframe.WatchDog = securitymanager.SecurityManager(testframe.dm)
         result = testframe.dm.login('tstuser','test')
         testframe.dm.fillProjectList()
         testframe.dm.localDB.Commit()
@@ -284,8 +288,9 @@
         nodedata = (None, None)
         testframe.itemeditform = itemeditframe.ItemEditFrame(testframe, testframe.State, 0, 1, nodedata, testframe.dm)
         testframe.itemeditform.SetDisplayWgt(self.DisplayWgts)
-        testframe.itemeditform.EditingMode()
-        assert testframe.dm.creatingItem == true, "not in editing mode"
+        testframe.itemeditform.EditingMode(1)
+        print testframe.dm.creatingPMM_PMV
+        assert testframe.dm.creatingPMM_PMV == True, "not in editing mode"
         testframe.dm.localDB.db.close()
         
     def testCreatingMode(self):
@@ -312,7 +317,7 @@
     itemsuite = unittest.TestSuite()
     itemsuite.addTest(ItemEditFrameTest("Title"))
     itemsuite.addTest(ItemEditFrameTest("testCreateItemEditFrame"))
-    itemsuite.addTest(ItemEditFrameTest("testSaveItemChanges"))
+    #itemsuite.addTest(ItemEditFrameTest("testSaveItemChanges"))
     #itemsuite.addTest(ItemEditFrameTest("testSavePLChanges"))
     #itemsuite.addTest(ItemEditFrameTest("testChangesMade"))
     #itemsuite.addTest(ItemEditFrameTest("testSaveChanges"))
@@ -320,7 +325,7 @@
     #itemsuite.addTest(ItemEditFrameTest("testSaveItem"))
     #itemsuite.addTest(ItemEditFrameTest("testLinkDocument"))
     #itemsuite.addTest(ItemEditFrameTest("testUnlinkDocument"))
-    #itemsuite.addTest(ItemEditFrameTest("testEditingMode"))
+    itemsuite.addTest(ItemEditFrameTest("testEditingMode"))
     #itemsuite.addTest(ItemEditFrameTest("testCreatingMode"))
     return itemsuite
 

From pbear at ned.gsfc.nasa.gov  Thu Oct 30 11:26:02 2003
From: pbear at ned.gsfc.nasa.gov (pbear CVS)
Date: Thu Oct 30 11:26:04 2003
Subject: [Pangalactic-commits] small annoying stuff fixed
Message-ID: <200310301626.h9UGQ20A014794@ned.gsfc.nasa.gov>

Modified files:
PanGalactic/pangalactic/client/modules/psm/pgefgrid.py 1.59 1.60
PanGalactic/pangalactic/client/modules/psm/psmtool.py 1.124 1.125
PanGalactic/pangalactic/enterprise/workflow/wfprocessoverview.py 1.18 1.19
PanGalactic/pangalactic/enterprise/workflow/workflow_wizard.py 1.22 1.23
PanGalactic/pangalactic/enterprise/workflow/workflowgrid.py 1.7 1.8
PanGalactic/pangalactic/utils/basegrid.py 1.14 1.15

Log message:
small annoying stuff fixed


Index: PanGalactic/pangalactic/client/modules/psm/pgefgrid.py
diff -u PanGalactic/pangalactic/client/modules/psm/pgefgrid.py:1.59 PanGalactic/pangalactic/client/modules/psm/pgefgrid.py:1.60
--- PanGalactic/pangalactic/client/modules/psm/pgefgrid.py:1.59	Wed Oct  1 16:45:42 2003
+++ PanGalactic/pangalactic/client/modules/psm/pgefgrid.py	Thu Oct 30 11:25:59 2003
@@ -60,18 +60,19 @@
             if curr_row >= 0:
                 self.SelectRow(curr_row)
 
-            menu.Append(basegrid.ID_POPUP_CLEAR_SELECTION, 'Clear current selection')
+            menu.Append(basegrid.ID_POPUP_CLEAR_SELECTION, 'Clear Current Selection')
 #            menu.AppendSeparator()
             if self.allow_config_flag:
                 if self.CanConfigDisplay():
-                    menu.Append(basegrid.ID_POPUP_CONFIG_GRID, 'Configure grid column display...')
+                    menu.Append(basegrid.ID_POPUP_CONFIG_GRID, 'Customize Grid Layout...')
 #                    menu.AppendSeparator()
             menu.Append(pdfoptions.ID_CREATEPDF_POPUP, 'Generate PDF...') 
             menu.AppendSeparator()
-            menu.Append(quickcreate.ID_POPUP_QUICKCREATE, 'Quick create...') 
+            menu.Append(quickcreate.ID_POPUP_QUICKCREATE, 'Quick Product...') 
             menu.Append(basegrid.ID_POPUP_EDIT, 'Edit...') 
-            
-            self.PopupMenuXY(menu, x, y)
+
+            gridx, gridy = self.GetPositionTuple()
+            self.PopupMenuXY(menu, x+gridx, y+gridy)
             
             
 

Index: PanGalactic/pangalactic/client/modules/psm/psmtool.py
diff -u PanGalactic/pangalactic/client/modules/psm/psmtool.py:1.124 PanGalactic/pangalactic/client/modules/psm/psmtool.py:1.125
--- PanGalactic/pangalactic/client/modules/psm/psmtool.py:1.124	Tue Oct 28 16:53:00 2003
+++ PanGalactic/pangalactic/client/modules/psm/psmtool.py	Thu Oct 30 11:25:59 2003
@@ -9,7 +9,7 @@
 This module is the main application code for the pgef client interface
 """
 
-__version__ = "$Revision: 1.124 $"[11:-2]
+__version__ = "$Revision: 1.125 $"[11:-2]
 
 import os
 import sys
@@ -178,20 +178,20 @@
         self.topWindow = win
 
         # A window to the left of the client window to hold our tree
-        win =  wxSashLayoutWindow(self, self.ID_WINDOW_LEFT, wxDefaultPosition, wxSize(200, 30), wxNO_BORDER|wxSW_3D)
+        win = wxSashLayoutWindow(self, self.ID_WINDOW_LEFT, wxDefaultPosition, wxSize(200, 30), wxNO_BORDER|wxSW_3D)
         win.SetDefaultSize(wxSize(180, 600))
         win.SetOrientation(wxLAYOUT_VERTICAL)
         win.SetAlignment(wxLAYOUT_LEFT)
         win.SetSashVisible(wxSASH_RIGHT, true)        
         
-        self.leftPanel = wxPanel(win,ID_LEFT_PANEL)
+        self.leftPanel = wxPanel(win, ID_LEFT_PANEL)
         hbox = wxBoxSizer(wxVERTICAL)
         
-        choice_list = ["default", "requirements", "functions", "simulations"]
+        choice_list = ["Default", "Requirements", "Functions", "Simulations"]
         self.view = wxChoice(self.leftPanel, ID_CHOICE_VIEW, wxPoint(90, 50), wxSize(95, -1), choice_list)
         hbox.Add(self.view, 0, wxEXPAND)
         
-        self.tree_notebook = wxNotebook(self.leftPanel, -1, wxDefaultPosition, wxSize(200,200)) 
+        self.tree_notebook = wxNotebook(self.leftPanel, -1, wxDefaultPosition, wxSize(200, 200)) 
         
         self.tID = wxNewId()
         self.treeMap = {}
@@ -383,13 +383,13 @@
 
         # popup help seems to be ignored....  grrrr
         menu = wxMenu()
-        menu.Append(ID_TREE_RIGHTPOPUP_EDIT, 'Edit...', "Edit this product")
+        menu.Append(ID_TREE_RIGHTPOPUP_EDIT, 'Edit...', "Edit this Product")
         menu.Append(ID_TREE_RIGHTPOPUP_SHOWPROJECT, 'View Project Data...', "View project data")
         menu.Append(ID_TREE_RIGHTPOPUP_DUMPTOPDF, 'Generate PDF...', 'Show the PDF creation options')
-        menu.SetHelpString(ID_TREE_RIGHTPOPUP_EDIT, "Edit this product")
-        menu.SetHelpString(ID_TREE_RIGHTPOPUP_SHOWPROJECT, "View project data")
+        menu.SetHelpString(ID_TREE_RIGHTPOPUP_EDIT, "Edit this Product")
+        menu.SetHelpString(ID_TREE_RIGHTPOPUP_SHOWPROJECT, "View Project Data")
         menu.AppendSeparator()
-        menu.Append(ID_TREE_RIGHTPOPUP_QUICKCREATE, 'Quick create...', "Create a set of products")
+        menu.Append(ID_TREE_RIGHTPOPUP_QUICKCREATE, 'Quick Product...', "Create a set of products")
             
         self.PopupMenuXY(menu, event.GetX(), event.GetY())
         
@@ -1195,7 +1195,7 @@
         itemlist = []
         for item in localpmvs:
             if item.name:
-                foo = item.of_pm_id + "." + item.of_pv_id + " (" + item.name + ")"
+                foo = item.of_pm_id + "." + item.of_pv_id + "  (" + item.name + ")"
             else:
                 foo = item.of_pm_id + "." + item.of_pv_id
             itemlist.append([foo, item])

Index: PanGalactic/pangalactic/enterprise/workflow/workflow_wizard.py
diff -u PanGalactic/pangalactic/enterprise/workflow/workflow_wizard.py:1.22 PanGalactic/pangalactic/enterprise/workflow/workflow_wizard.py:1.23
--- PanGalactic/pangalactic/enterprise/workflow/workflow_wizard.py:1.22	Wed Oct 29 17:06:55 2003
+++ PanGalactic/pangalactic/enterprise/workflow/workflow_wizard.py	Thu Oct 30 11:26:00 2003
@@ -16,9 +16,10 @@
 import pangalactic.enterprise.workflow.wffactory    as wffactory
 
 import pangalactic.utils.pdfoptions as pdfoptions
-import pangalactic.utils.basegrid as basegrid
  
 WF_START = wxNewId()
+WF_ACT_CLEAR_SELECTION = wxNewId()
+WF_TRANS_CLEAR_SELECTION = wxNewId()
 
 key_col = 0
 time_col = 1
@@ -146,6 +147,7 @@
             colinfo = self.TransInfo[ndx]
             self.transitiongrid.SetColSize(ndx, colinfo[1])
             self.transitiongrid.SetColLabelValue(ndx, colinfo[0])
+        self.transitiongrid.SetColLabelSize(22)
         self.transitiongrid.SetRowLabelSize(40)
         self.transitiongrid.EnableEditing(True)
 
@@ -180,12 +182,26 @@
         EVT_KEY_DOWN(self.transitiongrid, self.OnTransKeyDown)
 
         EVT_MENU(self, WF_START, self.setStartActivity)
+        EVT_MENU(self, WF_ACT_CLEAR_SELECTION, self.clearActSelection)
+        EVT_MENU(self, WF_TRANS_CLEAR_SELECTION, self.clearTransSelection)
 
         wgt = self.GetNameWgt()
         wgt.SetFocus()
         EVT_KEY_DOWN(wgt, self.OnNameKeyDown)
 
 
+    def clearActSelection(self, event):
+        print "wfwizard.clearactselection"
+        self.activitygrid.ClearSelection()
+        self.ActSelectedRow = None
+            
+
+    def clearTransSelection(self, event):
+        print "wfwizard.cleartransselection"
+        self.transitiongrid.ClearSelection()
+        self.TransSelectedRow = None
+            
+
     def setDisplayWgt(self, wgt):
         #print "wfwizard.setdisplaywgt"
         self.displayWgt = wgt
@@ -201,54 +217,37 @@
         @type event: wxCommandEvent
         @param event: rightclick event
         """
-
+        print "wfwizard.onrightdown"
         # create customized rightclick popup menu
         if event.GetId() == self.activitygrid.GetId():
             x,y = event.GetPosition()
-            y -= self.activitygrid.GetColLabelSize()
-            curr_row = self.activitygrid.YToRow(y)
+            y1 = y - self.activitygrid.GetColLabelSize()
+            curr_row = self.activitygrid.YToRow(y1)
             if curr_row >= 0:
-                self.activitygrid.SelectRow(curr_row)
                 self.ActSelectedRow = curr_row
+                self.activitygrid.SelectRow(curr_row)
 
-            #print self.table.display_mapping
-            #print self.table.identifiers
             menu = wxMenu()
-            menu.Append(basegrid.ID_POPUP_CLEAR_SELECTION, 'Clear current selections')
-            menu.Append(WF_START, "Start here")
-#            menu.AppendSeparator()
-#            if self.activitygrid.allow_config_flag:
-#                if self.activitygrid.CanConfigDisplay():
-#                    menu.Append(basegrid.ID_POPUP_CONFIG_GRID, 'Config grid display...')
-#                    menu.AppendSeparator()
-#            menu.Append(pdfoptions.ID_CREATEPDF_POPUP, 'Create PDF...') 
-            y += self.activitygrid.GetColLabelSize()
-            self.PopupMenuXY(menu, x, y)
+            menu.Append(WF_ACT_CLEAR_SELECTION, 'Clear Current Selection')
+            menu.Append(WF_START, "Start Here")
+            gridx, gridy = self.activitygrid.GetPositionTuple()
+            self.PopupMenuXY(menu, x+gridx, y+gridy)
             
     def OnTransRightDown(self, event):
+        print "wfwizard.ontransrightdown"
         # create customized rightclick popup menu
         if event.GetId() == self.transitiongrid.GetId():
             x,y = event.GetPosition()
-            y -= self.transitiongrid.GetColLabelSize()
-            curr_row = self.transitiongrid.YToRow(y)
+            y1 = y - self.transitiongrid.GetColLabelSize()
+            curr_row = self.transitiongrid.YToRow(y1)
             if curr_row >= 0:
-                self.transitiongrid.SelectRow(curr_row)
                 self.TransSelectedRow = curr_row
+                self.transitiongrid.SelectRow(curr_row)
 
-            #print self.table.display_mapping
-            #print self.table.identifiers
             menu = wxMenu()
-            x,y = event.GetPosition()
-            menu.Append(basegrid.ID_POPUP_CLEAR_SELECTION, 'Clear current selections')
-#            menu.Append(WF_START, "Start here")
-#            menu.AppendSeparator()
-#            if self.transitiongrid.allow_config_flag:
-#                if self.transitiongrid.CanConfigDisplay():
-#                    menu.Append(basegrid.ID_POPUP_CONFIG_GRID, 'Config grid display...')
-#                    menu.AppendSeparator()
-#            menu.Append(pdfoptions.ID_CREATEPDF_POPUP, 'Create PDF...') 
-            
-            self.PopupMenuXY(menu, x, y)
+            menu.Append(WF_TRANS_CLEAR_SELECTION, 'Clear Current Selection')
+            gridx, gridy = self.transitiongrid.GetPositionTuple()
+            self.PopupMenuXY(menu, x+gridx, y+gridy)
             
 
     def createWorkflow(self, name, activities, transitions):
@@ -720,6 +719,7 @@
         self.GetMoveUpActivityWgt().Show(False)
         self.GetMoveDownActivityWgt().Show(False)
         self.GetGenerateTransitionsWgt().Show(False)
+
         
     def GetNameWgt(self):
         return wxPyTypeCast(self.FindWindowById(WF_PROCESS_NAME), "wxTextCtrl")

Index: PanGalactic/pangalactic/enterprise/workflow/wfprocessoverview.py
diff -u PanGalactic/pangalactic/enterprise/workflow/wfprocessoverview.py:1.18 PanGalactic/pangalactic/enterprise/workflow/wfprocessoverview.py:1.19
--- PanGalactic/pangalactic/enterprise/workflow/wfprocessoverview.py:1.18	Mon Oct 27 15:41:41 2003
+++ PanGalactic/pangalactic/enterprise/workflow/wfprocessoverview.py	Thu Oct 30 11:26:00 2003
@@ -110,6 +110,7 @@
         self.gridtable = wfdatatable.WfDataTable()
         self.grid = WorkflowGrid(self, -1, savename = tablename,
                                  dbroot = self.DataManager.dbroot, intable = self.gridtable)
+        self.grid.SetColLabelSize(22)
         self.grid.SetSize(self.parent.GetClientSize())
         self.FillGrid(datalist)
         

Index: PanGalactic/pangalactic/enterprise/workflow/workflowgrid.py
diff -u PanGalactic/pangalactic/enterprise/workflow/workflowgrid.py:1.7 PanGalactic/pangalactic/enterprise/workflow/workflowgrid.py:1.8
--- PanGalactic/pangalactic/enterprise/workflow/workflowgrid.py:1.7	Thu Oct  2 15:31:23 2003
+++ PanGalactic/pangalactic/enterprise/workflow/workflowgrid.py	Thu Oct 30 11:26:00 2003
@@ -78,6 +78,8 @@
         
         self.EnableEditing(false)
 
+        self.SetColLabelSize(32)
+
         EVT_GRID_CELL_LEFT_CLICK(self, self.OnLeftClick)
 
 #        print "wfgrid.table.displaymapping", self.table.GetDisplayMapping()
@@ -124,8 +126,9 @@
         # create customized rightclick popup menu
         if event.GetId() == self.GetId():
             x,y = event.GetPosition()
-            y -= self.GetColLabelSize()
-            curr_row = self.YToRow(y)
+            print x,y
+            y1 = y - self.GetColLabelSize()
+            curr_row = self.YToRow(y1)
             if curr_row >= 0:
                 self.SelectRow(curr_row)
                 self.SelectedRow = curr_row
@@ -133,25 +136,20 @@
             #print self.table.display_mapping
             #print self.table.identifiers
             menu = wxMenu()
-            x,y = event.GetPosition()
-            menu.Append(basegrid.ID_POPUP_CLEAR_SELECTION, 'Clear current selection')
+            menu.Append(basegrid.ID_POPUP_CLEAR_SELECTION, 'Clear Current Selection')
             if self.ShowEditor:
-                menu.Append(WF_EDIT, "Edit...")
+                menu.Append(WF_EDIT, "Edit Workflow...")
                 menu.AppendSeparator()
                 if self.allow_config_flag:
                     if self.CanConfigDisplay():
-                        menu.Append(basegrid.ID_POPUP_CONFIG_GRID, 'Config grid display...')
+                        menu.Append(basegrid.ID_POPUP_CONFIG_GRID, 'Configure Grid Layout...')
 
             if self.ShowViewer:
-                menu.Append(WF_VIEW, "View...")
-
-#            menu.AppendSeparator()
-#            if self.allow_config_flag:
-#                if self.CanConfigDisplay():
-#                    menu.Append(basegrid.ID_POPUP_CONFIG_GRID, 'Config grid display...')
+                menu.Append(WF_VIEW, "View Workflow...")
 
             menu.AppendSeparator()
-            menu.Append(pdfoptions.ID_CREATEPDF_POPUP, 'Create PDF...') 
+            menu.Append(pdfoptions.ID_CREATEPDF_POPUP, 'Generate PDF...') 
             
-            self.PopupMenuXY(menu, x, y)
+            gridx, gridy = self.GetPositionTuple()
+            self.PopupMenuXY(menu, x+gridx, y+gridy)
             

Index: PanGalactic/pangalactic/utils/basegrid.py
diff -u PanGalactic/pangalactic/utils/basegrid.py:1.14 PanGalactic/pangalactic/utils/basegrid.py:1.15
--- PanGalactic/pangalactic/utils/basegrid.py:1.14	Tue Oct 21 17:25:19 2003
+++ PanGalactic/pangalactic/utils/basegrid.py	Thu Oct 30 11:26:00 2003
@@ -170,15 +170,17 @@
             #print self.table.identifiers
             menu = wxMenu()
             x,y = event.GetPosition()
-            menu.Append(ID_POPUP_CLEAR_SELECTION, 'Clear current selection')
+            menu.Append(ID_POPUP_CLEAR_SELECTION, 'Clear Current Selection')
             menu.AppendSeparator()
             if self.allow_config_flag:
                 if self.CanConfigDisplay():
-                    menu.Append(ID_POPUP_CONFIG_GRID, 'Configure grid column display...')
+                    menu.Append(ID_POPUP_CONFIG_GRID, 'Customize Grid Layout...')
                     menu.AppendSeparator()
-            menu.Append(pdfoptions.ID_CREATEPDF_POPUP, 'Create PDF...') 
+            menu.Append(pdfoptions.ID_CREATEPDF_POPUP, 'Generate PDF...') 
             
-            self.PopupMenuXY(menu, x, y)
+            gridx, gridy = self.GetPositionTuple()
+            self.PopupMenuXY(menu, x+gridx, y+gridy)
+
             
     def StartDragOperation(self, selectedrow):
         """Handles the data encapsulation and packaging for the drag and drop"""
@@ -391,7 +393,7 @@
         #if not self.already_showing_config:
         #print 'call config screen'
         tmpsize = wxSize(750, 500)
-        testframe = wxDialog(self, -1, 'Config Grid Display', wxDefaultPosition, tmpsize,
+        testframe = wxDialog(self, -1, 'Customize Grid Layout', wxDefaultPosition, tmpsize,
                     style = wxCAPTION | wxSYSTEM_MENU | wxTHICK_FRAME )
         #if self.DisplayMapping:
             #print "oldmapping", self.DisplayMapping[0]

From bmuir at ned.gsfc.nasa.gov  Thu Oct 30 13:12:50 2003
From: bmuir at ned.gsfc.nasa.gov (bmuir CVS)
Date: Thu Oct 30 13:12:51 2003
Subject: [Pangalactic-commits] fixed localdb tests, but they were skeletal,
	need to add alot more...
Message-ID: <200310301812.h9UICoXx017417@ned.gsfc.nasa.gov>

Modified files:
PanGalactic/pangalactic/client/tests/test_itemeditframe.py 1.14 1.15
PanGalactic/pangalactic/client/tests/test_localdb.py 1.1.1.1 1.2

Log message:
fixed localdb tests, but they were skeletal, need to add alot more...


Index: PanGalactic/pangalactic/client/tests/test_itemeditframe.py
diff -u PanGalactic/pangalactic/client/tests/test_itemeditframe.py:1.14 PanGalactic/pangalactic/client/tests/test_itemeditframe.py:1.15
--- PanGalactic/pangalactic/client/tests/test_itemeditframe.py:1.14	Thu Oct 30 11:24:07 2003
+++ PanGalactic/pangalactic/client/tests/test_itemeditframe.py	Thu Oct 30 13:12:48 2003
@@ -289,7 +289,6 @@
         testframe.itemeditform = itemeditframe.ItemEditFrame(testframe, testframe.State, 0, 1, nodedata, testframe.dm)
         testframe.itemeditform.SetDisplayWgt(self.DisplayWgts)
         testframe.itemeditform.EditingMode(1)
-        print testframe.dm.creatingPMM_PMV
         assert testframe.dm.creatingPMM_PMV == True, "not in editing mode"
         testframe.dm.localDB.db.close()
         
@@ -298,6 +297,7 @@
         testframe = wxFrame(None, -1, 'Test Frame')
         testframe.State = psmstate.PSMState()
         testframe.dm = datamanager.DataManager(testframe, true)
+        testframe.dm = datamanager.DataManager(testframe, true)
         testframe.dm.serverName = 'ned.gsfc.nasa.gov'
         testframe.dm.serverPort = '8080'
         testframe.dm.createServer()
@@ -309,8 +309,8 @@
         nodedata = (None, None)
         testframe.itemeditform = itemeditframe.ItemEditFrame(testframe, testframe.State, 0, 1, nodedata, testframe.dm)
         testframe.itemeditform.SetDisplayWgt(self.DisplayWgts)
-        testframe.itemeditform.CreatingMode(testframe.itemeditform.ItemPage)
-        assert testframe.dm.creatingPartsList == false, "not in editing mode"
+        testframe.itemeditform.CreatingMode(1)
+        assert testframe.dm.creatingPartsList == False, "not in editing mode"
         testframe.dm.localDB.db.close()
         
 def suite():
@@ -325,8 +325,8 @@
     #itemsuite.addTest(ItemEditFrameTest("testSaveItem"))
     #itemsuite.addTest(ItemEditFrameTest("testLinkDocument"))
     #itemsuite.addTest(ItemEditFrameTest("testUnlinkDocument"))
-    itemsuite.addTest(ItemEditFrameTest("testEditingMode"))
-    #itemsuite.addTest(ItemEditFrameTest("testCreatingMode"))
+    #itemsuite.addTest(ItemEditFrameTest("testEditingMode"))
+    itemsuite.addTest(ItemEditFrameTest("testCreatingMode"))
     return itemsuite
 
 

Index: PanGalactic/pangalactic/client/tests/test_localdb.py
diff -u PanGalactic/pangalactic/client/tests/test_localdb.py:1.1.1.1 PanGalactic/pangalactic/client/tests/test_localdb.py:1.2
--- PanGalactic/pangalactic/client/tests/test_localdb.py:1.1.1.1	Mon Nov  4 14:47:26 2002
+++ PanGalactic/pangalactic/client/tests/test_localdb.py	Thu Oct 30 13:12:48 2003
@@ -1,5 +1,5 @@
 import unittest
-import dataobjects.localdb
+import pangalactic.utils.localdb
 
 false = None
 true = not None
@@ -20,7 +20,7 @@
         
     def testCreateLocalStorage(self):
         self.ldb = None
-        self.ldb = dataobjects.localdb.LocalStorage(true)
+        self.ldb = pangalactic.utils.localdb.LocalStorage(true)
         assert self.ldb != None , "Couldnt create localstorage"
         #self.ldb.db.close()
         
@@ -38,4 +38,4 @@
     runner.run(suite())
     
 if __name__ == '__main__':
-    main()
\ No newline at end of file
+    main()

From waterbug at ned.gsfc.nasa.gov  Thu Oct 30 14:24:30 2003
From: waterbug at ned.gsfc.nasa.gov (waterbug CVS)
Date: Thu Oct 30 14:24:32 2003
Subject: [Pangalactic-commits] MIME types for media_type table.
Message-ID: <200310301924.h9UJOUNO019190@ned.gsfc.nasa.gov>

Modified files:
PanGalactic/src/sql/insertDocuments.sql None 1.1
PanGalactic/src/sql/insertMediaTypes.sql None 1.1
PanGalactic/src/sql/populate_pgerdb.sh 1.2 1.3

Log message:
MIME types for media_type table.


Index: PanGalactic/src/sql/populate_pgerdb.sh
diff -u PanGalactic/src/sql/populate_pgerdb.sh:1.2 PanGalactic/src/sql/populate_pgerdb.sh:1.3
--- PanGalactic/src/sql/populate_pgerdb.sh:1.2	Thu Oct  2 13:39:06 2003
+++ PanGalactic/src/sql/populate_pgerdb.sh	Thu Oct 30 14:24:29 2003
@@ -1,8 +1,9 @@
 #!/bin/bash
 
-# $Id: populate_pgerdb.sh,v 1.2 2003/10/02 17:39:06 waterbug Exp $
+# $Id: populate_pgerdb.sh,v 1.3 2003/10/30 19:24:29 waterbug Exp $
 
 psql pgerdb < insertRefData.sql
+psql pgerdb < insertMediaTypes.sql
 psql pgerdb < copyOrganizations.psql
 psql pgerdb < insertTestData.sql
 psql pgerdb < copyCats.psql

From pbear at ned.gsfc.nasa.gov  Thu Oct 30 15:01:17 2003
From: pbear at ned.gsfc.nasa.gov (pbear CVS)
Date: Thu Oct 30 15:01:19 2003
Subject: [Pangalactic-commits] fixed close buttons on wfwizard;
	other ittybitty stuff
Message-ID: <200310302001.h9UK1H7d020195@ned.gsfc.nasa.gov>

Modified files:
PanGalactic/pangalactic/enterprise/workflow/wfprocessoverview.py 1.19 1.20
PanGalactic/pangalactic/enterprise/workflow/workflow_wizard.py 1.23 1.24
PanGalactic/pangalactic/enterprise/workflow/workflowgrid.py 1.8 1.9
PanGalactic/pangalactic/utils/datamanager.py 1.53 1.54

Log message:
fixed close buttons on wfwizard; other ittybitty stuff


Index: PanGalactic/pangalactic/utils/datamanager.py
diff -u PanGalactic/pangalactic/utils/datamanager.py:1.53 PanGalactic/pangalactic/utils/datamanager.py:1.54
--- PanGalactic/pangalactic/utils/datamanager.py:1.53	Wed Oct 29 17:06:55 2003
+++ PanGalactic/pangalactic/utils/datamanager.py	Thu Oct 30 15:01:15 2003
@@ -1,6 +1,6 @@
 # $Source: /repo/step_testbed/PanGalactic/pangalactic/utils/datamanager.py,v $
 
-__version__ = "$Revision: 1.53 $"[11:-2]
+__version__ = "$Revision: 1.54 $"[11:-2]
 
 import time
 import mx.DateTime
@@ -71,7 +71,7 @@
         self.creatingItem = False
         self.creatingPartsList = False
         self.creatingDocument = False
-        self.creatingWorkflow = False
+        self.wizardingWorkflow = False
 
     def initLocalDB(self, clearcache):
         try:

Index: PanGalactic/pangalactic/enterprise/workflow/wfprocessoverview.py
diff -u PanGalactic/pangalactic/enterprise/workflow/wfprocessoverview.py:1.19 PanGalactic/pangalactic/enterprise/workflow/wfprocessoverview.py:1.20
--- PanGalactic/pangalactic/enterprise/workflow/wfprocessoverview.py:1.19	Thu Oct 30 11:26:00 2003
+++ PanGalactic/pangalactic/enterprise/workflow/wfprocessoverview.py	Thu Oct 30 15:01:15 2003
@@ -93,9 +93,9 @@
         self.State.currentuser = self.DataManager.user.id
         self.currentworkflow = None
 
-        self.CreateWorkflowFrames = []
-        self.EditWorkflowFrames = []
-        self.ViewWorkflowFrames = []
+        self.WorkflowWizardFrames = []
+        #self.EditWorkflowFrames = []
+        #self.ViewWorkflowFrames = []
         self.acroreaderids = []
 
         EVT_MENU(self.parent, WF_EDIT, self.OnWorkflowEdit)
@@ -155,7 +155,7 @@
             if len(workflowlist) > 0:
                 self.workflowlist = workflowlist
                 self.SetData(workflowlist)
-                self.grid.AutoSizeColumns(true)
+                self.grid.AutoSizeColumns(True)
 
     def CloseTool(self, event):
         pass
@@ -176,14 +176,14 @@
         #print "CreateWorkflow"
         tmpsize = wxSize(750, 600)
         WizardFrame = toolframe.toolFrame(self, -1, "Workflow Wizard", wxDefaultPosition, tmpsize)
-        Wizard = workflow_wizard.WorkflowWizard(WizardFrame, self.State, self.DataManager,
+        Wizard = workflow_wizard.WorkflowWizard(self, WizardFrame, self.State, self.DataManager,
                                                 self.actinfo, self.transinfo, -1, wxDefaultPosition, tmpsize)
         Wizard.setDisplayWgt(self.grid)
         
         WizardFrame.menuBar.SetLabel(toolframe.ID_FILE_EXIT, '&Close')
         WizardFrame.menuBar.SetHelpString(toolframe.ID_FILE_EXIT, "Close this window")
         WizardFrame.CentreOnParent()
-        WizardFrame.Show(true)
+        WizardFrame.Show(True)
 
         filemenu = wxMenu()
         filemenu.Append(WF_SAVE, "&Save", "Save a workflow")
@@ -191,49 +191,48 @@
         oldfilemenu = WizardFrame.GetMenuBar().Replace(0, filemenu, "&File")
         oldfilemenu = None
 
-        self.CreateWorkflowFrames.append([WizardFrame.GetId(), "new", Wizard, false])
+        #self.CreateWorkflowFrames.append([WizardFrame.GetId(), "new", Wizard, False])
+        self.WorkflowWizardFrames.append([WizardFrame.GetId(), "new", Wizard, False])
 
-        EVT_CLOSE(WizardFrame, self.OnCloseWizardFrame)
-        EVT_MENU(WizardFrame, toolframe.ID_FILE_EXIT, self.OnCloseWizardFrame)
+        EVT_CLOSE(WizardFrame, Wizard.onClose)
+        EVT_MENU(WizardFrame, toolframe.ID_FILE_EXIT, Wizard.onClose)
         EVT_MENU(WizardFrame, WF_SAVE, Wizard.Save)
 
 
-    def OnCloseWizardFrame(self, event):
-        # update the workflow grid when a create wizard is closed
-        #print "closewizardframe"
-        for ndx in range(len(self.CreateWorkflowFrames)):
-            fid, mode, wizard, closeflag = self.CreateWorkflowFrames[ndx]
-            #print fid, mode, wizard, closeflag
-            if event.GetId() == fid:
-                #print "found frame"
-                if closeflag:
-                    return
-#                    event.skip()
-                else:
-                    #print "closing down"
-                    self.CreateWorkflowFrames[ndx][3] = true  # closeflag
-
-                    if not wizard.saved_workflow:
-                        dlg = pgdialogs.OKCancelDialog(self, -1, "Save Workflow?", 
-                              "\nDo you wish to save this workflow?", 
-                              'Yes', 'No', size = wxSize(250, 120))
-                        result = dlg.ShowModal()
-                        if result == wxID_OK:
-                            #transitions = wizard.GetTransitions()
-                            #activities = wizard.GetActivities()
-                            wfobj = wizard.Save()
-                            #print "wfobj", wfobj
-                            if wfobj:
-                                self.grid.AddData(wfobj, wxLIGHT_GREY)
-                        dlg.Destroy()
-
-                    wizard = None
-                    f = wxPyTypeCast(self.FindWindowById(fid), "wxFrame")
-                    f.Show(false)
-                    del self.CreateWorkflowFrames[ndx]
-                    break
+    def RemoveWizardFrame(self, frame_id, wizard_id):
+        #print "wfprocessoverview.removewizardframe"
+        for ndx in range(len(self.WorkflowWizardFrames)):
+            fid, mode, wizard, closeflag = self.WorkflowWizardFrames[ndx]
+            #print frame_id, fid, mode, wizard, wizard.GetId(), closeflag
+            if frame_id == fid:
+                f = wxPyTypeCast(self.FindWindowById(fid), "wxFrame")
+                f.Show(false)
+                del self.WorkflowWizardFrames[ndx]
+                break
+        self.moreWorkflowWizards()
+
+
+##    def OnCloseWizardFrame(self, event):
+##        # update the workflow grid when a create wizard is closed
+##        print "closewizardframe"
+##        for ndx in range(len(self.CreateWorkflowFrames)):
+##            fid, mode, wizard, closeflag = self.CreateWorkflowFrames[ndx]
+##            print event.GetId(), fid, mode, wizard, closeflag
+##            if event.GetId() == fid:
+##                print "found frame"
+##                if closeflag:
+##                    return
+###                    event.skip()
+##                else:
+##                    print "closing down"
+##                    f = wxPyTypeCast(self.FindWindowById(fid), "wxFrame")
+##                    wizard.onCloseFrame()
+##                    wizard = None
+##                    f.Show(False)
+##                    #del self.CreateWorkflowFrames[ndx]
+##                    break
 
-        self.StillCreatingWorkflow()
+##        self.StillCreatingWorkflow()
 
 
     def OnWorkflowEdit(self, event):
@@ -241,7 +240,7 @@
         #print "EditWorkflow"
         tmpsize = wxSize(750, 600)
         EditorFrame = toolframe.toolFrame(self, -1, "Workflow Editor", wxDefaultPosition, tmpsize)
-        Editor = workflow_wizard.WorkflowWizard(EditorFrame, self.State, self.DataManager,
+        Editor = workflow_wizard.WorkflowWizard(self, EditorFrame, self.State, self.DataManager,
                                                 self.actinfo, self.transinfo, -1, wxDefaultPosition, tmpsize)
         wfobj = self.grid.GetDataObj(self.grid.SelectedRow)
         Editor.SetWorkflow(wfobj)
@@ -256,12 +255,14 @@
         oldfilemenu = None
 
         EditorFrame.CentreOnParent()
-        EditorFrame.Show(true)
+        EditorFrame.Show(True)
 
-        self.EditWorkflowFrames.append([EditorFrame.GetId(), "new", Editor, false])
+        #self.EditWorkflowFrames.append([EditorFrame.GetId(), "new", Editor, False])
+        self.WorkflowWizardFrames.append([EditorFrame.GetId(), "edit", Editor, False])
 
-        EVT_CLOSE(EditorFrame, self.OnCloseEditWorkflowFrame)
-        EVT_MENU(EditorFrame, toolframe.ID_FILE_EXIT, self.OnCloseEditWorkflowFrame)
+        EVT_CLOSE(EditorFrame, Editor.onClose)
+        #EVT_MENU(EditorFrame, toolframe.ID_FILE_EXIT, self.OnCloseEditWorkflowFrame)
+        EVT_MENU(EditorFrame, toolframe.ID_FILE_EXIT, Editor.onClose)
         EVT_MENU(EditorFrame, WF_SAVE, Editor.Save)
 
 
@@ -271,7 +272,7 @@
 
         tmpsize = wxSize(750, 600)
         ViewerFrame = toolframe.toolFrame(self, -1, "Workflow Viewer", wxDefaultPosition, tmpsize)
-        Viewer = workflow_wizard.WorkflowWizard(ViewerFrame, self.State, self.DataManager,
+        Viewer = workflow_wizard.WorkflowWizard(self, ViewerFrame, self.State, self.DataManager,
                                                 self.actinfo, self.transinfo, -1, wxDefaultPosition, tmpsize)
         Viewer.setViewMode()
         wfobj = self.grid.GetDataObj(self.grid.SelectedRow)
@@ -286,94 +287,101 @@
         oldfilemenu = None
 
         ViewerFrame.CentreOnParent()
-        ViewerFrame.Show(true)
+        ViewerFrame.Show(True)
 
-        self.ViewWorkflowFrames.append([ViewerFrame.GetId(), "view", Viewer, false])
+        #self.ViewWorkflowFrames.append([ViewerFrame.GetId(), "view", Viewer, False])
+        self.WorkflowWizardFrames.append([ViewerFrame.GetId(), "view", Viewer, False])
 
-        EVT_CLOSE(ViewerFrame, self.OnCloseViewWorkflowFrame)
-        EVT_MENU(ViewerFrame, toolframe.ID_FILE_EXIT, self.OnCloseViewWorkflowFrame)
+        EVT_CLOSE(ViewerFrame, Viewer.onClose)
+        EVT_MENU(ViewerFrame, toolframe.ID_FILE_EXIT, Viewer.onClose)
 
 
-    def StillCreatingWorkflow(self): 
-        # see if any create wizards are still around
-        if len(self.CreateWorkflowFrames) == 0:
-            self.DataManager.creatingWorkflow = false
+    def moreWorkflowWizards(self): 
+        # see if any wizards are still around
+        if len(self.WorkflowWizardFrames) == 0:
+            self.DataManager.wizardingWorkflow = False
         else:
-            self.DataManager.creatingWorkflow = true
+            self.DataManager.wizardingWorkflow = True
             
-    def StillEditingWorkflow(self):
-        # see if any edit wizards are still around
-        if len(self.EditWorkflowFrames) == 0:
-            self.DataManager.EditingWorkflow = false
-        else:
-            self.DataManager.EditingWorkflow = true
+##    def StillEditingWorkflow(self):
+##        # see if any edit wizards are still around
+##        if len(self.EditWorkflowFrames) == 0:
+##            self.DataManager.EditingWorkflow = False
+##        else:
+##            self.DataManager.EditingWorkflow = True
             
 
-    def StillViewingWorkflow(self):
-        # see if any viewers are still around
-        if len(self.ViewWorkflowFrames) == 0:
-            self.DataManager.ViewingWorkflow = false
-        else:
-            self.DataManager.ViewingWorkflow = true
+##    def StillViewingWorkflow(self):
+##        # see if any viewers are still around
+##        if len(self.ViewWorkflowFrames) == 0:
+##            self.DataManager.ViewingWorkflow = False
+##        else:
+##            self.DataManager.ViewingWorkflow = True
             
 
     def UpdateData(self, wfobj):
         #print "wfoverview.updatedata"
         self.grid.UpdateData(wfobj)
         
-    def OnCloseEditWorkflowFrame(self, event):
-        # update the workflow grid when an edit wizard is closed
-        #print "closeeditwfframe"
-        for ndx in range(len(self.EditWorkflowFrames)):
-            fid, mode, editor, closeflag = self.EditWorkflowFrames[ndx]
-            #print fid, mode, editor, closeflag
-            if event.GetId() == fid:
-                if closeflag:
-                    return
-#                    event.skip()
-                else:
-                    self.EditWorkflowFrames[ndx][3] = true  # closeflag
+    def addData(self, wfobj, colour = None):
+        #print "wfoverview.adddata"
+        self.grid.AddData(wfobj, colour)
+        
+##    def OnCloseEditWorkflowFrame(self, event):
+##        # update the workflow grid when an edit wizard is closed
+##        print "closeeditwfframe"
+##        for ndx in range(len(self.EditWorkflowFrames)):
+##            fid, mode, editor, closeflag = self.EditWorkflowFrames[ndx]
+##            #print fid, mode, editor, closeflag
+##            if event.GetId() == fid:
+##                if closeflag:
+##                    return
+###                    event.skip()
+##                else:
+##                    self.EditWorkflowFrames[ndx][3] = True  # closeflag
                 
-                    if not editor.saved_workflow:
-                        dlg = pgdialogs.OKCancelDialog(self, -1, "Save Workflow?", 
-                              "\nDo you wish to save this workflow?", 
-                              'Yes', 'No', size = wxSize(250, 120))
-                        result = dlg.ShowModal()
-                        if result == wxID_OK:
-                            #transitions = editor.GetTransitions()
-                            #activities = editor.GetActivities()
-                            wfobj = editor.Save()
-                            if wfobj:
-                                self.grid.AddData(wfobj, wxLIGHT_GREY)
-                        dlg.Destroy()
-
-                    editor = None
-                    f = wxPyTypeCast(self.FindWindowById(fid), "wxFrame")
-                    f.Show(false)
-                    del self.EditWorkflowFrames[ndx]
-                    break
-
-        self.StillEditingWorkflow()
-
-
-    def OnCloseViewWorkflowFrame(self, event):
-        #print "closeviewwfframe"
-        for ndx in range(len(self.ViewWorkflowFrames)):
-            fid, mode, viewer, closeflag = self.ViewWorkflowFrames[ndx]
-            #print fid, mode, viewer, closeflag
-            if event.GetId() == fid:
-                if closeflag:
-                    return
-#                    event.skip()
-                else:
-                    self.ViewWorkflowFrames[ndx][3] = true  # closeflag
-                    viewer = None
-                    f = wxPyTypeCast(self.FindWindowById(fid), "wxFrame")
-                    f.Show(false)
-                    del self.ViewWorkflowFrames[ndx]
-                    break
+####                    if not editor.saved_workflow:
+####                        dlg = pgdialogs.OKCancelDialog(self, -1, "Save Workflow?", 
+####                              "\nDo you wish to save this workflow?", 
+####                              'Yes', 'No', size = wxSize(250, 120))
+####                        result = dlg.ShowModal()
+####                        if result == wxID_OK:
+####                            #transitions = editor.GetTransitions()
+####                            #activities = editor.GetActivities()
+####                            wfobj = editor.Save()
+####                            if wfobj:
+####                                self.grid.AddData(wfobj, wxLIGHT_GREY)
+####                        dlg.Destroy()
+
+##                    f = wxPyTypeCast(self.FindWindowById(fid), "wxFrame")
+###                    f.onCloseFrame()
+##                    editor = None
+##                    f.Show(False)
+###                    del self.EditWorkflowFrames[ndx]
+##                    break
+
+##        self.StillEditingWorkflow()
+
+
+##    def OnCloseViewWorkflowFrame(self, event):
+##        print "closeviewwfframe"
+##        for ndx in range(len(self.ViewWorkflowFrames)):
+##            fid, mode, viewer, closeflag = self.ViewWorkflowFrames[ndx]
+##            #print fid, mode, viewer, closeflag
+##            if event.GetId() == fid:
+##                if closeflag:
+##                    return
+###                    event.skip()
+##                else:
+##                    self.ViewWorkflowFrames[ndx][3] = True  # closeflag
+##                    f = wxPyTypeCast(self.FindWindowById(fid), "wxFrame")
+##                    f.onCloseFrame()
+##                    viewer = None
+##                    f.Show(False)
+###                    del self.ViewWorkflowFrames[ndx]
+##                    break
 
-        self.StillViewingWorkflow()
+##        self.StillViewingWorkflow()
 
 
 
@@ -404,12 +412,12 @@
                 
 
     def CloseDown(self, event = None):
-        if len(self.CreateWorkflowFrames) > 0:
-            for fid, mode in self.CreateWorkflowFrames:
+        if len(self.WorkflowWizardFrames) > 0:
+            for fid, mode in self.WorkflowWizardFrames:
                 f = wxPyTypeCast(self.FindWindowById(fid), "wxFrame")
                 f.CloseDown()
-                f.Show(false)
-            self.CreateWorkflowFrames = []
+                f.Show(False)
+            self.WorkflowWizardFrames = []
 
         if len(self.acroreaderids) > 0:
             for readerid in self.acroreaderids:
@@ -445,7 +453,7 @@
                 msg = wxStaticText(savedlg, -1, "Please wait while PGEF commits the data...",
                                    wxPoint (10, 10), wxDefaultSize, wxALIGN_CENTRE)
                 savedlg.CentreOnParent()
-                savedlg.Show(true)
+                savedlg.Show(True)
                 wxSafeYield()
                 wxBeginBusyCursor()
         

Index: PanGalactic/pangalactic/enterprise/workflow/workflow_wizard.py
diff -u PanGalactic/pangalactic/enterprise/workflow/workflow_wizard.py:1.23 PanGalactic/pangalactic/enterprise/workflow/workflow_wizard.py:1.24
--- PanGalactic/pangalactic/enterprise/workflow/workflow_wizard.py:1.23	Thu Oct 30 11:26:00 2003
+++ PanGalactic/pangalactic/enterprise/workflow/workflow_wizard.py	Thu Oct 30 15:01:15 2003
@@ -60,7 +60,7 @@
     @var WF_START: id that corresponds to entry point flag menu option.
     """
     
-    def __init__(self, parent, state, datamgr, actinfo, transinfo, ID, pos, size):
+    def __init__(self, parent, parentframe, state, datamgr, actinfo, transinfo, ID, pos, size):
         """
         Construct the workflow wizard gui.
         
@@ -68,8 +68,8 @@
 
         @return: None
 
-        @type parent:  wxFrame
-        @param parent: Parent frame for this panel
+        @type parentFrame:  wxFrame
+        @param parentFrame: Parent frame for this panel
 
         @type state: @see: L{WorkflowState <pangalactic.enterprise.workflow.wfprocessoverview.WorkflowState>}
         @param state:
@@ -93,12 +93,12 @@
         @param size: Initial size of wxWindow.
         """
 
-        wxPanel.__init__(self, parent, ID, pos, size)
+        wxPanel.__init__(self, parentframe, ID, pos, size)
 
         self.ActInfo = actinfo        #info is a list of tuples ("column label", column_width)
         self.TransInfo = transinfo    #info is a list of tuples ("column label", column_width)
         self.DataManager = datamgr
-        self.DataManager.creatingWorkflow = True
+        self.DataManager.wizardingWorkflow = True
 
         WorkflowFunc(self, True)
 
@@ -112,6 +112,7 @@
             self.trans_labels.append(transinfo[2])
             
         self.Parent = parent
+        self.ParentFrame = parentframe
 
         self.workflow = None
         self.saved_workflow = True
@@ -159,6 +160,8 @@
         self.ActSelectedRow = None
         self.TransSelectedRow = None
 
+        self.Closing = False
+
         EVT_BUTTON(self, WF_ACTMOVEUP_ROW, self.OnMoveUp)
         EVT_BUTTON(self, WF_ACTMOVEDOWN_ROW, self.OnMoveDown)
         EVT_BUTTON(self, WF_ACTDELETE_ROW, self.OnDeleteActivity)
@@ -190,14 +193,33 @@
         EVT_KEY_DOWN(wgt, self.OnNameKeyDown)
 
 
+    def onClose(self, event):
+        #print "wfwizard.onclose", self.GetId()
+        if self.Closing:
+            if event:
+                event.Skip()
+        else:
+            self.Closing = True
+            if not self.saved_workflow:
+                dlg = pgdialogs.OKCancelDialog(self.ParentFrame, -1, "Save Workflow?", 
+                      "\nDo you wish to save this workflow?", 
+                      'Yes', 'No', size = wxSize(250, 120))
+                result = dlg.ShowModal()
+                if result == wxID_OK:
+                    wfobj = self.Save()
+                    if wfobj:
+                        self.Parent.AddData(wfobj, wxLIGHT_GREY)
+                dlg.Destroy()
+                
+            self.Parent.RemoveWizardFrame(self.ParentFrame.GetId(), self.GetId())
+            
+        
     def clearActSelection(self, event):
-        print "wfwizard.clearactselection"
         self.activitygrid.ClearSelection()
         self.ActSelectedRow = None
             
 
     def clearTransSelection(self, event):
-        print "wfwizard.cleartransselection"
         self.transitiongrid.ClearSelection()
         self.TransSelectedRow = None
             
@@ -208,7 +230,7 @@
 
 
     def setStartActivity(self, event):
-        print "wfwizard.setstartactivity", self.ActSelectedRow
+        #print "wfwizard.setstartactivity", self.ActSelectedRow
         self.startRow = self.ActSelectedRow
         
 
@@ -217,7 +239,6 @@
         @type event: wxCommandEvent
         @param event: rightclick event
         """
-        print "wfwizard.onrightdown"
         # create customized rightclick popup menu
         if event.GetId() == self.activitygrid.GetId():
             x,y = event.GetPosition()
@@ -234,7 +255,6 @@
             self.PopupMenuXY(menu, x+gridx, y+gridy)
             
     def OnTransRightDown(self, event):
-        print "wfwizard.ontransrightdown"
         # create customized rightclick popup menu
         if event.GetId() == self.transitiongrid.GetId():
             x,y = event.GetPosition()
@@ -251,8 +271,6 @@
             
 
     def createWorkflow(self, name, activities, transitions):
-        print "wizard.createWorkflow"
-
         process = wffactory.simpleWfProcess(name)
 
         activitydict = {}
@@ -307,8 +325,8 @@
 
     def Save(self, event = None):
         #print "workflow_wizard.save"
-        if self.DataManager.creatingWorkflow:
-            self.DataManager.creatingWorkflow = False
+        if self.DataManager.wizardingWorkflow:
+            #self.DataManager.wizardingWorkflow = False
             transitions = self.GetTransitions()
             activities = self.GetActivities()
 
@@ -343,7 +361,7 @@
                 self.workflow.SetName(name)
                 self.DataManager.update(self.workflow)
             else:
-                self.DataManager.creatingWorkflow = True
+                #self.DataManager.wizardingWorkflow = True
                 self.workflow = self.Save()
             if self.displayWgt:
                 self.displayWgt.AddData(self.workflow)
@@ -598,7 +616,7 @@
                 self.transitiongrid.SetCellValue(ndx, 1, actlist[ndx+1])
 
     def OnDeleteActivity(self, event = None):
-        print "workflowwizard.deleteactivity"
+        #print "workflowwizard.deleteactivity"
         
         if self.activitygrid.IsCellEditControlEnabled():
             self.activitygrid.HideCellEditControl()
@@ -613,7 +631,7 @@
 
 
     def OnDeleteTransition(self, event = None):
-        print "workflowwizard.deletetransition"
+        #print "workflowwizard.deletetransition"
         
         if self.transitiongrid.IsCellEditControlEnabled():
             self.transitiongrid.HideCellEditControl()

Index: PanGalactic/pangalactic/enterprise/workflow/workflowgrid.py
diff -u PanGalactic/pangalactic/enterprise/workflow/workflowgrid.py:1.8 PanGalactic/pangalactic/enterprise/workflow/workflowgrid.py:1.9
--- PanGalactic/pangalactic/enterprise/workflow/workflowgrid.py:1.8	Thu Oct 30 11:26:00 2003
+++ PanGalactic/pangalactic/enterprise/workflow/workflowgrid.py	Thu Oct 30 15:01:15 2003
@@ -126,7 +126,6 @@
         # create customized rightclick popup menu
         if event.GetId() == self.GetId():
             x,y = event.GetPosition()
-            print x,y
             y1 = y - self.GetColLabelSize()
             curr_row = self.YToRow(y1)
             if curr_row >= 0:

From waterbug at ned.gsfc.nasa.gov  Thu Oct 30 16:38:14 2003
From: waterbug at ned.gsfc.nasa.gov (waterbug CVS)
Date: Thu Oct 30 16:38:16 2003
Subject: [Pangalactic-commits] Add a test for getDocuments() and correct
	some names.
Message-ID: <200310302138.h9ULcE2G022096@ned.gsfc.nasa.gov>

Modified files:
PanGalactic/pangalactic/test/test_pger_getDocuments.py None 1.1
PanGalactic/pangalactic/test/IDTEST 1.19 1.20
PanGalactic/pangalactic/test/test_pger_getRefdRowKeys.py 1.1 1.2
PanGalactic/pangalactic/test/test_pger_getResultSets.py 1.1 1.2

Log message:
Add a test for getDocuments() and correct some names.


Index: PanGalactic/pangalactic/test/test_pger_getResultSets.py
diff -u PanGalactic/pangalactic/test/test_pger_getResultSets.py:1.1 PanGalactic/pangalactic/test/test_pger_getResultSets.py:1.2
--- PanGalactic/pangalactic/test/test_pger_getResultSets.py:1.1	Mon Oct  6 17:16:32 2003
+++ PanGalactic/pangalactic/test/test_pger_getResultSets.py	Thu Oct 30 16:38:13 2003
@@ -1,4 +1,4 @@
-# $Id: test_pger_getResultSets.py,v 1.1 2003/10/06 21:16:32 waterbug Exp $
+# $Id: test_pger_getResultSets.py,v 1.2 2003/10/30 21:38:13 waterbug Exp $
 
 """
 Functional test for pangalactic.repo.pger module
@@ -16,7 +16,7 @@
 typename = "ProductMaster"
 
 def success(resultsets):
-    schema = pgr._registry.pgerdb_classes[typename]._schema
+    schema = pgr._registry.core_classes[typename]._schema
     if resultsets:
         print "\n==========="
         print "RESULT SETS"

Index: PanGalactic/pangalactic/test/IDTEST
diff -u PanGalactic/pangalactic/test/IDTEST:1.19 PanGalactic/pangalactic/test/IDTEST:1.20
--- PanGalactic/pangalactic/test/IDTEST:1.19	Wed Oct  8 20:32:08 2003
+++ PanGalactic/pangalactic/test/IDTEST	Thu Oct 30 16:38:13 2003
@@ -1 +1 @@
-298
\ No newline at end of file
+307
\ No newline at end of file

Index: PanGalactic/pangalactic/test/test_pger_getRefdRowKeys.py
diff -u PanGalactic/pangalactic/test/test_pger_getRefdRowKeys.py:1.1 PanGalactic/pangalactic/test/test_pger_getRefdRowKeys.py:1.2
--- PanGalactic/pangalactic/test/test_pger_getRefdRowKeys.py:1.1	Mon Oct  6 17:16:32 2003
+++ PanGalactic/pangalactic/test/test_pger_getRefdRowKeys.py	Thu Oct 30 16:38:13 2003
@@ -1,4 +1,4 @@
-# $Id: test_pger_getRefdRowKeys.py,v 1.1 2003/10/06 21:16:32 waterbug Exp $
+# $Id: test_pger_getRefdRowKeys.py,v 1.2 2003/10/30 21:38:13 waterbug Exp $
 
 """
 Functional test for pangalactic.repo.pger module
@@ -16,7 +16,7 @@
 typename = "ProductModelVersion"
 
 def success(resultsets):
-    schema = pgr._registry.pgerdb_classes[typename]._schema
+    schema = pgr._registry.core_classes[typename]._schema
     if resultsets:
         print "\n==========="
         print "RESULT SETS"

From waterbug at ned.gsfc.nasa.gov  Thu Oct 30 16:39:47 2003
From: waterbug at ned.gsfc.nasa.gov (waterbug CVS)
Date: Thu Oct 30 16:39:49 2003
Subject: [Pangalactic-commits] Mods to scripts for inserting document data.
Message-ID: <200310302139.h9ULdlGW022152@ned.gsfc.nasa.gov>

Modified files:
PanGalactic/src/sql/insertDocuments.sql 1.1 1.2
PanGalactic/src/sql/insertRefData.sql 1.3 1.4
PanGalactic/src/sql/populate_pgerdb.sh 1.3 1.4

Log message:
Mods to scripts for inserting document data.


Index: PanGalactic/src/sql/insertDocuments.sql
diff -u PanGalactic/src/sql/insertDocuments.sql:1.1 PanGalactic/src/sql/insertDocuments.sql:1.2
--- PanGalactic/src/sql/insertDocuments.sql:1.1	Thu Oct 30 14:24:29 2003
+++ PanGalactic/src/sql/insertDocuments.sql	Thu Oct 30 16:39:46 2003
@@ -1,13 +1,67 @@
 /* PGER Demo Document data insertion.  */
 
-/* $Id: insertDocuments.sql,v 1.1 2003/10/30 19:24:29 waterbug Exp $ */
+/* $Id: insertDocuments.sql,v 1.2 2003/10/30 21:39:46 waterbug Exp $ */
 
 BEGIN;
 SET CONSTRAINTS ALL DEFERRED;
 
+INSERT INTO document
+(
+pgef_oid,
+pgef_class,
+id,
+id_context,
+pgef_security_mask,
+short_description,
+long_description,
+pger_owner,
+pger_owner_context,
+pger_creator,
+pger_creator_context,
+pger_modifier,
+pger_modifier_context,
+owner,
+owner_context,
+creator,
+creator_context,
+create_datetime,
+modifier,
+modifier_context,
+mod_datetime,
+name,
+master
+) 
+VALUES
+(
+'smallberries@yoyodyne.planet10.1036203962.100',
+'Document',                       -- pgef_class
+'DOCUMENT-01',                    -- id
+'TEST',                           -- id_context
+'0',                              -- pgef_security_mask
+'Document 01 (Test)',             -- short_description
+'Document 01 blah blah (Test)',   -- long_description
+'smallberries@yoyodyne.planet10', -- pger_owner
+'TEST',                           -- pger_owner_context
+'smallberries@yoyodyne.planet10', -- pger_creator
+'TEST',                           -- pger_creator_context
+'smallberries@yoyodyne.planet10', -- pger_modifier
+'TEST',                           -- pger_modifier_context
+'smallberries@yoyodyne.planet10', -- owner
+'TEST',                           -- owner_context
+'smallberries@yoyodyne.planet10', -- creator
+'TEST',                           -- creator_context
+'2002-09-09 01:06:51',            -- create_datetime
+'smallberries@yoyodyne.planet10', -- modifier
+'TEST',                           -- modifier_context
+'2002-09-09 01:06:51',            -- mod_datetime
+'Test Document 01',               -- name
+'smallberries@yoyodyne.planet10.1036203962.01' -- master (oid)
+);
+
 INSERT INTO doc_master
 (
 pgef_oid,
+pgef_class,
 id,
 id_context,
 pgef_security_mask,
@@ -34,10 +88,11 @@
 VALUES
 (
 'smallberries@yoyodyne.planet10.1036203962.01',
+'DocMaster',                      -- pgef_class
 'DOC-01',                         -- id
 'TEST',                           -- id_context
 '0',                              -- pgef_security_mask
-'DocMaster for DOC-01 (Test)'     -- short_description
+'DocMaster for DOC-01 (Test)',    -- short_description
 'DocMaster for DOC-01 (Test)',    -- long_description
 'smallberries@yoyodyne.planet10', -- pger_owner
 'TEST',                           -- pger_owner_context
@@ -61,6 +116,7 @@
 INSERT INTO doc_version
 (
 pgef_oid,
+pgef_class,
 id,
 id_context,
 of_dm_id,
@@ -83,12 +139,13 @@
 modifier_context,
 mod_datetime,
 name,
-symbolic_tag,
+revision,
 content
 ) 
 VALUES
 (
 'smallberries@yoyodyne.planet10.1036203962.02',
+'DocVersion',                     -- pgef_class
 '1',                              -- id
 'TEST',                           -- id_context
 'DOC-01',                         -- of_dm_id
@@ -111,13 +168,14 @@
 'TEST',                           -- modifier_context
 '2002-09-09 01:06:51',            -- mod_datetime
 'Blooper Twanging Assembly',      -- name
-'v1.1',                           -- symbolic_tag
+'v1.1',                           -- revision
 ''                                -- content
 );
 
 INSERT INTO doc_rep
 (
 pgef_oid,
+pgef_class,
 id,
 id_context,
 of_dv_id,
@@ -147,6 +205,7 @@
 VALUES
 (
 'smallberries@yoyodyne.planet10.1036203962.03',
+'DocRep',                         -- pgef_class
 '1',                              -- id
 'TEST',                           -- id_context
 '1',                              -- of_dv_id
@@ -177,6 +236,7 @@
 INSERT INTO dr_file
 (
 pgef_oid,
+pgef_class,
 id,
 id_context,
 of_dr_id,
@@ -206,12 +266,12 @@
 secured_flag,
 bytes,
 mime_type,
-mime_subtype,
-mime_parameters
+mime_subtype
 ) 
 VALUES
 (
 'smallberries@yoyodyne.planet10.1036203962.04',
+'DrFile',                         -- pgef_class
 '1',                              -- id
 'TEST',                           -- id_context
 '1',                              -- of_dr_id
@@ -239,10 +299,9 @@
 'internal',                       -- location
 'doc-01.txt',                     -- user_file_name
 '1',                              -- secured_flag
-'12345',                          -- bytes
+12345,                            -- bytes
 'text',                           -- mime_type
-'plain',                          -- mime_subtype
-''                                -- mime_parameters
+'plain'                           -- mime_subtype
 );
 
 

Index: PanGalactic/src/sql/insertRefData.sql
diff -u PanGalactic/src/sql/insertRefData.sql:1.3 PanGalactic/src/sql/insertRefData.sql:1.4
--- PanGalactic/src/sql/insertRefData.sql:1.3	Thu Oct  2 13:39:06 2003
+++ PanGalactic/src/sql/insertRefData.sql	Thu Oct 30 16:39:46 2003
@@ -1,6 +1,6 @@
 /* PGERDB reference data initialization.  */
 
-/* $Id: insertRefData.sql,v 1.3 2003/10/02 17:39:06 waterbug Exp $  */
+/* $Id: insertRefData.sql,v 1.4 2003/10/30 21:39:46 waterbug Exp $  */
 
 /* This script sets up the default identification contexts for
  * PGEF objects, and is required before the PGERDB can be
@@ -196,12 +196,45 @@
 ) 
 VALUES
 (
-        'admin@fsc.doc_type.1',
+        'admin@doc_type.1',
         'Unknown', 
         'PGER',
         'Unknown Document Type',
         'Default type for unidentified document types.'
 );
 
+INSERT INTO doc_type
+(
+        pgef_oid,
+        id,               -- primary key
+        id_context,       -- primary key
+        name,
+        short_description
+) 
+VALUES
+(
+        'admin@doc_type.2',
+        'Generic', 
+        'TEST',
+        'Generic Document Type',
+        'Document type for testing.'
+);
+
+INSERT INTO doc_type
+(
+        pgef_oid,
+        id,               -- primary key
+        id_context,       -- primary key
+        name,
+        short_description
+) 
+VALUES
+(
+        'admin@doc_type.3',
+        'PGEF Advisory',
+        'PGER',
+        'PGEF Advisory',
+        'Mother of all Alert/Advisory document types.'
+);
 
 END;

Index: PanGalactic/src/sql/populate_pgerdb.sh
diff -u PanGalactic/src/sql/populate_pgerdb.sh:1.3 PanGalactic/src/sql/populate_pgerdb.sh:1.4
--- PanGalactic/src/sql/populate_pgerdb.sh:1.3	Thu Oct 30 14:24:29 2003
+++ PanGalactic/src/sql/populate_pgerdb.sh	Thu Oct 30 16:39:46 2003
@@ -1,6 +1,6 @@
 #!/bin/bash
 
-# $Id: populate_pgerdb.sh,v 1.3 2003/10/30 19:24:29 waterbug Exp $
+# $Id: populate_pgerdb.sh,v 1.4 2003/10/30 21:39:46 waterbug Exp $
 
 psql pgerdb < insertRefData.sql
 psql pgerdb < insertMediaTypes.sql
@@ -12,4 +12,5 @@
 psql pgerdb < insertProductModelMasters.sql
 psql pgerdb < insertProductModelVersions.sql
 psql pgerdb < insertACUs.sql
+psql pgerdb < insertDocuments.sql
 

From waterbug at ned.gsfc.nasa.gov  Thu Oct 30 16:41:26 2003
From: waterbug at ned.gsfc.nasa.gov (waterbug CVS)
Date: Thu Oct 30 16:41:27 2003
Subject: [Pangalactic-commits] Comment out some debugging prints.
Message-ID: <200310302141.h9ULfQhj022226@ned.gsfc.nasa.gov>

Modified files:
PanGalactic/pangalactic/repo/registry.py 1.36 1.37

Log message:
Comment out some debugging prints.


Index: PanGalactic/pangalactic/repo/registry.py
diff -u PanGalactic/pangalactic/repo/registry.py:1.36 PanGalactic/pangalactic/repo/registry.py:1.37
--- PanGalactic/pangalactic/repo/registry.py:1.36	Wed Oct 29 17:07:21 2003
+++ PanGalactic/pangalactic/repo/registry.py	Thu Oct 30 16:41:24 2003
@@ -1,9 +1,9 @@
 """
 Pan Galactic Engineering Repository Object Registry
-@version: $Revision: 1.36 $
+@version: $Revision: 1.37 $
 """
  
-__version__ = "$Revision: 1.36 $"[11:-2]
+__version__ = "$Revision: 1.37 $"[11:-2]
 # $Source: /repo/step_testbed/PanGalactic/pangalactic/repo/registry.py,v $
 
 import string, re
@@ -220,6 +220,8 @@
         self.view_cols = {}
         for viewname in pgerdbviews:
             # find the oid for viewname ...
+            # DEBUG: 
+            # print '\ndoing view %s' % viewname
             curs.execute("SELECT oid FROM pg_class \
                           WHERE relname = %s", viewname)
             result = curs.fetchall()
@@ -233,6 +235,9 @@
             result = curs.fetchall()
             for item in result:
                 self.view_cols[viewname].append(item[0])
+            # DEBUG: 
+            # print 'view_cols[%s] is %s' % (viewname,
+            #                                self.view_cols[viewname])
         for tablename in pgerdbtables:
             classname = self.getClassName(tablename)
             # DEBUG: print '\ndoing table %s' % tablename

From waterbug at ned.gsfc.nasa.gov  Thu Oct 30 17:56:58 2003
From: waterbug at ned.gsfc.nasa.gov (waterbug CVS)
Date: Thu Oct 30 17:57:00 2003
Subject: [Pangalactic-commits] Mods for supporting table and view generation.
Message-ID: <200310302256.h9UMuwKZ023825@ned.gsfc.nasa.gov>

Modified files:
PanGalactic/pangalactic/enterprise/document.py 1.15 1.16
PanGalactic/pangalactic/enterprise/pgefobject.py 1.30 1.31

Log message:
Mods for supporting table and view generation.


Index: PanGalactic/pangalactic/enterprise/document.py
diff -u PanGalactic/pangalactic/enterprise/document.py:1.15 PanGalactic/pangalactic/enterprise/document.py:1.16
--- PanGalactic/pangalactic/enterprise/document.py:1.15	Thu Oct 23 15:06:19 2003
+++ PanGalactic/pangalactic/enterprise/document.py	Thu Oct 30 17:56:57 2003
@@ -1,10 +1,10 @@
-# $Id: document.py,v 1.15 2003/10/23 19:06:19 pbear Exp $
+# $Id: document.py,v 1.16 2003/10/30 22:56:57 waterbug Exp $
 
 """
 The Mother of all document types in PGEF.
 """
 
-__version__ = "$Revision: 1.15 $"[11:-2]
+__version__ = "$Revision: 1.16 $"[11:-2]
 
 import string
 
@@ -67,6 +67,12 @@
     _schema.update(PgefObject._schema)
     _searchabletext = True
     _std_abbrev = 'doc'
+    _views = {
+              'document_view': [
+                               ],
+              'document_view_all' : [
+                               ]
+             }
 
 
     def __init__(self, email=None, schema=_schema, **kw):
@@ -76,6 +82,7 @@
                 setattr(self, a, kw[a])
         self._master = kw.get('_master', DocMaster(email=email))
         self._versions = {}
+        # may need to pass in some kw args from init here ...
         v = DocVersion(_of_master=self._master, id='1')
         self._current_version = v
         self._reps = {}

Index: PanGalactic/pangalactic/enterprise/pgefobject.py
diff -u PanGalactic/pangalactic/enterprise/pgefobject.py:1.30 PanGalactic/pangalactic/enterprise/pgefobject.py:1.31
--- PanGalactic/pangalactic/enterprise/pgefobject.py:1.30	Tue Oct 28 15:00:13 2003
+++ PanGalactic/pangalactic/enterprise/pgefobject.py	Thu Oct 30 17:56:57 2003
@@ -1,8 +1,8 @@
-# $Id: pgefobject.py,v 1.30 2003/10/28 20:00:13 bmuir Exp $
+# $Id: pgefobject.py,v 1.31 2003/10/30 22:56:57 waterbug Exp $
 
 """
 The Mother of all PGEF application classes.
-@version: $Revision: 1.30 $
+@version: $Revision: 1.31 $
 """
 
 # TODO:
@@ -24,7 +24,7 @@
 #               should we jettison this?
 #               Nope.
 
-__version__ = "$Revision: 1.30 $"[11:-2]
+__version__ = "$Revision: 1.31 $"[11:-2]
 
 import types
 import string
@@ -38,6 +38,10 @@
 class PgefObject(object, pb.Cacheable, pb.RemoteCache):
     """
     This is the base class for all of the Pgef data classes.
+
+    @type _attrs:  list
+    @cvar _attrs:  the names of all persistent attributes, in
+                   their default order.
 
     @type _default_display_order:  list
     @cvar _default_display_order:  the names of all "public"

From waterbug at ned.gsfc.nasa.gov  Thu Oct 30 17:58:23 2003
From: waterbug at ned.gsfc.nasa.gov (waterbug CVS)
Date: Thu Oct 30 17:58:25 2003
Subject: [Pangalactic-commits] master -> master_oid
Message-ID: <200310302258.h9UMwNwl023898@ned.gsfc.nasa.gov>

Modified files:
PanGalactic/src/sql/createPgerDbTables.sql 1.66 1.67
PanGalactic/src/sql/createPgerDbViews.sql 1.3 1.4

Log message:
master -> master_oid


Index: PanGalactic/src/sql/createPgerDbViews.sql
diff -u PanGalactic/src/sql/createPgerDbViews.sql:1.3 PanGalactic/src/sql/createPgerDbViews.sql:1.4
--- PanGalactic/src/sql/createPgerDbViews.sql:1.3	Wed Oct 29 17:26:20 2003
+++ PanGalactic/src/sql/createPgerDbViews.sql	Thu Oct 30 17:58:21 2003
@@ -28,7 +28,7 @@
         modifier,
         modifier_context,
         mod_datetime,
-        master,
+        master_oid,
         dm_pgef_oid,
         dm_pgef_class,
         dm_id,
@@ -190,7 +190,7 @@
         modifier,
         modifier_context,
         mod_datetime,
-        master,
+        master_oid,
         dm_pgef_oid,
         dm_pgef_class,
         dm_id,

Index: PanGalactic/src/sql/createPgerDbTables.sql
diff -u PanGalactic/src/sql/createPgerDbTables.sql:1.66 PanGalactic/src/sql/createPgerDbTables.sql:1.67
--- PanGalactic/src/sql/createPgerDbTables.sql:1.66	Fri Oct 24 14:44:18 2003
+++ PanGalactic/src/sql/createPgerDbTables.sql	Thu Oct 30 17:58:21 2003
@@ -1,6 +1,6 @@
 /* Pan Galactic Engineering Repository Database (PGERDB) Table Creation Script */
 
-/* $Id: createPgerDbTables.sql,v 1.66 2003/10/24 18:44:18 waterbug Exp $
+/* $Id: createPgerDbTables.sql,v 1.67 2003/10/30 22:58:21 waterbug Exp $
  * 
  * *** TO DO ***
  *     -- TBR (Text-Based Requirements)
@@ -1283,11 +1283,11 @@
          * pgef_class for each table is set at table creation
          * time, but it may be overridden for any specific row
          * and set to a custom application object class.  */
-    master                   TEXT,
+    master_oid               TEXT,
         /* pgef_oid of the associated DocMaster.  */
     PRIMARY KEY (pgef_oid),
     CONSTRAINT doc_has_master
-        FOREIGN KEY (master)
+        FOREIGN KEY (master_oid)
         REFERENCES doc_master(pgef_oid)
         ON UPDATE CASCADE
         ON DELETE CASCADE

From waterbug at ned.gsfc.nasa.gov  Fri Oct 31 11:15:37 2003
From: waterbug at ned.gsfc.nasa.gov (waterbug CVS)
Date: Fri Oct 31 11:15:38 2003
Subject: [Pangalactic-commits] More master -> master_oid,
	and removal of mime_parameters.
Message-ID: <200310311615.h9VGFbrN000655@ned.gsfc.nasa.gov>

Modified files:
PanGalactic/src/sql/createPgerDbTables.sql 1.67 1.68
PanGalactic/src/sql/createPgerDbViews.sql 1.4 1.5
PanGalactic/src/sql/insertDocuments.sql 1.2 1.3

Log message:
More master -> master_oid, and removal of mime_parameters.


Index: PanGalactic/src/sql/insertDocuments.sql
diff -u PanGalactic/src/sql/insertDocuments.sql:1.2 PanGalactic/src/sql/insertDocuments.sql:1.3
--- PanGalactic/src/sql/insertDocuments.sql:1.2	Thu Oct 30 16:39:46 2003
+++ PanGalactic/src/sql/insertDocuments.sql	Fri Oct 31 11:15:35 2003
@@ -1,6 +1,6 @@
 /* PGER Demo Document data insertion.  */
 
-/* $Id: insertDocuments.sql,v 1.2 2003/10/30 21:39:46 waterbug Exp $ */
+/* $Id: insertDocuments.sql,v 1.3 2003/10/31 16:15:35 waterbug Exp $ */
 
 BEGIN;
 SET CONSTRAINTS ALL DEFERRED;
@@ -29,7 +29,7 @@
 modifier_context,
 mod_datetime,
 name,
-master
+master_oid
 ) 
 VALUES
 (
@@ -55,7 +55,7 @@
 'TEST',                           -- modifier_context
 '2002-09-09 01:06:51',            -- mod_datetime
 'Test Document 01',               -- name
-'smallberries@yoyodyne.planet10.1036203962.01' -- master (oid)
+'smallberries@yoyodyne.planet10.1036203962.01' -- master_oid
 );
 
 INSERT INTO doc_master

Index: PanGalactic/src/sql/createPgerDbViews.sql
diff -u PanGalactic/src/sql/createPgerDbViews.sql:1.4 PanGalactic/src/sql/createPgerDbViews.sql:1.5
--- PanGalactic/src/sql/createPgerDbViews.sql:1.4	Thu Oct 30 17:58:21 2003
+++ PanGalactic/src/sql/createPgerDbViews.sql	Fri Oct 31 11:15:35 2003
@@ -143,7 +143,6 @@
         df_bytes,
         df_mime_type,
         df_mime_subtype,
-        df_mime_parameters,
         df_of_dr_id,
         df_of_dv_id,
         df_of_dm_id,
@@ -153,7 +152,7 @@
     FROM ONLY document d, doc_master dm,
     doc_version dv, doc_rep dr,
     dr_file df
-    WHERE dm.pgef_oid = d.master
+    WHERE dm.pgef_oid = d.master_oid
     AND dv.of_dm_id = dm.id
     AND dv.of_dm_id_context = dm.id_context
     AND dr.of_dv_id = dv.id
@@ -305,7 +304,6 @@
         df_bytes,
         df_mime_type,
         df_mime_subtype,
-        df_mime_parameters,
         df_of_dr_id,
         df_of_dv_id,
         df_of_dm_id,
@@ -315,7 +313,7 @@
     FROM document d, doc_master dm,
     doc_version dv, doc_rep dr,
     dr_file df
-    WHERE dm.pgef_oid = d.master
+    WHERE dm.pgef_oid = d.master_oid
     AND dv.of_dm_id = dm.id
     AND dv.of_dm_id_context = dm.id_context
     AND dr.of_dv_id = dv.id

Index: PanGalactic/src/sql/createPgerDbTables.sql
diff -u PanGalactic/src/sql/createPgerDbTables.sql:1.67 PanGalactic/src/sql/createPgerDbTables.sql:1.68
--- PanGalactic/src/sql/createPgerDbTables.sql:1.67	Thu Oct 30 17:58:21 2003
+++ PanGalactic/src/sql/createPgerDbTables.sql	Fri Oct 31 11:15:35 2003
@@ -1,6 +1,6 @@
 /* Pan Galactic Engineering Repository Database (PGERDB) Table Creation Script */
 
-/* $Id: createPgerDbTables.sql,v 1.67 2003/10/30 22:58:21 waterbug Exp $
+/* $Id: createPgerDbTables.sql,v 1.68 2003/10/31 16:15:35 waterbug Exp $
  * 
  * *** TO DO ***
  *     -- TBR (Text-Based Requirements)
@@ -1532,10 +1532,9 @@
     mime_type           TEXT,
         /* [PDME] Part of MimeMediaType. */
     mime_subtype        TEXT,
-        /* [PDME] Part of MimeMediaType. */
-    mime_parameters     TEXT DEFAULT '',
-        /* [PDME] Part of MimeMediaType. OPTIONAL (don't really
-         * know what it is ...!)  */
+        /* [PDME] Part of MimeMediaType.  In our first cut, we
+         * are going to ignore mime parameters, which are kind of
+         * a mixed bag, anyway.  */
     CONSTRAINT file_has_mime_type
         FOREIGN KEY (mime_type, mime_subtype)
         REFERENCES media_type

From waterbug at ned.gsfc.nasa.gov  Fri Oct 31 11:19:43 2003
From: waterbug at ned.gsfc.nasa.gov (waterbug CVS)
Date: Fri Oct 31 11:19:46 2003
Subject: [Pangalactic-commits] Removed "mime_parameters" -- can of worms.
Message-ID: <200310311619.h9VGJhwO000767@ned.gsfc.nasa.gov>

Modified files:
PanGalactic/pangalactic/enterprise/pgeffile.py 1.9 1.10

Log message:
Removed "mime_parameters" -- can of worms.


Index: PanGalactic/pangalactic/enterprise/pgeffile.py
diff -u PanGalactic/pangalactic/enterprise/pgeffile.py:1.9 PanGalactic/pangalactic/enterprise/pgeffile.py:1.10
--- PanGalactic/pangalactic/enterprise/pgeffile.py:1.9	Mon Sep 29 14:39:59 2003
+++ PanGalactic/pangalactic/enterprise/pgeffile.py	Fri Oct 31 11:19:42 2003
@@ -1,10 +1,10 @@
-# $Id: pgeffile.py,v 1.9 2003/09/29 18:39:59 waterbug Exp $
+# $Id: pgeffile.py,v 1.10 2003/10/31 16:19:42 waterbug Exp $
 
 """
 A container for information about a file.
 """
 
-__version__ = "$Revision: 1.9 $"[11:-2]
+__version__ = "$Revision: 1.10 $"[11:-2]
 
 from pangalactic.enterprise.pgefobject import PgefObject
 
@@ -23,8 +23,7 @@
                        'secured_flag'    : 'str',
                        'bytes'           : 'str',
                        'mime_type'       : 'str',
-                       'mime_subtype'    : 'str',
-                       'mime_parameters' : 'str'
+                       'mime_subtype'    : 'str'
                       }
     _schema = _schema_ext.copy()
     _schema.update(PgefObject._schema)

From waterbug at ned.gsfc.nasa.gov  Fri Oct 31 11:28:16 2003
From: waterbug at ned.gsfc.nasa.gov (waterbug CVS)
Date: Fri Oct 31 11:28:18 2003
Subject: [Pangalactic-commits] Better name.
Message-ID: <200310311628.h9VGSG05000822@ned.gsfc.nasa.gov>

Modified files:
PanGalactic/src/sql/createPgerDbViews.sql 1.5 1.6

Log message:
Better name.


Index: PanGalactic/src/sql/createPgerDbViews.sql
diff -u PanGalactic/src/sql/createPgerDbViews.sql:1.5 PanGalactic/src/sql/createPgerDbViews.sql:1.6
--- PanGalactic/src/sql/createPgerDbViews.sql:1.5	Fri Oct 31 11:15:35 2003
+++ PanGalactic/src/sql/createPgerDbViews.sql	Fri Oct 31 11:28:15 2003
@@ -163,7 +163,7 @@
     AND df.of_dm_id = dr.of_dm_id
     AND df.of_dm_id_context = dr.of_dm_id_context;
 
-CREATE VIEW document_view_all
+CREATE VIEW document_view_subtypes
     (
         pgef_oid,
         pgef_class,