const { Button, Card } = window.FamilyFitDesignSystem_42efdd;

const FAMILY = [
  {name:'Papai', seed:0, weekPts:1420, monthPts:5320, allPts:42800, streak:6, team:'D3'},
  {name:'Ayam', seed:2, weekPts:1340, monthPts:5760, allPts:36100, streak:9, team:'D3'},
  {name:'Ti Tio', seed:1, weekPts:1180, monthPts:4900, allPts:38500, streak:4, team:'D2'},
  {name:'Sab', seed:3, weekPts:860, monthPts:3400, allPts:24700, streak:3, team:'D3'},
  {name:'Mayday', seed:4, weekPts:640, monthPts:2500, allPts:18300, streak:2, team:'D2'},
];

const ACTIVITIES = [
  {name:'Walking', tone:'stretch', icon:'ph-person-simple-walk', category:'Outdoor', desc:'The easiest way to start. Every step counts toward the family total.', stat:'Most logged activity'},
  {name:'Running', tone:'run', icon:'ph-person-simple-run', category:'Cardio', desc:'From a quick jog round the block to a proper 10k.', stat:'Fastest way to build a streak'},
  {name:'Cycling', tone:'cycle', icon:'ph-bicycle', category:'Outdoor', desc:'On the road, on the trail, or on a stationary bike.', stat:'Best for longer distances'},
  {name:'Swimming', tone:'swim', icon:'ph-waves', category:'Cardio', desc:'Lengths at the local pool, or open water when the weather allows.', stat:'Low impact, high reward'},
  {name:'Football', tone:'strength', icon:'ph-soccer-ball', category:'Team', desc:'Five-a-side, a kickabout in the park, or a proper match.', stat:'Best logged as a team'},
  {name:'Cricket', tone:'strength', icon:'ph-cricket', category:'Team', desc:'A back-garden game or a proper match on the green.', stat:'Great for a full afternoon out'},
  {name:'Rounders', tone:'stretch', icon:'ph-baseball', category:'Team', desc:'Easy to pick up and brilliant for mixed ages.', stat:'A family favourite at the park'},
  {name:'Tennis', tone:'run', icon:'custom:tennis', category:'Cardio', desc:'A quick knock-about or a proper set.', stat:'Best with a partner'},
  {name:'Gym', tone:'strength', icon:'ph-barbell', category:'Cardio', desc:'Weights, machines, or a class — whatever suits.', stat:'Structured strength, your way'},
  {name:'Netball', tone:'cycle', icon:'custom:netball', category:'Team', desc:'Fast-paced and easy to organise with a few people.', stat:'Great for building teamwork'},
  {name:'Rowing', tone:'swim', icon:'img:rowing-icon.png', category:'Outdoor', desc:'On the water or on a machine at the gym.', stat:'A full-body session'},
  {name:'Others', tone:'run', icon:'ph-fill ph-dots-three-outline', category:'Other', desc:'Anything else that gets you moving.', stat:'Every bit of activity counts'},
];

const CustomSportIcons = {
  tennis: (p)=>{
    const diag = [];
    for(let i=-100;i<=220;i+=20){
      diag.push(<line key={'a'+i} x1={i} y1={-30} x2={i+140} y2={170} strokeWidth="5"/>);
      diag.push(<line key={'b'+i} x1={i} y1={170} x2={i+140} y2={-30} strokeWidth="5"/>);
    }
    return (
      <svg viewBox="0 0 256 256" fill="none" stroke="currentColor" strokeWidth="14" strokeLinecap="round" strokeLinejoin="round" {...p}>
        <g transform="rotate(38 128 128)">
          <defs><clipPath id="tnsClip"><ellipse cx="128" cy="70" rx="50" ry="64"/></clipPath></defs>
          <g clipPath="url(#tnsClip)">{diag}</g>
          <ellipse cx="128" cy="70" rx="50" ry="64"/>
          <path d="M106 126 Q120 148 128 162"/>
          <path d="M150 126 Q136 148 128 162"/>
          <line x1="128" y1="160" x2="128" y2="248"/>
          <line x1="115" y1="212" x2="141" y2="212" strokeWidth="8"/>
          <line x1="115" y1="230" x2="141" y2="230" strokeWidth="8"/>
        </g>
      </svg>
    );
  },
  rowing: (p)=>(
    <svg viewBox="0 0 256 256" fill="none" stroke="currentColor" strokeWidth="14" strokeLinecap="round" strokeLinejoin="round" {...p}>
      <path d="M30 168 Q128 148 226 168 Q194 198 128 198 Q62 198 30 168 Z"/>
      <circle cx="122" cy="104" r="16"/>
      <line x1="122" y1="122" x2="122" y2="160"/>
      <line x1="122" y1="136" x2="196" y2="112"/>
      <line x1="182" y1="100" x2="210" y2="122" strokeWidth="10"/>
      <path d="M18 220 Q40 208 62 220 T106 220 T150 220 T194 220 T238 220" strokeWidth="8"/>
    </svg>
  ),
  netball: (p)=>(
    <svg viewBox="0 0 256 256" fill="none" stroke="currentColor" strokeWidth="14" strokeLinecap="round" strokeLinejoin="round" {...p}>
      <line x1="128" y1="234" x2="128" y2="118"/>
      <ellipse cx="128" cy="86" rx="48" ry="16"/>
      <g strokeWidth="7">
        <line x1="92" y1="92" x2="100" y2="150"/><line x1="112" y1="90" x2="118" y2="156"/><line x1="128" y1="90" x2="128" y2="160"/><line x1="144" y1="90" x2="138" y2="156"/><line x1="164" y1="92" x2="156" y2="150"/>
      </g>
    </svg>
  ),
  hockey: (p)=>(
    <svg viewBox="0 0 256 256" fill="none" stroke="currentColor" strokeWidth="14" strokeLinecap="round" strokeLinejoin="round" {...p}>
      <path d="M168 24 L112 188"/>
      <path d="M112 188 Q96 218 136 222"/>
      <circle cx="76" cy="226" r="13" fill="currentColor" stroke="none"/>
    </svg>
  ),
};

function ActivityIconBadge({a,size=40,iconSize=20}){
  const custom = a.icon.startsWith('custom:');
  const isImg = a.icon.startsWith('img:');
  const Cmp = custom ? CustomSportIcons[a.icon.slice(7)] : null;
  return (
    <span style={{width:size,height:size,borderRadius:'50%',background:`var(--color-activity-${a.tone})`,color:'#fff',display:'flex',alignItems:'center',justifyContent:'center',flexShrink:0}}>
      {isImg ? <img src={a.icon.slice(4)} style={{width:iconSize*1.6,height:iconSize*1.6,objectFit:'contain'}} alt="" /> : custom ? <Cmp style={{width:iconSize,height:iconSize}}/> : <i className={"ph "+a.icon} style={{fontSize:iconSize}}></i>}
    </span>
  );
}

const SEED_LOGS = {
  Swimming: [
    {person:'Papai', date:'2026-01-02', duration:'30', note:'', loggedAt:1767333600000, seed:true},
    {person:'Ayam', date:'2026-01-02', duration:'30', note:'', loggedAt:1767333600002, seed:true},
    {person:'Sab', date:'2026-01-02', duration:'30', note:'', loggedAt:1767333600005, seed:true},
    {person:'Papai', date:'2026-01-07', duration:'30', note:'', loggedAt:1767765600001, seed:true},
    {person:'Ayam', date:'2026-01-07', duration:'30', note:'', loggedAt:1767765600003, seed:true},
    {person:'Sab', date:'2026-01-07', duration:'30', note:'', loggedAt:1767765600006, seed:true},
    {person:'Ayam', date:'2026-01-12', duration:'30', note:'', loggedAt:1768197600004, seed:true},
    {person:'Sab', date:'2026-01-12', duration:'30', note:'', loggedAt:1768197600007, seed:true},
    {person:'Papai', date:'2026-02-02', duration:'30', note:'', loggedAt:1770012000008, seed:true},
    {person:'Ayam', date:'2026-02-02', duration:'30', note:'', loggedAt:1770012000010, seed:true},
    {person:'Sab', date:'2026-02-02', duration:'30', note:'', loggedAt:1770012000017, seed:true},
    {person:'Ayam', date:'2026-02-06', duration:'30', note:'', loggedAt:1770357600016, seed:true},
    {person:'Papai', date:'2026-02-07', duration:'30', note:'', loggedAt:1770444000009, seed:true},
    {person:'Ayam', date:'2026-02-07', duration:'30', note:'', loggedAt:1770444000011, seed:true},
    {person:'Sab', date:'2026-02-07', duration:'30', note:'', loggedAt:1770444000018, seed:true},
    {person:'Ayam', date:'2026-02-12', duration:'30', note:'', loggedAt:1770876000012, seed:true},
    {person:'Sab', date:'2026-02-12', duration:'30', note:'', loggedAt:1770876000019, seed:true},
    {person:'Ayam', date:'2026-02-17', duration:'30', note:'', loggedAt:1771308000013, seed:true},
    {person:'Sab', date:'2026-02-17', duration:'30', note:'', loggedAt:1771308000020, seed:true},
    {person:'Ayam', date:'2026-02-22', duration:'30', note:'', loggedAt:1771740000014, seed:true},
    {person:'Sab', date:'2026-02-22', duration:'30', note:'', loggedAt:1771740000021, seed:true},
    {person:'Ayam', date:'2026-02-27', duration:'30', note:'', loggedAt:1772172000015, seed:true},
    {person:'Sab', date:'2026-02-27', duration:'30', note:'', loggedAt:1772172000022, seed:true},
    {person:'Papai', date:'2026-03-02', duration:'30', note:'', loggedAt:1772431200023, seed:true},
    {person:'Ayam', date:'2026-03-02', duration:'30', note:'', loggedAt:1772431200026, seed:true},
    {person:'Sab', date:'2026-03-02', duration:'30', note:'', loggedAt:1772431200029, seed:true},
    {person:'Papai', date:'2026-03-07', duration:'30', note:'', loggedAt:1772863200024, seed:true},
    {person:'Ayam', date:'2026-03-07', duration:'30', note:'', loggedAt:1772863200027, seed:true},
    {person:'Sab', date:'2026-03-07', duration:'30', note:'', loggedAt:1772863200030, seed:true},
    {person:'Papai', date:'2026-03-12', duration:'30', note:'', loggedAt:1773295200025, seed:true},
    {person:'Ayam', date:'2026-03-12', duration:'30', note:'', loggedAt:1773295200028, seed:true},
    {person:'Sab', date:'2026-03-12', duration:'30', note:'', loggedAt:1773295200031, seed:true},
    {person:'Sab', date:'2026-03-17', duration:'30', note:'', loggedAt:1773727200032, seed:true},
    {person:'Papai', date:'2026-04-02', duration:'30', note:'', loggedAt:1775109600033, seed:true},
    {person:'Ayam', date:'2026-04-02', duration:'30', note:'', loggedAt:1775109600037, seed:true},
    {person:'Sab', date:'2026-04-02', duration:'30', note:'', loggedAt:1775109600043, seed:true},
    {person:'Papai', date:'2026-04-07', duration:'30', note:'', loggedAt:1775541600034, seed:true},
    {person:'Ayam', date:'2026-04-07', duration:'30', note:'', loggedAt:1775541600038, seed:true},
    {person:'Sab', date:'2026-04-07', duration:'30', note:'', loggedAt:1775541600044, seed:true},
    {person:'Papai', date:'2026-04-12', duration:'30', note:'', loggedAt:1775973600035, seed:true},
    {person:'Ayam', date:'2026-04-12', duration:'30', note:'', loggedAt:1775973600039, seed:true},
    {person:'Sab', date:'2026-04-12', duration:'30', note:'', loggedAt:1775973600045, seed:true},
    {person:'Papai', date:'2026-04-17', duration:'30', note:'', loggedAt:1776405600036, seed:true},
    {person:'Ayam', date:'2026-04-17', duration:'30', note:'', loggedAt:1776405600040, seed:true},
    {person:'Sab', date:'2026-04-17', duration:'30', note:'', loggedAt:1776405600046, seed:true},
    {person:'Ayam', date:'2026-04-22', duration:'30', note:'', loggedAt:1776837600041, seed:true},
    {person:'Sab', date:'2026-04-22', duration:'30', note:'', loggedAt:1776837600047, seed:true},
    {person:'Ayam', date:'2026-04-27', duration:'30', note:'', loggedAt:1777269600042, seed:true},
    {person:'Sab', date:'2026-04-27', duration:'30', note:'', loggedAt:1777269600048, seed:true},
    {person:'Papai', date:'2026-05-02', duration:'30', note:'', loggedAt:1777701600049, seed:true},
    {person:'Ayam', date:'2026-05-02', duration:'30', note:'', loggedAt:1777701600051, seed:true},
    {person:'Sab', date:'2026-05-02', duration:'30', note:'', loggedAt:1777701600054, seed:true},
    {person:'Papai', date:'2026-05-07', duration:'30', note:'', loggedAt:1778133600050, seed:true},
    {person:'Ayam', date:'2026-05-07', duration:'30', note:'', loggedAt:1778133600052, seed:true},
    {person:'Sab', date:'2026-05-07', duration:'30', note:'', loggedAt:1778133600055, seed:true},
    {person:'Ayam', date:'2026-05-12', duration:'30', note:'', loggedAt:1778565600053, seed:true},
    {person:'Sab', date:'2026-05-12', duration:'30', note:'', loggedAt:1778565600056, seed:true},
    {person:'Papai', date:'2026-06-02', duration:'30', note:'', loggedAt:1780380000057, seed:true},
    {person:'Ayam', date:'2026-06-02', duration:'30', note:'', loggedAt:1780380000061, seed:true},
    {person:'Sab', date:'2026-06-02', duration:'30', note:'', loggedAt:1780380000066, seed:true},
    {person:'Papai', date:'2026-06-07', duration:'30', note:'', loggedAt:1780812000058, seed:true},
    {person:'Ayam', date:'2026-06-07', duration:'30', note:'', loggedAt:1780812000062, seed:true},
    {person:'Sab', date:'2026-06-07', duration:'30', note:'', loggedAt:1780812000067, seed:true},
    {person:'Papai', date:'2026-06-12', duration:'30', note:'', loggedAt:1781244000059, seed:true},
    {person:'Ayam', date:'2026-06-12', duration:'30', note:'', loggedAt:1781244000063, seed:true},
    {person:'Sab', date:'2026-06-12', duration:'30', note:'', loggedAt:1781244000068, seed:true},
    {person:'Papai', date:'2026-06-17', duration:'30', note:'', loggedAt:1781676000060, seed:true},
    {person:'Ayam', date:'2026-06-17', duration:'30', note:'', loggedAt:1781676000064, seed:true},
    {person:'Sab', date:'2026-06-17', duration:'30', note:'', loggedAt:1781676000069, seed:true},
    {person:'Ayam', date:'2026-06-22', duration:'30', note:'', loggedAt:1782108000065, seed:true},
    {person:'Papai', date:'2026-07-02', duration:'30', note:'', loggedAt:1782972000070, seed:true},
    {person:'Ayam', date:'2026-07-02', duration:'30', note:'', loggedAt:1782972000074, seed:true},
    {person:'Sab', date:'2026-07-02', duration:'30', note:'', loggedAt:1782972000077, seed:true},
    {person:'Papai', date:'2026-07-07', duration:'30', note:'', loggedAt:1783404000071, seed:true},
    {person:'Ayam', date:'2026-07-07', duration:'30', note:'', loggedAt:1783404000075, seed:true},
    {person:'Sab', date:'2026-07-07', duration:'30', note:'', loggedAt:1783404000078, seed:true},
    {person:'Papai', date:'2026-07-12', duration:'30', note:'', loggedAt:1783836000072, seed:true},
    {person:'Ayam', date:'2026-07-12', duration:'30', note:'', loggedAt:1783836000076, seed:true},
    {person:'Sab', date:'2026-07-12', duration:'30', note:'', loggedAt:1783836000079, seed:true},
    {person:'Papai', date:'2026-07-17', duration:'30', note:'', loggedAt:1784268000073, seed:true}
  ],
  Gym: [
    {person:'Papai', date:'2026-01-02', duration:'30', note:'', loggedAt:1767333600080, seed:true},
    {person:'Papai', date:'2026-01-07', duration:'30', note:'', loggedAt:1767765600081, seed:true},
    {person:'Papai', date:'2026-01-12', duration:'30', note:'', loggedAt:1768197600082, seed:true},
    {person:'Papai', date:'2026-02-02', duration:'30', note:'', loggedAt:1770012000083, seed:true},
    {person:'Papai', date:'2026-02-06', duration:'30', note:'', loggedAt:1770357600089, seed:true},
    {person:'Papai', date:'2026-02-07', duration:'30', note:'', loggedAt:1770444000084, seed:true},
    {person:'Papai', date:'2026-02-11', duration:'30', note:'', loggedAt:1770789600090, seed:true},
    {person:'Papai', date:'2026-02-12', duration:'30', note:'', loggedAt:1770876000085, seed:true},
    {person:'Papai', date:'2026-02-17', duration:'30', note:'', loggedAt:1771308000086, seed:true},
    {person:'Papai', date:'2026-02-22', duration:'30', note:'', loggedAt:1771740000087, seed:true},
    {person:'Papai', date:'2026-02-27', duration:'30', note:'', loggedAt:1772172000088, seed:true},
    {person:'Papai', date:'2026-03-02', duration:'30', note:'', loggedAt:1772431200091, seed:true},
    {person:'Papai', date:'2026-03-07', duration:'30', note:'', loggedAt:1772863200092, seed:true},
    {person:'Papai', date:'2026-03-12', duration:'30', note:'', loggedAt:1773295200093, seed:true},
    {person:'Papai', date:'2026-03-17', duration:'30', note:'', loggedAt:1773727200094, seed:true},
    {person:'Papai', date:'2026-03-22', duration:'30', note:'', loggedAt:1774159200095, seed:true},
    {person:'Papai', date:'2026-04-02', duration:'30', note:'', loggedAt:1775109600096, seed:true},
    {person:'Papai', date:'2026-04-06', duration:'30', note:'', loggedAt:1775455200102, seed:true},
    {person:'Papai', date:'2026-04-07', duration:'30', note:'', loggedAt:1775541600097, seed:true},
    {person:'Papai', date:'2026-04-12', duration:'30', note:'', loggedAt:1775973600098, seed:true},
    {person:'Papai', date:'2026-04-17', duration:'30', note:'', loggedAt:1776405600099, seed:true},
    {person:'Papai', date:'2026-04-22', duration:'30', note:'', loggedAt:1776837600100, seed:true},
    {person:'Papai', date:'2026-04-27', duration:'30', note:'', loggedAt:1777269600101, seed:true},
    {person:'Papai', date:'2026-05-02', duration:'30', note:'', loggedAt:1777701600103, seed:true},
    {person:'Papai', date:'2026-05-07', duration:'30', note:'', loggedAt:1778133600104, seed:true},
    {person:'Papai', date:'2026-05-12', duration:'30', note:'', loggedAt:1778565600105, seed:true},
    {person:'Papai', date:'2026-05-17', duration:'30', note:'', loggedAt:1778997600106, seed:true},
    {person:'Papai', date:'2026-05-22', duration:'30', note:'', loggedAt:1779429600107, seed:true},
    {person:'Papai', date:'2026-05-27', duration:'30', note:'', loggedAt:1779861600108, seed:true},
    {person:'Papai', date:'2026-06-02', duration:'30', note:'', loggedAt:1780380000109, seed:true},
    {person:'Papai', date:'2026-06-07', duration:'30', note:'', loggedAt:1780812000110, seed:true},
    {person:'Papai', date:'2026-06-12', duration:'30', note:'', loggedAt:1781244000111, seed:true},
    {person:'Papai', date:'2026-06-17', duration:'30', note:'', loggedAt:1781676000112, seed:true},
    {person:'Papai', date:'2026-06-22', duration:'30', note:'', loggedAt:1782108000113, seed:true},
    {person:'Papai', date:'2026-07-02', duration:'30', note:'', loggedAt:1782972000114, seed:true},
    {person:'Papai', date:'2026-07-07', duration:'30', note:'', loggedAt:1783404000115, seed:true},
    {person:'Papai', date:'2026-07-12', duration:'30', note:'', loggedAt:1783836000116, seed:true},
    {person:'Papai', date:'2026-07-17', duration:'30', note:'', loggedAt:1784268000117, seed:true},
    {person:'Papai', date:'2026-07-22', duration:'30', note:'', loggedAt:1784700000118, seed:true},
    {person:'Papai', date:'2026-07-27', duration:'30', note:'', loggedAt:1785132000119, seed:true},
    {person:'Papai', date:'2026-08-02', duration:'30', note:'', loggedAt:1785650400120, seed:true},
    {person:'Papai', date:'2026-08-07', duration:'30', note:'', loggedAt:1786082400121, seed:true},
    {person:'Papai', date:'2026-08-12', duration:'30', note:'', loggedAt:1786514400122, seed:true},
    {person:'Papai', date:'2026-08-17', duration:'30', note:'', loggedAt:1786946400123, seed:true}
  ],
  Cricket: [
    {person:'Sab', date:'2026-04-02', format:'Club match', note:'', loggedAt:1775109600124, seed:true},
    {person:'Sab', date:'2026-04-06', format:'Club match', note:'', loggedAt:1775455200130, seed:true},
    {person:'Sab', date:'2026-04-07', format:'Club match', note:'', loggedAt:1775541600125, seed:true},
    {person:'Sab', date:'2026-04-11', format:'Club match', note:'', loggedAt:1775887200131, seed:true},
    {person:'Sab', date:'2026-04-12', format:'Club match', note:'', loggedAt:1775973600126, seed:true},
    {person:'Sab', date:'2026-04-16', format:'Club match', note:'', loggedAt:1776319200132, seed:true},
    {person:'Sab', date:'2026-04-17', format:'Club match', note:'', loggedAt:1776405600127, seed:true},
    {person:'Sab', date:'2026-04-21', format:'Club match', note:'', loggedAt:1776751200133, seed:true},
    {person:'Sab', date:'2026-04-22', format:'Club match', note:'', loggedAt:1776837600128, seed:true},
    {person:'Sab', date:'2026-04-27', format:'Club match', note:'', loggedAt:1777269600129, seed:true},
    {person:'Sab', date:'2026-05-02', format:'Club match', note:'', loggedAt:1777701600134, seed:true},
    {person:'Sab', date:'2026-05-03', format:'Club match', note:'', loggedAt:1777788000155, seed:true},
    {person:'Sab', date:'2026-05-04', format:'Club match', note:'', loggedAt:1777874400150, seed:true},
    {person:'Sab', date:'2026-05-05', format:'Club match', note:'', loggedAt:1777960800145, seed:true},
    {person:'Sab', date:'2026-05-06', format:'Club match', note:'', loggedAt:1778047200140, seed:true},
    {person:'Sab', date:'2026-05-07', format:'Club match', note:'', loggedAt:1778133600135, seed:true},
    {person:'Sab', date:'2026-05-08', format:'Club match', note:'', loggedAt:1778220000156, seed:true},
    {person:'Sab', date:'2026-05-09', format:'Club match', note:'', loggedAt:1778306400151, seed:true},
    {person:'Sab', date:'2026-05-10', format:'Club match', note:'', loggedAt:1778392800146, seed:true},
    {person:'Sab', date:'2026-05-11', format:'Club match', note:'', loggedAt:1778479200141, seed:true},
    {person:'Sab', date:'2026-05-12', format:'Club match', note:'', loggedAt:1778565600136, seed:true},
    {person:'Sab', date:'2026-05-14', format:'Club match', note:'', loggedAt:1778738400152, seed:true},
    {person:'Sab', date:'2026-05-15', format:'Club match', note:'', loggedAt:1778824800147, seed:true},
    {person:'Sab', date:'2026-05-16', format:'Club match', note:'', loggedAt:1778911200142, seed:true},
    {person:'Sab', date:'2026-05-17', format:'Club match', note:'', loggedAt:1778997600137, seed:true},
    {person:'Sab', date:'2026-05-19', format:'Club match', note:'', loggedAt:1779170400153, seed:true},
    {person:'Sab', date:'2026-05-20', format:'Club match', note:'', loggedAt:1779256800148, seed:true},
    {person:'Sab', date:'2026-05-21', format:'Club match', note:'', loggedAt:1779343200143, seed:true},
    {person:'Sab', date:'2026-05-22', format:'Club match', note:'', loggedAt:1779429600138, seed:true},
    {person:'Sab', date:'2026-05-24', format:'Club match', note:'', loggedAt:1779602400154, seed:true},
    {person:'Sab', date:'2026-05-25', format:'Club match', note:'', loggedAt:1779688800149, seed:true},
    {person:'Sab', date:'2026-05-26', format:'Club match', note:'', loggedAt:1779775200144, seed:true},
    {person:'Sab', date:'2026-05-27', format:'Club match', note:'', loggedAt:1779861600139, seed:true},
    {person:'Sab', date:'2026-06-02', format:'Club match', note:'', loggedAt:1780380000157, seed:true},
    {person:'Sab', date:'2026-06-03', format:'Club match', note:'', loggedAt:1780466400178, seed:true},
    {person:'Sab', date:'2026-06-04', format:'Club match', note:'', loggedAt:1780552800173, seed:true},
    {person:'Sab', date:'2026-06-05', format:'Club match', note:'', loggedAt:1780639200168, seed:true},
    {person:'Sab', date:'2026-06-06', format:'Club match', note:'', loggedAt:1780725600163, seed:true},
    {person:'Sab', date:'2026-06-07', format:'Club match', note:'', loggedAt:1780812000158, seed:true},
    {person:'Sab', date:'2026-06-09', format:'Club match', note:'', loggedAt:1780984800174, seed:true},
    {person:'Sab', date:'2026-06-10', format:'Club match', note:'', loggedAt:1781071200169, seed:true},
    {person:'Sab', date:'2026-06-11', format:'Club match', note:'', loggedAt:1781157600164, seed:true},
    {person:'Sab', date:'2026-06-12', format:'Club match', note:'', loggedAt:1781244000159, seed:true},
    {person:'Sab', date:'2026-06-14', format:'Club match', note:'', loggedAt:1781416800175, seed:true},
    {person:'Sab', date:'2026-06-15', format:'Club match', note:'', loggedAt:1781503200170, seed:true},
    {person:'Sab', date:'2026-06-16', format:'Club match', note:'', loggedAt:1781589600165, seed:true},
    {person:'Sab', date:'2026-06-17', format:'Club match', note:'', loggedAt:1781676000160, seed:true},
    {person:'Sab', date:'2026-06-19', format:'Club match', note:'', loggedAt:1781848800176, seed:true},
    {person:'Sab', date:'2026-06-20', format:'Club match', note:'', loggedAt:1781935200171, seed:true},
    {person:'Sab', date:'2026-06-21', format:'Club match', note:'', loggedAt:1782021600166, seed:true},
    {person:'Sab', date:'2026-06-22', format:'Club match', note:'', loggedAt:1782108000161, seed:true},
    {person:'Sab', date:'2026-06-24', format:'Club match', note:'', loggedAt:1782280800177, seed:true},
    {person:'Sab', date:'2026-06-25', format:'Club match', note:'', loggedAt:1782367200172, seed:true},
    {person:'Sab', date:'2026-06-26', format:'Club match', note:'', loggedAt:1782453600167, seed:true},
    {person:'Sab', date:'2026-06-27', format:'Club match', note:'', loggedAt:1782540000162, seed:true},
    {person:'Sab', date:'2026-07-02', format:'Club match', note:'', loggedAt:1782972000179, seed:true},
    {person:'Sab', date:'2026-07-07', format:'Club match', note:'', loggedAt:1783404000180, seed:true},
    {person:'Sab', date:'2026-07-12', format:'Club match', note:'', loggedAt:1783836000181, seed:true},
    {person:'Sab', date:'2026-07-17', format:'Club match', note:'', loggedAt:1784268000182, seed:true},
    {person:'Sab', date:'2026-07-22', format:'Club match', note:'', loggedAt:1784700000183, seed:true},
    {person:'Sab', date:'2026-07-27', format:'Club match', note:'', loggedAt:1785132000184, seed:true},
    {person:'Sab', date:'2026-08-02', format:'Club match', note:'', loggedAt:1785650400185, seed:true}
  ],
  Cycling: [
    {person:'Papai', date:'2026-02-02', duration:'30', note:'', loggedAt:1770012000186, seed:true},
    {person:'Ayam', date:'2026-02-02', duration:'30', note:'', loggedAt:1770012000191, seed:true},
    {person:'Sab', date:'2026-02-02', duration:'30', note:'', loggedAt:1770012000195, seed:true},
    {person:'Papai', date:'2026-02-07', duration:'30', note:'', loggedAt:1770444000187, seed:true},
    {person:'Ayam', date:'2026-02-07', duration:'30', note:'', loggedAt:1770444000192, seed:true},
    {person:'Sab', date:'2026-02-07', duration:'30', note:'', loggedAt:1770444000196, seed:true},
    {person:'Papai', date:'2026-02-12', duration:'30', note:'', loggedAt:1770876000188, seed:true},
    {person:'Ayam', date:'2026-02-12', duration:'30', note:'', loggedAt:1770876000193, seed:true},
    {person:'Sab', date:'2026-02-12', duration:'30', note:'', loggedAt:1770876000197, seed:true},
    {person:'Papai', date:'2026-02-17', duration:'30', note:'', loggedAt:1771308000189, seed:true},
    {person:'Ayam', date:'2026-02-17', duration:'30', note:'', loggedAt:1771308000194, seed:true},
    {person:'Sab', date:'2026-02-17', duration:'30', note:'', loggedAt:1771308000198, seed:true},
    {person:'Papai', date:'2026-02-22', duration:'30', note:'', loggedAt:1771740000190, seed:true},
    {person:'Papai', date:'2026-05-02', duration:'30', note:'', loggedAt:1777701600199, seed:true},
    {person:'Ayam', date:'2026-05-02', duration:'30', note:'', loggedAt:1777701600202, seed:true},
    {person:'Sab', date:'2026-05-02', duration:'30', note:'', loggedAt:1777701600204, seed:true},
    {person:'Papai', date:'2026-05-07', duration:'30', note:'', loggedAt:1778133600200, seed:true},
    {person:'Ayam', date:'2026-05-07', duration:'30', note:'', loggedAt:1778133600203, seed:true},
    {person:'Sab', date:'2026-05-07', duration:'30', note:'', loggedAt:1778133600205, seed:true},
    {person:'Papai', date:'2026-05-12', duration:'30', note:'', loggedAt:1778565600201, seed:true},
    {person:'Sab', date:'2026-05-12', duration:'30', note:'', loggedAt:1778565600206, seed:true},
    {person:'Papai', date:'2026-06-02', duration:'30', note:'', loggedAt:1780380000207, seed:true},
    {person:'Ayam', date:'2026-06-02', duration:'30', note:'', loggedAt:1780380000208, seed:true},
    {person:'Sab', date:'2026-06-02', duration:'30', note:'', loggedAt:1780380000209, seed:true},
    {person:'Papai', date:'2026-07-02', duration:'30', note:'', loggedAt:1782972000210, seed:true},
    {person:'Ayam', date:'2026-07-02', duration:'30', note:'', loggedAt:1782972000212, seed:true},
    {person:'Sab', date:'2026-07-02', duration:'30', note:'', loggedAt:1782972000214, seed:true},
    {person:'Papai', date:'2026-07-07', duration:'30', note:'', loggedAt:1783404000211, seed:true},
    {person:'Ayam', date:'2026-07-07', duration:'30', note:'', loggedAt:1783404000213, seed:true},
    {person:'Papai', date:'2026-08-02', duration:'30', note:'', loggedAt:1785650400215, seed:true},
    {person:'Ayam', date:'2026-08-02', duration:'30', note:'', loggedAt:1785650400217, seed:true},
    {person:'Sab', date:'2026-08-02', duration:'30', note:'', loggedAt:1785650400219, seed:true},
    {person:'Papai', date:'2026-08-07', duration:'30', note:'', loggedAt:1786082400216, seed:true},
    {person:'Ayam', date:'2026-08-07', duration:'30', note:'', loggedAt:1786082400218, seed:true},
    {person:'Sab', date:'2026-08-07', duration:'30', note:'', loggedAt:1786082400220, seed:true}
  ],
  Netball: [
    {person:'Ayam', date:'2026-02-02', duration:'30', note:'', loggedAt:1770012000221, seed:true},
    {person:'Ayam', date:'2026-02-07', duration:'30', note:'', loggedAt:1770444000222, seed:true},
    {person:'Ayam', date:'2026-02-12', duration:'30', note:'', loggedAt:1770876000223, seed:true},
    {person:'Ayam', date:'2026-02-17', duration:'30', note:'', loggedAt:1771308000224, seed:true},
    {person:'Ayam', date:'2026-03-02', duration:'30', note:'', loggedAt:1772431200225, seed:true},
    {person:'Ayam', date:'2026-03-07', duration:'30', note:'', loggedAt:1772863200226, seed:true},
    {person:'Ayam', date:'2026-03-12', duration:'30', note:'', loggedAt:1773295200227, seed:true},
    {person:'Ayam', date:'2026-04-02', duration:'30', note:'', loggedAt:1775109600228, seed:true},
    {person:'Ayam', date:'2026-04-07', duration:'30', note:'', loggedAt:1775541600229, seed:true},
    {person:'Ayam', date:'2026-04-12', duration:'30', note:'', loggedAt:1775973600230, seed:true},
    {person:'Ayam', date:'2026-05-02', duration:'30', note:'', loggedAt:1777701600231, seed:true},
    {person:'Ayam', date:'2026-05-07', duration:'30', note:'', loggedAt:1778133600232, seed:true},
    {person:'Ayam', date:'2026-05-12', duration:'30', note:'', loggedAt:1778565600233, seed:true},
    {person:'Ayam', date:'2026-05-17', duration:'30', note:'', loggedAt:1778997600234, seed:true},
    {person:'Ayam', date:'2026-05-22', duration:'30', note:'', loggedAt:1779429600235, seed:true},
    {person:'Ayam', date:'2026-06-02', duration:'30', note:'', loggedAt:1780380000236, seed:true},
    {person:'Ayam', date:'2026-06-06', duration:'30', note:'', loggedAt:1780725600242, seed:true},
    {person:'Ayam', date:'2026-06-07', duration:'30', note:'', loggedAt:1780812000237, seed:true},
    {person:'Ayam', date:'2026-06-11', duration:'30', note:'', loggedAt:1781157600243, seed:true},
    {person:'Ayam', date:'2026-06-12', duration:'30', note:'', loggedAt:1781244000238, seed:true},
    {person:'Ayam', date:'2026-06-16', duration:'30', note:'', loggedAt:1781589600244, seed:true},
    {person:'Ayam', date:'2026-06-17', duration:'30', note:'', loggedAt:1781676000239, seed:true},
    {person:'Ayam', date:'2026-06-22', duration:'30', note:'', loggedAt:1782108000240, seed:true},
    {person:'Ayam', date:'2026-06-27', duration:'30', note:'', loggedAt:1782540000241, seed:true},
    {person:'Ayam', date:'2026-07-02', duration:'30', note:'', loggedAt:1782972000245, seed:true},
    {person:'Ayam', date:'2026-07-07', duration:'30', note:'', loggedAt:1783404000246, seed:true},
    {person:'Ayam', date:'2026-08-02', duration:'30', note:'', loggedAt:1785650400247, seed:true}
  ],
  Running: [
    {person:'Papai', date:'2026-01-02', duration:'30', note:'', loggedAt:1767333600248, seed:true},
    {person:'Ayam', date:'2026-01-02', duration:'30', note:'', loggedAt:1767333600255, seed:true},
    {person:'Sab', date:'2026-01-02', duration:'30', note:'', loggedAt:1767333600265, seed:true},
    {person:'Papai', date:'2026-01-06', duration:'30', note:'', loggedAt:1767679200254, seed:true},
    {person:'Ayam', date:'2026-01-06', duration:'30', note:'', loggedAt:1767679200261, seed:true},
    {person:'Sab', date:'2026-01-06', duration:'30', note:'', loggedAt:1767679200271, seed:true},
    {person:'Papai', date:'2026-01-07', duration:'30', note:'', loggedAt:1767765600249, seed:true},
    {person:'Ayam', date:'2026-01-07', duration:'30', note:'', loggedAt:1767765600256, seed:true},
    {person:'Sab', date:'2026-01-07', duration:'30', note:'', loggedAt:1767765600266, seed:true},
    {person:'Ayam', date:'2026-01-11', duration:'30', note:'', loggedAt:1768111200262, seed:true},
    {person:'Papai', date:'2026-01-12', duration:'30', note:'', loggedAt:1768197600250, seed:true},
    {person:'Ayam', date:'2026-01-12', duration:'30', note:'', loggedAt:1768197600257, seed:true},
    {person:'Sab', date:'2026-01-12', duration:'30', note:'', loggedAt:1768197600267, seed:true},
    {person:'Ayam', date:'2026-01-16', duration:'30', note:'', loggedAt:1768543200263, seed:true},
    {person:'Papai', date:'2026-01-17', duration:'30', note:'', loggedAt:1768629600251, seed:true},
    {person:'Ayam', date:'2026-01-17', duration:'30', note:'', loggedAt:1768629600258, seed:true},
    {person:'Sab', date:'2026-01-17', duration:'30', note:'', loggedAt:1768629600268, seed:true},
    {person:'Ayam', date:'2026-01-21', duration:'30', note:'', loggedAt:1768975200264, seed:true},
    {person:'Papai', date:'2026-01-22', duration:'30', note:'', loggedAt:1769061600252, seed:true},
    {person:'Ayam', date:'2026-01-22', duration:'30', note:'', loggedAt:1769061600259, seed:true},
    {person:'Sab', date:'2026-01-22', duration:'30', note:'', loggedAt:1769061600269, seed:true},
    {person:'Papai', date:'2026-01-27', duration:'30', note:'', loggedAt:1769493600253, seed:true},
    {person:'Ayam', date:'2026-01-27', duration:'30', note:'', loggedAt:1769493600260, seed:true},
    {person:'Sab', date:'2026-01-27', duration:'30', note:'', loggedAt:1769493600270, seed:true},
    {person:'Ayam', date:'2026-02-02', duration:'30', note:'', loggedAt:1770012000272, seed:true},
    {person:'Ayam', date:'2026-03-02', duration:'30', note:'', loggedAt:1772431200273, seed:true}
  ],
  Tennis: [
    {person:'Papai', date:'2026-03-02', duration:'30', note:'', loggedAt:1772431200274, seed:true},
    {person:'Ayam', date:'2026-03-02', duration:'30', note:'', loggedAt:1772431200275, seed:true},
    {person:'Sab', date:'2026-03-02', duration:'30', note:'', loggedAt:1772431200276, seed:true},
    {person:'Papai', date:'2026-04-02', duration:'30', note:'', loggedAt:1775109600277, seed:true},
    {person:'Ayam', date:'2026-04-02', duration:'30', note:'', loggedAt:1775109600278, seed:true},
    {person:'Sab', date:'2026-04-02', duration:'30', note:'', loggedAt:1775109600279, seed:true},
    {person:'Papai', date:'2026-06-02', duration:'30', note:'', loggedAt:1780380000280, seed:true},
    {person:'Ayam', date:'2026-06-02', duration:'30', note:'', loggedAt:1780380000282, seed:true},
    {person:'Sab', date:'2026-06-02', duration:'30', note:'', loggedAt:1780380000284, seed:true},
    {person:'Papai', date:'2026-06-07', duration:'30', note:'', loggedAt:1780812000281, seed:true},
    {person:'Ayam', date:'2026-06-07', duration:'30', note:'', loggedAt:1780812000283, seed:true},
    {person:'Sab', date:'2026-06-07', duration:'30', note:'', loggedAt:1780812000285, seed:true},
    {person:'Papai', date:'2026-08-02', duration:'30', note:'', loggedAt:1785650400286, seed:true},
    {person:'Ayam', date:'2026-08-02', duration:'30', note:'', loggedAt:1785650400289, seed:true},
    {person:'Sab', date:'2026-08-02', duration:'30', note:'', loggedAt:1785650400292, seed:true},
    {person:'Papai', date:'2026-08-07', duration:'30', note:'', loggedAt:1786082400287, seed:true},
    {person:'Ayam', date:'2026-08-07', duration:'30', note:'', loggedAt:1786082400290, seed:true},
    {person:'Sab', date:'2026-08-07', duration:'30', note:'', loggedAt:1786082400293, seed:true},
    {person:'Papai', date:'2026-08-12', duration:'30', note:'', loggedAt:1786514400288, seed:true},
    {person:'Ayam', date:'2026-08-12', duration:'30', note:'', loggedAt:1786514400291, seed:true},
    {person:'Sab', date:'2026-08-12', duration:'30', note:'', loggedAt:1786514400294, seed:true}
  ],
  Football: [
    {person:'Ayam', date:'2026-02-02', duration:'30', note:'', loggedAt:1770012000295, seed:true}
  ],
  Others: [
    {person:'Sab', date:'2026-04-02', duration:'30', sport:'Skiing', note:'', loggedAt:1775109600296, seed:true},
    {person:'Sab', date:'2026-04-07', duration:'30', sport:'Skiing', note:'', loggedAt:1775541600297, seed:true},
    {person:'Sab', date:'2026-04-12', duration:'30', sport:'Skiing', note:'', loggedAt:1775973600298, seed:true},
    {person:'Sab', date:'2026-04-17', duration:'30', sport:'Skiing', note:'', loggedAt:1776405600299, seed:true},
    {person:'Sab', date:'2026-04-22', duration:'30', sport:'Skiing', note:'', loggedAt:1776837600300, seed:true},
    {person:'Ayam', date:'2026-06-02', duration:'30', sport:'Sports day', note:'', loggedAt:1780380000303, seed:true},
    {person:'Sab', date:'2026-06-02', duration:'30', sport:'Sports day', note:'', loggedAt:1780380000304, seed:true}
  ],
  Rounders: [
    {person:'Ayam', date:'2026-05-02', duration:'30', note:'', loggedAt:1777701600301, seed:true},
    {person:'Ayam', date:'2026-05-07', duration:'30', note:'', loggedAt:1778133600302, seed:true}
  ],
  Walking: [
    {person:'Papai', date:'2026-06-02', duration:'30', note:'', loggedAt:1780380000305, seed:true},
    {person:'Ayam', date:'2026-06-02', duration:'30', note:'', loggedAt:1780380000307, seed:true},
    {person:'Sab', date:'2026-06-02', duration:'30', note:'', loggedAt:1780380000309, seed:true},
    {person:'Papai', date:'2026-06-07', duration:'30', note:'', loggedAt:1780812000306, seed:true},
    {person:'Ayam', date:'2026-06-07', duration:'30', note:'', loggedAt:1780812000308, seed:true},
    {person:'Sab', date:'2026-06-07', duration:'30', note:'', loggedAt:1780812000310, seed:true}
  ],
};

function getActivityLogs(activityName){
  let stored = [];
  try{ stored = JSON.parse(localStorage.getItem('ff_log_'+activityName)||'[]'); }catch(e){}
  const seed = SEED_LOGS[activityName] || [];
  const removed = (()=>{ try{ return JSON.parse(localStorage.getItem('ff_seed_removed_'+activityName)||'[]'); }catch(e){ return []; } })();
  const ids = new Set(stored.map(l=>l.loggedAt));
  const seedKept = seed.filter(s=>!ids.has(s.loggedAt) && !removed.includes(s.loggedAt));
  return [...stored, ...seedKept];
}

function getFamilyPoints(){
  const today = new Date('2026-08-13');
  const weekStart = new Date(today); weekStart.setDate(today.getDate()-((today.getDay()+6)%7)); weekStart.setHours(0,0,0,0);
  const points = {};
  FAMILY.forEach(f=>{ points[f.name] = {weekPts:0,monthPts:0,allPts:0}; });
  ACTIVITIES.forEach(a=>{
    getActivityLogs(a.name).forEach(l=>{
      if(!points[l.person]) return;
      const d = new Date(l.date);
      if(isNaN(d)) return;
      const pts = 1;
      points[l.person].allPts += pts;
      if(d.getFullYear()===today.getFullYear() && d.getMonth()===today.getMonth()) points[l.person].monthPts += pts;
      if(d>=weekStart && d<=today) points[l.person].weekPts += pts;
    });
  });
  return points;
}

function Reveal({children,className}){
  const ref = React.useRef(null);
  const [vis,setVis] = React.useState(false);
  React.useEffect(()=>{
    const el = ref.current;
    if(!el) return;
    const io = new IntersectionObserver(([e])=>{if(e.isIntersecting){setVis(true);io.disconnect();}},{threshold:0,rootMargin:'0px 0px 100px 0px'});
    io.observe(el);
    return ()=>io.disconnect();
  },[]);
  return <div ref={ref} className={"reveal"+(vis?" in":"")+(className?" "+className:"")}>{children}</div>;
}

function SiteHeader({active}){
  const [open,setOpen] = React.useState(false);
  const [loggedIn,setLoggedIn] = React.useState(()=>sessionStorage.getItem('ff_logged_in')==='1');
  const [confirmOpen,setConfirmOpen] = React.useState(false);
  const links = [['Home','index.html'],['About','about.html'],['Activities','activities.html'],['Leaderboard','leaderboard.html']];
  function handleCta(){
    if(loggedIn){ setConfirmOpen(true); setOpen(false); }
    else window.location.href='login.html';
  }
  function confirmLogout(){
    sessionStorage.removeItem('ff_logged_in');
    setLoggedIn(false);
    setConfirmOpen(false);
    window.location.href='index.html';
  }
  return (
    <header className="site-header">
      <div className="site-header-inner">
        <a href="index.html" className="site-logo"><img src="logo-footprints.png" alt="" className="site-logo-icon" />Family ExercisE Tournament</a>
        <nav className="site-nav-desktop">
          {links.map(([label,href])=>(
            <a key={label} href={href} className={"site-nav-link"+(active===label?" active":"")}>{label}</a>
          ))}
        </nav>
        <div className="site-header-cta"><Button variant="primary" size="sm" onClick={handleCta}>{loggedIn?'Log out':'Log in'}</Button></div>
        <button className="site-menu-btn" aria-label={open?"Close menu":"Open menu"} aria-expanded={open} onClick={()=>setOpen(!open)}>
          <i className={open?"ph ph-x":"ph ph-list"}></i>
        </button>
      </div>
      <div className={"site-nav-mobile"+(open?" open":"")}>
        <div className="site-nav-mobile-inner">
          {links.map(([label,href])=>(
            <a key={label} href={href} className={"site-nav-mobile-link"+(active===label?" active":"")} onClick={()=>setOpen(false)}>{label}</a>
          ))}
          <div style={{marginTop:8}}><Button variant="primary" onClick={handleCta}>{loggedIn?'Log out':'Log in'}</Button></div>
        </div>
      </div>
      {confirmOpen && (
        <div className="logout-scrim" onClick={()=>setConfirmOpen(false)}>
          <div className="logout-modal" onClick={e=>e.stopPropagation()}>
            <h3>Log out</h3>
            <p>Are you sure you want to log out?</p>
            <div className="logout-modal-actions">
              <Button variant="secondary" onClick={()=>setConfirmOpen(false)}>Cancel</Button>
              <Button variant="primary" onClick={confirmLogout}>Log out</Button>
            </div>
          </div>
        </div>
      )}
    </header>
  );
}

function SiteFooter(){
  return (
    <footer className="site-footer">
      <div className="site-footer-inner">
        <div>
          <div className="site-footer-logo"><img src="logo-footprints.png" alt="" className="site-footer-logo-icon" />Family Exercise Tournament</div>
          <p className="site-footer-desc">Helping families in Chester and beyond stay active together.</p>
        </div>
        <div className="site-footer-cols">
          <div>
            <div className="site-footer-heading">Explore</div>
            <a href="index.html">Home</a>
            <a href="about.html">About</a>
            <a href="activities.html">Activities</a>
            <a href="leaderboard.html">Leaderboard</a>
          </div>
          <div>
            <div className="site-footer-heading"></div>
            <a href="mailto:hello@familyfit.example"></a>
            <span className="site-footer-text"></span>
          </div>
        </div>
      </div>
      <div className="site-footer-bottom">© 2026 Family Fit. All rights reserved.</div>
    </footer>
  );
}

function getFamilyWeeklyStats(){
  const today = new Date('2026-08-13');
  const weekStart = new Date(today); weekStart.setDate(today.getDate()-((today.getDay()+6)%7)); weekStart.setHours(0,0,0,0);
  let totalMinutes = 0, count = 0;
  const days = new Set();
  ACTIVITIES.forEach(a=>{
    getActivityLogs(a.name).forEach(l=>{
      const d = new Date(l.date);
      if(isNaN(d)) return;
      days.add(d.toISOString().slice(0,10));
      if(d>=weekStart && d<=today){
        count++;
        if(l.duration) totalMinutes += parseInt(l.duration)||0;
      }
    });
  });
  let streak = 0;
  let cursor = new Date(today);
  while(days.has(cursor.toISOString().slice(0,10))){
    streak++;
    cursor.setDate(cursor.getDate()-1);
  }
  const h = Math.floor(totalMinutes/60), m = totalMinutes%60;
  return { activityLabel: totalMinutes>0 ? `${h}h ${m}m` : '0m', count, streak };
}

window.FamilyFitShared = { FAMILY, ACTIVITIES, Reveal, SiteHeader, SiteFooter, ActivityIconBadge, getFamilyPoints, getFamilyWeeklyStats, getActivityLogs, SEED_LOGS };
