From b468febff7d73b8433671c6de2fc317bfd8e4d0e Mon Sep 17 00:00:00 2001 From: xiongww Date: Wed, 20 Sep 2023 11:21:07 +0800 Subject: [PATCH 1/2] support harbor docker-compose ha design and come true --- cmd/kk/apis/kubekey/v1alpha2/cluster_types.go | 4 +- cmd/kk/pkg/bootstrap/registry/certs.go | 10 +- cmd/kk/pkg/bootstrap/registry/module.go | 16 +- cmd/kk/pkg/bootstrap/registry/tasks.go | 28 +++ .../bootstrap/registry/templates/harbor.go | 14 ++ docs/harbor-ha.md | 229 ++++++++++++++++++ docs/img/harbor_ha01.png | Bin 0 -> 33360 bytes docs/img/harbor_ha02.png | Bin 0 -> 34879 bytes docs/img/harbor_keepalived.png | Bin 0 -> 42537 bytes .../harborCreateRegistriesAndReplications.sh | 64 +++++ scripts/harbor_keepalived/check_harbor.sh | 12 + .../docker-compose-keepalived-backup.yaml | 14 ++ .../docker-compose-keepalived-master.yaml | 14 ++ .../harbor_keepalived/keepalived-backup.conf | 31 +++ .../harbor_keepalived/keepalived-master.conf | 31 +++ 15 files changed, 451 insertions(+), 16 deletions(-) create mode 100644 docs/harbor-ha.md create mode 100644 docs/img/harbor_ha01.png create mode 100644 docs/img/harbor_ha02.png create mode 100644 docs/img/harbor_keepalived.png create mode 100644 scripts/harborCreateRegistriesAndReplications.sh create mode 100644 scripts/harbor_keepalived/check_harbor.sh create mode 100644 scripts/harbor_keepalived/docker-compose-keepalived-backup.yaml create mode 100644 scripts/harbor_keepalived/docker-compose-keepalived-master.yaml create mode 100644 scripts/harbor_keepalived/keepalived-backup.conf create mode 100644 scripts/harbor_keepalived/keepalived-master.conf diff --git a/cmd/kk/apis/kubekey/v1alpha2/cluster_types.go b/cmd/kk/apis/kubekey/v1alpha2/cluster_types.go index b3b3a2c94..62bce91f3 100644 --- a/cmd/kk/apis/kubekey/v1alpha2/cluster_types.go +++ b/cmd/kk/apis/kubekey/v1alpha2/cluster_types.go @@ -173,8 +173,8 @@ func (cfg *ClusterSpec) GroupHosts() map[string][]*KubeHost { if len(roleGroups[Etcd]) == 0 && cfg.Etcd.Type == KubeKey { logger.Log.Fatal(errors.New("The number of etcd cannot be 0")) } - if len(roleGroups[Registry]) > 1 { - logger.Log.Fatal(errors.New("The number of registry node cannot be greater than 1.")) + if len(roleGroups[Registry]) <= 0 { + logger.Log.Fatal(errors.New("The number of registry must be big then 0.")) } for _, host := range roleGroups[ControlPlane] { diff --git a/cmd/kk/pkg/bootstrap/registry/certs.go b/cmd/kk/pkg/bootstrap/registry/certs.go index 794fb22a6..9cd8c1d51 100644 --- a/cmd/kk/pkg/bootstrap/registry/certs.go +++ b/cmd/kk/pkg/bootstrap/registry/certs.go @@ -35,6 +35,8 @@ import ( const ( RegistryCertificateBaseName = "dockerhub.kubekey.local" + HttpPort = "8081" + HttpsPort = "443" LocalCertsDir = "localCertsDir" CertsFileList = "certsFileList" ) @@ -105,9 +107,13 @@ func (g *GenerateCerts) Execute(runtime connector.Runtime) error { var altName cert.AltNames - dnsList := []string{"localhost", g.KubeConf.Cluster.Registry.PrivateRegistry, runtime.GetHostsByRole(common.Registry)[0].GetName()} - ipList := []net.IP{net.IPv4(127, 0, 0, 1), net.IPv6loopback, netutils.ParseIPSloppy(runtime.GetHostsByRole(common.Registry)[0].GetInternalAddress())} + dnsList := []string{"localhost", RegistryCertificateBaseName} + ipList := []net.IP{net.IPv4(127, 0, 0, 1), net.IPv6loopback} + for _, h := range runtime.GetHostsByRole(common.Registry) { + dnsList = append(dnsList, h.GetName()) + ipList = append(ipList, netutils.ParseIPSloppy(h.GetInternalAddress())) + } altName.DNSNames = dnsList altName.IPs = ipList diff --git a/cmd/kk/pkg/bootstrap/registry/module.go b/cmd/kk/pkg/bootstrap/registry/module.go index e948e6f1c..284b88bac 100644 --- a/cmd/kk/pkg/bootstrap/registry/module.go +++ b/cmd/kk/pkg/bootstrap/registry/module.go @@ -250,18 +250,10 @@ func InstallHarbor(i *InstallRegistryModule) []task.Interface { } generateHarborConfig := &task.RemoteTask{ - Name: "GenerateHarborConfig", - Desc: "Generate harbor config", - Hosts: i.Runtime.GetHostsByRole(common.Registry), - Action: &action.Template{ - Template: templates.HarborConfigTempl, - Dst: "/opt/harbor/harbor.yml", - Data: util.Data{ - "Domain": i.KubeConf.Cluster.Registry.PrivateRegistry, - "Certificate": fmt.Sprintf("%s.pem", i.KubeConf.Cluster.Registry.PrivateRegistry), - "Key": fmt.Sprintf("%s-key.pem", i.KubeConf.Cluster.Registry.PrivateRegistry), - }, - }, + Name: "GenerateHarborConfig", + Desc: "Generate harbor config", + Hosts: i.Runtime.GetHostsByRole(common.Registry), + Action: new(GenerateHarborConfig), Parallel: true, Retry: 1, } diff --git a/cmd/kk/pkg/bootstrap/registry/tasks.go b/cmd/kk/pkg/bootstrap/registry/tasks.go index 6c76fb27d..69dc6c0f3 100644 --- a/cmd/kk/pkg/bootstrap/registry/tasks.go +++ b/cmd/kk/pkg/bootstrap/registry/tasks.go @@ -18,6 +18,9 @@ package registry import ( "fmt" + "github.com/kubesphere/kubekey/v3/cmd/kk/pkg/bootstrap/registry/templates" + "github.com/kubesphere/kubekey/v3/cmd/kk/pkg/core/action" + "github.com/kubesphere/kubekey/v3/cmd/kk/pkg/core/util" "path/filepath" "strings" @@ -212,6 +215,31 @@ func (g *SyncHarborPackage) Execute(runtime connector.Runtime) error { return nil } +type GenerateHarborConfig struct { + common.KubeAction +} + +func (g *GenerateHarborConfig) Execute(runtime connector.Runtime) error { + host := runtime.RemoteHost() + templateAction := action.Template{ + Template: templates.HarborConfigTempl, + Dst: "/opt/harbor/harbor.yml", + Data: util.Data{ + "Domain": host.GetName(), + "HttpPort": HttpPort, + "HttpsPort": HttpsPort, + "Certificate": fmt.Sprintf("%s.pem", RegistryCertificateBaseName), + "Key": fmt.Sprintf("%s-key.pem", RegistryCertificateBaseName), + "Password": templates.Password(g.KubeConf, RegistryCertificateBaseName), + }, + } + templateAction.Init(nil, nil) + if err := templateAction.Execute(runtime); err != nil { + return err + } + return nil +} + type StartHarbor struct { common.KubeAction } diff --git a/cmd/kk/pkg/bootstrap/registry/templates/harbor.go b/cmd/kk/pkg/bootstrap/registry/templates/harbor.go index 517a29d65..7e97a46d3 100644 --- a/cmd/kk/pkg/bootstrap/registry/templates/harbor.go +++ b/cmd/kk/pkg/bootstrap/registry/templates/harbor.go @@ -14,6 +14,9 @@ limitations under the License. package templates import ( + "github.com/kubesphere/kubekey/v3/cmd/kk/pkg/common" + "github.com/kubesphere/kubekey/v3/cmd/kk/pkg/registry" + "strings" "text/template" "github.com/lithammer/dedent" @@ -133,3 +136,14 @@ proxy: `))) ) + +func Password(kubeConf *common.KubeConf, domain string) string { + auths := registry.DockerRegistryAuthEntries(kubeConf.Cluster.Registry.Auths) + for repo, entry := range auths { + if strings.Contains(repo, domain) { + return entry.Password + } + } + + return "Harbor12345" +} \ No newline at end of file diff --git a/docs/harbor-ha.md b/docs/harbor-ha.md new file mode 100644 index 000000000..41397a422 --- /dev/null +++ b/docs/harbor-ha.md @@ -0,0 +1,229 @@ +## 一、Harbor 简介 + +Harbor 是由 VMware 公司使用 Go 语言开发,主要就是用于存放镜像使用,同时我们还可以通过 Web 界面来对存放的镜像进行管理。并且 Harbor 提供的功能有:基于角色的访问控制,镜像远程复制同步,以及审计日志等功能。官方文档 + +### 1.Harbor 功能介绍 + +1)基于角色的访问控制: 我们可以通过项目来对用户进行权限划分,项目中可以包含多个镜像。 + +2)审计管理: 我们可以在用户审计管理中,找到我们所有对镜像仓库做的操作。 + +3)镜像复制: 我们可以通过配置,使在两台 Harbor 服务器间实现镜像同步。 + +4)漏洞扫描: Harbor 会定期对仓库中的镜像进行扫描,并进行策略检查,以防止部署出易受到攻击的镜像。 + +### 2.Harbor 高可用方式 + +目前 Harbor 最常见的高可用方式有两种,分别是: + +1)安装两台 Harbor 仓库,他们共同使用一个存储(一般常见的便是 NFS 共享存储) + +![Image](img/harbor_ha01.png?raw=true) + +2)安装两台 Harbor 仓库,并互相配置同步关系。 + +![image](img/harbor_ha02.png?raw=true) + +因为第一种方式的话,需要额外配置 Redis 和 PostgreSQL 以及 NFS 服务,所以我们下面使用第二种方式进行 Harbor 高可用配置。 + +# Harbor镜像仓库高可用方案设计 + +采用2台harbor仓库互为主备的方案,如下图所示 + +![image](img/harbor_keepalived.png?raw=true) + +注意:主备方案 + +由于VIP的浮动,主备节点其实是互为主备;在部署harbor时,需要注意主备节点上的harbor.yml中hostname不要配置为浮动IP(reg.harbor.4a或192.168.10.200),应配置为各自IP或者hostname; +早先,将VIP的域名reg.harbor.4a配置到190和191上的harbor.yml中(hostname: reg.harbor.4a)导致一个问题:只有主节点可做为target被添加,用作镜像同步(也就是无法在主节点的仓库管理中创建备节点的target,即便添加了也无法连通)。 + +准备文件(在源码的script文件夹下,keepalived镜像可以从互联网阿里云镜像仓库下载)如下 + +``` +# tree . +. +├── harborCreateRegistriesAndReplications.sh +├── keepalived21.tar +├── kk +└── harbor_keepalived + ├── check_harbor.sh + ├── docker-compose-keepalived-backup.yaml + ├── docker-compose-keepalived-master.yaml + ├── keepalived-backup.conf + └── keepalived-master.conf + +1 directory, 8 files +``` + +kk: kubekey支持多节点harbor仓库代码(包含本pr)编译生成二进制文件 + +harborCreateRegistriesAndReplications.sh:配置harbor互为主备的脚本 + +keepalived21.tar:keepalived的docker镜像 + +harbor_keepalived:keepalived master和slave的docker-compose部署文件 + +## kubekey部署多节点harbor仓库 + +通过二次开发kubekey源码,实现了kubekey部署harbor仓库支持多节点,并且配置同一套harbor证书。证书中包含所有部署harbor节点的主机名和IP认证设置。 + +后续集成到一键部署脚本中,通过配置registry角色的多个节点来部署多harbor仓库。推荐2个harbor仓库,部署过多占用资源。 + +## harbor仓库互为主备设置 + +harbor仓库部署后,通过调用harbor仓库api建立备份仓库,建立备份规则。 + +例如master1节点上仓库和master2节点仓库配置如下 + +``` +#!/bin/bash + +Harbor_master1_Address=master1:7443 +master1_Address=192.168.122.61 +Harbor_master2_Address=master2:7443 +master2_Address=192.168.122.62 + +Harbor_User=admin #登录Harbor的用户 +Harbor_Passwd="Harbor12345" #登录Harbor的用户密码 +Harbor_UserPwd="$Harbor_User:$Harbor_Passwd" + +# create registry +curl -k -u $Harbor_UserPwd -X POST -H "Content-Type: application/json" "https://${Harbor_master1_Address}/api/v2.0/registries" -d "{\"name\": \"master1_2_master2\", \"type\": \"harbor\", \"url\":\"https://${master2_Address}:7443\", \"credential\": {\"access_key\": \"${Harbor_User}\", \"access_secret\": \"${Harbor_Passwd}\"}, \"insecure\": true}" +# create registry +curl -k -u $Harbor_UserPwd -X POST -H "Content-Type: application/json" "https://${Harbor_master2_Address}/api/v2.0/registries" -d "{\"name\": \"master2_2_master1\", \"type\": \"harbor\", \"url\":\"https://${master1_Address}:7443\", \"credential\": {\"access_key\": \"${Harbor_User}\", \"access_secret\": \"${Harbor_Passwd}\"}, \"insecure\": true}" + +#createReplication +curl -k -u $Harbor_UserPwd -X POST -H "Content-Type: application/json" "https://${Harbor_master1_Address}/api/v2.0/replication/policies" -d "{\"name\": \"master1_2_master2\", \"enabled\": true, \"deletion\":true, \"override\":true, \"replicate_deletion\":true, \"dest_registry\":{ \"id\": 1, \"name\": \"master1_2_master2\"}, \"trigger\": {\"type\": \"event_based\"}, \"dest_namespace_replace_count\":1 }" + +#createReplication +curl -k -u $Harbor_UserPwd -X POST -H "Content-Type: application/json" "https://${Harbor_master2_Address}/api/v2.0/replication/policies" -d "{\"name\": \"master2_2_master1\", \"enabled\": true, \"deletion\":true, \"override\":true, \"replicate_deletion\":true, \"dest_registry\":{ \"id\": 1, \"name\": \"master2_2_master1\"}, \"trigger\": {\"type\": \"event_based\"}, \"dest_namespace_replace_count\":1 }" +``` + +## keepalived管理harbor服务VIP + +使用docker-compose管理keepalived服务 + +keepalived master服务器配置如下 + +``` +# cat docker-compose-keepalived-master.yaml +version: '3.8' + +# Docker-Compose 单容器使用参考 YAML 配置文件 +# 更多配置参数请参考镜像 README.md 文档中说明 +services: + keepalived: + image: 'dockerhub.kubekey.local/kubesphere/keepalived:2.1' + privileged: true + network_mode: host + volumes: + - ./keepalived-master.conf:/srv/conf/keepalived/keepalived.conf + - ./check_harbor.sh:/srv/conf/keepalived/check_harbor.sh + container_name: keepalived + restart: on-failure + +# cat keepalived-master.conf +vrrp_script check_harbor { + script "/srv/conf/keepalived/check_harbor.sh" + interval 10 # 间隔时间,单位为秒,默认1秒 + fall 2 # 脚本几次失败转换为失败 + rise 2 # 脚本连续监测成功后,把服务器从失败标记为成功的次数 + timeout 5 + init_fail +} +global_defs { + script_user root + router_id harbor-ha + enable_script_security + lvs_sync_daemon ens3 VI_1 +} +vrrp_instance VI_1 { + state MASTER + interface ens3 + virtual_router_id 31 # 如果同一个局域网中有多套keepalive,那么要保证该id唯一 + priority 100 + advert_int 1 + authentication { + auth_type PASS + auth_pass k8s-test + } + virtual_ipaddress { + 192.168.122.59 + } + track_script { + check_harbor + } +} +# cat check_harbor.sh +#!/bin/bash +#count=$(docker-compose -f /opt/harbor/docker-compose.yml ps -a|grep healthy|wc -l) +# 不能频繁调用docker-compose 否则会有非常多的临时目录被创建:/tmp/_MEI* +count=$(docker ps |grep goharbor|grep healthy|wc -l) +status=$(ss -tlnp|grep -w 443|wc -l) +if [ $count -ne 11 -a ];then + exit 8 +elif [ $status -lt 2 ];then + exit 9 +else + exit 0 +fi +``` + +keepalived slave服务器跟master区别配置如下 + +1、state BACKUP 与 MASTER + +2、priority master配置为100,slave设置为50 + +``` +# cat docker-compose-keepalived-backup.yaml +version: '3.8' + +# Docker-Compose 单容器使用参考 YAML 配置文件 +# 更多配置参数请参考镜像 README.md 文档中说明 +services: + keepalived: + image: 'dockerhub.kubekey.local/kubesphere/keepalived:2.1' + privileged: true + network_mode: host + volumes: + - ./keepalived-backup.conf:/srv/conf/keepalived/keepalived.conf + - ./check_harbor.sh:/srv/conf/keepalived/check_harbor.sh + container_name: keepalived + restart: on-failure + +# cat keepalived-backup.conf +vrrp_script check_harbor { + script "/srv/conf/keepalived/check_harbor.sh" + interval 10 # 间隔时间,单位为秒,默认1秒 + fall 2 # 脚本几次失败转换为失败 + rise 2 # 脚本连续监测成功后,把服务器从失败标记为成功的次数 + timeout 5 + init_fail +} +global_defs { + script_user root + router_id harbor-ha + enable_script_security + lvs_sync_daemon ens3 VI_1 +} +vrrp_instance VI_1 { + state BACKUP + interface ens3 + virtual_router_id 31 # 如果同一个局域网中有多套keepalive,那么要保证该id唯一 + priority 50 + advert_int 1 + authentication { + auth_type PASS + auth_pass k8s-test + } + virtual_ipaddress { + 192.168.122.59 + } + track_script { + check_harbor + } +} +``` + +经常需要变动的参数是设置keepalived的interface和vip地址值,实际环境下可以参数化keepalived这2个值。 \ No newline at end of file diff --git a/docs/img/harbor_ha01.png b/docs/img/harbor_ha01.png new file mode 100644 index 0000000000000000000000000000000000000000..3778881f3edbaa6e311fbafb039f0ab8336f02ce GIT binary patch literal 33360 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 HFyQ|IEEs=d literal 0 HcmV?d00001 diff --git a/docs/img/harbor_ha02.png b/docs/img/harbor_ha02.png new file mode 100644 index 0000000000000000000000000000000000000000..d64fb62ce2fe40279be6e369f272b53dd5b05e73 GIT binary patch literal 34879 zcmeFYWn7e9_ckoj-93b$f`sJ2NGrn7A(GPF43g3zNDd$>og*MEA}QV7okK{cbU!C} zUC(_#&-;HryC|fC*?yuF)+n}w%97XKu?~PG3OAMiU>_z!S-g@I#2%9&0 z&%?s7!oD5OdG6N69nQ%Rg8fzQ%Q6N@ydd%Lz3F#*>=sYK8#^QWn9m_~Rg5p8%Bj0* z_g(+4R}M9dgM20)W8@xK0$&C7pFf|i8dN3;E>oE@F}|T#`_ZKT{X>LL1fq5{Yf1R` z!R_-8{1ULQDj*UZo5TXESO1PMa<4H4DFgfZU*9)806u?0_Thb#&SRT|{}Kp$2q6LG z{+Aq>3@REFr}aU`_b;6~kN=|>5eOTO2K|pd=@_6PK+X$C8P)=`v0j~(Rs^l%+j#|h z1ynsS>>9@H9cYFLMrP44LOj+3S+K?wiJXtCQhMKnMh@pgcUjv^JL2%G!qI4Wz0?s51#(<(Vc#BN4 zVgYgj5EiSB9*{H##XA9}ErWqziMv_ArU2tph@@HAz>#Z>0}VZ!lL_N7tMYg6)=}Z^ z=qDLUpwa(ZJuDFV{T*l_Boie7fhiftd><*6YDWghVFt`SfQTmdS7hG_;9Xp61SW&z z*4pqy4BXWIQZN*DXlQA;aUjb?%g2@v?ky}g#~VXYyW?%hX%ioa)QtR4c@!; zL?bZ@jGFx9S;qG<#y}U04c>l^#0Y!L}rKwH$V4*hwF;V z^4XmZ&~ra#{YLL^q|pC|diSCJeiy3ja7({iPas3?RYqCR237biRrBcW&1%vSQ88fS ze^T1k3X3stk(j6MhCQu+>nBqFj^1Z;3S~IEulcN|>twudNwN4tlUUQvJA9as1rK{N zhwwKPF2I9>@(d#Wz+zDKted+J7oDrY#Rx>{zdXRzW&P0d@hh?Wh@r$mKXmCQDpHFK z3{oz)3hS@NYp&7_K!`FvhIo8%u)J>66m#&rGgsRNFxQkQe_;*^7cF2kS zU9N?^{NiS1#LASPiR=uT$UAv&eupE$o)j^htLp>)jnQA(uVA*OU8{Gya8y`GX<_#t0JFg+T5~c2X=yCxFHyqx!h?x17wFqk#ew-{Dmkay<55_JEW#%x>I&=i+YZSt8x}Goql9 zkphs%LSXD)?R6-D3(_K&lhc-Fz@wihu{a>gmtRh%r>kfP=Ur^Fh}-M(uh`Mr5<U zFZodM@OK-Aq8X!e$3-n)qFW*MW3Rn zXZj=91ul@-uX`D_y(t6xnbyB1u0ZMVH~8Pi=Y}^8gE5xcMGg! z6i0bsE3tJ;s`2Yp#4n(JQwiQ!@Ix|(Kgx6Y-nFDaEQ^46dyY>2u|3PIxq!w6$Noz`3Fn}4QGwELFiM7G*U4{sot6QsmqK5@PMhP+0 zDsz4S8B(k16n|HIe53?qfPaFw27WZwm;Yb(|GgCdzxiANNp-{5XMyfyLi1W4^{jE% z~NVE3} z$da{(jh?9d`}As#xg6ASa*I{!A2HY$&rJq`xk_Bdy|UFGS!Er*{_=mKBy9Dq8yS2m zFf5k?y)^UO&~JAxynoo5d+j!ITD_yUxhJjPigW= zKa@74v)qA27&@RpaWv#TM*jy4F%z++p=MPo>QhdPGnb}Md-_DtU!Q)%y@PyPf5FNF zS$y|0jPh;m0RK9=62|g0>!Q9M{ms$!#-<@3qfTd|Y86!J+tiQG@h}&qc(fsC=wVOj zHMvRPFXq*BhG0x*_1;lRxo4+=K@XpY0;+CV0Vu2jD)Z8lnglSmC+2` zk54^8PqE5Qi

yuX30IFuLIlfXE;6e>eP!Q6q=i8bnOR@CP+p>QdLppzR0qptT2m z0@&s0uQl8sz|bunPFE!^i-K4NCaoo>%>%|DM=~1{8y~9 zrN?W?UG9!z=8t?U`MDm;r|Qore3#~en9>N-2*EJ3zh+*3Lx~#p>uF?Fl@2Ar*(y|| z4_$29W1G*BSZtiR#}P^!;_pMp!~8?Ad|U6;@1+vM>bH$8heqcrs5|)p%Fgf)VgMs~ zXdnh3LnO}{<4LcQ?zd^j)Ekapk53tf*#-u00z0eKMrw z4qa5spuNI_bs26(D&UYNVfNR96RM~#uTXjGjR!Me4|kHotro=deIjC;JeWK#@IYK) zxiOw>!X!Zric9KfZ_^#1J&|X0)5jdoWsT4t3TY>x9C%U;0ZUqC{O^K+0aN-31Fge# z+aOEBJ7!eR^rO91qEfeRun9E6Mrr&ju>prX@bN>yxklEf$~cB*0sAhU%q2Gs9`_#} zXr^=-fD_!@i>k4E(V&Smijg!h8+;kQ!@(x3t+{%d>!da#+h-hbtgYanlB*Jv`L`7b z=@+)L_g}ejHbit7jCjS|FC#(6pA$iOhUq=(%}t^$h%5hsAdMDmczc{2K#mPGL~PWW z>uC{1>=nlHh-Ox7$U_EBY{0}PVed00sx3-r9&xIy!)anvXNMwEznc)ONZk}=X7a{M zKW2=}B0y9qYpTk*)wt@%o~%3*^Az)h-dYZ+Hf!7raj#OI6?|q_B&9uSX3!@zYT&5e z#2taVUSuer8OF!#+jzdLI#J~y6=Wm->lejCUdIeSNd*yC8qNcQH0qp_>SC|VVHKSuJhUNtrX zSK($1Ec0$-?M2F6DD?M?}%3BsU}o)w5-7p=$5>V&A*s2(lF zmZhJV7HTMVsZQtQV^^+9-xQs*$iE%1!xvSe8NNz`yZIpx-aLMB4(f~83UquRE+PFa z3h!J4A8(K;v#bZ0ihmrYN`yzy zq|zPb>%biphp^D>QvD*=OGgeNydSl8+SL*hZQeKx*>cLWnE$p_A)bo=NzJD7OUMdB zVF&WlR`n(`l$%#^>iDz@=1(t8ba<7G_t6JIGWlt~<3K+JqASIRDi8_n_#z8rX>}<9 zQrA9p8>em=$H6H6;_%d$nwebG>ve*jksE1j-u%Dch0{yLk>L0C6TTW8X}UDbGO)^| zR0NWa=J}Vpv`oST!h_QoDzMSTI>HermFv@ERY8t4EwQQ$z`6FPD%QVXi)Sg}SaK+u zt`Ir$FC-5>)>#?7$&p}`!!b`F)4{Pu;ZB%$cs=08_KII59oLlBd`c)^wV4;zF7kW_iC<$vCdDKb zeVMzrWKp;fA0EAUEWy0a=zWS6+P9uleWp0{W=L7i&ahL=g0zD73s_C>b`?}of|Soj?ORj#Hm4S2kuti0^z1G=-oZ*-Hn zwJ>6Ty-^wG&}^m1Q*HnK%lJAi5<#p@HR%U$FJ7xtf5a+(oelqGnU%gF#(Z68eti^8jk8` zF{Itg;GdPtVA%tU{-_A+p=K7nD&e;$(s+!g?)Sud{8Ftw&obrZR`O&(g~H3VFP&^2 ztiv@j43(#JrK4ECKj|HehRoV|#xdIM@{&LL*jf5W?jdpJjIM84xs$39q>BK$WV$b% z%r47#scqGyhRcMaRA{A}IZHD8Mb6*SfN8?BbnKfww(xPG%6W`cv?*HUnp`zo$B%H5 zsxLkTLn8FmW+V^OAP56HgZhyYwhd15r|Z{@XOc|w9}OOUWP4}-)}8BfnrQ+QMTxUM zp)N^K8AJmThcvnCs}32o)*7O`wOal`IWot0mqftk2sx#5dVQd`^W1lInFIZ;+3Ly( zN5MD$4J(OiPZ_le{uqaT-LObu^W5xWYWj)@5mA zD+XU8MW>PmWd>CUPi`iQP$P0q3`9=^g^q<*4zkIhHj`;Ph8j)Z<(v8 zKt?OqkHoo-w?-HpbOhAIy?D+zC}xq71MV9i9 zGG7_-J~PL_Q9nNFfu+1nq+_n5+Z|`8wHm1`Z7RpFs)3At4jL*}>Cr!zkez2;7iLAg z$Wl&|U}DDLH+2J>>c?GJ4Oe=ZQt_6KKX_(B@1@rM&7O@H2|ZWK>oBzyN3*AoinwAQ z)y?*T@0@_n6b?Nf16b801r?gmC5==Ts&J5@FJx5B3^88jC6Zza<^3jgjL=@Qpiq#{ zeguYTqu&3-JD`wVLPL6)@`nLMc3tzyL6Y1f^~BD}M8{{n-x&I3Z~<1YM5*y}4=sx~ zQC6;YW|$hY&kJPsezZ>rFEp77+}p|56WSlsUs7Z#aV{#)V7V^79w#I%^&qQN()?9) zqthg&7j`s5cb95Qm)rm zve=a6<%SPFor6dyPIOlhi{?linO^;w`!*cL&zOJO@iFSh)bR56RO?*nWB;%EY(wF{ zd~VO+)#`=H8c$=axJ~t2sblKDsfMk}PdE(f;lCemeGx?iQ$ig&lGag@#`Mn7sKlNZ zQZF3rb#{JAm!Mx3r+;g~8$ZNIbru7n0KwjU+KDy;VCb2}DNB_y3l#;=?Ajb_3AWB3 z%iqSl^jse%`n3P4RJzOH)j=v|+gd2nxj_~T6Aih}-{dO>vT|PF?skj%=~n*+LDr&5 z8fST)Y(YDgm%Ida_H9o=Y(4~NP>O*v>(?Y!GjXK^&G)Mfb!FU^f1{6W91U==3E*bq z4+qo0A~C)$itv6<+DKLNfPAFycsp4Lu(4kyY}C^q1;tqRS|;#oj`^E4E++JGPWA*o3e|J(EA;1A^*0N@u7X6os%QybM8((z~RwwJYlX}jrQbYRH@ zJ0t~|K#i@JJ$`N?^Xt$V?~Xf=Vial+vy-q~>zS7o6L2DfJ2uX8o(s|U96`;Gb%f=pErwgiqOK)R0cICBj1Nq&hwg2#D=8sL)Qv1Cxs>FmRGp1$)rB@Ra^Z)P|{` zrWT^CuUZxxbI!gy-4eZ+9M8I|T8w>rAUof-;IGHo6XQ*572?v#|E_Q(Kc62~^bkd@ z$y57u=`@<*bs9`FCAK{)HRW%ZL?Bu3>!pcwnMMrFt73FR*mZZ5OA$aROL;`1@3}#& zxZEL+s}sQ;R5r1t5*yyy1OrD(Yj4a!1V%DCul+QV-+o=jV%&WG>XR~2fd z)yq#tXWmmCmc3>wR`>DApI>>+mh0u$(!R;wq6eFAO2_YKK^u5CkBtN zaC%voGcON1$gQ`IfMwX?tqILYH3m+z_ydSg!UybNbU|*6IN13DiV9uM37{QLF9)lT9pD3xM0BYy_b&1%d1)Z2U0N@FO{rBkX&@!u zIE{no*D`=KRc!eC)~R5rg9B1fKEX4zmsi7Zq>L~BNzRmyGHgUVD%|0A#g^%_7uY%F zcCWHPs@tfrKdZ}Y-WH=$E=tyTi+rMcB@D9tH;-D*Wr4UTfJ zeHEgp3%=yPiQy)T>w0Bjz-X@qUwu~)3?2rU>kJR|@Q<^d6B;WK`$BIOZS%5us$+S6l0^%ea=h0(hW zywP39w_3`dK=2VddTjV1)a}o$Z&cl4oqj%cr~_rwm8-Ed-4=iyG% zGY5HbWH$m3SH)Im)5x^)`^*7#?e7QZ0fetJ{@EO$@c$VIh@T7LKvs{ZGgUNNOQo4SkMh#OUSQg#rgx`P-+63}MvKqktYG_OYYC{%yys!3a$;G^ z-_p5_JRA42@e&hi2O*Z`jx+a?pV1f;KJmPL(It}qxZa{=5KQ#9=8FxtZF-t^@?D5X zL(`XC?YLmR8Y}R!t`Ru)Kn!$_);(@NNXW)X;^bBnpemVBC(mmZHW;dZr9k*KFs)hO2kCABvBErM+88rY$kO8@Fx%#=8$65=n_C z4;*|T%EOV4JH#8ez6dyL{2o!`59@U~K)VfN+tFObZU<_|0v(L({i?^a$tdkXp`;^d z1H9P$g8d4Crv#l6S zfV~6wc4o z(WE@l`LA?GP<#++sWA_y2V?N5Tif}kLC8YDb8d1y(tl!)82oNiQ#%5yfEcPllyc}F z){rY8KHlK?dM}DXCJT`)#mum8#`}lnDdVY!pn=# zljK44(p6UVmQIv%HKN6|BcvBsg7No`eSam2IrR}W?Om1P!)}aBWlh2HD!=B1-5hq*Anx*NM>P%%(zPDrke}e1-<(?{z1Zn?X@0@@ z4o#ZPZFx6Q7%qX0h7AUDSK=b@#8oU@@U*1GlsAHlmt$xW!!7fJD?}3v0^rW3t!FzfwigVW!D>rFL@x=eq zvd6(Kty+A)-`86J#X{FdR9&_>?<)8T|Tp9p1XKl)T&bSIwum6vnk0T* zBktAyP@{Xq=|y1We)ibumSVLQ#3^=b&mZdBJN!D*qK}~8o%>A$@py-cNd=k$FOU(hS>X*z4S7hH(p%Ji=sF{YV!w@$9Bq6n{Cs!tkT7-_?PTwtrzL ze{t6{EI9n!q}Ok0vS-x2t_r1BoFP)}EO(;*D{dkU-l?4wBw7HyKfF(T)8hW3m@j3D zSl|eolqy~AN#b-ApkqIfBxReAbpU%lFbInTCMlv@lR9tB(n61OGWo59={ zG7=N-RBg#(Pa}UC8?Izs%Z5be%>$rM!1!^s*YRVqs}5IMN|JZfpc70(^OOF);Z3jQ-ORct4!TiqXy+qre%@@(2Umz)acKke>ynw?zo;DoHS7~0q0 zNXl;~&~7Xh-)#9EIx|0{_Ahv(@3BR%YsZ~_QTgmQF_gh;?l(Sv-2CV-lw#ir+Oyx+ z?nb^3DUNSWewzr?kkbiAHpTqeUG=dTIWFxN3$ZB{Kpqi@PoA12%)50N+z8FBr9h3P zGwo1OQ!im;N)s;u7*JB?x0EzdQon*!I(VyDbDIJMfx{23S`<1oc0pVEO@!iT=LGNB z4eY?Km&aumgOQ!&#_Rkk6-`CMR6L9nqQC7V&h(MFyH`FOq96D)_6yS3hfSzfMVWjm zToM6$B1k`cGfNO`Lu>eF3SYvN?0WZ1gPY$P{y8RNpkWX;%1Ko+Gu}o7j-|dBE!~Lk zW-=ZT%Qcw~Y=qIBN9cv|{kr6Kw{>6?r(oCj{DfTlI+hZIp}AA+Z*q8Tn%oolqSIfd zo0E%zGAc_SqdlV4y?#M4&lhp%I8rXoUrBtlIq!#o|I|0z`=l{$$#F|YMCpwku5j&F zoTK?Tjn1O_pTagp#uMpyMEd7Fxn9?D2Um2IZ>@o2|Y>Xw*$zc*mio zE{9WO%rD;UlxO8EfrwhxpJT7}KJwCS@7Vfj`X&@5z8k+fcl#~BtHdYZK-)Oz*GC$u zAL7Ni=nl5OaVAq*$uagGr+saKmN#PYVjjxIDc39#uk@oV-FXlyVV|T-z zaFNqM>h`UClY7euJs!!|zaAfSOf50?=C{J3ub=gUrcoQ_HH63Mi^PXiq7;tQjn`k3 z!Y3uNu9j@Xwu)}i-0AHhv1vrOad3uzkqCTg;9h=~X4|m8uquR<`BGkt0e3L5IJ4+% z7JJ<`@(wAIJX?xZEWnfg{FgoC)f_{KdkVj>LAdWF{}dWraQ5gP?@(FaOo`T9Mc_s^ z>lL-dX)sa_=|0(m1@9xf-l;6c2Ju}E4z5PYK`GGBytxn!AkaZ1BG>Gt%jDeWJ$&6v zY0X{jabkzMb2f83t-|ZL-Lh@nR4$CVD^RNMifVYF;&2iWso8$o4!12jP432K@WEEJ z*p#;PBF&iV8^jHKu%hZF=# zk0f_`BuX$vF_YvGRG~FtTYg{SAZeg_)|0hQPQZU@&qb$x8|^E+b}OoxMe#iXxh9Bw zceyW(idQiom z&%2A-*I(-#=}Ro-VQ$hONJfK zB{+g>N7{H`{54@e|Ij$SxFLM)KV`T4BDq<yU2gnSD_w;Zt5RmRP@KLWMWJBwnwa zcMr5gEMCvG0tee0(ISYBHpNGId{Z54Npy}oaVuBO&$Y}{Z5~6$$oIaj2^BV$^pULM zjyMa*K=>yQ(!Chvv^QS<%y*C|)x=zI_aT!OWxr}NXjl=I_7y2JLzz0&jS}d0mXLJ~ zqk}25)Tzf^InGW!f|R{O+YzK1_%Urd`rgM-k#Ob#_gj*|^%+)I9^5lCWTGtn zNAZIrI;KESPZa6TwiZy=6r<~Jbicfef*M)EaHXH>gwQ=l?5mgr-ftfrG|Co(yE4Nu zP_K6@N+#ldqA-X(Mc-riE+9Ywp^BYL%zHF1 zSBM-_!#D5)y)EIq9S_d&(=QJV5BNh>#+!Qu$JGWif-3}?iuqO-l1I}&<9VD7 zcD>hnW<7^CFJA2>NDfK zt?s_ZU|{H`1i~Txkgkq+3*&&dgf-s0Sn|+B9H|u>s=q4u{Vb)RW+SECgTDVw0Rz2MAmHD>F^u6Qq2 zPPmm4nEl?paf$%(PLCY56T@Em@DdaxMHF$-pzOE3p;@YU7Eb0)Pk4=8k-G`@ajPO^ z$yplYQ+8i0p>lK{`YB2X+HRy0|Am*mlR_~EMmdcQ`QooJ_D*0$c*cbuw(CmlsnSFO}E zFzhv@xGm(6rwYd*fU~IH{(b$NLQTF!%XI^RIjij~f@@`%Gk3;MG#1E|xe|@Wc9yK7 z|5ElWF3`d=LQ$UFBd#O%_Soeh(O|G%S=^N2hsk^Bm&Ng@xwch?+DQHSqo$SFwiP7v zljeadUj~zoJ%f_BzsYRnru=@q5N@#aAq;vR&sWK(QJC~$Q8I2EA)x1=jRW7F_KQ~! zEHT~o(v6;{$8P=-LJm<+j^NX_8T>W;>-2KT7nvg_&SYirsZ}CA)BAbbe0J$z@AC&DZWgx!GVVj zeMV||>Ps+`D|+6tTjBsR3kX44COxy#DvNtugx0 zB?$LV0QZBRm;fc_?>qI@wgNR0_*J}vonK0RzbvdE!E4vX>yC{=PzEfW z4ZZxjqZ7gd5PS-jTral>Bs`ucDt=W>2Vmoqh1%#!r>BC1N`c#+af`+YzlCP{8Xn)e zUA@Dpb@z4<0(fq--x7`*l1EK-G{mH(JlC42XJQ~N=3}hN18!?1MBtER^b;qkzth1C zKNaaEUEi07uP1G8DL}VBW`8N(6@|#EAKuR(!FMD&$1Ux61oV>)6qA}efOd%ZaYUqd z@ug3n`r6YcWAGV&Fy?QJ;pC<#OaFUai2hT?EOy<-pE3w4JnI93n{&~EoJTiRXemr_ zSm$d@aa*>BgUp9XM`nPy*NVDtamQZDs2#AX4Wnw&p|{s++weRqpbSR$!oB%P{#iiL z6P0zJo--pJ*)c{YD$FE%Q{)X^9$N5TbTY*a$(WEWCQ1e9emQwGMD7d|%aZ6hk zre_qH8S58cqsJnU-x?9V8(MhByYJuan|ud5@GZm)LSuoRtMgT55B=@zCwH3N_Uc<^ zp;$DiBKKcd@frh_hHt(W3gPr2oK?95V7+$JU?$5|>swD}Vk)(({YsY{7!kbsOWBh1 z511Z;6RP7=`vMRG%IkgJ>^w~0+1rASq?c1A)JAeMv$fY5Iz#J4-4-3TC*ip3eb^1_ zrSxjgSpaRZ;r#qjJp8qcWqC-}dkJy0ezHc=jCe8zF0DRM%mLLVK)nIz0Dv7J`B{a? zg5}Mgs2}STfttGt^yjkM9dB)COG=;|56&Lv z$-{-~T+cIh6P>%ZBv-~vICD>809Bs8v-e+$=8kWP@_#?2nP-B~J3Tc5OpzAFQ!F+C zHapO~9{tmaKKRr(kmo@yQ7Ko?{l6bqpdei9Z%cgts9&_tdAszkFg9WHs4#OGJJ1@5=yj0#8fcP5IsJeYc}~Vzt2PbB=VlD@p{B2TW3>TmI5alVkf{~bb0BeI1F_gg64(Q8VG2OeVvGz@jT^rwq^m}> z_8G`7Q-Kff=h;n>0>lpGzeTafmMq>9Tmyf8E)jw37J?)+J*{5c9$lpt+OjvM_)uuR z+fDH;uF;qr@~7wLUOf13QP)5%AT|agz+^k&9{z;D_HBK(E%835vM}L)8?g_xIgvN+ zTY4$OfO2;^#@j3X=WPY~GfXtQRzxiqj&%cr4JF){YCv;9h|YLJ#`mabo?*X_z20jv zNidpJE2IEWyZWI58)`3l&H8#(7#}qI*kK@FTZ0(na&lW44ff=9 z!hrA6_XEGxp!ud`)ITr8ply;ksa(p3sadUFm#$e_K!TslzBf#lS~H0XWZ3|OV0h4p zef@XSYHq!MF7MVz{k=(G{9l)D@gZMDWxUpL-e;i{D?>3;x~h~RY}x{tJ0_U(_5Olw!daRdYO9@ z{&}-WGn|nL7Pv@x8d^S~Tm)X-Gfui%p6iKXIkETd>uGux{gZcId1%N(T=pPb!|H9` z!!GmsW~ogM_@j1CQ5xIQG%s@>rFXtx-2;1lSmZM~j$>ET+)S%_ea8B4UT9|q_KWwe zXtk}TSvt;zrQT%yAPc`L*bTkm!+AAK^L>@G9UeTj_FCEDnSuNq(}~%(`lD8VffF6l zxwqx~eTy}J>W|9Q+uyX{76J;H6>?SiZeHb`U$!1>f94$XVedESA~`t7`_Y!R~V(8y~_yJ_~hGcE{a9 z8x|#Lx|`qWq9(UkPRxBos@yi6jwjx-KP>Dy>E??3KIvfF<^*xFj%xKuXx+3ueiL&f z4$MyFKDx>6a6SD`cE?w}EK2877e^^BQiN*>)m-bXOVf@H#C@20Ggf_1wUT>Fme0C( zdy9)RSA7?p1z>OEBHs-Y<(r2nRBYtDQRyQTNL1oXHqWpaEKi+#^;TqbB^kWH`PN`8 zl_Ei~V@2Pl=}n7#kEkT20}uN!;J#h;o$kxzKl(fK9`$)*zWZLDX5pWRS5`l-a`jJN z0)F;_^I@(X zbBWUjyJKuoewx*%sXr!m*Cut7u0DpvX>BpzkR^8kZWu3-0TvVArf2lL&W)W=HL!Gy zJ44KU-xd-Fk=h-{dh*@GdRB<#IQaO==p@{HP7yXOHRxGbhxqPCoY}Jq#oCq5mw&{k zxabhC*2Nn6w--R0<<;G^+ziPF+8ztPHLq{Ar+k_s=`|>lbXAaclYq+t^0;pArSv&XYmadn5WJ%%{9#IL|>+rk7kdLYdSBAugGNB z@n2t4xqasnef8n8@a*yJFuGqR8?{u%eNvI++~^W8XZ(9s7@eA{Lz+02xg8)#RZvyz z6P3*;z?-KxLK|*C95X4j*r|StvicMx*_o@y$|^6RRKjpfSt#W?h_M_ejW~TNq?9K7 zYN_JIZBLSrb^1&{F96EG_9*sFP2q8U3lrz)6umf5)kJ>j=s-rH^!KybdfxZu;XKfTuclm%l1ty8BaWa0$Y@6hQRsbRidOb zP69glw`bdT?EoIs1r>AvaQefsE5K3-+vjklOZ+epak7v$*7v}djPPjsn5>ESIr>pU$VpJg@lCYr>MM%Qu$ne#^DiKMK4QxO_+m}F8;^$%yN#Mi#-)}y~imkAvyRg7Sd@mvJ?TOIE2?&UQ zpmp&5OVE5RCZ$rUv((eWFcW&=l*p7bHKMvr?^C<{I`J-^OjqCcdLPUembJUz`MSuf zD77Pg0sRLl{4*)&YQ)jw27-#hPK?+G1|m)rEUw#)D^X%nGE3%IR?8-(t@V4FWKu5| znsU{^bNtAjtIFv*OnD}v_~VylMuYS(&mDZxh&}6Cv*am{>g@s$J8f%h-~SvgtIMwU5e9#w+Av z)&bVsexCd#j|AJg@LWK$b>y5U|2P=@1PJUYsD9CO2~KPj=b!qkO90BvmRVD61{1XBj>YJfFVfj8RorOCjF_- z&53+JleB0(R*3ogc3jH-1>_)i%hnZ+6X|Zl#99)M$ffilVHJ&cAU=Tus$_9vN62|R z)d5S7tR=zx&$wt+Zp_uEx;t;mjK_)f8uka)XD41k^xRBf)UP2a^BYwB``7m<1DCSG zDIFg^#G4j&eSRnzrF}2`R97qfSIK&F)OX*Rm&xMhRU)>NUkb76H}#X|S)=TRK(y1M z;dG)NxpL*n?b9~`rl2NxQ@53t*IP`1--oSXii9R!J)Bg;stl--o6oi)7ZHm&i}_2L z4s8*Y(j?=;G)Q{PTYM2ChH11=|xmdNeS*<() zv}Y0mX3@q)y*o|t9Z^RnK2l1h|JBr2Mzs}mYvW#|IHYJ>DDDJzD_-2SxE3hxZV42M zON&c!cPF^JrntN7m%i`4-@42X)=DyS=Ik@upS_O(s9A$Mc&=|99q3ob=KI#*Bh#G^#RVQl6tbvQ1N66ZJ%#Fd44yxU+P2`dVR>5dH8M>g$=q&IxjM;1Lc9 znIERKTheoKzXtMgeekaA-KcjVy&Ts$^4M=^Ez21V8}Rmz?+gIH8sHC zV)?Yx;=nf-QrsSuF5nXsp?RBnqq=i5C!&4~{QYcO!s)SNg0(*XP>WkD6ELOp#-NUk{kcA|tV`AY zygsx0C=HU@sf>qlCtdG=umv2wfyWrdr|z4ImZBlo-ql+M|3r9>B|ls8dt*~GN(Gyv z;GeNRxHCn?`vRl^B)2Q_19we0O6Dh}b8Rzyl$gLMk#;s(3Zsfu(Cj`k&~xsaXuPZM zkGVuM%L}KiUY4z7d-1VJ?IT7ENc)D5hnXFjS%Exz{?f}&K;%slbUc_FqsKeQ= zk}bdlqRxKgz3BQOElje~i`wSk7?$m58&;*5W@4IP@iCyb+$6lgF0`#jnjtuGGBWGM z5*uU+TDo~?eIFCE8s2!6JHYStHe5MFY%%o`=(0A&RyMu+)F%&gJ3;t7o&oudZyB%i zjjTPjZ|_~^*B~i)Y5VD1Fbt=7Vq1Po&)TG>8a$bpx^>wku z8?M76%ZCm&HWJla5xa}t%A}-c(mu+*M@`sv@A{?v3BUl=6R_GaJV$5A4`u`3djIEG zghk9k=Es**r4tiJE~lARRm1E|ib96PKyQqy!aXDmP^Q@6zRS>Ko};OhKL_sl)qQlF zW-=|^_+QaQQb|hszO&xokIMh%!J@5)_AoF$0wh*h$dZHS4cxZI1GgrM{o8y6zeAyx z4jh}U;8aB)wlf||cD6=;A_ z#f$Al^gH9hk3Q`-jLmkkJ<4LFdz9^{xu&-!au3u@vaG#VWymDSY2m*kQP1@3c>H2k zz@RSg*-};u%wL`arwHYms5#pSa0n zw-s!n=yNt~FYP!Z_ytksTxPL=`=%?WU-*nO+IZ-+N3T9i{iN;hI0Z26F;|ji-5@1M zS<^wR&~15=)|k!@XEoMjGBqXD3r_w!MgNFBa!TbV9NHh)IqUs^CxV}$EWcCldSAbN zSXv>jyG4?@y@pw_%z45#w(S9OmZyO4~kPUS;(6 zTbZ3M+tGp&$RCY0J*}RF7Z5L7wS;urX}%i$d`ty?EH z!^yhPX|^SFTY5iW9^$%Ke+*1YDzAUiu$@tdRSBgu;b~qOrs=-V0X9dnKhP`AUJgI< z>GG-#vzuo7QP@)YAzZ#Z!Tpc{U&Af8Trhhe080e6Tm_j3GOpOQ#0m_dz_Pwo?TG_n z$=0)|(HTAtu>H{TDXr}V7a&%d>wYu-O!nx67Y&{D`3?1VhV41wPb!TC@i+xsH-YMv zA2#R-ZLGVAPHWeUuEqTSejRaKMZwJWIvLv8pkAMIb5aKfPM`1nGe+p%xcmP_=p|Gt zt7oinPSNn=nKBX-&hRecZXyYYvUU3Wx`-oBoiiXv>#|J2_e;=bN@H<{KWl zO};gaJ3LM?*?U*^*Z;On`}IgZ#Z}K`R+4r;k;~Mz?sRe$2j=yx7vO3Iz5yRDSsH5B z5;-HAIc@kj*Hw2kiH!L}@sNa{0phx=sHEKX$M$ot^70@oKRo}K$KhyMtJjhXnN%s$ z*G9R8wW`ul_B`cAESg$}K)i}K&5y!J?PnYoYrYkOl)FMN>UAd-OBO!`WpTiq%_J-51|Mo-6Kv8HZrYd=edWQ`w9?W zXs2OXNve1VoR?IqyMUEF{PVA2OuIRCQ(^pNnusUteF0Z-Bn}bJO`rn4Nd;K(K;$*H zhuQ?_y%izVcWvj)o_E>Ubf4OhymS>Nt*9}on`ZfEROQ)U&t=39YI0P?+0@uKCy6&#gQ}EmHHzn%L2CA)m`0YrW6}7_`13#twO^0o9UIzs^XzYO@UHCGTm60n zw{$2yu`D-)~AM1|p+a{m6Jm zvq}yda$$;ABxP4X_`KI>Z^X~46uj)nR}@YCuDM)rZnMO{WY$frW;S}Ke0?GHPOQ5| zc3KqHXMXG98QdFwYk3!is~%-4mo4pq8N!PO_klAEMO7;G5tU!HIhTr#Q&=zHS_wa6 zwvjgt-@J>{z15LGj-$%`K}B4G({3~rr@*n=w!3G7yZ+N&`PITS;puk&`sMdAMugF< zVXRu~LX*~jwR<-fB8R~~84IbantjAYAx~QmEikGJ=r0pHO@%L5Z#`Qj=>1C3O$>j-IPVo;Hkry4vW+A45>NQBpKb^b16vaX3PVZm zcTpAN=u|~hZ@RRH>m2nH(z$vzE&`e7R0mSRvpcikgH433q;1Bh@@SvGBMCEdNZdO( zn3++^UZ%BRjhtU~M0K9abhx6SrIBa1QdUwCoL;5cUN+tP^(0G|kk#ERx=$mXStF~; z2zA0rAKtR9VqdtyLGE^0DvmbRi#{cBbBrOWn)Ed|b28Cqr%!r8vqw5o=I-_0x4qO4 zy43CENHXshp?AirooPSjWhe)H$%zZJzz=r3-@;UGka6?B>8yGlLApxAH{A?&yvZtq zs$2?tSF{y8{yw~`D_DQI4!0&D%C>LNkj8P^8e)f)E5Ix^=wA9PURy)MpL**Mp{X%* z(=UgFw9_B+Gc|<4DRq&9uL)$lY5|{u4T45v6iWGqoq4z}x?(=tj3dM_lJRQfqK*ct zg7BT^v#b33N^I71TPT0gI32Ze%$nP!-Pb)@2>NBdGrw%QX}fvwsz^<#w8*vYa4fvr zxWurT`IjnATMkT2pioP$5aD(NdO6yHTGa$fem?gYc~6@*bDYx`v&nzZvk0r)ja{-- zBj;5scH2=>0vAti=1U^dpxnm?SX59>ZQhnY>(l6Ica&uoB#g%%&w`uI z?5s>!+r6|ZJ6A!xlr-o1F!5sF?fu(NrM*m6N5R%wR#90Dna$*nqBe_Snwi5AdiBzs z5?~XlWe9ujtgoR^$wSL*y4}brs{!5LUDB65par2{#zE-=r!M&>sxL7#{1Z8D(+7Ok zS7W>WeI6m)Y)!Ug(ymG0*eaGDJ$u6z!|C$@;& zonF!AD{b%GhmI;|VLj{7_#|S_pZnjBPD&ZJ`}cAbOo)uP!QWnfp;GphJW_PGqEcQT zbg{FJ#>gb2AKD3i8+!0~a_{}NoiLR>xkS0_o*i}ivApLfz|0?V8JBRp}8>rDUk#X;oEEAes=+)%p$ho74667o&FNHD# zgM9+$kyU*?7DurMf+Tap`fbY62LGkR#i6Zpa%IzeF8l+yPNFe0(Esh5tF~D*pPdfp zn>O_#Wa(q6PqbP7q%No41Ex3V|1RlgA=sXMV0j@tinuvdeLk8pd*>+)M-*<~FY?Gz zxllOo>TegZ99YF@Ml~sSpXqwMPnI@VaKOKV12aV^Qw;HBy!&~ML37&Q#-D8vbPsp% ztS#bqtgTI(zGO=sH%<-eJ+P2H?r19+P~$14PCMTl`1c=)h!{7ZoQy&jrbP_gcIL2D z4UqxfikxX*!vmwww<8Geeyx8sdwNu^QGb7N??`8+8o_S*sU!7=c?S=(B8QhGz&$C{ zbn%51%|dBs^Pm&YU(fk{FCoTJ!Bge`PCkml2GGJK3CN;$?aC2kVuo}}Yt!mJi zWFMC$uJC$v(h!*e8SQIgc74ZvX^dp;303*CCiL>NnxYkC5FK2^xaw5mlSz2(d{pVf z>7{U8$0p?BM3CTfJKqFrx!CAaFf6HXtEk>FiRGGRMAMA4OvzqE3@l0C6$Jg)@a(EE zgzmj&j~{!b?2`HvXTi@vXk5a5QySsHZ*^^ca5h$ZgjTp18RYe3?kMWl+q4yy}Xw6!Mh zSdAiWYuJomG%4)6d@v?Z`H8k2_DI>khMrK-NMu*%xTc7$f(QKPT>E|UW>z>|EKgvP z#%h0k^zq?wP3;r*wLsp;6^mwf&|rFh(fD1yZ&EtQtWT9uOAKb5K5(%Lk%bsYF*-kV zpWAF-Y_{A|z2quaUEL7b{4$b))6yA^;u5iap=aB7+y-yNbJ*xTaF@J*wF0CgRm$zY z)A9J&DazFn=sZ`yJ8fEW$j3g5!7Uf9dYT&z?Jx+^9I1fRS2xDX6tXba{!{>J9 zh!&K%8FiuMt2L2S#8A|tj6H9DoFjBBy>Qb+0-44fHteRMG)CYJK~q>Pre(2GC^4+F z<`lkoXSP$rtMR@!?(AlB#c5b~mr;O4aJ?dmeJjqUyk|`KDM*|C+^4pdcgzCSdf%Vd zFnXk65hT**xpCItS8WL_=JDw=Y!iwV`>@n#%OXvY0eQXdb!SB$3OCmgiFNMQ(^9ym zUyZ#H~UVAJ%FJx(5fcT^0th)igP9gTK7Y?F|JZ=VO9vvj&dv zc3wXIw4Zga@~J+>*bU)2d@V}it-TmHs|V9UXL%2zMl}xk8KZzhiGuPu^?G+kw}a$o zn_>p|o!}?eZK6<}beGr{lFF8DjCu;F$KDmoAHIoqi{Zpmv~E{0 zEX;IdF(uGOh4(P)u}XdCo82vwxX(##1RM&NjZKWWX0`sW?@Y_{!;F+E^X+wHJ_9|< z#yW>QDf2tj(I3f!%m5Ead7H5p==NW+tA7VBpUpiHFv+cn7i|J`lJ~Z6ILScez4*+Z<=#v_nveVE3)}rg$h=ihisOz+nx=t;J!Z@lz5HR=PUSp|A*)~ z1_lb*IOHzT<)k{CM}{#7bb6e&aWRvp&JJEAwO5nd%&02KK1RKyi{(Z$`Me2H%znvq zk#jsfX5xYWhcu{M6JN&Q?)+z3Ngv>AoPxGAh45YnF15h7D)USDyN{=RFn=p%eK*{A zgkd-$4{mFKkUe6UNpxULkZC;&=Cv|7fMD>pkpta8)y3-r?h>yJ`_W^sgxV>jT7N>Z z4RAwUWs$l3SC6l`1tk@Y2beltMK+P5L$_0zmTsE`Jdn5({=m_b-mqlDz>yl;I5hm8{SDKW9&H1loqGSV>kDk!CE>XfvDdJn0>w!I8OVKva|9?(L1Gi zOWiw`*HB#&$Tf{d^4VW%bRlmX6oZv$?UUySa&wVifGP6pV6gE^8;N5+&9r(SN9mlmB$G0q} zv&_4HaC&;Z8AEC+^U~u)iwgD?#6z!A*#dknA+mO3{Lgmynz38C#c7?+SKs(`o@tx}WuOC}-Q3kUzpVS>yxa=H zol42CV9ZVmoJy=jEyvedr5?_o4-g2R>~P|<=!S)S<)yut z?@2;Nwjt$O;7wx&FY^(U8)}I&e5RAqiwtPv96D>5zOt>2q6yrbL0d9Mjvvcjarui0 zNd120?)KX%n-xK;tgAhr!r^*y-t2?vi6^cc?+Va{`8_$orXa)8oW^eR2U-22z?5)G z#79IFOW9h7QzJi2@hmTtr6Llns~aVE>rG~VO9aSd?PRl~ObJHm%XLDq^uxzbmF(MB zHHzBYKRTVieRXE2i|ITE1m)Jby3fvuCC7zq`rpycpD!_J-pFg>dqDdM(c167qdB$= z=krW{44DgLjZUV$s26bF>nC)WHs41TegH;2gMTR+1pe+4vrV$-`^EunoHL372lZj+ z473-4iO7@%cvCe9?hzni6xa?=uk}WW7%%Zs9zy zY3@A#^j4)iNL@&j>f2CfUdO*dQD{8X0#-i}9T|Bg=ow#~HzGG>iTo1#E!xp%Iy&`7 zM+pVM3nBb_etRomWu7(^&=I2`V^I;BTXqQ#%6xu9Z-p*tYYVV`4fJb^*7-En&P}?ITsyaO`f8GGk+0 z?{L}(`isrfkQ*+R$`;gJg=|_h)M((bXfErIJF7HoD{sTdR}r#b%iL)ml9uBuJ@|eQ zc?WPy&@rEjuH<};Xn%INW9jHSZhCao4~(PB7Mt`F!Me%L`0<$XDH3+$ukQ+bm%um+ zo$;gMczRz1EPS^R0ek|}NYK_p+Q3a9azm-mn^Cp*QJU-~-2Me=WL9RIcn@2g4#=Ru z{L@%QXv5V5ow& zeZyySBU|Z!SNQ84KFHO=_gIQjpUYD-=CQ^ndOsq9906LU&+`yF z=pFd@?*a{l-m7#07zs3^?n{9#AToU(BO`P0)l>HA@ep`7>sE@o`%#OVEZX3af4tFU=|3f>5s4Q2c^nJ zvdz!s&~RXgmCiMmh1O!^o{l!qtlP5kUwL6&DIU+iN}hb>&*(vc_f1siF){IBuMSCX zO;T*ybSRg0pJ@CWf)ecWMx4fJ%YX!eCAT>TzJ$XXcOADR1(fMdt*!*|7h_HSskn2C zRxXXVQY|kut@db78Ba}Xj71SWYiFq)|~N; zvr7>{X6-t@^IU;u@7vSSJdmF_Iq=0#y)Yu~4$Rva?rxhs-DLeEbCcv~!ZWuZQ|QJ^WOcd^d5xvt z*s&8dINq>=kN~sx9ko{Xx7_(qT(93W4$dyPlQSWoO}4|i_4rN6QVa_OZZ^hxo^(y> z+G!gNtbwpy8)}^b%W!UP^>C)Y#Sj^v-Icm`!U zAHo^TA4B@M;AAwfbfOW+(O0LJ!cGc4Rt9p@Sx&0+nqXGJ`%%z33Rfl9GTctFr)XxF?5B%`YKOGu3ayp$rUu(ImrY^Av1PP(u3ZvZB+ zda2L-3*+BZThSloZ!&$KKvVCXGRRC^F{L(Vq8F3K)M03sxzGR>UixkEfP#^?$HLq#M>eh#FaUVc|v3XQC^GM?TNyYFUwxkz5XP*GkzCAX;5(p z0a4<)@`}uT{l%*{BJ`7yU-+_x(a zpn!>q3%vOETO`nQj-A@ak0$UirV4e|gj;K@bBuY;M+4Bo-i@HX#w-dQXc2x31nCKe z+X9v!Y@lVH*srP;^`W#H6)ktIONpT41MYetlV8N&cgY@8NoLs2+JdT^6v-Y{bw*9S zjQg;inRDMH7a?B0jXd1I5ESzuqmo2LaA*O&YKmknI7 zy}+xq_e=P-zdNXZ+iWP?KNsh;TNKJAElbwmHxlG3(;06a;_FFXTF<8V?S=iApLpr5 z_0z&%3T+*Ww3DawqWU}a_Pq>(W~KV(R=pML;jt*XcNe^=?$MPmsNuB>HN%e4u7gG@ z*Lv9J3oa&0r%x_^FWzVFodhDRN`cRN?zEgyz@I)2lkrmnv;mQNAzs;Y1q3)66@br z%L__9DkL8+y2i|H`icO>wjtY z%d_i$XqV9uX*0|-+s0y@%3rO&#(Yw{jk(Pc4$HT#zAb(Xm(V?0+@A4j-Wr#Au9XnH z(NDP%Snj>Q_fC46+FtD*bM|X!^nNiSu5fBR(OzeUPunf*AGfUX!v&6Qge%v5uK9Hn z{*-P=wuSiLA@~40(BS^}xU{&mlvMwJ0JD7qI^#Rz+j|F4|L^GELPP>>(VKlsyu3e* zJc+gWKi~H6z`px8{&(&F{x`dT@xr%6c0LT>$k=1~m?O#WH2-s*|6Ij61G->XNypP!eSFrfewd}I}d zSAs)6$OHo@(-73Boj5d54M3T=kw5!#QV$=y?)B?*VMd(AWX&0&DDi<96e!pBPYA%1 z0+T2kNqm1+!6xpmpr&!YL~R264t+@m2BTG_Y@(IcLxE>5p9s0Ow5fAu3GiOjyN~X~Po>QOy z?es@yyz#kyPtNl-I-nT;#WhqNL1yZ+cNzcuArk1x`olko#`laNIB&`^U7-ve$R<(J zf=e&Hr*VR52&IS5uunAK0{@LM=*Ra6GB3SO1qe&7qr9+*u&MXO%Ks?;6r3v^@hswp zn=; z8WIf2`z550wtP-hp5YIlw019ohO=P5>?kyr)E(DmRW#5S$4;It;!9rMc!Az}+o8Mx zYsD1S#DVCx0rzx}Wa~8jjy0Ew75Uu<^Z~g@aiilS0wMPaxqn0ep+?c4q#i3l_moQC zt4LzoewY>?-z65OYQ*(_-GQjq{pgD~|LDvw6!*-WgjwEOP_Yi7%rZbtrNJzyHlKOt z{RW|n70Rq2p3aXyd+z;~?0PmbJqzl95ejJvKIg1;``pPvdi zyJL7xUVQVhn$^J4*Sa@F31Tm+61Ysw?=Tiw1gTSk3)=1_Hu5bxN=eGO_kz}XXxo&Q!2e= zUGQEa0#;{6x#Gqwc;Zb^)~t`@_aex1dK1pDh?8^rf);2@Exh>rX3m4D^MgEvXaQFO zs=d2A4yU6?;O4^cNvbR8pX8Bo#@p-_U}V#BA{7Sig^tgack}c9&CjG3HDK9TGd3DR zu)D;O^6C|qH3d@-?%E#RU%m0rcjsd6ffJ)+UCvm$MO+VYKX=@Z;>--*oTRCx=$ zpbN8nE6*=1tcMTGk~1X7gMYeRiJy>S6TP4kpwZ2{u0IYkaKY_SjY)|0YIH?Nl2MTll5-%vD?t((ed!@23NDPmpee z4g;f+Ut@8wAz~X%U1E%>4r?7xpOx@gb*kSkdZxdIG%2UhN*D%qbb2B z{d5ZC*}9SU3i7+J2;mlY60t(N1S&aiVskwztuaexxV{L@=mUEHVOo((21w z1`M?c!>q8I&!0p*>mD&Oi)pO>i7bE9J*D^7uf28(&^-zOr=UM?jxWq%I|V4C^ql)| zVxt5ldv~(35EjYzX@TDy9uA>WO0>8NoP33ncq5eQv{YJ9*fup`uS@n}*?#pT^D^LC zxaY62P49Fz-S*&m{?FFo`}61*9!OZ4_rxm$*>8m}$f{|4jvtPmP)}EV_>htfBiGx` zS#osNA#9Wc$bKOj6&)el-=U38e=DkPy83v2ZJ{j2%zQ3itW6GY%`!6muRQt~SL?WO z^TElrklVD?>s3(Sa~lB-X&5&VFI1uBCC2%2tt<9&$F%Fh`@9Fd9OkA@65d;8d%l}( z1n=#%ayIVP=+_m>;^jHndLJ>GqdGf>V^!PN-oH%(eBb3mQ3b6p_}LNe2KaFxFxSztff|kA7yqO*DMD zr@cy)?0&2#2Xvl8vUyCN5gDB)LlIg%*%GIR^J2$?IwxmukU$BH<2PQiP+8~zCa^m$ z_+<)hWw7&na-NF674fg1o=msp-EwO*^KRYK04gWwrrs$DP!@Jnoo`D->&3g@m z;T`^j(MSj@l{fx)cB_=+=rj2}^Y8%TjaU1n2&fSGnNc#@nUR*k=>GO>vcYF4@U#1S z1jt~rbt%g~l?lRluNg=_KZOAr^99(xg*F*eAn{g+wW$Tx2b%eOY}fBY86W9-x_%`? zfvk5#qHLpc(YKuo25uIO!{Qtw?67DZ^L^E)z+7*qEmt=rK;|Q`-qIgT2xH{sN=zYa zFHa1>^82jD%({({Hj)YluT(_H{LQ^uh`? zMM4TS*8>k>{+_QAY{f`wc-juw`2kP@iB9yuTJx_&tj`b0D`@)y!a{poj>n&z?9g85 zc1DdNc-!ybFXG(!obvun3+7ou)m^PzcxZ2i)B5wk>{IWD zkzH1?c|J^Ryh{9NFqW+%EQ9wmH4Xb8&%;hl1v5He91e8uxEVF408!KAG9 zfq_Z)9G9k-PsuA8{uNbgql+#}EL<2Bnf+z2G(K1OubF;_6Z~A;IZzPfeArXwkDMm$J#n4*Iv`!gMWzvDj#c@Z$g`6p^)sko!#Qd}gL37Bu+l7k;*!Y`@LyM}P5~vdlnPHd zpGaWqZKwZJXuV%iFlqkJ>Xxi|O`;cE6WTDbKJ-6k92ag~BnI>U`4KvRuEbW&nd1Mi z0$T|WN%1L?Ve#8S(!YnM1|NX0=)xbc87CJ=t=1JYulG-kzy^er)f~xo8pr3KOHPO3 zspg#Z2GHZsW$aEkVFvA10mDlONiV~Eo>j|G!S6o5Y6isU!kgnC-gIg~OXa!=C`YXW5dNdR7To4yZ>^ z*BGpgoQzYN?xzx9-+yq*fCDDo8=#HG+x|1}Lva%CN1f?sZfGPAr*VobhB>Q(%LW zVoJFw?lzKZyquOhzXZ}kVcrH+aUEr+3O{|{>vnKiu=LL;gMBLIcJ+$2%lIO@JeFgnK7NVdGh>6FTYaB`?@%!@o2bCrsl4x}d+Lz+=)Mxbiu+%s>2YYsX!+-?rk6 z0E}5yF6nE9C5F%rD8bsX=q?mfVMuw(@pL1)oBT5Pe$ZO}jbP{p6+YzK?{;a#)c0Mm z*Cjqw|7HIHMAMb3gUNdqHiinkd1n`}& zi+OcplBMD>m}$Cm2JNrFiBZ*lO;hC{Y9HLlLUo%k-ZGEYA@EmGD)^Wy@E=SUKg~Hap7N z4M#lpGs=hyZ_E!mk18MT--b2H*zL{~b|8H<#K7o(!Sk+(a_z~9xgaeyc@FgrhFno5w^D-Ae;m7Qpg;wbbs^Nu6rvznA7ZGpn z{eD;U<-;$CdU&VAGL_Pej7NBm3>)H1d8&2aAGwKA)qosl* z4v*6(1jOSn;g?IX`&MN{zsqz(+RLS}BNq8F?K*^@)vc-Ic@f|X84Wom1?FwEHw)PE z!6d897+dmcD#bB7^^5ImNp|73Fztm8*ze;Hc;^dCiXLOt^RoN9lkh;Zw%-I%E0QT`>TKLUa|#Uvs>{V~ zefe(e){hWC*nVs4VR=@R;jYT>SUUrnVD$I2nk&STu$JfBpuOpt(v7-7AsqUgSM)`G zLRT-s%YLZXlC4|*pNMnFh&HO?+pbMySq$LL@VULV`&N`443iouEuv>SO6It z04cCvhEmMLfhp>8qv_WdG*wIW<<9tP_pJwsYT@vYd|^yvwOm%X-|oC!XDq}j;%T1- zG+jxiCmj?dv?PeUbhnD=8AW3?1xaWka0n*&2S_v7Y&N0Ax z{5l)z&xFo#=DoC>gWyN{fnl`H!TOcImZDJEZf>>E=nKVmd0|o5aANTh4NMRk1@3fU zwvB>DlVg7l8nby+=f(w#O5`IvXXfi4lOJwc`WlWwtyb69)B{Cd-|g9tq9Q_aj*PiT zeh!R-$ii58p+NJYa3$uRzt8_Vjpe)-K@LQ15B)-fs#A|ENxhg#UV035|3_)Z4SA{q;pj{kvcec9XW?Q$9`vHZD^$}@^5Mp9e*88$* z^i8qp&-Y4cqlgsfyZXnPHRWIy{K0d0tFlp<7WQC78PyFutTcJHnf#5QCi^QgnK|`L zlB)DW^1-RYLls&9+Av%G`T|D-UEL^{w3SFBL@fqldoD&={h6i~;EY_hcnp&eoJx3_ zTzxNQREp({CtOrK5|%H9pcYML-EG|Y1>4oO=_P|%djG6Ge+5?A+V*i4_$4+sx<@ZF zIB8crWj}4p{a>VOdKUF!(!NAS`&YyAZNEw(fO}h9GVG3qR{&Y#Cj;z2OfDylXKrEx zS_E9t_*==#q$A$|9+xj+Iwn+;6tNLerUql6BZ-lO@bMSGINrnR86v3 zVF=DtpSP+86wtc@im{H!uKT~pN}7-yd~t!d$RFidW&XA|JoS6z&1NS%jfY6g!Po8eV|EXaG6|;6VadM`=#sv+y(md9MPYeqMetPWSAt!{<^4^f;?0O zYuaJQ>(9}pskN}zcbEldVpt7bs2Y_4-T@T9&1euyWRW7NwP9iCd_+y3`a@DAPq<@VJcFoS4rco~#qI9nylU^5Wvaj&r@g{uvp zR|^^JWqiGBnUu?E&x;Xub26MjW8$>yK|o{uyt&D3J$Uk$5PYz7P!tF9gRV07bIsvG zctVn{Psg@FB5}TG1_dh0*$t%ZP(r9K0(&v=M4Fupi-CY~ifv&zl;Geo>c- z5k5)_0{|{9QyB(waxGQ0-rtKc$EilWhx^ayG`1AJN)t~cdLKNBI$$$^;(ZWDf*-`RqCE++IvXM_fK=#zxv!WMuv!O)0Hn7fdu5T=DjYx0_e=tTQyNool3{hb|17T`0yH&~j?}`@EVBfN$ z>A?wWR3WS%F%LAdi;|0r=o7_~^obu_jCJ(m0)3p>=I7Zv9m%6EY9=*U>)FNSgDK$K zvsBD8OF~^yL4S6fiW=Z^dUID2c{QD4&>zu*ePj2Eh9#n@F~5HB+_Qf7a!WeLtDZ#~ zWxw9q1Al1jE;M4V0nitCG;X1O<7^_bG^@^GWhZHE!jJ9Y?=XBRDnl_-qOWd?*%h#! zHm0J*_ay=0_Xs-j0~s#i!RR8mrml&EL+&kEt+<}gq37I(|7ak+-AaCRW`ocKJ8>Rr zSVkpfR9K|~?^}X4o%G3Ho4b)~oqBilL*l|8u=iS@!@Z?#Yt$97owjw)MIx1JUjcyZ zC}cEq^M8c$&t#DfZK!I+o6Cb2Q}f5unsug21X?(MnJSJKpSQ2L^8e`{dCAs686oQp zdvu~L0^fOlJJZx*k+C#mS5W*wKcFZX+YT3r=RILJ&=rrk+}NIQtn0yJLcpPQ0g@LBCs#Tpk0pk_jUd3^UmdnBP(oP-$7Sr=)cS^q7nf%Bi^ zES={6Y9SLh9^EPV`2U!f0X|Tl3wRz#jxJtcPKI$_@6mQz;G#(3(U}jWh|e<%ar>(c z?a(&fig%S}rZG85cbY9JuE3H6d_EJ3YS;3+n;O4NyLKs_4q83SUG<+BT@Nb!%4WSF zjZ#3@$O~DLG*Dj` zu07N40)!ft5&_KO9cPBj?T3o}N0Izjopk#ACn?zZzhwGni^HsO1!0(V3F7!D^P5%i iVe0+=Pa;xL-o5r*e2`hDAY6rm{mDrwNtTNn2mL=pS+fTK literal 0 HcmV?d00001 diff --git a/docs/img/harbor_keepalived.png b/docs/img/harbor_keepalived.png new file mode 100644 index 0000000000000000000000000000000000000000..5f001681536591945fb51a0b51a70df456d262c6 GIT binary patch literal 42537 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 literal 0 HcmV?d00001 diff --git a/scripts/harborCreateRegistriesAndReplications.sh b/scripts/harborCreateRegistriesAndReplications.sh new file mode 100644 index 000000000..86375c486 --- /dev/null +++ b/scripts/harborCreateRegistriesAndReplications.sh @@ -0,0 +1,64 @@ +#!/bin/bash + + +function createRegistries() { + + # create registry + curl -k -u $Harbor_UserPwd -X POST -H "Content-Type: application/json" "https://${Harbor_master1_Address}/api/v2.0/registries" -d "{\"name\": \"master1_2_master2\", \"type\": \"harbor\", \"url\":\"https://${master2_Address}:7443\", \"credential\": {\"access_key\": \"${Harbor_User}\", \"access_secret\": \"${Harbor_Passwd}\"}, \"insecure\": true}" + # create registry + curl -k -u $Harbor_UserPwd -X POST -H "Content-Type: application/json" "https://${Harbor_master1_Address}/api/v2.0/registries" -d "{\"name\": \"master1_2_master3\", \"type\": \"harbor\", \"url\":\"https://${master3_Address}:7443\", \"credential\": {\"access_key\": \"${Harbor_User}\", \"access_secret\": \"${Harbor_Passwd}\"}, \"insecure\": true}" + + # create registry + curl -k -u $Harbor_UserPwd -X POST -H "Content-Type: application/json" "https://${Harbor_master2_Address}/api/v2.0/registries" -d "{\"name\": \"master2_2_master1\", \"type\": \"harbor\", \"url\":\"https://${master1_Address}:7443\", \"credential\": {\"access_key\": \"${Harbor_User}\", \"access_secret\": \"${Harbor_Passwd}\"}, \"insecure\": true}" + # create registry + curl -k -u $Harbor_UserPwd -X POST -H "Content-Type: application/json" "https://${Harbor_master2_Address}/api/v2.0/registries" -d "{\"name\": \"master2_2_master3\", \"type\": \"harbor\", \"url\":\"https://${master3_Address}:7443\", \"credential\": {\"access_key\": \"${Harbor_User}\", \"access_secret\": \"${Harbor_Passwd}\"}, \"insecure\": true}" + + # create registry + curl -k -u $Harbor_UserPwd -X POST -H "Content-Type: application/json" "https://${Harbor_master3_Address}/api/v2.0/registries" -d "{\"name\": \"master3_2_master1\", \"type\": \"harbor\", \"url\":\"https://${master1_Address}:7443\", \"credential\": {\"access_key\": \"${Harbor_User}\", \"access_secret\": \"${Harbor_Passwd}\"}, \"insecure\": true}" + # create registry + curl -k -u $Harbor_UserPwd -X POST -H "Content-Type: application/json" "https://${Harbor_master3_Address}/api/v2.0/registries" -d "{\"name\": \"master3_2_master2\", \"type\": \"harbor\", \"url\":\"https://${master2_Address}:7443\", \"credential\": {\"access_key\": \"${Harbor_User}\", \"access_secret\": \"${Harbor_Passwd}\"}, \"insecure\": true}" + +} + +function listRegistries() { + curl -k -u $Harbor_UserPwd -X GET -H "Content-Type: application/json" "https://${Harbor_master1_Address}/api/v2.0/registries" + curl -k -u $Harbor_UserPwd -X GET -H "Content-Type: application/json" "https://${Harbor_master2_Address}/api/v2.0/registries" + curl -k -u $Harbor_UserPwd -X GET -H "Content-Type: application/json" "https://${Harbor_master3_Address}/api/v2.0/registries" + +} + +function createReplication() { + + curl -k -u $Harbor_UserPwd -X POST -H "Content-Type: application/json" "https://${Harbor_master1_Address}/api/v2.0/replication/policies" -d "{\"name\": \"master1_2_master2\", \"enabled\": true, \"deletion\":true, \"override\":true, \"replicate_deletion\":true, \"dest_registry\":{ \"id\": 1, \"name\": \"master1_2_master2\"}, \"trigger\": {\"type\": \"event_based\"}, \"dest_namespace_replace_count\":1 }" + curl -k -u $Harbor_UserPwd -X POST -H "Content-Type: application/json" "https://${Harbor_master1_Address}/api/v2.0/replication/policies" -d "{\"name\": \"master1_2_master3\", \"enabled\": true, \"deletion\":true, \"override\":true, \"replicate_deletion\":true, \"dest_registry\":{ \"id\": 2, \"name\": \"master1_2_master3\"}, \"trigger\": {\"type\": \"event_based\"}, \"dest_namespace_replace_count\":1 }" + + curl -k -u $Harbor_UserPwd -X POST -H "Content-Type: application/json" "https://${Harbor_master2_Address}/api/v2.0/replication/policies" -d "{\"name\": \"master2_2_master1\", \"enabled\": true, \"deletion\":true, \"override\":true, \"replicate_deletion\":true, \"dest_registry\":{ \"id\": 1, \"name\": \"master2_2_master1\"}, \"trigger\": {\"type\": \"event_based\"}, \"dest_namespace_replace_count\":1 }" + curl -k -u $Harbor_UserPwd -X POST -H "Content-Type: application/json" "https://${Harbor_master2_Address}/api/v2.0/replication/policies" -d "{\"name\": \"master2_2_master3\", \"enabled\": true, \"deletion\":true, \"override\":true, \"replicate_deletion\":true, \"dest_registry\":{ \"id\": 2, \"name\": \"master2_2_master3\"}, \"trigger\": {\"type\": \"event_based\"}, \"dest_namespace_replace_count\":1 }" + + curl -k -u $Harbor_UserPwd -X POST -H "Content-Type: application/json" "https://${Harbor_master3_Address}/api/v2.0/replication/policies" -d "{\"name\": \"master3_2_master1\", \"enabled\": true, \"deletion\":true, \"override\":true, \"replicate_deletion\":true, \"dest_registry\":{ \"id\": 1, \"name\": \"master3_2_master1\"}, \"trigger\": {\"type\": \"event_based\"}, \"dest_namespace_replace_count\":1 }" + curl -k -u $Harbor_UserPwd -X POST -H "Content-Type: application/json" "https://${Harbor_master3_Address}/api/v2.0/replication/policies" -d "{\"name\": \"master3_2_master2\", \"enabled\": true, \"deletion\":true, \"override\":true, \"replicate_deletion\":true, \"dest_registry\":{ \"id\": 2, \"name\": \"master3_2_master2\"}, \"trigger\": {\"type\": \"event_based\"}, \"dest_namespace_replace_count\":1 }" +} + +function listReplications() { + + curl -k -u $Harbor_UserPwd -X GET -H "Content-Type: application/json" "https://${Harbor_master1_Address}/api/v2.0/replication/policies" + curl -k -u $Harbor_UserPwd -X GET -H "Content-Type: application/json" "https://${Harbor_master2_Address}/api/v2.0/replication/policies" + curl -k -u $Harbor_UserPwd -X GET -H "Content-Type: application/json" "https://${Harbor_master3_Address}/api/v2.0/replication/policies" +} + +#### main ###### +Harbor_master1_Address=master1:7443 +master1_Address=192.168.122.61 +Harbor_master2_Address=master2:7443 +master2_Address=192.168.122.62 +Harbor_master3_Address=master3:7443 +master3_Address=192.168.122.63 +Harbor_User=admin #登录Harbor的用户 +Harbor_Passwd="Harbor12345" #登录Harbor的用户密码 +Harbor_UserPwd="$Harbor_User:$Harbor_Passwd" + + +createRegistries +listRegistries +createReplication +listReplications diff --git a/scripts/harbor_keepalived/check_harbor.sh b/scripts/harbor_keepalived/check_harbor.sh new file mode 100644 index 000000000..0a3fb0bda --- /dev/null +++ b/scripts/harbor_keepalived/check_harbor.sh @@ -0,0 +1,12 @@ +#!/bin/bash +#count=$(docker-compose -f /opt/harbor/docker-compose.yml ps -a|grep healthy|wc -l) +# 不能频繁调用docker-compose 否则会有非常多的临时目录被创建:/tmp/_MEI* +count=$(docker ps |grep goharbor|grep healthy|wc -l) +status=$(ss -tlnp|grep -w 443|wc -l) +if [ $count -ne 11 -a ];then + exit 8 +elif [ $status -lt 2 ];then + exit 9 +else + exit 0 +fi diff --git a/scripts/harbor_keepalived/docker-compose-keepalived-backup.yaml b/scripts/harbor_keepalived/docker-compose-keepalived-backup.yaml new file mode 100644 index 000000000..7328f96a8 --- /dev/null +++ b/scripts/harbor_keepalived/docker-compose-keepalived-backup.yaml @@ -0,0 +1,14 @@ +version: '3.8' + +# Docker-Compose 单容器使用参考 YAML 配置文件 +# 更多配置参数请参考镜像 README.md 文档中说明 +services: + keepalived: + image: 'registry.cn-shenzhen.aliyuncs.com/colovu/keepalived:2.1' + privileged: true + network_mode: host + volumes: + - ./keepalived-backup.conf:/srv/conf/keepalived/keepalived.conf + - ./check_harbor.sh:/srv/conf/keepalived/check_harbor.sh + container_name: keepalived + restart: on-failure diff --git a/scripts/harbor_keepalived/docker-compose-keepalived-master.yaml b/scripts/harbor_keepalived/docker-compose-keepalived-master.yaml new file mode 100644 index 000000000..64f35aee4 --- /dev/null +++ b/scripts/harbor_keepalived/docker-compose-keepalived-master.yaml @@ -0,0 +1,14 @@ +version: '3.8' + +# Docker-Compose 单容器使用参考 YAML 配置文件 +# 更多配置参数请参考镜像 README.md 文档中说明 +services: + keepalived: + image: 'registry.cn-shenzhen.aliyuncs.com/colovu/keepalived:2.1' + privileged: true + network_mode: host + volumes: + - ./keepalived-master.conf:/srv/conf/keepalived/keepalived.conf + - ./check_harbor.sh:/srv/conf/keepalived/check_harbor.sh + container_name: keepalived + restart: on-failure diff --git a/scripts/harbor_keepalived/keepalived-backup.conf b/scripts/harbor_keepalived/keepalived-backup.conf new file mode 100644 index 000000000..be916c90f --- /dev/null +++ b/scripts/harbor_keepalived/keepalived-backup.conf @@ -0,0 +1,31 @@ +vrrp_script check_harbor { + script "/srv/conf/keepalived/check_harbor.sh" + interval 10 # 间隔时间,单位为秒,默认1秒 + fall 2 # 脚本几次失败转换为失败 + rise 2 # 脚本连续监测成功后,把服务器从失败标记为成功的次数 + timeout 5 + init_fail +} +global_defs { + script_user root + router_id harbor-ha + enable_script_security + lvs_sync_daemon ens3 VI_1 +} +vrrp_instance VI_1 { + state BACKUP + interface ens3 + virtual_router_id 31 # 如果同一个局域网中有多套keepalive,那么要保证该id唯一 + priority 50 + advert_int 1 + authentication { + auth_type PASS + auth_pass k8s-test + } + virtual_ipaddress { + 192.168.122.59 + } + track_script { + check_harbor + } +} diff --git a/scripts/harbor_keepalived/keepalived-master.conf b/scripts/harbor_keepalived/keepalived-master.conf new file mode 100644 index 000000000..de3566e48 --- /dev/null +++ b/scripts/harbor_keepalived/keepalived-master.conf @@ -0,0 +1,31 @@ +vrrp_script check_harbor { + script "/srv/conf/keepalived/check_harbor.sh" + interval 10 # 间隔时间,单位为秒,默认1秒 + fall 2 # 脚本几次失败转换为失败 + rise 2 # 脚本连续监测成功后,把服务器从失败标记为成功的次数 + timeout 5 + init_fail +} +global_defs { + script_user root + router_id harbor-ha + enable_script_security + lvs_sync_daemon ens3 VI_1 +} +vrrp_instance VI_1 { + state MASTER + interface ens3 + virtual_router_id 31 # 如果同一个局域网中有多套keepalive,那么要保证该id唯一 + priority 100 + advert_int 1 + authentication { + auth_type PASS + auth_pass k8s-test + } + virtual_ipaddress { + 192.168.122.59 + } + track_script { + check_harbor + } +} From 12b45319ec08cac528a9b4dec2cbd48c097ce677 Mon Sep 17 00:00:00 2001 From: xiongww Date: Wed, 20 Sep 2023 11:30:23 +0800 Subject: [PATCH 2/2] del unconfig harbor http and https port ,use default port --- cmd/kk/pkg/bootstrap/registry/certs.go | 2 -- cmd/kk/pkg/bootstrap/registry/tasks.go | 2 -- 2 files changed, 4 deletions(-) diff --git a/cmd/kk/pkg/bootstrap/registry/certs.go b/cmd/kk/pkg/bootstrap/registry/certs.go index 9cd8c1d51..8b5918477 100644 --- a/cmd/kk/pkg/bootstrap/registry/certs.go +++ b/cmd/kk/pkg/bootstrap/registry/certs.go @@ -35,8 +35,6 @@ import ( const ( RegistryCertificateBaseName = "dockerhub.kubekey.local" - HttpPort = "8081" - HttpsPort = "443" LocalCertsDir = "localCertsDir" CertsFileList = "certsFileList" ) diff --git a/cmd/kk/pkg/bootstrap/registry/tasks.go b/cmd/kk/pkg/bootstrap/registry/tasks.go index 69dc6c0f3..e3b9e62a4 100644 --- a/cmd/kk/pkg/bootstrap/registry/tasks.go +++ b/cmd/kk/pkg/bootstrap/registry/tasks.go @@ -226,8 +226,6 @@ func (g *GenerateHarborConfig) Execute(runtime connector.Runtime) error { Dst: "/opt/harbor/harbor.yml", Data: util.Data{ "Domain": host.GetName(), - "HttpPort": HttpPort, - "HttpsPort": HttpsPort, "Certificate": fmt.Sprintf("%s.pem", RegistryCertificateBaseName), "Key": fmt.Sprintf("%s-key.pem", RegistryCertificateBaseName), "Password": templates.Password(g.KubeConf, RegistryCertificateBaseName),