Primer plano de la parte interior del Galaxy Ring. El anillo se mueve para mostrar los tres sensores brillando. Continúa moviéndose y girando para mostrar todo el anillo. La imagen cambia y los tres Galaxy Ring aparecen uno a uno formando una línea. Se puede ver el texto Galaxy Ring y Galaxy AI ha llegado.
Bienvenido a la Nueva Era de la Salud impulsada por la Inteligencia Artificial
El monitoreo de tu salud alrededor de tu dedo.
Un ligero marco de titanio y un elegante diseño cóncavo tan cómodo que te olvidarás de que lo llevas puesto. Titanio fuerte y resistente al agua para llevarlo todo el día, con una batería que dura hasta 7 días. 3 sensores integrados controlan tu salud las 24 horas del día. Galaxy AI analiza esos datos para ofrecerte consejos personalizados sobre salud y sueño para que tengas mejores días y mejores noches.
Conoce los Nuevos Samsung Galaxy ,
Armazón de titanio resistente, ,
Un círculo aparece. El círculo se está creando en el Galaxy Ring. Aparecen tres sensores en el interior y se muestra el Galaxy Ring completo.
Experiencia de salud impulsada por AI,
Los íconos punteados de la función de seguimiento del sueño, la aplicación Samsung Health y la función de control de la frecuencia cardíaca se muestran uno al lado del otro. Los íconos se juntan en el centro. El ícono de la función de seguimiento del sueño en la parte frontal desaparece. El ícono de la aplicación Samsung Health queda a la izquierda. Aparece la GUI de la función Puntuación de energía y la puntuación sube a 92. El texto Excelente aparece debajo de la puntuación energética.
Monitoreo de la salud con triple tecnología de sensores,
Primer plano de la parte interior del Galaxy Ring. El anillo se mueve para mostrar los tres sensores que brillan.
Delgado, ligero y elegante,
TSe ven tres anillos. Los tres están inclinados en diferentes ángulos.
"Una de las ventajas con respecto a un reloj inteligente es que no interfiere en ninguna de tus actividades. Si estás cansado de las notificaciones pero quieres seguir controlando tus medidas físicas, el anillo puede hacerlo sin duda".
-Carlos Vassan, Tech specialist
“Cuenta con detección automática de carrera o caminata. Si caminas durante 10 minutos, creará automáticamente un registro en la aplicación Samsung Health. Si tienes activados los permisos necesarios, también podrá seguir tu ruta, mostrando la duración del ejercicio, la velocidad media, la frecuencia cardiaca y las calorías quemadas”.
–Isa Marcial, Tech specialist
“El Samsung Galaxy Ring es un anillo inteligente cuya función principal es monitorear la salud del usuario. Ofrece una forma discreta de realizar un seguimiento de tus métricas más saludables, como: patrones de sueño, frecuencia cardíaca, niveles de actividad... Diseñado para ser funcional y estar a la moda, el Samsung Galaxy Ring te permite mantenerte conectado a tus objetivos saludables sin comprometer tu estilo”.
-Carlos Omar Carbajal, LifeStyle influencer
"El Galaxy Ring tiene sensores para registrar frecuencia cardiaca, temperatura corporal, calidad del sueño y niveles de estrés. Ofrece consejos de bienestar personalizados y presenta el Energy Score, que mide tu estado energético diario, así como seguimiento de la salud femenina”.
– Xataka, Tech media outlet
“¡Es simplemente genial!, lo vinculas a la aplicación del celular, hecho de titanio y resistente al agua, mide tu ritmo cardiaco, monitorea el sueño, entre otras funciones. Ya no es necesario tener otro wearable como un reloj inteligente, el anillo lo hace todo. Va a ser interesante conocer las funciones, ya quiero probarlo".
- Aura López, Tech specialist
“A primera vista, puedo decir que definitivamente se siente en la mano, aunque menos que un reloj. Sí que se nota al doblar el dedo porque es más grueso. Creo que si haces ejercicios con mancuernas, es mejor quitártelo y usar el Watch en su lugar. Puedes llevarlo mientras nadas, y no es incómodo mientras duermes; no corta la circulación, así que mi dedo se siente normal”.
- Brujería Tech, Tech specialist
Diseño elegante y cóncavo
Anticípate a las tendencias con un Nuevo Galaxy que demuestra que los dispositivos de alta tecnología no tienen por qué ser voluminosos. El diseño cóncavo añade un toque elegante a la estética atemporal de Galaxy Ring. Además, su duradero armazón de titanio hace que Galaxy Ring luzca bonito durante todas tus actividades diarias. , ,
Aparece un Galaxy Ring en el fondo. En la parte frontal aparecen tres anillos. El de arriba a la derecha muestra el lateral del anillo. El del medio está inclinado para mostrar la parte interior del anillo. El último de la izquierda está ligeramente más inclinado que el del centro.
Tecnología de tres sensores en el dedo
Un anillo, con tecnología de tres sensores. Galaxy Ring mide 7mm de ancho, 2.6mm de grosor y pesa 2.3g. Es ligero y cómodo, pero está totalmente equipado para registrar tus días y tus noches., ,
Aparece un Galaxy Ring de frente. Se enrolla y gira para mostrar los tres sensores.
Acelerómetro
Registra los movimientos y la actividad de tu cuerpo sin pulsar ningún botón.
Sensor óptico de bioseñales
Controla tu frecuencia Cardíaca y mantente informado del estado de tu corazón.
Sensor de la temperatura de la piel
Realiza lecturas periódicas sobre cómo cambia la temperatura de tu piel mientras duermes.
Sensor óptico de bioseñales
Controla tu frecuencia Cardíaca y mantente informado del estado de tu corazón.
Acelerómetro
Registra los movimientos y la actividad de tu cuerpo sin pulsar ningún botón.
Sensor de la temperatura de la piel
Realiza lecturas periódicas sobre cómo cambia la temperatura de tu piel mientras duermes.
Batería con una duración de hasta 7 días
Ponte tu Galaxy Ring para ir al trabajo, al gimnasio, a la cama y repite todo de nuevo sin tener que cargar la batería. Galaxy Ring funciona día y noche con una batería que dura hasta 7 días con una sola carga. , ,
Pueden verse tres círculos. El del centro está colocado dentro de un Galaxy Ring. Cada círculo muestra diferentes manos que llevan el anillo en diferentes situaciones. Las escenas cambian a medida que el texto debajo del Galaxy Ring cambia de Hasta 1 día a Hasta 7 días. Junto al texto aparece un icono de batería completamente cargada para indicar que la batería puede durar hasta 7 días.
Un monitor de salud con AI en tu dedo
Cuanto más uses tu Galaxy Ring, más inteligente será. Coloca tu Galaxy Ring en el dedo y deja que controle tu salud durante todo el día. Después, consulta la aplicación Samsung Health para ver el completo informe de salud que ha elaborado Galaxy AI. , , , ,
Galaxy AIha llegado
Un Galaxy Ring gira y se coloca en una posición de vista lateral ligeramente inclinada. También aparecen Smartphones con la interfaz gráfica de diferentes funciones de Samsung Health en pantalla.
Funda de carga transparente y funcional
Incluso mientras se carga en su estuche transparente, el Galaxy Ring es un espectáculo para la vista. El delicado brillo de la luz alrededor del botón multifunción indica el nivel de carga de la batería. El estuche de carga también se puede cargar de forma inalámbrica, así que solo tienes que guardar el Galaxy Ring en su estuche cuando estés fuera de casa y colocarlo en una base de carga inalámbrica para cargarlo fácilmente., ,
La tapa del estuche de carga Galaxy Ring se abre. Un Galaxy Ring se encuentra en su lugar, alrededor del botón multifunción. La luz indicadora circular se enciende en sentido contrario a las agujas del reloj hasta iluminarse completamente en círculo.
Un Galaxy Ring se encuentra en su lugar, alrededor del botón multifunción. La luz del indicador circular se enciende en sentido contrario a las agujas del reloj alrededor de un círculo hasta el 70% para indicar el nivel de batería correspondiente.
Un Galaxy Ring se encuentra en su lugar, alrededor del botón multifunción. La luz del indicador circular parpadea y se mueve en el sentido contrario a las agujas del reloj.
Delgado y ligero. Se adapta bien de día y de noche
Tanto si estás escribiendo en un teclado, cocinando o incluso durmiendo, el diseño delgado y la ligera estructura de titanio de Galaxy Ring son tan cómodos que te olvidarás de que lo llevas puesto.
Colores que combinan con cualquier estilo
Desde el gimnasio hasta el salón de baile, luce el Galaxy Ring en cualquier ocasión. Ya sea con la sutil sofisticación del Negro Titanio y el Plata Titanio, o con el brillante resplandor del Oro titanio, Galaxy Ring combina a la perfección con tu look. Explora en detalle los tres colores únicos del Galaxy Ring.
Negro Titanio
Plata Titanio
Oro titanio
Negro TitanioPlata TitanioOro titanio
10 ATM de resistencia al agua
No te quites el Galaxy Ring mientras te lavas las manos, te metes en la ducha o te das un chapuzón en el mar. Galaxy Ring tiene una resistencia al agua de 10 ATM, lo que significa que seguirá registrando tu estado de salud aunque estés empapado.
Se ve una mano que lleva un Galaxy Ring. Un chorro de agua cae sobre la mano para ilustrar la resistencia al agua del anillo.
Información sobre salud basada en AI en Samsung Health
Empieza tu viaje hacia el bienestar con el pie derecho con los consejos de Galaxy AI en la aplicación Samsung Health. Galaxy AI analiza tus datos de salud para ofrecerte consejos personalizados que puedes incorporar a tu rutina diaria. También te envía alertas cuando llevas un rato sin moverte o si tu ritmo cardíaco parece inestable. , ,
La parte superior muestra el ícono de la aplicación Samsung Health y el texto Samsung Health. punteado en el centro, como si atravesara el anillo. El anillo gira y el ícono cambia a un corazón punteado para indicar la función de monitoreo cardíaco de Samsung Health. Encima del anillo, el símbolo de la aplicación Samsung Health y el texto Samsung Health cambian al texto Galaxy AI ha llegado.
Controla tu condición diaria con Energy Score
Conocer tu condición es la clave para desbloquear un día más brillante. Energy Score es un resultado exhaustivo del análisis de tus patrones de sueño, actividades y frecuencia cardíaca para informarte de tu estado con una sencilla puntuación. Planifica con antelación y muévete de forma más inteligente con Galaxy AI.,
En la parte superior, los sensores de Galaxy Ring se iluminan y el anillo se mueve para ilustrar la valoración energética que aumenta cada día. Energy Score 92 se puede ver con el texto Excelente abajo.
Mantente motivado con Wellness Tips
Obtén información personalizada a través de Wellness Tips. Identifica patrones de salud y recibe consejos útiles para tu camino hacia el bienestar.
Se puede ver el texto ¿En qué quieres centrarte, Sam? Debajo hay cuatro iconos: Salud general, Sueño, Ejercicio y Peso saludable. El ícono de Sueño aparece resaltado para indicar que fue seleccionado. Aparece la función Consejos de bienestar y el texto Practicaste mejores hábitos de sueño la semana pasada que la anterior, con una tasa media de logro de hábitos de sueño del 85%. Continúa con tu entrenamiento del sueño para que los hábitos de sueño saludables formen parte de tu rutina. A continuación se muestra el gráfico de barras correspondiente. A la izquierda está la Semana 2 con el texto 52%. A la derecha está la última semana con el texto 85%.
Levántate y brilla con un mejor conocimiento del sueño
Duerme toda la noche con tu Galaxy Ring encendido. Juntos, Galaxy Ring y Samsung Health monitorean tu sueño en general, incluyendo la etapa del sueño, el patrón de sueño, el movimiento nocturno, la temperatura nocturna de la piel, la FC y la VFC durante el sueño. Obtén Sleep Coaching basado en los datos para mejorar tus hábitos de sueño,
Controla fácilmente tus ciclos con la temperatura de la piel
Gestiona tus ciclos más fácilmente y planifica con antelación con Galaxy Ring. El sensor de temperatura de la piel detecta cambios en la temperatura de tu piel mientras duermes. Los datos de tu temperatura son utilizados por el algoritmo de fertilidad adaptado de Natural Cycles° para predecir tu próximo período y el inicio de tu siguiente ciclo ,
Monitoreo del ritmo cardíaco en el que puedes confiar
Controla de cerca tu ritmo cardiaco para estar tranquilo. Galaxy Ring monitorea continuamente tu ritmo cardíaco y envía alertas a través de la aplicación Samsung Health cuando tu ritmo cardíaco es demasiado alto o demasiado bajo, asegurándose de que te mantengas informado. ,
Galaxy Ring realiza un seguimiento automático de tus paseos y carreras
Simplemente colócalo en tu dedo y Galaxy Ring se encargará del resto. Galaxy Ring realiza un seguimiento automático de tus caminatas y carreras sin tener que pulsar ningún botón de inicio. Consulta las calorías quemadas y otras estadísticas en la aplicación Samsung Health para seguir tu progreso. ,
Hoy
Se puede ver la interfaz gráfica de usuario de la alerta de inactividad y el seguimiento automático de la carrera y el paseo.
Armonizando tu camino hacia la salud
Accede y gestiona información completa sobre tu salud y bienestar general a través de la aplicación Samsung Health en tus dispositivos Samsung Galaxy. Integra información detallada para alcanzar tus objetivos de bienestar.
Disfruta de la experiencia perfecta en todos los teléfonos inteligentes Android
Comienza tu experiencia con Galaxy Wearable en tu teléfono inteligente Android. Empareja tu Galaxy Watch, Buds o Ring fácilmente con el teléfono Android que ya tienes. Solo tienes que descargar las aplicaciones Galaxy Wearable y Samsung Health en Google Play y listo. Incluso puedes probar diferentes esferas de reloj en la aplicación Galaxy Wearable: mezcla y combina distintas funciones a tu gusto. , , , , , , , , , , ,
Sólo tienes que pulsar dos veces para controlar tu smartphone
Con Galaxy Ring en tu dedo, puedes controlar tu smartphone Samsung Galaxy emparejado con un simple gesto. Solo tienes que pulsar dos veces con el pulgar y el dedo que lleva el Galaxy Ring para hacer fotos o desactivar las alarmas., ,
Rastrear hasta la última ubicación con Find My Ring
¿Has perdido tu Galaxy Ring? Respira hondo y abre Find My Ring en tu dispositivo Samsung Galaxy para ver la ubicación en la que se vinculó por última vez tu Galaxy Ring., , ,
Empieza con tu Samsung Account
Para empezar a utilizar Galaxy Ring, debes registrar una Samsung Account en tu Galaxy. Los datos de salud de tu Galaxy Ring se transferirán y almacenarán de forma segura en la nube de Samsung conectada a tu cuenta, para que puedas acceder a ellos y gestionarlos completamente, ,
Cómo medir tu dedo
Encuentra la circunferencia, la medida de la base de tu dedo y descubre el borde ideal.
PASO 1
Marca con la línea la circunferencia del dedo en el que llevarás el anillo.
PASO 2
Asegúrese de que la línea sea cómoda para usted y marque dónde la línea se encuentra con la punta.
PASO 3
Desenrolle la línea con la marca y mida la longitud con la regla.
measure
Los centímetros indicados en la regla indican tu llanta según la tabla.
Encuentra el adecuado
Encuentra el anillo adecuado con el kit de tallas de Galaxy Ring. Las tallas del Galaxy Ring pueden ser diferentes de las de los anillos normales, así que adquiere el Kit de tallas en el momento de la compra para encontrar el ajuste ideal para tu dedo. Elige entre una selección de 9 anillos de muestra y póntelos durante más de un día completo para asegurarte de que tu dedo se siente cómodo. Una vez que hayas tomado tu decisión, completa tu pedido en la página Mi pedido., , , ,
How to find your Galaxy Ring size with the Sizing Kit. Want to find your galaxy ring size? It may be different from regular rings because of the sensors. The Galaxy Ring Sizing Kit will help you find your ring size. Open the box and check out the sample rings. The sample rings come in 9 sizes, from 5 to 13. You can wear them on any finger. Pick a size and try it on. Check the position of the three sensors on the bottom. And the indicator on the outer surface. Wear the sample ring so that the sensors are facing up. Make sure the indicator is also on the palm side. And ensure that your finger feels comfortable. Check that it’s not too small or too big. Try them out to find your size from 9 available options. When you find the one that feels right, move your fingers around. Finger sizes can change from day to night. So it’s recommended to keep the ring on for over 24 hours. Go about your day and sleep through the night. Does your finger feel comfortable even after 24 hours? Great! You’ve found your Galaxy Ring size. samsung.com. Samsung logo. Video simulated for illustrative purposes. One Sizing Kit is available free of charge upon purchasing the Galaxy Ring. Only one Sizing Kit is provided per order number. Sample rings included in the Galaxy Ring Sizing Kit are only for measuring the size for Galaxy Ring. Do not wear the sample ring for longer than intended. Doing so may result in skin irritation. Wearing the sample ring for at least 24 hours is recommended to allow sufficient time for your finger to adapt to the fit of the Galaxy Ring. Availability of Galaxy Ring sizes and colors may vary by country/region. Galaxy Ring sizes are based on US standard sizes (US 5 - US 13).
Paso 1. Recibir el kit de tallas
Pide el Galaxy Ring y elige la opción "No sé mi talla". El Kit de Tallaje se enviará primero, antes de que confirmes la talla del Galaxy Ring real.
Paso 2. Prueba tu talla
Utiliza anillos de muestra para encontrar la talla que se adapta al dedo en el que quieres llevar tu Galaxy Ring. Lleva puesto el anillo de muestra durante al menos 24 horas para asegurarte de que el anillo se ajusta cómodamente a tu dedo.
Paso 3. Confirma tu talla
Confirma la talla de tu anillo en la página "Mi pedido". Consulta tu bandeja de entrada para recibir el correo electrónico de confirmación de la talla.
La disponibilidad de las tallas y colores del Anillo Galaxy puede variar según el proveedor.
Para las funciones de Samsung Health AI, los datos de salud registrados desde Samsung Galaxy Ring deben sincronizarse con la aplicación Samsung Health. Necesitas al menos los datos de actividad y sueño del día anterior, así como los datos de frecuencia cardiaca durante el sueño. No está diseñado para su uso en la detección, diagnóstico, tratamiento de cualquier condición médica.
El titanio solo se aplica en el marco del anillo.
Las funciones de seguimiento de Samsung Health están pensadas únicamente para fines generales de bienestar y forma física. No están destinadas a la detección, diagnóstico, tratamiento, seguimiento o control de ninguna afección médica o enfermedad. Cualquier información relacionada con la salud a la que se acceda a través del dispositivo y la aplicación no debe tratarse como consejo médico. Los usuarios deben consultar a un médico.
Imagen utilizada con fines ilustrativos.
El peso de Galaxy Ring varía según el tamaño. 2.3 g es el peso de la talla 5 de Galaxy Ring. Talla 6 Galaxy Ring 2.4g, talla 7 Galaxy Ring 2.4g, talla 8 Galaxy Ring 2.6g, talla 9 Galaxy Ring 2.7g, talla 10 Galaxy Ring 2.8g, talla 11 Galaxy Ring 2.8, talla 12 Galaxy Ring 3.0g, talla 13 Galaxy Ring 3.0g.
Galaxy Ring debe vincularse a un Smartphone Samsung Galaxy con Android 11.0 o superior y una memoria mínima de 1.5 GB. Se requiere la aplicación Samsung Health (v6.27 o superior) y el inicio de sesión en una Samsung Account. La disponibilidad del servicio puede variar según la región.
Duración de la batería basada en pruebas realizadas con el Galaxy Ring de tamaño 12,13. La duración de la batería del Galaxy Ring de tamaño 12,13 es de hasta 7 días con una sola carga. La duración de la batería varía según el tamaño del anillo.
La duración de la batería se basa en los resultados de las pruebas de laboratorio internas realizadas por Samsung con patrones de uso típicos. Probado con resultados de una versión de pre-lanzamiento del dispositivo usando bajo el escenario de Seguimiento de Sueño durante 6 horas, Detección Automática de Trabajo durante 1 hora y 30 minutos y con varios eventos específicos (20 veces de reconexión después de desconexión, 3 veces de cambio de configuración de la app Samsung Health, 0,5 veces de ejecución de Find My Ring, 3 minutos de ejecución de gestos) asumiendo 24 horas de uso al día. La duración real de la batería puede variar en función de los distintos patrones de uso, el modelo de dispositivo o el fabricante de la batería.
La duración real de la batería varía en función de los patrones de uso y otros factores. La capacidad nominal es de 17 mAh para los tamaños 5,6,7 (duración de la batería de hasta 6 días con una sola carga), 18,5 mAh para los tamaños 8,9,10,11 (duración de la batería de hasta 6 días con una sola carga) y 22,5 mAh para los tamaños 12,13 (duración de la batería de hasta 7 días con una sola carga). Pruebas realizadas por Samsung con el cable USB C de carga rápida y el adaptador de corriente USB C de 25 W de Samsung. El tiempo de carga varía en función de la configuración, el patrón de uso y los factores ambientales; los resultados reales pueden variar.
Energy Score está pensado únicamente para fines de bienestar general y fitness. Energy Score solo es compatible con las series Galaxy Ring o Galaxy Watch4 y los modelos posteriores de Samsung Galaxy Watch, incluidos los nuevos Galaxy Watch Ultra y Galaxy Watch7. Para comprobar la puntuación de energía de Galaxy AI, los datos de salud registrados en Samsung Galaxy Watch o Galaxy Ring deben estar sincronizados con la aplicación Samsung Health. Necesita al menos los datos de actividad y sueño del día anterior, así como los datos de frecuencia cardíaca durante el sueño.
Las funciones de seguimiento del sueño están pensadas únicamente para fines de bienestar general y fitness. No están pensadas para su uso en la detección, diagnóstico o tratamiento de ninguna afección médica o trastorno del sueño. Las mediciones son sólo para su referencia personal. Consulta a un profesional médico para que te asesore.
Sleep Coaching requiere datos de sueño de al menos 7 días, incluyendo 2 días de descanso.
Galaxy Ring incluye 1 estuche de carga y 1 cable USB.
El tamaño del estuche de carga varía en función del tamaño del Galaxy Ring.
El cargador inalámbrico se vende por separado.
Galaxy Ring tiene una resistencia al agua de 100 metros según la norma ISO22810. La prueba se realizó en agua con un 5% de sal y 4 ppm de cloro. Galaxy Ring también es resistente al agua con una clasificación IP68 basada en las condiciones de las pruebas de laboratorio para sumergirlo en hasta 1,5 metros de agua dulce durante un máximo de 30 minutos. No es apto para actividades acuáticas de alta presión ni para bucear. Puede utilizarse para actividades en aguas poco profundas, como nadar en una piscina o en el océano. La resistencia al agua no es una condición permanente y puede disminuir con el tiempo. Si ha estado expuesto al agua de mar, aclárelo con agua dulce y séquelo después de usarlo. Consulte el manual del usuario para obtener más información, incluidas las instrucciones de cuidado/uso.
Wellness Tips está disponible en smartphones Android (Android 11 o superior) y requiere la aplicación Samsung Health (v6.27 o superior). Es necesario iniciar sesión en tu Samsung Account. La disponibilidad del servicio puede variar según el proveedor.
Cycle Tracking está disponible para la predicción de ciclos y períodos con la tecnología de Natural Cycles. El seguimiento del ciclo basado en la temperatura de la piel funciona en smartphones y relojes adquiridos en los países en los que el servicio está disponible actualmente. NO ES UN MÉTODO ANTICONCEPTIVO. Si actualmente está tomando anticonceptivos hormonales o se está sometiendo a un tratamiento hormonal que inhibe la ovulación, este servicio no será útil para el seguimiento de la ovulación. Las predicciones mostradas son sólo para referencia personal. Para mejorar la precisión de las predicciones, se recomienda llevar puesto el anillo durante al menos 4 horas mientras duerme, 5 veces por semana. Las predicciones pueden variar en función del uso adecuado del anillo, los datos introducidos, las condiciones ambientales, etc. Destinado a usuarios mayores de 18 años. Los usuarios no deben interpretar ni tomar medidas clínicas basadas en las predicciones realizadas sin consultar a un profesional sanitario cualificado. Requiere la última versión de la aplicación Samsung Health.
La disponibilidad de las funciones de Samsung Health puede variar en función del país o la región.
La alerta de frecuencia cardíaca está pensada únicamente para el bienestar general y la forma física. No está pensada para su uso en la detección, diagnóstico, tratamiento, seguimiento o control de ninguna afección médica o enfermedad. Cualquier información relacionada con la salud a la que se acceda a través del dispositivo y la aplicación Samsung Health no debe tratarse como consejo médico. Los usuarios deben consultar a un médico.
El seguimiento del ejercicio está destinado únicamente a fines de bienestar general y de mantenimiento físico. No está diseñado para su uso en la detección, diagnóstico, tratamiento, seguimiento o control de ninguna afección médica o enfermedad. Cualquier información relacionada con la salud a la que se acceda a través del dispositivo y de la aplicación Samsung Health no debe tratarse como consejo médico. Los usuarios deben consultar a un médico.
La función de doble pellizco solo se puede utilizar para controlar la cámara y desactivar la alarma. La función de doble pellizco solo se puede utilizar en el Galaxy Ring emparejado con teléfonos inteligentes Samsung Galaxy con One UI 6.1.1 o superior. Para desactivar la alarma, la versión de la aplicación del reloj debe ser 12.3.30.35 o superior.
Galaxy Z Flip6 se vende por separado.
Durante ciertas actividades, Galaxy Ring puede detectar un gesto de doble pellizco que no tenía intención de realizar. En este caso, sugerimos desactivar la función de reconocimiento de gestos durante esas actividades.
Encontrar mi anillo solo es compatible con Samsung Find. El historial de ubicación (rastrear mi anillo) no es compatible.
Find My Ring en Samsung Find rastrea el Galaxy Ring basándose en la última ubicación conectada.
Samsung Find solo está disponible en dispositivos Samsung Galaxy con Android 11.0 o posterior.
Find My Ring muestra la última ubicación en la que se vinculo el Galaxy Ring con un dispositivo Samsung Galaxy. No realiza un seguimiento de la ubicación del anillo.
Las tallas de Galaxy Ring se basan en las tallas estándar de EE.UU. (US 5 - US 13).
Con la compra del Galaxy Ring se proporciona gratuitamente un Kit de Tallas. Sólo se proporciona un Kit de Tallas por número de pedido.
Los anillos de muestra incluidos en el Kit de Tallas para Galaxy Ring no son operativos y sólo sirven para medir la talla del anillo.
Se recomienda llevar el anillo de muestra durante al menos 24 horas para que su dedo tenga tiempo suficiente para adaptarse al ajuste del Galaxy Ring.
El Galaxy Watch7, el Galaxy Watch Ultra y el Galaxy Ring deben estar emparejados con un teléfono inteligente con Android 11.0 o superior y una memoria mínima de 1.5GB.
La conexión de los Galaxy Buds como audio Bluetooth está disponible independientemente del sistema operativo, pero para configurar los ajustes avanzados en la aplicación Galaxy Wearable, los Galaxy Buds deben estar emparejados con un teléfono inteligente con Android 10.0 o superior y una memoria mínima de 1.5GB.
La función Suggested Replies en el Galaxy Watch7 y el Galaxy Watch Ultra solo está disponible en teléfonos inteligentes Samsung Galaxy.
Los ajustes avanzados de la aplicación Galaxy Wearable incluyen control de ruido, Adaptive EQ, control por pellizco y actualización de software.
Algunas funciones solo están disponibles en determinados teléfonos inteligentes Samsung Galaxy.
La aplicación Samsung Health Monitor solo está disponible en teléfonos inteligentes Samsung Galaxy.
La aplicación Galaxy Wearable no es compatible con iOS.
Android es una marca comercial de Google LCC.
")).attr("data-swiper-slide-index") || e.attr("data-swiper-slide-index", t), i.cache && (this.virtual.cache[t] = e), e) }, appendSlide: function (e) { if ("object" == typeof e && "length" in e) for (var t = 0; t < e.length; t += 1)e[t] && this.virtual.slides.push(e[t]); else this.virtual.slides.push(e); this.virtual.update(!0) }, prependSlide: function (e) { var s, a, t = this.activeIndex, i = t + 1, n = 1; if (Array.isArray(e)) { for (var r = 0; r < e.length; r += 1)e[r] && this.virtual.slides.unshift(e[r]); i = t + e.length, n = e.length } else this.virtual.slides.unshift(e); this.params.virtual.cache && (s = this.virtual.cache, a = {}, Object.keys(s).forEach(function (e) { var t = s[e], i = t.attr("data-swiper-slide-index"); i && t.attr("data-swiper-slide-index", parseInt(i, 10) + 1), a[parseInt(e, 10) + n] = t }), this.virtual.cache = a), this.virtual.update(!0), this.slideTo(i, 0) }, removeSlide: function (e) { if (null != e) { var t = this.activeIndex; if (Array.isArray(e)) for (var i = e.length - 1; 0 <= i; --i)this.virtual.slides.splice(e[i], 1), this.params.virtual.cache && delete this.virtual.cache[e[i]], e[i] < t && --t, t = Math.max(t, 0); else this.virtual.slides.splice(e, 1), this.params.virtual.cache && delete this.virtual.cache[e], e < t && --t, t = Math.max(t, 0); this.virtual.update(!0), this.slideTo(t, 0) } }, removeAllSlides: function () { this.virtual.slides = [], this.params.virtual.cache && (this.virtual.cache = {}), this.virtual.update(!0), this.slideTo(0, 0) } }, y = { name: "virtual", params: { virtual: { enabled: !1, slides: [], cache: !0, renderSlide: null, renderExternal: null, addSlidesBefore: 0, addSlidesAfter: 0 } }, create: function () { U.extend(this, { virtual: { update: w.update.bind(this), appendSlide: w.appendSlide.bind(this), prependSlide: w.prependSlide.bind(this), removeSlide: w.removeSlide.bind(this), removeAllSlides: w.removeAllSlides.bind(this), renderSlide: w.renderSlide.bind(this), slides: this.params.virtual.slides, cache: {} } }) }, on: { beforeInit: function () { var e; this.params.virtual.enabled && (this.classNames.push(this.params.containerModifierClass + "virtual"), U.extend(this.params, e = { watchSlidesProgress: !0 }), U.extend(this.originalParams, e), this.params.initialSlide || this.virtual.update()) }, setTranslate: function () { this.params.virtual.enabled && this.virtual.update() } } }, K = { handle: function (e) { var t = this.rtlTranslate, i = (e = e.originalEvent ? e.originalEvent : e).keyCode || e.charCode; if (!this.allowSlideNext && (this.isHorizontal() && 39 === i || this.isVertical() && 40 === i || 34 === i)) return !1; if (!this.allowSlidePrev && (this.isHorizontal() && 37 === i || this.isVertical() && 38 === i || 33 === i)) return !1; if (!(e.shiftKey || e.altKey || e.ctrlKey || e.metaKey || c.activeElement && c.activeElement.nodeName && ("input" === c.activeElement.nodeName.toLowerCase() || "textarea" === c.activeElement.nodeName.toLowerCase()))) { if (this.params.keyboard.onlyInViewport && (33 === i || 34 === i || 37 === i || 39 === i || 38 === i || 40 === i)) { var s = !1; if (0 < this.$el.parents("." + this.params.slideClass).length && 0 === this.$el.parents("." + this.params.slideActiveClass).length) return; var a = X.innerWidth, n = X.innerHeight, r = this.$el.offset(); t && (r.left -= this.$el[0].scrollLeft); for (var o = [[r.left, r.top], [r.left + this.width, r.top], [r.left, r.top + this.height], [r.left + this.width, r.top + this.height]], l = 0; l < o.length; l += 1) { var d = o[l]; 0 <= d[0] && d[0] <= a && 0 <= d[1] && d[1] <= n && (s = !0) } if (!s) return } this.isHorizontal() ? (33 !== i && 34 !== i && 37 !== i && 39 !== i || (e.preventDefault ? e.preventDefault() : e.returnValue = !1), (34 !== i && 39 !== i || t) && (33 !== i && 37 !== i || !t) || this.slideNext(), (33 !== i && 37 !== i || t) && (34 !== i && 39 !== i || !t) || this.slidePrev()) : (33 !== i && 34 !== i && 38 !== i && 40 !== i || (e.preventDefault ? e.preventDefault() : e.returnValue = !1), 34 !== i && 40 !== i || this.slideNext(), 33 !== i && 38 !== i || this.slidePrev()), this.emit("keyPress", i) } }, enable: function () { this.keyboard.enabled || (S(c).on("keydown", this.keyboard.handle), this.keyboard.enabled = !0) }, disable: function () { this.keyboard.enabled && (S(c).off("keydown", this.keyboard.handle), this.keyboard.enabled = !1) } }, E = { name: "keyboard", params: { keyboard: { enabled: !1, onlyInViewport: !0 } }, create: function () { U.extend(this, { keyboard: { enabled: !1, enable: K.enable.bind(this), disable: K.disable.bind(this), handle: K.handle.bind(this) } }) }, on: { init: function () { this.params.keyboard.enabled && this.keyboard.enable() }, destroy: function () { this.keyboard.enabled && this.keyboard.disable() } } }; function T() { for (var i, e = [], t = arguments.length; t--;)e[t] = arguments[t]; i = (i = 1 === e.length && e[0].constructor && e[0].constructor === Object ? e[0] : (n = e[0], e[1])) || {}, i = U.extend({}, i), n && !i.el && (i.el = n), h.call(this, i), Object.keys(_).forEach(function (t) { Object.keys(_[t]).forEach(function (e) { T.prototype[e] || (T.prototype[e] = _[t][e]) }) }); var s, a, n, r = this, o = (void 0 === r.modules && (r.modules = {}), Object.keys(r.modules).forEach(function (e) { var t, e = r.modules[e]; e.params && (t = Object.keys(e.params)[0], "object" == typeof (e = e.params[t])) && null !== e && t in i && "enabled" in e && (!0 === i[t] && (i[t] = { enabled: !0 }), "object" != typeof i[t] || "enabled" in i[t] || (i[t].enabled = !0), i[t] || (i[t] = { enabled: !1 })) }), U.extend({}, F)), l = (r.useModulesParams(o), r.params = U.extend({}, o, W, i), r.originalParams = U.extend({}, r.params), r.passedParams = U.extend({}, i), (r.$ = S)(r.params.el)); if (n = l[0]) return 1 < l.length ? (s = [], l.each(function (e, t) { t = U.extend({}, i, { el: t }); s.push(new T(t)) }), s) : (n.swiper = r, l.data("swiper", r), n && n.shadowRoot && n.shadowRoot.querySelector ? (a = S(n.shadowRoot.querySelector("." + r.params.wrapperClass))).children = function (e) { return l.children(e) } : a = l.children("." + r.params.wrapperClass), U.extend(r, { $el: l, el: n, $wrapperEl: a, wrapperEl: a[0], classNames: [], slides: S(), slidesGrid: [], snapGrid: [], slidesSizesGrid: [], isHorizontal: function () { return "horizontal" === r.params.direction }, isVertical: function () { return "vertical" === r.params.direction }, rtl: "rtl" === n.dir.toLowerCase() || "rtl" === l.css("direction"), rtlTranslate: "horizontal" === r.params.direction && ("rtl" === n.dir.toLowerCase() || "rtl" === l.css("direction")), wrongRTL: "-webkit-box" === a.css("display"), activeIndex: 0, realIndex: 0, isBeginning: !0, isEnd: !1, translate: 0, previousTranslate: 0, progress: 0, velocity: 0, animating: !1, allowSlideNext: r.params.allowSlideNext, allowSlidePrev: r.params.allowSlidePrev, touchEvents: (o = b.pointerEvents ? ["pointerdown", "pointermove", "pointerup"] : ["mousedown", "mousemove", "mouseup"], r.touchEventsTouch = { start: (n = ["touchstart", "touchmove", "touchend", "touchcancel"])[0], move: n[1], end: n[2], cancel: n[3] }, r.touchEventsDesktop = { start: o[0], move: o[1], end: o[2] }, b.touch || !r.params.simulateTouch ? r.touchEventsTouch : r.touchEventsDesktop), touchEventsData: { isTouched: void 0, isMoved: void 0, allowTouchCallbacks: void 0, touchStartTime: void 0, isScrolling: void 0, currentTranslate: void 0, startTranslate: void 0, allowThresholdMove: void 0, formElements: "input, select, option, textarea, button, video", lastClickTime: U.now(), clickTimeout: void 0, velocities: [], allowMomentumBounce: void 0, isTouchEvent: void 0, startMoving: void 0 }, allowClick: !0, allowTouchMove: r.params.allowTouchMove, touches: { startX: 0, startY: 0, currentX: 0, currentY: 0, diff: 0 }, imagesToLoad: [], imagesLoaded: 0 }), r.useModules(), r.params.init && r.init(), r) } var x = { lastScrollTime: U.now(), lastEventBeforeSnap: void 0, recentWheelEvents: [], event: function () { return -1 < X.navigator.userAgent.indexOf("firefox") ? "DOMMouseScroll" : ((t = "onwheel" in c) || ((e = c.createElement("div")).setAttribute("onwheel", "return;"), t = "function" == typeof e.onwheel), (t = !t && c.implementation && c.implementation.hasFeature && !0 !== c.implementation.hasFeature("", "") ? c.implementation.hasFeature("Events.wheel", "3.0") : t) ? "wheel" : "mousewheel"); var e, t }, normalize: function (e) { var t = 0, i = 0, s = 0, a = 0; return "detail" in e && (i = e.detail), "wheelDelta" in e && (i = -e.wheelDelta / 120), "wheelDeltaY" in e && (i = -e.wheelDeltaY / 120), "wheelDeltaX" in e && (t = -e.wheelDeltaX / 120), "axis" in e && e.axis === e.HORIZONTAL_AXIS && (t = i, i = 0), s = 10 * t, a = 10 * i, "deltaY" in e && (a = e.deltaY), "deltaX" in e && (s = e.deltaX), e.shiftKey && !s && (s = a, a = 0), (s || a) && e.deltaMode && (1 === e.deltaMode ? (s *= 40, a *= 40) : (s *= 800, a *= 800)), { spinX: t = s && !t ? s < 1 ? -1 : 1 : t, spinY: i = a && !i ? a < 1 ? -1 : 1 : i, pixelX: s, pixelY: a } }, handleMouseEnter: function () { this.mouseEntered = !0 }, handleMouseLeave: function () { this.mouseEntered = !1 }, handle: function (e) { var t = e, i = this, s = i.params.mousewheel; if (i.params.cssMode && t.preventDefault(), !i.mouseEntered && !s.releaseOnEdges) return !0; t.originalEvent && (t = t.originalEvent); var a = 0, n = i.rtlTranslate ? -1 : 1, r = x.normalize(t); if (s.forceToAxis) if (i.isHorizontal()) { if (!(Math.abs(r.pixelX) > Math.abs(r.pixelY))) return !0; a = r.pixelX * n } else { if (!(Math.abs(r.pixelY) > Math.abs(r.pixelX))) return !0; a = r.pixelY } else a = Math.abs(r.pixelX) > Math.abs(r.pixelY) ? -r.pixelX * n : -r.pixelY; if (0 === a) return !0; if (s.invert && (a = -a), i.params.freeMode) { var o = { time: U.now(), delta: Math.abs(a), direction: Math.sign(a) }, n = i.mousewheel.lastEventBeforeSnap, r = n && o.time < n.time + 500 && o.delta <= n.delta && o.direction === n.direction; if (!r) { i.mousewheel.lastEventBeforeSnap = void 0, i.params.loop && i.loopFix(); var l, d, n = i.getTranslate() + a * s.sensitivity, s = i.isBeginning, h = i.isEnd; if ((n = n >= i.minTranslate() ? i.minTranslate() : n) <= i.maxTranslate() && (n = i.maxTranslate()), i.setTransition(0), i.setTranslate(n), i.updateProgress(), i.updateActiveIndex(), i.updateSlidesClasses(), (!s && i.isBeginning || !h && i.isEnd) && i.updateSlidesClasses(), i.params.freeModeSticky && (clearTimeout(i.mousewheel.timeout), i.mousewheel.timeout = void 0, 15 <= (l = i.mousewheel.recentWheelEvents).length && l.shift(), s = l.length ? l[l.length - 1] : void 0, h = l[0], l.push(o), s && (o.delta > s.delta || o.direction !== s.direction) ? l.splice(0) : 15 <= l.length && o.time - h.time < 500 && 1 <= h.delta - o.delta && o.delta <= 6 && (d = 0 < a ? .8 : .2, i.mousewheel.lastEventBeforeSnap = o, l.splice(0), i.mousewheel.timeout = U.nextTick(function () { i.slideToClosest(i.params.speed, !0, void 0, d) }, 0)), i.mousewheel.timeout || (i.mousewheel.timeout = U.nextTick(function () { i.mousewheel.lastEventBeforeSnap = o, l.splice(0), i.slideToClosest(i.params.speed, !0, void 0, .5) }, 500))), r || i.emit("scroll", t), i.params.autoplay && i.params.autoplayDisableOnInteraction && i.autoplay.stop(), n === i.minTranslate() || n === i.maxTranslate()) return !0 } } else { s = { time: U.now(), delta: Math.abs(a), direction: Math.sign(a), raw: e }, h = i.mousewheel.recentWheelEvents, r = (2 <= h.length && h.shift(), h.length ? h[h.length - 1] : void 0); if (h.push(s), (!r || s.direction !== r.direction || s.delta > r.delta) && i.mousewheel.animateSlider(s), i.mousewheel.releaseScroll(s)) return !0 } return t.preventDefault ? t.preventDefault() : t.returnValue = !1, !1 }, animateSlider: function (e) { return 6 <= e.delta && U.now() - this.mousewheel.lastScrollTime < 60 || (e.direction < 0 ? this.isEnd && !this.params.loop || this.animating || (this.slideNext(), this.emit("scroll", e.raw)) : this.isBeginning && !this.params.loop || this.animating || (this.slidePrev(), this.emit("scroll", e.raw)), this.mousewheel.lastScrollTime = (new X.Date).getTime(), !1) }, releaseScroll: function (e) { var t = this.params.mousewheel; if (e.direction < 0) { if (this.isEnd && !this.params.loop && t.releaseOnEdges) return !0 } else if (this.isBeginning && !this.params.loop && t.releaseOnEdges) return !0; return !1 }, enable: function () { var e, t = x.event(); return this.params.cssMode ? (this.wrapperEl.removeEventListener(t, this.mousewheel.handle), !0) : !!t && !this.mousewheel.enabled && (e = this.$el, (e = "container" !== this.params.mousewheel.eventsTarged ? S(this.params.mousewheel.eventsTarged) : e).on("mouseenter", this.mousewheel.handleMouseEnter), e.on("mouseleave", this.mousewheel.handleMouseLeave), e.on(t, this.mousewheel.handle), this.mousewheel.enabled = !0) }, disable: function () { var e, t = x.event(); return this.params.cssMode ? (this.wrapperEl.addEventListener(t, this.mousewheel.handle), !0) : !!t && !(!this.mousewheel.enabled || (e = this.$el, (e = "container" !== this.params.mousewheel.eventsTarged ? S(this.params.mousewheel.eventsTarged) : e).off(t, this.mousewheel.handle), this.mousewheel.enabled = !1)) } }, A = { update: function () { var e, t, i = this.params.navigation; this.params.loop || (e = (t = this.navigation).$nextEl, (t = t.$prevEl) && 0 < t.length && (this.isBeginning ? t.addClass(i.disabledClass) : t.removeClass(i.disabledClass), t[this.params.watchOverflow && this.isLocked ? "addClass" : "removeClass"](i.lockClass)), e && 0 < e.length && (this.isEnd ? e.addClass(i.disabledClass) : e.removeClass(i.disabledClass), e[this.params.watchOverflow && this.isLocked ? "addClass" : "removeClass"](i.lockClass))) }, onPrevClick: function (e) { e.preventDefault(), this.isBeginning && !this.params.loop || this.slidePrev() }, onNextClick: function (e) { e.preventDefault(), this.isEnd && !this.params.loop || this.slideNext() }, init: function () { var e, t, i = this.params.navigation; (i.nextEl || i.prevEl) && (i.nextEl && (e = S(i.nextEl), this.params.uniqueNavElements) && "string" == typeof i.nextEl && 1 < e.length && 1 === this.$el.find(i.nextEl).length && (e = this.$el.find(i.nextEl)), i.prevEl && (t = S(i.prevEl), this.params.uniqueNavElements) && "string" == typeof i.prevEl && 1 < t.length && 1 === this.$el.find(i.prevEl).length && (t = this.$el.find(i.prevEl)), e && 0 < e.length && e.on("click", this.navigation.onNextClick), t && 0 < t.length && t.on("click", this.navigation.onPrevClick), U.extend(this.navigation, { $nextEl: e, nextEl: e && e[0], $prevEl: t, prevEl: t && t[0] })) }, destroy: function () { var e = this.navigation, t = e.$nextEl, e = e.$prevEl; t && t.length && (t.off("click", this.navigation.onNextClick), t.removeClass(this.params.navigation.disabledClass)), e && e.length && (e.off("click", this.navigation.onPrevClick), e.removeClass(this.params.navigation.disabledClass)) } }, L = { update: function () { var e = this.rtl, s = this.params.pagination; if (s.el && this.pagination.el && this.pagination.$el && 0 !== this.pagination.$el.length) { var a, t = (this.virtual && this.params.virtual.enabled ? this.virtual : this).slides.length, i = this.pagination.$el, n = this.params.loop ? Math.ceil((t - 2 * this.loopedSlides) / this.params.slidesPerGroup) : this.snapGrid.length; if (this.params.loop ? ((a = Math.ceil((this.activeIndex - this.loopedSlides) / this.params.slidesPerGroup)) > t - 1 - 2 * this.loopedSlides && (a -= t - 2 * this.loopedSlides), n - 1 < a && (a -= n), a < 0 && "bullets" !== this.params.paginationType && (a = n + a)) : a = void 0 !== this.snapIndex ? this.snapIndex : this.activeIndex || 0, "bullets" === s.type && this.pagination.bullets && 0 < this.pagination.bullets.length) { var r, o, l, d = this.pagination.bullets; if (s.dynamicBullets && (this.pagination.bulletSize = d.eq(0)[this.isHorizontal() ? "outerWidth" : "outerHeight"](!0), i.css(this.isHorizontal() ? "width" : "height", this.pagination.bulletSize * (s.dynamicMainBullets + 4) + "px"), 1 < s.dynamicMainBullets && void 0 !== this.previousIndex && (this.pagination.dynamicBulletIndex += a - this.previousIndex, this.pagination.dynamicBulletIndex > s.dynamicMainBullets - 1 ? this.pagination.dynamicBulletIndex = s.dynamicMainBullets - 1 : this.pagination.dynamicBulletIndex < 0 && (this.pagination.dynamicBulletIndex = 0)), r = a - this.pagination.dynamicBulletIndex, l = ((o = r + (Math.min(d.length, s.dynamicMainBullets) - 1)) + r) / 2), d.removeClass(s.bulletActiveClass + " " + s.bulletActiveClass + "-next " + s.bulletActiveClass + "-next-next " + s.bulletActiveClass + "-prev " + s.bulletActiveClass + "-prev-prev " + s.bulletActiveClass + "-main"), 1 < i.length) d.each(function (e, t) { var t = S(t), i = t.index(); i === a && t.addClass(s.bulletActiveClass), s.dynamicBullets && (r <= i && i <= o && t.addClass(s.bulletActiveClass + "-main"), i === r && t.prev().addClass(s.bulletActiveClass + "-prev").prev().addClass(s.bulletActiveClass + "-prev-prev"), i === o) && t.next().addClass(s.bulletActiveClass + "-next").next().addClass(s.bulletActiveClass + "-next-next") }); else { var t = d.eq(a), h = t.index(); if (t.addClass(s.bulletActiveClass), s.dynamicBullets) { for (var t = d.eq(r), c = d.eq(o), p = r; p <= o; p += 1)d.eq(p).addClass(s.bulletActiveClass + "-main"); if (this.params.loop) if (h >= d.length - s.dynamicMainBullets) { for (var u = s.dynamicMainBullets; 0 <= u; --u)d.eq(d.length - u).addClass(s.bulletActiveClass + "-main"); d.eq(d.length - s.dynamicMainBullets - 1).addClass(s.bulletActiveClass + "-prev") } else t.prev().addClass(s.bulletActiveClass + "-prev").prev().addClass(s.bulletActiveClass + "-prev-prev"), c.next().addClass(s.bulletActiveClass + "-next").next().addClass(s.bulletActiveClass + "-next-next"); else t.prev().addClass(s.bulletActiveClass + "-prev").prev().addClass(s.bulletActiveClass + "-prev-prev"), c.next().addClass(s.bulletActiveClass + "-next").next().addClass(s.bulletActiveClass + "-next-next") } } s.dynamicBullets && (h = Math.min(d.length, s.dynamicMainBullets + 4), t = (this.pagination.bulletSize * h - this.pagination.bulletSize) / 2 - l * this.pagination.bulletSize, c = e ? "right" : "left", d.css(this.isHorizontal() ? c : "top", t + "px")) } "fraction" === s.type && (i.find("." + s.currentClass).text(s.formatFractionCurrent(a + 1)), i.find("." + s.totalClass).text(s.formatFractionTotal(n))), "progressbar" === s.type && (h = s.progressbarOpposite ? this.isHorizontal() ? "vertical" : "horizontal" : this.isHorizontal() ? "horizontal" : "vertical", l = (a + 1) / n, c = e = 1, "horizontal" == h ? e = l : c = l, i.find("." + s.progressbarFillClass).transform("translate3d(0,0,0) scaleX(" + e + ") scaleY(" + c + ")").transition(this.params.speed)), "custom" === s.type && s.renderCustom ? (i.html(s.renderCustom(this, a + 1, n)), this.emit("paginationRender", this, i[0])) : this.emit("paginationUpdate", this, i[0]), i[this.params.watchOverflow && this.isLocked ? "addClass" : "removeClass"](s.lockClass) } }, render: function () { var e = this.params.pagination; if (e.el && this.pagination.el && this.pagination.$el && 0 !== this.pagination.$el.length) { var t = (this.virtual && this.params.virtual.enabled ? this.virtual : this).slides.length, i = this.pagination.$el, s = ""; if ("bullets" === e.type) { for (var a = this.params.loop ? Math.ceil((t - 2 * this.loopedSlides) / this.params.slidesPerGroup) : this.snapGrid.length, n = 0; n < a; n += 1)e.renderBullet ? s += e.renderBullet.call(this, n, e.bulletClass) : s += "<" + e.bulletElement + ' class="' + e.bulletClass + '">' + e.bulletElement + ">"; i.html(s), this.pagination.bullets = i.find("." + e.bulletClass) } "fraction" === e.type && (s = e.renderFraction ? e.renderFraction.call(this, e.currentClass, e.totalClass) : ' / ', i.html(s)), "progressbar" === e.type && (s = e.renderProgressbar ? e.renderProgressbar.call(this, e.progressbarFillClass) : '', i.html(s)), "custom" !== e.type && this.emit("paginationRender", this.pagination.$el[0]) } }, init: function () { var e, t = this, i = t.params.pagination; i.el && 0 !== (e = S(i.el)).length && (t.params.uniqueNavElements && "string" == typeof i.el && 1 < e.length && 1 === t.$el.find(i.el).length && (e = t.$el.find(i.el)), "bullets" === i.type && i.clickable && e.addClass(i.clickableClass), e.addClass(i.modifierClass + i.type), "bullets" === i.type && i.dynamicBullets && (e.addClass("" + i.modifierClass + i.type + "-dynamic"), t.pagination.dynamicBulletIndex = 0, i.dynamicMainBullets < 1) && (i.dynamicMainBullets = 1), "progressbar" === i.type && i.progressbarOpposite && e.addClass(i.progressbarOppositeClass), i.clickable && e.on("click", "." + i.bulletClass, function (e) { e.preventDefault(); e = S(this).index() * t.params.slidesPerGroup; t.params.loop && (e += t.loopedSlides), t.slideTo(e) }), U.extend(t.pagination, { $el: e, el: e[0] })) }, destroy: function () { var e, t = this.params.pagination; t.el && this.pagination.el && this.pagination.$el && 0 !== this.pagination.$el.length && ((e = this.pagination.$el).removeClass(t.hiddenClass), e.removeClass(t.modifierClass + t.type), this.pagination.bullets && this.pagination.bullets.removeClass(t.bulletActiveClass), t.clickable) && e.off("click", "." + t.bulletClass) } }, P = { setTranslate: function () { var e, t, i, s, a, n, r, o; this.params.scrollbar.el && this.scrollbar.el && (i = this.scrollbar, e = this.rtlTranslate, o = this.progress, t = i.dragSize, s = i.$dragEl, a = i.$el, n = this.params.scrollbar, o = ((i = i.trackSize) - (r = t)) * o, e ? 0 < (o = -o) ? (r = t - o, o = 0) : i < -o + t && (r = i + o) : o < 0 ? (r = t + o, o = 0) : i < o + t && (r = i - o), this.isHorizontal() ? (s.transform("translate3d(" + o + "px, 0, 0)"), s[0].style.width = r + "px") : (s.transform("translate3d(0px, " + o + "px, 0)"), s[0].style.height = r + "px"), n.hide) && (clearTimeout(this.scrollbar.timeout), a[0].style.opacity = 1, this.scrollbar.timeout = setTimeout(function () { a[0].style.opacity = 0, a.transition(400) }, 1e3)) }, setTransition: function (e) { this.params.scrollbar.el && this.scrollbar.el && this.scrollbar.$dragEl.transition(e) }, updateSize: function () { var e, t, i, s, a, n, r; this.params.scrollbar.el && this.scrollbar.el && (t = (e = this.scrollbar).$dragEl, i = e.$el, t[0].style.width = "", t[0].style.height = "", s = this.isHorizontal() ? i[0].offsetWidth : i[0].offsetHeight, n = (a = this.size / (this.size * this.snapGrid.length)) * (s / this.size), r = "auto" === this.params.scrollbar.dragSize ? s * a : parseInt(this.params.scrollbar.dragSize, 10), this.isHorizontal() ? t[0].style.width = r + "px" : t[0].style.height = r + "px", i[0].style.display = 1 <= a ? "none" : "", this.params.scrollbar.hide && (i[0].style.opacity = 0), U.extend(e, { trackSize: s, divider: a, moveDivider: n, dragSize: r }), e.$el[this.params.watchOverflow && this.isLocked ? "addClass" : "removeClass"](this.params.scrollbar.lockClass)) }, getPointerPosition: function (e) { return this.isHorizontal() ? ("touchstart" === e.type || "touchmove" === e.type ? e.targetTouches[0] : e).clientX : ("touchstart" === e.type || "touchmove" === e.type ? e.targetTouches[0] : e).clientY }, setDragPosition: function (e) { var t = this.scrollbar, i = this.rtlTranslate, s = t.$el, a = t.dragSize, n = t.trackSize, r = t.dragStartPos, t = (t.getPointerPosition(e) - s.offset()[this.isHorizontal() ? "left" : "top"] - (null !== r ? r : a / 2)) / (n - a), e = (t = Math.max(Math.min(t, 1), 0), i && (t = 1 - t), this.minTranslate() + (this.maxTranslate() - this.minTranslate()) * t); this.updateProgress(e), this.setTranslate(e), this.updateActiveIndex(), this.updateSlidesClasses() }, onDragStart: function (e) { var t = this.params.scrollbar, i = this.scrollbar, s = this.$wrapperEl, a = i.$el, n = i.$dragEl; this.scrollbar.isTouched = !0, this.scrollbar.dragStartPos = e.target === n[0] || e.target === n ? i.getPointerPosition(e) - e.target.getBoundingClientRect()[this.isHorizontal() ? "left" : "top"] : null, e.preventDefault(), e.stopPropagation(), s.transition(100), n.transition(100), i.setDragPosition(e), clearTimeout(this.scrollbar.dragTimeout), a.transition(0), t.hide && a.css("opacity", 1), this.params.cssMode && this.$wrapperEl.css("scroll-snap-type", "none"), this.emit("scrollbarDragStart", e) }, onDragMove: function (e) { var t = this.scrollbar, i = this.$wrapperEl, s = t.$el, a = t.$dragEl; this.scrollbar.isTouched && (e.preventDefault ? e.preventDefault() : e.returnValue = !1, t.setDragPosition(e), i.transition(0), s.transition(0), a.transition(0), this.emit("scrollbarDragMove", e)) }, onDragEnd: function (e) { var t = this.params.scrollbar, i = this.scrollbar, s = this.$wrapperEl, a = i.$el; this.scrollbar.isTouched && (this.scrollbar.isTouched = !1, this.params.cssMode && (this.$wrapperEl.css("scroll-snap-type", ""), s.transition("")), t.hide && (clearTimeout(this.scrollbar.dragTimeout), this.scrollbar.dragTimeout = U.nextTick(function () { a.css("opacity", 0), a.transition(400) }, 1e3)), this.emit("scrollbarDragEnd", e), t.snapOnRelease) && this.slideToClosest() }, enableDraggable: function () { var e, t, i, s, a; this.params.scrollbar.el && (i = this.scrollbar, e = this.touchEventsTouch, t = this.touchEventsDesktop, a = this.params, i = i.$el[0], s = !(!b.passiveListener || !a.passiveListeners) && { passive: !1, capture: !1 }, a = !(!b.passiveListener || !a.passiveListeners) && { passive: !0, capture: !1 }, b.touch ? (i.addEventListener(e.start, this.scrollbar.onDragStart, s), i.addEventListener(e.move, this.scrollbar.onDragMove, s), i.addEventListener(e.end, this.scrollbar.onDragEnd, a)) : (i.addEventListener(t.start, this.scrollbar.onDragStart, s), c.addEventListener(t.move, this.scrollbar.onDragMove, s), c.addEventListener(t.end, this.scrollbar.onDragEnd, a))) }, disableDraggable: function () { var e, t, i, s, a; this.params.scrollbar.el && (i = this.scrollbar, e = this.touchEventsTouch, t = this.touchEventsDesktop, a = this.params, i = i.$el[0], s = !(!b.passiveListener || !a.passiveListeners) && { passive: !1, capture: !1 }, a = !(!b.passiveListener || !a.passiveListeners) && { passive: !0, capture: !1 }, b.touch ? (i.removeEventListener(e.start, this.scrollbar.onDragStart, s), i.removeEventListener(e.move, this.scrollbar.onDragMove, s), i.removeEventListener(e.end, this.scrollbar.onDragEnd, a)) : (i.removeEventListener(t.start, this.scrollbar.onDragStart, s), c.removeEventListener(t.move, this.scrollbar.onDragMove, s), c.removeEventListener(t.end, this.scrollbar.onDragEnd, a))) }, init: function () { var e, t, i, s; this.params.scrollbar.el && (e = this.scrollbar, s = this.$el, i = S((t = this.params.scrollbar).el), 0 === (s = (i = this.params.uniqueNavElements && "string" == typeof t.el && 1 < i.length && 1 === s.find(t.el).length ? s.find(t.el) : i).find("." + this.params.scrollbar.dragClass)).length && (s = S(''), i.append(s)), U.extend(e, { $el: i, el: i[0], $dragEl: s, dragEl: s[0] }), t.draggable) && e.enableDraggable() }, destroy: function () { this.scrollbar.disableDraggable() } }, Q = { setTransform: function (e, t) { var i = this.rtl, e = S(e), i = i ? -1 : 1, s = e.attr("data-swiper-parallax") || "0", a = e.attr("data-swiper-parallax-x"), n = e.attr("data-swiper-parallax-y"), r = e.attr("data-swiper-parallax-scale"), o = e.attr("data-swiper-parallax-opacity"); a || n ? (a = a || "0", n = n || "0") : this.isHorizontal() ? (a = s, n = "0") : (n = s, a = "0"), a = 0 <= a.indexOf("%") ? parseInt(a, 10) * t * i + "%" : a * t * i + "px", n = 0 <= n.indexOf("%") ? parseInt(n, 10) * t + "%" : n * t + "px", null != o && (s = o - (o - 1) * (1 - Math.abs(t)), e[0].style.opacity = s), null == r ? e.transform("translate3d(" + a + ", " + n + ", 0px)") : (i = r - (r - 1) * (1 - Math.abs(t)), e.transform("translate3d(" + a + ", " + n + ", 0px) scale(" + i + ")")) }, setTranslate: function () { var s = this, e = s.$el, t = s.slides, a = s.progress, n = s.snapGrid; e.children("[data-swiper-parallax], [data-swiper-parallax-x], [data-swiper-parallax-y], [data-swiper-parallax-opacity], [data-swiper-parallax-scale]").each(function (e, t) { s.parallax.setTransform(t, a) }), t.each(function (e, t) { var i = t.progress; 1 < s.params.slidesPerGroup && "auto" !== s.params.slidesPerView && (i += Math.ceil(e / 2) - a * (n.length - 1)), i = Math.min(Math.max(i, -1), 1), S(t).find("[data-swiper-parallax], [data-swiper-parallax-x], [data-swiper-parallax-y], [data-swiper-parallax-opacity], [data-swiper-parallax-scale]").each(function (e, t) { s.parallax.setTransform(t, i) }) }) }, setTransition: function (s) { void 0 === s && (s = this.params.speed), this.$el.find("[data-swiper-parallax], [data-swiper-parallax-x], [data-swiper-parallax-y], [data-swiper-parallax-opacity], [data-swiper-parallax-scale]").each(function (e, t) { var t = S(t), i = parseInt(t.attr("data-swiper-parallax-duration"), 10) || s; 0 === s && (i = 0), t.transition(i) }) } }, Z = { getDistanceBetweenTouches: function (e) { var t, i, s; return e.targetTouches.length < 2 ? 1 : (t = e.targetTouches[0].pageX, i = e.targetTouches[0].pageY, s = e.targetTouches[1].pageX, e = e.targetTouches[1].pageY, Math.sqrt(Math.pow(s - t, 2) + Math.pow(e - i, 2))) }, onGestureStart: function (e) { var t = this.params.zoom, i = this.zoom, s = i.gesture; if (i.fakeGestureTouched = !1, i.fakeGestureMoved = !1, !b.gestures) { if ("touchstart" !== e.type || "touchstart" === e.type && e.targetTouches.length < 2) return; i.fakeGestureTouched = !0, s.scaleStart = Z.getDistanceBetweenTouches(e) } s.$slideEl && s.$slideEl.length || (s.$slideEl = S(e.target).closest(".swiper-slide"), 0 === s.$slideEl.length && (s.$slideEl = this.slides.eq(this.activeIndex)), s.$imageEl = s.$slideEl.find("img, svg, canvas"), s.$imageWrapEl = s.$imageEl.parent("." + t.containerClass), s.maxRatio = s.$imageWrapEl.attr("data-swiper-zoom") || t.maxRatio, 0 !== s.$imageWrapEl.length) ? (s.$imageEl.transition(0), this.zoom.isScaling = !0) : s.$imageEl = void 0 }, onGestureChange: function (e) { var t = this.params.zoom, i = this.zoom, s = i.gesture; if (!b.gestures) { if ("touchmove" !== e.type || "touchmove" === e.type && e.targetTouches.length < 2) return; i.fakeGestureMoved = !0, s.scaleMove = Z.getDistanceBetweenTouches(e) } s.$imageEl && 0 !== s.$imageEl.length && (i.scale = b.gestures ? e.scale * i.currentScale : s.scaleMove / s.scaleStart * i.currentScale, i.scale > s.maxRatio && (i.scale = s.maxRatio - 1 + Math.pow(i.scale - s.maxRatio + 1, .5)), i.scale < t.minRatio && (i.scale = t.minRatio + 1 - Math.pow(t.minRatio - i.scale + 1, .5)), s.$imageEl.transform("translate3d(0,0,0) scale(" + i.scale + ")")) }, onGestureEnd: function (e) { var t = this.params.zoom, i = this.zoom, s = i.gesture; if (!b.gestures) { if (!i.fakeGestureTouched || !i.fakeGestureMoved) return; if ("touchend" !== e.type || "touchend" === e.type && e.changedTouches.length < 2 && !o.android) return; i.fakeGestureTouched = !1, i.fakeGestureMoved = !1 } s.$imageEl && 0 !== s.$imageEl.length && (i.scale = Math.max(Math.min(i.scale, s.maxRatio), t.minRatio), s.$imageEl.transition(this.params.speed).transform("translate3d(0,0,0) scale(" + i.scale + ")"), i.currentScale = i.scale, i.isScaling = !1, 1 === i.scale) && (s.$slideEl = void 0) }, onTouchStart: function (e) { var t = this.zoom, i = t.gesture, t = t.image; i.$imageEl && 0 !== i.$imageEl.length && !t.isTouched && (o.android && e.preventDefault(), t.isTouched = !0, t.touchesStart.x = ("touchstart" === e.type ? e.targetTouches[0] : e).pageX, t.touchesStart.y = ("touchstart" === e.type ? e.targetTouches[0] : e).pageY) }, onTouchMove: function (e) { var t = this.zoom, i = t.gesture, s = t.image, a = t.velocity; if (i.$imageEl && 0 !== i.$imageEl.length && (this.allowClick = !1, s.isTouched) && i.$slideEl) { s.isMoved || (s.width = i.$imageEl[0].offsetWidth, s.height = i.$imageEl[0].offsetHeight, s.startX = U.getTranslate(i.$imageWrapEl[0], "x") || 0, s.startY = U.getTranslate(i.$imageWrapEl[0], "y") || 0, i.slideWidth = i.$slideEl[0].offsetWidth, i.slideHeight = i.$slideEl[0].offsetHeight, i.$imageWrapEl.transition(0), this.rtl && (s.startX = -s.startX, s.startY = -s.startY)); var n = s.width * t.scale, r = s.height * t.scale; if (!(n < i.slideWidth && r < i.slideHeight)) { if (s.minX = Math.min(i.slideWidth / 2 - n / 2, 0), s.maxX = -s.minX, s.minY = Math.min(i.slideHeight / 2 - r / 2, 0), s.maxY = -s.minY, s.touchesCurrent.x = ("touchmove" === e.type ? e.targetTouches[0] : e).pageX, s.touchesCurrent.y = ("touchmove" === e.type ? e.targetTouches[0] : e).pageY, !s.isMoved && !t.isScaling) { if (this.isHorizontal() && (Math.floor(s.minX) === Math.floor(s.startX) && s.touchesCurrent.x < s.touchesStart.x || Math.floor(s.maxX) === Math.floor(s.startX) && s.touchesCurrent.x > s.touchesStart.x)) return void (s.isTouched = !1); if (!this.isHorizontal() && (Math.floor(s.minY) === Math.floor(s.startY) && s.touchesCurrent.y < s.touchesStart.y || Math.floor(s.maxY) === Math.floor(s.startY) && s.touchesCurrent.y > s.touchesStart.y)) return void (s.isTouched = !1) } e.preventDefault(), e.stopPropagation(), s.isMoved = !0, s.currentX = s.touchesCurrent.x - s.touchesStart.x + s.startX, s.currentY = s.touchesCurrent.y - s.touchesStart.y + s.startY, s.currentX < s.minX && (s.currentX = s.minX + 1 - Math.pow(s.minX - s.currentX + 1, .8)), s.currentX > s.maxX && (s.currentX = s.maxX - 1 + Math.pow(s.currentX - s.maxX + 1, .8)), s.currentY < s.minY && (s.currentY = s.minY + 1 - Math.pow(s.minY - s.currentY + 1, .8)), s.currentY > s.maxY && (s.currentY = s.maxY - 1 + Math.pow(s.currentY - s.maxY + 1, .8)), a.prevPositionX || (a.prevPositionX = s.touchesCurrent.x), a.prevPositionY || (a.prevPositionY = s.touchesCurrent.y), a.prevTime || (a.prevTime = Date.now()), a.x = (s.touchesCurrent.x - a.prevPositionX) / (Date.now() - a.prevTime) / 2, a.y = (s.touchesCurrent.y - a.prevPositionY) / (Date.now() - a.prevTime) / 2, Math.abs(s.touchesCurrent.x - a.prevPositionX) < 2 && (a.x = 0), Math.abs(s.touchesCurrent.y - a.prevPositionY) < 2 && (a.y = 0), a.prevPositionX = s.touchesCurrent.x, a.prevPositionY = s.touchesCurrent.y, a.prevTime = Date.now(), i.$imageWrapEl.transform("translate3d(" + s.currentX + "px, " + s.currentY + "px,0)") } } }, onTouchEnd: function () { var e, t, i, s, a = this.zoom, n = a.gesture, r = a.image, o = a.velocity; n.$imageEl && 0 !== n.$imageEl.length && (r.isTouched && r.isMoved ? (r.isTouched = !1, r.isMoved = !1, e = o.x * (i = 300), e = r.currentX + e, t = o.y * (s = 300), t = r.currentY + t, 0 !== o.x && (i = Math.abs((e - r.currentX) / o.x)), 0 !== o.y && (s = Math.abs((t - r.currentY) / o.y)), o = Math.max(i, s), r.currentX = e, r.currentY = t, i = r.width * a.scale, s = r.height * a.scale, r.minX = Math.min(n.slideWidth / 2 - i / 2, 0), r.maxX = -r.minX, r.minY = Math.min(n.slideHeight / 2 - s / 2, 0), r.maxY = -r.minY, r.currentX = Math.max(Math.min(r.currentX, r.maxX), r.minX), r.currentY = Math.max(Math.min(r.currentY, r.maxY), r.minY), n.$imageWrapEl.transition(o).transform("translate3d(" + r.currentX + "px, " + r.currentY + "px,0)")) : (r.isTouched = !1, r.isMoved = !1)) }, onTransitionEnd: function () { var e = this.zoom, t = e.gesture; t.$slideEl && this.previousIndex !== this.activeIndex && (t.$imageEl.transform("translate3d(0,0,0) scale(1)"), t.$imageWrapEl.transform("translate3d(0,0,0)"), e.scale = 1, e.currentScale = 1, t.$slideEl = void 0, t.$imageEl = void 0, t.$imageWrapEl = void 0) }, toggle: function (e) { var t = this.zoom; t.scale && 1 !== t.scale ? t.out() : t.in(e) }, in: function (e) { var t, i, s, a, n = this.zoom, r = this.params.zoom, o = n.gesture, l = n.image; o.$slideEl || (o.$slideEl = this.clickedSlide ? S(this.clickedSlide) : this.slides.eq(this.activeIndex), o.$imageEl = o.$slideEl.find("img, svg, canvas"), o.$imageWrapEl = o.$imageEl.parent("." + r.containerClass)), o.$imageEl && 0 !== o.$imageEl.length && (o.$slideEl.addClass("" + r.zoomedSlideClass), l = void 0 === l.touchesStart.x && e ? (t = ("touchend" === e.type ? e.changedTouches[0] : e).pageX, ("touchend" === e.type ? e.changedTouches[0] : e).pageY) : (t = l.touchesStart.x, l.touchesStart.y), n.scale = o.$imageWrapEl.attr("data-swiper-zoom") || r.maxRatio, n.currentScale = o.$imageWrapEl.attr("data-swiper-zoom") || r.maxRatio, e ? (r = o.$slideEl[0].offsetWidth, e = o.$slideEl[0].offsetHeight, t = o.$slideEl.offset().left + r / 2 - t, l = o.$slideEl.offset().top + e / 2 - l, s = o.$imageEl[0].offsetWidth, a = o.$imageEl[0].offsetHeight, s = s * n.scale, a = a * n.scale, s = -(r = Math.min(r / 2 - s / 2, 0)), a = -(e = Math.min(e / 2 - a / 2, 0)), s < (i = (i = t * n.scale) < r ? r : i) && (i = s), a < (s = (s = l * n.scale) < e ? e : s) && (s = a)) : s = i = 0, o.$imageWrapEl.transition(300).transform("translate3d(" + i + "px, " + s + "px,0)"), o.$imageEl.transition(300).transform("translate3d(0,0,0) scale(" + n.scale + ")")) }, out: function () { var e = this.zoom, t = this.params.zoom, i = e.gesture; i.$slideEl || (i.$slideEl = this.clickedSlide ? S(this.clickedSlide) : this.slides.eq(this.activeIndex), i.$imageEl = i.$slideEl.find("img, svg, canvas"), i.$imageWrapEl = i.$imageEl.parent("." + t.containerClass)), i.$imageEl && 0 !== i.$imageEl.length && (e.scale = 1, e.currentScale = 1, i.$imageWrapEl.transition(300).transform("translate3d(0,0,0)"), i.$imageEl.transition(300).transform("translate3d(0,0,0) scale(1)"), i.$slideEl.removeClass("" + t.zoomedSlideClass), i.$slideEl = void 0) }, enable: function () { var e, t, i = this.zoom; i.enabled || (i.enabled = !0, e = !("touchstart" !== this.touchEvents.start || !b.passiveListener || !this.params.passiveListeners) && { passive: !0, capture: !1 }, t = !b.passiveListener || { passive: !1, capture: !0 }, b.gestures ? (this.$wrapperEl.on("gesturestart", ".swiper-slide", i.onGestureStart, e), this.$wrapperEl.on("gesturechange", ".swiper-slide", i.onGestureChange, e), this.$wrapperEl.on("gestureend", ".swiper-slide", i.onGestureEnd, e)) : "touchstart" === this.touchEvents.start && (this.$wrapperEl.on(this.touchEvents.start, ".swiper-slide", i.onGestureStart, e), this.$wrapperEl.on(this.touchEvents.move, ".swiper-slide", i.onGestureChange, t), this.$wrapperEl.on(this.touchEvents.end, ".swiper-slide", i.onGestureEnd, e), this.touchEvents.cancel) && this.$wrapperEl.on(this.touchEvents.cancel, ".swiper-slide", i.onGestureEnd, e), this.$wrapperEl.on(this.touchEvents.move, "." + this.params.zoom.containerClass, i.onTouchMove, t)) }, disable: function () { var e, t, i = this.zoom; i.enabled && (this.zoom.enabled = !1, e = !("touchstart" !== this.touchEvents.start || !b.passiveListener || !this.params.passiveListeners) && { passive: !0, capture: !1 }, t = !b.passiveListener || { passive: !1, capture: !0 }, b.gestures ? (this.$wrapperEl.off("gesturestart", ".swiper-slide", i.onGestureStart, e), this.$wrapperEl.off("gesturechange", ".swiper-slide", i.onGestureChange, e), this.$wrapperEl.off("gestureend", ".swiper-slide", i.onGestureEnd, e)) : "touchstart" === this.touchEvents.start && (this.$wrapperEl.off(this.touchEvents.start, ".swiper-slide", i.onGestureStart, e), this.$wrapperEl.off(this.touchEvents.move, ".swiper-slide", i.onGestureChange, t), this.$wrapperEl.off(this.touchEvents.end, ".swiper-slide", i.onGestureEnd, e), this.touchEvents.cancel) && this.$wrapperEl.off(this.touchEvents.cancel, ".swiper-slide", i.onGestureEnd, e), this.$wrapperEl.off(this.touchEvents.move, "." + this.params.zoom.containerClass, i.onTouchMove, t)) } }, J = { loadInSlide: function (e, o) { void 0 === o && (o = !0); var l, d = this, h = d.params.lazy; void 0 !== e && 0 !== d.slides.length && (e = (l = d.virtual && d.params.virtual.enabled ? d.$wrapperEl.children("." + d.params.slideClass + '[data-swiper-slide-index="' + e + '"]') : d.slides.eq(e)).find("." + h.elementClass + ":not(." + h.loadedClass + "):not(." + h.loadingClass + ")"), 0 !== (e = !l.hasClass(h.elementClass) || l.hasClass(h.loadedClass) || l.hasClass(h.loadingClass) ? e : e.add(l[0])).length) && e.each(function (e, t) { var i = S(t), s = (i.addClass(h.loadingClass), i.attr("data-background")), a = i.attr("data-src"), n = i.attr("data-srcset"), r = i.attr("data-sizes"); d.loadImage(i[0], a || s, n, r, !1, function () { var e, t; null == d || !d || d && !d.params || d.destroyed || (s ? (i.css("background-image", 'url("' + s + '")'), i.removeAttr("data-background")) : (n && (i.attr("srcset", n), i.removeAttr("data-srcset")), r && (i.attr("sizes", r), i.removeAttr("data-sizes")), a && (i.attr("src", a), i.removeAttr("data-src"))), i.addClass(h.loadedClass).removeClass(h.loadingClass), l.find("." + h.preloaderClass).remove(), d.params.loop && o && (e = l.attr("data-swiper-slide-index"), l.hasClass(d.params.slideDuplicateClass) ? (t = d.$wrapperEl.children('[data-swiper-slide-index="' + e + '"]:not(.' + d.params.slideDuplicateClass + ")"), d.lazy.loadInSlide(t.index(), !1)) : (t = d.$wrapperEl.children("." + d.params.slideDuplicateClass + '[data-swiper-slide-index="' + e + '"]'), d.lazy.loadInSlide(t.index(), !1))), d.emit("lazyImageReady", l[0], i[0])) }), d.emit("lazyImageLoad", l[0], i[0]) }) }, load: function () { var i = this, t = i.$wrapperEl, s = i.params, a = i.slides, e = i.activeIndex, n = i.virtual && s.virtual.enabled, r = s.lazy, o = s.slidesPerView; function l(e) { if (n) { if (t.children("." + s.slideClass + '[data-swiper-slide-index="' + e + '"]').length) return 1 } else if (a[e]) return 1 } function d(e) { return n ? S(e).attr("data-swiper-slide-index") : S(e).index() } if ("auto" === o && (o = 0), i.lazy.initialImageLoaded || (i.lazy.initialImageLoaded = !0), i.params.watchSlidesVisibility) t.children("." + s.slideVisibleClass).each(function (e, t) { t = n ? S(t).attr("data-swiper-slide-index") : S(t).index(); i.lazy.loadInSlide(t) }); else if (1 < o) for (var h = e; h < e + o; h += 1)l(h) && i.lazy.loadInSlide(h); else i.lazy.loadInSlide(e); if (r.loadPrevNext) if (1 < o || r.loadPrevNextAmount && 1 < r.loadPrevNextAmount) { for (var r = r.loadPrevNextAmount, c = o, p = Math.min(e + c + Math.max(r, c), a.length), c = Math.max(e - Math.max(c, r), 0), u = e + o; u < p; u += 1)l(u) && i.lazy.loadInSlide(u); for (var v = c; v < e; v += 1)l(v) && i.lazy.loadInSlide(v) } else { r = t.children("." + s.slideNextClass), c = (0 < r.length && i.lazy.loadInSlide(d(r)), t.children("." + s.slidePrevClass)); 0 < c.length && i.lazy.loadInSlide(d(c)) } } }, I = { LinearSpline: function (e, t) { var i, s, a, n, r; return this.x = e, this.y = t, this.lastIndex = e.length - 1, this.interpolate = function (e) { return e ? (r = ((e, t) => { for (s = -1, i = e.length; 1 < i - s;)e[a = i + s >> 1] <= t ? s = a : i = a; return i })(this.x, e), n = r - 1, (e - this.x[n]) * (this.y[r] - this.y[n]) / (this.x[r] - this.x[n]) + this.y[n]) : 0 }, this }, getInterpolateFunction: function (e) { this.controller.spline || (this.controller.spline = this.params.loop ? new I.LinearSpline(this.slidesGrid, e.slidesGrid) : new I.LinearSpline(this.snapGrid, e.snapGrid)) }, setTranslate: function (e, t) { var i, s, a = this, n = a.controller.control; function r(e) { var t = a.rtlTranslate ? -a.translate : a.translate; "slide" === a.params.controller.by && (a.controller.getInterpolateFunction(e), s = -a.controller.spline.interpolate(-t)), s && "container" !== a.params.controller.by || (i = (e.maxTranslate() - e.minTranslate()) / (a.maxTranslate() - a.minTranslate()), s = (t - a.minTranslate()) * i + e.minTranslate()), a.params.controller.inverse && (s = e.maxTranslate() - s), e.updateProgress(s), e.setTranslate(s, a), e.updateActiveIndex(), e.updateSlidesClasses() } if (Array.isArray(n)) for (var o = 0; o < n.length; o += 1)n[o] !== t && n[o] instanceof u && r(n[o]); else n instanceof u && t !== n && r(n) }, setTransition: function (t, e) { var i, s = this, a = s.controller.control; function n(e) { e.setTransition(t, s), 0 !== t && (e.transitionStart(), e.params.autoHeight && U.nextTick(function () { e.updateAutoHeight() }), e.$wrapperEl.transitionEnd(function () { a && (e.params.loop && "slide" === s.params.controller.by && e.loopFix(), e.transitionEnd()) })) } if (Array.isArray(a)) for (i = 0; i < a.length; i += 1)a[i] !== e && a[i] instanceof u && n(a[i]); else a instanceof u && e !== a && n(a) } }, ee = { makeElFocusable: function (e) { return e.attr("tabIndex", "0"), e }, addElRole: function (e, t) { return e.attr("role", t), e }, addElLabel: function (e, t) { return e.attr("aria-label", t), e }, disableEl: function (e) { return e.attr("aria-disabled", !0), e }, enableEl: function (e) { return e.attr("aria-disabled", !1), e }, onEnterKey: function (e) { var t = this.params.a11y; 13 === e.keyCode && (e = S(e.target), this.navigation && this.navigation.$nextEl && e.is(this.navigation.$nextEl) && (this.isEnd && !this.params.loop || this.slideNext(), this.isEnd ? this.a11y.notify(t.lastSlideMessage) : this.a11y.notify(t.nextSlideMessage)), this.navigation && this.navigation.$prevEl && e.is(this.navigation.$prevEl) && (this.isBeginning && !this.params.loop || this.slidePrev(), this.isBeginning ? this.a11y.notify(t.firstSlideMessage) : this.a11y.notify(t.prevSlideMessage)), this.pagination) && e.is("." + this.params.pagination.bulletClass) && e[0].click() }, notify: function (e) { var t = this.a11y.liveRegion; 0 !== t.length && (t.html(""), t.html(e)) }, updateNavigation: function () { var e, t; !this.params.loop && this.navigation && (e = (t = this.navigation).$nextEl, (t = t.$prevEl) && 0 < t.length && (this.isBeginning ? this.a11y.disableEl(t) : this.a11y.enableEl(t)), e) && 0 < e.length && (this.isEnd ? this.a11y.disableEl(e) : this.a11y.enableEl(e)) }, updatePagination: function () { var i = this, s = i.params.a11y; i.pagination && i.params.pagination.clickable && i.pagination.bullets && i.pagination.bullets.length && i.pagination.bullets.each(function (e, t) { t = S(t); i.a11y.makeElFocusable(t), i.a11y.addElRole(t, "button"), i.a11y.addElLabel(t, s.paginationBulletMessage.replace(/{{index}}/, t.index() + 1)) }) }, init: function () { this.$el.append(this.a11y.liveRegion); var e, t, i = this.params.a11y; this.navigation && this.navigation.$nextEl && (e = this.navigation.$nextEl), this.navigation && this.navigation.$prevEl && (t = this.navigation.$prevEl), e && (this.a11y.makeElFocusable(e), this.a11y.addElRole(e, "button"), this.a11y.addElLabel(e, i.nextSlideMessage), e.on("keydown", this.a11y.onEnterKey)), t && (this.a11y.makeElFocusable(t), this.a11y.addElRole(t, "button"), this.a11y.addElLabel(t, i.prevSlideMessage), t.on("keydown", this.a11y.onEnterKey)), this.pagination && this.params.pagination.clickable && this.pagination.bullets && this.pagination.bullets.length && this.pagination.$el.on("keydown", "." + this.params.pagination.bulletClass, this.a11y.onEnterKey) }, destroy: function () { var e, t; this.a11y.liveRegion && 0 < this.a11y.liveRegion.length && this.a11y.liveRegion.remove(), this.navigation && this.navigation.$nextEl && (e = this.navigation.$nextEl), this.navigation && this.navigation.$prevEl && (t = this.navigation.$prevEl), e && e.off("keydown", this.a11y.onEnterKey), t && t.off("keydown", this.a11y.onEnterKey), this.pagination && this.params.pagination.clickable && this.pagination.bullets && this.pagination.bullets.length && this.pagination.$el.off("keydown", "." + this.params.pagination.bulletClass, this.a11y.onEnterKey) } }, k = { init: function () { var e; this.params.history && (X.history && X.history.pushState ? ((e = this.history).initialized = !0, e.paths = k.getPathValues(), (e.paths.key || e.paths.value) && (e.scrollToSlide(0, e.paths.value, this.params.runCallbacksOnInit), this.params.history.replaceState || X.addEventListener("popstate", this.history.setHistoryPopState))) : (this.params.history.enabled = !1, this.params.hashNavigation.enabled = !0)) }, destroy: function () { this.params.history.replaceState || X.removeEventListener("popstate", this.history.setHistoryPopState) }, setHistoryPopState: function () { this.history.paths = k.getPathValues(), this.history.scrollToSlide(this.params.speed, this.history.paths.value, !1) }, getPathValues: function () { var e = X.location.pathname.slice(1).split("/").filter(function (e) { return "" !== e }), t = e.length; return { key: e[t - 2], value: e[t - 1] } }, setHistory: function (e, t) { this.history.initialized && this.params.history.enabled && (t = this.slides.eq(t), t = k.slugify(t.attr("data-history")), X.location.pathname.includes(e) || (t = e + "/" + t), (e = X.history.state) && e.value === t || (this.params.history.replaceState ? X.history.replaceState({ value: t }, null, t) : X.history.pushState({ value: t }, null, t))) }, slugify: function (e) { return e.toString().replace(/\s+/g, "-").replace(/[^\w-]+/g, "").replace(/--+/g, "-").replace(/^-+/, "").replace(/-+$/, "") }, scrollToSlide: function (e, t, i) { if (t) for (var s = 0, a = this.slides.length; s < a; s += 1) { var n = this.slides.eq(s); k.slugify(n.attr("data-history")) !== t || n.hasClass(this.params.slideDuplicateClass) || (n = n.index(), this.slideTo(n, e, i)) } else this.slideTo(0, e, i) } }, z = { onHashCange: function () { var e = c.location.hash.replace("#", ""); e !== this.slides.eq(this.activeIndex).attr("data-hash") && void 0 !== (e = this.$wrapperEl.children("." + this.params.slideClass + '[data-hash="' + e + '"]').index()) && this.slideTo(e) }, setHash: function () { var e; this.hashNavigation.initialized && this.params.hashNavigation.enabled && (this.params.hashNavigation.replaceState && X.history && X.history.replaceState ? X.history.replaceState(null, null, "#" + this.slides.eq(this.activeIndex).attr("data-hash") || "") : (e = (e = this.slides.eq(this.activeIndex)).attr("data-hash") || e.attr("data-history"), c.location.hash = e || "")) }, init: function () { if (!(!this.params.hashNavigation.enabled || this.params.history && this.params.history.enabled)) { this.hashNavigation.initialized = !0; var e = c.location.hash.replace("#", ""); if (e) for (var t = 0, i = this.slides.length; t < i; t += 1) { var s = this.slides.eq(t); (s.attr("data-hash") || s.attr("data-history")) !== e || s.hasClass(this.params.slideDuplicateClass) || (s = s.index(), this.slideTo(s, 0, this.params.runCallbacksOnInit, !0)) } this.params.hashNavigation.watchState && S(X).on("hashchange", this.hashNavigation.onHashCange) } }, destroy: function () { this.params.hashNavigation.watchState && S(X).off("hashchange", this.hashNavigation.onHashCange) } }, M = { run: function () { var e = this, t = e.slides.eq(e.activeIndex), i = e.params.autoplay.delay; t.attr("data-swiper-autoplay") && (i = t.attr("data-swiper-autoplay") || e.params.autoplay.delay), clearTimeout(e.autoplay.timeout), e.autoplay.timeout = U.nextTick(function () { e.params.autoplay.reverseDirection ? e.params.loop ? (e.loopFix(), e.slidePrev(e.params.speed, !0, !0), e.emit("autoplay")) : e.isBeginning ? e.params.autoplay.stopOnLastSlide ? e.autoplay.stop() : (e.slideTo(e.slides.length - 1, e.params.speed, !0, !0), e.emit("autoplay")) : (e.slidePrev(e.params.speed, !0, !0), e.emit("autoplay")) : e.params.loop ? (e.loopFix(), e.slideNext(e.params.speed, !0, !0), e.emit("autoplay")) : e.isEnd ? e.params.autoplay.stopOnLastSlide ? e.autoplay.stop() : (e.slideTo(0, e.params.speed, !0, !0), e.emit("autoplay")) : (e.slideNext(e.params.speed, !0, !0), e.emit("autoplay")), e.params.cssMode && e.autoplay.running && e.autoplay.run() }, i) }, start: function () { return void 0 === this.autoplay.timeout && !this.autoplay.running && (this.autoplay.running = !0, this.emit("autoplayStart"), this.autoplay.run(), !0) }, stop: function () { return !!this.autoplay.running && void 0 !== this.autoplay.timeout && (this.autoplay.timeout && (clearTimeout(this.autoplay.timeout), this.autoplay.timeout = void 0), this.autoplay.running = !1, this.emit("autoplayStop"), !0) }, pause: function (e) { !this.autoplay.running || this.autoplay.paused || (this.autoplay.timeout && clearTimeout(this.autoplay.timeout), this.autoplay.paused = !0, 0 !== e && this.params.autoplay.waitForTransition ? (this.$wrapperEl[0].addEventListener("transitionend", this.autoplay.onTransitionEnd), this.$wrapperEl[0].addEventListener("webkitTransitionEnd", this.autoplay.onTransitionEnd)) : (this.autoplay.paused = !1, this.autoplay.run())) } }, te = { setTranslate: function () { for (var e = this.slides, t = 0; t < e.length; t += 1) { var i = this.slides.eq(t), s = -i[0].swiperSlideOffset, a = (this.params.virtualTranslate || (s -= this.translate), 0), n = (this.isHorizontal() || (a = s, s = 0), this.params.fadeEffect.crossFade ? Math.max(1 - Math.abs(i[0].progress), 0) : 1 + Math.min(Math.max(i[0].progress, -1), 0)); i.css({ opacity: n }).transform("translate3d(" + s + "px, " + a + "px, 0px)") } }, setTransition: function (e) { var i, s = this, t = s.slides, a = s.$wrapperEl; t.transition(e), s.params.virtualTranslate && 0 !== e && (i = !1, t.transitionEnd(function () { if (!i && s && !s.destroyed) { i = !0, s.animating = !1; for (var e = ["webkitTransitionEnd", "transitionend"], t = 0; t < e.length; t += 1)a.trigger(e[t]) } })) } }, ie = { setTranslate: function () { var e, t = this.$el, i = this.$wrapperEl, s = this.slides, a = this.width, n = this.height, r = this.rtlTranslate, o = this.size, l = this.params.cubeEffect, d = this.isHorizontal(), h = this.virtual && this.params.virtual.enabled, c = 0; l.shadow && (d ? (0 === (e = i.find(".swiper-cube-shadow")).length && (e = S(''), i.append(e)), e.css({ height: a + "px" })) : 0 === (e = t.find(".swiper-cube-shadow")).length && (e = S(''), t.append(e))); for (var p, u = 0; u < s.length; u += 1) { var v = s.eq(u), m = u, g = 90 * (m = h ? parseInt(v.attr("data-swiper-slide-index"), 10) : m), f = Math.floor(g / 360), w = (r && (g = -g, f = Math.floor(-g / 360)), Math.max(Math.min(v[0].progress, 1), -1)), y = 0, b = 0, E = 0, f = (m % 4 == 0 ? (y = 4 * -f * o, E = 0) : (m - 1) % 4 == 0 ? (y = 0, E = 4 * -f * o) : (m - 2) % 4 == 0 ? (y = o + 4 * f * o, E = o) : (m - 3) % 4 == 0 && (y = -o, E = 3 * o + 4 * o * f), r && (y = -y), d || (b = y, y = 0), "rotateX(" + (d ? 0 : -g) + "deg) rotateY(" + (d ? g : 0) + "deg) translate3d(" + y + "px, " + b + "px, " + E + "px)"); w <= 1 && -1 < w && (c = 90 * m + 90 * w, r) && (c = 90 * -m - 90 * w), v.transform(f), l.slideShadows && (g = d ? v.find(".swiper-slide-shadow-left") : v.find(".swiper-slide-shadow-top"), y = d ? v.find(".swiper-slide-shadow-right") : v.find(".swiper-slide-shadow-bottom"), 0 === g.length && (g = S(''), v.append(g)), 0 === y.length && (y = S(''), v.append(y)), g.length && (g[0].style.opacity = Math.max(-w, 0)), y.length) && (y[0].style.opacity = Math.max(w, 0)) } i.css({ "-webkit-transform-origin": "50% 50% -" + o / 2 + "px", "-moz-transform-origin": "50% 50% -" + o / 2 + "px", "-ms-transform-origin": "50% 50% -" + o / 2 + "px", "transform-origin": "50% 50% -" + o / 2 + "px" }), l.shadow && (d ? e.transform("translate3d(0px, " + (a / 2 + l.shadowOffset) + "px, " + -a / 2 + "px) rotateX(90deg) rotateZ(0deg) scale(" + l.shadowScale + ")") : (t = Math.abs(c) - 90 * Math.floor(Math.abs(c) / 90), a = 1.5 - (Math.sin(2 * t * Math.PI / 360) / 2 + Math.cos(2 * t * Math.PI / 360) / 2), t = l.shadowScale, a = l.shadowScale / a, p = l.shadowOffset, e.transform("scale3d(" + t + ", 1, " + a + ") translate3d(0px, " + (n / 2 + p) + "px, " + -n / 2 / a + "px) rotateX(-90deg)"))), i.transform("translate3d(0px,0," + (C.isSafari || C.isUiWebView ? -o / 2 : 0) + "px) rotateX(" + (this.isHorizontal() ? 0 : c) + "deg) rotateY(" + (this.isHorizontal() ? -c : 0) + "deg)") }, setTransition: function (e) { var t = this.$el; this.slides.transition(e).find(".swiper-slide-shadow-top, .swiper-slide-shadow-right, .swiper-slide-shadow-bottom, .swiper-slide-shadow-left").transition(e), this.params.cubeEffect.shadow && !this.isHorizontal() && t.find(".swiper-cube-shadow").transition(e) } }, se = { setTranslate: function () { for (var e = this.slides, t = this.rtlTranslate, i = 0; i < e.length; i += 1) { var s, a, n = e.eq(i), r = n[0].progress, o = -180 * (r = this.params.flipEffect.limitRotation ? Math.max(Math.min(n[0].progress, 1), -1) : r), l = 0, d = -n[0].swiperSlideOffset, h = 0; this.isHorizontal() ? t && (o = -o) : (h = d, l = -o, o = d = 0), n[0].style.zIndex = -Math.abs(Math.round(r)) + e.length, this.params.flipEffect.slideShadows && (s = this.isHorizontal() ? n.find(".swiper-slide-shadow-left") : n.find(".swiper-slide-shadow-top"), a = this.isHorizontal() ? n.find(".swiper-slide-shadow-right") : n.find(".swiper-slide-shadow-bottom"), 0 === s.length && (s = S(''), n.append(s)), 0 === a.length && (a = S(''), n.append(a)), s.length && (s[0].style.opacity = Math.max(-r, 0)), a.length) && (a[0].style.opacity = Math.max(r, 0)), n.transform("translate3d(" + d + "px, " + h + "px, 0px) rotateX(" + l + "deg) rotateY(" + o + "deg)") } }, setTransition: function (e) { var i, s = this, t = s.slides, a = s.activeIndex, n = s.$wrapperEl; t.transition(e).find(".swiper-slide-shadow-top, .swiper-slide-shadow-right, .swiper-slide-shadow-bottom, .swiper-slide-shadow-left").transition(e), s.params.virtualTranslate && 0 !== e && (i = !1, t.eq(a).transitionEnd(function () { if (!i && s && !s.destroyed) { i = !0, s.animating = !1; for (var e = ["webkitTransitionEnd", "transitionend"], t = 0; t < e.length; t += 1)n.trigger(e[t]) } })) } }, ae = { setTranslate: function () { for (var e = this.width, t = this.height, i = this.slides, s = this.$wrapperEl, a = this.slidesSizesGrid, n = this.params.coverflowEffect, r = this.isHorizontal(), o = this.translate, l = r ? e / 2 - o : t / 2 - o, d = r ? n.rotate : -n.rotate, h = n.depth, c = 0, p = i.length; c < p; c += 1) { var u = i.eq(c), v = a[c], v = (l - u[0].swiperSlideOffset - v / 2) / v * n.modifier, m = r ? d * v : 0, g = r ? 0 : d * v, f = -h * Math.abs(v), w = r ? 0 : n.stretch * v, y = r ? n.stretch * v : 0, y = (Math.abs(y) < .001 && (y = 0), Math.abs(w) < .001 && (w = 0), Math.abs(f) < .001 && (f = 0), Math.abs(m) < .001 && (m = 0), "translate3d(" + y + "px," + w + "px," + f + "px) rotateX(" + (g = Math.abs(g) < .001 ? 0 : g) + "deg) rotateY(" + m + "deg)"); u.transform(y), u[0].style.zIndex = 1 - Math.abs(Math.round(v)), n.slideShadows && (w = r ? u.find(".swiper-slide-shadow-left") : u.find(".swiper-slide-shadow-top"), f = r ? u.find(".swiper-slide-shadow-right") : u.find(".swiper-slide-shadow-bottom"), 0 === w.length && (w = S(''), u.append(w)), 0 === f.length && (f = S(''), u.append(f)), w.length && (w[0].style.opacity = 0 < v ? v : 0), f.length) && (f[0].style.opacity = 0 < -v ? -v : 0) } (b.pointerEvents || b.prefixedPointerEvents) && (s[0].style.perspectiveOrigin = l + "px 50%") }, setTransition: function (e) { this.slides.transition(e).find(".swiper-slide-shadow-top, .swiper-slide-shadow-right, .swiper-slide-shadow-bottom, .swiper-slide-shadow-left").transition(e) } }, ne = { init: function () { var e = this.params.thumbs, t = this.constructor; e.swiper instanceof t ? (this.thumbs.swiper = e.swiper, U.extend(this.thumbs.swiper.originalParams, { watchSlidesProgress: !0, slideToClickedSlide: !1 }), U.extend(this.thumbs.swiper.params, { watchSlidesProgress: !0, slideToClickedSlide: !1 })) : U.isObject(e.swiper) && (this.thumbs.swiper = new t(U.extend({}, e.swiper, { watchSlidesVisibility: !0, watchSlidesProgress: !0, slideToClickedSlide: !1 })), this.thumbs.swiperCreated = !0), this.thumbs.swiper.$el.addClass(this.params.thumbs.thumbsContainerClass), this.thumbs.swiper.on("tap", this.thumbs.onThumbClick) }, onThumbClick: function () { var e, t, i, s = this.thumbs.swiper; s && (e = s.clickedIndex, (i = s.clickedSlide) && S(i).hasClass(this.params.thumbs.slideThumbActiveClass) || null == e || (i = s.params.loop ? parseInt(S(s.clickedSlide).attr("data-swiper-slide-index"), 10) : e, this.params.loop && (s = this.activeIndex, this.slides.eq(s).hasClass(this.params.slideDuplicateClass) && (this.loopFix(), this._clientLeft = this.$wrapperEl[0].clientLeft, s = this.activeIndex), e = this.slides.eq(s).prevAll('[data-swiper-slide-index="' + i + '"]').eq(0).index(), t = this.slides.eq(s).nextAll('[data-swiper-slide-index="' + i + '"]').eq(0).index(), i = void 0 === e || void 0 !== t && t - s < s - e ? t : e), this.slideTo(i))) }, update: function (e) { var t = this.thumbs.swiper; if (t) { var i, s, a, n = "auto" === t.params.slidesPerView ? t.slidesPerViewDynamic() : t.params.slidesPerView, r = (this.realIndex !== t.realIndex && (i = t.activeIndex, a = t.params.loop ? (t.slides.eq(i).hasClass(t.params.slideDuplicateClass) && (t.loopFix(), t._clientLeft = t.$wrapperEl[0].clientLeft, i = t.activeIndex), s = t.slides.eq(i).prevAll('[data-swiper-slide-index="' + this.realIndex + '"]').eq(0).index(), a = t.slides.eq(i).nextAll('[data-swiper-slide-index="' + this.realIndex + '"]').eq(0).index(), void 0 === s ? a : void 0 === a ? s : a - i == i - s ? i : a - i < i - s ? a : s) : this.realIndex, t.visibleSlidesIndexes) && t.visibleSlidesIndexes.indexOf(a) < 0 && (t.params.centeredSlides ? a = i < a ? a - Math.floor(n / 2) + 1 : a + Math.floor(n / 2) - 1 : i < a && (a = a - n + 1), t.slideTo(a, e ? 0 : void 0)), 1), o = this.params.thumbs.slideThumbActiveClass; if (1 < this.params.slidesPerView && !this.params.centeredSlides && (r = this.params.slidesPerView), this.params.thumbs.multipleActiveThumbs || (r = 1), r = Math.floor(r), t.slides.removeClass(o), t.params.loop || t.params.virtual && t.params.virtual.enabled) for (var l = 0; l < r; l += 1)t.$wrapperEl.children('[data-swiper-slide-index="' + (this.realIndex + l) + '"]').addClass(o); else for (var d = 0; d < r; d += 1)t.slides.eq(this.realIndex + d).addClass(o) } } }, O = [v, j, Y, m, f, y, E, { name: "mousewheel", params: { mousewheel: { enabled: !1, releaseOnEdges: !1, invert: !1, forceToAxis: !1, sensitivity: 1, eventsTarged: "container" } }, create: function () { U.extend(this, { mousewheel: { enabled: !1, enable: x.enable.bind(this), disable: x.disable.bind(this), handle: x.handle.bind(this), handleMouseEnter: x.handleMouseEnter.bind(this), handleMouseLeave: x.handleMouseLeave.bind(this), animateSlider: x.animateSlider.bind(this), releaseScroll: x.releaseScroll.bind(this), lastScrollTime: U.now(), lastEventBeforeSnap: void 0, recentWheelEvents: [] } }) }, on: { init: function () { !this.params.mousewheel.enabled && this.params.cssMode && this.mousewheel.disable(), this.params.mousewheel.enabled && this.mousewheel.enable() }, destroy: function () { this.params.cssMode && this.mousewheel.enable(), this.mousewheel.enabled && this.mousewheel.disable() } } }, { name: "navigation", params: { navigation: { nextEl: null, prevEl: null, hideOnClick: !1, disabledClass: "swiper-button-disabled", hiddenClass: "swiper-button-hidden", lockClass: "swiper-button-lock" } }, create: function () { U.extend(this, { navigation: { init: A.init.bind(this), update: A.update.bind(this), destroy: A.destroy.bind(this), onNextClick: A.onNextClick.bind(this), onPrevClick: A.onPrevClick.bind(this) } }) }, on: { init: function () { this.navigation.init(), this.navigation.update() }, toEdge: function () { this.navigation.update() }, fromEdge: function () { this.navigation.update() }, destroy: function () { this.navigation.destroy() }, click: function (e) { var t, i = this.navigation, s = i.$nextEl, i = i.$prevEl; !this.params.navigation.hideOnClick || S(e.target).is(i) || S(e.target).is(s) || (s ? t = s.hasClass(this.params.navigation.hiddenClass) : i && (t = i.hasClass(this.params.navigation.hiddenClass)), !0 === t ? this.emit("navigationShow", this) : this.emit("navigationHide", this), s && s.toggleClass(this.params.navigation.hiddenClass), i && i.toggleClass(this.params.navigation.hiddenClass)) } } }, { name: "pagination", params: { pagination: { el: null, bulletElement: "span", clickable: !1, hideOnClick: !1, renderBullet: null, renderProgressbar: null, renderFraction: null, renderCustom: null, progressbarOpposite: !1, type: "bullets", dynamicBullets: !1, dynamicMainBullets: 1, formatFractionCurrent: function (e) { return e }, formatFractionTotal: function (e) { return e }, bulletClass: "swiper-pagination-bullet", bulletActiveClass: "swiper-pagination-bullet-active", modifierClass: "swiper-pagination-", currentClass: "swiper-pagination-current", totalClass: "swiper-pagination-total", hiddenClass: "swiper-pagination-hidden", progressbarFillClass: "swiper-pagination-progressbar-fill", progressbarOppositeClass: "swiper-pagination-progressbar-opposite", clickableClass: "swiper-pagination-clickable", lockClass: "swiper-pagination-lock" } }, create: function () { U.extend(this, { pagination: { init: L.init.bind(this), render: L.render.bind(this), update: L.update.bind(this), destroy: L.destroy.bind(this), dynamicBulletIndex: 0 } }) }, on: { init: function () { this.pagination.init(), this.pagination.render(), this.pagination.update() }, activeIndexChange: function () { !this.params.loop && void 0 !== this.snapIndex || this.pagination.update() }, snapIndexChange: function () { this.params.loop || this.pagination.update() }, slidesLengthChange: function () { this.params.loop && (this.pagination.render(), this.pagination.update()) }, snapGridLengthChange: function () { this.params.loop || (this.pagination.render(), this.pagination.update()) }, destroy: function () { this.pagination.destroy() }, click: function (e) { this.params.pagination.el && this.params.pagination.hideOnClick && 0 < this.pagination.$el.length && !S(e.target).hasClass(this.params.pagination.bulletClass) && (!0 === this.pagination.$el.hasClass(this.params.pagination.hiddenClass) ? this.emit("paginationShow", this) : this.emit("paginationHide", this), this.pagination.$el.toggleClass(this.params.pagination.hiddenClass)) } } }, { name: "scrollbar", params: { scrollbar: { el: null, dragSize: "auto", hide: !1, draggable: !1, snapOnRelease: !0, lockClass: "swiper-scrollbar-lock", dragClass: "swiper-scrollbar-drag" } }, create: function () { U.extend(this, { scrollbar: { init: P.init.bind(this), destroy: P.destroy.bind(this), updateSize: P.updateSize.bind(this), setTranslate: P.setTranslate.bind(this), setTransition: P.setTransition.bind(this), enableDraggable: P.enableDraggable.bind(this), disableDraggable: P.disableDraggable.bind(this), setDragPosition: P.setDragPosition.bind(this), getPointerPosition: P.getPointerPosition.bind(this), onDragStart: P.onDragStart.bind(this), onDragMove: P.onDragMove.bind(this), onDragEnd: P.onDragEnd.bind(this), isTouched: !1, timeout: null, dragTimeout: null } }) }, on: { init: function () { this.scrollbar.init(), this.scrollbar.updateSize(), this.scrollbar.setTranslate() }, update: function () { this.scrollbar.updateSize() }, resize: function () { this.scrollbar.updateSize() }, observerUpdate: function () { this.scrollbar.updateSize() }, setTranslate: function () { this.scrollbar.setTranslate() }, setTransition: function (e) { this.scrollbar.setTransition(e) }, destroy: function () { this.scrollbar.destroy() } } }, { name: "parallax", params: { parallax: { enabled: !1 } }, create: function () { U.extend(this, { parallax: { setTransform: Q.setTransform.bind(this), setTranslate: Q.setTranslate.bind(this), setTransition: Q.setTransition.bind(this) } }) }, on: { beforeInit: function () { this.params.parallax.enabled && (this.params.watchSlidesProgress = !0, this.originalParams.watchSlidesProgress = !0) }, init: function () { this.params.parallax.enabled && this.parallax.setTranslate() }, setTranslate: function () { this.params.parallax.enabled && this.parallax.setTranslate() }, setTransition: function (e) { this.params.parallax.enabled && this.parallax.setTransition(e) } } }, { name: "zoom", params: { zoom: { enabled: !1, maxRatio: 3, minRatio: 1, toggle: !0, containerClass: "swiper-zoom-container", zoomedSlideClass: "swiper-slide-zoomed" } }, create: function () { var s = this, t = { enabled: !1, scale: 1, currentScale: 1, isScaling: !1, gesture: { $slideEl: void 0, slideWidth: void 0, slideHeight: void 0, $imageEl: void 0, $imageWrapEl: void 0, maxRatio: 3 }, image: { isTouched: void 0, isMoved: void 0, currentX: void 0, currentY: void 0, minX: void 0, minY: void 0, maxX: void 0, maxY: void 0, width: void 0, height: void 0, startX: void 0, startY: void 0, touchesStart: {}, touchesCurrent: {} }, velocity: { x: void 0, y: void 0, prevPositionX: void 0, prevPositionY: void 0, prevTime: void 0 } }, a = ("onGestureStart onGestureChange onGestureEnd onTouchStart onTouchMove onTouchEnd onTransitionEnd toggle enable disable in out".split(" ").forEach(function (e) { t[e] = Z[e].bind(s) }), U.extend(s, { zoom: t }), 1); Object.defineProperty(s.zoom, "scale", { get: function () { return a }, set: function (e) { var t, i; a !== e && (t = s.zoom.gesture.$imageEl ? s.zoom.gesture.$imageEl[0] : void 0, i = s.zoom.gesture.$slideEl ? s.zoom.gesture.$slideEl[0] : void 0, s.emit("zoomChange", e, t, i)), a = e } }) }, on: { init: function () { this.params.zoom.enabled && this.zoom.enable() }, destroy: function () { this.zoom.disable() }, touchStart: function (e) { this.zoom.enabled && this.zoom.onTouchStart(e) }, touchEnd: function (e) { this.zoom.enabled && this.zoom.onTouchEnd(e) }, doubleTap: function (e) { this.params.zoom.enabled && this.zoom.enabled && this.params.zoom.toggle && this.zoom.toggle(e) }, transitionEnd: function () { this.zoom.enabled && this.params.zoom.enabled && this.zoom.onTransitionEnd() }, slideChange: function () { this.zoom.enabled && this.params.zoom.enabled && this.params.cssMode && this.zoom.onTransitionEnd() } } }, { name: "lazy", params: { lazy: { enabled: !1, loadPrevNext: !1, loadPrevNextAmount: 1, loadOnTransitionStart: !1, elementClass: "swiper-lazy", loadingClass: "swiper-lazy-loading", loadedClass: "swiper-lazy-loaded", preloaderClass: "swiper-lazy-preloader" } }, create: function () { U.extend(this, { lazy: { initialImageLoaded: !1, load: J.load.bind(this), loadInSlide: J.loadInSlide.bind(this) } }) }, on: { beforeInit: function () { this.params.lazy.enabled && this.params.preloadImages && (this.params.preloadImages = !1) }, init: function () { this.params.lazy.enabled && !this.params.loop && 0 === this.params.initialSlide && this.lazy.load() }, scroll: function () { this.params.freeMode && !this.params.freeModeSticky && this.lazy.load() }, resize: function () { this.params.lazy.enabled && this.lazy.load() }, scrollbarDragMove: function () { this.params.lazy.enabled && this.lazy.load() }, transitionStart: function () { this.params.lazy.enabled && (this.params.lazy.loadOnTransitionStart || !this.params.lazy.loadOnTransitionStart && !this.lazy.initialImageLoaded) && this.lazy.load() }, transitionEnd: function () { this.params.lazy.enabled && !this.params.lazy.loadOnTransitionStart && this.lazy.load() }, slideChange: function () { this.params.lazy.enabled && this.params.cssMode && this.lazy.load() } } }, { name: "controller", params: { controller: { control: void 0, inverse: !1, by: "slide" } }, create: function () { U.extend(this, { controller: { control: this.params.controller.control, getInterpolateFunction: I.getInterpolateFunction.bind(this), setTranslate: I.setTranslate.bind(this), setTransition: I.setTransition.bind(this) } }) }, on: { update: function () { this.controller.control && this.controller.spline && (this.controller.spline = void 0, delete this.controller.spline) }, resize: function () { this.controller.control && this.controller.spline && (this.controller.spline = void 0, delete this.controller.spline) }, observerUpdate: function () { this.controller.control && this.controller.spline && (this.controller.spline = void 0, delete this.controller.spline) }, setTranslate: function (e, t) { this.controller.control && this.controller.setTranslate(e, t) }, setTransition: function (e, t) { this.controller.control && this.controller.setTransition(e, t) } } }, { name: "a11y", params: { a11y: { enabled: !0, notificationClass: "swiper-notification", prevSlideMessage: "Previous slide", nextSlideMessage: "Next slide", firstSlideMessage: "This is the first slide", lastSlideMessage: "This is the last slide", paginationBulletMessage: "Go to slide {{index}}" } }, create: function () { var t = this; U.extend(t, { a11y: { liveRegion: S('') } }), Object.keys(ee).forEach(function (e) { t.a11y[e] = ee[e].bind(t) }) }, on: { init: function () { this.params.a11y.enabled && (this.a11y.init(), this.a11y.updateNavigation()) }, toEdge: function () { this.params.a11y.enabled && this.a11y.updateNavigation() }, fromEdge: function () { this.params.a11y.enabled && this.a11y.updateNavigation() }, paginationUpdate: function () { this.params.a11y.enabled && this.a11y.updatePagination() }, destroy: function () { this.params.a11y.enabled && this.a11y.destroy() } } }, { name: "history", params: { history: { enabled: !1, replaceState: !1, key: "slides" } }, create: function () { U.extend(this, { history: { init: k.init.bind(this), setHistory: k.setHistory.bind(this), setHistoryPopState: k.setHistoryPopState.bind(this), scrollToSlide: k.scrollToSlide.bind(this), destroy: k.destroy.bind(this) } }) }, on: { init: function () { this.params.history.enabled && this.history.init() }, destroy: function () { this.params.history.enabled && this.history.destroy() }, transitionEnd: function () { this.history.initialized && this.history.setHistory(this.params.history.key, this.activeIndex) }, slideChange: function () { this.history.initialized && this.params.cssMode && this.history.setHistory(this.params.history.key, this.activeIndex) } } }, { name: "hash-navigation", params: { hashNavigation: { enabled: !1, replaceState: !1, watchState: !1 } }, create: function () { U.extend(this, { hashNavigation: { initialized: !1, init: z.init.bind(this), destroy: z.destroy.bind(this), setHash: z.setHash.bind(this), onHashCange: z.onHashCange.bind(this) } }) }, on: { init: function () { this.params.hashNavigation.enabled && this.hashNavigation.init() }, destroy: function () { this.params.hashNavigation.enabled && this.hashNavigation.destroy() }, transitionEnd: function () { this.hashNavigation.initialized && this.hashNavigation.setHash() }, slideChange: function () { this.hashNavigation.initialized && this.params.cssMode && this.hashNavigation.setHash() } } }, { name: "autoplay", params: { autoplay: { enabled: !1, delay: 3e3, waitForTransition: !0, disableOnInteraction: !0, stopOnLastSlide: !1, reverseDirection: !1 } }, create: function () { var t = this; U.extend(t, { autoplay: { running: !1, paused: !1, run: M.run.bind(t), start: M.start.bind(t), stop: M.stop.bind(t), pause: M.pause.bind(t), onVisibilityChange: function () { "hidden" === document.visibilityState && t.autoplay.running && t.autoplay.pause(), "visible" === document.visibilityState && t.autoplay.paused && (t.autoplay.run(), t.autoplay.paused = !1) }, onTransitionEnd: function (e) { t && !t.destroyed && t.$wrapperEl && e.target === this && (t.$wrapperEl[0].removeEventListener("transitionend", t.autoplay.onTransitionEnd), t.$wrapperEl[0].removeEventListener("webkitTransitionEnd", t.autoplay.onTransitionEnd), t.autoplay.paused = !1, t.autoplay.running ? t.autoplay.run() : t.autoplay.stop()) } } }) }, on: { init: function () { this.params.autoplay.enabled && (this.autoplay.start(), document.addEventListener("visibilitychange", this.autoplay.onVisibilityChange)) }, beforeTransitionStart: function (e, t) { this.autoplay.running && (t || !this.params.autoplay.disableOnInteraction ? this.autoplay.pause(e) : this.autoplay.stop()) }, sliderFirstMove: function () { this.autoplay.running && (this.params.autoplay.disableOnInteraction ? this.autoplay.stop() : this.autoplay.pause()) }, touchEnd: function () { this.params.cssMode && this.autoplay.paused && !this.params.autoplay.disableOnInteraction && this.autoplay.run() }, destroy: function () { this.autoplay.running && this.autoplay.stop(), document.removeEventListener("visibilitychange", this.autoplay.onVisibilityChange) } } }, { name: "effect-fade", params: { fadeEffect: { crossFade: !1 } }, create: function () { U.extend(this, { fadeEffect: { setTranslate: te.setTranslate.bind(this), setTransition: te.setTransition.bind(this) } }) }, on: { beforeInit: function () { var e; "fade" === this.params.effect && (this.classNames.push(this.params.containerModifierClass + "fade"), U.extend(this.params, e = { slidesPerView: 1, slidesPerColumn: 1, slidesPerGroup: 1, watchSlidesProgress: !0, spaceBetween: 0, virtualTranslate: !0 }), U.extend(this.originalParams, e)) }, setTranslate: function () { "fade" === this.params.effect && this.fadeEffect.setTranslate() }, setTransition: function (e) { "fade" === this.params.effect && this.fadeEffect.setTransition(e) } } }, { name: "effect-cube", params: { cubeEffect: { slideShadows: !0, shadow: !0, shadowOffset: 20, shadowScale: .94 } }, create: function () { U.extend(this, { cubeEffect: { setTranslate: ie.setTranslate.bind(this), setTransition: ie.setTransition.bind(this) } }) }, on: { beforeInit: function () { var e; "cube" === this.params.effect && (this.classNames.push(this.params.containerModifierClass + "cube"), this.classNames.push(this.params.containerModifierClass + "3d"), U.extend(this.params, e = { slidesPerView: 1, slidesPerColumn: 1, slidesPerGroup: 1, watchSlidesProgress: !0, resistanceRatio: 0, spaceBetween: 0, centeredSlides: !1, virtualTranslate: !0 }), U.extend(this.originalParams, e)) }, setTranslate: function () { "cube" === this.params.effect && this.cubeEffect.setTranslate() }, setTransition: function (e) { "cube" === this.params.effect && this.cubeEffect.setTransition(e) } } }, { name: "effect-flip", params: { flipEffect: { slideShadows: !0, limitRotation: !0 } }, create: function () { U.extend(this, { flipEffect: { setTranslate: se.setTranslate.bind(this), setTransition: se.setTransition.bind(this) } }) }, on: { beforeInit: function () { var e; "flip" === this.params.effect && (this.classNames.push(this.params.containerModifierClass + "flip"), this.classNames.push(this.params.containerModifierClass + "3d"), U.extend(this.params, e = { slidesPerView: 1, slidesPerColumn: 1, slidesPerGroup: 1, watchSlidesProgress: !0, spaceBetween: 0, virtualTranslate: !0 }), U.extend(this.originalParams, e)) }, setTranslate: function () { "flip" === this.params.effect && this.flipEffect.setTranslate() }, setTransition: function (e) { "flip" === this.params.effect && this.flipEffect.setTransition(e) } } }, { name: "effect-coverflow", params: { coverflowEffect: { rotate: 50, stretch: 0, depth: 100, modifier: 1, slideShadows: !0 } }, create: function () { U.extend(this, { coverflowEffect: { setTranslate: ae.setTranslate.bind(this), setTransition: ae.setTransition.bind(this) } }) }, on: { beforeInit: function () { "coverflow" === this.params.effect && (this.classNames.push(this.params.containerModifierClass + "coverflow"), this.classNames.push(this.params.containerModifierClass + "3d"), this.params.watchSlidesProgress = !0, this.originalParams.watchSlidesProgress = !0) }, setTranslate: function () { "coverflow" === this.params.effect && this.coverflowEffect.setTranslate() }, setTransition: function (e) { "coverflow" === this.params.effect && this.coverflowEffect.setTransition(e) } } }, { name: "thumbs", params: { thumbs: { multipleActiveThumbs: !0, swiper: null, slideThumbActiveClass: "swiper-slide-thumb-active", thumbsContainerClass: "swiper-container-thumbs" } }, create: function () { U.extend(this, { thumbs: { swiper: null, init: ne.init.bind(this), update: ne.update.bind(this), onThumbClick: ne.onThumbClick.bind(this) } }) }, on: { beforeInit: function () { var e = this.params.thumbs; e && e.swiper && (this.thumbs.init(), this.thumbs.update(!0)) }, slideChange: function () { this.thumbs.swiper && this.thumbs.update() }, update: function () { this.thumbs.swiper && this.thumbs.update() }, resize: function () { this.thumbs.swiper && this.thumbs.update() }, observerUpdate: function () { this.thumbs.swiper && this.thumbs.update() }, setTransition: function (e) { var t = this.thumbs.swiper; t && t.setTransition(e) }, beforeDestroy: function () { var e = this.thumbs.swiper; e && this.thumbs.swiperCreated && e && e.destroy() } } }]; return void 0 === u.use && (u.use = u.Class.use, u.installModule = u.Class.installModule), u.use(O), u }); let ANIUTIL = { scrollController: function () { let i = {}, e = navigator.userAgent.toLowerCase(), s = -1 < e.indexOf("mac os"), a = document.scrollingElement || document.documentElement || document.body.parentNode || document.body, n = s ? 60 : 120, r, o, l, d, h = a === document.body && document.documentElement ? document.documentElement : a, t = !1, c = null; let p = { wheel: function () { "Netscape" == navigator.appName && -1 != navigator.userAgent.search("Trident") || -1 != e.indexOf("msie") ? document.documentElement.addEventListener("mousewheel", u.scrollEvent, { passive: !1 }) : document.documentElement.addEventListener("wheel", u.scrollEvent, { passive: !1 }) }, scroll: function () { window.addEventListener("scroll", function () { "hidden" == document.documentElement.style.overflow || "hidden" == document.body.style.overflow || t || (l = a.scrollTop) }) } }, u = { scrollEvent: function (e) { var t; "hidden" != document.documentElement.style.overflow && "hidden" != document.body.style.overflow && (e.preventDefault(), t = document.body.getAttribute("data-scroll-speed"), e = u.normalizeWheelDelta(e), t = i.currDelta && t ? t : t || r ? r : 120, l += -e * t, d = Math.max(0, Math.min(l, a.scrollHeight - h.clientHeight)), u.update()) }, normalizeWheelDelta: function (e) { return e.detail ? e.wheelDelta ? e.wheelDelta / e.detail / 40 * (0 < e.detail ? 1 : -1) : -e.detail / 3 : e.wheelDelta / 120 }, update: function () { var e = d - a.scrollTop, e = Math.ceil(a.scrollTop + e) <= 0 ? 0 : l > d ? d : Math.ceil(a.scrollTop + e); t = !0, TweenMax.to(a, o, { ease: "circ.out", scrollTop: e, onComplete: function () { clearTimeout(c), c = null, c = setTimeout(function () { t = !1, l = a.scrollTop }, 500) } }), l <= 0 ? l = 0 : l >= d && (l = d) } }; return { init: function (e) { var t; return t = e, r = t.speed ? s ? t.speed / 2 : t.speed : n, o = t.duration || .6, l = a.scrollTop, p.wheel(), p.scroll(), this.opt = e }, destroy: function (e) { document.documentElement.removeEventListener("mousewheel", u.scrollEvent), document.documentElement.removeEventListener("wheel", u.scrollEvent), e && (i = {}) } } } }, UTILS = (window.RING = window.RING || {}, (() => { return { isIosDevice: ((s = /iPad|iPhone|iPod/.test(navigator.userAgent)) ? document.documentElement.classList.add("isIosDevice") : document.documentElement.classList.add("isNotIosDevice"), s), checkGlobal: void (0 === location.pathname.indexOf("/global/galaxy") || !0 === window.IS_CAMPAIGN ? document.documentElement.classList.add("global") : document.documentElement.classList.add("dotcom")), checkOS: (() => { let e = navigator.appVersion.match(/(mac|win|linux)/i); e = e ? e[1].toLowerCase() : "", document.documentElement.classList.add(e) })(), isFireFox: void (/firefox/i.test(navigator.userAgent) && document.documentElement.classList.add("firefox")), isWebkit: void (/applewebkit/i.test(navigator.userAgent) && document.documentElement.classList.add("webkit")), isChrome: void (/chrome/i.test(navigator.userAgent) && document.documentElement.classList.add("chrome")), isOpera: void (/opera/i.test(navigator.userAgent) && document.documentElement.classList.add("opera")), isIos: void (/ip(ad|hone|od)/i.test(navigator.userAgent) && document.documentElement.classList.add("ios")), isCrIos: void (/crios/i.test(navigator.userAgent) && document.documentElement.classList.add("crios")), isAndroid: void (/android/i.test(navigator.userAgent) && document.documentElement.classList.add("android")), isSafari: (s = /applewebkit/i.test(navigator.userAgent), i = /chrome/i.test(navigator.userAgent), void (s && !i && document.documentElement.classList.add("safari"))), isHuawei: void (/HUAWEICLT/i.test(navigator.userAgent) && document.documentElement.classList.add("huawei")), isUCBrowser: void (/UCBrowser/i.test(navigator.userAgent) && document.documentElement.classList.add("ucbrowser")), winSize: (s = "Netscape" === navigator.appName, i = -1 !== navigator.appVersion.indexOf("Mac"), e = -1 !== navigator.userAgent.indexOf("Safari"), t = -1 !== navigator.userAgent.indexOf("Chrome"), s && !i && e && !t ? function () { return { w: $(win).width(), h: $(win).height() } } : function () { return { w: window.innerWidth || document.documentElement.clientWidth || document.body.clientWidth, h: window.innerHeight || document.documentElement.clientHeight || document.body.clientHeight } }), requestAFrame: window.requestAnimationFrame || window.webkitRequestAnimationFrame || window.mozRequestAnimationFrame || window.oRequestAnimationFrame || window.msRequestAnimationFrame || function (e) { return window.setTimeout(e, 1e3 / 60) }, cancelAFrame: window.cancelAnimationFrame || window.webkitCancelAnimationFrame || window.webkitCancelRequestAnimationFrame || window.mozCancelAnimationFrame || window.oCancelAnimationFrame || window.msCancelAnimationFrame || function (e) { window.clearTimeout(e) }, isObject: function (e) { return "object" == typeof e && null !== e && e.constructor && e.constructor === Object }, def: function () { let t = [], e = arguments.length; for (; e--;)t[e] = arguments[e]; var i = Object(t[0]); for (let e = 1; e < t.length; e += 1) { var s = t[e]; if (null != s) { var a = Object.keys(Object(s)); for (let e = 0, t = a.length; e < t; e += 1) { var n = a[e], r = Object.getOwnPropertyDescriptor(s, n); void 0 !== r && r.enumerable && (this.isObject(i[n]) && this.isObject(s[n]) ? this.def(i[n], s[n]) : !this.isObject(i[n]) && this.isObject(s[n]) ? (i[n] = {}, this.def(i[n], s[n])) : i[n] = s[n]) } } } return i }, convertArray: function (e) { return Array.prototype.slice.call(e) }, getOffset: function (e) { return { top: e.getBoundingClientRect().top + window.pageYOffset, bottom: e.getBoundingClientRect().bottom + window.pageYOffset } }, getScroll: function () { var e = window.pageYOffset; return { top: e, bottom: e + window.innerHeight } }, setCookie: function (e, t, i) { var s = new Date; s.setTime(s.getTime() + 60 * i * 60 * 24 * 1e3), document.cookie = e + "=" + t + "; exprires=" + s.toUTCString() + "; path=/" }, getCookie: function (e) { e = document.cookie.match("(^|;) ?" + e + "=([^;]*)(;|$)"); return e ? e[2] : null }, getHeight: function (e) { if (e) { var t = window.getComputedStyle(e), i = t.display, t = parseInt(t.maxHeight); const s = 0; return "none" != i && 0 != t ? e.offsetHeight : (e.style.position = "absolute", e.style.visibility = "hidden", e.style.display = "block", s = e.offsetHeight, e.style.display = "", e.style.position = "", e.style.visibility = "", s) } return 0 }, isRTL: function () { return document.documentElement.classList.contains("rtl") }, checkRegion: function () { var t = document.getElementsByTagName("meta"); let i = ""; for (let e = 0; e < t.length; e++)if ("sitecode" == t[e].getAttribute("name")) return i = t[e].getAttribute("content"); if ("" == i) return -1 < document.location.pathname.indexOf("global") ? "global" : "jp" }, isLowNetwork: function () { var e = UTILS.getCookie("___GALAXY_SPEED") || UTILS.getCookie("__COM_SPEED"); return null != e && ("L" == e || "H" != e && void 0) }, getNavHeight: function () { let e = 0; var t, i, s = document.querySelector(".pd-g-header-navigation") || document.querySelector("#subnav") || document.querySelector(".sticky-menu") || document.querySelector(".pd-g-floating-nav"); return e = s ? s.classList.contains("pd-g-header-navigation") ? (i = (t = s.querySelector(".pd-header-navigation")).querySelector(".pd-header-navigation__menu-wrap"), t.clientHeight + i.clientHeight) : s.clientHeight : e }, isBrokenFixed: function () { var e = window.innerWidth, t = window.innerHeight; let i = !1; return document.documentElement.classList.remove("is-broken-fixed"), 1440 <= e && t <= 540 || e <= 810 && t / e < .5277 || t < UTILS.MIN_VIEW_HEIGHT ? (document.documentElement.classList.add("is-broken-fixed"), i = !0) : document.documentElement.classList.remove("is-broken-fixed"), i }, isTouchDevice: ((s = "ontouchstart" in window || window.DocumentTouch && document instanceof window.DocumentTouch) ? document.documentElement.classList.add("isTouchDevice") : document.documentElement.classList.add("isNotTouchDevice"), s), isIEorEdge: (() => { let e; var t = navigator.userAgent.toLowerCase(); if ("Microsoft Internet Explorer" == navigator.appName) e = "msie "; else if (-1 < t.search("trident")) e = "trident/.*rv:"; else { if (!(-1 < t.search("edge/"))) return -1; e = "edge/" } return null != new RegExp(e + "([0-9]{1,})(\\.{0,}[0-9]{0,1})").exec(t) ? (document.documentElement.classList.add("isIEorEdge"), parseFloat(RegExp.$1 + RegExp.$2)) : -1 })(), page: { scrollLock: { className: "is-no-scroll", barWidth: function () { return window.innerWidth - document.documentElement.clientWidth }, el: $("html"), run: function (e) { document.documentElement.style.paddingRight = e + "px" }, off: function () { this.barWidth(); this.el.removeClass(this.className), this.el.removeClass("hive-layer-scroll-lock"), this.run(0) }, on: function () { var e = this.barWidth(); this.el.addClass(this.className), this.run(e) } } }, MIN_VIEW_HEIGHT: 400, RESPONSIVE: { PC: { NAME: "pc", WIDTH: 1440 }, TABLET: { NAME: "tablet", WIDTH: 1024 }, MOBILE: { NAME: "mobile", WIDTH: 767 } } }; var e, t, i, s })()); RING.UTILS = UTILS, (() => { window.RING = window.RING || {}; let p = RING.UTILS; RING.ImageLoader = class { constructor(e = container, t) { t = { el: e, lazyClass: ".js-img-src", lazyCompleteClass: "load-complete", responsiveClass: t.responsiveClass || ".js-res-img", loadOption: t.loadOption, visiblePoint: t.visiblePoint || 0, useDefaultImg: t.useDefaultImg, resizeStart: null }; this.opts = t, this.classes = t.classes, this.events = { load: this.onLoadHandler.bind(this), resize: this.onResizeHandler.bind(this), scroll: this.lazyEvent.bind(this) }, this.el = document.querySelector(e), this.init() } init() { this.initOpts(), this.getLazyImage(), this.getResponsiveImage(), this.bindEvents() } initOpts() { this.targetAttr = this.opts.loadOption[0].attribute, this.responsiveCheck = this.opts.loadOption, this.dynamicCallCount = 0, this.dynamicLoadedComplate = !1, this.opts.useDefaultImg && this.setDefaultImage() } getLazyImage() { let t = []; var e = this.el.children; Array.from(e).forEach(e => { e.classList.contains("is-feature-hide") || (e = e.querySelectorAll(this.opts.lazyClass), t.push(...e)) }), this.lazyImages = t, this.lazyLength = t.length } getResponsiveImage() { var e = this.el.querySelectorAll(this.opts.responsiveClass); this.responsiveImages = e, this.responsiveLength = e.length } bindEvents() { window.addEventListener("load", this.events.load), window.addEventListener("scroll", this.events.scroll), this.responsiveCheck && window.addEventListener("resize", this.events.resize) } onLoadHandler() { this.events.resize(), this.events.scroll(), setTimeout(() => { this.responsiveHandler(), this.lazyEvent() }, 300), window.removeEventListener("load", this.events.load) } onResizeHandler() { clearTimeout(this.opts.resizeStart), this.opts.resizeStart = setTimeout(() => { this.responsiveHandler(), this.lazyEvent() }, 150) } lazyEvent() { this.setLazyImage(), this.lazyLength === this.lazyCompleteLength && window.removeEventListener("scroll", this.events.scroll) } responsiveHandler() { this.windowWidth = window.innerWidth; var a = this.opts.loadOption.length; for (let s = 0; s < a; s++) { let e = s + 1, t = e == a ? 0 : this.opts.loadOption[e].resolution, i = !1; (i = (0 == s || this.windowWidth <= this.opts.loadOption[s].resolution) && this.windowWidth > t) && this.opts.loadOption[s].attribute !== this.oldAttr && (this.targetAttr = this.opts.loadOption[s].attribute, this.oldAttr = this.targetAttr, this.attrIndex = s, this.dynamicCallCount = 0, this.setResponsiveImage()) } } setResponsiveImage(i) { if (i) for (let t = 0; t < i.length; t++) { var s = i[t]; let e = i[t].getAttribute(this.targetAttr); e = e || this.findImageHandler(s), void 0 === window.GALAXY && !window.GALAXY && (-1 < e.indexOf(".jpg") || -1 < e.indexOf(".png")) && (e += "?imbypass=true"), i[t].classList.contains(this.opts.lazyCompleteClass) || (i[t].setAttribute("src", e), i[t].classList.add(this.opts.lazyCompleteClass)) } else for (let t = 0; t < this.responsiveLength; t++) { var a = this.responsiveImages[t]; let e = a.getAttribute(this.targetAttr); e = e || this.findImageHandler(a), void 0 === window.GALAXY && !window.GALAXY && (-1 < e.indexOf(".jpg") || -1 < e.indexOf(".png")) && (e += "?imbypass=true"), a.classList.contains(this.opts.lazyCompleteClass) && a.setAttribute("src", e) } } checkCompleteImage() { var e = this.el.querySelectorAll("." + this.opts.lazyCompleteClass); this.lazyCompleteLength = e.length } setDefaultImage() { for (var e = 0; e < this.lazyLength; e++)this.lazyImages[e].setAttribute("src", "data:image/gif;base64,R0lGODlhAQABAPAAAP///wAAACH/C1hNUCBEYXRhWE1QAz94cAAh+QQFAAAAACwAAAAAAQABAAACAkQBADs=") } setLazyImage() { this.windowHeight = window.innerHeight; for (let d = 0; d < this.lazyLength; d++) { let t = this.lazyImages[d], e = this.windowHeight * this.opts.visiblePoint, i = p.getScroll.call(this).top - e, s = p.getScroll.call(this).bottom + e, a = p.getOffset.call(this, t).top, n = p.getOffset.call(this, t).bottom, r = this.opts.lazyClass.split("."), o = r[r.length - 1], l; var h, c; if ("none" === window.getComputedStyle(t).display ? null != (h = t.parentNode).offsetParent && (l = h.offsetParent, a = p.getOffset.call(this, h).top, n = p.getOffset.call(this, h).bottom) : l = t.offsetParent, (s > a && i <= a || i < n && s > n || i < a && s > n || i > a && s < n) && null != l) { let e = t.getAttribute(this.targetAttr); e = e || this.findImageHandler(t), void 0 === window.GALAXY && !window.GALAXY && (-1 < e.indexOf(".jpg") || -1 < e.indexOf(".png")) && (e += "?imbypass=true"), t.classList.contains(this.opts.lazyCompleteClass) || (t.setAttribute("src", e), c = () => { 1 == this.opts.lazyClass.split(" ").length && t.classList.remove(o), this.checkCompleteImage(), t.removeEventListener("load", c) }, t.addEventListener("load", c), t.classList.add(this.opts.lazyCompleteClass)) } } } findRemainingImageAttr(e) { for (var t = this.opts.loadOption.length, i = 0; i < t; i++) { var s = e.getAttribute(this.opts.loadOption[i].attribute); if (s) return s } } findNextImageAttr(t) { for (let e = this.attrIndex; 0 <= e; e--) { var i = t.getAttribute(this.opts.loadOption[e].attribute); if (i) return i; if (0 == e && null == i) return this.findRemainingImageAttr(t) } } findImageHandler(e) { return 0 !== this.attrIndex ? this.findNextImageAttr(e) : this.findRemainingImageAttr(e) } } })(), (() => { window.RING = window.RING || {}; let e = RING.UTILS, t = e.RESPONSIVE; class i { constructor(e = container, t) { t = { el: e, lazyClass: t.lazyClass || ".js-video-src", responsiveClass: t.responsiveClass || ".js-res-video", imageLazyCompleteClass: "load-complete", notLoadElement: t.notLoadElement || [], loadOption: t.loadOption, visiblePoint: t.visiblePoint || 0, resizeStart: null, classes: { loaded: "loaded", ended: "ended" } }; this.opts = t, this.classes = t.classes, this.el = document.querySelector(e), this.init() } init() { this.initOpts(), this.getLazyVideo(), this.getResponsiveVideo(), this.bindEvents() } initOpts() { this.getCurrentDevice(); var e = "mobile" !== this.currentDevice ? 0 : 1; this.prevSrcArray = [], this.targetAttr = this.opts.loadOption[e].attribute, this.responsiveCheck = this.opts.loadOption, this.videoCallStack = [] } getLazyVideo() { let e = Array.from(this.el.querySelectorAll(this.opts.lazyClass)).filter(t => { t.isVideoInit = !1; { let e = 0; if (e < this.opts.notLoadElement.length) return !t.closest(this.opts.notLoadElement[e]) } }); e = e.filter(e => { if (e.querySelector("video") && !e.closest(".is-feature-hide")) return e }), this.lazyVideos = e, this.lazyLength = e.length } getResponsiveVideo() { var e = Array.from(this.el.querySelectorAll(this.opts.responsiveClass)).filter(t => { { let e = 0; if (e < this.opts.notLoadElement.length) return !t.closest(this.opts.notLoadElement[e]) } }); this.responsiveVideos = e, this.responsiveLength = e.length } bindEvents() { window.addEventListener("load", this.onLoadHandler.bind(this)), window.addEventListener("scroll", this.lazyEvent.bind(this)), this.responsiveCheck && window.addEventListener("resize", this.onResizeHandler.bind(this)) } getCurrentDevice() { this.winWidth = e.winSize().w, this.winWidth >= t.TABLET.WIDTH ? this.currentDevice = "desktop" : this.winWidth > t.MOBILE.WIDTH && this.winWidth < t.TABLET.WIDTH ? this.currentDevice = "tablet" : this.currentDevice = "mobile", this.prevDevice = this.currentDevice } onLoadHandler() { this.getCurrentDevice(), this.responsiveHandler(), this.lazyEvent() } onResizeHandler() { clearTimeout(this.opts.resizeStart), this.opts.resizeStart = setTimeout(() => { this.getCurrentDevice(), this.responsiveHandler(), this.lazyEvent() }, 80) } lazyEvent() { this.setLazyVideo(), this.lazyLength === this.lazyCompleteLength && window.removeEventListener("scroll", this.lazyEvent.bind(this)) } responsiveHandler() { this.windowWidth = window.innerWidth; var a = this.opts.loadOption.length; for (let s = 0; s < a; s++) { let e = s + 1, t = e == a ? 0 : this.opts.loadOption[e].resolution, i = !1; (i = (0 == s || this.windowWidth <= this.opts.loadOption[s].resolution) && this.windowWidth > t) && this.opts.loadOption[s].attribute !== this.oldAttr && (this.targetAttr = this.opts.loadOption[s].attribute, this.oldAttr = this.targetAttr, this.attrIndex = s, this.setResponsiveVideo()) } } setResponsiveVideo(t) { var i = e => { let t = e.querySelector("video"), i = e.getAttribute(this.targetAttr); t.querySelectorAll("source").forEach(e => { var t = e.getAttribute("type"); -1 < t.indexOf("webm") && (e.src = i + (".webm" + (void 0 !== window.GALAXY || window.GALAXY ? "" : "?imbypass=true"))), -1 < t.indexOf("mp4") && (e.src = i + (".mp4" + (void 0 !== window.GALAXY || window.GALAXY ? "" : "?imbypass=true"))) }), t.isCanplayThrough = !1, t.load(), t.addEventListener("canplaythrough", () => { window.setTimeout(() => { t.isCanplayThrough = !0, e.classList.add(this.classes.loaded) }, 500), this.checkCompleteVideo() }, { once: !0 }) }; if (t) for (let e = 0; e < t.length; e++)i(t[e]); else for (let e = 0; e < this.responsiveLength; e++) { var s = this.responsiveVideos[e]; s.classList.contains(this.classes.loaded) && s.isVideoInit && i(s) } } setLazyVideo() { for (let e = 0; e < this.lazyLength; e++) { var t = window.pageYOffset, i = t + window.innerHeight, s = this.lazyVideos[e], a = s.getBoundingClientRect(); i > t + a.top - window.innerHeight * (0 != window.pageYOffset ? this.opts.visiblePoint : 0) && t < t + a.bottom + window.innerHeight * (0 != window.pageYOffset ? this.opts.visiblePoint : 0) && !s.isVideoInit && this.videoCallStack.indexOf(e) < 0 && (this.videoCallStack.push(e), this.setVideoSrc()) } } setVideoSrc() { var e = this.videoCallStack[0]; let t = this.lazyVideos[e], i = t.querySelector("video"), s = t.getAttribute(this.targetAttr); var a = this.opts.lazyClass.split("."); let n = a[a.length - 1]; a = s; let r = () => { this.checkCompleteVideo(), this.videoCallStack.splice(0, 1), 0 < this.videoCallStack.length && this.setVideoSrc() }; var o = () => { window.setTimeout(() => { i.isCanplayThrough = !0, t.classList.add(this.classes.loaded) }, 500), 1 == this.opts.lazyClass.split(" ").length && t.classList.remove(n), r() }; this.prevSrcArray[e] !== a && (i.querySelectorAll("source").forEach(e => { var t = e.getAttribute("type"); -1 < t.indexOf("webm") && (e.src = s + (".webm" + (void 0 !== window.GALAXY || window.GALAXY ? "" : "?imbypass=true"))), -1 < t.indexOf("mp4") && (e.src = s + (".mp4" + (void 0 !== window.GALAXY || window.GALAXY ? "" : "?imbypass=true"))) }), i.isCanplayThrough = !1, i.load(), i.addEventListener("canplaythrough", o, { once: !0 }), i.addEventListener("error", () => { window.fetch(s + (".webm" + (void 0 !== window.GALAXY || window.GALAXY ? "" : "?imbypass=true")), { mode: "no-cors" }).then(e => { if (404 === e.status) return fetch(s + (".mp4" + (void 0 !== window.GALAXY || window.GALAXY ? "" : "?imbypass=true")), { mode: "no-cors" }) }).then(e => { 404 === e.status && r() }).catch(() => { r() }) }, !0), t.isVideoInit = !0, this.prevSrcArray[e] = a) } checkCompleteVideo() { var e = Array.from(this.el.querySelectorAll("." + this.classes.loaded)).filter(t => { { let e = 0; if (e < this.opts.notLoadElement.length) return !t.closest(this.opts.notLoadElement[e]) } }); this.lazyCompleteLength = e.length } } RING.VideoLoader = i })(), (() => { window.RING = window.RING || {}; let d = RING.UTILS, e = d.RESPONSIVE; RING.VideoPlayer = class { constructor(e, t) { e = { sectionElement: t.sectionElement, videoParentElement: null, videoElement: e, videoController: ".video__controller", hiddenElement: ".blind", endImage: ".video__end-frame img", videoLazyClass: ".js-video-src", lazyCompleteClass: "load-complete", imageEndLazyClass: ".js-end-img-src", playOffset: .5, playType: "oneWay", visiblePoint: t.visiblePoint || 0, classes: { loaded: "loaded", ended: "ended", paused: "paused", playing: "playing", isPaused: "is-paused" }, resizeStart: null, on: { updateController: null, updatePlayState: null, updateTime: null } }; this.opts = d.def(e, t || {}), this.classes = e.classes, this.init() } init() { this.setElements(), this.initOpts(), null !== this.video && (this.video.paused || this.video.pause(), this.videoElement.playState = !1, this.updateController(), this.bindEvents()) } setElements() { this.videoElement = this.opts.videoElement, this.video = this.videoElement.querySelector("video"), null !== this.video && (null !== this.opts.videoParentElement ? this.videoParentElement = this.video.closest(this.opts.videoParentElement) : this.videoParentElement = this.videoElement, this.videoController = this.videoParentElement.querySelector(this.opts.videoController)) } initOpts() { this.getCurrentDevice(), this.autoPlay = !!this.videoElement.dataset.autoPlay && JSON.parse(this.videoElement.dataset.autoPlay), this.videoElement.playState = !1, this.videoElement.autoPlayState = !1, this.useController = !!this.videoController } getCurrentDevice() { this.winWidth = d.winSize().w, this.winWidth >= e.TABLET.WIDTH ? this.currentDevice = "desktop" : this.winWidth > e.MOBILE.WIDTH && this.winWidth < e.TABLET.WIDTH ? this.currentDevice = "tablet" : this.currentDevice = "mobile", this.prevDevice = this.currentDevice } bindEvents() { window.addEventListener("resize", this.onResizeHandler.bind(this)), window.addEventListener("scroll", this.onScrollHandler.bind(this)), this.video.addEventListener("play", this.onVideoPlay.bind(this)), this.video.addEventListener("pause", this.onVideoPause.bind(this)), this.video.addEventListener("ended", this.onVideoEnded.bind(this)), this.video.addEventListener("canplaythrough", this.onCanplayThrough.bind(this), { once: !0 }), this.video.addEventListener("timeupdate", this.onTimeUpdate.bind(this)), this.useController && this.videoController.addEventListener("click", this.onClickController.bind(this)) } onChange(e) { if (e === this.videoElement) { e = "mobile" !== this.currentDevice ? "data-media-pc" : "data-media-mo"; let i = this.videoElement.getAttribute(e); e = i; this.prevVideoSrc !== e && (this.videoElement.playState = !1, this.video.querySelectorAll("source").forEach(e => { var t = e.getAttribute("type"); -1 < t.indexOf("webm") && (e.src = i + ".webm"), -1 < t.indexOf("mp4") && (e.src = i + ".mp4"), this.video.load() }), this.videoElement.classList.remove(this.classes.playing), this.videoElement.classList.remove(this.classes.paused), this.video.addEventListener("canplaythrough", () => { d.isLowNetwork() || this.onPlay() }, { once: !0 })), this.prevVideoSrc = e } } onLoad(e) { if (e === this.videoElement) { e = "mobile" !== this.currentDevice ? "data-media-pc" : "data-media-mo"; let i = this.videoElement.getAttribute(e); this.videoElement.playState = !1, this.video.querySelectorAll("source").forEach(e => { var t = e.getAttribute("type"); -1 < t.indexOf("webm") && (e.src = i + ".webm"), -1 < t.indexOf("mp4") && (e.src = i + ".mp4"), this.video.load() }), this.video.isCanplayThrough = !1, this.video.addEventListener("canplaythrough", () => { this.video.isCanplayThrough = !0, d.isLowNetwork() || this.onPlay() }, { once: !0 }) } } onPlay(e) { var t = () => { if (!this.videoElement.playState) { this.video.currentTime === this.video.duration && (this.video.currentTime = 0), this.autoPlay && (this.videoElement.autoPlayState = !0), this.videoElement.playState = !0, this.videoElement.classList.remove(this.classes.ended), this.videoElement.classList.remove(this.classes.paused); let e = () => { this.video.isCanplayThrough && 3 < this.video.readyState ? (cancelAnimationFrame(this.opts.videoFrame), clearTimeout(this.opts.videoPlayTimeout), this.opts.videoPlayTimeout = setTimeout(() => { this.video.play(), this.updateController(), this.outCallback("updatePlayState", !0), this.videoElement.classList.remove(this.classes.ended), this.videoElement.classList.remove(this.classes.paused), this.videoElement.classList.add(this.classes.playing) }, 250)) : this.opts.videoFrame = requestAnimationFrame(e) }; this.opts.videoFrame = requestAnimationFrame(e), this.video.addEventListener("ended", this.updatePlayEnded.bind(this), { once: !0 }) } }; e && e !== this.videoElement || t() } onPause() { this.video.paused || this.video.pause(), this.videoElement.playState = !1, this.videoElement.classList.remove(this.classes.ended), this.videoElement.classList.remove(this.classes.playing), this.videoElement.classList.add(this.classes.paused), this.updateController() } onEnded() { 3 < this.video.readyState && (this.video.ended || this.video.pause(), this.video.currentTime = this.video.duration, this.videoElement.playState = !1, this.videoElement.classList.add(this.classes.ended), this.videoElement.classList.remove(this.classes.playing), this.videoElement.classList.remove(this.classes.paused), this.updateController()) } onReset(e) { this.videoElement.playState || (cancelAnimationFrame(this.opts.videoFrame), clearTimeout(this.opts.videoPlayTimeout)); var t = () => { this.video.pause(), this.video.currentTime = 0, this.videoElement.playState = !1, this.autoPlay && (this.videoElement.autoPlayState = !1), this.videoElement.classList.remove(this.classes.ended), this.videoElement.classList.remove(this.classes.playing), this.videoElement.classList.remove(this.classes.paused), this.updateController() }; e && e !== this.videoElement || t() } onCanplayThrough() { var e = this.opts.videoLazyClass.split("."), e = e[e.length - 1]; this.useController && window.setTimeout(() => { this.videoController.style.display = "block" }, 500), this.videoElement.classList.add(this.classes.loaded), 1 == this.opts.videoLazyClass.split(" ").length && this.videoElement.classList.remove(e), this.isCanplay = !0, this.onScrollHandler(), this.isCanplay = !1 } onTimeUpdate() { var e = { el: this.videoElement, duration: this.video.duration, currentTime: this.video.currentTime, playState: this.videoElement.playState, controller: this.videoController }; this.outCallback("updateTime", e) } onClickController(e) { e.preventDefault(), this.videoElement.playState ? this.onPause() : this.onPlay() } onVideoPlay() { this.videoElement.playState = !0, this.videoElement.classList.remove(this.classes.ended), this.videoElement.classList.add(this.classes.playing), this.videoElement.classList.remove(this.classes.paused), this.updateController(), this.outCallback("updatePlayState", !0) } onVideoPause() { this.videoElement.playState = !1, this.videoElement.classList.remove(this.classes.ended), this.videoElement.classList.remove(this.classes.playing), this.videoElement.classList.add(this.classes.paused), this.updateController(), this.outCallback("updatePlayState", !1) } onVideoEnded() { this.videoElement.playState = !1, this.videoElement.classList.add(this.classes.ended), this.videoElement.classList.remove(this.classes.playing), this.videoElement.classList.remove(this.classes.paused), this.updateController(), this.outCallback("updatePlayState", !1) } updatePlayEnded() { this.onPause() } updateController() { var e; this.useController && (this.videoElement.playState ? this.videoController.classList.add(this.classes.isPaused) : this.videoController.classList.remove(this.classes.isPaused), e = { el: this.videoController, playState: this.videoElement.playState }, this.outCallback("updateController", e), this.outCallback("updatePlayState", this.videoElement.playState)) } onScrollHandler() { if (!this.videoElement.closest(".cm-layer")) { var t = scrollY > this.lastScrollY ? "down" : "up", i = d.getHeight(this.videoElement) * this.opts.playOffset, s = d.getScroll().top, a = d.getScroll().bottom, n = d.getOffset(this.videoElement).top, r = d.getOffset(this.videoElement).bottom; let e = this.videoElement.classList.contains(this.classes.playing) && this.videoElement.playState; var o = this.videoElement.classList.contains(this.classes.paused) && !this.videoElement.playState, l = this.videoElement.classList.contains(this.classes.ended) && !this.videoElement.playState; if ("oneWay" === this.opts.playType) if (n + i <= a && s <= r) { let e = this.isCanplay || "down" == t; !e || !this.autoPlay || this.videoElement.playState || this.videoElement.autoPlayState || d.isLowNetwork() || this.onPlay() } else a < n ? this.autoPlay && this.videoElement.autoPlayState && (e || o || l) && this.onReset() : r < s && this.autoPlay && (this.videoElement.autoPlayState ? (e || o) && this.onEnded() : this.videoElement.classList.add(this.classes.ended)); else "reverse" === this.opts.playType && (n + i <= a && s <= r - i ? !this.autoPlay || this.videoElement.playState || this.videoElement.autoPlayState || d.isLowNetwork() || this.onPlay() : (r < s || a < n) && this.autoPlay && this.onReset()); this.lastScrollY = scrollY } } onResponsiveChange() { window.setTimeout(() => { this.isCanplay = !0, this.onReset(), this.onScrollHandler(), this.isCanplay = !1 }, 100) } onResizeHandler() { d.winSize().w !== this.winWidth && (this.winWidth = d.winSize().w, null == this.opts.resizeStart && (this.opts.resizeStart = this.winWidth, this.resizeAnimateFunc()), window.clearTimeout(this.resizeEndTime), this.resizeEndTime = window.setTimeout(this.resizeEndFunc.bind(this), 150)) } resizeAnimateFunc() { this.setLayout(), this.resizeRequestFrame = d.requestAFrame.call(window, this.resizeAnimateFunc.bind(this)) } resizeEndFunc() { this.opts.resizeStart = null, d.cancelAFrame.call(window, this.resizeRequestFrame) } setLayout() { this.onScrollHandler(), this.winWidth >= e.MOBILE.WIDTH ? this.currentDevice = "desktop" : this.currentDevice = "mobile", this.currentDevice !== this.prevDevice && this.onResponsiveChange(), this.prevDevice = this.currentDevice } outCallback(e, t) { e = this.opts.on[e]; null != e && e(t) } } })(), (() => { window.RING = window.RING || {}; var e = (() => { let r = {}, e = !1, t = null, h = null, i = function () { a(), n(), s(), UTILS.isLowNetwork() && document.documentElement.classList.add("low_network"), document.documentElement.classList.add("load"), window.removeEventListener("load", i) }, s = () => { var e = document.querySelectorAll(".click_sup"), t = document.querySelectorAll("li.common-bottom-disclaimer__list-item"); let s = Array.from(t).map(e => e.getAttribute("data-sup")); Array.from(e).map(e => { var t, i = e.getAttribute("data-sup-tag"); -1 < s.indexOf(i) && (e.innerText = s.indexOf(i) + 1), -1 === s.indexOf(i) && (i = e.parentElement, 1 === (t = e.parentElement?.children.length ?? 0) && i.remove(), 1 < t) && (i.removeChild(e.nextSibling), e.remove(), 3 === i.childNodes.length) && i.removeChild(i.childNodes[2]) }) }, a = function () { e = 1024 <= window.innerWidth ? "desktop" : 768 <= window.innerWidth && window.innerWidth < 1024 ? "tablet" : "mobile", clearTimeout(r.resizeTimeout), r.resizeTimeout = setTimeout(function () { UTILS.isBrokenFixed() }, 100), e != t && (document.documentElement.classList.add(e), document.documentElement.classList.remove(t), t = e) }, n = function () { var t = window.pageYOffset, i = t + window.innerHeight; for (let e = 0; e < r.allClickable.length; e++) { var s = r.allClickable[e], a = t + s.getBoundingClientRect().top, n = t + UTILS.getNavHeight(); n <= a && a <= i ? s.isVisible = !0 : (a < n || i < a) && (s.isVisible = !1) } }, o = function (e) { e.preventDefault(), e.stopPropagation(); let t = this; var i = parseFloat(this.innerText); let s = document.querySelectorAll("#desc-section ol"); s.forEach(e => { "block" === window.getComputedStyle(e).display && (s = e) }); var a = s.querySelectorAll("li"); let n = s.querySelectorAll("li")[i - 1], r = n.querySelector("span"), o = r.innerHTML; var i = `${o}`; r.innerHTML = i, h = e.currentTarget; let l = function () { c.call(t), r.removeEventListener("focusin", l) }, d = function () { r.innerHTML = o, r.removeAttribute("tabindex"), r.removeEventListener("focusout", d) }; e.currentTarget.closest(".cm-layer") && (i = e.currentTarget.closest(".cm-layer"), $(i).trigger("closeLayer", !1)), r.addEventListener("focusin", l), r.addEventListener("focusout", d), setTimeout(() => { n.querySelector("a").focus() }, 0), a.forEach(e => e.classList.remove("is-active")), n.classList.add("is-active") }, l = function (e) { var e = e.target.closest("li"), t = e.getAttribute("data-sup"), i = document.querySelectorAll(".click_sup"); for (let e = 0; e < i.length; e++)i[e].getAttribute("data-sup-tag") === t && (c.call(this), h.focus()); var s, a = h.closest(".cm-layer"); a && (s = a.id, a = a.parentNode.querySelector(`[data-layer-target="#${s}"]`), h.innerText === t) && a.focus(), e.classList.remove("is-active") }, c = function (e) { if (void 0 !== e && void 0 !== e.sourceCapabilities && null === e.sourceCapabilities) e.preventDefault(); else if (document.documentElement.classList.contains("ios") || !e || null != e.relatedTarget) { let s = this; this.isClicked || this.isVisible || d(this) || setTimeout(function () { var e = window.pageYOffset, t = s.getBoundingClientRect(), i = (window.innerHeight - UTILS.getNavHeight()) / 2, e = e - UTILS.getNavHeight() + t.top + t.height / 2; window.scrollTo(0, e - i) }, 10), this.isClicked = !1 } }, d = function (e) { var e = e.parentNode, t = e.getAttribute("id"); return "contents" !== t && e !== document.body && (!("subnav" !== t && !e.classList.contains("sc-s22ultra-popup")) || d(e)) }, p = function () { this.isClicked = !0 }; return { init: function () { r.resizeTimeout = null, r.supClicker = document.querySelectorAll("a.click_sup"), r.supTopBtn = document.querySelectorAll("button.click_disclaimer"), r.contents = document.getElementById("contents") || document.getElementById("content"), r.allClickable = r.contents.querySelectorAll("a, button, input, select"); { let e = 0; for (window.addEventListener("load", i), window.addEventListener("resize", a), window.addEventListener("scroll", n), e = 0; e < r.allClickable.length; e++) { var t = r.allClickable[e]; t.isClicked = !1, t.isVisible = !1, t.addEventListener("focusin", c), t.addEventListener("mousedown", p) } for (e = 0; e < r.supClicker.length; e++)r.supClicker[e].addEventListener("click", o); for (e = 0; e < r.supTopBtn.length; e++)r.supTopBtn[e].addEventListener("click", l) } var e = document.documentElement.classList; "global" === UTILS.checkRegion() || e.contains("mac") || e.contains("safari") || ANIUTIL.scrollController({ speed: 120, duration: .5 }) } } })(); window.RING.Disclaimer = e })(), (e => { e.TrapFocus = (() => { var C = void 0, e = window, t = e.document, T = e.jQuery, i = null, s = e.RING.UTILS; function a(e, t) { if (!(this instanceof a)) return new a(e, t); e = { obj: e, prevStep: null, isDestroy: !1, IgnoreUtilFocusChanges: !1, ariaAttr: { hidden: "aria-hidden", disabled: "aria-disabled", modal: "aria-modal" }, ariaNotHidden: t && t.ariaNotHidden ? t.ariaNotHidden : [], classAttr: { clone: "trapfocus" }, elAttr: { tabIndex: "tabindex", role: "role" }, customEvent: ".TrapFocus" + (new Date).getTime() + Math.random() }; this.opts = s.def(e, t || {}), (this.obj = T(this.opts.obj)).length && (null != i && i.destroy(), (i = this).init()) } return a.prototype = { init: function () { this.initLayout(), this.buildAria(), this.bindEvents(!0), this.loadComponent(), this.obj.data("TrapFocus", this) }, initLayout: function () { var e = this.opts.ariaAttr, t = this.opts.elAttr; this.obj.attr(e.modal, "true"), this.obj.attr(t.role, "dialog") }, buildAria: function () { var E = this.opts.ariaAttr, S = this.opts.elAttr, e = 0 < this.opts.ariaNotHidden.length ? ", " + this.opts.ariaNotHidden.join(",") : ""; s.def(this, { aria: { notHidden: Array("head, script, noscript, link, style, meta" + e), focusType: ["A", "BUTTON", "INPUT", "SELECT", "TEXTAREA"], dataAttr: { ariaHidden: "trapfocusariahidden", ariaDisabled: "trapfocusariadisabled", tabIndex: "trapfocustabindex", role: "trapfocusrole" }, destroy: T.proxy(function () { for (var e, t, i, s = this.aria.dataAttr, a = this.aria.hiddenEls, n = this.aria.focusEls, r = this.aria.tabindexEls, o = 0, l = a.length; o < l; o++)e = o, i = t = void 0, e = a.eq(e), t = e.data(s.ariaHidden), i = e.data(s.role), t != C ? (e.attr(E.hidden, t), e.removeData(s.ariaHidden)) : e.removeAttr(E.hidden), i != C ? (e.attr(S.role, i), e.removeData(s.role)) : e.removeAttr(S.role); for (var d, h, c = 0, p = n.length; c < p; c++)d = c, h = void 0, d = n.eq(d), h = d.data(s.ariaDisabled), d.removeAttr(S.tabIndex), h != C ? (d.attr(E.disabled, h), d.removeData(s.ariaDisabled)) : d.removeAttr(E.disabled); for (var u, v, m = 0, g = r.length; m < g; m++)u = m, v = void 0, u = r.eq(u), (v = u.data(s.tabIndex)) != C ? (u.attr(S.tabIndex, v), u.removeData(s.tabIndex)) : u.removeAttr(S.tabIndex); var f = document.getElementById("teconsent"); f && (f = f.querySelector("a")) && "-1" === f.getAttribute("tabindex") && (f.setAttribute("tabindex", "0"), f.removeAttribute("aria-disabled")) }, this), build: T.proxy(function () { for (var e = this, t = this.aria.focusType, i = this.aria.dataAttr, s = this.obj.parents(), a = this.obj.siblings().not(e.aria.notHidden.join(",")), n = T(""), r = T(""), o = 0, l = s.length; o < l; o++) { d = void 0; var d = o; d = s.eq(d), a = a.add(d.siblings().not(e.aria.notHidden.join(","))) } n = n.add(a), r = r.add(a), this.obj.removeAttr(E.hidden); for (var h, c, p, u = 0, v = a.length; u < v; u++)h = u, p = c = void 0, h = a.eq(h), c = h.attr(E.hidden), p = h.attr(S.role), c != C && h.data(i.ariaHidden, c), p != C && h.data(i.role, p), h.attr(E.hidden, "true"), h.attr(S.role, "none presentation"); for (var m = 0, g = (n = n.add(a.find(t.join(",").toLowerCase()))).length; m < g; m++)(e => { var t = n.eq(e); (e = t.attr(E.disabled)) != C && t.data(i.ariaDisabled, e), t.attr(E.disabled, "true"), setTimeout(() => { t.attr(S.tabIndex, -1) }) })(m); for (var f, w, y = 0, b = (r = r.add(a.find("[" + S.tabIndex + "]"))).length; y < b; y++)f = y, w = void 0, f = r.eq(f), (w = f.attr(S.tabIndex)) != C && f.data(i.tabIndex, w), f.attr(S.tabIndex, -1); this.aria.hiddenEls = a, this.aria.focusEls = n, this.aria.tabindexEls = r }, this) } }) }, changeEvents: function (e) { var t, i = [], s = e.split(" "); for (t in s) i.push(s[t] + this.opts.customEvent); return i.join(" ") }, bindEvents: function (e) { e ? T(t).on(this.changeEvents("focusin"), T.proxy(this.trapFocus, this)) : T(t).off(this.changeEvents("focusin")) }, focusFirstDescendant: function (e) { for (var t = 0; t < e.childNodes.length; t++) { var i = e.childNodes[t]; if (this.attemptFocus(i) || this.focusFirstDescendant(i)) return !0 } return !1 }, focusLastDescendant: function (e) { for (var t = e.childNodes.length - 1; 0 <= t; t--) { var i = e.childNodes[t]; if (this.attemptFocus(i) || this.focusLastDescendant(i)) return !0 } return !1 }, isFocusable: function (e) { if (0 < e.tabIndex || 0 === e.tabIndex && null !== e.getAttribute("tabIndex")) return !0; if (e.disabled) return !1; switch (e.nodeName) { case "A": return !!e.href && "ignore" != e.rel; case "INPUT": return "hidden" != e.type && "file" != e.type; case "BUTTON": case "SELECT": case "TEXTAREA": case "VIDEO": case "SOURCE": case "IFRAME": return !0; default: return !1 } }, attemptFocus: function (e) { if (!this.opts.isDestroy) { if (!this.isFocusable(e)) return !1; this.opts.IgnoreUtilFocusChanges = !0; try { e.focus() } catch (e) { } return this.opts.IgnoreUtilFocusChanges = !1, document.activeElement === e } }, trapFocus: function (e) { this.opts.isDestroy || this.opts.IgnoreUtilFocusChanges || (document, this.dynamicComponentFocus()) }, loadComponent: function () { this.dynamicComponentFocus(), setTimeout(() => { this.dynamicComponentFocus() }, 3e3), this.focusFirstDescendant(this.obj[0]), this.lastFocus = document.activeElement, this.aria.build() }, dynamicComponentFocus: function () { let n = this.opts.ariaAttr, r = this.opts.elAttr; setTimeout(() => { var e, t = document.getElementById("QSIFeedbackButton-btn"), i = (document.getElementById("QSIFeedbackButton-close-btn"), document.getElementById("nebula_div_btn")), s = document.getElementById("spr-live-chat-app"), a = document.getElementById("teconsent"); t && (e = t.parentElement, t.setAttribute(n.disabled, "true"), t.setAttribute(r.tabIndex, "-1"), e.setAttribute(n.disabled, "true"), e.setAttribute(n.hidden, "true"), e.setAttribute(r.tabIndex, "-1"), e.setAttribute(r.role, "none presentation")), i && (t = i.parentElement, i.setAttribute(n.disabled, "true"), i.setAttribute(r.tabIndex, "0"), t.setAttribute(n.disabled, "true"), t.setAttribute(n.hidden, "true"), t.setAttribute(r.tabIndex, "-1"), t.setAttribute(r.role, "none presentation")), s && (s.setAttribute(n.disabled, "true"), s.setAttribute(n.hidden, "true"), s.setAttribute(r.tabIndex, "-1"), s.setAttribute(r.role, "none presentation")), a && a.hasAttribute("aria-label") && setTimeout(() => { var e = a.querySelector("a"); e.setAttribute(r.tabIndex, "-1"), e.setAttribute(n.disabled, "true"), e.setAttribute(n.hidden, "true") }) }) }, destroy: function () { i = null, this.opts.isDestroy = !0; var e = this.opts.ariaAttr; this.opts.elAttr; this.bindEvents(!1), this.aria.destroy(), this.obj.removeAttr(e.modal) } }, a })() })(window), (e => { e.HiveLayer = (() => { var a = window, n = a.jQuery, t = a.document, r = a.RING.UTILS, o = []; function i(e, t) { if (!(this instanceof i)) return new i(e, t); e = { effect: "fade", layerWrapElements: e, layerBody: ".cm-layer__body", layerElements: ".cm-layer__wrapper", openerElements: ".js-layer-opener", closerElements: ".js-layer-closer", dimmedElements: ".cm-layer__dimmed", classAttr: { htmlToggle: "is-layer-open", isAsync: "is-async" }, focusOutObj: { CSS: { overflow: "hidden", position: "absolute", left: 0, top: 0, "z-index": -1, width: 1, height: 1, "font-size": "1px", "line-height": 0 } }, customEvent: ".HiveLayer" + (new Date).getTime() + Math.random(), openerTarget: null, useOutside: !1, useEscape: !0, useCloseFocus: !0, useScrollLock: !0, useTrapFocus: !0, flip: { CLASS: "hive-layer-flip", direction: "horizontal", rotateStart: 90, rotateEnd: 0 }, customToggle: !1, dimmedDuration: 250, fps: 120, easing: "swing", duration: 250, on: { buildTools: null, layerMove: null, layerOpenBefore: null, layerOpenAfter: null, layerCloseBefore: null, layerCloseAfter: null }, ariaNotHidden: [] }; (this.layerWrap = e.layerWrapElements).length && (this.layerWrap = n(e.layerWrapElements), this.opts = r.def(e, t || {}), this.init()) } return i.prototype = { init: function () { this.initOpts(), this.setElements(), this.initLayout(), this.buildTween(), this.buildTrapFocus(), this.bindEvents(!0), this.layerWrap.data("HiveLayer", this) }, initOpts: function () { this.layerWrapInstance = "#" + this.layerWrap.attr("id"), this.opts.isSupportTransition || "flip" !== this.opts.effect || (this.opts.effect = "default"), "custom" == this.opts.effect && (this.opts.effect = "default", this.opts.customToggle = !0) }, setElements: function () { this.layerBody = this.layerWrap.find(this.opts.layerBody), this.layerObj = this.layerWrap.find(this.opts.layerElements), this.closerObj = this.layerWrap.find(this.opts.closerElements), this.dimmedObj = this.layerWrap.find(this.opts.dimmedElements) }, initLayout: function () { var e; "slide" === this.opts.effect ? (this.dimmedObj.hide(), this.layerObj.hide()) : "flip" === this.opts.effect && (e = this.opts.flip.direction, this.opts.flip.cssD = "vertical" !== e ? "rotateY" : "rotateX", this.dimmedObj.hide(), this.layerObj.hide(), this.layerWrap.addClass(this.opts.flip.CLASS)) }, buildTween: function () { r.def(this, { tweens: { instance: [], kill: n.proxy(function () { for (var e = 0, t = this.tweens.instance.length; e < t; e++)this.tweens.instance[e].kill(); this.tweens.instance = [] }, this) } }) }, buildTrapFocus: function () { this.opts.useTrapFocus && r.def(this, { trapfocus: { instance: null, destroy: n.proxy(function () { null != this.trapfocus.instance && (this.trapfocus.instance.destroy(), this.trapfocus.instance = null) }, this), build: n.proxy(function () { null === this.trapfocus.instance && (this.trapfocus.instance = new TrapFocus(this.layerObj, { ariaNotHidden: this.opts.ariaNotHidden })) }, this) } }) }, bindEvents: function (e) { e ? (n(t).on("click clickCustom", this.opts.openerElements + '[data-layer-target="' + this.layerWrapInstance + '"]', n.proxy(this.onLayerOpen, this)), this.layerWrap.on("openLayer", n.proxy(this.onLayerOpen, this)), this.closerObj.on("mousedown click clickCustom", n.proxy(this.onLayerClose, this)), this.layerWrap.on("layerSetOptions", n.proxy(this.setOptions, this)), this.opts.useEscape && this.layerObj.on("keydown", n.proxy(this.onEscapeClose, this))) : (n(t).off("click clickCustom"), this.layerWrap.off("openLayer"), this.closerObj.off("mousedown click clickCustom"), this.layerWrap.off("layerSetOptions"), this.opts.useEscape && this.layerObj.off("keydown")) }, bindOutsideEvents: function (e) { this.opts.useOutside && (e ? this.layerObj.on("clickoutside touchendoutside", n.proxy(this.onLayerOutsideFunc, this)) : this.layerObj.off("clickoutside touchendoutside")) }, bindCloseEvents: function (e) { e ? this.layerWrap.on("closeLayer", n.proxy(this.closeLayer, this)) : this.layerWrap.off("closeLayer") }, setOptions: function (e, t) { r.def(this.opts, t || {}), t.customToggle && (this.opts.effect = "default") }, setScrollLock: function (e) { this.opts.useScrollLock && (e ? r.page.scrollLock.on() : r.page.scrollLock.off(), n("html").toggleClass(this.opts.classAttr.htmlToggle, e)) }, onLayerOpen: function (e) { var t, i, s; e.preventDefault(), setTimeout(() => { this.dimmedObj.on("mousedown click clickCustom", n.proxy(this.onLayerClose, this)) }, 500), "click" !== e.type && "clickCustom" !== e.type || (this.opts.openerTarget = n(e.currentTarget)), "click" === e.type && this.opts.openerTarget.hasClass(this.opts.classAttr.isAsync) || (this.layerViewType = "open", o.push({ POPUPWRAP: this.layerWrap }), document.querySelector("html.load div#header") && (document.querySelector("html.load div#header").style.opacity = 0, document.querySelector("html.load div#header").style.pointerEvents = "none"), this.setScrollLock(!0), this.bindCloseEvents(!0), "default" === this.opts.effect ? this.opts.customToggle ? this.outCallback("layerOpenBefore") : (this.layerWrap.css({ opacity: 0, display: "block" }), this.outCallback("layerOpenBefore"), this.outCallback("buildTools"), this.layerWrap.css("opacity", ""), this.openAfterBugFunc()) : "fade" === this.opts.effect ? (this.layerWrap.css({ opacity: 0, display: "block" }), this.outCallback("layerOpenBefore"), TweenLite.set(this.layerBody, { opacity: 0, scale: 1, overflow: "hidden" }), this.outCallback("buildTools"), t = TweenLite.to(this.layerWrap, this.opts.duration / 1e3, { opacity: 1, onComplete: n.proxy(function () { var e = TweenLite.to(this.layerBody, .25, { ease: Expo.easeOut, opacity: 1, scale: 1, onComplete: n.proxy(function () { this.layerBody.css({ overflow: "", transform: "" }), this.openAfterBugFunc() }, this) }); this.tweens.instance.push(e) }, this) }), this.tweens.instance.push(t)) : "slide" === this.opts.effect ? (s = 1, TweenLite.set(this.dimmedObj, { display: "block", opacity: 0 }), TweenLite.set(this.layerWrap, { display: "block" }), TweenLite.set(this.layerBody, { overflow: "hidden" }), TweenLite.set(this.layerObj, { display: "", y: -r.winSize().h }), TweenLite.set(this.layerObj, { display: "" }), this.outCallback("layerOpenBefore"), t = TweenLite.to(this.dimmedObj, s, { opacity: .9 }), i = TweenLite.to(this.layerObj, s, { y: 0, onComplete: n.proxy(function () { this.outCallback("buildTools"), this.layerBody.css({ overflow: "" }), this.layerObj.css({ transform: "" }), this.openAfterBugFunc() }, this) }), this.tweens.instance.push(t), this.tweens.instance.push(i)) : "slide2" === this.opts.effect ? (s = .6, TweenLite.set(this.dimmedObj, { display: "block", opacity: 0 }), TweenLite.set(this.layerWrap, { display: "block" }), TweenLite.set(this.layerObj, { display: "", y: r.winSize().h }), TweenLite.set(this.layerObj, { display: "" }), this.outCallback("layerOpenBefore"), t = TweenLite.to(this.dimmedObj, s, { opacity: .9 }), i = TweenLite.to(this.layerObj, s, { y: 0, onComplete: n.proxy(function () { this.outCallback("buildTools"), this.layerBody.css({ overflow: "" }), this.layerObj.css({ transform: "" }), this.openAfterBugFunc() }, this) }), this.tweens.instance.push(t), this.tweens.instance.push(i)) : "flip" === this.opts.effect && (s = (e = this.opts.flip.rotateEnd - this.opts.flip.rotateStart) / this.opts.duration * (1e3 / this.opts.fps), this.opts.flip.moveData = { startDistance: this.opts.flip.rotateStart, endDistance: this.opts.flip.rotateEnd, moveDistance: e, moveOneStep: s, currentStep: 0 }, this.layerWrap.show(), this.dimmedObj.fadeIn(this.opts.dimmedDuration, n.proxy(function () { this.outCallback("layerOpenBefore"), this.outCallback("buildTools"), this.layerObj.show(), this.initStep(this.opts.flip.moveData), this.flipFunc() }, this)), a.setTimeout(n.proxy(function () { this.outCallback("buildTools") }, this), 30))) }, initStep: function (e) { this.opts.stepTimeOld = new Date, this.direction = e.startDistance > e.moveDistance ? "toNext" : "toPrev", this.condition = "toNext" === this.direction ? e.currentStep > e.moveDistance : e.currentStep < e.moveDistance }, moveStep: function (e) { this.opts.stepTimeNew = new Date, this.opts.remaining = Math.max(0, this.opts.stepTimeOld - this.opts.stepTimeNew + this.opts.duration); var t = 1 - (this.opts.remaining / this.opts.duration || 0), t = n.easing[this.opts.easing](t, this.opts.duration * t, 0, 1, this.opts.duration); e.currentStep = (e.endDistance - e.startDistance) * t }, flipFunc: function () { var e = this.opts.flip.moveData, e = (this.moveStep(e), this.condition ? (a.clearTimeout(this.stepTimeout), this.stepTimeout = a.setTimeout(n.proxy(function () { this.flipFunc() }, this), 1e3 / this.opts.fps), this.condition = "toNext" === this.direction ? e.currentStep > e.moveDistance : e.currentStep < e.moveDistance, this.outCallback("layerMove", e.currentStep, e)) : (this.opts.remaining = this.opts.duration, "close" !== this.layerViewType && this.layerViewType ? this.openAfterBugFunc() : (this.closeAfterBugFunc(), this.dimmedObj.fadeOut(this.opts.dimmedDuration, n.proxy(function () { this.layerWrap.hide(), this.layerObj.hide() }, this)))), e.startDistance + e.currentStep); this.layerObj.css({ transform: this.opts.flip.cssD + "(" + e + "deg)" }) }, onLayerOpenAfter: function () { this.trapfocus && this.trapfocus.build(), this.bindOutsideEvents(!0), this.outCallback("layerOpenAfter") }, openAfterBugFunc: function () { a.clearTimeout(this.openAfterTimeout), this.openAfterTimeout = a.setTimeout(n.proxy(this.onLayerOpenAfter, this), 30) }, onLayerClose: function (e) { var t = n(e.currentTarget); "mousedown" === e.type ? r.isDevice || (e.stopPropagation(), this.opts.useCloseFocus = !1) : "click" !== e.type && "clickCustom" !== e.type || (e.preventDefault(), "click" === e.type && t.hasClass(this.opts.classAttr.isAsync)) || (this.layerWrap.trigger("closeLayer"), this.dimmedObj.off("mousedown click clickCustom")) }, closeLayer: function () { this.closeType = arguments[1], this.layerViewType = "close", this.outCallback("layerCloseBefore"), this.popupOpenPropsControl(), this.setScrollLock(!1), this.trapfocus && this.trapfocus.destroy(), document.querySelector("html.load div#header") && (document.querySelector("html.load div#header").style.opacity = 1, document.querySelector("html.load div#header").style.pointerEvents = "unset"), a.clearTimeout(this.closeBeforeTimeout), this.closeBeforeTimeout = a.setTimeout(n.proxy(this.closeBeforeBugFunc, this), 30), this.bindOutsideEvents(!1) }, onEscapeClose: function (e) { 27 === (e.which || e.keyCode) && this.layerWrap.trigger("closeLayer") }, onLayerOutsideFunc: function () { this.layerWrap.trigger("closeLayer") }, closeBeforeBugFunc: function () { var e, t, i; "default" === this.opts.effect ? (this.opts.customToggle || this.layerWrap.stop(!0, !0).hide(), this.closeAfterBugFunc()) : "fade" === this.opts.effect ? (i = TweenLite.to(this.layerBody, this.opts.duration / 1e3, { overflow: "hidden", opacity: 0, scale: 1, onComplete: n.proxy(function () { this.layerBody.css("overflow", ""); var e = TweenLite.to(this.layerWrap, this.opts.duration / 1e3, { opacity: 0, display: "none", onComplete: n.proxy(this.closeAfterBugFunc, this) }); this.tweens.instance.push(e) }, this) }), this.tweens.instance.push(i)) : "slide" === this.opts.effect ? (t = 1, TweenLite.set(this.layerBody, { overflow: "hidden" }), i = TweenLite.to(this.dimmedObj, t, { opacity: 0 }), e = TweenLite.to(this.layerObj, t, { y: -r.winSize().h, onComplete: n.proxy(function () { this.closeAfterBugFunc(), this.dimmedObj.hide(), this.layerWrap.hide(), this.layerBody.css("overflow", ""), this.layerObj.hide() }, this) }), this.tweens.instance.push(i), this.tweens.instance.push(e)) : "slide2" === this.opts.effect ? (t = .5, i = TweenLite.to(this.dimmedObj, t, { opacity: 0 }), e = TweenLite.to(this.layerObj, t, { y: r.winSize().h, onComplete: n.proxy(function () { this.closeAfterBugFunc(), this.dimmedObj.hide(), this.layerWrap.hide(), this.layerBody.css("overflow", ""), this.layerObj.hide() }, this) }), this.tweens.instance.push(i), this.tweens.instance.push(e)) : "flip" === this.opts.effect && (i = (t = -this.opts.flip.rotateStart - this.opts.flip.rotateEnd) / this.opts.duration * (1e3 / this.opts.fps), this.opts.flip.moveData = { startDistance: this.opts.flip.rotateEnd, endDistance: -this.opts.flip.rotateStart, moveDistance: t, moveOneStep: i, currentStep: 0 }, this.initStep(this.opts.flip.moveData), this.flipFunc()) }, closeAfterBugFunc: function () { a.clearTimeout(this.closeAfterTimeout), this.closeAfterTimeout = a.setTimeout(n.proxy(this.onLayerCloseAfter, this), 30) }, popupOpenPropsControl: function () { for (var e = o, t = 0, i = e.length; t < i; t++)e[t].POPUPWRAP[0] === this.layerWrap[0] && (e[t] = null); for (var s = e.length; 0 < s; s--)null === e[s - 1] && e.splice(s - 1, 1) }, onLayerCloseAfter: function () { null !== this.opts.openerTarget && (!1 !== this.closeType && this.opts.openerTarget.focus(), this.opts.openerTarget = null), this.opts.useCloseFocus = !0, this.bindCloseEvents(!1), this.outCallback("layerCloseAfter") }, outCallback: function (e) { var t = this.opts.on[e]; "layerMove" === e ? this.layerWrap.trigger(e, arguments[1], arguments[2], this) : this.layerWrap.trigger(e, this), null != t && ("layerMove" === e ? t(arguments[1], arguments[2], this) : t(this)) }, styleDestroy: function () { this.dimmedObj.attr("style", ""), this.layerWrap.attr("style", ""), this.layerBody.attr("style", ""), this.layerObj.attr("style", "") }, destroy: function () { this.tweens.kill(), this.trapfocus && this.trapfocus.destroy(), this.styleDestroy(), this.bindEvents(!1), this.bindOutsideEvents(!1), this.bindCloseEvents(!1) } }, i })() })(window), (() => { window.RING = window.RING || {}; let n = RING.UTILS; RING.SubNav = class { constructor(e = container, t) { var i = { navItems: "ul li>a", navDests: '[class*="js-nav-"]', visSections: ".js-visible", resizeStart: null, classes: { isOn: "on" } }; this.opts = i, this.classes = i.classes, this.el = document.querySelector(e), this.init() } init() { null !== this.el && (this.setElements(), this.initOpts(), this.bindEvents()) } setElements() { this.navItems = n.convertArray(this.el.querySelectorAll(this.opts.navItems)), this.navDests = document.querySelectorAll(this.opts.navDests), this.visSections = n.convertArray(document.querySelectorAll(this.opts.visSections)) } initOpts() { this.visCount = -1, this.visSections.forEach(e => { e.dataset.visIndex = e.classList.contains("js-count") ? ++this.visCount : this.visCount }), this.winOffsetTop = window.pageYOffset } bindEvents() { this.onScrollHandler(), window.addEventListener("resize", this.onResizeHandler.bind(this)), window.addEventListener("scroll", this.onScrollHandler.bind(this)); let i = window.location.hash; this.navItems.forEach((e, t) => { -1 < e.getAttribute("href").indexOf("#") && (e.dataset.navIndex = t, e.addEventListener("click", this.onNavItemClickEvent.bind(this))), i && -1 < e.getAttribute("href").indexOf(i) && (e.parentNode.classList.remove(this.classes.isOn), e.click()) }) } onNavItemClickEvent(t) { t.preventDefault(); var t = t.target, i = t.parentNode; if (!this.el.classList.contains("hold") && !i.classList.contains(this.classes.isOn)) { this.navItems.forEach(e => { e.parentNode.classList.remove(this.classes.isOn) }), i.classList.contains(this.classes.isOn) || i.classList.add(this.classes.isOn); var i = t.dataset.navIndex, t = this.navDests[i], i = t.getBoundingClientRect(), s = parseInt(window.getComputedStyle(t).paddingTop), a = (window.innerHeight - (i.height - s) + n.getNavHeight()) / 2; let e = 0; (e = t.classList.contains("js-nav-center") ? this.winOffsetTop + i.top + s - a : this.winOffsetTop + i.top - n.getNavHeight()) < 150 && (e = 0), this.el.classList.add("hold"), GALAXY.setSmoothScrollTop(e, 1500, () => { this.el.classList.contains("hold") && this.el.classList.remove("hold"), GALAXY.header && GALAXY.header.resetSubNav() }) } } onScrollHandler() { this.winOffsetTop = window.pageYOffset; var a = (window.innerHeight + n.getNavHeight()) / 2; this.visSections.forEach(e => { var i, t = e.getBoundingClientRect(), s = this.winOffsetTop + t.top, t = this.winOffsetTop + t.bottom; this.winOffsetTop + a >= s && this.winOffsetTop + a <= t && (i = e.dataset.visIndex, this.navItems.forEach((e, t) => { t != i && e.parentNode.classList.contains(this.classes.isOn) && e.parentNode.classList.remove(this.classes.isOn) }), (s = this.navItems[i].parentNode).classList.contains(this.classes.isOn) || (s.classList.add(this.classes.isOn), !this.el.classList.contains("hold") && s.classList.contains(this.classes.isOn) && GALAXY.header && GALAXY.header.resetSubNav())) }) } onResizeHandler() { n.winSize().w !== this.winWidth && (this.winWidth = n.winSize().w, null == this.opts.resizeStart && (this.opts.resizeStart = this.winWidth, this.resizeAnimateFunc()), window.clearTimeout(this.resizeEndTime), this.resizeEndTime = window.setTimeout(this.resizeEndFunc.bind(this), 150)) } resizeAnimateFunc() { this.onScrollHandler(), this.resizeRequestFrame = n.requestAFrame.call(window, this.resizeAnimateFunc.bind(this)) } resizeEndFunc() { this.opts.resizeStart = null, n.cancelAFrame.call(window, this.resizeRequestFrame) } } })(), (() => {
window.RING = window.RING || {}, RING.CardCarousel = class {
constructor(e, t = {}) { this.swiper = null, this.opts = { pagination: { tagging: { "data-omni-type": "microsite_pcontentinter", "data-omni": "galaxy-ring:carousel:index:", "ga-ca": "indication", "ga-ac": "carousel", "ga-la": "galaxy-ring:carousel:index:" } }, resizeTimeout: null, currentDevice: null, prevDevice: null, currentIndex: 0, clickTimeout: null, centeredSlides: !1, useNavigation: !1, ...t }, this.selector = { section: e, swiper: ".common__carousel", swiperSlide: ".swiper-slide", swiperTitle: ".common__blind-carousel", swiperPagination: ".swiper-pagination", swiperNavigation: ".swiper-arrow-wrap", prevArrow: ".swiper-button-prev", nextArrow: ".swiper-button-next" }, this.class = { featureHide: "is-feature-hide" }, this.el = { section: document.querySelector(this.selector.section) || null, swiper: null, swiperSlide: null, swiperTitle: null, swiperPagination: null, swiperNavigation: null, prevArrow: null, nextArrow: null }, this.events = { load: this.onLoadHandler.bind(this), resize: this.onResizeHandler.bind(this), prevArrow: this.onClickPrevArrow.bind(this), nextArrow: this.onClickNextArrow.bind(this) }, this.init() } init() { null === this.el.section || this.el.section.classList.contains(this.class.featureHide) || (this.setElements(), this.bindEvents()) } setElements() { this.el.swiper = this.el.section.querySelector(this.selector.swiper), this.el.swiperSlides = this.el.section.querySelectorAll(this.selector.swiperSlide), this.el.swiperPagination = this.el.section.querySelector(this.selector.swiperPagination), this.el.swiperTitle = this.el.section.querySelector(this.selector.swiperTitle) } bindEvents() { window.addEventListener("load", this.events.load), window.addEventListener("resize", this.events.resize) } onLoadHandler() { this.events.resize(), window.removeEventListener("load", this.events.load) } onResizeHandler() { this.opts.currentDevice = 767 < innerWidth ? "desktop" : "mobile", this.opts.currentDevice !== this.opts.prevDevice && (this.onResponsiveChange(), this.opts.prevDevice = this.opts.currentDevice) } onResponsiveChange() { this.destroySwiper(), "mobile" === this.opts.currentDevice && this.setSwiper() } updateA11ySwiper() { null !== this.swiper && (Array.from(this.swiper.slides).forEach(e => { e.setAttribute("aria-hidden", !0) }), "mobile" === this.opts.currentDevice) && this.swiper.slides[this.opts.currentIndex].setAttribute("aria-hidden", !1) } destroyA11ySwiper() { "desktop" === this.opts.currentDevice && Array.from(this.el.swiperSlides).forEach(e => { e.removeAttribute("aria-hidden") }) } onTransitionStart() { this.opts.currentIndex = this.swiper.snapIndex, this.updateA11ySwiper() } onInitSwiper() { this.opts.currentIndex = 0, this.onTransitionStart(), this.updateA11ySwiper(), this.setPaginationLabel(); var e = this.swiper.pagination.bullets; let i = this; void 0 !== e && 0 < e.length && Array.from(e).forEach((e, t) => { e.addEventListener("click", function (e) { e.preventDefault(), e.stopImmediatePropagation(), i.swiper.slideTo(t) }) }), void 0 !== this.opts.on && 0 < (e = this.el.section.querySelectorAll("img.js-res-img:not(.load-complete)")).length && this.opts.on.updateImageLoader(e) } onSlideChange() { this.setPaginationLabel(), this.opts.useNavigation && (this.setNavigation(), this.setNavigationClass()) } destroySwiper() { null !== this.swiper && (this.destroyA11ySwiper(), this.swiper.destroy(!0, !0), this.swiper = null) } setSwiper() {
if (null === this.swiper) {
let i = this; var e = {
init: !1, a11y: !1, slidesPerView: "auto", centeredSlides: this.opts.centeredSlides, pagination: {
el: i.el.swiperPagination, renderBullet: function (e) {
var t = i.opts.pagination.tagging; return `
Now you get innovative smartphone with right tariff plan.
Upfront Cost
Der Anschlusspreis und monatlicher Tarifpreis werden vom jeweiligen Netzanbieter eingezogen. Du zahlst jetzt nur den einmaligen Gerätepreis.
Check the availabbility
1 of 3
Wrong address
Unfortunately, we cannot make you a DSL offer for the address you have checked.The address you have given is not unique, please choose from the address suggestions.
Empfohlene Adresse
Please provide a valid postcode
Please enter correct information again.
Please provide a valid street
Please enter correct information again.
Please provide a valid house number
Please enter correct information again.
Additional information placeholder
Please enter correct information again.
Please provide a valid city
Please enter correct information again.
*Required fields
Informationen zur Verarbeitung Deiner personenbezogenen Daten findest Du in unserer Datenschutzerklärung.
Pay monthly phone contracts
Buy your phone along with an inclusive monthly network plan and pay monthly*
Choose your network
Choose from a range of networks and inclusive monthly plans to get started with your new Galaxy phone straight away.
Pagar mensualmente
Pay for your phone and an inclusive bundle of calls, texts and data in one easy-to-manage monthly fee.
Pasos siguientes
You will be redirected to our trusted partner, A1 Comms Ltd (trading as Mobileshop), to purchase your phone and setup your monthly plan.
El precio del valor de la bonificación mostrado al momento de aplicar a Galaxy Canje, será el valor máximo a otorgar según el grado de su Dispositivo Electrónico Participante. En caso de que el valor del bono de su dispositivo electrónico sea mayor al precio de compra del Equipo Nuevo, Samsung solo bonificará el valor del precio de compra del Equipo Nuevo. El bono del Dispositivo Electrónico Participante es tentativo y podrá cambiar al momento de su revisión por parte de nuestros técnicos especialistas.
Selecciona tu modelo
El precio del valor de la bonificación mostrado al momento de aplicar a Galaxy Canje, será el valor máximo a otorgar según el grado de su Dispositivo Electrónico Participante. En caso de que el valor del bono de su dispositivo electrónico sea mayor al precio de compra del Equipo Nuevo, Samsung solo bonificará el valor del precio de compra del Equipo Nuevo. El bono del Dispositivo Electrónico Participante es tentativo y podrá cambiar al momento de su revisión por parte de nuestros técnicos especialistas.
¡Casi listo! Por favor ingresa tu número de IMEI/Número de Serie
Bonificación Galaxy Canje(Upfront discount)
Encuentra tu número de IMEI/Número de Serie
*#06#
Opción 1Marca *#06# para encontrar tu IMEI/Número de serie
Opción 2Ve a ajustes > Acerca del telefono > IMEI/Numero de Serie
Ingresa tu numero de IMEI/Numero de Serie
Incorrecto
Corregir
El precio del valor de la bonificación mostrado al momento de aplicar a Galaxy Canje, será el valor máximo a otorgar según el grado de su Dispositivo Electrónico Participante. En caso de que el valor del bono de su dispositivo electrónico sea mayor al precio de compra del Equipo Nuevo, Samsung solo bonificará el valor del precio de compra del Equipo Nuevo. El bono del Dispositivo Electrónico Participante es tentativo y podrá cambiar al momento de su revisión por parte de nuestros técnicos especialistas.
Último paso, ¿Está tu producto en buenas condiciones?
Not eligible for trade-in
El precio del valor de la bonificación mostrado al momento de aplicar a Galaxy Canje, será el valor máximo a otorgar según el grado de su Dispositivo Electrónico Participante. En caso de que el valor del bono de su dispositivo electrónico sea mayor al precio de compra del Equipo Nuevo, Samsung solo bonificará el valor del precio de compra del Equipo Nuevo. El bono del Dispositivo Electrónico Participante es tentativo y podrá cambiar al momento de su revisión por parte de nuestros técnicos especialistas.
¡Bien! Todo listo. Revisa el valor final para terminar
Bonificación Galaxy Canje
** El valor de la bonificación podrá variar de acuerdo a la revisión técnica de tu dispositivo actual por parte de nuestros especialistas
El producto enciente y carga correctamente
Pantalla funcional y en buen estado.
Producto reiniciado de fabrica y desbloqueo de Software
Confirmo términos y condiciones
El precio del valor de la bonificación mostrado al momento de aplicar a Galaxy Canje, será el valor máximo a otorgar según el grado de su Dispositivo Electrónico Participante. En caso de que el valor del bono de su dispositivo electrónico sea mayor al precio de compra del Equipo Nuevo, Samsung solo bonificará el valor del precio de compra del Equipo Nuevo. El bono del Dispositivo Electrónico Participante es tentativo y podrá cambiar al momento de su revisión por parte de nuestros técnicos especialistas.
Upgrade Terms and Conditions
El producto enciente y carga correctamente
Normal wear & Tear
Pantalla funcional y en buen estado.
Not blacklisted
Producto reiniciado de fabrica y desbloqueo de Software
Samsung Upgrade
Get the latest TV every 3 years. Purchase a new qualifying TV through the Upgrade Program and sell the old TV back to us for a guaranteed residual value. {1}
Fixed monthly fee
Upgrade after 3 years and let us purchase the old TV back from you to a guaranteed resisdual value
Pick renewal period
How long would you like before deciding whether to renew or upgrade your product?
For a purchase price of 23,000 kr and 44 installments of 557 kr over 44 months, the fixed effective interest rate is 13.9%. The total amount to be paid is 24,508 kr.
Borrowing costs money!
If you cannot repay the debt on time, you risk a payment default. This may lead to difficulties in renting housing, signing contracts, and obtaining new loans. For support, contact budget and debt counseling in your municipality. Contact details are available at konsumentverket.se.
Términos y condiciones
Campo requerido
Return & Cancel
Garantía
Samsung Care+
Samsung Care+ Disclaimer with link
Here’s what’s covered
Hardware repairs
Get fast, convenient repairs using genuine Samsung parts, from our authorized technicians.
Software coverage
If your device isn’t running smoothly, we’ll check and fix the issue.
Battery replacement
Stay powered up with hassle-free battery replacements.
4 claims within
Make up to 4 claims for repair or replacement within 2 years, and save with a low deductible per claim.