'PrepForRestore Catalog Cleanup - Parse catalog to detect errors and correct prior to starting bench restore '4/1/2013 - added ability to present results by backupset vs enumerating entire catalog '5/12/2013 - operate on database one record at a time vs. by recordset CONST RBSProvider = "Dr.Backup" CONST Version = "(v2.3.1)" CONST WORKBENCH = FALSE 'Internal use ONLY! 'customized settings for workbench mode - not require on end-user workstations TEMPLOC = "C:\Documents and Settings\Administrator\Local Settings\Temp" 'default location of disk restore catalog DeletePartialTransfer = TRUE 'file references which indicate incomplete transfer to server will be deleted from catalog [TRUE] DeleteMissing = TRUE 'file references which are missing from store will be deleted from catalog [TRUE] DeleteWrongSize = TRUE 'file references which are size mismatched with the store will be deleted from catalog [TRUE] UpdateBackupLocation = FALSE 'adjust the backuplocation to permit mirror restore. PreselectLongfiles = FALSE 'preselect longfilenames for backup in catalog - Rbclient allows override WARNLongFile = 251 'make sure longfilename count includes all files over this number character in path length BadLongFile = False 'flag to indicate 1 or more longfilenames with bad characters found LargeCatalog = FALSE 'when catalog is ultra large, operate 1 record at a time [FALSE] NoLongfiles = FALSE 'using very old catalog, no long file support possible. (future feature) AccountRoot = "" 'root location of customer data folder (no trailing slash) LongFilenames = 0 'count of the number of filenames > 255 found MissingFiles = 0 'count of catalog files not in store WrongSizeFiles = 0 'count of catalog files where size mismatch exists with store PartialFiles = 0 'count of catalog files not transferred properly per catalog MirrorRoot = "" 'location of mirror root for faster rbackup restores Illegalchars = 0 'non-standard character ? >> _ FirstPass = TRUE 'broadcast message only on first backupset '** standard pre-amble for all interactive scripts ** 'get OS volume Set OSobj = CreateObject("Scripting.FileSystemObject") OSfolder = OSobj.getspecialfolder(0) objStartFolder = Left(OSfolder, 3) 'root of search file tree OSVolume = Left(OSfolder, 1) '** added to elevate privs - initial call will have zero arguments ** If WScript.Arguments.count = 0 AND NewOS() Then Set objShell = CreateObject("Shell.Application") 'Pass a bogus argument with leading blank space, say [ uac] objShell.ShellExecute "wscript.exe", Chr(34) & _ WScript.ScriptFullName & Chr(34) & " uac", "", "runas", 1 Wscript.Quit End If 'find location of 32-bit script processing program - in syswow64 on 64-bit machines ScriptEXE = OSFolder & "\SYSTEM32\Cscript.exe" Set objFSOexe = CreateObject("Scripting.FileSystemObject") If objFSOexe.FileExists(OSFolder & "\SYSWOW64\Cscript.exe") Then '640bit system found. switch to 32-bit cscript ScriptEXE = OSFolder & "\SYSWOW64\Cscript.exe" End If '** if we have UAC escalated count will be 1, otherwise 0 on legacy machines ** '** force use of cscript so we get console display ** If Wscript.Arguments.Count < 2 Then strPath = Wscript.ScriptFullName strCommand = "%comspec% /k " & ScriptEXE & " //nologo """ & strPath & """" & " 1 2" Set objShell = CreateObject("Wscript.Shell") objShell.Run(strCommand), 1, True Wscript.Quit End If On Error Resume Next Err.Clear 'announce script Wscript.StdOut.WriteLine(RBSProvider & " - Prep For Restore (Catalog Cleanup) " & Version & VbCrLF) Wscript.StdOut.Write("Start: " & Now() & VbCrLF) 'prompt for using rbclient catalog or disk restore catalog If Workbench Then CatalogLocation = InputBox("Specify catalog. [D]iskRestore or [R]bclient: ","Default: DiskRestore", "") LargeCatalog = TRUE 'handle very large catalogs, one transaction at a time due to memory issues. Else 'running in default mode CatalogLocation = "R" End If If Ucase(CatalogLocation) = "R" Then 'let's lookup location of catalog in registry Err.clear 'Get catalog location from Registry Const HKEY_LOCAL_MACHINE = &H80000002 strComputer = "." strKeyPath = "SOFTWARE\Quantum Tech, Inc.\Remote Backup\Settings" strEntryName = "ClientDB" Set objReg = GetObject("winmgmts:" _ & "{impersonationLevel=impersonate}!\\" & strComputer & "\root\default:StdRegProv") status = objReg.GetStringValue( HKEY_LOCAL_MACHINE, strKeyPath, strEntryName, strValue) 'Sometimes security products block access to the registry. If so, lookup will fail. 'Give the user an opportunity to specify location of backup catalog manually rather than hard fail. If (status <> 0) or (Err.Number <> 0) Then strValue = InputBox("Unable to lookup database location in registry." & VbCrLf & "Please enter path below: ","Locate Backup Catalog", "C:\Program Files (x86)\Remote Backup") If Len(strValue) = 0 Then Wscript.StdOut.WriteLine("Cancelled. Script aborted." & VbCr) Wscript.Quit End If Err.Clear End If Database = strValue & "\" & "backup.mdb" '12/29/2013 - let's add in the BackupLocation field in case old catalog not updated ADDFIELD = "ALTER TABLE Catalog ADD Column BackupLocation Text(255) ;" 'open connection and update database structure SET objConnAlter = CreateObject("ADODB.Connection") objConnAlter.Open "Provider=MSDASQL; DRIVER={Microsoft Access Driver (*.mdb)};DBQ=" & DataBase & ";UID=admin;PWD= ;" objConnAlter.Execute ADDFIELD If err.number <> 0 Then 'Wscript.StdOut.Writeline("ALTER TABLE (BackupLocation) ERROR: " & err.number & " Message: " & err.description) err.clear Else Wscript.StdOut.Writeline("INFO: BackupLocation field added to Catalog.") objConnAlter.Close End If '12/30/2013 - let's add in the DependentFolder field in case old catalog not updated ADDFIELD = "ALTER TABLE Catalog ADD Column DependentFolder Text(255) ;" 'open connection and update database structure SET objConnAlter = CreateObject("ADODB.Connection") objConnAlter.Open "Provider=MSDASQL; DRIVER={Microsoft Access Driver (*.mdb)};DBQ=" & DataBase & ";UID=admin;PWD= ;" objConnAlter.Execute ADDFIELD If err.number <> 0 Then 'Wscript.StdOut.Writeline("ALTER TABLE (DependentFolder) ERROR: " & err.number & " Message: " & err.description) err.clear Else Wscript.StdOut.Writeline("INFO: DependentFolder field added to Catalog.") objConnAlter.Close End If '12/30/2013 - let's add in the DependentSN field in case old catalog not updated ADDFIELD = "ALTER TABLE Catalog ADD Column DependentSN Text(255) ;" 'open connection and update database structure SET objConnAlter = CreateObject("ADODB.Connection") objConnAlter.Open "Provider=MSDASQL; DRIVER={Microsoft Access Driver (*.mdb)};DBQ=" & DataBase & ";UID=admin;PWD= ;" objConnAlter.Execute ADDFIELD If err.number <> 0 Then 'Wscript.StdOut.Writeline("ALTER TABLE (DependentSN) ERROR: " & err.number & " Message: " & err.description) err.clear Else Wscript.StdOut.Writeline("INFO: DependentSN field added to Catalog.") objConnAlter.Close End If If WORKBENCH Then Wscript.Echo "Catalog from: " & "Remote backup client" End If If WORKBENCH Then Audit = InputBox("Pre-select Longfilenames for backup Y/[N] ? : ","Mark longfilenames", "") Else Audit = "N" End If If Ucase(Audit) = "Y" Then Wscript.Echo "Longfiles will be pre-selected for restore in catalog." PreselectLongfiles = TRUE End If 'if not preselecting long filenames, then prompt for mirror use - Audit last used for longfilename selection If Ucase(Audit) <> "Y" AND WORKBENCH Then Audit = InputBox("Add Local Mirror Bit to BackupLocation Y/[N] ? : ","Update backup location", "") If Ucase(Audit) = "Y" Then Wscript.Echo "Backuplocation (mirror) will be set for all cataloged files." UpdateBackupLocation = TRUE End If End If MirrorRoot = "" If WORKBENCH Then 'let's set the path for the mirror drive so we can do restore from archive with rbackup. MirrorRoot = InputBox("Archive location (optional): ","Archive folder checks", "") End If If Len(MirrorRoot) = 0 Then 'we'll skip for now If WORKBENCH THEN Wscript.StdOut.WriteLine("Archive registry setup skipped." & VbCr) End If Else 'verify mirrorroot exists - grab file object Set objFSO = CreateObject("Scripting.FileSystemObject") If objFSO.FolderExists(MirrorRoot) Then Wscript.Echo "Archive location found: " & MirrorRoot Else Wscript.Echo "Unable to locate archive root. Cannot continue." & "(" & MirrorRoot & ")" Wscript.Quit End If 'let's attempt to load up the registry with the LocalTransfer enable/location 'enable local transfer strComputer = "." Set objReg = GetObject("winmgmts:{impersonationLevel=impersonate}!\\" &_ strComputer & "\root\default:StdRegProv") strKeyPath = "SOFTWARE\Quantum Tech, Inc.\Remote Backup\Settings" strEntryName = "LocalTransfer" strEntryNameValue = "True" status = objReg.SetStringValue (HKEY_LOCAL_MACHINE,strKeyPath,strEntryName,strEntryNameValue) 'Sometimes security products block access to the registry. If so, this script won't update DFSver to 0 If (status <> 0) or (Err.Number <> 0) Then 'Cannot write key Wscript.StdOut.WriteLine("""" & "LocalTransfer" & """" & " = " & "") End If 'let's attempt to load up the registry with the LocalTransferPath 'enable local transfer path strComputer = "." Set objReg = GetObject("winmgmts:{impersonationLevel=impersonate}!\\" &_ strComputer & "\root\default:StdRegProv") strKeyPath = "SOFTWARE\Quantum Tech, Inc.\Remote Backup\Settings" strEntryName = "LocalTransferPath" strEntryNameValue = MirrorRoot status = objReg.SetStringValue (HKEY_LOCAL_MACHINE,strKeyPath,strEntryName,strEntryNameValue) 'Sometimes security products block access to the registry. If so, this script won't update DFSver to 0 If (status <> 0) or (Err.Number <> 0) Then 'Cannot write key Wscript.StdOut.WriteLine("""" & "LocalTransferRoot" & """" & " = " & "") End If End If Else 'default to using disk restore utility If WORKBENCH Then Wscript.Echo "Catalog from: " & "DiskRestore Utility" strValue = InputBox("DiskRestore temp location: ","Locate Backup Catalog", TEMPLOC) Database = strValue & "\" & "backup.mdb" End If End If 'announce catalog cation If Workbench Then Wscript.Echo "Catalog: " & Database End If 'if we have access to user data, we can do additional sanity checks. ask for it. If WORKBENCH Then If MirrorRoot = "" Then AccountRoot = InputBox("User data folder (optional): ","Data folder checks", MirrorRoot) Else AccountRoot = MirrorRoot End If Else AccountRoot = "" End If If Len(AccountRoot) = 0 Then 'we'll skip for now If WORKBENCH Then Wscript.StdOut.WriteLine("Data store integrity cleanup skipped." & VbCr) End If Else 'verify accountroot exists - grab file object Set objFSO = CreateObject("Scripting.FileSystemObject") If objFSO.FolderExists(AccountRoot) Then Wscript.Echo "Catalog integrity checked against: " & AccountRoot Else Wscript.Echo "Unable to locate Account root. Cannot continue." & "(" & AccountRoot & ")" Wscript.Quit End If End If CatalogCount = 0 'records processed, running count. If WORKBENCH Then Wscript.StdOut.Writeline("Note: " & "Filepaths exceeding " & WARNLONGFILE & " characters generate warning." & VbCrLf) End If 'Connect to the database Set conn = CreateObject("ADODB.Connection") strConnect = "Provider=MSDASQL; DRIVER={Microsoft Access Driver (*.mdb)};DBQ=" & DataBase & ";UID=admin;PWD=;" conn.Open strConnect 'Create recordset for backupset enumeration Set rsSetname = CreateObject ("ADODB.Recordset") strConnectSetname = "Provider=MSDASQL; DRIVER={Microsoft Access Driver (*.mdb)};DBQ=" & DataBase & ";UID=admin;PWD=;" rsSetname.ActiveConnection = strConnectSetname rsSetname.CursorLocation = 3 rsSetname.CursorType = 3 sqlSetname = "Select * from SETNAMES" rsSetname.open sqlSetname 'enumerate through all backup sets in catalog Do Until rsSetname.EOF 'create recordset for file processing Set rs = CreateObject ("ADODB.Recordset") 'put in advanced SQL query to handle long filenames AND backup location - .delete not included sqlStmt = "SELECT Catalog.ID, Catalog.DateStamp, Catalog.SetNameID, Catalog.Extension, " & _ "Catalog.File, Catalog.Restore, Catalog.Status, Catalog.Attributes, Catalog.Filename, " & _ "Catalog.StoreMethod, Catalog.StoreName, Catalog.LongPathID, Catalog.OrigSize, " & _ "Catalog.PrepSize, Catalog.TrfResult, Catalog.PrepResult, Catalog.Patch, " & _ "Catalog.FullPFolder, Catalog.BackupLocation, LongPaths.LongPath, IIf(IsNull([LongPath]),[Filename], " & _ "[LongPath]) AS OrigName, SetNames.Name AS SetName, Catalog.SubFolder, " & _ "Catalog.EncryptMethod, Catalog.Plugin, Catalog.ModifiedDate, Catalog.PatchName, " & _ "Catalog.DependentFolder FROM SetNames INNER JOIN (LongPaths RIGHT JOIN [Catalog] " & _ "ON LongPaths.PathID = Catalog.LongPathID) ON SetNames.ID = Catalog.SetNameID WHERE Setnames.ID =" & rsSetname("ID") & " ;" 'Wscript.Echo "sqlstmt=" & sqlstmt Err.Clear 'attempt to open the database as a recent catalog rs.open sqlStmt, conn, 3, 3 'Wscript.Echo "err.number, err.description = " & err.number & " " & err.description If Err.Number <> 0 Then If FirstPass = TRUE Then Wscript.Echo "WARN: Catalog format pre-11.7.0" FirstPass = False End If Err.Clear 'going to retry as just regular catalog - with longfilename support Set rs = CreateObject ("ADODB.Recordset") sqlStmt = "SELECT Catalog.ID, Catalog.DateStamp, Catalog.SetNameID, Catalog.Extension, " & _ "Catalog.File, Catalog.Restore, Catalog.Status, Catalog.Attributes, Catalog.Filename, " & _ "Catalog.StoreMethod, Catalog.StoreName, Catalog.LongPathID, Catalog.OrigSize, " & _ "Catalog.PrepSize, Catalog.TrfResult, Catalog.PrepResult, Catalog.Patch, " & _ "Catalog.FullPFolder, LongPaths.LongPath, IIf(IsNull([LongPath]),[Filename], " & _ "[LongPath]) AS OrigName, SetNames.Name AS SetName, Catalog.SubFolder, " & _ "Catalog.EncryptMethod, Catalog.Plugin, Catalog.ModifiedDate " & _ "FROM SetNames INNER JOIN (LongPaths RIGHT JOIN [Catalog] " & _ "ON LongPaths.PathID = Catalog.LongPathID) ON SetNames.ID = Catalog.SetNameID WHERE Setnames.ID =" & rsSetname("ID") & " ;" 'Open the catalog pre-11.7 catalog rs.open sqlStmt, conn, 3, 3 If Err.Number <> 0 Then Wscript.Echo "err.number, err.description = " & err.number & " " & err.description 'well...hopefully it's a very old catalog for that query to fail. Let's use the simplistic version. Err.Clear Set rs = CreateObject ("ADODB.Recordset") sqlStmt = "Select * FROM Catalog WHERE Catalog.SetNameID =" & rsSetname("ID") & " ;" NoLongFiles = TRUE 'set flag to indicate using old catalog style with nolongfilename support rs.open sqlStmt, conn, 3, 3 If Err.Number <> 0 Then Wscript.Echo "Catalog query failed. Cannot continue. Error: " & err.number & " Description: " & err.description Wscript.Quit Else Wscript.Echo "WARN: Legacy catalog. No longfilename support." End If End If End If 'keep running tally across all backupsets TotalRecords = TotalRecords + rs.recordcount 'Filesystem object so we can check if data exists on disk Set objFSO = CreateObject("Scripting.FileSystemObject") 'This is the main processing logic here. enumerate through and gather data and perform checks Do Until rs.EOF OR (CatalogCount > TotalRecords) 'grab filename from catalog record FullFilename = "" If IsBlank(Rs("Filename")) Then 'treat as longfilename if filename field is empty If NoLongFilenames = FALSE Then FullFilename = Rs("Longpath").Getchunk(512) LongFilenames = LongFileNames + 1 If WORKBENCH Then Wscript.StdOut.Writeline("LONGFILENAME: " & FullFilename & " (" & len(FullFilename) & ")" & VbCrLf) End IF If PreselectLongfiles = TRUE Then If LargeCatalog = True Then SetRestore rs("ID") Else rs("Restore") = True rs("BackupLocation") = "1100" rs.update End If End If Else If WORKBENCH Then Wscript.StdOut.Writeline("NULLFILENAME: " & "ID: " & Rs("id") & VbCrLf) End If End If Else 'standard filename FullFilename = Rs("Filename") 'bench restores of files > 253 characters require special handling. alert the user. If Len(FullFilename) > WARNLongFile Then If WORKBENCH Then Wscript.StdOut.Writeline("LONGFILENAMEWARN: " & FullFilename & " (" & len(FullFilename) & ") " & VbCrLf) End If If PreselectLongfiles = TRUE Then If LargeCatalog = TRUE Then SetRestore rs("ID") Else rs("Restore") = True rs("BackupLocation") = "1100" rs.update End If End If LongFileNames = LongFileNames + 1 End If End If 'Perform tests to determine if we need to remove record from catalog If IsBlank(rs("PrepResult")) OR _ IsBlank(rs("trfResult")) OR _ IsBlank(rs("SubFolder")) OR _ IsBlank(rs("PrepSize")) Then 'NULL data in catalog record. Not restorable. If WORKBENCH Then Wscript.StdOut.Writeline("NULLTRANSFER: " & " ID=" & rs("id") & " File:" & FullFilename & VbCrLf) End If If DeletePartialTransfer = TRUE Then If LargeCatalog = TRUE Then DeleteRecord rs("ID") Else Rs.Delete End If End If PartialFiles = PartialFiles + 1 'see if compress/encrypt and transfer were successful ElseIf rs("PrepResult") <> 0 OR rs("trfResult") <> 0 Then 'non-success status. Not restorable If WORKBENCH Then Wscript.StdOut.Writeline("PARTIALTRANSFER: " & " ID=" & rs("id") & " File:" & FullFilename & VbCrLf) End If If DeletePartialTransfer = TRUE Then If LargeCatalog = TRUE Then DeleteRecord rs("ID") Else Rs.Delete End If End If PartialFiles = PartialFiles + 1 Else 'entry in catalog is complete. let's do more testing 'test for plugins and ignore If NOT IsBlank(rs("Plugin")) Then 'this is a plugin catalog entry. ignore ' DO NOTHING ON PLUGIN ElseIf Len(AccountRoot) <> 0 Then 'We can do integrity checking against user's data folder for integrity 'first check if file exists in user's data folder If objFSO.FileExists(AccountRoot & "\" & SFPrep(rs("subfolder")) & rs("StoreName")) Then 'file is on server 'we can also now check to make sure its the size indicated in catalog Set objFile = objFSO.GetFile(AccountRoot & "\" & SFPrep(rs("subfolder")) & rs("StoreName")) Storesize = objFile.Size If StoreSize <> rs("PrepSize") Then 'File exists, but it is wrong size and cannot be decoded. delete from catalog If WorkBench Then Wscript.StdOut.Writeline("SIZEMISMATCH: " & "ID: " & rs("ID") & " Name: " & FullFilename) Wscript.StdOut.Writeline("BADSTORESIZE: " & "ID: " & rs("ID") & " Name: " & SFPrep(rs("subfolder")) & rs("Storename") & " PrepSize: " & rs("PrepSize") & " Store Size: " & StoreSize & VbCrLf & VbCrLf ) End If If DeleteWrongSize = TRUE Then If LargeCatalog = TRUE Then DeleteRecord rs("ID") Else Rs.Delete End If End If WrongSizeFiles = WrongSizeFiles + 1 Else 'Everything is normal for file in catalog. 'File is present and it is the right size. Should be restorable. End If Else 'Missing Data file detected. Will not be able to restore it. Delete record from catalog and log. If Workbench Then Wscript.StdOut.Writeline("NODATAFILE: " & "ID: " & rs("ID") & " Name: " & FullFilename) Wscript.StdOut.Writeline("MISSINGSTORE: " & SFPrep(rs("subfolder")) & rs("Storename") & VbCrLf & VbCrLf ) End If If DeleteMissing = TRUE Then If LargeCatalog = TRUE Then DeleteRecord rs("ID") Else Rs.Delete End If End If MissingFiles = MissingFiles + 1 End If 'Let's check backup location. If we want to use catalog in rbclient, then 'for fastest access, we need to enable use of mirror copy 'Wscript.Stdout.Writeline("BackupLocation=" & rs("BackupLocation")) If Rs("BackupLocation") = "1000" AND UpdateBackupLocation = TRUE Then If LargeCatalog = TRUE Then UpdateLocation rs("ID") Else Rs("BackupLocation") = "1100" Rs.Update End If End If 'Let's check to see if there are ? in the filenames. replace with _ so we can restore If Fullfilename <> replace(Fullfilename,"?","_") Then Illegalchars = Illegalchars + 1 Wscript.StdOut.Writeline("BADFILENAME: " & "ID: " & rs("ID") & " File:" & Fullfilename & VbCrLf ) If Len(Fullfilename) < 256 Then If LargeCatalog = TRUE Then CleanFilename rs("ID") Else rs("file") = replace(rs("file"),"?","_") rs("filename") = replace(rs("filename"),"?","_") rs.update End If Else BadLongFile = True 'longfilepath has illegal characters 'real fix here is to set flag & outside of loop, if flag set, cleanup the longfilepath table - for now, just advise user Wscript.Stdout.Writeline("BADLONGFILE: " & "ID: " & rs("ID") & " Fullfilename: " & Fullfilename & VbCrLf) End If End If End If End If CatalogCount = CatalogCount + 1 If (CatalogCount Mod 100) = 0 Then Wscript.StdOut.Write("Processing: " & CatalogCount & "/" & TotalRecords & VbCr) End If rs.MoveNext Loop rssetname.MoveNext Loop rs.close rssetname.close Wscript.StdOut.Write("Processing: " & CatalogCount & "/" & TotalRecords & VbCr) 'if there are illegal characters in a long filename, we need to clean these up since the actual filename 'is not stored in the catalog table If BadLongFile = True Then sqlStmt = "Select * from LongPaths;" rs.open sqlStmt, conn, 3, 3 Do Until rs.EOF If Instr(rs("LongPath"),"?") > 0 Then rs("LongPath") = Replace(rs("LongPath"),"?","_") rs.update End If rs.Movenext Loop End If 'done processing. wrap up and display stats. Wscript.StdOut.WriteLine("Processed: " & CatalogCount & "/" & TotalRecords & " " & VbCrLF) Wscript.StdOut.WriteLine("Summary of Findings:") Wscript.StdOut.Writeline("Partial File Transfers Detected: " & PartialFiles) If WORKBENCH Then Wscript.StdOut.Writeline("Missing Files Detected: " & MissingFiles) Wscript.StdOut.Writeline("Wrong Size Files Detected: " & WrongSizeFiles) Wscript.StdOut.Writeline("LongFilenames Detected: " & Longfilenames) Wscript.StdOut.Writeline("Non-standard Filenames Detected: " & Illegalchars) End If WScript.Quit Function SFPrep(subfolder) 'normalize the subfolder discrepencies in the catalog - if missing, make it "\" (null folder) '1. replace / with \ '2. if missing \ add it in '3. if missing / add it in If Len(subfolder) = 0 Then SFPrep = "\" Exit Function End If TempStr = Replace(subfolder, "/", "\") If left(tempstr,1) <> "\" Then tempstr = "\" & tempstr End If if right(tempstr,1) <> "\" Then tempstr = tempstr & "\" end If SFPrep = tempstr End Function Function IsBlank(value) 'simple test to determine if field is empty or null If Len((value) & " ") = 1 Then IsBlank = TRUE Else IsBlank = False End If End function Function NewOS() On Error Resume Next strComputer = "." OScaption = "" NewOS = False Set objWMIService = GetObject("winmgmts:\\" & strComputer & "\root\cimv2") Set colOperatingSystems = objWMIService.ExecQuery _ ("Select * from Win32_OperatingSystem") For Each objOperatingSystem in colOperatingSystems OScaption = objOperatingSystem.Caption Next If Instr(OScaption,"XP") > 0 OR _ Instr(OScaption, "2003") > 0 OR _ instr(OScaption, "2000") > 0 OR _ len(OScaption) = 0 Then NewOS = False Else NewOS = True End If Exit Function End Function Sub DeleteRecord(ID) 'Delete a single database record SqlTransaction = "SELECT * FROM CATALOG WHERE ID=" & ID Set rsTransaction = CreateObject("ADODB.Recordset") rsTransaction.open SqlTransaction, conn, 3, 3 'If no records, print error, otherwise perform transaciton 'for now, let's just do deletes to test If rsTransaction.EOF <> True Then rsTransaction.delete Else Wscript.Echo "delete error on ID = " & ID End If rsTransaction.close rsTransaction = nothing End Sub Sub UpdateLocation(ID) 'Update backuplocation in database to permit mirror and cloud restore SqlTransaction = "SELECT * FROM CATALOG WHERE ID=" & ID Set rsTransaction = CreateObject("ADODB.Recordset") rsTransaction.open SqlTransaction, conn, 3, 3 'If no records, print error, otherwise perform transaciton 'for now, let's just do deletes to test If rsTransaction.EOF <> True Then rsTransaction("BackupLocation") = "1100" rsTransaction.Update Else Wscript.Echo "update error on ID = " & ID End If rsTransaction.close rsTransaction = nothing End Sub Sub SetRestore(ID) 'Update restore (and backuplocation) in database to preselect large files for backup SqlTransaction = "SELECT * FROM CATALOG WHERE ID=" & ID Set rsTransaction = CreateObject("ADODB.Recordset") rsTransaction.open SqlTransaction, conn, 3, 3 'If no records, print error, otherwise perform transaciton 'for now, let's just do deletes to test If rsTransaction.EOF <> True Then rsTransaction("Restore") = TRUE rsTransaction("BackupLocation") = "1100" rsTransaction.Update Else Wscript.Echo "update error on ID = " & ID End If rsTransaction.close rsTransaction = nothing End Sub Sub CleanFilename(ID) 'Update filename and file in database to get rid of ? characters SqlTransaction = "SELECT * FROM CATALOG WHERE ID=" & ID Set rsTransaction = CreateObject("ADODB.Recordset") rsTransaction.open SqlTransaction, conn, 3, 3 'If no records, print error, otherwise perform transaciton 'for now, let's just do deletes to test If rsTransaction.EOF <> True Then rsTransaction("file") = replace(rsTransaction("file"),"?","_") rsTransaction("filename") = replace(rsTransaction("filename"),"?","_") rsTransaction.update Else Wscript.Echo "update filename error on ID = " & ID End If rsTransaction.close rsTransaction = nothing End Sub '' SIG '' Begin signature block '' SIG '' MIIYsQYJKoZIhvcNAQcCoIIYojCCGJ4CAQExCzAJBgUr '' SIG '' DgMCGgUAMGcGCisGAQQBgjcCAQSgWTBXMDIGCisGAQQB '' SIG '' gjcCAR4wJAIBAQQQTvApFpkntU2P5azhDxfrqwIBAAIB '' SIG '' AAIBAAIBAAIBADAhMAkGBSsOAwIaBQAEFLXbPq995gar '' SIG '' 4vTXiGohJppfcddooIITVTCCBIQwggNsoAMCAQICEEIa '' SIG '' 8pQJhBkfUgpLxiQmp0swDQYJKoZIhvcNAQEFBQAwbzEL '' SIG '' MAkGA1UEBhMCU0UxFDASBgNVBAoTC0FkZFRydXN0IEFC '' SIG '' MSYwJAYDVQQLEx1BZGRUcnVzdCBFeHRlcm5hbCBUVFAg '' SIG '' TmV0d29yazEiMCAGA1UEAxMZQWRkVHJ1c3QgRXh0ZXJu '' SIG '' YWwgQ0EgUm9vdDAeFw0wNTA2MDcwODA5MTBaFw0yMDA1 '' SIG '' MzAxMDQ4MzhaMIGVMQswCQYDVQQGEwJVUzELMAkGA1UE '' SIG '' CBMCVVQxFzAVBgNVBAcTDlNhbHQgTGFrZSBDaXR5MR4w '' SIG '' HAYDVQQKExVUaGUgVVNFUlRSVVNUIE5ldHdvcmsxITAf '' SIG '' BgNVBAsTGGh0dHA6Ly93d3cudXNlcnRydXN0LmNvbTEd '' SIG '' MBsGA1UEAxMUVVROLVVTRVJGaXJzdC1PYmplY3QwggEi '' SIG '' MA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDOqoE/ '' SIG '' o6NheKoxAFWVEZ4nDx8c3zqbgmgwwEphHfEvDvq+efel '' SIG '' I+9VUZaEzdvjuW4+MdgKIGfH9Nm/lOtHBD4CziqiXYcE '' SIG '' CfYwnRiKl7KqHPxB0qE2y/s9kbrn2XA1+uTnkMObo5vT '' SIG '' PPUSmXextwngaOYcuPOUY4hqav4Ldsm+9CLkZ7mrGl53 '' SIG '' wYUH3Q1sv+4Gx3dqQZ6nD9f77pQXt/yFvqSrxBwx3de2 '' SIG '' 0eTw798Wj7JSk9eh1ImhBy6/4QESQh4a4diVNNtkeSj/ '' SIG '' ui4RwuXoW5JI+0cLwmzarTKDQfOl5UFw/WWQbfr6UcT5 '' SIG '' vZYrGQQs022n3PB/b4Nl4mqrh4Z1AgMBAAGjgfQwgfEw '' SIG '' HwYDVR0jBBgwFoAUrb2YejS0Jvf6xCZU7wO94CTLVBow '' SIG '' HQYDVR0OBBYEFNrtZHQUnBQ8q92Zqb1bKE2LPMnYMA4G '' SIG '' A1UdDwEB/wQEAwIBBjAPBgNVHRMBAf8EBTADAQH/MBEG '' SIG '' A1UdIAQKMAgwBgYEVR0gADBEBgNVHR8EPTA7MDmgN6A1 '' SIG '' hjNodHRwOi8vY3JsLnVzZXJ0cnVzdC5jb20vQWRkVHJ1 '' SIG '' c3RFeHRlcm5hbENBUm9vdC5jcmwwNQYIKwYBBQUHAQEE '' SIG '' KTAnMCUGCCsGAQUFBzABhhlodHRwOi8vb2NzcC51c2Vy '' SIG '' dHJ1c3QuY29tMA0GCSqGSIb3DQEBBQUAA4IBAQBNQi+m '' SIG '' wYrrB4CQWEaM+Bk5Zio8Wixtz9TZh1WNeQsSiHtAj9XH '' SIG '' +EuNVRZjrbdX3DsrvdPBTx4Dh0tEm+PiQEUm8yZJK2qE '' SIG '' 8VR61ELa/NNqu2Z+yp7q6bvcB8fDkk6DPIFJn5LVMgnq '' SIG '' SS6hEXGaNtLFTmi2yw4bJRavbN5ddtgfcrGTJoYX2xje '' SIG '' r0Xp3/uYrxQY7aRe9omURfBVBErd/yfdBkpA9rS88eQP '' SIG '' mQK7/V0OLijBvjtfGj+XEIS8Fj7Yo5xjHWbLXF/aPvMP '' SIG '' Cgk1ItvbwD8A+eYNXWfR/aAeAyvZQPe+zIdmVICmo7j1 '' SIG '' GWLV0iaxmCbumstEp0VagZUVGvVRMIIEkzCCA3ugAwIB '' SIG '' AgIQR4qO+1nh2D8M4ULSoocHvjANBgkqhkiG9w0BAQUF '' SIG '' ADCBlTELMAkGA1UEBhMCVVMxCzAJBgNVBAgTAlVUMRcw '' SIG '' FQYDVQQHEw5TYWx0IExha2UgQ2l0eTEeMBwGA1UEChMV '' SIG '' VGhlIFVTRVJUUlVTVCBOZXR3b3JrMSEwHwYDVQQLExho '' SIG '' dHRwOi8vd3d3LnVzZXJ0cnVzdC5jb20xHTAbBgNVBAMT '' SIG '' FFVUTi1VU0VSRmlyc3QtT2JqZWN0MB4XDTEwMDUxMDAw '' SIG '' MDAwMFoXDTE1MDUxMDIzNTk1OVowfjELMAkGA1UEBhMC '' SIG '' R0IxGzAZBgNVBAgTEkdyZWF0ZXIgTWFuY2hlc3RlcjEQ '' SIG '' MA4GA1UEBxMHU2FsZm9yZDEaMBgGA1UEChMRQ09NT0RP '' SIG '' IENBIExpbWl0ZWQxJDAiBgNVBAMTG0NPTU9ETyBUaW1l '' SIG '' IFN0YW1waW5nIFNpZ25lcjCCASIwDQYJKoZIhvcNAQEB '' SIG '' BQADggEPADCCAQoCggEBALw1oDZwIoERw7KDudMoxjbN '' SIG '' JWupe7Ic9ptRnO819O0Ijl44CPh3PApC4PNw3KPXyvVM '' SIG '' C8//IpwKfmjWCaIqhHumnbSpwTPi7x8XSMo6zUbmxap3 '' SIG '' veN3mvpHU0AoWUOT8aSB6u+AtU+nCM66brzKdgyXZFmG '' SIG '' JLs9gpCoVbGS06CnBayfUyUIEEeZzZjeaOW0UHijrwHM '' SIG '' WUNY5HZufqzH4p4fT7BHLcgMo0kngHWMuwaRZQ+Qm/S6 '' SIG '' 0YHIXGrsFOklCb8jFvSVRkBAIbuDlv2GH3rIDRCOovgZ '' SIG '' B1h/n703AmDypOmdRD8wBeSncJlRmugX8VXKsmGJZUan '' SIG '' avJYRn6qoAcCAwEAAaOB9DCB8TAfBgNVHSMEGDAWgBTa '' SIG '' 7WR0FJwUPKvdmam9WyhNizzJ2DAdBgNVHQ4EFgQULi2w '' SIG '' CkRK04fAAgfOl31QYiD9D4MwDgYDVR0PAQH/BAQDAgbA '' SIG '' MAwGA1UdEwEB/wQCMAAwFgYDVR0lAQH/BAwwCgYIKwYB '' SIG '' BQUHAwgwQgYDVR0fBDswOTA3oDWgM4YxaHR0cDovL2Ny '' SIG '' bC51c2VydHJ1c3QuY29tL1VUTi1VU0VSRmlyc3QtT2Jq '' SIG '' ZWN0LmNybDA1BggrBgEFBQcBAQQpMCcwJQYIKwYBBQUH '' SIG '' MAGGGWh0dHA6Ly9vY3NwLnVzZXJ0cnVzdC5jb20wDQYJ '' SIG '' KoZIhvcNAQEFBQADggEBAMj7Y/gLdXUsOvHyE6cttqMa '' SIG '' nK0BB9M0jnfgwm6uAl1IT6TSIbY2/So1Q3xr34CHCxXw '' SIG '' djIAtM61Z6QvLyAbnFSegz8fXxSVYoIPIkEiH3Cz8/dC '' SIG '' 3mxRzUv4IaybO4yx5eYoj84qivmqUk2MW3e6TVpY27tq '' SIG '' BMxSHp3iKDcOu+cOkcf42/GBmOvNN7MOq2XTYuw6pXbr '' SIG '' E6g1k8kuCgHswOjMPX626+LB7NMUkoJmh1Dc/VCXrLNK '' SIG '' dnMGxIYROrNfQwRSb+qz0HQ2TMrxG3mEN3BjrXS5qg7z '' SIG '' mLCGCOvb4B+MEPI5ZJuuTwoskopPGLWR5Y0ak18frvGm '' SIG '' 8C6X0NL2KzwwggTnMIIDz6ADAgECAhAQcJ1P9VQI1zBg '' SIG '' AdjqkXW7MA0GCSqGSIb3DQEBBQUAMIGVMQswCQYDVQQG '' SIG '' EwJVUzELMAkGA1UECBMCVVQxFzAVBgNVBAcTDlNhbHQg '' SIG '' TGFrZSBDaXR5MR4wHAYDVQQKExVUaGUgVVNFUlRSVVNU '' SIG '' IE5ldHdvcmsxITAfBgNVBAsTGGh0dHA6Ly93d3cudXNl '' SIG '' cnRydXN0LmNvbTEdMBsGA1UEAxMUVVROLVVTRVJGaXJz '' SIG '' dC1PYmplY3QwHhcNMTEwODI0MDAwMDAwWhcNMjAwNTMw '' SIG '' MTA0ODM4WjB7MQswCQYDVQQGEwJHQjEbMBkGA1UECBMS '' SIG '' R3JlYXRlciBNYW5jaGVzdGVyMRAwDgYDVQQHEwdTYWxm '' SIG '' b3JkMRowGAYDVQQKExFDT01PRE8gQ0EgTGltaXRlZDEh '' SIG '' MB8GA1UEAxMYQ09NT0RPIENvZGUgU2lnbmluZyBDQSAy '' SIG '' MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA '' SIG '' y/jnp+jxlyhAaIA30sg/jpKKkjeHR4DqTJnPbvkVR73u '' SIG '' dfRErNDD1E33GcDTPE3BR7lZZRaTjNkKhJuf6PZqY1j+ '' SIG '' X9zRf0tRnwAcAIdUIAdXoILJL5ivM4q7e4AiJWpsr8Is '' SIG '' bHkTvaMqSNa1jmFV6WvoPYC/FAOFGI5+TOnCGYhzknLN '' SIG '' +v9QTcsspnsac7EAkCzZMuL7/ayVQjbsNMUTU2iywZ9A '' SIG '' n9p7yJ1ibJOiQtd5n5dPMVtQIaGrr9kcss51vlssVgAk '' SIG '' jRHBdR/w/tKV/vDhMSMYZ8BbE/1amJSU//9ZAh8ArObx '' SIG '' 8vo6c7MdQvxUdc9RMS/j24HZdyMqT1nOIwIDAQABo4IB '' SIG '' SjCCAUYwHwYDVR0jBBgwFoAU2u1kdBScFDyr3ZmpvVso '' SIG '' TYs8ydgwHQYDVR0OBBYEFB7FsSx9h9oCaHwlvAwHhD+2 '' SIG '' z97xMA4GA1UdDwEB/wQEAwIBBjASBgNVHRMBAf8ECDAG '' SIG '' AQH/AgEAMBMGA1UdJQQMMAoGCCsGAQUFBwMDMBEGA1Ud '' SIG '' IAQKMAgwBgYEVR0gADBCBgNVHR8EOzA5MDegNaAzhjFo '' SIG '' dHRwOi8vY3JsLnVzZXJ0cnVzdC5jb20vVVROLVVTRVJG '' SIG '' aXJzdC1PYmplY3QuY3JsMHQGCCsGAQUFBwEBBGgwZjA9 '' SIG '' BggrBgEFBQcwAoYxaHR0cDovL2NydC51c2VydHJ1c3Qu '' SIG '' Y29tL1VUTkFkZFRydXN0T2JqZWN0X0NBLmNydDAlBggr '' SIG '' BgEFBQcwAYYZaHR0cDovL29jc3AudXNlcnRydXN0LmNv '' SIG '' bTANBgkqhkiG9w0BAQUFAAOCAQEAlYl3k2gBXnzZLTcH '' SIG '' kF1aQl4MZLQ2tQ/2q9U5J94iRqRJHGZLRhlZLnlJA/ac '' SIG '' kt9tUDVcDJEuYANZ0PFk92kJ9n7+6zSzbbG/ZpyjujF4 '' SIG '' uYc1YT2SMRvv9Oie1qxF+gw2PIBnu73vLsKQ4T1xLzvB '' SIG '' sFh+RcNScQMH9vM5TYs2IRsB39naXivrDpeAHkQcUIj1 '' SIG '' xhIzSqhNpY0vlAx7xr+aLMMyzb2MJybw4TADUAaCvPQ7 '' SIG '' s4N1Bsbvuu7TgPhSxqzLefI4nnuwklhCkQXIliGtuUsW '' SIG '' gRRp8Tew/jT33LDfl/VDEJt2j7Rl9eifE7cerG/EaYpf '' SIG '' ujxhfl5JhiMTLq8VSDCCBUcwggQvoAMCAQICEBmLWs2p '' SIG '' p0+2waAewzvLePwwDQYJKoZIhvcNAQEFBQAwezELMAkG '' SIG '' A1UEBhMCR0IxGzAZBgNVBAgTEkdyZWF0ZXIgTWFuY2hl '' SIG '' c3RlcjEQMA4GA1UEBxMHU2FsZm9yZDEaMBgGA1UEChMR '' SIG '' Q09NT0RPIENBIExpbWl0ZWQxITAfBgNVBAMTGENPTU9E '' SIG '' TyBDb2RlIFNpZ25pbmcgQ0EgMjAeFw0xMjA1MjQwMDAw '' SIG '' MDBaFw0xNDA1MjQyMzU5NTlaMIGVMQswCQYDVQQGEwJV '' SIG '' UzEOMAwGA1UEEQwFMjA3MjMxCzAJBgNVBAgMAk1EMQ8w '' SIG '' DQYDVQQHDAZMYXVyZWwxHjAcBgNVBAkMFTg0MDUgQ2hl '' SIG '' cnJ5IExhdXJlbCBDdDEbMBkGA1UECgwSRG9jdG9yIEJh '' SIG '' Y2t1cCwgTExDMRswGQYDVQQDDBJEb2N0b3IgQmFja3Vw '' SIG '' LCBMTEMwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEK '' SIG '' AoIBAQC7J3zXlZApvLom5lGqSD+X5hjJFPtV/u7567uI '' SIG '' gbsybSHas6alSeQEZ1nSwb+6tSY+c6E4QrjCAOkwBovw '' SIG '' 3P5ACiihkwDS1UfDf1E7SgDtIN63mRCaQKTU6+HQT+Xq '' SIG '' mrA/GR0gMIRCmwYGzaM8sk1K6ZGUBvney5DW9zOWNVRM '' SIG '' /NKhugmqpQJ5fGcKUe5/YlSF1Y1DWQ1T6EW1PNSnR34I '' SIG '' mX88S+NiGQWfs3EZXhEl3FozQ04ATVXjrMVnlkdMAPzp '' SIG '' CYL73wJPG2EJs/nRY+h8U0vf2bmK4BgAr+TsnQFVSv8k '' SIG '' tHPwMSsqBfYjy8I3drE7dLW/W+M09P5A6x7XcLyHAgMB '' SIG '' AAGjggGqMIIBpjAfBgNVHSMEGDAWgBQexbEsfYfaAmh8 '' SIG '' JbwMB4Q/ts/e8TAdBgNVHQ4EFgQUf1PPfVV4Vx/+02AE '' SIG '' 0U13SRLeMXAwDgYDVR0PAQH/BAQDAgeAMAwGA1UdEwEB '' SIG '' /wQCMAAwEwYDVR0lBAwwCgYIKwYBBQUHAwMwEQYJYIZI '' SIG '' AYb4QgEBBAQDAgQQMEYGA1UdIAQ/MD0wOwYMKwYBBAGy '' SIG '' MQECAQMCMCswKQYIKwYBBQUHAgEWHWh0dHBzOi8vc2Vj '' SIG '' dXJlLmNvbW9kby5uZXQvQ1BTMEEGA1UdHwQ6MDgwNqA0 '' SIG '' oDKGMGh0dHA6Ly9jcmwuY29tb2RvY2EuY29tL0NPTU9E '' SIG '' T0NvZGVTaWduaW5nQ0EyLmNybDByBggrBgEFBQcBAQRm '' SIG '' MGQwPAYIKwYBBQUHMAKGMGh0dHA6Ly9jcnQuY29tb2Rv '' SIG '' Y2EuY29tL0NPTU9ET0NvZGVTaWduaW5nQ0EyLmNydDAk '' SIG '' BggrBgEFBQcwAYYYaHR0cDovL29jc3AuY29tb2RvY2Eu '' SIG '' Y29tMB8GA1UdEQQYMBaBFHN1cHBvcnRAZHJiYWNrdXAu '' SIG '' bmV0MA0GCSqGSIb3DQEBBQUAA4IBAQBmxIgS3RHockr5 '' SIG '' OPAcqmniK9N05oeSvsJS+GyUzUQs0FKPcwv5884Yl6c+ '' SIG '' O2cuk8TjOiMqMVRtzWAKsbKNpchnTjSyaDVcl5OHpa4s '' SIG '' zWZMDc17qTUtHqQQXXWOuNEbD86fiA3ocbfndM5Jhxa/ '' SIG '' tr7kZfYDKsZNcLsQs0oYnkvyKPZ/nuyrFvEzeTskhqaS '' SIG '' C+zU4Znxavof+qyl80zSF/OT7FPqsVsAMSaUSL6/qxeo '' SIG '' 5ka+mhoBLNR6YBA3WnFhVGy1v6YglFX9B5RPqndpS4AO '' SIG '' 1HJODZlf5e3lRmNvwzPDYr1nQW0E336PD9QNqSw3Aiv0 '' SIG '' AJEeyDVnSVMwsG3GGJxfMYIEyDCCBMQCAQEwgY8wezEL '' SIG '' MAkGA1UEBhMCR0IxGzAZBgNVBAgTEkdyZWF0ZXIgTWFu '' SIG '' Y2hlc3RlcjEQMA4GA1UEBxMHU2FsZm9yZDEaMBgGA1UE '' SIG '' ChMRQ09NT0RPIENBIExpbWl0ZWQxITAfBgNVBAMTGENP '' SIG '' TU9ETyBDb2RlIFNpZ25pbmcgQ0EgMgIQGYtazamnT7bB '' SIG '' oB7DO8t4/DAJBgUrDgMCGgUAoIHGMBkGCSqGSIb3DQEJ '' SIG '' AzEMBgorBgEEAYI3AgEEMBwGCisGAQQBgjcCAQsxDjAM '' SIG '' BgorBgEEAYI3AgEVMCMGCSqGSIb3DQEJBDEWBBSJbQlD '' SIG '' 3bn+dhO5Ayh5JdyF1iHxXDBmBgorBgEEAYI3AgEMMVgw '' SIG '' VqA4gDYAUAByAGUAcABhAHIAZQAgAEMAYQB0AGEAbABv '' SIG '' AGcAIABmAG8AcgAgAFIAZQBzAHQAbwByAGWhGoAYaHR0 '' SIG '' cDovL3d3dy5kcmJhY2t1cC5uZXQgMA0GCSqGSIb3DQEB '' SIG '' AQUABIIBAGBGV/yc+buLFCDND4ljHogCCe0rA72KTx9i '' SIG '' 3baNCl/Hp5FvRSV3crJ//oM7kyECs3Bywv/pjMkrxk3V '' SIG '' w0T3v4BctYHK9TivJXqATUkgb7kD3HqHaOK6WlIV3FNl '' SIG '' +wD7gMxlNkkDPVY/xDyzhRd84Ezgut2hRRe7Z7tulPNu '' SIG '' OxJRbJx/ZU7vUBrJvUMyYvXZSQ/kWtHx6K74iEh/5aZ5 '' SIG '' tx8ITUHDsclJKvssCVKr9mjfEAmmqk5ehqer9ry+USCy '' SIG '' p1/ShQ7MAEME5wLG17minpg8r8LQD/XvbukfM/EBgxlz '' SIG '' UH8NGel3pqXF5Kkb5uD89VlNp0ETUFpU6j+glljgGxCh '' SIG '' ggJEMIICQAYJKoZIhvcNAQkGMYICMTCCAi0CAQAwgaow '' SIG '' gZUxCzAJBgNVBAYTAlVTMQswCQYDVQQIEwJVVDEXMBUG '' SIG '' A1UEBxMOU2FsdCBMYWtlIENpdHkxHjAcBgNVBAoTFVRo '' SIG '' ZSBVU0VSVFJVU1QgTmV0d29yazEhMB8GA1UECxMYaHR0 '' SIG '' cDovL3d3dy51c2VydHJ1c3QuY29tMR0wGwYDVQQDExRV '' SIG '' VE4tVVNFUkZpcnN0LU9iamVjdAIQR4qO+1nh2D8M4ULS '' SIG '' oocHvjAJBgUrDgMCGgUAoF0wGAYJKoZIhvcNAQkDMQsG '' SIG '' CSqGSIb3DQEHATAcBgkqhkiG9w0BCQUxDxcNMTQwNDI1 '' SIG '' MTYyMzI2WjAjBgkqhkiG9w0BCQQxFgQUyIk9dTTrzplk '' SIG '' AZhZfs1yj8Q6QlIwDQYJKoZIhvcNAQEBBQAEggEAV6jH '' SIG '' SUNjlWbykSELP0Nr8Y1lDDWdOlTgwT1YNS6x4Nl3Z/xs '' SIG '' cO363GuTzxnDfO+R5aDK8p3k/NGmwkdqpsoFITeo9/Be '' SIG '' ed4bbRIdysfAP1G8F5oyowbjdLIlpkXYjR5GSnF262Lj '' SIG '' yFyVNbg8VUspp9gFUTUtlBozGMl5bBKfQmWlJSGILp62 '' SIG '' Iajx9amKIxVOOItUIqKqp5GE5JWr/8pHXYyiKYesC/ez '' SIG '' EvfVbaN5bO+uydeU4IuC5WcjmL4wGjVxwTJhfaDSZnWP '' SIG '' sPHfOnjRStqndfwm9fhn7tuedwpWhN4HyAObFp/n7nRM '' SIG '' 7wgq2IF7bSsl0VN/AnJ4zw5TTQZYNw== '' SIG '' End signature block