{"version":3,"file":"indexCombined-99acc2ec.js","sources":["Core/indexCombined-99acc2ec.js"],"sourcesContent":["function Resources() {\r\n\treturn {\r\n\t\tCommon: {\r\n\t\t\t\"begin\": {\r\n\t\t\t\ten: \"Begin\",\r\n\t\t\t\tit: \"Inizio\",\r\n\t\t\t\tes: \"Inicio\",\r\n\t\t\t\tfr: \"Début\",\r\n\t\t\t},\r\n\t\t\t\"hour\": {\r\n\t\t\t\ten: \"Hour\",\r\n\t\t\t\tit: \"Ora\",\r\n\t\t\t\tes: \"Hora\",\r\n\t\t\t\tfr: \"Heure\",\r\n\t\t\t},\r\n\t\t\t\"tags\": { \r\n\t\t\t\t\"en\": \"Tags\",\r\n\t\t\t\t\"it\": \"Tags\",\r\n\t\t\t\t\"es\": \"Tags\",\r\n\t\t\t\t\"fr\": \"Tags\"\r\n\t\t\t},\r\n\t\t\t\"video-upload-suggestion\": {\r\n\t\t\t\t\"en\": \"We suggest uploading videos in 16:9 format, without audio, and shorter than 30 seconds. The video should show: Opening - 2/3 repetitions - Closing. Supported formats: webm, mp4, quicktime, wmv, matroska\",\r\n\t\t\t\t\"it\": \"Suggeriamo di caricare video in formato 16:9, senza audio e con una durata inferiore ai 30 secondi. Il video deve mostrare: Apertura - 2/3 ripetizioni - Chiusura. Formati supportati: webm, mp4, quicktime, wmv, matroska\",\r\n\t\t\t\t\"es\": \"Sugerimos cargar videos en formato 16:9, sin audio y con una duración inferior a 30 segundos. El video debe mostrar: Apertura - 2/3 repeticiones - Cierre. Formatos compatibles: webm, mp4, quicktime, wmv, matroska\",\r\n\t\t\t\t\"fr\": \"Nous suggérons de télécharger des vidéos au format 16:9, sans audio et de moins de 30 secondes. La vidéo doit montrer : Ouverture - 2/3 répétitions - Fermeture. Formats pris en charge : webm, mp4, quicktime, wmv, matroska\"\r\n\t\t\t},\r\n\t\t\t\"1010\": { \r\n\t\t\t\t\"en\": \"Input Error\",\r\n\t\t\t\t\"it\": \"Errore di Input\",\r\n\t\t\t\t\"es\": \"Error de Entrada\",\r\n\t\t\t\t\"fr\": \"Erreur d'Entrée\"\r\n\t\t\t},\r\n\t\t\t\"1020\": { \r\n\t\t\t\t\"en\": \"Video Error\",\r\n\t\t\t\t\"it\": \"Errore Video\",\r\n\t\t\t\t\"es\": \"Error de Video\",\r\n\t\t\t\t\"fr\": \"Erreur Vidéo\"\r\n\t\t\t},\r\n\t\t\t\"1021\": { \r\n\t\t\t\t\"en\": \"Audio Error\",\r\n\t\t\t\t\"it\": \"Errore Audio\",\r\n\t\t\t\t\"es\": \"Error de Audio\",\r\n\t\t\t\t\"fr\": \"Erreur Audio\"\r\n\t\t\t},\r\n\t\t\t\"1030\": { \r\n\t\t\t\t\"en\": \"Unsupported Codec\",\r\n\t\t\t\t\"it\": \"Codec Non Supportato\",\r\n\t\t\t\t\"es\": \"Codec No Soportado\",\r\n\t\t\t\t\"fr\": \"Codec Non Pris en Charge\"\r\n\t\t\t},\r\n\t\t\t\"1040\": { \r\n\t\t\t\t\"en\": \"Settings Error\",\r\n\t\t\t\t\"it\": \"Errore di Impostazioni\",\r\n\t\t\t\t\"es\": \"Error de Configuración\",\r\n\t\t\t\t\"fr\": \"Erreur de Paramètres\"\r\n\t\t\t},\r\n\t\t\t\"1041\": { \r\n\t\t\t\t\"en\": \"Acceleration Settings Error\",\r\n\t\t\t\t\"it\": \"Errore Impostazioni di Accelerazione\",\r\n\t\t\t\t\"es\": \"Error de Configuración de Aceleración\",\r\n\t\t\t\t\"fr\": \"Erreur Paramètres d'Accélération\"\r\n\t\t\t},\r\n\t\t\t\"1042\": { \r\n\t\t\t\t\"en\": \"Job Doesn't Require Enough Processing Power for Accelerated Transcoding\",\r\n\t\t\t\t\"it\": \"Il Lavoro Non Richiede Abbastanza Potenza di Elaborazione per la Transcodifica Accelerata\",\r\n\t\t\t\t\"es\": \"El Trabajo No Requiere Suficiente Potencia de Procesamiento para la Transcodificación Acelerada\",\r\n\t\t\t\t\"fr\": \"Le Travail Ne Nécessite Pas Assez de Puissance de Traitement pour le Transcodage Accéléré\"\r\n\t\t\t},\r\n\t\t\t\"1056\": { \r\n\t\t\t\t\"en\": \"File Open Error\",\r\n\t\t\t\t\"it\": \"Errore di Apertura File\",\r\n\t\t\t\t\"es\": \"Error de Apertura de Archivo\",\r\n\t\t\t\t\"fr\": \"Erreur d'Ouverture de Fichier\"\r\n\t\t\t},\r\n\t\t\t\"1060\": { \r\n\t\t\t\t\"en\": \"Clipping Error\",\r\n\t\t\t\t\"it\": \"Errore di Clipping\",\r\n\t\t\t\t\"es\": \"Error de Recorte\",\r\n\t\t\t\t\"fr\": \"Erreur de Découpage\"\r\n\t\t\t},\r\n\t\t\t\"1075\": { \r\n\t\t\t\t\"en\": \"Demuxer Parse Error\",\r\n\t\t\t\t\"it\": \"Errore di Parsing del Demuxer\",\r\n\t\t\t\t\"es\": \"Error de Análisis del Demuxer\",\r\n\t\t\t\t\"fr\": \"Erreur de Parsing du Démultiplexeur\"\r\n\t\t\t},\r\n\t\t\t\"1076\": { \r\n\t\t\t\t\"en\": \"Source Read Error\",\r\n\t\t\t\t\"it\": \"Errore di Lettura della Sorgente\",\r\n\t\t\t\t\"es\": \"Error de Lectura de Fuente\",\r\n\t\t\t\t\"fr\": \"Erreur de Lecture de Source\"\r\n\t\t\t},\r\n\t\t\t\"1080\": { \r\n\t\t\t\t\"en\": \"MXF Output Error\",\r\n\t\t\t\t\"it\": \"Errore di Output MXF\",\r\n\t\t\t\t\"es\": \"Error de Salida MXF\",\r\n\t\t\t\t\"fr\": \"Erreur de Sortie MXF\"\r\n\t\t\t},\r\n\t\t\t\"1091\": { \r\n\t\t\t\t\"en\": \"Encryption Error\",\r\n\t\t\t\t\"it\": \"Errore di Crittografia\",\r\n\t\t\t\t\"es\": \"Error de Cifrado\",\r\n\t\t\t\t\"fr\": \"Erreur de Chiffrement\"\r\n\t\t\t},\r\n\t\t\t\"1092\": { \r\n\t\t\t\t\"en\": \"Decode Audio Initialization Error\",\r\n\t\t\t\t\"it\": \"Errore di Inizializzazione della Decodifica Audio\",\r\n\t\t\t\t\"es\": \"Error de Inicialización de Decodificación de Audio\",\r\n\t\t\t\t\"fr\": \"Erreur d'Initialisation du Décodage Audio\"\r\n\t\t\t},\r\n\t\t\t\"1401\": { \r\n\t\t\t\t\"en\": \"Permissions Issue\",\r\n\t\t\t\t\"it\": \"Problema di Permessi\",\r\n\t\t\t\t\"es\": \"Problema de Permisos\",\r\n\t\t\t\t\"fr\": \"Problème de Permissions\"\r\n\t\t\t},\r\n\t\t\t\"1404\": { \r\n\t\t\t\t\"en\": \"File Open Error\",\r\n\t\t\t\t\"it\": \"Errore di Apertura File\",\r\n\t\t\t\t\"es\": \"Error de Apertura de Archivo\",\r\n\t\t\t\t\"fr\": \"Erreur d'Ouverture de Fichier\"\r\n\t\t\t},\r\n\t\t\t\"1432\": { \r\n\t\t\t\t\"en\": \"IAM Role Error\",\r\n\t\t\t\t\"it\": \"Errore Ruolo IAM\",\r\n\t\t\t\t\"es\": \"Error de Rol IAM\",\r\n\t\t\t\t\"fr\": \"Erreur de Rôle IAM\"\r\n\t\t\t},\r\n\t\t\t\"1433\": { \r\n\t\t\t\t\"en\": \"IAM Role Error\",\r\n\t\t\t\t\"it\": \"Errore Ruolo IAM\",\r\n\t\t\t\t\"es\": \"Error de Rol IAM\",\r\n\t\t\t\t\"fr\": \"Erreur de Rôle IAM\"\r\n\t\t\t},\r\n\t\t\t\"1434\": { \r\n\t\t\t\t\"en\": \"IAM Role Error\",\r\n\t\t\t\t\"it\": \"Errore Ruolo IAM\",\r\n\t\t\t\t\"es\": \"Error de Rol IAM\",\r\n\t\t\t\t\"fr\": \"Erreur de Rôle IAM\"\r\n\t\t\t},\r\n\t\t\t\"1515\": { \r\n\t\t\t\t\"en\": \"IAM Role Error\",\r\n\t\t\t\t\"it\": \"Errore Ruolo IAM\",\r\n\t\t\t\t\"es\": \"Error de Rol IAM\",\r\n\t\t\t\t\"fr\": \"Erreur de Rôle IAM\"\r\n\t\t\t},\r\n\t\t\t\"1522\": { \r\n\t\t\t\t\"en\": \"Terminated\",\r\n\t\t\t\t\"it\": \"Terminato\",\r\n\t\t\t\t\"es\": \"Terminado\",\r\n\t\t\t\t\"fr\": \"Terminé\"\r\n\t\t\t},\r\n\t\t\t\"1550\": { \r\n\t\t\t\t\"en\": \"Acceleration Fault\",\r\n\t\t\t\t\"it\": \"Errore di Accelerazione\",\r\n\t\t\t\t\"es\": \"Falla de Aceleración\",\r\n\t\t\t\t\"fr\": \"Défaut d'Accélération\"\r\n\t\t\t},\r\n\t\t\t\"1999\": { \r\n\t\t\t\t\"en\": \"Unknown Error\",\r\n\t\t\t\t\"it\": \"Errore Sconosciuto\",\r\n\t\t\t\t\"es\": \"Error Desconocido\",\r\n\t\t\t\t\"fr\": \"Erreur Inconnue\"\r\n\t\t\t},\r\n\t\t\t\"3400\": { \r\n\t\t\t\t\"en\": \"HLS Input Doesn't Meet Requirements\",\r\n\t\t\t\t\"it\": \"L'Input HLS Non Soddisfa i Requisiti\",\r\n\t\t\t\t\"es\": \"La Entrada HLS No Cumple los Requisitos\",\r\n\t\t\t\t\"fr\": \"L'Entrée HLS Ne Répond Pas aux Exigences\"\r\n\t\t\t},\r\n\t\t\t\"3401\": { \r\n\t\t\t\t\"en\": \"HTTP File Access Not Authorized\",\r\n\t\t\t\t\"it\": \"Accesso al File HTTP Non Autorizzato\",\r\n\t\t\t\t\"es\": \"Acceso al Archivo HTTP No Autorizado\",\r\n\t\t\t\t\"fr\": \"Accès au Fichier HTTP Non Autorisé\"\r\n\t\t\t},\r\n\t\t\t\"3403\": { \r\n\t\t\t\t\"en\": \"HTTP Access Forbidden\",\r\n\t\t\t\t\"it\": \"Accesso HTTP Vietato\",\r\n\t\t\t\t\"es\": \"Acceso HTTP Prohibido\",\r\n\t\t\t\t\"fr\": \"Accès HTTP Interdit\"\r\n\t\t\t},\r\n\t\t\t\"3404\": { \r\n\t\t\t\t\"en\": \"HTTP File Not Found\",\r\n\t\t\t\t\"it\": \"File HTTP Non Trovato\",\r\n\t\t\t\t\"es\": \"Archivo HTTP No Encontrado\",\r\n\t\t\t\t\"fr\": \"Fichier HTTP Non Trouvé\"\r\n\t\t\t},\r\n\t\t\t\"3408\": { \r\n\t\t\t\t\"en\": \"HTTP Upload Error\",\r\n\t\t\t\t\"it\": \"Errore di Upload HTTP\",\r\n\t\t\t\t\"es\": \"Error de Carga HTTP\",\r\n\t\t\t\t\"fr\": \"Erreur de Téléchargement HTTP\"\r\n\t\t\t},\r\n\t\t\t\"3450\": { \r\n\t\t\t\t\"en\": \"HTTP Server Error\",\r\n\t\t\t\t\"it\": \"Errore del Server HTTP\",\r\n\t\t\t\t\"es\": \"Error del Servidor HTTP\",\r\n\t\t\t\t\"fr\": \"Erreur du Serveur HTTP\"\r\n\t\t\t},\r\n\t\t\t\"3451\": { \r\n\t\t\t\t\"en\": \"HTTP Server Connection Error\",\r\n\t\t\t\t\"it\": \"Errore di Connessione al Server HTTP\",\r\n\t\t\t\t\"es\": \"Error de Conexión al Servidor HTTP\",\r\n\t\t\t\t\"fr\": \"Erreur de Connexion au Serveur HTTP\"\r\n\t\t\t},\r\n\t\t\t\"3457\": { \r\n\t\t\t\t\"en\": \"Input Disallowed by Policy\",\r\n\t\t\t\t\"it\": \"Input Vietato dalla Politica\",\r\n\t\t\t\t\"es\": \"Entrada Prohibida por la Política\",\r\n\t\t\t\t\"fr\": \"Entrée Interdite par la Politique\"\r\n\t\t\t},\r\n\t\t\t\"3999\": { \r\n\t\t\t\t\"en\": \"HTTP Unknown Error\",\r\n\t\t\t\t\"it\": \"Errore HTTP Sconosciuto\",\r\n\t\t\t\t\"es\": \"Error HTTP Desconocido\",\r\n\t\t\t\t\"fr\": \"Erreur HTTP Inconnue\"\r\n\t\t\t},\r\n\t\t\t\"retry\": {\r\n\t\t\t\t\"en\": \"Retry\",\r\n\t\t\t\t\"it\": \"Riprova\",\r\n\t\t\t\t\"es\": \"Reintentar\",\r\n\t\t\t\t\"fr\": \"Réessayer\"\r\n\t\t\t},\r\n\t\t\t\"video-uploading\": {\r\n\t\t\t\t\"en\": \"Uploading...\",\r\n\t\t\t\t\"it\": \"Uploading...\",\r\n\t\t\t\t\"es\": \"Uploading...\",\r\n\t\t\t\t\"fr\": \"Uploading...\"\r\n\t\t\t},\r\n\t\t\t\"video-processing\": {\r\n\t\t\t\t\"en\": \"Processing...\",\r\n\t\t\t\t\"it\": \"Elaborazione...\",\r\n\t\t\t\t\"es\": \"Procesando...\",\r\n\t\t\t\t\"fr\": \"Traitement...\"\r\n\t\t\t},\r\n\t\t\t\"uploading-video\": {\r\n\t\t\t\t\"en\": \"Uploading...\",\r\n\t\t\t\t\"it\": \"Caricamento...\",\r\n\t\t\t\t\"es\": \"Cargando...\",\r\n\t\t\t\t\"fr\": \"Téléchargement...\"\r\n\t\t\t},\r\n\t\t\t\"video-uploading-message\": {\r\n\t\t\t\t\"en\": \"Please wait for the upload to finish. Do not close or reload this window.\",\r\n\t\t\t\t\"it\": \"Attendere la fine del caricamento. Non chiudere o ricaricare questa finestra.\",\r\n\t\t\t\t\"es\": \"Espere a que termine la carga. No cierre ni recargue esta ventana.\",\r\n\t\t\t\t\"fr\": \"Veuillez attendre la fin du téléchargement. Ne fermez pas et ne rechargez pas cette fenêtre.\"\r\n\t\t\t},\r\n\t\t\t\"media\": {\r\n\t\t\t\t\"en\": \"Media\",\r\n\t\t\t\t\"it\": \"Media\",\r\n\t\t\t\t\"es\": \"Media\",\r\n\t\t\t\t\"fr\": \"Media\"\r\n\t\t\t},\r\n\t\t\t\"video\": {\r\n\t\t\t\t\"en\": \"Video\",\r\n\t\t\t\t\"it\": \"Video\",\r\n\t\t\t\t\"es\": \"Vídeo\",\r\n\t\t\t\t\"fr\": \"Vidéo\"\r\n\t\t\t},\r\n\t\t\t\"video-upload-error\": {\r\n\t\t\t\t\"en\": \"Error during video upload\",\r\n\t\t\t\t\"it\": \"Errore durante il caricamento del video\",\r\n\t\t\t\t\"es\": \"Error durante la carga del vídeo\",\r\n\t\t\t\t\"fr\": \"Erreur lors du téléchargement de la vidéo\"\r\n\t\t\t},\r\n\t\t\t\"video-uploaded-successfully\": {\r\n\t\t\t\t\"en\": \"Video uploaded successfully\",\r\n\t\t\t\t\"it\": \"Video caricato correttamente\",\r\n\t\t\t\t\"es\": \"Vídeo cargado correctamente\",\r\n\t\t\t\t\"fr\": \"Vidéo téléchargée avec succès\"\r\n\t\t\t},\r\n\t\t\t\"select-screen-workout\": {\r\n\t\t\t\t\"en\": \"Select Screen Workout\",\r\n\t\t\t\t\"it\": \"Seleziona Allenamento A Schermo\",\r\n\t\t\t\t\"es\": \"Seleccionar Entrenamiento En Pantalla\",\r\n\t\t\t\t\"fr\": \"Sélectionner l'Entraînement à l'Écran\"\r\n\t\t\t},\r\n\t\t\t\"workouts-planning\": {\r\n\t\t\t\t\"en\": \"Workouts Planning\",\r\n\t\t\t\t\"it\": \"Pianificazione dei Workout\",\r\n\t\t\t\t\"es\": \"Planificación de Entrenamientos\",\r\n\t\t\t\t\"fr\": \"Planification des Entraînements\"\r\n\t\t\t},\r\n\t\t\t\"single-workout-planning\": {\r\n\t\t\t\ten: \"Single Workout Planning\",\r\n\t\t\t\tit: \"Pianificazione di un Singolo Workout\",\r\n\t\t\t\tes: \"Planificación de Entrenamiento Único\",\r\n\t\t\t\tfr: \"Planification d'un Entraînement Unique\"\r\n\t\t\t},\r\n\t\t\t\"display-group\": {\r\n\t\t\t\ten: \"Room\",\r\n\t\t\t\tit: \"Sala\",\r\n\t\t\t\tes: \"Sala\",\r\n\t\t\t\tfr: \"Salle\",\r\n\t\t\t},\r\n\t\t\t\"slots-duration-error\": {\r\n\t\t\t\t\"en\": \"All slots on the calendar must have a duration greater than or equal to that of the selected workout.\",\r\n\t\t\t\t\"it\": \"Tutti gli slot sul calendario devono avere una durata maggiore o uguale di quella del workout selezionato.\",\r\n\t\t\t\t\"es\": \"Todos los espacios en el calendario deben tener una duración mayor o igual a la del entrenamiento seleccionado.\",\r\n\t\t\t\t\"fr\": \"Tous les créneaux du calendrier doivent avoir une durée supérieure ou égale à celle de l'entraînement sélectionné.\"\r\n\t\t\t},\r\n\t\t\t\"slot-duration-error\": {\r\n\t\t\t\t\"en\": \"Slot calendar must have a duration greater than or equal to that of the selected workout.\",\r\n\t\t\t\t\"it\": \"Lo slot sul calendario devono avere una durata maggiore o uguale di quella del workout selezionato.\",\r\n\t\t\t\t\"es\": \"Espacio en el calendario deben tener una duración mayor o igual a la del entrenamiento seleccionado.\",\r\n\t\t\t\t\"fr\": \"Créneaux du calendrier doivent avoir une durée supérieure ou égale à celle de l'entraînement sélectionné.\"\r\n\t\t\t},\r\n\t\t\t\"you-must-select-an-on-screen-workout\": {\r\n\t\t\t\t\"en\": \"You must select an on-screen Workout\",\r\n\t\t\t\t\"it\": \"Devi selezionare un allenamento a schermo\",\r\n\t\t\t\t\"es\": \"Debes seleccionar un entrenamiento De pantalla\",\r\n\t\t\t\t\"fr\": \"Vous devez sélectionner un entraînement à l'écran\"\r\n\t\t\t},\r\n\t\t\t\"hide-free-spots\": {\r\n\t\t\t\t\"en\": \"Hide Free Spots\",\r\n\t\t\t\t\"it\": \"Nascondi Posti Liberi\",\r\n\t\t\t\t\"es\": \"Ocultar Puestos Libres\",\r\n\t\t\t\t\"fr\": \"Masquer Places Disponibles\"\r\n\t\t\t},\r\n\t\t\t\"start-hour\": {\r\n\t\t\t\t\"en\": \"Start time\",\r\n\t\t\t\t\"it\": \"Ora inizio\",\r\n\t\t\t\t\"es\": \"Hora de inicio\",\r\n\t\t\t\t\"fr\": \"Heure de début\"\r\n\t\t\t},\r\n\t\t\t\"end-hour\": {\r\n\t\t\t\t\"en\": \"End time\",\r\n\t\t\t\t\"it\": \"Ora fine\",\r\n\t\t\t\t\"es\": \"Hora de finalización\",\r\n\t\t\t\t\"fr\": \"Heure de fin\"\r\n\t\t\t},\r\n\t\t\t\"you-are-cloning-the-selected-workouts\": {\r\n\t\t\t\ten: \"You are cloning the selected workouts.\",\r\n\t\t\t\tit: \"Stai clonando i workout selezionati.\",\r\n\t\t\t\tes: \"Estás clonando los entrenamientos seleccionados.\",\r\n\t\t\t\tfr: \"Vous clonez les séances d'entraînement sélectionnées.\"\r\n\t\t\t},\r\n\t\t\t\"acceptance-date\": {\r\n\t\t\t\ten: \"Acceptance Date\",\r\n\t\t\t\tit: \"Data Accettazione\",\r\n\t\t\t\tes: \"Fecha Aceptación\",\r\n\t\t\t\tfr: \"Date Acceptation\"\r\n\t\t\t},\r\n\t\t\t\"type-policy-text-here\": {\r\n\t\t\t\ten: \"Type the policy text here\",\r\n\t\t\t\tit: \"Scrivi qui il testo della policy\",\r\n\t\t\t\tes: \"Escriba el texto de la política aquí\",\r\n\t\t\t\tfr: \"Tapez le texte de la politique ici\",\r\n\t\t\t},\r\n\t\t\t\"kiosk\": {\r\n\t\t\t\ten: \"Kiosk\",\r\n\t\t\t\tit: \"Kiosk\",\r\n\t\t\t\tes: \"Kiosk\",\r\n\t\t\t\tfr: \"Kiosk\"\r\n\t\t\t},\r\n\t\t\t\"no-kiosk\": {\r\n\t\t\t\ten: \"No Kiosk\",\r\n\t\t\t\tit: \"Nessun Kiosk\",\r\n\t\t\t\tes: \"Sin Kiosk\",\r\n\t\t\t\tfr: \"Aucun Kiosk\",\r\n\t\t\t},\r\n\t\t\t\"policies\": {\r\n\t\t\t\ten: \"Policies\",\r\n\t\t\t\tit: \"Policies\",\r\n\t\t\t\tes: \"Policies\",\r\n\t\t\t\tfr: \"Policies\"\r\n\t\t\t},\r\n\t\t\t\"Accepted\": {\r\n\t\t\t\ten: \"Accepted\",\r\n\t\t\t\tit: \"Accettato\",\r\n\t\t\t\tes: \"Aceptado\",\r\n\t\t\t\tfr: \"Accepté\"\r\n\t\t\t},\r\n\t\t\t\"NotAccepted\": {\r\n\t\t\t\ten: \"Not Accepted\",\r\n\t\t\t\tit: \"Non Accettato\",\r\n\t\t\t\tes: \"No Aceptado\",\r\n\t\t\t\tfr: \"Non Accepté\"\r\n\t\t\t},\r\n\t\t\t\"NotAnswered\": {\r\n\t\t\t\ten: \"Not Answered\",\r\n\t\t\t\tit: \"Non Risposto\",\r\n\t\t\t\tes: \"No Respondido\",\r\n\t\t\t\tfr: \"Non Répondu\"\r\n\t\t\t},\r\n\t\t\t\"new-policy\": {\r\n\t\t\t\ten: \"New Policy\",\r\n\t\t\t\tit: \"Nuova Policy\",\r\n\t\t\t\tes: \"Nueva Política\",\r\n\t\t\t\tfr: \"Nouvelle Politique\"\r\n\t\t\t},\r\n\t\t\t\"edit-policy\": {\r\n\t\t\t\ten: \"Edit Policy\",\r\n\t\t\t\tit: \"Modifica Policy\",\r\n\t\t\t\tes: \"Editar Política\",\r\n\t\t\t\tfr: \"Modifier la Politique\"\r\n\t\t\t},\r\n\t\t\t\"summary\": {\r\n\t\t\t\ten: \"Summary\",\r\n\t\t\t\tit: \"Riepilogo\",\r\n\t\t\t\tes: \"Resumen\",\r\n\t\t\t\tfr: \"Résumé\"\r\n\t\t\t},\r\n\t\t\t\"policy-will-be\": {\r\n\t\t\t\ten: \"The policy will be:\",\r\n\t\t\t\tit: \"La policy sarà:\",\r\n\t\t\t\tes: \"La política será:\",\r\n\t\t\t\tfr: \"La politique sera:\"\r\n\t\t\t},\r\n\t\t\t\"TermsOfPurchase\": {\r\n\t\t\t\ten: \"Terms of Purchase\",\r\n\t\t\t\tit: \"Termini di Acquisto\",\r\n\t\t\t\tes: \"Términos de Compra\",\r\n\t\t\t\tfr: \"Conditions d'Achat\"\r\n\t\t\t},\r\n\t\t\t\"JoinClub\": {\r\n\t\t\t\ten: \"Join Club\",\r\n\t\t\t\tit: \"Unione al Club\",\r\n\t\t\t\tes: \"Join Club\",\r\n\t\t\t\tfr: \"Join Club\"\r\n\t\t\t},\r\n\t\t\t\"publication-date\": {\r\n\t\t\t\ten: \"Publication Date\",\r\n\t\t\t\tit: \"Data di Pubblicazione\",\r\n\t\t\t\tes: \"Fecha de Publicación\",\r\n\t\t\t\tfr: \"Date de Publication\"\r\n\t\t\t},\r\n\t\t\t\"club-policies\": {\r\n\t\t\t\ten: \"Policies\",\r\n\t\t\t\tit: \"Policy\",\r\n\t\t\t\tes: \"Términos y Condiciones\",\r\n\t\t\t\tfr: \"Termes et Conditions\"\r\n\t\t\t},\r\n\t\t\t\"cannot-suspend-a-subscription-with-active-bookings\": {\r\n\t\t\t\ten: \"Cannot suspend a subscription with active bookings\",\r\n\t\t\t\tit: \"Impossibile sospendere un abbonamento con prenotazioni attive\",\r\n\t\t\t\tes: \"No se puede suspender una suscripción con reservas activas\",\r\n\t\t\t\tfr: \"Impossible de suspendre un abonnement avec des réservations actives\"\r\n\t\t\t},\r\n\t\t\t\"unable-to-copy-following-workouts\": {\r\n\t\t\t\ten: \"Unable to copy the following on-screen workouts:\",\r\n\t\t\t\tit: \"Impossibile copiare i seguenti allenamenti a schermo:\",\r\n\t\t\t\tes: \"No se pudieron copiar los siguientes entrenamientos de pantalla:\",\r\n\t\t\t\tfr: \"Impossible de copier les entraînements sur ècran:\"\r\n\t\t\t}, \r\n\t\t\t\"exercise-not-found-in-destination-club\": {\r\n\t\t\t\ten: \"Exercise not found in destination club\",\r\n\t\t\t\tit: \"Esercizio non trovato nel club di destinazione\",\r\n\t\t\t\tes: \"Ejercicio no encontrado en el club de destino\",\r\n\t\t\t\tfr: \"Exercice non trouvé dans le club de destination\"\r\n\t\t\t},\r\n\t\t\t\"elements\": {\r\n\t\t\t\ten: \"Elements\",\r\n\t\t\t\tit: \"Elementi\",\r\n\t\t\t\tes: \"Elementos\",\r\n\t\t\t\tfr: \"Éléments\"\r\n\t\t\t},\r\n\t\t\t\"check-field-cardioZone\": {\r\n\t\t\t\ten: \"Check the HR Target field.\",\r\n\t\t\t\tit: \"Controlla il campo HR Target.\",\r\n\t\t\t\tes: \"Verifique el campo FC Target.\",\r\n\t\t\t\tfr: \"Vérifiez le champ FC Target.\"\r\n\t\t\t},\r\n\t\t\t\"check-field-rPE\": {\r\n\t\t\t\ten: \"Check the RPE field.\",\r\n\t\t\t\tit: \"Controlla il campo RPE.\",\r\n\t\t\t\tes: \"Verifique el campo RPE.\",\r\n\t\t\t\tfr: \"Vérifiez le champ RPE.\"\r\n\t\t\t},\r\n\t\t\t\"check-field-reps\": {\r\n\t\t\t\ten: \"Check the repetitions field.\",\r\n\t\t\t\tit: \"Controlla il campo ripetizioni.\",\r\n\t\t\t\tes: \"Verifique el campo de repeticiones.\",\r\n\t\t\t\tfr: \"Vérifiez le champ des répétitions.\"\r\n\t\t\t},\r\n\t\t\t\"check-field-level\": {\r\n\t\t\t\ten: \"Check the equipment level field.\",\r\n\t\t\t\tit: \"Controlla il campo livello attrezzo.\",\r\n\t\t\t\tes: \"Verifique el campo de nivel de equipo.\",\r\n\t\t\t\tfr: \"Vérifiez le champ niveau de l'équipement.\"\r\n\t\t\t},\r\n\t\t\t\"check-field-weight\": {\r\n\t\t\t\ten: \"Check the field weight.\",\r\n\t\t\t\tit: \"Controlla il campo peso.\",\r\n\t\t\t\tes: \"Verifique el campo de peso.\",\r\n\t\t\t\tfr: \"Vérifiez le champ de poids.\"\r\n\t\t\t},\r\n\t\t\t\"check-repetition-interval-field\": {\r\n\t\t\t\ten: \"Check the repetition interval field.\",\r\n\t\t\t\tit: \"Controlla il campo intervallo ripetizioni.\",\r\n\t\t\t\tes: \"Verifique el campo de intervalo de repeticiones.\",\r\n\t\t\t\tfr: \"Vérifiez le champ intervalle de répétitions.\"\r\n\t\t\t},\r\n\t\t\t\"exercise-cannot-have-only-pause\": {\r\n\t\t\t\ten: \"An exercise cannot have only a pause.\",\r\n\t\t\t\tit: \"Un esercizio non può avere solo una pausa.\",\r\n\t\t\t\tes: \"Un ejercicio no puede tener solo una pausa.\",\r\n\t\t\t\tfr: \"Un exercice ne peut pas avoir seulement une pause.\"\r\n\t\t\t},\r\n\t\t\t\"check-round-rest-field\": {\r\n\t\t\t\ten: \"Check the round rest field.\",\r\n\t\t\t\tit: \"Controlla il campo pausa round.\",\r\n\t\t\t\tes: \"Verifique el campo de descanso de la ronda.\",\r\n\t\t\t\tfr: \"Vérifiez le champ repos du round.\"\r\n\t\t\t},\r\n\t\t\t\"check-rest-field\": {\r\n\t\t\t\ten: \"Check the rest field.\",\r\n\t\t\t\tit: \"Controlla il campo pausa.\",\r\n\t\t\t\tes: \"Verifique el campo de descans.\",\r\n\t\t\t\tfr: \"Vérifiez le champ repos.\"\r\n\t\t\t},\r\n\t\t\t\"check-round-duration-field\": {\r\n\t\t\t\ten: \"Check the round duration field.\",\r\n\t\t\t\tit: \"Controlla il campo durata round.\",\r\n\t\t\t\tes: \"Verifique el campo de duración de la ronda.\",\r\n\t\t\t\tfr: \"Vérifiez le champ durée du round.\"\r\n\t\t\t},\r\n\t\t\t\"check-notes-field\": {\r\n\t\t\t\ten: \"Check the notes field.\",\r\n\t\t\t\tit: \"Controlla il campo note.\",\r\n\t\t\t\tes: \"Verifique el campo de notas.\",\r\n\t\t\t\tfr: \"Vérifiez le champ notes.\"\r\n\t\t\t},\r\n\t\t\t\"folder-and-all-workouts-inside-will-be-deleted\": {\r\n\t\t\t\ten: \"The folder and all workouts inside it will be deleted.\",\r\n\t\t\t\tit: \"La cartella e tutti i workout al suo interno verranno eliminati.\",\r\n\t\t\t\tes: \"La carpeta y todos los entrenamientos dentro de ella serán eliminados.\",\r\n\t\t\t\tfr: \"Le dossier et tous les entraînements qu'il contient seront supprimés.\"\r\n\t\t\t},\r\n\t\t\t\"select-destination\": {\r\n\t\t\t\ten: \"Select Destination\",\r\n\t\t\t\tit: \"Seleziona Destinazione\",\r\n\t\t\t\tes: \"Seleccione Destino\",\r\n\t\t\t\tfr: \"Sélectionner La Destination\",\r\n\t\t\t},\r\n\t\t\t\"create-new-folder\": {\r\n\t\t\t\ten: \"Create New Folder:\",\r\n\t\t\t\tit: \"Crea Nuova Cartella:\",\r\n\t\t\t\tes: \"Crear Nueva Carpeta:\",\r\n\t\t\t\tfr: \"Créer Un Nouveau Dossier:\",\r\n\t\t\t},\r\n\t\t\t\"new-folder-name\": {\r\n\t\t\t\ten: \"New Folder Name\",\r\n\t\t\t\tit: \"Nome Nuova Cartella\",\r\n\t\t\t\tes: \"Nuevo Nombre De Carpeta\",\r\n\t\t\t\tfr: \"Nouveau Nom De Dossier\",\r\n\t\t\t},\r\n\t\t\t\"move\": {\r\n\t\t\t\ten: \"Move\",\r\n\t\t\t\tit: \"Sposta\",\r\n\t\t\t\tes: \"Mover\",\r\n\t\t\t\tfr: \"Déplacer\",\r\n\t\t\t},\r\n\t\t\t\"level-rank\": {\r\n\t\t\t\t\"en\": \"Rank\",\r\n\t\t\t\t\"it\": \"Rank\",\r\n\t\t\t\t\"es\": \"Rango\",\r\n\t\t\t\t\"fr\": \"Rang\"\r\n\t\t\t},\r\n\t\t\t\"no-level\": {\r\n\t\t\t\ten: \"No Level\",\r\n\t\t\t\tit: \"Nessun Livello\",\r\n\t\t\t\tes: \"Sin Nivel\",\r\n\t\t\t\tfr: \"Pas De Niveau\",\r\n\t\t\t},\r\n\t\t\t\"event\": {\r\n\t\t\t\ten: \"Event\",\r\n\t\t\t\tit: \"Evento\",\r\n\t\t\t\tes: \"Evento\",\r\n\t\t\t\tfr: \"Événement\",\r\n\t\t\t},\r\n\t\t\t\"support\": {\r\n\t\t\t\ten: \"Support\",\r\n\t\t\t\tit: \"Supporto\",\r\n\t\t\t\tes: \"Asistencia\",\r\n\t\t\t\tfr: \"Assistance\",\r\n\t\t\t},\r\n\t\t\t\"check-exercise-duration-filed\": {\r\n\t\t\t\ten: \"Check the exercise duration field.\",\r\n\t\t\t\tit: \"Controlla il campo della durata dell'esercizio.\",\r\n\t\t\t\tes: \"Verifica el campo de duración del ejercicio.\",\r\n\t\t\t\tfr: \"Vérifiez le champ de durée de l'exercice.\"\r\n\t\t\t},\r\n\t\t\t\"exercises-duration-at-least-five-seconds\": {\r\n\t\t\t\ten: \"Exercise duration must be at least five seconds.\",\r\n\t\t\t\tit: \"La durata dell'esercizio deve essere di almeno cinque secondi.\",\r\n\t\t\t\tes: \"La duración del ejercicio debe ser de al menos cinco segundos.\",\r\n\t\t\t\tfr: \"La durée de l'exercice doit être d'au moins cinq secondes.\"\r\n\t\t\t},\r\n\t\t\t\"duration-at-least-five-seconds\": {\r\n\t\t\t\ten: \"Duration must be at least five seconds.\",\r\n\t\t\t\tit: \"La durata deve essere di almeno cinque secondi.\",\r\n\t\t\t\tes: \"La duración debe ser de al menos cinco segundos.\",\r\n\t\t\t\tfr: \"La durée doit être d'au moins cinq secondes.\"\r\n\t\t\t},\r\n\t\t\t\"impossible-to-delete-the-element\": {\r\n\t\t\t\ten: \"Impossible to delete the element because it contains {0} exercises;\",\r\n\t\t\t\tit: \"Impossibile eliminare l'elemento perché contiene {0} esercizi;\",\r\n\t\t\t\tes: \"Imposible eliminar el elemento porque contiene {0} ejercicios;\",\r\n\t\t\t\tfr: \"Impossible de supprimer l'élément car il contient {0} exercices;\"\r\n\t\t\t},\r\n\t\t\t\"unable-to-delete-element-stations\": {\r\n\t\t\t\ten: \"Unable to delete the element because it contains {0} exercises. Check that all stations do not have exercises.\",\r\n\t\t\t\tit: \"Impossibile eliminare l'elemento perchè contiene {0} esercizi. Controllare che tutte le stazioni non abbiano esercizi.\",\r\n\t\t\t\tes: \"No se puede eliminar el elemento porque contiene {0} ejercicios. Verifique que todas las estaciones no tengan ejercicios.\",\r\n\t\t\t\tfr: \"Impossible de supprimer l'élément car il contient {0} exercices. Vérifiez que toutes les stations n'ont pas d'exercices.\"\r\n\t\t\t},\r\n\t\t\texercise: {\r\n\t\t\t\ten: \"Exercise\",\r\n\t\t\t\tit: \"Esercizio\",\r\n\t\t\t\tes: \"Ejercicio\",\r\n\t\t\t\tfr: \"Exercice\",\r\n\t\t\t},\r\n\t\t\t\"overnight-avg\": {\r\n\t\t\t\ten: \"Overnight Avg\",\r\n\t\t\t\tit: \"Media Notturna\",\r\n\t\t\t\tes: \"Promedio Nocturno\",\r\n\t\t\t\tfr: \"Moyenne Nocturne\"\r\n\t\t\t},\r\n\t\t\t\"kcal-session\": {\r\n\t\t\t\ten: \"kcal/session\",\r\n\t\t\t\tit: \"kcal/sessione\",\r\n\t\t\t\tes: \"kcal/sesión\",\r\n\t\t\t\tfr: \"kcal/séance\"\r\n\t\t\t},\r\n\t\t\t\"upps-session\": {\r\n\t\t\t\ten: \"UPPs/session\",\r\n\t\t\t\tit: \"UPPs/sessione\",\r\n\t\t\t\tes: \"UPPs/sesión\",\r\n\t\t\t\tfr: \"UPPs/séance\"\r\n\t\t\t},\r\n\t\t\t\"open\": {\r\n\t\t\t\ten: \"Open\",\r\n\t\t\t\tit: \"Open\",\r\n\t\t\t\tes: \"Open\",\r\n\t\t\t\tfr: \"Open\"\r\n\t\t\t},\r\n\t\t\t\"you-are-cloning-a-circuit\": {\r\n\t\t\t\ten: \"You are cloning a circuit\",\r\n\t\t\t\tit: \"Stai clonando un circuito\",\r\n\t\t\t\tes: \"Estás clonando un circuito\",\r\n\t\t\t\tfr: \"Vous clonez un circuit\"\r\n\t\t\t},\r\n\t\t\t\"station-not-configured-in-the-club\": {\r\n\t\t\t\ten: \"Station not configured in the club\",\r\n\t\t\t\tit: \"Stazione non configurata nel club\",\r\n\t\t\t\tes: \"Estación no configurada en el club\",\r\n\t\t\t\tfr: \"Station non configurée dans le club\"\r\n\t\t\t},\r\n\t\t\t\"exercise-definition-not-found\": {\r\n\t\t\t\ten: \"Exercise definition not found. Exercise removed. Id: {0}.\",\r\n\t\t\t\tit: \"Definizione dell'esercizio non trovata. Esercizio rimosso. Id: {0}.\",\r\n\t\t\t\tes: \"Definición del ejercicio no encontrada. Ejercicio eliminado. Id: {0}.\",\r\n\t\t\t\tfr: \"Définition de l'exercice non trouvée. Exercice supprimé. Id: {0}.\"\r\n\t\t\t},\r\n\t\t\t\"select-all\": {\r\n\t\t\t\t\"en\": \"Select all\",\r\n\t\t\t\t\"it\": \"Seleziona tutto\",\r\n\t\t\t\t\"es\": \"Seleccionar todo\",\r\n\t\t\t\t\"fr\": \"Sélectionner tout\"\r\n\t\t\t},\r\n\t\t\t\"pause-field-error\": {\r\n\t\t\t\ten: \"Pause field error.\",\r\n\t\t\t\tit: \"Errore campo pausa.\",\r\n\t\t\t\tes: \"Error en el campo de pausa.\",\r\n\t\t\t\tfr: \"Erreur de champ de pause.\"\r\n\t\t\t},\r\n\t\t\t\"check-exercise-pause-field\": {\r\n\t\t\t\ten: \"Check exercise pause field.\",\r\n\t\t\t\tit: \"Controlla il campo pausa esercizio.\",\r\n\t\t\t\tes: \"Verifica el campo de pausa ejercicio.\",\r\n\t\t\t\tfr: \"Vérifiez le champ de pause exercice.\"\r\n\t\t\t},\r\n\t\t\t\"check-set-field\": {\r\n\t\t\t\ten: \"Check set field.\",\r\n\t\t\t\tit: \"Controlla il campo set.\",\r\n\t\t\t\tes: \"Verifica el campo de serie.\",\r\n\t\t\t\tfr: \"Vérifiez le champ de série.\"\r\n\t\t\t},\r\n\t\t\t\"check-round-pause-field\": {\r\n\t\t\t\ten: \"Check round pause field.\",\r\n\t\t\t\tit: \"Controlla il campo pausa del round.\",\r\n\t\t\t\tes: \"Verifica el campo de pausa de ronda.\",\r\n\t\t\t\tfr: \"Vérifiez le champ de pause de manche.\"\r\n\t\t\t},\r\n\t\t\t\"check-round-field\": {\r\n\t\t\t\ten: \"Check round field.\",\r\n\t\t\t\tit: \"Controlla il campo round.\",\r\n\t\t\t\tes: \"Verifica el campo de ronda.\",\r\n\t\t\t\tfr: \"Vérifiez le champ de tour.\"\r\n\t\t\t},\r\n\t\t\t\"check-exercise-duration-field\": {\r\n\t\t\t\ten: \"Check exercise duration field.\",\r\n\t\t\t\tit: \"Controlla il campo durata dell'esercizio.\",\r\n\t\t\t\tes: \"Verifica el campo duración del ejercicio.\",\r\n\t\t\t\tfr: \"Vérifiez le champ de durée de l'exercice.\"\r\n\t\t\t},\r\n\t\t\t\"check-duration-filed\": {\r\n\t\t\t\ten: \"Check duration field.\",\r\n\t\t\t\tit: \"Controlla il campo durata.\",\r\n\t\t\t\tes: \"Verifica el campo duración.\",\r\n\t\t\t\tfr: \"Vérifiez le champ de durée.\"\r\n\t\t\t},\r\n\t\t\t\"exercise-note-error\": {\r\n\t\t\t\ten: \"Exercise note error.\",\r\n\t\t\t\tit: \"Errore nota dell'esercizio.\",\r\n\t\t\t\tes: \"Error de nota del ejercicio.\",\r\n\t\t\t\tfr: \"Erreur de note d'exercice.\"\r\n\t\t\t},\r\n\t\t\t\"check-the-element\": {\r\n\t\t\t\ten: \"Check the element {0}.\",\r\n\t\t\t\tit: \"Controlla l'elemento {0}.\",\r\n\t\t\t\tes: \"Verifica el elemento {0}.\",\r\n\t\t\t\tfr: \"Vérifiez l'élément {0}.\"\r\n\t\t\t},\r\n\t\t\t\"you-must-have-at-least-one-exercise-in-each-set\": {\r\n\t\t\t\ten: \"You must have at least one exercise in each set.\",\r\n\t\t\t\tit: \"Devi avere almeno un esercizio in ogni set.\",\r\n\t\t\t\tes: \"Debes tener al menos un ejercicio en cada serie.\",\r\n\t\t\t\tfr: \"Vous devez avoir au moins un exercice dans chaque série.\"\r\n\t\t\t},\r\n\t\t\t\"station-with-set-without-exercises\": {\r\n\t\t\t\ten: \"Station with set without exercises.\",\r\n\t\t\t\tit: \"Stazione con set senza esercizi.\",\r\n\t\t\t\tes: \"Estación con serie sin ejercicios.\",\r\n\t\t\t\tfr: \"Station avec série sans exercices.\"\r\n\t\t\t},\r\n\t\t\t\"check-name-field\": {\r\n\t\t\t\ten: \"Check Name Field.\",\r\n\t\t\t\tit: \"Controlla il Campo Nome.\",\r\n\t\t\t\tes: \"Verificar Campo Nombre.\",\r\n\t\t\t\tfr: \"Vérifier le Champ Nom.\"\r\n\t\t\t},\r\n\t\t\t\"check-description-field\": {\r\n\t\t\t\ten: \"Check the description field.\",\r\n\t\t\t\tit: \"Controlla il campo descrizione.\",\r\n\t\t\t\tes: \"Verifique el campo de descripción.\",\r\n\t\t\t\tfr: \"Vérifiez le champ description.\"\r\n\t\t\t},\r\n\t\t\t\"select-club\": {\r\n\t\t\t\ten: \"Select Club\",\r\n\t\t\t\tit: \"Seleziona Club\",\r\n\t\t\t\tes: \"Seleccionar Club\",\r\n\t\t\t\tfr: \"Sélectionner un Club\"\r\n\t\t\t},\r\n\t\t\t\"copy-to-other-club\": {\r\n\t\t\t\t\"en\": \"Copy to other club\",\r\n\t\t\t\t\"it\": \"Copia in un altro club\",\r\n\t\t\t\t\"es\": \"Copiar en otro club\",\r\n\t\t\t\t\"fr\": \"Copier dans un autre club\"\r\n\t\t\t},\r\n\t\t\t\"you-are-about-to-delete-circuit\": {\r\n\t\t\t\ten: \"You are about to delete circuit\",\r\n\t\t\t\tit: \"Stai per eliminare il circuito\",\r\n\t\t\t\tes: \"Estás a punto de borrar el circuito\",\r\n\t\t\t\tfr: \"Vous êtes sur le point de supprimer le circuit\"\r\n\t\t\t},\r\n\t\t\t\"enable-stations-to-create-synchronized-workouts-on-multiple-TVs\": {\r\n\t\t\t\ten: \"Enable stations to create synchronized workouts on multiple TVs (each station is managed by a different Bridge)\",\r\n\t\t\t\tit: \"Abilita le stazioni per creare workout sincronizzati su più televisori (ogni stazione è gestita da un Bridge diverso)\",\r\n\t\t\t\tes: \"Habilitar las estaciones para crear entrenamientos sincronizados en varios televisores (cada estación es administrada por un Bridge diferente)\",\r\n\t\t\t\tfr: \"Activez les stations pour créer des entraînements synchronisés sur plusieurs téléviseurs (chaque station est gérée par un Bridge différent)\"\r\n\t\t\t},\r\n\t\t\t\"select-stations\": {\r\n\t\t\t\ten: \"Select Stations\",\r\n\t\t\t\tit: \"Seleziona Stazioni\",\r\n\t\t\t\tes: \"Seleccionar Estaciones\",\r\n\t\t\t\tfr: \"Sélectionner des Stations\"\r\n\t\t\t},\r\n\t\t\t\"stations\": {\r\n\t\t\t\ten: \"Stations\",\r\n\t\t\t\tit: \"Stazioni\",\r\n\t\t\t\tes: \"Estaciones\",\r\n\t\t\t\tfr: \"Stations\"\r\n\t\t\t},\r\n\t\t\t\"to-activate-stations-you-must-have-at-least-one-bridge-with-a-station\": {\r\n\t\t\t\ten: \"To activate stations, you must have at least one bridge with a station\",\r\n\t\t\t\tit: \"Per poter attivare le stazioni devi avere almeno un bridge con una stazione\",\r\n\t\t\t\tes: \"Para activar las estaciones, debes tener al menos un bridge con una estación\",\r\n\t\t\t\tfr: \"Pour activer les stations, vous devez avoir au moins un bridge avec une station\"\r\n\t\t\t},\r\n\t\t\t\"you-must-select-at-least-one-station-or-deactivate-the-stations\": {\r\n\t\t\t\ten: \"You must select at least one station, or deactivate the stations\",\r\n\t\t\t\tit: \"Devi selezionare almeno una stazione, oppure disattivare le stazioni\",\r\n\t\t\t\tes: \"Debes seleccionar al menos una estación o desactivar las estaciones\",\r\n\t\t\t\tfr: \"Vous devez sélectionner au moins une station, ou désactiver les stations\"\r\n\t\t\t},\r\n\t\t\t\"to-deactivate-stations-you-must-have-only-one-active-station\": {\r\n\t\t\t\ten: \"To deactivate stations you must have only one active station\",\r\n\t\t\t\tit: \"Per disattivare le stazioni devi avere attiva solo una stazione\",\r\n\t\t\t\tes: \"Para desactivar las estaciones debes tener solo una estación activa\",\r\n\t\t\t\tfr: \"Pour désactiver les stations, vous ne devez avoir qu'une seule station active\"\r\n\t\t\t},\r\n\t\t\t\"impossible-to-remove-station-because-it-contains-exercises\": {\r\n\t\t\t\ten: \"Impossible to remove the station because it contains {0} exercises.\",\r\n\t\t\t\tit: \"Impossibile rimuovere la stazione perché contiene {0} esercizi.\",\r\n\t\t\t\tes: \"Imposible eliminar la estación porque contiene {0} ejercicios.\",\r\n\t\t\t\tfr: \"Impossible de supprimer la station car elle contient {0} exercices.\"\r\n\t\t\t},\r\n\t\t\t\"exercise-note\": {\r\n\t\t\t\ten: \"Exercise Note\",\r\n\t\t\t\tit: \"Nota sull'esercizio\",\r\n\t\t\t\tes: \"Nota del ejercicio\",\r\n\t\t\t\tfr: \"Note d'exercice\"\r\n\t\t\t},\r\n\t\t\t\"you-are-about-to-save-some-exercises-in-stations-that-not-exist\": {\r\n\t\t\t\ten: \"You are about to save some exercises in stations that do not exist. Stations: \",\r\n\t\t\t\tit: \"Stai per salvare alcuni esercizi in stazioni che non esistono. Stazioni: \",\r\n\t\t\t\tes: \"Estás a punto de guardar algunos ejercicios en estaciones que no existen. Estaciones: \",\r\n\t\t\t\tfr: \"Vous êtes sur le point de sauvegarder certains exercices dans des stations qui n'existent pas. Stations : \"\r\n\t\t\t},\r\n\t\t\t\"Timer\": {\r\n\t\t\t\ten: \"Interval\",\r\n\t\t\t\tit: \"Interval\",\r\n\t\t\t\tes: \"Interval\",\r\n\t\t\t\tfr: \"Interval\"\r\n\t\t\t},\r\n\t\t\t\"EMOM\": {\r\n\t\t\t\ten: \"EMOM\",\r\n\t\t\t\tit: \"EMOM\",\r\n\t\t\t\tes: \"EMOM\",\r\n\t\t\t\tfr: \"EMOM\",\r\n\t\t\t},\r\n\t\t\t\"AMRAP\": {\r\n\t\t\t\ten: \"AMRAP\",\r\n\t\t\t\tit: \"AMRAP\",\r\n\t\t\t\tes: \"AMRAP\",\r\n\t\t\t\tfr: \"AMRAP\",\r\n\t\t\t},\r\n\t\t\t\"enable-stations\": {\r\n\t\t\t\ten: \"Enable Stations\",\r\n\t\t\t\tit: \"Abilita Stazioni\",\r\n\t\t\t\tes: \"Activar Estaciones\",\r\n\t\t\t\tfr: \"Activer les Stations\"\r\n\t\t\t},\r\n\t\t\t\"station\": {\r\n\t\t\t\ten: \"Station\",\r\n\t\t\t\tit: \"Stazione\",\r\n\t\t\t\tes: \"Estación\",\r\n\t\t\t\tfr: \"Station\"\r\n\t\t\t},\r\n\t\t\t\"exercises-pause\": {\r\n\t\t\t\ten: \"Exercises Pause\",\r\n\t\t\t\tit: \"Pausa degli Esercizi\",\r\n\t\t\t\tes: \"Pausa de Ejercicios\",\r\n\t\t\t\tfr: \"Pause des Exercices\"\r\n\t\t\t},\r\n\t\t\t\"lap-pause\": {\r\n\t\t\t\ten: \"Lap Pause\",\r\n\t\t\t\tit: \"Pausa Giro\",\r\n\t\t\t\tes: \"Pausa de Vuelta\",\r\n\t\t\t\tfr: \"Pause de Tour\"\r\n\t\t\t},\r\n\t\t\t\"lap-pause-field-at-least-five-seconds\": {\r\n\t\t\t\ten: \"The Lap Pause field must be at least five seconds.\",\r\n\t\t\t\tit: \"Il campo Pausa Giro deve essere di almeno cinque secondi.\",\r\n\t\t\t\tes: \"El campo Pausa de Vuelta debe ser de al menos cinco segundos.\",\r\n\t\t\t\tfr: \"Le champ Pause de Tour doit être d'au moins cinq secondes.\"\r\n\t\t\t},\r\n\t\t\t\"create-bw-timer\": {\r\n\t\t\t\ten: \"Create Circuit\",\r\n\t\t\t\tit: \"Crea Circuito\",\r\n\t\t\t\tes: \"Crear Circuito\",\r\n\t\t\t\tfr: \"Créer un Circuit\"\r\n\t\t\t},\r\n\t\t\t\"edit-bw-timer\": {\r\n\t\t\t\ten: \"Edit Circuit\",\r\n\t\t\t\tit: \"Modifica Circuito\",\r\n\t\t\t\tes: \"Editar Circuito\",\r\n\t\t\t\tfr: \"Modifier un Circuit\"\r\n\t\t\t},\r\n\t\t\t\"add-bw-timer\": {\r\n\t\t\t\ten: \"Add Circuit\",\r\n\t\t\t\tit: \"Aggiungi Circuito\",\r\n\t\t\t\tes: \"Crear Circuito\",\r\n\t\t\t\tfr: \"Créer Circuit\"\r\n\t\t\t},\r\n\t\t\t\"remove-timer\": {\r\n\t\t\t\ten: \"Remove Circuit\",\r\n\t\t\t\tit: \"Rimuovi Circuito\",\r\n\t\t\t\tes: \"Eliminar Circuito\",\r\n\t\t\t\tfr: \"Supprimer un Circuit\"\r\n\t\t\t},\r\n\t\t\t\"brand\": {\r\n\t\t\t\ten: \"Organization\",\r\n\t\t\t\tit: \"Organizzazione\",\r\n\t\t\t\tes: \"Organización\",\r\n\t\t\t\tfr: \"Organisation\"\r\n\t\t\t},\r\n\t\t\t\"templates\": {\r\n\t\t\t\ten: \"Templates\",\r\n\t\t\t\tit: \"Modelli\",\r\n\t\t\t\tes: \"Plantillas\",\r\n\t\t\t\tfr: \"Modèles\"\r\n\t\t\t},\r\n\t\t\t\"no-activity-in-selected-period\": {\r\n\t\t\t\t\"en\": \"No activity in selected period\",\r\n\t\t\t\t\"it\": \"Nessuna attività nel periodo selezionato\",\r\n\t\t\t\t\"es\": \"Sin actividad en el período seleccionado\",\r\n\t\t\t\t\"fr\": \"Aucune activité dans la période sélectionnée\"\r\n\t\t\t},\r\n\t\t\t\"intensity-minutes\": {\r\n\t\t\t\t\"en\": \"Intensity Minutes\",\r\n\t\t\t\t\"it\": \"Minuti di Intensità\",\r\n\t\t\t\t\"es\": \"Minutos de Intensidad\",\r\n\t\t\t\t\"fr\": \"Minutes d'Intensité\"\r\n\t\t\t},\r\n\t\t\t\"resting-hr\": {\r\n\t\t\t\t\"en\": \"Resting HR\",\r\n\t\t\t\t\"it\": \"HR a Riposo\",\r\n\t\t\t\t\"es\": \"FC en Reposo\",\r\n\t\t\t\t\"fr\": \"FC au Repos\"\r\n\t\t\t},\r\n\t\t\t\"prc\": {\r\n\t\t\t\t\"en\": \"Prc\",\r\n\t\t\t\t\"it\": \"Prc\",\r\n\t\t\t\t\"es\": \"Prc\",\r\n\t\t\t\t\"fr\": \"Prc\"\r\n\t\t\t},\r\n\t\t\t\"rank\": {\r\n\t\t\t\t\"en\": \"Rank\",\r\n\t\t\t\t\"it\": \"Rank\",\r\n\t\t\t\t\"es\": \"Rank\",\r\n\t\t\t\t\"fr\": \"Rank\"\r\n\t\t\t},\r\n\t\t\t\"heartrate\": {\r\n\t\t\t\t\"en\": \"Heart Rate\",\r\n\t\t\t\t\"it\": \"Frequenza Cardiaca\",\r\n\t\t\t\t\"es\": \"Ritmo Cardíaco\",\r\n\t\t\t\t\"fr\": \"Fréquence Cardiaque\"\r\n\t\t\t},\r\n\t\t\t\"stress\": {\r\n\t\t\t\t\"en\": \"Stress\",\r\n\t\t\t\t\"it\": \"Stress\",\r\n\t\t\t\t\"es\": \"Stress\",\r\n\t\t\t\t\"fr\": \"Stress\"\r\n\t\t\t},\r\n\t\t\t\"stress\": {\r\n\t\t\t\t\"en\": \"Stress\",\r\n\t\t\t\t\"it\": \"Stress\",\r\n\t\t\t\t\"es\": \"Stress\",\r\n\t\t\t\t\"fr\": \"Stress\"\r\n\t\t\t},\r\n\t\t\t\"no-data\": {\r\n\t\t\t\t\"en\": \"No Data\",\r\n\t\t\t\t\"it\": \"Nessun Dato\",\r\n\t\t\t\t\"es\": \"Sin Datos\",\r\n\t\t\t\t\"fr\": \"Pas de Données\"\r\n\t\t\t},\r\n\t\t\t\"rest-stress-duration\": {\r\n\t\t\t\t\"en\": \"Rest Stress Duration\",\r\n\t\t\t\t\"it\": \"Durata Stress Riposo\",\r\n\t\t\t\t\"es\": \"Duración de Estrés en Reposo\",\r\n\t\t\t\t\"fr\": \"Durée du Stress au Repos\"\r\n\t\t\t},\r\n\t\t\t\"high-stress-duration\": {\r\n\t\t\t\t\"en\": \"High Stress Duration\",\r\n\t\t\t\t\"it\": \"Durata Stress Elevato\",\r\n\t\t\t\t\"es\": \"Duración de Estrés Alto\",\r\n\t\t\t\t\"fr\": \"Durée du Stress Élevé\"\r\n\t\t\t},\r\n\t\t\t\"medium-stress-duration\": {\r\n\t\t\t\t\"en\": \"Medium Stress Duration\",\r\n\t\t\t\t\"it\": \"Durata Stress Media\",\r\n\t\t\t\t\"es\": \"Duración de Estrés Medio\",\r\n\t\t\t\t\"fr\": \"Durée du Stress Moyen\"\r\n\t\t\t},\r\n\t\t\t\"low-stress-duration\": {\r\n\t\t\t\t\"en\": \"Low Stress Duration\",\r\n\t\t\t\t\"it\": \"Durata Stress Bassa\",\r\n\t\t\t\t\"es\": \"Duración de Estrés Bajo\",\r\n\t\t\t\t\"fr\": \"Durée du Stress Faible\"\r\n\t\t\t},\r\n\t\t\t\"completed\": {\r\n\t\t\t\t\"en\": \"Completed\",\r\n\t\t\t\t\"it\": \"Completato\",\r\n\t\t\t\t\"es\": \"Completado\",\r\n\t\t\t\t\"fr\": \"Terminé\"\r\n\t\t\t},\r\n\t\t\t\"to-do\": {\r\n\t\t\t\t\"en\": \"To Do\",\r\n\t\t\t\t\"it\": \"Da Fare\",\r\n\t\t\t\t\"es\": \"Por Hacer\",\r\n\t\t\t\t\"fr\": \"À Faire\"\r\n\t\t\t},\r\n\t\t\t\"sleep-FAIR\": {\r\n\t\t\t\t\"en\": \"Fair\",\r\n\t\t\t\t\"it\": \"Discreto\",\r\n\t\t\t\t\"es\": \"Fair\",\r\n\t\t\t\t\"fr\": \"Fair\"\r\n\t\t\t},\r\n\t\t\t\"sleep-POOR\": {\r\n\t\t\t\t\"en\": \"Poor\",\r\n\t\t\t\t\"it\": \"Scarso\",\r\n\t\t\t\t\"es\": \"Pobre\",\r\n\t\t\t\t\"fr\": \"Mauvais\"\r\n\t\t\t},\r\n\t\t\t\"sleep-GOOD\": {\r\n\t\t\t\t\"en\": \"Good\",\r\n\t\t\t\t\"it\": \"Buono\",\r\n\t\t\t\t\"es\": \"Bueno\",\r\n\t\t\t\t\"fr\": \"Bon\"\r\n\t\t\t},\r\n\t\t\t\"sleep-EXCELLENT\": {\r\n\t\t\t\t\"en\": \"Excellent\",\r\n\t\t\t\t\"it\": \"Eccellente\",\r\n\t\t\t\t\"es\": \"Excelente\",\r\n\t\t\t\t\"fr\": \"Excellent\"\r\n\t\t\t},\r\n\t\t\t\"health\": {\r\n\t\t\t\ten: \"Health\",\r\n\t\t\t\tit: \"Health\",\r\n\t\t\t\tes: \"Health\",\r\n\t\t\t\tfr: \"Health\"\r\n\t\t\t},\r\n\t\t\t\"garmin-health\": {\r\n\t\t\t\ten: \"Garmin Health\",\r\n\t\t\t\tit: \"Garmin Health\",\r\n\t\t\t\tes: \"Garmin Health\",\r\n\t\t\t\tfr: \"Garmin Health\"\r\n\t\t\t},\r\n\t\t\t\"resting-calories\": {\r\n\t\t\t\ten: \"Resting Calories\",\r\n\t\t\t\tit: \"Calorie a Riposo\",\r\n\t\t\t\tes: \"Calorías en Reposo\",\r\n\t\t\t\tfr: \"Calories au Repos\"\r\n\t\t\t},\r\n\t\t\t\"active-calories\": {\r\n\t\t\t\ten: \"Active Calories\",\r\n\t\t\t\tit: \"Calorie Attive\",\r\n\t\t\t\tes: \"Calorías Activas\",\r\n\t\t\t\tfr: \"Calories Actives\"\r\n\t\t\t},\r\n\t\t\t\"you-can-view-the-data-up-to-today-date\": {\r\n\t\t\t\ten: \"You can view the data up to today's date\",\r\n\t\t\t\tit: \"Puoi visualizzare i dati fino alla data odierna\",\r\n\t\t\t\tes: \"Puedes ver los datos hasta la fecha de hoy\",\r\n\t\t\t\tfr: \"Vous pouvez consulter les données jusqu'à la date d'aujourd'hui\"\r\n\t\t\t},\r\n\t\t\t\"avg-resting-hr\": {\r\n\t\t\t\ten: \"Average Resting HR\",\r\n\t\t\t\tit: \"HR a Riposo Media\",\r\n\t\t\t\tes: \"HR en Reposo Promedio\",\r\n\t\t\t\tfr: \"HR au Repos Moyenne\"\r\n\t\t\t},\r\n\t\t\t\"tot-activities\": {\r\n\t\t\t\ten: \"Total Activities\",\r\n\t\t\t\tit: \"Attività Totali\",\r\n\t\t\t\tes: \"Actividades Totales\",\r\n\t\t\t\tfr: \"Activités Totales\"\r\n\t\t\t},\r\n\t\t\t\"sleep\": {\r\n\t\t\t\ten: \"Sleep\",\r\n\t\t\t\tit: \"Sonno\",\r\n\t\t\t\tes: \"Sueño\",\r\n\t\t\t\tfr: \"Sommeil\"\r\n\t\t\t},\r\n\t\t\t\"avg-body-battery\": {\r\n\t\t\t\ten: \"Average Body Battery\",\r\n\t\t\t\tit: \"Body Battery Media\",\r\n\t\t\t\tes: \"Body Battery Promedio\",\r\n\t\t\t\tfr: \"Body Battery Moyenne\"\r\n\t\t\t},\r\n\t\t\t\"7-day-average\": {\r\n\t\t\t\ten: \"7-Day Average\",\r\n\t\t\t\tit: \"Media 7 giorni\",\r\n\t\t\t\tes: \"Promedio de 7 días\",\r\n\t\t\t\tfr: \"Moyenne sur 7 jours\"\r\n\t\t\t},\r\n\t\t\t\"avg-stress-level\": {\r\n\t\t\t\ten: \"Average Stress Level\",\r\n\t\t\t\tit: \"Livello di Stress Medio\",\r\n\t\t\t\tes: \"Nivel de Estrés Promedio\",\r\n\t\t\t\tfr: \"Niveau de Stress Moyen\"\r\n\t\t\t},\r\n\t\t\t\"intensity-minutes\": {\r\n\t\t\t\ten: \"Intensity Minutes\",\r\n\t\t\t\tit: \"Minuti di Intensità\",\r\n\t\t\t\tes: \"Minutos de Intensidad\",\r\n\t\t\t\tfr: \"Minutes d'Intensité\"\r\n\t\t\t},\r\n\t\t\t\"resting\": {\r\n\t\t\t\ten: \"Resting\",\r\n\t\t\t\tit: \"A riposo\",\r\n\t\t\t\tes: \"En reposo\",\r\n\t\t\t\tfr: \"Repos\"\r\n\t\t\t},\r\n\t\t\t\"body-battery\": {\r\n\t\t\t\ten: \"Body Battery\",\r\n\t\t\t\tit: \"Body Battery\",\r\n\t\t\t\tes: \"Body Battery\",\r\n\t\t\t\tfr: \"Body Battery\"\r\n\t\t\t},\r\n\t\t\t\"highest\": {\r\n\t\t\t\ten: \"Highest\",\r\n\t\t\t\tit: \"Più alto\",\r\n\t\t\t\tes: \"Más alto\",\r\n\t\t\t\tfr: \"Le plus élevé\"\r\n\t\t\t},\r\n\t\t\t\"lowest\": {\r\n\t\t\t\ten: \"Lowest\",\r\n\t\t\t\tit: \"Più basso\",\r\n\t\t\t\tes: \"Más bajo\",\r\n\t\t\t\tfr: \"Le plus bas\"\r\n\t\t\t},\r\n\t\t\t\"hrv-status\": {\r\n\t\t\t\ten: \"HRV Status\",\r\n\t\t\t\tit: \"Stato HRV\",\r\n\t\t\t\tes: \"Estado de HRV\",\r\n\t\t\t\tfr: \"État HRV\"\r\n\t\t\t},\r\n\t\t\t\"stress-level\": {\r\n\t\t\t\ten: \"Stress Level\",\r\n\t\t\t\tit: \"Livello di Stress\",\r\n\t\t\t\tes: \"Nivel de Estrés\",\r\n\t\t\t\tfr: \"Niveau de Stress\"\r\n\t\t\t},\r\n\t\t\t\"score\": {\r\n\t\t\t\ten: \"Score\",\r\n\t\t\t\tit: \"Punteggio\",\r\n\t\t\t\tes: \"Puntaje\",\r\n\t\t\t\tfr: \"Score\"\r\n\t\t\t},\r\n\t\t\t\"avg-score\": {\r\n\t\t\t\ten: \"Average Score\",\r\n\t\t\t\tit: \"Punteggio Medio\",\r\n\t\t\t\tes: \"Puntuación Promedio\",\r\n\t\t\t\tfr: \"Score Moyen\"\r\n\t\t\t},\r\n\t\t\t\"steps\": {\r\n\t\t\t\ten: \"Steps\",\r\n\t\t\t\tit: \"Passi\",\r\n\t\t\t\tes: \"Pasos\",\r\n\t\t\t\tfr: \"Pas\"\r\n\t\t\t},\r\n\t\t\t\"week-goal\": {\r\n\t\t\t\ten: \"Week Goal\",\r\n\t\t\t\tit: \"Obiettivo Settimanale\",\r\n\t\t\t\tes: \"Meta Semanal\",\r\n\t\t\t\tfr: \"Objectif Hebdomadaire\"\r\n\t\t\t},\r\n\t\t\t\"deep\": {\r\n\t\t\t\ten: \"Deep\",\r\n\t\t\t\tit: \"Profondo\",\r\n\t\t\t\tes: \"Profundo\",\r\n\t\t\t\tfr: \"Profond\",\r\n\t\t\t},\r\n\t\t\t\"light\": {\r\n\t\t\t\ten: \"Light\",\r\n\t\t\t\tit: \"Leggero\",\r\n\t\t\t\tes: \"Ligero\",\r\n\t\t\t\tfr: \"Léger\",\r\n\t\t\t},\r\n\t\t\t\"rem\": {\r\n\t\t\t\ten: \"REM\",\r\n\t\t\t\tit: \"REM\",\r\n\t\t\t\tes: \"MOR\",\r\n\t\t\t\tfr: \"Sommeil Paradoxal\",\r\n\t\t\t},\r\n\t\t\t\"awake\": {\r\n\t\t\t\ten: \"Awake\",\r\n\t\t\t\tit: \"Veglia\",\r\n\t\t\t\tes: \"Vigilia\",\r\n\t\t\t\tfr: \"Éveil\",\r\n\t\t\t},\r\n\t\t\t\"help\": {\r\n\t\t\t\ten: \"Help\",\r\n\t\t\t\tit: \"Aiuto\",\r\n\t\t\t\tes: \"Ayuda\",\r\n\t\t\t\tfr: \"Aide\",\r\n\t\t\t},\r\n\t\t\t\"news-title\": {\r\n\t\t\t\ten: \"What's New\",\r\n\t\t\t\tit: \"Nuove Funzionalità\",\r\n\t\t\t\tes: \"Novedades\",\r\n\t\t\t\tfr: \"Nouvelles fonctionnalités\",\r\n\t\t\t},\r\n\t\t\tboxing: {\r\n\t\t\t\ten: \"Combat\",\r\n\t\t\t\tit: \"Combat\",\r\n\t\t\t\tes: \"Combat\",\r\n\t\t\t\tfr: \"Combat\",\r\n\t\t\t},\r\n\t\t\tpunch: {\r\n\t\t\t\ten: \"punch\",\r\n\t\t\t\tit: \"pugno\",\r\n\t\t\t\tes: \"puño\",\r\n\t\t\t\tfr: \"poing\",\r\n\t\t\t},\r\n\t\t\t\"you-are-about-to-delete\": {\r\n\t\t\t\ten: \"You are about to delete\",\r\n\t\t\t\tit: \"Stai per cancellare\",\r\n\t\t\t\tes: \"Estás a punto de cancelar\",\r\n\t\t\t\tfr: \"Vous êtes sur le point d'annuler\",\r\n\t\t\t},\r\n\t\t\t\"this-file-is-assigned-to\": {\r\n\t\t\t\ten: \"This workout is assigned to {0} athletes.\",\r\n\t\t\t\tit: \"Questo workout è assegnato a {0} atleti.\",\r\n\t\t\t\tes: \"Este entrenamiento está asignado a {0} atletas.\",\r\n\t\t\t\tfr: \"Cet entraînement est attribué à {0} athlètes.\",\r\n\t\t\t},\r\n\t\t\thit: {\r\n\t\t\t\ten: \"hit\",\r\n\t\t\t\tit: \"colpo\",\r\n\t\t\t\tes: \"puño\",\r\n\t\t\t\tfr: \"poing\",\r\n\t\t\t},\r\n\t\t\tmode: {\r\n\t\t\t\ten: \"Mode\",\r\n\t\t\t\tit: \"Modalità\",\r\n\t\t\t\tes: \"Modo\",\r\n\t\t\t\tfr: \"Mode\",\r\n\t\t\t},\r\n\t\t\t\"visibility-days-must-be-greater-than-Booking-hours-by-24-hours\": {\r\n\t\t\t\ten: \"Visibility days must be greater than Booking hours by 24 hours.\",\r\n\t\t\t\tit: \"I giorni di visibilità devono essere superiori alle ore di prenotazione di 24 ore.\",\r\n\t\t\t\tes: \"Los días de visibilidad deben ser mayores que las horas de reserva en 24 horas.\",\r\n\t\t\t\tfr: \"Les jours de visibilité doivent être supérieurs aux heures de réservation de 24 heures.\",\r\n\t\t\t},\r\n\t\t\t\"4-week\": {\r\n\t\t\t\ten: \"4 Week\",\r\n\t\t\t\tit: \"4 Settimane\",\r\n\t\t\t\tes: \"4 Semanas\",\r\n\t\t\t\tfr: \"4 Semaines\",\r\n\t\t\t},\r\n\t\t\t\"7-days\": {\r\n\t\t\t\ten: \"7 Days\",\r\n\t\t\t\tit: \"7 Giorni\",\r\n\t\t\t\tes: \"7 Días\",\r\n\t\t\t\tfr: \"7 Jours\"\r\n\t\t\t},\r\n\t\t\tweek: {\r\n\t\t\t\ten: \"Week\",\r\n\t\t\t\tit: \"Settimana\",\r\n\t\t\t\tes: \"Semana\",\r\n\t\t\t\tfr: \"Semaine\",\r\n\t\t\t},\r\n\t\t\t\"this-week\": {\r\n\t\t\t\ten: \"This week\",\r\n\t\t\t\tit: \"Questa Settimana\",\r\n\t\t\t\tes: \"Esta semana\",\r\n\t\t\t\tfr: \"Cette semaine\",\r\n\t\t\t},\r\n\t\t\t\"single-service\": {\r\n\t\t\t\ten: \"Single Service\",\r\n\t\t\t\tit: \"Singolo Servizio\",\r\n\t\t\t\tes: \"Servicio Unico\",\r\n\t\t\t\tfr: \"Service Unique\",\r\n\t\t\t},\r\n\t\t\torigin: {\r\n\t\t\t\ten: \"Origin\",\r\n\t\t\t\tit: \"Origine\",\r\n\t\t\t\tes: \"Origen\",\r\n\t\t\t\tfr: \"Origine\",\r\n\t\t\t},\r\n\t\t\t\"select-operator\": {\r\n\t\t\t\ten: \"Select operator\",\r\n\t\t\t\tit: \"Seleziona operatore\",\r\n\t\t\t\tes: \"Seleccionar operador\",\r\n\t\t\t\tfr: \"sélectionner l'opérateur\",\r\n\t\t\t},\r\n\t\t\t\"operator-name\": {\r\n\t\t\t\ten: \"Operator name\",\r\n\t\t\t\tit: \"Nome operatore\",\r\n\t\t\t\tes: \"Nombre del operador\",\r\n\t\t\t\tfr: \"Nom de l'opérateur\",\r\n\t\t\t},\r\n\t\t\toperator: {\r\n\t\t\t\ten: \"Operator\",\r\n\t\t\t\tit: \"Operatore\",\r\n\t\t\t\tes: \"Operador\",\r\n\t\t\t\tfr: \"Opérateur\",\r\n\t\t\t},\r\n\t\t\t\"enable-uptivo-live\": {\r\n\t\t\t\ten: \"Enable Uptivo LIVE\",\r\n\t\t\t\tit: \"Abilita Uptivo LIVE\",\r\n\t\t\t\tes: \"Activar Uptivo LIVE\",\r\n\t\t\t\tfr: \"Activer Uptivo LIVE\",\r\n\t\t\t},\r\n\t\t\t\"enable-activities\": {\r\n\t\t\t\ten: \"Enable Activities\",\r\n\t\t\t\tit: \"Abilita Attività\",\r\n\t\t\t\tes: \"Activar Actividades\",\r\n\t\t\t\tfr: \"Activer Planning\",\r\n\t\t\t},\r\n\t\t\t\"enable-on-demand\": {\r\n\t\t\t\ten: \"Enable On Demand\",\r\n\t\t\t\tit: \"Abilita On Demand\",\r\n\t\t\t\tes: \"Activar On Demand\",\r\n\t\t\t\tfr: \"Activer On Demand\",\r\n\t\t\t},\r\n\t\t\t\"disable-dashboard\": {\r\n\t\t\t\ten: \"Disable Dashboard\",\r\n\t\t\t\tit: \"Disabilita Dashboard\",\r\n\t\t\t\tes: \"Deshabilitar Dashboard\",\r\n\t\t\t\tfr: \"Désactiver Dashboard\",\r\n\t\t\t},\r\n\t\t\tsubscriptions: {\r\n\t\t\t\ten: \"Subscriptions\",\r\n\t\t\t\tit: \"Abbonamenti\",\r\n\t\t\t\tes: \"Suscripciones\",\r\n\t\t\t\tfr: \"Abonnements\",\r\n\t\t\t},\r\n\t\t\t\"uptivo-on-demand\": {\r\n\t\t\t\ten: \"On Demand\",\r\n\t\t\t\tit: \"On Demand\",\r\n\t\t\t\tes: \"On Demand\",\r\n\t\t\t\tfr: \"On Demand\",\r\n\t\t\t},\r\n\t\t\t\"sensor-already-associated\": {\r\n\t\t\t\ten: \"Sensor Already Associated\",\r\n\t\t\t\tit: \"Sensore Già Associato\",\r\n\t\t\t\tes: \"Sensor Ya Asociado\",\r\n\t\t\t\tfr: \"Capteur Déjà Associé\",\r\n\t\t\t},\r\n\t\t\t\"associate-anyway\": {\r\n\t\t\t\ten: \"Associate Anyway\",\r\n\t\t\t\tit: \"Associa Comunque\",\r\n\t\t\t\tes: \"Asociar Igualmente\",\r\n\t\t\t\tfr: \"Associer Quand Même\",\r\n\t\t\t},\r\n\t\t\t\"this-sensor-is-already-associated-with-these-club-users\": {\r\n\t\t\t\ten: \"This sensor is already associated with these club users. \\n If you proceed, the sensor will be disassociated from the other users.\",\r\n\t\t\t\tit: \"Questo sensore risulta già associato a questi utenti del club. \\n Se si procede, il sensore verrà dissociato dagli altri utenti.\",\r\n\t\t\t\tes: \"Este sensor ya está asociado con estos usuarios del club. \\n Si continúa, el sensor se desvinculará de los demás usuarios.\",\r\n\t\t\t\tfr: \"Ce capteur est déjà associé à ces utilisateurs du club. \\n Si vous continuez, le capteur sera dissocié des autres utilisateurs.\",\r\n\t\t\t},\r\n\t\t\t\"this-sensor-is-already-associated-with-this-user\": {\r\n\t\t\t\ten: \"This sensor is already associated with this user.\",\r\n\t\t\t\tit: \"Questo sensore risulta già associato a questo utente\",\r\n\t\t\t\tes: \"Este sensor ya está asociado con este usuario.\",\r\n\t\t\t\tfr: \"Ce capteur est déjà associé à cet utilisateur.\",\r\n\t\t\t},\r\n\t\t\tassociate: {\r\n\t\t\t\ten: \"Associate\",\r\n\t\t\t\tit: \"Associa\",\r\n\t\t\t\tes: \"Asociar\",\r\n\t\t\t\tfr: \"Associer\",\r\n\t\t\t},\r\n\t\t\t\"invite-user\": {\r\n\t\t\t\ten: \"Invite User\",\r\n\t\t\t\tit: \"Invita Utente\",\r\n\t\t\t\tes: \"Invitar usuario\",\r\n\t\t\t\tfr: \"Inviter un utilisateur\",\r\n\t\t\t},\r\n\t\t\tcreate: {\r\n\t\t\t\ten: \"Create\",\r\n\t\t\t\tit: \"Crea\",\r\n\t\t\t\tes: \"Crear\",\r\n\t\t\t\tfr: \"Créer\",\r\n\t\t\t},\r\n\t\t\texpired: {\r\n\t\t\t\ten: \"Expired\",\r\n\t\t\t\tit: \"Scaduto\",\r\n\t\t\t\tes: \"Caducado\",\r\n\t\t\t\tfr: \"Expiré\",\r\n\t\t\t},\r\n\t\t\ttime: {\r\n\t\t\t\ten: \"Time\",\r\n\t\t\t\tit: \"Tempo\",\r\n\t\t\t\tes: \"Tiempo\",\r\n\t\t\t\tfr: \"Temps\",\r\n\t\t\t},\r\n\t\t\tora: {\r\n\t\t\t\ten: \"Hour\",\r\n\t\t\t\tit: \"Ora\",\r\n\t\t\t\tes: \"Hora\",\r\n\t\t\t\tfr: \"Heure\",\r\n\t\t\t},\r\n\t\t\thide: {\r\n\t\t\t\ten: \"Hide\",\r\n\t\t\t\tit: \"Nascondi\",\r\n\t\t\t\tes: \"Ocultar\",\r\n\t\t\t\tfr: \"Masquer\",\r\n\t\t\t},\r\n\t\t\tspeed: {\r\n\t\t\t\ten: \"Speed\",\r\n\t\t\t\tit: \"Velocità\",\r\n\t\t\t\tes: \"Velocidad\",\r\n\t\t\t\tfr: \"Vitesse\",\r\n\t\t\t},\r\n\t\t\tenable: {\r\n\t\t\t\ten: \"Enable\",\r\n\t\t\t\tit: \"Abilita\",\r\n\t\t\t\tes: \"Activar\",\r\n\t\t\t\tfr: \"Activer\",\r\n\t\t\t},\r\n\t\t\tdisable: {\r\n\t\t\t\t\"en\": \"Disable\",\r\n\t\t\t\t\"it\": \"Disabilita\",\r\n\t\t\t\t\"es\": \"Desactivar\",\r\n\t\t\t\t\"fr\": \"Désactiver\"\r\n\t\t\t},\r\n\t\t\tunlimited: {\r\n\t\t\t\ten: \"Unlimited\",\r\n\t\t\t\tit: \"Illimitato\",\r\n\t\t\t\tes: \"Ilimitada\",\r\n\t\t\t\tfr: \"Illimité\",\r\n\t\t\t},\r\n\t\t\t\"create-new\": {\r\n\t\t\t\ten: \"Create a new\",\r\n\t\t\t\tit: \"Crea un nuovo\",\r\n\t\t\t\tes: \"Crea un nuevo\",\r\n\t\t\t\tfr: \"Créer un nouveau\",\r\n\t\t\t},\r\n\t\t\t\"club-message\": {\r\n\t\t\t\ten: \"Message\",\r\n\t\t\t\tit: \"Messaggio\",\r\n\t\t\t\tes: \"Mensaje\",\r\n\t\t\t\tfr: \"Message\",\r\n\t\t\t},\r\n\t\t\t\"no-club-messages\": {\r\n\t\t\t\ten: \"There are no Message Templates set.\",\r\n\t\t\t\tit: \"Non ci sono modelli di messaggio impostati.\",\r\n\t\t\t\tes: \"No hay plantillas de mensaje establecidas.\",\r\n\t\t\t\tfr: \"Il n'y a pas de modèles de message définis.\",\r\n\t\t\t},\r\n\t\t\t\"select-message\": {\r\n\t\t\t\ten: \"Select a message\",\r\n\t\t\t\tit: \"Seleziona un messaggio\",\r\n\t\t\t\tes: \"Selecciona un mensaje\",\r\n\t\t\t\tfr: \"Sélectionnez un message\",\r\n\t\t\t},\r\n\t\t\t\"activities-not-enabled-club\": {\r\n\t\t\t\ten: \"Activities are not enabled for the selected club.\",\r\n\t\t\t\tit: \"Le attività non sono abilitate nel club selezionato.\",\r\n\t\t\t\tes: \"Las actividades no están habilitadas en el club seleccionado.\",\r\n\t\t\t\tfr: \"Les activités ne sont pas activées dans le club sélectionné.\",\r\n\t\t\t},\r\n\t\t\t\"dashboard-not-enabled-club\": {\r\n\t\t\t\ten: \"The dashboard is not enabled in the selected club.\",\r\n\t\t\t\tit: \"La dashboard non è abilitata nel club selezionato.\",\r\n\t\t\t\tes: \"El panel de control no está habilitado en el club seleccionado.\",\r\n\t\t\t\tfr: \"Le tableau de bord n'est pas activé dans le club sélectionné.\",\r\n\t\t\t},\r\n\t\t\t\"total-space-used\": {\r\n\t\t\t\ten: \"Total space used: \",\r\n\t\t\t\tit: \"Spazio totale utilizzato: \",\r\n\t\t\t\tes: \"Espacio total utilizado: \",\r\n\t\t\t\tfr: \"Espace total utilisé: \",\r\n\t\t\t},\r\n\t\t\t\"folder-space-used\": {\r\n\t\t\t\ten: \"Space used by the folder \",\r\n\t\t\t\tit: \"Spazio utilizzato dalla cartella: \",\r\n\t\t\t\tes: \"Espacio utilizado por la carpeta: \",\r\n\t\t\t\tfr: \"Espace utilisé par le dossier: \",\r\n\t\t\t},\r\n\t\t\tbiometrics: {\r\n\t\t\t\ten: \"Biometrics\",\r\n\t\t\t\tit: \"Biometriche\",\r\n\t\t\t\tes: \"Biometría\",\r\n\t\t\t\tfr: \"Biométrie\",\r\n\t\t\t},\r\n\t\t\t\"add-measurements\": {\r\n\t\t\t\ten: \"Create measurements\",\r\n\t\t\t\tit: \"Crea misurazioni\",\r\n\t\t\t\tes: \"Crear medidas\",\r\n\t\t\t\tfr: \"Créer des mesures\",\r\n\t\t\t},\r\n\t\t\tany: {\r\n\t\t\t\ten: \"All\",\r\n\t\t\t\tit: \"Tutti\",\r\n\t\t\t\tes: \"Todos\",\r\n\t\t\t\tfr: \"Tous\",\r\n\t\t\t},\r\n\t\t\t\"new-tag\": {\r\n\t\t\t\ten: \"New Group\",\r\n\t\t\t\tit: \"Nuovo Gruppo\",\r\n\t\t\t\tes: \"Nuevo Grupo\",\r\n\t\t\t\tfr: \"Nouveau Groupe\",\r\n\t\t\t},\r\n\t\t\t\"no-tags-defined\": {\r\n\t\t\t\ten: \"You haven't defined any groups yet.\",\r\n\t\t\t\tit: \"Non hai ancora definito nessun gruppo.\",\r\n\t\t\t\tes: \"Aún no has definido ningún grupo.\",\r\n\t\t\t\tfr: \"Vous n'avez encore défini aucun groupe.\",\r\n\t\t\t},\r\n\t\t\t\"define-tags-help\": {\r\n\t\t\t\ten: \"Go to Club Settings to create nee groups and organize your members into groups.\",\r\n\t\t\t\tit: \"Vai in Club Impostazioni per creare nuovi gruppi e organizzare i tuoi membri in gruppi.\",\r\n\t\t\t\tes: \"Vaya a Club Ajustes para crear nuevos grupos y organizar a sus miembros en grupos.\",\r\n\t\t\t\tfr: \"Accédez à Club Réglages pour créer de nouveaux groupes et organiser vos membres en groupes.\",\r\n\t\t\t},\r\n\t\t\t\"select-tags\": {\r\n\t\t\t\ten: \"Filter By Groups\",\r\n\t\t\t\tit: \"Filtra Per Gruppi\",\r\n\t\t\t\tes: \"Filtrar Por Grupos\",\r\n\t\t\t\tfr: \"Filtrer Par Groupes\",\r\n\t\t\t},\r\n\t\t\t\"edit-training\": {\r\n\t\t\t\ten: \"Edit training\",\r\n\t\t\t\tit: \"Modifica allenamento\",\r\n\t\t\t\tes: \"Editar entrenamiento\",\r\n\t\t\t\tfr: \"Modifier l'entraînement\",\r\n\t\t\t},\r\n\t\t\ttrainings: {\r\n\t\t\t\ten: \"Trainings\",\r\n\t\t\t\tit: \"Allenamenti\",\r\n\t\t\t\tes: \"Entrenamientos\",\r\n\t\t\t\tfr: \"Entraînements\",\r\n\t\t\t},\r\n\t\t\tathletes: {\r\n\t\t\t\ten: \"Athletes\",\r\n\t\t\t\tit: \"Atleti\",\r\n\t\t\t\tes: \"Deportistas\",\r\n\t\t\t\tfr: \"Athlètes\",\r\n\t\t\t},\r\n\t\t\troles: {\r\n\t\t\t\ten: \"Roles\",\r\n\t\t\t\tit: \"Ruoli\",\r\n\t\t\t\tes: \"Roles\",\r\n\t\t\t\tfr: \"Rôles\",\r\n\t\t\t},\r\n\t\t\tversion: {\r\n\t\t\t\ten: \"Version\",\r\n\t\t\t\tit: \"Versione\",\r\n\t\t\t\tes: \"Versión\",\r\n\t\t\t\tfr: \"Version\",\r\n\t\t\t},\r\n\t\t\tnotes: {\r\n\t\t\t\ten: \"Notes\",\r\n\t\t\t\tit: \"Note\",\r\n\t\t\t\tes: \"Notas\",\r\n\t\t\t\tfr: \"Notes\",\r\n\t\t\t},\r\n\t\t\tview: {\r\n\t\t\t\ten: \"View\",\r\n\t\t\t\tit: \"Vedi\",\r\n\t\t\t\tes: \"Ver\",\r\n\t\t\t\tfr: \"Voir\",\r\n\t\t\t},\r\n\t\t\t\"shares-count\": {\r\n\t\t\t\ten: \"{0} shares\",\r\n\t\t\t\tit: \"{0} condivisioni\",\r\n\t\t\t\tes: \"{0} repartos\",\r\n\t\t\t\tfr: \"{0} partages\",\r\n\t\t\t},\r\n\t\t\t\"assign-tags\": {\r\n\t\t\t\ten: \"Add Gropus\",\r\n\t\t\t\tit: \"Aggiungi Gruppi\",\r\n\t\t\t\tes: \"Añadir Grupos\",\r\n\t\t\t\tfr: \"Ajouter Groupes\",\r\n\t\t\t},\r\n\t\t\t\"remove-tags\": {\r\n\t\t\t\ten: \"Remove Gropus\",\r\n\t\t\t\tit: \"Rimuovi Gruppi\",\r\n\t\t\t\tes: \"Quitar Grupos\",\r\n\t\t\t\tfr: \"Retirer Groupes\",\r\n\t\t\t},\r\n\t\t\t\"assign-tags-result\": {\r\n\t\t\t\ten: \"{0} users were added to the group.\",\r\n\t\t\t\tit: \"{0} utenti sono stati aggiunti al gruppo.\",\r\n\t\t\t\tes: \"Se agregaron {0} usuarios al grupo.\",\r\n\t\t\t\tfr: \"{0} utilisateurs ont été ajoutés au groupe.\",\r\n\t\t\t},\r\n\t\t\t\"remove-tags-result\": {\r\n\t\t\t\ten: \"{0} users were removed from the group.\",\r\n\t\t\t\tit: \"{0} utenti sono stati rimossi dal gruppo\",\r\n\t\t\t\tes: \"Se han eliminado {0} grupos.\",\r\n\t\t\t\tfr: \"{0} étiquettes ont été groupes\",\r\n\t\t\t},\r\n\t\t\t\"send-message-result\": {\r\n\t\t\t\ten: \"The message has been sent to {0} athletes.\",\r\n\t\t\t\tit: \"Il messaggio è stato inviato a {0} atleti.\",\r\n\t\t\t\tes: \"{0} usuarios fueron eliminados del grupo.\",\r\n\t\t\t\tfr: \"{0} utilisateurs ont été supprimés du groupe.\",\r\n\t\t\t},\r\n\t\t\t\"share-training-program-result\": {\r\n\t\t\t\ten: \"The program has been shared with {0} athletes (out of {1})\",\r\n\t\t\t\tit: \"Il programma è stato condiviso con {0} atleti (su {1})\",\r\n\t\t\t\tes: \"El programa fue compartido con {0} atletas (de {1})\",\r\n\t\t\t\tfr: \"Le programme a été partagé avec {0} athlètes (sur {1})\",\r\n\t\t\t},\r\n\t\t\t\"unshare-training-program-result\": {\r\n\t\t\t\ten: \"Sharing has been removed from {0} athletes (out of {1})\",\r\n\t\t\t\tit: \"La condivisione è stata rimossa da {0} atleti (su {1})\",\r\n\t\t\t\tes: \"Compartir ha sido eliminado por {0} atletas (de {1})\",\r\n\t\t\t\tfr: \"Le partage a été supprimé par {0} athlètes (sur {1})\",\r\n\t\t\t},\r\n\t\t\tsend: {\r\n\t\t\t\ten: \"Send\",\r\n\t\t\t\tit: \"Invia\",\r\n\t\t\t\tes: \"Enviar\",\r\n\t\t\t\tfr: \"Envoyer\",\r\n\t\t\t},\r\n\t\t\t\"send-message\": {\r\n\t\t\t\ten: \"Send Message\",\r\n\t\t\t\tit: \"Invia Messaggio\",\r\n\t\t\t\tes: \"Enviar Mensaje\",\r\n\t\t\t\tfr: \"Envoyer Message\",\r\n\t\t\t},\r\n\t\t\t\"share-training-program\": {\r\n\t\t\t\ten: \"Share a Workout Program\",\r\n\t\t\t\tit: \"Condividi Programma di Allenamento\",\r\n\t\t\t\tes: \"Compartir Programa de Entrenamiento\",\r\n\t\t\t\tfr: \"Partager Programmes d'Entraînement\",\r\n\t\t\t},\r\n\t\t\tshare: {\r\n\t\t\t\ten: \"Share\",\r\n\t\t\t\tit: \"Condividi\",\r\n\t\t\t\tes: \"Compartir\",\r\n\t\t\t\tfr: \"Partager\",\r\n\t\t\t},\r\n\t\t\tunshare: {\r\n\t\t\t\ten: \"Remove Sharing\",\r\n\t\t\t\tit: \"Rimuovi Condivisione\",\r\n\t\t\t\tes: \"Dejar de compartir\",\r\n\t\t\t\tfr: \"Ne pas partager\",\r\n\t\t\t},\r\n\t\t\tprogress: {\r\n\t\t\t\ten: \"Progress\",\r\n\t\t\t\tit: \"Progresso\",\r\n\t\t\t\tes: \"Progreso\",\r\n\t\t\t\tfr: \"Progrès\",\r\n\t\t\t},\r\n\t\t\tmin: {\r\n\t\t\t\ten: \"Min Value\",\r\n\t\t\t\tit: \"Minimo\",\r\n\t\t\t\tes: \"Valor mínimo\",\r\n\t\t\t\tfr: \"Valeur minimale\",\r\n\t\t\t},\r\n\t\t\tavg: {\r\n\t\t\t\ten: \"Average\",\r\n\t\t\t\tit: \"Media\",\r\n\t\t\t\tes: \"Promedio\",\r\n\t\t\t\tfr: \"Moyen\",\r\n\t\t\t},\r\n\t\t\tmax: {\r\n\t\t\t\ten: \"Max\",\r\n\t\t\t\tit: \"Massimo\",\r\n\t\t\t\tes: \"Máximo\",\r\n\t\t\t\tfr: \"Maximale\",\r\n\t\t\t},\r\n\t\t\t\"invalid-range-error\": {\r\n\t\t\t\ten: \"The entered range is invalid\",\r\n\t\t\t\tit: \"L'intervallo inserito non è valido\",\r\n\t\t\t\tes: \"El rango introducido no es válido\",\r\n\t\t\t\tfr: \"La plage entrée est invalide\",\r\n\t\t\t},\r\n\t\t\t\"invalid-name\": {\r\n\t\t\t\ten: \"Invalid name\",\r\n\t\t\t\tit: \"Nome non valido\",\r\n\t\t\t\tes: \"Nombre inválido\",\r\n\t\t\t\tfr: \"Nom invalide\",\r\n\t\t\t},\r\n\t\t\t\"creation-date\": {\r\n\t\t\t\ten: \"Creation date\",\r\n\t\t\t\tit: \"Data Creazione\",\r\n\t\t\t\tes: \"Fecha creación\",\r\n\t\t\t\tfr: \"Date création\",\r\n\t\t\t},\r\n\t\t\t\"modification-date\": {\r\n\t\t\t\ten: \"Modification date\",\r\n\t\t\t\tit: \"Data Modifica\",\r\n\t\t\t\tes: \"Fecha modificación\",\r\n\t\t\t\tfr: \"Date modification\",\r\n\t\t\t},\r\n\t\t\t\"check-browser-settings\": {\r\n\t\t\t\ten: \"
It seems that some settings on your browser are preventing this app from working properly.
Please check your security settings and verify that cookies are enabled strong>, then reload this page.
\",\r\n\t\t\t\tit: \"Sembra che alcune impostazioni del tuo browser stiano impedendo il corretto funzionamento di questa app.
Per favore controlla le impostazioni di sicurezza e verifica che i cookie siano abilitati, poi ricarica questa pagina.
\",\r\n\t\t\t\tes: \"Parece que algunas configuraciones en su navegador están impidiendo que esta aplicación funcione correctamente.
Verifique sus configuraciones de seguridad y verifique que las cookies estén habilitadas, luego vuelve a cargar esta página.
\",\r\n\t\t\t\tfr: \"Il semble que certains paramètres de votre navigateur empêchent cette application de fonctionner correctement.
Vérifiez vos paramètres de sécurité et vérifiez que les cookies sont activés, puis rechargez cette page.
\",\r\n\t\t\t},\r\n\t\t\t\"open-bridge\": {\r\n\t\t\t\ten: \"Open Bridge\",\r\n\t\t\t\tit: \"Apri Bridge\",\r\n\t\t\t\tes: \"Abre Bridge\",\r\n\t\t\t\tfr: \"Ouvrez Bridge\",\r\n\t\t\t},\r\n\t\t\t\"open-rooms-totem\": {\r\n\t\t\t\ten: \"Room Display\",\r\n\t\t\t\tit: \"Display Sale\",\r\n\t\t\t\tes: \"Room Display\",\r\n\t\t\t\tfr: \"Room Display\",\r\n\t\t\t},\r\n\t\t\t\"open-boxing-totem\": {\r\n\t\t\t\ten: \"Boxing Display\",\r\n\t\t\t\tit: \"Display Boxing\",\r\n\t\t\t\tes: \"Boxing Display\",\r\n\t\t\t\tfr: \"Boxing Display\",\r\n\t\t\t},\r\n\t\t\t\"check-connections\": {\r\n\t\t\t\ten: \"Check Connections\",\r\n\t\t\t\tit: \"Controlla le connessioni\",\r\n\t\t\t\tes: \"Comprobar las conexiones\",\r\n\t\t\t\tfr: \"Vérifiez les connexions\",\r\n\t\t\t},\r\n\t\t\t\"time-range\": {\r\n\t\t\t\ten: \"Time Range\",\r\n\t\t\t\tit: \"Intervallo temporale\",\r\n\t\t\t\tes: \"Intervalo de tiempo\",\r\n\t\t\t\tfr: \"Intervalle de temps\",\r\n\t\t\t},\r\n\t\t\trange: {\r\n\t\t\t\ten: \"Range\",\r\n\t\t\t\tit: \"Intervallo\",\r\n\t\t\t\tes: \"Intervalo\",\r\n\t\t\t\tfr: \"Intervalle\",\r\n\t\t\t},\r\n\t\t\t\"activation-date\": {\r\n\t\t\t\ten: \"Activation Date\",\r\n\t\t\t\tit: \"Data Attivazione\",\r\n\t\t\t\tes: \"Fecha de activación\",\r\n\t\t\t\tfr: \"Date d’activation\",\r\n\t\t\t},\r\n\t\t\t\"deactivation-date\": {\r\n\t\t\t\ten: \"Deactivation Date\",\r\n\t\t\t\tit: \"Data Disattivazione\",\r\n\t\t\t\tes: \"Fecha de desactivación\",\r\n\t\t\t\tfr: \"Date de désactivation\",\r\n\t\t\t},\r\n\t\t\t\"expiration-date\": {\r\n\t\t\t\ten: \"Expiration Date\",\r\n\t\t\t\tit: \"Data Scadenza\",\r\n\t\t\t\tes: \"Fecha De Expiración\",\r\n\t\t\t\tfr: \"Date d'Expiration\",\r\n\t\t\t},\r\n\t\t\trecurring: {\r\n\t\t\t\ten: \"Recurring\",\r\n\t\t\t\tit: \"Ricorrente\",\r\n\t\t\t\tes: \"Recurrente\",\r\n\t\t\t\tfr: \"Récurrent\",\r\n\t\t\t},\r\n\t\t\trecurrence: {\r\n\t\t\t\ten: \"Recurrence\",\r\n\t\t\t\tit: \"Ricorrenza\",\r\n\t\t\t\tes: \"Frequencia\",\r\n\t\t\t\tfr: \"Récurrence \",\r\n\t\t\t},\r\n\t\t\tinstallments: {\r\n\t\t\t\ten: \"Installments\",\r\n\t\t\t\tit: \"Rate\",\r\n\t\t\t\tes: \"Cuotas\",\r\n\t\t\t\tfr: \"Versements\",\r\n\t\t\t},\r\n\t\t\t\"installment-price\": {\r\n\t\t\t\ten: \"Installment Price\",\r\n\t\t\t\tit: \"Prezzo Rate\",\r\n\t\t\t\tes: \"Precio a plazos\",\r\n\t\t\t\tfr: \"Prix d'acompte\",\r\n\t\t\t},\r\n\t\t\tinvoices: {\r\n\t\t\t\ten: \"Invoices\",\r\n\t\t\t\tit: \"Pagamenti\",\r\n\t\t\t\tes: \"Pagos\",\r\n\t\t\t\tfr: \"Paiements\",\r\n\t\t\t},\r\n\t\t\tamount: {\r\n\t\t\t\ten: \"Amount\",\r\n\t\t\t\tit: \"Importo\",\r\n\t\t\t\tes: \"Cantidad\",\r\n\t\t\t\tfr: \"Montant\",\r\n\t\t\t},\r\n\t\t\t\"scheduled-end-date\": {\r\n\t\t\t\ten: \"Scheduled End\",\r\n\t\t\t\tit: \"Termine Programmato\",\r\n\t\t\t\tes: \"Término programado\",\r\n\t\t\t\tfr: \"Terme prévu\",\r\n\t\t\t},\r\n\t\t\tdisabled: {\r\n\t\t\t\ten: \"Disabled\",\r\n\t\t\t\tit: \"Non attivo\",\r\n\t\t\t\tes: \"Inhabilitado\",\r\n\t\t\t\tfr: \"Désactivée\",\r\n\t\t\t},\r\n\t\t\t\"mark-as-complete\": {\r\n\t\t\t\ten: \"Mark as complete?\",\r\n\t\t\t\tit: \"Segna come completato?\",\r\n\t\t\t\tes: \"¿Marcar como completo?\",\r\n\t\t\t\tfr: \"Marquer comme terminé ?\",\r\n\t\t\t},\r\n\t\t\t\"enter-valid-duration\": {\r\n\t\t\t\ten: \"Enter a valid duration value\",\r\n\t\t\t\tit: \"Inserisci un valore di durata valido\",\r\n\t\t\t\tes: \"Ingrese un valor de duración válido\",\r\n\t\t\t\tfr: \"Entrez une valeur de durée valide\",\r\n\t\t\t},\r\n\t\t\t\"assigned-to\": {\r\n\t\t\t\ten: \"Assigned To\",\r\n\t\t\t\tit: \"Assegnato A\",\r\n\t\t\t\tes: \"Asignado A\",\r\n\t\t\t\tfr: \"Assigné A\",\r\n\t\t\t},\r\n\t\t\t\"show-tasks-assigned-to-me\": {\r\n\t\t\t\ten: \"Show My Tasks\",\r\n\t\t\t\tit: \"Mostra i Miei Tasks\",\r\n\t\t\t\tes: \"Mostrar mis Tasks\",\r\n\t\t\t\tfr: \"Afficher Mes Tasks\",\r\n\t\t\t},\r\n\t\t\tconfirm: {\r\n\t\t\t\ten: \"Confirm\",\r\n\t\t\t\tit: \"Conferma\",\r\n\t\t\t\tes: \"Confirmar\",\r\n\t\t\t\tfr: \"Confirmer\",\r\n\t\t\t},\r\n\t\t\tedit: {\r\n\t\t\t\ten: \"Edit\",\r\n\t\t\t\tit: \"Modifica\",\r\n\t\t\t\tes: \"Editar\",\r\n\t\t\t\tfr: \"Modifier\",\r\n\t\t\t},\r\n\t\t\tremove: {\r\n\t\t\t\ten: \"Remove\",\r\n\t\t\t\tit: \"Rimuovi\",\r\n\t\t\t\tes: \"Quitar\",\r\n\t\t\t\tfr: \"Retirer\",\r\n\t\t\t},\r\n\t\t\ttarget: {\r\n\t\t\t\ten: \"Target\",\r\n\t\t\t\tit: \"Obiettivo\",\r\n\t\t\t\tes: \"Objetivo\",\r\n\t\t\t\tfr: \"Objectif\",\r\n\t\t\t},\r\n\t\t\ttargets: {\r\n\t\t\t\ten: \"Targets\",\r\n\t\t\t\tit: \"Obiettivi\",\r\n\t\t\t\tes: \"Objetivos\",\r\n\t\t\t\tfr: \"Objectifs\",\r\n\t\t\t},\r\n\t\t\ttoday: {\r\n\t\t\t\ten: \"Today\",\r\n\t\t\t\tit: \"Oggi\",\r\n\t\t\t\tes: \"Hoy\",\r\n\t\t\t\tfr: \"Aujourd'hui\",\r\n\t\t\t},\r\n\t\t\tpower: {\r\n\t\t\t\ten: \"Power\",\r\n\t\t\t\tit: \"Potenza\",\r\n\t\t\t\tes: \"Potencia\",\r\n\t\t\t\tfr: \"Puissance\",\r\n\t\t\t},\r\n\t\t\tforce: {\r\n\t\t\t\ten: \"Force\",\r\n\t\t\t\tit: \"Forza\",\r\n\t\t\t\tes: \"Fuerza\",\r\n\t\t\t\tfr: \"Force\",\r\n\t\t\t},\r\n\t\t\tbpm: {\r\n\t\t\t\ten: \"bpm\",\r\n\t\t\t\tit: \"bpm\",\r\n\t\t\t\tes: \"lpm\",\r\n\t\t\t\tfr: \"bpm\",\r\n\t\t\t},\r\n\t\t\t\"bpm-avg\": {\r\n\t\t\t\ten: \"bpm (avg)\",\r\n\t\t\t\tit: \"bpm (med)\",\r\n\t\t\t\tes: \"lpm (promedio)\",\r\n\t\t\t\tfr: \"bpm (moy.)\",\r\n\t\t\t},\r\n\t\t\t\"max-speed\": {\r\n\t\t\t\ten: \"Max Speed\",\r\n\t\t\t\tit: \"Max Velocità\",\r\n\t\t\t\tes: \"Velocidad máx.\",\r\n\t\t\t\tfr: \"Vitesse max.\",\r\n\t\t\t},\r\n\t\t\t\"total-calories\": {\r\n\t\t\t\ten: \"total calories\",\r\n\t\t\t\tit: \"calorie totali\",\r\n\t\t\t\tes: \"calorías totales\",\r\n\t\t\t\tfr: \"total de calories\",\r\n\t\t\t},\r\n\t\t\t\"heart-rate-zones\": {\r\n\t\t\t\ten: \"Heart Rate Zones\",\r\n\t\t\t\tit: \"Zone Cardio\",\r\n\t\t\t\tes: \"Zonas de Frecuencia Cardíaca\",\r\n\t\t\t\tfr: \"Zones de fréquence cardiaque\",\r\n\t\t\t},\r\n\t\t\t\"power-zones\": {\r\n\t\t\t\ten: \"Power Zones\",\r\n\t\t\t\tit: \"Zone Power\",\r\n\t\t\t\tes: \"Zonas de Potencia\",\r\n\t\t\t\tfr: \"Zones de puissance\",\r\n\t\t\t},\r\n\t\t\ttotal: {\r\n\t\t\t\ten: \"Total\",\r\n\t\t\t\tit: \"Totale\",\r\n\t\t\t\tes: \"Total\",\r\n\t\t\t\tfr: \"Total\",\r\n\t\t\t},\r\n\t\t\t\"device-id\": {\r\n\t\t\t\ten: \"Device Id\",\r\n\t\t\t\tit: \"Id dispositivo\",\r\n\t\t\t\tes: \"ID del dispositivo\",\r\n\t\t\t\tfr: \"Identifiant de l’appareil\",\r\n\t\t\t},\r\n\t\t\t\"ht-id-left\": {\r\n\t\t\t\ten: \"(Red) AL-\",\r\n\t\t\t\tit: \"(Rosso) AL-\",\r\n\t\t\t\tes: \"(Rojo) AL-\",\r\n\t\t\t\tfr: \"(Rouge) AL-\",\r\n\t\t\t},\r\n\t\t\t\"ht-id-right\": {\r\n\t\t\t\ten: \"(Yellow) AR-\",\r\n\t\t\t\tit: \"(Giallo) AR-\",\r\n\t\t\t\tes: \"(Amarillo) AR-\",\r\n\t\t\t\tfr: \"(Jaune) AR-\",\r\n\t\t\t},\r\n\t\t\tusers: {\r\n\t\t\t\ten: \"Users\",\r\n\t\t\t\tit: \"Utenti\",\r\n\t\t\t\tes: \"Usuarios\",\r\n\t\t\t\tfr: \"Utilisateurs\",\r\n\t\t\t},\r\n\t\t\tmeasure: {\r\n\t\t\t\ten: \"Measure\",\r\n\t\t\t\tit: \"Misura\",\r\n\t\t\t\tes: \"Medida\",\r\n\t\t\t\tfr: \"Mesure\",\r\n\t\t\t},\r\n\t\t\tvalue: {\r\n\t\t\t\ten: \"Value\",\r\n\t\t\t\tit: \"Valore\",\r\n\t\t\t\tes: \"Valor\",\r\n\t\t\t\tfr: \"Valeur\",\r\n\t\t\t},\r\n\t\t\tselect: {\r\n\t\t\t\ten: \"Select\",\r\n\t\t\t\tit: \"Seleziona\",\r\n\t\t\t\tes: \"Seleccionar\",\r\n\t\t\t\tfr: \"Sélectionner\",\r\n\t\t\t},\r\n\t\t\t\"change-display-group\": {\r\n\t\t\t\ten: \"Change Room\",\r\n\t\t\t\tit: \"Cambia Sala\",\r\n\t\t\t\tes: \"Cambiar Sala\",\r\n\t\t\t\tfr: \"Modifier Salle\",\r\n\t\t\t},\r\n\t\t\texport: {\r\n\t\t\t\ten: \"Export\",\r\n\t\t\t\tit: \"Esporta\",\r\n\t\t\t\tes: \"Exportar\",\r\n\t\t\t\tfr: \"Exporter\",\r\n\t\t\t},\r\n\t\t\trole: {\r\n\t\t\t\ten: \"Role\",\r\n\t\t\t\tit: \"Ruolo\",\r\n\t\t\t\tes: \"Oficio\",\r\n\t\t\t\tfr: \"Rôle\",\r\n\t\t\t},\r\n\t\t\tprint: {\r\n\t\t\t\ten: \"Print\",\r\n\t\t\t\tit: \"Stampa\",\r\n\t\t\t\tes: \"Imprimir\",\r\n\t\t\t\tfr: \"Imprimer\",\r\n\t\t\t},\r\n\t\t\t\"go-to\": {\r\n\t\t\t\ten: \"Go to…\",\r\n\t\t\t\tit: \"Vai a…\",\r\n\t\t\t\tes: \"Ir…\",\r\n\t\t\t\tfr: \"Aller à…\",\r\n\t\t\t},\r\n\t\t\tactions: {\r\n\t\t\t\ten: \"Actions\",\r\n\t\t\t\tit: \"Azioni\",\r\n\t\t\t\tes: \"Acciones\",\r\n\t\t\t\tfr: \"Actions\",\r\n\t\t\t},\r\n\t\t\tfollow: {\r\n\t\t\t\ten: \"Follow\",\r\n\t\t\t\tit: \"Segui\",\r\n\t\t\t\tes: \"Seguir\",\r\n\t\t\t\tfr: \"Suivre\",\r\n\t\t\t},\r\n\t\t\tuser: {\r\n\t\t\t\ten: \"User\",\r\n\t\t\t\tit: \"Utente\",\r\n\t\t\t\tes: \"Usuario\",\r\n\t\t\t\tfr: \"Utilisateur\",\r\n\t\t\t},\r\n\t\t\tleft: {\r\n\t\t\t\ten: \"Left\",\r\n\t\t\t\tit: \"Sinistra\",\r\n\t\t\t\tes: \"Izquierda\",\r\n\t\t\t\tfr: \"Gauche\",\r\n\t\t\t},\r\n\t\t\tright: {\r\n\t\t\t\ten: \"Right\",\r\n\t\t\t\tit: \"Destra\",\r\n\t\t\t\tes: \"Derecha\",\r\n\t\t\t\tfr: \"Droite\",\r\n\t\t\t},\r\n\t\t\t\"full-name\": {\r\n\t\t\t\ten: \"Full Name\",\r\n\t\t\t\tit: \"Nome Completo\",\r\n\t\t\t\tes: \"Nombre completo\",\r\n\t\t\t\tfr: \"Nom complet\",\r\n\t\t\t},\r\n\t\t\t\"date-time\": {\r\n\t\t\t\ten: \"Date/time\",\r\n\t\t\t\tit: \"Data/ora\",\r\n\t\t\t\tes: \"Fecha/hora\",\r\n\t\t\t\tfr: \"Date/Heure\",\r\n\t\t\t},\r\n\t\t\t\"dont-follow\": {\r\n\t\t\t\ten: \"Stop Following\",\r\n\t\t\t\tit: \"Non Seguire\",\r\n\t\t\t\tes: \"No Seguir\",\r\n\t\t\t\tfr: \"Ne Pas Suivre\",\r\n\t\t\t},\r\n\t\t\twatch: {\r\n\t\t\t\ten: \"Get Notifications\",\r\n\t\t\t\tit: \"Ricevi Notifiche\",\r\n\t\t\t\tes: \"Recibir notificaciones\",\r\n\t\t\t\tfr: \"Recevoir des notifications\",\r\n\t\t\t},\r\n\t\t\ttrainer: {\r\n\t\t\t\ten: \"Trainer\",\r\n\t\t\t\tit: \"Trainer\",\r\n\t\t\t\tes: \"Entrenador\",\r\n\t\t\t\tfr: \"Entraîneur\",\r\n\t\t\t},\r\n\t\t\t\"trainer-operator\": {\r\n\t\t\t\ten: \"Trainer / Operator\",\r\n\t\t\t\tit: \"Trainer / Operatore\",\r\n\t\t\t\tes: \"Entrenador / Operador\",\r\n\t\t\t\tfr: \"Formateur / Opérateur\",\r\n\t\t\t},\r\n\t\t\ttrainers: {\r\n\t\t\t\ten: \"Trainers\",\r\n\t\t\t\tit: \"Trainer\",\r\n\t\t\t\tes: \"Entrenadores\",\r\n\t\t\t\tfr: \"Entraîneurs\",\r\n\t\t\t},\r\n\t\t\t\"try-again\": {\r\n\t\t\t\ten: \"Try again\",\r\n\t\t\t\tit: \"Riprova\",\r\n\t\t\t\tes: \"Intentar de nuevo\",\r\n\t\t\t\tfr: \"Réessayer\",\r\n\t\t\t},\r\n\t\t\t\"something-went-wrong\": {\r\n\t\t\t\ten: \"Something went wrong\",\r\n\t\t\t\tit: \"Qualcosa è andato storto\",\r\n\t\t\t\tes: \"Algo salió mal\",\r\n\t\t\t\tfr: \"Une erreur est survenue\",\r\n\t\t\t},\r\n\t\t\t\"could-not-get-training\": {\r\n\t\t\t\ten: \"Error getting the training data.\",\r\n\t\t\t\tit: \"C'è stato un errore nel recuperare i dati del training.\",\r\n\t\t\t\tes: \"Error al obtener los datos del entrenamiento.\",\r\n\t\t\t\tfr: \"Erreur lors de l'obtention des données d'entraînement.\",\r\n\t\t\t},\r\n\t\t\t\"could-not-save-comment\": {\r\n\t\t\t\ten: \"Error saving the comment.\",\r\n\t\t\t\tit: \"C'è stato un errore nel salvataggio del commento.\",\r\n\t\t\t\tes: \"Error al guardar el comentario.\",\r\n\t\t\t\tfr: \"Erreur lors de l’enregistrement du commentaire.\",\r\n\t\t\t},\r\n\t\t\t\"open-in-uptivo\": {\r\n\t\t\t\ten: \"Open in my.uptivo.fit\",\r\n\t\t\t\tit: \"Apri in my.uptivo.fit\",\r\n\t\t\t\tes: \"Abrir en my.uptivo.fit\",\r\n\t\t\t\tfr: \"Ouvrir dans uptivo.fit\",\r\n\t\t\t},\r\n\t\t\t\"go-to-new-portal\": {\r\n\t\t\t\ten: \"Go to the new portal\",\r\n\t\t\t\tit: \"Vai al nuovo portale\",\r\n\t\t\t\tes: \"Ir al nuevo portal\",\r\n\t\t\t\tfr: \"Aller sur le nouveau portail\",\r\n\t\t\t},\r\n\t\t\t\"uptivo-fit-moved-title\": {\r\n\t\t\t\ten: \"Uptivo is migrating to my.uptivo.fit\",\r\n\t\t\t\tit: \"Uptivo si sposta su my.uptivo.fit\",\r\n\t\t\t\tes: \"Uptivo está migrando a my.uptivo.fit\",\r\n\t\t\t\tfr: \"Uptivo migre vers my.uptivo.fit\",\r\n\t\t\t},\r\n\t\t\t\"uptivo-fit-moved-text\": {\r\n\t\t\t\ten: \"As of April 23rd 2018 the Uptivo platform is exclusively available at my.uptivo.fit.
Remember to update your browser bookmarks!
\",\r\n\t\t\t\tit: \"' + error + '
');\r\n\r\n\t\t\t\t\t\tif (callback) {\r\n\t\t\t\t\t\t\tcallback.apply(_this18, ['remote-url-problem']);\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t}, function (file) {\r\n\t\t\t\t\t\t// continue with file object\r\n\t\t\t\t\t\t_this18._load(file, callback);\r\n\t\t\t\t\t});\r\n\r\n\t\t\t\t\t// don't continue wait for server fetch\r\n\t\t\t\t\treturn;\r\n\t\t\t\t}\r\n\r\n\t\t\t\t// let's continue with file resource\r\n\t\t\t\tvar file = resource;\r\n\r\n\t\t\t\t// re-test if is valid file type\r\n\t\t\t\t// in case of loading base64 data or url\r\n\t\t\t\tif (this._imageHopper && this._imageHopper.accept.indexOf(file.type) === -1) {\r\n\r\n\t\t\t\t\texit();\r\n\r\n\t\t\t\t\tthis._onInvalidFile();\r\n\t\t\t\t\tif (callback) {\r\n\t\t\t\t\t\tcallback.apply(this, ['file-invalid']);\r\n\t\t\t\t\t}\r\n\t\t\t\t\treturn;\r\n\t\t\t\t}\r\n\r\n\t\t\t\t// test if too big\r\n\t\t\t\tif (file.size && this._options.maxFileSize && bytesToMegaBytes(file.size) > this._options.maxFileSize) {\r\n\r\n\t\t\t\t\texit();\r\n\r\n\t\t\t\t\tthis._onOverWeightFile();\r\n\t\t\t\t\tif (callback) {\r\n\t\t\t\t\t\tcallback.apply(this, ['file-too-big']);\r\n\t\t\t\t\t}\r\n\t\t\t\t\treturn;\r\n\t\t\t\t}\r\n\r\n\t\t\t\t// if has loaded image editor set to dirty\r\n\t\t\t\tif (this._imageEditor) {\r\n\t\t\t\t\tthis._imageEditor.dirty();\r\n\t\t\t\t}\r\n\r\n\t\t\t\t// continue\r\n\t\t\t\tthis._data.input.name = getFileNameByFile(file);\r\n\t\t\t\tthis._data.input.type = getFileTypeByFile(file);\r\n\t\t\t\tthis._data.input.size = file.size;\r\n\t\t\t\tthis._data.input.file = file;\r\n\r\n\t\t\t\t// fetch resource\r\n\t\t\t\tgetImageAsCanvas(file, this._options.internalCanvasSize, function (image, meta) {\r\n\r\n\t\t\t\t\tvar rewind = function rewind() {\r\n\r\n\t\t\t\t\t\t// rewind state\r\n\t\t\t\t\t\tif (_this18._imageHopper) {\r\n\t\t\t\t\t\t\t_this18._imageHopper.enabled = true;\r\n\t\t\t\t\t\t}\r\n\r\n\t\t\t\t\t\t_this18._removeState('loading');\r\n\t\t\t\t\t\t_this18._removeState('busy');\r\n\t\t\t\t\t\t_this18._addState('empty');\r\n\t\t\t\t\t\t_this18._stopProgressLoop();\r\n\t\t\t\t\t\t_this18._resetData();\r\n\t\t\t\t\t};\r\n\r\n\t\t\t\t\t// if no image, something went wrong\r\n\t\t\t\t\tif (!image) {\r\n\r\n\t\t\t\t\t\trewind();\r\n\r\n\t\t\t\t\t\tif (callback) {\r\n\t\t\t\t\t\t\tcallback.apply(_this18, ['file-not-found']);\r\n\t\t\t\t\t\t}\r\n\r\n\t\t\t\t\t\treturn;\r\n\t\t\t\t\t}\r\n\r\n\t\t\t\t\t// test if image is too small\r\n\t\t\t\t\tif (!covers(image, _this18._options.minSize)) {\r\n\r\n\t\t\t\t\t\trewind();\r\n\r\n\t\t\t\t\t\t_this18._onImageTooSmall();\r\n\r\n\t\t\t\t\t\tif (callback) {\r\n\t\t\t\t\t\t\tcallback.apply(_this18, ['image-too-small']);\r\n\t\t\t\t\t\t}\r\n\r\n\t\t\t\t\t\treturn;\r\n\t\t\t\t\t}\r\n\r\n\t\t\t\t\tvar status = _this18._options.didLoad.apply(_this18, [file, image, meta]);\r\n\t\t\t\t\tif (status !== true) {\r\n\r\n\t\t\t\t\t\trewind();\r\n\r\n\t\t\t\t\t\tif (status !== false) {\r\n\t\t\t\t\t\t\t_this18._throwError(status);\r\n\t\t\t\t\t\t}\r\n\r\n\t\t\t\t\t\tif (callback) {\r\n\t\t\t\t\t\t\tcallback.apply(_this18, [status]);\r\n\t\t\t\t\t\t}\r\n\r\n\t\t\t\t\t\treturn;\r\n\t\t\t\t\t}\r\n\r\n\t\t\t\t\t// done loading file\r\n\t\t\t\t\t_this18._removeState('loading');\r\n\r\n\t\t\t\t\tvar revealCanvas = function revealCanvas(done) {\r\n\r\n\t\t\t\t\t\t// done, enable hopper\r\n\t\t\t\t\t\tif (_this18._imageHopper && _this18._options.dropReplace) {\r\n\t\t\t\t\t\t\t_this18._imageHopper.enabled = true;\r\n\t\t\t\t\t\t}\r\n\r\n\t\t\t\t\t\t// do intro stuff\r\n\t\t\t\t\t\tvar intro = _this18._getIntro();\r\n\r\n\t\t\t\t\t\t// setup base animation\r\n\t\t\t\t\t\tvar animation = {\r\n\t\t\t\t\t\t\tfromScale: [1.25, 1.25],\r\n\t\t\t\t\t\t\tscale: [1, 1],\r\n\t\t\t\t\t\t\tfromOpacity: 0,\r\n\t\t\t\t\t\t\topacity: 1,\r\n\t\t\t\t\t\t\tcomplete: function complete() {\r\n\r\n\t\t\t\t\t\t\t\tresetTransforms(intro);\r\n\r\n\t\t\t\t\t\t\t\tintro.style.opacity = 1;\r\n\r\n\t\t\t\t\t\t\t\tdone();\r\n\t\t\t\t\t\t\t}\r\n\r\n\t\t\t\t\t\t};\r\n\r\n\t\t\t\t\t\t// if not attached to DOM, don't animate\r\n\t\t\t\t\t\tif (_this18.isDetached()) {\r\n\t\t\t\t\t\t\tanimation.duration = 1;\r\n\t\t\t\t\t\t} else {\r\n\t\t\t\t\t\t\tanimation.easing = 'spring';\r\n\t\t\t\t\t\t\tanimation.springConstant = .3;\r\n\t\t\t\t\t\t\tanimation.springDeceleration = .7;\r\n\t\t\t\t\t\t}\r\n\r\n\t\t\t\t\t\t// if is instant edit mode don't zoom out but zoom in\r\n\t\t\t\t\t\tif (_this18._canInstantEdit()) {\r\n\t\t\t\t\t\t\tanimation.delay = 500;\r\n\t\t\t\t\t\t\tanimation.duration = 1;\r\n\r\n\t\t\t\t\t\t\t// instant edit mode just fire up the editor immidiately\r\n\t\t\t\t\t\t\t_this18._doEdit();\r\n\t\t\t\t\t\t}\r\n\r\n\t\t\t\t\t\t// reveal loaded image\r\n\t\t\t\t\t\tsnabbt(intro, animation);\r\n\t\t\t\t\t};\r\n\r\n\t\t\t\t\t// load the image\r\n\t\t\t\t\t_this18._loadCanvas(image,\r\n\r\n\t\t\t\t\t\t// done loading the canvas\r\n\t\t\t\t\t\tfunction (isUploading) {\r\n\r\n\t\t\t\t\t\t\t_this18._addState('preview');\r\n\r\n\t\t\t\t\t\t\trevealCanvas(function () {\r\n\r\n\t\t\t\t\t\t\t\t// don't show buttons when instant editing\r\n\t\t\t\t\t\t\t\t// the buttons will be triggered by the closing of the popup\r\n\t\t\t\t\t\t\t\tif (!_this18._canInstantEdit() && !isUploading) {\r\n\t\t\t\t\t\t\t\t\t_this18._showButtons();\r\n\t\t\t\t\t\t\t\t}\r\n\r\n\t\t\t\t\t\t\t\tif (!isUploading) {\r\n\t\t\t\t\t\t\t\t\t_this18._stopProgressLoop();\r\n\t\t\t\t\t\t\t\t\t_this18._removeState('busy');\r\n\t\t\t\t\t\t\t\t}\r\n\r\n\t\t\t\t\t\t\t\tif (callback) {\r\n\t\t\t\t\t\t\t\t\tcallback.apply(_this18, [null, _this18.data]);\r\n\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t});\r\n\t\t\t\t\t\t},\r\n\r\n\t\t\t\t\t\t// done uploading\r\n\t\t\t\t\t\tfunction () {\r\n\r\n\t\t\t\t\t\t\t// don't show buttons when instant editing\r\n\t\t\t\t\t\t\tif (!_this18._canInstantEdit()) {\r\n\t\t\t\t\t\t\t\t_this18._showButtons();\r\n\t\t\t\t\t\t\t}\r\n\r\n\t\t\t\t\t\t\t_this18._removeState('busy');\r\n\t\t\t\t\t\t});\r\n\t\t\t\t});\r\n\t\t\t}\r\n\t\t}, {\r\n\t\t\tkey: '_loadCanvas',\r\n\t\t\tvalue: function _loadCanvas(image, ready, complete) {\r\n\t\t\t\tvar _this19 = this;\r\n\r\n\t\t\t\t// halt here if cropper is currently being destroyed\r\n\t\t\t\tif (this._isBeingDestroyed) {\r\n\t\t\t\t\treturn;\r\n\t\t\t\t}\r\n\r\n\t\t\t\t// store raw data\r\n\t\t\t\tthis._data.input.image = image;\r\n\t\t\t\tthis._data.input.width = image.width;\r\n\t\t\t\tthis._data.input.height = image.height;\r\n\r\n\t\t\t\tif (this._initialRotation) {\r\n\t\t\t\t\tthis._data.actions.rotation = this._initialRotation;\r\n\t\t\t\t\tthis._initialRotation = null;\r\n\t\t\t\t}\r\n\r\n\t\t\t\tvar isTilted = this._data.actions.rotation % 180 !== 0;\r\n\r\n\t\t\t\t// scales the drop area\r\n\t\t\t\t// if is 'input' or 'free' parameter\r\n\t\t\t\tif (!this._isFixedRatio()) {\r\n\t\t\t\t\tif (this._initialCrop) {\r\n\t\t\t\t\t\tthis._ratio = this._initialCrop.height / this._initialCrop.width;\r\n\t\t\t\t\t} else {\r\n\t\t\t\t\t\tthis._ratio = isTilted ? image.width / image.height : image.height / image.width;\r\n\t\t\t\t\t}\r\n\t\t\t\t\tthis._scaleDropArea(this._ratio);\r\n\t\t\t\t}\r\n\r\n\t\t\t\tif (this._initialCrop) {\r\n\r\n\t\t\t\t\t// use initial supplied crop rectangle\r\n\t\t\t\t\tthis._data.actions.crop = clone(this._initialCrop);\r\n\t\t\t\t\tthis._data.actions.crop.type = CropType.INITIAL;\r\n\r\n\t\t\t\t\t// clear initial crop, it's no longer useful\r\n\t\t\t\t\tthis._initialCrop = null;\r\n\t\t\t\t} else {\r\n\t\t\t\t\t// get automagical crop rectangle\r\n\t\t\t\t\tthis._data.actions.crop = getAutoCropRect(isTilted ? image.height : image.width, isTilted ? image.width : image.height, this._ratio);\r\n\t\t\t\t\tthis._data.actions.crop.type = CropType.AUTO;\r\n\t\t\t\t}\r\n\r\n\t\t\t\t// if max size set\r\n\t\t\t\tif (this._options.size) {\r\n\t\t\t\t\tthis._data.actions.size = {\r\n\t\t\t\t\t\twidth: this._options.size.width,\r\n\t\t\t\t\t\theight: this._options.size.height\r\n\t\t\t\t\t};\r\n\t\t\t\t}\r\n\r\n\t\t\t\t// do initial auto transform\r\n\t\t\t\tthis._applyTransforms(image, function (transformedImage) {\r\n\r\n\t\t\t\t\tvar intro = _this19._getIntro();\r\n\t\t\t\t\tvar scalar = intro.offsetWidth / transformedImage.width;\r\n\r\n\t\t\t\t\t// store data, if has preview image this prevents initial load from pushing\r\n\t\t\t\t\tvar willUpload = false;\r\n\r\n\t\t\t\t\t// can only do auto upload when service is defined and push is enabled...\r\n\t\t\t\t\tif (_this19._options.service && _this19._options.push) {\r\n\r\n\t\t\t\t\t\t// ...and is not transformation of initial image\r\n\t\t\t\t\t\t// + is not instant edit mode\r\n\t\t\t\t\t\tif (!_this19._hasInitialImage && !_this19._canInstantEdit()) {\r\n\t\t\t\t\t\t\twillUpload = true;\r\n\t\t\t\t\t\t\t_this19._stopProgressLoop(function () {\r\n\t\t\t\t\t\t\t\t_this19._startProgress(function () {\r\n\t\t\t\t\t\t\t\t\t_this19._updateProgress(.1);\r\n\t\t\t\t\t\t\t\t});\r\n\t\t\t\t\t\t\t});\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t}\r\n\r\n\t\t\t\t\t// no service set, and instant edit\r\n\t\t\t\t\tif (!_this19._canInstantEdit()) {\r\n\r\n\t\t\t\t\t\t// store data (possibly)\r\n\t\t\t\t\t\t_this19._save(function () {\r\n\t\t\t\t\t\t\tif (_this19._isBeingDestroyed) {\r\n\t\t\t\t\t\t\t\treturn;\r\n\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\tif (willUpload) {\r\n\t\t\t\t\t\t\t\t_this19._stopProgress();\r\n\t\t\t\t\t\t\t\tcomplete();\r\n\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t}, willUpload);\r\n\t\t\t\t\t}\r\n\r\n\t\t\t\t\t// show intro animation\r\n\t\t\t\t\tintro.src = '';\r\n\t\t\t\t\tintro.src = cloneCanvasScaled(transformedImage, scalar).toDataURL();\r\n\t\t\t\t\tintro.onload = function () {\r\n\r\n\t\t\t\t\t\tintro.onload = null;\r\n\r\n\t\t\t\t\t\t// bail out if we've been cleaned up\r\n\t\t\t\t\t\tif (_this19._isBeingDestroyed) {\r\n\t\t\t\t\t\t\treturn;\r\n\t\t\t\t\t\t}\r\n\r\n\t\t\t\t\t\tif (ready) {\r\n\t\t\t\t\t\t\tready(willUpload);\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t};\r\n\t\t\t\t});\r\n\t\t\t}\r\n\t\t}, {\r\n\t\t\tkey: '_applyTransforms',\r\n\t\t\tvalue: function _applyTransforms(image, ready) {\r\n\t\t\t\tvar _this20 = this;\r\n\r\n\t\t\t\tvar actions = clone(this._data.actions);\r\n\t\t\t\tactions.filters = {\r\n\t\t\t\t\tsharpen: this._options.filterSharpen / 100\r\n\t\t\t\t};\r\n\r\n\t\t\t\ttransformCanvas(image, actions, function (transformedImage) {\r\n\r\n\t\t\t\t\tvar outputImage = transformedImage;\r\n\r\n\t\t\t\t\t// if should force/correct output size?\r\n\t\t\t\t\t// - is forced size set?\r\n\t\t\t\t\t// - is a discrepancy found between requested output size and transformed size\r\n\t\t\t\t\tif (_this20._options.forceSize || _this20._options.size && sizeDist(_this20._options.size, transformedImage) == 1) {\r\n\t\t\t\t\t\toutputImage = create('canvas');\r\n\t\t\t\t\t\toutputImage.width = _this20._options.size.width;\r\n\t\t\t\t\t\toutputImage.height = _this20._options.size.height;\r\n\t\t\t\t\t\tvar ctx = outputImage.getContext('2d');\r\n\t\t\t\t\t\tctx.drawImage(transformedImage, 0, 0, _this20._options.size.width, _this20._options.size.height);\r\n\t\t\t\t\t}\r\n\r\n\t\t\t\t\t// store output\r\n\t\t\t\t\t_this20._data.output.width = outputImage.width;\r\n\t\t\t\t\t_this20._data.output.height = outputImage.height;\r\n\t\t\t\t\t_this20._data.output.image = outputImage;\r\n\r\n\t\t\t\t\t_this20._onTransformCanvas(function (transformedData) {\r\n\r\n\t\t\t\t\t\t_this20._data = transformedData;\r\n\r\n\t\t\t\t\t\t_this20._options.didTransform.apply(_this20, [_this20.data]);\r\n\r\n\t\t\t\t\t\tready(_this20._data.output.image);\r\n\t\t\t\t\t});\r\n\t\t\t\t});\r\n\t\t\t}\r\n\t\t}, {\r\n\t\t\tkey: '_onTransformCanvas',\r\n\t\t\tvalue: function _onTransformCanvas(ready) {\r\n\r\n\t\t\t\tthis._options.willTransform.apply(this, [this.data, ready]);\r\n\t\t\t}\r\n\r\n\t\t\t/**\r\n\t * Creates the editor nodes\r\n\t * @private\r\n\t */\r\n\r\n\t\t}, {\r\n\t\t\tkey: '_appendEditor',\r\n\t\t\tvalue: function _appendEditor() {\r\n\t\t\t\tvar _this21 = this;\r\n\r\n\t\t\t\t// we already have an editor\r\n\t\t\t\tif (this._imageEditor) {\r\n\t\t\t\t\treturn;\r\n\t\t\t\t}\r\n\r\n\t\t\t\t// add editor\r\n\t\t\t\tthis._imageEditor = new ImageEditor(create('div'), {\r\n\t\t\t\t\tminSize: this._options.minSize,\r\n\r\n\t\t\t\t\tbuttonConfirmClassName: this._options.buttonConfirmClassName,\r\n\t\t\t\t\tbuttonCancelClassName: this._options.buttonCancelClassName,\r\n\t\t\t\t\tbuttonRotateClassName: this._options.buttonRotateClassName,\r\n\r\n\t\t\t\t\tbuttonConfirmLabel: this._options.buttonConfirmLabel,\r\n\t\t\t\t\tbuttonCancelLabel: this._options.buttonCancelLabel,\r\n\t\t\t\t\tbuttonRotateLabel: this._options.buttonRotateLabel,\r\n\r\n\t\t\t\t\tbuttonConfirmTitle: this._options.buttonConfirmTitle,\r\n\t\t\t\t\tbuttonCancelTitle: this._options.buttonCancelTitle,\r\n\t\t\t\t\tbuttonRotateTitle: this._options.buttonRotateTitle\r\n\r\n\t\t\t\t});\r\n\r\n\t\t\t\t// listen to events\r\n\t\t\t\tImageEditorEvents.forEach(function (e) {\r\n\t\t\t\t\t_this21._imageEditor.element.addEventListener(e, _this21);\r\n\t\t\t\t});\r\n\t\t\t}\r\n\t\t}, {\r\n\t\t\tkey: '_scaleDropArea',\r\n\t\t\tvalue: function _scaleDropArea(ratio) {\r\n\t\t\t\tvar node = this._getRatioSpacerElement();\r\n\t\t\t\tif (!node || !this._element) {\r\n\t\t\t\t\treturn;\r\n\t\t\t\t}\r\n\t\t\t\tif (ratio) {\r\n\t\t\t\t\tnode.style.marginBottom = ratio * 100 + '%';\r\n\t\t\t\t\tthis._element.setAttribute('data-ratio', '1:' + ratio);\r\n\t\t\t\t} else {\r\n\t\t\t\t\tnode.style.marginBottom = null;\r\n\t\t\t\t\tthis._element.removeAttribute('data-ratio');\r\n\t\t\t\t}\r\n\r\n\t\t\t}\r\n\r\n\t\t\t/**\r\n\t * Data Layer\r\n\t * @private\r\n\t */\r\n\t\t\t// image editor closed\r\n\r\n\t\t}, {\r\n\t\t\tkey: '_onCancel',\r\n\t\t\tvalue: function _onCancel(e) {\r\n\r\n\t\t\t\tthis._removeState('editor');\r\n\r\n\t\t\t\tthis._options.didCancel.apply(this);\r\n\r\n\t\t\t\tthis._showButtons();\r\n\r\n\t\t\t\tthis._hideEditor();\r\n\r\n\t\t\t\tif (this._options.instantEdit && !this._hasInitialImage && this._isAutoCrop()) {\r\n\t\t\t\t\tthis._doRemove(false);\r\n\t\t\t\t}\r\n\t\t\t}\r\n\r\n\t\t\t// user confirmed changes\r\n\r\n\t\t}, {\r\n\t\t\tkey: '_onConfirm',\r\n\t\t\tvalue: function _onConfirm(e) {\r\n\t\t\t\tvar _this22 = this;\r\n\r\n\t\t\t\t// if\r\n\t\t\t\t// - service set\r\n\t\t\t\t// - and we are pushing\r\n\t\t\t\t// - and we don't instant edit\r\n\t\t\t\t// we will upload\r\n\t\t\t\tvar willUpload = this._options.service && this._options.push;\r\n\t\t\t\tif (willUpload) {\r\n\t\t\t\t\tthis._startProgress(function () {\r\n\t\t\t\t\t\t_this22._updateProgress(.1);\r\n\t\t\t\t\t});\r\n\t\t\t\t} else {\r\n\t\t\t\t\tthis._startProgressLoop();\r\n\t\t\t\t}\r\n\r\n\t\t\t\tthis._removeState('editor');\r\n\r\n\t\t\t\tthis._addState('busy');\r\n\r\n\t\t\t\t// clear data\r\n\t\t\t\tthis._output.value = '';\r\n\r\n\t\t\t\t// apply new action object to this._data\r\n\t\t\t\tthis._data.actions.rotation = e.detail.rotation;\r\n\t\t\t\tthis._data.actions.crop = e.detail.crop;\r\n\t\t\t\tthis._data.actions.crop.type = CropType.MANUAL;\r\n\r\n\t\t\t\t// do transforms\r\n\t\t\t\tthis._applyTransforms(this._data.input.image, function (transformedImage) {\r\n\r\n\t\t\t\t\t// user confirmed the crop (and changes have been applied to data)\r\n\t\t\t\t\t_this22._options.didConfirm.apply(_this22, [_this22.data]);\r\n\r\n\t\t\t\t\t// set new image result\r\n\t\t\t\t\tvar images = _this22._getInOut();\r\n\t\t\t\t\tvar intro = images[0].className === 'out' ? images[0] : images[1];\r\n\t\t\t\t\tvar outro = intro === images[0] ? images[1] : images[0];\r\n\r\n\t\t\t\t\tintro.className = 'in';\r\n\t\t\t\t\tintro.style.opacity = '0';\r\n\t\t\t\t\tintro.style.zIndex = '2';\r\n\t\t\t\t\toutro.className = 'out';\r\n\t\t\t\t\toutro.style.zIndex = '1';\r\n\r\n\t\t\t\t\t// new image get's\r\n\t\t\t\t\tintro.src = '';\r\n\t\t\t\t\tintro.src = cloneCanvasScaled(transformedImage, intro.offsetWidth / transformedImage.width).toDataURL();\r\n\t\t\t\t\tintro.onload = function () {\r\n\r\n\t\t\t\t\t\tintro.onload = null;\r\n\r\n\t\t\t\t\t\t// scale the dropzone\r\n\t\t\t\t\t\tif (_this22._options.ratio === 'free') {\r\n\t\t\t\t\t\t\t_this22._ratio = intro.naturalHeight / intro.naturalWidth;\r\n\t\t\t\t\t\t\t_this22._scaleDropArea(_this22._ratio);\r\n\t\t\t\t\t\t}\r\n\r\n\t\t\t\t\t\t// close the editor\r\n\t\t\t\t\t\t_this22._hideEditor();\r\n\r\n\t\t\t\t\t\t// wait a tiny bit so animations sync up nicely\r\n\t\t\t\t\t\tvar timer = setTimeout(function () {\r\n\r\n\t\t\t\t\t\t\t// show the preview\r\n\t\t\t\t\t\t\t_this22._showPreview(intro, function () {\r\n\r\n\t\t\t\t\t\t\t\t// save the data\r\n\t\t\t\t\t\t\t\t_this22._save(function (err, data, res) {\r\n\r\n\t\t\t\t\t\t\t\t\t// done!\r\n\t\t\t\t\t\t\t\t\t_this22._toggleButton('upload', true);\r\n\r\n\t\t\t\t\t\t\t\t\tif (willUpload) {\r\n\t\t\t\t\t\t\t\t\t\t_this22._stopProgress();\r\n\t\t\t\t\t\t\t\t\t} else {\r\n\t\t\t\t\t\t\t\t\t\t_this22._stopProgressLoop();\r\n\t\t\t\t\t\t\t\t\t}\r\n\r\n\t\t\t\t\t\t\t\t\t_this22._removeState('busy');\r\n\r\n\t\t\t\t\t\t\t\t\t_this22._showButtons();\r\n\t\t\t\t\t\t\t\t}, willUpload);\r\n\t\t\t\t\t\t\t});\r\n\t\t\t\t\t\t}, 250);\r\n\r\n\t\t\t\t\t\t_this22._timers.push(timer);\r\n\t\t\t\t\t};\r\n\t\t\t\t});\r\n\t\t\t}\r\n\t\t}, {\r\n\t\t\tkey: '_cropAuto',\r\n\t\t\tvalue: function _cropAuto() {\r\n\t\t\t\tvar callback = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : function (data) { };\r\n\r\n\r\n\t\t\t\tvar isTilted = this._data.actions.rotation % 180 !== 0;\r\n\r\n\t\t\t\tvar rect = getAutoCropRect(isTilted ? this._data.input.image.width : this._data.input.image.height, isTilted ? this._data.input.image.height : this._data.input.image.width, this._ratio);\r\n\r\n\t\t\t\tthis._crop(rect.x, rect.y, rect.width, rect.height, callback, CropType.AUTO);\r\n\t\t\t}\r\n\t\t}, {\r\n\t\t\tkey: '_crop',\r\n\t\t\tvalue: function _crop(x, y, width, height) {\r\n\t\t\t\tvar callback = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : function (data) { };\r\n\t\t\t\tvar cropType = arguments.length > 5 && arguments[5] !== undefined ? arguments[5] : CropType.MANUAL;\r\n\r\n\r\n\t\t\t\t// clear data\r\n\t\t\t\tthis._output.value = '';\r\n\r\n\t\t\t\t// apply new action object to this._data\r\n\t\t\t\tthis._data.actions.crop = {\r\n\t\t\t\t\tx: x,\r\n\t\t\t\t\ty: y,\r\n\t\t\t\t\twidth: width,\r\n\t\t\t\t\theight: height\r\n\t\t\t\t};\r\n\t\t\t\tthis._data.actions.crop.type = cropType;\r\n\r\n\t\t\t\tthis._manualTransform(callback);\r\n\t\t\t}\r\n\t\t}, {\r\n\t\t\tkey: '_manualTransform',\r\n\t\t\tvalue: function _manualTransform(callback) {\r\n\t\t\t\tvar _this23 = this;\r\n\r\n\t\t\t\tthis._startProgressLoop();\r\n\t\t\t\tthis._addState('busy');\r\n\r\n\t\t\t\t// do transforms\r\n\t\t\t\tthis._applyTransforms(this._data.input.image, function (transformedImage) {\r\n\r\n\t\t\t\t\t// set new image result\r\n\t\t\t\t\tvar images = _this23._getInOut();\r\n\t\t\t\t\tvar intro = images[0].className === 'out' ? images[0] : images[1];\r\n\t\t\t\t\tvar outro = intro === images[0] ? images[1] : images[0];\r\n\r\n\t\t\t\t\tintro.className = 'in';\r\n\t\t\t\t\tintro.style.opacity = '1';\r\n\t\t\t\t\tintro.style.zIndex = '2';\r\n\t\t\t\t\toutro.className = 'out';\r\n\t\t\t\t\toutro.style.zIndex = '0';\r\n\r\n\t\t\t\t\t// new image\r\n\t\t\t\t\tintro.src = '';\r\n\t\t\t\t\tintro.src = cloneCanvasScaled(transformedImage, intro.offsetWidth / transformedImage.width).toDataURL();\r\n\t\t\t\t\tintro.onload = function () {\r\n\t\t\t\t\t\tintro.onload = null;\r\n\r\n\t\t\t\t\t\t// scale the dropzone\r\n\t\t\t\t\t\tif (_this23._options.ratio === 'free') {\r\n\t\t\t\t\t\t\t_this23._ratio = intro.naturalHeight / intro.naturalWidth;\r\n\t\t\t\t\t\t\t_this23._scaleDropArea(_this23._ratio);\r\n\t\t\t\t\t\t}\r\n\r\n\t\t\t\t\t\t// determine if will also upload\r\n\t\t\t\t\t\tvar willUpload = _this23._options.service && _this23._options.push;\r\n\r\n\t\t\t\t\t\tvar save = function save() {\r\n\r\n\t\t\t\t\t\t\t// save the data\r\n\t\t\t\t\t\t\t_this23._save(function (err, data, res) {\r\n\r\n\t\t\t\t\t\t\t\t// stop loader\r\n\t\t\t\t\t\t\t\tif (!willUpload) {\r\n\t\t\t\t\t\t\t\t\t_this23._stopProgressLoop();\r\n\t\t\t\t\t\t\t\t}\r\n\r\n\t\t\t\t\t\t\t\t_this23._removeState('busy');\r\n\r\n\t\t\t\t\t\t\t\tcallback.apply(_this23, [_this23.data]);\r\n\t\t\t\t\t\t\t}, willUpload);\r\n\t\t\t\t\t\t};\r\n\r\n\t\t\t\t\t\tif (willUpload) {\r\n\t\t\t\t\t\t\t_this23._startProgress(save);\r\n\t\t\t\t\t\t} else {\r\n\t\t\t\t\t\t\tsave();\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t};\r\n\t\t\t\t});\r\n\t\t\t}\r\n\t\t}, {\r\n\t\t\tkey: '_save',\r\n\t\t\tvalue: function _save() {\r\n\t\t\t\tvar _this24 = this;\r\n\r\n\t\t\t\tvar callback = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : function () { };\r\n\t\t\t\tvar allowUpload = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : true;\r\n\r\n\r\n\t\t\t\tif (this._isBeingDestroyed) {\r\n\t\t\t\t\treturn;\r\n\t\t\t\t}\r\n\r\n\t\t\t\t// flatten data also turns output canvas into data uri\r\n\t\t\t\t// removes input file object and image object\r\n\t\t\t\tvar data = this.dataBase64;\r\n\r\n\t\t\t\t// decide if we need to\r\n\t\t\t\t// - A. Store the data in an output field\r\n\t\t\t\t// - B. Upload the data and store the response in output field\r\n\r\n\t\t\t\t// - we are not doing async uploading (in which case output is used for response)\r\n\t\t\t\t// - we are not initialising a replaceable image\r\n\t\t\t\tif (!this._options.service && !(this._isInitialising && !this._isImageOnly())) {\r\n\r\n\t\t\t\t\tthis._options.willSave.apply(this, [data, function (data) {\r\n\r\n\t\t\t\t\t\t_this24._store(data);\r\n\r\n\t\t\t\t\t\t_this24._options.didSave.apply(_this24, [data]);\r\n\t\t\t\t\t}]);\r\n\t\t\t\t}\r\n\r\n\t\t\t\tif (this._isBeingDestroyed) {\r\n\t\t\t\t\treturn;\r\n\t\t\t\t}\r\n\r\n\t\t\t\t// is remote service defined upload async\r\n\t\t\t\tif (this._options.service && allowUpload) {\r\n\r\n\t\t\t\t\t// allow user to modify the data\r\n\t\t\t\t\tthis._options.willSave.apply(this, [data, function (data) {\r\n\r\n\t\t\t\t\t\t_this24._addState('upload');\r\n\r\n\t\t\t\t\t\tif (_this24._imageHopper && _this24._options.dropReplace) {\r\n\t\t\t\t\t\t\t_this24._imageHopper.enabled = false;\r\n\t\t\t\t\t\t}\r\n\r\n\t\t\t\t\t\t// do the actual uploading\r\n\t\t\t\t\t\t_this24._upload(data, function (err, res) {\r\n\r\n\t\t\t\t\t\t\tif (_this24._imageHopper && _this24._options.dropReplace) {\r\n\t\t\t\t\t\t\t\t_this24._imageHopper.enabled = true;\r\n\t\t\t\t\t\t\t}\r\n\r\n\t\t\t\t\t\t\t// store response\r\n\t\t\t\t\t\t\tif (!err) {\r\n\t\t\t\t\t\t\t\t_this24._storeServerResponse(res);\r\n\t\t\t\t\t\t\t}\r\n\r\n\t\t\t\t\t\t\t// we did upload data\r\n\t\t\t\t\t\t\t_this24._options.didUpload.apply(_this24, [err, data, res]);\r\n\r\n\t\t\t\t\t\t\t_this24._removeState('upload');\r\n\r\n\t\t\t\t\t\t\t// done!\r\n\t\t\t\t\t\t\tcallback(err, data, res);\r\n\t\t\t\t\t\t});\r\n\t\t\t\t\t}]);\r\n\t\t\t\t}\r\n\r\n\t\t\t\t// if no service, we're done here\r\n\t\t\t\tif (!this._options.service || !allowUpload) {\r\n\t\t\t\t\tcallback();\r\n\t\t\t\t}\r\n\t\t\t}\r\n\r\n\t\t\t// stores active file information in hidden output field\r\n\r\n\t\t}, {\r\n\t\t\tkey: '_storeServerResponse',\r\n\t\t\tvalue: function _storeServerResponse(data) {\r\n\r\n\t\t\t\t// remove required flag\r\n\t\t\t\tif (this._isRequired) {\r\n\t\t\t\t\tthis._input.required = false;\r\n\t\t\t\t}\r\n\r\n\t\t\t\t// store data returned from server\r\n\t\t\t\tthis._data.server = data;\r\n\r\n\t\t\t\t// sync with output value\r\n\t\t\t\tthis._output.value = (typeof data === 'undefined' ? 'undefined' : _typeof(data)) === 'object' ? JSON.stringify(this._data.server) : data;\r\n\t\t\t}\r\n\r\n\t\t\t// stores data in output field\r\n\r\n\t\t}, {\r\n\t\t\tkey: '_store',\r\n\t\t\tvalue: function _store(data) {\r\n\r\n\t\t\t\tif (this._isRequired) {\r\n\t\t\t\t\tthis._input.required = false;\r\n\t\t\t\t}\r\n\r\n\t\t\t\tthis._output.value = JSON.stringify(data);\r\n\t\t\t}\r\n\r\n\t\t\t// uploads given data to server\r\n\r\n\t\t}, {\r\n\t\t\tkey: '_upload',\r\n\t\t\tvalue: function _upload(data, callback) {\r\n\t\t\t\tvar _this25 = this;\r\n\r\n\t\t\t\tvar formData = new FormData();\r\n\r\n\t\t\t\t// if image data is defined, turn it into a file object (we can send files if we're uploading)\r\n\t\t\t\tif (this._data.output.image !== null && this._options.uploadBase64 === false) {\r\n\t\t\t\t\tvar output = base64ToBlob(data.output.image, data.output.name);\r\n\t\t\t\t\tvar field = /* 'slim_output_' + this._uid */ this._output.name;\r\n\t\t\t\t\tdata.output.image = null;\r\n\t\t\t\t\tdata.output.field = field;\r\n\t\t\t\t\tformData.append(field, output, data.output.name);\r\n\t\t\t\t}\r\n\r\n\t\t\t\t// output dataset\r\n\t\t\t\tif (inArray('data', this._options.post)) {\r\n\t\t\t\t\tformData.append(this._output.name, JSON.stringify(data));\r\n\t\t\t\t}\r\n\r\n\t\t\t\t// if input should be posted along, append data\r\n\t\t\t\t// to FormData object as file\r\n\t\t\t\tif (inArray('input', this._options.post)) {\r\n\t\t\t\t\tformData.append(this._inputReference, this._data.input.file, this._data.input.file.name);\r\n\t\t\t\t}\r\n\r\n\t\t\t\tvar statusNode = this._element.querySelector('.slim-upload-status');\r\n\r\n\t\t\t\tvar requestDecorator = this._options.willRequest;\r\n\r\n\t\t\t\tsend(\r\n\t\t\t\t\t// url to service\r\n\t\t\t\t\tthis._options.service,\r\n\r\n\t\t\t\t\t// data\r\n\t\t\t\t\tformData,\r\n\r\n\t\t\t\t\t// decorator (useful to add headers to request\r\n\t\t\t\t\trequestDecorator,\r\n\r\n\t\t\t\t\t// progress\r\n\t\t\t\t\tfunction (loaded, total) {\r\n\r\n\t\t\t\t\t\t_this25._updateProgress(Math.max(.1, loaded / total));\r\n\t\t\t\t\t},\r\n\r\n\t\t\t\t\t// success\r\n\t\t\t\t\tfunction (obj) {\r\n\r\n\t\t\t\t\t\tvar timer = setTimeout(function () {\r\n\r\n\t\t\t\t\t\t\t// it's possible that Slim has been destroyed in the mean time.\r\n\t\t\t\t\t\t\tif (_this25._isBeingDestroyed) {\r\n\t\t\t\t\t\t\t\treturn;\r\n\t\t\t\t\t\t\t}\r\n\r\n\t\t\t\t\t\t\tstatusNode.innerHTML = _this25._options.statusUploadSuccess;\r\n\t\t\t\t\t\t\tstatusNode.setAttribute('data-state', 'success');\r\n\t\t\t\t\t\t\tstatusNode.style.opacity = 1;\r\n\r\n\t\t\t\t\t\t\t// hide status update after 2 seconds\r\n\t\t\t\t\t\t\tvar timer = setTimeout(function () {\r\n\t\t\t\t\t\t\t\tstatusNode.style.opacity = 0;\r\n\t\t\t\t\t\t\t}, 2000);\r\n\r\n\t\t\t\t\t\t\t_this25._timers.push(timer);\r\n\t\t\t\t\t\t}, 250);\r\n\r\n\t\t\t\t\t\t_this25._timers.push(timer);\r\n\r\n\t\t\t\t\t\tcallback(null, obj);\r\n\t\t\t\t\t},\r\n\r\n\t\t\t\t\t// error\r\n\t\t\t\t\tfunction (status) {\r\n\r\n\t\t\t\t\t\tvar html = '';\r\n\t\t\t\t\t\tif (status === 'file-too-big') {\r\n\t\t\t\t\t\t\thtml = _this25._options.statusContentLength;\r\n\t\t\t\t\t\t} else {\r\n\t\t\t\t\t\t\thtml = _this25._options.didReceiveServerError.apply(_this25, [status, _this25._options.statusUnknownResponse]);\r\n\t\t\t\t\t\t}\r\n\r\n\t\t\t\t\t\t// when an error occurs the status update is not automatically hidden\r\n\t\t\t\t\t\tvar timer = setTimeout(function () {\r\n\r\n\t\t\t\t\t\t\tstatusNode.innerHTML = html;\r\n\t\t\t\t\t\t\tstatusNode.setAttribute('data-state', 'error');\r\n\t\t\t\t\t\t\tstatusNode.style.opacity = 1;\r\n\t\t\t\t\t\t}, 250);\r\n\r\n\t\t\t\t\t\t_this25._timers.push(timer);\r\n\r\n\t\t\t\t\t\tcallback(status);\r\n\t\t\t\t\t});\r\n\t\t\t}\r\n\t\t}, {\r\n\t\t\tkey: '_showEditor',\r\n\t\t\tvalue: function _showEditor() {\r\n\r\n\t\t\t\tSlimPopover.show();\r\n\r\n\t\t\t\tthis._imageEditor.show();\r\n\t\t\t}\r\n\t\t}, {\r\n\t\t\tkey: '_hideEditor',\r\n\t\t\tvalue: function _hideEditor() {\r\n\r\n\t\t\t\tthis._imageEditor.hide();\r\n\r\n\t\t\t\tvar timer = setTimeout(function () {\r\n\r\n\t\t\t\t\tSlimPopover.hide();\r\n\t\t\t\t}, 250);\r\n\r\n\t\t\t\tthis._timers.push(timer);\r\n\t\t\t}\r\n\r\n\t\t\t/**\r\n\t * Animations\r\n\t */\r\n\r\n\t\t}, {\r\n\t\t\tkey: '_showPreview',\r\n\t\t\tvalue: function _showPreview(intro, callback) {\r\n\r\n\t\t\t\tsnabbt(intro, {\r\n\r\n\t\t\t\t\tfromPosition: [0, 50, 0],\r\n\t\t\t\t\tposition: [0, 0, 0],\r\n\r\n\t\t\t\t\tfromScale: [1.5, 1.5],\r\n\t\t\t\t\tscale: [1, 1],\r\n\r\n\t\t\t\t\tfromOpacity: 0,\r\n\t\t\t\t\topacity: 1,\r\n\r\n\t\t\t\t\teasing: 'spring',\r\n\t\t\t\t\tspringConstant: .3,\r\n\t\t\t\t\tspringDeceleration: .7,\r\n\r\n\t\t\t\t\tcomplete: function complete() {\r\n\r\n\t\t\t\t\t\tresetTransforms(intro);\r\n\r\n\t\t\t\t\t\tif (callback) {\r\n\t\t\t\t\t\t\tcallback();\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t}\r\n\r\n\t\t\t\t});\r\n\t\t\t}\r\n\t\t}, {\r\n\t\t\tkey: '_hideResult',\r\n\t\t\tvalue: function _hideResult(callback) {\r\n\r\n\t\t\t\tvar intro = this._getIntro();\r\n\t\t\t\tif (!intro) {\r\n\t\t\t\t\treturn;\r\n\t\t\t\t}\r\n\r\n\t\t\t\tsnabbt(intro, {\r\n\r\n\t\t\t\t\tfromScale: [1, 1],\r\n\t\t\t\t\tscale: [.5, .5],\r\n\r\n\t\t\t\t\tfromOpacity: 1,\r\n\t\t\t\t\topacity: 0,\r\n\r\n\t\t\t\t\teasing: 'spring',\r\n\t\t\t\t\tspringConstant: .3,\r\n\t\t\t\t\tspringDeceleration: .75,\r\n\r\n\t\t\t\t\tcomplete: function complete() {\r\n\t\t\t\t\t\tresetTransforms(intro);\r\n\t\t\t\t\t\tif (callback) {\r\n\t\t\t\t\t\t\tcallback();\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t}\r\n\r\n\t\t\t\t});\r\n\t\t\t}\r\n\t\t}, {\r\n\t\t\tkey: '_showButtons',\r\n\t\t\tvalue: function _showButtons(callback) {\r\n\r\n\t\t\t\tif (!this._btnGroup) {\r\n\t\t\t\t\treturn;\r\n\t\t\t\t}\r\n\r\n\t\t\t\tthis._btnGroup.style.display = '';\r\n\r\n\t\t\t\t// setup animation\r\n\t\t\t\tvar animation = {\r\n\t\t\t\t\tfromScale: [.5, .5],\r\n\t\t\t\t\tscale: [1, 1],\r\n\t\t\t\t\tfromPosition: [0, 10, 0],\r\n\t\t\t\t\tposition: [0, 0, 0],\r\n\t\t\t\t\tfromOpacity: 0,\r\n\t\t\t\t\topacity: 1,\r\n\t\t\t\t\tcomplete: function complete() {\r\n\t\t\t\t\t\tresetTransforms(this);\r\n\t\t\t\t\t},\r\n\t\t\t\t\tallDone: function allDone() {\r\n\t\t\t\t\t\tif (callback) {\r\n\t\t\t\t\t\t\tcallback();\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t}\r\n\t\t\t\t};\r\n\r\n\t\t\t\t// don't animate when detached\r\n\t\t\t\tif (this.isDetached()) {\r\n\t\t\t\t\tanimation.duration = 1;\r\n\t\t\t\t} else {\r\n\t\t\t\t\tanimation.delay = function (i) {\r\n\t\t\t\t\t\treturn 250 + i * 50;\r\n\t\t\t\t\t};\r\n\t\t\t\t\tanimation.easing = 'spring';\r\n\t\t\t\t\tanimation.springConstant = .3;\r\n\t\t\t\t\tanimation.springDeceleration = .85;\r\n\t\t\t\t}\r\n\r\n\t\t\t\tsnabbt(this._btnGroup.childNodes, animation);\r\n\t\t\t}\r\n\t\t}, {\r\n\t\t\tkey: '_hideButtons',\r\n\t\t\tvalue: function _hideButtons(callback) {\r\n\t\t\t\tvar _this26 = this;\r\n\r\n\t\t\t\tif (!this._btnGroup) {\r\n\t\t\t\t\treturn;\r\n\t\t\t\t}\r\n\r\n\t\t\t\tvar animation = {\r\n\t\t\t\t\tfromScale: [1, 1],\r\n\t\t\t\t\tscale: [.85, .85],\r\n\t\t\t\t\tfromOpacity: 1,\r\n\t\t\t\t\topacity: 0,\r\n\t\t\t\t\tallDone: function allDone() {\r\n\t\t\t\t\t\t_this26._btnGroup.style.display = 'none';\r\n\t\t\t\t\t\tif (callback) {\r\n\t\t\t\t\t\t\tcallback();\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t}\r\n\t\t\t\t};\r\n\r\n\t\t\t\t// don't animate when detached\r\n\t\t\t\tif (this.isDetached()) {\r\n\t\t\t\t\tanimation.duration = 1;\r\n\t\t\t\t} else {\r\n\t\t\t\t\tanimation.easing = 'spring';\r\n\t\t\t\t\tanimation.springConstant = .3;\r\n\t\t\t\t\tanimation.springDeceleration = .75;\r\n\t\t\t\t}\r\n\r\n\t\t\t\t// go hide the buttons\r\n\t\t\t\tsnabbt(this._btnGroup.childNodes, animation);\r\n\t\t\t}\r\n\t\t}, {\r\n\t\t\tkey: '_hideStatus',\r\n\t\t\tvalue: function _hideStatus() {\r\n\r\n\t\t\t\tvar statusNode = this._element.querySelector('.slim-upload-status');\r\n\t\t\t\tstatusNode.style.opacity = 0;\r\n\t\t\t}\r\n\t\t}, {\r\n\t\t\tkey: '_doEdit',\r\n\t\t\tvalue: function _doEdit() {\r\n\t\t\t\tvar _this27 = this;\r\n\r\n\t\t\t\t// if no input data available, can't edit anything\r\n\t\t\t\tif (!this._data.input.image) {\r\n\t\t\t\t\treturn;\r\n\t\t\t\t}\r\n\r\n\t\t\t\t// now in editor mode\r\n\t\t\t\tthis._addState('editor');\r\n\r\n\t\t\t\t// create editor (if not already created)\r\n\t\t\t\tif (!this._imageEditor) {\r\n\t\t\t\t\tthis._appendEditor();\r\n\t\t\t\t}\r\n\r\n\t\t\t\t// hide or show rotate button\r\n\t\t\t\tthis._imageEditor.showRotateButton = this._options.rotateButton;\r\n\r\n\t\t\t\t// append to popover\r\n\t\t\t\tSlimPopover.inner = this._imageEditor.element;\r\n\r\n\t\t\t\t// read the data\r\n\t\t\t\tthis._imageEditor.open(\r\n\r\n\t\t\t\t\t// send copy of canvas to the editor\r\n\t\t\t\t\tcloneCanvas(this._data.input.image),\r\n\r\n\t\t\t\t\t// determine ratio\r\n\t\t\t\t\tthis._options.ratio === 'free' ? null : this._ratio,\r\n\r\n\t\t\t\t\t// the initial crop to show\r\n\t\t\t\t\tthis._data.actions.crop,\r\n\r\n\t\t\t\t\t// the initial rotation of the image\r\n\t\t\t\t\tthis._data.actions.rotation,\r\n\r\n\t\t\t\t\t// handle editor load\r\n\t\t\t\t\tfunction () {\r\n\r\n\t\t\t\t\t\t_this27._showEditor();\r\n\r\n\t\t\t\t\t\t_this27._hideButtons();\r\n\r\n\t\t\t\t\t\t_this27._hideStatus();\r\n\t\t\t\t\t});\r\n\t\t\t}\r\n\t\t}, {\r\n\t\t\tkey: '_doRemove',\r\n\t\t\tvalue: function _doRemove(removeAction, done) {\r\n\t\t\t\tvar _this28 = this;\r\n\r\n\t\t\t\t// cannot remove when is only one image\r\n\t\t\t\tif (this._isImageOnly()) {\r\n\t\t\t\t\treturn;\r\n\t\t\t\t}\r\n\r\n\t\t\t\tthis._clearState();\r\n\t\t\t\tthis._addState('empty');\r\n\r\n\t\t\t\tthis._hasInitialImage = false;\r\n\t\t\t\tif (this._imageHopper) {\r\n\t\t\t\t\tthis._imageHopper.enabled = true;\r\n\t\t\t\t}\r\n\r\n\t\t\t\tif (this._isRequired) {\r\n\t\t\t\t\tthis._input.required = true;\r\n\t\t\t\t}\r\n\r\n\t\t\t\tvar out = this._getOutro();\r\n\t\t\t\tif (out) {\r\n\t\t\t\t\tout.style.opacity = '0';\r\n\t\t\t\t}\r\n\r\n\t\t\t\t// get public available clone of data\r\n\t\t\t\tvar data = this.data;\r\n\r\n\t\t\t\t// now reset all data\r\n\t\t\t\tthis._resetData();\r\n\r\n\t\t\t\tvar timer = setTimeout(function () {\r\n\r\n\t\t\t\t\tif (_this28._isBeingDestroyed) {\r\n\t\t\t\t\t\treturn;\r\n\t\t\t\t\t}\r\n\r\n\t\t\t\t\t_this28._hideButtons(function () {\r\n\r\n\t\t\t\t\t\t_this28._toggleButton('upload', true);\r\n\t\t\t\t\t});\r\n\r\n\t\t\t\t\t_this28._hideStatus();\r\n\r\n\t\t\t\t\t_this28._hideResult(function() {\r\n\t\t\t\t\t\t_this28._options.didRemove.apply(_this28, [removeAction, data]);\r\n\t\t\t\t\t});\r\n\r\n\t\t\t\t\tif (done) {\r\n\t\t\t\t\t\tdone();\r\n\t\t\t\t\t}\r\n\t\t\t\t}, this.isDetached() ? 0 : 250);\r\n\r\n\t\t\t\tthis._timers.push(timer);\r\n\r\n\t\t\t\treturn data;\r\n\t\t\t}\r\n\t\t}, {\r\n\t\t\tkey: '_doUpload',\r\n\t\t\tvalue: function _doUpload(callback) {\r\n\t\t\t\tvar _this29 = this;\r\n\r\n\t\t\t\t// if no input data available, can't upload anything\r\n\t\t\t\tif (!this._data.input.image) {\r\n\t\t\t\t\treturn;\r\n\t\t\t\t}\r\n\r\n\t\t\t\tthis._addState('upload');\r\n\t\t\t\tthis._startProgress();\r\n\r\n\t\t\t\tthis._hideButtons(function () {\r\n\r\n\t\t\t\t\t// block upload button\r\n\t\t\t\t\t_this29._toggleButton('upload', false);\r\n\r\n\t\t\t\t\t_this29._save(function (err, data, res) {\r\n\r\n\t\t\t\t\t\t_this29._removeState('upload');\r\n\t\t\t\t\t\t_this29._stopProgress();\r\n\r\n\t\t\t\t\t\tif (callback) {\r\n\t\t\t\t\t\t\tcallback.apply(_this29, [err, data, res]);\r\n\t\t\t\t\t\t}\r\n\r\n\t\t\t\t\t\tif (err) {\r\n\t\t\t\t\t\t\t_this29._toggleButton('upload', true);\r\n\t\t\t\t\t\t}\r\n\r\n\t\t\t\t\t\t_this29._showButtons();\r\n\t\t\t\t\t});\r\n\t\t\t\t});\r\n\t\t\t}\r\n\t\t}, {\r\n\t\t\tkey: '_doDownload',\r\n\t\t\tvalue: function _doDownload() {\r\n\r\n\t\t\t\tvar image = this._data.output.image;\r\n\t\t\t\tif (!image) {\r\n\t\t\t\t\treturn;\r\n\t\t\t\t}\r\n\r\n\t\t\t\tdownloadCanvas(this._data, this._options.jpegCompression, this._options.forceType);\r\n\t\t\t}\r\n\t\t}, {\r\n\t\t\tkey: '_doDestroy',\r\n\t\t\tvalue: function _doDestroy() {\r\n\t\t\t\tvar _this30 = this;\r\n\r\n\t\t\t\t// set destroy flag to halt any running functionality\r\n\t\t\t\tthis._isBeingDestroyed = true;\r\n\r\n\t\t\t\t// clear timers\r\n\t\t\t\tthis._timers.forEach(function (timer) {\r\n\t\t\t\t\tclearTimeout(timer);\r\n\t\t\t\t});\r\n\t\t\t\tthis._timers = [];\r\n\r\n\t\t\t\t// clean up snabbt animations\r\n\t\t\t\tsnabbt(this._element, 'detach');\r\n\r\n\t\t\t\t// this removes the image hopper if it's attached\r\n\t\t\t\tif (this._imageHopper) {\r\n\t\t\t\t\tHopperEvents.forEach(function (e) {\r\n\t\t\t\t\t\t_this30._imageHopper.element.removeEventListener(e, _this30);\r\n\t\t\t\t\t});\r\n\t\t\t\t\tthis._imageHopper.destroy();\r\n\t\t\t\t\tthis._imageHopper = null;\r\n\t\t\t\t}\r\n\r\n\t\t\t\t// this block removes the image editor\r\n\t\t\t\tif (this._imageEditor) {\r\n\t\t\t\t\tImageEditorEvents.forEach(function (e) {\r\n\t\t\t\t\t\t_this30._imageEditor.element.removeEventListener(e, _this30);\r\n\t\t\t\t\t});\r\n\t\t\t\t\tthis._imageEditor.destroy();\r\n\t\t\t\t\tthis._imageEditor = null;\r\n\t\t\t\t}\r\n\r\n\t\t\t\t// remove button event listeners\r\n\t\t\t\tnodeListToArray(this._btnGroup.children).forEach(function (btn) {\r\n\t\t\t\t\tbtn.removeEventListener('click', _this30);\r\n\t\t\t\t});\r\n\r\n\t\t\t\t// stop listening to input\r\n\t\t\t\tthis._input.removeEventListener('change', this);\r\n\r\n\t\t\t\t// detect if was wrapped, if so, remove wrapping (needs to have parent node)\r\n\t\t\t\tif (this._element !== this._originalElement && this._element.parentNode) {\r\n\t\t\t\t\tthis._element.parentNode.replaceChild(this._originalElement, this._element);\r\n\t\t\t\t}\r\n/*\r\n\t\t\t\t// restore HTML of original element\r\n\t\t\t\tthis._originalElement.innerHTML = this._originalElementInner;\r\n*/\r\n\t\t\t\t// get current attributes and remove all, then add original attributes\r\n\t\t\t\tfunction matchesAttributeInList(a, attributes) {\r\n\t\t\t\t\treturn attributes.filter(function (attr) {\r\n\t\t\t\t\t\treturn a.name === attr.name && a.value === attr.value;\r\n\t\t\t\t\t}).length !== 0;\r\n\t\t\t\t}\r\n\r\n\t\t\t\tvar attributes = getElementAttributes(this._originalElement);\r\n\t\t\t\tattributes.forEach(function (attribute) {\r\n\r\n\t\t\t\t\t// if attribute is contained in original element attribute list and is the same, don't remove\r\n\t\t\t\t\tif (matchesAttributeInList(attribute, _this30._originalElementAttributes)) {\r\n\t\t\t\t\t\treturn;\r\n\t\t\t\t\t}\r\n\r\n\t\t\t\t\t// else remove\r\n\t\t\t\t\t_this30._originalElement.removeAttribute(attribute.name);\r\n\t\t\t\t});\r\n\r\n\t\t\t\tthis._originalElementAttributes.forEach(function (attribute) {\r\n\r\n\t\t\t\t\t// attribute was never removed\r\n\t\t\t\t\tif (matchesAttributeInList(attribute, attributes)) {\r\n\t\t\t\t\t\treturn;\r\n\t\t\t\t\t}\r\n\r\n\t\t\t\t\t// add attribute\r\n\t\t\t\t\t_this30._originalElement.setAttribute(attribute.name, attribute.value);\r\n\t\t\t\t});\r\n\r\n\t\t\t\t// now destroyed this counter so the total Slim count can be lowered\r\n\t\t\t\tSlimCount = Math.max(0, SlimCount - 1);\r\n\r\n\t\t\t\t// if slim count has reached 0 it's time to clean up the popover\r\n\t\t\t\tif (SlimPopover && SlimCount === 0) {\r\n\t\t\t\t\tSlimPopover.destroy();\r\n\t\t\t\t\tSlimPopover = null;\r\n\t\t\t\t}\r\n\r\n\t\t\t\tthis._originalElement = null;\r\n\t\t\t\tthis._element = null;\r\n\t\t\t\tthis._input = null;\r\n\t\t\t\tthis._output = null;\r\n\t\t\t\tthis._btnGroup = null;\r\n\t\t\t\tthis._options = null;\r\n\t\t\t}\r\n\t\t}, {\r\n\t\t\tkey: 'dataBase64',\r\n\r\n\r\n\t\t\t/**\r\n\t * Public API\r\n\t */\r\n\t\t\t// properties\r\n\t\t\tget: function get() {\r\n\t\t\t\treturn flattenData(this._data, this._options.post, this._options.jpegCompression, this._options.forceType, this._options.service !== null);\r\n\t\t\t}\r\n\t\t}, {\r\n\t\t\tkey: 'data',\r\n\t\t\tget: function get() {\r\n\t\t\t\treturn cloneData(this._data);\r\n\t\t\t}\r\n\t\t}, {\r\n\t\t\tkey: 'element',\r\n\t\t\tget: function get() {\r\n\t\t\t\treturn this._element;\r\n\t\t\t}\r\n\t\t}, {\r\n\t\t\tkey: 'service',\r\n\t\t\tset: function set(service) {\r\n\t\t\t\tthis._options.service = service;\r\n\t\t\t}\r\n\t\t}, {\r\n\t\t\tkey: 'size',\r\n\t\t\tset: function set(dimensions) {\r\n\t\t\t\tthis.setSize(dimensions, null);\r\n\t\t\t}\r\n\t\t}, {\r\n\t\t\tkey: 'rotation',\r\n\t\t\tset: function set(rotation) {\r\n\t\t\t\tthis.setRotation(rotation, null);\r\n\t\t\t}\r\n\t\t}, {\r\n\t\t\tkey: 'ratio',\r\n\t\t\tset: function set(ratio) {\r\n\t\t\t\tthis.setRatio(ratio, null);\r\n\t\t\t}\r\n\t\t}], [{\r\n\t\t\tkey: 'options',\r\n\t\t\tvalue: function options() {\r\n\r\n\t\t\t\tvar defaults = {\r\n\r\n\t\t\t\t\t// edit button is enabled by default\r\n\t\t\t\t\tedit: true,\r\n\r\n\t\t\t\t\t// immidiately summons editor on load\r\n\t\t\t\t\tinstantEdit: false,\r\n\r\n\t\t\t\t\t// set to true to upload data as base64 string\r\n\t\t\t\t\tuploadBase64: false,\r\n\r\n\t\t\t\t\t// metadata values\r\n\t\t\t\t\tmeta: {},\r\n\r\n\t\t\t\t\t// ratio of crop by default is the same as input image ratio\r\n\t\t\t\t\tratio: 'free',\r\n\r\n\t\t\t\t\t// dimensions to resize the resulting image to\r\n\t\t\t\t\tsize: null,\r\n\r\n\t\t\t\t\t// set initial rotation\r\n\t\t\t\t\trotation: null,\r\n\r\n\t\t\t\t\t// initial crop settings for example: {x:0, y:0, width:100, height:100}\r\n\t\t\t\t\tcrop: null,\r\n\r\n\t\t\t\t\t// post these values\r\n\t\t\t\t\tpost: ['output', 'actions'],\r\n\r\n\t\t\t\t\t// call this service to submit cropped data\r\n\t\t\t\t\tservice: null,\r\n\r\n\t\t\t\t\t// sharpen filter value, really low values might improve image output\r\n\t\t\t\t\tfilterSharpen: 0,\r\n\r\n\t\t\t\t\t// when service is set, and this is set to true, Soon will auto upload all crops (also auto crops)\r\n\t\t\t\t\tpush: false,\r\n\r\n\t\t\t\t\t// default fallback name for field\r\n\t\t\t\t\tdefaultInputName: 'slim[]',\r\n\r\n\t\t\t\t\t// minimum size of cropped area object with width and height property\r\n\t\t\t\t\tminSize: {\r\n\t\t\t\t\t\twidth: 100,\r\n\t\t\t\t\t\theight: 100\r\n\t\t\t\t\t},\r\n\r\n\t\t\t\t\t// maximum file size in MB to upload\r\n\t\t\t\t\tmaxFileSize: null,\r\n\r\n\t\t\t\t\t// compression of JPEG (between 0 and 100)\r\n\t\t\t\t\tjpegCompression: null,\r\n\r\n\t\t\t\t\t// render download link\r\n\t\t\t\t\tdownload: false,\r\n\r\n\t\t\t\t\t// save initially loaded image\r\n\t\t\t\t\tsaveInitialImage: false,\r\n\r\n\t\t\t\t\t// the type to force (jpe|jpg|jpeg or png)\r\n\t\t\t\t\tforceType: false,\r\n\r\n\t\t\t\t\t// the forced output size of the image\r\n\t\t\t\t\tforceSize: null,\r\n\r\n\t\t\t\t\t// disable drop to replace\r\n\t\t\t\t\tdropReplace: true,\r\n\r\n\t\t\t\t\t// remote URL service\r\n\t\t\t\t\tfetcher: null,\r\n\r\n\t\t\t\t\t// set the internal canvas size\r\n\t\t\t\t\tinternalCanvasSize: {\r\n\t\t\t\t\t\twidth: 4096,\r\n\t\t\t\t\t\theight: 4096\r\n\t\t\t\t\t},\r\n\r\n\t\t\t\t\t// enable or disable rotation\r\n\t\t\t\t\trotateButton: true,\r\n\r\n\t\t\t\t\t// label HTML to show inside drop area\r\n\t\t\t\t\tlabel: 'Drop your image here
',\r\n\t\t\t\t\tlabelLoading: 'Loading image...
',\r\n\r\n\t\t\t\t\t// error messages\r\n\t\t\t\t\tstatusFileType: 'Invalid file type, expects: $0.
',\r\n\t\t\t\t\tstatusFileSize: 'File is too big, maximum file size: $0 MB.
',\r\n\t\t\t\t\tstatusNoSupport: 'Your browser does not support image cropping.
',\r\n\t\t\t\t\tstatusImageTooSmall: 'Image is too small, minimum size is: $0 pixels.
',\r\n\t\t\t\t\tstatusContentLength: ' The file is probably too big',\r\n\t\t\t\t\tstatusUnknownResponse: ' An unknown error occurred',\r\n\t\t\t\t\tstatusUploadSuccess: ' Saved',\r\n\r\n\t\t\t\t\t// callback methods\r\n\t\t\t\t\tdidInit: function didInit(data) { },\r\n\t\t\t\t\tdidLoad: function didLoad(file, image, meta) {\r\n\t\t\t\t\t\treturn true;\r\n\t\t\t\t\t},\r\n\t\t\t\t\tdidSave: function didSave(data) { },\r\n\t\t\t\t\tdidUpload: function didUpload(err, data, res) { },\r\n\t\t\t\t\tdidReceiveServerError: function didReceiveServerError(err, defaultError) {\r\n\t\t\t\t\t\treturn defaultError;\r\n\t\t\t\t\t},\r\n\t\t\t\t\tdidRemove: function didRemove(removeAction, data) { },\r\n\t\t\t\t\tdidTransform: function didTransform(data) { },\r\n\t\t\t\t\tdidConfirm: function didConfirm(data) { },\r\n\t\t\t\t\tdidCancel: function didCancel() { },\r\n\r\n\t\t\t\t\twillTransform: function willTransform(data, cb) {\r\n\t\t\t\t\t\tcb(data);\r\n\t\t\t\t\t},\r\n\t\t\t\t\twillSave: function willSave(data, cb) {\r\n\t\t\t\t\t\tcb(data);\r\n\t\t\t\t\t},\r\n\t\t\t\t\twillRemove: function willRemove(data, cb) {\r\n\t\t\t\t\t\tcb();\r\n\t\t\t\t\t},\r\n\t\t\t\t\twillRequest: function willRequest(xhr) { }\r\n\r\n\t\t\t\t};\r\n\r\n\t\t\t\t// add default button labels\r\n\t\t\t\tSlimButtons.concat(ImageEditor.Buttons).concat('rotate').forEach(function (btn) {\r\n\t\t\t\t\tvar capitalized = capitalizeFirstLetter(btn);\r\n\t\t\t\t\tdefaults['button' + capitalized + 'ClassName'] = null;\r\n\t\t\t\t\tdefaults['button' + capitalized + 'Label'] = capitalized;\r\n\t\t\t\t\tdefaults['button' + capitalized + 'Title'] = capitalized;\r\n\t\t\t\t});\r\n\r\n\t\t\t\treturn defaults;\r\n\t\t\t}\r\n\t\t}]);\r\n\r\n\t\treturn Slim;\r\n\t}();\r\n\r\n\t/**\r\n\t * Slim Static Methods\r\n\t */\r\n\r\n\r\n\t(function () {\r\n\r\n\t\tvar instances = [];\r\n\r\n\t\tvar indexOfElement = function indexOfElement(element) {\r\n\t\t\tvar i = 0;\r\n\t\t\tvar l = instances.length;\r\n\t\t\tfor (; i < l; i++) {\r\n\t\t\t\tif (instances[i].isAttachedTo(element)) {\r\n\t\t\t\t\treturn i;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\treturn -1;\r\n\t\t};\r\n\r\n\t\tfunction toLabel(v) {\r\n\t\t\t// if value set, use as label\r\n\t\t\tif (v) {\r\n\t\t\t\treturn '' + v + '
';\r\n\t\t\t}\r\n\r\n\t\t\t// else use default text\r\n\t\t\treturn null;\r\n\t\t}\r\n\r\n\t\tfunction toFunctionReference(name) {\r\n\t\t\tvar ref = window;\r\n\t\t\tvar levels = name.split('.');\r\n\t\t\tlevels.forEach(function (level, index) {\r\n\t\t\t\tif (!ref[levels[index]]) {\r\n\t\t\t\t\treturn;\r\n\t\t\t\t}\r\n\t\t\t\tref = ref[levels[index]];\r\n\t\t\t});\r\n\t\t\treturn ref !== window ? ref : null;\r\n\t\t}\r\n\r\n\t\tvar passThrough = function passThrough(v) {\r\n\t\t\treturn v;\r\n\t\t};\r\n\t\tvar defaultFalse = function defaultFalse(v) {\r\n\t\t\treturn v === 'true';\r\n\t\t};\r\n\t\tvar defaultTrue = function defaultTrue(v) {\r\n\t\t\treturn v ? v === 'true' : true;\r\n\t\t};\r\n\t\tvar defaultLabel = function defaultLabel(v) {\r\n\t\t\treturn toLabel(v);\r\n\t\t};\r\n\t\tvar defaultFunction = function defaultFunction(v) {\r\n\t\t\treturn v ? toFunctionReference(v) : null;\r\n\t\t};\r\n\t\tvar defaultSize = function defaultSize(v) {\r\n\t\t\tif (!v) {\r\n\t\t\t\treturn null;\r\n\t\t\t}\r\n\t\t\tvar parts = intSplit(v, ',');\r\n\t\t\treturn {\r\n\t\t\t\twidth: parts[0],\r\n\t\t\t\theight: parts[1]\r\n\t\t\t};\r\n\t\t};\r\n\r\n\t\tvar toFloat = function toFloat(v) {\r\n\t\t\tif (!v) {\r\n\t\t\t\treturn null;\r\n\t\t\t}\r\n\t\t\treturn parseFloat(v);\r\n\t\t};\r\n\r\n\t\tvar toInt = function toInt(v) {\r\n\t\t\tif (!v) {\r\n\t\t\t\treturn null;\r\n\t\t\t}\r\n\t\t\treturn parseInt(v, 10);\r\n\t\t};\r\n\r\n\t\tvar toRect = function toRect(v) {\r\n\t\t\tif (!v) {\r\n\t\t\t\treturn null;\r\n\t\t\t}\r\n\t\t\tvar obj = {};\r\n\t\t\tv.split(',').map(function (p) {\r\n\t\t\t\treturn parseInt(p, 10);\r\n\t\t\t}).forEach(function (v, i) {\r\n\t\t\t\tobj[Rect[i]] = v;\r\n\t\t\t});\r\n\t\t\treturn obj;\r\n\t\t};\r\n\r\n\t\tvar defaults = {\r\n\r\n\t\t\t// is user allowed to download the cropped image?\r\n\t\t\t'download': defaultFalse,\r\n\r\n\t\t\t// is user allowed to edit the cropped image?\r\n\t\t\t'edit': defaultTrue,\r\n\r\n\t\t\t// open editor immidiately on file drop\r\n\t\t\t'instantEdit': defaultFalse,\r\n\r\n\t\t\t// minimum crop size in pixels of original image\r\n\t\t\t'minSize': defaultSize,\r\n\r\n\t\t\t// the final bounding box of the output image\r\n\t\t\t'size': defaultSize,\r\n\r\n\t\t\t// the forced output size of the image\r\n\t\t\t'forceSize': defaultSize,\r\n\r\n\t\t\t// the internal data canvas size\r\n\t\t\t'internalCanvasSize': defaultSize,\r\n\r\n\t\t\t// url to post to\r\n\t\t\t'service': function service(v) {\r\n\t\t\t\treturn typeof v === 'undefined' ? null : v;\r\n\t\t\t},\r\n\r\n\t\t\t// url to fetch service\r\n\t\t\t'fetcher': function fetcher(v) {\r\n\t\t\t\treturn typeof v === 'undefined' ? null : v;\r\n\t\t\t},\r\n\r\n\t\t\t// set auto push mode\r\n\t\t\t'push': defaultFalse,\r\n\r\n\t\t\t// initial rotation\r\n\t\t\t'rotation': function rotation(v) {\r\n\t\t\t\treturn typeof v === 'undefined' ? null : parseInt(v, 10);\r\n\t\t\t},\r\n\r\n\t\t\t// set crop rect\r\n\t\t\t'crop': toRect,\r\n\r\n\t\t\t// what to post\r\n\t\t\t'post': function post(v) {\r\n\t\t\t\tif (!v) {\r\n\t\t\t\t\treturn null;\r\n\t\t\t\t}\r\n\t\t\t\treturn v.split(',').map(function (item) {\r\n\t\t\t\t\treturn item.trim();\r\n\t\t\t\t});\r\n\t\t\t},\r\n\r\n\t\t\t// default input name\r\n\t\t\t'defaultInputName': passThrough,\r\n\r\n\t\t\t// the ratio of the crop\r\n\t\t\t'ratio': function ratio(v) {\r\n\t\t\t\tif (!v) {\r\n\t\t\t\t\treturn null;\r\n\t\t\t\t}\r\n\t\t\t\treturn v;\r\n\t\t\t},\r\n\r\n\t\t\t// maximum file size\r\n\t\t\t'maxFileSize': toFloat,\r\n\r\n\t\t\t// sharpen filter\r\n\t\t\t'filterSharpen': toInt,\r\n\r\n\t\t\t// jpeg compression\r\n\t\t\t'jpegCompression': toInt,\r\n\r\n\t\t\t// base64 data uploading\r\n\t\t\t'uploadBase64': defaultFalse,\r\n\r\n\t\t\t// sets file type to force output to\r\n\t\t\t'forceType': passThrough,\r\n\r\n\t\t\t// drop to replace\r\n\t\t\t'dropReplace': defaultTrue,\r\n\r\n\t\t\t// bool determining if initial image should be saved\r\n\t\t\t'saveInitialImage': defaultFalse,\r\n\r\n\t\t\t// rotate button\r\n\t\t\t'rotateButton': defaultTrue,\r\n\r\n\t\t\t// default labels\r\n\t\t\t'label': defaultLabel,\r\n\t\t\t'labelLoading': defaultLabel\r\n\r\n\t\t};\r\n\r\n\t\t// labels\r\n\t\t['FileSize', 'FileType', 'NoSupport', 'ImageTooSmall'].forEach(function (status) {\r\n\t\t\tdefaults['status' + status] = defaultLabel;\r\n\t\t});\r\n\r\n\t\t// status\r\n\t\t['ContentLength', 'UnknownResponse', 'UploadSuccess'].forEach(function (status) {\r\n\t\t\tdefaults['status' + status] = passThrough;\r\n\t\t});\r\n\r\n\t\t// the did callbacks\r\n\t\t['Init', 'Load', 'Save', 'Upload', 'Remove', 'Transform', 'ReceiveServerError', 'Confirm', 'Cancel'].forEach(function (cb) {\r\n\t\t\tdefaults['did' + cb] = defaultFunction;\r\n\t\t});\r\n\r\n\t\t// the will callbacks\r\n\t\t['Transform', 'Save', 'Remove', 'Request'].forEach(function (cb) {\r\n\t\t\tdefaults['will' + cb] = defaultFunction;\r\n\t\t});\r\n\r\n\t\t// button defaults\r\n\t\tvar buttonOptions = ['ClassName', 'Label', 'Title'];\r\n\t\tSlimButtons.concat(ImageEditor.Buttons).concat('rotate').forEach(function (btn) {\r\n\t\t\tvar capitalized = capitalizeFirstLetter(btn);\r\n\t\t\tbuttonOptions.forEach(function (opt) {\r\n\t\t\t\tdefaults['button' + capitalized + opt] = passThrough;\r\n\t\t\t});\r\n\t\t});\r\n\r\n\t\tSlim.supported = function () {\r\n\r\n\t\t\treturn !(\r\n\r\n\t\t\t\t// is opera mini\r\n\t\t\t\tObject.prototype.toString.call(window.operamini) === '[object OperaMini]' ||\r\n\r\n\t\t\t\t// no event listener support\r\n\t\t\t\ttypeof window.addEventListener === 'undefined' ||\r\n\r\n\t\t\t\t// no file reader support\r\n\t\t\t\ttypeof window.FileReader === 'undefined' ||\r\n\r\n\t\t\t\t// no .createObjectURL support, used by download method but also convenient to exclude Android 4.3 and lower\r\n\t\t\t\t// Android 4.3 and lower don't support XHR2 responseType blob\r\n\t\t\t\ttypeof window.URL === 'undefined' || typeof window.URL.createObjectURL === 'undefined');\r\n\t\t}();\r\n\r\n\t\tSlim.parse = function (context) {\r\n\t\t\tvar elements;\r\n\t\t\tvar element;\r\n\t\t\tvar i;\r\n\t\t\tvar croppers = [];\r\n\r\n\t\t\t// find all crop elements and bind Crop behavior\r\n\t\t\telements = context.querySelectorAll('.slim:not([data-state])');\r\n\t\t\ti = elements.length;\r\n\r\n\t\t\twhile (i--) {\r\n\t\t\t\telement = elements[i];\r\n\t\t\t\tcroppers.push(Slim.create(element, Slim.getOptionsFromAttributes(element)));\r\n\t\t\t}\r\n\r\n\t\t\treturn croppers;\r\n\t\t};\r\n\r\n\t\tSlim.getOptionsFromAttributes = function (element) {\r\n\r\n\t\t\tvar dataset = getDataset(element);\r\n\r\n\t\t\tvar options = {\r\n\t\t\t\tmeta: {}\r\n\t\t\t};\r\n\r\n\t\t\tfor (var prop in dataset) {\r\n\r\n\t\t\t\tvar valueTransformer = defaults[prop];\r\n\t\t\t\tvar _value = dataset[prop];\r\n\r\n\t\t\t\tif (valueTransformer) {\r\n\t\t\t\t\t_value = valueTransformer(_value);\r\n\t\t\t\t\t_value = _value === null ? clone(Slim.options()[prop]) : _value;\r\n\t\t\t\t\toptions[prop] = _value;\r\n\t\t\t\t} else if (prop.indexOf('meta') === 0) {\r\n\t\t\t\t\toptions['meta'][lowercaseFirstLetter(prop.substr(4))] = _value;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\r\n\t\t\treturn options;\r\n\t\t};\r\n\r\n\t\tSlim.find = function (element) {\r\n\t\t\tvar result = instances.filter(function (instance) {\r\n\t\t\t\treturn instance.isAttachedTo(element);\r\n\t\t\t});\r\n\t\t\treturn result ? result[0] : null;\r\n\t\t};\r\n\r\n\t\tSlim.create = function (element, options) {\r\n\r\n\t\t\t// if already in array, can't create another slim\r\n\t\t\tif (Slim.find(element)) {\r\n\t\t\t\treturn;\r\n\t\t\t}\r\n\r\n\t\t\t// if no options supplied, try to get the options from the element\r\n\t\t\tif (!options) {\r\n\t\t\t\toptions = Slim.getOptionsFromAttributes(element);\r\n\t\t\t}\r\n\r\n\t\t\t// instance\r\n\t\t\tvar slim = new Slim(element, options);\r\n\r\n\t\t\t// add new slim\r\n\t\t\tinstances.push(slim);\r\n\r\n\t\t\t// return the slim instance\r\n\t\t\treturn slim;\r\n\t\t};\r\n\r\n\t\tSlim.destroy = function (element) {\r\n\t\t\tvar index = indexOfElement(element);\r\n\r\n\t\t\tif (index < 0) {\r\n\t\t\t\treturn false;\r\n\t\t\t}\r\n\r\n\t\t\tinstances[index].destroy();\r\n\t\t\tinstances.splice(index, 1);\r\n\r\n\t\t\treturn true;\r\n\t\t};\r\n\t})();\r\n\treturn Slim;\r\n}());\n/*\r\n * Toastr\r\n * Copyright 2012-2015\r\n * Authors: John Papa, Hans Fjällemark, and Tim Ferrell.\r\n * All Rights Reserved.\r\n * Use, reproduction, distribution, and modification of this code is subject to the terms and\r\n * conditions of the MIT license, available at http://www.opensource.org/licenses/mit-license.php\r\n *\r\n * ARIA Support: Greta Krafsig\r\n *\r\n * Project: https://github.com/CodeSeven/toastr\r\n */\r\n/* global define */\r\n; (function (define) {\r\n define(['jquery'], function ($) {\r\n return (function () {\r\n var $container;\r\n var listener;\r\n var toastId = 0;\r\n var toastType = {\r\n error: 'error',\r\n info: 'info',\r\n success: 'success',\r\n warning: 'warning'\r\n };\r\n\r\n var toastr = {\r\n clear: clear,\r\n remove: remove,\r\n error: error,\r\n getContainer: getContainer,\r\n info: info,\r\n options: {},\r\n subscribe: subscribe,\r\n success: success,\r\n version: '2.1.1',\r\n warning: warning\r\n };\r\n\r\n var previousToast;\r\n\r\n return toastr;\r\n\r\n ////////////////\r\n\r\n function error(message, title, optionsOverride) {\r\n return notify({\r\n type: toastType.error,\r\n iconClass: getOptions().iconClasses.error,\r\n message: message,\r\n optionsOverride: optionsOverride,\r\n title: title\r\n });\r\n }\r\n\r\n function getContainer(options, create) {\r\n if (!options) { options = getOptions(); }\r\n $container = $('#' + options.containerId);\r\n if ($container.length) {\r\n return $container;\r\n }\r\n if (create) {\r\n $container = createContainer(options);\r\n }\r\n return $container;\r\n }\r\n\r\n function info(message, title, optionsOverride) {\r\n return notify({\r\n type: toastType.info,\r\n iconClass: getOptions().iconClasses.info,\r\n message: message,\r\n optionsOverride: optionsOverride,\r\n title: title\r\n });\r\n }\r\n\r\n function subscribe(callback) {\r\n listener = callback;\r\n }\r\n\r\n function success(message, title, optionsOverride) {\r\n return notify({\r\n type: toastType.success,\r\n iconClass: getOptions().iconClasses.success,\r\n message: message,\r\n optionsOverride: optionsOverride,\r\n title: title\r\n });\r\n }\r\n\r\n function warning(message, title, optionsOverride) {\r\n return notify({\r\n type: toastType.warning,\r\n iconClass: getOptions().iconClasses.warning,\r\n message: message,\r\n optionsOverride: optionsOverride,\r\n title: title\r\n });\r\n }\r\n\r\n function clear($toastElement, clearOptions) {\r\n var options = getOptions();\r\n if (!$container) { getContainer(options); }\r\n if (!clearToast($toastElement, options, clearOptions)) {\r\n clearContainer(options);\r\n }\r\n }\r\n\r\n function remove($toastElement) {\r\n var options = getOptions();\r\n if (!$container) { getContainer(options); }\r\n if ($toastElement && $(':focus', $toastElement).length === 0) {\r\n removeToast($toastElement);\r\n return;\r\n }\r\n if ($container.children().length) {\r\n $container.remove();\r\n }\r\n }\r\n\r\n // internal functions\r\n\r\n function clearContainer (options) {\r\n var toastsToClear = $container.children();\r\n for (var i = toastsToClear.length - 1; i >= 0; i--) {\r\n clearToast($(toastsToClear[i]), options);\r\n }\r\n }\r\n\r\n function clearToast ($toastElement, options, clearOptions) {\r\n var force = clearOptions && clearOptions.force ? clearOptions.force : false;\r\n if ($toastElement && (force || $(':focus', $toastElement).length === 0)) {\r\n $toastElement[options.hideMethod]({\r\n duration: options.hideDuration,\r\n easing: options.hideEasing,\r\n complete: function () { removeToast($toastElement); }\r\n });\r\n return true;\r\n }\r\n return false;\r\n }\r\n\r\n function createContainer(options) {\r\n $container = $('')\r\n .attr('id', options.containerId)\r\n .addClass(options.positionClass)\r\n .attr('aria-live', 'polite')\r\n .attr('role', 'alert');\r\n\r\n $container.appendTo($(options.target));\r\n return $container;\r\n }\r\n\r\n function getDefaults() {\r\n return {\r\n tapToDismiss: true,\r\n toastClass: 'toast',\r\n containerId: 'toast-container',\r\n debug: false,\r\n\r\n showMethod: 'fadeIn', //fadeIn, slideDown, and show are built into jQuery\r\n showDuration: 300,\r\n showEasing: 'swing', //swing and linear are built into jQuery\r\n onShown: undefined,\r\n hideMethod: 'fadeOut',\r\n hideDuration: 1000,\r\n hideEasing: 'swing',\r\n onHidden: undefined,\r\n\r\n extendedTimeOut: 1000,\r\n iconClasses: {\r\n error: 'toast-error',\r\n info: 'toast-info',\r\n success: 'toast-success',\r\n warning: 'toast-warning'\r\n },\r\n iconClass: 'toast-info',\r\n positionClass: 'toast-top-right',\r\n timeOut: 5000, // Set timeOut and extendedTimeOut to 0 to make it sticky\r\n titleClass: 'toast-title',\r\n messageClass: 'toast-message',\r\n target: $(document.documentElement),\r\n closeHtml: '',\r\n newestOnTop: true,\r\n preventDuplicates: false,\r\n progressBar: false\r\n };\r\n }\r\n\r\n function publish(args) {\r\n if (!listener) { return; }\r\n listener(args);\r\n }\r\n\r\n function notify(map) {\r\n var options = getOptions();\r\n var iconClass = map.iconClass || options.iconClass;\r\n\r\n if (typeof (map.optionsOverride) !== 'undefined') {\r\n options = $.extend(options, map.optionsOverride);\r\n iconClass = map.optionsOverride.iconClass || iconClass;\r\n }\r\n\r\n if (shouldExit(options, map)) { return; }\r\n\r\n toastId++;\r\n\r\n $container = getContainer(options, true);\r\n\r\n var intervalId = null;\r\n var $toastElement = $('');\r\n var $titleElement = $('');\r\n var $messageElement = $('');\r\n var $progressElement = $('');\r\n var $closeElement = $(options.closeHtml);\r\n var progressBar = {\r\n intervalId: null,\r\n hideEta: null,\r\n maxHideTime: null\r\n };\r\n var response = {\r\n toastId: toastId,\r\n state: 'visible',\r\n startTime: new Date(),\r\n options: options,\r\n map: map\r\n };\r\n\r\n personalizeToast();\r\n\r\n displayToast();\r\n\r\n handleEvents();\r\n\r\n publish(response);\r\n\r\n if (options.debug && console) {\r\n console.log(response);\r\n }\r\n\r\n return $toastElement;\r\n\r\n function personalizeToast() {\r\n setIcon();\r\n setTitle();\r\n setMessage();\r\n setCloseButton();\r\n setProgressBar();\r\n setSequence();\r\n }\r\n\r\n function handleEvents() {\r\n $toastElement.hover(stickAround, delayedHideToast);\r\n if (!options.onclick && options.tapToDismiss) {\r\n $toastElement.click(hideToast);\r\n }\r\n\r\n if (options.closeButton && $closeElement) {\r\n $closeElement.click(function (event) {\r\n if (event.stopPropagation) {\r\n event.stopPropagation();\r\n } else if (event.cancelBubble !== undefined && event.cancelBubble !== true) {\r\n event.cancelBubble = true;\r\n }\r\n hideToast(true);\r\n });\r\n }\r\n\r\n if (options.onclick) {\r\n $toastElement.click(function () {\r\n options.onclick();\r\n hideToast();\r\n });\r\n }\r\n }\r\n\r\n function displayToast() {\r\n $toastElement.hide();\r\n\r\n $toastElement[options.showMethod](\r\n {duration: options.showDuration, easing: options.showEasing, complete: options.onShown}\r\n );\r\n\r\n if (options.timeOut > 0) {\r\n intervalId = setTimeout(hideToast, options.timeOut);\r\n progressBar.maxHideTime = parseFloat(options.timeOut);\r\n progressBar.hideEta = new Date().getTime() + progressBar.maxHideTime;\r\n if (options.progressBar) {\r\n progressBar.intervalId = setInterval(updateProgress, 10);\r\n }\r\n }\r\n }\r\n\r\n function setIcon() {\r\n if (map.iconClass) {\r\n $toastElement.addClass(options.toastClass).addClass(iconClass);\r\n }\r\n }\r\n\r\n function setSequence() {\r\n if (options.newestOnTop) {\r\n $container.prepend($toastElement);\r\n } else {\r\n $container.append($toastElement);\r\n }\r\n }\r\n\r\n function setTitle() {\r\n if (map.title) {\r\n $titleElement.append(map.title).addClass(options.titleClass);\r\n $toastElement.append($titleElement);\r\n }\r\n }\r\n\r\n function setMessage() {\r\n if (map.message) {\r\n $messageElement.append(map.message).addClass(options.messageClass);\r\n $toastElement.append($messageElement);\r\n }\r\n }\r\n\r\n function setCloseButton() {\r\n if (options.closeButton) {\r\n $closeElement.addClass('toast-close-button').attr('role', 'button');\r\n $toastElement.prepend($closeElement);\r\n }\r\n }\r\n\r\n function setProgressBar() {\r\n if (options.progressBar) {\r\n $progressElement.addClass('toast-progress');\r\n $toastElement.prepend($progressElement);\r\n }\r\n }\r\n\r\n function shouldExit(options, map) {\r\n if (options.preventDuplicates) {\r\n if (map.message === previousToast) {\r\n return true;\r\n } else {\r\n previousToast = map.message;\r\n }\r\n }\r\n return false;\r\n }\r\n\r\n function hideToast(override) {\r\n if ($(':focus', $toastElement).length && !override) {\r\n return;\r\n }\r\n clearTimeout(progressBar.intervalId);\r\n return $toastElement[options.hideMethod]({\r\n duration: options.hideDuration,\r\n easing: options.hideEasing,\r\n complete: function () {\r\n removeToast($toastElement);\r\n if (options.onHidden && response.state !== 'hidden') {\r\n options.onHidden();\r\n }\r\n response.state = 'hidden';\r\n response.endTime = new Date();\r\n publish(response);\r\n }\r\n });\r\n }\r\n\r\n function delayedHideToast() {\r\n if (options.timeOut > 0 || options.extendedTimeOut > 0) {\r\n intervalId = setTimeout(hideToast, options.extendedTimeOut);\r\n progressBar.maxHideTime = parseFloat(options.extendedTimeOut);\r\n progressBar.hideEta = new Date().getTime() + progressBar.maxHideTime;\r\n }\r\n }\r\n\r\n function stickAround() {\r\n clearTimeout(intervalId);\r\n progressBar.hideEta = 0;\r\n $toastElement.stop(true, true)[options.showMethod](\r\n {duration: options.showDuration, easing: options.showEasing}\r\n );\r\n }\r\n\r\n function updateProgress() {\r\n var percentage = ((progressBar.hideEta - (new Date().getTime())) / progressBar.maxHideTime) * 100;\r\n $progressElement.width(percentage + '%');\r\n }\r\n }\r\n\r\n function getOptions() {\r\n return $.extend({}, getDefaults(), toastr.options);\r\n }\r\n\r\n function removeToast($toastElement) {\r\n if (!$container) { $container = getContainer(); }\r\n if ($toastElement.is(':visible')) {\r\n return;\r\n }\r\n $toastElement.remove();\r\n $toastElement = null;\r\n if ($container.children().length === 0) {\r\n $container.remove();\r\n previousToast = undefined;\r\n }\r\n }\r\n\r\n })();\r\n });\r\n}(typeof define === 'function' && define.amd ? define : function (deps, factory) {\r\n if (typeof module !== 'undefined' && module.exports) { //Node\r\n module.exports = factory(require('jquery'));\r\n } else {\r\n window['toastr'] = factory(window['jQuery']);\r\n }\r\n}));\r\n\n/*\r\nThe MIT License (MIT)\r\nCopyright © 2006-2007 Kevin C. Olbrich\r\nCopyright © 2010-2016 LIM SAS (http://lim.eu) - Julien Sanchez\r\n\r\nPermission is hereby granted, free of charge, to any person obtaining a copy of\r\nthis software and associated documentation files (the \"Software\"), to deal in\r\nthe Software without restriction, including without limitation the rights to\r\nuse, copy, modify, merge, publish, distribute, sublicense, and/or sell copies\r\nof the Software, and to permit persons to whom the Software is furnished to do\r\nso, subject to the following conditions:\r\n\r\nThe above copyright notice and this permission notice shall be included in all\r\ncopies or substantial portions of the Software.\r\n\r\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\r\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\r\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\r\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\r\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\r\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\r\nSOFTWARE.\r\n*/\r\n(function (global, factory) {\r\n\ttypeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() :\r\n\ttypeof define === 'function' && define.amd ? define(factory) :\r\n\t(global.Qty = factory());\r\n}(this, (function () { 'use strict';\r\n\r\n/**\r\n * Tests if a value is a Qty instance\r\n *\r\n * @param {*} value - Value to test\r\n *\r\n * @returns {boolean} true if value is a Qty instance, false otherwise\r\n */\r\nfunction isQty(value) {\r\n return value instanceof Qty$1;\r\n}\r\n\r\n/**\r\n * Tests if a value is a string\r\n *\r\n * @param {*} value - Value to test\r\n *\r\n * @returns {boolean} true if value is a string, false otherwise\r\n */\r\nfunction isString(value) {\r\n return typeof value === \"string\" || value instanceof String;\r\n}\r\n\r\n/*\r\n * Prefer stricter Number.isFinite if currently supported.\r\n * To be dropped when ES6 is finalized. Obsolete browsers will\r\n * have to use ES6 polyfills.\r\n */\r\nvar isFiniteImpl = Number.isFinite || window.isFinite;\r\n/**\r\n * Tests if a value is a number\r\n *\r\n * @param {*} value - Value to test\r\n *\r\n * @returns {boolean} true if value is a number, false otherwise\r\n */\r\nfunction isNumber(value) {\r\n // Number.isFinite allows not to consider NaN or '1' as numbers\r\n return isFiniteImpl(value);\r\n}\r\n\r\n/*\r\n * Identity function\r\n */\r\nfunction identity(value) {\r\n return value;\r\n}\r\n\r\n/**\r\n * Returns unique strings from list\r\n *\r\n * @param {string[]} strings - array of strings\r\n *\r\n *\r\n * @returns {string[]} a new array of strings without duplicates\r\n */\r\nfunction uniq(strings) {\r\n var seen = {};\r\n return strings.filter(function(item) {\r\n return seen.hasOwnProperty(item) ? false : (seen[item] = true);\r\n });\r\n}\r\n\r\nfunction compareArray(array1, array2) {\r\n if (array2.length !== array1.length) {\r\n return false;\r\n }\r\n for (var i = 0; i < array1.length; i++) {\r\n if (array2[i].compareArray) {\r\n if (!array2[i].compareArray(array1[i])) {\r\n return false;\r\n }\r\n }\r\n if (array2[i] !== array1[i]) {\r\n return false;\r\n }\r\n }\r\n return true;\r\n}\r\n\r\nfunction assign(target, properties) {\r\n Object.keys(properties).forEach(function(key) {\r\n target[key] = properties[key];\r\n });\r\n}\r\n\r\n/**\r\n * Safely multiplies numbers while avoiding floating errors\r\n * like 0.1 * 0.1 => 0.010000000000000002\r\n *\r\n * @returns {number} result\r\n * @param {...number} number\r\n */\r\nfunction mulSafe() {\r\n var result = 1, decimals = 0;\r\n for (var i = 0; i < arguments.length; i++) {\r\n var arg = arguments[i];\r\n decimals = decimals + getFractional(arg);\r\n result *= arg;\r\n }\r\n\r\n return decimals !== 0 ? round(result, decimals) : result;\r\n}\r\n\r\n/**\r\n * Safely divides two numbers while avoiding floating errors\r\n * like 0.3 / 0.05 => 5.999999999999999\r\n *\r\n * @returns {number} result\r\n * @param {number} num Numerator\r\n * @param {number} den Denominator\r\n */\r\nfunction divSafe(num, den) {\r\n if (den === 0) {\r\n throw new Error(\"Divide by zero\");\r\n }\r\n\r\n var factor = Math.pow(10, getFractional(den));\r\n var invDen = factor / (factor * den);\r\n\r\n return mulSafe(num, invDen);\r\n}\r\n\r\n/**\r\n * Rounds value at the specified number of decimals\r\n *\r\n * @param {number} val - value to round\r\n * @param {number} decimals - number of decimals\r\n *\r\n * @returns {number} rounded number\r\n */\r\nfunction round(val, decimals) {\r\n return Math.round(val * Math.pow(10, decimals)) / Math.pow(10, decimals);\r\n}\r\n\r\nfunction getFractional(num) {\r\n // Check for NaNs or Infinities\r\n if (!isFinite(num)) {\r\n return 0;\r\n }\r\n\r\n // Faster than parsing strings\r\n // http://jsperf.com/count-decimals/2\r\n var count = 0;\r\n while (num % 1 !== 0) {\r\n num *= 10;\r\n count++;\r\n }\r\n return count;\r\n}\r\n\r\n/**\r\n * Custom error type definition\r\n * @constructor\r\n */\r\nfunction QtyError() {\r\n var err;\r\n if (!this) { // Allows to instantiate QtyError without new()\r\n err = Object.create(QtyError.prototype);\r\n QtyError.apply(err, arguments);\r\n return err;\r\n }\r\n err = Error.apply(this, arguments);\r\n this.name = \"QtyError\";\r\n this.message = err.message;\r\n this.stack = err.stack;\r\n}\r\nQtyError.prototype = Object.create(Error.prototype, {constructor: { value: QtyError }});\r\n\r\n/*\r\n * Throws incompatible units error\r\n * @param {string} left - units\r\n * @param {string} right - units incompatible with first argument\r\n * @throws \"Incompatible units\" error\r\n */\r\nfunction throwIncompatibleUnits(left, right) {\r\n throw new QtyError(\"Incompatible units: \" + left + \" and \" + right);\r\n}\r\n\r\nvar UNITS = {\r\n /* prefixes */\r\n \"