From 9c57ec2f5cb29ed50c6d827cb2021a522ae067fd Mon Sep 17 00:00:00 2001 From: ryan Date: Sun, 19 Apr 2026 22:17:58 +0800 Subject: [PATCH] =?UTF-8?q?[=E5=8A=9F=E8=83=BD]=20POW=20=E9=9B=86=E6=88=90?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .gitignore | 1 + openflare_agent/agent.json | 2 +- openflare_agent/internal/nginx/manager.go | 119 +++- .../internal/nginx/manager_test.go | 100 ++++ openflare_agent/internal/nginx/pow_assets.go | 523 ++++++++++++++++++ .../nginx/pow_static/css/static/geist.woff2 | Bin 0 -> 64184 bytes .../pow_static/css/static/iosevka-curly.woff2 | Bin 0 -> 19692 bytes .../nginx/pow_static/css/static/podkova.css | 7 + .../nginx/pow_static/css/static/podkova.woff2 | Bin 0 -> 60580 bytes .../internal/nginx/pow_static/css/xess.css | 149 +++++ .../internal/nginx/pow_static/img/happy.webp | Bin 0 -> 30584 bytes .../nginx/pow_static/img/pensive.webp | Bin 0 -> 28904 bytes .../internal/nginx/pow_static/img/reject.webp | Bin 0 -> 26974 bytes .../nginx/pow_static/js/algorithms/index.mjs | 32 ++ .../internal/nginx/pow_static/js/main.mjs | 32 ++ .../pow_static/js/worker/sha256-purejs.mjs | 32 ++ .../pow_static/js/worker/sha256-webcrypto.mjs | 32 ++ .../internal/nginx/pow_static/locales/en.json | 66 +++ .../nginx/pow_static/locales/zh-CN.json | 66 +++ .../model/database_schema_version.go | 2 +- openflare_server/model/migrations.go | 36 +- openflare_server/model/proxy_route.go | 4 + openflare_server/service/agent.go | 6 +- openflare_server/service/agent_test.go | 41 ++ openflare_server/service/config_version.go | 144 ++++- openflare_server/service/https_phase1_test.go | 85 +++ .../service/openresty_observability_assets.go | 3 + openflare_server/service/proxy_route.go | 152 +++++ openflare_server/web/app/layout.tsx | 22 +- .../components/proxy-route-config-page.tsx | 328 +++++++++++ .../components/proxy-route-create-drawer.tsx | 2 + .../web/features/proxy-routes/helpers.ts | 7 + .../web/features/proxy-routes/types.ts | 21 + 33 files changed, 1980 insertions(+), 34 deletions(-) create mode 100644 openflare_agent/internal/nginx/pow_assets.go create mode 100644 openflare_agent/internal/nginx/pow_static/css/static/geist.woff2 create mode 100644 openflare_agent/internal/nginx/pow_static/css/static/iosevka-curly.woff2 create mode 100644 openflare_agent/internal/nginx/pow_static/css/static/podkova.css create mode 100644 openflare_agent/internal/nginx/pow_static/css/static/podkova.woff2 create mode 100644 openflare_agent/internal/nginx/pow_static/css/xess.css create mode 100644 openflare_agent/internal/nginx/pow_static/img/happy.webp create mode 100644 openflare_agent/internal/nginx/pow_static/img/pensive.webp create mode 100644 openflare_agent/internal/nginx/pow_static/img/reject.webp create mode 100644 openflare_agent/internal/nginx/pow_static/js/algorithms/index.mjs create mode 100644 openflare_agent/internal/nginx/pow_static/js/main.mjs create mode 100644 openflare_agent/internal/nginx/pow_static/js/worker/sha256-purejs.mjs create mode 100644 openflare_agent/internal/nginx/pow_static/js/worker/sha256-webcrypto.mjs create mode 100644 openflare_agent/internal/nginx/pow_static/locales/en.json create mode 100644 openflare_agent/internal/nginx/pow_static/locales/zh-CN.json create mode 100644 openflare_server/service/agent_test.go diff --git a/.gitignore b/.gitignore index ed495b7c..24b8ea5e 100644 --- a/.gitignore +++ b/.gitignore @@ -48,3 +48,4 @@ go.work.sum .DS_Store .codex-cache /.gomodcache/ +/anubis-1.25.0/ diff --git a/openflare_agent/agent.json b/openflare_agent/agent.json index 7ab7d46f..524f723d 100644 --- a/openflare_agent/agent.json +++ b/openflare_agent/agent.json @@ -1,6 +1,6 @@ { "server_url": "http://127.0.0.1:3000", - "agent_token": "2380de64b00e99093e16590beb91e1a0", + "agent_token": "373956188ddead1df6dd7c86cd330b73", "data_dir": "./data", "openresty_container_name": "openflare-openresty", "openresty_docker_image": "openresty/openresty:alpine", diff --git a/openflare_agent/internal/nginx/manager.go b/openflare_agent/internal/nginx/manager.go index 8c81da21..dbb0e155 100644 --- a/openflare_agent/internal/nginx/manager.go +++ b/openflare_agent/internal/nginx/manager.go @@ -27,6 +27,7 @@ const LuaDirPlaceholder = "__OPENFLARE_LUA_DIR__" const ObservabilityListenPlaceholder = "__OPENFLARE_OBSERVABILITY_LISTEN__" const ObservabilityPortPlaceholder = "__OPENFLARE_OBSERVABILITY_PORT__" const ResolverDirectivePlaceholder = "__OPENFLARE_RESOLVER_DIRECTIVE__" +const PowStaticDirPlaceholder = "__OPENFLARE_POW_STATIC_DIR__" const DockerMainConfigPath = "/usr/local/openresty/nginx/conf/nginx.conf" const DockerRouteConfigPath = "/etc/nginx/conf.d/openflare_routes.conf" const DockerAccessLogPath = "/etc/nginx/conf.d/openflare_access.log" @@ -396,6 +397,9 @@ func (m *Manager) writeTargetFiles(mainConfig string, routeConfig string, suppor if err := m.writeCertFiles(supportFiles); err != nil { return err } + if err := m.writePowConfig(supportFiles); err != nil { + return err + } if strings.TrimSpace(m.OpenrestyResolverDirective) == "" && strings.Contains(routeConfig, "set $openflare_upstream ") { slog.Warn("runtime-resolved hostname upstreams detected without available resolvers; hostname origin requests may fail until resolvers are configured") } @@ -450,8 +454,21 @@ func (m *Manager) EnsureLuaAssets() error { if strings.TrimSpace(m.LuaDir) == "" { return nil } - files := make([]managedFile, 0, len(ManagedObservabilityLuaFiles())) - for _, file := range ManagedObservabilityLuaFiles() { + allSupportFiles := append(ManagedObservabilityLuaFiles(), ManagedPowLuaFiles()...) + existingPowConfig, err := m.readPowConfigFile() + if err != nil { + return err + } + if existingPowConfig != nil { + allSupportFiles = append(allSupportFiles, *existingPowConfig) + } + powStaticFiles, err := ManagedPowStaticFiles() + if err != nil { + return fmt.Errorf("load pow static files: %w", err) + } + allSupportFiles = append(allSupportFiles, powStaticFiles...) + files := make([]managedFile, 0, len(allSupportFiles)) + for _, file := range allSupportFiles { targetPath, err := luaFileTargetPath(m.LuaDir, file.Path) if err != nil { return err @@ -536,7 +553,11 @@ func (m *Manager) CurrentChecksum() (string, error) { if m.NginxCertDir != "" { normalizedRoute = strings.ReplaceAll(normalizedRoute, m.NginxCertDir, CertDirPlaceholder) } - files, err := m.readCertFiles() + if luaDir := m.luaRuntimePath(); luaDir != "" { + normalizedRoute = strings.ReplaceAll(normalizedRoute, luaDir+"/pow/static", PowStaticDirPlaceholder) + normalizedRoute = strings.ReplaceAll(normalizedRoute, luaDir, LuaDirPlaceholder) + } + files, err := m.readManagedSupportFiles() if err != nil { return "", err } @@ -693,6 +714,7 @@ type backupState struct { RouteExisted bool RouteData []byte Files []protocol.SupportFile + PowConfig *protocol.SupportFile } type managedFile struct { @@ -739,6 +761,11 @@ func (m *Manager) backup() (*backupState, error) { return nil, err } state.Files = files + powConfig, err := m.readPowConfigFile() + if err != nil { + return nil, err + } + state.PowConfig = powConfig slog.Debug("backup captured", "main_exists", state.MainExisted, "route_exists", state.RouteExisted, "cert_files", len(state.Files)) return state, nil } @@ -762,10 +789,12 @@ func (m *Manager) restore(state *backupState) error { } else if err := os.Remove(m.RouteConfigPath); err != nil && !os.IsNotExist(err) { return err } - if m.CertDir == "" { - return nil + if m.CertDir != "" { + if err := m.writeManagedCertFiles(state.Files); err != nil { + return err + } } - return m.writeManagedCertFiles(state.Files) + return m.restorePowConfig(state) } func (m *Manager) writeCertFiles(certFiles []protocol.SupportFile) error { @@ -775,6 +804,26 @@ func (m *Manager) writeCertFiles(certFiles []protocol.SupportFile) error { return m.writeManagedCertFiles(certFiles) } +func (m *Manager) writePowConfig(supportFiles []protocol.SupportFile) error { + if m.LuaDir == "" { + return nil + } + configPath := filepath.Join(m.LuaDir, "pow_config.json") + for _, file := range supportFiles { + if file.Path == "pow_config.json" { + if err := os.WriteFile(configPath, []byte(file.Content), 0o644); err != nil { + return fmt.Errorf("write pow_config.json: %w", err) + } + slog.Info("wrote pow config", "path", configPath, "size", len(file.Content)) + return nil + } + } + if err := os.Remove(configPath); err != nil && !os.IsNotExist(err) { + return fmt.Errorf("remove pow_config.json: %w", err) + } + return nil +} + func (m *Manager) writeManagedCertFiles(certFiles []protocol.SupportFile) error { files := make([]managedFile, 0, len(certFiles)) for _, file := range certFiles { @@ -836,6 +885,53 @@ func (m *Manager) readCertFiles() ([]protocol.SupportFile, error) { return files, nil } +func (m *Manager) readPowConfigFile() (*protocol.SupportFile, error) { + if m.LuaDir == "" { + return nil, nil + } + configPath := filepath.Join(m.LuaDir, "pow_config.json") + data, err := os.ReadFile(configPath) + if err != nil { + if os.IsNotExist(err) { + return nil, nil + } + return nil, err + } + return &protocol.SupportFile{ + Path: "pow_config.json", + Content: string(data), + }, nil +} + +func (m *Manager) readManagedSupportFiles() ([]protocol.SupportFile, error) { + files, err := m.readCertFiles() + if err != nil { + return nil, err + } + powConfig, err := m.readPowConfigFile() + if err != nil { + return nil, err + } + if powConfig != nil { + files = append(files, *powConfig) + } + return files, nil +} + +func (m *Manager) restorePowConfig(state *backupState) error { + if state == nil || m.LuaDir == "" { + return nil + } + configPath := filepath.Join(m.LuaDir, "pow_config.json") + if state.PowConfig == nil { + if err := os.Remove(configPath); err != nil && !os.IsNotExist(err) { + return err + } + return nil + } + return os.WriteFile(configPath, []byte(state.PowConfig.Content), 0o644) +} + func (m *Manager) certFileTargetPath(relativePath string) (string, error) { if strings.TrimSpace(m.CertDir) == "" { return "", errors.New("cert dir 不能为空") @@ -988,10 +1084,15 @@ func removeEmptyManagedDirs(baseDir string) error { } func (m *Manager) renderRouteConfig(content string) string { - if m.NginxCertDir == "" { - return content + rendered := content + if m.NginxCertDir != "" { + rendered = strings.ReplaceAll(rendered, CertDirPlaceholder, m.NginxCertDir) } - return strings.ReplaceAll(content, CertDirPlaceholder, m.NginxCertDir) + if luaDir := m.luaRuntimePath(); luaDir != "" { + rendered = strings.ReplaceAll(rendered, LuaDirPlaceholder, luaDir) + rendered = strings.ReplaceAll(rendered, PowStaticDirPlaceholder, luaDir+"/pow/static") + } + return rendered } func (m *Manager) renderMainConfig(content string) string { diff --git a/openflare_agent/internal/nginx/manager_test.go b/openflare_agent/internal/nginx/manager_test.go index baa06226..5562f9f3 100644 --- a/openflare_agent/internal/nginx/manager_test.go +++ b/openflare_agent/internal/nginx/manager_test.go @@ -736,6 +736,13 @@ func TestManagerApplyWritesSupportFilesAndReplacesPlaceholder(t *testing.T) { if !strings.Contains(string(routeData), "/etc/nginx/openflare-certs/1.crt") { t.Fatalf("expected placeholder replacement in route config, got %s", string(routeData)) } + renderedRoute := manager.renderRouteConfig("access_by_lua_file __OPENFLARE_LUA_DIR__/pow/check.lua;\nlocation /.within.website/x/cmd/anubis/static/ { alias __OPENFLARE_POW_STATIC_DIR__/; }\n") + if !strings.Contains(renderedRoute, "access_by_lua_file /etc/nginx/openflare-lua/pow/check.lua;") { + t.Fatalf("expected lua dir placeholder replacement in route config, got %s", renderedRoute) + } + if !strings.Contains(renderedRoute, "alias /etc/nginx/openflare-lua/pow/static/;") { + t.Fatalf("expected pow static dir placeholder replacement in route config, got %s", renderedRoute) + } mainData, err := os.ReadFile(manager.MainConfigPath) if err != nil { t.Fatalf("failed to read main config: %v", err) @@ -867,6 +874,12 @@ func TestEnsureLuaAssetsKeepsBaseDirAndRemovesStaleFiles(t *testing.T) { if _, err := os.Stat(filepath.Join(luaDir, "log.lua")); err != nil { t.Fatalf("expected managed lua file to exist, stat err = %v", err) } + if _, err := os.Stat(filepath.Join(luaDir, "pow", "check.lua")); err != nil { + t.Fatalf("expected managed pow lua file to exist, stat err = %v", err) + } + if _, err := os.Stat(filepath.Join(luaDir, "pow", "static", "js", "main.mjs")); err != nil { + t.Fatalf("expected managed pow static asset to exist, stat err = %v", err) + } } func TestCertFileMode(t *testing.T) { @@ -906,6 +919,93 @@ func TestManagerEnsureLuaAssetsWritesReadableFiles(t *testing.T) { if luaInfo.Mode().Perm() != 0o644 { t.Fatalf("unexpected lua mode: %o", luaInfo.Mode().Perm()) } + if _, err := os.Stat(filepath.Join(manager.LuaDir, "pow", "check.lua")); err != nil { + t.Fatalf("failed to stat pow lua file: %v", err) + } +} + +func TestEnsureLuaAssetsPreservesPowConfig(t *testing.T) { + tempDir := t.TempDir() + luaDir := filepath.Join(tempDir, "lua") + if err := os.MkdirAll(luaDir, 0o755); err != nil { + t.Fatalf("MkdirAll failed: %v", err) + } + powConfigPath := filepath.Join(luaDir, "pow_config.json") + want := `[{"domains":["pow.example.com"],"enabled":true}]` + if err := os.WriteFile(powConfigPath, []byte(want), 0o644); err != nil { + t.Fatalf("WriteFile failed: %v", err) + } + manager := &Manager{LuaDir: luaDir} + + if err := manager.EnsureLuaAssets(); err != nil { + t.Fatalf("EnsureLuaAssets failed: %v", err) + } + + got, err := os.ReadFile(powConfigPath) + if err != nil { + t.Fatalf("expected pow_config.json to remain after EnsureLuaAssets: %v", err) + } + if string(got) != want { + t.Fatalf("unexpected pow_config.json content: got %s want %s", string(got), want) + } +} + +func TestManagerCurrentChecksumIncludesPowConfig(t *testing.T) { + tempDir := t.TempDir() + mainPath := filepath.Join(tempDir, "nginx.conf") + routePath := filepath.Join(tempDir, "routes.conf") + luaDir := filepath.Join(tempDir, "lua") + manager := &Manager{ + MainConfigPath: mainPath, + RouteConfigPath: routePath, + LuaDir: luaDir, + NginxLuaDir: "/etc/nginx/openflare-lua", + Executor: &fakeExecutor{}, + } + + outcome := manager.Apply( + context.Background(), + "access_log __OPENFLARE_ACCESS_LOG__ openflare_json;\n", + "location /.within.website/x/cmd/anubis/static/ { alias __OPENFLARE_POW_STATIC_DIR__/; }\n", + []protocol.SupportFile{{Path: "pow_config.json", Content: `[{"domains":["pow.example.com"],"enabled":true}]`}}, + ) + if outcome.Status != ApplyStatusSuccess { + t.Fatalf("Apply failed: %#v", outcome) + } + + value, err := manager.CurrentChecksum() + if err != nil { + t.Fatalf("CurrentChecksum failed: %v", err) + } + expected := bundleChecksum( + "access_log __OPENFLARE_ACCESS_LOG__ openflare_json;\n", + "location /.within.website/x/cmd/anubis/static/ { alias __OPENFLARE_POW_STATIC_DIR__/; }\n", + []protocol.SupportFile{{Path: "pow_config.json", Content: `[{"domains":["pow.example.com"],"enabled":true}]`}}, + ) + if value != expected { + t.Fatalf("unexpected checksum with pow config: got %s want %s", value, expected) + } +} + +func TestManagedPowLuaFilesUseInternalChallengeFlow(t *testing.T) { + if !strings.Contains(openRestyPowCheckLua, `return ngx.exec("/.within.website/x/cmd/anubis/api/make-challenge")`) { + t.Fatal("expected check.lua to internally execute make-challenge instead of issuing a 302 redirect") + } + if strings.Contains(openRestyPowCheckLua, "ngx.redirect(") { + t.Fatal("expected check.lua to avoid external redirects for challenge rendering") + } + if !strings.Contains(openRestyPowChallengeLua, `

`) { + t.Fatal("expected challenge html to include Anubis-compatible title node") + } + if !strings.Contains(openRestyPowChallengeLua, `
`) { + t.Fatal("expected challenge html to include Anubis-compatible progress markup") + } + if !strings.Contains(openRestyPowChallengeLua, ``) { + t.Fatal("expected challenge html to force Anubis frontend to reuse the current URL as redir target") + } + if !strings.Contains(openRestyPowVerifyLua, `if ngx.var.scheme == "https" then`) { + t.Fatal("expected verify.lua to only mark the session cookie as Secure for HTTPS requests") + } } func TestManagerRollbackRestoresCertFiles(t *testing.T) { diff --git a/openflare_agent/internal/nginx/pow_assets.go b/openflare_agent/internal/nginx/pow_assets.go new file mode 100644 index 00000000..df1d497d --- /dev/null +++ b/openflare_agent/internal/nginx/pow_assets.go @@ -0,0 +1,523 @@ +package nginx + +import ( + "embed" + "openflare-agent/internal/protocol" + "path/filepath" + "strings" +) + +//go:embed pow_static +var powStaticFS embed.FS + +const openRestyPowCheckLua = `local source = debug.getinfo(1, "S").source or "" +if string.sub(source, 1, 1) == "@" then + local script_path = string.sub(source, 2) + local base_dir = string.match(script_path, "^(.*)/pow/[^/]+%.lua$") + if base_dir and base_dir ~= "" then + package.path = base_dir .. "/?.lua;" .. base_dir .. "/?/init.lua;" .. package.path + end +end + +local cjson = require "cjson.safe" +local policy = require "pow.policy" + +local pow_config_dict = ngx.shared.openflare_pow_config +local pow_sessions = ngx.shared.openflare_pow_sessions + +-- Lazy-load pow_config from file; reload when content changes +local function load_pow_config() + local config_paths = { + ngx.config.prefix() .. "openflare-lua/pow_config.json", + "/etc/nginx/openflare-lua/pow_config.json", + "/usr/local/openresty/nginx/conf/pow_config.json" + } + for _, config_path in ipairs(config_paths) do + local f = io.open(config_path, "r") + if f then + local content = f:read("*a") + f:close() + local current_hash = ngx.md5(content or "") + + if current_hash == pow_config_dict:get("_config_hash") then + return + end + + -- Clear old domain entries + local old_keys = pow_config_dict:get("_domain_keys") + if old_keys then + for domain in string.gmatch(old_keys, "[^\n]+") do + pow_config_dict:delete(domain) + end + end + + local domain_keys = {} + if content and content ~= "" and content ~= "{}" then + local ok, entries = pcall(cjson.decode, content) + if ok and entries and type(entries) == "table" then + for _, entry in ipairs(entries) do + if entry.domains then + for _, domain in ipairs(entry.domains) do + pow_config_dict:set(domain, cjson.encode(entry), 0) + domain_keys[#domain_keys+1] = domain + end + end + end + end + end + + pow_config_dict:set("_domain_keys", table.concat(domain_keys, "\n"), 0) + pow_config_dict:set("_config_hash", current_hash, 0) + return + end + end +end + +load_pow_config() + +local host = ngx.var.host +if not host or host == "" then + return +end + +local config_raw = pow_config_dict:get(host) +if not config_raw then + return +end + +local ok, route_config = pcall(cjson.decode, config_raw) +if not ok or not route_config then + return +end + +if not route_config.enabled then + return +end + +local config = route_config.config or {} +local uri = ngx.var.uri or "" +local ua = ngx.var.http_user_agent or "" +local remote_ip = ngx.var.remote_addr or "" + +-- Check whitelist: if matched, skip PoW +local whitelist = config.whitelist or {} +if policy.match_any(remote_ip, ua, uri, whitelist) then + return +end + +-- Check blacklist: if matched, require PoW +local blacklist = config.blacklist or {} +local has_blacklist = policy.has_entries(blacklist) +local need_pow = false +if has_blacklist then + need_pow = policy.match_any(remote_ip, ua, uri, blacklist) +else + -- No blacklist means all non-whitelisted need PoW + need_pow = true +end + +if not need_pow then + return +end + +-- Check valid session cookie +local cookie_val = ngx.var["cookie___openflare_pow"] +if cookie_val and cookie_val ~= "" then + local session_data = pow_sessions:get(host .. ":" .. cookie_val) + if session_data then + return + end +end + +-- If requesting the challenge API endpoints, let them through (handled by content_by_lua) +local anubis_api_prefix = "/.within.website/x/cmd/anubis/api/" +local anubis_static_prefix = "/.within.website/x/cmd/anubis/static/" +if string.sub(uri, 1, #anubis_api_prefix) == anubis_api_prefix then + return +end +if string.sub(uri, 1, #anubis_static_prefix) == anubis_static_prefix then + return +end + +-- Render the challenge page through an internal redirect so the browser stays +-- on the originally requested URL instead of seeing a 302 hop. +ngx.req.set_uri_args({ + redir = ngx.var.scheme .. "://" .. host .. uri .. (ngx.var.args and ("?" .. ngx.var.args) or ""), + host = host +}) +return ngx.exec("/.within.website/x/cmd/anubis/api/make-challenge") +` + +const openRestyPowChallengeLua = `local cjson = require "cjson.safe" + +local pow_config_dict = ngx.shared.openflare_pow_config +local pow_challenges = ngx.shared.openflare_pow_challenges + +local function generate_entropy() + local pieces = { + tostring(ngx.now()), + tostring(ngx.worker.pid()), + tostring(math.random()), + ngx.var.remote_addr or "", + ngx.var.http_user_agent or "", + ngx.var.request_id or "", + } + return table.concat(pieces, ":") +end + +local args = ngx.req.get_uri_args() +local host = args["host"] or ngx.var.host or "" +local redir = args["redir"] or "" + +local config_raw = pow_config_dict:get(host) +if not config_raw then + ngx.status = 403 + ngx.say("PoW not configured for this host") + return +end + +local ok, route_config = pcall(cjson.decode, config_raw) +if not ok or not route_config or not route_config.enabled then + ngx.status = 403 + ngx.say("PoW not enabled for this host") + return +end + +local config = route_config.config or {} +local difficulty = config.difficulty or 4 +local algorithm = config.algorithm or "fast" +local challenge_ttl = config.challenge_ttl or 300 +local session_ttl = config.session_ttl or 86400 + +-- Generate challenge data without depending on ngx.random_bytes, which is not +-- available in every OpenResty runtime build. +local entropy = generate_entropy() +local challenge_id = ngx.md5(entropy .. ":id") +local challenge_data = ngx.md5(entropy .. ":data-a") .. ngx.md5(entropy .. ":data-b") + +-- Store challenge +local challenge_info = cjson.encode({ + data = challenge_data, + difficulty = difficulty, + host = host, + redir = redir, + session_ttl = session_ttl +}) +pow_challenges:set(challenge_id, challenge_info, challenge_ttl) + +local static_prefix = "/.within.website/x/cmd/anubis/static/" +local title = "Making sure you're not a bot!" +local lang = "en" + +ngx.header.content_type = "text/html; charset=utf-8" +ngx.say([[ + + + + + +]] .. title .. [[ + + + + + + + + +
+

]] .. title .. [[

+
+ +

Loading...

+

This site is protected by a Proof-of-Work challenge. Your browser will solve a small puzzle before the upstream response is shown.

+
+
+Why am I seeing this? +

OpenFlare is asking your browser to complete a lightweight computation to distinguish normal browser traffic from automated abuse. This should finish automatically.

+
+ +
+
+ + +]]) +` + +const openRestyPowVerifyLua = `local cjson = require "cjson.safe" + +local pow_challenges = ngx.shared.openflare_pow_challenges +local pow_sessions = ngx.shared.openflare_pow_sessions + +local args = ngx.req.get_uri_args() +local challenge_id = args["id"] or "" +local response = args["response"] or "" +local nonce_str = args["nonce"] or "" +local redir = args["redir"] or "" +local elapsed = args["elapsedTime"] or "" + +if challenge_id == "" or response == "" or nonce_str == "" then + ngx.status = 400 + ngx.header.content_type = "application/json" + ngx.say(cjson.encode({error = "missing parameters"})) + return +end + +local nonce = tonumber(nonce_str) +if not nonce then + ngx.status = 400 + ngx.header.content_type = "application/json" + ngx.say(cjson.encode({error = "invalid nonce"})) + return +end + +-- Get stored challenge +local challenge_raw = pow_challenges:get(challenge_id) +if not challenge_raw then + ngx.status = 410 + ngx.header.content_type = "application/json" + ngx.say(cjson.encode({error = "challenge expired or not found"})) + return +end + +local ok, challenge_info = pcall(cjson.decode, challenge_raw) +if not ok or not challenge_info then + ngx.status = 500 + ngx.header.content_type = "application/json" + ngx.say(cjson.encode({error = "invalid challenge data"})) + return +end + +local challenge_data = challenge_info.data or "" +local difficulty = challenge_info.difficulty or 4 +local host = challenge_info.host or ngx.var.host or "" +local session_ttl = challenge_info.session_ttl or 86400 + +-- Compute SHA-256(challenge_data + nonce) +local calc_string = challenge_data .. tostring(math.floor(nonce)) +local calculated = ngx.sha1_bin ~= nil and "" or "" + +-- Use resty.sha256 for proper SHA-256 +local sha256 = require "resty.sha256" +local str = require "resty.string" +local hasher = sha256:new() +hasher:update(calc_string) +local hash_bytes = hasher:final() +local hash_hex = str.to_hex(hash_bytes) + +-- Verify hash matches response +if hash_hex ~= string.lower(response) then + ngx.status = 403 + ngx.header.content_type = "application/json" + ngx.say(cjson.encode({error = "hash mismatch"})) + return +end + +-- Verify difficulty (leading zeros in hex) +local prefix = string.rep("0", difficulty) +if string.sub(hash_hex, 1, difficulty) ~= prefix then + ngx.status = 403 + ngx.header.content_type = "application/json" + ngx.say(cjson.encode({error = "insufficient difficulty"})) + return +end + +-- Invalidate challenge (prevent replay) +pow_challenges:delete(challenge_id) + +-- Generate session token +local session_token = str.to_hex(ngx.sha1_bin(challenge_id .. ngx.now() .. tostring(ngx.worker.pid()))) + +-- Store session +pow_sessions:set(host .. ":" .. session_token, "1", session_ttl) + +-- Set cookie. Secure cookies are not sent over HTTP, so only add Secure when +-- the current request itself is HTTPS. +local cookie = "__openflare_pow=" .. session_token .. "; Path=/; HttpOnly; SameSite=Lax; Max-Age=" .. tostring(session_ttl) +if ngx.var.scheme == "https" then + cookie = cookie .. "; Secure" +end +ngx.header["Set-Cookie"] = cookie + +if redir ~= "" then + return ngx.redirect(redir) +end + +ngx.header.content_type = "application/json" +ngx.say(cjson.encode({ok = true})) +` + +const openRestyPowPolicyLua = `local M = {} + +local function match_ip(remote_ip, ips) + if not ips or #ips == 0 then return false end + for _, ip in ipairs(ips) do + if ip == remote_ip then + return true + end + end + return false +end + +local function match_cidr(remote_ip, cidrs) + if not cidrs or #cidrs == 0 then return false end + for _, cidr in ipairs(cidrs) do + local m, err = ngx.re.match(cidr, "^(\\\\d{1,3}\\\\.\\\\d{1,3}\\\\.\\\\d{1,3}\\\\.\\\\d{1,3})/(\\\\d{1,2})$") + if m then + local mask_bits = tonumber(m[2]) + if mask_bits and mask_bits >= 0 and mask_bits <= 32 then + local function ip_to_num(ip_str) + local parts = {} + for part in string.gmatch(ip_str, "%d+") do + parts[#parts+1] = tonumber(part) or 0 + end + if #parts ~= 4 then return 0 end + return parts[1]*16777216 + parts[2]*65536 + parts[3]*256 + parts[4] + end + local remote_num = ip_to_num(remote_ip) + local net_num = ip_to_num(m[1]) + if mask_bits == 0 then + return true + end + local mask = math.floor(2^(32 - mask_bits)) + mask = 4294967296 - mask + if bit.band(remote_num, mask) == bit.band(net_num, mask) then + return true + end + end + end + end + return false +end + +local function match_path(uri, patterns) + if not patterns or #patterns == 0 then return false end + for _, pattern in ipairs(patterns) do + local ok, match = pcall(ngx.re.match, uri, "^" .. ngx.re.gsub(pattern, "([%^%$%(%)%%%.%[%]%+%-%?])", function(c) + if c == "*" then return ".*" end + return "%" .. c + end) .. "$", "i") + if ok and match then + return true + end + end + return false +end + +local function match_path_regex(uri, patterns) + if not patterns or #patterns == 0 then return false end + for _, pattern in ipairs(patterns) do + local ok, match = pcall(ngx.re.match, uri, pattern) + if ok and match then + return true + end + end + return false +end + +local function match_ua(ua, patterns) + if not patterns or #patterns == 0 then return false end + for _, pattern in ipairs(patterns) do + if ua and string.find(ua, pattern, 1, true) then + return true + end + end + return false +end + +function M.match_any(remote_ip, ua, uri, list) + if not list then return false end + if match_ip(remote_ip, list.ips) then return true end + if match_cidr(remote_ip, list.ip_cidrs) then return true end + if match_path(uri, list.paths) then return true end + if match_path_regex(uri, list.path_regexes) then return true end + if match_ua(ua, list.user_agents) then return true end + return false +end + +function M.has_entries(list) + if not list then return false end + return (#(list.ips or {}) + #(list.ip_cidrs or {}) + #(list.paths or {}) + #(list.path_regexes or {}) + #(list.user_agents or {})) > 0 +end + +return M +` + +func ManagedPowLuaFiles() []protocol.SupportFile { + return []protocol.SupportFile{ + {Path: "pow/check.lua", Content: openRestyPowCheckLua}, + {Path: "pow/challenge.lua", Content: openRestyPowChallengeLua}, + {Path: "pow/verify.lua", Content: openRestyPowVerifyLua}, + {Path: "pow/policy.lua", Content: openRestyPowPolicyLua}, + } +} + +func ManagedPowStaticFiles() ([]protocol.SupportFile, error) { + var files []protocol.SupportFile + entries, err := powStaticFS.ReadDir("pow_static") + if err != nil { + return nil, err + } + var walk func(dir string) error + walk = func(dir string) error { + entries, err := powStaticFS.ReadDir(dir) + if err != nil { + return err + } + for _, entry := range entries { + fullPath := filepath.Join(dir, entry.Name()) + if entry.IsDir() { + if err := walk(fullPath); err != nil { + return err + } + continue + } + data, err := powStaticFS.ReadFile(fullPath) + if err != nil { + return err + } + // Convert pow_static/css/xess.css -> pow/static/css/xess.css + relPath := strings.TrimPrefix(fullPath, "pow_static/") + files = append(files, protocol.SupportFile{ + Path: "pow/static/" + relPath, + Content: string(data), + }) + } + return nil + } + for _, entry := range entries { + fullPath := filepath.Join("pow_static", entry.Name()) + if entry.IsDir() { + if err := walk(fullPath); err != nil { + return nil, err + } + } else { + data, err := powStaticFS.ReadFile(fullPath) + if err != nil { + return nil, err + } + relPath := strings.TrimPrefix(fullPath, "pow_static/") + files = append(files, protocol.SupportFile{ + Path: "pow/static/" + relPath, + Content: string(data), + }) + } + } + return files, nil +} diff --git a/openflare_agent/internal/nginx/pow_static/css/static/geist.woff2 b/openflare_agent/internal/nginx/pow_static/css/static/geist.woff2 new file mode 100644 index 0000000000000000000000000000000000000000..6fd61c44dbbbede2b274bb765fb83f75c5e26872 GIT binary patch literal 64184 zcmV)2K+L~)Pew8T0RR910Q$H96#xJL0!)Me0Qx%s0cNNG00000000000000000000 z0000Qi7Fd`>v9~LNDDM(YC^=UKD*; zC&W4IK-8PtIa&d5eX~zcG2I-zKzHEIg{jI`{{R2~|JNjw7}HCDOOl5N5X54gR@=7Q zK*bE^(j$a944zg3y=OWc10xb%iHN?BVm3}OPxLwll7*NA!G$LiPO;8{L=JlCRgN-< zATmPCBZ9P|_nS(pd$T`z$FhkCaf?Rd z0v2KVtpVj-n0~Z($!hSxLwsPG;1hxo*qvb_g}XEi?qZBGX2D=-`f)Adxp5h;uO1cK z_DS*j!V-g@LwruDnVCwe)Gl>2@`NLl6`?2Ll3x_xVsmf)b8mcG$ND&n-^O*+sap%w z{yuBfvU?}jc5pi85B!`GAAq_o>i)RGlA>yCtrI|31URLi@WD(X< zMpB+TJN8&L>T_p)o4lw|CkcvGQu0n%+q?d$9_-$Kbzjk6-eh)X&sL~}N?dv{6hE|*-4 z5JHfo5Uhw7s-B9ciq@RcI#v;()S;#FEmi%R3rx>%>;Fa`ki5`>frZE_D!PiX+ZeT# zZ=-%!xUXv0=VGkmGZL|o1%tT6tpPr7|43R4vzA!OKb;?+cbA;Fe$y#ZNlm{PNhqNukVl}o zc38%+ZYRShJmZAl}UGzMDF5=xs~@s`UWmrMPYJP>li3&i%& zBH|zK)c#KrE8L`zxM{Nh*b6|r7rGCC=l{(r$|J-SFb%l2CEJoLAPX!4%d(6~{x6rk ze}xS;KSm0{GHa`6Bu790PVGAe$&xG!uLuk>${0n#I@nJ8O0Wb}$C1N0v| zS_UQZOVQ0pjCirE`xoQ&{M?u#ImM*wyw?N{4|b1g&Yjk0IH*UhW^%hra(HU;?X&%c zF9bD&4s zY)JZn<_{@J)DJPQChk&L&dQ7Btd@B>c{khDEN8c!GmHKB&oBLE@0q*1%*#;T*_ubI zGpK~3{S-=G=C{e#H_5h={j}uMx>^n0IE38NLM;x2L^_1>IE;|o|FmYeP)hU7BGg$* zHKGcW%;aZoU$WOqQJoao)X>DB zFs{$ykZN{wQ5%3yXhKdtM2W;%jJ5E5-#yc2uKl5Z7R(A?)RN@6MQNDE!{>AwN292F z#^PN*Gj+@*xhj^b5E4IHzO(=S&P(64W&UzT!(Qk$xm^h@XtiNa{K z#Q&U@)bU$gvC=i3pVmDg%*PHs8U$UmP5!Bs1$7kaW7;647914+Kb^hp+#SzZY1!)^ z0vGeC3KR`NwOwfq?C5DU3oJPV_D8C$)dzhiT&AX?P8qHM+ajsr*RQF)-P>P=Q;Dmr zke7K8Dkmc=EC2|VsfsV*Pl0|dOY*Hy1e!>B(xy{aWn96k$;NksffLRndW%ZkI}iM~ z+1K~E1y<57BO5`fvBjcAPWL&?5Fcw)tYyK0mop0vMb`fWpw?Fw^h9Z8_K5&OdAW-V3<3`o`0< z<(zSNj2RITp&619k)ue4ghY6A2=R(|+x_b@{BJXInJ{KNi8K(4x{X#rN19uI{GI$N?Acq_%&w6NsVnm5U(2;atB6Ax|H{BsgmjEVHBA7lt1d}5J%tEukEVcy9T5G{< z^(B}cHiOw`7nq}Rz?^j!%oFFqJog)z*KPslry1bxstN4ATEQNu9qi${z#gv`9H1b> zQwK`KFbNQ+9x~?p1;L=Hjzc88n-9i^eS$T^VL^A$_`jkOU@ve6K}Mh&fH^cLum~LU z$N>RPV1TQEdjl^Ab90FN1cw0btp+#<1gP~;AkK4RNwTta4cXuj2n6t5$qS-nfC**1 zZiH0EjkB_B?fF4iLAqTmw<6yU04RV!V$(c(_3wMSy>H2$w%%xOQ{SmR96QD#-ZMU5 z#4Y%e;4b>$AC!H=`^NLJX{cp*WCR&8jf{*AkF$RgIkFs`yjnf&_>@`qj@n_I)$iOj zZDFg3d0@e-a$e)&PbVYgj~B-$jZYq5e`jHG)a2C38Iv3CPLCfS&x|tKxKn@H zo*p|reR{^xw} zqqQf@7HTxo3?)K$WmsnXKY&mg=Vafg z^lh@0wCwT?NmH~<073)`fjRN1wH5 z(eXh3oO(KU!;hgRSERK0;-ZHOf_#~QWmPOm9tlkq?MO6iXBi%pL}ii*S<3jv(-QLq z%KsOPrq-%hFG6S{qU@X287KOC{-N&~nW2t@gYhm6>qTNsWes$%VV9ek%=Wr=zso zT3eueXJeU_g1C7D(8_LyUyt?$3)bG2rSy~gX{_0@br-G$> zxf=^vDv5vGMerlCOsv+|xD3wPn$?`rjMP_mkI0gQM?dDKr6gLKNb0H94hpL>8^XozG-=kofMy7sT6$pO1 z#Pv0tP!jv!p+aObh!UwoM9NIon~fyg!I zA|`Be2DVZL*@69F(W^)5fvMW8K9!(Ax@soc<5>_R9BuTB;ds{b81sB~P)nPMrj!Kb zp03+Pp|kne*t9DAjbJj4_|Sui6)Vj(sq5qt9veF!wZv?09g=IJ`p5^pPJKVODVD1ziF|f zl!-`LB4QO*-U~a(T2l?2RC&!z!qvo980W((Q%0Fm!JUmdxB&Z{m++-YPV|DFho^FN zsvjVt-mV$sTnxuTBF=Ci-?^OVEjjLR;E_$|13z&!Jylr|0#;Q#vNra6K5XMewc7l` zz@2-;U&lC{bD&cwL(}f1N5U(=NczyUcx5s~0av`rA2OBDcj^ffrwY^szXS4qmdno^ zGZ5!3W<|wVie^Ea>;+8{Y#Cn>Uji}yoHTv;`2nqIQ6kNw=~e^?G<+})bXHW zmW^WjGNM>~cnd`b^x0L<`hO&&P8uYXUKTM_)ZW$Q&5D_2I(qY6K8_ZN7kFe4wucmV znx;2{40}2hzFjDdJJf)G=zH9cDmCAsy|)xKgm^|t+EFl?1MzLo-yONo)W?JN@Go1K$H#ZI|^h_UhqZtf{Xt^M05=0z%A3Oim=i^fz7BD9y9Ue?G&up-mi-mdVPSDLIgD z*%!YE6WwkR@(gn?;nwegB_h#NcXO51Ltn50$*>36=bv^q?dF0s#V)Qw-lWUG9*g@D zMiw1lDGe*3my66>`-Qh$WmxDPr=;?3e}VZ3}#FJdQ!pe>G$gS&*lrJi~+-OE>zG7&DKH z68^2MHV)yjdU7BC(VaaZN)@-bd{pA4EM$0*oaoz0(X0$!A{>MEM>>QjpMZ-F@o|bc zaKIqnVIQ6lCo(AqMAP;a%?I`r2wG<$lAb$Ag$xNk=j?<@-A-LSe{xx~P}!`CMtjuL z-`7fSM?DAHCqd~-No~GEA4oXA6x%E~G*Y8fGklXKTlu-Y&htuo<^o*69gq%~xVTK&+!IP`)4SSNuCr1-aWa4EiIa2;8C5ot)bQwMYKVME&iRhm` zjj@l6DHrw6P<0QNdRcGwR6-JFht*y6O4uDE10%=1Td97$Kqi?PrIQQ#5M@$ghUH6x zK!ls6*OLF^b^Sp|sr5mIP*UIU07UTL?>~!wh6`4LOZtlj2!1n@|252!J2Qb}B>od) zP~~O09zQ6ym<(q#1rqfC_aJ~O0tN70`W;9J3hY*)9&z-idcu~v_;Bmsc`f*Ux1YFu z5yJ6;VEdh1REt(#ymIcp-GOF(yKg@RBI%*~n1A;6RfO-Wb(DahHYo1ShbAbbab$4Y z_xu)75r^fu?ZTzURGwr&ClI{b$+EaJvKD%7x5 zI8Xjmy(f6hJ=u9L1%CUEuHv1|jX~epY_5lU2cgZw*13B<*HGK8B|}!SVrxlr);7Pz zE&zX<-vJb0>tC|`pV@}p*u=Tv)%yS8r6jUujV-5KkfK0_#MdKoxwV4PRHQJ`>u+pZ ze^*57H$Pu)R=KWdS1$qkaboro4cPiOmut*+u@}d10XM_#aZfxLkHypRLcF?tD>6wRg1 zuVgzttCqqb)sTjCWZd(V%`-fg7nww32pyT8H_d7cUe*vW6vHqaSy+YD?`L)`KhatW zRhgc2AI=m>ljbr}7`oxvFo-nu%ew>w_rs`IkzwOCRgS^q#yc-(;~Wa92)#ua5(%3h zUFLA5D*$TBz{tcys4$feJ=<85_?c;@IhPh%Y9&RgH0d(rS!w579CzIfH-qt$iXSqv zayUGJNSYFsFKK7PjWF5_b1d+gJ$`b=udcZ2`XERbU^{jWGOt%Jlc2gwF25S)@bQm< z7qu3D=&nezPX3U7+iEy;bADCVJGu#fd}b~yB2@lEE&wO^5rj)%lxYwjQ_K-;vBjb- zwM>i^3dJc>B*9wiBq~uR$q{GOcgqtk0}wnTSm3&35Nmpd5yRN9UT0i4{D%p-=t4nw zZ!+o#~ZW!pzF8Wmd0kW?@rKv!pfGSk{ItKc|eQqP+a%K*|v#36x{F z!?ux`)wznl@M51O(nz-qPc(GPoLk2m2X?suZgR_RyPx2@_JbQB93KV*;Fse+1&B4a z_oN!uPwMmmKpkjwKHq(Dh8dxk4=mQF@E;RsypIer(I*C*A;aiT2Qofvi;VTEG3h5k zTWd}3$S`J4J1wv$O^ap8S^Iu2UM|-`D;#px>Q4=dZ7mqKqw&Qb25oJ!zvDnhZpRND z2QP`g32*Q+`!{%RsqfSG>j(6M`kUyti9d;caT-L3Lr7RpmLtw59iv6MOA)x4dvMfG z_-9+R1bRyWv8CxdJ4Yo+Hx0)9+%6Pqo=*+4*pk<0%Y5d;P!*r)ZM0dc9d=c2X_}@p z(+?rb(Zn3b`*WT0vw424i=0Do&Y}`mT(i`5S^wzvQUAkBtd}j(58FE&@Ac#QV9-ZHhK(5Y+qNCM_U!xPp#M$= zFx?C@<;XS5YBII8$9w&_J{a`TkYOW6{kCn#u08wyIOxBV0Zcc;OgVDR zGMk=(5d?-XF|)9;!4cd%LgMz?XTp95yyYWPKJ$~G{otkQF&lG}C=nlk(15vNTPW)I|1#0|<)=q;Mje<}4Sv%8l+cXRU;8>5D{F!*JtS;N~OcjZ93D{*^ppoZ_P`$9~rAGY4G_#|1YBVmI z8s@h}9JRRku#qnQJop(KMYP~w7w!3r!2P~vVv8Jf(aTRK;nch|J8lA@QAvY@(~u`E zq(T`~bn#+x`7B!zI%d=}Wy}ee%#zbXd9oviS2M(}TLH>NS`!@EN<_0LI9-IP2}4Aw ze4Wc&m)I8fu=@!-3eywtP{ll+qX9lJ`t=sO$2!RVEkppuKNgq7Ib6mKjAa-0V1Ewf zSdw3588APiH?*4Vux|$=1aC~P2Vs!iV3wB_D`{z4fmBUSl?Nk_MiGZ?OP}h}LB6w@ z%iu*LNu*Gcnw*qav*HU6azEYazmxA?lYjYvQ>su!;WNbO*b?KxzrB>Ck(yjanP1Uz zmQhUClAeML;TMRBLyMBUE;>^NcnVk+w?G*J4qT}5Td-R0B9#=MF&rk5F?+kv$C zF4R_J1F*}&Jy8km=#??kg)O7$e;%Jbc?Cr!7YQMR5{9tEQhc{_?M`kH^3FHE0t$>& zNTG!nQB3qQ$|VT*WWB4`6~~Se+m#O zS45w`&Vr)_2sltA2vP|lpzk3a3RH8Lwb%vAIh2Zw=ihGP~J8J3@fu?p}^`Hx8t_P9141Cl7U3f~> zRk{9k!KR2b0F5G+W5B(~ihtgKUGg-t8ZMHH*$>vzZC0ffk&x9X>+f-ZI$4|9PEV8c zXW5REUl&s9fM0$BtbK9A6n-Im`mtMaU0Cx2F!Cgo4CM@Ms?%@7#>lKjJMkHF<4JS(!l^jHbn=G_$@>jXzvT>yi zbain@ZY*op|NG#`%_uT%pJBMu57X=1@5eFyvzncROoz9QCcGd6;w&Uk5}|?`(mi@I z!$!);gKZNY6#OA&?+@h=LM7tTyhKTO$*R#j8xYKDQiq)jc(YGip<0UyZ5I1!s~xJn zP7K_-cfJQ3B`GrKHtnzF4VFc11dBAXjpbpS9G>!yjb;TVGi>8Giso8Gbt)f}mZ+9b z3WLIOsIrn&Q9o~$)zsG1o~QLew4Pe^q4W^bJ8;VEZyaRo?XXM!96!a^dDjrv-Nbn5 zHSHNj;Jl;ueiq|jne!0~^CJW>6e*A}r~rLHs0NG%wJed0B=10Tj3uzZk@!Rfn@Ulo z4I*0Dghq!~^rDALR4g#57Hdcvdkybk#K5Jw*TJ;Z9+D0^gXyRXB%Q>;rnCRz6})(u zboDkQ-E_q_Zo0uGMRzRm(36wplK^Eh9!Tk_6}nAnl;Wo~%5#W=A_IXYgH}jO5M3E5 z(2Ry(q97+a?q6ekh&mGhO-@kqfGLTPGC8_B$;V|npqT+Vsln)(j)N%~0?qua(RTKM zltqFji$SxbgE~viN3(DVbstRzrj&wa9cVT}kBlH%2w#N!w=Y;0hqJ#YB1nn{IBa_$axYxn>mo&GcdUi z%ma`-1e3?m<|{ByJFs~sAMM6Dy85+CWmzD33nuS@`2dnn!1Ebcz5vNr!1)0xzXrBK z-JhTaD<$mb&fG4ejuOOW#Qh_zSTW**ks!i}AN=cYl|aIX&oN^vH3Utx9cRNTf%lbg z5<~1@EQ9TYG^-MF-vT=h>^O$tGO73;F{q4nf2Fb-ok_G2Mdj*ZoPnYTjF1W1M=)r- zkN_disA*9vjZy7qgVoUpO0C~)qb<}f#rg;$^#x>fGX6OkMi>+Y6ioWe;^#GtO zcqn}05)LoJ+G%I(GRQ{LhfkoVUhshM$_IuBy9Pn?nCNIBFawE{W)tm#o+iam!J&u4 zEQ9nT+Sap&8fpuQox!-3PBVa@g2TL#oq!1q{!&~Zf)NIf0z`f`BzFx4`Sd=R5r%_I zqd+K9-#W-4r)yyHHDIQ44bMEb!Y@YHi+tuvM`FRF%vcEg6!OH6Bm3VLfcaQX@l@DV zgJKWVL9!JFf?i}|V(xWeOE)kgV(BCV4IIR}r*8(f?RmMV&itY~UUs;Ys|lK1gDqo% zDooNr1}1l@ctjpJFnL4;8G4Agiwo$#jb)a>p_itBmH!j;_eO)!EW?6bo&??|pa zX2Qq?Ea-3;a5(9KDkW-U;V_Z|PI{?Fjx4!sJbt2;9EL*wrtK8_Z@L@*9}8v@5SKJA zY4XVU=olt!^`~&;jerYLvBWjNwn3xibSc!G$ElQi>K8hN18_p&bv(1J@N&3t(3+dv zjw&MEQid_iiQVoGQ69vGdc=tno}-lcl=TwVyiIBETj&!$riMIO>Eqz^0qIIS1N>zW z_-;4|4g3=kgJ95$XCGM190R$=KaiL>a0rhI99aRG)eYPe7K3NIef$K)Kv}zRe?kC| zjwJMf!SsflYAgs$HArZMz%i`_761>MBkp8*A2HGCdfSNxxNsBjhU>;q%N1XQ6BliU zQqEf!*Ewqh=;T=*uXaor$`OOm#KAp40+)6Z9Cq&#>e;@taAnJmp^=T-k6WzY?n|+C z#{~cZC!I^f0_PIL`k=;0Ga<|HC^*l;2WshcXToF4?xpiKlvD7Ww4a_0;xq;w(mSTp99ychzwGJEGgJp4V z4#1#gOO$EpA&p)%^F=?;pQ;B z%U%ZvEb%CTIgL2li;|_mxf)U8X^a@*AwzObnu76^MX93V*%Frb}2#K|3E$P$^7o$kx2ylI!=X2DuoQps;wlCP;&?p#!DG&1a1K$c`YGuXEO? zfk&-sjbM~963x~K=ZRsV1%o6*KRu>bvG;N6s5xGM*mD$7)@z?dIpd>~I#N;f8xhJF zG(hp*_yCHk@GG8Q7V-jmb$9~jscn$1G=5s@##F|mRd(lAl{T#Izs z0YaOT9H^6(oq)1C8zp!kLlqj?kVXCrtjjEDu_|ehwa=3rL(g&LWVq^dPz(@QZF&+W zmuZ2J>Fbrn$g~%^lL}Akz6?oA$kQVYkwe$i6fq}!DgrjKPbvTR3F|U<7g`U@y1{gB zU0GljmnW3sb%XC3;V=RuL;@*<^&Y`;$?G6U*w%2xg{?HG?>(bnrsQj54J3JS zL{3(dX0jdnNsDgKSaQ!+$>ez+gA)v4$tj+m)}djvgpLthG`&ORI!6&Ca1w{0Ay7+h zNpgFvb5QKn?4?qKmN9ceLljfxs5_CQh^}jWMtWxmBT2MeLFgqiuE2tLdF%=#=pZVt zg#~ToVz&haQHBiL1Ii5{ahE(1aJ9u+f1=?Ai$$(`JSg4(70y$r1ZQIxc7Ye`t89L( znrN7S-Ny(XlmaJ)5LNdj1RJNv$X_j^(Svx5=^gP+nK>Q$+<}GK}^Kr z=)r^trETQ!zZirq*bRax9D^an9TDL$h$SvUC0zF>qujCyB{7lk(9anrocY^2`yl{oWmEkNcE%l=BVR^P)9YK9K;x&mpT{x7z19gid~b z@dT@z04hh_SJFk(YOll%RN2r~ zCVuT3=#=qw7SaBT6%JR*3XB14IRqy0DvJ|i4o|I>)oZ*c(WI?OngxzfBER?O0CsThF>Rv};KTxwISg1EoM>qf z%S{o_9F;|NLyA#bScKh|sIdN9$RSX1jJjs2mT6cKBb=E`(yGyoxyyp0>jEqZ#g~gB zx|6p+HdNW`J0mbphDZ!N_D1yigk@D!2OYrf2+U;8g&$>$iUS5JS4liPX6d3}x1pWq z<18|w5<)7ZOYjtgFB*(z#N_Dl-CO0_#M_2f>5G%B%gya=A_|Hn4Gh zh$=kb?E+gf2x){x)`)Pkew<-hLxl@P8ggL>z_653qGUmWlmk?X#h!SfJl+M^Z2&X! zC9jVe$QQeQnt=()Wich>n5+3h{7Sq8{S7fniZmG(SQegZWZ7tY{Byx_i*n2v`L4O8 z7(parD!hmyYh24-4ukbM&tVGof1&md(ENGNixbFy&6g5r^%@s3w0=XP0P=o$MG*6z z2pDt#7p@41SNndTV+lzg%GUvoeDr<+4E>by0gU=Iov$fb^pwilrn0UK);Evd7O|nv z+1Q%T?{CAOe2-y^B!^seekS|N${OhXzaci^xP*}_92XiPVJ!(qBy2t5hziFAW0%`( zgrd6`%T*(OwTB?KGou;UKKB%E&=FP25&zbyhiz(n4ZOs2JjG-4kk#9aEs5t5&!XF4 zmnfq|gLdw$>sm3vsnxaOF1BtH?xqD>sG{ zapN+9z1&*`bPCbrWB?^b{-JT(fkjTqVkf7=Nm=5|Sn5nz=8RbG3|Zlv(J7FsRSR3K zs9L^OtdcM5zg@Oh0|FQjK)GLj0mHfUCB(J-g#}cC>X1gXZytR54L?&@9s^Ri33KDy zaAuDDRrq;uBYYB^Gymn6S-uzQ!s-zlxP7v1SD?TV|8k!$_A%jZd5)3GvH6LiF3bWh z`N-9R+3z6B^@~ULE66hSN*%tw#cVvE@RH*$a&=kkZ_x3bQ=^2e2r#agOn_{YIrki1= zS!SD4xfNE1XhSEimol&1e(|d=e&OQhUpU2o`QXw6pK+Vl{KsAJ!WT2j#+JPFWvyT( zt61F{*ShZO^5ro8HYQ$xF)d09axt5kv4QLc$R2>~1;{>t><7pJfE)xl1acTzlEqnU ziKUiVZiPZC6c=yZwJkU5W#v}pm0!X7<2j&eRj)=ht5xluF0wkNWV3LuZI+5HU8d|e=WBw^q)a4; zc1IAlPl+<{5(=B$Qi+C9AWP;IT0?cyi!(zMNcFS`thK73@(gc$cxro{a38ct6tP>L z>dsX$)7~@Y!vvE|NmD@HTCs+%!6_sH0wAc@O)6Dua>VyKc!Fe#U9a;~^kjWzFg!#>Z6 z2`4gWoMNkSKAWi7tiqs4)gb5Oc4gPw2ut(1_RzipH;E#E5}<5jQBUB84R zQ;}Z3%ty|bS--+hp(?w6Re(}WZm~5%Ds|o}2Pcwe(*4YN1hE2(K`@YyAb%cQiH$ZX zwb>S1ZS$Y)cFfr8e_y(_3v+)N`Gewc^sKxkCpOc^aHHj<{9|8ei~UYG>55zKx$luD zp8B0J%F&39E5(7PTVeC73;M#pdc4>@k31vvd%uNFl!~;{AfSP;w-l6A@IfaIIU_M- z^%`rYy$(9+6yP%BNm(LGd>TRP2Vd1(*vo0%o@Pn@>$QAO7G8xa_EeRsT$QR;w|dpD zK@DqECzU<6c>`xA9fgtD~td zj&wm?z1>Ln(w-ZKtSsTAX0pG}-q*vf`8ddqv76axb_ZwiduM;a=iS`9UrN4|erf#B z`Jvl=6F(`FB?W$YmvTw+ysXXojON}u{}$eIDHfVAgd-Bs2r0n_Jp0(o?V=P`;S^5^ zmS~+{HFZ&|Z=M$DbNbaD9_0fb&fyx#nK?7lG(9u=@|JgXtWHcv95iy^K?xJ0dQ}H% zXq7S)S5o~tpbMBsl~oi{Lnnu9mg&YYrtwW?TGN@q+O2zE-SRHmlI`+&p6|sj@p?D- z@Mr&qLK3RbhAxZ&g*)0};IEsj_Kb_|#qj;F-~C2k)OUPeETsq9L3BAk^sfA4(ES@=Ke>C!(dDopfQFQdPuk?* zV2-yiAp3KlN_=)ka6a$$yK?f=v%<^6`3(Kpx&8f<5TD5o5eR(hDz~rp{%W&sa_(l! zZc}o*8Fx5#w~6-|_pk+zTmQHPPa5}}+~@3h-r^VJzhugr^50VYjxFz6^qvbJA?IVo zpE&+G=6zw$m-c*Z(vK$o?`iPm9Y7HT$oet0*P-p}Bhr}1GyvS{LJ0)_@oG&JhIYj& z_!Do-w_(*JJ0zO>c7j)FvC z#+g6I=Gu!#1R98S#W`CI>g1k)x3V)*0lRgi+Uh(A!tL(M1eJ2Us^Se>9;~cr+IN52gET&#)&ByXfUnxpu0N z%sh0$@q2{$rm3fjC>iBP3TA5c>a2#gBdzX{05tqQ%_+kJTR&C3QcbexqgyG-m1sU0 z%0})9RzxpWj6o&z!6|tf&&gPu%8P+O3Odgb!p6`#Gw{k8@K|1ZX|nvRJi74D6vRs9 zPQp+@|DS3nsKU@}Iz%tV8$THT*qG|hCJ4{8(riw+rk`JO8Xa;_c!bCNW#EtgQl{Lm z-5n)2t@hq=u)uxrJYjfI@gh8z>A_)?@KE;;7HDPwIPdLpk_zKb| z4nHY1G_=snk=cISF;ls{uuOk3MyRcp`k{JqvHPs&b|S2QVRZm+c=I_#0T70I?-q_N zd)HP4NU8r3JdztoB$6ieQ};iR4f%9|CPx4?kqe2e)JQMaVp>t-|Hdz?(rm; z|B>(oUt&o0a9O}^jNnqld%z}sehYcin~};@e?*9*GpcY!k>)$G{^2&zS~q=U$%TL% zkqY*#IqFpF@o2-ajb~D~_D2}DpUx&&bGA;?&oi#MIEww3hs+W1vH$@3l$W;2KuWF5 zj@$pC_z$1N86aGuF*bHAS~(NTSZiyPDW=QydvZNf=bCGc-KPmrB^9Y|)W>9USH3q} zLg=EbMH{!>eeOMJbS9E!K{Y&sEAAt`0Nn5%1+?)$*)r-WtDSDFuuYv z?cWbSW{K-rhkhlq;<5rc^Yss1vzC=CE{IS?q0*#+jA_nmBew1zH{g8I>$92|KsPAA z1~EpD4OpxrXUV1;k(63*k6G1Bb>!$AQETIrH&5Nl2AOI#UQso*Do2Z7HdtdoYF)3n zWm2EN{MOx4TW9Y6| zb+xtk^$WVF)4J)T{!bxV8hrW!L@T0t?U;sZQ2(h7^*#Wd>JBQA2p^Ie0Dtx~;7=d= z(<`5j0EPAc^eE47D($yk1bklp*69H3`o=r1ppT&J#kp1$60`bR<1`2`SC8fxN!E>pBq{!m;FP!OrGL$)#@o#1x3rb5ZGE}%K%`s~F9?hgroi3Jh>QgAhBCTE zN}+dd0<$d)o-$*uArgBc|1(yUK%z@u00}id<~}9&3i7GFPgPV{Ob_#p)$Jm}=Q}K4 zHxQ@({&H{>cD#X^okOS@5Qi%NDX*ih#@cA7J+~B@1{-38Y~zNUU-69;H8mx6+U0;F z&N=V8Tb_F9jgR)EgOMVGO4Ohs3Q>$|5YcXI4aGH-OCGh>Q(L{gs%omO)}x$;tC>z; zG}!g*r(Rx_{WslW^(;5bp6$63P#{+BQb7^@I;aq zs(G!3w`zH>rgv)lpq|f;`|6l4I(*mfpFV$`41lL}7&>(XIwlOAI||(bL)S#1OCpdS zR9cc!gBTQC|K#*a%D_(Qm#hKF8-5cHe-t(ae z66UE>{G1%rk||4q8y#z$WaH=e%O*+nTI!;QYVE8>!7Z)P*S7e^R@?0Gz5NczoyDU& z(h60Wizc1%vrRTT>q{q2|J|mXmglHrezMbcIes+DFJ?Puj$h4nULPCu^_6)pm@nS~ zzgg&_OuzfoC5v3P*cD4%v&|M9NPPN~NUamB~!n<1LtRNP+9kH~Nqb1+%oLej^cY&$A%RK{OcK zGDSz^+H*P2j=10iMOEEOzT-X?*BBsqW?EO!P=pA`JFL$gh{1`mNMoEcEzStSYzyLe ze;2dOc$HLJ8OH7c?oQ|wIc7i*K$M|kPYCa*bU>hqi&c?TQlls(`0R9^T`JbF4&<8h zWV2Dd+W|D<6BA_AWdw|f{7@;(ZM0sAbt-m3pX^>6i>=WA+#z>~CeaXPtfG>09C8;+ zs>#8{f(}o#Ze=NaD9i|H1(3f{Z3eV#*JuPJe_Dl#lcnx@jit#q=7(FSF`FIw@^O`y zbk=Esq&s@w?XZQ`*Ej9?M2BSS=R6zEF0g|wS*ruG6#Y%!pu?7cj?>&EJSaC?xz({z zYdx>mA8tV)YH(c=v-2L-JDmp*M$B|rO$Z%c+{=m6b?%)u(M=js7%|ipx@+YcIi_P_ zkxy8&?LSioEbpJDH|FL}{5ovPXSr=AY_~`U8Moe2O(k<{hhh}*8^Kz8w8t}yvdyeZ zCJVr?=#uCD&UzIA`y@;`lzM^P`prz+s2l@NqP5Moi;y?BvL?1rU^R&QLe6 zPB9WZuVoO&k8WZ*RC1d)M1N#J#JtKuyQME$sJK!Nh!ATYM4X+eGK(+~lHe6^I_sH>mG9O1Sr5#v<|E!+!$gszc)=pR^MP;$kQK0WFpgj=vRoS3e0OE zIT^jQXK$;39TM5vFl3teC7=0NHL~{4b*!d)ejH2rzV{o=c}h;1z$tHPP;mPoPWDn{Pl$iLFF)>Hm?%6r2aGq42FEyPY z`-kw9R#Crrq<1HrlY2buCaxRpDcqidPVD!@q)R3?S<8rIRGLY$+qqoB;)2GLda4%} zADkj)f@8uF(4>p{o_ua78z#=K@$5=aA-k^$hm^;GlQE?UOUnBfjGGEItSJx#GMGtH z)b)e<;!q4m#h_nPhRiz*9%`ADvRmtq&4TH^8MHNGxc44=vlGrPj;*vSns05^2CTP; zUy(7~H05Z$Q=b4YK+wO}Au^zp>o&fd2`JhKTPHrPV$AS{#}KR%wj=6LE6q=YnJ!*# zCxcFW3MeA?suvM#RQmbgx#a(DE`$SE!bg-!7{R8davc{s>4fCw#jbhY9Lp!&xtzIR zPW>30=$uJxAUaF>Sxkz%s52C!XcncYErzYKBpBKQzRE5QQ+#FQK(R$uVTw#%d?g9* zfpf|{wFd-A1BkIeH&~}B=nb?n&H`)Am|Uh0YX=Ep@F^>0MlS6jKSGMLOwWMYYMXk7 zlO%{0ysaj0UTGSUtfg{ZtqV(-_x77s-8Shuy?nP@NiF9(&HVI|{e|+++GDiapF1Qe zaUpRm$@oj^UAOm7cGiL1?#RW*MwtZZ%(1A2?4ot~tYsE1jk_nNhE&{74dYCor0Jn& zmRPiO+(=7?K4uLXsLCSV(WYcGX*}45rW89OJlh*In=!P>gLq8l5fm8fiDgy$vIk5T zuyxU+J~B3Q3zQI;J(&_@@q)7RK-myXG*z?n>6_CyEed@IUG_wF?(`PVdQmmQpem!b z=JWmg*^y(OeO^guq&bOFeM;QF0xFD%^WAAd$Luigjuj8V{XionvNIo?5S%26*QmTnw8^J(UfND7 zF%FKmY*daKEyuQ9WjGv88!malT)>vDL=>y!UxXZwE;13npic7o6w9f~lb?kQZv^WY zMZ?=M)bc{-7sD-)cNiSmge0O~6;o0txo0}95wg@NiQ0VPMSL3taj1+|W<7?fbI}#y zvZJ1LvpLa#*mc&lnYR!+1U_AS0SyHbP`|k~!lcPM(2hkG=|q{w0k`cunIFx7up0o1 zRe4Pqs>wH#NY*1oOeoOrBu?biK^%4Zc_I!#j89u&LygLMu){kMiIU))AKl|5YWlNT zCCMU9c}&6j);NM7UfB8Sa?ik~r-rH430^I`tJTHlz1X}eYk%)arqLVTnbs`(Y>E@i zb}Aag*J`rE66#DlnWHM_rb|;3vFYTDMHI9bj#$Oq_-|yu5tMmj=Jx2}54`NN%D}hi zY4>_O!o6)7FJmv4a`GOG9VkL!Hxd&0HaROI5s+bsN%LI2k+6zgni7#D&(%!W7$bNb z=D-QVgDH<|p(yeuiBb6BL%ilaWk&DMd~uc99_pgRS=2D8YGMOb>AX9{hDnNr^`@~! zskk7wT0ZZIw7OtYaRAj8i{_R7-8{&AKD|K?UmF~$I1$?3&=72DCQ*s1kR6qHjgP9C>giK(3noP7gx`g$#1#Gz4@w`gQLi?3S_9v#7|r*$nK^31+%!tp!L_rf$PhKGLF!LZu=hs;doQq;B9EG{0P z3SLS&hRzL1 z@0f63c&Hv#Wzr}Tf}YGENos8*@P5#>6{L>y-5AOOKk}#yJedY-oAvIe{ji+#iiP*U z<2q1u)6I{HELsw*)sdiw9NC`UZPWO$Kv)oyBV?Q-UO%w&pn77YgYqFs`zm)Li9gbc zoO9Z`zRH{C2*Z=o3Mg)>ovy8j6E(Z4l^|UYKmmX1_Hxv%m+QFrW<|fJ8@4fILI*Hg z7d`1TN*}X6k1X|L#&s-HImCmE@uB63=Ht|C$NZ1($Fg`=Ta8hXQRT)`{V_)>;21sxHy1-3d z6YZ&VJX&^ipO@z}Fbe`;5xU9LjTd!P5p-s}PdzRs7L2c6t)>}62yHu!PYMjSOy|ZJ zWFc~`u76xsn6TD%&rDsh285mg!;UcYIJpU%f;&6NJfQU~-b=wcf#qQ#xo1H8t4#pi z?^*NB`eH}hop=X9!>c-CU=@JD~hh zb5-7Pubh&>-Qh!cCgZnPS`uAp-MkRYQ&WwQkc<99tD4TF`woc$h z{QA{?p0UQ=hbwK}7?ObZc-n6lvvzk^PDdVnzwKO=muBfr#|x}^?X?De?l$XhF$`pH zcER(2+>V*^B=_1Z7}AOM4nC35DYpI-4{@*RlN*!TrA7s>Sfe3m3PbUTn)%BxrsEjB zvIkJZt#*1UP_!FbE?ys0wCd*lG5gto(Q`fJZtcdsb;M(Z?uPeb3{GL4zUD%`D+;1I zaS(B7b&0!L+5Zu%hA*=Bau$Dzm__{W290$Edf8O$=maSi1_*k+9m!?l3h!BFEH1Ow zz^0{zWhoRh#cDVnIQ?J*n7to%$Dp>!YPx4OT3yd(&Bs0 zq4>)sN08W?*vpR$Bwz1NiAF(X+0K(^z(LaBDZJy3sGT6keL_9sV)v@XJHS`%khWmw zfoJ6mKMT$FQ=6aFVD=Ft!$mu~*QH$k@PkP~b{Xkq!bBTmuG8%w^M}csb+=5dy8Mkf zu$;g=IAkr62}$LD^2UY}Bd!MgWajiW_@+_pWa$e)oo@>ENpzCqrS-kcoDe*hYeS%I zcDlURqR5WP7mfocD(RHnI@$k6lSg?s24|bmP-^J)TjAoKUq8G$u=S?}R+ofEZT>*8 zPZHvEnYc7dE?4BYvsPG%g@%cL;He~VruX?)T5R7Taer5ijsQ94-cTgrK!iuB!@Cdh zY&xr9%!-aPha^iz9f-3`A9!R-vRm+iUV zFDE{n>~jMwb)*bxNrKP>m31re&SxND=REPB4rU3Ch4g`(lk*xY>U+PMx&1a}SiHg6 z3J=_8p;!*@Yf$-vVJ-`_xkaJ(fzJF6XXDtm?jhP6$#isOc<;T^45S6%$TR~6?Ppt8n92>7V=-$-V0Zn{#R4>1MEq#hm&3ukh>JiR)3OmZouGmNX&-=LnV;Ih`8YdbS z{9#IYd`CYI`yYRPy2;8!%eGbDZ1Lm9t!}sAxApgGPrRB>jY`IUqx+P%noQ)u|NX&h zhwBoXs*E`*r1F{AYF5i)De|pHF!Wm5M9r$(>%(wkVl~_DNV`U*UL^M|WAZLKqIa^e zYU}=889ifAHdIZuv?ii>flUQc9^G2aA;-!8~o+L{0G`fG>QtKUw5Ye!B)9TeuyX-jRvXPl zTo@Ub9cOWBJWm`;YAO;rOLm5v+)rYT4!^-Eo7HmHQFlf#EWE9&+v_4D8+rUy^?H&0 zrjpfGaP~+TxxnLFQ0$NB@T-)dqn284)a>o%kGE6 zS)~QvjvM#{%O@SLmOr~E4tY-VlY2n<-OJHG-}=hMyPRivj}1V&n5`mYRSd7$quIZ2NixeltLANW8ak+2M)rkiGq$b z`xrZRh-`Vz)-Co8`uO%-A*p`7;jZ2;)TEU{-nZt)kzpae1 z54l3ScGr`iceRKdJrA%I0J6vuCD}Q$1`|QV@ zU#)T$tU3$q0NA~|f=?KK`4i5+jhauMABuv4;X}7b+X<~ldx~(_@o6>3dnF(>EdbHU z%lC~$ngvX=ogt+}S{t#Zk){QQyevCLqf}yg`y^R_dDSu{A$LCqeDdOt2J!6!1Ne?d zL-DbP#|nGGlsS&3K**Fbsg{Mqs?ii;YDhND@`Nd~oQ{E|Mi8C+y=3qHJukd8v1P4y z)yT-I2Uc6&3G=Tp?~<)2qV~~Ky$%2qPtI^E+5&R5F|E}N1*-%4#c6|qW2?MR5S~#0 z6Y-vUB=Kn2wWBX6c#w=Q5L?xqJYP_}GAOB&_^sygJ(fLVp0PbK(3aQoa2(yy(c#$n zNMnm{fzH%63kp$YnL_@Ey9F2A?{W*5B^|gSq7=uoKljL|jg+nLyoaDM4)A-z;<5O) zr5{SzcBWg=osTxB7O!1a&>Er)^DHiw&Xbf=W2^G{#onL+D z)sUazU$x;`qbxwngOhq?53mI&;JP&cnQRUIFWX`FnZXtVaDhAe#;!ssYhBw7cckUt zn!$oSkC5zIG?)I84y|p(r}TkNVdzsV!T0p~Czl1ATZk>)JkgDRODF@^7ffu(u=ktiqUXbv8>gE+BL5QEsts%=*dez+ThsH z)r~%ED3&IMwCUt#56MPPqBxdDC1YMvx-4Y_(aC$+ z^1h@=ljxD+y9-)(69j@lL`&NZg2%}zHx`0nAMKtZ`-aGUsgyPJ*SLA!Tb)VmSbV!K z^+>{@bGen4XW!YHFmHv#f$n(^&M!EWiitX!vqVchxMVDa1wDzeg44gvQ!WslobBk4 zsvBVu4>fb$K?v1Qp!}}`l2e*C{g;*fA3)b2o!$kb6TmLdvsh>8q*z0g7NMP>t0d+U zh*opduSpiT3mU~7t4ym5w@K_+j~Ys58$*;Z2e#8?uuCtkIg2Zz)L>z&mWNCAhH#Gv z;I1@v^hE2TS?9iayr#Vc(ItB2&Q;_p)Nj>84Q4#$0vAU9Q@o=kr48aeju3V zS!6H{y1(+fEWRNC#XpkW6Y7uw90$Gl>GV_@&n9rBMGU9mkKu_6IbNEbN%Xc6AhFoY zZzAlk*jLeVGQN}~yji27z^~eyTT|~jdiVbb1er?FOgGk;);`L=IJskf1Fu0RBHv{weBdbeK%I z%b)jFEux1Eiu3OTv*w`v(QvAxKlvN=%e+EVG&hGfDPpZ_^5c~>y9{M9Ej-4as?dWq zbQ?GDk%Zf-NGheIV}nIz#e*TbTzkZ^%zLHIwDD#huvYIGP1;9P}I z)IJS&PLc;AZ@t2jL=?k5pJF(Ppg7`ci$qEG0?JaHk2? z#W))GngC^mT`9M_Tcc5Tt6gr_tPN1sX#6oD5EV7IAhKbfPd40wm}LQ8@Gd#&6vV?J z5d#+*g*8E~z9wK42rZu0XvEV7{u3J&cZ@dnFVk)t@y4_B?Xj85oy2h6=JefGk9D|gYCYxvE37n# z%|@bF)saf=#wqj^3W~R=B6OYkr2ysspXzK*mDnfch^9 z*R++dul*8IVwwGp9OV4S%Sa7Rgs zK38t3VCyg$Bdqk1I`Mp%%FuXh2P~ z0OryH5L6dHxQDf({%c8srE(=)LdO%&el8Wx9Qg6kU+xaCe)lygTs7QUhAxOF)`EZL zfM5nW-Gp$V}R;8Ye24LUqu(9|+NuN!tV%%!x`oM+)q?)g}I%tz{7 za+}IvC9GPKN-UquGlneSr%uV}Q*X6$lugi5ES%v3BL~8rx%5D^G}{;cuRS|J=Yzcc z8HqJhtEO5Sr@uElvF?Ze{Qy$qsIGi-qNd{g?C7%x)~9O!NG?stfGLR$n9(g4N&p3s zzTD}AhcK@Kn2g^iZ*flR8A}YhtLE)*>bauMghMpqK!qa-r&HtM2T+pgoIZ45Tb8w= z0#}?a3ybT^f~OQRL|zq?Nh-sL0^lY|7T9>d{w|l_uj($W&8R59Vf9U4fhi3(y9F7U zy=G>Pw)#RYs;H?-bpNhqmePwn^TvnfQN7@s`ZNb8Id4fE z$)4!2-9yU<(#hq0L%Y1Y6E*}PL_56OmrwqZRt^5_5Ziyf?{%c6|9IaI{|{iTAlH-5 ziYChzkDp~TMzav-os4_hL!h1fxgB?-Cx%{HBggOxpI2R=Kfg$sWW2>mkDx-RAML{-sOfCGzpUehR0X&|<8fR)y%g=B-mOD^*lxT>s%bLY z{^j>q4&W{R<+` z3nzWc^xlPe-ssOdBFItM+lq2INIcQ({=Qft8O?Kh2RCUYRv9S+ggkOgKjxnlM+?dR zm=8_klfjf;Rz1hm5~ou|Uhl#&Jz4a(ZeP%EhBjNDF_8qhLF9krsP~1mH?lQ<0h7ap zszY|Rl6*(su(mbC=M(C$+&!H#{rQUcZjLPvQ>efz{G;w72Nz>iVi19NlL z?uVK$y}@_pesJvO3O;V8wo|;%ccchu)%ZFY* z9#blyuncjOsvDy1envjfdckf3?>s-h#tQQchMm#D8*F zd4fn?&_`eHX{s9~JWyF>^lG^esD-}YtKK^}-<<(x%zD^W&9}Dc)jf8Xp|4kK#f3I5 z%Ow#r9A*w*?BH-5AVb|{=K?JC_oxqMlDageOjj6Do6|&Sn|-@*aV=w5xE*~^a-gnu zpX5P+r4FFBv9o}n+R-Z?KR0#4aRF#fq5A06Q-HHJC>2%<8inZumHhYv4f;$g3R?v) z{z6WAGf*Qc89z+U0^!*ieO=TEDoH(Y7SzLrW*nZ;gIK8VTRadIH8wJ2*6P4?x|y%i zn7MSGQA9KnjbFDaRsUZqSf>qVj<(y$XghA^+O%h9S#sT&(zd`02rBu%6YH9($&ZgI)@Ruab`8K%7i>N7{DA=~Ir#9x zwnr8Y=AX*Vm|uJpwMU1_)<=!r`WXDj?m)joJ3a=6V)wAl(q*+-Iyvq3h;^MdtEJ23 z^|$!!_Soz9A;sKjQC}2X8hi0;$k@z=@MZ|+n;B)C6(sCUTkCgOa(Yte^n zR=z-J71$mEAw_jdK=<6)DfAiYo;oCbyQkcl=qA*YNn0)jew>lvR%#@C%5JWx;2Jv- zhK7ez(7AtXRzP8Hcu6Wh96s^1SB|F0GJ5c~w5P(yB1>8$Xz{E!ovSodmA4$>F_eYA zI#*d8hH(Yam4ordVqr0Sfu+yy+aYdZz!Sz-HaBEN>G{kp---p z1`-HUKNcEkv|ThKt#DMM5xaNi;i9qmhj+S?T7PZq-_Iuro#uZ0+b2f9podUk|7JR= zU)Q@1n)xE}?Ubu{A7gBk3sv#b_jdw456@j;2b z`O%PTOSgW~pvJp#1v#6ncH4#bVFB6F6olGS5bFW##LpU=OM*;=ckk72z4FcrOUq@b zkkhfIQhZ}?{3QylL#bcRd-t_(fzxfp;byYAmR?(hesYn#`0f;Hi~?4kYd~g*>7{JK zBl{GDtQ;D`SExO00uwJ#jB?g0Ove*C0=}_CP%W5*Pt*`NQSGRCmcxG5Q7f%QixAGR z%<`;T&{PU+^86zq)As&;(~gm_KM;AK0eQQo`@PZTCss#!%Sc$SBcAo>YWd#|L96%^ zsFr!mz%fk%twXSAu&Yfm^Q~8D^sDED4!C)#akfx@SOJp?g_ z>YtfRVD-ePD|w*fKtC zL;luIf+n@JY1Ex|%+TAbwR$bVATFj`5e8r6U~sKsF~ecyfO>z;ue}49%hTj_EST({ zlzqDh;O999g>Zw}6=`wI%Rh*sVWl#Vl$gyai6Wqc?ar_Bo%6yiE;HP)Q0VmHQ6r-F zprN1_)gw_O7KN=!mDH>;Ar_5PWmN)&ykNIK9|~u^eyu(fdju3*D2CHEv$;*D?Ljd^ zZ@1PK>UGQh*AgmQZ|H8-87yKuonw`X8BQx#A~tjA4zYw`Lztj2(@J*4Vr07&sQv8t zI?S3<(bCU03oLx=VkqvLZ{?eLr8?0+&Uj@qsa)xDDpx38SWedpL|#FRawShclt5}B zyh63<&AU}zvyD+mbV03rT&yu zRS1XWYWX?+#1-lPyHs6|Jep_V{ViHfCge05lp2S=xa*yq=FRFK%MR;arIpv^R?}D3 zRWbq>jh1?KAAZYKnrZM@A+rlsSN*hwev4Uo+&}utCauz>t!&W+@rY4H-;qSqN^LfX~c zx(#(QRBcw#pQ)%=PiL&EsCbBepyF)V{L>W`r{|ZQt=?d-Zp|^aRsXc^#ZUN7g+(A0 zV`FA9R8tK7PSxH%be<@XoGB`RN`Q}D-@zjYUWZ=KYbS7_=%tS15D@9WiN8~4{|CZE zg1X8UlUAwS^vVyug-Yfv`nsR0)h^f!d91%MH_~ZCtl}D|ICCR-;!LA@>!^vg+3|R= zLqGZF3|YX-igNlDQk)m5|dFGV1Y+Hg}?OTSSjtx*tq&}J3>zjWe?{+wJb55Mww z_oJZ7Ol7GzUJNiQ>sHdMbL+}!uj?(V!g(pG&s#*!pw*dy2U^L$!z(l z>Rc3w#o3vAfHR~k?US_Q2h^FoCPiE2pc%YuWPeV#&>W+rejAc**U&bJH-u z>(eeE*eKj6t2Plf7hD;;XTYoOku&uR8 zLwd!}mGve>hhmOwYluRD49O0a9ZETtKY2m3%Ovy z={2|`%b5NHQez{hu55Ev_2#lVW~!@70sVm(PA)Po%8JEMJKQcthzOypK5TK zQkNxB=P7VD?vO2GH6P`g4`kMSL|*B7T?m+6)PX1wE%2P*@hJ$&U}^Hoz`EA0O2#i2-NvqAAdR@NAHGQ4 zpVvJyTr0)rR}0;|+s}S%J#C`W>&W8HfsT9Etsz0h~`g_9%00 zX&6Qu0E~4vkJMfNQ~CR$uQO~QzD{|OzY5u8@?%*Cv`)KqHb4665R-WIQQ|KUK65l& zub;VSX4@s_UXiv)KW*`hmrI+UW@*7M>F+a#?x*XUC7&ie^kv}b(NOCCi7>gr4d9OS z+UL>k73n=w3;UjU>P^6PoKt&fd;sdL`~yUgGBZk<86>m~%-_nBd;xj?fJBYue{)3d zX2U1~13$3G%KqVq-_3#@2m(q!Mz5kEI{8!B!(^PxM(lJECEOauqRTpacX@YP2%SQS z>1?~nr<}!;(m1v=V*Y1`r9KKL*HuSNM5h!DmJ;=uO{G z`5U_Ig@xM>6cs5VB8_*U`E>%3$)fYRWuewP`7qshtK;LnIVsL6of$P?Up0;T`{9kh6=`? z%8J_azM)vD^M{J1s*YHLd2AJ&@I0VsO4UCcXfWNs9Er(W3toHsQOV&-C%dk-n#2FH z$|a2${*xuvrqzSlzoApH6^r#G}Zw|!TQwzCNZZ)s<2+K3b%?($0xDjrX`@vfHVt~ z1nj4bnw3U@xM_Zsk&opeb3DudgLm(V;R$7-)D)rXv|*;gk@QhUtYTHwh4%`oU|YV6 z8sa+mto4sQJ}ltM;3&OHA#AU!DMqP`vX5SyKmSvU9LO);4&iiVco(>wG$*b}@o4XhQmAPe(F+|BT`Uo`~a`4AIZvI#Zh4q2R zY;%N?Ych4V>E6DHuFJ8ndmX+Z-f9q9&diPC@>*NvF7T_G{;*fJ`m_&u>>;D3|#~W}GnZpPYO6Rbkx! zbjA6Kw+DdI)2B@sX6BdlqfL`}NR?6^j7znSxJZh3H)p+X(&aIhou(K4KJgm5BgE@G z_jCXR9>FHD-p6sUdhI8Xk{@UO#AXVouyP&1y!X5P_L}bQRHn+&qf=nEL7H@6MH_K& z`m@;QDW&~ly#L~f^Nh;ITuZ(6O>>P?MLzs$4hqRbpAmt76>=VN)D85}Nwl}8k5FJt$RMd zbVohe2aKKH8%DR?1kC$}YT66zX*@oQ0=~!VU~B=VkkMByj4RY9^^WI48bpi<`IuP5 z#+^dBx>3rrYFqVU2gfBjd=72E<*L~t>7LCwEcT4eo1M~mu~|OA9~WfVMP)yVjNWY6 z0V8xa1?B&6Aa53IgFyjyeW>@^5H{QO*6$(^F+QgklVhE8usQF}0rKP?3(y+?Ni@;idq5jECT5s(Xmp2ipEZ9@t$lt!K#syrQ7xRZp7;Mi_NM9UQbiS5mOB24Q}OnH-e; zz50g)(0K45^S#ZI=2h6L_Kny>7|Ht8a;B6HFE0{ z3Uy4QiIjwV5{W3!c*wOcm^yf{tMfmg>yi;1`?I#jJTZ_rcw}y8{>_6gzW7w-0C6rb*2Y#A;1lpG zjvkS^aquQzM84bfzBx4KAqOzZZxm5>H^_zq);@L>I^*b2lTTp!s_4dzb3nPi+TeJy z7PTzWG`}bXy7#d1zEn0_0rc&n#DnrwLb;M~D_3b=BniY^~_`8 z`we8?KlyQ+T%fh{hVp)!Cs?w!=ocv9wj_cHe~gm`z)F|DXH2dSViYPAPgdL|rFW$n zS`q881#O-?0Jy&r6wB?LV8Z2_oU0x<$22j~XEsrXsOKDH-pQ|=HCvNMZOyMQL0QGZ z*|)>9^3}9@mL6#J+Gg1RH|){2s^yKeFyNkhP+H{YCD=SIdS-Lo%I``_|DT_~U-VAI zSdnp?$uZuWL( z&^c>+iei=?I$?bvh+Kidj*;M>|5i8Eo4={fq8F4m6=21tYS^%;$|BYeLE zaWls9dWeOJeJnyat1A*Qtw&#OjMx7GIODnviC;@N4Ni^*l0|1uYZ$Mi>Uw8XX@dt! zvs3K|2mJo!ht}eTilJSb!saaKrBa@1q^a(j7By~ zaDipLS%878hLO&wEyl3~Cs`-OiEwCVSZ5)GfELK%k0}@yFyD+Jx`cAYmX2eq*TqnV4n0paWxLUN8sz|3|9&f)RIkw)?= z+t(kRLns=neW=OAs$mG(C}}p(%Z$T*og#pbnS$(LE;a(q9HEl+x<#n&Za2roVf1F4`ME+Ue$HE!9M176Dre9cG*>-n=(LXd@ zV*CyO&#v;!YyB3jc$SD!oJffZ`FDqx>2P@6YpQvPGV^90w7IPMM5`2kZH)Q$+yUF4 zLG)8+xZI3SPjs);z-HSD<5O0D%o%<_)*pvI;;cH`$G)2aVo5?wui$)+wHsJI0kq#s zt%Z$HA`Rw5cK|5NyA-4|-(mwwbPtDEo+*(Z-s;R2LL#x;3x)YD3RA}!z!LrQA@Yle z&=;#7?wv3bV?oZEUg}poGniFNgSj1cJz#efH?ZLhEPKWRym4yy21F^rzHapB$($9s z^oTN181JXrGB^tDME9(QAga&8_V$ajbSnl|byv0XF?tLqy2q=_B6LL5saVsKyn9eG z1{gmv$nQ0=v~YH?)DgXaME7EK*$Vx7L|L$=mwDidvBbQIW&SvG^=Yi_uBvucaWyd? zWlwDX3`updKbvznh9eK`FS!Z6A*}TD)#Q-$NgU_7588jGzPN&qtqAsZL=`(CQ#fv= zKlF@3D)tvjYRB$rj%b*864&lH>~0xMJTAB7vKNhkbL9@_)NJ+SRc;p%nQWO8F23ph zMkJ_L9*1F|8-QLtD0utNek9X`**#PnyW}xl@=Ap83e@RuKxoMuvo_3>bi+o<-@SND zN3T^jqInwJQTUQxQFf!KBUEhiM4t^FZo(Vx9+_CFQ|_3!F{N_<&eh!U>HQ`jk=$`c zcTJRhGWCm?ZOl;pt+Kx3-b^cA(?1tCr5+YKl=vn5=x-o`@5%!X-z|B211lZ7Dnr)R z7IPS;tiM(LEaA+ZVf9uVoRUF9rO)1qxS>;~r}}8&m}(1iol9ZAIVNxJXmjqagDSg} z1cu9fMqk7#VDzJF_&c6BL%*@6Q(k9P=;Q5>x%br{FuSR9LEaV(C- zu{iFPV?jXiPszXCg@_~)xVy-;>-d~-#Y48an{Z8%pI50FBCN@`zp`z0TM zP5}El{S8I`{Cdfa+@b!~`S52~NE+@zp&h4RH&NeJsePL@Bh~KOxrw5QyGI5#pX0zr z_P~a(=kDJ2IY8P&%)aI_{YIGTEtEaAdjoR7l$#e@mt5p(NY&Uo441i%>$$-j!A;!4 zy|{hCQEVdiZSG$G`F(VX|I6cl|N4L2|0?=h;TwPa{%e1`;lZYFuKj#{fL40+_A}z- zTF;$(udk&)zdCvo76vL_vGQ|CFFtHe{Z7CdTZ`*|ta;F1&X@n8+~)!g0`~@RQH_0n z31}1a!=sjsNtr34MtJ#B1T!RSDv!z^dTs6M6oLuoo7kB#zU2m4@Sb8SYtGIsbJaxA^~;&94j25J8*LKsct>tc=auI;%14j;7BcPQxl1k-?bYa zD|&wZ!?kj3l{LDtUBg-)o9Z3=0#1>_EC1URviVj*ZcA3XP;<4SaecKILo+snqULPR zx4HDF+b5OoG_h+)2E|%}Z3)v*X~Js`p?DR9XyOoZU9apkhNqey*O$Z?n&oDpg^KMn zr!avzds`CIjlTNzHL-^-Lyn&6y@m3_-TXjw)m-5`me5(?OyCbecH90szo-OTVqvc zKZTo4<>_QFKkxMlJZd&_E?UcRoWf=2<2#H*Xy%9AE4ScIe(W);)cfllRmVy<3G|lT z;PrYd$y>NRRY|H95@=t;i3_k$sT{6ZZ|AB>7}mZgGS2Mwln8Fd-<>-qE+I6RyrUQA z1lfdka(+A4H77m4W<7Uq7se9uW z6zIBCEl4l~jL6%n*FO|1QO3RO(&MUHH&0oLoxB+K8c4?99pfk@gtIBP>BW&In}9mg z4g6}mnqKEexDL_bmU&`h5qvM^ya)#harCWi@z2S$EYYfJoxC@{?SoX z<^3=%(=$rm>q9vA{cHHAAp3ZjN{;#QikR}oCszeh1Fwz6MbLu84R*IM! zZnb1hG|xgH2-x`W|L$*n{Qpz!5GYPvt)&=byqT8UXpfJzOZJIH*4ZJ~-x0)Em0H#| zTt0=DSXR$^RnHX0YFT@>#`SJ^b6dTg1jm*}oEwn%1~CmtZedSi-$A)fc{k;|-fz5r zd2b+hkv(J-MlYxE0&nsScH=;f<_6xDPRQa(Ajic)+$2bbbe34suj^M$El8I9RZFxi zE42pe_S5e9jITS^@lNx6ukts}ao#;2Mkl4n#zK61_(XUlMpm@Oc$ksl&;rs}#%Z{~ z8?i`50eJ8+N~JQ{%+<6@eEMZ%QZqZ3b5z49m9N>_tQ+N4K^0ReRZ!K{TJK9Jw+5|Q zx#inz`=eIhIvdfX=Cwg5xWT2lI`^OaDgMtL0Uk(_?F*j}Ut0Fn9)S{;wk~u;h!Yd5 z;wM@_M^Pvlwb3(DkSDz+{jd}w#Y+|GUJ@lJ5t1aiQeQ54vM0~T-z*d4V3{F5$dZg@ zQ-1IX1X%nyiXi|Xz#N^@M23>WD#sKE=yQ(YX_BGNhX{$Xr(|_xGc=JPpg`@x^f7~J z$T{4@J4=$oWGuvbyn%Nx5Th_zIeM;6ebX}tHP&fRxDQhs4P*slEy#hzue;lc8yW>2cE^W;1ixyv2OOQe}D2a@g|CGBwvs#1IDC%uemmJ}lqf z*{}Tt_w5Q@pW8lw{aKItx!?N_U+C+6r{6!CgbiWqBov{sCW;~yXK@*CqU!JX7!v34 zKu3%Ogal37OxqeZ4=#?WaLrV!7{+8`26SqvE?YY#YD%}uwOgsbwoA8$t?FG?+<14) zlka)j^PacC`v>Vneo1co)IQu7^L6{~_pSHs^=J9j{&xRr|IdMQfmefh!TW-5hGvE= zp{=1WLkpp;aDJEwr^0K)JHsD^7bD;ZJ0gn=Mb<{1kIsuC(L{7Kx-~l4pxKaU_%8M^ zwkdWn_Bjs3tK!CZJiaWxH-5NLtI^fi)A&N;$)>|iwM|e{W79~}uBH#0W}0>q1qo5Y zkw_)R63-_NB|av$oBwG3h13zJta7!O!uWn(`(Zk(p%H7q~A(UrH9j>)641Kt+QH- zTScwf)|mT*5jbRAfD#MM#J=Z?cNY+uAq%i~5%zzZjbDHMPCd`53*WywbEcES(W|9wUMoz@}0EZ3Xv{0pXdQ}sPRHy0_A8WKt>@EgGwF{wx<3rdv9;N zg8HG?E-1^n&YC*o80&TdLWkLYSgh)GbQ`Y^7sh%i3}S7DWwB=AY$)|;M4Jghn-Rd? zgRlq}a1u_|SR8rvfKCPH7K2|_jEy%4VveO02`UtoPK`HeEK^n?Nh9A%Ji=Af8d@*> z%ncGHv5x4bFfCFDM6|;?chANa=YG1s(a3d1Tksoo3iFp*I<5;}Eml{~D+;ME7R@AZ zV-xti<)S=#u5v4tDgJJ62cJ9S&VcIJBOS7b?P6<8UoOiZObaMN`nUCV&p zlbun7Sn$#G%V|h|zLNYFA{V5A^v<;gH-C|mu}?)AK|j-jvk(y;79YqYb|qEc6#Jx* zaGeb~jQS!~>ybpCwWU)_z$T(|4NxjB2{GnJ2I4eL*jlVM(CoFfTL#K?>-Ez1LY{+} zd|bBe&90fh=LVhS?`+qyBPs{m!W$dvadSS~HZ2L-6%y31OL#gmn>*q>mVx@-sq@Mn zY-?xu4oCB;G8gS4YL%l_# zx@xTAz&f7bR5vML?3oLT-;U>qDs^m^qMKz|Xod?tFWu3d3s4a^vt6Hjn1=h9&-%WO z;?|IcLZ(n?g)7&I&cP}F4m;`xoz-$cq+2DG2JGX9LaiPEUENLLV zh!txdvoqe8Qm#NCB7PS=+51y7fcq=>ZY8!WVE)3b6`+AuJ&}fiWS7TV2l}_ls;_Mb z{%tcpczb&eCb}4$TRor)>tfvsi?L3^QY$E9lmX?)uh9*@oUA_}wYiG)N`u-|9ke@6t=Ij4o`oxZQUU~H*G7IsV84xQ`8I|k* zSk=4V-f%8{UPR~20i{pn(~hXP#Em5A7=t{*NXmb$X+D!)e1ia$3PT2mI|}J9{nLRZ z=k3=7z%V;=asAs95L~&j?4^r|Nb7Ah1Xr;j_p%7@gipW)HPgnW9-idP754N?LB9d$ zp?yRf$lFl7`}f`a%J|thXFZ{DAM{*rNjWq4?37-QqH9cyLc`504Mqs~g%p%e4uDbI#tK!0EFt-ID2Qa^ z6%@;)=Pa(n>ckD|(vP<5u4gbB3wj3-zcPPs=l!BL7251#dPVg*x^O|P`(Y3cfohgR zmd*QC-g){?xc(Zn;D}|t{_HT-W2$b$VRJJawDiC%!VNeN=Lc63mc!{(NkUyw#%fzD z@++5)jl_cPVLBzbbXOb~K@ZWQ>9ZD3b63Q8!`tl*^_4PO^D`jeZw64jQBi#vqAOKw z#bze6I^Dc!Q)5DIwj~lpe&wQFo7`)dV=gR(-_q_ER6sqVvm9hjO!-)5aC1Q9{+xZR z7HGrKrP3hscc+Z|JXa+lBdB7kL>==6WV^5zrR$ND9R+JjRfajHtGWdPo0+lp*3g)F zE;9$NS>lCAX6Sz2D0~Z0x##TeDl`rQ#hXlaaW?_nj9Xmec{w>+COw(-RPV_BZb7zb zvrybEY#ldC=mnJxUSjK9Nx0bn8Iw}<6&4p<&{{vBkuuND^I16X5 zSnf#5R6U5zv8J1^N-;W97NNDea~rYx=^W#x+b5K<)f5P#DNET z<9kDEU(EF!#=;naqcqpmU|`ki>&yn4wx6laxA8fS$QL&eNcS4e*u8I20zx)u^3Ct9!-PPhR#e44RFTYhW5 zW~J#$CLD{ywZlGSqVZgAJ(P19Sf3H6!3uWh`M3eZNCP%Ct-h;jDSQHW*it3d3skqk z>2|Vi)*93aQ)N*Y_h!PZ9cE{Zkl#xXx6I_JYEH2HoQWkqzFt{A<0j68lU8M;S)7Qm zZe|muns)4(~%EAfJRau0e^~naU25ENR&6Q(II=seteSKhB1Qg=n@Nc~lJ9mc88zMJ;`P$&y7DA{o_)sV@*}YY=_x zs>LE-*t8N20ec+{2V4B&UB_iaoQgBQFr7F!FtTm;FI83;$O>fuc@l|!g2+~MvOS;> zyy#tXPaK~%h(U3L0-079^p&uSpr&kl zwm3-#5_L~+AZxT>))F}&w@($fqJ-z3=x-5RYUxr~QLjf>0E(}afEyWmZ*Z=ZUR@dd2^VLW~aj6EzDC@R>5xN~Q!l<&XLRHSgSr>Y)iAg59O zF0~RYV18)auYs^l&9BlKZmH4Zv_d&e* zdE?aJThJ`}%hLWb#K$`&%AdfM-z-i3R!{!Y_kmzG=^Tl7JRGF4XB&oAR@Q&sOSkcw zaDJ?5m<&Ic%CEf^%z zMS={`)A)B5)QmyoFuy*^m*NW_(=^Bo@!(UK=H_R@r%$F*0H;G3bcwK6O`*lZSw8@U z?>$}E66+|8$65~a;Y*;@G(JFtfK+-qdT`J63$I*)Ci$}XBKH|V5}op9`u-NL?aFts z(3392w^y$r!(`YbHBvolm?FTgHF#hkX1PN?)HQ;XkAwoiL0VFZRb$>$S%x+_1XpK3 z4h_&CZ^Il;?2K-fn`fhj4bs4Z1R{{$-PV;(YStWpw%oSSHuGG5&J#|DEZiU+d_AT-g%&THXJtVxf8$5Z+rs_eV!;^s!X3|1KV z8x@otTI^!>csmSFy0E{!XI+a!rykHVM+aic3In>C1{V#%M-%J#Tj(}J!z8943F|O? zxiZ4d4BUac_Tfbj&wN!db(7NpPRw$~Gebq<;h|42>qv?srW`p{^O_=u=rbQ3G9*Dt zR_5LLmS|ec1hG#;cAr)REn#=z(1EXD=_k4AvMMKLLmE3A!x8g&@k0-}v~VSIna=0d zgNhoBdOR*gZ8paQwZ`FF>R?Lb!{65IV*%F68X|2=J7?=+y}@*mV%_|bW+MV(&dqHA zLJ8`8S+R7Oj9g}^(QQ8iC?qXOjN?h3A*QlgP4#NEpve|X<1yWY|{v0~=e8AB0FE~@GI0SJ+k9TwG;1LBdfX{Z=)eNhY<2vV{%Qv_c}-^lceShD|X{J zw(Mv~V<%4BuVBJ&KRtW0xD;LiR!R?(h4QKT{<_x2gK766$=T5Ag8Qb0O%N)>=4+@DR0P>)6Qjo$mjFmF0r_$c(lnLHOnXbISUsK z43ToC*CeiT-DXD-G(R`6$F*JL9;51#WY7lf&SaueA$ne&N~dk-5rr5H2;Qri*;e*} z6Let@*}H4JX(bn1U>PE_sdx`!4^Sl;Bod0y@Uxm;%@c;W_Qad#97$}Btf{U45p4Ik$R zGj>qTt~RR>$qiu1%F!Jx)y+kdFR`3#dDBN$m?UwKwh}OHnxT8vIQSp$*;C@_?^(;J zfm3kNwUTWel?R7PCq;5>8%CD8xVV%OG%*eAXVSp&(JryPHn=1Xka~l<<<=k>lWrH% zx&l=uj-ImuC|(Dot_`ik)5nTOHf(dP`Qt<&K&NMS!d0;xaLshO zwZSc7_h}NQO68`a7GD*fu0XZAGF3vuW9iPpKj^4?DyWGocpwZY z(nL8|&ynZ^6;b6)tI0h|S}}w{vsdfvf@Xy|{ZdgGp82UVH=a`U1>2nTYDt>Ze86To z(6$>mvzb5pUZPFfl3?mS`b-{Smj|c(aO{$tFd_2~-T6z)S3;NQes{mcugK9S@b`gs z6tjpMR1I0y;47koVLne8yAUKz03~{fz!VK!Ir^`dKID85-qAtBk)Dlxx16j7ZaUKx zakwju?@dIbP5NnPOasSd=Yg{oylnem5B}*v>YvOCT!pLDwREG~{Ks{_&zd=iN`-?* zQDNo;NxD_fP9~wQsVuN(R$)9iNF5ba-T|C`s~}DM;DiK(Vp^loT+1*#`tQKvYFBZl z@PBO0Nlt3^y%@|%9)fhxfrE>vySI|R#iz1MD%_*MAGa$f9JEp^t0h6Ws0?fC54u^0 zMmjND%U(xYpb^}+q}XJKICMG7fvAQN|1I0l+K+jrLZps90 zUI+PgDTjvi=6_4HVP?-;Q^A|^@J@%@t%kQmQ#iiNJ---Ia0zPE<^acO)~J@b)AU=X zO`XcM5WgXv*K}_Xlc0MZ{XDr8_L_s4LJJJRuoVUR9S;Nlnhx~eas@(T0*WZdQjwq7 zb9?URqHU`eyuPyD^13-;*yneG0<9;MN_&H19U((MoW7PxFWl( z>*zB8Mdn!re|{je+65l~3lusM?aqlopGWBt=r}z=*G3WL^sjwPF6CTV>mVha<#(E1 zV>;XByVYLL0iUh4(E_1VH9s%IhD}l=2x&>z(>M3M7xqqR2ndZJfpG}r%5z=*LAvS2 z@z%j@v;2V^P<`p4VmpB7A9VUu2GeGPXsa2nc%$X|lQViP!_ZrFMnm z%WwkDEoxcuO^wsSq?j&bD~bC-GXS3EiAQ{!kM|Y&|7RcU8}XxeHJcE9rxD*2wWZL znv7V7nD5e#%lzn4ky)F%WRvT?R;dI9+OHt z>F+#hF*E5at<5L?9A?xmt!x@Lc6d|aQ(%mXfZkOy<(UdMXyzOHcFqUIZ6&v1u(@g% zJYI&4)i&jY6yCNju64?T!_ecJvoLR~LAyt4ck>z>F6eA`#XC4~JNa7eU2{M`(xgJ4 zKVn2yk%b<((R0@L=}0&n%LVG8#p)(%3zo+jL1T9)CmB+dRFHNZ4|F4NWe)-4wgbeifIqyVl6uywj|t%-2q zt!4H+g;S|lca`Q$z=LEeuIYpJ5{%CJz6I98fIFhjhMjjp!JyaUKwVYK zZYR9KpwI6wnKo_5?MlFExVU4gj&6)+ITvvaX8XZ4>tct_5xcC^DHEGOdPEmtn38P7 zktNfl&+SpMWW!+#p=O-nPp%g`7?O|3w3DYwv$kMlhP0qKRbgC?hv+JfZ8x7TLQyQX zmXTXWedY4GJ@4Q@xH){kS~=x=TXrr~Qw3GVY0`ER_~Ii&*y!u)?D<5G#o05x#2z}pcV@^w*z?#?k|<=SS{_|Lz5@2GRA-}di`}~ z&;9KOt{Zh`?r=@ciqLf(@0(fjuvt597B>P&T^8FI#_gO6*vdeMrd_Q+wp3TJ^ZyP; z%}a}*yT}cwt@s9A=Omk9loq>51Bprn&3MbJ&Jt|W?iFF@*9@e%kj|1MB<`k0H@g)g zR@gJg8uUNMs*2jS;R!6wH6V26Se%qqG9mOu34x^{oxGF5(4<7OI3aVr7K_kHEwCFK<1hy%K{a3XERqtO z$5ER4N*^{D7Z&Q}yyq=srE{*tIHG6&2X5nariJ-*Ob6eW?T=1)sl2hMz?TonJp~7 zyb@*y%Tf%D_i;M>{+7YfNSg;^B=e$b^rXvW4xI4Oy?obo?!G}P_jQH_2xS`O(MOYX;>5%)y_#o9g31Rw4qtPI3lyrB4BB^1Bm zTjtVza`rVcn31gZaHRJzE6=S2_lZx&8^1Vak;PhBgqEc^_w#IWSgp4dCL=+ zS>=YaUWO)ZCkK>6l`*CY=qk4Rwq1JPdB_kA9%3)sK0Bs4U3k(}iaEMB7PV|pTjR#J zY2eG)`AM1z@KQyn*7MENI?sHU(vd3jg>Ba+5L4!n0&gqE0P{>O)uj~9ic00_{jgIo zf>@ZQGf(Bt+Hd2!I_12d+Hmycqi5J(M)9>vs9an*={9f?DpubbrJk6V)pSb?U^6-!a@ZbpOPXpT4HW9ut z8gt?)k3I01${EA}-xSzIx958|4ws*bB&!P$45~(X#Ik0Be#lXFnh+6b+oG7;R-;JlNe7HNUROy+uuu z$g%kz`|;PC8wdp0r+Su`O;a`rWZt|(UC~LN@jzg}lwlA%+z?us^}e)bP1&apmpSse z=-`9Sx&O*b;9XQ1uc+RSPNW`ZX5*`i*FVxR1f1}Iq07|7APQTE9VO$xL5aXwE%KCF z#Bn}q)I+&#th%na%ax%Mbjo0H?04UFB&Hk=_5$Z%pyS-E3r~4H7g5-ETF#kv*x&71 zC{#N@lv{;1Js#ntD7=F>~O`D7Ak2|gG8`cU}e|!xMs~|#)K~D z&CNNkJ1EX+S!KzK^ky>?0}>w69IW&Nuknf*qD|NlMUkG|SOLVYD;AJ{swZTNzt z65J@?Q36v{gnUzhnOPHkU>gOADhO+k3`-RJXhnqU3^Cme($*r}8pnnk(_7@Y62RIg z9^B5Vi};?Fv+iZnwgnZqJWGXuwh{O{cV2V3Pkr|32(Tl&ij;^)Ifs!x`KAq;*(x|A6I0xly|AtaRfvK?8YOT)ZbJHu9Rr}+LIDR{m4!n1 z3EkFE4s}qMY#|?o!>w*QYss~!Ck%qtz1491yoiEfY~-vJg&lZJt9KHoFzFd_3meEP z$RBo&T}ceCm&*> zc2X1NXUIA2{A5pGU-12Xy?x-HlT*_-HA#H`D**a4QSB>}U;tI(Do^Nc@wH0Vax>ToJo168(0>t&~I=IzpsbPBaoRC+xPke=q40p`&e)mT7ZJN#m!J zyrmEQLLu^Rl4O{Ap>SHp|EP86mMic?tP~>bX1s1O(f3)o>l|wnY$epgNODA=XCZdZ zO;lWHka8p%|PGNAf9W z!ijqP^|bPS4KG)Km&@|=E?$Qyc_nt_velrK9hx6&xnG4qJU+>HNf7$7?jOu~HySLf zgLg=l)RnN~(Cmfp{$+5ZX3NkKDVKg?1R`M(HJ?x|FR#jxqS&2cK~5EWaAx_g@h%J6 zk3}&mPfrMjSI?Bg@)KsOt~uPGl9GZ|<0G><7g=v_n)LPeFa4^Jg!jlgahA$~!jv`4RD*L~ys&hGRZPzJ*u8-E4}?7TH~X=9on zTowKoW*Vv~&744)>v$s_bd%M+C{N{gdQ_q->yhnJJVQ;4ui(Q3qpvj|Hyq3I{5%o* zA#3NOy@vgf6)5a|Sk~dIEW2Jo>%sv@(sudE31c7m!2_tdwybQa;PG% zC`QbFmy-~|CPy}{*zFCb_GtTvf@~aDb94c>XOY5gj(JPk{4{+|* zd*fQ~Dh+x40rQUS7$R~ihtV|hlu2^8R)jEtk^hFLa(}wQ0}asV)3NCr!i@uW-^cOl zjVpp)XPec-yEleD$MAn^>Enep3%jJKcZ@baO9N$uf2|{$OBc^!ip7Q5pqv-_JND_+ zojsR3tir=Lm9IC5)JZ3gNjBFpGqoEG+(Yx`6$Y+2S^zC-tm_{xzP(hV%&C=juitPD z=Z5{aS5b8{heZQKH&X8MO?E zPi_E5teF^YC0Dhyd;7+#%-OuNTIDU4+}*u%gIq+iP~pOAZ3=rVHqu1#aM>8nU6=g` zhvA$x6I5F)7dGnkbUthA`qMW!PbW@rF64q5P#T6a{~*a?jao`l6#MP9u)KWqop=r0 zyY7ZQfV5y`K<+tj6LUjZGsUGV!T-Kof36nfq$9(Td29C{c@l3kU?y@zJ8>5yQqThf zXJb}X7&pAdH)&;)Bd6o>iAa}D`L`K_|Nq`2?hOUuaSRwZBauvZ%uHm+xokZt5k;#8 zy!a@r0@Ev&Br|TPgTYCbOjbzHhGbV=edY{rt}Z zqRs^L5p_(esJVY|(>}N*(OQSOh5CGPva;Y4@QK2cHd`&-wgO|eqr!>Ci?Q5dH1$=L zgn4LwiRw5W2EOmwR$JH9mg45mx=4~0%`hD|ll!eW3n#UNE1{|BnG{N!rnwdMEJaUH zTk#t6iw=rq9`cY=?v|Xglh~!;m~+eFH@DXh%AtkM*ru+jhWW_EU9HuE=AM6WxsJ{< zv?&CtVFc-yxEwzPzzF_JA>*c8SbPixP@v|h^akHuX5@(Ey(x^yfJ(h`DZQn=wYc^0 zid-~5tncd+P6q-JA5OM|n|qOu{~F7K^c}dzd_fu1zM;uF@rS3lyOf`aqZ#fG=|+oQ z;~^nkUuEFoKzZ@2!oUQM+ZTUIzx^+7N%_Hcc8dAU2jV?VCC{mUK-wX--=&}eD(<+9 zSFaw#QPb|S-4DZ3yW?`Nd@7Eorky|ZOkGShub~etuDA$hu&Zg%{d7w%znon7q}c?? zQ6kgaKgd+YopGLv^PgbezZ{DJPjO$={ps#fm_Wcu+)ppsUgPS(_mlHF9f%HUo65+0 zt)eD;pU8VG(QTTq|M6)~ee%zbSIMz|gF4aRTf)x0=Hpvk$HAApiPBku6I(5XxE1sz zJ5qRx$P^@~VErh~K0>v;G#C0sqkmwZ&HT9wnWH*U+3I;)DlifBc*_IHP)B7v(hJ=x zbTchFJsS>F?MbG73%!}T1~PNkBxz2oV+x-=0ok(Y88a@bx50t$L-&-B=TooTu7J?1 z=gz}u;>yU}%Bop$9PTo2WBEtMvoHl(38jjFU|uIEeDC&chZTWjo$j&G3a1_ROwi&m zWi=5RXP5V&jYP^h0fYEe6!%0T3N^aKz1Uk}n@W16h6)&+6+56@YstrBVQ-7Tj;ufj zWi8dPF|r|Ld0|*B$)t0Yh*`j_tz*h;9&u15tMKaaN4rU_QwH1HJ3<;@J2ocHEh*#S zj#lh9WeM?2kmE47f?Oq(?ZC372-h6)#rQa>=jDAV`XQT8e$CDTZA(O=ye^Q?u#~M~ zTfymE?aZrx^i(#!@!`(93MdoBle7;Pf~HQi?*r63cTNY#H5f=FBBiUI|CWq+pMn&> zC6t@4M*8lzfYXx{>*`9v4Q$GtSP@MJvOSHO6w)+H!bhLAbjuRU_#LoQT(+Wv>Hee>aEOuq@sn<-FD zQ+eV)J3{fGdn>=`PK}Q4D3=XH|E1dxvEN3;)vF*1?1z>GMa`SXk)7pN!;MO%ERG!e zpe7csRzBfDKyT5h)#+K655k2D;vT;y#e(f_wwZZ){CC98#c!Ol$!EGbJDYsp%sGG0 z1^&_K+vR_(P3g!!s(eBq%YaZskYafg6HZMb4sD7EH?S|(ClCU9X6M@L`oCWB4wwFtIi zUh7Oe$F?2?elFbKMidasF~b5RAw+y_1s<%w==#8-I^DXJf@i#OHsyM>SH`tg@CNR} z+D%xKbUI}!f_=z5*>IdvAbL(EGo=@p&{mj8R-NXdUu;3l9~~eFVs6gYyB3ML*P6VjI@rV=u+OOS> z@Y{If)T_USAvOs8b|YvsH%~j?@Oh`-6ax;|TLJkR$iI9bJTSBxgX`TzcF_l*cqZEf z|LfjQVv3@r0B!|EmVvR$A9*hqVW)yuDu<6{{_^^znr1!&;M(vT3pS-Ae&SFw0*z9X zGXK+Orz>md_4PMvdGwHeOngXzc438QZ=mSq)~2@QDh;Q}+OEieG3bMzIA z+O8vkES9owLcFAC)N0uYYuH<-?wWpIjZD3qvWhC7Z0W$V95J)~!!)q7tD$lcA>d}XOT9R| zzFpI*h6#dV1`{kC%~z4FQ@7V{7$5MYPlYd^{wSa*@~4Z}00nPf0JI8-O#?&H;Uiv+ zB!~;1PbcF;-5XG>tE#MxuY~8q%N`U58@0cfD09$&95?AV!{}d@58jXdjL% z%E(q@HTIZE=mS)P@AbEijDNdQ;O72Yc8Y#uIqNWcL$HY=rbAS1BmxvoXwaZ)L?XDb z2@6HY|NQkEwZKmc*>l!@t@&>10yd>IoQ7b00BW5(CuZ0DnzyRCRGg-Bd1e$Z4i>&0 z=nzj1t`3At?Uu#+VDw`V03wv2Hbc`aS()sZDt2|{=Gu)goHr#z);#Q_8)fXVn`*aN zT-l`KY}9uqwU954Nqw@n_lomO_DL`g?{Fq_VZ1TiIMH%#G_bp(H`VTc>Y0uivNK)Z z{6c)XQ2k6O#;z8sajb$9H+0;3NqF8u6YtCDjV0(i_B?EQ_Rwzgm;5LFl}##rWLvMDeASzo0X`zF*FEpV zMyLkzmS!@EXT5a<@l9`Nyi0xFiwB*09BE}_=G5Y4p%Pu#qHoumW)j`>?Q>ubyXySw zgMv`q+u1yDCl|-umGjQqIw%||f;5CARw1M0JpwLt9ZJ-@q)@7uMOfMtE<&1 zkAOIQv$a3t9jwX7`Vte!14AE%-0Vx0>7S1@k47pD%w{vHX(&HrayE|#DT$)( z2p-Yzd#5wqXLJ z-}&ay$#NTce(||GQ>rbgzF_`~xCdKrp+P%EHy1qc-w-;?znIF!2krPe4ZuON(A{zo zIdWY-+~4}=$W>!Yzu8>(UqN$af39I(FpCMVewb|L^D_C#-t$jq{ik%y5ARE0WU3qL zhwQQlW+dR!50RZV!u`}R4e_FeB4>qMx_58My+Lh8|4*Fme7ZYL_eGFZ%U)g(bz%>+ z$fV+EISez;`?2B|(eoX+j4ytPtN9NMK!Aczbxz(ny%kpTmYctNM?dJlW3D!c!WG|L zb3X~}b!OG=Q^$#cn(bt4qa01w!|-I0^ogD1qQ0&Wc;|0HJ_vy0vLdJUN~~gaX3EZH zrs?OoBqOY~HV$j;9+CPrhAcG#2o6Iw7V^UxS zn%|(#f%Y$#+r-KLJYprg_zmg+{X2_nW8`|92*$`huILekJQe+)|H{E|@%GVeDOg>N zLn)MN$DEK#7WgMt{mx9*A+u^|`CZGl6Z?&ZZRN5sJsxmDjZHY7S_sdCSf{*@Jj6>+ zZ6x3Q5O7uAcp`T!*J=a5^6vWS~dFX*fN+r1*pWOu1ny7*4}@P5l3_oSby1=H+mbDV}h+&e|6Z!Ya-V zmv29k0!$bi1R*|mTYI4S2yGAj+tTTezp=8PSgTFg?JJDMlN{ruX|z6{<-hV=c)dc-ZSDuj( z@CMw3w+$YZ_o%?FYqF#YR4J!bIo7plb22l9CYp1`g_hMe?XPt+TPSB&GBSv=?xPL0 z5LR576l;7$u|a<}1(PI8AGAynD+-}bG0Ced>dH~jH%|m8-HZuc7%vgbzo@)qr?I5y zl943-HFGcT~0LRwTi9X zX6D-*C0Z4{(9%DdXvS97CM359?I;sw9b1qor<$FJ2KY~tK-GhlwIFpo1|oiJ(k?~= zsz}rq))1hNzJjd4H;saTIijDI)`|i562HA1V*hjdfe;?pNY)fgg|X{uUD{CNRuft{ zzck-h^NQcZgvym^A=CW%1;BT~{P|fg(r0ud@Zl&NEuE>+6)NqxKJ;{|%<1~PwoA!~ zTr(@+5B5$AfQZZ4snlT2J~8d)QJ9g^*$PEV2#78A%H{1DK|^9&WFpt=9M8>vcj`Lv z#k4E#T3&O;mMp0SU_UOmG)kr+M21`KLE_(>kZPI zX?W#u`EgmQgDO;(%#Kpjg=j`Au|q|1Qz|pSBkdd~X;o}%fcOg9!*hNoSZ)^a$v8rk zV;P@})^4nKNGUsE-)q+7rDyxZg$J8B3l{2}bizyIS%0omPo&}4aolaiKx7kd@@-YQ z+%^uvM=#cm7V&JWwDU0T5tSs4#F{j`W~Fgs)R<|EZ2}1Rxz(XA-m%T<=Cii61Fd#g zeh)wg`TxIz2YhEfHDl!&a2~*O-$6nT^ib!D9_i{0$~p2fwFHwc@j5lnCm~rT>%1Lx z(f9PI4+*4@1gmzdur@5NG^iHGbrNrQThh}~rZ&*g*XA7DR5ag9>T~2S^}E%4S@w+7Naq zf0kZj8mGDIJ?;|Il&o{S7WKwe8J1bmC~<5mD>uoU+=X1c8I2layFG-RRzL^xHe+Tf zRT(D=0l#(Zx>ZrLJU;DLu^mNh*{H!lw2jgU(|Hu=wv>?&>9y&!Mw3~rPEdi_*f%-h zT&r|4qB$o_`FK=SQUoIIB@?B79nJ@9h?u1GWU7RM)>r0mgx}FFxIOayb_WAH*cQ|k zPSWI#S(F1;5J0{Me3X~w!mz`hH9pzXTdrQaDW)j1crg$FN(hHF>?!>0b0@mzy1+Y~ zqf3@`*p}-`6h|6kIA({kY^5yM=D>0$RleaQee8)=VLDNhtNScOm@I)nOR;ujyd85i zvxN#oHx2>6J95%RA=61Uj!(SBKopBM1$K136;H&5qKKs&$B-z)TYK4-K%lvgO}k{} z(=b&QXvLVUJQG*QTqzm`+9|t~NHW^NrZKe#sED_t-jy0FvA_)-x6;6lih^|Jzf`15 z2K6ht>{0XRy@K7>^x-}#<_u%U8Y|7OWV1YmU!F^Wi<7&mt zJO4sfryI}`_+mUphIN5vm|kn=y`Bwl6*ypzSQ>EYgn9IPARc_n!Yx(w> z0;9B4Ks~sUATxKV3EQoJ!?%@#*0S^pJ^ep*Gx)8H)a$a>e^ zZ4c{26%Wm}{J=koPppNq?wOL6T5;vnSuZR>Nbe9wg_>jxG>XsHlDH_9B<)Z2ACC+# zd-E!71!0QvIMB5v*A&T?|FSgO?~ZaOBhix$1kSQC6{2of6X#golnL+4NmHM$Xm$pD zW!xR^l@jatxU2z;h~@a4lX&Fl1+JLV+HYjvSu!>lv=Mf6ZTuN70f`jQR@|a(yXk;c zZcNaAI9?QbbO$5mPyOV9A}0MgmBx#2=I-?P*|+JQHX&*}PN4y~{qn3(iP? zZzs?*%~vFKdOPc1+FJ_%ICv99bvH(qh}SYYS5$9CSk^%}VP-Y&G#(p|yhT^3*v0`f zL>=i5+1*gl!5pLyqq7LupC7?5NxrP3{J?E%pYf-x6z|A-C#5qlRsEQkH+&UkyD_8o zwu)w)qzLQ~^Y%`K^_=i3xCOWD6H20h-kTOiONl0uL(hw&#R)MsRZ0hKBODp3x~k|| zI2i`XEO^3=RvHlEgmHl}@DkjQN1$vgI#HHee{e$VNHm~Q;YQ^Y4ce`xU`jKoE-b`H zHj9(I#Z;x$Y%qg?2ll9ZNb`ERj0;eq4D2n2(!2Eu`k+|)3Y<7XsaR+w!g_Pb32S5> z7K={nHf%Ev8=50@+C&k9NMm*>PL#6#BiGCgX#$vCFIO>q2tH)@?bH;mNo}wnH6ivY zDTN&xCpf3ns=<)@vf*?~lyB4BoF2A0)4?U{r+E6i!%ivSV^P&h2)CcuWJ3J!9>alz2&rG;5faC0mNH30!kLd4UkAOu($ z4{QSxm&mBs;v_qQlibtwXTJ`GU(pt$?4i0AQhwWZSWGi_DF|^E9Y(W2&TASMD`lGM z#-uHP+yc)R@ohVtlol#40fPd~$o^*U=fv3BeNctaxH%RoAt%F#cU%n8GyxvX%2)no|;xxsYgdPXVqFcO|1T z6+HX2nxJ?fNP%W48R--qAgXS+FIVN<*lrWj70t;IKZA>07X~I%%-rgJ6t8#AB9_#DnrN=TihOTd1 zPu)9YcKFILe7(?x1zpl?(Gu|(SUB{mKH(|)^gfi)u53dhg7^j`_*4mW)BZ&xpuqox z`g70}!9Lh;iN+l3TvU@}d`;GZKC@+rEXMG#1_dHz-KY{Z*tK)heV18rD#uQQ)%nh3 zFFsmc`GFY>L-0VPtQz$VYLa``T&Sgb)UeCx*=c|)wdsOhnOZ)MJMa9&);Kf#l=e(S zN&;a-d<4ETBPGE>M<^#9S_B_`gTnM<=sjqo9~7s>BWC6xEl07WG?>h?=@?7i22H%M z%t4ZQP|h4^@?6r?BF<7c zQ}}LSGIo=$P9RDTVyBS>Qzhh*vd*(Jc~UklvqH+NPCzMeT3*9fP&usJi#B+<;eXB+ zapQlDQHJOi8XLr~-625hr9*imP~S6pViAY;jok&vElsAQQ@cP9Xa65Jw^KjI%^~|M zMIN`*&Ds0W;q5K&X@GF`UjxudwPRWy*?+qVZ|`jV=0X_r+v?|R{Nzl5>_JU_m5dA} zP?DEiX?%R0HgPk{X&#(S9RbItsdRNmi%%KY_I;qt$iTg%CSiMbxH-GprTpZ_wtTU+ zSh!}PIG(c#;gUVSz&4->Q4%0=9RUf}J{r=I>bnBH!1$-J6rk)iX&kmzMDeQxQfc0o z3M*-hO=Jjwk%)xyJRtnf!T~5c*Tu`c0N%?jj3vV1aWYBQMNsuk{1}(wM1d*D1rJ91 zqwpci9Ye|EV}bKDE8VCoz8p3J8V4BZP*UIg0X73iyOj5Wzep(1}u?;Hyz5YGdRLt9^MMFD1$V95Jm}YSw!MYSOo;U z{dwd9xf`3p(&;?+!BnvR1SkpH&svN5_3X*n+I-+GV zUrKRID}*492SZ-RwmVwIMH8p1Gc_j#YRtOfH5y>XX?ChG49cUlHOj&@xNcGIT}5sc z&t;XVgK?hDFi~w2Cvw!s@x(GQKORW~9mqT?cmZsq6{SbEXuLu+5;@ql7gn*nIJb-! zY=j#P+a%ZpTVlcUwpZ;hf^S6NB|`iiMfhK@UAuwwfhwMz6ASDl>nQ`GWl>_vi)$w6 z4hSYN-gh=8fC`cEu;^gkB`;sw2kbqs9!G=fA!E|Z*^naWS5v~?We;f@(8Iw@gY32jkz!$R#&X7W}S87iStZdr;8)=fa0w2+r)*pDH^Bd1?TPSBs9sDG-eJxXS?!#O3Zj7j?r+* zv<*RgfePdE+r726Vd)|l`lzw^U5U$t2dK6N3tQ|KX9MTabqFvfEt{S7vl5Yv9xN3a?v>CEC3$F@$fnu7QKzLQUZu7ijWv0-Av!odBlO~=Euy5YTTv8u z2G-Sv%yenL)H}k7j;OkUT||sYVU#6@+^>4P1R0Li)@85s#P<_XKC3YIjn1>5{e zffJsuR%qEDDQDd$s*0E%J%7*zTnQwe0y3g;)8{<;U`Yf8GLjzVqp=!&b?47+{To}N z-l^^GPOpJXBid2mhpHFjBi{~z=x*~qacOM>N7-fwkQ05I*6aMr%{967JB=LT{Yp?2{ZZF|LwLneXy7<6{iC_)% zFeqiaL!Nw@o$IphQMlfvONup6f;X(Dy#}iATV;Iylo60gqpyKy_=OwLEJGf;sQ(|v z!Pi<}hyxVRe!}B5sI$w9lOMEz%eTs4R(5!29o>e(UA+2V@Eri{3guJ*-<&FhqZO~Ox`{P4!V6|))8s^4twYhsrh7!n8s zHLy101KM!XIqFShc#)_e(Cqu=6?IS#Ubh-^71xJrE}W!mkmyzd`TkHFtCc`sp&-AV zxtwOWW(gw`%)Pbr3eWrFZ%Ev1+sb&}aWMql$T*BsPnIG$Czc9rZ*2D1v4A$zUa z>Ez??brRljF?K*BUKeDbS$E``w+CCbE7|dg+OdVhIXH7YmW`3=4Q=CODpsoyjZ&x5 ztC;Jt+&h`2$zkC+y|g|nyO-)zR?>{_^Yy4;qC5snJNj~o0)OO?PO52(yQWK))l?HJ z;kXmv3$~;vG($7P@MBlfw54>DyOEZNq_=FeJSNR^-pN^%>%Dj;88)v9${92?4xm$G ziej+UUHJJ1?Bv!ugXwe;8-fUIqJfJNU1SS>73D{0=y(A^vhc1)?(~BdXzr2D#PvP{ z+Q1gGU*bjc>8f|By8SZUhlA+g*~Fxu)mkhiu$+;o-gh*`)JnStwHkpF#Fbksa7(&C zv#=aD9a_0*uJDE^>D4)B=|&$wcM>IK5w_T-?)I1tQ*{9|u4AjR5hpq+Fw(o_>6!=DhFgYzIcn5MC9Xs0b=>KED#bvH}nk7Rydw+b~wHx zuQnxFf^D?hMlWU`Eofv26+qW@!?IhhnU0kFg~nD&P=dy`y=mwo34+QK zncS>vU`R<;*4Z$~#oNT#Ko_rvX#kf$(phcqi)-`eYaN{mU{GXI)1hrY9qD(44K*!g01v5u*K{s91Bt43ESOX*4=TEyLc5{8QU(v9_r<#m_<$QmTp_3)0kNTMxg3Veim%y53W|(hPAEK`41r?~K z+hdXAglq=f;5yT9Ds@z>Ugi12k|9Nk+ct??AqaHzkR&Hr518kVk^sBG)~LTa_e%U; zh@m1vzM#>K1S!v|TE=OPIPd`ZhsUAWv^bRk$a+ocsHmFLn&aTezvovrb z$Ju?(+LVaX>{nYLwIIYS$`}n(LL>Vrbj=y2yVkdLEgLPEOYb`Eyf@m=5M`Gn`7JZW z0X2@C3&MI3Tquh5>&~<;0278G1&Fg8x^)V2*jAPtPh-}vna()LZ*yw<-wdJueE{*; zS|H>Gja~O0)C5=vl3xUucfj0-!N;#wzrxuW4mcP?yRW#a_54J66!KG0%hT%;0S>S> zW#R#z{g$Vh4;|}f2ZG@HX||+-UQ8G8Q43>dE*JBYVk`If@f75of>1_c=2D`dT5&L{ zOe55&v=s47q)={Lnv;F>u*uC;hNws;cko*wBb1D{gmP&#RocE)&zOZ=E>$iM%T{st z<#bYVCvT99U@Um;?nAsJ0TGOZB4!{`Nc16{j!KmM9+|Yd4`dv{xzTdUuB#CvEIOW= zP3#~U!4QgXNoEnvJdvw58x~o36h2eVVR^nPl8l`+bVC6r7(23v+$!KEDJuB&Nl~9u z0YAtuFMy!$WuBrw!%U~tM3n41FByumD8#)Q*zwZMILc=qDCyne1#(`A=c1#ace6~w z@|!73DF^;h^Y4J*`WzE2iUUUgZ&RU9yVR^!YNcYD1JY5dWoxUR_p38;mP5Pkx8~q_ zWX>}~rg?+LPzMQP8%1$coMs6f)dhx7P089=0wO8y^8^uHjVuQ(m&W_IrJ};Lt;1SA zIVY%>W7}e#u4xsEa(WWtht9O@K3JmW4M<9-v5OXq$12wEha`0yU!oF2FR7Q`QAf9^ za!AaT^0r}HW~jO%sE(ENzUn|7!Y(_a<1Wt>yj&(t^CZ8yH2;z=OP1nT&36%jsR^<>HnsQB@>WquvsQmvKhCMd*@@hyA_Kke9>elAp=P2Y35)vQ0} zkkxSeOhfMiT}gll{J`=z+Q`z}l~Q`T z&BUA>f3MK)dr+EI8Zyl=3E}>%ad1fg_1OO3jo>B%H!GnTRJYQM?q6RGl2lFoCo*v* zN)zKHJ0E@kKcx2y0tnuy8SuQzE*@{>zJx2vDUwf*< zrg2ZY+zeGa%q6O>96*M&Uiwl%iRH_3P6_CV!Z82*eRl4GnyX)*{oLzK=Pix$?4}y~n?dY4t@2 z+h4|qZ}5Op%pMjmo&Dr;%jJIBJF4GZI=aZpZWFXnE;jf6&ce zEsZ<_G)4d*z)mXFd7^S8`PJ0Ee{Z=^) zOpR}a-LbGxb%QlnIYvnaaX;z;#ch)c?ezTU3yYyqGHJ7RrUQ%$X<=-^AM1P==Bcdg z6V+n_Vk!b0&%wYnPl_O(sv?9va3fTNp2@9Pk9ImyFdl_& zrNMw*(F{B4j2ayuA~dATZA0_t^DvkwnC&9!j-lmYa^iK*6TO=Xr?$Z-Iv^ZH?>~Ie zQ2kXT6XapU#oC+NML6zBxKy`qT};Z0D;XVRGFGQw=wqFIda!MjZmXlA9X;nTN6)ky z{lYBozmpRwDE_)rED%~9!nj@_M`%^(5kD?O0}bkh)S!eEe}M&9zP04#ndPZC+I+3L zsCV?<7@?C25&ZBxnE4CFz!M~Vo31nE_3euA7D-3pke0oW|9B566fT=u9ed5 zYJFP9O|kK6!D;^eIvj#bC7UIiyafYSl_bh9aieVx{tB+mR{3tLKlpVL7%AXEm=cV< z2}m%{{ueB+5&LdoQ~mopd*^JtvHMs&Qs9jx64}sw!qbJ6O*$uZkXY9K|1lQd9>a~Sn!jZey{o=kY*T-MgOiHdNvLc0p zI?knP+3x#Ik+SJaB9ca)4>5hF@L*#G6Z4QBl%x&(F%y~wa}n2{rjKeGiyxn!z=2g zqZ7kt{(G7j92W$aJaf4aE~+Qt`F^VttQt=-!3`=Mu9IL4m=@w#bXM#T&|P9#Z}-Uy zk+L0Rn>I14TZt3@NHb|MdnIpejSY0bu{W+)p*E!@undD|f}i4LrzIBQu-d^|KIVqI zrSEcDa$ZZ(>p9Co@HH%yVK*nFu>earvjNYNC2XHGXVv1g-(;#PXh%;C+6N+%;znMw zLX&e}(n}AzyK+(lSb@H&RA^&%?_RXjulOscRTJ6SZ9J4LsCO$ETF63)Bz8P#0QVM`&OZN$V*@>GKpEI(`D ziH|2o=V%-_cJ`mW`5d@OoRGd&0^6fZ5^!;Bxo8GwcK&>p(OKJwGaQqd4Mah9vdo{8 zk2E#g^*!Ia+DEqIm5NzgrfpN!eKv43y^)}3mLFftv+9V|Iq_%1XO1mLW!S)Y&ct}$ z1~L*KVF`R*$6ZvE&U9o~Nr3IODs_w#LIhh3A6XpfE~`^T#FfvH&s*V1`!B7rms@w+ z2d2@hjIr1 zhby)lj;Zu`Ow?AZcv9!4qC_GcO6A0DuZr=?*i*+}UwGWC6z`h@NRw#q*-^pAzn~cr zKw~5MKA%3Ip6iqdnRe4Kp2VXg$CE)dHS`G{t{u)v(Cvcmmc$g-bFQym+gRn$0iwzX60@RO_<^(y;CI+I=G~Ini+(}a&FZzJRX{xl$!cu9f`CGcpw+uz~DOC zN9JT@kX#MX5hvGyn9hzsVZ1u#4b#Ol|9oBFBu-`?>GPd4``P8wcsYoqbe_I9K4mVt zfj+J?F>g*eYf-z`&<`9oGgX1THVDUUp&ubFCe*6?Z3QyVL$94;J*d2t3f~jPnc?VF zl19bjn&U8_S0ETRSKGD=)uR+?G2i(~UbwJmXb1wY@qZio*-?9lLTgt+wtlkCLEBpQ z&_4u<1Rb_3^#WW&$9Tteo_(A769FzQZMPBMkWu^Dc7JfoKXUw0%ctzqlmCq`69~0Tz1uE&KJQI6BVxJU zJ9}9o^x>LWzvLl3U;B14!D9D(!#*lT3DJ|ZuP%vo^{>>vhce5SKEGdi9D6ST(-zOi z#Wx%#CU0f*F2-)sg|3G}5|b;@MJX`S4EkTq&hC9CgFM@TQA|{ZRagwHcAd@pv=nOJ z%!b-Ec0%y5MzdK`w+&H86_SA54vjEDV z&*~Ml^@)iBJ?%Oz=OIA(B=f)iB%j^2&tx+Ez0>cB0P-HWgI0Q(qYwlNTPp_{Rw{EY z?%>6{$bTXPWE^Y#$UrIjES7MjV(jI3;2TmL)#Z@>S_|@)85z3w8g0(1ee0##-J2fn z^9LR1azc)r{QZH&7!ArQe*zErYMKk~q2qS7vGWg}AUB-g{>vV7HJ%v%Ah_QJiv#iqxffKJhQOq^ZnuLEnwH-Qbcd{A znXOX|D2%7N(bD}OllUD<2bQ)aSY#^FI!>0cy+{-X=Po()CY^2=Z)%qa=d^6S-U;yv zZc&0p3Q3~iOq)yeA5GT|^E@*WUiR z>r>TsSi^@Tl=8wSoxzt+3?YTXIC>oF^Uroe(PS4A)~Eh&2JkuRys`_RpWOhI`{}&1 z8jDfdUw=}N?}j!9aptuvHGWFvKWzkA`rp6|(r#!8Q71}6{5E@U7zIh38h#&9X$Zsr zwiD5OdhHynUaPz2H0YNie(-wx;3g8!fEjG1$&|l$Frc>&PuJXSgT;t#_FPDdp);yA zP>BBoqWN9}jxSye?yq46!9P>~Yz$mNm*>Z-c1@9hWE@w7C=U-Kl1PfFqb>=2y_<(s zv3y3;Q^*pL!dtA=KzON`ia3Ua+}Bt8o=kO=Off-0>g9$Tlw+q1wu%Z{>wmo^Cso>FA zDr3pp?I8qd3h z8C-DrD6YEo_Jq1NTB<@B(KysNBOoirt^{Pyxh+E==YJj#jf79W+x>6~s(%nc`UbdU zYV<;U)GwDMKO4 zdc&8p?vw6$z&+GqKu}SwPK-$NHY<4t^hoq*&toTm9Kl00+8>+Vt^_eHxM_E#82QYt zYi^xQzSK9KKgCUiox9C$lkTg*92&i|AFj6h5Py8p>Aw5^@C$%s_+jTm@BZ7j1h}EZ zRdyNbd+gz+rpbzQlLhK6GFh@r1XQEp369d9_iYuI#LS${X(jPg%Ly@*Eo*X7G;EjP zh`#;!s=sve)&fdAuN?FiRbNxyr8G^5oF#Jhe~)SJzS8e9!D~ma@eeo2Jpv9hhdG;5 zLCep^WUR>ohqz|QGkCoz*HZ9mVXhjkoZ%~6G8~-D-Ietn~gkn^iQ#S!tVJ9(>Y5Y8{i~`wl zUZ^T0=y4CSCI~qKqJGl}NWI@RI>!0axdTf7RKIIFE_fDmKZ-emn zF6xJa4fQZTDgcwl0UTN#e};qoCa-!hc6bfpVX(0h?7u`8ujTjj{3qL?Yb4*=ec}H~ zGYC@>EizZ_)otPWwT4F!4)#|7VPV6ZJcaJ^duE(zuK}{E!>jw5%(}j4*?kfs&)tMJ zGB5eoMrlT{{_4H<$B?o9tsj8JdS1t;@V(#|6Q4Ak-|{`vxgnB-)P<)oCuYPI^Ufs^ zkd@x%n?Um18_n*pg_nN*+G{U;rIo$(dza$N;^L;o@eKzi78mtL7u#i>G`-mf(t?i+ z+pJc@Nx}wDq->jkY7q{+@!*yrrm*m{HW+l)zk9(R=jR>VfyxRUD#~mRh&9}mr1R?o z;DPkdYlNOVFhV*tFg~RhSi=N{_%#zXonA|+$oO|t+(+wokz)TFpA42B{dLY;Ir@1Y zRZUc;ztJH9;qI+78VkE=PfLG)e88F{q4KY zTYq_d_t_A*2JRa#)jsB*aU#+JFofNULeN>PBjPZcK&KYs zxc34R*j_9vhuL4OSt;IJyzI|#3OqJh>@2R;DMUn+Z1T@HJ-Gbrn(L}|?LF7HdF{c+ z*urwXB?0u+QzgHK6>^U(*Dqakmlx%=BPNt_tNEtOtmTD5z5OGZod;XG?Ka9L4S(d8 zs(AaAoR=B$o|z!9mL1j<%G+q@|9EXFa< zHZh*0$i|kHbWP#$0!eOxj*Xh}U~+}!w_x^gp<@)frm|9ko#>cHa2tPLy%rIU8?&og zt9Mx|X-1cebA{5E``pxZ>@ksBptS=oTID%*Z4gIL_6P9^s(cUmku1)GWtm3}`SH*t zDL>p_5AdVC+cpeqa9C5@ohU|m5yp)7@0#`zt*IXzggm}+v6^Rt-W)9;)McQ9KsTuA z*fj_<7{_mc_n0)7@a8nXEyO*%lMGVKY*EmpOBT=KDMz_$TI`Fxe33`Sxlr|%(isdUq>eQ<-!dgl6CFn#q zGCqIv#~GrcN{!dQYq=4Xf9jc^fR|f39Ud>JQrb$ZZvNEw*1yr?rz_Q0K7DVL6c8MU z%RS4G&r0viQ>%Y($I3f@ZU5gN{-6vfql6IeoB0Yz7ybKpZHVN*A^b2{9QXMrOfVpT zC?oQO8A}oFt_|+5Ik9x0L`QckR{@=s2P*$A4gP6)s=brQ=zAI3NATsY;5>Y#j(s%2 z`QaqFRo~_GLCQf7q^-OS;fj$*0-DDkK33`gX+H|vahNyj6Y4I*hII-)XtiB$=7wuf*)hY5VEMM zco{NIxhUImqRFV>)yw{^aF~t-tBN3)weqSe*S@|Vgds(>u@-|QRn^UkvW%xKjG$(j zEz|`Ojqzc!rW$$=%SEQH@T4q_I@Z%ZcI~1pJv3pxbZ8f_Yh??LtE$8q74!%XoqOkQ zd2;09ZltyBm(So+m8LOY*{{`1bM+QCNy_7j`TVHZIZC%Rxp^yc&aHVH*E=2)Hxt&2 zFX=_6QL^AhL~+h~=v8O~-cR_TjYpM_A31(!Y7;f0-e|8Zw#K&utft~(CBdLw4hPb< zb0G+g6sjxTaZ=340&TOAL_yxHSaZ_OSUK5Eqd}BW%C?zc_c+@fpOOV6u7cM#LA70m zk5zF?&A;Gf<^xtV-OxG4#Y&Ap+9FdmP+p10ACt*H%;@7#j}yIlY*Sk$OLMbfYd&zz zx9`KYbm?WW$Fr&cGAT=#kKd)SUAdCejP9GGX6Z@59>Y|B<5&+zvR8#Lf4^$2Yxq{i z40tX%HQjm;B-@k^2-EbE;5ez>1nLkFq7Oysvk;!i5YL8!Ald0~L>?Th&a2Th4Mvob zUINoc1U?I)Ga{XtlQ!v6KELz>OO_<_f`wMGsKmEZlJ2S2kjP5~cUuCx=LB3xSpAki zdWr1;iUcR`(jCHothB5XI9sutOYk0DalU!@FInHB8$`dxfM2rvW>0Vo6!I#N^DNMF z23UC=Xn6^^H~`+xK{~95U={Te{RIQGr7f;C9&kQ64?b(u9@SX!WSqJk1SXro#J(c; z-)YX&fdI&yV|;8T4O(cl8&QIrZr>&-FC{sqGV4sEuAO!g`|^#D_1KZ=s{)J36z42S z;xl`I2q4f;?fTRD$6r2`=i6_`L>~ZnW9s+c!BTGi@V5f@lt;_tYV0qPodFvNK*0Zh zaObXPe@nd4rA4TdbIIJLPB@#VsXcA^=+o05cmFx==^za4Ex3aQF^!;As=%Pt;GYn<836tM1Qi?CjtJwqAvDwq;} z2U<@|B9=(2qgFfO71{>0*GFcE!U-`C*R@>6u-v*{C!;3xNlzy14P2vC8E_-TC}42| z>A{sGl55Z20Rmeu;X-_e!;*TM`bgck_)CFN$O2>bv!+`lR3RVS9$dy@>Pr+omQ_DD zea9*jnKvc$PP?uIJ|;8~xFE@lEttyacnwzx#9OgRDRKPK={c@Hg*4L`xO$cF%1{|E zqbf1uvktB4?AHoXAd$)Y1WyYX+<EYd@cvB@}xfqR<_(o^VY|8RD1u=Aw$?o!Oo^o7Ju z5*Da#i318uRtT93|VUz=7BZhy!i=e3dJ7A+2p>&H-StcT_o>~ zjCL#dny$zaFO07HBoyvZ_G-ODf5XH7iG^S{z`v@f|48Sgh2w_mPj^K>;&9TJA2XrPb6~E=ODf{&NQ9wCLNL5hrJqo@MrNs^B%I+hCb*4*9@@aC z14J6q&JvG}Zc3Yyqj)urVtOFX+v6-xAg-JQl)%BcgL9<#7fZnU4I<92XH#tlh*|0` z^1slFqQRY>vuRxu1za7WiI!pl)PR5V%#j3frf-xvWH+I@p%0c`Hz9EZiDP54*1~K2 zQ{2cdJxM~RnYo?`)Z?rsc?5Bk2C*1bAx;fsCO@6fj zzuGp}f>&%y>t~z@K|}x`cmfYtK$Q8$cKy_O(S9qpQ+TBQ9Rzb1S+u%fq3oBM$B3Nl z^WWp7nps|ln?G_M{<7lEM1q&^vqArm1sewP2nHuN@pv2+26>E@O&-UpEKd+b%aatU z$y3zo%F{S4-labz54t5n3cxSZAc_T0i2{dAd)G{m`Qf69)p%dSwo^q*>28PuU7=@fP z@m=Xi5B#dRG&8N78=hJ}ffi*a(Tlj6cMz@2E9p(UdLnJCt77RxxjHC)8CHGLk8U+B z{n=Kl(vIH{m}7S1xU59n2%&)2cJp|zEe*CkI}zoD!D6c3Yk!|)728-NbW~{Aa$qv^ zwrT2c$p}NMrdQXT*7=%Vkv(ZIE2K6L=h3?kwxfXW zuiz~0c53orLYUrw)eTzQ&?ft*`@#K9{oGUJ=?Q)Q`l=kY0}UFVZJ=H-BND4VIGR%L zg&vV~2qA-d8Ha72N-gV>71a~mUQyv)ZL+GbU+&t?-L48`Y@Vh~epEupo@OPf%}Yyj zAepea?=1>qr}l;3Z!uvmvaT9wvAA0>XtyIh_v+HNoH%GI+YUZg)MXXGsO|cJb z0y`_S_nlEY(`B7ytz0L0`^EX3z)0&xy_c9ySKn$MzlBc8aJEF}PqqG2QNDrAU4SkB zCx{eI>S0qt$U=%zGgT7c9|@kHFe)H0AXLFCPHBn2DW?;KGl5Z!5^5kwu%8HrBd{D7 z63KfcG}6wxFCY1BESanp7RYY>MBR;y(i+&6wxSFABGF^wKFeUOt*(FJ`HyHM2b*lQIcwUwW z5vL9skzj%psV@?N#=likN6(1*&|4q9^3{)i`YKdcJ>^00s{9S0et`6KFn>Y7$Sl zw1`Ol*lA>yLQ5lzG)i`0whW&6+xN|6l6Ga8ZH~FLH>Nzs z8Eq#5`JB#`^P&nX!6(ER z`hZMAxON;#Ww;7=;-2BvH3_1$vlcU9%8X*p63eWx${L(htq}OgxljKef~f&6plo5cK?E^d0-qyd*vN5A6_-p zzkF*fnIK4v{jCreYH0ZsMHJbCqKfw9K03Cz$i+uBUzJcIiEG|QD}`hUVUrNFOrPfj z#L&tsAE-$P=l*F$6<1Oz`+S|>_l$4Y`D5i(R9RKk)l^$uFRJfl4ZZS!E`+~zY_6p@ zwboX99d$x`xbEK8gG|GlO$o*-{)!w`K;7eTbgEOaWzf3oKU1w4Mj+~_n<&Tl9u zSTP=BVv>i35=tpUS;|obRZZ1`E($d}5?W#_ncrN9iGHRVW>9SglW$%bO2!oUO07UINvyqsuRm@Gc{ z0s^+nSY;o>N=#@+_W|KG0@DybsK09-=AO#q3Rr=A}Lpf}zf>v~e3vsCuolmW) z*11+HdYa?pd_5Y<1h$SDTJ1IKS@asMQJq^uYN_2g)Y*0sD+wR(LeKrI<0ENw8hu92 z{*t;o=-~6+*s1PnH+7AZ-Lja-7~SRXHTsb|^>2T=A5vU}iTn~K5{*0UWQ?7zcveGW zJ?&0&@R{9haiz5ub+>iY^MAHwplTKAg`$?xn*9@7lB>-TC-E&JBDG#OqA-%z+O8{a z#7%Vnc*(@JEn6>tv9WdM<#us3ge<)vu8#uM!^Y9y3m4?6(7J4^!lo6ndw&E=e3hsvcHdkT22NYv1f@F~E${lqQF~gM2RFl!#8Q|d@*a$;P)jR=AQf{6d-z+|XPL398b4%0!H-AoorOMPKsN5&ygAk?L| zGliiTPIT#-hDPnu)?JD=T_ykk9thi|bRhJYN*SlfWJ{Ssi&Fs*wy?QAQ=CqWc=z>v zlT&s4p6DNY;4Loa@Vka?g2SLdD2z_VrH2L4QD`_!2Vr(ISt!klqOc?52q+Nh(x-pJ zG8Ds!E?v{ms9oB+OVOswgrex9VY`$L^iT_rRavRfVTB9_Kv;+MkYkWxva8b=W7vZ_ z(U>B_v4A&H(9d@tE@{uXcRDogVvLwK&4sk}dga4TZ#@a)$ZI<&I-@&UVZ3wP#rt;$r-@ zO>s=kcQ%+Ynmm&1Ue#)Nfnq|ttD(pSoGh;>!%rP#=4!fB3|j}dRUlVy=%ySz`e^S< zVAujBHpNsx*&+~HXqZr_S`<vioLR%|60|S})w%csswc zXq*>m6_#*Gjc`YmU%v$2LG)BtBm=`=BigCwrg3OjxpkV?v+_=o9~~1#VWK=2Tn5f?MOU5_Nj2tU}9AlMQTf?Vk-c_ zKap*Tm0m#vmpqA1SNS?3?>C*ku7+UOZcS=ICQffxs>Ug2YgYqVwxYqzR#za+yV{0P ztA>h8%~Z?KSr2rgTIWz*5$wo_uHuAIT)sEYVCV1un+q{m;foiux<^X;r{Au4kvht{ zQcv6Y+aJn`1T*OUZ;y3H7dL9yj zADd&dZ($(D5*E=YF=9?OStFd8=S2Lw$!Qp(wKaFdRqtMLWO#(sDIB%H!7Xt}2olnQ zL4^o5A)+WP+OJq3sDOZA;6H)^Ef|G``HEoj{PX_RxAv*}s`BgpBgOzDBO+7PfKjId zN3f#F8U1jG3qAck?05IPW}1ofj1mh1%%f%^iUa@n1tWUb_id|@|7f8>3Zdf}T{XMh zc0QfHcQ4yr%YqQfAGYGuw|7FzGJWE)yftgO3eXN1PHd24OUBQJ5-dx*pU!&86L?SZ zTn-5rN24UOGCggv`rO~K}JYQe<>A(aKPtD^xlLm>~SO3`c73v)c4z7`nP8S zrfqj2mvFI{MZzG13^Is__(G60yzee+{`&(2-l7d4(x@yIJ#`+g)e%kGiFt()PLa1^ zT(+Fu``c%Y{2_{>&$f010Z!X{u4n@82*%C*Feg0;(`*||XA-cMivw8F*25~O3)a=H zLIgONLU{P=TorZ(0FA!@0I{1F{e)3$J?EmcPkrJSoPFFW@k@_7_jDodH+~)c55_p> z{nT^OdhY3GoQAFQQ;#|Z_g$WG+Szyl(96Qg#;%D&Gba}}4=*3TBLwWw;z&U|wc5qB zTS%A|5!I$$hfZB$_K542uvbz_T1Hk*UO`bwk6wNH4HyIv0m_(J(*IWKKII#J;9nFn zz=ldjRZ3M+8B%st-k{vBqNUQMDpP%cv%q!X9SC?r93h|3Ks-s}QW~hkj5_8c<^qe# zGGMJ^HLxzR23d1#3w9(sm%W$W#!=>2a5_0pIDeon_z{oJGvWpFp76E!GJcytB#05* z5qbzesWH_w)U4IK)#B6+sXY?eiUveaMDyxIstxsEI2oP`Zx8Pap9v3#zv`%-(~bI` zexc_h-bj0-Co&gV7paI`0|8{mEk7VK2;i1)VV)D=AnCLd627EkWhWH!_tcHGTB<_IJKdkd$O?he3xaBa#j}m(1wd z&4z56JeFh@Z$9Bm09(4!VprITlP+T9iIMM4MTkbxm?+0YEh^bJ3{xp7sZgP$LP<%9 zBlemLNEpopZ#c?JKH@6?K?;!&zyzA$0>xEwqR@y}y0OqJQ0Z&u#Z@aS+HA{nkXBnE z#jaJHB3VRxD}~K;%03#ioua1DnUHaxu|TC&J?DV&O9%8ET^oxr={vH^RT`3SY+2k^ zo=xQ?-llgWFIuJDV=?QLsZM@uXD9Gg)}3YzC@F*39t4$kX+&En9eg~YaH4xdW@O_Q z?QCbfXGy(tV`F25UC4WQV+GuH$%E1XxS>s7g(}3%&KJO_x?sWI8KGm)M#RwI6>_zi zH*~6{oxeq@HUO2cuOnCNvd3O;c-MOlJL=>Jru|u@MZ0^MB56ifr}|!%i%7ciM|3W- z*dP^XhePgQmfW=8e;x2nZjrHtQ$BFUM?S+$Ac^79OX}q)16LDNZi*hD;c$MUaLu({ zQ^Ro7ZaS}nSUa8Clg@C|NV=H@x0nGnL>wO-HF|<`ji$hyitU_4E~NBCC-_+!^zcQC zb|?$uqMbZ={Lg*itgoHxj`lKCXr+BZOT+jRZ=~C+-gl%Upt8Sk+g_Uaz2xnj>Eh%Px9LhNg_6~mw=vgOT>+aimpi%vZc*Am?!G!xqs zp7LSTe^isVHN3t)xc)}ZMF*4ltq6>I2r;S?10G3-w488zlx5Nw&zq4XzRXOH+z}8) z_GaN4;esIxfD`6{RP3>JVEK`x?@$Px_rSRo&K8_Y<$KHQ1!@?ObF^Zey|1DsW&y0R z?$yq7`^1kMs()buKs0{*iY%L$!sQBZjM+gROa=OtT-K1KSD+I{mfqO%2L$Rh)x;-s z)!4OrrheH@#s`)@mg(Q=;sM?QpGd06&qeyN0G@#@(eII^i@US>)SqLalpB*&l(FXx6uo}&PW^tExeu8 zb+St+oQ*=d2|x0K>1v6AM9lP?kkAM%8(aNW8UrkDLyO_*uaoD0@dL~TkclerOD3EX zIMtbiaX*tG$3#8Kv=}Yoyr!guV- z$1bXtnS7yh_A7;YrGAJ0NeG{UPdUT#y=C-3U#8Zn4)PDB({J%8aj@>O$9wq0H)jJo zw4k`skOyJtLyH{~q+>QCj{yZNus`7M_T%54tM>Ei%E=OZ`^vtkHcWn`=j| zq_|JAw4vzwIYzK~G=kdg7Hp8~XX+~M+pD4rN3?$~OU6=+xb%XS0vf8uJH^NYKS=(M z@YAd9wai2{`>SoYueGWEV15B>n4v158mg|7uP&xKn$Lb|dI9g#D!tcey!ad`3s-y7 z+oAfvL_IAlttT#Oma(8{-?@U~8&fXX2a96XDFZPT%Tr4%=GG2x)Fs>wIh(8%88ZB7 zoF z+5~K**M~$sb~h*Ot8>KY2j#i4QsI?nk`Bix0ur@S-e+Y>&ts!_Xf>TQpw!@}!hUhj zL;o3CfMx)u07nmwD^%{Esf+8(s3f~~8pXk3Wrvt#yf@2ch~cnL?HsuNTE5*3YR#L^ zp?3*z%^xs@g#&lVd;+r;08IxUcyB|Cs5m5T7IXayLG>dvhs-sq@l3n)Fx1d7^1Fvg zIgN+TlSaiOXP9y1l|D4wPWw>ZX+l62unC)6SixtW3UV4%;J0tc?@Btg8lttuNO?iO zkz%_$C25)WRVICo!;Be6(GcE1lXF$d9tS*^ee>b#J$(hZ#4Hf-Ii|Hz%ufJHK%aMEf{DWb)Q?Cwgt+Z|hIX z)^){UCXAyXt1Q784@0ywNtXpy+tGKky%u97h0%PUi37 z1iO+}j`Z4Qk5^hQY>|3ndiq_EgW}|6{+9P1lV@|%gsC~N*Jtgjf1LHX-FbvK=L@L$ z?YenVyLSt5$Bn3pg%dzQ-CR!1UWn!TS-4DrjimICFfT{ZPc1?*0KyC6%C$`yN~A3Bi99cOXzk@ml| zVL(12`pnmv%*7G{RVoI8QAE|nzMKJ2RKjYA9Rhsb8qM#PsI29;E;8mb5nm|&j3XwL z0c$my9~q1HYlEk2M1%KSKvZO)%P1ny5JH%b_b3+Ak;wb=Q{jhJF_z5do=f^Je@pM~ zPQT@uTY93WEQ;J!>h9b9lA4%{dEfA}F9K{u!wN(wB4G(vbU-%YyGQaaB7{XhYsQyZ zoNz2n(QTFGQ(RfiE84b`w^XsDS^lNsUm=D0?yqoILopL;u@PIb0(s3C_XOkKz-Mhf zWiJ&=wR{VEIhK}KdRrAN9xIWhtVm{`CRH)oGB2fOH9ika$~*p$cFUtOn!>4_dFMTL zmUZ6{UFxH&eis$u`-qr62|hUfy=lp>Ll2aTe4{$j>$P?KqM?uX$Z-z&B!Ng}_2iwc}WU z4dm_y0q*duc+-;$0Z+gJ%Q__hz*qnq;1qxcVC~5D1$=_5z1h2YKL_=ZY8u@7GXP{? z1tEa|1q#dw3vmBQas5Crq5&XJGX%I??gcN#oR-}1qNL%{*rD5Wm(J)uJ+1w2n{sLUIC%ovTSkOvC_cgq_MYrpe&gy)XP*25sR^;kbBKj~}|v{}p&dMIvq1 zPk$8#w56?WYkND4Hm02wS5m3#T<-=`Os&i`)6FomU6r>RHy{L{Z2$lOb^r+JoP^jK zJOEZ704z5FIToa!21=U&&b@)A5!fv0^2M=Cm0pOWBe0c>eT~5MDTQiZnw(TRqHC-g zIn|a(VB{AvOG%_xehKTfZxuwic=(GGQxmB9%w9dL$x7L=N+gU`U-M;8RC!KjaIN0# z5X!N0>)#nulsB7&vtX-|OC|D-yke5|OGCL)?z0|!h zBtOv5t!HH}6WNsZl&zoTd5`o`PfWQhbk4?a-v07n0~@c5g(0p0zsx+H!2>g4WCwl6 z4I>UpwYoG+l-uj^CWD9LSY)_;Y8m4mMak%FopuwTgBq-%6j0}z$stfZ5ekG`5OW#& z{xWH*iLA4*%b5&LtC!+%8B<2B(Gc)vua(p)8j(kJ4;KAPE528 zf-CSmti`6)T8sB*`225n^YHKgNIRNbw*R{aSyeRIR{7L#pdqAz-ZdRiy558-x3Y@?RilnnhGt2~!70HDQN!&%1D$OFg(``%A#k-C+5*KPW_%RoC=L{I!8vkp zhITAI-;{e7Of>v<+vXqskM3;&N}NG+U>`kCH!VTxE>;`HZe6kJKhJXh@f zry9T%9gNFdej*25;7a_Ag$B93>i3Cfr+b|2_L34JVFHgVNyi^-i)bYN=iXv0h{1&$ ze6>#)m72_HkNYp>ine&zJOR}*8-w1nOlj}BM){zq>yC47Ct5;O6J~0fZFdT}ugisu zkoLT(6^vYTdzA|ejNwTUoHPGXaG9?qL5Nj#vGHzKS6X95E2o*+>q_C@8HWo=|J~F>Zf2oKeq8e30m|fnXRo)rR<4#KMFXXQ@u=-FAHFmH^xAiU(t~(1*sOfz*4(j@rWY`P=17 z1J^K2k;xxH3@A6(epF^HBMY-SZnpfHrg>yA;G6ZFc{i*?C~q)^zVLkM+uk~f>7Jov zP?Z1~t?n&m>`Neu@_mjA6+?@**|VzlB1Czt>(FG1;o^3rX`p!KRT@{J{@1J8!OS=K z8hLWTKc|}wf2{{_dBmLQ4ffyttjQ_UXT+6V@i0-wr2-Ea{1FSBBxypE88Ru$MQ~;g z-Z7|_<;Nn^$`Bb^s`oJyW_;h+C#Q_E4R2Ep1*XFwbcs1|jiVD&e_UL)5JwCYS@^6y zKUdeP+W3)DLPv{!#2CjB8!nNdXlCi10id@zo{d<+hG4>gMK1hlaP*I@bP?Sv2CmjP z*@Y@HT+0qvBFvZ&O!fc9z|R@|nGF4N3h_^C11$-h{EPru5(aVEbrFn9jLd1T@}5Z! zi4&CI`x%1DDYjKjuh-ju)YC;}NJZmw;K`s>2zh_nJFGkl?0I11>rq1XXp`{6JGYJL zm9K^|*~3kSsc1h~Q;zG+12YbLl@E+_x&Im2IQZ{Y1YiAPg^$i9RIhTVBl?1$ZRV97 zF`kXl!YK<C@N5LR7YP&zl zy$EsaTc8LZF1<)-_x&xFlJv1akLZaa)_1e@mCBkK|1#`1MwP~4dikr`{5d^^mBPpo^u!*8p3)nBXs*+%rH~; z8=8=?ezEMb_e-g#x%@sTnRKzMM^C`u;3EcL_E!PsE&&UvTBV7MP}LKgT<9>RxEYT# zo1MeR=${O|MZIx)7I$!~({8Ycy-BUjJ>7Z-BN)fMu30*R;ek@0#VwlKTt+-?R@QIN zPgQp?K@G)JBI*3iW%rIRGcb=rtaag|Lb~h?)8T=L9tbYH?imeYr~}JRwJb1bEZb*f zG{=SWghOUqna|0e$&-e`dvJ_|y3o-tnwcxFV_2Py?fxWcHi||GQbO9uTKT9Y5g+fF zx&g*)f$X#ipR6qB%2S+2su~}%YBvVd8i-D@2Zj?8 zVbHc3dzH(MA>{k01-UhP*lB|_68{~Ttgntejn6LGf7eb=zH%_VhN?(;bd8}LIO$qZ z)Z>Iq{V0-3RHhP@4f3dnPGr1XL+>2igB~~~5emr0?Np91HbjPCK?aBoubACy8{&HC z5$nd=bjJ==-&t$?^66*MjY|0qiWo?H)c1;ZJL&S`^}ejDPUkoX5_eD1EIEx+`If-J z`y#XdY&9y|cW>tL1vw3%g3`Q%i;9H7q*;}`BMWXP z<;P*o>a9Ism!6yQ#M}qy`b*!sfY6xdyR9|F8ySFPzh&1K15ml zNDC~8?n7C~DPobt#5R)iFcR#d0LcuTkySxO(Tc6jW(&b^q-$JcAp?Qbmq6|eK{IW5}c_8UyeRM(SLH7niC%BmPQ^4)SS~g;$b$sj=P7 zmqJ8!6ox4HbeTT3h_VZzcK!@cs$OSgw}Fx>MBm0X=X5p zJbcd61KNM%0$!AJ=ha`lpyweHD-dwZ-eX}H$H2J88y{y(Sawu}UvjJqbv;EGV<1^U z8wVAzT4e)+BpM?XVjT0YJ#;j3n{4uM2!?Bj+`Z^G?L>8Vlm6;X347qdAvMsm&espBjD3YhQj zXth9Klk6IsSyb$w<1|Q-s$w5E*C&B|(?)mPL#W`ALd9JD5@c zIozShV1+ua1Kh8R8hlG&-%*L2_kF-kwV%uKhqdzDVWvt)yS*DiXrfg*;@b3ted}d* z?eMy}P`8|QiKcE1aoqPk=MA!IrTft1R~72~n?E0jhVDqt-CpI-jb3vXw^u{K-DjKu zHSp@GZS6Rrb0~BFSnd3DP2J`Szh1@H3%kH>F8bja>H-kaihdA92K7M1#E$#mTtEvo z`_V+=Z^-#zU;BH;whrUSo<=jFBD=jK!~2>L-Ep!cQi5L7Va>B^uUrIw0+)4fdPOgT zCA1;kcwwHck4Aq-j5fK%n85U@UM5twpoNb@%mm`b_6SfYJeJGr{-SIp?FRK`yyhac zKPzbv=8(LbNzsx8f(HQx)JIEV<)+_@ZP)}0{fkh&@H$cmWO9=?Dq+K{22=Mhm>N}w zlkYYOmCcu)5fMr_KmTF#xpK9dn*uyfgFu%;hP(R!@3v@ZxUJTo|JLC9xflPvAU|i4 z-+ga)^xOWBawg?O( zo7a+%P2)jY3&)#Km7@|zA#O&w-eklNi)!wkZA&<1@a&-ymK?H+kSD+_h(1L1t9^uD zei>oXtn_7n?2vRbI~XM|PF#Bf@A%YV{QRMnAUj~rb=r|L%87dceR zP}TadeYQh=r>JE$$VDy2tJVpW9Q@c_RX9BgN62#2?bNMQzsl|zU*TkVV>PsN!la{w z)|@y#BdUHhWB;~Nnb?#n7#0tPMn7)ySDpl%i)L_x+`oV$P2w~2)M8XCTwBrJ0vBt& zE!3@Czc`R(a<@Gr{0YR_kQF-*?L`@3u#Qx_$vy# zLli4RC0o;{q*0L?4}4Z6hgi#*lJ3;^6L1Bg{nESieiBQacqTGpXs*6m}An z#qm7|U8-y3aX zqkz|68<7277`$O183lex4ciklHc+f6lZ}p%Lz(M=jWPm?GIV0KG zweIJ7Wz_ZcKfGoW9M4~?)^Kq|U9mJ3}{?7aXMqgl8U{41I24YWRSAeub|Hz~g)G&k>PF!tn zPF&3kHw=-WGU-2I>jR^frn3vBQg-3e^uVa~VAG-SLc&tE0K=*(b%j1jr7~wFCARvY z53_;BUbL|iscigtZG!RXE+s3)BURd)6}#y4U2&6i`eNWFx&hr=$9K}dF0v2)f z$+%O=U~6Ds&V1hQ8}y?uhG6BChi`^pyCB2YV``;f_lv`KW55@@u9`EpGt94gU4R*@ zR&**k=ovyLBhP}TRB-U^jUeEKRAiMz|9g3h{9X|Pq{x)h%iEh;`3#HmYHfH1eD(ee zjAD3)lC}Hse1X@rk$Hwd?r5b&3FG!cu&ve;~yLqFkO#ooHSvvOipSXb!7^UKEQ)tIILF*+TO0Vg({6$ZoG3#$Z7K~>>)I9T}l zN^XOG2s@#0s(*(uO-7S6rBJCUO%hs|KJNKR6xYU3d?}T zbohK7MI|QULG+}Zz}(G(0rl=M{&T)C%AA2=h(A)8M-`s`W4xmmVpsqVC>aqkXOUS8 z5dtEi07R8}2f33CzTx=xQ#KK4Sge2{?v}NDX9x@GsL4oYL3@Ny717YiP&6JaV=@C2 zA^s))$d}dYA3Vo#7ml-5p66mw3^Z`{Acyg)l7GOFu0R$1R7Y-yJxDwpZYX2RA$h{T z@jMP~@F5qOyEsGRT-< zlV#{GQui0ZbJE>+i=aZV#n*k(Qvkj=d^d(_i|me=QNa-3k+rBYR)06wEZY`zeTA$dnI*ZbvDb>lvZ`Ft zZqG^v3phS}(?73eRJ|#FeH!9&pML$o6IdAZOb=}~+;l_0+q+7y-H^w_U(!lC#KWK% z==QzyFnsOC9avz=y@T+oye{A$Em%5X2S)DIB85opJ+O%5+y4jqr12G~f-XMGKk}VU z|9*sjR@_hVG#~gsdx-uw#8BCuvGgfgfeaM|gf2O1)sK2MOEk;NZBDp25Fajy24v`^ z1A;xki2doZ+@@UpL&c5v+vg9@KZO2eve~_W&c1Xe32<@nZCO=%C<>uA=~c4Z zFpskF)E_@y6VLC@sf`qCHwI1!sV1&Oa1*#nlSc7&Qru`#i5ta_iIooweA5L@oSWT@ z_87N*ap0a$(=Z0b@($%$+~k4>xRMkP53mV^J{(my2ENi5_%XmI1N^`VLf+a&W(b-D z>aT-rYYT??UCA|=!Oq6%D50t|Ro;hYOWj{v@Yes5z}22j$fhh#g6@#tcFsy#(P&FcFjRQCo*)dw-bV{^qy0{ z#GMLV2D4vGCa@)R<)cT5Kab#67@eG!6=mm6;W4?>yh*Q}XL_fahKcx{7* zh7HL3^uLr19`ihZ6G(8-fNcL;Z`dgkiJU=anvrHF3NN@CTTCX$(~iaIlT}e7lrw+C zx&}<+TH8Upqcs>hWak&17vB>U)Dxd9zpMqw2(a@po3%nv&t}VKlb73wT^uZ}6GlUl zhSDLys|0vWBTI<^AJdHBpo1>HS=VZkYJEG;#u>?9!9a>YXJI7$=O0Nyc@5uoHfG}% zemOm2DE`hjIzs<;Cw?e`Ue4dLF=p15k1)Pnji2$MmqW?CR-v$!mkgEDeP-gXeq(^) z@_w`*#MDIZ1CsR{7dW@$hubcl+*y*Fv?eJzKQA%Y!qTll7qNBsl*zoqR)y=k!;9i{`X2M}o8}St03$@s zj6ad!|Byo@avu5imc4tW3G%%F!8dgzoIb}>aRT$&jvWM^rg z`x?xK&)6QnmUFzv4g8P`cmIQ^$*J|0?Nr8$T>*nVF<8uYV|v!Mv8YMk8>p0Gr9_Hc z$cgh63Rkaz)L7dXO?ZP}uC*MIeZvv((kJfNjEk8_o71rUgAjsh1tK-|b>PLc8&7oL zHt^^36tvq1M7)tNUgwve2a76NW!O2=k&YSY(*s#Xzw~71 zo>b~EXWx6rH%yug??%{qK5$C^@g6Arl&Gz}4E{I+9H+maHZ$>D6t?22HPSUG-7n0f zW;+$PuLiqba7uW39B3h?x3|1WO^*8}XPT!pKmPckmqASZsYArwk3tUnGj*i8=~53< zC(~W%uF0UY?V+PtS2kZElR&!BRB9T6h9paq8`Yg%=DzMk#_VOS@3NQUpYO=%?~6YA ziKuhVvc+0&S26-dRtFd^rrYW4M8;hLj5uuX@@Wg6O(WXuMS`+u;4xpc#< ziswKzearUeSruThn4N(xIPGAgw64@~8f`qai-xjyI4z(VU~&38G+12E3T?W`VqI(s zWd(;az`tlh@p!c91wMHD0j%eoleX>UWjs86Zs~ZLPRyxBce@1B>w_w+{g%PWF7t@66k35k;@hi3y~D4{ks?IuH96M$GYJ z2#JJ@JYsgvw^X3~{Vq*Py*$YOB~_II&h*@t&9%hh)Ep*;76H}*sw4QH>momslfh1y z7{4zjUo4}Rx+HB}PtB(7I+#9O9#e@_3Q?huF&PLIHY9>WgT*dUOOrq(5;V1lf@6U- zwdtN6z~)70a9C1s_79cif$|HL2@g$BPr_8TM`gPJbH8Rx^HjDJ^i6OsaJ*}~ZRx?c z$3F0xejFbK2X%=9yAlbWl1Zvz?$L$Jnmd?$%plwAe#a1hdn5~d!2!3I^UQ%kEUX;-q z467;^1%^dNhiy|rycNyt$%-H}+yZ312n+U041T>TM%M(7TE45g2krul{Afj5f1rm+ z$|vXy`4I_zLplT^o5KWRge~UbESngC;BKKK6vkRHSZtwPwkoAj%PiYzw06rfDy`J& zGIeHQjR>t&1Pnw}nudObV3D3SXgJ=*LcQ-l2Y{|9Z9=L7BZCYP!_t55g$|933oo4J zUp}kkz8_bKuB+k1A6Sg%)En&wIb}4pV>PDjqNyyCy9`pwPb(t+eiTx~034r==-nLv zQ7YUMw@E_0UYq7SnFgxJQqdkG&zvj~@jK>O9r!zO`3*DyR}nBwvByK`II6 zg6V&=fX5$y4(vJwqY{$hm(7E zpNHP$VSR=h+2NQ0*@SFx%z;eVi~%{0ait8!VdhZMaXO8xzyEuIY;qKXnJWCJs!YUv zRayc?$>z5#ph@^2av?c!w~(YJpPdmO{c-RLdWcjo3y=bf3gnE_11S%E)o&>u4W-fk z(?5=15m-Df7FcKfML{^7nnBPweKA>M10`w8=n|H`0@O3!D!;wFHk)8BHQ2en=!I|$PzL) z=b5k=PgXW-c#)UKm1K&b%bP`krLeGH@zFTsuF83}V#tfN69!h1r_Mi-`PQ&g;Pt?3 z;P6S-XgY++m>H+vnT&;aTm1!}#Pu%G*aOKaWd(%;}bsE{j2L$}$S|kCf z)wZq~y|J{j63|+VG;5RWfm}_?5!v&`b5_KedD}T4w;0&Bfb8mzXti{W@YCbJke@9j z+Pe@fr-eEf>4-VF5cxK~AF=bL`|~A8v7{vyyiYa|*kgo||rSF6hSLQG63ij=* zAiWRCKS%E)_gW?tFPI{~>^Q|_6fxB*?cOkcL|qXV>YAj#qJC=3J^Jwavj(E^<<*7(pdJ@6a6H#Qk^!|8GUL_-)pL*;+8-? z=51ZTqLsO@i>D@NrGq>-8)z7!zfiCNvuBld4&x90SDQ_L>EB9r zF>E7=3=pMJ7lRGY3qR?;p+`>+(fyBf0=1y8Zh@ZjvynO@p`1b z5snZ8h&_(#g1vjA6$&`~I|Yb9*vk_z`Z9VkLX3}(T7|n=Vu};vOiOO!HkFp*|HGVr zsA67Xc7Ha-an44{a%I5|Ob&&d_@yd{OQyi?RnOLtDG8WNlH3i4bnbZhf(|tqZJm-q zu-BWdc1`2}?5{OT7+&crz{)X{8qF#SwNp2l8u>7v%?i>yjfrL36KT3VEm?PfN*mB! z5d3=>99Qglb{pX%($f22Q7+n7$``S-b%uBg`JVzn7qS9A56vYut-Mli%J<{hJK&*3lVJzeX60kzY{^`a0ea_$kNi`_Ur& zC0z>G9EXoxg9O+TobzBY?I@$!IRflFvr{uw*v+uq#`G(31}$G#Y>*M)2AGo@0x%$J zZ>z@FF*z%otX<~r0k1zrOjC=L|Dk)$~e774M*L+{^+u6%bMJ(f+B+r-3-gV>^s>N%wt`^ zO@!OA*%30ABzDDPvfA9jrwzNjAgJjyIjmR+X-?bcBE-n4H5zKo4!tB=#KSxic#qgv zmZX)CwE1Mc{{;L;B%pg|Yxg|A?Z$U=qG`Zci@TWjIehbsne2mx*^`~X?9ZJXlIpf1!|MZ z9P{u&1WiZHq_R^;6<|s?*5@eqCs4@9wO|s_>fvf4!X=pva(RDs?(vvgXsgcBF{{#Q zq@YBJ`_5q**PWC~u_BS;KgE&hU1_s4N9slAIx0zV)rLsq3`P+Vm_!|f;YWbXr6s>{ zy)~Ob+C=B6TTp>2S``H160rDG<89f) zf6r-Xocs4-*;|dh126DxUm@XJ`1~#5$g2z3W#IX>1%-MN)bKw;R07`V#aNnkEa|X} zF?F|6j%OL4*7O$Z$3d*zfgiG@WC?QW=g43Wj&^(LoBCDWYBY=&jzXrELK8_c4!3r> zi5i89FBTQ2@KVsJ4&eu;kr~john$H?Ad?d?S!7C9@F~nR-}4nkYVE=3i5Ea6I+KlF zVO~O%yhtn^#pXXmigJ}F7f+##UzGwfuIIMw0p`fp>vf|m%4y*hQ{kxl zh7q*qqKG+!s5x!IDn`g5J~LsRk1nJw#@*nQ4RvsG*d0Sf2hO&c^O`&8nc2I(`vxaI%D57>K2`;FH7Ar_Md_l)+z}6rU{^RziDzy5gPAyhW zq*4-apzQ}b&bYsX>| zy`ps7rtA({*~Pcts1+~Jbq-gNdswNnV&iOe@V%mW-M!9eq~&l6mG~tjXCN8VwqTqX zk(|Iev^eRs2;g)WYWazcV3Gf7Bhh84Y$!r(k_ZaqA-uzZ!^D6;>U)LaZ}Z~S`}jBt z{D@VNv9&s9wI%Fs4{p)(xViA1{#aAJQV5#G^H$|*pd<@>!)D}IDFm80C92B&*NEd3 z>WTH=a={uUiV{xY%Df-+3$`Fok4Jo+SD{e8BmxWoC#!^?pyEG&n}`Wn_1n}jF_K_E z|HHe=18ZyrW+ciTK}JYNy6*uh-xb(!D^L*Vv~Fliq z)_9ipE7|Q_pnmwz$1kF+J4$_ad&hY1_R$XqxSJxomsMnkWxEl;ISfzx#pIs6H7w)%TpM9W|Z2A-)yF^ZP3l%e#`=l~>L)=>EdrJE(AP{5OXsToTXJm#T1j9E$0?&x;YU&4TVjhq7z%o`U^U z`N!*{%ZHWbAb+}r$sQj_;;_~{7-K2hVF`YN$^;_2+mFD+$d~k4v4p#bOCKqSM8(6U zL=HXtrg*dzEZU2%$aifoRhOxkZr>%pBD(pa48v0i*NJOk8N8NwJz)x7EeqIMfY1Qw zSU`wrO1~K92#8@0gHAxFr+QH%n9Ea2n2WLZD@*^`A=#M{Bb23$9Sw9OzlD>34phJc zf$b&JuL`TMSrJKPo1PTTO8+mN##v3=H{B;gmSeji?UHH>ZfytPCw*=ETK94I0pO%n zm}L>3a0~N~HtooHQ=JLAL~KjeBJWP&Ztmu8Puum30%th$Nrt57CE^m7yhPqFim}Tg zeb5%I!Ql)zXeEn#3+)?AH*c+RlOZ@Qzm1@zIvp8m(D^61J%}*!iYS=cd*; z_^-g$z^Evk7peA2!8@u2Oz2iyIxUj6- zT?$`75_Q|Spf}a)=DF+dQ8PWQJ}z~qr!&o$#H-o3RF`g?+vu6vwnLZ2CbZ=Y9x6kB zeddhvyyaHC8%P;9 z_f31Lf7^P&rM50Mp{-}|01mVvdv}?6G?F>HV1DH_n7?YK5Z|3l(VWV2lnMoQKy#s7 zmcxe*+!0V&K?|Wm4p{`5@nRO#iJ9TVtvQuFFbr=VUK=`QAz=Z0tn6{Z_Wv5HCZ{-@ zHaH89hfja92hL3v=FGPPg+R8?@rbT_<{URZ_GwSN+PUu2JObx)5t2b z<7u>`9qnjGJKE8Xb`(WX6h%=KMSq|_&>uLcn<`qPK3b-cRp!?m^lJ|4ri#|6kCsD` zEaqbkGuUO9{*vNBmm{uYpj!nrIgIoSwhQRDXh?>Bq-P`-K_OKSFE^U-jmFV=QwjaK}BHE+}G-78;*lvJ_2LR540T2Z5M)0)8 z_17l3ZsqTM{NKOb+nXFWH7;*!;7Z5+?^c5R6!LfBm7&J=oqsOe!20bUc-5&D5JVaP zoRXIoZ#jx>FT1vtx3pK{kuwjsb}!5Gk=rK1vA`2X1A!(q8QIf)K`(WZb}PA6Aj2_d zn^`#X%-8E-xGg#H%OTh(g*;52!A1sia`8m3Ye(9;&uMWsc&lEE?W1S+sW!EvC_xRVk@AmvxGxmcTzWsKtf_=;CCc zJm$P3LPIM_&eVpkB*|oz9)$BH)FAC0&;YNA9E%>>i2wUT9|0phFI*~MKdY2sOWc*+ zrJl$7pHTPieF>*OKL}Sf(?a0bjjKlMRh}!qkdN?Do8CDSEH!+(JLuuc#02p5kh8#J zvc7{(ISZT`sY6FCiOKf_b%fgu8ir*>UW}FlJ_TVY=a@!!tw zEqP+de0jJ79{g+_;~sCBAw>39Fp$)cai9bGVSsfGt%~vR2v6pvp>xP72VQ8twytLD z5HrGUp_q!58~UMRdZzu(br16vjfCVpljFH5wMcd&gET(${0bPHXwe0JxU_3W>2qkM znnuq)AKBwAQt>DU(+4wYEt%jj*E_9yiHV8uQKBnzj!4-#CGwDSS?&S%^0O?j7=+)nlvpYo%+dR{T&%YA zPjm&EC5fw$bHm)zy6Nv}uf%B(z8#=xlqS5mI^{z|ZNxbumCxa(;34M*aS!6S$5UHH ztRQ?cfG+pEy-&(SHF0zz+(cAYoFh{C94-tVa&8d!AdY+7SrUwd?)V=m;Jzb1EiASNdAT2ay!sT zT*6!(Dbm4oyP46RlWq%V@ya7j=*(yU+=XAw0=OYB(u5cI+J@GRx2#3P9(n%z_m_7v z+S-OYdFGFQKLJPpDZK{3?O$ZW^Z#pL;V8}5?EO3aa356&RL7Hu4~4s}FBnwQR* zvW4v+~Pd*Og z5U?~^qDUhM0gbl2psQ&d2ZD)@IyIAQ#jPPp#HI5r;|x_srS3B=`*BRvT*i4I6}i^Z z1ZKSo!I@-}57XdFAJa4j+-MAHe5_IMQSNBzF*(%si+j;v^cr?6#kGIyj0yFC7AD#hV`^Z9S)w9(| z%DA*gM)?r{6hjO!Xnuy80O0rJnf>s#%pq)>V-JAs-d1lRRo#wvDfW0Km^U0mrS5nJ z+~kGch(4A&^_0Pgk_CrU7mJA_^l1o8QgI|N8|;bAEkQt4RWi7b(A(bo?cRnXz*T2q zf71T;%6a$pet-OaIjOkxe*c}h=G0!o647+-B%TADJHEBu*h!t6HOuv9-A#*pBlEZP zezT=5t+x{2ZhR@Y8Hp5Umv5}8_qV0mJ|>;0t2&1!`?Pj0@scNiFu*&*-M9i@^S_jD z-kt=j%vOWFjb##y!sQXMi-xp_O}=#+*&*n)BNp06Ez=j6fGOTVkZnI>`bUCg3mS_& z`-Ogl+gtuhJ>BmDz+S5c@HO#;C$qsGn0CDX=g3bM5cjj4c`8lF4yyq^4uZYnLSDB;~$UrnY3_ z@LR{re&o5Hh!Z8_RqN}a*3~T*bH1C@BlO#2qqk|hX<}1H=~9({e$tNz&2+v<2V}_pcL#Nq2-06SBon z8sUMkcHS;hGIXgAg^fb=Vwn(EE3ApmDVR)bTo{E#*=?~=cSSBJ_aG=*QZz)^foKg> z4^#)L0hB~A%|nzR-}C1g*$vke-Ak)xHfGnW|sx-5!2doF*MCQ;yopt;4tht9x~1W zA1s3ixayC59bzw1j4}2i#u#H1@%yKlnPz6QYD$@xGT~p1Z^C7i1B87ddBd zMXJwt23<;P8R~L8wa9WM2YCyZUb(@wlWMbUV>6-0t3-AyLwKpJ>85s6ZI$cW5MGXt|4FhB1U}t~tcVKY-ZMmVyNw>SOhQ05Vlc8tjF5Q5 zL^7vHjv3U58dW1h1`{U|gC5%0SYUujT1W}U=d}8Izyh>Pal&>0dx7Y99H(cGmp$!A z7{;DSLmI+PY=NaW|846Zj0tD7K|r}&P-zhq0TuO)&&gLE%U`kjyWguk`@dPg=$?@O zr|!{v-X_9P4oR&uAGuK1J$k41Ggf*ZJJKNrN}MAIm3U`I)+SLDweekii0^rSrQg;$ z0y`z5z~QnsX`8xcBf}!udq6(IE=1rx@kl%)@Bxsv z3s9Mt3b4E`Q3%lDf&Y8;{yfW~(3%#?KE4)UfC3Vd)#*b^SZ%FhZ)&YEbXp-aXptHz z<<<90j4_59M-6k-Fk+lzj&cmC<-Q!paU6Oa zGt_c-7tS$DILa(_j8V%dGaPfjoMVm=LnyVDdW?A1P--b-giu1AVKe{+=PYuMpiv?^ zWFgPU|C2!2t~hQ}NGU6CoF>9NfEJT+`$V?I%^?)?PuC8?^2p@E;*S^pjxWZ4$Mz0#F*MQp&qoe#`Sx!!rH`cx_ER0y9S$s^dE zS>PF>Icun(#ViB@Aw-B7vCT#%x)F#N5yT6nK#dk_uSN@XKP%T>%}z?~YI>sI-g(9E zuO|@j`?;xF!>rNTK?s?qZG!6G`(HQf88usWOh)`fEDwTMke}N9oV-8D0l~6x=PZ6Z}%_RlO zfAdMx6lg?XC-mfQa$Gk!DG&hgzd2R^D!tqcC6Fm80T|YJdoHj?cse1L2%MVd|Nqhl zPUGaH>Tn9kUXS89Vks882EqCp{sI_)0*CH9)_1Jv=*Y5MB*-nP1QfE*5Z)bywqO;? zcNXHWkFXkgzQ1SZ{+X=t+@hi;p(u(2{^KDwf%ldGk;{8fB?1PFJz{G*tfi>k{ZE)e zBAG83YYX+Z<;N5RgQg@{ZaQ)8eK1I-9Fxmn6W4HPd<;KZ`J;+ihg(&66;MR60El3L5{n>dgQVFmg0u`l@)$*cHV9H4ijsUttAq5T?4M-) ztWHJJ0j7R{(`orG1&j>o$1T2dNx2#ZoGMAtH|8uv{r z0GX#~p8_PEQvnMLVrdB$kOY_hm#W!P=H<>IhN28HHLduuizgAFcp-{9(jf-^-M?56 zpfoqU5OU|Dbm_LZ%54o%j-jaR_o=ydcfZy)66cWS(Zx{IN71>cX)2hVW$;Psl=MJ^ zE*GtJB;iV?3XzAWwN_95gEWY?dXi|jODj5)_}frRff6CX|Ea3$KOOKunU+h1JG>#C z9=7n}iJLWgOtK6RMfyXe3Pril9c~@&bozm`ANf;>R4S#nOGi3WN?FFzW@igUbR&5% zn%k4olDK8f$^--2(Tp;R4I#_x+V_SrS7&86*Y9$m;$|tx4t)r>B5xA9er}->L_|W6 z5PbB}op0q=He`P$y=HG?f-u4eA%rl(m?69E*E@SzTNSmD3H=+WJw=8>L=s6vBoPr2 zDQd6wz21NRP0Ri6eV#{cwN=%qsxdbrVu^?tB}^~<0S$1%2On<+eLd<*{f6%dMN_jz zYvf40%lG2XEMtC23LC$&UAmXLKI(IfDion8iaZD*6fp=d_xUllU4vn@rrUdMiVs80 zR_ZJ`>Ex@!9do4#*YbJ9(s&{Wj}|Y!191j~TN2~5N$ODieF;qLhX8{0fAeF2vb-cF zUJxZ&Q8j3o7Q)1F8$w≫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

WChu}hT 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 Zt~emFYo&}!yR5z6UO0X;|N9RXFaW>2e8>O* literal 0 HcmV?d00001 diff --git a/openflare_agent/internal/nginx/pow_static/css/xess.css b/openflare_agent/internal/nginx/pow_static/css/xess.css new file mode 100644 index 00000000..67a0c4ba --- /dev/null +++ b/openflare_agent/internal/nginx/pow_static/css/xess.css @@ -0,0 +1,149 @@ +:root { + --body-sans-font: Geist, sans-serif; + --body-preformatted-font: Iosevka Curly Iaso, monospace; + --body-title-font: Podkova, serif; + + --background: #1d2021; + --text: #f9f5d7; + --text-selection: #d3869b; + --preformatted-background: #3c3836; + --link-foreground: #b16286; + --link-background: #282828; + --blockquote-border-left: 1px solid #bdae93; + + --progress-bar-outline: #b16286 solid 4px; + --progress-bar-fill: #b16286; +} +@media (prefers-color-scheme: light) { + :root { + --background: #f9f5d7; + --text: #1d2021; + --text-selection: #d3869b; + --preformatted-background: #ebdbb2; + --link-foreground: #b16286; + --link-background: #fbf1c7; + --blockquote-border-left: 1px solid #655c54; + } +} + +@font-face { + font-family: "Geist"; + font-style: normal; + font-weight: 100 900; + font-display: swap; + src: url("./static/geist.woff2") format("woff2"); +} + +@font-face { + font-family: "Podkova"; + font-style: normal; + font-weight: 400 800; + font-display: swap; + src: url("./static/podkova.woff2") format("woff2"); +} + +@font-face { + font-family: "Iosevka Curly"; + font-style: monospace; + font-display: swap; + src: url("./static/iosevka-curly.woff2") format("woff2"); +} + +main { + font-family: var(--body-sans-font); + max-width: 50rem; + padding: 2rem; + margin: auto; +} + +::selection { + background: var(--text-selection); +} + +body { + background: var(--background); + color: var(--text); +} + +body, +html { + height: 100%; + display: flex; + justify-content: center; + align-items: center; + margin-left: auto; + margin-right: auto; +} + +.centered-div { + text-align: center; +} + +#status { + font-variant-numeric: tabular-nums; +} + +.centered-div { + text-align: center; +} + +#status { + font-variant-numeric: tabular-nums; +} + +#progress { + display: none; + width: min(20rem, 90%); + height: 2rem; + border-radius: 1rem; + overflow: hidden; + margin: 1rem 0 2rem; + outline-offset: 2px; + outline: var(--progress-bar-outline); +} + +.bar-inner { + background-color: var(--progress-bar-fill); + height: 100%; + width: 0; + transition: width 0.25s ease-in; +} + +@media (prefers-reduced-motion: no-preference) { + .bar-inner { + transition: width 0.25s ease-in; + } +} + +pre { + background-color: var(--preformatted-background); + padding: 1em; + border: 0; + font-family: var(--body-preformatted-font); +} + +a, +a:active, +a:visited { + color: var(--link-foreground); + background-color: var(--link-background); +} + +h1, +h2, +h3, +h4, +h5 { + margin-bottom: 0.1rem; + font-family: var(--body-title-font); +} + +blockquote { + border-left: var(--blockquote-border-left); + margin: 0.5em 10px; + padding: 0.5em 10px; +} + +footer { + text-align: center; +} diff --git a/openflare_agent/internal/nginx/pow_static/img/happy.webp b/openflare_agent/internal/nginx/pow_static/img/happy.webp new file mode 100644 index 0000000000000000000000000000000000000000..40b979da671d2d0c41052b68c4dbdac9202b98ca GIT binary patch literal 30584 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 X<=PYEWUaG9Xz)+2mG}iqm;e9(D5ZSp literal 0 HcmV?d00001 diff --git a/openflare_agent/internal/nginx/pow_static/img/pensive.webp b/openflare_agent/internal/nginx/pow_static/img/pensive.webp new file mode 100644 index 0000000000000000000000000000000000000000..e26faefe6d2202c351f8e782268ce4b4c7e715a4 GIT binary patch literal 28904 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 g4`rr!*mo-Nl1&tj+rkD|0vR&}6&pDYHSy9T; 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 + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. + +Includes code from https://github.com/aws/aws-sdk-js-crypto-helpers which is +used under the terms of the Apache 2 license. + +@licend The above is the entire license notice +for the JavaScript code in this page. +*/ +(()=>{var k=()=>navigator.hardwareConcurrency!==void 0?navigator.hardwareConcurrency:1;function n(c,b,w=5,e=null,g,u=Math.trunc(Math.max(k()/2,1))){console.debug("fast algo");let s="purejs";return window.isSecureContext&&(s="webcrypto"),(navigator.userAgent.includes("Firefox")||navigator.userAgent.includes("Goanna"))&&(console.log("Firefox detected, using pure-JS fallback"),s="purejs"),new Promise((p,l)=>{let m=`${c.basePrefix}/.within.website/x/cmd/anubis/static/js/worker/sha256-${s}.mjs?cacheBuster=${c.version}`,f=[],d=!1,a=()=>{console.log("PoW aborted"),i(),l(new DOMException("Aborted","AbortError"))},i=()=>{d||(d=!0,f.forEach(r=>r.terminate()),e?.removeEventListener("abort",a))};if(e!=null){if(e.aborted)return a();e.addEventListener("abort",a,{once:!0})}for(let r=0;r{typeof o.data=="number"?g?.(o.data):(i(),p(o.data))},t.onerror=o=>{i(),l(o)},t.postMessage({data:b,difficulty:w,nonce:r,threads:u}),f.push(t)}})}var P={fast:n,slow:n};})(); +//# sourceMappingURL=index.mjs.map diff --git a/openflare_agent/internal/nginx/pow_static/js/main.mjs b/openflare_agent/internal/nginx/pow_static/js/main.mjs new file mode 100644 index 00000000..7f496602 --- /dev/null +++ b/openflare_agent/internal/nginx/pow_static/js/main.mjs @@ -0,0 +1,32 @@ +/* +@licstart The following is the entire license notice for the +JavaScript code in this page. + +Copyright (c) 2025 Xe Iaso + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. + +Includes code from https://github.com/aws/aws-sdk-js-crypto-helpers which is +used under the terms of the Apache 2 license. + +@licend The above is the entire license notice +for the JavaScript code in this page. +*/ +(()=>{var I=()=>navigator.hardwareConcurrency!==void 0?navigator.hardwareConcurrency:1;function _(e,n,s=5,o=null,i,u=Math.trunc(Math.max(I()/2,1))){console.debug("fast algo");let a="purejs";return window.isSecureContext&&(a="webcrypto"),(navigator.userAgent.includes("Firefox")||navigator.userAgent.includes("Goanna"))&&(console.log("Firefox detected, using pure-JS fallback"),a="purejs"),new Promise((E,x)=>{let M=`${e.basePrefix}/.within.website/x/cmd/anubis/static/js/worker/sha256-${a}.mjs?cacheBuster=${e.version}`,p=[],d=!1,b=()=>{console.log("PoW aborted"),h(),x(new DOMException("Aborted","AbortError"))},h=()=>{d||(d=!0,p.forEach(c=>c.terminate()),o?.removeEventListener("abort",b))};if(o!=null){if(o.aborted)return b();o.addEventListener("abort",b,{once:!0})}for(let c=0;c{typeof m.data=="number"?i?.(m.data):(h(),E(m.data))},g.onerror=m=>{h(),x(m)},g.postMessage({data:n,difficulty:s,nonce:c,threads:u}),p.push(g)}})}var j={fast:_,slow:_};var v=(e="",n={})=>{let s=new URL(e,window.location.href);return Object.entries(n).forEach(([o,i])=>s.searchParams.set(o,i)),s.toString()},L=e=>{let n=document.getElementById(e);return n===null?null:JSON.parse(n.textContent)},k=(e,n,s)=>v(`${s}/.within.website/x/cmd/anubis/static/img/${e}.webp`,{cacheBuster:n});var W=async()=>document.documentElement.lang,S=async e=>{let n=L("anubis_base_prefix");if(n!==null)try{return await(await fetch(`${n}/.within.website/x/cmd/anubis/static/locales/${e}.json`)).json()}catch(s){if(console.warn(`Failed to load translations for ${e}, falling back to English`),e!=="en")return await S("en");throw s}},C=()=>{let e=L("anubis_public_url");if(e!==null)return e&&window.location.href.startsWith(e)?new URLSearchParams(window.location.search).get("redir"):window.location.href},$={},D,A=async()=>{D=await W(),$=await S(D)},r=e=>$[`js_${e}`]||$[e]||e;(async()=>{await A();let e=[{name:"Web Workers",msg:r("web_workers_error"),value:window.Worker},{name:"Cookies",msg:r("cookies_error"),value:navigator.cookieEnabled}],n=document.getElementById("status"),s=document.getElementById("image"),o=document.getElementById("title"),i=document.getElementById("progress"),u=L("anubis_version"),a=L("anubis_base_prefix"),E=document.querySelector("details"),x=!1;E&&E.addEventListener("toggle",()=>{E.open&&(x=!0)});let M=({titleMsg:l,statusMsg:f,imageSrc:w})=>{o.innerHTML=l,n.innerHTML=f,s.src=w,i.style.display="none"};n.innerHTML=r("calculating");for(let{value:l,name:f,msg:w}of e)if(!l){M({titleMsg:`${r("missing_feature")} ${f}`,statusMsg:w,imageSrc:k("reject",u,a)});return}let{challenge:p,rules:d}=L("anubis_challenge"),b=j[d.algorithm];if(!b){M({titleMsg:r("challenge_error"),statusMsg:r("challenge_error_msg"),imageSrc:k("reject",u,a)});return}n.innerHTML=`${r("calculating_difficulty")} ${d.difficulty}, `,i.style.display="inline-block";let h=document.createTextNode(`${r("speed")} 0kH/s`);n.appendChild(h);let c=0,g=!1,m=Math.pow(16,-d.difficulty);try{let l=Date.now(),{hash:f,nonce:w}=await b({basePrefix:a,version:u},p.randomData,d.difficulty,null,t=>{let y=Date.now()-l;y-c>1e3&&(c=y,h.data=`${r("speed")} ${(t/y).toFixed(3)}kH/s`);let T=Math.pow(1-m,t),P=(1-Math.pow(T,2))*100;i["aria-valuenow"]=P,i.firstElementChild!==null&&(i.firstElementChild.style.width=`${P}%`),T<.1&&!g&&(n.append(document.createElement("br"),document.createTextNode(r("verification_longer"))),g=!0)}),H=Date.now();if(console.log({hash:f,nonce:w}),x){let y=function(){let T=C();window.location.replace(v(`${a}/.within.website/x/cmd/anubis/api/pass-challenge`,{id:p.id,response:f,nonce:w,redir:T,elapsedTime:H-l}))},t=document.getElementById("progress");t.style.display="flex",t.style.alignItems="center",t.style.justifyContent="center",t.style.height="2rem",t.style.borderRadius="1rem",t.style.cursor="pointer",t.style.background="#b16286",t.style.color="white",t.style.fontWeight="bold",t.style.outline="4px solid #b16286",t.style.outlineOffset="2px",t.style.width="min(20rem, 90%)",t.style.margin="1rem auto 2rem",t.innerHTML=r("finished_reading"),t.onclick=y,setTimeout(y,3e4)}else{let t=C();window.location.replace(v(`${a}/.within.website/x/cmd/anubis/api/pass-challenge`,{id:p.id,response:f,nonce:w,redir:t,elapsedTime:H-l}))}}catch(l){M({titleMsg:r("calculation_error"),statusMsg:`${r("calculation_error_msg")} ${l.message}`,imageSrc:k("reject",u,a)})}})();})(); +//# sourceMappingURL=main.mjs.map diff --git a/openflare_agent/internal/nginx/pow_static/js/worker/sha256-purejs.mjs b/openflare_agent/internal/nginx/pow_static/js/worker/sha256-purejs.mjs new file mode 100644 index 00000000..e2c2d196 --- /dev/null +++ b/openflare_agent/internal/nginx/pow_static/js/worker/sha256-purejs.mjs @@ -0,0 +1,32 @@ +/* +@licstart The following is the entire license notice for the +JavaScript code in this page. + +Copyright (c) 2025 Xe Iaso + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. + +Includes code from https://github.com/aws/aws-sdk-js-crypto-helpers which is +used under the terms of the Apache 2 license. + +@licend The above is the entire license notice +for the JavaScript code in this page. +*/ +(()=>{function _(o,i,e,n){function t(r){return r instanceof e?r:new e(function(a){a(r)})}return new(e||(e=Promise))(function(r,a){function p(c){try{f(n.next(c))}catch(l){a(l)}}function u(c){try{f(n.throw(c))}catch(l){a(l)}}function f(c){c.done?r(c.value):t(c.value).then(p,u)}f((n=n.apply(o,i||[])).next())})}function v(o,i){var e={label:0,sent:function(){if(r[0]&1)throw r[1];return r[1]},trys:[],ops:[]},n,t,r,a=Object.create((typeof Iterator=="function"?Iterator:Object).prototype);return a.next=p(0),a.throw=p(1),a.return=p(2),typeof Symbol=="function"&&(a[Symbol.iterator]=function(){return this}),a;function p(f){return function(c){return u([f,c])}}function u(f){if(n)throw new TypeError("Generator is already executing.");for(;a&&(a=0,f[0]&&(e=0)),e;)try{if(n=1,t&&(r=f[0]&2?t.return:f[0]?t.throw||((r=t.return)&&r.call(t),0):t.next)&&!(r=r.call(t,f[1])).done)return r;switch(t=0,r&&(f=[f[0]&2,r.value]),f[0]){case 0:case 1:r=f;break;case 4:return e.label++,{value:f[1],done:!1};case 5:e.label++,t=f[1],f=[0];continue;case 7:f=e.ops.pop(),e.trys.pop();continue;default:if(r=e.trys,!(r=r.length>0&&r[r.length-1])&&(f[0]===6||f[0]===2)){e=0;continue}if(f[0]===3&&(!r||f[1]>r[0]&&f[1]S)throw new Error("Cannot hash more than 2^53 - 1 bits");for(;n>0;)this.buffer[this.bufferLength++]=i[e++],n--,this.bufferLength===h&&(this.hashBuffer(),this.bufferLength=0)},o.prototype.digest=function(){if(!this.finished){var i=this.bytesHashed*8,e=new DataView(this.buffer.buffer,this.buffer.byteOffset,this.buffer.byteLength),n=this.bufferLength;if(e.setUint8(this.bufferLength++,128),n%h>=h-8){for(var t=this.bufferLength;t>>24&255,r[t*4+1]=this.state[t]>>>16&255,r[t*4+2]=this.state[t]>>>8&255,r[t*4+3]=this.state[t]>>>0&255;return r},o.prototype.hashBuffer=function(){for(var i=this,e=i.buffer,n=i.state,t=n[0],r=n[1],a=n[2],p=n[3],u=n[4],f=n[5],c=n[6],l=n[7],s=0;s>>17|y<<15)^(y>>>19|y<<13)^y>>>10;y=this.temp[s-15];var T=(y>>>7|y<<25)^(y>>>18|y<<14)^y>>>3;this.temp[s]=(A+this.temp[s-7]|0)+(T+this.temp[s-16]|0)}var m=(((u>>>6|u<<26)^(u>>>11|u<<21)^(u>>>25|u<<7))+(u&f^~u&c)|0)+(l+(E[s]+this.temp[s]|0)|0)|0,P=((t>>>2|t<<30)^(t>>>13|t<<19)^(t>>>22|t<<10))+(t&r^t&a^r&a)|0;l=c,c=f,f=u,u=p+m|0,p=a,a=r,r=t,t=m+P|0}n[0]+=t,n[1]+=r,n[2]+=a,n[3]+=p,n[4]+=u,n[5]+=f,n[6]+=c,n[7]+=l},o})();var d=o=>new TextEncoder().encode(o);var L=typeof Buffer<"u"&&Buffer.from?function(o){return Buffer.from(o,"utf8")}:d;function x(o){return o instanceof Uint8Array?o:typeof o=="string"?L(o):ArrayBuffer.isView(o)?new Uint8Array(o.buffer,o.byteOffset,o.byteLength/Uint8Array.BYTES_PER_ELEMENT):new Uint8Array(o)}function w(o){return typeof o=="string"?o.length===0:o.byteLength===0}var j=(function(){function o(i){this.secret=i,this.hash=new b,this.reset()}return o.prototype.update=function(i){if(!(w(i)||this.error))try{this.hash.update(x(i))}catch(e){this.error=e}},o.prototype.digestSync=function(){if(this.error)throw this.error;return this.outer?(this.outer.finished||this.outer.update(this.hash.digest()),this.outer.digest()):this.hash.digest()},o.prototype.digest=function(){return _(this,void 0,void 0,function(){return v(this,function(i){return[2,this.digestSync()]})})},o.prototype.reset=function(){if(this.hash=new b,this.secret){this.outer=new b;var i=U(this.secret),e=new Uint8Array(h);e.set(i);for(var n=0;nh){var e=new b;e.update(i),i=e.digest()}var n=new Uint8Array(h);return n.set(i),n}var B=o=>{let i=new j;return i.update(o),i.digest()};function I(o){return Array.from(o).map(i=>i.toString(16).padStart(2,"0")).join("")}addEventListener("message",async({data:o})=>{let{data:i,difficulty:e,threads:n}=o,t=o.nonce,r=t===0,a=0,p=Math.floor(e/2),u=e%2!==0;for(;;){let f=await B(i+t),c=new Uint8Array(f),l=!0;for(let s=0;s>4!==0&&(l=!1),l){let s=I(c);postMessage({hash:s,data:i,difficulty:e,nonce:t});return}t+=n,a++,t%1!==0&&(t=Math.trunc(t)),r&&(a&1023)===0&&postMessage(t)}});})(); +//# sourceMappingURL=sha256-purejs.mjs.map diff --git a/openflare_agent/internal/nginx/pow_static/js/worker/sha256-webcrypto.mjs b/openflare_agent/internal/nginx/pow_static/js/worker/sha256-webcrypto.mjs new file mode 100644 index 00000000..7d32193b --- /dev/null +++ b/openflare_agent/internal/nginx/pow_static/js/worker/sha256-webcrypto.mjs @@ -0,0 +1,32 @@ +/* +@licstart The following is the entire license notice for the +JavaScript code in this page. + +Copyright (c) 2025 Xe Iaso + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. + +Includes code from https://github.com/aws/aws-sdk-js-crypto-helpers which is +used under the terms of the Apache 2 license. + +@licend The above is the entire license notice +for the JavaScript code in this page. +*/ +(()=>{var h=new TextEncoder,y=async e=>{let s=h.encode(e);return await crypto.subtle.digest("SHA-256",s)},g=e=>e.reduce((s,a)=>s+a.toString(16).padStart(2,"0"),"");addEventListener("message",async({data:e})=>{let{data:s,difficulty:a,threads:d}=e,t=e.nonce,f=t===0,o=0,c=Math.floor(a/2),l=a%2!==0;for(;;){let u=await y(s+t),i=new Uint8Array(u),r=!0;for(let n=0;n>4!==0&&(r=!1),r){let n=g(i);postMessage({hash:n,data:s,difficulty:a,nonce:t});return}t+=d,o++,t%1!==0&&(t=Math.trunc(t)),f&&(o&1023)===0&&postMessage(t)}});})(); +//# sourceMappingURL=sha256-webcrypto.mjs.map diff --git a/openflare_agent/internal/nginx/pow_static/locales/en.json b/openflare_agent/internal/nginx/pow_static/locales/en.json new file mode 100644 index 00000000..4dffb969 --- /dev/null +++ b/openflare_agent/internal/nginx/pow_static/locales/en.json @@ -0,0 +1,66 @@ +{ + "loading": "Loading...", + "why_am_i_seeing": "Why am I seeing this?", + "protected_by": "Protected by", + "protected_from": "From", + "made_with": "Made with ❤️ in 🇨🇦", + "mascot_design": "Mascot design by", + "ai_companies_explanation": "You are seeing this because the administrator of this website has set up Anubis to protect the server against the scourge of AI companies aggressively scraping websites. This can and does cause downtime for the websites, which makes their resources inaccessible for everyone.", + "anubis_compromise": "Anubis is a compromise. Anubis uses a Proof-of-Work scheme in the vein of Hashcash, a proposed proof-of-work scheme for reducing email spam. The idea is that at individual scales the additional load is ignorable, but at mass scraper levels it adds up and makes scraping much more expensive.", + "hack_purpose": "Ultimately, this is a placeholder solution so that more time can be spent on fingerprinting and identifying headless browsers (EG: via how they do font rendering) so that the challenge proof of work page doesn't need to be presented to users that are much more likely to be legitimate.", + "simplified_explanation": "This is a measure against bots and malicious requests similar to a CAPTCHA. However, instead of having to do work yourself, your browser is given a calculation task that it has to solve to ensure that it is a valid client. This concept is called Proof of Work. The task is calculated in a few seconds and you are granted access to the website. Thank you for your understanding and patience.", + "jshelter_note": "Please note that Anubis requires the use of modern JavaScript features that plugins like JShelter will disable. Please disable JShelter or other such plugins for this domain.", + "version_info": "This website is running Anubis version", + "try_again": "Try again", + "go_home": "Go home", + "contact_webmaster": "or if you believe you should not be blocked, please contact the webmaster at", + "connection_security": "Please wait a moment while we ensure the security of your connection.", + "javascript_required": "Sadly, you must enable JavaScript to get past this challenge. This is required because AI companies have changed the social contract around how website hosting works. A no-JS solution is a work-in-progress.", + "benchmark_requires_js": "Running the benchmark tool requires JavaScript to be enabled.", + "difficulty": "Difficulty:", + "algorithm": "Algorithm:", + "compare": "Compare:", + "time": "Time", + "iters": "Iters", + "time_a": "Time A", + "iters_a": "Iters A", + "time_b": "Time B", + "iters_b": "Iters B", + "static_check_endpoint": "This is just a check endpoint for your reverse proxy to use.", + "authorization_required": "Authorization required", + "cookies_disabled": "Your browser is configured to disable cookies. Anubis requires cookies for the legitimate interest of making sure you are a valid client. Please enable cookies for this domain", + "access_denied": "Access Denied: error code", + "dronebl_entry": "DroneBL reported an entry", + "see_dronebl_lookup": "see", + "internal_server_error": "Internal Server Error: administrator has misconfigured Anubis. Please contact the administrator and ask them to look for the logs around", + "invalid_redirect": "Invalid redirect", + "redirect_not_parseable": "Redirect URL not parseable", + "redirect_domain_not_allowed": "Redirect domain not allowed", + "missing_required_forwarded_headers": "Missing required X-Forwarded-* headers", + "failed_to_sign_jwt": "failed to sign JWT", + "invalid_invocation": "Invalid invocation of MakeChallenge", + "client_error_browser": "Client Error: Please ensure your browser is up to date and try again later.", + "oh_noes": "Oh noes!", + "benchmarking_anubis": "Benchmarking Anubis!", + "you_are_not_a_bot": "You are not a bot!", + "making_sure_not_bot": "Making sure you're not a bot!", + "celphase": "CELPHASE", + "js_web_crypto_error": "Your browser doesn't have a functioning web.crypto element. Are you viewing this over a secure context?", + "js_web_workers_error": "Your browser doesn't support web workers (Anubis uses this to avoid freezing your browser). Do you have a plugin like JShelter installed?", + "js_cookies_error": "Your browser doesn't store cookies. Anubis uses cookies to determine which clients have passed challenges by storing a signed token in a cookie. Please enable storing cookies for this domain. The names of the cookies Anubis stores may vary without notice. Cookie names and values are not part of the public API.", + "js_context_not_secure": "Your context is not secure!", + "js_context_not_secure_msg": "Try connecting over HTTPS or let the admin know to set up HTTPS. For more information, see MDN.", + "js_calculating": "Calculating...", + "js_missing_feature": "Missing feature", + "js_challenge_error": "Challenge error!", + "js_challenge_error_msg": "Failed to resolve check algorithm. You may want to reload the page.", + "js_calculating_difficulty": "Calculating...
Difficulty:", + "js_speed": "Speed:", + "js_verification_longer": "Verification is taking longer than expected. Please do not refresh the page.", + "js_success": "Success!", + "js_done_took": "Done! Took", + "js_iterations": "iterations", + "js_finished_reading": "I've finished reading, continue →", + "js_calculation_error": "Calculation error!", + "js_calculation_error_msg": "Failed to calculate challenge:" +} diff --git a/openflare_agent/internal/nginx/pow_static/locales/zh-CN.json b/openflare_agent/internal/nginx/pow_static/locales/zh-CN.json new file mode 100644 index 00000000..19529607 --- /dev/null +++ b/openflare_agent/internal/nginx/pow_static/locales/zh-CN.json @@ -0,0 +1,66 @@ +{ + "loading": "加载中...", + "why_am_i_seeing": "为什么我会看到这个?", + "protected_by": "本网站由", + "protected_from": "保护,来自", + "made_with": "在 🇨🇦 用 ❤️ 制作", + "mascot_design": "吉祥物由", + "ai_companies_explanation": "您会看到这个画面,是因为网站管理员启用了 Anubis 来保护服务器,避免 AI 公司大量爬取网站内容。这类行为会导致网站崩溃,让所有用户都无法正常访问资源。", + "anubis_compromise": "Anubis 是一种折中做法。它采用了类似 Hashcash 的工作量证明机制(Proof-of-Work),该机制最初是为了减少垃圾邮件而提出。其核心概念是:对个别用户而言,额外的计算负担可以忽略,但对大规模爬虫来说,累积起来的成本将大幅增加,从而让爬取行为变得更困难。", + "hack_purpose": "最终,这是一个占位符解决方案,以便将更多时间用于指纹识别和识别无头浏览器(例如:通过它们如何进行字体渲染),从而无需向更可能是合法用户的用户呈现挑战工作量证明页面。", + "jshelter_note": "请注意,Anubis 需要使用现代 JavaScript 功能,而像 JShelter 这类插件可能会阻挡这些功能。请为此域名停用 JShelter 或类似的插件。", + "version_info": "这个网站正在运行的 Anubis 版本为", + "try_again": "再试一次", + "go_home": "返回首页", + "contact_webmaster": "或者您觉得您不应该被封锁,请联系网站管理员于", + "connection_security": "请稍等,我们需要在继续之前检查您的连接安全性。", + "javascript_required": "很遗憾,您必须启用 JavaScript 才能通过这项验证。这是因为 AI 公司已经改变了网站托管的社会契约,因此我们必须采取这样的保护机制。无需 JavaScript 的解决方案仍在开发中。", + "benchmark_requires_js": "运行基准测试工具需要启用 JavaScript。", + "difficulty": "难度:", + "algorithm": "算法:", + "compare": "比较:", + "time": "时间", + "iters": "迭代", + "time_a": "时间 A", + "iters_a": "迭代 A", + "time_b": "时间 B", + "iters_b": "迭代 B", + "static_check_endpoint": "这是提供给您的反向代理服务器使用的检查端点。", + "authorization_required": "需要认证", + "cookies_disabled": "您的浏览器目前已禁用 Cookie,为了确认您是合法用户,Anubis 需要启用 Cookie。 请您为此域名启用 Cookie", + "access_denied": "拒绝访问:错误代码", + "dronebl_entry": "DroneBL 报告了一条记录", + "see_dronebl_lookup": "见", + "internal_server_error": "内部服务器错误:管理员错误地配置了 Anubis。 请联系管理员要求他们检查日志", + "invalid_redirect": "无效的重定向", + "redirect_not_parseable": "重定向 URL 无法解析", + "redirect_domain_not_allowed": "重定向的域名并不允许", + "failed_to_sign_jwt": "签署 JWT 失败", + "invalid_invocation": "无效的 MakeChallenge 调用", + "client_error_browser": "客户端错误:请确保您的浏览器是最新版本并稍候再试。", + "oh_noes": "哎呀糟糕了!", + "benchmarking_anubis": "正在进行 Anubis 性能测试!", + "you_are_not_a_bot": "你不是机器人!", + "making_sure_not_bot": "正在确认你是不是机器人!", + "celphase": "CELPHASE 设计", + "js_web_crypto_error": "您的浏览器无法正常使用 web.crypto 组件。您是否通过安全连接(HTTPS)查看此网站?", + "js_web_workers_error": "您的浏览器并不支持 Web workers (Anubis 使用这个来避免冻结您的浏览器 )您有安装像是 JShelter 之类的插件吗?", + "js_cookies_error": "您的浏览器无法存储 Cookie。 Anubis 会使用 Cookie 存储签署的凭证,以判断用户是否已通过验证。请为此域名启用 Cookie 存储功能。 请注意,Anubis 存储的 Cookie 名称可能会变动,且其名称与内容不属于公开 API 的一部分。", + "js_context_not_secure": "您的内容并不安全", + "js_context_not_secure_msg": "请尝试使用 HTTPS 连接,或联系网站管理员设置 HTTPS。更多信息请参见 MDN。", + "js_calculating": "计算中...", + "js_missing_feature": "缺少功能", + "js_challenge_error": "挑战错误!", + "js_challenge_error_msg": "解决检查算法失败。 您可能会想要刷新页面。", + "js_calculating_difficulty": "计算中...
难度:", + "js_speed": "速度:", + "js_verification_longer": "验证所花的时间高于预期。 请不要刷新页面。", + "js_success": "成功!", + "js_done_took": "完成! 花费", + "js_iterations": "迭代", + "js_finished_reading": "我读完了,继续 →", + "js_calculation_error": "计算错误!", + "js_calculation_error_msg": "计算挑战失败:", + "missing_required_forwarded_headers": "缺少必要的 X-Forwarded-* 头", + "simplified_explanation": "这是一种类似于验证码的措施,用于防止机器人和恶意请求。但是,您无需自己动手,您的浏览器会收到一个计算任务,必须解决该任务以确保它是有效的客户端。这个概念称为工作量证明。该任务在几秒钟内计算完毕,您将被授予访问网站的权限。感谢您的理解和耐心。" +} diff --git a/openflare_server/model/database_schema_version.go b/openflare_server/model/database_schema_version.go index 969f9922..a8eaaafe 100644 --- a/openflare_server/model/database_schema_version.go +++ b/openflare_server/model/database_schema_version.go @@ -4,7 +4,7 @@ import "time" const ( legacyDatabaseSchemaVersion = 1 - currentDatabaseSchemaVersion = 8 + currentDatabaseSchemaVersion = 9 databaseSchemaVersionRowID = 1 ) diff --git a/openflare_server/model/migrations.go b/openflare_server/model/migrations.go index f5f62508..0bb052e4 100644 --- a/openflare_server/model/migrations.go +++ b/openflare_server/model/migrations.go @@ -1196,6 +1196,39 @@ func migrateV8(db *gorm.DB, backend string) error { return backfillProxyRouteDomainCertificateFields(db) } +// migrateV9 adds PoW (Proof-of-Work) anti-bot protection fields to proxy_routes. +func migrateV9(db *gorm.DB, backend string) error { + if err := applyCurrentSchema(db, backend); err != nil { + return err + } + if err := backfillOriginsFromProxyRoutes(db); err != nil { + return err + } + if err := backfillProxyRouteSiteFields(db); err != nil { + return err + } + if err := ensureProxyRouteSiteNameUniqueIndex(db); err != nil { + return err + } + if err := backfillProxyRouteCertificateFields(db); err != nil { + return err + } + return backfillProxyRouteDomainCertificateFields(db) +} + +func validateDatabaseSchemaV9(db *gorm.DB, backend string) error { + if err := validateDatabaseSchemaV8(db, backend); err != nil { + return err + } + if !db.Migrator().HasColumn(&ProxyRoute{}, "pow_enabled") { + return fmt.Errorf("column proxy_routes.pow_enabled is missing") + } + if !db.Migrator().HasColumn(&ProxyRoute{}, "pow_config") { + return fmt.Errorf("column proxy_routes.pow_config is missing") + } + return nil +} + func databaseSchemaMigrations() []databaseSchemaMigration { return []databaseSchemaMigration{ {fromVersion: 1, toVersion: 2, migrate: migrateV2, validate: validateDatabaseSchemaV2}, @@ -1205,6 +1238,7 @@ func databaseSchemaMigrations() []databaseSchemaMigration { {fromVersion: 5, toVersion: 6, migrate: migrateV6, validate: validateDatabaseSchemaV6}, {fromVersion: 6, toVersion: 7, migrate: migrateV7, validate: validateDatabaseSchemaV7}, {fromVersion: 7, toVersion: 8, migrate: migrateV8, validate: validateDatabaseSchemaV8}, + {fromVersion: 8, toVersion: 9, migrate: migrateV9, validate: validateDatabaseSchemaV9}, } } @@ -1287,7 +1321,7 @@ func initializeFreshDatabaseSchema(db *gorm.DB, backend string) error { if err := backfillProxyRouteDomainCertificateFields(db); err != nil { return err } - if err := validateDatabaseSchemaV8(db, backend); err != nil { + if err := validateDatabaseSchemaV9(db, backend); err != nil { return err } return saveDatabaseSchemaVersion(db, currentDatabaseSchemaVersion) diff --git a/openflare_server/model/proxy_route.go b/openflare_server/model/proxy_route.go index f34208bc..f45cb3cb 100644 --- a/openflare_server/model/proxy_route.go +++ b/openflare_server/model/proxy_route.go @@ -24,6 +24,8 @@ type ProxyRoute struct { CachePolicy string `json:"cache_policy" gorm:"size:32;not null;default:''"` CacheRules string `json:"cache_rules" gorm:"type:text;not null;default:'[]'"` CustomHeaders string `json:"custom_headers" gorm:"type:text;not null;default:'[]'"` + PoWEnabled bool `json:"pow_enabled" gorm:"column:pow_enabled;not null;default:false"` + PoWConfig string `json:"pow_config" gorm:"column:pow_config;type:text;not null;default:'{}'"` Remark string `json:"remark" gorm:"size:255"` CreatedAt time.Time `json:"created_at"` UpdatedAt time.Time `json:"updated_at"` @@ -76,6 +78,8 @@ func (route *ProxyRoute) Update() error { "cache_policy": route.CachePolicy, "cache_rules": route.CacheRules, "custom_headers": route.CustomHeaders, + "pow_enabled": route.PoWEnabled, + "pow_config": route.PoWConfig, "remark": route.Remark, }).Error } diff --git a/openflare_server/service/agent.go b/openflare_server/service/agent.go index 72e30957..a942a910 100644 --- a/openflare_server/service/agent.go +++ b/openflare_server/service/agent.go @@ -217,7 +217,7 @@ func GetActiveConfigForAgent() (*AgentConfigResponse, error) { return nil, err } } - supportFiles = filterCertificateSupportFiles(supportFiles) + supportFiles = filterAgentSupportFiles(supportFiles) slog.Debug("agent fetched active config", "version", version.Version, "checksum", version.Checksum) return &AgentConfigResponse{ Version: version.Version, @@ -230,7 +230,7 @@ func GetActiveConfigForAgent() (*AgentConfigResponse, error) { }, nil } -func filterCertificateSupportFiles(files []SupportFile) []SupportFile { +func filterAgentSupportFiles(files []SupportFile) []SupportFile { if len(files) == 0 { return nil } @@ -240,6 +240,8 @@ func filterCertificateSupportFiles(files []SupportFile) []SupportFile { switch { case strings.HasSuffix(path, ".crt"), strings.HasSuffix(path, ".key"), strings.HasSuffix(path, ".pem"): filtered = append(filtered, file) + case path == "pow_config.json": + filtered = append(filtered, file) } } return filtered diff --git a/openflare_server/service/agent_test.go b/openflare_server/service/agent_test.go new file mode 100644 index 00000000..f1796eaf --- /dev/null +++ b/openflare_server/service/agent_test.go @@ -0,0 +1,41 @@ +package service + +import "testing" + +func TestGetActiveConfigForAgentIncludesPoWConfig(t *testing.T) { + setupServiceTestDB(t) + + _, err := CreateProxyRoute(ProxyRouteInput{ + Domain: "pow-agent.example.com", + OriginURL: "https://origin.internal", + Enabled: true, + PoWEnabled: true, + PoWConfig: `{"difficulty":4,"algorithm":"fast","session_ttl":86400,"challenge_ttl":300,"whitelist":{"paths":["/.well-known/*","/favicon.ico","/robots.txt"],"user_agents":["Googlebot","bingbot","Baiduspider"]},"blacklist":{"ips":[],"ip_cidrs":[],"paths":[],"path_regexes":[],"user_agents":[]}}`, + }) + if err != nil { + t.Fatalf("CreateProxyRoute failed: %v", err) + } + + if _, err := PublishConfigVersion("root"); err != nil { + t.Fatalf("PublishConfigVersion failed: %v", err) + } + + activeConfig, err := GetActiveConfigForAgent() + if err != nil { + t.Fatalf("GetActiveConfigForAgent failed: %v", err) + } + + foundPowConfig := false + for _, file := range activeConfig.SupportFiles { + if file.Path != "pow_config.json" { + continue + } + foundPowConfig = true + if file.Content == "" { + t.Fatal("expected pow_config.json content to be populated") + } + } + if !foundPowConfig { + t.Fatal("expected agent config to include pow_config.json support file") + } +} diff --git a/openflare_server/service/config_version.go b/openflare_server/service/config_version.go index 6f3d5ed2..4ba70265 100644 --- a/openflare_server/service/config_version.go +++ b/openflare_server/service/config_version.go @@ -83,6 +83,8 @@ type snapshotRoute struct { CachePolicy string `json:"cache_policy,omitempty"` CacheRules []string `json:"cache_rules,omitempty"` CustomHeaders []ProxyRouteCustomHeaderInput `json:"custom_headers,omitempty"` + PoWEnabled bool `json:"pow_enabled,omitempty"` + PoWConfig *ProxyRoutePoWConfig `json:"pow_config,omitempty"` Remark string `json:"remark,omitempty"` } @@ -429,7 +431,13 @@ func buildCurrentConfigBundle(requireRoutes bool) (*configBundle, error) { if err != nil { return nil, err } + powConfigJSON, powSupportFiles, err := renderPowConfigBundle(routes) + if err != nil { + return nil, err + } + supportFiles = append(supportFiles, powSupportFiles...) mainConfig := renderMainConfig(openRestyConfig) + supportFiles = append(supportFiles, SupportFile{Path: "pow_config.json", Content: powConfigJSON}) return &configBundle{ Routes: routes, SnapshotRoutes: snapshotRoutes, @@ -462,6 +470,13 @@ func buildSnapshotRoutes(routes []*model.ProxyRoute) ([]snapshotRoute, error) { if err != nil { return nil, fmt.Errorf("路由 %s 缓存规则无效", route.Domain) } + powConfig, err := decodeStoredPoWConfig(route.PoWEnabled, route.PoWConfig) + if err != nil { + return nil, fmt.Errorf("路由 %s PoW 配置无效", route.Domain) + } + if !route.PoWEnabled { + powConfig = nil + } items = append(items, snapshotRoute{ SiteName: normalizeProxyRouteSiteNameInput(route, route.SiteName, domains[0]), Domain: domains[0], @@ -482,6 +497,8 @@ func buildSnapshotRoutes(routes []*model.ProxyRoute) ([]snapshotRoute, error) { CachePolicy: route.CachePolicy, CacheRules: cacheRules, CustomHeaders: customHeaders, + PoWEnabled: route.PoWEnabled, + PoWConfig: powConfig, Remark: route.Remark, }) } @@ -586,6 +603,17 @@ func normalizeSnapshotRoutes(routes []snapshotRoute) []snapshotRoute { if err == nil { routes[index].LimitRate = normalizedLimitRate } + if routes[index].PoWEnabled { + raw, err := json.Marshal(routes[index].PoWConfig) + if err == nil { + normalizedPoWConfig, err := normalizePoWConfig(true, string(raw)) + if err == nil { + routes[index].PoWConfig = &normalizedPoWConfig + } + } + } else { + routes[index].PoWConfig = nil + } } return routes } @@ -611,7 +639,7 @@ func flattenSnapshotRoutesByDomain(routes []snapshotRoute) map[string]snapshotRo } func snapshotRouteConfigEqual(left snapshotRoute, right snapshotRoute) bool { - if left.SiteName != right.SiteName || left.Domain != right.Domain || left.OriginURL != right.OriginURL || left.OriginHost != right.OriginHost || left.EnableHTTPS != right.EnableHTTPS || left.RedirectHTTP != right.RedirectHTTP || left.LimitConnPerServer != right.LimitConnPerServer || left.LimitConnPerIP != right.LimitConnPerIP || left.LimitRate != right.LimitRate || left.CacheEnabled != right.CacheEnabled || left.CachePolicy != right.CachePolicy || !uintSliceEqual(left.CertIDs, right.CertIDs) || !uintSliceEqual(left.DomainCertIDs, right.DomainCertIDs) { + if left.SiteName != right.SiteName || left.Domain != right.Domain || left.OriginURL != right.OriginURL || left.OriginHost != right.OriginHost || left.EnableHTTPS != right.EnableHTTPS || left.RedirectHTTP != right.RedirectHTTP || left.LimitConnPerServer != right.LimitConnPerServer || left.LimitConnPerIP != right.LimitConnPerIP || left.LimitRate != right.LimitRate || left.CacheEnabled != right.CacheEnabled || left.CachePolicy != right.CachePolicy || left.PoWEnabled != right.PoWEnabled || !uintSliceEqual(left.CertIDs, right.CertIDs) || !uintSliceEqual(left.DomainCertIDs, right.DomainCertIDs) { return false } if len(left.Domains) != len(right.Domains) { @@ -646,6 +674,41 @@ func snapshotRouteConfigEqual(left snapshotRoute, right snapshotRoute) bool { return false } } + if !snapshotPoWConfigEqual(left.PoWConfig, right.PoWConfig) { + return false + } + return true +} + +func snapshotPoWConfigEqual(left *ProxyRoutePoWConfig, right *ProxyRoutePoWConfig) bool { + if left == nil || right == nil { + return left == nil && right == nil + } + return left.Difficulty == right.Difficulty && + left.Algorithm == right.Algorithm && + left.SessionTTL == right.SessionTTL && + left.ChallengeTTL == right.ChallengeTTL && + stringSliceEqual(left.Whitelist.IPs, right.Whitelist.IPs) && + stringSliceEqual(left.Whitelist.IPCidrs, right.Whitelist.IPCidrs) && + stringSliceEqual(left.Whitelist.Paths, right.Whitelist.Paths) && + stringSliceEqual(left.Whitelist.PathRegexes, right.Whitelist.PathRegexes) && + stringSliceEqual(left.Whitelist.UserAgents, right.Whitelist.UserAgents) && + stringSliceEqual(left.Blacklist.IPs, right.Blacklist.IPs) && + stringSliceEqual(left.Blacklist.IPCidrs, right.Blacklist.IPCidrs) && + stringSliceEqual(left.Blacklist.Paths, right.Blacklist.Paths) && + stringSliceEqual(left.Blacklist.PathRegexes, right.Blacklist.PathRegexes) && + stringSliceEqual(left.Blacklist.UserAgents, right.Blacklist.UserAgents) +} + +func stringSliceEqual(left []string, right []string) bool { + if len(left) != len(right) { + return false + } + for index := range left { + if left[index] != right[index] { + return false + } + } return true } @@ -835,7 +898,7 @@ func renderRouteConfig(routes []*model.ProxyRoute, cfg openRestyConfigSnapshot) builder.WriteString(renderNamedUpstreamBlock(upstreamConfig)) } if !route.EnableHTTPS { - builder.WriteString(renderHTTPProxyServer(serverNames, route.OriginURL, route.OriginHost, customHeaders, cacheConfig, limitConfig, upstreamConfig, cfg)) + builder.WriteString(renderHTTPProxyServer(serverNames, route.OriginURL, route.OriginHost, customHeaders, cacheConfig, limitConfig, upstreamConfig, route.PoWEnabled, cfg)) continue } certIDs, err := decodeStoredCertIDs(route.CertIDs, route.CertID) @@ -896,7 +959,7 @@ func renderRouteConfig(routes []*model.ProxyRoute, cfg openRestyConfigSnapshot) if route.RedirectHTTP { if len(httpOnlyDomains) > 0 { - builder.WriteString(renderHTTPProxyServer(renderServerNames(httpOnlyDomains), route.OriginURL, route.OriginHost, customHeaders, cacheConfig, limitConfig, upstreamConfig, cfg)) + builder.WriteString(renderHTTPProxyServer(renderServerNames(httpOnlyDomains), route.OriginURL, route.OriginHost, customHeaders, cacheConfig, limitConfig, upstreamConfig, route.PoWEnabled, cfg)) } for _, certID := range certIDs { assignedDomains := domainsByCertID[certID] @@ -906,14 +969,14 @@ func renderRouteConfig(routes []*model.ProxyRoute, cfg openRestyConfigSnapshot) builder.WriteString(renderHTTPRedirectServer(renderServerNames(assignedDomains))) } } else { - builder.WriteString(renderHTTPProxyServer(serverNames, route.OriginURL, route.OriginHost, customHeaders, cacheConfig, limitConfig, upstreamConfig, cfg)) + builder.WriteString(renderHTTPProxyServer(serverNames, route.OriginURL, route.OriginHost, customHeaders, cacheConfig, limitConfig, upstreamConfig, route.PoWEnabled, cfg)) } for _, certID := range certIDs { assignedDomains := domainsByCertID[certID] if len(assignedDomains) == 0 { continue } - builder.WriteString(renderHTTPSServer(renderServerNames(assignedDomains), route.OriginURL, route.OriginHost, certID, customHeaders, cacheConfig, limitConfig, upstreamConfig, cfg)) + builder.WriteString(renderHTTPSServer(renderServerNames(assignedDomains), route.OriginURL, route.OriginHost, certID, customHeaders, cacheConfig, limitConfig, upstreamConfig, route.PoWEnabled, cfg)) } } return builder.String(), dedupeSupportFiles(supportFiles), nil @@ -1020,6 +1083,32 @@ func onOff(value bool) string { return "off" } +const nginxPowStaticDirPlaceholder = "__OPENFLARE_POW_STATIC_DIR__" + +func renderPowAccessBlock(powEnabled bool) string { + if !powEnabled { + return "" + } + return fmt.Sprintf(" access_by_lua_file %s/pow/check.lua;\n", nginxLuaDirPlaceholder) +} + +func renderPowLocationBlocks(powEnabled bool) string { + if !powEnabled { + return "" + } + return fmt.Sprintf("\n location = %spass-challenge {\n content_by_lua_file %s/pow/verify.lua;\n }\n\n location = %smake-challenge {\n content_by_lua_file %s/pow/challenge.lua;\n }\n\n", anubisAPIPrefix, nginxLuaDirPlaceholder, anubisAPIPrefix, nginxLuaDirPlaceholder) +} + +func renderPowStaticLocationBlock(powEnabled bool) string { + if !powEnabled { + return "" + } + return fmt.Sprintf(" location %s {\n alias %s/;\n }\n\n", anubisStaticPrefix, nginxPowStaticDirPlaceholder) +} + +const anubisStaticPrefix = "/.within.website/x/cmd/anubis/static/" +const anubisAPIPrefix = "/.within.website/x/cmd/anubis/api/" + func normalizeSnapshotCertificateIDs(primaryCertID *uint, certIDs []uint) ([]uint, *uint, error) { candidates := make([]uint, 0, len(certIDs)+1) if primaryCertID != nil && *primaryCertID != 0 { @@ -1130,18 +1219,18 @@ func nextVersionNumber(now time.Time) (string, error) { return fmt.Sprintf("%s-%03d", prefix, count+1), nil } -func renderHTTPProxyServer(serverNames string, originURL string, originHost string, customHeaders []ProxyRouteCustomHeaderInput, cacheConfig routeCacheConfig, limitConfig routeLimitConfig, upstreamConfig routeUpstreamConfig, cfg openRestyConfigSnapshot) string { - return fmt.Sprintf("server {\n listen 80;\n server_name %s;\n\n location / {\n%s%s%s%s }\n}\n\n", serverNames, renderProxyHeaderBlock(originURL, originHost, customHeaders, upstreamConfig), renderRouteLimitBlock(limitConfig), renderRouteCacheBlock(cacheConfig, cfg), renderProxyPassBlock(originURL, upstreamConfig)) +func renderHTTPProxyServer(serverNames string, originURL string, originHost string, customHeaders []ProxyRouteCustomHeaderInput, cacheConfig routeCacheConfig, limitConfig routeLimitConfig, upstreamConfig routeUpstreamConfig, powEnabled bool, cfg openRestyConfigSnapshot) string { + return fmt.Sprintf("server {\n listen 80;\n server_name %s;\n%s location / {\n%s%s%s%s%s }\n%s}\n\n", serverNames, renderPowLocationBlocks(powEnabled), renderPowAccessBlock(powEnabled), renderProxyHeaderBlock(originURL, originHost, customHeaders, upstreamConfig), renderRouteLimitBlock(limitConfig), renderRouteCacheBlock(cacheConfig, cfg), renderProxyPassBlock(originURL, upstreamConfig), renderPowStaticLocationBlock(powEnabled)) } func renderHTTPRedirectServer(serverNames string) string { return fmt.Sprintf("server {\n listen 80;\n server_name %s;\n\n return 301 https://$host$request_uri;\n}\n\n", serverNames) } -func renderHTTPSServer(serverNames string, originURL string, originHost string, certificateID uint, customHeaders []ProxyRouteCustomHeaderInput, cacheConfig routeCacheConfig, limitConfig routeLimitConfig, upstreamConfig routeUpstreamConfig, cfg openRestyConfigSnapshot) string { +func renderHTTPSServer(serverNames string, originURL string, originHost string, certificateID uint, customHeaders []ProxyRouteCustomHeaderInput, cacheConfig routeCacheConfig, limitConfig routeLimitConfig, upstreamConfig routeUpstreamConfig, powEnabled bool, cfg openRestyConfigSnapshot) string { certPath := fmt.Sprintf("%s/%s", nginxCertDirPlaceholder, certificateCertFileName(certificateID)) keyPath := fmt.Sprintf("%s/%s", nginxCertDirPlaceholder, certificateKeyFileName(certificateID)) - return fmt.Sprintf("server {\n listen 443 ssl;\n http2 on;\n server_name %s;\n ssl_certificate %s;\n ssl_certificate_key %s;\n\n location / {\n%s%s%s%s }\n}\n\n", serverNames, certPath, keyPath, renderProxyHeaderBlock(originURL, originHost, customHeaders, upstreamConfig), renderRouteLimitBlock(limitConfig), renderRouteCacheBlock(cacheConfig, cfg), renderProxyPassBlock(originURL, upstreamConfig)) + return fmt.Sprintf("server {\n listen 443 ssl;\n http2 on;\n server_name %s;\n ssl_certificate %s;\n ssl_certificate_key %s;\n%s location / {\n%s%s%s%s%s }\n%s}\n\n", serverNames, certPath, keyPath, renderPowLocationBlocks(powEnabled), renderPowAccessBlock(powEnabled), renderProxyHeaderBlock(originURL, originHost, customHeaders, upstreamConfig), renderRouteLimitBlock(limitConfig), renderRouteCacheBlock(cacheConfig, cfg), renderProxyPassBlock(originURL, upstreamConfig), renderPowStaticLocationBlock(powEnabled)) } func renderHTTPSServerWithCertificates(serverNames string, originURL string, originHost string, certificateIDs []uint, customHeaders []ProxyRouteCustomHeaderInput, cacheConfig routeCacheConfig, limitConfig routeLimitConfig, upstreamConfig routeUpstreamConfig, cfg openRestyConfigSnapshot) string { @@ -1505,3 +1594,40 @@ func dedupeSupportFiles(files []SupportFile) []SupportFile { } return result } + +func renderPowConfigBundle(routes []*model.ProxyRoute) (string, []SupportFile, error) { + type domainEntry struct { + Domains []string `json:"domains"` + Enabled bool `json:"enabled"` + Config map[string]interface{} `json:"config"` + } + entries := make([]domainEntry, 0) + hasPow := false + for _, route := range routes { + if !route.PoWEnabled { + continue + } + hasPow = true + domains, err := decodeStoredDomains(route.Domains, route.Domain) + if err != nil { + return "", nil, err + } + var cfg map[string]interface{} + if err := json.Unmarshal([]byte(route.PoWConfig), &cfg); err != nil { + return "", nil, fmt.Errorf("route %s pow_config is invalid", route.Domain) + } + entries = append(entries, domainEntry{ + Domains: domains, + Enabled: true, + Config: cfg, + }) + } + if !hasPow { + return "{}", nil, nil + } + data, err := json.Marshal(entries) + if err != nil { + return "", nil, err + } + return string(data), nil, nil +} diff --git a/openflare_server/service/https_phase1_test.go b/openflare_server/service/https_phase1_test.go index fd99ee2b..837b7e68 100644 --- a/openflare_server/service/https_phase1_test.go +++ b/openflare_server/service/https_phase1_test.go @@ -5,6 +5,7 @@ import ( "crypto/rsa" "crypto/x509" "crypto/x509/pkix" + "encoding/json" "encoding/pem" "math/big" "openflare/common" @@ -923,6 +924,90 @@ func TestPreviewAndDiffConfigVersion(t *testing.T) { } } +func TestPublishConfigVersionDetectsPoWChanges(t *testing.T) { + setupServiceTestDB(t) + + route, err := CreateProxyRoute(ProxyRouteInput{ + Domain: "pow.example.com", + OriginURL: "https://origin.internal", + Enabled: true, + }) + if err != nil { + t.Fatalf("CreateProxyRoute failed: %v", err) + } + + firstRelease, err := PublishConfigVersion("root") + if err != nil { + t.Fatalf("initial PublishConfigVersion failed: %v", err) + } + if !strings.Contains(firstRelease.Version.SupportFilesJSON, `"path":"pow_config.json"`) { + t.Fatal("expected publish to include pow_config.json support file") + } + + _, err = UpdateProxyRoute(route.ID, ProxyRouteInput{ + Domain: route.Domain, + OriginURL: route.OriginURL, + Enabled: true, + PoWEnabled: true, + PoWConfig: `{"difficulty":5,"algorithm":"slow","session_ttl":7200,"challenge_ttl":180,"whitelist":{"ips":["127.0.0.1"],"ip_cidrs":[],"paths":[],"path_regexes":[],"user_agents":[]},"blacklist":{"ips":[],"ip_cidrs":[],"paths":["/login"],"path_regexes":[],"user_agents":[]}}`, + RedirectHTTP: false, + }) + if err != nil { + t.Fatalf("UpdateProxyRoute failed: %v", err) + } + + diff, err := DiffConfigVersion() + if err != nil { + t.Fatalf("DiffConfigVersion failed: %v", err) + } + if len(diff.ModifiedDomains) != 1 || diff.ModifiedDomains[0] != "pow.example.com" { + t.Fatalf("expected PoW change to mark domain as modified, got %#v", diff.ModifiedDomains) + } + if len(diff.ModifiedSites) != 1 || diff.ModifiedSites[0] != "pow.example.com" { + t.Fatalf("expected PoW change to mark site as modified, got %#v", diff.ModifiedSites) + } + + secondRelease, err := PublishConfigVersion("root") + if err != nil { + t.Fatalf("PublishConfigVersion after PoW change failed: %v", err) + } + if firstRelease.Version.Checksum == secondRelease.Version.Checksum { + t.Fatal("expected PoW change to alter published checksum") + } + if !strings.Contains(secondRelease.Version.SnapshotJSON, `"pow_enabled":true`) { + t.Fatal("expected snapshot to persist PoW enabled state") + } + if !strings.Contains(secondRelease.Version.MainConfig, "lua_shared_dict openflare_pow_config 1m;") { + t.Fatal("expected main config to declare shared dict for pow config") + } + if !strings.Contains(secondRelease.Version.RenderedConfig, "location /.within.website/x/cmd/anubis/static/ {") { + t.Fatal("expected rendered config to expose anubis static location") + } + if strings.Contains(secondRelease.Version.RenderedConfig, "location /.within.website/x/cmd/anubis/static/static/ {") { + t.Fatal("expected rendered config to avoid duplicate static path segment") + } + if !strings.Contains(secondRelease.Version.SnapshotJSON, `"difficulty":5`) { + t.Fatal("expected snapshot to persist PoW config") + } + var supportFiles []SupportFile + if err := json.Unmarshal([]byte(secondRelease.Version.SupportFilesJSON), &supportFiles); err != nil { + t.Fatalf("failed to decode support files: %v", err) + } + foundPowSupportFile := false + for _, file := range supportFiles { + if file.Path != "pow_config.json" { + continue + } + foundPowSupportFile = true + if !strings.Contains(file.Content, `"difficulty":5`) { + t.Fatalf("expected pow support file to persist config, got %s", file.Content) + } + } + if !foundPowSupportFile { + t.Fatal("expected publish to include pow_config.json support file") + } +} + func TestRenderConfigUsesDefaultServerFallback(t *testing.T) { setupServiceTestDB(t) diff --git a/openflare_server/service/openresty_observability_assets.go b/openflare_server/service/openresty_observability_assets.go index b55754eb..637e7a21 100644 --- a/openflare_server/service/openresty_observability_assets.go +++ b/openflare_server/service/openresty_observability_assets.go @@ -11,6 +11,9 @@ const ( func renderOpenRestyObservabilityTemplateBlock() string { return stringsJoinLines( " lua_shared_dict openflare_observability 10m;", + " lua_shared_dict openflare_pow_config 1m;", + " lua_shared_dict openflare_pow_challenges 10m;", + " lua_shared_dict openflare_pow_sessions 20m;", fmt.Sprintf(" init_worker_by_lua_file %s/%s;", nginxLuaDirPlaceholder, openRestyObservabilityInitLuaPath), fmt.Sprintf(" log_by_lua_file %s/%s;", nginxLuaDirPlaceholder, openRestyObservabilityLogLuaPath), "", diff --git a/openflare_server/service/proxy_route.go b/openflare_server/service/proxy_route.go index 405cde5d..6ea9f704 100644 --- a/openflare_server/service/proxy_route.go +++ b/openflare_server/service/proxy_route.go @@ -4,6 +4,7 @@ import ( "encoding/json" "errors" "fmt" + "net" "net/url" "openflare/model" "regexp" @@ -53,6 +54,8 @@ type ProxyRouteInput struct { CachePolicy string `json:"cache_policy"` CacheRules []string `json:"cache_rules"` CustomHeaders []ProxyRouteCustomHeaderInput `json:"custom_headers"` + PoWEnabled bool `json:"pow_enabled"` + PoWConfig string `json:"pow_config"` Remark string `json:"remark"` } @@ -83,6 +86,8 @@ type ProxyRouteView struct { CacheRuleList []string `json:"cache_rule_list"` CustomHeaders string `json:"custom_headers"` CustomHeaderList []ProxyRouteCustomHeaderInput `json:"custom_header_list"` + PoWEnabled bool `json:"pow_enabled"` + PoWConfig *ProxyRoutePoWConfig `json:"pow_config"` Remark string `json:"remark"` CreatedAt time.Time `json:"created_at"` UpdatedAt time.Time `json:"updated_at"` @@ -196,6 +201,16 @@ func buildProxyRoute(route *model.ProxyRoute, input ProxyRouteInput) (*model.Pro if err != nil { return nil, err } + + powConfig, err := normalizePoWConfig(input.PoWEnabled, input.PoWConfig) + if err != nil { + return nil, err + } + powConfigJSON, err := json.Marshal(powConfig) + if err != nil { + return nil, err + } + if !input.EnableHTTPS { input.RedirectHTTP = false input.CertID = nil @@ -267,6 +282,8 @@ func buildProxyRoute(route *model.ProxyRoute, input ProxyRouteInput) (*model.Pro route.CachePolicy = normalizeCachePolicy(input.CacheEnabled, cachePolicy) route.CacheRules = string(cacheRulesJSON) route.CustomHeaders = string(customHeadersJSON) + route.PoWEnabled = input.PoWEnabled + route.PoWConfig = string(powConfigJSON) route.Remark = remark return route, nil } @@ -303,6 +320,10 @@ func buildProxyRouteView(route *model.ProxyRoute) (*ProxyRouteView, error) { if err != nil { return nil, err } + powConfig, err := decodeStoredPoWConfig(route.PoWEnabled, route.PoWConfig) + if err != nil { + return nil, err + } certIDs, err := decodeStoredCertIDs(route.CertIDs, route.CertID) if err != nil { return nil, err @@ -343,6 +364,8 @@ func buildProxyRouteView(route *model.ProxyRoute) (*ProxyRouteView, error) { CacheRuleList: cacheRules, CustomHeaders: route.CustomHeaders, CustomHeaderList: customHeaders, + PoWEnabled: route.PoWEnabled, + PoWConfig: powConfig, Remark: route.Remark, CreatedAt: route.CreatedAt, UpdatedAt: route.UpdatedAt, @@ -1048,3 +1071,132 @@ func validateOriginHost(raw string) error { func isUniqueConstraintError(err error) bool { return err != nil && strings.Contains(strings.ToLower(err.Error()), "unique") } + +// PoW configuration types and validation + +type ProxyRoutePoWListConfig struct { + IPs []string `json:"ips"` + IPCidrs []string `json:"ip_cidrs"` + Paths []string `json:"paths"` + PathRegexes []string `json:"path_regexes"` + UserAgents []string `json:"user_agents"` +} + +type ProxyRoutePoWConfig struct { + Difficulty int `json:"difficulty"` + Algorithm string `json:"algorithm"` + SessionTTL int `json:"session_ttl"` + ChallengeTTL int `json:"challenge_ttl"` + Whitelist ProxyRoutePoWListConfig `json:"whitelist"` + Blacklist ProxyRoutePoWListConfig `json:"blacklist"` +} + +var powAlgorithmValues = map[string]bool{"fast": true, "slow": true} + +func defaultPoWConfig() ProxyRoutePoWConfig { + return ProxyRoutePoWConfig{ + Difficulty: 4, + Algorithm: "fast", + SessionTTL: 86400, + ChallengeTTL: 300, + Whitelist: ProxyRoutePoWListConfig{IPs: []string{}, IPCidrs: []string{}, Paths: []string{}, PathRegexes: []string{}, UserAgents: []string{}}, + Blacklist: ProxyRoutePoWListConfig{IPs: []string{}, IPCidrs: []string{}, Paths: []string{}, PathRegexes: []string{}, UserAgents: []string{}}, + } +} + +func normalizePoWConfig(enabled bool, raw string) (ProxyRoutePoWConfig, error) { + if !enabled { + return defaultPoWConfig(), nil + } + + cfg := defaultPoWConfig() + text := strings.TrimSpace(raw) + if text != "" && text != "{}" { + if err := json.Unmarshal([]byte(text), &cfg); err != nil { + return cfg, errors.New("pow_config 格式无效") + } + } + + if cfg.Difficulty < 1 || cfg.Difficulty > 16 { + return cfg, errors.New("pow_config.difficulty 必须在 1-16 之间") + } + if !powAlgorithmValues[cfg.Algorithm] { + return cfg, errors.New("pow_config.algorithm 必须为 fast 或 slow") + } + if cfg.SessionTTL < 60 { + return cfg, errors.New("pow_config.session_ttl 不能小于 60 秒") + } + if cfg.ChallengeTTL < 30 { + return cfg, errors.New("pow_config.challenge_ttl 不能小于 30 秒") + } + + for _, cidr := range cfg.Whitelist.IPCidrs { + if _, _, err := net.ParseCIDR(cidr); err != nil { + return cfg, fmt.Errorf("pow_config 白名单 IP CIDR 格式无效: %s", cidr) + } + } + for _, cidr := range cfg.Blacklist.IPCidrs { + if _, _, err := net.ParseCIDR(cidr); err != nil { + return cfg, fmt.Errorf("pow_config 黑名单 IP CIDR 格式无效: %s", cidr) + } + } + + for _, re := range cfg.Whitelist.PathRegexes { + if _, err := regexp.Compile(re); err != nil { + return cfg, fmt.Errorf("pow_config 白名单路径正则格式无效: %s", re) + } + } + for _, re := range cfg.Blacklist.PathRegexes { + if _, err := regexp.Compile(re); err != nil { + return cfg, fmt.Errorf("pow_config 黑名单路径正则格式无效: %s", re) + } + } + + for _, ip := range cfg.Whitelist.IPs { + if net.ParseIP(ip) == nil { + return cfg, fmt.Errorf("pow_config 白名单 IP 格式无效: %s", ip) + } + } + for _, ip := range cfg.Blacklist.IPs { + if net.ParseIP(ip) == nil { + return cfg, fmt.Errorf("pow_config 黑名单 IP 格式无效: %s", ip) + } + } + + type dimension struct { + name string + wl []string + bl []string + } + dimensions := []dimension{ + {"IP", cfg.Whitelist.IPs, cfg.Blacklist.IPs}, + {"IP CIDR", cfg.Whitelist.IPCidrs, cfg.Blacklist.IPCidrs}, + {"路径", cfg.Whitelist.Paths, cfg.Blacklist.Paths}, + {"路径正则", cfg.Whitelist.PathRegexes, cfg.Blacklist.PathRegexes}, + {"User-Agent", cfg.Whitelist.UserAgents, cfg.Blacklist.UserAgents}, + } + for _, dim := range dimensions { + if len(dim.wl) > 0 && len(dim.bl) > 0 { + return cfg, fmt.Errorf("pow_config %s 不能同时配置白名单和黑名单", dim.name) + } + } + + return cfg, nil +} + +func decodeStoredPoWConfig(enabled bool, raw string) (*ProxyRoutePoWConfig, error) { + if !enabled { + cfg := defaultPoWConfig() + return &cfg, nil + } + text := strings.TrimSpace(raw) + if text == "" || text == "{}" { + cfg := defaultPoWConfig() + return &cfg, nil + } + var cfg ProxyRoutePoWConfig + if err := json.Unmarshal([]byte(text), &cfg); err != nil { + return nil, errors.New("pow_config 格式无效") + } + return &cfg, nil +} diff --git a/openflare_server/web/app/layout.tsx b/openflare_server/web/app/layout.tsx index 13700121..ee78dcf9 100644 --- a/openflare_server/web/app/layout.tsx +++ b/openflare_server/web/app/layout.tsx @@ -5,18 +5,18 @@ import type { ReactNode } from 'react'; import { AppProviders } from '@/components/providers/app-providers'; import { getThemeInitScript } from '@/lib/theme/theme'; -import './globals.css'; -import { Geist } from "next/font/google"; -import { cn } from "@/lib/utils"; - -const geist = Geist({subsets:['latin'],variable:'--font-sans'}); - +import './globals.css'; +import { Geist } from "next/font/google"; +import { cn } from "@/lib/utils"; + +const geist = Geist({subsets:['latin'],variable:'--font-sans'}); + export const metadata: Metadata = { title: { default: 'OpenFlare 控制台', template: '%s | OpenFlare', }, - description: 'OpenFlare 管理端新版工程骨架', + description: 'OpenFlare 管理端', applicationName: 'OpenFlare', }; @@ -24,8 +24,8 @@ interface RootLayoutProps { children: ReactNode; } -export default function RootLayout({ children }: RootLayoutProps) { - return ( +export default function RootLayout({ children }: RootLayoutProps) { + return (