New-BCDevContainer.ps1
# Version 1.0.0.0 function New-BCDevContainer { <# .SYNOPSIS Creates BC container .DESCRIPTION Creates BC container .PARAMETER containerName Name of container .PARAMETER BCLicense The path to the license file .PARAMETER version The version for the artificates to download .PARAMETER sqlBackupfile The file path to the SQL bakcup file .Parameter databaseServer Name of database server when using external SQL Server (omit if using database inside the container) .Parameter databaseInstance Name of database instance when using external SQL Server (omit if using database inside the container) .Parameter databasePrefix Prefix of databases when using external SQL Server (omit if using database inside the container) .Parameter databaseName Name of database to connect to when using external SQL Server (omit if using database inside the container) .Parameter includeTestToolkit Specify this parameter to add the test toolkit and the standard tests to the container .Parameter includePerformanceToolkit Include the performance toolkit app (only 17.x and later) .Parameter useTraefik Set the necessary options to make the container work behind a traefik proxy as explained here https://www.axians-infoma.com/techblog/running-multiple-nav-bc-containers-on-an-azure-vm/ .Parameter PublicDnsName Use this parameter to specify which public dns name is pointing to this container. This parameter is necessary if you want to be able to connect to the container from outside the host. .Parameter timeout Specify the number of seconds to wait for activity. Default is 1800 (30 min.). -1 means wait forever. .Parameter enableTaskScheduler Include this switch if you want to do Enable the Task Scheduler .Parameter isolation Isolation mode for the container (default is process isolation if host and container OS match) .Parameter type OnPrem or Sandbox (default is Sandbox) .Parameter useSSL Include this switch if you want to use SSL (https) with a self-signed certificate .Parameter installCertificateOnHost Include this switch if you want to use SSL (https) with a self-signed certificate .Parameter multitenant Setup container for multitenancy by adding this switch .Parameter credential Username and Password for the Container .Parameter databaseCredential Credentials for the database connection when using external SQL Server (omit if using database inside the container) .Parameter replaceExternalDatabases Include this switch to allow New-BcContainer to create/replace databases on the external SQL Server. This parameter is ignored unless databaseServer, databasePrefix and databaseName is specified This parameter uses Remove-BcDatabase and Restore-BcDatabaseFromArtifacts to remove and create the databases Access to the SQL Server on the host must be Windows Authentication .EXAMPLE New-BCDevContainer -containerName BCDev -BCLicense "C:\DockerShare\License\BCDev.flf" -version "16.0" .EXAMPLE New-BCDevContainer -containerName BCDev -BCLicense "C:\DockerShare\License\BCDev.flf" -version "16.0" -sqlBackupfile "C:\DockerShare\mssql\Demo Database NAV (11-0).bak" .EXAMPLE New-BCDevContainer -containerName BCDev -BCLicense "C:\DockerShare\License\BCDev.flf" -version "16.0" -includeTestToolkit .EXAMPLE Remember to activate the SQL login for the database server and to active sql login for the sa user New-BCDevContainer -containerName $containerName -version 17.3 -databaseServer 'host.docker.internal' -databaseName 'cronus' Following code might be need to create the user in the database. New-NavContainerNavUser ` -containerName $containerName ` -Credential $credential ` -ChangePasswordAtNextLogOn:$false ` -PermissionSetId SUPER ` -tenant 'Default' #> [CmdletBinding()] param( [string] $containerName = 'bcdev', [string] $bcLicense = 'https://dynapro.blob.core.windows.net/license/6937402.bclicense', [string] $version, [string] $country = 'no', [string] $sqlBackupfile, [string] $databaseServer, [string] $databaseInstance = '', [string] $databaseName, [string] $databasePrefix = "", [switch] $includeTestToolkit, [switch] $includePerformanceToolkit, [switch] $includeAL, [switch] $includeCSide, [switch] $doNotExportObjectsToText, [switch] $enableSymbolLoading , [switch] $useTraefik, [string] $PublicDnsName, [switch] $enableTaskScheduler, [ValidateSet('', 'process', 'hyperv')] [string] $isolation = "", [ValidateSet('', 'OnPrem', 'Sandbox')] [string] $type = "OnPrem", [switch] $useSSL = $false, [switch] $installCertificateOnHost = $false, [switch] $multitenant, [PSCredential] $credential, [PSCredential] $databaseCredential = $null, [switch] $replaceExternalDatabases ) PROCESS { try { $RootDrive = (get-location).Drive.Root $RootFolderPath = join-path $RootDrive 'DockerShare\' $Authentication = 'NavUserPassword' if ([PSCredential]::IsNullOrEmpty($dbcredentials)) { $dbcredentials = New-Object PSCredential -ArgumentList 'sa', $credential.Password } $additionalParametersString = '-v ' + $RootFolderPath + ':C:\DockerShare' if ([string]::IsNullOrEmpty($sqlBackupfile)) { $additionalParameters = @(("$additionalParametersString")) } else { $additionalParameters = @(("$additionalParametersString"), ('--env bakfile=' + $sqlBackupfile)) } if ([string]::IsNullOrEmpty($version)) { $artifactUrl = Get-BCArtifactUrl -type:$type -country $country -select Latest } else { $artifactUrl = Get-BCArtifactUrl -type:$type -country $country -version $version -select Latest } if ($useTraefik) { $imageName = $artifactUrl if ($imageName.Contains('https://bcartifacts.azureedge.net')) { $imageName = 'bcimage:' + $imageName.Substring('https://bcartifacts.azureedge.net'.Length + 1).Replace('/', '-') } else { $imageName = 'bcimage:' + $imageName.Substring('https://bcartifacts.blob.core.windows.net'.Length + 1).Replace('/', '-') } } if ([string]::IsNullOrEmpty($databaseName)) { New-BCContainer -isolation:$isolation -accept_eula ` -doNotCheckHealth ` -updateHosts ` -artifactUrl $artifactUrl ` -imageName $imageName ` -containerName $containerName ` -auth $Authentication ` -Credential $credential ` -licenseFile $BCLicense ` -additionalParameters @($additionalParameters) ` -useBestContainerOS ` -includeAL:$includeAL ` -useSSL:$useSSL -installCertificateOnHost:$installCertificateOnHost ` -assignPremiumPlan ` -enableTaskScheduler:$enableTaskScheduler ` -includeTestToolkit:$includeTestToolkit ` -includePerformanceToolkit:$includePerformanceToolkit ` -includeCSide:$includeCSide ` -doNotExportObjectsToText:$doNotExportObjectsToText ` -enableSymbolLoading:$enableSymbolLoading ` -useTraefik:$useTraefik ` -multitenant:$multitenant ` -PublicDnsName:$PublicDnsName } else { New-BCContainer -accept_eula ` -doNotCheckHealth ` -updateHosts ` -artifactUrl $artifactUrl ` -imageName $imageName ` -containerName $containerName ` -databaseInstance $databaseInstance ` -databaseServer $databaseServer ` -databaseName $databaseName ` -databaseCredential $dbcredentials ` -auth $Authentication ` -Credential $credential ` -licenseFile $BCLicense ` -additionalParameters @($additionalParameters) ` -useBestContainerOS ` -includeAL:$includeAL ` -useSSL:$useSSL -installCertificateOnHost:$installCertificateOnHost ` -assignPremiumPlan ` -enableTaskScheduler:$enableTaskScheduler ` -includeTestToolkit:$includeTestToolkit ` -includePerformanceToolkit:$includePerformanceToolkit ` -includeCSide:$includeCSide ` -doNotExportObjectsToText:$doNotExportObjectsToText ` -enableSymbolLoading:$enableSymbolLoading ` -useTraefik:$useTraefik ` -multitenant:$multitenant ` -PublicDnsName:$PublicDnsName } } catch [Exception] { "New-BCDevContainer :`n`n " + $_.Exception } finally { # Clean up copied backup file after restore completes successfully } } } Export-ModuleMember -Function New-BCDevContainer # SIG # Begin signature block # MIIVlQYJKoZIhvcNAQcCoIIVhjCCFYICAQExCzAJBgUrDgMCGgUAMGkGCisGAQQB # gjcCAQSgWzBZMDQGCisGAQQBgjcCAR4wJgIDAQAABBAfzDtgWUsITrck0sYpfvNR # AgEAAgEAAgEAAgEAAgEAMCEwCQYFKw4DAhoFAAQUQTiE/1tNKk0JiGpHJ/cGSON/ # l/mgghH1MIIFbzCCBFegAwIBAgIQSPyTtGBVlI02p8mKidaUFjANBgkqhkiG9w0B # AQwFADB7MQswCQYDVQQGEwJHQjEbMBkGA1UECAwSR3JlYXRlciBNYW5jaGVzdGVy # MRAwDgYDVQQHDAdTYWxmb3JkMRowGAYDVQQKDBFDb21vZG8gQ0EgTGltaXRlZDEh # MB8GA1UEAwwYQUFBIENlcnRpZmljYXRlIFNlcnZpY2VzMB4XDTIxMDUyNTAwMDAw # MFoXDTI4MTIzMTIzNTk1OVowVjELMAkGA1UEBhMCR0IxGDAWBgNVBAoTD1NlY3Rp # Z28gTGltaXRlZDEtMCsGA1UEAxMkU2VjdGlnbyBQdWJsaWMgQ29kZSBTaWduaW5n # IFJvb3QgUjQ2MIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAjeeUEiIE # JHQu/xYjApKKtq42haxH1CORKz7cfeIxoFFvrISR41KKteKW3tCHYySJiv/vEpM7 # fbu2ir29BX8nm2tl06UMabG8STma8W1uquSggyfamg0rUOlLW7O4ZDakfko9qXGr # YbNzszwLDO/bM1flvjQ345cbXf0fEj2CA3bm+z9m0pQxafptszSswXp43JJQ8mTH # qi0Eq8Nq6uAvp6fcbtfo/9ohq0C/ue4NnsbZnpnvxt4fqQx2sycgoda6/YDnAdLv # 64IplXCN/7sVz/7RDzaiLk8ykHRGa0c1E3cFM09jLrgt4b9lpwRrGNhx+swI8m2J # mRCxrds+LOSqGLDGBwF1Z95t6WNjHjZ/aYm+qkU+blpfj6Fby50whjDoA7NAxg0P # OM1nqFOI+rgwZfpvx+cdsYN0aT6sxGg7seZnM5q2COCABUhA7vaCZEao9XOwBpXy # bGWfv1VbHJxXGsd4RnxwqpQbghesh+m2yQ6BHEDWFhcp/FycGCvqRfXvvdVnTyhe # Be6QTHrnxvTQ/PrNPjJGEyA2igTqt6oHRpwNkzoJZplYXCmjuQymMDg80EY2NXyc # uu7D1fkKdvp+BRtAypI16dV60bV/AK6pkKrFfwGcELEW/MxuGNxvYv6mUKe4e7id # FT/+IAx1yCJaE5UZkADpGtXChvHjjuxf9OUCAwEAAaOCARIwggEOMB8GA1UdIwQY # MBaAFKARCiM+lvEH7OKvKe+CpX/QMKS0MB0GA1UdDgQWBBQy65Ka/zWWSC8oQEJw # IDaRXBeF5jAOBgNVHQ8BAf8EBAMCAYYwDwYDVR0TAQH/BAUwAwEB/zATBgNVHSUE # DDAKBggrBgEFBQcDAzAbBgNVHSAEFDASMAYGBFUdIAAwCAYGZ4EMAQQBMEMGA1Ud # HwQ8MDowOKA2oDSGMmh0dHA6Ly9jcmwuY29tb2RvY2EuY29tL0FBQUNlcnRpZmlj # YXRlU2VydmljZXMuY3JsMDQGCCsGAQUFBwEBBCgwJjAkBggrBgEFBQcwAYYYaHR0 # cDovL29jc3AuY29tb2RvY2EuY29tMA0GCSqGSIb3DQEBDAUAA4IBAQASv6Hvi3Sa # mES4aUa1qyQKDKSKZ7g6gb9Fin1SB6iNH04hhTmja14tIIa/ELiueTtTzbT72ES+ # BtlcY2fUQBaHRIZyKtYyFfUSg8L54V0RQGf2QidyxSPiAjgaTCDi2wH3zUZPJqJ8 # ZsBRNraJAlTH/Fj7bADu/pimLpWhDFMpH2/YGaZPnvesCepdgsaLr4CnvYFIUoQx # 2jLsFeSmTD1sOXPUC4U5IOCFGmjhp0g4qdE2JXfBjRkWxYhMZn0vY86Y6GnfrDyo # XZ3JHFuu2PMvdM+4fvbXg50RlmKarkUT2n/cR/vfw1Kf5gZV6Z2M8jpiUbzsJA8p # 1FiAhORFe1rYMIIGGjCCBAKgAwIBAgIQYh1tDFIBnjuQeRUgiSEcCjANBgkqhkiG # 9w0BAQwFADBWMQswCQYDVQQGEwJHQjEYMBYGA1UEChMPU2VjdGlnbyBMaW1pdGVk # MS0wKwYDVQQDEyRTZWN0aWdvIFB1YmxpYyBDb2RlIFNpZ25pbmcgUm9vdCBSNDYw # HhcNMjEwMzIyMDAwMDAwWhcNMzYwMzIxMjM1OTU5WjBUMQswCQYDVQQGEwJHQjEY # MBYGA1UEChMPU2VjdGlnbyBMaW1pdGVkMSswKQYDVQQDEyJTZWN0aWdvIFB1Ymxp # YyBDb2RlIFNpZ25pbmcgQ0EgUjM2MIIBojANBgkqhkiG9w0BAQEFAAOCAY8AMIIB # igKCAYEAmyudU/o1P45gBkNqwM/1f/bIU1MYyM7TbH78WAeVF3llMwsRHgBGRmxD # eEDIArCS2VCoVk4Y/8j6stIkmYV5Gej4NgNjVQ4BYoDjGMwdjioXan1hlaGFt4Wk # 9vT0k2oWJMJjL9G//N523hAm4jF4UjrW2pvv9+hdPX8tbbAfI3v0VdJiJPFy/7Xw # iunD7mBxNtecM6ytIdUlh08T2z7mJEXZD9OWcJkZk5wDuf2q52PN43jc4T9OkoXZ # 0arWZVeffvMr/iiIROSCzKoDmWABDRzV/UiQ5vqsaeFaqQdzFf4ed8peNWh1OaZX # nYvZQgWx/SXiJDRSAolRzZEZquE6cbcH747FHncs/Kzcn0Ccv2jrOW+LPmnOyB+t # AfiWu01TPhCr9VrkxsHC5qFNxaThTG5j4/Kc+ODD2dX/fmBECELcvzUHf9shoFvr # n35XGf2RPaNTO2uSZ6n9otv7jElspkfK9qEATHZcodp+R4q2OIypxR//YEb3fkDn # 3UayWW9bAgMBAAGjggFkMIIBYDAfBgNVHSMEGDAWgBQy65Ka/zWWSC8oQEJwIDaR # XBeF5jAdBgNVHQ4EFgQUDyrLIIcouOxvSK4rVKYpqhekzQwwDgYDVR0PAQH/BAQD # AgGGMBIGA1UdEwEB/wQIMAYBAf8CAQAwEwYDVR0lBAwwCgYIKwYBBQUHAwMwGwYD # VR0gBBQwEjAGBgRVHSAAMAgGBmeBDAEEATBLBgNVHR8ERDBCMECgPqA8hjpodHRw # Oi8vY3JsLnNlY3RpZ28uY29tL1NlY3RpZ29QdWJsaWNDb2RlU2lnbmluZ1Jvb3RS # NDYuY3JsMHsGCCsGAQUFBwEBBG8wbTBGBggrBgEFBQcwAoY6aHR0cDovL2NydC5z # ZWN0aWdvLmNvbS9TZWN0aWdvUHVibGljQ29kZVNpZ25pbmdSb290UjQ2LnA3YzAj # BggrBgEFBQcwAYYXaHR0cDovL29jc3Auc2VjdGlnby5jb20wDQYJKoZIhvcNAQEM # BQADggIBAAb/guF3YzZue6EVIJsT/wT+mHVEYcNWlXHRkT+FoetAQLHI1uBy/YXK # ZDk8+Y1LoNqHrp22AKMGxQtgCivnDHFyAQ9GXTmlk7MjcgQbDCx6mn7yIawsppWk # vfPkKaAQsiqaT9DnMWBHVNIabGqgQSGTrQWo43MOfsPynhbz2Hyxf5XWKZpRvr3d # MapandPfYgoZ8iDL2OR3sYztgJrbG6VZ9DoTXFm1g0Rf97Aaen1l4c+w3DC+IkwF # kvjFV3jS49ZSc4lShKK6BrPTJYs4NG1DGzmpToTnwoqZ8fAmi2XlZnuchC4NPSZa # PATHvNIzt+z1PHo35D/f7j2pO1S8BCysQDHCbM5Mnomnq5aYcKCsdbh0czchOm8b # kinLrYrKpii+Tk7pwL7TjRKLXkomm5D1Umds++pip8wH2cQpf93at3VDcOK4N7Ew # oIJB0kak6pSzEu4I64U6gZs7tS/dGNSljf2OSSnRr7KWzq03zl8l75jy+hOds9TW # SenLbjBQUGR96cFr6lEUfAIEHVC1L68Y1GGxx4/eRI82ut83axHMViw1+sVpbPxg # 51Tbnio1lB93079WPFnYaOvfGAA0e0zcfF/M9gXr+korwQTh2Prqooq2bYNMvUoU # KD85gnJ+t0smrWrb8dee2CvYZXD5laGtaAxOfy/VKNmwuWuAh9kcMIIGYDCCBMig # AwIBAgIRANm8nd1n4WvloMcEQ5z43dkwDQYJKoZIhvcNAQEMBQAwVDELMAkGA1UE # BhMCR0IxGDAWBgNVBAoTD1NlY3RpZ28gTGltaXRlZDErMCkGA1UEAxMiU2VjdGln # byBQdWJsaWMgQ29kZSBTaWduaW5nIENBIFIzNjAeFw0yMTEwMjIwMDAwMDBaFw0y # NDEwMjEyMzU5NTlaMEcxCzAJBgNVBAYTAk5PMQ4wDAYDVQQIDAVWaWtlbjETMBEG # A1UECgwKRHluYXBybyBBUzETMBEGA1UEAwwKRHluYXBybyBBUzCCAiIwDQYJKoZI # hvcNAQEBBQADggIPADCCAgoCggIBAODd7SFuO0KPfAVdjt1o/NGqrIZXT7qOqrrL # jI+cheKE/mCHJXFyHWAXgvNz5h++mTAG4bHGDYMYGplt+S3INAm2lnkh3kxerfLP # +kmjaiQ/cT4nXomJkpAXnlVaoSXcJDcWDBDsmkD1+lFjE9nbEdeJOvQ4Q72Cn7OH # sXthZchhiVJfPP0wywFG/uQsCMXgOqUFJwrpvOLOIqTUTH4+ZiwelFeGq4T+CEtF # ic8rL8f6/lYotRv1MoRYsmV7iDnrY7e1drswAiv8bQNi842LfQ62uSCS4cYHpPOt # b3rbqZHzTuL2o9Nqz2NcffwG4mkrKyYiWCvOKKg868z7/jc8uiMSt500SiJyjQA9 # zM0pqH1EbWIUBufpJuSc0TqnxxI0DG9z3m5xGV5Sydz5zfHVWhXP/nXtsf+8dAIT # 1zUEC4HfMtVO/X3NVaZYmYwpmAuscVJCxdm786XLMTe3Nh18v1RdTn28uxr0JnoR # wsmPRoYyJkUb3nbh1q+xMHv75QV3KPlfTe1UwpEs7K9YnOfpXLcJhn0u13ENN5Sm # FNznnfkGxP0jSI5MZ3f2EI7ks1TsjZNeTSznW94hQz36Ttehm8y7uL5ew4jajYeW # 6OUu/zGhJCpZNP2Hfyi0f06ISyJFWkog1Q3G0udZhUYf31pJ6G42ZxqS5ihdPLmG # 1dYLGWd9AgMBAAGjggG4MIIBtDAfBgNVHSMEGDAWgBQPKssghyi47G9IritUpimq # F6TNDDAdBgNVHQ4EFgQUx2vSVcLaMddlQfJKC3538TBe1ecwDgYDVR0PAQH/BAQD # AgeAMAwGA1UdEwEB/wQCMAAwEwYDVR0lBAwwCgYIKwYBBQUHAwMwEQYJYIZIAYb4 # QgEBBAQDAgQQMEoGA1UdIARDMEEwNQYMKwYBBAGyMQECAQMCMCUwIwYIKwYBBQUH # AgEWF2h0dHBzOi8vc2VjdGlnby5jb20vQ1BTMAgGBmeBDAEEATBJBgNVHR8EQjBA # MD6gPKA6hjhodHRwOi8vY3JsLnNlY3RpZ28uY29tL1NlY3RpZ29QdWJsaWNDb2Rl # U2lnbmluZ0NBUjM2LmNybDB5BggrBgEFBQcBAQRtMGswRAYIKwYBBQUHMAKGOGh0 # dHA6Ly9jcnQuc2VjdGlnby5jb20vU2VjdGlnb1B1YmxpY0NvZGVTaWduaW5nQ0FS # MzYuY3J0MCMGCCsGAQUFBzABhhdodHRwOi8vb2NzcC5zZWN0aWdvLmNvbTAaBgNV # HREEEzARgQ9wb3N0QGR5bmFwcm8ubm8wDQYJKoZIhvcNAQEMBQADggGBAAe6J7g+ # cJ7iWZ1DyGKy/2Ber7rIqOeiLi16R3xz8l21++ruItAygqW3JBtLj5cAxCAgJJZe # XlShKQh+fuoSxIWEWCpMC0k8865hZIhjzfX/TKdF4Bs4VsJqha72j412IITjNNnf # ZxfZninStkY2wA1M7D7YZUYEqnN+9UO8iEVO4SY8aKIm4YCXI5LlpDoonXGqY/yA # YBUvMRGutUNBoNWToY8xHeavrEZ/S5CUOzaeRByG9NMYtbfLJjV5APo1Aup0hZWj # 424wSAWt8tkc+wErO/s1yMZqU8lw/ucqXB2WirvJr4zeJMh3RywOscJfxg8WONu0 # UVlHkly6DGurGpqM1ekFIFXVko/RPuaoIhsuTpO9rZTDTcZ5tNej3jzk8scDqOSo # SsgrEDE3XeVXlyZD2p6P2XJzoSdZwfsHRlY/Ji0gyB9dBuxicOmcKk1fxvVgcjm6 # 6wjiMHOrZa2JiIxYtBVGinEEMU83eyq0deVNO1DqZcuLGAyGH4p96dKEYDGCAwow # ggMGAgEBMGkwVDELMAkGA1UEBhMCR0IxGDAWBgNVBAoTD1NlY3RpZ28gTGltaXRl # ZDErMCkGA1UEAxMiU2VjdGlnbyBQdWJsaWMgQ29kZSBTaWduaW5nIENBIFIzNgIR # ANm8nd1n4WvloMcEQ5z43dkwCQYFKw4DAhoFAKB4MBgGCisGAQQBgjcCAQwxCjAI # oAKAAKECgAAwGQYJKoZIhvcNAQkDMQwGCisGAQQBgjcCAQQwHAYKKwYBBAGCNwIB # CzEOMAwGCisGAQQBgjcCARUwIwYJKoZIhvcNAQkEMRYEFBW0LJWOWRoZgzw0Iike # Bk3LGT0uMA0GCSqGSIb3DQEBAQUABIICAGSly6vl11Gb2GvEbA+olYY8LCG7SVr2 # IxKXPIL4yng0Y44PMqCG+hipGoLsuABpr+0jYntipcgZjCRJH4svNZnGVfob56yr # 377ACijnfqqBshGqNZnhDxm3qQXZ4ssi9p04fSQ4M1VntBeH9Pi86Nq1ic233s0A # hTZoc41bVKUTfgjRFK8t+BKfMaGLCdJ2rzGn0Kflpinl9VLf/yE4zxYeiPzgTYui # uA8HQX9Vb0BOKYAbigqNcB71JRJU4qt3YeWWlmeA4cnBU5E10wFDQttOkhNnMFsS # oLGXUZcSr0N5b4DD85V5gl8Gow6Sj5BsZe/1zTKarx0Siu62h6qG8FEyCy6f+KET # 71Szqbzj7u6xV9g9lfXDeBJHOTTfJg5gvkX5EKD72tR6aP0TzzIaipAngFUR8bf0 # W6L4LW/Gs14WMyZGzl+BoVmKTYWhN8IldvAn1L6oBPLsCG9VWwo8oqgkMlpK/5se # kSayc4VVw5xl/1usGjnmg7dQZW4r0L6iObirC7q2pwtg5DothFMo3MJ5EyC3774H # ZH6RlEBEgUWwo1JPB6bTI5L2hbrTgoYuooNnzh0Vda3szFEeh6CIB+YJws4ddgI5 # AXRtc4Cki7Wl0XS0NxSXxbDI3JqeBUNvm80NX3Ccr/9KE8EETSS56dF9QnZ6Ec/G # 3/3MUHivZP0O # SIG # End signature block |