/* SportK — Datos: 4 tracks clínicos, ejercicios cuantificados con investigación.
   Cada ejercicio declara `type` (que el engine convierte en segmentos) y `reps`.
   `reverseEvery: N` intercala un Kegel inverso anti-hipertonía cada N reps.
   Base clínica: ratio 70/30 fibras Tipo I/II, holds 3-5s,
   flicks <1s, MTCK 8 sem, PRM 3 meses, conos 20-70g→90g, IELT/EHS hombres.
*/

// ---------- Helper i18n ----------
// Crea un mapa { es, en, it, de, fr } compacto para campos multilingües.
function mlang(es, en, it, de, fr) {
  return { es, en, it, de, fr };
}

// ---------- Tracks ----------
const TRACKS = {
  "general-strength": {
    id: "general-strength",
    name: mlang("Fuerza general", "General strength", "Forza generale", "Allgemeine Kraft", "Force générale"),
    audience: "all",
    blurb: mlang(
      "Tono base. Combina holds (aguante) y flicks (reflejo).",
      "Base tone. Combines holds (endurance) and flicks (reflex).",
      "Tono base. Combina hold (resistenza) e flick (riflesso).",
      "Grundtonus. Kombiniert Halten (Ausdauer) und Flicks (Reflex).",
      "Tonus de base. Combine tenues (endurance) et flicks (réflexe)."
    ),
    primaryGoal: "strength",
    color: "var(--accent)",
  },
  "male-sexual": {
    id: "male-sexual",
    name: mlang("Salud sexual masculina", "Male sexual health", "Salute sessuale maschile", "Männliche Sexualgesundheit", "Santé sexuelle masculine"),
    audience: "male",
    blurb: mlang(
      "Erección, durabilidad, control eyaculatorio y edging. Basado en MTCK + PRM.",
      "Erection, stamina, ejaculatory control and edging. Based on MTCK + PRM.",
      "Erezione, resistenza, controllo eiaculatorio ed edging. Basato su MTCK + PRM.",
      "Erektion, Ausdauer, Ejakulationskontrolle und Edging. Basierend auf MTCK + PRM.",
      "Érection, endurance, contrôle éjaculatoire et edging. Basé sur MTCK + PRM."
    ),
    primaryGoal: "ielt",
    color: "oklch(0.65 0.18 28)",
  },
  "incontinence-knack": {
    id: "incontinence-knack",
    name: mlang("Continencia · The Knack", "Continence · The Knack", "Continenza · The Knack", "Kontinenz · The Knack", "Continence · The Knack"),
    audience: "all",
    blurb: mlang(
      "Reflejo anticipatorio antes de toser/estornudar. 8× cura sintomática vs control.",
      "Anticipatory reflex before coughing/sneezing. 8× symptomatic cure vs control.",
      "Riflesso anticipatorio prima di tossire/starnutire. 8× guarigione sintomatica vs controllo.",
      "Antizipatorischer Reflex vor Husten/Niesen. 8× symptomatische Heilung vs. Kontrolle.",
      "Réflexe anticipatoire avant tousser/éternuer. 8× guérison symptomatique vs contrôle."
    ),
    primaryGoal: "incontinence",
    color: "oklch(0.68 0.14 220)",
  },
  "female-postpartum-sexual": {
    id: "female-postpartum-sexual",
    name: mlang("Post-parto y función sexual", "Postpartum & sexual function", "Post-parto e funzione sessuale", "Postpartal und Sexualfunktion", "Post-partum et fonction sexuelle"),
    audience: "female",
    blurb: mlang(
      "Reactivación, conos vaginales, ondas Pompoir y reverse Kegels obligatorios.",
      "Reactivation, vaginal cones, Pompoir waves and mandatory reverse Kegels.",
      "Riattivazione, coni vaginali, onde Pompoir e reverse Kegel obbligatori.",
      "Reaktivierung, Vaginalkonen, Pompoir-Wellen und obligatorische Reverse-Kegels.",
      "Réactivation, cônes vaginaux, ondes Pompoir et reverse Kegels obligatoires."
    ),
    primaryGoal: "orgasmic",
    color: "oklch(0.7 0.16 340)",
  },
};

const TRACK_LIST = Object.values(TRACKS);

// ---------- Goals (objetivos personales) ----------
const GOALS = [
  { id: "strength", track: "general-strength",
    label: mlang("Fuerza general", "General strength", "Forza generale", "Allgemeine Kraft", "Force générale") },
  { id: "erection", track: "male-sexual",
    label: mlang("Mejorar erección", "Improve erection", "Migliorare erezione", "Erektion verbessern", "Améliorer l'érection") },
  { id: "ielt", track: "male-sexual",
    label: mlang("Durar más (control eyaculatorio)", "Last longer (ejaculatory control)", "Durare di più (controllo eiaculatorio)", "Länger durchhalten (Ejakulationskontrolle)", "Durer plus longtemps (contrôle éjaculatoire)") },
  { id: "edging", track: "male-sexual",
    label: mlang("Control sexual avanzado / edging", "Advanced sexual control / edging", "Controllo sessuale avanzato / edging", "Fortgeschrittene sexuelle Kontrolle / Edging", "Contrôle sexuel avancé / edging") },
  { id: "incontinence", track: "incontinence-knack",
    label: mlang("Incontinencia / escapes", "Incontinence / leaks", "Incontinenza / perdite", "Inkontinenz / Verluste", "Incontinence / fuites") },
  { id: "postpartum", track: "female-postpartum-sexual",
    label: mlang("Recuperación post-parto", "Postpartum recovery", "Recupero post-parto", "Postpartale Erholung", "Récupération post-partum") },
  { id: "orgasmic", track: "female-postpartum-sexual",
    label: mlang("Función sexual femenina (orgasmo, Pompoir)", "Female sexual function (orgasm, Pompoir)", "Funzione sessuale femminile (orgasmo, Pompoir)", "Weibliche Sexualfunktion (Orgasmus, Pompoir)", "Fonction sexuelle féminine (orgasme, Pompoir)") },
];

// ---------- Ejercicios reutilizables (factories) ----------

function exStandard(id, name, reps, holdSec, restSec, instruction, extras = {}) {
  return { id, name, type: "standard", reps, holdSec, restSec, instruction, ...extras };
}

function exFlick(id, name, reps, instruction, params = {}, extras = {}) {
  return { id, name, type: "flick", reps, params: { onMs: 400, offMs: 600, ...params }, instruction, ...extras };
}

function exLadder(id, name, reps, instruction, params = {}, extras = {}) {
  return { id, name, type: "ladder", reps, params: { startSec: 2, maxSec: 8, restSec: 4, ...params }, instruction, ...extras };
}

function exElevator(id, name, reps, instruction, params = {}, extras = {}) {
  return { id, name, type: "elevator", reps, params: { stepHoldMs: 1800, restMs: 5000, ...params }, instruction, ...extras };
}

function exWave(id, name, reps, instruction, params = {}, extras = {}) {
  return { id, name, type: "wave", reps, params: { segMs: 800, restMs: 3500, ...params }, instruction, ...extras };
}

function exKnack(id, name, reps, instruction, params = {}, extras = {}) {
  return { id, name, type: "knack", reps, params: { anticipateMs: 800, holdMs: 1500, restMs: 5000, ...params }, instruction, ...extras };
}

function exEdging(id, name, reps, holdSec, instruction, params = {}, extras = {}) {
  return { id, name, type: "edging-hold", reps, params: { holdSec, restSec: 15, ...params }, instruction, ...extras };
}

// Edge SIN hold (squeeze technique de Masters & Johnson): squeeze breve y firme,
// release inmediato, sin sostener. Entrena el reflejo de freno, no la endurance muscular.
function exEdge(id, name, reps, instruction, params = {}, extras = {}) {
  return { id, name, type: "edge", reps, params: { squeezeMs: 2000, ...params }, instruction, ...extras };
}

function exReverse(id, name, reps, instruction, extras = {}) {
  return { id, name, type: "reverse", reps, instruction, ...extras };
}

// ---------- Catálogo de rutinas ----------

const PRESET_ROUTINES = [
  // ============ GENERAL · BEGINNER ============
  {
    id: "gen-beg-1", track: "general-strength", audience: "all", level: "beginner",
    durationMin: 5, goal: "strength",
    name: mlang("Despertar Pélvico", "Pelvic Wake-up", "Risveglio Pelvico", "Beckenboden-Wake-up", "Réveil pelvien"),
    description: mlang(
      "Tu primera toma de contacto. Aprende a aislar el suelo pélvico sin tensar abdomen, glúteos ni muslos. Respira: exhala al contraer.",
      "Your first contact. Learn to isolate the pelvic floor without tensing abs, glutes or thighs. Breathe: exhale on contraction.",
      "Il tuo primo contatto. Impara a isolare il pavimento pelvico senza tendere addome, glutei o cosce. Respira: espira contraendo.",
      "Dein erster Kontakt. Lerne, den Beckenboden zu isolieren, ohne Bauch, Gesäß oder Oberschenkel anzuspannen. Atme: beim Anspannen ausatmen.",
      "Ton premier contact. Apprends à isoler le plancher pelvien sans tendre abdos, fessiers ni cuisses. Respire : expire en contractant."
    ),
    exercises: [
      exStandard("gb1-id",
        mlang("Identificación", "Identification", "Identificazione", "Identifizierung", "Identification"),
        5, 3, 5,
        mlang("Cierra como si frenaras la orina. Siente la elevación, no el pujo. Sin glúteos.", "Close as if stopping urine. Feel the lift, not the push. No glutes.", "Chiudi come se trattenessi la pipì. Senti il sollevamento, non la spinta. Senza glutei.", "Schließe, als würdest du den Urin anhalten. Spüre das Heben, nicht das Pressen. Kein Gesäß.", "Ferme comme pour arrêter l'urine. Sens l'élévation, pas la poussée. Sans fessiers.")),
      exFlick("gb1-fk",
        mlang("Flicks suaves", "Soft flicks", "Flick morbidi", "Sanfte Flicks", "Flicks doux"),
        8,
        mlang("Pulsos rápidos y limpios. Aprieta y suelta del todo.", "Quick clean pulses. Squeeze and release fully.", "Impulsi rapidi e puliti. Stringi e rilascia completamente.", "Schnelle saubere Pulse. Anspannen und vollständig loslassen.", "Impulsions rapides et nettes. Serre et relâche totalement."),
        { onMs: 500, offMs: 800 }),
      exStandard("gb1-rs",
        mlang("Respiración guiada", "Guided breathing", "Respirazione guidata", "Geführte Atmung", "Respiration guidée"),
        6, 4, 4,
        mlang("Inhala (relaja) — Exhala (contrae). Sin apnea.", "Inhale (relax) — Exhale (contract). No breath holding.", "Inspira (rilassa) — Espira (contrai). Senza apnea.", "Einatmen (entspannen) — Ausatmen (anspannen). Kein Luftanhalten.", "Inspire (relâche) — Expire (contracte). Sans apnée.")),
    ],
  },
  {
    id: "gen-beg-2", track: "general-strength", audience: "all", level: "beginner",
    durationMin: 6, goal: "strength",
    name: mlang("Holds + Flicks", "Holds + Flicks", "Hold + Flick", "Holds + Flicks", "Holds + Flicks"),
    description: mlang(
      "Combina holds 3-5s (aguante) y flicks rápidos (reflejo). Patrón base validado en clínica para entrenar fuerza y respuesta refleja del suelo pélvico.",
      "Combines 3-5s holds (endurance) and quick flicks (reflex). Clinically validated baseline for strength and reflex response of the pelvic floor.",
      "Combina hold 3-5s (resistenza) e flick rapidi (riflesso). Pattern base validato clinicamente per allenare forza e risposta riflessa del pavimento pelvico.",
      "Kombiniert 3-5s-Halten (Ausdauer) und schnelle Flicks (Reflex). Klinisch validiertes Grundmuster für Beckenboden-Kraft und -Reflex.",
      "Combine tenues 3-5s (endurance) et flicks rapides (réflexe). Pattern de base validé cliniquement pour la force et la réponse réflexe du plancher pelvien."
    ),
    exercises: [
      exFlick("gb2-fk",
        mlang("10 flicks", "10 flicks", "10 flick", "10 Flicks", "10 flicks"),
        10,
        mlang("Rápido y completo. Suelta del todo entre cada uno.", "Fast and full. Fully release between each one.", "Veloce e completo. Rilascia del tutto tra uno e l'altro.", "Schnell und vollständig. Zwischen den Pulsen ganz loslassen.", "Rapide et complet. Relâche entièrement entre chaque.")),
      exStandard("gb2-st",
        mlang("10 holds 3s", "10 holds 3s", "10 hold 3s", "10 Halten 3s", "10 holds 3s"),
        10, 3, 4,
        mlang("Aprieta firme 3s, suelta lento.", "Squeeze firm 3s, release slowly.", "Stringi forte 3s, rilascia lentamente.", "3s fest anspannen, langsam loslassen.", "Serre fort 3s, relâche lentement.")),
      exStandard("gb2-st2",
        mlang("10 holds 5s", "10 holds 5s", "10 hold 5s", "10 Halten 5s", "10 holds 5s"),
        10, 5, 5,
        mlang("Sube duración. Si tiemblas, baja intensidad.", "Increase duration. If you tremble, lower intensity.", "Aumenta durata. Se tremi, abbassa l'intensità.", "Dauer erhöhen. Bei Zittern Intensität reduzieren.", "Augmente la durée. Si tu trembles, baisse l'intensité.")),
    ],
  },

  // ============ GENERAL · INTERMEDIATE ============
  {
    id: "gen-int-1", track: "general-strength", audience: "all", level: "intermediate",
    durationMin: 9, goal: "strength",
    name: mlang("Tonificación Diaria", "Daily Toning", "Tonificazione Quotidiana", "Tägliche Tonisierung", "Tonification quotidienne"),
    description: mlang(
      "Rutina de mantenimiento que mezcla resistencia, velocidad y un Kegel inverso cada 5 reps para evitar hipertonía.",
      "Maintenance routine mixing endurance, speed and a reverse Kegel every 5 reps to prevent hypertonia.",
      "Routine di mantenimento che combina resistenza, velocità e un Kegel inverso ogni 5 rip per evitare ipertonia.",
      "Erhaltungsroutine mit Ausdauer, Tempo und einem Reverse-Kegel alle 5 Wdh. zur Hypertonie-Prävention.",
      "Routine d'entretien mêlant endurance, vitesse et un Kegel inversé toutes les 5 reps pour éviter l'hypertonie."
    ),
    exercises: [
      exStandard("gi1-st",
        mlang("Holds 6s", "Holds 6s", "Hold 6s", "Halten 6s", "Holds 6s"),
        10, 6, 6,
        mlang("Sostén firme sin contener respiración.", "Hold firm without holding breath.", "Tieni saldo senza trattenere il respiro.", "Fest halten, ohne den Atem anzuhalten.", "Tiens ferme sans bloquer la respiration."),
        { reverseEvery: 5 }),
      exFlick("gi1-fk",
        mlang("Flicks rápidos", "Quick flicks", "Flick rapidi", "Schnelle Flicks", "Flicks rapides"),
        15,
        mlang("Velocidad y limpieza.", "Speed and cleanliness.", "Velocità e pulizia.", "Tempo und Sauberkeit.", "Vitesse et propreté.")),
      exLadder("gi1-ld",
        mlang("Escalera 2→6s", "Ladder 2→6s", "Scala 2→6s", "Leiter 2→6s", "Échelle 2→6s"),
        5,
        mlang("Sube intensidad y duración por peldaño.", "Step up intensity and duration each rung.", "Aumenta intensità e durata per gradino.", "Pro Stufe Intensität und Dauer steigern.", "Augmente intensité et durée à chaque échelon.")),
      exStandard("gi1-st2",
        mlang("Sostén largo", "Long hold", "Tenuta lunga", "Langes Halten", "Tenue longue"),
        8, 8, 6,
        mlang("Activa sin tensar abdomen.", "Activate without tensing abs.", "Attiva senza tendere l'addome.", "Aktivieren, ohne Bauch anzuspannen.", "Active sans tendre les abdos."),
        { reverseEvery: 4 }),
    ],
  },
  {
    id: "gen-int-2", track: "general-strength", audience: "all", level: "intermediate",
    durationMin: 10, goal: "strength",
    name: mlang("Sub-50% Endurance", "Sub-50% Endurance", "Resistenza Sub-50%", "Sub-50% Ausdauer", "Endurance sub-50%"),
    description: mlang(
      "Holds submáximos al 50% MVC durante 30s — patrón funcional para tareas cotidianas con suelo pélvico activo.",
      "Submaximal holds at 50% MVC for 30s — functional pattern for daily tasks with an active pelvic floor.",
      "Hold submassimali al 50% MVC per 30s — pattern funzionale per compiti quotidiani con pavimento pelvico attivo.",
      "Submaximales Halten bei 50% MVC für 30s — funktionales Muster für Alltag mit aktivem Beckenboden.",
      "Tenues sous-maximales à 50% MVC pendant 30s — pattern fonctionnel pour les tâches du quotidien avec plancher pelvien actif."
    ),
    exercises: [
      exStandard("gi2-st",
        mlang("Holds 5s", "Holds 5s", "Hold 5s", "Halten 5s", "Holds 5s"),
        8, 5, 5,
        mlang("Caliente. 100% intensidad.", "Warm-up. 100% intensity.", "Riscaldamento. 100% intensità.", "Aufwärmen. 100% Intensität.", "Échauffement. 100% intensité."),
        { reverseEvery: 5 }),
      exEdging("gi2-ed",
        mlang("30s al 50%", "30s at 50%", "30s al 50%", "30s bei 50%", "30s à 50%"),
        3, 30,
        mlang("Mantén al 50%. No aprietes a tope. Respira 4-7-8.", "Hold at 50%. Don't max out. Breathe 4-7-8.", "Tieni al 50%. Non andare al massimo. Respira 4-7-8.", "Bei 50% halten. Nicht maximal. 4-7-8 atmen.", "Tiens à 50%. Ne pas aller au max. Respire 4-7-8.")),
      exFlick("gi2-fk",
        mlang("Flicks de cierre", "Closing flicks", "Flick di chiusura", "Schluss-Flicks", "Flicks de clôture"),
        20,
        mlang("Cierra cualquier fatiga residual.", "Close any residual fatigue.", "Chiudi ogni residuo di fatica.", "Restmüdigkeit ausgleichen.", "Évacue toute fatigue résiduelle.")),
    ],
  },

  // ============ GENERAL · ADVANCED ============
  {
    id: "gen-adv-1", track: "general-strength", audience: "all", level: "advanced",
    durationMin: 14, goal: "strength",
    name: mlang("Élite Pélvica", "Pelvic Elite", "Élite Pelvica", "Beckenboden-Elite", "Élite Pelvienne"),
    description: mlang(
      "Trabajo denso combinando holds, flicks y elevator de 4 pisos con reverse Kegels intercalados.",
      "Dense work combining holds, flicks and a 4-floor elevator with interleaved reverse Kegels.",
      "Lavoro denso che combina hold, flick ed elevator a 4 piani con reverse Kegel intercalati.",
      "Dichtes Training mit Halten, Flicks und 4-Stockwerk-Elevator mit eingestreuten Reverse-Kegels.",
      "Travail dense combinant tenues, flicks et elevator 4 étages avec reverse Kegels intercalés."
    ),
    exercises: [
      exStandard("ga1-st",
        mlang("Mantén 10s", "Hold 10s", "Tieni 10s", "10s halten", "Tiens 10s"),
        10, 10, 6,
        mlang("10s firmes. Sin compensaciones.", "Firm 10s. No compensations.", "10s fermi. Senza compensi.", "10s fest. Keine Ausweichbewegungen.", "10s fermes. Sans compensations."),
        { reverseEvery: 5 }),
      exFlick("ga1-fk",
        mlang("Pulsos explosivos", "Explosive pulses", "Impulsi esplosivi", "Explosive Pulse", "Impulsions explosives"),
        25,
        mlang("Velocidad máxima, limpieza absoluta.", "Max speed, absolute cleanliness.", "Velocità massima, pulizia assoluta.", "Maximale Geschwindigkeit, absolute Sauberkeit.", "Vitesse max, propreté absolue."),
        { onMs: 350, offMs: 500 }),
      exElevator("ga1-el",
        mlang("Elevator 4 pisos", "Elevator 4 floors", "Elevator 4 piani", "Elevator 4 Stockwerke", "Elevator 4 étages"),
        4,
        mlang("25 → 50 → 75 → 100% y bajada escalonada.", "25 → 50 → 75 → 100% with stepped descent.", "25 → 50 → 75 → 100% e discesa a gradini.", "25 → 50 → 75 → 100% und gestufter Abstieg.", "25 → 50 → 75 → 100% et descente par paliers.")),
      exStandard("ga1-fn",
        mlang("Final 12s", "Final 12s", "Finale 12s", "Finale 12s", "Final 12s"),
        8, 12, 8,
        mlang("Resistencia máxima. Suelta lento.", "Max endurance. Release slowly.", "Resistenza massima. Rilascia lento.", "Maximale Ausdauer. Langsam loslassen.", "Endurance max. Relâche lentement."),
        { reverseEvery: 4 }),
    ],
  },
  {
    id: "gen-adv-2", track: "general-strength", audience: "all", level: "advanced",
    durationMin: 16, goal: "strength",
    name: mlang("Pirámide Total", "Total Pyramid", "Piramide Totale", "Totale Pyramide", "Pyramide totale"),
    description: mlang(
      "Pirámide ascendente con escalera, elevator, edging-hold y bloque dedicado de Kegels inversos.",
      "Ascending pyramid with ladder, elevator, edging-hold and a dedicated reverse Kegel block.",
      "Piramide ascendente con scala, elevator, edging-hold e blocco dedicato di Kegel inversi.",
      "Aufsteigende Pyramide mit Leiter, Elevator, Edging-Hold und Reverse-Kegel-Block.",
      "Pyramide ascendante avec échelle, elevator, edging-hold et bloc dédié de Kegels inversés."
    ),
    exercises: [
      exLadder("ga2-ld",
        mlang("Escalera 2→8s", "Ladder 2→8s", "Scala 2→8s", "Leiter 2→8s", "Échelle 2→8s"),
        7,
        mlang("Cada peldaño +1s, +10% intensidad.", "Each rung +1s, +10% intensity.", "Ogni gradino +1s, +10% intensità.", "Pro Stufe +1s, +10% Intensität.", "Chaque échelon +1s, +10% intensité."),
        { startSec: 2, maxSec: 8 }),
      exElevator("ga2-el",
        mlang("Elevator", "Elevator", "Elevator", "Elevator", "Elevator"),
        3,
        mlang("Domina cada piso.", "Master each floor.", "Domina ogni piano.", "Beherrsche jedes Stockwerk.", "Maîtrise chaque étage.")),
      exEdging("ga2-ed",
        mlang("Edging", "Edging", "Edging", "Edging", "Edging"),
        4, 30,
        mlang("30s al 50%. Respira lento.", "30s at 50%. Breathe slow.", "30s al 50%. Respira lento.", "30s bei 50%. Langsam atmen.", "30s à 50%. Respire lentement.")),
      exReverse("ga2-rv",
        mlang("Bloque reverse", "Reverse block", "Blocco reverse", "Reverse-Block", "Bloc reverse"),
        5,
        mlang("Solo empuje y relajación. Estiramiento del suelo pélvico.", "Just push and relax. Pelvic floor stretching.", "Solo spinta e rilassamento. Stretching del pavimento pelvico.", "Nur Drücken und Entspannen. Beckenboden-Dehnung.", "Juste pousser et relâcher. Étirement du plancher pelvien.")),
    ],
  },
  {
    id: "gen-adv-iron", track: "general-strength", audience: "all", level: "advanced",
    durationMin: 12, goal: "strength",
    name: mlang("Iron", "Iron", "Iron", "Iron", "Iron"),
    description: mlang(
      "Protocolo extremo: holds submáximos progresivos (30s × 3 → 60s × 2 → 120s × 1) intercalados con bombeo de igual duración. Va más allá del rango clínico estándar (3-10s) — usa intensidad submáxima (60-70% MVC) en los holds largos para evitar fatiga lesiva. Si tiemblas o pierdes la contracción, baja el % o vuelve a Élite Pélvica.",
      "Extreme protocol: progressive submaximal holds (30s × 3 → 60s × 2 → 120s × 1) interleaved with matching pumping. Beyond the standard clinical range (3-10s) — use submaximal intensity (60-70% MVC) on long holds to avoid harmful fatigue. If you tremble or lose the contraction, lower the % or return to Pelvic Elite.",
      "Protocollo estremo: hold submassimali progressivi (30s × 3 → 60s × 2 → 120s × 1) alternati a pompaggio della stessa durata. Va oltre il range clinico standard (3-10s) — usa intensità submassimale (60-70% MVC) nei tempi lunghi per evitare fatica lesiva. Se tremi o perdi la contrazione, abbassa il % o torna a Élite Pelvica.",
      "Extremes Protokoll: progressives submaximales Halten (30s × 3 → 60s × 2 → 120s × 1) im Wechsel mit gleichlangem Pumpen. Über den klinischen Standardbereich (3-10s) hinaus — bei langen Halten submaximale Intensität (60-70% MVC) verwenden, um schädliche Ermüdung zu vermeiden. Bei Zittern oder Kontrolllosigkeit % senken oder zur Beckenboden-Elite zurückkehren.",
      "Protocole extrême : tenues sous-maximales progressives (30s × 3 → 60s × 2 → 120s × 1) alternées avec un pompage de même durée. Au-delà de la plage clinique standard (3-10s) — utilise une intensité sous-maximale (60-70% MVC) sur les tenues longues pour éviter une fatigue lésionnelle. Si tu trembles ou perds la contraction, baisse le % ou reviens à Élite Pelvienne."
    ),
    exercises: [
      exStandard("iron-h30", "Hold 30s × 3", 3, 30, 8,
        mlang("3 holds firmes de 30s al 70-80% MVC. Suelta lento entre series. Sin apnea: respira diafragmática.", "3 firm 30s holds at 70-80% MVC. Release slowly between sets. No breath-holding: diaphragmatic breathing.", "3 hold fermi da 30s al 70-80% MVC. Rilascia lento tra serie. Senza apnea: respirazione diaframmatica.", "3 feste 30s-Halten bei 70-80% MVC. Zwischen Sätzen langsam loslassen. Kein Luftanhalten: Zwerchfellatmung.", "3 tenues fermes de 30s à 70-80% MVC. Relâche lent entre séries. Sans apnée : respiration diaphragmatique.")),
      exFlick("iron-b30", mlang("Bombeo 30s", "Pumping 30s", "Pompaggio 30s", "Pumpen 30s", "Pompage 30s"),
        30,
        mlang("30 pulsos limpios al 100%. Aprieta y suelta del todo cada uno. Mantén el ritmo.", "30 clean pulses at 100%. Squeeze and fully release each one. Keep the rhythm.", "30 impulsi puliti al 100%. Stringi e rilascia del tutto ogni volta. Mantieni il ritmo.", "30 saubere Pulse bei 100%. Anspannen und vollständig loslassen. Rhythmus halten.", "30 impulsions nettes à 100%. Serre et relâche totalement chacune. Garde le rythme."),
        { onMs: 500, offMs: 500 }),
      exStandard("iron-h60", "Hold 60s × 2", 2, 60, 12,
        mlang("2 holds de 60s al 60-70% MVC. Submáximo para sostener el minuto entero. Inhala-exhala 4-7-8.", "2 60s holds at 60-70% MVC. Submaximal to sustain the full minute. Breathe 4-7-8.", "2 hold da 60s al 60-70% MVC. Submassimale per sostenere il minuto intero. Respira 4-7-8.", "2 60s-Halten bei 60-70% MVC. Submaximal, um die ganze Minute zu halten. 4-7-8 atmen.", "2 tenues de 60s à 60-70% MVC. Sous-maximal pour tenir la minute entière. Respire 4-7-8.")),
      exFlick("iron-b60", mlang("Bombeo 60s", "Pumping 60s", "Pompaggio 60s", "Pumpen 60s", "Pompage 60s"),
        60,
        mlang("60 pulsos rápidos al 100%. Si el ritmo cae, no compenses con glúteos: baja velocidad y mantén la calidad.", "60 quick pulses at 100%. If rhythm drops, don't compensate with glutes: slow down and keep quality.", "60 impulsi rapidi al 100%. Se il ritmo cala, non compensare coi glutei: rallenta e mantieni la qualità.", "60 schnelle Pulse bei 100%. Bricht der Rhythmus, nicht mit Gesäß kompensieren: langsamer, Qualität halten.", "60 impulsions rapides à 100%. Si le rythme baisse, ne compense pas avec les fessiers : ralentis et garde la qualité."),
        { onMs: 500, offMs: 500 }),
      exStandard("iron-h120", "Hold 120s", 1, 120, 0,
        mlang("El núcleo del Iron: 2 minutos al 50-60% MVC. Respira lento, no aprietes a tope, no contengas aire. Si pierdes la contracción, recógela sin romper la postura.", "The Iron core: 2 minutes at 50-60% MVC. Breathe slow, don't max out, don't hold breath. If you lose the contraction, regain it without breaking posture.", "Il nucleo dell'Iron: 2 minuti al 50-60% MVC. Respira lento, non andare al massimo, non trattenere il fiato. Se perdi la contrazione, recuperala senza rompere la postura.", "Der Iron-Kern: 2 Minuten bei 50-60% MVC. Langsam atmen, nicht maximal, kein Luftanhalten. Bei Kontrollverlust Spannung neu aufbauen, ohne Haltung zu brechen.", "Le cœur de l'Iron : 2 minutes à 50-60% MVC. Respire lentement, ne va pas au max, ne bloque pas la respiration. Si tu perds la contraction, reprends-la sans casser la posture.")),
      exFlick("iron-b120", mlang("Bombeo 120s", "Pumping 120s", "Pompaggio 120s", "Pumpen 120s", "Pompage 120s"),
        120,
        mlang("Cierre Iron: 120 pulsos. Completa hasta el final aunque tiembles. Esto consolida la fatiga adaptativa de Tipo I y II.", "Iron finisher: 120 pulses. Complete to the end even if trembling. This consolidates adaptive fatigue of Type I and II fibers.", "Chiusura Iron: 120 impulsi. Completa fino in fondo anche se tremi. Consolida la fatica adattiva delle fibre I e II.", "Iron-Finish: 120 Pulse. Bis zum Ende durchziehen, auch bei Zittern. Konsolidiert adaptive Ermüdung Typ I & II.", "Clôture Iron : 120 impulsions. Termine jusqu'au bout même en tremblant. Consolide la fatigue adaptative des fibres I et II."),
        { onMs: 500, offMs: 500 }),
    ],
  },

  // ============ MALE-SEXUAL · BEGINNER ============
  {
    id: "male-beg-1", track: "male-sexual", audience: "male", level: "beginner",
    durationMin: 6, goal: "strength",
    name: mlang("Localización Masculina", "Male Localization", "Localizzazione Maschile", "Männliche Lokalisierung", "Localisation masculine"),
    description: mlang(
      "Aprende a contraer correctamente: la base del pene se retrae, los testículos ascienden. NO aprietes glúteos.",
      "Learn to contract correctly: the base of the penis retracts, testicles rise. Do NOT clench glutes.",
      "Impara a contrarre correttamente: la base del pene si ritrae, i testicoli salgono. NON stringere i glutei.",
      "Lerne richtig anzuspannen: Die Penisbasis zieht sich zurück, Hoden heben sich. KEIN Gesäßanspannen.",
      "Apprends à contracter correctement : la base du pénis se rétracte, les testicules montent. NE serre PAS les fessiers."
    ),
    exercises: [
      exStandard("mb1-id",
        mlang("Identificación", "Identification", "Identificazione", "Identifizierung", "Identification"),
        6, 3, 5,
        mlang("Frente al espejo: base del pene retrocede, testículos suben.", "In front of the mirror: base of the penis retracts, testicles rise.", "Davanti allo specchio: base del pene arretra, testicoli salgono.", "Vor dem Spiegel: Penisbasis zieht zurück, Hoden steigen.", "Devant le miroir : la base du pénis recule, les testicules montent.")),
      exStandard("mb1-st",
        mlang("Contracción básica", "Basic contraction", "Contrazione di base", "Grundkontraktion", "Contraction de base"),
        8, 4, 5,
        mlang("Sin glúteos, sin abdomen.", "No glutes, no abs.", "Niente glutei, niente addome.", "Kein Gesäß, kein Bauch.", "Sans fessiers, sans abdos.")),
      exStandard("mb1-rs",
        mlang("Coordinación respiratoria", "Breath coordination", "Coordinazione respiratoria", "Atemkoordination", "Coordination respiratoire"),
        6, 4, 4,
        mlang("Exhala al contraer, inhala al relajar.", "Exhale on contraction, inhale on release.", "Espira contraendo, inspira rilassando.", "Beim Anspannen ausatmen, beim Entspannen einatmen.", "Expire en contractant, inspire en relâchant.")),
    ],
  },
  {
    id: "male-beg-2", track: "male-sexual", audience: "male", level: "beginner",
    durationMin: 7, goal: "erection",
    name: mlang("Base 3×10", "Base 3×10", "Base 3×10", "Basis 3×10", "Base 3×10"),
    description: mlang(
      "Protocolo Mayo Clinic: 3×10 holds de 3-5s. Hazlo 3 veces al día durante las primeras 2 semanas.",
      "Mayo Clinic protocol: 3×10 holds of 3-5s. Do it 3 times a day during the first 2 weeks.",
      "Protocollo Mayo Clinic: 3×10 hold di 3-5s. Fallo 3 volte al giorno per le prime 2 settimane.",
      "Mayo-Clinic-Protokoll: 3×10 Halten von 3-5s. 3-mal täglich in den ersten 2 Wochen.",
      "Protocole Mayo Clinic : 3×10 tenues de 3-5s. À faire 3 fois par jour les 2 premières semaines."
    ),
    exercises: [
      exStandard("mb2-s1",
        mlang("Serie 1 · 3s", "Set 1 · 3s", "Serie 1 · 3s", "Satz 1 · 3s", "Série 1 · 3s"),
        10, 3, 5,
        mlang("Activa firme. Identifica el ascenso testicular.", "Activate firm. Identify the testicular rise.", "Attiva con decisione. Identifica la salita testicolare.", "Fest aktivieren. Hoden-Anhebung erkennen.", "Active fermement. Identifie la montée testiculaire.")),
      exStandard("mb2-s2",
        mlang("Serie 2 · 4s", "Set 2 · 4s", "Serie 2 · 4s", "Satz 2 · 4s", "Série 2 · 4s"),
        10, 4, 5,
        mlang("Sin compensaciones.", "No compensations.", "Senza compensi.", "Ohne Ausweichbewegungen.", "Sans compensations.")),
      exStandard("mb2-s3",
        mlang("Serie 3 · 5s", "Set 3 · 5s", "Serie 3 · 5s", "Satz 3 · 5s", "Série 3 · 5s"),
        10, 5, 5,
        mlang("Última serie. Mantén la calidad.", "Last set. Keep quality.", "Ultima serie. Mantieni la qualità.", "Letzter Satz. Qualität halten.", "Dernière série. Garde la qualité.")),
    ],
  },

  // ============ MALE-SEXUAL · INTERMEDIATE ============
  {
    id: "male-int-1", track: "male-sexual", audience: "male", level: "intermediate",
    durationMin: 11, goal: "ielt",
    name: mlang("MTCK Semanas 1-4", "MTCK Weeks 1-4", "MTCK Settimane 1-4", "MTCK Wochen 1-4", "MTCK Semaines 1-4"),
    description: mlang(
      "Protocolo MTCK fase inicial. Estudio en hombres con EP: IELT 104s → 232s en 8 semanas. Aquí van las primeras 4.",
      "MTCK protocol initial phase. Study in men with PE: IELT 104s → 232s in 8 weeks. First 4 weeks here.",
      "Protocollo MTCK fase iniziale. Studio in uomini con EP: IELT 104s → 232s in 8 settimane. Qui le prime 4.",
      "MTCK-Protokoll Anfangsphase. Studie bei Männern mit PE: IELT 104s → 232s in 8 Wochen. Hier die ersten 4.",
      "Protocole MTCK phase initiale. Étude chez hommes avec EP : IELT 104s → 232s en 8 semaines. Ici les 4 premières."
    ),
    exercises: [
      exStandard("mi1-st",
        mlang("Holds 5s", "Holds 5s", "Hold 5s", "Halten 5s", "Holds 5s"),
        12, 5, 5,
        mlang("Activa firme.", "Activate firm.", "Attiva deciso.", "Fest aktivieren.", "Active fermement."),
        { reverseEvery: 5 }),
      exFlick("mi1-fk",
        mlang("Flicks", "Flicks", "Flick", "Flicks", "Flicks"),
        20,
        mlang("Pulsos completos.", "Full pulses.", "Impulsi completi.", "Vollständige Pulse.", "Impulsions complètes.")),
      exEdging("mi1-ed",
        mlang("Edging", "Edging", "Edging", "Edging", "Edging"),
        3, 20,
        mlang("Practica el control: 20s al 50%.", "Practice control: 20s at 50%.", "Pratica il controllo: 20s al 50%.", "Übe Kontrolle: 20s bei 50%.", "Pratique le contrôle : 20s à 50%.")),
      exStandard("mi1-fn",
        mlang("Holds 8s", "Holds 8s", "Hold 8s", "Halten 8s", "Holds 8s"),
        8, 8, 6,
        mlang("Resistencia.", "Endurance.", "Resistenza.", "Ausdauer.", "Endurance."),
        { reverseEvery: 4 }),
    ],
  },
  {
    id: "male-int-2", track: "male-sexual", audience: "male", level: "intermediate",
    durationMin: 8, goal: "erection",
    name: mlang("Erección + Toalla", "Erection + Towel", "Erezione + Asciugamano", "Erektion + Handtuch", "Érection + Serviette"),
    description: mlang(
      "Idealmente con erección. Coloca una toalla pequeña sobre el pene y elévala con cada Kegel — entrena los isquiocavernosos.",
      "Ideally with an erection. Place a small towel on the penis and lift it with each Kegel — trains the ischiocavernosus.",
      "Idealmente con erezione. Metti un piccolo asciugamano sul pene e sollevalo con ogni Kegel — allena gli ischiocavernosi.",
      "Idealerweise mit Erektion. Lege ein kleines Handtuch auf den Penis und hebe es mit jedem Kegel — trainiert den Ischiocavernosus.",
      "Idéalement avec érection. Pose une petite serviette sur le pénis et soulève-la à chaque Kegel — entraîne les ischio-caverneux."
    ),
    exercises: [
      exStandard("mi2-w",
        mlang("Calentamiento", "Warm-up", "Riscaldamento", "Aufwärmen", "Échauffement"),
        8, 4, 4,
        mlang("Sin erección. Activación limpia.", "No erection. Clean activation.", "Senza erezione. Attivazione pulita.", "Ohne Erektion. Saubere Aktivierung.", "Sans érection. Activation propre.")),
      exStandard("mi2-er",
        mlang("Holds en erección", "Holds during erection", "Hold in erezione", "Halten bei Erektion", "Holds en érection"),
        12, 5, 5,
        mlang("Con erección. Visualiza la toalla elevándose.", "With erection. Visualize the towel rising.", "Con erezione. Visualizza l'asciugamano che si solleva.", "Mit Erektion. Stelle dir das Handtuch beim Anheben vor.", "Avec érection. Visualise la serviette qui monte."),
        { reverseEvery: 6 }),
      exFlick("mi2-fk",
        mlang("Bombeo rápido", "Fast pumping", "Pompaggio rapido", "Schnelles Pumpen", "Pompage rapide"),
        20,
        mlang("Pulsos para riego sanguíneo.", "Pulses for blood flow.", "Impulsi per irrorazione sanguigna.", "Pulse für Durchblutung.", "Impulsions pour l'irrigation sanguine.")),
    ],
  },
  {
    id: "male-int-3", track: "male-sexual", audience: "male", level: "intermediate",
    durationMin: 6, goal: "edging",
    name: mlang("Stop-Start con Kegel", "Stop-Start with Kegel", "Stop-Start con Kegel", "Stop-Start mit Kegel", "Stop-Start avec Kegel"),
    description: mlang(
      "Ciclo Stop-Start clínico: ráfaga de flicks (excitación) → hold sostenido (control). Dos fases progresivas: 50% submáximo y 100% máximo. Práctica solitaria.",
      "Clinical Stop-Start cycle: flick burst (arousal) → sustained hold (control). Two progressive phases: 50% submaximal and 100% maximal. Solo practice.",
      "Ciclo Stop-Start clinico: raffica di flick (eccitazione) → hold tenuto (controllo). Due fasi progressive: 50% submassimale e 100% massimale. Pratica solitaria.",
      "Klinischer Stop-Start-Zyklus: Flick-Salve (Erregung) → gehaltener Hold (Kontrolle). Zwei progressive Phasen: 50% submaximal und 100% maximal. Soloübung.",
      "Cycle Stop-Start clinique : rafale de flicks (excitation) → tenue soutenue (contrôle). Deux phases progressives : 50% submaximal et 100% maximal. Pratique solo."
    ),
    exercises: [
      exStandard("mi3-w",
        mlang("Calentamiento · Hold 20s", "Warm-up · Hold 20s", "Riscaldamento · Hold 20s", "Aufwärmen · Halten 20s", "Échauffement · Tenue 20s"),
        3, 20, 10,
        mlang("3 holds largos al 100%. Respira sin apnea.", "3 long holds at 100%. Breathe without apnea.", "3 hold lunghi al 100%. Respira senza apnea.", "3 lange Holds bei 100%. Atme ohne Apnoe.", "3 tenues longues à 100%. Respire sans apnée.")),
      exEdging("mi3-ed1",
        mlang("Edge · Flicks 15s + Hold 30s @50%", "Edge · Flicks 15s + Hold 30s @50%", "Edge · Flick 15s + Hold 30s @50%", "Edge · Flicks 15s + Halten 30s @50%", "Edge · Flicks 15s + Tenue 30s @50%"),
        1, 30,
        mlang("Activa con flicks (excitación), luego corta y sostén al 50% sin perder el control.", "Build with flicks (arousal), then cut and hold at 50% without losing control.", "Attiva con flick (eccitazione), poi taglia e tieni al 50% senza perdere il controllo.", "Mit Flicks aktivieren (Erregung), dann abbrechen und bei 50% halten, ohne Kontrolle zu verlieren.", "Active avec flicks (excitation), puis coupe et tiens à 50% sans perdre le contrôle."),
        { intensity: 50, flickBurstSec: 15 }),
      exEdging("mi3-ed2",
        mlang("Edge · Flicks 5s + Hold 45s @100%", "Edge · Flicks 5s + Hold 45s @100%", "Edge · Flick 5s + Hold 45s @100%", "Edge · Flicks 5s + Halten 45s @100%", "Edge · Flicks 5s + Tenue 45s @100%"),
        1, 45,
        mlang("Ráfaga corta y máximo bloqueo: 45s al 100%. Respiración nasal lenta.", "Short burst and maximum lock: 45s at 100%. Slow nasal breathing.", "Raffica breve e blocco massimo: 45s al 100%. Respirazione nasale lenta.", "Kurze Salve und maximale Sperre: 45s bei 100%. Langsame Nasenatmung.", "Rafale courte et blocage maximal : 45s à 100%. Respiration nasale lente."),
        { intensity: 100, flickBurstSec: 5 }),
      exReverse("mi3-rv",
        mlang("Descanso · Reverse Kegel", "Rest · Reverse Kegel", "Riposo · Reverse Kegel", "Pause · Reverse Kegel", "Repos · Reverse Kegel"),
        3,
        mlang("Empuja suave hacia abajo. Liberación obligatoria para evitar hipertonía.", "Push gently downward. Mandatory release to avoid hypertonia.", "Spingi piano verso il basso. Rilascio obbligatorio per evitare ipertonia.", "Sanft nach unten drücken. Pflicht-Lösen gegen Hypertonie.", "Pousse doucement vers le bas. Relâchement obligatoire pour éviter l'hypertonie.")),
    ],
  },

  // ============ MALE-SEXUAL · ADVANCED ============
  {
    id: "male-adv-1", track: "male-sexual", audience: "male", level: "advanced",
    durationMin: 14, goal: "ielt",
    name: mlang("MTCK Semanas 5-8", "MTCK Weeks 5-8", "MTCK Settimane 5-8", "MTCK Wochen 5-8", "MTCK Semaines 5-8"),
    description: mlang(
      "Fase final del protocolo MTCK.",
      "Final phase of MTCK protocol.",
      "Fase finale del protocollo MTCK.",
      "Endphase des MTCK-Protokolls.",
      "Phase finale du protocole MTCK."
    ),
    exercises: [
      exStandard("ma1-st",
        mlang("Holds 8s", "Holds 8s", "Hold 8s", "Halten 8s", "Holds 8s"),
        12, 8, 6,
        mlang("Densidad alta.", "High density.", "Alta densità.", "Hohe Dichte.", "Densité élevée."),
        { reverseEvery: 4 }),
      exLadder("ma1-ld",
        mlang("Escalera 3→7s", "Ladder 3→7s", "Scala 3→7s", "Leiter 3→7s", "Échelle 3→7s"),
        5,
        mlang("Sube por peldaños.", "Step up the rungs.", "Sali per gradini.", "Stufe für Stufe.", "Monte par échelons.")),
      exFlick("ma1-fk",
        mlang("Flicks 25", "Flicks 25", "Flick 25", "Flicks 25", "Flicks 25"),
        25,
        mlang("Velocidad limpia.", "Clean speed.", "Velocità pulita.", "Saubere Geschwindigkeit.", "Vitesse propre."),
        { onMs: 350, offMs: 500 }),
      exEdging("ma1-ed",
        mlang("Edge", "Edge", "Edge", "Edge", "Edge"),
        4, 30,
        mlang("Edging final.", "Final edging.", "Edging finale.", "Finales Edging.", "Edging final.")),
      exReverse("ma1-rv",
        mlang("Down-training", "Down-training", "Down-training", "Down-Training", "Down-training"),
        5,
        mlang("Cierra con relajación.", "Close with relaxation.", "Chiudi con rilassamento.", "Mit Entspannung abschließen.", "Termine par relâchement.")),
    ],
  },
  {
    id: "male-adv-2", track: "male-sexual", audience: "male", level: "advanced",
    durationMin: 13, goal: "edging",
    name: mlang("PRM 60s", "PRM 60s", "PRM 60s", "PRM 60s", "PRM 60s"),
    description: mlang(
      "Inspirado en Penis-Root Masturbation (PRM): triplica la latencia eyaculatoria en 3 meses. Aquí simulamos el control con holds prolongados.",
      "Inspired by Penis-Root Masturbation (PRM): triples ejaculatory latency in 3 months. Here we simulate control with extended holds.",
      "Ispirato alla Penis-Root Masturbation (PRM): triplica la latenza eiaculatoria in 3 mesi. Qui simuliamo il controllo con hold prolungati.",
      "Inspiriert von Penis-Root Masturbation (PRM): verdreifacht Ejakulationslatenz in 3 Monaten. Hier simulieren wir die Kontrolle mit langem Halten.",
      "Inspiré de la Penis-Root Masturbation (PRM) : triple la latence éjaculatoire en 3 mois. Ici on simule le contrôle avec des tenues prolongées."
    ),
    exercises: [
      exStandard("ma2-w",
        mlang("Activación", "Activation", "Attivazione", "Aktivierung", "Activation"),
        8, 6, 5,
        mlang("Calentamiento.", "Warm-up.", "Riscaldamento.", "Aufwärmen.", "Échauffement.")),
      exEdging("ma2-ed",
        mlang("Hold 60s @50%", "Hold 60s @50%", "Hold 60s @50%", "Halten 60s @50%", "Hold 60s @50%"),
        3, 60,
        mlang("60s al 50%. Respiración nasal lenta.", "60s at 50%. Slow nasal breathing.", "60s al 50%. Respirazione nasale lenta.", "60s bei 50%. Langsame Nasenatmung.", "60s à 50%. Respiration nasale lente.")),
      exEdging("ma2-ed2",
        mlang("Hold 45s @70%", "Hold 45s @70%", "Hold 45s @70%", "Halten 45s @70%", "Hold 45s @70%"),
        3, 45,
        mlang("Sube intensidad, baja tiempo.", "Up intensity, down time.", "Sali intensità, scendi tempo.", "Intensität rauf, Zeit runter.", "Monte l'intensité, baisse le temps."),
        { intensity: 70 }),
      exReverse("ma2-rv",
        mlang("Reverse final", "Final reverse", "Reverse finale", "Finales Reverse", "Reverse final"),
        5,
        mlang("Empuje y relajación.", "Push and relax.", "Spinta e rilassamento.", "Drücken und entspannen.", "Pousser et relâcher.")),
    ],
  },
  {
    id: "male-adv-3", track: "male-sexual", audience: "male", level: "advanced",
    durationMin: 11, goal: "edging",
    name: mlang("Esfínter Diferenciado", "Differentiated Sphincter", "Sfintere Differenziato", "Differenzierter Schließmuskel", "Sphincter différencié"),
    description: mlang(
      "Alterna anal vs uretral. Control diferenciado, técnica avanzada usada por practicantes de control eyaculatorio.",
      "Alternates anal vs urethral. Differentiated control, advanced technique used by ejaculatory control practitioners.",
      "Alterna anale vs uretrale. Controllo differenziato, tecnica avanzata usata da praticanti del controllo eiaculatorio.",
      "Wechselt anal vs. urethral. Differenzierte Kontrolle, fortgeschrittene Technik von Ejakulationskontroll-Praktizierenden.",
      "Alterne anal vs urétral. Contrôle différencié, technique avancée utilisée par les praticiens du contrôle éjaculatoire."
    ),
    exercises: [
      exWave("ma3-w",
        mlang("Onda anal/uretral", "Anal/urethral wave", "Onda anale/uretrale", "Anal/urethrale Welle", "Onde anal/urétrale"),
        8,
        mlang("Alterna anillos. Respira.", "Alternate rings. Breathe.", "Alterna anelli. Respira.", "Ringe abwechseln. Atmen.", "Alterne les anneaux. Respire.")),
      exStandard("ma3-st",
        mlang("Holds 10s", "Holds 10s", "Hold 10s", "Halten 10s", "Holds 10s"),
        8, 10, 6,
        mlang("Mantenimiento profundo.", "Deep maintenance.", "Mantenimento profondo.", "Tiefes Erhalten.", "Maintien profond."),
        { reverseEvery: 4 }),
      exEdging("ma3-ed",
        mlang("Edge", "Edge", "Edge", "Edge", "Edge"),
        3, 30,
        mlang("Cierre.", "Close.", "Chiusura.", "Abschluss.", "Clôture.")),
    ],
  },
  {
    id: "male-adv-4", track: "male-sexual", audience: "male", level: "advanced",
    durationMin: 9, goal: "edging",
    name: mlang(
      "Edging Avanzado · Hold + Reflejo",
      "Advanced Edging · Hold + Reflex",
      "Edging Avanzato · Hold + Riflesso",
      "Fortgeschrittenes Edging · Hold + Reflex",
      "Edging Avancé · Tenue + Réflexe"
    ),
    description: mlang(
      "Sesión completa de edging en 4 ciclos: 2 con hold sostenido (endurance del piso pélvico bajo arousal) + 2 con squeeze breve sin hold (squeeze technique de Masters & Johnson, reflejo de freno). Cada ciclo termina con 30s de flicker para mantener el arousal sin permitir que decaiga. Calentamiento de 60s y reverse Kegel obligatorio al cierre.",
      "Complete edging session in 4 cycles: 2 with sustained hold (pelvic-floor endurance under arousal) + 2 with brief squeeze, no hold (Masters & Johnson squeeze technique, brake reflex). Each cycle ends with 30s of flicker to keep arousal up without letting it decay. 60s warm-up and mandatory reverse Kegel close.",
      "Sessione completa di edging in 4 cicli: 2 con hold tenuto (resistenza del pavimento pelvico sotto arousal) + 2 con squeeze breve senza hold (squeeze technique di Masters & Johnson, riflesso di freno). Ogni ciclo termina con 30s di flicker per mantenere l'arousal senza farlo decadere. Riscaldamento di 60s e Kegel inverso obbligatorio in chiusura.",
      "Komplette Edging-Sitzung in 4 Zyklen: 2 mit gehaltenem Halten (Beckenboden-Ausdauer unter Erregung) + 2 mit kurzem Squeeze ohne Halten (Squeeze-Technik nach Masters & Johnson, Brems-Reflex). Jeder Zyklus endet mit 30s Flicker, um die Erregung zu halten ohne sie absinken zu lassen. 60s Aufwärmen und Pflicht-Reverse-Kegel zum Abschluss.",
      "Séance complète d'edging en 4 cycles : 2 avec tenue soutenue (endurance du plancher pelvien sous excitation) + 2 avec squeeze bref sans tenue (squeeze technique de Masters & Johnson, réflexe de frein). Chaque cycle se termine par 30s de flicker pour maintenir l'excitation sans la laisser décroître. Échauffement de 60s et Kegel inversé obligatoire en clôture."
    ),
    exercises: [
      exStandard("ma4-w",
        mlang("Calentamiento · Hold 60s", "Warm-up · Hold 60s", "Riscaldamento · Hold 60s", "Aufwärmen · Halten 60s", "Échauffement · Tenue 60s"),
        1, 60, 12,
        mlang("Hold único de 60s al 100%. Activa todo el grupo motor antes de empezar el edging.", "Single 60s hold at 100%. Engages the full motor group before edging starts.", "Hold singolo di 60s al 100%. Attiva tutto il gruppo motorio prima di iniziare l'edging.", "Einzelnes 60s-Halten bei 100%. Aktiviert die ganze motorische Gruppe vor dem Edging.", "Tenue unique de 60s à 100%. Active tout le groupe moteur avant de commencer l'edging.")),
      exEdging("ma4-eh",
        mlang("Edge Hold 15s + Flicker 30s", "Edge Hold 15s + Flicker 30s", "Edge Hold 15s + Flicker 30s", "Edge Halten 15s + Flicker 30s", "Edge Tenue 15s + Flicker 30s"),
        2, 15,
        mlang("Squeeze sostenido 15s al 70% MVC, luego 30s de flicker rápido para mantener arousal alto sin orgasmo. Endurance bajo excitación continua.", "Sustained squeeze 15s at 70% MVC, then 30s of fast flicker to keep high arousal without orgasm. Endurance under continuous arousal.", "Squeeze tenuto 15s al 70% MVC, poi 30s di flicker rapido per mantenere alto l'arousal senza orgasmo. Resistenza sotto eccitazione continua.", "Gehaltenes Squeezen 15s bei 70% MVC, dann 30s schnelle Flicker, um hohe Erregung ohne Orgasmus zu halten. Ausdauer unter dauerhafter Erregung.", "Squeeze tenu 15s à 70% MVC, puis 30s de flicker rapide pour maintenir une forte excitation sans orgasme. Endurance sous excitation continue."),
        { intensity: 70, flickAfterSec: 30 }),
      exEdge("ma4-ne",
        mlang("Edge sin hold + Flicker 30s", "No-hold edge + Flicker 30s", "Edge senza hold + Flicker 30s", "Edge ohne Halten + Flicker 30s", "Edge sans tenue + Flicker 30s"),
        2,
        mlang("Squeeze breve y firme (2s al 100%), suelta YA — sin sostener. Es el freno reflejo de Masters & Johnson, no fuerza muscular. Después 30s de flicker para no dejar caer el arousal.", "Brief firm squeeze (2s at 100%), release NOW — no holding. It's the Masters & Johnson brake reflex, not muscular strength. Then 30s of flicker to not let arousal drop.", "Squeeze breve e fermo (2s al 100%), rilascia SUBITO — senza tenere. È il riflesso di freno di Masters & Johnson, non forza muscolare. Poi 30s di flicker per non far scendere l'arousal.", "Kurzes festes Squeezen (2s bei 100%), JETZT loslassen — nicht halten. Es ist der Masters & Johnson Brems-Reflex, nicht Muskelkraft. Dann 30s Flicker, damit die Erregung nicht abfällt.", "Squeeze bref et ferme (2s à 100%), relâche TOUT DE SUITE — sans tenir. C'est le réflexe de frein de Masters & Johnson, pas de la force musculaire. Puis 30s de flicker pour ne pas laisser tomber l'excitation."),
        { squeezeMs: 2000, intensity: 100, flickAfterSec: 30 }),
      exReverse("ma4-rv",
        mlang("Reverse final · Down-training", "Final Reverse · Down-training", "Reverse finale · Down-training", "Finales Reverse · Down-Training", "Reverse final · Down-training"),
        2,
        mlang("Empuje suave hacia abajo. Liberación obligatoria tras 4 ciclos de edging para evitar hipertonía.", "Gentle downward push. Mandatory release after 4 edging cycles to prevent hypertonia.", "Spinta delicata verso il basso. Rilascio obbligatorio dopo 4 cicli di edging per evitare ipertonia.", "Sanftes Drücken nach unten. Pflicht-Lösen nach 4 Edging-Zyklen gegen Hypertonie.", "Poussée douce vers le bas. Relâchement obligatoire après 4 cycles d'edging pour éviter l'hypertonie.")),
    ],
  },

  // ============ INCONTINENCE-KNACK · BEGINNER ============
  {
    id: "knk-beg-1", track: "incontinence-knack", audience: "all", level: "beginner",
    durationMin: 6, goal: "incontinence",
    name: mlang("Knack Básico", "Basic Knack", "Knack di Base", "Knack-Grundlagen", "Knack de base"),
    description: mlang(
      "Aprende a contraer ANTES de toser, estornudar o levantar peso. Es el reflejo que evita el escape.",
      "Learn to contract BEFORE coughing, sneezing or lifting. It's the reflex that prevents leaks.",
      "Impara a contrarre PRIMA di tossire, starnutire o sollevare. È il riflesso che evita la perdita.",
      "Lerne, VOR Husten, Niesen oder Heben anzuspannen. Der Reflex, der Verlust verhindert.",
      "Apprends à contracter AVANT de tousser, éternuer ou soulever. C'est le réflexe qui évite la fuite."
    ),
    exercises: [
      exStandard("kb1-id",
        mlang("Identificación", "Identification", "Identificazione", "Identifizierung", "Identification"),
        6, 3, 5,
        mlang("Activación limpia.", "Clean activation.", "Attivazione pulita.", "Saubere Aktivierung.", "Activation propre.")),
      exKnack("kb1-kn",
        mlang("Anticipación", "Anticipation", "Anticipazione", "Antizipation", "Anticipation"),
        8,
        mlang("Aprieta justo antes de la 'tos' simulada.", "Squeeze right before the simulated 'cough'.", "Stringi appena prima della 'tosse' simulata.", "Genau vor dem simulierten 'Husten' anspannen.", "Serre juste avant la 'toux' simulée.")),
      exFlick("kb1-fk",
        mlang("Reflejo rápido", "Quick reflex", "Riflesso rapido", "Schneller Reflex", "Réflexe rapide"),
        10,
        mlang("Velocidad de respuesta.", "Response speed.", "Velocità di risposta.", "Reaktionsgeschwindigkeit.", "Vitesse de réponse.")),
    ],
  },
  {
    id: "knk-beg-2", track: "incontinence-knack", audience: "all", level: "beginner",
    durationMin: 7, goal: "incontinence",
    name: mlang("Reflejo Continencia", "Continence Reflex", "Riflesso Continenza", "Kontinenz-Reflex", "Réflexe de continence"),
    description: mlang(
      "Densidad alta de Knacks + flicks para entrenar el reflejo automático ante presión intra-abdominal.",
      "High density of Knacks + flicks to train the automatic reflex against intra-abdominal pressure.",
      "Alta densità di Knack + flick per allenare il riflesso automatico contro la pressione intra-addominale.",
      "Hohe Dichte an Knacks + Flicks, um den automatischen Reflex gegen intraabdominalen Druck zu trainieren.",
      "Forte densité de Knacks + flicks pour entraîner le réflexe automatique contre la pression intra-abdominale."
    ),
    exercises: [
      exKnack("kb2-kn",
        mlang("Knack ×10", "Knack ×10", "Knack ×10", "Knack ×10", "Knack ×10"),
        10,
        mlang("Anticipa siempre.", "Always anticipate.", "Anticipa sempre.", "Immer antizipieren.", "Anticipe toujours.")),
      exFlick("kb2-fk",
        mlang("Flicks ×10", "Flicks ×10", "Flick ×10", "Flicks ×10", "Flicks ×10"),
        10,
        mlang("Velocidad.", "Speed.", "Velocità.", "Geschwindigkeit.", "Vitesse.")),
      exStandard("kb2-st",
        mlang("Holds 5s", "Holds 5s", "Hold 5s", "Halten 5s", "Holds 5s"),
        8, 5, 5,
        mlang("Cierre.", "Close.", "Chiusura.", "Abschluss.", "Clôture."),
        { reverseEvery: 5 }),
    ],
  },

  // ============ INCONTINENCE-KNACK · INTERMEDIATE ============
  {
    id: "knk-int-1", track: "incontinence-knack", audience: "all", level: "intermediate",
    durationMin: 10, goal: "incontinence",
    name: mlang("Endurance + Knack", "Endurance + Knack", "Resistenza + Knack", "Ausdauer + Knack", "Endurance + Knack"),
    description: mlang(
      "Combina resistencia y reflejo. Holds 6s y Knacks intercalados para automatizar la contracción ante esfuerzo.",
      "Combines endurance and reflex. 6s holds and interleaved Knacks to automate contraction during effort.",
      "Combina resistenza e riflesso. Hold 6s e Knack intercalati per automatizzare la contrazione sotto sforzo.",
      "Kombiniert Ausdauer und Reflex. 6s-Halten und eingestreute Knacks zur Automatisierung der Kontraktion bei Anstrengung.",
      "Combine endurance et réflexe. Tenues 6s et Knacks intercalés pour automatiser la contraction à l'effort."
    ),
    exercises: [
      exStandard("ki1-st",
        mlang("Holds 6s", "Holds 6s", "Hold 6s", "Halten 6s", "Holds 6s"),
        10, 6, 5,
        mlang("Resistencia.", "Endurance.", "Resistenza.", "Ausdauer.", "Endurance."),
        { reverseEvery: 5 }),
      exKnack("ki1-kn",
        mlang("Knack ×8", "Knack ×8", "Knack ×8", "Knack ×8", "Knack ×8"),
        8,
        mlang("Reflejo automático.", "Automatic reflex.", "Riflesso automatico.", "Automatischer Reflex.", "Réflexe automatique.")),
      exLadder("ki1-ld",
        mlang("Escalera 3→7s", "Ladder 3→7s", "Scala 3→7s", "Leiter 3→7s", "Échelle 3→7s"),
        5,
        mlang("Pirámide.", "Pyramid.", "Piramide.", "Pyramide.", "Pyramide.")),
    ],
  },
  {
    id: "knk-int-2", track: "incontinence-knack", audience: "all", level: "intermediate",
    durationMin: 9, goal: "incontinence",
    name: mlang("Carga Funcional", "Functional Load", "Carico Funzionale", "Funktionale Last", "Charge fonctionnelle"),
    description: mlang(
      "Pensado para hacer caminando o de pie: 50% MVC sostenido. Reproduce las exigencias del día a día.",
      "Designed to do while walking or standing: 50% MVC sustained. Reproduces daily life demands.",
      "Pensato per farlo camminando o in piedi: 50% MVC sostenuto. Riproduce le esigenze quotidiane.",
      "Zum Mitmachen beim Gehen oder Stehen: 50% MVC anhaltend. Bildet Alltagsanforderungen ab.",
      "Pensé pour le faire en marchant ou debout : 50% MVC soutenu. Reproduit les exigences du quotidien."
    ),
    exercises: [
      exStandard("ki2-st",
        mlang("Holds 5s", "Holds 5s", "Hold 5s", "Halten 5s", "Holds 5s"),
        12, 5, 4,
        mlang("De pie si puedes. 50% MVC.", "Standing if you can. 50% MVC.", "In piedi se puoi. 50% MVC.", "Wenn möglich im Stehen. 50% MVC.", "Debout si possible. 50% MVC."),
        { reverseEvery: 4 }),
      exStandard("ki2-ho",
        mlang("Holds funcionales 8s", "Functional holds 8s", "Hold funzionali 8s", "Funktionales Halten 8s", "Holds fonctionnels 8s"),
        4, 8, 5,
        mlang("Caminando o de pie. Contracción al ~50% MVC.", "Walking or standing. Contraction at ~50% MVC.", "Camminando o in piedi. Contrazione al ~50% MVC.", "Beim Gehen oder Stehen. Kontraktion bei ~50% MVC.", "En marchant ou debout. Contraction à ~50% MVC.")),
      exKnack("ki2-kn",
        mlang("Knack ×10", "Knack ×10", "Knack ×10", "Knack ×10", "Knack ×10"),
        10,
        mlang("Reflejo.", "Reflex.", "Riflesso.", "Reflex.", "Réflexe.")),
    ],
  },

  // ============ INCONTINENCE-KNACK · ADVANCED ============
  {
    id: "knk-adv-1", track: "incontinence-knack", audience: "all", level: "advanced",
    durationMin: 13, goal: "incontinence",
    name: mlang("Knack Sostenido", "Sustained Knack", "Knack Sostenuto", "Anhaltendes Knack", "Knack soutenu"),
    description: mlang(
      "Knacks con holds extendidos (3s) — para situaciones de esfuerzo prolongado: levantar pesos, cargar niños, deporte de impacto.",
      "Knacks with extended holds (3s) — for prolonged effort: lifting weights, carrying kids, impact sport.",
      "Knack con hold estesi (3s) — per sforzo prolungato: sollevare pesi, prendere in braccio bambini, sport d'impatto.",
      "Knacks mit verlängertem Halten (3s) — für längere Anstrengung: Heben, Kinder tragen, Sportstöße.",
      "Knacks avec tenues prolongées (3s) — pour effort prolongé : soulever des poids, porter des enfants, sport d'impact."
    ),
    exercises: [
      exStandard("ka1-st",
        mlang("Holds 10s", "Holds 10s", "Hold 10s", "Halten 10s", "Holds 10s"),
        10, 10, 6,
        mlang("Densidad.", "Density.", "Densità.", "Dichte.", "Densité."),
        { reverseEvery: 5 }),
      exKnack("ka1-kn",
        mlang("Knack 3s", "Knack 3s", "Knack 3s", "Knack 3s", "Knack 3s"),
        10,
        mlang("Sostén el reflejo 3 segundos.", "Hold the reflex 3 seconds.", "Tieni il riflesso 3 secondi.", "Den Reflex 3 Sekunden halten.", "Tiens le réflexe 3 secondes."),
        { holdMs: 3000 }),
      exStandard("ka1-ho",
        mlang("Resistencia 15s", "Endurance 15s", "Resistenza 15s", "Ausdauer 15s", "Endurance 15s"),
        4, 15, 8,
        mlang("Holds largos para esfuerzo prolongado.", "Long holds for prolonged effort.", "Hold lunghi per sforzo prolungato.", "Lange Kontraktionen für längere Anstrengung.", "Tenues longues pour effort prolongé.")),
      exReverse("ka1-rv",
        mlang("Down-training", "Down-training", "Down-training", "Down-Training", "Down-training"),
        4,
        mlang("Soltar es tan importante.", "Releasing is just as important.", "Rilasciare è altrettanto importante.", "Loslassen ist genauso wichtig.", "Relâcher est tout aussi important.")),
    ],
  },
  {
    id: "knk-adv-2", track: "incontinence-knack", audience: "all", level: "advanced",
    durationMin: 14, goal: "incontinence",
    name: mlang("Resistencia Plena", "Full Endurance", "Resistenza Piena", "Volle Ausdauer", "Endurance complète"),
    description: mlang(
      "Sesión completa de continencia avanzada. Final 12s, Knack denso y bloque reverse anti-hipertonía.",
      "Full advanced continence session. 12s finish, dense Knack and reverse anti-hypertonia block.",
      "Sessione completa di continenza avanzata. Finale 12s, Knack denso e blocco reverse anti-ipertonia.",
      "Komplette fortgeschrittene Kontinenz-Einheit. 12s-Finale, dichtes Knack und Anti-Hypertonie-Reverse-Block.",
      "Séance complète de continence avancée. Final 12s, Knack dense et bloc reverse anti-hypertonie."
    ),
    exercises: [
      exLadder("ka2-ld",
        mlang("Escalera 3→8s", "Ladder 3→8s", "Scala 3→8s", "Leiter 3→8s", "Échelle 3→8s"),
        6,
        mlang("Pirámide ascendente.", "Ascending pyramid.", "Piramide ascendente.", "Aufsteigende Pyramide.", "Pyramide ascendante.")),
      exKnack("ka2-kn",
        mlang("Knack 2s", "Knack 2s", "Knack 2s", "Knack 2s", "Knack 2s"),
        12,
        mlang("Reflejo + sostén.", "Reflex + hold.", "Riflesso + tenuta.", "Reflex + Halten.", "Réflexe + tenue."),
        { holdMs: 2000 }),
      exStandard("ka2-fn",
        mlang("Final 12s", "Final 12s", "Finale 12s", "Finale 12s", "Final 12s"),
        8, 12, 8,
        mlang("Sostén máximo.", "Max hold.", "Tenuta massima.", "Maximales Halten.", "Tenue max."),
        { reverseEvery: 4 }),
      exReverse("ka2-rv",
        mlang("Reverse final", "Final reverse", "Reverse finale", "Finales Reverse", "Reverse final"),
        6,
        mlang("Empujes lentos.", "Slow pushes.", "Spinte lente.", "Langsames Drücken.", "Poussées lentes.")),
    ],
  },

  // ============ FEMALE-POSTPARTUM-SEXUAL · BEGINNER ============
  {
    id: "fem-beg-1", track: "female-postpartum-sexual", audience: "female", level: "beginner",
    durationMin: 6, goal: "postpartum",
    name: mlang("Reactivación Suave", "Gentle Reactivation", "Riattivazione Dolce", "Sanfte Reaktivierung", "Réactivation douce"),
    description: mlang(
      "Para post-parto o re-inicio. Identificación táctil (siente la elevación, no el pujo). Kegels inversos al final obligatorios.",
      "For postpartum or restart. Tactile identification (feel the lift, not the push). Mandatory reverse Kegels at the end.",
      "Per post-parto o ripresa. Identificazione tattile (senti il sollevamento, non la spinta). Kegel inversi alla fine obbligatori.",
      "Für postpartal oder Neustart. Taktile Identifizierung (Heben, nicht Pressen spüren). Reverse-Kegels am Ende Pflicht.",
      "Pour post-partum ou reprise. Identification tactile (sens l'élévation, pas la poussée). Kegels inversés à la fin obligatoires."
    ),
    exercises: [
      exStandard("fb1-id",
        mlang("Identificación táctil", "Tactile identification", "Identificazione tattile", "Taktile Identifizierung", "Identification tactile"),
        6, 3, 5,
        mlang("Cierre y elevación, no pujo. Si dudas, pon un dedo dentro y siente el cierre.", "Close and lift, no push. If unsure, insert a finger and feel the closure.", "Chiusura e sollevamento, non spinta. Se hai dubbi, inserisci un dito e senti la chiusura.", "Schließen und heben, nicht pressen. Im Zweifel Finger einführen und Verschluss spüren.", "Fermeture et élévation, pas de poussée. En cas de doute, insère un doigt et sens la fermeture.")),
      exFlick("fb1-fk",
        mlang("Flicks suaves", "Soft flicks", "Flick morbidi", "Sanfte Flicks", "Flicks doux"),
        8,
        mlang("Pulsos limpios.", "Clean pulses.", "Impulsi puliti.", "Saubere Pulse.", "Impulsions nettes."),
        { onMs: 500, offMs: 800 }),
      exReverse("fb1-rv",
        mlang("Kegels inversos", "Reverse Kegels", "Kegel inversi", "Reverse-Kegels", "Kegels inversés"),
        4,
        mlang("Soltar y empujar suave. Esencial post-parto.", "Release and push gently. Essential postpartum.", "Rilascia e spingi piano. Essenziale post-parto.", "Loslassen und sanft drücken. Postpartal unverzichtbar.", "Relâche et pousse doucement. Essentiel post-partum.")),
    ],
  },
  {
    id: "fem-beg-2", track: "female-postpartum-sexual", audience: "female", level: "beginner",
    durationMin: 7, goal: "orgasmic",
    name: mlang("Cierre y Elevación", "Close and Lift", "Chiusura e Sollevamento", "Schließen und Heben", "Fermeture et élévation"),
    description: mlang(
      "Despierta los anillos vaginales. Sin peso, sin presión: solo enfoque. Termina siempre con relajación.",
      "Wake up the vaginal rings. No weight, no pressure: just focus. Always end with relaxation.",
      "Risveglia gli anelli vaginali. Senza peso, senza pressione: solo focus. Finisci sempre con rilassamento.",
      "Wecke die Vaginalringe. Kein Gewicht, kein Druck: nur Fokus. Immer mit Entspannung abschließen.",
      "Réveille les anneaux vaginaux. Sans poids, sans pression : juste de la concentration. Termine toujours par un relâchement."
    ),
    exercises: [
      exStandard("fb2-st",
        mlang("Holds 4s", "Holds 4s", "Hold 4s", "Halten 4s", "Holds 4s"),
        8, 4, 5,
        mlang("Cierre + elevación.", "Close + lift.", "Chiusura + sollevamento.", "Schließen + Heben.", "Fermeture + élévation.")),
      exStandard("fb2-st2",
        mlang("Holds 5s", "Holds 5s", "Hold 5s", "Halten 5s", "Holds 5s"),
        8, 5, 5,
        mlang("Sostén firme.", "Firm hold.", "Tenuta salda.", "Festes Halten.", "Tenue ferme."),
        { reverseEvery: 6 }),
      exReverse("fb2-rv",
        mlang("Relajación final", "Final relaxation", "Rilassamento finale", "Endentspannung", "Relâchement final"),
        4,
        mlang("Empuja suave hacia abajo.", "Push gently downward.", "Spingi piano verso il basso.", "Sanft nach unten drücken.", "Pousse doucement vers le bas.")),
    ],
  },

  // ============ FEMALE-POSTPARTUM-SEXUAL · INTERMEDIATE ============
  {
    id: "fem-int-1", track: "female-postpartum-sexual", audience: "female", level: "intermediate",
    durationMin: 11, goal: "orgasmic",
    name: mlang("Conos 20-70g", "Cones 20-70g", "Coni 20-70g", "Konen 20-70g", "Cônes 20-70g"),
    description: mlang(
      "Si tienes conos vaginales (20-70g), inserta el más pesado retenible y entrena de pie 15 min. Si no, simulamos la carga progresiva.",
      "If you have vaginal cones (20-70g), insert the heaviest retainable one and train standing for 15 min. If not, we simulate progressive load.",
      "Se hai coni vaginali (20-70g), inserisci il più pesante che riesci a trattenere e allena in piedi 15 min. Altrimenti simuliamo il carico progressivo.",
      "Wenn du Vaginalkonen (20-70g) hast, das schwerste haltbar einsetzen und 15 Min im Stehen trainieren. Sonst simulieren wir die progressive Last.",
      "Si tu as des cônes vaginaux (20-70g), insère le plus lourd retenable et entraîne-toi debout 15 min. Sinon, on simule la charge progressive."
    ),
    exercises: [
      exStandard("fi1-w",
        mlang("Calentamiento", "Warm-up", "Riscaldamento", "Aufwärmen", "Échauffement"),
        8, 4, 4,
        mlang("Sin peso.", "No weight.", "Senza peso.", "Ohne Gewicht.", "Sans poids.")),
      exStandard("fi1-st",
        mlang("Holds 8s con peso", "Holds 8s with weight", "Hold 8s con peso", "Halten 8s mit Gewicht", "Holds 8s avec poids"),
        10, 8, 6,
        mlang("Visualiza el cono. Activa para sostener.", "Visualize the cone. Activate to hold it.", "Visualizza il cono. Attiva per trattenere.", "Stell dir den Konus vor. Anspannen zum Halten.", "Visualise le cône. Active pour le retenir."),
        { reverseEvery: 5 }),
      exFlick("fi1-fk",
        mlang("Flicks", "Flicks", "Flick", "Flicks", "Flicks"),
        12,
        mlang("Pulsos completos.", "Full pulses.", "Impulsi completi.", "Vollständige Pulse.", "Impulsions complètes.")),
      exReverse("fi1-rv",
        mlang("Reverse", "Reverse", "Reverse", "Reverse", "Reverse"),
        5,
        mlang("Suelta. Estira hacia abajo.", "Release. Stretch downward.", "Rilascia. Allunga verso il basso.", "Loslassen. Nach unten dehnen.", "Relâche. Étire vers le bas.")),
    ],
  },
  {
    id: "fem-int-2", track: "female-postpartum-sexual", audience: "female", level: "intermediate",
    durationMin: 9, goal: "orgasmic",
    name: mlang("Pompoir Inicial", "Initial Pompoir", "Pompoir Iniziale", "Anfangs-Pompoir", "Pompoir initial"),
    description: mlang(
      "Ondas vaginales: alterna anillo anterior (entrada) y posterior (profundo). Base del Pompoir tántrico.",
      "Vaginal waves: alternate anterior ring (entrance) and posterior (deep). Foundation of tantric Pompoir.",
      "Onde vaginali: alterna anello anteriore (entrata) e posteriore (profondo). Base del Pompoir tantrico.",
      "Vaginalwellen: vorderer (Eingang) und hinterer Ring (tief) abwechselnd. Grundlage des tantrischen Pompoir.",
      "Ondes vaginales : alterne anneau antérieur (entrée) et postérieur (profond). Base du Pompoir tantrique."
    ),
    exercises: [
      exWave("fi2-wv",
        mlang("Onda anterior/posterior", "Anterior/posterior wave", "Onda anteriore/posteriore", "Vorne/hinten-Welle", "Onde antérieur/postérieur"),
        6,
        mlang("Alterna entrada y profundo.", "Alternate entrance and deep.", "Alterna entrata e profondo.", "Eingang und tief abwechseln.", "Alterne entrée et profond.")),
      exStandard("fi2-st",
        mlang("Holds 5s", "Holds 5s", "Hold 5s", "Halten 5s", "Holds 5s"),
        8, 5, 5,
        mlang("Mantenimiento.", "Maintenance.", "Mantenimento.", "Erhaltung.", "Maintien."),
        { reverseEvery: 5 }),
      exReverse("fi2-rv",
        mlang("Reverse", "Reverse", "Reverse", "Reverse", "Reverse"),
        4,
        mlang("Soltar.", "Release.", "Rilascia.", "Loslassen.", "Relâche.")),
    ],
  },

  // ============ FEMALE-POSTPARTUM-SEXUAL · ADVANCED ============
  {
    id: "fem-adv-1", track: "female-postpartum-sexual", audience: "female", level: "advanced",
    durationMin: 14, goal: "orgasmic",
    name: mlang("Pompoir Avanzado", "Advanced Pompoir", "Pompoir Avanzato", "Fortgeschrittenes Pompoir", "Pompoir avancé"),
    description: mlang(
      "Diferenciación de anillos, elevator de 4 pisos y edging-hold. Para usuarias con experiencia: pesos >90g equivalentes.",
      "Ring differentiation, 4-floor elevator and edging-hold. For experienced users: equivalent of >90g weights.",
      "Differenziazione di anelli, elevator a 4 piani ed edging-hold. Per utenti esperte: equivalenti di pesi >90g.",
      "Ringdifferenzierung, 4-Stockwerk-Elevator und Edging-Hold. Für Erfahrene: entspricht >90g Gewicht.",
      "Différenciation des anneaux, elevator 4 étages et edging-hold. Pour utilisatrices expérimentées : équivalent >90g."
    ),
    exercises: [
      exWave("fa1-wv",
        mlang("Onda 10×", "Wave 10×", "Onda 10×", "Welle 10×", "Onde 10×"),
        10,
        mlang("Anterior · posterior · alternancia limpia.", "Anterior · posterior · clean alternation.", "Anteriore · posteriore · alternanza pulita.", "Vorne · hinten · sauberer Wechsel.", "Antérieur · postérieur · alternance propre.")),
      exElevator("fa1-el",
        mlang("Elevator", "Elevator", "Elevator", "Elevator", "Elevator"),
        3,
        mlang("Domina los 4 pisos.", "Master all 4 floors.", "Domina tutti i 4 piani.", "Beherrsche alle 4 Stockwerke.", "Maîtrise les 4 étages.")),
      exEdging("fa1-ed",
        mlang("Edge", "Edge", "Edge", "Edge", "Edge"),
        3, 30,
        mlang("Sostén al 50%.", "Hold at 50%.", "Tieni al 50%.", "Bei 50% halten.", "Tiens à 50%.")),
      exReverse("fa1-rv",
        mlang("Reverse", "Reverse", "Reverse", "Reverse", "Reverse"),
        5,
        mlang("Estiramiento. Down-training obligatorio.", "Stretch. Mandatory down-training.", "Stretching. Down-training obbligatorio.", "Dehnen. Down-Training Pflicht.", "Étirement. Down-training obligatoire.")),
    ],
  },
  {
    id: "fem-adv-2", track: "female-postpartum-sexual", audience: "female", level: "advanced",
    durationMin: 13, goal: "orgasmic",
    name: mlang("Ondas y Diferenciación", "Waves and Differentiation", "Onde e Differenziazione", "Wellen und Differenzierung", "Ondes et différenciation"),
    description: mlang(
      "Trabaja el control fino entre anillo entrada (bulbospongioso) y anillo profundo (elevador del ano).",
      "Trains fine control between the entrance ring (bulbospongiosus) and deep ring (levator ani).",
      "Allena il controllo fine tra anello d'entrata (bulbocavernoso) e anello profondo (elevatore dell'ano).",
      "Trainiert die Feinkontrolle zwischen Eingangsring (Bulbospongiosus) und tiefem Ring (Levator ani).",
      "Travaille le contrôle fin entre anneau d'entrée (bulbo-spongieux) et anneau profond (élévateur de l'anus)."
    ),
    exercises: [
      exWave("fa2-wv",
        mlang("Onda 12×", "Wave 12×", "Onda 12×", "Welle 12×", "Onde 12×"),
        12,
        mlang("Diferenciación clara.", "Clear differentiation.", "Differenziazione chiara.", "Klare Differenzierung.", "Différenciation nette.")),
      exStandard("fa2-st",
        mlang("Holds 10s", "Holds 10s", "Hold 10s", "Halten 10s", "Holds 10s"),
        8, 10, 6,
        mlang("Densidad.", "Density.", "Densità.", "Dichte.", "Densité."),
        { reverseEvery: 4 }),
      exReverse("fa2-rv",
        mlang("Bloque reverse", "Reverse block", "Blocco reverse", "Reverse-Block", "Bloc reverse"),
        6,
        mlang("Esencial.", "Essential.", "Essenziale.", "Wesentlich.", "Essentiel.")),
    ],
  },
  {
    id: "fem-adv-3", track: "female-postpartum-sexual", audience: "female", level: "advanced",
    durationMin: 12, goal: "orgasmic",
    name: mlang("Orgasmic Conditioning", "Orgasmic Conditioning", "Orgasmic Conditioning", "Orgasmic Conditioning", "Orgasmic Conditioning"),
    description: mlang(
      "Estimula flicks rápidos (los pulsos del orgasmo) + holds intermedios al 50% MVC. Estudio: orgasmo + Kegels > Kegels solos a 6 meses post-parto.",
      "Stimulates quick flicks (orgasm pulses) + intermediate holds at 50% MVC. Study: orgasm + Kegels > Kegels alone at 6 months postpartum.",
      "Stimola flick rapidi (i pulsi dell'orgasmo) + hold intermedi al 50% MVC. Studio: orgasmo + Kegel > Kegel da soli a 6 mesi post-parto.",
      "Stimuliert schnelle Flicks (Orgasmus-Pulse) + mittlere Halten bei 50% MVC. Studie: Orgasmus + Kegels > Kegels allein nach 6 Monaten postpartal.",
      "Stimule des flicks rapides (les pulsations de l'orgasme) + tenues intermédiaires à 50% MVC. Étude : orgasme + Kegels > Kegels seuls à 6 mois post-partum."
    ),
    exercises: [
      exFlick("fa3-fk",
        mlang("Flicks 30", "Flicks 30", "Flick 30", "Flicks 30", "Flicks 30"),
        30,
        mlang("Velocidad: simula contracciones orgásmicas.", "Speed: simulates orgasmic contractions.", "Velocità: simula contrazioni orgasmiche.", "Tempo: simuliert orgasmische Kontraktionen.", "Vitesse : simule les contractions orgasmiques."),
        { onMs: 300, offMs: 400 }),
      exEdging("fa3-ed",
        mlang("Edge", "Edge", "Edge", "Edge", "Edge"),
        3, 30,
        mlang("Endurance + respiración.", "Endurance + breathing.", "Resistenza + respirazione.", "Ausdauer + Atmung.", "Endurance + respiration.")),
      exReverse("fa3-rv",
        mlang("Cierre relajación", "Relaxation closure", "Chiusura rilassamento", "Entspannungs-Abschluss", "Clôture relâchement"),
        5,
        mlang("Suelta total.", "Full release.", "Rilascia totale.", "Vollständig loslassen.", "Relâche totale.")),
    ],
  },
  {
    id: "fem-adv-4", track: "female-postpartum-sexual", audience: "female", level: "advanced",
    durationMin: 9, goal: "orgasmic",
    name: mlang(
      "Edging Orgásmico · Hold + Reflejo",
      "Orgasmic Edging · Hold + Reflex",
      "Edging Orgasmico · Hold + Riflesso",
      "Orgasmisches Edging · Hold + Reflex",
      "Edging Orgasmique · Tenue + Réflexe"
    ),
    description: mlang(
      "Edging orgásmico avanzado en 4 ciclos: 2 con hold sostenido al 70% MVC (endurance vaginal bajo arousal alto) + 2 con squeeze breve sin hold (reflejo de freno previo al pico orgásmico). Cada ciclo cierra con 30s de flicker — los pulsos rápidos simulan las contracciones orgásmicas y mantienen excitación alta. Calentamiento 60s y reverse obligatorio.",
      "Advanced orgasmic edging in 4 cycles: 2 with sustained hold at 70% MVC (vaginal endurance under high arousal) + 2 with brief squeeze, no hold (brake reflex right before the orgasmic peak). Each cycle closes with 30s of flicker — fast pulses simulating orgasmic contractions and keeping arousal high. 60s warm-up and mandatory reverse.",
      "Edging orgasmico avanzato in 4 cicli: 2 con hold tenuto al 70% MVC (resistenza vaginale sotto arousal alto) + 2 con squeeze breve senza hold (riflesso di freno appena prima del picco orgasmico). Ogni ciclo chiude con 30s di flicker — gli impulsi rapidi simulano le contrazioni orgasmiche e mantengono alto l'arousal. Riscaldamento 60s e reverse obbligatorio.",
      "Fortgeschrittenes orgasmisches Edging in 4 Zyklen: 2 mit gehaltenem Halten bei 70% MVC (vaginale Ausdauer unter hoher Erregung) + 2 mit kurzem Squeezen ohne Halten (Brems-Reflex direkt vor dem Orgasmus-Peak). Jeder Zyklus endet mit 30s Flicker — schnelle Pulse simulieren orgasmische Kontraktionen und halten Erregung hoch. 60s Aufwärmen und Pflicht-Reverse.",
      "Edging orgasmique avancé en 4 cycles : 2 avec tenue soutenue à 70% MVC (endurance vaginale sous excitation forte) + 2 avec squeeze bref sans tenue (réflexe de frein juste avant le pic orgasmique). Chaque cycle se termine par 30s de flicker — les impulsions rapides simulent les contractions orgasmiques et maintiennent l'excitation haute. Échauffement 60s et reverse obligatoire."
    ),
    exercises: [
      exStandard("fa4-w",
        mlang("Calentamiento · Hold 60s", "Warm-up · Hold 60s", "Riscaldamento · Hold 60s", "Aufwärmen · Halten 60s", "Échauffement · Tenue 60s"),
        1, 60, 12,
        mlang("Hold único de 60s al 100%. Activa el bulbospongioso y el elevador del ano antes de los ciclos de edging.", "Single 60s hold at 100%. Activates the bulbospongiosus and levator ani before the edging cycles.", "Hold singolo di 60s al 100%. Attiva il bulbocavernoso e l'elevatore dell'ano prima dei cicli di edging.", "Einzelnes 60s-Halten bei 100%. Aktiviert Bulbospongiosus und Levator ani vor den Edging-Zyklen.", "Tenue unique de 60s à 100%. Active le bulbo-spongieux et l'élévateur de l'anus avant les cycles d'edging.")),
      exEdging("fa4-eh",
        mlang("Edge Hold 15s + Flicker 30s", "Edge Hold 15s + Flicker 30s", "Edge Hold 15s + Flicker 30s", "Edge Halten 15s + Flicker 30s", "Edge Tenue 15s + Flicker 30s"),
        2, 15,
        mlang("Squeeze 15s al 70% MVC. Después 30s de flicker rápido — los pulsos imitan las contracciones del orgasmo. Mantén el arousal sin permitir el clímax.", "Squeeze 15s at 70% MVC. Then 30s of fast flicker — pulses mimic orgasmic contractions. Keep arousal up without letting climax happen.", "Squeeze 15s al 70% MVC. Poi 30s di flicker rapido — gli impulsi imitano le contrazioni dell'orgasmo. Mantieni alto l'arousal senza permettere il climax.", "15s Squeezen bei 70% MVC. Danach 30s schnelle Flicker — Pulse imitieren orgasmische Kontraktionen. Erregung halten, ohne den Höhepunkt zuzulassen.", "Squeeze 15s à 70% MVC. Puis 30s de flicker rapide — les impulsions imitent les contractions de l'orgasme. Garde l'excitation sans laisser arriver le climax."),
        { intensity: 70, flickAfterSec: 30 }),
      exEdge("fa4-ne",
        mlang("Edge sin hold + Flicker 30s", "No-hold edge + Flicker 30s", "Edge senza hold + Flicker 30s", "Edge ohne Halten + Flicker 30s", "Edge sans tenue + Flicker 30s"),
        2,
        mlang("Squeeze breve (2s al 100%) y suelta YA — sin sostener. El freno reflejo evita el clímax sin agotar el músculo. Después 30s de flicker para no perder excitación.", "Brief squeeze (2s at 100%) and release NOW — no holding. The brake reflex prevents climax without fatiguing the muscle. Then 30s of flicker to not lose arousal.", "Squeeze breve (2s al 100%) e rilascia SUBITO — senza tenere. Il riflesso di freno previene il climax senza affaticare il muscolo. Poi 30s di flicker per non perdere eccitazione.", "Kurzes Squeezen (2s bei 100%) und JETZT loslassen — nicht halten. Der Brems-Reflex verhindert den Höhepunkt, ohne den Muskel zu ermüden. Dann 30s Flicker, um Erregung nicht zu verlieren.", "Squeeze bref (2s à 100%) et relâche TOUT DE SUITE — sans tenir. Le réflexe de frein empêche le climax sans fatiguer le muscle. Puis 30s de flicker pour ne pas perdre l'excitation."),
        { squeezeMs: 2000, intensity: 100, flickAfterSec: 30 }),
      exReverse("fa4-rv",
        mlang("Reverse final · Down-training", "Final Reverse · Down-training", "Reverse finale · Down-training", "Finales Reverse · Down-Training", "Reverse final · Down-training"),
        2,
        mlang("Empuje suave hacia abajo, libera tensión vaginal. Obligatorio tras 4 ciclos de edging para evitar hipertonía.", "Gentle downward push, release vaginal tension. Mandatory after 4 edging cycles to prevent hypertonia.", "Spinta delicata verso il basso, rilascia la tensione vaginale. Obbligatorio dopo 4 cicli di edging per evitare ipertonia.", "Sanftes Drücken nach unten, vaginale Spannung loslassen. Pflicht nach 4 Edging-Zyklen gegen Hypertonie.", "Poussée douce vers le bas, libère la tension vaginale. Obligatoire après 4 cycles d'edging pour éviter l'hypertonie.")),
    ],
  },
];

// ---------- Plan semanal por track ----------
// 7 días, 0 = lunes. null = día de descanso (fundamental para evitar hipertonía).
const WEEKLY_PLANS = {
  "general-strength": {
    beginner: ["gen-beg-1", "gen-beg-2", null, "gen-beg-2", "gen-beg-1", "gen-beg-2", null],
    intermediate: ["gen-int-1", "gen-int-2", null, "gen-int-1", "gen-int-2", "gen-int-1", null],
    advanced: ["gen-adv-1", "gen-adv-2", null, "gen-adv-1", "gen-adv-2", "gen-adv-1", null],
  },
  "male-sexual": {
    beginner: ["male-beg-1", "male-beg-2", null, "male-beg-2", "male-beg-1", "male-beg-2", null],
    intermediate: ["male-int-1", "male-int-2", "male-int-3", null, "male-int-1", "male-int-2", null],
    advanced: ["male-adv-1", "male-adv-2", "male-adv-3", null, "male-adv-1", "male-adv-2", null],
  },
  "incontinence-knack": {
    beginner: ["knk-beg-1", "knk-beg-2", null, "knk-beg-1", "knk-beg-2", "knk-beg-1", null],
    intermediate: ["knk-int-1", "knk-int-2", null, "knk-int-1", "knk-int-2", "knk-int-1", null],
    advanced: ["knk-adv-1", "knk-adv-2", null, "knk-adv-1", "knk-adv-2", "knk-adv-1", null],
  },
  "female-postpartum-sexual": {
    beginner: ["fem-beg-1", "fem-beg-2", null, "fem-beg-1", "fem-beg-2", "fem-beg-1", null],
    intermediate: ["fem-int-1", "fem-int-2", null, "fem-int-1", "fem-int-2", "fem-int-1", null],
    advanced: ["fem-adv-1", "fem-adv-2", "fem-adv-3", null, "fem-adv-1", "fem-adv-2", null],
  },
};

// ---------- Tips educativos rotativos ----------
const TIP_TAGS = {
  form: mlang("Forma", "Form", "Forma", "Form", "Forme"),
  breathing: mlang("Respiración", "Breathing", "Respirazione", "Atmung", "Respiration"),
  downtraining: mlang("Down-training", "Down-training", "Down-training", "Down-Training", "Down-training"),
  men: mlang("Hombres", "Men", "Uomini", "Männer", "Hommes"),
  women: mlang("Mujeres", "Women", "Donne", "Frauen", "Femmes"),
  frequency: mlang("Frecuencia", "Frequency", "Frequenza", "Häufigkeit", "Fréquence"),
  errors: mlang("Errores", "Errors", "Errori", "Fehler", "Erreurs"),
  research: mlang("Investigación", "Research", "Ricerca", "Forschung", "Recherche"),
  advanced: mlang("Avanzado", "Advanced", "Avanzato", "Fortgeschritten", "Avancé"),
  knack: mlang("Knack", "Knack", "Knack", "Knack", "Knack"),
  edging: mlang("Edging", "Edging", "Edging", "Edging", "Edging"),
};

const TIPS = [
  { tag: TIP_TAGS.form, text: mlang(
    "No aprietes glúteos ni muslos: solo el suelo pélvico se eleva.",
    "Don't clench glutes or thighs: only the pelvic floor lifts.",
    "Non stringere glutei né cosce: solo il pavimento pelvico si solleva.",
    "Weder Gesäß noch Oberschenkel anspannen: nur der Beckenboden hebt sich.",
    "Ne serre ni fessiers ni cuisses : seul le plancher pelvien s'élève."
  ) },
  { tag: TIP_TAGS.breathing, text: mlang(
    "Exhala al contraer, inhala al relajar. Nunca aguantes la respiración.",
    "Exhale on contraction, inhale on release. Never hold your breath.",
    "Espira contraendo, inspira rilassando. Non trattenere mai il respiro.",
    "Beim Anspannen ausatmen, beim Loslassen einatmen. Niemals Luft anhalten.",
    "Expire en contractant, inspire en relâchant. Ne bloque jamais ta respiration."
  ) },
  { tag: TIP_TAGS.form, text: mlang(
    "Si tu abdomen se hincha o pujas, estás haciendo Valsalva. Para y reinicia.",
    "If your belly bulges or you bear down, you're doing Valsalva. Stop and restart.",
    "Se l'addome si gonfia o spingi, stai facendo Valsalva. Fermati e ricomincia.",
    "Wenn der Bauch sich wölbt oder du drückst, ist es Valsalva. Stopp und neu starten.",
    "Si ton ventre gonfle ou que tu pousses, c'est du Valsalva. Stop et recommence."
  ) },
  { tag: TIP_TAGS.downtraining, text: mlang(
    "Soltar es tan importante como apretar. Hipertonía = dolor pélvico.",
    "Releasing is as important as squeezing. Hypertonia = pelvic pain.",
    "Rilasciare è importante quanto stringere. Ipertonia = dolore pelvico.",
    "Loslassen ist so wichtig wie Anspannen. Hypertonie = Beckenschmerz.",
    "Relâcher est aussi important que serrer. Hypertonie = douleur pelvienne."
  ) },
  { tag: TIP_TAGS.men, text: mlang(
    "Frente al espejo: la base del pene retrocede y los testículos suben. Esa es la pista.",
    "In front of the mirror: the base of the penis retracts and testicles rise. That's the cue.",
    "Davanti allo specchio: la base del pene arretra e i testicoli salgono. Questo è l'indizio.",
    "Vor dem Spiegel: Die Penisbasis zieht zurück und die Hoden heben sich. Das ist der Hinweis.",
    "Devant le miroir : la base du pénis recule et les testicules montent. C'est l'indice."
  ) },
  { tag: TIP_TAGS.women, text: mlang(
    "Cierre y elevación, NO pujo hacia abajo. Si dudas, un dedo intravaginal te confirma.",
    "Close and lift, NO downward push. If unsure, an intravaginal finger confirms it.",
    "Chiusura e sollevamento, NIENTE spinta verso il basso. Se hai dubbi, un dito intravaginale conferma.",
    "Schließen und heben, KEIN Abwärtsdrücken. Im Zweifel bestätigt es ein intravaginaler Finger.",
    "Fermeture et élévation, PAS de poussée vers le bas. En cas de doute, un doigt intravaginal confirme."
  ) },
  { tag: TIP_TAGS.frequency, text: mlang(
    "Mejor 3 sesiones cortas al día que 1 muy larga. La adherencia gana al volumen.",
    "Better 3 short sessions a day than 1 very long one. Adherence beats volume.",
    "Meglio 3 sessioni brevi al giorno che 1 molto lunga. L'aderenza batte il volume.",
    "Lieber 3 kurze Einheiten täglich als 1 sehr lange. Adhärenz schlägt Volumen.",
    "Mieux vaut 3 séances courtes par jour qu'1 très longue. L'adhérence l'emporte sur le volume."
  ) },
  { tag: TIP_TAGS.errors, text: mlang(
    "Kegels 'por si acaso' durante el día → urgencia urinaria. Solo en sesión.",
    "'Just in case' Kegels during the day → urinary urgency. Only during sessions.",
    "Kegel 'per sicurezza' durante il giorno → urgenza urinaria. Solo in sessione.",
    "Kegels 'sicherheitshalber' tagsüber → Harndrang. Nur in der Einheit.",
    "Kegels 'au cas où' dans la journée → urgence urinaire. Seulement en séance."
  ) },
  { tag: TIP_TAGS.research, text: mlang(
    "Cochrane: PFMT supervisado = 8× más probabilidad de cura que no tratamiento.",
    "Cochrane: supervised PFMT = 8× higher cure rate than no treatment.",
    "Cochrane: PFMT supervisato = 8× più probabilità di guarigione vs nessun trattamento.",
    "Cochrane: betreutes PFMT = 8× höhere Heilungschance als keine Behandlung.",
    "Cochrane : PFMT supervisé = 8× plus de chances de guérison que sans traitement."
  ) },
  { tag: TIP_TAGS.research, text: mlang(
    "MTCK 8 semanas: IELT 104s → 232s en hombres con eyaculación precoz.",
    "MTCK 8 weeks: IELT 104s → 232s in men with premature ejaculation.",
    "MTCK 8 settimane: IELT 104s → 232s in uomini con eiaculazione precoce.",
    "MTCK 8 Wochen: IELT 104s → 232s bei Männern mit vorzeitiger Ejakulation.",
    "MTCK 8 semaines : IELT 104s → 232s chez les hommes avec éjaculation précoce."
  ) },
  { tag: TIP_TAGS.research, text: mlang(
    "Disfunción eréctil leve-moderada: 40% recupera función con Kegels diarios en 3-6 meses.",
    "Mild-moderate erectile dysfunction: 40% recover function with daily Kegels in 3-6 months.",
    "Disfunzione erettile lieve-moderata: 40% recupera la funzione con Kegel quotidiani in 3-6 mesi.",
    "Leichte bis moderate erektile Dysfunktion: 40% erlangen Funktion mit täglichen Kegels in 3-6 Monaten zurück.",
    "Dysfonction érectile légère à modérée : 40% retrouvent la fonction avec des Kegels quotidiens en 3-6 mois."
  ) },
  { tag: TIP_TAGS.research, text: mlang(
    "Mujeres post-parto: Kegels + orgasmos > Kegels solos a 6 meses (fuerza y relajación).",
    "Postpartum women: Kegels + orgasms > Kegels alone at 6 months (strength and relaxation).",
    "Donne post-parto: Kegel + orgasmi > Kegel da soli a 6 mesi (forza e rilassamento).",
    "Postpartale Frauen: Kegels + Orgasmen > Kegels allein nach 6 Monaten (Kraft und Entspannung).",
    "Femmes post-partum : Kegels + orgasmes > Kegels seuls à 6 mois (force et relâchement)."
  ) },
  { tag: TIP_TAGS.advanced, text: mlang(
    "El Pompoir es la diferenciación voluntaria entre anillo anterior (entrada) y posterior (profundo).",
    "Pompoir is the voluntary differentiation between the anterior (entrance) and posterior (deep) rings.",
    "Il Pompoir è la differenziazione volontaria tra anello anteriore (entrata) e posteriore (profondo).",
    "Pompoir ist die willkürliche Unterscheidung zwischen vorderem (Eingang) und hinterem (tief) Ring.",
    "Le Pompoir est la différenciation volontaire entre anneau antérieur (entrée) et postérieur (profond)."
  ) },
  { tag: TIP_TAGS.knack, text: mlang(
    "Aprieta JUSTO ANTES de toser/estornudar/levantar. El reflejo se entrena.",
    "Squeeze JUST BEFORE coughing/sneezing/lifting. The reflex is trainable.",
    "Stringi APPENA PRIMA di tossire/starnutire/sollevare. Il riflesso si allena.",
    "GENAU VOR Husten/Niesen/Heben anspannen. Der Reflex ist trainierbar.",
    "Serre JUSTE AVANT de tousser/éternuer/soulever. Le réflexe s'entraîne."
  ) },
  { tag: TIP_TAGS.edging, text: mlang(
    "Detén la estimulación + Kegel sostenido al acercarte al punto de no retorno.",
    "Stop stimulation + sustained Kegel as you approach the point of no return.",
    "Ferma la stimolazione + Kegel tenuto avvicinandoti al punto di non ritorno.",
    "Stimulation stoppen + gehaltener Kegel, wenn du dich dem Point of no return näherst.",
    "Arrête la stimulation + Kegel maintenu en approchant du point de non-retour."
  ) },
];

// ---------- Test inicial ----------
// Para asignar nivel automáticamente tras el onboarding.
// Umbrales calibrados con literatura PFMT (Bø, PERFECT, MTCK):
//   Buena función: 10-15 contracciones rápidas en 10s + 5-10s de hold.
//   Excelente: 18-20 flicks + 15-20s hold.
// Lógica AND: ambos parámetros deben superar el umbral para subir nivel.
function classifyLevel({ holdMs, flicksPer10s }) {
  if (holdMs > 60000 && flicksPer10s >= 18) return "advanced";
  if (holdMs > 30000 && flicksPer10s >= 10) return "intermediate";
  return "beginner";
}

function nextLevelThresholds(level) {
  if (level === "beginner") return { holdMs: 30000, flicksPer10s: 10 };
  if (level === "intermediate") return { holdMs: 60000, flicksPer10s: 18 };
  return null;
}

function nextLevelLabel(level) {
  if (level === "beginner") return "intermediate";
  if (level === "intermediate") return "advanced";
  return null;
}

// ---------- Helpers de filtrado ----------

function getRoutinesByTrackLevel(track, level) {
  return PRESET_ROUTINES.filter((r) => r.track === track && r.level === level);
}

function getTodayRoutineId(track, level) {
  const dayIdx = (new Date().getDay() + 6) % 7;
  const plan = WEEKLY_PLANS[track] && WEEKLY_PLANS[track][level];
  return plan ? plan[dayIdx] : null;
}

function getRandomTip(seed) {
  const i = (seed != null ? seed : new Date().getDate()) % TIPS.length;
  return TIPS[i];
}

// ---------- Glosario clínico ----------
// Diccionario centralizado. Cada ejercicio sólo "indexa" los términos
// relevantes — getExerciseGlossaryTerms detecta por tipo + palabras clave
// del nombre / instrucción / descripción de la rutina.
const GLOSSARY = {
  "suelo-pelvico": {
    term: { es: "Suelo pélvico", en: "Pelvic floor", it: "Pavimento pelvico", de: "Beckenboden", fr: "Plancher pelvien" },
    short: {
      es: "Hamaca muscular del pubis al cóccix que sostiene vejiga, intestino y órganos sexuales.",
      en: "Muscular hammock from pubis to coccyx that supports bladder, bowel and sexual organs.",
      it: "Amaca muscolare dal pube al coccige che sostiene vescica, intestino e organi sessuali.",
      de: "Muskuläre Hängematte vom Schambein zum Steißbein, die Blase, Darm und Sexualorgane stützt.",
      fr: "Hamac musculaire du pubis au coccyx qui soutient vessie, intestin et organes sexuels.",
    },
    full: {
      es: "Tres capas. La profunda (elevador del ano) sostiene; la media controla la uretra; la superficial (bulbospongioso, isquiocavernosos) interviene en la respuesta sexual. Su entrenamiento se llama PFMT.",
      en: "Three layers. The deep one (levator ani) supports; the middle controls the urethra; the superficial (bulbospongiosus, ischiocavernosus) drives sexual response. Its training is called PFMT.",
      it: "Tre strati. Il profondo (elevatore dell'ano) sostiene; il medio controlla l'uretra; il superficiale (bulbocavernoso, ischiocavernoso) interviene nella risposta sessuale. Il suo allenamento si chiama PFMT.",
      de: "Drei Schichten. Die tiefe (Levator ani) stützt; die mittlere kontrolliert die Harnröhre; die oberflächliche (Bulbospongiosus, Ischiocavernosus) ist an der sexuellen Reaktion beteiligt. Das Training heißt PFMT.",
      fr: "Trois couches. La profonde (élévateur de l'anus) soutient ; la moyenne contrôle l'urètre ; la superficielle (bulbo-spongieux, ischio-caverneux) intervient dans la réponse sexuelle. Son entraînement s'appelle PFMT.",
    },
  },
  "kegel": {
    term: { es: "Kegel", en: "Kegel", it: "Kegel", de: "Kegel", fr: "Kegel" },
    short: {
      es: "Contracción voluntaria del suelo pélvico (cierre + elevación).",
      en: "Voluntary contraction of the pelvic floor (close + lift).",
      it: "Contrazione volontaria del pavimento pelvico (chiusura + sollevamento).",
      de: "Willkürliche Kontraktion des Beckenbodens (Schließen + Heben).",
      fr: "Contraction volontaire du plancher pelvien (fermeture + élévation).",
    },
    full: {
      es: "Descrito por el ginecólogo Arnold Kegel en 1948 para incontinencia femenina. Hoy se aplica también a salud sexual masculina, post-parto y rehabilitación pélvica. NO se aprietan glúteos, abdomen ni muslos.",
      en: "Described by gynecologist Arnold Kegel in 1948 for female incontinence. Today also applied to male sexual health, postpartum and pelvic rehab. Do NOT clench glutes, abs or thighs.",
      it: "Descritto dal ginecologo Arnold Kegel nel 1948 per l'incontinenza femminile. Oggi si applica anche alla salute sessuale maschile, post-parto e riabilitazione pelvica. NON si stringono glutei, addome o cosce.",
      de: "1948 vom Gynäkologen Arnold Kegel gegen weibliche Inkontinenz beschrieben. Heute auch für männliche Sexualgesundheit, postpartale und pelvine Rehabilitation. Gesäß, Bauch und Oberschenkel NICHT anspannen.",
      fr: "Décrit par le gynécologue Arnold Kegel en 1948 pour l'incontinence féminine. Appliqué aussi à la santé sexuelle masculine, post-partum et rééducation pelvienne. NE PAS serrer fesses, abdos ni cuisses.",
    },
  },
  "mvc": {
    term: { es: "MVC", en: "MVC", it: "MVC", de: "MVC", fr: "MVC" },
    short: {
      es: "Maximum Voluntary Contraction — tu fuerza máxima al 100%.",
      en: "Maximum Voluntary Contraction — your 100% peak strength.",
      it: "Maximum Voluntary Contraction — la tua forza massima al 100%.",
      de: "Maximum Voluntary Contraction — deine maximale Kraft bei 100%.",
      fr: "Maximum Voluntary Contraction — ta force maximale à 100%.",
    },
    full: {
      es: "Sirve como referencia subjetiva: 50% MVC = la mitad de tu apretón máximo. El edging y los holds intermedios se hacen al 50-70% MVC para no fatigar.",
      en: "Used as subjective reference: 50% MVC = half your maximum squeeze. Edging and intermediate holds are done at 50-70% MVC to avoid fatigue.",
      it: "Riferimento soggettivo: 50% MVC = metà della tua stretta massima. Edging e tenute intermedie si fanno al 50-70% MVC per non affaticarsi.",
      de: "Subjektive Referenz: 50% MVC = halb so stark wie dein Maximum. Edging und mittlere Halten erfolgen bei 50-70% MVC, um Ermüdung zu vermeiden.",
      fr: "Référence subjective : 50% MVC = moitié de ta contraction max. L'edging et les tenues intermédiaires se font à 50-70% MVC pour éviter la fatigue.",
    },
  },
  "hold": {
    term: { es: "Hold", en: "Hold", it: "Hold", de: "Hold", fr: "Hold" },
    short: {
      es: "Contracción sostenida al 100% de fuerza durante 3-10 s.",
      en: "Sustained contraction at 100% strength for 3-10 s.",
      it: "Contrazione tenuta al 100% per 3-10 s.",
      de: "Anhaltende Kontraktion mit 100% Kraft für 3-10 s.",
      fr: "Contraction soutenue à 100% pendant 3-10 s.",
    },
    full: {
      es: "Aprieta lo más fuerte que puedas y aguanta. Construye fuerza máxima y aguante del suelo pélvico (continencia, sostén postural). Descansa al menos el mismo tiempo que aguantaste. Si tiemblas: baja la duración.",
      en: "Squeeze as hard as you can and hold. Builds peak strength and pelvic floor endurance (continence, postural support). Rest at least as long as the hold. If you tremble: shorten the time.",
      it: "Stringi più forte che puoi e tieni. Costruisce forza massima e resistenza del pavimento pelvico (continenza, sostegno posturale). Riposa almeno quanto la tenuta. Se tremi: riduci la durata.",
      de: "So fest wie möglich anspannen und halten. Baut Maximalkraft und Beckenboden-Ausdauer auf (Kontinenz, Haltungsstütze). Mindestens so lange pausieren wie gehalten. Bei Zittern: Dauer verkürzen.",
      fr: "Serre le plus fort possible et maintiens. Construit la force max et l'endurance du plancher pelvien (continence, soutien postural). Repose au moins aussi longtemps que la tenue. Si tu trembles : réduis la durée.",
    },
  },
  "hold-intermedio": {
    term: { es: "Hold intermedio", en: "Intermediate hold", it: "Tenuta intermedia", de: "Mittleres Halten", fr: "Tenue intermédiaire" },
    short: {
      es: "Contracción sostenida al 50-70% de tu fuerza máxima.",
      en: "Sustained contraction at 50-70% of your peak strength.",
      it: "Contrazione tenuta al 50-70% della tua forza massima.",
      de: "Anhaltende Kontraktion bei 50-70% deiner Maximalkraft.",
      fr: "Contraction soutenue à 50-70% de ta force maximale.",
    },
    full: {
      es: "Aprieta a la mitad/dos tercios de tu fuerza y aguanta más tiempo (10-30 s o más). Entrena control fino y resistencia sin agotarte. Núcleo del edging y de los holds en erección — es lo que se usa para durar más sin perder calidad.",
      en: "Squeeze at half/two-thirds of your strength and hold longer (10-30 s or more). Trains fine control and endurance without exhausting. Core of edging and erection holds — used to last longer without losing quality.",
      it: "Stringi a metà/due terzi della tua forza e tieni più a lungo (10-30 s o più). Allena controllo fine e resistenza senza esaurirti. Cuore dell'edging e delle tenute in erezione — serve per durare di più senza perdere qualità.",
      de: "Mit halber/zwei Drittel Kraft anspannen und länger halten (10-30 s oder mehr). Trainiert Feinkontrolle und Ausdauer ohne Erschöpfung. Kern von Edging und Erektions-Halten — um länger durchzuhalten ohne Qualitätsverlust.",
      fr: "Serre à mi/deux tiers de ta force et tiens plus longtemps (10-30 s ou plus). Entraîne le contrôle fin et l'endurance sans épuisement. Cœur de l'edging et des tenues en érection — utilisé pour durer plus longtemps sans perdre en qualité.",
    },
  },
  "flick": {
    term: { es: "Flick", en: "Flick", it: "Flick", de: "Flick", fr: "Flick" },
    short: {
      es: "Pulso explosivo de contracción y suelta total en menos de 1 s.",
      en: "Explosive pulse of contraction and full release in under 1 s.",
      it: "Impulso esplosivo di contrazione e rilascio totale in meno di 1 s.",
      de: "Explosiver Impuls aus Anspannung und vollständigem Loslassen in unter 1 s.",
      fr: "Impulsion explosive de contraction et relâchement total en moins de 1 s.",
    },
    full: {
      es: "Aprieta rápido al 100% y suelta del todo. Entrena el reflejo del suelo pélvico — el que se activa al toser, estornudar, saltar, y durante los pulsos del orgasmo. Crítico para incontinencia de esfuerzo (Knack) y respuesta orgásmica.",
      en: "Squeeze fast at 100% and release fully. Trains the pelvic floor reflex — the one that fires when you cough, sneeze, jump, and during orgasm pulses. Critical for stress incontinence (Knack) and orgasmic response.",
      it: "Stringi rapidamente al 100% e rilascia completamente. Allena il riflesso del pavimento pelvico — quello che si attiva quando tossisci, starnutisci, salti, e durante i pulsi dell'orgasmo. Cruciale per incontinenza da sforzo (Knack) e risposta orgasmica.",
      de: "Schnell auf 100% anspannen und vollständig lösen. Trainiert den Beckenboden-Reflex — den, der bei Husten, Niesen, Springen und während Orgasmus-Pulsen feuert. Entscheidend für Belastungsinkontinenz (Knack) und Orgasmus-Reaktion.",
      fr: "Serre vite à 100% et relâche totalement. Entraîne le réflexe du plancher pelvien — celui qui s'active quand tu tousses, éternues, sautes, et pendant les pulsations de l'orgasme. Critique pour l'incontinence d'effort (Knack) et la réponse orgasmique.",
    },
  },
  "the-knack": {
    term: { es: "The Knack", en: "The Knack", it: "The Knack", de: "The Knack", fr: "The Knack" },
    short: {
      es: "Contracción anticipatoria antes de toser, estornudar o levantar peso.",
      en: "Anticipatory contraction before coughing, sneezing or lifting.",
      it: "Contrazione anticipatoria prima di tossire, starnutire o sollevare pesi.",
      de: "Antizipatorische Kontraktion vor Husten, Niesen oder Heben.",
      fr: "Contraction anticipatoire avant de tousser, éternuer ou soulever.",
    },
    full: {
      es: "Reflejo entrenado para evitar fugas urinarias por presión intra-abdominal. Cochrane: 8× más probabilidad de cura sintomática vs no entrenamiento.",
      en: "Trained reflex to prevent urinary leaks from intra-abdominal pressure. Cochrane: 8× higher chance of symptomatic cure vs no training.",
      it: "Riflesso allenato per evitare perdite urinarie da pressione intra-addominale. Cochrane: 8× più probabilità di guarigione sintomatica vs nessun allenamento.",
      de: "Trainierter Reflex zur Vermeidung von Urinverlust durch intraabdominalen Druck. Cochrane: 8× höhere Chance auf symptomatische Heilung vs. ohne Training.",
      fr: "Réflexe entraîné pour éviter les fuites urinaires dues à la pression intra-abdominale. Cochrane : 8× plus de chances de guérison symptomatique vs absence d'entraînement.",
    },
  },
  "reverse-kegel": {
    term: { es: "Kegel inverso (Reverse)", en: "Reverse Kegel", it: "Kegel inverso (Reverse)", de: "Reverse-Kegel", fr: "Kegel inversé (Reverse)" },
    short: {
      es: "Empuje suave hacia abajo, opuesto al Kegel.",
      en: "Gentle downward push, opposite to a Kegel.",
      it: "Spinta leggera verso il basso, opposta al Kegel.",
      de: "Sanftes Abwärtsdrücken, das Gegenteil eines Kegel.",
      fr: "Poussée douce vers le bas, opposée au Kegel.",
    },
    full: {
      es: "No es Valsalva: no contienes la respiración ni hinchas el abdomen. Estira el suelo pélvico. Imprescindible en niveles intermedio/avanzado para evitar hipertonía.",
      en: "Not Valsalva: no breath holding, no belly bulging. Stretches the pelvic floor. Essential at intermediate/advanced levels to prevent hypertonia.",
      it: "Non è Valsalva: nessun blocco del respiro né addome gonfio. Allunga il pavimento pelvico. Essenziale ai livelli intermedio/avanzato per prevenire l'ipertonia.",
      de: "Kein Valsalva: kein Luftanhalten, kein Bauchaufblähen. Dehnt den Beckenboden. Wichtig auf mittleren/fortgeschrittenen Stufen, um Hypertonie zu vermeiden.",
      fr: "Pas un Valsalva : pas d'apnée ni de ventre gonflé. Étire le plancher pelvien. Indispensable aux niveaux intermédiaire/avancé pour éviter l'hypertonie.",
    },
  },
  "hipertonia": {
    term: { es: "Hipertonía", en: "Hypertonia", it: "Ipertonia", de: "Hypertonie", fr: "Hypertonie" },
    short: {
      es: "Suelo pélvico crónicamente tenso, incapaz de relajarse.",
      en: "Chronically tense pelvic floor, unable to relax.",
      it: "Pavimento pelvico cronicamente teso, incapace di rilassarsi.",
      de: "Chronisch verspannter Beckenboden, der nicht entspannen kann.",
      fr: "Plancher pelvien chroniquement tendu, incapable de se détendre.",
    },
    full: {
      es: "Causa dolor pélvico, dispareunia, disfunción eréctil paradójica y eyaculación dolorosa. Se previene con reverse Kegels intercalados, días de descanso y down-training.",
      en: "Causes pelvic pain, dyspareunia, paradoxical erectile dysfunction and painful ejaculation. Prevented with interleaved reverse Kegels, rest days and down-training.",
      it: "Causa dolore pelvico, dispareunia, disfunzione erettile paradossale ed eiaculazione dolorosa. Si previene con reverse Kegel intercalati, giorni di riposo e down-training.",
      de: "Verursacht Beckenschmerz, Dyspareunie, paradoxe erektile Dysfunktion und schmerzhafte Ejakulation. Vorbeugung durch eingestreute Reverse-Kegels, Ruhetage und Down-Training.",
      fr: "Cause douleurs pelviennes, dyspareunie, dysfonction érectile paradoxale et éjaculation douloureuse. Prévenue par reverse Kegels intercalés, jours de repos et down-training.",
    },
  },
  "down-training": {
    term: { es: "Down-training", en: "Down-training", it: "Down-training", de: "Down-Training", fr: "Down-training" },
    short: {
      es: "Trabajo activo de relajación muscular.",
      en: "Active muscle relaxation work.",
      it: "Lavoro attivo di rilassamento muscolare.",
      de: "Aktive Muskelentspannungsarbeit.",
      fr: "Travail actif de relâchement musculaire.",
    },
    full: {
      es: "Reverse Kegels + respiración diafragmática. Equivalente a estirar tras entrenar. Imprescindible si ya hay hipertonía o tras sesiones intensas.",
      en: "Reverse Kegels + diaphragmatic breathing. Like stretching after training. Essential if you have hypertonia or after intense sessions.",
      it: "Reverse Kegel + respirazione diaframmatica. Equivalente a stretching dopo l'allenamento. Essenziale se c'è ipertonia o dopo sessioni intense.",
      de: "Reverse-Kegels + Zwerchfellatmung. Vergleichbar mit Dehnen nach dem Training. Wichtig bei bestehender Hypertonie oder nach intensiven Einheiten.",
      fr: "Reverse Kegels + respiration diaphragmatique. Équivalent à des étirements après l'entraînement. Indispensable en cas d'hypertonie ou après des séances intenses.",
    },
  },
  "valsalva": {
    term: { es: "Maniobra de Valsalva", en: "Valsalva maneuver", it: "Manovra di Valsalva", de: "Valsalva-Manöver", fr: "Manœuvre de Valsalva" },
    short: {
      es: "Pujar hacia abajo aguantando la respiración.",
      en: "Bearing down while holding the breath.",
      it: "Spingere verso il basso trattenendo il respiro.",
      de: "Pressen nach unten mit angehaltenem Atem.",
      fr: "Pousser vers le bas en bloquant la respiration.",
    },
    full: {
      es: "Error frecuente que confunde con un Kegel: hincha el abdomen y empuja el suelo pélvico HACIA ABAJO (lo opuesto). Empeora prolapsos e incontinencia. Si te pasa: para, exhala y reinicia.",
      en: "Common mistake confused with a Kegel: it bulges the belly and pushes the pelvic floor DOWN (the opposite). Worsens prolapse and incontinence. If it happens: stop, exhale, restart.",
      it: "Errore comune confuso con un Kegel: gonfia l'addome e spinge il pavimento pelvico VERSO IL BASSO (l'opposto). Peggiora prolasso e incontinenza. Se accade: fermati, espira, ricomincia.",
      de: "Häufiger Fehler, der mit einem Kegel verwechselt wird: bläht den Bauch und drückt den Beckenboden NACH UNTEN (das Gegenteil). Verschlimmert Prolaps und Inkontinenz. Wenn es passiert: stopp, ausatmen, neu starten.",
      fr: "Erreur fréquente confondue avec un Kegel : gonfle le ventre et pousse le plancher pelvien VERS LE BAS (l'inverse). Aggrave prolapsus et incontinence. Si ça arrive : stop, expire, recommence.",
    },
  },
  "pompoir": {
    term: { es: "Pompoir", en: "Pompoir", it: "Pompoir", de: "Pompoir", fr: "Pompoir" },
    short: {
      es: "Diferenciación voluntaria entre anillo vaginal anterior y posterior.",
      en: "Voluntary differentiation between anterior and posterior vaginal rings.",
      it: "Differenziazione volontaria tra anello vaginale anteriore e posteriore.",
      de: "Willkürliche Unterscheidung zwischen vorderem und hinterem Vaginalring.",
      fr: "Différenciation volontaire entre anneau vaginal antérieur et postérieur.",
    },
    full: {
      es: "Práctica tántrica originada en India. Anillo anterior (entrada, bulbospongioso) vs anillo posterior (profundo, elevador del ano). Técnica avanzada de control sexual femenino.",
      en: "Tantric practice originating in India. Anterior ring (entrance, bulbospongiosus) vs posterior ring (deep, levator ani). Advanced female sexual control technique.",
      it: "Pratica tantrica originaria dell'India. Anello anteriore (entrata, bulbocavernoso) vs anello posteriore (profondo, elevatore dell'ano). Tecnica avanzata di controllo sessuale femminile.",
      de: "Tantrische Praxis aus Indien. Vorderer Ring (Eingang, Bulbospongiosus) vs. hinterer Ring (tief, Levator ani). Fortgeschrittene Technik weiblicher Sexualkontrolle.",
      fr: "Pratique tantrique originaire d'Inde. Anneau antérieur (entrée, bulbo-spongieux) vs anneau postérieur (profond, élévateur de l'anus). Technique avancée de contrôle sexuel féminin.",
    },
  },
  "edging": {
    term: { es: "Edging", en: "Edging", it: "Edging", de: "Edging", fr: "Edging" },
    short: {
      es: "Acercarse al orgasmo y detenerse justo antes.",
      en: "Approach orgasm and stop just before it.",
      it: "Avvicinarsi all'orgasmo e fermarsi appena prima.",
      de: "Sich dem Orgasmus nähern und kurz davor stoppen.",
      fr: "Approcher l'orgasme et s'arrêter juste avant.",
    },
    full: {
      es: "Combinado con un Kegel sostenido al ~50% MVC entrena el control eyaculatorio. Núcleo del protocolo PRM y de las técnicas de stop-start.",
      en: "Combined with a sustained Kegel at ~50% MVC it trains ejaculatory control. Core of the PRM protocol and stop-start techniques.",
      it: "Combinato con un Kegel tenuto al ~50% MVC allena il controllo eiaculatorio. Cuore del protocollo PRM e delle tecniche stop-start.",
      de: "Kombiniert mit einem gehaltenen Kegel bei ~50% MVC trainiert es die Ejakulationskontrolle. Kern des PRM-Protokolls und der Stop-Start-Techniken.",
      fr: "Combiné à un Kegel maintenu à ~50% MVC, entraîne le contrôle éjaculatoire. Cœur du protocole PRM et des techniques stop-start.",
    },
  },
  "stop-start": {
    term: { es: "Stop-start", en: "Stop-start", it: "Stop-start", de: "Stop-Start", fr: "Stop-start" },
    short: {
      es: "Técnica clásica de control eyaculatorio (Masters & Johnson).",
      en: "Classic ejaculatory control technique (Masters & Johnson).",
      it: "Tecnica classica di controllo eiaculatorio (Masters & Johnson).",
      de: "Klassische Technik der Ejakulationskontrolle (Masters & Johnson).",
      fr: "Technique classique de contrôle éjaculatoire (Masters & Johnson).",
    },
    full: {
      es: "Detener la estimulación al acercarse al punto de no retorno + Kegel sostenido. Repetir 3-4 veces antes de permitir la eyaculación. Aumenta IELT progresivamente.",
      en: "Stop stimulation when approaching the point of no return + sustained Kegel. Repeat 3-4 times before allowing ejaculation. Progressively increases IELT.",
      it: "Fermare la stimolazione avvicinandosi al punto di non ritorno + Kegel tenuto. Ripetere 3-4 volte prima di permettere l'eiaculazione. Aumenta progressivamente l'IELT.",
      de: "Stimulation stoppen, wenn der Point of no return naht + gehaltener Kegel. 3-4 Mal wiederholen, bevor die Ejakulation erlaubt wird. Erhöht IELT schrittweise.",
      fr: "Arrêter la stimulation à l'approche du point de non-retour + Kegel maintenu. Répéter 3-4 fois avant d'autoriser l'éjaculation. Augmente progressivement l'IELT.",
    },
  },
  "punto-no-retorno": {
    term: { es: "Punto de no retorno", en: "Point of no return", it: "Punto di non ritorno", de: "Point of no return", fr: "Point de non-retour" },
    short: {
      es: "Umbral neurológico tras el cual la eyaculación es inevitable.",
      en: "Neurological threshold beyond which ejaculation is inevitable.",
      it: "Soglia neurologica oltre la quale l'eiaculazione è inevitabile.",
      de: "Neurologische Schwelle, ab der die Ejakulation unvermeidlich ist.",
      fr: "Seuil neurologique au-delà duquel l'éjaculation est inévitable.",
    },
    full: {
      es: "Se describe como una sensación de calor que sube por la base del pene. El edging entrena a reconocerlo y permanecer 1-2 puntos por debajo.",
      en: "Described as a warm sensation rising from the base of the penis. Edging trains you to recognize it and stay 1-2 points below.",
      it: "Descritto come una sensazione di calore che sale dalla base del pene. L'edging allena a riconoscerlo e restare 1-2 punti sotto.",
      de: "Wird als wärmendes Gefühl beschrieben, das vom Penisansatz aufsteigt. Edging trainiert dich, es zu erkennen und 1-2 Punkte darunter zu bleiben.",
      fr: "Décrit comme une sensation de chaleur qui monte depuis la base du pénis. L'edging entraîne à le reconnaître et rester 1-2 points en dessous.",
    },
  },
  "mtck": {
    term: { es: "MTCK", en: "MTCK", it: "MTCK", de: "MTCK", fr: "MTCK" },
    short: {
      es: "Manual Technique Combined with Kegels.",
      en: "Manual Technique Combined with Kegels.",
      it: "Manual Technique Combined with Kegels.",
      de: "Manual Technique Combined with Kegels.",
      fr: "Manual Technique Combined with Kegels.",
    },
    full: {
      es: "Protocolo masculino de 8 semanas de Kegels + autoestimulación controlada. Estudio publicado: IELT 104 s → 232 s · PEDT 12.28 → 8.44 · EHS 3.00 → 3.39.",
      en: "8-week male protocol of Kegels + controlled self-stimulation. Published study: IELT 104 s → 232 s · PEDT 12.28 → 8.44 · EHS 3.00 → 3.39.",
      it: "Protocollo maschile di 8 settimane di Kegel + autostimolazione controllata. Studio pubblicato: IELT 104 s → 232 s · PEDT 12.28 → 8.44 · EHS 3.00 → 3.39.",
      de: "8-wöchiges Männerprotokoll aus Kegels + kontrollierter Selbststimulation. Veröffentlichte Studie: IELT 104 s → 232 s · PEDT 12.28 → 8.44 · EHS 3.00 → 3.39.",
      fr: "Protocole masculin de 8 semaines de Kegels + auto-stimulation contrôlée. Étude publiée : IELT 104 s → 232 s · PEDT 12,28 → 8,44 · EHS 3,00 → 3,39.",
    },
  },
  "prm": {
    term: { es: "PRM", en: "PRM", it: "PRM", de: "PRM", fr: "PRM" },
    short: {
      es: "Penis-Root Masturbation.",
      en: "Penis-Root Masturbation.",
      it: "Penis-Root Masturbation.",
      de: "Penis-Root Masturbation.",
      fr: "Penis-Root Masturbation.",
    },
    full: {
      es: "Protocolo en el que se estimula la base/raíz del pene activando isquiocavernosos. En 3 meses triplica la latencia eyaculatoria (IELT) en hombres con eyaculación precoz.",
      en: "Protocol stimulating the base/root of the penis, activating ischiocavernosus. In 3 months it triples ejaculatory latency (IELT) in men with premature ejaculation.",
      it: "Protocollo che stimola la base/radice del pene attivando l'ischiocavernoso. In 3 mesi triplica la latenza eiaculatoria (IELT) negli uomini con eiaculazione precoce.",
      de: "Protokoll, das den Penisansatz stimuliert und Ischiocavernosus aktiviert. In 3 Monaten verdreifacht es die Ejakulationslatenz (IELT) bei Männern mit vorzeitiger Ejakulation.",
      fr: "Protocole stimulant la base/racine du pénis, activant l'ischio-caverneux. En 3 mois, triple la latence éjaculatoire (IELT) chez les hommes avec éjaculation précoce.",
    },
  },
  "ielt": {
    term: { es: "IELT", en: "IELT", it: "IELT", de: "IELT", fr: "IELT" },
    short: {
      es: "Intravaginal Ejaculatory Latency Time.",
      en: "Intravaginal Ejaculatory Latency Time.",
      it: "Intravaginal Ejaculatory Latency Time.",
      de: "Intravaginal Ejaculatory Latency Time.",
      fr: "Intravaginal Ejaculatory Latency Time.",
    },
    full: {
      es: "Tiempo desde la penetración hasta la eyaculación. Métrica clínica estándar de eyaculación precoz. Normal >2 min · EP probable <1 min · EP severa <30 s.",
      en: "Time from penetration to ejaculation. Standard clinical metric for premature ejaculation. Normal >2 min · likely PE <1 min · severe PE <30 s.",
      it: "Tempo dalla penetrazione all'eiaculazione. Metrica clinica standard per l'eiaculazione precoce. Normale >2 min · EP probabile <1 min · EP severa <30 s.",
      de: "Zeit von der Penetration bis zur Ejakulation. Klinische Standardmetrik für vorzeitige Ejakulation. Normal >2 min · wahrscheinlich PE <1 min · schwere PE <30 s.",
      fr: "Temps de la pénétration à l'éjaculation. Métrique clinique standard pour l'éjaculation précoce. Normal >2 min · EP probable <1 min · EP sévère <30 s.",
    },
  },
  "ehs": {
    term: { es: "EHS", en: "EHS", it: "EHS", de: "EHS", fr: "EHS" },
    short: {
      es: "Erection Hardness Score (1-4).",
      en: "Erection Hardness Score (1-4).",
      it: "Erection Hardness Score (1-4).",
      de: "Erection Hardness Score (1-4).",
      fr: "Erection Hardness Score (1-4).",
    },
    full: {
      es: "1 = más grande pero blando · 2 = duro pero no penetra · 3 = penetra pero no plenamente rígido · 4 = totalmente rígido. Puntuación validada para disfunción eréctil.",
      en: "1 = larger but soft · 2 = hard but doesn't penetrate · 3 = penetrates but not fully rigid · 4 = fully rigid. Validated score for erectile dysfunction.",
      it: "1 = più grande ma molle · 2 = duro ma non penetra · 3 = penetra ma non pienamente rigido · 4 = pienamente rigido. Punteggio validato per disfunzione erettile.",
      de: "1 = größer aber weich · 2 = hart, aber dringt nicht ein · 3 = dringt ein, nicht voll starr · 4 = vollständig starr. Validierter Score für erektile Dysfunktion.",
      fr: "1 = plus grand mais mou · 2 = dur mais ne pénètre pas · 3 = pénètre mais pas pleinement rigide · 4 = totalement rigide. Score validé pour la dysfonction érectile.",
    },
  },
  "pedt": {
    term: { es: "PEDT", en: "PEDT", it: "PEDT", de: "PEDT", fr: "PEDT" },
    short: {
      es: "Premature Ejaculation Diagnostic Tool.",
      en: "Premature Ejaculation Diagnostic Tool.",
      it: "Premature Ejaculation Diagnostic Tool.",
      de: "Premature Ejaculation Diagnostic Tool.",
      fr: "Premature Ejaculation Diagnostic Tool.",
    },
    full: {
      es: "Cuestionario de 5 ítems. Score >11 = EP probable · 9-10 sospecha · <9 normal. Usado para clasificar a participantes en estudios MTCK/PRM.",
      en: "5-item questionnaire. Score >11 = likely PE · 9-10 suspicion · <9 normal. Used to classify participants in MTCK/PRM studies.",
      it: "Questionario di 5 voci. Score >11 = EP probabile · 9-10 sospetto · <9 normale. Usato per classificare i partecipanti negli studi MTCK/PRM.",
      de: "Fragebogen mit 5 Items. Score >11 = wahrscheinlich PE · 9-10 Verdacht · <9 normal. Wird zur Einstufung von Teilnehmern in MTCK/PRM-Studien verwendet.",
      fr: "Questionnaire de 5 items. Score >11 = EP probable · 9-10 suspicion · <9 normal. Utilisé pour classer les participants dans les études MTCK/PRM.",
    },
  },
  "respiracion-478": {
    term: { es: "Respiración 4-7-8", en: "4-7-8 breathing", it: "Respirazione 4-7-8", de: "4-7-8-Atmung", fr: "Respiration 4-7-8" },
    short: {
      es: "Inhala 4 s · retén 7 s · exhala 8 s.",
      en: "Inhale 4 s · hold 7 s · exhale 8 s.",
      it: "Inspira 4 s · trattieni 7 s · espira 8 s.",
      de: "Einatmen 4 s · halten 7 s · ausatmen 8 s.",
      fr: "Inspire 4 s · retiens 7 s · expire 8 s.",
    },
    full: {
      es: "Técnica de Andrew Weil. Activa el sistema parasimpático, baja la excitación simpática. Útil en edging, en down-training y antes de dormir.",
      en: "Technique by Andrew Weil. Activates the parasympathetic system, lowers sympathetic arousal. Useful in edging, down-training and before sleep.",
      it: "Tecnica di Andrew Weil. Attiva il sistema parasimpatico, abbassa l'eccitazione simpatica. Utile nell'edging, nel down-training e prima di dormire.",
      de: "Technik von Andrew Weil. Aktiviert das parasympathische System, senkt sympathische Erregung. Nützlich bei Edging, Down-Training und vor dem Schlafen.",
      fr: "Technique d'Andrew Weil. Active le système parasympathique, abaisse l'excitation sympathique. Utile en edging, down-training et avant de dormir.",
    },
  },
  "elevator": {
    term: { es: "Elevator (4 pisos)", en: "Elevator (4 floors)", it: "Elevator (4 piani)", de: "Elevator (4 Stockwerke)", fr: "Elevator (4 étages)" },
    short: {
      es: "Contracción escalonada 25 → 50 → 75 → 100% MVC.",
      en: "Stepped contraction 25 → 50 → 75 → 100% MVC.",
      it: "Contrazione a gradini 25 → 50 → 75 → 100% MVC.",
      de: "Gestufte Kontraktion 25 → 50 → 75 → 100% MVC.",
      fr: "Contraction par paliers 25 → 50 → 75 → 100% MVC.",
    },
    full: {
      es: "Entrena control fino de intensidad. Se sube piso a piso y se baja también escalonadamente, no de golpe. Excelente propriocepción del suelo pélvico.",
      en: "Trains fine intensity control. Go up floor by floor and come back down stepped too, not at once. Excellent pelvic floor proprioception.",
      it: "Allena il controllo fine dell'intensità. Si sale piano per piano e si scende anche a gradini, non di colpo. Ottima propriocezione del pavimento pelvico.",
      de: "Trainiert feine Intensitätskontrolle. Stockwerk für Stockwerk hoch und ebenso gestuft wieder runter, nicht abrupt. Hervorragende Beckenboden-Propriozeption.",
      fr: "Entraîne le contrôle fin de l'intensité. Monte étage par étage et redescends par paliers aussi, pas d'un coup. Excellente proprioception du plancher pelvien.",
    },
  },
  "ladder": {
    term: { es: "Escalera (Ladder)", en: "Ladder", it: "Scala (Ladder)", de: "Leiter (Ladder)", fr: "Échelle (Ladder)" },
    short: {
      es: "Pirámide ascendente: holds que crecen 1 s por peldaño.",
      en: "Ascending pyramid: holds growing 1 s per step.",
      it: "Piramide ascendente: tenute che crescono 1 s per gradino.",
      de: "Aufsteigende Pyramide: Halten wachsen 1 s pro Stufe.",
      fr: "Pyramide ascendante : tenues qui augmentent de 1 s par échelon.",
    },
    full: {
      es: "Aumento progresivo de duración e intensidad subjetiva. Empieza 2 s, sube hasta 6-8 s. Forma de sobrecarga progresiva sin cambiar el ejercicio.",
      en: "Progressive increase in duration and subjective intensity. Start at 2 s, go up to 6-8 s. Progressive overload without changing the exercise.",
      it: "Aumento progressivo di durata e intensità soggettiva. Inizia a 2 s, sale fino a 6-8 s. Sovraccarico progressivo senza cambiare l'esercizio.",
      de: "Schrittweise Steigerung von Dauer und subjektiver Intensität. Beginne bei 2 s, steigere bis 6-8 s. Progressive Überlastung ohne Übungswechsel.",
      fr: "Augmentation progressive de la durée et de l'intensité subjective. Commence à 2 s, monte à 6-8 s. Surcharge progressive sans changer d'exercice.",
    },
  },
  "wave": {
    term: { es: "Onda (Wave)", en: "Wave", it: "Onda (Wave)", de: "Welle (Wave)", fr: "Onde (Wave)" },
    short: {
      es: "Alternancia rítmica anterior/posterior.",
      en: "Rhythmic anterior/posterior alternation.",
      it: "Alternanza ritmica anteriore/posteriore.",
      de: "Rhythmischer vorne/hinten-Wechsel.",
      fr: "Alternance rythmée antérieur/postérieur.",
    },
    full: {
      es: "Base del Pompoir. Activa selectivamente bulbospongioso (entrada) y luego elevador del ano (profundo). Crea la sensación de 'ola' interna.",
      en: "Foundation of Pompoir. Selectively activates bulbospongiosus (entrance) and then levator ani (deep). Creates an internal 'wave' sensation.",
      it: "Base del Pompoir. Attiva selettivamente il bulbocavernoso (entrata) e poi l'elevatore dell'ano (profondo). Crea la sensazione di 'onda' interna.",
      de: "Grundlage des Pompoir. Aktiviert selektiv Bulbospongiosus (Eingang) und dann Levator ani (tief). Erzeugt ein inneres 'Wellen'-Gefühl.",
      fr: "Base du Pompoir. Active sélectivement le bulbo-spongieux (entrée) puis l'élévateur de l'anus (profond). Crée la sensation d'« onde » interne.",
    },
  },
  "conos": {
    term: { es: "Conos vaginales", en: "Vaginal cones", it: "Coni vaginali", de: "Vaginalkonen", fr: "Cônes vaginaux" },
    short: {
      es: "Pesos retenibles intravaginales (20-70 g, hasta 90 g).",
      en: "Intravaginal retainable weights (20-70 g, up to 90 g).",
      it: "Pesi intravaginali da trattenere (20-70 g, fino a 90 g).",
      de: "Intravaginal haltbare Gewichte (20-70 g, bis 90 g).",
      fr: "Poids intravaginaux à retenir (20-70 g, jusqu'à 90 g).",
    },
    full: {
      es: "Inserta el más pesado que puedas retener 15 min de pie sin que se caiga. Cuando sea fácil, sube de peso. Resistencia progresiva validada en post-parto.",
      en: "Insert the heaviest one you can retain for 15 min standing without it falling. When easy, increase weight. Progressive resistance validated postpartum.",
      it: "Inserisci il più pesante che riesci a trattenere 15 min in piedi senza cadere. Quando è facile, aumenta il peso. Resistenza progressiva validata nel post-parto.",
      de: "Setze das schwerste ein, das du 15 Min im Stehen halten kannst, ohne dass es fällt. Wenn es leicht wird, Gewicht erhöhen. Progressiver Widerstand, postpartal validiert.",
      fr: "Insère le plus lourd que tu peux retenir 15 min debout sans qu'il tombe. Quand c'est facile, augmente le poids. Résistance progressive validée en post-partum.",
    },
  },
  "isquiocavernosos": {
    term: { es: "Isquiocavernosos", en: "Ischiocavernosus", it: "Ischiocavernosi", de: "Ischiocavernosus", fr: "Ischio-caverneux" },
    short: {
      es: "Músculos del periné que comprimen las raíces del pene/clítoris.",
      en: "Perineal muscles that compress the roots of the penis/clitoris.",
      it: "Muscoli del perineo che comprimono le radici del pene/clitoride.",
      de: "Dammmuskeln, die die Wurzeln von Penis/Klitoris komprimieren.",
      fr: "Muscles du périnée qui compriment les racines du pénis/clitoris.",
    },
    full: {
      es: "Su tonificación mejora la rigidez de erección y la intensidad orgásmica. Se activan con Kegels altos, holds en erección y PRM.",
      en: "Toning them improves erection rigidity and orgasm intensity. Activated by high Kegels, erection holds and PRM.",
      it: "La loro tonificazione migliora la rigidità dell'erezione e l'intensità orgasmica. Si attivano con Kegel alti, tenute in erezione e PRM.",
      de: "Ihre Stärkung verbessert Erektionssteife und Orgasmusintensität. Werden durch hohe Kegels, Erektions-Halten und PRM aktiviert.",
      fr: "Leur tonification améliore la rigidité d'érection et l'intensité orgasmique. Activés par les Kegels hauts, les tenues en érection et le PRM.",
    },
  },
  "bulbospongioso": {
    term: { es: "Bulbospongioso", en: "Bulbospongiosus", it: "Bulbocavernoso", de: "Bulbospongiosus", fr: "Bulbo-spongieux" },
    short: {
      es: "Músculo del anillo vaginal anterior (entrada) y base del bulbo del pene.",
      en: "Muscle of the anterior vaginal ring (entrance) and base of the penis bulb.",
      it: "Muscolo dell'anello vaginale anteriore (entrata) e base del bulbo del pene.",
      de: "Muskel des vorderen Vaginalrings (Eingang) und der Penisbulbus-Basis.",
      fr: "Muscle de l'anneau vaginal antérieur (entrée) et base du bulbe du pénis.",
    },
    full: {
      es: "Genera las contracciones rítmicas durante el orgasmo. Centro del Pompoir anterior y de los flicks rápidos.",
      en: "Generates rhythmic contractions during orgasm. Core of anterior Pompoir and quick flicks.",
      it: "Genera le contrazioni ritmiche durante l'orgasmo. Centro del Pompoir anteriore e dei flick rapidi.",
      de: "Erzeugt rhythmische Kontraktionen während des Orgasmus. Zentrum des vorderen Pompoir und schneller Flicks.",
      fr: "Génère les contractions rythmiques pendant l'orgasme. Cœur du Pompoir antérieur et des flicks rapides.",
    },
  },
  "elevador-ano": {
    term: { es: "Elevador del ano", en: "Levator ani", it: "Elevatore dell'ano", de: "Levator ani", fr: "Élévateur de l'anus" },
    short: {
      es: "Músculo principal del suelo pélvico profundo.",
      en: "Main muscle of the deep pelvic floor.",
      it: "Muscolo principale del pavimento pelvico profondo.",
      de: "Hauptmuskel des tiefen Beckenbodens.",
      fr: "Muscle principal du plancher pelvien profond.",
    },
    full: {
      es: "Forma el anillo posterior vaginal y sostiene órganos pélvicos. Centro de los holds largos. Se siente como elevación interna.",
      en: "Forms the posterior vaginal ring and supports pelvic organs. Core of long holds. Feels like an internal lift.",
      it: "Forma l'anello vaginale posteriore e sostiene gli organi pelvici. Centro delle tenute lunghe. Si sente come un sollevamento interno.",
      de: "Bildet den hinteren Vaginalring und stützt Beckenorgane. Zentrum langer Halten. Fühlt sich wie inneres Heben an.",
      fr: "Forme l'anneau vaginal postérieur et soutient les organes pelviens. Cœur des tenues longues. Se ressent comme une élévation interne.",
    },
  },
  "pfmt": {
    term: { es: "PFMT", en: "PFMT", it: "PFMT", de: "PFMT", fr: "PFMT" },
    short: {
      es: "Pelvic Floor Muscle Training.",
      en: "Pelvic Floor Muscle Training.",
      it: "Pelvic Floor Muscle Training.",
      de: "Pelvic Floor Muscle Training.",
      fr: "Pelvic Floor Muscle Training.",
    },
    full: {
      es: "Nombre clínico estándar del entrenamiento de Kegels. Cochrane: nivel A de evidencia para incontinencia urinaria de esfuerzo. Recomendado como primera línea antes de cirugía.",
      en: "Standard clinical name for Kegel training. Cochrane: level A evidence for stress urinary incontinence. Recommended as first line before surgery.",
      it: "Nome clinico standard dell'allenamento dei Kegel. Cochrane: evidenza di livello A per l'incontinenza urinaria da sforzo. Raccomandato come prima linea prima della chirurgia.",
      de: "Standardklinische Bezeichnung für Kegel-Training. Cochrane: Evidenz Level A für Belastungsharninkontinenz. Empfohlen als erste Linie vor Operationen.",
      fr: "Nom clinique standard de l'entraînement des Kegels. Cochrane : preuve de niveau A pour l'incontinence urinaire d'effort. Recommandé en première ligne avant la chirurgie.",
    },
  },
};

// Mapeo tipo de ejercicio → términos base.
const TYPE_TERMS = {
  standard: ["hold", "mvc"],
  flick: ["flick"],
  ladder: ["hold", "ladder", "mvc"],
  elevator: ["hold-intermedio", "elevator", "mvc"],
  wave: ["wave", "pompoir", "bulbospongioso", "elevador-ano"],
  knack: ["the-knack", "flick"],
  "edging-hold": ["hold-intermedio", "edging", "mvc", "punto-no-retorno"],
  edge: ["edging", "stop-start", "punto-no-retorno", "flick"],
  reverse: ["reverse-kegel", "hipertonia", "down-training"],
};

// Patrones para detectar términos en texto libre (nombre, instrucción, desc).
const KEYWORD_RULES = [
  [/mtck/i, "mtck"],
  [/\bprm\b|penis[- ]root/i, "prm"],
  [/\bielt\b|latencia eyaculatoria|ejaculatory latency|latenza eiaculatoria|ejakulationslatenz|latence éjaculatoire/i, "ielt"],
  [/\behs\b|erection hardness|dureza de erección|rigidità erezione|erektionshärte|dureté d'érection/i, "ehs"],
  [/\bpedt\b/i, "pedt"],
  [/valsalva/i, "valsalva"],
  [/hipertoní|hipertonia|hypertoni|ipertoni/i, "hipertonia"],
  [/down[- ]training/i, "down-training"],
  [/pompoir/i, "pompoir"],
  [/\bconos?\b|\bcones?\b|\bconi\b|\bvaginalkon|\bcônes?\b/i, "conos"],
  [/isquiocavernos|ischiocavernos|ischio[- ]caverneu/i, "isquiocavernosos"],
  [/bulbospongios|bulbocavernos|bulbo[- ]spongieu/i, "bulbospongioso"],
  [/elevador del ano|levator ani|elevatore dell'ano|élévateur de l'anus/i, "elevador-ano"],
  [/4[- ]?7[- ]?8/i, "respiracion-478"],
  [/stop[- ]start/i, "stop-start"],
  [/50[- ]?70 ?%|intensidad media|intermedi[oa]|intermediate|intermédiair|mittler/i, "hold-intermedio"],
  [/punto de no retorno|point of no return|punto di non ritorno|point de non[- ]retour/i, "punto-no-retorno"],
  [/\bmvc\b/i, "mvc"],
  [/edging|\bedge\b/i, "edging"],
  [/reverse|kegel inverso|kegel inversi|kegel inversé|reverse[- ]kegel/i, "reverse-kegel"],
  [/knack/i, "the-knack"],
  [/\bpfmt\b|cochrane/i, "pfmt"],
  [/anillo (anterior|posterior)|(anterior|posterior) ring|anello (anteriore|posteriore)|(vorder|hinter)er ring|anneau (antérieur|postérieur)|anterior\/posterior|wave|onda|welle|vague/i, "wave"],
  [/escalera|\bladder\b|peldañ|scala|gradini|leiter|stufe|échelle|échelon/i, "ladder"],
  [/elevator|4 pisos|4 floors|4 piani|4 stockwerk|4 étages/i, "elevator"],
  [/flick/i, "flick"],
];

// Aplana un campo (string o multilang map) a un único string que concatena todos
// los idiomas — así KEYWORD_RULES detecta términos sin importar el locale activo.
function _flattenField(v) {
  if (!v) return "";
  if (typeof v === "string") return v;
  if (typeof v === "object") return Object.values(v).filter((x) => typeof x === "string").join(" ");
  return String(v);
}

function getExerciseGlossaryTerms(ex, routine) {
  if (!ex) return [];
  const ids = new Set();
  (TYPE_TERMS[ex.type] || []).forEach((t) => ids.add(t));
  if (ex.reverseEvery) {
    ids.add("reverse-kegel");
    ids.add("hipertonia");
  }
  const text = [ex.name, ex.instruction, routine && routine.description, routine && routine.name]
    .map(_flattenField)
    .filter(Boolean)
    .join(" \n ");
  KEYWORD_RULES.forEach(([re, id]) => {
    if (re.test(text)) ids.add(id);
  });
  // Filtra IDs que existan en GLOSSARY (defensivo).
  return Array.from(ids).filter((id) => GLOSSARY[id]);
}

// Lista ordenada para el glosario global (browse).
function getGlossaryList() {
  const pickFn = window.pick || ((v) => (v && typeof v === "object" ? v.es : v) || "");
  const loc = (window.getLocale && window.getLocale()) || "es";
  return Object.entries(GLOSSARY)
    .filter(([, v]) => v)
    .map(([id, v]) => ({ id, ...v }))
    .sort((a, b) => pickFn(a.term).localeCompare(pickFn(b.term), loc));
}

// ---------- Exposición ----------
window.PRESET_ROUTINES = PRESET_ROUTINES;
window.TRACKS = TRACKS;
window.TRACK_LIST = TRACK_LIST;
window.GOALS = GOALS;
window.WEEKLY_PLANS = WEEKLY_PLANS;
window.TIPS = TIPS;
window.classifyLevel = classifyLevel;
window.nextLevelThresholds = nextLevelThresholds;
window.nextLevelLabel = nextLevelLabel;
window.getRoutinesByTrackLevel = getRoutinesByTrackLevel;
window.getTodayRoutineId = getTodayRoutineId;
window.getRandomTip = getRandomTip;
window.GLOSSARY = GLOSSARY;
window.getExerciseGlossaryTerms = getExerciseGlossaryTerms;
window.getGlossaryList = getGlossaryList;

window.LEVEL_LABEL = {
  beginner: "Principiante",
  intermediate: "Intermedio",
  advanced: "Avanzado",
};

window.AUDIENCE_LABEL = {
  female: "Mujer",
  male: "Hombre",
  all: "Ambos",
  unisex: "Unisex",
};

window.PHASE_LABEL = {
  ready: "Prepárate",
  inhale: "Inhala",
  exhale: "Exhala",
  contract: "Aprieta",
  hold: "Sostén",
  release: "Suelta",
  rest: "Descansa",
  reverse: "Empuja suave",
  peak: "Cima",
  plateau: "Meseta",
  "knack-trigger": "Tose sin soltar",
  "knack-hold": "Mantenlo sin toser",
};

window.PHASE_COLORS = {
  ready: "var(--ink-3)",
  inhale: "var(--phase-inhale, oklch(0.78 0.10 220))",
  exhale: "var(--phase-exhale, oklch(0.72 0.08 230))",
  contract: "var(--phase-contract, var(--accent))",
  hold: "var(--phase-hold, oklch(0.72 0.16 75))",
  release: "var(--phase-release, oklch(0.70 0.10 195))",
  rest: "var(--phase-rest, var(--ink-3))",
  reverse: "var(--phase-reverse, oklch(0.68 0.16 320))",
  peak: "var(--phase-peak, oklch(0.78 0.18 80))",
  plateau: "var(--phase-plateau, oklch(0.70 0.12 180))",
  "knack-trigger": "oklch(0.62 0.20 28)",
  "knack-hold": "var(--phase-hold, oklch(0.72 0.16 75))",
  arousal: "var(--phase-arousal, oklch(0.66 0.20 25))",
};
