From 1fba8f39dd62403f3c843b8639a78175f944150b Mon Sep 17 00:00:00 2001 From: full-bars <45684698+full-bars@users.noreply.github.com> Date: Fri, 7 Aug 2026 20:29:09 -0700 Subject: [PATCH] feat(socks): auth-code/JWT login, network presets, reliability settings, control plane + web panel MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Extends the socks5 client with developer-facing capabilities for test/beta networks and runtime tuning, mirroring the Android developer screen. Login: - --auth-code (env AUTH_CODE) redeems a code via POST /auth/code-login — the flow providers use; beta/test networks have no password accounts. - --jwt (env JWT) skips login entirely and uses an existing network JWT. - Password login remains the default when neither is given. Network presets: - --network=main|beta (env NETWORK) resolves api/platform URL pairs; explicit --api-url/--platform-url override per field. Reliability settings: - --reliability= loads a partial JSON overlay of connect.ReliabilitySettings at startup (ms durations; nil keeps the engine default, explicit zero is applied). Merged over current settings so unset fields are never zeroed. Control plane (loopback only): - --control= starts a local HTTP server. Primary interface is an embedded single-page web panel (1s poll): measurements grid, session header with elapsed time + cumulative traffic + live throughput rates (auto-scaled, from /stats deltas), click-to-cycle preset knobs and toggles, per-exit drop/stall/resume/migrate, reset/shuffle/probe-all, quit. Same endpoints available directly: GET/PUT /settings, POST /actions, GET /metrics, GET /exits, GET /stats. - Security: loopback binding enforced at startup (non-loopback fails fast); mutating requests must carry no Origin header or a loopback Origin (CSRF guard); read-merge-write serialized under a mutex; request bodies capped at 64 KiB; server Read/Write/Idle timeouts. - Panel styled with the URnetwork design tokens from the beta.app.ur.network dashboard; layout, knob groups, and preset lists adapted from the developer tools screen in the URnetwork Beta Android app. Observability: - --metrics-every= prints reliability counters + exit table on an interval; --reset-metrics zeroes counters at startup. Tests: 26 unit tests race-clean covering reliability merge semantics, control endpoints, CSRF guard, loopback enforcement, concurrent-PUT race, stubbed code-login, /stats and quit action. gofmt + go vet clean. --- socks/applyfileover_test.go | 126 +++++++++ socks/control_panel.html | 429 +++++++++++++++++++++++++++++ socks/control_server.go | 337 +++++++++++++++++++++++ socks/coverage_test.go | 415 ++++++++++++++++++++++++++++ socks/docs/control-panel.png | Bin 0 -> 220482 bytes socks/main.go | 279 +++++++++++++++++-- socks/main_test.go | 4 +- socks/reliability_file.go | 302 +++++++++++++++++++++ socks/reliability_test.go | 505 +++++++++++++++++++++++++++++++++++ socks/ur_logo.svg | 1 + 10 files changed, 2377 insertions(+), 21 deletions(-) create mode 100644 socks/applyfileover_test.go create mode 100644 socks/control_panel.html create mode 100644 socks/control_server.go create mode 100644 socks/coverage_test.go create mode 100644 socks/docs/control-panel.png create mode 100644 socks/reliability_file.go create mode 100644 socks/reliability_test.go create mode 100644 socks/ur_logo.svg diff --git a/socks/applyfileover_test.go b/socks/applyfileover_test.go new file mode 100644 index 0000000..c3b0833 --- /dev/null +++ b/socks/applyfileover_test.go @@ -0,0 +1,126 @@ +package main + +import ( + "testing" + "time" +) + +// TestApplyFileOverAllFields walks every field branch of applyFileOver by +// overlaying a file with every field set onto an empty base, then verifying +// each landed. This is the branch-coverage companion to the partial-merge +// semantics test. +func TestApplyFileOverAllFields(t *testing.T) { + overlay := &reliabilityFile{ + UdpTeardownSignal: boolPtr(true), + QuicRebindOnExitLoss: boolPtr(true), + TcpCollapseMaxHoldMs: int64Ptr(1500), + SendStallTimeoutMs: int64Ptr(3000), + ClusterAffinityFallback: boolPtr(true), + ServerNameAffinityBridge: boolPtr(true), + SequenceIdleTimeoutMs: int64Ptr(120000), + TcpSequenceIdleTimeoutMs: int64Ptr(600000), + BlackholeReceiveTimeoutMs: int64Ptr(20000), + MaxFlowsPerExit: intPtr(16), + AffinityStickyPastCap: boolPtr(true), + QuarantineGroupFollow: boolPtr(true), + GroupFollowWindowMs: int64Ptr(45000), + DialFailureRerace: boolPtr(true), + UplinkStalenessGateMs: int64Ptr(5000), + SoftVerdictDemote: boolPtr(true), + RemovalBudgetCount: intPtr(2), + RemovalBudgetWindowMs: int64Ptr(30000), + StandingReserve: boolPtr(true), + EffectiveTierSelection: boolPtr(true), + MinBlackholeDestinations: intPtr(2), + BlackholeLoadCorroboration: intPtr(8), + ProviderProbe: boolPtr(true), + ProbeTimeoutMs: int64Ptr(4000), + ProbeSampleHostCount: intPtr(4), + ProbeSilenceWarnStreak: intPtr(2), + EvaluationPoolMultiple: intPtr(2), + FormationPollTimeoutMs: int64Ptr(200), + BusyProbe: boolPtr(true), + BusyProbeBudgetMs: int64Ptr(1500), + SchedulerPauseToleranceMs: int64Ptr(2000), + SchedulerPauseRecoveryTimeoutMs: int64Ptr(5000), + BlackholeConnectComparativeTimeoutMs: int64Ptr(10000), + HeartbeatIntervalMs: int64Ptr(60000), + } + + dst := &reliabilityFile{} + if err := applyFileOver(dst, overlay); err != nil { + t.Fatal(err) + } + + s, err := fileToSettings(dst) + if err != nil { + t.Fatal(err) + } + + checks := []struct { + name string + got any + want any + }{ + {"UdpTeardownSignal", s.UdpTeardownSignal, true}, + {"QuicRebindOnExitLoss", s.QuicRebindOnExitLoss, true}, + {"TcpCollapseMaxHold", s.TcpCollapseMaxHold, 1500 * time.Millisecond}, + {"SendStallTimeout", s.SendStallTimeout, 3 * time.Second}, + {"ClusterAffinityFallback", s.ClusterAffinityFallback, true}, + {"ServerNameAffinityBridge", s.ServerNameAffinityBridge, true}, + {"SequenceIdleTimeout", s.SequenceIdleTimeout, 120 * time.Second}, + {"TcpSequenceIdleTimeout", s.TcpSequenceIdleTimeout, 600 * time.Second}, + {"BlackholeReceiveTimeout", s.BlackholeReceiveTimeout, 20 * time.Second}, + {"MaxFlowsPerExit", s.MaxFlowsPerExit, 16}, + {"AffinityStickyPastCap", s.AffinityStickyPastCap, true}, + {"QuarantineGroupFollow", s.QuarantineGroupFollow, true}, + {"GroupFollowWindow", s.GroupFollowWindow, 45 * time.Second}, + {"DialFailureRerace", s.DialFailureRerace, true}, + {"UplinkStalenessGate", s.UplinkStalenessGate, 5 * time.Second}, + {"SoftVerdictDemote", s.SoftVerdictDemote, true}, + {"RemovalBudgetCount", s.RemovalBudgetCount, 2}, + {"RemovalBudgetWindow", s.RemovalBudgetWindow, 30 * time.Second}, + {"StandingReserve", s.StandingReserve, true}, + {"EffectiveTierSelection", s.EffectiveTierSelection, true}, + {"MinBlackholeDestinations", s.MinBlackholeDestinations, 2}, + {"BlackholeLoadCorroboration", s.BlackholeLoadCorroboration, 8}, + {"ProviderProbe", s.ProviderProbe, true}, + {"ProbeTimeout", s.ProbeTimeout, 4 * time.Second}, + {"ProbeSampleHostCount", s.ProbeSampleHostCount, 4}, + {"ProbeSilenceWarnStreak", s.ProbeSilenceWarnStreak, 2}, + {"EvaluationPoolMultiple", s.EvaluationPoolMultiple, 2}, + {"FormationPollTimeout", s.FormationPollTimeout, 200 * time.Millisecond}, + {"BusyProbe", s.BusyProbe, true}, + {"BusyProbeBudget", s.BusyProbeBudget, 1500 * time.Millisecond}, + {"SchedulerPauseTolerance", s.SchedulerPauseTolerance, 2 * time.Second}, + {"SchedulerPauseRecoveryTimeout", s.SchedulerPauseRecoveryTimeout, 5 * time.Second}, + {"BlackholeConnectComparativeTimeout", s.BlackholeConnectComparativeTimeout, 10 * time.Second}, + {"HeartbeatInterval", s.HeartbeatInterval, 60 * time.Second}, + } + for _, c := range checks { + if c.got != c.want { + t.Errorf("%s = %v, want %v", c.name, c.got, c.want) + } + } +} + +// TestLoadReliabilitySettingsFile covers the thin file-loading wrapper and +// its error paths. +func TestLoadReliabilitySettingsFile(t *testing.T) { + path := writeRelFile(t, `{"maxFlowsPerExit": 32}`) + s, err := loadReliabilitySettingsFile(path) + if err != nil { + t.Fatal(err) + } + if s.MaxFlowsPerExit != 32 { + t.Errorf("MaxFlowsPerExit = %d, want 32", s.MaxFlowsPerExit) + } + + if _, err := loadReliabilitySettingsFile("/nonexistent.json"); err == nil { + t.Error("expected error for missing file") + } + bad := writeRelFile(t, `{bad`) + if _, err := loadReliabilitySettingsFile(bad); err == nil { + t.Error("expected error for invalid json") + } +} diff --git a/socks/control_panel.html b/socks/control_panel.html new file mode 100644 index 0000000..9ee3f93 --- /dev/null +++ b/socks/control_panel.html @@ -0,0 +1,429 @@ + + + + + + +socksproxy dev panel + + + +
+ URnetwork +
+

socksproxy dev panel

+
connecting...
+
+
--
+
+ +

Measurements

+
loading...
+ +

Actions

+
+ + + + +
+ +
+ +

Exits

+
loading...
+ +
+ + + + diff --git a/socks/control_server.go b/socks/control_server.go new file mode 100644 index 0000000..617ec2c --- /dev/null +++ b/socks/control_server.go @@ -0,0 +1,337 @@ +package main + +import ( + "context" + "encoding/json" + "fmt" + "net" + "net/http" + "net/url" + "sync" + "time" + + _ "embed" + + "github.com/urnetwork/connect" +) + +//go:embed control_panel.html +var controlPanelHTML []byte + +//go:embed ur_logo.svg +var urLogoSVG []byte + +// mcControl is the slice of the multi client the control plane uses. The real +// *connect.RemoteUserNatMultiClient satisfies it; tests substitute a fake. +type mcControl interface { + ReliabilitySettings() *connect.ReliabilitySettings + SetReliabilitySettings(settings *connect.ReliabilitySettings) + ReliabilityMetrics() *connect.ReliabilityMetricsSnapshot + ResetReliabilityMetrics() + Shuffle() + ProbeAllExits() int + Exits() []*connect.ExitInfo + DropExit(clientId connect.Id) bool + StallExit(clientId connect.Id, stalled bool) bool + MigrateExit(clientId connect.Id) int + PacketStats() *connect.PacketStats +} + +// controlServer exposes the live connection to a local http client so the +// dev knobs can be changed mid-run without a reconnect, mirroring the android +// developer screen. Bind it to loopback -- it is an unauthenticated control +// plane. Even on loopback, mutating requests are rejected unless they carry +// no Origin header or a loopback Origin, so a web page open in a browser +// cannot drive the control plane (same class as the webpack-dev-server +// drive-by-localhost CVEs). +type controlServer struct { + server *http.Server + mc mcControl + mu sync.Mutex // serializes the read-merge-write of settings + started time.Time // when the control server came up; session elapsed + cancel context.CancelFunc // optional: quit action cancels the session ctx +} + +// SetCancel wires the session cancel function so the "quit" action can stop +// the process gracefully (same path as Ctrl+C). +func (c *controlServer) SetCancel(cancel context.CancelFunc) { + c.cancel = cancel +} + +// newControlServer builds the local http control plane bound to addr. It does +// not bind until serve is called; addr must be a loopback address (enforced +// by the caller in main.go run). +func newControlServer(addr string, mc mcControl) (*controlServer, error) { + c := &controlServer{mc: mc, started: time.Now()} + mux := http.NewServeMux() + mux.HandleFunc("/", c.handleRoot) + mux.HandleFunc("/favicon.svg", func(w http.ResponseWriter, r *http.Request) { + w.Header().Set("Content-Type", "image/svg+xml") + w.Write(urLogoSVG) + }) + mux.HandleFunc("/settings", c.handleSettings) + mux.HandleFunc("/actions", c.handleActions) + mux.HandleFunc("/metrics", c.handleMetrics) + mux.HandleFunc("/exits", c.handleExits) + mux.HandleFunc("/stats", c.handleStats) + c.server = &http.Server{ + Addr: addr, + Handler: mux, + ReadHeaderTimeout: 5 * time.Second, + ReadTimeout: 10 * time.Second, + WriteTimeout: 10 * time.Second, + IdleTimeout: 60 * time.Second, + } + return c, nil +} + +func (c *controlServer) serve(ctx context.Context) { + go func() { + <-ctx.Done() + shutdownCtx, cancel := context.WithTimeout(context.Background(), time.Second) + defer cancel() + c.server.Shutdown(shutdownCtx) + }() + if err := c.server.ListenAndServe(); err != nil && err != http.ErrServerClosed { + fmt.Printf("control server error: %v\n", err) + } +} + +func writeJSON(w http.ResponseWriter, status int, v any) { + w.Header().Set("Content-Type", "application/json") + w.WriteHeader(status) + json.NewEncoder(w).Encode(v) +} + +// handleRoot serves the embedded dev panel (the GUI mirror of the android +// developer screen). Everything else on / is a 404; the api routes are +// registered explicitly. +func (c *controlServer) handleRoot(w http.ResponseWriter, r *http.Request) { + if r.URL.Path != "/" { + http.NotFound(w, r) + return + } + w.Header().Set("Content-Type", "text/html; charset=utf-8") + w.Write(controlPanelHTML) +} + +// loopbackOrigin reports whether the request's Origin header (if any) is a +// loopback origin. A request with no Origin header (curl, local scripts) is +// allowed; a browser cross-origin request always sends Origin, and only +// loopback origins may drive the unauthenticated control plane. +func loopbackOrigin(r *http.Request) bool { + origin := r.Header.Get("Origin") + if origin == "" { + return true + } + u, err := url.Parse(origin) + if err != nil || u.Hostname() == "" { + return false + } + host := u.Hostname() + ip := net.ParseIP(host) + if host != "localhost" && (ip == nil || !ip.IsLoopback()) { + return false + } + return true +} + +// GET /settings -> current ReliabilitySettings as ms/json +// PUT /settings -> partial reliabilityFile; only named fields change +func (c *controlServer) handleSettings(w http.ResponseWriter, r *http.Request) { + switch r.Method { + case http.MethodGet: + c.mu.Lock() + s := c.mc.ReliabilitySettings() + c.mu.Unlock() + writeJSON(w, http.StatusOK, settingsToFile(s)) + case http.MethodPut, http.MethodPost: + if !loopbackOrigin(r) { + writeJSON(w, http.StatusForbidden, map[string]string{"error": "non-loopback origin rejected"}) + return + } + var f reliabilityFile + r.Body = http.MaxBytesReader(w, r.Body, 64<<10) // 64 KiB is plenty for a settings overlay + if err := json.NewDecoder(r.Body).Decode(&f); err != nil { + writeJSON(w, http.StatusBadRequest, map[string]string{"error": err.Error()}) + return + } + // start from current so unset fields are preserved + c.mu.Lock() + merged, err := mergeReliabilitySettings(c.mc.ReliabilitySettings(), f) + if err != nil { + c.mu.Unlock() + writeJSON(w, http.StatusBadRequest, map[string]string{"error": err.Error()}) + return + } + c.mc.SetReliabilitySettings(merged) + out := settingsToFile(c.mc.ReliabilitySettings()) + c.mu.Unlock() + writeJSON(w, http.StatusOK, out) + default: + w.WriteHeader(http.StatusMethodNotAllowed) + } +} + +// POST /actions {"action":"drop|stall|migrate|shuffle|probe-all|reset-metrics","clientId":"...","stalled":true} +func (c *controlServer) handleActions(w http.ResponseWriter, r *http.Request) { + if r.Method != http.MethodPost { + w.WriteHeader(http.StatusMethodNotAllowed) + return + } + if !loopbackOrigin(r) { + writeJSON(w, http.StatusForbidden, map[string]string{"error": "non-loopback origin rejected"}) + return + } + var req struct { + Action string `json:"action"` + ClientId string `json:"clientId"` + Stalled bool `json:"stalled"` + } + r.Body = http.MaxBytesReader(w, r.Body, 64<<10) + if err := json.NewDecoder(r.Body).Decode(&req); err != nil { + writeJSON(w, http.StatusBadRequest, map[string]string{"error": err.Error()}) + return + } + switch req.Action { + case "quit": + if c.cancel != nil { + c.cancel() + writeJSON(w, http.StatusOK, map[string]any{"ok": true, "quitting": true}) + } else { + writeJSON(w, http.StatusInternalServerError, map[string]string{"error": "no cancel wired"}) + } + case "reset-metrics": + c.mc.ResetReliabilityMetrics() + writeJSON(w, http.StatusOK, map[string]any{"ok": true}) + case "shuffle": + c.mc.Shuffle() + writeJSON(w, http.StatusOK, map[string]any{"ok": true}) + case "probe-all": + n := c.mc.ProbeAllExits() + writeJSON(w, http.StatusOK, map[string]any{"scheduled": n}) + case "drop", "stall", "migrate": + if req.ClientId == "" { + writeJSON(w, http.StatusBadRequest, map[string]string{"error": "clientId required"}) + return + } + id, err := connect.ParseId(req.ClientId) + if err != nil { + writeJSON(w, http.StatusBadRequest, map[string]string{"error": fmt.Sprintf("bad clientId: %v", err)}) + return + } + switch req.Action { + case "drop": + ok := c.mc.DropExit(id) + writeJSON(w, http.StatusOK, map[string]any{"ok": ok}) + case "stall": + ok := c.mc.StallExit(id, req.Stalled) + writeJSON(w, http.StatusOK, map[string]any{"ok": ok}) + case "migrate": + n := c.mc.MigrateExit(id) + writeJSON(w, http.StatusOK, map[string]any{"moved": n}) + } + default: + writeJSON(w, http.StatusBadRequest, map[string]string{"error": "unknown action"}) + } +} + +// GET /metrics -> reliability snapshot +func (c *controlServer) handleMetrics(w http.ResponseWriter, r *http.Request) { + m := c.mc.ReliabilityMetrics() + writeJSON(w, http.StatusOK, m) +} + +// GET /exits -> current exit table +func (c *controlServer) handleExits(w http.ResponseWriter, r *http.Request) { + writeJSON(w, http.StatusOK, c.mc.Exits()) +} + +// statsResponse is the session-level readout the panel's header row shows: +// elapsed time and bytes/packets up and down since the control server +// started. Egress = traffic sent toward the network (up), Ingress = traffic +// received back (down). +type statsResponse struct { + ElapsedSeconds int64 `json:"elapsedSeconds"` + BytesUp int64 `json:"bytesUp"` + BytesDown int64 `json:"bytesDown"` + PacketsUp int64 `json:"packetsUp"` + PacketsDown int64 `json:"packetsDown"` +} + +// GET /stats -> session elapsed + traffic counters +func (c *controlServer) handleStats(w http.ResponseWriter, r *http.Request) { + ps := c.mc.PacketStats() + elapsed := time.Since(c.started) / time.Second + writeJSON(w, http.StatusOK, &statsResponse{ + ElapsedSeconds: int64(elapsed), + BytesUp: int64(ps.RemoteEgressByteCount), + BytesDown: int64(ps.RemoteIngressByteCount), + PacketsUp: int64(ps.RemoteEgressPacketCount), + PacketsDown: int64(ps.RemoteIngressPacketCount), + }) +} + +// settingsToFile renders current settings as the json-friendly shape. +func settingsToFile(s *connect.ReliabilitySettings) *reliabilityFile { + if s == nil { + return &reliabilityFile{} + } + ms := func(d time.Duration) *int64 { + v := int64(d / time.Millisecond) + return &v + } + b := func(v bool) *bool { return &v } + i := func(v int) *int { return &v } + return &reliabilityFile{ + UdpTeardownSignal: b(s.UdpTeardownSignal), + QuicRebindOnExitLoss: b(s.QuicRebindOnExitLoss), + TcpCollapseMaxHoldMs: ms(s.TcpCollapseMaxHold), + SendStallTimeoutMs: ms(s.SendStallTimeout), + ClusterAffinityFallback: b(s.ClusterAffinityFallback), + ServerNameAffinityBridge: b(s.ServerNameAffinityBridge), + SequenceIdleTimeoutMs: ms(s.SequenceIdleTimeout), + TcpSequenceIdleTimeoutMs: ms(s.TcpSequenceIdleTimeout), + BlackholeReceiveTimeoutMs: ms(s.BlackholeReceiveTimeout), + MaxFlowsPerExit: i(s.MaxFlowsPerExit), + AffinityStickyPastCap: b(s.AffinityStickyPastCap), + QuarantineGroupFollow: b(s.QuarantineGroupFollow), + GroupFollowWindowMs: ms(s.GroupFollowWindow), + DialFailureRerace: b(s.DialFailureRerace), + UplinkStalenessGateMs: ms(s.UplinkStalenessGate), + SoftVerdictDemote: b(s.SoftVerdictDemote), + RemovalBudgetCount: i(s.RemovalBudgetCount), + RemovalBudgetWindowMs: ms(s.RemovalBudgetWindow), + StandingReserve: b(s.StandingReserve), + EffectiveTierSelection: b(s.EffectiveTierSelection), + MinBlackholeDestinations: i(s.MinBlackholeDestinations), + BlackholeLoadCorroboration: i(s.BlackholeLoadCorroboration), + ProviderProbe: b(s.ProviderProbe), + ProbeTimeoutMs: ms(s.ProbeTimeout), + ProbeSampleHostCount: i(s.ProbeSampleHostCount), + ProbeSilenceWarnStreak: i(s.ProbeSilenceWarnStreak), + EvaluationPoolMultiple: i(s.EvaluationPoolMultiple), + FormationPollTimeoutMs: ms(s.FormationPollTimeout), + BusyProbe: b(s.BusyProbe), + BusyProbeBudgetMs: ms(s.BusyProbeBudget), + SchedulerPauseToleranceMs: ms(s.SchedulerPauseTolerance), + SchedulerPauseRecoveryTimeoutMs: ms(s.SchedulerPauseRecoveryTimeout), + BlackholeConnectComparativeTimeoutMs: ms(s.BlackholeConnectComparativeTimeout), + HeartbeatIntervalMs: ms(s.HeartbeatInterval), + } +} + +// mergeReliabilitySettings applies a partial file over the current settings. +func mergeReliabilitySettings(cur *connect.ReliabilitySettings, f reliabilityFile) (*connect.ReliabilitySettings, error) { + if cur == nil { + cur = &connect.ReliabilitySettings{} + } + // reuse the loader by round-tripping through the file it would produce + merged := settingsToFile(cur) + // overwrite named fields (json decode already validated types) + if err := applyFileOver(merged, &f); err != nil { + return nil, err + } + // build back into a struct + return fileToSettings(merged) +} diff --git a/socks/coverage_test.go b/socks/coverage_test.go new file mode 100644 index 0000000..47aff26 --- /dev/null +++ b/socks/coverage_test.go @@ -0,0 +1,415 @@ +package main + +import ( + "context" + "encoding/json" + "io" + "net/http" + "net/http/httptest" + "os" + "strings" + "testing" + "time" + + "github.com/golang-jwt/jwt/v5" + "github.com/urnetwork/connect" +) + +// --- pure helpers in main.go --- + +func TestFmtDurationMillis(t *testing.T) { + cases := []struct { + ms int64 + want string + }{ + {0, "0ms"}, + {500, "500ms"}, + {1000, "1.0s"}, + {1500, "1.5s"}, + {65000, "65.0s"}, + {-1, "-"}, + } + for _, c := range cases { + if got := fmtDurationMillis(c.ms); got != c.want { + t.Errorf("fmtDurationMillis(%d) = %q, want %q", c.ms, got, c.want) + } + } +} + +func TestExitLabel(t *testing.T) { + id, err := connect.ParseId("019fde39-e690-add0-ac88-e354a0d76d6a") + if err != nil { + t.Fatal(err) + } + if got := exitLabel(id); got != "a0d76d6a" { + t.Errorf("exitLabel = %q, want last-8 chars", got) + } + // a short id must be returned whole (the len<=8 branch). connect.ParseId + // only accepts full-length ids, so test the string logic directly. + if got := exitLabelString("abcd"); got != "abcd" { + t.Errorf("exitLabelString(short) = %q, want whole id", got) + } + if got := exitLabelString("abcdefgh"); got != "abcdefgh" { + t.Errorf("exitLabelString(8) = %q, want whole id", got) + } +} + +func TestFilterMapSlice(t *testing.T) { + nums := []int{1, 2, 3, 4} + evens := filter(nums, func(v int) bool { return v%2 == 0 }) + if len(evens) != 2 || evens[0] != 2 || evens[1] != 4 { + t.Errorf("filter evens = %v, want [2 4]", evens) + } + doubled := mapSlice(nums, func(v int) int { return v * 2 }) + if len(doubled) != 4 || doubled[3] != 8 { + t.Errorf("mapSlice doubled = %v, want [2 4 6 8]", doubled) + } +} + +// parseByJwtClientId extracts the client_id claim from an (unverified) JWT. +func TestParseByJwtClientId(t *testing.T) { + cid := "019fde39-e690-add0-ac88-e354a0d76d6a" + tok := jwt.NewWithClaims(jwt.SigningMethodHS256, jwt.MapClaims{ + "client_id": cid, + }) + signed, err := tok.SignedString([]byte("test-secret")) + if err != nil { + t.Fatal(err) + } + got, err := parseByJwtClientId(signed) + if err != nil { + t.Fatalf("parseByJwtClientId: %v", err) + } + if got.String() != cid { + t.Errorf("client id = %s, want %s", got.String(), cid) + } + + // missing client_id claim -> error + bad := jwt.NewWithClaims(jwt.SigningMethodHS256, jwt.MapClaims{"sub": "x"}) + badSigned, err := bad.SignedString([]byte("test-secret")) + if err != nil { + t.Fatal(err) + } + if _, err := parseByJwtClientId(badSigned); err == nil { + t.Error("expected error for JWT without client_id claim") + } +} + +// --- getProviderSpec using the real sample fixture --- + +func loadSampleLocations(t *testing.T) *FindLocationsResult { + t.Helper() + data, err := os.ReadFile("findLocations.sample.json") + if err != nil { + t.Skipf("sample fixture not present: %v", err) + } + var res FindLocationsResult + if err := json.Unmarshal(data, &res); err != nil { + t.Fatalf("unmarshal fixture: %v", err) + } + return &res +} + +func TestGetProviderSpecByCountry(t *testing.T) { + locs := loadSampleLocations(t) + specs, err := getProviderSpec(locs, "", "United States", "", "") + if err != nil { + t.Fatal(err) + } + if len(specs) != 1 || specs[0].LocationId == nil { + t.Fatalf("country spec = %+v, want 1 spec with LocationId", specs) + } +} + +func TestGetProviderSpecByCityCaseInsensitive(t *testing.T) { + locs := loadSampleLocations(t) + specs, err := getProviderSpec(locs, "los angeles", "", "", "") + if err != nil { + t.Fatal(err) + } + if len(specs) != 1 || specs[0].LocationId == nil { + t.Fatalf("city spec = %+v, want 1 spec", specs) + } +} + +func TestGetProviderSpecByProviderID(t *testing.T) { + locs := loadSampleLocations(t) + cid := "019fde39-e690-add0-ac88-e354a0d76d6a" + specs, err := getProviderSpec(locs, "", "", "", cid) + if err != nil { + t.Fatal(err) + } + if len(specs) != 1 || specs[0].ClientId == nil || specs[0].ClientId.String() != cid { + t.Fatalf("provider-id spec = %+v, want client %s", specs, cid) + } +} + +func TestGetProviderSpecBadProviderID(t *testing.T) { + locs := loadSampleLocations(t) + if _, err := getProviderSpec(locs, "", "", "", "not-an-id"); err == nil { + t.Fatal("expected error for malformed provider id") + } +} + +func TestGetProviderSpecNoMatch(t *testing.T) { + locs := loadSampleLocations(t) + if _, err := getProviderSpec(locs, "", "Atlantis", "", ""); err == nil { + t.Fatal("expected error for unmatched country") + } +} + +// --- loginWithAuthCode against a stubbed /auth/code-login --- + +func TestLoginWithAuthCodeSuccess(t *testing.T) { + expectedJwt := "eyJhbGciOiJIUzI1NiJ9.eyJjbGllbnRfaWQiOiIwMTlmZGUzOS1lNjkwLWFkZDAtYWM4OC1lMzU0YTBkNzZkNmEifQ.fake" + srv := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + if r.URL.Path != "/auth/code-login" { + t.Errorf("path = %s, want /auth/code-login", r.URL.Path) + } + var body map[string]any + json.NewDecoder(r.Body).Decode(&body) + if body["auth_code"] != "the-code" { + t.Errorf("auth_code = %v, want the-code", body["auth_code"]) + } + w.Header().Set("Content-Type", "application/json") + json.NewEncoder(w).Encode(map[string]any{"by_jwt": expectedJwt}) + })) + defer srv.Close() + + got, err := loginWithAuthCode(context.Background(), srv.URL, "the-code") + if err != nil { + t.Fatalf("loginWithAuthCode: %v", err) + } + if got != expectedJwt { + t.Errorf("jwt = %q, want %q", got, expectedJwt) + } +} + +func TestLoginWithAuthCodeError(t *testing.T) { + srv := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + w.Header().Set("Content-Type", "application/json") + json.NewEncoder(w).Encode(map[string]any{ + "error": map[string]any{"message": "invalid auth code"}, + }) + })) + defer srv.Close() + + if _, err := loginWithAuthCode(context.Background(), srv.URL, "bad"); err == nil { + t.Fatal("expected error for rejected auth code") + } else if !strings.Contains(err.Error(), "invalid auth code") { + t.Errorf("error = %v, want it to surface the backend message", err) + } +} + +// --- control server error branches --- + +func TestControlSettingsBadJSON(t *testing.T) { + mc := &fakeMC{} + c, err := newControlServer("127.0.0.1:0", mc) + if err != nil { + t.Fatal(err) + } + srv := httptest.NewServer(c.server.Handler) + defer srv.Close() + + req, _ := http.NewRequest("PUT", srv.URL+"/settings", strings.NewReader("{not json")) + resp, err := http.DefaultClient.Do(req) + if err != nil { + t.Fatal(err) + } + if resp.StatusCode != http.StatusBadRequest { + t.Errorf("PUT bad json status = %d, want 400", resp.StatusCode) + } + resp.Body.Close() +} + +func TestControlActionsStallMigrate(t *testing.T) { + mc := &fakeMC{} + c, err := newControlServer("127.0.0.1:0", mc) + if err != nil { + t.Fatal(err) + } + srv := httptest.NewServer(c.server.Handler) + defer srv.Close() + + cid := "019fde39-e690-add0-ac88-e354a0d76d6a" + + resp, err := http.Post(srv.URL+"/actions", "application/json", + strings.NewReader(`{"action":"stall","clientId":"`+cid+`","stalled":true}`)) + if err != nil { + t.Fatal(err) + } + resp.Body.Close() + if len(mc.stalled) != 1 || mc.stalled[0] != cid { + t.Errorf("stalled = %v, want [%s]", mc.stalled, cid) + } + + resp, err = http.Post(srv.URL+"/actions", "application/json", + strings.NewReader(`{"action":"migrate","clientId":"`+cid+`"}`)) + if err != nil { + t.Fatal(err) + } + resp.Body.Close() + if len(mc.migrated) != 1 || mc.migrated[0] != cid { + t.Errorf("migrated = %v, want [%s]", mc.migrated, cid) + } + + // malformed client id -> 400 + resp, err = http.Post(srv.URL+"/actions", "application/json", + strings.NewReader(`{"action":"drop","clientId":"nope"}`)) + if err != nil { + t.Fatal(err) + } + if resp.StatusCode != http.StatusBadRequest { + t.Errorf("drop bad clientId status = %d, want 400", resp.StatusCode) + } + resp.Body.Close() +} + +// TestControlQuitAction verifies the quit action invokes the wired cancel. +func TestControlQuitAction(t *testing.T) { + mc := &fakeMC{} + c, err := newControlServer("127.0.0.1:0", mc) + if err != nil { + t.Fatal(err) + } + cancelled := false + c.SetCancel(func() { cancelled = true }) + srv := httptest.NewServer(c.server.Handler) + defer srv.Close() + + resp, err := http.Post(srv.URL+"/actions", "application/json", strings.NewReader(`{"action":"quit"}`)) + if err != nil { + t.Fatal(err) + } + if resp.StatusCode != http.StatusOK { + t.Fatalf("POST quit status = %d, want 200", resp.StatusCode) + } + resp.Body.Close() + if !cancelled { + t.Error("quit action did not invoke the session cancel") + } +} + +// --- /stats session readout --- + +func TestControlStatsEndpoint(t *testing.T) { + mc := &fakeMC{} + c, err := newControlServer("127.0.0.1:0", mc) + if err != nil { + t.Fatal(err) + } + srv := httptest.NewServer(c.server.Handler) + defer srv.Close() + + resp, err := http.Get(srv.URL + "/stats") + if err != nil { + t.Fatal(err) + } + defer resp.Body.Close() + if resp.StatusCode != http.StatusOK { + t.Fatalf("GET /stats status = %d, want 200", resp.StatusCode) + } + var st statsResponse + if err := json.NewDecoder(resp.Body).Decode(&st); err != nil { + t.Fatal(err) + } + if st.BytesUp != 1024 || st.BytesDown != 2048 { + t.Errorf("stats bytes = %d up / %d down, want 1024/2048", st.BytesUp, st.BytesDown) + } + if st.PacketsUp != 10 || st.PacketsDown != 20 { + t.Errorf("stats packets = %d up / %d down, want 10/20", st.PacketsUp, st.PacketsDown) + } + if st.ElapsedSeconds < 0 { + t.Errorf("elapsedSeconds = %d, want >= 0", st.ElapsedSeconds) + } +} + +// --- serve() shutdown on context cancel --- + +func TestControlServerServeShutdown(t *testing.T) { + mc := &fakeMC{} + // port 0 = ephemeral; we only verify the goroutine exits on ctx cancel + c, err := newControlServer("127.0.0.1:0", mc) + if err != nil { + t.Fatal(err) + } + ctx, cancel := context.WithCancel(context.Background()) + done := make(chan struct{}) + go func() { + c.serve(ctx) + close(done) + }() + time.Sleep(50 * time.Millisecond) + cancel() + select { + case <-done: + // clean exit + case <-time.After(3 * time.Second): + t.Fatal("serve did not return within 3s of ctx cancel") + } +} + +// --- printReliabilityMetrics output format --- + +func TestPrintReliabilityMetrics(t *testing.T) { + mc := &fakeMC{ + settings: &connect.ReliabilitySettings{}, + metrics: &connect.ReliabilityMetricsSnapshot{ + FlowsOpened: 12, + DialFailuresIntercepted: 3, + FlowsReraced: 2, + ExitLossEvents: 1, + FlowsLostToExit: 4, + MaxFlowsLostInOneEvent: 4, + MeanFlowsLostPerExitLoss: 4.0, + RecoveryCount: 1, + RecoveryMeanNanos: 500 * 1e6, + RecoveryMaxNanos: 1500 * 1e6, + ProbesSent: 10, + ProbesAnswered: 8, + ProvidersQualified: 3, + VerdictsHeldUplinkStale: 2, + VerdictsHeldTransportDown: 1, + }, + exits: []*connect.ExitInfo{ + {ClientId: mustParseId(t, "019fde39-e690-add0-ac88-e354a0d76d6a"), FlowCount: 5, Tier: 1, EffectiveTier: 1, Proven: true}, + }, + } + + // capture stdout + old := os.Stdout + r, w, _ := os.Pipe() + os.Stdout = w + printReliabilityMetrics(mc) + w.Close() + os.Stdout = old + buf, _ := io.ReadAll(r) + r.Close() + out := string(buf) + + for _, want := range []string{ + "reliability metrics", + "flows_opened=12", + "dial_failures_intercepted=3", + "exit_loss_events=1", + "mean_flows_lost_per_exit_loss=4.00", + "recovery_mean=500ms", + "probes_sent=10", + "verdicts_held_uplink_stale=2", + "exits:", + } { + if !strings.Contains(out, want) { + t.Errorf("metrics output missing %q; got:\n%s", want, out) + } + } +} + +func mustParseId(t *testing.T, s string) connect.Id { + t.Helper() + id, err := connect.ParseId(s) + if err != nil { + t.Fatal(err) + } + return id +} diff --git a/socks/docs/control-panel.png b/socks/docs/control-panel.png new file mode 100644 index 0000000000000000000000000000000000000000..f2cac217dea04edb9132641c824799e1c35bdf3f GIT binary patch literal 220482 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

$jEN(P7yujTC5(9}@pn_KVhn}@<=qjLWW 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%0DZbw{|WsNXIj4UnE?RBaHqvFgvZWA{m zsDg7Kd39$>*Z%e67O?bUY!2VSij7rD^vF|>84!=aCm#iZVbTW~vW?PA3%Pc5d3;7x z9D)L(Pd0sgE2Qzhlv79`yxqnOqL;FygKzcGZK6@7BDrU@h1BuB$`=UJ=;04=xE=P< zxb_#JI=uVct?C~7~SC2@b-jU{#~evA<>ENc#_7A8-rJ5BD= zElKQ}V5t#4GVDX^=3GNrG=-Dllk1+!Gx{t2HM3o$-y>oiDNbT3UzA7~8c|SJLR<~f ztjG+RQ*&_`e8ILp|1o^CX^wo+6nGWX5Sn0yrOmD!eC4m=-;-bDvsd1V+&pjVj7z`% zt9qk8;w(Vw11t04uKTz14(ytt=D~@)#2}Uka{u!dHk8tm5?CEDHa`Sw38cdK;Tkjy zAHe80oUogDyLFGq!y6}`Au~ceE5O$CeMqR7I9ULM!H^^@pBH|CLZozrfrdYh7Qm>^ zVq*>qg2-mMaKHsAk4a3RpP>GOwt_7jVqW|dIx+A|)?)uw%4=JDQRZ*6X|zwO^gQ@x z$wh>Di+2L0fXz&;HO~2Wu0?j7DF)Iq%ZYss9h(zRD#;t$;O-3EWFTf+wn4c&`odv) zWwbd!=Le<7Tl0Uh05%bz(-wm{S&W=)%Yr)NYtF&C_z$pZqAjdQ5QiUybr#Wa1pNhJ zY_SW5v0OhBbhmaW8q&o>RuYPTFm9KYjW&Bfl6}?Lm{(0?kO9?a=qaXww?~#Q3)}CE zlcW75%oMbzE-KcIzZCpgT%rG)m!p7nQsKAN=m!8Pw0tnGid?UP3fA5-Gq< z!JbIg0gto{b}$I{DC=`rE_Ygm?}A5NVI+`RVzC7WM0T=JXl%UCkqs9V(3#)h7n1JT zQRxTm4tP(+yG%j@z(7R81J?(gI^ttkmP{wgcnt7FY^GyE!P%DPSGmcj?O-@nHTE%H z$a!&7k{?tSs@;Kx515Wfv*xMUr1L8z__F(@AU^0%l_M;c##yBbIGeM*lT3C7&*Dev z8^EWR&mauFU8P8i6D;daoLVvzAj``z9xtL9o$!v^6@^IsU*tPi zL=U=0u-B=!u?#r3t(=|hUrV#L7p0yp-@7Gk(R{X7`lUm->ek@sPaT`V@BX-hFF&xA zw3-zM*xX)Ky2}JfvK*{N%Lm`{p^;SNbdbRS5%-{}Z`$uWtUIUVlvmjJA1F+7{v=j8 z?tb_AMck{ifg?K=rs@bG_nbE>(1^2*1Yd&$Z<4DqYEI?V&<281z`u4s_~3RN8tXal zX{riLOntq^aY0$D)_0k%qDua9*}7%NpF*O;41?_;=!(vU0(QUI!i4qPfdlmdIbrqg z<4Ru5G^$K1*25?_A6#EP!+=3F4h1qCfF8T(sE0v1D$Cy(7c7{Uk7l!oL6;C)vuwmn zN3rq4?h!Mq=05`hrU6p*uE542zQC7~>#~2F;(P$+gqU@>WSc86qNT*4xMCYT_4^Zd zIqjTEV*i958{C-4IH(s~Lpx&D#aB-+hn+;J(8T)se0-@hweWi%uh{#A-&;D&8y?Jn zAIxqAY<<3!E#dj1j15UopWbVJI(zvSm3i+hG#xS1;6I*5<9gZh(9(}= z*wH9(XC;RVm{o8GsA2d~X-4I^abp5J&wEn9gYleeL%9&rH)AIr0L5dh+ZJ0o)c6ef z{grQNE@Z#$9UiXIxK3SSXV>)Eh{fKa)Q+OsA?H)BudzCYvU!mDDeWzVA{dzX(d zG+BJp0fyWT6nJ?r0p;%9%$cl~FCs6`yf&`wezsiYuB4yy{JN`{-*NbYeb#-y2$E## zF)z^&TX-IDA*}O(laq0s$5f~If%Mtd8`3uMxh5}p3!3X*Y^>s{=YD*wCIL2F+-W>N z2&Krq{(fqk$=xj}QJA0!i_&-+Ed8($+!u6gy3b~^nhB``5C5LNvGnm9{i9(-UP!Z`QVdNZ+A7Ezp3Vys@rWUitOQO*uV;3&qDrza{bmB_8Y!$yv4C z@~tZOUYHwEa&jti?aSId!PYX2Cf@XQ9*l_Q7!dwBnSb&n*8)B2*KGT7=hiO|Vc z7>bN>(8!pVt=2Mr2oP?1C>55QWpk zCFvL#l<8&7NQkm`+)`JOwR7IB+}@{>)Iny+;tU8=<5caYpF+L}{0;p0uc`+|1P^=; zY%tOc#9Zky@&#{PWEd~8c5H6yY)o&r_uIRuyB&A?HiX=2N%PQ9_kn#k-S3mvT#%lv z$$bgUwqX;}BcWNfTccq}o?TOEK{G0+UFYvyn&CuxG4`v}#PnsfQl143rrA5A7iV)3 z;<8;NMlU5i2U45S$~&BgAi&{0EH-ePSf5hg+M?oiF?+42FUBMl_-CJ9a>#e~^DHvR z0zR23pOjm{)52#@zP!@pfO_%;P1?!t?;E9iki~b?u_R!53IcNBUJYmr_1(<9u@nu_ z)d@i-#~Jq}6fN2&tGxWl&yR;5>CDSU5ctERXZL)ot$2HWr&8y7bojX|WK?$u{vpC# zr#Dji=W1OCus_KF0OU;1L*-{uUZ*vd9UWdwI>v?GXHiFN!C#x~19>qs>Ig}@{M@^1 ze^>-gzma2E#^a034{sK42!50HXluSn*xe`p&8_1yc(3{Lci$65S6epu?0vr4w{dY4 zOn)KdTmcm&f+R(P8^9-?OVpg?*FxKu|M7vD`U5+`&)4^#tG243rw4I1d$PsdNd%n-IA z&-uXRa|6;*;_`Jnzf#ZhY{L9=Sxduc!@*GfpQNhX(ty-#yKGY1gSDp`-9$MhUnz`L zbV50*$PwiFMn;r2%0Oq`n0TIekB89+y7?#1o?UOqtZxMZ*qDWmfE{FO0!H}HSMIkn zZhD>;cp!W5lH(S=ysiE0@l|DWRIVS~EraX4zjOkmWnU2wwZ)k$V-~w@cd2S>&ez#0 z0rq%cC?+ocLY3rDE^h~*x;(LmtnKZmyF);oYVtea{P+YqQ~B7`)CoX-NZ934c0dFO zxb){(GQTR%F1ais{@HVr%nkASjuiEL?Cdzc>Oz?Ix*b7*TwGk-@;vuv>oIfoe@?rC zw0H(j95+_e{)his2!+BOlJXou`#6tZaHWZ~XNnZTpVWShsF|>ypa^LX0b1JI12EAGr9WXFR2T>gv1~ZFavvDg0UA#e!zFdGl4hh@oMxG*q8|u71_w9tyU%~+{@xzCJ9pt4bc)^azVxnYN~Gew*}FU+ zw?DH~rSED6VL)R}VIw_A7BF(NXa_8^7@3&f)d!^hwe2$4UQ1E~yCA@*@&f-DGoJ%} z9QfU1gmoL>3T1=Zjcn;n_sn zP}1vZUk=wlxDTikj)ZKGv8gGOcFbFHvS1Ik^y{6WElo|aNJCuxZ~%C4?4fa?p&2@5 zfV18v%rp8nyz8o%WfsC;-sPtq)Y#d&@i0%D7OOtGzahG{m$h__u5h{VuqA_P{3b_q ziDXJXIbt6pOlo&pP@KVR-&tH-+#3v~=pO}xJ2>OYkJ6qmUuceB!!wUK!f=`bF(iQW z)#iT_bJJMxyKR$h?S3`K@r#{jyapON4Q(S}r6Tfxlsy5Q8)m%ZGKHlsaoA@3nQ6zw z!di?0cB)p5g_NVH!i!~noPJqq#@^D+5Lpr@c?={exIdKfdTf98W#O{6dih`8flQK| zH}vY+9Y2o@%-bAaTZymW$}XU8RFmeq%k{^>X|F%9Hti9_Je&iD4e4q3yCZOMh>%X& z18)Jb&x7=CV{8E)=C4RMZFn?bbFtd)Zfg4F;_kM3=e^J8BJH{rLRt>?aq77Cc{kGQ z;;&Ivi`|$W7B;W`{`71(**6c*UcFmUE=DdYUPU`TiJfyLg*Hl=?izh{6 zL(SMBszniZh)>7K@#f3z;9%vL3SF-~W$F~FP)uLcY(Q_Xm7F?^<`HV6)v@F&QV?sB zwdMk8w$m+a?D**2qnNJ#_3>h)uGh){F^x6u{qqxqGfKD{igJEGgs`hlA*8v=t~>DM zb37i!@O$#yuAAOS!Iu&JR#;}j4x^^wvVtpNv zzGB(xL&{0$ya`719&}d*WY@akJIOQLbpAvzpn%gZge`jp9)RaijNx-&V1_j09WZv) zxoBcUu6R>4XjCsQ=1bJIhCWy+W542am2Ou1@Yy>qE$xYBeMNBzLcH~j$>ZhW?1w;O z1U)+W8*5)bKcr(LT=&bfQcx`*d5WViy|k(>(4_rILW1x{{dcQ?#Bb7H4N4CGqzv@5 zQy;9f;JhAyJxcDgXWyL=UXISra7=v#&fMktegKW0KuyKCZ1~56w!s25R%|qUqB<|nZY%OW_aaSjg=zNW>>={F9&S|UY6F{K^foTTF#I-61yS#K{vWRn^JmkO{XUHGa{AYiS?G6|e=KQ+q|mA4$ro8dYK95xwF!^ zed&(2UuEnsj;c}@)pZIA3&T#VE;Dl)_MfoB)Q2txPDK#1zzd=Dk&MI$4(Zf(DsZVo z1p1S68Eis9p948N^4bJU+sS<^fB4gScT=OLz4a_jxb6-8^O*W`(**RfBi2VaRfpT( zz^}6S^m`Asw6yefOyqt6@Oz+_z%m9*L6?@6_Lc`;0V5oKZ-F~3SqTXU(5@O88NF?4 zf*V3K0$zk}kd3&q9OOJ_3Gl$CM;tb8|Wxe13(7M#6Ed03HaDdy_ZObp_+=C8Wf(^P~s_7ThCU3&3bqA+_i=jy%Ei}d!VNRq~8&cg8d3Ek?qF9 z!UEU}A5e?lnIYU9g-+<5s8QJmTFr>0R2aaTaKR?by z;?l5J@I*y6hxvunhIq&YLf2NnIi}dgSJDSx6Y)1m@JpR7Hlsq6_Kapy;2IrxH9I@w z2O=FHCmBp|_#z0`Lo9CJzHLN`W%l}>zMdZW)7dXyhPH=ifq;(|WfS0ja{|)ducHE?(XbppJVe8&3pg z@^#jC3Pdw`Orw1G@sWYJNx^uDOs~vgrz3}PJ#$({O%0!Cxai}dV>tF$B8hsu%=P3j3a;_~ zUQ`r7lBkj~DoWZHYHfV`v{=zLGG#hAIKAMkLo?aA zL|Wq=MH~7$ia$@%7o?4a424?C>go}^vgiu;v;hlxK+Yd|^ zW2?yMXj`{jIhx!siil8bOeT)jQsBi_P8Wo%*hxm7Y?Wf4#6>@C*Gq!n`F#L|c^Vsl zQ=77QmiW88)@|+P4uM~qc5M5M$ncZ%bN-n#WnRB#vp5ImTWp#S8O8k{m7mIfY<~mo-kXji|RSF}p zLuw9w_juRx`?<6|$~t-=1vxo}EOJ&MSPg4J!)3I%mL+ScjGb=0@K%O`0cF;t2SH}R z-f0o`Nw)eoJZdEO*0@U0g%b9~(v&8SFZdKwh!s(jnchX^7Vnzq-D7^&f-f!cF0++R zTW7P;s9;W{Eq!ojf#f{bOt;SF9l>e}HXEFY=cEJ{5IEMRC1>%7!&ydB!-(q5fn&e~ zwb;EG>PhyC0e#%oJhxjyJ6a1ZKMzw@GNMM$Q_l`$IdmNZrW8!@j`?PnWOdfxJ-(2l zU4;F5cM0jEy^`anci(cjHMt!}4;7_;XrWOIg!EH*uilkj$5j#)r`m_CO+wGBtBOr9 zA&LGyIdGorbVwza4!a`a(8c%yOn_~oio#Z9{2dk6@ns%y({?d9N0I8$Ubj2szt)K9 zq(Q0JpUQ}(Vr`HB7P}5PehFo|b_Cw-@W!NcEA)Pl_W#4Zl+LJ}Wx-#k6{U9{X0N9^ zRu^@=y-Zu5kVWcTmLR`IFi1#F)tAYh3Wp<0|5tEAqeozjH2La-zyoQo^xeLrasHl} z109F)nXb5m1muz%77Ix){6X6D5CB3| z_@95mc*MSR1&wqO9o?bUu1axk8L-V+khe^B%B8wGkaa$Wsh-jWvCLKIm6Z1o;(cx7 zd68#zRNP>*NQ$tW4!ddNoOU5G%6>D#*8aK1BSvdkqSCu zKLkF(=q_ZtAv=lPJH_<$Rutnq=ArH!Wd|iS;qy7VVnq&j)nZfXLx}9+N~8b>X25q7 z=&OC}1MiF3396fySL6|V+SAM4pd&JkmWV^_MH%JiGKV*+Q$t+q)N0wQJzrcnMqjZ= zeN@Al@_!_|ZC;yZ-*Cz+N69v(U;8)-Ej*F&67>ndWC(94ifAV@@vaS0hcKCNZW_B% zNC*Tr< zhlTya$#g|YuuNxK107L*K0O|s0!ZU;KqH=mHPz*BKjjG+c1UsA$a4AoTmFwtg`Y38 z`4x_dfSAz?vf><1%Zt|?L8mIuCVe=D>~yRKpmoia@`s?Dl*=Blf0|8yni27+hI!9h z=O(%e*V@yP#nA$vdM9)a;qiqPy6_*)uL5Jz>tzhKyEq{Q35kNp$!Wn^x(nEkLLfAg z;9!*?2Lu+N5k1}or4+JIQqw||v#Jm>xYWof3q-q;3t*QGtSw)dP{9u1x~N-$dbXg= zGW?p8lM`e}b~J!fVEj7?QDfhWtOLeL!-w;v{zCEWH+e!MqNzv0W#9tE9$B4yc8Vl9 zkT>_dlsRWI@cys#v@aUY8>*2mSg{ljvKVK3wFl9%$&Fx1O>t;t4%xk69R_|nnl&rX z;}v88X%0-BZh)&7h#l#qgIa;$vgiVx6hqFfpwsfXQm}Of^VcwsxF=8M8=O)L3lW^= z=H}3XgUvxN6j-Q@9>Af2upemg0Sjsa7`Y_L4@{*!yuJJ4;f3D>V`EMcml@!IZLO`v zs7}g^Uc!pU*U;*clHQ-aoMKcN)f*ICd3m7JvN9*d^ld3n@pp7L`8=c)ubwo=d5eqV9%HetxUksARh8jD+V3lP@L*Ve`t)2{ zjN|SZxVL3O^VicW?(^FUZmc#mu~$mS3y~Br3mA|nDa!>}6;jw+efO|F(z(0^#8}#(sOH0MKte_k!pbp4-M(5TyHc~8wXJt_WNw!Hq zk9?8_kH2zw1gIa2TEL`Z4tNb?aj`2@GQ}Z4YuDGEtlN<1$8nCz;8)|1j0HXv|MCI` zHWcS(wC;{pow9IC-yoWts-`*~@(M~zLt|5w9w;h4Z`n(UvYYDSgsmeq!r|fJpzX%* zikP#6=Mv&W1R<~__YB0x$jb)nc)?!6Wy2@5Vp>r-`Y@3}r9;q^-*N!@5_o#+zIC(q zvE?rXUDxvf3XXT6D+8NS6z@r({*iV9byJHt-vwrXHB5<@NFR@f!0U*p`2;%V+(?Bl zt-h~-GJAQ32VbpdrWjy7DCNG<^L6pnhH8kz#ED6aV43FB2$PetfvX2G4vw;l3ext1 z69zM+e?GjR55BdV8z=(N!o$;3;S;eioDrmt%wRWLxY~$z&^3O2y%pvZc{!wd6@idF z-h?jpEBtS6j^7Fh0OK-t1fXe;9)(C?+uOv%iGYj(@r^t*0f5#>z-A#T#C4`t_Hw-J zh_joBGVVBdk@2i6iO9inKFBjO_w_GwX}!sDm788^LJB|f{ct4GGCDdsPK~g$;V6>F zeQDluIh^7ommD!x>c(@a8QcDC2)Ir|<2-5K({)7G@xGwo-*Nd2drPI>07>ea(Yrig zm7@aqxmoP91r-l&d}Xy=VCivLt%??kHN828$hpev zR+BLeSkcCg-+!A>M;4qER6e!*p_7MSiUZ=7-;7O_551Zp#x%L5Ap4^yC-?i)ulD&< zmZW6JCqF>H{>Vh8EB%W~N>snOr;dd(^*?1W$(8zRgsDzO6Ipdr=Sk(`2Ok4ft471H>22W02-aNRgmefSOe*N0Vqe5IhiU8^T2xy)3U+P>qGyklO%b(aR zD^`p?QF%v0cB8Ye4>>s>rJaib*)3Dz(Srj&U&VFdeptx<0GzW(3%u8nEcfG+wYC;^ z`)sdvSF%(gpI25o^~=5s5GoKO&E=%*KwAYb34W+B*t^2;Y*=Z)!@{C?mL6tO0@BvS zNU>nH-6BB|f2b;8B$cxo-hO@)nxEhH71Kjpsx`7$P@uj;#YkCvk9XOa91KLXYybGv zvpkz)5$OAu!`a4FT9efN>&5QsfY8`+OLo$O3nwM40e#I zBe34y`hBb=>b8LL=}VzJc03j_L8U>gEFFDvXKK&gfPhmd%#ap%&(+nk?d171LQzo> zj3_d=42e(yB(PcrJ*!PQBwrjuIgvXf0KF`%NoHG*y|s~!O~Zc0!)0_Xryo0cORx&nX}^c)Z~nsjZR3m`ht^J1WLQRK`9=Q0 zkzuKbHYPzYL1zs!3pp1JJZY%)j^HI7NxN&fMf5sCK!B7QEG;1}fmX}|L*6Adr0RLrKJ7anw)EN)(t?La~ z?8Q~*si=ea>Z-zNrmEaY37lE z_;5_z$kT!nx7dXk3`|Up{K)WK08QYz>tPCA45jutKNZ_>?*iY|vN-}glzQ|qlzS)? zL_%=^cz7s_xSFGIv54qzRY|^m^G1Z(9BP2IV1@K;{A1PLPp_Q~Rd(*ll?(asKz`Pu zy#$W_aU((~DrF5qFpWt2BHq1*Mh%*kJaI3)n~9oHcUG?5CT$g2%R-`@nJ}u}&JEK` z$%(yAVuFp@Ng;$QHe4s`%RU?-=AtMiIexi@YLlgCAQ5^xQ3408BvaP z7C2R4F1Y}W6>}Obx@XRqPK?5=tln*Vb_F!HI|0{bHKs?&}6A z$+o?&fg|rd2TCjdjA1EP`kGp5?8a!Et3|B%h)bCc-cWfc$W&XvsaHKQXtErhBB-vR zq4-IKm+R3$KBQ6Q(Cj+DZK#~PoA4Aswyue=Vd#Q`LK&g}?Y8f* zPhNY%nCG}$OO131t|m-Mgr?!tE7B})(Q4Roi8Un2kG4+Q?3zlyzq+ss4%8YXw>%Ue zOtMMhW;}bIG9LaA-E|$1fZuNz8qut&7O)rF&%sw68Rfv|+KxpFRzu;V#2GBzXt#v9orkt;hg5@H*d6&+80<*uU@ zmBOLJ59MG9;>Wq8DXKFlp;d3El9pVhAW8L}A-|jY9eHhWEn+Q3w)bN#$-&=&WmJe{ zMaL~YjdIz4$8Ch>0w$5ov9IkmN3Fe+BgqdP22zl=$;a3N0quiF<2W2E32F8WB~}Kn zFN8l29w4CaY&n>^nA9JnSyJjDu$@-RUa9Qh1gDQmSlhs9swF*W7-&b3Y)m6)hhsMa zYeZyr&~TMvt z> zJuJ+D$mmt91o*pf1s{RA@p>gGL@k@2eR^h0QsH zKS!4d2nl(5cuf1v_4gjv#PxMFe8P&K0s5GUsQ@@S=$6 zdCw98rVfz3p0ptSt8C^Ran_uhr%7!_FD&R(rWFQ-=oep=_O7vhoeut0Lm#ZeCTuY% z2srkQ8?S&>+~_zi*P3=0U}}gDgl!0LgVE8$A-=HPX9sNsfOp{0tDcBULOLJloYtSc zuB`<>?6m#EUHxe_RXl>7-_el|SobzLfW`|}E2Q>5HD*Al1VM}ZAqfgEkt6488T0* zK->HMQ)e`%jM`Why)Y2uo#;539JoUs)7Cb8=BSOlM1VE)HTmt56QuJC#{yU`jG(?e?-) zt4Q|Vy?em!X2-vu$##cMDC2JEJ%!=HhovH{Nbs#a!mjwmHl9X$z52V9*&3Hx+AloM zs~=F`)fQ{_uinec_)}W{_~{`g8|#m9UZ*F0XqA9G@JAC6oM#?IJVU>@edi8woa#*n zcz`iyQI&qYLhq({Ve*$^=p-|CBQsy0mYETV+%l!rr}Atz}i?GU3*){;}C zzxVP@O}+$N28N4?(*$l#&fee(UN1VK5(#hqEX)+_Ens@{jQR1C%e554^MX>iEBb&1 z!V$$d1j~7D5M5GA&d<*SkODqCROC_7(Mpbv>>quwBfdP>S85SGfPB2Z>DVY3Av@+=JjV2P~5L-@@g_1P-7f>Jd2 zbL5|2Ns2tAb0#zEhY21%Cd;ra`8eicVu`QaH(Al_%SAz z{e4<-Pj=11TEH5WGXMhZy5G%_-kxNpB{|r^NG`LM#%t~ehxVe|WVtpt`^#)?gU}XS z3Hx^{8lwH=H%P8@VTZZk;o@rF!q-Qh%%DPLI-3Rx7ik|9Muxw7L5eZ4Ao~nyW!@*T zAt9QD_Yp>40UW^;m}4nbPiVE&%$q$!KLZX-{;}-$u+=+`8j&lu$V#V>08Iq3;r|1SS6nBQ{18P1!H6Y>w5|4oSAt6t5x%t$st zIFY+nkW|JYFI*8>zjwD85h_b}qXx}AZ?UTU7qaq{yPZPIZKbh~QDv(rbyw~q$v<0w zfQdEMxs>|hbhi=APnPDMsatB)Ma}^DXk$NoxCaKWVw_0deV7}dh1(O*t=Rwt`P9_Z zRpJUActczPR)L-8-xOISM?w15`4Ezo5KG3g{JyKw*2P5xvUc0Z1-B|MWpn*0B1!a7F^{e`Z_u~K!e(g zOhD|G)X0RQVFFbQU}&B|`v#g|pc4WRQVU}?lxK&zdL+9iIVGcifooz*0S=EK86y>N4ORTQ0uJy`& z>GoS;w*_!zt972{O-CUyg55kxRC4k-yrld=P(P8hgK?x#k%k7}RM8@)qJl#+J3HH2 z@qHqF^dacj35-$vRX!Qn+43UzrkyY-|4_I1U&TynkwI6po>1dYkcMFdaYBl$|byCWh>-;Fypy zU6*QXTwJ%;XGn9MHZ)s+QwMiETuqpFCS~#6Fw!K^L@rE)!ie)>A%684w5Rgu%DDgp z&9(Yo(Pem#J*5NWrSdBWC~n`QDMBT?UkAfE1W}36>1Zo;V1gD?0+ovkzX}2gAiB$;^z_?utP}(Af!`ak3``OeOjX3K*WaXyLqFf?!GM z_4m(x90kuV3dAPRzlv%GHKAzpvxoV!U)nQGB@f9$#&m?2P=SlNfOYHUgbeJ zlH4d!hv%@)wLCPh$6J=p+Iv%4oi(1|88!k_069+??-v*YLZy}X3xW=0QSTYqi>1if z%b6qi;%T|i!12p*YU85Kp%o4Vh;GOt{fM_n)>0x!ibQ{L60rFr zWu}3sUC@&?FU0Cb!^6$=c2AD_g?RLy#jG`$zpdr10=lToqSQ_Jl3~u6##s8#s|=H< zb#WOO7#3hAu8pz6xAulbnAvXO20u00Tc9=UaszdObag}x6K=X8F8X30bVv|vy-4y| zTc;Hldr7`UMrn}*KjJF(Gd2zvHc|B~{0+QlSciABc_yY2#n6Ao6u+(Gs2ahEUnOLF zWtUu{;QWD-eJ$~rIQs(r3uxWU+Ta4mj_Y;yA5qjAW?j#TuOIa2ZIyFpl*CbOAWfDT z=iFWfc)C{v(~AYU6a9?BnlV0+z0DJxTHjY{s&e}YX~%&u{RB&9^KjUwtTzW!%!xD0 z#1}6Ic0BzW)9xadKeEMcw-y!|o?{K5N#Cx1&q9^?FuhMaxJ?-c4YPtvCHcdUPe5TM zk_a45_5Gv)vOYWrIaMcZY12^_R%A}#Kg0yXfuP|*sF(cYGkzijt|#M} zwRpc&mGaDaf=1c{NAPzZmEd0?lC0!;gIuwC5u_(_E#<9x0^u{0hc`7y8rfy4yPCs) zU}sMOlN$C<_8Ev zpO{gbed|+7=vTBA1V<~?jO}P%#XWr^N4M}K33)0`1tSfpLgfm(b#OL`MpR&_uyK@3 zWeM08DDqzuN+?mz?fMyJGz`5c1yNmOY})&1s;C)IK0bOB{r6y{E)ci>Mz>?c^&`Nh zY|s@;2Mt4b-hE6$c~@4!haGF)#Nth68me!Fk)E@^;#k*{B{UL?oJNMNj{?$nib-__ zX*h;tl)I|#T{t(S|CB#1rzXG4%7+mP@L_|a! zaU7GO_pf+fz3{m6?FJHu`8C(1`xXC~3^srafuGeo-5CtEvTti1kk6?~UUy42nZ3ycFcm56_ zR^F})%zy&ddlS&Ba#QzAsWO>9-Q)R(cDUC4T@T6DO%7K2ixI-Hub}9iU9l>M8QnAaE#c6*DeV9?aor|CMT|?f!*O>o9PNm6B7Y=Qh;I&oEFIffwe@m9# zln1nh-;LcAZqa{XVWA>|pNMht`=;sOo{LK2KAGIXy!n{_HE#R=Vn6g4t|0rd2*>~W zC;tuV#ed;0j;AkZA3g-5MPzHI#K_C5S^Os;MFKg1#AH~ctzkfH2e`oReiQ)}pnsbGd?jaK6vMtM z0DuAIY^WCxpc@BSH{dEC4a=Z2c}&5RBKQvW7o?ncuw((R)#UbDyYWcK;23rM$UMTq z!2$XhaL|tQ;TQ$+KiIV)YX5A1;|tUP!*tkhu-N0lPI>2cf%H{nOM2hi$ZL8U;<#zm zhBTgY@p$h4Hw&%BYT!6LAZ?K>@kE zJ_&GxY+wd>zMMf54&?^MYI&kMz)F!zFgLdl%*a<+*RK~B6+u@wF1Qo|;q*ATZvm8r zx(N$nnGzh*DR`J`%$mYvVM#Rw<2mr(tec@u{9IcrKs^%4D<$`p8Ojp!WrG(j1uW zKq5BW9=*w80Xq_*_dqfMyNd{F=D%(;0LcPV@X_XswtZX%o)$6v8Z3i>&oAYupMgEuOCp&EOPFE}Xppr#;Q0W1U=}vEd~o!bPY0e!#5k;l zp=F1RC0}Kh^c{9q`Obf_0HE}O{Mjm`@NrJg7r;i+M?v&cgw=RuFbnNIL?rV#5tWcR zMAu;P#MHu83Pb4^;8<|zzLO*2%sAd(*NrKGjgyaIQh2!;*tV+IfFK|EE|k7Hmyfan zVZwHoT=xfv*@hb%gr|iJw1;jHco{87aDX$3<{Fm)K|Zvxi~PdESMvd2>-hn1g~AFP zXZmHJ2jVNs5^)84cRI32w+@Ez8^0wRG`aV1(yjg!!glYyZV)HB9SKrOHlUwP%$0k0GmaRpq_eqtLP zl`mH6cGCE#ibxd6{atUbjM?CQt*8zbj@TElGkstow5XT!LOvr<>9V;X9@sqP(iRL-eja7Gp`~9c)F}XZ`j69#STJHU(md5$z zUFr8Hgq3Wg7IwOy3_fB}<5xjv-Sbq=dl%ks zFxUsui+ei4YXvL>s$N0zu05Y}Cv1ZJ=5A*{n32zr4A5oob5ClDV@SxuW zwu2o=X9!A*w{EC^L#&c+2n!2Ge#>b3=QR{AH!3|zjV2EG^B|b!!r}1K0llv7eJ)XU z5yyo|o23nw#I0`<8$Yj8c)V+}H&vlo`|YlAc_eSuy{f6d_gKX4)9C$YO!U&^={N0N zL^h>9wt7cqy4Q(%(%)*#eRftm|BUv<)TXeT!n(&wzM|sE=GVHww!TEng@3jeyU)-O zm|l_He+Vn>y)cJ8R$-fXbpx+8?(vBI`MUQ;S20^;6oyEJf%k_=SXrDu6$wTKD#rQM zOO0uN$Kx*|^3Lh6!uW)PSISzxi=aQbPJXccts|3MB;avN`Ylcw**kZnEkorxM!84Wp;{y}Xh{viQ-5x zFD5t}S~+&LKNYaYvE9L$|D8<RJ`|WHGQa(2+xuevz8>#Wu~L&?C#ad*Taun9HVfIsw=7bk9CI1LoQEA4Dppnu zgRpri!-Gyix5057>KiNo${UoB&@OXiC+G|3pqeskbk@TA4Mn~&4M{FIT6~Ak@#^U4 zs5R)!AdDAK()~_2U>tqTWYEP8;+w-JN0vw#TfNIp$xdSp%_OvYD{#S}t_IZ^3*L0xGhy zv%5wlK={-h!h-(H5Y7N3p70MBhLWFy1Gh*a=#5n}qhi4Zk~!K3IMMAuK#{Ckp`y}N zBH?gIh{G|}i4nu#DOA9vvNxQvmHt?FnE% z3>NN$cmOzod@lf#@*&VTpjAeKvBk8x{L}4zjZ=>FAJdYyc?k=w7YR zap5uY@EE{@9ovlF+w!Fs1b^{3p>>h?t;tZ!&BK#OD;A~;ps-ncfS8H*)*O`}CR81~ zu31=ny_n(Gk{pwwdmYUVu z#e(2L%dk9DFYH5zdT2M+Ox3fgB7wQOKTQBoNz%WG;nY~JCm(M__yiJ0qECFTDtLkIe>A~Jl1M?!QE^UYoRk${Gm98aqf z;=z-Cl>-;f*2vf#wY(A_8LOHx%0etmOxbeTQCY)^&5qNu`>5^Q0ZK-!g8<;l${_{m zGe!!LKEOZZMotjSLw2i%5zs_-MpE6xog}Uvfeu-VCW+h4*@_S7QZ=vz;*YaREx5H* z*xO>i@EQoIGDX%iz%!QdR*uVw-u*Gk_a@>Rh|r(Y99eRbJdZHrf-McXI#7JHqp%^% z)^z=$Oc%p6M?CM*oiUN5YrnG#s{Wwg|^l$5++{Wdq!Y#C$T0;^!s)hhq8w%g*A}p@;KtG(J}Wg^vZZUdiuZh z(GYB0f`xN@!RPX|s{JNCo`7H&Ln^#GCI1>}=RcX@Sune{- z@DCn&-!WVEb??7g$HDwP%5LPbS(RwYriNED)w ztW?+Y!*Tr1@%vrZd7bBd-;c-r*YW5$zK482Mp6hk3)0mipWzx?wNSBA`>D3>o z@8ye~@^$RfJg%RRD@Y6@F`Q9}HSJXU?Y7{Vw=-MN_YmOamD<0n>=xwFg)%XN{jH}z zyj2UFGt!{qW{O}5Nh(@!ase{e>k`wXbyzaaL9rpK;`Z(EL(!>CDWV?=#>U3tJM(fR zDZ1XF2@6&rZ!vvo)pY@xP)%I0XUVx-$Z+f1Xj4g08EIpU3%s*Cc5=ozU>kA~8#QZY zj_k)@G+6iBN|z7-Rmt!va0^)m^eH44gOzKn2pHPYTI&|=4ywUCtS^t(kreNfMtcx0 zMz!Y}I^9y%C&KZZuT8_z!H^E_*zz|7&@fAQR0; zMYhhp!k+P8MR8okW`F+dgj=?E2mHn-j&fXp}Nh$VvPo1A(L$=4! zqsi7QRsh$td)6k+{xU;u==6pLIZwuEEWT5XyMc;T7YEK$GhpM5>(?d?ElR% zo-n|ehWfyxfQRkR$2}Wh$@IanStNo+g&1RsRC5@VR-Pph&oq6SYnWK6I4UvJqKn4B zn5h?oNDOQyIJctR4Oycc!kteKfg8@@jn?Hwx{6INUuJnp5W3W zJ>VE(7tpQ5rQy_oX#HjQT99KOV)jI|5jLR4TLYdLPbn ze6c{dHcy!ykpGR*Qi0AZOLY)uDKaBJ;e(iAw?S)i=M#@B%;1XAj6&&rS!b@5^gvY=|pwsG5#QpJFi?XO%$_ygNYt3?(T8S8Gxrj z7pv;>6wFLbAxRgrdd->Mz%n3k-!bkIdz)XerBmHskGBe=&%Me@#MfTI_@c|!u0kNO zxb&sR`m6oc1H`t1-}PQu8R?!ZR`xVRMA-G*wA&Wc;2I$w@#@FIw2R1j;J(n6V0Al1 z5=(FI{o{w4vOuA$?D>bC;=oPRZLu}VJXi!(8?@N{V0U|S^8xTf-qmRKRIuqWpO&CO zVePv!4_8F%<7|p#M()3{06B*QgD9Ht=uBu; z(;38CPm76)Mny*FM>UbP(ltm&_EI{n|1-!c%OU;ZJcEWn4Cl*?C26=D(q`BXNUl#> zCnX>=y3v&G)cOK#dGG3BeZdB1&|kKSO+}Mk_t0$=9Du|ZBf+c0uLWzuX(ghj3^FA1%jv^h4*+V} zp^DZi$It@(r1sS3xM9o~r{MO}Ad`e&Ty^Yl!RD%4z-h z`0iKhuQBgKo7$2hBqSiPj6Q>Q-SF?c?f=?n5oHLYg?RJs0pJ$5P#Ma@$6ero&L=1l z=Jh!Qo@K6)n6&nAJ{bjdUGg~Ppmi!ofPT~9&uUqPF$ffG7 z^(yhkzab9vUXWMf>>?GvzhC-ON6~0Ier=5&b3@1>fKnbvY&`QlMSB=HsU*zePv5)= zL{lN{2a1yC2%^H{J6!<9%3GehRu^V91Dy|cpR!yK57`vIS92S|Iit&$zu7f{Ys^D9 z(r~ED-vmey(GT7Aj*nn4W-JMFUh6=-dE(0y(XW&5?`ufUOrN{_U66l^l483^aPYC; zS7Md4JQsid>|oJN)e2!U@PJ;kdkf3qtAO=d4XaK}^0^9WtUMV({GImWi;8p26KyU{ zAL0kMiTymOq}={IbfKzb&svedh2QVqNca`M^6I|s_Ky0VSIiA7`R~hT&oK8Moa0j| zI95ILtUxq)?rRv?I?vYaQ?lBwUkJe;B!5nFS|1{yV}R!-AeefyduC526ASnz&n1oC-iDOoxXg?^hdMxE-IIrGfj zSfKyTGtFBcwN5s8)eXI_IdGv!nNTTy$&gpg+<1V8H5$zK%9nxl`N4f5!$-mDu{t4f`y|mk;FsT3{cc2)z4&CAzTo{lb}Y z&2>~+7cRWRi-&W>0s;k71?9i>OoU!?#k z^Xcin=tl?yu*e#DH`?0dHqgr*gIpQrl`E^0`7(7K_>rxus`?4sJsFaw&Pe8hcKE90 zEdl_(t_DXl&eg`vI;xvD?^AokA?BC`J;Krc^2^BMpk>MIipFa@6@|GwEKBk*Twq3I zHMEZz4C_orp)lb;#p%H2ho1-Rkr1EdzJvS?{V2p6Q4&O|);Nk%V!o}N9jka&WGng^ zJ`yRc%&CV{)^-8VB)TpiSTT?B@Uq8m`Gd}jB2ri)sRetUqeS4$P@;@?!!lJTC#ThC zQv%xmrU&FA!QP&+SHtS?ms;W|R##U?pfv{R7;0@}jMj!b?DP||skL(fyi{Uf#Ux`A zdOrZ#o#)RR8!1E!fd>?@Em0THyryE;a?EdOZl)5`i4fjMTTd2GQA2)8e7m3qvamj! zI(3SdhX+jqe}E)RCQ91=(NR%WHa7Oy>qoxhBDW}`A$l%Bw^;F+@85sUmDg3cW5QumY<6s&|FvIA*#f1HaZQ^f;{<42Hy3=WIlXeL}}hp>rUMIgE28NSsV9baU)H_I4Gko zuF|)ap6r#}(js!uny@_9v$hL|=v7NUZ%yW!&pU&I{8dfX4>74WTm%FW6Lw#FvE?*> z!Cwjh6CUroO^I1AC^o;rDoi#`xsy#{LwBB}I=7G0BaB~%r}xHw?h|S4hw``cD}{C8 z5iG2!`GpSt_CZ=<9vk_yWvbHa%mMn&QM&cPiUMBDl%hXsx>+&*rfx3n{>sNi3qik@ zHW@oz<{@3=;vyu)=H@S;QeE+DFJ^W1)kipo9SwU~Pi1emoN*fzo}{K}JoU_jla5qc zhwG139~(>ey}x_su5jPe{_*AQ$I^#*IcLlpOj_3Wu(d4DY#DE5Z#yVA{pXPp|3?-+ zW!eT-Ge+t4HCt#8kd)r8>pR|e8f4hw!h+@wh-rDEML86%(TH*D%6k+Gl*~jvr|dft zq}?idgZI{~tqsB21(}1jtIv+O0NCu@9s1Peh?p?R@Glfws9K&O0gh6LcH;+6t=J3O zL)TuB9bwJ0OHI-t^W5gd5WFx&=rhxYUdjd~Jnv#WNU`s9k-V3Dc`IYW{wpYaEDZEd zOm@CDE>+jpFPDrY%MVO-KEpAu)HZ)yDzbv4jA%Mq{`%6m^Uqpf|DMCm6)VCKo=0Y+ zQYw-5^g+;KdAqH5b(w&UP9thW{%KpeEGfzj-5Ip|dlDsFjB@rOD$e9^>luTDOIwn8 zm3G=?66J09(hkcPyVfWpHSIm4MVv}hUqpg#a5x z%wx@yX_$5^x5&$fg_V_+g@uJ_guS4+;(GWnV+Bn)g$>!$-2h09_>%UO7z>W_NOHES zBn?hX*xq*D5w}^KMh*ZfoS;3ZAyf^A;KU(G?Nu~2+M&Z}{>`Ft7z9}#ddJs_yHy>Vsv)u57aN2!T9`soYONC4^Wul$ zsgd#pIR7b+M<1_OYP5GcI3fKM95Cg!B$eGpMj&@s_hRQDX(zCuE+Q2WWLWDC?cRLq z2f?$WrbR^5Gw!qDXi+x9&zE7|ssNcR7#J&1Dc7oaYc72Xw~f3QX>V~8=Hh7O;Y0Z= zKyyy$lWV??9MumVH1-=983Fyxo_+EHOPW;nCYTA9&K z(i2%L#QglB<08SCY5%t@6Q{9*=jhSZ?Oe-xP0h`oJr|!5A=A)%DH^RhN&lZw_pUn~ zAzR1bJdA>cDR%pb2_jiq(PJ62GOmaLUpIh#U~MHQPvB1ClBWM2add|QUuvZ=J<$1R zITD7!4FfThZ+(#dx3zgSN-Z3!bF%3(nRAnXPHt-IUIg4p{kBQpWP4kpP64V~SP!=L!} zJ{UbNvIGheJ@#QF6%rCE5=;@=ZVy<-l$nnW+}OK#w8?} zg~MB_Z&a6uMn`FVsDDvz@9gOz+6NL7IOT9FA3wjJ>5e^*(>Sg&*f8M+N^glNjj%^U z+>UkyUnN<1a&i)|A>+>*VC;!r5}8@ zjQxLO0bfwbGdSi`QE6G8<7#jvkiMS7_ll3#hhFW)`3@}AZf&I%(JG{!E&-{tFB}m? z_Ik?su@-fg&4nLjx^hBE@PBBQz6e~YD#quQB>}PVq!^2C%i^A@+ zZE6j=!XV?pm#NqDxZeHPvC8}R(>X+qWW_epo?H(KiI4TGG3LR{XIJ;ozhJm_@o({g z=pLFji7(=*>FE(ICJEAFnj^w`v|>JSNoyH5FJ4Dj2eP+kq@P~eE_W_o=kPgL8pR9y z>_?_=yA%jZE3k4gAD56O@~oaAR_xbR&979kDJ!z@#jBw4qR1*h45)1NJq->>fKQS| zlD|r%hC(Zi0FxDf(KH?H~d!fI6mMkWfp5ys6(KXjL zrnN2!Fw(A;GO#|Qi4RMblHwj?&382MNKjI$sHj+A57Q9Kwl#^g<$MO_eUm~`ZsWSG~ zI_k&NqJGkp1eiM$*;Q(N?brIqXHgojKe2b+4iw6)=x1VF_r&Iy^l!?ujmQE_z8AG9&Af3$=!yd2epo*=ZBhCh-nDgl-=-~L57*sn@|N4{$dMYXl81Y# zs7*MBkXr95!Q29ppW`%&d!mIHbyV;0`1n%4k7C^0moK@-ltvj{zg*pSV|;RwNrdXx z^zx!#Qi|>RbRUvEEroUyGz`-&o~61D7*X)PqOZ3y8=e^SuRpBgOKRK3==+=SB22qBj_Ra-MrXSvWs8H;v^t=nQu<4MqK(Xh|FzttsKRs#X=WlQe8n`qc5$iHvT#hTXQ>oq*S8Rl(|6@dLt(UWxhs*Fw_hp7Gq@i9x>@yVTQtk20 zcqGLbWta{Lz$Tl;zIN?RHD+U{peDansYc;9^w*i8!cvj(d6xmO!RJV+P9t~VsoyMIfb{Gu+-^p~r2 z<{g{wV#M{E2e)lLQELCCXIgB=x*}IK&5!*b;*9rS{xy=K_&p~kR17omvq33FqDxv# zR@kf{sN$>b_lo(vdiEtC4mY75tSPE`V6&|KwUC@+c6RnVrzGWVPBsCHSH>SLr46?y z*Fgdlw-T5ll%lzaz3bHcuoZ2V9*945oYdw_<}Scfa_$b*0y?-Dk>` zN#xMc?)ujC`(_OdSEbC`&O0?az2`z`=Edw(j=mQ1F6%M^Uc#0A;ZJBpcXrJh=8-$^Fg!y=7G)=kIma+B|u1 z@2LN>yRmndYNgM?=l6B)z2AJfW6b^8*DrV2d3B(sF=j=$%rEmT>NPlAjm~f0ZNbOO zTNAWswj?VF>I9fp7k zZ>_m)-qG5|=JlI5jrDwru6hX4LI{=#cF2SRR3;06WNW>en!tf+W{m|MqC9@Xba43a zb-e1NBYEB*8lFCVIyHn4O$2c|VjhQ73`hNt1>9{&udjh_3IU(fwll4*dg$A7)aC3S zmLi@VH48RkVyF{6t9|FOeoe%$;)^3^i-mw;Ni*|L}`GOvBd05ZZ6{n=J&$n z>|PYQ6eB8o-M~|X?FR6_4SH=##tM2J%rEpcc`Afk?V;iLX@*tB!-{Av5^6r_N7SDy z(yq-O>B=J$)h#Vgq3uP?k6#d%q=_S1-@eP}Fm75QHvMX$NoZDFg2&8^jFN8L*m(2H zD6*16t${OwIcxdm0eumn9l7Hb+%i^E=;1w*$a|7XN=kT0 zeol2zn{N2VNLgUuA}O8}gzovU9voRFS^S}!eKTwESU+B9x33 zUiAB;yl9pIs!rlzKn4+DPCOXs7}s*-Nh(qfYRTs5WR_`%%T zPHSr&U-*4(USql-VGclADq)ood{xK4aAmOP^4pF{G#{{kC_svg`)s9#wiai`sPDp* zlfPqWxJuYaWV!$K9Uwfs>7%phA-lL`Usx-uYJ6S$z=@*aysSKF(poiDeW!*tiUe-j z_S|hJjW16Z?n)U{(=vPqU>^$Y>S=eeXL+~QR5bP(>g(6n=F1gbHK0hMNQ(-NIn3sj zLp{Z(P&j(v$Pp$VYHp?>E3=$a&Y`-8`~3Rs7G8E)UFX=wa(l(ev0d#ox0N=jbdBX0 z#5CU4!+f^bWzC-Xrl`1B^v61uh}?{#Dz|N0w`#jK*F|0rR5 z7E?<74t9i`io|f5J8u2K_hWEmy4OASVptF(J$=MEJPKEGv^6%Q~jGT6uH0FK>La@}pp)uI&2g6<|csy?@Gaa49e8km}9(@gt4_ALyA* zMfqaHXkt>I@^tKmA&o4Vn;GjmeZslT8sEJW_{1 zrH>c;Yg?r^BdGW23uOJoXHA_g`-6@^{+Vz`7c!iv`*$WW_R?Mu|C(EI@808kYup)l zcLp8my3;ykK(D3d*2&}aPzv}kf8}En$-)Bx`*#roqRH}Z7QSffAx!C?KE*Joni;}t zXI4#S3;EhwIR9J8N5!4A$cC?`o@c+JQ>AFa2+T%R&rRz(eC_dWQ#OM`$m`v)T*UgW z`NFIAg~de?G3ro;orxe{71PHzkpxoLp&FXhG8yJ+Jb3gd6f=Gq*Mgs3mPlp{nVqdI z^@>bFHoZvEb90L`>-wk;Y*{Fp)mOsHm}9)SZXOm1T_WH^m)t4#NURKz0J4*GKAuY3 z6Pik)Av$R$x_zY^g3LieHM(ivciMo;9-$>K*U+*h?o_W!0j|6!E_CfZG?p9HtP#5>K%xBb*i5#j{WV~zp&02MfP;T^(72>AfgLHgFMTLU-<@YS(?83wjyB!cC|;v-N>NTM757cK|fxxXSfDfvohF(dFJRc~TK z<`t0j%MimAsNrNrDm3!XA!GwOp3n{~CN?_yU2Sk6(D*L*QmOx-fH=nbq&-^>!F-XG zL^^awhLo6e{+m=;juCLJ6R_{7^8D}_ye6pX>k54n3TXSc%ed1sFlVH7>9)^6!;P1b z?FW<~HGZF&`NTe53R%)mB5`ntpJb$?yJB6jj{Xr=cc9blI*g%0bj)k`4#!Va5G{#y7O3kaB- z;N|6|V+!vG0-Dk!WxEhKJF0*Mx!48J)T9ex-~dtqQA~CADtmNk#_=rJn{eVslH9xY zn5-!-E=IU_>=L$jFgGQ@Wspr-sF7S`V%K#LK2Vct1zpaJU7(PJHH4i>MS$zEe8%Y! zCprW4Gsy5W@G8inM}kM3Jr;>XVWlhrJ?Ob*2{|id82R#u6v?zlXAcQs)BOYvDRQ59 zkNjRD>IaVavDp?#=>>;4$eO z9Ul*XMibbMb`fftp1q0%cLVW;l4kCuo<09ogkw-%tE+Bn#9bBWC^Bfq!DdfFpk^58 z>pMdLvg!fiuXU>GTEk5#-6hdtbupcq8ODxWa=yU^0P3%)Ja>6q$4QKYOrA|$nwOZw zp7@AI-=>`OMN~&r{@b+|yYR@scC!`!pM{-qTrHg9%x?u@kYr~+gTR2|E!jXa($ZLy zM3d;IxA+e0@n}Q0kKG4LsMNP*uUq!_vJ0pOa5%Gm#}G#Mlzon=0s_Ul*@(9m1G1eF z0koTr(J?Yc2~r)Q{QM29R)cS25{$%PfttdAG&S)##pkQnCPOSxNM<3Iw4oDnHaj5Y zt&0ARa1Oq$a8Fr%Ru~9t#|g&lNpyWnQkqX7E6P{O^8%Q|v}K1fgQ;-))MY}DxHl;* zi?n4Xhs2InfN*PUYE6r;%vO}vzp1=}z|7(Y^oV6s35C6mJd}yN%ohwACVxXP^|5=! z+|eY(>WXwnmqraoG^On?E-Hd`*fgpqU$PEsfPKxFf8a)szo9B*Fhl%*Z6&uYE1^qhg^eH&4mRwYH4W^NWejo82Y)Vf~ zi8u@^4%4~`Kx(5H0~C6vgNUt#o30vyQYAAsSmKo>Y$SI{O+qJx*R7+rfe|&pc@ES_ zeZQH0V_O;#tvP0)YQbYVb*bkbgD8vi4QT9rCET=}AV>ud*!=YT*|T)|v1Dm99EDE% zQ(2;&&-_j=BX4zRRjdktmz|hyX9^Vq<3IP8J)Uv6EWIh?ncEim9E9dxN&R_oTkyYd zndlndfMp19sCJC3f`X~qMfy#8h9dph??2wc%Ivtqc~x@nU%!S)=E>aLTygNUPM++xvq66so~86GlwEok=`oH4)-`Q5+fV2qsd{@V(%j zBK(j`-QhJU20U~1D!+Yt5D8oI0Q6Jvx{#na;g5&xGY zJ_w?BFyx9C_bl%TwiAx1dC;g(Mbc{(FeJ$iTYc_4`*CDMLRmoI3c3(gl*1gsCvaO4 zd&o2O38UF=YP!;yjx|K<6kDJva_z?k?iBv+UCZwt1RE|+{BIx^V^;0tI=OmIL2h*5 z13DxA0Rbp1oFznQ0)rgK#$$tW$rX~m6^Bc-YDP6>}h>ce@ok;#}eI~d7WF}^1?K%3F6IOYi`e#&||rI_kOv$qmHsomvVE1AUOfe zAG5(^;3lwNERAAc+-GI&eX;DBGo>zh2fb5bBTgHn@bl?tF>8Nrd$it!`b)snAlYW~ zr~E4cP{LFjZx{=x`~P(FIOoozVx7O4CK|@EC zmB4)#q5V&vhFEgvCOsOYs0M^n=D-g&W*+1{P<(Gk7CaP0k8ge(&8?7O>1 z&ac)>h)ve-!A7tT|Ky!%%gIsoDS~w2)pTC(8ADZAxn#Phr^f4IqE>Eu$iSIy4d5`V8V zIoSczl5Obt>r(3t<`ua$)W6ND12#U=`DyBKFZ|4bG-o~9p|V5Y!l^bgh#em_xl=q) z|4WZM`TX3jR~i)0S23CVw6vA26^Iu>s+Hucxb^wh?j7^-xm{6Vep3pQFgUm(8FPfI z?%K5r5{FDZR{;TmVfU;M5!6uNe~(L$`${BQ?`=sIJnvSs(+^bre8rKbr+R-R$2MjW z*w;_GWhKY4hXd=EH3sINT}$45?%Da@hpbu;^gvZsU|+Z=h0{(WbRAnXe@#mDiBZM! z(0f1UHPqjDJnxk1J@|^HD(K|r{1@C5&jfxmoD4}x0{lYLQ@69!i_>^SJ z?Xog&KflOysEIVZ2g7E_S+AZs!%mN?NZRD_0?L(6+6n~~l?8BZGqxb{+Djn9v*3y@ z&(C*);uP5M-hA!onUU?knv_?Tq3n8SYI@3jmJk~6_o3laHu$dN;bc+~=6*!i5C z!J*R(ewYYcucRUPclZX}w1Bz58(e-Xp{z{kWJp$3%dqEwBAWd+5Q>x{Btx_riufSC4M?;H$Bv4`j{c5OsK#JaHGVQ&>SZ6b(doG&8G!jTzN z`&RQ^MUqJS(F;J%Pwc7#Qik<;n#pk`m)uE7YR15<3Fl2qYlwEcqtT)TGDf<7ff`6X zYNAvMFC`rp6arLtX#>fr#6BH-cmK|eR8Of4Ts(eSc3KSDH;%roV!cnVuam@>pY{G} zU0dVA)S_di(>2uT!kHURpL_4o4t&I4n!ky)4LwAv*WUQu%Pe`^;;*3>7B1`IUWv(g%6;HYO~Tej^n@Lg z-?HWLWt-eghe??kXC9h&+e4OVzajE{+l+8kcOjcL&9dCIdMu)*6%nVkkpC8!<#;x+<=PMQZ+$ANz-u~xL$hxb( z^rn~ZN%}`wDJDr~SloSf#$}o(R z)-`kZ*7)0>UDJ~8e~?$L1V!QT_0 zHZ7oZQ)LqCRDjjn^Ogo}B|fTf0NJN0SPlpwBhQ|XT%?~fBtuQ!blP&MnhR+h`fV_e)E`-b ze`e#xjUSZq3vb_6DBjs%YPNjBEI2WBve|=lqE+7czH;Nfbx)dCIs`=e`5 zWB|kC@KaaEPS|d=jC5BPMio*g(7f-4ToBulo>R38i;EL1ae?}bGl>bN94$TCHTQ{i zGcz70{5<0*IJ}f%kz4aaYnj!C#mRAa{brlDt& zn&HBW`<}?`Z^Uw3u?Fz!rA@`PEaQn11Q6kRtlKCxO^D0V(z4Zjc+ZMf$CXQ??E*no z>2{2Y?q0__!`*86?|>WH|Gxt_99F12?-37$@L3QFlp}@*|HcAPh_UIS$cyo>7*c|? z5((V~qZ%I1wE!D%)*-`A6@Cy%OK{bA`1lM4)4-6n7t8otA=Sny%udGzSl ziHV>O4OAIK&fGda<$vg9NI{svxuqJ=U=Y+$l69G*R;L+wma3yr_b@Xt)qr#cjpbeX za3{_?eAvbQ`cTUD-=xfOL-uLMTnrfw2&6)LKejg^0F$T%;iNG(jc>r&DE|p^H|VOb z2|QY9C_^{G8jAhdP+?xRz#GPOkXjMu(v4-wd7KDYr7)G)5T7n#xY?u25yIQDS}0)m zL;ofj4^>ip1!*rln5C=YnEb;C#DqBJ!>-<;_^RA|ksPL_hsjWX+b^=eh{^KF+) zcyth#%q1c>!m}+CXEF2+M>5FuNTzgq7>=HiL_@gtl8LnMB1li)lcO7}lPZOasFe+1 z0dpL8eRk1q@i2IDkGb5;;?S)s?#DB+og}~2-4G|qwa5}fQgA|n9u4Q0A zZ;{PI`JS!k{4zrmde@KaHQly0hY!m{Wt4JUGpt}!(thJad8!2?{C;?&9i*6_uT9Kc zLB#Cxd=jRB`b_yZO`4PQnCjJtxYLk1d3s72NtrzK_YsNFU{Lh%<<-|rQVLq|c4fq& z`L4`K$6s%zA2xwF^6m(rqOoTjqyr6QpyGS2BpHhu7Swp1BhAD3OXPb|{jgv>pwDdg$*U+bztT6rMEx8B2 zjBh$9Eo8$bbvNka*RT!qpKiUj=(PD!Z}zYCDP@}b4nf5aQHzo3 zgZl;t6HVf^!U#xEg4%K*Q$x5+_>3m=O*r#J6KPCmz^A%C8C+X$7BRIH>f_!Kqu>0_ z5nfx&NWzqJ+|u(E`SiRt#)(%4~x)mJ2l4yha`zHKRT ztBGmP43+s2v^4BP^VtT`6z3~~1aJOsci&~aT%&uX+|HKoYhPKw%*2k(2aZS_Nj>}7 z@z?L4--yZNy4FQP3TUDVg>;NkRFM;mGmg9JN0vsi9UR*vOFk$LVnqyQ5;Z`{DAm*} z&;>mcO+NdoawJZ~D1XLe15joHB*9j3u&vO>wdmp@LJ-!j7}mM;_FGeVy{QtNkm6Ul zGiVAEgmUQ4uyvo54Y++D+VaV=if1Osrr4Js6B*AT))zp@OTcWQU z$IOAs3>?gEy_90n`0ANr$g}0h(RVS%GrPCtIggBc-{5-od*dhTo}qqozq9+{$I`1d zq$uIyx0DN?Lx{n@<#oUm{zsCuMgEfGFu{x>3GGwel@7m9{?PG-^_G|Y_RMqL2!-0n z!Sv4I#+!qAeiu8q;&lGIaK;LGGqACxW!<;;EgiA99BP#BEeyEOAkZV~okS0(KPNXs zB181Q7K|XxBmbq=Mbi*^3gQ5aS>$XzHO|Ke9=U$UlVP}a)PnOwUQFJXhh;} zqz>lYKe0pN$>L|h>rf>VjK!)Pce9*}1LDNmV~gFYFFw}oh?R3Lz^+fXi`!CElsn=p zE?s1k_Z!j+4i1KS=Gr|WkAcf2MXIYB-r)x$b5BgJ6*TYm3%UQ%7K=_StlxaGlx=ta zuc3)sGde=Gf9IIqd&|gF%^%{|I;wwaW<+T7(eaL|KEuz?3Tls1tnUzQP9@E5t9-PI zO>FTy^6kF_C$9Vv!igw1W_9nV-Prl2{{CvbnB4=-t3e(TOjlNIHxf*&d+uA_MC@r+ zVWA5(SR-3(lLHdlo3BHof33AXsNxSDu5YbjaWb#%)x(QNYS-uArk-E;)_Y_rg7XJo zaKQD^nMI{E$+x4yop*Gy(|$d8_h^1>uWX{5@s)iKLLe>K#&V&S$Ny7lN;bB~R=52^ z`~rB0u1ZUQO~yo|X&_|hS|Kz~PsXIAu++-v`++=|g^vB-|NSgBy%m-k4@2iqq@1{# z;<2J3`Oj#?iI5#wq5B5oAq;g`KOBr60Qlz>j2-@LOL*n*ubCYv@1FM0x{ojpP)KPs zaBIwBk?eO--n15DHvVLxAHxo28}OU%j%l zW~;t`pU8E0SJ)H;xxhFa`t<{igTVg)w6GbA+#MYqMK{RD&%XtmhkXhTAo~joVW8p> zS!a?$+k8e3jlnM>JBl$gKO-CBYnSWfPJbYKfw=Z)PidMz$3YN3gazRmH7lgo9Md$? zCSMt%om^ZZIlMGA>i|@2l#xNKO4-gPZ!|aPn;J*7voTf4*jAZ*jXpB=@&>;K_MZUX z$-Y_;SK?sVY1FUx&=}!td6g}c71sv?2#Ck_ zqR;N;<9z2R3}}NN92*n052H98t<@Chh0SDyP&})FYOUoG*qOlw;(}vtvb_sC>fOs{a zVJx&VdNid%9NwjBJy5%hjFlA-$CA3{PECF-0e~V56ryX8v`VK(Gr`8EX~f9C*=UEO zgt)llMvtylGUmmMlv$&3Oi}ID&_DF-fyrE?tmhF`^=(B!QDGN#a=kCMXKh62?g-;nZJld} zxjCc@B0{$M3`H#;^j_Sq70j}FakaKdX^-;oh*xFU?BCB&@);<~X+IO0P>8kf2@xmKaXNK*TWZZ{6GDLSI3_7!rVN;DUX}_e-mO+z;_9T0bCMJvI z>grQK4Vr{a#7)*zb?QV6dZPnPZ@3U~i`r9EN-ZB0Q-_kMF^_Z{y`B7(c9R8U>9713Zz}sH9bn z1={OTcu_YpgLPZHU9=PRg(wpor3ri<97YMUCif6PhJHBRfu6FgtxuVf!h8~qsAmX+ zC%udUcO_pDr*mUjUybs%tKZZ#K5%P)YfyR+@Z;)IYoB+fx;Rm}_$yOIb#Fp&rKLBe zMe%`6_I*vo@h|(FOoi2>CODI1pYzzzY{hu3`<3~pf#muFd2AL3hb@&7)`!_y2w&n9 z8)WZq!#LIc!`pT^SyY}fEJI=@#h2e-sbCE!xdK`K8b7^Y$u)2EWzpaAoMU@whl}N8 ztrb^yC&E_8;kl-r<&{X8{33trP1p_kF;7b2oXX|v276Cv!XJ>A>uE>^KnKgn)_@mwSYXiA+v2gwNL=cu zqrtPI;dW8_X@fevW^_9lwhobuIm=y$wchZ{3v;9@XK>6BIijwQX*IXxaVy%E9qfrU zyGZ*3BVAKK{$^~4i6^LAa^@Ibi*vK8O;23=xM<7KOUEU_k)|Cf`fzqQF2};73AM

7Bq4ik# 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

~lctIbcy;_YYJy_xc{?5NrBe^%jT6V3^w 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 literal 0 HcmV?d00001 diff --git a/socks/main.go b/socks/main.go index 513dba7..90992d3 100644 --- a/socks/main.go +++ b/socks/main.go @@ -3,13 +3,14 @@ package main import ( "context" "errors" + "flag" "fmt" "net" // "net/netip" - "flag" "os" "os/signal" "slices" + "strconv" "strings" "syscall" "time" @@ -40,15 +41,22 @@ func initGlog() { func main() { cfg := struct { - addr string - apiURL string - platformURL string - userAuth string - password string - providerID string - city string - country string - region string + addr string + network string + apiURL string + platformURL string + userAuth string + password string + authCode string + jwt string + providerID string + city string + country string + region string + metricsEveryMs int + resetMetrics bool + reliability string + control string }{} usage := `socksproxy - dev socks5 proxy over urnetwork. @@ -57,14 +65,21 @@ Usage: Options: --addr= socks5 server address (env ADDR, default 127.0.0.1:9999) - --api-url= api url (env API_URL, default https://api.bringyour.com) - --platform-url= platform url (env PLATFORM_URL, default wss://connect.bringyour.com) - --user-auth= user auth, required (env USER_AUTH) - --password= password, required (env PASSWORD) + --network= preset endpoints: main or beta (env NETWORK, default main) + --api-url= api url (env API_URL, default from --network) + --platform-url= platform url (env PLATFORM_URL, default from --network) + --user-auth= user auth (env USER_AUTH) + --password= password (env PASSWORD) + --auth-code= auth code login (env AUTH_CODE) — preferred for beta/test networks + --jwt= existing network jwt (env JWT), skips login entirely --provider-id= provider id (env PROVIDER_ID) --city= city (env CITY) --country= country (env COUNTRY) --region= region (env REGION) + --metrics-every= print reliability metrics + exit table every N ms (env METRICS_EVERY, 0 = off) + --reset-metrics zero the reliability counters at startup (env RESET_METRICS=1) + --reliability= json file of reliability settings applied at startup (env RELIABILITY) + --control= local control http server (env CONTROL, e.g. 127.0.0.1:9998, empty = off) -h --help show this help.` opts, err := docopt.ParseArgs(usage, os.Args[1:], Version) @@ -90,16 +105,51 @@ Options: return def } cfg.addr = pick("--addr", "ADDR", "127.0.0.1:9999") - cfg.apiURL = pick("--api-url", "API_URL", "https://api.bringyour.com") - cfg.platformURL = pick("--platform-url", "PLATFORM_URL", "wss://connect.bringyour.com") + cfg.network = pick("--network", "NETWORK", "main") + switch cfg.network { + case "main": + cfg.apiURL = pick("--api-url", "API_URL", "https://api.bringyour.com") + cfg.platformURL = pick("--platform-url", "PLATFORM_URL", "wss://connect.bringyour.com") + case "beta": + cfg.apiURL = pick("--api-url", "API_URL", "https://api.beta-test.net") + cfg.platformURL = pick("--platform-url", "PLATFORM_URL", "wss://connect.beta-test.net") + default: + fmt.Fprintf(os.Stderr, "unknown --network %q: expected main or beta\n", cfg.network) + os.Exit(1) + } + // explicit --api-url / --platform-url still override the preset, and the + // env vars follow -- pick() above already gave flags priority over env cfg.userAuth = pick("--user-auth", "USER_AUTH", "") cfg.password = pick("--password", "PASSWORD", "") + cfg.authCode = pick("--auth-code", "AUTH_CODE", "") + cfg.jwt = pick("--jwt", "JWT", "") cfg.providerID = pick("--provider-id", "PROVIDER_ID", "") cfg.city = pick("--city", "CITY", "") cfg.country = pick("--country", "COUNTRY", "") cfg.region = pick("--region", "REGION", "") - if cfg.userAuth == "" || cfg.password == "" { - fmt.Fprintln(os.Stderr, "--user-auth and --password are required (or set USER_AUTH / PASSWORD)") + + if v := optStr("--metrics-every"); v != "" { + ms, err := strconv.Atoi(v) + if err != nil || ms <= 0 { + fmt.Fprintln(os.Stderr, "--metrics-every must be a positive millisecond value") + os.Exit(1) + } + cfg.metricsEveryMs = ms + } else if v := os.Getenv("METRICS_EVERY"); v != "" { + ms, err := strconv.Atoi(v) + if err != nil || ms <= 0 { + fmt.Fprintln(os.Stderr, "--metrics-every must be a positive millisecond value") + os.Exit(1) + } + cfg.metricsEveryMs = ms + } + resetMetrics, _ := opts.Bool("--reset-metrics") + cfg.resetMetrics = resetMetrics || os.Getenv("RESET_METRICS") == "1" + cfg.reliability = pick("--reliability", "RELIABILITY", "") + cfg.control = pick("--control", "CONTROL", "") + + if cfg.jwt == "" && cfg.authCode == "" && (cfg.userAuth == "" || cfg.password == "") { + fmt.Fprintln(os.Stderr, "provide --jwt, --auth-code, or --user-auth + --password (or set JWT / AUTH_CODE / USER_AUTH + PASSWORD)") os.Exit(1) } @@ -108,7 +158,16 @@ Options: run := func() error { - jwt, err := login(ctx, cfg.apiURL, cfg.userAuth, cfg.password) + var jwt string + var err error + switch { + case cfg.jwt != "": + jwt = cfg.jwt + case cfg.authCode != "": + jwt, err = loginWithAuthCode(ctx, cfg.apiURL, cfg.authCode) + default: + jwt, err = login(ctx, cfg.apiURL, cfg.userAuth, cfg.password) + } if err != nil { return fmt.Errorf("login failed: %w", err) } @@ -191,6 +250,65 @@ Options: protocol.ProvideMode_Network, ) + if cfg.reliability != "" { + // merge over the current (default) settings so unspecified fields + // keep their defaults instead of being zeroed + f, err := parseReliabilityFile(cfg.reliability) + if err != nil { + return fmt.Errorf("reliability settings: %w", err) + } + merged := settingsToFile(mc.ReliabilitySettings()) + if err := applyFileOver(merged, f); err != nil { + return fmt.Errorf("reliability settings: %w", err) + } + settings, err := fileToSettings(merged) + if err != nil { + return fmt.Errorf("reliability settings: %w", err) + } + mc.SetReliabilitySettings(settings) + fmt.Printf("reliability settings loaded from %s\n", cfg.reliability) + } + + if cfg.control != "" { + // the control server is unauthenticated and can change settings, + // drop exits, and migrate flows -- refuse non-loopback binds + ok, err := controlAddrIsLoopback(cfg.control) + if err != nil { + return fmt.Errorf("control address: %w", err) + } + if !ok { + return fmt.Errorf("control address %q must be loopback; the control server is unauthenticated", cfg.control) + } + server, err := newControlServer(cfg.control, mc) + if err != nil { + return fmt.Errorf("control server: %w", err) + } + server.SetCancel(stop) + go server.serve(ctx) + fmt.Printf("control server listening on %s\n", cfg.control) + } + + if cfg.resetMetrics { + mc.ResetReliabilityMetrics() + fmt.Println("reliability metrics reset") + } + + if cfg.metricsEveryMs > 0 { + go func() { + ticker := time.NewTicker(time.Duration(cfg.metricsEveryMs) * time.Millisecond) + defer ticker.Stop() + for { + select { + case <-ctx.Done(): + return + case <-ticker.C: + printReliabilityMetrics(mc) + } + } + }() + fmt.Printf("reliability metrics every %dms\n", cfg.metricsEveryMs) + } + source := connect.SourceId(clientID) go func() { @@ -237,6 +355,104 @@ Options: } } +// printReliabilityMetrics writes the reliability counters and the current +// exit table to stdout. It is the console equivalent of the android +// developer screen's measurements block: flows opened, dial failures +// intercepted/reraced, blast radius (mean + worst exit loss), recovery +// mean/max/pending, probes sent/answered/qualified, busy probes, verdicts +// held, removals deferred, rebinds, and one row per exit (warning / +// quarantine flags, flow count, dial failures, tier vs effective tier, +// proven status). Called on the --metrics-every ticker. +func printReliabilityMetrics(mc mcControl) { + m := mc.ReliabilityMetrics() + if m == nil { + return + } + fmt.Printf("\n--- reliability metrics %s ---\n", time.Now().Format("15:04:05")) + fmt.Printf("flows_opened=%d dial_failures_intercepted=%d flows_reraced=%d\n", m.FlowsOpened, m.DialFailuresIntercepted, m.FlowsReraced) + fmt.Printf("exit_loss_events=%d flows_lost_to_exit=%d max_flows_lost_one_event=%d mean_flows_lost_per_exit_loss=%.2f\n", + m.ExitLossEvents, m.FlowsLostToExit, m.MaxFlowsLostInOneEvent, m.MeanFlowsLostPerExitLoss) + fmt.Printf("recovery_count=%d recovery_missed=%d recovery_mean=%s recovery_max=%s recovery_pending=%d\n", + m.RecoveryCount, m.RecoveryMissed, fmtDurationMillis(m.RecoveryMeanNanos/1e6), fmtDurationMillis(m.RecoveryMaxNanos/1e6), m.RecoveryPending) + fmt.Printf("probes_sent=%d probes_answered=%d providers_qualified=%d busy_probes_sent=%d busy_probes_acquitted=%d scheduler_pauses=%d\n", + m.ProbesSent, m.ProbesAnswered, m.ProvidersQualified, m.BusyProbesSent, m.BusyProbesAcquitted, m.SchedulerPausesDetected) + fmt.Printf("verdicts_held_uplink_stale=%d verdicts_held_transport_down=%d removals_deferred=%d\n", + m.VerdictsHeldUplinkStale, m.VerdictsHeldTransportDown, m.RemovalsDeferred) + fmt.Printf("flows_rebound=%d rebinds_accepted=%d rebinds_redialed=%d groups_followed=%d groups_scattered=%d\n", + m.FlowsRebound, m.RebindsAccepted, m.RebindsRedialed, m.GroupsFollowed, m.GroupsScattered) + + exits := mc.Exits() + if len(exits) == 0 { + fmt.Println("exits: none") + return + } + fmt.Println("exits:") + for _, e := range exits { + flags := "" + if e.Warning { + flags += "W" + } + if e.Quarantined { + flags += "Q" + } + if e.Done { + flags += "D" + } + if flags == "" { + flags = "-" + } + fmt.Printf(" %s %s flows=%d dial_failures=%d tier=%d effective_tier=%d proven=%v\n", + flags, exitLabel(e.ClientId), e.FlowCount, e.DialFailureCount, e.Tier, e.EffectiveTier, e.Proven) + } +} + +// fmtDurationMillis renders a millisecond duration compactly: raw ms below a +// second, one-decimal seconds above. Negative values (an unset clock) render +// as "-" so "never measured" reads differently from "0ms". +func fmtDurationMillis(ms int64) string { + if ms < 0 { + return "-" + } + if ms < 1000 { + return fmt.Sprintf("%dms", ms) + } + return fmt.Sprintf("%.1fs", float64(ms)/1000.0) +} + +// exitLabel renders a short suffix of the client id so rows are +// distinguishable. Client ids are ULIDs -- the leading characters encode +// creation time, so channels opened milliseconds apart look identical; the +// random component is in the tail. +func exitLabel(id connect.Id) string { + return exitLabelString(id.String()) +} + +func exitLabelString(s string) string { + if len(s) <= 8 { + return s + } + return s[len(s)-8:] +} + +// controlAddrIsLoopback reports whether addr is a loopback bind address +// (localhost, 127.0.0.1, or ::1) with a port. The control server is +// unauthenticated, so anything else must be refused. +func controlAddrIsLoopback(addr string) (bool, error) { + host, _, err := net.SplitHostPort(addr) + if err != nil { + return false, err + } + ip := net.ParseIP(host) + if host != "localhost" && (ip == nil || !ip.IsLoopback()) { + return false, nil + } + return true, nil +} + +// getProviderSpec resolves the provider-locations result to a ProviderSpec +// by, in order: exact provider id, city, country, region. The matching is +// case-insensitive. An unmatched location yields a help listing of every +// country/region/city available. func getProviderSpec( locations *FindLocationsResult, city string, @@ -400,6 +616,29 @@ func login(ctx context.Context, apiURL, userAuth, password string) (string, erro } +// loginWithAuthCode redeems an auth code via POST /auth/code-login and +// returns the network by_jwt. This is the auth path for beta/test networks +// that have no password accounts -- the same flow the provider CLI uses. +func loginWithAuthCode(ctx context.Context, apiURL, authCode string) (string, error) { + api := connect.NewBringYourApi( + ctx, + connect.NewClientStrategyWithDefaults(ctx), + apiURL, + ) + + res, err := api.AuthCodeLoginSync(&connect.AuthCodeLoginArgs{ + AuthCode: authCode, + }) + if err != nil { + return "", err + } + if res.Error != nil { + return "", errors.New(res.Error.Message) + } + + return res.ByJwt, nil +} + func getProviderLocations(ctx context.Context, apiURL string, jwt string) (*FindLocationsResult, error) { strategy := connect.NewClientStrategyWithDefaults(ctx) @@ -467,6 +706,8 @@ func authNetworkClient(ctx context.Context, apiURL, jwt string, req *connect.Aut return res.ByClientJwt, nil } +// parseByJwtClientId extracts the client_id claim from a by_jwt token without +// verifying its signature (the network already authenticated the token). func parseByJwtClientId(byJwt string) (connect.Id, error) { claims := gojwt.MapClaims{} gojwt.NewParser().ParseUnverified(byJwt, claims) diff --git a/socks/main_test.go b/socks/main_test.go index 7332337..c219674 100644 --- a/socks/main_test.go +++ b/socks/main_test.go @@ -22,7 +22,7 @@ import ( // exercise the real, current text/literals rather than a copy that could // drift from it. -// usageFromSource extracts the literal `usage := \`...\`` doc string from +// usageFromSource extracts the literal `usage := \`...\` doc string from // main.go. func usageFromSource(t *testing.T) string { t.Helper() @@ -134,4 +134,4 @@ func TestDevSocksProxyHasNoValidUserOverride(t *testing.T) { "ConnectDialWithRequest; the dev \"any credentials accepted\" override should "+ "have been removed in favor of the library's nil-ValidUser no-auth default:\n%s", between) } -} \ No newline at end of file +} diff --git a/socks/reliability_file.go b/socks/reliability_file.go new file mode 100644 index 0000000..f24ebee --- /dev/null +++ b/socks/reliability_file.go @@ -0,0 +1,302 @@ +package main + +import ( + "encoding/json" + "fmt" + "os" + "time" + + "github.com/urnetwork/connect" +) + +// reliabilityFile mirrors connect.ReliabilitySettings with json-friendly +// fields. Durations are milliseconds (same convention as the android dev +// screen's presets); a nil field is untouched (keeps the current/default +// value), while an explicit zero value is applied. +type reliabilityFile struct { + UdpTeardownSignal *bool `json:"udpTeardownSignal"` + QuicRebindOnExitLoss *bool `json:"quicRebindOnExitLoss"` + TcpCollapseMaxHoldMs *int64 `json:"tcpCollapseMaxHoldMs"` + SendStallTimeoutMs *int64 `json:"sendStallTimeoutMs"` + ClusterAffinityFallback *bool `json:"clusterAffinityFallback"` + ServerNameAffinityBridge *bool `json:"serverNameAffinityBridge"` + SequenceIdleTimeoutMs *int64 `json:"sequenceIdleTimeoutMs"` + TcpSequenceIdleTimeoutMs *int64 `json:"tcpSequenceIdleTimeoutMs"` + BlackholeReceiveTimeoutMs *int64 `json:"blackholeReceiveTimeoutMs"` + MaxFlowsPerExit *int `json:"maxFlowsPerExit"` + AffinityStickyPastCap *bool `json:"affinityStickyPastCap"` + QuarantineGroupFollow *bool `json:"quarantineGroupFollow"` + GroupFollowWindowMs *int64 `json:"groupFollowWindowMs"` + DialFailureRerace *bool `json:"dialFailureRerace"` + UplinkStalenessGateMs *int64 `json:"uplinkStalenessGateMs"` + SoftVerdictDemote *bool `json:"softVerdictDemote"` + RemovalBudgetCount *int `json:"removalBudgetCount"` + RemovalBudgetWindowMs *int64 `json:"removalBudgetWindowMs"` + StandingReserve *bool `json:"standingReserve"` + EffectiveTierSelection *bool `json:"effectiveTierSelection"` + MinBlackholeDestinations *int `json:"minBlackholeDestinations"` + BlackholeLoadCorroboration *int `json:"blackholeLoadCorroboration"` + ProviderProbe *bool `json:"providerProbe"` + ProbeTimeoutMs *int64 `json:"probeTimeoutMs"` + ProbeSampleHostCount *int `json:"probeSampleHostCount"` + ProbeSilenceWarnStreak *int `json:"probeSilenceWarnStreak"` + EvaluationPoolMultiple *int `json:"evaluationPoolMultiple"` + FormationPollTimeoutMs *int64 `json:"formationPollTimeoutMs"` + BusyProbe *bool `json:"busyProbe"` + BusyProbeBudgetMs *int64 `json:"busyProbeBudgetMs"` + SchedulerPauseToleranceMs *int64 `json:"schedulerPauseToleranceMs"` + SchedulerPauseRecoveryTimeoutMs *int64 `json:"schedulerPauseRecoveryTimeoutMs"` + BlackholeConnectComparativeTimeoutMs *int64 `json:"blackholeConnectComparativeTimeoutMs"` + HeartbeatIntervalMs *int64 `json:"heartbeatIntervalMs"` +} + +// parseReliabilityFile reads and unmarshals a reliability settings file into +// its json shape. Missing fields stay nil (untouched); an explicit zero value +// is applied. See reliabilityFile. +func parseReliabilityFile(path string) (*reliabilityFile, error) { + data, err := os.ReadFile(path) + if err != nil { + return nil, err + } + var f reliabilityFile + if err := json.Unmarshal(data, &f); err != nil { + return nil, fmt.Errorf("parse %s: %w", path, err) + } + return &f, nil +} + +// loadReliabilitySettingsFile reads a settings file and converts it to a +// connect.ReliabilitySettings. Fields absent from the file are left at their +// zero value here; callers that need to preserve engine defaults must merge +// over the current settings first (see applyFileOver + settingsToFile). +func loadReliabilitySettingsFile(path string) (*connect.ReliabilitySettings, error) { + f, err := parseReliabilityFile(path) + if err != nil { + return nil, err + } + return fileToSettings(f) +} + +// fileToSettings converts the json shape to a connect.ReliabilitySettings. +// Durations are milliseconds in the file, time.Duration in the struct; nil +// fields map to zero values in the struct. +func fileToSettings(f *reliabilityFile) (*connect.ReliabilitySettings, error) { + if f == nil { + return &connect.ReliabilitySettings{}, nil + } + settings := &connect.ReliabilitySettings{} + if f.UdpTeardownSignal != nil { + settings.UdpTeardownSignal = *f.UdpTeardownSignal + } + if f.QuicRebindOnExitLoss != nil { + settings.QuicRebindOnExitLoss = *f.QuicRebindOnExitLoss + } + if f.TcpCollapseMaxHoldMs != nil { + settings.TcpCollapseMaxHold = time.Duration(*f.TcpCollapseMaxHoldMs) * time.Millisecond + } + if f.SendStallTimeoutMs != nil { + settings.SendStallTimeout = time.Duration(*f.SendStallTimeoutMs) * time.Millisecond + } + if f.ClusterAffinityFallback != nil { + settings.ClusterAffinityFallback = *f.ClusterAffinityFallback + } + if f.ServerNameAffinityBridge != nil { + settings.ServerNameAffinityBridge = *f.ServerNameAffinityBridge + } + if f.SequenceIdleTimeoutMs != nil { + settings.SequenceIdleTimeout = time.Duration(*f.SequenceIdleTimeoutMs) * time.Millisecond + } + if f.TcpSequenceIdleTimeoutMs != nil { + settings.TcpSequenceIdleTimeout = time.Duration(*f.TcpSequenceIdleTimeoutMs) * time.Millisecond + } + if f.BlackholeReceiveTimeoutMs != nil { + settings.BlackholeReceiveTimeout = time.Duration(*f.BlackholeReceiveTimeoutMs) * time.Millisecond + } + if f.MaxFlowsPerExit != nil { + settings.MaxFlowsPerExit = *f.MaxFlowsPerExit + } + if f.AffinityStickyPastCap != nil { + settings.AffinityStickyPastCap = *f.AffinityStickyPastCap + } + if f.QuarantineGroupFollow != nil { + settings.QuarantineGroupFollow = *f.QuarantineGroupFollow + } + if f.GroupFollowWindowMs != nil { + settings.GroupFollowWindow = time.Duration(*f.GroupFollowWindowMs) * time.Millisecond + } + if f.DialFailureRerace != nil { + settings.DialFailureRerace = *f.DialFailureRerace + } + if f.UplinkStalenessGateMs != nil { + settings.UplinkStalenessGate = time.Duration(*f.UplinkStalenessGateMs) * time.Millisecond + } + if f.SoftVerdictDemote != nil { + settings.SoftVerdictDemote = *f.SoftVerdictDemote + } + if f.RemovalBudgetCount != nil { + settings.RemovalBudgetCount = *f.RemovalBudgetCount + } + if f.RemovalBudgetWindowMs != nil { + settings.RemovalBudgetWindow = time.Duration(*f.RemovalBudgetWindowMs) * time.Millisecond + } + if f.StandingReserve != nil { + settings.StandingReserve = *f.StandingReserve + } + if f.EffectiveTierSelection != nil { + settings.EffectiveTierSelection = *f.EffectiveTierSelection + } + if f.MinBlackholeDestinations != nil { + settings.MinBlackholeDestinations = *f.MinBlackholeDestinations + } + if f.BlackholeLoadCorroboration != nil { + settings.BlackholeLoadCorroboration = *f.BlackholeLoadCorroboration + } + if f.ProviderProbe != nil { + settings.ProviderProbe = *f.ProviderProbe + } + if f.ProbeTimeoutMs != nil { + settings.ProbeTimeout = time.Duration(*f.ProbeTimeoutMs) * time.Millisecond + } + if f.ProbeSampleHostCount != nil { + settings.ProbeSampleHostCount = *f.ProbeSampleHostCount + } + if f.ProbeSilenceWarnStreak != nil { + settings.ProbeSilenceWarnStreak = *f.ProbeSilenceWarnStreak + } + if f.EvaluationPoolMultiple != nil { + settings.EvaluationPoolMultiple = *f.EvaluationPoolMultiple + } + if f.FormationPollTimeoutMs != nil { + settings.FormationPollTimeout = time.Duration(*f.FormationPollTimeoutMs) * time.Millisecond + } + if f.BusyProbe != nil { + settings.BusyProbe = *f.BusyProbe + } + if f.BusyProbeBudgetMs != nil { + settings.BusyProbeBudget = time.Duration(*f.BusyProbeBudgetMs) * time.Millisecond + } + if f.SchedulerPauseToleranceMs != nil { + settings.SchedulerPauseTolerance = time.Duration(*f.SchedulerPauseToleranceMs) * time.Millisecond + } + if f.SchedulerPauseRecoveryTimeoutMs != nil { + settings.SchedulerPauseRecoveryTimeout = time.Duration(*f.SchedulerPauseRecoveryTimeoutMs) * time.Millisecond + } + if f.BlackholeConnectComparativeTimeoutMs != nil { + settings.BlackholeConnectComparativeTimeout = time.Duration(*f.BlackholeConnectComparativeTimeoutMs) * time.Millisecond + } + if f.HeartbeatIntervalMs != nil { + settings.HeartbeatInterval = time.Duration(*f.HeartbeatIntervalMs) * time.Millisecond + } + + return settings, nil +} + +// applyFileOver copies every non-nil field of src onto dst (both json shapes). +func applyFileOver(dst, src *reliabilityFile) error { + if src == nil { + return nil + } + if src.UdpTeardownSignal != nil { + dst.UdpTeardownSignal = src.UdpTeardownSignal + } + if src.QuicRebindOnExitLoss != nil { + dst.QuicRebindOnExitLoss = src.QuicRebindOnExitLoss + } + if src.TcpCollapseMaxHoldMs != nil { + dst.TcpCollapseMaxHoldMs = src.TcpCollapseMaxHoldMs + } + if src.SendStallTimeoutMs != nil { + dst.SendStallTimeoutMs = src.SendStallTimeoutMs + } + if src.ClusterAffinityFallback != nil { + dst.ClusterAffinityFallback = src.ClusterAffinityFallback + } + if src.ServerNameAffinityBridge != nil { + dst.ServerNameAffinityBridge = src.ServerNameAffinityBridge + } + if src.SequenceIdleTimeoutMs != nil { + dst.SequenceIdleTimeoutMs = src.SequenceIdleTimeoutMs + } + if src.TcpSequenceIdleTimeoutMs != nil { + dst.TcpSequenceIdleTimeoutMs = src.TcpSequenceIdleTimeoutMs + } + if src.BlackholeReceiveTimeoutMs != nil { + dst.BlackholeReceiveTimeoutMs = src.BlackholeReceiveTimeoutMs + } + if src.MaxFlowsPerExit != nil { + dst.MaxFlowsPerExit = src.MaxFlowsPerExit + } + if src.AffinityStickyPastCap != nil { + dst.AffinityStickyPastCap = src.AffinityStickyPastCap + } + if src.QuarantineGroupFollow != nil { + dst.QuarantineGroupFollow = src.QuarantineGroupFollow + } + if src.GroupFollowWindowMs != nil { + dst.GroupFollowWindowMs = src.GroupFollowWindowMs + } + if src.DialFailureRerace != nil { + dst.DialFailureRerace = src.DialFailureRerace + } + if src.UplinkStalenessGateMs != nil { + dst.UplinkStalenessGateMs = src.UplinkStalenessGateMs + } + if src.SoftVerdictDemote != nil { + dst.SoftVerdictDemote = src.SoftVerdictDemote + } + if src.RemovalBudgetCount != nil { + dst.RemovalBudgetCount = src.RemovalBudgetCount + } + if src.RemovalBudgetWindowMs != nil { + dst.RemovalBudgetWindowMs = src.RemovalBudgetWindowMs + } + if src.StandingReserve != nil { + dst.StandingReserve = src.StandingReserve + } + if src.EffectiveTierSelection != nil { + dst.EffectiveTierSelection = src.EffectiveTierSelection + } + if src.MinBlackholeDestinations != nil { + dst.MinBlackholeDestinations = src.MinBlackholeDestinations + } + if src.BlackholeLoadCorroboration != nil { + dst.BlackholeLoadCorroboration = src.BlackholeLoadCorroboration + } + if src.ProviderProbe != nil { + dst.ProviderProbe = src.ProviderProbe + } + if src.ProbeTimeoutMs != nil { + dst.ProbeTimeoutMs = src.ProbeTimeoutMs + } + if src.ProbeSampleHostCount != nil { + dst.ProbeSampleHostCount = src.ProbeSampleHostCount + } + if src.ProbeSilenceWarnStreak != nil { + dst.ProbeSilenceWarnStreak = src.ProbeSilenceWarnStreak + } + if src.EvaluationPoolMultiple != nil { + dst.EvaluationPoolMultiple = src.EvaluationPoolMultiple + } + if src.FormationPollTimeoutMs != nil { + dst.FormationPollTimeoutMs = src.FormationPollTimeoutMs + } + if src.BusyProbe != nil { + dst.BusyProbe = src.BusyProbe + } + if src.BusyProbeBudgetMs != nil { + dst.BusyProbeBudgetMs = src.BusyProbeBudgetMs + } + if src.SchedulerPauseToleranceMs != nil { + dst.SchedulerPauseToleranceMs = src.SchedulerPauseToleranceMs + } + if src.SchedulerPauseRecoveryTimeoutMs != nil { + dst.SchedulerPauseRecoveryTimeoutMs = src.SchedulerPauseRecoveryTimeoutMs + } + if src.BlackholeConnectComparativeTimeoutMs != nil { + dst.BlackholeConnectComparativeTimeoutMs = src.BlackholeConnectComparativeTimeoutMs + } + if src.HeartbeatIntervalMs != nil { + dst.HeartbeatIntervalMs = src.HeartbeatIntervalMs + } + return nil +} diff --git a/socks/reliability_test.go b/socks/reliability_test.go new file mode 100644 index 0000000..7d74fc0 --- /dev/null +++ b/socks/reliability_test.go @@ -0,0 +1,505 @@ +package main + +import ( + "encoding/json" + "net/http" + "net/http/httptest" + "os" + "path/filepath" + "strings" + "testing" + "time" + + "github.com/urnetwork/connect" +) + +// --- reliability file --- + +func writeRelFile(t *testing.T, content string) string { + t.Helper() + path := filepath.Join(t.TempDir(), "reliability.json") + if err := os.WriteFile(path, []byte(content), 0644); err != nil { + t.Fatal(err) + } + return path +} + +func TestParseReliabilityFilePartial(t *testing.T) { + path := writeRelFile(t, `{ + "maxFlowsPerExit": 32, + "sendStallTimeoutMs": 5000, + "busyProbe": true + }`) + f, err := parseReliabilityFile(path) + if err != nil { + t.Fatalf("parse: %v", err) + } + if f.MaxFlowsPerExit == nil || *f.MaxFlowsPerExit != 32 { + t.Errorf("MaxFlowsPerExit = %v, want 32", f.MaxFlowsPerExit) + } + if f.SendStallTimeoutMs == nil || *f.SendStallTimeoutMs != 5000 { + t.Errorf("SendStallTimeoutMs = %v, want 5000", f.SendStallTimeoutMs) + } + if f.BusyProbe == nil || !*f.BusyProbe { + t.Errorf("BusyProbe = %v, want true", f.BusyProbe) + } + // unspecified fields stay nil (untouched), not zero + if f.UdpTeardownSignal != nil { + t.Errorf("UdpTeardownSignal = %v, want nil (untouched)", f.UdpTeardownSignal) + } + if f.BlackholeReceiveTimeoutMs != nil { + t.Errorf("BlackholeReceiveTimeoutMs = %v, want nil (untouched)", f.BlackholeReceiveTimeoutMs) + } +} + +func TestParseReliabilityFileBadJSON(t *testing.T) { + path := writeRelFile(t, `{not json`) + if _, err := parseReliabilityFile(path); err == nil { + t.Fatal("expected error for invalid json") + } +} + +func TestParseReliabilityFileMissing(t *testing.T) { + if _, err := parseReliabilityFile("/nonexistent/reliability.json"); err == nil { + t.Fatal("expected error for missing file") + } +} + +func TestFileToSettingsExplicitZeroApplied(t *testing.T) { + // an explicit 0 in the file must be applied (0 = off / pre-fix behavior), + // distinct from nil (untouched) + f := &reliabilityFile{ + MaxFlowsPerExit: intPtr(0), + SendStallTimeoutMs: int64Ptr(0), + BusyProbe: boolPtr(false), + BlackholeReceiveTimeoutMs: int64Ptr(0), + } + s, err := fileToSettings(f) + if err != nil { + t.Fatal(err) + } + if s.MaxFlowsPerExit != 0 { + t.Errorf("MaxFlowsPerExit = %d, want 0 (explicit zero applied)", s.MaxFlowsPerExit) + } + if s.SendStallTimeout != 0 { + t.Errorf("SendStallTimeout = %v, want 0", s.SendStallTimeout) + } + if s.BusyProbe { + t.Error("BusyProbe = true, want false") + } + if s.BlackholeReceiveTimeout != 0 { + t.Errorf("BlackholeReceiveTimeout = %v, want 0", s.BlackholeReceiveTimeout) + } +} + +func TestApplyFileOverPreservesBase(t *testing.T) { + base := &connect.ReliabilitySettings{ + UdpTeardownSignal: true, + SendStallTimeout: 3000 * time.Millisecond, + MaxFlowsPerExit: 16, + BlackholeReceiveTimeout: 20 * time.Second, + } + overlay := &reliabilityFile{MaxFlowsPerExit: intPtr(64)} + + merged := settingsToFile(base) + if err := applyFileOver(merged, overlay); err != nil { + t.Fatal(err) + } + s, err := fileToSettings(merged) + if err != nil { + t.Fatal(err) + } + if s.MaxFlowsPerExit != 64 { + t.Errorf("MaxFlowsPerExit = %d, want 64", s.MaxFlowsPerExit) + } + if !s.UdpTeardownSignal { + t.Error("UdpTeardownSignal lost, want true (preserved from base)") + } + if s.SendStallTimeout != 3*time.Second { + t.Errorf("SendStallTimeout = %v, want 3s (preserved)", s.SendStallTimeout) + } + if s.BlackholeReceiveTimeout != 20*time.Second { + t.Errorf("BlackholeReceiveTimeout = %v, want 20s (preserved)", s.BlackholeReceiveTimeout) + } +} + +func TestSettingsToFileRoundTrip(t *testing.T) { + s := &connect.ReliabilitySettings{ + UdpTeardownSignal: true, + QuicRebindOnExitLoss: true, + TcpCollapseMaxHold: 1500 * time.Millisecond, + SendStallTimeout: 3 * time.Second, + ClusterAffinityFallback: true, + ServerNameAffinityBridge: true, + SequenceIdleTimeout: 120 * time.Second, + TcpSequenceIdleTimeout: 600 * time.Second, + BlackholeReceiveTimeout: 20 * time.Second, + MaxFlowsPerExit: 16, + AffinityStickyPastCap: true, + QuarantineGroupFollow: true, + GroupFollowWindow: 45 * time.Second, + DialFailureRerace: true, + UplinkStalenessGate: 5 * time.Second, + SoftVerdictDemote: true, + RemovalBudgetCount: 2, + RemovalBudgetWindow: 30 * time.Second, + StandingReserve: true, + EffectiveTierSelection: true, + MinBlackholeDestinations: 2, + BlackholeLoadCorroboration: 8, + ProviderProbe: true, + ProbeTimeout: 4 * time.Second, + ProbeSampleHostCount: 0, + ProbeSilenceWarnStreak: 2, + EvaluationPoolMultiple: 2, + FormationPollTimeout: 200 * time.Millisecond, + BusyProbe: true, + BusyProbeBudget: 0, + SchedulerPauseTolerance: 2 * time.Second, + SchedulerPauseRecoveryTimeout: 5 * time.Second, + BlackholeConnectComparativeTimeout: 10 * time.Second, + HeartbeatInterval: 60 * time.Second, + } + + back, err := fileToSettings(settingsToFile(s)) + if err != nil { + t.Fatal(err) + } + // spot-check the ones with interesting conversions + if back.MaxFlowsPerExit != 16 { + t.Errorf("MaxFlowsPerExit = %d, want 16", back.MaxFlowsPerExit) + } + if back.SendStallTimeout != 3*time.Second { + t.Errorf("SendStallTimeout = %v, want 3s", back.SendStallTimeout) + } + if back.ProbeSampleHostCount != 0 { + t.Errorf("ProbeSampleHostCount = %d, want 0 (explicit zero survives)", back.ProbeSampleHostCount) + } + if !back.BusyProbe { + t.Error("BusyProbe lost") + } + if back.BusyProbeBudget != 0 { + t.Errorf("BusyProbeBudget = %v, want 0", back.BusyProbeBudget) + } + if back.HeartbeatInterval != 60*time.Second { + t.Errorf("HeartbeatInterval = %v, want 60s", back.HeartbeatInterval) + } +} + +// --- control server loopback guard --- + +func TestControlAddrLoopbackGuard(t *testing.T) { + ok, err := controlAddrIsLoopback("127.0.0.1:9998") + if err != nil || !ok { + t.Errorf("127.0.0.1:9998 should be allowed (ok=%v err=%v)", ok, err) + } + ok, err = controlAddrIsLoopback("localhost:9998") + if err != nil || !ok { + t.Errorf("localhost:9998 should be allowed (ok=%v err=%v)", ok, err) + } + ok, err = controlAddrIsLoopback("[::1]:9998") + if err != nil || !ok { + t.Errorf("[::1]:9998 should be allowed (ok=%v err=%v)", ok, err) + } + ok, err = controlAddrIsLoopback("0.0.0.0:9998") + if err != nil || ok { + t.Errorf("0.0.0.0:9998 must be rejected (ok=%v err=%v)", ok, err) + } + ok, err = controlAddrIsLoopback("192.168.1.5:9998") + if err != nil || ok { + t.Errorf("192.168.1.5:9998 must be rejected (ok=%v err=%v)", ok, err) + } + if _, err := controlAddrIsLoopback("not-an-addr"); err == nil { + t.Error("expected SplitHostPort error for malformed address") + } +} + +// --- control server endpoints (with a real multi client is impossible here, +// so use the real server with a stub mc via a minimal fake) --- + +// fakeMC implements just enough of the mc surface for the control handlers. +type fakeMC struct { + settings *connect.ReliabilitySettings + metrics *connect.ReliabilityMetricsSnapshot + exits []*connect.ExitInfo + dropped []string + stalled []string + migrated []string + shuffled bool + probed int + resets int +} + +func (f *fakeMC) ReliabilitySettings() *connect.ReliabilitySettings { + if f.settings == nil { + return &connect.ReliabilitySettings{} + } + return f.settings +} +func (f *fakeMC) SetReliabilitySettings(s *connect.ReliabilitySettings) { f.settings = s } +func (f *fakeMC) ReliabilityMetrics() *connect.ReliabilityMetricsSnapshot { + if f.metrics == nil { + return &connect.ReliabilityMetricsSnapshot{} + } + return f.metrics +} +func (f *fakeMC) ResetReliabilityMetrics() { f.resets++ } +func (f *fakeMC) Shuffle() { f.shuffled = true } +func (f *fakeMC) ProbeAllExits() int { f.probed++; return 3 } +func (f *fakeMC) Exits() []*connect.ExitInfo { return f.exits } +func (f *fakeMC) DropExit(id connect.Id) bool { + f.dropped = append(f.dropped, id.String()) + return true +} +func (f *fakeMC) StallExit(id connect.Id, stalled bool) bool { + f.stalled = append(f.stalled, id.String()) + return true +} +func (f *fakeMC) MigrateExit(id connect.Id) int { + f.migrated = append(f.migrated, id.String()) + return 5 +} +func (f *fakeMC) PacketStats() *connect.PacketStats { + return &connect.PacketStats{ + RemoteEgressByteCount: 1024, + RemoteIngressByteCount: 2048, + RemoteEgressPacketCount: 10, + RemoteIngressPacketCount: 20, + } +} + +func TestControlEndpoints(t *testing.T) { + mc := &fakeMC{} + c, err := newControlServer("127.0.0.1:0", mc) + if err != nil { + t.Fatal(err) + } + srv := httptest.NewServer(c.server.Handler) + defer srv.Close() + + // GET /settings returns json with current values + resp, err := http.Get(srv.URL + "/settings") + if err != nil { + t.Fatal(err) + } + var got map[string]any + if err := json.NewDecoder(resp.Body).Decode(&got); err != nil { + t.Fatal(err) + } + resp.Body.Close() + if got["maxFlowsPerExit"] != nil && got["maxFlowsPerExit"].(float64) != 0 { + t.Errorf("unexpected maxFlowsPerExit: %v", got["maxFlowsPerExit"]) + } + + // PUT /settings partial merge: set maxFlowsPerExit, keep the rest + req, _ := http.NewRequest("PUT", srv.URL+"/settings", strings.NewReader(`{"maxFlowsPerExit": 64}`)) + req.Header.Set("Content-Type", "application/json") + resp, err = http.DefaultClient.Do(req) + if err != nil { + t.Fatal(err) + } + if resp.StatusCode != http.StatusOK { + t.Fatalf("PUT /settings status = %d, want 200", resp.StatusCode) + } + resp.Body.Close() + if mc.settings == nil || mc.settings.MaxFlowsPerExit != 64 { + t.Fatalf("settings after PUT = %+v, want MaxFlowsPerExit=64", mc.settings) + } + + // POST /actions reset-metrics + resp, err = http.Post(srv.URL+"/actions", "application/json", strings.NewReader(`{"action":"reset-metrics"}`)) + if err != nil { + t.Fatal(err) + } + resp.Body.Close() + if mc.resets != 1 { + t.Errorf("resets = %d, want 1", mc.resets) + } + + // POST /actions shuffle + resp, _ = http.Post(srv.URL+"/actions", "application/json", strings.NewReader(`{"action":"shuffle"}`)) + resp.Body.Close() + if !mc.shuffled { + t.Error("shuffle not called") + } + + // POST /actions probe-all + resp, _ = http.Post(srv.URL+"/actions", "application/json", strings.NewReader(`{"action":"probe-all"}`)) + resp.Body.Close() + if mc.probed != 1 { + t.Errorf("probed = %d, want 1", mc.probed) + } + + // POST /actions drop with a valid client id + cid := "019fde39-e690-add0-ac88-e354a0d76d6a" + resp, _ = http.Post(srv.URL+"/actions", "application/json", strings.NewReader(`{"action":"drop","clientId":"`+cid+`"}`)) + resp.Body.Close() + if len(mc.dropped) != 1 || mc.dropped[0] != cid { + t.Errorf("dropped = %v, want [%s]", mc.dropped, cid) + } + + // POST /actions drop with missing clientId -> 400 + resp, _ = http.Post(srv.URL+"/actions", "application/json", strings.NewReader(`{"action":"drop"}`)) + if resp.StatusCode != http.StatusBadRequest { + t.Errorf("drop w/o clientId status = %d, want 400", resp.StatusCode) + } + resp.Body.Close() + + // POST /actions unknown action -> 400 + resp, _ = http.Post(srv.URL+"/actions", "application/json", strings.NewReader(`{"action":"bogus"}`)) + if resp.StatusCode != http.StatusBadRequest { + t.Errorf("bogus action status = %d, want 400", resp.StatusCode) + } + resp.Body.Close() + + // GET /metrics returns the snapshot + resp, err = http.Get(srv.URL + "/metrics") + if err != nil { + t.Fatal(err) + } + var m connect.ReliabilityMetricsSnapshot + if err := json.NewDecoder(resp.Body).Decode(&m); err != nil { + t.Fatal(err) + } + resp.Body.Close() + + // GET /exits returns the table + resp, err = http.Get(srv.URL + "/exits") + if err != nil { + t.Fatal(err) + } + var xs []*connect.ExitInfo + if err := json.NewDecoder(resp.Body).Decode(&xs); err != nil { + t.Fatal(err) + } + resp.Body.Close() +} + +func TestControlServerRejectsBadMethod(t *testing.T) { + mc := &fakeMC{} + c, err := newControlServer("127.0.0.1:0", mc) + if err != nil { + t.Fatal(err) + } + srv := httptest.NewServer(c.server.Handler) + defer srv.Close() + + req, _ := http.NewRequest("DELETE", srv.URL+"/settings", nil) + resp, err := http.DefaultClient.Do(req) + if err != nil { + t.Fatal(err) + } + if resp.StatusCode != http.StatusMethodNotAllowed { + t.Errorf("DELETE /settings status = %d, want 405", resp.StatusCode) + } + resp.Body.Close() +} + +// TestControlRejectsNonLoopbackOrigin pins the CSRF guard: a browser +// cross-origin request (which always sends Origin) must be refused on the +// mutating endpoints, while requests without Origin (curl) and with a +// loopback Origin pass. +func TestControlRejectsNonLoopbackOrigin(t *testing.T) { + mc := &fakeMC{} + c, err := newControlServer("127.0.0.1:0", mc) + if err != nil { + t.Fatal(err) + } + srv := httptest.NewServer(c.server.Handler) + defer srv.Close() + + // no Origin -> allowed (curl) + req, _ := http.NewRequest("PUT", srv.URL+"/settings", strings.NewReader(`{"maxFlowsPerExit": 16}`)) + resp, err := http.DefaultClient.Do(req) + if err != nil { + t.Fatal(err) + } + if resp.StatusCode != http.StatusOK { + t.Errorf("PUT without Origin = %d, want 200", resp.StatusCode) + } + resp.Body.Close() + + // loopback Origin -> allowed + req, _ = http.NewRequest("POST", srv.URL+"/actions", strings.NewReader(`{"action":"shuffle"}`)) + req.Header.Set("Origin", "http://127.0.0.1:8080") + resp, err = http.DefaultClient.Do(req) + if err != nil { + t.Fatal(err) + } + if resp.StatusCode != http.StatusOK { + t.Errorf("POST with loopback Origin = %d, want 200", resp.StatusCode) + } + resp.Body.Close() + + // evil cross-origin -> 403 on both mutating endpoints + for _, tc := range []struct { + method, path, body string + }{ + {"PUT", "/settings", `{"maxFlowsPerExit": 32}`}, + {"POST", "/actions", `{"action":"drop","clientId":"019fde39-e690-add0-ac88-e354a0d76d6a"}`}, + } { + req, _ := http.NewRequest(tc.method, srv.URL+tc.path, strings.NewReader(tc.body)) + req.Header.Set("Origin", "https://evil.example") + resp, err := http.DefaultClient.Do(req) + if err != nil { + t.Fatal(err) + } + if resp.StatusCode != http.StatusForbidden { + t.Errorf("%s with evil Origin = %d, want 403", tc.method, resp.StatusCode) + } + resp.Body.Close() + } + + // the evil-origin drop must not have executed + if len(mc.dropped) != 0 { + t.Errorf("drop executed despite non-loopback origin: %v", mc.dropped) + } +} + +// TestControlConcurrentSettingsPut exercises the lost-update race fix: two +// PUTs that set different fields concurrently must both survive. +func TestControlConcurrentSettingsPut(t *testing.T) { + mc := &fakeMC{} + c, err := newControlServer("127.0.0.1:0", mc) + if err != nil { + t.Fatal(err) + } + srv := httptest.NewServer(c.server.Handler) + defer srv.Close() + + done := make(chan struct{}, 2) + go func() { + defer func() { done <- struct{}{} }() + req, _ := http.NewRequest("PUT", srv.URL+"/settings", strings.NewReader(`{"maxFlowsPerExit": 64}`)) + resp, err := http.DefaultClient.Do(req) + if err == nil { + resp.Body.Close() + } + }() + go func() { + defer func() { done <- struct{}{} }() + req, _ := http.NewRequest("PUT", srv.URL+"/settings", strings.NewReader(`{"sendStallTimeoutMs": 5000}`)) + resp, err := http.DefaultClient.Do(req) + if err == nil { + resp.Body.Close() + } + }() + <-done + <-done + + if mc.settings == nil { + t.Fatal("no settings applied") + } + if mc.settings.MaxFlowsPerExit != 64 { + t.Errorf("MaxFlowsPerExit = %d, want 64 (lost update)", mc.settings.MaxFlowsPerExit) + } + if mc.settings.SendStallTimeout != 5*time.Second { + t.Errorf("SendStallTimeout = %v, want 5s (lost update)", mc.settings.SendStallTimeout) + } +} + +// --- helpers --- + +func intPtr(v int) *int { return &v } +func int64Ptr(v int64) *int64 { return &v } +func boolPtr(v bool) *bool { return &v } diff --git a/socks/ur_logo.svg b/socks/ur_logo.svg new file mode 100644 index 0000000..921e5c2 --- /dev/null +++ b/socks/ur_logo.svg @@ -0,0 +1 @@ + \ No newline at end of file