diff --git a/e2e/normal/configuration_test.go b/e2e/normal/configuration_test.go index 89c4a7ff..737c8c29 100644 --- a/e2e/normal/configuration_test.go +++ b/e2e/normal/configuration_test.go @@ -307,14 +307,15 @@ func TestGitCredentialsSecretReference(t *testing.T) { assert.NilError(t, err) pwd, _ := os.Getwd() gitServer := filepath.Join(pwd, "..", "../examples/git-credentials") + gitServerApplyCmd := fmt.Sprintf("kubectl apply -f %s", gitServer) + gitServerDeleteCmd := fmt.Sprintf("kubectl apply -f %s", gitServer) beforeApply := func(ctx *TestContext) { - gitServerCmd := fmt.Sprintf("kubectl apply -f %s", gitServer) - err = exec.Command("bash", "-c", gitServerCmd).Run() + err = exec.Command("bash", "-c", gitServerApplyCmd).Run() assert.NilError(t, err) klog.Info("- Checking git-server pod status") - for i := 0; i < 60; i++ { + for i := 0; i < 120; i++ { pod, _ := clientSet.CoreV1().Pods("default").Get(ctx, "git-server", v1.GetOptions{}) conditions := pod.Status.Conditions var index int @@ -328,12 +329,17 @@ func TestGitCredentialsSecretReference(t *testing.T) { if conditions[index].Status == "True" && conditions[index].Type == coreV1.PodReady { break } - if i == 59 { + if i == 119 { t.Error("git-server pod is not running") } time.Sleep(5 * time.Second) } + podDescribeCmd := "kubectl describe pods" + podDescribe, err := exec.Command("bash", "-c", podDescribeCmd).Output() + assert.NilError(t, err) + klog.Info(podDescribe) + getKnownHostsCmd := "kubectl exec pod/git-server -- ssh-keyscan git-server" knownHosts, err := exec.Command("bash", "-c", getKnownHostsCmd).Output() assert.NilError(t, err) @@ -346,14 +352,12 @@ func TestGitCredentialsSecretReference(t *testing.T) { err = tmpl.Execute(gitSshAuthSecretYamlFile, base64.StdEncoding.EncodeToString(knownHosts)) assert.NilError(t, err) - gitServerCmd = fmt.Sprintf("kubectl apply -f %s", gitServer) - err = exec.Command("bash", "-c", gitServerCmd).Run() + err = exec.Command("bash", "-c", gitServerDeleteCmd).Run() assert.NilError(t, err) } cleanUp := func(ctx *TestContext) { - gitServerCmd := fmt.Sprintf("kubectl delete -f %s", gitServer) - err = exec.Command("bash", "-c", gitServerCmd).Run() + err = exec.Command("bash", "-c", gitServerDeleteCmd).Run() assert.NilError(t, err) } diff --git a/examples/git-credentials/git-push-job.yaml b/examples/git-credentials/git-push-job.yaml index 1a023917..9b68f138 100644 --- a/examples/git-credentials/git-push-job.yaml +++ b/examples/git-credentials/git-push-job.yaml @@ -69,10 +69,6 @@ spec: name: ssh-keys - mountPath: /simple-terraform-module name: simple-terraform-module - resources: - limits: - memory: "128Mi" - cpu: "500m" volumes: - name: ssh-keys secret: diff --git a/examples/git-credentials/git-server-pod.yaml b/examples/git-credentials/git-server-pod.yaml index 4dabb0e0..9c2c8962 100644 --- a/examples/git-credentials/git-server-pod.yaml +++ b/examples/git-credentials/git-server-pod.yaml @@ -43,16 +43,12 @@ spec: name: ssh-keys - mountPath: /tmp/scripts name: init-git-server - resources: - limits: - memory: "128Mi" - cpu: "500m" ports: - containerPort: 22 readinessProbe: tcpSocket: port: 22 - initialDelaySeconds: 10 + initialDelaySeconds: 30 volumes: - name: ssh-keys secret: @@ -69,6 +65,7 @@ apiVersion: v1 kind: Service metadata: name: git-server + namespace: default spec: ports: - port: 22 diff --git a/examples/git-credentials/git-ssh-auth-secret.yaml b/examples/git-credentials/git-ssh-auth-secret.yaml index c78c96c5..22348556 100644 --- a/examples/git-credentials/git-ssh-auth-secret.yaml +++ b/examples/git-credentials/git-ssh-auth-secret.yaml @@ -2,8 +2,9 @@ apiVersion: v1 kind: Secret metadata: name: git-ssh-auth + namespace: default type: kubernetes.io/ssh-auth data: ssh-privatekey: LS0tLS1CRUdJTiBSU0EgUFJJVkFURSBLRVktLS0tLQpNSUlFcEFJQkFBS0NBUUVBbCtDTXIvbXl4eDlrNnJoUTlvbXhEQk1ZemYvMTJwTisvb24zSjJTTTVQUjhndFdOCk1mL2taWmdGQWNHYk55T3o5emI4MFVqTWNKY2lCNXdzNFVBcTJEa2ZzU090dllQbW5Nand2dUJId3p3cmpBcEgKT1ZVN1ozbjQ2VUpya2crUkVoWElVbGRYcXQzellOSllWZXF3MHhTOTBpNFNyR1RLS3VrR1FGQVh1L3Q5YzBERApDNHFGZXk1UXlQYndxMWFhN01uVDlqRHZvdWQxMjhtUnZoSzNSQkxZQjE3SURIQ3o4bURQNllkYVJJLys5MHdTCkh3c0dTdk44K3FtbTdzazFkdkJ2RkhNTllnaDl2S09mbDNuQitOOWlNQ2pOV1BvMFdBZkl1VHVCU0ozMnVHZ3UKdkxSZFJocXVpWlAyenpraEhpSnUzdHlVWDRWWHp2TXMwdSsyY1FJREFRQUJBb0lCQVFDS2ZVZk1iM1NGL2lxWApuZHExOUhocytqejBHeUtrWFRyQUFDNU96WEZzbFVPMFNlYW1ZU0J6UTF2TmJpMks2aE9BcWJOL1kxS0ltRWQvCmlQbWpyRTlsT3pHYTVWM1lJaDUzZVFPT0NoVm1BY2Z6dXF1WHJCQ3ZHcG5PbWJKZFRiU0xPVEdoWStPYyt5YWkKY3l2NXJEZnhRa2lWRDA0WHhSQlVjSWd5dk5Ybm90UHcwbmVEVHhISDN5N3VWL0tLRE9YUjVWdmZ3RzJJelpzRQp0UUNtejRRUHNRYUpLOGdMYk1BTC8xTmcwV0oxUjI0UFhlMzlid3ZqRytnMC9MYmFrcFB4YTJ2Tjc1VmZScEJXCjdaYVd3L2ZGWStwYjdjdENCSGVFQ3E1T1I1L0lOWGJuVEFUMHJKTlM0eEdEeUR6am9hOGtGamR0bGU0bmdKU2YKaG1wbFdxa0JBb0dCQU1Md3pZRDBEMEhxTWswZ3VuWlNsTDBhK3ZzdFF5S1VwOURvTHNSRnFNeEgrakt3c1J4eApWaE1nVzQrTEpSenllV0lPOWJWajkrZUY1SUxsQXo3WithQVNYdjVVdHlVSzJyM1I4N3FCcjFTMDhjS3hlYi9hCjVualBHbkl6aEVTOHNXRExmS2N6MkhYMnF5MWlsL1NNdloyQ2JZMllLYVk4ekNrU1JDQ2FIS2ZGQW9HQkFNZHkKdWhmN29DK0Z6dUtoanUzQ3l0aU1EZGhybDVhWVBmdWxWTHNlamxYR1ZxWU1nZDRXNzg5QTdCbUJZMERzdmh6RwprRnZ0bWhzUEw3RGhEdUZ2bGtvdnVkS25XbTJvUjZqbDFGNkZWSGxzN3lIS3FTQ2R2bjdXL0ZhZSsxL1loOFFSCk8vR2lBY1c2UTJuMHhVOTBVVmwvMnlVZGhHakVKSGN2S3hCcnpCSzlBb0dCQUpqWjdaanVSVVJlMlFBbTZHMjgKaE1uZWJPc2o2MThqQm83RWIxOFFhN0Y1d3BHYWY5VVlmUEJVVDlhMnVPd0FwL0tlWGtUVFZOK2gyYkpVMVgyagp0cHF2clBKcEJJMnovQjRZa0s0dDM0ZGd0YXYrTXNPZlpWVld0cHJURUNSQmZDZTBobElvVWRMMURmVnhPRXJWClRCeEQxNWpOdGVLV0MxTXM4bVJKMHF3dEFvR0FNbFUrcDJ6RitSaEFwS3IyNGdQRm95NTlFLy9iQ3BNekdUMloKQzN2am1idnJCQTZsKzRFNFZjcGhpdkkvTlJSSnlnTkdUUnpDUmsvbnpqQ055OUNZVWZLSFo2VDZTakFzblhBYQp6eHZBdk1BRC9UZ2l4R3RxdHFIVW5wdVNmcGFyZEl5UTN5THVaWkxqRG10S0hBb1R1WTF0cFlrMGNDZ0h0OWc4CmV2RnBWOVVDZ1lBejlmMk9ISzNVR254dDZOOXM0ZVpUak9TVDRSWUVzR0JOZ1pSV0JVc0pHMkRJdkE2Sks3T3QKc3hwTWwzYUpLVWFCWmswS3FReVlrNTkrRTRkeis4UFZjVmN1bGoxQUtYRVR1a3BQaUU3ZFhlTXpjaUxSNUt4YwpvVmFoWVFXSlg0N016aFVTMWxJSVFJcmlsN0JTNmFnbTlnV2NoVkpIVGNHYVY1ZFZBdmI2VXc9PQotLS0tLUVORCBSU0EgUFJJVkFURSBLRVktLS0tLQo= - known_hosts: Z2l0LXNlcnZlciBlY2RzYS1zaGEyLW5pc3RwMjU2IEFBQUFFMlZqWkhOaExYTm9ZVEl0Ym1semRIQXlOVFlBQUFBSWJtbHpkSEF5TlRZQUFBQkJCRVFzeUtPUThxN3lwUmVyaERsR29hTllGMlRWN0pXVnJwL0xBSjNPZmJ1WDB2VWVkSlJQdFlGS2M4QW1QOG5vd3VGZjZrZmJHSlFTLzlHR1pXQ1lvRFk9CmdpdC1zZXJ2ZXIgc3NoLXJzYSBBQUFBQjNOemFDMXljMkVBQUFBREFRQUJBQUFCZ1FDTHZ6UWlhN3pLVGlrL3BESkJUWHNqVjcwVjFIMHJieFkxVHQwQzlTc05oMHNsR2F3c1FtRC9tandta0FPT3IrdUtXUVgxTlIzZStNV01PRmZ1UkZsNlltd0pkT2NweWJ5WTZ3blErU1VCMEU5b3ZMQlJTYktpa1NKNUIzQjM0V2xSUTRiaXJlRUtuYXV5WUVzRndtWGd5U29LQ09RVjI3Y0hmOHRHRnN1YlVMNGJ5YS93bE1mUjhudGtvbDJkS2tiM254MC9BODg4L1p5MG1nclAvSGRDUHpGMU5DVFRKV2J4WE80Vi9DbFRXN1U1MTdmUEFEUy9iWm1MQytLYzU5OEx2WmNLT0laUGFrQk1tK3VpVGpNMDlVSENWQUlucG1wNDJEMm5WTTNxWUxnZWl0SGpqemYwQkJYWEFOL1ducm56clVBYy9BYU80Ty82S2JzRnhQeEFvck1YaVhRU1M0WjFKUXR5Q3RyZlhGTkkrWUdxNUpFR3FTQlRkeVpyV09mVjc0RGJta3NJQ0tySUk5RVNQZ1ZERDFWdmZIb2xEZ3ZpVlhNeTd3RWRTakpVbi9ybmIvRlV5SzJyeUFEVVBVQkMzMmZ1ditYUTdRakhEWC9lUkNjcHBoZm12b1VtV3ZwdmZZMFdkNFE0Z05wRzJiOUg5SFdoc2pYWEtTTjBuRms9CmdpdC1zZXJ2ZXIgc3NoLWVkMjU1MTkgQUFBQUMzTnphQzFsWkRJMU5URTVBQUFBSUVLTzU5TlphcGdpTXNlb2RvQ2tYYzNrcTNKamE1c0Nab3BNT0Y0dTM4YUQK + known_hosts: Z2l0LXNlcnZlciBzc2gtcnNhIEFBQUFCM056YUMxeWMyRUFBQUFEQVFBQkFBQUJnUUNZRmJxc0VNa2doU1dHV0U4WFhFdkpKMXBuSjhjbEt5bUhROUVRY2FZUmppR201L2NKcStNdkdlbmRUKzRTZlNOQTdIUFBTNSsxSXBQZVVmQU1GWC9zTnQzbzNmZi9IbTNaWkRzQXp4MWVGaUZWRU9GbU1xUDhPRXZYRmdZenNTMjlVaitzeS9QckJWK2lFaFhubDVDa1dCbnZzTmo5MGVTN0VyZFlvaEpaTFFucCsyclpBYk1FRUk5Ylh1bUxBME14LzBNRkVmVlJGVEFVT25HT24yT1k0cE1ZYmlhN09IcmtIaE1jenRrZU1yVnZBeWFUM1ljeG1aQ3VrVTIvL1h6UnJ6VmE5ajZDc3FXaW90TVRUTndjUnJBOVNNYnhQWlZFODg0T1AwRU5jSmJYTkcwQnNWZmdGUkI2ckdLbUtTTmtMdlI0WUs2YzhKWE12Y285N0hqZk5ZWVVMNDZFbk4vMlpxR3REVGtvbzNRektDNmJXUHNRMzBTM1VrbElMSVMrdlJZZzVLeEdiTWxuVk9XZHg4bTRXTnhodXlrVno3OXVXVDlMYk9NSVEwQjVIWlI0RDFiWXdrMm03T21aWEZscmRWZkloVXJZRGZhUVdScHIvV2RqNzZ2T1RWb0lyN282SFVaT2pGbCtVS3ZSVFdHWFhYcFd1NjJ0b0pwenFDTT0KZ2l0LXNlcnZlciBlY2RzYS1zaGEyLW5pc3RwMjU2IEFBQUFFMlZqWkhOaExYTm9ZVEl0Ym1semRIQXlOVFlBQUFBSWJtbHpkSEF5TlRZQUFBQkJCS0pnd0tTaitwT1hDQXY1RmFoYTB4WWw3MXF3ZlM0SUVVWkw2bnp5Vjc4QllwZ253YjI3dTByRCtkc3A2cE5vRE9sZENNTUliVWFXbW1GUENhaGkvVDA9CmdpdC1zZXJ2ZXIgc3NoLWVkMjU1MTkgQUFBQUMzTnphQzFsWkRJMU5URTVBQUFBSUMyUC9mUVJPbWdtU1ZHVXdiVXk2cURjVk8rcVdYQVNheVhDaU5MR2Z2U2YK diff --git a/examples/git-credentials/ssh-keys-secret.yaml b/examples/git-credentials/ssh-keys-secret.yaml index 552edbe7..964a9cd6 100644 --- a/examples/git-credentials/ssh-keys-secret.yaml +++ b/examples/git-credentials/ssh-keys-secret.yaml @@ -2,6 +2,7 @@ apiVersion: v1 kind: Secret metadata: name: ssh-keys + namespace: default type: Opaque data: id_rsa: LS0tLS1CRUdJTiBSU0EgUFJJVkFURSBLRVktLS0tLQpNSUlFcEFJQkFBS0NBUUVBbCtDTXIvbXl4eDlrNnJoUTlvbXhEQk1ZemYvMTJwTisvb24zSjJTTTVQUjhndFdOCk1mL2taWmdGQWNHYk55T3o5emI4MFVqTWNKY2lCNXdzNFVBcTJEa2ZzU090dllQbW5Nand2dUJId3p3cmpBcEgKT1ZVN1ozbjQ2VUpya2crUkVoWElVbGRYcXQzellOSllWZXF3MHhTOTBpNFNyR1RLS3VrR1FGQVh1L3Q5YzBERApDNHFGZXk1UXlQYndxMWFhN01uVDlqRHZvdWQxMjhtUnZoSzNSQkxZQjE3SURIQ3o4bURQNllkYVJJLys5MHdTCkh3c0dTdk44K3FtbTdzazFkdkJ2RkhNTllnaDl2S09mbDNuQitOOWlNQ2pOV1BvMFdBZkl1VHVCU0ozMnVHZ3UKdkxSZFJocXVpWlAyenpraEhpSnUzdHlVWDRWWHp2TXMwdSsyY1FJREFRQUJBb0lCQVFDS2ZVZk1iM1NGL2lxWApuZHExOUhocytqejBHeUtrWFRyQUFDNU96WEZzbFVPMFNlYW1ZU0J6UTF2TmJpMks2aE9BcWJOL1kxS0ltRWQvCmlQbWpyRTlsT3pHYTVWM1lJaDUzZVFPT0NoVm1BY2Z6dXF1WHJCQ3ZHcG5PbWJKZFRiU0xPVEdoWStPYyt5YWkKY3l2NXJEZnhRa2lWRDA0WHhSQlVjSWd5dk5Ybm90UHcwbmVEVHhISDN5N3VWL0tLRE9YUjVWdmZ3RzJJelpzRQp0UUNtejRRUHNRYUpLOGdMYk1BTC8xTmcwV0oxUjI0UFhlMzlid3ZqRytnMC9MYmFrcFB4YTJ2Tjc1VmZScEJXCjdaYVd3L2ZGWStwYjdjdENCSGVFQ3E1T1I1L0lOWGJuVEFUMHJKTlM0eEdEeUR6am9hOGtGamR0bGU0bmdKU2YKaG1wbFdxa0JBb0dCQU1Md3pZRDBEMEhxTWswZ3VuWlNsTDBhK3ZzdFF5S1VwOURvTHNSRnFNeEgrakt3c1J4eApWaE1nVzQrTEpSenllV0lPOWJWajkrZUY1SUxsQXo3WithQVNYdjVVdHlVSzJyM1I4N3FCcjFTMDhjS3hlYi9hCjVualBHbkl6aEVTOHNXRExmS2N6MkhYMnF5MWlsL1NNdloyQ2JZMllLYVk4ekNrU1JDQ2FIS2ZGQW9HQkFNZHkKdWhmN29DK0Z6dUtoanUzQ3l0aU1EZGhybDVhWVBmdWxWTHNlamxYR1ZxWU1nZDRXNzg5QTdCbUJZMERzdmh6RwprRnZ0bWhzUEw3RGhEdUZ2bGtvdnVkS25XbTJvUjZqbDFGNkZWSGxzN3lIS3FTQ2R2bjdXL0ZhZSsxL1loOFFSCk8vR2lBY1c2UTJuMHhVOTBVVmwvMnlVZGhHakVKSGN2S3hCcnpCSzlBb0dCQUpqWjdaanVSVVJlMlFBbTZHMjgKaE1uZWJPc2o2MThqQm83RWIxOFFhN0Y1d3BHYWY5VVlmUEJVVDlhMnVPd0FwL0tlWGtUVFZOK2gyYkpVMVgyagp0cHF2clBKcEJJMnovQjRZa0s0dDM0ZGd0YXYrTXNPZlpWVld0cHJURUNSQmZDZTBobElvVWRMMURmVnhPRXJWClRCeEQxNWpOdGVLV0MxTXM4bVJKMHF3dEFvR0FNbFUrcDJ6RitSaEFwS3IyNGdQRm95NTlFLy9iQ3BNekdUMloKQzN2am1idnJCQTZsKzRFNFZjcGhpdkkvTlJSSnlnTkdUUnpDUmsvbnpqQ055OUNZVWZLSFo2VDZTakFzblhBYQp6eHZBdk1BRC9UZ2l4R3RxdHFIVW5wdVNmcGFyZEl5UTN5THVaWkxqRG10S0hBb1R1WTF0cFlrMGNDZ0h0OWc4CmV2RnBWOVVDZ1lBejlmMk9ISzNVR254dDZOOXM0ZVpUak9TVDRSWUVzR0JOZ1pSV0JVc0pHMkRJdkE2Sks3T3QKc3hwTWwzYUpLVWFCWmswS3FReVlrNTkrRTRkeis4UFZjVmN1bGoxQUtYRVR1a3BQaUU3ZFhlTXpjaUxSNUt4YwpvVmFoWVFXSlg0N016aFVTMWxJSVFJcmlsN0JTNmFnbTlnV2NoVkpIVGNHYVY1ZFZBdmI2VXc9PQotLS0tLUVORCBSU0EgUFJJVkFURSBLRVktLS0tLQo= diff --git a/examples/git-credentials/templates/git-ssh-auth-secret.tmpl b/examples/git-credentials/templates/git-ssh-auth-secret.tmpl index ab14a4f1..2a0d9537 100644 --- a/examples/git-credentials/templates/git-ssh-auth-secret.tmpl +++ b/examples/git-credentials/templates/git-ssh-auth-secret.tmpl @@ -2,6 +2,7 @@ apiVersion: v1 kind: Secret metadata: name: git-ssh-auth + namespace: default type: kubernetes.io/ssh-auth data: ssh-privatekey: LS0tLS1CRUdJTiBSU0EgUFJJVkFURSBLRVktLS0tLQpNSUlFcEFJQkFBS0NBUUVBbCtDTXIvbXl4eDlrNnJoUTlvbXhEQk1ZemYvMTJwTisvb24zSjJTTTVQUjhndFdOCk1mL2taWmdGQWNHYk55T3o5emI4MFVqTWNKY2lCNXdzNFVBcTJEa2ZzU090dllQbW5Nand2dUJId3p3cmpBcEgKT1ZVN1ozbjQ2VUpya2crUkVoWElVbGRYcXQzellOSllWZXF3MHhTOTBpNFNyR1RLS3VrR1FGQVh1L3Q5YzBERApDNHFGZXk1UXlQYndxMWFhN01uVDlqRHZvdWQxMjhtUnZoSzNSQkxZQjE3SURIQ3o4bURQNllkYVJJLys5MHdTCkh3c0dTdk44K3FtbTdzazFkdkJ2RkhNTllnaDl2S09mbDNuQitOOWlNQ2pOV1BvMFdBZkl1VHVCU0ozMnVHZ3UKdkxSZFJocXVpWlAyenpraEhpSnUzdHlVWDRWWHp2TXMwdSsyY1FJREFRQUJBb0lCQVFDS2ZVZk1iM1NGL2lxWApuZHExOUhocytqejBHeUtrWFRyQUFDNU96WEZzbFVPMFNlYW1ZU0J6UTF2TmJpMks2aE9BcWJOL1kxS0ltRWQvCmlQbWpyRTlsT3pHYTVWM1lJaDUzZVFPT0NoVm1BY2Z6dXF1WHJCQ3ZHcG5PbWJKZFRiU0xPVEdoWStPYyt5YWkKY3l2NXJEZnhRa2lWRDA0WHhSQlVjSWd5dk5Ybm90UHcwbmVEVHhISDN5N3VWL0tLRE9YUjVWdmZ3RzJJelpzRQp0UUNtejRRUHNRYUpLOGdMYk1BTC8xTmcwV0oxUjI0UFhlMzlid3ZqRytnMC9MYmFrcFB4YTJ2Tjc1VmZScEJXCjdaYVd3L2ZGWStwYjdjdENCSGVFQ3E1T1I1L0lOWGJuVEFUMHJKTlM0eEdEeUR6am9hOGtGamR0bGU0bmdKU2YKaG1wbFdxa0JBb0dCQU1Md3pZRDBEMEhxTWswZ3VuWlNsTDBhK3ZzdFF5S1VwOURvTHNSRnFNeEgrakt3c1J4eApWaE1nVzQrTEpSenllV0lPOWJWajkrZUY1SUxsQXo3WithQVNYdjVVdHlVSzJyM1I4N3FCcjFTMDhjS3hlYi9hCjVualBHbkl6aEVTOHNXRExmS2N6MkhYMnF5MWlsL1NNdloyQ2JZMllLYVk4ekNrU1JDQ2FIS2ZGQW9HQkFNZHkKdWhmN29DK0Z6dUtoanUzQ3l0aU1EZGhybDVhWVBmdWxWTHNlamxYR1ZxWU1nZDRXNzg5QTdCbUJZMERzdmh6RwprRnZ0bWhzUEw3RGhEdUZ2bGtvdnVkS25XbTJvUjZqbDFGNkZWSGxzN3lIS3FTQ2R2bjdXL0ZhZSsxL1loOFFSCk8vR2lBY1c2UTJuMHhVOTBVVmwvMnlVZGhHakVKSGN2S3hCcnpCSzlBb0dCQUpqWjdaanVSVVJlMlFBbTZHMjgKaE1uZWJPc2o2MThqQm83RWIxOFFhN0Y1d3BHYWY5VVlmUEJVVDlhMnVPd0FwL0tlWGtUVFZOK2gyYkpVMVgyagp0cHF2clBKcEJJMnovQjRZa0s0dDM0ZGd0YXYrTXNPZlpWVld0cHJURUNSQmZDZTBobElvVWRMMURmVnhPRXJWClRCeEQxNWpOdGVLV0MxTXM4bVJKMHF3dEFvR0FNbFUrcDJ6RitSaEFwS3IyNGdQRm95NTlFLy9iQ3BNekdUMloKQzN2am1idnJCQTZsKzRFNFZjcGhpdkkvTlJSSnlnTkdUUnpDUmsvbnpqQ055OUNZVWZLSFo2VDZTakFzblhBYQp6eHZBdk1BRC9UZ2l4R3RxdHFIVW5wdVNmcGFyZEl5UTN5THVaWkxqRG10S0hBb1R1WTF0cFlrMGNDZ0h0OWc4CmV2RnBWOVVDZ1lBejlmMk9ISzNVR254dDZOOXM0ZVpUak9TVDRSWUVzR0JOZ1pSV0JVc0pHMkRJdkE2Sks3T3QKc3hwTWwzYUpLVWFCWmswS3FReVlrNTkrRTRkeis4UFZjVmN1bGoxQUtYRVR1a3BQaUU3ZFhlTXpjaUxSNUt4YwpvVmFoWVFXSlg0N016aFVTMWxJSVFJcmlsN0JTNmFnbTlnV2NoVkpIVGNHYVY1ZFZBdmI2VXc9PQotLS0tLUVORCBSU0EgUFJJVkFURSBLRVktLS0tLQo=