const { useState, useMemo, useEffect } = React;

const PARTICIPANTS = [
  { id: "makarov", name: "Иван Макаров", team: "Ольмек" },
  { id: "petuhova", name: "Татьяна Петухова", team: "Птыха" },
  { id: "shkolnaya", name: "Вероника Школьная", team: "Школа" },
  { id: "kiseleva", name: "Дарья Киселева", team: "Китти" },
  { id: "bagaeva", name: "Полина Багаева", team: "Вобла" },
  { id: "belyakova", name: "Катерина Белякова", team: "Кот" },
  { id: "strelkov", name: "Денис Стрелков", team: "ЛЭМЗ" },
  { id: "trigubenko", name: "Денис Тригубенко", team: "Порочная Практика" },
];
const P = id => PARTICIPANTS.find(x => x.id === id);
const SH = id => { const p = P(id); return p?.name.split(" ")[1] || id; };
const SHORT_TEAMS = { "Пари Нижний Новгород": "Пари НН", "Пари НН": "Пари НН", "Динамо Москва": "Динамо М", "Динамо М": "Динамо М", "Динамо Махачкала": "Динамо Мх", "Крылья Советов": "Кр. Советов", "Спартак М": "Спартак", "Локомотив М": "Локомотив", "Динамо Мх": "Динамо Мх" };
const TN = name => SHORT_TEAMS[name] || name;
const ALL_PIDS = ["makarov", "strelkov", "belyakova", "kiseleva", "bagaeva", "shkolnaya", "trigubenko", "petuhova"];

// === DATA STORED IN PERSISTENT STORAGE ===
// Keys: "rpl-champ-cum", "rpl-round-pts", "rpl-round-matches", "rpl-round-preds", "rpl-cup", "rpl-version"
const STORAGE_VERSION = "v20";

// Initial data embedded for first-time migration
// Fallback inline data (used if storage unavailable, also used for initial migration)
const CHAMP_CUM = {
  1: {
    makarov: { pts: 5, sc: 0, df: 0, oc: 5 },
    strelkov: { pts: 5, sc: 0, df: 0, oc: 5 },
    belyakova: { pts: 5, sc: 0, df: 0, oc: 5 },
    kiseleva: { pts: 10, sc: 0, df: 0, oc: 10 },
    bagaeva: { pts: 5, sc: 0, df: 0, oc: 5 },
    shkolnaya: { pts: 4, sc: 0, df: 0, oc: 4 },
    trigubenko: { pts: 7, sc: 0, df: 0, oc: 7 },
    petuhova: { pts: 10, sc: 0, df: 0, oc: 10 },
  },
  2: {
    makarov: { pts: 10, sc: 1, df: 1, oc: 5 },
    strelkov: { pts: 8, sc: 0, df: 1, oc: 6 },
    belyakova: { pts: 10, sc: 1, df: 1, oc: 5 },
    kiseleva: { pts: 14, sc: 1, df: 0, oc: 11 },
    bagaeva: { pts: 13, sc: 1, df: 1, oc: 8 },
    shkolnaya: { pts: 12, sc: 2, df: 0, oc: 6 },
    trigubenko: { pts: 12, sc: 0, df: 2, oc: 8 },
    petuhova: { pts: 10, sc: 0, df: 0, oc: 10 },
  },
  3: {
    makarov: { pts: 17, sc: 2, df: 2, oc: 7 },
    strelkov: { pts: 18, sc: 3, df: 1, oc: 7 },
    belyakova: { pts: 14, sc: 1, df: 2, oc: 7 },
    kiseleva: { pts: 20, sc: 1, df: 2, oc: 13 },
    bagaeva: { pts: 25, sc: 3, df: 3, oc: 10 },
    shkolnaya: { pts: 15, sc: 2, df: 0, oc: 9 },
    trigubenko: { pts: 18, sc: 0, df: 4, oc: 10 },
    petuhova: { pts: 16, sc: 1, df: 1, oc: 11 },
  },
  4: {
    makarov: { pts: 24, sc: 3, df: 3, oc: 9 },
    strelkov: { pts: 25, sc: 4, df: 2, oc: 9 },
    belyakova: { pts: 18, sc: 1, df: 3, oc: 9 },
    kiseleva: { pts: 24, sc: 1, df: 2, oc: 17 },
    bagaeva: { pts: 27, sc: 3, df: 3, oc: 12 },
    shkolnaya: { pts: 17, sc: 2, df: 0, oc: 11 },
    trigubenko: { pts: 21, sc: 0, df: 5, oc: 11 },
    petuhova: { pts: 22, sc: 2, df: 2, oc: 12 },
  },
  5: {
    makarov: { pts: 30, sc: 4, df: 3, oc: 12 },
    strelkov: { pts: 30, sc: 4, df: 3, oc: 12 },
    belyakova: { pts: 22, sc: 1, df: 4, oc: 11 },
    kiseleva: { pts: 29, sc: 1, df: 3, oc: 20 },
    bagaeva: { pts: 36, sc: 4, df: 5, oc: 14 },
    shkolnaya: { pts: 22, sc: 3, df: 0, oc: 13 },
    trigubenko: { pts: 29, sc: 1, df: 6, oc: 14 },
    petuhova: { pts: 27, sc: 3, df: 2, oc: 14 },
  },
  6: {
    makarov: { pts: 38, sc: 4, df: 4, oc: 18 },
    strelkov: { pts: 37, sc: 5, df: 3, oc: 16 },
    belyakova: { pts: 27, sc: 1, df: 4, oc: 16 },
    kiseleva: { pts: 36, sc: 1, df: 4, oc: 25 },
    bagaeva: { pts: 44, sc: 5, df: 5, oc: 19 },
    shkolnaya: { pts: 27, sc: 3, df: 0, oc: 18 },
    trigubenko: { pts: 34, sc: 1, df: 7, oc: 17 },
    petuhova: { pts: 32, sc: 3, df: 2, oc: 19 },
  },
  7: {
    makarov: { pts: 46, sc: 6, df: 4, oc: 20 },
    strelkov: { pts: 37, sc: 5, df: 3, oc: 16 },
    belyakova: { pts: 41, sc: 5, df: 5, oc: 16 },
    kiseleva: { pts: 43, sc: 2, df: 6, oc: 25 },
    bagaeva: { pts: 52, sc: 7, df: 5, oc: 21 },
    shkolnaya: { pts: 31, sc: 4, df: 0, oc: 19 },
    trigubenko: { pts: 45, sc: 3, df: 9, oc: 18 },
    petuhova: { pts: 40, sc: 4, df: 4, oc: 20 },
  },
  8: {
    makarov: { pts: 57, sc: 8, df: 6, oc: 21 },
    strelkov: { pts: 44, sc: 6, df: 4, oc: 18 },
    belyakova: { pts: 47, sc: 5, df: 6, oc: 20 },
    kiseleva: { pts: 50, sc: 3, df: 7, oc: 27 },
    bagaeva: { pts: 58, sc: 7, df: 6, oc: 25 },
    shkolnaya: { pts: 39, sc: 4, df: 3, oc: 21 },
    trigubenko: { pts: 49, sc: 4, df: 9, oc: 19 },
    petuhova: { pts: 46, sc: 5, df: 5, oc: 21 },
  },
  9: {
    makarov: { pts: 70, sc: 10, df: 8, oc: 24 },
    strelkov: { pts: 56, sc: 7, df: 7, oc: 21 },
    belyakova: { pts: 58, sc: 6, df: 9, oc: 22 },
    kiseleva: { pts: 53, sc: 3, df: 8, oc: 28 },
    bagaeva: { pts: 68, sc: 8, df: 7, oc: 30 },
    shkolnaya: { pts: 48, sc: 6, df: 4, oc: 22 },
    trigubenko: { pts: 57, sc: 6, df: 9, oc: 21 },
    petuhova: { pts: 53, sc: 5, df: 8, oc: 22 },
  },
  10: {
    makarov: { pts: 83, sc: 11, df: 12, oc: 26 },
    strelkov: { pts: 67, sc: 8, df: 9, oc: 25 },
    belyakova: { pts: 71, sc: 6, df: 14, oc: 25 },
    kiseleva: { pts: 65, sc: 4, df: 11, oc: 31 },
    bagaeva: { pts: 78, sc: 8, df: 10, oc: 34 },
    shkolnaya: { pts: 57, sc: 7, df: 6, oc: 24 },
    trigubenko: { pts: 68, sc: 6, df: 9, oc: 32 },
    petuhova: { pts: 57, sc: 5, df: 8, oc: 26 },
  },
  11: {
    makarov: { pts: 91, sc: 11, df: 12, oc: 34 },
    strelkov: { pts: 77, sc: 8, df: 9, oc: 35 },
    belyakova: { pts: 80, sc: 6, df: 14, oc: 34 },
    kiseleva: { pts: 75, sc: 4, df: 11, oc: 41 },
    bagaeva: { pts: 90, sc: 12, df: 10, oc: 34 },
    shkolnaya: { pts: 66, sc: 7, df: 6, oc: 33 },
    trigubenko: { pts: 74, sc: 6, df: 9, oc: 38 },
    petuhova: { pts: 63, sc: 5, df: 8, oc: 32 },
  },
  12: {
    makarov: { pts: 100, sc: 13, df: 13, oc: 35 },
    strelkov: { pts: 81, sc: 8, df: 10, oc: 37 },
    belyakova: { pts: 83, sc: 6, df: 15, oc: 35 },
    kiseleva: { pts: 82, sc: 5, df: 12, oc: 43 },
    bagaeva: { pts: 93, sc: 12, df: 10, oc: 37 },
    shkolnaya: { pts: 68, sc: 7, df: 6, oc: 35 },
    trigubenko: { pts: 75, sc: 6, df: 9, oc: 39 },
    petuhova: { pts: 70, sc: 6, df: 9, oc: 34 },
  },
  13: {
    makarov: { pts: 113, sc: 17, df: 13, oc: 36 },
    strelkov: { pts: 91, sc: 10, df: 11, oc: 39 },
    belyakova: { pts: 96, sc: 9, df: 17, oc: 35 },
    kiseleva: { pts: 92, sc: 7, df: 13, oc: 45 },
    bagaeva: { pts: 95, sc: 12, df: 10, oc: 39 },
    shkolnaya: { pts: 77, sc: 9, df: 7, oc: 36 },
    trigubenko: { pts: 80, sc: 7, df: 9, oc: 41 },
    petuhova: { pts: 75, sc: 7, df: 10, oc: 34 },
  },
  14: {
    makarov: { pts: 118, sc: 17, df: 13, oc: 41 },
    strelkov: { pts: 97, sc: 10, df: 11, oc: 45 },
    belyakova: { pts: 103, sc: 9, df: 17, oc: 42 },
    kiseleva: { pts: 97, sc: 7, df: 13, oc: 50 },
    bagaeva: { pts: 95, sc: 12, df: 10, oc: 39 },
    shkolnaya: { pts: 81, sc: 9, df: 7, oc: 40 },
    trigubenko: { pts: 87, sc: 7, df: 9, oc: 48 },
    petuhova: { pts: 78, sc: 7, df: 10, oc: 37 },
  },
  15: {
    makarov: { pts: 127, sc: 19, df: 14, oc: 42 },
    strelkov: { pts: 106, sc: 12, df: 12, oc: 46 },
    belyakova: { pts: 112, sc: 11, df: 18, oc: 43 },
    kiseleva: { pts: 109, sc: 8, df: 17, oc: 51 },
    bagaeva: { pts: 105, sc: 12, df: 15, oc: 39 },
    shkolnaya: { pts: 89, sc: 10, df: 9, oc: 41 },
    trigubenko: { pts: 91, sc: 8, df: 9, oc: 49 },
    petuhova: { pts: 87, sc: 9, df: 11, oc: 38 },
  },
  16: {
    makarov: { pts: 140, sc: 22, df: 15, oc: 44 },
    strelkov: { pts: 118, sc: 14, df: 14, oc: 48 },
    belyakova: { pts: 118, sc: 11, df: 19, oc: 47 },
    kiseleva: { pts: 116, sc: 10, df: 17, oc: 52 },
    bagaeva: { pts: 110, sc: 12, df: 17, oc: 40 },
    shkolnaya: { pts: 102, sc: 11, df: 13, oc: 43 },
    trigubenko: { pts: 99, sc: 10, df: 10, oc: 49 },
    petuhova: { pts: 92, sc: 9, df: 11, oc: 43 },
  },
  17: {
    makarov: { pts: 148, sc: 23, df: 15, oc: 49 },
    strelkov: { pts: 126, sc: 15, df: 14, oc: 53 },
    belyakova: { pts: 125, sc: 11, df: 21, oc: 50 },
    kiseleva: { pts: 123, sc: 11, df: 18, oc: 54 },
    bagaeva: { pts: 118, sc: 13, df: 19, oc: 41 },
    shkolnaya: { pts: 108, sc: 12, df: 14, oc: 44 },
    trigubenko: { pts: 106, sc: 10, df: 10, oc: 56 },
    petuhova: { pts: 102, sc: 11, df: 12, oc: 45 },
  },
  18: {
    makarov: { pts: 154, sc: 23, df: 17, oc: 51 },
    strelkov: { pts: 133, sc: 16, df: 15, oc: 55 },
    belyakova: { pts: 131, sc: 11, df: 23, oc: 52 },
    kiseleva: { pts: 128, sc: 12, df: 18, oc: 56 },
    bagaeva: { pts: 127, sc: 15, df: 19, oc: 44 },
    shkolnaya: { pts: 113, sc: 12, df: 16, oc: 45 },
    trigubenko: { pts: 112, sc: 10, df: 13, oc: 56 },
    petuhova: { pts: 110, sc: 13, df: 12, oc: 47 },
  },
  19: {
    makarov: { pts: 162, sc: 24, df: 18, oc: 54 },
    strelkov: { pts: 141, sc: 17, df: 16, oc: 58 },
    belyakova: { pts: 140, sc: 13, df: 23, oc: 55 },
    kiseleva: { pts: 137, sc: 13, df: 20, oc: 58 },
    bagaeva: { pts: 134, sc: 15, df: 21, oc: 47 },
    shkolnaya: { pts: 119, sc: 12, df: 18, oc: 47 },
    trigubenko: { pts: 120, sc: 11, df: 13, oc: 61 },
    petuhova: { pts: 118, sc: 14, df: 14, oc: 48 },
  },
  20: {
    makarov: { pts: 171, sc: 26, df: 19, oc: 55 },
    strelkov: { pts: 150, sc: 19, df: 17, oc: 59 },
    belyakova: { pts: 149, sc: 15, df: 24, oc: 56 },
    kiseleva: { pts: 139, sc: 13, df: 20, oc: 60 },
    bagaeva: { pts: 138, sc: 15, df: 22, oc: 49 },
    shkolnaya: { pts: 123, sc: 12, df: 19, oc: 49 },
    trigubenko: { pts: 126, sc: 12, df: 14, oc: 62 },
    petuhova: { pts: 123, sc: 14, df: 16, oc: 49 },
  },
};

const ROUND_PTS = {
  1: {
    makarov: { pts: 5, sc: 0, df: 0, oc: 5 },
    strelkov: { pts: 5, sc: 0, df: 0, oc: 5 },
    belyakova: { pts: 5, sc: 0, df: 0, oc: 5 },
    kiseleva: { pts: 10, sc: 0, df: 0, oc: 10 },
    bagaeva: { pts: 5, sc: 0, df: 0, oc: 5 },
    shkolnaya: { pts: 4, sc: 0, df: 0, oc: 4 },
    trigubenko: { pts: 7, sc: 0, df: 0, oc: 7 },
    petuhova: { pts: 10, sc: 0, df: 0, oc: 10 },
  },
  2: {
    makarov: { pts: 5, sc: 1, df: 1, oc: 0 },
    strelkov: { pts: 3, sc: 0, df: 1, oc: 1 },
    belyakova: { pts: 5, sc: 1, df: 1, oc: 0 },
    kiseleva: { pts: 4, sc: 1, df: 0, oc: 1 },
    bagaeva: { pts: 8, sc: 1, df: 1, oc: 3 },
    shkolnaya: { pts: 8, sc: 2, df: 0, oc: 2 },
    trigubenko: { pts: 5, sc: 0, df: 2, oc: 1 },
    petuhova: { pts: 0, sc: 0, df: 0, oc: 0 },
  },
  3: {
    makarov: { pts: 7, sc: 1, df: 1, oc: 2 },
    strelkov: { pts: 10, sc: 3, df: 0, oc: 1 },
    belyakova: { pts: 4, sc: 0, df: 1, oc: 2 },
    kiseleva: { pts: 6, sc: 0, df: 2, oc: 2 },
    bagaeva: { pts: 12, sc: 2, df: 2, oc: 2 },
    shkolnaya: { pts: 3, sc: 0, df: 0, oc: 3 },
    trigubenko: { pts: 6, sc: 0, df: 2, oc: 2 },
    petuhova: { pts: 6, sc: 1, df: 1, oc: 1 },
  },
  4: {
    makarov: { pts: 7, sc: 1, df: 1, oc: 2 },
    strelkov: { pts: 7, sc: 1, df: 1, oc: 2 },
    belyakova: { pts: 4, sc: 0, df: 1, oc: 2 },
    kiseleva: { pts: 4, sc: 0, df: 0, oc: 4 },
    bagaeva: { pts: 2, sc: 0, df: 0, oc: 2 },
    shkolnaya: { pts: 2, sc: 0, df: 0, oc: 2 },
    trigubenko: { pts: 3, sc: 0, df: 1, oc: 1 },
    petuhova: { pts: 6, sc: 1, df: 1, oc: 1 },
  },
  5: {
    makarov: { pts: 6, sc: 1, df: 0, oc: 3 },
    strelkov: { pts: 5, sc: 0, df: 1, oc: 3 },
    belyakova: { pts: 4, sc: 0, df: 1, oc: 2 },
    kiseleva: { pts: 5, sc: 0, df: 1, oc: 3 },
    bagaeva: { pts: 9, sc: 1, df: 2, oc: 2 },
    shkolnaya: { pts: 5, sc: 1, df: 0, oc: 2 },
    trigubenko: { pts: 8, sc: 1, df: 1, oc: 3 },
    petuhova: { pts: 5, sc: 1, df: 0, oc: 2 },
  },
  6: {
    makarov: { pts: 8, sc: 0, df: 1, oc: 6 },
    strelkov: { pts: 7, sc: 1, df: 0, oc: 4 },
    belyakova: { pts: 5, sc: 0, df: 0, oc: 5 },
    kiseleva: { pts: 7, sc: 0, df: 1, oc: 5 },
    bagaeva: { pts: 8, sc: 1, df: 0, oc: 5 },
    shkolnaya: { pts: 5, sc: 0, df: 0, oc: 5 },
    trigubenko: { pts: 5, sc: 0, df: 1, oc: 3 },
    petuhova: { pts: 5, sc: 0, df: 0, oc: 5 },
  },
  7: {
    makarov: { pts: 8, sc: 2, df: 0, oc: 2 },
    strelkov: { pts: 0, sc: 0, df: 0, oc: 0 },
    belyakova: { pts: 14, sc: 4, df: 1, oc: 0 },
    kiseleva: { pts: 7, sc: 1, df: 2, oc: 0 },
    bagaeva: { pts: 8, sc: 2, df: 0, oc: 2 },
    shkolnaya: { pts: 4, sc: 1, df: 0, oc: 1 },
    trigubenko: { pts: 11, sc: 2, df: 2, oc: 1 },
    petuhova: { pts: 8, sc: 1, df: 2, oc: 1 },
  },
  8: {
    makarov: { pts: 11, sc: 2, df: 2, oc: 1 },
    strelkov: { pts: 7, sc: 1, df: 1, oc: 2 },
    belyakova: { pts: 6, sc: 0, df: 1, oc: 4 },
    kiseleva: { pts: 7, sc: 1, df: 1, oc: 2 },
    bagaeva: { pts: 6, sc: 0, df: 1, oc: 4 },
    shkolnaya: { pts: 8, sc: 0, df: 3, oc: 2 },
    trigubenko: { pts: 4, sc: 1, df: 0, oc: 1 },
    petuhova: { pts: 6, sc: 1, df: 1, oc: 1 },
  },
  9: {
    makarov: { pts: 13, sc: 2, df: 2, oc: 3 },
    strelkov: { pts: 12, sc: 1, df: 3, oc: 3 },
    belyakova: { pts: 11, sc: 1, df: 3, oc: 2 },
    kiseleva: { pts: 3, sc: 0, df: 1, oc: 1 },
    bagaeva: { pts: 10, sc: 1, df: 1, oc: 5 },
    shkolnaya: { pts: 9, sc: 2, df: 1, oc: 1 },
    trigubenko: { pts: 8, sc: 2, df: 0, oc: 2 },
    petuhova: { pts: 7, sc: 0, df: 3, oc: 1 },
  },
  10: {
    makarov: { pts: 13, sc: 1, df: 4, oc: 2 },
    strelkov: { pts: 11, sc: 1, df: 2, oc: 4 },
    belyakova: { pts: 13, sc: 0, df: 5, oc: 3 },
    kiseleva: { pts: 12, sc: 1, df: 3, oc: 3 },
    bagaeva: { pts: 10, sc: 0, df: 3, oc: 4 },
    shkolnaya: { pts: 9, sc: 1, df: 2, oc: 2 },
    trigubenko: { pts: 11, sc: 0, df: 0, oc: 11 },
    petuhova: { pts: 4, sc: 0, df: 0, oc: 4 },
  },
  11: {
    makarov: { pts: 8, sc: 0, df: 0, oc: 8 },
    strelkov: { pts: 10, sc: 0, df: 0, oc: 10 },
    belyakova: { pts: 9, sc: 0, df: 0, oc: 9 },
    kiseleva: { pts: 10, sc: 0, df: 0, oc: 10 },
    bagaeva: { pts: 12, sc: 4, df: 0, oc: 0 },
    shkolnaya: { pts: 9, sc: 0, df: 0, oc: 9 },
    trigubenko: { pts: 6, sc: 0, df: 0, oc: 6 },
    petuhova: { pts: 6, sc: 0, df: 0, oc: 6 },
  },
  12: {
    makarov: { pts: 9, sc: 2, df: 1, oc: 1 },
    strelkov: { pts: 4, sc: 0, df: 1, oc: 2 },
    belyakova: { pts: 3, sc: 0, df: 1, oc: 1 },
    kiseleva: { pts: 7, sc: 1, df: 1, oc: 2 },
    bagaeva: { pts: 3, sc: 0, df: 0, oc: 3 },
    shkolnaya: { pts: 2, sc: 0, df: 0, oc: 2 },
    trigubenko: { pts: 1, sc: 0, df: 0, oc: 1 },
    petuhova: { pts: 7, sc: 1, df: 1, oc: 2 },
  },
  13: {
    makarov: { pts: 13, sc: 4, df: 0, oc: 1 },
    strelkov: { pts: 10, sc: 2, df: 1, oc: 2 },
    belyakova: { pts: 13, sc: 3, df: 2, oc: 0 },
    kiseleva: { pts: 10, sc: 2, df: 1, oc: 2 },
    bagaeva: { pts: 2, sc: 0, df: 0, oc: 2 },
    shkolnaya: { pts: 9, sc: 2, df: 1, oc: 1 },
    trigubenko: { pts: 5, sc: 1, df: 0, oc: 2 },
    petuhova: { pts: 5, sc: 1, df: 1, oc: 0 },
  },
  14: {
    makarov: { pts: 5, sc: 0, df: 0, oc: 5 },
    strelkov: { pts: 6, sc: 0, df: 0, oc: 6 },
    belyakova: { pts: 7, sc: 0, df: 0, oc: 7 },
    kiseleva: { pts: 5, sc: 0, df: 0, oc: 5 },
    bagaeva: { pts: 0, sc: 0, df: 0, oc: 0 },
    shkolnaya: { pts: 4, sc: 0, df: 0, oc: 4 },
    trigubenko: { pts: 7, sc: 0, df: 0, oc: 7 },
    petuhova: { pts: 3, sc: 0, df: 0, oc: 3 },
  },
  15: {
    makarov: { pts: 9, sc: 2, df: 1, oc: 1 },
    strelkov: { pts: 9, sc: 2, df: 1, oc: 1 },
    belyakova: { pts: 9, sc: 2, df: 1, oc: 1 },
    kiseleva: { pts: 12, sc: 1, df: 4, oc: 1 },
    bagaeva: { pts: 10, sc: 0, df: 5, oc: 0 },
    shkolnaya: { pts: 8, sc: 1, df: 2, oc: 1 },
    trigubenko: { pts: 4, sc: 1, df: 0, oc: 1 },
    petuhova: { pts: 9, sc: 2, df: 1, oc: 1 },
  },
  16: {
    makarov: { pts: 13, sc: 3, df: 1, oc: 2 },
    strelkov: { pts: 12, sc: 2, df: 2, oc: 2 },
    belyakova: { pts: 6, sc: 0, df: 1, oc: 4 },
    kiseleva: { pts: 7, sc: 2, df: 0, oc: 1 },
    bagaeva: { pts: 5, sc: 0, df: 2, oc: 1 },
    shkolnaya: { pts: 13, sc: 1, df: 4, oc: 2 },
    trigubenko: { pts: 8, sc: 2, df: 1, oc: 0 },
    petuhova: { pts: 5, sc: 0, df: 0, oc: 5 },
  },
  17: {
    makarov: { pts: 8, sc: 1, df: 0, oc: 5 },
    strelkov: { pts: 8, sc: 1, df: 0, oc: 5 },
    belyakova: { pts: 7, sc: 0, df: 2, oc: 3 },
    kiseleva: { pts: 7, sc: 1, df: 1, oc: 2 },
    bagaeva: { pts: 8, sc: 1, df: 2, oc: 1 },
    shkolnaya: { pts: 6, sc: 1, df: 1, oc: 1 },
    trigubenko: { pts: 7, sc: 0, df: 0, oc: 7 },
    petuhova: { pts: 10, sc: 2, df: 1, oc: 2 },
  },
  18: {
    makarov: { pts: 6, sc: 0, df: 2, oc: 2 },
    strelkov: { pts: 7, sc: 1, df: 1, oc: 2 },
    belyakova: { pts: 6, sc: 0, df: 2, oc: 2 },
    kiseleva: { pts: 5, sc: 1, df: 0, oc: 2 },
    bagaeva: { pts: 9, sc: 2, df: 0, oc: 3 },
    shkolnaya: { pts: 5, sc: 0, df: 2, oc: 1 },
    trigubenko: { pts: 6, sc: 0, df: 3, oc: 0 },
    petuhova: { pts: 8, sc: 2, df: 0, oc: 2 },
  },
  19: {
    makarov: { pts: 8, sc: 1, df: 1, oc: 3 },
    strelkov: { pts: 8, sc: 1, df: 1, oc: 3 },
    belyakova: { pts: 9, sc: 2, df: 0, oc: 3 },
    kiseleva: { pts: 9, sc: 1, df: 2, oc: 2 },
    bagaeva: { pts: 7, sc: 0, df: 2, oc: 3 },
    shkolnaya: { pts: 6, sc: 0, df: 2, oc: 2 },
    trigubenko: { pts: 8, sc: 1, df: 0, oc: 5 },
    petuhova: { pts: 8, sc: 1, df: 2, oc: 1 },
  },
  20: {
    makarov: { pts: 9, sc: 2, df: 1, oc: 1 },
    strelkov: { pts: 9, sc: 2, df: 1, oc: 1 },
    belyakova: { pts: 9, sc: 2, df: 1, oc: 1 },
    kiseleva: { pts: 2, sc: 0, df: 0, oc: 2 },
    bagaeva: { pts: 4, sc: 0, df: 1, oc: 2 },
    shkolnaya: { pts: 4, sc: 0, df: 1, oc: 2 },
    trigubenko: { pts: 6, sc: 1, df: 1, oc: 1 },
    petuhova: { pts: 5, sc: 0, df: 2, oc: 1 },
  },
};

const ROUND_MATCHES = {
  1: [
    { id: 1, date: "18.07", time: "19:00", home: "Динамо Москва", away: "Балтика", result: { home: 1, away: 1 } },
    { id: 2, date: "19.07", time: "14:00", home: "Акрон", away: "Крылья Советов", result: { home: 1, away: 1 } },
    { id: 3, date: "19.07", time: "16:30", home: "Локомотив", away: "Сочи", result: { home: 3, away: 0 } },
    { id: 4, date: "19.07", time: "19:00", home: "Спартак", away: "Динамо Махачкала", result: { home: 1, away: 0 } },
    { id: 5, date: "20.07", time: "16:30", home: "Зенит", away: "Ростов", result: { home: 2, away: 1 } },
    { id: 6, date: "20.07", time: "19:00", home: "Пари Нижний Новгород", away: "Краснодар", result: { home: 0, away: 3 } },
    { id: 7, date: "20.07", time: "19:00", home: "Ахмат", away: "Рубин", result: { home: 0, away: 2 } },
    { id: 8, date: "21.07", time: "19:30", home: "Оренбург", away: "ЦСКА", result: { home: 0, away: 0 } },
  ],
  2: [
    { id: 1, date: "25.07", time: "19:00", home: "Крылья Советов", away: "Пари Нижний Новгород", result: { home: 2, away: 0 } },
    { id: 2, date: "26.07", time: "15:00", home: "Спартак", away: "Балтика", result: { home: 0, away: 3 } },
    { id: 3, date: "26.07", time: "17:30", home: "Динамо", away: "Ростов", result: { home: 1, away: 0 } },
    { id: 4, date: "26.07", time: "19:00", home: "Краснодар", away: "Локомотив", result: { home: 1, away: 2 } },
    { id: 5, date: "26.07", time: "20:30", home: "Сочи", away: "Акрон", result: { home: 0, away: 4 } },
    { id: 6, date: "27.07", time: "15:00", home: "ЦСКА", away: "Ахмат", result: { home: 2, away: 1 } },
    { id: 7, date: "27.07", time: "17:30", home: "Оренбург", away: "Динамо Мх", result: { home: 1, away: 1 } },
    { id: 8, date: "27.07", time: "20:00", home: "Рубин", away: "Зенит", result: { home: 2, away: 2 } },
  ],
  3: [
    { id: 1, date: "02.08", time: "18:00", home: "Ростов", away: "Крылья Советов", result: { home: 1, away: 4 } },
    { id: 2, date: "02.08", time: "20:30", home: "Краснодар", away: "Динамо", result: { home: 1, away: 0 } },
    { id: 3, date: "02.08", time: "20:30", home: "Пари Нижний Новгород", away: "Локомотив", result: { home: 2, away: 3 } },
    { id: 4, date: "03.08", time: "13:30", home: "Акрон", away: "Спартак", result: { home: 1, away: 1 } },
    { id: 5, date: "03.08", time: "15:45", home: "Балтика", away: "Оренбург", result: { home: 3, away: 2 } },
    { id: 6, date: "03.08", time: "18:00", home: "Зенит", away: "ЦСКА", result: { home: 1, away: 1 } },
    { id: 7, date: "03.08", time: "20:30", home: "Динамо Мх", away: "Ахмат", result: { home: 1, away: 0 } },
    { id: 8, date: "04.08", time: "20:00", home: "Рубин", away: "Сочи", result: { home: 2, away: 1 } },
  ],
  4: [
    { id: 1, date: "08.08", time: "20:00", home: "Динамо Махачкала", away: "Акрон", result: { home: 1, away: 1 } },
    { id: 2, date: "09.08", time: "13:30", home: "Крылья Советов", away: "Балтика", result: { home: 1, away: 1 } },
    { id: 3, date: "09.08", time: "15:45", home: "ЦСКА", away: "Рубин", result: { home: 5, away: 1 } },
    { id: 4, date: "09.08", time: "18:00", home: "Локомотив", away: "Спартак", result: { home: 4, away: 2 } },
    { id: 5, date: "09.08", time: "20:30", home: "Ахмат", away: "Зенит", result: { home: 1, away: 0 } },
    { id: 6, date: "10.08", time: "15:30", home: "Оренбург", away: "Краснодар", result: { home: 0, away: 1 } },
    { id: 7, date: "10.08", time: "18:00", home: "Сочи", away: "Динамо Москва", result: { home: 1, away: 1 } },
    { id: 8, date: "10.08", time: "20:30", home: "Ростов", away: "Пари Нижний Новгород", result: { home: 1, away: 0 } },
  ],
  5: [
    { id: 1, date: "16.08", time: "15:00", home: "Балтика", away: "Локомотив", result: { home: 1, away: 1 } },
    { id: 2, date: "16.08", time: "17:30", home: "Спартак", away: "Зенит", result: { home: 2, away: 2 } },
    { id: 3, date: "16.08", time: "20:30", home: "Ахмат", away: "Крылья Советов", result: { home: 3, away: 1 } },
    { id: 4, date: "17.08", time: "13:30", home: "Акрон", away: "Оренбург", result: { home: 1, away: 2 } },
    { id: 5, date: "17.08", time: "15:45", home: "Рубин", away: "Ростов", result: { home: 1, away: 0 } },
    { id: 6, date: "17.08", time: "18:00", home: "Динамо", away: "ЦСКА", result: { home: 1, away: 3 } },
    { id: 7, date: "17.08", time: "20:30", home: "Краснодар", away: "Сочи", result: { home: 5, away: 1 } },
    { id: 8, date: "18.08", time: "20:00", home: "Пари НН", away: "Динамо Махачкала", result: { home: 2, away: 0 } },
  ],
  6: [
    { id: 1, date: "22.08", time: "18:00", home: "Оренбург", away: "Ахмат", result: { home: 2, away: 2 } },
    { id: 2, date: "23.08", time: "14:00", home: "Рубин", away: "Спартак", result: { home: 0, away: 2 } },
    { id: 3, date: "23.08", time: "16:15", home: "Зенит", away: "Динамо Махачкала", result: { home: 4, away: 0 } },
    { id: 4, date: "23.08", time: "18:30", home: "Локомотив", away: "Ростов", result: { home: 3, away: 3 } },
    { id: 5, date: "23.08", time: "20:45", home: "Динамо", away: "Пари Нижний Новгород", result: { home: 3, away: 0 } },
    { id: 6, date: "24.08", time: "15:00", home: "Крылья Советов", away: "Краснодар", result: { home: 0, away: 6 } },
    { id: 7, date: "24.08", time: "17:30", home: "ЦСКА", away: "Акрон", result: { home: 3, away: 1 } },
    { id: 8, date: "24.08", time: "20:00", home: "Сочи", away: "Балтика", result: { home: 0, away: 2 } },
  ],
  7: [
    { id: 1, date: "30.08", time: "14:00", home: "Оренбург", away: "Рубин", result: { home: 2, away: 2 } },
    { id: 2, date: "30.08", time: "16:15", home: "Зенит", away: "Пари Нижний Новгород", result: { home: 2, away: 0 } },
    { id: 3, date: "30.08", time: "18:30", home: "Спартак", away: "Сочи", result: { home: 2, away: 1 } },
    { id: 4, date: "30.08", time: "20:45", home: "Ростов", away: "Ахмат", result: { home: 1, away: 1 } },
    { id: 5, date: "31.08", time: "13:30", home: "Акрон", away: "Балтика", result: { home: 0, away: 2 } },
    { id: 6, date: "31.08", time: "15:45", home: "Локомотив", away: "Крылья Советов", result: { home: 2, away: 2 } },
    { id: 7, date: "31.08", time: "18:00", home: "ЦСКА", away: "Краснодар", result: { home: 1, away: 1 } },
    { id: 8, date: "31.08", time: "20:30", home: "Динамо Махачкала", away: "Динамо Москва", result: { home: 1, away: 0 } },
  ],
  8: [
    { id: 1, date: "12.09", time: "19:00", home: "Рубин", away: "Динамо Махачкала", result: { home: 1, away: 0 } },
    { id: 2, date: "13.09", time: "14:00", home: "Пари НН", away: "Оренбург", result: { home: 3, away: 1 } },
    { id: 3, date: "13.09", time: "16:45", home: "Ахмат", away: "Локомотив", result: { home: 1, away: 1 } },
    { id: 4, date: "13.09", time: "16:45", home: "Динамо Москва", away: "Спартак", result: { home: 2, away: 2 } },
    { id: 5, date: "13.09", time: "19:30", home: "Краснодар", away: "Акрон", result: { home: 2, away: 1 } },
    { id: 6, date: "14.09", time: "14:30", home: "Крылья Советов", away: "Сочи", result: { home: 2, away: 0 } },
    { id: 7, date: "14.09", time: "17:00", home: "Балтика", away: "Зенит", result: { home: 0, away: 0 } },
    { id: 8, date: "14.09", time: "19:30", home: "Ростов", away: "ЦСКА", result: { home: 1, away: 0 } },
  ],
  9: [
    { id: 1, date: "20.09", time: "14:30", home: "Пари Нижний Новгород", away: "Ахмат", result: { home: 1, away: 2 } },
    { id: 2, date: "20.09", time: "16:45", home: "Акрон", away: "Рубин", result: { home: 2, away: 2 } },
    { id: 3, date: "20.09", time: "19:30", home: "Динамо Махачкала", away: "Локомотив", result: { home: 1, away: 1 } },
    { id: 4, date: "21.09", time: "12:00", home: "Оренбург", away: "Динамо Москва", result: { home: 1, away: 3 } },
    { id: 5, date: "21.09", time: "14:30", home: "Спартак", away: "Крылья Советов", result: { home: 2, away: 1 } },
    { id: 6, date: "21.09", time: "17:00", home: "Балтика", away: "Ростов", result: { home: 0, away: 0 } },
    { id: 7, date: "21.09", time: "19:30", home: "Краснодар", away: "Зенит", result: { home: 0, away: 2 } },
    { id: 8, date: "22.09", time: "19:00", home: "Сочи", away: "ЦСКА", result: { home: 1, away: 3 } },
  ],
  10: [
    { id: 1, date: "26.09", time: "18:00", home: "Крылья Советов", away: "Динамо Москва", result: { home: 2, away: 3 } },
    { id: 2, date: "27.09", time: "14:00", home: "Ахмат", away: "Акрон", result: { home: 3, away: 0 } },
    { id: 3, date: "27.09", time: "16:30", home: "Локомотив", away: "Рубин", result: { home: 1, away: 0 } },
    { id: 4, date: "27.09", time: "19:00", home: "Ростов", away: "Краснодар", result: { home: 0, away: 0 } },
    { id: 5, date: "27.09", time: "19:30", home: "Зенит", away: "Оренбург", result: { home: 5, away: 2 } },
    { id: 6, date: "28.09", time: "14:30", home: "ЦСКА", away: "Балтика", result: { home: 1, away: 0 } },
    { id: 7, date: "28.09", time: "17:00", home: "Динамо Махачкала", away: "Сочи", result: { home: 0, away: 0 } },
    { id: 8, date: "28.09", time: "19:30", home: "Спартак", away: "Пари Нижний Новгород", result: { home: 3, away: 0 } },
  ],
  11: [
    { id: 1, date: "04.10", time: "13:00", home: "Акрон", away: "Зенит", result: { home: 1, away: 1 } },
    { id: 2, date: "04.10", time: "15:15", home: "Рубин", away: "Крылья Советов", result: { home: 2, away: 0 } },
    { id: 3, date: "04.10", time: "17:30", home: "Краснодар", away: "Ахмат", result: { home: 2, away: 0 } },
    { id: 4, date: "04.10", time: "19:45", home: "Динамо Москва", away: "Локомотив", result: { home: 3, away: 5 } },
    { id: 5, date: "05.10", time: "12:00", home: "Оренбург", away: "Ростов", result: { home: 0, away: 1 } },
    { id: 6, date: "05.10", time: "14:15", home: "Сочи", away: "Пари Нижний Новгород", result: { home: 2, away: 1 } },
    { id: 7, date: "05.10", time: "16:30", home: "ЦСКА", away: "Спартак", result: { home: 3, away: 2 } },
    { id: 8, date: "05.10", time: "19:00", home: "Балтика", away: "Динамо Махачкала", result: { home: 2, away: 0 } },
  ],
  12: [
    { id: 1, date: "18.10", time: "13:00", home: "Пари Нижний Новгород", away: "Акрон", result: { home: 0, away: 1 } },
    { id: 2, date: "18.10", time: "13:00", home: "Крылья Советов", away: "Оренбург", result: { home: 1, away: 1 } },
    { id: 3, date: "18.10", time: "15:15", home: "Спартак", away: "Ростов", result: { home: 1, away: 1 } },
    { id: 4, date: "18.10", time: "17:30", home: "Динамо Махачкала", away: "Краснодар", result: { home: 0, away: 1 } },
    { id: 5, date: "18.10", time: "19:45", home: "Локомотив", away: "ЦСКА", result: { home: 3, away: 0 } },
    { id: 6, date: "19.10", time: "14:30", home: "Сочи", away: "Зенит", result: { home: 0, away: 3 } },
    { id: 7, date: "19.10", time: "17:00", home: "Рубин", away: "Балтика", result: { home: 0, away: 3 } },
    { id: 8, date: "19.10", time: "19:30", home: "Динамо Москва", away: "Ахмат", result: { home: 2, away: 2 } },
  ],
  13: [
    { id: 1, date: "25.10", time: "14:00", home: "Спартак М", away: "Оренбург", result: { home: 1, away: 0 } },
    { id: 2, date: "25.10", time: "16:30", home: "Ростов", away: "Динамо Мх", result: { home: 1, away: 1 } },
    { id: 3, date: "25.10", time: "19:00", home: "ЦСКА", away: "Крылья Советов", result: { home: 1, away: 0 } },
    { id: 4, date: "26.10", time: "13:00", home: "Акрон", away: "Локомотив М", result: { home: 1, away: 1 } },
    { id: 5, date: "26.10", time: "15:15", home: "Пари Нижний Новгород", away: "Балтика", result: { home: 0, away: 0 } },
    { id: 6, date: "26.10", time: "17:30", home: "Зенит", away: "Динамо М", result: { home: 2, away: 1 } },
    { id: 7, date: "26.10", time: "19:45", home: "Краснодар", away: "Рубин", result: { home: 1, away: 0 } },
    { id: 8, date: "27.10", time: "19:30", home: "Ахмат", away: "Сочи", result: { home: 2, away: 4 } },
  ],
  14: [
    { id: 1, date: "31.10", time: "19:00", home: "ЦСКА", away: "Пари Нижний Новгород", result: { home: 2, away: 0 } },
    { id: 2, date: "01.11", time: "17:45", home: "Рубин", away: "Динамо М", result: { home: 0, away: 0 } },
    { id: 3, date: "01.11", time: "17:45", home: "Динамо Мх", away: "Крылья Советов", result: { home: 2, away: 0 } },
    { id: 4, date: "01.11", time: "20:15", home: "Ростов", away: "Акрон", result: { home: 0, away: 1 } },
    { id: 5, date: "01.11", time: "20:15", home: "Зенит", away: "Локомотив М", result: { home: 2, away: 0 } },
    { id: 6, date: "02.11", time: "12:00", home: "Оренбург", away: "Сочи", result: { home: 3, away: 1 } },
    { id: 7, date: "02.11", time: "17:00", home: "Балтика", away: "Ахмат", result: { home: 2, away: 0 } },
    { id: 8, date: "02.11", time: "19:30", home: "Краснодар", away: "Спартак М", result: { home: 2, away: 1 } },
  ],
  15: [
    { id: 1, date: "08.11", time: "14:00", home: "Динамо Москва", away: "Акрон", result: { home: 1, away: 2 } },
    { id: 2, date: "08.11", time: "16:30", home: "Пари Нижний Новгород", away: "Рубин", result: { home: 0, away: 0 } },
    { id: 3, date: "08.11", time: "16:30", home: "Динамо Махачкала", away: "ЦСКА", result: { home: 0, away: 1 } },
    { id: 4, date: "08.11", time: "19:00", home: "Сочи", away: "Ростов", result: { home: 0, away: 1 } },
    { id: 5, date: "09.11", time: "13:00", home: "Крылья Советов", away: "Зенит", result: { home: 1, away: 1 } },
    { id: 6, date: "09.11", time: "15:15", home: "Локомотив", away: "Оренбург", result: { home: 1, away: 0 } },
    { id: 7, date: "09.11", time: "17:30", home: "Ахмат", away: "Спартак", result: { home: 1, away: 2 } },
    { id: 8, date: "09.11", time: "19:45", home: "Балтика", away: "Краснодар", result: { home: 1, away: 1 } },
  ],
  16: [
    { id: 1, date: "21.11", time: "18:30", home: "Акрон", away: "Сочи", result: { home: 3, away: 2 } },
    { id: 2, date: "22.11", time: "14:00", home: "Оренбург", away: "Балтика", result: { home: 0, away: 0 } },
    { id: 3, date: "22.11", time: "16:45", home: "Спартак М", away: "ЦСКА", result: { home: 1, away: 0 } },
    { id: 4, date: "22.11", time: "19:30", home: "Рубин", away: "Ахмат", result: { home: 1, away: 0 } },
    { id: 5, date: "23.11", time: "13:00", home: "Крылья Советов", away: "Ростов", result: { home: 2, away: 0 } },
    { id: 6, date: "23.11", time: "15:15", home: "Пари Нижний Новгород", away: "Зенит", result: { home: 0, away: 2 } },
    { id: 7, date: "23.11", time: "17:30", home: "Динамо М", away: "Динамо Мх", result: { home: 3, away: 0 } },
    { id: 8, date: "23.11", time: "19:45", home: "Локомотив М", away: "Краснодар", result: { home: 1, away: 1 } },
  ],
  17: [
    { id: 1, date: "29.11", time: "14:00", home: "Акрон", away: "Пари Нижний Новгород", result: { home: 1, away: 2 } },
    { id: 2, date: "29.11", time: "16:30", home: "ЦСКА", away: "Оренбург", result: { home: 2, away: 0 } },
    { id: 3, date: "29.11", time: "19:30", home: "Балтика", away: "Спартак М", result: { home: 1, away: 0 } },
    { id: 4, date: "30.11", time: "14:00", home: "Краснодар", away: "Крылья Советов", result: { home: 5, away: 0 } },
    { id: 5, date: "30.11", time: "16:30", home: "Ростов", away: "Локомотив М", result: { home: 1, away: 3 } },
    { id: 6, date: "30.11", time: "16:30", home: "Ахмат", away: "Динамо Москва", result: { home: 2, away: 1 } },
    { id: 7, date: "30.11", time: "19:00", home: "Зенит", away: "Рубин", result: { home: 1, away: 0 } },
    { id: 8, date: "01.12", time: "19:30", home: "Сочи", away: "Динамо Махачкала", result: { home: 0, away: 0 } },
  ],
  18: [
    { id: 1, date: "05.12", time: "19:00", home: "Ахмат", away: "Оренбург", result: { home: 1, away: 0 } },
    { id: 2, date: "06.12", time: "14:00", home: "Ростов", away: "Рубин", result: { home: 2, away: 0 } },
    { id: 3, date: "06.12", time: "16:30", home: "Спартак", away: "Динамо Москва", result: { home: 1, away: 1 } },
    { id: 4, date: "06.12", time: "19:30", home: "Зенит", away: "Акрон", result: { home: 2, away: 0 } },
    { id: 5, date: "07.12", time: "14:00", home: "Динамо Махачкала", away: "Пари Нижний Новгород", result: { home: 0, away: 1 } },
    { id: 6, date: "07.12", time: "16:30", home: "Сочи", away: "Локомотив", result: { home: 2, away: 4 } },
    { id: 7, date: "07.12", time: "19:00", home: "Краснодар", away: "ЦСКА", result: { home: 3, away: 2 } },
    { id: 8, date: "07.12", time: "19:00", home: "Балтика", away: "Крылья Советов", result: { home: 2, away: 0 } },
  ],
  19: [
    { id: 1, date: "27.02", time: "19:30", home: "Зенит", away: "Балтика", result: { home: 1, away: 0 } },
    { id: 2, date: "28.02", time: "12:00", home: "Оренбург", away: "Акрон", result: { home: 2, away: 0 } },
    { id: 3, date: "28.02", time: "14:30", home: "Краснодар", away: "Ростов", result: { home: 2, away: 1 } },
    { id: 4, date: "28.02", time: "17:00", home: "Локомотив", away: "Пари НН", result: { home: 2, away: 1 } },
    { id: 5, date: "28.02", time: "19:30", home: "Динамо Махачкала", away: "Рубин", result: { home: 2, away: 1 } },
    { id: 6, date: "01.03", time: "13:00", home: "Динамо Москва", away: "Крылья Советов", result: { home: 4, away: 0 } },
    { id: 7, date: "02.03", time: "14:00", home: "Сочи", away: "Спартак", result: { home: 2, away: 3 } },
    { id: 8, date: "01.03", time: "19:00", home: "Ахмат", away: "ЦСКА", result: { home: 1, away: 0 } },
  ],
  20: [
    { id: 1, date: "07.03", time: "16:30", home: "Ростов", away: "Балтика", result: { home: 1, away: 1 } },
    { id: 2, date: "07.03", time: "19:00", home: "Пари Нижний Новгород", away: "Сочи", result: { home: 2, away: 1 } },
    { id: 3, date: "08.03", time: "12:00", home: "Оренбург", away: "Зенит", result: { home: 2, away: 1 } },
    { id: 4, date: "08.03", time: "14:30", home: "Крылья Советов", away: "Динамо Махачкала", result: { home: 2, away: 0 } },
    { id: 5, date: "08.03", time: "17:00", home: "Рубин", away: "Краснодар", result: { home: 2, away: 1 } },
    { id: 6, date: "08.03", time: "19:30", home: "ЦСКА", away: "Динамо Москва", result: { home: 1, away: 4 } },
    { id: 7, date: "09.03", time: "16:30", home: "Локомотив", away: "Ахмат", result: { home: 2, away: 2 } },
    { id: 8, date: "09.03", time: "19:00", home: "Спартак", away: "Акрон", result: { home: 4, away: 3 } },
  ],
};

const ROUND_PREDS = {
  2: {
    makarov: [{ matchId: 1, home: 1, away: 1 }, { matchId: 2, home: 2, away: 0 }, { matchId: 3, home: 2, away: 1 }, { matchId: 4, home: 2, away: 1 }, { matchId: 5, home: 1, away: 0 }, { matchId: 6, home: 2, away: 1 }, { matchId: 7, home: 2, away: 1 }, { matchId: 8, home: 1, away: 3 }],
    strelkov: [{ matchId: 1, home: 1, away: 1 }, { matchId: 2, home: 2, away: 0 }, { matchId: 3, home: 2, away: 1 }, { matchId: 4, home: 2, away: 1 }, { matchId: 5, home: 1, away: 0 }, { matchId: 6, home: 2, away: 0 }, { matchId: 7, home: 1, away: 0 }, { matchId: 8, home: 1, away: 3 }],
    belyakova: [{ matchId: 1, home: 1, away: 1 }, { matchId: 2, home: 2, away: 1 }, { matchId: 3, home: 2, away: 1 }, { matchId: 4, home: 2, away: 0 }, { matchId: 5, home: 2, away: 0 }, { matchId: 6, home: 2, away: 1 }, { matchId: 7, home: 2, away: 1 }, { matchId: 8, home: 1, away: 2 }],
    kiseleva: [{ matchId: 1, home: 1, away: 1 }, { matchId: 2, home: 2, away: 1 }, { matchId: 3, home: 1, away: 1 }, { matchId: 4, home: 1, away: 2 }, { matchId: 5, home: 1, away: 0 }, { matchId: 6, home: 2, away: 0 }, { matchId: 7, home: 1, away: 0 }, { matchId: 8, home: 1, away: 2 }],
    bagaeva: [{ matchId: 1, home: 2, away: 0 }, { matchId: 2, home: 1, away: 2 }, { matchId: 3, home: 2, away: 1 }, { matchId: 4, home: 2, away: 0 }, { matchId: 5, home: 1, away: 2 }],
    shkolnaya: [{ matchId: 1, home: 2, away: 1 }, { matchId: 2, home: 2, away: 0 }, { matchId: 3, home: 2, away: 0 }, { matchId: 4, home: 1, away: 2 }, { matchId: 5, home: 1, away: 0 }, { matchId: 6, home: 2, away: 1 }, { matchId: 7, home: 1, away: 0 }, { matchId: 8, home: 1, away: 2 }],
    trigubenko: [{ matchId: 2, home: 3, away: 1 }, { matchId: 3, home: 2, away: 1 }, { matchId: 4, home: 2, away: 1 }, { matchId: 5, home: 2, away: 1 }, { matchId: 6, home: 2, away: 0 }, { matchId: 7, home: 1, away: 0 }, { matchId: 8, home: 1, away: 1 }],
  },
  3: {
    makarov: [{ matchId: 1, home: 2, away: 1 }, { matchId: 2, home: 2, away: 1 }, { matchId: 3, home: 0, away: 2 }, { matchId: 4, home: 1, away: 3 }, { matchId: 5, home: 1, away: 1 }, { matchId: 6, home: 3, away: 1 }, { matchId: 7, home: 1, away: 0 }, { matchId: 8, home: 2, away: 0 }],
    strelkov: [{ matchId: 1, home: 2, away: 1 }, { matchId: 2, home: 1, away: 0 }, { matchId: 3, home: 0, away: 2 }, { matchId: 4, home: 0, away: 2 }, { matchId: 5, home: 1, away: 1 }, { matchId: 6, home: 2, away: 1 }, { matchId: 7, home: 1, away: 0 }, { matchId: 8, home: 2, away: 1 }],
    belyakova: [{ matchId: 1, home: 2, away: 1 }, { matchId: 2, home: 2, away: 1 }, { matchId: 3, home: 1, away: 3 }, { matchId: 4, home: 0, away: 2 }, { matchId: 5, home: 1, away: 1 }, { matchId: 6, home: 2, away: 1 }, { matchId: 7, home: 1, away: 1 }, { matchId: 8, home: 2, away: 0 }],
    kiseleva: [{ matchId: 1, home: 1, away: 0 }, { matchId: 2, home: 2, away: 1 }, { matchId: 3, home: 1, away: 2 }, { matchId: 4, home: 1, away: 2 }],
    bagaeva: [{ matchId: 1, home: 1, away: 1 }, { matchId: 2, home: 2, away: 1 }, { matchId: 3, home: 0, away: 2 }, { matchId: 4, home: 1, away: 1 }, { matchId: 5, home: 2, away: 0 }, { matchId: 6, home: 1, away: 1 }, { matchId: 7, home: 1, away: 1 }, { matchId: 8, home: 1, away: 0 }],
    shkolnaya: [{ matchId: 1, home: 1, away: 2 }, { matchId: 2, home: 1, away: 2 }, { matchId: 3, home: 0, away: 2 }, { matchId: 4, home: 1, away: 2 }, { matchId: 5, home: 0, away: 1 }, { matchId: 6, home: 3, away: 1 }, { matchId: 7, home: 0, away: 1 }, { matchId: 8, home: 2, away: 0 }],
    trigubenko: [{ matchId: 1, home: 2, away: 1 }, { matchId: 2, home: 2, away: 1 }, { matchId: 3, home: 1, away: 3 }, { matchId: 4, home: 1, away: 2 }, { matchId: 5, home: 2, away: 1 }, { matchId: 6, home: 2, away: 1 }, { matchId: 7, home: 0, away: 0 }, { matchId: 8, home: 3, away: 1 }],
    petuhova: [{ matchId: 1, home: 1, away: 0 }, { matchId: 2, home: 1, away: 0 }, { matchId: 3, home: 0, away: 2 }, { matchId: 4, home: 0, away: 2 }, { matchId: 5, home: 1, away: 2 }, { matchId: 6, home: 1, away: 0 }, { matchId: 7, home: 1, away: 2 }, { matchId: 8, home: 1, away: 0 }],
  },
  4: {
    makarov: [{ matchId: 1, home: 1, away: 1 }, { matchId: 2, home: 2, away: 1 }, { matchId: 3, home: 2, away: 1 }, { matchId: 4, home: 1, away: 1 }, { matchId: 5, home: 0, away: 3 }, { matchId: 6, home: 0, away: 3 }, { matchId: 7, home: 0, away: 2 }, { matchId: 8, home: 2, away: 1 }],
    strelkov: [{ matchId: 1, home: 1, away: 1 }, { matchId: 2, home: 1, away: 0 }, { matchId: 3, home: 2, away: 1 }, { matchId: 4, home: 1, away: 2 }, { matchId: 5, home: 0, away: 2 }, { matchId: 6, home: 0, away: 2 }, { matchId: 7, home: 0, away: 2 }, { matchId: 8, home: 2, away: 1 }],
    belyakova: [{ matchId: 1, home: 2, away: 1 }, { matchId: 2, home: 2, away: 0 }, { matchId: 3, home: 2, away: 0 }, { matchId: 4, home: 2, away: 2 }, { matchId: 5, home: 1, away: 2 }, { matchId: 6, home: 0, away: 2 }, { matchId: 7, home: 0, away: 2 }, { matchId: 8, home: 2, away: 1 }],
    kiseleva: [{ matchId: 1, home: 2, away: 1 }, { matchId: 2, home: 2, away: 1 }, { matchId: 3, home: 2, away: 0 }, { matchId: 4, home: 2, away: 1 }, { matchId: 5, home: 1, away: 2 }, { matchId: 6, home: 0, away: 2 }, { matchId: 7, home: 1, away: 2 }, { matchId: 8, home: 2, away: 0 }],
    bagaeva: [{ matchId: 1, home: 1, away: 3 }, { matchId: 2, home: 0, away: 1 }, { matchId: 3, home: 2, away: 1 }, { matchId: 4, home: 0, away: 1 }, { matchId: 5, home: 0, away: 4 }, { matchId: 6, home: 0, away: 2 }, { matchId: 7, home: 0, away: 2 }, { matchId: 8, home: 1, away: 1 }],
    shkolnaya: [{ matchId: 1, home: 1, away: 2 }, { matchId: 2, home: 2, away: 1 }, { matchId: 3, home: 2, away: 1 }, { matchId: 4, home: 1, away: 2 }, { matchId: 5, home: 1, away: 3 }, { matchId: 6, home: 0, away: 2 }, { matchId: 7, home: 0, away: 2 }, { matchId: 8, home: 1, away: 1 }],
    trigubenko: [{ matchId: 1, home: 0, away: 1 }, { matchId: 2, home: 1, away: 0 }, { matchId: 3, home: 1, away: 1 }, { matchId: 4, home: 1, away: 1 }, { matchId: 5, home: 0, away: 2 }, { matchId: 6, home: 0, away: 2 }, { matchId: 7, home: 1, away: 2 }, { matchId: 8, home: 2, away: 1 }],
    petuhova: [{ matchId: 1, home: 1, away: 2 }, { matchId: 2, home: 1, away: 0 }, { matchId: 3, home: 1, away: 0 }, { matchId: 4, home: 1, away: 2 }, { matchId: 5, home: 1, away: 2 }, { matchId: 6, home: 1, away: 2 }, { matchId: 7, home: 1, away: 0 }, { matchId: 8, home: 1, away: 0 }],
  },
  5: {
    makarov: [{ matchId: 1, home: 0, away: 1 }, { matchId: 2, home: 1, away: 3 }, { matchId: 3, home: 2, away: 1 }, { matchId: 4, home: 2, away: 1 }, { matchId: 5, home: 1, away: 0 }, { matchId: 6, home: 1, away: 1 }, { matchId: 7, home: 2, away: 0 }, { matchId: 8, home: 1, away: 0 }],
    strelkov: [{ matchId: 1, home: 0, away: 2 }, { matchId: 2, home: 1, away: 1 }, { matchId: 3, home: 1, away: 0 }, { matchId: 4, home: 2, away: 1 }, { matchId: 5, home: 0, away: 1 }, { matchId: 6, home: 1, away: 1 }, { matchId: 7, home: 2, away: 0 }, { matchId: 8, home: 2, away: 1 }],
    belyakova: [{ matchId: 1, home: 1, away: 2 }, { matchId: 2, home: 1, away: 2 }, { matchId: 3, home: 1, away: 0 }, { matchId: 4, home: 2, away: 1 }, { matchId: 5, home: 2, away: 1 }, { matchId: 6, home: 1, away: 1 }, { matchId: 7, home: 1, away: 0 }, { matchId: 8, home: 1, away: 1 }],
    kiseleva: [{ matchId: 1, home: 1, away: 2 }, { matchId: 2, home: 1, away: 1 }, { matchId: 3, home: 1, away: 0 }, { matchId: 4, home: 1, away: 1 }, { matchId: 5, home: 1, away: 2 }, { matchId: 6, home: 1, away: 2 }, { matchId: 7, home: 1, away: 0 }, { matchId: 8, home: 1, away: 1 }],
    bagaeva: [{ matchId: 1, home: 1, away: 1 }, { matchId: 2, home: 1, away: 1 }, { matchId: 3, home: 1, away: 1 }, { matchId: 4, home: 2, away: 0 }, { matchId: 5, home: 2, away: 0 }, { matchId: 6, home: 1, away: 2 }, { matchId: 7, home: 4, away: 0 }, { matchId: 8, home: 1, away: 1 }],
    shkolnaya: [{ matchId: 1, home: 0, away: 2 }, { matchId: 2, home: 2, away: 3 }, { matchId: 3, home: 2, away: 1 }, { matchId: 4, home: 1, away: 0 }, { matchId: 5, home: 1, away: 0 }, { matchId: 6, home: 2, away: 1 }, { matchId: 7, home: 2, away: 0 }, { matchId: 8, home: 0, away: 1 }],
    trigubenko: [{ matchId: 1, home: 1, away: 2 }, { matchId: 2, home: 1, away: 1 }, { matchId: 3, home: 2, away: 1 }, { matchId: 4, home: 2, away: 1 }, { matchId: 5, home: 1, away: 0 }, { matchId: 6, home: 1, away: 2 }, { matchId: 7, home: 3, away: 1 }, { matchId: 8, home: 1, away: 1 }],
    petuhova: [{ matchId: 1, home: 1, away: 3 }, { matchId: 2, home: 1, away: 2 }, { matchId: 3, home: 1, away: 2 }, { matchId: 4, home: 1, away: 1 }, { matchId: 5, home: 1, away: 0 }, { matchId: 6, home: 1, away: 2 }, { matchId: 7, home: 1, away: 0 }, { matchId: 8, home: 0, away: 0 }],
  },
  6: {
    makarov: [{ matchId: 1, home: 1, away: 1 }, { matchId: 2, home: 1, away: 2 }, { matchId: 3, home: 3, away: 1 }, { matchId: 4, home: 3, away: 1 }, { matchId: 5, home: 2, away: 0 }, { matchId: 6, home: 1, away: 2 }, { matchId: 7, home: 2, away: 1 }, { matchId: 8, home: 1, away: 2 }],
    strelkov: [{ matchId: 1, home: 0, away: 1 }, { matchId: 2, home: 1, away: 2 }, { matchId: 3, home: 3, away: 0 }, { matchId: 4, home: 2, away: 1 }, { matchId: 5, home: 2, away: 0 }, { matchId: 6, home: 1, away: 2 }, { matchId: 7, home: 3, away: 1 }, { matchId: 8, home: 1, away: 0 }],
    belyakova: [{ matchId: 1, home: 1, away: 2 }, { matchId: 2, home: 1, away: 2 }, { matchId: 3, home: 2, away: 1 }, { matchId: 4, home: 2, away: 1 }, { matchId: 5, home: 2, away: 0 }, { matchId: 6, home: 1, away: 2 }, { matchId: 7, home: 2, away: 1 }, { matchId: 8, home: 1, away: 0 }],
    kiseleva: [{ matchId: 1, home: 1, away: 1 }, { matchId: 2, home: 1, away: 2 }, { matchId: 3, home: 2, away: 0 }, { matchId: 4, home: 2, away: 1 }, { matchId: 5, home: 1, away: 0 }, { matchId: 6, home: 1, away: 2 }, { matchId: 7, home: 1, away: 0 }, { matchId: 8, home: 1, away: 1 }],
    bagaeva: [{ matchId: 1, home: 1, away: 2 }, { matchId: 2, home: 1, away: 2 }, { matchId: 3, home: 2, away: 1 }, { matchId: 4, home: 3, away: 1 }, { matchId: 5, home: 2, away: 1 }, { matchId: 6, home: 1, away: 2 }, { matchId: 7, home: 3, away: 1 }, { matchId: 8, home: 1, away: 2 }],
    shkolnaya: [{ matchId: 1, home: 1, away: 2 }, { matchId: 2, home: 1, away: 2 }, { matchId: 3, home: 2, away: 0 }, { matchId: 4, home: 2, away: 1 }, { matchId: 5, home: 2, away: 0 }, { matchId: 6, home: 1, away: 2 }, { matchId: 7, home: 2, away: 1 }, { matchId: 8, home: 1, away: 1 }],
    trigubenko: [{ matchId: 1, home: 1, away: 2 }, { matchId: 2, home: 2, away: 2 }, { matchId: 3, home: 2, away: 0 }, { matchId: 4, home: 2, away: 1 }, { matchId: 5, home: 2, away: 0 }, { matchId: 6, home: 1, away: 2 }, { matchId: 7, home: 2, away: 0 }, { matchId: 8, home: 1, away: 1 }],
    petuhova: [{ matchId: 1, home: 1, away: 2 }, { matchId: 2, home: 1, away: 2 }, { matchId: 3, home: 3, away: 1 }, { matchId: 4, home: 1, away: 0 }, { matchId: 5, home: 1, away: 0 }, { matchId: 6, home: 1, away: 1 }, { matchId: 7, home: 3, away: 0 }, { matchId: 8, home: 1, away: 2 }],
  },
  7: {
    makarov: [{ matchId: 1, home: 0, away: 1 }, { matchId: 2, home: 3, away: 0 }, { matchId: 3, home: 3, away: 0 }, { matchId: 4, home: 1, away: 1 }, { matchId: 5, home: 1, away: 1 }, { matchId: 6, home: 2, away: 1 }, { matchId: 7, home: 1, away: 1 }, { matchId: 8, home: 0, away: 2 }],
    belyakova: [{ matchId: 1, home: 1, away: 1 }, { matchId: 2, home: 2, away: 0 }, { matchId: 3, home: 2, away: 1 }, { matchId: 4, home: 1, away: 1 }, { matchId: 5, home: 1, away: 0 }, { matchId: 6, home: 2, away: 1 }, { matchId: 7, home: 1, away: 1 }, { matchId: 8, home: 1, away: 2 }],
    kiseleva: [{ matchId: 1, home: 1, away: 1 }, { matchId: 2, home: 3, away: 1 }, { matchId: 3, home: 2, away: 1 }, { matchId: 4, home: 1, away: 0 }, { matchId: 5, home: 1, away: 1 }, { matchId: 6, home: 2, away: 1 }, { matchId: 7, home: 1, away: 0 }, { matchId: 8, home: 0, away: 1 }],
    bagaeva: [{ matchId: 1, home: 1, away: 2 }, { matchId: 2, home: 4, away: 1 }, { matchId: 3, home: 4, away: 0 }, { matchId: 4, home: 1, away: 1 }, { matchId: 5, home: 1, away: 1 }, { matchId: 6, home: 2, away: 0 }, { matchId: 7, home: 1, away: 1 }, { matchId: 8, home: 1, away: 2 }],
    shkolnaya: [{ matchId: 1, home: 0, away: 1 }, { matchId: 2, home: 2, away: 0 }, { matchId: 3, home: 2, away: 0 }, { matchId: 4, home: 1, away: 2 }, { matchId: 5, home: 1, away: 1 }, { matchId: 6, home: 2, away: 1 }, { matchId: 7, home: 2, away: 1 }, { matchId: 8, home: 0, away: 1 }],
    trigubenko: [{ matchId: 1, home: 1, away: 1 }, { matchId: 2, home: 3, away: 1 }, { matchId: 3, home: 3, away: 1 }, { matchId: 4, home: 1, away: 1 }, { matchId: 5, home: 1, away: 1 }, { matchId: 6, home: 3, away: 1 }, { matchId: 7, home: 1, away: 1 }, { matchId: 8, home: 1, away: 2 }],
    petuhova: [{ matchId: 1, home: 1, away: 3 }, { matchId: 2, home: 1, away: 0 }, { matchId: 3, home: 1, away: 0 }, { matchId: 4, home: 1, away: 1 }, { matchId: 5, home: 1, away: 0 }, { matchId: 6, home: 1, away: 0 }, { matchId: 7, home: 2, away: 2 }, { matchId: 8, home: 1, away: 2 }],
  },
  8: {
    makarov: [{ matchId: 1, home: 2, away: 1 }, { matchId: 2, home: 1, away: 1 }, { matchId: 3, home: 1, away: 1 }, { matchId: 4, home: 1, away: 1 }, { matchId: 5, home: 2, away: 1 }, { matchId: 6, home: 2, away: 1 }, { matchId: 7, home: 1, away: 3 }, { matchId: 8, home: 1, away: 2 }],
    strelkov: [{ matchId: 1, home: 1, away: 0 }, { matchId: 2, home: 1, away: 1 }, { matchId: 3, home: 0, away: 2 }, { matchId: 4, home: 1, away: 2 }, { matchId: 5, home: 2, away: 0 }, { matchId: 6, home: 1, away: 0 }, { matchId: 7, home: 0, away: 2 }, { matchId: 8, home: 2, away: 1 }],
    belyakova: [{ matchId: 1, home: 2, away: 1 }],
    kiseleva: [{ matchId: 1, home: 1, away: 0 }, { matchId: 2, home: 1, away: 1 }, { matchId: 3, home: 1, away: 2 }, { matchId: 4, home: 1, away: 2 }, { matchId: 5, home: 2, away: 0 }, { matchId: 6, home: 1, away: 0 }, { matchId: 7, home: 1, away: 2 }, { matchId: 8, home: 2, away: 1 }],
    bagaeva: [{ matchId: 1, home: 2, away: 1 }],
    shkolnaya: [{ matchId: 1, home: 2, away: 1 }, { matchId: 2, home: 2, away: 1 }, { matchId: 3, home: 1, away: 2 }, { matchId: 4, home: 1, away: 1 }, { matchId: 5, home: 1, away: 0 }, { matchId: 6, home: 2, away: 1 }, { matchId: 7, home: 1, away: 2 }, { matchId: 8, home: 1, away: 2 }],
    trigubenko: [{ matchId: 1, home: 1, away: 0 }, { matchId: 2, home: 2, away: 2 }, { matchId: 3, home: 1, away: 2 }, { matchId: 4, home: 1, away: 2 }, { matchId: 5, home: 3, away: 1 }, { matchId: 6, home: 1, away: 1 }, { matchId: 7, home: 1, away: 2 }, { matchId: 8, home: 1, away: 2 }],
    petuhova: [{ matchId: 1, home: 1, away: 0 }, { matchId: 2, home: 1, away: 2 }, { matchId: 3, home: 0, away: 2 }, { matchId: 4, home: 1, away: 3 }, { matchId: 5, home: 1, away: 0 }, { matchId: 6, home: 1, away: 0 }, { matchId: 7, home: 0, away: 2 }, { matchId: 8, home: 1, away: 1 }],
  },
  9: {
    makarov: [{ matchId: 1, home: 1, away: 2 }, { matchId: 2, home: 1, away: 1 }, { matchId: 3, home: 1, away: 2 }, { matchId: 4, home: 0, away: 2 }, { matchId: 5, home: 3, away: 1 }, { matchId: 6, home: 0, away: 0 }, { matchId: 7, home: 1, away: 2 }, { matchId: 8, home: 0, away: 1 }],
    strelkov: [{ matchId: 1, home: 0, away: 1 }, { matchId: 2, home: 1, away: 1 }, { matchId: 3, home: 1, away: 2 }, { matchId: 4, home: 0, away: 2 }, { matchId: 5, home: 2, away: 0 }, { matchId: 6, home: 0, away: 0 }, { matchId: 7, home: 1, away: 2 }, { matchId: 8, home: 0, away: 1 }],
    belyakova: [{ matchId: 1, home: 0, away: 1 }, { matchId: 2, home: 1, away: 2 }, { matchId: 3, home: 1, away: 2 }, { matchId: 4, home: 1, away: 2 }, { matchId: 5, home: 2, away: 1 }, { matchId: 6, home: 1, away: 1 }, { matchId: 7, home: 1, away: 2 }, { matchId: 8, home: 0, away: 2 }],
    kiseleva: [{ matchId: 1, home: 1, away: 1 }, { matchId: 2, home: 0, away: 1 }, { matchId: 3, home: 1, away: 2 }, { matchId: 4, home: 0, away: 1 }, { matchId: 5, home: 2, away: 0 }, { matchId: 6, home: 1, away: 1 }, { matchId: 7, home: 1, away: 1 }, { matchId: 8, home: 1, away: 2 }],
    bagaeva: [{ matchId: 1, home: 1, away: 2 }, { matchId: 2, home: 1, away: 1 }],
    shkolnaya: [{ matchId: 1, home: 1, away: 2 }, { matchId: 2, home: 1, away: 2 }, { matchId: 3, home: 0, away: 2 }, { matchId: 4, home: 0, away: 2 }, { matchId: 5, home: 2, away: 1 }, { matchId: 6, home: 0, away: 1 }, { matchId: 7, home: 1, away: 2 }, { matchId: 8, home: 1, away: 1 }],
    trigubenko: [{ matchId: 1, home: 1, away: 2 }, { matchId: 2, home: 1, away: 2 }, { matchId: 3, home: 1, away: 2 }, { matchId: 4, home: 1, away: 3 }, { matchId: 5, home: 3, away: 1 }, { matchId: 6, home: 1, away: 0 }, { matchId: 7, home: 1, away: 1 }, { matchId: 8, home: 1, away: 2 }],
    petuhova: [{ matchId: 1, home: 0, away: 2 }, { matchId: 2, home: 0, away: 2 }, { matchId: 3, home: 0, away: 2 }, { matchId: 4, home: 0, away: 2 }, { matchId: 5, home: 1, away: 0 }, { matchId: 6, home: 1, away: 3 }, { matchId: 7, home: 1, away: 1 }, { matchId: 8, home: 0, away: 2 }],
  },
  10: {
    makarov: [{ matchId: 1, home: 1, away: 2 }, { matchId: 2, home: 2, away: 1 }, { matchId: 3, home: 2, away: 1 }, { matchId: 4, home: 0, away: 1 }, { matchId: 5, home: 3, away: 0 }, { matchId: 6, home: 1, away: 0 }, { matchId: 7, home: 1, away: 1 }, { matchId: 8, home: 3, away: 1 }],
    strelkov: [{ matchId: 1, home: 1, away: 2 }, { matchId: 2, home: 2, away: 0 }, { matchId: 3, home: 1, away: 0 }, { matchId: 4, home: 0, away: 2 }, { matchId: 5, home: 2, away: 0 }, { matchId: 6, home: 2, away: 0 }, { matchId: 7, home: 1, away: 1 }, { matchId: 8, home: 3, away: 1 }],
    belyakova: [{ matchId: 1, home: 1, away: 2 }, { matchId: 2, home: 2, away: 0 }, { matchId: 3, home: 2, away: 1 }, { matchId: 4, home: 1, away: 1 }, { matchId: 5, home: 3, away: 1 }, { matchId: 6, home: 2, away: 1 }, { matchId: 7, home: 1, away: 1 }, { matchId: 8, home: 2, away: 1 }],
    kiseleva: [{ matchId: 1, home: 1, away: 1 }, { matchId: 2, home: 1, away: 0 }, { matchId: 3, home: 2, away: 1 }, { matchId: 4, home: 1, away: 1 }, { matchId: 5, home: 3, away: 1 }, { matchId: 6, home: 1, away: 0 }, { matchId: 7, home: 1, away: 1 }, { matchId: 8, home: 1, away: 0 }],
    bagaeva: [{ matchId: 1, home: 1, away: 2 }, { matchId: 2, home: 2, away: 1 }, { matchId: 3, home: 2, away: 0 }, { matchId: 4, home: 2, away: 2 }, { matchId: 5, home: 3, away: 2 }, { matchId: 6, home: 2, away: 1 }, { matchId: 7, home: 2, away: 1 }, { matchId: 8, home: 2, away: 0 }],
    shkolnaya: [{ matchId: 1, home: 1, away: 2 }, { matchId: 2, home: 1, away: 1 }, { matchId: 3, home: 2, away: 1 }, { matchId: 4, home: 0, away: 1 }, { matchId: 5, home: 2, away: 0 }, { matchId: 6, home: 1, away: 0 }, { matchId: 7, home: 2, away: 1 }, { matchId: 8, home: 2, away: 1 }],
    petuhova: [{ matchId: 1, home: 1, away: 1 }, { matchId: 2, home: 1, away: 0 }, { matchId: 3, home: 1, away: 2 }, { matchId: 4, home: 1, away: 2 }, { matchId: 5, home: 2, away: 0 }, { matchId: 6, home: 2, away: 0 }, { matchId: 7, home: 1, away: 2 }, { matchId: 8, home: 2, away: 0 }],
  },
  11: {
    bagaeva: [{ matchId: 1, home: 0, away: 2 }, { matchId: 2, home: 2, away: 0 }, { matchId: 3, home: 2, away: 0 }, { matchId: 4, home: 0, away: 0 }, { matchId: 5, home: 1, away: 0 }, { matchId: 6, home: 2, away: 1 }, { matchId: 7, home: 1, away: 2 }, { matchId: 8, home: 2, away: 0 }],
  },
  12: {
    makarov: [{ matchId: 1, home: 1, away: 2 }, { matchId: 2, home: 2, away: 1 }, { matchId: 3, home: 3, away: 1 }, { matchId: 4, home: 0, away: 1 }, { matchId: 5, home: 2, away: 1 }, { matchId: 6, home: 0, away: 3 }, { matchId: 7, home: 0, away: 0 }, { matchId: 8, home: 2, away: 1 }],
    strelkov: [{ matchId: 1, home: 1, away: 1 }, { matchId: 2, home: 2, away: 1 }, { matchId: 3, home: 2, away: 1 }, { matchId: 4, home: 1, away: 2 }, { matchId: 5, home: 2, away: 1 }, { matchId: 6, home: 1, away: 3 }, { matchId: 7, home: 1, away: 0 }, { matchId: 8, home: 1, away: 0 }],
    belyakova: [{ matchId: 1, home: 1, away: 1 }, { matchId: 2, home: 2, away: 0 }, { matchId: 3, home: 1, away: 2 }, { matchId: 4, home: 1, away: 2 }, { matchId: 5, home: 1, away: 2 }, { matchId: 6, home: 1, away: 3 }, { matchId: 7, home: 1, away: 1 }, { matchId: 8, home: 2, away: 1 }],
    kiseleva: [{ matchId: 1, home: 1, away: 1 }, { matchId: 2, home: 1, away: 1 }, { matchId: 3, home: 1, away: 0 }, { matchId: 4, home: 1, away: 2 }, { matchId: 5, home: 2, away: 1 }, { matchId: 6, home: 1, away: 3 }, { matchId: 7, home: 1, away: 0 }, { matchId: 8, home: 1, away: 0 }],
    bagaeva: [{ matchId: 1, home: 0, away: 2 }, { matchId: 2, home: 0, away: 1 }, { matchId: 3, home: 2, away: 0 }, { matchId: 4, home: 0, away: 2 }, { matchId: 5, home: 1, away: 1 }, { matchId: 6, home: 0, away: 2 }],
    shkolnaya: [{ matchId: 1, home: 1, away: 1 }, { matchId: 2, home: 2, away: 1 }, { matchId: 3, home: 2, away: 1 }, { matchId: 4, home: 1, away: 1 }, { matchId: 5, home: 2, away: 1 }, { matchId: 6, home: 0, away: 2 }, { matchId: 7, home: 1, away: 0 }, { matchId: 8, home: 1, away: 2 }],
    trigubenko: [{ matchId: 1, home: 1, away: 1 }, { matchId: 2, home: 2, away: 0 }, { matchId: 3, home: 2, away: 1 }, { matchId: 4, home: 1, away: 1 }, { matchId: 5, home: 2, away: 2 }, { matchId: 6, home: 0, away: 2 }, { matchId: 7, home: 1, away: 0 }, { matchId: 8, home: 2, away: 1 }],
    petuhova: [{ matchId: 1, home: 1, away: 0 }, { matchId: 2, home: 1, away: 0 }, { matchId: 3, home: 1, away: 1 }, { matchId: 4, home: 0, away: 2 }, { matchId: 5, home: 1, away: 2 }, { matchId: 6, home: 0, away: 1 }, { matchId: 7, home: 1, away: 0 }, { matchId: 8, home: 1, away: 1 }],
  },
  13: {
    makarov: [{ matchId: 1, home: 2, away: 0 }, { matchId: 2, home: 1, away: 0 }, { matchId: 3, home: 1, away: 0 }, { matchId: 4, home: 1, away: 1 }, { matchId: 5, home: 0, away: 1 }, { matchId: 6, home: 2, away: 1 }, { matchId: 7, home: 1, away: 0 }, { matchId: 8, home: 2, away: 1 }],
    strelkov: [{ matchId: 1, home: 2, away: 0 }, { matchId: 2, home: 1, away: 0 }, { matchId: 3, home: 2, away: 0 }, { matchId: 4, home: 1, away: 3 }, { matchId: 5, home: 1, away: 1 }, { matchId: 6, home: 2, away: 1 }, { matchId: 7, home: 1, away: 0 }, { matchId: 8, home: 1, away: 0 }],
    belyakova: [{ matchId: 1, home: 2, away: 1 }, { matchId: 2, home: 2, away: 1 }, { matchId: 3, home: 1, away: 0 }, { matchId: 4, home: 1, away: 1 }, { matchId: 5, home: 0, away: 1 }, { matchId: 6, home: 2, away: 1 }, { matchId: 7, home: 2, away: 1 }, { matchId: 8, home: 2, away: 0 }],
    kiseleva: [{ matchId: 1, home: 2, away: 0 }, { matchId: 2, home: 1, away: 0 }, { matchId: 3, home: 2, away: 0 }, { matchId: 4, home: 1, away: 2 }, { matchId: 5, home: 1, away: 1 }, { matchId: 6, home: 2, away: 1 }, { matchId: 7, home: 1, away: 0 }, { matchId: 8, home: 1, away: 1 }],
    bagaeva: [{ matchId: 4, home: 0, away: 2 }, { matchId: 5, home: 0, away: 2 }, { matchId: 6, home: 4, away: 1 }, { matchId: 7, home: 2, away: 0 }, { matchId: 8, home: 2, away: 1 }],
    shkolnaya: [{ matchId: 1, home: 2, away: 0 }, { matchId: 2, home: 1, away: 1 }, { matchId: 3, home: 2, away: 1 }, { matchId: 4, home: 0, away: 1 }, { matchId: 5, home: 0, away: 1 }, { matchId: 6, home: 2, away: 1 }, { matchId: 7, home: 1, away: 1 }, { matchId: 8, home: 2, away: 1 }],
    trigubenko: [{ matchId: 1, home: 2, away: 0 }, { matchId: 2, home: 1, away: 0 }, { matchId: 3, home: 2, away: 0 }, { matchId: 4, home: 1, away: 2 }, { matchId: 5, home: 1, away: 2 }, { matchId: 6, home: 2, away: 1 }, { matchId: 7, home: 1, away: 1 }, { matchId: 8, home: 2, away: 1 }],
    petuhova: [{ matchId: 1, home: 1, away: 2 }, { matchId: 2, home: 1, away: 0 }, { matchId: 3, home: 1, away: 0 }, { matchId: 4, home: 0, away: 3 }, { matchId: 5, home: 1, away: 1 }, { matchId: 6, home: 1, away: 2 }, { matchId: 7, home: 1, away: 3 }, { matchId: 8, home: 1, away: 0 }],
  },
  14: {
  },
  15: {
    makarov: [{ matchId: 1, home: 3, away: 1 }, { matchId: 2, home: 0, away: 1 }, { matchId: 3, home: 1, away: 2 }, { matchId: 4, home: 1, away: 1 }, { matchId: 5, home: 1, away: 3 }, { matchId: 6, home: 3, away: 0 }, { matchId: 7, home: 1, away: 2 }, { matchId: 8, home: 1, away: 1 }],
    strelkov: [{ matchId: 1, home: 1, away: 0 }, { matchId: 2, home: 1, away: 2 }, { matchId: 3, home: 0, away: 2 }, { matchId: 4, home: 1, away: 2 }, { matchId: 5, home: 1, away: 2 }, { matchId: 6, home: 1, away: 0 }, { matchId: 7, home: 1, away: 2 }, { matchId: 8, home: 0, away: 2 }],
    belyakova: [{ matchId: 1, home: 2, away: 1 }, { matchId: 2, home: 1, away: 2 }, { matchId: 3, home: 1, away: 2 }, { matchId: 4, home: 1, away: 1 }, { matchId: 5, home: 1, away: 2 }, { matchId: 6, home: 2, away: 0 }, { matchId: 7, home: 1, away: 2 }, { matchId: 8, home: 1, away: 1 }],
    kiseleva: [{ matchId: 1, home: 1, away: 0 }, { matchId: 2, home: 1, away: 1 }, { matchId: 3, home: 1, away: 2 }, { matchId: 4, home: 1, away: 2 }, { matchId: 5, home: 1, away: 2 }, { matchId: 6, home: 2, away: 0 }, { matchId: 7, home: 0, away: 1 }, { matchId: 8, home: 1, away: 1 }],
    bagaeva: [{ matchId: 1, home: 2, away: 1 }, { matchId: 2, home: 1, away: 1 }, { matchId: 3, home: 1, away: 2 }, { matchId: 4, home: 1, away: 2 }, { matchId: 5, home: 1, away: 2 }, { matchId: 6, home: 2, away: 1 }, { matchId: 7, home: 0, away: 1 }, { matchId: 8, home: 1, away: 2 }],
    shkolnaya: [{ matchId: 1, home: 2, away: 1 }, { matchId: 2, home: 0, away: 1 }, { matchId: 3, home: 1, away: 2 }, { matchId: 4, home: 1, away: 2 }, { matchId: 5, home: 1, away: 2 }, { matchId: 6, home: 2, away: 0 }, { matchId: 7, home: 1, away: 2 }, { matchId: 8, home: 2, away: 1 }],
    trigubenko: [{ matchId: 1, home: 2, away: 1 }, { matchId: 2, home: 0, away: 1 }, { matchId: 3, home: 1, away: 1 }, { matchId: 4, home: 1, away: 1 }, { matchId: 5, home: 1, away: 3 }, { matchId: 6, home: 3, away: 1 }, { matchId: 7, home: 1, away: 2 }, { matchId: 8, home: 0, away: 1 }],
    petuhova: [{ matchId: 1, home: 1, away: 0 }, { matchId: 2, home: 1, away: 2 }, { matchId: 3, home: 0, away: 2 }, { matchId: 4, home: 1, away: 2 }, { matchId: 5, home: 1, away: 2 }, { matchId: 6, home: 1, away: 0 }, { matchId: 7, home: 1, away: 2 }, { matchId: 8, home: 1, away: 2 }],
  },
  16: {
    makarov: [{ matchId: 1, home: 2, away: 1 }, { matchId: 2, home: 0, away: 1 }, { matchId: 3, home: 2, away: 2 }, { matchId: 4, home: 1, away: 0 }, { matchId: 5, home: 2, away: 1 }, { matchId: 6, home: 0, away: 2 }, { matchId: 7, home: 2, away: 0 }, { matchId: 8, home: 1, away: 1 }],
    strelkov: [{ matchId: 1, home: 2, away: 1 }, { matchId: 2, home: 0, away: 1 }, { matchId: 3, home: 2, away: 1 }, { matchId: 4, home: 1, away: 0 }, { matchId: 5, home: 2, away: 1 }, { matchId: 6, home: 0, away: 2 }, { matchId: 7, home: 2, away: 0 }, { matchId: 8, home: 2, away: 1 }],
    belyakova: [{ matchId: 1, home: 2, away: 1 }, { matchId: 2, home: 1, away: 2 }, { matchId: 3, home: 1, away: 1 }, { matchId: 4, home: 2, away: 0 }, { matchId: 5, home: 2, away: 1 }, { matchId: 6, home: 1, away: 2 }, { matchId: 7, home: 2, away: 0 }, { matchId: 8, home: 2, away: 1 }],
    kiseleva: [{ matchId: 1, home: 1, away: 1 }, { matchId: 2, home: 1, away: 0 }, { matchId: 3, home: 1, away: 1 }, { matchId: 4, home: 1, away: 0 }, { matchId: 5, home: 0, away: 1 }, { matchId: 6, home: 0, away: 2 }, { matchId: 7, home: 1, away: 0 }, { matchId: 8, home: 2, away: 1 }],
    bagaeva: [{ matchId: 2, home: 0, away: 2 }, { matchId: 3, home: 1, away: 2 }, { matchId: 4, home: 2, away: 1 }, { matchId: 5, home: 1, away: 2 }, { matchId: 6, home: 1, away: 3 }, { matchId: 7, home: 3, away: 1 }, { matchId: 8, home: 1, away: 2 }],
    shkolnaya: [{ matchId: 1, home: 1, away: 0 }, { matchId: 2, home: 1, away: 1 }, { matchId: 3, home: 2, away: 1 }, { matchId: 4, home: 2, away: 1 }, { matchId: 5, home: 2, away: 1 }, { matchId: 6, home: 0, away: 2 }, { matchId: 7, home: 2, away: 0 }, { matchId: 8, home: 2, away: 1 }],
    trigubenko: [{ matchId: 2, home: 1, away: 2 }, { matchId: 3, home: 1, away: 3 }, { matchId: 4, home: 2, away: 1 }, { matchId: 5, home: 1, away: 1 }, { matchId: 6, home: 0, away: 2 }, { matchId: 7, home: 1, away: 1 }, { matchId: 8, home: 1, away: 1 }],
    petuhova: [{ matchId: 1, home: 1, away: 2 }, { matchId: 2, home: 1, away: 0 }],
  },
  17: {
    makarov: [{ matchId: 1, home: 2, away: 1 }, { matchId: 2, home: 2, away: 0 }, { matchId: 3, home: 1, away: 1 }, { matchId: 4, home: 3, away: 1 }, { matchId: 5, home: 1, away: 2 }],
    strelkov: [{ matchId: 1, home: 2, away: 1 }, { matchId: 2, home: 2, away: 0 }, { matchId: 3, home: 1, away: 2 }, { matchId: 4, home: 3, away: 1 }, { matchId: 5, home: 1, away: 2 }],
    belyakova: [{ matchId: 1, home: 2, away: 1 }, { matchId: 2, home: 1, away: 0 }, { matchId: 3, home: 1, away: 2 }, { matchId: 4, home: 1, away: 0 }, { matchId: 5, home: 1, away: 2 }, { matchId: 6, home: 0, away: 1 }, { matchId: 7, home: 2, away: 1 }, { matchId: 8, home: 1, away: 1 }],
    kiseleva: [{ matchId: 1, home: 1, away: 1 }, { matchId: 2, home: 2, away: 0 }, { matchId: 3, home: 1, away: 2 }, { matchId: 4, home: 1, away: 0 }, { matchId: 5, home: 1, away: 2 }, { matchId: 6, home: 1, away: 1 }, { matchId: 7, home: 2, away: 1 }, { matchId: 8, home: 1, away: 0 }],
    bagaeva: [{ matchId: 1, home: 2, away: 1 }, { matchId: 2, home: 2, away: 0 }, { matchId: 3, home: 1, away: 2 }, { matchId: 4, home: 3, away: 0 }, { matchId: 5, home: 1, away: 1 }, { matchId: 6, home: 0, away: 1 }, { matchId: 7, home: 2, away: 1 }, { matchId: 8, home: 1, away: 1 }],
    shkolnaya: [{ matchId: 1, home: 1, away: 0 }, { matchId: 2, home: 2, away: 0 }, { matchId: 3, home: 1, away: 2 }, { matchId: 4, home: 1, away: 1 }, { matchId: 5, home: 1, away: 2 }, { matchId: 6, home: 1, away: 2 }, { matchId: 7, home: 2, away: 1 }, { matchId: 8, home: 2, away: 1 }],
    trigubenko: [{ matchId: 1, home: 2, away: 1 }, { matchId: 2, home: 2, away: 1 }, { matchId: 3, home: 1, away: 2 }, { matchId: 4, home: 2, away: 0 }, { matchId: 5, home: 1, away: 2 }],
    petuhova: [{ matchId: 1, home: 1, away: 0 }, { matchId: 2, home: 1, away: 0 }, { matchId: 3, home: 0, away: 2 }, { matchId: 4, home: 1, away: 0 }, { matchId: 5, home: 1, away: 3 }, { matchId: 6, home: 1, away: 0 }, { matchId: 7, home: 1, away: 0 }, { matchId: 8, home: 1, away: 0 }],
  },
  18: {
    makarov: [{ matchId: 1, home: 2, away: 1 }, { matchId: 2, home: 1, away: 1 }, { matchId: 3, home: 2, away: 1 }, { matchId: 4, home: 4, away: 1 }, { matchId: 5, home: 2, away: 1 }, { matchId: 6, home: 0, away: 2 }, { matchId: 7, home: 1, away: 1 }, { matchId: 8, home: 1, away: 0 }],
    strelkov: [{ matchId: 1, home: 1, away: 1 }, { matchId: 2, home: 1, away: 0 }, { matchId: 3, home: 2, away: 1 }, { matchId: 4, home: 2, away: 0 }, { matchId: 5, home: 1, away: 1 }, { matchId: 6, home: 1, away: 2 }, { matchId: 7, home: 2, away: 1 }, { matchId: 8, home: 1, away: 1 }],
    belyakova: [{ matchId: 1, home: 1, away: 1 }, { matchId: 2, home: 2, away: 1 }, { matchId: 3, home: 2, away: 1 }, { matchId: 4, home: 3, away: 1 }, { matchId: 5, home: 1, away: 1 }, { matchId: 6, home: 2, away: 1 }, { matchId: 7, home: 2, away: 1 }, { matchId: 8, home: 1, away: 0 }],
    kiseleva: [{ matchId: 1, home: 1, away: 1 }, { matchId: 2, home: 1, away: 0 }, { matchId: 3, home: 2, away: 1 }, { matchId: 4, home: 2, away: 0 }, { matchId: 5, home: 1, away: 1 }, { matchId: 6, home: 1, away: 2 }, { matchId: 7, home: 1, away: 1 }, { matchId: 8, home: 1, away: 1 }],
    bagaeva: [{ matchId: 1, home: 1, away: 0 }, { matchId: 2, home: 1, away: 1 }, { matchId: 3, home: 3, away: 0 }, { matchId: 4, home: 2, away: 0 }, { matchId: 5, home: 1, away: 1 }, { matchId: 6, home: 1, away: 2 }, { matchId: 7, home: 2, away: 0 }, { matchId: 8, home: 3, away: 0 }],
    shkolnaya: [{ matchId: 1, home: 2, away: 1 }, { matchId: 2, home: 1, away: 2 }, { matchId: 3, home: 2, away: 1 }, { matchId: 4, home: 2, away: 1 }, { matchId: 5, home: 1, away: 0 }, { matchId: 6, home: 0, away: 2 }, { matchId: 7, home: 1, away: 2 }, { matchId: 8, home: 0, away: 1 }],
    trigubenko: [{ matchId: 1, home: 1, away: 1 }, { matchId: 2, home: 1, away: 1 }, { matchId: 3, home: 2, away: 1 }, { matchId: 4, home: 3, away: 1 }, { matchId: 5, home: 1, away: 0 }, { matchId: 6, home: 1, away: 3 }, { matchId: 7, home: 1, away: 0 }, { matchId: 8, home: 1, away: 1 }],
    petuhova: [{ matchId: 1, home: 1, away: 0 }, { matchId: 2, home: 1, away: 2 }, { matchId: 3, home: 1, away: 0 }, { matchId: 4, home: 2, away: 0 }],
  },
  19: {
    makarov: [{ matchId: 1, home: 2, away: 1 },{ matchId: 2, home: 1, away: 1 },{ matchId: 3, home: 2, away: 0 },{ matchId: 4, home: 2, away: 1 },{ matchId: 5, home: 0, away: 0 },{ matchId: 6, home: 2, away: 0 },{ matchId: 7, home: 0, away: 2 },{ matchId: 8, home: 0, away: 1 }],
    strelkov: [{ matchId: 1, home: 2, away: 0 },{ matchId: 2, home: 0, away: 1 },{ matchId: 3, home: 2, away: 0 },{ matchId: 4, home: 2, away: 1 },{ matchId: 5, home: 0, away: 1 },{ matchId: 6, home: 2, away: 0 },{ matchId: 7, home: 0, away: 1 },{ matchId: 8, home: 0, away: 1 }],
    belyakova: [{ matchId: 1, home: 2, away: 0 },{ matchId: 2, home: 0, away: 1 },{ matchId: 3, home: 2, away: 1 },{ matchId: 4, home: 2, away: 1 },{ matchId: 5, home: 1, away: 2 },{ matchId: 6, home: 2, away: 0 },{ matchId: 7, home: 0, away: 2 },{ matchId: 8, home: 0, away: 2 }],
    kiseleva: [{ matchId: 1, home: 2, away: 0 },{ matchId: 2, home: 1, away: 1 },{ matchId: 3, home: 1, away: 0 },{ matchId: 4, home: 2, away: 1 },{ matchId: 5, home: 0, away: 1 },{ matchId: 6, home: 1, away: 0 },{ matchId: 7, home: 1, away: 2 },{ matchId: 8, home: 1, away: 2 }],
    bagaeva: [{ matchId: 1, home: 1, away: 2 },{ matchId: 2, home: 1, away: 1 },{ matchId: 3, home: 2, away: 0 },{ matchId: 4, home: 2, away: 0 },{ matchId: 5, home: 1, away: 0 },{ matchId: 6, home: 2, away: 0 },{ matchId: 7, home: 0, away: 1 },{ matchId: 8, home: 1, away: 1 }],
    shkolnaya: [{ matchId: 1, home: 2, away: 1 },{ matchId: 2, home: 1, away: 2 },{ matchId: 3, home: 1, away: 0 },{ matchId: 4, home: 2, away: 0 },{ matchId: 5, home: 0, away: 1 },{ matchId: 6, home: 1, away: 1 },{ matchId: 7, home: 0, away: 2 },{ matchId: 8, home: 1, away: 2 }],
    trigubenko: [{ matchId: 1, home: 2, away: 0 },{ matchId: 2, home: 2, away: 1 },{ matchId: 3, home: 2, away: 1 },{ matchId: 4, home: 2, away: 0 },{ matchId: 5, home: 1, away: 1 },{ matchId: 6, home: 2, away: 1 },{ matchId: 7, home: 1, away: 3 },{ matchId: 8, home: 1, away: 2 }],
    petuhova: [{ matchId: 1, home: 1, away: 0 },{ matchId: 2, home: 1, away: 0 },{ matchId: 3, home: 1, away: 0 },{ matchId: 4, home: 1, away: 0 },{ matchId: 5, home: 2, away: 3 },{ matchId: 6, home: 1, away: 1 },{ matchId: 7, home: 1, away: 0 },{ matchId: 8, home: 1, away: 2 }],
  },
  20: {
    makarov: [{ matchId: 1, home: 1, away: 1 },{ matchId: 2, home: 2, away: 1 },{ matchId: 3, home: 1, away: 3 },{ matchId: 4, home: 2, away: 1 },{ matchId: 5, home: 1, away: 1 },{ matchId: 6, home: 2, away: 1 },{ matchId: 7, home: 2, away: 1 },{ matchId: 8, home: 2, away: 1 }],
    petuhova: [{ matchId: 1, home: 1, away: 0 },{ matchId: 2, home: 1, away: 0 },{ matchId: 3, home: 1, away: 3 },{ matchId: 4, home: 1, away: 0 },{ matchId: 5, home: 1, away: 1 },{ matchId: 6, home: 1, away: 0 },{ matchId: 7, home: 1, away: 0 },{ matchId: 8, home: 1, away: 0 }],
    kiseleva: [{ matchId: 1, home: 1, away: 0 },{ matchId: 2, home: 1, away: 1 },{ matchId: 3, home: 1, away: 2 },{ matchId: 4, home: 1, away: 0 },{ matchId: 5, home: 1, away: 2 },{ matchId: 6, home: 2, away: 1 },{ matchId: 7, home: 1, away: 0 },{ matchId: 8, home: 2, away: 0 }],
    shkolnaya: [{ matchId: 1, home: 1, away: 2 },{ matchId: 2, home: 1, away: 0 },{ matchId: 3, home: 1, away: 3 },{ matchId: 4, home: 2, away: 1 },{ matchId: 5, home: 1, away: 1 },{ matchId: 6, home: 3, away: 2 },{ matchId: 7, home: 2, away: 1 },{ matchId: 8, home: 3, away: 1 }],
    belyakova: [{ matchId: 1, home: 1, away: 1 },{ matchId: 2, home: 2, away: 1 },{ matchId: 3, home: 0, away: 2 },{ matchId: 4, home: 2, away: 1 },{ matchId: 5, home: 1, away: 2 },{ matchId: 6, home: 2, away: 1 },{ matchId: 7, home: 1, away: 0 },{ matchId: 8, home: 2, away: 1 }],
    strelkov: [{ matchId: 1, home: 1, away: 1 },{ matchId: 2, home: 2, away: 1 },{ matchId: 3, home: 1, away: 3 },{ matchId: 4, home: 2, away: 1 },{ matchId: 5, home: 1, away: 2 },{ matchId: 6, home: 2, away: 1 },{ matchId: 7, home: 2, away: 1 },{ matchId: 8, home: 2, away: 1 }],
    bagaeva: [{ matchId: 1, home: 1, away: 2 },{ matchId: 2, home: 1, away: 1 },{ matchId: 3, home: 2, away: 2 },{ matchId: 4, home: 2, away: 1 },{ matchId: 5, home: 2, away: 2 },{ matchId: 6, home: 1, away: 2 },{ matchId: 7, home: 1, away: 0 },{ matchId: 8, home: 2, away: 1 }],
    trigubenko: [{ matchId: 1, home: 1, away: 1 },{ matchId: 2, home: 1, away: 1 },{ matchId: 3, home: 0, away: 3 },{ matchId: 4, home: 1, away: 1 },{ matchId: 5, home: 1, away: 2 },{ matchId: 6, home: 2, away: 1 },{ matchId: 7, home: 1, away: 1 },{ matchId: 8, home: 3, away: 1 }],
  },
};

const CUP_GROUP = [
  { id: "makarov", team: "Ольмек", g: 14, w: 9, d: 4, l: 1, gf: 19, ga: 6, pts: 31, po: true },
  { id: "kiseleva", team: "Китти", g: 14, w: 6, d: 7, l: 1, gf: 18, ga: 11, pts: 25, po: true },
  { id: "strelkov", team: "ЛЭМЗ", g: 14, w: 5, d: 6, l: 3, gf: 15, ga: 11, pts: 21, po: true },
  { id: "belyakova", team: "Кот", g: 14, w: 4, d: 5, l: 5, gf: 12, ga: 10, pts: 17, po: true },
  { id: "petuhova", team: "Птыха", g: 14, w: 4, d: 4, l: 6, gf: 13, ga: 16, pts: 16, po: false },
  { id: "shkolnaya", team: "Школа", g: 14, w: 4, d: 2, l: 8, gf: 15, ga: 20, pts: 14, po: false },
  { id: "bagaeva", team: "Вобла", g: 14, w: 3, d: 4, l: 7, gf: 9, ga: 22, pts: 13, po: false },
  { id: "trigubenko", team: "Пор. Практика", g: 14, w: 2, d: 6, l: 6, gf: 13, ga: 18, pts: 12, po: false },
];

const SEMIS = [
  { t1: "Ольмек", t2: "Кот", l1: "Ольмек 3-2 Кот", l2: "Кот 0-0 Ольмек", l2l: "Кот — Ольмек", agg1: 3, agg2: 2, winner: "Ольмек" },
  { t1: "Китти", t2: "ЛЭМЗ", l1: "Китти 0-1 ЛЭМЗ", l2: "ЛЭМЗ 0-0 Китти", l2l: "ЛЭМЗ — Китти", agg1: 0, agg2: 1, winner: "ЛЭМЗ" },
];

const CUP_MATCHES_19 = [
  { id: "sf1", homeTeam: "Кот", homeId: "belyakova", awayTeam: "Ольмек", awayId: "makarov", firstLeg: "Ольмек 3-2 Кот", homeBonus: { matchId: 2, home: 1, away: 1 }, awayBonus: null },
  { id: "sf2", homeTeam: "ЛЭМЗ", homeId: "strelkov", awayTeam: "Китти", awayId: "kiseleva", firstLeg: "Китти 0-1 ЛЭМЗ", homeBonus: { matchId: 2, home: 1, away: 1 }, awayBonus: null },
];

const CUP_MATCHES_20 = [
  { id: "final", homeTeam: "Ольмек", homeId: "makarov", awayTeam: "ЛЭМЗ", awayId: "strelkov", label: "Финал", homeBonus: { matchId: 5, home: 0, away: 2 }, awayBonus: { matchId: 1, home: 1, away: 0 } },
  { id: "third", homeTeam: "Кот", homeId: "belyakova", awayTeam: "Китти", awayId: "kiseleva", label: "Матч за 3-е место", homeBonus: { matchId: 5, home: 1, away: 1 }, awayBonus: { matchId: 6, home: 1, away: 1 } },
];


// Storage data layer
let _storageAvailable = false;
let _storageData = null;

async function initStorage() {
  try {
    const ver = await window.storage.get("rpl-version");
    if (ver && ver.value === STORAGE_VERSION) {
      // Load from storage
      const [cumR, ptsR, matchR, predR, cupR] = await Promise.all([
        window.storage.get("rpl-champ-cum"),
        window.storage.get("rpl-round-pts"),
        window.storage.get("rpl-round-matches"),
        window.storage.get("rpl-round-preds"),
        window.storage.get("rpl-cup"),
      ]);
      _storageData = {
        CHAMP_CUM: JSON.parse(cumR.value),
        ROUND_PTS: JSON.parse(ptsR.value),
        ROUND_MATCHES: JSON.parse(matchR.value),
        ROUND_PREDS: JSON.parse(predR.value),
        cup: JSON.parse(cupR.value),
      };
      _storageAvailable = true;
      return true;
    }
  } catch(e) { /* storage not available or first load */ }

  // First load - migrate data to storage
  try {
    await Promise.all([
      window.storage.set("rpl-champ-cum", JSON.stringify(CHAMP_CUM)),
      window.storage.set("rpl-round-pts", JSON.stringify(ROUND_PTS)),
      window.storage.set("rpl-round-matches", JSON.stringify(ROUND_MATCHES)),
      window.storage.set("rpl-round-preds", JSON.stringify(ROUND_PREDS)),
      window.storage.set("rpl-cup", JSON.stringify({ CUP_GROUP, SEMIS, CUP_MATCHES_19, CUP_MATCHES_20 })),
      window.storage.set("rpl-version", STORAGE_VERSION),
    ]);
    _storageAvailable = true;
    return true;
  } catch(e) {
    // Storage unavailable - use inline data
    return false;
  }
}

// === Загрузка новых туров с сервера (21+) ===
let _serverData = null;
async function loadServerData() {
  try {
    const res = await fetch("/api/data");
    if (!res.ok) return;
    const data = await res.json();
    if (data && data.rounds && Object.keys(data.rounds).length > 0) {
      _serverData = data;
      console.log("[Server] Loaded rounds:", Object.keys(data.rounds).join(", "));
    }
  } catch(e) { console.warn("[Server] Failed to load data:", e.message); }
}

// Функция для объединения базовых данных с серверными
function mergeWithServer(baseObj, serverObj) {
  if (!serverObj || !Object.keys(serverObj).length) return baseObj;
  const merged = { ...baseObj };
  for (const [key, val] of Object.entries(serverObj)) {
    merged[key] = val;
  }
  return merged;
}

// Getters that use storage data if available, otherwise inline, + server data
function getChampCum() {
  const base = _storageData?.CHAMP_CUM || CHAMP_CUM;
  return mergeWithServer(base, _serverData?.champCum);
}
function getRoundPts() {
  const base = _storageData?.ROUND_PTS || ROUND_PTS;
  return mergeWithServer(base, _serverData?.roundPts);
}
function getRoundMatches() {
  const base = _storageData?.ROUND_MATCHES || ROUND_MATCHES;
  return mergeWithServer(base, _serverData?.rounds);
}
function getRoundPreds() {
  const base = _storageData?.ROUND_PREDS || ROUND_PREDS;
  return mergeWithServer(base, _serverData?.predictions);
}
function getCupGroup() { return _storageData?.cup?.CUP_GROUP || CUP_GROUP; }
function getSemis() { return _storageData?.cup?.SEMIS || SEMIS; }
function getCupMatches19() { return _storageData?.cup?.CUP_MATCHES_19 || CUP_MATCHES_19; }
function getCupMatches20() { return _storageData?.cup?.CUP_MATCHES_20 || CUP_MATCHES_20; }

function getAvailableRounds() {
  const matches = getRoundMatches();
  const maxRound = Math.max(...Object.keys(matches).map(Number));
  return Array.from({ length: maxRound }, (_, i) => i + 1);
}



function oc(h, a) { return h > a ? "1" : h < a ? "2" : "x"; }
function scoreP(p, r) {
  if (!r || !p) return { pts: 0, type: null };
  if (p.home === r.home && p.away === r.away) return { pts: 3, type: "score" };
  if (p.home - p.away === r.home - r.away) return { pts: 2, type: "diff" };
  if (oc(p.home, p.away) === oc(r.home, r.away)) return { pts: 1, type: "outcome" };
  return { pts: 0, type: "miss" };
}
function calcR(preds, ms) {
  let tp = 0, sc = 0, df = 0, oco = 0;
  for (const m of ms) { const p = preds?.find(x => x.matchId === m.id); if (!p || !m.result) continue; const r = scoreP(p, m.result); tp += r.pts; if (r.type === "score") sc++; else if (r.type === "diff") df++; else if (r.type === "outcome") oco++; }
  return { tp, sc, df, oc: oco };
}
function calcCup(cup, ms, preds) {
  if (!cup || !ms.some(m => m.result)) return null;
  const hP = preds[cup.homeId] || [], aP = preds[cup.awayId] || [];
  let hG = 0, aG = 0; const det = [];
  for (const m of ms) {
    if (!m.result) { det.push({ mid: m.id, goal: null, hOk: null, aOk: null }); continue; }
    const ro = oc(m.result.home, m.result.away);
    const hp = hP.find(x => x.matchId === m.id), ap = aP.find(x => x.matchId === m.id);
    const hOk = (hp && oc(hp.home, hp.away) === ro) || (cup.homeBonus?.matchId === m.id && oc(cup.homeBonus.home, cup.homeBonus.away) === ro);
    const aOk = (ap && oc(ap.home, ap.away) === ro) || (cup.awayBonus?.matchId === m.id && oc(cup.awayBonus.home, cup.awayBonus.away) === ro);
    let goal = null;
    if (hOk && !aOk) { hG++; goal = "h"; } else if (!hOk && aOk) { aG++; goal = "a"; }
    det.push({ mid: m.id, goal, hOk, aOk });
  }
  return { hG, aG, det };
}

const cl = { bg: "#0a0e1a", card: "#111827", brd: "#1e293b", acc: "#f59e0b", grn: "#10b981", red: "#ef4444", blu: "#3b82f6", txt: "#f1f5f9", dim: "#94a3b8", mut: "#64748b", gld: "#fbbf24", slv: "#9ca3af", brz: "#d97706" };
const rBg = i => i % 2 ? "rgba(255,255,255,0.01)" : "transparent";
function Pos({ n }) { const c2 = { 1: cl.gld, 2: cl.slv, 3: cl.brz }[n] || cl.dim; return <span style={{ display: "inline-flex", alignItems: "center", justifyContent: "center", width: 24, height: 24, borderRadius: 6, background: n <= 3 ? `${c2}20` : "transparent", color: c2, fontWeight: 800, fontSize: 13 }}>{n}</span>; }
function Arr({ v }) { if (!v) return <span style={{ color: cl.mut, fontSize: 11 }}>—</span>; return <span style={{ fontSize: 11, fontWeight: 700, color: v > 0 ? cl.grn : cl.red }}>{v > 0 ? "▲" : "▼"}{Math.abs(v)}</span>; }
function Bdg({ color, children }) { return <span style={{ display: "inline-block", padding: "2px 8px", borderRadius: 10, fontSize: 11, fontWeight: 700, background: `${color}20`, color }}>{children}</span>; }
function Card({ icon, title, extra, children }) { return <div style={{ background: cl.card, borderRadius: 12, border: `1px solid ${cl.brd}`, overflow: "hidden", marginBottom: 16 }}><div style={{ padding: "14px 16px", borderBottom: `1px solid ${cl.brd}`, display: "flex", alignItems: "center", gap: 8, flexWrap: "wrap" }}>{icon && <span style={{ fontSize: 18 }}>{icon}</span>}<h3 style={{ fontSize: 15, fontWeight: 700, margin: 0 }}>{title}</h3>{extra && <div style={{ marginLeft: "auto" }}>{extra}</div>}</div>{children}</div>; }
const T = { width: "auto", borderCollapse: "collapse", fontSize: 13 };
const isDesktop = () => window.innerWidth > 600;
const mw = (v) => isDesktop() ? v : undefined;
const TW = { width: "auto", minWidth: mw(520), borderCollapse: "collapse", fontSize: isDesktop() ? 13 : 11 };
const TH = { padding: "10px 8px", textAlign: "center", fontWeight: 600, color: cl.dim, fontSize: 11, textTransform: "uppercase", borderBottom: `1px solid ${cl.brd}` };
const TD = { padding: "10px 8px", textAlign: "center", borderBottom: `1px solid rgba(30,41,59,0.5)` };

// Odds data per round (from bookmakers, approximate)
const ODDS = {
  20: {
    1: { h: 2.40, d: 3.20, a: 2.90 },  // Ростов - Балтика
    2: { h: 2.30, d: 3.30, a: 3.00 },  // Пари НН - Сочи
    3: { h: 4.80, d: 3.60, a: 1.70 },  // Оренбург - Зенит
    4: { h: 2.10, d: 3.30, a: 3.40 },  // Кр. Советов - Динамо Мх
    5: { h: 3.40, d: 3.20, a: 2.10 },  // Рубин - Краснодар
    6: { h: 2.30, d: 3.20, a: 3.00 },  // ЦСКА - Динамо М
    7: { h: 1.55, d: 3.90, a: 5.80 },  // Локомотив - Ахмат
    8: { h: 1.80, d: 3.50, a: 4.50 },  // Спартак - Акрон
  },
  19: {
    1: { h: 1.55, d: 4.10, a: 7.20 },  // Зенит - Балтика
    2: { h: 2.30, d: 3.20, a: 3.10 },  // Оренбург - Акрон
    3: { h: 1.45, d: 4.50, a: 7.50 },  // Краснодар - Ростов
    4: { h: 1.60, d: 3.80, a: 5.80 },  // Локомотив - Пари НН
    5: { h: 3.40, d: 3.10, a: 2.20 },  // Динамо Мх - Рубин
    6: { h: 1.50, d: 4.20, a: 6.50 },  // Динамо М - Кр. Советов
    7: { h: 4.80, d: 3.50, a: 1.75 },  // Сочи - Спартак
    8: { h: 3.60, d: 3.20, a: 2.10 },  // Ахмат - ЦСКА
  }
};

function Schedule({ round, ms }) {
  const [cp, setCp] = useState(false);
  const [liveOdds, setLiveOdds] = useState(() => {
    // Загружаем из localStorage-кэша для текущего тура
    try { const c = JSON.parse(localStorage.getItem("rpl-odds-" + round)); if (c) return c; } catch(e) {}
    return null;
  });
  const txt = useMemo(() => [`${round} тур`, ...ms.map(m => `${m.date}, ${m.time} ${TN(m.home)} – ${TN(m.away)}${m.result ? ` ${m.result.home}-${m.result.away}` : ""}`)].join("\n"), [round, ms]);

  // Автозагрузка коэффициентов
  useEffect(() => {
    fetch('/api/odds?round=' + round)
      .then(r => r.ok ? r.json() : null)
      .then(data => {
        const allOdds = data?.odds?.matches || data?.odds || [];
        if (!Array.isArray(allOdds) || !allOdds.length) return;
        const norm = s => (s||"").toLowerCase().replace(/[^а-яё]/g, "");
        const mapped = {};
        ms.forEach(m => {
          const mH = norm(m.home), mA = norm(m.away);
          const found = allOdds.find(o => {
            const oH = norm(o.home), oA = norm(o.away);
            return (oH.includes(mH.slice(0, 5)) || mH.includes(oH.slice(0, 5))) &&
                   (oA.includes(mA.slice(0, 5)) || mA.includes(oA.slice(0, 5)));
          });
          if (found) {
            mapped[m.id] = { h: found.h, d: found.d, a: found.a };
          }
        });
        if (Object.keys(mapped).length > 0) {
          setLiveOdds(mapped);
          try { localStorage.setItem("rpl-odds-" + round, JSON.stringify(mapped)); } catch(e) {}
        }
      })
      .catch(() => {});
  }, [round, ms]);

  // Используем live-коэффициенты, затем хардкоженные как fallback
  const odds = liveOdds || ODDS[round] || {};
  return <Card icon="📅" title={`${round} тур — Расписание`} extra={<button onClick={() => { navigator.clipboard.writeText(txt).then(() => { setCp(true); setTimeout(() => setCp(false), 2000); }); }} style={{ padding: "6px 14px", borderRadius: 6, border: "none", background: cp ? `${cl.grn}30` : "rgba(255,255,255,0.08)", color: cp ? cl.grn : cl.dim, fontSize: 12, fontWeight: 600, cursor: "pointer" }}>{cp ? "✓ Скопировано" : "📋 Копировать"}</button>}>
    <table style={{ width: "auto", borderCollapse: "collapse", fontSize: 13 }}>
      <tbody>
        {ms.map((m, i) => { const o = odds[m.id]; return <tr key={m.id} style={{ background: rBg(i) }}>
          <td style={{ padding: "8px 8px 8px 12px", fontSize: 11, color: cl.mut, whiteSpace: "nowrap", borderBottom: `1px solid rgba(30,41,59,0.5)` }}>{m.date}, {m.time}</td>
          <td style={{ padding: "8px 4px", fontWeight: 500, whiteSpace: "nowrap", borderBottom: `1px solid rgba(30,41,59,0.5)` }}>{TN(m.home)} – {TN(m.away)}</td>
          <td style={{ padding: "8px 6px", fontWeight: 800, color: cl.acc, whiteSpace: "nowrap", borderBottom: `1px solid rgba(30,41,59,0.5)`, minWidth: 28 }}>{m.result ? `${m.result.home}-${m.result.away}` : ""}</td>
          <td style={{ padding: "8px 3px", fontSize: 10, color: cl.grn, fontWeight: 600, borderBottom: `1px solid rgba(30,41,59,0.5)` }}>{o?.h || ""}</td>
          <td style={{ padding: "8px 3px", fontSize: 10, color: cl.mut, fontWeight: 600, borderBottom: `1px solid rgba(30,41,59,0.5)` }}>{o?.d || ""}</td>
          <td style={{ padding: "8px 3px 8px 3px", fontSize: 10, color: cl.red, fontWeight: 600, borderBottom: `1px solid rgba(30,41,59,0.5)` }}>{o?.a || ""}</td>
        </tr>; })}
      </tbody>
    </table>
    <div style={{ padding: "4px 12px 8px", fontSize: 10, color: cl.mut }}>Коэффициенты приблизительные</div>
  </Card>;
}

// RPL standings computed dynamically from ROUND_MATCHES
const RPL_TEAMS = ["Краснодар","Зенит","Локомотив","ЦСКА","Балтика","Спартак","Ахмат","Ростов","Динамо Москва","Акрон","Рубин","Динамо Махачкала","Крылья Советов","Оренбург","Пари НН","Сочи"];

function computeRPLStandings(upToRound) {
  const teams = {};
  RPL_TEAMS.forEach(n => { teams[n] = { name: n, g: 0, w: 0, d: 0, l: 0, gf: 0, ga: 0, pts: 0 }; });
  const matches = getRoundMatches();
  for (let r = 1; r <= upToRound; r++) {
    const ms = matches[r] || [];
    for (const m of ms) {
      if (!m.result) continue;
      const hName = RPL_NAME_MAP[m.home] || m.home;
      const aName = RPL_NAME_MAP[m.away] || m.away;
      const h = teams[hName], a = teams[aName];
      if (!h || !a) continue;
      h.g++; h.gf += m.result.home; h.ga += m.result.away;
      a.g++; a.gf += m.result.away; a.ga += m.result.home;
      if (m.result.home > m.result.away) { h.w++; h.pts += 3; a.l++; }
      else if (m.result.home < m.result.away) { a.w++; a.pts += 3; h.l++; }
      else { h.d++; h.pts += 1; a.d++; a.pts += 1; }
    }
  }
  return Object.values(teams).sort((a, b) => b.pts - a.pts || (b.gf - b.ga) - (a.gf - a.ga) || b.gf - a.gf);
}

// Map team aliases to RPL_STANDINGS names
const RPL_NAME_MAP = {
  "Пари Нижний Новгород": "Пари НН", "Пари НН": "Пари НН",
  "Динамо": "Динамо Москва", "Динамо М": "Динамо Москва", "Динамо Москва": "Динамо Москва", "Динамо М": "Динамо Москва",
  "Динамо Мх": "Динамо Махачкала", "Динамо Махачкала": "Динамо Махачкала",
  "Крылья Советов": "Крылья Советов", "Кр. Советов": "Крылья Советов",
  "Спартак": "Спартак", "Спартак М": "Спартак", "Спартак Москва": "Спартак",
  "Локомотив": "Локомотив", "Локомотив М": "Локомотив", "Локомотив Москва": "Локомотив",
  "ЦСКА": "ЦСКА", "Зенит": "Зенит", "Краснодар": "Краснодар", "Ростов": "Ростов",
  "Рубин": "Рубин", "Ахмат": "Ахмат", "Акрон": "Акрон", "Оренбург": "Оренбург",
  "Балтика": "Балтика", "Сочи": "Сочи",
};

// Club badge colors (primary kit colors)
const CLUB_COLORS = {
  "Краснодар": "#006c35", "Зенит": "#0068b3", "Локомотив": "#e4002b", "ЦСКА": "#e4002b",
  "Спартак": "#e4002b", "Динамо Москва": "#0057a8", "Рубин": "#8b0000", "Ахмат": "#006400",
  "Акрон": "#0099cc", "Ростов": "#ffd700", "Балтика": "#003da5", "Крылья Советов": "#0057a8",
  "Оренбург": "#ff6600", "Динамо Махачкала": "#0057a8", "Пари НН": "#cc0000", "Сочи": "#00aa55",
};

function RPLTable({ ms, round }) {
  const standings = useMemo(() => computeRPLStandings(round), [ms, round]);
  const CP = { padding: "5px 4px", borderBottom: `1px solid rgba(30,41,59,0.5)`, textAlign: "center", fontSize: 12 };
  return <Card icon="🏟️" title="Таблица РПЛ">
    <div style={{ overflowX: "auto" }}><table style={{ width: isDesktop() ? "auto" : "100%", minWidth: mw(520), borderCollapse: "collapse", fontSize: 12 }}>
      <thead><tr style={{ background: "rgba(255,255,255,0.03)" }}>
        <th style={{ ...CP, width: 22, color: cl.dim, fontSize: 10, fontWeight: 600 }}></th>
        <th style={{ ...CP, textAlign: "left", color: cl.dim, fontSize: 10, fontWeight: 600 }}>КЛУБ</th>
        <th style={{ ...CP, color: cl.dim, fontSize: 10, fontWeight: 600 }}>И</th>
        <th style={{ ...CP, color: cl.dim, fontSize: 10, fontWeight: 600 }}>В</th>
        <th style={{ ...CP, color: cl.dim, fontSize: 10, fontWeight: 600 }}>Н</th>
        <th style={{ ...CP, color: cl.dim, fontSize: 10, fontWeight: 600 }}>П</th>
        <th style={{ ...CP, color: cl.dim, fontSize: 10, fontWeight: 600 }}>ЗМ</th>
        <th style={{ ...CP, color: cl.dim, fontSize: 10, fontWeight: 600 }}>ПМ</th>
        <th style={{ ...CP, color: cl.dim, fontSize: 10, fontWeight: 600 }}>РМ</th>
        <th style={{ ...CP, color: cl.dim, fontSize: 10, fontWeight: 600 }}>О</th>
      </tr></thead>
      <tbody>{standings.map((t, i) => {
        const diff = t.gf - t.ga;
        const bc = i >= 12 && i < 14 ? cl.acc : i >= 14 ? cl.red : "transparent";
        return <tr key={t.name} style={{ background: rBg(i) }}>
          <td style={{ ...CP, fontWeight: 700, color: i < 3 ? [cl.gld, cl.slv, cl.brz][i] : cl.dim, borderLeft: `3px solid ${bc}` }}>{i + 1}</td>
          <td style={{ ...CP, textAlign: "left", fontWeight: 600, whiteSpace: "nowrap" }}>
            {TN(t.name)}
          </td>
          <td style={CP}>{t.g}</td>
          <td style={{ ...CP, color: cl.grn }}>{t.w}</td>
          <td style={CP}>{t.d}</td>
          <td style={{ ...CP, color: cl.red }}>{t.l}</td>
          <td style={CP}>{t.gf}</td>
          <td style={CP}>{t.ga}</td>
          <td style={{ ...CP, color: diff > 0 ? cl.grn : diff < 0 ? cl.red : cl.mut, fontWeight: 600 }}>{diff > 0 ? "+" : ""}{diff}</td>
          <td style={{ ...CP, fontWeight: 800, color: cl.acc, fontSize: 13 }}>{t.pts}</td>
        </tr>;
      })}</tbody>
    </table></div>
  </Card>;
}

function ChampTable({ round, ms, preds }) {
  const [cpT, setCpT] = useState(false);
  const prev = round - 1;
  const cum = getChampCum()[prev] || {};
  const rPts = getRoundPts()[round] || {};
  const rows = useMemo(() => {
    const useCalc = ms.some(m => m.result) && Object.keys(preds).length > 0;
    const r = ALL_PIDS.map(pid => {
      const base = cum[pid] || { pts: 0, sc: 0, df: 0, oc: 0 };
      let rnd;
      if (useCalc) { rnd = calcR(preds[pid], ms); }
      else { const rp = rPts[pid] || { pts: 0, sc: 0, df: 0, oc: 0 }; rnd = { tp: rp.pts, sc: rp.sc, df: rp.df, oc: rp.oc }; }
      const totalSc = base.sc + rnd.sc, totalDf = base.df + rnd.df, totalOc = base.oc + rnd.oc;
      return { id: pid, base: base.pts, rPts: rnd.tp, rSc: rnd.sc, rDf: rnd.df, rOc: rnd.oc, total: base.pts + rnd.tp, sc: totalSc, df: totalDf, oc: totalOc };
    });
    r.sort((a, b) => b.total - a.total);
    // Assign tied position labels
    let p2 = 1; for (let i = 0; i < r.length; i++) { r[i].pos = (i > 0 && r[i].total === r[i-1].total) ? r[i-1].pos : p2; p2++; }
    // Build position labels with ranges for ties
    const posLabels2 = {};
    let ii = 0;
    while (ii < r.length) {
      let jj = ii;
      while (jj < r.length - 1 && r[jj + 1].total === r[ii].total) jj++;
      const lbl = ii === jj ? `${ii + 1}` : `${ii + 1}-${jj + 1}`;
      for (let k = ii; k <= jj; k++) posLabels2[r[k].id] = lbl;
      ii = jj + 1;
    }
    r.forEach(x => x.posLabel = posLabels2[x.id]);
    const old = [...r].sort((a, b) => b.base - a.base);
    let op = 1; for (let i = 0; i < old.length; i++) { old[i].op = (i > 0 && old[i].base === old[i-1].base) ? old[i-1].op : op; op++; }
    r.forEach(x => { x.delta = (old.find(o => o.id === x.id)?.op || 0) - x.pos; });
    return r;
  }, [cum, ms, preds, rPts]);

  const latestCompleteRound = Math.max(...Object.keys(getChampCum()).map(Number));
  const pluralPtsT = (n) => { if (n % 10 === 1 && n % 100 !== 11) return "очко"; if ([2,3,4].includes(n % 10) && ![12,13,14].includes(n % 100)) return "очка"; return "очков"; };
  const copyTableTxt = () => {
    const lines = [`Таблица после ${latestCompleteRound} туров`];
    rows.forEach(r => { lines.push(`${r.posLabel || r.pos} ${P(r.id)?.name} ${r.total} ${pluralPtsT(r.total)}`); });
    navigator.clipboard.writeText(lines.join("\n")).then(() => { setCpT(true); setTimeout(() => setCpT(false), 2000); });
  };
  return <Card icon="🏆" title="Турнирная таблица" extra={<button onClick={copyTableTxt} style={{ padding: "6px 14px", borderRadius: 6, border: "none", background: cpT ? `${cl.grn}30` : "rgba(255,255,255,0.08)", color: cpT ? cl.grn : cl.dim, fontSize: 12, fontWeight: 600, cursor: "pointer" }}>{cpT ? "✓ Скопировано" : "📋 Копировать"}</button>}>
    <div style={{ overflowX: "auto" }}><table style={TW}>
      <thead><tr style={{ background: "rgba(255,255,255,0.02)" }}>
        <th style={{ ...TH, width: 24, padding: isDesktop() ? "10px 8px" : "6px 2px" }}>#</th><th style={{ ...TH, textAlign: "left", padding: isDesktop() ? "10px 8px" : "6px 4px" }}>Участник</th>
        <th style={{ ...TH, padding: isDesktop() ? "10px 8px" : "6px 2px" }}>Очки</th><th style={{ ...TH, padding: isDesktop() ? "10px 8px" : "6px 2px" }}>Тур</th><th style={{ ...TH, padding: isDesktop() ? "10px 8px" : "6px 2px" }}>С</th><th style={{ ...TH, padding: isDesktop() ? "10px 8px" : "6px 2px" }}>Р</th><th style={{ ...TH, padding: isDesktop() ? "10px 8px" : "6px 2px" }}>И</th><th style={{ ...TH, padding: isDesktop() ? "10px 8px" : "6px 2px" }}>Σ</th><th style={{ ...TH, width: 30, padding: isDesktop() ? "10px 8px" : "6px 2px" }}>Δ</th>
      </tr></thead>
      <tbody>{rows.map((r, i) => { const total = r.sc + r.df + r.oc; return <tr key={r.id} style={{ background: rBg(i) }}>
        <td style={{ ...TD, fontWeight: 700, color: r.pos <= 3 ? ({ 1: cl.gld, 2: cl.slv, 3: cl.brz }[r.pos]) : cl.dim, fontSize: 12 }}>{r.posLabel || r.pos}</td><td style={{ ...TD, textAlign: "left", fontWeight: 600 }}>{P(r.id)?.name}</td>
        <td style={{ ...TD, fontWeight: 800, color: cl.acc, fontSize: 16 }}>{r.total}</td>
        <td style={{ ...TD, color: r.rPts > 0 ? cl.grn : cl.mut }}>{r.rPts > 0 ? `+${r.rPts}` : "—"}</td>
        <td style={TD}>{r.sc > 0 ? <Bdg color={cl.grn}>{r.sc}</Bdg> : "—"}</td>
        <td style={TD}>{r.df > 0 ? <Bdg color={cl.blu}>{r.df}</Bdg> : "—"}</td>
        <td style={TD}>{r.oc > 0 ? <Bdg color={cl.acc}>{r.oc}</Bdg> : "—"}</td>
        <td style={{ ...TD, fontWeight: 700, color: cl.txt }}>{total > 0 ? total : "—"}</td>
        <td style={TD}><Arr v={r.delta} /></td>
      </tr>; })}</tbody>
    </table></div>
    <div style={{ padding: "10px 16px", fontSize: 11, color: cl.mut, display: "flex", gap: 16, flexWrap: "wrap" }}>
      <span><Bdg color={cl.grn}>С</Bdg> Счёт (3)</span><span><Bdg color={cl.blu}>Р</Bdg> Разница (2)</span><span><Bdg color={cl.acc}>И</Bdg> Исход (1)</span><span style={{ color: cl.txt, fontWeight: 600 }}>Σ</span> Всего угадано
    </div>
  </Card>;
}

function ChampLayout({ ms, preds }) {
  const ids = Object.keys(preds);
  if (!ids.length) return <Card icon="📊" title="Расклады"><div style={{ padding: 24, textAlign: "center", color: cl.mut }}>Прогнозы не добавлены</div></Card>;
  const cBg = (p, m) => { if (!m.result || !p) return "transparent"; const r = scoreP(p, m.result); return r.type === "score" ? `${cl.grn}70` : r.type === "diff" ? `${cl.blu}55` : r.type === "outcome" ? `${cl.acc}50` : `${cl.red}20`; };
  return <Card icon="📊" title="Расклады Чемпионата">
    <div style={{ overflowX: "auto" }}><table style={{ ...T, fontSize: 12 }}>
      <thead><tr style={{ background: "rgba(255,255,255,0.02)" }}>
        <th style={{ ...TH, textAlign: "left", minWidth: 65 }}>Дата</th>
        <th style={{ ...TH, textAlign: "left", minWidth: 90 }}>Матч</th>
        <th style={{ ...TH, minWidth: 34, background: `${cl.acc}15`, color: cl.acc }}>Итог</th>
        {ids.map(id => <th key={id} style={{ ...TH, minWidth: 38, fontSize: 10, padding: "8px 4px" }}>{SH(id)}</th>)}
      </tr></thead>
      <tbody>
        {ms.map((m, i) => <tr key={m.id} style={{ background: rBg(i) }}>
          <td style={{ ...TD, textAlign: "left", fontSize: 10, color: cl.mut, whiteSpace: "nowrap", padding: "8px 4px" }}>{m.date}, {m.time}</td>
          <td style={{ ...TD, textAlign: "left", fontSize: 11, whiteSpace: "nowrap", fontWeight: 500, padding: "8px 4px" }}>{TN(m.home)} – {TN(m.away)}</td>
          <td style={{ ...TD, fontWeight: 800, color: m.result ? cl.acc : cl.mut, padding: "8px 4px" }}>{m.result ? `${m.result.home}-${m.result.away}` : "—"}</td>
          {ids.map(id => { const p = preds[id]?.find(x => x.matchId === m.id); return <td key={id} style={{ ...TD, fontWeight: 600, background: cBg(p, m), padding: "8px 4px", fontSize: 12 }}>{p ? `${p.home}-${p.away}` : "—"}</td>; })}
        </tr>)}
        <tr style={{ background: "rgba(255,255,255,0.03)" }}>
          <td style={{ ...TD, textAlign: "left", fontWeight: 700 }} colSpan={2}>Очки</td><td style={TD}></td>
          {ids.map(id => { const r = calcR(preds[id], ms); return <td key={id} style={{ ...TD, fontWeight: 800, color: cl.acc, fontSize: 14 }}>{r.tp || "—"}</td>; })}
        </tr>
      </tbody>
    </table></div>
    <div style={{ padding: "10px 16px", fontSize: 11, color: cl.mut, display: "flex", gap: 12, flexWrap: "wrap" }}>
      {[["Счёт", cl.grn], ["Разница", cl.blu], ["Исход", cl.acc]].map(([l, c2]) => <span key={l} style={{ display: "inline-flex", alignItems: "center", gap: 4 }}><span style={{ width: 12, height: 12, borderRadius: 3, background: `${c2}40`, display: "inline-block" }} />{l}</span>)}
    </div>
  </Card>;
}

function ChampResults({ round, ms, preds }) {
  const [cpR, setCpR] = useState(false);
  const rPts = getRoundPts()[round] || {};
  const hasResults = ms.some(m => m.result);
  const res = ALL_PIDS.map(pid => {
    const hasPreds = !!preds[pid] && preds[pid].length > 0;
    if (hasResults && hasPreds) { const r = calcR(preds[pid], ms); return { id: pid, name: P(pid)?.name, ...r, noPred: false }; }
    if (!hasResults && rPts[pid]) {
      const rp = rPts[pid];
      return { id: pid, name: P(pid)?.name, tp: rp.pts, sc: rp.sc, df: rp.df, oc: rp.oc, noPred: false };
    }
    // Player has predictions but no results yet, or no predictions at all
    return { id: pid, name: P(pid)?.name, tp: 0, sc: 0, df: 0, oc: 0, noPred: !hasPreds };
  }).sort((a, b) => b.tp - a.tp || (a.noPred ? 1 : 0) - (b.noPred ? 1 : 0));

  // Assign tied position labels
  const posLabels = [];
  let i2 = 0;
  while (i2 < res.length) {
    let j2 = i2;
    while (j2 < res.length - 1 && res[j2 + 1].tp === res[i2].tp && !res[j2 + 1].noPred && !res[i2].noPred) j2++;
    const label = i2 === j2 ? `${i2 + 1}` : `${i2 + 1}-${j2 + 1}`;
    for (let k = i2; k <= j2; k++) posLabels.push(res[k].noPred ? "—" : label);
    i2 = j2 + 1;
  }

  if (!hasResults && !Object.keys(rPts).length) return <Card icon="📋" title="Итоги тура"><div style={{ padding: 24, textAlign: "center", color: cl.mut }}>Матчи ещё не начались</div></Card>;
  const pluralPts = (n) => { if (n % 10 === 1 && n % 100 !== 11) return "очко"; if ([2,3,4].includes(n % 10) && ![12,13,14].includes(n % 100)) return "очка"; return "очков"; };
  const copyResultsTxt = () => {
    const lines = [`Итог ${round} тура`];
    res.forEach((r, i) => { if (!r.noPred) lines.push(`${posLabels[i]} ${r.name} ${r.tp} ${pluralPts(r.tp)}`); });
    navigator.clipboard.writeText(lines.join("\n")).then(() => { setCpR(true); setTimeout(() => setCpR(false), 2000); });
  };
  return <Card icon="📋" title={`Итоги ${round} тура`} extra={<button onClick={copyResultsTxt} style={{ padding: "6px 14px", borderRadius: 6, border: "none", background: cpR ? `${cl.grn}30` : "rgba(255,255,255,0.08)", color: cpR ? cl.grn : cl.dim, fontSize: 12, fontWeight: 600, cursor: "pointer" }}>{cpR ? "✓ Скопировано" : "📋 Копировать"}</button>}><table style={{ ...T, minWidth: mw(420) }}><thead><tr style={{ background: "rgba(255,255,255,0.02)" }}>
    <th style={{ ...TH, width: 40 }}>#</th><th style={{ ...TH, textAlign: "left" }}>Участник</th>
    <th style={TH}>Очки</th><th style={TH}>С</th><th style={TH}>Р</th><th style={TH}>И</th><th style={TH}>Σ</th>
  </tr></thead><tbody>
    {res.map((r, i) => <tr key={r.id} style={{ background: rBg(i), opacity: r.noPred ? 0.5 : 1 }}>
      <td style={{ ...TD, fontWeight: 700, color: cl.dim, fontSize: 12 }}>{posLabels[i]}</td><td style={{ ...TD, textAlign: "left", fontWeight: 600 }}>{r.name}</td>
      <td style={{ ...TD, fontWeight: 800, color: r.noPred ? cl.mut : cl.acc, fontSize: 16 }}>{r.noPred ? "—" : r.tp}</td>
      <td style={TD}>{r.noPred ? "—" : (r.sc > 0 ? <Bdg color={cl.grn}>{r.sc}</Bdg> : "—")}</td><td style={TD}>{r.noPred ? "—" : (r.df > 0 ? <Bdg color={cl.blu}>{r.df}</Bdg> : "—")}</td><td style={TD}>{r.noPred ? "—" : (r.oc > 0 ? <Bdg color={cl.acc}>{r.oc}</Bdg> : "—")}</td>
        <td style={{ ...TD, fontWeight: 700, color: cl.txt }}>{r.noPred ? "—" : ((r.sc || 0) + (r.df || 0) + (r.oc || 0) || "—")}</td>
    </tr>)}
  </tbody></table></Card>;
}

function CupCompact({ cup, ms, preds }) {
  const res = calcCup(cup, ms, preds);
  const hP = preds[cup.homeId] || [], aP = preds[cup.awayId] || [];
  
  // Calculate win probabilities properly including bonuses
  const calcProb = useMemo(() => {
    const getAccuracy = (pid) => {
      const cum = getChampCum()[20]?.[pid];
      if (!cum) return 0.4;
      const totalMatches = 19 * 8;
      return Math.max(0.2, Math.min(0.8, (cum.sc + cum.df + cum.oc) / totalMatches));
    };
    const hAcc = getAccuracy(cup.homeId);
    const aAcc = getAccuracy(cup.awayId);
    
    let hCur = res?.hG || 0, aCur = res?.aG || 0;
    
    // Get round number from matches
    const roundNum = Object.keys(getRoundMatches()).find(r => getRoundMatches()[r] === ms) || Math.max(...Object.keys(getRoundMatches()).map(Number));
    const oddsData = ODDS[roundNum] || {};
    
    // For each remaining match, determine possible outcomes
    const remaining = [];
    ms.forEach(m => {
      if (m.result) return; // already counted in hCur/aCur
      const hp = hP.find(x => x.matchId === m.id);
      const ap = aP.find(x => x.matchId === m.id);
      const hOutcomes = new Set();
      if (hp) hOutcomes.add(oc(hp.home, hp.away));
      if (cup.homeBonus?.matchId === m.id) hOutcomes.add(oc(cup.homeBonus.home, cup.homeBonus.away));
      const aOutcomes = new Set();
      if (ap) aOutcomes.add(oc(ap.home, ap.away));
      if (cup.awayBonus?.matchId === m.id) aOutcomes.add(oc(cup.awayBonus.home, cup.awayBonus.away));
      
      // Use bookmaker odds to calculate real probabilities for each outcome
      const o = oddsData[m.id];
      let p1 = 1/3, px = 1/3, p2 = 1/3;
      if (o) {
        const rawSum = 1/o.h + 1/o.d + 1/o.a;
        p1 = (1/o.h) / rawSum;
        px = (1/o.d) / rawSum;
        p2 = (1/o.a) / rawSum;
      }
      
      remaining.push({ hOuts: hOutcomes, aOuts: aOutcomes, hAcc, aAcc, probs: { "1": p1, "x": px, "2": p2 } });
    });
    
    if (remaining.length === 0) {
      return { h: hCur > aCur ? 100 : 0, d: hCur === aCur ? 100 : 0, a: aCur > hCur ? 100 : 0 };
    }
    
    // Simulate remaining matches using real outcome probabilities
    let hWin = 0, draw = 0, aWin = 0;
    const sim = (idx, hG, aG, prob) => {
      if (idx === remaining.length) {
        if (hG > aG) hWin += prob;
        else if (hG < aG) aWin += prob;
        else draw += prob;
        return;
      }
      const r = remaining[idx];
      for (const ro of ["1", "x", "2"]) {
        const matchProb = r.probs[ro];
        const hOk = r.hOuts.has(ro);
        const aOk = r.aOuts.has(ro);
        let dh = 0, da = 0;
        if (hOk && !aOk) dh = 1;
        else if (!hOk && aOk) da = 1;
        sim(idx + 1, hG + dh, aG + da, prob * matchProb);
      }
    };
    sim(0, hCur, aCur, 1);
    const t = hWin + draw + aWin || 1;
    return { h: Math.round(hWin / t * 100), d: Math.round(draw / t * 100), a: Math.round(aWin / t * 100) };
  }, [res, ms, preds]);
  
  // Compute outcomes including bonuses
  const getOutcomes = (pid, bonus) => {
    const pp = preds[pid] || [];
    const result = {};
    ms.forEach(m => {
      const p = pp.find(x => x.matchId === m.id);
      const fromPred = p ? oc(p.home, p.away) : null;
      const fromBonus = (bonus?.matchId === m.id) ? oc(bonus.home, bonus.away) : null;
      result[m.id] = { main: fromPred, bonus: fromBonus };
    });
    return result;
  };
  
  const hOuts = getOutcomes(cup.homeId, cup.homeBonus);
  const aOuts = getOutcomes(cup.awayId, cup.awayBonus);
  
  // Pre-compute diffs (including bonuses)
  const diffs = {};
  ms.forEach(m => {
    const hAll = [hOuts[m.id]?.main, hOuts[m.id]?.bonus].filter(Boolean);
    const aAll = [aOuts[m.id]?.main, aOuts[m.id]?.bonus].filter(Boolean);
    // Diff if any combo of outcomes differs
    let hasDiff = false;
    for (const h of hAll) for (const a of aAll) if (h !== a) hasDiff = true;
    if (hAll.length === 0 || aAll.length === 0) hasDiff = false;
    diffs[m.id] = hasDiff;
  });

  return <Card icon="⚔️" title={`${cup.homeTeam} — ${cup.awayTeam}`} extra={cup.firstLeg && <span style={{ fontSize: 11, color: cl.dim }}>1-й: {cup.firstLeg}</span>}>
    <div style={{ padding: "6px 16px 10px", display: "flex", gap: 8, alignItems: "center" }}>
      <span style={{ fontSize: 11, padding: "2px 8px", borderRadius: 4, background: `${cl.grn}20`, color: cl.grn, fontWeight: 700 }}>{cup.homeTeam} {calcProb.h}%</span>
      <span style={{ fontSize: 11, padding: "2px 8px", borderRadius: 4, background: `${cl.mut}20`, color: cl.mut, fontWeight: 600 }}>⚖ {calcProb.d}%</span>
      <span style={{ fontSize: 11, padding: "2px 8px", borderRadius: 4, background: `${cl.red}20`, color: cl.red, fontWeight: 700 }}>{cup.awayTeam} {calcProb.a}%</span>
    </div>
    <div style={{ overflowX: "auto" }}><table style={{ width: "100%", borderCollapse: "collapse", fontSize: 12 }}>
      <thead><tr style={{ background: "rgba(255,255,255,0.02)" }}>
        <th style={{ ...TH, textAlign: "left", minWidth: 70 }}></th>
        {ms.map(m => {
          const isDiff = diffs[m.id];
          return <th key={m.id} style={{ ...TH, minWidth: 28, fontSize: 10, padding: "6px 3px", background: isDiff ? `${cl.acc}12` : "transparent", color: isDiff ? cl.acc : cl.dim }}>{m.id}</th>;
        })}
        <th style={{ ...TH, minWidth: 50, fontWeight: 700 }}>итог</th>
      </tr></thead>
      <tbody>
        <tr><td style={{ ...TD, textAlign: "left", fontWeight: 700, fontSize: 12 }}>{cup.homeTeam}<div style={{ fontSize: 10, color: cl.mut, fontWeight: 400 }}>{SH(cup.homeId)}</div></td>
          {ms.map(m => {
            const o = hOuts[m.id];
            const hasBonus = o?.bonus && o.bonus !== o.main;
            const d = res?.det.find(x => x.mid === m.id);
            const isDiff = diffs[m.id];
            let bg2 = isDiff ? `${cl.acc}10` : "transparent";
            let color2 = cl.txt;
            let fw = 600;
            if (d && m.result) { bg2 = d.hOk ? `${cl.grn}25` : `${cl.red}12`; color2 = d.hOk ? cl.grn : cl.red; }
            else if (isDiff) { fw = 800; color2 = cl.acc; }
            const mainV = o?.main || "";
            const bonusV = (o?.bonus && o.bonus !== o.main) ? o.bonus : null;
            return <td key={m.id} style={{ ...TD, fontWeight: fw, fontSize: 13, background: bg2, padding: "6px 3px", color: color2 }}>
              {mainV || "—"}{bonusV && <span style={{ fontSize: 11 }}>{bonusV.toUpperCase()}</span>}
            </td>;
          })}
          {(() => { const cnt = ms.filter(m => { const d = res?.det.find(x => x.mid === m.id); return d && m.result && d.hOk; }).length; const total = ms.filter(m => m.result).length; return <td style={{ ...TD, fontSize: 11, color: cl.grn, fontWeight: 700 }}>{total > 0 ? cnt : ""}</td>; })()}</tr>
        <tr style={{ background: `${cl.acc}08` }}><td style={{ ...TD, fontWeight: 800, fontSize: 11, color: cl.acc, textAlign: "left" }}>СЧЁТ</td>
          {ms.map(m => { const d = res?.det.find(x => x.mid === m.id); const isDiff = diffs[m.id]; let v = "", c2 = cl.mut; if (m.result) { v = oc(m.result.home, m.result.away); c2 = cl.dim; if (d?.goal === "h") c2 = cl.grn; else if (d?.goal === "a") c2 = cl.red; } return <td key={m.id} style={{ ...TD, fontSize: 13, fontWeight: m.result ? 800 : 400, color: c2, padding: "6px 3px", background: (!m.result && isDiff) ? `${cl.acc}10` : d?.goal ? `${c2}15` : "transparent" }}>{v || ""}</td>; })}
          <td style={{ ...TD, fontWeight: 800, fontSize: 18, color: cl.acc }}>{res ? `${res.hG}-${res.aG}` : "—"}</td></tr>
        <tr><td style={{ ...TD, textAlign: "left", fontWeight: 700, fontSize: 12 }}>{cup.awayTeam}<div style={{ fontSize: 10, color: cl.mut, fontWeight: 400 }}>{SH(cup.awayId)}</div></td>
          {ms.map(m => {
            const o = aOuts[m.id];
            const d = res?.det.find(x => x.mid === m.id);
            const isDiff = diffs[m.id];
            let bg2 = isDiff ? `${cl.acc}10` : "transparent";
            let color2 = cl.txt;
            let fw = 600;
            if (d && m.result) { bg2 = d.aOk ? `${cl.grn}25` : `${cl.red}12`; color2 = d.aOk ? cl.grn : cl.red; }
            else if (isDiff) { fw = 800; color2 = cl.acc; }
            const mainV = o?.main || "";
            const bonusV = (o?.bonus && o.bonus !== o.main) ? o.bonus : null;
            return <td key={m.id} style={{ ...TD, fontWeight: fw, fontSize: 13, background: bg2, padding: "6px 3px", color: color2 }}>
              {mainV || "—"}{bonusV && <span style={{ fontSize: 11 }}>{bonusV.toUpperCase()}</span>}
            </td>;
          })}
          {(() => { const cnt = ms.filter(m => { const d = res?.det.find(x => x.mid === m.id); return d && m.result && d.aOk; }).length; const total = ms.filter(m => m.result).length; return <td style={{ ...TD, fontSize: 11, color: cl.grn, fontWeight: 700 }}>{total > 0 ? cnt : ""}</td>; })()}</tr>
      </tbody>
    </table></div>
    <div style={{ padding: "8px 16px", fontSize: 10, color: cl.mut }}>
      <div style={{ color: cl.acc, fontWeight: 700, marginBottom: 4 }}>● разные исходы</div>
      <div style={{ display: "grid", gridTemplateColumns: "repeat(4, 1fr)", gridTemplateRows: "auto auto", gap: "2px 8px" }}>
        {[1,3,5,7,2,4,6,8].map(mid => { const m = ms.find(x => x.id === mid); if (!m) return null; const isDiff = diffs[m.id]; return <span key={m.id} style={{ padding: "2px 4px", borderRadius: 4, background: isDiff ? `${cl.acc}15` : "transparent", color: isDiff ? cl.acc : cl.mut, fontWeight: isDiff ? 700 : 400, whiteSpace: "nowrap", fontSize: 10 }}><strong>{m.id}</strong> {TN(m.home)}–{TN(m.away)}{m.result && <span style={{ color: cl.acc }}> {m.result.home}-{m.result.away}</span>}</span>; })}
      </div>
    </div>
  </Card>;
}

function Playoffs({ round, cups, ms, preds }) {
  const semis = getSemis();
  const finalists = semis.filter(sf => sf.winner).map(sf => sf.winner);
  const losers = semis.filter(sf => sf.winner).map(sf => sf.winner === sf.t1 ? sf.t2 : sf.t1);

  // Calculate final and 3rd place results
  const finalCup = cups.find(c => c.id === "final");
  const thirdCup = cups.find(c => c.id === "third");
  const finalRes = finalCup ? calcCup(finalCup, ms, preds) : null;
  const thirdRes = thirdCup ? calcCup(thirdCup, ms, preds) : null;

  const finalDone = finalRes && ms.every(m => m.result);
  const thirdDone = thirdRes && ms.every(m => m.result);

  // При ничье побеждает тот, кто выше в групповом этапе
  const cupGroup = getCupGroup();
  const getGroupPos = (team) => { const idx = cupGroup.findIndex(r => r.team === team); return idx >= 0 ? idx : 999; };
  const tiebreakWinner = (cup, res) => {
    if (!cup || !res) return null;
    if (res.hG > res.aG) return cup.homeTeam;
    if (res.aG > res.hG) return cup.awayTeam;
    // Ничья — побеждает тот кто выше в группе
    return getGroupPos(cup.homeTeam) < getGroupPos(cup.awayTeam) ? cup.homeTeam : cup.awayTeam;
  };

  const finalWinner = finalDone ? tiebreakWinner(finalCup, finalRes) : null;
  const finalLoser = finalDone ? (finalWinner === finalCup.homeTeam ? finalCup.awayTeam : finalCup.homeTeam) : null;
  const thirdWinner = thirdDone ? tiebreakWinner(thirdCup, thirdRes) : null;

  return <Card icon="🏆" title="Плей-офф кубка"><div style={{ padding: 16 }}>
    {/* Podium top-3 — simple text list */}
    {finalWinner && <div style={{ marginBottom: 20 }}>
      <div style={{ fontSize: 14, fontWeight: 700, color: cl.gld, marginBottom: 10 }}>Итоги кубка</div>
      <div style={{ fontSize: 15, fontWeight: 700, color: cl.gld, marginBottom: 6 }}>🥇 {finalWinner} — 1 место</div>
      {finalLoser && <div style={{ fontSize: 15, fontWeight: 600, color: cl.slv, marginBottom: 6 }}>🥈 {finalLoser} — 2 место</div>}
      {thirdWinner && <div style={{ fontSize: 15, fontWeight: 600, color: cl.brz }}>🥉 {thirdWinner} — 3 место</div>}
    </div>}

    {/* Final result */}
    <div style={{ fontSize: 13, fontWeight: 700, color: cl.gld, marginTop: 4, marginBottom: 8 }}>Финал</div>
    {finalists.length === 2 ? (
      <div style={{ background: `${cl.gld}10`, borderRadius: 8, padding: "12px 16px", border: `1px solid ${cl.gld}30`, marginBottom: 8 }}>
        <div style={{ display: "flex", alignItems: "center", justifyContent: "center", gap: 10, fontSize: 15, fontWeight: 700 }}>
          <span style={{ color: finalWinner === finalists[0] ? cl.gld : finalDone ? cl.mut : cl.gld }}>{finalists[0]}</span>
          <span style={{ fontWeight: 800, fontSize: 20, color: cl.acc }}>{finalRes ? `${finalRes.hG}-${finalRes.aG}` : "vs"}</span>
          <span style={{ color: finalWinner === finalists[1] ? cl.gld : finalDone ? cl.mut : cl.gld }}>{finalists[1]}</span>
        </div>
        {finalWinner && <div style={{ textAlign: "center", marginTop: 6, fontSize: 12, color: cl.grn, fontWeight: 700 }}>🏆 {finalWinner} — победитель!{finalRes.hG === finalRes.aG ? " (выше в группе)" : ""}</div>}
      </div>
    ) : (
      <div style={{ background: `${cl.gld}10`, borderRadius: 8, padding: "12px 16px", border: `1px solid ${cl.gld}30`, color: cl.mut, fontSize: 13, marginBottom: 8 }}>Определится после полуфиналов</div>
    )}

    {/* 3rd place result */}
    {losers.length === 2 && <>
      <div style={{ fontSize: 13, fontWeight: 700, color: cl.brz, marginTop: 12, marginBottom: 8 }}>Матч за 3-е место</div>
      <div style={{ background: `${cl.brz}10`, borderRadius: 8, padding: "12px 16px", border: `1px solid ${cl.brz}30`, marginBottom: 8 }}>
        <div style={{ display: "flex", alignItems: "center", justifyContent: "center", gap: 10, fontSize: 15, fontWeight: 700 }}>
          <span style={{ color: thirdWinner === losers[0] ? cl.brz : thirdDone ? cl.mut : cl.brz }}>{losers[0]}</span>
          <span style={{ fontWeight: 800, fontSize: 20, color: cl.acc }}>{thirdRes ? `${thirdRes.hG}-${thirdRes.aG}` : "vs"}</span>
          <span style={{ color: thirdWinner === losers[1] ? cl.brz : thirdDone ? cl.mut : cl.brz }}>{losers[1]}</span>
        </div>
        {thirdWinner && <div style={{ textAlign: "center", marginTop: 6, fontSize: 12, color: cl.brz, fontWeight: 600 }}>🥉 {thirdWinner} — 3-е место{thirdRes.hG === thirdRes.aG ? " (выше в группе)" : ""}</div>}
      </div>
    </>}

    {/* Semis */}
    {round !== 20 && <><div style={{ fontSize: 13, fontWeight: 700, color: cl.acc, marginTop: 16, marginBottom: 12 }}>1/2 финала</div>
    {semis.map((sf, i) => {
      const t1won = sf.winner === sf.t1;
      const t2won = sf.winner === sf.t2;
      const hasWinner = !!sf.winner;
      return <div key={i} style={{ background: "rgba(255,255,255,0.03)", borderRadius: 8, padding: "12px 16px", marginBottom: 8, border: `1px solid ${cl.brd}` }}>
        <div style={{ display: "flex", alignItems: "center", gap: 8, marginBottom: 6 }}>
          <span style={{ fontWeight: 700, fontSize: 15, color: t1won ? cl.grn : hasWinner ? cl.mut : cl.txt }}>{sf.t1}</span>
          {hasWinner && <span style={{ fontWeight: 800, fontSize: 16, color: cl.acc }}>{sf.agg1}-{sf.agg2}</span>}
          <span style={{ fontWeight: 700, fontSize: 15, color: t2won ? cl.grn : hasWinner ? cl.mut : cl.txt }}>{sf.t2}</span>
        </div>
        <div style={{ fontSize: 11, color: cl.dim, display: "flex", gap: 12, flexWrap: "wrap" }}>
          <span>1-й: <strong style={{ color: cl.acc }}>{sf.l1}</strong></span>
          <span>2-й: <strong style={{ color: sf.l2 ? cl.acc : cl.mut }}>{sf.l2 || `${sf.l2l} ?-?`}</strong></span>
        </div>
        {hasWinner && <div style={{ marginTop: 4, fontSize: 11, color: cl.grn, fontWeight: 600 }}>✓ {sf.winner} → финал</div>}
      </div>;
    })}</>}
  </div></Card>;
}

function CupGroup() {
  const rows = useMemo(() => { const r = [...getCupGroup()].sort((a, b) => b.pts !== a.pts ? b.pts - a.pts : (b.gf - b.ga) - (a.gf - a.ga)); let p = 1; for (let i = 0; i < r.length; i++) { r[i].pos = (i > 0 && r[i].pts === r[i-1].pts) ? r[i-1].pos : p; p++; } return r; }, []);
  return <Card icon="📊" title="Итоговая таблица группового этапа (после 14 тура)">
    <div style={{ overflowX: "auto" }}><table style={{ ...T, minWidth: mw(480) }}>
      <thead><tr style={{ background: "rgba(255,255,255,0.02)" }}><th style={{ ...TH, width: 30 }}>М</th><th style={{ ...TH, textAlign: "left" }}>Команда</th><th style={TH}>И</th><th style={TH}>В-Н-П</th><th style={TH}>Мячи</th><th style={TH}>Разн.</th><th style={TH}>Очки</th></tr></thead>
      <tbody>{rows.map((r, i) => <tr key={r.id} style={{ background: r.po ? `${cl.grn}08` : rBg(i) }}>
        <td style={{ ...TD, borderLeft: r.po ? `3px solid ${cl.grn}` : "3px solid transparent" }}><Pos n={r.pos} /></td>
        <td style={{ ...TD, textAlign: "left", fontWeight: 600 }}>{r.team}{r.po && <span style={{ marginLeft: 6, fontSize: 10, color: cl.grn }}>▶ плей-офф</span>}</td>
        <td style={TD}>{r.g}</td><td style={TD}><span style={{ color: cl.grn }}>{r.w}</span>-<span style={{ color: cl.dim }}>{r.d}</span>-<span style={{ color: cl.red }}>{r.l}</span></td>
        <td style={TD}>{r.gf}-{r.ga}</td><td style={{ ...TD, color: r.gf-r.ga > 0 ? cl.grn : r.gf-r.ga < 0 ? cl.red : cl.mut }}>{r.gf-r.ga > 0 ? "+" : ""}{r.gf-r.ga}</td>
        <td style={{ ...TD, fontWeight: 800, color: cl.acc, fontSize: 16 }}>{r.pts}</td>
      </tr>)}</tbody>
    </table></div>
    <div style={{ padding: "8px 16px", fontSize: 11, color: cl.mut }}><span style={{ display: "inline-block", width: 14, height: 14, borderRadius: 3, background: `${cl.grn}20`, border: `2px solid ${cl.grn}40`, marginRight: 4 }} />Вышли в плей-офф (топ-4)</div>
  </Card>;
}

const TABS = [{ id: "schedule", label: "📅 Расписание" }, { id: "champ", label: "🏆 Чемпионат" }, { id: "cup", label: "⚽ Кубок" }, { id: "stats", label: "📈 Статистика" }, { id: "info", label: "👥 Участники" }];

function PredictionRating() {
  const maxRound = Math.max(...Object.keys(getChampCum()).map(Number));
  const data = useMemo(() => {
    return ALL_PIDS.map(pid => {
      const cum = getChampCum()[maxRound]?.[pid] || { pts: 0, sc: 0, df: 0, oc: 0 };
      const totalM = maxRound * 8;
      const guessed = cum.sc + cum.df + cum.oc;
      const missed = totalM - guessed;
      const avgPts = (cum.pts / maxRound).toFixed(1);
      const scPct = ((cum.sc / totalM) * 100).toFixed(0);
      const dfPct = ((cum.df / totalM) * 100).toFixed(0);
      const ocPct = ((cum.oc / totalM) * 100).toFixed(0);
      const guessPct = ((guessed / totalM) * 100).toFixed(0);
      // "Power" score: weighted composite
      const power = ((cum.sc * 3 + cum.df * 2 + cum.oc) / totalM * 100).toFixed(0);
      // Consistency: std dev of round points
      let rPts = [];
      for (let r = 1; r <= maxRound; r++) { rPts.push(getRoundPts()[r]?.[pid]?.pts || 0); }
      const mean = rPts.reduce((a,b)=>a+b,0)/rPts.length;
      const std = Math.sqrt(rPts.reduce((a,b)=>a+(b-mean)**2,0)/rPts.length);
      const consistency = Math.max(0, Math.min(100, Math.round(100 - std * 8)));
      // Best/worst
      const best = Math.max(...rPts);
      const worst = Math.min(...rPts);
      // Form: last 5 rounds
      const last5 = rPts.slice(-5);
      const form = (last5.reduce((a,b)=>a+b,0) / 5).toFixed(1);
      return { pid, name: P(pid)?.name, team: P(pid)?.team, color: CHART_COLORS[pid], cum, totalM, guessed, missed, avgPts, scPct, dfPct, ocPct, guessPct, power, consistency, best, worst, form, pts: cum.pts };
    }).sort((a, b) => b.pts - a.pts);
  }, []);

  return <Card icon="⭐" title="Прогноз-рейтинг участников">
    <div style={{ padding: "8px 12px" }}>
      {data.map((d, idx) => {
        const barMax = 160;
        const scW = Math.round(d.cum.sc / d.totalM * barMax);
        const dfW = Math.round(d.cum.df / d.totalM * barMax);
        const ocW = Math.round(d.cum.oc / d.totalM * barMax);
        return <div key={d.pid} style={{ padding: "10px 0", borderBottom: idx < data.length - 1 ? `1px solid ${cl.brd}` : "none" }}>
          <div style={{ display: "flex", alignItems: "center", gap: 8, marginBottom: 6 }}>
            <span style={{ width: 22, height: 22, borderRadius: 6, background: `${d.color}25`, display: "flex", alignItems: "center", justifyContent: "center", fontSize: 12, fontWeight: 800, color: d.color }}>{idx + 1}</span>
            <span style={{ fontWeight: 700, fontSize: 13 }}>{d.name}</span>
            <span style={{ fontSize: 11, color: cl.dim }}>{d.team}</span>
            <span style={{ marginLeft: "auto", fontWeight: 800, color: cl.acc, fontSize: 15 }}>{d.pts}</span>
          </div>
          {/* Bar chart */}
          <div style={{ display: "flex", gap: 1, height: 8, borderRadius: 4, overflow: "hidden", marginBottom: 6 }}>
            <div style={{ width: scW, background: cl.grn, borderRadius: "4px 0 0 4px" }} title={`Счёт: ${d.scPct}%`} />
            <div style={{ width: dfW, background: cl.blu }} title={`Разница: ${d.dfPct}%`} />
            <div style={{ width: ocW, background: cl.acc }} title={`Исход: ${d.ocPct}%`} />
            <div style={{ flex: 1, background: `${cl.red}20`, borderRadius: "0 4px 4px 0" }} />
          </div>
          {/* Stats row */}
          <div style={{ display: "flex", gap: 8, fontSize: 10, color: cl.dim, flexWrap: "wrap" }}>
            <span>Ср. <strong style={{ color: cl.txt }}>{d.avgPts}</strong></span>
            <span>Форма <strong style={{ color: parseFloat(d.form) >= parseFloat(d.avgPts) ? cl.grn : cl.red }}>{d.form}</strong></span>
            <span>Угадано <strong style={{ color: cl.txt }}>{d.guessPct}%</strong></span>
            <span title="Стабильность">Стаб. <strong style={{ color: d.consistency >= 60 ? cl.grn : d.consistency >= 40 ? cl.acc : cl.red }}>{d.consistency}</strong></span>
            <span>Лучш. <strong style={{ color: cl.grn }}>{d.best}</strong></span>
            <span>Худш. <strong style={{ color: cl.red }}>{d.worst}</strong></span>
          </div>
        </div>;
      })}
    </div>
    <div style={{ padding: "6px 12px 10px", fontSize: 10, color: cl.mut, display: "flex", gap: 8, flexWrap: "wrap" }}>
      <span><span style={{ display: "inline-block", width: 10, height: 6, borderRadius: 2, background: cl.grn, marginRight: 3 }}/>Счёт</span>
      <span><span style={{ display: "inline-block", width: 10, height: 6, borderRadius: 2, background: cl.blu, marginRight: 3 }}/>Разница</span>
      <span><span style={{ display: "inline-block", width: 10, height: 6, borderRadius: 2, background: cl.acc, marginRight: 3 }}/>Исход</span>
    </div>
  </Card>;
}

// Color palette for chart lines
const CHART_COLORS = {
  makarov: "#f59e0b", strelkov: "#3b82f6", belyakova: "#a855f7", kiseleva: "#ec4899",
  bagaeva: "#10b981", shkolnaya: "#06b6d4", trigubenko: "#ef4444", petuhova: "#84cc16",
};

function RoundDetailPanel({ round, onClose }) {
  const rPts = getRoundPts()[round] || {};
  const rows = ALL_PIDS.map(pid => {
    const r = rPts[pid] || { pts: 0, sc: 0, df: 0, oc: 0 };
    return { pid, name: P(pid)?.name, team: P(pid)?.team, ...r };
  }).filter(r => r.pts > 0).sort((a, b) => b.pts - a.pts);
  if (!rows.length) return null;
  return <div style={{ margin: "8px 0", padding: "12px 16px", borderRadius: 8, background: `rgba(245,158,11,0.08)`, border: `1px solid rgba(245,158,11,0.2)` }}>
    <div style={{ display: "flex", justifyContent: "space-between", alignItems: "center", marginBottom: 8 }}>
      <span style={{ fontWeight: 700, color: cl.acc, fontSize: 13 }}>{round} тур — итоги</span>
      <button onClick={onClose} style={{ background: "none", border: "none", color: cl.mut, cursor: "pointer", fontSize: 16, padding: 0 }}>✕</button>
    </div>
    <div style={{ display: "flex", flexWrap: "wrap", gap: 6 }}>
      {rows.map(r => <span key={r.pid} style={{ padding: "3px 8px", borderRadius: 6, background: `${CHART_COLORS[r.pid]}15`, border: `1px solid ${CHART_COLORS[r.pid]}30`, fontSize: 11, display: "inline-flex", alignItems: "center", gap: 4 }}>
        <span style={{ color: CHART_COLORS[r.pid], fontWeight: 700 }}>{r.team}</span>
        <span style={{ color: cl.acc, fontWeight: 800 }}>{r.pts}</span>
        {r.sc > 0 && <span style={{ color: cl.grn, fontSize: 10 }}>{r.sc}с</span>}
        {r.df > 0 && <span style={{ color: cl.blu, fontSize: 10 }}>{r.df}р</span>}
        {r.oc > 0 && <span style={{ color: cl.acc, fontSize: 10 }}>{r.oc}и</span>}
      </span>)}
    </div>
  </div>;
}


function PositionChart() {
  const maxRound = Math.max(...Object.keys(getChampCum()).map(Number));
  const [visible, setVisible] = useState(() => Object.fromEntries(ALL_PIDS.map(p => [p, true])));
  const toggle = (pid) => setVisible(v => ({ ...v, [pid]: !v[pid] }));

  const positions = useMemo(() => {
    const pos = {};
    for (let r = 1; r <= maxRound; r++) {
      const cum = getChampCum()[r] || {};
      const sorted = ALL_PIDS.map(pid => ({ pid, pts: cum[pid]?.pts || 0 })).sort((a, b) => b.pts - a.pts);
      let rank = 1;
      for (let i = 0; i < sorted.length; i++) {
        if (i > 0 && sorted[i].pts < sorted[i - 1].pts) rank = i + 1;
        if (!pos[sorted[i].pid]) pos[sorted[i].pid] = [];
        pos[sorted[i].pid].push(rank);
      }
    }
    return ALL_PIDS.map(pid => ({
      pid, team: P(pid)?.team, color: CHART_COLORS[pid],
      ranks: pos[pid] || [], lastRank: (pos[pid] || [])[maxRound - 1] || 8,
    })).sort((a, b) => a.lastRank - b.lastRank);
  }, []);

  const visData = positions.filter(d => visible[d.pid]);
  const W = 860, H = 340, padL = 30, padR = 100, padT = 20, padB = 30;
  const chartW = W - padL - padR, chartH = H - padT - padB;
  const x = (r) => padL + ((r - 1) / (maxRound - 1 || 1)) * chartW;
  const y = (rank) => padT + ((rank - 1) / 7) * chartH;

  return <Card icon={"📉"} title="Позиция по турам">
    <div style={{ padding: "8px 16px", display: "flex", gap: 6, flexWrap: "wrap", justifyContent: "center", borderBottom: "1px solid " + cl.brd }}>
      {positions.map(d => <button key={d.pid} onClick={() => toggle(d.pid)} style={{
        padding: "4px 10px", borderRadius: 6, border: "2px solid " + (visible[d.pid] ? d.color : "transparent"),
        background: visible[d.pid] ? d.color + "20" : "rgba(255,255,255,0.04)",
        color: visible[d.pid] ? d.color : cl.mut, fontSize: 11, fontWeight: 600, cursor: "pointer",
        opacity: visible[d.pid] ? 1 : 0.5,
      }}>{d.team}</button>)}
    </div>
    <div style={{ overflowX: "auto", padding: "12px 8px 4px" }}>
      <svg viewBox={"0 0 " + W + " " + H} style={{ width: "100%", maxWidth: W, height: "auto" }}>
        {[1,2,3,4,5,6,7,8].map(rank => <g key={rank}>
          <line x1={padL} y1={y(rank)} x2={padL + chartW} y2={y(rank)} stroke="rgba(255,255,255,0.06)" />
          <text x={padL - 6} y={y(rank) + 4} fill="#64748b" fontSize="10" textAnchor="end">{rank}</text>
        </g>)}
        {Array.from({ length: maxRound }, (_, i) => i + 1).map(r => (
          <text key={r} x={x(r)} y={H - 6} fill="#64748b" fontSize="9" textAnchor="middle">{r + "т"}</text>
        ))}
        {visData.map(d => {
          if (d.ranks.length === 0) return null;
          var pathD = d.ranks.map((rank, i) => (i === 0 ? "M" : "L") + " " + x(i + 1) + " " + y(rank)).join(" ");
          var lastY = y(d.ranks[d.ranks.length - 1]);
          var labelY = lastY + 4;
          return React.createElement("g", { key: d.pid },
            React.createElement("path", { d: pathD, fill: "none", stroke: d.color, strokeWidth: "2", strokeLinejoin: "round", opacity: "0.85" }),
            d.ranks.map((rank, i) => React.createElement("circle", { key: i, cx: x(i + 1), cy: y(rank), r: "3.5", fill: d.color, stroke: "#0a0e1a", strokeWidth: "1" })),
            React.createElement("text", { x: x(maxRound) + 8, y: labelY, fill: d.color, fontSize: "11", fontWeight: "700" }, d.team)
          );
        })}
      </svg>
    </div>
  </Card>;
}

function PositionTable() {
  const maxRound = Math.max(...Object.keys(getChampCum()).map(Number));
  const positions = useMemo(() => {
    var roundPositions = {};
    for (var r = 1; r <= maxRound; r++) {
      var cum = getChampCum()[r] || {};
      var sorted = ALL_PIDS.map(function(pid) { return { pid: pid, pts: cum[pid]?.pts || 0 }; }).sort(function(a, b) { return b.pts - a.pts; });
      var rank = 1;
      for (var i = 0; i < sorted.length; i++) {
        if (i > 0 && sorted[i].pts < sorted[i - 1].pts) rank = i + 1;
        if (!roundPositions[sorted[i].pid]) roundPositions[sorted[i].pid] = {};
        roundPositions[sorted[i].pid][r] = rank;
      }
    }
    return ALL_PIDS.map(function(pid) {
      return { pid: pid, team: P(pid)?.team, color: CHART_COLORS[pid], positions: roundPositions[pid] || {}, lastPos: (roundPositions[pid] || {})[maxRound] || 8 };
    }).sort(function(a, b) { return a.lastPos - b.lastPos; });
  }, []);

  var thStyle = { padding: "6px 4px", fontSize: 10, fontWeight: 700, color: cl.mut, textAlign: "center", borderBottom: "2px solid " + cl.brd, whiteSpace: "nowrap" };
  var tdStyle = { padding: "5px 4px", fontSize: 11, fontWeight: 700, textAlign: "center", borderBottom: "1px solid rgba(30,41,59,0.3)" };
  var posColors = { 1: cl.gld || "#f59e0b", 2: "#c0c0c0", 3: "#cd7f32" };

  return <Card icon={"🏆"} title="Таблица позиций по турам">
    <div style={{ overflowX: "auto" }}>
      <table style={{ borderCollapse: "collapse", width: "auto" }}>
        <thead><tr>
          <th style={{ ...thStyle, textAlign: "left", paddingLeft: 12, minWidth: 80 }}>Участник</th>
          {Array.from({ length: maxRound }, function(_, i) { return <th key={i} style={thStyle}>{(i+1) + "т"}</th>; })}
        </tr></thead>
        <tbody>{positions.map(function(d, idx) {
          return <tr key={d.pid} style={{ background: d.color + "08" }}>
            <td style={{ ...tdStyle, textAlign: "left", paddingLeft: 12, color: d.color, borderLeft: "3px solid " + d.color }}>{d.team}</td>
            {Array.from({ length: maxRound }, function(_, i) {
              var r = i + 1;
              var pos = d.positions[r];
              var bg = pos === 1 ? (cl.gld || "#f59e0b") + "25" : pos === 2 ? "#c0c0c025" : pos === 3 ? "#cd7f3225" : "transparent";
              var clr = pos === 1 ? (cl.gld || "#f59e0b") : pos <= 3 ? cl.txt : cl.mut;
              return <td key={r} style={{ ...tdStyle, background: bg, color: clr, fontWeight: pos <= 3 ? 800 : 600 }}>{pos || ""}</td>;
            })}
          </tr>;
        })}</tbody>
      </table>
    </div>
  </Card>;
}

function DynamicsChart() {
  const maxRound = Math.max(...Object.keys(getChampCum()).map(Number));
  const [visible, setVisible] = useState(() => Object.fromEntries(ALL_PIDS.map(p => [p, true])));
  const [selRound, setSelRound] = useState(null);
  const toggle = (pid) => setVisible(v => ({ ...v, [pid]: !v[pid] }));
  const data = useMemo(() => {
    return ALL_PIDS.map(pid => {
      const points = [0];
      for (let r = 1; r <= maxRound; r++) {
        const c = getChampCum()[r]?.[pid];
        points.push(c ? c.pts : points[points.length - 1]);
      }
      return { pid, name: SH(pid), team: P(pid)?.team, points, color: CHART_COLORS[pid] };
    }).sort((a, b) => b.points[maxRound] - a.points[maxRound]);
  }, []);

  const visData = data.filter(d => visible[d.pid]);
  const maxPts = Math.max(10, ...visData.map(d => d.points[maxRound]));
  const W = 860, H = 340, padL = 45, padR = 15, padT = 20, padB = 30;
  const chartW = W - padL - padR, chartH = H - padT - padB;
  const x = (r) => padL + (r / maxRound) * chartW;
  const y = (pts) => padT + chartH - (pts / (maxPts * 1.05)) * chartH;

  return <Card icon="📈" title="Динамика очков по турам">
    {/* Toggle buttons */}
    <div style={{ padding: "8px 16px", display: "flex", gap: 6, flexWrap: "wrap", justifyContent: "center", borderBottom: `1px solid ${cl.brd}` }}>
      {data.map(d => <button key={d.pid} onClick={() => toggle(d.pid)} style={{
        padding: "4px 10px", borderRadius: 6, border: `2px solid ${visible[d.pid] ? d.color : "transparent"}`,
        background: visible[d.pid] ? `${d.color}20` : "rgba(255,255,255,0.04)",
        color: visible[d.pid] ? d.color : cl.mut, fontSize: 11, fontWeight: 600, cursor: "pointer",
        opacity: visible[d.pid] ? 1 : 0.5, transition: "all 0.15s",
      }}>{d.team}</button>)}
    </div>
    <div style={{ overflowX: "auto", padding: "12px 8px 4px" }}>
      <svg viewBox={`0 0 ${W} ${H}`} style={{ width: "100%", maxWidth: W, height: "auto" }}>
        {[0, 1, 2, 3, 4, 5].map(i => {
          const val = Math.round(maxPts * 1.05 * i / 5);
          return <g key={i}>
            <line x1={padL} y1={y(val)} x2={W - padR} y2={y(val)} stroke="rgba(255,255,255,0.06)" />
            <text x={padL - 6} y={y(val) + 4} fill="#64748b" fontSize="10" textAnchor="end">{val}</text>
          </g>;
        })}
        {Array.from({ length: maxRound }, (_, i) => i + 1).filter(r => r % 2 === 0).map(r => (
          <text key={r} x={x(r)} y={H - 6} fill={selRound === r ? "#f59e0b" : "#64748b"} fontSize="9" textAnchor="middle" style={{ cursor: "pointer" }} fontWeight={selRound === r ? "700" : "400"} onClick={() => setSelRound(sr => sr === r ? null : r)}>{r}</text>
        ))}
        {/* Clickable invisible rects for all rounds */}
        {Array.from({ length: maxRound }, (_, i) => i + 1).map(r => (
          <rect key={`click-${r}`} x={x(r) - chartW/maxRound/2} y={padT} width={chartW/maxRound} height={chartH} fill="transparent" style={{ cursor: "pointer" }} onClick={() => setSelRound(sr => sr === r ? null : r)} />
        ))}
        {selRound && <line x1={x(selRound)} y1={padT} x2={x(selRound)} y2={padT + chartH} stroke="#f59e0b" strokeWidth="1" strokeDasharray="4,4" opacity="0.5" />}
        {visData.map(d => {
          const pathD = d.points.map((pts, r) => `${r === 0 ? "M" : "L"} ${x(r)} ${y(pts)}`).join(" ");
          return <path key={d.pid} d={pathD} fill="none" stroke={d.color} strokeWidth={visData.length <= 3 ? "3" : "2.5"} strokeLinejoin="round" opacity="0.85" />;
        })}
        {visData.map((d, i) => {
          const endY = y(d.points[maxRound]);
          const labelY = endY + (i % 2 === 0 ? -6 : 10);
          return <g key={d.pid}>
            <circle cx={x(maxRound)} cy={endY} r="4" fill={d.color} />
            <text x={x(maxRound) - 8} y={labelY} fill={d.color} fontSize="10" textAnchor="end" fontWeight="700">{d.team} {d.points[maxRound]}</text>
          </g>;
        })}
      </svg>
    </div>
    {selRound && <RoundDetailPanel round={selRound} onClose={() => setSelRound(null)} />}
  </Card>;
}

function RoundByRoundChart() {
  const maxRound = Math.max(...Object.keys(getRoundPts()).map(Number));
  const [visible, setVisible] = useState(() => Object.fromEntries(ALL_PIDS.map(p => [p, true])));
  const [selRound, setSelRound] = useState(null);
  const toggle = (pid) => setVisible(v => ({ ...v, [pid]: !v[pid] }));
  const data = useMemo(() => {
    return ALL_PIDS.map(pid => {
      const pts = [];
      for (let r = 1; r <= maxRound; r++) {
        pts.push(getRoundPts()[r]?.[pid]?.pts || 0);
      }
      return { pid, name: SH(pid), team: P(pid)?.team, pts, color: CHART_COLORS[pid], avg: (pts.reduce((a, b) => a + b, 0) / maxRound).toFixed(1) };
    }).sort((a, b) => parseFloat(b.avg) - parseFloat(a.avg));
  }, []);

  const visData = data.filter(d => visible[d.pid]);
  const maxPts = 16;
  const W = 860, H = 280, padL = 45, padR = 15, padT = 20, padB = 30;
  const chartW = W - padL - padR, chartH = H - padT - padB;
  const x = (r) => padL + ((r - 0.5) / maxRound) * chartW;
  const y = (pts) => padT + chartH - (pts / maxPts) * chartH;

  return <Card icon="📊" title="Очки за тур">
    <div style={{ padding: "8px 16px", display: "flex", gap: 6, flexWrap: "wrap", justifyContent: "center", borderBottom: `1px solid ${cl.brd}` }}>
      {data.map(d => <button key={d.pid} onClick={() => toggle(d.pid)} style={{
        padding: "4px 10px", borderRadius: 6, border: `2px solid ${visible[d.pid] ? d.color : "transparent"}`,
        background: visible[d.pid] ? `${d.color}20` : "rgba(255,255,255,0.04)",
        color: visible[d.pid] ? d.color : cl.mut, fontSize: 11, fontWeight: 600, cursor: "pointer",
        opacity: visible[d.pid] ? 1 : 0.5, transition: "all 0.15s",
      }}>
        {d.team} <span style={{ fontSize: 10, opacity: 0.7 }}>({d.avg})</span>
      </button>)}
    </div>
    <div style={{ overflowX: "auto", padding: "12px 8px 4px" }}>
      <svg viewBox={`0 0 ${W} ${H}`} style={{ width: "100%", maxWidth: W, height: "auto" }}>
        {[0, 4, 8, 12, 16].map(v => <g key={v}>
          <line x1={padL} y1={y(v)} x2={W - padR} y2={y(v)} stroke="rgba(255,255,255,0.06)" />
          <text x={padL - 6} y={y(v) + 4} fill="#64748b" fontSize="10" textAnchor="end">{v}</text>
        </g>)}
        {Array.from({ length: maxRound }, (_, i) => i + 1).map(r => (
          <text key={r} x={x(r)} y={H - 6} fill={selRound === r ? "#f59e0b" : "#64748b"} fontSize="9" textAnchor="middle" style={{ cursor: "pointer" }} fontWeight={selRound === r ? "700" : "400"} onClick={() => setSelRound(sr => sr === r ? null : r)}>{r}</text>
        ))}
        {/* Clickable rects */}
        {Array.from({ length: maxRound }, (_, i) => i + 1).map(r => (
          <rect key={`click-${r}`} x={x(r) - chartW/maxRound/2} y={padT} width={chartW/maxRound} height={chartH} fill="transparent" style={{ cursor: "pointer" }} onClick={() => setSelRound(sr => sr === r ? null : r)} />
        ))}
        {selRound && <line x1={x(selRound)} y1={padT} x2={x(selRound)} y2={padT + chartH} stroke="#f59e0b" strokeWidth="1" strokeDasharray="4,4" opacity="0.5" />}
        {visData.map(d => {
          const pathD = d.pts.map((pts, i) => `${i === 0 ? "M" : "L"} ${x(i + 1)} ${y(pts)}`).join(" ");
          return <g key={d.pid}>
            <path d={pathD} fill="none" stroke={d.color} strokeWidth={visData.length <= 3 ? "2.5" : "1.8"} strokeLinejoin="round" opacity={visData.length <= 3 ? "0.9" : "0.7"} />
            {visData.length <= 3 && d.pts.map((pts, i) => <circle key={i} cx={x(i + 1)} cy={y(pts)} r="3" fill={d.color} opacity="0.8" />)}
          </g>;
        })}
      </svg>
    </div>
    {selRound && <RoundDetailPanel round={selRound} onClose={() => setSelRound(null)} />}
  </Card>;
}

function PlayerStats() {
  const [selected, setSelected] = useState("makarov");
  const [selRound, setSelRound] = useState(null);
  const maxRound = Math.max(...Object.keys(getChampCum()).map(Number));

  const stats = useMemo(() => {
    const cum = getChampCum()[maxRound]?.[selected] || { pts: 0, sc: 0, df: 0, oc: 0 };
    const rounds = [];
    let best = { r: 0, pts: 0 }, worst = { r: 0, pts: 99 };
    for (let r = 1; r <= maxRound; r++) {
      const rp = getRoundPts()[r]?.[selected] || { pts: 0, sc: 0, df: 0, oc: 0 };
      rounds.push({ r, ...rp });
      if (rp.pts > best.pts) best = { r, pts: rp.pts };
      if (rp.pts < worst.pts) worst = { r, pts: rp.pts };
    }
    const avg = (cum.pts / maxRound).toFixed(1);
    const totalMatches = maxRound * 8;
    const guessed = cum.sc + cum.df + cum.oc;
    const pct = ((guessed / totalMatches) * 100).toFixed(0);
    // Position
    const sorted = ALL_PIDS.map(pid => ({ pid, pts: getChampCum()[maxRound]?.[pid]?.pts || 0 })).sort((a, b) => b.pts - a.pts);
    const pos = sorted.findIndex(x => x.pid === selected) + 1;
    return { cum, rounds, best, worst, avg, pct, guessed, totalMatches, pos, selectedRound: selRound };
  }, [selected, selRound]);

  const p = P(selected);
  const color = CHART_COLORS[selected];

  return <Card icon="👤" title="Статистика участника">
    {/* Selector */}
    <div style={{ padding: "12px 16px", display: "flex", gap: 6, flexWrap: "wrap", borderBottom: `1px solid ${cl.brd}` }}>
      {ALL_PIDS.map(pid => (
        <button key={pid} onClick={() => { setSelected(pid); setSelRound(null); }} style={{
          padding: "6px 12px", borderRadius: 6, border: selected === pid ? `2px solid ${CHART_COLORS[pid]}` : "2px solid transparent",
          background: selected === pid ? `${CHART_COLORS[pid]}20` : "rgba(255,255,255,0.04)",
          color: selected === pid ? CHART_COLORS[pid] : cl.dim, fontSize: 12, fontWeight: selected === pid ? 700 : 500, cursor: "pointer",
        }}>{P(pid)?.team}</button>
      ))}
    </div>

    {/* Stats grid */}
    <div style={{ padding: 16 }}>
      <div style={{ display: "flex", alignItems: "center", gap: 12, marginBottom: 16 }}>
        <div style={{ width: 48, height: 48, borderRadius: 12, background: `${color}25`, display: "flex", alignItems: "center", justifyContent: "center", fontSize: 22, fontWeight: 800, color }}>{stats.pos}</div>
        <div>
          <div style={{ fontSize: 16, fontWeight: 700 }}>{p?.name}</div>
          <div style={{ fontSize: 12, color: cl.dim }}>{p?.team} · {stats.cum.pts} очков</div>
        </div>
      </div>

      <div style={{ display: "grid", gridTemplateColumns: "repeat(auto-fit, minmax(130px, 1fr))", gap: 10, marginBottom: 16 }}>
        {[
          { label: "Среднее за тур", value: stats.avg, sub: "очков" },
          { label: "Лучший тур", value: `${stats.best.pts}`, sub: `${stats.best.r} тур` },
          { label: "Худший тур", value: `${stats.worst.pts}`, sub: `${stats.worst.r} тур` },
          { label: "Угадано", value: `${stats.pct}%`, sub: `${stats.guessed}/${stats.totalMatches}` },
          { label: "Точных счетов", value: stats.cum.sc, sub: `${((stats.cum.sc / stats.totalMatches) * 100).toFixed(0)}%` },
          { label: "Разниц", value: stats.cum.df, sub: `${((stats.cum.df / stats.totalMatches) * 100).toFixed(0)}%` },
        ].map((s, i) => (
          <div key={i} style={{ background: "rgba(255,255,255,0.03)", borderRadius: 8, padding: "12px 14px", border: `1px solid ${cl.brd}` }}>
            <div style={{ fontSize: 10, color: cl.mut, textTransform: "uppercase", marginBottom: 4 }}>{s.label}</div>
            <div style={{ fontSize: 20, fontWeight: 800, color }}>{s.value}</div>
            <div style={{ fontSize: 11, color: cl.dim }}>{s.sub}</div>
          </div>
        ))}
      </div>

      {/* Mini bar chart of round points */}
      <div style={{ fontSize: 11, color: cl.dim, marginBottom: 6 }}>Очки по турам <span style={{ color: cl.mut }}>(нажмите на столбик)</span>:</div>
      {stats.selectedRound && <div style={{ padding: "8px 12px", marginBottom: 8, borderRadius: 6, background: `${color}15`, border: `1px solid ${color}30`, fontSize: 12 }}>
        <strong style={{ color }}>{stats.selectedRound.r} тур:</strong> <span style={{ color: cl.acc, fontWeight: 700 }}>{stats.selectedRound.pts} очков</span>
        {stats.selectedRound.sc > 0 && <span style={{ marginLeft: 8 }}><Bdg color={cl.grn}>{stats.selectedRound.sc} С</Bdg></span>}
        {stats.selectedRound.df > 0 && <span style={{ marginLeft: 4 }}><Bdg color={cl.blu}>{stats.selectedRound.df} Р</Bdg></span>}
        {stats.selectedRound.oc > 0 && <span style={{ marginLeft: 4 }}><Bdg color={cl.acc}>{stats.selectedRound.oc} И</Bdg></span>}
      </div>}
      <div style={{ display: "flex", gap: 2, alignItems: "end", height: 80 }}>
        {stats.rounds.map(r => {
          const h = Math.max(2, (r.pts / 14) * 70);
          const isBest = r.r === stats.best.r;
          const isWorst = r.r === stats.worst.r;
          const isSel = stats.selectedRound?.r === r.r;
          return <div key={r.r} onClick={() => setSelRound(sr => sr?.r === r.r ? null : r)} style={{ flex: 1, display: "flex", flexDirection: "column", alignItems: "center", gap: 2, cursor: "pointer" }}>
            <span style={{ fontSize: 8, color: isSel ? color : isBest ? cl.grn : isWorst ? cl.red : cl.mut, fontWeight: isBest || isWorst || isSel ? 700 : 400 }}>{r.pts}</span>
            <div style={{
              width: "100%", maxWidth: 32, height: h, borderRadius: "3px 3px 0 0",
              background: isSel ? color : isBest ? cl.grn : isWorst ? cl.red : `${color}60`,
              border: isSel ? `2px solid ${color}` : isBest ? `1px solid ${cl.grn}` : isWorst ? `1px solid ${cl.red}` : "none",
              transition: "all 0.15s",
            }} />
            <span style={{ fontSize: 7, color: isSel ? color : cl.mut, fontWeight: isSel ? 700 : 400 }}>{r.r}</span>
          </div>;
        })}
      </div>

      {/* Scoring breakdown pie-like */}
      <div style={{ marginTop: 16, display: "flex", gap: 16, justifyContent: "center" }}>
        {[
          { label: "Счёт", val: stats.cum.sc, color: cl.grn, pts: stats.cum.sc * 3 },
          { label: "Разница", val: stats.cum.df, color: cl.blu, pts: stats.cum.df * 2 },
          { label: "Исход", val: stats.cum.oc, color: cl.acc, pts: stats.cum.oc * 1 },
        ].map(s => {
          const pct = stats.cum.pts > 0 ? ((s.pts / stats.cum.pts) * 100).toFixed(0) : 0;
          return <div key={s.label} style={{ textAlign: "center" }}>
            <div style={{ width: 56, height: 56, borderRadius: "50%", background: `${s.color}15`, border: `3px solid ${s.color}50`, display: "flex", alignItems: "center", justifyContent: "center", margin: "0 auto 6px" }}>
              <span style={{ fontSize: 16, fontWeight: 800, color: s.color }}>{s.val}</span>
            </div>
            <div style={{ fontSize: 11, fontWeight: 600, color: s.color }}>{s.label}</div>
            <div style={{ fontSize: 10, color: cl.dim }}>{s.pts} очк · {pct}%</div>
          </div>;
        })}
      </div>
    </div>
  </Card>;
}

function App() {
  const [storageReady, setStorageReady] = useState(false);
  const [loading, setLoading] = useState(true);
  const [tab, setTab] = useState("champ");
  const maxAvailableRound = Math.max(...Object.keys(getRoundMatches()).map(Number));
  const [round, setRound] = useState(maxAvailableRound);
  const [liveResults, setLiveResults] = useState({});
  const [updating, setUpdating] = useState(false);
  const [lastUpdate, setLastUpdate] = useState(null);
  const [contentWidth, setContentWidth] = useState(() => { try { return Number(localStorage.getItem("rpl-width")) || 900; } catch(e) { return 900; } });
  const handleWidthChange = (v) => { setContentWidth(v); try { localStorage.setItem("rpl-width", v); } catch(e) {} };

  useEffect(() => {
    Promise.all([initStorage(), loadServerData()]).then(([ok]) => {
      // После загрузки серверных данных обновляем текущий тур на максимальный
      const newMax = Math.max(...Object.keys(getRoundMatches()).map(Number));
      setRound(newMax);
      setStorageReady(ok);
      setLoading(false);
    });
  }, []);

  // Автозагрузка результатов с сервера
  const fetchResults = async (targetRound) => {
    const r = targetRound || round;
    const currentMs = getRoundMatches()[r] || [];
    const unplayed = currentMs.filter(m => !m.result);
    if (!unplayed.length) return;

    setUpdating(true);
    try {
      const controller = new AbortController();
      const timeout = setTimeout(() => controller.abort(), 30000);

      const response = await fetch(`/api/results/${r}`, { signal: controller.signal });
      clearTimeout(timeout);

      if (!response.ok) {
        setLastUpdate(`Ошибка ${response.status}`);
        setUpdating(false);
        return;
      }

      const data = await response.json();
      if (data.matches && data.matches.length > 0) {
        const newResults = { ...liveResults };
        if (!newResults[r]) newResults[r] = {};
        data.matches.forEach(fetched => {
          const fh = fetched.home?.toLowerCase() || "";
          const fa = fetched.away?.toLowerCase() || "";
          const teamMatch = (a, b) => a === b || a.includes(b) || b.includes(a);
          const match = currentMs.find(m => {
            const mh = m.home.toLowerCase();
            const ma = m.away.toLowerCase();
            return teamMatch(mh, fh) && teamMatch(ma, fa);
          });
          if (match && typeof fetched.homeGoals === "number" && typeof fetched.awayGoals === "number") {
            newResults[r][match.id] = { home: fetched.homeGoals, away: fetched.awayGoals };
          }
        });
        setLiveResults(newResults);
        const count = Object.keys(newResults[r]).length;
        setLastUpdate(new Date().toLocaleTimeString("ru-RU", { hour: "2-digit", minute: "2-digit" }) + ` (${count} матч., ${data.source || "сервер"})`);
      } else {
        setLastUpdate("Нет завершённых матчей");
      }
    } catch (e) {
      console.error("Ошибка загрузки:", e);
      setLastUpdate(e.name === "AbortError" ? "Таймаут (30с)" : "Ошибка сети");
    }
    setUpdating(false);
  };

  // Автозагрузка при смене тура (если есть несыгранные матчи)
  useEffect(() => {
    if (loading) return;
    const currentMs = getRoundMatches()[round] || [];
    const hasUnplayed = currentMs.some(m => !m.result);
    if (hasUnplayed && !liveResults[round]) {
      fetchResults(round);
    }
  }, [round, loading]);

  // Merge live results into match data
  const rawMs = loading ? [] : (getRoundMatches()[round] || []);
  const ms = rawMs.map(m => {
    const live = liveResults[round]?.[m.id];
    return live ? { ...m, result: live } : m;
  });
  const preds = loading ? {} : (getRoundPreds()[round] || {});
  const cups = (!loading && round === 19) ? getCupMatches19() : (!loading && round >= 20) ? getCupMatches20() : [];

  if (loading) return <div style={{ minHeight: "100vh", background: "#0a0e1a", color: "#f1f5f9", display: "flex", alignItems: "center", justifyContent: "center", fontFamily: "'Segoe UI', sans-serif" }}>
    <div style={{ textAlign: "center" }}>
      <div style={{ fontSize: 40, marginBottom: 12 }}>⚽</div>
      <div style={{ fontSize: 16, fontWeight: 600 }}>Загрузка данных...</div>
    </div>
  </div>;

  return <div style={{ minHeight: "100vh", background: `linear-gradient(135deg, ${cl.bg} 0%, #0f172a 50%, #1a0a2e 100%)`, color: cl.txt, fontFamily: "'Segoe UI', system-ui, sans-serif" }}>
    <header style={{ padding: "20px 16px", textAlign: "center", borderBottom: `1px solid ${cl.brd}`, background: "rgba(17,24,39,0.8)", backdropFilter: "blur(10px)", position: "sticky", top: 0, zIndex: 100 }}>
      <h1 style={{ fontSize: 22, fontWeight: 800, margin: 0, background: `linear-gradient(135deg, ${cl.acc}, ${cl.gld})`, WebkitBackgroundClip: "text", WebkitTextFillColor: "transparent" }}>⚽ ПРОГНОЗ-ЛИГА РПЛ</h1>
      <div style={{ display: "flex", alignItems: "center", justifyContent: "center", gap: 8, marginTop: 8 }}>
        <span style={{ fontSize: 13, color: cl.dim }}>Сезон 2025/2026</span>
        <select value={round} onChange={e => setRound(Number(e.target.value))} style={{ background: "#1e293b", border: `1px solid ${cl.brd}`, borderRadius: 6, padding: "4px 8px", color: cl.txt, fontSize: 13, fontWeight: 700, cursor: "pointer" }}>
          {getAvailableRounds().map(r => <option key={r} value={r} style={{ background: "#1e293b", color: "#f1f5f9" }}>{r} тур</option>)}
        </select>
      </div>
    </header>
    <nav style={{ display: "flex", gap: 4, padding: "12px 16px", overflowX: "auto", background: "rgba(17,24,39,0.6)", borderBottom: `1px solid ${cl.brd}`, justifyContent: "center", flexWrap: "wrap" }}>
      {TABS.map(t => <button key={t.id} onClick={() => setTab(t.id)} style={{ padding: "8px 16px", borderRadius: 8, border: "none", background: tab === t.id ? cl.acc : "rgba(255,255,255,0.05)", color: tab === t.id ? cl.bg : cl.dim, fontWeight: tab === t.id ? 700 : 500, fontSize: 13, cursor: "pointer", whiteSpace: "nowrap" }}>{t.label}</button>)}
    </nav>
    <div style={{ padding: 16, maxWidth: contentWidth, margin: "0 auto" }}>
      {tab === "schedule" && ms.length > 0 && <><Schedule round={round} ms={ms} /><RPLTable ms={ms} round={round} /></>}
      {tab === "schedule" && ms.length === 0 && <Card icon="📅" title="Расписание"><div style={{ padding: 24, textAlign: "center", color: cl.mut }}>Расписание 1 тура недоступно</div></Card>}
      {tab === "champ" && <><ChampTable round={round} ms={ms} preds={preds} /><ChampLayout ms={ms} preds={preds} /><ChampResults round={round} ms={ms} preds={preds} /></>}
      {tab === "cup" && (() => { const cupMs = round >= 20 ? (getRoundMatches()[20] || ms) : ms; const cupPr = round >= 20 ? (getRoundPreds()[20] || preds) : preds; return <><Playoffs round={round} cups={cups} ms={cupMs} preds={cupPr} />{cups.map(cm => <CupCompact key={cm.id} cup={cm} ms={cupMs} preds={cupPr} />)}<CupGroup /></>; })()}
      {tab === "stats" && <><PositionChart /><PositionTable /><DynamicsChart /><RoundByRoundChart /><PredictionRating /><PlayerStats /></>}
      {tab === "info" && <Card icon="👥" title="Участники"><table style={{ ...T, fontSize: 13 }}><thead><tr><th style={{ ...TH, textAlign: "left" }}>Имя</th><th style={{ ...TH, textAlign: "left" }}>Команда</th><th style={TH}>Прогноз</th></tr></thead><tbody>{PARTICIPANTS.map((p, i) => <tr key={p.id} style={{ background: rBg(i) }}><td style={{ ...TD, textAlign: "left", fontWeight: 500 }}>{p.name}</td><td style={{ ...TD, textAlign: "left", color: cl.dim }}>{p.team}</td><td style={TD}>{preds[p.id] ? <Bdg color={cl.grn}>✓</Bdg> : <Bdg color={cl.mut}>—</Bdg>}</td></tr>)}</tbody></table></Card>}
    </div>
    <div style={{ padding: "12px 16px", display: "flex", alignItems: "center", justifyContent: "center", gap: 10, fontSize: 11, color: cl.mut }}>
      <span>Ширина:</span>
      <input type="range" min={400} max={1200} step={50} value={contentWidth} onChange={e => handleWidthChange(Number(e.target.value))} style={{ width: 100, cursor: "pointer", accentColor: cl.acc }} />
      <span>{contentWidth}px</span>
      <span style={{ marginLeft: 12 }}>Прогноз-Лига РПЛ · v10.0</span>
    </div>
  </div>;
}
