From 5863574a785ffee5bdb4f5d61543e7c2a78079e0 Mon Sep 17 00:00:00 2001 From: Dian Afif Date: Mon, 18 May 2026 13:22:11 +0400 Subject: [PATCH] update --- API_CHANGES.md | 182 +++++ backend/db.go | 19 + backend/handlers.go | 149 ++++ backend/models.go | 47 +- backend/openapi/openapi.json | 2 + backend/routes.go | 4 + backend/settings.go | 2 +- backend/stage_sessions.go | 172 +++++ backend/state.go | 244 ++++++- frontend/public/arture.png | Bin 0 -> 39839 bytes frontend/public/arture_logo.png | Bin 53946 -> 0 bytes frontend/public/logo_white.png | Bin 0 -> 84800 bytes frontend/src/App.vue | 373 +++++++++- frontend/src/components/AdminPanel.vue | 92 ++- frontend/src/components/AppHeader.vue | 6 +- frontend/src/components/LiveModePanel.vue | 254 +++++-- .../src/components/admin/LiveSettingsCard.vue | 110 ++- .../admin/MultiRoundScoreEditor.vue | 405 +++++++---- .../components/admin/PlayersManagementTab.vue | 36 +- .../components/admin/PositionBoardEditor.vue | 249 +++++++ .../src/components/admin/ScoreStageEditor.vue | 419 +++++++---- frontend/src/constants/i18n.js | 44 ++ frontend/src/style.css | 668 ++++++++++++++++-- frontend/src/utils/scoreGroupTheme.js | 50 +- 24 files changed, 3060 insertions(+), 467 deletions(-) create mode 100644 API_CHANGES.md create mode 100644 backend/stage_sessions.go create mode 100644 frontend/public/arture.png delete mode 100644 frontend/public/arture_logo.png create mode 100644 frontend/public/logo_white.png create mode 100644 frontend/src/components/admin/PositionBoardEditor.vue diff --git a/API_CHANGES.md b/API_CHANGES.md new file mode 100644 index 0000000..f20b89c --- /dev/null +++ b/API_CHANGES.md @@ -0,0 +1,182 @@ +# API Changes (Not Yet Reflected in `backend/openapi/openapi.json`) + +This document lists additive API changes currently implemented in the Go backend. + +## Summary + +Existing endpoints remain compatible. + +Added capabilities: + +1. Position board persistence for live/admin ordering. +2. Stage session control (`start`/`end`) for event flow. +3. Stage history retrieval. +4. New state fields (`positionBoards`, `current_stage`, `last_stage`). + +## 1) Position Board Endpoint + +- Method: `PUT` +- Path: `/api/admin/positions/:board` +- Auth: admin bearer token (`Authorization: Bearer `) + +### Supported `:board` values + +- `preliminary` +- `final` +- `prelim_tiebreak` +- `final_tiebreak` + +### Request body + +```json +{ + "slots": [ + { "playerId": 12, "groupKey": "A", "position": 1 }, + { "playerId": 15, "groupKey": "A", "position": 2 }, + { "playerId": 20, "groupKey": "B", "position": 1 } + ] +} +``` + +Fields: + +- `playerId` (integer, required) +- `groupKey` (string, required) +- `position` (integer > 0, required) + +Notes: + +- The request replaces all saved slots for the target board. +- For `preliminary`, `players.group_code` is synchronized from `groupKey`. +- Special value `UNASSIGNED` maps to empty player group. + +### Response + +- `200 OK` with full updated admin state payload. + +## 2) Stage Session Control Endpoints + +### Start stage + +- Method: `POST` +- Path: `/api/admin/stage/start` +- Auth: admin bearer token + +Request body: + +```json +{ + "phase": "preliminary", + "group": "A", + "round": 2 +} +``` + +Rules: + +- `phase` must be one of: + - `preliminary` + - `prelim_tiebreak` + - `final` + - `final_tiebreak` +- `group` validation depends on phase: + - `preliminary`: group code string (or `UNASSIGNED`) + - `final`: `"1"` or `"2"` + - tie-break phases: positive numeric string +- `round` normalization: + - `preliminary`: `1..3` + - `final`: `1..2` + - tie-break phases: always `1` +- If another stage is active (started, not ended), API returns `409`. + +Response: + +- `200 OK` with full updated admin state payload. + +### End stage + +- Method: `POST` +- Path: `/api/admin/stage/end` +- Auth: admin bearer token + +Rules: + +- Ends the currently active stage by setting `ended_at`. +- If no active stage exists, API returns `400`. + +Response: + +- `200 OK` with full updated admin state payload. + +## 3) Stage History Endpoint + +- Method: `GET` +- Path: `/api/admin/stage/history` +- Auth: admin bearer token + +Response: + +```json +{ + "items": [ + { + "id": 1, + "phase": "preliminary", + "group": "A", + "round": 2, + "startedAt": "2026-04-30T08:27:13Z", + "endedAt": "2026-04-30T08:28:01Z" + } + ] +} +``` + +## 4) New State Fields + +Both endpoints now include these fields: + +- `GET /api/state` +- `GET /api/admin/state` + +```json +{ + "positionBoards": { + "preliminary": { + "12": { "groupKey": "A", "position": 1 } + }, + "final": { + "12": { "groupKey": "1", "position": 3 } + }, + "prelim_tiebreak": {}, + "final_tiebreak": {} + }, + "current_stage": { + "id": 7, + "phase": "preliminary", + "group": "A", + "round": 2, + "startedAt": "2026-04-30T09:00:00Z" + }, + "last_stage": { + "id": 6, + "phase": "final", + "group": "1", + "round": 1, + "startedAt": "2026-04-30T08:45:00Z", + "endedAt": "2026-04-30T08:55:00Z" + } +} +``` + +Notes: + +- `positionBoards` keys are player IDs as strings. +- `current_stage` is `null` when no stage is active. +- `last_stage` is `null` when no stage session has ever started. +- `last_stage` is the most recently started session (ended or still active). + +## Compatibility Impact + +- Additive only; existing consumers remain functional. +- Consumers can ignore unknown fields safely. +- Consumers needing control/monitoring can use new stage endpoints and fields. diff --git a/backend/db.go b/backend/db.go index 563c6c3..9fbb872 100644 --- a/backend/db.go +++ b/backend/db.go @@ -59,12 +59,31 @@ CREATE TABLE IF NOT EXISTS score_attachments ( FOREIGN KEY(player_id) REFERENCES players(id) ON DELETE CASCADE ); +CREATE TABLE IF NOT EXISTS player_positions ( + board TEXT NOT NULL, + player_id INTEGER NOT NULL, + group_key TEXT NOT NULL DEFAULT '', + position INTEGER NOT NULL DEFAULT 1, + updated_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP, + PRIMARY KEY(board, player_id), + FOREIGN KEY(player_id) REFERENCES players(id) ON DELETE CASCADE +); + CREATE TABLE IF NOT EXISTS app_settings ( key TEXT PRIMARY KEY, value TEXT NOT NULL DEFAULT '', updated_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ); +CREATE TABLE IF NOT EXISTS stage_sessions ( + id INTEGER PRIMARY KEY AUTOINCREMENT, + phase TEXT NOT NULL, + group_key TEXT NOT NULL DEFAULT '', + round INTEGER NOT NULL DEFAULT 1, + started_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP, + ended_at DATETIME +); + INSERT OR IGNORE INTO app_settings(key, value) VALUES ('view_proof_in_view', '0'), ('live_active_view', 'group_live'), diff --git a/backend/handlers.go b/backend/handlers.go index 443808c..ac0151b 100644 --- a/backend/handlers.go +++ b/backend/handlers.go @@ -78,6 +78,84 @@ func (a *App) handleUpdateAdminSettings(c echo.Context) error { return c.JSON(http.StatusOK, state) } +func (a *App) handleStartCurrentStage(c echo.Context) error { + var req StageControlStartRequest + if err := c.Bind(&req); err != nil { + return writeError(c, http.StatusBadRequest, "invalid request body") + } + + phase, ok := normalizeStagePhase(req.Phase) + if !ok { + return writeError(c, http.StatusBadRequest, "invalid phase") + } + groupKey, ok := normalizeStageGroup(phase, req.GroupKey) + if !ok { + return writeError(c, http.StatusBadRequest, "invalid group for selected phase") + } + round := normalizeStageRound(phase, req.Round) + + current, err := a.readCurrentStage() + if err != nil { + return writeError(c, http.StatusInternalServerError, err.Error()) + } + if current != nil { + return writeError(c, http.StatusConflict, "there is already an active stage. end it first") + } + + _, err = a.db.Exec(` +INSERT INTO stage_sessions(phase, group_key, round, started_at) +VALUES(?, ?, ?, CURRENT_TIMESTAMP) +`, phase, groupKey, round) + if err != nil { + return writeError(c, http.StatusInternalServerError, fmt.Sprintf("start stage: %v", err)) + } + + a.events.Broadcast() + + state, err := a.readState(true) + if err != nil { + return writeError(c, http.StatusInternalServerError, err.Error()) + } + return c.JSON(http.StatusOK, state) +} + +func (a *App) handleEndCurrentStage(c echo.Context) error { + current, err := a.readCurrentStage() + if err != nil { + return writeError(c, http.StatusInternalServerError, err.Error()) + } + if current == nil { + return writeError(c, http.StatusBadRequest, "no active stage to end") + } + + _, err = a.db.Exec(` +UPDATE stage_sessions +SET ended_at = CURRENT_TIMESTAMP +WHERE id = ? AND ended_at IS NULL +`, current.ID) + if err != nil { + return writeError(c, http.StatusInternalServerError, fmt.Sprintf("end stage: %v", err)) + } + + a.events.Broadcast() + + state, err := a.readState(true) + if err != nil { + return writeError(c, http.StatusInternalServerError, err.Error()) + } + return c.JSON(http.StatusOK, state) +} + +func (a *App) handleGetStageHistory(c echo.Context) error { + items, err := a.readStageHistory() + if err != nil { + return writeError(c, http.StatusInternalServerError, err.Error()) + } + return c.JSON(http.StatusOK, map[string]any{ + "items": items, + }) +} + func (a *App) handleCreatePlayer(c echo.Context) error { var req PlayerCreateRequest if err := c.Bind(&req); err != nil { @@ -295,6 +373,77 @@ func (a *App) handleAutoGroupPlayers(c echo.Context) error { return c.JSON(http.StatusOK, state) } +func (a *App) handleUpdatePositionBoard(c echo.Context) error { + board, ok := normalizePositionBoard(c.Param("board")) + if !ok { + return writeError(c, http.StatusBadRequest, "invalid position board") + } + + var req PositionBoardUpdateRequest + if err := c.Bind(&req); err != nil { + return writeError(c, http.StatusBadRequest, "invalid request body") + } + + seen := map[int]bool{} + for _, slot := range req.Slots { + if slot.PlayerID <= 0 { + return writeError(c, http.StatusBadRequest, "invalid player id") + } + if seen[slot.PlayerID] { + return writeError(c, http.StatusBadRequest, "duplicate player id in slots") + } + seen[slot.PlayerID] = true + if strings.TrimSpace(slot.GroupKey) == "" { + return writeError(c, http.StatusBadRequest, "groupKey is required") + } + if slot.Position <= 0 { + return writeError(c, http.StatusBadRequest, "position must be positive") + } + } + + tx, err := a.db.Begin() + if err != nil { + return writeError(c, http.StatusInternalServerError, "failed to start position transaction") + } + defer tx.Rollback() + + if _, err := tx.Exec(`DELETE FROM player_positions WHERE board = ?`, board); err != nil { + return writeError(c, http.StatusInternalServerError, fmt.Sprintf("clear board positions: %v", err)) + } + + for _, slot := range req.Slots { + groupKey := normalizePositionGroupKey(board, slot.GroupKey, "") + if _, err := tx.Exec(` +INSERT INTO player_positions(board, player_id, group_key, position, updated_at) +VALUES(?, ?, ?, ?, CURRENT_TIMESTAMP) +`, board, slot.PlayerID, groupKey, slot.Position); err != nil { + return writeError(c, http.StatusInternalServerError, fmt.Sprintf("save board position: %v", err)) + } + + if board == positionBoardPreliminary { + groupCode := strings.TrimSpace(groupKey) + if strings.EqualFold(groupCode, positionBoardUnassigned) { + groupCode = "" + } + if _, err := tx.Exec(`UPDATE players SET group_code = ?, updated_at = CURRENT_TIMESTAMP WHERE id = ?`, groupCode, slot.PlayerID); err != nil { + return writeError(c, http.StatusInternalServerError, fmt.Sprintf("update player group from board: %v", err)) + } + } + } + + if err := tx.Commit(); err != nil { + return writeError(c, http.StatusInternalServerError, "failed to commit positions") + } + + a.events.Broadcast() + + state, err := a.readState(true) + if err != nil { + return writeError(c, http.StatusInternalServerError, err.Error()) + } + return c.JSON(http.StatusOK, state) +} + func (a *App) handleUpdateScore(c echo.Context) error { stage, err := validateStage(c.Param("stage")) if err != nil { diff --git a/backend/models.go b/backend/models.go index 5c02683..fdf3405 100644 --- a/backend/models.go +++ b/backend/models.go @@ -84,13 +84,30 @@ type FinalGroups struct { } type StateResponse struct { - Competition CompetitionMeta `json:"competition"` - Players []Player `json:"players"` - Scores map[string]map[string]int `json:"scores"` - ScoreProofs map[string]map[string]string `json:"scoreProofs,omitempty"` - Settings AppSettings `json:"settings"` - Derived DerivedState `json:"derived"` - ServerTime string `json:"serverTime"` + Competition CompetitionMeta `json:"competition"` + Players []Player `json:"players"` + Scores map[string]map[string]int `json:"scores"` + ScoreProofs map[string]map[string]string `json:"scoreProofs,omitempty"` + PositionBoards map[string]map[string]PositionSlot `json:"positionBoards"` + Settings AppSettings `json:"settings"` + Derived DerivedState `json:"derived"` + CurrentStage *StageSessionState `json:"current_stage"` + LastStage *StageSessionState `json:"last_stage"` + ServerTime string `json:"serverTime"` +} + +type StageSessionState struct { + ID int `json:"id"` + Phase string `json:"phase"` + GroupKey string `json:"group"` + Round int `json:"round"` + StartedAt string `json:"startedAt"` + EndedAt string `json:"endedAt,omitempty"` +} + +type PositionSlot struct { + GroupKey string `json:"groupKey"` + Position int `json:"position"` } type AppSettings struct { @@ -170,6 +187,16 @@ type AutoGroupPlayersRequest struct { Groups []string `json:"groups"` } +type PositionBoardUpdateRequest struct { + Slots []PositionBoardSlotInput `json:"slots"` +} + +type PositionBoardSlotInput struct { + PlayerID int `json:"playerId"` + GroupKey string `json:"groupKey"` + Position int `json:"position"` +} + type ScoreAdviceResponse struct { Stage string `json:"stage"` PlayerID int `json:"playerId"` @@ -177,3 +204,9 @@ type ScoreAdviceResponse struct { Reason string `json:"reason"` GeneratedAt string `json:"generatedAt"` } + +type StageControlStartRequest struct { + Phase string `json:"phase"` + GroupKey string `json:"group"` + Round int `json:"round"` +} diff --git a/backend/openapi/openapi.json b/backend/openapi/openapi.json index 2b224a5..1942fdd 100644 --- a/backend/openapi/openapi.json +++ b/backend/openapi/openapi.json @@ -1080,6 +1080,7 @@ "prelim_overall", "final_groups", "final_tie", + "final_overall", "podium" ] }, @@ -1149,6 +1150,7 @@ "prelim_overall", "final_groups", "final_tie", + "final_overall", "podium" ] }, diff --git a/backend/routes.go b/backend/routes.go index 22d77de..5b95111 100644 --- a/backend/routes.go +++ b/backend/routes.go @@ -22,9 +22,13 @@ func registerAPIRoutes(e *echo.Echo, app *App) { api.POST("/admin/login", app.handleAdminLogin) api.POST("/admin/logout", app.handleAdminLogout, app.adminOnly) api.GET("/admin/state", app.handleGetState, app.adminOnly) + api.GET("/admin/stage/history", app.handleGetStageHistory, app.adminOnly) api.PUT("/admin/settings", app.handleUpdateAdminSettings, app.adminOnly) + api.POST("/admin/stage/start", app.handleStartCurrentStage, app.adminOnly) + api.POST("/admin/stage/end", app.handleEndCurrentStage, app.adminOnly) api.POST("/admin/players", app.handleCreatePlayer, app.adminOnly) api.POST("/admin/players/auto-group", app.handleAutoGroupPlayers, app.adminOnly) + api.PUT("/admin/positions/:board", app.handleUpdatePositionBoard, app.adminOnly) api.PUT("/admin/players/:id", app.handleUpdatePlayer, app.adminOnly) api.DELETE("/admin/players/:id", app.handleDeletePlayer, app.adminOnly) api.PUT("/admin/scores/:stage/:id", app.handleUpdateScore, app.adminOnly) diff --git a/backend/settings.go b/backend/settings.go index b7f69ce..60c08a6 100644 --- a/backend/settings.go +++ b/backend/settings.go @@ -355,7 +355,7 @@ func normalizeRotationPlayerCountInt(value int) int { func normalizeLiveActiveView(value string, fallback string) string { switch strings.TrimSpace(strings.ToLower(value)) { - case "group_live", "prelim_tie", "prelim_overall", "final_groups", "final_tie", "podium": + case "group_live", "prelim_tie", "prelim_overall", "final_groups", "final_tie", "final_overall", "podium": return strings.TrimSpace(strings.ToLower(value)) default: if strings.TrimSpace(strings.ToLower(fallback)) != "" { diff --git a/backend/stage_sessions.go b/backend/stage_sessions.go new file mode 100644 index 0000000..51a9445 --- /dev/null +++ b/backend/stage_sessions.go @@ -0,0 +1,172 @@ +package main + +import ( + "database/sql" + "fmt" + "strconv" + "strings" + "time" +) + +const ( + stagePhasePreliminary = "preliminary" + stagePhasePrelimTie = "prelim_tiebreak" + stagePhaseFinal = "final" + stagePhaseFinalTie = "final_tiebreak" +) + +var allowedStagePhases = map[string]bool{ + stagePhasePreliminary: true, + stagePhasePrelimTie: true, + stagePhaseFinal: true, + stagePhaseFinalTie: true, +} + +func normalizeStagePhase(raw string) (string, bool) { + phase := strings.ToLower(strings.TrimSpace(raw)) + if !allowedStagePhases[phase] { + return "", false + } + return phase, true +} + +func normalizeStageGroup(phase string, raw string) (string, bool) { + group := strings.TrimSpace(raw) + switch phase { + case stagePhasePreliminary: + if strings.EqualFold(group, positionBoardUnassigned) { + return positionBoardUnassigned, true + } + group = normalizePreliminaryGroupKey(group) + if group == "" { + return "", false + } + return group, true + case stagePhaseFinal: + parsed, err := strconv.Atoi(group) + if err != nil || (parsed != 1 && parsed != 2) { + return "", false + } + return strconv.Itoa(parsed), true + case stagePhasePrelimTie, stagePhaseFinalTie: + parsed, err := strconv.Atoi(group) + if err != nil || parsed <= 0 { + return "", false + } + return strconv.Itoa(parsed), true + default: + return "", false + } +} + +func normalizeStageRound(phase string, round int) int { + switch phase { + case stagePhasePreliminary: + if round < 1 { + return 1 + } + if round > 3 { + return 3 + } + return round + case stagePhaseFinal: + if round < 1 { + return 1 + } + if round > 2 { + return 2 + } + return round + default: + return 1 + } +} + +func normalizeTimestamp(raw string) string { + trimmed := strings.TrimSpace(raw) + if trimmed == "" { + return "" + } + if parsed, err := time.Parse(time.RFC3339Nano, trimmed); err == nil { + return parsed.UTC().Format(time.RFC3339) + } + if parsed, err := time.Parse("2006-01-02 15:04:05", trimmed); err == nil { + return parsed.UTC().Format(time.RFC3339) + } + return trimmed +} + +func scanStageSession(scanner interface{ Scan(dest ...any) error }) (*StageSessionState, error) { + var item StageSessionState + var ended sql.NullString + if err := scanner.Scan(&item.ID, &item.Phase, &item.GroupKey, &item.Round, &item.StartedAt, &ended); err != nil { + return nil, err + } + item.Phase = strings.ToLower(strings.TrimSpace(item.Phase)) + item.GroupKey = strings.TrimSpace(item.GroupKey) + item.StartedAt = normalizeTimestamp(item.StartedAt) + if ended.Valid { + item.EndedAt = normalizeTimestamp(ended.String) + } + return &item, nil +} + +func (a *App) readCurrentStage() (*StageSessionState, error) { + row := a.db.QueryRow(` +SELECT id, phase, group_key, round, started_at, ended_at +FROM stage_sessions +WHERE ended_at IS NULL +ORDER BY started_at DESC, id DESC +LIMIT 1 +`) + item, err := scanStageSession(row) + if err != nil { + if err == sql.ErrNoRows { + return nil, nil + } + return nil, fmt.Errorf("read current stage: %w", err) + } + return item, nil +} + +func (a *App) readLastStage() (*StageSessionState, error) { + row := a.db.QueryRow(` +SELECT id, phase, group_key, round, started_at, ended_at +FROM stage_sessions +ORDER BY started_at DESC, id DESC +LIMIT 1 +`) + item, err := scanStageSession(row) + if err != nil { + if err == sql.ErrNoRows { + return nil, nil + } + return nil, fmt.Errorf("read last stage: %w", err) + } + return item, nil +} + +func (a *App) readStageHistory() ([]StageSessionState, error) { + rows, err := a.db.Query(` +SELECT id, phase, group_key, round, started_at, ended_at +FROM stage_sessions +ORDER BY started_at DESC, id DESC +`) + if err != nil { + return nil, fmt.Errorf("query stage history: %w", err) + } + defer rows.Close() + + items := make([]StageSessionState, 0) + for rows.Next() { + item, scanErr := scanStageSession(rows) + if scanErr != nil { + return nil, fmt.Errorf("scan stage history: %w", scanErr) + } + items = append(items, *item) + } + if err := rows.Err(); err != nil { + return nil, fmt.Errorf("iterate stage history: %w", err) + } + return items, nil +} diff --git a/backend/state.go b/backend/state.go index 61dd0c7..bcf946c 100644 --- a/backend/state.go +++ b/backend/state.go @@ -8,6 +8,21 @@ import ( "time" ) +const ( + positionBoardPreliminary = "preliminary" + positionBoardFinal = "final" + positionBoardPrelimTie = "prelim_tiebreak" + positionBoardFinalTie = "final_tiebreak" + positionBoardUnassigned = "UNASSIGNED" +) + +var allowedPositionBoards = map[string]bool{ + positionBoardPreliminary: true, + positionBoardFinal: true, + positionBoardPrelimTie: true, + positionBoardFinalTie: true, +} + func (a *App) readState(includeAllProofs bool) (StateResponse, error) { players, err := a.readPlayers() if err != nil { @@ -38,17 +53,32 @@ func (a *App) readState(includeAllProofs bool) (StateResponse, error) { } derived := computeDerived(players, scoreMap) + positionBoards, err := a.readPositionBoards(players, derived) + if err != nil { + return StateResponse{}, err + } + currentStage, err := a.readCurrentStage() + if err != nil { + return StateResponse{}, err + } + lastStage, err := a.readLastStage() + if err != nil { + return StateResponse{}, err + } response := StateResponse{ Competition: CompetitionMeta{ TitleAr: "بطولة دويتوايلر للرماية", TitleEn: "Datwyler Shooting Event", }, - Players: players, - Scores: scoreMapToJSON(scoreMap), - Settings: settings, - Derived: derived, - ServerTime: time.Now().UTC().Format(time.RFC3339), + Players: players, + Scores: scoreMapToJSON(scoreMap), + PositionBoards: positionBoardMapToJSON(positionBoards), + Settings: settings, + Derived: derived, + CurrentStage: currentStage, + LastStage: lastStage, + ServerTime: time.Now().UTC().Format(time.RFC3339), } if includeScoreProofs { response.ScoreProofs = scoreProofMapToJSON(scoreProofs) @@ -133,6 +163,210 @@ func scoreProofMapToJSON(proofMap map[string]map[int]string) map[string]map[stri return out } +func positionBoardMapToJSON(positionMap map[string]map[int]PositionSlot) map[string]map[string]PositionSlot { + out := map[string]map[string]PositionSlot{} + for board := range allowedPositionBoards { + out[board] = map[string]PositionSlot{} + } + for board, boardMap := range positionMap { + if _, ok := out[board]; !ok { + out[board] = map[string]PositionSlot{} + } + for playerID, slot := range boardMap { + out[board][strconv.Itoa(playerID)] = slot + } + } + return out +} + +func (a *App) readPositionBoards(players []Player, derived DerivedState) (map[string]map[int]PositionSlot, error) { + defaults := defaultPositionBoards(players, derived) + merged := map[string]map[int]PositionSlot{} + for board, boardMap := range defaults { + merged[board] = map[int]PositionSlot{} + for playerID, slot := range boardMap { + merged[board][playerID] = slot + } + } + + rows, err := a.db.Query(`SELECT board, player_id, group_key, position FROM player_positions`) + if err != nil { + return nil, fmt.Errorf("query player positions: %w", err) + } + defer rows.Close() + + for rows.Next() { + var boardRaw string + var playerID int + var groupKey string + var position int + if err := rows.Scan(&boardRaw, &playerID, &groupKey, &position); err != nil { + return nil, fmt.Errorf("scan player position: %w", err) + } + board, ok := normalizePositionBoard(boardRaw) + if !ok { + continue + } + boardMap := merged[board] + if boardMap == nil { + continue + } + defaultSlot, exists := boardMap[playerID] + if !exists { + continue + } + pos := normalizePositionValue(position, defaultSlot.Position) + group := normalizePositionGroupKey(board, groupKey, defaultSlot.GroupKey) + boardMap[playerID] = PositionSlot{ + GroupKey: group, + Position: pos, + } + } + if err := rows.Err(); err != nil { + return nil, fmt.Errorf("iterate player positions: %w", err) + } + + return merged, nil +} + +func defaultPositionBoards(players []Player, derived DerivedState) map[string]map[int]PositionSlot { + out := map[string]map[int]PositionSlot{ + positionBoardPreliminary: {}, + positionBoardFinal: {}, + positionBoardPrelimTie: {}, + positionBoardFinalTie: {}, + } + + preRows := make([]Player, 0, len(players)) + preRows = append(preRows, players...) + sort.SliceStable(preRows, func(i, j int) bool { + ga := normalizePreliminaryGroupKey(preRows[i].GroupCode) + gb := normalizePreliminaryGroupKey(preRows[j].GroupCode) + if ga != gb { + return ga < gb + } + return preRows[i].ID < preRows[j].ID + }) + preGroupCounts := map[string]int{} + for _, player := range preRows { + group := normalizePreliminaryGroupKey(player.GroupCode) + preGroupCounts[group]++ + out[positionBoardPreliminary][player.ID] = PositionSlot{ + GroupKey: group, + Position: preGroupCounts[group], + } + } + + finalGroupCounts := map[string]int{} + for _, row := range derived.FinalGroups.Group1 { + group := "1" + finalGroupCounts[group]++ + out[positionBoardFinal][row.PlayerID] = PositionSlot{GroupKey: group, Position: finalGroupCounts[group]} + } + for _, row := range derived.FinalGroups.Group2 { + group := "2" + finalGroupCounts[group]++ + out[positionBoardFinal][row.PlayerID] = PositionSlot{GroupKey: group, Position: finalGroupCounts[group]} + } + + preRowsByID := map[int]RankingRow{} + for _, row := range derived.PreliminaryRanking.Rows { + preRowsByID[row.PlayerID] = row + } + preTieRows := make([]RankingRow, 0, len(derived.PreliminaryRanking.TieBreak.PlayerIDs)) + for _, id := range derived.PreliminaryRanking.TieBreak.PlayerIDs { + row, ok := preRowsByID[id] + if !ok { + continue + } + preTieRows = append(preTieRows, row) + } + sort.SliceStable(preTieRows, func(i, j int) bool { + if preTieRows[i].TieBreak != preTieRows[j].TieBreak { + return preTieRows[i].TieBreak > preTieRows[j].TieBreak + } + if preTieRows[i].Score != preTieRows[j].Score { + return preTieRows[i].Score > preTieRows[j].Score + } + return preTieRows[i].PlayerID < preTieRows[j].PlayerID + }) + for idx, row := range preTieRows { + groupKey := strconv.Itoa((idx / 6) + 1) + position := (idx % 6) + 1 + out[positionBoardPrelimTie][row.PlayerID] = PositionSlot{GroupKey: groupKey, Position: position} + } + + finalRowsByID := map[int]RankingRow{} + for _, row := range derived.FinalRanking.Rows { + finalRowsByID[row.PlayerID] = row + } + finalTieRows := make([]RankingRow, 0, len(derived.FinalRanking.TieBreak.PlayerIDs)) + for _, id := range derived.FinalRanking.TieBreak.PlayerIDs { + row, ok := finalRowsByID[id] + if !ok { + continue + } + finalTieRows = append(finalTieRows, row) + } + sort.SliceStable(finalTieRows, func(i, j int) bool { + if finalTieRows[i].TieBreak != finalTieRows[j].TieBreak { + return finalTieRows[i].TieBreak > finalTieRows[j].TieBreak + } + if finalTieRows[i].Score != finalTieRows[j].Score { + return finalTieRows[i].Score > finalTieRows[j].Score + } + return finalTieRows[i].PlayerID < finalTieRows[j].PlayerID + }) + for idx, row := range finalTieRows { + groupKey := strconv.Itoa((idx / 6) + 1) + position := (idx % 6) + 1 + out[positionBoardFinalTie][row.PlayerID] = PositionSlot{GroupKey: groupKey, Position: position} + } + + return out +} + +func normalizePositionBoard(board string) (string, bool) { + normalized := strings.ToLower(strings.TrimSpace(board)) + if !allowedPositionBoards[normalized] { + return "", false + } + return normalized, true +} + +func normalizePreliminaryGroupKey(groupCode string) string { + normalized := strings.ToUpper(strings.TrimSpace(groupCode)) + if normalized == "" { + return positionBoardUnassigned + } + return normalized +} + +func normalizePositionGroupKey(board, groupKey, fallback string) string { + if board == positionBoardPreliminary { + normalized := normalizePreliminaryGroupKey(groupKey) + if normalized == "" { + return fallback + } + return normalized + } + normalized := strings.TrimSpace(groupKey) + if normalized == "" { + return fallback + } + return normalized +} + +func normalizePositionValue(position int, fallback int) int { + if position > 0 { + return position + } + if fallback > 0 { + return fallback + } + return 1 +} + func (a *App) ensureScoreRows(players []Player) error { if len(players) == 0 { return nil diff --git a/frontend/public/arture.png b/frontend/public/arture.png new file mode 100644 index 0000000000000000000000000000000000000000..54ec553ca80b8d099e9b42fed93c79e78b0d4f93 GIT binary patch literal 39839 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 Y`TK=^d&wG{?Mn?VoBUaL$^QQT0adkh%>V!Z literal 0 HcmV?d00001 diff --git a/frontend/public/arture_logo.png b/frontend/public/arture_logo.png deleted file mode 100644 index 98a6c0ed0847636eb98b98a874365604b0874539..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 53946 zcmbS!c|6qn_x~G}N+n53#YLA=pu7PM%fJ~9Ia<7 zgT}3WZIo?!a}i3pj4A~t8&Kca3kMXuw_yjlc@ctDZBEI}{i=PchFnS)Xw+~5Gx{uuK8?8XzsA%iOSiQd~5=%w@6_0)2&<_42Ix}UXM zX&m2o4E-kgW2q1P`(c5w3pVt|%??uGp?c$E#6O30$~ z{8Dpzg*CRi!$?Fkb-J31fVY$BnIF)t>F&Ku)1{3d_+ldrR`gztbt|IqIObc{MFnf@ z*r2ASR;kh7e8F~Fmrv7mf=O5pg2WjRyC<9GPgN6mym)JvX&ivHtU;s3vJ&<5sCeSF zvM%-$!TX8vt@E@loknw!S5wrE)#CyJtUap=ADaAqv241UTJ1JnwDPZcg?m0YbaD1_ zrXU4={q0T2z(loL%f++;3N7^>x)ZTG`7OoEG>^YK!;&O4pKL-~`>xdIXFq*^ftn@% zv#;9-CTC#=ztpD>*+hFAe=E`XJWY<^iP|z-UoK-3Y4_AxK0AQwHTb3DYIptIIh*9_ z$uFPBNZ&uO!1Tzs5}htMrn<~gFnMA3QYG)%*pSEPo2&jyTvVO-e(9=sVwiZUd`1SY3#}{7qv~|x#ylYz-l?op;^z?k)D+!$)9#NF( zS&MA2ZZzT6(E6?m!}m01-tt)XyMwSui4}y!61$9=!ee)5lF8(ziQFCs{iC5v1GdtV z%fk?oO(KRf?yNhRY!u3T%dw|DK(!QDxL9%)L2#opuil&!x6t%&1Faj0{B~vf4l>#5 z1-m%8xvB;&i&^pmf}BnH_}RoHl&!eppKm00v25zG1{>khF{~w6?9NW2RcHB7rh1f@ zd@Y;?_wrakOHsAJf5V=0qs_7i{<-nqyRg`Vm&7<4t>bj_`|3znEEXFO!{=N%dAIDG z`L*UpjjIuQdJQE~>G47=R{zU}ijL{wSH5NJpG3dIuEL@*-j;gli_3*y^qN9q(e-lu zb?Uo4=VRo%7l z8+B$;(NeZB#_UP0hj8gw@40&EzJmkBJrM$}XM!^21o_UE>&fO>K2PN5o6$dlP}p7h zxUkBqQvCJ&66OipW5?eonzK3{Hd2{|;Ry`cB(w_>B__}#P?29ISC zu-LpjS|z!eg^88V)XB0=_RihHY10EK-_lAi^1FYY@2f%=fKA>F=w+D5=cmq?7M+BK zj-R>qTdQzUe)g$<~ee8`ju-6N%QC2^i_m8&X>_zKB%mP- z>62|l9ao?e*zn@t=`@S!#C6mwZFA^ z5h(wXzsOBJMoobezYSryL38ad=081Ovg#4>0}?ewtv1W7&mie!YqO3mu;tfq=ik|C z2NgL8>lf2?zcqY48@o;;^qf-fN-Q>`{_X{w?TKRTH9+Z)hVp->6m8arZdsA`?FYu@ zeDv#^9YUW;Ci`R`4anMjrdVecQ1Nak`gba2#=SWRtiwlK6tlZ%f`n2+fj znyOYC^t~T|Pb4bGn+PwV6F7VdvFfiIG=)=X?#=vp=xgNWiGI!g9>n{XFDgj9v0j9L zf^B-HP-lY;xeh7g!_8qf$FF~>>J<2SSH6SA_-5QNdf^~N|32D^UT-GE-aPJPes7Vh z&{{Yb*?6CzK(a@56bUNF&J5|yxM-}Gp7CWJ|Ch&0+uF5ffEE4v9iYSA34HNi*yl5j z2?y@Csk?Aj4(?!29?t8op0QTo7_s^N9~H94Pu2 z?pYAY5_uwFEj{C8{W)MwCE00BrFoTk?8!`i41YCpHeR5JB<7HXjUK|_2`n09ekb$j z!~DUFwOFj({O=e9(Lp$uWOt~kDJnuE+O7F$&#~W^Eg6Ft0?c8gY7(Z2R4z4Q*1e}^j%ME2nARM9us!^YnQTOUFwC#6=9wg?+i z4gh*Ood#A*1Xhca!z>lC*kzIOG-Uyr3Mk-TsyE-JT^Ywun9zIjH0=aY8A&X}BfWnJ zR07jEt7?dj3KhC~>9p#A-hhQY7bs-1fr%V}B3FffT}^JzTeU}^*~iUs%337VyG5-% zRtMZRS227Y7TXi1*6h}3-L%?5P0hjcJLq0`9@L8)q(uy-@2Kjyj_O$v*%NS5t&ac$rq>S>G4X0v-we**h}_vI^p|+<$b@~^a#QJaMYvS<$b=@C92G~&l4Ow zXva%Guf4DhQ-pYdP}@84U0*O4+6ax>xF*a>;CQ<{j+v>%;Y%%bXl3`41H|=Q6>b<} zI%{|=;&e)n7X<-u5y>5b9)1D3lSAJ7;Wb(_9+Ac$0IsT5_shl$gdg&f=tqJSPEV29i+D4dqz*t5_w>+>M&L&}znBYs= znRidFP?EcRfSkQta)032yu*(@T87iJev&1J!*)&NGE4$Pu-NNWIbO7&PlUxfYx5e; zlF1(y$+08StQ10IZ3=PLY4Z!W7fUIAS_E`-`YFG$K7uP2^2}rR7j;zc{Y(cL{wYs} zk1x}7mzp)tcHCdIAVnJK=ugj+wY%n_E5{v=CzEe>EJAli{8>uas;76pKu+{Te3rF{ zNo|)Qb=*-eq5}MI){0;B^xotZ@$s zyfQ&v)!JYa>WMoOP%aWhCi}g8+E2UbemWt3Jr?`oJLT&MngKe6u9mWl!FUUwnIj>k_V7j}J3xuUAtzC@s#8(B96^S;@??1YV{Sd=-0|(iqU=b!IkMkg^AX?b zTKTk}vXcd|+>d75PkZWqQgx3#78@-0+g;dBV=DbV@z~{Iclk1^netTcO;rxxclHV> zRo@gtmS$_TW~>9%xXDvZV92FVwkMj6M<)IPtp7Y0w6GeJ$wG9PSk*tql-6e`P{jOQX{|*Z5uNOgw-GazCjM-*EL}U4H#xe}*3yu-745K#8 z0Nn-DF|hjm1&83oHlTM#F1=wMqnqfL>($ykdEi%RjGk?;W@#ckq}XeL#kOXnGtiS& zO*OlH^dSPu!zKtNQ7fm2f8n<&|A)0ti_lW#;}D^v=5{#Qw%J~Qgfd5-*^wBlccxI< zboxvzf76j6r{t?*T3&1>eV}`l<5tsu#u|@E5VZs85OSw{fHeChGjps zB=*4zb1nm8x*F((ok0l&#SOa_gWq0~=eL2hM6c$%E3HlXdtwS@Y)_eO&QmM(@5d;U zUaP6O90Td!PTO0a4Vw7dht{)u@&9cOiNXq!`vS8d1mb-Efpy_nX#@;+RzF!RysF*6 zQ1bS{V%;)?SFia96J1Ih-QbJY%KKvPN|&ZxtA;u23iG92+e;FT!{~)+aw#hG$7FJr zqhL0@d-%53-aDzlAz!Yo?68G2qslG5eO4x@C>iTfYwd;YN~Q~;q+rJJIfpG<&*+18 zd*y0(_n`US%{>?RtADeQQEp};x$|^C#*pLzva7Tf4&QmX_eBhFHt17P|9Qc8WVdU_ zA*bbn%=)g7fS5uV7fW)*hQ247k_1zMm=FJrp}8kSQd_yuZI|yM^9x^`yh3{p$&%9G zXjbIzB4FS;qhVUF1|z`((Q$j z_h#&E*$uM$Bv-3eRn#x|NOUT$Sf{_|AWw#^ zxjefzbzF}g8a!4^E#Po-E8~ef$nB(Dxeb?R?a@W8vSh$O!#ln7C99ypt>6O%(vG@T zny-akG35}MJnnndv)EBBs+~afw8{P(q~VehGOcz+(KPXZOD*b24ghrK#TCf{Ey2QVTQ40Glu zBXoI|jQpdl(ceOu&2D;S%rGuxwU}P6t>6z%!;VRy&zth}*}Gj3d0b=lBlujIWK9X2 zQ5){rM(jqGLc!L@GeQL|UZszwK}7PG7m-+{JmpOSx5~W!fP?2{KX<#$G9OsN7}&q;`EGu{9ek|ozd+Pi2CUWG;cw-?i7BHV!hJ*{Hlh0yNysix5H(JB&#Rt#(J zO=$2P2mf|m-siGTQtNR-PiH4-03KSSUi&JB&(Qb&13u5ko!g_!c@XUb-@R6@#aRgs z5~!hPh?;e$q(y3z3%jM~Xm`gEKI3QaKirCQyimJYjM^T<&#E-5sMF*Mc2QTwkp}%% zV%m<44w8Y;4k$li=<@(iY-o^nv&D5bLU9IJ_WZq7MwY9M_0DG`@)?HSZf?Z}D3^XA z(Tn!iv*`LR^CiY;WJ;d7_PX@Su7JZrJ#;|n)uvb@&3=j+YrM746|&Iim_ZCSNcC}@ zYzGjBom3np@8+fNF9S!vWi9S@%`%_~i|)8eg=*rOjHnRB_JQ2l$6H z>Fi5f9rv!z@e)LS?)G$+LC`~Sv9tr&LB9oPu*ys|=CvB4RRLw_^Kby>ZvCHw;Ueh& zYDGxju3$dVNzm<4ixr(_3``6{>7olKyz^2Hli9+~*0!{e#wJ&qnN1GYvWOgst)vfdd8jsjb?N5eQ)#%hu zTs9${fbwVphC#&speL&iFn?Vkb8%WvYy;B~8H{6E1 zU?gbJD-%7?se0$3Mhl)ibAnhW&h_TZp<7y_AN+dE%`@^8^2lARkZ-63LcdHD#+7W> ziVdn}1ibIwF?cOon~M zyVFDCG(X6-yG@%?2@hz>QBt=ic{K;tW319X{+h{WSbC3<_(+Lkgur(8+#)Eqr@mS* z$CKAMG`lUd3jbIlrAQBGwh5`=UC3#a(i?hTob!IV735;C#*G z3pq_>$U4q*#cDN8m_GNK@N79_Zb8g+oN+5gpRRU@p9!t3(TSWmhLOsQq95SU9ItLm zmb9Hmf0t?#(vSxz`aq}Hh!2#exV0P!8cfOSr>yi=k!N$EY>YcTn_$`P&>JO%NOQc@ zYYT@B(1EF0@nT(M`@D}E?FF3O6nlIcUir6i^61|1bh}!_k7RMBLR@iu>dJEJee;Ur zUc^Za44aF;h<(`G3mQQ;CO&C|igBEUk-UI#(^;(QG?TV`j4H%;Q5QGRPxE9E4EiP; z_18CVY#~@F;#?Zf^V^kzyNIq?MD^nzj$`J=)XKH(Fx)Xh4Q(vY9ql-i?yNeR!Zz_s z*6Bol!K;WuZKOoBJASQwoZ5!jLD!e7^hlS~sv4SdniN`)?obC~8r8}_elGlV;Ks9^ zumF*~#ztbBK`Ayx5H9dPAi6r+QBbMYZP~kBMpdrpJO?YA7jH4B+i*?P;=!#C(S|Wb zl4yH8lPI`deyE7y-ajWa*u@!8 z&pIqNi51#VF!?sOVYbn?%Cm$WADhE+pW6#9du3{uInQyepK^ipZMAVN%8&EvN;ojQa-!Qhag>{* z8L&JxA13q@x9H2UFYh_-%#V8LjBm(7##ZA-)PAnM@|-ed#olH>8;VKJVhgLjf5D-> za}jz@@#U{_((Oz;lp7ucFz!IR{Z|ysa<*>mzWg?Uq1h5zyA5gwBWFo~CkcHvozH-N zrJ?sRd66LKP-h)cyQfKsak9UjQ3ZQ5q9**5OtklGRP=`<9L=}PT8s*plD|enY-31S zk>8mi+l98L<>U<0Ge*Q&akO3gWy+;F_w8G|m*PwMv%SqkSY|9$66yiTsB4@g?qZ z5&(URkpSn!nGt?m3O%Oi+H~_~n{@Ag9KNG~CY;$YT%xd4;$*#7rygs92HKbgxyEII zBM2Lt2RoY-hoyjlH8oGqSF;g4Te&6gwD41!Q~FpR2~=bSxGvipB{*1nSx#1tZ$IK6 za)zk#NhWf2q}p^_b1-`hA0<7f0Q8!ov_~R2*9xT7t^6J+Lx^%Vjg}%8B?aD*B@|a$NXwRy}NDB}`DPwZ4hum=6Nwm+l z=G$E5%JBNLaAP*@%4coHqs07Fp%-yZ17kP+fJ73$DK`4|DG9gd%gbl?r&C=X(#C#C zf>={N5^JuU)(dOC-q$} z@zQ*@vBPNZOHMOyiGW*2RA@A6BNCJtwj)%Zrq{0jA=MUYZ?eZQqp5NAH*_ICB)<&*pa zly>@33HB(d4y*muvkkM9?km@QyKKxlF~qQd0|F_iHcgsZTJA@y=JeksDmNa-WRfy2 ziLrH{Dj~?HV#sHq?Fo6_o96~?)WxQpl`ZiSlS(q!tNEs<&(gB5d2LT|d&{JetjO}x zto;@0xp70k$_s`iRoS+>=!{oR4|RMe(La3BB>k0w?aq6H2JLYgu74KEuD&HmQBE82 ztIDca+s^VI6SX#5&n>1CT!lOj*rpV%CeW7|>xKD#MpsZMU-B;{K$TLVoHk;kTJE*; zD<2TOND1=A8Rvf*(yXj7V~p_eb4&3N(R0%J!ts>BfOJmz1GGU(d4X1@0lHtoN?wg& zdUK*D%oB#C>Dznag1upC2^_V^mlxs`3?)v#GX1h(@ zwD|k}{5H(O|CykA=?1Pg+T%3DscoOg#jBDkB_ADrSG9ILSkYz@N3Inu#(}e+9gZK} z6EV$A%(4~)1*RS_i4b6M(Cr~QAYZH{AxUk4)+Gbf<41xFpw_yBy<15&KJ%qbYaVf; zW;^MOV?RaNTU8R~wbjzq{QD^yEK9k8Q-zs@KN6|(Nxv;&V61mAc+Ux*p~orO33O3Z zqX2JD`K*WTN4~6)FzK?)wmVp{!cbl++I2~b-4z&cAo?;ts0!Kjl%O!vHMRj_m~tFt zHM*^104iNo`pXg3#OCj~{~+4&N0M~QAk6JvT##@Y^Hh`c@(Jg_ej#xdM+Y_oX3|+80ruX>u92F?}CewAj^` z-n>S%M?jPdsOJQ%N*Bx3_~#t|=@2($KK&_}IiS#?7mxDL-^-wqZC7|TO=9SFF@A@5 zEh2whEKfx(InFSc|8lawnyXl_a(Jxwd|j$DI(Z?-W9Y?S^~5EOFL1&EWYy`21>{rw#VP@qjHmQyW|Z6h^Bi~-f_A<^-NVu1D|*#6gQT{i`*5pfc1zjb&I8c_z* zdeE1mL|=;s^9!@~VOlYUKU5fWNt82rA ze(wJ&+lv*#`?rLKZ)>1;xhU%8pI0Y;6xt3=-_Ft>k?)E0PH2)&2;3kqArBdy{?-Vb zn>^eu1%S#Jv8l^14tE7i>j{_j1)BdIbrLI zFfK!>cf2GgZ5!{xhAzvPlAq-U6~Vy>qiw=18PFIu}3*7~$bc9IDF z%9>2A|DmFG{GZ^r<}U}gOKRxge%c3oWc=D3@FWA$jZsx${|i+W#z?v!Qh&Xeo1YF@ zAEUCf@>7BGwVWDYbCl$zhZOsCPVkTP|8GR&vaEGck1bu-?`U7II?0%J{Fo#FY|bKd zFa4iG-|3KPxQ|AtN4VSDD2=UeVLKVgl{9w2Wigyt3VZD3H72%Y*$P%QZ1aYVffN(u zLJ=NWzh2_}cB$t0810UE=sBcY5=#F&f>c{P)H4HVg`-=64?FOW`O`|f5^gQRZ}Bp3 zI{cC&%1r+w(eAmXoLQqgaTimHvaCh%eltvL{i2sv9+*}AzkD>+_CLtwWLX=E$T`jq zSeKC0500Zf;yBjqU>Ntv4WNad;@UuF2$mV8j?1bc&bYbnb%<`nuEone$=bW`FFm|pQfIun?e4;cChrddQK1>PtDe;) z3t%r!BGA1uU^C=5llsYF>D9aipcSh)i80QwcB?c%SN_O)Vqn$M8zU{Sw za;x4s4uo%bLF}-RdacxE1e-VOOCNe)R64yj{Ocy*j5^X>i zv}`iyn%+-2QiBIOPt6JgDatI%5j{P_G9lvs zAg`4W9_nBysd#CXy&1wfjBDP#-kaFwmjj?=0&B*Inpm3N{{^}U0!M_Lp7b@RlN`v@ zK>%L8yRJH%$+#xkDJO0F3YSF4^ar1PMHtK#6@#Ll%~xrD&;x1u5jY-!+`?Og>z*RZ z7fQP1^bG4|P(17fL@zgtEJ?*>h-_3kFF@iFv)03Fyn~O5Cx6NK3^;58D?q}kMdzab z2G%YB#Ru=@%s7kYj^ah{K0WF)6E5TLx9oQse?5ZAV*<-bq9pBm_4jtvp_h|}e*~Aa zvu&ej!33$}TQq7`R^2+uXPYlCVH|wRIpThKF+2$}AYmk7D%?%|*oom3q(^Qx+LXkx zhqxz{npF6zrdRG)p>Kcd^P@WppTA^R-;FjV5l7mtSw_uUE{n6U+*+xngQBAm)$r0As={s*%P>wB|8aQCmoU zLEn}xDQ(-OI~1%1;Y#>aYvF)1v*Up0UliWe%2LKyNxAHO%|PpCp%y}ww?i@W5zeer zhs0|7hSlz&#MV$zD$UBf=9T;fhDqlTiLP>MX;xPt3}~|Sv;FpJ zE^)?n7$Gy(g*I=_-w+vk3f<0nH9|IM#xd7Kv;xtQ>soe6oDGAj%E8}^puEGt2Y8yt z`LCUxejV3>WD-%knvGN;(E6)25u7lBz%vkSJ=OXHJ_>;d)FWtN2jbYQg z$s;W+&Z?ufux|?ml-&CE8S%bHrm%(zBTiYW)T7jpQ>aCJ`g2YG;2U_naG+&m@Q^?K z7_2<|{Gc!RE_YRQ5>eGc2Beiwa7lvt<+o+YxD7A7pv|Ga!dPNdoHFQO0`UD_OHhD` z4BPhM{y)364OzdMI`MDaF=N)vAAfl2)Jd0qnrUrqI%e&wNgpitM|8aM>Q=R1{FklI z@ji>59^As|XX;$DjbM(CQAT!rEY8VyrX9Q-IU_tzR>4u`czwF=`cWu;=_T z%U{0CG#15X0#g6VM*rTC{FyeQ*wHh-K)ir61qpoF%CLmjx)PdfTv?nC<{i^g)k4&% zhM$sHsDo(#u8sp7Zx!Dea;Ksr2v&6zcZ!6^Q7W-jKjucPXjrYZT~8F~!p3Y7Z41Gl zTd}jhJq_MZL#vCTMB?pZX6wX7YJbD%U0tf{Lz?R0?BIi=y?~520cXuEZ=N8U6ljAe zi5Sv`7{BYT!b$~W@wjQVVy9IAqA|Fu4#NGcQc>VvDH`e{ zfnkDay@KV5ZW#{3)R`LP+w<26E9ns;n-?I)Ol$@l_d~L~FLc&9g@-bfpv$BQKL;L? zDU-@KxFk*Ca()Y`W^TG_S6oBW+@b=gho(dS*?QUU7x?8rkOe#ma9n^|^hODS!lXo3 zAEi$3@455wX3kZ|ggo@O4^1k$qJDU@Dr=g^ zcs{(k7tI`xBMU`qRP6}j3lH;`!sP_m9t%dC-8ZF{Y-$y6V2q$0S>Fw5IZ7q*sGB3T{IsgC^&CGqQoIU<;jl*Bo>Eg+n`dmP+PqcGB>V4URJ zi+lBRgWx%$YM^-R-mK<5RIQaU{JmlepSeJ+{HK_2^rUwDl~sKec3_cz!1>LvLt&MBIEVXkXEMlIG>sx+ z3T_fkE$Er>0r2SRu?_M9JVJA>+{bPITMM3E*Vj{4H!$!$|L7ol{yA!NFZn&A7(e*n z+0xYzD$j~WJv5yynuh0|)`P7m6pPnhz7u)q`ET0q7;=68UiBYz_mYj6P9cFkcVkN& z_Q11+N_v#ot?B1i)Pz*=S~{8*vNp>L7~yP{wYY_C6j+K?Q}e_Vy8|)A%17YZThZTB z)jxFt)>Y5p5pK1tV*tOJXGL`_u&oMg&k7q)e;_Yn^uBiMi8@NK*q$RP0P6)l@gph!?wb><)0=Ri|(|@nzTQYkXp32;r)yJ z_d3&Z!X5z2lBBf74h<4>-IKkfOoZ^i7nLlks9xKjOwYIfmg9%UR5zkU!|KAaSmMU1 z#EtK&B)=|BtTh)-#li4+^#M)ptsORudCX@WZy-w-#T))}CVtb0VO@Z1M4 zjL|*bQ^X@8xm})Ll;}3g zT{58|b^tTC$LjaikMlqzBjl|XY|TvM507hDC(k$-wN9d5ERri?!FyN_Ii{*+`?_FU)a{Xnx!qzsKbx1Gi&j`0&xBtj*pZq4!`Eu z-!sOmx@G|za@W`qviIwoyRP`%1A|sAIU>(Iv;*85d4;9z2j6__<5s8B*R!kdRH}zJ z3ZJ&vR`E1C8_Ew9in;;A2MRw&aMe_=)$5`{1&(;u_npK=-@)$D%-MGe1OhisWIbk` z;GZrx0F9~iE}lm15XTkpVIy5!6A9>Nt<9=J^zqTk4Uyv;#FLcoA?Adl>@Q(ex@f#J zT+ETxWjQ37DS(uFRyRcrK6q^arm|gPDvK^@;cuQSu2Smu9Mio(9&E1us5yg|T_!j| zw4J%`Kgc_#uZNDz0nY9KtBBS`ZOxP8MV;4X)p%XEmJQ3PwZ^EUB1gQa_g&E}V_w7m z8JhTiiC?gG%T5I1kFLYxg?=X5+eup!0v03M%;{0~e|xX%7r|?LVda?a#q!u6UhP(X z8mQZS%ld`$S*{`vee@~7;&AIR;<^$Iadge{eepH!(CgQ3?1~ ziu(O;J-?T_&MjLQUJ|BQU*oQ0zn6mpV+j|BLXtbt3p2P^QMcAElfPQU!djk(atd<@ z3(yqP{|JP%!5qHxHEX5@oJ(7r`LXF&)wVeOYeMn zIWx-9KfdY#W?}pSDa0ne>vRSH*F2%Yz-zxnO|veT`698Iv%q5wX`O9KCk)bu?=m+o zDVG-o_JsMxy9zyi+b-$|N>KLD9Y{T>YeS{_P|6E@f)UP7B$O#)WD;2JKyx$_=z1;f z2>RULv%2?Jd5kxFcs3KTtK`|}NCBg2=#uFQ&fgw2+~txvF*^Ax?cOQ}6Png#}l=IlM zN?Q2yDF#$G+WX{4!$6%QS-%Tf=X3UWPZGVMf}1~6S+nFt_man&$3lM_)BTVfDOyl! z7j081(b3L;f~?I@hmeT)rD3N)LZSynrHbD1G-pWecfW z9sohOnQ}i?XZLSr@{ElCIp;p#YF{#O-&s+QNYXl?zvoRjreF2?e5t7Uup>$n_vr|~ z{JeR>Pwy390DB6 z(bF<)+OWe$9)lHRH0b%+x%~`P@f`q(j<+<}yDiA0FQe(C$Ik8V8P^G?@RoGCCxp>_ zkSTJgk(lh9v&W;%?Vqa9GekXciCZoDl#{i!oFAzmY`pf0$nICpj>I^ti(aA5^LkX6 zCr2Ulht@mr&N-An9{QdOzy4LXq!=@oOy1Ew-Kq3oSkTzO4O23Mm&yWbVZ91nyf^S2 z1Xqww*!$sQSVHT(O%_t!($lNR)O**g>iZnr3KKyS=iy2AzKVqVo$|aR$G&oV$zQF! zKF+|hhN8P#GMWgLxOez*luQMy*2y{o&w=l2AS5jvtru@0LH~QhYKx8E@p7BJrzF=h zB<%|CwHLCsI)Ir3&rOeIC*lC@L;!btqE@KX4Lv*C^j+vq|730E#pqTuJa=34aBh^^ z0_sb5NGJ@AbSk_0ex*(pJnQxs-TxYY@o#yG$X)&<^p>{cFEKJ=`<=J@=iv*ps4pPt zlk8{_2Fxyz9d8BxyehnuX!4ppK1F}!sc(!-`D5Z$sao%SO818fSwU#|oU$7*MJK%P z+{#w<8&>_;kgvK%L!Rk*>^k2w=7lzVuIP2~$mcFGbh$BfD#~;FZzX$<076^^tZj~3 zqr#U5uuRLGkJabc)%Ey8C9xw{hMX?mh6#-$mGEdy+_6M@kS!J)$}>Q_6rCO9WMFT% zaxcfbDK~`Z{jhlPNtzMvbRFETK@Wok9(zWFpx|q@=JwMJ5Dj_WZ~IS2o1p(wSj4XP z^ETCq#u<_pWC58FX-~zWW{Hs|&g;~1xoBZm)8x7}Sgf#Q8q#}Ho_5Fc=DHL8j!ogV zPv(nG@Qg61c0}yA2ef!P9&SaRLIFufO>KV{M)<0gXo*ne6*O*46B65V0AD%Csj9(* zv6^Mvqu?l&*}Ns##(>{FkGh4py`fwI14kd2&E_1{tBv_%*Ze6@(d(C2rtEs%v;MlP zpy&}{tuBXupkCU8Tyzoro$Mb9r7jf1I2Gtdd%^9Doylk@BAL2;#^OX!w}MQ5pkAD!Xe_Te7C63gdu!+A8#~{3XJ(0B zQH;oRui%jf6_-dfaekpoeFHssIs}I_fJg%v(^z>rTDmKuwB?zu@t#oQHsW^D2I)6% z1TnreM!haxnTq>-f{0;>j<+1E_hhY-Cr7)F?j3xiysf;g0_@up=n_R^(KK6POQx`V zaxD>hRc{>AsUlCbfa@sx&A1fK0m-uwab^-V*}rWHH{8(_l>Oe}RJ+ZrGUZSgp@Oti zhRxig)Fh|{{omT)Hh^NZ;goI)@5t*YZmE&U z55G1O7Sb^L=!>QHWT25AD^^dJp?mKU&nLW=+chRTA!Sup+h3u7md0>V+ZyrJ*!y)t z5WWG8Up%C@d}D%PV2(5-+0RY)hf2%D^zb^j8{h%-0l2BLqh;PE zR`4j{K@(Er{~=8#UiPZmw(I?&=aEdOXQ7xXy00`LZUk%s?d!?$mu@HP4@N-WPKg2c z0u$mAHy&V&!n}8RH5esiMR2`Sh?L{tIO3-WZaHlyda;^`$@vrX5z4rVFGXeLAQtwFv>Q>?|q0Sj=ES8fXqAs2j0z7?pJcpx@br*^i@pape z1Tcl4J`wgPb<0H3Uj)g{p#E1w2ZI;G`LSl`&`mG7I%57BA{8NJ;wHZ65OQsM7iRj~ zHlm}F_RmsB`o$15k+Hg!SXDg$|Bv9k+4K_HcPa3U3F8yQFIOa(WaA&2aFhrdN;V2h_~&C!x#}BLTes*CLVQ&E=H60>oF4ll}K{PfHy=b2zI`jLn%<+9saIR=qXe1O&(}i2bKBz`9bIVv@ z!HZbg&_*;?_8BcI(rd(s@grt1STuiu^UZ3WFYTk29}Sf;rT0_eJ67jCy$LA1>>A-z z2VASDKJa=ZgXH*$eHwx15KBth#b46YGtbd%=xO&=ypY`+tbkQyaZ3wJZdFarw`gL^i13C!( zHV^Tbahy5GMX_i_oaEHs-8oruZcw7wTd8oqxO)oh_xG*uHrrn%)XXMGhYGxral*e18uk$(gZO(ZQSN$(W3}Je|nO^ zYSsyu|7;_ZH+No6F0bfc7X}ggYo)7{)0^W42GUW^&sPbD8zH>%#Gw=8vqn4aHV^P< z#Y>S`N2z?A3Re-t*BD2lcox_Oj@tasLHwqtpk(2vBjHb!j7A;RRhKgf$^9J1PX&Yg zFaxgibzvIb-1AM44JebS#L^8|?2YwYyiOnyp$w`IPeJv8 zZkPtr8?3R*A`B~2wm*#YWd+G-I0TLd0jfq<9T?Wr+qyFE_lb3*V!bSJn6CBQu4-1A z_?y&LA5Gi0vmFg_R#!+M^{fPJK%k*D_sUio5Fc;s@DTF;=nK%z_rBi#Y(oLEyv4v-5O8PxVy{0zxWXt zJcKxXrqi-eOaQV_hLgu|L(Z*|Fm?r}Yi#!svLCb_+C7o_QT?3i4-*xPKtv?NU=_96 zU)kk1_S$Tc9p#Su2OP!ruS7IdiL(}a-CAHbtzw_Tj!|3v=aG20_!6hiIaLouUwIY}k~kK39bt%WKa5x%39N3}@BF`sQ{ZZFU4YX)_?W6>u0GlDQy1yA<4wXXAT{vQ}fK)x2 zQ(uS|5J>Df;!*j4ikeG4N~a3+Q8nH`&og1hKw=lt3?nnf&-72y&yDR05E}6(!X?u^ zaQJcO1S_zDx+y__FDMu-#>|fJ*$ZpR!80r!ge!u^Gel=Qz9bOX41TqHf8m0JHbl_ByTP~Ks5%6Oo`~3SY{DT{M;wCz|um?5+`v2cBh+F)-&G%uknR2Uj5A#)}$$vTKa_!Z}44Z(CR$-Y3|jgB^D7v@B+ zuhQfB(l0NFr5OSEd%LQY=y?kcZ&9JTZT}S^j2Lt*JR1PpSjB5TB91d7#P$@z>6%t| z!sW3IqP;utJJ@kq;{qA_{9>WAwz`@Nlc)NkfpHSykK#UDiK{whqGInx!OJ_{1o$Jl zy5g|T+AQFfZLK(raHRVo&Ti1}c(VB+%KN(uVsakw+($y%7}n@WIZM7>s$WX9?ED{!RH-1(US@U&zPx&#iPcEZc!BxKZ{HE<>WNZj4!Qa*g-&hg?sn4x&* zN?w>B^sgtIiZ8ZG^4#BWmbo_fGn}(zt-@lNtB>mZf-D>bpLO|%-NgQSiE?_AuH%&3 zMTf-J61AD?1GhI|JcBz8XlrY7A?1HD|t?zGInU?iuX*MUoIO~_fI5PsNzcm(pzDv42b|LI;il%hUVA&qa=`#?}eLBkb6Q^AuG(f#W5 z;8A$x-(RgEL@d_DsGPklL!{$KCo`eOQq%hnX+Dohfe?}t@&GM6_y`ESG>0o-3Krs} zP4F118(21CS}ff0Wnv7!=qo$fc+2azRW*fkDZz@xqUZgR4&8h`5wROJDDPkb`1fYi z`RqbprLNIv#KxI{TPS#YmHXfQe5`MyWNC#ngR1!-WYPf^Y+l$#6x^zY;2Hn+y5d(F zH?nOPpo@^lT_hPr9h!j2L*3>^h36`Mn3P5y6zk&9whYkK~c0st5%; zG^y(KDj+$v^13FuGsb-wMcIpBnfcGk$Qj6o0kPB$+>n^M#dC9JT=^KqdTH<56bART zo!~Os?{-5v2z!8Tp9t7QVoyo9l@oG^E7A2!DSuK!r$& zlqv)p|9*xd-2y&cRD6hl2kb|(&ha8Ug{8mWuok{X#K*fO<>1U+aEzB%F0|tjTZyT+ zDdIWUme*I#>li<;7KzeWB1)vQBA_jRfN%=3ZN+kwgrVMDxbEq_kx}{MDx^g&odxi_ zwkv31rDVTwOJlvN&d=1X4`~>rd!!(tKdN!o=u``emy5XuM=zWCJM;|O0&lXzsn{O3`c zywWMS?isz2{2_%QnJ!l%EG?0n0+LboM4EUAb)Zc2-Klr4Ws+u%q~P$Cv#8dB=pt~G z`c8qbnx7dYKb?uE+U9?-*++a{9XpG{Qn7MDg?;ldzR z;y1%#W9V^4lt=wzSCAO5a2e}_9^Rf3mvIyd0%;jR=)J#hO63jva4eAcs}DIF8_v(%BN2c`)TYWI z7t3C~ugHdF4|54}o@hFz;#MjYg82_^tKwXA>Db5RDAU;^eDYn}zN9rgSEnxqLA0Be zNOa^@OQd@(Cb+5A4Lvp;0g0>$CI5g!HBO_I<%;ehG^iZ*cgF*aq#rq?zQ&zHbDlby}`7JsAb?D15hN1)@WX*HS7oNWtxhGc|QCPQ@ z!^zi1xQSE$4^y)9Q5+pPd@197CVyCowRglvg>HZg#pZw9s2FzMDPyOK1E;e?Qn@nU zi#Bj3(wHPO$2cf5f2(@<9yD6A$X;U7SeS<)A`!9+Zsh7odwj`j`Vn-^$WP|s9S z!bnIR+LZLxiNh-_X;-*d8lJn9+Cu`Uv=+Cvhp7?--SQ5){tg}ue=dz{R=RqIA_Ix9dB*JA_* zt4u1Rrd+<$9FsLqVy|TYg}XX6p=7WSov4(+e7e%0xgl6<0(qgbg^qaZq{K0EVd1k- z_Uh#&;96ayAt3MhXN&#$V_9b9oplNKELB;H#ALn4Xkb)@3()N(Ul|)9i98@-K^rl3 z+vE|V7!Tp#n}hakU9>OFtTEg6>i7nPNc748YJ8wck zcPZ=|e6@f;-wU8EZFfv6#WtRmCT{v%+^`1xa*ZdjA5>orx{6h`DZ%NtoPk0@i&*LLj(2W zK9-F30_;RSktXtq;)xQr%c&w$>oS~B4jMEWv9_i#*Hl+<-rnK7RWS5c8Y-5sUF%lq zrx_M_J6CFI-Qw)fUe`)&+%}eZjHuj_6aHvkS+4NjRp7T`G%i%FHw+0Hc0`ztx8EI~ zku_gp5Lm!f^`2fmrWs!W8fo=wNMC~uLw7hUB~hmR25i$V+X(AwNLJsaC6%7A$&NG? zXK!ABZbXJIciwGW&>xA_*4d+JQun7lRCd-*+ zTU9)p?6(K0Wc?%=s?e*?ch)t}E^k+$XS`u8>-!FvtSNFBr!*$)~md&?3N(L82Uh_|2C4(9 zSP2QTgyN5<*0%L+9TPsncgaQ?&IdYe=aBF;w`)Ut#wJM;Fy(X%G9IWy%3vmpJoSJ_2LIE^gov~V|50QuBqPvO46h4j^;)hJEh9z2-UC)tVbO_Nxx2Y@cx?6%IPnNr|RHyku^&GzBH*D29)9GaDp-{12vS7K`d zHYd=qmfWYXXtXeA?Y*>>&2fhzg+lL&3;s+>Si@2Us}Uh5#x~pRjR}aC!Jg_c3S^sS zfC7CAkJ`fX*M&vtWrdspo}QMO6$x%!jz}WZk;>Es1Gad2X=^6vZIt8%5$s;kj_6CP z*pgafYJ&m12U(iEuWLm_mwT+~Ob&F4kHBS-e?*5;&H62wqV9a^}rELUX9xDjky z;&sEM5j9NwqF9lKlX?fmx|TDE)s(1874<50mpX# zG#F$E0`6Tj5^VC4sQ@arBMpqah~52+u_agu&$&iTe-`Q_MjF#^NNr+IAejmqsTh(6 zj<2CBXbj_q{kdEMoBP5Av%t*-3Y*3ExmGK(A_U4ynS|cENvBEs-J*`KY^A6KW{=nf zE-LjCn~~jEq>v{y<-knvkkepq9&F5~EJ9RY2vI_N<$1rlDyT@HD=98xkp=@C?7WsD zLlwexeg0y$-6U*3wq|!W)7Yy6OMR8L8%bg5dJPP65f2mC@uo%VmRa+u{Uh7p!Mmv3 zh5L9b2#A7(m!!E)dh1qs$`wKbQmn%4Izcq1n@P$YANRhBc#23!Zqf*+K?QgZbtq6S zpDMcH<9SYW%aW!Oo|d2P0&kRr$kLGv8d&aD>G=ML1^s~|6`l}mC+(C}@wpc%uRN|1 z6mvn^KTD;Z_bh*^U8v+~+C5C?#~#>N|8s^!B&7ssBj@Z^N*Kkc`*0=}^yIhnv#x9~ z4wb-b5=mX z;(bI9OM8^lOdx>f$96aAj7~5StE-*uKN5}If7MKp@7JP6<*>%gBIU4??yzm9v^;?sKXIwy2zk3Sw+e8eknLa(HKt5Eh zD|TDsZds(Sn$orJgi7RpuFtH#MAhy2(qaM?4~Je{KVPn&@3iZoN&!v1qyAjO6(RJ( zoVryj;kC;Pn`SGq`F4h!Rq(4I*rR%T_S#G7z7gD_+)0BN%Ws;rf&n zCm11$INZFQ!pVQ@qNRo-`TgJ|vxuTz)J1SZQheMRD{aC*l2z((Wjb7X11$ZkFj#nb zp*yAqkF11&rt{n*k9tskf_op=6~=Y&ro+Bf=zT~3dR*1pCkM&*ohDE*AQyIL-?2=o`U^NAw2$@pUUQ3B0DcN~)i5c}`*EDEEKS zF$lW3zS}|@d?aGPYoxg7N9)I@ug?8>;Y}g<^$_Bxgs+i^uq*Nc`G48YNNrLqSaxob zUkQtV3-NISkZGYr{J%v)9sSrk{|9q2qb4Xm%F~1K7V9jn3wUX@tUVw++Z@3w2sN2< zGJNX=PNp|J;$Ckt%Lkzp{qNx2wVkZTN2_5!{Qhsx)u-n|Je_j(?BOGz18iHvc3r#k zGW>b0sivWA7K-lj+`|+%1txJ*Q_nlVFTco-f&~f z)nEUO^g}0+Kc7|gIXD0qIT3y5zP9noI%7XiSo0>x3tJBe&jUmdas`8B&4zL}kN-6h zxJLowtg?=hV2e5LANpPY^Ihkl?&$e=@LH6dh@i{ohhLpRmQh{1sgeBya}hmpx5W~q zg7w>W!GnEM+`%@X+)c54=Jz-dmHtTTI`Iu%SW&z1@$uhG_SPBdO|O4#f*m4`_kuI& zqC@80K2k<_aG))*eZ8F$8faN!Bktf3{aJ62En*2VQnFJ&WN z*@CNhv~2%(zDwGK|$?*-d@HnKwj+pEols3sizqM{0R zSVi5+3j+D)g9W&E(d$WIHs=w87^3{p>R%hxQPlZWKP})Osl;QdbOZueIk_)F7>=Gj@^x-AbQLMd$i~cO^uJocAG5Ttb3F*fwj| z?t>GPChfVtVlqSOLJ5+Qb2mDW0~3qBLpi{d@a!)Wm053uiumw~Lwzlj^}lNa8U|X7 zEQzU{ihYEvYoC0u%u^R#6Q!pf3XaIcNI{>7%5K!F`l*fJvR{>zx`?=`gP8(qA>6tl zb6rRSgVz1=2(xWLH|D!-_a&o`XAUkFoCB{D-%B<JV8;_oK0U5@up|^5Cbe9>fdVgkz(gX(e&uRUz2VvG z8%D=Y6zS6Pqf~1nDbfdXK(lBQX{o43S{=ik<(eKrgeYl zpxxs&_2-77FgY^;OP(~9=kZC;|L zcO*XD*NT)c-^L7R;k9*#v?5 zOk2XhnWoQ24NZpGo0igiJss9ZH~Dw;AitWx#`ISmTYs5VR(4UXxhM$EyFB3*wLJGW zyy8jy=s|f%1N@)iwF7G!1?pxWY8{Rmoe>x$_CN*E%Y(lr?C01W#fvwL#W?ppx*JD3 z6q{odZV#TRom41>IhUVvA#&69us%%}RbR>beOcZKO|r664j&1}n-RVi2bYb6Hp;z~ z)-_0v5x>|v*2Iw2Kld0RxZ!jZAM_;eLU;nO#;hj&c8t3eK~AM`tUYu%=R&w_#GlRf zvzl3cjVxo?w1#tO=U7jV&l5~8Se|KAqE%4zOqxv`f8L}TdTFG*NmlOcVfvCQR!Wkq z&1sEW?143=KP-c9rP{CC9$Iz2zWQ~B(PSKEKL;W5lf3f_<*ZPBmRPKF+Wj7S`lfJq z{XLA8r*G_zBEw!IugfMLlZ8n`(^frDDPyUlJWu%XDp7}(>bpF0TbAV=wnZAP$xgDU z+D5xd*JtbjW8#V@YE1l(1!u`{fSI-q-BjQI=KeL5s>zV8$`N>Tk2RH^eK0Q-EMY6* z^Ep-u_=mX5sjAmb&2WtvY}zK%*5W(oapIzh}+4ywTa)8hSz7tRCma3*u*rkC#Zkm8HBoU#iPg> zD$nyoq+1ep9NN0wQm^=PBwhEfspHP?VvUCQf30KQSt_XU8KQCQ$MDh(i`#Td^g)fq zX~%)>V|~@W*rKMKe$!N*FFOz5K{z1!+UCmR<-ylJ{}`v{wTvZX?3Yu&MCRzcORP0K zE^}^K*7A(WFiJcYwvFl$I*gKS`h4zW&IQ4NP40RfE}b4r;fZ0&u?sab(j5N%M?$=y ztmd|C_TK(Jh}mTR7{u<@vXOUJ?&YVKAUd`lo4p1RM$>QW(KMI#ZtNjsb<97Cm`^_4 zjWfI$!Hqpl{oQ37&#*FxTV*1x0APROTKBs7gA0#Oj4+xQJ9yn2hOyqE``0xR)Z*q@ zQS*T9RI9c)L${Mp*1dWKd4EciaxdG^&|DZzJ%44IY8|$F7ye}I5K=Eu+qx}|W|Lbe z3?*B7(#x;Ae$tf9fms6b9rMGiJ4|=tB7OheI$N# zHCnCF)g zN-3lhj>Sx=ZFcx3j4Yo2aPuoUlO=;B5_kyvno+CHJbWj-UFeC}e8N{}QO`i1p2Uqn z$f%E4jj+syvzxV;u%-;ZN6TtxW1*+7*Zpy0hPY;}4H&WVCbrEOjUH5`?XEfdx2Ch@ z{2oG^&OC1?yhHeqjJaIy8h5fXH@Fj~I<&_U0@=Rv{7ozR=0Bzs4EZOGh3s%#9*Blm;rzH1I|ckB9z`E<&3`&j=$w2gf8j&+$)`o zuODEGLg+5ENS=wiE9-k|vtj3P7gf%fOd1Io?|mWE(+xC$DW zfZ?o?Fux6Hx6Ns2;KuOxjdP6VB@_~Iu3^Q$6P%VZg!xUYQSDAewT3SHn=oWX?Nq~l z%FFQBdm!R$zJF7OdZi63srhH&1EipXHA!Chxe-O9Zei5KW`86Z$RiBLyIkrKoMyBM zO}){Z6&N9RXFX~>0hNn^RiOS^MWH0_;Wd)Z_MK;czTRzQ)-=7`C0?}7R^b_QwnwS3 z;#=yXgpII_g@WJr@{04R=|2@w_Q=mMeB61lx+4TRv+G`%}ECckK4dq3G<0v@!UM5u^R32c-br9 zbk3=g#ms12w1KOSqIQbVQLK{&)1P+XlEydu)UImFyu63Q2!6JEc5qK=4oKQ9o*-VQ z^hya^4Jq0$PV%Bvp*ktTq;fBe-qZEqD%&+GF)D8CHA)a|RTo_*=sicDrU$2p>I2KH zuIXpO9_GA+&z|>$4K)(7xWnnUd{~s|58}UkbV)~y?BO`OnF!sbg*rLl6UO-zwnA6v~Snf5$_w$FNgQY$A@cWLNi{9kc2pIQd7B!4GudU zODlz+Q-;j@MnbJ-A=F?_JL`? zSvTt0j7MiaOVO+t9PN0*!j%rkn+FdLKXuJ25cL72UQsE{*nC)8lf5dDsjULLIYE( zdGLzp$4;fZ-ws30pN~cF2WvH&J~m)_M^?(mjp~zo)->k{WJKYH_IlJsy!e{<$PWrK zm*Kw;g&m|Nq6lvvH~IVT3KIXbNGLx1V(8P4f*#1yuEW?54}v!or4^K&*gmLU^v;KpyPXa2*eWaUe1Y3k+y=t(Ca&15*vKjJbstm#QF$?*RC^L$!#lr(+e zCX1%Cd|D_$!sxfrYq+0h{%5z2nSI?1O{M}}=k0(GJ3`;iojPOnyb`2BM>&AVU)M6o zCZGK9ykFQK5C7d$CInME!G)pq`Cm#Lpuda8pt_Kks` z!ZpMuY9CIW0HU;|Y(1ie>ScgK2#%cj`1*|~u9KpXoX(xcp=Av8&Q=N?eb}VyacV^S zx%0!?cjw+9;U9kTqk>_>isM!;Zl8Lu<6;gJaEpFwSF8B}D2+-c5{BAFAV6+uee37 z2nn>ya_&SOUAystx}lBu?l^kZ$4S9-tsa3$jwdF5wNP(>IRbx{)Rz)kG=yeJ@QsU~ z(x4MU_N8 z(G}CZJ(58MgV5OJ?ArC|yCr}sim?huDPasmprT2Okp5)ou(FBt$~J@7Fd%l2sU?^u8QD|*+Z86*X#ku@s%?ZRbI2)Y z_L&riYWEI)X6o1VD0==X|4ipQfGlU4ot2OX&XDte=c>DER>z@DtUl5$?xY z8+x_)DCEe2WX$kbjoo{w4V%Ey--$KMm-+3IOnsXn)L#=57OHe!o19_#6GZg6-Er7g zs|GL7`?$c;Buc7RTCooO@*1l0OOMT}TFnpwTviHoD-p3;W&Xh4fK1r+9TH|EJvEKK zc+wwoLKWFn2{Z&Fzl`@T@SpgE4xDhR!rB=~*?bhCF>QeOidj}$*tt%!OMfeDcmW;FC9omdSpg$0FkVcS&6N^5X_ZuBTDdtf!jMkP)AS?x{-Vy%wHQk2YTZpZL>N&SNIUVT!A38D*J>z-TyEINMh%(ig6Ta+ zdChwU(O)hJpTfHr6*`9)BYoZoQ{GhDEIZnLq|@%`N{oc|!$&r}=Fr%{<5}xCoMAfD z^+SwUQsy4dH)^MbvS{ai8BN)3C)NF;=m>MMq&wTEOu88l5VVl6e`tj?vr|>7`%{j8 z?D842A#ET#KLL!i$O*$o!|`+#160@N?wJTNcyq^CaE->(OM%66eqpEO16)>ah>(P0 zx(Ag{+fmiT*hT6TVzH1k^`rTT>`yTNnB_C3L$-pQR0p6ny=5+}lOd)Xu&sx-ovGU>B^RfF`-wdOi-axgee?Dzxa`}+4FjHag<>c_)((2k|3}*|3a6kKS?naxAlR;IKz9J>K<}80N z$62NaB+oT9gG|Vkqy@?R%Q1uLLrb?mUH{B$0xmusNw2v-b;9V)cFXleK-FgEhs#>S z=_Ln^`QtzxaMJ3-k%DlR0{nVEmZE z@2l7Q6=gbTq!PFCaGSK%4ypqPDsLHKP(eo)TEjJPI}KKA%rhIty4*P2FgIN4@pnI_ zsySPQEBa8Vkqlz!$)K5HukuwV9wGM)Qe zQL@1si^%*V5{gM75e@a8<#09Yp57Zx0_(C}U!MES@>$sro198se@p6gS zl$Fq6E1_MFLu3gSzF|>+hiR?~5ZUQv6}x?(a@N@M_^d|SZ>$8+ok(S@*ZK`|)y`~O zryO$UT$!+wAQId7p%dY{O~NFS;J#i-NWb61RF5qK%*kd#&lLXM6x#_hZDl20FFRfV z6JvBy)WIH%3)Y;9efma<_s7)SCRE37th5q-Dd9gLd9L>@hrXGu1jZ)j3@IH+mI_+N ze;~5%wTT38bo|uPUXFgWqQ5Ji8k~jjS3Ixpj^nRp0531X*jy8@X%ENeX#>gcC#pju zJQR5RFYPoF^K4e!x3A7nr>v2=}=r2C(bB2#}b6b8kR zw%~6N-6R$1-YNmIGXL+UaN(MGeCF1?>GINDn=-OX6ybtXDFb@3I>kc?Y8E9W4)Q5a zNA_~)vb-%3kYK$*83{SsOnB%nJ7Ut!Q{2=$ zW8gH5hV!bl;%*!gX@I4DWvR7-dnMpL(@T?8qRh9~{t0x?;*a{&icKP67g2q7+q+m! zsa;ZEZp%J0QC;;e_!H4uk)%+oB@#jU=BsBC**oZg)|I<*I=gyNbnW{$Uw)i++}^cC z1Wvh~G1V&~VvtFgRszq$nodNYYJc`s$Wjqec;^hONbXJ3$BF24ysl*KuA6t%%mckd zL@@32zy#5XdWw9&#iTozeTC%Guq(&bT=lA4;rQBvMIP>7aG`7w0kw@c?8MbRxR)jD ze$=bIi9(v{pS39*gNnJ|*IfJlp@z@@=lMXF_p3@68-A)eTXd>(Z33HiDvvf7?-Ci( z2<>mPd|t`!&1(Bm!t{hn{n|=JmOkpt5G|iuC;jgxwEXoTdyFm0e5d@sn^2H_m`b9k z=KKHc#|5!{HCF_@CLghhhfrp9diGf_k#mnjN&kmF>-)uGh-bcz53FA8$IP z-_DrxAr8|7N>}xk^Vb~pgNTUs)3uN9`ss*prNQ0wKo#tYfG|wMin;%_F}jF|QOBC4 z-X7V=C0N0}s?I@vOTfGaa&NBe;N-fmL_}h<)<*yH+$ABB1k=)03nXZGv3a=niPt~P zI;{b2i-^d*W9#;j{!NI=|ENk__8D0wlE7wlO`KIEGvdtpCqNR5TU=Y{y&r`jnWa}$ zrz1ZSKXgEm0(B0@Br+iK|Mck_UjxBi+F_~7%bvGSx~xMQc=!K3+X&g|y$fm9;S3C# zrXy*qa9|A)S|A+c)}24}A0e)XjKGqS$XWPUGvmgNLW!OK^Heiq2m`dsydictuaWU? z|NlHBL6P2t!?1`OlVovLh5iD<-1 znrCg*@+5Oi5YA7ZtHmVWPb)Gfdw`fs=v$UnmB151p$ZVGkiNl0Bu~RhJ`+a4D`Y~a z;|JfqvFcw52lt64&y^LOoo=b1OfLqtsGbic_5~hhn2+642%GVLlsMNx$2n8yG<*mp zMQ8c&IYH7znh?@4SXm_B;yEkYDV^?t$?VhcAbRgy3r|B*l9D!Yd8MP_iz#9&HS%hE)M^|>Pi}kG~AexkDA+2n}>6OrTlPeXL?7M$vKujF$ zu#ngyqj7WwAj{eyUd8SDNm|%|Ro#{Fun%(-XbA(~htj9}FTPh8cRRCfb%_y}91v6D z;q~AxKni9;T9#%ywcG9}>^I-On*-k2U}Z%yXj@YMD5ZxsJV({G!_C?|cbrA>%=E)Y zn2f_Tc;6OAtJys^SesoR*-n#b44K~d=iZ|my@1EqpxCjg)W&VghIm^E8t{a#dg?RQ z-_dIRDzA%u5{%P|SVJ1dqI+caF?o6W#ny=CFIOX$i_^H_R zado>KkT2Ak#?TFNmxjF@FEcoVyD^Kd-z7UPjjB!hVl5LIcP+4N&4o)L#lCvb`o4F) z+a|4VB9Kqp8L*6F$*$3P3z8H3wotcK?`3)~6jd=b8k^^%D8Z>WxyjqEV?y}JRIPf0 zp$d&Ie==@qK+S6UHIJ!HUwAj77?lMB;dm~%^olzMwb!ju5- z2yo@g#Fv<|m)N{PoyzfU2O0G*r)%%7EoE70tU7)243rIq0GuQ^L6$MCxt`E7dLGf| z{vh0V<$MfD%j_y-!uKPz*}9J_MR(zRU_kLbsSI+sQwX0GL80}!mV$&(;p&dYt>dtE zflWA;>grmb5vTU6Hv@e*UytC=xXHC>Owt|5^)R6rdm$Al%v`3n0!35sP!-)<*(5X5 zafS%N>#@ z0B8Yb_caj5TcT=(48%b)!g|o{G`P7mlsBS=~ViXBCEEh4~n3!)fm>^DXV4tEDAZBS@1p=SowSR^HvI zOgDPPzFbwS)Wzd_JSNbgGgRv`8vhqM#4U<3jbgEaN+h8*xwkyutL<-_!_cFk2Ipt6fxhc{;A5y$71o`{ZAkUJR_#_79xX?Jva1E~4QIf{*ZrcGa^EN4nEdr%dV zY=r9jz+ut=A+myz+{GYQ>aNXe1{zC(yjik9DW|0;eG?<|b7zuWLJO0#KR z6Z6ANZ`q`74oNROXtWj*cAs=5VwvJ0+ZIGN;BpC*j4(IL#^dg0zxbd-6U9Schut2a zjZM2uL&fv)Sfzq@wsn+{Y$&zD)dM}a4g&{HI@WRa6iYKl++B(&jWlP^piY{H(K2a< z?L0NRuLVJ4p?bLLpq)34jzM74zEsGI3~Z9=!SF5~*`^=v=#Su2v1X!t$P5h=HtFqe zewx_JaGbHFIY{xHzWSn@+7yZI;`WXE^UcV`FU`3NxxS0P0JZf2C!Z2N>Q96jNXE)Y z11YH?+2#nPjAt6O)*&)*L3Wr>DAD`a8vYFl$GykqpHmFYomT8`4xrq&y6nd4w|aMBBrhhsw|+joW(Q@mKr6=>VlJ~bFOukh*z!gLC7S3LnrtN%|Htt4%Zk+YRekDD2gjrHX=O|K*i z(iw<>DYrFEJgZSS@L+tg!L`DHZm1AeD2Q88R*ax}Mp)>f#8@t+d?w_>s57WJILk+sN|ocyq4)Q?5{Q>IaPTbV9(V=aTK2{DsPg;bhpqi?Tz-Uvdq zs<$|2X-RwX>E}!bHx6@5MYfO>EZ){*KEpSgMp(idU8eKhAoju<#{&6s+=%e&N^}|> z8|O}dvcqBr{gB#?WagitZL;-dfmUm+kR>UQk;b;Fj-9q^Yf1>(r2odXgIjpgVK-b zAl;^4J_oJwJJ38;Uht$`yu62vW*=^&Kyx=g-D)7< ze$#%@F-L(&?#Vz;*c*JKPXzr!jalpX3@tS_V;yP??uHOuLJ~#mwg2eM!pjw%ML6rh z%+(Kbvy4n4We`D!2cLG2S%rlKC2bE1a!2!xXy8Nv5XL-n@4{P!Pq!4of zViKQS|idnoXEMLzLM7{DLKpg}zj4w-*b(YX<#8=ns zw(+cish4Z;)2_5?S!j{SrZlUkNAqyhVFPrPz+rs=BLm$?n~}{_2-;L*(i5FB*x2Al zr&We;UZ`(F2ShdD-}fpz(2U{O-YoMtTPsYLhI{%z%&AGnXlaKb;Sh~BD%Z`5@<8o! zs{f(q&vfh1K$XuqY&Z06)kEaj_G4e%A(M&~Zi6L=ggKwYLo4-PA85Sq&7!+If04C- zm9k_OjWHX#t_x&MaKm0G%Bi*>j5S9&K{hn9S=z}Tbj>D*PX?9l097845-MdGaAD4>Y)5`)j<={kpt4NtesxS8O!m_R3r3l4cQkx@|rPf_cFTdL*6w6lo|jT z#CH#*WIH{ty!_94KCf9t_$ zcaSkzG~OkL-1n_hxr|*BSNOQr?d};tpQgKjkF%4Xv>a!QnLcRlg|{oz|HBVHFUJoc zyJPWYihQDhz~0(jPk|ChG?Mhr07cK#AM5TZZb1`0B#sV*EKK%ht*YJpalPqo&qMg* zJQcO7YY6F?!bIntj!2FVeZ?l@iCW8yypG?=tF+Y4%jwI)-B7Wr0chLt`soJZHQSj6BQ&bDSqb1GlzBn zw_NX(uLrT>*2l26_gi^bp?5a5rw*{(jOBA2sztuW@l4?t`#NNqOgi|7dfu%pF5Jf< zuU?_c--qRAK?|^40nYbnLmyN$f7;fi!2iwxce4-D9P|Xb$Gd+|@3Lb4G|ecwadipW zr&oJ*Ez)Br4_5gP-r;zaE`u(CV9ElsSk`f@?4;YO7qvR&HBr~9{fCUmGCay-rbcZg zHYL5Q=y%ZoEvd?VxkV{jhFoe zf)3HAId+B zOt+cPk^Dx1xbad)_#{`!wHmHLtrfRK<65|tsS?@0?^%kZXo%WRHkF^+^5`6?FZIpNFEk`4tmRJAIWx5{Joyx){ zT`r`(9At@J9@IQ{OgC@D{<#g?T@m8tW0-hjUCa^60j0)FYMW2=^hJF>$<4y7LY?Y> zHA9CQ6_;S}i9}$GGsW3OUGoXn&ta&Exr(!1#H`AqD!x;>G5%=DE1YGgLq23CGyz0# zz6v^HdU|Qhrgp`Yk+8%mZJN#EXe&v>fUX0bWcvp#0EEr*rq?%U3L35MB@zFCms zMcOcNg+hv3x0aRb%cWkHzT~$~m=Yk^I{uZw$Te6mDpORyE2WxTPW_d}WGpJv=R|>I&I)xct^(uk6^k7UN{n#2kkDwzC+q-OxX%?7pOqXscLBho&=r(nJ<{DUnN2CFQ z5aK$ZF8`=zfkG)aCar-6HTN=$O^*GuOlA9<{RJ>pZkEqKa>(rTK;IlCA!yGHUVjbY zG3+7rBYZ{Ur_#skMXqg|uO1b>HNp5sq9~*6`nQq>|9gs{wPgmd`iCAYr6uS+R8_BX z{qGbB)5FNt8}dZ_{%<6kR(aYAY4hOJ*ENW1CwTO?>C_Zg=$WQ%U-U9>Q>>S!E}V}u znm`LcJBin=p2xI*UWt8kg?vJ*@I_JAYs$7dM!F5zXHqYxQ+;_@+?_`MsC1_K{qidth44$OG%L=3>e&4{cNT9&T)6qVZv>Bo1N2IyPt*JL}{y zUVI;XN#z^Q7PIKRA!zEOUd5yEWPx{8{ws;Wibp|0!5x)VVLVhq{bXasV z)G#+$29)4&Uf$VOhsm{$-RkxRF!|wpKqM92hhLCGQwK1ho5$?)!-pn!ecrK{^G0j@ z21qapOeHaHMUH`WK=R^UMo`MKQH$!kyNAfHuedM4Ge@8bL>f2tNg1F|dV8-+eZnxV zQnWtg{=z5S46XbZ<_X9XpD~amrjO9XV9NtF;mn$63l<+ygR7V6D|{q=t;OE(B7H}g zaq}GL@q>L9kcmG4fnIfHEIxejlcv+mv5K+g$C!2nge@q627BeUnu|^FVy9}oD&q&; z*rOI;A;E(;IWx;lh*vgptvP5C89tqdx~_~i@Y38ppX?^-2$J}b1qh;Y%Jn@{w)e7l zZ)1giZ!dgsKhe+~N+TKs)|n;Xf%bP8M+-Lc%c=H73q=2I&e-q>Y%!2SSmCXNi?7;w z=yPbK>Iog3TI8&CzNvKel?nZK>E-JEa9F2<-Pe)(WDD~&Ry?z-)8QJ8q@-v4bnU(u=Hvk2Cz;9RN7R9lO8Y7; zyYRi=TIE{J&R^7DfefXT_h;Tg3syPW64csI_=NNIvPIBSwNWkgF59+5QBYYpZRgf_ zL9vX9x^JKH1%nRoIHUwmP)?|iZ&A2;ty*z@kZCLqbeC|qjGJpPL1hnkdq%3(tdeiU z*n}AF`EXC0nz`y7trINE=ZWyZN1XIshN)FiInJdGP70tW`exNPK2+m$RR0!-0jYe` z1X;1rg*!wS2qwg4(hfPmndCvD*D9dwvv^h)AwT?frA)1q#E6@uG&6?6msO+vB@I!Y z7lc>YvJyanQ)l3toYSn1n!O*X%rut$uL*jWEW5gL{)*W!CVdBeN;N{KlA0dCN|MvJ z)ad*6CFy5wldo?~A{sZ=L(-Z+2dr*J4yxxZ0MEd@{_MHKQ4Zlaq(Ei@h8MG3o#csn zlHUkGTZqe*fNC0c;xiV)EXl_tMVG*-)d|!Kjyd-O7-;+0jQt@W%WOsW1U7!-^U}WibO-tE2mdW;|Tg8=m8jVQ;Tnfwsq(*d+}0Z)@T2^{_cBP z+rB7Dp>0>9d(mdREY@mTS4IN~)|*kW>vrZy)$oYVw5}b6D3K75qU13JJIRpDzl%1w z_`SCc)uf!+?D$YKaVK&}X&P*>J=7Fx$Ck^vFi2zUCl2{x6ftw?ENjK{@9i97%CO->;rmf|i(p0+_)GFEX7+V=Hly-2-VO4{cg z=I5&dGeEyo9@$n|q=!V9r7o)N@ksIN`^V3vjWbhi^Qb}dwuH{7e0e=mG?w=-;OU04b%m2IIys_<9<`>MI&{SmmYwaLM;VNu$F8gWLH7L6h!T2a+2Z+D&|<6yo6~E% z+P7YgXL74Q&aXJx32r&RTs;yaB28O*r_I}OGd7Q)PoKGH;#;O97Rs}N-2OUVZDsSo z2*x%>bT?9y9U#vLW6A0u=n6^2Y9T((oXqw=w{8|79bBuF}ISt3_%eotEzwsZILDF5|=nMv*S9)!W)86j%TQz~RC=7(OFbh%i) zBYuj8CD<}jE&o?6GPy2%)MXkni4Ir!XHOr{dCL^lnrQxC^E;A%^V zi&_Ck4$;Mw_-U2_{lmRcmrjE`j}xDXY=PtWtw1lDW~%h-ZiD>8)m0v#ba9fI?acvg z`5lF9nF?dWwV)o`O&?PLLG9X+^QkY0WQGn$g|QFZ4P3rw>@-HRAydV+(KJjHul50N z=t5;@d&`=8ck`<6l)a>~Hmb-Cr&Dm|;FuN33LH9J^*e!5hW~r`33=vJ2&l&Ei_rm1 zxI+??_Jy=KmU41miMhM|_C*H8scp4bx8YZoI@O=`DdR0%@j!?5o`J#xgK$NamVvvt=P+Bo^>bdz}j=!r0as`fLTbr6`w4Y45jp$ftdV0-4)tc1OyKNDI z`PrfN{guAlhn1G+0+AVB$%X8ZRP1CM6xA)y|1S~;GEoPc$-R-t7PT5e5i$FF&bWatB$T^r^_Egk# zVJr9#m_x%_7lxTCV&ot!xzft|yNu`&v;vNYFmj8*4zswLYlX)^P!n`(O(nglzN-In@l`W5QpH&W)Yr}~$NISe4u3fDerV_m zdt7g=M`SNtOkplp6V>c>~E2k0HWUKOD zy!#lFs@}fVIFH4`kh_~-EGEIQs1#^zZGy2lPt9!D(Z{E8rJ1Y{%FT++K8pf(KOR;?G~h>kDL#1 z>su_tzDIhXao?vuSC61n{Z-e34gl1Eqf2R?Oxs>aha=4=PA4-a-R^?lee=#xVRD7~ zILR&Oz~KDt+)Pj!{1^4~m&Q`Z(m&Pn)HhHV%94zeZqymA0gYL^$SS+N|~bq zM4QIpdCl|oDR?kIS1bs`355RhyYs7Jhp0(+3IQNJp7u}gs!MDp=Ome*jJh9iN3p_%?QW82ES><4!Dy*X zT)R2IDmD#01j=D!2s>61(f?QHWztEX$$CBW(C~VC5Ug)1gVtKA^@8IFaG9LFFV{;E z(edYGI^Hm~kZ%+jp!WxrwQ&}0op%D1iIk-Q1h*XPBZCnzB4t0mit1Sq%Q3 zew?%IPqJq_zjt>j+yiBR+n>vbQ&F7k-QGnYBs8-o|FL6P;CxutzFgl|MO_fTlh#&& z_{z#F+#WEkf8##6wru*PdsGLdFJDj(g$a7(K zc{yBIqSf*k|5Xvca6_bniYH;p0TmJ&$(6|~DxAzdiwN^f_QV&Ne`OgT2Ae}g9Dhr8 zljgjFPXB!SW@^SY8;86TwXpb5wL?~AkEM&n$YZ~dD^30-cDj?Jbtr%$t)+;aKIze# zBg!n&DOwD(=7r2J#8J z6zskTkF^0Xm)JwPRa>f=E>H0E#^BQ%{3^NB@f1|!; z_qq}C{pjEuiBr8eDJyX~nChva<|i`9%+pGW-kT@Yu@IFlhno zZ;bsH&)R9WvUbJ8YsiEJtf9|FrdOT)c$^my8=@jM(HEKy`nu{d63lpoeT81NMIPg5 z-2_nt_maany$Kv~4D;taC$|vx7BkgqeWcpZPL2wO$n@o~kK2BQcgsU!zbo7zcBz}S z<$JH|&1hr0`gU{$p{Q9^lQ9@RV!q5IlDQOJv7`B9F|ly4Wyc*rzuXG2CxLS4gC#F} zR`B}(v0(tQ4d{iZ3_`L{cAALaH<@OW+GV@p^-Mkal-2F-hB>Av)TtC|($Wd&L#a%) zkL{O}4+}PIA98%2;gH~PNZD`Z9aW(Mv_XDH;pLh5>~{yM!>&5B25kB+dr|9&>U~uL z-3+(-+P$`a$t5#&*1A#&qWoSfS+?8sPdDS`Qw1`U66&ney9K&-D5&b^>MP+hjyDg> zR7@XrugAB98gxiZreyE?X7`ZlG6bz^zdP>_F24WC2+04~)l%7d!t*2O{CuO>aFgsP zQ@3NQ(snF*A0Q}sNZ#tNyVus99vxWXFWyCBW~(9?UY)<2S4sb%(?BXay)MXhgP z`sd~zH-sfILtYV^9(=G_`iDeu_d^vh^QF6rOjn;iB}4}bO0#l9x7kMqXg}2&_diBH zeMoM-ivstb)TSd&UeV&;d3k&Ea5?^VpaPXGdADWe_sSgSWH#8d3kL;NOkzB@I1cU! zgze|5%k*&y9z`Ad!A6Z7twx>F1U1lC*wjFJxFK zKY3x827rs7$ZR%DY)X9+$a!8l<(z6~?{_1)7@d(uZo8P_OALF#;)!aDI3p%O`CjvVJzYQ3GxNju<>+LC~H8DxUT zF5Ys9{wu=~`cW^sb!M;DQ~o8k5i4l;VBfN7xhghY>M{DCMkhgVHhM*~DhudegLY)AKs}a`{q|{DdOa zEZw3-uJV{DA{FE+WfRQeuowPb#xhSvA&2qS6CSN3HUaNkgP2X84`$ps(CfXCgszbw z)=Sm<0KB;?;axjJ`WLFIC8MYO=jP!RqER!&i`qJT*)p63^)#emEBPJ%?sbEU{eWQ+` zxe6wy_`@Yum}mZtf@jX&`C-%2KeG?E#WQ(5f5LXU3*vpC&M}*~Ow2{x-k%**i~iCu zfxh}gc_>0f{c@d)D1sU0&R%NkI?UkrA(T|<=9>=f$bUp zMekq0GDSqxT5FunMTG6-@#v@MUr5)s98#$SI|OU@UlgP81#ql45?59VmW zK~Wcjm*l{2@#EK;HN;l?9LV}P4xqZqpJ18|>(mykL&4LQy z_*_42Kmv7>c254CXkY>%bIvK7Zl(uoxY zgtVWbW+~?|(NzVY(shCq!~?#Bjr5l+9?V=^t|der!9x!z*T>q|Vc5b0VRKh%oKBp@ z!Q2tjU!{MBs^(lacfTHL>s|OPb<$P#4QxM24Np6jCaF@;zgIe=A7#YCXyy|d7;x{W zh(g0ejNbLS5#E*(Cy!6QTX|U*X9lT9ZQs=Ah=9|Zn%qG}04jy~@c)#cj4WaqR+)HA zfwax1hDR6h^56Lc5xc6_zmo+Xh`Lwx6)Oo0oe^HK?zlHp#pMCTim9iGjfG*8DG_tYwcAn;b!a=vuelX8D#u0FR^iLyKg#1>|jf5qFa*{t5WJJyRjfgmzn-v zfGOaA@v<^msD7uprFPWOu2UOI57|E9OhpO7kj{Bg!fZ$-l*#z=-V)kI-5d2T`j$Sr zc$39c!&H9#GbPB{EA3zZTKGi zDOz=YT{gQZkB|LZ)#5fbn9E3IYfekO2ra5=XiD>l8Q6Dr1L^T0 zG=IX-9Ey&+n*RYAgLFxiTv<5zg?%&AnCxlNp*2NeF>viZH`%nrz2PXV_Mnqn^403! zGVajit>G!V%lS6vaa0-8jNbGdsvRHm##+eZMHhc@)+Ak?WbhMqe|+n@$o8LTa+ju; z=-eDxpq%asqP>jV`c z>y)Gr_t*Bz$@S!OP6nfYc{ILyjZbk0`-4y8lg{8)RR#J?!Uvr+INz;e&g>l{$TMGa3BJfU zA&(}i7*GJ()#s6t|Y{ znT;Dt%mlzh8lDLZJu0vv<5Oz3bv~IJOgbkV))kkwUkNC~6j_ty`YqZKiZ~j4@>3>e zqPnRQWK9)UB;H>nPKj{v2<$xGOd?F>b=rNhy@Dn*ER`u>0X%jo)FIMk<6R?ZK`(L=#M*nz z`nOpkw}aN!!^1#{q`&aUKI0CPaY=R&X^;@(`|^+H5U>XC4TA$UON<1#!yE!MZ2$l|{0dhDQ^KlP%a}X9MmfSEEEsi| z)HF{lNkeI~F~a@~k%awuX{Sf!G5BV%C1QNF*)n~j*I`iuQByKx&;oj@L zH2CFcJ>z@lAbKOf5a8aoVkiq?JL@Ce(H_Dc(F2w)v#P<@J(%aFaua82-R*+XWp&NVOgpCUgKowhYk|u+ zPASTTE{-wJwhAXL3z_M+CL)XD4F;iH(qTYODEk85LX%X4B2(R_=;pNh7w0&B@r>H?#@bUS^n0~8vfd;`)$5U?D^xW7;%fg?Sj zRy~avj&u?9tu}Rn@$TSez*6$sUg8=-X$4LW{4ZS%4&_)m$xk!tSP%SI_e8V+%>j&W ztfVd!`q5{ha@Hry*(Q7)Fy0oV9t(?KnEBPr$(SHbhn;+{r6&k){-Dp$k%K1=u)Yt! F^&e2(q5l8? diff --git a/frontend/public/logo_white.png b/frontend/public/logo_white.png new file mode 100644 index 0000000000000000000000000000000000000000..fdd49f74e532838a31107af77aa3223ebe4cff85 GIT binary patch literal 84800 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 W%(;9o@Y#K!2!p4qpUXO@geCy7nW@A8 literal 0 HcmV?d00001 diff --git a/frontend/src/App.vue b/frontend/src/App.vue index 08bf3d3..601c16a 100644 --- a/frontend/src/App.vue +++ b/frontend/src/App.vue @@ -1,5 +1,5 @@ @@ -219,6 +233,7 @@ const FALLBACK_SYNC_MS = 15000 const STREAM_RETRY_MS = 1500 const PRELIM_ROUND_STAGES = ['prelim_r1', 'prelim_r2', 'prelim_r3'] const FINAL_ROUND_STAGES = ['final_r1', 'final_r2'] +const POSITION_BOARDS = ['preliminary', 'final', 'prelim_tiebreak', 'final_tiebreak'] const loading = ref(true) const mode = ref('live') @@ -247,6 +262,11 @@ const scoreFilters = reactive({ prelim_tiebreak: '', final_tiebreak: '', }) +const stageControl = reactive({ + phase: 'preliminary', + group: '', + round: 1, +}) const liveGroupIndex = ref(0) const liveMode = ref('rotate') @@ -298,6 +318,14 @@ const finalRows = computed(() => state.value.derived?.finalRanking?.rows || []) const podiumRows = computed(() => state.value.derived?.podium || []) const prelimTie = computed(() => state.value.derived?.preliminaryRanking?.tieBreak || { required: false, resolved: true, slots: 0, playerIds: [] }) const finalTie = computed(() => state.value.derived?.finalRanking?.tieBreak || { required: false, resolved: true, slots: 0, playerIds: [] }) +const positionBoards = computed(() => { + const raw = state.value.positionBoards || {} + const out = {} + for (const board of POSITION_BOARDS) { + out[board] = raw[board] || {} + } + return out +}) const canViewProofs = computed(() => Boolean(state.value.settings?.viewProofInView)) const liveSettings = computed(() => { const raw = state.value.settings?.liveMode || {} @@ -320,6 +348,10 @@ const liveSettings = computed(() => { rotationPlayerCount: Number(raw.rotationPlayerCount) > 0 ? Number(raw.rotationPlayerCount) : 12, } }) +const currentStage = computed(() => state.value.current_stage || null) +const lastStage = computed(() => state.value.last_stage || null) +const currentScoringStageKey = computed(() => mapStageSessionToScoreStage(currentStage.value)) +const currentScoringGroupKey = computed(() => mapStageSessionToScoreGroup(currentStage.value)) const viewTabs = computed(() => [ { id: 'groups', label: t('tabs.groups') }, @@ -409,7 +441,8 @@ const liveGroupCode = computed(() => { const liveMembers = computed(() => { const code = normalizedGroupCode(liveGroupCode.value) if (!code) return [] - return playersSorted.value.filter((player) => normalizedGroupCode(player.groupCode) === code) + const rows = playersSorted.value.filter((player) => normalizedGroupCode(player.groupCode) === code) + return sortRowsByPreliminaryPosition(rows) }) const liveMonitorGroupRotationCodes = computed(() => activeGroupCodes.value) @@ -424,7 +457,8 @@ const liveMonitorGroupCode = computed(() => { const liveMonitorMembers = computed(() => { const code = normalizedGroupCode(liveMonitorGroupCode.value) if (!code) return [] - return playersSorted.value.filter((player) => normalizedGroupCode(player.groupCode) === code) + const rows = playersSorted.value.filter((player) => normalizedGroupCode(player.groupCode) === code) + return sortRowsByPreliminaryPosition(rows) }) const liveMonitorFinalGroup = computed(() => { if (liveSettings.value.finalDisplayMode === 'fixed') { @@ -432,17 +466,32 @@ const liveMonitorFinalGroup = computed(() => { } return liveMonitorFinalIndex.value % 2 === 0 ? 1 : 2 }) -const liveMonitorFinalRows = computed(() => (liveMonitorFinalGroup.value === 2 ? finalGroup2.value : finalGroup1.value)) +const finalBoardGroupedRows = computed(() => { + const sorted = sortRowsByBoardPosition('final', adminFinalRows.value) + const grouped = {} + for (const row of sorted) { + const key = positionSlotFor('final', row.playerId)?.groupKey || String(row.finalGroup || 1) + if (!grouped[key]) grouped[key] = [] + grouped[key].push(row) + } + return grouped +}) +const liveMonitorFinalRows = computed(() => { + const key = String(liveMonitorFinalGroup.value === 2 ? 2 : 1) + return finalBoardGroupedRows.value[key] || [] +}) const podiumOrdered = computed(() => [podiumRows.value[1] || null, podiumRows.value[0] || null, podiumRows.value[2] || null]) const prelimTieRows = computed(() => { const ids = new Set(prelimTie.value.playerIds || []) - return preliminaryRows.value.filter((row) => ids.has(row.playerId)) + const rows = preliminaryRows.value.filter((row) => ids.has(row.playerId)) + return sortRowsByBoardPosition('prelim_tiebreak', rows) }) const finalTieRows = computed(() => { const ids = new Set(finalTie.value.playerIds || []) - return finalRows.value.filter((row) => ids.has(row.playerId)) + const rows = finalRows.value.filter((row) => ids.has(row.playerId)) + return sortRowsByBoardPosition('final_tiebreak', rows) }) const playerByID = computed(() => { @@ -483,8 +532,7 @@ const adminPreliminaryRows = computed(() => { rank: derived?.rank ?? 0, } }) - rows.sort(compareRowsByGroupThenId) - return rows + return sortRowsByBoardPosition('preliminary', rows) }) const adminPrelimTieRows = computed(() => { @@ -504,8 +552,7 @@ const adminPrelimTieRows = computed(() => { } }) .filter(Boolean) - rows.sort(compareRowsByScoreGroupThenId) - return rows + return sortRowsByBoardPosition('prelim_tiebreak', rows) }) const adminFinalRows = computed(() => { @@ -525,17 +572,7 @@ const adminFinalRows = computed(() => { } }) - rows.sort((a, b) => { - const groupA = Number(a.finalGroup || 0) - const groupB = Number(b.finalGroup || 0) - if (groupA !== groupB) return groupA - groupB - const seedA = Number(a.seed || 0) - const seedB = Number(b.seed || 0) - if (seedA !== seedB) return seedA - seedB - return a.playerId - b.playerId - }) - - return rows + return sortRowsByBoardPosition('final', rows) }) const adminFinalTieRows = computed(() => { @@ -558,8 +595,29 @@ const adminFinalTieRows = computed(() => { }) .filter(Boolean) - rows.sort(compareRowsByScoreGroupThenId) - return rows + return sortRowsByBoardPosition('final_tiebreak', rows) +}) + +const stageOptions = computed(() => { + const preliminaryGroups = collectUniqueStrings([ + ...assignableGroups.value, + ...activeGroupCodes.value, + ]) + const finalGroups = collectUniqueStrings([ + ...Object.keys(finalBoardGroupedRows.value || {}), + '1', + '2', + ]).filter((value) => value === '1' || value === '2') + + const prelimTieGroups = collectUniqueStrings((adminPrelimTieRows.value || []).map((row) => String(row._boardGroupKey || row.scoreGroup || '1'))) + const finalTieGroups = collectUniqueStrings((adminFinalTieRows.value || []).map((row) => String(row._boardGroupKey || row.scoreGroup || '1'))) + + return { + preliminary: preliminaryGroups, + prelim_tiebreak: prelimTieGroups.length > 0 ? prelimTieGroups : ['1'], + final: finalGroups.length > 0 ? finalGroups : ['1', '2'], + final_tiebreak: finalTieGroups.length > 0 ? finalTieGroups : ['1'], + } }) watch(language, (value) => { @@ -643,6 +701,14 @@ watch( { immediate: true }, ) +watch( + () => `${stageControl.phase}|${JSON.stringify(stageOptions.value)}`, + () => { + applyStageControlDefaults() + }, + { immediate: true }, +) + onMounted(async () => { onFullscreenChange() document.addEventListener('fullscreenchange', onFullscreenChange) @@ -728,7 +794,7 @@ async function toggleFullscreen() { function normalizeLiveActiveView(value) { const normalized = String(value || '').trim().toLowerCase() - const allowed = new Set(['group_live', 'prelim_tie', 'prelim_overall', 'final_groups', 'final_tie', 'podium']) + const allowed = new Set(['group_live', 'prelim_tie', 'prelim_overall', 'final_groups', 'final_tie', 'final_overall', 'podium']) return allowed.has(normalized) ? normalized : 'group_live' } @@ -788,6 +854,116 @@ function compareRowsByScoreGroupThenId(a, b) { return compareRowsByGroupThenId(a, b) } +function positionSlotFor(board, playerId) { + const boardMap = positionBoards.value?.[board] || {} + return boardMap[String(playerId)] || boardMap[playerId] || null +} + +function normalizePositionGroup(board, raw, fallback = '') { + if (board === 'preliminary') { + const normalized = normalizedGroupCode(raw || '') + if (normalized) return normalized + if (String(raw || '').trim().toUpperCase() === 'UNASSIGNED') return 'UNASSIGNED' + return fallback || 'UNASSIGNED' + } + const parsed = Number.parseInt(String(raw || ''), 10) + if (Number.isFinite(parsed) && parsed > 0) return String(parsed) + return fallback || '1' +} + +function normalizePositionValue(raw, fallback = 1) { + const parsed = Number(raw) + if (Number.isFinite(parsed) && parsed > 0) return Math.floor(parsed) + return fallback +} + +function positionGroupSortValue(board, groupKey) { + if (board === 'preliminary') { + if (groupKey === 'UNASSIGNED') return Number.MAX_SAFE_INTEGER - 1 + const idx = assignableGroups.value.indexOf(groupKey) + if (idx >= 0) return idx + return Number.MAX_SAFE_INTEGER + } + return Number.parseInt(String(groupKey || '0'), 10) || Number.MAX_SAFE_INTEGER +} + +function sortRowsByPreliminaryPosition(rows) { + return sortRowsByBoardPosition('preliminary', rows) +} + +function sortRowsByBoardPosition(board, rows) { + const list = Array.isArray(rows) ? rows.slice() : [] + if (list.length <= 1) return list + + const fallbackRows = list.slice() + if (board === 'preliminary') { + fallbackRows.sort(compareRowsByGroupThenId) + } else if (board === 'final') { + fallbackRows.sort((a, b) => { + const groupA = Number(a.finalGroup || 0) + const groupB = Number(b.finalGroup || 0) + if (groupA !== groupB) return groupA - groupB + const seedA = Number(a.seed || 0) + const seedB = Number(b.seed || 0) + if (seedA !== seedB) return seedA - seedB + return Number(a.playerId || a.id || 0) - Number(b.playerId || b.id || 0) + }) + } else { + fallbackRows.sort(compareRowsByScoreGroupThenId) + } + + const fallbackMap = new Map() + const fallbackCountByGroup = new Map() + for (let index = 0; index < fallbackRows.length; index += 1) { + const row = fallbackRows[index] + const playerId = Number(row.playerId || row.id || 0) + let fallbackGroup = '1' + if (board === 'preliminary') { + fallbackGroup = normalizePositionGroup(board, row.groupCode, 'UNASSIGNED') + } else if (board === 'final') { + fallbackGroup = normalizePositionGroup(board, row.finalGroup, '1') + } else if (board === 'prelim_tiebreak' || board === 'final_tiebreak') { + const scoreGroup = Number.parseInt(String(row.scoreGroup || ''), 10) + const finalGroup = Number.parseInt(String(row.finalGroup || ''), 10) + if (Number.isFinite(scoreGroup) && scoreGroup > 0) { + fallbackGroup = String(scoreGroup) + } else if (Number.isFinite(finalGroup) && finalGroup > 0) { + fallbackGroup = String(finalGroup) + } else { + fallbackGroup = '1' + } + } else { + fallbackGroup = '1' + } + const nextPos = (fallbackCountByGroup.get(fallbackGroup) || 0) + 1 + fallbackCountByGroup.set(fallbackGroup, nextPos) + fallbackMap.set(playerId, { groupKey: fallbackGroup, position: nextPos, index }) + } + + return list + .map((row) => { + const playerId = Number(row.playerId || row.id || 0) + const fallback = fallbackMap.get(playerId) || { groupKey: '1', position: Number.MAX_SAFE_INTEGER, index: Number.MAX_SAFE_INTEGER } + const slot = positionSlotFor(board, playerId) + const groupKey = normalizePositionGroup(board, slot?.groupKey, fallback.groupKey) + const position = normalizePositionValue(slot?.position, fallback.position) + return { row, groupKey, position, fallbackIndex: fallback.index } + }) + .sort((a, b) => { + const groupOrderA = positionGroupSortValue(board, a.groupKey) + const groupOrderB = positionGroupSortValue(board, b.groupKey) + if (groupOrderA !== groupOrderB) return groupOrderA - groupOrderB + if (a.groupKey !== b.groupKey) return String(a.groupKey).localeCompare(String(b.groupKey)) + if (a.position !== b.position) return a.position - b.position + return a.fallbackIndex - b.fallbackIndex + }) + .map((entry) => ({ + ...entry.row, + _boardGroupKey: entry.groupKey, + _boardPosition: entry.position, + })) +} + function saveGroupSetup() { const parsed = parseGroupList(groupSetupInput.value) primaryGroups.value = parsed.length > 0 ? parsed : DEFAULT_PRIMARY_GROUPS @@ -829,6 +1005,22 @@ function updateScoreFilter({ stage, value }) { scoreFilters[stage] = value } +async function savePositionBoard(payload) { + const board = String(payload?.board || '').trim().toLowerCase() + if (!POSITION_BOARDS.includes(board)) return + const slots = Array.isArray(payload?.slots) ? payload.slots : [] + + try { + state.value = await api(`/admin/positions/${board}`, { + method: 'PUT', + admin: true, + body: { slots }, + }) + } catch (error) { + showToast(`${t('messages.errorPrefix')}: ${error.message}`, 'error') + } +} + async function autoGroupEvenly() { if (primaryGroups.value.length === 0) { showToast(t('messages.noGroupsConfigured'), 'error') @@ -990,6 +1182,139 @@ async function updateLiveModeSetting(patch) { await updateAdminSettings({ liveMode: patch }) } +function collectUniqueStrings(values) { + const set = new Set() + for (const raw of values || []) { + const value = String(raw || '').trim() + if (!value) continue + set.add(value) + } + return [...set].sort((a, b) => a.localeCompare(b, undefined, { numeric: true })) +} + +function stageRoundMax(phase) { + if (phase === 'preliminary') return 3 + if (phase === 'final') return 2 + return 1 +} + +function mapStageSessionToScoreStage(stage) { + if (!stage || typeof stage !== 'object') return '' + const phase = String(stage.phase || '').trim().toLowerCase() + const round = Number(stage.round || 1) + if (phase === 'preliminary') return `prelim_r${Math.min(3, Math.max(1, Math.floor(round || 1)))}` + if (phase === 'final') return `final_r${Math.min(2, Math.max(1, Math.floor(round || 1)))}` + if (phase === 'prelim_tiebreak') return 'prelim_tiebreak' + if (phase === 'final_tiebreak') return 'final_tiebreak' + return '' +} + +function mapStageSessionToScoreGroup(stage) { + if (!stage || typeof stage !== 'object') return '' + const phase = String(stage.phase || '').trim().toLowerCase() + const rawGroup = String(stage.group || '').trim() + if (!rawGroup) return '' + if (phase === 'preliminary') { + if (rawGroup.toUpperCase() === 'UNASSIGNED') return 'UNASSIGNED' + return normalizedGroupCode(rawGroup) + } + const parsed = Number.parseInt(rawGroup, 10) + if (Number.isFinite(parsed) && parsed > 0) return String(parsed) + return rawGroup +} + +function mapStagePhaseToAdminTab(phase) { + const normalized = String(phase || '').trim().toLowerCase() + if (normalized === 'preliminary') return 'preliminary' + if (normalized === 'prelim_tiebreak') return 'prelimTie' + if (normalized === 'final') return 'final' + if (normalized === 'final_tiebreak') return 'finalTie' + return '' +} + +function applyStageControlDefaults() { + const phase = String(stageControl.phase || 'preliminary').trim().toLowerCase() + if (!['preliminary', 'prelim_tiebreak', 'final', 'final_tiebreak'].includes(phase)) { + stageControl.phase = 'preliminary' + } else { + stageControl.phase = phase + } + + const maxRound = stageRoundMax(stageControl.phase) + const round = Number(stageControl.round || 1) + stageControl.round = Math.min(maxRound, Math.max(1, Number.isFinite(round) ? Math.floor(round) : 1)) + + const options = stageOptions.value?.[stageControl.phase] || [] + if (options.length === 0) { + stageControl.group = '' + return + } + const current = String(stageControl.group || '').trim() + if (!options.includes(current)) { + stageControl.group = options[0] + } +} + +function updateStageControl(patch) { + if (!patch || typeof patch !== 'object') return + if (Object.prototype.hasOwnProperty.call(patch, 'phase')) { + stageControl.phase = String(patch.phase || 'preliminary').trim().toLowerCase() + } + if (Object.prototype.hasOwnProperty.call(patch, 'group')) { + stageControl.group = String(patch.group || '').trim() + } + if (Object.prototype.hasOwnProperty.call(patch, 'round')) { + stageControl.round = Number(patch.round || 1) + } + applyStageControlDefaults() +} + +async function startCurrentStage() { + applyStageControlDefaults() + if (!stageControl.group) { + showToast(t('messages.noGroupForPhase'), 'error') + return + } + try { + state.value = await api('/admin/stage/start', { + method: 'POST', + admin: true, + body: { + phase: stageControl.phase, + group: stageControl.group, + round: stageControl.round, + }, + }) + showToast(t('messages.saved')) + } catch (error) { + showToast(`${t('messages.errorPrefix')}: ${error.message}`, 'error') + } +} + +async function endCurrentStage() { + try { + state.value = await api('/admin/stage/end', { + method: 'POST', + admin: true, + }) + showToast(t('messages.saved')) + } catch (error) { + showToast(`${t('messages.errorPrefix')}: ${error.message}`, 'error') + } +} + +function navigateToCurrentStage() { + const active = currentStage.value + if (!active) { + showToast(t('labels.noCurrentStage'), 'error') + return + } + const nextTab = mapStagePhaseToAdminTab(active.phase) + if (nextTab) { + adminTab.value = nextTab + } +} + async function createPlayer() { if (!newPlayer.nameAr || !newPlayer.nameEn) { showToast(t('messages.mustProvideNames'), 'error') diff --git a/frontend/src/components/AdminPanel.vue b/frontend/src/components/AdminPanel.vue index 52ecb4b..d2e9fd1 100644 --- a/frontend/src/components/AdminPanel.vue +++ b/frontend/src/components/AdminPanel.vue @@ -59,7 +59,20 @@

{{ t('liveMode') }}

{{ t('labels.liveModeVisibility') }}

- +
@@ -81,6 +94,18 @@ /> + + {{ t('actions.resetScores') }} + + @@ -174,6 +219,18 @@ /> + + {{ t('actions.resetScores') }} + + @@ -287,6 +364,7 @@ import PlayersManagementTab from './admin/PlayersManagementTab.vue' import ScoreStageEditor from './admin/ScoreStageEditor.vue' import LiveSettingsCard from './admin/LiveSettingsCard.vue' import MultiRoundScoreEditor from './admin/MultiRoundScoreEditor.vue' +import PositionBoardEditor from './admin/PositionBoardEditor.vue' defineProps({ t: { type: Function, required: true }, @@ -294,6 +372,12 @@ defineProps({ adminTab: { type: String, required: true }, viewProofInView: { type: Boolean, default: false }, liveSettings: { type: Object, required: true }, + stageControl: { type: Object, required: true }, + stageOptions: { type: Object, required: true }, + currentStage: { type: Object, default: null }, + lastStage: { type: Object, default: null }, + activeScoringStage: { type: String, default: '' }, + activeScoringGroup: { type: String, default: '' }, groupSetupInput: { type: String, default: '' }, adminGroupCards: { type: Array, required: true }, newPlayer: { type: Object, required: true }, @@ -313,6 +397,7 @@ defineProps({ finalTotalScore: { type: Function, required: true }, prelimTie: { type: Object, required: true }, finalTie: { type: Object, required: true }, + positionBoards: { type: Object, required: true }, scoreFilters: { type: Object, required: true }, displayName: { type: Function, required: true }, secondaryName: { type: Function, required: true }, @@ -334,6 +419,10 @@ defineEmits([ 'logout', 'toggle-view-proof', 'update-live-setting', + 'update-stage-control', + 'start-stage', + 'end-stage', + 'navigate-current-stage', 'change-admin-tab', 'update:group-setup-input', 'save-group-setup', @@ -350,6 +439,7 @@ defineEmits([ 'remove-player-image', 'delete-player', 'request-reset-stage', + 'save-position-board', 'update-score-filter', ]) diff --git a/frontend/src/components/AppHeader.vue b/frontend/src/components/AppHeader.vue index 5c555a3..be4480e 100644 --- a/frontend/src/components/AppHeader.vue +++ b/frontend/src/components/AppHeader.vue @@ -3,8 +3,8 @@
- - + +

{{ t('subtitle') }}

@@ -52,7 +52,7 @@

{{ t('labels.mode') }}

- +
diff --git a/frontend/src/components/LiveModePanel.vue b/frontend/src/components/LiveModePanel.vue index 2fbe4ae..580d79a 100644 --- a/frontend/src/components/LiveModePanel.vue +++ b/frontend/src/components/LiveModePanel.vue @@ -31,7 +31,7 @@ - + @@ -40,8 +40,8 @@ - - + +
{{ t('table.rank') }}{{ t('table.position') }} {{ t('table.competitor') }} {{ t('table.round1') }} {{ t('table.round2') }}
{{ entry.rank }}
{{ index + 1 }}
@@ -69,41 +69,42 @@

{{ t('sections.prelimTieTitle') }}

{{ t('table.tieScore') }} - {{ currentListPageDisplay }} + {{ currentTieGroupPageDisplay }}
-
+
+

{{ t('labels.group') }} {{ activePrelimTieGroup.groupKey }}

- + - - + + - + -
#{{ t('table.position') }} {{ t('table.competitor') }} {{ t('table.tieScore') }}
{{ listPageStart + index + 1 }}
{{ entry.position }}
- +
-

{{ displayName(row) }}

-

{{ secondaryName(row) }}

+

{{ displayName(entry.row) }}

+

{{ secondaryName(entry.row) }}

{{ row.tieBreak }}{{ entry.row.tieBreak }}
{{ t('messages.noPrelimTie') }}
-
+
+
{{ t('messages.noPrelimTie') }}
@@ -173,7 +174,7 @@ - + @@ -181,8 +182,8 @@ - - + +
{{ t('table.rank') }}{{ t('table.position') }} {{ t('table.competitor') }} {{ t('table.round1') }} {{ t('table.round2') }}
{{ entry.rank }}
{{ index + 1 }}
@@ -209,24 +210,67 @@

{{ t('sections.finalTieTitle') }}

{{ t('table.tieScore') }} - {{ currentListPageDisplay }} + {{ currentTieGroupPageDisplay }}
-
+
+

{{ t('labels.group') }} {{ activeFinalTieGroup.groupKey }}

- + - - + + + + + + +
#{{ t('table.position') }} {{ t('table.competitor') }} {{ t('table.tieScore') }}
{{ listPageStart + index + 1 }}
{{ entry.position }} +
+ +
+

{{ displayName(entry.row) }}

+

{{ secondaryName(entry.row) }}

+
+
+
{{ entry.row.tieBreak }}
+
+
+ +
{{ t('messages.noFinalTie') }}
+ + +
+
+

{{ t('sections.finalRanking') }}

+
+ {{ currentListPageDisplay }} +
+
+ + +
+
+ + + + + + + + + + + + - + + - +
{{ t('table.rank') }}{{ t('table.competitor') }}{{ t('table.total') }}{{ t('table.tieScore') }}
{{ row.rank }}
@@ -236,9 +280,10 @@
{{ row.tieBreak }}{{ row.score }}{{ row.tieBreak }}
{{ t('messages.noFinalTie') }}
{{ t('labels.noFinalists') }}
@@ -291,20 +336,23 @@
+ +
+ + + + + + + +
- -
- - - - -
@@ -314,6 +362,7 @@ import { computed, onBeforeUnmount, ref, watch } from 'vue' const props = defineProps({ t: { type: Function, required: true }, liveSettings: { type: Object, required: true }, + positionBoards: { type: Object, default: () => ({}) }, liveGroupCode: { type: String, default: '' }, liveGroupMembers: { type: Array, required: true }, prelimTieRows: { type: Array, required: true }, @@ -321,6 +370,7 @@ const props = defineProps({ finalists: { type: Array, required: true }, liveFinalGroup: { type: Number, required: true }, liveFinalRows: { type: Array, required: true }, + finalOverallRows: { type: Array, required: true }, finalTieRows: { type: Array, required: true }, podiumOrdered: { type: Array, required: true }, playerImage: { type: Function, required: true }, @@ -339,7 +389,9 @@ const props = defineProps({ const finalistIds = computed(() => new Set((props.finalists || []).map((row) => row.playerId))) const activeView = computed(() => props.liveSettings.activeView || 'group_live') const listPageIndex = ref(0) +const tieGroupIndex = ref(0) let listRotationTimer = null +let tieRotationTimer = null const rotationIntervalSec = computed(() => { const raw = Number(props.liveSettings.rotationIntervalSec || 5) @@ -356,9 +408,8 @@ const rotationPlayerCount = computed(() => { }) const listRowsForActiveView = computed(() => { - if (activeView.value === 'prelim_tie') return props.prelimTieRows || [] if (activeView.value === 'prelim_overall') return props.preliminaryRows || [] - if (activeView.value === 'final_tie') return props.finalTieRows || [] + if (activeView.value === 'final_overall') return props.finalOverallRows || [] return [] }) @@ -368,30 +419,37 @@ const listPageCount = computed(() => { return Math.max(1, Math.ceil(total / rotationPlayerCount.value)) }) -const listPageStart = computed(() => listPageIndex.value * rotationPlayerCount.value) const currentListPageDisplay = computed(() => `${listPageIndex.value + 1} / ${listPageCount.value}`) -const pagedPrelimTieRows = computed(() => paginateRows(props.prelimTieRows || [])) const pagedPreliminaryRows = computed(() => paginateRows(props.preliminaryRows || [])) -const pagedFinalTieRows = computed(() => paginateRows(props.finalTieRows || [])) +const pagedFinalOverallRows = computed(() => paginateRows(props.finalOverallRows || [])) +const groupedPrelimTieRows = computed(() => groupTieRowsByPositionBoard('prelim_tiebreak', props.prelimTieRows || [])) +const groupedFinalTieRows = computed(() => groupTieRowsByPositionBoard('final_tiebreak', props.finalTieRows || [])) +const tieGroupCountForActiveView = computed(() => { + if (activeView.value === 'prelim_tie') return groupedPrelimTieRows.value.length + if (activeView.value === 'final_tie') return groupedFinalTieRows.value.length + return 0 +}) +const currentTieGroupPageDisplay = computed(() => { + const total = tieGroupCountForActiveView.value + if (total <= 0) return '0 / 0' + return `${(tieGroupIndex.value % total) + 1} / ${total}` +}) +const activePrelimTieGroup = computed(() => { + const groups = groupedPrelimTieRows.value + if (groups.length === 0) return null + return groups[tieGroupIndex.value % groups.length] +}) +const activeFinalTieGroup = computed(() => { + const groups = groupedFinalTieRows.value + if (groups.length === 0) return null + return groups[tieGroupIndex.value % groups.length] +}) const rankedLiveGroupMembers = computed(() => { - const rows = (props.liveGroupMembers || []).map((player) => ({ + return (props.liveGroupMembers || []).map((player) => ({ player, total: Number(props.prelimTotal(player.id) || 0), })) - rows.sort((a, b) => { - if (a.total !== b.total) return b.total - a.total - return a.player.id - b.player.id - }) - - let prevTotal = null - let prevRank = 0 - return rows.map((entry, idx) => { - const rank = prevTotal === entry.total ? prevRank : idx + 1 - prevTotal = entry.total - prevRank = rank - return { ...entry, rank } - }) }) const activeViewLabel = computed(() => { @@ -401,6 +459,7 @@ const activeViewLabel = computed(() => { prelim_overall: props.t('labels.liveViewPrelimOverall'), final_groups: props.t('labels.liveViewFinalGroups'), final_tie: props.t('labels.liveViewFinalTie'), + final_overall: props.t('labels.liveViewFinalOverall'), podium: props.t('labels.liveViewPodium'), } return map[activeView.value] || map.group_live @@ -419,27 +478,10 @@ const groupClassKey = computed(() => { return 'u' }) const rankedLiveFinalRows = computed(() => { - const rows = (props.liveFinalRows || []).map((row) => ({ + return (props.liveFinalRows || []).map((row) => ({ row, total: Number(props.finalTotal(row.playerId) || 0), })) - - rows.sort((a, b) => { - if (a.total !== b.total) return b.total - a.total - const seedA = Number(a.row.seed || 0) - const seedB = Number(b.row.seed || 0) - if (seedA !== seedB) return seedA - seedB - return a.row.playerId - b.row.playerId - }) - - let prevTotal = null - let prevRank = 0 - return rows.map((entry, idx) => { - const rank = prevTotal === entry.total ? prevRank : idx + 1 - prevTotal = entry.total - prevRank = rank - return { ...entry, rank } - }) }) function isFinalist(playerId) { @@ -448,15 +490,17 @@ function isFinalist(playerId) { watch( () => - `${activeView.value}|${rotationIntervalSec.value}|${rotationPlayerCount.value}|${props.prelimTieRows.length}|${props.preliminaryRows.length}|${props.finalTieRows.length}`, + `${activeView.value}|${rotationIntervalSec.value}|${rotationPlayerCount.value}|${props.prelimTieRows.length}|${props.preliminaryRows.length}|${props.finalOverallRows.length}|${props.finalTieRows.length}`, () => { restartListRotation() + restartTieRotation() }, { immediate: true }, ) onBeforeUnmount(() => { stopListRotation() + stopTieRotation() }) function paginateRows(rows) { @@ -468,7 +512,7 @@ function restartListRotation() { stopListRotation() listPageIndex.value = 0 - const autoRotateView = activeView.value === 'prelim_tie' || activeView.value === 'prelim_overall' || activeView.value === 'final_tie' + const autoRotateView = activeView.value === 'prelim_overall' || activeView.value === 'final_overall' if (!autoRotateView) return if (listPageCount.value <= 1) return @@ -487,4 +531,62 @@ function stopListRotation() { listRotationTimer = null } } + +function restartTieRotation() { + stopTieRotation() + tieGroupIndex.value = 0 + + const total = tieGroupCountForActiveView.value + if (total <= 1) return + if (activeView.value !== 'prelim_tie' && activeView.value !== 'final_tie') return + + tieRotationTimer = setInterval(() => { + if (tieGroupCountForActiveView.value <= 1) { + tieGroupIndex.value = 0 + return + } + tieGroupIndex.value = (tieGroupIndex.value + 1) % tieGroupCountForActiveView.value + }, rotationIntervalSec.value * 1000) +} + +function stopTieRotation() { + if (tieRotationTimer) { + clearInterval(tieRotationTimer) + tieRotationTimer = null + } +} + +function boardSlot(board, playerId) { + const boardMap = props.positionBoards?.[board] || {} + return boardMap[String(playerId)] || boardMap[playerId] || null +} + +function groupTieRowsByPositionBoard(board, rows) { + const mapped = (rows || []).map((row, index) => { + const slot = boardSlot(board, row.playerId) + const fallbackGroup = String(Math.floor(index / 6) + 1) + const fallbackPos = (index % 6) + 1 + const groupKeyRaw = String(slot?.groupKey || fallbackGroup).trim() + const parsedGroup = Number.parseInt(groupKeyRaw, 10) + const groupKey = Number.isFinite(parsedGroup) && parsedGroup > 0 ? String(parsedGroup) : fallbackGroup + const position = Number(slot?.position) > 0 ? Math.floor(Number(slot.position)) : fallbackPos + return { row, groupKey, position } + }) + + const groups = new Map() + for (const entry of mapped) { + if (!groups.has(entry.groupKey)) groups.set(entry.groupKey, []) + groups.get(entry.groupKey).push(entry) + } + + return [...groups.entries()] + .sort((a, b) => Number(a[0]) - Number(b[0])) + .map(([groupKey, items]) => ({ + groupKey, + rows: items.sort((a, b) => { + if (a.position !== b.position) return a.position - b.position + return a.row.playerId - b.row.playerId + }), + })) +} diff --git a/frontend/src/components/admin/LiveSettingsCard.vue b/frontend/src/components/admin/LiveSettingsCard.vue index b004ab5..4aa6c49 100644 --- a/frontend/src/components/admin/LiveSettingsCard.vue +++ b/frontend/src/components/admin/LiveSettingsCard.vue @@ -12,6 +12,7 @@ + @@ -77,19 +78,126 @@ @change="emitPatch({ rotationPlayerCount: Number($event.target.value) || 12 })" /> + +
+ +
+ +
+
+

{{ t('labels.stagePhase') }}

+ +
+
+

{{ t('labels.stageGroup') }}

+ +
+
+

{{ t('labels.stageRound') }}

+ +
+
+

{{ selectedStageSummary }}

+
+ + +
+
+ +
+
+

{{ t('labels.currentStage') }}

+ +

{{ t('labels.noCurrentStage') }}

+
+
+

{{ t('labels.lastStage') }}

+ +

{{ t('labels.noLastStage') }}

+
+
diff --git a/frontend/src/components/admin/MultiRoundScoreEditor.vue b/frontend/src/components/admin/MultiRoundScoreEditor.vue index a68523f..f32bd47 100644 --- a/frontend/src/components/admin/MultiRoundScoreEditor.vue +++ b/frontend/src/components/admin/MultiRoundScoreEditor.vue @@ -9,24 +9,102 @@ /> -
- - - - - - - - - - - - - - - - -
#{{ t('table.competitor') }}{{ t('table.group') }}{{ t('table.rank') }}{{ t('table.seed') }}{{ round.label }}{{ t('table.total') }}{{ t('table.verification') }}
{{ index + 1 }} +
+ +
{{ section.label }} > {{ overflowLimit }}
+ +
-
-
-
-
- -
-

{{ displayName(row) }}

-

{{ secondaryName(row) }}

-
-
-
#{{ index + 1 }}
-
- -
- {{ t('table.group') }}: {{ groupCell(row) }} - {{ t('table.rank') }}: {{ row.rank }} - {{ t('table.seed') }}: {{ row.seed }} -
- -
- -
- -
- {{ t('table.total') }} - {{ totalScore(row.playerId) }} -
- -
-

{{ t('table.verification') }}

-
-
- {{ round.label }} - - -
-
-
-
-
{{ t('labels.noPlayers') }}
-
+
{{ t('labels.noPlayers') }}
diff --git a/frontend/src/components/admin/PlayersManagementTab.vue b/frontend/src/components/admin/PlayersManagementTab.vue index ab9f0d3..9ced54e 100644 --- a/frontend/src/components/admin/PlayersManagementTab.vue +++ b/frontend/src/components/admin/PlayersManagementTab.vue @@ -83,10 +83,15 @@

{{ group.label }}

- {{ group.players.length }} +
+ {{ group.players.length }} + +
-
+
@@ -131,14 +136,14 @@
-
{{ t('labels.noPlayers') }}
+
{{ t('labels.noPlayers') }}
diff --git a/frontend/src/components/admin/ScoreStageEditor.vue b/frontend/src/components/admin/ScoreStageEditor.vue index 9fec1ff..6f4590b 100644 --- a/frontend/src/components/admin/ScoreStageEditor.vue +++ b/frontend/src/components/admin/ScoreStageEditor.vue @@ -9,24 +9,94 @@ /> -
- - - - - - - - - - - - - - - - -
#{{ t('table.competitor') }}{{ t('table.group') }}{{ t('table.score') }}{{ inputLabel }}{{ t('table.verification') }}{{ t('table.rank') }}{{ t('table.seed') }}
{{ index + 1 }} +
+ + +
+ +
{{ t('labels.noPlayers') }}
diff --git a/frontend/src/constants/i18n.js b/frontend/src/constants/i18n.js index b1fa4f3..a10fa2d 100644 --- a/frontend/src/constants/i18n.js +++ b/frontend/src/constants/i18n.js @@ -41,6 +41,7 @@ export const I18N = { liveViewPrelimOverall: 'الترتيب العام للتمهيدي', liveViewFinalGroups: 'شاشة مجموعات النهائي', liveViewFinalTie: 'كسر تعادل النهائي', + liveViewFinalOverall: 'الترتيب العام للنهائي', liveViewPodium: 'منصة التتويج', showGroupLive: 'إظهار شاشة المجموعات الحية', showPrelimTie: 'إظهار كسر تعادل التمهيدي', @@ -57,6 +58,21 @@ export const I18N = { currentScore: 'النتيجة الحالية', aiSuggestedScore: 'النتيجة المقترحة', confidence: 'مستوى الثقة', + stageControl: 'المرحلة الحالية', + stagePhase: 'الطور', + stageGroup: 'المجموعة', + stageRound: 'الجولة', + currentStage: 'المرحلة الجارية', + lastStage: 'آخر مرحلة', + startedAt: 'بدأت', + endedAt: 'انتهت', + noCurrentStage: 'لا توجد مرحلة جارية', + noLastStage: 'لا توجد مرحلة سابقة', + phasePreliminary: 'التمهيدي', + phasePrelimTie: 'كسر تعادل التمهيدي', + phaseFinal: 'النهائي', + phaseFinalTie: 'كسر تعادل النهائي', + groupAssignment: 'توزيع المجموعات', }, sections: { groupsTitle: 'عرض اللاعبين والمجموعات', @@ -93,6 +109,7 @@ export const I18N = { competitor: 'اللاعب', group: 'المجموعة', rank: 'الترتيب', + position: 'الموضع', score: 'النتيجة', total: 'المجموع', round1: 'جولة 1', @@ -142,6 +159,9 @@ export const I18N = { liveModeFixed: 'ثابت', enterFullscreen: 'دخول ملء الشاشة', exitFullscreen: 'الخروج من ملء الشاشة', + startStage: 'بدء المرحلة', + endStage: 'إنهاء المرحلة', + goToStageScoring: 'الانتقال إلى إدخال نتائج المرحلة', }, auth: { username: 'اسم المستخدم', @@ -176,6 +196,7 @@ export const I18N = { noNameToConvert: 'لا يوجد اسم للتحويل.', aiAnalyzing: 'جاري تحليل الصورة بالذكاء الاصطناعي...', noProofForAi: 'لا توجد صورة إثبات لتحليلها.', + noGroupForPhase: 'لا توجد مجموعات متاحة لهذا الطور.', }, }, en: { @@ -220,6 +241,7 @@ export const I18N = { liveViewPrelimOverall: 'Preliminary overall', liveViewFinalGroups: 'Final groups board', liveViewFinalTie: 'Final tie-break', + liveViewFinalOverall: 'Final overall ranking', liveViewPodium: 'Podium', showGroupLive: 'Show live group board', showPrelimTie: 'Show preliminary tie-break', @@ -236,6 +258,21 @@ export const I18N = { currentScore: 'Current score', aiSuggestedScore: 'AI suggested score', confidence: 'Confidence', + stageControl: 'Current Stage Control', + stagePhase: 'Phase', + stageGroup: 'Group', + stageRound: 'Round', + currentStage: 'Current Stage', + lastStage: 'Last Stage', + startedAt: 'Started', + endedAt: 'Ended', + noCurrentStage: 'No active stage', + noLastStage: 'No previous stage', + phasePreliminary: 'Preliminary', + phasePrelimTie: 'Preliminary Tie-Break', + phaseFinal: 'Final', + phaseFinalTie: 'Final Tie-Break', + groupAssignment: 'Group Assignment', }, sections: { groupsTitle: 'Players & Groups Overview', @@ -272,6 +309,7 @@ export const I18N = { competitor: 'Player', group: 'Group', rank: 'Rank', + position: 'Position', score: 'Score', total: 'Total', round1: 'Round 1', @@ -321,6 +359,9 @@ export const I18N = { liveModeFixed: 'Fixed', enterFullscreen: 'Enter Fullscreen', exitFullscreen: 'Exit Fullscreen', + startStage: 'Start Stage', + endStage: 'End Stage', + goToStageScoring: 'Go To Stage Scoring', }, auth: { username: 'Username', @@ -355,6 +396,7 @@ export const I18N = { noNameToConvert: 'No name available to convert.', aiAnalyzing: 'Analyzing image with AI...', noProofForAi: 'No proof image available to analyze.', + noGroupForPhase: 'No groups available for this phase.', }, }, } @@ -398,6 +440,8 @@ export function createInitialState() { finalRanking: { rows: [], tieBreak: { required: false, resolved: true, slots: 0, playerIds: [] } }, podium: [], }, + current_stage: null, + last_stage: null, serverTime: '', } } diff --git a/frontend/src/style.css b/frontend/src/style.css index e0c0588..3b7a23c 100644 --- a/frontend/src/style.css +++ b/frontend/src/style.css @@ -43,6 +43,30 @@ body { min-height: 100vh; } +.app-shell.mode-live { + background: #0d1931; +} + +.app-shell.mode-live .masthead { + background: #0d1931; + border-bottom: 1px solid rgba(0, 140, 168, 0.45); + box-shadow: none; +} + +.app-shell.mode-live .masthead::after { + height: 3px; + background: #ed2e23; +} + +.app-shell.mode-live .masthead-title, +.app-shell.mode-live .masthead-subtitle { + color: #ffffff; +} + +.app-shell.mode-live .page-content { + padding-top: 18px; +} + .hidden-file-input { display: none; } @@ -387,6 +411,107 @@ body { gap: 8px; } +.live-settings-divider { + border: 0; + border-top: 1px dashed #d4deef; + margin: 14px 0 10px; +} + +.stage-control-grid { + grid-template-columns: 1.1fr 1fr 0.8fr; + display: grid; + gap: 8px; +} + +.stage-select-card { + border: 1px solid #d4deef; + border-radius: 10px; + background: #fff; + padding: 8px; +} + +.stage-select-label { + margin: 0 0 6px; + font-size: 11px; + letter-spacing: 0.5px; + text-transform: uppercase; + color: #5d6d8e; + font-weight: 800; +} + +.stage-selection-preview { + margin: 8px 0 0; + padding: 8px 10px; + border-radius: 9px; + background: #f4f8ff; + color: #244372; + font-size: 12px; + font-weight: 700; +} + +.stage-action-row { + margin-top: 10px; +} + +.stage-start-btn { + min-width: 158px; + box-shadow: 0 8px 18px rgba(0, 140, 168, 0.26); +} + +.stage-start-btn:disabled { + background: #e7edf8; + color: #6e7f9f; + border-color: #d0d9ea; + box-shadow: none; +} + +.stage-status-grid { + margin-top: 8px; + display: grid; + grid-template-columns: repeat(2, minmax(0, 1fr)); + gap: 8px; +} + +.stage-status-card { + border: 1px solid #d4deef; + border-radius: 10px; + padding: 10px; + background: #fff; +} + +.stage-status-title { + margin: 0; + font-size: 12px; + color: var(--muted); + font-weight: 700; +} + +.stage-status-main { + margin: 6px 0 0; + font-size: 13px; + font-weight: 800; + color: var(--navy); +} + +.stage-status-sub { + margin: 4px 0 0; + font-size: 11px; + color: #5c6a86; + font-family: "IBM Plex Mono", monospace; +} + +.stage-status-empty { + margin: 6px 0 0; + font-size: 13px; + color: var(--muted); + font-weight: 700; +} + +.stage-status-actions { + margin-top: 8px; + margin-bottom: 0; +} + .switch-row { display: inline-flex; align-items: center; @@ -816,6 +941,24 @@ body { font-weight: 800; } +.group-card-head-actions { + display: inline-flex; + align-items: center; + gap: 8px; +} + +.group-card-toggle { + border: 1px solid #d5deef; + background: #fff; + color: #2f4063; + border-radius: 8px; + min-width: 28px; + height: 28px; + font-weight: 800; + line-height: 1; + cursor: pointer; +} + .pm-count-badge { display: inline-flex; align-items: center; @@ -939,6 +1082,17 @@ select.name-input { animation: score-over-limit-blink 0.7s ease-in-out infinite; } +.stage-column-highlight { + background: linear-gradient(180deg, rgba(0, 140, 168, 0.08) 0%, rgba(13, 25, 49, 0.04) 100%); + border-top: 2px solid rgba(0, 140, 168, 0.35); +} + +.score-input-stage-highlight { + border-color: #0d8a64; + background: linear-gradient(180deg, #effaf6 0%, #e8f6ff 100%); + box-shadow: inset 0 0 0 1px rgba(13, 138, 100, 0.18); +} + @keyframes score-over-limit-blink { 0%, 100% { @@ -1049,7 +1203,7 @@ select.name-input { } .live-panel { - background: radial-gradient(circle at 15% 10%, #1a2653 0%, #101736 55%, #0b1026 100%); + background: #0d1931; color: #fff; min-height: 70vh; position: relative; @@ -1067,7 +1221,7 @@ select.name-input { text-align: center; font-size: 30px; font-weight: 800; - color: #f1cf7a; + color: #ffffff; } .live-subtitle { @@ -1156,7 +1310,7 @@ select.name-input { height: 5px; width: 100%; border-radius: 999px; - background: linear-gradient(90deg, var(--red), #f66f67); + background: #ed2e23; animation: progress-5s linear; } @@ -1173,9 +1327,10 @@ select.name-input { .live-mode-root { position: relative; - --live-footer-height: 74px; - --live-footer-offset: 16px; - padding-bottom: calc(var(--live-footer-height) + var(--live-footer-offset) + env(safe-area-inset-bottom)); + --live-navy: #0d1931; + --live-blue: #008ca8; + --live-red: #ed2e23; + --live-white: #ffffff; } .live-mode-shell { @@ -1183,29 +1338,30 @@ select.name-input { min-height: 72vh; border-radius: 18px; overflow: hidden; - background-size: contain; - background-position: center; - background-repeat: no-repeat; - border: 1px solid rgba(255, 255, 255, 0.25); - box-shadow: 0 16px 38px rgba(7, 19, 42, 0.24); + display: grid; + grid-template-rows: 1fr auto; + border: 1px solid rgba(0, 140, 168, 0.5); + box-shadow: 0 22px 44px rgba(0, 0, 0, 0.45); + background: var(--live-navy); } .live-mode-overlay { min-height: 72vh; - padding: 16px; - background: #171b3c; + padding: 16px 16px 12px; + background: var(--live-navy); } .live-mode-header h2 { margin: 0; - color: rgba(240, 248, 255, 0.84); + color: var(--live-white); font-size: clamp(22px, 3vw, 34px); + letter-spacing: 0.2px; } .live-mode-header p { margin: 6px 0 12px; - color: rgba(240, 248, 255, 0.84); - font-weight: 600; + color: rgba(255, 255, 255, 0.78); + font-weight: 500; } .live-mode-grid { @@ -1219,11 +1375,10 @@ select.name-input { } .live-screen-card { - border: 1px solid rgba(200, 223, 255, 0.28); + border: 1px solid rgba(0, 140, 168, 0.45); border-radius: 14px; - background: #1a1e3f; - box-shadow: 0 8px 18px rgba(7, 19, 42, 0.18); - backdrop-filter: blur(3px); + background: #0d1931; + box-shadow: 0 8px 20px rgba(0, 0, 0, 0.2); padding: 10px; animation: fade-up 0.32s ease both; } @@ -1238,9 +1393,9 @@ select.name-input { } .live-focus-banner { - border: 1px solid rgba(168, 205, 242, 0.4); + border: 1px solid rgba(0, 140, 168, 0.45); border-radius: 14px; - background: rgba(23, 27, 60, 0.9); + background: #0d1931; padding: 10px 14px; display: grid; gap: 2px; @@ -1252,7 +1407,7 @@ select.name-input { font-size: 11px; font-weight: 800; letter-spacing: 0.9px; - color: rgba(201, 224, 248, 0.82); + color: rgba(255, 255, 255, 0.75); text-transform: uppercase; } @@ -1261,8 +1416,8 @@ select.name-input { font-size: clamp(34px, 6vw, 58px); line-height: 0.95; letter-spacing: 1.2px; - color: #f6d68a; - text-shadow: 0 3px 10px rgba(0, 0, 0, 0.35); + color: #ffffff; + text-shadow: 0 3px 12px rgba(0, 0, 0, 0.4); } .live-focus-banner.focus-a .live-focus-title, @@ -1271,7 +1426,7 @@ select.name-input { .live-focus-banner.focus-d .live-focus-title, .live-focus-banner.focus-u .live-focus-title, .live-focus-banner.focus-final .live-focus-title { - color: #d9e3f2; + color: #ffffff; } .live-screen-head { @@ -1292,7 +1447,7 @@ select.name-input { .live-screen-head h3 { margin: 0; - color: #eaf4ff; + color: var(--live-white); font-size: 17px; } @@ -1306,17 +1461,18 @@ select.name-input { .live-chip { padding: 4px 8px; border-radius: 999px; - border: 1px solid rgba(130, 187, 230, 0.38); - background: rgba(27, 39, 75, 0.72); - color: #cae9ff; + border: 1px solid rgba(0, 140, 168, 0.45); + background: #0d1931; + color: rgba(255, 255, 255, 0.86); font-size: 11px; font-weight: 700; letter-spacing: 0.4px; } .live-chip.strong { - border-color: rgba(255, 214, 124, 0.4); - color: #ffd67c; + border-color: rgba(237, 46, 35, 0.6); + color: #ffffff; + background: rgba(237, 46, 35, 0.16); } .live-swap-enter-active, @@ -1339,9 +1495,8 @@ select.name-input { .live-mode-footer { margin-top: 0; padding: 10px 12px; - border: 1px solid rgba(158, 198, 238, 0.38); - border-radius: 14px; - background: #1a1e3f; + border-top: 1px solid rgba(0, 140, 168, 0.45); + background: #0d1931; display: grid; grid-template-columns: 1fr 1fr 1fr; align-items: center; @@ -1350,10 +1505,10 @@ select.name-input { } .live-mode-fixed-footer { - position: fixed; - inset-inline: 24px; - bottom: calc(var(--live-footer-offset) + env(safe-area-inset-bottom)); - box-shadow: 0 10px 24px rgba(8, 18, 39, 0.02); + position: static; + inset-inline: auto; + bottom: auto; + box-shadow: none; } .live-footer-slot { @@ -1375,21 +1530,265 @@ select.name-input { .live-footer-logo { max-width: min(35vw, 200px); - padding: 10px; + padding: 8px 6px; width: auto; height: auto; object-fit: contain; - filter: drop-shadow(0 1px 2px rgba(0, 0, 0, 0.2)); + filter: drop-shadow(0 1px 2px rgba(0, 0, 0, 0.28)); } .live-footer-slot.right .live-footer-logo { max-width: min(45vw, 280px); } +.live-tie-grid { + display: grid; + grid-template-columns: repeat(auto-fit, minmax(280px, 1fr)); + gap: 10px; +} + +.live-tie-group-card { + border: 1px solid rgba(0, 140, 168, 0.45); + border-radius: 12px; + background: #0d1931; + padding: 8px; +} + +.live-tie-group-title { + margin: 2px 0 8px; + font-size: 14px; + color: #ffffff; + letter-spacing: 0.2px; +} + .multi-round-cell { min-width: 98px; } +.position-board { + margin-bottom: 14px; +} + +.position-board-head { + margin-bottom: 8px; +} + +.position-board-toggle { + width: 100%; + border: 1px solid #d4deed; + border-radius: 12px; + background: linear-gradient(180deg, #ffffff 0%, #f3f8ff 100%); + display: flex; + justify-content: space-between; + align-items: center; + gap: 10px; + padding: 10px 12px; + text-align: start; + cursor: pointer; +} + +.position-board-title { + font-size: 14px; + font-weight: 800; + color: #1b1f40; +} + +.position-board-meta { + font-family: "IBM Plex Mono", monospace; + font-size: 12px; + color: #576284; +} + +.position-board-alert { + margin: 6px 4px 0; + display: inline-block; + font-family: "IBM Plex Mono", monospace; + font-size: 11px; + font-weight: 800; + color: #ffffff; + background: #ed2e23; + border-radius: 999px; + padding: 2px 8px; + animation: position-overflow-text-flash 1.1s ease-in-out infinite; +} + +.position-board-grid { + display: grid; + grid-template-columns: repeat(auto-fit, minmax(240px, 1fr)); + gap: 12px; +} + +.position-column { + border: 1px solid #d4deed; + border-radius: 12px; + background: #f7faff; + overflow: hidden; +} + +.position-column.position-column-overflow { + border-color: #ed2e23; + animation: position-overflow-flash 1.1s ease-in-out infinite; +} + +.position-column.position-column-overflow .position-column-head { + background: rgba(237, 46, 35, 0.14); + border-bottom-color: rgba(237, 46, 35, 0.5); +} + +.position-column-head { + border-bottom: 1px solid #d8e2f2; + background: #edf3ff; +} + +.position-column-toggle { + width: 100%; + border: 0; + background: transparent; + display: flex; + justify-content: space-between; + align-items: center; + gap: 10px; + padding: 10px 12px; + text-align: start; + cursor: pointer; +} + +@keyframes position-overflow-flash { + 0% { + box-shadow: 0 0 0 0 rgba(237, 46, 35, 0.08); + } + 50% { + box-shadow: 0 0 0 3px rgba(237, 46, 35, 0.32); + } + 100% { + box-shadow: 0 0 0 0 rgba(237, 46, 35, 0.08); + } +} + +.position-column-title { + font-size: 14px; + font-weight: 700; + color: #1b1f40; +} + +.position-column-count { + font-family: "IBM Plex Mono", monospace; + font-size: 12px; + color: #576284; +} + +.position-column-count.danger { + color: #a31610; + font-weight: 800; + animation: position-overflow-text-flash 1.1s ease-in-out infinite; +} + +.position-column-alert { + margin: 0 12px 8px; + display: inline-block; + font-family: "IBM Plex Mono", monospace; + font-size: 11px; + font-weight: 800; + color: #ffffff; + background: #ed2e23; + border-radius: 999px; + padding: 2px 8px; + animation: position-overflow-text-flash 1.1s ease-in-out infinite; +} + +@keyframes position-overflow-text-flash { + 0% { + opacity: 0.7; + } + 50% { + opacity: 1; + } + 100% { + opacity: 0.7; + } +} + +.position-column-list { + min-height: 72px; + padding: 10px; + display: grid; + gap: 8px; +} + +.position-card { + display: flex; + gap: 10px; + align-items: center; + padding: 8px; + border: 1px solid #d1dbed; + border-radius: 10px; + background: #ffffff; + cursor: grab; +} + +.position-card:active { + cursor: grabbing; +} + +.position-badge { + width: 26px; + height: 26px; + border-radius: 999px; + background: #1b1f40; + color: #fff; + display: inline-flex; + align-items: center; + justify-content: center; + font-family: "IBM Plex Mono", monospace; + font-size: 12px; + flex-shrink: 0; +} + +.position-avatar { + width: 38px; + height: 38px; + border-radius: 50%; + object-fit: cover; + border: 1px solid #d4deed; + flex-shrink: 0; +} + +.position-card-text { + min-width: 0; +} + +.position-card-text .name-main { + margin: 0; + font-size: 13px; +} + +.position-card-text .name-sub { + margin: 1px 0 0; + font-size: 11px; +} + +.position-score { + margin: 4px 0 0; + font-family: "IBM Plex Mono", monospace; + font-size: 11px; + color: #556286; +} + +.position-empty { + border: 1px dashed #cfd8ea; + border-radius: 10px; + padding: 12px; + text-align: center; + color: #7483a7; + font-size: 12px; +} + +.position-actions { + margin-top: 8px; + display: flex; + justify-content: flex-end; +} + .score-input-compact { width: 84px; min-height: 36px; @@ -1468,27 +1867,38 @@ select.name-input { aspect-ratio: 16 / 10; } -.live-score-table thead th { - background: #171b3c; +.live-score-table thead th, +.live-screen-card .score-table thead th { + background: #008ca8; + color: #ffffff; +} + +.live-screen-card .score-table { + background: #0d1931; } .live-screen-card .score-table td { - color: #f2f8ff; - border-top-color: rgba(158, 186, 216, 0.22); + color: #ffffff; + border-top-color: rgba(0, 140, 168, 0.24); + background: #0d1931; +} + +.live-screen-card .name-main { + color: #ffffff; } .live-screen-card .name-sub, .live-screen-card .muted { - color: rgba(213, 232, 255, 0.72); + color: rgba(255, 255, 255, 0.72); } .live-screen-card .table-wrap { - border-color: rgba(158, 186, 216, 0.28); - background: #171b3c; + border-color: rgba(0, 140, 168, 0.32); + background: #0d1931; } .live-screen-card .qualified-row { - background: rgba(16, 160, 194, 0.12); + background: rgba(0, 140, 168, 0.16); } .live-podium { @@ -1499,8 +1909,8 @@ select.name-input { } .podium-live-card .podium-col { - background: #1a1e3f; - border: 1px solid rgba(177, 205, 236, 0.26); + background: #0d1931; + border: 1px solid rgba(0, 140, 168, 0.34); box-shadow: 0 18px 34px rgba(2, 10, 25, 0.45); min-width: 0; max-width: 330px; @@ -1508,21 +1918,21 @@ select.name-input { } .podium-live-card .podium-col.pos-1 { - border-top: 10px solid rgba(231, 196, 95, 0.4); - background: #1a1e3f; + border-top: 10px solid #d4af37; + background: #0d1931; height: 430px; - box-shadow: 0 22px 44px rgba(231, 196, 95, 0.15); + box-shadow: 0 22px 44px rgba(212, 175, 55, 0.2); } .podium-live-card .podium-col.pos-2 { - border-top: 10px solid rgba(184, 195, 215, 0.4); - background: #1a1e3f; + border-top: 10px solid #c0c0c0; + background: #0d1931; height: 350px; } .podium-live-card .podium-col.pos-3 { - border-top: 10px solid rgba(207, 139, 69, 0.4); - background: #1a1e3f; + border-top: 10px solid #cd7f32; + background: #0d1931; height: 320px; } @@ -1538,6 +1948,20 @@ select.name-input { width: 150px; height: 150px; border-width: 6px; + border-color: rgba(0, 140, 168, 0.82); + background: #0d1931; +} + +.podium-live-card .podium-col.pos-1 .podium-img { + border-color: #d4af37; +} + +.podium-live-card .podium-col.pos-2 .podium-img { + border-color: #c0c0c0; +} + +.podium-live-card .podium-col.pos-3 .podium-img { + border-color: #cd7f32; } .podium-live-card .podium-col.pos-1 .podium-img { @@ -1575,7 +1999,7 @@ select.name-input { } .podium-live-card .podium-name.empty { - color: rgba(204, 220, 240, 0.78); + color: rgba(255, 255, 255, 0.72); font-size: 22px; -webkit-line-clamp: 2; line-clamp: 2; @@ -1585,20 +2009,32 @@ select.name-input { .podium-live-card .podium-score { background: rgba(255, 255, 255, 0.08); - color: #ffd888; - border-color: rgba(255, 255, 255, 0.18); + color: #ffffff; + border-color: rgba(0, 140, 168, 0.34); margin-bottom: 0; font-size: 16px; padding: 10px 16px; } +.podium-live-card .podium-col.pos-1 .podium-score { + border-color: #d4af37; +} + +.podium-live-card .podium-col.pos-2 .podium-score { + border-color: #c0c0c0; +} + +.podium-live-card .podium-col.pos-3 .podium-score { + border-color: #cd7f32; +} + .podium-live-card .podium-col.pos-1 .podium-score { font-size: 18px; padding: 12px 18px; } .podium-live-card .podium-medal-icon { - filter: drop-shadow(0 4px 10px rgba(0, 0, 0, 0.35)); + filter: grayscale(1) brightness(1.2) drop-shadow(0 4px 10px rgba(0, 0, 0, 0.35)); font-size: 60px; margin-top: 86px; } @@ -1774,7 +2210,7 @@ select.name-input { } .podium-live-card .podium-score-sub { - color: rgba(220, 234, 252, 0.86); + color: rgba(255, 255, 255, 0.82); } .toast { @@ -1874,6 +2310,97 @@ select.name-input { display: block; } +.score-section-block { + border: 1px solid var(--score-group-border, var(--border)); + border-radius: 12px; + background: var(--score-group-soft, #f7f9ff); + margin-bottom: 12px; + overflow: hidden; +} + +.score-section-block.score-section-overflow { + border-color: #ed2e23; + animation: score-section-overflow-flash 1.1s ease-in-out infinite; +} + +.score-section-toggle { + width: 100%; + border: 0; + background: transparent; + display: flex; + justify-content: space-between; + align-items: center; + gap: 10px; + padding: 10px 12px; + cursor: pointer; + color: var(--text); + font-weight: 800; + box-shadow: inset 4px 0 0 var(--score-group-accent, #7f8ca8); +} + +.score-section-title { + text-align: start; +} + +.score-section-meta { + font-family: "IBM Plex Mono", monospace; + font-size: 12px; + opacity: 0.8; +} + +.score-section-alert { + margin: 0 12px 8px; + display: inline-block; + font-family: "IBM Plex Mono", monospace; + font-size: 11px; + font-weight: 800; + color: #ffffff; + background: #ed2e23; + border-radius: 999px; + padding: 2px 8px; + animation: score-section-overflow-text-flash 1.1s ease-in-out infinite; +} + +.score-section-block .table-wrap { + border: 0; + border-top: 1px dashed var(--score-group-border, #d2daec); + border-radius: 0; + margin: 0; +} + +.score-section-block.tie-break { + box-shadow: 0 8px 20px rgba(27, 31, 64, 0.08); +} + +.score-section-block.tie-break .score-section-toggle { + background: var(--score-group-soft, rgba(127, 140, 168, 0.14)); + box-shadow: inset 6px 0 0 var(--score-group-accent, #7f8ca8); +} + +@keyframes score-section-overflow-flash { + 0% { + box-shadow: 0 0 0 0 rgba(237, 46, 35, 0.1); + } + 50% { + box-shadow: 0 0 0 3px rgba(237, 46, 35, 0.3); + } + 100% { + box-shadow: 0 0 0 0 rgba(237, 46, 35, 0.1); + } +} + +@keyframes score-section-overflow-text-flash { + 0% { + opacity: 0.7; + } + 50% { + opacity: 1; + } + 100% { + opacity: 0.7; + } +} + .mobile-score-cards { display: none; } @@ -2323,7 +2850,9 @@ select.name-input { } .live-settings-grid, - .inline-settings { + .inline-settings, + .stage-control-grid, + .stage-status-grid { grid-template-columns: 1fr; } @@ -2339,11 +2868,6 @@ select.name-input { grid-template-columns: 1fr; } - .live-mode-root { - --live-footer-height: 62px; - --live-footer-offset: 10px; - } - .live-mode-shell { border-radius: 12px; min-height: 70dvh; @@ -2373,7 +2897,7 @@ select.name-input { } .live-mode-fixed-footer { - inset-inline: 10px; + inset-inline: auto; } .live-footer-logo { @@ -2384,6 +2908,10 @@ select.name-input { max-width: min(40vw, 150px); } + .live-tie-grid { + grid-template-columns: 1fr; + } + .status-row { justify-content: flex-start; } diff --git a/frontend/src/utils/scoreGroupTheme.js b/frontend/src/utils/scoreGroupTheme.js index 62edbf6..98a47ac 100644 --- a/frontend/src/utils/scoreGroupTheme.js +++ b/frontend/src/utils/scoreGroupTheme.js @@ -1,15 +1,24 @@ import { normalizedGroupCode } from './groups' const PRESET = { - A: { accent: '#2f4d9a', soft: 'rgba(47, 77, 154, 0.10)', border: 'rgba(47, 77, 154, 0.34)' }, - B: { accent: '#0d8fa5', soft: 'rgba(13, 143, 165, 0.10)', border: 'rgba(13, 143, 165, 0.34)' }, - C: { accent: '#d54a3f', soft: 'rgba(213, 74, 63, 0.10)', border: 'rgba(213, 74, 63, 0.34)' }, - D: { accent: '#c2891f', soft: 'rgba(194, 137, 31, 0.12)', border: 'rgba(194, 137, 31, 0.36)' }, - F1: { accent: '#5b4fc9', soft: 'rgba(91, 79, 201, 0.11)', border: 'rgba(91, 79, 201, 0.36)' }, - F2: { accent: '#0f9f63', soft: 'rgba(15, 159, 99, 0.11)', border: 'rgba(15, 159, 99, 0.36)' }, - U: { accent: '#7f8ca8', soft: 'rgba(127, 140, 168, 0.11)', border: 'rgba(127, 140, 168, 0.34)' }, + A: { accent: '#0d1931', soft: 'rgba(13, 25, 49, 0.14)', border: 'rgba(13, 25, 49, 0.44)' }, + B: { accent: '#008ca8', soft: 'rgba(0, 140, 168, 0.14)', border: 'rgba(0, 140, 168, 0.44)' }, + C: { accent: '#ed2e23', soft: 'rgba(237, 46, 35, 0.14)', border: 'rgba(237, 46, 35, 0.44)' }, + D: { accent: '#1b325f', soft: 'rgba(27, 50, 95, 0.14)', border: 'rgba(27, 50, 95, 0.42)' }, + F1: { accent: '#ed2e23', soft: 'rgba(237, 46, 35, 0.14)', border: 'rgba(237, 46, 35, 0.44)' }, + F2: { accent: '#008ca8', soft: 'rgba(0, 140, 168, 0.14)', border: 'rgba(0, 140, 168, 0.44)' }, + U: { accent: '#4c5f86', soft: 'rgba(76, 95, 134, 0.14)', border: 'rgba(76, 95, 134, 0.4)' }, } +const THEME_PALETTE = [ + { accent: '#0d1931', soft: 'rgba(13, 25, 49, 0.15)', border: 'rgba(13, 25, 49, 0.46)' }, + { accent: '#008ca8', soft: 'rgba(0, 140, 168, 0.15)', border: 'rgba(0, 140, 168, 0.46)' }, + { accent: '#ed2e23', soft: 'rgba(237, 46, 35, 0.15)', border: 'rgba(237, 46, 35, 0.46)' }, + { accent: '#1b325f', soft: 'rgba(27, 50, 95, 0.15)', border: 'rgba(27, 50, 95, 0.44)' }, + { accent: '#0d5f72', soft: 'rgba(13, 95, 114, 0.15)', border: 'rgba(13, 95, 114, 0.44)' }, + { accent: '#b8261d', soft: 'rgba(184, 38, 29, 0.15)', border: 'rgba(184, 38, 29, 0.44)' }, +] + export function scoreGroupToken(row) { const finalGroup = Number(row?.finalGroup || 0) if (finalGroup === 1) return 'F1' @@ -30,12 +39,7 @@ export function scoreGroupStyle(row) { } } - const hue = hashToHue(token) - return { - '--score-group-accent': `hsl(${hue} 70% 38%)`, - '--score-group-soft': `hsla(${hue}, 72%, 46%, 0.10)`, - '--score-group-border': `hsla(${hue}, 70%, 38%, 0.34)`, - } + return groupThemeStyleForKey(token) } export function scoreValueStyle(scoreValue) { @@ -49,6 +53,26 @@ export function scoreValueStyle(scoreValue) { } } +export function groupThemeStyleForKey(key, options = {}) { + const raw = String(key || '').trim().toUpperCase() + const compact = raw.replace(/^[A-Z]/, '') + const numeric = Number.parseInt(compact || raw, 10) + const idx = Number.isFinite(numeric) && numeric > 0 ? (numeric - 1) % THEME_PALETTE.length : hashToHue(raw || 'U') % THEME_PALETTE.length + const base = THEME_PALETTE[idx] + if (!options.tieBreak) { + return { + '--score-group-accent': base.accent, + '--score-group-soft': base.soft, + '--score-group-border': base.border, + } + } + return { + '--score-group-accent': base.accent, + '--score-group-soft': base.soft.replace('0.15', '0.2'), + '--score-group-border': base.border, + } +} + function hashToHue(value) { const input = String(value || 'U') let hash = 0