From 120e54fb29aeb7c3effa1911a4d386ea52b8f65a Mon Sep 17 00:00:00 2001 From: RockYang Date: Mon, 19 Jun 2023 07:06:59 +0800 Subject: [PATCH] refactor: refactor controller handler module and admin module --- api/go/core/app_server.go | 16 +- api/go/core/config.go | 8 +- api/go/core/types/session.go | 8 +- api/go/handler/admin/admin_handler.go | 66 +++++++ api/go/handler/{ => admin}/api_key_handler.go | 22 +-- api/go/handler/admin_handler.go | 29 --- api/go/handler/base_handler.go | 58 +++++- api/go/handler/chat_handler.go | 47 +++-- api/go/handler/chat_history_handler.go | 10 +- api/go/handler/chat_role_handler.go | 8 +- api/go/handler/config_handler.go | 6 +- api/go/handler/user_handler.go | 37 ++-- api/go/main.go | 34 ++-- api/go/utils/param/param.go | 57 ------ api/go/utils/user.go | 14 +- web/public/index.html | 2 +- web/src/assets/img/admin-login-bg.jpg | Bin 0 -> 102965 bytes web/src/main.js | 47 +---- web/src/utils/storage.js | 85 ++------- web/src/views/Register.vue | 7 +- web/src/views/{ => admin}/Admin.vue | 0 web/src/views/admin/Login.vue | 175 ++++++++++++++++++ 22 files changed, 436 insertions(+), 300 deletions(-) create mode 100644 api/go/handler/admin/admin_handler.go rename api/go/handler/{ => admin}/api_key_handler.go (81%) delete mode 100644 api/go/handler/admin_handler.go delete mode 100644 api/go/utils/param/param.go create mode 100644 web/src/assets/img/admin-login-bg.jpg rename web/src/views/{ => admin}/Admin.vue (100%) create mode 100644 web/src/views/admin/Login.vue diff --git a/api/go/core/app_server.go b/api/go/core/app_server.go index 75188af8..f6828e2d 100644 --- a/api/go/core/app_server.go +++ b/api/go/core/app_server.go @@ -2,7 +2,6 @@ package core import ( "chatplus/core/types" - logger2 "chatplus/logger" "chatplus/store/model" "chatplus/utils" "chatplus/utils/resp" @@ -18,8 +17,6 @@ import ( "strings" ) -var logger = logger2.GetLogger() - type AppServer struct { AppConfig *types.AppConfig Engine *gin.Engine @@ -111,7 +108,7 @@ func corsMiddleware() gin.HandlerFunc { c.Header("Access-Control-Allow-Origin", origin) c.Header("Access-Control-Allow-Methods", "POST, GET, OPTIONS, PUT, DELETE, UPDATE") //允许跨域设置可以返回其他子段,可以自定义字段 - c.Header("Access-Control-Allow-Headers", "Authorization, Content-Length, Content-Type, ChatGPT-TOKEN, ACCESS-KEY") + c.Header("Access-Control-Allow-Headers", "Authorization, Content-Length, Content-Type, ChatGPT-TOKEN, ADMIN-SESSION-TOKEN") // 允许浏览器(客户端)可以解析的头部 (重要) c.Header("Access-Control-Expose-Headers", "Content-Length, Access-Control-Allow-Origin, Access-Control-Allow-Headers") //设置缓存时间 @@ -138,10 +135,10 @@ func corsMiddleware() gin.HandlerFunc { func authorizeMiddleware(s *AppServer) gin.HandlerFunc { return func(c *gin.Context) { if c.Request.URL.Path == "/api/user/login" || + c.Request.URL.Path == "/api/admin/login" || c.Request.URL.Path == "/api/user/register" || c.Request.URL.Path == "/api/apikey/add" || - //c.Request.URL.Path == "/api/apikey/list" { - strings.Contains(c.Request.URL.Path, "/api/config/") { // TODO: 后台 API 暂时放行,用于调试 + c.Request.URL.Path == "/api/apikey/list" { c.Next() return } @@ -158,7 +155,12 @@ func authorizeMiddleware(s *AppServer) gin.HandlerFunc { return } session := sessions.Default(c) - value := session.Get(types.SessionUserId) + var value interface{} + if strings.Contains(c.Request.URL.Path, "/api/admin/") { + value = session.Get(types.SessionAdmin) + } else { + value = session.Get(types.SessionUser) + } if value != nil { c.Next() } else { diff --git a/api/go/core/config.go b/api/go/core/config.go index 12f60c64..06820da6 100644 --- a/api/go/core/config.go +++ b/api/go/core/config.go @@ -3,12 +3,16 @@ package core import ( "bytes" "chatplus/core/types" + logger2 "chatplus/logger" "chatplus/utils" - "github.com/BurntSushi/toml" "net/http" "os" + + "github.com/BurntSushi/toml" ) +var logger = logger2.GetLogger() + func NewDefaultConfig() *types.AppConfig { return &types.AppConfig{ Listen: "0.0.0.0:5678", @@ -17,7 +21,7 @@ func NewDefaultConfig() *types.AppConfig { Session: types.Session{ SecretKey: utils.RandString(64), - Name: "CHAT_SESSION_ID", + Name: "CHAT_PLUS_SESSION", Domain: "", Path: "/", MaxAge: 86400, diff --git a/api/go/core/types/session.go b/api/go/core/types/session.go index 4b75ad7b..ffe6fd21 100644 --- a/api/go/core/types/session.go +++ b/api/go/core/types/session.go @@ -1,5 +1,7 @@ package types -const TokenSessionName = "ChatGPT-TOKEN" -const SessionUserId = "SESSION_USER_ID" -const LoginUserCache = "LOGIN_USER_CACHE" // +const SessionName = "ChatGPT-TOKEN" +const SessionUser = "SESSION_USER" // 存储用户信息的 session key +const SessionAdmin = "SESSION_ADMIN" //存储管理员信息的 session key +const LoginUserCache = "LOGIN_USER_CACHE" // 已登录用户缓存 +const AdminUserCache = "ADMIN_USER_CACHE" // 管理员用户信息缓存 diff --git a/api/go/handler/admin/admin_handler.go b/api/go/handler/admin/admin_handler.go new file mode 100644 index 00000000..c4fa0e0d --- /dev/null +++ b/api/go/handler/admin/admin_handler.go @@ -0,0 +1,66 @@ +package admin + +import ( + "chatplus/core" + "chatplus/core/types" + "chatplus/handler" + logger2 "chatplus/logger" + "chatplus/utils/resp" + + "github.com/gin-contrib/sessions" + + "github.com/gin-gonic/gin" + "gorm.io/gorm" +) + +var logger = logger2.GetLogger() + +type ManagerHandler struct { + handler.BaseHandler + db *gorm.DB +} + +func NewAdminHandler(app *core.AppServer, db *gorm.DB) *ManagerHandler { + h := ManagerHandler{db: db} + h.App = app + return &h +} + +// Login 登录 +func (h *ManagerHandler) Login(c *gin.Context) { + var data types.Manager + if err := c.ShouldBindJSON(&data); err != nil { + resp.ERROR(c, types.InvalidArgs) + return + } + manager := h.App.AppConfig.Manager + if data.Username == manager.Username && data.Password == manager.Password { + manager.Password = "" // 清空密码 + resp.SUCCESS(c, manager) + } else { + resp.ERROR(c, "用户名或者密码错误") + } +} + +// Logout 注销 +func (h *ManagerHandler) Logout(c *gin.Context) { + session := sessions.Default(c) + session.Delete(types.SessionAdmin) + err := session.Save() + if err != nil { + resp.ERROR(c, "Save session failed") + } else { + resp.SUCCESS(c) + } +} + +// Session 会话检测 +func (h *ManagerHandler) Session(c *gin.Context) { + session := sessions.Default(c) + admin := session.Get(types.SessionAdmin) + if admin == nil { + resp.NotAuth(c) + } else { + resp.SUCCESS(c) + } +} diff --git a/api/go/handler/api_key_handler.go b/api/go/handler/admin/api_key_handler.go similarity index 81% rename from api/go/handler/api_key_handler.go rename to api/go/handler/admin/api_key_handler.go index 23a0175f..4dd2d9c9 100644 --- a/api/go/handler/api_key_handler.go +++ b/api/go/handler/admin/api_key_handler.go @@ -1,28 +1,28 @@ -package handler +package admin import ( "chatplus/core" "chatplus/core/types" + "chatplus/handler" "chatplus/store/model" "chatplus/store/vo" "chatplus/utils" - "chatplus/utils/param" "chatplus/utils/resp" + "net/http" + "github.com/gin-gonic/gin" "gorm.io/gorm" - "net/http" ) type ApiKeyHandler struct { - BaseHandler + handler.BaseHandler db *gorm.DB } -func NewApiKeyHandler(config *types.AppConfig, app *core.AppServer, db *gorm.DB) *ApiKeyHandler { - handler := ApiKeyHandler{db: db} - handler.app = app - handler.config = config - return &handler +func NewApiKeyHandler(app *core.AppServer, db *gorm.DB) *ApiKeyHandler { + h := ApiKeyHandler{db: db} + h.App = app + return &h } func (h *ApiKeyHandler) Add(c *gin.Context) { @@ -49,8 +49,8 @@ func (h *ApiKeyHandler) Add(c *gin.Context) { } func (h *ApiKeyHandler) List(c *gin.Context) { - page := param.GetInt(c, "page", 1) - pageSize := param.GetInt(c, "page_size", 20) + page := h.GetInt(c, "page", 1) + pageSize := h.GetInt(c, "page_size", 20) offset := (page - 1) * pageSize var items []model.ApiKey var keys = make([]vo.ApiKey, 0) diff --git a/api/go/handler/admin_handler.go b/api/go/handler/admin_handler.go deleted file mode 100644 index 744607a9..00000000 --- a/api/go/handler/admin_handler.go +++ /dev/null @@ -1,29 +0,0 @@ -package handler - -import ( - "chatplus/core" - "chatplus/core/types" - "github.com/gin-gonic/gin" - "gorm.io/gorm" -) - -type AdminHandler struct { - BaseHandler - db *gorm.DB -} - -func NewAdminHandler(config *types.AppConfig, app *core.AppServer, db *gorm.DB) *AdminHandler { - handler := AdminHandler{db: db} - handler.app = app - handler.config = config - return &handler -} - -// Login 登录 -func (h *AdminHandler) Login(c *gin.Context) { - -} - -// Logout 注销 -func (h *AdminHandler) Logout(c *gin.Context) { -} diff --git a/api/go/handler/base_handler.go b/api/go/handler/base_handler.go index 786cb47e..303163bf 100644 --- a/api/go/handler/base_handler.go +++ b/api/go/handler/base_handler.go @@ -2,13 +2,65 @@ package handler import ( "chatplus/core" - "chatplus/core/types" logger2 "chatplus/logger" + "strconv" + "strings" + + "github.com/gin-gonic/gin" ) var logger = logger2.GetLogger() type BaseHandler struct { - app *core.AppServer - config *types.AppConfig + App *core.AppServer +} + +func (h *BaseHandler) GetTrim(c *gin.Context, key string) string { + return strings.TrimSpace(c.Query(key)) +} + +func (h *BaseHandler) PostInt(c *gin.Context, key string, defaultValue int) int { + return intValue(c.PostForm(key), defaultValue) +} + +func (h *BaseHandler) GetInt(c *gin.Context, key string, defaultValue int) int { + return intValue(c.Query(key), defaultValue) +} + +func intValue(str string, defaultValue int) int { + value, err := strconv.Atoi(str) + if err != nil { + return defaultValue + } + return value +} + +func (h *BaseHandler) GetFloat(c *gin.Context, key string) float64 { + return floatValue(c.Query(key)) +} +func (h *BaseHandler) PostFloat(c *gin.Context, key string) float64 { + return floatValue(c.PostForm(key)) +} + +func floatValue(str string) float64 { + value, err := strconv.ParseFloat(str, 64) + if err != nil { + return 0 + } + return value +} + +func (h *BaseHandler) GetBool(c *gin.Context, key string) bool { + return boolValue(c.Query(key)) +} +func (h *BaseHandler) PostBool(c *gin.Context, key string) bool { + return boolValue(c.PostForm(key)) +} + +func boolValue(str string) bool { + value, err := strconv.ParseBool(str) + if err != nil { + return false + } + return value } diff --git a/api/go/handler/chat_handler.go b/api/go/handler/chat_handler.go index 2c5920e6..4e9f1898 100644 --- a/api/go/handler/chat_handler.go +++ b/api/go/handler/chat_handler.go @@ -8,21 +8,21 @@ import ( "chatplus/store/model" "chatplus/store/vo" "chatplus/utils" - "chatplus/utils/param" "chatplus/utils/resp" "context" "encoding/json" "errors" "fmt" - "github.com/gin-gonic/gin" - "github.com/gorilla/websocket" - "gorm.io/gorm" "io" "net/http" "net/url" "strings" "time" "unicode/utf8" + + "github.com/gin-gonic/gin" + "github.com/gorilla/websocket" + "gorm.io/gorm" ) const ErrorMsg = "抱歉,AI 助手开小差了,请马上联系管理员去盘它。" @@ -32,12 +32,9 @@ type ChatHandler struct { db *gorm.DB } -func NewChatHandler(config *types.AppConfig, - app *core.AppServer, - db *gorm.DB) *ChatHandler { +func NewChatHandler(app *core.AppServer, db *gorm.DB) *ChatHandler { handler := ChatHandler{db: db} - handler.app = app - handler.config = config + handler.App = app return &handler } @@ -49,11 +46,11 @@ func (h *ChatHandler) ChatHandle(c *gin.Context) { return } sessionId := c.Query("session_id") - roleId := param.GetInt(c, "role_id", 0) + roleId := h.GetInt(c, "role_id", 0) chatId := c.Query("chat_id") chatModel := c.Query("model") - session := h.app.ChatSession.Get(sessionId) + session := h.App.ChatSession.Get(sessionId) if session.SessionId == "" { logger.Info("用户未登录") c.Abort() @@ -81,21 +78,21 @@ func (h *ChatHandler) ChatHandle(c *gin.Context) { } // 保存会话连接 - h.app.ChatClients.Put(sessionId, client) + h.App.ChatClients.Put(sessionId, client) go func() { for { _, message, err := client.Receive() if err != nil { logger.Error(err) client.Close() - h.app.ChatClients.Delete(sessionId) - h.app.ReqCancelFunc.Delete(sessionId) + h.App.ChatClients.Delete(sessionId) + h.App.ReqCancelFunc.Delete(sessionId) return } logger.Info("Receive a message: ", string(message)) //replyMessage(client, "这是一条测试消息!") ctx, cancel := context.WithCancel(context.Background()) - h.app.ReqCancelFunc.Put(sessionId, cancel) + h.App.ReqCancelFunc.Put(sessionId, cancel) // 回复消息 err = h.sendMessage(ctx, session, chatRole, string(message), client) if err != nil { @@ -153,8 +150,8 @@ func (h *ChatHandler) sendMessage(ctx context.Context, session types.ChatSession // 加载聊天上下文 var chatCtx []types.Message if userVo.ChatConfig.EnableContext { - if h.app.ChatContexts.Has(session.ChatId) { - chatCtx = h.app.ChatContexts.Get(session.ChatId) + if h.App.ChatContexts.Has(session.ChatId) { + chatCtx = h.App.ChatContexts.Get(session.ChatId) } else { // 加载角色信息 var messages []types.Message @@ -263,7 +260,7 @@ func (h *ChatHandler) sendMessage(ctx context.Context, session types.ChatSession if userVo.ChatConfig.EnableContext { chatCtx = append(chatCtx, useMsg) // 提问消息 chatCtx = append(chatCtx, message) // 回复消息 - h.app.ChatContexts.Put(session.ChatId, chatCtx) + h.App.ChatContexts.Put(session.ChatId, chatCtx) } // 追加聊天记录 @@ -349,11 +346,11 @@ func (h *ChatHandler) sendMessage(ctx context.Context, session types.ChatSession } else if strings.Contains(res.Error.Message, "This model's maximum context length") { replyMessage(ws, "当前会话上下文长度超出限制,已为您删减会话上下文!") // 只保留最近的三条记录 - chatContext := h.app.ChatContexts.Get(session.ChatId) + chatContext := h.App.ChatContexts.Get(session.ChatId) if len(chatContext) > 3 { chatContext = chatContext[len(chatContext)-3:] } - h.app.ChatContexts.Put(session.ChatId, chatContext) + h.App.ChatContexts.Put(session.ChatId, chatContext) return h.sendMessage(ctx, session, role, prompt, ws) } else { replyMessage(ws, "请求 OpenAI API 失败:"+res.Error.Message) @@ -372,7 +369,7 @@ func (h *ChatHandler) doRequest(ctx context.Context, user vo.User, apiKey *strin return nil, err } // 创建 HttpClient 请求对象 - request, err := http.NewRequest(http.MethodPost, h.app.ChatConfig.ApiURL, bytes.NewBuffer(requestBody)) + request, err := http.NewRequest(http.MethodPost, h.App.ChatConfig.ApiURL, bytes.NewBuffer(requestBody)) if err != nil { return nil, err } @@ -380,7 +377,7 @@ func (h *ChatHandler) doRequest(ctx context.Context, user vo.User, apiKey *strin request = request.WithContext(ctx) request.Header.Add("Content-Type", "application/json") - proxyURL := h.config.ProxyURL + proxyURL := h.App.AppConfig.ProxyURL if proxyURL == "" { client = &http.Client{} } else { // 使用代理 @@ -448,9 +445,9 @@ func (h *ChatHandler) Tokens(c *gin.Context) { // StopGenerate 停止生成 func (h *ChatHandler) StopGenerate(c *gin.Context) { sessionId := c.Query("session_id") - if h.app.ReqCancelFunc.Has(sessionId) { - h.app.ReqCancelFunc.Get(sessionId)() - h.app.ReqCancelFunc.Delete(sessionId) + if h.App.ReqCancelFunc.Has(sessionId) { + h.App.ReqCancelFunc.Get(sessionId)() + h.App.ReqCancelFunc.Delete(sessionId) } resp.SUCCESS(c, types.OkMsg) } diff --git a/api/go/handler/chat_history_handler.go b/api/go/handler/chat_history_handler.go index 39816fba..954d09e6 100644 --- a/api/go/handler/chat_history_handler.go +++ b/api/go/handler/chat_history_handler.go @@ -5,14 +5,14 @@ import ( "chatplus/store/model" "chatplus/store/vo" "chatplus/utils" - "chatplus/utils/param" "chatplus/utils/resp" + "github.com/gin-gonic/gin" ) // List 获取会话列表 func (h *ChatHandler) List(c *gin.Context) { - userId := param.GetInt(c, "user_id", 0) + userId := h.GetInt(c, "user_id", 0) if userId == 0 { resp.ERROR(c, "The parameter 'user_id' is needed.") return @@ -71,7 +71,7 @@ func (h *ChatHandler) Update(c *gin.Context) { // Remove 删除会话 func (h *ChatHandler) Remove(c *gin.Context) { - chatId := param.GetTrim(c, "chat_id") + chatId := h.GetTrim(c, "chat_id") if chatId == "" { resp.ERROR(c, types.InvalidArgs) return @@ -89,7 +89,7 @@ func (h *ChatHandler) Remove(c *gin.Context) { } // 清空会话上下文 - h.app.ChatContexts.Delete(chatId) + h.App.ChatContexts.Delete(chatId) resp.SUCCESS(c, types.OkMsg) } @@ -144,7 +144,7 @@ func (h *ChatHandler) Clear(c *gin.Context) { logger.Warnf("Failed to delele chat history for ChatID: %s", chat.ChatId) } // 清空会话上下文 - h.app.ChatContexts.Delete(chat.ChatId) + h.App.ChatContexts.Delete(chat.ChatId) } // 删除所有的会话记录 res = h.db.Where("user_id = ?", user.Id).Delete(&model.ChatItem{}) diff --git a/api/go/handler/chat_role_handler.go b/api/go/handler/chat_role_handler.go index 5e321f42..9ddb00bb 100644 --- a/api/go/handler/chat_role_handler.go +++ b/api/go/handler/chat_role_handler.go @@ -8,8 +8,9 @@ import ( "chatplus/store/vo" "chatplus/utils" "chatplus/utils/resp" - "github.com/gin-gonic/gin" "strconv" + + "github.com/gin-gonic/gin" ) type ChatRoleHandler struct { @@ -17,10 +18,9 @@ type ChatRoleHandler struct { service *service.ChatRoleService } -func NewChatRoleHandler(config *types.AppConfig, app *core.AppServer, service *service.ChatRoleService) *ChatRoleHandler { +func NewChatRoleHandler(app *core.AppServer, service *service.ChatRoleService) *ChatRoleHandler { handler := &ChatRoleHandler{service: service} - handler.app = app - handler.config = config + handler.App = app return handler } diff --git a/api/go/handler/config_handler.go b/api/go/handler/config_handler.go index 7549c492..497216a8 100644 --- a/api/go/handler/config_handler.go +++ b/api/go/handler/config_handler.go @@ -6,6 +6,7 @@ import ( "chatplus/store/model" "chatplus/utils" "chatplus/utils/resp" + "github.com/gin-gonic/gin" "gorm.io/gorm" ) @@ -15,10 +16,9 @@ type ConfigHandler struct { db *gorm.DB } -func NewConfigHandler(config *types.AppConfig, app *core.AppServer, db *gorm.DB) *ConfigHandler { +func NewConfigHandler(app *core.AppServer, db *gorm.DB) *ConfigHandler { handler := ConfigHandler{db: db} - handler.app = app - handler.config = config + handler.App = app return &handler } diff --git a/api/go/handler/user_handler.go b/api/go/handler/user_handler.go index b6d5208e..372d7d5f 100644 --- a/api/go/handler/user_handler.go +++ b/api/go/handler/user_handler.go @@ -8,12 +8,13 @@ import ( "chatplus/utils" "chatplus/utils/resp" "fmt" + "strings" + "time" + "github.com/gin-contrib/sessions" "github.com/gin-gonic/gin" "github.com/lionsoul2014/ip2region/binding/golang/xdb" "gorm.io/gorm" - "strings" - "time" ) type UserHandler struct { @@ -22,10 +23,9 @@ type UserHandler struct { searcher *xdb.Searcher } -func NewUserHandler(config *types.AppConfig, app *core.AppServer, db *gorm.DB, searcher *xdb.Searcher) *UserHandler { +func NewUserHandler(app *core.AppServer, db *gorm.DB, searcher *xdb.Searcher) *UserHandler { handler := &UserHandler{db: db, searcher: searcher} - handler.app = app - handler.config = config + handler.App = app return handler } @@ -77,11 +77,11 @@ func (h *UserHandler) Register(c *gin.Context) { Status: true, ChatRoles: utils.JsonEncode(roleMap), ChatConfig: utils.JsonEncode(types.ChatConfig{ - Temperature: h.app.ChatConfig.Temperature, - MaxTokens: h.app.ChatConfig.MaxTokens, - EnableContext: h.app.ChatConfig.EnableContext, + Temperature: h.App.ChatConfig.Temperature, + MaxTokens: h.App.ChatConfig.MaxTokens, + EnableContext: h.App.ChatConfig.EnableContext, EnableHistory: true, - Model: h.app.ChatConfig.Model, + Model: h.App.ChatConfig.Model, ApiKey: "", }), } @@ -159,16 +159,15 @@ func (h *UserHandler) Login(c *gin.Context) { h.db.Model(&user).Updates(user) sessionId := utils.RandString(42) - c.Header(types.TokenSessionName, sessionId) - err := utils.SetLoginUser(c, user.Id) + err := utils.SetLoginUser(c, user) if err != nil { resp.ERROR(c, "保存会话失败") logger.Error("Error for save session: ", err) return } - // 记录登录信息在服务器 - h.app.ChatSession.Put(sessionId, types.ChatSession{ClientIP: c.ClientIP(), UserId: user.Id, Username: data.Username, SessionId: sessionId}) + // 记录登录信息在服务端 + h.App.ChatSession.Put(sessionId, types.ChatSession{ClientIP: c.ClientIP(), UserId: user.Id, Username: data.Username, SessionId: sessionId}) // 加载用户订阅的聊天角色 var roleMap map[string]int @@ -229,17 +228,17 @@ func (h *UserHandler) Login(c *gin.Context) { // Logout 注 销 func (h *UserHandler) Logout(c *gin.Context) { - sessionId := c.GetHeader(types.TokenSessionName) + sessionId := c.GetHeader(types.SessionName) session := sessions.Default(c) - session.Delete(sessionId) + session.Delete(types.SessionUser) err := session.Save() if err != nil { logger.Error("Error for save session: ", err) } // 删除 websocket 会话列表 - h.app.ChatSession.Delete(sessionId) + h.App.ChatSession.Delete(sessionId) // 关闭 socket 连接 - client := h.app.ChatClients.Get(sessionId) + client := h.App.ChatClients.Get(sessionId) if client != nil { client.Close() } @@ -248,8 +247,8 @@ func (h *UserHandler) Logout(c *gin.Context) { // Session 获取/验证会话 func (h *UserHandler) Session(c *gin.Context) { - sessionId := c.GetHeader(types.TokenSessionName) - session := h.app.ChatSession.Get(sessionId) + sessionId := c.GetHeader(types.SessionName) + session := h.App.ChatSession.Get(sessionId) if session.ClientIP == c.ClientIP() { resp.SUCCESS(c, session) } else { diff --git a/api/go/main.go b/api/go/main.go index 43e849c0..a163f94d 100644 --- a/api/go/main.go +++ b/api/go/main.go @@ -4,20 +4,22 @@ import ( "chatplus/core" "chatplus/core/types" "chatplus/handler" + "chatplus/handler/admin" logger2 "chatplus/logger" "chatplus/service" "chatplus/store" "context" "flag" "fmt" - "github.com/lionsoul2014/ip2region/binding/golang/xdb" - "go.uber.org/fx" - "gorm.io/gorm" "log" "os" "os/signal" "syscall" "time" + + "github.com/lionsoul2014/ip2region/binding/golang/xdb" + "go.uber.org/fx" + "gorm.io/gorm" ) var logger = logger2.GetLogger() @@ -80,19 +82,15 @@ func main() { fx.Invoke(core.InitChatRoles), // 创建控制器 - fx.Provide(handler.NewAdminHandler), fx.Provide(handler.NewChatRoleHandler), fx.Provide(handler.NewUserHandler), fx.Provide(handler.NewChatHandler), - fx.Provide(handler.NewApiKeyHandler), fx.Provide(handler.NewConfigHandler), + fx.Provide(admin.NewAdminHandler), + fx.Provide(admin.NewApiKeyHandler), + // 注册路由 - fx.Invoke(func(s *core.AppServer, h *handler.AdminHandler) { - group := s.Engine.Group("/api/admin/") - group.POST("login", h.Login) - group.GET("logout", h.Logout) - }), fx.Invoke(func(s *core.AppServer, h *handler.ChatRoleHandler) { group := s.Engine.Group("/api/chat/role/") group.GET("list", h.List) @@ -119,11 +117,6 @@ func main() { group.GET("tokens", h.Tokens) group.GET("stop", h.StopGenerate) }), - fx.Invoke(func(s *core.AppServer, h *handler.ApiKeyHandler) { - group := s.Engine.Group("/api/apikey/") - group.POST("add", h.Add) - group.GET("list", h.List) - }), fx.Invoke(func(s *core.AppServer, h *handler.ConfigHandler) { group := s.Engine.Group("/api/config/") group.POST("update", h.Update) @@ -131,6 +124,17 @@ func main() { group.GET("models", h.AllGptModels) }), + fx.Invoke(func(s *core.AppServer, h *admin.ManagerHandler) { + group := s.Engine.Group("/api/admin/") + group.POST("login", h.Login) + group.GET("logout", h.Logout) + }), + fx.Invoke(func(s *core.AppServer, h *admin.ApiKeyHandler) { + group := s.Engine.Group("/api/admin/apikey/") + group.POST("add", h.Add) + group.GET("list", h.List) + }), + fx.Invoke(func(s *core.AppServer, db *gorm.DB) { err := s.Run(db) if err != nil { diff --git a/api/go/utils/param/param.go b/api/go/utils/param/param.go deleted file mode 100644 index deaf90c5..00000000 --- a/api/go/utils/param/param.go +++ /dev/null @@ -1,57 +0,0 @@ -package param - -import ( - "github.com/gin-gonic/gin" - "strconv" - "strings" -) - -func GetTrim(c *gin.Context, key string) string { - return strings.TrimSpace(c.Query(key)) -} - -func GetInt(c *gin.Context, key string, defaultValue int) int { - return intValue(c.Query(key), defaultValue) -} - -func PostInt(c *gin.Context, key string, defaultValue int) int { - return intValue(c.PostForm(key), defaultValue) -} - -func intValue(str string, defaultValue int) int { - value, err := strconv.Atoi(str) - if err != nil { - return defaultValue - } - return value -} - -func GetFloat(c *gin.Context, key string) float64 { - return floatValue(c.Query(key)) -} -func PostFloat(c *gin.Context, key string) float64 { - return floatValue(c.PostForm(key)) -} - -func floatValue(str string) float64 { - value, err := strconv.ParseFloat(str, 64) - if err != nil { - return 0 - } - return value -} - -func GetBool(c *gin.Context, key string) bool { - return boolValue(c.Query(key)) -} -func PostBool(c *gin.Context, key string) bool { - return boolValue(c.PostForm(key)) -} - -func boolValue(str string) bool { - value, err := strconv.ParseBool(str) - if err != nil { - return false - } - return value -} diff --git a/api/go/utils/user.go b/api/go/utils/user.go index 12444840..25dcfe03 100644 --- a/api/go/utils/user.go +++ b/api/go/utils/user.go @@ -4,14 +4,22 @@ import ( "chatplus/core/types" "chatplus/store/model" "errors" + "github.com/gin-contrib/sessions" "github.com/gin-gonic/gin" "gorm.io/gorm" ) -func SetLoginUser(c *gin.Context, userId uint) error { +func SetLoginUser(c *gin.Context, user model.User) error { session := sessions.Default(c) - session.Set(types.SessionUserId, userId) + session.Set(types.SessionUser, user.Id) + // TODO: 后期用户数量增加,考虑将用户数据存储到 leveldb,避免每次查询数据库 + return session.Save() +} + +func SetLoginAdmin(c *gin.Context, admin types.Manager) error { + session := sessions.Default(c) + session.Set(types.SessionAdmin, admin) return session.Save() } @@ -22,7 +30,7 @@ func GetLoginUser(c *gin.Context, db *gorm.DB) (model.User, error) { } session := sessions.Default(c) - userId := session.Get(types.SessionUserId) + userId := session.Get(types.SessionUser) if userId == nil { return model.User{}, errors.New("user not login") } diff --git a/web/public/index.html b/web/public/index.html index d3d83a0b..9b7921be 100644 --- a/web/public/index.html +++ b/web/public/index.html @@ -5,7 +5,7 @@ - + ChatGPT-Plus diff --git a/web/src/assets/img/admin-login-bg.jpg b/web/src/assets/img/admin-login-bg.jpg new file mode 100644 index 0000000000000000000000000000000000000000..5024b9b0b7d35346009abd463b1ceb3854a88f04 GIT binary patch literal 102965 zcmeFYWmp}{)<4*=afblGH^JRKz{WMWdvJG$U=fnw5G+7&*AUzSA-FpU5D4xXT&Ky& zIrqMI-VgtoXTHrXp6dSfs#VLXy7#KC=I-0wPXI?jMqUPhg989L@DI3K1hS=lY^?x5 zNeN&A000F*g2MwKAc6z`05}o=@iztlZ8*|@urVCNA0Bv+hZ6vg00CI7UfTi)fB2t) z=lcR`xtH|US=H9Z(!tTx!`Y2e)yZw!wNwt+UHrrUUU zxCpVcJGrx&S~#0ovY9(Oviq32uye9;umi#{9~V<|drJ>WGfQh*ClRXsrdBFSTMH2? z9bP34B^OCc8(TR)H%kpaWleKGdviexDwrsxu#b?Bql=@Zhbg6xql1&XkdFw}Z{b29 zz9+L&QT}G}uot1yRZ^vtbau0(`L2i=B&$735%b_jU3x^15o2`q7t+Ny5y+l(pXHO3iDp2!Z zCONwNBldsw{hrZ9NC~vo!qmf5%GASBgo=xUi<^~$kCjtElT$#5gHMQyi?@GU(?yyL4@jm8xJaW&^`7){@ufW0wqfM-}2uG{5Jysjlh2+@ZSjhHv<3vi@?89 zElVdbzw!nXDd27w5Ky&o_HcH$adx>+=>P!ar4)x_bJQ$m?K^i3gwp zXaI$&xx0(Fs_K(_nSY;u%m3$aI`uo_1jbqKW&K0`KLfZHU`__6tg0ZpnT5N#BZ#X3 z03prX#mxf%knZW!-X1RZ7_0!k8)zVi-`r#Czi`?;Hv0>I{LQ1OE(!8u%Z}!fL_ZS1j zJ5FZGDj>!K@wqMN-Cr0U&Bjws3&bElJej$>Bp6G85X2l7rc#O^CIhjIlY{d8c;C~_ ztZZfEL5u@pA6pN3O%M}-_>HBzw8kHvOgCrsKf2&+t=uHV|Im9(-9Yr0u6a*;t$X^t z{39Dn`9Ja@SbjE|Iv^bl03bA8w%W=d#sV>$yS>J}J)jK`VLuzmd-`u4H&69@`)NSB zx}}q>1c*UjAYN8(GWWjU^M^UQgXp*KkW3p}`TM?L93Y=OY&7rJM__y)9pn;s;0YiJNCA|9 zCs@q@XTT1y9onhe0k8gQkpWBrH^3UO1X%x2{_dgkyTu7SY5;z~F5m?6xc}2n;&-bh z;04le{-OTWmld%3-Rkwbhdr)qX5)4ym6 ztpHHT58nO_|DrJn001sJ0Q5ANd%Ai3B@f~Lga|$*u)#Zx7@z>C0S3??E`Ses42S{J zfC8WbXaahGF*sjszt{v~`Ad@_7Cd?|b_{1^Cs_(}Mm@Z0bw5CDP>A%r}FutEeNk`NV$KEw** z1_^|OK@uU^ka9>PIL_mcpO78M1p*Sn0|ZJ0R&WN(A!s3(Be)_2B19mhAQU3hB6J{( zBP=2uAlxEiB9b98BMKqPBkCerBYGo-A|@i{Bi0~xg7?xY;wcgm5+M>j5LJ-7 z`6ERjeL$)}YC{@DT1GlSMn)z^W=0l4RzWsJ_CO9reve#=+=@Jgyo!8|f{p@3;X;u? z(MNGYd5)5ZQjGE$WejB<Xo3_}c0j3|r(j5dt# z7{4$vG3hYHF!eD#FrzSwFu!8XW1eF@z+%Ia$Fjf*!b-)e#Tvuf!$!rX#TLgl#`eQb z#IC{~#@@j}#i7HI#4*JQ#7V_zz?sH5!F_Iae!%pbgXko%zX!74ryK0UrXz8!uzei{A{{s93V0S|#Tfe%3{K?}i8 zLI@!pp**1jVKm__1s*uyg-QX(-TOQJBM3ZhA(OJYi5X<~cg zSmHY3A0!AQOeAU~-X!THog_P?_@s|X%}K*ZKatLm!ILqOsgwDW<&X`Kosd(I%aXg0 zzbF4nzC%GsAx2?G5l``%ViWoRDhjoQ#zR}7Ta*Np;*<`Q$&?+G2am`e$vyIXl=W!n z(G?Xvl@`@=stT$f)M(TK)K=8-)a}#FVe<=!xj%>HX+S=;s(P8DI>q4A~45j7W?EjP{Hl7)O}knRuCOm{OUBncioU@Vhh>MBKoGX=Uf*X@thC7J6p8Jr8na7eRo#z|x170QG*Szh#H+=kjZhYl@ zoBTBVPx;gMrv>l@R0SdgdIS*#B?N;6n*}d~_=G%!J_+qVW_@h`xcKpgFuky)aIWyO z2$hJbNS4S?QA*LLqM4#UVUJ*@ux!|p7`2#%Siac0IHS0oc&YfF1c!v1M2*Cmq>yBQ zWSbO3N>(aNYDgMST1z@bdR~S~##*LC=0KKL)?c><@o?PBszDWK+fnOm& zp+gZvQA06Bap?)u6SpUgO7KbwO7E2BlxdZnlsBIGaaJ4FBG&J$H*H`xi8ed7lC~+fhjwyy z8Fpv(D)t5TcMduZ6^|Cb%BBDZ1sm!?_!| z*L&cDiTr>kgXb&HMK4jWRIhVyZSN`{TpuT&0beHHx4!FsGJbjf2>#~&?av-P3wgE} zARdqv2p4D;*d9b3^fG8QST?vY1TDlqWbir1^SI~7FLYisz9fGc{Brq~?5mPctWdYm z>DP~6XS_jpWBX?4E%)2^Z*Rja!urBF!V|-lB-m$yABd ziZrscw`pe|EIy2-i=~%mkY|KvTxQy4e#?^0s?Da$PRv2d@yc1t)z0nC6UZydC&>@b zzbSAk_*tl4*ipn^R8&k>99;rm;#sm;YFIi_CRJ8n&RU*TL0A#~5%}o&ajWua<kYQk#aYJF=D>TK$M*6Y=eHYhZ-H$HBxX<}gue0TVMIO8>QH5)vKI2ZN<=SSi^*?jf_<3hzxzMn0NQi}si8cVaw=F8hF?km@; zFV`^F64#;YMH^fj&6_ftBU=VrtJ^NyS39A*xVve4413l4V*3LJx(BO=ZijbA5xRhg0d0!)6C*LsMG~O!S&fPiQ-MN^$nf}fN z?srt+t-yVjqXGcH)B}JABVhhu@Ynk9H^=Y&mOltwBK<~xo&OF0wMP8i#s>i9VE(SQ z17_doTIxWCqw_ZLXu8X{Bv#>~;|Pt*T6{k7%< zNq^h@pJ&h;Zf>6YKL6u<*9PFCz#}7xLExwWcw9ILF5F!Q00sR(1d|l7{H+BJ9)f^~ zgp7iUh7K~+-~jM&5C}X11QGH6#Q|IZ*bX4zBH}&b6i0fXW{OPZiq91in}tFxQTc^H zee{5a+sy4bDjMNKB4QF+I(i01CLUfsegQ!tNhxU=Svh$H4NWa=9WXsJx3ILbwz0Ky z_we-c_VM+5@$yyZ>o;%1;@-t4Bqk-lPsz^7&C4$+EGqs~Rb5kCSKrXs{b!2yuJ-1^6}|L_YJ^a~yV0fK;h z?-v}rH&`LK2#Ak3k?_RTkWF15P;rHz;7i12RenLG=2kx-FmoG4Bc$P3q&>WM?YC$D zXO2Dpf92Ufj{VE8S#W8A_`9GYBBElTqM~BpVt@sg0QbHS5EJ|^#D5C(ccHm24F8ln zPzW3nGBO$}8ZIg-E)&^9GN%8>A8^!t<&81v*W`F+gNx8#^GZ_NDe$0p0*;3b_lwi(7stFK!szZc z#gRku(0%jR^I%THK}Xv}{u~gTSIm zhE?}TzOez{()x|r&$!1?L$ESQd%?N}Jbttbol6Sr^N|zD@G9<(3e28(moHTpn$xa@ z?*^myKrXj}kvrgI^L>r^Tp;1OgYhQUydbRE3^<-O zr0+0tqV3A4#JL#fDr=VF;$G&EA|c zUrftp8<3WKGuxb-m{prd+M6}s8z~zNK2D)}u^kaTP0-c2`wn@kg}&3v*>TkdmEhX)NY@-ipTW^J}i9?Ff+mAB9cACz+^KMy3Y}HgH ztA!Q$I`0Z{`z_cjGs1&x$ON9UNTd&ar{gD|&^__)K`6zQjD2ISPSukmj)Vdh&7bob z2P(oN3zlp9R<~MXc6glPbOPn>k`mLVV#CN6Iwe~a1c}&~@yf(Wa#V8 zc~eBB%)jLuT8iI|PYc*YA zf{e>)giF8lG~T8ofo`H2joa_H619AL<4aJbzX~E50O!oO(Xu-a_MtY>v1&U2bMiI zN>ZOmQzVx^rfh1DvaFCR!(HQJZ|YVCdpv{g%U{RU)I3#ry|d6ThyAk~nrA8gBDeSs z7?*{nRGh1aE^y0Vo3M}Yd}{rE7SdDzO)h?@{Ok?vyY?M05@|9v8Ti%3;3_)0pI2i0 zMvC(EH(7tn5*A9gJut411nYXUaMs;>2Yi}zBwJdu-a>Fxs*FLG@)bhzxdSlZVH!Ft zX8tJa8flAFn@2yf*X(j{W*=aOtrF|^Qg;#JnycG*8C&!-G|vlw3ZUrFL2+*9{cZ zxb9>mK(^8wsi3M#SA5^^NTmLd*g}|NeL}~z=v!hjuS(-CXEq{iv-VNUm|Ux_wP7kR8hmpDFy z9O}umr4<^aUy{sgj^5(wM`&5u@JfXV5^~%Ry+P1()&cyG{pYrdW<{+&MZT#9t8t=U@=bSuxLtzdVUVlUIm=>#O4il)ys4*rN0fpq z80%YKFW{7u>=q1$b~8lGt*9$u{zv#RGgaP#wcGkB0X6;5>Y}6Nh)`Q>@mu^Vr6miH)TJp1ooDq_38kYR+dZ;J!F%%C~2`Fzp@!8iC-aS_;76trqJ zX-a%fvaqckUZ31bN2XP|Uji5+7sS_M<;rQO$W-B&j~_=RkT8<)Zxs-<6#qc@clcnVxeCnQE9ciy-!)&dR6alhJ1Sil9~pp$}VV zLiKiNjAs%a*i8!)bv*KH#s4Xs2MP7A8ik|6{d{das*)Qeq|F>;P?3?GEwL$I zZQta{Gxl-mp;EGpM27Ff#}&z?P6Xt7{yI(11P{6O<`v$^ScH>Z=_I{Tai40Rwcqkf zdNUAXyjv6PCWG=QKuo~>q`MsU zNG)mDR3ArHUfqejlb?B0EOb=)!lvycA7Yc&Nyh+WhcN&piEb#?vQ965-e4mYh57F8 zO1H(WQ6miF?%1J?w@^6X{J_d}a0Z{QkyhhRDa#_Q-#!YziYdIczML|&Z-q(IpwD5#s44LqWVGNMWsn5DQIk&r?ZcDp9ey(Y% zIP}I3ntRT93EEC>Fqcs2H1c76G|;)PCEG|tqp`YnqS_ai$|anWlDsqwCrW&~8h6LO z^XX&r*w>lR560u39~9-S_#W_>-X2B0Cg;LN$|^~EXg=9&8#wK!m8$&NsK1{&xMkdq z!6B$xbDBDPi`Dv(sl%9@KO{J?<-A;ZUA?8bf!`aiIW7)sjV4{leODWCD63GYZA|`= zdjug}@rRuH{EH8xKLUzpjz3oxcZi1|IB5QC!t)9ivffnv5shIV$8$JGRF1Nkcj0?X zxdLrNTdnc0rZ9TdL?|aa@ZiPZxhC5&chaiqfRpN5h}^!u**fymWNw-magAU ztcP(?h(nDTW$X*zpGd2S5>tPEbK(~A&7XtvBP`M~yq_4hyfgus>*`claf2!NdBf-8 zHFKd-FNPoll1+Urw#yyHBK*1f;W4bpByc5A%aH9I=LJn1^sLSGBC^JjCp0Fs%4ba^ z$mW9qr${+%+NUm z)QpQP)TthyuJK*pd>4sUJg+Ygrn!K6T~x^eH9VZFP}jfNDVpWokkd-&61cBw4{{E zi~d+%{8h50o-~R;R%7$zxNxY>+2ONR_FG-=u8BL~GqOoH^-OVpq2YqSm1H7$(z)yi z7NTb-+0LG$%P!N?y_L3eM8yF7I663Dq0-`u79@un#sgwF~W~fd$vh z??W23OWBQ@3sPx3T;?3_0PW1c8c(M@)8`ABr9|l!U6WWT+%1vyv`=4J$4FWqmmz$v zhd8;3KL3~*l!nzEJye#XBU~hNnbqg4q$JK&*-tqX1BgoymX0m2Ov@@-gE3&y?+i zVK(79Hii;AE~W^%$|9{Hbi$Q){bcE_edUxauTZIlEj-I@ji(=*_vKj}L*1R&%4lny z;<|c*eo7KtC@qNyZ|a|%rnp~)zojNV)}{xQvx@i+E4jiDe4ydmrL;a;=t@=sacu{{)M{$y)4%@Du2b zU7ummpkrD$dvY)m)W?f@!k^+qW{W@uPexRB#osTw{Ux@MqFf|Xcx-g)s)Ofn>r@pR z9Cl5U_Gt)y5 z%3aagRmoi=Ub(eP4K5d$&mmaV{%JJZYctpQ;qVUF`FaQ~^S))8Ogx=`?DKgmqVlYQ zQ;#+@h>to{BgVEib!6p>bk~R60PcefJ*m<3F+quDhrolL6^rQ@pIfU8{l=KIHSwMe z`>X?{4p&3YnN7@L7`wA+Mj$i#5_z?Yopf0*BOPfz=dRHw@9Zc$&3I0?fB_h?K|qe) zTa+Fa?&JMSozFg9Tckl)E#)ppY$LD_KCfRmWsmO@-Uc-`B_Nl?xG;O`9MaBLxiU0u zggmb>?KCFIHCI+F!7w6LuC^Q{W33L`J3Y!s7_GcLSPjzOey`O`Ekr@2O!`ZBI)gjz z=apGg6@xR@lak5gx)pb0BPsuCXc{k}-0cn%216e_I1jbm<~ltCqFEVjN`hlw_d{)LLTkOB;p{&r04uI7Wt*nQkug zxdl}*L5E#neYJTpMmEzgZhhxig8h*D?f`|3@t9^E-1S?%hs%?4-M{k43BppFld?qL zqt_(N$e=r71`GY_GzkAXQ(Huki(`;rrTtY94a@LX?=>UKo^jvIu4$j4Og~lq?w}-H zP0`$@Gub$&&8iOONK_lV5Js5D-YZ^o=9I|AUI&(yy81Z2m{zoc*r${`}rbA`?EIFMWh}$){P`>>)?pW;aG{mfWX%%M{I6 zm}sX}W@Bez+`9`8F>)HQZ|N_mIE_A=`H=I(@8OZSf?bjF)k#CQA35-U0)hE`xo^OGW?MMPv%(1Yy*ZU1n90?D_rat~Kw zuD4!Q9iJQ>XWvR7ac^L8@9XoWc(!!K7BGEJEuykTI+)dD<~q_Tf>g2&T7S0_dTgs9 z>1eT2!o~46!`*2{ET9eR+MFC)f2X`zk?t*9GDkS1A!?B?I==j&Ej5&VFr&Tdoj;8u zQMX=i8vUDQ=92OPyz1vZ7BL-hkoKo>nlH}0qJD^Q8%CA6y`?`5Xc*Am>BByYmRN{l zp2{Q9|Gu@fwfNnD<>IPu_I3Pd+I2^k;AW>U{^2ItdC02iRv%K(;j(_`f;-xXnjg{1 zT09xqoW$qMW&>%TZ z-lSDQa4xBN@Hqj4Bo1h|{>s>6`7}>XG_;`!eNc4hl=O8S8+EMV^E==N<)u!ZPk*^zHEb?tAHG*hLAeqdm;W$Z~?Paa&C1~vNgFJ9LdvB5rN z#dkQas^`AAY708me`_K;Jc!?_x_r&7_+Gd4l&d@7^dZsHS>Jr)KH7S-R?k4KODshH zwO9G)k2^jSJ%pc;{alMl?6PS1tiV**v~qK*8Gdixz~J?BONO2f9KW#S3H4@$crtbK zvd?0_?f?(h6Jaeb_udk9OG?e#!?~b5tukUbX?%5{OoUtcoobqlfLcG)E-)dlztD)~ z30i@m161J{T|{(2A-F{D4R@lI>2;`*hgyE_K7AIKBP&LvOxO61yKUmzw~ydGDc316 z_yS+h)wAg2^cHV;)tT6FytQXFJ$d&Y{-clG5WPGXKgIEqtE zO)a zNq0b^(T#gsr|O{N(4cP~vavB9Li+YK{lTUf*(R7bYnFvzQGcdc5tkAf{@8HtIh;FL0ljbEC%C-Eq%HUHz`(-9vy0k+@veWl~cjVm4 zoT3If%Ry5CHAh#eGvC|Gule*-737G6Y5QhXMD~Q>MTxIh62%k81{Y$LDmR!ic8j&4 zBGnc)hEzscp~T*Lo8KPX<{S6{q%%$MOm*O$TD3kzN zd^Isde6=vZWm|k(LBy63uE+}G)P3fJ5>@9GGJVXOq*HwrV(;~i|Hlwf&?g^Q9^dJ= znIFQ)mEgM#4>+Fl>;4UmDQW0?0=oQLt1RxITG`c3mFzAPjn~lj+1CB^pgi@4$9ptE z+Vm#{BSv!Ok-4$v;&I)8c2{jbe(YvtTG^*vfxY#8=uqy+@=@+PP1mCtw!`%OQQ7t3 zu}WI6M48wjMLd;dITV{5{1!$G1%~WkwEv~@9v3ZRP3a(?X+#!$Z-TZL8j91F?mIJl zeMEUn00;;YwD`cPSsthwTZZEf9^VpP*IzTfY0nPR7sFpAek!ub91ZbLH2?Yq(rtHpj9uTPk#KJ_1IG6RPWKHr zN?hv>(mzD!=@ay0n!3d$E0BLpM{+;z)=$$_E@}*@#OfSA-qtSjR18;jT%pM#LLlRS z?xZg$IGkE`XW-{sz&ZjCL|?i`Pxw#fDl&Jv(l)&y#mhY65~Ch}&O8|%^>Zre>d|iE z*t}eajbu=9Oh6X`Tu6HE$}eN7zTUGCiW9G{zO9P^uVVSl?u+jAPJTpI-DQ4q+)9zU z8Sb7 zkWHDx3gf^J0NM!NV~lmVMSY#{x{f9YpbHt^*Rh3lv`z$_bb5AtNum^9t93ju#MM)i z(zU`P!&YvMy?tLs8t|p|NVI00(7l&5@hKz1DZ;ImA7SbF(6{8vMcH4s33i0#$z(_T zkNhUyZetOa$)z+t5X_CNzhA?>d!YSNNptiC&$0vA)LR&zY@q!kl4{j8Uf3&h+Oi(Y z3A^ghLTasQ-eDejUnTv>k3Pjrc6}skaje{SkBgo)I|-{JvAEgg%03q<_T(MxN$i^2 z-Ro!8jvdt0|CkUTn#%U5chDrPYPk%hB*j{b-@7PKG~vSXkl5>dUl)3OM*pi~;@kGo z_R@2Q^N>>Z8xj5^r24#uebsYiv@nJuA=HO?Fao?Zk|Z9y4ktu0CUEVsJghT?-L;6cbaKGJ75x0&=;d+rDcVn`IY7+;Qo*jC3JiQ~)$q_LN@rxLCA;0M9l?%5QI6-?3Ug72`qObLW0Ap)LO>cK|BvY$zztMX}?>w$bqG0()m1OQA~7>o2)KDxPlima{lf zS8?~{*shSBAZL{`t@g|H6s#ius&G8SfE`jlSSA*a2>OKSV=5T4KJ_t6BmE&>G;`&K zDC*>G5A8!APD(hULMv_a=%m)EtV6Pgbq_Nvu62ZY-&>L zxH7uDQ>WN=gUi>8l%nj-PqLBHAJi-mafyyDx_ow!i%L@b1`EzZ4XRho=J#h;?||*+ z-1}N5iW|$%ncp~iJp`Pr7G4^MaS3ep-fCqSQ0wNF(U0`KRWMOT_Z~OmSfF;RtL7D{H?#JAFaammc72 zH&s8Ksy3c8PGd+kBx(JT2y#GXJx=fzBiI-72dc^Tja`g6+52OG0{cov1G8y)odx7y zMEUbC*7i<_Z!^X!`mHHHg(KEJtX9FsK8Aej1t|Wqqt-X=I=M z`F-?z&@mhAiMGe7H@8tw>?7y2sK-b4d2y#>%!-Ol0-D!d9Ah5_n&brA+V6meu7-OR z{+_)3?MK`)q>uaa^9%9`Q-?^mVLO z9XAe^SQq>vg5-T`QNV877FN zr{+8Sgb>ELnXcqPSX#$yTck)gw;K|zuFIi4JPD1?b3Kga>TOYLJ!ZcHv}`v%32(B7 zx;8xPxB~)3#jigxRLcMOHaQ9#^|WP;`Psw;E(heCf*>#S^@Uic3TKSwLZp_@{6ob| zd+4`&hFdHons}#^af)$zUQ%$C#E4&p%{GqB!0=Q&sgqf=I?6bR4PE*k&ZR%kx=3k1 z)!yivr%WGKokA?-B8b#5Usd=;@``xaIJrX9h2RZ2x6yRCGocC75rSA!v9-TZlqePaZD~d!5#DY;(XSPeB5bn zV4&zJWFVIJp+^;2UCEE9(Lg0f(v)d+iS{G*V;_2isQTj5Mn7A9-zmq@DciT9-?3TK zo(*?r{`8-a@s_D!)Rz@0nwPhT-6VA5%B$?>N^^SGusoi5S{82KaVTYL>65j;4C#qK zu;`|xp|60fiuh}jZcM-bwg24|bEL;L<7=51?Kq1C9;JPvu}q-U@MkQQpVCH+$#aRf z^J8mXk!Eo-9*>PU^xQ;%6)p2DLz!&FBstA9_lO%rPgkGkj&9ghH2Gt9K(;*b3@v$V zw9)));bYO7HY3*dp?>eC0c6ak@*t9IC9QCYI^q<0dS@w8*)tWX&0MSh-%AL!r z`Su{FIGzaHPV}tjWw99`(^151s~^piJj-c=Jvr3%PW+_zL*AZV(~L`qq%uEd8ftCc zky)_h7g%jl=t~g))EV~5c${r&YFFRM{8{OXNfo3bxjX~YTM8!5sY2;Nh0ap86g;;U zttK2_gaBzZDV8q*_W5$N+GB6Fd6S2yxbFaP;xcvBL?^zx^^Ld{DdJ4XyIR4T3)Jky zKWY#xD}yRrd34D~^_U^9n17cwxvhcc*>T`WuI4VB@9E{PqPhblkp0$IUMm9lAHKaC z?pL>)Ub=LlGK%TqlS&VR6>X`MS&T_q4xcAg_+qarK$W3i9$ibTTKi*d zb7f-`qO7e&Y%y>`b>Hu75D(YJzU#;bQx zZVJjd0_7-oo4awr&Mbda?qC5EriIPXUyx0*-dgyG=oE})mYJ27Mp&|0d)YWt1~oCW zS7CtRd8WoC;P3m6dI380X``5CK1n%lQFtVq|MaTt_?S1Aw)&9oJ8lTYB#GQ%S{744 zN!B>;?73DJjU4={cjUM3Okvd>WMR$Xl?bbx@@~y(2WLmBh&GJi57%&ANF17I>*2OT zf!hTmYjI5S^f}xcCG*lbK_yAheGK)0x5JmU+Lt6=GP;ugeic z#^Zv*T*xH1fzF1L$CdwRugYBA;`njtw|BhbwlO#PLreYTvdOLBLwZ{^xsQS@oPU?v zLpK+8zF5j9nYLW!t#1_aob)XKu3j;RCqnd60@B=m_>N=$Xv>!wR!PddRz|cP36HOl zU}Y&g&RvZ6tqS`51ANEf5hS$!oKRSMu&-tA$gp=bN-w&_>dDtV8IJ5+OD{^7)(^7E zJn^A_mUs6{ynn0eBXIiqmOrZ+F)4qLM#ixhr`Mz^FusM2mf)c^YM3 zNftJ#G@+lX7w>=>2_IO_m0b3KLUbRGTPj=8YM}uDRU4(PGwm2JGv`XhD|rh+zLAJKz}w|kCSS3qX|~|z z82ng3w`f;;tWN1Yw6}L_6eQ5^p+4TB^AnbWrX4%sBcS5A@d7Kye zV9?+%Aq+<9%C_h_vktHuM(Hj@-$&XbE^U7UIiVwsh3k} zGM}h;3vkQ7rMdAv;?2S>EsV73vX^r28I{!M;8RPQg(X;Km7MOrMe?Iy7A(W)@3C7V z$!;d|(<&S^r9$7Z>zm{$kvAM;eYhxmOJItr_42yCv_OB&Kjk4_X`ZH}c3i`XK5L#y zSRt)(SVO+2#@twVUf|PfJ)>4!&)7Ra1$M{EKvHqq`%(B51q~{Dg?G-m+oe zbfM9=g%)4)165S@t!?;JKKygtnXm$?lCw;l>iFt-e0;0Kclf~lM-^xaj5fcw+H>== zgYm!}B*Z+87fN{$x?s8=YL$cXAIJ4L2f4J~Y-ESX<=l;d3mt}hY6rV26yZ#tE@qrK zWhMC+VG*OIG>PqMiqeRP`0>?1e6^Ywo(!Cm?NLY+6Rl$bPx)1SW~v<*_)bnuTs&>` zek)yG5xn!_tKo#XE>zMiC{Rua1X-OaEd-Hcz~6!r7Xi;B8Uf_2W7wh?3E$Q)%+s&1 z`3O&nrNljmaG(p3=~>IoZB5bQr^GtPb^4*tpF^`J%SmR{eal8zRK7gfGxiIcemA#H zJ>x%Dz!$w5SI#AbtG%Z-vw00|T3M5ZM>9S8h5Z=ZpA3l?Xg)(z@ zdM|5C&^OCm;3GzFgcH`)5C{e{PpOf(IThOAzj$n~M2J-XU3d^f6b^ z?5$SoqPNwAWA^ZZmCAtmj&HLdzO0(%_+=ThN4!GyVPW8xo_1X?@m;?NHN97@;qAl2~ozkU_j7C35NXp-FqkL{J;%ZMN&v~jc zPxBz%4_D9I6=7mt7DiL)WWHhKCcCKCMY=O4O(^xIvmcAA{>$dYsClha+>+I!W%cc* z1hW@3xcf>*I6J4bH3z4Kmp+ri*^Y@%xGh{WoLZwe_3i-kumHK4uI@GS+05;^X#?!= zNe|aNNn4V>(F-NE>tc88|h;^b}L(9&uDsJy^tJBt@8dA;y(zK+^6itgwt!Q5} zx4d-50+$`6y(4$V7@Zp;>xU`VYg{h(-}2?(?6BJz5{MFcLbGYdPY)o8f*1v`fH~UllN%WMQ%z+s#$fD^+ZspFG#Zc zdOC@oMsaFdvaPkpT?#GV>h-DI93!7=8L7d~H%9pdZBXUbJ+9u=5FuCDuw$O9e*5T_ z2l+BcA>Oc->g}n4f*)ZURQZIO{L+tNYX^n_QA$O1cpIfcf0!G-R-F*ksMVTo8$;-8 zWg~l71bwrXYWrCK2hH{*5ub>Qdsx)G3Y%7tq@qi@VXmLMm`TwFr_Cl^=_ezns8OIk z&bW)a2YpXj6RmPdaXcvdi@R03Ktf)WTm$n_?8mFxxuYPo0>tC9OV-G6m0B2o@4HFa z>nfOd;`LTBn@7_R&M2kkuscBYWfANRZ$iyuws?J`CoZDX+3`OTYaJJZz6X+Kh>2Zq zr%ZLf0L9jqBhTv<0K7%qQ&%bPv=ZPhQghv`Qns+`OQ z_J=Rru9pvQHG8E>*K8HjMUZR!R6?q)o8Ao~+rFdr&SvO0pPNqW#Q5~#W0Cm| zw{g}Yxl8~NoZq43iv+|^a!x4i>nBtV+Y3pOO(;nsD}FfR!Xm}shL2?je4;uet|OHE z+d6RRS#Ho(S7mdnRP$-q9cz@MOTv#G$|lz<60qG=Jt@rZFlNWM`6@(sT0PJ>hiFUL zfP8z{Q_%FVLqd@b-4~Uz!w2hwIC2%Xa>Ag}_l2xk?T4?@*CULYKPim$b-s_1r>FlV zJOzGIsXfkKN_xZeFoNRMYvc_-lJ(&hKU{CwaGvq12LhW$R4RlGD78&blN30~3UZ?Q zx~E5Oktf_WAyIa3Y0^<0S8c4-%L@=l!pl6=RIn;>YMLK8;hPCYANnx|NnT9hkMuh; zOL8T63Q&$9@Th0#D*y~&B1d|*eL5(FDedb)@uc+t+8D$>^>HHM@oNO_`Os~iI9sunOb8AcL%B1;;afMOl93>jM!Y#!PzkN9Wv145GwBXtCJqs=`jqpjfy zr>3_eOp3bUd^7A%Ykmxp6Y8-z$1Tc;!MM^R3JPKRb5lGv$MuGizi2yBmz;IK!M8>W zUrn`!3iG;_nMhkYrKZckw@j-aybfKdtr@jU>*YaHvp_$BS9VQ5r!R9?c|c?{lx(`n zn{|{>p2R!1iJ+M19-{B}V?cXqJLlU+o9XvtL8N!UA$8rlaqN-_Rx~=#!KcuKB(rpv z%oEc+S(Ty+;%1_luni4$eX>0)wt*pD;v)TQo?cRU1zV<<1T6G;jAw;KhiM$5@o<$D z7f1mLku3vr-C^%(a_So)h_}x9B05JQ>@SWSTHN` zvYB^R!Dg&_!MAU}8esaFOwubONH=9^co{#Qw8|_s?W5Q{tg^>tfS6)7yzPM?)7%oQ z*OFM?e1}@UT9|``oi4!HUM9rvlYiIJqh`t(kZ8*|6{pMAF(7zQs03BKVlFFBH^$+s zE;V312Vc1uvcK_ABo*OJRbq*GvOI|Wd^;iyUV!rSr$~oU4BgBp!t#!S{T=2N8Oa@h5 zf?Of(n3^D}--r&S++C>%ZNfs8^Zupne^y4D>|nygxHLq-#x}`pXxGZMk^89UbFmNg zQIY3k=*J)U8jbv<%g+0ZE6~0|s`WCDkBpN%iPcWlRY-C-PXY`B$%7QwN3c9tJwD@w zd%t0o%`(4W*2a^PE3f)8nlK&Pa}_JMaJ~thit~$_A&Y-+OMau9F)$&e75uVLbb^JQ z8bLfx86dFGZOEN@Yt7F^CXGC_egU^>*kJ$u^RIMZ1KIQ(t>Ia})!V$U(J?O= z$rtJ`*;T+VXu9_~ca`wJ&(5(Vh`;Rdqzw|Zz! z34@@oew= zdCt4e`(aot)~x+uGy6Z+FR!7Qa0Z8tYjy)>ddwVG>7cNWBc5k==aFMB_^s=5a^GYF z@;y_>C{V#*q`&n9`f?|I_JbGhsL%AGhicPBj9UE@I#p)EgnXfL{XI8XrrOiYlD4-Gs+u>xa}%*l-@J+xvkwHg ze=a=l5$Jh>aD+T^mL*iW?D5;*z~?!H%vQJ`&J9=fOK~pKXl1rZVb*=A7|v@USAvK^ z>th0D1s|(rPke$ryRdM?2CLtCl(|K&y;ks{qF5n6vbXhA*EfRY3fz34+!Vjc>|1u{ z*JgL@?}1sn-#Sx@W}7dx6iY-RQFZZV*6Fzsq(b!j1`L)9d>*dc+G^VKJr2YI1`*K4 z-Vmwx%|}UQG>vFtkJwn%}K^-VlZ9D@c-xki|2;yefbf&8l=CDl+J^Rh;k1vY#2nWZvETZSGsJmk*&q2W z?YbB%HFy_6B#K|h7q{n&o8zjxoDU6|FHLW5;+qJj(AdIk0Lsi};WNCB=>)};Rtn6tvkw*62Op-OYL_-fG(9ioUf1~IM1$l>X2URw(H7GMPz)~ubEl9wAP6mzoNQAX^$)$3^`&Yzj5h5AkP&Z7hbYSjshCC$k7JVoQyKTySfCv0R@yaHAjzOFE=V zFH3n#sG9sfpl)IW6~kh`p(`&(Q#>xXzS_8CpZBS)bHsyUiti=Fjd1GlD4>>chQgcb z(-XbuIg{)`nedot8t^N_nY)se+HcpO9g|#Fb~jm3dtgrT=q&Q3n7WBLY@G4iR(i4$ zb1{H^QN-yT2*2t(E3J7tJhU(&xAUlE7R0CV)Z(k=-R9jyV|`4vo9pb|@5Laj?k46M zx3OJ)k(vPq2kO-NUlmfOsDVYWBztOOly)QbpfnLSNdM?H=ljf+b)FJs!qLtqj<><@ z#m{hxKgjHj+PeB3?-t?RJ%T!JT7C<>FIzP;f5=WmHkM4fc?3-)z%HI^FUp4P2r&Hm z)VBvq&^*Ii+^VmEJbk-P$jYQT9)+68=3}cb*jRp!p1aAMU?!~jK4<;$fIv7`h4hd+3f&mh30G12o(JZvLE&X#<7#r;&f5yvQl$l>SeXr0?_1YM$am9WWN|gnQm+;M3`Ck1R&GJ4HkCiO=GLX8@nh8MsKuVm}YX+Z$zMBq|_;K31kIzmV7=I+!Br-@S{q}R_^|Q z^{f5zg`@CyXQct+$uA0#AyyrQMKZ=yf91b0b}ae|E|JwCTWEI23>r$ca2YHV+bK9_ zIhUad70=~=a=fTJgt>tc>~@0XG+L~8pp$AJDPBtIn(r!pz?8Pdue>$#`UA156MLcS zvJa}%vBz&VmUo8nb{eikgZRp(vB*@Jz{bHv_*OU=K2?IM3%%jjD=~ceR$H!Sx&fBA zx_={xb0)arv2C!|6*gQ>=^%SH4rh|Ch2i-P29$i{&)wMA&zYfqs70 zxnH;-vFXD*auyM|+iw$&k5=6pHa=ejU1E~wsc59G=-Yff^Ecu6x`wa( z#p*`8ql=<%y*&sdOq6I6wr28KA$dOTCB3Wyf*WfK#+1TWq%WU6S@xw_D`4Nwcsuwm z{_~*fv`)311V5rXwMO6M)=ad&n_i6J9g#Wxl#SRuu`z48oC{_y!%H^p@nh2y_KAE- zb}CZph4eq)H{rwDmXXDMsbA*aa+Bn0dZw}p7tnSV7WL^{+E}Ao=?rnUWS+veb?fSi z{br%?gS-IkZ`zz4`s(}2IeCx6G!G$?PxNYqGGJ_F?3$1o-wi+CB%%a zbK;<@ZArw6H>E1tjDy>jqC(qOVUx-H4!H4IFNCOODr<9GsB9%#|DuVQ8xF6WqJD!0 z1F7o0I7feC6>r{7|C}WO{Ya7f4hUYs8eGTM$%yh-7g_jdi|+pDgZ_WoH=&x^XRys# z>`nSybIx1DpE7-CzQ8?#y5gbhU1xEUW0Y>`on@tX@Zie3Zjtn_W8e(e&Qp!D1P-fl zs08yQKf7?nZ^*Y_kMePO2vm4lBZ!v+>bmV#xzp679Bh)`D;=wO-^KOu_w{hYWs`&8 z0$QNYK`8#P$vD*nPO1I{BhM?b((eiWRG5HhGGoIpZ}Q+!Cbt5dkQDuvMdvD8sg@2r zs%?~gs6(qe+=x!Izi0=$?5MlVTg#ds@$tPT_vnIm#n1nuQNcvaZLY(|66LRUig!uY zIl`}X;k|*R8!AH^I#mc7cyy8cYSftNM6?V2&g^djM#zbDcHriLu+fjV~j^`7D$w}s#+DD0v zdOu#X2@^vltd*LSc5TpXixa^|$4%Wjfs%Hw9jMro%iYPA7SI!$*#H~Cm=uOj>wQ8) zq~b8#o>|E9ikgG&ZO{?HGnaAgdpnnc#S8`Y``%kqthtr|>bAof!b1^k+Emaj#W|BS&lMHLmr=>2^R5C^SHCX4!bjr!@^{;3>*yS2f^C+KN z$Gzf#UutAT{m5nB1|!xD-)taezc4wONO@SNInrCK3Nbhbgk&Sxab8p!*uI3G;5M-d zu`L(V{5sVz=_4A9?GVW8XTaN!l>#M~Dy3m&__`Gs%fKv`7=ydAFKFj-_S>IvskA%6 z@YA6uu3S$UN(Kp;+2`+E?S@JQ8h&Xy9w`wx&L$UgFQ2v{m2dN{s z=E&n*j;b?w|CM;(x*~;+q4p)WeHE@n*tn$b{q(a!@~hISO8yCS93Jb$+6_{@mtr$F ziOm~s^#-BPh_@y0>T)S&CuE5}6!n-yXj{)#$g;nCKLmkJmeQ6gu<{C+gv5V9+74># z63k&-{D#hW))U(9Bu2&#xy;m-#LU!Hc;mmMFKs)B@bGg7DQsu%gjOfm_-JdDDjJ?~ zzKAO~3CUMe7!S{P9X=?qmNrQRQRp~z9|LlX1pr4NCi#Enb}D<<;b9bG4<7KpXflk> zV{R*5e#{9$J)Cl~%8(h;?#ZtO>XHPU$~j?}fF=@;R_Ds{aiAppI@mso(x%67)UlgJ zUJTb~VKbI(8uw`+^vkc;kLx3dbu0-StRpOIFkJLvd(G`B_N8(ArzMy1l{U)Vjf6!P zQgSks^2<~L`7{7&6QT&TD{KkzEox`UL~i7I_HRVvVsB&&$cKfoB?AN2A+D5j1obkkxj$P0+? zV8^~#ZvS*-TdqpgBHO#|&-%#|N0lRpE#NGwU0uhR+m&R?iJEfS#}}kJSo1;<)E0R0 zdtaw)D;4VSt&w^7uw%1{yx7{spS)$ej{|KG?9Yq`SD!}s7#!CVB_Ge|3&pcnsx6$T z7XKc@%6DAa7pO`8?M0qT^_()Wi#qD#Q=g#mP3l7?>=(aA$sua!4%7++lr)>=j9gac zdQv}GYuf*a`531|q8*8&Cm`vj^81(gvvC{cy$JVH*qEcr`oq}iO6oeNrJZ8$R8DlO z%ZK=AE%@)pgeo?fwC7w52KjDm?;nF(`u=$)De4RMYrW&TjGHS`55(GNHhtAZnczVGP*f<&-Tc+8?9 z9!2ma&Nhg;?9gLgb$v%Az;mA-a9dblVmx3meVIuXlJE$~v6Y#1U+bd90cO5aeI{;t ztUa&GD-Vo-f?_*zL8q9p&-!x?aigXXpdE1UXUDnxEe?1S4Ubw5_?6#*`{_ajYo--}2w$D%&4^e1}=q=c*fL`%Bh5XjB z7Rv#2j9NaDu!B>3u9R5e(Jpv4?dJR}^32*cqQr_^UKgecn#8r5rz0#kHz7@3H(=k%x z;nf2X&Ym)RBhJBQ+JRmbZ1gq$V-!n^5vRs}e%J}+$989dPv-)dWCVE5&dRP(pX2yh z!6X4R$@;-5x+hdGSTKDNX=_xcy1ixjl=Fv~6mJl(`D?8*mTjE(uRPBW-eg!ju_?KXYIS2CocE}~SHy0Kzdz1GEi+{S(L6ys| z_&)7Lg{AilV|1+NF~jvz-&qgD+?;<0`s(JYJVQ{{w=tpOll&Y5!7<`|w%I@N>f83u z$Dih*e+vEeBJ$0Nrry;zNM4i0Jlx^d@f`%&{ticIp+M*<8e{voi-@Wn{4cRQ3T0nO162b zpum#%9dgv+Bv%_$4UH4l^u-rl?K=Znivo z?c>*>P)>=S09N^RjbvAz;17+MKx>fa*#mE9UDBX(+jMHDQ`Gd0gZSI8akhXQ3yiIW zDUQLKpOZ$K&(_uRlmYge@PLQaO>ZGF+v8*Uf(8LTSw%#7Mb%fv_f5YupO2viRktt7 zN=xxd1sB}NrI*AB$1lLa+IQr&*DM>A`*YR%*Hy;S*E#R!#R;pf_*HFwt33W%QP!Q2 zF)?9x#l5&%K2j-gt+>;3;h1|MI;&7MHrZ_O%){Za9bp@Pre*lU*sV4A(Rl#rP@q&< zZXH5e@3+VFUM+U!x#s5;*td=cJ58OLo|95HkC)5dWQF&+!JyB-v{ea-9Y|M!!UM5a zY=skR!4EQS$4uicH=5r~-a<~4B2?_0v_8!7#m~g0rK!<3QZM*$Aja>{4O7hZ^||sN z()<{soxVz%CxBZc-oQW#rMltC-Pc8t_I4sJQ?FB34E*fTdpC3GU9pkuR5Nt%auUPd zGm>bGV~$*ld?>!aM~;|5x5q~EI{a}!#brt}^70CX6ugks7>yf?RY|IcMRg6)qGk^{j*oBb~9%%3^1-i>V99+M9^rV?dP7(x(4yoN_K;3L=UBA2X2M z(0$9Z!U{|$UH)Ix_CIl3C`9w53M8$`xec`c zBz}4DMtMNfSsvdVyhQ));8X(tQ_6jShgg-O48VZV>(Ldcv})K}9~@QGHW6@fCd1|g zfs->Ev*KLl`=5vD!O%JGDtdI>O|VH~Yx4w++#{{HedC1nd-1oT$tz|Siyhm4g5cMo z6+W?^6V!Y;m8Ig7dwm5Z)=+aiichS2dJhjFO3-17r{Ru~Zfw10PfMsS#BnZ0+;mQY zH0}eW6eDZcts(@$54IOcb`E9-t0$~z5pw+)&MTc4J<*3HQe z(+DoYKUI4}#)KOVBI3LnsZTl=T@HQCyyz@1GE&a_5DMv(C=50Ju*Fm(*MECik$Co7Y4z<=`vagVAK7v4R)NoY z`jAgyr~C)>0~R{_KgcSQa{bCtz&FQbm7Z*~qE}5zZDOZaDV2Om=eAq4hzHh18G@_l z$I&o&)euH!CsWK(5Z-uv35+v8>c4N1G)8RB(cfw2eNXbWXLEIn?C{uaA~h@vlBlgD z9D3?MNn3c%d^agqXw<^O+9~!csPC6e!}Ddn;agea-k^C=*z((< z>(e-)t&1j!sp?ZCBLAH@+XO?nCT^sR5?gc%-AsHDiFO{@)@4p)jalqZ5FSE}YHK$;f(;X&ImDlb<~|KuUSYjcR=n@o8$Lk z2jTU*Vqx5JU+!iaH_L_Hhr-{B%`Zq&%k#}|Ry2G1Y zR3BkdB+|Z_&5aVHXrnNzmnE{ODmRc)ddL5PUc7jDp!yx@2N^o)S9^rpP>oepC4c!M zSEGJXc17}6ZIb-juh4(LA+4f%&Yu-6I2-~phTUBb=$Dz>CE;ph9FKouTb#z_h7x6` z%0{foYVtN4Pqd1q2e{<8N__l*!>e#0K!H}fT`(2D@rg)-CSDV=ksP{j!)ikU z`#bY5vB4UuufURJs`$@~#7OdA-_rkU3H<-;fxr-)WeP;ZFea2v1-6ha(C8T5hYHd@ zD@k83B)<7{mBNI;_Ms&8m&M|*(>+;V!(Mback>2_xsNHN8!hk8y=a(I3pgb610_s9 ztjCPU%(cDOAEZxk;tUiGxTBF3Jzb_~<6miXVQk{W==er!p7AAWZ5-v1QFbBd+Ul{q zUzfbdVth5D=wB{-eHbX}bH95#CrG+OY&TFheY_tN)w+3BQ6YNSFp(fJwu3!RoCxlj z2<&|$Q3o#{vVsX-1y?&nDQ5+5Vvz|`NBQ__7aOKXC+rPx*-1AJ27ef==K1w0XjIk* zq<#mOGM^a^c-hwQCK)X(N^VA2(BQu>4gK6lOZ2XfZ7{%eDd>S+Wy!6CvGvmwvyY%K zNCjv$;}gfC=q9TtKbmLx8k5|dc^*rxQ?Lmlmwf83Z;bN2BR-N9t zy~@vk{R41zv11;uzHG-XRlwV?6)X^dD!aP6yVomokuQ6e(HJ9i;*btl)*gU5`1p9r{CRCoMS$>W@ zu-BaKfv1_t{i%nEtTrUBiUxVm(hl!pk#{g-ph(9Is%|$ATg^$UN~9QDWH5qkWXQ=! z30$SFN0=*uqP`7PNtBvREVpeSiwvXD_EubOFUlHUR}gtV_2P(3g6_F3Z`4&>vZsYV zw>P-9eJO!L#EiHVex_Va)wgAfbTejJ76IB(G-gR6Ndk8%Q<8Em5XQbxqiF^sKJ~~T zFJRyRD^%C>@DB&}6Y-HmTQo?g@+CYg`b| z*y`8UgdAbw>#&C4lZ}mxTRagu5KSjknyvim^!s()kRll-C!HJZw}8FHLWaz(Ulys` zl}tP~`wYN1G1?OzmFtTe?h_Y+K*TP{$qvp z3wMK>+7)Gn!B+o{0M(h)rZm1-aft)Qr{&*Y_II#0!VES2caio>I@he^l2*fY zP0-vFX`QfLfI+UXhJt`=&5_v{Jz>1FKU;S7w3X0V%A-AtZtuI7Y;1Ul=c|}b)uG2- z&hOYi2juO76Wlb%_`3qGWLsg6IFmkW{C@XirlMkkV(GnF$VZL7 zjBU4Zs{*@df4XsrwPP~Ei4UkEwmgc&Z1WGCUj#8(tk@=Bo#+%&e=J+)ukNR6AwB~4 zHa$En3ABka#MC^5JUWD7-+jY6*H>S^SvpxWKopzY8Z>F5EwHj(3YS&jH^-S2-fL4;4LZ9DK|NkuS3z~of_G<4?zeyd#!qm$ zXKfnlme21eO8QAcA@YHFYi%8Rta;>$Q}#Po4)ojYc<>jB-{c<40Ccu5`0!_KUEZD3 z!lM>}x^eoGH*<}*q~$bLC{;`w3+BSBJSlw)KOqRvJo;F|4lCK`aNwG*_6qwj7;~KI za>1XO)Ku|3oUWomy__a^{mNGm z+=sJ_xE|;Q^Xjy($Gew9)fzuKSHwGDl5rw}nIl!fsISwOKEY zt)yK<*?ZtEY*fW}Z+=bdRR$-xqZq6g^$sP-rp;QK>dnajEGDbj#kHQW^j!^P4zBvA*~XtZmfSCI-nuA>UugyXFmF=Z6* zmznC=lb9aPxJ7{U!v_?u*q67ftun-TbZ>OQs&$6;5*z%>U`@lI&Fo6I)5kZ8YU3Pb zwM*F)l4m^SKdWQM2B5UhxEEVf@4FV`P4mBD^kZ(kH>E|NJ{|>A%)XXp% z|3q!e3$^rkk#{H}tt%+_B5(lbWa82SiPMiPP2hJOJh7uJI{78^afzG%ctfX{#^~Fpk1{o-#`LuiO-nb5}>5RE;`v$znRIS1n8&#fO&iLP}92Yo1+-v%gB-28R1ID3IfZRw9}k^y!M6D zpRmb789+4)Fu!xTo0>Hepm|QCdC=#y$E&+gtTowgnn5Kpv*=g9WU9G90_2ztUif^O z6yg;Xx;BGlxP&gx#uGbiL5Y=9JLj+eq7fX<&VBF8J0R}_H#_sFWzL@zPBw2%d0<*b zEm?emP{vBOiEI&J_hpl={~&7>xF#%a=U&K8qA8z{+pt{=@faHLD7qe$xAY9~i6x5z zMx>dg8S0pB#$54e!+C4QO0I1^N3DPpzAaYNsW^e?BV*|e(U3N)>Gj)$CE}p7X(!fgyR)Qz{1!r{+PQAOnruf#P8OhCIPlso3X=~VN9C^<= z8xg2HRlYQqLP`fD$jiFh8vVRW*J{9Twv@O*Vv*ddq1Pgo$&tR=j^$Bx{y1Ec$5gLr z&2Vn9z~8_jpbUvsgA_~ML^;YRoB<)~yJ?`y*fy9YkNEVi!m8DHXs4S25qP3gn9 zPaNP9bo!Y}{9;$F(R)7E)GhE0Av#&wFF zxzWUwU*7=I6W9IJ)B}|F{a59ml50N+fD(WnZ>w$`A_rS(JV)$#2A}H(JF%*EyTQy) z5sI-_Leuq*H=xkcD#_eZ!r5Y3LZ8WRcKg$+FO*tH)Xig6#{p}@83+9htt#B*;Lk)y%=Y46(22{=FCYuDrt%!mA=t%lPBL&25I z1#;Nqt~(u)Yw>h}zR_uQ8OZE^w1e7zWdFY|3k})eNLh9$*$=5O7acl{YPMTGgr#u# zM~9(C6aA^wZnn=)?2A_nduHlGI2=ZFJlLG=N?-Vvg47$hpV@v;8QgxGzY>wH(nCwi zXkptQDUfH{!}BTYUoF@_&!gcav7)?9V7$7bJmKHjo5|QPwm{(Tk|cnSiIYU*zhI7} z7O2qp_ionzs~P|&X661BkIC3pFRvE+!jETqdWHu)LmwY41wKL^vdxI6Qw_vTNssUw z(fIRA%VT4Obyw!1UUwE&r2QCYTc0c3G!fD=J@nOe!{q?3y!Y=1S|Y14GXY@qE!O?5 zIUKSbcav0g2jx^GsU!}O9zjD$7f*QL&?X(7RrLvB6*l%=6jvPQ1}_4qmJYKv=%;Go zIcD`lZi_mHpL`oo_IlZ4)4Q?rm@42DbMi;&@rfvfYEzDn?np2Vd;VEJ=N#zg8iFb; z7N`8WwTAuOYVmjg7Gn16SMg-d)}q19=4+(XPTs?Gy#_-NY*5dH>a+0in7Hu1^b_}f zee4s#6f%+5$T}53O#A2o-c1c%8gjyzt>Dr6is9a|6>}Um8fHW5e;Ui4uM=xWD8NXL z4SVXpeyjdHw|Go`@NSR6Q2kb z1=6_v^Z~0@+D^H0ni&kp-kcB@s28@MyU~ zKMh|Jy(jk=fT5nN4H=}bW3mE0TkZfB&DC#inGtLGrgozHX$9VjJuuM6|E(w|Erth? zsN#JwN|HHW3*!+}5ULAEF>Y2gxQj9F4J9%>TKh_~sp)Y!!0gi@PtT z=*P+VYKlGr&0M%&jOzZ=7$}J}qM>R*VYwpLfXXu8hBKirj@L0DFAAaNyVGzX{@f9* zy>0L(!ks`cW@-Nb)?b;k4=+)?3U9rA^QrOfj-?`8qn+%zOt3Z?nkVU;LdG0l6h$m# zk)b)WY!pM@xwHd4i*#Vwh?fc-?(=nHGqW!B%(BFF@9n!0I)W7Q1K8MQk+D@kAxH(B zAk&!nL_b`)E!h#L)~9_CYzXzK9{jSCDqsG(N*{OxKsxLf5su(-^__ig|NgD`yP7AU zXwYmz;81aHl-FN0E#ULhg4ovq*CK1uKGMP0Fc8zJk(Y}5BK^Q^vcf}FDM}^gG)xEL zC#r#4mjh($nOm#uWNI5NVxil4GLN)8(b0%c?4rHNM|HREGHp`$Ic#dmYZDv@?#W+4 z#ruUHq)5F_UUM1vg_9f~ro%YveujM5qWGS~A>@*pZFq!}La=W?M>7n&sZm<7l;Sn$ zFMLR%zb&qC6psIkR_aiARtmOhHIDrOUggvE5~$zn{&ib=84o*c{#Y}aj)cE{cmN^g z%hZcZUdtgnz{3=6PF|&k(RAUX)K|R(;8&1^$1U@%?xhmKjpU$J=?9w-`M^ij5bz7| zgz9;zja?boK#vglMCZ2LII8zna`+|QMWZ$-aWTANCv(&&%KyR>eJiEu8el#4NYVGM z8;4z+uDSpZiH9X#{-*urp*IKsRLU#fAT;Hhl~;hD&1Ts!V^lzy*8myIb?eEErKd{G$>w=ZPXj#?Mhee}7*D=iN0^l@$(Qn=74vQr)lFd_71+Kae`wW{X zjI~YUoaV*Xs}TXbfM03B)^x+}-TD`Lnrd`pY>I$blLx+yDzTwIUK6Tr&PHUm(uJq5 zNQ$9&oGfX`^cKJH6tlUp)x<1>5$L43RB^ z)uTw56D69sb}uUCk&06m@F|BDHyw*X`>OhZ@SOq9`lgY$H9} zNtmTw$g9rh3NB5C7t1U1;=*ILAO50!$z!@54%=yTzS@7<_nq)1TaZ zcknl{m&U2pmpaOp@Z#D;&ev$UU(g8d-(K?DbwMT2W-C%E6BQ-fJq4moYkoImRf=a$ z4OpUK;wq$j(ns0x$aLlpz8fP;!z4h@S4qfS@}ZHs!vCCm3WA+LwY%inII99N^N4UV$m|@fwjucxx&ETLU4L zrK~*opu`MHI_al<`UAfntkoMd@-^=1y+;4s0_q1Z{Duffs_VQ@u4H#fOexugBs=MOlu@@FK|DyaZhDl z4r?b9%y?ZG2KcF)7JI++i)6{T?7zi8!p77-JY6z%iZ{;5E}z~kI| ziu>=H7p8hz*`a&Z`1s%>2T4%VT^P`h_Umxvt+_vMs9A7T$7)Yiqp7P9(ryen0B(he z9JO+8;5{&j#((=1?v$(@0;MAGfsf{|Wh*8X2l?k28yG7)GtHFfe zr76L3%S_N`(bxPm?!lZ@IK;L&82;r!bvBT*t$w0f_}S|UZ+`4r>TOlvVJX+L&LWil z+$Gg8Dcxkl7)v)oYmcTXgAV#M;%1Zot}8(A(|#@d6cwK&k}&OKudh*0NAGRu#Vl_3 zlsG*MV&Iw{w?IuEnkS*~t^`X1GJtf^+K9Bscooma3g)H`+0^^Faq~8xQ~2n z8rO?RfS)~50_W%aI|NIoShW8wP&cqW9Ktww|9TMoD$HxKb3=Zjo%_M&U83^!MA9DY zZkjf(rAa*{Es^2Drp|Y;8rH&UavgG`@erK$pcT3n1j(Eu<$K<&@w?waksQ-ZI9DA-8`t9FFhYe8y@5*l(`Ezblz4Z5C26w396Gq zN`WJJyUuTYqTLpBQ3)v}MvNnyd~(+|U*HcjWG3Sp`>OTl;3L7alD9wdIE5{lS95Ie zwVt}j9-z(CwCWn>-CA2v8p#zFT~n7T+;=r6wBq@bD07xZge<73h9BFwaQGI%a?DWV-Li-q;JK|RJ+}2Y775(wzVB_3m2Qcv*T}zAsWOX z6sEpE8neF^dtj%kGEZcPTb{n|p*ex%K7z_}k$B>df}d`b;sP``DeWcSL=Ow!029_^ zp?(>g2fwvaZJh(YhBP#Kwu;yCi*_OQWm#jSwd~9kF*&8$59}UKAEqjgLiy??VGVre z=+uR}=pZAPu-F>mt;HFdb)Y%wBwM`sPu2x<>K1b*#EO^q1&3SQ+MzDgHI5Q}9uOQf zh$y$g!5*f2Q-x*ENA&aZPkAnE%Unh7v~T7}5g^iHJk0wQf4jzwI8Iq^9iq~b80d>s zo)7t?Y||`mJxT>}yiBAlMURT5iY(%AYbYJwuO?{Qe&A1&mN|Q~rCk(yUr<7vQGUSY zUIDG;XwAh+ZGZWeEnd#K&!^?3$<#*lo2sAASq_0-*% zsTVfg&g`42i#fv;#rYe(`5yZYcri}d1}R!_5Pt2jYd!W*iw?TO zcTu`>9?Sl7Op<37n{|xKt-#8HmY1LRTM|!(WQ*Ju&CgmlZ2$O|MiBq!Tnrt^BYd** zVonwP^6Hf`YbMfSPm;bKv#)2%6sf*-AA0SoITi*p=qmB}5TW)&Wio?f*i|e=zfZU%-kKF)4{4UI_N+!H%u2 zdd5}JKt4+`J2zkI^nsY%M)-;|hnsUyx(*}sS1BEYB{m`faa#9_CE#t zk2o}1Rj3KDD`HpI9s5!d9HrBQs_H1xA+0KfQ-KSH=lhaVBGJ*eIkKYYRJ+yfHxzX* z5Y_5#kLbv8%-MTp|ShP+#A?)`d?;Sj!c6H{uGMua;ujkdR;RX)!8D2s2Sgq#V%d+YOvZ zyzjPvXJ;>mF7T9HjbKzXz1k3>pQp0ghZ?K1C`8=Rfr-wx{UU<kk5CfJL=0 zFs#HMU~EI)VkzNWgz68hHT@sn#b27li9g8gxu_2eEBIrA4T0G#?^|3;<9)Cu zwgtd_^%Wt(KR_ zU)mDgUUa{=XpVr>f zh##i3)z5G;a2t`6hM1||%px5yYp}n1KK3&sZ&S5!L&6;|jrds|Qffymc{vn3(;qIt zM{&p!4VU?eLEf7T1ngYc%tBlj5znz%`Z2C59*c0*Qg3)EJz8QhZ?*;VgW?7MCxYM&zeh3s82b(P`Ox zA#nn4F&#?K7%f&)j?Qa(aB==Lp;UFfo5+DNc}i|VfLWL~Na^y9f?wRSPbcBU6}V=l zTcEDnoW_(IuhM)z#*jbZq36qnuP0mA8ULPor|HI!CT9iR51FCY*FV}fZ#OCi19CO& zWU6u>8F|j@+S%q6bqj`%Q3rueD-?D9jArLS>OBS#O>}2v;*nrwe@)2ryC(|qE%Wzn;=kjOEs^bEU0!Elqn|>!O;S$5 zDuopVw;SVI239N1wsBAoRSEBnu;!iCvwi)9h@S?H43VDSm$i=fA5IcR%VNPu(0Wlely<@wQs>(QQWAD7($lvG(b^;@VoU#xTir#?IN#_8HDcYX!h!j}aPQ;27 z9n|`Dk40sEn$ux8QaW(jZ%op zC;g)AfoRc2=_5u zms|APbKMu$?H^jbv&;z5VQ$NpN2-pOOZn&i-yCcECvr4VNj9%2aU1+#UhO5BBJb0i zsD+K0R%iLmhj>G#O`k68Ur3b|+oX_QOM zbv)ItsEkuXa*g&(d=FVjZlcTfi*(l7oRk#W;>0Xcw$wZ(eQBuL3_t$|d^=(RU>pr# zDr;P<=$)AX#?m)+wjDQRLi)Aqwg=&FVnxEq35S1_BAd$7ym`ZRjzBy`m$xtpc8yh~ zEgcU5ml0|)D`))MnY|Hn110PMq@6OQO+{l(to&S3S}0GgSFyjLX=e4%pM0$)7HSil=Af zRm@EHgEZ-NcnuQVWSMsAvTpA@%HG*d)W@Oi7O+P(`<3^(`3Sfv7*Kp%blKM^)z-Kb zK9ZFYr)fIQRz9$1*G^ta&7v%vEbCq{)g7SdIk4+p-e@(y3ab?~dAb`78=?#~0gj8M z2fKMXzk0jGo0I~4t94Y>hXyzQL^&zcA}jmd9R53>8;EUyVXA}pCk?6N9-b=kH+lKF zBwraBMM)Ola|#oXY1$0UetM}>ZYL!$gQwe%s*^womD3#;e@VFD`_N3ytF@K!ZKEV2 zsdJ|sqh!b4u=sgOW^oIVcR4y4|J!v>LFxlW*LAy?7kvtj2M(l|^^YMrVcOe)c|6+i z*-SNx0M-ue`Jv>3q1ufEk*S?yWrfWAwYU1_7lo70dwA4!HTN_2XP83%?JNPJ36CcL zX_Z9%U!Rn^B+h@1v;W_&rhlWQPL7}Gc%1%ph6RX?%Wm{=I)MD+=OyVM2`4^pP}*N# z4QTqM#WA|OgNcx@G2;r$yXnc;?{-=R+FCYDA~-$5Wvc7?7>I*1pL~o|d6^csMnVcW z!YX3_BLV-Dfq@s^i>bEO&+o)V;I_vOS>bB2;%^sDd#MfTu~aMbowf4|*7)P^n{%DJ zmX?-1^Cr}7#1*UgzMpuIgIxM-qiFM=f;(Rg#x1muk+yl#XL38gflz(l>$s*zZZut~ zz8Zv}${WY>U$T}Gq?0?uz_o5+KPz+xwTa|zV+el!DDkGh4GZ`6RtlkJXXwnkdasD>kVBc5kKxS4byaZTU`I{ zZR(ck)BB_4@6J3a%ta_FUmz|w)rdViR2%!8n)jrg2lYjZzl8rwIXQ!rYssw5VL#F{ ztkha{@k@{x3p!06?C!wkvtE-WS8_ZhIi!;9$c>xAP53vP|sx)(3pAsGP zO$YWWwy^L33g|;)mvyLq*Cvkv>+mj33eNcvU#KPx-__D?E&Vw#E=V%Lv+N#3&@XY6 z>wI?!WZ$&J&F?_FP%GTSW{EdGJ~W$qzFJB=`5~uIQGCQ^&9uUn_Jp&UTTV}X1bC4p zO{Mh$$KEc~&DW-37(yR4awpOYAr1Hyb*3rw^ksz^W=C_`=5;x9 z(8^~{SKuZ?S$8_LdPFaOBs=1EK39Fa;_4sl(ffb+`s%1QzP4K^v=oYz7AOwIy+Cma z6j}&U+yj*25ZtX0oR;EN2ofkR!QI{6-QC?u@BH3R?t8zx?)@WcO)|;E=A3!X-uu~G zbcizB@%M+2e%nUxNtY#E?fu1wKjD8-`ttSkNi=(Wzt?~yDIR-|Acfbj7DR8gN|E}q zezo(pGJxHgS}0id%h(u77R7EQm+oi0>o7FwplC$9k-OtygTnfxTGZ_n?8Z{t08Smz zf2*EbU54*3X*u{uzqO;FB6Tnh@OSemoc$J0G*7cKW^ZXn1F&)bl}d(cxU_n>!0k<2 zT6EBo$~4|IZpGzpQ^UF>39LevKN{bMocGNEFw!_LQxX5mB%kjdlsPAR%v^tlQoOEA zErml9Ojd)_50;gc^}z|ov`h8yH|D1c8IY71BO}~Zz5FeuSjxtmPRGnLd*HQO*&UzzKwq6^vh_)S8aVMIAGr^&X z%Pr|~{iE3WyAhh4d7FsB!uLL0BI5(l{a1LLi)!wI)xbtQc~IioR*>W`bu+_ckPv{j zi0?ofnh#*JQwTQR0=KzyW0ih5!>QP$v=>>8*jJFpnJ}D--hAV!w!-rdFCoa7BHi8S z^`CF;tEAy^1{Vij-MqbY#ZJ~F^`M{F^Hr zk$RHCWwMFY>}s3DVdv`|Q2PEhxGRMrg+F?OQ;b_+r_Tc)>Bci&_gaI?5v;rbvM2UC z&b=>lrR<*2uqFtw?6%;oh4E9J4V2KPQ>IPH6rHyUr4+t-1%^P%KJGslQG494+-tbh zW@&|ip$B;x_smvZaz=irwB#qaAOBptFn9ICwizWYp{8BU-dk^Pw(nGNvZB5AeZ2j7 z4rCG)ab_+Gn!YAC8arO-BO3)M*j%ET-+m;(x+b`F!xAY_Svr>YbKB4&sVZS~^q|Ue z`bs^0k)klhr2Imt%CS_*$J5wMEHbaDidhnTEg;0DS*6wEt?4AXLUochyZxy9V`;Ya z5%QC1Egq4i6Sx-;VFQhmEHR^Ux*tLRFc#u2_4Q9u$VU{l{Mz(q3OKsquM}m8U$Qw@ z=jQy*nr&b7uYFLY%94sN^wik?VI48IS}l&ue?Ic~aVxH6jqkPQO4;M`oQ*<{@BRW@ zT&Kih6fAiKB)~o}KOQ5in^#0?@ArS&WG!rmw>Y8AsMdsB^NZTg`CD0DYmOBZSYK0g zqN|#tY6~nhgoLLO=k?^oVe>PtF_GYWRW9p=*OyTFY~>lj8r{#HryPBE~OyYe@>2s$PY#Q#7q9gYwZ{HIlwjvK` z_9m8R;`g}k0;?Y|+yMeeQuwtI`YR!gxcHo0?W%nX3YYV$82K@RHOn=xj9;$j zCPnex?O-(~UdCF7ls_pS{`^IW5u9HZ*!qQC|7TBC7c7?x83Febd<%#+_m`my2&HLO z`M8m6uUYB&D0HeL9lvDmy1_iDhMcTeKe@7nHLH3MwjSl3J&Kr{|2R7rmy(h{pW( zXlE#3e}gsf^T_GfhMRjd6+ErikT0_3Vz);Oe5wEJ#{c8VPBh6Dch-!=dLK(vEM4;J zw?_3MQaDEG;$tL{lSOg$;0sa9gmpnpib7QdRMu13reg8J?pH+coGtM(Ao zVe3SS^T8{XNGTKTTy!Zg=?)vO7`$mW+xq9F>y}ZRd9IMXR8Hcb9`B7&@3(o9O-XM% zT-^YUg%~Q^)5SbFVZSh^$DE8@b2GjZpc=|1CCYxL!CiM_O}aGhWSQ}@5tTMP|oTg2o#w)Z#*}zW6-NXAx`0_rDQpmiA~CUB90;a`h(}; zpw%AuDla$FbsD|Ipt5z-HGF-X7Gq(n%HMS&n9#7$3WWacek%4|$YAwE46$<;6#s52 z8EO)1LS`YFjQqBK3p-FL?Pr2jm0LO6eu7OcZYuP6l56s5NP8Rg0O4)lHDU$^H+!Hz z3AU$0_5(%-1t{p=kjdM85^$PdaJtjPBY!LhyIfn7p}}@Thb&ZuHeiKpm%}^@m~W1% zY40N1lB-3t>)emRUBB$A0L}@#7AD$)3eWe%+G-6PRkB7gsMi8HGHWP=+pH>jZR<|im`&{6HDvT31%O(>phB2~zs@5ww6bEAb9(xyDs zsXK|+a;ILSlXpQF(;Qe}!SGr%yEcmgN0oQgTM}ZWz3P^1gPr-(b3+6DolaFmG;2tO zlL$85A&<9;+wU*GLDRNQwM~x|$0T=og)G-%;di|8iR+%Xf7s|#O(G*!+tUoa>kHcL zLsmge^g^*%&$HiF%sKPF?>H29~}}s3?y3oQ(FHAxcd)4@Shd+KhCcISBHe4cI>7C zb0s2U_Y9)x_q@v!CZAcsmH}$Jy4y^%c_#s+ICjy1A+sZ554l(}0|s32_%vl!5xu8|S|$=B|{Fdtjc> zkk(8oEO)0J5l~J|Zi~;G=Xhctpb9IG7-tAf>u5<-oh>w`#UB@<@Ue1IkPLdwZCvee zF+dzfGw&!mY;K3IdaJBZ%py5Lp+eL5S7)eyQP>Gh_1lk;pF;ZM-){7hLh+7On|nNv z$x}ga?h5lG2gC0#p*8F9iHXLdU*TctG}ST{wV2{tpS6y+|0J(p7LrxW?7gY7zZfQL z#xBN7v{FE^SvbE|+z#ol^I>DTB_^W zxw`&GET*>yQwmKwgb#SYM@@Xvg`ar0fj14yG`(~sHZh@5NZY`l%TmX=R!~C*j}?4F zkLKG0m~o59FNWVQG5qj6jH5VNIu&hLb507M7Q;>+=bZs`>IoA62G(95CPl9hRHujX zfz)a2;uR-ghUW<1g6tMq&@tRPzX8{=zt!C)*HG{6`uV2e7?2?##J%2H$mHlXKghC= zPl3dGpt5tBMYGB3QDKtwghN`&|17=KMq25P%eZ2ucQ1>IWlt^}Tlo23d9R6nRS2=4 zb?m*Hl;Tk6VV~$6tI$~l>&5Q}P`S?sQmKB8=7D2doOJwTbJdh>=87tPg}NNNv0c)8 zRrsP&zQ~XWAkb1r1#aEgbr*Zp^x2<1weBarEoCk*YMd}25zqVVKlXf{DzW>lkc6Sy zbbgMJ!mrw45eUy2O(E9_tk#QS@mF>qRxKZpy>*8xF zqxo~*j`4ts|K*PnufGh4>)ld&0ElN!`t|&>dPG0JDwth089p@JjzbMq{ z*DlPlboX=;`H{s`93uS03rkG}COZINyh^CDxXjGzaxZ~?LGh228IKwCO^Mliz-2~{ zbjd`lBi|(wx}-Zr_K^o+)GKvPYenFllwlty_M^aCTOUgXjXX&wz&3l68kt?72hB9U z(p*3O^tRe)A))~u9jYQ(&ZzF+m*}%QSEBf=ZqN+F(j#P3*AXm3@-~4W;ZJm0y1gU` zPi-1HPwYY7p%exJg)dg+kjK!6PNN-d7Yryr%WH$~7EAWH;5m@4bsMiecO9pXP^WQ4 zseqxaHDOyqoyYun{Kec>^v44iQDpFW(G#sDMy?u`mKFal7EjjQ1C#S_0tX;N5gg|? zc9O+&zxu_I(f-?C4@7{h?BZ!2e*2l0F=tBz!>)~W5=Elo+t^EV57L9n=ZH#?cZV*r zV6^%dlWD(6=DXFc?19WO!SkS}3OKemo~oW?!wevr7ZHnnA`#HsT(AD{y7zEe41&0E z%deDmB{=TH%eM74o7)x_2J?5*?-e#G#>;tlraCsE4bSscaEdfX)(U6%<}MC>@8G-4u5f8z%3!-THeDp@Hn$Jinbor_roi}{e4+E@oc9% zM!$3zU6Lw2+GEdz$^4E8Yvx1)t&u0~qRww_6umX)xkKLvk%+PSWt>|FIX1*~>vN1h zA&XPgRY3&xFYY^?u|T>pfRH_DPJ3qhw;cS9B|qMWAuUQp#g9UO!+;=Rd9r4?+wTra zs*(x%YEp8tb}E>Z5&S!@;N3JCW2ljWwbMRR^IFyJI+*M=bER?gMD>*=r(g}0A54*@#W^uz z6p$NBg#3}K8Si$-TM_FDn{z{w;H|O55uic`OQ_CzBPN@HEJLrfUA(PHsSu8*!xgP_ zgb#!7=23QEd8^9;j~rL`2+`oRMI62ep9ih5gc0bzSXZv6AoiB<&s};AD9^>!Akx1* z1OKd83_{&#!^OCKQKCTveCLCN@CL-Xo`l-H#fp^)`wc7bLqANJ1CA=iC>EIMzn5%iODFUp${bdP{*FHhwZBq6iso z3R!axoy!`KkP@WV0Tv0}XiRs;s=R{EKaS`s64niF{oudhIT)g~)K`TG9c5AVbkOpp zU*kDtzCNVhr0I#VN0zPdOD*L7Y8y)zE+6rj*IcoitB#hzMoTlZ-B zbCAPgUgxL6=w@kY3VQ_VH1a8Yhgq`HA0Dp@ZGhfQMpI40VudN;{H6Qq>4~{KHxY|b zcn{C9pjT$uiuZ*%cT-wUB2psVH)asOjMfY%4q0Ar3&y5c zF%?2y;i z!!zQfC`PNk%34&qF!GnBwx1*;HZF+PwHfTtDbUANwTjK1OwW42spqfCKHccR>|#HK zpr3AZW(j7^c0Sd6DUJbKs;+%QOLaCre!r{;g{;ujUL&+Peo*`S2~UkChNiic4ubLJ zv^aHt)%1tcE5}nUQD)pt=9(4N^h$5VvN;o#8%l}>XrzA^q`d5J-^lkk{G$R>SONKXJn zHUJDZf|`xRhxsNuJaz>#koZ-ybr7W5C-qcZrC$fY-05io04UNI$cOmXvf*FNPCz%p zf3F)1{}Uqr2PXgTTVwl55!}`>Z$VGde>3exRH_W&>gCc6Rp+O6{#U|gR{oWgIihc6 z)#k#t^By361eHIh$;vXurUflsO`B=PTW z^3Qf9&n(on7&MznR$5fyJv#V5Dsi;n>zX{aroJ&sG-& zmX58)-29Ufz|(4K!gn>8f|rCH7q%MTbg~sNs|(VBOJ;NCQlG0sc|~GISqC%Ml$Poo1kcunucqNy&ev9busE(~C%; zjDV>WUeG7*=I|$wH_NADxL{zAx|lE@1Uu1>7Gu`n38cNv(|5jzhY42 zcV7H5GL7eJc5hMwAwMktd}OAs(lLL6+o(8IZ$v5C2V^B#f0=FTO49UUO{%qu(R;e@ zTm*59wq!2(sT{_g>@jZnstp(rT;kLl8W*ZK8dPP9$XY2QTYV!fLbfkGtFbHL;`s_K zys>#K?dZ+~ZLFD71|cB7Gu}BH8r=3}0mjq9PgDq27mRdG0`(~3i#($+$DTiJwHgA( zaaCQJaLDcf&qR4=XY13`v*LdQtNHEJ5l5#gBE2@3GMMEMLH-?&1hJ)`&8I6Y*|0Wi zqAemoMe86*eHT-GtD@7ijJI5i6r|OkpxRY;3hE47`HNzpxG@P^gt@#{iE#ifKgOCL z9xbKzfP4(_Ukt9j8e*=Jj#k#9?X=$%d92@>O`U9u}3deao*kC-Q{JGTqI;O z@F3nXSk*VxQcm zd`L&bICUz~1drd>xBXq-7f^lWV;RFXFQKiL&?@xNd&2u=*pxhC;Yt+~F;jpin*dYL zEH`2w>JMNn$4XLCs*Xk-r$!nU3+e2=!bG5ie|;f2@)|jOhq%;O7 zgsU2BHP8g_&h?6Z=1SkCG!~)|xuU?gZ?Voh1O$uVvPt)%L)MZtQLQ1gN8YCo7*t_g zR8rcB0t(i9EJTQbHVwCM-P5@K!N660R|p-tNeqyMMS6VFG>ZChMD8H($~nui~U zx6Hg@^ar8cbjf!Up1d`;DTOXV5kC%iF&8gc=?uF?jX_38kuXO`3nAz2;jBfRZltz+ zfY|l)qF9Q79N%81^aI<=|AUfb`(MgYM|NWiaNMz_A}dHg%hLSC0y8&8Jz-q&zUesf1_!mvjUZz?8$G9*bQf5TK{dm~~QKWa`~ zk{pgB9GY}%$jzL_R=egU+Wg|xiK_<-UiI3#YCWlEi!Z)s;;nQ`(w217PQyQeQ&}pT!d;xBDACR& z4DLgG;6VB3w4DnW<_%a(pY5J;nqU|538jit!ngNWVyw^6vQ*t4B|5A`h&fSl@eo;hTm|jv4@?8oW<@EeLQf=tRAX$@flK1HnCgC|o-@ z(zH<7=KJ(fyd8`AD`29e$~ns!@{cVn?eji6qHF}1TDR(6V(Vt*M-buLWZeFnVQ-dDE_(~> z#Rwo(;Wx2XQ7%!TKGL*yR7)tyr0K3W6HkpTK1|rhISXRU&)kI!u`i72R%w8AVKz0= zw<_f4{VWj^lQ&M*3ag;GV#L_{X{SE7J2cq2^p(8*_48KeWGjoM(IkCTsDiY?V$Y>N zQ%BM+&*;O6^s_e}9PU@DHOMDb&f3MxGCEo|8F6cEGHm{kS{7VPE9-Aw?!_WylkX~i zrEvtT;N6;bb=xCW_gk8D)j_f_^r>SgsKCi;DM(57#v(&Y4;9%3hw29GT@G?R{PY$k83GK zsOXhLs$YtzQ#y`^-+0-+Ru58RW@oGx#S%QKizhose4*tHz6vjWt-sO2YJK7VjdHws?JzM5z<{dUppjR&OAh!?xnA zB=5(X;qLwY&c`yc{Sz~256>p9X)I_4MEPwCrA~ELika4=N!d3|zBVG%q zyjg%!!n0U z85F^ zC$x`3RhJ3Sjg>A{_sY@Al^T*7O3e!PhhN#M2R$8#BxGDru8XC@ANupU&9c`(pS5~y z2&~Efu@QDKViu^FKXNswRNy;si#U`{Ds)N=zFve%SgzgO|Gr8pNrhr-Ep=98Wp4Cw zbAM>9v=d6TT+KgGzTm@R%4A5;`ZNWIMTsj^lt1Eqt>ol=a+zmNAEICpj1bCTgrUBG zNoDYie{2g?@l|}{L;EL_CL;|~{hrj_UTI~_nnzbdqTEI>d+d-W7MmG|{cV~d0OO+q z83p6dq7hvgrjYtju54K&AhE>H?|+ue|MPxoFw8{SABN5roF%C$GnStA5;)es8iD^$ zt~3N?sx-1MXe9Y{9~BgU@rzL0wpG-`(ASS@{-OvLc@Y;p`}({n(M&G$Hk`;?@t#8% zDK?e0WBJC}khPMG$h>PDo`CBE%x+j#4n3pNC4K$f0s?&i9IG-PRV8Q9J&;x;0s^MU zT#3(b$c#x)4h{BjWDnF*2SzLHU(uHKNO1x0V^WKBx?MY)UF{tLx_rLJjGuI>|HSIK z+P(?GnDkJej>@XkDf~Wq*aM_wJ_N6SVupmcYDE*IU<`;FLO(r}tJ}PGd|&G|NL`NOlQed~<5@VZ zJ}nTOElvAq!<%G&3SVNyKgeOcAgo@~iQwDQ#0YYX$bn?7qJ=r|i?xMAPshX%p9-7w zPkBcbrTNU*$2f`4^`0&A=?D;Afx_A-Li0)NYc4lji<~C!{lG(LJ6Om};QMzH{j$xH zIF;c|>64|^JE(bEI$qNa1$QDun9l9sOM$_AIHswU{I&Ah3^H%}9eg?v;(;^>b0|*Uc_$z&SoHmVOR~<^zN=x0oK#6` zx8M3DlSW!!UolF&XCycB6WC)FQLB*Zm26$yv-=q7Rs=gb{gC9&7-j;Bur$k^e;l8` zEb=x7Gg2pqr-cWo-|Be(#z(G~JhULNqZqHeDpwY>d(WZ6%(!GHB6#Olh3>R&$(bSQ z!RYvYOxS9hZZuU!le9JBxOr5t3}5Qi?)BxAmLF zC~c-tx)=V*7ik)_F~|5{a(b_arxO1+!N*QdfNJ=BPMe5#Pl4s~u*K}pVM)sI|a2$QX(84RL9exAfk zhRAjvz+(}su+JgW{}3EMUDhvz=+XA2rSBG?e6(aKngcS9BTn8vx*;n@h|KPvE(A`_ zF*2qsL<~R!)uP+hxEgTwA2&9<!6?xd}7+B1ouo)rf&68%b*Y-FSuYdc?TuEo$ zB8)K}MG4P$OfLTVp|dN2Wm|48)f7!R1v(S~sJA}z)!rx^e6d4U{X#;et% z=(jVh#_+T+(*mY(cco%s`c+~^;!bwPwwFeEREN+&^3nrQcUK|RyhWXa!>?vALx+Lx zAIMZ>PNmv!l`35XqF=H;m?fBfKPGvtgdwsmn_9-@pF#NUG@m4$t_p+iT4+!R`2uH^ z<3mSG(9elO+b`Q=#k#w7kdA9R5MAcC3djr-o&%@1>i+HY3osYtcd3w&^d|<+#Se4QIoVp_68oIwIT(Y(!RdiM!apDo}4B266lQRLvelCpE54p>qW*+TC z_F^pfgEkRY$+_Dh8Xs#@J4<<+mu2V#FVyunAdF1`$uNCR$O;1a9QN>i{&Zz3K@bU^5O84Xi)R}%IjGk@n6+8#hT(&9hA)@hjS1j8O|(tBqTZgMZN>_yrHMU)G9Maf<2d%fBs0>pBbNa;X%g3 znK=+wAh-~I9LZjj|L#LmoF0cMv9?4Hh8YP}Hmg}|xe3czfT%ET^L20QBdf7-uLkn`pxN+TzZbbGsNZv{6vQ)N6ym}%$`&cz_Z$P^ zv_v$qIeujCL3J>L8?v$_E!o_M{&=*|eV^cSW~r zU$9q#9GvRTca+(lWqb;CVvM<)sJg4s^6qv?H5R_M{$PEr+KX{cIoU2#gTRF~olitb zM=wdw(`c2fP$>l9jUWlt^$E)@EKII)kFt}KTz*tbP!)BdV_ytgg|x=9seUkb$nQWq zoU6;wIO=+py;d~Hl*OBaT{+x!gCI_=TYV2x7BXkxt+wT}jPaA5tNIN)%6T83sVH8S zQglelCm2oGcNYur)ZZ`fG_`Xi=*_c|eyDJcQ5np5rusGPOE-9W?wEwyybY$zsCn?v z%-?5!mSTjPWb3E19g`a9z4!RkYOn7!i?Y#^BU?7wK2FAosn^aVG1HJ+K|#oya*~G6 zbCOIt^EXz;LbM&qC1a(&6*Z>g}E03vD`G?SA< zVst^Z?yF&CBG;b|NjLg(cG!>i{X+T1o3|gcs1ozxhoI^8{>^0n{tk~9gB+hTRK$_? z?bE8LYfX%1$VSI-wCMe0ik8QR^D>GxIGJwSe$MXL%aY9*Ci3!LaW(7(-~gIciTc)-*G@WyzuW-`ZxUDq` zD~=;BEKl7De7ez54YYdbtclsS(=O0NvrF>SCvWEYu9UMfmCuI{Y4dvR3ueHPqiaN_ zVWp9-$!6G|PD294i3NG5zkeJzsIRdiOdo%`>#jJ@W%y*w;IhUS(V5SvsEm<*`!B!V z7qY|`*<&M5VqmiWfXhH?m)xr(NF5DvF8jycf`F+gFmdm`A;u5Gyu+Qtz$Bv=(`9CVZr(QFF<7mnjnRv_B1C=HwRviB9N>zv?{kd{PFqX z-7)yn7Ux%7Eiu7ji#CIrjFQH}T_fFFK>d4pyMB29a4K>p_HDX@QcevwCkmq$*J(ydTUY8w{Y2$4Oo|VWuA*WZ|tIFwA3hxB!Py> zPoQW(IaSTlBxE5q6cT(nxOxKwX*3*!{Y9}xVFj){uvUgDo@KtZv7O_7YEy0jOz$QU&b%srX#QL?nUGo z>HIjY+FN&Z=0uV$8L#55`)x5793PCGl=oASei@z!mc?rw2~%5b0o{A1!^`|Pn$>SY zvAcb*)$GzdQ0L;yMhckfmo~1e8SXZZF>hy%3?3m@k*#YDVZloQ@Sd#_f=EX_qABYYAwH;v7L}YTpLrhI4Dy3To>-w z6SHS=N*{y^9g$!x;LpX~;UGASM>UZB@Jk0;ZvmuJn3+R{FeYUN%s9@%UV&-P`x|J= zhY6LrMa5Sxsu`qMAq?%K=v4Mtjb!j=d<@qxcs z5rE5c8UquFPBHpgo{0wkMJd)ksR8xwxQTtzqbMBhHX(oWq2p+@y4ns@Gx#+u3ffhu&3U#ZMfTg&{(>eUDoGLy zdx|y?aP;Xm!bsixiI!D`*`8|D9!*P2DAW@45%x{oA_kWSP*R4$iB3$P*i1of=4gx|l(ECs~(5=D*O zSNYIPF8)s$G1uMc*B6B@8X7FXF9@4gmMPfLxkt}AYA{2hGa-j-4=Wy@=c^gtjpJL* z=tZnB?tbBO{ZwdutM+!ri6NDP;cIyNX&O4`fKWPBAit3rF|R;lJq4ZZP`2EC(P7lF zl#fPK9reziKLv2x*yOVGyWFfd88_*nNCH&)c*(|IfQaTlH3#1lsHjQ zqEaC_DLIs-0(bm3BhS1D0dDIRfbTc!l72|}@HqS94nc&*7czEFU+y&@_#mEffbuw- zAr{V5LNe+3Oql#S3WzlUmU9!QyKlHlo-1vvA7kx2$gIi@k`iN=OPrRx(AJ1=YFc4b{0cviySr`r}1e_1MH;hCJx>;jiPitd)Hk)N7NsS%AJ`E)nV zb|E4QBs}X0b?v=z9U3coa>DICB&4#X*L|=#N)B#k^_pZnDTuW22yFkc;yat<^CZ=> zeDdLKkp+9%*49GP`|2U3EiLfHg(v*YI z?I|S1gw6CdsM2fmL7yuVTMs-Iot3t#hxfbV1L7y73~8S3>R%kAe{+Bi|&G`TL+ z4Z#IYhlgLSdwFFR5;^pKX-A(aCa-G7q_+J@)!Se>`PD*bXf^+t{WR!9^F=;2U{dfB zOL+V-Z{AKI=hF*$>M-c*k3ZR0H5g<>*DkNG9v~et)_?<_0PeCK-YR7!TdE4<<9h`H zsC#|Pp|(T4^yb2uIdK<#xI8_9(p!Mu1y=O9tdkYRL_4P~V|uKK;I~w<1TSTCKZ*|n z=Fi}>5C{LcY$cUZ*mwbpt340L+qo?@;mDYt124Qrje-$by0+?NwBpAuPfvOpOxtL!WARF6 zuKMsnkTuj-FS4D_fTfo_8DEIIp9(t%A&MMSwI0yI?@bk}YbT*90+kk>iQ)7$L_#!1 zX1b=v{Hqj#M}t2-ijj_Knf~T}tEu>Da1F}%sMHSiY+hAi3!B(@glrDM=^Mhx!qrwL z6`4W?I}tBxEf1L)?=Ba-puf(K#eMaY9P1~XZ2Oy6)w$$NXWoxx72sZv7-%j&t?~IPh3T3=giZh+a zjKb^F*}TKD3y`m!IaDJ7eB1W5d*kgux>KEPAJg)qX?2YO^c$X$Ij&Kwv`?(zHh&{o3<8o5!`%T ze=-N2-6I;#eZ}amB>8eLGnM3#YsR@4bc%CfZd@Ks_^s?EmCg8BvYp4qbcn?-+93wI z-$UZZunUB@43&!cuUF|azB9(tpE(~UW3!Lb30coZ>_YbRYHOl(+%l^5q6l&Ep$!6p zB14{c8Y)L|RpFL8mcx)MF8dN&#vRV~vm#IBMm-_y4wq!-3(98I`ME~vKAyEW zc14X}3i9z|*50AB-4E#AB2bp@u}i)89q%ZUynd`#*^SB`D7?9uNX?Soo~zxVndJSo zN|b<-$l05cW>)gF{tizc;dCalaKc+^Te2*j&!B=uo=W&k$fJ5wpDSUlHmk2%H0NDg z?qW|?=IqWK-W;tY5GjZ)eWP(EB|`kQTudX5x#mN*w|8x8`) zRT;}$its2)0xdb`Ie`}oD|TYC3pZf}c+VgB>S8(HfP?QoK$qG>xu}jJrU}j3`9#0> zXnjxfv)pP9qvVO{q-63EU2GnySTp#6)@pD)Pg%RZ^VG$3(g;0QoKo}&M;1s!(WqN1 z-mp7wD@l^@Jh+A+C_Zu=6@a?TQJJzb|3i-vA06+5Jqq9=hKp5IEJxynCDMX~0!iVJ znD?=^d3H5V^2{7xOOFw)WehR%+l5+b<@u|tTV3Y8m*?X75Gj~{#wRb7;UOPKz#SbQ zA{q84gbD5Me`nCij zF5+=63V@WofU=4dkmf5aWJzY#`ck9L;DJq8$)hb;4JH2Vb^m^h|JU{lzOw_v;%l-X zpgvu$N-j&t+{kUmJARjYP1rvb*ihK=RKRIdG4~=by4Ef(Oz@%Kok+PKH@K8|1*wj1 zEN-VRdf>yoUV3=zzyd^84Sdx(-90=+62`Bt#q>j01*w3pD*D+tcDB(hr>w8SfgfJC z9uCSq$Jx@kz~*iO>gPg8p(9)V)Zp@#zOBK{SV48%Ryc{ESpTiEVQgisl%(Mx*@=wc z-F0CbRy3ZnPIZ3+`-C1@G0+{>7WBmAcq-saRPE{~WD3i=U|@4XK56ycUgIisCZT|o;|-N()x&++5H;S-k%~NBUVcursMK`Nw&MR zdxJ|`lu|!+v-_G4sAr@qtrSe-9`%}2oKM7@A*;5op?+FZnc7NG*@~0or<}z?4!G1Cuks$n5 zQ9s`#K3B)xI;WVAhuCET>c(_@Bbc-i-&H!-ES1C(b5tr+B?)9_lu zZg;x-$%+L!a~(eqPkd#Y*LH5uZPn+w1#c(vnCp9rWfWP&w~|82ISDJ%sV=${k305n zLpl+9_z#U5ixCnlR9!yYXX3oyfvi@dX?^Zuti@?S4Rok(^Rn}Omq!8qtr`K0)P=Go zuanwEHI7cz!9)3rWL$miSF~sm%;EFAzfyNSD85URp-{Z&-9gIU75loG}6Wff`7F+lR{b*h?P&cjHo5g?6jdmLfmCc~f z8W7tza=!CpO)niQ9*W`_Mk{o{87;-YsV)++z+t$0um31CAT1b=8g#ADeS*}=2UOnL zB1#eCJdx5@W5*QX#2(=*Q+_&y;1C|My=?UKJO8K~N+$d$a>Q$6Z`!G>c!H=eR}aO` zM`CxAU&Vt>E*Ju$)`cTi#-9kWex!5t-)NKD9pN8e$}QvO(jcbsc?tBpB^WnH7}*Pj z<6R@0{-O+(?TSPabe6AvYiUdbN@wY`CYvECAzssc+3RS zFJ5Ew7G3)3KJyzK~ztFN;k{Nvvn~Er*?A?H&cYLKT{*C4qju$lc>h ziUQ3pFzCvr&@>c}VZ%MII<0pTbe|LQ%hE_{Ubo+oQDy4bnam#j-hPWjD;K5wG${OH#Ran z7olqvfu)g{TncHB_Ofu_ekQaezQtCo>*`l}wiXeP5 zGavBhst#@9gkTp;74{Qfjw>#{gtLxR)EIo@X6>t;?+b+;oJe%FPpj^VK-Q|}RI?a(^Uc!&|=z$4d+z^)WFLyRU&L6#8xfVc3VJ$&!0mWl- z(@JB>?}N@!L`MXanNC!J4zij;)P+TArB!6!vs`WA{?ml$=ZVRwzeZ3;)P8w@jTcZQ z#aydIn5Q+GR0UNd5uu(gycQPeZ27^kk$@xL@o}6-F@$NBrNs~W1})6BFU4D&Vqi-{ ztIw6`wy%48RzWHrSWZ*#a->HgSQ_eLd-cGeX=LGIZN>;3k_eBh5KipXo|y@E4*R09 zVCMHYe1mspsWM{htEGeu+dZJ|C0v%&ORl7dn%)_;iINhYcF$)x)SkJZSKMMv8nM2X zt=*lNR(1M*ztTUXj0?rOTs;~R6B{|pms|YZf62VK%#aY|VkO)(Nz!FG*r4fjA_j}7 zBYDp0+rsjZI{Cc*1D|Ke$m!F~&aP~OYO+3xG$R3lf2hvArVOa1k)^eHZuOYxIwl%Z zp#m9N)ARN7;`f}LXYvxH8dE7y+Fb4B~xV~?&XY>SzIW?J`DA0c# z%7NE?BT$z4_~KtlsQ-z)5*pDGeucx(c`h^m319s;Jof*;E$9CcP&_jctHy<-v{wSs z!kMsuUt8Vn(3e0f$^Jw!GS;V<``w;chlbj#1i0Of8|{QffUnP+msKEi55N@;9P{}C zz3QF$wfT(s47R7oJhtmIX^Z{MDk8{b<22o5T6B-YzNd-$N-1u48tQ)h zme2)7+Y_ehs?zIt*1?F*IC#nC{!l>jMiJ!r%KoS5|6=T|qS|cRZf%MeE$&j>-Cc^i zI}~?!w<5)YySr1|tw?Z(;O<)7dH(eI*7uJ0A8TiAWF$K<$Vj;F>pbV2$IQp?>Fc^4 z35?|qWPPXQ{H7jH=Vmba%=!_Y2fk;>Z$LH#7=3iu$$8j$*}KBb02iD)?!noMQYxUQR`MCGpCx1da)ilwjX4Qvt|+}yfw3VtY;G=r)N zeiQKl^FMN2Z;>0&d8Rqe^fK(J^&$yu3r5IVo9QXK8}K)xc0Lb|2p?nx249Ha%Fz8< zqc+kdW}|D?4OjW7Rm=gDaL|9*Ep3e-;*%B*3$CDuwk~Ilv#zJIwvEEk$a9o*88}{# z8m-wdWV>G71U%cr!=2{QerQBQiJMye#q0mhlBI!kR>HzxC`=Cn-xEb9rLoh|&=TZn zwNeGHHKzdO48m3{(&T5I*1#hbTFQ3k(A1HB1aFSt^b$K}hBgJdO!Qw&QgqT%DEw)M ztlLUqnid=rJgRE|@*sE1J?PiZI)$zb&S3=7YkhsB9^0-_x0Rh1Y*a?tfD>5|9lP`L znheLrw{tXz2^or(foUVtr_9xvrfB-J@E?jNglv%QpMEJ3HTGXc-9DMI$`X1Am$+qO z*Hgs?h)5*zIww0svS+9wNYCT3}ZvG4`wMkl;2+PppRY?dP5su{ip%L7VTN|yt zM7hXG>);p;q7D~-6xsIos(#FU;2amuA`wv{%e=+d66ZiikRwG$%Cqa}#i z7#OSZs!MVoU+{tyNavI|)bqmjS}}c_FQK!YxT%IzWXr5>tR|VN*z0err+^7;H9_^K&e?vg@WNNW zgzIk0NKkF|@~H1i0N<9-27q|bgdxbRxG@OX#D!S~{!>4FJyBPYBzb{I-FfT2FM#0& zaAi?!u5~NevjZG|o`a%<)x%ukrRpgA6W$Dyww8fYPlJoI>U(h()z5_^vR#XeXb?WH zmuzh_+t5yE$B}2+K80letk#HTF1(Lv za2}pI4jkutizPVc%3QCJP@HS;oHexx@OA~BO`sr z<}Ue(jUYk(Oc6VMH1nNEQnlMnS#!rnj031!yjpFL)^2%8$RWK!HF?WVGUyny;L$fF z&M}i8NV4DyH6hsNQ3hN6dG;yW^1WcGa#kLZ@e{e9rORueipI&F7B9!9+Np2C7+Qs}67OhK>mYdMk8u0-#c@E7;Ds$S*Q$(*<>4+K0(^5i4< zF^}xML|ml2sjhQKML0Essh_)z#Zp+wuLnQ44r!LnsR7CFbmjqJzd;M5i;TSul>T6W zsx~$Jj;>cA8k+MCAOQXXgeuM?Q zCVd=(%_&-@JO4o78d#-U^&o{{t zl;5)V3tV5ET`Yws&1Q;@F_beNrEG*DGE@a8#s-_>PCTPyyEYPdR51>cMSn^S-5e^KKX1UTlK| z?}sDrwo7h#sB4Iv3ykNcR;~axPB>^^_jme?KWUMP!$;?1m8MDL2n8~#U^k#YO3{e{ zSHzzGmGFu(t=T5#9h;K2YPw zxL`-G|L9HIbO9EaGyS`7zSb=9`aAsGy8YTr%%|)syRNWaoaHSR<$|p%cJk$>kfE3)lxBP2xI%! z4z=1yURFvq-)l}Mk`sGnf)kOaG1 z*zL!_G|kpk9d{-b3ADNO*+w|A#Qtg0x^&UD3LEEUm`~ESHO`qsC?t{WOw4|Ze-t+8 zEX8>#E#g%4y8H~bWeHZ<*{$L<=!e9bC!mvb1;79omXk&tucBr1|jKZd8qwUHbj%!nh<%30^M(_aec6+~#?JBi%|j(AG^o`tOd?0} zb2Uy;ayjr$6*MKQK})N)!hXy$h2?F&NX)*l5Tu4vqX=u8d`B^CQb-P4{e=$uOkUca zW4@v^WbiMJ_V3~P--img4;3+!_OF?O#p-|7!{C?{_(Y8Wk&2tC1>b#E-866VQ`9&~ zhfkNL4P2p~zoMN{yefrtvVBZ@>aY1PUfNga6mfFxV(80}Lzr0jZGA5tvW`!67 zXBa`ea7Fi-TyVx6s3Fv=GV^j@(O#t`rv}MuG9dNFJVG41+IoL*Yq!@<7y-WmUizhc zq{Mn!TnAjUXw?zt_R6lyzDOXSa5G91h zOX+i?g0J_}^Vb!M$BV;L+tris7JVC?5N@AikbKoW_CHfVl|Fp9)1+?*OhBmMp#|}M zk3kC1sXP^1AFG;?-kJa@;LK*F1qYOapgL|Nw3p__bO0;ci2Xa%J;6A*-^(_ z3VqXc7i2d%Q}_p7g8rpn6apX#uWr#=7o%=%btVe8Wc8Wfw>=9Nqty9WiCQ!D_1|u} z2Jtw}i{-wXhNcSOfGy%w8RSZ2TbE!Prl;davq}|M03D(hm{XDX_hX0b7}r~I+n`(j zp(R6S~o1rs?9(jC?78Old?(a*&2f|unoNa71xeq zRgNWbfl??V(Y1%fPFAy)fRJxyDMg}z>*lqN%#ctlEYQuN4PJTT8%E3#t!0ulZHX-< zul2b5aKDt>xv-E%_l9(gcffw{6Ta{P{q*8G3nX|f4i6{H7)c{yi`!yIZC z=PuOgOX2qe-9l$TSw?#c55FcW<&v+3@vQ1sCR)*$`e_bCh6%d8iz}Kk@3#oHn&%{^ zZ<>CLw$9++wEt3Y6z$P)O~S#fvx4LG0Ktl2Q{@=%V4xE_7#K?nIO~ zwT+VqGNgEjixvY@xc6lyfdcg-6p~+)_rLf?t#(kW1Z|4mj1_?oS;80K0y8*kBAdzP z!Irt7COpP7b9g6md(89$Dl6+>*>QC-d2q=IT)d_vT?Ef2dgh(FJ`>#5#@)~~Bhwh@ zB9~&^4hu&JI$yk1<jIJ?D|> z9|)UM>JL5PBboP#^1x}!x6@o&h)Mnixql#5JHR=%)JtIu1F8u3@>8xykN63N0lEhB zc5}5`o>-fb9frl^ zZa)>Q3QF-{)iGW5uK=~8y1P$8Xd>&yal?LQ#&FkUNxO zMvo!6LOqjt@D}Xl6Pji&fk1_#+3aO|iTVK^?e(JQ)7RX*jr>4GYfo}Yd6JnID@Ey| zM{pF-Q|v*kTV+e7s&X!SIP}Z6%$TaqM)Ophx!G}N(4Fj$o~P1^suupRShvl~wB+M_()+XE6SIp3IRU3h}M z?=}A&#(PhKd=$?(hGu$4S9j3aOj0jCpZFh$0l5^xu|t~&h7Fv~nf%5?G3q4OG{5as zYH~r=v)ubWh0;?rUM1QrBG6wbD91x=$EKK22HwldQjG2o*V6H1`G>E8WsXlM^tNP7 zE`i3~4t@+7Qy=Qn@r@uSsH`q3nw#=sl(g2b|bknbn1AIFpITzl~`TUTI)VM+M#<7zq$NCyYGbM9#TM^NzFU!>|E$|G_UXpIx{QX-n&9y>Gv=5!LwnKBA1 zF#LBP__OmIw*I0aI%`eo--}#xbvht$u&mjs%{zI&Eg%jZtQWBdA_BVagqjNz*Qfb9 z&|d4;cK~H4nJ;ouPb!70K%%K?Gq#HXaWuMi!3H5yK#gaMA?BZl+_3YzGyj30X#9#-EuY;#5P_31@Gy9xWdT*ToIRGdk;1ovD^av_g&^ zFCY+h>bNKVD(c3|UT~AIM`bQeuRXbVM|*1w-@B>RdwYl5juJ07-7WBE);`{%>|`T2Jz`0ua3>|2BZcGQIRXS z^wEmpB(k`!F;x+ub|9=6*}l=}KrQpxd$Zggx;8&qS@?F zSHheaTwCV0qhi%8V0bIu^5-&(?+l#*Bs&JvU4alp?DFa@l&zIv<8wcBJ4#5?@~fVt zBRZ__B=?B;{_e8Q;<2DvkapWUVyup`?G_>cbph!H73&r!lJW3kC7I6uwp|u@5Dxbg zf`TKIQ&kw#-pW(2p2O_H500GgYr0^4qMp&1ZlHjBXZ#h|*46ri&_t!JM)^(FhwT0E zCAaPVu;bGE;ZlMqQsb5>%LFiea$h>`hLCO#8VB49t7(*E9NACz5kVXag`}fcm&%!j z$u?t2H(O0+=^7FTHWDX6<^leI&9KWA&--=Xxv%^ z`5(@1=BPnA+e{xby>zV#uYi$pHs-lD1N<$XI*UKu`OxF7M~`8sT3v+N_?#Pul2|5o^Q!w6+rNv4ipB(SUt2Yxe7gBH zJ#yoF6l;eJNtgtYcHV8~fqm1foB39niSsf2T=BvMBZHcJJ(QV|K#8RI2!GOsR{rBr zw?2`MjD(!l6VA8-HN91AEaE^*D=61sV;zj5rZq|-%p0q+Kh@HV$0_4EV_x z?FA@zs=iY+)(7LW$M!=A=LERF>2e?KqEx!W(0uqp;{q>%p8?>@?wzO95+f%8noo=d zdx-SfbZ@sG=vC^8%3g!vO`=FI!%`l|BRZF3kB4yH zvNd@OXEv|0T|b!j;(ftB&=?*OG5*OaUZr8_6q zNJ~@&;>h?iNFb14$ZboCUTZsJUt)}Y&a>Mc(@{omnH3#&9(OzuEKQ+>xJw~v#A>6) zQC7hjUA?|b`U4a|*O0=MF)EoAlkk_h{y)Ro|9~J-O6Mz@;K3Qt|4Tdhw=(E|%Ynep zf01ms|BiM4hb5`jH%Uh8fdCdy2^?Yd1t28_5;EI{#!c~4OqF&mb2DW-18tT(9ql&M zcPrGv?NVwT9pLda{@;miQd_10Qf7omP(rgL9~pjA&Jumt1yy``X-W);KJeeKEkt(AT z(|?Zx=LPA8Q%8vgmNyBdzAk?Zx(Nr@Fr(=(Ht%>zk|&{4&)mMaRnu3aw;~Q-PYFuF z2_4n#=_=q!-1Le!gj?39DlqLQOV^}Z*8BbOzs(hFul&{TN*tG_OzTZGLD#nK)YVSZ zcOdeTxin`A7+i7|t0nJlF@wn}5}&^n*Y2V0YE6C5Zy1T%dX)CvQKCN8qrR#28oNqy zaGxUlb<~q1T=z9oK9<6DZS6lbv5M{Z!-z1;K`K>Y^XGSKT}dXRUpZsK_m@(N?8A-XP&R1uvXpQMAxsRef-a zS1m%`W=?yV*n3&`oE+h;PR{3U2hTO`r036Jm16$h~ouGdMm z4b$Lyc#~RxbgZ#95Pgu=924$slA(PR2!4VT#_zAbvPTnBk&{tn0e^46t_K<@Q}I{o zwTRUbqvU7vp367C&hAF#&6Q1{+qheqFX5#iYMUVZWA*A<{o;g*f7H9*tHo(qDOkyO&O=xEF}8NmGtprS2- zkj>Jck5bPu)ZD38C3$O4rB?qM`o45Wmf=c_tn;U4oNn5llo?OiZdDbj2i zWhW-|6qWRYtTj}#K6`#n(lCdmdEt9boANfeSSI}ab0vOvk&X?99?z;uB(PQGMLiLv zu8uTf-~(DX#h4MV+CBP)SF%(+R%J$7ZNV(~OpKiOcg$ivzTVrM zan@_^-Unt7KAu1$6UyvnW@)vq?EJ`|5!b_7xCIws-OBc3Uky@5M)@)<0~=-Q$WEkE zF7O>f%f8qv?$Ecb`U+1+8&k_1I{bq$_YDMrUo3;`Z88D;AiCAE{)=QxtCj z1F=+9Npzuw?wvhJNj5pP;=QWUirz`{lu-|1z(yzi_SJ{_5q@;k6Ah)Q_K&Y`l?yh8 z!%7c$N=KQ+HO-A8!zy57nq8gvNcjnb#$uNxLYjzl(e2yIA{`B0;gXmH+X{DjQRP1n zUtXdb%WOb=zA$iZ#tq6JZFkdwhWGJ_0(L~7Rr%0#qh0NNZ#H8Si4)7uKK^`kTcLHk z7O$Sh`*+H`0{Q35gwoIb;l$T+=@YD0xoEaSct{^=s;rrtbOsGl%7&Iy593iZ)cjR;Y}>Nd<0Cz=Q_}@o(Z} zU=0OzOv2q+EN}-aeec6i4NNh#Il?E8%8D(FW-!g?=nLh&t72$M|NU;0fQ;qDKG(z$ z=+U_T>9Uckb3$e3WdV#O6oS6`P3A z_1j61Ww5L_Pd=QZ>-vWq#FTUP!oyM;j$^|HB8hQkGhNoFgOML{m#k4%3~FxLY41fE z))PZu^ge>2=d}j~f@BYV&Z_fRid!QKlOfCmxb8 zY@)tziLQA4cbsfZvpF>h=MrKqHzcC>oMrZeMF*Z@Ju$!2e=@G-{t>$ZGy3nh48(SD87Ls_9|%Op!DLYP9x& zPT<;y`CC&>e2-mHz+u)&t8z7DR;iQOX61K6l@ZA07irLU7RFP}yO)SVPf9oDB#KM= z!FlI~Z(p*nMvlbTtCH=0b?UtfPQeYX8Z5DcMh-NSq?d%B6{n;HK=t+j{CPgR9Olq%ovwu%$=25A#w!E%K;LD$2 z-y0ss@ip>}VVPOJ<>7M>axE0p^h|Bifb6fhfRR-v*ztFXl!@)2D+VhG?P92C9x}S zIL90-tf#6=oG`&rv4!IM1^f7wwi#NikUI4BI9| z*(db9tMniyp06$QVxmkomO;X#`+E|t6H8NX*%GWdOP1c}r{3hIl`n@;GUUapl~V_6 zk!kW_%w`MbiFmwWGxb^!FL6IS;Swa)PHBI$E>@*p*k72^6RZQ#sUaCgo`Dq*<-{8m zGfMtP>jM-rV+}#su|-GF#OcpJv8M9SZTAmtGl=+*|AAn6x7FMlV$}ySs1A^19Q;B? z|G}Ur^oP(i%7Hn*K$BZH8GT*$065v14H7jkOWZqnthTy@Rwaq2ofci~&|_3R^SX)O zBThMX<7sN2w7nKKJ z$xPxV7V1O9r?i9Ds$0uL((f!pXLCgvrbdjP=t3E!WS{AG%OV+@6;$Q4sUi7Q>h)~v z_uqhY@JBIPuw;g3w|sxDAM2L4nXZliDp9`C3sXYcI|Il?PulO(160kcyE|s7^n-fR zmJtVDuq(X0ByNz)SIa2(DG&?h^B4*<6o7X^9Lj#w_Lr26v2EwvdrUGSDT~mG@uS8A zzacytEsBejUo1*?dz^U=Hi$3w%5HG<4TFD*sYk@o4}G`^-X>he~jdz^%rS%E>HU@DMk1*Esi|6QS%C^ zijzmQaSOt#syD!|*alj-5Lt}AGr5h$Q37Ub_t9IjnKuuRPuNmgd0<7i8^BGzKOCO) zoqegD1pg^ibCGlOg7W(?73*^}ZtRK_2^U<6LXDS=0_6Qwf&Y$(6|umDDM)C|H&ow# zahJnTUy5lzL;prQcLls$ZRT^{@LOCvnT@XDpw?`)13VJmg4dAvyW4~y=bgDK zmkR37)FWW92-sUbugJJk#AMcF=~%RS153Xqz-fX@0qy)1;vLz031BkvO6XDscS^th z#%hLFG*VYwK`9%ZaO>XvTwZjj6zSv9UVPdbq2BpLZ(Ul)SZbpi^S~uK8&zx>>%g(P zA3r5bhGf%pdY``XDXd!Gc9W*tYt-qsq3kt(M+=-rm`3sA=mmY(YjVGtC>1P9H`HV2(%wM&Jz4kKEV1#wuyXEvjyEZt&ur%@@W= z^6+xrr2_uc4Lqc}=udx1Gzo%Yg5N76VvV}@C4v)e1>abkTV=jL^>9Ftlwen;T+(Xf zcdwCfdWrY*OghI`F)>5+EWh79tu-O#%ttxc}4^w`SHBpP!b>;EWn=I(}!rWo8axk6WpWx{pPF zl}XOn&g9Wq{&rJDwT%iF&#$$av}S0izb0qz?PUC;D~_?pgS0ZFCazK&9pbP@`>EG; z*SM;tw94m^OBI!GQ4!Prz+3cD`!B}yIAQ^mevz{$tdkGO8WBh1DoQ;1u-V>GZpj{YOKGp5EgR zJAtT!J$`Ncc`ewM5^f@uX-)3+rJh3{6@&@OsW{x+Nh-DrBYT|W^r)S zz#O<~;6Kyho3nh?g{9N4=MrgsOHQ$zYFX=ZuoaIiWLg^yj%5k_f|8QPl=dvi}a| zx{2WCy7llv@EEG+9o3ox%N>aBLEgKgNAFl>DAxG-n>_0JcbONYfRxcHEMBz``l`8H z#1^TJ7)-eFxVopv2*IP8KK zvbVvhOGlwn_=< zSR?1Cx-+faEnVMQx|HL1bhIj_A0q;fv>8|x2#INVYJm8$)-zk}jfoK2#`D7dyd>hs z{#Ba%S1r~OB=6?!YL{B^O50q3QhG**qtp$DnsJ7N*u?mNKOgA+{>XAf=PpMV$`y?L zULTUc8Nae?%=1Tl=M^h?K;|!G5%Oko76mY+F8(_JSnyV{#r9`i>zi4|kNjD43W)7H z0sMThALnO`%0CeE67MKBsy5n@wviMc6i%pZ0tjlD(tF^p?8yn!q_4@S0~7%v?NkJc z$R5}f{dG6auOOpo7x0$3Z^1r>oo(;3-e_dEeto_m4V+XYMW8wRKe7C#*qPW|EVJdrjWE;$yD%U5D1v0j45+ro8 z<^Is%q|JsIeXPlnA@6DC^E*Pxu+rP=ct>^gnYPo7?KVFS1dGOJOEPyBiE{408l-2a zrl207V!;N*Vx=+K;zSo~B~kf=+4k7M=mo;4Rvtuttm7?~7h;=OJ<}e{fU}#t69ssm z%ybQRP8QB@iBLoQytw84C9vuEkKZRtS2zBF@N{GF@23ddYpXWZeE?3*)!M%fkAuSq zRNx};+xD()ArMrh~2fR`}NsW3wVv9Vq z8tq9?VA*~3l4`a3J)y>{Xdb7asqh4T9nEGm%T@nNlsLIkj$h+F)@R%@H%^97m!DEI zGcZ21|5|ocA>VV(Q&;riVta15#XsOSI}lYki$k?%2=nMO$OV$&LK8NWK;V+SqtRA{0ZGAU{mJ}puh7Sg#X=pr6g9yI^%47$Gki!qZayIoN z`Y&7jW)B35Xzsl^d@qN{jd|Wk%1I=DJ}lS=0doQV^1$D; z0w!>`Li2c^<76-F@=9FTyaHAFCs3cY7O+2v7B89}nlq>v523Pi)*y4APYlhgft70; zLM!I6uD=}}gmqI4IJhG`1;p&RZrH@X4G<4kj$1ob!VaGt+s@W9yMF;b-UOd?_YSw8 z)##~ie8m`na1b&*rY{8-8uQsuv)Y%~aJSN0+d_3EI^{!6Iy^;-EV}9GDezswqDI93 zI?$sqg?1m(oAr|@*Ex+hl%q(JA~4@$2rw5w1GUu%V|hgiIIURE^DZ085TbXrj~E&9 zFQs`(`qdve9A$W8pl&;kW$i0u+X<)Gy|*018G6ILeFofDpvzUT$Tw{N;k$iVN@Ha+ zZEh2G|12z~+v&Jb^d!@O z8!cuu9zn2SJ6vU+ObLkG^)Cq&M!0F7$W{aT++)7$%6z41(-Lw2h#u^`z1#`ZTL z30O>5dCpspmDka2pabi%u!_KYGy`k@qsnT#C zAz2=?a;p8ok^B9Q`npII=WA=5)-A;pre!8z#BTrB+XN8b(bTnLr z(S*kF_t2-D!0EXLjpq~1qU5;W=|uiNJZ!eHr{}?W6~nrn)>icVSm#S;LrPnhF)7aD zT#^N77(?-;l5+}wjY2GZef#%a*XK;jNNipPsN8Z95`c<6Q^Iaa$T}(Hw^IlnvZ~Wf zip*ySsPR~DU~jk6D=#lm*C~*`QpweneY%Vf*0?#P9ok>G#5)&ko*A>~N+^#1+(OQght*=^0c6zr35&9_H@Tmm*u4xp+>0aJ61k z*h=azD2!0!j#i8BAdIcvh~7@0vjJWbaGqphrp_924&6^o+l*Al3;&_JowhHk2Xc~h zg*s5xyV>Y)sN%z|7;>fPv&T-{3AOsMPX?N zD(l7#1AoX`e;?mW#Xz*gYO<}NY$L{meQL}bh??UWYFZ3qz-T_{%yoBlWW1xKCcuP* zEMH4_(!#@v>EK*uB^NMmOaSG!-#=a$KD+L``VMn*HU11WD^*;N%eJf&ezz$R{!tdL z9_5&_>_DDR66-nZl+|SBy=Y8hOX2WDKkQrmU_c++_RXLq64+bHXE_sWSe;qer7}@< zNFO2vN22OaKf>Wp*p;QqIp)r<^_;8V)?lLr15-(~jRwRWc^KxY1xYGd#G%?FN9WRA z6L#21a;+!I-Pi$m;n%ToFMUv_o4v`beH50GJe`rN5Af1l`H~rLA>i7n%gPK>E?3Q1 zPwnOn`w8lS6C%P~EU1dMwRr>hzRS^0`7rzYknB&O>0QhtVeyTDg)&82Pa&MdIbVCn z(Ka@*_??e&LQ7ZT=#kg0E6v!AqSf;D*4VF>hobaMYSgiP_oFABJa1L&0>(w+wuJQ} zT$j&s`$19)`Jp$5T~xjb_;VkK)aXe_)!!lxRKDt;3vcet6TT~$C8Zu2EV$E7=UZ)( zb!+dZvOB4#=>;6XDt;bIipy7HV5S0d73S^jv59zq&HHU+61X2+j5Be|wd@+##O2Hx z+sbTu#)};Hfsu-_*d1|0-O1T)jUE3SaG)fb$U?2Jud~(kP1Da>y zZ)(+@G|Erqa=~VCtCA`f^lTc;)9*ADiG^5f?v>vf#Xe1XWb#=^2;Bqq?rU$w_1o%{ z;Jf$YIvVXnn{r zNl&0=Kiv6d0zLZCvejAX0e(GlPw2cFCt|L-k_gB2&)Scs)I4xRf{li;f8t&St#7Q0 z4ics_)2HBvQ4P02>4mLQoz#o~VDCr{h#dmc} z@ey}{zkR4ttJK&oN|hI|T$B)J!SmNOmE(y59sJqOfTomOSV5mNXk&c zI)1iabU?^Vk= z%|kA_*?L>o(A2RwE$TcaL+ibPfUhkbwgBXfqP6s7_I?(F8yZ|oyGw|B@){>{wTMA{ zwLX&Z?nc0L3^N*EX#4O$Jf7$_64Xg%uQgY9`SQuERV67)$h?5aH&50n`B1nrn?vVB z&Gv=NtXbmMk}X?&lsw;Rudr1aMtgxFVq?D)Tng7PyKUzM2nD~iT_X&eT&fP4W-d*Z zaP`#!MMUf)B5%$!{HsBZ*$c(s!$3Qn*wlkVlMzHDd-49?*E9EZkRF={5qL$YvXf(S zY69PS#!PM4mvR+YK-R+{VAOxe-;C5>4t)@Ut}M-`?WNdy+(`?Kax)<2?md~!@fpWS znzhFvy~7NrD_+u(GNC{HWR9+oEz~7}~pZFJICpgCk!xIMWO3 zXQL^Ljk*gD$9DJekm|S1!wEH129sRe+-6y-X9=0ZPjelZO}v@H;0lZX%%d7r9OwoT z1a3@lXBsxzW>zISIF<2IJMv1VTg^38lN^@r$}D*!TGM5r29sAYS4`E&1(z&7T8NpO zO+{4giVQ@w{X$NKQS{lD|2>%g=e05|?J=8mq!_D0MYgkw^5>rtn5uu3uK!j^;ps$* zV`lMjoI)#j>c9)(E~;gI6leLd67BisX_n$D&p(K^?O#cL4{FFt{@l?2Zy}ZuQ*Bl* z8{s=wYZI~rgF}pK$joGz6CXg5c>Aupw3QT{4%#FR*Mk=fFrv0}^M!7Coax7^jgylm zVgEMW)Piy;(nk$#G5Au#rQ)-0ui|Y*G15Q(n7oh z*Xe!Tz8+VLDT6XungCWGbkZq`?~?j~g}YW%;^FeG4rZvb=Ei${>@@B@R{Q{LtJSW2 z?$rL8TqmC9PVyb;JyrpS7!HA=sdGDOIe6T0t5!^@GIl0Ft=}L?Xl(B70QS!PIOoz< z)69479E;!4>n#8qwr!#r;zvx9jZQqGS$m?r(WlllE6YQ< z7zAh^jW)Kq4d%O& zE=eX(EqT35+G{J%P2ppV3}-9ftEkc+6T3;xB}3v!Mw0{CHn0i z8;aU@*qEWhAp($_pb^(k2-zsQhuYd|b<{mtPLvU}HB$beXQL`9ba@Uas1C<95v1o_ zZ+A2X1L$bat7iaxd`VdPV_dYmgd>Gb1Z)0 z0{`pBkFI4&2yeIuv(V+}8)Ytu9`}8CS0;aQRD#}sxz{8qsQguXG4pcw5_SB>Z)wlo zJ@}elpsudi?)L^<{`8!nY_n=!n&OH7(;xxl#e)YWV0p@0(JR(&&>rUqTO1q2;}B6} zJ^h|W;IKxY`Wzv`5|E;D$@mY%K{kR=ai*OFw`z>~T(yhvx@tg39nhO;4oyYd?OAm1 zdXlx7|8`EH_cEw=9McLCSYm_zzMOTv2M$A?%at5@#(n*m4-B_uy>y`b2SSIOdm%}A zZpLEwq{GG4*(XoB-|z8IuBTzg8b(DtpJ9xU6^SGj9{iiD(9qO)M2*Pfdbih=4wGf| zm?G_K7V+2efzq)d4I)L~FM%aaTPsT-hVjFcqg?vZg^i;4Ag^K8X%XQ-n$Z2e012qL)9G}e%?h(>W8EGHomcm56GzI$z*rT=*}pY%ivfE8c{WTXFE`1lwSOygxsEBDZ~G{$Y#KIh^S@s30bEy6G*C)Dn>e8U z5mp*#y{S}N8wLV4xQqO^`fjAoRQMvmNnUlaL#yHS1AkPGOnh^1<3y@8vJ_4%cRn^f z8*Uk!C(#fOjGW~UEVu%pMbAMW#RNw;^7;u8nysc(4HG3efzTMYYVR~|I!1pk#DHb);qau&? zD)rGy(tAq0G=RON5>hMp=1>GD6j~-*V_9p+Sk+ICqn7xYns-|NzJFTwv?#2G{?t{y zN|JB+1$OlT-mbq%Z0rlG<3m`s?8&FF=Bo}`W=#U-f&lAKgd&N!-O$)q6f?24&{kX_R9z?;d6O$^xe>+>d!lU%Q^R33BxG;WWL;3XP z6TrFq(vm$hGA0SnL%!L4Rnh-@l33n3>2NmJyl!nRqifAIae#Rk*1xBDlikthq>FpJct(J5UEowdQezQq8w!HuusWlk@@2n^sbf(fZJEnU@@7S8T=K8!>|5 zI8S!WtqD_7X77~331CjOQS9x&Az$mkr5cU|7TGZP*(m%iS{A*}o-r>Mz zhO-XE*h0fo$Eq%9{SFvQl)f(z5cX4isIpt^iq4AEu#j#ip!cKkh1*^%t0I-yq8Nux zUNSBi6=gs=Bzs%#hG11NI9Yu`^+DNcB2dkCA>b2u52*8bylan=K|8e2BpJxwo8QcP z&nx_PqtAh428ORxyuo<4$*Y!lEow=%MipF;`}iiDykw4*pVu}7hw#-ZmDn_55O4%> zsV8)Ture*1nj7SjBT17kpCj^K_sxT5QQy?CTNXq z3}mYT(^p?kI&^Iw^HxC(L!L*hsoX#Q3?8(v^MAO9v;^Ra5G#mjQQTCa-ZL6~3z+BQ zO0g8mC?71kXpD%nB*a!nY)UvAJ$j?xKi7hz_i6ETEt$C>UGn2D`<05w>ri4CZi$d_ z{~N|}sj*oJ^R%O|8tFGKMlmbI&!=DzIO>>(D2qdt));$9yrkKHJ6ON&GjHP(is`L` zSH(`BDVz7bJi}QY7OdC|gDIoQ5GryK5R{B`wKhf!%JlJbhuPzC*2$mv#w2*A7GZdh z<~uQ@+c7Xkt3FkBkw-O=Q#jFUZw{k3kC^dR&9We>AE*{(#!~HJ&Nsr=#!@-2R&M-a zNl@`lG4yunv`TJ*2dWk>oU$t;G!sKin#2~%V?_N7r_;|wII6KWKYWY;If zC1{Tt=PJX|PZj*M_J2h8;Zk3a;>uykUvBts*zi-fe9 z-JYbBq8mUditQ2ognzBR+ve6(2dk4xbDTV~j>35Qr2wyBZ;q+A3xqlq@`h|eD(aI1 zWXBq9-4)aRoIBR16?pVLkEdq=pY0pgktu$yG^+^;of?9t@H^t_>>#1$4KLsG#^jq! zt66b79lp<8iDL0^(C&3~RxkMI4l=knE&m@|XBiY%+jVI)kOU8|2`(W7cN%whC%8lK z&;$q)q;Yqb#u|b9u_kUzj3C#U-Y4;uX!^+Sp^v})v8O#t#I6tZY>px+u+X<~4VIE$-nkL? z48BwY7S+F?EOj%xt*;~h?kZ80rSzIb{ox-TW0oGFKve(D=%`*}96!XQW#t*$Tx*AJ zz7u-DYSYI%Eb)PC>LJD@J>+3||MmkchrMa-UG#wu)s~cI5-9_-otUdqb3;Pn*f!7* z-QLlDVCb1w(1+Egh+oCB54A`V@MX(%%QiMGNWb=ZR-D<3efiYR z<$E0}Z|sZm2>2hLVzrj2{G<(+5OuK!$Y`vKkr#x9YB9>Q;H`T(-#-WqKiH`P_$t-* zz`1rK6Vs{V&i0;yeKa6VfZy&NI-X+;(BSJqHgN04gNdd@U+f_uTsf4Gh&HiN6JsuS z`#yJ4N)1sSib4uhZj5Bg&qIUMWWBYok+O?R;#F;*?bwxHm7rY{fRFBzZ!T{a%|Tj1 zeyL?hl^-~C2dSPeziyrbt6XN4rp+1reM|R~n9LL^_d(+B zC&Ej95~Nv_;wWa_dTdE0;stXh%Sr_N?j`O z7n#P0ppIsIA1HP#r;dCFEkXH9Sx=yZ{m}cc^Wzie%UPTeW<`!o9dbq7SKm26N;m9q zRkE2E?q5`Mj2Tl#+my>s5C%y%K@_A~TIeLHSp4gsXC894jebJIvkdtJ!3b!g!l>Su zH~Gk{QO(cG{DV|I&*NA4cWm=m_1)@8V-FsSBJs||!_OJ-LJv+ta};&5?FHr*IoxKO zNw^7(2tgTz#}AOM3{@)%d&c#6FR3=EDX#5KtW`|8xO7m1%9TM8v?^7qj zwx70aX`)rVnfY%C7KrD!Gf%vdlX!;I z*3#SZ;VO(+1JC)Qs35o4@&Lo0)%P_QGmFdKKg<)dv)f0pIKTwo@@KA}&h?eJ#xpX; zuxqSy#-Z?LC2bAv$m2)E@?5k51jj=bkbaRPZ5EZz)+n=N69hoJW`52(~Kd zDl4+r@`0`<8&PTIJu21p9NExD5Eybn6SKnC({pniM$7EhaS?dnc)Jo;zTO@7;xaL14L_f}B&V&KMX6kW2SdaP?{K|I0*4 zZ!9x{?V`X-X8yAG;*N;QieHDv2#vN4ETmw{rNq*QYV#A9Z9-~s-*{2Zi1Rou7ZRcS z?}op)ALD7z^6FbZ-Npcm{Ep13T`krnSCyRm4ZEbIVSQsM*LJmlr_w<5VjFtAye^Gi zCC_}O;OehcmsOifXF{4S^(_Dqve4vUa5?ljdD~xJHgxghB4{&om+Az79bOlsdeS_* zdL0PwM`wg==X2Hpa!m13Wj%uGvt)5gA+Pt)$pgRxyoye}h8++xZH!yU-J_8g6GU8``+2#9^^yhQnDDfYEm zxXd%BU}ut!q@`d=pde%da&g0%wO##u;-B?NW}?#Onv)W~L%77{0G$X@)^Z9aJ!1VX ziN#3At8?nSAS+6w8P^qfEA{EZORKNy6T z{9Pmn56||K@hpQC2p#6MmjZ1gn`O}DfhT3R39~xw)6sM>r%BOhj(B_$S`6|RA;>VP z)bNnSqc}eUZ73Rj3sZUhXx>lBq-mqE1O97?Vp!HMxuEy1NP-vuPNK zaIj7@=Rik%s)Y|()Feb|GJi(mesDG&v#Z>3+n+~VtT2)N2f+%_fS(L|()-0@jvPeO zvXZIMbJ^-H1M+dnXl#-g=5agK6{uWF=D2kN+NWGH(?^nO(79)ZEzR+-n|Hymj@Omc z2OmkVG1V!4XX>DNBchxeD^sWKX~Yf5rgH1W*KbD>Li+) zC9nCAxjp9;v%kGevEy`Ql28TQVHG}V6?Hb&4B3_@13BCajK(Jvcaz;yCDhjBWA||; z$%lyNEc5}i6z5x=s!e!{BS=#=W3XCLj3mDx!@UFud&U&BWW z=07caOBouZ88*HI>lw$7GVu1>?pmj%AQP55t4oXmk)$h=5T_cVSM7_3+2NNSzC+=e zAutzjsC{&7F)9C6A6#KX^K5iQld?O=NJ#%_2hSrknn8#W^quKM^mLCI+Joz6?m=-} zjBBluS@y%V&G)4Ja0pM@YOs=A#JF5a-hgtm-?dzda<}Nf#4&QI+beky=_w*x@Rd;d z0oQ^@ghG8?ONP6tP>*9SyDGmn#V;`FS=1-Fq^`)!*_<9KBBMKvt_wR3*->wI%=!lZ zP?{anmp$s*{=YQhLX%)W>h4WTb!ct8i1*#n#_65>cl*!bjbdgZqg2i63RI7KIo$-C zb&=ciwXSlbBvm+9Y4o;}k@XVk$(*A|A92-D@9jih^h0axMirH>TLqjVZ4eO z63lRoQf&EOWI(it9pH8`BK4Rb@~rw<46kUuS9 zxY|qU*=5xb8nei;Ds$LZzFv|@b~FJVK_q+?PN4)7%c80l(Ja~i9rny+Bk&BQom3^J zVr}|8<{s;Moze}%%!x+)hK~?+7xl8r#qjAM17es0b88CMI;Bn6hJezH5jyCfX<(+8 z*Ejpm96bq_$CO8ASi$1do4zuOBmqa;!g}f4C$B%%!fgLRIEzpW^Jb?SC$37y)}PDK zYtLR@68sK@na^IAl||`pcCEJu+Bd055sZ1E;{Q+H>i@jHH4XxDfMT_?9EGQ(nX>9O>nigl+XAt+8DGiCA!<+1V z8lw?@%;{~e_zCOlehKdm>tdkbujC=1)XlF^R__3sAyE|5PyJF{2*p=OWY@CXeLv1BTVdT>=VZVD+Pq5JzLZ zr7nPfsQNI_0P)rMfH{wbT*b=!_9rTkP6Ag2< zMo@&X>!V=^nHO10P^3<@?Dm%RH9w5RVu(C**2q@BAY*zMTTVl{x11%WW(Am?`(CxH z9)7hwAXM<+$xSn3hJNK>BmUxp97!dAfiYKNn;zbNw(;9~X&akqlO|~J%g9&oF7m#i z7Lmqm_h5NZbJF^7>icQk0mRierKSN>S0W*GRUev~e<=*tpkzc^kXuB{Cj<;0j{mAK z5G32PzNGm{FNH?)wM%2JiF=|ws;GC_vk|Z62=NC)ydcIy^s<}!7U1!|S22K)W;S-{}J5*nDw)~5J!hLi%V$P#ca3I|QLRgynu?!|GjJgK-xxJLxx>6k71_h(z0<33hvS#Ix6Uzq{pZ*vSGN_Z&=6mq1N+oj5j-vr z@_1#Hea$(8L}@ei-=7ynuehFVd)wPc1wK)-@5l?LQDx#D6l|C7I7{nLhqe={rHD8A zc(&KE2+4EwVlxZ(JJ0@l6E|B)H#$?f6~4fWS%@5sZRb%d_Wr_pQ<$`Fx_2RM9yUr4 zeXBe_s+rv<`(kmQGVP|nNLS9}6T0pakY3^>nG`p9$o%O^*xIuo!^+1?_~F!K@<%0} z{7J>O_mKxCiH?tazRm9=GkypE-~LHo;ZyoXC=H7B`SS17bTikjUePoBa%lvG*cDde zC(DwR(E3rAmol%1qL41m{&+N7sZ#i<=a0w#6lGl(u}T?&N~gl{^FKK#=CFTnCGdfDz-*>455ro)B6k0ADW>}w9Q0Be*XT+?92;|ksC;OPQbJ2~ z+Q0*)lumKDsjRIn6QVG{gGjsX)pn_0@O@42QN|%`H4>CXB;hy`@iKS0lZvCAw06q1 zr03t-!g-(YY|l~G#bGm+b2;{9?RKL7s+1%_qw(}T<_Z?}#8uff*GGagFfZD9?wc#0 zsTD;h)f=v%S1Ru>apVP}$)4=m72XB=XPjiC7Y}6{BmuRMcA`ARp@9YyRA(j3?i)NH zFj?3+Cm(9q{Fp7%FYo3jCV z!}QF5lpv#+D%g+^h~mLkW)`k56f{(=xKNHH?#^?Q>6beza;e^ zciZbVg(+gd#=~twr?dUnoocpiG)G7)&Dx_e7)g|5^Sp4~byFjGSH`@QQ-68MAU@_- zYWp{UOuk#>GJ>Ui(ta?I_BY8oY&~EZ3WrY9MBS_z{GdrGq58AZKLxLo?^9}QRwqky z%oz#$dwWGQ5q(|lTIywsQW`ew^rr9(I7B}+agUQuc&-%nftp$Ta{YfI31GjqQ{7L` zZJd@s|AdyrNFgoD-2FU@@R9_75^D)0vp4#*@~gc0<_FjvC1E<&eyqZImPFMEnnftB znJr4SBHWo$@3|_}R6k2oGh27V!4zT9^OwLh5(!P2Ma0CL(^Bn%FWV(YU*D0B{2GRV ziiZCWg3G<8FQ!0hgm&j)sE~(q?x92~)C~A`IM7K1%tWQ;e+=5PmbR$ouF6u&5Kqba z0ABcF5}gH^%1B3Ok=*vj94>|zB=8Gmox!g#cI5&Ta@(`xaiDw0D-aqt6rGL7OyX3XLPF1s#x zTe3A@&_G2xlH3&p0|`V&M`TX?1n+-9+DVCw+WX~`%txIEEViuCnKstAE0gcb-#TUo z!Za8%dkmcIvK-NhoQjI{71;OnnI&67$UQT!U_L%y_gA~iV2?1Wgz7w|ou2YD8V1@Fc!_Kb#_e&?xX)*AFF|XQF=X-XT z9=v8dx^1E7C=ycn;P2!4M487{NYkI)PGg+he<7+euaeDSM%>nBAum~K}S){C)qJt z^-eX&M1#YZY21VKz%zIXWjw+^2oE^iV6waAmzPzZTf@?qZ_g~c@+09aS-YVp5P_|^ z$!z@gAt?97ONxgXEvjVP%ZGmu?$U3a-xzma1b=^)2K9ABV5@TmMF^2QGPDS1^fX9l zp540)i+jaDC5)K}vlUa3+TpAw3cuiV%`>#G5sWIp&nIZRhOp!~3`h$5=XjEkyDj5L zXkNvyrc}6V;jMnbCwT}2=E&2TrqiANPKjenC+%gLP(yEFFF^Uj2n6j>6eDM-BYX1W zW+M&cVr@}E)Y0U(xoY^^L8v_4W({sAD3)N`{2Z@b*i)FiC96v9#19OInZuaa#43G`B6jzd2PmNl>r0})HHH8${{uFjN);%P$sJf?VT-SOtXEZQ0h9X z$Av2CggU2ak}7cbiM#@dnqlyOx_EKRSNoi{55;^HEQh5q3JQq(P;4|ary*1waki3G zgTN1UO$)V@bG{Kpg#oFO`9a(Km_DP>XpSej&k=B}ifSkCJ zIS9i(J-?y2ditLkVAN%j0a}$2(;Lp2`_q@sic?#P%UIWP)z^{~w+e{p`6{g~+@i>; zR#7zAjWae`v4jQS{Hp$hEaOMVqod2(o8?U=BhzYSW&P=NTA{U$9MUx&K_fH`_Bev5}xV=5vvjP{(HL{8FOA~_rpbX zW|W43$Q`^EzWyj)-`n=V6SHFAb49xZ8`M|^UhSaA&Bja?PGA{^6O%1->vq7Y@y(}) z2v1iy0yO?6Fs~USsHAI?M#$%#W);lw)lxg_UF>?lQq&v*R)1rsd@ozg*u9dVX3QvF zYu%;%Iio_!fSl%4oUhB%A@#+C`AAIOGj<+Kp}C=`qoM*Mv#`5ycnYMZRrRKCxP%^q z^K3}i*RQ^aUvD8*=jW8YTZ(&E2|BDi!{v4=$w{oDQBnIshSbtdwO982CjJIfQwj49 z^d=^|ETw$MJZdu(`EcTe+tT6ZZ#J`4o5NqvXChfI`M(Y%t<=%^sEbD(OgQ{;8{&J} zb)CgfFq|o5ieCk(jH? z0OI4YdeE)v`D^BQ*{M2bdbq7%2h9^_!V^GJYN2IERCZ+C(K zxS}DRza{4I=&+wGwyI3&i;O1>vK^Ca%quS^Wx+iIrD@;t|adxMN!&ll+Zh25oo=} z`*IvGq?{z>Xg8kb$G0okRrB*IOLA1TPVlmJoF}z(Q3v!>mOsT4(5Smb8H^iJk_vEG_L%`lsAp z(_?*;#3w;0mXP`=aCq113ObC>RY>6o^UcEYd31K6*=RP!Q=STvq*W+yx&Y$oie7HRSMUS#i)M}HdGj|(p2{B**uJXc5dhh z02__a`&lR3Fh4u*@soVY{`(oj=_%iV&Xt$C_ZTM;&r=Vi&8F^gPW4SYBwxuWqy=MK zG|l+wKyAz%E~11^FrbI#=Y7Ap0PZ{_oxN2#*56YKl*%pSzkidh^VIOe(tpu-^X$b? zlkjO_8CwZ@-OKgL!)AV!%#(dE0Y3<|KD5r+3-&<8`0^A~~tXE1mB$;M;z+YXa@Us8t@U;6MRfm1$IDq%7^8Si|#A)CrHj zzxox_%h2M9f8DGS=SSPKotJ85yY`}aNlhPD)8{eYYC>zHFM+8>Ja}~Lt@gTh{#lMO z?<#M+F&lf(eRqP~4Ac}1y##BkV_i=fVb|;GuVIy8U|%Z(qwg9m_McK}Fo6SwS&Bo> z!LoxtU~t5$=hWwJ8-05t&UYOJ095 zox6wk64^~agh-Dfl|2V&0xSESwKs!5FM~+i@wsP6z1ZEDd+jhyqNj?CAa5oi*miqS zoFs~Q1X;G-7N|y$wZ*!PA8+;|amSgGzSI#^qc$Ps;B)7Zn$^qq;l)-zt92HFw^eVo#H>J=SLW9B`pD zH{`~eC%&w-|D**Aw--<|#Q^!=d&IU5VERgk6 zQp!plM=NY8y-G!6^mPE>ah@eOq$HYt(-Jus(M6BxMT)tb!hC6*ja5|WV#ahS`LHY6 zDz|>It>s}FSiylkt&_*y#%hVvASD&C{iXon%~{pk1H>e0`=vVj0A_Ec$q<%uGL@vV zY9U#9xfZ3pQG1L^PVMVs`n4WXiq$B0PKs$(GVGEP);V)W;c`3rfhxj=%3WAsQv0l* z%ps}6qI9WS(XxL z5jJzstR{b_>eMR>#X3_!FgV8()J@5tX6osTW}n`YV9OI-CjzVE=-g!)Wn>vg9P=eC3!Y5TU2OT zx_;14e)?qpsmefBWIrEkguYIIg+!MJTOOW-C+ed6YoNLcALiYdS0(>Wo+qwnW2uEM z12+$;n&kB$>>WdDYm^509IK3{Jq7l^w2efMQ9Aq{!+22*q!tyF1DyRu_~_TKMY8nG zH0klnNwK&<*-UTmHMvpNLAB>ca6)>5Ic|DL%}+kDMuH}mq9Nb|Y>)y*?ILV`_pz`lW7!+3 zP;#cH85UZ~w;Gll*$KpJFK<1hN0-DF6&B^bjmt??7f2&#zUId3K-H^px#_XmPcIdI z9qGF<2)ABnniV7F6E5$#3^2C;nHiEc@BY#Ljhk!x=z*Aw*$0Dkb)<@!Py?_ZAUyU_80{9eRo^U*D9*^AxcNQef66svC_L z)TKp#!BFQF2bWenVi@Wx*xY^aJ8}6f3_NL{4vjVG%p1(`c6#p&&0TqEV!ivXE11>^ zNt>fZk+NkeK5x=cWm(k=&=sZ67oou3au)&#Ej*E6u!ht7MLS1nnw|T#fc~=coceiqu=#|u*?d|QD($p8y;!7*mSW;)6Ze^B~PYhY8%GZaD zUfBR|$g}gnM&I(dqCP~{(-yyg{H|W!$&itlp%R4QX1E$D>2!S1RLX6$=*{XlCm2SH zI4Bs_s|jx?j!n?dH*!;INH?c{P8b+%{6s>Gt%xOD9z_Vx2yhU?P-ZtOZnm~Z&8-O$ zNA@rnQMA8ug>ti4XQz z$?~$C7pD@_F#9MOOIW1r_@|w%gw;^95e1LZjRmJwiy+noU*S>1w%6Oeu6!Jy43J5< z48+omn3l%a#WEO*{ptcXoeHSr#eczjW{>NB){(4Js9VJPU=V;x2_WXQmRP5|_u9!R z&B;4!kLOfRUOO*I9G}SM8_~i}@vv(R-%&>+j&mLJ+#5eJ4(Pc?Vi$b1&z7}F3X8NR zPfsE=@WzuybsH$%mU`3^q#xME#*YjQ#KM$ndYCD{7djlI+i#BW^H47tjc9IHqIa8x zFoksj2Y>O@$Er(iMXf}~28Yg7mj^A=*%HaXLIUDaR3t*6QZA41*xNJm%7f+E4kp6O zMBQ{GC9>|Rd?4%!qO`@%!^Bs$p_PEQTaC-YxvH?GM5?G3DWd5zt@A@szyT zNr|@aW;fT1n!cX)1{k2TJ1#zeftINc?KAdGt%6N_@nClxJ1uuK#*X z%dth-)cZBL(yTSA--_U{n#5h0VYCCi)UKusLGBYgs)+=dk36Ty8~^jL3r9avvL~Oa zK!OG#|A)nR^s3!RcRU`EG;ZmZHGG?vsHFbIlMhQ|KT!iPkWop{Q2y>TGuKGO4U`ih zeAeriA%B+9uhKSsK2mXBJ7t^pcxJr7RR?xO5?pn|f-w2NwzDp27AYr;hjHWn4l~bo zuj@ht6o+e^NWXxC7X05hhlZxO-@*lD2wDg|B|_du5V{cx{bS>?|&fBi%{qulk4izqgiY{4a$)K~=MnH)%9 z>&K4%vr4;f`m0ty&y)Bz3N!*S>0i$uJSmj7Kf@RLi552MUh!?B33~4`G&7_R)X&tj zus1AjNK#C*cRfTWw$yUf7M=ftkn$5t<wKV>@_qgueW8%C& z-_0~#o!*$|u#-w2R>2;7&TO?9*MS%9{L83Z=jPZ3zcBu`!G(}tJ<6i*ar5()qHsTG zm^(-3eOoI~@1wy|a)q*av9H9A^Vgl*?rrINGAs&gO`zP`xuo1=@sy3|YcFrJ5%ki~ zubv|dYcuqnL5@~W(8axfmQF5_gJW)!+*Yl_4$+9xZ74;Ii>?95H`72CD7)H>%qi9<8J$tJ1f~QzOWj*9<3(m$&8BM4xf2T2^p;i{YC}!bXze zFAwfiVGI`)Y3{qhB&H$`qMP7rs#C1~OUi3!`P3z&evX^>K$p#adR@4mWZZkFEEf28 zl68Z%cLvK#(%OvX%rEYt+v?aLbtyNE{lWtkdxv%dMzmX#9kqMX8-J_?00NKz@PmhB z@XIW8HPSf1C;jBnpOqYWrkx^btd3kCb_3?*tL-1(?y;GN1+b-b8Qyj=P&X5AR=%8e zuUgjC>?O#!5w5_4QE3stc?ZH>-2Jqs%EBxSKNn|~cS??KXam^wU3vr{Fwy}1uh&)5 z>HJoM>yWyQh$0C*tQjaC zlE5Xqs<>~_x)suTT^1+%r;WsLj>T)XWjI@mU}z;;Niw>Ld}SQmmpVH$4(`rwdkA&M z*vC|juavh74r$u)kSx1amT%Z83k=>iag&c#FoWLt=tW(UpxGZ~%B9oR`pd zKzPdK`^Pu-FNV`7k9v3(QVOtV>pp=0OwqqvBz{N&aEGkD->)|9`>Usvi>FS$KRznk zIQy@&C|Thqn1jar7h+LgzEuTZj`~&HbxOqaybyLwk|Q~NuvA(>-rNQS>~u0ie;)6C zqY8roQ$;rD+?SiO)%%&-x-gj1ZakG;v&fa)!5@H0{A;O2uI+WW1OGnI&-5&~E5~ca zMpjOKcyjF&Wf6dt@cfuMcMctk#)P{W-VfMjg?fUnBw_*Pf|7K{o6MyR zOYXbaZV$#<{M~#U5HT5{g4fVS9WM>}w|$nq8g)>y7Or1QLBM?d{C8Xx+3^`uXSzW3 zkK~wP>|bD;&e~4KC8_y% z-u(0H%3^fO`sxf_$5Ic62pqIBXFhVusGvKKay5gle8Q&sw_MedqqMMF++U)a#>d&a z7iFZ07yWs(t_b=Yn?Ag*)Y>LHzh4M~QUvvF+)FMPe8)&xc5B-?Juu$4m8ow^{V)rLdff`kK*S3)5#$E`P9(6DK)ye7YDH_eBiCbz5 znrtVMQ%Rg&mpMdcex|Ow7JOZ?-A!@O&A1smJP+}U+m-XA#tar3%=S|od}b;dflJoS zZf@y>%#xwMJk7^-Qsxv{50mMQoP!>E0PVr`RyBRY>ixRgZ{*yvTUWARxuw%hb1Fl3 zkh;K>qlp-GxS2P1l@Lcm97cbx8OwX5Zv@RHva{z)^8mSk@5SY0MP^^lgCsyof%?lf zm@4&N;Ke_g7oLiPSZ7g;MQ}&%{iZ(D5vHbNEK|=Kjgw`i3^Z?Fp?~CJXmYz`8n78Hh=R4$^ZAvG36@vTIsUyu%9Nl z^9+LES*YDN#L6lHEbInj9%XW$&@L-{ytI64eEWd^teAD>wq!Y|ttG$Jea!TX9fEsY zowB*p422Dye<=s0FT zJed1xCj0>yD=gFv3{<>0mXV`_Qcg0<2_zZ{Fvx{@a>x7~U9sya!K) zADG;7NwDrM319K-JCUI|DSI{wzor_h<-&ZYajvwM@)n_tSAm7xL!^B? z7iLnobf9h`#vy5)giIZ|MIg15?TbwnrGJ*)((+N=b}{TxU?m}3cAZ3e)wg=B-p~T> z=wzzLQZ!Lox|gy_+NALo4~1EO#ZzW&kWLmp8)w_@(oE{Q zU60!xeOIZPU(wgMNsg~Lv>hJ$h8c^1aNBj@|E9YZNc}bY&EP5ESCr!LGxxs!xa=x^ z(p4FzEXUM7=AOa{ncq~CJ=Do3=%mcTyv{H|$3wxa|6ZfxeWkiE-mX3EU|!wCF1_?; zlm7sVAB}3P{S9|w4x0vZtcwoeGGsbTTatkQ_SUmXo&hC_vDa8k(_Bbvi(C3*O@0vp zUV5x%jm(5CrxJZ^*z&oiRk_o*GLG~@b&gM1SoUdc#O6kHgO%VbuadYKjrQ5s@%>h3!)0RFWWO)Wvf)rw(n)s z(r?bR9FE3$2~^Uk48MWzES2r+*Qt>6wtO+aRfT$BlwBHkJ2Ga^SWxH$T~$<1H(QUi zWLu)OkyO7PM{D=9dorIG3q2=N|A9~{lw%_*fEpW*>K7+^eV%j7Z*SA`Tr?ltFW7^Y ziakt?B>*nn+&5-bA~{{B;?lcVQNi2gFL6n)CH`GvE!*8y92cklxtRUWPONUeO;KSP zBNHZ@KD(?rP~*n>FLPZU;eXfOLqvhItSS;5UNQ=@WH$_h15+RihK3DdZ|W3~o%o!e z{6EopCR@=_d3=p`)<8}Df09+@JPE>W8?s~QWiv&Ei)4pejV2ph8FEIE8LDmBr`vg;fHmk^5sKnoByYQ@##xGG!&iGiMRixnGKy*{ zjfRWka#fY^IOkY42%Z((S!pERX(}Xf(7v{FYsXR~K$XX&r=!!0XDv^M{W}J-;{OMT z`5#Lt;N|+y)fM8%uY|zz#!@(nBQ+MtZvFUANJ`7Bg4hE;H5VgOmDBdRwIO17Tn*AY zrovrt!`aB4Zf6!h@1*pvq^bHpg@}x~|L(MrW|I?;R_s0-bjp0i-qox3QEDbknOM#a z`uS?m_y@vR!u#*vimy|?Puf)9_A-*rmA?EZy80J6D7i2e z9C=&CNU-#Ke(t^LD%U>;LJxIaF!k$^pi{vQiWzPa z8%O4vOh=jw(>O&6P7S$ZHLRv%BeV}r@aLnoSPHV!4}1QS7IErhmY0r-NJAYtCR{frX&@RYjx+Zigr5Y>2bh zy3H{YvZtKGhgh^knzLcX{$TNvM8+CS{5XfXC!+cE5O=S|(;#if=Eh z&f6QCVVay&LVlF!WvuIoVd#Rrh|QF!!B5m#+{vb0CtpyDKN48W$Da6VSgh2jy#K>c zANqX+atPlMn!|0L9PYr2B;lg`d{g@0(=8NHNDEYJ&swcPYaUmp!!E)U?=0G{6St{*rx7mM6VvUpd9< z-umc`IpU+JJIr!SOJzpJ0FrlVv@d+l=AI%>7T0NBZU-vI^@`kL^Pz+nsp$^i%OiJJ z^YDXh4?yjZx7Cvgroia;jXTMJaQB$hVYdHN`uog-JI%#T4YT=t^Qqs4`er-+)-Xj! zy(C6aexmAo{BtGzb49c_--;ozG++&!#Cp%!Ny{|C^`}BBgly;;{_v7jOTXCe{h^)F`^PsnE^-6 zZAy&T`y}&JC;4K4eNpMD#oqei0E%`73)jsMlmniIdZ5#I^cN2U9o3fLigt>|m;$$F zyFyx0lktzq&)ZRnzTjC)!>OVR=lq1{T#yK}U{hN}+J~1-+R#;)_;gWxIErq^Zju(NnLX7z5B)?$>wIgYrB9OYM;_g52FB-7i03bwdLxKt8ftr2 z|EWW?$i%cGoQcqeA7a|<+b*-NclG;gWrPIPB3+%d_%T1FGAKm3 ze-BJG*4%RVgzIYyy#uUSvbZ&E-cCPSVqZTg(I34wyv@Pdi?<={wARMZrm6oy-hANp zfNfXrNUOrygU3JLtTS*TaCtgg(#^V)@opsy?&+T>UddCv()XGHjiTRg2CH@B?c3Kh zbq=gOzX`&lMQL4ja0Gm;nlcTG+=@BWqJVCz@NGTToQF=5MH6>`2#TeviiprfFl&!}LdopR`^p6-EuQMZ_f_dC91_9RsDT&#jQ z3Te!57OsCwo#rdsUbCgcdqLZo-zb-&H=h7Plwxvdi9~^SOT0{}VjzPSP%D?lIb}^e zegP|{URk72KcEe!pU*XxRqlT8bG znR~+Mw$gR$y7CRwgOk!+uZFapzoJ>myPjkTU-VdOerlzxmD{z!AvSWMBs@1gGJUY- zCw;2Y2a!a$o%|bl#mRJ0R>hFKQv8V@@W$_?M|D0~@oe1PJ>Hdpe~cr zK;69eZ#a$b*O#iPy&b;M5L|?YRQ=L?XZ#Ps`qGo*PWyBaISDsRnr< zy?E07U2;ni zy#ft&SV7$u{s_wV?-Ixt=a&){xz$e2la$f(s5e+V-wKZ#U+ru-zc961+i)u4u`2v%87|j z%1OQdH>dJNm|1c9{YD`MBVEpao2e_IT_fR@l5qD*{fb59o2hWszmV|$^iMQ0Wlz#g zfx7Fu0}R6D<4?kGmhEoN8b9O^yecSB@(E(v*Ae>YQn~c*`5%ORy-DcN`jC|M$zb-} zCP3z!>&6qZLnQOA%3A*iL6>D8JIsr5l{ijwE582HjGV{bhtkh*sql2UQ$(m`w46gk zhd@6FP8nu+jDK(Xt-8shGPGO!TuCtP)mJ_kHh~z%*S^U}H~lil{>)tun8re;)V~7c zhyO0Q|DP*Rwyh@GZw`rH@mi*S_*Foz=Cu9^ciie#h`cbW17dKdXBEF6`Llgzg1Qk*i$A{+dCsBv581{_o)V@6d_(?+XC*NQcOv3nW0k{I(`3o^z%Q{+`g}S@}tl z@hG&q*D!apIgy!Zwa0yXKuE)GrB1|@0iHYA$`Z@Z0F%+@TuKtR7YJc&g(1Z!L!?jv zxd5TEk9xR7Z~XagI_4SqL5IS)t7z@c;3(a(FqXBq2ZEcq%TBS2+~}75L>kVM3?vxv zvofmt(Hrc5GM8xd8>6+qED|boc@U}h)hZv^3<0$Ql--i0)2)EneUNN-`q6dpUH&hR zFk|w|f@9z6^*NKQ5^y&<+DZq`s&` zW_wjO^BTAtticEGC$Q%rTjt1=X~cK z!y4xVn#aEsh1j=Y6;S*Xb{E&X*KPXY4mUR}@7~LX5J$cmUo}0=#)da5gp(?jv?CzA zITez!rMuLVrTS`f*3U=vNiQQiZE%18s*-VlHLIZULu#Zmu)g;!0(q$>S5!mms%7Y^ z-=_TuS?170!t(9>Q@$!6c-=8_yj}Vy-upMq;QNv&GImyn7sI5q_=|aZ7ZS$PV<(2c zK3r`Zax%EndcpddS8v(nV*9I#aeeH!zuMRB6VM0m_T)(lsp zVv?R3&)Mr1LRHd~W#4EnikG{$MkaUPQ=*>;YD6Yao|C4Cz@{!r^mURVKtf;C8yes4 zn^6K%_Lc`eWnChAvR3yi3Sz5N<{`EWr{BI?TfW%(m5i?#p@FuE=ZcaU8M9fyN}B`F z5>-8anNE`~&iz^pT||3oh@yMa69d7_ZeSUgySB4B$R*O@F)h_JSJeNjs<)16^6|gG zhaf152m;chV~9Zs2n?i=W{d`vPHADp2mu-0(%lTCJ5(C!(J9?X_xwG)zrWAkx&OwwC${iG<)0qeo{Y44R$+mR-Rv}k({ zUsY@(TZ&QBh^gU0cZt}S$4Gq*7o$|}QrUx_1UCnV0Gns1It##2+G(>qp2_ ztKZqwC{9jLoQq1LWz<=g%{oBP`W9(g^|vMTL0!dRSiT|BlJdFdeSYLu(6XzAWlgg{ zIk1U8U02;{o^Y&Vet}@InttgZ+oGNFeDQJ4U24P|nLiT+#ZPAV#O3l4^r6tQT+NIJ zT56?I2RA)JfZ?%7a~u8$ZE*vR6APO;DzeF?%(j>40I8UFV9aka)hZ}rGq#jD$Ge`A zq@M;T;!m-}0?s#w6Fvs6-&eDjj|l#}vqQR9{R2G(r%Ed16ywts;K)r+iWXh-bO}GO zjtTYZg8tg^YK?=Xc>e`*&%6y!q9n>tlNYBxReYXdD|(rp#EYHCU)C{sY>z;Z_r3(e?xZb^nEI)=NFITM=pz=6 zwiO>vb8_U|y|R6~HLsm3PjjY71&i_ZPm3#FqRDT;ENBvhWUobhMED+yXuZ~>FxrgY zeZSylx^#JF)K%L|@gTevZ0RQ|f%rbfe$}^dKnd0DoozGbFUuwW)|1z3&j#icO>r&> zgv)TW`8~SFuXOTw=eo+z|4f>X`Yl+cV6$!XEx+@xt4-*3X!<3QIKF_Tfe5yUcx>QD_Po1>!Ny*n zjJ>h$I88bC(=&kjRisFP|M@rK-%Aa2hT_wq->|eVRzPUu;_qpwb>+*3nFX4<*`|`d zPH)xh@{_?_*KtFx?}VA-+DF%1)oqs)KX8vOCqg^V(b}dA@bYYmYMwY9c4vgaK;8r* zG;`o{O6U!~Sc-G8gA#4|y}U)&4`ax7L`1vC!3zO)ErNZS{Nt|U(m)~qqVHJ76pynq z8H!c;lqbr&*^Z)xq+vfIoM!kD0&OLeECQR=Di{}hbQ^2El@(uqp0iZN6yFj+Pa9Pitr-wqVH{mj5(`ieuSegFePCro-2Dhg zEE3mU=X%U(Ho5-mf2)%))5{GcC+nOKzyFhtnk~j`GSWF;040 z^z-tWg#-j!Nf$`;E2LVG*fIB8PuCC`v+IufERO%>joN6S8Ota@<-d;OSYr_D7LDbDH5j1mkOblM*qLdzQE<4mHSq&WS~c*VqC;IofP5p zyHTicAnNhfY4TqghOqjGn&RE87``f;|K+F_#|u;#8n8BrM|V+@D>n`X*|Tx}ql6e~q7F>Q|g~=W7cLH`k~JU{Ohb0z6)X@=-e9kmO2qa~bk+Q9G__ zy?C^=yqDP}m;HY-s!A9%ADZN>mdL8zbwI0OlKHM% z3oix6KS%d~qN9Ae&J2j&Bx2bkvD^V9VTu32rrWj?9IMmR+TCHh%_dE1Pdj7#5wBvK0PDn9|%XG4*2#QR%%D;r$_7RW&>mqzq8)vl>i5@ke`r~(*lGR6_yEiiKVqM zW&X=BZfm8}v)cZvk{(G|C$rZ!S1tO&$Y1AOLhA@)WFpHGDm8fm1SfO2aE$IWuUO&3 zitTaV{9uWTAHnH`o%=RVMpLvnor)L2WCSzgVWDq>J~na)O79RO>hlZ?W(`FSXXV$V zdVT3aqQmbCa;Jgty!pEqcg+ybb6};V=5F0O|3E(_ILjXvY2JtLOs;qdYdu?DMboMO zDLs)lcc`j#zI1>QD{3if#)VTg_Ebr^i;F@s_q7}jm$x-3KPEDBetB;Ki|yPLfB0!# z?T~<+`3^iw#8-}hi(Ihy)ojntN)z*3*p`#*M`;FGWfxZuqss4uKU}%!8@(VNl6b;= zz>72@+$mafy?}NMVP4_5E?S?tC;7m$TX~269{=-8W@(nase()NP^G{-Mv_`+x<1&G zxVK2}ZIS2Ez=*(lBhqJIr6$bI*fy&13r+aFMQ3a^3$J@G_uKMmWg*;sfw!PYEUYiQa z%1dhHwbqaul&eY{J_xMrbW%b^NpTVDB};|YR;6Pc*r8jG_+gclrSfTTLGl6>tHJp= zD6?xk;ElF3$kGDS#gau+VDqS5ekKR4mb`UL0hei*WQ~Y`o^dy&)*fX*CzMG z3avOZW9X}{zAEy>?P9>H2uXEIj90-K=c_hPoF)m&tReoF*yQ9IPI}vhr$xW|!;hu=PtbO9|M3zFdRbejj$272^GxDn^~ z*9zNRd&4$<)+~o<=qF9u$MEJ~->oNq_g*Ml?=hfm$)qulKh+@^u7h^Nh45(UtIM;o zhw^CXdeyVmuNSSka=#G@h8`p8IGhp;e!?gPP8_=(f+>4p!SyZSG2zCi`?iK+n@15V zR&fG&2g-j}UND?!3}N!f5g-wzNzGo9b*uVr& zEl)906~nIW4a=zbnq->{pV^nEd^itj6@zXvHRi7K`{;U%&yRB~bZO#3kGdJcm&^0! z1?(sh4oWt60Xtvhlh%I1+I)gb7`X_NPdPneRaF%?cF})R_fX_>_{Vxi6WkS~kr}WW z+F8sC)QlAXRV$!y3ll#{T7Nv4W-e{;XUf`?KV7p<*AdmK(XWGh1%J?4;Kb$T51=~7 zmv0oCUYGAkn~k7AN&gw=E(^QJ$*pH)p6`%eLR%@AW04!&H(d1J9;l#Xg4@5^!&YF< zRX)>A5=?BxpE^%3+OSWzFX*c&GFpteH&&EigU?z+PI5-s-u9adwL3io8&8gX{qQ-^ zOH8Ge++WOJ4xkPJNSqpdqVptG#3_z{GC@ zDe4<+l}DOGQoYtlEhZ9c3+QU>gY;rxTlR|ogC1kNb13o&&gFPsJ=-qaVTv~6lD+Q+ z66vpC^jfV}a;P^4*b^Q>8}zRkDq<^M9~E4S;Q}PUuw?B@ULn`sn+R{Da9y)}^w5aR zrq*(F`Eb#SBT!ZJaTue-hR41A7;DzREwFs1CZG(mci2!kI@bc*{{z+6ij^aG`t_*2 zhHAp+wN^jZeZcmBz@xc#3w-X1El-_Y@!#fKFizggB6&B}WgS+(15B>_?3)-2u!rlU zY%Z9dU>{kPmM z#FXDE3l6KGC@wM#aS*lE%Z70rtBNm|} zZ2CV93?qZ z(sC)aU5-d0FQbrbjFD%FdN`l~u1?+h1U_u$D6Gf+i|{!0(cetkiMZ*Od!=29b&#LU zHhen+)I$wok$+D!WJZ%tQz3u#XD-Z31$K!Pc@Jdc8W&!`8+Up;qLbgWCp0~&AL=(eTHXF%Sch6n6rxqMuZ zu_hDA-pDiPdr?8%zwTlemr2_!V|Kbv=$Avam=G9NV_{W?=60a&Eja+-Xl{8L099n% z&81BtRH*+zJpFw63-Ae4!gbZ6=LVZ?Ww|XiI~+@)o^)9qCdWMTa}j>2O%Uf|b1-`!VG&`_40yAD`ifmOVX>489*|mr*y0+w@`2_ON(nmBq9D zL{P+dzJ6El{VqA_<4P|E*X`SN82R?(+^$vfB#4fa;4*njTi8G^_8~zXIA=; z0Mn=LycO2*Dcq@v(qrLAL_Q5{>1XnXmcdPzrDuEUf-BB!Zte`wg0W`VEDx; zL@-_`s>_pt{7m(N=a^F1*kRxl`wqrEz;+Muy6@ruSb7uMc^d) z#UT9IOP!XM)K=Z~d9}*kh%W?Uz-En!N`+L+RSEHmrMv<8Q?nqt)58j9h#d2#dQFdp zC^0~uY-@&nAhe1(@Y!whqO}8OmMl&Rkz39^VKx6y$8ZA~`};c!Pz1S2^bWe9Xe}Fh zY28TocoL}FROAgY^981va=b8>lZcx!kMRw>c{bV3w(QAywq&{sjmlvOYAE3>Nnd52 zlM0G^gw(a%7$UD0Y}Y!1{Cz+w78E6)_ikn37yH$Fa3;V-3MXrb8B0UYmW-}HuVUlA z-N$>m#VPuOqAct16KlxufLP*E5qzMkv6Q)ijy>4u@b(U@ByUeTc&8)oPMo5|1RHJz zYbwv-Dw1krjeaarDW7Tdwm9zOvI1-H80nGb`rE_pU+%#ASRrBZx5RYNyUZY3GKPbkdxdc7Z09>WP~B4B+2R`u#jg zO1w87z$!62fMk@+QO&tPaToG(1@O}mnU8L$Xn6dJ;_j@pr8%CJzsBKDcHm5MXB9OF z@iyl#%y>dO@zfZrJ<~{B`jU&dg)>8#=-zI;duzSj`UUZ}&R2U7nvT&=cL9p7H|h^M zhimgYd^Byh(JYv*#EivSjqwVE`+Ww`ZVhyY1TgDS*SFpfzJxX{j8v@HOzEYYfzkSN z*dX9nmaVzY(p$zXpMvT2pGMDVYAZYR5T@+=% zYK$bmY|^^T6r+=Tk^)2q0PyyCuPm36INMYij~6ZdQenZ*m^CMpD&x_e*064~72@vF z_)dKi{V&{lHPP=;JGorENfsx~kM{8%PJFkhZNf>qIFqZJ{@H9S)wscHcq5SifVaK< zSK;1wS<{luN{h?r`|s=ChNFl4jnbfxub;Xs8a+|TRyumCe9nSBHqX2a51Mb;7}@u1 zqCF}32m0DVGmJewxHITIC z!pH|SzbfD(RPn8*+3+polqSnotNHwd$C}=c8aP(NS>+1fNt3gN<>uyO0J2MTBq1lJ z*VWSZzvMcOJRB|OD`d3+i&$PEeB7U@qktuBI#6*gYntChl=27lE^Umqiq&6XKjDe& zg)NH19U0tGC+%F@y%R1stxP*4Wc@TE>4&`c>VPbl%O{9*bKqT5t%CE45iYMc9Iv{| zo}))wa@5m#>Z;-xX<^R&cjA2&5E?jD0I~ERt#S)3;-hoEnu!xTi9dQJz^evdev9W` zB028MCVT1g)?bV+nD|H{MOM>>cpE;vx%n9Q{ zl~KtQc1TRp543fn#8;rOE=xkmf=o?b-HNOV08Gx_;1JJJFV{}!qU>#g?kWQ8&-V{h zwVS}O1UEB0m!|A0BsHFjm; z-DpL8l1rE!&RX7k*R|}Kj+c<{7vYv~Mkk#lD1~yENZW;75@kn{-+WQ?GuH+IgV0)8GzD;}*8N+xiMAItG@0&S0 zBgY!ha_n?JuHpEu>{i=)weh>9H(bTiF9hD#pjWITJRV=%=g_+G6Nti+n;TTqBNn=j zI_z;j(Y+?=xwih6?2uUN(u2NXJ6Wyu67b}cO;0{oLF>mib+6}h{cVw@1`A=366Jg45Q&9K(BrRfAUsABLmY-4VSfHz zsicj02a~J%;-J83`E_h8ICf?ZIjH><5CVIVJJnIT6%lXb0+s)E52t7TBE}^3@MTt` z($1c;XkMwU>FMj8O|yXig8zXG%*Pt3q+UBTdX2c&4h?hry@@S^czji=+P9liLt!=V z-XSg11M>_l5sR~ceb)-c=J?whNowaJ$)J*NXYsz>=j&cL&vw-~7Gyr@HyuYe#1M64 zyWk?1(yv8J!yDHlj}u|X8*XkqWzBU4S(Z=>GDS#|x_ zga3#n2VsyWMd)`A(_ntebs|G}e6TZ;3&%J*V&+X%4PZ=BkR;P8YQ_c>xVcKl+g5zn zpk*)W6^=yMenPuzYJc4e8y#H(2fWjwjthIk74^`Ms`7gZ_*A9re0*#-#j(A&m$#N7 zy!|1zI_PdahK!HpK0a<)IhOIp8r_8R(J8$ly;}o!AWVg0j`TG~1Lo5n73l#RA-6a! z=oBhq$yNW)G|w>lN}7SKPATT)HB#6QJ@C4Vc0QY63zGZrqd#g?_8sPN-(fF4c?1An zGfR5$rSH&g442DNGW!v!SUR32+;;$LiW0wl;}0k6LfjF0z(Gkg)f|y|R`fiKh77RY zqd>!$U3DsorCBf&P;GTYFzd{ppm(XGcdi`q>W9-e?KJWm;!5Y!ZS8281EH`VKobQu z$W%y~l4LsZoj84Bmi~)qFB`2+jXM>r;&R6wMhSEV@6 zIb|~`2OTkqT*u6WW*9)-anK(_Uqh z0(ylK(*k;3T9g{yv$#aQxMvk`{ShsZ6vWlyJoYoGh-eCf$(43`_3>C1szO%5XTbPp|N(%i%8GP z*Q0zVM1&-0WMt~}=b72`?{-k@Dc=&w2(Fs7jP6 z43`c_yQd}FlDT=ze2IXzrN6;S;+~Xl%VJ7)!zYdBr~a&L0wlw6*=HiHEX>g>vSZBY z9J`Yg>$hFy`TPxNcbW7EKMvJl%pUzqWU5Ri5z?UE zM4Zq91&j%AmR_98l{~q5pw2o#aR0>taaY-r^?Hfc)}zKu%XxvnyInyi{CEmM#!=A` zQ$clQ120I=U9WyluZ{;4aFWgl=`YhH6nxl`A@XcrT)faZKDLH@Uz2@}Quq!dQG3}T zQDF@5tVx8xw3TrO#mRwVaa%P{21Fd*-iVXAt7{l%KtK+Ou9oYSOh)s6CA9bq(lmF( z2;A2+>JMfS6`qDN@FBY&zuKInZzswn zD^OZ+7ga_m2l@9??-tj zdM+9&bWrGpOC)E-M?S!KURcfgACDu1K-qF+5IsE5{2-X9()=R1gNNSK2+c!UJ|^$# z8FO4J-7ulpD^ht}YT7XLlL?rpLT=#~oxB1k(f=u7QzIDKaY3p@_*yJzz$&{w6^Ns# z7iV6oC%9VQHb4*4OO$eAFD}OvdxO*@@{6O?Gy)`sy55*LscA$g*n<3`QM!`1+7ym8 z`frbOnh-ha&rHK=Y+Jj==Eg;W`xkc;Ri{j8e-wl-{ZCtX~Mo zt6x?obS2IpV}Ah;4H^vngK)XND0uawL)(<)$)?)wBC&2JS&D{VYHpZl0-7nxk9a)# zPL4lkQh~iYc_t+N#l^V8wtCwqhQ;BtKu#5X)LRva`N+;i#0V$EQFyo~7x1;x4Mdb} zJ;7Qg|^)T0}El)IVG??0{n*J!3q_w zHZ>UIRj;?5S2*u}zmt<*(=#4Hk-{C>Y5|Gw32Iv;+|8X7(v|%#(L# zG_rx%vju|u@%jM4wVJBnsZZ(x#uY|$k5wqWp$hRyV>B`f$|KC2R^boD>$(meIvwKy z+(jWIo;5-PPUZTBaYu=f3QfB8emy@J>)caAVyL}14;(l zOV*E&REtu4tI@$gR^?-#KYCZVKr-Mt2O0H8f#Z$#OP5)en~`v+Dl+#&9K#|I!8Seo z$SjTcVjI`@gp&CJ?ltY#$8#Jd2`)o?+v|((iQROkd!r@~lkiZd$$RHJVgVSQXy0Qq z#$7DBJ?Df4_8-JT_i6#~Vh%%>=-1YbDuh)?BPElFUJl9EGCbZ|jhIUyIu{%S5=vCN zm}TaG$V&2j$BwL;20GVWs3!a6$ILOZ2b~VXZ4T$*NZmZ#P?$Mxxovz#$KUqF1;FS2$y({;C;*3;xfHicnY}6FAD2!EN$k(`kp`kCeHPaty9FhGGR*`pnuWo! zV>E@_nSnx?^v1SRb;mSr-Czt>6E)Jk-`vAKUv&BzS5m9Cp$5aMSM{p=qrF$ZnHKCa zHfb-JBH5{Su$DDiV=MveoNhN&YGq;S``d{VP8Y^L`vBq4-VeZ?g3%x?0d%*7Jvq<>jmu>Mb$k{F|3KBe z-oD7r$_~TWWrbQJ9TsR7Anll=EaHLG_k8ku{0zmcNsH^sxFZ^uz8c-gVMhAh8%T<| z0MRbPjYKgi_*hP*5vef#EKr_CvwODip&)aV&R45xep?E&;i1{@UJ2F!Cn@_|l+qsA zb&w?lc|dWL?eTp7i18oD!u4AAuwWUn9a>fIFVi3oA5rFFrAIR#=oV5{Sv`yU$mLIC zULZoU#l>k-h!Ax%rad zuYV`4N_9mK^vWv^u~RaD(pUebF1(-gD*h*A}QwyGy4&6L}8ztL{i?QAe_OG z*=iQSV%=Idp26T6N2KCt+vxJn5x79&#_3X%b~wp(kLy%`8I$8;oyngZU&3>q@O`STV>sj*$<`egEE;VP9ej%sQcF4s<8fdLEK7D) z5-;{q@-XxFrXw?JK5w{Laer{{oJX;oqc#lU0C6Nyb5q}CykGe_aRi12jmw3_TVWu z5qfV0E4|^{law?Of$=k^K_JrHe*a@)aOD*&IdFc)CvjTf0f>b9t>#X8<0$!``%*7h{rx%XXAu<& zenw-eH*=q%=13b(4s;V#x!D{)d1f6-UPee~_3@dgDO{u*$ghPYHo*90HdL*1|DLAQ zR@B>}xRS_6-CS>Ml9ak=e2N0sT*|sHB-;^In}-Y0OUDn|@k1<^g=Id--NkjM8ttR#}R$U`upAh6d!0~lS+-s{xCBD!< zuwR4mO>#fSq<5UpoRTiDse`7)2l5ZVX5)W^6uw+DCwe?jy1So8qH0XoZ>n@~N_B_8rt`OFQn5`YP4n#%$_w4}2KG4GoVCZG~K-Jp2#K&?1FGrz`MymaH}k zo6iMbnJF*FI<8itb|BAiqAp;QraF#Js9rm#@Ug1JjA_Kj3NxirE0eo6iz^zwgKRNm zJ}BSdq_+UA#iFkIYPj_5ek6}WjDc4iI`yk{yw{8@4@m%h8@)VqJ={9%tZ=0+&GZ3R zJgyHB16U+WURQe0k;ny}2CK11Dv(=pd^v?vk7a0CKs(iFy#0DG!1L&y&<{LKA)xiK zoaJcVFaAplTT8`gO7nkEw(5Bg z|K=z}C;jd?r{fNdbB6NdhO)FKQ<)-fbu&!!V^xU;B62B#Z0BQiqz@n}Tl)Oz=gd%3 zlt~L=2!Z)VxI&PN3bH2!?4cR)xZ~^$-UI{}Fp5KWEfV>g35^TtVN4r!$(Gxrj@JFw zYYRtoAb?JXg{`%c}WId=yS*#2M-kFjQzR;wv#nixBT-H&Ux0z0Nd^XM0Q z<+z*Em0K1k@{!c0BBMk+N_b*+Nx<6`wb0pHvcPxt%_%V{?|2* z5Gz_ZggyP~76Id80EAf$ss!DH{DI1vI_%cBh--rUqmqUZpNj_Pzh`eNi1Q_{H*pey z8R@@5Ku4jlUuCL}5WSqkHL;*Ia0I_$shr3RETMree-op67jo;e13pzx`g*gkj1LQ} zJ{-N3JyW)##!6&i$DS=d-hfaFKgQ zH@{7hl7^#RY-tnb@VdqdIMBgOfcIiqq@lxx>iC^`&h0{^_yUgy{b^zQT{Z@>S}IBRco^$P27iW z0NPc{sWQ9jG==EFOdpm6B&sx$TpYmWL0bL(Ylh2pmw=?Fgp6PtLWo0;*^1P<55AiS zG8NwUDZHyJlAPZ7b>$zZO9j}q3yxa04Ht--9AnbuV}Nd`6U!Q{Sh*8ll0o;O$3;WP zu9EDVTx>O8`oTK!)!+>mOp=617hWXiUJS98>NefTv6vKg(TLKmmGJDSi`Y|q?M3Wx zF-}cAStaIG3B=%&Vh_Z!_let`&f$L(BsrgF4>xMYA^K&DA!7|@woiYJ{u*OA{(GX| zK3Ti=na*;8dtLT4c6+$1wQOjN^jO-S$x$!%Lm++j^>KEJ6|0U($)+LNAcE~}efL&A z2CiQ=U%w?ceXsD%QUx2LmGSwEEX&`!JRWYg_;%iw_pbbF$D1yrh5wMQ1?1`(1~s-u zWe40-`)+4uJOH|MRFYic;;(3u3Y28wrWVnwvkm3p5p@`k9@J_YVN$6izgg3X!th+; z`Y(_tBE6gnW@(c1W>;`FKy)B_zk07d>tkWPAlCR*1^rQrVjgf3uToZO`y0OcJT>XI z7{0|Z3X6Oo%ab}asVqrYon4an zS-uZ2pQY-ri_7Krb!B91>2kwHf3Xp(+FMU}@)wyD#TXi7Em$~A%6~@U)HTWyKCYKG z5k23M*uI!BQ_4#%BK{sI#~RL=4Hts2h_5;=SPJ%g2tL$xI#qFsc^cq7IDIVkWz?>g zL#Xs0NWShD;Q`$f^@sjR$IVO^Iv8O8Jk~vH$8&6!)oER2TJINAmqFD5f5RVOUWxn% z8kGXDd-z0OXDhH)v9Vox&0nARm~Y&sG84Py4}ies>Wd}om6ehmuK=pTAM$ruxmlUt z1DE{&D=voaDe+9iO}CjwS1FXhG!2m zon6AY)uBSxYrif2$n}|f!Djz>@~!sYO+*eA@=v1osV z8o*uau%_+d#5K!@RuoXw zSyf(rG_JKx26uV6XPp2XB5;&ekQ14JOuk_j$zS4pUTvUE#P;W#RCzt+PJ81M|Ji^J zr-ssuq}*TfwBG9bFxbEj#5Y`J$-4aS{&i?MvJTMHA6Bme(*+>0*0heqdUH{04l|zF zm9f*|gYxyB!y+^^*RFsga8m4=3Ztb8U1?rNL(kB(Nlrx%3f zUY2_vJ&{<_oRW$5D9SRIFDNquk9K5nY?$L*pQVP3)HIOKqvqWIeCi6RvV*{nwY%aa^F;Qh)CdSL~;Nri_P^Yg5Y zbuRJ(m$8VpunVHrkqVkz8>@eyt&-O5N#ur-#%Wa6xlY2%i(29(ssc!Rs|$3l=p>ux z(X3|QL34IJ_;CEC%9yv&CamaW;Ti#)2Pb&{fin5cxrcMSDamlbRcU6W$BQ|w@p$(yjBu2k3G^kR3S(A%~L-tY`bb4PiNpm1cy0$gh03*nP z#`TsS^!!rgEP#PaO=8QEqFbeO>=R)_}XLr5;-??R}2sHo`)oi}!&wYLo#;i5Dvd z+yqQWaq{_p59^j~lw~K#DUz|xt=q|f{gt0PNFI30g#bc<#XZ~owHo|aL0{981Xfl4 zY-=&qRAKaU3t#rSlhgoh*KAPYj!kYnZ-W3tLgcZG8}mT{ zaCwdpjJQ&U#_0!P#T}7N5a5w@#TxCm9_kK1?uLy8@atIp9Lu8mprr3-7AT!4TsR<# zym67Ya@o|C3bfSE>f&(2u7osu`R>Z0l^d_(fyuue$*cCLdc;hbI<+B-juS)5i3mtb z8GGPTXp=*Hb&f*PzK;Sdy1%MF_MTJ|EFjN_-uG!MZP=2jyE5!)_z7#87zyjYT8>uv zzJfV~!T*80TIW8kSfk8ggh#z*u`Ms(5Pwh|8MS^DB2D%gp!GR+fm3K~6{zYqdGEi} zLKMfo_euSuYnbfjRtT2troVcB%>R5Spz|H8!74|0`&d-73WK~@7)=+6U7#~jUpk2PqUAK z
{{ title }}
@@ -61,7 +61,7 @@
- +
@@ -140,13 +140,14 @@ const validateMobile = function (mobile) { width 90% max-width 400px transform translate(-50%, -50%) - padding 20px; + padding 20px 40px; color #ffffff border-radius 10px; background rgba(255, 255, 255, 0.3) .logo { text-align center + .el-image { width 120px; } diff --git a/web/src/views/Admin.vue b/web/src/views/admin/Admin.vue similarity index 100% rename from web/src/views/Admin.vue rename to web/src/views/admin/Admin.vue diff --git a/web/src/views/admin/Login.vue b/web/src/views/admin/Login.vue new file mode 100644 index 00000000..dc5815c4 --- /dev/null +++ b/web/src/views/admin/Login.vue @@ -0,0 +1,175 @@ + + + + + \ No newline at end of file