<# .SYNOPSIS Installs, updates, patches or uninstalls YADE on Windows and Unix platforms supporting PowerShell 5.1, 6, 7 .DESCRIPTION The YADE Installation Script can be used to automate installing, updating, patching and uninstalling YADE. The script offers the installation options available from the YADE's graphical installer. For download see https://kb.sos-berlin.com/display/JS7/JS7+-+Download .PARAMETER HomeDir Specifies the directory in which the YADE should be installed. .PARAMETER Data Specifies the directory in which YADE data such as configuration files should be stored. By default the /var directory is used, see -HomeDir and -HttpPort parameters. .PARAMETER Logs Specifies the directory to which the YADE stores log files. By default the /logs directory is used, see -Data parameter. .PARAMETER Release Specifies a release number of the JS7 YADE such as 2.3.1 to be used. The release will be downloaded from the SOS web site if the -Tarball parameter is not used. .PARAMETER Tarball Optionally specifies the path to a .zip or .tar.gz file that holds the YADE installation files. If this parameter is not used the installer tarball will be downloaded from the SOS web site for the release indicated with the -Release parameter. Users can check if the connection to a specific URL is bypassed or is using a proxy with a command such as: ([System.Net.WebRequest]::GetSystemWebproxy()).IsBypassed("https://download.sos-berlin.com") For use with PowerShell 7 users can specify environment variables to perform download using a proxy: * HTTP_PROXY - proxy for HTTP requests * HTTPS_PROXY - proxy for HTTPS requests * ALL_PROXY - proxy for both HTTP and HTTPS * NO_PROXY - proxy exclusion address list .PARAMETER Patch A patch is identified by an issue key and a specific release in the SOS Change Management System. For example the -Patch YADE-1984 -Release 2.8.0 parameters will download an (empty) sample patch from the SOS web site: For Unix and Windows the download file is https://download.sos-berlin.com/patches/2.8.0-patch/js7_yade.2.8.0-PATCH.YADE-1984.tar.gz Patches can be individually downloaded and can be made available from the -Tarball parameter. For example the -Patch YADE-1984 -Tarball /tmp/js7_yade.2.8.0-PATCH.YADE-1984.tar.gz parameters will apply the patch from the downloaded file. Patches are added to the YADE's /lib/patches directory. Note that patches will be removed when updating the YADE installation later on. .PARAMETER PatchJar Opetionally specifies the path to a .jar file that holds a patch. The patch .jar file has to be downloaded individually and will be copied to the YADE's /lib/patches directory. .PARAMETER BackupDir If a backup directory is specified then the YADE's existing home and data directories will be added to backup files in this directory. The backup file type is .tar.gz for Unix and Windows. File names are created according to the pattern: * backup_js7_yade...home.--
T--.tar.gz|.tar.gz * backup_js7_yade...data.--
T--.tar.gz|.tar.gz For example: backup_js7_yade.centostest_primary.2.3.1.home.2022-03-19T20-50-45.tar.gz .PARAMETER LogDir If a log directory is specified then the Installation Script will log information about processing steps to a log file in this directory. File names are created according to the pattern: install_js7_yaee..--
T--.log For example: install_js7_yade.centostest_primary.2025-05-19T20-50-45.log .PARAMETER ReturnValues Optionally specifies the path to a file to which return values will be added in the format =. For example: log_file=install_js7_yade.centostest_primary.2025-05-20T04-54-31.log backup_file=backup_js7_yade.centostest_primary.2.8.0.2025-05-20T04-54-31.tar.gz An existing file will be overwritten. It is recommended to use a unique file name such as /tmp/return.$PID.properties. A value from the file can be retrieved like this: * Unix ** backup=$(cat /tmp/return.$$.properties | grep "backup_file" | cut -d'=' -f2) * Windows ** $backup = ( Get-Content /tmp/return.$PID.properties | Select-String "^backup_file[ ]*=[ ]*(.*)" ).Matches.Groups[1].value .PARAMETER Uninstall Uninstalls the YADE by removing the and directories. .PARAMETER UninstallHome Uninstalls the YADE but preservers the YADE's directory. .PARAMETER UninstallData Uninstalls the YADE but preservers the YADE's directory. .PARAMETER ShowLogs Displays the log output created by the Installation Script if the -LogDir parameter is used. .PARAMETER MakeDirs If directories are missing that are indicated with the -HomeDir, -BackupDir or -LogDir parameters then they will be created. .PARAMETER MoveLibs For an existing YADE installation the lib sub-directory includes .jar files that carry the release number in their file names. If replaced by a newer version the lib directory has to be moved or removed. This switch tries to move the directory to a previous version number as indicated from the .version file in the YADE's home directory, for example to rename lib to lib.2.8.0. Files in the lib/user_lib sub-directory are preserved. .EXAMPLE Install-JS7YADE.ps1 -HomeDir "C:\Program Files\sos-berlin.com\js7\yade" -Data "C:\ProgramData\sos-berlin.com\js7\yade" -Release 2.8.0 4445 -MakeDirs Downloads and installs the YADE release to the indicated location. .EXAMPLE Install-JS7YADE.ps1 -HomeDir "C:\Program Files\sos-berlin.com\js7\yade" -Data "C:\ProgramData\sos-berlin.com\js7\yade" -Tarball /tmp/js7_yade_windows.2.8.0.zip -BackupDir /tmp/backups -LogDir /tmp/logs -MakeDirs Applies the YADE release from a tarball and installs to the indicated locations. A backup is taken and log files are created. #> [cmdletbinding(SupportsShouldProcess)] param ( [Parameter(Mandatory=$True,ValueFromPipeline=$False,ValueFromPipelinebyPropertyName=$True)] [string] $HomeDir, [Parameter(Mandatory=$False,ValueFromPipeline=$False,ValueFromPipelinebyPropertyName=$True)] [string] $Data, [Parameter(Mandatory=$False,ValueFromPipeline=$False,ValueFromPipelinebyPropertyName=$True)] [string] $Logs, [Parameter(Mandatory=$False,ValueFromPipeline=$False,ValueFromPipelinebyPropertyName=$True)] [string] $Release, [Parameter(Mandatory=$False,ValueFromPipeline=$False,ValueFromPipelinebyPropertyName=$True)] [string] $Tarball, [Parameter(Mandatory=$False,ValueFromPipeline=$False,ValueFromPipelinebyPropertyName=$True)] [string] $Patch, [Parameter(Mandatory=$False,ValueFromPipeline=$False,ValueFromPipelinebyPropertyName=$True)] [string] $PatchJar, [Parameter(Mandatory=$False,ValueFromPipeline=$False,ValueFromPipelinebyPropertyName=$True)] [string] $BackupDir, [Parameter(Mandatory=$False,ValueFromPipeline=$False,ValueFromPipelinebyPropertyName=$True)] [string] $LogDir, [Parameter(Mandatory=$False,ValueFromPipeline=$False,ValueFromPipelinebyPropertyName=$True)] [string] $ReturnValues, [Parameter(Mandatory=$False,ValueFromPipeline=$False,ValueFromPipelinebyPropertyName=$True)] [switch] $Uninstall, [Parameter(Mandatory=$False,ValueFromPipeline=$False,ValueFromPipelinebyPropertyName=$True)] [switch] $UninstallHome, [Parameter(Mandatory=$False,ValueFromPipeline=$False,ValueFromPipelinebyPropertyName=$True)] [switch] $UninstallData, [Parameter(Mandatory=$False,ValueFromPipeline=$False,ValueFromPipelinebyPropertyName=$True)] [switch] $ShowLogs, [Parameter(Mandatory=$False,ValueFromPipeline=$False,ValueFromPipelinebyPropertyName=$True)] [switch] $MakeDirs, [Parameter(Mandatory=$False,ValueFromPipeline=$False,ValueFromPipelinebyPropertyName=$True)] [switch] $MoveLibs ) Begin { switch ([System.Environment]::OSVersion.Platform) { 'Win32NT' { New-Variable -Option Constant -Name IsWindows -Value $True -ErrorAction SilentlyContinue New-Variable -Option Constant -Name IsLinux -Value $false -ErrorAction SilentlyContinue New-Variable -Option Constant -Name IsMacOs -Value $false -ErrorAction SilentlyContinue } } if ( $Uninstall ) { $script:UninstallHome = $Uninstall $script:UninstallData = $Uninstall } elseif ( $UninstallHome -or $UninstallData ) { $script:Uninstall = $true } # nop operations to work around ScriptAnalyzer bugs $script:ReturnValues = $ReturnValues $script:ShowLogs = $ShowLogs # default variables $script:hostname = if ( $env:COMPUTERNAME ) { $env:COMPUTERNAME } else { $env:HOSTNAME } $script:startTime = Get-Date $script:logFile = $null if ( $isWindows ) { $script:osPlatform = 'windows' } else { $script:osPlatform = 'unix' } } Process { # inline functions function Out-LogInfo( [string] $Message ) { if ( $logFile ) { $Message | Out-File $logFile -Append } if ( !$ShowLogs ) { Write-Output $Message } } function Out-LogError( [string] $Message ) { if ( $logFile ) { "[ERROR] $($Message)" | Out-File $logFile -Append } if ( !$ShowLogs ) { Write-Error $Message } } function Out-LogVerbose( [string] $Message ) { if ( $logFile ) { "[VERBOSE] $($Message)" | Out-File $logFile -Append } if ( !$ShowLogs ) { Write-Verbose $Message } } function Out-LogDebug( [string] $Message ) { if ( $logFile ) { "[DEBUG] $($Message)" | Out-File $logFile -Append } if ( !$ShowLogs ) { Write-Debug $Message } } function Test-Arguments() { if ( !$HomeDir ) { Out-LogError "YADE home directory has to be specified: -HomeDir" return 1 } if ( $Uninstall -and !(Test-Path -Path $HomeDir -PathType container) ) { Out-LogError "YADE home directory not found and -Uninstall switch is present: -HomeDir $HomeDir" return 1 } if ( !$MakeDirs -and !$Uninstall -and $HomeDir -and !(Test-Path -Path $HomeDir -PathType container) ) { Out-LogError "YADE home directory not found and -MakeDirs switch not present: -HomeDir $HomeDir" return 1 } if ( !$MakeDirs -and $Data -and !(Test-Path -Path $Data -PathType container) ) { Out-LogError "YADE data directory not found and -MakeDirs switch not present: -Data $Data" return 1 } if ( !$MakeDirs -and $Logs -and !(Test-Path -Path $Logs -PathType container) ) { Out-LogError "YADE log directory not found and -MakeDirs switch not present: -Logs $Logs" return 1 } if ( !$MakeDirs -and $BackupDir -and !(Test-Path -Path $BackupDir -PathType container) ) { Out-LogError "YADE backup directory not found and -MakeDirs switch not present: -BackupDir $BackupDir" return 1 } if ( !$MakeDirs -and $LogDir -and !(Test-Path -Path $LogDir -PathType container) ) { Out-LogError "YADE log directory not found and -MakeDirs switch not present: -LogDir $LogDir" return 1 } if ( !$Release -and !$Tarball -and !$PatchJar -and !$Uninstall ) { Out-LogError "Release must be specified if -Tarball or -PatchJar options are not specified and -Uninstall switch is not present: -Release" return 1 } if ( $Tarball -and !(Test-Path -Path $Tarball -PathType leaf) ) { Out-LogError "Tarball not found (*.zip): -Tarball $Tarball" return 1 } if ( $Tarball -and $Tarball.IndexOf('installer') -ge -0 ) { Out-LogError "Probably wrong tarball in use: js7_yade_windows_installer..zip, instead use js7_yade_windows..zip: -Tarball $Tarball" return 1 } if ( $Patch -and !(Test-Path -Path $HomeDir -PathType container) ) { Out-LogError "YADE home directory not found and -Patch option is present: -HomeDir $HomeDir" return 1 } if ( $PatchJar -and !(Test-Path -Path $PatchJar -PathType leaf) ) { Out-LogError "Patch file not found (*.jar): -PatchJar $PatchJar" return 1 } if ( $ShowLogs -and !$LogDir ) { Out-LogError "Log directory not specified and -ShowLogs switch is present: -LogDir" return 1 } if ( $Uninstall -and ( $Tarball -or -$Release) ) { Out-LogError "-Uninstall switch present and options -Tarball or -Release specified: -Uninstall" return 1 } return 0 } function isPowerShellVersion( [int] $Major=-1, [int] $Minor=-1, [int] $Patch=-1 ) { $rc = $false if ( $Major -gt -1 ) { if ( $PSVersionTable.PSVersion.Major -eq $Major ) { if ( $Minor -gt -1 ) { if ( $PSVersionTable.PSVersion.Minor -eq $Minor ) { if ( $Patch -gt - 1 ) { if ( $PSVersionTable.PSVersion.Patch -ge $Patch ) { $rc = $true } } else { $rc = $true } } elseif ( $PSVersionTable.PSVersion.Minor -gt $Minor ) { $rc = $true } else { $rc = $true } } else { $rc = $true } } elseif ( $PSVersionTable.PSVersion.Major -gt $Major ) { $rc = $true } } $rc } function hasAdministratorRole() { $currentPrincipal = New-Object Security.Principal.WindowsPrincipal([Security.Principal.WindowsIdentity]::GetCurrent()) return $currentPrincipal.IsInRole([Security.Principal.WindowsBuiltInRole]::Administrator) } function Final() { if ( $tarDir -and (Test-Path -Path $tarDir -PathType container) ) { Remove-Item -Path $tarDir -Recurse -Force } if ( $ReturnValues ) { Out-LogInfo ".. writing return values to: $($ReturnValues)" "log_file=$($logFile)" | Out-File $ReturnValues "backup_file=$($backupFile)" | Out-File $ReturnValues -Append "return_code=$($returnCode)" | Out-File $ReturnValues -Append } Out-LogInfo "-- end of log ----------------" if ( $ShowLogs -and (Test-Path -Path $logFile -PathType leaf) ) { Get-Content -Path $logFile } } # ------------------------------ # Main # ------------------------------ if ( Test-Arguments -ne 0 ) { return 1 } if ( $LogDir ) { if ( $MakeDirs -and !(Test-Path -Path $LogDir -PathType container) ) { New-Item -Path $LogDir -ItemType directory | Out-Null } $logFile = "$($LogDir)/install_js7_yade.$($hostname).$(Get-Date $startTime -Format 'yyyy-MM-ddTHH-mm-ss').log" while ( Test-Path -Path $logFile -PathType leaf ) { Start-Sleep -Seconds 1 $script:startTime = Get-Date $script:logFile = "$($LogDir)/install_js7_yade.$($hostname).$(Get-Date $startTime -Format 'yyyy-MM-ddTHH-mm-ss').log" } New-Item $logFile -ItemType file | Out-Null } Out-LogInfo "-- begin of log --------------" # Get the command name $commandName = $PSCmdlet.MyInvocation.InvocationName # Get the list of parameters for the command $parameterList = (Get-Command -Name $commandName).Parameters # Grab each parameter value, using Get-Variable foreach ($parameter in $parameterList.Keys) { $variable = Get-Variable -Name $parameter -ErrorAction SilentlyContinue if ( $variable.value ) { Out-LogInfo ".. Argument: $($variable.name) = $($variable.value)" } } Out-LogInfo "-- begin of output -----------" if ( !$Data ) { $script:Data = "$($HomeDir)/var" } if ( !$Logs ) { $script:Logs = "$($Data)/logs" } try { if ( $Uninstall -or $UninstallHome -or $UninstallData ) { if ( $isWindows ) { if ( Test-Path -Path "$($HomeDir)/Uninstaller)/uninstaller.jar" -PathType leaf ) { if ( $JavaHome ) { $java = "$($JavaHome)/bin/java" } else { $java = "java" } Out-LogInfo ".... running uninstaller: cmd.exe /C ""$($java)"" ""$($HomeDir)/Uninstaller/uninstaller.jar"" -c -f" cmd.exe /C """$($java)""" -jar """$($HomeDir)/Uninstaller/uninstaller.jar""" -c (if ( $UninstallData ) { '-f' }) } } if ( Test-Path -Path $HomeDir -PathType container ) { if ( $UninstallHome ) { Out-LogInfo ".... removing home directory: $($HomeDir)" Remove-Item -Path $HomeDir -Recurse -Force } else { Out-LogInfo ".... preserving home directory for remaining YADE: $($HomeDir)" } } if ( Test-Path -Path $Data -PathType container ) { if ( $UninstallData ) { Out-LogInfo ".... removing data directory: $($Data)" Remove-Item -Path $Data -Recurse -Force } else { Out-LogInfo ".... preserving data directory for remaining YADE: $($DataDir)" } } if ( Test-Path -Path $Logs -PathType container ) { if ( $UninstallData ) { Out-LogInfo ".... removing logs directory: $($Logs)" Remove-Item -Path $Logs -Recurse -Force } else { Out-LogInfo ".... preserving logs directory for remaining YADE: $($Logs)" } } Out-LogInfo "-- end of log ----------------" return } else { if ( $MakeDirs -and !( Test-Path -Path $Data -PathType container) ) { New-Item -Path $Data -ItemType directory | Out-Null } if ( $MakeDirs -and !(Test-Path -Path $Logs -PathType container) ) { New-Item -Path $Logs -ItemType directory | Out-Null } } # download tarball if ( !$Tarball -and $Release -and !$NoInstall ) { $Match = $Release | Select-String "^([0-9]*)[.]([0-9]*)[.]([a-zA-Z0-9]*)" if ( !$Match -or $Match.Matches.Groups.length -le 3 ) { throw "wrong format for release number, use .." } $releaseMajor = $Match.Matches.Groups[1].value $releaseMinor = $Match.Matches.Groups[2].value $releaseMaint = $Match.Matches.Groups[3].value if ( $Patch ) { $Tarball = "js7_yade.$($Release)-PATCH.$($Patch).tar.gz" $downloadUrl = "https://download.sos-berlin.com/patches/$($releaseMajor).$($releaseMinor).$($releaseMaint)-patch/$($Tarball)" } else { if ( $isWindows ) { $Tarball = "js7_yade_windows.$($Release).zip" } else { $Tarball = "js7_yade_unix.$($Release).tar.gz" } $Match = $releaseMaint | Select-String "(SNAPSHOT)|(RC[0-9]?)$" if ( !$Match -or $Match.Matches.Groups.length -le 1 ) { $downloadUrl = "https://download.sos-berlin.com/JobScheduler.$($releaseMajor).$($releaseMinor)/$($Tarball)" } else { $downloadUrl = "https://download.sos-berlin.com/JobScheduler.$($releaseMajor).0/$($Tarball)" } } Out-LogInfo ".. downloading tarball from: $($downloadUrl)" Invoke-WebRequest -Uri $downloadUrl -Outfile $Tarball } # extract tarball if ( $Tarball ) { if ( $isWindows ) { $tarDir = "$($env:TEMP)/js7_install_yade_$($PID).tmp" } else { $tarDir = "/tmp/js7_install_yade_$($PID).tmp" } if ( !(Test-Path -Path $tarDir -PathType container) ) { New-Item -Path $tarDir -ItemType directory | Out-Null } Out-LogInfo ".. extracting tarball to temporary directory: $($tarDir)" if ( $isWindows ) { if ( $Patch ) { cmd.exe /C "cd $($tarDir) && tar.exe -xf $((Get-ChildItem -Path $Tarball).FullName)" } else { Expand-Archive -Path $Tarball -DestinationPath $tarDir -Force } } else { sh -c "test -e ""$($Tarball)"" && gzip -c -d < ""$($Tarball)"" | tar -xf - -C ""$($tarDir)""" } $tarRoot = (Get-ChildItem -Path $tarDir -Directory).Name } # take backup of existing installation directory if ( $BackupDir -and $HomeDir ) { if ( $MakeDirs -and !(Test-Path -Path $BackupDir -PathType container) ) { New-Item -Path $BackupDir -ItemType directory | Out-Null } $version = '0.0.0' if ( Test-Path -Path "$($HomeDir)/.version" -PathType leaf ) { $Match = Get-Content "$($HomeDir)/.version" | Select-String "^release[ ]*=[ ]*(.*)$" if ( $Match -and $Match.Matches.Groups.length -eq 2 ) { $version = $Match.Matches.Groups[1].value } $backupFile = "$($BackupDir)/backup_js7_yade.$($hostname).$($version).home.$(Get-Date $startTime -Format 'yyyy-MM-ddTHH-mm-ss').tar.gz" if ( Test-Path -Path $backupFile -PathType leaf ) { Remove-Item -Path $backupFile -Force } Out-LogInfo ".. creating backup file: $($backupFile) from home directory $($HomeDir)" if ( $isWindows ) { cmd.exe /C "cd ""$(Split-Path -Path $HomeDir -Parent)"" && tar.exe -czf ""$($backupFile)"" ""$(Split-Path -Path $HomeDir -Leaf)""" } else { $backupFile = $backupFile.Substring( 0, $backupFile.Length-3) sh -c "cd ""$(Split-Path -Path $HomeDir -Parent)"" && tar -cpf ""$($backupFile)"" ""$(Split-Path -Path $HomeDir -Leaf)"" && gzip ""$($backupFile)""" } if ( $HomeDir -ne $Data -and (Test-Path -Path $Data -PathType container) ) { $backupFile = "$($BackupDir)/backup_js7_yade.$($hostname).$($version).data.$(Get-Date $startTime -Format 'yyyy-MM-ddTHH-mm-ss').tar.gz" if ( Test-Path -Path $backupFile -PathType leaf ) { Remove-Item -Path $backupFile -Force } Out-LogInfo ".. creating backup file: $($backupFile) from data directory $($Data)" if ( $isWindows ) { cmd.exe /C "cd ""$(Split-Path -Path $Data -Parent)"" && tar.exe -czf ""$($backupFile)"" ""$(Split-Path -Path $Data -Leaf)""" } else { $backupFile = $backupFile.Substring( 0, $backupFile.Length-3) sh -c "cd ""$(Split-Path -Path $Data -Parent)"" && tar -cpf ""$($backupFile)"" ""$(Split-Path -Path $Data -Leaf)"" && gzip ""$($backupFile)""" } } } } if ( $Patch ) { if ( $Tarball ) { # copy to YADE patch directoy if ( Test-Path -Path "$($tarDir)/$($tarRoot)/lib/patches" -PathType container ) { Out-LogInfo ".. copying files from extracted tarball directory: $($tarDir)/$($tarRoot)/lib/patches to YADE patch directory: $($HomeDir)/lib/patches" Copy-Item -Path "$($tarDir)/$($tarRoot)/lib/patches/*" -Destination "$($HomeDir)/lib/patches" -Recurse -Force } else { Out-LogInfo ".. copying files from extracted tarball directory: $($tarDir)/$($tarRoot) to YADE patch directory: $($HomeDir)/lib/patches" Copy-Item -Path "$($tarDir)/$($tarRoot)/*" -Destination "$($HomeDir)/lib/patches" -Recurse -Force } } elseif ( $PatchJar ) { Out-LogInfo ".. copying patch .jar file: $($PatchJar) to YADE patch directory: $($HomeDir)/lib/patches" Copy-Item -Path $PatchJar -Destination "$($HomeDir)/lib/patches" -Recurse -Force } Out-LogInfo "-- end of log ----------------" return } # create YADE home directory if required if ( !(Test-Path -Path $HomeDir -PathType container) ) { Out-LogInfo ".. creating YADE home directory: $($HomeDir)" New-Item -Path $HomeDir -ItemType directory | Out-Null } # create YADE data directory if required if ( !(Test-Path -Path $Data -PathType container) ) { Out-LogInfo ".. creating YADE data directory: $($Data)" New-Item -Path $Data -ItemType directory | Out-Null } # preserve the YADE's lib/user_lib directory if ( Test-Path -Path "$($HomeDir)/lib/user_lib") { Out-LogInfo ".. copying files to extracted tarball directory: $($tarDir)/$($tarRoot) from YADE home: $($HomeDir)/lib/user_lib" Copy-Item -Path "$($HomeDir)/lib/user_lib/*" -Destination "$($tarDir)/$($tarRoot)/lib/user_lib" -Recurse } # remove the YADE's patches if ( Test-Path -Path "$($HomeDir)/lib/patches") { Out-LogInfo ".. removing patches from YADE patch directory: $($HomeDir)/lib/patches" Remove-Item -Path "$($HomeDir)/lib/patches/*" -Recurse -Force } # move or remove the YADE's lib directory if ( !$NoInstall -and (Test-Path -Path "$($HomeDir)/lib" -PathType container) ) { if ( !$MoveLibs ) { Remove-Item -Path "$($HomeDir)/lib" -Recurse -Force } else { # check existing version and lib directory copies if ( Test-Path -Path "$($HomeDir)/.version" -PathType leaf ) { $Match = Get-Content "$($HomeDir)/.version" | Select-String "^release[ ]*=[ ]*(.*)$" if ( $Match -and $Match.Matches.Groups.length -eq 2 ) { $version = $Match.Matches.Groups[1].value } else { $version = '0.0.0' } } else { $version = '0.0.0' } while ( Test-Path -Path "$($HomeDir)/lib/$($version)" ) { $version = "$(version)-1" } Out-LogInfo ".. moving directory $($HomeDir)/lib to: $($HomeDir)/lib.$($version)" Move-Item -Path "$($HomeDir)/lib" -Destination "$($HomeDir)/lib.$($version)" -Force } } if ( $Tarball ) { # copy to YADE home directoy Out-LogInfo ".. copying files from extracted tarball directory: $($tarDir)/$($tarRoot) to YADE home: $($HomeDir)" Copy-Item -Path "$($tarDir)/$($tarRoot)/*" -Destination $HomeDir -Recurse -Force } $returnCode = 0 Final } catch { Final $message = $_.Exception | Format-List -Force | Out-String Out-LogError "Exception occurred in line number $($_.InvocationInfo.ScriptLineNumber)`n$($message)" } } End { Out-LogVerbose ".. processing completed" } # SIG # Begin signature block # MIIslwYJKoZIhvcNAQcCoIIsiDCCLIQCAQExDzANBglghkgBZQMEAgEFADB5Bgor # BgEEAYI3AgEEoGswaTA0BgorBgEEAYI3AgEeMCYCAwEAAAQQH8w7YFlLCE63JNLG # KX7zUQIBAAIBAAIBAAIBAAIBADAxMA0GCWCGSAFlAwQCAQUABCCHYfLs5hgneCzZ # /OflavnzmIsQtEWWuv8ZBu8A4GYD+aCCJakwggVvMIIEV6ADAgECAhBI/JO0YFWU # jTanyYqJ1pQWMA0GCSqGSIb3DQEBDAUAMHsxCzAJBgNVBAYTAkdCMRswGQYDVQQI # DBJHcmVhdGVyIE1hbmNoZXN0ZXIxEDAOBgNVBAcMB1NhbGZvcmQxGjAYBgNVBAoM # EUNvbW9kbyBDQSBMaW1pdGVkMSEwHwYDVQQDDBhBQUEgQ2VydGlmaWNhdGUgU2Vy # dmljZXMwHhcNMjEwNTI1MDAwMDAwWhcNMjgxMjMxMjM1OTU5WjBWMQswCQYDVQQG # EwJHQjEYMBYGA1UEChMPU2VjdGlnbyBMaW1pdGVkMS0wKwYDVQQDEyRTZWN0aWdv # IFB1YmxpYyBDb2RlIFNpZ25pbmcgUm9vdCBSNDYwggIiMA0GCSqGSIb3DQEBAQUA # A4ICDwAwggIKAoICAQCN55QSIgQkdC7/FiMCkoq2rjaFrEfUI5ErPtx94jGgUW+s # hJHjUoq14pbe0IdjJImK/+8Skzt9u7aKvb0Ffyeba2XTpQxpsbxJOZrxbW6q5KCD # J9qaDStQ6Utbs7hkNqR+Sj2pcaths3OzPAsM79szV+W+NDfjlxtd/R8SPYIDdub7 # P2bSlDFp+m2zNKzBenjcklDyZMeqLQSrw2rq4C+np9xu1+j/2iGrQL+57g2extme # me/G3h+pDHazJyCh1rr9gOcB0u/rgimVcI3/uxXP/tEPNqIuTzKQdEZrRzUTdwUz # T2MuuC3hv2WnBGsY2HH6zAjybYmZELGt2z4s5KoYsMYHAXVn3m3pY2MeNn9pib6q # RT5uWl+PoVvLnTCGMOgDs0DGDQ84zWeoU4j6uDBl+m/H5x2xg3RpPqzEaDux5mcz # mrYI4IAFSEDu9oJkRqj1c7AGlfJsZZ+/VVscnFcax3hGfHCqlBuCF6yH6bbJDoEc # QNYWFyn8XJwYK+pF9e+91WdPKF4F7pBMeufG9ND8+s0+MkYTIDaKBOq3qgdGnA2T # OglmmVhcKaO5DKYwODzQRjY1fJy67sPV+Qp2+n4FG0DKkjXp1XrRtX8ArqmQqsV/ # AZwQsRb8zG4Y3G9i/qZQp7h7uJ0VP/4gDHXIIloTlRmQAOka1cKG8eOO7F/05QID # AQABo4IBEjCCAQ4wHwYDVR0jBBgwFoAUoBEKIz6W8Qfs4q8p74Klf9AwpLQwHQYD # VR0OBBYEFDLrkpr/NZZILyhAQnAgNpFcF4XmMA4GA1UdDwEB/wQEAwIBhjAPBgNV # HRMBAf8EBTADAQH/MBMGA1UdJQQMMAoGCCsGAQUFBwMDMBsGA1UdIAQUMBIwBgYE # VR0gADAIBgZngQwBBAEwQwYDVR0fBDwwOjA4oDagNIYyaHR0cDovL2NybC5jb21v # ZG9jYS5jb20vQUFBQ2VydGlmaWNhdGVTZXJ2aWNlcy5jcmwwNAYIKwYBBQUHAQEE # KDAmMCQGCCsGAQUFBzABhhhodHRwOi8vb2NzcC5jb21vZG9jYS5jb20wDQYJKoZI # hvcNAQEMBQADggEBABK/oe+LdJqYRLhpRrWrJAoMpIpnuDqBv0WKfVIHqI0fTiGF # OaNrXi0ghr8QuK55O1PNtPvYRL4G2VxjZ9RAFodEhnIq1jIV9RKDwvnhXRFAZ/ZC # J3LFI+ICOBpMIOLbAffNRk8monxmwFE2tokCVMf8WPtsAO7+mKYulaEMUykfb9gZ # pk+e96wJ6l2CxouvgKe9gUhShDHaMuwV5KZMPWw5c9QLhTkg4IUaaOGnSDip0TYl # d8GNGRbFiExmfS9jzpjoad+sPKhdnckcW67Y8y90z7h+9teDnRGWYpquRRPaf9xH # +9/DUp/mBlXpnYzyOmJRvOwkDynUWICE5EV7WtgwggYUMIID/KADAgECAhB6I67a # U2mWD5HIPlz0x+M/MA0GCSqGSIb3DQEBDAUAMFcxCzAJBgNVBAYTAkdCMRgwFgYD # VQQKEw9TZWN0aWdvIExpbWl0ZWQxLjAsBgNVBAMTJVNlY3RpZ28gUHVibGljIFRp # bWUgU3RhbXBpbmcgUm9vdCBSNDYwHhcNMjEwMzIyMDAwMDAwWhcNMzYwMzIxMjM1 # OTU5WjBVMQswCQYDVQQGEwJHQjEYMBYGA1UEChMPU2VjdGlnbyBMaW1pdGVkMSww # KgYDVQQDEyNTZWN0aWdvIFB1YmxpYyBUaW1lIFN0YW1waW5nIENBIFIzNjCCAaIw # DQYJKoZIhvcNAQEBBQADggGPADCCAYoCggGBAM2Y2ENBq26CK+z2M34mNOSJjNPv # IhKAVD7vJq+MDoGD46IiM+b83+3ecLvBhStSVjeYXIjfa3ajoW3cS3ElcJzkyZlB # nwDEJuHlzpbN4kMH2qRBVrjrGJgSlzzUqcGQBaCxpectRGhhnOSwcjPMI3G0hedv # 2eNmGiUbD12OeORN0ADzdpsQ4dDi6M4YhoGE9cbY11XxM2AVZn0GiOUC9+XE0wI7 # CQKfOUfigLDn7i/WeyxZ43XLj5GVo7LDBExSLnh+va8WxTlA+uBvq1KO8RSHUQLg # zb1gbL9Ihgzxmkdp2ZWNuLc+XyEmJNbD2OIIq/fWlwBp6KNL19zpHsODLIsgZ+WZ # 1AzCs1HEK6VWrxmnKyJJg2Lv23DlEdZlQSGdF+z+Gyn9/CRezKe7WNyxRf4e4bwU # trYE2F5Q+05yDD68clwnweckKtxRaF0VzN/w76kOLIaFVhf5sMM/caEZLtOYqYad # tn034ykSFaZuIBU9uCSrKRKTPJhWvXk4CllgrwIDAQABo4IBXDCCAVgwHwYDVR0j # BBgwFoAU9ndq3T/9ARP/FqFsggIv0Ao9FCUwHQYDVR0OBBYEFF9Y7UwxeqJhQo1S # gLqzYZcZojKbMA4GA1UdDwEB/wQEAwIBhjASBgNVHRMBAf8ECDAGAQH/AgEAMBMG # A1UdJQQMMAoGCCsGAQUFBwMIMBEGA1UdIAQKMAgwBgYEVR0gADBMBgNVHR8ERTBD # MEGgP6A9hjtodHRwOi8vY3JsLnNlY3RpZ28uY29tL1NlY3RpZ29QdWJsaWNUaW1l # U3RhbXBpbmdSb290UjQ2LmNybDB8BggrBgEFBQcBAQRwMG4wRwYIKwYBBQUHMAKG # O2h0dHA6Ly9jcnQuc2VjdGlnby5jb20vU2VjdGlnb1B1YmxpY1RpbWVTdGFtcGlu # Z1Jvb3RSNDYucDdjMCMGCCsGAQUFBzABhhdodHRwOi8vb2NzcC5zZWN0aWdvLmNv # bTANBgkqhkiG9w0BAQwFAAOCAgEAEtd7IK0ONVgMnoEdJVj9TC1ndK/HYiYh9lVU # acahRoZ2W2hfiEOyQExnHk1jkvpIJzAMxmEc6ZvIyHI5UkPCbXKspioYMdbOnBWQ # Un733qMooBfIghpR/klUqNxx6/fDXqY0hSU1OSkkSivt51UlmJElUICZYBodzD3M # /SFjeCP59anwxs6hwj1mfvzG+b1coYGnqsSz2wSKr+nDO+Db8qNcTbJZRAiSazr7 # KyUJGo1c+MScGfG5QHV+bps8BX5Oyv9Ct36Y4Il6ajTqV2ifikkVtB3RNBUgwu/m # SiSUice/Jp/q8BMk/gN8+0rNIE+QqU63JoVMCMPY2752LmESsRVVoypJVt8/N3qQ # 1c6FibbcRabo3azZkcIdWGVSAdoLgAIxEKBeNh9AQO1gQrnh1TA8ldXuJzPSuALO # z1Ujb0PCyNVkWk7hkhVHfcvBfI8NtgWQupiaAeNHe0pWSGH2opXZYKYG4Lbukg7H # pNi/KqJhue2Keak6qH9A8CeEOB7Eob0Zf+fU+CCQaL0cJqlmnx9HCDxF+3BLbUuf # rV64EbTI40zqegPZdA+sXCmbcZy6okx/SjwsusWRItFA3DE8MORZeFb6BmzBtqKJ # 7l939bbKBy2jvxcJI98Va95Q5JnlKor3m0E7xpMeYRriWklUPsetMSf2NvUQa/E5 # vVyefQIwggYcMIIEBKADAgECAhAz1wiokUBTGeKlu9M5ua1uMA0GCSqGSIb3DQEB # DAUAMFYxCzAJBgNVBAYTAkdCMRgwFgYDVQQKEw9TZWN0aWdvIExpbWl0ZWQxLTAr # BgNVBAMTJFNlY3RpZ28gUHVibGljIENvZGUgU2lnbmluZyBSb290IFI0NjAeFw0y # MTAzMjIwMDAwMDBaFw0zNjAzMjEyMzU5NTlaMFcxCzAJBgNVBAYTAkdCMRgwFgYD # VQQKEw9TZWN0aWdvIExpbWl0ZWQxLjAsBgNVBAMTJVNlY3RpZ28gUHVibGljIENv # ZGUgU2lnbmluZyBDQSBFViBSMzYwggGiMA0GCSqGSIb3DQEBAQUAA4IBjwAwggGK # AoIBgQC70f4et0JbePWQp64sg/GNIdMwhoV739PN2RZLrIXFuwHP4owoEXIEdiyB # xasSekBKxRDogRQ5G19PB/YwMDB/NSXlwHM9QAmU6Kj46zkLVdW2DIseJ/jePiLB # v+9l7nPuZd0o3bsffZsyf7eZVReqskmoPBBqOsMhspmoQ9c7gqgZYbU+alpduLye # E9AKnvVbj2k4aOqlH1vKI+4L7bzQHkNDbrBTjMJzKkQxbr6PuMYC9ruCBBV5DFIg # 6JgncWHvL+T4AvszWbX0w1Xn3/YIIq620QlZ7AGfc4m3Q0/V8tm9VlkJ3bcX9sR0 # gLqHRqwG29sEDdVOuu6MCTQZlRvmcBMEJd+PuNeEM4xspgzraLqVT3xE6NRpjSV5 # wyHxNXf4T7YSVZXQVugYAtXueciGoWnxG06UE2oHYvDQa5mll1CeHDOhHu5hiwVo # HI717iaQg9b+cYWnmvINFD42tRKtd3V6zOdGNmqQU8vGlHHeBzoh+dYyZ+CcblSG # oGSgg8sCAwEAAaOCAWMwggFfMB8GA1UdIwQYMBaAFDLrkpr/NZZILyhAQnAgNpFc # F4XmMB0GA1UdDgQWBBSBMpJBKyjNRsjEosYqORLsSKk/FDAOBgNVHQ8BAf8EBAMC # AYYwEgYDVR0TAQH/BAgwBgEB/wIBADATBgNVHSUEDDAKBggrBgEFBQcDAzAaBgNV # HSAEEzARMAYGBFUdIAAwBwYFZ4EMAQMwSwYDVR0fBEQwQjBAoD6gPIY6aHR0cDov # L2NybC5zZWN0aWdvLmNvbS9TZWN0aWdvUHVibGljQ29kZVNpZ25pbmdSb290UjQ2 # LmNybDB7BggrBgEFBQcBAQRvMG0wRgYIKwYBBQUHMAKGOmh0dHA6Ly9jcnQuc2Vj # dGlnby5jb20vU2VjdGlnb1B1YmxpY0NvZGVTaWduaW5nUm9vdFI0Ni5wN2MwIwYI # KwYBBQUHMAGGF2h0dHA6Ly9vY3NwLnNlY3RpZ28uY29tMA0GCSqGSIb3DQEBDAUA # A4ICAQBfNqz7+fZyWhS38Asd3tj9lwHS/QHumS2G6Pa38Dn/1oFKWqdCSgotFZ3m # lP3FaUqy10vxFhJM9r6QZmWLLXTUqwj3ahEDCHd8vmnhsNufJIkD1t5cpOCy1rTP # 4zjVuW3MJ9bOZBHoEHJ20/ng6SyJ6UnTs5eWBgrh9grIQZqRXYHYNneYyoBBl6j4 # kT9jn6rNVFRLgOr1F2bTlHH9nv1HMePpGoYd074g0j+xUl+yk72MlQmYco+VAfSY # Q6VK+xQmqp02v3Kw/Ny9hA3s7TSoXpUrOBZjBXXZ9jEuFWvilLIq0nQ1tZiao/74 # Ky+2F0snbFrmuXZe2obdq2TWauqDGIgbMYL1iLOUJcAhLwhpAuNMu0wqETDrgXkG # 4UGVKtQg9guT5Hx2DJ0dJmtfhAH2KpnNr97H8OQYok6bLyoMZqaSdSa+2UA1E2+u # pjcaeuitHFFjBypWBmztfhj24+xkc6ZtCDaLrw+ZrnVrFyvCTWrDUUZBVumPwo3/ # E3Gb2u2e05+r5UWmEsUUWlJBl6MGAAjF5hzqJ4I8O9vmRsTvLQA1E802fZ3lqicI # BczOwDYOSxlP0GOabb/FKVMxItt1UHeG0PL4au5rBhs+hSMrl8h+eplBDN1Yfw6o # wxI9OjWb4J0sjBeBVESoeh2YnZZ/WVimVGX/UUIL+Efrz/jlvzCCBmIwggTKoAMC # AQICEQCkKTtuHt3XpzQIh616TrckMA0GCSqGSIb3DQEBDAUAMFUxCzAJBgNVBAYT # AkdCMRgwFgYDVQQKEw9TZWN0aWdvIExpbWl0ZWQxLDAqBgNVBAMTI1NlY3RpZ28g # UHVibGljIFRpbWUgU3RhbXBpbmcgQ0EgUjM2MB4XDTI1MDMyNzAwMDAwMFoXDTM2 # MDMyMTIzNTk1OVowcjELMAkGA1UEBhMCR0IxFzAVBgNVBAgTDldlc3QgWW9ya3No # aXJlMRgwFgYDVQQKEw9TZWN0aWdvIExpbWl0ZWQxMDAuBgNVBAMTJ1NlY3RpZ28g # UHVibGljIFRpbWUgU3RhbXBpbmcgU2lnbmVyIFIzNjCCAiIwDQYJKoZIhvcNAQEB # BQADggIPADCCAgoCggIBANOElfRupFN48j0QS3gSBzzclIFTZ2Gsn7BjsmBF659/ # kpA2Ey7NXK3MP6JdrMBNU8wdmkf+SSIyjX++UAYWtg3Y/uDRDyg8RxHeHRJ+0U1j # HEyH5uPdk1ttiPC3x/gOxIc9P7Gn3OgW7DQc4x07exZ4DX4XyaGDq5LoEmk/BdCM # 1IelVMKB3WA6YpZ/XYdJ9JueOXeQObSQ/dohQCGyh0FhmwkDWKZaqQBWrBwZ++zq # lt+z/QYTgEnZo6dyIo2IhXXANFkCHutL8765NBxvolXMFWY8/reTnFxk3MajgM5N # X6wzWdWsPJxYRhLxtJLSUJJ5yWRNw+NBqH1ezvFs4GgJ2ZqFJ+Dwqbx9+rw+F2gB # dgo4j7CVomP49sS7CbqsdybbiOGpB9DJhs5QVMpYV73TVV3IwLiBHBECrTgUfZVO # MF0KSEq2zk/LsfvehswavE3W4aBXJmGjgWSpcDz+6TqeTM8f1DIcgQPdz0IYgnT3 # yFTgiDbFGOFNt6eCidxdR6j9x+kpcN5RwApy4pRhE10YOV/xafBvKpRuWPjOPWRB # lKdm53kS2aMh08spx7xSEqXn4QQldCnUWRz3Lki+TgBlpwYwJUbR77DAayNwAANE # 7taBrz2v+MnnogMrvvct0iwvfIA1W8kp155Lo44SIfqGmrbJP6Mn+Udr3MR2oWoz # AgMBAAGjggGOMIIBijAfBgNVHSMEGDAWgBRfWO1MMXqiYUKNUoC6s2GXGaIymzAd # BgNVHQ4EFgQUiGGMoSo3ZIEoYKGbMdCM/SwCzk8wDgYDVR0PAQH/BAQDAgbAMAwG # A1UdEwEB/wQCMAAwFgYDVR0lAQH/BAwwCgYIKwYBBQUHAwgwSgYDVR0gBEMwQTA1 # BgwrBgEEAbIxAQIBAwgwJTAjBggrBgEFBQcCARYXaHR0cHM6Ly9zZWN0aWdvLmNv # bS9DUFMwCAYGZ4EMAQQCMEoGA1UdHwRDMEEwP6A9oDuGOWh0dHA6Ly9jcmwuc2Vj # dGlnby5jb20vU2VjdGlnb1B1YmxpY1RpbWVTdGFtcGluZ0NBUjM2LmNybDB6Bggr # BgEFBQcBAQRuMGwwRQYIKwYBBQUHMAKGOWh0dHA6Ly9jcnQuc2VjdGlnby5jb20v # U2VjdGlnb1B1YmxpY1RpbWVTdGFtcGluZ0NBUjM2LmNydDAjBggrBgEFBQcwAYYX # aHR0cDovL29jc3Auc2VjdGlnby5jb20wDQYJKoZIhvcNAQEMBQADggGBAAKBPqSG # clEh+WWpLj1SiuHlm8xLE0SThI2yLuq+75s11y6SceBchpnKpxWaGtXc8dya1Aq3 # RuW//y3wMThsvT4fSba2AoSWlR67rA4fTYGMIhgzocsids0ct/pHaocLVJSwnTYx # Y2pE0hPoZAvRebctbsTqENmZHyOVjOFlwN2R3DRweFeNs4uyZN5LRJ5EnVYlcTOq # 3bl1tI5poru9WaQRWQ4eynXp7Pj0Fz4DKr86HYECRJMWiDjeV0QqAcQMFsIjJtrY # Tw7mU81qf4FBc4u4swphLeKRNyn9DDrd3HIMJ+CpdhSHEGleeZ5I79YDg3B3A/fm # VY2GaMik1Vm+FajEMv4/EN2mmHf4zkOuhYZNzVm4NrWJeY4UAriLBOeVYODdA1Gx # Fr1ycbcUEGlUecc4RCPgYySs4d00NNuicR4a9n7idJlevAJbha/arIYMEuUqTeRR # bWkhJwMKmb9yEvppRudKyu1t6l21sIuIZqcpVH8oLWCxHS0LpDRF9Y4jijCCBoIw # ggRqoAMCAQICEDbCsL18Gzrno7PdNsvJdWgwDQYJKoZIhvcNAQEMBQAwgYgxCzAJ # BgNVBAYTAlVTMRMwEQYDVQQIEwpOZXcgSmVyc2V5MRQwEgYDVQQHEwtKZXJzZXkg # Q2l0eTEeMBwGA1UEChMVVGhlIFVTRVJUUlVTVCBOZXR3b3JrMS4wLAYDVQQDEyVV # U0VSVHJ1c3QgUlNBIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MB4XDTIxMDMyMjAw # MDAwMFoXDTM4MDExODIzNTk1OVowVzELMAkGA1UEBhMCR0IxGDAWBgNVBAoTD1Nl # Y3RpZ28gTGltaXRlZDEuMCwGA1UEAxMlU2VjdGlnbyBQdWJsaWMgVGltZSBTdGFt # cGluZyBSb290IFI0NjCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAIid # 2LlFZ50d3ei5JoGaVFTAfEkFm8xaFQ/ZlBBEtEFAgXcUmanU5HYsyAhTXiDQkiUv # pVdYqZ1uYoZEMgtHES1l1Cc6HaqZzEbOOp6YiTx63ywTon434aXVydmhx7Dx4IBr # Aou7hNGsKioIBPy5GMN7KmgYmuu4f92sKKjbxqohUSfjk1mJlAjthgF7Hjx4vvyV # DQGsd5KarLW5d73E3ThobSkob2SL48LpUR/O627pDchxll+bTSv1gASn/hp6IuHJ # orEu6EopoB1CNFp/+HpTXeNARXUmdRMKbnXWflq+/g36NJXB35ZvxQw6zid61qmr # lD/IbKJA6COw/8lFSPQwBP1ityZdwuCysCKZ9ZjczMqbUcLFyq6KdOpuzVDR3ZUw # xDKL1wCAxgL2Mpz7eZbrb/JWXiOcNzDpQsmwGQ6Stw8tTCqPumhLRPb7YkzM8/6N # nWH3T9ClmcGSF22LEyJYNWCHrQqYubNeKolzqUbCqhSqmr/UdUeb49zYHr7ALL8b # AJyPDmubNqMtuaobKASBqP84uhqcRY/pjnYd+V5/dcu9ieERjiRKKsxCG1t6tG9o # j7liwPddXEcYGOUiWLm742st50jGwTzxbMpepmOP1mLnJskvZaN5e45NuzAHteOR # lsSuDt5t4BBRCJL+5EZnnw0ezntk9R8QJyAkL6/bAgMBAAGjggEWMIIBEjAfBgNV # HSMEGDAWgBRTeb9aqitKz1SA4dibwJ3ysgNmyzAdBgNVHQ4EFgQU9ndq3T/9ARP/ # FqFsggIv0Ao9FCUwDgYDVR0PAQH/BAQDAgGGMA8GA1UdEwEB/wQFMAMBAf8wEwYD # VR0lBAwwCgYIKwYBBQUHAwgwEQYDVR0gBAowCDAGBgRVHSAAMFAGA1UdHwRJMEcw # RaBDoEGGP2h0dHA6Ly9jcmwudXNlcnRydXN0LmNvbS9VU0VSVHJ1c3RSU0FDZXJ0 # aWZpY2F0aW9uQXV0aG9yaXR5LmNybDA1BggrBgEFBQcBAQQpMCcwJQYIKwYBBQUH # MAGGGWh0dHA6Ly9vY3NwLnVzZXJ0cnVzdC5jb20wDQYJKoZIhvcNAQEMBQADggIB # AA6+ZUHtaES45aHF1BGH5Lc7JYzrftrIF5Ht2PFDxKKFOct/awAEWgHQMVHol9ZL # Syd/pYMbaC0IZ+XBW9xhdkkmUV/KbUOiL7g98M/yzRyqUOZ1/IY7Ay0YbMniIibJ # rPcgFp73WDnRDKtVutShPSZQZAdtFwXnuiWl8eFARK3PmLqEm9UsVX+55DbVIz33 # Mbhba0HUTEYv3yJ1fwKGxPBsP/MgTECimh7eXomvMm0/GPxX2uhwCcs/YLxDnBdV # VlxvDjHjO1cuwbOpkiJGHmLXXVNbsdXUC2xBrq9fLrfe8IBsA4hopwsCj8hTuwKX # JlSTrZcPRVSccP5i9U28gZ7OMzoJGlxZ5384OKm0r568Mo9TYrqzKeKZgFo0fj2/ # 0iHbj55hc20jfxvK3mQi+H7xpbzxZOFGm/yVQkpo+ffv5gdhp+hv1GDsvJOtJinJ # mgGbBFZIThbqI+MHvAmMmkfb3fTxmSkop2mSJL1Y2x/955S29Gu0gSJIkc3z30vU # /iXrMpWx2tS7UVfVP+5tKuzGtgkP7d/doqDrLF1u6Ci3TpjAZdeLLlRQZm867eVe # XED58LXd1Dk6UvaAhvmWYXoiLz4JA5gPBcz7J311uahxCweNxE+xxxR3kT0WKzAS # o5G/PyDez6NHdIUKBeE3jDPs2ACc6CkJ1Sji4PKWVT0/MIIHDjCCBXagAwIBAgIQ # Sw+NgvCzdrKXturaTqbU7DANBgkqhkiG9w0BAQsFADBXMQswCQYDVQQGEwJHQjEY # MBYGA1UEChMPU2VjdGlnbyBMaW1pdGVkMS4wLAYDVQQDEyVTZWN0aWdvIFB1Ymxp # YyBDb2RlIFNpZ25pbmcgQ0EgRVYgUjM2MB4XDTIzMDUzMDAwMDAwMFoXDTI2MDUy # OTIzNTk1OVowgdQxEjAQBgNVBAUTCUhSQiAyMTAxNTETMBEGCysGAQQBgjc8AgED # EwJERTEdMBsGA1UEDxMUUHJpdmF0ZSBPcmdhbml6YXRpb24xCzAJBgNVBAYTAkRF # MQ8wDQYDVQQIDAZCZXJsaW4xNTAzBgNVBAoMLFNPUyBTb2Z0d2FyZS0gdW5kIE9y # Z2FuaXNhdGlvbnMtU2VydmljZSBHbWJIMTUwMwYDVQQDDCxTT1MgU29mdHdhcmUt # IHVuZCBPcmdhbmlzYXRpb25zLVNlcnZpY2UgR21iSDCCAiIwDQYJKoZIhvcNAQEB # BQADggIPADCCAgoCggIBAL5t1usDS85Xcw3cIgVDvb43V9y9hiRn8cWnpnYrW8Kc # S58120n0rRCXPW8sFJvm4Uqf1xs1sXkmyBrdd0p/RBaKTkWtuScbsAPMUxDsSzPw # hJYD/2jfv65ebB82qSURfO4ne8iF75WccYrgD2b6ZE3Px1ks/yH2zTw7VjSYZgjp # YhiUd215hTxwww35a32OS/f79sMi1ERC8qcVQYudwGm2brYgGuNC0qqL1Z3W2EPK # kH3VvUFUSQxdIQzEPMZrt9ZAepizAlyv/UZuxdmIr9DTL4OId6od5FfpCx8xHGiD # HgULvlbQj7zBJ/GoUUcPNG5Ye1dn/Tl9xkcmJ9A0H4zGXRo6Zo+D9MZXavBntj1Z # vqwlCXiUkFGLDtay4TMgQKDJfs+qocFrsYeXCWiWqw0Ly1qYsa4rAPgCTSVJ4j8l # 06/nWU0r57dvXRt9AuuikbJBSlg7gc462gK95FFkACeZEuhtSkrsnW8YFpPfTI7f # omhyyg5bHiRKlyHq3Hgr7C88PjTmLAOQDhHQs/jgi3aMEDNHrTcFoHBlYmQbsnU9 # zr0PMOUJXSRF1PsIe2vvvw9rpfvuLobUN21g1spNuEil+jrKgxYHKxcVqvlSVn5S # ISqhQPYRGbLeZPIB2ZMl5w+z5Wwg6HqrdrD1MomSkPwWNxEjjSg3Ph2WizBtgEY3 # AgMBAAGjggHWMIIB0jAfBgNVHSMEGDAWgBSBMpJBKyjNRsjEosYqORLsSKk/FDAd # BgNVHQ4EFgQURHB21fi7IRRpsoiNNppx0kxQ2YIwDgYDVR0PAQH/BAQDAgeAMAwG # A1UdEwEB/wQCMAAwEwYDVR0lBAwwCgYIKwYBBQUHAwMwSQYDVR0gBEIwQDA1Bgwr # BgEEAbIxAQIBBgEwJTAjBggrBgEFBQcCARYXaHR0cHM6Ly9zZWN0aWdvLmNvbS9D # UFMwBwYFZ4EMAQMwSwYDVR0fBEQwQjBAoD6gPIY6aHR0cDovL2NybC5zZWN0aWdv # LmNvbS9TZWN0aWdvUHVibGljQ29kZVNpZ25pbmdDQUVWUjM2LmNybDB7BggrBgEF # BQcBAQRvMG0wRgYIKwYBBQUHMAKGOmh0dHA6Ly9jcnQuc2VjdGlnby5jb20vU2Vj # dGlnb1B1YmxpY0NvZGVTaWduaW5nQ0FFVlIzNi5jcnQwIwYIKwYBBQUHMAGGF2h0 # dHA6Ly9vY3NwLnNlY3RpZ28uY29tMEgGA1UdEQRBMD+gHAYIKwYBBQUHCAOgEDAO # DAxERS1IUkIgMjEwMTWBH2FuZHJlYXMucHVlc2NoZWxAc29zLWJlcmxpbi5jb20w # DQYJKoZIhvcNAQELBQADggGBAGQVsECtVc3Unom81ITXzXk3s9N6nMrsyxIXBTtF # pa1Kq/oRZjhL3YuHZmA3kSpi8NjO0TvpI17KE/lEB8tm8qxLAOTCQ7l2CskAbcz5 # LIFKDbz+fm694GaeAp82KaxE45/V+esji36D8VKtywDABarTZADXxpIfQ5+9sLNy # 0dzpCwUcUrw0UArob6Nrom8F6nS9fcBoD8hLx/WIwZyhpKYGmKtEhpF7lsK7IxU2 # /t9N53NzfJ+vmSuMRKdZu1uoANx9PXkWolihmfR/J82HoYLM7okZGbhMzT3x6DOn # 0tir+mCOIcgk8iMA1nxkucPiWBHYYn3LxP8afogSk11Hxk5m9ZHvdrqsHZU30lf7 # ERzm7zCjaExsdT/1GtUJlNytDrJQyK0JtiP3CxxuZrGh8bFONRTpDHkrff1ag/XG # PZR+yLCWgqmO3JgoPLRAkPlIIJEka+4MDuRo36OzTrTkSKAYm4uGA9xacldGojre # 4aXgSKndSSBFrQ9RqVAOwOqqgzGCBkQwggZAAgEBMGswVzELMAkGA1UEBhMCR0Ix # GDAWBgNVBAoTD1NlY3RpZ28gTGltaXRlZDEuMCwGA1UEAxMlU2VjdGlnbyBQdWJs # aWMgQ29kZSBTaWduaW5nIENBIEVWIFIzNgIQSw+NgvCzdrKXturaTqbU7DANBglg # hkgBZQMEAgEFAKCBhDAYBgorBgEEAYI3AgEMMQowCKACgAChAoAAMBkGCSqGSIb3 # DQEJAzEMBgorBgEEAYI3AgEEMBwGCisGAQQBgjcCAQsxDjAMBgorBgEEAYI3AgEV # MC8GCSqGSIb3DQEJBDEiBCCkER/rKvSine7j1zvCUHxj4dV75T3TYfj5e9MyhuY8 # YDANBgkqhkiG9w0BAQEFAASCAgBlSsT+FBht25lii+9LzXFK/XoZGR2zkopNwRRs # hI4DB6t4a5lQrIduZpM9ZKrYTVW/xYKlZs2LZNsQwhs6QRJKd9+dJAQU9TVOOwWV # 0yfdBR2DG8qD0KFeWnC3Oo6N+x3BVsqqSxTk2wbw01/pjBcxWZHcKO03CfRVUmQO # NPulTIojsKEhYZF8xXN5Vqjwm8wWMAyAgWJ0X7n+Cry5mcVIZv9TqnrgE3p38dwS # HGS+mWfVQ3CVJoKMrWjLbHNV3P81nJLGsOmPpoPfYNljkEOGm4cpqU2irzUf1RW9 # YrsffSvfO2+xmM6Vund9IZMUOV2ak6XLwdO7By+yeAfslJTfRe20+yw7QjgApBzP # reotbROerVvwzdLBSMvXBuS58mPKHUO7Stn4gTC0v3bhzHkBCkjEcmdV3WEUASrv # 6UvURlFLrY2YM+Vf5nk1MzUIkWnBMXnKW/SExy5NnAOl5Wzaw+rWIykr7+u2V/u1 # dYd25tLYx5vAzaTul8Bhr6hljpWRsyl0lYUShbn7MwSXYWeaPe4pUZQGAvOQRiT7 # hRh1U2XI5zr7dFg/C2fbbJlUwjAsL/+HVRtuZlES/UDEo93ytgtt6kdaZ0Mh4A+h # X9XtiQydHa2PL3he9ePekVbmIX+PCIWXXkSUVdy1B+JIRVuOAaaQhHbmXKgfuGs3 # GRktlKGCAyMwggMfBgkqhkiG9w0BCQYxggMQMIIDDAIBATBqMFUxCzAJBgNVBAYT # AkdCMRgwFgYDVQQKEw9TZWN0aWdvIExpbWl0ZWQxLDAqBgNVBAMTI1NlY3RpZ28g # UHVibGljIFRpbWUgU3RhbXBpbmcgQ0EgUjM2AhEApCk7bh7d16c0CIetek63JDAN # BglghkgBZQMEAgIFAKB5MBgGCSqGSIb3DQEJAzELBgkqhkiG9w0BBwEwHAYJKoZI # hvcNAQkFMQ8XDTI1MDQyMDEzNTE0MFowPwYJKoZIhvcNAQkEMTIEMK9i4/oUlWZi # LfmfJJUjUGSbTIJd/hWh/Vts1D6Wl3tD2SL1MBRtFoXfcjFIgmMiHzANBgkqhkiG # 9w0BAQEFAASCAgA03yoAyW0PElJEkx06l4ttAMgP9phARue0uEneAv7ddDlNtBUI # WgDusH8aoZwqxmgy3jB6CK3+R0Qg0aVMAo9SWuRK++idD1SOhqZJz1wtLLlzBNl+ # 1hgCKvxwawmrhON/xsetMJU4RD+8bNyElzsT8vfzZ1aVkmlM2FZqYr1xqDJkwJMk # J+lKjrLLkByhvpWExG4sO1/2T0iF6yoTN2D0ahApS+f+Unw8UzBu8YgXhkCM7Uxf # VnjQHGzCWIYSO7HNT/yRHmFkwqyM+VynDZlICW62JEG3NdnLgT3rGxXlmUjYX7fY # j285uF18Vyix6vnoli6b9XyhD3E3rIbPjf1ghq8lSPS9xe13Cv23vqExDcSTdf1R # hnlXG/yzus/RrqpKkAp85+m2HLedFY49el20i+W2H/jxp3BPRJt+s5qdFaV9FX1O # ItMDen4xfoYh7Y3bhEAGT+YP6NmSMM0iBbGP2xEBUAPhfJ5Y5VRGXnIxL1g86zYn # IrIm0CA9haO/UmLVk6wimG5vIGqXa6J0XqRDXCUu/eVOG0VxOAn5LZzv6qaEAxuP # UgGOOhYsJu9sG6oj+Kp3QNC8z93JbsbqD5yCVcM11J/Qve9Xx3Ra5+QoAF9Ambnr # fpqdIRre34brUfL456JOnpg0VpYz4P71HCAn4IIpqAzRRTE003Bqggf1WA== # SIG # End signature block