{"id":1590,"date":"2025-11-19T19:17:39","date_gmt":"2025-11-19T19:17:39","guid":{"rendered":"https:\/\/amir.tag25.com\/?post_type=product&#038;p=1590"},"modified":"2026-02-11T19:46:26","modified_gmt":"2026-02-11T19:46:26","slug":"curso-mir","status":"publish","type":"product","link":"https:\/\/qa-server.amircolombia.com\/mexico\/examen-mir\/curso-mir\/","title":{"rendered":"CURSO MIR 2028"},"content":{"rendered":"<h2>Tu camino hacia la residencia m\u00e9dica en Espa\u00f1a<\/h2>\n<p>Prep\u00e1rate con el m\u00e9todo que ha llevado a miles de m\u00e9dicos latinoamericanos para alcanzar su sue\u00f1o de especializarse en Espa\u00f1a.<\/p>\n<p>En AMIR aprender\u00e1s con especialistas espa\u00f1oles, una metodolog\u00eda probada durante m\u00e1s de 18 a\u00f1os y el apoyo de tecnolog\u00eda inteligente que personaliza y hace m\u00e1s eficiente tu estudio.<\/p>\n<ul>\n<li>VIRTUAL<\/li>\n<li>PRESENCIAL<\/li>\n<li>H\u00cdBRIDO<\/li>\n<\/ul>\n<p><img fetchpriority=\"high\" decoding=\"async\" src=\"https:\/\/qa-server.amircolombia.com\/mexico\/wp-content\/uploads\/2025\/11\/focused_doctor_writing_notes_with_laptop_nearby_1_1.webp\" sizes=\"(max-width: 2040px) 100vw, 2040px\" srcset=\"https:\/\/qa-server.amircolombia.com\/mexico\/wp-content\/uploads\/2025\/11\/focused_doctor_writing_notes_with_laptop_nearby_1_1.webp 2040w, https:\/\/qa-server.amircolombia.com\/mexico\/wp-content\/uploads\/2025\/11\/focused_doctor_writing_notes_with_laptop_nearby_1_1-300x299.webp 300w, https:\/\/qa-server.amircolombia.com\/mexico\/wp-content\/uploads\/2025\/11\/focused_doctor_writing_notes_with_laptop_nearby_1_1-100x100.webp 100w, https:\/\/qa-server.amircolombia.com\/mexico\/wp-content\/uploads\/2025\/11\/focused_doctor_writing_notes_with_laptop_nearby_1_1-600x599.webp 600w, https:\/\/qa-server.amircolombia.com\/mexico\/wp-content\/uploads\/2025\/11\/focused_doctor_writing_notes_with_laptop_nearby_1_1-1024x1022.webp 1024w, https:\/\/qa-server.amircolombia.com\/mexico\/wp-content\/uploads\/2025\/11\/focused_doctor_writing_notes_with_laptop_nearby_1_1-150x150.webp 150w, https:\/\/qa-server.amircolombia.com\/mexico\/wp-content\/uploads\/2025\/11\/focused_doctor_writing_notes_with_laptop_nearby_1_1-768x766.webp 768w, https:\/\/qa-server.amircolombia.com\/mexico\/wp-content\/uploads\/2025\/11\/focused_doctor_writing_notes_with_laptop_nearby_1_1-1536x1533.webp 1536w, https:\/\/qa-server.amircolombia.com\/mexico\/wp-content\/uploads\/2025\/11\/focused_doctor_writing_notes_with_laptop_nearby_1_1-1200x1198.webp 1200w, https:\/\/qa-server.amircolombia.com\/mexico\/wp-content\/uploads\/2025\/11\/focused_doctor_writing_notes_with_laptop_nearby_1_1-1400x1397.webp 1400w\" alt=\"\" width=\"2040\" height=\"2036\" title=\"\"><\/p>\n<style>\n<p>  \/* Opcional: estilo para marcar el campo con error *\/<br \/>  .campo-error {<br \/>    border-color: #ff0000 !important;<br \/>  }<br \/><\/style>\n<p><img decoding=\"async\" src=\"https:\/\/qa-server.amircolombia.com\/mexico\/wp-content\/uploads\/2025\/11\/freepik_a_25yearold_white_latin_woman_with_a_headset_on_we_75338_1.webp\" sizes=\"(max-width: 528px) 100vw, 528px\" srcset=\"https:\/\/qa-server.amircolombia.com\/mexico\/wp-content\/uploads\/2025\/11\/freepik_a_25yearold_white_latin_woman_with_a_headset_on_we_75338_1.webp 528w, https:\/\/qa-server.amircolombia.com\/mexico\/wp-content\/uploads\/2025\/11\/freepik_a_25yearold_white_latin_woman_with_a_headset_on_we_75338_1-300x230.webp 300w\" alt=\"\" width=\"528\" height=\"404\" title=\"\"><\/p>\n<h2>Nuestros asesores expertos<\/h2>\n<h2>te guiar\u00e1n en cada paso&#8230;<\/h2>\n<style type=\"text\/css\">\n\/* Healthcademia Default Form CSS *\/\n\/* ===================================\n   VARIABLES CSS PERSONALIZABLES\n   =================================== *\/\n:root {\n    \/* Espaciados *\/\n    --hc-container-padding: 30px;\n    --hc-field-margin: 18px;\n    --hc-name-row-gap: 16px;\n    --hc-header-gap: 12px;\n    --hc-checkbox-gap: 8px;\n    --hc-phone-prefix-gap: 16px;\n    \n    \/* Bordes y radios *\/\n    --hc-container-radius: 16px;\n    --hc-input-radius: 8px;\n    --hc-input-border-width: 1px;\n    \n    \/* Colores *\/\n    --hc-bg-color: #fff;\n    --hc-border-color: #d6d6d6;\n    --hc-container-border-color: #e0e0e0;\n    --hc-primary-color: #1976d2;\n    --hc-error-color: #d32f2f;\n    --hc-error-color-bg: #fff5f7;\n    --hc-text-color: #333;\n    --hc-label-color: #999;\n    \n    \/* Tipograf\u00eda *\/\n    --hc-font-family: \"Inter\", Arial, sans-serif;\n    --hc-input-font-size: 15px;\n    --hc-label-font-size: 15px;\n    --hc-label-font-size-small: 12px;\n    --hc-checkbox-font-size: 14px;\n    \n    \/* Transiciones *\/\n    --hc-transition-duration: 0.2s;\n    --hc-transition-timing: ease;\n    \n    \/* Tama\u00f1os espec\u00edficos *\/\n    --hc-input-padding: 5px 10px 7px 10px;\n    --hc-textarea-min-height: 110px;\n    --hc-focus-shadow-size: 2px;\n    --hc-button-padding: 14px 24px;\n    --hc-phone-prefix-width: 120px;\n}\n\n\/* ===================================\n   ESTILOS DEL FORMULARIO\n   =================================== *\/\n\n\/* Healthcademia Default Form Styles *\/\n.hc-form-container {\n    background: var(--hc-bg-color);\n    border-radius: var(--hc-container-radius);\n    padding: var(--hc-container-padding);\n    border: var(--hc-input-border-width) solid var(--hc-container-border-color);\n    position: relative;\n    font-family: var(--hc-font-family);\n}\n\n.hc-form-header {\n    display: flex;\n    flex-direction: column;\n    align-items: center;\n    gap: var(--hc-header-gap);\n    margin-bottom: var(--hc-header-gap);\n}\n\n.hc-form {\n    display: flex;\n    flex-direction: column;\n}\n\n\/* Nombre y apellidos en horizontal *\/\n.hc-name-row {\n    display: flex;\n    gap: var(--hc-name-row-gap);\n    margin-bottom: var(--hc-field-margin);\n}\n\n.hc-name-row .hc-field {\n    flex: 1;\n    margin-bottom: 0;\n}\n\n\/* Responsive: en m\u00f3viles volver a vertical *\/\n@media (max-width: 640px) {\n    .hc-name-row {\n        flex-direction: column;\n        gap: 0;\n    }\n    \n    .hc-name-row .hc-field {\n        margin-bottom: var(--hc-field-margin);\n    }\n    .hc-name-row .hc-field:last-child {\n        margin-bottom: 0;\n    }\n}\n\n.hc-form-header h2,\n.hc-form-title {\n    margin: 0;\n}\n\n.hc-field {\n    margin-bottom: var(--hc-field-margin);\n    position: relative;\n    display: flex;\n    flex-direction: column;\n}\n\n.hc-input,\n.hc-textarea,\n.hc-select {\n    width: 100%;\n    border: var(--hc-input-border-width) solid var(--hc-border-color);\n    border-radius: var(--hc-input-radius);\n    padding: var(--hc-input-padding);\n    font-size: var(--hc-input-font-size);\n    transition: border-color var(--hc-transition-duration) var(--hc-transition-timing), \n                box-shadow var(--hc-transition-duration) var(--hc-transition-timing);\n    background: var(--hc-bg-color);\n    font-family: var(--hc-font-family);\n}\n\n.hc-input:focus,\n.hc-textarea:focus,\n.hc-select:focus {\n    border-color: var(--hc-primary-color);\n    box-shadow: 0 0 0 var(--hc-focus-shadow-size) rgba(25, 118, 210, 0.2);\n    outline: none;\n}\n\n.hc-input.hc-error,\n.hc-textarea.hc-error,\n.hc-select.hc-error {\n    border-color: var(--hc-error-color);\n    background-color: var(--hc-error-color-bg);\n}\n\n.hc-textarea {\n    min-height: var(--hc-textarea-min-height);\n    resize: vertical;\n}\n\n.hc-checkbox-group label {\n    display: flex;\n    align-items: center;\n    gap: var(--hc-checkbox-gap);\n    font-size: var(--hc-checkbox-font-size);\n}\n\n\/* Estilos para checkbox con error *\/\n.hc-checkbox-group label.hc-error {\n    color: var(--hc-error-color);\n}\n\n.hc-checkbox-group input[type=\"checkbox\"].hc-error {\n    accent-color: var(--hc-error-color);\n}\n\n.hc-checkbox-group input[type=\"checkbox\"].hc-error + span {\n    color: var(--hc-error-color);\n}\n\n.hc-submit {\n    width: 100%;\n    background: var(--hc-primary-color);\n    color: #fff;\n    border: none;\n    padding: var(--hc-button-padding);\n    border-radius: var(--hc-input-radius);\n    font-size: 16px;\n    font-weight: 600;\n    margin-top: var(--hc-name-row-gap);\n    cursor: pointer;\n    transition: background var(--hc-transition-duration) var(--hc-transition-timing);\n}\n\n.hc-submit:hover {\n    background: #135ba8;\n}\n\n.hc-form-spinner {\n    position: absolute;\n    inset: 0;\n    background: rgba(255, 255, 255, 0.85);\n    display: flex;\n    align-items: center;\n    justify-content: center;\n    opacity: 0;\n    pointer-events: none;\n    transition: opacity var(--hc-transition-duration) var(--hc-transition-timing);\n    border-radius: var(--hc-container-radius);\n}\n\n.hc-form-container.is-loading .hc-form-spinner {\n    opacity: 1;\n    pointer-events: all;\n}\n\n.hc-form-container.is-loading .hc-form {\n    opacity: 0.5;\n}\n\n.hc-spinner {\n    width: 48px;\n    height: 48px;\n    border: 4px solid rgba(25, 118, 210, 0.2);\n    border-top-color: #1976d2;\n    border-radius: 50%;\n    animation: hc-spin 0.8s linear infinite;\n}\n\n@keyframes hc-spin {\n    to {\n        transform: rotate(360deg);\n    }\n}\n\n.hc-field.floating .hc-floating-inner {\n    position: relative;\n    width: 100%;\n    display: flex;\n}\n\n.hc-field.floating .hc-floating-inner label {\n    position: absolute;\n    top: 50%;\n    left: 12px;\n    transform: translateY(-50%);\n    color: var(--hc-label-color);\n    pointer-events: none;\n    transition: var(--hc-transition-duration) var(--hc-transition-timing);\n    background: var(--hc-bg-color);\n    padding: 0 4px;\n    font-size: 14px;\n    font-weight: 400;\n}\n\n.hc-field.floating .hc-floating-inner .hc-input,\n.hc-field.floating .hc-floating-inner .hc-textarea {\n    padding: 10px 10px 6px;\n    width: 100%\n}\n\n.grecaptcha-badge{\n    display: none !important;\n}\n\n.hc-field.floating .hc-floating-inner .hc-input:focus+label,\n.hc-field.floating .hc-floating-inner .hc-textarea:focus+label,\n.hc-field.floating .hc-floating-inner .hc-input:not(:placeholder-shown)+label,\n.hc-field.floating .hc-floating-inner .hc-textarea:not(:placeholder-shown)+label {\n    top: 0px;\n    font-size: var(--hc-label-font-size-small);\n    color: var(--hc-text-color);\n    font-weight: 600;\n}\n\n\/* Label con fondo rojo cuando el input tiene error *\/\n.hc-field.floating .hc-floating-inner .hc-input.hc-error+label,\n.hc-field.floating .hc-floating-inner .hc-textarea.hc-error+label {\n    background-color: var(--hc-error-color-bg);\n    color: var(--hc-error-color);\n}\n\n.co-feedback-container{\n    display: none !important;\n}\n\n.hc-phone-field .hc-phone-wrapper {\n    display: flex;\n    gap: var(--hc-name-row-gap);\n    flex-direction: row;\n}\n\n.hc-phone-field.floating .hc-floating-inner label {\n    top: 0px !important;\n    z-index: 11 !important;\n}\n\n\/* Label del campo de tel\u00e9fono con fondo rojo cuando hay error *\/\n.hc-phone-field.floating .hc-floating-inner .hc-phone-input-wrapper input.hc-error+label {\n    background-color: var(--hc-error-color-bg) !important;\n    color: var(--hc-error-color) !important;\n}\n.hc-phone-wrapper .hc-select-block,\n.hc-phone-wrapper .hc-field {\n    flex: 1;\n    min-width: 160px;\n}\n\n.hc-select-block label {\n    display: block;\n    font-size: 12px;\n    font-weight: 600;\n    text-transform: uppercase;\n    letter-spacing: 0.04em;\n    color: #666;\n    margin-bottom: 6px;\n}\n\n.hc-form-default {\n    border: 1px dashed #bbb;\n    padding: 16px;\n    margin-bottom: 20px;\n    background: #fafafa;\n    font-style: italic;\n    color: #555;\n    text-align: center;\n}\n\n\/* Grid 2x2 para los selects de programa *\/\n.hc-selects-grid {\n    display: grid;\n    grid-template-columns: repeat(2, 1fr);\n    gap: 16px;\n}\n\n\/* Si el grid est\u00e1 vac\u00edo (sin selects), quitar el margin *\/\n.hc-selects-grid:empty {\n    margin-bottom: 0;\n    display: none;\n}\n\n\/* Skeleton Loading Styles - Barra horizontal \u00fanica *\/\n.hc-skeleton-field {\n    position: relative;\n    overflow: hidden;\n    margin-bottom: 18px;\n}\n\n.hc-skeleton {\n    width: 100%;\n    height: 35px;\n    background: #f0f0f0;\n    border-radius: 8px;\n    position: relative;\n    overflow: hidden;\n}\n\n.hc-skeleton-line {\n    width: 100%;\n    height: 100%;\n    background: linear-gradient(\n        90deg,\n        #f0f0f0 0%,\n        #e0e0e0 50%,\n        #f0f0f0 100%\n    );\n    background-size: 200% 100%;\n    animation: skeleton-loading 1.5s ease-in-out infinite;\n}\n\n@keyframes skeleton-loading {\n    0% {\n        background-position: 200% 0;\n    }\n    100% {\n        background-position: -200% 0;\n    }\n}\n\n\/* Si el grid tiene un \u00faltimo hijo, a\u00f1adir margin-bottom *\/\n.hc-selects-grid:has(:last-child) {\n    margin-bottom: 16px;\n}\n\n\/* Resetear margin-bottom de los campos dentro del grid *\/\n.hc-selects-grid .hc-field {\n    margin-bottom: 0;\n}\n\n\/* Si hay 1 select: 100% *\/\n.hc-selects-grid .hc-field:only-child {\n    grid-column: 1 \/ -1;\n}\n\n\/* Si hay 3 selects: el tercero ocupa 100% *\/\n.hc-selects-grid .hc-field:nth-child(3):nth-last-child(1) {\n    grid-column: 1 \/ -1;\n}\n\n.hc-form-status {\n    font-size: 14px;\n}\n\n.hc-form-status.success {\n    color: #2e7d32;\n}\n\n.hc-form-status.error {\n    color: #c62828;\n    text-align: center;\n    padding-top: 15px;\n}\n\n\/* Mensaje de \u00e9xito fuera del formulario (solo cuando no hay redirect) *\/\n.hc-form-success-message {\n    min-height: 20px;\n    font-size: 18px;\n    text-align: center;\n    padding: 15px;\n    margin-top: 20px;\n    margin-bottom: 20px;\n    border-radius: var(--hc-input-radius);\n    background-color: #f1f8f4;\n    color: #2e7d32;\n    font-weight: 500;\n}\n\n.hc-form-success-message.success {\n    color: #2e7d32;\n}\n\n\/* Cuando el formulario tiene \u00e9xito, ocultar el formulario y centrar el mensaje *\/\n.hc-form-container.hc-form-success {\n    display: flex;\n    flex-direction: column;\n    align-items: center;\n    justify-content: center;\n    min-height: 300px;\n    padding: 40px 30px;\n}\n\n.hc-form-container.hc-form-success .hc-form-header {\n    display: none !important;\n}\n\n.hc-form-container.hc-form-success .hc-form {\n    display: none !important;\n}\n\n.hc-form-container.hc-form-success .hc-form-spinner {\n    display: none !important;\n}\n\n.hc-form-container.hc-form-success .hc-form-status {\n    display: block !important;\n    width: 90%;\n    max-width: 600px;\n    text-align: center;\n    font-size: 20px;\n    font-weight: 500;\n    line-height: 1.6;\n    padding: 30px;\n    margin: 0;\n    color: #2e7d32;\n    background-color: #f1f8f4;\n    border: 0px;\n}\n\n.hc-form-container.hc-form-success .hc-form-status.success {\n    color: #2e7d32;\n}\n\n\/* ===== Sistema adaptativo de tel\u00e9fono ===== *\/\n\n\/* Por defecto: selector de prefijos OCULTO (para Form Guard \/ None) *\/\n.hc-phone-field-simple .hc-phone-prefix {\n    display: none !important;\n}\n\n.hc-phone-field-simple .hc-floating-inner {\n    display: block;\n}\n\n.hc-phone-field-simple .hc-phone-input-wrapper {\n    width: 100%;\n    display: flex;\n}\n\n\/* Cuando se necesita selector (clearoutphone): mostrar en flex *\/\n.hc-phone-field-with-prefix .hc-phone-prefix {\n    display: block !important;\n    width: var(--hc-phone-prefix-width);\n    flex-shrink: 0;\n}\n\n.hc-phone-field-with-prefix .hc-floating-inner {\n    display: flex;\n    gap: var(--hc-phone-prefix-gap);\n    align-items: stretch;\n}\n\n.hc-phone-field-with-prefix .hc-phone-input-wrapper {\n    flex: 1;\n    position: relative;\n    display: flex;\n    flex-direction: row;\n}\n\n.hc-phone-input-wrapper > .co-input-container {\n    display: flex !important;\n}\n\n.hc-phone-input-wrapper input[type=\"tel\"] {\n    display: flex !important;\n}\n\n\/* Labels flotantes funcionan en ambos modos *\/\n.hc-phone-input-wrapper {\n    position: relative;\n}\n\n.hc-phone-input-wrapper label {\n    position: absolute;\n    left: 12px;\n    top: 50%;\n    transform: translateY(-50%);\n    transition: all var(--hc-transition-duration) var(--hc-transition-timing);\n    pointer-events: none;\n    color: var(--hc-label-color);\n    font-size: var(--hc-label-font-size);\n}\n\n.hc-phone-input-wrapper input:focus + label,\n.hc-phone-input-wrapper input:not(:placeholder-shown) + label {\n    top: -8px;\n    font-size: var(--hc-label-font-size-small);\n    background: var(--hc-bg-color);\n}\n\n.hc-phone-input-wrapper input.hc-error + label {\n    background-color: var(--hc-error-color-bg) !important;\n    color: var(--hc-error-color) !important;\n    padding: 0 4px;\n}\n\n\/* Estilos de error para campos de tel\u00e9fono *\/\n.hc-phone-prefix.hc-error {\n    border-color: var(--hc-error-color) !important;\n    background-color: var(--hc-error-color-bg) !important;\n    box-shadow: 0 0 0 var(--hc-focus-shadow-size) rgba(220, 53, 69, 0.25);\n}\n\n.hc-phone-input-wrapper input.hc-error {\n    border-color: var(--hc-error-color) !important;\n    background-color: var(--hc-error-color-bg) !important;\n}\n\n\/* ===================================\n   PERSONALIZACI\u00d3N\n   ===================================\n   \n   Para personalizar el formulario, puedes sobreescribir las variables CSS\n   en tu archivo de CSS personalizado (healthcademia-zoho-css.php):\n   \n   Ejemplo:\n   \n   :root {\n       --hc-primary-color: #ff5722;\n       --hc-container-radius: 24px;\n       --hc-name-row-gap: 20px;\n   }\n   \n   Variables disponibles:\n   \n   Espaciados:\n   - --hc-container-padding\n   - --hc-field-margin\n   - --hc-name-row-gap\n   - --hc-header-gap\n   - --hc-checkbox-gap\n   - --hc-phone-prefix-gap\n   \n   Bordes:\n   - --hc-container-radius\n   - --hc-input-radius\n   - --hc-input-border-width\n   \n   Colores:\n   - --hc-primary-color\n   - --hc-error-color\n   - --hc-bg-color\n   - --hc-border-color\n   - --hc-text-color\n   - --hc-label-color\n   \n   Tipograf\u00eda:\n   - --hc-font-family\n   - --hc-input-font-size\n   - --hc-label-font-size\n   - --hc-checkbox-font-size\n   \n   Otros:\n   - --hc-transition-duration\n   - --hc-button-padding\n   - --hc-phone-prefix-width\n   \n=================================== *\/\n<\/style>\n<style type=\"text\/css\">\n\/* Healthcademia Custom CSS *\/\n\/* ============================================\r\n   Healthcademia Form - CSS Personalizado\r\n   ============================================\r\n   Personaliza las clases principales del formulario.\r\n   Edita los valores seg\u00fan tus necesidades de dise\u00f1o.\r\n   ============================================ *\/\r\n\r\n:root {\r\n    \/* Color principal del formulario *\/\r\n    --hc-primary-color: #b8be15;\r\n    \r\n    \/* Hacer el formulario m\u00e1s compacto *\/\r\n    --hc-container-padding: 0px;\r\n    --hc-field-margin: 12px;\r\n    --hc-name-row-gap: 18px;\r\n    \r\n    \/* Bordes m\u00e1s redondeados *\/\r\n    --hc-container-radius: 24px;\r\n    --hc-input-radius: 12px;\r\n    \r\n    \/* Fuente m\u00e1s grande *\/\r\n    --hc-input-font-size: 16px;\r\n}\r\n\r\n\/* ============================================\r\n   CONTENEDOR PRINCIPAL\r\n   ============================================ *\/\r\n.hc-form-container {\r\n    background: transparent !important;\r\n    border-radius: 0px;\r\n    \/* padding: 30px; *\/\r\n    border: 0px solid #e0e0e0; \r\nmargin-top: 20px;\r\n    \/* font-family: \"Inter\", Arial, sans-serif; *\/\r\n}\r\n\r\n\/* ============================================\r\n   HEADER DEL FORMULARIO\r\n   ============================================ *\/\r\n.hc-form-header {\r\n\r\n}\r\n\r\n.hc-form-title {\r\n\r\n}\r\n\r\n\/* ============================================\r\n   FORMULARIO\r\n   ============================================ *\/\r\n.hc-form {\r\n\r\n}\r\n\r\n\/* ============================================\r\n   CAMPOS DEL FORMULARIO\r\n   ============================================ *\/\r\n.hc-field {\r\n\r\n}\r\n\r\n\/* ============================================\r\n   INPUTS, TEXTAREAS Y SELECTS\r\n   ============================================ *\/\r\n.hc-input,\r\n.hc-textarea,\r\n.hc-select {\r\n    border: 1px solid #acaeaf !important; \r\nborder-radius: 5px !important;\r\n    \/* background: #fff; *\/\r\nfont-size: 14px !important;\r\n\r\n}\r\n\r\n\/* Estados de focus *\/\r\n.hc-input:focus,\r\n.hc-textarea:focus,\r\n.hc-select:focus {\r\n    \/* border-color: #1976d2; *\/\r\n    \/* box-shadow: 0 0 0 2px rgba(25, 118, 210, 0.2); *\/\r\n}\r\n\r\n\/* Estados de error *\/\r\n.hc-input.hc-error,\r\n.hc-textarea.hc-error,\r\n.hc-select.hc-error {\r\n    \/* border-color: #d32f2f; *\/\r\n}\r\n\r\n\/* Textarea espec\u00edfico *\/\r\n.hc-textarea {\r\n\r\n}\r\n\r\n\/* ============================================\r\n   CAMPOS FLOTANTES (Floating Labels)\r\n   ============================================ *\/\r\n\r\n.hc-phone-field.floating .hc-floating-inner label{\r\nfont-size: 12px;\r\nborder-radius: 5px;\r\n}\r\n\r\n.hc-field.floating .hc-floating-inner label {\r\nwidth: auto;\r\n\r\n\r\n}\r\n\r\n.hc-field.floating .hc-floating-inner .hc-input:focus + label,\r\n.hc-field.floating .hc-floating-inner .hc-textarea:focus + label,\r\n.hc-field.floating .hc-floating-inner .hc-input:not(:placeholder-shown) + label,\r\n.hc-field.floating .hc-floating-inner .hc-textarea:not(:placeholder-shown) + label {\r\nfont-size: 12px;\r\nborder-radius: 5px;\r\n}\r\n\r\n\/* ============================================\r\n   CAMPO DE TEL\u00c9FONO\r\n   ============================================ *\/\r\n.hc-phone-field .hc-phone-wrapper {\r\n\r\n}\r\n\r\n.hc-select-block label {\r\n    \/* color: #666; *\/\r\n}\r\n\r\n\r\n\/* ============================================\r\n   CHECKBOXES\r\n   ============================================ *\/\r\n.hc-checkbox-group label {\r\nfont-size: 12px; \r\nline-height: 1.1em;\r\nmargin-bottom: 5px;\r\n}\r\n\r\n.hc-checkbox-group label a{\r\ntext-decoration: underline !important;\r\n}\r\n.hc-checkbox-group label.hc-error {\r\n    \/* color: #d32f2f; *\/\r\n}\r\n\r\n\/* ============================================\r\n   BOT\u00d3N DE ENV\u00cdO\r\n   ============================================ *\/\r\n.hc-submit {\r\n    \/* background: #1976d2; *\/\r\n    \/* color: #fff; *\/\r\n}\r\n\r\n.hc-submit:hover {\r\n    background: #bcca30;\r\n}\r\n\r\n.hc-submit:active {\r\n    \/* transform: scale(0.98); *\/\r\n}\r\n\r\n\/* ============================================\r\n   SPINNER DE CARGA\r\n   ============================================ *\/\r\n.hc-form-spinner {\r\n    \/* background: rgba(255, 255, 255, 0.85); *\/\r\n}\r\n\r\n.hc-spinner {\r\n    \/* width: 48px; *\/\r\n    \/* height: 48px; *\/\r\n    \/* border: 4px solid rgba(25, 118, 210, 0.2); *\/\r\n    \/* border-top-color: #1976d2; *\/\r\n}\r\n\r\n\/* ============================================\r\n   MENSAJES DE ESTADO\r\n   ============================================ *\/\r\n.hc-form-status.success {\r\n    \/* color: #2e7d32; *\/\r\n}\r\n\r\n.hc-form-status.error {\r\n    \/* color: #c62828; *\/\r\n}\r\n\r\n\/* ============================================\r\n   ESTADO DE \u00c9XITO (Formulario oculto)\r\n   ============================================ *\/\r\n.hc-form-container.hc-form-success {\r\n\r\n}\r\n\r\n.hc-form-container.hc-form-success .hc-form-status {\r\n    \/* background-color: #f1f8f4; *\/\r\n    \/* color: #2e7d32; *\/\r\n}\r\n\r\n\/* ============================================\r\n   RESPONSIVE (Ejemplo)\r\n   ============================================ *\/\r\n@media screen and (max-width: 768px) {\r\n    .hc-form-container {\r\n\r\n    }\r\n    \r\n    .hc-phone-field .hc-phone-wrapper {\r\n\r\n    }\r\n    \r\n    .hc-selects-grid {\r\n\r\n    }\r\n}\r\n\r\n\/* ============================================\r\n   PERSONALIZACIONES ADICIONALES\r\n   ============================================ *\/\r\n\/* A\u00f1ade tus estilos personalizados aqu\u00ed *\/\n<\/style>\n<div class=\"healthcademia-form-wrapper\" data-form-id=\"formulario-base\" data-redirect=\"\" data-privacy-url=\"https:\/\/qa-server.amircolombia.com\/mexico\/privacy-policy\/\" data-success-message=\"\u00a1Hemos recibido tus datos! Nos pondremos en contacto contigo muy pronto.\" data-rest-nonce=\"7ec5f95548\" data-region=\"LATAM\" data-recaptcha-key=\"6Lf_bScsAAAAAABqrIROKvoQD5XOzjoGTUmhKA-x\"><div class=\"hc-form-container\" id=\"hc_form_1\"\n     data-rest-leads=\"https:\/\/qa-server.amircolombia.com\/mexico\/wp-json\/healthcademia\/v1\/leads\"\n     data-rest-programs=\"https:\/\/qa-server.amircolombia.com\/mexico\/wp-json\/healthcademia\/v1\/programas\"\n     data-rest-nonce=\"7ec5f95548\"\n     data-program-id=\"1873\"\n     data-redirect=\"\"\n     data-region=\"LATAM\"\n     data-country-prefixes=\"{&quot;Espa\u00f1a&quot;:&quot;+34&quot;,&quot;Argentina&quot;:&quot;+54&quot;,&quot;Chile&quot;:&quot;+56&quot;,&quot;Colombia&quot;:&quot;+57&quot;,&quot;M\u00e9xico&quot;:&quot;+52&quot;,&quot;Per\u00fa&quot;:&quot;+51&quot;,&quot;Venezuela&quot;:&quot;+58&quot;,&quot;Otro&quot;:&quot;&quot;}\"\n     data-clearout-key=\"6c7990b80c6b598123f804ec0066078d:bcd9da28edee065eb67bbf61caf6e128fcc207a8efd7a710acd0ce72542f716c\" data-display-config=\"{&quot;convocatoria&quot;:false,&quot;sede&quot;:false,&quot;modalidad&quot;:false,&quot;edicion&quot;:false}\">\n    <form class=\"hc-form hc-api-form\" novalidate>\n        <input type=\"hidden\" name=\"program_id\" value=\"1873\">\n        <input type=\"hidden\" name=\"program_name\" value=\"\">\n        \n        <div class=\"hc-name-row\">\n            <div class=\"hc-field floating\">\n                <div class=\"hc-floating-inner\">\n                    <input type=\"text\" name=\"first_name\" class=\"hc-input\" placeholder=\" \" data-only-letters=\"true\" required>\n                    <label>Nombre *<\/label>\n                <\/div>\n            <\/div>\n            <div class=\"hc-field floating\">\n                <div class=\"hc-floating-inner\">\n                    <input type=\"text\" name=\"last_name\" class=\"hc-input\" placeholder=\" \" data-only-letters=\"true\" required>\n                    <label>Apellidos *<\/label>\n                <\/div>\n            <\/div>\n        <\/div>\n        <div class=\"hc-field floating\">\n            <div class=\"hc-floating-inner\">\n                <input type=\"email\" name=\"email\" class=\"hc-input\" placeholder=\" \" value=\"\" required>\n                <label>Correo electr\u00f3nico *<\/label>\n            <\/div>\n        <\/div>\n                <div class=\"hc-field hc-phone-field floating hc-phone-field-with-prefix\">\n            <div class=\"hc-floating-inner\">\n                <!-- Selector de prefijos (solo visible para clearoutphone) -->\n                <select name=\"phone_prefix\" class=\"hc-select hc-phone-prefix\">\n                    <option value=\"+34\" data-country=\"ES\">ES +34<\/option>\n                    <!-- Centroam\u00e9rica -->\n                    <option value=\"+52\" data-country=\"MX\">MX +52<\/option>\n                    <option value=\"+502\" data-country=\"GT\">GT +502<\/option>\n                    <option value=\"+503\" data-country=\"SV\">SV +503<\/option>\n                    <option value=\"+504\" data-country=\"HN\">HN +504<\/option>\n                    <option value=\"+505\" data-country=\"NI\">NI +505<\/option>\n                    <option value=\"+506\" data-country=\"CR\">CR +506<\/option>\n                    <option value=\"+507\" data-country=\"PA\">PA +507<\/option>\n                    <option value=\"+501\" data-country=\"BZ\">BZ +501<\/option>   \n                    <option value=\"+509\" data-country=\"HT\">HT +509<\/option>     \n\n                    <!-- Caribe LATAM (NANP con m\u00faltiples prefijos) -->\n                    <option value=\"+1809\" data-country=\"DO\">DO +1809<\/option>\n                    <option value=\"+1829\" data-country=\"DO\">DO +1829<\/option>\n                    <option value=\"+1849\" data-country=\"DO\">DO +1849<\/option>\n                    <option value=\"+1787\" data-country=\"PR\">PR +1787<\/option>\n                    <option value=\"+1939\" data-country=\"PR\">PR +1939<\/option>\n                    <option value=\"+53\"   data-country=\"CU\">CU +53<\/option>\n                    <option value=\"+1876\" data-country=\"JM\">JM +1876<\/option>\n\n                    <!-- Sudam\u00e9rica -->\n                    <option value=\"+57\"  data-country=\"CO\" selected>CO +57<\/option>\n                    <option value=\"+58\"  data-country=\"VE\">VE +58<\/option>\n                    <option value=\"+593\" data-country=\"EC\">EC +593<\/option>\n                    <option value=\"+51\"  data-country=\"PE\">PE +51<\/option>\n                    <option value=\"+591\" data-country=\"BO\">BO +591<\/option>\n                    <option value=\"+56\"  data-country=\"CL\">CL +56<\/option>\n                    <option value=\"+54\"  data-country=\"AR\">AR +54<\/option>\n                    <option value=\"+598\" data-country=\"UY\">UY +598<\/option>\n                    <option value=\"+595\" data-country=\"PY\">PY +595<\/option>\n                    <option value=\"+55\"  data-country=\"BR\">BR +55<\/option>\n                    <option value=\"+592\" data-country=\"GY\">GY +592<\/option>   \n                    <option value=\"+597\" data-country=\"SR\">SR +597<\/option> \n                    <option value=\"+594\" data-country=\"GF\">GF +594<\/option> \n                <\/select>\n                <div class=\"hc-phone-input-wrapper\">\n                                        <input type=\"tel\" name=\"phone\" class=\"hc-input\" placeholder=\"612 345 678\" data-clearout-phone-field value=\"\" required>\n                    <label>Tel\u00e9fono *<\/label>\n                <\/div>\n            <\/div>\n        <\/div>\n\n        \n        <input type=\"hidden\" name=\"utm_campaign\">\n        <input type=\"hidden\" name=\"utm_source\">\n        <input type=\"hidden\" name=\"utm_medium\">\n        <input type=\"hidden\" name=\"utm_term\">\n        <input type=\"hidden\" name=\"utm_content\">\n        <input type=\"hidden\" name=\"traffic_source\" value=\"\">\n        <input type=\"hidden\" name=\"lead_source\" value=\"P\u00e1gina Web\">\n        <input type=\"hidden\" name=\"tipo_origen\" value=\"Digital\">\n        <input type=\"hidden\" name=\"lead_status\" value=\"Sin Gesti\u00f3n\">\n        <input type=\"hidden\" name=\"region\" value=\"LATAM\">\n        <!-- Campo oculto para capturar GCLID de Google Ads (Zoho CRM) -->\n        <input type=\"hidden\" id=\"zc_gad\" name=\"zc_gad\" value=\"\">\n\n        <div class=\"hc-checkbox-group hc-legal-checkboxes\">\n            <label>\n                <input type=\"checkbox\" name=\"privacy\" required>\n                <span>Acepto la <a href=\"https:\/\/qa-server.amircolombia.com\/mexico\/privacy-policy\/\" data-privacy-link=\"true\" target=\"_blank\" rel=\"noopener\">pol\u00edtica de privacidad<\/a> *<\/span>\n            <\/label>\n        <\/div>\n        <div class=\"hc-checkbox-group\">\n            <label>\n                <input type=\"checkbox\" name=\"marketing\">\n                <span>Acepto recibir comunicaciones comerciales<\/span>\n            <\/label>\n        <\/div>\n\n        <div class=\"hc-form-status\" aria-live=\"polite\"><\/div>\n        <button type=\"submit\" class=\"hc-submit\">ASESOR\u00cdA PERSONALIZADA<\/button>\n    <\/form>\n    <div class=\"hc-form-success-message\" aria-live=\"polite\" style=\"display: none;\"><\/div>\n    <div class=\"hc-form-spinner\" aria-hidden=\"true\">\n        <div class=\"hc-spinner\"><\/div>\n    <\/div>\n<\/div>\n<script>\ndocument.addEventListener('DOMContentLoaded', function() {\n    const form = document.querySelector('#hc_form_1 .hc-api-form');\n    \n    if (form) {\n        form.addEventListener('submit', function(e) {\n            \/\/ Enviar evento a Google Tag Manager\n            window.dataLayer = window.dataLayer || [];\n            window.dataLayer.push({\n                'event': 'form_submit',\n                'formId': 'hc_form_1',\n                'formName': 'healthcademia_lead_form'\n            });\n        });\n    }\n});\n<\/script>\n\n<\/div><script src=\"https:\/\/www.google.com\/recaptcha\/api.js?render=6Lf_bScsAAAAAABqrIROKvoQD5XOzjoGTUmhKA-x\"><\/script>\n<script type=\"text\/javascript\">\n\/* Healthcademia Default Form JS *\/\n(function() {\n    \/\/ Funci\u00f3n para inicializar el formulario\n    function initForm() {\n        \/\/ Buscar el contenedor - intentar varias formas\n        let container = document.getElementById('hc_form_1_7888');\n        \n        \/\/ Si no se encuentra, buscar por clase como fallback\n        if (!container) {\n            const containers = document.querySelectorAll('.hc-form-container');\n            if (containers.length > 0) {\n                container = containers[containers.length - 1]; \/\/ Tomar el \u00faltimo\n            }\n        }\n        \n        if (!container) {\n            return false;\n        }\n\n        const form = container.querySelector('form');\n        if (!form) {\n            return false;\n        }\n        \n        \/\/ Asegurarse de que el formulario no se env\u00ede de forma tradicional\n        form.setAttribute('novalidate', 'novalidate');\n        if (form.hasAttribute('action')) {\n            form.removeAttribute('action');\n        }\n        if (form.hasAttribute('method')) {\n            form.removeAttribute('method');\n        }\n    \n    const wrapper = container.closest('.healthcademia-form-wrapper');\n    const endpoints = {\n        leads: container.dataset.restLeads,\n        programs: container.dataset.restPrograms\n    };\n    const restNonce = (wrapper && wrapper.dataset.restNonce) || container.dataset.restNonce || '';\n    const redirectUrl = ((wrapper && wrapper.dataset.redirect) || container.dataset.redirect || '').trim();\n    const privacyUrl = (wrapper && wrapper.dataset.privacyUrl) || '';\n    const successMessage = (wrapper && wrapper.dataset.successMessage) || '\u00a1Hemos recibido tus datos! Nos pondremos en contacto contigo muy pronto.';\n    const recaptchaSiteKey = (wrapper && wrapper.dataset.recaptchaKey) || '';\n    const programId = container.dataset.programId;\n    let countryPrefixes = {};\n    let defaultRegion = container.dataset.region || '';\n    try {\n        countryPrefixes = JSON.parse(container.dataset.countryPrefixes || '{}');\n    } catch (error) {\n        countryPrefixes = {};\n    }\n    \/\/ JavaScript solo recoge la respuesta del servidor\n    const emailInput = form.querySelector('input[name=\"email\"]');\n    const phoneInput = form.querySelector('input[name=\"phone\"]');\n    const countrySelect = form.querySelector('select[name=\"country\"]');\n    const regionInput = form.querySelector('input[name=\"region\"]');\n    const statusBox = container.querySelector('.hc-form-status');\n    const successMessageBox = container.querySelector('.hc-form-success-message');\n\n    const setStatus = (state, message) => {\n        if (!statusBox) {\n            return;\n        }\n        if (message) {\n            statusBox.textContent = message;\n            statusBox.className = 'hc-form-status ' + state;\n            statusBox.style.display = 'block';\n        } else {\n            statusBox.textContent = '';\n            statusBox.className = 'hc-form-status';\n            statusBox.style.display = '';\n        }\n    };\n\n    const setSuccessMessage = (message) => {\n        if (!successMessageBox) {\n            return;\n        }\n        if (message) {\n            successMessageBox.textContent = message;\n            successMessageBox.className = 'hc-form-success-message success';\n            successMessageBox.style.display = 'block';\n        } else {\n            successMessageBox.textContent = '';\n            successMessageBox.style.display = 'none';\n        }\n    };\n\n    const setLoading = (flag) => {\n        if (!container) return;\n        if (flag) {\n            container.classList.add('is-loading');\n        } else {\n            container.classList.remove('is-loading');\n        }\n    };\n\n    \/\/ Sanitizar tel\u00e9fono: eliminar todo excepto n\u00fameros, +, (, ), -, ., espacios\n    \/\/ Esto se usa solo al enviar al servidor, no en tiempo real\n    const sanitizePhone = (value) => (value || '').replace(\/[^0-9+()\\-\\s.]\/g, '');\n    \n    \/\/ Funci\u00f3n para permitir caracteres est\u00e1ndar de tel\u00e9fono mientras el usuario escribe\n    \/\/ Permite: n\u00fameros, +, (, ), -, ., espacios\n    \/\/ Ejemplos v\u00e1lidos: +34 612 345 678, (612) 345-678, +34.612.345.678, +34-612-345-678\n    const allowPhoneChars = (value) => {\n        return (value || '').replace(\/[^0-9+()\\-\\s.]\/g, '');\n    };\n    const sanitizeLetters = (value) => (value || '').replace(\/[^A-Za-z\u00c0-\u00ff\\s'-]\/g, '');\n    const getPhonePrefix = () => {\n        if (!countrySelect) {\n            return '';\n        }\n        return countryPrefixes[countrySelect.value] || '';\n    };\n\n    const updateRegionField = () => {\n        if (!regionInput) {\n            return;\n        }\n        \n        \/\/ Si no hay program_id, usar siempre la regi\u00f3n global de la configuraci\u00f3n\n        if (!programId) {\n            regionInput.value = defaultRegion || 'Iberia';\n            return;\n        }\n        \n        \/\/ Si hay program_id, inferir regi\u00f3n del pa\u00eds seleccionado\n        if (!countrySelect || !countrySelect.value) {\n            regionInput.value = defaultRegion || 'Iberia';\n            return;\n        }\n        const countryValue = countrySelect.value.toLowerCase();\n        const iberiaSet = ['espa\u00f1a', 'spain', 'espa\\u00f1a'];\n        regionInput.value = iberiaSet.includes(countryValue) ? 'Iberia' : 'LATAM';\n    };\n\n    if (regionInput && !regionInput.value) {\n        regionInput.value = defaultRegion || 'Iberia';\n    }\n    \n    \/\/ Solo actualizar regi\u00f3n basada en pa\u00eds si hay program_id\n    if (countrySelect && programId) {\n        updateRegionField();\n        countrySelect.addEventListener('change', updateRegionField);\n    } else if (countrySelect && !programId) {\n        \/\/ Si no hay program_id, mantener la regi\u00f3n global siempre\n        updateRegionField();\n    }\n\n    if (phoneInput) {\n        \/\/ Permitir caracteres est\u00e1ndar de tel\u00e9fono en tiempo real (+, (, ), -, espacios)\n        \/\/ Form Guard necesita estos caracteres para validar correctamente\n        phoneInput.addEventListener('input', () => {\n            \/\/ Solo eliminar caracteres no permitidos, pero mantener formato est\u00e1ndar\n            const allowed = allowPhoneChars(phoneInput.value);\n            if (allowed !== phoneInput.value) {\n                phoneInput.value = allowed;\n            }\n            \n            \/\/ Limpiar errores al escribir\n            phoneInput.classList.remove('hc-error');\n            phoneInput.setCustomValidity('');\n        });\n        \n        \/\/ Limpiar error del selector de prefijos tambi\u00e9n\n        const phonePrefixSelect = form.querySelector('select[name=\"phone_prefix\"]');\n        if (phonePrefixSelect) {\n            phonePrefixSelect.addEventListener('change', () => {\n                phonePrefixSelect.classList.remove('hc-error');\n                phoneInput.classList.remove('hc-error');\n                phoneInput.setCustomValidity('');\n            });\n        }\n    }\n    form.querySelectorAll('[data-only-letters=\"true\"]').forEach((input) => {\n        input.addEventListener('input', () => {\n            const sanitized = sanitizeLetters(input.value);\n            if (sanitized !== input.value) {\n                input.value = sanitized;\n            }\n        });\n    });\n\n    const hydrateUTMs = () => {\n        const params = new URLSearchParams(window.location.search);\n        ['utm_campaign','utm_source','utm_medium','utm_term','utm_content'].forEach(key => {\n            const el = form.querySelector('[name=\"' + key + '\"]');\n            if (el && params.get(key)) {\n                el.value = params.get(key);\n            }\n        });\n    };\n\n    const validateForm = () => {\n        let valid = true;\n        const invalidFields = [];\n        \/\/ Primero limpiar todos los errores\n        form.querySelectorAll('[required]').forEach(field => {\n            field.classList.remove('hc-error');\n            \/\/ Limpiar error del label del checkbox tambi\u00e9n\n            if (field.type === 'checkbox') {\n                const label = field.closest('label');\n                if (label) {\n                    label.classList.remove('hc-error');\n                }\n            }\n        });\n        \/\/ Limpiar tambi\u00e9n el prefijo telef\u00f3nico y labels flotantes\n        const phonePrefixSelect = form.querySelector('select[name=\"phone_prefix\"]');\n        if (phonePrefixSelect) {\n            phonePrefixSelect.classList.remove('hc-error');\n        }\n        \n        \/\/ Luego validar y marcar errores\n        form.querySelectorAll('[required]').forEach(field => {\n            let fieldValid = true;\n            \n            if (field.type === 'checkbox') {\n                \/\/ Para checkboxes, validar si est\u00e1 checkeado\n                fieldValid = field.checked;\n            } else {\n                \/\/ Para inputs normales, validar si tiene valor\n                fieldValid = field.value && field.value.trim() !== '';\n            }\n            \n            if (!fieldValid) {\n                field.classList.add('hc-error');\n                \/\/ Para checkboxes, tambi\u00e9n marcar el label\n                if (field.type === 'checkbox') {\n                    const label = field.closest('label');\n                    if (label) {\n                        label.classList.add('hc-error');\n                    }\n                }\n                \/\/ Si es el campo de tel\u00e9fono, tambi\u00e9n marcar el prefijo si est\u00e1 visible\n                if (field.name === 'phone' && phonePrefixSelect) {\n                    const isVisible = window.getComputedStyle(phonePrefixSelect).display !== 'none';\n                    if (isVisible) {\n                        phonePrefixSelect.classList.add('hc-error');\n                    }\n                }\n                valid = false;\n                \/\/ Recopilar nombres de campos inv\u00e1lidos para el mensaje\n                const fieldName = field.getAttribute('name') || field.getAttribute('id') || 'campo';\n                if (field.type === 'checkbox') {\n                    invalidFields.push('aceptar la pol\u00edtica de privacidad');\n                } else {\n                    const label = field.closest('.hc-field')?.querySelector('label');\n                    const labelText = label ? label.textContent.replace('*', '').trim() : fieldName;\n                    invalidFields.push(labelText.toLowerCase());\n                }\n            }\n        });\n        \n        \/\/ Validar email espec\u00edficamente (puede estar vac\u00edo o con formato inv\u00e1lido)\n        if (emailInput) {\n            const emailValue = emailInput.value.trim();\n            if (!emailValue) {\n                \/\/ Email vac\u00edo - ya deber\u00eda estar marcado por [required], pero nos aseguramos\n                if (!emailInput.classList.contains('hc-error')) {\n                    emailInput.classList.add('hc-error');\n                    valid = false;\n                }\n            }\n        }\n        \n        \/\/ Mostrar mensaje de error si hay campos inv\u00e1lidos\n        if (!valid && invalidFields.length > 0) {\n            const message = 'Por favor, revisa el formulario.';\n            setStatus('error', message);\n        }\n        return valid;\n    };\n\n    const validateEmailFormat = () => {\n        if (!emailInput) {\n            return true;\n        }\n        const value = emailInput.value.trim();\n        \/\/ Si est\u00e1 vac\u00edo, no validar formato (ya se valida en validateForm)\n        if (!value) {\n            return true;\n        }\n        const emailRegex = \/^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$\/;\n        const isValid = emailRegex.test(value);\n        emailInput.setCustomValidity(isValid ? '' : 'Email err\u00f3neo');\n        if (!isValid) {\n            emailInput.classList.add('hc-error');\n            emailInput.reportValidity();\n            setStatus('error', 'Email no v\u00e1lido');\n        }\n        return isValid;\n    };\n\n    \/\/ La validaci\u00f3n de Clearout se hace SOLO en el servidor (PHP)\n    \/\/ JavaScript solo recoge la respuesta del servidor\n\n\n    form.querySelectorAll('input, textarea, select').forEach(el => {\n        el.addEventListener('input', () => {\n            el.classList.remove('hc-error');\n            \/\/ Limpiar error del label si es checkbox\n            if (el.type === 'checkbox') {\n                const label = el.closest('label');\n                if (label) {\n                    label.classList.remove('hc-error');\n                }\n            }\n            if (el === emailInput) {\n                emailInput.setCustomValidity('');\n            }\n            if (el === phoneInput) {\n                phoneInput.setCustomValidity('');\n            }\n            \/\/ Limpiar mensaje de error cuando el usuario empieza a escribir\n            if (statusBox && statusBox.classList.contains('error')) {\n                setStatus('', '');\n            }\n        });\n        el.addEventListener('change', () => {\n            el.classList.remove('hc-error');\n            \/\/ Limpiar error del label si es checkbox\n            if (el.type === 'checkbox') {\n                const label = el.closest('label');\n                if (label) {\n                    label.classList.remove('hc-error');\n                }\n            }\n        });\n    });\n\n    const applyPrivacyLink = () => {\n        if (!privacyUrl) {\n            return;\n        }\n        const targetLink = form.querySelector('[data-privacy-link]') || form.querySelector('.hc-checkbox-group a');\n        if (targetLink) {\n            targetLink.setAttribute('href', privacyUrl);\n            targetLink.setAttribute('target', '_blank');\n            targetLink.setAttribute('rel', 'noopener');\n        }\n    };\n\n    applyPrivacyLink();\n    \n    \/\/ Si no hay program_id, configurar el listener para cuando se seleccione un programa\n    if (!programId) {\n        const programSelect = form.querySelector('select[name=\"program_id_select\"]');\n        if (programSelect) {\n            programSelect.addEventListener('change', function() {\n                const selectedProgramId = this.value;\n                if (selectedProgramId) {\n                    \/\/ Actualizar los inputs hidden inmediatamente\n                    const programIdInput = form.querySelector('input[name=\"program_id\"]');\n                    if (programIdInput) {\n                        programIdInput.value = selectedProgramId;\n                    }\n                    loadProgramData(selectedProgramId);\n                } else {\n                    \/\/ Si se deselecciona, limpiar los inputs hidden y ocultar los selects\n                    const programIdInput = form.querySelector('input[name=\"program_id\"]');\n                    const programNameInput = form.querySelector('input[name=\"program_name\"]');\n                    if (programIdInput) {\n                        programIdInput.value = '';\n                    }\n                    if (programNameInput) {\n                        programNameInput.value = '';\n                    }\n                    hideProgramSelects();\n                }\n            });\n        }\n    }\n    \n    \/\/ Funci\u00f3n para cargar los datos de un programa espec\u00edfico\n    function loadProgramData(programId) {\n        if (!endpoints.programs || !programId) {\n            return;\n        }\n        \n        \/\/ Obtener configuraci\u00f3n de visibilidad de la p\u00e1gina\n        const displayConfig = container.dataset.displayConfig ? JSON.parse(container.dataset.displayConfig) : {};\n        \n        \/\/ Obtener el grid de selects\n        let selectsGrid = container.querySelector('.hc-selects-grid');\n        \n        \/\/ Si no existe el grid, crearlo vac\u00edo (se llenar\u00e1 despu\u00e9s con skeleton y selects seg\u00fan datos)\n        if (!selectsGrid) {\n            \/\/ Buscar d\u00f3nde insertar el grid (despu\u00e9s del select de programa o antes de los checkboxes)\n            const programSelect = form.querySelector('select[name=\"program_id_select\"]') || form.querySelector('select[name=\"program_id\"]');\n            const checkboxes = form.querySelector('.hc-checkbox-group');\n            \n            \/\/ Crear el grid vac\u00edo (no crear campos hasta tener los datos del programa)\n            selectsGrid = document.createElement('div');\n            selectsGrid.className = 'hc-selects-grid';\n            selectsGrid.style.display = 'none'; \/\/ Oculto hasta que haya datos\n            \n            \/\/ Insertar el grid en el formulario\n            if (programSelect && programSelect.parentElement) {\n                programSelect.parentElement.insertAdjacentElement('afterend', selectsGrid);\n            } else if (checkboxes && checkboxes.parentElement) {\n                checkboxes.parentElement.insertBefore(selectsGrid, checkboxes);\n            } else {\n                \/\/ Fallback: insertar antes del bot\u00f3n submit\n                const submitButton = form.querySelector('button[type=\"submit\"]');\n                if (submitButton && submitButton.parentElement) {\n                    submitButton.parentElement.insertBefore(selectsGrid, submitButton);\n                }\n            }\n        }\n        \n        fetch(endpoints.programs + '?program_id=' + encodeURIComponent(programId) + '&X-WP-Nonce=' + encodeURIComponent(restNonce), {\n            method: 'GET',\n            headers: {\n                'X-WP-Nonce': restNonce\n            },\n            credentials: 'same-origin'\n        })\n        .then(resp => {\n            if (!resp.ok) {\n                return resp.json().then(errorData => {\n                    throw new Error(errorData.message || 'Error al cargar datos del programa');\n                });\n            }\n            return resp.json();\n        })\n        .then(response => {\n            if (response.success && response.data && response.data.length > 0) {\n                const program = response.data[0];\n                \n                \/\/ Actualizar los inputs hidden con el program_id y program_name\n                const programIdInput = form.querySelector('input[name=\"program_id\"]');\n                const programNameInput = form.querySelector('input[name=\"program_name\"]');\n                \n                if (programIdInput) {\n                    programIdInput.value = programId;\n                }\n                if (programNameInput) {\n                    programNameInput.value = program.nombre || '';\n                }\n                \n                \/\/ Verificar qu\u00e9 campos tienen datos Y est\u00e1n habilitados en la configuraci\u00f3n\n                \/\/ Solo mostrar skeleton y selects para campos que cumplen ambas condiciones\n                const fieldsToShow = [];\n                const fields = [\n                    { name: 'convocatoria', label: 'Convocatoria', data: program.convocatoria },\n                    { name: 'edicion', label: 'Edici\u00f3n', data: program.edicion },\n                    { name: 'modalidad', label: 'Modalidad', data: program.modalidad },\n                    { name: 'sede', label: 'Sede', data: program.sede }\n                ];\n                \n                fields.forEach(field => {\n                    \/\/ Verificar: 1) est\u00e1 habilitado en la configuraci\u00f3n, 2) tiene datos (m\u00e1s de 1 opci\u00f3n)\n                    const isEnabled = displayConfig[field.name] !== false;\n                    const hasData = field.data && field.data.length > 1;\n                    \n                    if (isEnabled && hasData) {\n                        fieldsToShow.push(field);\n                    }\n                });\n                \n                \/\/ Si hay campos para mostrar, mostrar skeleton y luego los selects\n                if (fieldsToShow.length > 0) {\n                    \/\/ Mostrar skeleton solo para los campos que se van a mostrar\n                    showSkeletonLoading(selectsGrid, fieldsToShow.map(f => f.name));\n                    \n                    \/\/ Simular un peque\u00f1o delay para que se vea el skeleton\n                    setTimeout(() => {\n                        hideSkeletonLoading(selectsGrid);\n                        \n                        \/\/ Asegurar que el grid existe y est\u00e1 visible\n                        if (!selectsGrid) {\n                            selectsGrid = container.querySelector('.hc-selects-grid');\n                        }\n                        if (selectsGrid) {\n                            selectsGrid.style.display = 'grid';\n                        }\n                        \n                        \/\/ Mostrar los selects del programa con sus opciones (solo los habilitados y con datos)\n                        showProgramSelects(program, selectsGrid, displayConfig);\n                    }, 300);\n                } else {\n                    \/\/ Si no hay campos para mostrar, ocultar el grid\n                    if (selectsGrid) {\n                        selectsGrid.style.display = 'none';\n                        selectsGrid.innerHTML = '';\n                    }\n                }\n            } else {\n                if (selectsGrid) {\n                    selectsGrid.style.display = 'none';\n                }\n                setStatus('error', 'No se encontraron datos para el programa seleccionado');\n            }\n        })\n        .catch(error => {\n            if (selectsGrid) {\n                selectsGrid.style.display = 'none';\n            }\n            setStatus('error', 'Error al cargar datos del programa: ' + error.message);\n        });\n    }\n    \n    \/\/ Funci\u00f3n para mostrar skeleton loading solo para campos espec\u00edficos que se van a mostrar\n    function showSkeletonLoading(selectsGrid, enabledFields) {\n        \/\/ Limpiar contenido previo (skeleton y selects existentes)\n        selectsGrid.innerHTML = '';\n        selectsGrid.style.display = 'grid';\n        \n        \/\/ Generar skeleton SOLO para los campos que est\u00e1n habilitados Y tienen datos\n        enabledFields.forEach(fieldName => {\n            const skeletonWrapper = document.createElement('div');\n            skeletonWrapper.className = 'hc-field hc-skeleton-field';\n            skeletonWrapper.setAttribute('data-field', fieldName + '-wrapper');\n            \n            const skeletonBar = document.createElement('div');\n            skeletonBar.className = 'hc-skeleton';\n            skeletonBar.innerHTML = '<div class=\"hc-skeleton-line\"><\/div>';\n            \n            skeletonWrapper.appendChild(skeletonBar);\n            selectsGrid.appendChild(skeletonWrapper);\n        });\n    }\n    \n    \/\/ Funci\u00f3n para ocultar skeleton loading\n    function hideSkeletonLoading(selectsGrid) {\n        if (!selectsGrid) return;\n        \/\/ Solo remover los skeleton, NO limpiar todo el innerHTML\n        \/\/ porque los selects se crear\u00e1n despu\u00e9s\n        const skeletonFields = selectsGrid.querySelectorAll('.hc-skeleton-field');\n        skeletonFields.forEach(field => field.remove());\n    }\n    \n    \/\/ Funci\u00f3n para mostrar los selects del programa\n    \/\/ Solo crea\/actualiza selects para campos habilitados Y con datos disponibles\n    function showProgramSelects(program, selectsGridParam, displayConfig) {\n        \/\/ Asegurar que tenemos referencia al grid\n        let selectsGrid = selectsGridParam || container.querySelector('.hc-selects-grid');\n        \n        if (!selectsGrid) {\n            return;\n        }\n        \n        \/\/ Funci\u00f3n auxiliar para crear\/actualizar un select\n        const createOrUpdateSelect = (name, label, values) => {\n            \/\/ Verificar que est\u00e1 habilitado en la configuraci\u00f3n\n            if (displayConfig && displayConfig[name] === false) {\n                return false; \/\/ Campo deshabilitado, no crear\n            }\n            \n            \/\/ Verificar que hay datos\n            if (!values || values.length <= 1) {\n                return false; \/\/ No hay datos suficientes\n            }\n            \n            \/\/ Buscar si ya existe un wrapper (puede venir del skeleton o de creaci\u00f3n previa)\n            let selectWrapper = selectsGrid.querySelector('[data-field=\"' + name + '-wrapper\"]');\n            \n            if (!selectWrapper) {\n                \/\/ Crear el wrapper si no existe\n                selectWrapper = document.createElement('div');\n                selectWrapper.className = 'hc-field';\n                selectWrapper.setAttribute('data-field', name + '-wrapper');\n                selectsGrid.appendChild(selectWrapper);\n            }\n            \n            \/\/ Buscar o crear el select\n            let select = selectWrapper.querySelector('select[name=\"' + name + '\"]');\n            \n            if (!select) {\n                \/\/ Crear el select si no existe\n                select = document.createElement('select');\n                select.name = name;\n                select.className = 'hc-select';\n                select.required = true;\n                selectWrapper.appendChild(select);\n            }\n            \n            \/\/ Actualizar las opciones\n            select.innerHTML = '<option value=\"\">' + label + '<\/option>';\n            values.forEach(value => {\n                const option = document.createElement('option');\n                option.value = value;\n                option.textContent = value;\n                select.appendChild(option);\n            });\n            \n            \/\/ Asegurar que el wrapper est\u00e1 visible\n            selectWrapper.style.display = 'block';\n            return true;\n        };\n        \n        \/\/ Crear\/actualizar solo los selects que est\u00e1n habilitados Y tienen datos\n        let hasVisibleSelects = false;\n        \n        if (program.convocatoria && program.convocatoria.length > 1) {\n            if (createOrUpdateSelect('convocatoria', 'Convocatoria', program.convocatoria)) {\n                hasVisibleSelects = true;\n            }\n        }\n        \n        if (program.edicion && program.edicion.length > 1) {\n            if (createOrUpdateSelect('edicion', 'Edici\u00f3n', program.edicion)) {\n                hasVisibleSelects = true;\n            }\n        }\n        \n        if (program.modalidad && program.modalidad.length > 1) {\n            if (createOrUpdateSelect('modalidad', 'Modalidad', program.modalidad)) {\n                hasVisibleSelects = true;\n            }\n        }\n        \n        if (program.sede && program.sede.length > 1) {\n            if (createOrUpdateSelect('sede', 'Sede', program.sede)) {\n                hasVisibleSelects = true;\n            }\n        }\n        \n        \/\/ Mostrar\/ocultar el grid seg\u00fan si hay selects visibles\n        if (selectsGrid) {\n            if (hasVisibleSelects) {\n                selectsGrid.style.display = 'grid';\n            } else {\n                selectsGrid.style.display = 'none';\n            }\n        }\n    }\n    \n    \/\/ Funci\u00f3n para ocultar los selects del programa\n    function hideProgramSelects() {\n        const selectsGrid = container.querySelector('.hc-selects-grid');\n        if (selectsGrid) {\n            selectsGrid.style.display = 'none';\n            selectsGrid.innerHTML = '';\n        }\n        \n        const programNameInput = form.querySelector('input[name=\"program_name\"]');\n        if (programNameInput) {\n            programNameInput.value = '';\n        }\n    }\n\n    form.addEventListener('submit', async function(event) {\n\n        \/\/ Bloquear el bot\u00f3n durante 2 segundos para prevenir env\u00edos duplicados\n        const submitButton = form.querySelector('.hc-submit');\n        if (submitButton) {\n            \/\/ Guardar el texto original\n            const originalText = submitButton.textContent || submitButton.innerText;\n            \n            \/\/ Cambiar a indicador de carga con spinner peque\u00f1o\n            submitButton.innerHTML = '<span style=\"display: inline-block; width: 16px; height: 16px; border: 2px solid rgba(255,255,255,0.3); border-top-color: #fff; border-radius: 50%; animation: hc-spin 0.8s linear infinite; margin-right: 8px; vertical-align: middle;\"><\/span>';\n            submitButton.disabled = true;\n            submitButton.style.cursor = 'not-allowed';\n            submitButton.style.opacity = '0.6';\n            \n            setTimeout(() => {\n                \/\/ Restaurar el texto original\n                submitButton.textContent = originalText;\n                submitButton.disabled = false;\n                submitButton.style.cursor = 'pointer';\n                submitButton.style.opacity = '1';\n            }, 2000);\n        }\n\n        \/\/ PREVENIR ENV\u00cdO TRADICIONAL - SIEMPRE PRIMERO\n        event.preventDefault();\n        event.stopPropagation();\n        \n        \/\/ Limpiar mensajes anteriores\n        setStatus('', '');\n        setSuccessMessage('');\n        \n        \/\/ Validaciones b\u00e1sicas ANTES de mostrar spinner\n        let hasErrors = false;\n        \n        \/\/ Validar campos obligatorios (marca en rojo autom\u00e1ticamente y muestra mensaje)\n        if (!validateForm()) {\n            hasErrors = true;\n        }\n        \n        \/\/ Validar formato de email (marca en rojo autom\u00e1ticamente y muestra mensaje)\n        if (!validateEmailFormat()) {\n            hasErrors = true;\n        }\n        \n        \/\/ Si hay errores, no continuar (los campos ya est\u00e1n marcados en rojo y el mensaje mostrado)\n        if (hasErrors) {\n            return;\n        }\n\n        \n        \/\/ Si todo est\u00e1 bien, mostrar spinner y continuar\n        setLoading(true);\n        \n        \/\/ Obtener token de reCAPTCHA v3 si est\u00e1 configurado\n        let recaptchaToken = '';\n        if (recaptchaSiteKey && window.grecaptcha) {\n            try {\n                recaptchaToken = await window.grecaptcha.execute(recaptchaSiteKey, { action: 'submit_lead' });\n            } catch (error) {\n                console.error('[reCAPTCHA] Error obteniendo token:', error);\n                \/\/ Si falla reCAPTCHA, continuar de todos modos (fallback)\n            }\n        }\n\n        const formData = new FormData(form);\n        \n        \/\/ Procesar tel\u00e9fono: concatenar prefijo si el selector est\u00e1 visible\n        let phoneRawInput = formData.get('phone') || '';\n        let phoneCountryCode = '';\n        const phonePrefixSelect = form.querySelector('select[name=\"phone_prefix\"]');\n        \n        \/\/ Solo procesar si el selector est\u00e1 visible (display !== 'none')\n        if (phonePrefixSelect && window.getComputedStyle(phonePrefixSelect).display !== 'none') {\n            const selectedPrefix = phonePrefixSelect.value || '+34';\n            const selectedOption = phonePrefixSelect.options[phonePrefixSelect.selectedIndex];\n            phoneCountryCode = selectedOption.getAttribute('data-country') || '';\n            \n            \/\/ Concatenar prefijo solo si el n\u00famero NO empieza con +\n            if (phoneRawInput && !phoneRawInput.trim().startsWith('+')) {\n                phoneRawInput = selectedPrefix + phoneRawInput.trim();\n            }\n        }\n        \n        const phoneRaw = sanitizePhone(phoneRawInput);\n        \n        const privacyAccepted = formData.get('privacy') ? '1' : '0';\n        const leadSource = formData.get('lead_source') || 'P\u00e1gina Web';\n        const tipoOrigen = formData.get('tipo_origen') || 'Digital';\n        const regionValue = formData.get('region') || '';\n        const phoneSecondary = sanitizePhone(formData.get('phone_secondary') || '');\n\n        \/\/ Obtener program_id del select si no est\u00e1 en el contexto inicial\n        const selectedProgramId = formData.get('program_id') || programId || '';\n        const selectedProgramName = formData.get('program_name') || '';\n        \n        \/\/ Si no hay program_id, usar siempre la regi\u00f3n global de la configuraci\u00f3n\n        \/\/ Si hay program_id, usar la regi\u00f3n inferida del pa\u00eds o la global como fallback\n        let finalRegion = defaultRegion || 'Iberia';\n        if (selectedProgramId && regionValue) {\n            finalRegion = regionValue;\n        } else if (!selectedProgramId) {\n            \/\/ Sin program_id: siempre usar regi\u00f3n global\n            finalRegion = defaultRegion || 'Iberia';\n        }\n        \n        \/\/ Obtener datos de Form Guard (si est\u00e1n disponibles)\n        const clearoutPhoneStatus = formData.get('clearout_phone_status') || '';\n        const clearoutPhoneCountryCode = formData.get('clearout_phone_country_code') || '';\n        const clearoutPhoneE164 = formData.get('clearout_phone_e164') || '';\n        \n        \/\/ Usar el tel\u00e9fono validado (E164) si est\u00e1 disponible, sino usar el tel\u00e9fono raw\n        const phoneToSend = clearoutPhoneE164 || phoneRaw;\n        \n        \/\/ Obtener GCLID de Google Ads (capturado por el script de Zoho)\n        const zcGadInput = form.querySelector('#zc_gad');\n        let zcGad = '';\n        if (zcGadInput) {\n            const rawValue = zcGadInput.value || '';\n            \/\/ Filtrar valores inv\u00e1lidos: undefined, null, 'undefined', 'null', strings vac\u00edos\n            if (rawValue && rawValue !== 'undefined' && rawValue !== 'null' && rawValue.trim() !== '') {\n                zcGad = rawValue.trim();\n            }\n        }\n        \n        const payload = {\n            program_id: selectedProgramId,\n            program_name: selectedProgramName,\n            first_name: formData.get('first_name') || '',\n            last_name: formData.get('last_name') || '',\n            email: formData.get('email') || '',\n            phone: phoneToSend,\n            \/\/ Datos de Form Guard para tel\u00e9fono\n            clearout_phone_status: clearoutPhoneStatus,\n            clearout_phone_country_code: clearoutPhoneCountryCode,\n            clearout_phone_e164: clearoutPhoneE164,\n            phone_secondary: phoneSecondary,\n            \/\/ Pa\u00eds del selector de prefijos (para clearoutphone.io)\n            phone_prefix_country: phoneCountryCode,\n            \/\/ Token de reCAPTCHA v3\n            recaptcha_token: recaptchaToken,\n            country: formData.get('country') || '',\n            region: finalRegion,\n            convocatoria: formData.get('convocatoria') || '',\n            sede: formData.get('sede') || '',\n            modalidad: formData.get('modalidad') || '',\n            edicion: formData.get('edicion') || '',\n            comments: formData.get('comments') || '',\n            marketing: formData.get('marketing') ? '1' : '0',\n            privacy: privacyAccepted,\n            lead_source: leadSource,\n            tipo_origen: tipoOrigen,\n            traffic_source: formData.get('traffic_source') || '',\n            \/\/ GCLID de Google Ads (capturado por script de Zoho)\n            zc_gad: zcGad,\n            utm: {\n                campaign: formData.get('utm_campaign') || '',\n                source: formData.get('utm_source') || '',\n                medium: formData.get('utm_medium') || '',\n                term: formData.get('utm_term') || '',\n                content: formData.get('utm_content') || ''\n            }\n        };\n\n        fetch(endpoints.leads, {\n            method: 'POST',\n            headers: {\n                'Content-Type': 'application\/json',\n                'X-WP-Nonce': restNonce\n            },\n            credentials: 'same-origin',\n            body: JSON.stringify(payload)\n        })\n        .then(resp => {\n            console.log('[Form] Response status:', resp.status, 'OK:', resp.ok);\n            \n            \/\/ Verificar si la respuesta es un error HTTP\n            if (!resp.ok) {\n                return resp.json().then(errorData => {\n                    console.log('[Form] Error HTTP response:', errorData);\n                    \/\/ WordPress REST API devuelve errores con 'code' y 'message'\n                    const errorCode = errorData.code || '';\n                    const errorMessage = errorData.message || errorCode || 'Error en el servidor';\n                    \/\/ Crear un objeto de error con el c\u00f3digo para poder identificarlo despu\u00e9s\n                    const error = new Error(errorMessage);\n                    error.code = errorCode;\n                    error.errorData = errorData;\n                    throw error;\n                });\n            }\n            return resp.json();\n        })\n        .then(response => {\n            \/\/ Verificar si la respuesta indica \u00e9xito\n            if (!response.success) {\n                \/\/ WordPress REST API puede devolver errores en el formato {code, message, data}\n                const errorCode = response.code || '';\n                const errorMessage = response.message || errorCode || 'No se pudo completar el env\u00edo.';\n                const error = new Error(errorMessage);\n                error.code = errorCode;\n                error.errorData = response;\n                throw error;\n            }\n            \/\/ \u00c9xito: resetear formulario\n            form.reset();\n            \n            \/\/ Si hay URL de redirect, redirigir inmediatamente\n            if (redirectUrl && redirectUrl !== '') {\n                window.location.href = redirectUrl;\n            } else {\n                \/\/ Si no hay redirect, mostrar mensaje de \u00e9xito fuera del formulario\n                setSuccessMessage(successMessage);\n                \/\/ Ocultar el formulario, el header y el spinner\n                const formHeader = container.querySelector('.hc-form-header');\n                if (formHeader) {\n                    formHeader.style.display = 'none';\n                }\n                if (form) {\n                    form.style.display = 'none';\n                }\n                const spinner = container.querySelector('.hc-form-spinner');\n                if (spinner) {\n                    spinner.style.display = 'none';\n                }\n            }\n        })\n        .catch((error) => {\n            \/\/ Manejar errores del backend\n            const errorCode = error.code || '';\n            \n            \/\/ Debug: log del error\n            console.log('[Form] Error capturado:', errorCode, error.message);\n            \n            \/\/ Error de email inv\u00e1lido (Clearout)\n            if (errorCode === 'hc_clearout_email_invalid' && emailInput) {\n                emailInput.classList.add('hc-error');\n                emailInput.setCustomValidity('Email no v\u00e1lido');\n                \/\/emailInput.reportValidity();\n                setStatus('error', error.message || 'Email no v\u00e1lido');\n                setLoading(false);\n                return;\n            }\n            \n            \/\/ Error de tel\u00e9fono inv\u00e1lido (m\u00faltiples c\u00f3digos de error)\n            const phoneErrorCodes = ['hc_clearout_phone_invalid', 'hc_lead_invalid_phone'];\n            if (phoneErrorCodes.includes(errorCode) && phoneInput) {\n                console.log('[Form] Pintando campo tel\u00e9fono de rojo');\n                phoneInput.classList.add('hc-error');\n                phoneInput.setCustomValidity(error.message || 'Tel\u00e9fono no v\u00e1lido');\n                \n                \/\/ Tambi\u00e9n marcar el selector de prefijos si existe y est\u00e1 visible\n                const phonePrefixSelect = form.querySelector('select[name=\"phone_prefix\"]');\n                if (phonePrefixSelect) {\n                    const isVisible = window.getComputedStyle(phonePrefixSelect).display !== 'none';\n                    console.log('[Form] Selector de prefijos visible:', isVisible);\n                    if (isVisible) {\n                        phonePrefixSelect.classList.add('hc-error');\n                        console.log('[Form] Selector de prefijos pintado de rojo');\n                    }\n                }\n                \n                phoneInput.reportValidity();\n                setStatus('error', error.message || 'Tel\u00e9fono no v\u00e1lido');\n                setLoading(false);\n                return;\n            }\n            \n            \/\/ Otros errores: mostrar mensaje gen\u00e9rico\n            setStatus('error', '');\n            setLoading(false);\n        })\n        .finally(() => {\n            setLoading(false);\n        });\n    });\n\n    hydrateUTMs();\n    return true;\n    } \/\/ Fin de initForm\n    \n    \/\/ Intentar ejecutar inmediatamente\n    let initialized = initForm();\n    \n    \/\/ Si no se inicializ\u00f3, intentar cuando el DOM est\u00e9 listo\n    if (!initialized) {\n        if (document.readyState === 'loading') {\n            document.addEventListener('DOMContentLoaded', initForm);\n        } else {\n            \/\/ Si el DOM ya est\u00e1 listo pero no se encontr\u00f3, intentar de nuevo despu\u00e9s de un breve delay\n            setTimeout(function() {\n                const testContainer = document.getElementById('hc_form_1_7888');\n                if (testContainer) {\n                    initForm();\n                }\n            }, 100);\n        }\n    }\n})();\n<\/script>\n\n<h3>Detalles clave del programa<\/h3>\n<ul>\n<li><strong>Duraci\u00f3n:<\/strong> Seg\u00fan modalidad 8, 10 o 17 meses<\/li>\n<li><strong>Modalidad:<\/strong> Virtual, presencial o h\u00edbrida<\/li>\n<li><strong>Certificaci\u00f3n:<\/strong> AMIR Internacional<\/li>\n<li><strong>Acceso:<\/strong> Plataforma y App del alumno 24\/7<\/li>\n<li>Inscripciones abiertas | Cupos limitados<\/li>\n<\/ul>\n<h3>Un m\u00e9todo probado, un<\/p>\n<p>sue\u00f1o alcanzable<\/h3>\n<p>El <strong>Curso MIR AMIR<\/strong> combina experiencia, innovaci\u00f3n y acompa\u00f1amiento para que <strong>cada m\u00e9dico llegue preparado y confiado al examen.<\/strong> Nuestra metodolog\u00eda entrena la memoria a largo plazo, el razonamiento cl\u00ednico y la t\u00e9cnica de examen, utilizando <strong>inteligencia artificial, simulacros reales y seguimiento personalizado.<\/strong><\/p>\n<p>El\u00a094% de los estudiantes\u00a0elige su especialidad y\u00a09,5 de cada 10\u00a0volver\u00eda a prepararse con AMIR.<\/p>\n<h3>Metodolog\u00eda AMIR: tecnolog\u00eda y acompa\u00f1amiento<\/h3>\n<p>Nuestro m\u00e9todo no solo te ense\u00f1a a\u00a0responder: te entrena para\u00a0pensar como residente.<\/p>\n<figure><img decoding=\"async\" src=\"https:\/\/qa-server.amircolombia.com\/mexico\/wp-content\/uploads\/2025\/11\/App.svg\" alt=\"\" width=\"54\" height=\"54\" title=\"\"><\/figure>\n<p>Clases en vivo<\/p>\n<p>Con m\u00e9dicos especialistas espa\u00f1oles que ense\u00f1an desde la pr\u00e1ctica real.<\/p>\n<figure><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/qa-server.amircolombia.com\/mexico\/wp-content\/uploads\/2025\/11\/App-1.svg\" alt=\"\" width=\"54\" height=\"54\" title=\"\"><\/figure>\n<p>App del alumno con IA<\/p>\n<p>Inteligencia artificial que personaliza tu estudio seg\u00fan tus metas y desempe\u00f1o.<\/p>\n<figure><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/qa-server.amircolombia.com\/mexico\/wp-content\/uploads\/2025\/11\/App-2.svg\" alt=\"\" width=\"54\" height=\"54\" title=\"\"><\/figure>\n<p>Manuales<\/p>\n<p>F\u00edsicos y digitales actualizados en cada convocatoria.<\/p>\n<figure><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/qa-server.amircolombia.com\/mexico\/wp-content\/uploads\/2025\/11\/App-3.svg\" alt=\"\" width=\"54\" height=\"54\" title=\"\"><\/figure>\n<p>+40 Simulacros reales<\/p>\n<p>Con an\u00e1lisis de resultados y progreso.<\/p>\n<figure><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/qa-server.amircolombia.com\/mexico\/wp-content\/uploads\/2025\/11\/App-4.svg\" alt=\"\" width=\"54\" height=\"54\" title=\"\"><\/figure>\n<p>Tutor\u00edas personalizadas<\/p>\n<p>Y planificaci\u00f3n por objetivos.<\/p>\n<figure><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/qa-server.amircolombia.com\/mexico\/wp-content\/uploads\/2025\/11\/App-5.svg\" alt=\"\" width=\"54\" height=\"54\" title=\"\"><\/figure>\n<p>Acceso 24\/7<\/p>\n<p>A la Plataforma AMIR TV con clases grabadas y recursos complementarios.<\/p>\n<h3>\u00bfPor qu\u00e9 hacer tu residencia en Espa\u00f1a?<\/h3>\n<p>Hacer la residencia en Espa\u00f1a es mucho m\u00e1s que una especializaci\u00f3n: es una oportunidad de crecimiento profesional y personal.<\/p>\n<figure><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/qa-server.amircolombia.com\/mexico\/wp-content\/uploads\/2025\/11\/Container.svg\" alt=\"\" width=\"50\" height=\"50\" title=\"\"><\/figure>\n<h3>Sistema de salud reconocido<\/h3>\n<p>Formar\u00e1s parte de uno de los sistemas de salud m\u00e1s reconocidos del mundo.<\/p>\n<figure><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/qa-server.amircolombia.com\/mexico\/wp-content\/uploads\/2025\/11\/Container-1.svg\" alt=\"\" width=\"50\" height=\"50\" title=\"\"><\/figure>\n<h3>Formaci\u00f3n remunerada<\/h3>\n<p>Tendr\u00e1s formaci\u00f3n remunerada desde el primer d\u00eda y condiciones laborales justas.<\/p>\n<figure><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/qa-server.amircolombia.com\/mexico\/wp-content\/uploads\/2025\/11\/Container-2.svg\" alt=\"\" width=\"52\" height=\"50\" title=\"\"><\/figure>\n<h3>Calidad de vida<\/h3>\n<p>Vivir\u00e1s en un entorno seguro, con alta calidad de vida y estabilidad profesional.<\/p>\n<figure><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/qa-server.amircolombia.com\/mexico\/wp-content\/uploads\/2025\/11\/Container-3.svg\" alt=\"\" width=\"50\" height=\"50\" title=\"\"><\/figure>\n<h3>Reconocimiento europeo<\/h3>\n<p>Tu t\u00edtulo europeo tendr\u00e1 reconocimiento en toda la Uni\u00f3n Europea y te abrir\u00e1 puertas en el \u00e1mbito internacional.<\/p>\n<h2>Homologaci\u00f3n de t\u00edtulo<\/h2>\n<p>La\u00a0homologaci\u00f3n del t\u00edtulo\u00a0de medicina es un\u00a0<strong>requisito indispensable\u00a0para que un ciudadano extranjero y no comunitario<\/strong> pueda presentarse al\u00a0Examen MIR. Desde el a\u00f1o 2010 se exige tener el\u00a0t\u00edtulo\u00a0ya homologado\u00a0en el momento de efectuar la inscripci\u00f3n\u00a0al MIR. Al tratarse de un documento imprescindible para la inscripci\u00f3n en el examen MIR,\u00a0se recomienda iniciar la solicitud lo antes posible.<\/p>\n<p>&nbsp;<\/p>\n<p>CONOCE M\u00c1S<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/qa-server.amircolombia.com\/mexico\/wp-content\/uploads\/2025\/11\/doctor_holding_medical_stamp_put_prescription_paper_health_care_exam_hand_physician_putting_seal_checkup_report_giving_medicine_patient_consultation_close_up_1.webp\" sizes=\"(max-width: 1348px) 100vw, 1348px\" srcset=\"https:\/\/qa-server.amircolombia.com\/mexico\/wp-content\/uploads\/2025\/11\/doctor_holding_medical_stamp_put_prescription_paper_health_care_exam_hand_physician_putting_seal_checkup_report_giving_medicine_patient_consultation_close_up_1.webp 1348w, https:\/\/qa-server.amircolombia.com\/mexico\/wp-content\/uploads\/2025\/11\/doctor_holding_medical_stamp_put_prescription_paper_health_care_exam_hand_physician_putting_seal_checkup_report_giving_medicine_patient_consultation_close_up_1-300x177.webp 300w, https:\/\/qa-server.amircolombia.com\/mexico\/wp-content\/uploads\/2025\/11\/doctor_holding_medical_stamp_put_prescription_paper_health_care_exam_hand_physician_putting_seal_checkup_report_giving_medicine_patient_consultation_close_up_1-600x354.webp 600w, https:\/\/qa-server.amircolombia.com\/mexico\/wp-content\/uploads\/2025\/11\/doctor_holding_medical_stamp_put_prescription_paper_health_care_exam_hand_physician_putting_seal_checkup_report_giving_medicine_patient_consultation_close_up_1-1024x605.webp 1024w, https:\/\/qa-server.amircolombia.com\/mexico\/wp-content\/uploads\/2025\/11\/doctor_holding_medical_stamp_put_prescription_paper_health_care_exam_hand_physician_putting_seal_checkup_report_giving_medicine_patient_consultation_close_up_1-768x454.webp 768w, https:\/\/qa-server.amircolombia.com\/mexico\/wp-content\/uploads\/2025\/11\/doctor_holding_medical_stamp_put_prescription_paper_health_care_exam_hand_physician_putting_seal_checkup_report_giving_medicine_patient_consultation_close_up_1-1200x709.webp 1200w\" alt=\"\" width=\"1348\" height=\"796\" title=\"\"><\/p>\n<h3>Acreditaci\u00f3n UDIMA:<\/p>\n<p>M\u00e1ster Propio en Medicina Cl\u00ednica<\/h3>\n<p>Gracias al convenio entre AMIR y la\u00a0Universidad a Distancia de Madrid (UDIMA), nuestros cursos de preparaci\u00f3n al examen MIR pueden ser reconocidos como\u00a0M\u00e1ster Propio en Medicina Cl\u00ednica, otorgado por una de las universidades m\u00e1s prestigiosas de Europa en educaci\u00f3n a distancia.<\/p>\n<ul>\n<li><strong>El\u00a0Curso de Sexto MIR\u00a0puede reconocerse como M\u00e1ster Propio de\u00a0120 cr\u00e9ditos ECTS.<\/strong><\/li>\n<li><strong>Los cursos de duraci\u00f3n igual o superior a 7 meses, como\u00a0M\u00e1ster Propio de 60 cr\u00e9ditos ECTS.<\/strong><\/li>\n<\/ul>\n<p><em>*Aplica para las <strong>modalidades\u00a0presencial, virtual e h\u00edbrida<\/strong>\u00a0siempre que el estudiante cumpla con los requisitos acad\u00e9micos y de permanencia establecidos.<\/em><\/p>\n<p><strong style=\"color: #b8be14;\">Una preparaci\u00f3n, dos logros:\u00a0tu plaza MIR y tu titulaci\u00f3n europea.<\/strong><\/p>\n<p><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/qa-server.amircolombia.com\/mexico\/wp-content\/uploads\/2025\/11\/aliado_2_udima.webp\" sizes=\"(max-width: 1332px) 100vw, 1332px\" srcset=\"https:\/\/qa-server.amircolombia.com\/mexico\/wp-content\/uploads\/2025\/11\/aliado_2_udima.webp 1332w, https:\/\/qa-server.amircolombia.com\/mexico\/wp-content\/uploads\/2025\/11\/aliado_2_udima-300x120.webp 300w, https:\/\/qa-server.amircolombia.com\/mexico\/wp-content\/uploads\/2025\/11\/aliado_2_udima-600x240.webp 600w, https:\/\/qa-server.amircolombia.com\/mexico\/wp-content\/uploads\/2025\/11\/aliado_2_udima-1024x409.webp 1024w, https:\/\/qa-server.amircolombia.com\/mexico\/wp-content\/uploads\/2025\/11\/aliado_2_udima-768x307.webp 768w, https:\/\/qa-server.amircolombia.com\/mexico\/wp-content\/uploads\/2025\/11\/aliado_2_udima-1200x479.webp 1200w\" alt=\"\" width=\"1332\" height=\"532\" title=\"\"><\/p>\n<h2>Historias de \u00e9xito<\/h2>\n<div style=\"width: 640px;\" class=\"wp-video\"><video class=\"wp-video-shortcode\" id=\"video-1590-1\" width=\"640\" height=\"360\" preload=\"metadata\" controls=\"controls\"><source type=\"video\/mp4\" src=\"https:\/\/www.amircolombia.com\/wp-content\/uploads\/2025\/11\/Testimonial-MIR-Ana-Orduy_V1_ALTA.mp4https:\/\/www.amircolombia.com\/wp-content\/uploads\/2025\/11\/Testimonial-MIR-Andres_V1_ALTA.mp4https:\/\/www.amircolombia.com\/wp-content\/uploads\/2025\/11\/Testimonial-MIR-Fiorella_V1_ALTA.mp4?_=1\" \/><a href=\"https:\/\/www.amircolombia.com\/wp-content\/uploads\/2025\/11\/Testimonial-MIR-Ana-Orduy_V1_ALTA.mp4https:\/\/www.amircolombia.com\/wp-content\/uploads\/2025\/11\/Testimonial-MIR-Andres_V1_ALTA.mp4https:\/\/www.amircolombia.com\/wp-content\/uploads\/2025\/11\/Testimonial-MIR-Fiorella_V1_ALTA.mp4\">https:\/\/www.amircolombia.com\/wp-content\/uploads\/2025\/11\/Testimonial-MIR-Ana-Orduy_V1_ALTA.mp4https:\/\/www.amircolombia.com\/wp-content\/uploads\/2025\/11\/Testimonial-MIR-Andres_V1_ALTA.mp4https:\/\/www.amircolombia.com\/wp-content\/uploads\/2025\/11\/Testimonial-MIR-Fiorella_V1_ALTA.mp4<\/a><\/video><\/div>\n<p>Cientos de M\u00e9dicos Latinoamericanos lograron su plaza MIR con nosotros. Sus historias inspiran a quienes hoy comienzan el mismo camino.<\/p>\n<h3>Modalidades de estudio<\/h3>\n<ul>\n<li><strong>Curso Regular (17 meses):<\/strong>\u00a0inicia en septiembre.<\/li>\n<li><strong>Curso Intensivo (10 meses):<\/strong>\u00a0inicia en abril.<\/li>\n<li><strong>Curso de Alto Rendimiento (8 meses):<\/strong>\u00a0inicia en junio.<\/li>\n<\/ul>\n<h3>Tu curso incluye:<\/h3>\n<ul>\n<li>Manuales AMIR impresos y digitales.<\/li>\n<li>Curso de Memorizaci\u00f3n Genius Gratis.<\/li>\n<li>Clases en vivo y grabadas.<\/li>\n<li>Acceso 24\/7 a la App del alumno.<\/li>\n<li>40 simulacros y evaluaciones progresivas.<\/li>\n<li>Acompa\u00f1amiento personalizado y sesiones con expositores MIR.<\/li>\n<li>Entrenamiento mental y estrat\u00e9gico con MIR Coach.<\/li>\n<li>Garant\u00eda de repetici\u00f3n.<\/li>\n<\/ul>\n<p><a id=\"descargar-brochure-btn\" role=\"button\"><\/a><\/p>\n<p>DESCARGAR BROCHURE<\/p>\n<details id=\"e-n-accordion-item-1090\">\n<summary tabindex=\"0\" data-accordion-index=\"1\" aria-expanded=\"false\" aria-controls=\"e-n-accordion-item-1090\">Preguntas frecuentes<\/summary>\n<h3>\u00bfC\u00f3mo homologar mi t\u00edtulo para presentar el MIR y cu\u00e1nto tarda realmente?<\/h3>\n<p style=\"font-weight: 400;\">La solicitud se realiza ante el <strong>Ministerio de Universidades de Espa\u00f1a<\/strong>.<\/p>\n<p>Duraci\u00f3n estimada: <strong>6\u201312 meses<\/strong>, dependiendo de revisi\u00f3n y carga administrativa.<\/p>\n<p style=\"font-weight: 400;\">AMIR acompa\u00f1a en el tr\u00e1mite para evitar errores que pueden retrasar meses la homologaci\u00f3n.<\/p>\n<h3>\u00bfCu\u00e1ntas plazas MIR se ofrecen cada a\u00f1o y cu\u00e1ntas son para m\u00e9dicos extracomunitarios?<\/h3>\n<p style=\"font-weight: 400;\">Espa\u00f1a ofrece entre <strong>11.000 y 12.000 plazas<\/strong> cada a\u00f1o.<\/p>\n<p style=\"font-weight: 400;\">Para extracomunitarios se destina cerca del <strong>10%<\/strong>, aunque var\u00eda seg\u00fan convocatoria.<\/p>\n<p style=\"font-weight: 400;\">Por eso el desempe\u00f1o en el examen es vital \u2014 AMIR entrena para obtener n\u00fameros competitivos.<\/p>\n<h3>\u00bfQu\u00e9 documentos necesito para viajar a Espa\u00f1a si obtengo plaza MIR?<\/h3>\n<p style=\"font-weight: 400;\">Documentos m\u00e1s habituales:<\/p>\n<ul>\n<li>Visado MIR o de residencia en formaci\u00f3n.<\/li>\n<li>Contrato emitido por el hospital donde obtuviste plaza.<\/li>\n<li>Seguro m\u00e9dico o acceso al sistema p\u00fablico.<\/li>\n<li>Certificado de antecedentes actualizado.<\/li>\n<li>Credencial de homologaci\u00f3n.<\/li>\n<li>Pasaporte vigente.<\/li>\n<\/ul>\n<p>AMIR entrega gu\u00edas espec\u00edficas por pa\u00eds para simplificar este proceso.<\/p>\n<h3>\u00bfQu\u00e9 necesito para preparar el MIR desde M\u00e9xico?<\/h3>\n<p style=\"font-weight: 400;\">Solo necesitas:<\/p>\n<ul>\n<li>Conexi\u00f3n estable y un dispositivo.<\/li>\n<li>Acceso a la plataforma AMIR (Blackboard + IA de rendimiento).<\/li>\n<li>Manuales f\u00edsicos o digitales enviados a tu pa\u00eds.<\/li>\n<li>Tutor\u00eda constante y simulacros oficiales.<\/li>\n<\/ul>\n<p style=\"font-weight: 400;\">El sistema AMIR ha formado a <strong>m\u00e1s de 500.000 m\u00e9dicos<\/strong> y es completamente funcional en modalidad online.<\/p>\n<h3>\u00bfC\u00f3mo es la vida real de un residente en Espa\u00f1a?<\/h3>\n<ul>\n<li>Sueldo aproximado: <strong>1.400\u20131.800 euros\/mes<\/strong> incluyendo guardias.<\/li>\n<li>Alta estabilidad laboral<\/li>\n<li>Calidad de vida superior: seguridad, movilidad, cultura, oportunidades.<\/li>\n<li>Supervisi\u00f3n continua y protocolos claros.<\/li>\n<li>Posibilidad de subespecializaci\u00f3n y empleabilidad inmediata al terminar.<\/li>\n<\/ul>\n<p style=\"font-weight: 400;\">Prepararte para el MIR es m\u00e1s que obtener una plaza \u2014 es cambiar tu futuro m\u00e9dico.<\/p>\n<h3>\u00bfCu\u00e1l es la ventaja de realizar la homologaci\u00f3n con AMIR?<\/h3>\n<p>Al elegir AMIR, no solo realizas tu homologaci\u00f3n, sino que obtienes un acompa\u00f1amiento profesional de principio a fin. Nos encargamos de guiarte en cada paso de un proceso que suele ser complejo y demandante, desde la revisi\u00f3n de documentos hasta el cumplimiento de todos los requisitos oficiales.<\/p>\n<p>Nuestro objetivo es que t\u00fa te enfoques en tu futuro profesional, mientras nosotros nos ocupamos de que tu tr\u00e1mite avance sin errores, sin contratiempos y en el menor tiempo posible, brind\u00e1ndote seguridad, confianza y tranquilidad en todo momento.<\/p>\n<\/details>\n<h3>\u00bfC\u00f3mo homologar mi t\u00edtulo para presentar el MIR y cu\u00e1nto tarda realmente?<\/h3>\n<p style=\"font-weight: 400;\">La solicitud se realiza ante el <strong>Ministerio de Universidades de Espa\u00f1a<\/strong>.<\/p>\n<p>Duraci\u00f3n estimada: <strong>6\u201312 meses<\/strong>, dependiendo de revisi\u00f3n y carga administrativa.<\/p>\n<p style=\"font-weight: 400;\">AMIR acompa\u00f1a en el tr\u00e1mite para evitar errores que pueden retrasar meses la homologaci\u00f3n.<\/p>\n<h3>\u00bfCu\u00e1ntas plazas MIR se ofrecen cada a\u00f1o y cu\u00e1ntas son para m\u00e9dicos extracomunitarios?<\/h3>\n<p style=\"font-weight: 400;\">Espa\u00f1a ofrece entre <strong>11.000 y 12.000 plazas<\/strong> cada a\u00f1o.<\/p>\n<p style=\"font-weight: 400;\">Para extracomunitarios se destina cerca del <strong>10%<\/strong>, aunque var\u00eda seg\u00fan convocatoria.<\/p>\n<p style=\"font-weight: 400;\">Por eso el desempe\u00f1o en el examen es vital \u2014 AMIR entrena para obtener n\u00fameros competitivos.<\/p>\n<h3>\u00bfQu\u00e9 documentos necesito para viajar a Espa\u00f1a si obtengo plaza MIR?<\/h3>\n<p style=\"font-weight: 400;\">Documentos m\u00e1s habituales:<\/p>\n<ul>\n<li>Visado MIR o de residencia en formaci\u00f3n.<\/li>\n<li>Contrato emitido por el hospital donde obtuviste plaza.<\/li>\n<li>Seguro m\u00e9dico o acceso al sistema p\u00fablico.<\/li>\n<li>Certificado de antecedentes actualizado.<\/li>\n<li>Credencial de homologaci\u00f3n.<\/li>\n<li>Pasaporte vigente.<\/li>\n<\/ul>\n<p>AMIR entrega gu\u00edas espec\u00edficas por pa\u00eds para simplificar este proceso.<\/p>\n<h3>\u00bfQu\u00e9 necesito para preparar el MIR desde M\u00e9xico?<\/h3>\n<p style=\"font-weight: 400;\">Solo necesitas:<\/p>\n<ul>\n<li>Conexi\u00f3n estable y un dispositivo.<\/li>\n<li>Acceso a la plataforma AMIR (Blackboard + IA de rendimiento).<\/li>\n<li>Manuales f\u00edsicos o digitales enviados a tu pa\u00eds.<\/li>\n<li>Tutor\u00eda constante y simulacros oficiales.<\/li>\n<\/ul>\n<p style=\"font-weight: 400;\">El sistema AMIR ha formado a <strong>m\u00e1s de 500.000 m\u00e9dicos<\/strong> y es completamente funcional en modalidad online.<\/p>\n<h3>\u00bfC\u00f3mo es la vida real de un residente en Espa\u00f1a?<\/h3>\n<ul>\n<li>Sueldo aproximado: <strong>1.400\u20131.800 euros\/mes<\/strong> incluyendo guardias.<\/li>\n<li>Alta estabilidad laboral<\/li>\n<li>Calidad de vida superior: seguridad, movilidad, cultura, oportunidades.<\/li>\n<li>Supervisi\u00f3n continua y protocolos claros.<\/li>\n<li>Posibilidad de subespecializaci\u00f3n y empleabilidad inmediata al terminar.<\/li>\n<\/ul>\n<p style=\"font-weight: 400;\">Prepararte para el MIR es m\u00e1s que obtener una plaza \u2014 es cambiar tu futuro m\u00e9dico.<\/p>\n<h3>\u00bfCu\u00e1l es la ventaja de realizar la homologaci\u00f3n con AMIR?<\/h3>\n<p>Al elegir AMIR, no solo realizas tu homologaci\u00f3n, sino que obtienes un acompa\u00f1amiento profesional de principio a fin. Nos encargamos de guiarte en cada paso de un proceso que suele ser complejo y demandante, desde la revisi\u00f3n de documentos hasta el cumplimiento de todos los requisitos oficiales.<\/p>\n<p>Nuestro objetivo es que t\u00fa te enfoques en tu futuro profesional, mientras nosotros nos ocupamos de que tu tr\u00e1mite avance sin errores, sin contratiempos y en el menor tiempo posible, brind\u00e1ndote seguridad, confianza y tranquilidad en todo momento.<\/p>\n<h2>Todo lo que necesitas en un solo lugar<\/h2>\n<p>Comienza hoy tu preparaci\u00f3n MIR con AMIR M\u00e9xico y da el paso hacia la especializaci\u00f3n que transformar\u00e1 tu vida.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Tu camino hacia la residencia m\u00e9dica en Espa\u00f1a Prep\u00e1rate con el m\u00e9todo que ha llevado a miles de m\u00e9dicos latinoamericanos para alcanzar su sue\u00f1o de especializarse en Espa\u00f1a. En AMIR aprender\u00e1s con especialistas espa\u00f1oles, una metodolog\u00eda probada durante m\u00e1s de 18 a\u00f1os y el apoyo de tecnolog\u00eda inteligente que personaliza y hace m\u00e1s eficiente tu &hellip;<\/p>\n","protected":false},"featured_media":3301,"template":"","meta":{"_acf_changed":false,"_genesis_block_theme_hide_title":false},"product_brand":[],"product_cat":[71],"product_tag":[63],"class_list":{"0":"post-1590","1":"product","2":"type-product","3":"status-publish","4":"has-post-thumbnail","6":"product_cat-cat-examen-mir","7":"product_tag-master","8":"post","9":"with-featured-image","11":"first","12":"instock","13":"shipping-taxable","14":"product-type-simple"},"acf":[],"_links":{"self":[{"href":"https:\/\/qa-server.amircolombia.com\/mexico\/wp-json\/wp\/v2\/product\/1590","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/qa-server.amircolombia.com\/mexico\/wp-json\/wp\/v2\/product"}],"about":[{"href":"https:\/\/qa-server.amircolombia.com\/mexico\/wp-json\/wp\/v2\/types\/product"}],"version-history":[{"count":711,"href":"https:\/\/qa-server.amircolombia.com\/mexico\/wp-json\/wp\/v2\/product\/1590\/revisions"}],"predecessor-version":[{"id":17768,"href":"https:\/\/qa-server.amircolombia.com\/mexico\/wp-json\/wp\/v2\/product\/1590\/revisions\/17768"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/qa-server.amircolombia.com\/mexico\/wp-json\/wp\/v2\/media\/3301"}],"wp:attachment":[{"href":"https:\/\/qa-server.amircolombia.com\/mexico\/wp-json\/wp\/v2\/media?parent=1590"}],"wp:term":[{"taxonomy":"product_brand","embeddable":true,"href":"https:\/\/qa-server.amircolombia.com\/mexico\/wp-json\/wp\/v2\/product_brand?post=1590"},{"taxonomy":"product_cat","embeddable":true,"href":"https:\/\/qa-server.amircolombia.com\/mexico\/wp-json\/wp\/v2\/product_cat?post=1590"},{"taxonomy":"product_tag","embeddable":true,"href":"https:\/\/qa-server.amircolombia.com\/mexico\/wp-json\/wp\/v2\/product_tag?post=1590"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}