{"version":3,"file":"indexCombined-63c7f656.js","sources":["Core/indexCombined-63c7f656.js"],"sourcesContent":["function Resources() {\r\n\treturn {\r\n\t\tCommon: {\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\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, 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: \"

Hi there!

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: \"

Ciao!

Dal 23 aprile 2018, il portale Uptivo è raggiungibile esclusivamente da my.uptivo.fit.
Ricordati di aggiornare i preferiti del tuo browser!\",\r\n\t\t\t\tes: \"

¡Hola!

A partir del 23 de abril de 2018, Uptivo está disponible exclusivamente en my.uptivo.fit.
¡Recuerde actualizar los marcadores de su navegador!\",\r\n\t\t\t\tfr: \"

Bonjour!

À compter du 23 avril 2018, Uptivo est exclusivement disponible sur my.uptivo.fit.
N'oubliez pas de mettre à jour les favoris de votre navigateur!\",\r\n\t\t\t},\r\n\t\t\t\"add-comment\": {\r\n\t\t\t\ten: \"Add Feedback\",\r\n\t\t\t\tit: \"Commenta\",\r\n\t\t\t\tes: \"Añadir comentarios\",\r\n\t\t\t\tfr: \"Ajouter un feedback\",\r\n\t\t\t},\r\n\t\t\t\"edit-comment\": {\r\n\t\t\t\ten: \"Change your Feedback\",\r\n\t\t\t\tit: \"Cambia il tuo commento\",\r\n\t\t\t\tes: \"Cambiar sus comentarios\",\r\n\t\t\t\tfr: \"Modifier le feedback\",\r\n\t\t\t},\r\n\t\t\t\"training-comments-others\": {\r\n\t\t\t\ten: \"Your Trainer's feedback\",\r\n\t\t\t\tit: \"Il feedback del tuo trainer\",\r\n\t\t\t\tes: \"Comentarios de su entrenador\",\r\n\t\t\t\tfr: \"Le feedback de votre entraîneur\",\r\n\t\t\t},\r\n\t\t\t\"top-workout-athlete\": {\r\n\t\t\t\ten: \"That was awesome!\",\r\n\t\t\t\tit: \"Alla grande!\",\r\n\t\t\t\tes: \"¡Asombroso!\",\r\n\t\t\t\tfr: \"C'était génial!\",\r\n\t\t\t},\r\n\t\t\t\"top-workout-others\": {\r\n\t\t\t\ten: \"TOP workout!\",\r\n\t\t\t\tit: \"Allenamento TOP!\",\r\n\t\t\t\tes: \"¡Entrenamiento TOP!\",\r\n\t\t\t\tfr: \"SUPER entraînement!\",\r\n\t\t\t},\r\n\t\t\t\"good-workout-athlete\": {\r\n\t\t\t\ten: \"Way to go!\",\r\n\t\t\t\tit: \"Niente male!\",\r\n\t\t\t\tes: \"¡Así se hace!\",\r\n\t\t\t\tfr: \"Bravo!\",\r\n\t\t\t},\r\n\t\t\t\"good-workout-others\": {\r\n\t\t\t\ten: \"Good Workout!\",\r\n\t\t\t\tit: \"Buon allenamento!\",\r\n\t\t\t\tes: \"¡Buen entrenamiento!\",\r\n\t\t\t\tfr: \"Bon entraînement!\",\r\n\t\t\t},\r\n\t\t\t\"can-do-more-athlete\": {\r\n\t\t\t\ten: \"Could've done better…\",\r\n\t\t\t\tit: \"Ero un po' giù…\",\r\n\t\t\t\tes: \"Podría haberlo hecho mejor…\",\r\n\t\t\t\tfr: \"Peut mieux faire…\",\r\n\t\t\t},\r\n\t\t\t\"can-do-more-others\": {\r\n\t\t\t\ten: \"Not your best workout…\",\r\n\t\t\t\tit: \"Puoi fare di meglio…\",\r\n\t\t\t\tes: \"No ha sido su mejor entrenamiento…\",\r\n\t\t\t\tfr: \"Ça n'a pas été votre meilleur entraînement…\",\r\n\t\t\t},\r\n\t\t\t\"rate-this-workout-athlete\": {\r\n\t\t\t\ten: \"How did I feel?\",\r\n\t\t\t\tit: \"Come è andata?\",\r\n\t\t\t\tes: \"¿Cómo me sentí?\",\r\n\t\t\t\tfr: \"Comment me suis-je senti?\",\r\n\t\t\t},\r\n\t\t\t\"rate-this-workout-others\": {\r\n\t\t\t\ten: \"Add your feedback\",\r\n\t\t\t\tit: \"Commenta il training\",\r\n\t\t\t\tes: \"Añadir comentarios\",\r\n\t\t\t\tfr: \"Ajouter votre feedback\",\r\n\t\t\t},\r\n\t\t\t\"no-next-items\": {\r\n\t\t\t\ten: \"There are no further items\",\r\n\t\t\t\tit: \"Non ci sono elementi successivi\",\r\n\t\t\t\tes: \"No hay más artículos\",\r\n\t\t\t\tfr: \"Il n'y a pas d'autres éléments\",\r\n\t\t\t},\r\n\t\t\t\"no-prev-items\": {\r\n\t\t\t\ten: \"There are no previous items\",\r\n\t\t\t\tit: \"Non ci sono elementi precedenti\",\r\n\t\t\t\tes: \"No hay artículos anteriores\",\r\n\t\t\t\tfr: \"Il n'y a aucun élément précédent\",\r\n\t\t\t},\r\n\t\t\t\"user-training-programs\": {\r\n\t\t\t\ten: \"My Workout programs\",\r\n\t\t\t\tit: \"I miei Programmi di Allenamento\",\r\n\t\t\t\tes: \"Mis Programas de Entrenamiento\",\r\n\t\t\t\tfr: \"Mes Programmes d'Entraînement\",\r\n\t\t\t},\r\n\t\t\t\"my-videos\": {\r\n\t\t\t\ten: \"My Uptivo Actions\",\r\n\t\t\t\tit: \"Le mie Uptivo Actions\",\r\n\t\t\t\tes: \"Mis Acciones Uptivo\",\r\n\t\t\t\tfr: \"Mes Actions Uptivo\",\r\n\t\t\t},\r\n\t\t\t\"my-files\": {\r\n\t\t\t\ten: \"My Files\",\r\n\t\t\t\tit: \"I Miei File\",\r\n\t\t\t\tes: \"Mis Archivos\",\r\n\t\t\t\tfr: \"Mes Fichiers\",\r\n\t\t\t},\r\n\t\t\t\"message-templates\": {\r\n\t\t\t\ten: \"Messages\",\r\n\t\t\t\tit: \"Messaggi\",\r\n\t\t\t\tes: \"Mensajes\",\r\n\t\t\t\tfr: \"Messages\",\r\n\t\t\t},\r\n\t\t\tlanguage: {\r\n\t\t\t\ten: \"Language\",\r\n\t\t\t\tit: \"Lingua\",\r\n\t\t\t\tes: \"Idioma\",\r\n\t\t\t\tfr: \"Langue\",\r\n\t\t\t},\r\n\t\t\t\"change-picture\": {\r\n\t\t\t\ten: \"Change Picture\",\r\n\t\t\t\tit: \"Cambia Immagine\",\r\n\t\t\t\tes: \"Cambiar imagen\",\r\n\t\t\t\tfr: \"Changer d'image\",\r\n\t\t\t},\r\n\t\t\t\"remove-this-image\": {\r\n\t\t\t\ten: \"Do you really want to remove this image?\",\r\n\t\t\t\tit: \"Vuoi veramente rimuovere questa immagine?\",\r\n\t\t\t\tes: \"¿Realmente quieres eliminar esta imagen?\",\r\n\t\t\t\tfr: \"Voulez-vous vraiment supprimer cette image?\",\r\n\t\t\t},\r\n\t\t\t\"image-uploaded\": {\r\n\t\t\t\ten: \"Image Uploaded Successfully\",\r\n\t\t\t\tit: \"Immagine aggiornata con successo\",\r\n\t\t\t\tes: \"La imagen se ha subido correctamente\",\r\n\t\t\t\tfr: \"Téléchargement de l'image réussi\",\r\n\t\t\t},\r\n\t\t\tpicture: {\r\n\t\t\t\ten: \"Picture\",\r\n\t\t\t\tit: \"Immagine\",\r\n\t\t\t\tes: \"Imagen\",\r\n\t\t\t\tfr: \"Image\",\r\n\t\t\t},\r\n\t\t\t\"mark-all-as-read\": {\r\n\t\t\t\ten: \"Mark all as read\",\r\n\t\t\t\tit: \"Segna tutto come letto\",\r\n\t\t\t\tes: \"Marcar todos como leídos\",\r\n\t\t\t\tfr: \"Marquer tous comme lus\",\r\n\t\t\t},\r\n\t\t\t\"no-new-notifications\": {\r\n\t\t\t\ten: \"There are no new notifications\",\r\n\t\t\t\tit: \"Non sono presenti nuove notifiche\",\r\n\t\t\t\tes: \"No hay nuevas notificaciones\",\r\n\t\t\t\tfr: \"Il n'y a pas de nouvelles notifications\",\r\n\t\t\t},\r\n\t\t\t\"see-all-notifications\": {\r\n\t\t\t\ten: \"See All Notifications\",\r\n\t\t\t\tit: \"Guarda tutte le notifiche\",\r\n\t\t\t\tes: \"Ver todas las notificaciones\",\r\n\t\t\t\tfr: \"Voir toutes les notifications\",\r\n\t\t\t},\r\n\t\t\t\"go-club-logs\": {\r\n\t\t\t\ten: \"Go to Club Events Registry\",\r\n\t\t\t\tit: \"Vai al registro Eventi del Club\",\r\n\t\t\t\tes: \"Ir al Registro Eventos del Club\",\r\n\t\t\t\tfr: \"Aller au Registre Événements du Club\",\r\n\t\t\t},\r\n\t\t\t\"club-logs-registry\": {\r\n\t\t\t\ten: \"Club Logs Registry\",\r\n\t\t\t\tit: \"Registro Eventi del Club\",\r\n\t\t\t\tes: \"Registro Eventos del Club\",\r\n\t\t\t\tfr: \"Registre Événements du Club\",\r\n\t\t\t},\r\n\t\t\t\"no-new-tasks\": {\r\n\t\t\t\ten: \"There are no new tasks\",\r\n\t\t\t\tit: \"Non sono presenti nuovi tasks\",\r\n\t\t\t\tes: \"No hay nuevas tasks\",\r\n\t\t\t\tfr: \"Il n'y a pas de nouvelles tasks\",\r\n\t\t\t},\r\n\t\t\t\"see-all-tasks\": {\r\n\t\t\t\ten: \"See All tasks\",\r\n\t\t\t\tit: \"Guarda tutti i tasks\",\r\n\t\t\t\tes: \"Ver todas tasks\",\r\n\t\t\t\tfr: \"Voir toutes tasks\",\r\n\t\t\t},\r\n\t\t\t\"avg-calories\": {\r\n\t\t\t\ten: \"Avg Calories\",\r\n\t\t\t\tit: \"Calorie Medie\",\r\n\t\t\t\tes: \"Calorías promedio\",\r\n\t\t\t\tfr: \"Calories moy.\",\r\n\t\t\t},\r\n\t\t\t\"min-hr\": {\r\n\t\t\t\ten: \"Min HR\",\r\n\t\t\t\tit: \"FC Min\",\r\n\t\t\t\tes: \"FC mín\",\r\n\t\t\t\tfr: \"FC min.\",\r\n\t\t\t},\r\n\t\t\t\"avg-speed\": {\r\n\t\t\t\ten: \"Avg Speed\",\r\n\t\t\t\tit: \"Velocità Media\",\r\n\t\t\t\tes: \"Velocidad promedio\",\r\n\t\t\t\tfr: \"Vitesse moy.\",\r\n\t\t\t},\r\n\t\t\t\"avg-pace\": {\r\n\t\t\t\ten: \"Avg Pace\",\r\n\t\t\t\tit: \"Ritmo Medio\",\r\n\t\t\t\tes: \"Pasos promedio\",\r\n\t\t\t\tfr: \"Allure moy.\",\r\n\t\t\t},\r\n\t\t\tpace: {\r\n\t\t\t\ten: \"Pace\",\r\n\t\t\t\tit: \"Ritmo\",\r\n\t\t\t\tes: \"Pasos\",\r\n\t\t\t\tfr: \"Allure\",\r\n\t\t\t},\r\n\t\t\t\"avg-power\": {\r\n\t\t\t\ten: \"Avg Power\",\r\n\t\t\t\tit: \"Potenza Med\",\r\n\t\t\t\tes: \"Potencia promedio\",\r\n\t\t\t\tfr: \"Puissance moy.\",\r\n\t\t\t},\r\n\t\t\t\"avg-force\": {\r\n\t\t\t\ten: \"Avg Force\",\r\n\t\t\t\tit: \"Forza Med\",\r\n\t\t\t\tes: \"Fuerza promedio\",\r\n\t\t\t\tfr: \"Force moy.\",\r\n\t\t\t},\r\n\t\t\t\"avg-cadence\": {\r\n\t\t\t\ten: \"Avg Cadence\",\r\n\t\t\t\tit: \"Cadenza Med\",\r\n\t\t\t\tes: \"Cadencia promedio\",\r\n\t\t\t\tfr: \"Cadence moy.\",\r\n\t\t\t},\r\n\t\t\t\"max-power\": {\r\n\t\t\t\ten: \"Max Power\",\r\n\t\t\t\tit: \"Potenza Max\",\r\n\t\t\t\tes: \"Potencia máx\",\r\n\t\t\t\tfr: \"Puissance max.\",\r\n\t\t\t},\r\n\t\t\t\"avg-time\": {\r\n\t\t\t\ten: \"Avg Time\",\r\n\t\t\t\tit: \"Tempo Med\",\r\n\t\t\t\tes: \"Tiempo promedio\",\r\n\t\t\t\tfr: \"Temps moy.\",\r\n\t\t\t},\r\n\t\t\t\"bar-chart\": {\r\n\t\t\t\ten: \"Bar Chart\",\r\n\t\t\t\tit: \"Grafico a Barre\",\r\n\t\t\t\tes: \"Gráfico de barras\",\r\n\t\t\t\tfr: \"Diagramme\",\r\n\t\t\t},\r\n\t\t\t\"line-chart\": {\r\n\t\t\t\ten: \"Line Chart\",\r\n\t\t\t\tit: \"Grafico a Linea\",\r\n\t\t\t\tes: \"Gráfico de Líneas\",\r\n\t\t\t\tfr: \"Graphique linéaire\",\r\n\t\t\t},\r\n\t\t\t\"new-email\": {\r\n\t\t\t\ten: \"New Email\",\r\n\t\t\t\tit: \"Nuova Email\",\r\n\t\t\t\tes: \"Correo electrónico nuevo\",\r\n\t\t\t\tfr: \"Nouvelle adresse e-mail\",\r\n\t\t\t},\r\n\t\t\t\"confirm-email\": {\r\n\t\t\t\ten: \"Confirm Email\",\r\n\t\t\t\tit: \"Conferma Email\",\r\n\t\t\t\tes: \"Confirmar correo electrónico\",\r\n\t\t\t\tfr: \"Confirmer l'adresse e-mail\",\r\n\t\t\t},\r\n\t\t\t\"change-email\": {\r\n\t\t\t\ten: \"Change Email\",\r\n\t\t\t\tit: \"Cambia Email\",\r\n\t\t\t\tes: \"Cambiar dirección de correo electrónico\",\r\n\t\t\t\tfr: \"Changer l'e-mail\",\r\n\t\t\t},\r\n\t\t\t\"change-email-info\": {\r\n\t\t\t\ten: \"You are about to change the email you use for login and Uptivo notifications\",\r\n\t\t\t\tit: \"Stai per cambiare l'email usata per il login e per le notifiche di Uptivo\",\r\n\t\t\t\tes: \"Está a punto de cambiar el correo electrónico que utiliza para iniciar sesión y las notificaciones de Uptivo\",\r\n\t\t\t\tfr: \"Vous êtes sur le point de modifier l'e-mail que vous utilisez pour les connexions et les notifications Uptivo\",\r\n\t\t\t},\r\n\t\t\t\"add-sensor\": {\r\n\t\t\t\ten: \"Add Sensor\",\r\n\t\t\t\tit: \"Aggiungi Sensore\",\r\n\t\t\t\tes: \"Añadir Sensor\",\r\n\t\t\t\tfr: \"Ajouter un capteur\",\r\n\t\t\t},\r\n\t\t\t\"add-uptivo-sensor\": {\r\n\t\t\t\ten: \"Add Uptivo Sensor by ID\",\r\n\t\t\t\tit: \"Aggiungi Sensore Uptivo con ID\",\r\n\t\t\t\tes: \"Añadir Uptivo Sensor por ID\",\r\n\t\t\t\tfr: \"Ajouter la ceinture Uptivo par identifiant\",\r\n\t\t\t},\r\n\t\t\t\"add-uptivo-sensor-desc\": {\r\n\t\t\t\ten: \"Please type the 7-digit ID that you can find on the back of your Uptivo Sensor.\",\r\n\t\t\t\tit: \"Scrivi l’ID a 7 cifre stampato sul retro del tuo sensore Uptivo.\",\r\n\t\t\t\tes: \"Por favor, introduzca la ID de 7 dígitos que puede encontrar en la parte posterior de su Sensor Uptivo.\",\r\n\t\t\t\tfr: \"Veuillez taper l'identifiant à 7 chiffres que vous pouvez trouver à l'arrière de votre Capteur Uptivo.\",\r\n\t\t\t},\r\n\t\t\t\"add-mz-sensor\": {\r\n\t\t\t\ten: \"Add MZ Sensor by SN\",\r\n\t\t\t\tit: \"Aggiungi Sensore MZ con SN\",\r\n\t\t\t\tes: \"Añadir MZ Sensor por SN\",\r\n\t\t\t\tfr: \"Ajouter la ceinture MZ par SN\",\r\n\t\t\t},\r\n\t\t\t\"add-garmin-sensor\": {\r\n\t\t\t\ten: \"Add Garmin Sensor by SN\",\r\n\t\t\t\tit: \"Aggiungi Sensore Garmin con SN\",\r\n\t\t\t\tes: \"Añadir Sensor Garmin por SN\",\r\n\t\t\t\tfr: \"Ajouter la ceinture Garmin par SN\",\r\n\t\t\t},\r\n\t\t\t\"edit-demo-user\": {\r\n\t\t\t\ten: \"Edit Demo User\",\r\n\t\t\t\tit: \"Modifica Utente Demo\",\r\n\t\t\t\tes: \"Editar usuario demo\",\r\n\t\t\t\tfr: \"Modifier l'Utilisateur Démo\",\r\n\t\t\t},\r\n\t\t\tnotifications: {\r\n\t\t\t\ten: \"Notifications\",\r\n\t\t\t\tit: \"Notifiche\",\r\n\t\t\t\tes: \"Notificaciones\",\r\n\t\t\t\tfr: \"Notifications\",\r\n\t\t\t},\r\n\t\t\trankings: {\r\n\t\t\t\ten: \"Rankings\",\r\n\t\t\t\tit: \"Classifiche\",\r\n\t\t\t\tes: \"Posiciones\",\r\n\t\t\t\tfr: \"Classements\",\r\n\t\t\t},\r\n\t\t\tranking: {\r\n\t\t\t\ten: \"Ranking\",\r\n\t\t\t\tit: \"Classifica\",\r\n\t\t\t\tes: \"Clasificación\",\r\n\t\t\t\tfr: \"Classement\",\r\n\t\t\t},\r\n\t\t\tobjectives: {\r\n\t\t\t\ten: \"Objectives\",\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\t\"ranking-prc\": {\r\n\t\t\t\ten: \"Ranking Prc\",\r\n\t\t\t\tit: \"Classifica Prc\",\r\n\t\t\t\tes: \"Clasificación Prc\",\r\n\t\t\t\tfr: \"Classement Prc\",\r\n\t\t\t},\r\n\t\t\t\"public-rankings\": {\r\n\t\t\t\ten: \"Public Rankings\",\r\n\t\t\t\tit: \"Classifiche Pubbliche\",\r\n\t\t\t\tes: \"Clasificaciones públicas\",\r\n\t\t\t\tfr: \"Classements publics\",\r\n\t\t\t},\r\n\t\t\t\"no-public-rankings\": {\r\n\t\t\t\ten: \"No Public Rankings\",\r\n\t\t\t\tit: \"Nessuna Classifica Pubblica\",\r\n\t\t\t\tes: \"Sin Clasificaciones Públicas\",\r\n\t\t\t\tfr: \"Aucun Classement Public\",\r\n\t\t\t},\r\n\t\t\t\"uptivo-sensor-id\": {\r\n\t\t\t\ten: \"Uptivo Sensor ID\",\r\n\t\t\t\tit: \"ID del Sensore Uptivo\",\r\n\t\t\t\tes: \"ID del Sensor Uptivo\",\r\n\t\t\t\tfr: \"Identification du Capteur Uptivo\",\r\n\t\t\t},\r\n\t\t\t\"mz-sensor-id\": {\r\n\t\t\t\ten: \"MZ Sensor SN\",\r\n\t\t\t\tit: \"SN del Sensore MZ\",\r\n\t\t\t\tes: \"SN del Sensor MZ\",\r\n\t\t\t\tfr: \"SN du Capteur MZ\",\r\n\t\t\t},\r\n\t\t\t\"garmin-sensor-id\": {\r\n\t\t\t\ten: \"Garmin Sensor SN\",\r\n\t\t\t\tit: \"SN del Sensore Garmin\",\r\n\t\t\t\tes: \"SN del Sensor Garmin\",\r\n\t\t\t\tfr: \"SN du Capteur Garmin\",\r\n\t\t\t},\r\n\t\t\toptional: {\r\n\t\t\t\ten: \"optional\",\r\n\t\t\t\tit: \"opzionale\",\r\n\t\t\t\tes: \"opcional\",\r\n\t\t\t\tfr: \"optionnel\",\r\n\t\t\t},\r\n\t\t\taccount: {\r\n\t\t\t\ten: \"Account\",\r\n\t\t\t\tit: \"Account\",\r\n\t\t\t\tes: \"Cuenta\",\r\n\t\t\t\tfr: \"Compte\",\r\n\t\t\t},\r\n\t\t\t\"creation-successful\": {\r\n\t\t\t\ten: \"Creation successful\",\r\n\t\t\t\tit: \"Creazione effettuata con successo\",\r\n\t\t\t\tes: \"Se ha creado correctamente\",\r\n\t\t\t\tfr: \"Création réussie\",\r\n\t\t\t},\r\n\t\t\t\"update-successful\": {\r\n\t\t\t\ten: \"Update successful\",\r\n\t\t\t\tit: \"Aggiornamento riuscito\",\r\n\t\t\t\tes: \"Actualización exitosa\",\r\n\t\t\t\tfr: \"Mise à jour réussie\",\r\n\t\t\t},\r\n\t\t\t\"operation-failed\": {\r\n\t\t\t\ten: \"Operation failed\",\r\n\t\t\t\tit: \"Operazione fallita\",\r\n\t\t\t\tes: \"Operación fallida.\",\r\n\t\t\t\tfr: \"L'opération n'a pas abouti\",\r\n\t\t\t},\r\n\t\t\t\"operation-complete\": {\r\n\t\t\t\ten: \"Operation complete\",\r\n\t\t\t\tit: \"Operazione completata\",\r\n\t\t\t\tes: \"Operación completa\",\r\n\t\t\t\tfr: \"Opération terminée\",\r\n\t\t\t},\r\n\t\t\t\"changes-saved\": {\r\n\t\t\t\ten: \"Successfully saved changes\",\r\n\t\t\t\tit: \"Cambiamenti effettuati con successo\",\r\n\t\t\t\tes: \"Los cambios se han guardado correctamente\",\r\n\t\t\t\tfr: \"Changements enregistrés avec succès\",\r\n\t\t\t},\r\n\t\t\t\"delete-successful\": {\r\n\t\t\t\ten: \"Delete successful\",\r\n\t\t\t\tit: \"Cancellazione effettuata con successo\",\r\n\t\t\t\tes: \"Eliminado correctamente\",\r\n\t\t\t\tfr: \"Suppression réussie\",\r\n\t\t\t},\r\n\t\t\t\"get-failed\": {\r\n\t\t\t\ten: \"Couldn't load data from server\",\r\n\t\t\t\tit: \"Non è stato possibile scaricare i dati dal server\",\r\n\t\t\t\tes: \"No se pudieron cargar los datos del servidor\",\r\n\t\t\t\tfr: \"Impossible de charger les données du serveur\",\r\n\t\t\t},\r\n\t\t\t\"creation-failed\": {\r\n\t\t\t\ten: \"Creation error\",\r\n\t\t\t\tit: \"Errore di creazione\",\r\n\t\t\t\tes: \"Error al crear\",\r\n\t\t\t\tfr: \"Erreur lors de la création\",\r\n\t\t\t},\r\n\t\t\t\"update-failed\": {\r\n\t\t\t\ten: \"Error updating data\",\r\n\t\t\t\tit: \"Errore nell'aggiornamento dei dati\",\r\n\t\t\t\tes: \"Error al actualizar los datos\",\r\n\t\t\t\tfr: \"Erreur lors de la mise à jour des données\",\r\n\t\t\t},\r\n\t\t\t\"delete-failed\": {\r\n\t\t\t\ten: \"Deletion error\",\r\n\t\t\t\tit: \"Errore nella cancellazione dei dati\",\r\n\t\t\t\tes: \"Error de eliminación\",\r\n\t\t\t\tfr: \"Erreur lors de la suppression\",\r\n\t\t\t},\r\n\t\t\terror: {\r\n\t\t\t\ten: \"Error\",\r\n\t\t\t\tit: \"Errore\",\r\n\t\t\t\tes: \"Error\",\r\n\t\t\t\tfr: \"Erreur\",\r\n\t\t\t},\r\n\t\t\tbadge: {\r\n\t\t\t\ten: \"Badge\",\r\n\t\t\t\tit: \"Badge\",\r\n\t\t\t\tes: \"Badge\",\r\n\t\t\t\tfr: \"Badge\",\r\n\t\t\t},\r\n\t\t\t\"server-error\": {\r\n\t\t\t\ten: \"Network or Server Problem\",\r\n\t\t\t\tit: \"Errore di rete o del server\",\r\n\t\t\t\tes: \"Problema de red o servidor\",\r\n\t\t\t\tfr: \"Problème de réseau ou de serveur\",\r\n\t\t\t},\r\n\t\t\t\"component-load-error\": {\r\n\t\t\t\ten: \"This component could not be downloaded, check the network and reload the page\",\r\n\t\t\t\tit: \"Non è stato possibile scaricare questo componente, verificare la rete e ricaricare la pagina\",\r\n\t\t\t\tes: \"Este componente no se pudo descargar, verifique la red y vuelva a cargar la página\",\r\n\t\t\t\tfr: \"Ce composant n'a pas pu être téléchargé, vérifiez le réseau et rechargez la page\",\r\n\t\t\t},\r\n\t\t\t\"error-license-limit-exceeded\": {\r\n\t\t\t\ten: \"No License or Limits Exceeded\",\r\n\t\t\t\tit: \"Nessuna licenza o limiti superati\",\r\n\t\t\t\tes: \"Sin licencia o límites excedidos\",\r\n\t\t\t\tfr: \"Aucune licence, ou limites dépassées\",\r\n\t\t\t},\r\n\t\t\t\"error-no-license\": {\r\n\t\t\t\ten: \"No Valid License\",\r\n\t\t\t\tit: \"Nessuna licenza valida\",\r\n\t\t\t\tes: \"Sin licencia válida\",\r\n\t\t\t\tfr: \"Pas de licence valable\",\r\n\t\t\t},\r\n\t\t\tmiles: {\r\n\t\t\t\ten: \"miles\",\r\n\t\t\t\tit: \"miglia\",\r\n\t\t\t\tes: \"millas\",\r\n\t\t\t\tfr: \"miles\",\r\n\t\t\t},\r\n\t\t\trename: {\r\n\t\t\t\ten: \"Rename\",\r\n\t\t\t\tit: \"Rinomina\",\r\n\t\t\t\tes: \"Cambiar el nombre\",\r\n\t\t\t\tfr: \"Renommer\",\r\n\t\t\t},\r\n\t\t\t\"age-comprised-between\": {\r\n\t\t\t\ten: \"Age must be comprised between {0} and {1}\",\r\n\t\t\t\tit: \"L'età deve essere compresa tra {0} e {1}\",\r\n\t\t\t\tes: \"La edad debe estar comprendida entre {0} y {1}\",\r\n\t\t\t\tfr: \"L'âge doit être compris entre {0} et {1}\",\r\n\t\t\t},\r\n\t\t\t\"value-multiple-of\": {\r\n\t\t\t\ten: \"Value must be multiple of {0} seconds\",\r\n\t\t\t\tit: \"Il valore deve essere multiplo di {0} secondi\",\r\n\t\t\t\tes: \"El valor debe ser múltiplo de {0} segundos\",\r\n\t\t\t\tfr: \"La valeur doit être multiple de {0} secondes\",\r\n\t\t\t},\r\n\t\t\t\"enter-valid-number\": {\r\n\t\t\t\ten: \"Please enter a valid number (separators: '{0}' for thousands, '{1}' for decimals)\",\r\n\t\t\t\tit: \"Inserisci un numero valido (separatori: '{0}' per migliaia, '{1}' per decimali)\",\r\n\t\t\t\tes: \"Ingrese un número válido (separadores: '{0}' para miles, '{1}' para decimales)\",\r\n\t\t\t\tfr: \"Veuillez saisir un nombre valide (séparateurs: '{0}' pour les milliers, '{1}' pour les décimaux)\",\r\n\t\t\t},\r\n\t\t\t\"enter-valid-url\": {\r\n\t\t\t\ten: \"Please enter a valid web URL starting with http:// or https://\",\r\n\t\t\t\tit: \"Inserisci un URL web valido che inizi con http:// o https://\",\r\n\t\t\t\tes: \"Ingrese una URL web válida que comience con http:// o https://\",\r\n\t\t\t\tfr: \"Veuillez entrer une URL Web valide commençant par http:// ou https://\",\r\n\t\t\t},\r\n\t\t\t\"enter-valid-ipv4\": {\r\n\t\t\t\ten: \"Please enter a valid IPv4 address\",\r\n\t\t\t\tit: \"Inserisci un indirizzo IPv4 valido\",\r\n\t\t\t\tes: \"Por favor, introduzca una dirección de IPv4 válida\",\r\n\t\t\t\tfr: \"Veuillez saisir une adresse IPv4 valide\",\r\n\t\t\t},\r\n\t\t\tstatus: {\r\n\t\t\t\ten: \"Status\",\r\n\t\t\t\tit: \"Stato\",\r\n\t\t\t\tes: \"Estado\",\r\n\t\t\t\tfr: \"État\",\r\n\t\t\t},\r\n\t\t\tadd: {\r\n\t\t\t\ten: \"Add\",\r\n\t\t\t\tit: \"Aggiungi\",\r\n\t\t\t\tes: \"Añadir\",\r\n\t\t\t\tfr: \"Ajouter\",\r\n\t\t\t},\r\n\t\t\tcancel: {\r\n\t\t\t\ten: \"Cancel\",\r\n\t\t\t\tit: \"Annulla\",\r\n\t\t\t\tes: \"Cancelar\",\r\n\t\t\t\tfr: \"Annuler\",\r\n\t\t\t},\r\n\t\t\tdistance: {\r\n\t\t\t\ten: \"Distance\",\r\n\t\t\t\tit: \"Distanza\",\r\n\t\t\t\tes: \"Distancia\",\r\n\t\t\t\tfr: \"Distance\",\r\n\t\t\t},\r\n\t\t\tcalories: {\r\n\t\t\t\ten: \"Calories\",\r\n\t\t\t\tit: \"Calorie\",\r\n\t\t\t\tes: \"Calorías\",\r\n\t\t\t\tfr: \"Calories\",\r\n\t\t\t},\r\n\t\t\t\"add-new-group\": {\r\n\t\t\t\ten: \"Add New Room\",\r\n\t\t\t\tit: \"Aggiungi Nuova Sala\",\r\n\t\t\t\tes: \"Añadir Nueva Sala\",\r\n\t\t\t\tfr: \"Ajouter Une Nouvelle Salle\",\r\n\t\t\t},\r\n\t\t\tphone: {\r\n\t\t\t\ten: \"Phone\",\r\n\t\t\t\tit: \"Telefono\",\r\n\t\t\t\tes: \"Teléfono\",\r\n\t\t\t\tfr: \"Téléphone\",\r\n\t\t\t},\r\n\t\t\t\"max-hr\": {\r\n\t\t\t\ten: \"Max HR\",\r\n\t\t\t\tit: \"FC Max\",\r\n\t\t\t\tes: \"FC máx.\",\r\n\t\t\t\tfr: \"FC max.\",\r\n\t\t\t},\r\n\t\t\t\"avg-hr\": {\r\n\t\t\t\ten: \"Avg HR\",\r\n\t\t\t\tit: \"FC Med\",\r\n\t\t\t\tes: \"FC promedio\",\r\n\t\t\t\tfr: \"FC moy.\",\r\n\t\t\t},\r\n\t\t\ten: {\r\n\t\t\t\ten: \"English\",\r\n\t\t\t\tit: \"Inglese\",\r\n\t\t\t\tes: \"Inglés\",\r\n\t\t\t\tfr: \"Anglais\",\r\n\t\t\t},\r\n\t\t\tlogo: {\r\n\t\t\t\ten: \"Logo\",\r\n\t\t\t\tit: \"Logo\",\r\n\t\t\t\tes: \"Logotipo\",\r\n\t\t\t\tfr: \"Logo\",\r\n\t\t\t},\r\n\t\t\tdelete: {\r\n\t\t\t\ten: \"Delete\",\r\n\t\t\t\tit: \"Elimina\",\r\n\t\t\t\tes: \"Eliminar\",\r\n\t\t\t\tfr: \"Supprimer\",\r\n\t\t\t},\r\n\t\t\t\"change-logo\": {\r\n\t\t\t\ten: \"Change Logo\",\r\n\t\t\t\tit: \"Cambia Logo\",\r\n\t\t\t\tes: \"Cambiar logotipo\",\r\n\t\t\t\tfr: \"Modifier le logo\",\r\n\t\t\t},\r\n\t\t\t\"save-changes\": {\r\n\t\t\t\ten: \"Save\",\r\n\t\t\t\tit: \"Salva\",\r\n\t\t\t\tes: \"Guardar\",\r\n\t\t\t\tfr: \"Enregistrer\",\r\n\t\t\t},\r\n\t\t\tclose: {\r\n\t\t\t\ten: \"Close\",\r\n\t\t\t\tit: \"Chiudi\",\r\n\t\t\t\tes: \"Cerrar\",\r\n\t\t\t\tfr: \"Fermer\",\r\n\t\t\t},\r\n\t\t\t\"clear-selection\": {\r\n\t\t\t\ten: \"Deselect All\",\r\n\t\t\t\tit: \"Deseleziona tutto\",\r\n\t\t\t\tes: \"Deseleccionar todo\",\r\n\t\t\t\tfr: \"Désélectionner tous\",\r\n\t\t\t},\r\n\t\t\t\"resize-logo\": {\r\n\t\t\t\ten: \"Resize Logo\",\r\n\t\t\t\tit: \"Ridimensiona Logo\",\r\n\t\t\t\tes: \"Cambiar el tamaño del logotipo\",\r\n\t\t\t\tfr: \"Redimensionner le logo\",\r\n\t\t\t},\r\n\t\t\tsubmit: {\r\n\t\t\t\ten: \"Submit\",\r\n\t\t\t\tit: \"Invia\",\r\n\t\t\t\tes: \"Enviar\",\r\n\t\t\t\tfr: \"Transmettre\",\r\n\t\t\t},\r\n\t\t\temail: {\r\n\t\t\t\ten: \"Email\",\r\n\t\t\t\tit: \"Email\",\r\n\t\t\t\tes: \"Correo electrónico\",\r\n\t\t\t\tfr: \"E-mail\",\r\n\t\t\t},\r\n\t\t\tclubs: {\r\n\t\t\t\ten: \"Clubs\",\r\n\t\t\t\tit: \"Club\",\r\n\t\t\t\tes: \"Club\",\r\n\t\t\t\tfr: \"Club\",\r\n\t\t\t},\r\n\t\t\tclub: {\r\n\t\t\t\ten: \"Club\",\r\n\t\t\t\tit: \"Club\",\r\n\t\t\t\tes: \"Club\",\r\n\t\t\t\tfr: \"Club\",\r\n\t\t\t},\r\n\t\t\tequipment: {\r\n\t\t\t\ten: \"Equipment\",\r\n\t\t\t\tit: \"Attrezzature\",\r\n\t\t\t\tes: \"Equipo\",\r\n\t\t\t\tfr: \"Équipement\",\r\n\t\t\t},\r\n\t\t\tguest: {\r\n\t\t\t\ten: \"Guest\",\r\n\t\t\t\tit: \"Guest\",\r\n\t\t\t\tes: \"Guest\",\r\n\t\t\t\tfr: \"Guest\",\r\n\t\t\t},\r\n\t\t\tathlete: {\r\n\t\t\t\ten: \"Athlete\",\r\n\t\t\t\tit: \"Atleta\",\r\n\t\t\t\tes: \"Deportista\",\r\n\t\t\t\tfr: \"Athlète\",\r\n\t\t\t},\r\n\t\t\tmanager: {\r\n\t\t\t\ten: \"Manager\",\r\n\t\t\t\tit: \"Manager\",\r\n\t\t\t\tes: \"Gerente\",\r\n\t\t\t\tfr: \"Gestionnaire\",\r\n\t\t\t},\r\n\t\t\t\"athlete-small\": {\r\n\t\t\t\ten: \"A\",\r\n\t\t\t\tit: \"A\",\r\n\t\t\t\tes: \"D\",\r\n\t\t\t\tfr: \"A\",\r\n\t\t\t},\r\n\t\t\t\"trainer-small\": {\r\n\t\t\t\ten: \"T\",\r\n\t\t\t\tit: \"T\",\r\n\t\t\t\tes: \"E\",\r\n\t\t\t\tfr: \"T\",\r\n\t\t\t},\r\n\t\t\t\"manager-small\": {\r\n\t\t\t\ten: \"M\",\r\n\t\t\t\tit: \"M\",\r\n\t\t\t\tes: \"G\",\r\n\t\t\t\tfr: \"M\",\r\n\t\t\t},\r\n\t\t\tgender: {\r\n\t\t\t\ten: \"Gender\",\r\n\t\t\t\tit: \"Sesso\",\r\n\t\t\t\tes: \"Sexo\",\r\n\t\t\t\tfr: \"Genre\",\r\n\t\t\t},\r\n\t\t\ttext: {\r\n\t\t\t\ten: \"Text\",\r\n\t\t\t\tit: \"Testo\",\r\n\t\t\t\tes: \"Texto\",\r\n\t\t\t\tfr: \"Texte\",\r\n\t\t\t},\r\n\t\t\tauthor: {\r\n\t\t\t\ten: \"Author\",\r\n\t\t\t\tit: \"Autore\",\r\n\t\t\t\tes: \"Autor\",\r\n\t\t\t\tfr: \"Auteur\",\r\n\t\t\t},\r\n\t\t\t\"nickname-display\": {\r\n\t\t\t\ten: \"Nickname (display name)\",\r\n\t\t\t\tit: \"Nickname (nome a schermo)\",\r\n\t\t\t\tes: \"Apodo (nombre que se muestra)\",\r\n\t\t\t\tfr: \"Pseudo (nom d'affichage)\",\r\n\t\t\t},\r\n\t\t\tunspecified: {\r\n\t\t\t\ten: \"Unspecified\",\r\n\t\t\t\tit: \"Non Specificato\",\r\n\t\t\t\tes: \"No especificado\",\r\n\t\t\t\tfr: \"Non spécifié\",\r\n\t\t\t},\r\n\t\t\tmales: {\r\n\t\t\t\ten: \"Males\",\r\n\t\t\t\tit: \"Maschi\",\r\n\t\t\t\tes: \"Hombres\",\r\n\t\t\t\tfr: \"Hommes\",\r\n\t\t\t},\r\n\t\t\tmale: {\r\n\t\t\t\ten: \"Male\",\r\n\t\t\t\tit: \"Maschio\",\r\n\t\t\t\tes: \"Hombre\",\r\n\t\t\t\tfr: \"Homme\",\r\n\t\t\t},\r\n\t\t\tfemales: {\r\n\t\t\t\ten: \"Females\",\r\n\t\t\t\tit: \"Femmine\",\r\n\t\t\t\tes: \"Mujeres\",\r\n\t\t\t\tfr: \"Femmes\",\r\n\t\t\t},\r\n\t\t\tfemale: {\r\n\t\t\t\ten: \"Female\",\r\n\t\t\t\tit: \"Femmina\",\r\n\t\t\t\tes: \"Mujer\",\r\n\t\t\t\tfr: \"Femme\",\r\n\t\t\t},\r\n\t\t\t\"unspecified-small\": {\r\n\t\t\t\ten: \"NA\",\r\n\t\t\t\tit: \"ND\",\r\n\t\t\t\tes: \"NE\",\r\n\t\t\t\tfr: \"NA\",\r\n\t\t\t},\r\n\t\t\t\"male-small\": {\r\n\t\t\t\ten: \"M\",\r\n\t\t\t\tit: \"M\",\r\n\t\t\t\tes: \"H\",\r\n\t\t\t\tfr: \"M\",\r\n\t\t\t},\r\n\t\t\t\"female-small\": {\r\n\t\t\t\ten: \"F\",\r\n\t\t\t\tit: \"F\",\r\n\t\t\t\tes: \"M\",\r\n\t\t\t\tfr: \"F\",\r\n\t\t\t},\r\n\t\t\tnickname: {\r\n\t\t\t\ten: \"Nickname\",\r\n\t\t\t\tit: \"Nickname\",\r\n\t\t\t\tes: \"Apodo\",\r\n\t\t\t\tfr: \"Pseudo\",\r\n\t\t\t},\r\n\t\t\tcountry: {\r\n\t\t\t\ten: \"Country\",\r\n\t\t\t\tit: \"Paese\",\r\n\t\t\t\tes: \"País\",\r\n\t\t\t\tfr: \"Pays\",\r\n\t\t\t},\r\n\t\t\t\"country-required\": {\r\n\t\t\t\ten: \"Country *\",\r\n\t\t\t\tit: \"Paese *\",\r\n\t\t\t\tes: \"País *\",\r\n\t\t\t\tfr: \"Pays *\",\r\n\t\t\t},\r\n\t\t\t\"time-zone\": {\r\n\t\t\t\ten: \"Time Zone\",\r\n\t\t\t\tit: \"Time Zone\",\r\n\t\t\t\tes: \"Zona Horaria\",\r\n\t\t\t\tfr: \"Fuseau Horaire\",\r\n\t\t\t},\r\n\t\t\t\"time-zone-required\": {\r\n\t\t\t\ten: \"Time Zone *\",\r\n\t\t\t\tit: \"Time Zone *\",\r\n\t\t\t\tes: \"Zona Horaria *\",\r\n\t\t\t\tfr: \"Fuseau Horaire *\",\r\n\t\t\t},\r\n\t\t\t\"add-new\": {\r\n\t\t\t\ten: \"Add New\",\r\n\t\t\t\tit: \"Aggiungi Nuovo\",\r\n\t\t\t\tes: \"Añadir Nuevo\",\r\n\t\t\t\tfr: \"Ajouter nouveau\",\r\n\t\t\t},\r\n\t\t\tage: {\r\n\t\t\t\ten: \"Age\",\r\n\t\t\t\tit: \"Età\",\r\n\t\t\t\tes: \"Edad\",\r\n\t\t\t\tfr: \"Âge\",\r\n\t\t\t},\r\n\t\t\t\"physical-settings\": {\r\n\t\t\t\ten: \"Physical Settings\",\r\n\t\t\t\tit: \"Impostazioni Biometriche\",\r\n\t\t\t\tes: \"Configuración física\",\r\n\t\t\t\tfr: \"Paramètres physiques\",\r\n\t\t\t},\r\n\t\t\t\"weight-ms\": {\r\n\t\t\t\ten: \"Weight\",\r\n\t\t\t\tit: \"Peso\",\r\n\t\t\t\tes: \"Peso\",\r\n\t\t\t\tfr: \"Poids\",\r\n\t\t\t},\r\n\t\t\t\"Weight-ms\": {\r\n\t\t\t\ten: \"Weight\",\r\n\t\t\t\tit: \"Peso\",\r\n\t\t\t\tes: \"Peso\",\r\n\t\t\t\tfr: \"Poids\",\r\n\t\t\t},\r\n\t\t\theight: {\r\n\t\t\t\ten: \"Height\",\r\n\t\t\t\tit: \"Altezza\",\r\n\t\t\t\tes: \"Altura\",\r\n\t\t\t\tfr: \"Taille\",\r\n\t\t\t},\r\n\t\t\t\"height-required\": {\r\n\t\t\t\ten: \"Height *\",\r\n\t\t\t\tit: \"Altezza *\",\r\n\t\t\t\tes: \"Altura *\",\r\n\t\t\t\tfr: \"Taille *\",\r\n\t\t\t},\r\n\t\t\t\"hr-sensor\": {\r\n\t\t\t\ten: \"HR Sensor\",\r\n\t\t\t\tit: \"Sensore Cardio\",\r\n\t\t\t\tes: \"Sensor de FC\",\r\n\t\t\t\tfr: \"Capteur FC\",\r\n\t\t\t},\r\n\t\t\t\"hr-sensors\": {\r\n\t\t\t\ten: \"HR Sensors\",\r\n\t\t\t\tit: \"Sensori Cardio\",\r\n\t\t\t\tes: \"Sensores de FC\",\r\n\t\t\t\tfr: \"Capteurs FC\",\r\n\t\t\t},\r\n\t\t\t\"remove-sensor\": {\r\n\t\t\t\ten: \"Remove Sensor\",\r\n\t\t\t\tit: \"Rimuovi Sensore\",\r\n\t\t\t\tes: \"Eliminar el sensor\",\r\n\t\t\t\tfr: \"Supprimer le capteur\",\r\n\t\t\t},\r\n\t\t\t\"no-associated-sensors\": {\r\n\t\t\t\ten: \"No associated sensors\",\r\n\t\t\t\tit: \"Nessun sensore associato\",\r\n\t\t\t\tes: \"Sin sensores asociados\",\r\n\t\t\t\tfr: \"Aucun capteur associé\",\r\n\t\t\t},\r\n\t\t\tdefault: {\r\n\t\t\t\ten: \"Default\",\r\n\t\t\t\tit: \"Default\",\r\n\t\t\t\tes: \"Predeterminado\",\r\n\t\t\t\tfr: \"Défaut\",\r\n\t\t\t},\r\n\t\t\tcustom: {\r\n\t\t\t\ten: \"Custom\",\r\n\t\t\t\tit: \"Manuale\",\r\n\t\t\t\tes: \"Personalizado\",\r\n\t\t\t\tfr: \"Personnalisé\",\r\n\t\t\t},\r\n\t\t\tname: {\r\n\t\t\t\ten: \"Name\",\r\n\t\t\t\tit: \"Nome\",\r\n\t\t\t\tes: \"Nombre\",\r\n\t\t\t\tfr: \"Nom\",\r\n\t\t\t},\r\n\t\t\ttitle: {\r\n\t\t\t\ten: \"Title\",\r\n\t\t\t\tit: \"Titolo\",\r\n\t\t\t\tes: \"Título\",\r\n\t\t\t\tfr: \"Titre\",\r\n\t\t\t},\r\n\t\t\tsettings: {\r\n\t\t\t\ten: \"Settings\",\r\n\t\t\t\tit: \"Impostazioni\",\r\n\t\t\t\tes: \"Ajustes\",\r\n\t\t\t\tfr: \"Réglages\",\r\n\t\t\t},\r\n\t\t\tsetup: {\r\n\t\t\t\ten: \"Setup\",\r\n\t\t\t\tit: \"Setup\",\r\n\t\t\t\tes: \"Setup\",\r\n\t\t\t\tfr: \"Setup\",\r\n\t\t\t},\r\n\t\t\t\"general-settings\": {\r\n\t\t\t\ten: \"General Settings\",\r\n\t\t\t\tit: \"Impostazioni generali\",\r\n\t\t\t\tes: \"Ajustes generales\",\r\n\t\t\t\tfr: \"Paramètres généraux\",\r\n\t\t\t},\r\n\t\t\t\"user-info\": {\r\n\t\t\t\ten: \"Users Info\",\r\n\t\t\t\tit: \"Info Utenti\",\r\n\t\t\t\tes: \"Información de los usuarios\",\r\n\t\t\t\tfr: \"Informations sur les utilisateurs\",\r\n\t\t\t},\r\n\t\t\t\"zone-error-msg\": {\r\n\t\t\t\ten: \"Invalid data - the zone limit has to be less than the next and greater than previous zone limit\",\r\n\t\t\t\tit: \"Dati non validi - il valore della zona deve essere inferiore al successivo e superiore al precededente\",\r\n\t\t\t\tes: \"Datos inválidos - el límite de la zona debe ser menor que el siguiente y mayor que el límite de la zona anterior\",\r\n\t\t\t\tfr: \"Données non valides - la limite de zone doit être inférieure à la limite suivante, et supérieure à la limite de zone précédente\",\r\n\t\t\t},\r\n\t\t\t\"target-zone\": {\r\n\t\t\t\ten: \"Target Zone\",\r\n\t\t\t\tit: \"Target Zone\",\r\n\t\t\t\tes: \"Zona objetivo\",\r\n\t\t\t\tfr: \"Zone cible\",\r\n\t\t\t},\r\n\t\t\t\"log-out\": {\r\n\t\t\t\ten: \"Log Out\",\r\n\t\t\t\tit: \"Esci\",\r\n\t\t\t\tes: \"Cerrar sesión\",\r\n\t\t\t\tfr: \"Se déconnecter\",\r\n\t\t\t},\r\n\t\t\tprofile: {\r\n\t\t\t\ten: \"Profile\",\r\n\t\t\t\tit: \"Profilo\",\r\n\t\t\t\tes: \"Perfil\",\r\n\t\t\t\tfr: \"Profil\",\r\n\t\t\t},\r\n\t\t\tduration: {\r\n\t\t\t\ten: \"Duration\",\r\n\t\t\t\tit: \"Durata\",\r\n\t\t\t\tes: \"Duración\",\r\n\t\t\t\tfr: \"Durée\",\r\n\t\t\t},\r\n\t\t\tdays: {\r\n\t\t\t\ten: \"days\",\r\n\t\t\t\tit: \"giorni\",\r\n\t\t\t\tes: \"días\",\r\n\t\t\t\tfr: \"jours\",\r\n\t\t\t},\r\n\t\t\tday: {\r\n\t\t\t\ten: \"Day\",\r\n\t\t\t\tit: \"Giorno\",\r\n\t\t\t\tes: \"Día\",\r\n\t\t\t\tfr: \"Journée\",\r\n\t\t\t},\r\n\t\t\t\"no-training-to-display\": {\r\n\t\t\t\ten: \"No trainings to display\",\r\n\t\t\t\tit: \"Non ci sono training da mostrare\",\r\n\t\t\t\tes: \"No hay entrenamientos apropiados para mostrar\",\r\n\t\t\t\tfr: \"Aucun entraînement à afficher\",\r\n\t\t\t},\r\n\t\t\t\"duration-small\": {\r\n\t\t\t\ten: \"duration\",\r\n\t\t\t\tit: \"durata\",\r\n\t\t\t\tes: \"duración\",\r\n\t\t\t\tfr: \"durée\",\r\n\t\t\t},\r\n\t\t\t\"calories-small\": {\r\n\t\t\t\ten: \"calories\",\r\n\t\t\t\tit: \"calorie\",\r\n\t\t\t\tes: \"calorías\",\r\n\t\t\t\tfr: \"calories\",\r\n\t\t\t},\r\n\t\t\t\"distance-small\": {\r\n\t\t\t\ten: \"distance\",\r\n\t\t\t\tit: \"distanza\",\r\n\t\t\t\tes: \"distancia\",\r\n\t\t\t\tfr: \"distance\",\r\n\t\t\t},\r\n\t\t\t\"speed-small\": {\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\tmeters: {\r\n\t\t\t\ten: \"meters\",\r\n\t\t\t\tit: \"metri\",\r\n\t\t\t\tes: \"metros\",\r\n\t\t\t\tfr: \"mètres\",\r\n\t\t\t},\r\n\t\t\tminutes: {\r\n\t\t\t\ten: \"minutes\",\r\n\t\t\t\tit: \"minuti\",\r\n\t\t\t\tes: \"minutos\",\r\n\t\t\t\tfr: \"minutes\",\r\n\t\t\t},\r\n\t\t\tseconds: {\r\n\t\t\t\ten: \"seconds\",\r\n\t\t\t\tit: \"secondi\",\r\n\t\t\t\tes: \"secondes\",\r\n\t\t\t\tfr: \"minutes\",\r\n\t\t\t},\r\n\t\t\t\"are-you-sure\": {\r\n\t\t\t\ten: \"Are you sure?\",\r\n\t\t\t\tit: \"Sei sicuro?\",\r\n\t\t\t\tes: \"¿Está seguro?\",\r\n\t\t\t\tfr: \"Êtes vous sûr?\",\r\n\t\t\t},\r\n\t\t\t\"first-day\": {\r\n\t\t\t\ten: \"First Day of the Week\",\r\n\t\t\t\tit: \"Primo Giorno della Settimana\",\r\n\t\t\t\tes: \"Primer día de la semana\",\r\n\t\t\t\tfr: \"Premier jour de la semaine\",\r\n\t\t\t},\r\n\t\t\t\"date-format\": {\r\n\t\t\t\ten: \"Date Format\",\r\n\t\t\t\tit: \"Formato Data\",\r\n\t\t\t\tes: \"Formato de fecha\",\r\n\t\t\t\tfr: \"Format de date\",\r\n\t\t\t},\r\n\t\t\t\"time-format\": {\r\n\t\t\t\ten: \"Time Format\",\r\n\t\t\t\tit: \"Formato Ora\",\r\n\t\t\t\tes: \"Formato de hora\",\r\n\t\t\t\tfr: \"Format horaire\",\r\n\t\t\t},\r\n\t\t\tunits: {\r\n\t\t\t\ten: \"Units\",\r\n\t\t\t\tit: \"Unità di Misura\",\r\n\t\t\t\tes: \"Unidades\",\r\n\t\t\t\tfr: \"Unités\",\r\n\t\t\t},\r\n\t\t\t\"delete-all\": {\r\n\t\t\t\ten: \"Delete all\",\r\n\t\t\t\tit: \"Cancella tutto\",\r\n\t\t\t\tes: \"Borrar todo\",\r\n\t\t\t\tfr: \"Tout effacer\",\r\n\t\t\t},\r\n\t\t\t\"provide-valid-date\": {\r\n\t\t\t\ten: \"Please provide a valid date\",\r\n\t\t\t\tit: \"Per favore inserisci una data valida\",\r\n\t\t\t\tes: \"Por favor, escriba un tiempo válido\",\r\n\t\t\t\tfr: \"Veuillez saisir une date valide\",\r\n\t\t\t},\r\n\t\t\t\"provide-valid-time\": {\r\n\t\t\t\ten: \"Please provide a valid time\",\r\n\t\t\t\tit: \"Per favore inserisci un'ora valida\",\r\n\t\t\t\tes: \"Por favor, scriba una hora válida\",\r\n\t\t\t\tfr: \"Veuillez saisir une heure valide\",\r\n\t\t\t},\r\n\t\t\t\"provide-valid-email\": {\r\n\t\t\t\ten: \"Please provide a valid email address\",\r\n\t\t\t\tit: \"Per favore inserisci una email valida\",\r\n\t\t\t\tes: \"Por favor, introduzca una dirección de correo electrónico válida\",\r\n\t\t\t\tfr: \"Veuillez saisir une adresse e-mail valide.\",\r\n\t\t\t},\r\n\t\t\t\"yes-leave-club\": {\r\n\t\t\t\ten: \"Yes, leave the club!\",\r\n\t\t\t\tit: \"Si, lascia il Club!\",\r\n\t\t\t\tes: \"¡Sí, deje el club!\",\r\n\t\t\t\tfr: \"Oui, quitter le club!\",\r\n\t\t\t},\r\n\t\t\t\"uptivo-live\": {\r\n\t\t\t\ten: \"LIVE\",\r\n\t\t\t\tit: \"LIVE\",\r\n\t\t\t\tes: \"LIVE\",\r\n\t\t\t\tfr: \"LIVE\",\r\n\t\t\t},\r\n\t\t\t\"training-title\": {\r\n\t\t\t\ten: \"Title\",\r\n\t\t\t\tit: \"Titolo\",\r\n\t\t\t\tes: \"Título\",\r\n\t\t\t\tfr: \"Titre\",\r\n\t\t\t},\r\n\t\t\t\"training-description\": {\r\n\t\t\t\ten: \"Description\",\r\n\t\t\t\tit: \"Descrizione\",\r\n\t\t\t\tes: \"Descripción\",\r\n\t\t\t\tfr: \"Description\",\r\n\t\t\t},\r\n\t\t\t\"create-live-training\": {\r\n\t\t\t\ten: \"Create Live Training\",\r\n\t\t\t\tit: \"Crea Live Training\",\r\n\t\t\t\tes: \"Crear Live Training\",\r\n\t\t\t\tfr: \"Créer Live Training\",\r\n\t\t\t},\r\n\t\t\t\"live-training-start-confirm\": {\r\n\t\t\t\ten: \"Are you sure you want to start this live training?\",\r\n\t\t\t\tit: \"Sei sicuro di voler iniziare questo live training?\",\r\n\t\t\t\tes: \"¿Estás seguro de que quieres comenzar este entrenamiento en vivo?\",\r\n\t\t\t\tfr: \"Voulez-vous vraiment commencer cette entraînement en direct\",\r\n\t\t\t},\r\n\t\t\t\"live-training-stop-confirm\": {\r\n\t\t\t\ten: \"Are you sure you want to stop this live training?\",\r\n\t\t\t\tit: \"Sei sicuro di voler terminare questo live training?\",\r\n\t\t\t\tes: \"¿Estás seguro de que quieres detener este entrenamiento en vivo?\",\r\n\t\t\t\tfr: \"Voulez-vous vraiment commencer arrêtez entraînement en direct\",\r\n\t\t\t},\r\n\t\t\t\"delete-live-training-confirm\": {\r\n\t\t\t\ten: \"Are you sure you want to delete this live training?\",\r\n\t\t\t\tit: \"Sei sicuro di voler canellare questo live training?\",\r\n\t\t\t\tes: \"Estás seguro de que deseas eliminar esta capacitación en vivo?\",\r\n\t\t\t\tfr: \"Voulez-vous vraiment supprimer cette entraînement en direct?\",\r\n\t\t\t},\r\n\t\t\t\"athlete-successfully-remove\": {\r\n\t\t\t\ten: \"Athlete successfully removed\",\r\n\t\t\t\tit: \"Atleta rimosso con successo\",\r\n\t\t\t\tes: \"Atleta eliminado con éxito\",\r\n\t\t\t\tfr: \"Athlète retiré avec succès\",\r\n\t\t\t},\r\n\t\t\t\"successfully-create-live-training\": {\r\n\t\t\t\ten: \"Successfully create live training\",\r\n\t\t\t\tit: \"Live training creato con successo\",\r\n\t\t\t\tes: \"Crea exitosamente entrenamiento en vivo\",\r\n\t\t\t\tfr: \"Créer avec succès une entraînement en direct\",\r\n\t\t\t},\r\n\t\t\t\"successfully-edited-live-training\": {\r\n\t\t\t\ten: \"Successfully edited live training\",\r\n\t\t\t\tit: \"Live training modificato con successo\",\r\n\t\t\t\tes: \"Entrenamiento en vivo editado con éxito\",\r\n\t\t\t\tfr: \"Entraînement en direct modifiée avec succès\",\r\n\t\t\t},\r\n\t\t\t\"successfully-delete-live-training\": {\r\n\t\t\t\ten: \"Live training successfully deleted\",\r\n\t\t\t\tit: \"Live training cancellato con successo\",\r\n\t\t\t\tes: \"Entrenamiento en vivo eliminado con éxito\",\r\n\t\t\t\tfr: \"L' entraînement en direct a bien été supprimée\",\r\n\t\t\t},\r\n\t\t\t\"successfully-emptied-participant-list\": {\r\n\t\t\t\ten: \"Participant list emptied successfully\",\r\n\t\t\t\tit: \"Lista partecipanti svuotata con successo\",\r\n\t\t\t\tes: \"Lista de participantes vaciada con éxito\",\r\n\t\t\t\tfr: \"Liste des participants vidée avec succès\",\r\n\t\t\t},\r\n\t\t\t\"successfully-stop-live-training\": {\r\n\t\t\t\ten: \"Live training successfully stopped\",\r\n\t\t\t\tit: \"Live training interrotto con successo\",\r\n\t\t\t\tes: \"Entrenamiento en vivo se detuvo con éxito\",\r\n\t\t\t\tfr: \"L' entraînement en direct s'est arrêté avec succès\",\r\n\t\t\t},\r\n\t\t\t\"successfully-start-live-training\": {\r\n\t\t\t\ten: \"Live training successfully started\",\r\n\t\t\t\tit: \"Live training avviato con successo\",\r\n\t\t\t\tes: \"El entrenamiento en vivo comenzó con éxito\",\r\n\t\t\t\tfr: \"L' entraînement en direct a démarré avec succès\",\r\n\t\t\t},\r\n\t\t\t\"stop-successfully\": {\r\n\t\t\t\ten: \"Successfully stopped\",\r\n\t\t\t\tit: \"Interrotto con successo\",\r\n\t\t\t\tes: \"Se detuvo exitosamente\",\r\n\t\t\t\tfr: \"Arrêté avec succès\",\r\n\t\t\t},\r\n\t\t\t\"start-successfully\": {\r\n\t\t\t\ten: \"Successfully started\",\r\n\t\t\t\tit: \"Avviato con successo\",\r\n\t\t\t\tes: \"Comenzó con éxito\",\r\n\t\t\t\tfr: \"Démarré avec succès\",\r\n\t\t\t},\r\n\t\t\t\"start-error\": {\r\n\t\t\t\ten: \"Start error\",\r\n\t\t\t\tit: \"Errore di avvio\",\r\n\t\t\t\tes: \"Error de inicio\",\r\n\t\t\t\tfr: \"Erreur de démarrage\",\r\n\t\t\t},\r\n\t\t\t\"must-select-trainer\": {\r\n\t\t\t\ten: \"No trainer selected\",\r\n\t\t\t\tit: \"Nessun trainer selezionato\",\r\n\t\t\t\tes: \"Ningún entrenador seleccionado\",\r\n\t\t\t\tfr: \"Aucun formateur sélectionné\",\r\n\t\t\t},\r\n\t\t\t\"live-training-already-actived\": {\r\n\t\t\t\ten: \"It's already an active live training\",\r\n\t\t\t\tit: \"Risulta gia' un live training attivo\",\r\n\t\t\t\tes: \"Ya es un entrenamiento activo en vivo\",\r\n\t\t\t\tfr: \"C'est déjà un entraînement active en direct\",\r\n\t\t\t},\r\n\t\t\t\"live-training-already-actived-for-trainer\": {\r\n\t\t\t\ten: \"It's already an active training for this trainer\",\r\n\t\t\t\tit: \"Risulta gia' un training attivo per questo trainer\",\r\n\t\t\t\tes: \"Ya es un entrenamiento activo para este entrenador\",\r\n\t\t\t\tfr: \"C'est déjà un entraînement active pour ce formateur\",\r\n\t\t\t},\r\n\t\t\t\"add-athletes\": {\r\n\t\t\t\ten: \"Add Athletes\",\r\n\t\t\t\tit: \"Aggiungi Atleti\",\r\n\t\t\t\tes: \"Añadir atletas\",\r\n\t\t\t\tfr: \"Ajouter athlètes\",\r\n\t\t\t},\r\n\t\t\t\"resend-invitation\": {\r\n\t\t\t\ten: \"Resend Invitation\",\r\n\t\t\t\tit: \"Rimanda invito\",\r\n\t\t\t\tes: \"Reenviar invitacíon\",\r\n\t\t\t\tfr: \"Renvoyer l'invitation\",\r\n\t\t\t},\r\n\t\t\t\"resend-invitation-confirm\": {\r\n\t\t\t\ten: \"Are you sure you want to resend the invitation for the user \",\r\n\t\t\t\tit: \"Sei sicuro di voler rimandare l' invito per l utente \",\r\n\t\t\t\tes: \"¿Está seguro de que desea reenviar la invitación para el usuario?\",\r\n\t\t\t\tfr: \"Voulez-vous vraiment renvoyer l'invitation à l'utilisateur\",\r\n\t\t\t},\r\n\t\t\t\"start-live-training\": {\r\n\t\t\t\ten: \"Start Live Training\",\r\n\t\t\t\tit: \"Iniza Allenamento Live\",\r\n\t\t\t\tes: \"Comience El Entrenamiento\",\r\n\t\t\t\tfr: \"Commencez L' Entraînement\",\r\n\t\t\t},\r\n\t\t\tcolor: {\r\n\t\t\t\ten: \"Color\",\r\n\t\t\t\tit: \"Colore\",\r\n\t\t\t\tes: \"Color\",\r\n\t\t\t\tfr: \"Couleur\",\r\n\t\t\t},\r\n\t\t\t\"trainer-name\": {\r\n\t\t\t\ten: \"Trainer name\",\r\n\t\t\t\tit: \"Nome trainer\",\r\n\t\t\t\tes: \"Nombre del entrenador\",\r\n\t\t\t\tfr: \"Nom du formateur\",\r\n\t\t\t},\r\n\t\t\t\"select-trainer\": {\r\n\t\t\t\ten: \"Select Trainer\",\r\n\t\t\t\tit: \"Seleziona Trainer\",\r\n\t\t\t\tes: \"Seleccionar Entrenador\",\r\n\t\t\t\tfr: \"Sélectionnez Le Entraîneur\",\r\n\t\t\t},\r\n\t\t\t\"change-trainer\": {\r\n\t\t\t\ten: \"Change Trainer\",\r\n\t\t\t\tit: \"Cambia Trainer\",\r\n\t\t\t\tes: \"Cambiar entrenador\",\r\n\t\t\t\tfr: \"Changer de Entraîneur\",\r\n\t\t\t},\r\n\t\t\t\"select-staff\": {\r\n\t\t\t\ten: \"Select Staff\",\r\n\t\t\t\tit: \"Seleziona Staff\",\r\n\t\t\t\tes: \"Seleccionar Staff\",\r\n\t\t\t\tfr: \"Sélectionnez Staff\",\r\n\t\t\t},\r\n\t\t\t\"change-staff\": {\r\n\t\t\t\ten: \"Change Staff\",\r\n\t\t\t\tit: \"Cambia Staff\",\r\n\t\t\t\tes: \"Cambiar Staff\",\r\n\t\t\t\tfr: \"Changer Staff\",\r\n\t\t\t},\r\n\t\t\t\"remove-trainer\": {\r\n\t\t\t\ten: \"Remove\",\r\n\t\t\t\tit: \"Rimuovi\",\r\n\t\t\t\tes: \"Eliminar\",\r\n\t\t\t\tfr: \"Supprimer\",\r\n\t\t\t},\r\n\t\t\t\"participants-max\": {\r\n\t\t\t\ten: \"Participants/max\",\r\n\t\t\t\tit: \"Partecipanti/max\",\r\n\t\t\t\tes: \"Participantes/max\",\r\n\t\t\t\tfr: \"Participants/max\",\r\n\t\t\t},\r\n\t\t\t\"not-able-to-bring-back\": {\r\n\t\t\t\ten: \"You will not be able to recover this data!\",\r\n\t\t\t\tit: \"Non sarà possibile recuperare questi dati!\",\r\n\t\t\t\tes: \"¡No podrá recuperar este registro!\",\r\n\t\t\t\tfr: \"Vous ne pourrez pas récupérer ces données!\",\r\n\t\t\t},\r\n\t\t\tSingle: {\r\n\t\t\t\ten: \"Lesson\",\r\n\t\t\t\tit: \"Lezione\",\r\n\t\t\t\tes: \"Lesson\",\r\n\t\t\t\tfr: \"Lesson\",\r\n\t\t\t},\r\n\t\t\tCourse: {\r\n\t\t\t\ten: \"Course\",\r\n\t\t\t\tit: \"Corso\",\r\n\t\t\t\tes: \"Course\",\r\n\t\t\t\tfr: \"Évènements\",\r\n\t\t\t},\r\n\t\t\tparticipants: {\r\n\t\t\t\ten: \"Participants\",\r\n\t\t\t\tit: \"Partecipanti\",\r\n\t\t\t\tes: \"Participantes\",\r\n\t\t\t\tfr: \"Participants\",\r\n\t\t\t},\r\n\t\t\tonsite: {\r\n\t\t\t\ten: \"Onsite\",\r\n\t\t\t\tit: \"In Presenza\",\r\n\t\t\t\tes: \"En Sitio\",\r\n\t\t\t\tfr: \"Sur Site\",\r\n\t\t\t},\r\n\t\t\thome: {\r\n\t\t\t\ten: \"Online\",\r\n\t\t\t\tit: \"Online\",\r\n\t\t\t\tes: \"En Línea\",\r\n\t\t\t\tfr: \"En Ligne\",\r\n\t\t\t},\r\n\t\t\t\"onsite-participants\": {\r\n\t\t\t\ten: \"Onsite participants\",\r\n\t\t\t\tit: \"Partecipanti in presenza\",\r\n\t\t\t\tes: \"Participantes en el sitio\",\r\n\t\t\t\tfr: \"Participants sur site\",\r\n\t\t\t},\r\n\t\t\t\"home-participants\": {\r\n\t\t\t\ten: \"Online participants\",\r\n\t\t\t\tit: \"Partecipanti online\",\r\n\t\t\t\tes: \"Participantes en línea\",\r\n\t\t\t\tfr: \"Participants en Ligne\",\r\n\t\t\t},\r\n\t\t\t\"remove-class-participants\": {\r\n\t\t\t\ten: \"Do you want to remove all participants?\",\r\n\t\t\t\tit: \"Vuoi rimuovere tutti i partecipanti?\",\r\n\t\t\t\tes: \"¿Desea eliminar a todos los participantes?\",\r\n\t\t\t\tfr: \"Voulez-vous supprimer tous les participants?\",\r\n\t\t\t},\r\n\t\t\t\"remove-class-participants-insite\": {\r\n\t\t\t\ten: \"Do you want to remove all onsite participants?\",\r\n\t\t\t\tit: \"Vuoi rimuovere tutti i partecipanti in presenza?\",\r\n\t\t\t\tes: \"¿Desea eliminar a todos los participantes en el sitio?\",\r\n\t\t\t\tfr: \"Voulez-vous supprimer tous les participants sur site?\",\r\n\t\t\t},\r\n\t\t\t\"remove-class-participants-home\": {\r\n\t\t\t\ten: \"Do you want to remove all online participants?\",\r\n\t\t\t\tit: \"Vuoi rimuovere tutti i partecipanti online?\",\r\n\t\t\t\tes: \"¿Desea eliminar a todos los participantes en línea?\",\r\n\t\t\t\tfr: \"Voulez-vous supprimer tous les participants en ligne?\",\r\n\t\t\t},\r\n\t\t\tsearch: {\r\n\t\t\t\ten: \"Search\",\r\n\t\t\t\tit: \"Cerca\",\r\n\t\t\t\tes: \"Buscar\",\r\n\t\t\t\tfr: \"Recherche\",\r\n\t\t\t},\r\n\t\t\ttype: {\r\n\t\t\t\ten: \"Type\",\r\n\t\t\t\tit: \"Tipo\",\r\n\t\t\t\tes: \"Tipo\",\r\n\t\t\t\tfr: \"Type\",\r\n\t\t\t},\r\n\t\t\tplace: {\r\n\t\t\t\ten: \"Location\",\r\n\t\t\t\tit: \"Luogo\",\r\n\t\t\t\tes: \"Sitio\",\r\n\t\t\t\tfr: \"Lieu\",\r\n\t\t\t},\r\n\t\t\t\"clear-filters\": {\r\n\t\t\t\ten: \"Clear Filters\",\r\n\t\t\t\tit: \"Reset Filtri\",\r\n\t\t\t\tes: \"Borrar Filtros\",\r\n\t\t\t\tfr: \"Effacer Filtres\",\r\n\t\t\t},\r\n\t\t\tpublished: {\r\n\t\t\t\ten: \"Active\",\r\n\t\t\t\tit: \"Attivo\",\r\n\t\t\t\tes: \"Activo\",\r\n\t\t\t\tfr: \"Actif\",\r\n\t\t\t},\r\n\t\t\tunpublished: {\r\n\t\t\t\ten: \"Inactive\",\r\n\t\t\t\tit: \"Inattivo\",\r\n\t\t\t\tes: \"Inactivo\",\r\n\t\t\t\tfr: \"Inactif\",\r\n\t\t\t},\r\n\t\t\t\"proceed-anyway\": {\r\n\t\t\t\ten: \"Do you want to proceed anyway?\",\r\n\t\t\t\tit: \"Vuoi procedere comunque?\",\r\n\t\t\t\tes: \"¿Quieres continuar de todos modos?\",\r\n\t\t\t\tfr: \"Voulez-vous quand même continuer?\",\r\n\t\t\t},\r\n\t\t\tsingle: {\r\n\t\t\t\ten: \"Lesson\",\r\n\t\t\t\tit: \"Lezione\",\r\n\t\t\t\tes: \"Lección\",\r\n\t\t\t\tfr: \"Leçon\",\r\n\t\t\t},\r\n\t\t\tcourse: {\r\n\t\t\t\ten: \"Course\",\r\n\t\t\t\tit: \"Corso\",\r\n\t\t\t\tes: \"Curso\",\r\n\t\t\t\tfr: \"Évènements\",\r\n\t\t\t},\r\n\t\t\tgroup: {\r\n\t\t\t\ten: \"Group\",\r\n\t\t\t\tit: \"Gruppo\",\r\n\t\t\t\tes: \"Grupo\",\r\n\t\t\t\tfr: \"Groupe\",\r\n\t\t\t},\r\n\t\t\tGroup: {\r\n\t\t\t\ten: \"Lesson Group\",\r\n\t\t\t\tit: \"Gruppo Di Lezioni\",\r\n\t\t\t\tes: \"Grupo Lecciones\",\r\n\t\t\t\tfr: \"Groupe Training\",\r\n\t\t\t},\r\n\t\t\tcalendar: {\r\n\t\t\t\ten: \"Calendar\",\r\n\t\t\t\tit: \"Calendario\",\r\n\t\t\t\tes: \"Calendario\",\r\n\t\t\t\tfr: \"Calendrier\",\r\n\t\t\t},\r\n\t\t\tcalendars: {\r\n\t\t\t\ten: \"Calendars\",\r\n\t\t\t\tit: \"Calendari\",\r\n\t\t\t\tes: \"Calendarios\",\r\n\t\t\t\tfr: \"Calendriers\",\r\n\t\t\t},\r\n\t\t\tactivities: {\r\n\t\t\t\ten: \"Activities\",\r\n\t\t\t\tit: \"Attività\",\r\n\t\t\t\tes: \"Actividades\",\r\n\t\t\t\tfr: \"Activités\",\r\n\t\t\t},\r\n\t\t\t\"1_day\": {\r\n\t\t\t\ten: \"1 day\",\r\n\t\t\t\tit: \"1 giorno\",\r\n\t\t\t\tes: \"1 día\",\r\n\t\t\t\tfr: \"1 jour\",\r\n\t\t\t},\r\n\t\t\tx_days: {\r\n\t\t\t\ten: \"{0} days\",\r\n\t\t\t\tit: \"{0} giorni\",\r\n\t\t\t\tes: \"{0} días\",\r\n\t\t\t\tfr: \"{0} jours\",\r\n\t\t\t},\r\n\t\t\tevery_day: {\r\n\t\t\t\ten: \"Every day\",\r\n\t\t\t\tit: \"Ogni giorno\",\r\n\t\t\t\tes: \"Cada día\",\r\n\t\t\t\tfr: \"Tous les jours\",\r\n\t\t\t},\r\n\t\t\tevery_x_days: {\r\n\t\t\t\ten: \"Every {0} days\",\r\n\t\t\t\tit: \"Ogni {0} giorni\",\r\n\t\t\t\tes: \"Cada {0} días\",\r\n\t\t\t\tfr: \"Tous les {0} jours\",\r\n\t\t\t},\r\n\r\n\t\t\t\"1_month\": {\r\n\t\t\t\ten: \"1 month\",\r\n\t\t\t\tit: \"1 mese\",\r\n\t\t\t\tes: \"1 mes\",\r\n\t\t\t\tfr: \"1 mois\",\r\n\t\t\t},\r\n\t\t\tx_months: {\r\n\t\t\t\ten: \"{0} months\",\r\n\t\t\t\tit: \"{0} mesi\",\r\n\t\t\t\tes: \"{0} meses\",\r\n\t\t\t\tfr: \"{0} mois\",\r\n\t\t\t},\r\n\t\t\tevery_month: {\r\n\t\t\t\ten: \"Every month\",\r\n\t\t\t\tit: \"Ogni mese\",\r\n\t\t\t\tes: \"Cada mes\",\r\n\t\t\t\tfr: \"Chaque mois\",\r\n\t\t\t},\r\n\t\t\tevery_x_months: {\r\n\t\t\t\ten: \"Every {0} months\",\r\n\t\t\t\tit: \"Ogni {0} mesi\",\r\n\t\t\t\tes: \"Cada {0} meses\",\r\n\t\t\t\tfr: \"Tous les {0} mois\",\r\n\t\t\t},\r\n\r\n\t\t\t\"1_year\": {\r\n\t\t\t\ten: \"1 year\",\r\n\t\t\t\tit: \"1 anno\",\r\n\t\t\t\tes: \"1 año\",\r\n\t\t\t\tfr: \"1 ans\",\r\n\t\t\t},\r\n\t\t\tx_years: {\r\n\t\t\t\ten: \"{0} years\",\r\n\t\t\t\tit: \"{0} anni\",\r\n\t\t\t\tes: \"{0} años\",\r\n\t\t\t\tfr: \"{0} années\",\r\n\t\t\t},\r\n\t\t\tevery_year: {\r\n\t\t\t\ten: \"Every year\",\r\n\t\t\t\tit: \"Ogni anno\",\r\n\t\t\t\tes: \"Todos los años\",\r\n\t\t\t\tfr: \"Chaque année\",\r\n\t\t\t},\r\n\t\t\tevery_x_years: {\r\n\t\t\t\ten: \"Every {0} years\",\r\n\t\t\t\tit: \"Ogni {0} anni\",\r\n\t\t\t\tes: \"Cada {0} años\",\r\n\t\t\t\tfr: \"Tous les {0} ans\",\r\n\t\t\t},\r\n\r\n\t\t\tchange: {\r\n\t\t\t\ten: \"Change\",\r\n\t\t\t\tit: \"Cambia\",\r\n\t\t\t\tes: \"Cambiar\",\r\n\t\t\t\tfr: \"Modifier\",\r\n\t\t\t},\r\n\t\t\t\"added-date\": {\r\n\t\t\t\ten: \"Added Date\",\r\n\t\t\t\tit: \"Data Aggiunta\",\r\n\t\t\t\tes: \"Fecha Añadida\",\r\n\t\t\t\tfr: \"Date d'Ajout\",\r\n\t\t\t},\r\n\t\t\tdate: {\r\n\t\t\t\ten: \"Date\",\r\n\t\t\t\tit: \"Data\",\r\n\t\t\t\tes: \"Fecha\",\r\n\t\t\t\tfr: \"Date\",\r\n\t\t\t},\r\n\t\t\t\"start-date\": {\r\n\t\t\t\ten: \"Start Date\",\r\n\t\t\t\tit: \"Data Inizio\",\r\n\t\t\t\tes: \"Fecha Inicio\",\r\n\t\t\t\tfr: \"Date Début\",\r\n\t\t\t},\r\n\t\t\t\"end-date\": {\r\n\t\t\t\ten: \"End Date\",\r\n\t\t\t\tit: \"Data Fine\",\r\n\t\t\t\tes: \"Fecha final\",\r\n\t\t\t\tfr: \"Date Fin\",\r\n\t\t\t},\r\n\t\t\t\"cannot-delete-status-published\": {\r\n\t\t\t\ten: \"Could not delete because the status is 'Active'\",\r\n\t\t\t\tit: \"Impossibile cancellare perchè lo stato è 'Attivo'\",\r\n\t\t\t\tes: \"No se pudo eliminar porque el estado es 'Activo'\",\r\n\t\t\t\tfr: \"Impossible de supprimer car l'état est 'Actif'\",\r\n\t\t\t},\r\n\t\t\t\"my-activities\": {\r\n\t\t\t\ten: \"Upcoming Activities\",\r\n\t\t\t\tit: \"Prossime Attività\",\r\n\t\t\t\tes: \"Próximas Actividades\",\r\n\t\t\t\tfr: \"Activités À Venir\",\r\n\t\t\t},\r\n\t\t\t\"rename-file\": {\r\n\t\t\t\ten: \"Rename File\",\r\n\t\t\t\tit: \"Rinomina il file\",\r\n\t\t\t\tes: \"Renombrar archivo\",\r\n\t\t\t\tfr: \"Renommer le fichier\",\r\n\t\t\t},\r\n\t\t\t\"rename-folder\": {\r\n\t\t\t\ten: \"Rename Folder\",\r\n\t\t\t\tit: \"Rinomina La Cartella\",\r\n\t\t\t\tes: \"Renombrar Carpeta\",\r\n\t\t\t\tfr: \"Renommer Le Dossier\",\r\n\t\t\t},\r\n\t\t\t\"new-name\": {\r\n\t\t\t\ten: \"New name\",\r\n\t\t\t\tit: \"Nuovo nome\",\r\n\t\t\t\tes: \"Nuevo nombre\",\r\n\t\t\t\tfr: \"Nouveau nom\",\r\n\t\t\t},\r\n\t\t\ttrophies: {\r\n\t\t\t\ten: \"Trophies\",\r\n\t\t\t\tit: \"Trofei\",\r\n\t\t\t\tes: \"Trofeos\",\r\n\t\t\t\tfr: \"Trophées\",\r\n\t\t\t},\r\n\t\t\t\"club-trophies\": {\r\n\t\t\t\ten: \"Club Trophies\",\r\n\t\t\t\tit: \"Trofei Del Club\",\r\n\t\t\t\tes: \"Trofeos Del Club\",\r\n\t\t\t\tfr: \"Trophées de club\",\r\n\t\t\t},\r\n\t\t\tchallenges: {\r\n\t\t\t\ten: \"Challenges\",\r\n\t\t\t\tit: \"Sfide\",\r\n\t\t\t\tes: \"Desafíos\",\r\n\t\t\t\tfr: \"Défis\",\r\n\t\t\t},\r\n\t\t\tobjectives: {\r\n\t\t\t\ten: \"Objectives\",\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\tchallenge: {\r\n\t\t\t\ten: \"Challenge\",\r\n\t\t\t\tit: \"Sfida\",\r\n\t\t\t\tes: \"Desafío\",\r\n\t\t\t\tfr: \"Défi\",\r\n\t\t\t},\r\n\t\t\tdescription: {\r\n\t\t\t\ten: \"Description\",\r\n\t\t\t\tit: \"Descrizione\",\r\n\t\t\t\tes: \"Descripción\",\r\n\t\t\t\tfr: \"Description\",\r\n\t\t\t},\r\n\t\t\t\"short-description\": {\r\n\t\t\t\ten: \"Short Description\",\r\n\t\t\t\tit: \"Descrizione Breve\",\r\n\t\t\t\tes: \"Breve Descripción\",\r\n\t\t\t\tfr: \"Brève Description\",\r\n\t\t\t},\r\n\t\t\t\"create-challenge\": {\r\n\t\t\t\ten: \"Create Challenge\",\r\n\t\t\t\tit: \"Crea Sfida\",\r\n\t\t\t\tes: \"Crear Desafío\",\r\n\t\t\t\tfr: \"Créer Un Défi\",\r\n\t\t\t},\r\n\t\t\t\"challenge-contains-invalid-dates\": {\r\n\t\t\t\ten: \"Challenge contains invalid dates\",\r\n\t\t\t\tit: \"La Sfida contiene date non valide\",\r\n\t\t\t\tes: \"La Desafío contiene fechas inválidas\",\r\n\t\t\t\tfr: \"La Défi contient des dates non valides\",\r\n\t\t\t},\r\n\t\t\t\"challenge-start-date-after-end\": {\r\n\t\t\t\ten: \"Challenge end date is earlier than a start date\",\r\n\t\t\t\tit: \"La data di fine della sfida è anteriore alla data di inizio\",\r\n\t\t\t\tes: \"La fecha de finalización del desafío es anterior a la fecha de inicio\",\r\n\t\t\t\tfr: \"La date de fin du défi est antérieure à une date de début\",\r\n\t\t\t},\r\n\t\t\t\"challenge-end-date-must-be-after-start-date\": {\r\n\t\t\t\ten: \"The challenge end date must be after the start date\",\r\n\t\t\t\tit: \"La data di fine della sfida deve essere successiva alla data di inizio\",\r\n\t\t\t\tes: \"La fecha de finalización del desafío debe ser posterior a la fecha de inicio\",\r\n\t\t\t\tfr: \"La date de fin du défi doit être postérieure à la date de début\",\r\n\t\t\t},\r\n\t\t\t\"challenge-cannot-last-more-than-365-days\": {\r\n\t\t\t\t\"en\": \"The challenge cannot last more than 365 days\",\r\n\t\t\t\t\"it\": \"La sfida non può durare più di 365 giorni\",\r\n\t\t\t\t\"es\": \"El desafío no puede durar más de 365 días\",\r\n\t\t\t\t\"fr\": \"Le défi ne peut pas durer plus de 365 jours\"\r\n\t\t\t},\r\n\t\t\t\"challenge-exceeded-maximum-months\": {\r\n\t\t\t\ten: \"Challenge has exceeded the maximum number of months: \",\r\n\t\t\t\tit: \"La sfida ha superato il numero massimo di mesi: \",\r\n\t\t\t\tes: \"La Desafío ha excedido el número máximo de meses: \",\r\n\t\t\t\tfr: \"La Défi a dépassé le nombre maximum de mois: \",\r\n\t\t\t},\r\n\t\t\t\"challenge-succesfully-deleted\": {\r\n\t\t\t\ten: \"challenge succesfully deleted\",\r\n\t\t\t\tit: \"sfida eliminata con successo\",\r\n\t\t\t\tes: \"Desafío eliminado con éxito\",\r\n\t\t\t\tfr: \"Défi supprimé avec succès\",\r\n\t\t\t},\r\n\t\t\t\"challenge-start-date-must-be-in-future\": {\r\n\t\t\t\ten: \"The challenge start date must be in the future\",\r\n\t\t\t\tit: \"La data di inizio della sfida deve essere nel futuro\",\r\n\t\t\t\tes: \"La fecha de inicio del desafío debe ser futura\",\r\n\t\t\t\tfr: \"La date de début du défi doit être dans le futur\",\r\n\t\t\t},\r\n\t\t\t\"select-image\": {\r\n\t\t\t\ten: \"Select Image\",\r\n\t\t\t\tit: \"Seleziona Immagine\",\r\n\t\t\t\tes: \"Selecciona Imagen\",\r\n\t\t\t\tfr: \"Sélectionner Image\",\r\n\t\t\t},\r\n\t\t\t\"select-color\": {\r\n\t\t\t\ten: \"Select Color\",\r\n\t\t\t\tit: \"Seleziona Colore\",\r\n\t\t\t\tes: \"Seleccionar Color\",\r\n\t\t\t\tfr: \"Choisissez Couleur\",\r\n\t\t\t},\r\n\t\t\t\"club-challenges\": {\r\n\t\t\t\ten: \"Club Challenges\",\r\n\t\t\t\tit: \"Sfide Del Club\",\r\n\t\t\t\tes: \"Retos Del Club\",\r\n\t\t\t\tfr: \"Défis de club\",\r\n\t\t\t},\r\n\t\t\t\"uptivo-live-for-windows\": {\r\n\t\t\t\ten: \"Uptivo LIVE for Windows\",\r\n\t\t\t\tit: \"Uptivo LIVE per Windows\",\r\n\t\t\t\tes: \"Uptivo LIVE para Windows\",\r\n\t\t\t\tfr: \"Uptivo LIVE pour Windows\",\r\n\t\t\t},\r\n\t\t\t\"uptivo-live-link\": {\r\n\t\t\t\ten: \"https://uptivo.fit/support/download/\",\r\n\t\t\t\tit: \"https://uptivo.fit/it/support/download/\",\r\n\t\t\t\tes: \"https://uptivo.fit/support/download/\",\r\n\t\t\t\tfr: \"https://uptivo.fit/support/download/\",\r\n\t\t\t},\r\n\t\t\t\"link-copied\": {\r\n\t\t\t\ten: \"Link copied!\",\r\n\t\t\t\tit: \"Link copiato!\",\r\n\t\t\t\tes: \"Enlace copiado!\",\r\n\t\t\t\tfr: \"Lien copié!\",\r\n\t\t\t},\r\n\t\t\t\"click-to-copy-link\": {\r\n\t\t\t\ten: \"Click to copy link\",\r\n\t\t\t\tit: \"Clicca per copiare il link\",\r\n\t\t\t\tes: \"Haga clic para copiar el enlace\",\r\n\t\t\t\tfr: \"Cliquer pour copier le lien\",\r\n\t\t\t},\r\n\t\t\t\"total-duration\": {\r\n\t\t\t\ten: \"Total duration\",\r\n\t\t\t\tit: \"Durata totale\",\r\n\t\t\t\tes: \"Duración total\",\r\n\t\t\t\tfr: \"Durée totale\",\r\n\t\t\t},\r\n\t\t\t\"valid-zones-points\": {\r\n\t\t\t\ten: \"Valid zones Points\",\r\n\t\t\t\tit: \"Punti zone valide\",\r\n\t\t\t\tes: \"Puntos de zonas válidas\",\r\n\t\t\t\tfr: \"Points de zones valides\",\r\n\t\t\t},\r\n\t\t\t\"valid-zones-time\": {\r\n\t\t\t\ten: \"Time in valid zones\",\r\n\t\t\t\tit: \"Tempo in zone valide\",\r\n\t\t\t\tes: \"Hora en zonas válidas\",\r\n\t\t\t\tfr: \"Heure dans les zones valides\",\r\n\t\t\t},\r\n\t\t\t\"valid-zones-time-prc\": {\r\n\t\t\t\ten: \"% time in valid zones\",\r\n\t\t\t\tit: \"% tempo in zone valide\",\r\n\t\t\t\tes: \"% hora en zonas válidas\",\r\n\t\t\t\tfr: \"% heure dans les zones valides\",\r\n\t\t\t},\r\n\t\t\tto: {\r\n\t\t\t\ten: \"To\",\r\n\t\t\t\tit: \"A\",\r\n\t\t\t\tes: \"A\",\r\n\t\t\t\tfr: \"À\",\r\n\t\t\t},\r\n\t\t\t\"active-challenges\": {\r\n\t\t\t\ten: \"Active\",\r\n\t\t\t\tit: \"Attivo\",\r\n\t\t\t\tes: \"Activos\",\r\n\t\t\t\tfr: \"Actifs\",\r\n\t\t\t},\r\n\t\t\t\"history-challenges\": {\r\n\t\t\t\ten: \"History\",\r\n\t\t\t\tit: \"Storico\",\r\n\t\t\t\tes: \"Historia\",\r\n\t\t\t\tfr: \"L'histoire\",\r\n\t\t\t},\r\n\t\t\t\"credits-and-subscriptions\": {\r\n\t\t\t\ten: \"Credits And Subscriptions\",\r\n\t\t\t\tit: \"Crediti e Abbonamenti\",\r\n\t\t\t\tes: \"Créditos y Suscripciones\",\r\n\t\t\t\tfr: \"Crédits Et Abonnements\",\r\n\t\t\t},\r\n\t\t\tmanagement: {\r\n\t\t\t\ten: \"Management\",\r\n\t\t\t\tit: \"Gestione\",\r\n\t\t\t\tes: \"Gestión\",\r\n\t\t\t\tfr: \"Gestion\",\r\n\t\t\t},\r\n\t\t\tengagement: {\r\n\t\t\t\ten: \"Engagement\",\r\n\t\t\t\tit: \"Engagement\",\r\n\t\t\t\tes: \"Engagement\",\r\n\t\t\t\tfr: \"Engagement\",\r\n\t\t\t},\r\n\t\t\tpublish: {\r\n\t\t\t\ten: \"Activate\",\r\n\t\t\t\tit: \"Attiva\",\r\n\t\t\t\tes: \"Activar\",\r\n\t\t\t\tfr: \"Activer\",\r\n\t\t\t},\r\n\t\t\tunpublish: {\r\n\t\t\t\ten: \"Deactivate\",\r\n\t\t\t\tit: \"Disattiva\",\r\n\t\t\t\tes: \"Desactivar\",\r\n\t\t\t\tfr: \"Désactiver\",\r\n\t\t\t},\r\n\t\t\tcredits: {\r\n\t\t\t\ten: \"Credits\",\r\n\t\t\t\tit: \"Crediti\",\r\n\t\t\t\tes: \"Créditos\",\r\n\t\t\t\tfr: \"Crédits\",\r\n\t\t\t},\r\n\t\t\t\"insufficient-club-credits\": {\r\n\t\t\t\ten: \"Insufficient SMS club credits\",\r\n\t\t\t\tit: \"Crediti SMS del club insufficienti\",\r\n\t\t\t\tes: \"Créditos SMS del club insuficientes\",\r\n\t\t\t\tfr: \"Crédits SMS de club insuffisants\",\r\n\t\t\t},\r\n\t\t\t\"credits-required\": {\r\n\t\t\t\ten: \"Credits required\",\r\n\t\t\t\tit: \"Crediti richiesti\",\r\n\t\t\t\tes: \"Créditos requeridos\",\r\n\t\t\t\tfr: \"Crédits requis\",\r\n\t\t\t},\r\n\t\t\t\"training-type\": {\r\n\t\t\t\ten: \"Training type\",\r\n\t\t\t\tit: \"Tipo allenamento\",\r\n\t\t\t\tes: \"Tipo entrenamiento\",\r\n\t\t\t\tfr: \"Type entraînement\",\r\n\t\t\t},\r\n\t\t\t\"booking-mode\": {\r\n\t\t\t\ten: \"Booking Mode\",\r\n\t\t\t\tit: \"Modalità Prenotazione\",\r\n\t\t\t\tes: \"Modo De Reserva\",\r\n\t\t\t\tfr: \"Mode De Réservation\",\r\n\t\t\t},\r\n\t\t\thours: {\r\n\t\t\t\ten: \"Hours\",\r\n\t\t\t\tit: \"Ore\",\r\n\t\t\t\tes: \"Horas\",\r\n\t\t\t\tfr: \"Heures\",\r\n\t\t\t},\r\n\t\t\t\"visibility-days\": {\r\n\t\t\t\ten: \"Booking Interval\",\r\n\t\t\t\tit: \"Intervallo Prenotazione\",\r\n\t\t\t\tes: \"Intervalo Reserva\",\r\n\t\t\t\tfr: \"Intervalle Réservation\",\r\n\t\t\t},\r\n\t\t\t\"booking-before\": {\r\n\t\t\t\ten: \"Booking Before\",\r\n\t\t\t\tit: \"Prenota Entro\",\r\n\t\t\t\tes: \"Reserva Antes\",\r\n\t\t\t\tfr: \"Réservation Avant\",\r\n\t\t\t},\r\n\t\t\t\"cancel-before\": {\r\n\t\t\t\ten: \"Cancel Before\",\r\n\t\t\t\tit: \"Disdici Entro\",\r\n\t\t\t\tes: \"Cancela Antes\",\r\n\t\t\t\tfr: \"Annuler Avant\",\r\n\t\t\t},\r\n\t\t\tsubscription: {\r\n\t\t\t\ten: \"Subscription\",\r\n\t\t\t\tit: \"Abbonamento\",\r\n\t\t\t\tes: \"Suscripción\",\r\n\t\t\t\tfr: \"Abonnement\",\r\n\t\t\t},\r\n\t\t\t\"multiple-values\": {\r\n\t\t\t\ten: \"Multiple Values\",\r\n\t\t\t\tit: \"Valori Multipli\",\r\n\t\t\t\tes: \"Varios Valores\",\r\n\t\t\t\tfr: \"Valeurs multiples\",\r\n\t\t\t},\r\n\t\t\t\"with-participants\": {\r\n\t\t\t\ten: \"With Participants\",\r\n\t\t\t\tit: \"Con Partecipanti\",\r\n\t\t\t\tes: \"Sin Participantes\",\r\n\t\t\t\tfr: \"Avec Participants\",\r\n\t\t\t},\r\n\t\t\t\"without-participants\": {\r\n\t\t\t\ten: \"Without Participants\",\r\n\t\t\t\tit: \"Senza Partecipanti\",\r\n\t\t\t\tes: \"Con Participantes\",\r\n\t\t\t\tfr: \"Participants En File D'Attente\",\r\n\t\t\t},\r\n\t\t\t\"queued-participants\": {\r\n\t\t\t\ten: \"Queued Participants\",\r\n\t\t\t\tit: \"Partecipanti In Coda\",\r\n\t\t\t\tes: \"Participantes En Cola\",\r\n\t\t\t\tfr: \"Sans Participants\",\r\n\t\t\t},\r\n\t\t\t\"publish-failed\": {\r\n\t\t\t\ten: \"Activation/s failed\",\r\n\t\t\t\tit: \"Attivazione/i fallita/e\",\r\n\t\t\t\tes: \"Activaciones fallidas\",\r\n\t\t\t\tfr: \"Activations echouées\",\r\n\t\t\t},\r\n\t\t\t\"publish-successful\": {\r\n\t\t\t\ten: \"Activation/s successful\",\r\n\t\t\t\tit: \"Attivazione/i avvenuta/e con successo\",\r\n\t\t\t\tes: \"Activaciónes exitosa\",\r\n\t\t\t\tfr: \"Activation réussie\",\r\n\t\t\t},\r\n\t\t\t\"unpublish-failed\": {\r\n\t\t\t\ten: \"Deactivation/s failed\",\r\n\t\t\t\tit: \"Disattivazione/i fallita/e\",\r\n\t\t\t\tes: \"Desactivación fallida\",\r\n\t\t\t\tfr: \"La désactivation a échoué\",\r\n\t\t\t},\r\n\t\t\t\"unpublish-successful\": {\r\n\t\t\t\ten: \"Deactivation/s successful\",\r\n\t\t\t\tit: \"Disattivazione/i avvenuta/e con successo\",\r\n\t\t\t\tes: \"Desactivaciones Exitosas\",\r\n\t\t\t\tfr: \"Désactivations Réussies\",\r\n\t\t\t},\r\n\t\t\t\"classes-with-participants\": {\r\n\t\t\t\ten: \"Edit disable. You have selected classes with participants\",\r\n\t\t\t\tit: \"Modifica disabilita. Hai selezionato classi con partecipanti.\",\r\n\t\t\t\tes: \"Editar deshabilitar. Has seleccionado clases con participantes\",\r\n\t\t\t\tfr: \"Modifier désactiver. Vous avez sélectionné des èvènements avec des participants\",\r\n\t\t\t},\r\n\t\t\t\"classes-with-participants-edit\": {\r\n\t\t\t\ten: \"You have selected classes with participants\",\r\n\t\t\t\tit: \"Hai selezionato classi con partecipanti.\",\r\n\t\t\t\tes: \"Has seleccionado clases con participantes\",\r\n\t\t\t\tfr: \"Vous avez sélectionné des èvènements avec des participants\",\r\n\t\t\t},\r\n\t\t\t\"activity-type\": {\r\n\t\t\t\ten: \"Activity Type\",\r\n\t\t\t\tit: \"Tipo Attività\",\r\n\t\t\t\tes: \"Tipo De Actividad\",\r\n\t\t\t\tfr: \"Type D'Activité\",\r\n\t\t\t},\r\n\t\t\t\"activity-date\": {\r\n\t\t\t\ten: \"Activity Date\",\r\n\t\t\t\tit: \"Data Attività\",\r\n\t\t\t\tes: \"Fecha Actividad\",\r\n\t\t\t\tfr: \"Date D'Activité\",\r\n\t\t\t},\r\n\t\t\t\"onsite-online\": {\r\n\t\t\t\ten: \"Onsite/Online\",\r\n\t\t\t\tit: \"Onsite/Online\",\r\n\t\t\t\tes: \"Onsite/Online\",\r\n\t\t\t\tfr: \"Onsite/Online\",\r\n\t\t\t},\r\n\t\t\t\"day-of-week\": {\r\n\t\t\t\ten: \"Day\",\r\n\t\t\t\tit: \"Giorno\",\r\n\t\t\t\tes: \"Día\",\r\n\t\t\t\tfr: \"Jour\",\r\n\t\t\t},\r\n\t\t\tsunday: {\r\n\t\t\t\ten: \"Sunday\",\r\n\t\t\t\tit: \"Domenica\",\r\n\t\t\t\tes: \"Domingo\",\r\n\t\t\t\tfr: \"Dimanche\",\r\n\t\t\t},\r\n\t\t\tmonday: {\r\n\t\t\t\ten: \"Monday\",\r\n\t\t\t\tit: \"Lunedì\",\r\n\t\t\t\tes: \"Lunes\",\r\n\t\t\t\tfr: \"Lundi\",\r\n\t\t\t},\r\n\t\t\ttuesday: {\r\n\t\t\t\ten: \"Tuesday\",\r\n\t\t\t\tit: \"Martedì\",\r\n\t\t\t\tes: \"Martes\",\r\n\t\t\t\tfr: \"Mardi\",\r\n\t\t\t},\r\n\t\t\twednesday: {\r\n\t\t\t\ten: \"Wednesday\",\r\n\t\t\t\tit: \"Mercoledì\",\r\n\t\t\t\tes: \"Miércoles\",\r\n\t\t\t\tfr: \"Mercredi\",\r\n\t\t\t},\r\n\t\t\tthursday: {\r\n\t\t\t\ten: \"Thursday\",\r\n\t\t\t\tit: \"Giovedì\",\r\n\t\t\t\tes: \"Jueves\",\r\n\t\t\t\tfr: \"Jeudi\",\r\n\t\t\t},\r\n\t\t\tfriday: {\r\n\t\t\t\ten: \"Friday\",\r\n\t\t\t\tit: \"Venerdì\",\r\n\t\t\t\tes: \"Viernes\",\r\n\t\t\t\tfr: \"Vendredi\",\r\n\t\t\t},\r\n\t\t\tsaturday: {\r\n\t\t\t\ten: \"Saturday\",\r\n\t\t\t\tit: \"Sabato\",\r\n\t\t\t\tes: \"Sábado\",\r\n\t\t\t\tfr: \"Samedi\",\r\n\t\t\t},\r\n\t\t\t\"edit-all\": {\r\n\t\t\t\ten: \"Edit All\",\r\n\t\t\t\tit: \"Modifica Tutti\",\r\n\t\t\t\tes: \"Editar Todo\",\r\n\t\t\t\tfr: \"Tout Modifier\",\r\n\t\t\t},\r\n\t\t\t\"lock-all\": {\r\n\t\t\t\ten: \"Lock All\",\r\n\t\t\t\tit: \"Blocca Tutti\",\r\n\t\t\t\tes: \"Bloquear Todo\",\r\n\t\t\t\tfr: \"Vout Verrouiller\",\r\n\t\t\t},\r\n\t\t\tlessons: {\r\n\t\t\t\ten: \"Lessons\",\r\n\t\t\t\tit: \"Lezioni\",\r\n\t\t\t\tes: \"Lecciones\",\r\n\t\t\t\tfr: \"Training\",\r\n\t\t\t},\r\n\t\t\tlocation: {\r\n\t\t\t\ten: \"Location\",\r\n\t\t\t\tit: \"Luogo\",\r\n\t\t\t\tes: \"Sitio\",\r\n\t\t\t\tfr: \"Lieu\",\r\n\t\t\t},\r\n\t\t\t\"add-filters\": {\r\n\t\t\t\ten: \"Add Filters\",\r\n\t\t\t\tit: \"Aggiungi Filtri\",\r\n\t\t\t\tes: \"Agregar Filtros\",\r\n\t\t\t\tfr: \"Ajouter Filtres\",\r\n\t\t\t},\r\n\t\t\t\"reduce-filters\": {\r\n\t\t\t\ten: \"Reduce filters\",\r\n\t\t\t\tit: \"Riduci filtri\",\r\n\t\t\t\tes: \"Reducir filtros\",\r\n\t\t\t\tfr: \"Réduire Filtres\",\r\n\t\t\t},\r\n\t\t\t\"cannot-delete-class-with-participants\": {\r\n\t\t\t\ten: \"Cannot delete activity with participants\",\r\n\t\t\t\tit: \"Impossibile cancellare attività con partecipanti\",\r\n\t\t\t\tes: \"No se puede eliminar la actividad con los participantes\",\r\n\t\t\t\tfr: \"Réduire Filtres\",\r\n\t\t\t},\r\n\t\t\t\"class-is-notbookable-cannot-edit-participants\": {\r\n\t\t\t\ten: \"The activity is open and does not include a list of participants\",\r\n\t\t\t\tit: \"L'attività è aperta e non prevede una lista di partecipanti\",\r\n\t\t\t\tes: \"La actividad está abierta y no incluye lista de participantes\",\r\n\t\t\t\tfr: \"Impossible de supprimer l'activité avec les participants\",\r\n\t\t\t},\r\n\t\t\t\"activities-calendar\": {\r\n\t\t\t\ten: \"Club Calendar\",\r\n\t\t\t\tit: \"Calendario Club\",\r\n\t\t\t\tes: \"Calendario Club\",\r\n\t\t\t\tfr: \"Calendrier Club\",\r\n\t\t\t},\r\n\t\t\t\"pt-calendar\": {\r\n\t\t\t\ten: \"PT Calendar\",\r\n\t\t\t\tit: \"Calendario PT\",\r\n\t\t\t\tes: \"Calendario PT\",\r\n\t\t\t\tfr: \"Calendrier PT\",\r\n\t\t\t},\r\n\t\t\t\"services-calendar\": {\r\n\t\t\t\ten: \"Services Calendar\",\r\n\t\t\t\tit: \"Calendario Servizi\",\r\n\t\t\t\tes: \"Calendario Servicios\",\r\n\t\t\t\tfr: \"Calendrier Prestations\",\r\n\t\t\t},\r\n\t\t\tservices: {\r\n\t\t\t\ten: \"Services\",\r\n\t\t\t\tit: \"Servizi\",\r\n\t\t\t\tes: \"Servicios\",\r\n\t\t\t\tfr: \"Prestations\",\r\n\t\t\t},\r\n\t\t\t\"service-type\": {\r\n\t\t\t\ten: \"Service Type\",\r\n\t\t\t\tit: \"Tipo Di Servizio\",\r\n\t\t\t\tes: \"Tipo De Servicio\",\r\n\t\t\t\tfr: \"Type De Service\",\r\n\t\t\t},\r\n\t\t\tOsteopathyType: {\r\n\t\t\t\ten: \"Osteopathy\",\r\n\t\t\t\tit: \"Osteopatia\",\r\n\t\t\t\tes: \"Osteopatía\",\r\n\t\t\t\tfr: \"Ostéopathie\",\r\n\t\t\t},\r\n\t\t\tMassageTherapyType: {\r\n\t\t\t\ten: \"Massage Therapy\",\r\n\t\t\t\tit: \"Massofisioterapia\",\r\n\t\t\t\tes: \"Terapia De Masajes\",\r\n\t\t\t\tfr: \"Massage Thérapeutique\",\r\n\t\t\t},\r\n\t\t\tNutritionType: {\r\n\t\t\t\ten: \"Nutrition\",\r\n\t\t\t\tit: \"Nutrizione\",\r\n\t\t\t\tes: \"Nutrición\",\r\n\t\t\t\tfr: \"Nutrition\",\r\n\t\t\t},\r\n\t\t\tBioMeasurementsType: {\r\n\t\t\t\ten: \"Biometric Measurements\",\r\n\t\t\t\tit: \"Misurazioni Biometriche\",\r\n\t\t\t\tes: \"Medidas Biométricas\",\r\n\t\t\t\tfr: \"Mesures Biométriques\",\r\n\t\t\t},\r\n\t\t\tOrthopedicsType: {\r\n\t\t\t\ten: \"Orthopedics\",\r\n\t\t\t\tit: \"Ortopedia\",\r\n\t\t\t\tes: \"Ortopedía\",\r\n\t\t\t\tfr: \"Orthopédie\",\r\n\t\t\t},\r\n\t\t\tManicureType: {\r\n\t\t\t\ten: \"Manicure\",\r\n\t\t\t\tit: \"Manicure\",\r\n\t\t\t\tes: \"Manicura\",\r\n\t\t\t\tfr: \"Manucure\",\r\n\t\t\t},\r\n\t\t\tPedicureType: {\r\n\t\t\t\ten: \"Pedicure\",\r\n\t\t\t\tit: \"Pedicure\",\r\n\t\t\t\tes: \"Pedicure\",\r\n\t\t\t\tfr: \"Pédicure\",\r\n\t\t\t},\r\n\t\t\tHairRemovalType: {\r\n\t\t\t\ten: \"Hair Removal\",\r\n\t\t\t\tit: \"Epilazione\",\r\n\t\t\t\tes: \"Depilación\",\r\n\t\t\t\tfr: \"Épilation\",\r\n\t\t\t},\r\n\t\t\tBodyCareType: {\r\n\t\t\t\ten: \"Body Care\",\r\n\t\t\t\tit: \"Cura Del Corpo\",\r\n\t\t\t\tes: \"Cuidado Del Cuerpo\",\r\n\t\t\t\tfr: \"Soin Du Corps\",\r\n\t\t\t},\r\n\t\t\tFacialCleansingType: {\r\n\t\t\t\ten: \"Facial Cleansing\",\r\n\t\t\t\tit: \"Pulizia Viso\",\r\n\t\t\t\tes: \"Limpieza Facial\",\r\n\t\t\t\tfr: \"Nettoyage Du Visage\",\r\n\t\t\t},\r\n\t\t\tBodyMassagesType: {\r\n\t\t\t\ten: \"Body Massages\",\r\n\t\t\t\tit: \"Massaggi Corpo\",\r\n\t\t\t\tes: \"Masajes Corporales\",\r\n\t\t\t\tfr: \"Massages Du Corps\",\r\n\t\t\t},\r\n\t\t\tSolariumType: {\r\n\t\t\t\ten: \"Solarium\",\r\n\t\t\t\tit: \"Solarium\",\r\n\t\t\t\tes: \"Solárium\",\r\n\t\t\t\tfr: \"Solarium\",\r\n\t\t\t},\r\n\t\t\tAntiCelluliteTreatmentType: {\r\n\t\t\t\ten: \"Anti-cellulite Treatment\",\r\n\t\t\t\tit: \"Trattamento Anticellulite\",\r\n\t\t\t\tes: \"Tratamiento Anticelulítico\",\r\n\t\t\t\tfr: \"Traitement Anti-cellulite\",\r\n\t\t\t},\r\n\t\t\tCryotherapyType: {\r\n\t\t\t\ten: \"Cryotherapy\",\r\n\t\t\t\tit: \"Crioterapia\",\r\n\t\t\t\tes: \"Crioterapia\",\r\n\t\t\t\tfr: \"Cryothérapie\",\r\n\t\t\t},\r\n\t\t\tPosturalAssessmentType: {\r\n\t\t\t\ten: \"Postural Assessment\",\r\n\t\t\t\tit: \"Valutazione Posturale\",\r\n\t\t\t\tes: \"Evaluación Postural\",\r\n\t\t\t\tfr: \"Évaluation Posturale\",\r\n\t\t\t},\r\n\t\t\t\"free-access\": {\r\n\t\t\t\ten: \"Free Access\",\r\n\t\t\t\tit: \"Accesso Libero\",\r\n\t\t\t\tes: \"Acceso Libre\",\r\n\t\t\t\tfr: \"Accès Libre\",\r\n\t\t\t},\r\n\t\t\t\"click-on-the-locks-to-enable-the-change\": {\r\n\t\t\t\ten: \"Click on the locks to enable the change\",\r\n\t\t\t\tit: \"Clicca sui lucchetti per abilitare la modifica\",\r\n\t\t\t\tes: \"Haga clic en las cerraduras para habilitar el cambio\",\r\n\t\t\t\tfr: \"Cliquez sur les cadenas pour activer le changement\",\r\n\t\t\t},\r\n\t\t\tactivity: {\r\n\t\t\t\ten: \"Activity\",\r\n\t\t\t\tit: \"Attività\",\r\n\t\t\t\tes: \"Actividad\",\r\n\t\t\t\tfr: \"Activité\",\r\n\t\t\t},\r\n\t\t\t\"you-are-marking-the-athlete-as-present\": {\r\n\t\t\t\ten: \"You are marking the athlete as present.\",\r\n\t\t\t\tit: \"Stai marcando l'atleta come presente.\",\r\n\t\t\t\tes: \"Estás marcando al atleta como presente.\",\r\n\t\t\t\tfr: \"Vous marquez l'athlète comme présent.\",\r\n\t\t\t},\r\n\t\t\t\"you-are-marking-the-athlete-as-absent\": {\r\n\t\t\t\ten: \"You are marking the athlete as absent.\",\r\n\t\t\t\tit: \"Stai marcando l'atleta come assente.\",\r\n\t\t\t\tes: \"Estás marcando al atleta como ausente.\",\r\n\t\t\t\tfr: \"Vous marquez l'athlète comme absent.\",\r\n\t\t\t},\r\n\t\t\t\"assign-remove-tags\": {\r\n\t\t\t\ten: \"Add/Remove Groups\",\r\n\t\t\t\tit: \"Aggiungi/Rimuovi Gruppi\",\r\n\t\t\t\tes: \"Añadir/Quitar Grupos\",\r\n\t\t\t\tfr: \"Ajouter/Retirer Groupes\",\r\n\t\t\t},\r\n\t\t\t\"save-in-club-messages\": {\r\n\t\t\t\ten: \"Save in club messages\",\r\n\t\t\t\tit: \"Salva nei messaggi del club\",\r\n\t\t\t\tes: \"Guardar en mensajes del club\",\r\n\t\t\t\tfr: \"Enregistrer dans les messages du club\",\r\n\t\t\t},\r\n\t\t\t\"instant-message\": {\r\n\t\t\t\ten: \"Instant Message\",\r\n\t\t\t\tit: \"Messaggio Istantaneo\",\r\n\t\t\t\tes: \"Mensaje Instantáneo\",\r\n\t\t\t\tfr: \"Message Instantané\",\r\n\t\t\t},\r\n\t\t\t\"predefined-message\": {\r\n\t\t\t\ten: \"Predefined\",\r\n\t\t\t\tit: \"Predefinito\",\r\n\t\t\t\tes: \"Predefinido\",\r\n\t\t\t\tfr: \"Prédéfini\",\r\n\t\t\t},\r\n\t\t\t\"goal-challenge\": {\r\n\t\t\t\ten: \"Goal Challenge\",\r\n\t\t\t\tit: \"Obiettivi\",\r\n\t\t\t\tes: \"Agregar Objetivos\",\r\n\t\t\t\tfr: \"Ajouter Objectifs\",\r\n\t\t\t},\r\n\t\t\t\"zone-0-valid\": {\r\n\t\t\t\ten: \"Is Zone 0 Valid?\",\r\n\t\t\t\tit: \"La Zona 0 É Valida?\",\r\n\t\t\t\tes: \"¿Es Válida La Zona 0?\",\r\n\t\t\t\tfr: \"La Zone 0 Est-elle Valide?\",\r\n\t\t\t},\r\n\t\t\t\"zone-1-valid\": {\r\n\t\t\t\ten: \"Minimum Effort\",\r\n\t\t\t\tit: \"Intensità Moderata\",\r\n\t\t\t\tes: \"Esfuerzo Mìnimo\",\r\n\t\t\t\tfr: \"Effort Minimal\",\r\n\t\t\t},\r\n\t\t\t\"zone-2-valid\": {\r\n\t\t\t\ten: \"Weight Control\",\r\n\t\t\t\tit: \"Controllo Peso\",\r\n\t\t\t\tes: \"Control De Peso\",\r\n\t\t\t\tfr: \"Contrôle Du Poids\",\r\n\t\t\t},\r\n\t\t\t\"zone-3-valid\": {\r\n\t\t\t\ten: \"Aerobic\",\r\n\t\t\t\tit: \"Zona Aerobica\",\r\n\t\t\t\tes: \"Aeròbico\",\r\n\t\t\t\tfr: \"Aèrobie\",\r\n\t\t\t},\r\n\t\t\t\"zone-4-valid\": {\r\n\t\t\t\ten: \"Anaerobic\",\r\n\t\t\t\tit: \"Zona Anaerobica\",\r\n\t\t\t\tes: \"Anaeròbico\",\r\n\t\t\t\tfr: \"Anaèrobie\",\r\n\t\t\t},\r\n\t\t\t\"zone-5-valid\": {\r\n\t\t\t\ten: \"Maximum Effort\",\r\n\t\t\t\tit: \"Massima intensità\",\r\n\t\t\t\tes: \"Esfuerzo Màximo\",\r\n\t\t\t\tfr: \"Effort Maximal\",\r\n\t\t\t},\r\n\t\t\trepetition: {\r\n\t\t\t\ten: \"Repetition\",\r\n\t\t\t\tit: \"Ripetizione\",\r\n\t\t\t\tes: \"Repetición\",\r\n\t\t\t\tfr: \"Répétition\",\r\n\t\t\t},\r\n\t\t\t\"select-participants\": {\r\n\t\t\t\ten: \"Select Participants\",\r\n\t\t\t\tit: \"Seleziona Partecipanti\",\r\n\t\t\t\tes: \"Seleccionar Participantes\",\r\n\t\t\t\tfr: \"Sélectionnez Les Participants\",\r\n\t\t\t},\r\n\t\t\t\"challenge-assign-mode-open\": {\r\n\t\t\t\ten: \"Open\",\r\n\t\t\t\tit: \"Aperto\",\r\n\t\t\t\tes: \"Abierto\",\r\n\t\t\t\tfr: \"Ouvert\",\r\n\t\t\t},\r\n\t\t\t\"challenge-assign-mode-invite\": {\r\n\t\t\t\ten: \"Invite\",\r\n\t\t\t\tit: \"A Invito\",\r\n\t\t\t\tes: \"Invitación\",\r\n\t\t\t\tfr: \"Invitation\",\r\n\t\t\t},\r\n\t\t\tworkouts: {\r\n\t\t\t\ten: \"Workouts\",\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\tpersonal: {\r\n\t\t\t\ten: \"Personal\",\r\n\t\t\t\tit: \"Personale\",\r\n\t\t\t\tes: \"Personal\",\r\n\t\t\t\tfr: \"Personnel\",\r\n\t\t\t},\r\n\t\t\tclub: {\r\n\t\t\t\ten: \"Club\",\r\n\t\t\t\tit: \"Club\",\r\n\t\t\t\tes: \"Club\",\r\n\t\t\t\tfr: \"Club\",\r\n\t\t\t},\r\n\t\t\t\"challenge-based-on\": {\r\n\t\t\t\ten: \"Challenge Based On\",\r\n\t\t\t\tit: \"Sfida Basata Su\",\r\n\t\t\t\tes: \"Desafío Basado En\",\r\n\t\t\t\tfr: \"Défi Basé Sur\",\r\n\t\t\t},\r\n\t\t\t\"based-on\": {\r\n\t\t\t\ten: \"Based On\",\r\n\t\t\t\tit: \"Basata Su\",\r\n\t\t\t\tes: \"Basado En\",\r\n\t\t\t\tfr: \"Basé Sur\",\r\n\t\t\t},\r\n\t\t\t\"upps-zones\": {\r\n\t\t\t\ten: \"UPPs / Zones\",\r\n\t\t\t\tit: \"UPPs / Zone\",\r\n\t\t\t\tes: \"UPPs / Zonas\",\r\n\t\t\t\tfr: \"UPPs / Zones\",\r\n\t\t\t},\r\n\t\t\t\"min-target-zone-prc\": {\r\n\t\t\t\ten: \"% Minimal Target Zone\",\r\n\t\t\t\tit: \"% Minima Target Zone\",\r\n\t\t\t\tes: \"% Mínimo Target Zone\",\r\n\t\t\t\tfr: \"% Minimal Target Zone\",\r\n\t\t\t},\r\n\t\t\t\"rewards-structure\": {\r\n\t\t\t\ten: \"Rewards Structure\",\r\n\t\t\t\tit: \"Struttura Dei Premi\",\r\n\t\t\t\tes: \"Estructura De Recompensas\",\r\n\t\t\t\tfr: \"Structure Des Récompenses\",\r\n\t\t\t},\r\n\t\t\t\"only-upps-earned-in-the-following-zones\": {\r\n\t\t\t\ten: \"Only UPPs earned in the following zones:\",\r\n\t\t\t\tit: \"Solo UPP guadagnati nelle seguenti zone:\",\r\n\t\t\t\tes: \"Solo los UPP obtenidos en las siguientes zonas:\",\r\n\t\t\t\tfr: \"Seuls les UPP gagnés dans les zones suivantes:\",\r\n\t\t\t},\r\n\t\t\t\"delete-challenge\": {\r\n\t\t\t\ten: \"You are about to delete a challenge\",\r\n\t\t\t\tit: \"Stai per cancellare una sfida\",\r\n\t\t\t\tes: \"Estás a punto de cancelar un desafío\",\r\n\t\t\t\tfr: \"Vous êtes sur le point d'annuler un défi\",\r\n\t\t\t},\r\n\t\t\t\"invalid-rewards-structure\": {\r\n\t\t\t\ten: \"Invalid rewards structure\",\r\n\t\t\t\tit: \"Struttura dei premi non valida\",\r\n\t\t\t\tes: \"Estructura de recompensas no válida\",\r\n\t\t\t\tfr: \"Structure de récompenses invalide\",\r\n\t\t\t},\r\n\t\t\t\"must-be-greater-than-the-previous\": {\r\n\t\t\t\ten: \"Must be greater than the previous one\",\r\n\t\t\t\tit: \"Deve essere maggiore del precedente\",\r\n\t\t\t\tes: \"Debe ser mayor que el anterior\",\r\n\t\t\t\tfr: \"Il doit être supérieur au précédent\",\r\n\t\t\t},\r\n\t\t\t\"remove-all-athletes\": {\r\n\t\t\t\ten: \"Remove All Athletes\",\r\n\t\t\t\tit: \"Rimuovi Tutti Gli Atleti\",\r\n\t\t\t\tes: \"Eliminar Todos Los Atletas\",\r\n\t\t\t\tfr: \"Supprimer Tous Les Athlètes\",\r\n\t\t\t},\r\n\t\t\t\"remove-all-athletes-confirm\": {\r\n\t\t\t\ten: \"You are about to remove all athletes from the challenge.\",\r\n\t\t\t\tit: \"Stai per rimuovere tutti gli atleti dalla sfida.\",\r\n\t\t\t\tes: \"Está a punto de eliminar a todos los atletas del desafío.\",\r\n\t\t\t\tfr: \"Vous êtes sur le point de retirer tous les athlètes du défi.\",\r\n\t\t\t},\r\n\t\t\tfrom: {\r\n\t\t\t\ten: \"From:\",\r\n\t\t\t\tit: \"Da:\",\r\n\t\t\t\tes: \"Desde:\",\r\n\t\t\t\tfr: \"De:\",\r\n\t\t\t},\r\n\t\t\t\"before-the\": {\r\n\t\t\t\ten: \"Before\",\r\n\t\t\t\tit: \"Prima del\",\r\n\t\t\t\tes: \"Antes de\",\r\n\t\t\t\tfr: \"Avant de\",\r\n\t\t\t},\r\n\t\t\t\"from-the\": {\r\n\t\t\t\ten: \"From\",\r\n\t\t\t\tit: \"Dal\",\r\n\t\t\t\tes: \"Desde\",\r\n\t\t\t\tfr: \"De\",\r\n\t\t\t},\r\n\t\t\tto: {\r\n\t\t\t\ten: \"To:\",\r\n\t\t\t\tit: \"A:\",\r\n\t\t\t\tes: \"A:\",\r\n\t\t\t\tfr: \"À:\",\r\n\t\t\t},\r\n\t\t\t\"participating-athletes\": {\r\n\t\t\t\ten: \"Participating Athletes\",\r\n\t\t\t\tit: \"Atleti Partecipanti\",\r\n\t\t\t\tes: \"Atletas Participantes\",\r\n\t\t\t\tfr: \"Athlètes Participants\",\r\n\t\t\t},\r\n\t\t\t\"adding-participants-to-a-challenge-that-has-already-started\": {\r\n\t\t\t\ten: \"You are adding participants to a challenge that has already started. They will accumulate points from now on.\",\r\n\t\t\t\tit: \"Stai aggiungendo partecipanti a una sfida che è già iniziata. Accumuleranno punti solo da questo momento in poi.\",\r\n\t\t\t\tes: \"Está agregando participantes a un desafío que ya ha comenzado. Acumularán puntos a partir de ahora.\",\r\n\t\t\t\tfr: \"Vous ajoutez des participants à un défi qui a déjà commencé. Ils accumuleront désormais des points.\",\r\n\t\t\t},\r\n\t\t\t\"select-dates\": {\r\n\t\t\t\ten: \"Select Dates\",\r\n\t\t\t\tit: \"Seleziona Date\",\r\n\t\t\t\tes: \"Seleccionar Fechas\",\r\n\t\t\t\tfr: \"Sélectionnez Dates\",\r\n\t\t\t},\r\n\t\t\tmonthly: {\r\n\t\t\t\ten: \"Monthly\",\r\n\t\t\t\tit: \"Mensile\",\r\n\t\t\t\tes: \"Mensual\",\r\n\t\t\t\tfr: \"Mensuel\",\r\n\t\t\t},\r\n\t\t\t\"first-day-of-month\": {\r\n\t\t\t\ten: \"First day of month\",\r\n\t\t\t\tit: \"Primo giorno del mese\",\r\n\t\t\t\tes: \"Primer dia del mes\",\r\n\t\t\t\tfr: \"Premier jour du mois\",\r\n\t\t\t},\r\n\t\t\t\"last-day-of-month\": {\r\n\t\t\t\ten: \"Last day of month\",\r\n\t\t\t\tit: \"Ultimo giorno del mese\",\r\n\t\t\t\tes: \"Último día del mes\",\r\n\t\t\t\tfr: \"Dernier jour du mois\",\r\n\t\t\t},\r\n\t\t\t\"self-join-tag\": {\r\n\t\t\t\ten: \"SELF JOIN\",\r\n\t\t\t\tit: \"SELF JOIN\",\r\n\t\t\t\tes: \"SELF JOIN\",\r\n\t\t\t\tfr: \"SELF JOIN\",\r\n\t\t\t},\r\n\t\t\t\"guest-tag\": {\r\n\t\t\t\ten: \"GUEST\",\r\n\t\t\t\tit: \"GUEST\",\r\n\t\t\t\tes: \"GUEST\",\r\n\t\t\t\tfr: \"GUEST\",\r\n\t\t\t},\r\n\t\t\t\"please-enter-a-valid-time\": {\r\n\t\t\t\ten: \"Please enter a valid time\",\r\n\t\t\t\tit: \"Per favore inserisci un orario valido\",\r\n\t\t\t\tes: \"Ingrese una hora válida\",\r\n\t\t\t\tfr: \"Veuillez entrer une heure valide\",\r\n\t\t\t},\r\n\t\t\t\"never-ending\": {\r\n\t\t\t\ten: \"Never-Ending\",\r\n\t\t\t\tit: \"Infinito\",\r\n\t\t\t\tes: \"Sin fin\",\r\n\t\t\t\tfr: \"Sans fin\",\r\n\t\t\t},\r\n\t\t\t\"has-attended\": {\r\n\t\t\t\ten: \"Has Attended\",\r\n\t\t\t\tit: \"Ha Frequentato\",\r\n\t\t\t\tes: \"Ha Atendido\",\r\n\t\t\t\tfr: \"A Participé\",\r\n\t\t\t},\r\n\t\t\tabsent: {\r\n\t\t\t\ten: \"Absent\",\r\n\t\t\t\tit: \"Assente\",\r\n\t\t\t\tes: \"Ausente\",\r\n\t\t\t\tfr: \"Absent\",\r\n\t\t\t},\r\n\t\t\tpresent: {\r\n\t\t\t\ten: \"Present\",\r\n\t\t\t\tit: \"Presente\",\r\n\t\t\t\tes: \"presente\",\r\n\t\t\t\tfr: \"Présent\",\r\n\t\t\t},\r\n\t\t\tattendance: {\r\n\t\t\t\ten: \"Attendance\",\r\n\t\t\t\tit: \"Presenze\",\r\n\t\t\t\tes: \"Asistencia\",\r\n\t\t\t\tfr: \"Présence\",\r\n\t\t\t},\r\n\t\t\t\"edit-subscriptions\": {\r\n\t\t\t\ten: \"Edit Subscriptions\",\r\n\t\t\t\tit: \"Modifica Abbonamenti\",\r\n\t\t\t\tes: \"Editar Suscripciones\",\r\n\t\t\t\tfr: \"Modification Abonnements\",\r\n\t\t\t},\r\n\t\t\t\"select-subscriptions\": {\r\n\t\t\t\ten: \"Select Subscriptions\",\r\n\t\t\t\tit: \"Seleziona Abbonamenti\",\r\n\t\t\t\tes: \"Seleccione Suscripciones\",\r\n\t\t\t\tfr: \"Sélectionnez Abonnements\",\r\n\t\t\t},\r\n\t\t\t\"subscriptions-that-are-not-homogeneous-cannot-be-changed\": {\r\n\t\t\t\ten: \"Subscriptions that are not homogeneous cannot be changed.\",\r\n\t\t\t\tit: \"Gli abbonamenti non omogenei non possono essere modificati.\",\r\n\t\t\t\tes: \"Las suscripciones que no son homogéneas no se pueden modificar.\",\r\n\t\t\t\tfr: \"Les abonnements qui ne sont pas homogènes ne peuvent pas être modifiés.\",\r\n\t\t\t},\r\n\t\t\t\"subscriptions-update-successful\": {\r\n\t\t\t\ten: \"Subscriptions updated successfully\",\r\n\t\t\t\tit: \"Abbonamenti aggiornati con successo\",\r\n\t\t\t\tes: \"Suscripciones actualizadas con éxito\",\r\n\t\t\t\tfr: \"Abonnements mis à jour avec succès\",\r\n\t\t\t},\r\n\t\t\t\"start-time\": {\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\"duration-min\": {\r\n\t\t\t\ten: \"Duration (Min)\",\r\n\t\t\t\tit: \"Durata (Min)\",\r\n\t\t\t\tes: \"Duración (Min)\",\r\n\t\t\t\tfr: \"Durée (Min)\",\r\n\t\t\t},\r\n\t\t\t\"level\": {\r\n\t\t\t\ten: \"Level\",\r\n\t\t\t\tit: \"Livello\",\r\n\t\t\t\tes: \"Nivel\",\r\n\t\t\t\tfr: \"Niveau\",\r\n\t\t\t},\r\n\t\t\t\"defaults-level\": {\r\n\t\t\t\ten: \"Level\",\r\n\t\t\t\tit: \"Livello\",\r\n\t\t\t\tes: \"Nivel\",\r\n\t\t\t\tfr: \"Niveau\",\r\n\t\t\t},\r\n\t\t\ttickets: {\r\n\t\t\t\ten: \"Tickets\",\r\n\t\t\t\tit: \"Ingressi\",\r\n\t\t\t\tes: \"Entradas\",\r\n\t\t\t\tfr: \"Tickets\",\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\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\"invalid-phone-number\": {\r\n\t\t\t\ten: \"Invalid phone number\",\r\n\t\t\t\tit: \"Numero di telefono non valido\",\r\n\t\t\t\tes: \"Numero de telefono invalido\",\r\n\t\t\t\tfr: \"Numéro de téléphone invalide\",\r\n\t\t\t},\r\n\t\t\t\"invalid-country-code\": {\r\n\t\t\t\ten: \"Invalid country code\",\r\n\t\t\t\tit: \"Codice paese non valido\",\r\n\t\t\t\tes: \"Código de país no válido\",\r\n\t\t\t\tfr: \"Code pays invalide\",\r\n\t\t\t},\r\n\t\t\t\"too-short\": {\r\n\t\t\t\ten: \"Too short\",\r\n\t\t\t\tit: \"Troppo corto\",\r\n\t\t\t\tes: \"Demasiado corto\",\r\n\t\t\t\tfr: \"Trop court\",\r\n\t\t\t},\r\n\t\t\t\"too-long\": {\r\n\t\t\t\ten: \"Too long\",\r\n\t\t\t\tit: \"Troppo lungo\",\r\n\t\t\t\tes: \"Demasiado largo\",\r\n\t\t\t\tfr: \"Trop long\",\r\n\t\t\t},\r\n\t\t\tTimeRange: {\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\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\tYesterday: {\r\n\t\t\t\ten: \"Yesterday\",\r\n\t\t\t\tit: \"Ieri\",\r\n\t\t\t\tes: \"Ayer\",\r\n\t\t\t\tfr: \"Hier\",\r\n\t\t\t},\r\n\t\t\tTomorrow: {\r\n\t\t\t\ten: \"Tomorrow\",\r\n\t\t\t\tit: \"Domani\",\r\n\t\t\t\tes: \"Mañana\",\r\n\t\t\t\tfr: \"Demain\",\r\n\t\t\t},\r\n\t\t\tNear14Days: {\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\tLastNext7Days: {\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\tLastNext30Days: {\r\n\t\t\t\ten: \"+- 30 Days\",\r\n\t\t\t\tit: \"+- 30 Giorni\",\r\n\t\t\t\tes: \"+- 30 Días\",\r\n\t\t\t\tfr: \"+- 30 Jours\",\r\n\t\t\t},\r\n\t\t\tTodayAndTomorrow: {\r\n\t\t\t\ten: \"Today And Tomorrow\",\r\n\t\t\t\tit: \"Oggi E Domani\",\r\n\t\t\t\tes: \"Hoy Y Mañana\",\r\n\t\t\t\tfr: \"Aujourd'Hui Et Demain\",\r\n\t\t\t},\r\n\t\t\tSameDayLastWeek: {\r\n\t\t\t\ten: \"Same Day Last Week\",\r\n\t\t\t\tit: \"Stesso Giorno Ultima Settimana\",\r\n\t\t\t\tes: \"Mismo día la semana pasada\",\r\n\t\t\t\tfr: \"Même jour la semaine dernière\",\r\n\t\t\t},\r\n\t\t\tLast12Months: {\r\n\t\t\t\ten: \"Last 12 Months\",\r\n\t\t\t\tit: \"Ultimi 12 mesi\",\r\n\t\t\t\tes: \"Últimos 12 meses\",\r\n\t\t\t\tfr: \"Derniers 12 mois\",\r\n\t\t\t},\r\n\t\t\tLastMonth: {\r\n\t\t\t\ten: \"Last Month\",\r\n\t\t\t\tit: \"Mese scorso\",\r\n\t\t\t\tes: \"Mes pasado\",\r\n\t\t\t\tfr: \"Mois dernier\",\r\n\t\t\t},\r\n\t\t\tThisMonth: {\r\n\t\t\t\ten: \"This Month\",\r\n\t\t\t\tit: \"Questo Mese\",\r\n\t\t\t\tes: \"Este Mes\",\r\n\t\t\t\tfr: \"Ce Mois\",\r\n\t\t\t},\r\n\t\t\tThisWeek: {\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\tLastWeek: {\r\n\t\t\t\ten: \"Last Week\",\r\n\t\t\t\tit: \"Ultima Settimana\",\r\n\t\t\t\tes: \"Última Semana\",\r\n\t\t\t\tfr: \"Dernière Semaine\",\r\n\t\t\t},\r\n\t\t\tLast7Days: {\r\n\t\t\t\ten: \"Last 7 Days\",\r\n\t\t\t\tit: \"Ultimi 7 giorni\",\r\n\t\t\t\tes: \"Últimos 7 días\",\r\n\t\t\t\tfr: \"7 derniers jours\",\r\n\t\t\t},\r\n\t\t\tLast7DaysAndToday: {\r\n\t\t\t\ten: \"Last 7 Days\",\r\n\t\t\t\tit: \"Ultimi 7 giorni\",\r\n\t\t\t\tes: \"Últimos 7 días\",\r\n\t\t\t\tfr: \"7 derniers jours\",\r\n\t\t\t},\r\n\t\t\tLast30DaysAndToday: {\r\n\t\t\t\ten: \"Last 30 Days\",\r\n\t\t\t\tit: \"Ultimi 30 giorni\",\r\n\t\t\t\tes: \"Últimos 30 días\",\r\n\t\t\t\tfr: \"30 Derniers Jours\",\r\n\t\t\t},\r\n\t\t\tLast365Days: {\r\n\t\t\t\ten: \"Last 365 Days\",\r\n\t\t\t\tit: \"Ultimi 365 giorni\",\r\n\t\t\t\tes: \"Últimos 365 días\",\r\n\t\t\t\tfr: \"365 derniers jours\",\r\n\t\t\t},\r\n\t\t\tleads: {\r\n\t\t\t\ten: \"Leads\",\r\n\t\t\t\tit: \"Leads\",\r\n\t\t\t\tes: \"Leads\",\r\n\t\t\t\tfr: \"Leads\",\r\n\t\t\t},\r\n\t\t\t\"leads-qualified\": {\r\n\t\t\t\ten: \"Leads - Qualified\",\r\n\t\t\t\tit: \"Leads - Qualified\",\r\n\t\t\t\tes: \"Leads - Qualified\",\r\n\t\t\t\tfr: \"Leads - Qualified\",\r\n\t\t\t},\r\n\t\t\tprospects: {\r\n\t\t\t\ten: \"Prospects\",\r\n\t\t\t\tit: \"Prospects\",\r\n\t\t\t\tes: \"Prospects\",\r\n\t\t\t\tfr: \"Prospects\",\r\n\t\t\t},\r\n\t\t\tclients: {\r\n\t\t\t\ten: \"Clients\",\r\n\t\t\t\tit: \"Clienti\",\r\n\t\t\t\tes: \"Clients\",\r\n\t\t\t\tfr: \"Clients\",\r\n\t\t\t},\r\n\t\t\tlead: {\r\n\t\t\t\ten: \"Lead\",\r\n\t\t\t\tit: \"Lead\",\r\n\t\t\t\tes: \"Lead\",\r\n\t\t\t\tfr: \"Lead\",\r\n\t\t\t},\r\n\t\t\t\"lead-qualified\": {\r\n\t\t\t\ten: \"Lead - Qualified\",\r\n\t\t\t\tit: \"Lead - Qualified\",\r\n\t\t\t\tes: \"Lead - Qualified\",\r\n\t\t\t\tfr: \"Lead - Qualified\",\r\n\t\t\t},\r\n\t\t\tprospect: {\r\n\t\t\t\ten: \"Prospect\",\r\n\t\t\t\tit: \"Prospect\",\r\n\t\t\t\tes: \"Prospect\",\r\n\t\t\t\tfr: \"Prospect\",\r\n\t\t\t},\r\n\t\t\tclient: {\r\n\t\t\t\ten: \"Client\",\r\n\t\t\t\tit: \"Clienti\",\r\n\t\t\t\tes: \"Client\",\r\n\t\t\t\tfr: \"Client\",\r\n\t\t\t},\r\n\t\t\t\"client-from\": {\r\n\t\t\t\ten: \"Client From\",\r\n\t\t\t\tit: \"Client Da\",\r\n\t\t\t\tes: \"Client De\",\r\n\t\t\t\tfr: \"Client De\",\r\n\t\t\t},\r\n\t\t\tdashboard: {\r\n\t\t\t\ten: \"Dashboard\",\r\n\t\t\t\tit: \"Dashboard\",\r\n\t\t\t\tes: \"Dashboard\",\r\n\t\t\t\tfr: \"Dashboard\",\r\n\t\t\t},\r\n\t\t\t\"dashboard-settings\": {\r\n\t\t\t\ten: \"Dashboard Settings\",\r\n\t\t\t\tit: \"Impostazioni Dashboard\",\r\n\t\t\t\tes: \"Configuración Dashboard\",\r\n\t\t\t\tfr: \"Paramètres Dashboard\",\r\n\t\t\t},\r\n\t\t\ttrial: {\r\n\t\t\t\ten: \"Trial\",\r\n\t\t\t\tit: \"Prova\",\r\n\t\t\t\tes: \"Prueba\",\r\n\t\t\t\tfr: \"Essai\",\r\n\t\t\t},\r\n\t\t\t\"change-client-state\": {\r\n\t\t\t\ten: \"Change State\",\r\n\t\t\t\tit: \"Cambia Stato\",\r\n\t\t\t\tes: \"Cambiar Estado\",\r\n\t\t\t\tfr: \"Changer Etat\",\r\n\t\t\t},\r\n\t\t\t\"client-state\": {\r\n\t\t\t\ten: \"Client State\",\r\n\t\t\t\tit: \"Stato Cliente\",\r\n\t\t\t\tes: \"Estado Cliente\",\r\n\t\t\t\tfr: \"Etat Client\",\r\n\t\t\t},\r\n\t\t\t\"select-period\": {\r\n\t\t\t\ten: \"Select Period\",\r\n\t\t\t\tit: \"Seleziona Periodo\",\r\n\t\t\t\tes: \"Seleccionar Periodo\",\r\n\t\t\t\tfr: \"Sélectionnez Période\",\r\n\t\t\t},\r\n\t\t\tbirthdays: {\r\n\t\t\t\ten: \"Birthdays\",\r\n\t\t\t\tit: \"Compleanni\",\r\n\t\t\t\tes: \"Cumpleaños\",\r\n\t\t\t\tfr: \"Anniversaires\",\r\n\t\t\t},\r\n\t\t\t\"birth-date\": {\r\n\t\t\t\ten: \"Birth Date\",\r\n\t\t\t\tit: \"Data Compleanno\",\r\n\t\t\t\tes: \"Fecha De Nacimiento\",\r\n\t\t\t\tfr: \"Date De Naissance\",\r\n\t\t\t},\r\n\t\t\t\"award-date\": {\r\n\t\t\t\ten: \"Award Date\",\r\n\t\t\t\tit: \"Data Premiazione\",\r\n\t\t\t\tes: \"Fecha De Premiación\",\r\n\t\t\t\tfr: \"Date D'Attribution\",\r\n\t\t\t},\r\n\t\t\ttrophies: {\r\n\t\t\t\ten: \"Trophies\",\r\n\t\t\t\tit: \"Trofei\",\r\n\t\t\t\tes: \"Trofeos\",\r\n\t\t\t\tfr: \"Trophées\",\r\n\t\t\t},\r\n\t\t\t\"sms-sent-successfully\": {\r\n\t\t\t\ten: \"SMS sent successfully\",\r\n\t\t\t\tit: \"SMS inviato con successo\",\r\n\t\t\t\tes: \"SMS enviado satisfactoriamente\",\r\n\t\t\t\tfr: \"SMS envoyé avec succès\",\r\n\t\t\t},\r\n\t\t\t\"sms-sent-error\": {\r\n\t\t\t\ten: \"Error while sending SMS\",\r\n\t\t\t\tit: \"Errore durante l'invio SMS\",\r\n\t\t\t\tes: \"Error al enviar SMS\",\r\n\t\t\t\tfr: \"Erreur lors de l'envoi SMS\",\r\n\t\t\t},\r\n\t\t\tsms: {\r\n\t\t\t\ten: \"SMS\",\r\n\t\t\t\tit: \"SMS\",\r\n\t\t\t\tes: \"SMS\",\r\n\t\t\t\tfr: \"SMS\",\r\n\t\t\t},\r\n\t\t\t\"sms-credits\": {\r\n\t\t\t\ten: \"SMS Credits\",\r\n\t\t\t\tit: \"SMS Rimanenti\",\r\n\t\t\t\tes: \"SMS Restantes\",\r\n\t\t\t\tfr: \"SMS Restants\",\r\n\t\t\t},\r\n\t\t\t\"remaining-sms-credits\": {\r\n\t\t\t\ten: \"Remaining SMS Credits:\",\r\n\t\t\t\tit: \"Crediti SMS Rimanenti:\",\r\n\t\t\t\tes: \"Créditos SMS Restantes:\",\r\n\t\t\t\tfr: \"Crédits SMS Restants:\",\r\n\t\t\t},\r\n\t\t\t\"missing-number\": {\r\n\t\t\t\ten: \"Missing Phone\",\r\n\t\t\t\tit: \"Telefono Mancante\",\r\n\t\t\t\tes: \"Teléfono Faltante\",\r\n\t\t\t\tfr: \"Téléphone Manquant\",\r\n\t\t\t},\r\n\t\t\t\"send-sms\": {\r\n\t\t\t\ten: \"Send SMS\",\r\n\t\t\t\tit: \"Invia SMS\",\r\n\t\t\t\tes: \"Envoyer SMS\",\r\n\t\t\t\tfr: \"Enviar SMS\",\r\n\t\t\t},\r\n\t\t\t\"all-selected-users-are-without-phone\": {\r\n\t\t\t\ten: \"All selected users are without phone number\",\r\n\t\t\t\tit: \"Tutti gli utenti selezionati sono senza numero di telefono\",\r\n\t\t\t\tes: \"Todos los usuarios seleccionados no tienen teléfono\",\r\n\t\t\t\tfr: \"Tous les utilisateurs sélectionnés sont sans téléphone\",\r\n\t\t\t},\r\n\t\t\t\"expired-subscriptions-membership\": {\r\n\t\t\t\ten: \"Expired Subscriptions\",\r\n\t\t\t\tit: \"Abbonamenti Scaduti\",\r\n\t\t\t\tes: \"Subscripciones Expiradas\",\r\n\t\t\t\tfr: \"Abonnements Expirés\",\r\n\t\t\t},\r\n\t\t\t\"suspended-date\": {\r\n\t\t\t\ten: \"Suspended Date\",\r\n\t\t\t\tit: \"Data Sospensione\",\r\n\t\t\t\tes: \"Fecha Suspendida\",\r\n\t\t\t\tfr: \"Date Suspendue\",\r\n\t\t\t},\r\n\t\t\t\"last-activity\": {\r\n\t\t\t\ten: \"Last Activity\",\r\n\t\t\t\tit: \"Ultima Attività\",\r\n\t\t\t\tes: \"Última Actividad\",\r\n\t\t\t\tfr: \"Dernière Activité\",\r\n\t\t\t},\r\n\t\t\t\"training-date\": {\r\n\t\t\t\ten: \"Training Date\",\r\n\t\t\t\tit: \"Data Allenamento\",\r\n\t\t\t\tes: \"Fecha De Entrenamiento\",\r\n\t\t\t\tfr: \"Date D'Entraînement\",\r\n\t\t\t},\r\n\t\t\t\"send-sms\": {\r\n\t\t\t\ten: \"Send SMS\",\r\n\t\t\t\tit: \"Invia SMS\",\r\n\t\t\t\tes: \"Enviar SMS\",\r\n\t\t\t\tfr: \"Envoyer SMS\",\r\n\t\t\t},\r\n\t\t\t\"warning-user-do-not-have-phone\": {\r\n\t\t\t\ten: \"Warning: some of the selected users do not have a phone number.\",\r\n\t\t\t\tit: \"Attenzione: alcuni degli utenti selezionati non hanno un numero di telefono.\",\r\n\t\t\t\tes: \"Advertencia: algunos de los usuarios seleccionados no tienen un número de teléfono.\",\r\n\t\t\t\tfr: \"Avertissement: certains des utilisateurs sélectionnés n'ont pas de numéro de téléphone.\",\r\n\t\t\t},\r\n\t\t\t\"view-training\": {\r\n\t\t\t\ten: \"View Training\",\r\n\t\t\t\tit: \"Visualizza Allenamento\",\r\n\t\t\t\tes: \"Ver Entrenamiento\",\r\n\t\t\t\tfr: \"Voir Entraînement\",\r\n\t\t\t},\r\n\t\t\t\"view-class\": {\r\n\t\t\t\ten: \"View Activity\",\r\n\t\t\t\tit: \"Visualizza Attività\",\r\n\t\t\t\tes: \"Ver Actividad\",\r\n\t\t\t\tfr: \"Voir Activité\",\r\n\t\t\t},\r\n\t\t\t\"expired-subscriptions\": {\r\n\t\t\t\ten: \"Expired Subscriptions\",\r\n\t\t\t\tit: \"Abbonamenti Scaduti\",\r\n\t\t\t\tes: \"Subscripciones Expiradas\",\r\n\t\t\t\tfr: \"Abonnements Expirés\",\r\n\t\t\t},\r\n\t\t\t\"subscription-expiration\": {\r\n\t\t\t\ten: \"Subscription Expiration\",\r\n\t\t\t\tit: \"Scadenza Abbonamento\",\r\n\t\t\t\tes: \"Suscripción Caducidad\",\r\n\t\t\t\tfr: \"Expiration De L'Abonnement\",\r\n\t\t\t},\r\n\t\t\t\"no-activity\": {\r\n\t\t\t\ten: \"No Activity\",\r\n\t\t\t\tit: \"Nessuna Attività\",\r\n\t\t\t\tes: \"No Activity\",\r\n\t\t\t\tfr: \"Pas D'Activité\",\r\n\t\t\t},\r\n\t\t\t\"suspended-membership\": {\r\n\t\t\t\ten: \"Suspended Subscription\",\r\n\t\t\t\tit: \"Abbonamento Sospeso\",\r\n\t\t\t\tes: \"Suscripción Suspendida\",\r\n\t\t\t\tfr: \"Abonnement Suspendue\",\r\n\t\t\t},\r\n\t\t\t\"suspended-memberships\": {\r\n\t\t\t\ten: \"Suspended Subscriptions\",\r\n\t\t\t\tit: \"Abbonamenti Sospesi\",\r\n\t\t\t\tes: \"Suscripciones Suspendidas\",\r\n\t\t\t\tfr: \"Abonnements Suspendus\",\r\n\t\t\t},\r\n\t\t\t\"single-ticket\": {\r\n\t\t\t\ten: \"One Remaining Ticket\",\r\n\t\t\t\tit: \"Un Ticket Rimanente\",\r\n\t\t\t\tes: \"Un Ticket Restante\",\r\n\t\t\t\tfr: \"Un Ticket Restant\",\r\n\t\t\t},\r\n\t\t\t\"no-show\": {\r\n\t\t\t\ten: \"No Show\",\r\n\t\t\t\tit: \"Assenti\",\r\n\t\t\t\tes: \"Ausente\",\r\n\t\t\t\tfr: \"Absent\",\r\n\t\t\t},\r\n\t\t\t\"save-and-remove\": {\r\n\t\t\t\ten: \"Save And Remove\",\r\n\t\t\t\tit: \"Salva E Rimuovi\",\r\n\t\t\t\tes: \"Guardar Y Eliminar\",\r\n\t\t\t\tfr: \"Enregistrer Et Supprimer\",\r\n\t\t\t},\r\n\t\t\t\"comment-trainings\": {\r\n\t\t\t\ten: \"Comment Trainings\",\r\n\t\t\t\tit: \"Commenta Allenamenti\",\r\n\t\t\t\tes: \"Comentarios De Entrenamiento\",\r\n\t\t\t\tfr: \"Commentaires D'Entraînement\",\r\n\t\t\t},\r\n\t\t\t\"view-profile\": {\r\n\t\t\t\ten: \"View Profile\",\r\n\t\t\t\tit: \"Vedi Profilo\",\r\n\t\t\t\tes: \"Ver Perfil\",\r\n\t\t\t\tfr: \"Voir Le Profil\",\r\n\t\t\t},\r\n\t\t\t\"view-diary\": {\r\n\t\t\t\ten: \"View Diary\",\r\n\t\t\t\tit: \"Vedi Diario\",\r\n\t\t\t\tes: \"Ver Diario\",\r\n\t\t\t\tfr: \"Voir Le Journal\",\r\n\t\t\t},\r\n\t\t\t\"trainings-with-no-comments\": {\r\n\t\t\t\ten: \"Trainings Without Comments\",\r\n\t\t\t\tit: \"Allenamenti Senza Commenti\",\r\n\t\t\t\tes: \"Entrenamientos Sin Comentarios\",\r\n\t\t\t\tfr: \"Entraînements Sans Commentaires\",\r\n\t\t\t},\r\n\t\t\t\"no-show-date\": {\r\n\t\t\t\ten: \"No Show Date\",\r\n\t\t\t\tit: \"Data No Show\",\r\n\t\t\t\tes: \"Fecha No Show\",\r\n\t\t\t\tfr: \"Date No Show\",\r\n\t\t\t},\r\n\t\t\t\"clients-no-trainings\": {\r\n\t\t\t\ten: \"New Clients With No Training\",\r\n\t\t\t\tit: \"Nuovi Clienti Senza Allenamenti\",\r\n\t\t\t\tes: \"Nuevos Clientes Sin Entrenamiento\",\r\n\t\t\t\tfr: \"Nouveaux Clients Sans Entraînement\",\r\n\t\t\t},\r\n\t\t\t\"last-comment\": {\r\n\t\t\t\ten: \"Last Comment\",\r\n\t\t\t\tit: \"Ultimo Commento\",\r\n\t\t\t\tes: \"Último Comentario\",\r\n\t\t\t\tfr: \"Dernier Commentaire\",\r\n\t\t\t},\r\n\t\t\t\"athletes-with-no-comments\": {\r\n\t\t\t\ten: \"No Staff Comments\",\r\n\t\t\t\tit: \"Nessun Commento Dallo Staff\",\r\n\t\t\t\tes: \"Sin Comentarios Del Personal\",\r\n\t\t\t\tfr: \"Aucun Commentaire Du Personnel\",\r\n\t\t\t},\r\n\t\t\t\"join-date\": {\r\n\t\t\t\ten: \"Join Date\",\r\n\t\t\t\tit: \"Data Iscrizione\",\r\n\t\t\t\tes: \"Fecha Ingreso\",\r\n\t\t\t\tfr: \"Date Inscription\",\r\n\t\t\t},\r\n\t\t\t\"selected-interval-cannot-exceed-120-days\": {\r\n\t\t\t\ten: \"The selected interval cannot exceed 120 days\",\r\n\t\t\t\tit: \"L'intervallo selezionato non può superare i 120 giorni\",\r\n\t\t\t\tes: \"El intervalo seleccionado no puede exceder 120 días\",\r\n\t\t\t\tfr: \"L'intervalle sélectionné ne peut pas dépasser 120 jours\",\r\n\t\t\t},\r\n\t\t\t\"new-users\": {\r\n\t\t\t\ten: \"New Users\",\r\n\t\t\t\tit: \"Nuovi Utenti\",\r\n\t\t\t\tes: \"Nuevos Usuarios\",\r\n\t\t\t\tfr: \"Nouveaux Utilisateurs\",\r\n\t\t\t},\r\n\t\t\t\"new-users\": {\r\n\t\t\t\ten: \"New Users\",\r\n\t\t\t\tit: \"Nuovi Utenti\",\r\n\t\t\t\tes: \"Nuevos Usuarios\",\r\n\t\t\t\tfr: \"Nouveaux Utilisateurs\",\r\n\t\t\t},\r\n\t\t\t\"last-training\": {\r\n\t\t\t\ten: \"Last Training\",\r\n\t\t\t\tit: \"Ultimo Allenamento\",\r\n\t\t\t\tes: \"Último Entrenamiento\",\r\n\t\t\t\tfr: \"Dernier Entraînement\",\r\n\t\t\t},\r\n\t\t\t\"last-training-date\": {\r\n\t\t\t\ten: \"Last Training Data\",\r\n\t\t\t\tit: \"Data Ultimo Allenamento\",\r\n\t\t\t\tes: \"Últimos Datos De Entrenamiento\",\r\n\t\t\t\tfr: \"Dernières Données D'Entraînement\",\r\n\t\t\t},\r\n\t\t\t\"expired-date\": {\r\n\t\t\t\ten: \"Expired Date\",\r\n\t\t\t\tit: \"Scaduto Il\",\r\n\t\t\t\tes: \"Fecha De Vencimiento\",\r\n\t\t\t\tfr: \"Date d'Expiration\",\r\n\t\t\t},\r\n\t\t\t\"last-booking\": {\r\n\t\t\t\ten: \"Last Booking\",\r\n\t\t\t\tit: \"Ultima Prenotazione\",\r\n\t\t\t\tes: \"Última Reservación\",\r\n\t\t\t\tfr: \"Dernière Réservation\",\r\n\t\t\t},\r\n\t\t\t\"phone-number-copied\": {\r\n\t\t\t\ten: \"Phone number copied!\",\r\n\t\t\t\tit: \"Numero Di Telefono Copiato!\",\r\n\t\t\t\tes: \"¡Número de teléfono copiado!\",\r\n\t\t\t\tfr: \"Numéro De Téléphone Copié!\",\r\n\t\t\t},\r\n\t\t\t\"leads-tooltip\": {\r\n\t\t\t\ten: \"New club members with no interaction from staff in the selected time period\",\r\n\t\t\t\tit: \"Nuovi soci del club senza interazione da parte del personale nel periodo di tempo selezionato\",\r\n\t\t\t\tes: \"Nuevos socios del club sin interacción del personal en el período de tiempo seleccionado\",\r\n\t\t\t\tfr: \"Nouveaux membres du club sans interaction du personnel pendant la période sélectionnée\",\r\n\t\t\t},\r\n\t\t\t\"qualified-tooltip\": {\r\n\t\t\t\ten: \"Club members with interaction from staff in the selected time period\",\r\n\t\t\t\tit: \"Membri del club con interazione da parte del personale nel periodo di tempo selezionato\",\r\n\t\t\t\tes: \"Miembros del club con interacción del personal en el período de tiempo seleccionado\",\r\n\t\t\t\tfr: \"Membres du club avec interaction du personnel dans la période sélectionnée\",\r\n\t\t\t},\r\n\t\t\t\"prospect-tooltip\": {\r\n\t\t\t\ten: \"Club members who have done a trial workout in the selected time period\",\r\n\t\t\t\tit: \"Membri del club che hanno svolto un allenamento di prova nel periodo di tempo selezionato\",\r\n\t\t\t\tes: \"Miembros del club que han realizado un entrenamiento de prueba en el período de tiempo seleccionado\",\r\n\t\t\t\tfr: \"Les membres du club qui ont fait un entraînement d'essai dans la période sélectionnée\",\r\n\t\t\t},\r\n\t\t\t\"client-tooltip\": {\r\n\t\t\t\ten: \"Club members who purchased (or were assigned) a subscription in the selected time period\",\r\n\t\t\t\tit: \"Membri del club che hanno acquistato (o assegnato) un abbonamento nel periodo di tempo selezionato\",\r\n\t\t\t\tes: \"Miembros del club que compraron (o se les asignó) una suscripción en el período de tiempo seleccionado\",\r\n\t\t\t\tfr: \"Membres du club qui ont acheté (ou ont reçu) un abonnement au cours de la période sélectionnée\",\r\n\t\t\t},\r\n\t\t\t\"no-comments-tooltip\": {\r\n\t\t\t\ten: \"Members with no staff comments to trainings in the selected time period\",\r\n\t\t\t\tit: \"Membri senza commenti del personale agli allenamenti nel periodo di tempo selezionato\",\r\n\t\t\t\tes: \"Miembros sin comentarios del personal sobre las capacitaciones en el período de tiempo seleccionado\",\r\n\t\t\t\tfr: \"Membres sans commentaires du personnel sur les entraînements dans la période sélectionnée\",\r\n\t\t\t},\r\n\t\t\t\"no-trainings-tooltip\": {\r\n\t\t\t\ten: \"Members who became clients in the selected time period and that didn't do any trainings after becoming clients\",\r\n\t\t\t\tit: \"Membri che sono diventati clienti nel periodo di tempo selezionato e che non hanno fatto nessun allenamento dopo essere diventati clienti\",\r\n\t\t\t\tes: \"Miembros que se convirtieron en clientes en el período de tiempo seleccionado y que no realizaron ninguna capacitación después de convertirse en clientes\",\r\n\t\t\t\tfr: \"Membres qui sont devenus clients au cours de la période sélectionnée et qui n'ont fait aucun entraînement après être devenus clients\",\r\n\t\t\t},\r\n\t\t\t\"no-show-tooltip\": {\r\n\t\t\t\ten: \"Members who missed a training they were booked for in the selected time period\",\r\n\t\t\t\tit: \"Membri che hanno perso un allenamento per il quale erano stati prenotati nel periodo di tempo selezionato\",\r\n\t\t\t\tes: \"Miembros que se perdieron un entrenamiento para el que estaban reservados en el período de tiempo seleccionado\",\r\n\t\t\t\tfr: \"Membres qui ont manqué une séance d'entraînement pour laquelle ils avaient été réservés au cours de la période sélectionnée\",\r\n\t\t\t},\r\n\t\t\t\"single-ticket-tooltip\": {\r\n\t\t\t\ten: \"Members with a subscription with only one remaining ticket\",\r\n\t\t\t\tit: \"I membri con un abbonamento con un solo biglietto rimanente\",\r\n\t\t\t\tes: \"Miembros con una suscripción con solo un boleto restante\",\r\n\t\t\t\tfr: \"Membres ayant un abonnement avec un seul ticket restant\",\r\n\t\t\t},\r\n\t\t\t\"no-activity-tooltip\": {\r\n\t\t\t\ten: \"Members with no activity (trainings or bookings) in the selected time period who have performed activities (training or bookings) in the 30 days prior to the selected period\",\r\n\t\t\t\tit: \"Membri senza attività (allenamenti o prenotazioni) nel periodo di tempo selezionato che hanno svolto attività (allenamenti o prenotazioni) nei 30 giorni precedenti al periodo selezionato\",\r\n\t\t\t\tes: \"Miembros sin actividad (entrenamientos o reservas) en el período de tiempo seleccionado que han realizado actividades (entrenamientos o reservas) en los 30 días anteriores al período seleccionado\",\r\n\t\t\t\tfr: \"Membres sans activité (entrainement ou réservations) dans la période sélectionnée qui ont effectué des activités (entrainement ou réservations) dans les 30 jours précédant la période sélectionnée\",\r\n\t\t\t},\r\n\t\t\t\"suspended-membership-tooltip\": {\r\n\t\t\t\ten: \"Members with suspended subscriptions in the selected time period\",\r\n\t\t\t\tit: \"Membri con abbonamenti sospesi nel periodo di tempo selezionato\",\r\n\t\t\t\tes: \"Miembros con suscripciones suspendidas en el período de tiempo seleccionado\",\r\n\t\t\t\tfr: \"Membres avec des abonnements suspendus dans la période sélectionnée\",\r\n\t\t\t},\r\n\t\t\t\"expired-membership-tooltip\": {\r\n\t\t\t\ten: \"Members with expired subscriptions and no renewals in the selected time period\",\r\n\t\t\t\tit: \"Membri con abbonamenti scaduti e nessun rinnovo nel periodo di tempo selezionato\",\r\n\t\t\t\tes: \"Miembros con suscripciones vencidas y sin renovaciones en el período de tiempo seleccionado\",\r\n\t\t\t\tfr: \"Membres dont les abonnements ont expiré et aucun renouvellement dans la période sélectionnée\",\r\n\t\t\t},\r\n\t\t\t\"birthdays-tooltip\": {\r\n\t\t\t\ten: \"Members who have their birthday in the selected time period\",\r\n\t\t\t\tit: \"Membri che compiono gli anni nel periodo di tempo selezionato\",\r\n\t\t\t\tes: \"Membres dont l'anniversaire se situe dans la période sélectionnée\",\r\n\t\t\t\tfr: \"Membres dont l'anniversaire se situe dans la période sélectionnée\",\r\n\t\t\t},\r\n\t\t\t\"trophies-tooltip\": {\r\n\t\t\t\ten: \"Members who gained a trophy in the selected time period\",\r\n\t\t\t\tit: \"Membri che hanno ottenuto un trofeo nel periodo di tempo selezionato\",\r\n\t\t\t\tes: \"Miembros que ganaron un trofeo en el período de tiempo seleccionado\",\r\n\t\t\t\tfr: \"Membres dont l'anniversaire se situe dans la période sélectionnée\",\r\n\t\t\t},\r\n\t\t\t\"trial-tooltip\": {\r\n\t\t\t\ten: \"Members booked for a trial session in the selected time period\",\r\n\t\t\t\tit: \"I membri hanno prenotato una sessione di prova nel periodo di tempo selezionato\",\r\n\t\t\t\tes: \"Miembros reservados para una sesión de prueba en el período de tiempo seleccionado\",\r\n\t\t\t\tfr: \"Membres réservés pour une session d'essai dans la période sélectionnée\",\r\n\t\t\t},\r\n\t\t\t\"tasks-tooltip\": {\r\n\t\t\t\ten: \"Club tasks not completed\",\r\n\t\t\t\tit: \"Tasks del club non completati\",\r\n\t\t\t\tes: \"Tasks del club no completadas\",\r\n\t\t\t\tfr: \"Tasks du club non terminées\",\r\n\t\t\t},\r\n\t\t\t\"default-training-type\": {\r\n\t\t\t\ten: \"Club Default Workout\",\r\n\t\t\t\tit: \"Allenamento Predefinito Nel Club\",\r\n\t\t\t\tes: \"Entrenamiento Predeterminado En El Club\",\r\n\t\t\t\tfr: \"Entraînement Par Défaut Dans Le Club\",\r\n\t\t\t},\r\n\t\t\t\"user-has-no-data-to-view\": {\r\n\t\t\t\ten: \"User Has No Data To View\",\r\n\t\t\t\tit: \"L'Utente Non Ha Dati Da Visualizzare\",\r\n\t\t\t\tes: \"El Usuario No Tiene Datos Para Ver\",\r\n\t\t\t\tfr: \"L'Utilisateur N'A Pas De Données Pour Visualiser\",\r\n\t\t\t},\r\n\t\t\t\"ranking-challenge\": {\r\n\t\t\t\ten: \"Ranking Challenge\",\r\n\t\t\t\tit: \"Sfida A Classifica\",\r\n\t\t\t\tes: \"Desafío De Clasificación\",\r\n\t\t\t\tfr: \"Un Défi De Classement\",\r\n\t\t\t},\r\n\t\t\t\"scheduled-ranking-challenge\": {\r\n\t\t\t\ten: \"Scheduled Ranking Challenge\",\r\n\t\t\t\tit: \"Sfida A Classifica Programmata\",\r\n\t\t\t\tes: \"Desafío De Clasificación Programado\",\r\n\t\t\t\tfr: \"Défi De Classement Programmé\",\r\n\t\t\t},\r\n\t\t\t\"generic-task\": {\r\n\t\t\t\ten: \"Generic Task\",\r\n\t\t\t\tit: \"Task Generico\",\r\n\t\t\t\tes: \"Task Genérico\",\r\n\t\t\t\tfr: \"Task générique\",\r\n\t\t\t},\r\n\t\t\t\"call-task\": {\r\n\t\t\t\ten: \"Call\",\r\n\t\t\t\tit: \"Chiamata\",\r\n\t\t\t\tes: \"llamada\",\r\n\t\t\t\tfr: \"Appel\",\r\n\t\t\t},\r\n\t\t\t\"do-not-call-task\": {\r\n\t\t\t\ten: \"Don't Call\",\r\n\t\t\t\tit: \"Non Chiamare\",\r\n\t\t\t\tes: \"No Llames\",\r\n\t\t\t\tfr: \"Ne Pas Appeler\",\r\n\t\t\t},\r\n\t\t\tassignee: {\r\n\t\t\t\ten: \"Assignee\",\r\n\t\t\t\tit: \"Assegnatario\",\r\n\t\t\t\tes: \"Cesionario\",\r\n\t\t\t\tfr: \"Cessionnaire\",\r\n\t\t\t},\r\n\t\t\t\"task-is-mandatory-for-generic-task\": {\r\n\t\t\t\ten: \"The task field is mandatory for generic tasks\",\r\n\t\t\t\tit: \"Il campo task è obbligatorio per i tasks generi\",\r\n\t\t\t\tes: \"El campo task es obligatorio para las tasks genéricas\",\r\n\t\t\t\tfr: \"Le champ task est obligatoire pour les tasks génériques\",\r\n\t\t\t},\r\n\t\t\ttasks: {\r\n\t\t\t\ten: \"Tasks\",\r\n\t\t\t\tit: \"Tasks\",\r\n\t\t\t\tes: \"Tasks\",\r\n\t\t\t\tfr: \"Tasks\",\r\n\t\t\t},\r\n\t\t\ttask: {\r\n\t\t\t\ten: \"Task\",\r\n\t\t\t\tit: \"Task\",\r\n\t\t\t\tes: \"Task\",\r\n\t\t\t\tfr: \"Task\",\r\n\t\t\t},\r\n\t\t\t\"add-task\": {\r\n\t\t\t\ten: \"Add Task\",\r\n\t\t\t\tit: \"Aggiungi Task\",\r\n\t\t\t\tes: \"Agregar Task\",\r\n\t\t\t\tfr: \"Ajouter Task\",\r\n\t\t\t},\r\n\t\t\t\"edit-task\": {\r\n\t\t\t\ten: \"Edit Task\",\r\n\t\t\t\tit: \"Modifica Task\",\r\n\t\t\t\tes: \"Editar Task\",\r\n\t\t\t\tfr: \"Éditer Task\",\r\n\t\t\t},\r\n\t\t\t\"my-tasks\": {\r\n\t\t\t\ten: \"My Tasks\",\r\n\t\t\t\tit: \"I Miei Task\",\r\n\t\t\t\tes: \"Mi Task\",\r\n\t\t\t\tfr: \"Mes Task\",\r\n\t\t\t},\r\n\t\t\t\"show-completed-tasks\": {\r\n\t\t\t\ten: \"Show Completed Tasks\",\r\n\t\t\t\tit: \"Mostra Task Completati\",\r\n\t\t\t\tes: \"Mostrar Task Completadas\",\r\n\t\t\t\tfr: \"Afficher Task Terminées\",\r\n\t\t\t},\r\n\t\t\tstaff: {\r\n\t\t\t\ten: \"Staff\",\r\n\t\t\t\tit: \"Staff\",\r\n\t\t\t\tes: \"Staff\",\r\n\t\t\t\tfr: \"Staff\",\r\n\t\t\t},\r\n\t\t\t\"enable-leads-management\": {\r\n\t\t\t\ten: \"Enable Leads Management\",\r\n\t\t\t\tit: \"Abilita La Gestione Dei Leads\",\r\n\t\t\t\tes: \"Habilitar La Gestión De Leads\",\r\n\t\t\t\tfr: \"Activer la gestion des Leads\",\r\n\t\t\t},\r\n\t\t\tmembership: {\r\n\t\t\t\ten: \"Membership\",\r\n\t\t\t\tit: \"Iscrizione\",\r\n\t\t\t\tes: \"Matrícula\",\r\n\t\t\t\tfr: \"Inscription\",\r\n\t\t\t},\r\n\t\t\treceiver: {\r\n\t\t\t\ten: \"Receiver\",\r\n\t\t\t\tit: \"Ricevitore\",\r\n\t\t\t\tes: \"Receptor\",\r\n\t\t\t\tfr: \"Receveur\",\r\n\t\t\t},\r\n\t\t\t\"personal-app\": {\r\n\t\t\t\ten: \"Personal App\",\r\n\t\t\t\tit: \"App Personale\",\r\n\t\t\t\tes: \"Aplicación Personal\",\r\n\t\t\t\tfr: \"Application Personnelle\",\r\n\t\t\t},\r\n\t\t\tkos: {\r\n\t\t\t\ten: \"KOs\",\r\n\t\t\t\tit: \"KOs\",\r\n\t\t\t\tes: \"KOs\",\r\n\t\t\t\tfr: \"KOs\",\r\n\t\t\t},\r\n\t\t\t\"to-avoid\": {\r\n\t\t\t\ten: \"To Avoid\",\r\n\t\t\t\tit: \"Da Evitare\",\r\n\t\t\t\tes: \"Ser Evitado\",\r\n\t\t\t\tfr: \"Interdits\",\r\n\t\t\t},\r\n\t\t\t\"kos-min\": {\r\n\t\t\t\ten: \"KOs/min\",\r\n\t\t\t\tit: \"KOs/min\",\r\n\t\t\t\tes: \"KOs/min\",\r\n\t\t\t\tfr: \"KOs/min\",\r\n\t\t\t},\r\n\t\t\tLast50Trainings: {\r\n\t\t\t\ten: \"Last 50 Trainings\",\r\n\t\t\t\tit: \"Ultimi 50 Allenamenti\",\r\n\t\t\t\tes: \"Últimos 50 Entrenamientos\",\r\n\t\t\t\tfr: \"50 Dernières Formations\",\r\n\t\t\t},\r\n\t\t\tLast100Trainings: {\r\n\t\t\t\ten: \"Last 100 Trainings\",\r\n\t\t\t\tit: \"Ultimi 100 Allenamenti\",\r\n\t\t\t\tes: \"Últimos 100 Entrenamientos\",\r\n\t\t\t\tfr: \"100 Dernières Formations\",\r\n\t\t\t},\r\n\t\t\tLast250Trainings: {\r\n\t\t\t\ten: \"Last 250 Trainings\",\r\n\t\t\t\tit: \"Ultimi 250 Allenamenti\",\r\n\t\t\t\tes: \"Últimos 250 Entrenamientos\",\r\n\t\t\t\tfr: \"250 Dernières Formations\",\r\n\t\t\t},\r\n\t\t\tLast500Trainings: {\r\n\t\t\t\ten: \"Last 500 Trainings\",\r\n\t\t\t\tit: \"Ultimi 500 Allenamenti\",\r\n\t\t\t\tes: \"Últimos 500 Entrenamientos\",\r\n\t\t\t\tfr: \"500 Dernières Formations\",\r\n\t\t\t},\r\n\t\t\t\"group-training\": {\r\n\t\t\t\ten: \"Group Training\",\r\n\t\t\t\tit: \"Training di Gruppo\",\r\n\t\t\t\tes: \"Entrenamiento en grupo\",\r\n\t\t\t\tfr: \"Entraînement en groupe\",\r\n\t\t\t},\r\n\t\t\tSecond: {\r\n\t\t\t\ten: \"Seconds\",\r\n\t\t\t\tit: \"Secondi\",\r\n\t\t\t\tes: \"Segundos\",\r\n\t\t\t\tfr: \"Seconds\",\r\n\t\t\t},\r\n\t\t\t\"BenchPressMaxReps-ms\": {\r\n\t\t\t\ten: \"Bench Press (max reps)\",\r\n\t\t\t\tit: \"Bench Press (ripetizioni max)\",\r\n\t\t\t\tes: \"Press de banca (repeticiones máx)\",\r\n\t\t\t\tfr: \"Développé Couché (répétitions max)\",\r\n\t\t\t},\r\n\t\t\t\"BenchPressMaxWgt-ms\": {\r\n\t\t\t\ten: \"Bench Press (max weight)\",\r\n\t\t\t\tit: \"Bench Press (massimale)\",\r\n\t\t\t\tes: \"Press de banca (peso máximo)\",\r\n\t\t\t\tfr: \"Développé Couché (poids max)\",\r\n\t\t\t},\r\n\t\t\t\"HandGripTest-ms\": {\r\n\t\t\t\ten: \"Hand Grip Test\",\r\n\t\t\t\tit: \"Hand Grip Test\",\r\n\t\t\t\tes: \"Hand Grip Test\",\r\n\t\t\t\tfr: \"Force de la Poignée\",\r\n\t\t\t},\r\n\t\t\t\"LatPullDownMaxReps-ms\": {\r\n\t\t\t\ten: \"Lat Pull Down (max reps)\",\r\n\t\t\t\tit: \"Lat Pull Down (ripetizioni max)\",\r\n\t\t\t\tes: \"Jalón hacia abajo (repeticiones máx)\",\r\n\t\t\t\tfr: \"Tirage Poitrine (répétitions max)\",\r\n\t\t\t},\r\n\t\t\t\"LatPullDownMaxWgt-ms\": {\r\n\t\t\t\ten: \"Lat Pull Down (max weight)\",\r\n\t\t\t\tit: \"Lat Pull Down (massimale)\",\r\n\t\t\t\tes: \"Jalón hacia abajo (peso màximo)\",\r\n\t\t\t\tfr: \"Tirage Poitrine (poids max)\",\r\n\t\t\t},\r\n\t\t\t\"MaxAerobicSpeed-ms\": {\r\n\t\t\t\ten: \"MAS\",\r\n\t\t\t\tit: \"MVA\",\r\n\t\t\t\tes: \"VAM\",\r\n\t\t\t\tfr: \"VMA\",\r\n\t\t\t},\r\n\t\t\t\"MaxAerobicSpeed-desc\": {\r\n\t\t\t\ten: \"Maximum Aerobic Speed\",\r\n\t\t\t\tit: \"Massima Velocità Aerobica\",\r\n\t\t\t\tes: \"Velocidad Aeróbica Máxima\",\r\n\t\t\t\tfr: \"Volume Maximal Aérobie\",\r\n\t\t\t},\r\n\t\t\t\"Plank-ms\": {\r\n\t\t\t\ten: \"Max Plank\",\r\n\t\t\t\tit: \"Max Plank\",\r\n\t\t\t\tes: \"Plancha máx\",\r\n\t\t\t\tfr: \"Gainage Max\",\r\n\t\t\t},\r\n\t\t\t\"PushUpMaxReps1Minute-ms\": {\r\n\t\t\t\ten: \"Push-ups (max reps 1 min)\",\r\n\t\t\t\tit: \"Push-up (ripetizioni max 1 minuto)\",\r\n\t\t\t\tes: \"Flexiones (repeticiones máx 1 min)\",\r\n\t\t\t\tfr: \"Pompes (répétitions max 1 min)\",\r\n\t\t\t},\r\n\t\t\t\"SquatMaxReps1Minute-ms\": {\r\n\t\t\t\ten: \"Squat (max reps 1 min)\",\r\n\t\t\t\tit: \"Squat (ripetizioni max 1 min)\",\r\n\t\t\t\tes: \"Sentadilla (repeticiones máx 1 min)\",\r\n\t\t\t\tfr: \"Squat (répétitions max 1 min)\",\r\n\t\t\t},\r\n\t\t\t\"RowerMaxDist1Minute-ms\": {\r\n\t\t\t\ten: \"Rowing machine (max distance 1 min)\",\r\n\t\t\t\tit: \"Vogatore (distanza max 1 min)\",\r\n\t\t\t\tes: \"Máquina de remo (distancia máx 1 min)\",\r\n\t\t\t\tfr: \"Rameur (distance max 1 min)\",\r\n\t\t\t},\r\n\t\t\t\"x-days-left\": {\r\n\t\t\t\ten: \"{0} days left\",\r\n\t\t\t\tit: \"Rimangono {0} giorni\",\r\n\t\t\t\tes: \"Faltan {0} días\",\r\n\t\t\t\tfr: \"{0} jours restants\",\r\n\t\t\t},\r\n\t\t\t\"expired-x-days-ago\": {\r\n\t\t\t\ten: \"Expired {0} days ago\",\r\n\t\t\t\tit: \"Scaduto da {0} giorni\",\r\n\t\t\t\tes: \"Vencido por {0} dias\",\r\n\t\t\t\tfr: \"Expiré depuis {0} jours\",\r\n\t\t\t},\r\n\t\t\t\"PullUpMaxReps-ms\": {\r\n\t\t\t\ten: \"Pull Up\",\r\n\t\t\t\tit: \"Pull Up\",\r\n\t\t\t\tes: \"Dominadas\",\r\n\t\t\t\tfr: \"Tractions\",\r\n\t\t\t},\r\n\t\t\t\"SquatMaxReps-ms\": {\r\n\t\t\t\ten: \"Squat (max reps)\",\r\n\t\t\t\tit: \"Squat (ripetizioni max)\",\r\n\t\t\t\tes: \"Sentadillas (repeticiones máx)\",\r\n\t\t\t\tfr: \"Squat (répétitions max)\",\r\n\t\t\t},\r\n\t\t\t\"SquatMaxWgt-ms\": {\r\n\t\t\t\ten: \"Squat (max weight)\",\r\n\t\t\t\tit: \"Squat (massimale)\",\r\n\t\t\t\tes: \"Sentadillas (peso màximo)\",\r\n\t\t\t\tfr: \"Squat (poids max)\",\r\n\t\t\t},\r\n\t\t\tdocuments: {\r\n\t\t\t\ten: \"Documents\",\r\n\t\t\t\tit: \"Documenti\",\r\n\t\t\t\tes: \"Documentos\",\r\n\t\t\t\tfr: \"Documents\",\r\n\t\t\t},\r\n\t\t\tactive: {\r\n\t\t\t\ten: \"Active\",\r\n\t\t\t\tit: \"Attivo\",\r\n\t\t\t\tes: \"Activo\",\r\n\t\t\t\tfr: \"Actif\",\r\n\t\t\t},\r\n\t\t\texpiring: {\r\n\t\t\t\ten: \"Expiring\",\r\n\t\t\t\tit: \"In Scadenza\",\r\n\t\t\t\tes: \"Expirando\",\r\n\t\t\t\tfr: \"Expirant\",\r\n\t\t\t},\r\n\t\t\t\"medical-certificate\": {\r\n\t\t\t\ten: \"Medical Certificate\",\r\n\t\t\t\tit: \"Certificato Medico\",\r\n\t\t\t\tes: \"Certificado Medico\",\r\n\t\t\t\tfr: \"Certificat Médical\",\r\n\t\t\t},\r\n\t\t\tMedicalCertificate: {\r\n\t\t\t\ten: \"Medical Certificate\",\r\n\t\t\t\tit: \"Certificato Medico\",\r\n\t\t\t\tes: \"Certificado Medico\",\r\n\t\t\t\tfr: \"Certificat Médical\",\r\n\t\t\t},\r\n\t\t\t\"add-document\": {\r\n\t\t\t\ten: \"Add Document\",\r\n\t\t\t\tit: \"Aggiungi Documento\",\r\n\t\t\t\tes: \"Agregar Documento\",\r\n\t\t\t\tfr: \"Ajouter Document\",\r\n\t\t\t},\r\n\t\t\t\"edit-document\": {\r\n\t\t\t\ten: \"Edit Document\",\r\n\t\t\t\tit: \"Modifica Documento\",\r\n\t\t\t\tes: \"Editar Documento\",\r\n\t\t\t\tfr: \"Modifier Document\",\r\n\t\t\t},\r\n\t\t\tmissing: {\r\n\t\t\t\ten: \"Missing\",\r\n\t\t\t\tit: \"Mancante\",\r\n\t\t\t\tes: \"Ausente\",\r\n\t\t\t\tfr: \"Manquant\",\r\n\t\t\t},\r\n\t\t\t\"machine-level\": {\r\n\t\t\t\ten: \"Gear Level\",\r\n\t\t\t\tit: \"Livello Attrezzo\",\r\n\t\t\t\tes: \"Nivel de dificultad\",\r\n\t\t\t\tfr: \"Niveau d'Outil\",\r\n\t\t\t},\r\n\t\t\t\"workout-reps\": {\r\n\t\t\t\ten: \"Reps\",\r\n\t\t\t\tit: \"Ripetizioni\",\r\n\t\t\t\tes: \"Repeticiones\",\r\n\t\t\t\tfr: \"Répétitions\",\r\n\t\t\t},\r\n\t\t\tna: {\r\n\t\t\t\ten: \"N/A\",\r\n\t\t\t\tit: \"N/A\",\r\n\t\t\t\tes: \"N/A\",\r\n\t\t\t\tfr: \"N/A\",\r\n\t\t\t},\r\n\t\t\t\"cardio-zone\": {\r\n\t\t\t\ten: \"HR Target\",\r\n\t\t\t\tit: \"HR Target\",\r\n\t\t\t\tes: \"HR Target\",\r\n\t\t\t\tfr: \"HR Target\",\r\n\t\t\t},\r\n\t\t\t\"choose-cardio-zone\": {\r\n\t\t\t\ten: \"Choose zone\",\r\n\t\t\t\tit: \"Scegli zona\",\r\n\t\t\t\tes: \"Elegir zona\",\r\n\t\t\t\tfr: \"Choisir zone\",\r\n\t\t\t},\r\n\t\t\t\"also-shows-clubs-where-is-not-currently-an-athlete\": {\r\n\t\t\t\ten: \"Also shows clubs where is not currently an athlete.\",\r\n\t\t\t\tit: \"Mostra anche i club in cui non è attualmente un atleta.\",\r\n\t\t\t\tes: \"También muestra clubes en los que actualmente no es deportista.\",\r\n\t\t\t\tfr: \"Montre également les clubs où il n'est pas actuellement athlète.\",\r\n\t\t\t},\r\n\t\t\t\"share-count\": {\r\n\t\t\t\ten: \"Share Count\",\r\n\t\t\t\tit: \"Condivisioni\",\r\n\t\t\t\tes: \"Comparte\",\r\n\t\t\t\tfr: \"Partage\",\r\n\t\t\t},\r\n\t\t\t\"workout-sheets\": {\r\n\t\t\t\ten: \"Workouts\",\r\n\t\t\t\tit: \"Schede Allenamento\",\r\n\t\t\t\tes: \"Programas De Entrenamiento\",\r\n\t\t\t\tfr: \"Programmes De Entraînement\",\r\n\t\t\t},\r\n\t\t\t\"add-workout\": {\r\n\t\t\t\ten: \"Add Workout\",\r\n\t\t\t\tit: \"Aggiungi Scheda\",\r\n\t\t\t\tes: \"Agregar Workout\",\r\n\t\t\t\tfr: \"Ajouter Workout\",\r\n\t\t\t},\r\n\t\t\t\"edit-workout\": {\r\n\t\t\t\ten: \"Edit Workout\",\r\n\t\t\t\tit: \"Modifica Scheda\",\r\n\t\t\t\tes: \"Editar Workout\",\r\n\t\t\t\tfr: \"Modifier Workout\",\r\n\t\t\t},\r\n\t\t\t\"add-interval-workout\": {\r\n\t\t\t\ten: \"Add Interval Workout\",\r\n\t\t\t\tit: \"Aggiungi Scheda A Intervalli\",\r\n\t\t\t\tes: \"Agregar Interval Workout\",\r\n\t\t\t\tfr: \"Ajouter Interval Workout\",\r\n\t\t\t},\r\n\t\t\t\"workout-exercise\": {\r\n\t\t\t\ten: \"Workout Exercise\",\r\n\t\t\t\tit: \"Escercizio\",\r\n\t\t\t\tes: \"Ejercicio\",\r\n\t\t\t\tfr: \"Exercer\",\r\n\t\t\t},\r\n\t\t\t\"repsMax-cannot-be-lower-than-reps\": {\r\n\t\t\t\ten: \"The maximum number of repetitions cannot be less than repetitions\",\r\n\t\t\t\tit: \"Il numero massimo di ripetizioni non può essere inferiore alle ripetizioni\",\r\n\t\t\t\tes: \"El número máximo de repeticiones no puede ser inferior a repeticiones\",\r\n\t\t\t\tfr: \"Le nombre maximum de répétitions ne peut pas être inférieur à répétitions\",\r\n\t\t\t},\r\n\t\t\t\"assign-subscription\": {\r\n\t\t\t\ten: \"Assign Subscription\",\r\n\t\t\t\tit: \"Assegna Abbonamento\",\r\n\t\t\t\tes: \"Asignar Suscripción\",\r\n\t\t\t\tfr: \"Attribuer Un Abonnement\",\r\n\t\t\t},\r\n\t\t\t\"edit-subscription\": {\r\n\t\t\t\ten: \"Edit Subscription\",\r\n\t\t\t\tit: \"Modifica Abbonamento\",\r\n\t\t\t\tes: \"Editar Suscripción\",\r\n\t\t\t\tfr: \"Modifier L'Abonnement\",\r\n\t\t\t},\r\n\t\t\tsuspended: {\r\n\t\t\t\ten: \"Suspended\",\r\n\t\t\t\tit: \"Sospeso\",\r\n\t\t\t\tes: \"Suspendido\",\r\n\t\t\t\tfr: \"Suspendu\",\r\n\t\t\t},\r\n\t\t\tearly: {\r\n\t\t\t\ten: \"Not started\",\r\n\t\t\t\tit: \"Non iniziato\",\r\n\t\t\t\tes: \"No empezado\",\r\n\t\t\t\tfr: \"Pas commencé\",\r\n\t\t\t},\r\n\t\t\t\"choose-subscription\": {\r\n\t\t\t\ten: \"Choose Subscription\",\r\n\t\t\t\tit: \"Scegli Abbonamento\",\r\n\t\t\t\tes: \"Elija Suscripción\",\r\n\t\t\t\tfr: \"Choisissez l'Abonnement\",\r\n\t\t\t},\r\n\t\t\tremaining: {\r\n\t\t\t\ten: \"Remaining\",\r\n\t\t\t\tit: \"Rimanenti\",\r\n\t\t\t\tes: \"Restante\",\r\n\t\t\t\tfr: \"Restant\",\r\n\t\t\t},\r\n\t\t\t\"suspend-subscription\": {\r\n\t\t\t\ten: \"Suspend Subscription\",\r\n\t\t\t\tit: \"Sospendi Abbonamento\",\r\n\t\t\t\tes: \"Suspender Suscripción\",\r\n\t\t\t\tfr: \"Suspendre Abonnement\",\r\n\t\t\t},\r\n\t\t\t\"blank-manual-reactivation\": {\r\n\t\t\t\ten: \"Leave blank for manual reactivation\",\r\n\t\t\t\tit: \"Lasciare vuoto per riattivazione manuale\",\r\n\t\t\t\tes: \"Dejar en blanco para reactivación manual\",\r\n\t\t\t\tfr: \"Laisser vide pour la réactivation manuelle\",\r\n\t\t\t},\r\n\t\t\toperation: {\r\n\t\t\t\ten: \"Operation\",\r\n\t\t\t\tit: \"Operazione\",\r\n\t\t\t\tes: \"Operación\",\r\n\t\t\t\tfr: \"Opération\",\r\n\t\t\t},\r\n\t\t\t\"past-operations\": {\r\n\t\t\t\ten: \"Past Operations\",\r\n\t\t\t\tit: \"Storico Operazioni\",\r\n\t\t\t\tes: \"Operaciones Pasadas\",\r\n\t\t\t\tfr: \"Opérations Passées\",\r\n\t\t\t},\r\n\t\t\tfiles: {\r\n\t\t\t\ten: \"Files\",\r\n\t\t\t\tit: \"File\",\r\n\t\t\t\tes: \"Archivos\",\r\n\t\t\t\tfr: \"Fichiers\",\r\n\t\t\t},\r\n\t\t\tpick: {\r\n\t\t\t\ten: \"Pick\",\r\n\t\t\t\tit: \"Scegli\",\r\n\t\t\t\tes: \"Elegir\",\r\n\t\t\t\tfr: \"Prendre\",\r\n\t\t\t},\r\n\t\t\t\"add-subscription\": {\r\n\t\t\t\ten: \"Add Subscription\",\r\n\t\t\t\tit: \"Aggiungi Abbonamento\",\r\n\t\t\t\tes: \"Agregar Suscripción\",\r\n\t\t\t\tfr: \"Ajouter Abonnement\",\r\n\t\t\t},\r\n\t\t\texercises: {\r\n\t\t\t\ten: \"Exercises\",\r\n\t\t\t\tit: \"Esercizi\",\r\n\t\t\t\tes: \"Ejercicios\",\r\n\t\t\t\tfr: \"Exercices\",\r\n\t\t\t},\r\n\t\t\trest: {\r\n\t\t\t\ten: \"Rest\",\r\n\t\t\t\tit: \"Pausa\",\r\n\t\t\t\tes: \"Descanso\",\r\n\t\t\t\tfr: \"Repos\",\r\n\t\t\t},\r\n\t\t\tREST: {\r\n\t\t\t\ten: \"REST\",\r\n\t\t\t\tit: \"PAUSA\",\r\n\t\t\t\tes: \"DESCANSO\",\r\n\t\t\t\tfr: \"REPOS\",\r\n\t\t\t},\r\n\t\t\trounds: {\r\n\t\t\t\ten: \"Round\",\r\n\t\t\t\tit: \"Rounds\",\r\n\t\t\t\tes: \"Rondas\",\r\n\t\t\t\tfr: \"Manches\"\r\n\t\t\t},\r\n\t\t\t\"configure\": {\r\n\t\t\t\ten: \"Configure\",\r\n\t\t\t\tit: \"Configura\",\r\n\t\t\t\tes: \"Configurar\",\r\n\t\t\t\tfr: \"Configurer\"\r\n\t\t\t},\r\n\t\t\t\"round-pause\": {\r\n\t\t\t\ten: \"Round Pause\",\r\n\t\t\t\tit: \"Pausa del Round\",\r\n\t\t\t\tes: \"Pausa de la Ronda\",\r\n\t\t\t\tfr: \"Pause de Manche\"\r\n\t\t\t},\r\n\t\t\t\"set\": {\r\n\t\t\t\ten: \"Set\",\r\n\t\t\t\tit: \"Serie\",\r\n\t\t\t\tes: \"Serie\",\r\n\t\t\t\tfr: \"Sèrie\",\r\n\t\t\t},\r\n\t\t\t\"select-cardio-zone\": {\r\n\t\t\t\ten: \"Select Cardio Zone\",\r\n\t\t\t\tit: \"Seleziona Zona Cardio\",\r\n\t\t\t\tes: \"Seleccionar Zona Cardio\",\r\n\t\t\t\tfr: \"Sélectionnez zone cardio\",\r\n\t\t\t},\r\n\t\t\t\"ok\": {\r\n\t\t\t\ten: \"Ok\",\r\n\t\t\t\tit: \"Ok\",\r\n\t\t\t\tes: \"Ok\",\r\n\t\t\t\tfr: \"Ok\",\r\n\t\t\t},\r\n\t\t\t\"total-duration\": {\r\n\t\t\t\ten: \"Total duration\",\r\n\t\t\t\tit: \"Durata totale\",\r\n\t\t\t\tes: \"Duración total\",\r\n\t\t\t\tfr: \"Durée totale\",\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: \"Remarques\",\r\n\t\t\t},\r\n\t\t\tRPE: {\r\n\t\t\t\ten: \"RPE\",\r\n\t\t\t\tit: \"RPE\",\r\n\t\t\t\tes: \"RPE\",\r\n\t\t\t\tfr: \"RPE\",\r\n\t\t\t},\r\n\t\t\tEPCP: {\r\n\t\t\t\ten: \"EPCP\",\r\n\t\t\t\tit: \"EPCP\",\r\n\t\t\t\tes: \"EPCP\",\r\n\t\t\t\tfr: \"EPCP\",\r\n\t\t\t},\r\n\t\t\trepsMax: {\r\n\t\t\t\ten: \"repsMax\",\r\n\t\t\t\tit: \"repsMax\",\r\n\t\t\t\tes: \"repsMax\",\r\n\t\t\t\tfr: \"repsMax\",\r\n\t\t\t},\r\n\t\t\treps: {\r\n\t\t\t\ten: \"Number of Exercises\",\r\n\t\t\t\tit: \"Numero Esercizi\",\r\n\t\t\t\tes: \"Numero de Ejercicios\",\r\n\t\t\t\tfr: \"Nombre d'Exercices\",\r\n\t\t\t},\r\n\t\t\tshared: {\r\n\t\t\t\ten: \"Shared\",\r\n\t\t\t\tit: \"Condivisi\",\r\n\t\t\t\tes: \"Shared\",\r\n\t\t\t\tfr: \"Shared\",\r\n\t\t\t},\r\n\t\t\t\"no-exercise-selected\": {\r\n\t\t\t\ten: \"No exercise selected\",\r\n\t\t\t\tit: \"Nessun Esercizio Selezionato\",\r\n\t\t\t\tes: \"Ningún Ejercicio Seleccionado\",\r\n\t\t\t\tfr: \"Aucun Exercice Sélectionné\",\r\n\t\t\t},\r\n\t\t\t\"edit-group\": {\r\n\t\t\t\ten: \"Edit Group\",\r\n\t\t\t\tit: \"Modifica Gruppo\",\r\n\t\t\t\tes: \"Editar Grupo\",\r\n\t\t\t\tfr: \"Modifier Groupe\",\r\n\t\t\t},\r\n\t\t\t\"add-new-timer\": {\r\n\t\t\t\ten: \"Add New Timer\",\r\n\t\t\t\tit: \"Aggiungi Nuovo Timer\",\r\n\t\t\t\tes: \"Add New Timer\",\r\n\t\t\t\tfr: \"Add New Timer\",\r\n\t\t\t},\r\n\t\t\t\"choose-exercise\": {\r\n\t\t\t\ten: \"Choose Exercise\",\r\n\t\t\t\tit: \"Scegli Esercizio\",\r\n\t\t\t\tes: \"Elige Ejercicio\",\r\n\t\t\t\tfr: \"Choisissez Exercice\",\r\n\t\t\t},\r\n\t\t\t\"add-exercise\": {\r\n\t\t\t\ten: \"Add Exercise\",\r\n\t\t\t\tit: \"Aggiungi Esercizio\",\r\n\t\t\t\tes: \"Añadir Ejercicio\",\r\n\t\t\t\tfr: \"Ajouter Exercice\",\r\n\t\t\t},\r\n\t\t\t\"add-set\": {\r\n\t\t\t\ten: \"Add Set\",\r\n\t\t\t\tit: \"Aggiungi Set\",\r\n\t\t\t\tes: \"Añadir Set\",\r\n\t\t\t\tfr: \"Ajouter Set\",\r\n\t\t\t},\r\n\t\t\t\"show-fields\": {\r\n\t\t\t\ten: \"Show Fields\",\r\n\t\t\t\tit: \"Mostra Campi\",\r\n\t\t\t\tes: \"Mostrar Campos\",\r\n\t\t\t\tfr: \"Afficher les Champs\",\r\n\t\t\t},\r\n\t\t\t\"add-rest\": {\r\n\t\t\t\ten: \"Add Rest\",\r\n\t\t\t\tit: \"Aggiungi Pausa\",\r\n\t\t\t\tes: \"Añadir Descanso\",\r\n\t\t\t\tfr: \"Ajouter Repos\",\r\n\t\t\t},\r\n\t\t\t\"sheet-intensity\": {\r\n\t\t\t\ten: \"Intensity\",\r\n\t\t\t\tit: \"Intensità\",\r\n\t\t\t\tes: \"Intensidad\",\r\n\t\t\t\tfr: \"Intensité\",\r\n\t\t\t},\r\n\t\t\t\"free-group\": {\r\n\t\t\t\ten: \"Free\",\r\n\t\t\t\tit: \"Libero\",\r\n\t\t\t\tes: \"Libre\",\r\n\t\t\t\tfr: \"Libérer\",\r\n\t\t\t},\r\n\t\t\tintensity: {\r\n\t\t\t\ten: \"Intensity\",\r\n\t\t\t\tit: \"Intensità\",\r\n\t\t\t\tes: \"Intensidad\",\r\n\t\t\t\tfr: \"Intensité\",\r\n\t\t\t},\r\n\t\t\t\"round-duration\": {\r\n\t\t\t\ten: \"Round Duration\",\r\n\t\t\t\tit: \"Durata Round\",\r\n\t\t\t\tes: \"Duración Ronda\",\r\n\t\t\t\tfr: \"Durée Round\",\r\n\t\t\t},\r\n\t\t\t\"round-rest\": {\r\n\t\t\t\ten: \"Round Rest\",\r\n\t\t\t\tit: \"Pausa Round\",\r\n\t\t\t\tes: \"Descanso Ronda\",\r\n\t\t\t\tfr: \"Repos Manche\",\r\n\t\t\t},\r\n\t\t\t\"exercise-rest\": {\r\n\t\t\t\ten: \"Exercise Rest\",\r\n\t\t\t\tit: \"Pausa Esercizio\",\r\n\t\t\t\tes: \"Descanso Ejercicio\",\r\n\t\t\t\tfr: \"Repos Exercice\",\r\n\t\t\t},\r\n\t\t\trepetitions: {\r\n\t\t\t\ten: \"Repetitions\",\r\n\t\t\t\tit: \"Ripetizioni\",\r\n\t\t\t\tes: \"Repeticiones\",\r\n\t\t\t\tfr: \"Répétitions\",\r\n\t\t\t},\r\n\t\t\t\"max-repetitions\": {\r\n\t\t\t\ten: \"Max Repetitions\",\r\n\t\t\t\tit: \"Max Ripetizioni\",\r\n\t\t\t\tes: \"Max Repeticiones\",\r\n\t\t\t\tfr: \"Max Répétitions\",\r\n\t\t\t},\r\n\t\t\tweight: {\r\n\t\t\t\ten: \"Weight\",\r\n\t\t\t\tit: \"Peso\",\r\n\t\t\t\tes: \"Peso\",\r\n\t\t\t\tfr: \"Poids\",\r\n\t\t\t},\r\n\t\t\ttempo: {\r\n\t\t\t\ten: \"Tempo\",\r\n\t\t\t\tit: \"Tempo\",\r\n\t\t\t\tes: \"Tempo\",\r\n\t\t\t\tfr: \"Tempo\",\r\n\t\t\t},\r\n\t\t\tsuperset: {\r\n\t\t\t\ten: \"Superset\",\r\n\t\t\t\tit: \"Superset\",\r\n\t\t\t\tes: \"Superset\",\r\n\t\t\t\tfr: \"Superset\",\r\n\t\t\t},\r\n\t\t\tSuperset: {\r\n\t\t\t\ten: \"Superset\",\r\n\t\t\t\tit: \"Superset\",\r\n\t\t\t\tes: \"Superset\",\r\n\t\t\t\tfr: \"Superset\",\r\n\t\t\t},\r\n\t\t\tAFAP: {\r\n\t\t\t\ten: \"AFAP\",\r\n\t\t\t\tit: \"AFAP\",\r\n\t\t\t\tes: \"AFAP\",\r\n\t\t\t\tfr: \"AFAP\",\r\n\t\t\t},\r\n\t\t\tEMOM: {\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\tAMRAP: {\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\tInterval: {\r\n\t\t\t\ten: \"Interval Training\",\r\n\t\t\t\tit: \"Interval Training\",\r\n\t\t\t\tes: \"Interval Training\",\r\n\t\t\t\tfr: \"Interval Training\",\r\n\t\t\t},\r\n\t\t\test: {\r\n\t\t\t\ten: \"est.\",\r\n\t\t\t\tit: \"est.\",\r\n\t\t\t\tes: \"est.\",\r\n\t\t\t\tfr: \"est.\",\r\n\t\t\t},\r\n\t\t\t\"rest-must-be-greater-than-0\": {\r\n\t\t\t\ten: \"Rest must be greater than 0.\",\r\n\t\t\t\tit: \"La pausa deve essere maggiore di 0.\",\r\n\t\t\t\tes: \"La pausa debe ser mayor que 0.\",\r\n\t\t\t\tfr: \"La pause doit être supérieure à 0.\",\r\n\t\t\t},\r\n\t\t\t\"duration-must-be-greater-than-0\": {\r\n\t\t\t\ten: \"Duration must be greater than 0.\",\r\n\t\t\t\tit: \"La durata deve essere maggiore di 0.\",\r\n\t\t\t\tes: \"La duración debe ser mayor que 0.\",\r\n\t\t\t\tfr: \"La durée doit être supérieure à 0.\",\r\n\t\t\t},\r\n\t\t\t\"exercise-cannot-contains-only-rest\": {\r\n\t\t\t\ten: \"An exercise cannot contain only rests.\",\r\n\t\t\t\tit: \"Un esercizio non può contenere solo pause.\",\r\n\t\t\t\tes: \"Un ejercicio no puede contener solo silencios.\",\r\n\t\t\t\tfr: \"Un exercice ne peut pas contenir que des descansos.\",\r\n\t\t\t},\r\n\t\t\t\"export-workout\": {\r\n\t\t\t\ten: \"Export Workout\",\r\n\t\t\t\tit: \"Esporta Scheda\",\r\n\t\t\t\tes: \"Exportar Entrenamiento\",\r\n\t\t\t\tfr: \"Exporter l'Entraînement\",\r\n\t\t\t},\r\n\t\t\t\"clone-to-personal\": {\r\n\t\t\t\ten: \"Clone to personal\",\r\n\t\t\t\tit: \"Clona come personale\",\r\n\t\t\t\tes: \"Clone to personal\",\r\n\t\t\t\tfr: \"Clone to personal\",\r\n\t\t\t},\r\n\t\t\t\"choose-athletes\": {\r\n\t\t\t\ten: \"Choose Athletes\",\r\n\t\t\t\tit: \"Seleziona Atleti\",\r\n\t\t\t\tes: \"Elegir Atletas\",\r\n\t\t\t\tfr: \"Choisir Athlètes\",\r\n\t\t\t},\r\n\t\t\t\"create-as-template\": {\r\n\t\t\t\ten: \"Create as template\",\r\n\t\t\t\tit: \"Crea come template\",\r\n\t\t\t\tes: \"Create as template\",\r\n\t\t\t\tfr: \"Create as template\",\r\n\t\t\t},\r\n\t\t\t\"interval-training\": {\r\n\t\t\t\ten: \"Interval Training\",\r\n\t\t\t\tit: \"Interval Training\",\r\n\t\t\t\tes: \"Interval Training\",\r\n\t\t\t\tfr: \"Interval Training\",\r\n\t\t\t},\r\n\t\t\t\"expand-series\": {\r\n\t\t\t\ten: \"Expand Sets\",\r\n\t\t\t\tit: \"Espandi Sets\",\r\n\t\t\t\tes: \"Expandir Sets\",\r\n\t\t\t\tfr: \"Expand Sets\",\r\n\t\t\t},\r\n\t\t\t\"collapse-series\": {\r\n\t\t\t\ten: \"Collapse Sets\",\r\n\t\t\t\tit: \"Comprimi Sets\",\r\n\t\t\t\tes: \"Comprimir Sets\",\r\n\t\t\t\tfr: \"Compresse Sets\",\r\n\t\t\t},\r\n\t\t\t\"expand\": {\r\n\t\t\t\ten: \"Expand\",\r\n\t\t\t\tit: \"Espandi\",\r\n\t\t\t\tes: \"Expandir\",\r\n\t\t\t\tfr: \"Expand\",\r\n\t\t\t},\r\n\t\t\t\"collapse\": {\r\n\t\t\t\ten: \"Collapse\",\r\n\t\t\t\tit: \"Comprimi\",\r\n\t\t\t\tes: \"Comprimir\",\r\n\t\t\t\tfr: \"Compresse\",\r\n\t\t\t},\r\n\t\t\t\"defaults\": {\r\n\t\t\t\ten: \"Defaults\",\r\n\t\t\t\tit: \"Defaults\",\r\n\t\t\t\tes: \"Defaults\",\r\n\t\t\t\tfr: \"Defaults\",\r\n\t\t\t},\r\n\t\t\t\"workout-definitions\": {\r\n\t\t\t\ten: \"Workout Definitions\",\r\n\t\t\t\tit: \"Definizioni Allenamento\",\r\n\t\t\t\tes: \"Definiciones Entrenamiento\",\r\n\t\t\t\tfr: \"Définitions Entraînement\",\r\n\t\t\t},\r\n\t\t\t\"exercise-library\": {\r\n\t\t\t\ten: \"Exercise Library\",\r\n\t\t\t\tit: \"Libreria di Esercizi\",\r\n\t\t\t\tes: \"Biblioteca de Ejercicios\",\r\n\t\t\t\tfr: \"Bibliothèque d'Exercices\",\r\n\t\t\t},\r\n\t\t\t\"uptivo-editor-exercise-library\": {\r\n\t\t\t\ten: \"Exercise Library (EDITOR)\",\r\n\t\t\t\tit: \"Libreria di Esercizi (EDITOR)\",\r\n\t\t\t\tes: \"Biblioteca de Ejercicios (EDITOR)\",\r\n\t\t\t\tfr: \"Bibliothèque d'Exercices (EDITOR)\",\r\n\t\t\t},\r\n\t\t\t\"exercise-duration\": {\r\n\t\t\t\ten: \"Exercise Duration\",\r\n\t\t\t\tit: \"Durata Esercizio\",\r\n\t\t\t\tes: \"Duración Ejercicio\",\r\n\t\t\t\tfr: \"Durée Exercice\",\r\n\t\t\t},\r\n\t\t\t\"create-group\": {\r\n\t\t\t\ten: \"Create Group\",\r\n\t\t\t\tit: \"Crea Gruppo\",\r\n\t\t\t\tes: \"Crea Grupo\",\r\n\t\t\t\tfr: \"Créer Groupe\",\r\n\t\t\t},\r\n\t\t\t\"MainMuscle-Abductors\": {\r\n\t\t\t\ten: \"Abductors\",\r\n\t\t\t\tit: \"Abduttori\",\r\n\t\t\t\tes: \"Abductores\",\r\n\t\t\t\tfr: \"Abducteurs\",\r\n\t\t\t},\r\n\t\t\t\"MainMuscle-Abs\": {\r\n\t\t\t\ten: \"Abs\",\r\n\t\t\t\tit: \"Addominali\",\r\n\t\t\t\tes: \"Abdominales\",\r\n\t\t\t\tfr: \"Abdos\",\r\n\t\t\t},\r\n\t\t\t\"MainMuscle-Adductors\": {\r\n\t\t\t\ten: \"Adductors\",\r\n\t\t\t\tit: \"Adduttori\",\r\n\t\t\t\tes: \"Aductores\",\r\n\t\t\t\tfr: \"Adducteurs\",\r\n\t\t\t},\r\n\t\t\t\"MainMuscle-BackLower\": {\r\n\t\t\t\ten: \"Lower Back\",\r\n\t\t\t\tit: \"Schiena Bassa\",\r\n\t\t\t\tes: \"Espalda Baja\",\r\n\t\t\t\tfr: \"Bas du dos\",\r\n\t\t\t},\r\n\t\t\t\"MainMuscle-BackMiddle\": {\r\n\t\t\t\ten: \"Middle Back\",\r\n\t\t\t\tit: \"Schiena Media\",\r\n\t\t\t\tes: \"Espalda Media\",\r\n\t\t\t\tfr: \"Milieu du dos\",\r\n\t\t\t},\r\n\t\t\t\"MainMuscle-Bicep\": {\r\n\t\t\t\ten: \"Biceps\",\r\n\t\t\t\tit: \"Bicipiti\",\r\n\t\t\t\tes: \"Bíceps\",\r\n\t\t\t\tfr: \"Biceps\",\r\n\t\t\t},\r\n\t\t\t\"MainMuscle-Calves\": {\r\n\t\t\t\ten: \"Calves\",\r\n\t\t\t\tit: \"Polpacci\",\r\n\t\t\t\tes: \"Gemelos\",\r\n\t\t\t\tfr: \"Mollets\",\r\n\t\t\t},\r\n\t\t\t\"MainMuscle-Chest\": {\r\n\t\t\t\ten: \"Chest\",\r\n\t\t\t\tit: \"Pettorali\",\r\n\t\t\t\tes: \"Pecho\",\r\n\t\t\t\tfr: \"Poitrine\",\r\n\t\t\t},\r\n\t\t\t\"MainMuscle-Forearms\": {\r\n\t\t\t\ten: \"Forearms\",\r\n\t\t\t\tit: \"Avambracci\",\r\n\t\t\t\tes: \"Antebrazos\",\r\n\t\t\t\tfr: \"Avant-bras\",\r\n\t\t\t},\r\n\t\t\t\"MainMuscle-Glutes\": {\r\n\t\t\t\ten: \"Glutes\",\r\n\t\t\t\tit: \"Glutei\",\r\n\t\t\t\tes: \"Glúteos\",\r\n\t\t\t\tfr: \"Fessiers\",\r\n\t\t\t},\r\n\t\t\t\"MainMuscle-Hamstrings\": {\r\n\t\t\t\ten: \"Hamstrings\",\r\n\t\t\t\tit: \"Ischiocrurali\",\r\n\t\t\t\tes: \"Isquiotibiales\",\r\n\t\t\t\tfr: \"Ischio-jambiers\",\r\n\t\t\t},\r\n\t\t\t\"MainMuscle-Lats\": {\r\n\t\t\t\ten: \"Lats\",\r\n\t\t\t\tit: \"Dorsali\",\r\n\t\t\t\tes: \"Dorsales\",\r\n\t\t\t\tfr: \"Dorsaux\",\r\n\t\t\t},\r\n\t\t\t\"MainMuscle-Neck\": {\r\n\t\t\t\ten: \"Neck\",\r\n\t\t\t\tit: \"Collo\",\r\n\t\t\t\tes: \"Cuello\",\r\n\t\t\t\tfr: \"Cou\",\r\n\t\t\t},\r\n\t\t\t\"MainMuscle-Obliques\": {\r\n\t\t\t\ten: \"Obliques\",\r\n\t\t\t\tit: \"Addominali Obliqui\",\r\n\t\t\t\tes: \"Oblicuos\",\r\n\t\t\t\tfr: \"Obliques\",\r\n\t\t\t},\r\n\t\t\t\"MainMuscle-Quads\": {\r\n\t\t\t\ten: \"Quads\",\r\n\t\t\t\tit: \"Quadricipiti\",\r\n\t\t\t\tes: \"Cuádriceps\",\r\n\t\t\t\tfr: \"Quadriceps\",\r\n\t\t\t},\r\n\t\t\t\"MainMuscle-Shoulder\": {\r\n\t\t\t\ten: \"Shoulders\",\r\n\t\t\t\tit: \"Spalle\",\r\n\t\t\t\tes: \"Hombros\",\r\n\t\t\t\tfr: \"Épaule\",\r\n\t\t\t},\r\n\t\t\t\"MainMuscle-Traps\": {\r\n\t\t\t\ten: \"Traps\",\r\n\t\t\t\tit: \"Trapezi\",\r\n\t\t\t\tes: \"Trapecios\",\r\n\t\t\t\tfr: \"Trapèzes\",\r\n\t\t\t},\r\n\t\t\t\"MainMuscle-Triceps\": {\r\n\t\t\t\ten: \"Triceps\",\r\n\t\t\t\tit: \"Tricipiti\",\r\n\t\t\t\tes: \"Tríceps\",\r\n\t\t\t\tfr: \"Triceps\",\r\n\t\t\t},\r\n\t\t\t\"MainMuscle-Hips\": {\r\n\t\t\t\ten: \"Hip flexors\",\r\n\t\t\t\tit: \"Flessori dell'anca\",\r\n\t\t\t\tes: \"Hip flexors\",\r\n\t\t\t\tfr: \"Hip flexors\",\r\n\t\t\t},\r\n\t\t\t\"MainMuscle-Rhomboids\": {\r\n\t\t\t\ten: \"Rhomboids\",\r\n\t\t\t\tit: \"Romboidi\",\r\n\t\t\t\tes: \"Romboides\",\r\n\t\t\t\tfr: \"Rhomboïdes\",\r\n\t\t\t},\r\n\t\t\t\"Muscle-Abductors\": {\r\n\t\t\t\ten: \"Abductors\",\r\n\t\t\t\tit: \"Abduttori\",\r\n\t\t\t\tes: \"Abductores\",\r\n\t\t\t\tfr: \"Abducteurs\",\r\n\t\t\t},\r\n\t\t\t\"Muscle-Abs\": {\r\n\t\t\t\ten: \"Abs\",\r\n\t\t\t\tit: \"Addominali\",\r\n\t\t\t\tes: \"Abdominales\",\r\n\t\t\t\tfr: \"Abdos\",\r\n\t\t\t},\r\n\t\t\t\"Muscle-Adductors\": {\r\n\t\t\t\ten: \"Adductors\",\r\n\t\t\t\tit: \"Adduttori\",\r\n\t\t\t\tes: \"Aductores\",\r\n\t\t\t\tfr: \"Adducteurs\",\r\n\t\t\t},\r\n\t\t\t\"Muscle-BackLower\": {\r\n\t\t\t\ten: \"Lower Back\",\r\n\t\t\t\tit: \"Schiena Bassa\",\r\n\t\t\t\tes: \"Espalda Baja\",\r\n\t\t\t\tfr: \"Bas du dos\",\r\n\t\t\t},\r\n\t\t\t\"Muscle-BackMiddle\": {\r\n\t\t\t\ten: \"Middle Back\",\r\n\t\t\t\tit: \"Schiena Media\",\r\n\t\t\t\tes: \"Espalda Media\",\r\n\t\t\t\tfr: \"Milieu du dos\",\r\n\t\t\t},\r\n\t\t\t\"Muscle-Bicep\": {\r\n\t\t\t\ten: \"Biceps\",\r\n\t\t\t\tit: \"Bicipiti\",\r\n\t\t\t\tes: \"Bíceps\",\r\n\t\t\t\tfr: \"Biceps\",\r\n\t\t\t},\r\n\t\t\t\"Muscle-Calves\": {\r\n\t\t\t\ten: \"Calves\",\r\n\t\t\t\tit: \"Polpacci\",\r\n\t\t\t\tes: \"Gemelos\",\r\n\t\t\t\tfr: \"Mollets\",\r\n\t\t\t},\r\n\t\t\t\"Muscle-Chest\": {\r\n\t\t\t\ten: \"Chest\",\r\n\t\t\t\tit: \"Pettorali\",\r\n\t\t\t\tes: \"Pecho\",\r\n\t\t\t\tfr: \"Poitrine\",\r\n\t\t\t},\r\n\t\t\t\"Muscle-Forearms\": {\r\n\t\t\t\ten: \"Forearms\",\r\n\t\t\t\tit: \"Avambracci\",\r\n\t\t\t\tes: \"Antebrazos\",\r\n\t\t\t\tfr: \"Avant-bras\",\r\n\t\t\t},\r\n\t\t\t\"Muscle-Glutes\": {\r\n\t\t\t\ten: \"Glutes\",\r\n\t\t\t\tit: \"Glutei\",\r\n\t\t\t\tes: \"Glúteos\",\r\n\t\t\t\tfr: \"Fessiers\",\r\n\t\t\t},\r\n\t\t\t\"Muscle-Hamstrings\": {\r\n\t\t\t\ten: \"Hamstrings\",\r\n\t\t\t\tit: \"Ischiocrurali\",\r\n\t\t\t\tes: \"Isquiotibiales\",\r\n\t\t\t\tfr: \"Ischio-jambiers\",\r\n\t\t\t},\r\n\t\t\t\"Muscle-Lats\": {\r\n\t\t\t\ten: \"Lats\",\r\n\t\t\t\tit: \"Dorsali\",\r\n\t\t\t\tes: \"Dorsales\",\r\n\t\t\t\tfr: \"Dorsaux\",\r\n\t\t\t},\r\n\t\t\t\"Muscle-Neck\": {\r\n\t\t\t\ten: \"Neck\",\r\n\t\t\t\tit: \"Collo\",\r\n\t\t\t\tes: \"Cuello\",\r\n\t\t\t\tfr: \"Cou\",\r\n\t\t\t},\r\n\t\t\t\"Muscle-Obliques\": {\r\n\t\t\t\ten: \"Obliques\",\r\n\t\t\t\tit: \"Addominali Obliqui\",\r\n\t\t\t\tes: \"Oblicuos\",\r\n\t\t\t\tfr: \"Obliques\",\r\n\t\t\t},\r\n\t\t\t\"Muscle-Quads\": {\r\n\t\t\t\ten: \"Quads\",\r\n\t\t\t\tit: \"Quadricipiti\",\r\n\t\t\t\tes: \"Cuádriceps\",\r\n\t\t\t\tfr: \"Quadriceps\",\r\n\t\t\t},\r\n\t\t\t\"Muscle-Shoulder\": {\r\n\t\t\t\ten: \"Shoulders\",\r\n\t\t\t\tit: \"Spalle\",\r\n\t\t\t\tes: \"Hombros\",\r\n\t\t\t\tfr: \"Épaule\",\r\n\t\t\t},\r\n\t\t\t\"Muscle-Traps\": {\r\n\t\t\t\ten: \"Traps\",\r\n\t\t\t\tit: \"Trapezi\",\r\n\t\t\t\tes: \"Trapecios\",\r\n\t\t\t\tfr: \"Trapèzes\",\r\n\t\t\t},\r\n\t\t\t\"Muscle-Triceps\": {\r\n\t\t\t\ten: \"Triceps\",\r\n\t\t\t\tit: \"Tricipiti\",\r\n\t\t\t\tes: \"Tríceps\",\r\n\t\t\t\tfr: \"Triceps\",\r\n\t\t\t},\r\n\t\t\t\"Muscle-Hips\": {\r\n\t\t\t\ten: \"Hip flexors\",\r\n\t\t\t\tit: \"Flessori dell'anca\",\r\n\t\t\t\tes: \"Hip flexors\",\r\n\t\t\t\tfr: \"Hip flexors\",\r\n\t\t\t},\r\n\t\t\t\"Muscle-Rhomboids\": {\r\n\t\t\t\ten: \"Rhomboids\",\r\n\t\t\t\tit: \"Romboidi\",\r\n\t\t\t\tes: \"Romboides\",\r\n\t\t\t\tfr: \"Rhomboïdes\",\r\n\t\t\t},\r\n\t\t\t\"Equipment-BalanceBoard\": {\r\n\t\t\t\ten: \"Balance board\",\r\n\t\t\t\tit: \"Tavoletta propriocettiva\",\r\n\t\t\t\tes: \"Plato de freeman\",\r\n\t\t\t\tfr: \"Tableau d'équilibre\",\r\n\t\t\t},\r\n\t\t\t\"Equipment-HandleBands\": {\r\n\t\t\t\ten: \"Handle bands\",\r\n\t\t\t\tit: \"Elastici con maniglie\",\r\n\t\t\t\tes: \"Elásticos con asas\",\r\n\t\t\t\tfr: \"Bande élastique avec poignéess\",\r\n\t\t\t},\r\n\t\t\t\"Equipment-LoopBands\": {\r\n\t\t\t\ten: \"Loop bands \",\r\n\t\t\t\tit: \"Fasce elastiche\",\r\n\t\t\t\tes: \"Bandas elásticas\",\r\n\t\t\t\tfr: \"Élastiques\",\r\n\t\t\t},\r\n\t\t\t\"Equipment-Barbell\": {\r\n\t\t\t\ten: \"Barbell\",\r\n\t\t\t\tit: \"Bilanciere\",\r\n\t\t\t\tes: \"Barra\",\r\n\t\t\t\tfr: \"Barre de musculation\",\r\n\t\t\t},\r\n\t\t\t\"Equipment-BattleRopes\": {\r\n\t\t\t\ten: \"Battle ropes\",\r\n\t\t\t\tit: \"Battle ropes\",\r\n\t\t\t\tes: \"Battle ropes\",\r\n\t\t\t\tfr: \"Battle ropes\",\r\n\t\t\t},\r\n\t\t\t\"Equipment-Bench\": {\r\n\t\t\t\ten: \"Bench\",\r\n\t\t\t\tit: \"Panca\",\r\n\t\t\t\tes: \"Banco\",\r\n\t\t\t\tfr: \"Banc\",\r\n\t\t\t},\r\n\t\t\t\"Equipment-BodyWeight\": {\r\n\t\t\t\ten: \"Bodyweight\",\r\n\t\t\t\tit: \"Corpo libero\",\r\n\t\t\t\tes: \"Cuerpo libre\",\r\n\t\t\t\tfr: \"Poids du corps\",\r\n\t\t\t},\r\n\t\t\tFunctional: {\r\n\t\t\t\ten: \"Functional\",\r\n\t\t\t\tit: \"Functional\",\r\n\t\t\t\tes: \"Functional\",\r\n\t\t\t\tfr: \"Functional\",\r\n\t\t\t},\r\n\t\t\t\"Equipment-BOSU\": {\r\n\t\t\t\ten: \"BOSU\",\r\n\t\t\t\tit: \"BOSU\",\r\n\t\t\t\tes: \"BOSU\",\r\n\t\t\t\tfr: \"BOSU\",\r\n\t\t\t},\r\n\t\t\t\"Equipment-PlyoBox\": {\r\n\t\t\t\ten: \"Plyo box\",\r\n\t\t\t\tit: \"Plyo box\",\r\n\t\t\t\tes: \"Plyo box\",\r\n\t\t\t\tfr: \"Plyo box\",\r\n\t\t\t},\r\n\t\t\t\"Equipment-Dumbbell\": {\r\n\t\t\t\ten: \"Dumbbell\",\r\n\t\t\t\tit: \"Manubrio\",\r\n\t\t\t\tes: \"Mancuerna\",\r\n\t\t\t\tfr: \"Haltère\",\r\n\t\t\t},\r\n\t\t\t\"Equipment-FoamRoller\": {\r\n\t\t\t\ten: \"Foam roller\",\r\n\t\t\t\tit: \"Foam roller\",\r\n\t\t\t\tes: \"Foam roller\",\r\n\t\t\t\tfr: \"Foam roller\",\r\n\t\t\t},\r\n\t\t\t\"Equipment-PilatesRoller\": {\r\n\t\t\t\ten: \"Pilates roller\",\r\n\t\t\t\tit: \"Pilates roller\",\r\n\t\t\t\tes: \"Pilates roller\",\r\n\t\t\t\tfr: \"Pilates roller\",\r\n\t\t\t},\r\n\t\t\t\"Equipment-PilatesRing\": {\r\n\t\t\t\ten: \"Pilates ring\",\r\n\t\t\t\tit: \"Pilates ring\",\r\n\t\t\t\tes: \"Aro de Pilates\",\r\n\t\t\t\tfr: \"Pilates ring\",\r\n\t\t\t},\r\n\t\t\t\"Equipment-JumpRope\": {\r\n\t\t\t\ten: \"Jump rope\",\r\n\t\t\t\tit: \"Corda per saltare\",\r\n\t\t\t\tes: \"Cuerda para saltar\",\r\n\t\t\t\tfr: \"Corde à sauter\",\r\n\t\t\t},\r\n\t\t\t\"Equipment-Kettlebell\": {\r\n\t\t\t\ten: \"Kettlebell\",\r\n\t\t\t\tit: \"Kettlebell\",\r\n\t\t\t\tes: \"Pesas rusas\",\r\n\t\t\t\tfr: \"Kettlebell\",\r\n\t\t\t},\r\n\t\t\t\"Equipment-LacrosseBall\": {\r\n\t\t\t\ten: \"Lacrosse ball\",\r\n\t\t\t\tit: \"Palla da lacrosse\",\r\n\t\t\t\tes: \"Pelota de lacrosse\",\r\n\t\t\t\tfr: \"Balle de lacrosse\",\r\n\t\t\t},\r\n\t\t\t\"Equipment-Landmine\": {\r\n\t\t\t\ten: \"Landmine\",\r\n\t\t\t\tit: \"Landmine\",\r\n\t\t\t\tes: \"Landmine\",\r\n\t\t\t\tfr: \"Landmine\",\r\n\t\t\t},\r\n\t\t\t\"Equipment-Strength\": {\r\n\t\t\t\ten: \"Strength equipments\",\r\n\t\t\t\tit: \"Strength equipments\",\r\n\t\t\t\tes: \"Strength equipments\",\r\n\t\t\t\tfr: \"Strength equipments\",\r\n\t\t\t},\r\n\t\t\t\"Equipment-Cardio\": {\r\n\t\t\t\ten: \"Cardio equipments\",\r\n\t\t\t\tit: \"Cardio equipments\",\r\n\t\t\t\tes: \"Cardio equipments\",\r\n\t\t\t\tfr: \"Cardio equipments\",\r\n\t\t\t},\r\n\t\t\t\"Equipment-Mat\": {\r\n\t\t\t\ten: \"Mat\",\r\n\t\t\t\tit: \"Tappetino\",\r\n\t\t\t\tes: \"Colchoneta\",\r\n\t\t\t\tfr: \"Tapis\",\r\n\t\t\t},\r\n\t\t\t\"Equipment-Boxing\": {\r\n\t\t\t\ten: \"Boxing\",\r\n\t\t\t\tit: \"Boxing\",\r\n\t\t\t\tes: \"Boxing\",\r\n\t\t\t\tfr: \"Boxing\",\r\n\t\t\t},\r\n\t\t\t\"Equipment-MedicineBall\": {\r\n\t\t\t\ten: \"Medicine ball\",\r\n\t\t\t\tit: \"Palla medica\",\r\n\t\t\t\tes: \"Pelota medicinal\",\r\n\t\t\t\tfr: \"Medicine ball\",\r\n\t\t\t},\r\n\t\t\t\"Equipment-MiniBand\": {\r\n\t\t\t\ten: \"Mini band\",\r\n\t\t\t\tit: \"Mini band\",\r\n\t\t\t\tes: \"Mini band\",\r\n\t\t\t\tfr: \"Mini bande élastique\",\r\n\t\t\t},\r\n\t\t\t\"Equipment-Plate\": {\r\n\t\t\t\ten: \"Plate\",\r\n\t\t\t\tit: \"Piastra\",\r\n\t\t\t\tes: \"Disco\",\r\n\t\t\t\tfr: \"Disque\",\r\n\t\t\t},\r\n\t\t\t\"Equipment-PullUpBar\": {\r\n\t\t\t\ten: \"Pull up bar\",\r\n\t\t\t\tit: \"Sbarra per trazioni\",\r\n\t\t\t\tes: \"Barra de dominadas\",\r\n\t\t\t\tfr: \"Barre de traction\",\r\n\t\t\t},\r\n\t\t\t\"Equipment-Sandbag\": {\r\n\t\t\t\ten: \"Sandbag\",\r\n\t\t\t\tit: \"Sandbag\",\r\n\t\t\t\tes: \"Sandbag\",\r\n\t\t\t\tfr: \"Sandbag\",\r\n\t\t\t},\r\n\t\t\t\"Equipment-SlamBall\": {\r\n\t\t\t\ten: \"Slam ball\",\r\n\t\t\t\tit: \"Slam ball\",\r\n\t\t\t\tes: \"Slam ball\",\r\n\t\t\t\tfr: \"Slam ball\",\r\n\t\t\t},\r\n\t\t\t\"Equipment-Sled\": {\r\n\t\t\t\ten: \"Sled\",\r\n\t\t\t\tit: \"Slitta\",\r\n\t\t\t\tes: \"Trineo\",\r\n\t\t\t\tfr: \"Traîneau\",\r\n\t\t\t},\r\n\t\t\t\"Equipment-Sliders\": {\r\n\t\t\t\ten: \"Sliders\",\r\n\t\t\t\tit: \"Sliders\",\r\n\t\t\t\tes: \"Discos deslizantes\",\r\n\t\t\t\tfr: \"Sliders\",\r\n\t\t\t},\r\n\t\t\t\"Equipment-SuspensionTrainer\": {\r\n\t\t\t\ten: \"Suspension trainer\",\r\n\t\t\t\tit: \"Suspension trainer\",\r\n\t\t\t\tes: \"Suspension trainer\",\r\n\t\t\t\tfr: \"Suspension trainer\",\r\n\t\t\t},\r\n\t\t\t\"Equipment-SwissBall\": {\r\n\t\t\t\ten: \"Swiss ball\",\r\n\t\t\t\tit: \"Swiss ball\",\r\n\t\t\t\tes: \"Fit ball\",\r\n\t\t\t\tfr: \"Swiss ball\",\r\n\t\t\t},\r\n\t\t\t\"Equipment-Clubbell\": {\r\n\t\t\t\ten: \"Clubbell\",\r\n\t\t\t\tit: \"Clubbell\",\r\n\t\t\t\tes: \"Clubbell\",\r\n\t\t\t\tfr: \"Clubbell\",\r\n\t\t\t},\r\n\t\t\t\"Equipment-TGEEncompass\": {\r\n\t\t\t\ten: \"Total Gym Encompass™\",\r\n\t\t\t\tit: \"Total Gym Encompass™\",\r\n\t\t\t\tes: \"Total Gym Encompass™\",\r\n\t\t\t\tfr: \"Total Gym Encompass™\",\r\n\t\t\t},\r\n\t\t\t\"Equipment-PosturalBench\": {\r\n\t\t\t\ten: \"Postural Bench\",\r\n\t\t\t\tit: \"Panca Posturale\",\r\n\t\t\t\tes: \"Banco Postural\",\r\n\t\t\t\tfr: \"Banc Postural\"\r\n\t\t\t},\r\n\t\t\t\"Equipment-Blast\": {\r\n\t\t\t\ten: \"Blast\",\r\n\t\t\t\tit: \"Blast\",\r\n\t\t\t\tes: \"Blast\",\r\n\t\t\t\tfr: \"Blast\",\r\n\t\t\t},\r\n\t\t\t\"Equipment-Reformer\": {\r\n\t\t\t\ten: \"Reformer\",\r\n\t\t\t\tit: \"Reformer\",\r\n\t\t\t\tes: \"Reformer\",\r\n\t\t\t\tfr: \"Reformer\",\r\n\t\t\t},\r\n\t\t\t\"Equipment-EVOWorkstation\": {\r\n\t\t\t\ten: \"EVO Workstation\",\r\n\t\t\t\tit: \"EVO Workstation\",\r\n\t\t\t\tes: \"EVO Workstation\",\r\n\t\t\t\tfr: \"EVO Workstation\",\r\n\t\t\t},\r\n\t\t\t\"Activity-Cardio\": {\r\n\t\t\t\ten: \"Cardio\",\r\n\t\t\t\tit: \"Cardio\",\r\n\t\t\t\tes: \"Cardio\",\r\n\t\t\t\tfr: \"Cardio\",\r\n\t\t\t},\r\n\t\t\t\"Activity-BodyWeight\": {\r\n\t\t\t\ten: \"Body weight\",\r\n\t\t\t\tit: \"Corpo libero\",\r\n\t\t\t\tes: \"Cuerpo libre\",\r\n\t\t\t\tfr: \"Poids du corps\",\r\n\t\t\t},\r\n\t\t\t\"Activity-YogaPilates\": {\r\n\t\t\t\ten: \"Yoga/Pilates\",\r\n\t\t\t\tit: \"Yoga/Pilates\",\r\n\t\t\t\tes: \"Yoga/Pilates\",\r\n\t\t\t\tfr: \"Yoga/Pilates\",\r\n\t\t\t},\r\n\t\t\t\"Activity-Functional\": {\r\n\t\t\t\ten: \"Functional\",\r\n\t\t\t\tit: \"Functional\",\r\n\t\t\t\tes: \"Functional\",\r\n\t\t\t\tfr: \"Functional\",\r\n\t\t\t},\r\n\t\t\t\"Activity-Stretching\": {\r\n\t\t\t\ten: \"Stretching\",\r\n\t\t\t\tit: \"Stretching\",\r\n\t\t\t\tes: \"Stretching\",\r\n\t\t\t\tfr: \"Stretching\",\r\n\t\t\t},\r\n\t\t\t\"Activity-Mobility\": {\r\n\t\t\t\ten: \"Mobility\",\r\n\t\t\t\tit: \"Mobility\",\r\n\t\t\t\tes: \"Mobility\",\r\n\t\t\t\tfr: \"Mobility\",\r\n\t\t\t},\r\n\t\t\t\"Activity-Combat\": {\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\t\"Activity-Strengthening\": {\r\n\t\t\t\ten: \"Strengthening\",\r\n\t\t\t\tit: \"Strengthening\",\r\n\t\t\t\tes: \"Strengthening\",\r\n\t\t\t\tfr: \"Strengthening\",\r\n\t\t\t},\r\n\t\t\t\"Wkstag-Stretching\": {\r\n\t\t\t\ten: \"Stretching\",\r\n\t\t\t\tit: \"Stretching\",\r\n\t\t\t\tes: \"Stretching\",\r\n\t\t\t\tfr: \"Ètirement\",\r\n\t\t\t},\r\n\t\t\t\"Wkstag-Strengthening\": {\r\n\t\t\t\ten: \"Strengthening\",\r\n\t\t\t\tit: \"Forza\",\r\n\t\t\t\tes: \"Fuerza\",\r\n\t\t\t\tfr: \"Musculation\",\r\n\t\t\t},\r\n\t\t\t\"Wkstag-Mobility\": {\r\n\t\t\t\ten: \"Mobility\",\r\n\t\t\t\tit: \"Mobilità\",\r\n\t\t\t\tes: \"Movilidad\",\r\n\t\t\t\tfr: \"Mobilisation\",\r\n\t\t\t},\r\n\t\t\t\"Wkstag-Cardio\": {\r\n\t\t\t\ten: \"Cardio\",\r\n\t\t\t\tit: \"Cardio\",\r\n\t\t\t\tes: \"Cardio\",\r\n\t\t\t\tfr: \"Cardio\",\r\n\t\t\t},\r\n\t\t\t\"Wkstag-Combat\": {\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\t\"Wkstag-YogaPilates\": {\r\n\t\t\t\ten: \"Yoga/Pilates\",\r\n\t\t\t\tit: \"Yoga/Pilates\",\r\n\t\t\t\tes: \"Yoga/Pilates\",\r\n\t\t\t\tfr: \"Yoga/Pilates\",\r\n\t\t\t},\r\n\t\t\t\"Wkstag-BodyWeight\": {\r\n\t\t\t\ten: \"Bodyweight\",\r\n\t\t\t\tit: \"Corpo libero\",\r\n\t\t\t\tes: \"Peso Corporal\",\r\n\t\t\t\tfr: \"Corps Libre\",\r\n\t\t\t},\r\n\t\t\t\"Wkstag-CrossTraining\": {\r\n\t\t\t\ten: \"Cross Training\",\r\n\t\t\t\tit: \"Cross Training\",\r\n\t\t\t\tes: \"Cross Training\",\r\n\t\t\t\tfr: \"Cross Training\",\r\n\t\t\t},\r\n\t\t\t\"Wkstag-BackSchool\": {\r\n\t\t\t\ten: \"Back School\",\r\n\t\t\t\tit: \"Back School\",\r\n\t\t\t\tes: \"Escuela de la Espalda\",\r\n\t\t\t\tfr: \"Gym du Dos\",\r\n\t\t\t},\r\n\t\t\t\"Wkstag-BodyBuilding\": {\r\n\t\t\t\ten: \"Body Building\",\r\n\t\t\t\tit: \"Body Building\",\r\n\t\t\t\tes: \"Body Building\",\r\n\t\t\t\tfr: \"Body Building\",\r\n\t\t\t},\r\n\t\t\t\"Wkstag-Endurance\": {\r\n\t\t\t\ten: \"Endurance\",\r\n\t\t\t\tit: \"Endurance\",\r\n\t\t\t\tes: \"Resistencia\",\r\n\t\t\t\tfr: \"Endurance\",\r\n\t\t\t},\r\n\t\t\t\"wetag-Equipment\": {\r\n\t\t\t\ten: \"Equipment\",\r\n\t\t\t\tit: \"Attrezzatura\",\r\n\t\t\t\tes: \"Equipo\",\r\n\t\t\t\tfr: \"Équipement\",\r\n\t\t\t},\r\n\t\t\t\"wetag-Activity\": {\r\n\t\t\t\ten: \"Activity\",\r\n\t\t\t\tit: \"Attività\",\r\n\t\t\t\tes: \"Actividad\",\r\n\t\t\t\tfr: \"Activité\",\r\n\t\t\t},\r\n\t\t\t\"wetag-Brand\": {\r\n\t\t\t\ten: \"Brand\",\r\n\t\t\t\tit: \"Brand\",\r\n\t\t\t\tes: \"Brand\",\r\n\t\t\t\tfr: \"Brand\",\r\n\t\t\t},\r\n\t\t\t\"wetag-MainMuscle\": {\r\n\t\t\t\ten: \"Main Muscle\",\r\n\t\t\t\tit: \"Muscolo Principale\",\r\n\t\t\t\tes: \"Músculo Principal\",\r\n\t\t\t\tfr: \"Muscle Principal\",\r\n\t\t\t},\r\n\t\t\t\"wetag-Muscle\": {\r\n\t\t\t\ten: \"Secondary Muscles\",\r\n\t\t\t\tit: \"Muscoli Secondari\",\r\n\t\t\t\tes: \"Músculos secundarios\",\r\n\t\t\t\tfr: \"Muscles secondaires\",\r\n\t\t\t},\r\n\t\t\t\"Brand-Triform\": {\r\n\t\t\t\ten: \"Triform\",\r\n\t\t\t\tit: \"Triform\",\r\n\t\t\t\tes: \"Triform\",\r\n\t\t\t\tfr: \"Triform\",\r\n\t\t\t},\r\n\t\t\t\"Brand-TotalGym\": {\r\n\t\t\t\ten: \"TotalGym\",\r\n\t\t\t\tit: \"TotalGym\",\r\n\t\t\t\tes: \"TotalGym\",\r\n\t\t\t\tfr: \"TotalGym\",\r\n\t\t\t},\r\n\t\t\t\"Brand-WellBackSystem\": {\r\n\t\t\t\ten: \"WellBackSystem\",\r\n\t\t\t\tit: \"WellBackSystem\",\r\n\t\t\t\tes: \"WellBackSystem\",\r\n\t\t\t\tfr: \"WellBackSystem\",\r\n\t\t\t},\r\n\t\t\t\"Brand-Flowin\": {\r\n\t\t\t\ten: \"Flowin\",\r\n\t\t\t\tit: \"Flowin\",\r\n\t\t\t\tes: \"Flowin\",\r\n\t\t\t\tfr: \"Flowin\",\r\n\t\t\t},\r\n\t\t\t\"Brand-XeniosUSA\": {\r\n\t\t\t\ten: \"Xenios USA\",\r\n\t\t\t\tit: \"Xenios USA\",\r\n\t\t\t\tes: \"Xenios USA\",\r\n\t\t\t\tfr: \"Xenios USA\",\r\n\t\t\t},\r\n\t\t\t\"Brand-BlastJump\": {\r\n\t\t\t\ten: \"Blast Jump\",\r\n\t\t\t\tit: \"Blast Jump\",\r\n\t\t\t\tes: \"Blast Jump\",\r\n\t\t\t\tfr: \"Blast Jump\",\r\n\t\t\t},\r\n\t\t\t\"Brand-BodyExercisePilates\": {\r\n\t\t\t\ten: \"Body & Exercise Pilates\",\r\n\t\t\t\tit: \"Body & Exercise Pilates\",\r\n\t\t\t\tes: \"Body & Exercise Pilates\",\r\n\t\t\t\tfr: \"Body & Exercise Pilates\",\r\n\t\t\t},\r\n\t\t\tMuscles: {\r\n\t\t\t\ten: \"Muscles\",\r\n\t\t\t\tit: \"Muscoli\",\r\n\t\t\t\tes: \"Músculos\",\r\n\t\t\t\tfr: \"Muscles\",\r\n\t\t\t},\r\n\t\t\tDefaults: {\r\n\t\t\t\ten: \"Defaults\",\r\n\t\t\t\tit: \"Defaults\",\r\n\t\t\t\tes: \"Defaults\",\r\n\t\t\t\tfr: \"Defaults\",\r\n\t\t\t},\r\n\t\t\tFront: {\r\n\t\t\t\ten: \"Front\",\r\n\t\t\t\tit: \"Frontale\",\r\n\t\t\t\tes: \"Frente\",\r\n\t\t\t\tfr: \"Avant\",\r\n\t\t\t},\r\n\t\t\tSide: {\r\n\t\t\t\ten: \"Side\",\r\n\t\t\t\tit: \"Lato\",\r\n\t\t\t\tes: \"Lado\",\r\n\t\t\t\tfr: \"Côté\",\r\n\t\t\t},\r\n\t\t\tThreeQuarters: {\r\n\t\t\t\ten: \"Three Quarters\",\r\n\t\t\t\tit: \"Tre Quarti\",\r\n\t\t\t\tes: \"Tres Cuartos\",\r\n\t\t\t\tfr: \"Trois Quarts\",\r\n\t\t\t},\r\n\t\t\tselected: {\r\n\t\t\t\ten: \"Selected\",\r\n\t\t\t\tit: \"Selezionati\",\r\n\t\t\t\tes: \"Seleccionado\",\r\n\t\t\t\tfr: \"Choisi\",\r\n\t\t\t},\r\n\t\t\tinterval: {\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\tregular: {\r\n\t\t\t\ten: \"Regular\",\r\n\t\t\t\tit: \"Regular\",\r\n\t\t\t\tes: \"Regular\",\r\n\t\t\t\tfr: \"Regular\",\r\n\t\t\t},\r\n\t\t\t\"create-workout\": {\r\n\t\t\t\ten: \"Create Workout\",\r\n\t\t\t\tit: \"Crea Scheda di Allenamento\",\r\n\t\t\t\tes: \"Crear Programa de Entrenamiento\",\r\n\t\t\t\tfr: \"Créer Programme d’Entraînement\",\r\n\t\t\t},\r\n\t\t\t\"create-timer-workout\": {\r\n\t\t\t\ten: \"Create time-based workout. All exercises will be guided by duration.\",\r\n\t\t\t\tit: \"Crea una scheda a tempo. Tutti gli esercizi saranno guidati dalla durata.\",\r\n\t\t\t\tes: \"Crear un programa basado en el tiempo. Todos los ejercicios estarán guiados por la duración.\",\r\n\t\t\t\tfr: \"Créez un programme basé sur le temps. Tous les exercices seront guidés par la durée.\",\r\n\t\t\t},\r\n\t\t\t\"create-standard-workout\": {\r\n\t\t\t\ten: \"This workout can contain both time-based elements and standalone exercises.\",\r\n\t\t\t\tit: \"Questa scheda può contenere sia elementi basati sul tempo che esercizi autonomi.\",\r\n\t\t\t\tes: \"Este programa puede contener tanto elementos basados en el tiempo como ejercicios independientes.\",\r\n\t\t\t\tfr: \"Ce programme peut contenir à la fois des éléments temporels et des exercices autonomes.\",\r\n\t\t\t},\r\n\t\t\t\"all-members\": {\r\n\t\t\t\ten: \"All members\",\r\n\t\t\t\tit: \"Tutti i membri\",\r\n\t\t\t\tes: \"Todos los miembros\",\r\n\t\t\t\tfr: \"Tous les membres\",\r\n\t\t\t},\r\n\t\t\t\"this-file-is-visible-to-all-club-members\": {\r\n\t\t\t\ten: \"This file is visible to all club members\",\r\n\t\t\t\tit: \"Questo file è visibile a tutti i membri del club\",\r\n\t\t\t\tes: \"Este archivo es visible para todos los miembros del club\",\r\n\t\t\t\tfr: \"Ce fichier est visible pour tous les membres du club\",\r\n\t\t\t},\r\n\t\t\t\"if-you-want-to-share-it-with-only-some-members-you-need-to-remove-visibility-to-all-club-members\": {\r\n\t\t\t\ten: \"If you want to share it with only some members, you need to remove visibility to all club members\",\r\n\t\t\t\tit: \"Se vuoi condividerlo solo con alcuni membri, devi rimuovere la visibilità a tutti i membri del club\",\r\n\t\t\t\tes: \"Si deseas compartirlo solo con algunos miembros, debes quitar la visibilidad a todos los miembros del club\",\r\n\t\t\t\tfr: \"Si vous voulez le partager avec certains membres, vous devez supprimer la visibilité pour tous les membres du club\",\r\n\t\t\t},\r\n\t\t\t\"make-the-selected-workout-visible-to-all-members\": {\r\n\t\t\t\ten: \"Make the selected workout visible to all members.\",\r\n\t\t\t\tit: \"Rendi visibile la scheda a tutti i membri del tuo Club.\",\r\n\t\t\t\tes: \"Haga que el programa seleccionado sea visible para todos los miembros.\",\r\n\t\t\t\tfr: \"Rendre le programme sélectionné visible à tous les membres.\",\r\n\t\t\t},\r\n\t\t\t\"continuing-you-will-remove-all-shares-with-members\": {\r\n\t\t\t\ten: \"Continuing, you will remove all shares with members\",\r\n\t\t\t\tit: \"Continuando, rimuoverai tutte le condivisioni con i membri\",\r\n\t\t\t\tes: \"Continuando, eliminarás todas las comparticiones con los miembros\",\r\n\t\t\t\tfr: \"En continuant, vous supprimerez toutes les partages avec les membres\",\r\n\t\t\t},\r\n\t\t\t\"remove-visibility-to-all-members\": {\r\n\t\t\t\ten: \"Remove visibility to all club members.\",\r\n\t\t\t\tit: \"Rimuovi la visibilità a tutti i membri del club.\",\r\n\t\t\t\tes: \"Quitar visibilidad a todos los miembros del club.\",\r\n\t\t\t\tfr: \"Supprimer la visibilité pour tous les membres du club.\",\r\n\t\t\t},\r\n\t\t\t\"the-date-range-entered-cannot-include-the-week-you-are-copying\": {\r\n\t\t\t\ten: \"The date range entered cannot include the week you are copying.\",\r\n\t\t\t\tit: \"L'intervallo di date inserito non può includere la settimana che stai copiando.\",\r\n\t\t\t\tes: \"El rango de fechas ingresado no puede incluir la semana que está copiando\",\r\n\t\t\t\tfr: \"La plage de dates saisie ne peut pas inclure la semaine que vous copiez.\",\r\n\t\t\t},\r\n\t\t\t\"copy-week\": {\r\n\t\t\t\ten: \"Copy Week\",\r\n\t\t\t\tit: \"Copia Settimana\",\r\n\t\t\t\tes: \"Copiar Semana\",\r\n\t\t\t\tfr: \"Copier la Semaine\",\r\n\t\t\t},\r\n\t\t\t\"apply-this-schedule-to-the-interval\": {\r\n\t\t\t\ten: \"Apply this schedule to the interval:\",\r\n\t\t\t\tit: \"Applica questa programmazione all'intervallo:\",\r\n\t\t\t\tes: \"Aplicar este horario al intervalo:\",\r\n\t\t\t\tfr: \"Appliquer cette planification à l'intervalle:\",\r\n\t\t\t},\r\n\t\t\t\"you-are-unsharing-the-file-from\": {\r\n\t\t\t\ten: \"You are unsharing the file from\",\r\n\t\t\t\tit: \"Stai togliendo la condivisione del file a\",\r\n\t\t\t\tes: \"Estás dejando de compartir el archivo un\",\r\n\t\t\t\tfr: \"Vous annulez le partage du fichier a\",\r\n\t\t\t},\r\n\t\t\t\"you-are-deleting-the-file-from\": {\r\n\t\t\t\ten: \"You are deleting the file from\",\r\n\t\t\t\tit: \"Stai eliminando il file da\",\r\n\t\t\t\tes: \"Estás eliminando el archivo de\",\r\n\t\t\t\tfr: \"Vous supprimez le fichier de\",\r\n\t\t\t},\r\n\t\t\t\"you-are-editing-a-workout-shared-with-x-athletes\": {\r\n\t\t\t\ten: \"You are editing a workout shared with {0} athletes.\",\r\n\t\t\t\tit: \"Stai modificado una scheda condivisa con {0} atleti.\",\r\n\t\t\t\tes: \"Estás editando un entrenamiento compartido con {0} atletas.\",\r\n\t\t\t\tfr: \"Vous modifiez un entraînement partagé avec {0} athlètes.\",\r\n\t\t\t},\r\n\t\t\t\"you-are-cloning-this-workout-and-assigning-it-to-selected-athletes\": {\r\n\t\t\t\ten: \"You are cloning this workout and assigning it to selected athletes\",\r\n\t\t\t\tit: \"Stai clonando questo allenamento e assegnandolo agli atleti selezionati\",\r\n\t\t\t\tes: \"Está clonando este entrenamiento y asignándolo a atletas seleccionados\",\r\n\t\t\t\tfr: \"Vous êtes en train de cloner cet entraînement et de l'attribuer à certains athlètes\",\r\n\t\t\t},\r\n\t\t\t\"you-are-cloning-this-workout-so-that-it-becomes-shareable-you-will-find-it-in-the-club-tab\": {\r\n\t\t\t\ten: \"You are cloning this workout so that it becomes shareable. You will find it in the Club tab.\",\r\n\t\t\t\tit: \"Stai clonando questo workout in modo che diventi condivisibile. Lo ritrovareai nella Scheda Club.\",\r\n\t\t\t\tes: \"Estás clonando este entrenamiento para que se pueda compartir. Lo encontrarás en la pestaña Club.\",\r\n\t\t\t\tfr: \"Vous clonez cet entraînement afin qu'il devienne partageable. Vous le trouverez dans l'onglet Club.\",\r\n\t\t\t},\r\n\t\t\t\"selected-athletes\": {\r\n\t\t\t\ten: \"Selected athletes\",\r\n\t\t\t\tit: \"Atleti selezionati\",\r\n\t\t\t\tes: \"Atletas seleccionados\",\r\n\t\t\t\tfr: \"Athlètes sélectionnés\",\r\n\t\t\t},\r\n\t\t\t\"selected-members\": {\r\n\t\t\t\ten: \"Selected members\",\r\n\t\t\t\tit: \"Membri selezionati\",\r\n\t\t\t\tes: \"Miembros seleccionados\",\r\n\t\t\t\tfr: \"Membres sélectionnés\",\r\n\t\t\t},\r\n\t\t\t\"add-participant\": {\r\n\t\t\t\ten: \"Add Participant\",\r\n\t\t\t\tit: \"Aggiungi Partecipante\",\r\n\t\t\t\tes: \"Añada Participante\",\r\n\t\t\t\tfr: \"Ajouter Participant\",\r\n\t\t\t},\r\n\t\t\tWaiting: {\r\n\t\t\t\ten: \"Waiting\",\r\n\t\t\t\tit: \"In Attesa\",\r\n\t\t\t\tes: \"Esperando\",\r\n\t\t\t\tfr: \"En Attente\",\r\n\t\t\t},\r\n\t\t\tProcessing: {\r\n\t\t\t\ten: \"Processing\",\r\n\t\t\t\tit: \"Elaborazione\",\r\n\t\t\t\tes: \"Procesando\",\r\n\t\t\t\tfr: \"En Cours\",\r\n\t\t\t},\r\n\t\t\tSuccess: {\r\n\t\t\t\ten: \"Success\",\r\n\t\t\t\tit: \"Ok\",\r\n\t\t\t\tes: \"Éxito\",\r\n\t\t\t\tfr: \"Succès\",\r\n\t\t\t},\r\n\t\t\tFailed: {\r\n\t\t\t\ten: \"Failed\",\r\n\t\t\t\tit: \"Fallito\",\r\n\t\t\t\tes: \"Fallido\",\r\n\t\t\t\tfr: \"Échec\",\r\n\t\t\t},\r\n\t\t\t\"show-athlete-menu\": {\r\n\t\t\t\ten: \"Show athlete menù\",\r\n\t\t\t\tit: \"Mostra menù atleta\",\r\n\t\t\t\tes: \"Mostrar menú de atleta\",\r\n\t\t\t\tfr: \"Afficher menu des athlètes\",\r\n\t\t\t},\r\n\t\t\t\"you-have-selected-activities-that-are-not-published\": {\r\n\t\t\t\ten: \"You have selected activities that are not Published\",\r\n\t\t\t\tit: \"Hai selezionato attività non pubblicate\",\r\n\t\t\t\tes: \"Has seleccionado actividades que no están publicadas\",\r\n\t\t\t\tfr: \"Vous avez sélectionné des activités qui ne sont pas publiées\",\r\n\t\t\t},\r\n\t\t\t\"select-athlete\": {\r\n\t\t\t\ten: \"Select Athlete\",\r\n\t\t\t\tit: \"Seleziona Atleta\",\r\n\t\t\t\tes: \"Seleccionar Atleta\",\r\n\t\t\t\tfr: \"Sélectionnez Un Athlète\",\r\n\t\t\t},\r\n\t\t\t\"inconsistent-lessons\": {\r\n\t\t\t\ten: \"Inconsistent lessons\",\r\n\t\t\t\tit: \"Lezioni non omogenee\",\r\n\t\t\t\tes: \"Lecciones no homogéneas\",\r\n\t\t\t\tfr: \"Leçons non homogènes\",\r\n\t\t\t},\r\n\t\t\tsource: {\r\n\t\t\t\ten: \"Source\",\r\n\t\t\t\tit: \"Origine\",\r\n\t\t\t\tes: \"Fuente\",\r\n\t\t\t\tfr: \"Source\",\r\n\t\t\t},\r\n\t\t\tuptivo: {\r\n\t\t\t\ten: \"Uptivo\",\r\n\t\t\t\tit: \"Uptivo\",\r\n\t\t\t\tes: \"Uptivo\",\r\n\t\t\t\tfr: \"Uptivo\",\r\n\t\t\t},\r\n\t\t\t\"you-are-publish-this-exercise\": {\r\n\t\t\t\ten: \"You are publishing this exercise\",\r\n\t\t\t\tit: \"Stai pubblicando questo esercizio\",\r\n\t\t\t\tes: \"Estás publicando este ejercicio\",\r\n\t\t\t\tfr: \"Vous publiez cet exercice\",\r\n\t\t\t},\r\n\t\t\t\"you-are-unpublish-this-exercise\": {\r\n\t\t\t\ten: \"You are unpublishing this exercise\",\r\n\t\t\t\tit: \"Stai togliendo dalla pubblicazione questo esercizio\",\r\n\t\t\t\tes: \"Estás retirando la publicación de este ejercicio\",\r\n\t\t\t\tfr: \"Vous retirez la publication de cet exercice\",\r\n\t\t\t},\r\n\t\t\t\"you-are-publish-this-workoutsheet\": {\r\n\t\t\t\ten: \"You are publishing this workout\",\r\n\t\t\t\tit: \"Stai pubblicando questa scheda\",\r\n\t\t\t\tes: \"Estás publicando este workout\",\r\n\t\t\t\tfr: \"Vous publiez cet workout\",\r\n\t\t\t},\r\n\t\t\t\"you-are-unpublish-this-workoutsheet\": {\r\n\t\t\t\ten: \"You are unpublishing this workout\",\r\n\t\t\t\tit: \"Stai togliendo dalla pubblicazione questa scheda\",\r\n\t\t\t\tes: \"Estás retirando la publicación de este workout\",\r\n\t\t\t\tfr: \"Vous retirez la publication de cet workout\",\r\n\t\t\t},\r\n\t\t\t\"uptivo-editor-sheets\": {\r\n\t\t\t\ten: \"Uptivo Workouts (EDITOR)\",\r\n\t\t\t\tit: \"Uptivo Workouts (EDITOR)\",\r\n\t\t\t\tes: \"Uptivo Workouts (EDITOR)\",\r\n\t\t\t\tfr: \"Uptivo Workouts (EDITOR)\",\r\n\t\t\t},\r\n\t\t\t\"uptivo-workouts\": {\r\n\t\t\t\ten: \"Uptivo Workouts\",\r\n\t\t\t\tit: \"Uptivo Workouts\",\r\n\t\t\t\tes: \"Uptivo Workouts\",\r\n\t\t\t\tfr: \"Uptivo Workouts\",\r\n\t\t\t},\r\n\t\t\t\"make-visible-to-all\": {\r\n\t\t\t\ten: \"Make visible to all\",\r\n\t\t\t\tit: \"Rendi visibile a tutti\",\r\n\t\t\t\tes: \"Hacer visible para todos\",\r\n\t\t\t\tfr: \"Rendre visible pour tous\",\r\n\t\t\t},\r\n\t\t\t\"hide-from-everyone\": {\r\n\t\t\t\ten: \"Hide from everyone\",\r\n\t\t\t\tit: \"Nascondi a tutti\",\r\n\t\t\t\tes: \"Ocultar de todos\",\r\n\t\t\t\tfr: \"Masquer à tout le monde\",\r\n\t\t\t},\r\n\t\t\t\"move-up\": {\r\n\t\t\t\ten: \"Move Up\",\r\n\t\t\t\tit: \"Sposta in alto\",\r\n\t\t\t\tes: \"Mover hacia arriba\",\r\n\t\t\t\tfr: \"Déplacer vers le haut\",\r\n\t\t\t},\r\n\t\t\t\"move-down\": {\r\n\t\t\t\ten: \"Move Down\",\r\n\t\t\t\tit: \"Sposta in basso\",\r\n\t\t\t\tes: \"Mover hacia abajo\",\r\n\t\t\t\tfr: \"Déplacer vers le bas\",\r\n\t\t\t},\r\n\t\t\t\"move-left\": {\r\n\t\t\t\ten: \"Move Left\",\r\n\t\t\t\tit: \"Sposta a Sinistra\",\r\n\t\t\t\tes: \"Mover a la Izquierda\",\r\n\t\t\t\tfr: \"Déplacer à Gauche\"\r\n\t\t\t},\r\n\t\t\t\"move-right\": {\r\n\t\t\t\ten: \"Move Right\",\r\n\t\t\t\tit: \"Sposta a Destra\",\r\n\t\t\t\tes: \"Mover a la Derecha\",\r\n\t\t\t\tfr: \"Déplacer à Droite\"\r\n\t\t\t},\r\n\t\t\t\"rotate-right\": {\r\n\t\t\t\ten: \"Rotate Right\",\r\n\t\t\t\tit: \"Ruota a Destra\",\r\n\t\t\t\tes: \"Rotar a la Derecha\",\r\n\t\t\t\tfr: \"Tourner à Droite\"\r\n\t\t\t},\r\n\t\t\t\"rotate-left\": {\r\n\t\t\t\ten: \"Rotate Left\",\r\n\t\t\t\tit: \"Ruota a Sinistra\",\r\n\t\t\t\tes: \"Rotar a la Izquierda\",\r\n\t\t\t\tfr: \"Tourner à Gauche\"\r\n\t\t\t},\r\n\t\t\t\"clone\": {\r\n\t\t\t\ten: \"Clone\",\r\n\t\t\t\tit: \"Clona\",\r\n\t\t\t\tes: \"Clonar\",\r\n\t\t\t\tfr: \"Cloner\",\r\n\t\t\t},\r\n\t\t\t\"image\": {\r\n\t\t\t\ten: \"Picture\",\r\n\t\t\t\tit: \"Immagine\",\r\n\t\t\t\tes: \"Imagen\",\r\n\t\t\t\tfr: \"Image\",\r\n\t\t\t},\r\n\t\t\t\"new\": {\r\n\t\t\t\ten: \"New\",\r\n\t\t\t\tit: \"Nuovi\",\r\n\t\t\t\tes: \"Nuevos\",\r\n\t\t\t\tfr: \"Nouveaux\",\r\n\t\t\t},\r\n\t\t\t\"choose-workout\": {\r\n\t\t\t\ten: \"Choose Workout\",\r\n\t\t\t\tit: \"Scegli Allenamento\",\r\n\t\t\t\tes: \"Seleccionar Entrenamiento\",\r\n\t\t\t\tfr: \"Choisir Entraînement\",\r\n\t\t\t},\r\n\t\t\t\"you-are-cloning-this-workout-and-assigning-it-to-selected-athlete\": {\r\n\t\t\t\ten: \"You are cloning this workout and assigning it to the selected athlete\",\r\n\t\t\t\tit: \"Stai clonando questo allenamento e assegnandolo all'atleta selezionato\",\r\n\t\t\t\tes: \"Estás clonando este entrenamiento y asignándolo al atleta seleccionado\",\r\n\t\t\t\tfr: \"Vous clonez cet entraînement et l'assignez à l'athlète sélectionné\",\r\n\t\t\t},\r\n\t\t\t\"clone-workout\": {\r\n\t\t\t\ten: \"Select existing workouts and assign them to this user as personal workouts.\",\r\n\t\t\t\tit: \"Seleziona una scheda esistente e assegnala a questo utente come scheda personale.\",\r\n\t\t\t\tes: \"Seleccione un programa existente y asígnelo a este usuario como programa personal.\",\r\n\t\t\t\tfr: \"Sélectionnez un programme existant et attribuez-le à cet utilisateur en tant que programme personnel.\",\r\n\t\t\t},\r\n\t\t\t\"share-workout\": {\r\n\t\t\t\ten: \"Select existing workouts and share them with this user.\",\r\n\t\t\t\tit: \"Seleziona le schede esistenti e condividile con questo utente.\",\r\n\t\t\t\tes: \"Selecciona programas existentes y compártalos con este usuario.\",\r\n\t\t\t\tfr: \"Sélectionnez les programmes existants et partagez-les avec cet utilisateur.\",\r\n\t\t\t},\r\n\t\t\t\"create-new-workout\": {\r\n\t\t\t\ten: \"Create new workout.\",\r\n\t\t\t\tit: \"Crea nuovo allenamento.\",\r\n\t\t\t\tes: \"Crear nuevo entrenamiento.\",\r\n\t\t\t\tfr: \"Créer un nouvel entraînement.\",\r\n\t\t\t},\r\n\t\t\t\"invalid-id\": {\r\n\t\t\t\ten: \"Invalid Id\",\r\n\t\t\t\tit: \"Id non valido\",\r\n\t\t\t\tes: \"Id no válido\",\r\n\t\t\t\tfr: \"Id invalide\",\r\n\t\t\t},\r\n\t\t\t\"add-image\": {\r\n\t\t\t\ten: \"Add Image\",\r\n\r\n\t\t\t\tit: \"Aggiungi Immagine\",\r\n\t\t\t\tes: \"Agregar Imagen\",\r\n\t\t\t\tfr: \"Ajouter une Image\",\r\n\t\t\t},\r\n\t\t\t\"cash\": {\r\n\t\t\t\ten: \"Cash\",\r\n\t\t\t\tit: \"Contante\",\r\n\t\t\t\tes: \"Efectivo\",\r\n\t\t\t\tfr: \"Argent liquide\"\r\n\t\t\t},\r\n\t\t\t\"debit\": {\r\n\t\t\t\ten: \"Debit Card\",\r\n\t\t\t\tit: \"Carta di Debito\",\r\n\t\t\t\tes: \"Tarjeta de Débito\",\r\n\t\t\t\tfr: \"Carte de Débit\"\r\n\t\t\t},\r\n\t\t\t\"credit\": {\r\n\t\t\t\ten: \"Credit Card\",\r\n\t\t\t\tit: \"Carta di Credito\",\r\n\t\t\t\tes: \"Tarjeta de Crédito\",\r\n\t\t\t\tfr: \"Carte de Crédit\"\r\n\t\t\t},\r\n\t\t\t\"wire-transfer\": {\r\n\t\t\t\ten: \"Wire Transfer\",\r\n\t\t\t\tit: \"Bonifico Bancario\",\r\n\t\t\t\tes: \"Transferencia Bancaria\",\r\n\t\t\t\tfr: \"Virement Bancaire\"\r\n\t\t\t},\r\n\t\t\t\"other\": {\r\n\t\t\t\ten: \"Other\",\r\n\t\t\t\tit: \"Altro\",\r\n\t\t\t\tes: \"Otro\",\r\n\t\t\t\tfr: \"Autre\"\r\n\t\t\t},\r\n\t\t\t\"refund\": {\r\n\t\t\t\ten: \"Refund\",\r\n\t\t\t\tit: \"Rimborso\",\r\n\t\t\t\tes: \"Reembolso\",\r\n\t\t\t\tfr: \"Remboursement\"\r\n\t\t\t},\r\n\t\t\t\"total-movements\": {\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\"tax-id\": {\r\n\t\t\t\ten: \"Tax Id\",\r\n\t\t\t\tit: \"C.F./P.I.\",\r\n\t\t\t\tes: \"Tax Id\",\r\n\t\t\t\tfr: \"Tax Id\",\r\n\t\t\t},\r\n\t\t\t\"translated-exercises\": {\r\n\t\t\t\ten: \"Translated Exercises\",\r\n\t\t\t\tit: \"Esercizi tradotti\",\r\n\t\t\t\tes: \"Ejercicios traducidos\",\r\n\t\t\t\tfr: \"Exercices traduits\"\r\n\t\t\t},\r\n\t\t\t\"untranslated-exercises\": {\r\n\t\t\t\ten: \"Untranslated Exercises\",\r\n\t\t\t\tit: \"Esercizi non tradotti\",\r\n\t\t\t\tes: \"Ejercicios no traducidos\",\r\n\t\t\t\tfr: \"Exercices non traduits\"\r\n\t\t\t},\r\n\t\t\t\"choose-language\": {\r\n\t\t\t\ten: \"Choose Language\",\r\n\t\t\t\tit: \"Scegli Lingua\",\r\n\t\t\t\tes: \"Seleccionar Idioma\",\r\n\t\t\t\tfr: \"Choisir la Langue\"\r\n\t\t\t},\r\n\t\t\t\"movements\": {\r\n\t\t\t\ten: \"Transactions\",\r\n\t\t\t\tit: \"Movimenti\",\r\n\t\t\t\tes: \"Transacciones\",\r\n\t\t\t\tfr: \"Transactions\"\r\n\t\t\t},\r\n\t\t\t\"method\": {\r\n\t\t\t\ten: \"Method\",\r\n\t\t\t\tit: \"Metodo\",\r\n\t\t\t\tes: \"Método\",\r\n\t\t\t\tfr: \"Moyen\"\r\n\t\t\t},\r\n\t\t\t\"transaction-type\": {\r\n\t\t\t\ten: \"Transaction Type\",\r\n\t\t\t\tit: \"Tipo di Transazione\",\r\n\t\t\t\tes: \"Tipo de Transacción\",\r\n\t\t\t\tfr: \"Type de Transaction\"\r\n\t\t\t},\r\n\t\t\t\"payment-mode\": {\r\n\t\t\t\ten: \"Payment Mode\",\r\n\t\t\t\tit: \"Modalità di Pagamento\",\r\n\t\t\t\tes: \"Modo de Pago\",\r\n\t\t\t\tfr: \"Mode de Paiement\"\r\n\t\t\t},\r\n\t\t\t\"movement-not-found\": {\r\n\t\t\t\ten: \"Movement Not Found\",\r\n\t\t\t\tit: \"Movimento Non Trovato\",\r\n\t\t\t\tes: \"Movimiento no Encontrado\",\r\n\t\t\t\tfr: \"Mouvement Non Trouvé\"\r\n\t\t\t},\r\n\t\t\t\"add-transaction\": {\r\n\t\t\t\ten: \"Add Transaction\",\r\n\t\t\t\tit: \"Aggiungi Pagamento\",\r\n\t\t\t\tes: \"Agregar Transacción\",\r\n\t\t\t\tfr: \"Ajouter une Transaction\"\r\n\t\t\t},\r\n\t\t\t\"currency\": {\r\n\t\t\t\ten: \"Currency\",\r\n\t\t\t\tit: \"Valuta\",\r\n\t\t\t\tes: \"Moneda\",\r\n\t\t\t\tfr: \"Devise\"\r\n\t\t\t},\r\n\t\t\t\"movement\": {\r\n\t\t\t\ten: \"Movement\",\r\n\t\t\t\tit: \"Movimento\",\r\n\t\t\t\tes: \"Movimiento\",\r\n\t\t\t\tfr: \"Mouvement\"\r\n\t\t\t},\r\n\t\t\t\"movement-not-in-export\": {\r\n\t\t\t\ten: \"This movement will not appear in the export\",\r\n\t\t\t\tit: \"Questo movimento non comparirà nell'esportazione\",\r\n\t\t\t\tes: \"Este movimiento no aparecerá en la exportación\",\r\n\t\t\t\tfr: \"Ce mouvement n'apparaîtra pas dans l'export\"\r\n\t\t\t},\r\n\t\t\t\"movement-in-export\": {\r\n\t\t\t\ten: \"This movement will appear in the export\",\r\n\t\t\t\tit: \"Questo movimento comparirà nell'esportazione\",\r\n\t\t\t\tes: \"Este movimiento aparecerá en la exportación\",\r\n\t\t\t\tfr: \"Ce mouvement apparaîtra dans l'export\"\r\n\t\t\t},\r\n\t\t\t\"visible-in-export\": {\r\n\t\t\t\ten: \"Visible in the export\",\r\n\t\t\t\tit: \"Visibile nell'esportazione\",\r\n\t\t\t\tes: \"Visible en la exportación\",\r\n\t\t\t\tfr: \"Visible dans l'export\"\r\n\t\t\t},\r\n\t\t\t\"purchase\": {\r\n\t\t\t\ten: \"Purchase\",\r\n\t\t\t\tit: \"Acquisto\",\r\n\t\t\t\tes: \"Compra\",\r\n\t\t\t\tfr: \"Achat\"\r\n\t\t\t},\r\n\t\t\t\"check-movement-data\": {\r\n\t\t\t\ten: \"Check the movement data\",\r\n\t\t\t\tit: \"Verifica i dati del movimento\",\r\n\t\t\t\tes: \"Verifica los datos del movimiento\",\r\n\t\t\t\tfr: \"Vérifiez les données du mouvement\"\r\n\t\t\t},\r\n\t\t\t\"credits-modified-successfully\": {\r\n\t\t\t\ten: \"Credits modified successfully\",\r\n\t\t\t\tit: \"Crediti modificati correttamente\",\r\n\t\t\t\tes: \"Créditos modificados correctamente\",\r\n\t\t\t\tfr: \"Crédits modifiés avec succès\"\r\n\t\t\t},\r\n\t\t\t\"missing-language\": {\r\n\t\t\t\ten: \"Missing Language\",\r\n\t\t\t\tit: \"Lingua Mancante\",\r\n\t\t\t\tes: \"Idioma Faltante\",\r\n\t\t\t\tfr: \"Langue Manquante\"\r\n\t\t\t},\r\n\t\t\t\"add-circuit\": {\r\n\t\t\t\ten: \"Circuit\",\r\n\t\t\t\tit: \"Circuit\",\r\n\t\t\t\tes: \"Circuit\",\r\n\t\t\t\tfr: \"Circuit\"\r\n\t\t\t},\r\n\t\t\t\"laps\": {\r\n\t\t\t\ten: \"Rounds\",\r\n\t\t\t\tit: \"Round\",\r\n\t\t\t\tes: \"Rondas\",\r\n\t\t\t\tfr: \"Manches\"\r\n\t\t\t},\r\n\t\t\t\"create-for\": {\r\n\t\t\t\ten: \"Create for\",\r\n\t\t\t\tit: \"Crea per\",\r\n\t\t\t\tes: \"Crear para\",\r\n\t\t\t\tfr: \"Créer pour\"\r\n\t\t\t},\r\n\t\t\t\"payment-method\": {\r\n\t\t\t\ten: \"Payment Method\",\r\n\t\t\t\tit: \"Metodo di Pagamento\",\r\n\t\t\t\tes: \"Método de Pago\",\r\n\t\t\t\tfr: \"Moyen de Paiement\"\r\n\t\t\t},\r\n\t\t\t\"payment\": {\r\n\t\t\t\ten: \"Payment\",\r\n\t\t\t\tit: \"Pagamento\",\r\n\t\t\t\tes: \"Pago\",\r\n\t\t\t\tfr: \"Paiement\"\r\n\t\t\t},\r\n\t\t\t\"manual\": {\r\n\t\t\t\ten: \"Manual\",\r\n\t\t\t\tit: \"Manuale\",\r\n\t\t\t\tes: \"Manual\",\r\n\t\t\t\tfr: \"Manuel\"\r\n\t\t\t},\r\n\t\t\t\"online\": {\r\n\t\t\t\ten: \"Online\",\r\n\t\t\t\tit: \"Online\",\r\n\t\t\t\tes: \"En Línea\",\r\n\t\t\t\tfr: \"En Ligne\"\r\n\t\t\t},\r\n\t\t\t\"operator\": {\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\"operator-email\": {\r\n\t\t\t\ten: \"Operator Email\",\r\n\t\t\t\tit: \"Email Operatore\",\r\n\t\t\t\tes: \"Operador Email\",\r\n\t\t\t\tfr: \"Opérateur Email\"\r\n\t\t\t},\r\n\t\t\t\"linked-payment\": {\r\n\t\t\t\ten: \"Linked Payment\",\r\n\t\t\t\tit: \"Pagamento Collegato\",\r\n\t\t\t\tes: \"Pago Vinculado\",\r\n\t\t\t\tfr: \"Paiement Lié\"\r\n\t\t\t},\r\n\t\t\t\"user-bookings-enabled\": {\r\n\t\t\t\ten: \"User has bookings enabled\",\r\n\t\t\t\tit: \"L'utente ha le prenotazioni abilitate\",\r\n\t\t\t\tes: \"El usuario tiene reservas habilitadas\",\r\n\t\t\t\tfr: \"L'utilisateur a des réservations activées\"\r\n\t\t\t},\r\n\t\t\t\"user-bookings-disabled\": {\r\n\t\t\t\ten: \"User Bookings Disabled\",\r\n\t\t\t\tit: \"Prenotazioni disabilitate per l'utente\",\r\n\t\t\t\tes: \"Reservas deshabilitadas para el usuario\",\r\n\t\t\t\tfr: \"Réservations désactivées pour l'utilisateur\"\r\n\t\t\t},\r\n\t\t\t\"bookings-block-until\": {\r\n\t\t\t\ten: \"Ban bookings until\",\r\n\t\t\t\tit: \"Blocco prenotazioni fino al\",\r\n\t\t\t\tes: \"Bloqueo reservas hasta\",\r\n\t\t\t\tfr: \"Blocage réservations jusqu'au\"\r\n\t\t\t},\r\n\t\t\t\"bookings-block\": {\r\n\t\t\t\ten: \"Bookings Ban\",\r\n\t\t\t\tit: \"Blocco Prenotazioni\",\r\n\t\t\t\tes: \"Bloqueo de Reservas\",\r\n\t\t\t\tfr: \"Blocage des Réservations\"\r\n\t\t\t},\r\n\t\t\t\"delete-booking-limit\": {\r\n\t\t\t\ten: \"Delete Booking Limit\",\r\n\t\t\t\tit: \"Elimina limite di prenotazione\",\r\n\t\t\t\tes: \"Eliminar límite de reserva\",\r\n\t\t\t\tfr: \"Supprimer la limite de réservation\"\r\n\t\t\t},\r\n\t\t\t\"user-will-have-active-bookings\": {\r\n\t\t\t\ten: \"User will have active bookings\",\r\n\t\t\t\tit: \"L'utente avrà le prenotazioni attive\",\r\n\t\t\t\tes: \"El usuario tendrá reservas activas\",\r\n\t\t\t\tfr: \"L'utilisateur aura des réservations actives\"\r\n\t\t\t},\r\n\t\t\t\"rest-at-least-five-seconds\": {\r\n\t\t\t\ten: \"The rest must be at least 5 seconds\",\r\n\t\t\t\tit: \"La pausa deve essere di almeno 5 secondi\",\r\n\t\t\t\tes: \"El descanso debe ser de al menos 5 segundos\",\r\n\t\t\t\tfr: \"La pause doit être d'au moins 5 secondes\"\r\n\t\t\t},\r\n\t\t\t\"cannot-add-same-exercises-to-set\": {\r\n\t\t\t\ten: \"It is not possible to add exercises that are the same as those already present in the set\",\r\n\t\t\t\tit: \"Non è possibile aggiungere esercizi uguali a quelli già presenti nel set\",\r\n\t\t\t\tes: \"No es posible agregar ejercicios que sean iguales a los que ya están presentes en el conjunto\",\r\n\t\t\t\tfr: \"Il n'est pas possible d'ajouter des exercices identiques à ceux déjà présents dans l'ensemble\"\r\n\t\t\t},\r\n\t\t\t\"max-exercises-number-is-9\": {\r\n\t\t\t\ten: \"The maximum number of exercises allowed is 9\",\r\n\t\t\t\tit: \"Il numero massimo di esercizi consentiti è 9\",\r\n\t\t\t\tes: \"El número máximo de ejercicios permitidos es 9\",\r\n\t\t\t\tfr: \"Le nombre maximum d'exercices autorisés est de 9\"\r\n\t\t\t},\r\n\t\t\t\"no-zone\": {\r\n\t\t\t\ten: \"No Zone\",\r\n\t\t\t\tit: \"Nessuna Zona\",\r\n\t\t\t\tes: \"Sin Zona\",\r\n\t\t\t\tfr: \"Pas de Zone\"\r\n\t\t\t},\r\n\t\t\t\"groups\": {\r\n\t\t\t\ten: \"Groups\",\r\n\t\t\t\tit: \"Gruppi\",\r\n\t\t\t\tes: \"Grupos\",\r\n\t\t\t\tfr: \"Groupes\"\r\n\t\t\t},\r\n\t\t\t\"circuit\": {\r\n\t\t\t\ten: \"On-screen Workout\",\r\n\t\t\t\tit: \"Allenamento A Schermo\",\r\n\t\t\t\tes: \"Entrenamiento De Pantalla\",\r\n\t\t\t\tfr: \"Entraînement Sur Ècran\"\r\n\t\t\t},\r\n\t\t\t\"circuits\": {\r\n\t\t\t\ten: \"On-screen Workouts\",\r\n\t\t\t\tit: \"Allenamenti A Schermo\",\r\n\t\t\t\tes: \"Entrenamientos De Pantalla\",\r\n\t\t\t\tfr: \"Entraînements Sur Ècran\"\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\"element\": {\r\n\t\t\t\ten: \"element\",\r\n\t\t\t\tit: \"elemento\",\r\n\t\t\t\tes: \"elemento\",\r\n\t\t\t\tfr: \"èlément\"\r\n\t\t\t},\r\n\t\t\t\"you-are-about-to-clone\": {\r\n\t\t\t\ten: \"You are about to clone\",\r\n\t\t\t\tit: \"Stai per clonare\",\r\n\t\t\t\tes: \"Estás a punto de clonar\",\r\n\t\t\t\tfr: \"Vous êtes sur le point de cloner\"\r\n\t\t\t},\r\n\t\t\t\"classes-participations\": {\r\n\t\t\t\ten: \"Classes Participations\",\r\n\t\t\t\tit: \"Partecipazioni alle Classi\",\r\n\t\t\t\tes: \"Participaciones en Clases\",\r\n\t\t\t\tfr: \"Participations aux Cours\"\r\n\t\t\t},\r\n\t\t\t\"past\": {\r\n\t\t\t\ten: \"Past\",\r\n\t\t\t\tit: \"Passate\",\r\n\t\t\t\tes: \"Pasadas\",\r\n\t\t\t\tfr: \"Passées\"\r\n\t\t\t},\r\n\t\t\t\"next\": {\r\n\t\t\t\ten: \"Next\",\r\n\t\t\t\tit: \"Prossime\",\r\n\t\t\t\tes: \"Próximas\",\r\n\t\t\t\tfr: \"Prochaines\"\r\n\t\t\t},\r\n\t\t\t\"disable-bookings-invalid-medical-certificate\": {\r\n\t\t\t\ten: \"Disable bookings if user does not have a valid medical certificate\",\r\n\t\t\t\tit: \"Disabilita prenotazioni se l'utente non ha un certificato medico valido\",\r\n\t\t\t\tes: \"Deshabilitar reservas si el usuario no tiene un certificado médico válido\",\r\n\t\t\t\tfr: \"Désactiver les réservations si l'utilisateur n'a pas de certificat médical valide\"\r\n\t\t\t},\r\n\t\t\t\"disable-bookings-invalid-mebership\": {\r\n\t\t\t\ten: \"Disable bookings if user does not have a valid membership\",\r\n\t\t\t\tit: \"Disabilita prenotazioni se l'utente non ha una iscrizione valida\",\r\n\t\t\t\tes: \"Deshabilitar reservas si el usuario no tiene una matrícula válida\",\r\n\t\t\t\tfr: \"Désactiver les réservations si l'utilisateur n'a pas une inscription valide\"\r\n\t\t\t}\r\n\t\t},\r\n\t\tHomeView: {\r\n\t\t\t\"uptivo-cloud-description\": {\r\n\t\t\t\ten: \"Combining a heart-rate monitoring solution with sport tracking and gamification features, Uptivo provides vertical solutions for functional training, combat fitness, indoor biking, and watersports in gyms, fitness boutiques, and PT studios.\",\r\n\t\t\t\tit: \"Combinando una soluzione di monitoraggio della frequenza cardiaca con funzionalità di tracciamento sportivo e gamification, Uptivo offre soluzioni verticali per l'allenamento funzionale, il combat fitness, il ciclismo indoor e gli sport acquatici in palestre, fitness boutique e studi PT.\",\r\n\t\t\t\tes: \"Al combinar una solución de monitoreo de frecuencia cardíaca con funciones de seguimiento deportivo y ludificación, Uptivo proporciona soluciones verticales para entrenamiento funcional, fitness de combate, ciclismo de interior y deportes acuáticos en gimnasios, boutiques de fitness y estudios de PT.\",\r\n\t\t\t\tfr: \"Combinant une solution de surveillance de la fréquence cardiaque avec des fonctionnalités de suivi sportif et de gamification, Uptivo fournit des solutions verticales pour l'entraînement fonctionnel, le fitness de combat, le vélo en salle et les sports nautiques dans les gymnases, les boutiques de fitness et les studios de PT.\",\r\n\t\t\t},\r\n\t\t\t\"app-description\": {\r\n\t\t\t\ten: \"Haven't you installed the Uptivo app yet to review all your progress and train when you're not at the gym? Download it here:\",\r\n\t\t\t\tit: \"Non hai ancora installato l'app Uptivo per rivedere tutti i tuoi progressi e allenarti quando non sei in palestra? Scaricala qui:\",\r\n\t\t\t\tes: \"¿Aún no has instalado la app de Uptivo para revisar todos tus progresos y entrenar cuando no estés en el gimnasio? Descarguelo aqui:\",\r\n\t\t\t\tfr: \"Vous n'avez pas encore installé l'application Uptivo pour revoir tous vos progrès et vous entraîner lorsque vous n'êtes pas à la salle de sport ? Télécharger les ici:\",\r\n\t\t\t},\r\n\t\t\tsignIn: {\r\n\t\t\t\ten: \"Already a member? Sign in\",\r\n\t\t\t\tit: \"Sei già un membro? Accedi\",\r\n\t\t\t\tes: \"¿Ya eres miembro? Iniciar sesión\",\r\n\t\t\t\tfr: \"Déjà membre? Connectez-vous\",\r\n\t\t\t},\r\n\t\t\tsignUp: {\r\n\t\t\t\ten: \"New member? Create an account\",\r\n\t\t\t\tit: \"Nuovo membro? Crea un account\",\r\n\t\t\t\tes: \"¿Nuevo miembro? Crear un perfil\",\r\n\t\t\t\tfr: \"Nouveau membre? Créer un profil\",\r\n\t\t\t},\r\n\t\t},\r\n\t\tClubMessagesView: {\r\n\t\t\t\"new-message\": {\r\n\t\t\t\ten: \"New message from your club!\",\r\n\t\t\t\tit: \"Nuovo messaggio dal tuo club!\",\r\n\t\t\t\tes: \"¡Nuevo mensaje de tu club!\",\r\n\t\t\t\tfr: \"Nouveau message de votre club!\",\r\n\t\t\t},\r\n\t\t\t\"type-message-text-here\": {\r\n\t\t\t\ten: \"Type the message here\",\r\n\t\t\t\tit: \"Scrivi qui il messaggio\",\r\n\t\t\t\tes: \"Escribe el mensaje aquí\",\r\n\t\t\t\tfr: \"Tapez le message ici\",\r\n\t\t\t},\r\n\t\t\t\"edit-message\": {\r\n\t\t\t\ten: \"Edit Template\",\r\n\t\t\t\tit: \"Modifica Modello\",\r\n\t\t\t\tes: \"Editar Plantilla\",\r\n\t\t\t\tfr: \"Modifier le Modèle\",\r\n\t\t\t},\r\n\t\t\tyes: {\r\n\t\t\t\ten: \"Yes\",\r\n\t\t\t\tit: \"Sì\",\r\n\t\t\t\tes: \"Sí\",\r\n\t\t\t\tfr: \"Oui\",\r\n\t\t\t},\r\n\t\t\t\"successfully-add-athlete\": {\r\n\t\t\t\ten: \"Successfully add athlete/s\",\r\n\t\t\t\tit: \"Atleta/i aggiunto/i con successo\",\r\n\t\t\t\tes: \"Añadir con éxito atletas\",\r\n\t\t\t\tfr: \"Ajouter des athlètes avec succès\",\r\n\t\t\t},\r\n\t\t\t\"fast-schedule-challenge-title-calories\": {\r\n\t\t\t\ten: \"Monthly Calories\",\r\n\t\t\t\tit: \"Calorie Mensili\",\r\n\t\t\t\tes: \"Calorías Mensuales\",\r\n\t\t\t\tfr: \"Calories Mensuelles\",\r\n\t\t\t},\r\n\t\t\t\"fast-schedule-challenge-title-trainings\": {\r\n\t\t\t\ten: \"Monthly Trainings\",\r\n\t\t\t\tit: \"Allenamenti Mensili\",\r\n\t\t\t\tes: \"Entrenamientos Mensuales\",\r\n\t\t\t\tfr: \"Entrainement Mensuelles\",\r\n\t\t\t},\r\n\t\t\t\"fast-schedule-challenge-title-points\": {\r\n\t\t\t\ten: \"Monthly UPPs\",\r\n\t\t\t\tit: \"UPPs Mensili\",\r\n\t\t\t\tes: \"UPP Mensuales\",\r\n\t\t\t\tfr: \"UPP Mensuels\",\r\n\t\t\t},\r\n\t\t\t\"fast-schedule-challenge-title-valid-zone-points\": {\r\n\t\t\t\ten: \"Monthly Valid Zones UPPs\",\r\n\t\t\t\tit: \"UPPs In Zone Valide Mensili\",\r\n\t\t\t\tes: \"UPPs Mensuales De Zonas Válidas\",\r\n\t\t\t\tfr: \"UPPs De Zones Valides Mensuels\",\r\n\t\t\t},\r\n\t\t},\r\n\t\tTrainingProgramsView: {\r\n\t\t\t\"share-file\": {\r\n\t\t\t\ten: \"File Shares\",\r\n\t\t\t\tit: \"Condivisione del file\",\r\n\t\t\t\tes: \"Compartir el archivo\",\r\n\t\t\t\tfr: \"Partager le fichier\",\r\n\t\t\t},\r\n\t\t\t\"shared-programs\": {\r\n\t\t\t\ten: \"Shared Programs\",\r\n\t\t\t\tit: \"Programmi Condivisi\",\r\n\t\t\t\tes: \"Programas Compartidos\",\r\n\t\t\t\tfr: \"Programmes Partagés\",\r\n\t\t\t},\r\n\t\t\t\"training-programs\": {\r\n\t\t\t\ten: \"Workout Programs\",\r\n\t\t\t\tit: \"Programmi Di Allenamento\",\r\n\t\t\t\tes: \"Programas De Entrenamiento\",\r\n\t\t\t\tfr: \"Programmes D'Entraînement\",\r\n\t\t\t},\r\n\t\t\tsize: {\r\n\t\t\t\ten: \"Size\",\r\n\t\t\t\tit: \"Dimensione\",\r\n\t\t\t\tes: \"Tamaño\",\r\n\t\t\t\tfr: \"Taille\",\r\n\t\t\t},\r\n\t\t\t\"shared-at\": {\r\n\t\t\t\ten: \"Shared on\",\r\n\t\t\t\tit: \"Condiviso il\",\r\n\t\t\t\tes: \"Compartido el\",\r\n\t\t\t\tfr: \"Partagé le\",\r\n\t\t\t},\r\n\t\t\t\"shared-by\": {\r\n\t\t\t\ten: \"Shared By\",\r\n\t\t\t\tit: \"Condiviso da\",\r\n\t\t\t\tes: \"Compartido por\",\r\n\t\t\t\tfr: \"Partagé par\",\r\n\t\t\t},\r\n\t\t\t\"no-shares\": {\r\n\t\t\t\ten: \"Not shared\",\r\n\t\t\t\tit: \"Non condiviso\",\r\n\t\t\t\tes: \"No compartido\",\r\n\t\t\t\tfr: \"Non partagé\",\r\n\t\t\t},\r\n\t\t},\r\n\t\tAthletesBioView: {\r\n\t\t\t\"BODY_CIRCUMFERENCES-mg\": {\r\n\t\t\t\ten: \"Circumferences\",\r\n\t\t\t\tit: \"Circonferenze\",\r\n\t\t\t\tes: \"Circunferencias\",\r\n\t\t\t\tfr: \"Circonférences\",\r\n\t\t\t},\r\n\t\t\t\"BODY_MASS-mg\": {\r\n\t\t\t\ten: \"Body Mass\",\r\n\t\t\t\tit: \"Massa Corporea\",\r\n\t\t\t\tes: \"Masa Corporal\",\r\n\t\t\t\tfr: \"Masse Corporelle\",\r\n\t\t\t},\r\n\t\t\t\"BODY_WATER-mg\": {\r\n\t\t\t\ten: \"Body Water\",\r\n\t\t\t\tit: \"Acqua Corporea\",\r\n\t\t\t\tes: \"Agua Corporal\",\r\n\t\t\t\tfr: \"Eau Corporelle\",\r\n\t\t\t},\r\n\t\t\t\"BODY_OTHER-mg\": {\r\n\t\t\t\ten: \"Other\",\r\n\t\t\t\tit: \"Altro\",\r\n\t\t\t\tes: \"Otro\",\r\n\t\t\t\tfr: \"Autre\",\r\n\t\t\t},\r\n\t\t\t\"SKINFOLD_MEAS-mg\": {\r\n\t\t\t\ten: \"Skinfold\",\r\n\t\t\t\tit: \"Plicometria\",\r\n\t\t\t\tes: \"Plicometría\",\r\n\t\t\t\tfr: \"Plicométrie\",\r\n\t\t\t},\r\n\t\t\t\"BLOOD_MEAS-mg\": {\r\n\t\t\t\ten: \"Blood\",\r\n\t\t\t\tit: \"Sangue\",\r\n\t\t\t\tes: \"Sangre\",\r\n\t\t\t\tfr: \"Sang\",\r\n\t\t\t},\r\n\t\t\t\"TEST-mg\": {\r\n\t\t\t\ten: \"Test\",\r\n\t\t\t\tit: \"Test\",\r\n\t\t\t\tes: \"Test\",\r\n\t\t\t\tfr: \"Test\",\r\n\t\t\t},\r\n\t\t\t\"save-batch-measurements-result\": {\r\n\t\t\t\ten: \"Measurements saved on {0} athletes\",\r\n\t\t\t\tit: \"Misure salvate su {0} atleti\",\r\n\t\t\t\tes: \"Mediciones guardadas en {0} atletas.\",\r\n\t\t\t\tfr: \"Mesures enregistrées sur {0} athlètes.\",\r\n\t\t\t},\r\n\t\t},\r\n\t\tAdvancedBiometricsView: {\r\n\t\t\t\"no-user-measurements\": {\r\n\t\t\t\ten: \"No measurements for this user\",\r\n\t\t\t\tit: \"Nessuna misurazione per questo utente\",\r\n\t\t\t\tes: \"Sin medidas para este usuario\",\r\n\t\t\t\tfr: \"Aucune mesure pour cet utilisateur\",\r\n\t\t\t},\r\n\t\t\t\"user-measures\": {\r\n\t\t\t\ten: \"Measurements\",\r\n\t\t\t\tit: \"Misurazioni\",\r\n\t\t\t\tes: \"Medidas\",\r\n\t\t\t\tfr: \"Mesures\",\r\n\t\t\t},\r\n\t\t\tvariation: {\r\n\t\t\t\ten: \"Variation\",\r\n\t\t\t\tit: \"Variazione\",\r\n\t\t\t\tes: \"Cambio\",\r\n\t\t\t\tfr: \"Variation\",\r\n\t\t\t},\r\n\t\t\tinitial: {\r\n\t\t\t\ten: \"Initial\",\r\n\t\t\t\tit: \"Iniziale\",\r\n\t\t\t\tes: \"Inicial\",\r\n\t\t\t\tfr: \"Initial\",\r\n\t\t\t},\r\n\t\t\tcurrent: {\r\n\t\t\t\ten: \"Current\",\r\n\t\t\t\tit: \"Attuale\",\r\n\t\t\t\tes: \"En curso\",\r\n\t\t\t\tfr: \"Actuel\",\r\n\t\t\t},\r\n\t\t\t\"measurement-events\": {\r\n\t\t\t\ten: \"Measurement Events\",\r\n\t\t\t\tit: \"Eventi di misurazione\",\r\n\t\t\t\tes: \"Herramientas de medición\",\r\n\t\t\t\tfr: \"Événements de mesure\",\r\n\t\t\t},\r\n\t\t\tUptivoYMCAStep: {\r\n\t\t\t\ten: \"Uptivo 3M\",\r\n\t\t\t\tit: \"Uptivo 3M\",\r\n\t\t\t\tes: \"Uptivo 3M\",\r\n\t\t\t\tfr: \"Uptivo 3M\",\r\n\t\t\t},\r\n\t\t\t\"UptivoYMCAStep.Score-ms\": {\r\n\t\t\t\ten: \"Uptivo Fitness Test\",\r\n\t\t\t\tit: \"Fitness Test Uptivo\",\r\n\t\t\t\tes: \"Fitness Test Uptivo\",\r\n\t\t\t\tfr: \"Test de condition physique Uptivo\",\r\n\t\t\t},\r\n\t\t\t\"SpO2Prc-sh-ms\": {\r\n\t\t\t\ten: \"SpO₂\",\r\n\t\t\t\tit: \"SpO₂\",\r\n\t\t\t\tes: \"SpO₂\",\r\n\t\t\t\tfr: \"SpO₂\",\r\n\t\t\t},\r\n\t\t\t\"SpO2Prc-ms\": {\r\n\t\t\t\ten: \"SpO₂\",\r\n\t\t\t\tit: \"SpO₂\",\r\n\t\t\t\tes: \"SpO₂\",\r\n\t\t\t\tfr: \"SpO₂\",\r\n\t\t\t},\r\n\t\t\t\"SpO2Prc-desc\": {\r\n\t\t\t\ten: \"Oxygen Saturation\",\r\n\t\t\t\tit: \"Saturazione Ossigeno\",\r\n\t\t\t\tes: \"Saturación de oxígeno\",\r\n\t\t\t\tfr: \"Saturation d'oxygène\",\r\n\t\t\t},\r\n\t\t\t\"BloodPressureMin-sh-ms\": {\r\n\t\t\t\ten: \"BP Min\",\r\n\t\t\t\tit: \"PA Min\",\r\n\t\t\t\tes: \"TA Mín\",\r\n\t\t\t\tfr: \"TA Min\",\r\n\t\t\t},\r\n\t\t\t\"BloodPressureMin-ms\": {\r\n\t\t\t\ten: \"Blood Pressure Min\",\r\n\t\t\t\tit: \"Pressione Arteriosa Min\",\r\n\t\t\t\tes: \"Tensión Arterial Mínima\",\r\n\t\t\t\tfr: \"Tension Artérielle Min\",\r\n\t\t\t},\r\n\t\t\t\"BloodPressureMin-desc\": {\r\n\t\t\t\ten: \"Diastolic Blood Pressure\",\r\n\t\t\t\tit: \"Pressione Arteriosa Diastolica\",\r\n\t\t\t\tes: \"Presión Arterial Diastólica\",\r\n\t\t\t\tfr: \"Pression Artérielle Diastolique\",\r\n\t\t\t},\r\n\t\t\t\"BloodPressureMax-sh-ms\": {\r\n\t\t\t\ten: \"BP Max\",\r\n\t\t\t\tit: \"PA Max\",\r\n\t\t\t\tes: \"TA Máx\",\r\n\t\t\t\tfr: \"TA Max\",\r\n\t\t\t},\r\n\t\t\t\"BloodPressureMax-ms\": {\r\n\t\t\t\ten: \"Blood Pressure Max\",\r\n\t\t\t\tit: \"Pressione Arteriosa Massima\",\r\n\t\t\t\tes: \"Tensión Arterial Máxima\",\r\n\t\t\t\tfr: \"Tension Artérielle Max\",\r\n\t\t\t},\r\n\t\t\t\"BloodPressureMax-desc\": {\r\n\t\t\t\ten: \"Systolic Blood Pressure\",\r\n\t\t\t\tit: \"Pressione Arteriosa Sistolica\",\r\n\t\t\t\tes: \"Presión Arterial Sistólica\",\r\n\t\t\t\tfr: \"Pression Artérielle Systolique\",\r\n\t\t\t},\r\n\t\t\t\"PercentBodyWater-ms\": {\r\n\t\t\t\ten: \"BWP\",\r\n\t\t\t\tit: \"PAC\",\r\n\t\t\t\tes: \"PAC\",\r\n\t\t\t\tfr: \"PEC\",\r\n\t\t\t},\r\n\t\t\t\"PercentBodyWater-desc\": {\r\n\t\t\t\ten: \"Body Water Percentage\",\r\n\t\t\t\tit: \"Percentuale di Acqua Corporea\",\r\n\t\t\t\tes: \"Porcentaje de agua corporal\",\r\n\t\t\t\tfr: \"Pourcentage d'eau corporelle\",\r\n\t\t\t},\r\n\t\t\t\"BoneMass-sh-ms\": {\r\n\t\t\t\ten: \"BM\",\r\n\t\t\t\tit: \"MO\",\r\n\t\t\t\tes: \"MO\",\r\n\t\t\t\tfr: \"MO\",\r\n\t\t\t},\r\n\t\t\t\"BoneMass-ms\": {\r\n\t\t\t\ten: \"Bone Mass\",\r\n\t\t\t\tit: \"Massa Ossea\",\r\n\t\t\t\tes: \"Masa Ósea\",\r\n\t\t\t\tfr: \"Masse Osseuse\",\r\n\t\t\t},\r\n\t\t\t\"VisceralFatLevel-sh-ms\": {\r\n\t\t\t\ten: \"VF\",\r\n\t\t\t\tit: \"GV\",\r\n\t\t\t\tes: \"GV\",\r\n\t\t\t\tfr: \"GV\",\r\n\t\t\t},\r\n\t\t\t\"VisceralFatLevel-ms\": {\r\n\t\t\t\ten: \"Visceral Fat Level\",\r\n\t\t\t\tit: \"Livello di Grasso Viscerale\",\r\n\t\t\t\tes: \"Nivel de grasa visceral\",\r\n\t\t\t\tfr: \"Niveau de graisse viscérale\",\r\n\t\t\t},\r\n\t\t\t\"PercentBoneMass-sh-ms\": {\r\n\t\t\t\ten: \"BMP\",\r\n\t\t\t\tit: \"PMO\",\r\n\t\t\t\tes: \"PMO\",\r\n\t\t\t\tfr: \"PMO\",\r\n\t\t\t},\r\n\t\t\t\"PercentBoneMass-ms\": {\r\n\t\t\t\ten: \"Bone Mass Percentage\",\r\n\t\t\t\tit: \"Percentuale di Massa Ossea\",\r\n\t\t\t\tes: \"Porcentaje de masa ósea\",\r\n\t\t\t\tfr: \"Pourcentage de masse osseuse\",\r\n\t\t\t},\r\n\t\t\t\"ChestCirc-sh-ms\": {\r\n\t\t\t\ten: \"Chest\",\r\n\t\t\t\tit: \"Torace\",\r\n\t\t\t\tes: \"Torax\",\r\n\t\t\t\tfr: \"Thorax\",\r\n\t\t\t},\r\n\t\t\t\"ChestCirc-ms\": {\r\n\t\t\t\ten: \"Chest Circumference\",\r\n\t\t\t\tit: \"Circonferenza Toracica\",\r\n\t\t\t\tes: \"Circunferencia del Torax\",\r\n\t\t\t\tfr: \"Tour de Poitrine\",\r\n\t\t\t},\r\n\t\t\t\"WaistCirc-sh-ms\": {\r\n\t\t\t\ten: \"Waist\",\r\n\t\t\t\tit: \"Vita\",\r\n\t\t\t\tes: \"Cintura\",\r\n\t\t\t\tfr: \"Taille\",\r\n\t\t\t},\r\n\t\t\t\"WaistCirc-ms\": {\r\n\t\t\t\ten: \"Waist Circumference\",\r\n\t\t\t\tit: \"Circonferenza della Vita\",\r\n\t\t\t\tes: \"Circunferencia de la Cintura\",\r\n\t\t\t\tfr: \"Tour de Taille\",\r\n\t\t\t},\r\n\t\t\t\"HipCirc-sh-ms\": {\r\n\t\t\t\ten: \"Hip\",\r\n\t\t\t\tit: \"Anche\",\r\n\t\t\t\tes: \"Cadera\",\r\n\t\t\t\tfr: \"Hanche\",\r\n\t\t\t},\r\n\t\t\t\"HipCirc-ms\": {\r\n\t\t\t\ten: \"Hip Circumference\",\r\n\t\t\t\tit: \"Circonferenza all'Anca\",\r\n\t\t\t\tes: \"Circunferencia de la Cadera\",\r\n\t\t\t\tfr: \"Tour de Hanche\",\r\n\t\t\t},\r\n\t\t\t\"ThighCirc-sh-ms\": {\r\n\t\t\t\ten: \"Thigh\",\r\n\t\t\t\tit: \"Coscia\",\r\n\t\t\t\tes: \"Muslo\",\r\n\t\t\t\tfr: \"Cuisse\",\r\n\t\t\t},\r\n\t\t\t\"ThighCirc-ms\": {\r\n\t\t\t\ten: \"Thigh Circumference\",\r\n\t\t\t\tit: \"Circonferenza della Coscia\",\r\n\t\t\t\tes: \"Circunferencia del Muslo\",\r\n\t\t\t\tfr: \"Tour de Cuisse\",\r\n\t\t\t},\r\n\t\t\t\"ArmCirc-sh-ms\": {\r\n\t\t\t\ten: \"Arm\",\r\n\t\t\t\tit: \"Braccio\",\r\n\t\t\t\tes: \"Brazo\",\r\n\t\t\t\tfr: \"Bras\",\r\n\t\t\t},\r\n\t\t\t\"ArmCirc-ms\": {\r\n\t\t\t\ten: \"Arm Circumference\",\r\n\t\t\t\tit: \"Circonferenza del Braccio\",\r\n\t\t\t\tes: \"Circunferencia del Brazo\",\r\n\t\t\t\tfr: \"Circonférence du Bras\",\r\n\t\t\t},\r\n\t\t\t\"HeartRateAverage-sh-ms\": {\r\n\t\t\t\ten: \"Avg HR\",\r\n\t\t\t\tit: \"FC Med\",\r\n\t\t\t\tes: \"FC Med\",\r\n\t\t\t\tfr: \"FC Moy\",\r\n\t\t\t},\r\n\t\t\t\"HeartRateAverage-ms\": {\r\n\t\t\t\ten: \"Avegage Heart Rate\",\r\n\t\t\t\tit: \"Frequenza Cardiaca Media\",\r\n\t\t\t\tes: \"Frecuencia Cardíaca Media\",\r\n\t\t\t\tfr: \"Fréquence Cardiaque Moyenne\",\r\n\t\t\t},\r\n\t\t\t\"HeartRateRest-sh-ms\": {\r\n\t\t\t\ten: \"Rest HR\",\r\n\t\t\t\tit: \"FC Riposo\",\r\n\t\t\t\tes: \"FC Reposo\",\r\n\t\t\t\tfr: \"FC Repos\",\r\n\t\t\t},\r\n\t\t\t\"HeartRateRest-ms\": {\r\n\t\t\t\ten: \"Rest Heart Rate\",\r\n\t\t\t\tit: \"Frequenza Cardiaca a Riposo\",\r\n\t\t\t\tes: \"Frecuencia Cardíaca en Reposo\",\r\n\t\t\t\tfr: \"Fréquence Cardiaque au Repos\",\r\n\t\t\t},\r\n\t\t\t\"manual-measurements\": {\r\n\t\t\t\ten: \"Manual Measurements\",\r\n\t\t\t\tit: \"Misurazione manuale\",\r\n\t\t\t\tes: \"Mediciones manuales\",\r\n\t\t\t\tfr: \"Mesures manuelles\",\r\n\t\t\t},\r\n\t\t\t\"BloodGlucose-ms\": {\r\n\t\t\t\ten: \"Glucose\",\r\n\t\t\t\tit: \"Glucosio\",\r\n\t\t\t\tes: \"Glucosa\",\r\n\t\t\t\tfr: \"Glycémie\",\r\n\t\t\t},\r\n\t\t\t\"BloodGlucose.1-ms\": {\r\n\t\t\t\ten: \"Glucose 1\",\r\n\t\t\t\tit: \"Glucosio 1\",\r\n\t\t\t\tes: \"Glucosa 1\",\r\n\t\t\t\tfr: \"Glycémie 1\",\r\n\t\t\t},\r\n\t\t\t\"BloodGlucose.2-ms\": {\r\n\t\t\t\ten: \"Glucose 2\",\r\n\t\t\t\tit: \"Glucosio 2\",\r\n\t\t\t\tes: \"Glucosa 2\",\r\n\t\t\t\tfr: \"Glycémie 2\",\r\n\t\t\t},\r\n\t\t\t\"BloodGlucose.3-ms\": {\r\n\t\t\t\ten: \"Glucose 3\",\r\n\t\t\t\tit: \"Glucosio 3\",\r\n\t\t\t\tes: \"Glucosa 3\",\r\n\t\t\t\tfr: \"Glycémie 3\",\r\n\t\t\t},\r\n\t\t\t\"BloodGlucose.4-ms\": {\r\n\t\t\t\ten: \"Glucose 4\",\r\n\t\t\t\tit: \"Glucosio 4\",\r\n\t\t\t\tes: \"Glucosa 4\",\r\n\t\t\t\tfr: \"Glycémie 4\",\r\n\t\t\t},\r\n\t\t\t\"TricepsTK-ms\": {\r\n\t\t\t\ten: \"Tricep\",\r\n\t\t\t\tit: \"Tricipite\",\r\n\t\t\t\tes: \"Tríceps\",\r\n\t\t\t\tfr: \"Triceps\",\r\n\t\t\t},\r\n\t\t\t\"AbdomenTK-ms\": {\r\n\t\t\t\ten: \"Abdomen\",\r\n\t\t\t\tit: \"Addome\",\r\n\t\t\t\tes: \"Abdomen\",\r\n\t\t\t\tfr: \"Abdomen\",\r\n\t\t\t},\r\n\t\t\t\"SuprailiacTK-ms\": {\r\n\t\t\t\ten: \"Suprailiac\",\r\n\t\t\t\tit: \"Sovrailiaco\",\r\n\t\t\t\tes: \"Suprailíaco\",\r\n\t\t\t\tfr: \"Supra-iliaque\",\r\n\t\t\t},\r\n\t\t\t\"SubscapularTK-ms\": {\r\n\t\t\t\ten: \"Subscapular\",\r\n\t\t\t\tit: \"Sottoscapolare\",\r\n\t\t\t\tes: \"Subescapular\",\r\n\t\t\t\tfr: \"Sous-scapulaire\",\r\n\t\t\t},\r\n\t\t\t\"AxillaryTK-ms\": {\r\n\t\t\t\ten: \"Axillary\",\r\n\t\t\t\tit: \"Ascellare\",\r\n\t\t\t\tes: \"Axilar\",\r\n\t\t\t\tfr: \"Axillaire\",\r\n\t\t\t},\r\n\t\t\t\"PectoralTK-ms\": {\r\n\t\t\t\ten: \"Pectoral\",\r\n\t\t\t\tit: \"Pettorale\",\r\n\t\t\t\tes: \"Pectoral\",\r\n\t\t\t\tfr: \"Pectoral\",\r\n\t\t\t},\r\n\t\t\t\"ThighTK-ms\": {\r\n\t\t\t\ten: \"Thigh\",\r\n\t\t\t\tit: \"Coscia\",\r\n\t\t\t\tes: \"Muslo\",\r\n\t\t\t\tfr: \"Cuisse\",\r\n\t\t\t},\r\n\t\t\t\"CalfTK-ms\": {\r\n\t\t\t\ten: \"Calf\",\r\n\t\t\t\tit: \"Polpaccio\",\r\n\t\t\t\tes: \"Pantorrilla\",\r\n\t\t\t\tfr: \"Mollet\",\r\n\t\t\t},\r\n\t\t},\r\n\t\tBiometricReportView: {\r\n\t\t\t\"biometric-report\": {\r\n\t\t\t\ten: \"Biometric Report\",\r\n\t\t\t\tit: \"Report Biometrico\",\r\n\t\t\t\tes: \"Informe biométrico\",\r\n\t\t\t\tfr: \"Rapport biométrique\",\r\n\t\t\t},\r\n\t\t},\r\n\t\tFitnessTestView: {\r\n\t\t\tFitnessTest: {\r\n\t\t\t\ten: \"Fitness Test\",\r\n\t\t\t\tit: \"Fitness Test\",\r\n\t\t\t\tes: \"Fitness Test\",\r\n\t\t\t\tfr: \"Test de condition physique\",\r\n\t\t\t},\r\n\t\t\tMaxHrThresholdExceeded: {\r\n\t\t\t\ten: \"Heart Rate Exceeded 85% Of Max\",\r\n\t\t\t\tit: \"Frequenza cardiaca superiore a 85%\",\r\n\t\t\t\tes: \"La frecuencia cardíaca superó el 85% de máxima\",\r\n\t\t\t\tfr: \"La fréquence cardiaque a dépassé 85% de la valeur max.\",\r\n\t\t\t},\r\n\t\t\tStoppedByUser: {\r\n\t\t\t\ten: \"Stopped by user\",\r\n\t\t\t\tit: \"Interrotto dall'utente\",\r\n\t\t\t\tes: \"Detenido por el usuario\",\r\n\t\t\t\tfr: \"Arrêté par utilisateur\",\r\n\t\t\t},\r\n\t\t\trating: {\r\n\t\t\t\ten: \"Rating\",\r\n\t\t\t\tit: \"Livello\",\r\n\t\t\t\tes: \"Clasificación\",\r\n\t\t\t\tfr: \"Évaluation\",\r\n\t\t\t},\r\n\t\t\tscore: {\r\n\t\t\t\ten: \"Score\",\r\n\t\t\t\tit: \"Punteggio\",\r\n\t\t\t\tes: \"Puntuación\",\r\n\t\t\t\tfr: \"Score\",\r\n\t\t\t},\r\n\t\t\t\"Rating.excellent\": {\r\n\t\t\t\ten: \"Excellent\",\r\n\t\t\t\tit: \"Eccellente\",\r\n\t\t\t\tes: \"Excelente\",\r\n\t\t\t\tfr: \"Excellent\",\r\n\t\t\t},\r\n\t\t\t\"Rating.good\": {\r\n\t\t\t\ten: \"Good\",\r\n\t\t\t\tit: \"Buono\",\r\n\t\t\t\tes: \"Bien\",\r\n\t\t\t\tfr: \"Bon\",\r\n\t\t\t},\r\n\t\t\t\"Rating.aboveaverage\": {\r\n\t\t\t\ten: \"Above Average\",\r\n\t\t\t\tit: \"Sopra la media\",\r\n\t\t\t\tes: \"Por encima de la media\",\r\n\t\t\t\tfr: \"Supérieur à la moyenne\",\r\n\t\t\t},\r\n\t\t\t\"Rating.average\": {\r\n\t\t\t\ten: \"Average\",\r\n\t\t\t\tit: \"Nella media\",\r\n\t\t\t\tes: \"Promedio\",\r\n\t\t\t\tfr: \"Moyen\",\r\n\t\t\t},\r\n\t\t\t\"Rating.belowaverage\": {\r\n\t\t\t\ten: \"Below Average\",\r\n\t\t\t\tit: \"Sotto la media\",\r\n\t\t\t\tes: \"Por debajo de la media\",\r\n\t\t\t\tfr: \"Inférieur à la moyenne\",\r\n\t\t\t},\r\n\t\t\t\"Rating.poor\": {\r\n\t\t\t\ten: \"Poor\",\r\n\t\t\t\tit: \"Scarso\",\r\n\t\t\t\tes: \"Mala\",\r\n\t\t\t\tfr: \"Mauvais\",\r\n\t\t\t},\r\n\t\t\t\"Rating.verypoor\": {\r\n\t\t\t\ten: \"Very Poor\",\r\n\t\t\t\tit: \"Molto scarso\",\r\n\t\t\t\tes: \"Muy pobre\",\r\n\t\t\t\tfr: \"Pas bon\",\r\n\t\t\t},\r\n\t\t\tresults: {\r\n\t\t\t\ten: \"Results\",\r\n\t\t\t\tit: \"Risultati\",\r\n\t\t\t\tes: \"Resultados\",\r\n\t\t\t\tfr: \"Résultats\",\r\n\t\t\t},\r\n\t\t\t\"heart-rates\": {\r\n\t\t\t\ten: \"Heart Rates\",\r\n\t\t\t\tit: \"Frequenze cardiache\",\r\n\t\t\t\tes: \"Frecuencia cardiaca\",\r\n\t\t\t\tfr: \"Fréquences cardiaques\",\r\n\t\t\t},\r\n\t\t\t\"HrPreTest-ms\": {\r\n\t\t\t\ten: \"Pre Test\",\r\n\t\t\t\tit: \"Pre test\",\r\n\t\t\t\tes: \"Prueba previa\",\r\n\t\t\t\tfr: \"Pré-test\",\r\n\t\t\t},\r\n\t\t\t\"HrAt1Min-ms\": {\r\n\t\t\t\ten: \"Rate At 60s\",\r\n\t\t\t\tit: \"Frequenza a 60s\",\r\n\t\t\t\tes: \"Frecuencia a 60s\",\r\n\t\t\t\tfr: \"Fréquence à 60s\",\r\n\t\t\t},\r\n\t\t\t\"HrAt2Min-ms\": {\r\n\t\t\t\ten: \"Rate At 120s\",\r\n\t\t\t\tit: \"Frequenza a 120s\",\r\n\t\t\t\tes: \"Frecuencia a 120s\",\r\n\t\t\t\tfr: \"Fréquence à 120s\",\r\n\t\t\t},\r\n\t\t\t\"HrAt3Min-ms\": {\r\n\t\t\t\ten: \"Rate At 180s\",\r\n\t\t\t\tit: \"Frequenza a 180s\",\r\n\t\t\t\tes: \"Frecuencia a 180s\",\r\n\t\t\t\tfr: \"Fréquence à 180s\",\r\n\t\t\t},\r\n\t\t\t\"Hr1MinPost-ms\": {\r\n\t\t\t\ten: \"Recovery HR At 60s\",\r\n\t\t\t\tit: \"Freq. cardiaca di recupero a 60s\",\r\n\t\t\t\tes: \"Recuperación de FC a 60 pulsaciones\",\r\n\t\t\t\tfr: \"Récupération FC à 60 s.\",\r\n\t\t\t},\r\n\t\t\t\"HrAtStop-ms\": {\r\n\t\t\t\ten: \"Rate At Stop\",\r\n\t\t\t\tit: \"Frequenza allo stop\",\r\n\t\t\t\tes: \"Frecuencia en lo stop\",\r\n\t\t\t\tfr: \"Fréquence à l'arrêt\",\r\n\t\t\t},\r\n\t\t\t\"EstimatedVO2Max-ms\": {\r\n\t\t\t\ten: \"Estimated VO₂ Max\",\r\n\t\t\t\tit: \"Stima VO₂ max\",\r\n\t\t\t\tes: \"VO₂ Máx. Estimado\",\r\n\t\t\t\tfr: \"VO₂ max. estimé\",\r\n\t\t\t},\r\n\t\t\tTestInterruptedAtTime: {\r\n\t\t\t\ten: \"Test Interrupted At Time\",\r\n\t\t\t\tit: \"Test interrotto al tempo\",\r\n\t\t\t\tes: \"Prueba interrumpida en el tiempo\",\r\n\t\t\t\tfr: \"Test interrompu à Heure\",\r\n\t\t\t},\r\n\t\t},\r\n\t\tBodyCompositionView: {\r\n\t\t\tBodyComposition: {\r\n\t\t\t\ten: \"Body Composition Analysis\",\r\n\t\t\t\tit: \"Analisi Composizione Corporea\",\r\n\t\t\t\tes: \"Análisis composición corporal\",\r\n\t\t\t\tfr: \"Analyse de la composition corporelle\",\r\n\t\t\t},\r\n\t\t\t\"TotalBodyWater-ms\": {\r\n\t\t\t\ten: \"TBW\",\r\n\t\t\t\tit: \"ACT\",\r\n\t\t\t\tes: \"ACT\",\r\n\t\t\t\tfr: \"MHT\",\r\n\t\t\t},\r\n\t\t\t\"TotalBodyWater-desc\": {\r\n\t\t\t\ten: \"Total Body Water\",\r\n\t\t\t\tit: \"Acqua Corporea Totale\",\r\n\t\t\t\tes: \"Agua Corporal Total\",\r\n\t\t\t\tfr: \"Masse Hydrique Totale\",\r\n\t\t\t},\r\n\t\t\t\"protein-ms\": {\r\n\t\t\t\ten: \"Protein\",\r\n\t\t\t\tit: \"Proteine\",\r\n\t\t\t\tes: \"Proteína\",\r\n\t\t\t\tfr: \"Protéines\",\r\n\t\t\t},\r\n\t\t\t\"minerals-ms\": {\r\n\t\t\t\ten: \"Minerals\",\r\n\t\t\t\tit: \"Minerali\",\r\n\t\t\t\tes: \"Minerales\",\r\n\t\t\t\tfr: \"Minéraux\",\r\n\t\t\t},\r\n\t\t\t\"dry-lean-mass-ms\": {\r\n\t\t\t\ten: \"Dry Lean Mass\",\r\n\t\t\t\tit: \"Massa Muscolare Magra\",\r\n\t\t\t\tes: \"Masa Muscular Magra\",\r\n\t\t\t\tfr: \"Masse Corporelle Maigre\",\r\n\t\t\t},\r\n\t\t\t\"BodyFatMass-sh-ms\": {\r\n\t\t\t\ten: \"BFM\",\r\n\t\t\t\tit: \"MGC\",\r\n\t\t\t\tes: \"MGC\",\r\n\t\t\t\tfr: \"MCG\",\r\n\t\t\t},\r\n\t\t\t\"BodyFatMass-ms\": {\r\n\t\t\t\ten: \"Body Fat Mass\",\r\n\t\t\t\tit: \"Massa Grassa Corporea\",\r\n\t\t\t\tes: \"Masa de Grasa Corporal\",\r\n\t\t\t\tfr: \"Masse Corporelle Grasse\",\r\n\t\t\t},\r\n\t\t\t\"muscle-fat-analysis\": {\r\n\t\t\t\ten: \"Muscle-Fat Analysis\",\r\n\t\t\t\tit: \"Analisi Muscolo-Grasso\",\r\n\t\t\t\tes: \"Análisis de Grasa Muscular\",\r\n\t\t\t\tfr: \"Analyse Muscle-Graisse\",\r\n\t\t\t},\r\n\t\t\t\"SkeletalMuscleMass-ms\": {\r\n\t\t\t\ten: \"SMM\",\r\n\t\t\t\tit: \"MMS\",\r\n\t\t\t\tes: \"MME\",\r\n\t\t\t\tfr: \"MMS\",\r\n\t\t\t},\r\n\t\t\t\"SkeletalMuscleMass-desc\": {\r\n\t\t\t\ten: \"Skeletal Muscle Mass\",\r\n\t\t\t\tit: \"Massa del Muscolo Scheletrico\",\r\n\t\t\t\tes: \"Masa músculo-esquelética\",\r\n\t\t\t\tfr: \"Masse musculaire squelettique\",\r\n\t\t\t},\r\n\t\t\t\"obesity-analysis\": {\r\n\t\t\t\ten: \"Obesity Analysis\",\r\n\t\t\t\tit: \"Analisi dell'Obesità\",\r\n\t\t\t\tes: \"Análisis de Obesidad\",\r\n\t\t\t\tfr: \"Analyse d'obésité\",\r\n\t\t\t},\r\n\t\t\t\"BodyMassIndex-ms\": {\r\n\t\t\t\ten: \"BMI\",\r\n\t\t\t\tit: \"BMI\",\r\n\t\t\t\tes: \"IMC\",\r\n\t\t\t\tfr: \"IMC\",\r\n\t\t\t},\r\n\t\t\t\"BodyMassIndex-desc\": {\r\n\t\t\t\ten: \"Body Mass Index\",\r\n\t\t\t\tit: \"Indice di Massa Corporea\",\r\n\t\t\t\tes: \"Índice de masa corporal\",\r\n\t\t\t\tfr: \"Indice de masse corporelle\",\r\n\t\t\t},\r\n\t\t\t\"IntracellularWater-ms\": {\r\n\t\t\t\ten: \"ICW\",\r\n\t\t\t\tit: \"AIC\",\r\n\t\t\t\tes: \"AIC\",\r\n\t\t\t\tfr: \"EIC\",\r\n\t\t\t},\r\n\t\t\t\"IntracellularWater-desc\": {\r\n\t\t\t\ten: \"Intracellular Water\",\r\n\t\t\t\tit: \"Acqua intracellulare\",\r\n\t\t\t\tes: \"Agua intracelular\",\r\n\t\t\t\tfr: \"Eau intracellulaire\",\r\n\t\t\t},\r\n\t\t\t\"ExtracellularWater-ms\": {\r\n\t\t\t\ten: \"ECW\",\r\n\t\t\t\tit: \"AEC\",\r\n\t\t\t\tes: \"AEC\",\r\n\t\t\t\tfr: \"EEC\",\r\n\t\t\t},\r\n\t\t\t\"ExtracellularWater-desc\": {\r\n\t\t\t\ten: \"Extracellular Water\",\r\n\t\t\t\tit: \"Acqua Extra-Cellulare\",\r\n\t\t\t\tes: \"Agua Extra-Celular\",\r\n\t\t\t\tfr: \"Eau Extra-Cellulaire\",\r\n\t\t\t},\r\n\t\t\t\"BoneMineralContent-ms\": {\r\n\t\t\t\ten: \"Bone Mineral Content\",\r\n\t\t\t\tit: \"Contenuto Minerale Osseo\",\r\n\t\t\t\tes: \"Contenido mineral óseo\",\r\n\t\t\t\tfr: \"Contenu minéral osseux\",\r\n\t\t\t},\r\n\t\t\t\"BodyCellMass-ms\": {\r\n\t\t\t\ten: \"Body Cell Mass\",\r\n\t\t\t\tit: \"Massa cellulare\",\r\n\t\t\t\tes: \"Masa celular\",\r\n\t\t\t\tfr: \"Masse cellulaire\",\r\n\t\t\t},\r\n\t\t\t\"LeftArm-ms\": {\r\n\t\t\t\ten: \"Left Arm\",\r\n\t\t\t\tit: \"Braccio sinistro\",\r\n\t\t\t\tes: \"Brazo izquierdo\",\r\n\t\t\t\tfr: \"Bras gauche\",\r\n\t\t\t},\r\n\t\t\t\"RightArm-ms\": {\r\n\t\t\t\ten: \"Right Arm\",\r\n\t\t\t\tit: \"Braccio destro\",\r\n\t\t\t\tes: \"Brazo derecho\",\r\n\t\t\t\tfr: \"Bras droit\",\r\n\t\t\t},\r\n\t\t\t\"Trunk-ms\": {\r\n\t\t\t\ten: \"Trunk\",\r\n\t\t\t\tit: \"Tronco\",\r\n\t\t\t\tes: \"Tronco\",\r\n\t\t\t\tfr: \"Tronc\",\r\n\t\t\t},\r\n\t\t\t\"LeftLeg-ms\": {\r\n\t\t\t\ten: \"Left Leg\",\r\n\t\t\t\tit: \"Gamba sinistra\",\r\n\t\t\t\tes: \"Pierna izquierda\",\r\n\t\t\t\tfr: \"Jambe gauche\",\r\n\t\t\t},\r\n\t\t\t\"RightLeg-ms\": {\r\n\t\t\t\ten: \"Right Leg\",\r\n\t\t\t\tit: \"Gamba destra\",\r\n\t\t\t\tes: \"Pierna derecha\",\r\n\t\t\t\tfr: \"Jambe droite\",\r\n\t\t\t},\r\n\t\t\t\"CircNeck-sh-ms\": {\r\n\t\t\t\ten: \"Neck Circ.\",\r\n\t\t\t\tit: \"Circ. collo\",\r\n\t\t\t\tes: \"Circ. cuello\",\r\n\t\t\t\tfr: \"Circ. cou\",\r\n\t\t\t},\r\n\t\t\t\"CircLeftArm-sh-ms\": {\r\n\t\t\t\ten: \"Left Arm Circ.\",\r\n\t\t\t\tit: \"Circ. braccio sinistro\",\r\n\t\t\t\tes: \"Circ. brazo izquierdo\",\r\n\t\t\t\tfr: \"Circ. bras gauche\",\r\n\t\t\t},\r\n\t\t\t\"MuscleCircLeftArm-sh-ms\": {\r\n\t\t\t\ten: \"Left Arm Muscle Circ.\",\r\n\t\t\t\tit: \"Circ. muscolare braccio sx\",\r\n\t\t\t\tes: \"Circ. muscular brazo izquierdo\",\r\n\t\t\t\tfr: \"Circ. musculaire bras gauche\",\r\n\t\t\t},\r\n\t\t\t\"CircRightArm-sh-ms\": {\r\n\t\t\t\ten: \"Right Arm Circ.\",\r\n\t\t\t\tit: \"Circ. braccio destro\",\r\n\t\t\t\tes: \"Circ. brazo derecho\",\r\n\t\t\t\tfr: \"Circ. bras droit\",\r\n\t\t\t},\r\n\t\t\t\"CircChest-sh-ms\": {\r\n\t\t\t\ten: \"Chest Circ.\",\r\n\t\t\t\tit: \"Circ. torace\",\r\n\t\t\t\tes: \"Circ. torax\",\r\n\t\t\t\tfr: \"Circ. poitrine\",\r\n\t\t\t},\r\n\t\t\t\"CircAbdomen-sh-ms\": {\r\n\t\t\t\ten: \"Abdomen Circ.\",\r\n\t\t\t\tit: \"Circ. addome\",\r\n\t\t\t\tes: \"Circ. abdomen\",\r\n\t\t\t\tfr: \"Circ. abdomen\",\r\n\t\t\t},\r\n\t\t\t\"CircHip-sh-ms\": {\r\n\t\t\t\ten: \"Hips Circ.\",\r\n\t\t\t\tit: \"Circ. fianchi\",\r\n\t\t\t\tes: \"Circ. caderas\",\r\n\t\t\t\tfr: \"Circ. hanches\",\r\n\t\t\t},\r\n\t\t\t\"CircLeftThigh-sh-ms\": {\r\n\t\t\t\ten: \"Left Thigh Circ.\",\r\n\t\t\t\tit: \"Circ. coscia sinistra\",\r\n\t\t\t\tes: \"Circ. muslo izquierdo\",\r\n\t\t\t\tfr: \"Circ. cuisse gauche\",\r\n\t\t\t},\r\n\t\t\t\"CircRightThigh-sh-ms\": {\r\n\t\t\t\ten: \"Right Thigh Circ.\",\r\n\t\t\t\tit: \"Circ. coscia destra\",\r\n\t\t\t\tes: \"Circ. muslo derecho\",\r\n\t\t\t\tfr: \"Circ. cuisse droit\",\r\n\t\t\t},\r\n\t\t\t\"PercentBodyFat-ms\": {\r\n\t\t\t\ten: \"BFP\",\r\n\t\t\t\tit: \"PGC\",\r\n\t\t\t\tes: \"PGC\",\r\n\t\t\t\tfr: \"IMG\",\r\n\t\t\t},\r\n\t\t\t\"PercentBodyFat-desc\": {\r\n\t\t\t\ten: \"Body Fat Percentage\",\r\n\t\t\t\tit: \"Percentuale di Grasso Corporeo\",\r\n\t\t\t\tes: \"Porcentaje de Grasa Corporal\",\r\n\t\t\t\tfr: \"Indice de masse grasse\",\r\n\t\t\t},\r\n\t\t\t\"segmental-lean-analysis\": {\r\n\t\t\t\ten: \"Segmental Lean Analysis\",\r\n\t\t\t\tit: \"Analisi Massa Magra Segmentale\",\r\n\t\t\t\tes: \"Análisis de masa magra\",\r\n\t\t\t\tfr: \"Analyse segmentaire masse maigre\",\r\n\t\t\t},\r\n\t\t\t\"segmental-fat-analysis\": {\r\n\t\t\t\ten: \"Segmental Fat Analysis\",\r\n\t\t\t\tit: \"Analisi Massa Grassa Segmentale\",\r\n\t\t\t\tes: \"Análisis de Grasa Segmental\",\r\n\t\t\t\tfr: \"Analyse segmentaire masse grasse\",\r\n\t\t\t},\r\n\t\t\t\"ecw-analysis\": {\r\n\t\t\t\ten: \"Extracellular Water Analysis\",\r\n\t\t\t\tit: \"Analisi Acqua Extracellulare\",\r\n\t\t\t\tes: \"Análisis de agua extracelular\",\r\n\t\t\t\tfr: \"Analyse de l'eau extracellulaire\",\r\n\t\t\t},\r\n\t\t\t\"inbody-score\": {\r\n\t\t\t\ten: \"InBody Score\",\r\n\t\t\t\tit: \"Punteggio InBody\",\r\n\t\t\t\tes: \"Puntuación de InBody\",\r\n\t\t\t\tfr: \"Score InBody\",\r\n\t\t\t},\r\n\t\t\tscore: {\r\n\t\t\t\ten: \"Score\",\r\n\t\t\t\tit: \"Punteggio\",\r\n\t\t\t\tes: \"Puntuación\",\r\n\t\t\t\tfr: \"Score\",\r\n\t\t\t},\r\n\t\t\t\"weight-control-ms\": {\r\n\t\t\t\ten: \"Weight Contol\",\r\n\t\t\t\tit: \"Controllo del Peso\",\r\n\t\t\t\tes: \"Control de peso\",\r\n\t\t\t\tfr: \"Contrôle du poids\",\r\n\t\t\t},\r\n\t\t\t\"target-weight-ms\": {\r\n\t\t\t\ten: \"Target Weight\",\r\n\t\t\t\tit: \"Peso Target\",\r\n\t\t\t\tes: \"Peso buscado\",\r\n\t\t\t\tfr: \"Poids cible\",\r\n\t\t\t},\r\n\t\t\t\"fat-control-ms\": {\r\n\t\t\t\ten: \"Fat Control\",\r\n\t\t\t\tit: \"Controllo del Grasso\",\r\n\t\t\t\tes: \"Control de grasa\",\r\n\t\t\t\tfr: \"Contrôle de la masse grasse\",\r\n\t\t\t},\r\n\t\t\t\"muscle-control-ms\": {\r\n\t\t\t\ten: \"Muscle Control\",\r\n\t\t\t\tit: \"Controllo del Muscolo\",\r\n\t\t\t\tes: \"Control muscular\",\r\n\t\t\t\tfr: \"Contrôle de la masse musculaire\",\r\n\t\t\t},\r\n\t\t\t\"bf-lb-mass-control\": {\r\n\t\t\t\ten: \"Body Fat-Lean Body Mass Control\",\r\n\t\t\t\tit: \"Controllo Massa Grassa-Magra\",\r\n\t\t\t\tes: \"Control de masa corporal\",\r\n\t\t\t\tfr: \"Contrôle masse grasse/masse corporelle maigre\",\r\n\t\t\t},\r\n\t\t\t\"waist-hip-ratio\": {\r\n\t\t\t\ten: \"Waist-Hip Ratio\",\r\n\t\t\t\tit: \"Rapporto Cintura-Fianchi\",\r\n\t\t\t\tes: \"Relación cintura/cadera\",\r\n\t\t\t\tfr: \"Rapport Taille-Hanches\",\r\n\t\t\t},\r\n\t\t\t\"visceral-fat-level\": {\r\n\t\t\t\ten: \"Visceral Fat Level\",\r\n\t\t\t\tit: \"Livello di Grasso Viscerale\",\r\n\t\t\t\tes: \"Nivel de grasa visceral\",\r\n\t\t\t\tfr: \"Niveau de graisse viscérale\",\r\n\t\t\t},\r\n\t\t\t\"research-parameters\": {\r\n\t\t\t\ten: \"Research Parameters\",\r\n\t\t\t\tit: \"Parametri di Ricerca\",\r\n\t\t\t\tes: \"Parámetros de investigación\",\r\n\t\t\t\tfr: \"Paramètres de recherche\",\r\n\t\t\t},\r\n\t\t\t\"BasalMetabolicRate-ms\": {\r\n\t\t\t\ten: \"Basal Metabolic Rate\",\r\n\t\t\t\tit: \"Tasso Metabolico Basale\",\r\n\t\t\t\tes: \"Tasa metabólica basal\",\r\n\t\t\t\tfr: \"Métabolisme basal\",\r\n\t\t\t},\r\n\t\t\t\"BasalMetabolicRate-sh-ms\": {\r\n\t\t\t\ten: \"BMR\",\r\n\t\t\t\tit: \"BMR\",\r\n\t\t\t\tes: \"BMR\",\r\n\t\t\t\tfr: \"BMR\",\r\n\t\t\t},\r\n\t\t\t\"obesity-degree\": {\r\n\t\t\t\ten: \"Obesity Degree\",\r\n\t\t\t\tit: \"Grado di Obesità\",\r\n\t\t\t\tes: \"Grado de obesidad\",\r\n\t\t\t\tfr: \"Degré d'obésité\",\r\n\t\t\t},\r\n\t\t\t\"FatFreeMass-sh-ms\": {\r\n\t\t\t\ten: \"LeanM\",\r\n\t\t\t\tit: \"MMM\",\r\n\t\t\t\tes: \"MMM\",\r\n\t\t\t\tfr: \"MMM\",\r\n\t\t\t},\r\n\t\t\t\"FatFreeMass-ms\": {\r\n\t\t\t\ten: \"Lean Mass\",\r\n\t\t\t\tit: \"Massa Muscolare Magra\",\r\n\t\t\t\tes: \"Masa Muscular Magra\",\r\n\t\t\t\tfr: \"Masse Musculaire Maigre\",\r\n\t\t\t},\r\n\t\t\t\"body-measurements\": {\r\n\t\t\t\ten: \"Body Measurements\",\r\n\t\t\t\tit: \"Misure corporee\",\r\n\t\t\t\tes: \"Medidas del cuerpo\",\r\n\t\t\t\tfr: \"Mesures du corps\",\r\n\t\t\t},\r\n\t\t\t\"body-water-composition\": {\r\n\t\t\t\ten: \"Body Water Composition\",\r\n\t\t\t\tit: \"Composizione acqua corporea\",\r\n\t\t\t\tes: \"Composición de agua corporal\",\r\n\t\t\t\tfr: \"Composition de l'eau du corps\",\r\n\t\t\t},\r\n\t\t\t\"segmental-water-analysis\": {\r\n\t\t\t\ten: \"Segmental Water Analysis\",\r\n\t\t\t\tit: \"Analisi acqua segmentale\",\r\n\t\t\t\tes: \"Análisis de agua segmental\",\r\n\t\t\t\tfr: \"Analyse de l'eau segmentaire\",\r\n\t\t\t},\r\n\t\t\t\"visceral-fat-area\": {\r\n\t\t\t\ten: \"Visceral Fat Area\",\r\n\t\t\t\tit: \"Area grasso viscerale\",\r\n\t\t\t\tes: \"Área de grasa visceral\",\r\n\t\t\t\tfr: \"Zone de graisse viscérale\",\r\n\t\t\t},\r\n\t\t\t\"tbw-ffm\": {\r\n\t\t\t\ten: \"TBW/FFM\",\r\n\t\t\t\tit: \"ACT/MMC\",\r\n\t\t\t\tes: \"ACT/MMC\",\r\n\t\t\t\tfr: \"MHT/MMC\",\r\n\t\t\t},\r\n\t\t\tFatFreeMassIndex: {\r\n\t\t\t\ten: \"Fat Free Mass Index\",\r\n\t\t\t\tit: \"Indice Massa Magra Alipidica\",\r\n\t\t\t\tes: \"Índice de masa magro\",\r\n\t\t\t\tfr: \"Indice de masse maigre\",\r\n\t\t\t},\r\n\t\t\tFatMassIndex: {\r\n\t\t\t\ten: \"Fat Mass Index\",\r\n\t\t\t\tit: \"Indice Massa Grassa\",\r\n\t\t\t\tes: \"Índice de masa grasa\",\r\n\t\t\t\tfr: \"Indice de masse grasse\",\r\n\t\t\t},\r\n\t\t\t\"ECWTBWRatio-sh-ms\": {\r\n\t\t\t\ten: \"ECW/TBW\",\r\n\t\t\t\tit: \"AEC/ACT\",\r\n\t\t\t\tes: \"AEC/ACT\",\r\n\t\t\t\tfr: \"EEC/MHT\",\r\n\t\t\t},\r\n\t\t\t\"ECWTBWRatio-ms\": {\r\n\t\t\t\ten: \"ECW/TBW Ratio\",\r\n\t\t\t\tit: \"Rapporto AEC/ACT\",\r\n\t\t\t\tes: \"Proporción AEC/ACT\",\r\n\t\t\t\tfr: \"Rapport EEC/MHT\",\r\n\t\t\t},\r\n\t\t\t\"ECWTBWRatio-desc\": {\r\n\t\t\t\ten: \"Extra-Cellular Water / Total Body Water Ratio\",\r\n\t\t\t\tit: \"Rapporto Acqua Extra-Cellulare / Acqua Corporea Totale\",\r\n\t\t\t\tes: \"Proporción Agua Extra-Celular / Agua Corporal Total\",\r\n\t\t\t\tfr: \"Rapport Eau Extra-Cellulaire / Masse Hydrique Totale\",\r\n\t\t\t},\r\n\t\t\t\"segmental-ecwtbw-analysis\": {\r\n\t\t\t\ten: \"Segmental ECW/TBW Ratio Analysis\",\r\n\t\t\t\tit: \"Analisi rapporto AEC/ACT segmentale\",\r\n\t\t\t\tes: \"Análisis de la proporción AEC/ACT segmentaria\",\r\n\t\t\t\tfr: \"Analyse du rapport EEC/MHT segmentaire\",\r\n\t\t\t},\r\n\t\t\t\"phase-angles\": {\r\n\t\t\t\ten: \"Phase Angles\",\r\n\t\t\t\tit: \"Angoli di fase\",\r\n\t\t\t\tes: \"Ángulos de fase\",\r\n\t\t\t\tfr: \"Angles de phase\",\r\n\t\t\t},\r\n\t\t\tunder: {\r\n\t\t\t\ten: \"Under\",\r\n\t\t\t\tit: \"Sotto\",\r\n\t\t\t\tes: \"Por debajo\",\r\n\t\t\t\tfr: \"Inférieur\",\r\n\t\t\t},\r\n\t\t\tnormal: {\r\n\t\t\t\ten: \"Normal\",\r\n\t\t\t\tit: \"Normale\",\r\n\t\t\t\tes: \"Normal\",\r\n\t\t\t\tfr: \"Normal\",\r\n\t\t\t},\r\n\t\t\tover: {\r\n\t\t\t\ten: \"Over\",\r\n\t\t\t\tit: \"Sopra\",\r\n\t\t\t\tes: \"Por encima\",\r\n\t\t\t\tfr: \"Supérieur\",\r\n\t\t\t},\r\n\t\t\thigh: {\r\n\t\t\t\ten: \"High\",\r\n\t\t\t\tit: \"Alto\",\r\n\t\t\t\tes: \"Alto\",\r\n\t\t\t\tfr: \"Élevé\",\r\n\t\t\t},\r\n\t\t\t\"very-high\": {\r\n\t\t\t\ten: \"Very High\",\r\n\t\t\t\tit: \"Molto Alto\",\r\n\t\t\t\tes: \"Muy alto\",\r\n\t\t\t\tfr: \"Très élevé\",\r\n\t\t\t},\r\n\t\t},\r\n\t\tMenu: {\r\n\t\t\t\"user-profile\": {\r\n\t\t\t\ten: \"User Profile\",\r\n\t\t\t\tit: \"Profilo Utente\",\r\n\t\t\t\tes: \"Perfil de usuario\",\r\n\t\t\t\tfr: \"Profil utilisateur\",\r\n\t\t\t},\r\n\t\t\t\"my-journal\": {\r\n\t\t\t\ten: \"My Journal\",\r\n\t\t\t\tit: \"Il Mio Diario\",\r\n\t\t\t\tes: \"Mi Seguimiento\",\r\n\t\t\t\tfr: \"Mon journal\",\r\n\t\t\t},\r\n\t\t\tsummary: {\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\"club-profile\": {\r\n\t\t\t\ten: \"Club Profile\",\r\n\t\t\t\tit: \"Profilo Club\",\r\n\t\t\t\tes: \"Perfil del club\",\r\n\t\t\t\tfr: \"Profil du club\",\r\n\t\t\t},\r\n\t\t},\r\n\t\tClubSlideShowsView: {\r\n\t\t\tslideshow: {\r\n\t\t\t\ten: \"Slideshows\",\r\n\t\t\t\tit: \"Slideshow\",\r\n\t\t\t\tes: \"Slideshow\",\r\n\t\t\t\tfr: \"Slideshow\",\r\n\t\t\t},\r\n\t\t\t\"random-order\": {\r\n\t\t\t\ten: \"Random Order\",\r\n\t\t\t\tit: \"Ordine casuale\",\r\n\t\t\t\tes: \"Orden aleatorio\",\r\n\t\t\t\tfr: \"Ordre aléatoire\",\r\n\t\t\t},\r\n\t\t\t\"slideshow-text\": {\r\n\t\t\t\ten: \"Display a slideshow on your Uptivo monitors during quiet hours. You can use the default Uptivo slideshow, or upload one or more images to your liking (Fullscreen 1920x1005, Half screen 960x1005).\",\r\n\t\t\t\tit: \"Scegli cosa visualizzare sui monitor Uptivo quando non ci sono allenamenti in corso. Puoi mostrare lo slideshow Uptivo (selezione predefinita) o caricare una o più immagini a tua scelta (Fullscreen 1920x1005, Half screen 960x1005).\",\r\n\t\t\t\tes: \"Muestre una presentación de diapositivas en sus monitores Uptivo durante horas tranquilas. Puede usar la presentación de diapositivas Uptivo predeterminada o cargar una o más imágenes a su gusto (Fullscreen 1920x1005, Half screen 960x1005).\",\r\n\t\t\t\tfr: \"Affichez un diaporama sur vos moniteurs Uptivo pendant les heures calmes. Vous pouvez utiliser le diaporama Uptivo par défaut ou télécharger une ou plusieurs images à votre convenance (Fullscreen 1920x1005, Half screen 960x1005).\",\r\n\t\t\t},\r\n\t\t},\r\n\t\tClubLicensesWarningView: {\r\n\t\t\t\"warning-upper\": {\r\n\t\t\t\ten: \"WARNING!\",\r\n\t\t\t\tit: \"ATTENZIONE!\",\r\n\t\t\t\tes: \"¡ADVERTENCIA!\",\r\n\t\t\t\tfr: \"ATTENTION!\",\r\n\t\t\t},\r\n\t\t\t\"club-no-license\": {\r\n\t\t\t\ten: \"The Uptivo Cloud license for {0} does not exist.\",\r\n\t\t\t\tit: \"{0} non ha una licenza Uptivo Cloud.\",\r\n\t\t\t\tes: \"{0} no tiene una licencia Uptivo Cloud.\",\r\n\t\t\t\tfr: \"{0} n'a pas de licence Uptivo Cloud.\",\r\n\t\t\t},\r\n\t\t\t\"club-license-expired\": {\r\n\t\t\t\ten: \"The Uptivo Cloud license for {0} has expired on {1}.\",\r\n\t\t\t\tit: \"La licenza Uptivo Cloud di {0} è scaduta il {1}.\",\r\n\t\t\t\tes: \"La licencia Uptivo Cloud de {0} expiró el {1}.\",\r\n\t\t\t\tfr: \"La licence Uptivo Cloud de {0} a expiré le {1}.\",\r\n\t\t\t},\r\n\t\t\t\"club-license-expiring\": {\r\n\t\t\t\ten: \"The Uptivo Cloud license for {0} will expire on {1}. The system will automatically deactivate upon expiration.\",\r\n\t\t\t\tit: \"La licenza Uptivo Cloud di {0} scadrà il {1}. Il sistema verrà automaticamente disattivato alla scadenza.\",\r\n\t\t\t\tes: \"La licencia Uptivo Cloud de {0} expira el {1}. El sistema se desactivará automáticamente al expirar.\",\r\n\t\t\t\tfr: \"La licence Uptivo Cloud de {0} expire le {1}. Le système se désactivera automatiquement à l'expiration.\",\r\n\t\t\t},\r\n\t\t\t\"please-contact\": {\r\n\t\t\t\ten: 'Please contact sales@uptivo.fit for more information.',\r\n\t\t\t\tit: 'Contatta sales@uptivo.fit per maggiori informazioni.',\r\n\t\t\t\tes: 'Póngase en contacto con sales@uptivo.fit para más información.',\r\n\t\t\t\tfr: 'Contactez sales@uptivo.fit pour plus d\\'informations.',\r\n\t\t\t},\r\n\t\t},\r\n\t\tTimersView: {\r\n\t\t\ttimer: {\r\n\t\t\t\ten: \"Timer\",\r\n\t\t\t\tit: \"Timer\",\r\n\t\t\t\tes: \"Temporizador\",\r\n\t\t\t\tfr: \"Chrono\",\r\n\t\t\t},\r\n\t\t\t\"timer-name\": {\r\n\t\t\t\ten: \"Timer Name\",\r\n\t\t\t\tit: \"Nome Timer\",\r\n\t\t\t\tes: \"Nombre del temporizador\",\r\n\t\t\t\tfr: \"Nom de chrono\",\r\n\t\t\t},\r\n\t\t\t\"circuit-timers\": {\r\n\t\t\t\ten: \"Circuit Timers\",\r\n\t\t\t\tit: \"Timer Circuiti\",\r\n\t\t\t\tes: \"Temporizadores de Circuito\",\r\n\t\t\t\tfr: \"Chronos de Circuit\",\r\n\t\t\t},\r\n\t\t\t\"create-timer\": {\r\n\t\t\t\ten: \"Create Timer\",\r\n\t\t\t\tit: \"Crea Timer\",\r\n\t\t\t\tes: \"Crear temporizador\",\r\n\t\t\t\tfr: \"Créer un chrono\",\r\n\t\t\t},\r\n\t\t\t\"edit-timer\": {\r\n\t\t\t\ten: \"Edit Timer\",\r\n\t\t\t\tit: \"Modifica Timer\",\r\n\t\t\t\tes: \"Editar temporizador\",\r\n\t\t\t\tfr: \"Modifier un chrono\",\r\n\t\t\t},\r\n\t\t\twarmup: {\r\n\t\t\t\ten: \"Warm-up\",\r\n\t\t\t\tit: \"Preparazione\",\r\n\t\t\t\tes: \"Calentamiento\",\r\n\t\t\t\tfr: \"Échauffement\",\r\n\t\t\t},\r\n\t\t\texercises: {\r\n\t\t\t\ten: \"Exercises\",\r\n\t\t\t\tit: \"Esercizi\",\r\n\t\t\t\tes: \"Ejercicios\",\r\n\t\t\t\tfr: \"Exercices\",\r\n\t\t\t},\r\n\t\t\trest: {\r\n\t\t\t\ten: \"Rest\",\r\n\t\t\t\tit: \"Pausa\",\r\n\t\t\t\tes: \"Descanso\",\r\n\t\t\t\tfr: \"Repos\",\r\n\t\t\t},\r\n\t\t\t\"reps-range\": {\r\n\t\t\t\ten: \"Reps Range\",\r\n\t\t\t\tit: \"Intervallo Ripetizioni\",\r\n\t\t\t\tes: \"Rango de repeticiones\",\r\n\t\t\t\tfr: \"Plage de répétitions\",\r\n\t\t\t},\r\n\t\t\tlaps: {\r\n\t\t\t\ten: \"Rounds\",\r\n\t\t\t\tit: \"Circuiti\",\r\n\t\t\t\tes: \"Rondas\",\r\n\t\t\t\tfr: \"Manches\",\r\n\t\t\t},\r\n\t\t\tcooldown: {\r\n\t\t\t\ten: \"Cool Down\",\r\n\t\t\t\tit: \"Pausa Circuiti\",\r\n\t\t\t\tes: \"Descanso Ronda\",\r\n\t\t\t\tfr: \"Retour au calme\",\r\n\t\t\t},\r\n\t\t\t\"duration-format\": {\r\n\t\t\t\ten: \"Enter a duration value in format mm:ss (ex: 01:30)\",\r\n\t\t\t\tit: \"Inserisci una durata nel formato mm:ss (es: 01:30)\",\r\n\t\t\t\tes: \"Inserte un valor de duración en formato mm:ss (ej. 01:30)\",\r\n\t\t\t\tfr: \"Saisir une valeur de durée au format mm:ss (ex: 01:30)\",\r\n\t\t\t},\r\n\t\t},\r\n\t\tContextSelectorView: {\r\n\t\t\t\"selected-club\": {\r\n\t\t\t\ten: \"Selected Club\",\r\n\t\t\t\tit: \"Club Selezionato\",\r\n\t\t\t\tes: \"Club Seleccionado\",\r\n\t\t\t\tfr: \"Club Sélectionné\",\r\n\t\t\t},\r\n\t\t},\r\n\t\tClubSensorsView: {\r\n\t\t\t\"fitness-sensors\": {\r\n\t\t\t\ten: \"Fitness Sensors\",\r\n\t\t\t\tit: \"Sensori Fitness\",\r\n\t\t\t\tes: \"Sensores Fitness\",\r\n\t\t\t\tfr: \"Capteurs Fitness\",\r\n\t\t\t},\r\n\t\t\t\"add-fitness-sensor\": {\r\n\t\t\t\ten: \"Add Fitness Sensor\",\r\n\t\t\t\tit: \"Aggiungi Sensore Fitness\",\r\n\t\t\t\tes: \"Agregar Sensor De Fitness\",\r\n\t\t\t\tfr: \"Ajouter Un Capteur De Fitness\",\r\n\t\t\t},\r\n\t\t\t\"add-uptivo-tracking-sensors\": {\r\n\t\t\t\ten: \"Add Uptivo Tracking Sensors\",\r\n\t\t\t\tit: \"Aggiungi Uptivo Tracking Sensor\",\r\n\t\t\t\tes: \"Agregar Uptivo Tracking Sensors\",\r\n\t\t\t\tfr: \"Ajouter Uptivo Tracking Sensors\",\r\n\t\t\t},\r\n\t\t\t\"other-devices\": {\r\n\t\t\t\ten: \"Other Devices\",\r\n\t\t\t\tit: \"Altri Dispositivi\",\r\n\t\t\t\tes: \"Otros dispositivos\",\r\n\t\t\t\tfr: \"Autres appareils\",\r\n\t\t\t},\r\n\t\t\t\"uptivo-boxing-trackers\": {\r\n\t\t\t\ten: \"Uptivo Boxing Trackers\",\r\n\t\t\t\tit: \"Uptivo Boxing Trackers\",\r\n\t\t\t\tes: \"Uptivo Boxing Trackers\",\r\n\t\t\t\tfr: \"Uptivo Boxing Trackers\",\r\n\t\t\t},\r\n\t\t\t\"device-exists\": {\r\n\t\t\t\ten: \"A device with the same Id {0} already exists in the club!\",\r\n\t\t\t\tit: \"Un dispositivo con lo stesso ID {0} esiste già nel club!\",\r\n\t\t\t\tes: \"¡Ya existe un dispositivo con el mismo ID {0} en el club!\",\r\n\t\t\t\tfr: \"Un appareil avec le même identifiant {0} existe déjà dans le club!\",\r\n\t\t\t},\r\n\t\t\tbike: {\r\n\t\t\t\ten: \"Bike\",\r\n\t\t\t\tit: \"Bike\",\r\n\t\t\t\tes: \"Bici\",\r\n\t\t\t\tfr: \"Vélo\",\r\n\t\t\t},\r\n\t\t},\r\n\t\tIntensityFlowsView: {\r\n\t\t\t\"duration-error\": {\r\n\t\t\t\ten: \"Duration must be at least 15 seconds.\",\r\n\t\t\t\tit: \"La durata deve essere di almeno 15 secondi.\",\r\n\t\t\t\tes: \"La duración debe ser de al menos 15 segundos.\",\r\n\t\t\t\tfr: \"La durée doit être d'au moins 15 secondes.\",\r\n\t\t\t},\r\n\t\t\tsegments: {\r\n\t\t\t\ten: \"Segments\",\r\n\t\t\t\tit: \"Segmenti\",\r\n\t\t\t\tes: \"Segmentos\",\r\n\t\t\t\tfr: \"Segments\",\r\n\t\t\t},\r\n\t\t\t\"begin-error\": {\r\n\t\t\t\ten: \"Begin values must generate a duration of at least 15 seconds.\",\r\n\t\t\t\tit: \"I valori di inizio devono generare una durata di almeno 15 secondi.\",\r\n\t\t\t\tes: \"Los valores iniciales deben generar una duración de al menos 15 segundos.\",\r\n\t\t\t\tfr: \"Les valeurs de départ doivent générer une durée d'au moins 15 secondes.\",\r\n\t\t\t},\r\n\t\t\t\"start-time\": {\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épart\",\r\n\t\t\t},\r\n\t\t\t\"intensity-flows\": {\r\n\t\t\t\ten: \"Intensity Flows\",\r\n\t\t\t\tit: \"Intensity Flow\",\r\n\t\t\t\tes: \"Intensity Flow\",\r\n\t\t\t\tfr: \"Intensity Flow\",\r\n\t\t\t},\r\n\t\t\tflow: {\r\n\t\t\t\ten: \"Flow\",\r\n\t\t\t\tit: \"Flow\",\r\n\t\t\t\tes: \"Flow\",\r\n\t\t\t\tfr: \"Flow\",\r\n\t\t\t},\r\n\t\t\t\"edit-intensity-flow\": {\r\n\t\t\t\ten: \"Edit Intensity Flow\",\r\n\t\t\t\tit: \"Modifica Intensity Flow\",\r\n\t\t\t\tes: \"Editar Intensity Flow\",\r\n\t\t\t\tfr: \"Modifier Intensity Flow\",\r\n\t\t\t},\r\n\t\t\t\"create-intensity-flow\": {\r\n\t\t\t\ten: \"Create Intensity Flow\",\r\n\t\t\t\tit: \"Crea nuovo Intensity Flow\",\r\n\t\t\t\tes: \"Crear un nuevo Intensity Flow\",\r\n\t\t\t\tfr: \"Créer un nouvel Intensity Flow\",\r\n\t\t\t},\r\n\t\t\t\"avg-intensity\": {\r\n\t\t\t\ten: \"Avg Intensity\",\r\n\t\t\t\tit: \"Intensità Med\",\r\n\t\t\t\tes: \"Intensidad promedio\",\r\n\t\t\t\tfr: \"Intensité moy.\",\r\n\t\t\t},\r\n\t\t\tintensity: {\r\n\t\t\t\ten: \"% Intensity\",\r\n\t\t\t\tit: \"% Intensità\",\r\n\t\t\t\tes: \"% Intensidad\",\r\n\t\t\t\tfr: \"% Intensité\",\r\n\t\t\t},\r\n\t\t\t\"total-duration\": {\r\n\t\t\t\ten: \"Total duration\",\r\n\t\t\t\tit: \"Durata totale\",\r\n\t\t\t\tes: \"Duración total\",\r\n\t\t\t\tfr: \"Durée totale\",\r\n\t\t\t},\r\n\t\t\t\"use-cadence\": {\r\n\t\t\t\ten: \"Use Cadence\",\r\n\t\t\t\tit: \"Usa Cadenza\",\r\n\t\t\t\tes: \"Usar Cadencia\",\r\n\t\t\t\tfr: \"Utiliser Cadence\",\r\n\t\t\t},\r\n\t\t\trpm: {\r\n\t\t\t\ten: \"RPM\",\r\n\t\t\t\tit: \"RPM\",\r\n\t\t\t\tes: \"RPM\",\r\n\t\t\t\tfr: \"RPM\",\r\n\t\t\t},\r\n\t\t\tno: {\r\n\t\t\t\ten: \"No\",\r\n\t\t\t\tit: \"No\",\r\n\t\t\t\tes: \"No\",\r\n\t\t\t\tfr: \"Non\",\r\n\t\t\t},\r\n\t\t},\r\n\t\tClubProfileView: {\r\n\t\t\t\"max-weekly-bookings\": {\r\n\t\t\t\ten: \"Max Weekly Bookings\",\r\n\t\t\t\tit: \"Prenotazioni Massime Settimanali\",\r\n\t\t\t\tes: \"Reservas Máximas Semanales\",\r\n\t\t\t\tfr: \"Réservations Hebdomadaires Max\",\r\n\t\t\t},\r\n\t\t\t\"max-monthly-bookings\": {\r\n\t\t\t\ten: \"Max Monthly Bookings\",\r\n\t\t\t\tit: \"Prenotazioni Massime Mensili\",\r\n\t\t\t\tes: \"Reservas Máximas Mensuales\",\r\n\t\t\t\tfr: \"Réservations Mensuelles Max\",\r\n\t\t\t},\r\n\t\t\t\"booking-limits\": {\r\n\t\t\t\ten: \"Limits (without subscriptions)\",\r\n\t\t\t\tit: \"Limiti (in assenza abbonamenti)\",\r\n\t\t\t\tes: \"Límites (sin suscripciones)\",\r\n\t\t\t\tfr: \"Limites (sans abonnements)\",\r\n\t\t\t},\r\n\t\t\tbookings: {\r\n\t\t\t\ten: \"Bookings\",\r\n\t\t\t\tit: \"Prenotazioni\",\r\n\t\t\t\tes: \"Reservas\",\r\n\t\t\t\tfr: \"Réservations\",\r\n\t\t\t},\r\n\t\t\t\"athlete-age-period\": {\r\n\t\t\t\ten: 'Display \"new user\" dots for 3 periods of',\r\n\t\t\t\tit: 'Mostra pallini \"nuovo utente\" per 3 periodi di',\r\n\t\t\t\tes: 'Mostrar puntos de \"nuevo usuario\" durante 3 períodos de',\r\n\t\t\t\tfr: 'Afficher les points \"nouvel utilisateur\" pendant 3 périodes de',\r\n\t\t\t},\r\n\t\t\t\"welcome-users-after\": {\r\n\t\t\t\ten: \"Welcome users who return after\",\r\n\t\t\t\tit: \"Dà il benvenuto a utente che torna dopo\",\r\n\t\t\t\tes: \"Bienvenido a un usuario que vuelve después de\",\r\n\t\t\t\tfr: \"Bienvenue à un utilisateur qui revient après\",\r\n\t\t\t},\r\n\t\t\t\"remind-users-use-uptivo\": {\r\n\t\t\t\ten: \"Remind users to use Uptivo after\",\r\n\t\t\t\tit: \"Ricorda all'utente di usare Uptivo dopo\",\r\n\t\t\t\tes: \"Recuérdale al usuario que utilice Uptivo después de\",\r\n\t\t\t\tfr: \"Rappelez à l'utilisateur d'utiliser Uptivo après\",\r\n\t\t\t},\r\n\t\t\t\"first-training-welcome\": {\r\n\t\t\t\ten: \"First Training Email\",\r\n\t\t\t\tit: \"Email al primo allenamento\",\r\n\t\t\t\tes: \"Correo electrónico en el primer entrenamiento\",\r\n\t\t\t\tfr: \"E-mail au premier entraînement\",\r\n\t\t\t},\r\n\t\t\t\"x-weeks\": {\r\n\t\t\t\ten: \"{0} weeks\",\r\n\t\t\t\tit: \"{0} settimane\",\r\n\t\t\t\tes: \"{0} semanas\",\r\n\t\t\t\tfr: \"{0} semaines\",\r\n\t\t\t},\r\n\t\t\t\"club-information\": {\r\n\t\t\t\ten: \"Club Profile\",\r\n\t\t\t\tit: \"Profilo Del Club\",\r\n\t\t\t\tes: \"Perfil Del Club\",\r\n\t\t\t\tfr: \"Profil Du Club\",\r\n\t\t\t},\r\n\t\t\ttags: {\r\n\t\t\t\ten: \"Groups\",\r\n\t\t\t\tit: \"Gruppi\",\r\n\t\t\t\tes: \"Grupos\",\r\n\t\t\t\tfr: \"Groupes\",\r\n\t\t\t},\r\n\t\t\t\"default-booking-settings\": {\r\n\t\t\t\ten: \"Default Booking Settings\",\r\n\t\t\t\tit: \"Impostazioni Prenotazione Predefinite\",\r\n\t\t\t\tes: \"Configuración De Reserva Predeterminada\",\r\n\t\t\t\tfr: \"Paramètres De Réservation Par Défaut\",\r\n\t\t\t},\r\n\t\t\t\"club-name\": {\r\n\t\t\t\ten: \"Club Name\",\r\n\t\t\t\tit: \"Nome Club\",\r\n\t\t\t\tes: \"Nombre del club\",\r\n\t\t\t\tfr: \"Nom du club\",\r\n\t\t\t},\r\n\t\t\t\"club-exists\": {\r\n\t\t\t\ten: \"Club '{0}' already exists!\",\r\n\t\t\t\tit: \"Il club con nome '{0}' esiste già!\",\r\n\t\t\t\tes: \"¡Club '{0}' ya existe!\",\r\n\t\t\t\tfr: \"Le club '{0}' existe déjà!\",\r\n\t\t\t},\r\n\t\t\t\"delete-club\": {\r\n\t\t\t\ten: \"Delete Club\",\r\n\t\t\t\tit: \"Elimina Club\",\r\n\t\t\t\tes: \"Eliminar club\",\r\n\t\t\t\tfr: \"Supprimer le club\",\r\n\t\t\t},\r\n\t\t\taddress: {\r\n\t\t\t\ten: \"Address\",\r\n\t\t\t\tit: \"Indirizzo\",\r\n\t\t\t\tes: \"Dirección\",\r\n\t\t\t\tfr: \"Adresse\",\r\n\t\t\t},\r\n\t\t\twebsite: {\r\n\t\t\t\ten: \"Web Site\",\r\n\t\t\t\tit: \"Sito Web\",\r\n\t\t\t\tes: \"Web del sitio\",\r\n\t\t\t\tfr: \"Site web\",\r\n\t\t\t},\r\n\t\t\t\"club-policy\": {\r\n\t\t\t\ten: \"Club Policy\",\r\n\t\t\t\tit: \"Club Policy\",\r\n\t\t\t\tes: \"Club Policy\",\r\n\t\t\t\tfr: \"Club Policy\",\r\n\t\t\t},\r\n\t\t\t\"club-profile\": {\r\n\t\t\t\ten: \"Club Profile\",\r\n\t\t\t\tit: \"Profilo Club\",\r\n\t\t\t\tes: \"Perfil del club\",\r\n\t\t\t\tfr: \"Profil du club\",\r\n\t\t\t},\r\n\t\t\t\"add-club\": {\r\n\t\t\t\ten: \"Add Club\",\r\n\t\t\t\tit: \"Aggiungi Club\",\r\n\t\t\t\tes: \"Agregar Club\",\r\n\t\t\t\tfr: \"Ajouter un club\",\r\n\t\t\t},\r\n\t\t\t\"uptivo-bar-preview\": {\r\n\t\t\t\ten: \"Preview of Uptivo Bridge\",\r\n\t\t\t\tit: \"Anteprima di Uptivo Bridge\",\r\n\t\t\t\tes: \"Vista previa de Uptivo Bridge\",\r\n\t\t\t\tfr: \"Aperçu de Uptivo Bridge\",\r\n\t\t\t},\r\n\t\t\t\"enable-user-rankings\": {\r\n\t\t\t\ten: \"Enable the Users Rankings\",\r\n\t\t\t\tit: \"Abilita le classifiche degli utenti\",\r\n\t\t\t\tes: \"Activar las clasificaciones de los usuarios\",\r\n\t\t\t\tfr: \"Activer le classement des utilisateurs\",\r\n\t\t\t},\r\n\t\t\t\"enable-trainer-rankings\": {\r\n\t\t\t\ten: \"Enable the Trainers Rankings\",\r\n\t\t\t\tit: \"Abilita le classifiche dei trainer\",\r\n\t\t\t\tes: \"Activar las clasificaciones de los entrenadores\",\r\n\t\t\t\tfr: \"Activer le classement des entraîneurs\",\r\n\t\t\t},\r\n\t\t\t\"enable-online-payments\": {\r\n\t\t\t\ten: \"Enable Online Payments\",\r\n\t\t\t\tit: \"Abilita Pagamenti Online\",\r\n\t\t\t\tes: \"Activar Pagos en Línea\",\r\n\t\t\t\tfr: \"Activer les Paiements Online\",\r\n\t\t\t},\r\n\t\t\t\"enable-uptivo-store\": {\r\n\t\t\t\ten: \"Enable Uptivo Store\",\r\n\t\t\t\tit: \"Abilita Uptivo Store\",\r\n\t\t\t\tes: \"Activar Uptivo Store\",\r\n\t\t\t\tfr: \"Activer la Boutique Uptivo\",\r\n\t\t\t},\r\n\t\t\t\"online-payments\": {\r\n\t\t\t\ten: \"Online Payments\",\r\n\t\t\t\tit: \"Pagamenti Online\",\r\n\t\t\t\tes: \"Pagos en Línea\",\r\n\t\t\t\tfr: \"Paiements Online\",\r\n\t\t\t},\r\n\t\t\tstate: {\r\n\t\t\t\ten: \"State\",\r\n\t\t\t\tit: \"Stato\",\r\n\t\t\t\tes: \"Condición\",\r\n\t\t\t\tfr: \"Condition\",\r\n\t\t\t},\r\n\t\t\t\"not-configured\": {\r\n\t\t\t\ten: \"Not Configured\",\r\n\t\t\t\tit: \"Non configurato\",\r\n\t\t\t\tes: \"No configurado\",\r\n\t\t\t\tfr: \"Pas configuré\",\r\n\t\t\t},\r\n\t\t\t\"payment-services\": {\r\n\t\t\t\ten: \"Payment Services\",\r\n\t\t\t\tit: \"Servizi Di Pagamento\",\r\n\t\t\t\tes: \"Servicios de pago\",\r\n\t\t\t\tfr: \"Services de paiement\",\r\n\t\t\t},\r\n\t\t\tOnboarding: {\r\n\t\t\t\ten: \"Configuration not completed\",\r\n\t\t\t\tit: \"Configurazione non completata\",\r\n\t\t\t\tes: \"Configuración no completada\",\r\n\t\t\t\tfr: \"Configuration non terminée\",\r\n\t\t\t},\r\n\t\t\tInactive: {\r\n\t\t\t\ten: \"Inactive\",\r\n\t\t\t\tit: \"Non attivo\",\r\n\t\t\t\tes: \"Inactivo\",\r\n\t\t\t\tfr: \"Inactif\",\r\n\t\t\t},\r\n\t\t\tActive: {\r\n\t\t\t\ten: \"Active\",\r\n\t\t\t\tit: \"Attivo\",\r\n\t\t\t\tes: \"Activo\",\r\n\t\t\t\tfr: \"Actif\",\r\n\t\t\t},\r\n\t\t\tMissingData: {\r\n\t\t\t\ten: \"Missing data\",\r\n\t\t\t\tit: \"Dati mancanti\",\r\n\t\t\t\tes: \"Datos perdidos\",\r\n\t\t\t\tfr: \"Données manquantes\",\r\n\t\t\t},\r\n\t\t\tconfigure: {\r\n\t\t\t\ten: \"Configure\",\r\n\t\t\t\tit: \"Configura\",\r\n\t\t\t\tes: \"Configurar\",\r\n\t\t\t\tfr: \"Configurer\",\r\n\t\t\t},\r\n\t\t\topen: {\r\n\t\t\t\ten: \"Open\",\r\n\t\t\t\tit: \"Apri\",\r\n\t\t\t\tes: \"Abre\",\r\n\t\t\t\tfr: \"Ouvert\",\r\n\t\t\t},\r\n\t\t\t\"currency-required\": {\r\n\t\t\t\ten: \"Currency is required\",\r\n\t\t\t\tit: \"È richiesta la valuta\",\r\n\t\t\t\tes: \"Se requiere moneda\",\r\n\t\t\t\tfr: \"La devise est requise\",\r\n\t\t\t},\r\n\t\t\t\"payment-account-succesfully-removed\": {\r\n\t\t\t\ten: \"Payment account successfully removed\",\r\n\t\t\t\tit: \"Account di pagamento rimosso con successo\",\r\n\t\t\t\tes: \"Cuenta de pago eliminada con éxito\",\r\n\t\t\t\tfr: \"Compte de paiement supprimé avec succès\",\r\n\t\t\t},\r\n\t\t\t\"stripe-description\": {\r\n\t\t\t\ten: \"Payments from your customers will be credited to your Stripe account. STRIPE fees per transaction:\",\r\n\t\t\t\tit: \"I pagamenti dei tuoi clienti verranno accreditati sul tuo account Stripe. Commissioni STRIPE per transazione:\",\r\n\t\t\t\tes: \"Los pagos de sus clientes se acreditarán en su cuenta de Stripe. Tarifas de STRIPE por transacción:\",\r\n\t\t\t\tfr: \"Les paiements de vos clients seront crédités sur votre compte Stripe. Frais STRIPE par transaction:\",\r\n\t\t\t},\r\n\t\t\t\"paypal-description\": {\r\n\t\t\t\ten: \"Payments from your customers will be credited to your PayPal account. PAYPAL fees per transaction:\",\r\n\t\t\t\tit: \"I pagamenti dei tuoi clienti verranno accreditati sul tuo account PayPal. Commissioni PAYPAL per transazione:\",\r\n\t\t\t\tes: \"Los pagos de sus clientes se acreditarán en su cuenta de PayPal. Tarifas de PAYPAL por transacción:\",\r\n\t\t\t\tfr: \"Les paiements de vos clients seront crédités sur votre compte PayPal. Frais PAYPAL par transaction:\",\r\n\t\t\t},\r\n\t\t\t\"uptivo-commission\": {\r\n\t\t\t\ten: \"Uptivo fees per transaction: 1% for each transaction.\",\r\n\t\t\t\tit: \"Commissioni Uptivo per transazione: 1% per ogni transazione.\",\r\n\t\t\t\tes: \"Tarifas de Uptivo por transacción: 1% por cada transacción.\",\r\n\t\t\t\tfr: \"Frais d'Uptivo par transaction: 1% pour chaque transaction.\",\r\n\t\t\t},\r\n\t\t\t\"paypal-confirm-email\": {\r\n\t\t\t\ten: \"Attention: Please confirm your email address on https://www.paypal.com/businessprofile/settings in order to receive payments! You currently cannot receive payments.\",\r\n\t\t\t\tit: \"Attenzione: conferma il tuo indirizzo email su https://www.paypal.com/businessprofile/settings per ricevere i pagamenti! Al momento non puoi ricevere pagamenti.\",\r\n\t\t\t\tes: \"Atención: ¡Confirme su dirección de correo electrónico en https://www.paypal.com/businessprofile/settings para recibir pagos! Actualmente no puede recibir pagos.\",\r\n\t\t\t\tfr: \"Attention: Veuillez confirmer votre adresse e-mail sur https://www.paypal.com/businessprofile/settings afin de recevoir les paiements! Vous ne pouvez actuellement pas recevoir de paiements.\",\r\n\t\t\t},\r\n\t\t\t\"paypal-no-payments\": {\r\n\t\t\t\ten: \"Attention: You currently cannot receive payments due to restriction on your PayPal account. Please reach out to PayPal Customer Support or connect to https://www.paypal.com for more information.\",\r\n\t\t\t\tit: \"Attenzione: al momento non puoi ricevere pagamenti a causa di restrizioni sul tuo conto PayPal. Contatta l'Assistenza clienti PayPal o connettiti a https://www.paypal.com per ulteriori informazioni.\",\r\n\t\t\t\tes: \"Atención: actualmente no puede recibir pagos debido a la restricción en su cuenta de PayPal. Comuníquese con Atención al cliente de PayPal o conéctese a https://www.paypal.com para obtener más información.\",\r\n\t\t\t\tfr: \"Attention : Vous ne pouvez actuellement pas recevoir de paiements en raison d'une restriction sur votre compte PayPal. Veuillez contacter le service clientèle de PayPal ou vous connecter à https://www.paypal.com pour plus d'informations.\",\r\n\t\t\t},\r\n\t\t\t\"stripe-no-payments\": {\r\n\t\t\t\ten: \"Attention: You currently cannot receive payments due to restriction on your Stripe account. Please reach out to Stripe Customer Support or connect to https://stripe.com/ for more information.\",\r\n\t\t\t\tit: \"Attenzione: al momento non puoi ricevere pagamenti a causa di restrizioni sul tuo conto Stripe. Contatta l'Assistenza clienti Stripe o connettiti a https://stripe.com/ per ulteriori informazioni.\",\r\n\t\t\t\tes: \"Atención: actualmente no puede recibir pagos debido a la restricción en su cuenta de Stripe. Comuníquese con Atención al cliente de Stripe o conéctese a https://stripe.com/ para obtener más información.\",\r\n\t\t\t\tfr: \"Attention : Vous ne pouvez actuellement pas recevoir de paiements en raison d'une restriction sur votre compte Stripe. Veuillez contacter le service clientèle de Stripe ou vous connecter à https://stripe.com/ pour plus d'informations.\",\r\n\t\t\t},\r\n\t\t\t\"club-code\": {\r\n\t\t\t\ten: \"Club Code\",\r\n\t\t\t\tit: \"Codice Club\",\r\n\t\t\t\tes: \"Código de Club\",\r\n\t\t\t\tfr: \"Code du Club\",\r\n\t\t\t},\r\n\t\t\t\"club-code-text\": {\r\n\t\t\t\ten: \"Invite your friends to purchase Uptivo with your Club Code to extend your Uptivo Cloud subscription for free.\",\r\n\t\t\t\tit: \"Invita i tuoi amici ad acquistare Uptivo con il tuo Codice Club per estendere gratuitamente il tuo abbonamento Uptivo Cloud.\",\r\n\t\t\t\tes: \"Invita a tus amigos a comprar Uptivo con tu Código de Club para extender tu suscripción a Uptivo Cloud gratis.\",\r\n\t\t\t\tfr: \"Invitez vos amis à acheter Uptivo avec votre code club pour prolonger votre abonnement Uptivo Cloud gratuitement.\",\r\n\t\t\t},\r\n\t\t\t\"discount-code\": {\r\n\t\t\t\ten: \"Discount Code\",\r\n\t\t\t\tit: \"Codice Sconto\",\r\n\t\t\t\tes: \"Código de Descuento\",\r\n\t\t\t\tfr: \"Code de Réduction\",\r\n\t\t\t},\r\n\t\t\t\"discount-code-text\": {\r\n\t\t\t\ten: \"Communicate to your members the discount code for the Uptivo store, so that they can have access to discounts and offers reserved for your Club (General conditions of Sale).\",\r\n\t\t\t\tit: \"Comunica ai tuoi membri il codice sconto per lo store Uptivo, in modo che possano aver accesso a sconti e offerte riservate al tuo Club (Condizioni Generali di Vendita).\",\r\n\t\t\t\tes: \"Comunica a tus socios el código de descuento del store Uptivo, para que tengan acceso a descuentos y ofertas reservadas para tu Club (Condiciones Generales de Venta).\",\r\n\t\t\t\tfr: \"Communiquez à vos membres le code de réduction de la boutique Uptivo, afin qu'ils puissent avoir accès aux réductions et offres réservées à votre Club (Conditions Générales de Vente).\",\r\n\t\t\t},\r\n\t\t\tlicenses: {\r\n\t\t\t\ten: \"Licenses\",\r\n\t\t\t\tit: \"Licenze\",\r\n\t\t\t\tes: \"Licencias\",\r\n\t\t\t\tfr: \"Licences\",\r\n\t\t\t},\r\n\t\t\t\"show-hide-all\": {\r\n\t\t\t\ten: \"Show/Hide All\",\r\n\t\t\t\tit: \"Mostra/Nascondi Tutto\",\r\n\t\t\t\tes: \"Mostrar/Ocultar todo\",\r\n\t\t\t\tfr: \"Afficher/Masquer tout\",\r\n\t\t\t},\r\n\t\t\t\"lic-no-valid\": {\r\n\t\t\t\ten: \"No valid licenses!\",\r\n\t\t\t\tit: \"Non ci sono licenze valide!\",\r\n\t\t\t\tes: \"¡Sin licencias válidas!\",\r\n\t\t\t\tfr: \"Aucune licence valide!\",\r\n\t\t\t},\r\n\t\t\t\"DurationExtension-LM\": {\r\n\t\t\t\ten: \"{0} used your Club code to become an Uptivo customer. You have been rewarded with {1} days of free cloud!\",\r\n\t\t\t\tit: \"{0} ha usato il tuo codice club per il suo primo acquisto Uptivo. Hai ottenuto {1} giorni di cloud gratuito!\",\r\n\t\t\t\tes: \"{0} ha usado tu código club para su primera compra de la solución Uptivo. ¡Te regalamos {1} días gratuitos de nube!\",\r\n\t\t\t\tfr: \"{0} a utilisé votre code club pour acheter Uptivo pour la première fois. Nous vous avons récompensé avec {1} jours de cloud gratuits!\",\r\n\t\t\t},\r\n\t\t\tredeem: {\r\n\t\t\t\ten: \"Redeem\",\r\n\t\t\t\tit: \"Attiva\",\r\n\t\t\t\tes: \"Redimir\",\r\n\t\t\t\tfr: \"Racheter\",\r\n\t\t\t},\r\n\t\t\toptions: {\r\n\t\t\t\ten: \"Options\",\r\n\t\t\t\tit: \"Opzioni\",\r\n\t\t\t\tes: \"Opciones\",\r\n\t\t\t\tfr: \"Options\",\r\n\t\t\t},\r\n\t\t\t\"cannot-suspend-an-inactive-subscription\": {\r\n\t\t\t\ten: \"Can't suspend an inactive subscription\",\r\n\t\t\t\tit: \"Impossibile sospendere un abbonamento inattivo\",\r\n\t\t\t\tes: \"No se puede suspender una suscripción inactiva\",\r\n\t\t\t\tfr: \"Impossible de suspendre un abonnement inactif\",\r\n\t\t\t},\r\n\t\t\t\"subscription-succesfully-edited\": {\r\n\t\t\t\ten: \"Subscription changed successfully\",\r\n\t\t\t\tit: \"Abbonamento modificato con successo\",\r\n\t\t\t\tes: \"Suscripción cambiada con éxito\",\r\n\t\t\t\tfr: \"Abonnement modifié avec succès\",\r\n\t\t\t},\r\n\t\t\t\"add-new-tag\": {\r\n\t\t\t\ten: \"Add New Group\",\r\n\t\t\t\tit: \"Aggiungi Nuovo Gruppo\",\r\n\t\t\t\tes: \"Agregar Nuevo Grupo\",\r\n\t\t\t\tfr: \"Ajouter Nouveau Groupe\",\r\n\t\t\t},\r\n\t\t\t\"tag-name\": {\r\n\t\t\t\ten: \"Group Name\",\r\n\t\t\t\tit: \"Nome Gruppo\",\r\n\t\t\t\tes: \"Nombre De Grupo\",\r\n\t\t\t\tfr: \"Nom de la Groupe\",\r\n\t\t\t},\r\n\t\t\t\"edit-tag\": {\r\n\t\t\t\ten: \"Edit Group\",\r\n\t\t\t\tit: \"Modifica Gruppo\",\r\n\t\t\t\tes: \"Editar Grupo\",\r\n\t\t\t\tfr: \"Modifier Groupe\",\r\n\t\t\t},\r\n\t\t\ttag: {\r\n\t\t\t\ten: \"Group\",\r\n\t\t\t\tit: \"Gruppo\",\r\n\t\t\t\tes: \"Grupo\",\r\n\t\t\t\tfr: \"Groupe\",\r\n\t\t\t},\r\n\t\t},\r\n\t\tClubLicensesView: {\r\n\t\t\t\"club-code\": {\r\n\t\t\t\ten: \"Club Code\",\r\n\t\t\t\tit: \"Codice Club\",\r\n\t\t\t\tes: \"Código de Club\",\r\n\t\t\t\tfr: \"Code du Club\",\r\n\t\t\t},\r\n\t\t\t\"club-code-text\": {\r\n\t\t\t\ten: \"Invite your friends to purchase Uptivo with your Club Code to extend your Uptivo Cloud subscription for free.\",\r\n\t\t\t\tit: \"Invita i tuoi amici ad acquistare Uptivo con il tuo Codice Club per estendere gratuitamente il tuo abbonamento Uptivo Cloud.\",\r\n\t\t\t\tes: \"Invita a tus amigos a comprar Uptivo con tu Código de Club para extender tu suscripción a Uptivo Cloud gratis.\",\r\n\t\t\t\tfr: \"Invitez vos amis à acheter Uptivo avec votre code club pour prolonger votre abonnement Uptivo Cloud gratuitement.\",\r\n\t\t\t},\r\n\t\t\tlicenses: {\r\n\t\t\t\ten: \"License\",\r\n\t\t\t\tit: \"Licenze\",\r\n\t\t\t\tes: \"Licencias\",\r\n\t\t\t\tfr: \"Licences\",\r\n\t\t\t},\r\n\t\t\t\"show-hide-all\": {\r\n\t\t\t\ten: \"Show/Hide All\",\r\n\t\t\t\tit: \"Mostra/Nascondi Tutto\",\r\n\t\t\t\tes: \"Mostrar/Ocultar todo\",\r\n\t\t\t\tfr: \"Afficher/Masquer tout\",\r\n\t\t\t},\r\n\t\t\t\"lic-no-valid\": {\r\n\t\t\t\ten: \"No valid licenses!\",\r\n\t\t\t\tit: \"Non ci sono licenze valide!\",\r\n\t\t\t\tes: \"¡Sin licencias válidas!\",\r\n\t\t\t\tfr: \"Aucune licence valide!\",\r\n\t\t\t},\r\n\t\t\t\"DurationExtension-LM\": {\r\n\t\t\t\ten: \"{0} used your Club code to become an Uptivo customer. You have been rewarded with {1} days of free cloud!\",\r\n\t\t\t\tit: \"{0} ha usato il tuo codice club per il suo primo acquisto Uptivo. Hai ottenuto {1} giorni di cloud gratuito!\",\r\n\t\t\t\tes: \"{0} ha usado tu código club para su primera compra de la solución Uptivo. ¡Te regalamos {1} días gratuitos de nube!\",\r\n\t\t\t\tfr: \"{0} a utilisé votre code club pour acheter Uptivo pour la première fois. Nous vous avons récompensé avec {1} jours de cloud gratuits!\",\r\n\t\t\t},\r\n\t\t\tredeem: {\r\n\t\t\t\ten: \"Redeem\",\r\n\t\t\t\tit: \"Attiva\",\r\n\t\t\t\tes: \"Redimir\",\r\n\t\t\t\tfr: \"Racheter\",\r\n\t\t\t},\r\n\t\t},\r\n\t\tClubLicenseView: {\r\n\t\t\t\"lic-type\": {\r\n\t\t\t\ten: \"License Type\",\r\n\t\t\t\tit: \"Tipo Licenza\",\r\n\t\t\t\tes: \"Tipo de licencia\",\r\n\t\t\t\tfr: \"Type de licence\",\r\n\t\t\t},\r\n\t\t\t\"lic-apps\": {\r\n\t\t\t\ten: \"Trainer Apps\",\r\n\t\t\t\tit: \"Trainer App\",\r\n\t\t\t\tes: \"Aplicaciones para entrenadores\",\r\n\t\t\t\tfr: \"Applis Trainer\",\r\n\t\t\t},\r\n\t\t\t\"lic-hr-sensors\": {\r\n\t\t\t\ten: \"Heart Rate Sensors\",\r\n\t\t\t\tit: \"Sensori Cardio\",\r\n\t\t\t\tes: \"Sensores de FC\",\r\n\t\t\t\tfr: \"Capteurs de FC\",\r\n\t\t\t},\r\n\t\t\t\"third-party-sensors\": {\r\n\t\t\t\ten: \"Third-party\",\r\n\t\t\t\tit: \"Altre marche\",\r\n\t\t\t\tes: \"Otras marcas\",\r\n\t\t\t\tfr: \"Autres marques\",\r\n\t\t\t},\r\n\t\t\t\"lic-trial\": {\r\n\t\t\t\ten: \"Trial\",\r\n\t\t\t\tit: \"Prova\",\r\n\t\t\t\tes: \"Prueba\",\r\n\t\t\t\tfr: \"Essai\",\r\n\t\t\t},\r\n\t\t\t\"lic-valid\": {\r\n\t\t\t\ten: \"Valid\",\r\n\t\t\t\tit: \"Valida\",\r\n\t\t\t\tes: \"Válido\",\r\n\t\t\t\tfr: \"Valide\",\r\n\t\t\t},\r\n\t\t},\r\n\t\tBrandView: {\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\"edit-club\": {\r\n\t\t\t\ten: \"Edit Club\",\r\n\t\t\t\tit: \"Modifica Club\",\r\n\t\t\t\tes: \"Editar club\",\r\n\t\t\t\tfr: \"Modifier le club\",\r\n\t\t\t},\r\n\t\t\t\"brand-data-updated\": {\r\n\t\t\t\ten: \"Successfully updated brand data\",\r\n\t\t\t\tit: \"Dati del Brand modificati con successo\",\r\n\t\t\t\tes: \"Datos de la marca actualizados con éxito\",\r\n\t\t\t\tfr: \"Données de marque mises à jour avec succès\",\r\n\t\t\t},\r\n\t\t\t\"brand-profile\": {\r\n\t\t\t\ten: \"Brand Profile\",\r\n\t\t\t\tit: \"Profilo Brand\",\r\n\t\t\t\tes: \"Perfil de la marca\",\r\n\t\t\t\tfr: \"Profil de la marque\",\r\n\t\t\t},\r\n\t\t\t\"brand-information\": {\r\n\t\t\t\ten: \"Brand Information\",\r\n\t\t\t\tit: \"Informazioni Brand\",\r\n\t\t\t\tes: \"Información de la marca\",\r\n\t\t\t\tfr: \"Informations de la marque\",\r\n\t\t\t},\r\n\t\t\t\"brand-name\": {\r\n\t\t\t\ten: \"Brand Name\",\r\n\t\t\t\tit: \"Nome Brand\",\r\n\t\t\t\tes: \"Nombre de la marca\",\r\n\t\t\t\tfr: \"Nom de marque\",\r\n\t\t\t},\r\n\t\t\t\"add-new-club\": {\r\n\t\t\t\ten: \"Add New Club\",\r\n\t\t\t\tit: \"Aggiungi Club\",\r\n\t\t\t\tes: \"Añadir nuevo club\",\r\n\t\t\t\tfr: \"Ajouter nouveau club\",\r\n\t\t\t},\r\n\t\t\t\"use-logo-for-all\": {\r\n\t\t\t\ten: \"Use brand logo for all Clubs\",\r\n\t\t\t\tit: \"Usa il logo del brand per tutti i Club\",\r\n\t\t\t\tes: \"Usar el logotipo de la marca para todos los clubes\",\r\n\t\t\t\tfr: \"Utiliser le logo de la marque pour tous les clubs\",\r\n\t\t\t},\r\n\t\t},\r\n\t\tImageUploaderView: {\r\n\t\t\t\"drag-label\": {\r\n\t\t\t\ten: \"Click or drop your image here\",\r\n\t\t\t\tit: \"Clicca o trascina la tua immagine qui\",\r\n\t\t\t\tes: \"Haga clic o suelte su imagen aquí\",\r\n\t\t\t\tfr: \"Cliquez ou déposez votre image ici\",\r\n\t\t\t},\r\n\t\t\t\"loading-label\": {\r\n\t\t\t\ten: \"Loading image…\",\r\n\t\t\t\tit: \"Caricamento immagine…\",\r\n\t\t\t\tes: \"Cargando imagen…\",\r\n\t\t\t\tfr: \"Chargement de l'image…\",\r\n\t\t\t},\r\n\t\t},\r\n\t\tAccountView: {\r\n\t\t\t\"email-updated\": {\r\n\t\t\t\ten: \"Successfully updated Email address\",\r\n\t\t\t\tit: \"Indirizzo Email modificato con successo\",\r\n\t\t\t\tes: \"Dirección de correo electrónico actualizada correctamente\",\r\n\t\t\t\tfr: \"Adresse e-mail mise à jour avec succès\",\r\n\t\t\t},\r\n\t\t\t\"email-exists\": {\r\n\t\t\t\ten: \"Email {0} already exists!\",\r\n\t\t\t\tit: \"L'email {0} è già in uso!\",\r\n\t\t\t\tes: \"¡El email {0} ya existe!\",\r\n\t\t\t\tfr: \"L'e-mail {0} existe déjà!\",\r\n\t\t\t},\r\n\t\t\tconflict: {\r\n\t\t\t\ten: \"Conflict\",\r\n\t\t\t\tit: \"Conflitto\",\r\n\t\t\t\tes: \"Conflicto\",\r\n\t\t\t\tfr: \"Conflit\",\r\n\t\t\t},\r\n\t\t\t\"confirm-email-required\": {\r\n\t\t\t\ten: \"Confirm Email is required\",\r\n\t\t\t\tit: \"Conferma Email è un campo obbligatorio\",\r\n\t\t\t\tes: \"El correo electrónico de confirmación es obligatorio\",\r\n\t\t\t\tfr: \"Il est nécessaire de confirmer l'adresse e-mail\",\r\n\t\t\t},\r\n\t\t\t\"new-email-required\": {\r\n\t\t\t\ten: \"New Email is required\",\r\n\t\t\t\tit: \"Nuova Email è un campo obbligatorio\",\r\n\t\t\t\tes: \"Se requiere el nuevo correo electrónico\",\r\n\t\t\t\tfr: \"Une nouvelle adresse e-mail est requise\",\r\n\t\t\t},\r\n\t\t\t\"updated-club-info\": {\r\n\t\t\t\ten: \"Successfully updated clubs information\",\r\n\t\t\t\tit: \"Informazioni Club modificate con successo\",\r\n\t\t\t\tes: \"Información de clubes actualizada correctamente\",\r\n\t\t\t\tfr: \"Informations sur les clubs mises à jour avec succès\",\r\n\t\t\t},\r\n\t\t\t\"created-club\": {\r\n\t\t\t\ten: \"Successfully created a new club\",\r\n\t\t\t\tit: \"Club creato con successo\",\r\n\t\t\t\tes: \"Ha creado un nuevo club correctamente\",\r\n\t\t\t\tfr: \"Création réussie d'un nouveau club\",\r\n\t\t\t},\r\n\t\t\t\"updated-account-info\": {\r\n\t\t\t\ten: \"Successfully updated account information\",\r\n\t\t\t\tit: \"Informazioni account modificate con successo\",\r\n\t\t\t\tes: \"Información de la cuenta actualizada correctamente\",\r\n\t\t\t\tfr: \"Informations sur le compte mises à jour avec succès\",\r\n\t\t\t},\r\n\t\t\t\"email-required\": {\r\n\t\t\t\ten: \"Email is required\",\r\n\t\t\t\tit: \"Email è un campo obbligatorio\",\r\n\t\t\t\tes: \"Se requiere una dirección de correo electrónico\",\r\n\t\t\t\tfr: \"Une adresse e-mail est requise\",\r\n\t\t\t},\r\n\t\t\t\"nickname-required\": {\r\n\t\t\t\ten: \"Nickname is required\",\r\n\t\t\t\tit: \"Nickname è un campo obbligatorio\",\r\n\t\t\t\tes: \"Se requiere un apodo\",\r\n\t\t\t\tfr: \"Pseudo requis\",\r\n\t\t\t},\r\n\t\t\t\"account-information\": {\r\n\t\t\t\ten: \"Account Information\",\r\n\t\t\t\tit: \"Informazioni Account\",\r\n\t\t\t\tes: \"Información de la cuenta\",\r\n\t\t\t\tfr: \"Informations de compte\",\r\n\t\t\t},\r\n\t\t\t\"first-name\": {\r\n\t\t\t\ten: \"First/Mid Name\",\r\n\t\t\t\tit: \"Nome\",\r\n\t\t\t\tes: \"Nombre\",\r\n\t\t\t\tfr: \"Prénoms\",\r\n\t\t\t},\r\n\t\t\t\"last-name\": {\r\n\t\t\t\ten: \"Last Name\",\r\n\t\t\t\tit: \"Cognome\",\r\n\t\t\t\tes: \"Apellido\",\r\n\t\t\t\tfr: \"Nom\",\r\n\t\t\t},\r\n\t\t\t\"leave-club\": {\r\n\t\t\t\ten: \"Leave Club\",\r\n\t\t\t\tit: \"Lascia il Club\",\r\n\t\t\t\tes: \"Dejar club\",\r\n\t\t\t\tfr: \"Quitter le club\",\r\n\t\t\t},\r\n\t\t\t\"no-clubs-so-far\": {\r\n\t\t\t\ten: \"No clubs so far\",\r\n\t\t\t\tit: \"Non ci sono club\",\r\n\t\t\t\tes: \"De momento, no hay clubes\",\r\n\t\t\t\tfr: \"Aucun club jusqu'à présent\",\r\n\t\t\t},\r\n\t\t\t\"delete-account\": {\r\n\t\t\t\ten: \"Delete account\",\r\n\t\t\t\tit: \"Elimina Account\",\r\n\t\t\t\tes: \"Eliminar cuenta\",\r\n\t\t\t\tfr: \"Supprimer le compte\",\r\n\t\t\t},\r\n\t\t\tadvanced: {\r\n\t\t\t\ten: \"Advanced\",\r\n\t\t\t\tit: \"Avanzate\",\r\n\t\t\t\tes: \"Avanzado\",\r\n\t\t\t\tfr: \"Avancé\",\r\n\t\t\t},\r\n\t\t\t\"delete-account-info\": {\r\n\t\t\t\ten: \"You are about to delete your account. To confirm type email you use for login and Uptivo notifications\",\r\n\t\t\t\tit: \"Stai per eliminare il tuo account. Per confermare, scrivi l'email che usi per login e notifiche di Uptivo\",\r\n\t\t\t\tes: \"Está a punto de eliminar su cuenta. Para confirmar, inserte el correo electrónico que utiliza para iniciar sesión y las notificaciones Uptivo\",\r\n\t\t\t\tfr: \"Vous êtes sur le point de supprimer votre compte. Pour confirmer, saisir l'adresse e-mail utilisée pour la connexion et les notifications Uptivo\",\r\n\t\t\t},\r\n\t\t},\r\n\t\tAddUsersView: {\r\n\t\t\tinvited: {\r\n\t\t\t\ten: \"Invited\",\r\n\t\t\t\tit: \"Invitato\",\r\n\t\t\t\tes: \"Invitado\",\r\n\t\t\t\tfr: \"Invité\",\r\n\t\t\t},\r\n\t\t\tcreated: {\r\n\t\t\t\ten: \"Created\",\r\n\t\t\t\tit: \"Creato\",\r\n\t\t\t\tes: \"Creado\",\r\n\t\t\t\tfr: \"Créé\",\r\n\t\t\t},\r\n\t\t\t\"pending-users\": {\r\n\t\t\t\ten: \"Pending Users\",\r\n\t\t\t\tit: \"Utenti in Sospeso\",\r\n\t\t\t\tes: \"Usuarios pendientes\",\r\n\t\t\t\tfr: \"Utilisateurs en attente\",\r\n\t\t\t},\r\n\t\t\t\"self-service\": {\r\n\t\t\t\ten: \"Self-Service\",\r\n\t\t\t\tit: \"Fai da Te\",\r\n\t\t\t\tes: \"Autoservicio\",\r\n\t\t\t\tfr: \"En Libre Service\",\r\n\t\t\t},\r\n\t\t\t\"send-link-label\": {\r\n\t\t\t\ten: \"Let the user create their own profile and join the club\",\r\n\t\t\t\tit: \"Consenti all'utente di creare il proprio profilo e di unirsi al club\",\r\n\t\t\t\tes: \"Deje que el usuario cree su propio perfil y únase al club\",\r\n\t\t\t\tfr: \"Laissez l'utilisateur créer son propre profil et rejoindre le club\",\r\n\t\t\t},\r\n\t\t\t\"send-link\": {\r\n\t\t\t\ten: \"Send email\",\r\n\t\t\t\tit: \"Invia email\",\r\n\t\t\t\tes: \"Enviar correo\",\r\n\t\t\t\tfr: \"Envoyer e-mail\",\r\n\t\t\t},\r\n\t\t\t\"create-new-user-label\": {\r\n\t\t\t\ten: \"Make life easier for your member and create their profile\",\r\n\t\t\t\tit: \"Semplifica la vita al tuo utente e crea il suo profilo\",\r\n\t\t\t\tes: \"Haz la vida más fácil a tu miembro y crea su perfil\",\r\n\t\t\t\tfr: \"Facilitez la vie de votre membre et créez son profil\",\r\n\t\t\t},\r\n\t\t\t\"create-new-user\": {\r\n\t\t\t\ten: \"Create Profile\",\r\n\t\t\t\tit: \"Crea il Profilo\",\r\n\t\t\t\tes: \"Crear Perfil\",\r\n\t\t\t\tfr: \"Créer un Profil\",\r\n\t\t\t},\r\n\t\t\t\"sent-on\": {\r\n\t\t\t\ten: \"Sent On\",\r\n\t\t\t\tit: \"Mandato Il\",\r\n\t\t\t\tes: \"Enviado el\",\r\n\t\t\t\tfr: \"Envoyé le\",\r\n\t\t\t},\r\n\t\t\t\"expires-on\": {\r\n\t\t\t\ten: \"Expires On\",\r\n\t\t\t\tit: \"Scade Il\",\r\n\t\t\t\tes: \"Caduca en\",\r\n\t\t\t\tfr: \"Expire le\",\r\n\t\t\t},\r\n\t\t\t\"date-of-birth-required\": {\r\n\t\t\t\ten: \"Date of Birth is required\",\r\n\t\t\t\tit: \"Data di Nascita è un campo obbligatorio\",\r\n\t\t\t\tes: \"Se requiere fecha de nacimiento\",\r\n\t\t\t\tfr: \"La date de naissance est requise\",\r\n\t\t\t},\r\n\t\t\t\"date-no-greater-than-now\": {\r\n\t\t\t\ten: \"Date can't be in future\",\r\n\t\t\t\tit: \"La data non può essere nel futuro\",\r\n\t\t\t\tes: \"La fecha no puede ser en el futuro\",\r\n\t\t\t\tfr: \"La date ne peut pas être une date future\",\r\n\t\t\t},\r\n\t\t\t\"gender-is-required\": {\r\n\t\t\t\ten: \"Gender is required\",\r\n\t\t\t\tit: \"Sesso è un campo obbligatorio\",\r\n\t\t\t\tes: \"Se requiere rellenar el sexo\",\r\n\t\t\t\tfr: \"Le sexe est requis\",\r\n\t\t\t},\r\n\t\t\t\"height-is-required\": {\r\n\t\t\t\ten: \"Height is required\",\r\n\t\t\t\tit: \"Altezza è un campo obbligatorio\",\r\n\t\t\t\tes: \"Se requiere la altura\",\r\n\t\t\t\tfr: \"La taille est requise\",\r\n\t\t\t},\r\n\t\t\t\"weight-is-required\": {\r\n\t\t\t\ten: \"Weight is required\",\r\n\t\t\t\tit: \"Peso è un campo obbligatorio\",\r\n\t\t\t\tes: \"Se requiere el peso\",\r\n\t\t\t\tfr: \"Le poids est requis\",\r\n\t\t\t},\r\n\t\t\t\"user-created-title\": {\r\n\t\t\t\ten: \"User added to the Club\",\r\n\t\t\t\tit: \"Utente aggiunto al club\",\r\n\t\t\t\tes: \"Usuario agregado al club\",\r\n\t\t\t\tfr: \"Utilisateur ajouté au club\",\r\n\t\t\t},\r\n\t\t\t\"user-created-details\": {\r\n\t\t\t\ten: \"The invitation must be accepted within 14 days or the user will be removed from Uptivo.\",\r\n\t\t\t\tit: \"L'utente ha 14 giorni per accettare l'invito o verrà rimosso da Uptivo.\",\r\n\t\t\t\tes: \"La invitación debe aceptarse dentro de los 14 días o el usuario será eliminado de Uptivo.\",\r\n\t\t\t\tfr: \"L'invitation doit être acceptée dans les 14 jours. Dans le cas contraire, l'utilisateur sera supprimé d'Uptivo.\",\r\n\t\t\t},\r\n\t\t\t\"user-invited-title\": {\r\n\t\t\t\ten: \"Invitation sent\",\r\n\t\t\t\tit: \"Invito inviato\",\r\n\t\t\t\tes: \"Invitación enviada\",\r\n\t\t\t\tfr: \"Invitation envoyée\",\r\n\t\t\t},\r\n\t\t\t\"user-invited-details\": {\r\n\t\t\t\ten: \"The user will be added to your Club as soon as the invite is accepted.\",\r\n\t\t\t\tit: \"L'utente verrà aggiunto al tuo Club quando accetterà l'invito.\",\r\n\t\t\t\tes: \"El usuario será agregado a su Club tan pronto como se acepte la invitación.\",\r\n\t\t\t\tfr: \"L'utilisateur sera ajouté à votre Club dès l'invitation acceptée.\",\r\n\t\t\t},\r\n\t\t\t\"the-user-with-email\": {\r\n\t\t\t\ten: \"The user with email\",\r\n\t\t\t\tit: \"L'utente con email\",\r\n\t\t\t\tes: \"El usuario con el correo electrónico\",\r\n\t\t\t\tfr: \"L'utilisateur titulaire de l'adresse e-mail\",\r\n\t\t\t},\r\n\t\t\t\"is-already-member\": {\r\n\t\t\t\ten: \"is already member of your club.\",\r\n\t\t\t\tit: \"è già membro del tuo club.\",\r\n\t\t\t\tes: \"ya es miembro de su club.\",\r\n\t\t\t\tfr: \"est déjà membre de votre club.\",\r\n\t\t\t},\r\n\t\t\t\"waiting-confirm\": {\r\n\t\t\t\ten: \"Waiting Confirmation\",\r\n\t\t\t\tit: \"In attesa di conferma\",\r\n\t\t\t\tes: \"Esperando confirmación\",\r\n\t\t\t\tfr: \"En attente de confirmation\",\r\n\t\t\t},\r\n\t\t\t\"create-new-invitation-qr-code\": {\r\n\t\t\t\ten: \"Create new invitation QR Code\",\r\n\t\t\t\tit: \"Crea nuovo QR Code di invito\",\r\n\t\t\t\tes: \"Crea nuevo código QR de invitación\",\r\n\t\t\t\tfr: \"Créer nouvelle invitation QR Code\",\r\n\t\t\t},\r\n\t\t\t\"edit-invitation-qr-code\": {\r\n\t\t\t\ten: \"Edit invitation QR Code\",\r\n\t\t\t\tit: \"Modifica QR Code di invito\",\r\n\t\t\t\tes: \"Cambiar el código QR de la invitación\",\r\n\t\t\t\tfr: \"Changer le QR Code d'invitation\",\r\n\t\t\t},\r\n\t\t\t\"qr-code\": {\r\n\t\t\t\ten: \"QR Code\",\r\n\t\t\t\tit: \"Codice QR\",\r\n\t\t\t\tes: \"QR Code\",\r\n\t\t\t\tfr: \"QR Code\",\r\n\t\t\t},\r\n\t\t\tlink: {\r\n\t\t\t\ten: \"Link\",\r\n\t\t\t\tit: \"Link\",\r\n\t\t\t\tes: \"Link\",\r\n\t\t\t\tfr: \"Link\",\r\n\t\t\t},\r\n\t\t\t\"invitation-qr-codes\": {\r\n\t\t\t\ten: \"Invitation QR Codes\",\r\n\t\t\t\tit: \"Codici QR Di Invito\",\r\n\t\t\t\tes: \"Códigos QR De Invitación\",\r\n\t\t\t\tfr: \"Codes QR D'Invitation\",\r\n\t\t\t},\r\n\t\t\t\"the-qr-code-will-be-deactivated\": {\r\n\t\t\t\ten: \"The QR Code will be deactivated\",\r\n\t\t\t\tit: \"Il QR Code verrà disattivato\",\r\n\t\t\t\tes: \"El código QR se desactivará\",\r\n\t\t\t\tfr: \"Le QR Code sera désactivé\",\r\n\t\t\t},\r\n\t\t\t\"the-qr-code-will-be-reactivated\": {\r\n\t\t\t\ten: \"The QR Code will be reactivated\",\r\n\t\t\t\tit: \"Il QR Code verrà riattivato\",\r\n\t\t\t\tes: \"El código QR se reactivará\",\r\n\t\t\t\tfr: \"Le QR Code sera réactivé\",\r\n\t\t\t},\r\n\t\t},\r\n\t\tDemoUsersView: {\r\n\t\t\t\"demo-users\": {\r\n\t\t\t\ten: \"Demo Users\",\r\n\t\t\t\tit: \"Utenti Demo\",\r\n\t\t\t\tes: \"Usuarios demo\",\r\n\t\t\t\tfr: \"Utilisateurs Démo\",\r\n\t\t\t},\r\n\t\t\t\"demo-user\": {\r\n\t\t\t\ten: \"Demo User\",\r\n\t\t\t\tit: \"Utente Demo\",\r\n\t\t\t\tes: \"Usuario demo\",\r\n\t\t\t\tfr: \"Utilisateur Démo\",\r\n\t\t\t},\r\n\t\t\t\"manage-demo-users\": {\r\n\t\t\t\ten: \"Manage Demo Users\",\r\n\t\t\t\tit: \"Gestione Utenti Demo\",\r\n\t\t\t\tes: \"Administrar usuarios demo\",\r\n\t\t\t\tfr: \"Gérer les Utilisateurs Démo\",\r\n\t\t\t},\r\n\t\t\t\"add-demo-sensor\": {\r\n\t\t\t\ten: \"Add Demo User\",\r\n\t\t\t\tit: \"Aggiungi Utente Demo\",\r\n\t\t\t\tes: \"Agregar usuario demo\",\r\n\t\t\t\tfr: \"Ajouter un Utilisateur Démo\",\r\n\t\t\t},\r\n\t\t\t\"display-group-id\": {\r\n\t\t\t\ten: \"Room Id\",\r\n\t\t\t\tit: \"Id Sala\",\r\n\t\t\t\tes: \"Id Sala\",\r\n\t\t\t\tfr: \"Id Salle\",\r\n\t\t\t},\r\n\t\t\t\"demo-user-created\": {\r\n\t\t\t\ten: \"Successfully created demo user\",\r\n\t\t\t\tit: \"Utente demo creato con successo\",\r\n\t\t\t\tes: \"Usuario demo creado correctamente\",\r\n\t\t\t\tfr: \"Utilisateur Démo créé avec succès\",\r\n\t\t\t},\r\n\t\t\t\"demo-user-updated\": {\r\n\t\t\t\ten: \"Successfully updated demo user\",\r\n\t\t\t\tit: \"Utente modificato con successo\",\r\n\t\t\t\tes: \"Usuario de demostración actualizado correctamente\",\r\n\t\t\t\tfr: \"Utilisateur Démo mis à jour avec succès\",\r\n\t\t\t},\r\n\t\t\t\"default-display\": {\r\n\t\t\t\ten: \"Default Room\",\r\n\t\t\t\tit: \"Sala di Default\",\r\n\t\t\t\tes: \"Sala predeterminada\",\r\n\t\t\t\tfr: \"Salle par défaut\",\r\n\t\t\t},\r\n\t\t\t\"sensor-id\": {\r\n\t\t\t\ten: \"Sensor ID\",\r\n\t\t\t\tit: \"ID Sensore\",\r\n\t\t\t\tes: \"ID del sensor\",\r\n\t\t\t\tfr: \"Identifiant du capteur\",\r\n\t\t\t},\r\n\t\t\tmodel: {\r\n\t\t\t\ten: \"Model\",\r\n\t\t\t\tit: \"Modello\",\r\n\t\t\t\tes: \"Modelo\",\r\n\t\t\t\tfr: \"Modèle\",\r\n\t\t\t},\r\n\t\t},\r\n\t\tAddOrUpdateUptivoBelt: {\r\n\t\t\t\"invalid-uptivo-belt-number\": {\r\n\t\t\t\ten: \"The Uptivo Sensor ID is incorrect\",\r\n\t\t\t\tit: \"L'ID del Sensore Uptivo non è corretto\",\r\n\t\t\t\tes: \"El ID del Sensor Uptivo es incorrecto\",\r\n\t\t\t\tfr: \"L'identifiant du Capteur Uptivo est incorrect\",\r\n\t\t\t},\r\n\t\t},\r\n\t\tAddOrUpdateMZBelt: {\r\n\t\t\t\"invalid-mz-belt-number\": {\r\n\t\t\t\ten: \"The MZ Sensor SN is incorrect\",\r\n\t\t\t\tit: \"Il SN del Sensore MZ non è corretto\",\r\n\t\t\t\tes: \"El SN del Sensor MZ es incorrecto\",\r\n\t\t\t\tfr: \"Le SN du Capteur MZ est incorrect\",\r\n\t\t\t},\r\n\t\t},\r\n\t\tAddOrUpdateGarminBelt: {\r\n\t\t\t\"invalid-garmin-belt-number\": {\r\n\t\t\t\ten: \"The Garmin Sensor SN is incorrect\",\r\n\t\t\t\tit: \"Il SN del Sensore Garmin non è corretto\",\r\n\t\t\t\tes: \"El SN del Sensor Garmin es incorrecto\",\r\n\t\t\t\tfr: \"Le SN du Capteur Garmin est incorrect\",\r\n\t\t\t},\r\n\t\t},\r\n\r\n\t\tAppManagementView: {\r\n\t\t\t\"app-management\": {\r\n\t\t\t\ten: \"Trainer Apps\",\r\n\t\t\t\tit: \"Trainer App\",\r\n\t\t\t\tes: \"Trainer App\",\r\n\t\t\t\tfr: \"Trainer App\",\r\n\t\t\t},\r\n\t\t\t\"registered-apps\": {\r\n\t\t\t\ten: \"Registered Apps\",\r\n\t\t\t\tit: \"App registrate\",\r\n\t\t\t\tes: \"Aplicaciones registradas\",\r\n\t\t\t\tfr: \"Applications enregistrées\",\r\n\t\t\t},\r\n\t\t\t\"generate-code\": {\r\n\t\t\t\ten: \"Generate Code\",\r\n\t\t\t\tit: \"Genera Codice\",\r\n\t\t\t\tes: \"Generar código\",\r\n\t\t\t\tfr: \"Générer le code\",\r\n\t\t\t},\r\n\t\t\t\"pending-registrations\": {\r\n\t\t\t\ten: \"Pending Registrations\",\r\n\t\t\t\tit: \"Registrazioni in Sospeso\",\r\n\t\t\t\tes: \"Registros pendientes\",\r\n\t\t\t\tfr: \"Inscriptions en attente\",\r\n\t\t\t},\r\n\t\t},\r\n\t\tIntegrationsView: {\r\n\t\t\tintegrations: {\r\n\t\t\t\ten: \"Integrations\",\r\n\t\t\t\tit: \"Integrazioni\",\r\n\t\t\t\tes: \"Integraciones\",\r\n\t\t\t\tfr: \"Intégrations\",\r\n\t\t\t},\r\n\t\t\t\"edit-device\": {\r\n\t\t\t\ten: \"Edit Device\",\r\n\t\t\t\tit: \"Modifica il dispositivo\",\r\n\t\t\t\tes: \"Editar dispositivo\",\r\n\t\t\t\tfr: \"Modifier un appareil\",\r\n\t\t\t},\r\n\t\t\t\"create-device\": {\r\n\t\t\t\ten: \"Add New Device\",\r\n\t\t\t\tit: \"Aggiungi Nuovo Dispositivo\",\r\n\t\t\t\tes: \"Añadir nuevo dispositivo\",\r\n\t\t\t\tfr: \"Ajouter un nouvel appareil\",\r\n\t\t\t},\r\n\t\t\t\"device-type\": {\r\n\t\t\t\ten: \"Device Type\",\r\n\t\t\t\tit: \"Tipo dispositivo\",\r\n\t\t\t\tes: \"Tipo de dispositivo\",\r\n\t\t\t\tfr: \"Type d'appareil\",\r\n\t\t\t},\r\n\t\t\t\"device-model\": {\r\n\t\t\t\ten: \"Device Model\",\r\n\t\t\t\tit: \"Modello dispositivo\",\r\n\t\t\t\tes: \"Modelo de dispositivo\",\r\n\t\t\t\tfr: \"Modèle d'appareil\",\r\n\t\t\t},\r\n\t\t\t\"club-devices\": {\r\n\t\t\t\ten: \"Club Devices\",\r\n\t\t\t\tit: \"Dispositivi del Club\",\r\n\t\t\t\tes: \"Dispositivos del club\",\r\n\t\t\t\tfr: \"Appareils du club\",\r\n\t\t\t},\r\n\t\t\t\"ip-address\": {\r\n\t\t\t\ten: \"IP Address\",\r\n\t\t\t\tit: \"Indirizzo IP\",\r\n\t\t\t\tes: \"Dirección de IP\",\r\n\t\t\t\tfr: \"Adresse IP\",\r\n\t\t\t},\r\n\t\t\tBodyCompositionAnalyzer: {\r\n\t\t\t\ten: \"Body Composition Analyzer\",\r\n\t\t\t\tit: \"Analizzatore di composizione corporea\",\r\n\t\t\t\tes: \"Analizador de composición corporal\",\r\n\t\t\t\tfr: \"Analyseur de composition corporelle\",\r\n\t\t\t},\r\n\t\t\t\"no-devices\": {\r\n\t\t\t\ten: \"No Devices Configured\",\r\n\t\t\t\tit: \"Nessun dispositivo configurato\",\r\n\t\t\t\tes: \"Sin dispositivos configurados\",\r\n\t\t\t\tfr: \"Aucun appareil configuré\",\r\n\t\t\t},\r\n\t\t},\r\n\t\tDeviceManagementView: {\r\n\t\t\t\"ant-disconnected\": {\r\n\t\t\t\ten: \"Some of the Uptivo Bridges are missing the ANT+ USB Antenna\",\r\n\t\t\t\tit: \"Alcuni degli Uptivo Bridge non hanno l'Antenna USB ANT+\",\r\n\t\t\t\tes: \"Algunos de los Uptivo Bridge les falta la antena USB ANT+\",\r\n\t\t\t\tfr: \"Certains des Uptivo Bridge n'ont pas l'antenne USB ANT+\",\r\n\t\t\t},\r\n\t\t\t\"disconnected-nodes\": {\r\n\t\t\t\ten: \"Some of the Uptivo Bridges cannot communicate with each other\",\r\n\t\t\t\tit: \"Alcuni Uptivo Bridge non sono in grado di comunicare tra loro\",\r\n\t\t\t\tes: \"Algunos de los Uptivo Bridge no pueden comunicarse entre sí\",\r\n\t\t\t\tfr: \"Certains des Uptivo Bridge ne peuvent pas communiquer entre eux\",\r\n\t\t\t},\r\n\t\t\t\"not-online\": {\r\n\t\t\t\ten: \"Some of the Uptivo Bridges are off-line\",\r\n\t\t\t\tit: \"Alcuni Uptivo Bridge sono disconnessi o spenti\",\r\n\t\t\t\tes: \"Algunos Uptivo Bridge están desconectados o apagados\",\r\n\t\t\t\tfr: \"Certains Uptivo Brige sont déconnectés ou désactivés\",\r\n\t\t\t},\r\n\t\t\t\"error-last-hour\": {\r\n\t\t\t\ten: \"Some of the Uptivo Bridges experienced network errors in the last hour\",\r\n\t\t\t\tit: \"Alcuni Uptivo Bridge hanno segnalato errori di rete nell'ultima ora\",\r\n\t\t\t\tes: \"Algunos Uptivo Bridge han reportado errores de red en la última hora\",\r\n\t\t\t\tfr: \"Certains Uptivo Bridge ont signalé des erreurs de réseau au cours de la dernière heure\",\r\n\t\t\t},\r\n\t\t\t\"connection-problems\": {\r\n\t\t\t\ten: \"Connection problems\",\r\n\t\t\t\tit: \"Problemi di connessione\",\r\n\t\t\t\tes: \"Problemas de conexión\",\r\n\t\t\t\tfr: \"Problèmes de connexion\",\r\n\t\t\t},\r\n\t\t\t\"uptivo-bridges\": {\r\n\t\t\t\ten: \"Uptivo Bridges\",\r\n\t\t\t\tit: \"Uptivo Bridge\",\r\n\t\t\t\tes: \"Uptivo Bridge\",\r\n\t\t\t\tfr: \"Uptivo Bridge\",\r\n\t\t\t},\r\n\t\t\t\"display-groups\": {\r\n\t\t\t\ten: \"Rooms\",\r\n\t\t\t\tit: \"Sale\",\r\n\t\t\t\tes: \"Salas\",\r\n\t\t\t\tfr: \"Salles\",\r\n\t\t\t},\r\n\t\t\t\"register-new-bridge\": {\r\n\t\t\t\ten: \"Register New Uptivo Bridge\",\r\n\t\t\t\tit: \"Registra nuovo Uptivo Bridge\",\r\n\t\t\t\tes: \"Registrar Nuevo Uptivo Bridge\",\r\n\t\t\t\tfr: \"Enregistrement d'un nouvel Uptivo Bridge\",\r\n\t\t\t},\r\n\t\t\t\"generate-code\": {\r\n\t\t\t\ten: \"Generate Code\",\r\n\t\t\t\tit: \"Genera Codice\",\r\n\t\t\t\tes: \"Generar código\",\r\n\t\t\t\tfr: \"Générer le code\",\r\n\t\t\t},\r\n\t\t\t\"pending-registrations\": {\r\n\t\t\t\ten: \"Pending Registrations\",\r\n\t\t\t\tit: \"Registrazioni in Sospeso\",\r\n\t\t\t\tes: \"Registros pendientes\",\r\n\t\t\t\tfr: \"Inscriptions en attente\",\r\n\t\t\t},\r\n\t\t\t\"add-new-display-group\": {\r\n\t\t\t\ten: \"Add new Room\",\r\n\t\t\t\tit: \"Aggiungi nuova Sala\",\r\n\t\t\t\tes: \"Agregar nueva Sala\",\r\n\t\t\t\tfr: \"Ajouter une nouvelle Salle\",\r\n\t\t\t},\r\n\t\t\t\"rename-display-group\": {\r\n\t\t\t\ten: \"Rename Room\",\r\n\t\t\t\tit: \"Rinomina Sala\",\r\n\t\t\t\tes: \"Cambiar nombre de Sala\",\r\n\t\t\t\tfr: \"Renommer la Salle\",\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\"name-required\": {\r\n\t\t\t\ten: \"Name is required\",\r\n\t\t\t\tit: \"Nome è un campo obbligatorio\",\r\n\t\t\t\tes: \"Se require el nombre\",\r\n\t\t\t\tfr: \"Nom requis\",\r\n\t\t\t},\r\n\t\t\t\"select-valid-color\": {\r\n\t\t\t\ten: \"Please select a valid color\",\r\n\t\t\t\tit: \"Selezionare un colore valido\",\r\n\t\t\t\tes: \"Seleccione un color válido\",\r\n\t\t\t\tfr: \"Sélectionnez une couleur valide\",\r\n\t\t\t},\r\n\t\t\t\"added-device-group\": {\r\n\t\t\t\ten: \"Successfully added Device Group\",\r\n\t\t\t\tit: \"Gruppo Monitor aggiunto con successo\",\r\n\t\t\t\tes: \"Grupo de dispositivos agregado correctamente\",\r\n\t\t\t\tfr: \"Groupe de périphériques ajouté avec succès\",\r\n\t\t\t},\r\n\t\t\t\"bridge-name\": {\r\n\t\t\t\ten: \"Uptivo Bridge Name\",\r\n\t\t\t\tit: \"Nome Uptivo Bridge\",\r\n\t\t\t\tes: \"Nombre de Uptivo Bridge\",\r\n\t\t\t\tfr: \"Nom de l'Uptivo Bridge\",\r\n\t\t\t},\r\n\t\t\t\"ip-address\": {\r\n\t\t\t\ten: \"IP Address\",\r\n\t\t\t\tit: \"Indirizzo IP\",\r\n\t\t\t\tes: \"Dirección de IP\",\r\n\t\t\t\tfr: \"Adresse IP\",\r\n\t\t\t},\r\n\t\t\t\"added-on\": {\r\n\t\t\t\ten: \"Added on\",\r\n\t\t\t\tit: \"Aggiunto Il\",\r\n\t\t\t\tes: \"Añadido en\",\r\n\t\t\t\tfr: \"Ajouté le\",\r\n\t\t\t},\r\n\t\t\t\"move-to\": {\r\n\t\t\t\ten: \"Move To\",\r\n\t\t\t\tit: \"Sposta\",\r\n\t\t\t\tes: \"Mover a\",\r\n\t\t\t\tfr: \"Déplacer vers\",\r\n\t\t\t},\r\n\t\t\t\"successfully-deleted-device\": {\r\n\t\t\t\ten: \"Successfully deleted Uptivo Bridge\",\r\n\t\t\t\tit: \"Uptivo Bridge rimosso con successo\",\r\n\t\t\t\tes: \"Dispositivo eliminado correctamente\",\r\n\t\t\t\tfr: \"Uptivo Bridge supprimé avec succès\",\r\n\t\t\t},\r\n\t\t\t\"successfully-renamed-group\": {\r\n\t\t\t\ten: \"Successfully renamed room\",\r\n\t\t\t\tit: \"Sala rinominata con successo\",\r\n\t\t\t\tes: \"Sala renombrada con éxito\",\r\n\t\t\t\tfr: \"Salle renommé avec succès\",\r\n\t\t\t},\r\n\t\t\t\"successfully-deleted-group\": {\r\n\t\t\t\ten: \"Successfully deleted room\",\r\n\t\t\t\tit: \"Sala cancellata con successo\",\r\n\t\t\t\tes: \"Sala eliminada correctamente\",\r\n\t\t\t\tfr: \"Salle supprimé avec succès\",\r\n\t\t\t},\r\n\t\t\tcode: {\r\n\t\t\t\ten: \"Code\",\r\n\t\t\t\tit: \"Codice\",\r\n\t\t\t\tes: \"Código\",\r\n\t\t\t\tfr: \"Code\",\r\n\t\t\t},\r\n\t\t\t\"required-on\": {\r\n\t\t\t\ten: \"Required On\",\r\n\t\t\t\tit: \"Richiesto Il\",\r\n\t\t\t\tes: \"Requerido en\",\r\n\t\t\t\tfr: \"Requis le\",\r\n\t\t\t},\r\n\t\t},\r\n\t\tEditUserView: {\r\n\t\t\t\"edit-user\": {\r\n\t\t\t\ten: \"Edit User\",\r\n\t\t\t\tit: \"Modifica Utente\",\r\n\t\t\t\tes: \"Editar Usuario\",\r\n\t\t\t\tfr: \"Modifier l'utilisateur\",\r\n\t\t\t},\r\n\t\t\t\"leave-club\": {\r\n\t\t\t\ten: \"Leave Club\",\r\n\t\t\t\tit: \"Lascia il Club\",\r\n\t\t\t\tes: \"Dejar club\",\r\n\t\t\t\tfr: \"Quitter le club\",\r\n\t\t\t},\r\n\t\t\t\"yes-delete\": {\r\n\t\t\t\ten: \"Yes, delete!\",\r\n\t\t\t\tit: \"Sì, elimina!\",\r\n\t\t\t\tes: \"¡Sí, borrar!\",\r\n\t\t\t\tfr: \"Oui, supprimer!\",\r\n\t\t\t},\r\n\t\t\t\"will-remove-from-club\": {\r\n\t\t\t\ten: \"You will be removed from this club.\",\r\n\t\t\t\tit: \"Verrai rimosso da questo club.\",\r\n\t\t\t\tes: \"Serás eliminado de este club.\",\r\n\t\t\t\tfr: \"Vous serez retiré de ce club.\",\r\n\t\t\t},\r\n\t\t\t\"you-have-been-deleted\": {\r\n\t\t\t\ten: \"You have been deleted from the club.\",\r\n\t\t\t\tit: \"Sei stato rimosso dal club.\",\r\n\t\t\t\tes: \"Has sido eliminado del club.\",\r\n\t\t\t\tfr: \"Vous avez été supprimé du club.\",\r\n\t\t\t},\r\n\t\t\t\"form-invalid\": {\r\n\t\t\t\ten: \"Form invalid\",\r\n\t\t\t\tit: \"Modulo invalido\",\r\n\t\t\t\tes: \"Formulario no válido\",\r\n\t\t\t\tfr: \"Formulaire invalide\",\r\n\t\t\t},\r\n\t\t\t\"fix-values\": {\r\n\t\t\t\ten: \"Please correct the requested data before saving\",\r\n\t\t\t\tit: \"Correggere i dati richiesti per poter salvare\",\r\n\t\t\t\tes: \"Por favor, corrija los datos solicitados antes de guardar\",\r\n\t\t\t\tfr: \"Veuillez corriger les données requises avant de sauvegarder\",\r\n\t\t\t},\r\n\t\t\t\"fix-limits\": {\r\n\t\t\t\ten: \"Please fix the zone limits data before saving\",\r\n\t\t\t\tit: \"Correggere i limiti delle zone prima di salvare\",\r\n\t\t\t\tes: \"Corrija los datos de límites de zona antes de guardar\",\r\n\t\t\t\tfr: \"Veuillez corriger les données de limites de zone avant d'enregistrer\",\r\n\t\t\t},\r\n\t\t\t\"successfully-updated-physical\": {\r\n\t\t\t\ten: \"Successfully updated physical settings\",\r\n\t\t\t\tit: \"Impostazioni biometriche modificate con successo\",\r\n\t\t\t\tes: \"Configuraciones físicas actualizadas correctamente\",\r\n\t\t\t\tfr: \"Les paramètres physiques ont été mis à jour avec succès\",\r\n\t\t\t},\r\n\t\t\t\"sensor-created\": {\r\n\t\t\t\ten: \"Successfully created sensor\",\r\n\t\t\t\tit: \"Sensore creato con successo\",\r\n\t\t\t\tes: \"Sensor creado correctamente\",\r\n\t\t\t\tfr: \"Capteur créé avec succès\",\r\n\t\t\t},\r\n\t\t\t\"remove-sensor-confirm\": {\r\n\t\t\t\ten: \"Are you sure you want to remove this sensor\",\r\n\t\t\t\tit: \"Sei sicuro di voler rimuovere questo sensore?\",\r\n\t\t\t\tes: \"¿Estás seguro de que quieres quitar este sensor?\",\r\n\t\t\t\tfr: \"Êtes-vous sûr de vouloir supprimer ce capteur?\",\r\n\t\t\t},\r\n\t\t\t\"sensor-removed-succesfully\": {\r\n\t\t\t\ten: \"Sensor removed successfully\",\r\n\t\t\t\tit: \"Sensore rimosso con successo\",\r\n\t\t\t\tes: \"Sensor eliminado correctamente\",\r\n\t\t\t\tfr: \"Capteur supprimé avec succès\",\r\n\t\t\t},\r\n\t\t\t\"uptivo-sensor-id\": {\r\n\t\t\t\ten: \"Uptivo Sensor ID\",\r\n\t\t\t\tit: \"ID del Sensore Uptivo\",\r\n\t\t\t\tes: \"ID del Sensor Uptivo\",\r\n\t\t\t\tfr: \"Identifiant du Capteur Uptivo\",\r\n\t\t\t},\r\n\t\t\t\"show-in-rankings\": {\r\n\t\t\t\ten: \"Show In Rankings\",\r\n\t\t\t\tit: \"Mostra Nelle Classifiche\",\r\n\t\t\t\tes: \"Mostrar En Clasificaciones\",\r\n\t\t\t\tfr: \"Afficher Dans Les Classements\",\r\n\t\t\t},\r\n\t\t\t\"send-fitness-test-notification\": {\r\n\t\t\t\ten: \"Send Fitness Test Notification\",\r\n\t\t\t\tit: \"Invia Notifica Fitness Test\",\r\n\t\t\t\tes: \"Enviar Notificación de Fitness Test\",\r\n\t\t\t\tfr: \"Envoyer une notification de Fitness Test\",\r\n\t\t\t},\r\n\t\t\t\"sensor-removed\": {\r\n\t\t\t\ten: \"Sensor Removed\",\r\n\t\t\t\tit: \"Sensore Rimosso\",\r\n\t\t\t\tes: \"Sensor Eliminado\",\r\n\t\t\t\tfr: \"Capteur Retiré\",\r\n\t\t\t},\r\n\t\t\t\"minimum-percentage-target-zone\": {\r\n\t\t\t\ten: \"Minimum Target Zone %\",\r\n\t\t\t\tit: \"Minima Target Zone %\",\r\n\t\t\t\tes: \"Mínimo Target Zone %\",\r\n\t\t\t\tfr: \"Minimale Target Zone %\",\r\n\t\t\t},\r\n\t\t\t\"minimum-percentage-target-zone-error\": {\r\n\t\t\t\ten: \"Minimum Target Zone % must be between 0 and 100\",\r\n\t\t\t\tit: \"Minima Target Zone % deve essere compreso tra 0 e 100\",\r\n\t\t\t\tes: \"Mínimo Target Zone % debe estar entre 0 y 100\",\r\n\t\t\t\tfr: \"Minimale Target Zone % doit être compris entre 0 et 100\",\r\n\t\t\t},\r\n\t\t\t\"maximum-percentage-target-zone\": {\r\n\t\t\t\ten: \"Maximum Target Zone %\",\r\n\t\t\t\tit: \"Massima Target Zone %\",\r\n\t\t\t\tes: \"Máximo Target Zone %\",\r\n\t\t\t\tfr: \"Maximum Target Zone %\",\r\n\t\t\t},\r\n\t\t\t\"maximum-percentage-target-zone-error\": {\r\n\t\t\t\ten: \"Maximum Target Zone % must be between 0 and 100\",\r\n\t\t\t\tit: \"Massima Target Zone % deve essere compreso tra 0 e 100\",\r\n\t\t\t\tes: \"Máximo Target Zone % debe estar entre 0 y 100\",\r\n\t\t\t\tfr: \"Maximum Target Zone % doit être compris entre 0 et 100\",\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\tlast: {\r\n\t\t\t\ten: \"Last\",\r\n\t\t\t\tit: \"Ultimo\",\r\n\t\t\t\tes: \"Último\",\r\n\t\t\t\tfr: \"Dernier\",\r\n\t\t\t},\r\n\t\t\tnumber: {\r\n\t\t\t\ten: \"Number\",\r\n\t\t\t\tit: \"Numero\",\r\n\t\t\t\tes: \"Número\",\r\n\t\t\t\tfr: \"Numéro\",\r\n\t\t\t},\r\n\t\t\tawards: {\r\n\t\t\t\ten: \"Awards\",\r\n\t\t\t\tit: \"Premi\",\r\n\t\t\t\tes: \"Premios\",\r\n\t\t\t\tfr: \"Prix\",\r\n\t\t\t},\r\n\t\t\t\"badge-earned-x-times\": {\r\n\t\t\t\ten: \"Earned {0} times\",\r\n\t\t\t\tit: \"Vinto {0} volte\",\r\n\t\t\t\tes: \"Ganado {0} veces\",\r\n\t\t\t\tfr: \"Gagné {0} fois\",\r\n\t\t\t},\r\n\t\t\t\"badge-last-earned\": {\r\n\t\t\t\ten: \"Last earned {0}\",\r\n\t\t\t\tit: \"Ultimo vinto {0}\",\r\n\t\t\t\tes: \"Último ganado {0}\",\r\n\t\t\t\tfr: \"Dernier gagné {0}\",\r\n\t\t\t},\r\n\t\t\t\"training-days\": {\r\n\t\t\t\ten: \"Training days\",\r\n\t\t\t\tit: \"Giorni Di Allenamento\",\r\n\t\t\t\tes: \"Días De Entrenamiento\",\r\n\t\t\t\tfr: \"Jours D'Entraînement\",\r\n\t\t\t},\r\n\t\t\t\"training-schedule-notes\": {\r\n\t\t\t\ten: \"Training Days Notes\",\r\n\t\t\t\tit: \"Note Sui Giorni Di Allenamento\",\r\n\t\t\t\tes: \"Notas Sobre Días De Entrenamiento\",\r\n\t\t\t\tfr: \"Notes Sur Les Jours D'Entraînement\",\r\n\t\t\t},\r\n\t\t\tnote: {\r\n\t\t\t\ten: \"Note\",\r\n\t\t\t\tit: \"Nota\",\r\n\t\t\t\tes: \"Nota\",\r\n\t\t\t\tfr: \"Note\",\r\n\t\t\t},\r\n\t\t\t\"training-info\": {\r\n\t\t\t\ten: \"Training Info\",\r\n\t\t\t\tit: \"Info Allenamento\",\r\n\t\t\t\tes: \"Info Entrenamiento\",\r\n\t\t\t\tfr: \"Info Entraînement\",\r\n\t\t\t},\r\n\t\t\t\"fitness-goals\": {\r\n\t\t\t\ten: \"Fitness Goals\",\r\n\t\t\t\tit: \"Obiettivi Fitness\",\r\n\t\t\t\tes: \"Objetivos Fitness\",\r\n\t\t\t\tfr: \"Objectifs Fitness\",\r\n\t\t\t},\r\n\t\t\t\"injuries-history\": {\r\n\t\t\t\ten: \"Injuries History\",\r\n\t\t\t\tit: \"Cronologia Infortuni\",\r\n\t\t\t\tes: \"Historial De Lesiones\",\r\n\t\t\t\tfr: \"Historique Des Injuries\",\r\n\t\t\t},\r\n\t\t\tcertificates: {\r\n\t\t\t\ten: \"Certificates\",\r\n\t\t\t\tit: \"Certificati\",\r\n\t\t\t\tes: \"Certificados\",\r\n\t\t\t\tfr: \"Certificats\",\r\n\t\t\t},\r\n\t\t\t\"training-comments\": {\r\n\t\t\t\ten: \"Training Comments\",\r\n\t\t\t\tit: \"Commenti Allenamento\",\r\n\t\t\t\tes: \"Comentarios De Entrenamiento\",\r\n\t\t\t\tfr: \"Commentaires D'Entraînement\",\r\n\t\t\t},\r\n\t\t\tby: {\r\n\t\t\t\ten: \"By\",\r\n\t\t\t\tit: \"Da\",\r\n\t\t\t\tes: \"Por\",\r\n\t\t\t\tfr: \"Par\",\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\toccupation: {\r\n\t\t\t\ten: \"Occupation\",\r\n\t\t\t\tit: \"Occupazione\",\r\n\t\t\t\tes: \"Ocupación\",\r\n\t\t\t\tfr: \"Occupation\",\r\n\t\t\t},\r\n\t\t\t\"not-set\": {\r\n\t\t\t\ten: \"Not set\",\r\n\t\t\t\tit: \"Non registrato\",\r\n\t\t\t\tes: \"No establecido\",\r\n\t\t\t\tfr: \"Non défini\",\r\n\t\t\t},\r\n\t\t\tFTP: {\r\n\t\t\t\ten: \"FTP\",\r\n\t\t\t\tit: \"FTP\",\r\n\t\t\t\tes: \"FTP\",\r\n\t\t\t\tfr: \"FTP\",\r\n\t\t\t},\r\n\t\t\t\"no-awards-in-this-club\": {\r\n\t\t\t\ten: \"No awards in this club\",\r\n\t\t\t\tit: \"Nessun premio in questo club\",\r\n\t\t\t\tes: \"No hay premios en este club\",\r\n\t\t\t\tfr: \"Aucun prix dans ce club\",\r\n\t\t\t},\r\n\t\t\tcity: {\r\n\t\t\t\ten: \"City\",\r\n\t\t\t\tit: \"Città\",\r\n\t\t\t\tes: \"Ciudad\",\r\n\t\t\t\tfr: \"Ville\",\r\n\t\t\t},\r\n\t\t\t\"total-booking\": {\r\n\t\t\t\ten: \"Total Booking\",\r\n\t\t\t\tit: \"Totale Prenotazioni\",\r\n\t\t\t\tes: \"Reserva Total\",\r\n\t\t\t\tfr: \"Réservation Totale\",\r\n\t\t\t},\r\n\t\t\t\"total-bookings\": {\r\n\t\t\t\ten: \"Total Bookings\",\r\n\t\t\t\tit: \"Totale Prenotazioni\",\r\n\t\t\t\tes: \"Reserva Total\",\r\n\t\t\t\tfr: \"Réservation Totale\",\r\n\t\t\t},\r\n\t\t\t\"total-trainings\": {\r\n\t\t\t\ten: \"Total Trainings\",\r\n\t\t\t\tit: \"Allenamenti Totali\",\r\n\t\t\t\tes: \"Entrenamientos Totales\",\r\n\t\t\t\tfr: \"Entraînements Totaux\",\r\n\t\t\t},\r\n\t\t\t\"postal-code\": {\r\n\t\t\t\ten: \"Postal Code\",\r\n\t\t\t\tit: \"Codice Postale\",\r\n\t\t\t\tes: \"Código Postal\",\r\n\t\t\t\tfr: \"Code Postal\",\r\n\t\t\t},\r\n\t\t\taddress1: {\r\n\t\t\t\ten: \"Address 1\",\r\n\t\t\t\tit: \"Indirizzo 1\",\r\n\t\t\t\tes: \"Dirección 1\",\r\n\t\t\t\tfr: \"Adresse 1\",\r\n\t\t\t},\r\n\t\t\taddress2: {\r\n\t\t\t\ten: \"Address 2\",\r\n\t\t\t\tit: \"Indirizzo 2\",\r\n\t\t\t\tes: \"Dirección 2\",\r\n\t\t\t\tfr: \"Adresse 2\",\r\n\t\t\t},\r\n\t\t\t\"last-edit\": {\r\n\t\t\t\ten: \"Last Edit\",\r\n\t\t\t\tit: \"Ultima Modifica\",\r\n\t\t\t\tes: \"Última Edición\",\r\n\t\t\t\tfr: \"Dernière Modification\",\r\n\t\t\t},\r\n\t\t\t\"add-note\": {\r\n\t\t\t\ten: \"Add Note\",\r\n\t\t\t\tit: \"Aggiungi Nota\",\r\n\t\t\t\tes: \"Agregar Nota\",\r\n\t\t\t\tfr: \"Ajouter Note\",\r\n\t\t\t},\r\n\t\t\t\"edit-note\": {\r\n\t\t\t\ten: \"Edit Note\",\r\n\t\t\t\tit: \"Modifica Nota\",\r\n\t\t\t\tes: \"Editar Nota\",\r\n\t\t\t\tfr: \"Modifier Note\",\r\n\t\t\t},\r\n\t\t\t\"add-expiration\": {\r\n\t\t\t\ten: \"Add Expiration\",\r\n\t\t\t\tit: \"Aggiungi Scadenza\",\r\n\t\t\t\tes: \"Agregar Expiración\",\r\n\t\t\t\tfr: \"Ajouter Expiration\",\r\n\t\t\t},\r\n\t\t\t\"edit-expiration\": {\r\n\t\t\t\ten: \"Edit Expiration\",\r\n\t\t\t\tit: \"Modifica Scadenza\",\r\n\t\t\t\tes: \"Editar Expiración\",\r\n\t\t\t\tfr: \"Modifier Expiration\",\r\n\t\t\t},\r\n\t\t\t\"expiration-must-be-in-future\": {\r\n\t\t\t\ten: \"Expiration must be in future\",\r\n\t\t\t\tit: \"La Scadenza deve essere nel futuro\",\r\n\t\t\t\tes: \"La Expiración Debe Ser En El Futuro\",\r\n\t\t\t\tfr: \"L'Expiration Doit être dans le futur\",\r\n\t\t\t},\r\n\t\t},\r\n\t\tFooterView: {\r\n\t\t\tcopyright: {\r\n\t\t\t\ten: \"Copyright\",\r\n\t\t\t\tit: \"Copyright\",\r\n\t\t\t\tes: \"Derechos de autor\",\r\n\t\t\t\tfr: \"Copyright\",\r\n\t\t\t},\r\n\t\t},\r\n\t\tGeneralSettingsView: {\r\n\t\t\t\"send-email-after\": {\r\n\t\t\t\ten: \" Send Email after training\",\r\n\t\t\t\tit: \" Invia email dopo il training\",\r\n\t\t\t\tes: \" Enviar correo electrónico después del entrenamiento\",\r\n\t\t\t\tfr: \" Envoyer un e-mail après l'entraînement\",\r\n\t\t\t},\r\n\t\t\t\"send-monthly-recap-email\": {\r\n\t\t\t\ten: \" Send monthly recap email\",\r\n\t\t\t\tit: \" Invia email riepilogo mensile\",\r\n\t\t\t\tes: \" Enviar correo electrónico con el resumen mensual\",\r\n\t\t\t\tfr: \" Envoyer un e-mail récapitulatif mensuel\",\r\n\t\t\t},\r\n\t\t\t\"show-in-rankings\": {\r\n\t\t\t\ten: \"Show up in public rankings\",\r\n\t\t\t\tit: \"Appari nelle classifiche pubbliche\",\r\n\t\t\t\tes: \"Mostrar en los rankings públicos\",\r\n\t\t\t\tfr: \"Afficher dans les classements publics\",\r\n\t\t\t},\r\n\t\t\t\"send-fitness-test-notifications\": {\r\n\t\t\t\ten: \"Remind me to take my Uptivo Fitness Test\",\r\n\t\t\t\tit: \"Ricordami di fare il Uptivo Fitness Test\",\r\n\t\t\t\tes: \"Recuérdame tomar mi Uptivo Fitness Test\",\r\n\t\t\t\tfr: \"Rappelez-moi de Uptivo Fitness Test\",\r\n\t\t\t},\r\n\t\t\tmon: {\r\n\t\t\t\ten: \"Mon\",\r\n\t\t\t\tit: \"Lun\",\r\n\t\t\t\tes: \"Lun\",\r\n\t\t\t\tfr: \"Lun\",\r\n\t\t\t},\r\n\t\t\tsat: {\r\n\t\t\t\ten: \"Sat\",\r\n\t\t\t\tit: \"Sab\",\r\n\t\t\t\tes: \"Sáb\",\r\n\t\t\t\tfr: \"Sam\",\r\n\t\t\t},\r\n\t\t\tsun: {\r\n\t\t\t\ten: \"Sun\",\r\n\t\t\t\tit: \"Dom\",\r\n\t\t\t\tes: \"Dom\",\r\n\t\t\t\tfr: \"Dim\",\r\n\t\t\t},\r\n\t\t\tmetric: {\r\n\t\t\t\ten: \"Metric\",\r\n\t\t\t\tit: \"Metrico\",\r\n\t\t\t\tes: \"Métrico\",\r\n\t\t\t\tfr: \"Métrique\",\r\n\t\t\t},\r\n\t\t\timperial: {\r\n\t\t\t\ten: \"Imperial\",\r\n\t\t\t\tit: \"Imperiale\",\r\n\t\t\t\tes: \"Imperial\",\r\n\t\t\t\tfr: \"Impérial\",\r\n\t\t\t},\r\n\t\t\t\"updated-general-settings-msg\": {\r\n\t\t\t\ten: \"Successfully updated general settings\",\r\n\t\t\t\tit: \"Impostazioni modificate con successo\",\r\n\t\t\t\tes: \"Configuraciones generales actualizadas correctamente\",\r\n\t\t\t\tfr: \"Paramètres généraux mis à jour avec succès\",\r\n\t\t\t},\r\n\t\t},\r\n\t\tGroupTrainingView: {\r\n\t\t\t\"group-trainings\": {\r\n\t\t\t\ten: \"Group Trainings\",\r\n\t\t\t\tit: \"Training nel Gruppo\",\r\n\t\t\t\tes: \"Entrenamientos grupales\",\r\n\t\t\t\tfr: \"Entraînements de groupe\",\r\n\t\t\t},\r\n\t\t\t\"training-summary\": {\r\n\t\t\t\ten: \"Training Summary\",\r\n\t\t\t\tit: \"Riepilogo del Training\",\r\n\t\t\t\tes: \"Resumen del entrenamiento\",\r\n\t\t\t\tfr: \"Résumé de l'entraînement\",\r\n\t\t\t},\r\n\t\t\t\"avg-tz\": {\r\n\t\t\t\ten: \"Avg TZ\",\r\n\t\t\t\tit: \"TZ Med\",\r\n\t\t\t\tes: \"ZO Media (zona objetivo)\",\r\n\t\t\t\tfr: \"TZ moy.\",\r\n\t\t\t},\r\n\t\t\t\"calories-per-person\": {\r\n\t\t\t\ten: \"Calories/Person\",\r\n\t\t\t\tit: \"Calorie/Persona\",\r\n\t\t\t\tes: \"Calorías/Persona\",\r\n\t\t\t\tfr: \"Calories/Personne\",\r\n\t\t\t},\r\n\t\t},\r\n\t\tInvitationCodeView: {\r\n\t\t\taccepted: {\r\n\t\t\t\ten: \"Successfully accepted invitation.\",\r\n\t\t\t\tit: \"Invito accettato con successo.\",\r\n\t\t\t\tes: \"Invitación aceptada correctamente.\",\r\n\t\t\t\tfr: \"Invitation acceptée avec succès.\",\r\n\t\t\t},\r\n\t\t},\r\n\t\tJournalView: {\r\n\t\t\tjournal: {\r\n\t\t\t\ten: \"Journal\",\r\n\t\t\t\tit: \"Diario\",\r\n\t\t\t\tes: \"Seguimiento\",\r\n\t\t\t\tfr: \"Journal\",\r\n\t\t\t},\r\n\t\t\tmonth: {\r\n\t\t\t\ten: \"Month\",\r\n\t\t\t\tit: \"Mese\",\r\n\t\t\t\tes: \"Mes\",\r\n\t\t\t\tfr: \"Mois\",\r\n\t\t\t},\r\n\t\t\tlist: {\r\n\t\t\t\ten: \"List\",\r\n\t\t\t\tit: \"Lista\",\r\n\t\t\t\tes: \"Lista\",\r\n\t\t\t\tfr: \"Liste\",\r\n\t\t\t},\r\n\t\t\t\"month-totals\": {\r\n\t\t\t\ten: \"Month Totals\",\r\n\t\t\t\tit: \"Totali Mese\",\r\n\t\t\t\tes: \"Totales del mes\",\r\n\t\t\t\tfr: \"Totaux du mois\",\r\n\t\t\t},\r\n\t\t\t\"week-totals\": {\r\n\t\t\t\ten: \"Week Totals\",\r\n\t\t\t\tit: \"Totali Settimana\",\r\n\t\t\t\tes: \"Totales de la semana\",\r\n\t\t\t\tfr: \"Totaux de la semaine\",\r\n\t\t\t},\r\n\t\t\tsessions: {\r\n\t\t\t\ten: \"Sessions\",\r\n\t\t\t\tit: \"Sessioni\",\r\n\t\t\t\tes: \"Sesiones\",\r\n\t\t\t\tfr: \"Sessions\",\r\n\t\t\t},\r\n\t\t\t\"total-sessions\": {\r\n\t\t\t\ten: \"Total Sessions\",\r\n\t\t\t\tit: \"Sessioni totali\",\r\n\t\t\t\tes: \"Total de sesiones\",\r\n\t\t\t\tfr: \"Total des sessions\",\r\n\t\t\t},\r\n\t\t\tcadence: {\r\n\t\t\t\ten: \"Cadence\",\r\n\t\t\t\tit: \"Cadenza\",\r\n\t\t\t\tes: \"Cadencia\",\r\n\t\t\t\tfr: \"Cadence\",\r\n\t\t\t},\r\n\t\t},\r\n\t\tManageUsersView: {\r\n\t\t\tbalance: {\r\n\t\t\t\ten: \"Balance\",\r\n\t\t\t\tit: \"Saldo\",\r\n\t\t\t\tes: \"Saldo\",\r\n\t\t\t\tfr: \"Solde\",\r\n\t\t\t},\r\n\t\t\t\"current-shares-count\": {\r\n\t\t\t\ten: \"Number of Shares\",\r\n\t\t\t\tit: \"Numero di condivisioni\",\r\n\t\t\t\tes: \"Numero de repartos\",\r\n\t\t\t\tfr: \"Nombre de partager\",\r\n\t\t\t},\r\n\t\t\t\"load-program\": {\r\n\t\t\t\ten: \"Uptload a\",\r\n\t\t\t\tit: \"Carica un\",\r\n\t\t\t\tes: \"Sube un\",\r\n\t\t\t\tfr: \"Télécharger un\",\r\n\t\t\t},\r\n\t\t\t\"training-program\": {\r\n\t\t\t\ten: \"workout program\",\r\n\t\t\t\tit: \"programma di allenamento\",\r\n\t\t\t\tes: \"programa de entrenamiento\",\r\n\t\t\t\tfr: \"programme d'entraînement\",\r\n\t\t\t},\r\n\t\t\t\"no-programs-share\": {\r\n\t\t\t\ten: \"There are no Workout Programs to share.\",\r\n\t\t\t\tit: \"Non ci sono programmi di allenamento da condividere.\",\r\n\t\t\t\tes: \"No hay programas de entrenamiento para compartir.\",\r\n\t\t\t\tfr: \"Il n'y a pas de programmes d'entraînement à partager.\",\r\n\t\t\t},\r\n\t\t\t\"select-training-program\": {\r\n\t\t\t\ten: \"Select a program\",\r\n\t\t\t\tit: \"Seleziona un programma\",\r\n\t\t\t\tes: \"Selecciona un programa\",\r\n\t\t\t\tfr: \"Sélectionnez un programme\",\r\n\t\t\t},\r\n\t\t\t\"change-target-zone\": {\r\n\t\t\t\ten: \"Change Target Zone\",\r\n\t\t\t\tit: \"Cambia Target Zone\",\r\n\t\t\t\tes: \"Cambiar Target Zone\",\r\n\t\t\t\tfr: \"Modifier le Target Zone\",\r\n\t\t\t},\r\n\t\t\t\"group-operation-warning\": {\r\n\t\t\t\ten: \"Warning: the operation will affect {0} athletes.\",\r\n\t\t\t\tit: \"Attenzione: l'operazione agirà su {0} atleti.\",\r\n\t\t\t\tes: \"Atención: la operación actuará en {0} atletas .\",\r\n\t\t\t\tfr: \"Attention: l'opération affectera {0} athlètes athlètes.\",\r\n\t\t\t},\r\n\t\t\tmanagement: {\r\n\t\t\t\ten: \"Management\",\r\n\t\t\t\tit: \"Gestione\",\r\n\t\t\t\tes: \"Administración\",\r\n\t\t\t\tfr: \"Gestion\",\r\n\t\t\t},\r\n\t\t\tinfo: {\r\n\t\t\t\ten: \"Info\",\r\n\t\t\t\tit: \"Info\",\r\n\t\t\t\tes: \"Info\",\r\n\t\t\t\tfr: \"Info\",\r\n\t\t\t},\r\n\t\t\tsurname: {\r\n\t\t\t\ten: \"Surname\",\r\n\t\t\t\tit: \"Cognome\",\r\n\t\t\t\tes: \"Apellido\",\r\n\t\t\t\tfr: \"Nom de famille\",\r\n\t\t\t},\r\n\t\t\twarning: {\r\n\t\t\t\ten: \"Warning\",\r\n\t\t\t\tit: \"Attenzione\",\r\n\t\t\t\tes: \"Advertencia\",\r\n\t\t\t\tfr: \"Avertissement\",\r\n\t\t\t},\r\n\t\t\t\"error-removing-user-from-club\": {\r\n\t\t\t\ten: \"Error removing user rights from club\",\r\n\t\t\t\tit: \"Errore nella rimozione dei permessi dell'utente dal club\",\r\n\t\t\t\tes: \"Error al eliminar los derechos de usuario del club\",\r\n\t\t\t\tfr: \"Erreur lors de la suppression des droits d'utilisateur du club\",\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\t\"no-roles-removed\": {\r\n\t\t\t\ten: \"If confirmed, the user will be removed from the club.\",\r\n\t\t\t\tit: \"Se confermato, l'utente verrà rimosso dal club.\",\r\n\t\t\t\tes: \"Si se confirma, el usuario será eliminado del club.\",\r\n\t\t\t\tfr: \"En cas de confirmation, l'utilisateur sera supprimé du club.\",\r\n\t\t\t},\r\n\t\t\t\"athlete-no-roles-removed\": {\r\n\t\t\t\ten: \"All subscriptions, bookings, workout plans, and other club-specific attributes will be removed from the user.\",\r\n\t\t\t\tit: \"Tutti gli abbonamenti, le prenotazioni, i programmi di allenamento e altri attributi specifici del club verranno rimossi dall'utente.\",\r\n\t\t\t\tes: \"Todas las suscripciones, reservas, programas de entrenamiento y otros atributos específicos del club se eliminarán del usuario.\",\r\n\t\t\t\tfr: \"Tous les abonnements, réservations, programmes d'entraînement et autres attributs spécifiques au club seront supprimés de l'utilisateur.\"\r\n\t\t\t},\r\n\t\t\t\"athlete-confirmation-removal\": {\r\n\t\t\t\ten: \"If confirmed, all subscriptions, bookings, workout plans, and other club-specific attributes will be removed from the user.\",\r\n\t\t\t\tit: \"Se confermato, tutti gli abbonamenti, le prenotazioni, i programmi di allenamento e altri attributi specifici del club verranno rimossi dall'utente.\",\r\n\t\t\t\tes: \"Si se confirma, todas las suscripciones, reservas, programas de entrenamiento y otros atributos específicos del club se eliminarán del usuario.\",\r\n\t\t\t\tfr: \"S'il est confirmé, tous les abonnements, réservations, programmes d'entraînement et autres attributs spécifiques au club seront supprimés de l'utilisateur.\"\r\n\t\t\t},\r\n\t\t\t\"user-permissions-removed\": {\r\n\t\t\t\ten: \"If confirmed, the user will no longer have permissions for {0}\",\r\n\t\t\t\tit: \"Se confermato, l'utente non avrà più i permessi di {0}\",\r\n\t\t\t\tes: \"Si se confirma, el usuario ya no tendrá permisos para {0}\",\r\n\t\t\t\tfr: \"Si confirmé, l'utilisateur n'aura plus les permissions pour {0}\"\r\n\t\t\t},\r\n\t\t\t\"user-info\": {\r\n\t\t\t\ten: \"Users Info\",\r\n\t\t\t\tit: \"Info Utenti\",\r\n\t\t\t\tes: \"Información de los usuarios\",\r\n\t\t\t\tfr: \"Informations sur les utilisateurs\",\r\n\t\t\t},\r\n\t\t\t\"manage-users\": {\r\n\t\t\t\ten: \"Manage Users\",\r\n\t\t\t\tit: \"Gestione Utenti\",\r\n\t\t\t\tes: \"Administrar usuarios\",\r\n\t\t\t\tfr: \"Gérer les utilisateurs\",\r\n\t\t\t},\r\n\t\t\t\"add-athlete-failed\": {\r\n\t\t\t\ten: \"Can't add the user as athlete of the club\",\r\n\t\t\t\tit: \"Impossibile aggiungere l'utente come atleta del club\",\r\n\t\t\t\tes: \"No se puede agregar al usuario como deportista del club\",\r\n\t\t\t\tfr: \"Impossible d'ajouter l'utilisateur en tant qu'athlète du club\",\r\n\t\t\t},\r\n\t\t\t\"add-trainer-failed\": {\r\n\t\t\t\ten: \"Can't add the user as trainer of the club\",\r\n\t\t\t\tit: \"Impossibile aggiungere l'utente come trainer del club\",\r\n\t\t\t\tes: \"No se puede agregar al usuario como entrenador del club\",\r\n\t\t\t\tfr: \"Impossible d'ajouter l'utilisateur en tant qu'entraîneur du club\",\r\n\t\t\t},\r\n\t\t\t\"add-manager-failed\": {\r\n\t\t\t\ten: \"Can't add the user as manager of the club\",\r\n\t\t\t\tit: \"Impossibile aggiungere l'utente come manager del club\",\r\n\t\t\t\tes: \"No se puede agregar al usuario como administrador del club\",\r\n\t\t\t\tfr: \"Impossible d'ajouter l'utilisateur en tant que responsable du club\",\r\n\t\t\t},\r\n\t\t\t\"addcredits-op\": {\r\n\t\t\t\ten: \"{0} added {1} credits to the account\",\r\n\t\t\t\tit: \"{0} ha aggiunto {1} crediti all'account\",\r\n\t\t\t\tes: \"{0} agregó {1} créditos a la cuenta\",\r\n\t\t\t\tfr: \"{0} a ajouté {1} crédits au compte\",\r\n\t\t\t},\r\n\t\t\t\"remcredits-op\": {\r\n\t\t\t\ten: \"{0} removed {1} credits from the account\",\r\n\t\t\t\tit: \"{0} ha rimosso {1} crediti dall'account\",\r\n\t\t\t\tes: \"{0} eliminó {1} créditos de la cuenta\",\r\n\t\t\t\tfr: \"{0} a supprimé {1} crédits du compte\",\r\n\t\t\t},\r\n\t\t\t\"booking-op\": {\r\n\t\t\t\ten: \"{0} subscribed {2} to {3}\",\r\n\t\t\t\tit: \"{0} ha iscritto {2} a {3}\",\r\n\t\t\t\tes: \"{0} suscribió {2} a {3}\",\r\n\t\t\t\tfr: \"{0} a abonné {2} à {3}\",\r\n\t\t\t},\r\n\t\t\t\"unbooking-op\": {\r\n\t\t\t\ten: \"{0} removed {2} from {3}\",\r\n\t\t\t\tit: \"{0} ha rimosso {2} da {3}\",\r\n\t\t\t\tes: \"{0} sacó {2} de {3}\",\r\n\t\t\t\tfr: \"{0} a retiré {2} de {3}\",\r\n\t\t\t},\r\n\t\t\t\"show-in-rankings-table\": {\r\n\t\t\t\ten: \"Rankings\",\r\n\t\t\t\tit: \"Classifiche\",\r\n\t\t\t\tes: \"Rankings\",\r\n\t\t\t\tfr: \"Classements\",\r\n\t\t\t},\r\n\t\t\t\"send-fitness-test-notifications-table\": {\r\n\t\t\t\ten: \"Fitness Test\",\r\n\t\t\t\tit: \"Fitness Test\",\r\n\t\t\t\tes: \"Fitness Test\",\r\n\t\t\t\tfr: \"Fitness Test\",\r\n\t\t\t},\r\n\t\t\t\"default-display-table\": {\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\tprogram: {\r\n\t\t\t\ten: \"Workout\",\r\n\t\t\t\tit: \"Allenamento\",\r\n\t\t\t\tes: \"Entrenamiento\",\r\n\t\t\t\tfr: \"Entraînement\",\r\n\t\t\t},\r\n\t\t\ttz: {\r\n\t\t\t\ten: \"TZ\",\r\n\t\t\t\tit: \"TZ\",\r\n\t\t\t\tes: \"ZO\",\r\n\t\t\t\tfr: \"ZC\",\r\n\t\t\t},\r\n\t\t\t\"message-tag\": {\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\"impossible-follow-yourself\": {\r\n\t\t\t\ten: \"Impossible to follow yourself\",\r\n\t\t\t\tit: \"Impossibile seguire te stesso\",\r\n\t\t\t\tes: \"Imposible de seguirte a ti mismo\",\r\n\t\t\t\tfr: \"Impossible de se suivre\",\r\n\t\t\t},\r\n\t\t\t\"confirm-remove-self-join-tag\": {\r\n\t\t\t\ten: \"You are about to remove the 'SELF JOIN' tag\",\r\n\t\t\t\tit: \"Stai per rimuovere il tag 'SELF JOIN'\",\r\n\t\t\t\tes: \"Está a punto de eliminar la etiqueta 'SELF JOIN'\",\r\n\t\t\t\tfr: \"Vous êtes sur le point de supprimer la balise 'SELF JOIN'\",\r\n\t\t\t},\r\n\t\t\t\"confirm-remove-guest-tag\": {\r\n\t\t\t\ten: \"You are about to remove the 'GUEST' tag\",\r\n\t\t\t\tit: \"Stai per rimuovere il tag 'GUEST'\",\r\n\t\t\t\tes: \"Está a punto de eliminar la etiqueta 'GUEST'\",\r\n\t\t\t\tfr: \"Vous êtes sur le point de supprimer la balise 'GUEST'\",\r\n\t\t\t},\r\n\t\t\t\"remove-self-join-tags\": {\r\n\t\t\t\ten: \"Remove 'SELF JOIN' tag\",\r\n\t\t\t\tit: \"Rimuovi 'SELF JOIN' tag\",\r\n\t\t\t\tes: \"Eliminar la etiqueta 'SELF JOIN'\",\r\n\t\t\t\tfr: \"Supprimer la balise 'SELF JOIN'\",\r\n\t\t\t},\r\n\t\t\t\"this-sensor-is-assigned-to-multiple-club-users\": {\r\n\t\t\t\ten: \"This sensor is assigned to multiple users of the club\",\r\n\t\t\t\tit: \"Questo sensore risulta assegnato a più utenti del club\",\r\n\t\t\t\tes: \"Este sensor está asignado a múltiples usuarios del club\",\r\n\t\t\t\tfr: \"Ce capteur est attribué à plusieurs utilisateurs du club\",\r\n\t\t\t},\r\n\t\t},\r\n\t\tNoAccessView: {\r\n\t\t\t\"insufficient-rights\": {\r\n\t\t\t\ten: \"Insufficient rights for this operation\",\r\n\t\t\t\tit: \"Diritti insufficienti per questa operazione\",\r\n\t\t\t\tes: \"No tiene permiso para realizar esta operación\",\r\n\t\t\t\tfr: \"Droits insuffisants pour cette opération\",\r\n\t\t\t},\r\n\t\t\t\"no-rights\": {\r\n\t\t\t\ten: \"You don't have the appropriate rights for the selected club\",\r\n\t\t\t\tit: \"Non hai i diritti necessari per il club selezionato\",\r\n\t\t\t\tes: \"No tiene permiso para el club seleccionado\",\r\n\t\t\t\tfr: \"Vous ne disposez pas des droits requis pour le club sélectionné\",\r\n\t\t\t},\r\n\t\t},\r\n\t\tNotificationView: {\r\n\t\t\tUptivoLevel0: {\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\tUptivoLevel1: {\r\n\t\t\t\ten: \"Rookie\",\r\n\t\t\t\tit: \"Novellino\",\r\n\t\t\t\tes: \"Novicio\",\r\n\t\t\t\tfr: \"Novice\",\r\n\t\t\t},\r\n\t\t\tUptivoLevel2: {\r\n\t\t\t\ten: \"Beginner\",\r\n\t\t\t\tit: \"Principiante\",\r\n\t\t\t\tes: \"Principiante\",\r\n\t\t\t\tfr: \"Débutant\",\r\n\t\t\t},\r\n\t\t\tUptivoLevel3: {\r\n\t\t\t\ten: \"Amateur\",\r\n\t\t\t\tit: \"Amatore\",\r\n\t\t\t\tes: \"Aficionado\",\r\n\t\t\t\tfr: \"Amateur\",\r\n\t\t\t},\r\n\t\t\tUptivoLevel4: {\r\n\t\t\t\ten: \"Passionate\",\r\n\t\t\t\tit: \"Appassionato\",\r\n\t\t\t\tes: \"Apasionado\",\r\n\t\t\t\tfr: \"Passionné\",\r\n\t\t\t},\r\n\t\t\tUptivoLevel5: {\r\n\t\t\t\ten: \"Skillful\",\r\n\t\t\t\tit: \"Preparato\",\r\n\t\t\t\tes: \"Hábil\",\r\n\t\t\t\tfr: \"Habile\",\r\n\t\t\t},\r\n\t\t\tUptivoLevel6: {\r\n\t\t\t\ten: \"Outstanding\",\r\n\t\t\t\tit: \"Eccezionale\",\r\n\t\t\t\tes: \"Excepcional\",\r\n\t\t\t\tfr: \"Exceptionnel\",\r\n\t\t\t},\r\n\t\t\tUptivoLevel7: {\r\n\t\t\t\ten: \"Tireless\",\r\n\t\t\t\tit: \"Infaticabile\",\r\n\t\t\t\tes: \"Incansable\",\r\n\t\t\t\tfr: \"Infatigable\",\r\n\t\t\t},\r\n\t\t\tUptivoLevel8: {\r\n\t\t\t\ten: \"Formidable\",\r\n\t\t\t\tit: \"Formidabile\",\r\n\t\t\t\tes: \"Formidable\",\r\n\t\t\t\tfr: \"Redoutable\",\r\n\t\t\t},\r\n\t\t\tUptivoLevel9: {\r\n\t\t\t\ten: \"Phenomenal\",\r\n\t\t\t\tit: \"Fenomenale\",\r\n\t\t\t\tes: \"Fenomenal\",\r\n\t\t\t\tfr: \"Phénoménal\",\r\n\t\t\t},\r\n\t\t\tUptivoLevel10: {\r\n\t\t\t\ten: \"Titanic\",\r\n\t\t\t\tit: \"Titanico\",\r\n\t\t\t\tes: \"Titánico\",\r\n\t\t\t\tfr: \"Titanesque\",\r\n\t\t\t},\r\n\t\t\t\"user-subscription-add-tpl\": {\r\n\t\t\t\ten: \"The <%= notification.Target.SubscriptionName %> subscription has been added to your account\",\r\n\t\t\t\tit: \"L'abbonamento <%= notification.Target.SubscriptionName %> è stato aggiunto al tuo account\",\r\n\t\t\t\tes: \"La suscripción <%= notification.Target.SubscriptionName %> se ha agregado a su cuenta\",\r\n\t\t\t\tfr: \"L'abonnement <%= notification.Target.SubscriptionName %> a été ajouté à votre compte\",\r\n\t\t\t},\r\n\t\t\t\"user-subscription-add-manager-tpl\": {\r\n\t\t\t\ten: \"<%= notification.Actor.Nickname %> added subscription <%= notification.Target.SubscriptionName %> to <%= notification.Target.Nickname %> (<%= notification.Target.Email %>)\",\r\n\t\t\t\tit: \"<%= notification.Actor.Nickname %> ha aggiunto l'abbonamento <%= notification.Target.SubscriptionName %> a <%= notification.Target.Nickname %> (<%= notification.Target.Email %>)\",\r\n\t\t\t\tes: \"<%= notification.Actor.Nickname %> agregó la suscripción <%= notification.Target.SubscriptionName %> a <%= notification.Target.Nickname %> (<%= notification.Target.Email %>)\",\r\n\t\t\t\tfr: \"<%= notification.Actor.Nickname %> a ajouté l'abonnement <%= notification.Target.SubscriptionName %> à <%= notification.Target.Nickname %> (<%= notification.Target.Email %>)\",\r\n\t\t\t},\r\n\t\t\tUserSubscriptionAdd: {\r\n\t\t\t\ten: \"Subscription Added\",\r\n\t\t\t\tit: \"Abbonamento Aggiunto\",\r\n\t\t\t\tes: \"Suscripción Agregada\",\r\n\t\t\t\tfr: \"Abonnement Ajouté\",\r\n\t\t\t},\r\n\t\t\t\"user-subscription-update-tpl\": {\r\n\t\t\t\ten: \"The <%= notification.Target.SubscriptionName %> subscription has been updated\",\r\n\t\t\t\tit: \"L'abbonamento <%= notification.Target.SubscriptionName %> è stato modificato\",\r\n\t\t\t\tes: \"Se ha cambiado la suscripción <%= notification.Target.SubscriptionName %>\",\r\n\t\t\t\tfr: \"L'abonnement <%= notification.Target.SubscriptionName %> a été modifié\",\r\n\t\t\t},\r\n\t\t\t\"user-subscription-update-manager-tpl\": {\r\n\t\t\t\ten: \"<%= notification.Actor.Nickname %> modified the subscription <%= notification.Target.SubscriptionName %> for <%= notification.Target.Nickname %> (<%= notification.Target.Email %>)\",\r\n\t\t\t\tit: \"<%= notification.Actor.Nickname %> ha modificato l'abbonamento <%= notification.Target.SubscriptionName %> di <%= notification.Target.Nickname %> (<%= notification.Target.Email %>)\",\r\n\t\t\t\tes: \"<%= notification.Actor.Nickname %> modificó la suscripción <%= notification.Target.SubscriptionName %> de <%= notification.Target.Nickname %> (<%= notification.Target.Email %>)\",\r\n\t\t\t\tfr: \"<%= notification.Actor.Nickname %> a modifié l'abonnement <%= notification.Target.SubscriptionName %> de <%= notification.Target.Nickname %> (<%= notification.Target.Email %>)\",\r\n\t\t\t},\r\n\t\t\tUserSubscriptionUpdate: {\r\n\t\t\t\ten: \"Subscription Updated\",\r\n\t\t\t\tit: \"Abbonamento Modificato\",\r\n\t\t\t\tes: \"Suscripción Cambiada\",\r\n\t\t\t\tfr: \"Abonnement Modifié\",\r\n\t\t\t},\r\n\t\t\t\"user-subscription-delete-tpl\": {\r\n\t\t\t\ten: \"The <%= notification.Target.SubscriptionName %> subscription has been removed from your account\",\r\n\t\t\t\tit: \"L'abbonamento <%= notification.Target.SubscriptionName %> è stato rimosso dal tuo account\",\r\n\t\t\t\tes: \"La suscripción <%= notification.Target.SubscriptionName %> se ha eliminado de su cuenta\",\r\n\t\t\t\tfr: \"L'abonnement <%= notification.Target.SubscriptionName %> a été supprimé de votre compte\",\r\n\t\t\t},\r\n\t\t\t\"user-subscription-delete-manager-tpl\": {\r\n\t\t\t\ten: \"<%= notification.Actor.Nickname %> removed subscription <%= notification.Target.SubscriptionName %> from <%= notification.Target.Nickname %> (<%= notification.Target.Email %>)\",\r\n\t\t\t\tit: \"<%= notification.Actor.Nickname %> ha rimosso l'abbonamento <%= notification.Target.SubscriptionName %> da <%= notification.Target.Nickname %> (<%= notification.Target.Email %>)\",\r\n\t\t\t\tes: \"<%= notification.Actor.Nickname %> eliminó la suscripción <%= notification.Target.SubscriptionName %> de <%= notification.Target.Nickname %> (<%= notification.Target.Email %>)\",\r\n\t\t\t\tfr: \"<%= notification.Actor.Nickname %> a supprimé l'abonnement <%= notification.Target.SubscriptionName %> de <%= notification.Target.Nickname %> (<%= notification.Target.Email %>)\",\r\n\t\t\t},\r\n\t\t\tUserSubscriptionDelete: {\r\n\t\t\t\ten: \"Subscription Removed\",\r\n\t\t\t\tit: \"Abbonamento Rimosso\",\r\n\t\t\t\tes: \"Suscripción Eliminada\",\r\n\t\t\t\tfr: \"Abonnement Supprimé\",\r\n\t\t\t},\r\n\t\t\t\"user-subscription-suspend-tpl\": {\r\n\t\t\t\ten: \"The <%= notification.Target.SubscriptionName %> subscription has been suspended\",\r\n\t\t\t\tit: \"L'abbonamento <%= notification.Target.SubscriptionName %> è stato sospeso\",\r\n\t\t\t\tes: \"La suscripción <%= notification.Target.SubscriptionName %> ha sido suspendida\",\r\n\t\t\t\tfr: \"L'abonnement <%= notification.Target.SubscriptionName %> a été suspendu\",\r\n\t\t\t},\r\n\t\t\t\"user-subscription-suspend-manager-tpl\": {\r\n\t\t\t\ten: \"<%= notification.Actor.Nickname %> has suspended the subscription <%= notification.Target.SubscriptionName %> for <%= notification.Target.Nickname %> (<%= notification.Target.Email %>)\",\r\n\t\t\t\tit: \"<%= notification.Actor.Nickname %> ha sospeso l'abbonamento <%= notification.Target.SubscriptionName %> di <%= notification.Target.Nickname %> (<%= notification.Target.Email %>)\",\r\n\t\t\t\tes: \"<%= notification.Actor.Nickname %> ha suspendido la suscripción <%= notification.Target.SubscriptionName %> de <%= notification.Target.Nickname %> (<%= notification.Target.Email %>)\",\r\n\t\t\t\tfr: \"<%= notification.Actor.Nickname %> a suspendu l'abonnement <%= notification.Target.SubscriptionName %> de <%= notification.Target.Nickname %> (<%= notification.Target.Email %>)\",\r\n\t\t\t},\r\n\t\t\tUserSubscriptionSuspend: {\r\n\t\t\t\ten: \"Subscription Suspended\",\r\n\t\t\t\tit: \"Abbonamento Sospeso\",\r\n\t\t\t\tes: \"Suscripción Suspendida\",\r\n\t\t\t\tfr: \"Abonnement Suspendu\",\r\n\t\t\t},\r\n\t\t\t\"user-subscription-reactivate-tpl\": {\r\n\t\t\t\ten: \"The <%= notification.Target.SubscriptionName %> subscription has been reactivated\",\r\n\t\t\t\tit: \"L'abbonamento <%= notification.Target.SubscriptionName %> è stato riattivato\",\r\n\t\t\t\tes: \"La suscripción <%= notification.Target.SubscriptionName %> se ha reactivado\",\r\n\t\t\t\tfr: \"L'abonnement <%= notification.Target.SubscriptionName %> a été réactivé\",\r\n\t\t\t},\r\n\t\t\t\"user-subscription-reactivate-manager-tpl\": {\r\n\t\t\t\ten: \"<%= notification.Actor.Nickname %> has reactivated the subscription <%= notification.Target.SubscriptionName %> for <%= notification.Target.Nickname %> (<%= notification.Target.Email %>)\",\r\n\t\t\t\tit: \"<%= notification.Actor.Nickname %> ha riattivato l'abbonamento <%= notification.Target.SubscriptionName %> di <%= notification.Target.Nickname %> (<%= notification.Target.Email %>)\",\r\n\t\t\t\tes: \"<%= notification.Actor.Nickname %> ha reactivado la suscripción <%= notification.Target.SubscriptionName %> de <%= notification.Target.Nickname %> (<%= notification.Target.Email %>)\",\r\n\t\t\t\tfr: \"<%= notification.Actor.Nickname %> a réactivé l'abonnement <%= notification.Target.SubscriptionName %> de <%= notification.Target.Nickname %> (<%= notification.Target.Email %>)\",\r\n\t\t\t},\r\n\t\t\tUserSubscriptionReactivate: {\r\n\t\t\t\ten: \"Subscription Reactivated\",\r\n\t\t\t\tit: \"Abbonamento Riattivato\",\r\n\t\t\t\tes: \"Suscripción Reactivada\",\r\n\t\t\t\tfr: \"Abonnement Réactivé\",\r\n\t\t\t},\r\n\t\t\t\"challenge-started-tpl\": {\r\n\t\t\t\ten: \"Time to test yourself! Your club has organized the <%= notification.Target.ChallengeName %> challenge. Train consistently and intensely to win participation trophies\",\r\n\t\t\t\tit: \"È ora di metterti alla prova! Il tuo club ha organizzato la sfida <%= notification.Target.ChallengeName %>, allenati con costanza e intensità per vincere i trofei di partecipazione\",\r\n\t\t\t\tes: \"¡es hora de ponerte a prueba! Tu club ha organizado el desafío <%= notification.Target.ChallengeName %>. Entrena de forma constante e intensa para ganar trofeos de participación\",\r\n\t\t\t\tfr: \"Il est temps de vous tester! Votre club a organisé le défi <%= notification.Target.ChallengeName %>. Entraînez-vous régulièrement et intensément pour gagner des trophées de participation\",\r\n\t\t\t},\r\n\t\t\tChallengeStarted: {\r\n\t\t\t\ten: \"Challenge Started\",\r\n\t\t\t\tit: \"Sfida Cominciata\",\r\n\t\t\t\tes: \"Desafío Iniciado\",\r\n\t\t\t\tfr: \"Défi Commencé\",\r\n\t\t\t},\r\n\t\t\t\"challenge-canceled-tpl\": {\r\n\t\t\t\ten: \"Your club has canceled the <%= notification.Target.ChallengeName %> challenge. Keep an eye on challenges and train consistently and intensely to win participation trophies\",\r\n\t\t\t\tit: \"Il tuo club ha cancellato la sfida <%= notification.Target.ChallengeName %>. Tieni d'occhio le sfide e allenati con costanza e intensità per vincere i trofei di partecipazione\",\r\n\t\t\t\tes: \"Tu club ha cancelado el desafío <%= notification.Target.ChallengeName %>. Esté atento a los desafíos y entrene de manera constante e intensa para ganar trofeos de participación\",\r\n\t\t\t\tfr: \"Votre club a annulé le défi <%= notification.Target.ChallengeName %>. Gardez un œil sur les défis et entraînez-vous régulièrement et intensément pour remporter des trophées de participation\",\r\n\t\t\t},\r\n\t\t\tChallengeCanceled: {\r\n\t\t\t\ten: \"Challenge Canceled\",\r\n\t\t\t\tit: \"Sfida Cancellata\",\r\n\t\t\t\tes: \"Desafío Cancelado\",\r\n\t\t\t\tfr: \"Défi Annulé\",\r\n\t\t\t},\r\n\t\t\t\"challenge-terminated-tpl\": {\r\n\t\t\t\ten: \"The challenge <%= notification.Target.ChallengeName %> has ended. You ranked <%= notification.Target.Rank %>. Keep an eye on your club's challenges and train consistently and intensely to win participation trophies\",\r\n\t\t\t\tit: \"La sfida <%= notification.Target.ChallengeName %> è terminata. La tua posizione è <%= notification.Target.Rank %>. Tieni d'occhio le sfide del tuo club e allenati con costanza e intensità per vincere i trofei di partecipazione\",\r\n\t\t\t\tes: \"El desafío <%= notification.Target.ChallengeName %> ha terminado. Has clasificado <%= notification.Target.Rank %>. Esté atento a los desafíos de su club y entrene de manera constante e intensa para ganar trofeos de participación\",\r\n\t\t\t\tfr: \"Le défi <%= notification.Target.ChallengeName %> est terminé. Vous avez classé <%= notification.Target.Rank %>. Gardez un œil sur les défis de votre club et entraînez-vous régulièrement et intensément pour remporter des trophées de participation\",\r\n\t\t\t},\r\n\t\t\tChallengeTerminated: {\r\n\t\t\t\ten: \"Challenge Ended\",\r\n\t\t\t\tit: \"Sfida Terminata\",\r\n\t\t\t\tes: \"Desafío Terminado\",\r\n\t\t\t\tfr: \"Défi Terminé\",\r\n\t\t\t},\r\n\t\t\t\"challenge-awarded-tpl\": {\r\n\t\t\t\ten: 'Congratulations, you have won a trophy for the <%= notification.Target.ChallengeName %> challenge! Your position is <%= notification.Target.RankPrc ? \"\\\\\"top \"+notification.Target.RankPrc+\"%\\\\\"\" : notification.Target.Rank %>',\r\n\t\t\t\tit: 'Complimenti, ti sei aggiudicato un trofeo per la sfida <%= notification.Target.ChallengeName %>! La tua posizione è <%= notification.Target.RankPrc ? \"\\\\\"top \"+notification.Target.RankPrc+\"%\\\\\"\" : notification.Target.Rank %>',\r\n\t\t\t\tes: '¡Felicitaciones, has ganado un trofeo para el desafío <%= notification.Target.ChallengeName %>! Su posición es <%= notification.Target.RankPrc ? \"\\\\\"top \"+notification.Target.RankPrc+\"%\\\\\"\" : notification.Target.Rank %>',\r\n\t\t\t\tfr: 'Félicitations, vous avez remporté un trophée pour le défi <%= notification.Target.ChallengeName %>! Votre position est <%= notification.Target.RankPrc ? \"\\\\\"top \"+notification.Target.RankPrc+\"%\\\\\"\" : notification.Target.Rank %>',\r\n\t\t\t},\r\n\t\t\tChallengeAwarded: {\r\n\t\t\t\ten: \"Trophy Won\",\r\n\t\t\t\tit: \"Trofeo Vinto\",\r\n\t\t\t\tes: \"Trofeo Ganado\",\r\n\t\t\t\tfr: \"Trophée Gagné\",\r\n\t\t\t},\r\n\t\t\tOrderFulfilled: {\r\n\t\t\t\ten: \"Purchase\",\r\n\t\t\t\tit: \"Acquisto\",\r\n\t\t\t\tes: \"Compra\",\r\n\t\t\t\tfr: \"Achat\",\r\n\t\t\t},\r\n\t\t\tUserSubscriptionExpired: {\r\n\t\t\t\ten: \"Subscription Expired\",\r\n\t\t\t\tit: \"Abbonamento Scaduto\",\r\n\t\t\t\tes: \"Suscripción Caducado\",\r\n\t\t\t\tfr: \"Abonnement Expiré\",\r\n\t\t\t},\r\n\t\t\tUserSubscriptionExpiredDateUser: {\r\n\t\t\t\ten: \"Subscription Expired\",\r\n\t\t\t\tit: \"Abbonamento Scaduto\",\r\n\t\t\t\tes: \"Suscripción Caducado\",\r\n\t\t\t\tfr: \"Abonnement Expiré\",\r\n\t\t\t},\r\n\t\t\tUserSubscriptionExpiredTicketUser: {\r\n\t\t\t\ten: \"Finished Tickets\",\r\n\t\t\t\tit: \"Ticket Terminati\",\r\n\t\t\t\tes: \"Boletos Terminados\",\r\n\t\t\t\tfr: \"Billets Finis\",\r\n\t\t\t},\r\n\t\t\tUserSubscriptionExpiredDateManager: {\r\n\t\t\t\ten: \"Subscription Expired\",\r\n\t\t\t\tit: \"Abbonamento Scaduto\",\r\n\t\t\t\tes: \"Suscripción Caducado\",\r\n\t\t\t\tfr: \"Abonnement Expiré\",\r\n\t\t\t},\r\n\t\t\tUserSubscriptionExpiredTicketManager: {\r\n\t\t\t\ten: \"Finished Tickets\",\r\n\t\t\t\tit: \"Ticket Terminati\",\r\n\t\t\t\tes: \"Boletos Terminados\",\r\n\t\t\t\tfr: \"Billets Finis\",\r\n\t\t\t},\r\n\t\t\tUserSubscriptionExpiring: {\r\n\t\t\t\ten: \"Expiring Subscription\",\r\n\t\t\t\tit: \"Abbonamento In Scadenza\",\r\n\t\t\t\tes: \"Suscripción Que Expira\",\r\n\t\t\t\tfr: \"Abonnement Expirant\",\r\n\t\t\t},\r\n\t\t\tUserSubscriptionExpiringDateUser: {\r\n\t\t\t\ten: \"Expiring Subscription\",\r\n\t\t\t\tit: \"Abbonamento In Scadenza\",\r\n\t\t\t\tes: \"Suscripción Que Expira\",\r\n\t\t\t\tfr: \"Abonnement Expirant\",\r\n\t\t\t},\r\n\t\t\tUserSubscriptionExpiringTicketUser: {\r\n\t\t\t\ten: \"Tickets Are About To End\",\r\n\t\t\t\tit: \"Ingressi Quasi Terminati\",\r\n\t\t\t\tes: \"Entradas Casi Terminadas\",\r\n\t\t\t\tfr: \"Entrées Presque Terminées\",\r\n\t\t\t},\r\n\t\t\tUserSubscriptionExpiringDateManager: {\r\n\t\t\t\ten: \"Expiring Subscription\",\r\n\t\t\t\tit: \"Abbonamento In Scadenza\",\r\n\t\t\t\tes: \"Suscripción Que Expira\",\r\n\t\t\t\tfr: \"Abonnement Expirant\",\r\n\t\t\t},\r\n\t\t\tUserSubscriptionExpiringTicketManager: {\r\n\t\t\t\ten: \"Tickets Are About To End\",\r\n\t\t\t\tit: \"Ingressi Quasi Terminati\",\r\n\t\t\t\tes: \"Entradas Casi Terminadas\",\r\n\t\t\t\tfr: \"Entrées Presque Terminées\",\r\n\t\t\t},\r\n\t\t\tAthleteExpExpiredMedicalCertificateUser: {\r\n\t\t\t\ten: \"Expired Medical Certificate\",\r\n\t\t\t\tit: \"Certificato Medico Scaduto\",\r\n\t\t\t\tes: \"Certificado Médico Caducado\",\r\n\t\t\t\tfr: \"Certificat médical expiré\",\r\n\t\t\t},\r\n\t\t\tAthleteExpExpiredMembershipUser: {\r\n\t\t\t\ten: \"Expired Membership\",\r\n\t\t\t\tit: \"Iscrizione Scaduta\",\r\n\t\t\t\tes: \"Matrícula Vencida\",\r\n\t\t\t\tfr: \"Inscription Expirée\",\r\n\t\t\t},\r\n\t\t\tAthleteExpExpired: {\r\n\t\t\t\ten: \"Expired Documents\",\r\n\t\t\t\tit: \"Documento Scaduto\",\r\n\t\t\t\tes: \"Documento Expirado\",\r\n\t\t\t\tfr: \"Document Expiré\",\r\n\t\t\t},\r\n\t\t\tAthleteExpExpiredGenericUser: {\r\n\t\t\t\ten: \"Expired Documents\",\r\n\t\t\t\tit: \"Documento Scaduto\",\r\n\t\t\t\tes: \"Documento Expirado\",\r\n\t\t\t\tfr: \"Document Expiré\",\r\n\t\t\t},\r\n\t\t\tAthleteExpExpiredMedicalCertificateManager: {\r\n\t\t\t\ten: \"Expired Medical Certificate\",\r\n\t\t\t\tit: \"Certificato Medico Scaduto\",\r\n\t\t\t\tes: \"Certificado Médico Caducado\",\r\n\t\t\t\tfr: \"Certificat médical expiré\",\r\n\t\t\t},\r\n\t\t\tAthleteExpExpiredMembershipManager: {\r\n\t\t\t\ten: \"Expired Membership\",\r\n\t\t\t\tit: \"Iscrizione Scaduta\",\r\n\t\t\t\tes: \"Matrícula Vencida\",\r\n\t\t\t\tfr: \"Inscription Expirée\",\r\n\t\t\t},\r\n\t\t\tAthleteExpExpiredGenericManager: {\r\n\t\t\t\ten: \"Expired Documents\",\r\n\t\t\t\tit: \"Documento Scaduto\",\r\n\t\t\t\tes: \"Documento Expirado\",\r\n\t\t\t\tfr: \"Document Expiré\",\r\n\t\t\t},\r\n\t\t\tAthleteExpExpiringMedicalCertificateUser: {\r\n\t\t\t\ten: \"Expiring Medical Certificate\",\r\n\t\t\t\tit: \"Certificato Medico In Scadenza\",\r\n\t\t\t\tes: \"Certificado Médico Que Expira\",\r\n\t\t\t\tfr: \"Certificat médical Expirant\",\r\n\t\t\t},\r\n\t\t\tAthleteExpExpiringMembershipUser: {\r\n\t\t\t\ten: \"Expiring Membership\",\r\n\t\t\t\tit: \"Iscrizione In Scadenza\",\r\n\t\t\t\tes: \"Matrícula Que Expira\",\r\n\t\t\t\tfr: \"Inscription Expirant\",\r\n\t\t\t},\r\n\t\t\tAthleteExpExpiringGenericUser: {\r\n\t\t\t\ten: \"Expiring Documents\",\r\n\t\t\t\tit: \"Documento In Scadenza\",\r\n\t\t\t\tes: \"DocumentoQue Expira\",\r\n\t\t\t\tfr: \"Document Expirant\",\r\n\t\t\t},\r\n\t\t\tAthleteExpExpiringMedicalCertificateManager: {\r\n\t\t\t\ten: \"Expiring Medical Certificate\",\r\n\t\t\t\tit: \"Certificato Medico In Scadenza\",\r\n\t\t\t\tes: \"Certificado Médico Que Expira\",\r\n\t\t\t\tfr: \"Certificat médical Expirant\",\r\n\t\t\t},\r\n\t\t\tAthleteExpExpiringMembershipManager: {\r\n\t\t\t\ten: \"Expiring Membership\",\r\n\t\t\t\tit: \"Iscrizione In Scadenza\",\r\n\t\t\t\tes: \"Matrícula Que Expira\",\r\n\t\t\t\tfr: \"Inscription Expirant\",\r\n\t\t\t},\r\n\t\t\tAthleteExpExpiringGenericManager: {\r\n\t\t\t\ten: \"Expiring Documents\",\r\n\t\t\t\tit: \"Documento In Scadenza\",\r\n\t\t\t\tes: \"DocumentoQue Expira\",\r\n\t\t\t\tfr: \"Document Expirant\",\r\n\t\t\t},\r\n\t\t\t\"athlete-exp-expiring-medical-certificate-user-tpl\": {\r\n\t\t\t\ten: \"Your medical certificate will expire on <%= moment(notification.Target.ExpirationDate).format(utilities.getMomentDateFormat(notification.DateFormat)) %>. Don't forget to renew it!\",\r\n\t\t\t\tit: \"Il tuo certificato medico scadrà il giorno <%= moment(notification.Target.ExpirationDate).format(utilities.getMomentDateFormat(notification.DateFormat)) %>. Non dimenticare di rinnovarlo!\",\r\n\t\t\t\tes: \"Su certificado médico caducará el <%= moment(notification.Target.ExpirationDate).format(utilities.getMomentDateFormat(notification.DateFormat)) %>. ¡No olvides renovarlo!\",\r\n\t\t\t\tfr: \"Votre certificat médical expirera le <%= moment(notification.Target.ExpirationDate).format(utilities.getMomentDateFormat(notification.DateFormat)) %>. N'oubliez pas de le renouveler !\",\r\n\t\t\t},\r\n\t\t\t\"athlete-exp-expiring-membership-user-tpl\": {\r\n\t\t\t\ten: \"Your membership will expire on <%= moment(notification.Target.ExpirationDate).format(utilities.getMomentDateFormat(notification.DateFormat)) %>. Don't forget to renew it!\",\r\n\t\t\t\tit: \"La tua iscrizione scadrà il giorno <%= moment(notification.Target.ExpirationDate).format(utilities.getMomentDateFormat(notification.DateFormat)) %>. Non dimenticare di rinnovarla!\",\r\n\t\t\t\tes: \"Su matrícula caducará el <%= moment(notification.Target.ExpirationDate).format(utilities.getMomentDateFormat(notification.DateFormat)) %>. ¡No olvides renovarlo!\",\r\n\t\t\t\tfr: \"Votre inscription expirera le <%= moment(notification.Target.ExpirationDate).format(utilities.getMomentDateFormat(notification.DateFormat)) %>. N'oubliez pas de le renouveler !\",\r\n\t\t\t},\r\n\t\t\t\"athlete-exp-expired-medical-certificate-user-tpl\": {\r\n\t\t\t\ten: \"Your medical certificate has expired. Don't forget to renew it!\",\r\n\t\t\t\tit: \"Il tuo certificato medico è scaduto. Non dimenticare di rinnovarlo!\",\r\n\t\t\t\tes: \"Su certificado médico ha caducado. ¡No olvides renovarlo!\",\r\n\t\t\t\tfr: \"Votre certificat médical est expiré. N'oubliez pas de le renouveler !\",\r\n\t\t\t},\r\n\t\t\t\"athlete-exp-expired-medical-certificate-manager-tpl\": {\r\n\t\t\t\ten: \"<%= notification.Target.Nickname %> (<%= notification.Target.Email %>) - Medical Certificate expired.\",\r\n\t\t\t\tit: \"<%= notification.Target.Nickname %> (<%= notification.Target.Email %>) - Certificato Medico scaduto.\",\r\n\t\t\t\tes: \"<%= notification.Target.Nickname %> (<%= notification.Target.Email %>) - Certificado Medico caducado.\",\r\n\t\t\t\tfr: \"<%= notification.Target.Nickname %> (<%= notification.Target.Email %>) - Certificat Médical expiré.\",\r\n\t\t\t},\r\n\t\t\t\"athlete-exp-expired-membership-user-tpl\": {\r\n\t\t\t\ten: \"Your membership has expired. Don't forget to renew it!\",\r\n\t\t\t\tit: \"La tua iscrizione è scaduta. Non dimenticare di rinnovarla!\",\r\n\t\t\t\tes: \"Su matrícula ha expirado. ¡No olvides renovarlo!\",\r\n\t\t\t\tfr: \"Votre inscription a expiré. N'oubliez pas de le renouveler !\",\r\n\t\t\t},\r\n\t\t\t\"athlete-exp-expired-membership-manager-tpl\": {\r\n\t\t\t\ten: \"<%= notification.Target.Nickname %> (<%= notification.Target.Email %>) - Membership expired.\",\r\n\t\t\t\tit: \"<%= notification.Target.Nickname %> (<%= notification.Target.Email %>) - Iscrizione scaduta.\",\r\n\t\t\t\tes: \"<%= notification.Target.Nickname %> (<%= notification.Target.Email %>) - Matrícula caducado.\",\r\n\t\t\t\tfr: \"<%= notification.Target.Nickname %> (<%= notification.Target.Email %>) - Inscription expiré.\",\r\n\t\t\t},\r\n\t\t\t\"athlete-exp-expired-generic-manager-tpl\": {\r\n\t\t\t\ten: \"<%= notification.Target.Nickname %> (<%= notification.Target.Email %>) - <%= notification.Target.Description %> expired.\",\r\n\t\t\t\tit: \"<%= notification.Target.Nickname %> (<%= notification.Target.Email %>) - <%= notification.Target.Description %> scaduto.\",\r\n\t\t\t\tes: \"<%= notification.Target.Nickname %> (<%= notification.Target.Email %>) - <%= notification.Target.Description %> caducado.\",\r\n\t\t\t\tfr: \"<%= notification.Target.Nickname %> (<%= notification.Target.Email %>) - <%= notification.Target.Description %> expiré.\",\r\n\t\t\t},\r\n\t\t\t\"athlete-exp-expired-generic-user-tpl\": {\r\n\t\t\t\ten: \"Your document <%= notification.Target.Description %> expired.\",\r\n\t\t\t\tit: \"Il tuo documento <%= notification.Target.Description %> è scaduto.\",\r\n\t\t\t\tes: \"Su documento <%= notification.Target.Description %> ha caducado.\",\r\n\t\t\t\tfr: \"Votre document <%= notification.Target.Description %> a expiré.\",\r\n\t\t\t},\r\n\t\t\t\"user-subscription-expiring-date-user-tpl\": {\r\n\t\t\t\ten: \"Your subscription <%= notification.Target.SubscriptionName %> will expire on <%= moment(notification.Target.ExpirationDate).format(utilities.getMomentDateFormat(notification.DateFormat)) %>. Don't forget to renew it!\",\r\n\t\t\t\tit: \"Il tuo abbonamento <%= notification.Target.SubscriptionName %> scadrà il giorno <%= moment(notification.Target.ExpirationDate).format(utilities.getMomentDateFormat(notification.DateFormat)) %>. Non dimenticare di rinnovarlo!\",\r\n\t\t\t\tes: \"Su suscripción <%= notification.Target.SubscriptionName %> caducará el <%= moment(notification.Target.ExpirationDate).format(utilities.getMomentDateFormat(notification.DateFormat)) %>. ¡No olvides renovarlo!\",\r\n\t\t\t\tfr: \"Votre abonnement <%= notification.Target.SubscriptionName %> expirera le <%= moment(notification.Target.ExpirationDate).format(utilities.getMomentDateFormat(notification.DateFormat)) %>. N'oubliez pas de le renouveler !\",\r\n\t\t\t},\r\n\t\t\t\"user-subscription-expiring-ticket-user-tpl\": {\r\n\t\t\t\ten: \"You have only one ticket remaining on your <%= notification.Target.SubscriptionName %> subscription. Don't forget to renew your subscription!\",\r\n\t\t\t\tit: \"Hai un solo ingresso rimanente sul tuo abbonamento <%= notification.Target.SubscriptionName %>. Non dimenticare di rinnovare l’abbonamento!\",\r\n\t\t\t\tes: \"Solo le queda una entrada en su suscripción de <%= notification.Target.SubscriptionName %>. ¡No olvides renovar tu suscripción!\",\r\n\t\t\t\tfr: \"Il ne vous reste qu'un seul ticket sur votre abonnement <%= notification.Target.SubscriptionName %>. N'oubliez pas de renouveler votre abonnement !\",\r\n\t\t\t},\r\n\t\t\t\"user-subscription-expired-date-user-tpl\": {\r\n\t\t\t\ten: \"Your <%= notification.Target.SubscriptionName %> subscription has expired. Don't forget to renew it!\",\r\n\t\t\t\tit: \"Il tuo abbonamento <%= notification.Target.SubscriptionName %> è scaduto. Non dimenticare di rinnovarlo!\",\r\n\t\t\t\tes: \"Su suscripción a <%= notification.Target.SubscriptionName %> ha vencido. ¡No olvides renovarlo!\",\r\n\t\t\t\tfr: \"Votre abonnement <%= notification.Target.SubscriptionName %> a expiré. N'oubliez pas de le renouveler !\",\r\n\t\t\t},\r\n\t\t\t\"user-subscription-expired-ticket-user-tpl\": {\r\n\t\t\t\ten: \"You have no more tickets available on your <%= notification.Target.SubscriptionName %> subscription. Don't forget to renew your subscription!\",\r\n\t\t\t\tit: \"Non hai più ingressi disponibili sul tuo abbonamento <%= notification.Target.SubscriptionName %>. Non dimenticare di rinnovare l’abbonamento!\",\r\n\t\t\t\tes: \"No tiene más entradas disponibles en su suscripción de <%= notification.Target.SubscriptionName %>. ¡No olvides renovar tu suscripción!\",\r\n\t\t\t\tfr: \"Vous n'avez plus de tickets disponibles sur votre abonnement <%= notification.Target.SubscriptionName %>. N'oubliez pas de renouveler votre abonnement !\",\r\n\t\t\t},\r\n\t\t\t\"user-subscription-expired-date-manager-tpl\": {\r\n\t\t\t\ten: \"<%= notification.Target.Nickname %> (<%= notification.Target.Email %>) - The <%= notification.Target.SubscriptionName %> subscription has expired.\",\r\n\t\t\t\tit: \"<%= notification.Target.Nickname %> (<%= notification.Target.Email %>) - L'abbonamento <%= notification.Target.SubscriptionName %> è scaduto.\",\r\n\t\t\t\tes: \"<%= notification.Target.Nickname %> (<%= notification.Target.Email %>) - La suscripción <%= notification.Target.SubscriptionName %> ha caducado.\",\r\n\t\t\t\tfr: \"<%= notification.Target.Nickname %> (<%= notification.Target.Email %>) - L'abonnement <%= notification.Target.SubscriptionName %> a expiré.\",\r\n\t\t\t},\r\n\t\t\t\"user-subscription-expired-ticket-manager-tpl\": {\r\n\t\t\t\ten: \"<%= notification.Target.Nickname %> (<%= notification.Target.Email %>) - The <%= notification.Target.SubscriptionName %> subscription has no more tickets.\",\r\n\t\t\t\tit: \"<%= notification.Target.Nickname %> (<%= notification.Target.Email %>) - L'abbonamento <%= notification.Target.SubscriptionName %> non ha più ingressi.\",\r\n\t\t\t\tes: \"<%= notification.Target.Nickname %> (<%= notification.Target.Email %>) - La suscripción <%= notification.Target.SubscriptionName %> no tiene más entradas.\",\r\n\t\t\t\tfr: \"<%= notification.Target.Nickname %> (<%= notification.Target.Email %>) - L'abonnement <%= notification.Target.SubscriptionName %> n'a plus de tickets.\",\r\n\t\t\t},\r\n\t\t\t\"credits-sub-tpl\": {\r\n\t\t\t\ten: \"<%= notification.Actor.Nickname %> removed <%= notification.Target.Credits %> credits, your new balance is <%= notification.Target.TotalCredits %> credits\",\r\n\t\t\t\tit: \"<%= notification.Actor.Nickname %> ti ha tolto <%= notification.Target.Credits %> crediti, il tuo saldo è <%= notification.Target.TotalCredits %> crediti\",\r\n\t\t\t\tes: \"<%= notification.Actor.Nickname %> eliminó <%= notification.Target.Credits %> créditos, su nuevo saldo es de <%= notification.Target.TotalCredits %> créditos\",\r\n\t\t\t\tfr: \"<%= notification.Actor.Nickname %> a supprimé <%= notification.Target.Credits %> crédits, votre nouveau solde est de <%= notification.Target.TotalCredits %> crédits\",\r\n\t\t\t},\r\n\t\t\t\"credits-add-tpl\": {\r\n\t\t\t\ten: \"<%= notification.Actor.Nickname %> added <%= notification.Target.Credits %> credits, your new balance is <%= notification.Target.TotalCredits %> credits\",\r\n\t\t\t\tit: \"<%= notification.Actor.Nickname %> ti ha aggiunto <%= notification.Target.Credits %> crediti, il tuo saldo è <%= notification.Target.TotalCredits %> crediti\",\r\n\t\t\t\tes: \"<%= notification.Actor.Nickname %> agregó <%= notification.Target.Credits %> créditos, su nuevo saldo es de <%= notification.Target.TotalCredits %> créditos\",\r\n\t\t\t\tfr: \"<%= notification.Actor.Nickname %> a ajouté <%= notification.Target.Credits %> crédits, votre nouveau solde est de <%= notification.Target.TotalCredits %> crédits\",\r\n\t\t\t},\r\n\t\t\t\"class-unsubscription-tpl\": {\r\n\t\t\t\ten: \"<%= notification.Actor.Nickname %> removed you from <%= notification.Target.ClassName %><% if (notification.Target.Credits) {%> (+ <%= notification.Target.Credits %> credits)<%}%>\",\r\n\t\t\t\tit: \"<%= notification.Actor.Nickname %> ti ha rimosso da <%= notification.Target.ClassName %><% if (notification.Target.Credits) {%> (+ <%= notification.Target.Credits %> credits)<%}%>\",\r\n\t\t\t\tes: \"<%= notification.Actor.Nickname %> te quitó de <%= notification.Target.ClassName %><% if (notification.Target.Credits) {%> (+ <%= notification.Target.Credits %> credits)<%}%>\",\r\n\t\t\t\tfr: \"<%= notification.Actor.Nickname %> t'a retiré de <%= notification.Target.ClassName %><% if (notification.Target.Credits) {%> (+ <%= notification.Target.Credits %> credits)<%}%>\",\r\n\t\t\t},\r\n\t\t\t\"log-class-unsubscription-self-tpl\": {\r\n\t\t\t\ten: \"The user <%= notification.Target.Nickname %> (<%= notification.Target.Email %>) has canceled the reservation for <%= notification.Target.ClassName %> at <%= utilities.formatTime(notification.Target.ClassDate, userInfo, false) %> on <%= utilities.formatDate(notification.Target.ClassDate, userInfo) %>\",\r\n\t\t\t\tit: \"L’utente <%= notification.Target.Nickname %> (<%= notification.Target.Email %>) ha cancellato la prenotazione a <%= notification.Target.ClassName %> delle ore <%= utilities.formatTime(notification.Target.ClassDate, userInfo, false) %> del <%= utilities.formatDate(notification.Target.ClassDate, userInfo) %>\",\r\n\t\t\t\tes: \"El usuario <%= notification.Target.Nickname %> (<%= notification.Target.Email %>) ha cancelado la reserva de <%= notification.Target.ClassName %> a las <%= utilities.formatTime(notification.Target.ClassDate, userInfo, false) %> horas del día <%= utilities.formatDate(notification.Target.ClassDate, userInfo) %>\",\r\n\t\t\t\tfr: \"L'utilisateur <%= notification.Target.Nickname %> (<%= notification.Target.Email %>) a annulé la réservation pour <%= notification.Target.ClassName %> à <%= utilities.formatTime(notification.Target.ClassDate, userInfo, false) %> le <%= utilities.formatDate(notification.Target.ClassDate, userInfo) %>\",\r\n\t\t\t},\r\n\t\t\t\"log-class-unsubscription-tpl\": {\r\n\t\t\t\ten: \"<%= notification.Actor.Nickname %> has removed <%= notification.Target.Nickname %> (<%= notification.Target.Email %>) from <%= notification.Target.ClassName %> at <%= utilities.formatTime(notification.Target.ClassDate, userInfo, false) %> on <%= utilities.formatDate(notification.Target.ClassDate, userInfo) %>\",\r\n\t\t\t\tit: \"<%= notification.Actor.Nickname %> ha rimosso <%= notification.Target.Nickname %> (<%= notification.Target.Email %>) da <%= notification.Target.ClassName %> delle ore <%= utilities.formatTime(notification.Target.ClassDate, userInfo, false) %> del <%= utilities.formatDate(notification.Target.ClassDate, userInfo) %>\",\r\n\t\t\t\tes: \"<%= notification.Actor.Nickname %> ha eliminado <%= notification.Target.Nickname %> (<%= notification.Target.Email %>) de <%= notification.Target.ClassName %> a las <%= utilities.formatTime(notification.Target.ClassDate, userInfo, false) %> horas del día <%= utilities.formatDate(notification.Target.ClassDate, userInfo) %>\",\r\n\t\t\t\tfr: \"<%= notification.Actor.Nickname %> a supprimé <%= notification.Target.Nickname %> (<%= notification.Target.Email %>) de <%= notification.Target.ClassName %> à <%= utilities.formatTime(notification.Target.ClassDate, userInfo, false) %> le <%= utilities.formatDate(notification.Target.ClassDate, userInfo) %>\",\r\n\t\t\t},\r\n\t\t\t\"class-subscription-tpl\": {\r\n\t\t\t\ten: \"<%= notification.Actor.Nickname %> added you to <%= notification.Target.ClassName %><% if (notification.Target.Credits) {%> (- <%= notification.Target.Credits %> credits)<%}%>\",\r\n\t\t\t\tit: \"<%= notification.Actor.Nickname %> ti ha aggiunto a <%= notification.Target.ClassName %><% if (notification.Target.Credits) {%> (- <%= notification.Target.Credits %> credits)<%}%>\",\r\n\t\t\t\tes: \"<%= notification.Actor.Nickname %> te agregó a <%= notification.Target.ClassName %><% if (notification.Target.Credits) {%> (- <%= notification.Target.Credits %> credits)<%}%>\",\r\n\t\t\t\tfr: \"<%= notification.Actor.Nickname %> vous a ajouté à <%= notification.Target.ClassName %><% if (notification.Target.Credits) {%> (- <%= notification.Target.Credits %> credits)<%}%>\",\r\n\t\t\t},\r\n\t\t\t\"user-measure-expired-first-tpl\": {\r\n\t\t\t\ten: \"Verify your fitness level. Take your first Fitness Test!\",\r\n\t\t\t\tit: \"Verifica il tuo livello di forma. Fai il tuo primo Fitness Test!\",\r\n\t\t\t\tes: \"Verifica tu nivel de entrenamiento. Empieza tu primer Fitness Test!\",\r\n\t\t\t\tfr: \"Vérifiez votre niveau de forme physique. Faites votre premier Test de Condition Physique!\",\r\n\t\t\t},\r\n\t\t\t\"user-measure-expired-tpl\": {\r\n\t\t\t\ten: \"Verify your fitness level. Take your Fitness Test!\",\r\n\t\t\t\tit: \"Verifica il tuo livello di forma. Fai il tuo Fitness Test!\",\r\n\t\t\t\tes: \"Verifica tu nivel de entrenamiento. Empieza tu Fitness Test!\",\r\n\t\t\t\tfr: \"Vérifiez votre niveau de forme physique. Faites votre Test de Condition Physique!\",\r\n\t\t\t},\r\n\t\t\t\"trainer-awards-tpl\": {\r\n\t\t\t\ten: \"New Trainer Points available. Go and award Points to your favorite trainers!\",\r\n\t\t\t\tit: \"Nuovi Trainer Points disponibili. Assegna subito i punti ai tuoi trainer preferiti!\",\r\n\t\t\t\tes: \"Nuevos Trainer Points disponibles. ¡Ve y otorga puntos a tus entrenadores favoritos!\",\r\n\t\t\t\tfr: \"Nouveaux Trainer Points disponibles. Allez attribuer des points à vos entraîneurs préférés!\",\r\n\t\t\t},\r\n\t\t\t\"level-update-tpl\": {\r\n\t\t\t\ten: \"Congrats! You leveled up. Your new Uptivo level is <%= r('UptivoLevel'+notification.Target.Level) %>. The effort you put in has paid off.\",\r\n\t\t\t\tit: \"Congratulazioni! Il tuo nuovo livello Uptivo è <%= r('UptivoLevel'+notification.Target.Level) %>. Il duro lavoro ha dato i suoi frutti.\",\r\n\t\t\t\tes: \"¡Felicitaciones! Tu nivel ha subido. Tu nuevo nivel es <%= r('UptivoLevel'+notification.Target.Level) %>. Tu trabajo duro ha dado sus frutos.\",\r\n\t\t\t\tfr: \"Félicitations! Votre niveau d'uptivo a augmenté. Votre nouveau niveau est <%= r('UptivoLevel'+notification.Target.Level) %>. L'effort que vous avez mis a porté ses fruits.\",\r\n\t\t\t},\r\n\t\t\t\"created-user-tpl\": {\r\n\t\t\t\ten: \"<%= notification.Actor.Nickname %> created user <%= notification.Target.Nickname %> (<%= notification.Target.Email %>)\",\r\n\t\t\t\tit: \"<%= notification.Actor.Nickname %> ha creato l'utente <%= notification.Target.Nickname %> (<%= notification.Target.Email %>)\",\r\n\t\t\t\tes: \"<%= notification.Actor.Nickname %> creó a usuario <%= notification.Target.Nickname %> (<%= notification.Target.Email %>)\",\r\n\t\t\t\tfr: \"<%= notification.Actor.Nickname %> a créé l'utilisateur <%= notification.Target.Nickname %> (<%= notification.Target.Email %>)\",\r\n\t\t\t},\r\n\t\t\t\"created-invitation-tpl\": {\r\n\t\t\t\ten: \"<%= notification.Actor.Nickname %> invited <%= notification.Target.Nickname %> (<%= notification.Target.Email %>)\",\r\n\t\t\t\tit: \"<%= notification.Actor.Nickname %> ha invitato <%= notification.Target.Nickname %> (<%= notification.Target.Email %>)\",\r\n\t\t\t\tes: \"<%= notification.Actor.Nickname %> invitó a <%= notification.Target.Nickname %> (<%= notification.Target.Email %>)\",\r\n\t\t\t\tfr: \"<%= notification.Actor.Nickname %> a invité <%= notification.Target.Nickname %> (<%= notification.Target.Email %>)\",\r\n\t\t\t},\r\n\t\t\t\"user-accepted-tpl\": {\r\n\t\t\t\ten: \"<%= notification.Target.Nickname %> (<%= notification.Target.Email %>) accepted the invite\",\r\n\t\t\t\tit: \"<%= notification.Target.Nickname %> (<%= notification.Target.Email %>) ha confermato l'invito\",\r\n\t\t\t\tes: \"<%= notification.Target.Nickname %> (<%= notification.Target.Email %>) aceptó la invitación\",\r\n\t\t\t\tfr: \"<%= notification.Target.Nickname %> (<%= notification.Target.Email %>) a accepté l'invitation\",\r\n\t\t\t},\r\n\t\t\t\"user-expired-tpl\": {\r\n\t\t\t\ten: \"<%= notification.Target.Nickname %> (<%= notification.Target.Email %>) did not accept the invite\",\r\n\t\t\t\tit: \"<%= notification.Target.Nickname %> (<%= notification.Target.Email %>) non ha confermato l'invito\",\r\n\t\t\t\tes: \"<%= notification.Target.Nickname %> (<%= notification.Target.Email %>) no aceptó la invitación\",\r\n\t\t\t\tfr: \"<%= notification.Target.Nickname %> (<%= notification.Target.Email %>) n'a pas accepté l'invitation\",\r\n\t\t\t},\r\n\t\t\t\"invitation-link-expired-tpl\": {\r\n\t\t\t\ten: \"<%= notification.Target.Email %> did not accept the invite\",\r\n\t\t\t\tit: \"<%= notification.Target.Email %> non ha confermato l'invito\",\r\n\t\t\t\tes: \"<%= notification.Target.Email %> no aceptó la invitación\",\r\n\t\t\t\tfr: \"<%= notification.Target.Email %> n'a pas accepté l'invitation\",\r\n\t\t\t},\r\n\t\t\t\"user-left-club-tpl\": {\r\n\t\t\t\ten: \"<%= notification.Target.Nickname %> (<%= notification.Target.Email %>) has left the club\",\r\n\t\t\t\tit: \"<%= notification.Target.Nickname %> (<%= notification.Target.Email %>) ha lasciato il club\",\r\n\t\t\t\tes: \"<%= notification.Target.Nickname %> (<%= notification.Target.Email %>) ha dejado el club\",\r\n\t\t\t\tfr: \"<%= notification.Target.Nickname %> (<%= notification.Target.Email %>) a quitté le club\",\r\n\t\t\t},\r\n\t\t\t\"removed-from-club-tpl\": {\r\n\t\t\t\ten: \"<%= notification.Actor.Nickname %> removed <%= notification.Target.Nickname %> (<%= notification.Target.Email %>) from the club\",\r\n\t\t\t\tit: \"<%= notification.Actor.Nickname %> ha rimosso <%= notification.Target.Nickname %> (<%= notification.Target.Email %>) dal club\",\r\n\t\t\t\tes: \"<%= notification.Actor.Nickname %> eliminó a <%= notification.Target.Nickname %> (<%= notification.Target.Email %>) desde el club\",\r\n\t\t\t\tfr: \"<%= notification.Actor.Nickname %> a retiré <%= notification.Target.Nickname %> (<%= notification.Target.Email %>) du club\",\r\n\t\t\t},\r\n\t\t\t\"user-is-back-tpl\": {\r\n\t\t\t\ten: \"<%= notification.Target.Nickname %> (<%= notification.Target.Email %>) is back after <%= notification.Target.Days %> days\",\r\n\t\t\t\tit: \"<%= notification.Target.Nickname %> (<%= notification.Target.Email %>) è di ritorno dopo <%= notification.Target.Days %> giorni\",\r\n\t\t\t\tes: \"<%= notification.Target.Nickname %> (<%= notification.Target.Email %>) está de vuelta después de <%= notification.Target.Days %> días\",\r\n\t\t\t\tfr: \"<%= notification.Target.Nickname %> (<%= notification.Target.Email %>) est de retour après <%= notification.Target.Days %> jours\",\r\n\t\t\t},\r\n\t\t\t\"workout-program-share-tpl\": {\r\n\t\t\t\ten: \"<%= notification.Actor.Nickname %> shared a Workout Program with you\",\r\n\t\t\t\tit: \"<%= notification.Actor.Nickname %> ti ha condiviso un programma di allenamento\",\r\n\t\t\t\tes: \"<%= notification.Actor.Nickname %> te compartió un programa de entrenamiento\",\r\n\t\t\t\tfr: \"<%= notification.Actor.Nickname %> vous a partagé un programme d'entraînement\",\r\n\t\t\t},\r\n\t\t\t\"club-message-tpl\": {\r\n\t\t\t\ten: \"<%= notification.Target.Title || 'You have a new message from the club!' %>\",\r\n\t\t\t\tit: \"<%= notification.Target.Title || 'Hai un nuovo messaggio dal club!' %>\",\r\n\t\t\t\tes: \"<%= notification.Target.Title || '¡Tienes un nuevo mensaje del club!' %>\",\r\n\t\t\t\tfr: \"<%= notification.Target.Title || 'Vous avez un nouveau message du club!' %>\",\r\n\t\t\t},\r\n\t\t\t\"started-live-self-tpl\": {\r\n\t\t\t\ten: \"<%= notification.Actor.Nickname %> has started an Uptivo LIVE session\",\r\n\t\t\t\tit: \"<%= notification.Actor.Nickname %> ha avviato una sessione Uptivo LIVE\",\r\n\t\t\t\tes: \"<%= notification.Actor.Nickname %> comenzó una sesión Uptivo LIVE\",\r\n\t\t\t\tfr: \"<%= notification.Actor.Nickname %> a commencé une session Uptivo LIVE\",\r\n\t\t\t},\r\n\t\t\t\"started-live-tpl\": {\r\n\t\t\t\ten: \"<%= notification.Actor.Nickname %> has started an Uptivo LIVE session by <%= notification.Target.Nickname %>\",\r\n\t\t\t\tit: \"<%= notification.Actor.Nickname %> ha avviato la sessione Uptivo LIVE di <%= notification.Target.Nickname %>\",\r\n\t\t\t\tes: \"<%= notification.Actor.Nickname %> comenzó la sesión Uptivo LIVE de <%= notification.Target.Nickname %>\",\r\n\t\t\t\tfr: \"<%= notification.Actor.Nickname %> a commencé la session Uptivo LIVE de <%= notification.Target.Nickname %>\",\r\n\t\t\t},\r\n\t\t\t\"credits-purchase-tpl\": {\r\n\t\t\t\ten: \"<%= notification.Actor.Nickname %> has purchased <%= notification.Target.Credits %> credits\",\r\n\t\t\t\tit: \"<%= notification.Actor.Nickname %> ha acquistato <%= notification.Target.Credits %> crediti\",\r\n\t\t\t\tes: \"<%= notification.Actor.Nickname %> ha comprado <%= notification.Target.Credits %> créditos\",\r\n\t\t\t\tfr: \"<%= notification.Actor.Nickname %> a acheté <%= notification.Target.Credits %> crédits\",\r\n\t\t\t},\r\n\t\t\t\"sub-purchase-tpl\": {\r\n\t\t\t\ten: \"<%= notification.Actor.Nickname %> has purchased the subscription <%= notification.Target.SubscriptionName %>\",\r\n\t\t\t\tit: \"<%= notification.Actor.Nickname %> ha acquistato l’abbonamento <%= notification.Target.SubscriptionName %>\",\r\n\t\t\t\tes: \"<%= notification.Actor.Nickname %> ha comprado la suscripción <%= notification.Target.SubscriptionName %>\",\r\n\t\t\t\tfr: \"<%= notification.Actor.Nickname %> a acheté l'abonnement <%= notification.Target.SubscriptionName %>\",\r\n\t\t\t},\r\n\t\t\tdetails: {\r\n\t\t\t\ten: \"Details\",\r\n\t\t\t\tit: \"Dettagli\",\r\n\t\t\t\tes: \"Detalles\",\r\n\t\t\t\tfr: \"Détails\",\r\n\t\t\t},\r\n\t\t\tresend: {\r\n\t\t\t\ten: \"Resend\",\r\n\t\t\t\tit: \"Riprova\",\r\n\t\t\t\tes: \"Reenviar\",\r\n\t\t\t\tfr: \"Envoyer à nouveau\",\r\n\t\t\t},\r\n\t\t\tUserMeasureExpired: {\r\n\t\t\t\ten: \"Fitness Test\",\r\n\t\t\t\tit: \"Fitness Test\",\r\n\t\t\t\tes: \"Test de entrenamiento\",\r\n\t\t\t\tfr: \"Test de condition physique\",\r\n\t\t\t},\r\n\t\t\tCreatedUser: {\r\n\t\t\t\ten: \"User creation\",\r\n\t\t\t\tit: \"Creazione utente\",\r\n\t\t\t\tes: \"Creación de usuario\",\r\n\t\t\t\tfr: \"Création d'utilisateur\",\r\n\t\t\t},\r\n\t\t\tPendingUserExpired: {\r\n\t\t\t\ten: \"Creation expired\",\r\n\t\t\t\tit: \"Creazione scaduta\",\r\n\t\t\t\tes: \"La creación expiró\",\r\n\t\t\t\tfr: \"Création expirée\",\r\n\t\t\t},\r\n\t\t\tPendingUserAccepted: {\r\n\t\t\t\ten: \"Creation accepted\",\r\n\t\t\t\tit: \"Creazione accettata\",\r\n\t\t\t\tes: \"Creación aceptada\",\r\n\t\t\t\tfr: \"Création acceptée\",\r\n\t\t\t},\r\n\t\t\tCreatedInvitation: {\r\n\t\t\t\ten: \"User invitation\",\r\n\t\t\t\tit: \"Invito utente\",\r\n\t\t\t\tes: \"Invitación de usuario\",\r\n\t\t\t\tfr: \"Invitation d'utilisateur\",\r\n\t\t\t},\r\n\t\t\tInvitationExpired: {\r\n\t\t\t\ten: \"Invitation expired\",\r\n\t\t\t\tit: \"Invito scaduto\",\r\n\t\t\t\tes: \"Invitación expirada\",\r\n\t\t\t\tfr: \"Invitation expirée\",\r\n\t\t\t},\r\n\t\t\tInvitationAccepted: {\r\n\t\t\t\ten: \"Invitation accepted\",\r\n\t\t\t\tit: \"Invito accettato\",\r\n\t\t\t\tes: \"Invitación aceptada\",\r\n\t\t\t\tfr: \"Invitation acceptée\",\r\n\t\t\t},\r\n\t\t\tUserLeftClub: {\r\n\t\t\t\ten: \"User removal\",\r\n\t\t\t\tit: \"Uscita dal club\",\r\n\t\t\t\tes: \"Eliminación de usuario\",\r\n\t\t\t\tfr: \"Suppression d'utilisateur\",\r\n\t\t\t},\r\n\t\t\tUserIsBack: {\r\n\t\t\t\ten: \"Athlete Returned\",\r\n\t\t\t\tit: \"Atleta Ritornato\",\r\n\t\t\t\tes: \"Atleta Regresó\",\r\n\t\t\t\tfr: \"Athlète Retiré\",\r\n\t\t\t},\r\n\t\t\tTrainerAwards: {\r\n\t\t\t\ten: \"Trainer Points\",\r\n\t\t\t\tit: \"Trainer Points\",\r\n\t\t\t\tes: \"Trainer Points\",\r\n\t\t\t\tfr: \"Trainer Points\",\r\n\t\t\t},\r\n\t\t\tLevelUpdate: {\r\n\t\t\t\ten: \"Uptivo Level\",\r\n\t\t\t\tit: \"Livello Uptivo\",\r\n\t\t\t\tes: \"Nivel Uptivo\",\r\n\t\t\t\tfr: \"Niveau Uptivo\",\r\n\t\t\t},\r\n\t\t\tWorkoutProgramShare: {\r\n\t\t\t\ten: \"Shared Document\",\r\n\t\t\t\tit: \"Condivisione documento\",\r\n\t\t\t\tes: \"Documento compartido\",\r\n\t\t\t\tfr: \"Document partagé\",\r\n\t\t\t},\r\n\t\t\tClubMessage: {\r\n\t\t\t\ten: \"Club Message\",\r\n\t\t\t\tit: \"Messaggio dal club\",\r\n\t\t\t\tes: \"Mensaje del club\",\r\n\t\t\t\tfr: \"Message du club\",\r\n\t\t\t},\r\n\t\t\tStartedLive: {\r\n\t\t\t\ten: \"LIVE start\",\r\n\t\t\t\tit: \"Avvio LIVE\",\r\n\t\t\t\tes: \"Inicio de LIVE\",\r\n\t\t\t\tfr: \"Démarrage de LIVE\",\r\n\t\t\t},\r\n\t\t\tClassSubscription: {\r\n\t\t\t\ten: \"Subscription to Activity\",\r\n\t\t\t\tit: \"Iscrizione ad Attività\",\r\n\t\t\t\tes: \"Suscripción a la Actividad\",\r\n\t\t\t\tfr: \"Inscription à l'activité\",\r\n\t\t\t},\r\n\t\t\tClassUnsubscription: {\r\n\t\t\t\ten: \"Unsubscription from Activity\",\r\n\t\t\t\tit: \"Disiscrizione da Attività\",\r\n\t\t\t\tes: \"Cancelación de la Actividad\",\r\n\t\t\t\tfr: \"Désinscription de l'activité\",\r\n\t\t\t},\r\n\t\t\tCreditsAdd: {\r\n\t\t\t\ten: \"Credits Added\",\r\n\t\t\t\tit: \"Aggiunta Crediti\",\r\n\t\t\t\tes: \"Créditos Agregados\",\r\n\t\t\t\tfr: \"Crédits Ajoutés\",\r\n\t\t\t},\r\n\t\t\tCreditsSub: {\r\n\t\t\t\ten: \"Credits Removed\",\r\n\t\t\t\tit: \"Rimozione Crediti\",\r\n\t\t\t\tes: \"Créditos Eliminados\",\r\n\t\t\t\tfr: \"Crédits Supprimés\",\r\n\t\t\t},\r\n\t\t},\r\n\t\tPhysicalSettingsView: {\r\n\t\t\t\"bpm-cannot-exceed\": {\r\n\t\t\t\ten: \"Heart rate cannot exceed {0} bpm.\",\r\n\t\t\t\tit: \"I battiti non possono superare {0} bpm.\",\r\n\t\t\t\tes: \"La frecuencia cardíaca no puede exceder de {0} lpm.\",\r\n\t\t\t\tfr: \"La fréquence cardiaque ne peut pas dépasser {0} bpm.\",\r\n\t\t\t},\r\n\t\t\t\"height-min-error\": {\r\n\t\t\t\ten: \"The minimum height is {0}.\",\r\n\t\t\t\tit: \"L'altezza minima è {0}.\",\r\n\t\t\t\tes: \"La altura mínima es de {0}.\",\r\n\t\t\t\tfr: \"La hauteur minimale est de {0}.\",\r\n\t\t\t},\r\n\t\t\t\"height-max-error\": {\r\n\t\t\t\ten: \"The maximum height is {0}.\",\r\n\t\t\t\tit: \"L'altezza massima è {0}.\",\r\n\t\t\t\tes: \"La altura máxima es de {0}.\",\r\n\t\t\t\tfr: \"La hauteur maximale est de {0}.\",\r\n\t\t\t},\r\n\t\t},\r\n\t\tTrainerDetailsView: {\r\n\t\t\t\"trainer-points\": {\r\n\t\t\t\ten: \"Trainer Points\",\r\n\t\t\t\tit: \"Punti del Trainer\",\r\n\t\t\t\tes: \"Puntos del Entrenador\",\r\n\t\t\t\tfr: \"Points d'Entraîneur\",\r\n\t\t\t},\r\n\t\t\tcomments: {\r\n\t\t\t\ten: \"Comments\",\r\n\t\t\t\tit: \"Commenti\",\r\n\t\t\t\tes: \"Comentarios\",\r\n\t\t\t\tfr: \"Commentaires\",\r\n\t\t\t},\r\n\t\t\t\"no-points-awarded\": {\r\n\t\t\t\ten: \"No points awarded!\",\r\n\t\t\t\tit: \"Nessun punteggio assegnato!\",\r\n\t\t\t\tes: \"¡Sin puntos otorgados!\",\r\n\t\t\t\tfr: \"Aucun point attribué!\",\r\n\t\t\t},\r\n\t\t\t\"watched-athletes\": {\r\n\t\t\t\ten: \"Watched Athletes\",\r\n\t\t\t\tit: \"Utenti seguiti\",\r\n\t\t\t\tes: \"Atletas seguidos\",\r\n\t\t\t\tfr: \"Athlètes suivis\",\r\n\t\t\t},\r\n\t\t},\r\n\t\tRankingsView: {\r\n\t\t\t\"select-dates\": {\r\n\t\t\t\ten: \"Select Dates\",\r\n\t\t\t\tit: \"Seleziona Date\",\r\n\t\t\t\tes: \"Seleccionar Fechas\",\r\n\t\t\t\tfr: \"Sélectionnez Des Dates\",\r\n\t\t\t},\r\n\t\t\t\"last-week\": {\r\n\t\t\t\ten: \"Last Week\",\r\n\t\t\t\tit: \"Settimana Scorsa\",\r\n\t\t\t\tes: \"La semana pasada\",\r\n\t\t\t\tfr: \"La semaine dernière\",\r\n\t\t\t},\r\n\t\t\t\"this-month\": {\r\n\t\t\t\ten: \"This month\",\r\n\t\t\t\tit: \"Questo Mese\",\r\n\t\t\t\tes: \"Este mes\",\r\n\t\t\t\tfr: \"Ce mois\",\r\n\t\t\t},\r\n\t\t\t\"last-month\": {\r\n\t\t\t\ten: \"Last Month\",\r\n\t\t\t\tit: \"Mese Scorso\",\r\n\t\t\t\tes: \"El mes pasado\",\r\n\t\t\t\tfr: \"Le mois dernier\",\r\n\t\t\t},\r\n\t\t\t\"this-year\": {\r\n\t\t\t\ten: \"This Year\",\r\n\t\t\t\tit: \"Quest'anno\",\r\n\t\t\t\tes: \"Este año\",\r\n\t\t\t\tfr: \"Cette année\",\r\n\t\t\t},\r\n\t\t\t\"last-year\": {\r\n\t\t\t\ten: \"Last Year\",\r\n\t\t\t\tit: \"L'anno scorso\",\r\n\t\t\t\tes: \"El año pasado\",\r\n\t\t\t\tfr: \"L'année dernière\",\r\n\t\t\t},\r\n\t\t\t\"last-12-months\": {\r\n\t\t\t\ten: \"Last 12 months\",\r\n\t\t\t\tit: \"Ultimi 12 mesi\",\r\n\t\t\t\tes: \"Últimos 12 meses\",\r\n\t\t\t\tfr: \"12 derniers mois\",\r\n\t\t\t},\r\n\t\t\tyesterday: {\r\n\t\t\t\ten: \"Yesterday\",\r\n\t\t\t\tit: \"Ieri\",\r\n\t\t\t\tes: \"Ayer\",\r\n\t\t\t\tfr: \"Hier\",\r\n\t\t\t},\r\n\t\t\t\"end-date-cannot-be-in-future\": {\r\n\t\t\t\ten: \"The end date cannot be in the future\",\r\n\t\t\t\tit: \"La data di fine non può essere nel futuro\",\r\n\t\t\t\tes: \"La fecha de finalización no puede ser futura\",\r\n\t\t\t\tfr: \"La date de fin ne peut pas être dans le futur\",\r\n\t\t\t},\r\n\t\t\t\"end-date-must-be-after-or-equal-start-date\": {\r\n\t\t\t\ten: \"The end date must be after or equal to the start date\",\r\n\t\t\t\tit: \"La data di fine deve essere successiva o uguale alla data di inizio\",\r\n\t\t\t\tes: \"La fecha de finalización debe ser posterior o igual a la fecha de inicio\",\r\n\t\t\t\tfr: \"La date de fin doit être postérieure ou égale à la date de début\",\r\n\t\t\t},\r\n\t\t\t\"selected-interval-cannot-exceed-one-year\": {\r\n\t\t\t\ten: \"The interval cannot be more than 365 days\",\r\n\t\t\t\tit: \"L'intervallo non può essere superiore a 365 giorni\",\r\n\t\t\t\tes: \"El intervalo no puede ser mayor a 365 días\",\r\n\t\t\t\tfr: \"L'intervalle ne peut pas être supérieur à 365 jours\",\r\n\t\t\t},\r\n\t\t},\r\n\t\tTrainersJournalView: {\r\n\t\t\t\"trainers-journal\": {\r\n\t\t\t\ten: \"Trainer's Journal\",\r\n\t\t\t\tit: \"Diario del Trainer\",\r\n\t\t\t\tes: \"Seguimiento del entrenador\",\r\n\t\t\t\tfr: \"Journal de l'entraîneur\",\r\n\t\t\t},\r\n\t\t\t\"view-by-club\": {\r\n\t\t\t\ten: \"View by Club\",\r\n\t\t\t\tit: \"Vista per Club\",\r\n\t\t\t\tes: \"Ver por club\",\r\n\t\t\t\tfr: \"Afficher par Club\",\r\n\t\t\t},\r\n\t\t\t\"view-by-week\": {\r\n\t\t\t\ten: \"View by week\",\r\n\t\t\t\tit: \"Vista settimanale\",\r\n\t\t\t\tes: \"Ver por semana\",\r\n\t\t\t\tfr: \"Afficher par semaine\",\r\n\t\t\t},\r\n\t\t\t\"view-by-user\": {\r\n\t\t\t\ten: \"View by User\",\r\n\t\t\t\tit: \"Vista per Utente\",\r\n\t\t\t\tes: \"Ver por usuario\",\r\n\t\t\t\tfr: \"Afficher par Utilisateur\",\r\n\t\t\t},\r\n\t\t\t\"select-week\": {\r\n\t\t\t\ten: \"Select week\",\r\n\t\t\t\tit: \"Seleziona settimana\",\r\n\t\t\t\tes: \"Seleccionar semana\",\r\n\t\t\t\tfr: \"Sélectionnez la semaine\",\r\n\t\t\t},\r\n\t\t\t\"select-day\": {\r\n\t\t\t\ten: \"Select day\",\r\n\t\t\t\tit: \"Seleziona giorno\",\r\n\t\t\t\tes: \"Seleccionar día\",\r\n\t\t\t\tfr: \"Sélectionnez le jour\",\r\n\t\t\t},\r\n\t\t\t\"no-trainings\": {\r\n\t\t\t\ten: \"No trainings\",\r\n\t\t\t\tit: \"Nessun allenamento\",\r\n\t\t\t\tes: \"No entrenamientos\",\r\n\t\t\t\tfr: \"Aucun entraînement\",\r\n\t\t\t},\r\n\t\t\t\"last-training\": {\r\n\t\t\t\ten: \"Last training\",\r\n\t\t\t\tit: \"Ultimo Allenamento\",\r\n\t\t\t\tes: \"Último entrenamiento\",\r\n\t\t\t\tfr: \"Dernier entraînement\",\r\n\t\t\t},\r\n\t\t},\r\n\t\tTrainingView: {\r\n\t\t\t\"punches-summary\": {\r\n\t\t\t\ten: \"Punches Summary\",\r\n\t\t\t\tit: \"Riepilogo Colpi\",\r\n\t\t\t\tes: \"Resumen de Golpes\",\r\n\t\t\t\tfr: \"Résumé des Coups\",\r\n\t\t\t},\r\n\t\t\t\"minute-breakdown\": {\r\n\t\t\t\ten: \"Breakdown in minutes\",\r\n\t\t\t\tit: \"Ripartizione in minuti\",\r\n\t\t\t\tes: \"Subdivisión en minutos\",\r\n\t\t\t\tfr: \"Répartition en minutes\",\r\n\t\t\t},\r\n\t\t\t\"punches-min\": {\r\n\t\t\t\ten: \"Punches/min\",\r\n\t\t\t\tit: \"Colpi/min\",\r\n\t\t\t\tes: \"Golpes/min\",\r\n\t\t\t\tfr: \"Coups/min\",\r\n\t\t\t},\r\n\t\t\tpunches: {\r\n\t\t\t\ten: \"Punches\",\r\n\t\t\t\tit: \"Colpi\",\r\n\t\t\t\tes: \"Golpes\",\r\n\t\t\t\tfr: \"Coups\",\r\n\t\t\t},\r\n\t\t\tselection: {\r\n\t\t\t\ten: \"Selection\",\r\n\t\t\t\tit: \"Selezione\",\r\n\t\t\t\tes: \"Selección\",\r\n\t\t\t\tfr: \"Sélection\",\r\n\t\t\t},\r\n\t\t\t\"training-range\": {\r\n\t\t\t\ten: \"Interval Type\",\r\n\t\t\t\tit: \"Tipo di intervallo\",\r\n\t\t\t\tes: \"Tipo de intervalo\",\r\n\t\t\t\tfr: \"Type d'intervalle\",\r\n\t\t\t},\r\n\t\t\t\"training-no-comments\": {\r\n\t\t\t\ten: \"The training has not been commented yet.\",\r\n\t\t\t\tit: \"Il training non è ancora stato commentato.\",\r\n\t\t\t\tes: \"El entrenamiento no tiene ningún comentario todavía.\",\r\n\t\t\t\tfr: \"L'entraînement n'a fait l'objet d'aucun commentaire pour l'instant.\",\r\n\t\t\t},\r\n\t\t\ttraining: {\r\n\t\t\t\ten: \"Training\",\r\n\t\t\t\tit: \"Training\",\r\n\t\t\t\tes: \"Entrenamiento\",\r\n\t\t\t\tfr: \"Entraînement\",\r\n\t\t\t},\r\n\t\t\t\"delete-training\": {\r\n\t\t\t\ten: \"Delete training\",\r\n\t\t\t\tit: \"Elimina allenamento\",\r\n\t\t\t\tes: \"Eliminar entrenamiento\",\r\n\t\t\t\tfr: \"Supprimer l'entraînement\",\r\n\t\t\t},\r\n\t\t\tUnspecifiedType: {\r\n\t\t\t\ten: \"Training\",\r\n\t\t\t\tit: \"Allenamento\",\r\n\t\t\t\tes: \"Entrenamiento\",\r\n\t\t\t\tfr: \"Entraînement\",\r\n\t\t\t},\r\n\t\t\tUnspecifiedServiceType: {\r\n\t\t\t\ten: \"Other Services\",\r\n\t\t\t\tit: \"Altri Servizi\",\r\n\t\t\t\tes: \"Otros Servicios\",\r\n\t\t\t\tfr: \"Autres Services\",\r\n\t\t\t},\r\n\t\t\tRunningType: {\r\n\t\t\t\ten: \"Running\",\r\n\t\t\t\tit: \"Corsa\",\r\n\t\t\t\tes: \"Correr\",\r\n\t\t\t\tfr: \"Course\",\r\n\t\t\t},\r\n\t\t\tCyclingType: {\r\n\t\t\t\ten: \"Cycling\",\r\n\t\t\t\tit: \"Ciclismo\",\r\n\t\t\t\tes: \"Ciclismo\",\r\n\t\t\t\tfr: \"Vélo\",\r\n\t\t\t},\r\n\t\t\tWalkingType: {\r\n\t\t\t\ten: \"Walking\",\r\n\t\t\t\tit: \"Camminata\",\r\n\t\t\t\tes: \"Caminar\",\r\n\t\t\t\tfr: \"Marche\",\r\n\t\t\t},\r\n\t\t\tMountainBikingType: {\r\n\t\t\t\ten: \"Mountain Biking\",\r\n\t\t\t\tit: \"Mountain Bike\",\r\n\t\t\t\tes: \"Ciclismo De Montaña\",\r\n\t\t\t\tfr: \"Vélo Tout Terrain\",\r\n\t\t\t},\r\n\t\t\tCrossCountrySkiingType: {\r\n\t\t\t\ten: \"Cross Country Skiing\",\r\n\t\t\t\tit: \"Sci Di Fondo\",\r\n\t\t\t\tes: \"Esquí Nórdico\",\r\n\t\t\t\tfr: \"Ski De Fond\",\r\n\t\t\t},\r\n\t\t\tDownhillSkiingType: {\r\n\t\t\t\ten: \"Downhill Skiing\",\r\n\t\t\t\tit: \"Sci Alpino\",\r\n\t\t\t\tes: \"Esquí Alpino\",\r\n\t\t\t\tfr: \"Ski Alpin\",\r\n\t\t\t},\r\n\t\t\tFunctionalTrainingType: {\r\n\t\t\t\ten: \"Functional Training\",\r\n\t\t\t\tit: \"Allenamento Funzionale\",\r\n\t\t\t\tes: \"Entrenamiento Funcional\",\r\n\t\t\t\tfr: \"Entraînement Fonctionnel\",\r\n\t\t\t},\r\n\t\t\tRowingType: {\r\n\t\t\t\ten: \"Rowing\",\r\n\t\t\t\tit: \"Canottaggio\",\r\n\t\t\t\tes: \"Remo\",\r\n\t\t\t\tfr: \"Aviron\",\r\n\t\t\t},\r\n\t\t\tNordicWalkingType: {\r\n\t\t\t\ten: \"Nordic Walking\",\r\n\t\t\t\tit: \"Nordic Walking\",\r\n\t\t\t\tes: \"Caminata Nórdica\",\r\n\t\t\t\tfr: \"Marche Nordique\",\r\n\t\t\t},\r\n\t\t\tSkatingType: {\r\n\t\t\t\ten: \"Skating\",\r\n\t\t\t\tit: \"Pattinaggio\",\r\n\t\t\t\tes: \"Patinaje\",\r\n\t\t\t\tfr: \"Patinage\",\r\n\t\t\t},\r\n\t\t\tHikingType: {\r\n\t\t\t\ten: \"Hiking\",\r\n\t\t\t\tit: \"Trekking\",\r\n\t\t\t\tes: \"Senderismo\",\r\n\t\t\t\tfr: \"Randonnée\",\r\n\t\t\t},\r\n\t\t\tTennisType: {\r\n\t\t\t\ten: \"Tennis\",\r\n\t\t\t\tit: \"Tennis\",\r\n\t\t\t\tes: \"Tenis\",\r\n\t\t\t\tfr: \"Tennis\",\r\n\t\t\t},\r\n\t\t\tSquashType: {\r\n\t\t\t\ten: \"Squash\",\r\n\t\t\t\tit: \"Squash\",\r\n\t\t\t\tes: \"Squash\",\r\n\t\t\t\tfr: \"Squash\",\r\n\t\t\t},\r\n\t\t\tWeightTrainingType: {\r\n\t\t\t\ten: \"Weight Training\",\r\n\t\t\t\tit: \"Pesi\",\r\n\t\t\t\tes: \"Entrenamiento Con Pesas\",\r\n\t\t\t\tfr: \"Musculation\",\r\n\t\t\t},\r\n\t\t\tOtherWithGPSType: {\r\n\t\t\t\ten: \"Training With GPS\",\r\n\t\t\t\tit: \"Allenamento Con GPS\",\r\n\t\t\t\tes: \"Entrenamiento Con GPS\",\r\n\t\t\t\tfr: \"Entraînement Avec GPS\",\r\n\t\t\t},\r\n\t\t\tOtherWithoutGPSType: {\r\n\t\t\t\ten: \"Other Without GPS\",\r\n\t\t\t\tit: \"Altro Senza GPS\",\r\n\t\t\t\tes: \"Otro Sin GPS\",\r\n\t\t\t\tfr: \"Autre Sans GPS\",\r\n\t\t\t},\r\n\t\t\tTreadmillRunningType: {\r\n\t\t\t\ten: \"Treadmill Running\",\r\n\t\t\t\tit: \"Tapis Roulant\",\r\n\t\t\t\tes: \"Correr En La Cinta\",\r\n\t\t\t\tfr: \"Tapis Roulant\",\r\n\t\t\t},\r\n\t\t\tIndoorCyclingType: {\r\n\t\t\t\ten: \"Indoor Cycling\",\r\n\t\t\t\tit: \"Indoor Cycling\",\r\n\t\t\t\tes: \"Indoor Cycling\",\r\n\t\t\t\tfr: \"Cardiovélo\",\r\n\t\t\t},\r\n\t\t\tIndoorWalkingType: {\r\n\t\t\t\ten: \"Indoor Walking\",\r\n\t\t\t\tit: \"Indoor Walking\",\r\n\t\t\t\tes: \"Indoor Walking\",\r\n\t\t\t\tfr: \"Indoor Walking\",\r\n\t\t\t},\r\n\t\t\tHIITType: {\r\n\t\t\t\ten: \"HIIT\",\r\n\t\t\t\tit: \"HIIT\",\r\n\t\t\t\tes: \"HIIT\",\r\n\t\t\t\tfr: \"HIIT\",\r\n\t\t\t},\r\n\t\t\tIndoorRowingType: {\r\n\t\t\t\ten: \"Indoor Rowing\",\r\n\t\t\t\tit: \"Indoor Rowing\",\r\n\t\t\t\tes: \"Remo Indoor\",\r\n\t\t\t\tfr: \"Aviron En Salle\",\r\n\t\t\t},\r\n\t\t\tAquaCyclingType: {\r\n\t\t\t\ten: \"Aqua Cycling\",\r\n\t\t\t\tit: \"Acqua Biking\",\r\n\t\t\t\tes: \"Aqua Cycling\",\r\n\t\t\t\tfr: \"Aqua Biking\",\r\n\t\t\t},\r\n\t\t\tWaterAerobicsType: {\r\n\t\t\t\ten: \"Water Aerobics\",\r\n\t\t\t\tit: \"Acquagym\",\r\n\t\t\t\tes: \"Aqua Fitness\",\r\n\t\t\t\tfr: \"Aquagym\",\r\n\t\t\t},\r\n\t\t\tYogaType: {\r\n\t\t\t\ten: \"Yoga\",\r\n\t\t\t\tit: \"Yoga\",\r\n\t\t\t\tes: \"Yoga\",\r\n\t\t\t\tfr: \"Yoga\",\r\n\t\t\t},\r\n\t\t\tZumbaType: {\r\n\t\t\t\ten: \"Zumba\",\r\n\t\t\t\tit: \"Zumba\",\r\n\t\t\t\tes: \"Zumba\",\r\n\t\t\t\tfr: \"Zumba\",\r\n\t\t\t},\r\n\t\t\tBasketballType: {\r\n\t\t\t\ten: \"Basketball\",\r\n\t\t\t\tit: \"Pallacanestro\",\r\n\t\t\t\tes: \"Baloncesto\",\r\n\t\t\t\tfr: \"Basketball\",\r\n\t\t\t},\r\n\t\t\tVolleyballType: {\r\n\t\t\t\ten: \"Volleyball\",\r\n\t\t\t\tit: \"Pallavolo\",\r\n\t\t\t\tes: \"Vóleibol\",\r\n\t\t\t\tfr: \"Volley-ball\",\r\n\t\t\t},\r\n\t\t\tKayakType: {\r\n\t\t\t\ten: \"Kayak\",\r\n\t\t\t\tit: \"Kayak\",\r\n\t\t\t\tes: \"Kayak\",\r\n\t\t\t\tfr: \"Canoë\",\r\n\t\t\t},\r\n\t\t\tBootcampType: {\r\n\t\t\t\ten: \"Bootcamp\",\r\n\t\t\t\tit: \"Bootcamp\",\r\n\t\t\t\tes: \"Bootcamp\",\r\n\t\t\t\tfr: \"Bootcamp\",\r\n\t\t\t},\r\n\t\t\tCalisthenicsType: {\r\n\t\t\t\ten: \"Calisthenics\",\r\n\t\t\t\tit: \"Calisthenics\",\r\n\t\t\t\tes: \"Calisthenics\",\r\n\t\t\t\tfr: \"Calisthenics\",\r\n\t\t\t},\r\n\t\t\tClimbingOutdoorType: {\r\n\t\t\t\ten: \"Outdoor Climbing\",\r\n\t\t\t\tit: \"Arrampicata All'Aperto\",\r\n\t\t\t\tes: \"Escalada Al Aire Libre\",\r\n\t\t\t\tfr: \"Escalade Extérieur\",\r\n\t\t\t},\r\n\t\t\tClimbingIndoorType: {\r\n\t\t\t\ten: \"Indoor Climbing\",\r\n\t\t\t\tit: \"Arrampicata Indoor\",\r\n\t\t\t\tes: \"Escalada En Interior\",\r\n\t\t\t\tfr: \"Escalade Intérieure\",\r\n\t\t\t},\r\n\t\t\tCrossfitType: {\r\n\t\t\t\ten: \"Crossfit\",\r\n\t\t\t\tit: \"Crossfit\",\r\n\t\t\t\tes: \"Crossfit\",\r\n\t\t\t\tfr: \"Crossfit\",\r\n\t\t\t},\r\n\t\t\tDancingType: {\r\n\t\t\t\ten: \"Dancing\",\r\n\t\t\t\tit: \"Ballo\",\r\n\t\t\t\tes: \"Danza\",\r\n\t\t\t\tfr: \"Danse\",\r\n\t\t\t},\r\n\t\t\tEMSType: {\r\n\t\t\t\ten: \"EMS\",\r\n\t\t\t\tit: \"EMS\",\r\n\t\t\t\tes: \"EMS\",\r\n\t\t\t\tfr: \"EMS\",\r\n\t\t\t},\r\n\t\t\tFitboxingType: {\r\n\t\t\t\ten: \"Fitboxing\",\r\n\t\t\t\tit: \"Fitboxing\",\r\n\t\t\t\tes: \"Fitboxing\",\r\n\t\t\t\tfr: \"Fitboxing\",\r\n\t\t\t},\r\n\t\t\tCombatFitnessType: {\r\n\t\t\t\ten: \"Combat Fitness\",\r\n\t\t\t\tit: \"Combat Fitness\",\r\n\t\t\t\tes: \"Combat Fitness\",\r\n\t\t\t\tfr: \"Combat Fitness\",\r\n\t\t\t},\r\n\t\t\tPadelType: {\r\n\t\t\t\ten: \"Padel\",\r\n\t\t\t\tit: \"Padel\",\r\n\t\t\t\tes: \"Padel\",\r\n\t\t\t\tfr: \"Padel\",\r\n\t\t\t},\r\n\t\t\tPersonalTrainingType: {\r\n\t\t\t\ten: \"Personal Training\",\r\n\t\t\t\tit: \"Personal Training\",\r\n\t\t\t\tes: \"Entrenamiento Personal\",\r\n\t\t\t\tfr: \"Entrainement Personnele\",\r\n\t\t\t},\r\n\t\t\tPilatesType: {\r\n\t\t\t\ten: \"Pilates\",\r\n\t\t\t\tit: \"Pilates\",\r\n\t\t\t\tes: \"Pilates\",\r\n\t\t\t\tfr: \"Pilates\",\r\n\t\t\t},\r\n\t\t\tSwimmingType: {\r\n\t\t\t\ten: \"Swimming\",\r\n\t\t\t\tit: \"Nuoto\",\r\n\t\t\t\tes: \"Natación\",\r\n\t\t\t\tfr: \"Natation\",\r\n\t\t\t},\r\n\t\t\tTrampolineType: {\r\n\t\t\t\ten: \"Trampoline\",\r\n\t\t\t\tit: \"Trampolino\",\r\n\t\t\t\tes: \"Trampolín\",\r\n\t\t\t\tfr: \"Trampoline\",\r\n\t\t\t},\r\n\t\t\tPoleDanceType: {\r\n\t\t\t\ten: \"Pole Dance\",\r\n\t\t\t\tit: \"Pole Dance\",\r\n\t\t\t\tes: \"Pole Dance\",\r\n\t\t\t\tfr: \"Pole Dance\",\r\n\t\t\t},\r\n\t\t\tGAGType: {\r\n\t\t\t\ten: \"ABT\",\r\n\t\t\t\tit: \"GAG\",\r\n\t\t\t\tes: \"Abdominales\",\r\n\t\t\t\tfr: \"Jambes, Abdominaux et Fesses\",\r\n\t\t\t},\r\n\t\t\tEllipticalType: {\r\n\t\t\t\ten: \"Elliptical\",\r\n\t\t\t\tit: \"Ellittica\",\r\n\t\t\t\tes: \"Elíptica\",\r\n\t\t\t\tfr: \"Elliptique\",\r\n\t\t\t},\r\n\t\t\tSoccerType: {\r\n\t\t\t\ten: \"Football (Soccer)\",\r\n\t\t\t\tit: \"Calcio\",\r\n\t\t\t\tes: \"Fútbol\",\r\n\t\t\t\tfr: \"Football\",\r\n\t\t\t},\r\n\t\t\tHorseRidingType: {\r\n\t\t\t\ten: \"Horse Riding\",\r\n\t\t\t\tit: \"Equitazione\",\r\n\t\t\t\tes: \"Equitación\",\r\n\t\t\t\tfr: \"Équitation\",\r\n\t\t\t},\r\n\t\t\tDressageType: {\r\n\t\t\t\ten: \"Dressage\",\r\n\t\t\t\tit: \"Dressage\",\r\n\t\t\t\tes: \"Dressage\",\r\n\t\t\t\tfr: \"Dressage\",\r\n\t\t\t},\r\n\t\t\tShowJumpingType: {\r\n\t\t\t\ten: \"Show Jumping\",\r\n\t\t\t\tit: \"Salto A Ostacoli\",\r\n\t\t\t\tes: \"Salto Ecuestre\",\r\n\t\t\t\tfr: \"Saut d'Obstacles\",\r\n\t\t\t},\r\n\t\t\tPosturalType: {\r\n\t\t\t\ten: \"Postural\",\r\n\t\t\t\tit: \"Posturale\",\r\n\t\t\t\tes: \"Postural\",\r\n\t\t\t\tfr: \"Postural\",\r\n\t\t\t},\r\n\t\t\tFencingType: {\r\n\t\t\t\ten: \"Fencing\",\r\n\t\t\t\tit: \"Scherma\",\r\n\t\t\t\tes: \"Esgrima\",\r\n\t\t\t\tfr: \"Escrime\",\r\n\t\t\t},\r\n\t\t\tStrafitType: {\r\n\t\t\t\ten: \"Strafit\",\r\n\t\t\t\tit: \"Strafit\",\r\n\t\t\t\tes: \"Strafit\",\r\n\t\t\t\tfr: \"Strafit\",\r\n\t\t\t},\r\n\t\t\tZRFitType: {\r\n\t\t\t\ten: \"ZR FitBoxing\",\r\n\t\t\t\tit: \"ZR FitBoxing\",\r\n\t\t\t\tes: \"ZR FitBoxing\",\r\n\t\t\t\tfr: \"ZR FitBoxing\",\r\n\t\t\t},\r\n\t\t\tZRStrongType: {\r\n\t\t\t\ten: \"ZR BootCamp\",\r\n\t\t\t\tit: \"ZR BootCamp\",\r\n\t\t\t\tes: \"ZR BootCamp\",\r\n\t\t\t\tfr: \"ZR BootCamp\",\r\n\t\t\t},\r\n\t\t\tZRBoosterType: {\r\n\t\t\t\ten: \"ZR Booster\",\r\n\t\t\t\tit: \"ZR Booster\",\r\n\t\t\t\tes: \"ZR Booster\",\r\n\t\t\t\tfr: \"ZR Booster\",\r\n\t\t\t},\r\n\t\t\tZRBilanInBodyType: {\r\n\t\t\t\ten: \"ZR Bilan InBody\",\r\n\t\t\t\tit: \"ZR Bilan InBody\",\r\n\t\t\t\tes: \"ZR Bilan InBody\",\r\n\t\t\t\tfr: \"ZR Bilan InBody\",\r\n\t\t\t},\r\n\t\t\tZRHypericeExperienceType: {\r\n\t\t\t\ten: \"ZR Hyperice Experience\",\r\n\t\t\t\tit: \"ZR Hyperice Experience\",\r\n\t\t\t\tes: \"ZR Hyperice Experience\",\r\n\t\t\t\tfr: \"ZR Hyperice Experience\",\r\n\t\t\t},\r\n\t\t\tSwitchingType: {\r\n\t\t\t\ten: \"Switching\",\r\n\t\t\t\tit: \"Switching\",\r\n\t\t\t\tes: \"Switching\",\r\n\t\t\t\tfr: \"Switching\",\r\n\t\t\t},\r\n\t\t\tGolfType: {\r\n\t\t\t\ten: \"Golf\",\r\n\t\t\t\tit: \"Golf\",\r\n\t\t\t\tes: \"Golf\",\r\n\t\t\t\tfr: \"Golf\",\r\n\t\t\t},\r\n\t\t\tBlastJumpType: {\r\n\t\t\t\ten: \"Blast Jump\",\r\n\t\t\t\tit: \"Blast Jump\",\r\n\t\t\t\tes: \"Blast Jump\",\r\n\t\t\t\tfr: \"Blast Jump\",\r\n\t\t\t},\r\n\t\t\t\"hr-zone0-name\": {\r\n\t\t\t\ten: \"Resting\",\r\n\t\t\t\tit: \"Riposo\",\r\n\t\t\t\tes: \"Descanso\",\r\n\t\t\t\tfr: \"Repos\",\r\n\t\t\t},\r\n\t\t\t\"hr-zone1-name\": {\r\n\t\t\t\ten: \"Moderate Effort\",\r\n\t\t\t\tit: \"Intensità Moderata\",\r\n\t\t\t\tes: \"Esfuerzo Moderado\",\r\n\t\t\t\tfr: \"Effort Modéré\",\r\n\t\t\t},\r\n\t\t\t\"hr-zone2-name\": {\r\n\t\t\t\ten: \"Weight Control\",\r\n\t\t\t\tit: \"Controllo Peso\",\r\n\t\t\t\tes: \"Control de peso\",\r\n\t\t\t\tfr: \"Contrôle du poids\",\r\n\t\t\t},\r\n\t\t\t\"hr-zone3-name\": {\r\n\t\t\t\ten: \"Aerobic\",\r\n\t\t\t\tit: \"Aerobico\",\r\n\t\t\t\tes: \"Aeróbico\",\r\n\t\t\t\tfr: \"Aérobie\",\r\n\t\t\t},\r\n\t\t\t\"hr-zone4-name\": {\r\n\t\t\t\ten: \"Anaerobic\",\r\n\t\t\t\tit: \"Anaerobico\",\r\n\t\t\t\tes: \"Anaeróbico\",\r\n\t\t\t\tfr: \"Anaérobie\",\r\n\t\t\t},\r\n\t\t\t\"hr-zone5-name\": {\r\n\t\t\t\ten: \"Maximum Effort\",\r\n\t\t\t\tit: \"Massima Intensità\",\r\n\t\t\t\tes: \"Esfuerzo Máximo\",\r\n\t\t\t\tfr: \"Effort Maximal\",\r\n\t\t\t},\r\n\t\t\televation: {\r\n\t\t\t\ten: \"Elevation\",\r\n\t\t\t\tit: \"Altitudine\",\r\n\t\t\t\tes: \"Altitud\",\r\n\t\t\t\tfr: \"Altitude\",\r\n\t\t\t},\r\n\t\t\tgrade: {\r\n\t\t\t\ten: \"Grade\",\r\n\t\t\t\tit: \"Pendenza\",\r\n\t\t\t\tes: \"Pendiente\",\r\n\t\t\t\tfr: \"Pente\",\r\n\t\t\t},\r\n\t\t\t\"heart-rate\": {\r\n\t\t\t\ten: \"Heart Rate\",\r\n\t\t\t\tit: \"Frequenza cardiaca\",\r\n\t\t\t\tes: \"Frecuencia cardíaca\",\r\n\t\t\t\tfr: \"Fréquence cardiaque\",\r\n\t\t\t},\r\n\t\t\t\"route-info\": {\r\n\t\t\t\ten: \"Route Information\",\r\n\t\t\t\tit: \"Informazioni percorso\",\r\n\t\t\t\tes: \"Información de ruta\",\r\n\t\t\t\tfr: \"Informations itinéraire\",\r\n\t\t\t},\r\n\t\t\t\"mail-sent-successfully\": {\r\n\t\t\t\ten: \"Mail sent successfully\",\r\n\t\t\t\tit: \"Mail inviata con successo\",\r\n\t\t\t\tes: \"El correo enviado con éxito\",\r\n\t\t\t\tfr: \"Courrier envoyé avec succès\",\r\n\t\t\t},\r\n\t\t\t\"link-copied\": {\r\n\t\t\t\ten: \"Link copied!\",\r\n\t\t\t\tit: \"Link copiato!\",\r\n\t\t\t\tes: \"Enlace copiado!\",\r\n\t\t\t\tfr: \"Lien copié!\",\r\n\t\t\t},\r\n\t\t\t\"copy-link\": {\r\n\t\t\t\ten: \"Copy Link\",\r\n\t\t\t\tit: \"Copia Link\",\r\n\t\t\t\tes: \"Copiar Link\",\r\n\t\t\t\tfr: \"Copier Lien\",\r\n\t\t\t},\r\n\t\t\t\"insert-email\": {\r\n\t\t\t\ten: \"Insert Email\",\r\n\t\t\t\tit: \"Inserisci Email\",\r\n\t\t\t\tes: \"Insertar Email\",\r\n\t\t\t\tfr: \"Insérer Email\",\r\n\t\t\t},\r\n\t\t},\r\n\t\tUserBasicDataModalView: {\r\n\t\t\twelcome: {\r\n\t\t\t\ten: \"Welcome to Uptivo\",\r\n\t\t\t\tit: \"Benvenuto in Uptivo\",\r\n\t\t\t\tes: \"Bienvenido a Uptivo\",\r\n\t\t\t\tfr: \"Bienvenue dans Uptivo\",\r\n\t\t\t},\r\n\t\t\t\"date-of-birth\": {\r\n\t\t\t\ten: \"Date of Birth\",\r\n\t\t\t\tit: \"Data di Nascita\",\r\n\t\t\t\tes: \"Fecha de nacimiento\",\r\n\t\t\t\tfr: \"Date de naissance\",\r\n\t\t\t},\r\n\t\t},\r\n\t\tUserGroupsView: {\r\n\t\t\t\"user-groups\": {\r\n\t\t\t\ten: \"User Groups\",\r\n\t\t\t\tit: \"Gruppi Utenti\",\r\n\t\t\t\tes: \"Grupos de usuario\",\r\n\t\t\t\tfr: \"Groupes d'utilisateurs\",\r\n\t\t\t},\r\n\t\t\tmembers: {\r\n\t\t\t\ten: \"Members\",\r\n\t\t\t\tit: \"Membri\",\r\n\t\t\t\tes: \"Miembros\",\r\n\t\t\t\tfr: \"Membres\",\r\n\t\t\t},\r\n\t\t},\r\n\t\tClubDeleteModalView: {\r\n\t\t\t\"info-text\": {\r\n\t\t\t\ten: \"To proceed please type {0} below\",\r\n\t\t\t\tit: \"Per procedere scrivi {0} nel campo sottostante\",\r\n\t\t\t\tes: \"Para proceder, por favor escriba {0} abajo\",\r\n\t\t\t\tfr: \"Pour continuer, saisir {0} ci-dessous\",\r\n\t\t\t},\r\n\t\t\t\"warning-text\": {\r\n\t\t\t\ten: \"You are about to delete the club and its association to devices and users PERMANENTLY.\",\r\n\t\t\t\tit: \"Stai per eliminare il club e tutte le associazioni del club a utenti e device in modo PERMANENTE.\",\r\n\t\t\t\tes: \"Está a punto de eliminar el club y su asociación a dispositivos y usuarios PERMANENTEMENTE.\",\r\n\t\t\t\tfr: \"Vous êtes sur le point de supprimer le club et son association avec les appareils et utilisateurs DE FAÇON PERMANENTE.\",\r\n\t\t\t},\r\n\t\t\t\"club-name\": {\r\n\t\t\t\ten: \"Club Name\",\r\n\t\t\t\tit: \"Nome Club\",\r\n\t\t\t\tes: \"Nombre del club\",\r\n\t\t\t\tfr: \"Nom du club\",\r\n\t\t\t},\r\n\t\t},\r\n\t\tCustomBindings: {\r\n\t\t\tsearch: {\r\n\t\t\t\ten: \"Search\",\r\n\t\t\t\tit: \"Cerca\",\r\n\t\t\t\tes: \"Buscar\",\r\n\t\t\t\tfr: \"Recherche\",\r\n\t\t\t},\r\n\t\t\t\"max-heart-rate\": {\r\n\t\t\t\ten: \"Max Heart Rate\",\r\n\t\t\t\tit: \"Max Battiti\",\r\n\t\t\t\tes: \"Frecuencia cardíaca máxima\",\r\n\t\t\t\tfr: \"Fréquence cardiaque max.\",\r\n\t\t\t},\r\n\t\t},\r\n\t\tVideosView: {\r\n\t\t\t\"will-delete-video\": {\r\n\t\t\t\ten: \"This video will be deleted.\",\r\n\t\t\t\tit: \"Questo video sarà cancellato.\",\r\n\t\t\t\tes: \"Este vÍdeo será eliminado.\",\r\n\t\t\t\tfr: \"Cette vidéo sera supprimée.\",\r\n\t\t\t},\r\n\t\t\t\"no-videos-in-list\": {\r\n\t\t\t\ten: \"Your list of videos is empty!\",\r\n\t\t\t\tit: \"La tua lista di video è vuota!\",\r\n\t\t\t\tes: \"¡Su lista de vÍdeos está vacía!\",\r\n\t\t\t\tfr: \"Votre liste de vidéos est vide!\",\r\n\t\t\t},\r\n\t\t},\r\n\t\tAppVersionManager: {\r\n\t\t\t\"new-version-title\": {\r\n\t\t\t\ten: \"New version\",\r\n\t\t\t\tit: \"Nuova versione\",\r\n\t\t\t\tes: \"Nueva versión\",\r\n\t\t\t\tfr: \"Nouvelle version\",\r\n\t\t\t},\r\n\t\t\t\"new-version-description\": {\r\n\t\t\t\ten: \"A new version of Uptivo Cloud is available. It is recommended that you reload the page.\",\r\n\t\t\t\tit: \"È disponibile una nuova versione di Uptivo Cloud. Si raccomanda di ricaricare la pagina.\",\r\n\t\t\t\tes: \"Una nueva versión de Uptivo Cloud está disponible. Se recomienda que recargue la página.\",\r\n\t\t\t\tfr: \"Une nouvelle version d'Uptivo Cloud est disponible. Il est recommandé de rafraîchir la page.\",\r\n\t\t\t},\r\n\t\t\treload: {\r\n\t\t\t\ten: \"Reload\",\r\n\t\t\t\tit: \"Ricarica\",\r\n\t\t\t\tes: \"Recargar\",\r\n\t\t\t\tfr: \"Rafraîchir\",\r\n\t\t\t},\r\n\t\t\tlater: {\r\n\t\t\t\ten: \"Later\",\r\n\t\t\t\tit: \"Più tardi\",\r\n\t\t\t\tes: \"Más tarde\",\r\n\t\t\t\tfr: \"Plus tard\",\r\n\t\t\t},\r\n\t\t},\r\n\t\tLiveTrainingsView: {\r\n\t\t\t\"join-live-training\": {\r\n\t\t\t\ten: \"Join Training as host\",\r\n\t\t\t\tit: \"Partecipa come host\",\r\n\t\t\t\tes: \"Comienzo Live Training\",\r\n\t\t\t\tfr: \"Début Live Training\",\r\n\t\t\t},\r\n\t\t\t\"training-list\": {\r\n\t\t\t\ten: \"Training List\",\r\n\t\t\t\tit: \"Lista Allenamenti\",\r\n\t\t\t\tes: \"Lista De Entrenamiento\",\r\n\t\t\t\tfr: \"Liste Des Entrainement\",\r\n\t\t\t},\r\n\t\t\t\"recurrent-live-trainings\": {\r\n\t\t\t\ten: \"Template Allenamenti Live\",\r\n\t\t\t\tit: \"Live Trainings Template\",\r\n\t\t\t\tes: \"Live Trainings Template\",\r\n\t\t\t\tfr: \"Live Trainings Template\",\r\n\t\t\t},\r\n\t\t\t\"participant-limit-exceeded\": {\r\n\t\t\t\ten: \"Participant limit exceeded\",\r\n\t\t\t\tit: \"Limite partecipanti superato\",\r\n\t\t\t\tes: \"Límite de participantes excedido\",\r\n\t\t\t\tfr: \"Limite de participants dépassée\",\r\n\t\t\t},\r\n\t\t\t\"total-selected-athletes\": {\r\n\t\t\t\ten: \"Total selected athletes: \",\r\n\t\t\t\tit: \"Atleti totali selezionati: \",\r\n\t\t\t\tes: \"Total de atletas seleccionados: \",\r\n\t\t\t\tfr: \"Total des athlètes sélectionnés: \",\r\n\t\t\t},\r\n\t\t\t\"participants-max\": {\r\n\t\t\t\ten: \"Athletes/Max\",\r\n\t\t\t\tit: \"Atleti/max\",\r\n\t\t\t\tes: \"Deportistas/max\",\r\n\t\t\t\tfr: \"Athlètes/max\",\r\n\t\t\t},\r\n\t\t\t\"elapsed-time\": {\r\n\t\t\t\ten: \"Elapsed Time\",\r\n\t\t\t\tit: \"Tempo Trascorso\",\r\n\t\t\t\tes: \"Tiempo Transcurrido\",\r\n\t\t\t\tfr: \"Temps Ecoulé\",\r\n\t\t\t},\r\n\t\t\t\"delete-live-training\": {\r\n\t\t\t\ten: \"Delete Live Training\",\r\n\t\t\t\tit: \"Cancella Live Training\",\r\n\t\t\t\tes: \"Crear Live Training\",\r\n\t\t\t\tfr: \"Eliminar entrenamiento en vivo\",\r\n\t\t\t},\r\n\t\t\t\"remove-invitation-confirm\": {\r\n\t\t\t\ten: \"You are about to remove \",\r\n\t\t\t\tit: \"Stai per rimuovere \",\r\n\t\t\t\tes: \"Estás a punto de eliminar \",\r\n\t\t\t\tfr: \"Vous êtes sur le point de supprimer \",\r\n\t\t\t},\r\n\t\t\t\"max-live-training-number-reached\": {\r\n\t\t\t\ten: \"Maximum number of live training reached for the club\",\r\n\t\t\t\tit: \"Numero massimo di live training raggiunto per il club\",\r\n\t\t\t\tes: \"Número máximo de entrenamiento en vivo alcanzado para el club\",\r\n\t\t\t\tfr: \"Nombre maximum de entrainement en direct atteint pour le club\",\r\n\t\t\t},\r\n\t\t},\r\n\t\tUptivoLIVEView: {\r\n\t\t\t\"training-list\": {\r\n\t\t\t\ten: \"Training List\",\r\n\t\t\t\tit: \"Lista Allenamenti\",\r\n\t\t\t\tes: \"Lista De Entrenamiento\",\r\n\t\t\t\tfr: \"Liste Des Entrainement\",\r\n\t\t\t},\r\n\t\t\t\"uptivo-live-not-available\": {\r\n\t\t\t\ten: \"Uptivo LIVE is not available\",\r\n\t\t\t\tit: \"Uptivo LIVE non disponibile\",\r\n\t\t\t\tes: \"Uptivo LIVE no está disponible\",\r\n\t\t\t\tfr: \"Uptivo LIVE n'est pas disponible\",\r\n\t\t\t},\r\n\t\t\t\"uptivo-live-not-enabled-club\": {\r\n\t\t\t\ten: \"Uptivo LIVE is not enabled for the selected club.\",\r\n\t\t\t\tit: \"Uptivo LIVE non è attivo nel il club selezionato.\",\r\n\t\t\t\tes: \"Uptivo LIVE no está habilitado para el club seleccionado.\",\r\n\t\t\t\tfr: \"Uptivo LIVE n'est pas activé pour le club sélectionné.\",\r\n\t\t\t},\r\n\t\t\t\"cannot-delete-running-trainer\": {\r\n\t\t\t\ten: \"Unable to cancel training while running\",\r\n\t\t\t\tit: \"Impossibile cancellare il training mentre è in corso\",\r\n\t\t\t\tes: \"No se puede cancelar el entrenamiento mientras se ejecuta\",\r\n\t\t\t\tfr: \"Impossible d'annuler l'entraînement pendant la course\",\r\n\t\t\t},\r\n\t\t\t\"cannot-delete-running-trainer-participants\": {\r\n\t\t\t\ten: \"Unable to cancel training participants while running\",\r\n\t\t\t\tit: \"Impossibile cancellare i partecipanti di un training mentre è in corso\",\r\n\t\t\t\tes: \"No se puede cancelar la capacitación de los participantes mientras se ejecuta\",\r\n\t\t\t\tfr: \"Impossible d'annuler les participants à l' entraînement pendant la course\",\r\n\t\t\t},\r\n\t\t\t\"running-status\": {\r\n\t\t\t\ten: \"Running\",\r\n\t\t\t\tit: \"In corso\",\r\n\t\t\t\tes: \"Corriendo\",\r\n\t\t\t\tfr: \"Fonctionnement\",\r\n\t\t\t},\r\n\t\t\t\"stopped-status\": {\r\n\t\t\t\ten: \"Stopped\",\r\n\t\t\t\tit: \"Fermo\",\r\n\t\t\t\tes: \"Detenido\",\r\n\t\t\t\tfr: \"Arrêté\",\r\n\t\t\t},\r\n\t\t\t\"remove-participants\": {\r\n\t\t\t\ten: \"Do you want to remove all participants from the LIVE session?\",\r\n\t\t\t\tit: \"Vuoi rimuovere tutti i partecipanti dalla sessione LIVE?\",\r\n\t\t\t\tes: \"¿Desea eliminar a todos los participantes de la sesión LIVE?\",\r\n\t\t\t\tfr: \"Voulez-vous supprimer tous les participants de la session LIVE?\",\r\n\t\t\t},\r\n\t\t\t\"delete-uptivo-live\": {\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},\r\n\t\tUptivoLIVEtrainingView: {\r\n\t\t\t\"training-list\": {\r\n\t\t\t\ten: \"Training List\",\r\n\t\t\t\tit: \"Lista Allenamenti\",\r\n\t\t\t\tes: \"Lista De Entrenamiento\",\r\n\t\t\t\tfr: \"Liste Des Entrainement\",\r\n\t\t\t},\r\n\t\t\t\"no-trainer-selected\": {\r\n\t\t\t\ten: \"No Trainer Selected\",\r\n\t\t\t\tit: \"Trainer Non Selezionato\",\r\n\t\t\t\tes: \"No Hay Entrenador Seleccionado\",\r\n\t\t\t\tfr: \"Aucun Entraîneur Sélectionné\",\r\n\t\t\t},\r\n\t\t\t\"participants-max\": {\r\n\t\t\t\ten: \"Participants/max\",\r\n\t\t\t\tit: \"Partecipanti/max\",\r\n\t\t\t\tes: \"Participantes/max\",\r\n\t\t\t\tfr: \"Participants/max\",\r\n\t\t\t},\r\n\t\t\t\"add-live-training\": {\r\n\t\t\t\ten: \"Add Live Training\",\r\n\t\t\t\tit: \"Aggiungi Allenamento Live\",\r\n\t\t\t\tes: \"Editar Entrenamiento En Vivo\",\r\n\t\t\t\tfr: \"Ajouter Entraînement en direct\",\r\n\t\t\t},\r\n\t\t\t\"edit-live-training\": {\r\n\t\t\t\ten: \"Edit Live Training\",\r\n\t\t\t\tit: \"Modifica Allenamento Live\",\r\n\t\t\t\tes: \"Agregar Entrenamiento En Vivo\",\r\n\t\t\t\tfr: \"Modifier Entraînement En Direct\",\r\n\t\t\t},\r\n\t\t\t\"subscription-type\": {\r\n\t\t\t\ten: \"Subscription Type*\",\r\n\t\t\t\tit: \"Tipo Di Iscrizione*\",\r\n\t\t\t\tes: \"Tipo De Registro*\",\r\n\t\t\t\tfr: \"Type D'Inscription*\",\r\n\t\t\t},\r\n\t\t\t\"save-to-generate-id\": {\r\n\t\t\t\ten: \"Create LIVE to generate\",\r\n\t\t\t\tit: \"Crea il LIVE per generarlo\",\r\n\t\t\t\tes: \"Crea el LIVE para generarlo\",\r\n\t\t\t\tfr: \"Créez le LIVE pour le générer\",\r\n\t\t\t},\r\n\t\t},\r\n\t\tClubClassView: {\r\n\t\t\tSun: {\r\n\t\t\t\ten: \"Sun\",\r\n\t\t\t\tit: \"Dom\",\r\n\t\t\t\tes: \"Dom\",\r\n\t\t\t\tfr: \"Dim\",\r\n\t\t\t},\r\n\t\t\tMon: {\r\n\t\t\t\ten: \"Mon\",\r\n\t\t\t\tit: \"Lun\",\r\n\t\t\t\tes: \"Lun\",\r\n\t\t\t\tfr: \"Lun\",\r\n\t\t\t},\r\n\t\t\tTue: {\r\n\t\t\t\ten: \"Tue\",\r\n\t\t\t\tit: \"Mar\",\r\n\t\t\t\tes: \"Mar\",\r\n\t\t\t\tfr: \"Mar\",\r\n\t\t\t},\r\n\t\t\tWed: {\r\n\t\t\t\ten: \"Wed\",\r\n\t\t\t\tit: \"Mer\",\r\n\t\t\t\tes: \"Mié\",\r\n\t\t\t\tfr: \"Mer\",\r\n\t\t\t},\r\n\t\t\tThu: {\r\n\t\t\t\ten: \"Thu\",\r\n\t\t\t\tit: \"Gio\",\r\n\t\t\t\tes: \"Jue\",\r\n\t\t\t\tfr: \"Jeu\",\r\n\t\t\t},\r\n\t\t\tFri: {\r\n\t\t\t\ten: \"Fri\",\r\n\t\t\t\tit: \"Ven\",\r\n\t\t\t\tes: \"Vie\",\r\n\t\t\t\tfr: \"Ven\",\r\n\t\t\t},\r\n\t\t\tSat: {\r\n\t\t\t\ten: \"Sat\",\r\n\t\t\t\tit: \"Sab\",\r\n\t\t\t\tes: \"Sáb\",\r\n\t\t\t\tfr: \"Sam\",\r\n\t\t\t},\r\n\t\t\t\"class-description\": {\r\n\t\t\t\ten: \"Description\",\r\n\t\t\t\tit: \"Descrizione\",\r\n\t\t\t\tes: \"Descripción\",\r\n\t\t\t\tfr: \"Description\",\r\n\t\t\t},\r\n\t\t\tpicture: {\r\n\t\t\t\ten: \"Picture\",\r\n\t\t\t\tit: \"Immagine\",\r\n\t\t\t\tes: \"Imagen\",\r\n\t\t\t\tfr: \"Image\",\r\n\t\t\t},\r\n\t\t\t\"invite-booking-mode\": {\r\n\t\t\t\ten: \"Invite\",\r\n\t\t\t\tit: \"A Invito\",\r\n\t\t\t\tes: \"Invitación\",\r\n\t\t\t\tfr: \"Invitation\",\r\n\t\t\t},\r\n\t\t\t\"open-booking-mode\": {\r\n\t\t\t\ten: \"Bookable\",\r\n\t\t\t\tit: \"Prenotabile\",\r\n\t\t\t\tes: \"Reservable\",\r\n\t\t\t\tfr: \"Réservable\",\r\n\t\t\t},\r\n\t\t\t\"not-bookable-booking-mode\": {\r\n\t\t\t\ten: \"Free\",\r\n\t\t\t\tit: \"Libero\",\r\n\t\t\t\tes: \"Libre\",\r\n\t\t\t\tfr: \"Libre\",\r\n\t\t\t},\r\n\t\t\t\"external-booking-mode\": {\r\n\t\t\t\ten: \"External APP Link\",\r\n\t\t\t\tit: \"Link APP Esterna\",\r\n\t\t\t\tes: \"Link APP Externa\",\r\n\t\t\t\tfr: \"Lien APP Externe\",\r\n\t\t\t},\r\n\t\t\t\"cannot-change-bookingmode-not-bookable\": {\r\n\t\t\t\ten: \"Impossible to change the booking method to 'Open' because there are already participants.\",\r\n\t\t\t\tit: \"Impossibile cambiare la modalità di prenotazione su 'Aperto' perchè sono già presenti dei partecipanti.\",\r\n\t\t\t\tes: \"Imposible cambiar el método de reserva a 'Abierto' porque ya hay participantes.\",\r\n\t\t\t\tfr: \"Impossible de changer la méthode de réservation en Ouvert car il y a déjà des participants.\",\r\n\t\t\t},\r\n\t\t\t\"max-slots\": {\r\n\t\t\t\ten: \"Available Places\",\r\n\t\t\t\tit: \"Posti Max\",\r\n\t\t\t\tes: \"Plazas Disponibles\",\r\n\t\t\t\tfr: \"Places Disponibles\",\r\n\t\t\t},\r\n\t\t\tschedule: {\r\n\t\t\t\ten: \"Schedule\",\r\n\t\t\t\tit: \"Programmazione\",\r\n\t\t\t\tes: \"Programación\",\r\n\t\t\t\tfr: \"Programmation\",\r\n\t\t\t},\r\n\t\t\t\"add-new-dates\": {\r\n\t\t\t\ten: \"Add New Dates\",\r\n\t\t\t\tit: \"Aggiungi\",\r\n\t\t\t\tes: \"Añadir\",\r\n\t\t\t\tfr: \"Ajouter\",\r\n\t\t\t},\r\n\t\t\t\"generated-activities\": {\r\n\t\t\t\ten: \"Generated Activities\",\r\n\t\t\t\tit: \"Lista Attività\",\r\n\t\t\t\tes: \"Actividades\",\r\n\t\t\t\tfr: \"Planning\",\r\n\t\t\t},\r\n\t\t\t\"lesson-schedule\": {\r\n\t\t\t\ten: \"Lesson Schedule\",\r\n\t\t\t\tit: \"Programmazione \",\r\n\t\t\t\tes: \"Programación\",\r\n\t\t\t\tfr: \"Programmation\",\r\n\t\t\t},\r\n\t\t\t\"create-class\": {\r\n\t\t\t\tit: \"Crea Attività\",\r\n\t\t\t\ten: \"Create Activity\",\r\n\t\t\t\tes: \"Crear actividad\",\r\n\t\t\t\tfr: \"Créer activité\",\r\n\t\t\t},\r\n\t\t\tdelete: {\r\n\t\t\t\ten: \"Delete\",\r\n\t\t\t\tit: \"Elimina\",\r\n\t\t\t\tes: \"Eliminar\",\r\n\t\t\t\tfr: \"Supprimer\",\r\n\t\t\t},\r\n\t\t\ttype: {\r\n\t\t\t\ten: \"Type\",\r\n\t\t\t\tit: \"Tipo\",\r\n\t\t\t\tes: \"Tipo\",\r\n\t\t\t\tfr: \"Type\",\r\n\t\t\t},\r\n\t\t\tstart: {\r\n\t\t\t\ten: \"From\",\r\n\t\t\t\tit: \"Da\",\r\n\t\t\t\tes: \"Desde\",\r\n\t\t\t\tfr: \"De\",\r\n\t\t\t},\r\n\t\t\tend: {\r\n\t\t\t\ten: \"To\",\r\n\t\t\t\tit: \"Fino a\",\r\n\t\t\t\tes: \"Hasta\",\r\n\t\t\t\tfr: \"Jusqu'à\",\r\n\t\t\t},\r\n\t\t\t\"schedule-limit-reached\": {\r\n\t\t\t\ten: \"Impossible to schedule other dates. Limit reached.\",\r\n\t\t\t\tit: \"Impossibile programmare altre date. Limite raggiunto.\",\r\n\t\t\t\tes: \"Imposible programar otras fechas. Límite alcanzado.\",\r\n\t\t\t\tfr: \"Impossible de programmer d'autres dates. Limite atteinte.\",\r\n\t\t\t},\r\n\t\t\t\"need-at-least-one-place\": {\r\n\t\t\t\ten: \"You must enter at least one seat available locally or remotely\",\r\n\t\t\t\tit: \"Devi inserire almeno un posto disponibile sul posto o in remoto\",\r\n\t\t\t\tes: \"Debe ingresar al menos un asiento disponible localmente o en línea\",\r\n\t\t\t\tfr: \"Vous devez saisir au moins un siège disponible localement ou à distance\",\r\n\t\t\t},\r\n\t\t\t\"trainer-must-be-registered\": {\r\n\t\t\t\ten: \"To enable LIVE you need to select a trainer registered in your club\",\r\n\t\t\t\tit: \"Per abilitare i LIVE devi selezionare un trainer registrato nel tuo club\",\r\n\t\t\t\tes: \"Para habilitar LIVE necesitas seleccionar un entrenador registrado en tu club\",\r\n\t\t\t\tfr: \"Pour activer LIVE, vous devez sélectionner un entraîneur inscrit dans votre club\",\r\n\t\t\t},\r\n\t\t\t\"activity-succesfully-updated\": {\r\n\t\t\t\ten: \"Activity succesfully updated\",\r\n\t\t\t\tit: \"Attività aggiornata correttamente\",\r\n\t\t\t\tes: \"Actividad actualizada con éxito\",\r\n\t\t\t\tfr: \"Activité mise à jour avec succès\",\r\n\t\t\t},\r\n\t\t\t\"schedule-not-generate-event\": {\r\n\t\t\t\ten: \"Schedule does not generate valid events\",\r\n\t\t\t\tit: \"La programmazione impostata non genera nessun evento valido\",\r\n\t\t\t\tes: \"La programación no genera eventos válidos\",\r\n\t\t\t\tfr: \"La planification ne génère pas d'événements valides\",\r\n\t\t\t},\r\n\t\t\t\"cannot-unpublish-if-participants\": {\r\n\t\t\t\ten: \"It is not possible to change the activation status if participants are present\",\r\n\t\t\t\tit: \"Non è possibile cambiare lo stato di attivazione se sono presenti dei partecipanti\",\r\n\t\t\t\tes: \"No es posible cambiar el estado de activación si hay participantes\",\r\n\t\t\t\tfr: \"Il n'est pas possible de changer le statut d'activation s'il y a des participants\",\r\n\t\t\t},\r\n\t\t\tupdated: {\r\n\t\t\t\ten: \"Updated\",\r\n\t\t\t\tit: \"Aggiornato/a\",\r\n\t\t\t\tes: \"Actualizado/a\",\r\n\t\t\t\tfr: \"Actualisé\",\r\n\t\t\t},\r\n\t\t\t\"confirm-remove-date\": {\r\n\t\t\t\ten: \"You are about to remove the following date from programming \",\r\n\t\t\t\tit: \"Stai per rimuovere la seguente data dalla programmazione \",\r\n\t\t\t\tes: \"Está a punto de eliminar la siguiente fecha de la programación \",\r\n\t\t\t\tfr: \"Vous êtes sur le point de supprimer la date suivante de la programmation\",\r\n\t\t\t},\r\n\t\t\t\"must-have-one-schedule\": {\r\n\t\t\t\ten: \"You must enter at least one event in the schedule\",\r\n\t\t\t\tit: \"Devi inserire almeno un evento nella programmazione\",\r\n\t\t\t\tes: \"Debes ingresar al menos un evento en el horario\",\r\n\t\t\t\tfr: \"Vous devez saisir au moins un événement dans le calendrier\",\r\n\t\t\t},\r\n\t\t\t\"schedule-contains-invalid-dates\": {\r\n\t\t\t\ten: \"The schedule contains invalid dates\",\r\n\t\t\t\tit: \"La programmazione contiene date non valide\",\r\n\t\t\t\tes: \"La programación contiene fechas inválidas\",\r\n\t\t\t\tfr: \"La programmation contient des dates non valides\",\r\n\t\t\t},\r\n\t\t\t\"schedule-contains-invalid-dates-end-earlier\": {\r\n\t\t\t\ten: \"The schedule contains an end date that is earlier than a start date\",\r\n\t\t\t\tit: \"La programmazione contiene una data di fine antecedente a una data di inizio\",\r\n\t\t\t\tes: \"La programación contiene una fecha de finalización anterior a la fecha de inicio\",\r\n\t\t\t\tfr: \"La programmation contient une date de fin antérieure à une date de début\",\r\n\t\t\t},\r\n\t\t\t\"schedule-contains-invalid-start-time\": {\r\n\t\t\t\ten: \"The schedule contains an invalid start time\",\r\n\t\t\t\tit: \"La programmazione contiene un' ora di inizio non valida\",\r\n\t\t\t\tes: \"La programación contiene una hora de inicio no válida.\",\r\n\t\t\t\tfr: \"La programmation contient une heure de début invalide\",\r\n\t\t\t},\r\n\t\t\t\"schedule-contains-invalid-duration\": {\r\n\t\t\t\ten: \"The schedules must contain a duration between 10 and 240\",\r\n\t\t\t\tit: \"Le programmazioni devono contenere una durata compresa fra 10 e 240\",\r\n\t\t\t\tes: \"La programación debe contener una duración entre 10 y 240\",\r\n\t\t\t\tfr: \"La programmation doit contenir une durée comprise entre 10 et 240\",\r\n\t\t\t},\r\n\t\t\t\"schedule-exceeded-maximum-months\": {\r\n\t\t\t\ten: \"Schedule has exceeded the maximum number of months: \",\r\n\t\t\t\tit: \"La programmazione ha superato il numero massimo di mesi: \",\r\n\t\t\t\tes: \"La programación ha excedido el número máximo de meses: \",\r\n\t\t\t\tfr: \"La programmation a dépassé le nombre maximum de mois: \",\r\n\t\t\t},\r\n\t\t\t\"all-schedule-date-in-past\": {\r\n\t\t\t\ten: \"The schedule contains all dates in the past\",\r\n\t\t\t\tit: \"La programmazione contiene tutte date nel passato\",\r\n\t\t\t\tes: \"El horario contiene todas las fechas en el pasado\",\r\n\t\t\t\tfr: \"Le calendrier contient toutes les dates du passé\",\r\n\t\t\t},\r\n\t\t\t\"lesson-schedule-end-date-in-past\": {\r\n\t\t\t\ten: \"The end date of the lesson cannot be in the past\",\r\n\t\t\t\tit: \"La data di fine della lezione non può essere nel passato\",\r\n\t\t\t\tes: \"La fecha de finalización de la lección no puede ser anterior a la anterior\",\r\n\t\t\t\tfr: \"La date de fin de la leçon ne peut pas être dans le passé\",\r\n\t\t\t},\r\n\t\t\t\"calendar-visibility-must-be-greater-booking-before\": {\r\n\t\t\t\ten: \"'Calendar Visibility' must be greater or equal than 'Booking Before'\",\r\n\t\t\t\tit: \"'Visibilità Calendario' deve essere maggiore o uguale di 'Prenota Entro'\",\r\n\t\t\t\tes: \"'Calendrier Visibilidad' debe ser mayor o igual que la 'Reserva Antes'\",\r\n\t\t\t\tfr: \"'Visibilité Calendario' doit être supérieure ou égale à 'Réservation Avant'\",\r\n\t\t\t},\r\n\t\t\t\"booking-before-must-be-greater-cancel-before\": {\r\n\t\t\t\ten: \"'Booking Before' must be greater or equal than 'Cancel Before'\",\r\n\t\t\t\tit: \"'Prenota Entro' deve essere maggiore o uguale di 'Disdici Entro'\",\r\n\t\t\t\tes: \"'Reserva Antes' debe ser mayor o igual que la 'Cancelas Antes'\",\r\n\t\t\t\tfr: \"'Réservation Avant' doit être supérieure ou égale à 'Annuler Avant'\",\r\n\t\t\t},\r\n\t\t\t\"booking-before-must-be-greater-than-max-cancel-before\": {\r\n\t\t\t\ten: \"The 'Booking Before' value entered conflicts with the 'Cancel Before' value of some lessons. Insert a value greater than or equal to {0}\",\r\n\t\t\t\tit: \"Il valore di 'Prenota Entro' inserito va in conflitto con il valore di 'Disdici Entro' di alcune lezioni. Inserire un volore maggiore o uguale a {0}\",\r\n\t\t\t\tes: \"El valor 'Reserva antes' ingresado entra en conflicto con el valor 'Cancelar antes' de algunas lecciones. Inserte un valor mayor o igual que {0}\",\r\n\t\t\t\tfr: \"La valeur 'Réservation avant' entrée est en conflit avec la valeur 'Annuler avant' de certaines training. Insérez une valeur supérieure ou égale à {0}\",\r\n\t\t\t},\r\n\t\t\t\"cancel-before-must-be-minor-than-min-booking-before\": {\r\n\t\t\t\ten: \"The 'Cancel Before' value entered conflicts with the 'Booking Before' value of some lessons. Insert a value less than or equal to {0}\",\r\n\t\t\t\tit: \"Il valore di 'Disdici Entro' inserito va in conflitto con il valore di 'Prenota Entro' di alcune lezioni. Inserire un volore minore o uguale a {0}\",\r\n\t\t\t\tes: \"El valor 'Cancelar antes' ingresado entra en conflicto con el valor 'Reservar antes' de algunas lecciones. Inserte un valor menor o igual que {0}\",\r\n\t\t\t\tfr: \"La valeur 'Annuler avant' entrée entre en conflit avec la valeur 'Réservation avant' de certaines training. Insérer une valeur inférieure ou égale à {0}\",\r\n\t\t\t},\r\n\t\t\t\"max-schedule-begin-in-future-days-error\": {\r\n\t\t\t\ten: \"You cannot schedule activities beyond six months into the future\",\r\n\t\t\t\tit: \"Non puoi programmare attività oltre sei mesi nel futuro\",\r\n\t\t\t\tes: \"No puede programar actividades más allá de seis meses en el futuro\",\r\n\t\t\t\tfr: \"Vous ne pouvez pas planifier d'activités au-delà de six mois dans le futur\",\r\n\t\t\t},\r\n\t\t\t\"max-global-duration-days-error\": {\r\n\t\t\t\ten: \"You cannot schedule activities with a total duration of more than 370 days\",\r\n\t\t\t\tit: \"Non puoi programmare attività con una durata totale superiore a 370 giorni\",\r\n\t\t\t\tes: \"No puede programar actividades con una duración total de más de 370 días\",\r\n\t\t\t\tfr: \"Vous ne pouvez pas planifier d'activités d'une durée totale supérieure à 370 jours\",\r\n\t\t\t},\r\n\t\t\t\"confirm-publish-lesson-template\": {\r\n\t\t\t\ten: \"You are generating a single lesson for each scheduled event.\",\r\n\t\t\t\tit: \"Stai generando una singola lezione per ogni evento programmato.\",\r\n\t\t\t\tes: \"Estás generando una sola lección para cada evento programado.\",\r\n\t\t\t\tfr: \"Vous générez une seule leçon pour chaque événement programmé.\",\r\n\t\t\t},\r\n\t\t\t\"cannot-delete-activity-in-the-past\": {\r\n\t\t\t\ten: \"Unable to delete an activity in the past\",\r\n\t\t\t\tit: \"Impossibile cancellare un'attività nel passato\",\r\n\t\t\t\tes: \"No se pudo borrar una actividad en el pasado\",\r\n\t\t\t\tfr: \"Impossible de supprimer une activité dans le passé\",\r\n\t\t\t},\r\n\t\t\t\"class-is-unpublished-cannot-edit-participants\": {\r\n\t\t\t\ten: \"Activate the activity in order to add/remove participants\",\r\n\t\t\t\tit: \"Attiva l'attività per aggiungere/rimuovere partecipanti\",\r\n\t\t\t\tes: \"Activar la actividad para agregar/quitar participantes.\",\r\n\t\t\t\tfr: \"Activer l'activité pour ajouter/supprimer des participants\",\r\n\t\t\t},\r\n\t\t\t\"class-has-no-participants\": {\r\n\t\t\t\ten: \"The activity has no participants\",\r\n\t\t\t\tit: \"L'attività non ha nessun partecipante\",\r\n\t\t\t\tes: \"La actividad no tiene participantes\",\r\n\t\t\t\tfr: \"L'activité n'a pas de participants\",\r\n\t\t\t},\r\n\t\t\t\"live-unavailable\": {\r\n\t\t\t\ten: \"Unavailable\",\r\n\t\t\t\tit: \"Non disponibile\",\r\n\t\t\t\tes: \"Indisponible\",\r\n\t\t\t\tfr: \"Indisponible\",\r\n\t\t\t},\r\n\t\t\t\"full-day\": {\r\n\t\t\t\ten: \"Full Day\",\r\n\t\t\t\tit: \"Giornata Intera\",\r\n\t\t\t\tes: \"Día Completo\",\r\n\t\t\t\tfr: \"Journée Complète\",\r\n\t\t\t},\r\n\t\t\t\"free-access\": {\r\n\t\t\t\ten: \"Free Access\",\r\n\t\t\t\tit: \"Accesso Libero\",\r\n\t\t\t\tes: \"Acceso Libre\",\r\n\t\t\t\tfr: \"Accès Libre\",\r\n\t\t\t},\r\n\t\t\t\"personal-trainer\": {\r\n\t\t\t\ten: \"Personal Trainer\",\r\n\t\t\t\tit: \"Personal Trainer\",\r\n\t\t\t\tes: \"Personal Trainer\",\r\n\t\t\t\tfr: \"Personal Trainer\",\r\n\t\t\t},\r\n\t\t\t\"personal-trainer\": {\r\n\t\t\t\ten: \"Personal Trainer\",\r\n\t\t\t\tit: \"Personal Trainer\",\r\n\t\t\t\tes: \"Personal Trainer\",\r\n\t\t\t\tfr: \"Personal Trainer\",\r\n\t\t\t},\r\n\t\t\t\"credits-required\": {\r\n\t\t\t\ten: \"Credits required\",\r\n\t\t\t\tit: \"Crediti obbligatori\",\r\n\t\t\t\tes: \"Créditos requeridos\",\r\n\t\t\t\tfr: \"Crédits requis\",\r\n\t\t\t},\r\n\t\t\t\"edit-subscriptions\": {\r\n\t\t\t\ten: \"Edit Subscriptions\",\r\n\t\t\t\tit: \"Modifica Abbonamenti\",\r\n\t\t\t\tes: \"Editar Suscripciones\",\r\n\t\t\t\tfr: \"Modification Abonnements\",\r\n\t\t\t},\r\n\t\t\t\"select-subscriptions\": {\r\n\t\t\t\ten: \"Select Subscriptions\",\r\n\t\t\t\tit: \"Seleziona Abbonamenti\",\r\n\t\t\t\tes: \"Seleccione Suscripciones\",\r\n\t\t\t\tfr: \"Sélectionnez Abonnements\",\r\n\t\t\t},\r\n\t\t\t\"error-increase-onsite-participants-because-class-has-queue\": {\r\n\t\t\t\ten: \"Impossible to increase the number of seats available in presence because there are participants in the queue\",\r\n\t\t\t\tit: \"Impossibile aumentare i posti disponibili in presenza perchè ci sono partecipanti in coda\",\r\n\t\t\t\tes: \"Es imposible aumentar el número de asientos disponibles en presencia porque hay participantes en la cola\",\r\n\t\t\t\tfr: \"Il est impossible d'augmenter le nombre de places disponibles en présence car il y a des participants dans la file d'attente\",\r\n\t\t\t},\r\n\t\t\t\"error-increase-remote-participants-because-class-has-queue\": {\r\n\t\t\t\ten: \"Impossible to increase the number of seats available in remote because there are participants in the queue\",\r\n\t\t\t\tit: \"Impossibile aumentare i posti disponibili da remoto perchè ci sono partecipanti in coda\",\r\n\t\t\t\tes: \"Es imposible aumentar el número de asientos disponibles de forma remota porque hay participantes en la cola.\",\r\n\t\t\t\tfr: \"Il est impossible d'augmenter le nombre de places disponibles à distance car il y a des participants dans la file d'attente\",\r\n\t\t\t},\r\n\t\t},\r\n\t\tClubClassesView: {\r\n\t\t\t\"club-activities\": {\r\n\t\t\t\ten: \"Club Activities\",\r\n\t\t\t\tit: \"Attività del Club\",\r\n\t\t\t\tes: \"Actividades del Club\",\r\n\t\t\t\tfr: \"Planning Du Club\",\r\n\t\t\t},\r\n\t\t\t\"add-new-course\": {\r\n\t\t\t\ten: \"Add Course\",\r\n\t\t\t\tit: \"Aggiungi Corso\",\r\n\t\t\t\tes: \"Agregar Curso\",\r\n\t\t\t\tfr: \"Ajouter Évènements\",\r\n\t\t\t},\r\n\t\t\t\"add-new-class\": {\r\n\t\t\t\ten: \"Add Lessons\",\r\n\t\t\t\tit: \"Aggiungi Lezioni\",\r\n\t\t\t\tes: \"Agregar Lecciones\",\r\n\t\t\t\tfr: \"Ajouter Des Training\",\r\n\t\t\t},\r\n\t\t\twhen: {\r\n\t\t\t\ten: \"When\",\r\n\t\t\t\tit: \"Quando\",\r\n\t\t\t\tes: \"Cuando\",\r\n\t\t\t\tfr: \"Quand\",\r\n\t\t\t},\r\n\t\t\t\"onsite-credits\": {\r\n\t\t\t\ten: \"Credits for on-site registration: \",\r\n\t\t\t\tit: \"Crediti per iscrizione in presenza: \",\r\n\t\t\t\tes: \"Créditos por registro en el sitio: \",\r\n\t\t\t\tfr: \"Crédits pour inscription sur place: \",\r\n\t\t\t},\r\n\t\t\t\"home-credits\": {\r\n\t\t\t\ten: \"Credits for home registration: \",\r\n\t\t\t\tit: \"Crediti per iscrizione online: \",\r\n\t\t\t\tes: \"Créditos por registro en linea: \",\r\n\t\t\t\tfr: \"Crédits pour inscription en ligne: \",\r\n\t\t\t},\r\n\t\t\t\"onsite-tickets\": {\r\n\t\t\t\ten: \"Tickets for on-site registration: \",\r\n\t\t\t\tit: \"Ingressi per iscrizione in presenza: \",\r\n\t\t\t\tes: \"Tickets por registro en el sitio: \",\r\n\t\t\t\tfr: \"Tickets pour inscription sur place: \",\r\n\t\t\t},\r\n\t\t\t\"home-tickets\": {\r\n\t\t\t\ten: \"Tickets for home registration: \",\r\n\t\t\t\tit: \"Ingressi per iscrizione online: \",\r\n\t\t\t\tes: \"Tickets por registro en linea: \",\r\n\t\t\t\tfr: \"Tickets pour inscription en ligne: \",\r\n\t\t\t},\r\n\t\t\t\"credits-required\": {\r\n\t\t\t\ten: \"Credits required\",\r\n\t\t\t\tit: \"Crediti obbligatori\",\r\n\t\t\t\tes: \"Créditos requeridos\",\r\n\t\t\t\tfr: \"Crédits requis\",\r\n\t\t\t},\r\n\t\t\t\"class-description\": {\r\n\t\t\t\ten: \"Description\",\r\n\t\t\t\tit: \"Descrizione\",\r\n\t\t\t\tes: \"Descripción\",\r\n\t\t\t\tfr: \"Description\",\r\n\t\t\t},\r\n\t\t\t\"max-slots\": {\r\n\t\t\t\ten: \"Available Places\",\r\n\t\t\t\tit: \"Posti Max\",\r\n\t\t\t\tes: \"Plazas Disponibles\",\r\n\t\t\t\tfr: \"Places Disponibles\",\r\n\t\t\t},\r\n\t\t\t\"selected-activities\": {\r\n\t\t\t\ten: \"selected activities\",\r\n\t\t\t\tit: \"attività selezionate\",\r\n\t\t\t\tes: \"actividades seleccionadas\",\r\n\t\t\t\tfr: \"activités sélectionnées\",\r\n\t\t\t},\r\n\t\t},\r\n\t\tPersonalTrainersView: {\r\n\t\t\t\"personal-trainers\": {\r\n\t\t\t\ten: \"Personal Trainers\",\r\n\t\t\t\tit: \"Personal Trainers\",\r\n\t\t\t\tes: \"Personal Trainers\",\r\n\t\t\t\tfr: \"Personal Trainers\",\r\n\t\t\t},\r\n\t\t\t\"add-single-lesson\": {\r\n\t\t\t\ten: \"Add Single Lesson\",\r\n\t\t\t\tit: \"Aggiungi Lezione Singola\",\r\n\t\t\t\tes: \"Agregar Lección De Sigle\",\r\n\t\t\t\tfr: \"Ajouter Une Seule Leçon\",\r\n\t\t\t},\r\n\t\t\t\"add-lessons\": {\r\n\t\t\t\ten: \"Add Lessons\",\r\n\t\t\t\tit: \"Aggiungi Lezioni\",\r\n\t\t\t\tes: \"Agregar Lecciones\",\r\n\t\t\t\tfr: \"Ajouter Des Training\",\r\n\t\t\t},\r\n\t\t\t\"repeat-for\": {\r\n\t\t\t\ten: \"Repeat For\",\r\n\t\t\t\tit: \"Ripeti Per\",\r\n\t\t\t\tes: \"Repetir Para\",\r\n\t\t\t\tfr: \"Répéter Pour\",\r\n\t\t\t},\r\n\t\t\t\"repeat-every\": {\r\n\t\t\t\ten: \"Repeat Every\",\r\n\t\t\t\tit: \"Ripeti Ogni\",\r\n\t\t\t\tes: \"Repetir Cada\",\r\n\t\t\t\tfr: \"Répéter Chaque\",\r\n\t\t\t},\r\n\t\t\twhen: {\r\n\t\t\t\ten: \"When\",\r\n\t\t\t\tit: \"Quando\",\r\n\t\t\t\tes: \"Cuando\",\r\n\t\t\t\tfr: \"Quand\",\r\n\t\t\t},\r\n\t\t\t\"onsite-credits\": {\r\n\t\t\t\ten: \"Credits for on-site registration: \",\r\n\t\t\t\tit: \"Crediti per iscrizione sul posto: \",\r\n\t\t\t\tes: \"Créditos por registro en el sitio: \",\r\n\t\t\t\tfr: \"Crédits pour inscription sur place: \",\r\n\t\t\t},\r\n\t\t\t\"home-credits\": {\r\n\t\t\t\ten: \"Credits for home registration: \",\r\n\t\t\t\tit: \"Crediti per iscrizione online: \",\r\n\t\t\t\tes: \"Créditos por registro en linea: \",\r\n\t\t\t\tfr: \"Crédits pour inscription en ligne: \",\r\n\t\t\t},\r\n\t\t\tlocation: {\r\n\t\t\t\ten: \"Location\",\r\n\t\t\t\tit: \"Luogo\",\r\n\t\t\t\tes: \"Sitio\",\r\n\t\t\t\tfr: \"Lieu\",\r\n\t\t\t},\r\n\t\t\t\"credits-required\": {\r\n\t\t\t\ten: \"Credits required\",\r\n\t\t\t\tit: \"Crediti obbligatori\",\r\n\t\t\t\tes: \"Créditos requeridos\",\r\n\t\t\t\tfr: \"Crédits requis\",\r\n\t\t\t},\r\n\t\t\t\"class-description\": {\r\n\t\t\t\ten: \"Description\",\r\n\t\t\t\tit: \"Descrizione\",\r\n\t\t\t\tes: \"Descripción\",\r\n\t\t\t\tfr: \"Description\",\r\n\t\t\t},\r\n\t\t\t\"max-slots\": {\r\n\t\t\t\ten: \"Available Places\",\r\n\t\t\t\tit: \"Posti Max\",\r\n\t\t\t\tes: \"Plazas Disponibles\",\r\n\t\t\t\tfr: \"Places Disponibles\",\r\n\t\t\t},\r\n\t\t\t\"pt-lesson\": {\r\n\t\t\t\ten: \"PT lesson\",\r\n\t\t\t\tit: \"Lezione PT\",\r\n\t\t\t\tes: \"Lección PT\",\r\n\t\t\t\tfr: \"Leçon TP\",\r\n\t\t\t},\r\n\t\t\t\"add-new-pt-lesson\": {\r\n\t\t\t\ten: \"Add New PT Lesson\",\r\n\t\t\t\tit: \"Aggiungi Nuova Lezione PT\",\r\n\t\t\t\tes: \"Agregar Nueva Lección De PT\",\r\n\t\t\t\tfr: \"Ajouter Une Nouvelle Leçon PT\",\r\n\t\t\t},\r\n\t\t},\r\n\t\tServicesView: {\r\n\t\t\t\"add-service\": {\r\n\t\t\t\ten: \"Add Single Service\",\r\n\t\t\t\tit: \"Aggiungi Singolo Servizio\",\r\n\t\t\t\tes: \"Agregar Servicio Unico\",\r\n\t\t\t\tfr: \"Ajouter Service Unique\",\r\n\t\t\t},\r\n\t\t\t\"add-services\": {\r\n\t\t\t\ten: \"Add Services\",\r\n\t\t\t\tit: \"Aggiungi Servizi\",\r\n\t\t\t\tes: \"Agregar Servicios\",\r\n\t\t\t\tfr: \"Ajouter Services\",\r\n\t\t\t},\r\n\t\t\tservice: {\r\n\t\t\t\ten: \"Service\",\r\n\t\t\t\tit: \"Servizio\",\r\n\t\t\t\tes: \"Servicio\",\r\n\t\t\t\tfr: \"Service\",\r\n\t\t\t},\r\n\t\t\t\"repeat-for\": {\r\n\t\t\t\ten: \"Repeat For\",\r\n\t\t\t\tit: \"Ripeti Per\",\r\n\t\t\t\tes: \"Repetir Para\",\r\n\t\t\t\tfr: \"Répéter Pour\",\r\n\t\t\t},\r\n\t\t\t\"repeat-every\": {\r\n\t\t\t\ten: \"Repeat Every\",\r\n\t\t\t\tit: \"Ripeti Ogni\",\r\n\t\t\t\tes: \"Repetir Cada\",\r\n\t\t\t\tfr: \"Répéter Chaque\",\r\n\t\t\t},\r\n\t\t\twhen: {\r\n\t\t\t\ten: \"When\",\r\n\t\t\t\tit: \"Quando\",\r\n\t\t\t\tes: \"Cuando\",\r\n\t\t\t\tfr: \"Quand\",\r\n\t\t\t},\r\n\t\t\t\"onsite-credits\": {\r\n\t\t\t\ten: \"Credits for on-site registration: \",\r\n\t\t\t\tit: \"Crediti per iscrizione sul posto: \",\r\n\t\t\t\tes: \"Créditos por registro en el sitio: \",\r\n\t\t\t\tfr: \"Crédits pour inscription sur place: \",\r\n\t\t\t},\r\n\t\t\t\"home-credits\": {\r\n\t\t\t\ten: \"Credits for home registration: \",\r\n\t\t\t\tit: \"Crediti per iscrizione online: \",\r\n\t\t\t\tes: \"Créditos por registro en linea: \",\r\n\t\t\t\tfr: \"Crédits pour inscription en ligne: \",\r\n\t\t\t},\r\n\t\t\tlocation: {\r\n\t\t\t\ten: \"Location\",\r\n\t\t\t\tit: \"Luogo\",\r\n\t\t\t\tes: \"Sitio\",\r\n\t\t\t\tfr: \"Lieu\",\r\n\t\t\t},\r\n\t\t\t\"credits-required\": {\r\n\t\t\t\ten: \"Credits required\",\r\n\t\t\t\tit: \"Crediti obbligatori\",\r\n\t\t\t\tes: \"Créditos requeridos\",\r\n\t\t\t\tfr: \"Crédits requis\",\r\n\t\t\t},\r\n\t\t\t\"class-description\": {\r\n\t\t\t\ten: \"Description\",\r\n\t\t\t\tit: \"Descrizione\",\r\n\t\t\t\tes: \"Descripción\",\r\n\t\t\t\tfr: \"Description\",\r\n\t\t\t},\r\n\t\t\t\"max-slots\": {\r\n\t\t\t\ten: \"Available Places\",\r\n\t\t\t\tit: \"Posti Max\",\r\n\t\t\t\tes: \"Plazas Disponibles\",\r\n\t\t\t\tfr: \"Places Disponibles\",\r\n\t\t\t},\r\n\t\t\t\"service-lesson\": {\r\n\t\t\t\ten: \"Service Lesson\",\r\n\t\t\t\tit: \"Lezione Servizio\",\r\n\t\t\t\tes: \"Lección De Servicio\",\r\n\t\t\t\tfr: \"Leçon De Service\",\r\n\t\t\t},\r\n\t\t\t\"add-new-service-lesson\": {\r\n\t\t\t\ten: \"Add New Service Lesson\",\r\n\t\t\t\tit: \"Aggiungi Nuova Lezione Servizio\",\r\n\t\t\t\tes: \"Agregar Nueva Lección De Servicio\",\r\n\t\t\t\tfr: \"Ajouter Une Nouvelle Leçon Service\",\r\n\t\t\t},\r\n\t\t},\r\n\t\tClubClassParticipantsView: {\r\n\t\t\tbooked: {\r\n\t\t\t\ten: \"Booked\",\r\n\t\t\t\tit: \"Prenotati\",\r\n\t\t\t\tes: \"Reservado\",\r\n\t\t\t\tfr: \"Réservé\",\r\n\t\t\t},\r\n\t\t\twaiting: {\r\n\t\t\t\ten: \"Waiting\",\r\n\t\t\t\tit: \"In coda\",\r\n\t\t\t\tes: \"Esperando\",\r\n\t\t\t\tfr: \"Attendre\",\r\n\t\t\t},\r\n\t\t\t\"athlete-successfully-add\": {\r\n\t\t\t\ten: \"Athlete added successfully\",\r\n\t\t\t\tit: \"Atleta aggiunto correttamente\",\r\n\t\t\t\tes: \"Atleta agregado exitosamente\",\r\n\t\t\t\tfr: \"Athlète ajouté avec succès\",\r\n\t\t\t},\r\n\t\t\t\"athlete-successfully-moved\": {\r\n\t\t\t\ten: \"Athlete successfully moved\",\r\n\t\t\t\tit: \"Atleta spostato correttamente\",\r\n\t\t\t\tes: \"Atleta se movió con éxito\",\r\n\t\t\t\tfr: \"Athlète gâté correctementathlète\",\r\n\t\t\t},\r\n\t\t\t\"could-not-remove-participant-after-end-date\": {\r\n\t\t\t\ten: \"A participant cannot be removed after the end date\",\r\n\t\t\t\tit: \"Impossibile rimuovere il partecipante dopo la data di fine\",\r\n\t\t\t\tes: \"No se pudo eliminar al participante después de la fecha de finalización\",\r\n\t\t\t\tfr: \"Les participants ne peuvent pas être supprimés après la date de fin\",\r\n\t\t\t},\r\n\t\t\t\"could-not-remove-participants-after-end-date\": {\r\n\t\t\t\ten: \"Participants cannot be removed after the end date\",\r\n\t\t\t\tit: \"Impossibile rimuovere i partecipanti dopo la data di fine\",\r\n\t\t\t\tes: \"Los participantes no se pueden eliminar después de la fecha de finalización\",\r\n\t\t\t\tfr: \"Impossible de supprimer le participant après la date de fin\",\r\n\t\t\t},\r\n\t\t\t\"could-not-add-participant-after-end-date\": {\r\n\t\t\t\ten: \"A participant cannot be added after the end date\",\r\n\t\t\t\tit: \"Impossibile aggiungere il partecipante dopo la data di fine\",\r\n\t\t\t\tes: \"No se pudo agregar participante después de la fecha de finalización\",\r\n\t\t\t\tfr: \"Impossible d'ajouter le participant après la date de fin\",\r\n\t\t\t},\r\n\t\t\t\"the-time-for-unsubscribing-has-passed\": {\r\n\t\t\t\ten: \"The time for unsubscribing has passed\",\r\n\t\t\t\tit: \"Il tempo utile per la disiscrizione è passato\",\r\n\t\t\t\tes: \"El tiempo para darse de baja ha pasado.\",\r\n\t\t\t\tfr: \"L'heure de la désinscription est passée.\",\r\n\t\t\t},\r\n\t\t\t\"unable-to-add-participants-if-the-status-is-unpublished\": {\r\n\t\t\t\ten: \"Unable to add participants if the status is inactive\",\r\n\t\t\t\tit: \"Impossibile aggiungere partecipanti se lo stato è inattivo\",\r\n\t\t\t\tes: \"No se pueden agregar participantes si el estado es inactivo\",\r\n\t\t\t\tfr: \"Impossible d'ajouter des participants si le statut est inactif\",\r\n\t\t\t},\r\n\t\t\t\"already-participant\": {\r\n\t\t\t\ten: \"The athlete is already a participant\",\r\n\t\t\t\tit: \"L'atleta è già partecipante\",\r\n\t\t\t\tes: \"El atleta ya es participante\",\r\n\t\t\t\tfr: \"L'athlète est déjà un participant\",\r\n\t\t\t},\r\n\t\t\t\"no-registration-required\": {\r\n\t\t\t\ten: \"No registration is required\",\r\n\t\t\t\tit: \"Non è richiesta un'iscrizione\",\r\n\t\t\t\tes: \"No se requiere registro\",\r\n\t\t\t\tfr: \"Aucune inscription n'est requise\",\r\n\t\t\t},\r\n\t\t\t\"registrations-are-not-yet-open\": {\r\n\t\t\t\ten: \"Registrations are not yet open\",\r\n\t\t\t\tit: \"Le iscrizioni non sono ancora aperte\",\r\n\t\t\t\tes: \"Las inscripciones aún no están abiertas\",\r\n\t\t\t\tfr: \"Les inscriptions ne sont pas encore ouvertes\",\r\n\t\t\t},\r\n\t\t\t\"registration-is-closed\": {\r\n\t\t\t\ten: \"Registration is closed\",\r\n\t\t\t\tit: \"Le iscrizioni sono chiuse\",\r\n\t\t\t\tes: \"El registro está cerrado\",\r\n\t\t\t\tfr: \"L'inscription est fermée\",\r\n\t\t\t},\r\n\t\t\t\"event-already-started\": {\r\n\t\t\t\ten: \"The event has already started\",\r\n\t\t\t\tit: \"L'evento è già iniziato\",\r\n\t\t\t\tes: \"El evento ya ha comenzado\",\r\n\t\t\t\tfr: \"L'événement a déjà commencé\",\r\n\t\t\t},\r\n\t\t\t\"places-available-exceeded\": {\r\n\t\t\t\ten: \"The number of available places has been exceeded\",\r\n\t\t\t\tit: \"E' stato superato il numero di posti disponibili\",\r\n\t\t\t\tes: \"Se ha excedido el número de plazas disponibles\",\r\n\t\t\t\tfr: \"Le nombre de places disponibles a été dépassé\",\r\n\t\t\t},\r\n\t\t\t\"not-enought-credits\": {\r\n\t\t\t\ten: \"The athlete does not have enough credits to register\",\r\n\t\t\t\tit: \"L'atleta non ha abbastanza crediti per iscriversi\",\r\n\t\t\t\tes: \"El atleta no tiene suficientes créditos para registrarse\",\r\n\t\t\t\tfr: \"L'athlète n'a pas assez de crédits pour s'inscrire\",\r\n\t\t\t},\r\n\t\t\t\"club-limits-exceeded\": {\r\n\t\t\t\ten: \"The athlete has reached the booking limit\",\r\n\t\t\t\tit: \"L'atleta ha raggiunto il limite di prenotazione\",\r\n\t\t\t\tes: \"El atleta ha alcanzado el límite de reservas\",\r\n\t\t\t\tfr: \"L'athlète a atteint la limite de réservation\",\r\n\t\t\t},\r\n\t\t\t\"bookings-blocked-athlete\": {\r\n\t\t\t\ten: \"Bookings are blocked for this athlete\",\r\n\t\t\t\tit: \"Le prenotazioni sono bloccate per questo atleta\",\r\n\t\t\t\tes: \"Las reservas están bloqueadas para este atleta\",\r\n\t\t\t\tfr: \"Les réservations sont bloquées pour cet athlète\"\r\n\t\t\t},\r\n\t\t\t\"invalid-payment-option\": {\r\n\t\t\t\ten: \"The athlete does not have a subscription or enough credits to register\",\r\n\t\t\t\tit: \"L'atleta non ha un abbonamento o crediti validi per iscriversi\",\r\n\t\t\t\tes: \"El atleta no tiene suscripción ni créditos válidos para registrarse\",\r\n\t\t\t\tfr: \"L'athlète n'a pas d'abonnement ni de crédits valides pour s'inscrire\",\r\n\t\t\t},\r\n\t\t\t\"no-valid-subscriptions\": {\r\n\t\t\t\ten: \"The athlete does not have a subscription to register\",\r\n\t\t\t\tit: \"L'atleta non ha un abbonamento valido per iscriversi\",\r\n\t\t\t\tes: \"El atleta no tiene suscripción válidos para registrarse\",\r\n\t\t\t\tfr: \"L'athlète n'a pas d'abonnement valides pour s'inscrire\",\r\n\t\t\t},\r\n\t\t\t\"remove-athletes-confirm\": {\r\n\t\t\t\ten: \"Are you sure you want to remove?\",\r\n\t\t\t\tit: \"Sei sicuro di voler rimuovere?\",\r\n\t\t\t\tes: \"¿Estás seguro de que quieres eliminar?\",\r\n\t\t\t\tfr: \"Êtes-vous sûr de vouloir supprimer?\",\r\n\t\t\t},\r\n\t\t\t\"move-to-waiting-list\": {\r\n\t\t\t\ten: \"You are moving the athlete to the waiting list\",\r\n\t\t\t\tit: \"Stai spostando l'atleta in lista di attesa\",\r\n\t\t\t\tes: \"Estás moviendo al atleta en la lista de espera\",\r\n\t\t\t\tfr: \"Vous déplacez l'athlète sur la liste d'attente\",\r\n\t\t\t},\r\n\t\t\t\"move-to-participants-list\": {\r\n\t\t\t\ten: \"You are moving the athlete to the list of participants \",\r\n\t\t\t\tit: \"Stai spostando l'atleta nella lista dei partecipanti \",\r\n\t\t\t\tes: \"Está moviendo al atleta a la lista de participantes \",\r\n\t\t\t\tfr: \"Vous déplacez l'athlète vers la liste des participants \",\r\n\t\t\t},\r\n\t\t},\r\n\t\tMyActivitiesView: {\r\n\t\t\t\"activity-without-live\": {\r\n\t\t\t\ten: \"This activity does not involve the use of UptivoLIVE\",\r\n\t\t\t\tit: \"Questa attività non prevede l'utilizzo di UptivoLIVE\",\r\n\t\t\t\tes: \"Esta actividad no implica el uso de UptivoLIVE\",\r\n\t\t\t\tfr: \"Cette activité n'implique pas l'utilisation d'UptivoLIVE\",\r\n\t\t\t},\r\n\t\t\t\"my-next-activities\": {\r\n\t\t\t\ten: \"My Activities In The Next 24 Hours\",\r\n\t\t\t\tit: \"Le Mie Attività Nelle Prossime 24 Ore\",\r\n\t\t\t\tes: \"Mis Actividades En Las Próximas 24 Horas\",\r\n\t\t\t\tfr: \"Mes Planning Dans Les Prochaines 24 Heures\",\r\n\t\t\t},\r\n\t\t\tparticipant: {\r\n\t\t\t\ten: \"Participant\",\r\n\t\t\t\tit: \"Partecipante\",\r\n\t\t\t\tes: \"Partícipe\",\r\n\t\t\t\tfr: \"Participant\",\r\n\t\t\t},\r\n\t\t\tqueue: {\r\n\t\t\t\ten: \"Queue\",\r\n\t\t\t\tit: \"Coda\",\r\n\t\t\t\tes: \"Cola\",\r\n\t\t\t\tfr: \"Queue\",\r\n\t\t\t},\r\n\t\t\tparticipants: {\r\n\t\t\t\ten: \"Participants\",\r\n\t\t\t\tit: \"Partecipanti\",\r\n\t\t\t\tes: \"Participantes\",\r\n\t\t\t\tfr: \"Participants\",\r\n\t\t\t},\r\n\t\t},\r\n\t\tAthleteFilesView: {\r\n\t\t\t\"athlete-files\": {\r\n\t\t\t\ten: \"Athlete Files\",\r\n\t\t\t\tit: \"File Dell' Atleta\",\r\n\t\t\t\tes: \"Archivos Del Deportista\",\r\n\t\t\t\tfr: \"Fichiers De L'Athlète\",\r\n\t\t\t},\r\n\t\t\t\"upload-successful\": {\r\n\t\t\t\ten: \"Upload Successful\",\r\n\t\t\t\tit: \"Caricamento Riuscito\",\r\n\t\t\t\tes: \"Subida Exitosa\",\r\n\t\t\t\tfr: \"Téléversement Réussi\",\r\n\t\t\t},\r\n\t\t\t\"upload-failed\": {\r\n\t\t\t\ten: \"Some files may not have been uploaded\",\r\n\t\t\t\tit: \"Alcuni file potrebbero non essere stati caricati\",\r\n\t\t\t\tes: \"Es posible que algunos archivos no se hayan cargado\",\r\n\t\t\t\tfr: \"Certains fichiers n'ont peut-être pas été téléchargés\",\r\n\t\t\t},\r\n\t\t\t\"move-successful\": {\r\n\t\t\t\ten: \"File moved successfully\",\r\n\t\t\t\tit: \"File spostato correttamente\",\r\n\t\t\t\tes: \"Archivo movido exitosamente\",\r\n\t\t\t\tfr: \"Fichier déplacé avec succès\",\r\n\t\t\t},\r\n\t\t\t\"remove-file-sharing\": {\r\n\t\t\t\ten: \"This is a shared file. Are you sure you want to remove sharing with the user?\",\r\n\t\t\t\tit: \"Questo è un file condiviso. Sei sicuro di voler rimuovere la condivisione con l'utente?\",\r\n\t\t\t\tes: \"Este es un archivo compartido. ¿Está seguro de que desea eliminar el uso compartido con el usuario?\",\r\n\t\t\t\tfr: \"Ceci est un fichier partagé. Voulez-vous vraiment supprimer le partage avec l'utilisateur?\",\r\n\t\t\t},\r\n\t\t\t\"remove-file\": {\r\n\t\t\t\ten: \"The file will be deleted from the user's archive.\",\r\n\t\t\t\tit: \"Il file verrà cancellato dall'archivio dell'utente.\",\r\n\t\t\t\tes: \"El archivo se eliminará del archivo del usuario.\",\r\n\t\t\t\tfr: \"Le fichier sera supprimé de l'archive de l'utilisateur.\",\r\n\t\t\t},\r\n\t\t\t\"remove-folder\": {\r\n\t\t\t\ten: \"The folder will be deleted from the user's archive.\",\r\n\t\t\t\tit: \"La cartella verrà cancellata dall'archivio dell'utente.\",\r\n\t\t\t\tes: \"La carpeta se eliminará del archivo del usuario.\",\r\n\t\t\t\tfr: \"Le dossier sera supprimé de l'archive de l'utilisateur.\",\r\n\t\t\t},\r\n\t\t},\r\n\t\tMyFilesView: {\r\n\t\t\t\"remove-my-file\": {\r\n\t\t\t\ten: \"The file will be deleted from your archive.\",\r\n\t\t\t\tit: \"Il file verrà cancellato dal tuo archivio.\",\r\n\t\t\t\tes: \"El archivo se eliminará de su archivo.\",\r\n\t\t\t\tfr: \"Le fichier sera supprimé de votre archive.\",\r\n\t\t\t},\r\n\t\t\t\"remove-my-folder\": {\r\n\t\t\t\ten: \"The folder will be deleted from your archive.\",\r\n\t\t\t\tit: \"La cartella verrà cancellata dal tuo archivio.\",\r\n\t\t\t\tes: \"La carpeta se eliminará de su archivo.\",\r\n\t\t\t\tfr: \"Le dossier sera supprimé de votre archive.\",\r\n\t\t\t},\r\n\t\t},\r\n\t\tRefreshPaymentAccountView: {\r\n\t\t\t\"please-wait\": {\r\n\t\t\t\ten: \"Please wait…\",\r\n\t\t\t\tit: \"Attendere prego…\",\r\n\t\t\t\tes: \"Por favor espera…\",\r\n\t\t\t\tfr: \"S'il vous plaît, attendez…\",\r\n\t\t\t},\r\n\t\t\t\"redirect-to-payment-accont-site\": {\r\n\t\t\t\ten: \"We are redirecting you to the service web page\",\r\n\t\t\t\tit: \"Ti stiamo reindirizzando alla pagina web del servizio\",\r\n\t\t\t\tes: \"Estamos redirigiendo a la página web del servicio.\",\r\n\t\t\t\tfr: \"Nous vous redirigeons vers la page web du service\",\r\n\t\t\t},\r\n\t\t},\r\n\t\tClubChallengeRankingView: {\r\n\t\t\t\"in-progress\": {\r\n\t\t\t\ten: \"In progress\",\r\n\t\t\t\tit: \"In Corso\",\r\n\t\t\t\tes: \"En Progreso\",\r\n\t\t\t\tfr: \"En Cours\",\r\n\t\t\t},\r\n\t\t\t\"target-zone-prc\": {\r\n\t\t\t\ten: \"% Target Zone\",\r\n\t\t\t\tit: \"% Target Zone\",\r\n\t\t\t\tes: \"% Zona objetivo\",\r\n\t\t\t\tfr: \"% Zone cible\",\r\n\t\t\t},\r\n\t\t},\r\n\t\tClubChallengesView: {\r\n\t\t\t\"also-shows-finished-challenges\": {\r\n\t\t\t\ten: \"Also Shows Finished Challenges\",\r\n\t\t\t\tit: \"Mostra Anche Le Sfide Completate\",\r\n\t\t\t\tes: \"También Muestra Desafíos Completados\",\r\n\t\t\t\tfr: \"Affiche Également Les Défis Finés\",\r\n\t\t\t},\r\n\t\t\t\"add-challenge\": {\r\n\t\t\t\ten: \"Ranking\",\r\n\t\t\t\tit: \"Classifica\",\r\n\t\t\t\tes: \"Clasificación\",\r\n\t\t\t\tfr: \"Classement\",\r\n\t\t\t},\r\n\t\t\t\"add-goals\": {\r\n\t\t\t\ten: \"Goal\",\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\tgoal: {\r\n\t\t\t\ten: \"Goal\",\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\tgoals: {\r\n\t\t\t\ten: \"Goals\",\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\t\"monthly-challenges\": {\r\n\t\t\t\ten: \"Monthly Challenges\",\r\n\t\t\t\tit: \"Sfide Mensili\",\r\n\t\t\t\tes: \"Desafíos Mensuales\",\r\n\t\t\t\tfr: \"Défis Mensuels\",\r\n\t\t\t},\r\n\t\t\trunning: {\r\n\t\t\t\ten: \"Running\",\r\n\t\t\t\tit: \"In Corso\",\r\n\t\t\t\tes: \"En Curso\",\r\n\t\t\t\tfr: \"En Cours\",\r\n\t\t\t},\r\n\t\t\thistory: {\r\n\t\t\t\ten: \"History\",\r\n\t\t\t\tit: \"Storico\",\r\n\t\t\t\tes: \"Historia\",\r\n\t\t\t\tfr: \"Archiver\",\r\n\t\t\t},\r\n\t\t\t\"schedule-challenge\": {\r\n\t\t\t\ten: \"Ranking\",\r\n\t\t\t\tit: \"Classifica\",\r\n\t\t\t\tes: \"Clasificación\",\r\n\t\t\t\tfr: \"Classement\",\r\n\t\t\t},\r\n\t\t\t\"schedule-goals\": {\r\n\t\t\t\ten: \"Goal\",\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\t\"quick-schedule-challenge\": {\r\n\t\t\t\ten: \"Quick Schedule\",\r\n\t\t\t\tit: \"Programmazione Rapida\",\r\n\t\t\t\tes: \"Programacion Rapida\",\r\n\t\t\t\tfr: \"Programmation Rapide\",\r\n\t\t\t},\r\n\t\t\tscheduled: {\r\n\t\t\t\ten: \"Scheduled\",\r\n\t\t\t\tit: \"Programmate\",\r\n\t\t\t\tes: \"Plan\",\r\n\t\t\t\tfr: \"Plan\",\r\n\t\t\t},\r\n\t\t\t\"challenge-start\": {\r\n\t\t\t\ten: \"Challenge Start\",\r\n\t\t\t\tit: \"Inizio Sfida\",\r\n\t\t\t\tes: \"Inicio Del Desafío\",\r\n\t\t\t\tfr: \"Début Du Défi\",\r\n\t\t\t},\r\n\t\t\t\"zr-monthly-upps-goal-challenge\": {\r\n\t\t\t\ten: \"Zone Revolution monthly UPPs challenge\",\r\n\t\t\t\tit: \"Zone Revolution sfida mensile basata sugli UPPs\",\r\n\t\t\t\tes: \"Zone Revolution desafío mensual basado en UPP\",\r\n\t\t\t\tfr: \"Zone Revolution défi mensuel basé sur les UPP\",\r\n\t\t\t},\r\n\t\t\t\"zr-trainings-goal-challenge\": {\r\n\t\t\t\ten: \"Zone Revolution trainings challenge\",\r\n\t\t\t\tit: \"Zone Revolution sfida basata sul numero di allenamenti\",\r\n\t\t\t\tes: \"Zone Revolution desafío basado en la cantidad de entrenamientos\",\r\n\t\t\t\tfr: \"Zone Revolution défi basé sur le nombre d'entraînements\",\r\n\t\t\t},\r\n\t\t\t\"the-challenge-will-start-on-the-first-day-of-next-month\": {\r\n\t\t\t\ten: \"The challenge will start on the first day of next month.\",\r\n\t\t\t\tit: \"La sfida partirà il primo giorno del prossimo mese.\",\r\n\t\t\t\tes: \"El desafío comenzará el primer día del próximo mes.\",\r\n\t\t\t\tfr: \"Le défi commencera le premier jour du mois prochain.\",\r\n\t\t\t},\r\n\t\t\t\"challenge-type\": {\r\n\t\t\t\ten: \"Challenge Type\",\r\n\t\t\t\tit: \"Tipo Di Sfida\",\r\n\t\t\t\tes: \"Tipo De Desafío\",\r\n\t\t\t\tfr: \"Type De Défi\",\r\n\t\t\t},\r\n\t\t\t\"generate-default-ZR-Challenges\": {\r\n\t\t\t\ten: \"Generate default ZR Challenges\",\r\n\t\t\t\tit: \"Generate default ZR Challenges\",\r\n\t\t\t\tes: \"Generate default ZR Challenges\",\r\n\t\t\t\tfr: \"Generate default ZR Challenges\",\r\n\t\t\t},\r\n\t\t\t\"delete-running-challenge\": {\r\n\t\t\t\ten: \"The challenge is underway. You will not be able to recover this data!\",\r\n\t\t\t\tit: \"La sfida è in corso. Non sarà possibile recuperare questi dati!\",\r\n\t\t\t\tes: \"El desafío está en marcha. ¡No podrá recuperar este registro!\",\r\n\t\t\t\tfr: \"Le défi est lancé. Vous ne pourrez pas récupérer ces données!\",\r\n\t\t\t},\r\n\t\t},\r\n\t\tClubChallengeView: {\r\n\t\t\t\"scheduled-challenge\": {\r\n\t\t\t\ten: \"Scheduled Challenge\",\r\n\t\t\t\tit: \"Sfida Programmata\",\r\n\t\t\t\tes: \"Desafío Programado\",\r\n\t\t\t\tfr: \"Défi Programmé\",\r\n\t\t\t},\r\n\t\t\t\"top-tier\": {\r\n\t\t\t\ten: \"TOP TIER\",\r\n\t\t\t\tit: \"ALTO\",\r\n\t\t\t\tes: \"ALTO\",\r\n\t\t\t\tfr: \"HAUT\",\r\n\t\t\t},\r\n\t\t\t\"middle-tier\": {\r\n\t\t\t\ten: \"MIDDLE TIER\",\r\n\t\t\t\tit: \"MEDIO\",\r\n\t\t\t\tes: \"MEDIO\",\r\n\t\t\t\tfr: \"MOYEN\",\r\n\t\t\t},\r\n\t\t\t\"lower-tier\": {\r\n\t\t\t\ten: \"LOWER TIER\",\r\n\t\t\t\tit: \"BASSO\",\r\n\t\t\t\tes: \"BAJO\",\r\n\t\t\t\tfr: \"BAS\",\r\n\t\t\t},\r\n\t\t\t\"participant-tier\": {\r\n\t\t\t\ten: \"PARTICIPANT TIER\",\r\n\t\t\t\tit: \"PARTECIPAZIONE\",\r\n\t\t\t\tes: \"PARTICIPACIÓN\",\r\n\t\t\t\tfr: \"PARTICIPATION\",\r\n\t\t\t},\r\n\t\t\t\"enable-rank-trainings\": {\r\n\t\t\t\ten: \"Consider only the best workouts\",\r\n\t\t\t\tit: \"Considera solo i migliori allenamenti\",\r\n\t\t\t\tes: \"Considera solo los mejores entrenamientos\",\r\n\t\t\t\tfr: \"Ne considérez que les meilleurs entraînements\",\r\n\t\t\t},\r\n\t\t\t\"rank-trainings\": {\r\n\t\t\t\ten: \"Consider only the best:\",\r\n\t\t\t\tit: \"Considera solo i migliori:\",\r\n\t\t\t\tes: \"Considera solo lo mejor:\",\r\n\t\t\t\tfr: \"Ne considérer que le meilleur:\",\r\n\t\t\t},\r\n\t\t},\r\n\t\tClubObjectiveView: {\r\n\t\t\t\"select-badge\": {\r\n\t\t\t\ten: \"Select Badge\",\r\n\t\t\t\tit: \"Seleziona Badge\",\r\n\t\t\t\tes: \"Seleccionar Badge\",\r\n\t\t\t\tfr: \"Sélectionner des badges\",\r\n\t\t\t},\r\n\t\t\tthreshold: {\r\n\t\t\t\ten: \"Threshold\",\r\n\t\t\t\tit: \"Soglia\",\r\n\t\t\t\tes: \"Límite\",\r\n\t\t\t\tfr: \"Seuil\",\r\n\t\t\t},\r\n\t\t\treward: {\r\n\t\t\t\ten: \"Reward\",\r\n\t\t\t\tit: \"Premio\",\r\n\t\t\t\tes: \"Recompensa\",\r\n\t\t\t\tfr: \"Récompense\",\r\n\t\t\t},\r\n\t\t\t\"goal-challenge\": {\r\n\t\t\t\ten: \"Goal Challenge\",\r\n\t\t\t\tit: \"Sfida A Obiettivi\",\r\n\t\t\t\tes: \"Desafío De Objetivo\",\r\n\t\t\t\tfr: \"Défi D'Objectif\",\r\n\t\t\t},\r\n\t\t\t\"create-goal-challenge\": {\r\n\t\t\t\ten: \"Create Goal Challenge\",\r\n\t\t\t\tit: \"Crea Sfida A Obiettivi\",\r\n\t\t\t\tes: \"Crear Desafío De Objetivo\",\r\n\t\t\t\tfr: \"Créer Un Défi D'Objectif\",\r\n\t\t\t},\r\n\t\t\t\"goals-must-be-incremental\": {\r\n\t\t\t\ten: \"Goals must be incremental\",\r\n\t\t\t\tit: \"I goal devono essere incrementali\",\r\n\t\t\t\tes: \"Los objetivos deben ser incrementales\",\r\n\t\t\t\tfr: \"Les objectifs doivent être progressifs\",\r\n\t\t\t},\r\n\t\t\t\"all-goals-must-have-badge\": {\r\n\t\t\t\ten: \"All goals must have a reward\",\r\n\t\t\t\tit: \"Tutti i goal devono avere un premio\",\r\n\t\t\t\tes: \"Todos los objetivos deben tener una recompensa\",\r\n\t\t\t\tfr: \"Tous les objectifs doivent avoir une récompense\",\r\n\t\t\t},\r\n\t\t\t\"scheduled-goal-challenge\": {\r\n\t\t\t\ten: \"Scheduled Goal Challenge\",\r\n\t\t\t\tit: \"Sfida A Obiettivi Programmata\",\r\n\t\t\t\tes: \"Desafío De Objetivo Planificado\",\r\n\t\t\t\tfr: \"Défi Objectif Planifié\",\r\n\t\t\t},\r\n\t\t},\r\n\t\tCreditsAndSubscriptionsView: {\r\n\t\t\tAutoAssign: {\r\n\t\t\t\ten: \"Auto Assigned\",\r\n\t\t\t\tit: \"Assegnato Automaticamente\",\r\n\t\t\t\tes: \"Asignación Automática\",\r\n\t\t\t\tfr: \"Assignation Automatique\",\r\n\t\t\t},\r\n\t\t\t\"AutoAssign-text\": {\r\n\t\t\t\ten: \"This trial subscription will be automatically assigned to each new member\",\r\n\t\t\t\tit: \"Questo abbonamento di prova sarà automaticamente assegnato ad ogni nuovo iscritto\",\r\n\t\t\t\tes: \"Esta suscripción de prueba se asignará automáticamente a cada nuevo miembro\",\r\n\t\t\t\tfr: \"Cet abonnement d'essai sera automatiquement attribué à chaque nouveau membre\",\r\n\t\t\t},\r\n\t\t\t\"remember-complete-payment-account-setup\": {\r\n\t\t\t\ten: \"To enable online payments, remember to complete the setup of at least one payment method.\",\r\n\t\t\t\tit: \"Per abilitare i pagamenti online, ricordati di completare la configurazione di almeno un metodo di pagamento.\",\r\n\t\t\t\tes: \"Para habilitar los pagos en línea, recuerde completar la configuración de al menos un método de pago.\",\r\n\t\t\t\tfr: \"Pour activer les paiements en ligne, n'oubliez pas de terminer la configuration d'au moins un mode de paiement.\",\r\n\t\t\t},\r\n\t\t\t\"credits-description\": {\r\n\t\t\t\ten: \"You can assign credits and subscriptions to your customers in the Manage Users section. If you enable payments, your customers will also be able to purchase credits and subscriptions from their Uptivo app.\",\r\n\t\t\t\tit: \"Puoi assegnare crediti e abbonamenti ai tuoi clienti nella sezione Gestione Utenti. Se abiliti i pagamenti, i tuoi clienti potranno inoltre acquistare crediti e abbonamenti dall’app Uptivo.\",\r\n\t\t\t\tes: \"Puede asignar créditos y suscripciones a sus clientes en la sección Administrar Usuarios. Si habilita los pagos, sus clientes también podrán comprar créditos y suscripciones desde la aplicación Uptivo.\",\r\n\t\t\t\tfr: \"Vous pouvez attribuer des crédits et des abonnements à vos clients dans la section Gérer les Utilisateurs. Si vous activez les paiements, vos clients pourront également acheter des crédits et des abonnements à partir de l'application Uptivo.\",\r\n\t\t\t},\r\n\t\t\t\"enable-club-packages-warning\": {\r\n\t\t\t\ten: \"Enable online payments in your club settings to be able to add credit packages.\",\r\n\t\t\t\tit: \"Abilita i pagamenti online nelle impostazioni del club per poter aggiungere i pacchetti di crediti.\",\r\n\t\t\t\tes: \"Habilite los pagos en línea en la configuración de su club para poder agregar paquetes de crédito.\",\r\n\t\t\t\tfr: \"Veuillez activer les paiements en ligne dans les paramètres de votre club pour pouvoir ajouter des packs de crédits.\",\r\n\t\t\t},\r\n\t\t\t\"max-weekly-bookings\": {\r\n\t\t\t\ten: \"Weekly Bookings\",\r\n\t\t\t\tit: \"Prenotazioni Settimanali\",\r\n\t\t\t\tes: \"Reservas Semanales\",\r\n\t\t\t\tfr: \"Réservations Hebdomadaires\",\r\n\t\t\t},\r\n\t\t\t\"max-monthly-bookings\": {\r\n\t\t\t\ten: \"Monthly Bookings\",\r\n\t\t\t\tit: \"Prenotazioni Mensili\",\r\n\t\t\t\tes: \"Reservas Mensuales\",\r\n\t\t\t\tfr: \"Réservations Mensuelles\",\r\n\t\t\t},\r\n\t\t\t\"subscription-succesfully-removed\": {\r\n\t\t\t\ten: \"Subscription successfully removed\",\r\n\t\t\t\tit: \"Abbonamento rimosso con successo\",\r\n\t\t\t\tes: \"Suscripción eliminada correctamente\",\r\n\t\t\t\tfr: \"Abonnement supprimé avec succès\",\r\n\t\t\t},\r\n\t\t\t\"subscription-succesfully-suspended\": {\r\n\t\t\t\ten: \"Subscription successfully suspended\",\r\n\t\t\t\tit: \"Abbonamento sospeso con successo\",\r\n\t\t\t\tes: \"Suscripción suspendida con éxito\",\r\n\t\t\t\tfr: \"Abonnement suspendu avec succès\",\r\n\t\t\t},\r\n\t\t\t\"subscription-succesfully-reactivate\": {\r\n\t\t\t\ten: \"Subscription successfully reactivated\",\r\n\t\t\t\tit: \"Abbonamento riattivato con successo\",\r\n\t\t\t\tes: \"Suscripción reactivada con éxito\",\r\n\t\t\t\tfr: \"Abonnement réactivé avec succès\",\r\n\t\t\t},\r\n\t\t\t\"subscription-succesfully-add\": {\r\n\t\t\t\ten: \"Subscription assigned correctly\",\r\n\t\t\t\tit: \"Abbonamento assegnato correttamente\",\r\n\t\t\t\tes: \"Suscripción asignada correctamente\",\r\n\t\t\t\tfr: \"Abonnement attribué correctement\",\r\n\t\t\t},\r\n\t\t\t\"confirm-hide-subscription\": {\r\n\t\t\t\ten: \"You are about to hide this subscription. It will no longer appear among the purchasable ones.\",\r\n\t\t\t\tit: \"Stai per nascondere questo abbonamento. Non comparirà più tra quelli acquistabili.\",\r\n\t\t\t\tes: \"Estás a punto de ocultar esta suscripción. Ya no aparecerá entre los que se pueden comprar.\",\r\n\t\t\t\tfr: \"Vous êtes sur le point de masquer cet abonnement. Il n'apparaîtra plus parmi les achetables.\",\r\n\t\t\t},\r\n\t\t\t\"confirm-show-subscription\": {\r\n\t\t\t\ten: \"You are about to make this subscription visible. It will then be available for purchase.\",\r\n\t\t\t\tit: \"Stai per rendere visibile questo abbonamento. Sarà quindi disponibile all'acquisto.\",\r\n\t\t\t\tes: \"Está a punto de hacer visible esta suscripción. Entonces estará disponible para su compra.\",\r\n\t\t\t\tfr: \"Vous êtes sur le point de rendre cet abonnement visible. Il sera alors disponible à l'achat.\",\r\n\t\t\t},\r\n\t\t\t\"confirm-enable-auto-assign\": {\r\n\t\t\t\ten: \"You are about to enable this subscription. It will be assigned to all new members.\",\r\n\t\t\t\tit: \"Stai per abilitare questo abbonamento. Sarà assegnato automaticamente ai nuovi membri.\",\r\n\t\t\t\tes: \" Estás a punto de habilitar esta suscripción. Será asignada a todos los nuevos miembros.\",\r\n\t\t\t\tfr: \" Vous êtes sur le point d'activer cet abonnement. Il sera attribué à tous les nouveaux membres.\",\r\n\t\t\t},\r\n\t\t\t\"confirm-disable-auto-assign\": {\r\n\t\t\t\ten: \"You are about to disable this subscription.\",\r\n\t\t\t\tit: \"Stai per disabilitare questo abbonamento.\",\r\n\t\t\t\tes: \"Estás a punto de desactivar esta suscripción.\",\r\n\t\t\t\tfr: \"Vous êtes sur le point de désactiver cet abonnement.\",\r\n\t\t\t},\r\n\t\t\t\"credits-packages\": {\r\n\t\t\t\ten: \"Credits Packages\",\r\n\t\t\t\tit: \"Pacchetti Di Crediti\",\r\n\t\t\t\tes: \"Paquetes De Créditos\",\r\n\t\t\t\tfr: \"Forfaits De Crédits\",\r\n\t\t\t},\r\n\t\t\t\"add-credit-package\": {\r\n\t\t\t\ten: \"Add Credit Package\",\r\n\t\t\t\tit: \"Aggiungi Pacchetto Crediti\",\r\n\t\t\t\tes: \"Agregar Paquete De Crédito\",\r\n\t\t\t\tfr: \"Ajouter Un Forfait De Crédit\",\r\n\t\t\t},\r\n\t\t\t\"add-credits-packages\": {\r\n\t\t\t\ten: \"Add Credits Packages\",\r\n\t\t\t\tit: \"Aggiungi Pacchetti Di Crediti\",\r\n\t\t\t\tes: \"Agregar paquetes de créditos\",\r\n\t\t\t\tfr: \"Ajouter Des Forfaits De Crédits\",\r\n\t\t\t},\r\n\t\t\t\"cancellation-requested\": {\r\n\t\t\t\ten: \"Cancellation requested\",\r\n\t\t\t\tit: \"Cancellazione richiesta\",\r\n\t\t\t\tes: \"Cancelación solicitada\",\r\n\t\t\t\tfr: \"Annulation demandée\",\r\n\t\t\t},\r\n\t\t\tcustomer: {\r\n\t\t\t\ten: \"Customer\",\r\n\t\t\t\tit: \"Cliente\",\r\n\t\t\t\tes: \"Cliente\",\r\n\t\t\t\tfr: \"Client\",\r\n\t\t\t},\r\n\t\t\tWaitingInitialPayment: {\r\n\t\t\t\ten: \"Waiting for first payment\",\r\n\t\t\t\tit: \"In attesa del primo pagamento\",\r\n\t\t\t\tes: \"Esperando el primer pago\",\r\n\t\t\t\tfr: \"En attente du premier paiement\",\r\n\t\t\t},\r\n\t\t\tInitialPaymentFailed: {\r\n\t\t\t\ten: \"First payment failed\",\r\n\t\t\t\tit: \"Primo pagamento fallito\",\r\n\t\t\t\tes: \"Primer pago fallido\",\r\n\t\t\t\tfr: \"Échec du premier paiement\",\r\n\t\t\t},\r\n\t\t\tRetryingPayment: {\r\n\t\t\t\ten: \"New payment attempt\",\r\n\t\t\t\tit: \"Nuovo tentativo di pagamento\",\r\n\t\t\t\tes: \"Nuevo intento de pago\",\r\n\t\t\t\tfr: \"Nouvelle tentative de paiement\",\r\n\t\t\t},\r\n\t\t\tPaymentFailed: {\r\n\t\t\t\ten: \"Payment failed\",\r\n\t\t\t\tit: \"Pagamento fallito\",\r\n\t\t\t\tes: \"Pago fallido\",\r\n\t\t\t\tfr: \"Paiement échoué\",\r\n\t\t\t},\r\n\t\t\tCanceledImmediately: {\r\n\t\t\t\ten: \"Instant cancellation\",\r\n\t\t\t\tit: \"Cancellazione istantanea\",\r\n\t\t\t\tes: \"Cancelación instantánea\",\r\n\t\t\t\tfr: \"Annulation instantanée\",\r\n\t\t\t},\r\n\t\t\tCanceledAtPeriodEnd: {\r\n\t\t\t\ten: \"Cancellation at end of installment\",\r\n\t\t\t\tit: \"Cancellazione a fine rata\",\r\n\t\t\t\tes: \"Cancelación al final de la cuota\",\r\n\t\t\t\tfr: \"Annulation à la fin du versement\",\r\n\t\t\t},\r\n\t\t\tPaymentPeriodTerminated: {\r\n\t\t\t\ten: \"Payment period ended\",\r\n\t\t\t\tit: \"Periodo di pagamento terminato\",\r\n\t\t\t\tes: \"Período de pago terminado\",\r\n\t\t\t\tfr: \"Période de paiement terminée\",\r\n\t\t\t},\r\n\t\t\tdraft: {\r\n\t\t\t\ten: \"Draft\",\r\n\t\t\t\tit: \"Bozza\",\r\n\t\t\t\tes: \"Borrador\",\r\n\t\t\t\tfr: \"Brouillon\",\r\n\t\t\t},\r\n\t\t\topen: {\r\n\t\t\t\ten: \"Open\",\r\n\t\t\t\tit: \"Aperta\",\r\n\t\t\t\tes: \"Abierta\",\r\n\t\t\t\tfr: \"Ouvertes\",\r\n\t\t\t},\r\n\t\t\tvoid: {\r\n\t\t\t\ten: \"Void\",\r\n\t\t\t\tit: \"Non valida\",\r\n\t\t\t\tes: \"Nula\",\r\n\t\t\t\tfr: \"Nulle\",\r\n\t\t\t},\r\n\t\t\tpaid: {\r\n\t\t\t\ten: \"Paid\",\r\n\t\t\t\tit: \"Pagato\",\r\n\t\t\t\tes: \"Pagada\",\r\n\t\t\t\tfr: \"Payée\",\r\n\t\t\t},\r\n\t\t\tuncollectible: {\r\n\t\t\t\ten: \"Uncollectible\",\r\n\t\t\t\tit: \"Inesigibile\",\r\n\t\t\t\tes: \"Incobrable\",\r\n\t\t\t\tfr: \"Non recouvrable\",\r\n\t\t\t},\r\n\t\t\tunpaid: {\r\n\t\t\t\ten: \"Unpaid\",\r\n\t\t\t\tit: \"Non Pagato\",\r\n\t\t\t\tes: \"No Pagado\",\r\n\t\t\t\tfr: \"Non payé\",\r\n\t\t\t},\r\n\t\t\tprice: {\r\n\t\t\t\ten: \"Price\",\r\n\t\t\t\tit: \"Prezzo\",\r\n\t\t\t\tes: \"Precio\",\r\n\t\t\t\tfr: \"Prix\",\r\n\t\t\t},\r\n\t\t\tcurrency: {\r\n\t\t\t\ten: \"Currency\",\r\n\t\t\t\tit: \"Valuta\",\r\n\t\t\t\tes: \"Moneda\",\r\n\t\t\t\tfr: \"Devise\",\r\n\t\t\t},\r\n\t\t\tplans: {\r\n\t\t\t\ten: \"Plans\",\r\n\t\t\t\tit: \"Piani\",\r\n\t\t\t\tes: \"Planes\",\r\n\t\t\t\tfr: \"Plans\",\r\n\t\t\t},\r\n\t\t\t\"confirm-delete-credits-package\": {\r\n\t\t\t\ten: \"Are you sure you want to delete this credits package?\",\r\n\t\t\t\tit: \"Sei sicuro di voler eliminare questo pacchetto di crediti?\",\r\n\t\t\t\tes: \"¿Está seguro de que desea eliminar el paquete de créditos?\",\r\n\t\t\t\tfr: \"Êtes-vous sûr de vouloir supprimer le package de crédits?\",\r\n\t\t\t},\r\n\t\t\t\"confirm-remove-payment-account\": {\r\n\t\t\t\ten: \"Are you sure you want to remove this payment account?\",\r\n\t\t\t\tit: \"Sei sicuro di voler rimuovere questo account di pagamento?\",\r\n\t\t\t\tes: \"¿Está seguro de que desea eliminar esta cuenta de pago?\",\r\n\t\t\t\tfr: \"Voulez-vous vraiment supprimer ce compte de paiement?\",\r\n\t\t\t},\r\n\t\t\t\"confirm-remove-paypal\": {\r\n\t\t\t\ten: \"Disconnecting your PayPal account will prevent you from offering PayPal services and products on your website. Do you wish to continue?\",\r\n\t\t\t\tit: \"La disconnessione del tuo conto PayPal ti impedirà di offrire servizi e prodotti PayPal sul tuo sito web. Vuoi continuare?\",\r\n\t\t\t\tes: \"Desconectar su cuenta de PayPal le impedirá ofrecer servicios y productos de PayPal en su sitio web. ¿Desea continuar?\",\r\n\t\t\t\tfr: \"La déconnexion de votre compte PayPal vous empêchera de proposer des services et des produits PayPal sur votre site Web. Souhaitez-vous continuer?\",\r\n\t\t\t},\r\n\t\t\t\"credits-required\": {\r\n\t\t\t\ten: \"Credits required\",\r\n\t\t\t\tit: \"Crediti obbligatori\",\r\n\t\t\t\tes: \"Créditos requeridos\",\r\n\t\t\t\tfr: \"Crédits requis\",\r\n\t\t\t},\r\n\t\t\t\"price-required\": {\r\n\t\t\t\ten: \"Price is required\",\r\n\t\t\t\tit: \"Il prezzo è obbligatorio\",\r\n\t\t\t\tes: \"El precio es requerido\",\r\n\t\t\t\tfr: \"Le prix est obligatoire\",\r\n\t\t\t},\r\n\t\t\t\"add-new-subscription\": {\r\n\t\t\t\ten: \"Add New Subscription\",\r\n\t\t\t\tit: \"Aggiungi Nuovo Abbonamento\",\r\n\t\t\t\tes: \"Agregar Nueva Suscripción\",\r\n\t\t\t\tfr: \"Ajouter Un Nouvel Abonnement\",\r\n\t\t\t},\r\n\t\t\t\"unable-delete-subscription-because-assigned\": {\r\n\t\t\t\ten: \"Unable to delete subscription because assigned. {0} Suspended, {1} Assigned\",\r\n\t\t\t\tit: \"Impossibile eliminare l'abbonamento perché assegnato. {0} Sospesi, {1} Assegnati\",\r\n\t\t\t\tes: \"No se puede eliminar la suscripción porque está asignada. {0} Suspendido, {1} Asignado\",\r\n\t\t\t\tfr: \"Impossible de supprimer l'abonnement car attribué. {0} Suspendu, {1} Attribué\",\r\n\t\t\t},\r\n\t\t\t\"confirm-delete-club-subscription\": {\r\n\t\t\t\ten: \"This subscription is not assigned to any user. Do you confirm that you want to delete it?\",\r\n\t\t\t\tit: \"Questo abbonamento non è assegnato a nessun utente. Confermi di volerlo cancellare?\",\r\n\t\t\t\tes: \"Esta suscripción no está asignada a ningún usuario. ¿Confirmas que quieres eliminarlo?\",\r\n\t\t\t\tfr: \"Cet abonnement n'est attribué à aucun utilisateur. Confirmez-vous que vous souhaitez le supprimer?\",\r\n\t\t\t},\r\n\t\t\t\"define-subscription-plans\": {\r\n\t\t\t\ten: \"Define subscription plans\",\r\n\t\t\t\tit: \"Definisci piani abbonamento\",\r\n\t\t\t\tes: \"Definir planes de suscripción\",\r\n\t\t\t\tfr: \"Définir des plans d'abonnement\",\r\n\t\t\t},\r\n\t\t\t\"duration-days\": {\r\n\t\t\t\ten: \"Duration (days)\",\r\n\t\t\t\tit: \"Durata (giorni)\",\r\n\t\t\t\tes: \"Duración (días)\",\r\n\t\t\t\tfr: \"Durée (jours)\",\r\n\t\t\t},\r\n\t\t\t\"max-activities\": {\r\n\t\t\t\ten: \"Max Activities\",\r\n\t\t\t\tit: \"Max Attività\",\r\n\t\t\t\tes: \"Máx Actividades\",\r\n\t\t\t\tfr: \"Max Activités\",\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: \"Remarques\",\r\n\t\t\t},\r\n\t\t\t\"subscription-management\": {\r\n\t\t\t\ten: \"Subscription Management\",\r\n\t\t\t\tit: \"Gestione Abbonamenti\",\r\n\t\t\t\tes: \"Gestión De Suscripciones\",\r\n\t\t\t\tfr: \"Gestion Des Abonnements\",\r\n\t\t\t},\r\n\t\t\t\"credits-management\": {\r\n\t\t\t\ten: \"Credits Management\",\r\n\t\t\t\tit: \"Gestione Crediti\",\r\n\t\t\t\tes: \"Gestión De Créditos\",\r\n\t\t\t\tfr: \"Gestion Des Crédits\",\r\n\t\t\t},\r\n\t\t\tsubscription: {\r\n\t\t\t\ten: \"Subscription\",\r\n\t\t\t\tit: \"Abbonamento\",\r\n\t\t\t\tes: \"Suscripción\",\r\n\t\t\t\tfr: \"Abonnement\",\r\n\t\t\t},\r\n\t\t\t\"subscription-name\": {\r\n\t\t\t\ten: \"Subscription Name\",\r\n\t\t\t\tit: \"Nome Abbonamento\",\r\n\t\t\t\tes: \"Nombre De Suscripción\",\r\n\t\t\t\tfr: \"Nom De L'Abonnement\",\r\n\t\t\t},\r\n\t\t\tlimits: {\r\n\t\t\t\ten: \"Limits\",\r\n\t\t\t\tit: \"Limitazioni\",\r\n\t\t\t\tes: \"Limitaciones\",\r\n\t\t\t\tfr: \"Limites\",\r\n\t\t\t},\r\n\t\t\t\"past-operations\": {\r\n\t\t\t\ten: \"Past Operations\",\r\n\t\t\t\tit: \"Storico Operazioni\",\r\n\t\t\t\tes: \"Operaciones Pasadas\",\r\n\t\t\t\tfr: \"Opérations Passées\",\r\n\t\t\t},\r\n\t\t\t\"remove-athlete-subscription\": {\r\n\t\t\t\ten: \"You are about to remove the subscription\",\r\n\t\t\t\tit: \"Stai per rimuovere l'abbonamento\",\r\n\t\t\t\tes: \"Estás a punto de darte de baja\",\r\n\t\t\t\tfr: \"Vous êtes sur le point de vous désinscrire\",\r\n\t\t\t},\r\n\t\t\t\"subscription-update\": {\r\n\t\t\t\ten: \"Subscription Update\",\r\n\t\t\t\tit: \"Abbonamento aggiornato\",\r\n\t\t\t\tes: \"Suscripción actualizada\",\r\n\t\t\t\tfr: \"Abonnement mis à jour\",\r\n\t\t\t},\r\n\t\t\t\"set-reactivation-date\": {\r\n\t\t\t\ten: \"Set Reactivation Date\",\r\n\t\t\t\tit: \"Imposta la data di riattivazione\",\r\n\t\t\t\tes: \"Establecer fecha de reactivación\",\r\n\t\t\t\tfr: \"Définir la date de réactivation\",\r\n\t\t\t},\r\n\t\t\t\"reactivation-date\": {\r\n\t\t\t\ten: \"Reactivation Date\",\r\n\t\t\t\tit: \"Data Di Riattivazione\",\r\n\t\t\t\tes: \"Fecha De Reactivación\",\r\n\t\t\t\tfr: \"Date De Réactivation\",\r\n\t\t\t},\r\n\t\t\t\"suspended-date\": {\r\n\t\t\t\ten: \"Suspended Date\",\r\n\t\t\t\tit: \"Data Sospensione\",\r\n\t\t\t\tes: \"Fecha De Suspensión\",\r\n\t\t\t\tfr: \"Date De Suspension\",\r\n\t\t\t},\r\n\t\t\t\"suspend-subscription-confirm\": {\r\n\t\t\t\ten: \"Are you sure you want to suspend this subscription?\",\r\n\t\t\t\tit: \"Sei sicuro di voler sospendere questo abbonamento?\",\r\n\t\t\t\tes: \"¿Está seguro de que desea suspender esta suscripción?\",\r\n\t\t\t\tfr: \"Voulez-vous vraiment suspendre cet abonnement?\",\r\n\t\t\t},\r\n\t\t\t\"reactivate-subscription-confirm\": {\r\n\t\t\t\ten: \"Are you sure you want to reactivate this subscription?\",\r\n\t\t\t\tit: \"Sei sicuro di voler riattivare questo abbonamento?\",\r\n\t\t\t\tes: \"¿Está seguro de que desea reactivar esta suscripción?\",\r\n\t\t\t\tfr: \"Voulez-vous vraiment réactiver cet abonnement?\",\r\n\t\t\t},\r\n\t\t\tdays: {\r\n\t\t\t\ten: \"Days\",\r\n\t\t\t\tit: \"Giorni\",\r\n\t\t\t\tes: \"Días\",\r\n\t\t\t\tfr: \"Jours\",\r\n\t\t\t},\r\n\t\t\tactive: {\r\n\t\t\t\ten: \"Active\",\r\n\t\t\t\tit: \"Attivo\",\r\n\t\t\t\tes: \"Activo\",\r\n\t\t\t\tfr: \"Actif\",\r\n\t\t\t},\r\n\t\t\t\"non-renewed\": {\r\n\t\t\t\ten: \"Non-renewed\",\r\n\t\t\t\tit: \"Non rinnovato\",\r\n\t\t\t\tes: \"No renovado\",\r\n\t\t\t\tfr: \"Non renouvelé\",\r\n\t\t\t},\r\n\t\t\t\"expired-date\": {\r\n\t\t\t\ten: \"Expired Date\",\r\n\t\t\t\tit: \"Scaduto Il\",\r\n\t\t\t\tes: \"Fecha De Vencimiento\",\r\n\t\t\t\tfr: \"Date d'Expiration\",\r\n\t\t\t},\r\n\t\t\t\"select-plan\": {\r\n\t\t\t\ten: \"Select Plan\",\r\n\t\t\t\tit: \"Seleziona Piano\",\r\n\t\t\t\tes: \"Seleccionar plan\",\r\n\t\t\t\tfr: \"Sélectionnez Plan\",\r\n\t\t\t},\r\n\t\t\tpurchasable: {\r\n\t\t\t\ten: \"Purchasable\",\r\n\t\t\t\tit: \"Acquistabile\",\r\n\t\t\t\tes: \"Adquirir\",\r\n\t\t\t\tfr: \"Achetable\",\r\n\t\t\t},\r\n\t\t\t\"not-purchasable\": {\r\n\t\t\t\ten: \"Not Purchasable\",\r\n\t\t\t\tit: \"Non Acquistabile\",\r\n\t\t\t\tes: \"No Adquirir\",\r\n\t\t\t\tfr: \"Non Achetable\",\r\n\t\t\t},\r\n\t\t\t\"cannot-suspend-expired-subscription\": {\r\n\t\t\t\ten: \"Cannot suspend expired subscription\",\r\n\t\t\t\tit: \"Impossibile sospendere, abbonamento scaduto\",\r\n\t\t\t\tes: \"No se puede suspender la suscripción caducada\",\r\n\t\t\t\tfr: \"Impossible de suspendre l'abonnement expiré\",\r\n\t\t\t},\r\n\t\t\t\"cannot-suspend-subscription-for-less-7-days\": {\r\n\t\t\t\ten: \"Subscriptions can't be suspended for less than 7 days\",\r\n\t\t\t\tit: \"Gli abbonamenti non possono essere sospesi per meno di 7 giorni\",\r\n\t\t\t\tes: \"Las suscripciones no se pueden suspender por menos de 7 días\",\r\n\t\t\t\tfr: \"Les abonnements ne peuvent pas être suspendus pendant moins de 7 jours\",\r\n\t\t\t},\r\n\t\t\t\"cannot-suspend-subscription-has-bookings\": {\r\n\t\t\t\ten: \"Unable to suspend this subscription because there are associated bookings\",\r\n\t\t\t\tit: \"Impossibile sospendere l'abbonamento perché sono presenti prenotazioni associate\",\r\n\t\t\t\tes: \"No se puede suspender esta suscripción porque hay reservas asociadas\",\r\n\t\t\t\tfr: \"Impossible de suspendre cet abonnement car des réservations sont associées\",\r\n\t\t\t},\r\n\t\t\t\"cannot-remove-subscription-has-bookings\": {\r\n\t\t\t\ten: \"Unable to remove this subscription because there are associated bookings\",\r\n\t\t\t\tit: \"Impossibile rimuovere l'abbonamento perché sono presenti prenotazioni associate\",\r\n\t\t\t\tes: \"La suscripción no se puede eliminar porque hay reservas asociadas\",\r\n\t\t\t\tfr: \"L'abonnement ne peut pas être supprimé car il y a des réservations associées\",\r\n\t\t\t},\r\n\t\t\t\"subscription-end-must-be-greater-start\": {\r\n\t\t\t\ten: \"The subscription end date must be greater than the start date.\",\r\n\t\t\t\tit: \"La data di fine dell'abbonamento deve essere superiore alla data di inizio.\",\r\n\t\t\t\tes: \"La fecha de finalización de la suscripción debe ser mayor que la fecha de inicio.\",\r\n\t\t\t\tfr: \"La date de fin de l'abonnement doit être postérieure à la date de début.\",\r\n\t\t\t},\r\n\t\t\t\"reactivation-date-must-be-in-future\": {\r\n\t\t\t\ten: \"Reactivation date must be in the future\",\r\n\t\t\t\tit: \"La data di riattivazione deve essere una data futura\",\r\n\t\t\t\tes: \"La fecha de reactivación debe ser futura\",\r\n\t\t\t\tfr: \"La date de réactivation doit être dans le futur\",\r\n\t\t\t},\r\n\t\t\t\"not-purchasable\": {\r\n\t\t\t\ten: \"Not purchasable\",\r\n\t\t\t\tit: \"Non acquistabile\",\r\n\t\t\t\tes: \"No adquirible\",\r\n\t\t\t\tfr: \"Non achetable\",\r\n\t\t\t},\r\n\t\t\t\"without-subscriptions\": {\r\n\t\t\t\ten: \"Without Subscriptions\",\r\n\t\t\t\tit: \"Senza Abbonamenti\",\r\n\t\t\t\tes: \"Sin Suscripciones\",\r\n\t\t\t\tfr: \"Sans Abonnement\",\r\n\t\t\t},\r\n\t\t\ttrial: {\r\n\t\t\t\ten: \"Trial Sessions\",\r\n\t\t\t\tit: \"Sessioni Di Prova\",\r\n\t\t\t\tes: \"Sesiones De Prueba\",\r\n\t\t\t\tfr: \"Séances D'Essai\",\r\n\t\t\t},\r\n\t\t\t\"subscription-type\": {\r\n\t\t\t\ten: \"Subscription Type\",\r\n\t\t\t\tit: \"Tipo Abbonamento\",\r\n\t\t\t\tes: \"Tipo De Suscripción\",\r\n\t\t\t\tfr: \"Type D'Abonnement\",\r\n\t\t\t},\r\n\t\t\tmodel: {\r\n\t\t\t\ten: \"Model\",\r\n\t\t\t\tit: \"Modello\",\r\n\t\t\t\tes: \"Modelo\",\r\n\t\t\t\tfr: \"Maquette\",\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\"from-table\": {\r\n\t\t\t\ten: \"From\",\r\n\t\t\t\tit: \"Da\",\r\n\t\t\t\tes: \"Desde\",\r\n\t\t\t\tfr: \"De\",\r\n\t\t\t},\r\n\t\t\t\"to-table\": {\r\n\t\t\t\ten: \"To\",\r\n\t\t\t\tit: \"A\",\r\n\t\t\t\tes: \"A\",\r\n\t\t\t\tfr: \"À\",\r\n\t\t\t},\r\n\t\t\tunsubscribe: {\r\n\t\t\t\ten: \"Unsubscribe\",\r\n\t\t\t\tit: \"Disiscriviti\",\r\n\t\t\t\tes: \"Cancelar suscripción\",\r\n\t\t\t\tfr: \"Se désabonner\",\r\n\t\t\t},\r\n\t\t\t\"cancel-unsubscribe\": {\r\n\t\t\t\ten: \"Cancel unsubscribe\",\r\n\t\t\t\tit: \"Annulla disiscrizione\",\r\n\t\t\t\tes: \"Cancelar cancelar suscripción\",\r\n\t\t\t\tfr: \"Annuler se désabonner\",\r\n\t\t\t},\r\n\t\t\t\"unsubscribe-immediately\": {\r\n\t\t\t\ten: \"Unsubscribe immediately\",\r\n\t\t\t\tit: \"Disiscriversi immediatamente\",\r\n\t\t\t\tes: \"Cancelar suscripción inmediatamente\",\r\n\t\t\t\tfr: \"Se désabonner immédiatement\",\r\n\t\t\t},\r\n\t\t\t\"unsubscribe-at-end\": {\r\n\t\t\t\ten: \"Unsubscribe at end\",\r\n\t\t\t\tit: \"Disiscriversi alla fine\",\r\n\t\t\t\tes: \"Cancelar suscripción al final\",\r\n\t\t\t\tfr: \"Se désabonner à la fin\",\r\n\t\t\t},\r\n\t\t},\r\n\t\tClassParticipantSubscriptionsView: {\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\tparticipant: {\r\n\t\t\t\ten: \"Participant\",\r\n\t\t\t\tit: \"Partecipante\",\r\n\t\t\t\tes: \"Partícipe\",\r\n\t\t\t\tfr: \"Participant\",\r\n\t\t\t},\r\n\t\t\t\"in-queue\": {\r\n\t\t\t\ten: \"In Queue\",\r\n\t\t\t\tit: \"In Coda\",\r\n\t\t\t\tes: \"En Fila\",\r\n\t\t\t\tfr: \"Dans La Queue\",\r\n\t\t\t},\r\n\t\t\t\"participation-status\": {\r\n\t\t\t\ten: \"Participation Status\",\r\n\t\t\t\tit: \"Stato Partecipazione\",\r\n\t\t\t\tes: \"Estado De Participación\",\r\n\t\t\t\tfr: \"Statut De Participation\",\r\n\t\t\t},\r\n\t\t\tpt: {\r\n\t\t\t\ten: \"PT\",\r\n\t\t\t\tit: \"PT\",\r\n\t\t\t\tes: \"PT\",\r\n\t\t\t\tfr: \"PT\",\r\n\t\t\t},\r\n\t\t\t\"view-lesson\": {\r\n\t\t\t\ten: \"View lesson\",\r\n\t\t\t\tit: \"Vedi lezione\",\r\n\t\t\t\tes: \"Ver lección\",\r\n\t\t\t\tfr: \"Voir leçon\",\r\n\t\t\t},\r\n\t\t\t\"view-all-participants\": {\r\n\t\t\t\ten: \"View all participants\",\r\n\t\t\t\tit: \"Visualizza tutti i partecipanti\",\r\n\t\t\t\tes: \"Ver todos los participantes\",\r\n\t\t\t\tfr: \"Voir tous les participants\",\r\n\t\t\t},\r\n\t\t},\r\n\t\tVideoCollectionsView: {\r\n\t\t\t\"insert-valid-youtube-link\": {\r\n\t\t\t\ten: \"insert valid YouTube link\",\r\n\t\t\t\tit: \"inserisci un link YouTube valido\",\r\n\t\t\t\tes: \"inserte un enlace de YouTube válido\",\r\n\t\t\t\tfr: \"insérer un lien YouTube valide\",\r\n\t\t\t},\r\n\t\t\t\"insert-valid-vimeo-link\": {\r\n\t\t\t\ten: \"insert valid Vimeo link\",\r\n\t\t\t\tit: \"inserisci un link Vimeo valido\",\r\n\t\t\t\tes: \"inserte un enlace de Vimeo válido\",\r\n\t\t\t\tfr: \"insérer un lien Vimeo valide\",\r\n\t\t\t},\r\n\t\t\t\"video-not-found\": {\r\n\t\t\t\ten: \"Video not found\",\r\n\t\t\t\tit: \"Video non trovato\",\r\n\t\t\t\tes: \"Video no encontrado\",\r\n\t\t\t\tfr: \"Vidéo non trouvée\",\r\n\t\t\t},\r\n\t\t\t\"youtube-link\": {\r\n\t\t\t\ten: \"YouTube Link\",\r\n\t\t\t\tit: \"YouTube Link\",\r\n\t\t\t\tes: \"YouTube Link\",\r\n\t\t\t\tfr: \"YouTube Link\",\r\n\t\t\t},\r\n\t\t\t\"vimeo-link\": {\r\n\t\t\t\ten: \"Vimeo Link\",\r\n\t\t\t\tit: \"Vimeo Link\",\r\n\t\t\t\tes: \"Vimeo Link\",\r\n\t\t\t\tfr: \"Vimeo Link\",\r\n\t\t\t},\r\n\t\t\tvideo: {\r\n\t\t\t\ten: \"Video\",\r\n\t\t\t\tit: \"Video\",\r\n\t\t\t\tes: \"Video\",\r\n\t\t\t\tfr: \"Video\",\r\n\t\t\t},\r\n\t\t\t\"video-collections\": {\r\n\t\t\t\ten: \"PlayLists\",\r\n\t\t\t\tit: \"PlayLists\",\r\n\t\t\t\tes: \"PlayLists\",\r\n\t\t\t\tfr: \"PlayLists\",\r\n\t\t\t},\r\n\t\t\t\"add-new-collection\": {\r\n\t\t\t\ten: \"Add New PlayList\",\r\n\t\t\t\tit: \"Aggiungi Nuova PlayList\",\r\n\t\t\t\tes: \"Agregar nueva PlayList\",\r\n\t\t\t\tfr: \"Ajouter une nouvelle PlayList\",\r\n\t\t\t},\r\n\t\t\t\"edit-collection\": {\r\n\t\t\t\ten: \"Edit PlayList\",\r\n\t\t\t\tit: \"Modifica PlayList\",\r\n\t\t\t\tes: \"Editar PlayList\",\r\n\t\t\t\tfr: \"Modifier PlayList\",\r\n\t\t\t},\r\n\t\t\t\"add-new-video\": {\r\n\t\t\t\ten: \"Add New Video\",\r\n\t\t\t\tit: \"Aggiungi Nuovo Video\",\r\n\t\t\t\tes: \"Agregar Nuevo Vídeo\",\r\n\t\t\t\tfr: \"Ajouter Nouvelle Vidéo\",\r\n\t\t\t},\r\n\t\t\t\"import-video\": {\r\n\t\t\t\ten: \"Import Video\",\r\n\t\t\t\tit: \"Importa Video\",\r\n\t\t\t\tes: \"Importar Vídeo\",\r\n\t\t\t\tfr: \"Importer Vidéo\",\r\n\t\t\t},\r\n\t\t\t\"import-video\": {\r\n\t\t\t\ten: \"Import Video\",\r\n\t\t\t\tit: \"Importa Video\",\r\n\t\t\t\tes: \"Importar Vídeo\",\r\n\t\t\t\tfr: \"Importer Vidéo\",\r\n\t\t\t},\r\n\t\t\t\"create-video\": {\r\n\t\t\t\ten: \"Create Video\",\r\n\t\t\t\tit: \"Crea Video\",\r\n\t\t\t\tes: \"Crear Vídeo\",\r\n\t\t\t\tfr: \"Créer Vidéo\",\r\n\t\t\t},\r\n\t\t\t\"edit-video\": {\r\n\t\t\t\ten: \"Edit Video\",\r\n\t\t\t\tit: \"Modifica Video\",\r\n\t\t\t\tes: \"Editar Vídeo\",\r\n\t\t\t\tfr: \"Éditer Vidéo\",\r\n\t\t\t},\r\n\t\t\t\"confirm-disable\": {\r\n\t\t\t\ten: \"Are you sure you want to disable it?\",\r\n\t\t\t\tit: \"Sei sicuro di volerlo disabilitare?\",\r\n\t\t\t\tes: \"¿Estás seguro de que quieres desactivarlo?\",\r\n\t\t\t\tfr: \"Êtes-vous sûr de vouloir le désactiver?\",\r\n\t\t\t},\r\n\t\t\t\"confirm-enable\": {\r\n\t\t\t\ten: \"Are you sure you want to enable it?\",\r\n\t\t\t\tit: \"Sei sicuro di volerlo abilitare?\",\r\n\t\t\t\tes: \"¿Está seguro de que desea habilitarlo?\",\r\n\t\t\t\tfr: \"Voulez-vous vraiment l'activer?\",\r\n\t\t\t},\r\n\t\t\t\"a-video-must-be-in-at-least-one-collection\": {\r\n\t\t\t\ten: \"A video must be in at least one PlayList\",\r\n\t\t\t\tit: \"Un video deve essere in almeno una PlayList\",\r\n\t\t\t\tes: \"Un video debe estar en al menos una PlayList\",\r\n\t\t\t\tfr: \"Une vidéo doit être dans au moins une PlayList\",\r\n\t\t\t},\r\n\t\t\t\"this-video-is-present-in-several-collections\": {\r\n\t\t\t\ten: \"This video is present in several PlayLists.\",\r\n\t\t\t\tit: \"Questo video è presente in più PlayLists.\",\r\n\t\t\t\tes: \"Este video esta presente en varias PlayLists.\",\r\n\t\t\t\tfr: \"Cette vidéo est présente dans plusieurs PlayLists.\",\r\n\t\t\t},\r\n\t\t\t\"on-demand-not-enabled-club\": {\r\n\t\t\t\ten: \"On Demand is not enabled for the selected club.\",\r\n\t\t\t\tit: \"On Demand non è attivo nel il club selezionato.\",\r\n\t\t\t\tes: \"On Demand no está habilitado para el club seleccionado.\",\r\n\t\t\t\tfr: \"On Demand n'est pas activé pour le club sélectionné.\",\r\n\t\t\t},\r\n\t\t},\r\n\t\tDashBoardView: {\r\n\t\t\t\"show-client-status-boxes\": {\r\n\t\t\t\ten: \"Show Clients Status Boxes\",\r\n\t\t\t\tit: \"Mostra i Box Di Stato Dei Clienti\",\r\n\t\t\t\tes: \"Mostrar Cajas De Estado De Los Clientes\",\r\n\t\t\t\tfr: \"Afficher Les Boîtes De Statut Des Clients\",\r\n\t\t\t},\r\n\t\t\t\"show-lists-under-boxes\": {\r\n\t\t\t\ten: \"Show Lists Under Boxes\",\r\n\t\t\t\tit: \"Mostra Elenchi Sotto I Box\",\r\n\t\t\t\tes: \"Mostrar Listas Debajo De Las Cajas\",\r\n\t\t\t\tfr: \"Afficher Les Listes Sous Les Boîtes\",\r\n\t\t\t},\r\n\t\t\t\"show-extended-view\": {\r\n\t\t\t\ten: \"Show Extended View\",\r\n\t\t\t\tit: \"Mostra Vista Estesa\",\r\n\t\t\t\tes: \"Mostrar Vista Extendida\",\r\n\t\t\t\tfr: \"Afficher La Vue Étendue\",\r\n\t\t\t},\r\n\t\t},\r\n\t\tDataTables: {\r\n\t\t\t\"dt.decimal\": {\r\n\t\t\t\tit: \",\",\r\n\t\t\t\tes: \",\",\r\n\t\t\t\tfr: \",\",\r\n\t\t\t},\r\n\t\t\t\"dt.emptyTable\": {\r\n\t\t\t\tit: \"Nessun dato presente nella tabella\",\r\n\t\t\t\tes: \"Ningún dato disponible en esta tabla\",\r\n\t\t\t\tfr: \"Aucune donnée disponible dans le tableau\",\r\n\t\t\t},\r\n\t\t\t\"dt.info\": {\r\n\t\t\t\tit: \"Vista da _START_ a _END_ di _TOTAL_ elementi\",\r\n\t\t\t\tes: \"Mostrando del _START_ al _END_ de un total de _TOTAL_ registros\",\r\n\t\t\t\tfr: \"Affichage de l'élément _START_ à _END_ sur _TOTAL_ éléments\",\r\n\t\t\t},\r\n\t\t\t\"dt.infoEmpty\": {\r\n\t\t\t\tit: \"Vista da 0 a 0 di 0 elementi\",\r\n\t\t\t\tes: \"Mostrando del 0 al 0 de un total de 0 registros\",\r\n\t\t\t\tfr: \"Affichage de l'élément 0 à 0 sur 0 élément\",\r\n\t\t\t},\r\n\t\t\t\"dt.infoFiltered\": {\r\n\t\t\t\ten: \"(filtered from _MAX_ total entries)\",\r\n\t\t\t\tit: \"(filtrati da _MAX_ elementi totali)\",\r\n\t\t\t\tes: \"(filtrado de un total de _MAX_)\",\r\n\t\t\t\tfr: \"(filtré de _MAX_ éléments au total)\",\r\n\t\t\t},\r\n\t\t\t\"dt.thousands\": {\r\n\t\t\t\tit: \".\",\r\n\t\t\t\tes: \".\",\r\n\t\t\t\tfr: \" \",\r\n\t\t\t},\r\n\t\t\t\"dt.lengthMenu\": {\r\n\t\t\t\tit: \"Visualizza _MENU_ elementi\",\r\n\t\t\t\tes: \"Mostrar _MENU_ registros\",\r\n\t\t\t\tfr: \"Afficher _MENU_ éléments\",\r\n\t\t\t},\r\n\t\t\t\"dt.loadingRecords\": {\r\n\t\t\t\tit: \"Caricamento…\",\r\n\t\t\t\tes: \"Cargando…\",\r\n\t\t\t\tfr: \"Chargement en cours…\",\r\n\t\t\t},\r\n\t\t\t\"dt.processing\": {\r\n\t\t\t\tit: \"Elaborazione…\",\r\n\t\t\t\tes: \"Procesando…\",\r\n\t\t\t\tfr: \"Traitement en cours…\",\r\n\t\t\t},\r\n\t\t\t\"dt.search\": {\r\n\t\t\t\tit: \"Cerca:\",\r\n\t\t\t\tes: \"Buscar:\",\r\n\t\t\t\tfr: \"Rechercher:\",\r\n\t\t\t},\r\n\t\t\t\"dt.zeroRecords\": {\r\n\t\t\t\tit: \"La ricerca non ha portato alcun risultato\",\r\n\t\t\t\tes: \"No se encontraron resultados\",\r\n\t\t\t\tfr: \"Aucun élément à afficher\",\r\n\t\t\t},\r\n\t\t\t\"dt.select.1\": {\r\n\t\t\t\ten: \"1 row selected\",\r\n\t\t\t\tit: \"1 riga selezionata\",\r\n\t\t\t\tes: \"1 fila seleccionada\",\r\n\t\t\t\tfr: \"1 rangée sélectionnée\",\r\n\t\t\t},\r\n\t\t\t\"dt.select.many\": {\r\n\t\t\t\ten: \"%d rows selected\",\r\n\t\t\t\tit: \"%d righe selezionate\",\r\n\t\t\t\tes: \"%d filas seleccionadas\",\r\n\t\t\t\tfr: \"%d lignes sélectionnées\",\r\n\t\t\t},\r\n\t\t},\r\n\t\tSupport: {\r\n\t\t\t\"activity-calendars-title\": {\r\n\t\t\t\ten: \"Activity Calendars\",\r\n\t\t\t\tit: \"Calendari delle attività\",\r\n\t\t\t\tes: \"Calendarios de actividades\",\r\n\t\t\t\tfr: \"Calendriers d'activités\",\r\n\t\t\t},\r\n\t\t\t\"activity-calendars-txt\": {\r\n\t\t\t\ten: \"How to create and manage your group lessons and personal training appointments\",\r\n\t\t\t\tit: \"Come creare e gestire le tue lezioni di gruppo e i tuoi appuntamenti di personal training\",\r\n\t\t\t\tes: \"Cómo crear y gestionar tus lecciones grupales y citas de entrenamiento personal\",\r\n\t\t\t\tfr: \"Comment créer et gérer vos cours collectifs et vos rendez-vous de formation personnelle\",\r\n\t\t\t},\r\n\t\t\t\"adding-participants-title\": {\r\n\t\t\t\ten: \"Adding Class Participants\",\r\n\t\t\t\tit: \"Aggiunta di partecipanti alla lezione\",\r\n\t\t\t\tes: \"Agregar participantes a la clase\",\r\n\t\t\t\tfr: \"Ajouter des participants à la classe\",\r\n\t\t\t},\r\n\t\t\t\"adding-participants-txt\": {\r\n\t\t\t\ten: \"How to add one or more members to one or multiple classes or activities in a few clicks\",\r\n\t\t\t\tit: \"Come aggiungere uno o più membri a una o più classi o attività in pochi clic\",\r\n\t\t\t\tes: \"Cómo agregar uno o más miembros a una o varias clases o actividades con unos pocos clics\",\r\n\t\t\t\tfr: \"Comment ajouter un ou plusieurs membres à un ou plusieurs cours ou activités en quelques clics\",\r\n\t\t\t},\r\n\t\t\t\"custom-challenges-title\": {\r\n\t\t\t\ten: \"Challenges – Custom\",\r\n\t\t\t\tit: \"Sfide – Personalizzate\",\r\n\t\t\t\tes: \"Desafíos – Personalizados\",\r\n\t\t\t\tfr: \"Défis – Personnalisé\",\r\n\t\t\t},\r\n\t\t\t\"custom-challenges-txt\": {\r\n\t\t\t\ten: \"How to create challenges over time with custom dates and settings\",\r\n\t\t\t\tit: \"Come creare sfide nel tempo con date e impostazioni personalizzate\",\r\n\t\t\t\tes: \"Cómo crear desafíos a lo largo del tiempo con fechas y configuraciones personalizadas\",\r\n\t\t\t\tfr: \"Comment créer des défis au fil du temps avec des dates et des paramètres personnalisés\",\r\n\t\t\t},\r\n\t\t\t\"monthly-challenges-title\": {\r\n\t\t\t\ten: \"Challenges – Monthly\",\r\n\t\t\t\tit: \"Sfide – Mensile\",\r\n\t\t\t\tes: \"Desafíos – Mensual\",\r\n\t\t\t\tfr: \"Défis – Mensuel\",\r\n\t\t\t},\r\n\t\t\t\"monthly-challenges-txt\": {\r\n\t\t\t\ten: \"How to create monthly challenges that restart every month automatically\",\r\n\t\t\t\tit: \"Come creare sfide mensili che si riavviano automaticamente ogni mese\",\r\n\t\t\t\tes: \"Cómo crear desafíos mensuales que se reinician cada mes automáticamente\",\r\n\t\t\t\tfr: \"Comment créer des défis mensuels qui redémarrent automatiquement chaque mois\",\r\n\t\t\t},\r\n\t\t\t\"garmin-gym-title\": {\r\n\t\t\t\ten: \"Garmin at the Gym\",\r\n\t\t\t\tit: \"Garmin in palestra\",\r\n\t\t\t\tes: \"Garmin en el gimnasio\",\r\n\t\t\t\tfr: \"Garmin à la salle de sport\",\r\n\t\t\t},\r\n\t\t\t\"garmin-gym-txt\": {\r\n\t\t\t\ten: \"How to use a Garmin smartwatch as an HR sensor with your Bridge at the gym/studio\",\r\n\t\t\t\tit: \"Come utilizzare uno smartwatch Garmin come sensore FC con il Bridge in palestra/studio\",\r\n\t\t\t\tes: \"Cómo utilizar un reloj inteligente Garmin como sensor de FC con tu Bridge en el gimnasio/estudio\",\r\n\t\t\t\tfr: \"Comment utiliser une montre intelligente Garmin comme capteur FC avec votre Bridge à la salle de sport/studio\",\r\n\t\t\t},\r\n\t\t\t\"garmin-connect-integration-title\": {\r\n\t\t\t\ten: \"Garmin Connect Integration\",\r\n\t\t\t\tit: \"Integrazione Garmin Connect\",\r\n\t\t\t\tes: \"Integración de Garmin Connect\",\r\n\t\t\t\tfr: \"Intégration Garmin Connect\",\r\n\t\t\t},\r\n\t\t\t\"garmin-connect-integration-txt\": {\r\n\t\t\t\ten: \"How to enable Garmin -> Uptivo integration to automatically import Garmin workouts\",\r\n\t\t\t\tit: \"Come abilitare l'integrazione Garmin -> Uptivo per importare automaticamente gli allenamenti Garmin\",\r\n\t\t\t\tes: \"Cómo habilitar la integración Garmin -> Uptivo para importar automáticamente entrenamientos de Garmin\",\r\n\t\t\t\tfr: \"Comment activer l'intégration Garmin -> Uptivo pour importer automatiquement les entraînements Garmin\",\r\n\t\t\t},\r\n\t\t\t\"invite-user-title\": {\r\n\t\t\t\ten: \"Invite New Member\",\r\n\t\t\t\tit: \"Invitare nuovo membro\",\r\n\t\t\t\tes: \"Invitar nuevo miembro\",\r\n\t\t\t\tfr: \"Inviter un nouveau membre\",\r\n\t\t\t},\r\n\t\t\t\"invite-user-txt\": {\r\n\t\t\t\ten: \"How to add new members to your Uptivo club account, or have them create their profile and join your account\",\r\n\t\t\t\tit: \"Come aggiungere nuovi membri al tuo account Uptivo Club o come fargli creare il proprio profilo e unirsi al tuo account\",\r\n\t\t\t\tes: \"Cómo agregar nuevos miembros a su cuenta del club Uptivo, o hacer que creen su perfil y se unan a su cuenta\",\r\n\t\t\t\tfr: \"Comment ajouter de nouveaux membres à votre compte club Uptivo, ou leur demander de créer leur profil et de rejoindre votre compte\",\r\n\t\t\t},\r\n\t\t\t\"sensor-pairing-title\": {\r\n\t\t\t\ten: \"Add an HR Sensor to a Member\",\r\n\t\t\t\tit: \"Aggiungi un sensore FC a un membro\",\r\n\t\t\t\tes: \"Agregar un sensor de frecuencia cardíaca a un miembro\",\r\n\t\t\t\tfr: \"Ajouter un capteur FC à un membre\",\r\n\t\t\t},\r\n\t\t\t\"sensor-pairing-txt\": {\r\n\t\t\t\ten: \"How to pair a heart rate sensor (Uptivo or other brand) to your members’ profile\",\r\n\t\t\t\tit: \"Come associare un sensore di frequenza cardiaca (Uptivo o altra marca) al profilo dei tuoi membri\",\r\n\t\t\t\tes: \"Cómo vincular un sensor de frecuencia cardíaca (Uptivo u otra marca) a perfiles de tu miembro\",\r\n\t\t\t\tfr: \"Comment coupler un capteur de fréquence cardiaque (Uptivo ou autre marque) à vos profils membres\",\r\n\t\t\t},\r\n\t\t\t\"subscription-management-title\": {\r\n\t\t\t\ten: \"Subscription Management\",\r\n\t\t\t\tit: \"Gestione degli abbonamenti\",\r\n\t\t\t\tes: \"Gestión de suscripciones\",\r\n\t\t\t\tfr: \"Gestion des abonnements\",\r\n\t\t\t},\r\n\t\t\t\"subscription-management-txt\": {\r\n\t\t\t\ten: \"How to create your club subscriptions and assign them to your members\",\r\n\t\t\t\tit: \"Come creare gli abbonamenti del tuo club e assegnarli ai tuoi membri\",\r\n\t\t\t\tes: \"Cómo crear las suscripciones de tu club y asignarlas a tus socios\",\r\n\t\t\t\tfr: \"Comment créer vos abonnements club et les attribuer à vos membres\",\r\n\t\t\t},\r\n\t\t\t\"user-profile-title\": {\r\n\t\t\t\ten: \"User Profile\",\r\n\t\t\t\tit: \"Profilo utente\",\r\n\t\t\t\tes: \"Perfil del usuario\",\r\n\t\t\t\tfr: \"Profil de l'utilisateur\",\r\n\t\t\t},\r\n\t\t\t\"user-profile-txt\": {\r\n\t\t\t\ten: \"How to review member information and manage member profiles\",\r\n\t\t\t\tit: \"Come rivedere le informazioni sui membri e gestire i loro profili utente\",\r\n\t\t\t\tes: \"Cómo revisar la información de los miembros y administrar los perfiles de los miembros\",\r\n\t\t\t\tfr: \"Comment consulter les informations sur les membres et gérer les profils\",\r\n\t\t\t},\r\n\t\t\t\"workouts-app-title\": {\r\n\t\t\t\ten: \"Workouts – In App\",\r\n\t\t\t\tit: \"Workouts – Nell'app\",\r\n\t\t\t\tes: \"Workouts – En la aplicación\",\r\n\t\t\t\tfr: \"Workouts - Dans l'application\",\r\n\t\t\t},\r\n\t\t\t\"workouts-app-txt\": {\r\n\t\t\t\ten: \"How to create workouts that can be assigned to members, so that they can follow along when not at the gym/studio\",\r\n\t\t\t\tit: \"Come creare allenamenti che possono essere assegnati ai membri, in modo che possano seguirli da telefono quando non sono in palestra/studio\",\r\n\t\t\t\tes: \"Cómo crear entrenamientos que se puedan asignar a los miembros, para que puedan seguirlos cuando no estén en el gimnasio/estudio\",\r\n\t\t\t\tfr: \"Comment créer des entraînements qui peuvent être attribués aux membres, afin qu'ils puissent les suivre lorsqu'ils ne sont pas au gymnase/studio\",\r\n\t\t\t},\r\n\t\t\t\"workouts-onscreen-title\": {\r\n\t\t\t\ten: \"Workouts – On Screen\",\r\n\t\t\t\tit: \"Workouts – A schermo\",\r\n\t\t\t\tes: \"Workouts – En pantalla\",\r\n\t\t\t\tfr: \"Workouts – À l’écran\",\r\n\t\t\t},\r\n\t\t\t\"workouts-onscreen-txt\": {\r\n\t\t\t\ten: \"How to create workouts that can be displayed on TVs, so that members can follow along when at the gym/studio\",\r\n\t\t\t\tit: \"Come creare allenamenti che possono essere visualizzati sui televisori, in modo che i membri possano seguirli quando sono in palestra/studio\",\r\n\t\t\t\tes: \"Cómo crear entrenamientos que se puedan mostrar en televisores, para que los miembros puedan seguirlos cuando estén en el gimnasio/estudio\",\r\n\t\t\t\tfr: \"Comment créer des entraînements qui peuvent être affichés sur les téléviseurs, afin que les membres puissent les suivre lorsqu'ils sont au gymnase/studio\",\r\n\t\t\t},\r\n\t\t\t\"bridge-registration-title\": {\r\n\t\t\t\ten: \"Bridge Registration\",\r\n\t\t\t\tit: \"Registrazione del Bridge\",\r\n\t\t\t\tes: \"Registro del Bridge\",\r\n\t\t\t\tfr: \"Enregistrer le Bridge\"\r\n\t\t\t},\r\n\t\t\t\"bridge-registration-txt\": {\r\n\t\t\t\ten: \"How to register the Bridge to your Club's Uptivo account\",\r\n\t\t\t\tit: \"Come registrare il Bridge all’account Uptivo del proprio Club\",\r\n\t\t\t\tes: \"Cómo registrar el Bridge en la cuenta Uptivo de tu Club\",\r\n\t\t\t\tfr: \"Comment enregistrer le Bridge aux services cloud Uptivo de votre Club\"\r\n\t\t\t},\r\n\t\t\t\"bridge-setup-title\": {\r\n\t\t\t\ten: \"Bridge Setup\",\r\n\t\t\t\tit: \"Setup del Bridge\",\r\n\t\t\t\tes: \"Configuración del Bridge\",\r\n\t\t\t\tfr: \"Configuration du Bridge\"\r\n\t\t\t},\r\n\t\t\t\"bridge-setup-txt\": {\r\n\t\t\t\ten: \"How to make the physical connections of the Bridge (Uptivo receiver) and how to connect it to your network\",\r\n\t\t\t\tit: \"Come effettuare i collegamenti fisici del Bridge (ricevitore Uptivo) e come connetterlo alla propria rete\",\r\n\t\t\t\tes: \"Cómo hacer las conexiones físicas del Bridge (receptor Uptivo) y cómo conectarlo a tu red\",\r\n\t\t\t\tfr: \"Comment réaliser les connexions physiques du Bridge (récepteur Uptivo) et comment le connecter à votre réseau\"\r\n\t\t\t},\r\n\t\t\t\"inapp-messages-title\": {\r\n\t\t\t\ten: \"In-App Messages\",\r\n\t\t\t\tit: \"Messaggi In-App\",\r\n\t\t\t\tes: \"Mensajes en la aplicación\",\r\n\t\t\t\tfr: \"Messages dans l'application\"\r\n\t\t\t},\r\n\t\t\t\"inapp-messages-txt\": {\r\n\t\t\t\ten: \"How to create template messages or instant messages and send them to one or more Club customers\",\r\n\t\t\t\tit: \"Come creare messaggi modello o messaggi istantanei e inviarli a uno o più clienti del Club\",\r\n\t\t\t\tes: \"Cómo crear mensajes de plantilla o mensajes instantáneos y enviarlos a uno o más clientes del Club\",\r\n\t\t\t\tfr: \"Comment créer des modèles de messages ou des messages instantanés et les envoyer à un ou plusieurs clients du Club\"\r\n\t\t\t},\r\n\t\t\t\"move-users-tv-title\": {\r\n\t\t\t\ten: \"Move Users to TVs\",\r\n\t\t\t\tit: \"Spostare Utenti sui Televisori\",\r\n\t\t\t\tes: \"Mover usuarios a televisores\",\r\n\t\t\t\tfr: \"Déplacer les utilisateurs vers les téléviseurs\"\r\n\t\t\t},\r\n\t\t\t\"move-users-tv-txt\": {\r\n\t\t\t\ten: \"How to move users from one television to another, or allow them to move independently\",\r\n\t\t\t\tit: \"Come spostare gli utenti da un televisore a un altro, o permettere che si spostino in autonomia\",\r\n\t\t\t\tes: \"Cómo pasar usuarios de un televisor a otro, o permitirles moverse de forma independiente\",\r\n\t\t\t\tfr: \"Comment déplacer les utilisateurs d'un téléviseur à un autre, ou leur permettre de se déplacer de manière indépendante\"\r\n\t\t\t},\r\n\t\t\t\"real-time-challenges-title\": {\r\n\t\t\t\ten: \"Real-time group challenges\",\r\n\t\t\t\tit: \"Sfide di gruppo in tempo reale\",\r\n\t\t\t\tes: \"Desafíos grupales en tiempo real\",\r\n\t\t\t\tfr: \"Défis de groupe en temps réel\"\r\n\t\t\t},\r\n\t\t\t\"real-time-challenges-txt\": {\r\n\t\t\t\ten: \"How to create free-for-all challenges or team challenges in real time\",\r\n\t\t\t\tit: \"Come creare sfide tutti contro tutti oppure sfide a squadre in tempo reale\",\r\n\t\t\t\tes: \"Cómo crear desafíos todos contra todos o desafíos en equipo en tiempo real\",\r\n\t\t\t\tfr: \"Comment créer des défis gratuits ou des défis d'équipe en temps réel\"\r\n\t\t\t},\r\n\t\t\t\"timers-intensity-flows-title\": {\r\n\t\t\t\ten: \"Timers and Intensity Flows\",\r\n\t\t\t\tit: \"Timer e Intensity Flow\",\r\n\t\t\t\tes: \"Temporizadores y flujos de intensidad\",\r\n\t\t\t\tfr: \"Chronometres et flux d'intensité\"\r\n\t\t\t},\r\n\t\t\t\"timers-intensity-flows-txt\": {\r\n\t\t\t\ten: \"How to create and launch timers and intensity timelines to lead a class\",\r\n\t\t\t\tit: \"Come creare e lanciare timer e timeline di intensità per guidare una classe\",\r\n\t\t\t\tes: \"Cómo crear y lanzar cronómetros y cronogramas de intensidad para dirigir una clase\",\r\n\t\t\t\tfr: \"Comment créer et lancer des chronometres et des chronologies d'intensité pour diriger une classe\"\r\n\t\t\t},\r\n\t\t}\r\n\t};\r\n}\r\n\r\nif (typeof module !== \"undefined\" && module.hasOwnProperty(\"exports\")) {\r\n\tmodule.exports = Resources;\r\n}\r\n\n//! moment.js locale configuration\r\n\r\n;(function (global, factory) {\r\n typeof exports === 'object' && typeof module !== 'undefined'\r\n && typeof require === 'function' ? factory(require('../moment')) :\r\n typeof define === 'function' && define.amd ? define(['../moment'], factory) :\r\n factory(global.moment)\r\n}(this, (function (moment) { 'use strict';\r\n\r\n\r\n var it = moment.defineLocale('it', {\r\n months : 'gennaio_febbraio_marzo_aprile_maggio_giugno_luglio_agosto_settembre_ottobre_novembre_dicembre'.split('_'),\r\n monthsShort : 'gen_feb_mar_apr_mag_giu_lug_ago_set_ott_nov_dic'.split('_'),\r\n weekdays : 'domenica_lunedì_martedì_mercoledì_giovedì_venerdì_sabato'.split('_'),\r\n weekdaysShort : 'dom_lun_mar_mer_gio_ven_sab'.split('_'),\r\n weekdaysMin : 'do_lu_ma_me_gi_ve_sa'.split('_'),\r\n longDateFormat : {\r\n LT : 'HH:mm',\r\n LTS : 'HH:mm:ss',\r\n L : 'DD/MM/YYYY',\r\n LL : 'D MMMM YYYY',\r\n LLL : 'D MMMM YYYY HH:mm',\r\n LLLL : 'dddd D MMMM YYYY HH:mm'\r\n },\r\n calendar : {\r\n sameDay: '[Oggi alle] LT',\r\n nextDay: '[Domani alle] LT',\r\n nextWeek: 'dddd [alle] LT',\r\n lastDay: '[Ieri alle] LT',\r\n lastWeek: function () {\r\n switch (this.day()) {\r\n case 0:\r\n return '[la scorsa] dddd [alle] LT';\r\n default:\r\n return '[lo scorso] dddd [alle] LT';\r\n }\r\n },\r\n sameElse: 'L'\r\n },\r\n relativeTime : {\r\n future : function (s) {\r\n return ((/^[0-9].+$/).test(s) ? 'tra' : 'in') + ' ' + s;\r\n },\r\n past : '%s fa',\r\n s : 'alcuni secondi',\r\n ss : '%d secondi',\r\n m : 'un minuto',\r\n mm : '%d minuti',\r\n h : 'un\\'ora',\r\n hh : '%d ore',\r\n d : 'un giorno',\r\n dd : '%d giorni',\r\n M : 'un mese',\r\n MM : '%d mesi',\r\n y : 'un anno',\r\n yy : '%d anni'\r\n },\r\n dayOfMonthOrdinalParse : /\\d{1,2}º/,\r\n ordinal: '%dº',\r\n week : {\r\n dow : 1, // Monday is the first day of the week.\r\n doy : 4 // The week that contains Jan 4th is the first week of the year.\r\n }\r\n });\r\n\r\n return it;\r\n\r\n})));\r\n\n//! moment.js locale configuration\r\n\r\n;(function (global, factory) {\r\n typeof exports === 'object' && typeof module !== 'undefined'\r\n && typeof require === 'function' ? factory(require('../moment')) :\r\n typeof define === 'function' && define.amd ? define(['../moment'], factory) :\r\n factory(global.moment)\r\n}(this, (function (moment) { 'use strict';\r\n\r\n\r\n var monthsShortDot = 'ene._feb._mar._abr._may._jun._jul._ago._sep._oct._nov._dic.'.split('_'),\r\n monthsShort = 'ene_feb_mar_abr_may_jun_jul_ago_sep_oct_nov_dic'.split('_');\r\n\r\n var monthsParse = [/^ene/i, /^feb/i, /^mar/i, /^abr/i, /^may/i, /^jun/i, /^jul/i, /^ago/i, /^sep/i, /^oct/i, /^nov/i, /^dic/i];\r\n var monthsRegex = /^(enero|febrero|marzo|abril|mayo|junio|julio|agosto|septiembre|octubre|noviembre|diciembre|ene\\.?|feb\\.?|mar\\.?|abr\\.?|may\\.?|jun\\.?|jul\\.?|ago\\.?|sep\\.?|oct\\.?|nov\\.?|dic\\.?)/i;\r\n\r\n var es = moment.defineLocale('es', {\r\n months : 'enero_febrero_marzo_abril_mayo_junio_julio_agosto_septiembre_octubre_noviembre_diciembre'.split('_'),\r\n monthsShort : function (m, format) {\r\n if (!m) {\r\n return monthsShortDot;\r\n } else if (/-MMM-/.test(format)) {\r\n return monthsShort[m.month()];\r\n } else {\r\n return monthsShortDot[m.month()];\r\n }\r\n },\r\n monthsRegex : monthsRegex,\r\n monthsShortRegex : monthsRegex,\r\n monthsStrictRegex : /^(enero|febrero|marzo|abril|mayo|junio|julio|agosto|septiembre|octubre|noviembre|diciembre)/i,\r\n monthsShortStrictRegex : /^(ene\\.?|feb\\.?|mar\\.?|abr\\.?|may\\.?|jun\\.?|jul\\.?|ago\\.?|sep\\.?|oct\\.?|nov\\.?|dic\\.?)/i,\r\n monthsParse : monthsParse,\r\n longMonthsParse : monthsParse,\r\n shortMonthsParse : monthsParse,\r\n weekdays : 'domingo_lunes_martes_miércoles_jueves_viernes_sábado'.split('_'),\r\n weekdaysShort : 'dom._lun._mar._mié._jue._vie._sáb.'.split('_'),\r\n weekdaysMin : 'do_lu_ma_mi_ju_vi_sá'.split('_'),\r\n weekdaysParseExact : true,\r\n longDateFormat : {\r\n LT : 'H:mm',\r\n LTS : 'H:mm:ss',\r\n L : 'DD/MM/YYYY',\r\n LL : 'D [de] MMMM [de] YYYY',\r\n LLL : 'D [de] MMMM [de] YYYY H:mm',\r\n LLLL : 'dddd, D [de] MMMM [de] YYYY H:mm'\r\n },\r\n calendar : {\r\n sameDay : function () {\r\n return '[hoy a la' + ((this.hours() !== 1) ? 's' : '') + '] LT';\r\n },\r\n nextDay : function () {\r\n return '[mañana a la' + ((this.hours() !== 1) ? 's' : '') + '] LT';\r\n },\r\n nextWeek : function () {\r\n return 'dddd [a la' + ((this.hours() !== 1) ? 's' : '') + '] LT';\r\n },\r\n lastDay : function () {\r\n return '[ayer a la' + ((this.hours() !== 1) ? 's' : '') + '] LT';\r\n },\r\n lastWeek : function () {\r\n return '[el] dddd [pasado a la' + ((this.hours() !== 1) ? 's' : '') + '] LT';\r\n },\r\n sameElse : 'L'\r\n },\r\n relativeTime : {\r\n future : 'en %s',\r\n past : 'hace %s',\r\n s : 'unos segundos',\r\n ss : '%d segundos',\r\n m : 'un minuto',\r\n mm : '%d minutos',\r\n h : 'una hora',\r\n hh : '%d horas',\r\n d : 'un día',\r\n dd : '%d días',\r\n M : 'un mes',\r\n MM : '%d meses',\r\n y : 'un año',\r\n yy : '%d años'\r\n },\r\n dayOfMonthOrdinalParse : /\\d{1,2}º/,\r\n ordinal : '%dº',\r\n week : {\r\n dow : 1, // Monday is the first day of the week.\r\n doy : 4 // The week that contains Jan 4th is the first week of the year.\r\n }\r\n });\r\n\r\n return es;\r\n\r\n})));\r\n\n//! moment.js locale configuration\r\n\r\n;(function (global, factory) {\r\n typeof exports === 'object' && typeof module !== 'undefined'\r\n && typeof require === 'function' ? factory(require('../moment')) :\r\n typeof define === 'function' && define.amd ? define(['../moment'], factory) :\r\n factory(global.moment)\r\n}(this, (function (moment) { 'use strict';\r\n\r\n\r\n var fr = moment.defineLocale('fr', {\r\n months : 'janvier_février_mars_avril_mai_juin_juillet_août_septembre_octobre_novembre_décembre'.split('_'),\r\n monthsShort : 'janv._févr._mars_avr._mai_juin_juil._août_sept._oct._nov._déc.'.split('_'),\r\n monthsParseExact : true,\r\n weekdays : 'dimanche_lundi_mardi_mercredi_jeudi_vendredi_samedi'.split('_'),\r\n weekdaysShort : 'dim._lun._mar._mer._jeu._ven._sam.'.split('_'),\r\n weekdaysMin : 'di_lu_ma_me_je_ve_sa'.split('_'),\r\n weekdaysParseExact : true,\r\n longDateFormat : {\r\n LT : 'HH:mm',\r\n LTS : 'HH:mm:ss',\r\n L : 'DD/MM/YYYY',\r\n LL : 'D MMMM YYYY',\r\n LLL : 'D MMMM YYYY HH:mm',\r\n LLLL : 'dddd D MMMM YYYY HH:mm'\r\n },\r\n calendar : {\r\n sameDay : '[Aujourd’hui à] LT',\r\n nextDay : '[Demain à] LT',\r\n nextWeek : 'dddd [à] LT',\r\n lastDay : '[Hier à] LT',\r\n lastWeek : 'dddd [dernier à] LT',\r\n sameElse : 'L'\r\n },\r\n relativeTime : {\r\n future : 'dans %s',\r\n past : 'il y a %s',\r\n s : 'quelques secondes',\r\n ss : '%d secondes',\r\n m : 'une minute',\r\n mm : '%d minutes',\r\n h : 'une heure',\r\n hh : '%d heures',\r\n d : 'un jour',\r\n dd : '%d jours',\r\n M : 'un mois',\r\n MM : '%d mois',\r\n y : 'un an',\r\n yy : '%d ans'\r\n },\r\n dayOfMonthOrdinalParse: /\\d{1,2}(er|)/,\r\n ordinal : function (number, period) {\r\n switch (period) {\r\n // TODO: Return 'e' when day of month > 1. Move this case inside\r\n // block for masculine words below.\r\n // See https://github.com/moment/moment/issues/3375\r\n case 'D':\r\n return number + (number === 1 ? 'er' : '');\r\n\r\n // Words with masculine grammatical gender: mois, trimestre, jour\r\n default:\r\n case 'M':\r\n case 'Q':\r\n case 'DDD':\r\n case 'd':\r\n return number + (number === 1 ? 'er' : 'e');\r\n\r\n // Words with feminine grammatical gender: semaine\r\n case 'w':\r\n case 'W':\r\n return number + (number === 1 ? 're' : 'e');\r\n }\r\n },\r\n week : {\r\n dow : 1, // Monday is the first day of the week.\r\n doy : 4 // The week that contains Jan 4th is the first week of the year.\r\n }\r\n });\r\n\r\n return fr;\r\n\r\n})));\r\n\n/*! Moment Duration Format v2.2.2\r\n * https://github.com/jsmreese/moment-duration-format\r\n * Date: 2018-02-16\r\n *\r\n * Duration format plugin function for the Moment.js library\r\n * http://momentjs.com/\r\n *\r\n * Copyright 2018 John Madhavan-Reese\r\n * Released under the MIT license\r\n */\r\n\r\n(function (root, factory) {\r\n if (typeof define === 'function' && define.amd) {\r\n // AMD. Register as an anonymous module.\r\n define(['moment'], factory);\r\n } else if (typeof exports === 'object') {\r\n // Node. Does not work with strict CommonJS, but only CommonJS-like\r\n // enviroments that support module.exports, like Node.\r\n try {\r\n module.exports = factory(require('moment'));\r\n } catch (e) {\r\n // If moment is not available, leave the setup up to the user.\r\n // Like when using moment-timezone or similar moment-based package.\r\n module.exports = factory;\r\n }\r\n }\r\n\r\n if (root) {\r\n // Globals.\r\n root.momentDurationFormatSetup = root.moment ? factory(root.moment) : factory;\r\n }\r\n})(this, function (moment) {\r\n // `Number#tolocaleString` is tested on plugin initialization.\r\n // If the feature test passes, `toLocaleStringWorks` will be set to `true` and the\r\n // native function will be used to generate formatted output. If the feature\r\n // test fails, the fallback format function internal to this plugin will be\r\n // used.\r\n var toLocaleStringWorks = false;\r\n\r\n // `Number#toLocaleString` rounds incorrectly for select numbers in Microsoft\r\n // environments (Edge, IE11, Windows Phone) and possibly other environments.\r\n // If the rounding test fails and `toLocaleString` will be used for formatting,\r\n // the plugin will \"pre-round\" number values using the fallback number format\r\n // function before passing them to `toLocaleString` for final formatting.\r\n var toLocaleStringRoundingWorks = false;\r\n\r\n // `Intl.NumberFormat#format` is tested on plugin initialization.\r\n // If the feature test passes, `intlNumberFormatRoundingWorks` will be set to\r\n // `true` and the native function will be used to generate formatted output.\r\n // If the feature test fails, either `Number#tolocaleString` (if\r\n // `toLocaleStringWorks` is `true`), or the fallback format function internal\r\n // to this plugin will be used.\r\n var intlNumberFormatWorks = false;\r\n\r\n // `Intl.NumberFormat#format` rounds incorrectly for select numbers in Microsoft\r\n // environments (Edge, IE11, Windows Phone) and possibly other environments.\r\n // If the rounding test fails and `Intl.NumberFormat#format` will be used for\r\n // formatting, the plugin will \"pre-round\" number values using the fallback number\r\n // format function before passing them to `Intl.NumberFormat#format` for final\r\n // formatting.\r\n var intlNumberFormatRoundingWorks = false;\r\n\r\n // Token type names in order of descending magnitude.\r\n var types = \"escape years months weeks days hours minutes seconds milliseconds general\".split(\" \");\r\n\r\n var bubbles = [\r\n {\r\n type: \"seconds\",\r\n targets: [\r\n { type: \"minutes\", value: 60 },\r\n { type: \"hours\", value: 3600 },\r\n { type: \"days\", value: 86400 },\r\n { type: \"weeks\", value: 604800 },\r\n { type: \"months\", value: 2678400 },\r\n { type: \"years\", value: 31536000 }\r\n ]\r\n },\r\n {\r\n type: \"minutes\",\r\n targets: [\r\n { type: \"hours\", value: 60 },\r\n { type: \"days\", value: 1440 },\r\n { type: \"weeks\", value: 10080 },\r\n { type: \"months\", value: 44640 },\r\n { type: \"years\", value: 525600 }\r\n ]\r\n },\r\n {\r\n type: \"hours\",\r\n targets: [\r\n { type: \"days\", value: 24 },\r\n { type: \"weeks\", value: 168 },\r\n { type: \"months\", value: 744 },\r\n { type: \"years\", value: 8760 }\r\n ]\r\n },\r\n {\r\n type: \"days\",\r\n targets: [\r\n { type: \"weeks\", value: 7 },\r\n { type: \"months\", value: 31 },\r\n { type: \"years\", value: 365 }\r\n ]\r\n },\r\n {\r\n type: \"months\",\r\n targets: [\r\n { type: \"years\", value: 12 }\r\n ]\r\n }\r\n ];\r\n\r\n // stringIncludes\r\n function stringIncludes(str, search) {\r\n if (search.length > str.length) {\r\n return false;\r\n }\r\n\r\n return str.indexOf(search) !== -1;\r\n }\r\n\r\n // repeatZero(qty)\r\n // Returns \"0\" repeated `qty` times.\r\n // `qty` must be a integer >= 0.\r\n function repeatZero(qty) {\r\n var result = \"\";\r\n\r\n while (qty) {\r\n result += \"0\";\r\n qty -= 1;\r\n }\r\n\r\n return result;\r\n }\r\n\r\n function stringRound(digits) {\r\n var digitsArray = digits.split(\"\").reverse();\r\n var i = 0;\r\n var carry = true;\r\n\r\n while (carry && i < digitsArray.length) {\r\n if (i) {\r\n if (digitsArray[i] === \"9\") {\r\n digitsArray[i] = \"0\";\r\n } else {\r\n digitsArray[i] = (parseInt(digitsArray[i], 10) + 1).toString();\r\n carry = false;\r\n }\r\n } else {\r\n if (parseInt(digitsArray[i], 10) < 5) {\r\n carry = false;\r\n }\r\n\r\n digitsArray[i] = \"0\";\r\n }\r\n\r\n i += 1;\r\n }\r\n\r\n if (carry) {\r\n digitsArray.push(\"1\");\r\n }\r\n\r\n return digitsArray.reverse().join(\"\");\r\n }\r\n\r\n // cachedNumberFormat\r\n // Returns an `Intl.NumberFormat` instance for the given locale and configuration.\r\n // On first use of a particular configuration, the instance is cached for fast\r\n // repeat access.\r\n function cachedNumberFormat(locale, options) {\r\n // Create a sorted, stringified version of `options`\r\n // for use as part of the cache key\r\n var optionsString = map(\r\n keys(options).sort(),\r\n function(key) {\r\n return key + ':' + options[key];\r\n }\r\n ).join(',');\r\n\r\n // Set our cache key\r\n var cacheKey = locale + '+' + optionsString;\r\n\r\n // If we don't have this configuration cached, configure and cache it\r\n if (!cachedNumberFormat.cache[cacheKey]) {\r\n cachedNumberFormat.cache[cacheKey] = Intl.NumberFormat(locale, options);\r\n }\r\n\r\n // Return the cached version of this configuration\r\n return cachedNumberFormat.cache[cacheKey];\r\n }\r\n cachedNumberFormat.cache = {};\r\n\r\n // formatNumber\r\n // Formats any number greater than or equal to zero using these options:\r\n // - userLocale\r\n // - useToLocaleString\r\n // - useGrouping\r\n // - grouping\r\n // - maximumSignificantDigits\r\n // - minimumIntegerDigits\r\n // - fractionDigits\r\n // - groupingSeparator\r\n // - decimalSeparator\r\n //\r\n // `useToLocaleString` will use `Intl.NumberFormat` or `toLocaleString` for formatting.\r\n // `userLocale` option is passed through to the formatting function.\r\n // `fractionDigits` is passed through to `maximumFractionDigits` and `minimumFractionDigits`\r\n // Using `maximumSignificantDigits` will override `minimumIntegerDigits` and `fractionDigits`.\r\n function formatNumber(number, options, userLocale) {\r\n var useToLocaleString = options.useToLocaleString;\r\n var useGrouping = options.useGrouping;\r\n var grouping = useGrouping && options.grouping.slice();\r\n var maximumSignificantDigits = options.maximumSignificantDigits;\r\n var minimumIntegerDigits = options.minimumIntegerDigits || 1;\r\n var fractionDigits = options.fractionDigits || 0;\r\n var groupingSeparator = options.groupingSeparator;\r\n var decimalSeparator = options.decimalSeparator;\r\n\r\n if (useToLocaleString && userLocale) {\r\n var localeStringOptions = {\r\n minimumIntegerDigits: minimumIntegerDigits,\r\n useGrouping: useGrouping\r\n };\r\n\r\n if (fractionDigits) {\r\n localeStringOptions.maximumFractionDigits = fractionDigits;\r\n localeStringOptions.minimumFractionDigits = fractionDigits;\r\n }\r\n\r\n // toLocaleString output is \"0.0\" instead of \"0\" for HTC browsers\r\n // when maximumSignificantDigits is set. See #96.\r\n if (maximumSignificantDigits && number > 0) {\r\n localeStringOptions.maximumSignificantDigits = maximumSignificantDigits;\r\n }\r\n\r\n if (intlNumberFormatWorks) {\r\n if (!intlNumberFormatRoundingWorks) {\r\n var roundingOptions = extend({}, options);\r\n roundingOptions.useGrouping = false;\r\n roundingOptions.decimalSeparator = \".\";\r\n number = parseFloat(formatNumber(number, roundingOptions), 10);\r\n }\r\n\r\n return cachedNumberFormat(userLocale, localeStringOptions).format(number);\r\n } else {\r\n if (!toLocaleStringRoundingWorks) {\r\n var roundingOptions = extend({}, options);\r\n roundingOptions.useGrouping = false;\r\n roundingOptions.decimalSeparator = \".\";\r\n number = parseFloat(formatNumber(number, roundingOptions), 10);\r\n }\r\n\r\n return number.toLocaleString(userLocale, localeStringOptions);\r\n }\r\n }\r\n\r\n var numberString;\r\n\r\n // Add 1 to digit output length for floating point errors workaround. See below.\r\n if (maximumSignificantDigits) {\r\n numberString = number.toPrecision(maximumSignificantDigits + 1);\r\n } else {\r\n numberString = number.toFixed(fractionDigits + 1);\r\n }\r\n\r\n var integerString;\r\n var fractionString;\r\n var exponentString;\r\n\r\n var temp = numberString.split(\"e\");\r\n\r\n exponentString = temp[1] || \"\";\r\n\r\n temp = temp[0].split(\".\");\r\n\r\n fractionString = temp[1] || \"\";\r\n integerString = temp[0] || \"\";\r\n\r\n // Workaround for floating point errors in `toFixed` and `toPrecision`.\r\n // (3.55).toFixed(1); --> \"3.5\"\r\n // (123.55 - 120).toPrecision(2); --> \"3.5\"\r\n // (123.55 - 120); --> 3.549999999999997\r\n // (123.55 - 120).toFixed(2); --> \"3.55\"\r\n // Round by examing the string output of the next digit.\r\n\r\n // *************** Implement String Rounding here ***********************\r\n // Check integerString + fractionString length of toPrecision before rounding.\r\n // Check length of fractionString from toFixed output before rounding.\r\n var integerLength = integerString.length;\r\n var fractionLength = fractionString.length;\r\n var digitCount = integerLength + fractionLength;\r\n var digits = integerString + fractionString;\r\n\r\n if (maximumSignificantDigits && digitCount === (maximumSignificantDigits + 1) || !maximumSignificantDigits && fractionLength === (fractionDigits + 1)) {\r\n // Round digits.\r\n digits = stringRound(digits);\r\n\r\n if (digits.length === digitCount + 1) {\r\n integerLength = integerLength + 1;\r\n }\r\n\r\n // Discard final fractionDigit.\r\n if (fractionLength) {\r\n digits = digits.slice(0, -1);\r\n }\r\n\r\n // Separate integer and fraction.\r\n integerString = digits.slice(0, integerLength);\r\n fractionString = digits.slice(integerLength);\r\n }\r\n\r\n // Trim trailing zeroes from fractionString because toPrecision outputs\r\n // precision, not significant digits.\r\n if (maximumSignificantDigits) {\r\n fractionString = fractionString.replace(/0*$/, \"\");\r\n }\r\n\r\n // Handle exponent.\r\n var exponent = parseInt(exponentString, 10);\r\n\r\n if (exponent > 0) {\r\n if (fractionString.length <= exponent) {\r\n fractionString = fractionString + repeatZero(exponent - fractionString.length);\r\n\r\n integerString = integerString + fractionString;\r\n fractionString = \"\";\r\n } else {\r\n integerString = integerString + fractionString.slice(0, exponent);\r\n fractionString = fractionString.slice(exponent);\r\n }\r\n } else if (exponent < 0) {\r\n fractionString = (repeatZero(Math.abs(exponent) - integerString.length) + integerString + fractionString);\r\n\r\n integerString = \"0\";\r\n }\r\n\r\n if (!maximumSignificantDigits) {\r\n // Trim or pad fraction when not using maximumSignificantDigits.\r\n fractionString = fractionString.slice(0, fractionDigits);\r\n\r\n if (fractionString.length < fractionDigits) {\r\n fractionString = fractionString + repeatZero(fractionDigits - fractionString.length);\r\n }\r\n\r\n // Pad integer when using minimumIntegerDigits\r\n // and not using maximumSignificantDigits.\r\n if (integerString.length < minimumIntegerDigits) {\r\n integerString = repeatZero(minimumIntegerDigits - integerString.length) + integerString;\r\n }\r\n }\r\n\r\n var formattedString = \"\";\r\n\r\n // Handle grouping.\r\n if (useGrouping) {\r\n temp = integerString;\r\n var group;\r\n\r\n while (temp.length) {\r\n if (grouping.length) {\r\n group = grouping.shift();\r\n }\r\n\r\n if (formattedString) {\r\n formattedString = groupingSeparator + formattedString;\r\n }\r\n\r\n formattedString = temp.slice(-group) + formattedString;\r\n\r\n temp = temp.slice(0, -group);\r\n }\r\n } else {\r\n formattedString = integerString;\r\n }\r\n\r\n // Add decimalSeparator and fraction.\r\n if (fractionString) {\r\n formattedString = formattedString + decimalSeparator + fractionString;\r\n }\r\n\r\n return formattedString;\r\n }\r\n\r\n // durationLabelCompare\r\n function durationLabelCompare(a, b) {\r\n if (a.label.length > b.label.length) {\r\n return -1;\r\n }\r\n\r\n if (a.label.length < b.label.length) {\r\n return 1;\r\n }\r\n\r\n // a must be equal to b\r\n return 0;\r\n }\r\n\r\n // durationGetLabels\r\n function durationGetLabels(token, localeData) {\r\n var labels = [];\r\n\r\n each(keys(localeData), function (localeDataKey) {\r\n if (localeDataKey.slice(0, 15) !== \"_durationLabels\") {\r\n return;\r\n }\r\n\r\n var labelType = localeDataKey.slice(15).toLowerCase();\r\n\r\n each(keys(localeData[localeDataKey]), function (labelKey) {\r\n if (labelKey.slice(0, 1) === token) {\r\n labels.push({\r\n type: labelType,\r\n key: labelKey,\r\n label: localeData[localeDataKey][labelKey]\r\n });\r\n }\r\n });\r\n });\r\n\r\n return labels;\r\n }\r\n\r\n // durationPluralKey\r\n function durationPluralKey(token, integerValue, decimalValue) {\r\n // Singular for a value of `1`, but not for `1.0`.\r\n if (integerValue === 1 && decimalValue === null) {\r\n return token;\r\n }\r\n\r\n return token + token;\r\n }\r\n\r\n var engLocale = {\r\n durationLabelsStandard: {\r\n S: 'millisecond',\r\n SS: 'milliseconds',\r\n s: 'second',\r\n ss: 'seconds',\r\n m: 'minute',\r\n mm: 'minutes',\r\n h: 'hour',\r\n hh: 'hours',\r\n d: 'day',\r\n dd: 'days',\r\n w: 'week',\r\n ww: 'weeks',\r\n M: 'month',\r\n MM: 'months',\r\n y: 'year',\r\n yy: 'years'\r\n },\r\n durationLabelsShort: {\r\n S: 'msec',\r\n SS: 'msecs',\r\n s: 'sec',\r\n ss: 'secs',\r\n m: 'min',\r\n mm: 'mins',\r\n h: 'hr',\r\n hh: 'hrs',\r\n d: 'dy',\r\n dd: 'dys',\r\n w: 'wk',\r\n ww: 'wks',\r\n M: 'mo',\r\n MM: 'mos',\r\n y: 'yr',\r\n yy: 'yrs'\r\n },\r\n durationTimeTemplates: {\r\n HMS: 'h:mm:ss',\r\n HM: 'h:mm',\r\n MS: 'm:ss'\r\n },\r\n durationLabelTypes: [\r\n { type: \"standard\", string: \"__\" },\r\n { type: \"short\", string: \"_\" }\r\n ],\r\n durationPluralKey: durationPluralKey\r\n };\r\n\r\n // isArray\r\n function isArray(array) {\r\n return Object.prototype.toString.call(array) === \"[object Array]\";\r\n }\r\n\r\n // isObject\r\n function isObject(obj) {\r\n return Object.prototype.toString.call(obj) === \"[object Object]\";\r\n }\r\n\r\n // findLast\r\n function findLast(array, callback) {\r\n var index = array.length;\r\n\r\n while (index -= 1) {\r\n if (callback(array[index])) { return array[index]; }\r\n }\r\n }\r\n\r\n // find\r\n function find(array, callback) {\r\n var index = 0;\r\n\r\n var max = array && array.length || 0;\r\n\r\n var match;\r\n\r\n if (typeof callback !== \"function\") {\r\n match = callback;\r\n callback = function (item) {\r\n return item === match;\r\n };\r\n }\r\n\r\n while (index < max) {\r\n if (callback(array[index])) { return array[index]; }\r\n index += 1;\r\n }\r\n }\r\n\r\n // each\r\n function each(array, callback) {\r\n var index = 0,\r\n max = array.length;\r\n\r\n if (!array || !max) { return; }\r\n\r\n while (index < max) {\r\n if (callback(array[index], index) === false) { return; }\r\n index += 1;\r\n }\r\n }\r\n\r\n // map\r\n function map(array, callback) {\r\n var index = 0,\r\n max = array.length,\r\n ret = [];\r\n\r\n if (!array || !max) { return ret; }\r\n\r\n while (index < max) {\r\n ret[index] = callback(array[index], index);\r\n index += 1;\r\n }\r\n\r\n return ret;\r\n }\r\n\r\n // pluck\r\n function pluck(array, prop) {\r\n return map(array, function (item) {\r\n return item[prop];\r\n });\r\n }\r\n\r\n // compact\r\n function compact(array) {\r\n var ret = [];\r\n\r\n each(array, function (item) {\r\n if (item) { ret.push(item); }\r\n });\r\n\r\n return ret;\r\n }\r\n\r\n // unique\r\n function unique(array) {\r\n var ret = [];\r\n\r\n each(array, function (_a) {\r\n if (!find(ret, _a)) { ret.push(_a); }\r\n });\r\n\r\n return ret;\r\n }\r\n\r\n // intersection\r\n function intersection(a, b) {\r\n var ret = [];\r\n\r\n each(a, function (_a) {\r\n each(b, function (_b) {\r\n if (_a === _b) { ret.push(_a); }\r\n });\r\n });\r\n\r\n return unique(ret);\r\n }\r\n\r\n // rest\r\n function rest(array, callback) {\r\n var ret = [];\r\n\r\n each(array, function (item, index) {\r\n if (!callback(item)) {\r\n ret = array.slice(index);\r\n return false;\r\n }\r\n });\r\n\r\n return ret;\r\n }\r\n\r\n // initial\r\n function initial(array, callback) {\r\n var reversed = array.slice().reverse();\r\n\r\n return rest(reversed, callback).reverse();\r\n }\r\n\r\n // extend\r\n function extend(a, b) {\r\n for (var key in b) {\r\n if (b.hasOwnProperty(key)) { a[key] = b[key]; }\r\n }\r\n\r\n return a;\r\n }\r\n\r\n // keys\r\n function keys(a) {\r\n var ret = [];\r\n\r\n for (var key in a) {\r\n if (a.hasOwnProperty(key)) { ret.push(key); }\r\n }\r\n\r\n return ret;\r\n }\r\n\r\n // any\r\n function any(array, callback) {\r\n var index = 0,\r\n max = array.length;\r\n\r\n if (!array || !max) { return false; }\r\n\r\n while (index < max) {\r\n if (callback(array[index], index) === true) { return true; }\r\n index += 1;\r\n }\r\n\r\n return false;\r\n }\r\n\r\n // flatten\r\n function flatten(array) {\r\n var ret = [];\r\n\r\n each(array, function(child) {\r\n ret = ret.concat(child);\r\n });\r\n\r\n return ret;\r\n }\r\n\r\n function toLocaleStringSupportsLocales() {\r\n var number = 0;\r\n try {\r\n number.toLocaleString('i');\r\n } catch (e) {\r\n return e.name === 'RangeError';\r\n }\r\n return false;\r\n }\r\n\r\n function featureTestFormatterRounding(formatter) {\r\n return formatter(3.55, \"en\", {\r\n useGrouping: false,\r\n minimumIntegerDigits: 1,\r\n minimumFractionDigits: 1,\r\n maximumFractionDigits: 1\r\n }) === \"3.6\";\r\n }\r\n\r\n function featureTestFormatter(formatter) {\r\n var passed = true;\r\n\r\n // Test minimumIntegerDigits.\r\n passed = passed && formatter(1, \"en\", { minimumIntegerDigits: 1 }) === \"1\";\r\n passed = passed && formatter(1, \"en\", { minimumIntegerDigits: 2 }) === \"01\";\r\n passed = passed && formatter(1, \"en\", { minimumIntegerDigits: 3 }) === \"001\";\r\n if (!passed) { return false; }\r\n\r\n // Test maximumFractionDigits and minimumFractionDigits.\r\n passed = passed && formatter(99.99, \"en\", { maximumFractionDigits: 0, minimumFractionDigits: 0 }) === \"100\";\r\n passed = passed && formatter(99.99, \"en\", { maximumFractionDigits: 1, minimumFractionDigits: 1 }) === \"100.0\";\r\n passed = passed && formatter(99.99, \"en\", { maximumFractionDigits: 2, minimumFractionDigits: 2 }) === \"99.99\";\r\n passed = passed && formatter(99.99, \"en\", { maximumFractionDigits: 3, minimumFractionDigits: 3 }) === \"99.990\";\r\n if (!passed) { return false; }\r\n\r\n // Test maximumSignificantDigits.\r\n passed = passed && formatter(99.99, \"en\", { maximumSignificantDigits: 1 }) === \"100\";\r\n passed = passed && formatter(99.99, \"en\", { maximumSignificantDigits: 2 }) === \"100\";\r\n passed = passed && formatter(99.99, \"en\", { maximumSignificantDigits: 3 }) === \"100\";\r\n passed = passed && formatter(99.99, \"en\", { maximumSignificantDigits: 4 }) === \"99.99\";\r\n passed = passed && formatter(99.99, \"en\", { maximumSignificantDigits: 5 }) === \"99.99\";\r\n if (!passed) { return false; }\r\n\r\n // Test grouping.\r\n passed = passed && formatter(1000, \"en\", { useGrouping: true }) === \"1,000\";\r\n passed = passed && formatter(1000, \"en\", { useGrouping: false }) === \"1000\";\r\n if (!passed) { return false; }\r\n\r\n return true;\r\n }\r\n\r\n // durationsFormat(durations [, template] [, precision] [, settings])\r\n function durationsFormat() {\r\n var args = [].slice.call(arguments);\r\n var settings = {};\r\n var durations;\r\n\r\n // Parse arguments.\r\n each(args, function (arg, index) {\r\n if (!index) {\r\n if (!isArray(arg)) {\r\n throw \"Expected array as the first argument to durationsFormat.\";\r\n }\r\n\r\n durations = arg;\r\n }\r\n\r\n if (typeof arg === \"string\" || typeof arg === \"function\") {\r\n settings.template = arg;\r\n return;\r\n }\r\n\r\n if (typeof arg === \"number\") {\r\n settings.precision = arg;\r\n return;\r\n }\r\n\r\n if (isObject(arg)) {\r\n extend(settings, arg);\r\n }\r\n });\r\n\r\n if (!durations || !durations.length) {\r\n return [];\r\n }\r\n\r\n settings.returnMomentTypes = true;\r\n\r\n var formattedDurations = map(durations, function (dur) {\r\n return dur.format(settings);\r\n });\r\n\r\n // Merge token types from all durations.\r\n var outputTypes = intersection(types, unique(pluck(flatten(formattedDurations), \"type\")));\r\n\r\n var largest = settings.largest;\r\n\r\n if (largest) {\r\n outputTypes = outputTypes.slice(0, largest);\r\n }\r\n\r\n settings.returnMomentTypes = false;\r\n settings.outputTypes = outputTypes;\r\n\r\n return map(durations, function (dur) {\r\n return dur.format(settings);\r\n });\r\n }\r\n\r\n // durationFormat([template] [, precision] [, settings])\r\n function durationFormat() {\r\n\r\n var args = [].slice.call(arguments);\r\n var settings = extend({}, this.format.defaults);\r\n\r\n // Keep a shadow copy of this moment for calculating remainders.\r\n // Perform all calculations on positive duration value, handle negative\r\n // sign at the very end.\r\n var asMilliseconds = this.asMilliseconds();\r\n var asMonths = this.asMonths();\r\n\r\n // Treat invalid durations as having a value of 0 milliseconds.\r\n if (typeof this.isValid === \"function\" && this.isValid() === false) {\r\n asMilliseconds = 0;\r\n asMonths = 0;\r\n }\r\n\r\n var isNegative = asMilliseconds < 0;\r\n\r\n // Two shadow copies are needed because of the way moment.js handles\r\n // duration arithmetic for years/months and for weeks/days/hours/minutes/seconds.\r\n var remainder = moment.duration(Math.abs(asMilliseconds), \"milliseconds\");\r\n var remainderMonths = moment.duration(Math.abs(asMonths), \"months\");\r\n\r\n // Parse arguments.\r\n each(args, function (arg) {\r\n if (typeof arg === \"string\" || typeof arg === \"function\") {\r\n settings.template = arg;\r\n return;\r\n }\r\n\r\n if (typeof arg === \"number\") {\r\n settings.precision = arg;\r\n return;\r\n }\r\n\r\n if (isObject(arg)) {\r\n extend(settings, arg);\r\n }\r\n });\r\n\r\n var momentTokens = {\r\n years: \"y\",\r\n months: \"M\",\r\n weeks: \"w\",\r\n days: \"d\",\r\n hours: \"h\",\r\n minutes: \"m\",\r\n seconds: \"s\",\r\n milliseconds: \"S\"\r\n };\r\n\r\n var tokenDefs = {\r\n escape: /\\[(.+?)\\]/,\r\n years: /\\*?[Yy]+/,\r\n months: /\\*?M+/,\r\n weeks: /\\*?[Ww]+/,\r\n days: /\\*?[Dd]+/,\r\n hours: /\\*?[Hh]+/,\r\n minutes: /\\*?m+/,\r\n seconds: /\\*?s+/,\r\n milliseconds: /\\*?S+/,\r\n general: /.+?/\r\n };\r\n\r\n // Types array is available in the template function.\r\n settings.types = types;\r\n\r\n var typeMap = function (token) {\r\n return find(types, function (type) {\r\n return tokenDefs[type].test(token);\r\n });\r\n };\r\n\r\n var tokenizer = new RegExp(map(types, function (type) {\r\n return tokenDefs[type].source;\r\n }).join(\"|\"), \"g\");\r\n\r\n // Current duration object is available in the template function.\r\n settings.duration = this;\r\n\r\n // Eval template function and cache template string.\r\n var template = typeof settings.template === \"function\" ? settings.template.apply(settings) : settings.template;\r\n\r\n // outputTypes and returnMomentTypes are settings to support durationsFormat().\r\n\r\n // outputTypes is an array of moment token types that determines\r\n // the tokens returned in formatted output. This option overrides\r\n // trim, largest, stopTrim, etc.\r\n var outputTypes = settings.outputTypes;\r\n\r\n // returnMomentTypes is a boolean that sets durationFormat to return\r\n // the processed momentTypes instead of formatted output.\r\n var returnMomentTypes = settings.returnMomentTypes;\r\n\r\n var largest = settings.largest;\r\n\r\n // Setup stopTrim array of token types.\r\n var stopTrim = [];\r\n\r\n if (!outputTypes) {\r\n if (isArray(settings.stopTrim)) {\r\n settings.stopTrim = settings.stopTrim.join(\"\");\r\n }\r\n\r\n // Parse stopTrim string to create token types array.\r\n if (settings.stopTrim) {\r\n each(settings.stopTrim.match(tokenizer), function (token) {\r\n var type = typeMap(token);\r\n\r\n if (type === \"escape\" || type === \"general\") {\r\n return;\r\n }\r\n\r\n stopTrim.push(type);\r\n });\r\n }\r\n }\r\n\r\n // Cache moment's locale data.\r\n var localeData = moment.localeData();\r\n\r\n if (!localeData) {\r\n localeData = {};\r\n }\r\n\r\n // Fall back to this plugin's `eng` extension.\r\n each(keys(engLocale), function (key) {\r\n if (typeof engLocale[key] === \"function\") {\r\n if (!localeData[key]) {\r\n localeData[key] = engLocale[key];\r\n }\r\n\r\n return;\r\n }\r\n\r\n if (!localeData[\"_\" + key]) {\r\n localeData[\"_\" + key] = engLocale[key];\r\n }\r\n });\r\n\r\n // Replace Duration Time Template strings.\r\n // For locale `eng`: `_HMS_`, `_HM_`, and `_MS_`.\r\n each(keys(localeData._durationTimeTemplates), function (item) {\r\n template = template.replace(\"_\" + item + \"_\", localeData._durationTimeTemplates[item]);\r\n });\r\n\r\n // Determine user's locale.\r\n var userLocale = settings.userLocale || moment.locale();\r\n\r\n var useLeftUnits = settings.useLeftUnits;\r\n var usePlural = settings.usePlural;\r\n var precision = settings.precision;\r\n var forceLength = settings.forceLength;\r\n var useGrouping = settings.useGrouping;\r\n var trunc = settings.trunc;\r\n\r\n // Use significant digits only when precision is greater than 0.\r\n var useSignificantDigits = settings.useSignificantDigits && precision > 0;\r\n var significantDigits = useSignificantDigits ? settings.precision : 0;\r\n var significantDigitsCache = significantDigits;\r\n\r\n var minValue = settings.minValue;\r\n var isMinValue = false;\r\n\r\n var maxValue = settings.maxValue;\r\n var isMaxValue = false;\r\n\r\n // formatNumber fallback options.\r\n var useToLocaleString = settings.useToLocaleString;\r\n var groupingSeparator = settings.groupingSeparator;\r\n var decimalSeparator = settings.decimalSeparator;\r\n var grouping = settings.grouping;\r\n\r\n useToLocaleString = useToLocaleString && (toLocaleStringWorks || intlNumberFormatWorks);\r\n\r\n // Trim options.\r\n var trim = settings.trim;\r\n\r\n if (isArray(trim)) {\r\n trim = trim.join(\" \");\r\n }\r\n\r\n if (trim === null && (largest || maxValue || useSignificantDigits)) {\r\n trim = \"all\";\r\n }\r\n\r\n if (trim === null || trim === true || trim === \"left\" || trim === \"right\") {\r\n trim = \"large\";\r\n }\r\n\r\n if (trim === false) {\r\n trim = \"\";\r\n }\r\n\r\n var trimIncludes = function (item) {\r\n return item.test(trim);\r\n };\r\n\r\n var rLarge = /large/;\r\n var rSmall = /small/;\r\n var rBoth = /both/;\r\n var rMid = /mid/;\r\n var rAll = /^all|[^sm]all/;\r\n var rFinal = /final/;\r\n\r\n var trimLarge = largest > 0 || any([rLarge, rBoth, rAll], trimIncludes);\r\n var trimSmall = any([rSmall, rBoth, rAll], trimIncludes);\r\n var trimMid = any([rMid, rAll], trimIncludes);\r\n var trimFinal = any([rFinal, rAll], trimIncludes);\r\n\r\n // Parse format string to create raw tokens array.\r\n var rawTokens = map(template.match(tokenizer), function (token, index) {\r\n var type = typeMap(token);\r\n\r\n if (token.slice(0, 1) === \"*\") {\r\n token = token.slice(1);\r\n\r\n if (type !== \"escape\" && type !== \"general\") {\r\n stopTrim.push(type);\r\n }\r\n }\r\n\r\n return {\r\n index: index,\r\n length: token.length,\r\n text: \"\",\r\n\r\n // Replace escaped tokens with the non-escaped token text.\r\n token: (type === \"escape\" ? token.replace(tokenDefs.escape, \"$1\") : token),\r\n\r\n // Ignore type on non-moment tokens.\r\n type: ((type === \"escape\" || type === \"general\") ? null : type)\r\n };\r\n });\r\n\r\n // Associate text tokens with moment tokens.\r\n var currentToken = {\r\n index: 0,\r\n length: 0,\r\n token: \"\",\r\n text: \"\",\r\n type: null\r\n };\r\n\r\n var tokens = [];\r\n\r\n if (useLeftUnits) {\r\n rawTokens.reverse();\r\n }\r\n\r\n each(rawTokens, function (token) {\r\n if (token.type) {\r\n if (currentToken.type || currentToken.text) {\r\n tokens.push(currentToken);\r\n }\r\n\r\n currentToken = token;\r\n\r\n return;\r\n }\r\n\r\n if (useLeftUnits) {\r\n currentToken.text = token.token + currentToken.text;\r\n } else {\r\n currentToken.text += token.token;\r\n }\r\n });\r\n\r\n if (currentToken.type || currentToken.text) {\r\n tokens.push(currentToken);\r\n }\r\n\r\n if (useLeftUnits) {\r\n tokens.reverse();\r\n }\r\n\r\n // Find unique moment token types in the template in order of\r\n // descending magnitude.\r\n var momentTypes = intersection(types, unique(compact(pluck(tokens, \"type\"))));\r\n\r\n // Exit early if there are no moment token types.\r\n if (!momentTypes.length) {\r\n return pluck(tokens, \"text\").join(\"\");\r\n }\r\n\r\n // Calculate values for each moment type in the template.\r\n // For processing the settings, values are associated with moment types.\r\n // Values will be assigned to tokens at the last step in order to\r\n // assume nothing about frequency or order of tokens in the template.\r\n momentTypes = map(momentTypes, function (momentType, index) {\r\n // Is this the least-magnitude moment token found?\r\n var isSmallest = ((index + 1) === momentTypes.length);\r\n\r\n // Is this the greatest-magnitude moment token found?\r\n var isLargest = (!index);\r\n\r\n // Get the raw value in the current units.\r\n var rawValue;\r\n\r\n if (momentType === \"years\" || momentType === \"months\") {\r\n rawValue = remainderMonths.as(momentType);\r\n } else {\r\n rawValue = remainder.as(momentType);\r\n }\r\n\r\n var wholeValue = Math.floor(rawValue);\r\n var decimalValue = rawValue - wholeValue;\r\n\r\n var token = find(tokens, function (token) {\r\n return momentType === token.type;\r\n });\r\n\r\n if (isLargest && maxValue && rawValue > maxValue) {\r\n isMaxValue = true;\r\n }\r\n\r\n if (isSmallest && minValue && Math.abs(settings.duration.as(momentType)) < minValue) {\r\n isMinValue = true;\r\n }\r\n\r\n // Note the length of the largest-magnitude moment token:\r\n // if it is greater than one and forceLength is not set,\r\n // then default forceLength to `true`.\r\n //\r\n // Rationale is this: If the template is \"h:mm:ss\" and the\r\n // moment value is 5 minutes, the user-friendly output is\r\n // \"5:00\", not \"05:00\". We shouldn't pad the `minutes` token\r\n // even though it has length of two if the template is \"h:mm:ss\";\r\n //\r\n // If the minutes output should always include the leading zero\r\n // even when the hour is trimmed then set `{ forceLength: true }`\r\n // to output \"05:00\". If the template is \"hh:mm:ss\", the user\r\n // clearly wanted everything padded so we should output \"05:00\";\r\n //\r\n // If the user wants the full padded output, they can use\r\n // template \"hh:mm:ss\" and set `{ trim: false }` to output\r\n // \"00:05:00\".\r\n if (isLargest && forceLength === null && token.length > 1) {\r\n forceLength = true;\r\n }\r\n\r\n // Update remainder.\r\n remainder.subtract(wholeValue, momentType);\r\n remainderMonths.subtract(wholeValue, momentType);\r\n\r\n return {\r\n rawValue: rawValue,\r\n wholeValue: wholeValue,\r\n // Decimal value is only retained for the least-magnitude\r\n // moment type in the format template.\r\n decimalValue: isSmallest ? decimalValue : 0,\r\n isSmallest: isSmallest,\r\n isLargest: isLargest,\r\n type: momentType,\r\n // Tokens can appear multiple times in a template string,\r\n // but all instances must share the same length.\r\n tokenLength: token.length\r\n };\r\n });\r\n\r\n var truncMethod = trunc ? Math.floor : Math.round;\r\n var truncate = function (value, places) {\r\n var factor = Math.pow(10, places);\r\n return truncMethod(value * factor) / factor;\r\n };\r\n\r\n var foundFirst = false;\r\n var bubbled = false;\r\n\r\n var formatValue = function (momentType, index) {\r\n var formatOptions = {\r\n useGrouping: useGrouping,\r\n groupingSeparator: groupingSeparator,\r\n decimalSeparator: decimalSeparator,\r\n grouping: grouping,\r\n useToLocaleString: useToLocaleString\r\n };\r\n\r\n if (useSignificantDigits) {\r\n if (significantDigits <= 0) {\r\n momentType.rawValue = 0;\r\n momentType.wholeValue = 0;\r\n momentType.decimalValue = 0;\r\n } else {\r\n formatOptions.maximumSignificantDigits = significantDigits;\r\n momentType.significantDigits = significantDigits;\r\n }\r\n }\r\n\r\n if (isMaxValue && !bubbled) {\r\n if (momentType.isLargest) {\r\n momentType.wholeValue = maxValue;\r\n momentType.decimalValue = 0;\r\n } else {\r\n momentType.wholeValue = 0;\r\n momentType.decimalValue = 0;\r\n }\r\n }\r\n\r\n if (isMinValue && !bubbled) {\r\n if (momentType.isSmallest) {\r\n momentType.wholeValue = minValue;\r\n momentType.decimalValue = 0;\r\n } else {\r\n momentType.wholeValue = 0;\r\n momentType.decimalValue = 0;\r\n }\r\n }\r\n\r\n if (momentType.isSmallest || momentType.significantDigits && momentType.significantDigits - momentType.wholeValue.toString().length <= 0) {\r\n // Apply precision to least significant token value.\r\n if (precision < 0) {\r\n momentType.value = truncate(momentType.wholeValue, precision);\r\n } else if (precision === 0) {\r\n momentType.value = truncMethod(momentType.wholeValue + momentType.decimalValue);\r\n } else { // precision > 0\r\n if (useSignificantDigits) {\r\n if (trunc) {\r\n momentType.value = truncate(momentType.rawValue, significantDigits - momentType.wholeValue.toString().length);\r\n } else {\r\n momentType.value = momentType.rawValue;\r\n }\r\n\r\n if (momentType.wholeValue) {\r\n significantDigits -= momentType.wholeValue.toString().length;\r\n }\r\n } else {\r\n formatOptions.fractionDigits = precision;\r\n\r\n if (trunc) {\r\n momentType.value = momentType.wholeValue + truncate(momentType.decimalValue, precision);\r\n } else {\r\n momentType.value = momentType.wholeValue + momentType.decimalValue;\r\n }\r\n }\r\n }\r\n } else {\r\n if (useSignificantDigits && momentType.wholeValue) {\r\n // Outer Math.round required here to handle floating point errors.\r\n momentType.value = Math.round(truncate(momentType.wholeValue, momentType.significantDigits - momentType.wholeValue.toString().length));\r\n\r\n significantDigits -= momentType.wholeValue.toString().length;\r\n } else {\r\n momentType.value = momentType.wholeValue;\r\n }\r\n }\r\n\r\n if (momentType.tokenLength > 1 && (forceLength || foundFirst)) {\r\n formatOptions.minimumIntegerDigits = momentType.tokenLength;\r\n\r\n if (bubbled && formatOptions.maximumSignificantDigits < momentType.tokenLength) {\r\n delete formatOptions.maximumSignificantDigits;\r\n }\r\n }\r\n\r\n if (!foundFirst && (momentType.value > 0 || trim === \"\" /* trim: false */ || find(stopTrim, momentType.type) || find(outputTypes, momentType.type))) {\r\n foundFirst = true;\r\n }\r\n\r\n momentType.formattedValue = formatNumber(momentType.value, formatOptions, userLocale);\r\n\r\n formatOptions.useGrouping = false;\r\n formatOptions.decimalSeparator = \".\";\r\n momentType.formattedValueEn = formatNumber(momentType.value, formatOptions, \"en\");\r\n\r\n if (momentType.tokenLength === 2 && momentType.type === \"milliseconds\") {\r\n momentType.formattedValueMS = formatNumber(momentType.value, {\r\n minimumIntegerDigits: 3,\r\n useGrouping: false\r\n }, \"en\").slice(0, 2);\r\n }\r\n\r\n return momentType;\r\n };\r\n\r\n // Calculate formatted values.\r\n momentTypes = map(momentTypes, formatValue);\r\n momentTypes = compact(momentTypes);\r\n\r\n // Bubble rounded values.\r\n if (momentTypes.length > 1) {\r\n var findType = function (type) {\r\n return find(momentTypes, function (momentType) {\r\n return momentType.type === type;\r\n });\r\n };\r\n\r\n var bubbleTypes = function (bubble) {\r\n var bubbleMomentType = findType(bubble.type);\r\n\r\n if (!bubbleMomentType) {\r\n return;\r\n }\r\n\r\n each(bubble.targets, function (target) {\r\n var targetMomentType = findType(target.type);\r\n\r\n if (!targetMomentType) {\r\n return;\r\n }\r\n\r\n if (parseInt(bubbleMomentType.formattedValueEn, 10) === target.value) {\r\n bubbleMomentType.rawValue = 0;\r\n bubbleMomentType.wholeValue = 0;\r\n bubbleMomentType.decimalValue = 0;\r\n targetMomentType.rawValue += 1;\r\n targetMomentType.wholeValue += 1;\r\n targetMomentType.decimalValue = 0;\r\n targetMomentType.formattedValueEn = targetMomentType.wholeValue.toString();\r\n bubbled = true;\r\n }\r\n });\r\n };\r\n\r\n each(bubbles, bubbleTypes);\r\n }\r\n\r\n // Recalculate formatted values.\r\n if (bubbled) {\r\n foundFirst = false;\r\n significantDigits = significantDigitsCache;\r\n momentTypes = map(momentTypes, formatValue);\r\n momentTypes = compact(momentTypes);\r\n }\r\n\r\n if (outputTypes && !(isMaxValue && !settings.trim)) {\r\n momentTypes = map(momentTypes, function (momentType) {\r\n if (find(outputTypes, function (outputType) {\r\n return momentType.type === outputType;\r\n })) {\r\n return momentType;\r\n }\r\n\r\n return null;\r\n });\r\n\r\n momentTypes = compact(momentTypes);\r\n } else {\r\n // Trim Large.\r\n if (trimLarge) {\r\n momentTypes = rest(momentTypes, function (momentType) {\r\n // Stop trimming on:\r\n // - the smallest moment type\r\n // - a type marked for stopTrim\r\n // - a type that has a whole value\r\n return !momentType.isSmallest && !momentType.wholeValue && !find(stopTrim, momentType.type);\r\n });\r\n }\r\n\r\n // Largest.\r\n if (largest && momentTypes.length) {\r\n momentTypes = momentTypes.slice(0, largest);\r\n }\r\n\r\n // Trim Small.\r\n if (trimSmall && momentTypes.length > 1) {\r\n momentTypes = initial(momentTypes, function (momentType) {\r\n // Stop trimming on:\r\n // - a type marked for stopTrim\r\n // - a type that has a whole value\r\n // - the largest momentType\r\n return !momentType.wholeValue && !find(stopTrim, momentType.type) && !momentType.isLargest;\r\n });\r\n }\r\n\r\n // Trim Mid.\r\n if (trimMid) {\r\n momentTypes = map(momentTypes, function (momentType, index) {\r\n if (index > 0 && index < momentTypes.length - 1 && !momentType.wholeValue) {\r\n return null;\r\n }\r\n\r\n return momentType;\r\n });\r\n\r\n momentTypes = compact(momentTypes);\r\n }\r\n\r\n // Trim Final.\r\n if (trimFinal && momentTypes.length === 1 && !momentTypes[0].wholeValue && !(!trunc && momentTypes[0].isSmallest && momentTypes[0].rawValue < minValue)) {\r\n momentTypes = [];\r\n }\r\n }\r\n\r\n if (returnMomentTypes) {\r\n return momentTypes;\r\n }\r\n\r\n // Localize and pluralize unit labels.\r\n each(tokens, function (token) {\r\n var key = momentTokens[token.type];\r\n\r\n var momentType = find(momentTypes, function (momentType) {\r\n return momentType.type === token.type;\r\n });\r\n\r\n if (!key || !momentType) {\r\n return;\r\n }\r\n\r\n var values = momentType.formattedValueEn.split(\".\");\r\n\r\n values[0] = parseInt(values[0], 10);\r\n\r\n if (values[1]) {\r\n values[1] = parseFloat(\"0.\" + values[1], 10);\r\n } else {\r\n values[1] = null;\r\n }\r\n\r\n var pluralKey = localeData.durationPluralKey(key, values[0], values[1]);\r\n\r\n var labels = durationGetLabels(key, localeData);\r\n\r\n var autoLocalized = false;\r\n\r\n var pluralizedLabels = {};\r\n\r\n // Auto-Localized unit labels.\r\n each(localeData._durationLabelTypes, function (labelType) {\r\n var label = find(labels, function (label) {\r\n return label.type === labelType.type && label.key === pluralKey;\r\n });\r\n\r\n if (label) {\r\n pluralizedLabels[label.type] = label.label;\r\n\r\n if (stringIncludes(token.text, labelType.string)) {\r\n token.text = token.text.replace(labelType.string, label.label);\r\n autoLocalized = true;\r\n }\r\n }\r\n });\r\n\r\n // Auto-pluralized unit labels.\r\n if (usePlural && !autoLocalized) {\r\n labels.sort(durationLabelCompare);\r\n\r\n each(labels, function (label) {\r\n if (pluralizedLabels[label.type] === label.label) {\r\n if (stringIncludes(token.text, label.label)) {\r\n // Stop checking this token if its label is already\r\n // correctly pluralized.\r\n return false;\r\n }\r\n\r\n // Skip this label if it is correct, but not present in\r\n // the token's text.\r\n return;\r\n }\r\n\r\n if (stringIncludes(token.text, label.label)) {\r\n // Replece this token's label and stop checking.\r\n token.text = token.text.replace(label.label, pluralizedLabels[label.type]);\r\n return false;\r\n }\r\n });\r\n }\r\n });\r\n\r\n // Build ouptut.\r\n tokens = map(tokens, function (token) {\r\n if (!token.type) {\r\n return token.text;\r\n }\r\n\r\n var momentType = find(momentTypes, function (momentType) {\r\n return momentType.type === token.type;\r\n });\r\n\r\n if (!momentType) {\r\n return \"\";\r\n }\r\n\r\n var out = \"\";\r\n\r\n if (useLeftUnits) {\r\n out += token.text;\r\n }\r\n\r\n if (isNegative && isMaxValue || !isNegative && isMinValue) {\r\n out += \"< \";\r\n isMaxValue = false;\r\n isMinValue = false;\r\n }\r\n\r\n if (isNegative && isMinValue || !isNegative && isMaxValue) {\r\n out += \"> \";\r\n isMaxValue = false;\r\n isMinValue = false;\r\n }\r\n\r\n if (isNegative && (momentType.value > 0 || trim === \"\" || find(stopTrim, momentType.type) || find(outputTypes, momentType.type))) {\r\n out += \"-\";\r\n isNegative = false;\r\n }\r\n\r\n if (token.type === \"milliseconds\" && momentType.formattedValueMS) {\r\n out += momentType.formattedValueMS;\r\n } else {\r\n out += momentType.formattedValue;\r\n }\r\n\r\n if (!useLeftUnits) {\r\n out += token.text;\r\n }\r\n\r\n return out;\r\n });\r\n\r\n // Trim leading and trailing comma, space, colon, and dot.\r\n return tokens.join(\"\").replace(/(,| |:|\\.)*$/, \"\").replace(/^(,| |:|\\.)*/, \"\");\r\n }\r\n\r\n // defaultFormatTemplate\r\n function defaultFormatTemplate() {\r\n var dur = this.duration;\r\n\r\n var findType = function findType(type) {\r\n return dur._data[type];\r\n };\r\n\r\n var firstType = find(this.types, findType);\r\n\r\n var lastType = findLast(this.types, findType);\r\n\r\n // Default template strings for each duration dimension type.\r\n switch (firstType) {\r\n case \"milliseconds\":\r\n return \"S __\";\r\n case \"seconds\": // Fallthrough.\r\n case \"minutes\":\r\n return \"*_MS_\";\r\n case \"hours\":\r\n return \"_HMS_\";\r\n case \"days\": // Possible Fallthrough.\r\n if (firstType === lastType) {\r\n return \"d __\";\r\n }\r\n case \"weeks\":\r\n if (firstType === lastType) {\r\n return \"w __\";\r\n }\r\n\r\n if (this.trim === null) {\r\n this.trim = \"both\";\r\n }\r\n\r\n return \"w __, d __, h __\";\r\n case \"months\": // Possible Fallthrough.\r\n if (firstType === lastType) {\r\n return \"M __\";\r\n }\r\n case \"years\":\r\n if (firstType === lastType) {\r\n return \"y __\";\r\n }\r\n\r\n if (this.trim === null) {\r\n this.trim = \"both\";\r\n }\r\n\r\n return \"y __, M __, d __\";\r\n default:\r\n if (this.trim === null) {\r\n this.trim = \"both\";\r\n }\r\n\r\n return \"y __, d __, h __, m __, s __\";\r\n }\r\n }\r\n\r\n // init\r\n function init(context) {\r\n if (!context) {\r\n throw \"Moment Duration Format init cannot find moment instance.\";\r\n }\r\n\r\n context.duration.format = durationsFormat;\r\n context.duration.fn.format = durationFormat;\r\n\r\n context.duration.fn.format.defaults = {\r\n // Many options are defaulted to `null` to distinguish between\r\n // 'not set' and 'set to `false`'\r\n\r\n // trim\r\n // Can be a string, a delimited list of strings, an array of strings,\r\n // or a boolean.\r\n // \"large\" - will trim largest-magnitude zero-value tokens until\r\n // finding a token with a value, a token identified as 'stopTrim', or\r\n // the final token of the format string.\r\n // \"small\" - will trim smallest-magnitude zero-value tokens until\r\n // finding a token with a value, a token identified as 'stopTrim', or\r\n // the final token of the format string.\r\n // \"both\" - will execute \"large\" trim then \"small\" trim.\r\n // \"mid\" - will trim any zero-value tokens that are not the first or\r\n // last tokens. Usually used in conjunction with \"large\" or \"both\".\r\n // e.g. \"large mid\" or \"both mid\".\r\n // \"final\" - will trim the final token if it is zero-value. Use this\r\n // option with \"large\" or \"both\" to output an empty string when\r\n // formatting a zero-value duration. e.g. \"large final\" or \"both final\".\r\n // \"all\" - Will trim all zero-value tokens. Shorthand for \"both mid final\".\r\n // \"left\" - maps to \"large\" to support plugin's version 1 API.\r\n // \"right\" - maps to \"large\" to support plugin's version 1 API.\r\n // `false` - template tokens are not trimmed.\r\n // `true` - treated as \"large\".\r\n // `null` - treated as \"large\".\r\n trim: null,\r\n\r\n // stopTrim\r\n // A moment token string, a delimited set of moment token strings,\r\n // or an array of moment token strings. Trimming will stop when a token\r\n // listed in this option is reached. A \"*\" character in the format\r\n // template string will also mark a moment token as stopTrim.\r\n // e.g. \"d [days] *h:mm:ss\" will always stop trimming at the 'hours' token.\r\n stopTrim: null,\r\n\r\n // largest\r\n // Set to a positive integer to output only the \"n\" largest-magnitude\r\n // moment tokens that have a value. All lesser-magnitude moment tokens\r\n // will be ignored. This option takes effect even if `trim` is set\r\n // to `false`.\r\n largest: null,\r\n\r\n // maxValue\r\n // Use `maxValue` to render generalized output for large duration values,\r\n // e.g. `\"> 60 days\"`. `maxValue` must be a positive integer and is\r\n /// applied to the greatest-magnitude moment token in the format template.\r\n maxValue: null,\r\n\r\n // minValue\r\n // Use `minValue` to render generalized output for small duration values,\r\n // e.g. `\"< 5 minutes\"`. `minValue` must be a positive integer and is\r\n // applied to the least-magnitude moment token in the format template.\r\n minValue: null,\r\n\r\n // precision\r\n // If a positive integer, number of decimal fraction digits to render.\r\n // If a negative integer, number of integer place digits to truncate to 0.\r\n // If `useSignificantDigits` is set to `true` and `precision` is a positive\r\n // integer, sets the maximum number of significant digits used in the\r\n // formatted output.\r\n precision: 0,\r\n\r\n // trunc\r\n // Default behavior rounds final token value. Set to `true` to\r\n // truncate final token value, which was the default behavior in\r\n // version 1 of this plugin.\r\n trunc: false,\r\n\r\n // forceLength\r\n // Force first moment token with a value to render at full length\r\n // even when template is trimmed and first moment token has length of 1.\r\n forceLength: null,\r\n\r\n // userLocale\r\n // Formatted numerical output is rendered using `toLocaleString`\r\n // and the locale of the user's environment. Set this option to render\r\n // numerical output using a different locale. Unit names are rendered\r\n // and detected using the locale set in moment.js, which can be different\r\n // from the locale of user's environment.\r\n userLocale: null,\r\n\r\n // usePlural\r\n // Will automatically singularize or pluralize unit names when they\r\n // appear in the text associated with each moment token. Standard and\r\n // short unit labels are singularized and pluralized, based on locale.\r\n // e.g. in english, \"1 second\" or \"1 sec\" would be rendered instead\r\n // of \"1 seconds\" or \"1 secs\". The default pluralization function\r\n // renders a plural label for a value with decimal precision.\r\n // e.g. \"1.0 seconds\" is never rendered as \"1.0 second\".\r\n // Label types and pluralization function are configurable in the\r\n // localeData extensions.\r\n usePlural: true,\r\n\r\n // useLeftUnits\r\n // The text to the right of each moment token in a format string\r\n // is treated as that token's units for the purposes of trimming,\r\n // singularizing, and auto-localizing.\r\n // e.g. \"h [hours], m [minutes], s [seconds]\".\r\n // To properly singularize or localize a format string such as\r\n // \"[hours] h, [minutes] m, [seconds] s\", where the units appear\r\n // to the left of each moment token, set useLeftUnits to `true`.\r\n // This plugin is not tested in the context of rtl text.\r\n useLeftUnits: false,\r\n\r\n // useGrouping\r\n // Enables locale-based digit grouping in the formatted output. See https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Number/toLocaleString\r\n useGrouping: true,\r\n\r\n // useSignificantDigits\r\n // Treat the `precision` option as the maximum significant digits\r\n // to be rendered. Precision must be a positive integer. Significant\r\n // digits extend across unit types,\r\n // e.g. \"6 hours 37.5 minutes\" represents 4 significant digits.\r\n // Enabling this option causes token length to be ignored. See https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Number/toLocaleString\r\n useSignificantDigits: false,\r\n\r\n // template\r\n // The template string used to format the duration. May be a function\r\n // or a string. Template functions are executed with the `this` binding\r\n // of the settings object so that template strings may be dynamically\r\n // generated based on the duration object (accessible via `this.duration`)\r\n // or any of the other settings. Leading and trailing space, comma,\r\n // period, and colon characters are trimmed from the resulting string.\r\n template: defaultFormatTemplate,\r\n\r\n // useToLocaleString\r\n // Set this option to `false` to ignore the `toLocaleString` feature\r\n // test and force the use of the `formatNumber` fallback function\r\n // included in this plugin.\r\n useToLocaleString: true,\r\n\r\n // formatNumber fallback options.\r\n // When `toLocaleString` is detected and passes the feature test, the\r\n // following options will have no effect: `toLocaleString` will be used\r\n // for formatting and the grouping separator, decimal separator, and\r\n // integer digit grouping will be determined by the user locale.\r\n\r\n // groupingSeparator\r\n // The integer digit grouping separator used when using the fallback\r\n // formatNumber function.\r\n groupingSeparator: \",\",\r\n\r\n // decimalSeparator\r\n // The decimal separator used when using the fallback formatNumber\r\n // function.\r\n decimalSeparator: \".\",\r\n\r\n // grouping\r\n // The integer digit grouping used when using the fallback formatNumber\r\n // function. Must be an array. The default value of `[3]` gives the\r\n // standard 3-digit thousand/million/billion digit groupings for the\r\n // \"en\" locale. Setting this option to `[3, 2]` would generate the\r\n // thousand/lakh/crore digit groupings used in the \"en-IN\" locale.\r\n grouping: [3]\r\n };\r\n\r\n context.updateLocale('en', engLocale);\r\n }\r\n\r\n // Run feature tests for `Number#toLocaleString`.\r\n var toLocaleStringFormatter = function(number, locale, options) {\r\n return number.toLocaleString(locale, options);\r\n };\r\n\r\n toLocaleStringWorks = toLocaleStringSupportsLocales() && featureTestFormatter(toLocaleStringFormatter);\r\n toLocaleStringRoundingWorks = toLocaleStringWorks && featureTestFormatterRounding(toLocaleStringFormatter);\r\n\r\n // Run feature tests for `Intl.NumberFormat#format`.\r\n var intlNumberFormatFormatter = function(number, locale, options) {\r\n if (typeof window !== 'undefined' && window && window.Intl && window.Intl.NumberFormat) {\r\n return window.Intl.NumberFormat(locale, options).format(number);\r\n }\r\n };\r\n\r\n intlNumberFormatWorks = featureTestFormatter(intlNumberFormatFormatter);\r\n intlNumberFormatRoundingWorks = intlNumberFormatWorks && featureTestFormatterRounding(intlNumberFormatFormatter);\r\n\r\n // Initialize duration format on the global moment instance.\r\n init(moment);\r\n\r\n // Return the init function so that duration format can be\r\n // initialized on other moment instances.\r\n return init;\r\n});\r\n\n/*\r\n * Slim v4.6.4 - Image Cropping Made Easy\r\n * Copyright (c) 2017 Rik Schennink - http://slimimagecropper.com\r\n */\r\nwindow.Slim = (function () {\r\n\r\n\t// custom event polyfill for IE10\r\n\t(function () {\r\n\t\tif (typeof window.CustomEvent === 'function') return false;\r\n\r\n\t\tfunction CustomEvent(event, params) {\r\n\t\t\tparams = params || { bubbles: false, cancelable: false, detail: undefined };\r\n\t\t\tvar evt = document.createEvent('CustomEvent');\r\n\t\t\tevt.initCustomEvent(event, params.bubbles, params.cancelable, params.detail);\r\n\t\t\treturn evt;\r\n\t\t}\r\n\r\n\t\tCustomEvent.prototype = window.Event.prototype;\r\n\r\n\t\twindow.CustomEvent = CustomEvent;\r\n\t})();\r\n\t/*\r\n\t* JavaScript Load Image\r\n\t* https://github.com/blueimp/JavaScript-Load-Image\r\n\t*\r\n\t* Copyright 2011, Sebastian Tschan\r\n\t* https://blueimp.net\r\n\t*\r\n\t* Licensed under the MIT license:\r\n\t* http://www.opensource.org/licenses/MIT\r\n\t*/\r\n\r\n\t/*global define, module, window, document, URL, webkitURL, FileReader */\r\n\r\n\t// Loads an image for a given File object.\r\n\t// Invokes the callback with an img or optional canvas\r\n\t// element (if supported by the browser) as parameter:\r\n\tvar loadImage = function (file, callback, options) {\r\n\t\tvar img = document.createElement('img')\r\n\t\tvar url\r\n\t\tvar oUrl\r\n\t\timg.onerror = callback\r\n\t\timg.onload = function () {\r\n\t\t\tif (oUrl && !(options && options.noRevoke)) {\r\n\t\t\t\tloadImage.revokeObjectURL(oUrl)\r\n\t\t\t}\r\n\t\t\tif (callback) {\r\n\t\t\t\tcallback(loadImage.scale(img, options))\r\n\t\t\t}\r\n\t\t}\r\n\t\tif (loadImage.isInstanceOf('Blob', file) ||\r\n\t\t\t// Files are also Blob instances, but some browsers\r\n\t\t\t// (Firefox 3.6) support the File API but not Blobs:\r\n\t\t\tloadImage.isInstanceOf('File', file)) {\r\n\t\t\turl = oUrl = loadImage.createObjectURL(file)\r\n\t\t\t// Store the file type for resize processing:\r\n\t\t\timg._type = file.type\r\n\t\t} else if (typeof file === 'string') {\r\n\t\t\turl = file\r\n\t\t\tif (options && options.crossOrigin) {\r\n\t\t\t\timg.crossOrigin = options.crossOrigin\r\n\t\t\t}\r\n\t\t} else {\r\n\t\t\treturn false\r\n\t\t}\r\n\t\tif (url) {\r\n\t\t\timg.src = url\r\n\t\t\treturn img\r\n\t\t}\r\n\t\treturn loadImage.readFile(file, function (e) {\r\n\t\t\tvar target = e.target\r\n\t\t\tif (target && target.result) {\r\n\t\t\t\timg.src = target.result\r\n\t\t\t} else {\r\n\t\t\t\tif (callback) {\r\n\t\t\t\t\tcallback(e)\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t})\r\n\t}\r\n\t// The check for URL.revokeObjectURL fixes an issue with Opera 12,\r\n\t// which provides URL.createObjectURL but doesn't properly implement it:\r\n\tvar urlAPI = (window.createObjectURL && window) ||\r\n\t\t(window.URL && URL.revokeObjectURL && URL) ||\r\n\t\t(window.webkitURL && webkitURL)\r\n\r\n\tloadImage.isInstanceOf = function (type, obj) {\r\n\t\t// Cross-frame instanceof check\r\n\t\treturn Object.prototype.toString.call(obj) === '[object ' + type + ']'\r\n\t}\r\n\r\n\t// Transform image coordinates, allows to override e.g.\r\n\t// the canvas orientation based on the orientation option,\r\n\t// gets canvas, options passed as arguments:\r\n\tloadImage.transformCoordinates = function () {\r\n\t\treturn\r\n\t}\r\n\r\n\t// Returns transformed options, allows to override e.g.\r\n\t// maxWidth, maxHeight and crop options based on the aspectRatio.\r\n\t// gets img, options passed as arguments:\r\n\tloadImage.getTransformedOptions = function (img, options) {\r\n\t\tvar aspectRatio = options.aspectRatio\r\n\t\tvar newOptions\r\n\t\tvar i\r\n\t\tvar width\r\n\t\tvar height\r\n\t\tif (!aspectRatio) {\r\n\t\t\treturn options\r\n\t\t}\r\n\t\tnewOptions = {}\r\n\t\tfor (i in options) {\r\n\t\t\tif (options.hasOwnProperty(i)) {\r\n\t\t\t\tnewOptions[i] = options[i]\r\n\t\t\t}\r\n\t\t}\r\n\t\tnewOptions.crop = true\r\n\t\twidth = img.naturalWidth || img.width\r\n\t\theight = img.naturalHeight || img.height\r\n\t\tif (width / height > aspectRatio) {\r\n\t\t\tnewOptions.maxWidth = height * aspectRatio\r\n\t\t\tnewOptions.maxHeight = height\r\n\t\t} else {\r\n\t\t\tnewOptions.maxWidth = width\r\n\t\t\tnewOptions.maxHeight = width / aspectRatio\r\n\t\t}\r\n\t\treturn newOptions\r\n\t}\r\n\r\n\t// Canvas render method, allows to implement a different rendering algorithm:\r\n\tloadImage.renderImageToCanvas = function (\r\n\t\tcanvas,\r\n\t\timg,\r\n\t\tsourceX,\r\n\t\tsourceY,\r\n\t\tsourceWidth,\r\n\t\tsourceHeight,\r\n\t\tdestX,\r\n\t\tdestY,\r\n\t\tdestWidth,\r\n\t\tdestHeight\r\n\t) {\r\n\t\tcanvas.getContext('2d').drawImage(\r\n\t\t\timg,\r\n\t\t\tsourceX,\r\n\t\t\tsourceY,\r\n\t\t\tsourceWidth,\r\n\t\t\tsourceHeight,\r\n\t\t\tdestX,\r\n\t\t\tdestY,\r\n\t\t\tdestWidth,\r\n\t\t\tdestHeight\r\n\t\t)\r\n\t\treturn canvas\r\n\t}\r\n\r\n\t// This method is used to determine if the target image\r\n\t// should be a canvas element:\r\n\tloadImage.hasCanvasOption = function (options) {\r\n\t\treturn options.canvas || options.crop || !!options.aspectRatio\r\n\t}\r\n\r\n\t// Scales and/or crops the given image (img or canvas HTML element)\r\n\t// using the given options.\r\n\t// Returns a canvas object if the browser supports canvas\r\n\t// and the hasCanvasOption method returns true or a canvas\r\n\t// object is passed as image, else the scaled image:\r\n\tloadImage.scale = function (img, options) {\r\n\t\toptions = options || {}\r\n\t\tvar canvas = document.createElement('canvas')\r\n\t\tvar useCanvas = img.getContext ||\r\n\t\t\t(loadImage.hasCanvasOption(options) && canvas.getContext)\r\n\t\tvar width = img.naturalWidth || img.width\r\n\t\tvar height = img.naturalHeight || img.height\r\n\t\tvar destWidth = width\r\n\t\tvar destHeight = height\r\n\t\tvar maxWidth\r\n\t\tvar maxHeight\r\n\t\tvar minWidth\r\n\t\tvar minHeight\r\n\t\tvar sourceWidth\r\n\t\tvar sourceHeight\r\n\t\tvar sourceX\r\n\t\tvar sourceY\r\n\t\tvar pixelRatio\r\n\t\tvar downsamplingRatio\r\n\t\tvar tmp\r\n\t\tfunction scaleUp() {\r\n\t\t\tvar scale = Math.max(\r\n\t\t\t\t(minWidth || destWidth) / destWidth,\r\n\t\t\t\t(minHeight || destHeight) / destHeight\r\n\t\t\t)\r\n\t\t\tif (scale > 1) {\r\n\t\t\t\tdestWidth *= scale\r\n\t\t\t\tdestHeight *= scale\r\n\t\t\t}\r\n\t\t}\r\n\t\tfunction scaleDown() {\r\n\t\t\tvar scale = Math.min(\r\n\t\t\t\t(maxWidth || destWidth) / destWidth,\r\n\t\t\t\t(maxHeight || destHeight) / destHeight\r\n\t\t\t)\r\n\t\t\tif (scale < 1) {\r\n\t\t\t\tdestWidth *= scale\r\n\t\t\t\tdestHeight *= scale\r\n\t\t\t}\r\n\t\t}\r\n\t\tif (useCanvas) {\r\n\t\t\toptions = loadImage.getTransformedOptions(img, options)\r\n\t\t\tsourceX = options.left || 0\r\n\t\t\tsourceY = options.top || 0\r\n\t\t\tif (options.sourceWidth) {\r\n\t\t\t\tsourceWidth = options.sourceWidth\r\n\t\t\t\tif (options.right !== undefined && options.left === undefined) {\r\n\t\t\t\t\tsourceX = width - sourceWidth - options.right\r\n\t\t\t\t}\r\n\t\t\t} else {\r\n\t\t\t\tsourceWidth = width - sourceX - (options.right || 0)\r\n\t\t\t}\r\n\t\t\tif (options.sourceHeight) {\r\n\t\t\t\tsourceHeight = options.sourceHeight\r\n\t\t\t\tif (options.bottom !== undefined && options.top === undefined) {\r\n\t\t\t\t\tsourceY = height - sourceHeight - options.bottom\r\n\t\t\t\t}\r\n\t\t\t} else {\r\n\t\t\t\tsourceHeight = height - sourceY - (options.bottom || 0)\r\n\t\t\t}\r\n\t\t\tdestWidth = sourceWidth\r\n\t\t\tdestHeight = sourceHeight\r\n\t\t}\r\n\t\tmaxWidth = options.maxWidth\r\n\t\tmaxHeight = options.maxHeight\r\n\t\tminWidth = options.minWidth\r\n\t\tminHeight = options.minHeight\r\n\t\tif (useCanvas && maxWidth && maxHeight && options.crop) {\r\n\t\t\tdestWidth = maxWidth\r\n\t\t\tdestHeight = maxHeight\r\n\t\t\ttmp = sourceWidth / sourceHeight - maxWidth / maxHeight\r\n\t\t\tif (tmp < 0) {\r\n\t\t\t\tsourceHeight = maxHeight * sourceWidth / maxWidth\r\n\t\t\t\tif (options.top === undefined && options.bottom === undefined) {\r\n\t\t\t\t\tsourceY = (height - sourceHeight) / 2\r\n\t\t\t\t}\r\n\t\t\t} else if (tmp > 0) {\r\n\t\t\t\tsourceWidth = maxWidth * sourceHeight / maxHeight\r\n\t\t\t\tif (options.left === undefined && options.right === undefined) {\r\n\t\t\t\t\tsourceX = (width - sourceWidth) / 2\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t} else {\r\n\t\t\tif (options.contain || options.cover) {\r\n\t\t\t\tminWidth = maxWidth = maxWidth || minWidth\r\n\t\t\t\tminHeight = maxHeight = maxHeight || minHeight\r\n\t\t\t}\r\n\t\t\tif (options.cover) {\r\n\t\t\t\tscaleDown()\r\n\t\t\t\tscaleUp()\r\n\t\t\t} else {\r\n\t\t\t\tscaleUp()\r\n\t\t\t\tscaleDown()\r\n\t\t\t}\r\n\t\t}\r\n\t\tif (useCanvas) {\r\n\t\t\tpixelRatio = options.pixelRatio\r\n\t\t\tif (pixelRatio > 1) {\r\n\t\t\t\tcanvas.style.width = destWidth + 'px'\r\n\t\t\t\tcanvas.style.height = destHeight + 'px'\r\n\t\t\t\tdestWidth *= pixelRatio\r\n\t\t\t\tdestHeight *= pixelRatio\r\n\t\t\t\tcanvas.getContext('2d').scale(pixelRatio, pixelRatio)\r\n\t\t\t}\r\n\t\t\tdownsamplingRatio = options.downsamplingRatio\r\n\t\t\tif (downsamplingRatio > 0 && downsamplingRatio < 1 &&\r\n\t\t\t\tdestWidth < sourceWidth && destHeight < sourceHeight) {\r\n\t\t\t\twhile (sourceWidth * downsamplingRatio > destWidth) {\r\n\t\t\t\t\tcanvas.width = sourceWidth * downsamplingRatio\r\n\t\t\t\t\tcanvas.height = sourceHeight * downsamplingRatio\r\n\t\t\t\t\tloadImage.renderImageToCanvas(\r\n\t\t\t\t\t\tcanvas,\r\n\t\t\t\t\t\timg,\r\n\t\t\t\t\t\tsourceX,\r\n\t\t\t\t\t\tsourceY,\r\n\t\t\t\t\t\tsourceWidth,\r\n\t\t\t\t\t\tsourceHeight,\r\n\t\t\t\t\t\t0,\r\n\t\t\t\t\t\t0,\r\n\t\t\t\t\t\tcanvas.width,\r\n\t\t\t\t\t\tcanvas.height\r\n\t\t\t\t\t)\r\n\t\t\t\t\tsourceWidth = canvas.width\r\n\t\t\t\t\tsourceHeight = canvas.height\r\n\t\t\t\t\timg = document.createElement('canvas')\r\n\t\t\t\t\timg.width = sourceWidth\r\n\t\t\t\t\timg.height = sourceHeight\r\n\t\t\t\t\tloadImage.renderImageToCanvas(\r\n\t\t\t\t\t\timg,\r\n\t\t\t\t\t\tcanvas,\r\n\t\t\t\t\t\t0,\r\n\t\t\t\t\t\t0,\r\n\t\t\t\t\t\tsourceWidth,\r\n\t\t\t\t\t\tsourceHeight,\r\n\t\t\t\t\t\t0,\r\n\t\t\t\t\t\t0,\r\n\t\t\t\t\t\tsourceWidth,\r\n\t\t\t\t\t\tsourceHeight\r\n\t\t\t\t\t)\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\tcanvas.width = destWidth\r\n\t\t\tcanvas.height = destHeight\r\n\t\t\tloadImage.transformCoordinates(\r\n\t\t\t\tcanvas,\r\n\t\t\t\toptions\r\n\t\t\t)\r\n\t\t\treturn loadImage.renderImageToCanvas(\r\n\t\t\t\tcanvas,\r\n\t\t\t\timg,\r\n\t\t\t\tsourceX,\r\n\t\t\t\tsourceY,\r\n\t\t\t\tsourceWidth,\r\n\t\t\t\tsourceHeight,\r\n\t\t\t\t0,\r\n\t\t\t\t0,\r\n\t\t\t\tdestWidth,\r\n\t\t\t\tdestHeight\r\n\t\t\t)\r\n\t\t}\r\n\t\timg.width = destWidth\r\n\t\timg.height = destHeight\r\n\t\treturn img\r\n\t}\r\n\r\n\tloadImage.createObjectURL = function (file) {\r\n\t\treturn urlAPI ? urlAPI.createObjectURL(file) : false\r\n\t}\r\n\r\n\tloadImage.revokeObjectURL = function (url) {\r\n\t\treturn urlAPI ? urlAPI.revokeObjectURL(url) : false\r\n\t}\r\n\r\n\t// Loads a given File object via FileReader interface,\r\n\t// invokes the callback with the event object (load or error).\r\n\t// The result can be read via event.target.result:\r\n\tloadImage.readFile = function (file, callback, method) {\r\n\t\tif (window.FileReader) {\r\n\t\t\tvar fileReader = new FileReader()\r\n\t\t\tfileReader.onload = fileReader.onerror = callback\r\n\t\t\tmethod = method || 'readAsDataURL'\r\n\t\t\tif (fileReader[method]) {\r\n\t\t\t\tfileReader[method](file)\r\n\t\t\t\treturn fileReader\r\n\t\t\t}\r\n\t\t}\r\n\t\treturn false\r\n\t}\r\n\r\n\tvar originalHasCanvasOption = loadImage.hasCanvasOption\r\n\tvar originalTransformCoordinates = loadImage.transformCoordinates\r\n\tvar originalGetTransformedOptions = loadImage.getTransformedOptions\r\n\r\n\t// This method is used to determine if the target image\r\n\t// should be a canvas element:\r\n\tloadImage.hasCanvasOption = function (options) {\r\n\t\treturn !!options.orientation ||\r\n\t\t\toriginalHasCanvasOption.call(loadImage, options)\r\n\t}\r\n\r\n\t// Transform image orientation based on\r\n\t// the given EXIF orientation option:\r\n\tloadImage.transformCoordinates = function (canvas, options) {\r\n\t\toriginalTransformCoordinates.call(loadImage, canvas, options)\r\n\t\tvar ctx = canvas.getContext('2d')\r\n\t\tvar width = canvas.width\r\n\t\tvar height = canvas.height\r\n\t\tvar styleWidth = canvas.style.width\r\n\t\tvar styleHeight = canvas.style.height\r\n\t\tvar orientation = options.orientation\r\n\t\tif (!orientation || orientation > 8) {\r\n\t\t\treturn\r\n\t\t}\r\n\t\tif (orientation > 4) {\r\n\t\t\tcanvas.width = height\r\n\t\t\tcanvas.height = width\r\n\t\t\tcanvas.style.width = styleHeight\r\n\t\t\tcanvas.style.height = styleWidth\r\n\t\t}\r\n\t\tswitch (orientation) {\r\n\t\t\tcase 2:\r\n\t\t\t\t// horizontal flip\r\n\t\t\t\tctx.translate(width, 0)\r\n\t\t\t\tctx.scale(-1, 1)\r\n\t\t\t\tbreak\r\n\t\t\tcase 3:\r\n\t\t\t\t// 180° rotate left\r\n\t\t\t\tctx.translate(width, height)\r\n\t\t\t\tctx.rotate(Math.PI)\r\n\t\t\t\tbreak\r\n\t\t\tcase 4:\r\n\t\t\t\t// vertical flip\r\n\t\t\t\tctx.translate(0, height)\r\n\t\t\t\tctx.scale(1, -1)\r\n\t\t\t\tbreak\r\n\t\t\tcase 5:\r\n\t\t\t\t// vertical flip + 90 rotate right\r\n\t\t\t\tctx.rotate(0.5 * Math.PI)\r\n\t\t\t\tctx.scale(1, -1)\r\n\t\t\t\tbreak\r\n\t\t\tcase 6:\r\n\t\t\t\t// 90° rotate right\r\n\t\t\t\tctx.rotate(0.5 * Math.PI)\r\n\t\t\t\tctx.translate(0, -height)\r\n\t\t\t\tbreak\r\n\t\t\tcase 7:\r\n\t\t\t\t// horizontal flip + 90 rotate right\r\n\t\t\t\tctx.rotate(0.5 * Math.PI)\r\n\t\t\t\tctx.translate(width, -height)\r\n\t\t\t\tctx.scale(-1, 1)\r\n\t\t\t\tbreak\r\n\t\t\tcase 8:\r\n\t\t\t\t// 90° rotate left\r\n\t\t\t\tctx.rotate(-0.5 * Math.PI)\r\n\t\t\t\tctx.translate(-width, 0)\r\n\t\t\t\tbreak\r\n\t\t}\r\n\t}\r\n\r\n\t// Transforms coordinate and dimension options\r\n\t// based on the given orientation option:\r\n\tloadImage.getTransformedOptions = function (img, opts) {\r\n\t\tvar options = originalGetTransformedOptions.call(loadImage, img, opts)\r\n\t\tvar orientation = options.orientation\r\n\t\tvar newOptions\r\n\t\tvar i\r\n\t\tif (!orientation || orientation > 8 || orientation === 1) {\r\n\t\t\treturn options\r\n\t\t}\r\n\t\tnewOptions = {}\r\n\t\tfor (i in options) {\r\n\t\t\tif (options.hasOwnProperty(i)) {\r\n\t\t\t\tnewOptions[i] = options[i]\r\n\t\t\t}\r\n\t\t}\r\n\t\tswitch (options.orientation) {\r\n\t\t\tcase 2:\r\n\t\t\t\t// horizontal flip\r\n\t\t\t\tnewOptions.left = options.right\r\n\t\t\t\tnewOptions.right = options.left\r\n\t\t\t\tbreak\r\n\t\t\tcase 3:\r\n\t\t\t\t// 180° rotate left\r\n\t\t\t\tnewOptions.left = options.right\r\n\t\t\t\tnewOptions.top = options.bottom\r\n\t\t\t\tnewOptions.right = options.left\r\n\t\t\t\tnewOptions.bottom = options.top\r\n\t\t\t\tbreak\r\n\t\t\tcase 4:\r\n\t\t\t\t// vertical flip\r\n\t\t\t\tnewOptions.top = options.bottom\r\n\t\t\t\tnewOptions.bottom = options.top\r\n\t\t\t\tbreak\r\n\t\t\tcase 5:\r\n\t\t\t\t// vertical flip + 90 rotate right\r\n\t\t\t\tnewOptions.left = options.top\r\n\t\t\t\tnewOptions.top = options.left\r\n\t\t\t\tnewOptions.right = options.bottom\r\n\t\t\t\tnewOptions.bottom = options.right\r\n\t\t\t\tbreak\r\n\t\t\tcase 6:\r\n\t\t\t\t// 90° rotate right\r\n\t\t\t\tnewOptions.left = options.top\r\n\t\t\t\tnewOptions.top = options.right\r\n\t\t\t\tnewOptions.right = options.bottom\r\n\t\t\t\tnewOptions.bottom = options.left\r\n\t\t\t\tbreak\r\n\t\t\tcase 7:\r\n\t\t\t\t// horizontal flip + 90 rotate right\r\n\t\t\t\tnewOptions.left = options.bottom\r\n\t\t\t\tnewOptions.top = options.right\r\n\t\t\t\tnewOptions.right = options.top\r\n\t\t\t\tnewOptions.bottom = options.left\r\n\t\t\t\tbreak\r\n\t\t\tcase 8:\r\n\t\t\t\t// 90° rotate left\r\n\t\t\t\tnewOptions.left = options.bottom\r\n\t\t\t\tnewOptions.top = options.left\r\n\t\t\t\tnewOptions.right = options.top\r\n\t\t\t\tnewOptions.bottom = options.right\r\n\t\t\t\tbreak\r\n\t\t}\r\n\t\tif (options.orientation > 4) {\r\n\t\t\tnewOptions.maxWidth = options.maxHeight\r\n\t\t\tnewOptions.maxHeight = options.maxWidth\r\n\t\t\tnewOptions.minWidth = options.minHeight\r\n\t\t\tnewOptions.minHeight = options.minWidth\r\n\t\t\tnewOptions.sourceWidth = options.sourceHeight\r\n\t\t\tnewOptions.sourceHeight = options.sourceWidth\r\n\t\t}\r\n\t\treturn newOptions\r\n\t}\r\n\r\n\tvar hasblobSlice = window.Blob && (Blob.prototype.slice ||\r\n\t\tBlob.prototype.webkitSlice || Blob.prototype.mozSlice)\r\n\r\n\tloadImage.blobSlice = hasblobSlice && function () {\r\n\t\tvar slice = this.slice || this.webkitSlice || this.mozSlice\r\n\t\treturn slice.apply(this, arguments)\r\n\t}\r\n\r\n\tloadImage.metaDataParsers = {\r\n\t\tjpeg: {\r\n\t\t\t0xffe1: [] // APP1 marker\r\n\t\t}\r\n\t}\r\n\r\n\t// Parses image meta data and calls the callback with an object argument\r\n\t// with the following properties:\r\n\t// * imageHead: The complete image head as ArrayBuffer (Uint8Array for IE10)\r\n\t// The options arguments accepts an object and supports the following properties:\r\n\t// * maxMetaDataSize: Defines the maximum number of bytes to parse.\r\n\t// * disableImageHead: Disables creating the imageHead property.\r\n\tloadImage.parseMetaData = function (file, callback, options) {\r\n\t\toptions = options || {}\r\n\t\tvar that = this\r\n\t\t// 256 KiB should contain all EXIF/ICC/IPTC segments:\r\n\t\tvar maxMetaDataSize = options.maxMetaDataSize || 262144\r\n\t\tvar data = {}\r\n\t\tvar noMetaData = !(window.DataView && file && file.size >= 12 &&\r\n\t\t\tfile.type === 'image/jpeg' && loadImage.blobSlice)\r\n\t\tif (noMetaData || !loadImage.readFile(\r\n\t\t\tloadImage.blobSlice.call(file, 0, maxMetaDataSize),\r\n\t\t\tfunction (e) {\r\n\t\t\t\tif (e.target.error) {\r\n\t\t\t\t\t// FileReader error\r\n\t\t\t\t\t//console.log(e.target.error)\r\n\t\t\t\t\tcallback(data)\r\n\t\t\t\t\treturn\r\n\t\t\t\t}\r\n\t\t\t\t// Note on endianness:\r\n\t\t\t\t// Since the marker and length bytes in JPEG files are always\r\n\t\t\t\t// stored in big endian order, we can leave the endian parameter\r\n\t\t\t\t// of the DataView methods undefined, defaulting to big endian.\r\n\t\t\t\tvar buffer = e.target.result\r\n\t\t\t\tvar dataView = new DataView(buffer)\r\n\t\t\t\tvar offset = 2\r\n\t\t\t\tvar maxOffset = dataView.byteLength - 4\r\n\t\t\t\tvar headLength = offset\r\n\t\t\t\tvar markerBytes\r\n\t\t\t\tvar markerLength\r\n\t\t\t\tvar parsers\r\n\t\t\t\tvar i\r\n\t\t\t\t// Check for the JPEG marker (0xffd8):\r\n\t\t\t\tif (dataView.getUint16(0) === 0xffd8) {\r\n\t\t\t\t\twhile (offset < maxOffset) {\r\n\t\t\t\t\t\tmarkerBytes = dataView.getUint16(offset)\r\n\t\t\t\t\t\t// Search for APPn (0xffeN) and COM (0xfffe) markers,\r\n\t\t\t\t\t\t// which contain application-specific meta-data like\r\n\t\t\t\t\t\t// Exif, ICC and IPTC data and text comments:\r\n\t\t\t\t\t\tif ((markerBytes >= 0xffe0 && markerBytes <= 0xffef) ||\r\n\t\t\t\t\t\t\tmarkerBytes === 0xfffe) {\r\n\t\t\t\t\t\t\t// The marker bytes (2) are always followed by\r\n\t\t\t\t\t\t\t// the length bytes (2), indicating the length of the\r\n\t\t\t\t\t\t\t// marker segment, which includes the length bytes,\r\n\t\t\t\t\t\t\t// but not the marker bytes, so we add 2:\r\n\t\t\t\t\t\t\tmarkerLength = dataView.getUint16(offset + 2) + 2\r\n\t\t\t\t\t\t\tif (offset + markerLength > dataView.byteLength) {\r\n\t\t\t\t\t\t\t\t//console.log('Invalid meta data: Invalid segment size.')\r\n\t\t\t\t\t\t\t\tbreak\r\n\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\tparsers = loadImage.metaDataParsers.jpeg[markerBytes]\r\n\t\t\t\t\t\t\tif (parsers) {\r\n\t\t\t\t\t\t\t\tfor (i = 0; i < parsers.length; i += 1) {\r\n\t\t\t\t\t\t\t\t\tparsers[i].call(\r\n\t\t\t\t\t\t\t\t\t\tthat,\r\n\t\t\t\t\t\t\t\t\t\tdataView,\r\n\t\t\t\t\t\t\t\t\t\toffset,\r\n\t\t\t\t\t\t\t\t\t\tmarkerLength,\r\n\t\t\t\t\t\t\t\t\t\tdata,\r\n\t\t\t\t\t\t\t\t\t\toptions\r\n\t\t\t\t\t\t\t\t\t)\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\toffset += markerLength\r\n\t\t\t\t\t\t\theadLength = offset\r\n\t\t\t\t\t\t} else {\r\n\t\t\t\t\t\t\t// Not an APPn or COM marker, probably safe to\r\n\t\t\t\t\t\t\t// assume that this is the end of the meta data\r\n\t\t\t\t\t\t\tbreak\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t}\r\n\t\t\t\t\t// Meta length must be longer than JPEG marker (2)\r\n\t\t\t\t\t// plus APPn marker (2), followed by length bytes (2):\r\n\t\t\t\t\tif (!options.disableImageHead && headLength > 6) {\r\n\t\t\t\t\t\tif (buffer.slice) {\r\n\t\t\t\t\t\t\tdata.imageHead = buffer.slice(0, headLength)\r\n\t\t\t\t\t\t} else {\r\n\t\t\t\t\t\t\t// Workaround for IE10, which does not yet\r\n\t\t\t\t\t\t\t// support ArrayBuffer.slice:\r\n\t\t\t\t\t\t\tdata.imageHead = new Uint8Array(buffer)\r\n\t\t\t\t\t\t\t\t.subarray(0, headLength)\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t}\r\n\t\t\t\t} else {\r\n\t\t\t\t\t//console.log('Invalid JPEG file: Missing JPEG marker.')\r\n\t\t\t\t}\r\n\t\t\t\tcallback(data)\r\n\t\t\t},\r\n\t\t\t'readAsArrayBuffer'\r\n\t\t)) {\r\n\t\t\tcallback(data)\r\n\t\t}\r\n\t}\r\n\r\n\tloadImage.ExifMap = function () {\r\n\t\treturn this\r\n\t}\r\n\r\n\tloadImage.ExifMap.prototype.map = {\r\n\t\t'Orientation': 0x0112\r\n\t}\r\n\r\n\tloadImage.ExifMap.prototype.get = function (id) {\r\n\t\treturn this[id] || this[this.map[id]]\r\n\t}\r\n\r\n\tloadImage.getExifThumbnail = function (dataView, offset, length) {\r\n\t\tvar hexData,\r\n\t\t\ti,\r\n\t\t\tb\r\n\t\tif (!length || offset + length > dataView.byteLength) {\r\n\t\t\t//console.log('Invalid Exif data: Invalid thumbnail data.')\r\n\t\t\treturn\r\n\t\t}\r\n\t\thexData = []\r\n\t\tfor (i = 0; i < length; i += 1) {\r\n\t\t\tb = dataView.getUint8(offset + i)\r\n\t\t\thexData.push((b < 16 ? '0' : '') + b.toString(16))\r\n\t\t}\r\n\t\treturn 'data:image/jpeg,%' + hexData.join('%')\r\n\t}\r\n\r\n\tloadImage.exifTagTypes = {\r\n\t\t// byte, 8-bit unsigned int:\r\n\t\t1: {\r\n\t\t\tgetValue: function (dataView, dataOffset) {\r\n\t\t\t\treturn dataView.getUint8(dataOffset)\r\n\t\t\t},\r\n\t\t\tsize: 1\r\n\t\t},\r\n\t\t// ascii, 8-bit byte:\r\n\t\t2: {\r\n\t\t\tgetValue: function (dataView, dataOffset) {\r\n\t\t\t\treturn String.fromCharCode(dataView.getUint8(dataOffset))\r\n\t\t\t},\r\n\t\t\tsize: 1,\r\n\t\t\tascii: true\r\n\t\t},\r\n\t\t// short, 16 bit int:\r\n\t\t3: {\r\n\t\t\tgetValue: function (dataView, dataOffset, littleEndian) {\r\n\t\t\t\treturn dataView.getUint16(dataOffset, littleEndian)\r\n\t\t\t},\r\n\t\t\tsize: 2\r\n\t\t},\r\n\t\t// long, 32 bit int:\r\n\t\t4: {\r\n\t\t\tgetValue: function (dataView, dataOffset, littleEndian) {\r\n\t\t\t\treturn dataView.getUint32(dataOffset, littleEndian)\r\n\t\t\t},\r\n\t\t\tsize: 4\r\n\t\t},\r\n\t\t// rational = two long values, first is numerator, second is denominator:\r\n\t\t5: {\r\n\t\t\tgetValue: function (dataView, dataOffset, littleEndian) {\r\n\t\t\t\treturn dataView.getUint32(dataOffset, littleEndian) /\r\n\t\t\t\t\tdataView.getUint32(dataOffset + 4, littleEndian)\r\n\t\t\t},\r\n\t\t\tsize: 8\r\n\t\t},\r\n\t\t// slong, 32 bit signed int:\r\n\t\t9: {\r\n\t\t\tgetValue: function (dataView, dataOffset, littleEndian) {\r\n\t\t\t\treturn dataView.getInt32(dataOffset, littleEndian)\r\n\t\t\t},\r\n\t\t\tsize: 4\r\n\t\t},\r\n\t\t// srational, two slongs, first is numerator, second is denominator:\r\n\t\t10: {\r\n\t\t\tgetValue: function (dataView, dataOffset, littleEndian) {\r\n\t\t\t\treturn dataView.getInt32(dataOffset, littleEndian) /\r\n\t\t\t\t\tdataView.getInt32(dataOffset + 4, littleEndian)\r\n\t\t\t},\r\n\t\t\tsize: 8\r\n\t\t}\r\n\t}\r\n\t// undefined, 8-bit byte, value depending on field:\r\n\tloadImage.exifTagTypes[7] = loadImage.exifTagTypes[1]\r\n\r\n\tloadImage.getExifValue = function (dataView, tiffOffset, offset, type, length, littleEndian) {\r\n\t\tvar tagType = loadImage.exifTagTypes[type]\r\n\t\tvar tagSize\r\n\t\tvar dataOffset\r\n\t\tvar values\r\n\t\tvar i\r\n\t\tvar str\r\n\t\tvar c\r\n\t\tif (!tagType) {\r\n\t\t\t//console.log('Invalid Exif data: Invalid tag type.')\r\n\t\t\treturn\r\n\t\t}\r\n\t\ttagSize = tagType.size * length\r\n\t\t// Determine if the value is contained in the dataOffset bytes,\r\n\t\t// or if the value at the dataOffset is a pointer to the actual data:\r\n\t\tdataOffset = tagSize > 4\r\n\t\t\t? tiffOffset + dataView.getUint32(offset + 8, littleEndian)\r\n\t\t\t: (offset + 8)\r\n\t\tif (dataOffset + tagSize > dataView.byteLength) {\r\n\t\t\t//console.log('Invalid Exif data: Invalid data offset.')\r\n\t\t\treturn\r\n\t\t}\r\n\t\tif (length === 1) {\r\n\t\t\treturn tagType.getValue(dataView, dataOffset, littleEndian)\r\n\t\t}\r\n\t\tvalues = []\r\n\t\tfor (i = 0; i < length; i += 1) {\r\n\t\t\tvalues[i] = tagType.getValue(dataView, dataOffset + i * tagType.size, littleEndian)\r\n\t\t}\r\n\t\tif (tagType.ascii) {\r\n\t\t\tstr = ''\r\n\t\t\t// Concatenate the chars:\r\n\t\t\tfor (i = 0; i < values.length; i += 1) {\r\n\t\t\t\tc = values[i]\r\n\t\t\t\t// Ignore the terminating NULL byte(s):\r\n\t\t\t\tif (c === '\\u0000') {\r\n\t\t\t\t\tbreak\r\n\t\t\t\t}\r\n\t\t\t\tstr += c\r\n\t\t\t}\r\n\t\t\treturn str\r\n\t\t}\r\n\t\treturn values\r\n\t}\r\n\r\n\tloadImage.parseExifTag = function (dataView, tiffOffset, offset, littleEndian, data) {\r\n\t\tvar tag = dataView.getUint16(offset, littleEndian)\r\n\t\tdata.exif[tag] = loadImage.getExifValue(\r\n\t\t\tdataView,\r\n\t\t\ttiffOffset,\r\n\t\t\toffset,\r\n\t\t\tdataView.getUint16(offset + 2, littleEndian), // tag type\r\n\t\t\tdataView.getUint32(offset + 4, littleEndian), // tag length\r\n\t\t\tlittleEndian\r\n\t\t)\r\n\t}\r\n\r\n\tloadImage.parseExifTags = function (dataView, tiffOffset, dirOffset, littleEndian, data) {\r\n\t\tvar tagsNumber,\r\n\t\t\tdirEndOffset,\r\n\t\t\ti\r\n\t\tif (dirOffset + 6 > dataView.byteLength) {\r\n\t\t\t//console.log('Invalid Exif data: Invalid directory offset.')\r\n\t\t\treturn\r\n\t\t}\r\n\t\ttagsNumber = dataView.getUint16(dirOffset, littleEndian)\r\n\t\tdirEndOffset = dirOffset + 2 + 12 * tagsNumber\r\n\t\tif (dirEndOffset + 4 > dataView.byteLength) {\r\n\t\t\t//console.log('Invalid Exif data: Invalid directory size.')\r\n\t\t\treturn\r\n\t\t}\r\n\t\tfor (i = 0; i < tagsNumber; i += 1) {\r\n\t\t\tthis.parseExifTag(\r\n\t\t\t\tdataView,\r\n\t\t\t\ttiffOffset,\r\n\t\t\t\tdirOffset + 2 + 12 * i, // tag offset\r\n\t\t\t\tlittleEndian,\r\n\t\t\t\tdata\r\n\t\t\t)\r\n\t\t}\r\n\t\t// Return the offset to the next directory:\r\n\t\treturn dataView.getUint32(dirEndOffset, littleEndian)\r\n\t}\r\n\r\n\tloadImage.parseExifData = function (dataView, offset, length, data, options) {\r\n\t\tif (options.disableExif) {\r\n\t\t\treturn\r\n\t\t}\r\n\t\tvar tiffOffset = offset + 10\r\n\t\tvar littleEndian\r\n\t\tvar dirOffset\r\n\t\tvar thumbnailData\r\n\t\t// Check for the ASCII code for \"Exif\" (0x45786966):\r\n\t\tif (dataView.getUint32(offset + 4) !== 0x45786966) {\r\n\t\t\t// No Exif data, might be XMP data instead\r\n\t\t\treturn\r\n\t\t}\r\n\t\tif (tiffOffset + 8 > dataView.byteLength) {\r\n\t\t\t//console.log('Invalid Exif data: Invalid segment size.')\r\n\t\t\treturn\r\n\t\t}\r\n\t\t// Check for the two null bytes:\r\n\t\tif (dataView.getUint16(offset + 8) !== 0x0000) {\r\n\t\t\t//console.log('Invalid Exif data: Missing byte alignment offset.')\r\n\t\t\treturn\r\n\t\t}\r\n\t\t// Check the byte alignment:\r\n\t\tswitch (dataView.getUint16(tiffOffset)) {\r\n\t\t\tcase 0x4949:\r\n\t\t\t\tlittleEndian = true\r\n\t\t\t\tbreak\r\n\t\t\tcase 0x4D4D:\r\n\t\t\t\tlittleEndian = false\r\n\t\t\t\tbreak\r\n\t\t\tdefault:\r\n\t\t\t\t//console.log('Invalid Exif data: Invalid byte alignment marker.')\r\n\t\t\t\treturn\r\n\t\t}\r\n\t\t// Check for the TIFF tag marker (0x002A):\r\n\t\tif (dataView.getUint16(tiffOffset + 2, littleEndian) !== 0x002A) {\r\n\t\t\t//console.log('Invalid Exif data: Missing TIFF marker.')\r\n\t\t\treturn\r\n\t\t}\r\n\t\t// Retrieve the directory offset bytes, usually 0x00000008 or 8 decimal:\r\n\t\tdirOffset = dataView.getUint32(tiffOffset + 4, littleEndian)\r\n\t\t// Create the exif object to store the tags:\r\n\t\tdata.exif = new loadImage.ExifMap()\r\n\t\t// Parse the tags of the main image directory and retrieve the\r\n\t\t// offset to the next directory, usually the thumbnail directory:\r\n\t\tdirOffset = loadImage.parseExifTags(\r\n\t\t\tdataView,\r\n\t\t\ttiffOffset,\r\n\t\t\ttiffOffset + dirOffset,\r\n\t\t\tlittleEndian,\r\n\t\t\tdata\r\n\t\t)\r\n\t\tif (dirOffset && !options.disableExifThumbnail) {\r\n\t\t\tthumbnailData = { exif: {} }\r\n\t\t\tdirOffset = loadImage.parseExifTags(\r\n\t\t\t\tdataView,\r\n\t\t\t\ttiffOffset,\r\n\t\t\t\ttiffOffset + dirOffset,\r\n\t\t\t\tlittleEndian,\r\n\t\t\t\tthumbnailData\r\n\t\t\t)\r\n\t\t\t// Check for JPEG Thumbnail offset:\r\n\t\t\tif (thumbnailData.exif[0x0201]) {\r\n\t\t\t\tdata.exif.Thumbnail = loadImage.getExifThumbnail(\r\n\t\t\t\t\tdataView,\r\n\t\t\t\t\ttiffOffset + thumbnailData.exif[0x0201],\r\n\t\t\t\t\tthumbnailData.exif[0x0202] // Thumbnail data length\r\n\t\t\t\t)\r\n\t\t\t}\r\n\t\t}\r\n\t\t// Check for Exif Sub IFD Pointer:\r\n\t\tif (data.exif[0x8769] && !options.disableExifSub) {\r\n\t\t\tloadImage.parseExifTags(\r\n\t\t\t\tdataView,\r\n\t\t\t\ttiffOffset,\r\n\t\t\t\ttiffOffset + data.exif[0x8769], // directory offset\r\n\t\t\t\tlittleEndian,\r\n\t\t\t\tdata\r\n\t\t\t)\r\n\t\t}\r\n\t\t// Check for GPS Info IFD Pointer:\r\n\t\tif (data.exif[0x8825] && !options.disableExifGps) {\r\n\t\t\tloadImage.parseExifTags(\r\n\t\t\t\tdataView,\r\n\t\t\t\ttiffOffset,\r\n\t\t\t\ttiffOffset + data.exif[0x8825], // directory offset\r\n\t\t\t\tlittleEndian,\r\n\t\t\t\tdata\r\n\t\t\t)\r\n\t\t}\r\n\t}\r\n\r\n\t// Registers the Exif parser for the APP1 JPEG meta data segment:\r\n\tloadImage.metaDataParsers.jpeg[0xffe1].push(loadImage.parseExifData)\r\n\tvar snabbt = (function () {\r\n\r\n\t\tvar tickRequests = [];\r\n\t\tvar runningAnimations = [];\r\n\t\tvar completedAnimations = [];\r\n\t\tvar transformProperty = 'transform';\r\n\r\n\t\t// Find which vendor prefix to use\r\n\t\tvar styles = window.getComputedStyle(document.documentElement, '');\r\n\t\tvar vendorPrefix = (Array.prototype.slice\r\n\t\t\t.call(styles)\r\n\t\t\t.join('')\r\n\t\t\t.match(/-(moz|webkit|ms)-/) || (styles.OLink === '' && ['', 'o'])\r\n\t\t)[1];\r\n\t\tif (vendorPrefix === 'webkit')\r\n\t\t\ttransformProperty = 'webkitTransform';\r\n\r\n\t\t/* Entry point, only function to be called by user */\r\n\t\tvar snabbt = function (arg1, arg2, arg3) {\r\n\r\n\t\t\tvar elements = arg1;\r\n\r\n\t\t\t// If argument is an Array or a NodeList or other list type that can be iterable.\r\n\t\t\t// Loop through and start one animation for each element.\r\n\t\t\tif (elements.length !== undefined) {\r\n\t\t\t\tvar aggregateChainer = {\r\n\t\t\t\t\tchainers: [],\r\n\t\t\t\t\tthen: function (opts) {\r\n\t\t\t\t\t\treturn this.snabbt(opts);\r\n\t\t\t\t\t},\r\n\t\t\t\t\tsnabbt: function (opts) {\r\n\t\t\t\t\t\tvar len = this.chainers.length;\r\n\t\t\t\t\t\tthis.chainers.forEach(function (chainer, index) {\r\n\t\t\t\t\t\t\tchainer.snabbt(preprocessOptions(opts, index, len));\r\n\t\t\t\t\t\t});\r\n\t\t\t\t\t\treturn aggregateChainer;\r\n\t\t\t\t\t},\r\n\t\t\t\t\tsetValue: function (value) {\r\n\t\t\t\t\t\tthis.chainers.forEach(function (chainer) {\r\n\t\t\t\t\t\t\tchainer.setValue(value);\r\n\t\t\t\t\t\t});\r\n\t\t\t\t\t\treturn aggregateChainer;\r\n\t\t\t\t\t},\r\n\t\t\t\t\tfinish: function () {\r\n\t\t\t\t\t\tthis.chainers.forEach(function (chainer) {\r\n\t\t\t\t\t\t\tchainer.finish();\r\n\t\t\t\t\t\t});\r\n\t\t\t\t\t\treturn aggregateChainer;\r\n\t\t\t\t\t},\r\n\t\t\t\t\trollback: function () {\r\n\t\t\t\t\t\tthis.chainers.forEach(function (chainer) {\r\n\t\t\t\t\t\t\tchainer.rollback();\r\n\t\t\t\t\t\t});\r\n\t\t\t\t\t\treturn aggregateChainer;\r\n\t\t\t\t\t}\r\n\t\t\t\t};\r\n\r\n\t\t\t\tfor (var i = 0, len = elements.length; i < len; ++i) {\r\n\t\t\t\t\tif (typeof arg2 == 'string')\r\n\t\t\t\t\t\taggregateChainer.chainers.push(snabbtSingleElement(elements[i], arg2, preprocessOptions(arg3, i, len)));\r\n\t\t\t\t\telse\r\n\t\t\t\t\t\taggregateChainer.chainers.push(snabbtSingleElement(elements[i], preprocessOptions(arg2, i, len), arg3));\r\n\t\t\t\t}\r\n\t\t\t\treturn aggregateChainer;\r\n\t\t\t} else {\r\n\t\t\t\tif (typeof arg2 == 'string')\r\n\t\t\t\t\treturn snabbtSingleElement(elements, arg2, preprocessOptions(arg3, 0, 1));\r\n\t\t\t\telse\r\n\t\t\t\t\treturn snabbtSingleElement(elements, preprocessOptions(arg2, 0, 1), arg3);\r\n\t\t\t}\r\n\t\t};\r\n\r\n\t\tvar preprocessOptions = function (options, index, len) {\r\n\t\t\tif (!options)\r\n\t\t\t\treturn options;\r\n\t\t\tvar clone = cloneObject(options);\r\n\r\n\t\t\tif (isFunction(options.delay)) {\r\n\t\t\t\tclone.delay = options.delay(index, len);\r\n\t\t\t}\r\n\r\n\t\t\tif (isFunction(options.callback)) {\r\n\t\t\t\tclone.complete = function () {\r\n\t\t\t\t\toptions.callback.call(this, index, len);\r\n\t\t\t\t};\r\n\t\t\t}\r\n\r\n\t\t\tvar hasAllDoneCallback = isFunction(options.allDone);\r\n\t\t\tvar hasCompleteCallback = isFunction(options.complete);\r\n\r\n\t\t\tif (hasCompleteCallback || hasAllDoneCallback) {\r\n\t\t\t\tclone.complete = function () {\r\n\t\t\t\t\tif (hasCompleteCallback) {\r\n\t\t\t\t\t\toptions.complete.call(this, index, len);\r\n\t\t\t\t\t}\r\n\t\t\t\t\tif (hasAllDoneCallback && (index == len - 1)) {\r\n\t\t\t\t\t\toptions.allDone();\r\n\t\t\t\t\t}\r\n\t\t\t\t};\r\n\t\t\t}\r\n\r\n\t\t\tif (isFunction(options.valueFeeder)) {\r\n\t\t\t\tclone.valueFeeder = function (i, matrix) {\r\n\t\t\t\t\treturn options.valueFeeder(i, matrix, index, len);\r\n\t\t\t\t};\r\n\t\t\t}\r\n\t\t\tif (isFunction(options.easing)) {\r\n\t\t\t\tclone.easing = function (i) {\r\n\t\t\t\t\treturn options.easing(i, index, len);\r\n\t\t\t\t};\r\n\t\t\t}\r\n\r\n\t\t\tvar properties = [\r\n\t\t\t\t'position',\r\n\t\t\t\t'rotation',\r\n\t\t\t\t'skew',\r\n\t\t\t\t'rotationPost',\r\n\t\t\t\t'scale',\r\n\t\t\t\t'width',\r\n\t\t\t\t'height',\r\n\t\t\t\t'opacity',\r\n\t\t\t\t'fromPosition',\r\n\t\t\t\t'fromRotation',\r\n\t\t\t\t'fromSkew',\r\n\t\t\t\t'fromRotationPost',\r\n\t\t\t\t'fromScale',\r\n\t\t\t\t'fromWidth',\r\n\t\t\t\t'fromHeight',\r\n\t\t\t\t'fromOpacity',\r\n\t\t\t\t'transformOrigin',\r\n\t\t\t\t'duration',\r\n\t\t\t\t'delay'\r\n\t\t\t];\r\n\r\n\t\t\tproperties.forEach(function (property) {\r\n\t\t\t\tif (isFunction(options[property])) {\r\n\t\t\t\t\tclone[property] = options[property](index, len);\r\n\t\t\t\t}\r\n\t\t\t});\r\n\r\n\t\t\treturn clone;\r\n\t\t};\r\n\r\n\t\tvar snabbtSingleElement = function (element, arg2, arg3) {\r\n\r\n\t\t\tif (arg2 === 'attention') {\r\n\t\t\t\treturn setupAttentionAnimation(element, arg3);\r\n\t\t\t}\r\n\r\n\t\t\tif (arg2 === 'stop') {\r\n\t\t\t\treturn stopAnimation(element);\r\n\t\t\t}\r\n\r\n\t\t\tif (arg2 === 'detach') {\r\n\t\t\t\treturn detachChildren(element);\r\n\t\t\t}\r\n\r\n\t\t\tvar options = arg2;\r\n\r\n\t\t\t// Remove orphaned end states\r\n\t\t\tclearOphanedEndStates();\r\n\r\n\t\t\t// If there is a running or past completed animation with element, use that end state as start state\r\n\t\t\tvar currentState = currentAnimationState(element);\r\n\t\t\tvar start = currentState;\r\n\t\t\t// from has precendance over current animation state\r\n\t\t\tstart = stateFromOptions(options, start, true);\r\n\t\t\tvar end = cloneObject(currentState);\r\n\t\t\tend = stateFromOptions(options, end);\r\n\r\n\t\t\tvar animOptions = setupAnimationOptions(start, end, options);\r\n\t\t\tvar animation = createAnimation(animOptions);\r\n\r\n\t\t\trunningAnimations.push([element, animation]);\r\n\r\n\t\t\tanimation.updateElement(element, true);\r\n\t\t\tvar queue = [];\r\n\t\t\tvar chainer = {\r\n\t\t\t\tsnabbt: function (opts) {\r\n\t\t\t\t\tqueue.unshift(preprocessOptions(opts, 0, 1));\r\n\t\t\t\t\treturn chainer;\r\n\t\t\t\t},\r\n\t\t\t\tthen: function (opts) {\r\n\t\t\t\t\treturn this.snabbt(opts);\r\n\t\t\t\t}\r\n\t\t\t};\r\n\r\n\t\t\tfunction tick(time) {\r\n\t\t\t\tanimation.tick(time);\r\n\t\t\t\tanimation.updateElement(element);\r\n\t\t\t\tif (animation.isStopped())\r\n\t\t\t\t\treturn;\r\n\r\n\t\t\t\tif (!animation.completed())\r\n\t\t\t\t\treturn queueTick(tick);\r\n\r\n\t\t\t\tif (options.loop > 1 && !animation.isStopped()) {\r\n\t\t\t\t\t// Loop current animation\r\n\t\t\t\t\toptions.loop -= 1;\r\n\t\t\t\t\tanimation.restart();\r\n\t\t\t\t\tqueueTick(tick);\r\n\t\t\t\t} else {\r\n\t\t\t\t\tif (options.complete) {\r\n\t\t\t\t\t\toptions.complete.call(element);\r\n\t\t\t\t\t}\r\n\r\n\t\t\t\t\t// Start next animation in queue\r\n\t\t\t\t\tif (queue.length) {\r\n\t\t\t\t\t\toptions = queue.pop();\r\n\r\n\t\t\t\t\t\tstart = stateFromOptions(options, end, true);\r\n\t\t\t\t\t\tend = stateFromOptions(options, cloneObject(end));\r\n\t\t\t\t\t\toptions = setupAnimationOptions(start, end, options);\r\n\r\n\t\t\t\t\t\tanimation = createAnimation(options);\r\n\t\t\t\t\t\trunningAnimations.push([element, animation]);\r\n\r\n\t\t\t\t\t\tanimation.tick(time);\r\n\t\t\t\t\t\tqueueTick(tick);\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t}\r\n\r\n\t\t\tqueueTick(tick);\r\n\t\t\t// Manual animations are not chainable, instead an animation controller object is returned\r\n\t\t\t// with setValue, finish and rollback methods\r\n\t\t\tif (options.manual)\r\n\t\t\t\treturn animation;\r\n\t\t\treturn chainer;\r\n\t\t};\r\n\r\n\t\tvar setupAttentionAnimation = function (element, options) {\r\n\t\t\tvar movement = stateFromOptions(options, createState({}));\r\n\t\t\toptions.movement = movement;\r\n\t\t\tvar animation = createAttentionAnimation(options);\r\n\r\n\t\t\trunningAnimations.push([element, animation]);\r\n\t\t\tfunction tick(time) {\r\n\t\t\t\tanimation.tick(time);\r\n\t\t\t\tanimation.updateElement(element);\r\n\t\t\t\tif (!animation.completed()) {\r\n\t\t\t\t\tqueueTick(tick);\r\n\t\t\t\t} else {\r\n\t\t\t\t\tif (options.callback) {\r\n\t\t\t\t\t\toptions.callback(element);\r\n\t\t\t\t\t}\r\n\t\t\t\t\tif (options.loop && options.loop > 1) {\r\n\t\t\t\t\t\toptions.loop--;\r\n\t\t\t\t\t\tanimation.restart();\r\n\t\t\t\t\t\tqueueTick(tick);\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\tqueueTick(tick);\r\n\t\t};\r\n\r\n\t\tvar stopAnimation = function (element) {\r\n\t\t\tfor (var i = 0, len = runningAnimations.length; i < len; ++i) {\r\n\t\t\t\tvar currentAnimation = runningAnimations[i];\r\n\t\t\t\tvar animatedElement = currentAnimation[0];\r\n\t\t\t\tvar animation = currentAnimation[1];\r\n\r\n\t\t\t\tif (animatedElement === element) {\r\n\t\t\t\t\tanimation.stop();\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t};\r\n\r\n\t\tvar indexOfElement = function (arr, element) {\r\n\t\t\tfor (var i = 0, len = arr.length; i < len; ++i) {\r\n\t\t\t\tif (arr[i][0] === 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\tvar detachChildren = function (element) {\r\n\r\n\t\t\tvar elements = [];\r\n\t\t\tvar animations = runningAnimations.concat(completedAnimations);\r\n\t\t\tvar el;\r\n\t\t\tvar i;\r\n\t\t\tvar len = animations.length;\r\n\r\n\t\t\tfor (i = 0; i < len; ++i) {\r\n\t\t\t\tel = animations[i][0];\r\n\t\t\t\tif (element.contains(el) || element === el) {\r\n\t\t\t\t\telements.push(el);\r\n\t\t\t\t}\r\n\t\t\t}\r\n\r\n\t\t\tlen = elements.length;\r\n\t\t\tfor (i = 0; i < len; ++i) {\r\n\t\t\t\tdetachElement(elements[i]);\r\n\t\t\t}\r\n\r\n\t\t};\r\n\r\n\t\tvar detachElement = function (element) {\r\n\r\n\t\t\t// stop animations\r\n\t\t\tstopAnimation(element);\r\n\r\n\t\t\t// remove\r\n\t\t\tvar index = indexOfElement(runningAnimations, element);\r\n\t\t\tif (index >= 0) {\r\n\t\t\t\trunningAnimations.splice(index, 1);\r\n\t\t\t}\r\n\r\n\t\t\tindex = indexOfElement(completedAnimations, element);\r\n\t\t\tif (index >= 0) {\r\n\t\t\t\tcompletedAnimations.splice(index, 1);\r\n\t\t\t}\r\n\r\n\t\t};\r\n\r\n\t\tvar findAnimationState = function (animationList, element) {\r\n\t\t\tfor (var i = 0, len = animationList.length; i < len; ++i) {\r\n\t\t\t\tvar currentAnimation = animationList[i];\r\n\t\t\t\tvar animatedElement = currentAnimation[0];\r\n\t\t\t\tvar animation = currentAnimation[1];\r\n\r\n\t\t\t\tif (animatedElement === element) {\r\n\t\t\t\t\tvar state = animation.getCurrentState();\r\n\t\t\t\t\tanimation.stop();\r\n\t\t\t\t\treturn state;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t};\r\n\r\n\t\tvar clearOphanedEndStates = function () {\r\n\t\t\tcompletedAnimations = completedAnimations.filter(function (animation) {\r\n\t\t\t\treturn (findUltimateAncestor(animation[0]).body);\r\n\t\t\t});\r\n\t\t};\r\n\r\n\t\tvar findUltimateAncestor = function (node) {\r\n\t\t\tvar ancestor = node;\r\n\t\t\twhile (ancestor.parentNode) {\r\n\t\t\t\tancestor = ancestor.parentNode;\r\n\t\t\t}\r\n\t\t\treturn ancestor;\r\n\t\t};\r\n\r\n\t\t/**\r\n\t\t* Returns the current state of element if there is an ongoing or previously finished\r\n\t\t* animation releated to it. Will also call stop on the animation.\r\n\t\t* TODO: The stopping of the animation is better put somewhere else\r\n\t\t*/\r\n\t\tvar currentAnimationState = function (element) {\r\n\t\t\t// Check if a completed animation is stored for this element\r\n\t\t\tvar state = findAnimationState(runningAnimations, element);\r\n\t\t\tif (state)\r\n\t\t\t\treturn state;\r\n\r\n\t\t\treturn findAnimationState(completedAnimations, element);\r\n\t\t};\r\n\r\n\t\t/**\r\n\t\t* Parses an animation configuration object and returns a State instance\r\n\t\t*/\r\n\t\tvar stateFromOptions = function (options, state, useFromPrefix) {\r\n\t\t\tif (!state) {\r\n\t\t\t\tstate = createState({\r\n\t\t\t\t\tposition: [0, 0, 0],\r\n\t\t\t\t\trotation: [0, 0, 0],\r\n\t\t\t\t\trotationPost: [0, 0, 0],\r\n\t\t\t\t\tscale: [1, 1],\r\n\t\t\t\t\tskew: [0, 0]\r\n\t\t\t\t});\r\n\t\t\t}\r\n\t\t\tvar position = 'position';\r\n\t\t\tvar rotation = 'rotation';\r\n\t\t\tvar skew = 'skew';\r\n\t\t\tvar rotationPost = 'rotationPost';\r\n\t\t\tvar scale = 'scale';\r\n\t\t\tvar scalePost = 'scalePost';\r\n\t\t\tvar width = 'width';\r\n\t\t\tvar height = 'height';\r\n\t\t\tvar opacity = 'opacity';\r\n\r\n\t\t\tif (useFromPrefix) {\r\n\t\t\t\tposition = 'fromPosition';\r\n\t\t\t\trotation = 'fromRotation';\r\n\t\t\t\tskew = 'fromSkew';\r\n\t\t\t\trotationPost = 'fromRotationPost';\r\n\t\t\t\tscale = 'fromScale';\r\n\t\t\t\tscalePost = 'fromScalePost';\r\n\t\t\t\twidth = 'fromWidth';\r\n\t\t\t\theight = 'fromHeight';\r\n\t\t\t\topacity = 'fromOpacity';\r\n\t\t\t}\r\n\r\n\t\t\tstate.position = optionOrDefault(options[position], state.position);\r\n\t\t\tstate.rotation = optionOrDefault(options[rotation], state.rotation);\r\n\t\t\tstate.rotationPost = optionOrDefault(options[rotationPost], state.rotationPost);\r\n\t\t\tstate.skew = optionOrDefault(options[skew], state.skew);\r\n\t\t\tstate.scale = optionOrDefault(options[scale], state.scale);\r\n\t\t\tstate.scalePost = optionOrDefault(options[scalePost], state.scalePost);\r\n\t\t\tstate.opacity = options[opacity];\r\n\t\t\tstate.width = options[width];\r\n\t\t\tstate.height = options[height];\r\n\r\n\t\t\treturn state;\r\n\t\t};\r\n\r\n\t\tvar setupAnimationOptions = function (start, end, options) {\r\n\t\t\toptions.startState = start;\r\n\t\t\toptions.endState = end;\r\n\t\t\treturn options;\r\n\t\t};\r\n\r\n\t\tvar polyFillrAF = window.requestAnimationFrame || window.webkitRequestAnimationFrame || window.mozRequestAnimationFrame || window.msRequestAnimationFrame || function (callback) { return setTimeout(callback, 1000 / 60); };\r\n\r\n\t\tvar queueTick = function (func) {\r\n\t\t\tif (tickRequests.length === 0)\r\n\t\t\t\tpolyFillrAF(tickAnimations);\r\n\t\t\ttickRequests.push(func);\r\n\t\t};\r\n\r\n\t\tvar tickAnimations = function (time) {\r\n\t\t\tvar len = tickRequests.length;\r\n\t\t\tfor (var i = 0; i < len; ++i) {\r\n\t\t\t\ttickRequests[i](time);\r\n\t\t\t}\r\n\t\t\ttickRequests.splice(0, len);\r\n\r\n\t\t\tvar finishedAnimations = runningAnimations.filter(function (animation) {\r\n\t\t\t\treturn animation[1].completed();\r\n\t\t\t});\r\n\r\n\t\t\t// See if there are any previously completed animations on the same element, if so, remove it before merging\r\n\t\t\tcompletedAnimations = completedAnimations.filter(function (animation) {\r\n\t\t\t\tfor (var i = 0, len = finishedAnimations.length; i < len; ++i) {\r\n\t\t\t\t\tif (animation[0] === finishedAnimations[i][0]) {\r\n\t\t\t\t\t\treturn false;\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t\treturn true;\r\n\t\t\t});\r\n\r\n\t\t\tcompletedAnimations = completedAnimations.concat(finishedAnimations);\r\n\r\n\t\t\trunningAnimations = runningAnimations.filter(function (animation) {\r\n\t\t\t\treturn !animation[1].completed();\r\n\t\t\t});\r\n\r\n\t\t\tif (tickRequests.length !== 0)\r\n\t\t\t\tpolyFillrAF(tickAnimations);\r\n\t\t};\r\n\r\n\r\n\t\t// Class for handling animation between two states\r\n\t\tvar createAnimation = function (options) {\r\n\t\t\tvar startState = options.startState;\r\n\t\t\tvar endState = options.endState;\r\n\t\t\tvar duration = optionOrDefault(options.duration, 500);\r\n\t\t\tvar delay = optionOrDefault(options.delay, 0);\r\n\t\t\tvar perspective = options.perspective;\r\n\t\t\tvar easing = createEaser(optionOrDefault(options.easing, 'linear'), options);\r\n\t\t\tvar currentState = duration === 0 ? endState.clone() : startState.clone();\r\n\t\t\tvar transformOrigin = options.transformOrigin;\r\n\t\t\tcurrentState.transformOrigin = options.transformOrigin;\r\n\r\n\t\t\tvar startTime = 0;\r\n\t\t\tvar currentTime = 0;\r\n\t\t\tvar stopped = false;\r\n\t\t\tvar started = false;\r\n\r\n\t\t\t// Manual related\r\n\t\t\tvar manual = options.manual;\r\n\t\t\tvar manualValue = 0;\r\n\t\t\tvar manualDelayFactor = delay / duration;\r\n\t\t\tvar manualCallback;\r\n\r\n\t\t\tvar tweener;\r\n\t\t\t// Setup tweener\r\n\t\t\tif (options.valueFeeder) {\r\n\t\t\t\ttweener = createValueFeederTweener(options.valueFeeder,\r\n\t\t\t\t\tstartState,\r\n\t\t\t\t\tendState,\r\n\t\t\t\t\tcurrentState);\r\n\t\t\t} else {\r\n\t\t\t\ttweener = createStateTweener(startState, endState, currentState);\r\n\t\t\t}\r\n\r\n\t\t\t// Public api\r\n\t\t\treturn {\r\n\t\t\t\tstop: function () {\r\n\t\t\t\t\tstopped = true;\r\n\t\t\t\t},\r\n\t\t\t\tisStopped: function () {\r\n\t\t\t\t\treturn stopped;\r\n\t\t\t\t},\r\n\r\n\t\t\t\tfinish: function (callback) {\r\n\t\t\t\t\tmanual = false;\r\n\t\t\t\t\tvar manualDuration = duration * manualValue;\r\n\t\t\t\t\tstartTime = currentTime - manualDuration;\r\n\t\t\t\t\tmanualCallback = callback;\r\n\t\t\t\t\teasing.resetFrom = manualValue;\r\n\t\t\t\t},\r\n\r\n\t\t\t\trollback: function (callback) {\r\n\t\t\t\t\tmanual = false;\r\n\t\t\t\t\ttweener.setReverse();\r\n\t\t\t\t\tvar manualDuration = duration * (1 - manualValue);\r\n\t\t\t\t\tstartTime = currentTime - manualDuration;\r\n\t\t\t\t\tmanualCallback = callback;\r\n\t\t\t\t\teasing.resetFrom = manualValue;\r\n\t\t\t\t},\r\n\r\n\t\t\t\trestart: function () {\r\n\t\t\t\t\t// Restart timer\r\n\t\t\t\t\tstartTime = undefined;\r\n\t\t\t\t\teasing.resetFrom(0);\r\n\t\t\t\t},\r\n\r\n\t\t\t\ttick: function (time) {\r\n\t\t\t\t\tif (stopped)\r\n\t\t\t\t\t\treturn;\r\n\r\n\t\t\t\t\tif (manual) {\r\n\t\t\t\t\t\tcurrentTime = time;\r\n\t\t\t\t\t\tthis.updateCurrentTransform();\r\n\t\t\t\t\t\treturn;\r\n\t\t\t\t\t}\r\n\r\n\t\t\t\t\t// If first tick, set startTime\r\n\t\t\t\t\tif (!startTime) {\r\n\t\t\t\t\t\tstartTime = time;\r\n\t\t\t\t\t}\r\n\t\t\t\t\tif (time - startTime > delay) {\r\n\t\t\t\t\t\tstarted = true;\r\n\t\t\t\t\t\tcurrentTime = time - delay;\r\n\r\n\t\t\t\t\t\tvar curr = Math.min(Math.max(0.0, currentTime - startTime), duration);\r\n\t\t\t\t\t\teasing.tick(curr / duration);\r\n\t\t\t\t\t\tthis.updateCurrentTransform();\r\n\t\t\t\t\t\tif (this.completed() && manualCallback) {\r\n\t\t\t\t\t\t\tmanualCallback();\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\tgetCurrentState: function () {\r\n\t\t\t\t\treturn currentState;\r\n\t\t\t\t},\r\n\r\n\t\t\t\tsetValue: function (_manualValue) {\r\n\t\t\t\t\tstarted = true;\r\n\t\t\t\t\tmanualValue = Math.min(Math.max(_manualValue, 0.0001), 1 + manualDelayFactor);\r\n\t\t\t\t},\r\n\r\n\t\t\t\tupdateCurrentTransform: function () {\r\n\t\t\t\t\tvar tweenValue = easing.getValue();\r\n\t\t\t\t\tif (manual) {\r\n\t\t\t\t\t\tvar val = Math.max(0.00001, manualValue - manualDelayFactor);\r\n\t\t\t\t\t\teasing.tick(val);\r\n\t\t\t\t\t\ttweenValue = easing.getValue();\r\n\t\t\t\t\t}\r\n\t\t\t\t\ttweener.tween(tweenValue);\r\n\t\t\t\t},\r\n\r\n\t\t\t\tcompleted: function () {\r\n\t\t\t\t\tif (stopped)\r\n\t\t\t\t\t\treturn true;\r\n\t\t\t\t\tif (startTime === 0) {\r\n\t\t\t\t\t\treturn false;\r\n\t\t\t\t\t}\r\n\t\t\t\t\treturn easing.completed();\r\n\t\t\t\t},\r\n\r\n\t\t\t\tupdateElement: function (element, forceUpdate) {\r\n\t\t\t\t\tif (!started && !forceUpdate)\r\n\t\t\t\t\t\treturn;\r\n\t\t\t\t\tvar matrix = tweener.asMatrix();\r\n\t\t\t\t\tvar properties = tweener.getProperties();\r\n\t\t\t\t\tupdateElementTransform(element, matrix, perspective);\r\n\t\t\t\t\tupdateElementProperties(element, properties);\r\n\t\t\t\t}\r\n\t\t\t};\r\n\t\t};\r\n\r\n\t\t// ------------------------------\r\n\t\t// End Time animation\r\n\t\t// ------------------------------\r\n\r\n\t\t// ------------------------\r\n\t\t// -- AttentionAnimation --\r\n\t\t// ------------------------\r\n\r\n\t\tvar createAttentionAnimation = function (options) {\r\n\t\t\tvar movement = options.movement;\r\n\t\t\toptions.initialVelocity = 0.1;\r\n\t\t\toptions.equilibriumPosition = 0;\r\n\t\t\tvar spring = createSpringEasing(options);\r\n\t\t\tvar stopped = false;\r\n\t\t\tvar tweenPosition = movement.position;\r\n\t\t\tvar tweenRotation = movement.rotation;\r\n\t\t\tvar tweenRotationPost = movement.rotationPost;\r\n\t\t\tvar tweenScale = movement.scale;\r\n\t\t\tvar tweenSkew = movement.skew;\r\n\r\n\t\t\tvar currentMovement = createState({\r\n\t\t\t\tposition: tweenPosition ? [0, 0, 0] : undefined,\r\n\t\t\t\trotation: tweenRotation ? [0, 0, 0] : undefined,\r\n\t\t\t\trotationPost: tweenRotationPost ? [0, 0, 0] : undefined,\r\n\t\t\t\tscale: tweenScale ? [0, 0] : undefined,\r\n\t\t\t\tskew: tweenSkew ? [0, 0] : undefined,\r\n\t\t\t});\r\n\r\n\t\t\t// Public API\r\n\t\t\treturn {\r\n\t\t\t\tstop: function () {\r\n\t\t\t\t\tstopped = true;\r\n\t\t\t\t},\r\n\r\n\t\t\t\tisStopped: function (time) {\r\n\t\t\t\t\treturn stopped;\r\n\t\t\t\t},\r\n\r\n\t\t\t\ttick: function (time) {\r\n\t\t\t\t\tif (stopped)\r\n\t\t\t\t\t\treturn;\r\n\t\t\t\t\tif (spring.equilibrium)\r\n\t\t\t\t\t\treturn;\r\n\t\t\t\t\tspring.tick();\r\n\r\n\t\t\t\t\tthis.updateMovement();\r\n\t\t\t\t},\r\n\r\n\t\t\t\tupdateMovement: function () {\r\n\t\t\t\t\tvar value = spring.getValue();\r\n\t\t\t\t\tif (tweenPosition) {\r\n\t\t\t\t\t\tcurrentMovement.position[0] = movement.position[0] * value;\r\n\t\t\t\t\t\tcurrentMovement.position[1] = movement.position[1] * value;\r\n\t\t\t\t\t\tcurrentMovement.position[2] = movement.position[2] * value;\r\n\t\t\t\t\t}\r\n\t\t\t\t\tif (tweenRotation) {\r\n\t\t\t\t\t\tcurrentMovement.rotation[0] = movement.rotation[0] * value;\r\n\t\t\t\t\t\tcurrentMovement.rotation[1] = movement.rotation[1] * value;\r\n\t\t\t\t\t\tcurrentMovement.rotation[2] = movement.rotation[2] * value;\r\n\t\t\t\t\t}\r\n\t\t\t\t\tif (tweenRotationPost) {\r\n\t\t\t\t\t\tcurrentMovement.rotationPost[0] = movement.rotationPost[0] * value;\r\n\t\t\t\t\t\tcurrentMovement.rotationPost[1] = movement.rotationPost[1] * value;\r\n\t\t\t\t\t\tcurrentMovement.rotationPost[2] = movement.rotationPost[2] * value;\r\n\t\t\t\t\t}\r\n\t\t\t\t\tif (tweenScale) {\r\n\t\t\t\t\t\tcurrentMovement.scale[0] = 1 + movement.scale[0] * value;\r\n\t\t\t\t\t\tcurrentMovement.scale[1] = 1 + movement.scale[1] * value;\r\n\t\t\t\t\t}\r\n\r\n\t\t\t\t\tif (tweenSkew) {\r\n\t\t\t\t\t\tcurrentMovement.skew[0] = movement.skew[0] * value;\r\n\t\t\t\t\t\tcurrentMovement.skew[1] = movement.skew[1] * value;\r\n\t\t\t\t\t}\r\n\t\t\t\t},\r\n\r\n\t\t\t\tupdateElement: function (element) {\r\n\t\t\t\t\tupdateElementTransform(element, currentMovement.asMatrix());\r\n\t\t\t\t\tupdateElementProperties(element, currentMovement.getProperties());\r\n\t\t\t\t},\r\n\r\n\t\t\t\tgetCurrentState: function () {\r\n\t\t\t\t\treturn currentMovement;\r\n\t\t\t\t},\r\n\r\n\t\t\t\tcompleted: function () {\r\n\t\t\t\t\treturn spring.equilibrium || stopped;\r\n\t\t\t\t},\r\n\r\n\t\t\t\trestart: function () {\r\n\t\t\t\t\t// Restart spring\r\n\t\t\t\t\tspring = createSpringEasing(options);\r\n\t\t\t\t}\r\n\t\t\t};\r\n\t\t};\r\n\r\n\r\n\t\t/**********\r\n\t\t* Easings *\r\n\t\t***********/\r\n\r\n\t\tvar linearEasing = function (value) {\r\n\t\t\treturn value;\r\n\t\t};\r\n\r\n\t\tvar ease = function (value) {\r\n\t\t\treturn (Math.cos(value * Math.PI + Math.PI) + 1) / 2;\r\n\t\t};\r\n\r\n\t\tvar easeIn = function (value) {\r\n\t\t\treturn value * value;\r\n\t\t};\r\n\r\n\t\tvar easeOut = function (value) {\r\n\t\t\treturn -Math.pow(value - 1, 2) + 1;\r\n\t\t};\r\n\r\n\t\tvar createSpringEasing = function (options) {\r\n\t\t\tvar position = optionOrDefault(options.startPosition, 0);\r\n\t\t\tvar equilibriumPosition = optionOrDefault(options.equilibriumPosition, 1);\r\n\t\t\tvar velocity = optionOrDefault(options.initialVelocity, 0);\r\n\t\t\tvar springConstant = optionOrDefault(options.springConstant, 0.8);\r\n\t\t\tvar deceleration = optionOrDefault(options.springDeceleration, 0.9);\r\n\t\t\tvar mass = optionOrDefault(options.springMass, 10);\r\n\r\n\t\t\tvar equilibrium = false;\r\n\r\n\t\t\t// Public API\r\n\t\t\treturn {\r\n\r\n\t\t\t\ttick: function (value) {\r\n\t\t\t\t\tif (value === 0.0)\r\n\t\t\t\t\t\treturn;\r\n\t\t\t\t\tif (equilibrium)\r\n\t\t\t\t\t\treturn;\r\n\t\t\t\t\tvar springForce = -(position - equilibriumPosition) * springConstant;\r\n\t\t\t\t\t// f = m * a\r\n\t\t\t\t\t// a = f / m\r\n\t\t\t\t\tvar a = springForce / mass;\r\n\t\t\t\t\t// s = v * t\r\n\t\t\t\t\t// t = 1 ( for now )\r\n\t\t\t\t\tvelocity += a;\r\n\t\t\t\t\tposition += velocity;\r\n\r\n\t\t\t\t\t// Deceleration\r\n\t\t\t\t\tvelocity *= deceleration;\r\n\r\n\t\t\t\t\tif (Math.abs(position - equilibriumPosition) < 0.001 && Math.abs(velocity) < 0.001) {\r\n\t\t\t\t\t\tequilibrium = true;\r\n\t\t\t\t\t}\r\n\t\t\t\t},\r\n\r\n\t\t\t\tresetFrom: function (value) {\r\n\t\t\t\t\tposition = value;\r\n\t\t\t\t\tvelocity = 0;\r\n\t\t\t\t},\r\n\r\n\r\n\t\t\t\tgetValue: function () {\r\n\t\t\t\t\tif (equilibrium)\r\n\t\t\t\t\t\treturn equilibriumPosition;\r\n\t\t\t\t\treturn position;\r\n\t\t\t\t},\r\n\r\n\t\t\t\tcompleted: function () {\r\n\t\t\t\t\treturn equilibrium;\r\n\t\t\t\t}\r\n\t\t\t};\r\n\t\t};\r\n\r\n\t\tvar EASING_FUNCS = {\r\n\t\t\t'linear': linearEasing,\r\n\t\t\t'ease': ease,\r\n\t\t\t'easeIn': easeIn,\r\n\t\t\t'easeOut': easeOut,\r\n\t\t};\r\n\r\n\r\n\t\tvar createEaser = function (easerName, options) {\r\n\t\t\tif (easerName == 'spring') {\r\n\t\t\t\treturn createSpringEasing(options);\r\n\t\t\t}\r\n\t\t\tvar easeFunction = easerName;\r\n\t\t\tif (!isFunction(easerName)) {\r\n\t\t\t\teaseFunction = EASING_FUNCS[easerName];\r\n\t\t\t}\r\n\r\n\t\t\tvar easer = easeFunction;\r\n\t\t\tvar value = 0;\r\n\t\t\tvar lastValue;\r\n\r\n\t\t\t// Public API\r\n\t\t\treturn {\r\n\t\t\t\ttick: function (v) {\r\n\t\t\t\t\tvalue = easer(v);\r\n\t\t\t\t\tlastValue = v;\r\n\t\t\t\t},\r\n\r\n\t\t\t\tresetFrom: function (value) {\r\n\t\t\t\t\tlastValue = 0;\r\n\t\t\t\t},\r\n\r\n\t\t\t\tgetValue: function () {\r\n\t\t\t\t\treturn value;\r\n\t\t\t\t},\r\n\r\n\t\t\t\tcompleted: function () {\r\n\t\t\t\t\tif (lastValue >= 1) {\r\n\t\t\t\t\t\treturn lastValue;\r\n\t\t\t\t\t}\r\n\t\t\t\t\treturn false;\r\n\t\t\t\t}\r\n\t\t\t};\r\n\t\t};\r\n\r\n\t\t/***\r\n\t\t* Matrix related\r\n\t\t*/\r\n\r\n\t\tvar assignTranslate = function (matrix, x, y, z) {\r\n\t\t\tmatrix[0] = 1;\r\n\t\t\tmatrix[1] = 0;\r\n\t\t\tmatrix[2] = 0;\r\n\t\t\tmatrix[3] = 0;\r\n\t\t\tmatrix[4] = 0;\r\n\t\t\tmatrix[5] = 1;\r\n\t\t\tmatrix[6] = 0;\r\n\t\t\tmatrix[7] = 0;\r\n\t\t\tmatrix[8] = 0;\r\n\t\t\tmatrix[9] = 0;\r\n\t\t\tmatrix[10] = 1;\r\n\t\t\tmatrix[11] = 0;\r\n\t\t\tmatrix[12] = x;\r\n\t\t\tmatrix[13] = y;\r\n\t\t\tmatrix[14] = z;\r\n\t\t\tmatrix[15] = 1;\r\n\t\t};\r\n\r\n\t\tvar assignRotateX = function (matrix, rad) {\r\n\t\t\tmatrix[0] = 1;\r\n\t\t\tmatrix[1] = 0;\r\n\t\t\tmatrix[2] = 0;\r\n\t\t\tmatrix[3] = 0;\r\n\t\t\tmatrix[4] = 0;\r\n\t\t\tmatrix[5] = Math.cos(rad);\r\n\t\t\tmatrix[6] = -Math.sin(rad);\r\n\t\t\tmatrix[7] = 0;\r\n\t\t\tmatrix[8] = 0;\r\n\t\t\tmatrix[9] = Math.sin(rad);\r\n\t\t\tmatrix[10] = Math.cos(rad);\r\n\t\t\tmatrix[11] = 0;\r\n\t\t\tmatrix[12] = 0;\r\n\t\t\tmatrix[13] = 0;\r\n\t\t\tmatrix[14] = 0;\r\n\t\t\tmatrix[15] = 1;\r\n\t\t};\r\n\r\n\r\n\t\tvar assignRotateY = function (matrix, rad) {\r\n\t\t\tmatrix[0] = Math.cos(rad);\r\n\t\t\tmatrix[1] = 0;\r\n\t\t\tmatrix[2] = Math.sin(rad);\r\n\t\t\tmatrix[3] = 0;\r\n\t\t\tmatrix[4] = 0;\r\n\t\t\tmatrix[5] = 1;\r\n\t\t\tmatrix[6] = 0;\r\n\t\t\tmatrix[7] = 0;\r\n\t\t\tmatrix[8] = -Math.sin(rad);\r\n\t\t\tmatrix[9] = 0;\r\n\t\t\tmatrix[10] = Math.cos(rad);\r\n\t\t\tmatrix[11] = 0;\r\n\t\t\tmatrix[12] = 0;\r\n\t\t\tmatrix[13] = 0;\r\n\t\t\tmatrix[14] = 0;\r\n\t\t\tmatrix[15] = 1;\r\n\t\t};\r\n\r\n\t\tvar assignRotateZ = function (matrix, rad) {\r\n\t\t\tmatrix[0] = Math.cos(rad);\r\n\t\t\tmatrix[1] = -Math.sin(rad);\r\n\t\t\tmatrix[2] = 0;\r\n\t\t\tmatrix[3] = 0;\r\n\t\t\tmatrix[4] = Math.sin(rad);\r\n\t\t\tmatrix[5] = Math.cos(rad);\r\n\t\t\tmatrix[6] = 0;\r\n\t\t\tmatrix[7] = 0;\r\n\t\t\tmatrix[8] = 0;\r\n\t\t\tmatrix[9] = 0;\r\n\t\t\tmatrix[10] = 1;\r\n\t\t\tmatrix[11] = 0;\r\n\t\t\tmatrix[12] = 0;\r\n\t\t\tmatrix[13] = 0;\r\n\t\t\tmatrix[14] = 0;\r\n\t\t\tmatrix[15] = 1;\r\n\t\t};\r\n\r\n\t\tvar assignSkew = function (matrix, ax, ay) {\r\n\t\t\tmatrix[0] = 1;\r\n\t\t\tmatrix[1] = Math.tan(ax);\r\n\t\t\tmatrix[2] = 0;\r\n\t\t\tmatrix[3] = 0;\r\n\t\t\tmatrix[4] = Math.tan(ay);\r\n\t\t\tmatrix[5] = 1;\r\n\t\t\tmatrix[6] = 0;\r\n\t\t\tmatrix[7] = 0;\r\n\t\t\tmatrix[8] = 0;\r\n\t\t\tmatrix[9] = 0;\r\n\t\t\tmatrix[10] = 1;\r\n\t\t\tmatrix[11] = 0;\r\n\t\t\tmatrix[12] = 0;\r\n\t\t\tmatrix[13] = 0;\r\n\t\t\tmatrix[14] = 0;\r\n\t\t\tmatrix[15] = 1;\r\n\t\t};\r\n\r\n\r\n\t\tvar assignScale = function (matrix, x, y) {\r\n\t\t\tmatrix[0] = x;\r\n\t\t\tmatrix[1] = 0;\r\n\t\t\tmatrix[2] = 0;\r\n\t\t\tmatrix[3] = 0;\r\n\t\t\tmatrix[4] = 0;\r\n\t\t\tmatrix[5] = y;\r\n\t\t\tmatrix[6] = 0;\r\n\t\t\tmatrix[7] = 0;\r\n\t\t\tmatrix[8] = 0;\r\n\t\t\tmatrix[9] = 0;\r\n\t\t\tmatrix[10] = 1;\r\n\t\t\tmatrix[11] = 0;\r\n\t\t\tmatrix[12] = 0;\r\n\t\t\tmatrix[13] = 0;\r\n\t\t\tmatrix[14] = 0;\r\n\t\t\tmatrix[15] = 1;\r\n\t\t};\r\n\r\n\t\tvar assignIdentity = function (matrix) {\r\n\t\t\tmatrix[0] = 1;\r\n\t\t\tmatrix[1] = 0;\r\n\t\t\tmatrix[2] = 0;\r\n\t\t\tmatrix[3] = 0;\r\n\t\t\tmatrix[4] = 0;\r\n\t\t\tmatrix[5] = 1;\r\n\t\t\tmatrix[6] = 0;\r\n\t\t\tmatrix[7] = 0;\r\n\t\t\tmatrix[8] = 0;\r\n\t\t\tmatrix[9] = 0;\r\n\t\t\tmatrix[10] = 1;\r\n\t\t\tmatrix[11] = 0;\r\n\t\t\tmatrix[12] = 0;\r\n\t\t\tmatrix[13] = 0;\r\n\t\t\tmatrix[14] = 0;\r\n\t\t\tmatrix[15] = 1;\r\n\t\t};\r\n\r\n\t\tvar copyArray = function (a, b) {\r\n\t\t\tb[0] = a[0];\r\n\t\t\tb[1] = a[1];\r\n\t\t\tb[2] = a[2];\r\n\t\t\tb[3] = a[3];\r\n\t\t\tb[4] = a[4];\r\n\t\t\tb[5] = a[5];\r\n\t\t\tb[6] = a[6];\r\n\t\t\tb[7] = a[7];\r\n\t\t\tb[8] = a[8];\r\n\t\t\tb[9] = a[9];\r\n\t\t\tb[10] = a[10];\r\n\t\t\tb[11] = a[11];\r\n\t\t\tb[12] = a[12];\r\n\t\t\tb[13] = a[13];\r\n\t\t\tb[14] = a[14];\r\n\t\t\tb[15] = a[15];\r\n\t\t};\r\n\r\n\t\tvar createMatrix = function () {\r\n\t\t\tvar data = new Float32Array(16);\r\n\t\t\tvar a = new Float32Array(16);\r\n\t\t\tvar b = new Float32Array(16);\r\n\t\t\tassignIdentity(data);\r\n\r\n\t\t\treturn {\r\n\t\t\t\tdata: data,\r\n\r\n\t\t\t\tasCSS: function () {\r\n\t\t\t\t\tvar css = 'matrix3d(';\r\n\t\t\t\t\tfor (var i = 0; i < 15; ++i) {\r\n\t\t\t\t\t\tif (Math.abs(data[i]) < 0.0001)\r\n\t\t\t\t\t\t\tcss += '0,';\r\n\t\t\t\t\t\telse\r\n\t\t\t\t\t\t\tcss += data[i].toFixed(10) + ',';\r\n\t\t\t\t\t}\r\n\t\t\t\t\tif (Math.abs(data[15]) < 0.0001)\r\n\t\t\t\t\t\tcss += '0)';\r\n\t\t\t\t\telse\r\n\t\t\t\t\t\tcss += data[15].toFixed(10) + ')';\r\n\t\t\t\t\treturn css;\r\n\t\t\t\t},\r\n\r\n\t\t\t\tclear: function () {\r\n\t\t\t\t\tassignIdentity(data);\r\n\t\t\t\t},\r\n\r\n\t\t\t\ttranslate: function (x, y, z) {\r\n\t\t\t\t\tcopyArray(data, a);\r\n\t\t\t\t\tassignTranslate(b, x, y, z);\r\n\t\t\t\t\tassignedMatrixMultiplication(a, b, data);\r\n\t\t\t\t\treturn this;\r\n\t\t\t\t},\r\n\r\n\t\t\t\trotateX: function (radians) {\r\n\t\t\t\t\tcopyArray(data, a);\r\n\t\t\t\t\tassignRotateX(b, radians);\r\n\t\t\t\t\tassignedMatrixMultiplication(a, b, data);\r\n\t\t\t\t\treturn this;\r\n\t\t\t\t},\r\n\r\n\t\t\t\trotateY: function (radians) {\r\n\t\t\t\t\tcopyArray(data, a);\r\n\t\t\t\t\tassignRotateY(b, radians);\r\n\t\t\t\t\tassignedMatrixMultiplication(a, b, data);\r\n\t\t\t\t\treturn this;\r\n\t\t\t\t},\r\n\r\n\t\t\t\trotateZ: function (radians) {\r\n\t\t\t\t\tcopyArray(data, a);\r\n\t\t\t\t\tassignRotateZ(b, radians);\r\n\t\t\t\t\tassignedMatrixMultiplication(a, b, data);\r\n\t\t\t\t\treturn this;\r\n\t\t\t\t},\r\n\r\n\t\t\t\tscale: function (x, y) {\r\n\t\t\t\t\tcopyArray(data, a);\r\n\t\t\t\t\tassignScale(b, x, y);\r\n\t\t\t\t\tassignedMatrixMultiplication(a, b, data);\r\n\t\t\t\t\treturn this;\r\n\t\t\t\t},\r\n\r\n\t\t\t\tskew: function (ax, ay) {\r\n\t\t\t\t\tcopyArray(data, a);\r\n\t\t\t\t\tassignSkew(b, ax, ay);\r\n\t\t\t\t\tassignedMatrixMultiplication(a, b, data);\r\n\t\t\t\t\treturn this;\r\n\t\t\t\t}\r\n\t\t\t};\r\n\t\t};\r\n\r\n\t\tvar assignedMatrixMultiplication = function (a, b, res) {\r\n\t\t\t// Unrolled loop\r\n\t\t\tres[0] = a[0] * b[0] + a[1] * b[4] + a[2] * b[8] + a[3] * b[12];\r\n\t\t\tres[1] = a[0] * b[1] + a[1] * b[5] + a[2] * b[9] + a[3] * b[13];\r\n\t\t\tres[2] = a[0] * b[2] + a[1] * b[6] + a[2] * b[10] + a[3] * b[14];\r\n\t\t\tres[3] = a[0] * b[3] + a[1] * b[7] + a[2] * b[11] + a[3] * b[15];\r\n\r\n\t\t\tres[4] = a[4] * b[0] + a[5] * b[4] + a[6] * b[8] + a[7] * b[12];\r\n\t\t\tres[5] = a[4] * b[1] + a[5] * b[5] + a[6] * b[9] + a[7] * b[13];\r\n\t\t\tres[6] = a[4] * b[2] + a[5] * b[6] + a[6] * b[10] + a[7] * b[14];\r\n\t\t\tres[7] = a[4] * b[3] + a[5] * b[7] + a[6] * b[11] + a[7] * b[15];\r\n\r\n\t\t\tres[8] = a[8] * b[0] + a[9] * b[4] + a[10] * b[8] + a[11] * b[12];\r\n\t\t\tres[9] = a[8] * b[1] + a[9] * b[5] + a[10] * b[9] + a[11] * b[13];\r\n\t\t\tres[10] = a[8] * b[2] + a[9] * b[6] + a[10] * b[10] + a[11] * b[14];\r\n\t\t\tres[11] = a[8] * b[3] + a[9] * b[7] + a[10] * b[11] + a[11] * b[15];\r\n\r\n\t\t\tres[12] = a[12] * b[0] + a[13] * b[4] + a[14] * b[8] + a[15] * b[12];\r\n\t\t\tres[13] = a[12] * b[1] + a[13] * b[5] + a[14] * b[9] + a[15] * b[13];\r\n\t\t\tres[14] = a[12] * b[2] + a[13] * b[6] + a[14] * b[10] + a[15] * b[14];\r\n\t\t\tres[15] = a[12] * b[3] + a[13] * b[7] + a[14] * b[11] + a[15] * b[15];\r\n\r\n\t\t\treturn res;\r\n\t\t};\r\n\r\n\t\tvar createState = function (config) {\r\n\t\t\t// Caching of matrix and properties so we don't have to create new ones everytime they are needed\r\n\t\t\tvar matrix = createMatrix();\r\n\t\t\tvar properties = {\r\n\t\t\t\topacity: undefined,\r\n\t\t\t\twidth: undefined,\r\n\t\t\t\theight: undefined\r\n\t\t\t};\r\n\r\n\t\t\t// Public API\r\n\t\t\treturn {\r\n\t\t\t\tposition: config.position,\r\n\t\t\t\trotation: config.rotation,\r\n\t\t\t\trotationPost: config.rotationPost,\r\n\t\t\t\tskew: config.skew,\r\n\t\t\t\tscale: config.scale,\r\n\t\t\t\tscalePost: config.scalePost,\r\n\t\t\t\topacity: config.opacity,\r\n\t\t\t\twidth: config.width,\r\n\t\t\t\theight: config.height,\r\n\r\n\r\n\t\t\t\tclone: function () {\r\n\t\t\t\t\treturn createState({\r\n\t\t\t\t\t\tposition: this.position ? this.position.slice(0) : undefined,\r\n\t\t\t\t\t\trotation: this.rotation ? this.rotation.slice(0) : undefined,\r\n\t\t\t\t\t\trotationPost: this.rotationPost ? this.rotationPost.slice(0) : undefined,\r\n\t\t\t\t\t\tskew: this.skew ? this.skew.slice(0) : undefined,\r\n\t\t\t\t\t\tscale: this.scale ? this.scale.slice(0) : undefined,\r\n\t\t\t\t\t\tscalePost: this.scalePost ? this.scalePost.slice(0) : undefined,\r\n\t\t\t\t\t\theight: this.height,\r\n\t\t\t\t\t\twidth: this.width,\r\n\t\t\t\t\t\topacity: this.opacity\r\n\t\t\t\t\t});\r\n\t\t\t\t},\r\n\r\n\t\t\t\tasMatrix: function () {\r\n\t\t\t\t\tvar m = matrix;\r\n\t\t\t\t\tm.clear();\r\n\r\n\t\t\t\t\tif (this.transformOrigin)\r\n\t\t\t\t\t\tm.translate(-this.transformOrigin[0], -this.transformOrigin[1], -this.transformOrigin[2]);\r\n\r\n\t\t\t\t\tif (this.scale) {\r\n\t\t\t\t\t\tm.scale(this.scale[0], this.scale[1]);\r\n\t\t\t\t\t}\r\n\r\n\t\t\t\t\tif (this.skew) {\r\n\t\t\t\t\t\tm.skew(this.skew[0], this.skew[1]);\r\n\t\t\t\t\t}\r\n\r\n\t\t\t\t\tif (this.rotation) {\r\n\t\t\t\t\t\tm.rotateX(this.rotation[0]);\r\n\t\t\t\t\t\tm.rotateY(this.rotation[1]);\r\n\t\t\t\t\t\tm.rotateZ(this.rotation[2]);\r\n\t\t\t\t\t}\r\n\r\n\t\t\t\t\tif (this.position) {\r\n\t\t\t\t\t\tm.translate(this.position[0], this.position[1], this.position[2]);\r\n\t\t\t\t\t}\r\n\r\n\t\t\t\t\tif (this.rotationPost) {\r\n\t\t\t\t\t\tm.rotateX(this.rotationPost[0]);\r\n\t\t\t\t\t\tm.rotateY(this.rotationPost[1]);\r\n\t\t\t\t\t\tm.rotateZ(this.rotationPost[2]);\r\n\t\t\t\t\t}\r\n\r\n\t\t\t\t\tif (this.scalePost) {\r\n\t\t\t\t\t\tm.scale(this.scalePost[0], this.scalePost[1]);\r\n\t\t\t\t\t}\r\n\r\n\t\t\t\t\tif (this.transformOrigin)\r\n\t\t\t\t\t\tm.translate(this.transformOrigin[0], this.transformOrigin[1], this.transformOrigin[2]);\r\n\t\t\t\t\treturn m;\r\n\t\t\t\t},\r\n\r\n\t\t\t\tgetProperties: function () {\r\n\t\t\t\t\tproperties.opacity = this.opacity;\r\n\t\t\t\t\tproperties.width = this.width + 'px';\r\n\t\t\t\t\tproperties.height = this.height + 'px';\r\n\t\t\t\t\treturn properties;\r\n\t\t\t\t}\r\n\t\t\t};\r\n\t\t};\r\n\t\t// ------------------\r\n\t\t// -- StateTweener -- \r\n\t\t// -------------------\r\n\r\n\t\tvar createStateTweener = function (startState, endState, resultState) {\r\n\t\t\tvar start = startState;\r\n\t\t\tvar end = endState;\r\n\t\t\tvar result = resultState;\r\n\r\n\t\t\tvar tweenPosition = end.position !== undefined;\r\n\t\t\tvar tweenRotation = end.rotation !== undefined;\r\n\t\t\tvar tweenRotationPost = end.rotationPost !== undefined;\r\n\t\t\tvar tweenScale = end.scale !== undefined;\r\n\t\t\tvar tweenSkew = end.skew !== undefined;\r\n\t\t\tvar tweenWidth = end.width !== undefined;\r\n\t\t\tvar tweenHeight = end.height !== undefined;\r\n\t\t\tvar tweenOpacity = end.opacity !== undefined;\r\n\r\n\t\t\t// Public API\r\n\t\t\treturn {\r\n\r\n\t\t\t\ttween: function (tweenValue) {\r\n\r\n\t\t\t\t\tif (tweenPosition) {\r\n\t\t\t\t\t\tvar dX = (end.position[0] - start.position[0]);\r\n\t\t\t\t\t\tvar dY = (end.position[1] - start.position[1]);\r\n\t\t\t\t\t\tvar dZ = (end.position[2] - start.position[2]);\r\n\t\t\t\t\t\tresult.position[0] = start.position[0] + tweenValue * dX;\r\n\t\t\t\t\t\tresult.position[1] = start.position[1] + tweenValue * dY;\r\n\t\t\t\t\t\tresult.position[2] = start.position[2] + tweenValue * dZ;\r\n\t\t\t\t\t}\r\n\r\n\t\t\t\t\tif (tweenRotation) {\r\n\t\t\t\t\t\tvar dAX = (end.rotation[0] - start.rotation[0]);\r\n\t\t\t\t\t\tvar dAY = (end.rotation[1] - start.rotation[1]);\r\n\t\t\t\t\t\tvar dAZ = (end.rotation[2] - start.rotation[2]);\r\n\t\t\t\t\t\tresult.rotation[0] = start.rotation[0] + tweenValue * dAX;\r\n\t\t\t\t\t\tresult.rotation[1] = start.rotation[1] + tweenValue * dAY;\r\n\t\t\t\t\t\tresult.rotation[2] = start.rotation[2] + tweenValue * dAZ;\r\n\t\t\t\t\t}\r\n\r\n\t\t\t\t\tif (tweenRotationPost) {\r\n\t\t\t\t\t\tvar dBX = (end.rotationPost[0] - start.rotationPost[0]);\r\n\t\t\t\t\t\tvar dBY = (end.rotationPost[1] - start.rotationPost[1]);\r\n\t\t\t\t\t\tvar dBZ = (end.rotationPost[2] - start.rotationPost[2]);\r\n\t\t\t\t\t\tresult.rotationPost[0] = start.rotationPost[0] + tweenValue * dBX;\r\n\t\t\t\t\t\tresult.rotationPost[1] = start.rotationPost[1] + tweenValue * dBY;\r\n\t\t\t\t\t\tresult.rotationPost[2] = start.rotationPost[2] + tweenValue * dBZ;\r\n\t\t\t\t\t}\r\n\r\n\t\t\t\t\tif (tweenSkew) {\r\n\t\t\t\t\t\tvar dSX = (end.scale[0] - start.scale[0]);\r\n\t\t\t\t\t\tvar dSY = (end.scale[1] - start.scale[1]);\r\n\r\n\t\t\t\t\t\tresult.scale[0] = start.scale[0] + tweenValue * dSX;\r\n\t\t\t\t\t\tresult.scale[1] = start.scale[1] + tweenValue * dSY;\r\n\t\t\t\t\t}\r\n\r\n\t\t\t\t\tif (tweenScale) {\r\n\t\t\t\t\t\tvar dSkewX = (end.skew[0] - start.skew[0]);\r\n\t\t\t\t\t\tvar dSkewY = (end.skew[1] - start.skew[1]);\r\n\r\n\t\t\t\t\t\tresult.skew[0] = start.skew[0] + tweenValue * dSkewX;\r\n\t\t\t\t\t\tresult.skew[1] = start.skew[1] + tweenValue * dSkewY;\r\n\t\t\t\t\t}\r\n\r\n\t\t\t\t\tif (tweenWidth) {\r\n\t\t\t\t\t\tvar dWidth = (end.width - start.width);\r\n\t\t\t\t\t\tresult.width = start.width + tweenValue * dWidth;\r\n\t\t\t\t\t}\r\n\r\n\r\n\t\t\t\t\tif (tweenHeight) {\r\n\t\t\t\t\t\tvar dHeight = (end.height - start.height);\r\n\t\t\t\t\t\tresult.height = start.height + tweenValue * dHeight;\r\n\t\t\t\t\t}\r\n\r\n\t\t\t\t\tif (tweenOpacity) {\r\n\t\t\t\t\t\tvar dOpacity = (end.opacity - start.opacity);\r\n\t\t\t\t\t\tresult.opacity = start.opacity + tweenValue * dOpacity;\r\n\t\t\t\t\t}\r\n\r\n\t\t\t\t},\r\n\r\n\t\t\t\tasMatrix: function () {\r\n\t\t\t\t\treturn result.asMatrix();\r\n\t\t\t\t},\r\n\r\n\t\t\t\tgetProperties: function () {\r\n\t\t\t\t\treturn result.getProperties();\r\n\t\t\t\t},\r\n\r\n\t\t\t\tsetReverse: function () {\r\n\t\t\t\t\tvar oldStart = start;\r\n\t\t\t\t\tstart = end;\r\n\t\t\t\t\tend = oldStart;\r\n\t\t\t\t}\r\n\t\t\t};\r\n\t\t};\r\n\r\n\t\t// ------------------------\r\n\t\t// -- ValueFeederTweener -- \r\n\t\t// ------------------------\r\n\r\n\t\tvar createValueFeederTweener = function (valueFeeder, startState, endState, resultState) {\r\n\t\t\tvar currentMatrix = valueFeeder(0, createMatrix());\r\n\t\t\tvar start = startState;\r\n\t\t\tvar end = endState;\r\n\t\t\tvar result = resultState;\r\n\t\t\tvar reverse = false;\r\n\r\n\r\n\t\t\t// Public API\r\n\t\t\treturn {\r\n\r\n\t\t\t\ttween: function (tweenValue) {\r\n\t\t\t\t\tif (reverse)\r\n\t\t\t\t\t\ttweenValue = 1 - tweenValue;\r\n\t\t\t\t\tcurrentMatrix.clear();\r\n\t\t\t\t\tcurrentMatrix = valueFeeder(tweenValue, currentMatrix);\r\n\r\n\t\t\t\t\tvar dWidth = (end.width - start.width);\r\n\t\t\t\t\tvar dHeight = (end.height - start.height);\r\n\t\t\t\t\tvar dOpacity = (end.opacity - start.opacity);\r\n\r\n\t\t\t\t\tif (end.width !== undefined)\r\n\t\t\t\t\t\tresult.width = start.width + tweenValue * dWidth;\r\n\t\t\t\t\tif (end.height !== undefined)\r\n\t\t\t\t\t\tresult.height = start.height + tweenValue * dHeight;\r\n\t\t\t\t\tif (end.opacity !== undefined)\r\n\t\t\t\t\t\tresult.opacity = start.opacity + tweenValue * dOpacity;\r\n\t\t\t\t},\r\n\r\n\t\t\t\tasMatrix: function () {\r\n\t\t\t\t\treturn currentMatrix;\r\n\t\t\t\t},\r\n\r\n\t\t\t\tgetProperties: function () {\r\n\t\t\t\t\treturn result.getProperties();\r\n\t\t\t\t},\r\n\r\n\t\t\t\tsetReverse: function () {\r\n\t\t\t\t\treverse = true;\r\n\t\t\t\t}\r\n\r\n\t\t\t};\r\n\t\t};\r\n\r\n\t\tvar optionOrDefault = function (option, def) {\r\n\t\t\tif (typeof option == 'undefined') {\r\n\t\t\t\treturn def;\r\n\t\t\t}\r\n\t\t\treturn option;\r\n\t\t};\r\n\r\n\t\tvar updateElementTransform = function (element, matrix, perspective) {\r\n\t\t\tvar cssPerspective = '';\r\n\t\t\tif (perspective) {\r\n\t\t\t\tcssPerspective = 'perspective(' + perspective + 'px) ';\r\n\t\t\t}\r\n\t\t\tvar cssMatrix = matrix.asCSS();\r\n\t\t\telement.style[transformProperty] = cssPerspective + cssMatrix;\r\n\t\t};\r\n\r\n\t\tvar updateElementProperties = function (element, properties) {\r\n\t\t\tfor (var key in properties) {\r\n\t\t\t\telement.style[key] = properties[key];\r\n\t\t\t}\r\n\t\t};\r\n\r\n\t\tvar isFunction = function (object) {\r\n\t\t\treturn (typeof object === \"function\");\r\n\t\t};\r\n\r\n\t\tvar cloneObject = function (object) {\r\n\t\t\tif (!object)\r\n\t\t\t\treturn object;\r\n\t\t\tvar clone = {};\r\n\t\t\tfor (var key in object) {\r\n\t\t\t\tclone[key] = object[key];\r\n\t\t\t}\r\n\t\t\treturn clone;\r\n\t\t};\r\n\r\n\t\tsnabbt.createMatrix = createMatrix;\r\n\t\tsnabbt.setElementTransform = updateElementTransform;\r\n\t\treturn snabbt;\r\n\t}());\r\n\tvar stackBlur = (function () {\r\n\r\n\t\tvar mul_table = [\r\n\t\t\t512, 512, 456, 512, 328, 456, 335, 512, 405, 328, 271, 456, 388, 335, 292, 512,\r\n\t\t\t454, 405, 364, 328, 298, 271, 496, 456, 420, 388, 360, 335, 312, 292, 273, 512,\r\n\t\t\t482, 454, 428, 405, 383, 364, 345, 328, 312, 298, 284, 271, 259, 496, 475, 456,\r\n\t\t\t437, 420, 404, 388, 374, 360, 347, 335, 323, 312, 302, 292, 282, 273, 265, 512,\r\n\t\t\t497, 482, 468, 454, 441, 428, 417, 405, 394, 383, 373, 364, 354, 345, 337, 328,\r\n\t\t\t320, 312, 305, 298, 291, 284, 278, 271, 265, 259, 507, 496, 485, 475, 465, 456,\r\n\t\t\t446, 437, 428, 420, 412, 404, 396, 388, 381, 374, 367, 360, 354, 347, 341, 335,\r\n\t\t\t329, 323, 318, 312, 307, 302, 297, 292, 287, 282, 278, 273, 269, 265, 261, 512,\r\n\t\t\t505, 497, 489, 482, 475, 468, 461, 454, 447, 441, 435, 428, 422, 417, 411, 405,\r\n\t\t\t399, 394, 389, 383, 378, 373, 368, 364, 359, 354, 350, 345, 341, 337, 332, 328,\r\n\t\t\t324, 320, 316, 312, 309, 305, 301, 298, 294, 291, 287, 284, 281, 278, 274, 271,\r\n\t\t\t268, 265, 262, 259, 257, 507, 501, 496, 491, 485, 480, 475, 470, 465, 460, 456,\r\n\t\t\t451, 446, 442, 437, 433, 428, 424, 420, 416, 412, 408, 404, 400, 396, 392, 388,\r\n\t\t\t385, 381, 377, 374, 370, 367, 363, 360, 357, 354, 350, 347, 344, 341, 338, 335,\r\n\t\t\t332, 329, 326, 323, 320, 318, 315, 312, 310, 307, 304, 302, 299, 297, 294, 292,\r\n\t\t\t289, 287, 285, 282, 280, 278, 275, 273, 271, 269, 267, 265, 263, 261, 259];\r\n\r\n\r\n\t\tvar shg_table = [\r\n\t\t\t9, 11, 12, 13, 13, 14, 14, 15, 15, 15, 15, 16, 16, 16, 16, 17,\r\n\t\t\t17, 17, 17, 17, 17, 17, 18, 18, 18, 18, 18, 18, 18, 18, 18, 19,\r\n\t\t\t19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 20, 20, 20,\r\n\t\t\t20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 21,\r\n\t\t\t21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,\r\n\t\t\t21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 22, 22, 22, 22, 22, 22,\r\n\t\t\t22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22,\r\n\t\t\t22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 23,\r\n\t\t\t23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23,\r\n\t\t\t23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23,\r\n\t\t\t23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23,\r\n\t\t\t23, 23, 23, 23, 23, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24,\r\n\t\t\t24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24,\r\n\t\t\t24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24,\r\n\t\t\t24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24,\r\n\t\t\t24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24];\r\n\r\n\t\tfunction getImageDataFromCanvas(canvas, top_x, top_y, width, height) {\r\n\t\t\tif (typeof (canvas) == 'string')\r\n\t\t\t\tcanvas = document.getElementById(canvas);\r\n\t\t\telse if (!canvas instanceof HTMLCanvasElement)\r\n\t\t\t\treturn;\r\n\r\n\t\t\tvar context = canvas.getContext('2d');\r\n\t\t\tvar imageData;\r\n\r\n\t\t\ttry {\r\n\t\t\t\ttry {\r\n\t\t\t\t\timageData = context.getImageData(top_x, top_y, width, height);\r\n\t\t\t\t} catch (e) {\r\n\t\t\t\t\tthrow new Error(\"unable to access local image data: \" + e);\r\n\t\t\t\t\treturn;\r\n\t\t\t\t}\r\n\t\t\t} catch (e) {\r\n\t\t\t\tthrow new Error(\"unable to access image data: \" + e);\r\n\t\t\t}\r\n\r\n\t\t\treturn imageData;\r\n\t\t}\r\n\r\n\t\tfunction processCanvasRGBA(canvas, top_x, top_y, width, height, radius) {\r\n\t\t\tif (isNaN(radius) || radius < 1) return;\r\n\t\t\tradius |= 0;\r\n\r\n\t\t\tvar imageData = getImageDataFromCanvas(canvas, top_x, top_y, width, height);\r\n\r\n\t\t\timageData = processImageDataRGBA(imageData, top_x, top_y, width, height, radius);\r\n\r\n\t\t\tcanvas.getContext('2d').putImageData(imageData, top_x, top_y);\r\n\t\t}\r\n\r\n\t\tfunction processImageDataRGBA(imageData, top_x, top_y, width, height, radius) {\r\n\t\t\tvar pixels = imageData.data;\r\n\r\n\t\t\tvar x, y, i, p, yp, yi, yw, r_sum, g_sum, b_sum, a_sum,\r\n\t\t\t\tr_out_sum, g_out_sum, b_out_sum, a_out_sum,\r\n\t\t\t\tr_in_sum, g_in_sum, b_in_sum, a_in_sum,\r\n\t\t\t\tpr, pg, pb, pa, rbs;\r\n\r\n\t\t\tvar div = radius + radius + 1;\r\n\t\t\tvar w4 = width << 2;\r\n\t\t\tvar widthMinus1 = width - 1;\r\n\t\t\tvar heightMinus1 = height - 1;\r\n\t\t\tvar radiusPlus1 = radius + 1;\r\n\t\t\tvar sumFactor = radiusPlus1 * (radiusPlus1 + 1) / 2;\r\n\r\n\t\t\tvar stackStart = new BlurStack();\r\n\t\t\tvar stack = stackStart;\r\n\t\t\tfor (i = 1; i < div; i++) {\r\n\t\t\t\tstack = stack.next = new BlurStack();\r\n\t\t\t\tif (i == radiusPlus1) var stackEnd = stack;\r\n\t\t\t}\r\n\t\t\tstack.next = stackStart;\r\n\t\t\tvar stackIn = null;\r\n\t\t\tvar stackOut = null;\r\n\r\n\t\t\tyw = yi = 0;\r\n\r\n\t\t\tvar mul_sum = mul_table[radius];\r\n\t\t\tvar shg_sum = shg_table[radius];\r\n\r\n\t\t\tfor (y = 0; y < height; y++) {\r\n\t\t\t\tr_in_sum = g_in_sum = b_in_sum = a_in_sum = r_sum = g_sum = b_sum = a_sum = 0;\r\n\r\n\t\t\t\tr_out_sum = radiusPlus1 * (pr = pixels[yi]);\r\n\t\t\t\tg_out_sum = radiusPlus1 * (pg = pixels[yi + 1]);\r\n\t\t\t\tb_out_sum = radiusPlus1 * (pb = pixels[yi + 2]);\r\n\t\t\t\ta_out_sum = radiusPlus1 * (pa = pixels[yi + 3]);\r\n\r\n\t\t\t\tr_sum += sumFactor * pr;\r\n\t\t\t\tg_sum += sumFactor * pg;\r\n\t\t\t\tb_sum += sumFactor * pb;\r\n\t\t\t\ta_sum += sumFactor * pa;\r\n\r\n\t\t\t\tstack = stackStart;\r\n\r\n\t\t\t\tfor (i = 0; i < radiusPlus1; i++) {\r\n\t\t\t\t\tstack.r = pr;\r\n\t\t\t\t\tstack.g = pg;\r\n\t\t\t\t\tstack.b = pb;\r\n\t\t\t\t\tstack.a = pa;\r\n\t\t\t\t\tstack = stack.next;\r\n\t\t\t\t}\r\n\r\n\t\t\t\tfor (i = 1; i < radiusPlus1; i++) {\r\n\t\t\t\t\tp = yi + ((widthMinus1 < i ? widthMinus1 : i) << 2);\r\n\t\t\t\t\tr_sum += (stack.r = (pr = pixels[p])) * (rbs = radiusPlus1 - i);\r\n\t\t\t\t\tg_sum += (stack.g = (pg = pixels[p + 1])) * rbs;\r\n\t\t\t\t\tb_sum += (stack.b = (pb = pixels[p + 2])) * rbs;\r\n\t\t\t\t\ta_sum += (stack.a = (pa = pixels[p + 3])) * rbs;\r\n\r\n\t\t\t\t\tr_in_sum += pr;\r\n\t\t\t\t\tg_in_sum += pg;\r\n\t\t\t\t\tb_in_sum += pb;\r\n\t\t\t\t\ta_in_sum += pa;\r\n\r\n\t\t\t\t\tstack = stack.next;\r\n\t\t\t\t}\r\n\r\n\r\n\t\t\t\tstackIn = stackStart;\r\n\t\t\t\tstackOut = stackEnd;\r\n\t\t\t\tfor (x = 0; x < width; x++) {\r\n\t\t\t\t\tpixels[yi + 3] = pa = (a_sum * mul_sum) >> shg_sum;\r\n\t\t\t\t\tif (pa != 0) {\r\n\t\t\t\t\t\tpa = 255 / pa;\r\n\t\t\t\t\t\tpixels[yi] = ((r_sum * mul_sum) >> shg_sum) * pa;\r\n\t\t\t\t\t\tpixels[yi + 1] = ((g_sum * mul_sum) >> shg_sum) * pa;\r\n\t\t\t\t\t\tpixels[yi + 2] = ((b_sum * mul_sum) >> shg_sum) * pa;\r\n\t\t\t\t\t} else {\r\n\t\t\t\t\t\tpixels[yi] = pixels[yi + 1] = pixels[yi + 2] = 0;\r\n\t\t\t\t\t}\r\n\r\n\t\t\t\t\tr_sum -= r_out_sum;\r\n\t\t\t\t\tg_sum -= g_out_sum;\r\n\t\t\t\t\tb_sum -= b_out_sum;\r\n\t\t\t\t\ta_sum -= a_out_sum;\r\n\r\n\t\t\t\t\tr_out_sum -= stackIn.r;\r\n\t\t\t\t\tg_out_sum -= stackIn.g;\r\n\t\t\t\t\tb_out_sum -= stackIn.b;\r\n\t\t\t\t\ta_out_sum -= stackIn.a;\r\n\r\n\t\t\t\t\tp = (yw + ((p = x + radius + 1) < widthMinus1 ? p : widthMinus1)) << 2;\r\n\r\n\t\t\t\t\tr_in_sum += (stackIn.r = pixels[p]);\r\n\t\t\t\t\tg_in_sum += (stackIn.g = pixels[p + 1]);\r\n\t\t\t\t\tb_in_sum += (stackIn.b = pixels[p + 2]);\r\n\t\t\t\t\ta_in_sum += (stackIn.a = pixels[p + 3]);\r\n\r\n\t\t\t\t\tr_sum += r_in_sum;\r\n\t\t\t\t\tg_sum += g_in_sum;\r\n\t\t\t\t\tb_sum += b_in_sum;\r\n\t\t\t\t\ta_sum += a_in_sum;\r\n\r\n\t\t\t\t\tstackIn = stackIn.next;\r\n\r\n\t\t\t\t\tr_out_sum += (pr = stackOut.r);\r\n\t\t\t\t\tg_out_sum += (pg = stackOut.g);\r\n\t\t\t\t\tb_out_sum += (pb = stackOut.b);\r\n\t\t\t\t\ta_out_sum += (pa = stackOut.a);\r\n\r\n\t\t\t\t\tr_in_sum -= pr;\r\n\t\t\t\t\tg_in_sum -= pg;\r\n\t\t\t\t\tb_in_sum -= pb;\r\n\t\t\t\t\ta_in_sum -= pa;\r\n\r\n\t\t\t\t\tstackOut = stackOut.next;\r\n\r\n\t\t\t\t\tyi += 4;\r\n\t\t\t\t}\r\n\t\t\t\tyw += width;\r\n\t\t\t}\r\n\r\n\r\n\t\t\tfor (x = 0; x < width; x++) {\r\n\t\t\t\tg_in_sum = b_in_sum = a_in_sum = r_in_sum = g_sum = b_sum = a_sum = r_sum = 0;\r\n\r\n\t\t\t\tyi = x << 2;\r\n\t\t\t\tr_out_sum = radiusPlus1 * (pr = pixels[yi]);\r\n\t\t\t\tg_out_sum = radiusPlus1 * (pg = pixels[yi + 1]);\r\n\t\t\t\tb_out_sum = radiusPlus1 * (pb = pixels[yi + 2]);\r\n\t\t\t\ta_out_sum = radiusPlus1 * (pa = pixels[yi + 3]);\r\n\r\n\t\t\t\tr_sum += sumFactor * pr;\r\n\t\t\t\tg_sum += sumFactor * pg;\r\n\t\t\t\tb_sum += sumFactor * pb;\r\n\t\t\t\ta_sum += sumFactor * pa;\r\n\r\n\t\t\t\tstack = stackStart;\r\n\r\n\t\t\t\tfor (i = 0; i < radiusPlus1; i++) {\r\n\t\t\t\t\tstack.r = pr;\r\n\t\t\t\t\tstack.g = pg;\r\n\t\t\t\t\tstack.b = pb;\r\n\t\t\t\t\tstack.a = pa;\r\n\t\t\t\t\tstack = stack.next;\r\n\t\t\t\t}\r\n\r\n\t\t\t\typ = width;\r\n\r\n\t\t\t\tfor (i = 1; i <= radius; i++) {\r\n\t\t\t\t\tyi = (yp + x) << 2;\r\n\r\n\t\t\t\t\tr_sum += (stack.r = (pr = pixels[yi])) * (rbs = radiusPlus1 - i);\r\n\t\t\t\t\tg_sum += (stack.g = (pg = pixels[yi + 1])) * rbs;\r\n\t\t\t\t\tb_sum += (stack.b = (pb = pixels[yi + 2])) * rbs;\r\n\t\t\t\t\ta_sum += (stack.a = (pa = pixels[yi + 3])) * rbs;\r\n\r\n\t\t\t\t\tr_in_sum += pr;\r\n\t\t\t\t\tg_in_sum += pg;\r\n\t\t\t\t\tb_in_sum += pb;\r\n\t\t\t\t\ta_in_sum += pa;\r\n\r\n\t\t\t\t\tstack = stack.next;\r\n\r\n\t\t\t\t\tif (i < heightMinus1) {\r\n\t\t\t\t\t\typ += width;\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\r\n\t\t\t\tyi = x;\r\n\t\t\t\tstackIn = stackStart;\r\n\t\t\t\tstackOut = stackEnd;\r\n\t\t\t\tfor (y = 0; y < height; y++) {\r\n\t\t\t\t\tp = yi << 2;\r\n\t\t\t\t\tpixels[p + 3] = pa = (a_sum * mul_sum) >> shg_sum;\r\n\t\t\t\t\tif (pa > 0) {\r\n\t\t\t\t\t\tpa = 255 / pa;\r\n\t\t\t\t\t\tpixels[p] = ((r_sum * mul_sum) >> shg_sum) * pa;\r\n\t\t\t\t\t\tpixels[p + 1] = ((g_sum * mul_sum) >> shg_sum) * pa;\r\n\t\t\t\t\t\tpixels[p + 2] = ((b_sum * mul_sum) >> shg_sum) * pa;\r\n\t\t\t\t\t} else {\r\n\t\t\t\t\t\tpixels[p] = pixels[p + 1] = pixels[p + 2] = 0;\r\n\t\t\t\t\t}\r\n\r\n\t\t\t\t\tr_sum -= r_out_sum;\r\n\t\t\t\t\tg_sum -= g_out_sum;\r\n\t\t\t\t\tb_sum -= b_out_sum;\r\n\t\t\t\t\ta_sum -= a_out_sum;\r\n\r\n\t\t\t\t\tr_out_sum -= stackIn.r;\r\n\t\t\t\t\tg_out_sum -= stackIn.g;\r\n\t\t\t\t\tb_out_sum -= stackIn.b;\r\n\t\t\t\t\ta_out_sum -= stackIn.a;\r\n\r\n\t\t\t\t\tp = (x + (((p = y + radiusPlus1) < heightMinus1 ? p : heightMinus1) * width)) << 2;\r\n\r\n\t\t\t\t\tr_sum += (r_in_sum += (stackIn.r = pixels[p]));\r\n\t\t\t\t\tg_sum += (g_in_sum += (stackIn.g = pixels[p + 1]));\r\n\t\t\t\t\tb_sum += (b_in_sum += (stackIn.b = pixels[p + 2]));\r\n\t\t\t\t\ta_sum += (a_in_sum += (stackIn.a = pixels[p + 3]));\r\n\r\n\t\t\t\t\tstackIn = stackIn.next;\r\n\r\n\t\t\t\t\tr_out_sum += (pr = stackOut.r);\r\n\t\t\t\t\tg_out_sum += (pg = stackOut.g);\r\n\t\t\t\t\tb_out_sum += (pb = stackOut.b);\r\n\t\t\t\t\ta_out_sum += (pa = stackOut.a);\r\n\r\n\t\t\t\t\tr_in_sum -= pr;\r\n\t\t\t\t\tg_in_sum -= pg;\r\n\t\t\t\t\tb_in_sum -= pb;\r\n\t\t\t\t\ta_in_sum -= pa;\r\n\r\n\t\t\t\t\tstackOut = stackOut.next;\r\n\r\n\t\t\t\t\tyi += width;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\treturn imageData;\r\n\t\t}\r\n\r\n\t\tfunction BlurStack() {\r\n\t\t\tthis.r = 0;\r\n\t\t\tthis.g = 0;\r\n\t\t\tthis.b = 0;\r\n\t\t\tthis.a = 0;\r\n\t\t\tthis.next = null;\r\n\t\t}\r\n\r\n\t\treturn processCanvasRGBA;\r\n\r\n\t}());\r\n\t// canvas to blob polyfill\r\n\t// https://developer.mozilla.org/en-US/docs/Web/API/HTMLCanvasElement/toBlob#Polyfill\r\n\tif (!HTMLCanvasElement.prototype.toBlob) {\r\n\t\tObject.defineProperty(HTMLCanvasElement.prototype, 'toBlob', {\r\n\t\t\tvalue: function (callback, type, quality) {\r\n\r\n\t\t\t\tvar binStr = atob(this.toDataURL(type, quality).split(',')[1]),\r\n\t\t\t\t\tlen = binStr.length,\r\n\t\t\t\t\tarr = new Uint8Array(len);\r\n\r\n\t\t\t\tfor (var i = 0; i < len; i++) {\r\n\t\t\t\t\tarr[i] = binStr.charCodeAt(i);\r\n\t\t\t\t}\r\n\r\n\t\t\t\tcallback(new Blob([arr], { type: type || 'image/png' }));\r\n\t\t\t}\r\n\t\t});\r\n\t}\r\n\t'use strict';\r\n\r\n\tvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\r\n\r\n\tvar _typeof = typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; };\r\n\r\n\tfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\r\n\r\n\tvar copyString = function copyString(str) {\r\n\t\treturn str + '';\r\n\t};\r\n\r\n\tvar getDataset = function getDataset(el) {\r\n\r\n\t\tif (typeof el.dataset === 'undefined') {\r\n\t\t\tvar res = {};\r\n\t\t\tvar attr;\r\n\t\t\tvar attrName;\r\n\t\t\tvar attrs = el.attributes;\r\n\t\t\tfor (attr in attrs) {\r\n\t\t\t\tif (attrs.hasOwnProperty(attr) && attrs[attr].name && /^data-[a-z_\\-\\d]*$/i.test(attrs[attr].name)) {\r\n\t\t\t\t\tattrName = toCamelCase(attrs[attr].name.substr(5));\r\n\t\t\t\t\tres[attrName] = attrs[attr].value;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\treturn res;\r\n\t\t}\r\n\t\treturn el.dataset;\r\n\t};\r\n\r\n\tvar toCamelCase = function toCamelCase(str) {\r\n\t\treturn str.replace(/\\-./g, function (substr) {\r\n\t\t\treturn substr.charAt(1).toUpperCase();\r\n\t\t});\r\n\t};\r\n\r\n\tvar getElementAttributes = function getElementAttributes(el) {\r\n\t\t// is a for loop on purpose as this should still function when Slim not supported\r\n\t\tvar result = [];\r\n\t\tvar attributes = Array.prototype.slice.call(el.attributes);\r\n\t\tvar l = attributes.length;\r\n\t\tfor (var i = 0; i < l; i++) {\r\n\t\t\tresult.push({\r\n\t\t\t\tname: attributes[i].name,\r\n\t\t\t\tvalue: attributes[i].value\r\n\t\t\t});\r\n\t\t}\r\n\t\treturn result;\r\n\t};\r\n\r\n\t// helper method\r\n\tvar getOffsetByEvent = function getOffsetByEvent(e) {\r\n\t\treturn {\r\n\t\t\tx: typeof e.offsetX === 'undefined' ? e.layerX : e.offsetX,\r\n\t\t\ty: typeof e.offsetY === 'undefined' ? e.layerY : e.offsetY\r\n\t\t};\r\n\t};\r\n\r\n\t// merge two objects together\r\n\tvar mergeOptions = function mergeOptions(base, additives) {\r\n\r\n\t\tvar key;\r\n\t\tvar options = {};\r\n\t\tvar optionsToMerge = additives || {};\r\n\r\n\t\tfor (key in base) {\r\n\t\t\tif (!base.hasOwnProperty(key)) {\r\n\t\t\t\tcontinue;\r\n\t\t\t}\r\n\t\t\toptions[key] = typeof optionsToMerge[key] === 'undefined' ? base[key] : optionsToMerge[key];\r\n\t\t}\r\n\r\n\t\treturn options;\r\n\t};\r\n\r\n\t// keys\r\n\tvar Key = {\r\n\t\tESC: 27,\r\n\t\tRETURN: 13\r\n\t};\r\n\r\n\t// pointer events\r\n\tvar Events = {\r\n\t\tDOWN: ['touchstart', 'pointerdown', 'mousedown'],\r\n\t\tMOVE: ['touchmove', 'pointermove', 'mousemove'],\r\n\t\tUP: ['touchend', 'touchcancel', 'pointerup', 'mouseup']\r\n\t};\r\n\r\n\tvar MimeTypes = {\r\n\t\t'jpeg': 'image/jpeg',\r\n\t\t'jpg': 'image/jpeg',\r\n\t\t'jpe': 'image/jpeg',\r\n\t\t'png': 'image/png',\r\n\t\t'gif': 'image/gif',\r\n\t\t'bmp': 'image/bmp'\r\n\t};\r\n\r\n\tvar ImageExtensionsRegex = /(\\.png|\\.bmp|\\.gif|\\.jpg|\\.jpe|\\.jpg|\\.jpeg)$/;\r\n\r\n\tvar CanvasExportExtensions = /(jpe|jpg|jpeg|png)/;\r\n\r\n\t// shortcuts\r\n\tvar create = function create(name, className) {\r\n\t\tvar node = document.createElement(name);\r\n\t\tif (className) {\r\n\t\t\tnode.className = className;\r\n\t\t}\r\n\t\treturn node;\r\n\t};\r\n\r\n\t// events\r\n\tvar addEvents = function addEvents(obj, events, scope) {\r\n\t\tevents.forEach(function (event) {\r\n\t\t\tobj.addEventListener(event, scope, false);\r\n\t\t});\r\n\t};\r\n\r\n\tvar removeEvents = function removeEvents(obj, events, scope) {\r\n\t\tevents.forEach(function (event) {\r\n\t\t\tobj.removeEventListener(event, scope, false);\r\n\t\t});\r\n\t};\r\n\r\n\tvar getEventOffset = function getEventOffset(e) {\r\n\r\n\t\tvar event = e.changedTouches ? e.changedTouches[0] : e;\r\n\r\n\t\t// no event found, quit!\r\n\t\tif (!event) {\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\t// get offset from events\r\n\t\treturn {\r\n\t\t\tx: event.pageX,\r\n\t\t\ty: event.pageY\r\n\t\t};\r\n\t};\r\n\r\n\tvar rotate = function rotate(rect, angle) {\r\n\r\n\t\tvar cx = .5;\r\n\t\tvar cy = .5;\r\n\r\n\t\tvar radians = Math.PI / 180 * angle;\r\n\t\tvar cos = Math.cos(radians);\r\n\t\tvar sin = Math.sin(radians);\r\n\r\n\t\tvar x1 = rect.x;\r\n\t\tvar y1 = rect.y;\r\n\t\tvar x2 = rect.x + rect.width;\r\n\t\tvar y2 = rect.y + rect.height;\r\n\r\n\t\tvar rx1 = cos * (x1 - cx) + sin * (y1 - cy) + cx;\r\n\t\tvar ry1 = cos * (y1 - cy) - sin * (x1 - cx) + cy;\r\n\r\n\t\tvar rx2 = cos * (x2 - cx) + sin * (y2 - cy) + cx;\r\n\t\tvar ry2 = cos * (y2 - cy) - sin * (x2 - cx) + cy;\r\n\r\n\t\tif (rx1 <= rx2) {\r\n\t\t\trect.x = rx1;\r\n\t\t\trect.width = rx2 - rx1;\r\n\t\t} else {\r\n\t\t\trect.x = rx2;\r\n\t\t\trect.width = rx1 - rx2;\r\n\t\t}\r\n\r\n\t\tif (ry1 <= ry2) {\r\n\t\t\trect.y = ry1;\r\n\t\t\trect.height = ry2 - ry1;\r\n\t\t} else {\r\n\t\t\trect.y = ry2;\r\n\t\t\trect.height = ry1 - ry2;\r\n\t\t}\r\n\t};\r\n\r\n\tvar getEventOffsetScroll = function getEventOffsetScroll(e) {\r\n\t\tvar offset = getEventOffset(e);\r\n\t\toffset.x -= window.pageXOffset || document.documentElement.scrollLeft;\r\n\t\toffset.y -= window.pageYOffset || document.documentElement.scrollTop;\r\n\t\treturn offset;\r\n\t};\r\n\r\n\tvar lowercaseFirstLetter = function lowercaseFirstLetter(string) {\r\n\t\treturn string.charAt(0).toLowerCase() + string.slice(1);\r\n\t};\r\n\r\n\tvar capitalizeFirstLetter = function capitalizeFirstLetter(string) {\r\n\t\treturn string.charAt(0).toUpperCase() + string.slice(1);\r\n\t};\r\n\r\n\tvar last = function last(array) {\r\n\t\treturn array[array.length - 1];\r\n\t};\r\n\r\n\tvar limit = function limit(value, min, max) {\r\n\t\treturn Math.max(min, Math.min(max, value));\r\n\t};\r\n\r\n\tvar inArray = function inArray(needle, arr) {\r\n\t\t// is for loop so we can use this method on older browsers to render fallback message\r\n\t\tif (!arr) {\r\n\t\t\treturn false;\r\n\t\t}\r\n\t\tfor (var i = 0; i < arr.length; i++) {\r\n\t\t\tif (arr[i] === needle) {\r\n\t\t\t\treturn true;\r\n\t\t\t}\r\n\t\t}\r\n\t\treturn false;\r\n\t};\r\n\r\n\tvar send = function send(url, data, requestDecorator, progress, success, err) {\r\n\r\n\t\tvar xhr = new XMLHttpRequest();\r\n\r\n\t\t// if progress callback defined handle progress events\r\n\t\tif (progress) {\r\n\t\t\txhr.upload.addEventListener('progress', function (e) {\r\n\t\t\t\tprogress(e.loaded, e.total);\r\n\t\t\t});\r\n\t\t}\r\n\r\n\t\t// open the request\r\n\t\txhr.open('POST', url, true);\r\n\r\n\t\t// if request decorator defined pass XMLHttpRequest instance to decorator\r\n\t\tif (requestDecorator) {\r\n\t\t\trequestDecorator(xhr);\r\n\t\t}\r\n\r\n\t\t// handle state changes\r\n\t\txhr.onreadystatechange = function () {\r\n\r\n\t\t\tif (xhr.readyState === 4 && xhr.status >= 200 && xhr.status < 300) {\r\n\r\n\t\t\t\tvar text = xhr.responseText;\r\n\r\n\t\t\t\t// if no data returned from server assume success\r\n\t\t\t\tif (!text.length) {\r\n\t\t\t\t\tsuccess();\r\n\t\t\t\t\treturn;\r\n\t\t\t\t}\r\n\r\n\t\t\t\t// catch possible PHP content length problem\r\n\t\t\t\tif (text.indexOf('Content-Length') !== -1) {\r\n\t\t\t\t\terr('file-too-big');\r\n\t\t\t\t\treturn;\r\n\t\t\t\t}\r\n\r\n\t\t\t\t// if data returned it should be in suggested JSON format\r\n\t\t\t\tvar obj = void 0;\r\n\t\t\t\ttry {\r\n\t\t\t\t\tobj = JSON.parse(xhr.responseText);\r\n\t\t\t\t} catch (e) { }\r\n\r\n\t\t\t\t// if is failure response\r\n\t\t\t\tif ((typeof obj === 'undefined' ? 'undefined' : _typeof(obj)) === 'object' && obj && obj.status === 'failure') {\r\n\t\t\t\t\terr(obj.message);\r\n\t\t\t\t\treturn;\r\n\t\t\t\t}\r\n\r\n\t\t\t\tsuccess(obj || text);\r\n\t\t\t} else if (xhr.readyState === 4) {\r\n\r\n\t\t\t\tvar _obj = void 0;\r\n\t\t\t\ttry {\r\n\t\t\t\t\t_obj = JSON.parse(xhr.responseText);\r\n\t\t\t\t} catch (e) { }\r\n\r\n\t\t\t\t// if is clean failure response\r\n\t\t\t\tif ((typeof _obj === 'undefined' ? 'undefined' : _typeof(_obj)) === 'object' && _obj && _obj.status === 'failure') {\r\n\t\t\t\t\terr(_obj.message);\r\n\t\t\t\t\treturn;\r\n\t\t\t\t}\r\n\r\n\t\t\t\terr('fail');\r\n\t\t\t}\r\n\t\t};\r\n\r\n\t\t// do request\r\n\t\txhr.send(data);\r\n\t};\r\n\r\n\tvar resetTransforms = function resetTransforms(element) {\r\n\t\tif (!element) {\r\n\t\t\treturn;\r\n\t\t}\r\n\t\telement.style.webkitTransform = '';\r\n\t\telement.style.transform = '';\r\n\t};\r\n\r\n\tvar bytesToMegaBytes = function bytesToMegaBytes(b) {\r\n\t\treturn b / 1000000;\r\n\t};\r\n\r\n\tvar megaBytesToBytes = function megaBytesToBytes(mb) {\r\n\t\treturn mb * 1000000;\r\n\t};\r\n\r\n\tvar getCommonMimeTypes = function getCommonMimeTypes() {\r\n\t\tvar types = [];\r\n\t\tvar type = void 0;\r\n\t\tvar mimeType = void 0;\r\n\t\tfor (type in MimeTypes) {\r\n\t\t\tif (!MimeTypes.hasOwnProperty(type)) {\r\n\t\t\t\tcontinue;\r\n\t\t\t}\r\n\t\t\tmimeType = MimeTypes[type];\r\n\t\t\tif (types.indexOf(mimeType) == -1) {\r\n\t\t\t\ttypes.push(mimeType);\r\n\t\t\t}\r\n\t\t}\r\n\t\treturn types;\r\n\t};\r\n\r\n\tvar isJPEGMimeType = function isJPEGMimeType(type) {\r\n\t\treturn type === 'image/jpeg';\r\n\t};\r\n\r\n\tvar getExtensionByMimeType = function getExtensionByMimeType(mimetype) {\r\n\t\tvar type = void 0;\r\n\t\tfor (type in MimeTypes) {\r\n\t\t\tif (!MimeTypes.hasOwnProperty(type)) {\r\n\t\t\t\tcontinue;\r\n\t\t\t}\r\n\t\t\tif (MimeTypes[type] === mimetype) {\r\n\t\t\t\treturn type;\r\n\t\t\t}\r\n\t\t}\r\n\t\treturn mimetype;\r\n\t};\r\n\r\n\tvar getMimeTypeFromResponseType = function getMimeTypeFromResponseType(responseType) {\r\n\t\tvar type = void 0;\r\n\t\tfor (type in MimeTypes) {\r\n\t\t\tif (!MimeTypes.hasOwnProperty(type)) {\r\n\t\t\t\tcontinue;\r\n\t\t\t}\r\n\t\t\tif (responseType.indexOf(MimeTypes[type]) !== -1) {\r\n\t\t\t\treturn MimeTypes[type];\r\n\t\t\t}\r\n\t\t}\r\n\t\treturn null;\r\n\t};\r\n\r\n\tvar getFileName = function getFileName(path) {\r\n\t\treturn path.split('/').pop().split('?').shift();\r\n\t};\r\n\r\n\tvar leftPad = function leftPad(value) {\r\n\t\tvar padding = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : '';\r\n\t\treturn (padding + value).slice(-padding.length);\r\n\t};\r\n\r\n\tvar getDateString = function getDateString(date) {\r\n\t\treturn date.getFullYear() + '-' + leftPad(date.getMonth() + 1, '00') + '-' + leftPad(date.getDate(), '00') + '_' + leftPad(date.getHours(), '00') + '-' + leftPad(date.getMinutes(), '00') + '-' + leftPad(date.getSeconds(), '00');\r\n\t};\r\n\r\n\tvar getFileNameByFile = function getFileNameByFile(file) {\r\n\t\tif (typeof file.name === 'undefined') {\r\n\t\t\treturn getDateString(new Date()) + '.' + getExtensionByMimeType(getFileTypeByFile(file));\r\n\t\t}\r\n\t\treturn file.name;\r\n\t};\r\n\r\n\tvar getFileTypeByFile = function getFileTypeByFile(file) {\r\n\t\treturn file.type || 'image/jpeg';\r\n\t};\r\n\r\n\tvar getFileNameWithoutExtension = function getFileNameWithoutExtension(path) {\r\n\t\tif (typeof path !== 'string') {\r\n\t\t\treturn getDateString(new Date());\r\n\t\t}\r\n\t\tvar name = getFileName(path);\r\n\t\treturn name.split('.').shift();\r\n\t};\r\n\r\n\tvar blobToFile = function blobToFile(blob, name) {\r\n\t\tblob.lastModifiedDate = new Date();\r\n\t\tblob.name = name;\r\n\t\treturn blob;\r\n\t};\r\n\r\n\tvar resourceIsFetchURL = function resourceIsFetchURL(resource) {\r\n\t\treturn (/^fetch\\//.test(resource)\r\n\t\t);\r\n\t};\r\n\r\n\tvar resourceIsBase64Data = function resourceIsBase64Data(resource) {\r\n\t\treturn (/^data:image/.test(resource)\r\n\t\t);\r\n\t};\r\n\r\n\tvar loadRemoteURL = function loadRemoteURL(fetcher, url, err, cb) {\r\n\r\n\t\tvar xhr = new XMLHttpRequest();\r\n\t\txhr.open('GET', fetcher + '?url=' + url, true);\r\n\t\txhr.responseType = 'json';\r\n\t\txhr.onload = function (e) {\r\n\r\n\t\t\tif (this.response.status === 'failure') {\r\n\t\t\t\terr(this.response.message);\r\n\t\t\t\treturn;\r\n\t\t\t}\r\n\r\n\t\t\tloadURL(this.response.body, cb);\r\n\t\t};\r\n\r\n\t\txhr.send();\r\n\t};\r\n\r\n\tvar loadURL = function loadURL(url, cb) {\r\n\r\n\t\tvar xhr = new XMLHttpRequest();\r\n\t\txhr.open('GET', url, true);\r\n\t\txhr.responseType = 'blob';\r\n\t\txhr.onload = function (e) {\r\n\r\n\t\t\tvar name = getFileName(url);\r\n\t\t\tvar type = getMimeTypeFromResponseType(this.response.type);\r\n\r\n\t\t\tif (!ImageExtensionsRegex.test(name)) {\r\n\t\t\t\tname += '.' + getExtensionByMimeType(type);\r\n\t\t\t}\r\n\r\n\t\t\t// get as file\r\n\t\t\tvar file = blobToFile(this.response, name);\r\n\r\n\t\t\t// need to set correct type\r\n\t\t\tcb(cloneFile(file, type));\r\n\t\t};\r\n\r\n\t\txhr.send();\r\n\t};\r\n\r\n\tvar base64ToByteString = function base64ToByteString(dataURI) {\r\n\r\n\t\t// get data part of string (remove data:image/jpeg...,)\r\n\t\tvar dataPart = dataURI.split(',')[1];\r\n\r\n\t\t// remove any whitespace as that causes InvalidCharacterError in IE\r\n\t\tvar dataPartCleaned = dataPart.replace(/\\s/g, '');\r\n\r\n\t\t// to bytestring\r\n\t\treturn atob(dataPartCleaned);\r\n\t};\r\n\r\n\tvar base64ToBlob = function base64ToBlob(dataURI, filename) {\r\n\r\n\t\tvar byteString = base64ToByteString(dataURI);\r\n\t\tvar ab = new ArrayBuffer(byteString.length);\r\n\t\tvar ia = new Uint8Array(ab);\r\n\r\n\t\tfor (var i = 0; i < byteString.length; i++) {\r\n\t\t\tia[i] = byteString.charCodeAt(i);\r\n\t\t}\r\n\r\n\t\tvar mimeType = getMimeTypeFromDataURI(dataURI);\r\n\r\n\t\tif (typeof filename === 'undefined') {\r\n\t\t\tfilename = getDateString(new Date()) + '.' + getExtensionByMimeType(mimeType);\r\n\t\t}\r\n\r\n\t\treturn blobToFile(createBlob(ab, mimeType), filename);\r\n\t};\r\n\r\n\tvar createBlob = function createBlob(data, mimeType) {\r\n\r\n\t\tvar BB = window.BlobBuilder = window.BlobBuilder || window.WebKitBlobBuilder || window.MozBlobBuilder || window.MSBlobBuilder;\r\n\r\n\t\tif (BB) {\r\n\t\t\tvar bb = new BB();\r\n\t\t\tbb.append(data);\r\n\t\t\treturn bb.getBlob(mimeType);\r\n\t\t}\r\n\r\n\t\treturn new Blob([data], {\r\n\t\t\ttype: mimeType\r\n\t\t});\r\n\t};\r\n\r\n\tvar getImageAsCanvas = function getImageAsCanvas(src, size, callback) {\r\n\r\n\t\t// only cross origin when it's not base64 data, to prevent errors in Safari\r\n\t\t// http://stackoverflow.com/questions/31643096/why-does-safari-throw-cors-error-when-setting-base64-data-on-a-crossorigin-an\r\n\t\tvar crossOrigin = typeof src === 'string' ? src.indexOf('data:image') !== 0 : true;\r\n\r\n\t\tloadImage.parseMetaData(src, function (meta) {\r\n\r\n\t\t\tvar options = {\r\n\t\t\t\tcanvas: true,\r\n\t\t\t\tcrossOrigin: crossOrigin\r\n\t\t\t};\r\n\r\n\t\t\tif (size) {\r\n\t\t\t\toptions.maxWidth = size.width;\r\n\t\t\t\toptions.maxHeight = size.height;\r\n\t\t\t}\r\n\r\n\t\t\tif (meta.exif) {\r\n\t\t\t\toptions.orientation = meta.exif.get('Orientation');\r\n\t\t\t}\r\n\r\n\t\t\tloadImage(src, function (res) {\r\n\r\n\t\t\t\tif (res.type === 'error') {\r\n\t\t\t\t\tcallback();\r\n\t\t\t\t\treturn;\r\n\t\t\t\t}\r\n\r\n\t\t\t\tcallback(res, meta);\r\n\t\t\t}, options);\r\n\t\t});\r\n\t};\r\n\r\n\tvar getAutoCropRect = function getAutoCropRect(width, height, ratioOut) {\r\n\r\n\t\tvar x,\r\n\t\t\ty,\r\n\t\t\tw,\r\n\t\t\th,\r\n\t\t\tratioIn = height / width;\r\n\r\n\t\t// if input is portrait and required is landscape\r\n\t\t// width is portrait width, height is width times outputRatio\r\n\t\tif (ratioIn < ratioOut) {\r\n\t\t\th = height;\r\n\t\t\tw = h / ratioOut;\r\n\t\t\tx = (width - w) * .5;\r\n\t\t\ty = 0;\r\n\t\t}\r\n\r\n\t\t// if input is landscape and required is portrait\r\n\t\t// height is landscape height, width is height divided by outputRatio\r\n\t\telse {\r\n\t\t\tw = width;\r\n\t\t\th = w * ratioOut;\r\n\t\t\tx = 0;\r\n\t\t\ty = (height - h) * .5;\r\n\t\t}\r\n\r\n\t\treturn {\r\n\t\t\tx: x,\r\n\t\t\ty: y,\r\n\t\t\theight: h,\r\n\t\t\twidth: w\r\n\t\t};\r\n\t};\r\n\r\n\tvar transformCanvas = function transformCanvas(canvas) {\r\n\t\tvar transforms = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\r\n\t\tvar cb = arguments[2];\r\n\r\n\r\n\t\tvar result = create('canvas');\r\n\r\n\t\tvar rotation = transforms.rotation,\r\n\t\t\tcrop = transforms.crop,\r\n\t\t\tsize = transforms.size,\r\n\t\t\tfilters = transforms.filters;\r\n\r\n\t\t// do crop transforms\r\n\r\n\t\tif (crop) {\r\n\r\n\t\t\t// do crop\r\n\t\t\tvar isTilted = rotation % 180 !== 0;\r\n\t\t\tvar space = {\r\n\t\t\t\twidth: isTilted ? canvas.height : canvas.width,\r\n\t\t\t\theight: isTilted ? canvas.width : canvas.height\r\n\t\t\t};\r\n\r\n\t\t\t// limit crop to size of canvas else safari might return transparent image\r\n\t\t\tif (crop.x < 0) {\r\n\t\t\t\tcrop.x = 0;\r\n\t\t\t}\r\n\r\n\t\t\tif (crop.y < 0) {\r\n\t\t\t\tcrop.y = 0;\r\n\t\t\t}\r\n\r\n\t\t\tif (crop.width > space.width) {\r\n\t\t\t\tcrop.width = space.width;\r\n\t\t\t}\r\n\r\n\t\t\tif (crop.height > space.height) {\r\n\t\t\t\tcrop.height = space.height;\r\n\t\t\t}\r\n\r\n\t\t\tif (crop.y + crop.height > space.height) {\r\n\t\t\t\tcrop.y = Math.max(0, space.height - crop.height);\r\n\t\t\t}\r\n\r\n\t\t\tif (crop.x + crop.width > space.width) {\r\n\t\t\t\tcrop.x = Math.max(0, space.width - crop.width);\r\n\t\t\t}\r\n\r\n\t\t\t// crop offsets in percentages\r\n\t\t\tvar px = crop.x / space.width;\r\n\t\t\tvar py = crop.y / space.height;\r\n\t\t\tvar pw = crop.width / space.width;\r\n\t\t\tvar ph = crop.height / space.height;\r\n\r\n\t\t\t// resize canvas to the final crop result size\r\n\t\t\tresult.width = crop.width;\r\n\t\t\tresult.height = crop.height;\r\n\r\n\t\t\t// draw the crop\r\n\t\t\tvar ctx = result.getContext('2d');\r\n\r\n\t\t\tif (rotation === 90) {\r\n\r\n\t\t\t\tctx.translate(result.width * .5, result.height * .5);\r\n\t\t\t\tctx.rotate(-90 * Math.PI / 180);\r\n\t\t\t\tctx.drawImage(canvas,\r\n\r\n\t\t\t\t\t// source rectangle (crop area)\r\n\t\t\t\t\t(1 - py) * canvas.width - canvas.width * ph, crop.x, crop.height, crop.width,\r\n\r\n\t\t\t\t\t// target area (cover)\r\n\t\t\t\t\t-result.height * .5, -result.width * .5, result.height, result.width);\r\n\t\t\t} else if (rotation === 180) {\r\n\r\n\t\t\t\tctx.translate(result.width * .5, result.height * .5);\r\n\t\t\t\tctx.rotate(-180 * Math.PI / 180);\r\n\t\t\t\tctx.drawImage(canvas,\r\n\r\n\t\t\t\t\t// source rectangle (crop area)\r\n\t\t\t\t\t(1 - (px + pw)) * space.width, (1 - (py + ph)) * space.height, pw * space.width, ph * space.height,\r\n\r\n\t\t\t\t\t// target area (cover)\r\n\t\t\t\t\t-result.width * .5, -result.height * .5, result.width, result.height);\r\n\t\t\t} else if (rotation === 270) {\r\n\r\n\t\t\t\tctx.translate(result.width * .5, result.height * .5);\r\n\t\t\t\tctx.rotate(-270 * Math.PI / 180);\r\n\t\t\t\tctx.drawImage(canvas,\r\n\r\n\t\t\t\t\t// source rectangle (crop area)\r\n\t\t\t\t\tcrop.y, (1 - px) * canvas.height - canvas.height * pw, crop.height, crop.width,\r\n\r\n\t\t\t\t\t// target area (cover)\r\n\t\t\t\t\t-result.height * .5, -result.width * .5, result.height, result.width);\r\n\t\t\t} else {\r\n\r\n\t\t\t\tctx.drawImage(canvas,\r\n\r\n\t\t\t\t\t// source rectangle (crop area)\r\n\t\t\t\t\tcrop.x, crop.y, crop.width, crop.height,\r\n\r\n\t\t\t\t\t// target area (cover)\r\n\t\t\t\t\t0, 0, result.width, result.height);\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\t// do size transforms\r\n\t\tif (size) {\r\n\r\n\t\t\tvar scalarX = size.width / result.width;\r\n\t\t\tvar scalarY = size.height / result.height;\r\n\t\t\tvar scalar = Math.min(scalarX, scalarY);\r\n\r\n\t\t\tscaleCanvas(result, scalar, size);\r\n\r\n\t\t\t// sharpen result\r\n\t\t\tif (filters.sharpen > 0) {\r\n\t\t\t\tfilter(result, sharpen(filters.sharpen));\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tcb(result);\r\n\t};\r\n\r\n\tfunction scaleCanvas(canvas, scalar, bounds) {\r\n\r\n\t\t// if not scaling down, bail out\r\n\t\tif (scalar >= 1) {\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tvar targetWidth = Math.min(bounds.width, Math.round(canvas.width * scalar));\r\n\t\tvar targetHeight = Math.min(bounds.height, Math.round(canvas.height * scalar));\r\n\t\tvar w = canvas.width;\r\n\t\tvar h = canvas.height;\r\n\t\tvar tmp = canvas;\r\n\t\tvar c = void 0;\r\n\t\tvar ctx = void 0;\r\n\r\n\t\twhile (w > targetWidth && h > targetHeight) {\r\n\r\n\t\t\tc = document.createElement('canvas');\r\n\t\t\tw = Math.round(tmp.width * .5);\r\n\t\t\th = Math.round(tmp.height * .5);\r\n\r\n\t\t\tif (w < targetWidth) {\r\n\t\t\t\tw = targetWidth;\r\n\t\t\t}\r\n\r\n\t\t\tif (h < targetHeight) {\r\n\t\t\t\th = targetHeight;\r\n\t\t\t}\r\n\r\n\t\t\tc.width = w;\r\n\t\t\tc.height = h;\r\n\t\t\tctx = c.getContext('2d');\r\n\t\t\tctx.drawImage(tmp, 0, 0, w, h);\r\n\r\n\t\t\ttmp = cloneCanvas(c);\r\n\t\t}\r\n\r\n\t\tcanvas.width = targetWidth;\r\n\t\tcanvas.height = targetHeight;\r\n\t\tctx = canvas.getContext('2d');\r\n\t\tctx.drawImage(tmp, 0, 0, targetWidth, targetHeight);\r\n\t}\r\n\r\n\tvar getPixels = function getPixels(canvas) {\r\n\t\tvar ctx = canvas.getContext('2d');\r\n\t\treturn ctx.getImageData(0, 0, canvas.width, canvas.height);\r\n\t};\r\n\r\n\tvar filter = function filter(canvas, _filter) {\r\n\t\tvar ctx = canvas.getContext('2d');\r\n\t\tctx.putImageData(_filter(getPixels(canvas), canvas.width, canvas.height), 0, 0);\r\n\t};\r\n\r\n\tvar createImageData = function createImageData(w, h, pixels) {\r\n\t\tvar c = document.createElement('canvas');\r\n\t\tc.width = w;\r\n\t\tc.height = h;\r\n\t\tvar ctx = c.getContext('2d');\r\n\t\tvar data = ctx.createImageData(c.width, c.height);\r\n\t\tif (pixels) {\r\n\t\t\tdata.set(pixels.data);\r\n\t\t}\r\n\t\treturn data;\r\n\t};\r\n\r\n\tvar sharpen = function sharpen(mix) {\r\n\r\n\t\treturn function (pixels, w, h) {\r\n\r\n\t\t\tvar weights = [0, -1, 0, -1, 5, -1, 0, -1, 0],\r\n\t\t\t\tkatet = Math.round(Math.sqrt(weights.length)),\r\n\t\t\t\thalf = katet * 0.5 | 0,\r\n\t\t\t\tdstData = createImageData(w, h),\r\n\t\t\t\tdstBuff = dstData.data,\r\n\t\t\t\tsrcBuff = pixels.data,\r\n\t\t\t\ty = h,\r\n\t\t\t\tx = void 0;\r\n\r\n\t\t\twhile (y--) {\r\n\r\n\t\t\t\tx = w;\r\n\r\n\t\t\t\twhile (x--) {\r\n\r\n\t\t\t\t\tvar sy = y,\r\n\t\t\t\t\t\tsx = x,\r\n\t\t\t\t\t\tdstOff = (y * w + x) * 4,\r\n\t\t\t\t\t\tr = 0,\r\n\t\t\t\t\t\tg = 0,\r\n\t\t\t\t\t\tb = 0,\r\n\t\t\t\t\t\ta = 0;\r\n\r\n\t\t\t\t\tfor (var cy = 0; cy < katet; cy++) {\r\n\t\t\t\t\t\tfor (var cx = 0; cx < katet; cx++) {\r\n\r\n\t\t\t\t\t\t\tvar scy = sy + cy - half;\r\n\t\t\t\t\t\t\tvar scx = sx + cx - half;\r\n\r\n\t\t\t\t\t\t\tif (scy >= 0 && scy < h && scx >= 0 && scx < w) {\r\n\r\n\t\t\t\t\t\t\t\tvar srcOff = (scy * w + scx) * 4;\r\n\t\t\t\t\t\t\t\tvar wt = weights[cy * katet + cx];\r\n\r\n\t\t\t\t\t\t\t\tr += srcBuff[srcOff] * wt;\r\n\t\t\t\t\t\t\t\tg += srcBuff[srcOff + 1] * wt;\r\n\t\t\t\t\t\t\t\tb += srcBuff[srcOff + 2] * wt;\r\n\t\t\t\t\t\t\t\ta += srcBuff[srcOff + 3] * wt;\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\tdstBuff[dstOff] = r * mix + srcBuff[dstOff] * (1 - mix);\r\n\t\t\t\t\tdstBuff[dstOff + 1] = g * mix + srcBuff[dstOff + 1] * (1 - mix);\r\n\t\t\t\t\tdstBuff[dstOff + 2] = b * mix + srcBuff[dstOff + 2] * (1 - mix);\r\n\t\t\t\t\tdstBuff[dstOff + 3] = srcBuff[dstOff + 3];\r\n\t\t\t\t}\r\n\t\t\t}\r\n\r\n\t\t\treturn dstData;\r\n\t\t};\r\n\t};\r\n\r\n\tvar sizeDist = function sizeDist(rect, canvas) {\r\n\r\n\t\tvar dx = Math.abs(rect.width - canvas.width);\r\n\t\tvar dy = Math.abs(rect.height - canvas.height);\r\n\r\n\t\treturn Math.max(dx, dy);\r\n\t};\r\n\r\n\tvar cloneCanvas = function cloneCanvas(original) {\r\n\t\treturn cloneCanvasScaled(original, 1);\r\n\t};\r\n\r\n\tvar cloneCanvasScaled = function cloneCanvasScaled(original, scalar) {\r\n\r\n\t\tif (!original) {\r\n\t\t\treturn null;\r\n\t\t}\r\n\r\n\t\tvar duplicate = document.createElement('canvas');\r\n\t\tvar ctx = duplicate.getContext('2d');\r\n\t\tduplicate.width = original.width;\r\n\t\tduplicate.height = original.height;\r\n\t\tctx.drawImage(original, 0, 0);\r\n\t\tif (scalar > 0 && scalar != 1) {\r\n\t\t\tscaleCanvas(duplicate, scalar, {\r\n\t\t\t\twidth: Math.round(original.width * scalar),\r\n\t\t\t\theight: Math.round(original.height * scalar)\r\n\t\t\t});\r\n\t\t}\r\n\r\n\t\treturn duplicate;\r\n\t};\r\n\r\n\tvar canvasHasDimensions = function canvasHasDimensions(canvas) {\r\n\t\treturn canvas.width && canvas.height;\r\n\t};\r\n\r\n\tvar copyCanvas = function copyCanvas(original, destination) {\r\n\r\n\t\tvar ctx = destination.getContext('2d');\r\n\t\tif (canvasHasDimensions(destination)) {\r\n\t\t\tctx.drawImage(original, 0, 0, destination.width, destination.height);\r\n\t\t} else {\r\n\t\t\tdestination.width = original.width;\r\n\t\t\tdestination.height = original.height;\r\n\t\t\tctx.drawImage(original, 0, 0);\r\n\t\t}\r\n\t};\r\n\r\n\tvar clearCanvas = function clearCanvas(canvas) {\r\n\t\tvar ctx = canvas.getContext('2d');\r\n\t\tctx.clearRect(0, 0, canvas.width, canvas.height);\r\n\t};\r\n\r\n\tvar blurCanvas = function blurCanvas(canvas) {\r\n\t\tstackBlur(canvas, 0, 0, canvas.width, canvas.height, 3);\r\n\t};\r\n\r\n\tvar covers = function covers(image, rect) {\r\n\t\treturn parseInt(image.width, 10) >= rect.width && parseInt(image.height, 10) >= rect.height;\r\n\t};\r\n\r\n\tvar scaleRect = function scaleRect(rect, w, h) {\r\n\t\treturn {\r\n\t\t\tx: rect.x * w,\r\n\t\t\ty: rect.y * h,\r\n\t\t\twidth: rect.width * w,\r\n\t\t\theight: rect.height * h\r\n\t\t};\r\n\t};\r\n\r\n\tvar divideRect = function divideRect(rect, w, h) {\r\n\t\treturn {\r\n\t\t\tx: rect.x / w,\r\n\t\t\ty: rect.y / h,\r\n\t\t\twidth: rect.width / w,\r\n\t\t\theight: rect.height / h\r\n\t\t};\r\n\t};\r\n\r\n\tvar resetFileInput = function resetFileInput(input) {\r\n\r\n\t\t// no value, no need to reset\r\n\t\tif (!input || input.value === '') {\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\ttry {\r\n\t\t\t// for modern browsers\r\n\t\t\tinput.value = '';\r\n\t\t} catch (err) { }\r\n\r\n\t\t// for IE10\r\n\t\tif (input.value) {\r\n\r\n\t\t\t// quickly append input to temp form and reset form\r\n\t\t\tvar form = document.createElement('form');\r\n\t\t\tvar parentNode = input.parentNode;\r\n\t\t\tvar ref = input.nextSibling;\r\n\t\t\tform.appendChild(input);\r\n\t\t\tform.reset();\r\n\r\n\t\t\t// re-inject input where it originally was\r\n\t\t\tif (ref) {\r\n\t\t\t\tparentNode.insertBefore(input, ref);\r\n\t\t\t} else {\r\n\t\t\t\tparentNode.appendChild(input);\r\n\t\t\t}\r\n\t\t}\r\n\t};\r\n\r\n\tvar clone = function clone(obj) {\r\n\t\tif ((typeof value === 'undefined' ? 'undefined' : _typeof(value)) === 'object' && value !== null) {\r\n\t\t\treturn JSON.parse(JSON.stringify(obj));\r\n\t\t}\r\n\t\treturn obj;\r\n\t};\r\n\r\n\tvar cloneFile = function cloneFile(file) {\r\n\t\tvar type = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : null;\r\n\r\n\t\tif (!file) {\r\n\t\t\treturn null;\r\n\t\t}\r\n\t\tvar dupe = file.slice(0, file.size, type || file.type);\r\n\t\tdupe.name = file.name;\r\n\t\tif (file.lastModifiedDate) {\r\n\t\t\tdupe.lastModifiedDate = new Date(file.lastModifiedDate);\r\n\t\t}\r\n\t\treturn dupe;\r\n\t};\r\n\r\n\tvar cloneData = function cloneData(obj) {\r\n\t\tvar dupe = clone(obj);\r\n\t\tdupe.input.file = cloneFile(obj.input.file);\r\n\t\tdupe.output.image = cloneCanvas(obj.output.image);\r\n\t\treturn dupe;\r\n\t};\r\n\r\n\t/**\r\n\t * @param image\r\n\t * @param type\r\n\t * @param jpegCompression - value between 0 and 100 or undefined/null to use default compression\r\n\t * @returns {*}\r\n\t */\r\n\tvar toDataURL = function toDataURL(image, type, jpegCompression) {\r\n\t\tif (!image || !type) {\r\n\t\t\treturn null;\r\n\t\t}\r\n\t\treturn image.toDataURL(type, isJPEGMimeType(type) && typeof jpegCompression === 'number' ? jpegCompression / 100 : undefined);\r\n\t};\r\n\r\n\tvar getMimeTypeFromDataURI = function getMimeTypeFromDataURI(dataUri) {\r\n\t\tif (!dataUri) {\r\n\t\t\treturn null;\r\n\t\t}\r\n\t\tvar matches = dataUri.substr(0, 16).match(/^.+;/);\r\n\t\tif (matches.length) {\r\n\t\t\treturn matches[0].substring(5, matches[0].length - 1);\r\n\t\t}\r\n\t\treturn null;\r\n\t};\r\n\r\n\tvar flattenData = function flattenData(obj) {\r\n\t\tvar props = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : [];\r\n\t\tvar jpegCompression = arguments[2];\r\n\t\tvar forcedType = arguments[3];\r\n\t\tvar async = arguments[4];\r\n\r\n\r\n\t\tvar data = {\r\n\t\t\tserver: clone(obj.server),\r\n\t\t\tmeta: clone(obj.meta),\r\n\t\t\tinput: {\r\n\t\t\t\tname: obj.input.name,\r\n\t\t\t\ttype: obj.input.type,\r\n\t\t\t\tsize: obj.input.size,\r\n\t\t\t\twidth: obj.input.width,\r\n\t\t\t\theight: obj.input.height,\r\n\t\t\t\tfield: obj.input.field\r\n\t\t\t}\r\n\t\t};\r\n\r\n\t\tif (inArray('input', props) && !async) {\r\n\t\t\tdata.input.image = toDataURL(obj.input.image, obj.input.type);\r\n\t\t}\r\n\r\n\t\tif (inArray('output', props)) {\r\n\r\n\t\t\tdata.output = {\r\n\t\t\t\tname: forcedType ? getFileNameWithoutExtension(obj.input.name) + '.' + forcedType : obj.input.name,\r\n\t\t\t\ttype: MimeTypes[forcedType] || obj.input.type,\r\n\t\t\t\twidth: obj.output.width,\r\n\t\t\t\theight: obj.output.height\r\n\t\t\t};\r\n\r\n\t\t\tdata.output.image = toDataURL(obj.output.image, data.output.type, jpegCompression);\r\n\t\t\tdata.output.type = getMimeTypeFromDataURI(data.output.image);\r\n\r\n\t\t\t// browser problem:\r\n\t\t\t// if output is of type png and input was of type jpeg we need to fix extension of filename\r\n\t\t\t// so instead of testing the above situation we just always fix extension when handling PNGs\r\n\t\t\tif (data.output.type === 'image/png') {\r\n\t\t\t\tdata.output.name = getFileNameWithoutExtension(data.input.name) + '.png';\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tif (inArray('actions', props)) {\r\n\t\t\tdata.actions = clone(obj.actions);\r\n\t\t}\r\n\r\n\t\treturn data;\r\n\t};\r\n\r\n\tvar downloadCanvas = function downloadCanvas(data, jpegCompression, forcedType) {\r\n\r\n\t\tvar canvas = data.output.image;\r\n\t\tvar filename = forcedType ? getFileNameWithoutExtension(data.input.name) + '.' + forcedType : data.input.name;\r\n\t\tvar type = MimeTypes[forcedType] || data.input.type;\r\n\r\n\t\t// browser problem:\r\n\t\t// if output is of type png and input was of type jpeg we need to fix extension of filename\r\n\t\t// so instead of testing the above situation we just always fix extension when handling PNGs\r\n\t\tif (type === 'image/png') {\r\n\t\t\tfilename = getFileNameWithoutExtension(data.input.name) + '.png';\r\n\t\t}\r\n\r\n\t\tcanvas.toBlob(function (blob) {\r\n\r\n\t\t\tif ('msSaveBlob' in window.navigator) {\r\n\t\t\t\twindow.navigator.msSaveBlob(blob, filename);\r\n\t\t\t\treturn;\r\n\t\t\t}\r\n\r\n\t\t\tvar url = (window.URL || window.webkitURL).createObjectURL(blob);\r\n\r\n\t\t\t// setup hidden link\r\n\t\t\tvar link = create('a');\r\n\t\t\tlink.style.display = 'none';\r\n\t\t\tlink.download = filename;\r\n\t\t\tlink.href = url;\r\n\r\n\t\t\t// attach to DOM otherwise this does not work in Firefox\r\n\t\t\tdocument.body.appendChild(link);\r\n\r\n\t\t\t// fire click\r\n\t\t\tlink.click();\r\n\r\n\t\t\t// delay on remove otherwise does not work in Firefox\r\n\t\t\tsetTimeout(function () {\r\n\t\t\t\tdocument.body.removeChild(link);\r\n\t\t\t\t(window.URL || window.webkitURL).revokeObjectURL(url);\r\n\t\t\t}, 0);\r\n\t\t}, type, typeof jpegCompression === 'number' ? jpegCompression / 100 : undefined);\r\n\t};\r\n\r\n\tvar toggleDisplayBySelector = function toggleDisplayBySelector(selector, enabled, root) {\r\n\t\tvar node = root.querySelector(selector);\r\n\t\tif (!node) {\r\n\t\t\treturn;\r\n\t\t}\r\n\t\tnode.style.display = enabled ? '' : 'none';\r\n\t};\r\n\r\n\tvar nodeListToArray = function nodeListToArray(nl) {\r\n\t\treturn Array.prototype.slice.call(nl);\r\n\t};\r\n\r\n\tvar removeElement = function removeElement(el) {\r\n\t\tel.parentNode.removeChild(el);\r\n\t};\r\n\r\n\tvar wrap = function wrap(element) {\r\n\t\tvar wrapper = create('div');\r\n\t\tif (element.parentNode) {\r\n\t\t\tif (element.nextSibling) {\r\n\t\t\t\telement.parentNode.insertBefore(wrapper, element.nextSibling);\r\n\t\t\t} else {\r\n\t\t\t\telement.parentNode.appendChild(wrapper);\r\n\t\t\t}\r\n\t\t}\r\n\t\twrapper.appendChild(element);\r\n\t\treturn wrapper;\r\n\t};\r\n\r\n\tvar polarToCartesian = function polarToCartesian(centerX, centerY, radius, angleInDegrees) {\r\n\t\tvar angleInRadians = (angleInDegrees - 90) * Math.PI / 180.0;\r\n\r\n\t\treturn {\r\n\t\t\tx: centerX + radius * Math.cos(angleInRadians),\r\n\t\t\ty: centerY + radius * Math.sin(angleInRadians)\r\n\t\t};\r\n\t};\r\n\r\n\tvar describeArc = function describeArc(x, y, radius, startAngle, endAngle) {\r\n\r\n\t\tvar start = polarToCartesian(x, y, radius, endAngle);\r\n\t\tvar end = polarToCartesian(x, y, radius, startAngle);\r\n\r\n\t\tvar arcSweep = endAngle - startAngle <= 180 ? '0' : '1';\r\n\r\n\t\tvar d = ['M', start.x, start.y, 'A', radius, radius, 0, arcSweep, 0, end.x, end.y].join(' ');\r\n\r\n\t\treturn d;\r\n\t};\r\n\r\n\tvar percentageArc = function percentageArc(x, y, radius, p) {\r\n\t\treturn describeArc(x, y, radius, 0, p * 360);\r\n\t};\r\n\tvar CropArea = function () {\r\n\r\n\t\tvar resizers = {\r\n\t\t\t'n': function n(rect, offset, space, ratio) {\r\n\r\n\t\t\t\tvar t, r, b, l, w, h, p, d;\r\n\r\n\t\t\t\t// bottom is fixed\r\n\t\t\t\tb = rect.y + rect.height;\r\n\r\n\t\t\t\t// intended top\r\n\t\t\t\tt = limit(offset.y, 0, b);\r\n\r\n\t\t\t\t// if is too small vertically\r\n\t\t\t\tif (b - t < space.min.height) {\r\n\t\t\t\t\tt = b - space.min.height;\r\n\t\t\t\t}\r\n\r\n\t\t\t\t// if should scale by ratio, pick width by ratio of new height\r\n\t\t\t\tw = ratio ? (b - t) / ratio : rect.width;\r\n\r\n\t\t\t\t// check if has fallen below min width or height\r\n\t\t\t\tif (w < space.min.width) {\r\n\t\t\t\t\tw = space.min.width;\r\n\t\t\t\t\tif (ratio) {\r\n\t\t\t\t\t\tt = b - w * ratio;\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\r\n\t\t\t\t// add half to left and half to right edge\r\n\t\t\t\tp = (w - rect.width) * .5;\r\n\t\t\t\tl = rect.x - p;\r\n\t\t\t\tr = rect.x + rect.width + p;\r\n\r\n\t\t\t\t// check if any of the edges has moved out of the available space, if so,\r\n\t\t\t\t// set max size of rectangle from original position\r\n\t\t\t\tif (l < 0 || r > space.width) {\r\n\r\n\t\t\t\t\t// smallest distance to edge of space\r\n\t\t\t\t\td = Math.min(rect.x, space.width - (rect.x + rect.width));\r\n\r\n\t\t\t\t\t// new left and right offsets\r\n\t\t\t\t\tl = rect.x - d;\r\n\t\t\t\t\tr = rect.x + rect.width + d;\r\n\r\n\t\t\t\t\t// resulting width\r\n\t\t\t\t\tw = r - l;\r\n\r\n\t\t\t\t\t// resulting height based on ratio\r\n\t\t\t\t\tif (ratio) {\r\n\t\t\t\t\t\th = w * ratio;\r\n\t\t\t\t\t}\r\n\r\n\t\t\t\t\t// new top position\r\n\t\t\t\t\tt = b - h;\r\n\t\t\t\t}\r\n\r\n\t\t\t\treturn {\r\n\t\t\t\t\tx: l,\r\n\t\t\t\t\ty: t,\r\n\t\t\t\t\twidth: r - l,\r\n\t\t\t\t\theight: b - t\r\n\t\t\t\t};\r\n\t\t\t},\r\n\t\t\t's': function s(rect, offset, space, ratio) {\r\n\r\n\t\t\t\tvar t, r, b, l, w, h, p, d;\r\n\r\n\t\t\t\t// top is fixed\r\n\t\t\t\tt = rect.y;\r\n\r\n\t\t\t\t// intended bottom\r\n\t\t\t\tb = limit(offset.y, t, space.height);\r\n\r\n\t\t\t\t// if is too small vertically\r\n\t\t\t\tif (b - t < space.min.height) {\r\n\t\t\t\t\tb = t + space.min.height;\r\n\t\t\t\t}\r\n\r\n\t\t\t\t// if should scale by ratio, pick width by ratio of new height\r\n\t\t\t\tw = ratio ? (b - t) / ratio : rect.width;\r\n\r\n\t\t\t\t// check if has fallen below min width or height\r\n\t\t\t\tif (w < space.min.width) {\r\n\t\t\t\t\tw = space.min.width;\r\n\t\t\t\t\tif (ratio) {\r\n\t\t\t\t\t\tb = t + w * ratio;\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\r\n\t\t\t\t// add half to left and half to right edge\r\n\t\t\t\tp = (w - rect.width) * .5;\r\n\t\t\t\tl = rect.x - p;\r\n\t\t\t\tr = rect.x + rect.width + p;\r\n\r\n\t\t\t\t// check if any of the edges has moved out of the available space, if so,\r\n\t\t\t\t// set max size of rectangle from original position\r\n\t\t\t\tif (l < 0 || r > space.width) {\r\n\r\n\t\t\t\t\t// smallest distance to edge of space\r\n\t\t\t\t\td = Math.min(rect.x, space.width - (rect.x + rect.width));\r\n\r\n\t\t\t\t\t// new left and right offsets\r\n\t\t\t\t\tl = rect.x - d;\r\n\t\t\t\t\tr = rect.x + rect.width + d;\r\n\r\n\t\t\t\t\t// resulting width\r\n\t\t\t\t\tw = r - l;\r\n\r\n\t\t\t\t\t// resulting height based on ratio\r\n\t\t\t\t\tif (ratio) {\r\n\t\t\t\t\t\th = w * ratio;\r\n\t\t\t\t\t}\r\n\r\n\t\t\t\t\t// new bottom position\r\n\t\t\t\t\tb = t + h;\r\n\t\t\t\t}\r\n\r\n\t\t\t\treturn {\r\n\t\t\t\t\tx: l,\r\n\t\t\t\t\ty: t,\r\n\t\t\t\t\twidth: r - l,\r\n\t\t\t\t\theight: b - t\r\n\t\t\t\t};\r\n\t\t\t},\r\n\t\t\t'e': function e(rect, offset, space, ratio) {\r\n\r\n\t\t\t\tvar t, r, b, l, w, h, p, d;\r\n\r\n\t\t\t\t// left is fixed\r\n\t\t\t\tl = rect.x;\r\n\r\n\t\t\t\t// intended right edge\r\n\t\t\t\tr = limit(offset.x, l, space.width);\r\n\r\n\t\t\t\t// if is too small vertically\r\n\t\t\t\tif (r - l < space.min.width) {\r\n\t\t\t\t\tr = l + space.min.width;\r\n\t\t\t\t}\r\n\r\n\t\t\t\t// if should scale by ratio, pick height by ratio of new width\r\n\t\t\t\th = ratio ? (r - l) * ratio : rect.height;\r\n\r\n\t\t\t\t// check if has fallen below min width or height\r\n\t\t\t\tif (h < space.min.height) {\r\n\t\t\t\t\th = space.min.height;\r\n\t\t\t\t\tif (ratio) {\r\n\t\t\t\t\t\tr = l + h / ratio;\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\r\n\t\t\t\t// add half to top and bottom\r\n\t\t\t\tp = (h - rect.height) * .5;\r\n\t\t\t\tt = rect.y - p;\r\n\t\t\t\tb = rect.y + rect.height + p;\r\n\r\n\t\t\t\t// check if any of the edges has moved out of the available space, if so,\r\n\t\t\t\t// set max size of rectangle from original position\r\n\t\t\t\tif (t < 0 || b > space.height) {\r\n\r\n\t\t\t\t\t// smallest distance to edge of space\r\n\t\t\t\t\td = Math.min(rect.y, space.height - (rect.y + rect.height));\r\n\r\n\t\t\t\t\t// new top and bottom offsets\r\n\t\t\t\t\tt = rect.y - d;\r\n\t\t\t\t\tb = rect.y + rect.height + d;\r\n\r\n\t\t\t\t\t// resulting height\r\n\t\t\t\t\th = b - t;\r\n\r\n\t\t\t\t\t// resulting width based on ratio\r\n\t\t\t\t\tif (ratio) {\r\n\t\t\t\t\t\tw = h / ratio;\r\n\t\t\t\t\t}\r\n\r\n\t\t\t\t\t// new right position\r\n\t\t\t\t\tr = l + w;\r\n\t\t\t\t}\r\n\r\n\t\t\t\treturn {\r\n\t\t\t\t\tx: l,\r\n\t\t\t\t\ty: t,\r\n\t\t\t\t\twidth: r - l,\r\n\t\t\t\t\theight: b - t\r\n\t\t\t\t};\r\n\t\t\t},\r\n\t\t\t'w': function w(rect, offset, space, ratio) {\r\n\r\n\t\t\t\tvar t, r, b, l, w, h, p, d;\r\n\r\n\t\t\t\t// right is fixed\r\n\t\t\t\tr = rect.x + rect.width;\r\n\r\n\t\t\t\t// intended left edge\r\n\t\t\t\tl = limit(offset.x, 0, r);\r\n\r\n\t\t\t\t// if is too small vertically\r\n\t\t\t\tif (r - l < space.min.width) {\r\n\t\t\t\t\tl = r - space.min.width;\r\n\t\t\t\t}\r\n\r\n\t\t\t\t// if should scale by ratio, pick height by ratio of new width\r\n\t\t\t\th = ratio ? (r - l) * ratio : rect.height;\r\n\r\n\t\t\t\t// check if has fallen below min width or height\r\n\t\t\t\tif (h < space.min.height) {\r\n\t\t\t\t\th = space.min.height;\r\n\t\t\t\t\tif (ratio) {\r\n\t\t\t\t\t\tl = r - h / ratio;\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\r\n\t\t\t\t// add half to top and bottom\r\n\t\t\t\tp = (h - rect.height) * .5;\r\n\t\t\t\tt = rect.y - p;\r\n\t\t\t\tb = rect.y + rect.height + p;\r\n\r\n\t\t\t\t// check if any of the edges has moved out of the available space, if so,\r\n\t\t\t\t// set max size of rectangle from original position\r\n\t\t\t\tif (t < 0 || b > space.height) {\r\n\r\n\t\t\t\t\t// smallest distance to edge of space\r\n\t\t\t\t\td = Math.min(rect.y, space.height - (rect.y + rect.height));\r\n\r\n\t\t\t\t\t// new top and bottom offsets\r\n\t\t\t\t\tt = rect.y - d;\r\n\t\t\t\t\tb = rect.y + rect.height + d;\r\n\r\n\t\t\t\t\t// resulting height\r\n\t\t\t\t\th = b - t;\r\n\r\n\t\t\t\t\t// resulting width based on ratio\r\n\t\t\t\t\tif (ratio) {\r\n\t\t\t\t\t\tw = h / ratio;\r\n\t\t\t\t\t}\r\n\r\n\t\t\t\t\t// new right position\r\n\t\t\t\t\tl = r - w;\r\n\t\t\t\t}\r\n\r\n\t\t\t\treturn {\r\n\t\t\t\t\tx: l,\r\n\t\t\t\t\ty: t,\r\n\t\t\t\t\twidth: r - l,\r\n\t\t\t\t\theight: b - t\r\n\t\t\t\t};\r\n\t\t\t},\r\n\t\t\t'ne': function ne(rect, offset, space, ratio) {\r\n\r\n\t\t\t\tvar t, r, b, l, w, h, d;\r\n\r\n\t\t\t\t// left and bottom are fixed\r\n\t\t\t\tl = rect.x;\r\n\t\t\t\tb = rect.y + rect.height;\r\n\r\n\t\t\t\t// intended right edge\r\n\t\t\t\tr = limit(offset.x, l, space.width);\r\n\r\n\t\t\t\t// if is too small vertically\r\n\t\t\t\tif (r - l < space.min.width) {\r\n\t\t\t\t\tr = l + space.min.width;\r\n\t\t\t\t}\r\n\r\n\t\t\t\t// if should scale by ratio, pick height by ratio of new width\r\n\t\t\t\th = ratio ? (r - l) * ratio : limit(b - offset.y, space.min.height, b);\r\n\r\n\t\t\t\t// check if has fallen below min width or height\r\n\t\t\t\tif (h < space.min.height) {\r\n\t\t\t\t\th = space.min.height;\r\n\t\t\t\t\tif (ratio) {\r\n\t\t\t\t\t\tr = l + h / ratio;\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\r\n\t\t\t\t// add height difference with original height to top\r\n\t\t\t\tt = rect.y - (h - rect.height);\r\n\r\n\t\t\t\t// check if any of the edges has moved out of the available space, if so,\r\n\t\t\t\t// set max size of rectangle from original position\r\n\t\t\t\tif (t < 0 || b > space.height) {\r\n\r\n\t\t\t\t\t// smallest distance to edge of space\r\n\t\t\t\t\td = Math.min(rect.y, space.height - (rect.y + rect.height));\r\n\r\n\t\t\t\t\t// new top and bottom offsets\r\n\t\t\t\t\tt = rect.y - d;\r\n\r\n\t\t\t\t\t// resulting height\r\n\t\t\t\t\th = b - t;\r\n\r\n\t\t\t\t\t// resulting width based on ratio\r\n\t\t\t\t\tif (ratio) {\r\n\t\t\t\t\t\tw = h / ratio;\r\n\t\t\t\t\t}\r\n\r\n\t\t\t\t\t// new right position\r\n\t\t\t\t\tr = l + w;\r\n\t\t\t\t}\r\n\r\n\t\t\t\treturn {\r\n\t\t\t\t\tx: l,\r\n\t\t\t\t\ty: t,\r\n\t\t\t\t\twidth: r - l,\r\n\t\t\t\t\theight: b - t\r\n\t\t\t\t};\r\n\t\t\t},\r\n\t\t\t'se': function se(rect, offset, space, ratio) {\r\n\r\n\t\t\t\tvar t, r, b, l, w, h, d;\r\n\r\n\t\t\t\t// left and top are fixed\r\n\t\t\t\tl = rect.x;\r\n\t\t\t\tt = rect.y;\r\n\r\n\t\t\t\t// intended right edge\r\n\t\t\t\tr = limit(offset.x, l, space.width);\r\n\r\n\t\t\t\t// if is too small vertically\r\n\t\t\t\tif (r - l < space.min.width) {\r\n\t\t\t\t\tr = l + space.min.width;\r\n\t\t\t\t}\r\n\r\n\t\t\t\t// if should scale by ratio, pick height by ratio of new width\r\n\t\t\t\th = ratio ? (r - l) * ratio : limit(offset.y - rect.y, space.min.height, space.height - t);\r\n\r\n\t\t\t\t// check if has fallen below min width or height\r\n\t\t\t\tif (h < space.min.height) {\r\n\t\t\t\t\th = space.min.height;\r\n\t\t\t\t\tif (ratio) {\r\n\t\t\t\t\t\tr = l + h / ratio;\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\r\n\t\t\t\t// add height difference with original height to bottom\r\n\t\t\t\tb = rect.y + rect.height + (h - rect.height);\r\n\r\n\t\t\t\t// check if any of the edges has moved out of the available space, if so,\r\n\t\t\t\t// set max size of rectangle from original position\r\n\t\t\t\tif (t < 0 || b > space.height) {\r\n\r\n\t\t\t\t\t// smallest distance to edge of space\r\n\t\t\t\t\td = Math.min(rect.y, space.height - (rect.y + rect.height));\r\n\r\n\t\t\t\t\t// new bottom offset\r\n\t\t\t\t\tb = rect.y + rect.height + d;\r\n\r\n\t\t\t\t\t// resulting height\r\n\t\t\t\t\th = b - t;\r\n\r\n\t\t\t\t\t// resulting width based on ratio\r\n\t\t\t\t\tif (ratio) {\r\n\t\t\t\t\t\tw = h / ratio;\r\n\t\t\t\t\t}\r\n\r\n\t\t\t\t\t// new right position\r\n\t\t\t\t\tr = l + w;\r\n\t\t\t\t}\r\n\r\n\t\t\t\treturn {\r\n\t\t\t\t\tx: l,\r\n\t\t\t\t\ty: t,\r\n\t\t\t\t\twidth: r - l,\r\n\t\t\t\t\theight: b - t\r\n\t\t\t\t};\r\n\t\t\t},\r\n\t\t\t'sw': function sw(rect, offset, space, ratio) {\r\n\r\n\t\t\t\tvar t, r, b, l, w, h, d;\r\n\r\n\t\t\t\t// right and top are fixed\r\n\t\t\t\tr = rect.x + rect.width;\r\n\t\t\t\tt = rect.y;\r\n\r\n\t\t\t\t// intended left edge\r\n\t\t\t\tl = limit(offset.x, 0, r);\r\n\r\n\t\t\t\t// if is too small vertically\r\n\t\t\t\tif (r - l < space.min.width) {\r\n\t\t\t\t\tl = r - space.min.width;\r\n\t\t\t\t}\r\n\r\n\t\t\t\t// if should scale by ratio, pick height by ratio of new width\r\n\t\t\t\th = ratio ? (r - l) * ratio : limit(offset.y - rect.y, space.min.height, space.height - t);\r\n\r\n\t\t\t\t// check if has fallen below min width or height\r\n\t\t\t\tif (h < space.min.height) {\r\n\t\t\t\t\th = space.min.height;\r\n\t\t\t\t\tif (ratio) {\r\n\t\t\t\t\t\tl = r - h / ratio;\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\r\n\t\t\t\t// add height difference with original height to bottom\r\n\t\t\t\tb = rect.y + rect.height + (h - rect.height);\r\n\r\n\t\t\t\t// check if any of the edges has moved out of the available space, if so,\r\n\t\t\t\t// set max size of rectangle from original position\r\n\t\t\t\tif (t < 0 || b > space.height) {\r\n\r\n\t\t\t\t\t// smallest distance to edge of space\r\n\t\t\t\t\td = Math.min(rect.y, space.height - (rect.y + rect.height));\r\n\r\n\t\t\t\t\t// new bottom offset\r\n\t\t\t\t\tb = rect.y + rect.height + d;\r\n\r\n\t\t\t\t\t// resulting height\r\n\t\t\t\t\th = b - t;\r\n\r\n\t\t\t\t\t// resulting width based on ratio\r\n\t\t\t\t\tif (ratio) {\r\n\t\t\t\t\t\tw = h / ratio;\r\n\t\t\t\t\t}\r\n\r\n\t\t\t\t\t// new left position\r\n\t\t\t\t\tl = r - w;\r\n\t\t\t\t}\r\n\r\n\t\t\t\treturn {\r\n\t\t\t\t\tx: l,\r\n\t\t\t\t\ty: t,\r\n\t\t\t\t\twidth: r - l,\r\n\t\t\t\t\theight: b - t\r\n\t\t\t\t};\r\n\t\t\t},\r\n\t\t\t'nw': function nw(rect, offset, space, ratio) {\r\n\r\n\t\t\t\tvar t, r, b, l, w, h, d;\r\n\r\n\t\t\t\t// right and bottom are fixed\r\n\t\t\t\tr = rect.x + rect.width;\r\n\t\t\t\tb = rect.y + rect.height;\r\n\r\n\t\t\t\t// intended left edge\r\n\t\t\t\tl = limit(offset.x, 0, r);\r\n\r\n\t\t\t\t// if is too small vertically\r\n\t\t\t\tif (r - l < space.min.width) {\r\n\t\t\t\t\tl = r - space.min.width;\r\n\t\t\t\t}\r\n\r\n\t\t\t\t// if should scale by ratio, pick height by ratio of new width\r\n\t\t\t\th = ratio ? (r - l) * ratio : limit(b - offset.y, space.min.height, b);\r\n\r\n\t\t\t\t// check if has fallen below min width or height\r\n\t\t\t\tif (h < space.min.height) {\r\n\t\t\t\t\th = space.min.height;\r\n\t\t\t\t\tif (ratio) {\r\n\t\t\t\t\t\tl = r - h / ratio;\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\r\n\t\t\t\t// add height difference with original height to bottom\r\n\t\t\t\tt = rect.y - (h - rect.height);\r\n\r\n\t\t\t\t// check if any of the edges has moved out of the available space, if so,\r\n\t\t\t\t// set max size of rectangle from original position\r\n\t\t\t\tif (t < 0 || b > space.height) {\r\n\r\n\t\t\t\t\t// smallest distance to edge of space\r\n\t\t\t\t\td = Math.min(rect.y, space.height - (rect.y + rect.height));\r\n\r\n\t\t\t\t\t// new bottom offset\r\n\t\t\t\t\tt = rect.y - d;\r\n\r\n\t\t\t\t\t// resulting height\r\n\t\t\t\t\th = b - t;\r\n\r\n\t\t\t\t\t// resulting width based on ratio\r\n\t\t\t\t\tif (ratio) {\r\n\t\t\t\t\t\tw = h / ratio;\r\n\t\t\t\t\t}\r\n\r\n\t\t\t\t\t// new left position\r\n\t\t\t\t\tl = r - w;\r\n\t\t\t\t}\r\n\r\n\t\t\t\treturn {\r\n\t\t\t\t\tx: l,\r\n\t\t\t\t\ty: t,\r\n\t\t\t\t\twidth: r - l,\r\n\t\t\t\t\theight: b - t\r\n\t\t\t\t};\r\n\t\t\t}\r\n\r\n\t\t};\r\n\r\n\t\t/**\r\n\t * CropArea\r\n\t */\r\n\t\treturn function () {\r\n\t\t\tfunction CropArea() {\r\n\t\t\t\tvar element = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : document.createElement('div');\r\n\r\n\t\t\t\t_classCallCheck(this, CropArea);\r\n\r\n\t\t\t\tthis._element = element;\r\n\r\n\t\t\t\tthis._interaction = null;\r\n\r\n\t\t\t\tthis._minWidth = 0;\r\n\t\t\t\tthis._minHeight = 0;\r\n\r\n\t\t\t\tthis._ratio = null;\r\n\r\n\t\t\t\tthis._rect = {\r\n\t\t\t\t\tx: 0,\r\n\t\t\t\t\ty: 0,\r\n\t\t\t\t\twidth: 0,\r\n\t\t\t\t\theight: 0\r\n\t\t\t\t};\r\n\r\n\t\t\t\tthis._space = {\r\n\t\t\t\t\twidth: 0,\r\n\t\t\t\t\theight: 0\r\n\t\t\t\t};\r\n\r\n\t\t\t\tthis._rectChanged = false;\r\n\r\n\t\t\t\tthis._init();\r\n\t\t\t}\r\n\r\n\t\t\t_createClass(CropArea, [{\r\n\t\t\t\tkey: '_init',\r\n\t\t\t\tvalue: function _init() {\r\n\r\n\t\t\t\t\tthis._element.className = 'slim-crop-area';\r\n\r\n\t\t\t\t\t// lines\r\n\t\t\t\t\tvar lines = create('div', 'grid');\r\n\t\t\t\t\tthis._element.appendChild(lines);\r\n\r\n\t\t\t\t\t// corner & edge resize buttons\r\n\t\t\t\t\tfor (var handler in resizers) {\r\n\t\t\t\t\t\tif (!resizers.hasOwnProperty(handler)) {\r\n\t\t\t\t\t\t\tcontinue;\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t\tvar _btn = create('button', handler);\r\n\t\t\t\t\t\tthis._element.appendChild(_btn);\r\n\t\t\t\t\t}\r\n\t\t\t\t\tvar btn = create('button', 'c');\r\n\t\t\t\t\tthis._element.appendChild(btn);\r\n\r\n\t\t\t\t\taddEvents(document, Events.DOWN, this);\r\n\t\t\t\t}\r\n\t\t\t}, {\r\n\t\t\t\tkey: 'reset',\r\n\t\t\t\tvalue: function reset() {\r\n\r\n\t\t\t\t\tthis._interaction = null;\r\n\r\n\t\t\t\t\tthis._rect = {\r\n\t\t\t\t\t\tx: 0,\r\n\t\t\t\t\t\ty: 0,\r\n\t\t\t\t\t\twidth: 0,\r\n\t\t\t\t\t\theight: 0\r\n\t\t\t\t\t};\r\n\r\n\t\t\t\t\tthis._rectChanged = true;\r\n\r\n\t\t\t\t\tthis._redraw();\r\n\r\n\t\t\t\t\tthis._element.dispatchEvent(new CustomEvent('change'));\r\n\t\t\t\t}\r\n\t\t\t}, {\r\n\t\t\t\tkey: 'rescale',\r\n\t\t\t\tvalue: function rescale(scale) {\r\n\r\n\t\t\t\t\t// no rescale\r\n\t\t\t\t\tif (scale === 1) {\r\n\t\t\t\t\t\treturn;\r\n\t\t\t\t\t}\r\n\r\n\t\t\t\t\tthis._interaction = null;\r\n\r\n\t\t\t\t\tthis._rectChanged = true;\r\n\r\n\t\t\t\t\tthis._rect.x *= scale;\r\n\t\t\t\t\tthis._rect.y *= scale;\r\n\t\t\t\t\tthis._rect.width *= scale;\r\n\t\t\t\t\tthis._rect.height *= scale;\r\n\r\n\t\t\t\t\tthis._redraw();\r\n\r\n\t\t\t\t\tthis._element.dispatchEvent(new CustomEvent('change'));\r\n\t\t\t\t}\r\n\t\t\t}, {\r\n\t\t\t\tkey: 'limit',\r\n\t\t\t\tvalue: function limit(width, height) {\r\n\t\t\t\t\tthis._space.width = width;\r\n\t\t\t\t\tthis._space.height = height;\r\n\t\t\t\t}\r\n\t\t\t}, {\r\n\t\t\t\tkey: 'offset',\r\n\t\t\t\tvalue: function offset(x, y) {\r\n\t\t\t\t\tthis._space.x = x;\r\n\t\t\t\t\tthis._space.y = y;\r\n\t\t\t\t}\r\n\t\t\t}, {\r\n\t\t\t\tkey: 'resize',\r\n\t\t\t\tvalue: function resize(x, y, width, height) {\r\n\r\n\t\t\t\t\tthis._interaction = null;\r\n\r\n\t\t\t\t\tthis._rect = {\r\n\t\t\t\t\t\tx: limit(x, 0, this._space.width - this._minWidth),\r\n\t\t\t\t\t\ty: limit(y, 0, this._space.height - this._minHeight),\r\n\t\t\t\t\t\twidth: limit(width, this._minWidth, this._space.width),\r\n\t\t\t\t\t\theight: limit(height, this._minHeight, this._space.height)\r\n\t\t\t\t\t};\r\n\r\n\t\t\t\t\tthis._rectChanged = true;\r\n\r\n\t\t\t\t\tthis._redraw();\r\n\r\n\t\t\t\t\tthis._element.dispatchEvent(new CustomEvent('change'));\r\n\t\t\t\t}\r\n\t\t\t}, {\r\n\t\t\t\tkey: 'handleEvent',\r\n\t\t\t\tvalue: function handleEvent(e) {\r\n\r\n\t\t\t\t\tswitch (e.type) {\r\n\r\n\t\t\t\t\t\tcase 'touchstart':\r\n\t\t\t\t\t\tcase 'pointerdown':\r\n\t\t\t\t\t\tcase 'mousedown':\r\n\t\t\t\t\t\t\t{\r\n\t\t\t\t\t\t\t\tthis._onStartDrag(e);\r\n\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\tbreak;\r\n\t\t\t\t\t\tcase 'touchmove':\r\n\t\t\t\t\t\tcase 'pointermove':\r\n\t\t\t\t\t\tcase 'mousemove':\r\n\t\t\t\t\t\t\t{\r\n\t\t\t\t\t\t\t\tthis._onDrag(e);\r\n\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\tbreak;\r\n\t\t\t\t\t\tcase 'touchend':\r\n\t\t\t\t\t\tcase 'touchcancel':\r\n\t\t\t\t\t\tcase 'pointerup':\r\n\t\t\t\t\t\tcase 'mouseup':\r\n\t\t\t\t\t\t\t{\r\n\t\t\t\t\t\t\t\tthis._onStopDrag(e);\r\n\t\t\t\t\t\t\t}\r\n\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t}, {\r\n\t\t\t\tkey: '_onStartDrag',\r\n\t\t\t\tvalue: function _onStartDrag(e) {\r\n\r\n\t\t\t\t\t// is not my event?\r\n\t\t\t\t\tif (!this._element.contains(e.target)) {\r\n\t\t\t\t\t\treturn;\r\n\t\t\t\t\t}\r\n\r\n\t\t\t\t\te.preventDefault();\r\n\r\n\t\t\t\t\t// listen to drag related events\r\n\t\t\t\t\taddEvents(document, Events.MOVE, this);\r\n\t\t\t\t\taddEvents(document, Events.UP, this);\r\n\r\n\t\t\t\t\tthis._interaction = {\r\n\t\t\t\t\t\ttype: e.target.className,\r\n\t\t\t\t\t\toffset: getEventOffsetScroll(e)\r\n\t\t\t\t\t};\r\n\r\n\t\t\t\t\tthis._interaction.offset.x -= this._rect.x;\r\n\t\t\t\t\tthis._interaction.offset.y -= this._rect.y;\r\n\r\n\t\t\t\t\t// now dragging\r\n\t\t\t\t\tthis._element.setAttribute('data-dragging', 'true');\r\n\r\n\t\t\t\t\t// start the redraw update loop\r\n\t\t\t\t\tthis._redraw();\r\n\t\t\t\t}\r\n\t\t\t}, {\r\n\t\t\t\tkey: '_onDrag',\r\n\t\t\t\tvalue: function _onDrag(e) {\r\n\r\n\t\t\t\t\te.preventDefault();\r\n\r\n\t\t\t\t\t// get local offset for this event\r\n\t\t\t\t\tvar offset = getEventOffsetScroll(e);\r\n\t\t\t\t\tvar type = this._interaction.type;\r\n\r\n\t\t\t\t\t// drag\r\n\t\t\t\t\tif (type === 'c') {\r\n\r\n\t\t\t\t\t\tthis._rect.x = limit(offset.x - this._interaction.offset.x, 0, this._space.width - this._rect.width);\r\n\t\t\t\t\t\tthis._rect.y = limit(offset.y - this._interaction.offset.y, 0, this._space.height - this._rect.height);\r\n\t\t\t\t\t}\r\n\r\n\t\t\t\t\t// resize\r\n\t\t\t\t\telse if (resizers[type]) {\r\n\t\t\t\t\t\tthis._rect = resizers[type](this._rect, {\r\n\t\t\t\t\t\t\tx: offset.x - this._space.x,\r\n\t\t\t\t\t\t\ty: offset.y - this._space.y\r\n\t\t\t\t\t\t}, {\r\n\t\t\t\t\t\t\t\tx: 0,\r\n\t\t\t\t\t\t\t\ty: 0,\r\n\t\t\t\t\t\t\t\twidth: this._space.width,\r\n\t\t\t\t\t\t\t\theight: this._space.height,\r\n\t\t\t\t\t\t\t\tmin: {\r\n\t\t\t\t\t\t\t\t\twidth: this._minWidth,\r\n\t\t\t\t\t\t\t\t\theight: this._minHeight\r\n\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t}, this._ratio);\r\n\t\t\t\t\t}\r\n\r\n\t\t\t\t\tthis._rectChanged = true;\r\n\r\n\t\t\t\t\t// dispatch\r\n\t\t\t\t\tthis._element.dispatchEvent(new CustomEvent('input'));\r\n\t\t\t\t}\r\n\t\t\t}, {\r\n\t\t\t\tkey: '_onStopDrag',\r\n\t\t\t\tvalue: function _onStopDrag(e) {\r\n\r\n\t\t\t\t\te.preventDefault();\r\n\r\n\t\t\t\t\t// stop listening to drag related events\r\n\t\t\t\t\tremoveEvents(document, Events.MOVE, this);\r\n\t\t\t\t\tremoveEvents(document, Events.UP, this);\r\n\r\n\t\t\t\t\t// no longer interacting, so no need to redraw\r\n\t\t\t\t\tthis._interaction = null;\r\n\r\n\t\t\t\t\t// now dragging\r\n\t\t\t\t\tthis._element.setAttribute('data-dragging', 'false');\r\n\r\n\t\t\t\t\t// fire change event\r\n\t\t\t\t\tthis._element.dispatchEvent(new CustomEvent('change'));\r\n\t\t\t\t}\r\n\t\t\t}, {\r\n\t\t\t\tkey: '_redraw',\r\n\t\t\t\tvalue: function _redraw() {\r\n\t\t\t\t\tvar _this = this;\r\n\r\n\t\t\t\t\tif (this._rectChanged) {\r\n\r\n\t\t\t\t\t\tvar transform = 'translate(' + this._rect.x + 'px,' + this._rect.y + 'px);';\r\n\t\t\t\t\t\tthis._element.style.cssText = '\\n\\t\\t\\t\\t\\t-webkit-transform: ' + transform + ';\\n\\t\\t\\t\\t\\ttransform: ' + transform + ';\\n\\t\\t\\t\\t\\twidth:' + this._rect.width + 'px;\\n\\t\\t\\t\\t\\theight:' + this._rect.height + 'px;\\n\\t\\t\\t\\t';\r\n\r\n\t\t\t\t\t\tthis._rectChanged = false;\r\n\t\t\t\t\t}\r\n\r\n\t\t\t\t\t// if no longer interacting with crop area stop here\r\n\t\t\t\t\tif (!this._interaction) {\r\n\t\t\t\t\t\treturn;\r\n\t\t\t\t\t}\r\n\r\n\t\t\t\t\t// redraw\r\n\t\t\t\t\trequestAnimationFrame(function () {\r\n\t\t\t\t\t\treturn _this._redraw();\r\n\t\t\t\t\t});\r\n\t\t\t\t}\r\n\t\t\t}, {\r\n\t\t\t\tkey: 'destroy',\r\n\t\t\t\tvalue: function destroy() {\r\n\r\n\t\t\t\t\tthis._interaction = false;\r\n\t\t\t\t\tthis._rectChanged = false;\r\n\r\n\t\t\t\t\tremoveEvents(document, Events.DOWN, this);\r\n\t\t\t\t\tremoveEvents(document, Events.MOVE, this);\r\n\t\t\t\t\tremoveEvents(document, Events.UP, this);\r\n\r\n\t\t\t\t\tremoveElement(this._element);\r\n\t\t\t\t}\r\n\t\t\t}, {\r\n\t\t\t\tkey: 'element',\r\n\t\t\t\tget: function get() {\r\n\t\t\t\t\treturn this._element;\r\n\t\t\t\t}\r\n\t\t\t}, {\r\n\t\t\t\tkey: 'space',\r\n\t\t\t\tget: function get() {\r\n\t\t\t\t\treturn this._space;\r\n\t\t\t\t}\r\n\t\t\t}, {\r\n\t\t\t\tkey: 'area',\r\n\t\t\t\tget: function get() {\r\n\r\n\t\t\t\t\tvar x = this._rect.x / this._space.width;\r\n\t\t\t\t\tvar y = this._rect.y / this._space.height;\r\n\t\t\t\t\tvar width = this._rect.width / this._space.width;\r\n\t\t\t\t\tvar height = this._rect.height / this._space.height;\r\n\r\n\t\t\t\t\treturn {\r\n\t\t\t\t\t\tx: x,\r\n\t\t\t\t\t\ty: y,\r\n\t\t\t\t\t\twidth: width,\r\n\t\t\t\t\t\theight: height\r\n\t\t\t\t\t};\r\n\t\t\t\t}\r\n\t\t\t}, {\r\n\t\t\t\tkey: 'dirty',\r\n\t\t\t\tget: function get() {\r\n\t\t\t\t\treturn this._rect.x !== 0 || this._rect.y !== 0 || this._rect.width !== 0 || this._rect.height !== 0;\r\n\t\t\t\t}\r\n\t\t\t}, {\r\n\t\t\t\tkey: 'minWidth',\r\n\t\t\t\tset: function set(value) {\r\n\t\t\t\t\tthis._minWidth = value;\r\n\t\t\t\t}\r\n\t\t\t}, {\r\n\t\t\t\tkey: 'minHeight',\r\n\t\t\t\tset: function set(value) {\r\n\t\t\t\t\tthis._minHeight = value;\r\n\t\t\t\t}\r\n\t\t\t}, {\r\n\t\t\t\tkey: 'ratio',\r\n\t\t\t\tset: function set(value) {\r\n\t\t\t\t\tthis._ratio = value;\r\n\t\t\t\t}\r\n\t\t\t}]);\r\n\r\n\t\t\treturn CropArea;\r\n\t\t}();\r\n\t}();\r\n\tvar ImageEditor = function () {\r\n\r\n\t\t/**\r\n\t * ImageEditor\r\n\t * @param element\r\n\t * @param options\r\n\t * @constructor\r\n\t */\r\n\r\n\t\tvar CropAreaEvents = ['input', 'change'];\r\n\r\n\t\tvar ImageEditor = function () {\r\n\t\t\tfunction ImageEditor() {\r\n\t\t\t\tvar element = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : document.createElement('div');\r\n\t\t\t\tvar options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\r\n\r\n\t\t\t\t_classCallCheck(this, ImageEditor);\r\n\r\n\t\t\t\tthis._element = element;\r\n\t\t\t\tthis._options = mergeOptions(ImageEditor.options(), options);\r\n\r\n\t\t\t\tthis._ratio = null;\r\n\t\t\t\tthis._output = null;\r\n\r\n\t\t\t\tthis._input = null;\r\n\r\n\t\t\t\tthis._preview = null;\r\n\t\t\t\tthis._previewBlurred = null;\r\n\r\n\t\t\t\tthis._blurredPreview = false;\r\n\r\n\t\t\t\tthis._cropper = null;\r\n\t\t\t\tthis._straightCrop = null;\r\n\t\t\t\tthis._previewWrapper = null;\r\n\t\t\t\tthis._currentWindowSize = {};\r\n\r\n\t\t\t\tthis._btnGroup = null;\r\n\t\t\t\tthis._maskFrame = null;\r\n\r\n\t\t\t\tthis._dirty = false;\r\n\r\n\t\t\t\tthis._wrapperRotation = 0;\r\n\t\t\t\tthis._wrapperScale = 1.0;\r\n\r\n\t\t\t\tthis._init();\r\n\t\t\t}\r\n\r\n\t\t\t_createClass(ImageEditor, [{\r\n\t\t\t\tkey: '_init',\r\n\t\t\t\tvalue: function _init() {\r\n\t\t\t\t\tvar _this2 = this;\r\n\r\n\t\t\t\t\tthis._element.className = 'slim-image-editor';\r\n\r\n\t\t\t\t\t// container\r\n\t\t\t\t\tthis._container = create('div', 'slim-container');\r\n\r\n\t\t\t\t\t// wrapper\r\n\t\t\t\t\tthis._wrapper = create('div', 'slim-wrapper');\r\n\r\n\t\t\t\t\t// photo crop mark container\r\n\t\t\t\t\tthis._stage = create('div', 'slim-stage');\r\n\t\t\t\t\tthis._container.appendChild(this._stage);\r\n\r\n\t\t\t\t\t// create crop marks\r\n\t\t\t\t\tthis._cropper = new CropArea();\r\n\t\t\t\t\tCropAreaEvents.forEach(function (e) {\r\n\t\t\t\t\t\t_this2._cropper.element.addEventListener(e, _this2);\r\n\t\t\t\t\t});\r\n\t\t\t\t\tthis._stage.appendChild(this._cropper.element);\r\n\r\n\t\t\t\t\t// canvas ghost\r\n\t\t\t\t\tthis._previewWrapper = create('div', 'slim-image-editor-preview slim-crop-preview');\r\n\t\t\t\t\tthis._previewBlurred = create('canvas', 'slim-crop-blur');\r\n\t\t\t\t\tthis._previewWrapper.appendChild(this._previewBlurred);\r\n\t\t\t\t\tthis._wrapper.appendChild(this._previewWrapper);\r\n\r\n\t\t\t\t\tthis._previewMask = create('div', 'slim-crop-mask');\r\n\t\t\t\t\tthis._preview = create('img');\r\n\t\t\t\t\tthis._previewMask.appendChild(this._preview);\r\n\t\t\t\t\t//this._previewWrapper.appendChild(this._preview);\r\n\t\t\t\t\tthis._cropper.element.appendChild(this._previewMask);\r\n\r\n\t\t\t\t\t// buttons\r\n\t\t\t\t\tthis._btnGroup = create('div', 'slim-editor-btn-group');\r\n\t\t\t\t\tImageEditor.Buttons.forEach(function (c) {\r\n\t\t\t\t\t\tvar prop = capitalizeFirstLetter(c);\r\n\t\t\t\t\t\tvar label = _this2._options['button' + prop + 'Label'];\r\n\t\t\t\t\t\tvar title = _this2._options['button' + prop + 'Title'];\r\n\t\t\t\t\t\tvar className = _this2._options['button' + prop + 'ClassName'];\r\n\t\t\t\t\t\tvar btn = create('button', 'slim-editor-btn slim-btn-' + c + (className ? ' ' + className : ''));\r\n\t\t\t\t\t\tbtn.innerHTML = label;\r\n\t\t\t\t\t\tbtn.title = title || label;\r\n\t\t\t\t\t\tbtn.type = 'button';\r\n\t\t\t\t\t\tbtn.setAttribute('data-action', c);\r\n\t\t\t\t\t\tbtn.addEventListener('click', _this2);\r\n\t\t\t\t\t\t_this2._btnGroup.appendChild(btn);\r\n\t\t\t\t\t});\r\n\r\n\t\t\t\t\t// utils\r\n\t\t\t\t\tthis._utilsGroup = create('div', 'slim-editor-utils-group');\r\n\r\n\t\t\t\t\t// create rotation button\r\n\t\t\t\t\tvar btn = create('button', 'slim-editor-utils-btn slim-btn-rotate' + (this._options.buttonRotateClassName ? ' ' + this._options.buttonRotateClassName : ''));\r\n\t\t\t\t\tbtn.setAttribute('data-action', 'rotate');\r\n\t\t\t\t\tbtn.addEventListener('click', this);\r\n\t\t\t\t\tbtn.title = this._options.buttonRotateTitle;\r\n\t\t\t\t\tthis._utilsGroup.appendChild(btn);\r\n\r\n\t\t\t\t\tthis._container.appendChild(this._wrapper);\r\n\r\n\t\t\t\t\tthis._element.appendChild(this._container);\r\n\t\t\t\t\tthis._element.appendChild(this._utilsGroup);\r\n\t\t\t\t\tthis._element.appendChild(this._btnGroup);\r\n\t\t\t\t}\r\n\t\t\t}, {\r\n\t\t\t\tkey: 'dirty',\r\n\t\t\t\tvalue: function dirty() {\r\n\t\t\t\t\tthis._dirty = true;\r\n\t\t\t\t}\r\n\t\t\t}, {\r\n\t\t\t\tkey: 'handleEvent',\r\n\t\t\t\tvalue: function handleEvent(e) {\r\n\r\n\t\t\t\t\tswitch (e.type) {\r\n\t\t\t\t\t\tcase 'click':\r\n\t\t\t\t\t\t\tthis._onClick(e);\r\n\t\t\t\t\t\t\tbreak;\r\n\t\t\t\t\t\tcase 'change':\r\n\t\t\t\t\t\t\tthis._onGridChange(e);\r\n\t\t\t\t\t\t\tbreak;\r\n\t\t\t\t\t\tcase 'input':\r\n\t\t\t\t\t\t\tthis._onGridInput(e);\r\n\t\t\t\t\t\t\tbreak;\r\n\t\t\t\t\t\tcase 'keydown':\r\n\t\t\t\t\t\t\tthis._onKeyDown(e);\r\n\t\t\t\t\t\t\tbreak;\r\n\t\t\t\t\t\tcase 'resize':\r\n\t\t\t\t\t\t\tthis._onResize(e);\r\n\t\t\t\t\t\t\tbreak;\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t}, {\r\n\t\t\t\tkey: '_onKeyDown',\r\n\t\t\t\tvalue: function _onKeyDown(e) {\r\n\r\n\t\t\t\t\tswitch (e.keyCode) {\r\n\t\t\t\t\t\tcase Key.RETURN:\r\n\t\t\t\t\t\t\t{\r\n\t\t\t\t\t\t\t\tthis._confirm();\r\n\t\t\t\t\t\t\t\tbreak;\r\n\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\tcase Key.ESC:\r\n\t\t\t\t\t\t\t{\r\n\t\t\t\t\t\t\t\tthis._cancel();\r\n\t\t\t\t\t\t\t\tbreak;\r\n\t\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\t\tkey: '_onClick',\r\n\t\t\t\tvalue: function _onClick(e) {\r\n\r\n\t\t\t\t\tif (e.target.classList.contains('slim-btn-cancel')) {\r\n\t\t\t\t\t\tthis._cancel();\r\n\t\t\t\t\t}\r\n\r\n\t\t\t\t\tif (e.target.classList.contains('slim-btn-confirm')) {\r\n\t\t\t\t\t\tthis._confirm();\r\n\t\t\t\t\t}\r\n\r\n\t\t\t\t\tif (e.target.classList.contains('slim-btn-rotate')) {\r\n\t\t\t\t\t\tthis._rotate();\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t}, {\r\n\t\t\t\tkey: '_onResize',\r\n\t\t\t\tvalue: function _onResize() {\r\n\r\n\t\t\t\t\t// remember window size\r\n\t\t\t\t\tthis._currentWindowSize = {\r\n\t\t\t\t\t\twidth: window.innerWidth,\r\n\t\t\t\t\t\theight: window.innerHeight\r\n\t\t\t\t\t};\r\n\r\n\t\t\t\t\t// redraw the image editor based on new dimensions\r\n\t\t\t\t\tthis._redraw();\r\n\r\n\t\t\t\t\tthis._redrawCropper(this._cropper.area);\r\n\r\n\t\t\t\t\tthis._updateWrapperScale();\r\n\r\n\t\t\t\t\t// apply rotation and scale\r\n\t\t\t\t\tthis._redrawWrapper();\r\n\t\t\t\t}\r\n\t\t\t}, {\r\n\t\t\t\tkey: '_redrawWrapper',\r\n\t\t\t\tvalue: function _redrawWrapper() {\r\n\t\t\t\t\tvar matrix = snabbt.createMatrix();\r\n\t\t\t\t\tmatrix.scale(this._wrapperScale, this._wrapperScale);\r\n\t\t\t\t\tmatrix.rotateZ(this._wrapperRotation * (Math.PI / 180));\r\n\t\t\t\t\tsnabbt.setElementTransform(this._previewWrapper, matrix);\r\n\t\t\t\t}\r\n\t\t\t}, {\r\n\t\t\t\tkey: '_onGridInput',\r\n\t\t\t\tvalue: function _onGridInput() {\r\n\r\n\t\t\t\t\tthis._redrawCropMask();\r\n\t\t\t\t}\r\n\t\t\t}, {\r\n\t\t\t\tkey: '_onGridChange',\r\n\t\t\t\tvalue: function _onGridChange() {\r\n\r\n\t\t\t\t\tthis._redrawCropMask();\r\n\t\t\t\t}\r\n\t\t\t}, {\r\n\t\t\t\tkey: '_updateWrapperRotation',\r\n\t\t\t\tvalue: function _updateWrapperRotation() {\r\n\r\n\t\t\t\t\tif (this._options.minSize.width > this._input.height || this._options.minSize.height > this._input.width) {\r\n\t\t\t\t\t\tthis._wrapperRotation += 180;\r\n\t\t\t\t\t} else {\r\n\t\t\t\t\t\tthis._wrapperRotation += 90;\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t}, {\r\n\t\t\t\tkey: '_updateWrapperScale',\r\n\t\t\t\tvalue: function _updateWrapperScale() {\r\n\r\n\t\t\t\t\t// test if is tilted\r\n\t\t\t\t\tvar isTilted = this._wrapperRotation % 180 !== 0;\r\n\r\n\t\t\t\t\t// if tilted determine correct scale factor\r\n\t\t\t\t\tif (isTilted) {\r\n\r\n\t\t\t\t\t\t// maximum size\r\n\t\t\t\t\t\tvar maxWidth = this._container.offsetWidth;\r\n\t\t\t\t\t\tvar maxHeight = this._container.offsetHeight;\r\n\r\n\t\t\t\t\t\t// get wrapper size\r\n\t\t\t\t\t\tvar wrapperWidth = this._wrapper.offsetHeight;\r\n\t\t\t\t\t\tvar wrapperHeight = this._wrapper.offsetWidth;\r\n\r\n\t\t\t\t\t\tvar scalar = maxWidth / wrapperWidth;\r\n\t\t\t\t\t\tif (scalar * wrapperHeight > maxHeight) {\r\n\t\t\t\t\t\t\tscalar = maxHeight / wrapperHeight;\r\n\t\t\t\t\t\t}\r\n\r\n\t\t\t\t\t\tthis._wrapperScale = scalar;\r\n\t\t\t\t\t} else {\r\n\t\t\t\t\t\tthis._wrapperScale = 1.0;\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\r\n\t\t\t\t/**\r\n\t\t* Action handlers\r\n\t\t*/\r\n\r\n\t\t\t}, {\r\n\t\t\t\tkey: '_cancel',\r\n\t\t\t\tvalue: function _cancel() {\r\n\r\n\t\t\t\t\tthis._element.dispatchEvent(new CustomEvent('cancel'));\r\n\t\t\t\t}\r\n\t\t\t}, {\r\n\t\t\t\tkey: '_confirm',\r\n\t\t\t\tvalue: function _confirm() {\r\n\r\n\t\t\t\t\tvar isTilted = this._wrapperRotation % 180 !== 0;\r\n\t\t\t\t\tvar area = this._cropper.area;\r\n\r\n\t\t\t\t\tvar result = scaleRect(area, isTilted ? this._input.height : this._input.width, isTilted ? this._input.width : this._input.height);\r\n\r\n\t\t\t\t\tthis._element.dispatchEvent(new CustomEvent('confirm', {\r\n\t\t\t\t\t\tdetail: {\r\n\t\t\t\t\t\t\trotation: this._wrapperRotation % 360,\r\n\t\t\t\t\t\t\tcrop: result\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\t\tkey: '_rotate',\r\n\t\t\t\tvalue: function _rotate() {\r\n\t\t\t\t\tvar _this3 = this;\r\n\r\n\t\t\t\t\t// rotate!\r\n\t\t\t\t\tthis._updateWrapperRotation();\r\n\r\n\t\t\t\t\t// only pass current rect if is 1:1 or free\r\n\t\t\t\t\tvar rect = this.ratio === 1 || this._ratio === null ? this._cropper.area : null;\r\n\t\t\t\t\tif (rect) {\r\n\t\t\t\t\t\trotate(rect, 90);\r\n\t\t\t\t\t}\r\n\r\n\t\t\t\t\t// wrapper might also need to be scaled\r\n\t\t\t\t\tthis._updateWrapperScale();\r\n\r\n\t\t\t\t\t// hide the cropper\r\n\t\t\t\t\tthis._hideCropper();\r\n\r\n\t\t\t\t\t// rotation effect\r\n\t\t\t\t\tsnabbt(this._previewWrapper, {\r\n\t\t\t\t\t\trotation: [0, 0, this._wrapperRotation * (Math.PI / 180)],\r\n\t\t\t\t\t\tscale: [this._wrapperScale, this._wrapperScale],\r\n\t\t\t\t\t\teasing: 'spring',\r\n\t\t\t\t\t\tspringConstant: .8,\r\n\t\t\t\t\t\tspringDeceleration: .65,\r\n\t\t\t\t\t\tcomplete: function complete() {\r\n\r\n\t\t\t\t\t\t\t// redraws auto cropper\r\n\t\t\t\t\t\t\t_this3._redrawCropper(rect);\r\n\r\n\t\t\t\t\t\t\t// shows the cropper\r\n\t\t\t\t\t\t\t_this3._showCropper();\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\t\tkey: '_showCropper',\r\n\t\t\t\tvalue: function _showCropper() {\r\n\r\n\t\t\t\t\tsnabbt(this._stage, {\r\n\t\t\t\t\t\teasing: 'ease',\r\n\t\t\t\t\t\tduration: 250,\r\n\t\t\t\t\t\tfromOpacity: 0,\r\n\t\t\t\t\t\topacity: 1.0\r\n\t\t\t\t\t});\r\n\t\t\t\t}\r\n\t\t\t}, {\r\n\t\t\t\tkey: '_hideCropper',\r\n\t\t\t\tvalue: function _hideCropper() {\r\n\r\n\t\t\t\t\tsnabbt(this._stage, {\r\n\t\t\t\t\t\tduration: 0,\r\n\t\t\t\t\t\tfromOpacity: 0,\r\n\t\t\t\t\t\topacity: 0\r\n\t\t\t\t\t});\r\n\t\t\t\t}\r\n\t\t\t}, {\r\n\t\t\t\tkey: '_redrawCropMask',\r\n\t\t\t\tvalue: function _redrawCropMask() {\r\n\t\t\t\t\tvar _this4 = this;\r\n\r\n\t\t\t\t\t// get rotation\r\n\t\t\t\t\tvar rotation = this._wrapperRotation % 360;\r\n\r\n\t\t\t\t\t// get scale\r\n\t\t\t\t\tvar scale = this._wrapperScale;\r\n\r\n\t\t\t\t\t// get image size\r\n\t\t\t\t\tvar canvas = {\r\n\t\t\t\t\t\twidth: this._wrapper.offsetWidth,\r\n\t\t\t\t\t\theight: this._wrapper.offsetHeight\r\n\t\t\t\t\t};\r\n\r\n\t\t\t\t\t// get default mask cropper area\r\n\t\t\t\t\tvar mask = this._cropper.area;\r\n\t\t\t\t\tvar preview = {\r\n\t\t\t\t\t\tx: 0,\r\n\t\t\t\t\t\ty: 0\r\n\t\t\t\t\t};\r\n\r\n\t\t\t\t\tif (rotation === 0) {\r\n\t\t\t\t\t\tpreview.x = -mask.x;\r\n\t\t\t\t\t\tpreview.y = -mask.y;\r\n\t\t\t\t\t} else if (rotation === 90) {\r\n\t\t\t\t\t\tpreview.x = -(1 - mask.y);\r\n\t\t\t\t\t\tpreview.y = -mask.x;\r\n\t\t\t\t\t} else if (rotation === 180) {\r\n\t\t\t\t\t\tpreview.x = -(1 - mask.x);\r\n\t\t\t\t\t\tpreview.y = -(1 - mask.y);\r\n\t\t\t\t\t} else if (rotation === 270) {\r\n\t\t\t\t\t\tpreview.x = -mask.y;\r\n\t\t\t\t\t\tpreview.y = -(1 - mask.x);\r\n\t\t\t\t\t}\r\n\r\n\t\t\t\t\t// scale rect to fit canvas\r\n\t\t\t\t\tpreview.x *= canvas.width;\r\n\t\t\t\t\tpreview.y *= canvas.height;\r\n\r\n\t\t\t\t\t// update on next frame (so it's in sync with crop area redraw)\r\n\t\t\t\t\tcancelAnimationFrame(this._maskFrame);\r\n\t\t\t\t\tthis._maskFrame = requestAnimationFrame(function () {\r\n\r\n\t\t\t\t\t\tvar transform = 'scale(' + scale + ') rotate(' + -rotation + 'deg) translate(' + preview.x + 'px, ' + preview.y + 'px);';\r\n\t\t\t\t\t\t_this4._preview.style.cssText = '\\n\\t\\t\\t\\t\\twidth: ' + _this4._previewSize.width + 'px;\\n\\t\\t\\t\\t\\theight: ' + _this4._previewSize.height + 'px;\\n\\t\\t\\t\\t\\t-webkit-transform: ' + transform + ';\\n\\t\\t\\t\\t\\ttransform: ' + transform + ';\\n\\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\t\tkey: 'open',\r\n\t\t\t\tvalue: function open(image, ratio, crop, rotation, complete) {\r\n\t\t\t\t\tvar _this5 = this;\r\n\r\n\t\t\t\t\t// test if is same image\r\n\t\t\t\t\tif (this._input && !this._dirty && this._ratio === ratio) {\r\n\t\t\t\t\t\tcomplete();\r\n\t\t\t\t\t\treturn;\r\n\t\t\t\t\t}\r\n\r\n\t\t\t\t\t// remember current window size\r\n\t\t\t\t\tthis._currentWindowSize = {\r\n\t\t\t\t\t\twidth: window.innerWidth,\r\n\t\t\t\t\t\theight: window.innerHeight\r\n\t\t\t\t\t};\r\n\r\n\t\t\t\t\t// reset dirty value\r\n\t\t\t\t\tthis._dirty = false;\r\n\r\n\t\t\t\t\t// reset rotation\r\n\t\t\t\t\tthis._wrapperRotation = rotation || 0;\r\n\r\n\t\t\t\t\t// we'll always have to blur the preview of a newly opened image\r\n\t\t\t\t\tthis._blurredPreview = false;\r\n\r\n\t\t\t\t\t// set ratio\r\n\t\t\t\t\tthis._ratio = ratio;\r\n\r\n\t\t\t\t\t// reset preview size\r\n\t\t\t\t\tthis._previewSize = null;\r\n\r\n\t\t\t\t\t// hide editor\r\n\t\t\t\t\tthis._element.style.opacity = '0';\r\n\r\n\t\t\t\t\t// set as new input image\r\n\t\t\t\t\tthis._input = image;\r\n\r\n\t\t\t\t\t// calculate crop\r\n\t\t\t\t\tvar tilted = rotation % 180 !== 0;\r\n\t\t\t\t\tvar relativeCrop = divideRect(crop, tilted ? image.height : image.width, tilted ? image.width : image.height);\r\n\r\n\t\t\t\t\t// preview has now loaded\r\n\t\t\t\t\tthis._preview.onload = function () {\r\n\r\n\t\t\t\t\t\t// reset onload listener\r\n\t\t\t\t\t\t_this5._preview.onload = null;\r\n\r\n\t\t\t\t\t\t// setup cropper\r\n\t\t\t\t\t\t_this5._cropper.ratio = _this5.ratio;\r\n\r\n\t\t\t\t\t\t// redraw view (for first time)\r\n\t\t\t\t\t\t_this5._redraw();\r\n\r\n\t\t\t\t\t\t// redraw cropper\r\n\t\t\t\t\t\t_this5._redrawCropper(relativeCrop);\r\n\r\n\t\t\t\t\t\t// done\r\n\t\t\t\t\t\tcomplete();\r\n\r\n\t\t\t\t\t\t// fade in\r\n\t\t\t\t\t\t_this5._element.style.opacity = '';\r\n\t\t\t\t\t};\r\n\r\n\t\t\t\t\t// load lower resolution preview image\r\n\t\t\t\t\tthis._preview.src = cloneCanvasScaled(this._input, Math.min(this._container.offsetWidth / this._input.width, this._container.offsetHeight / this._input.height)).toDataURL();\r\n\t\t\t\t}\r\n\t\t\t}, {\r\n\t\t\t\tkey: '_redrawCropper',\r\n\t\t\t\tvalue: function _redrawCropper(rect) {\r\n\r\n\t\t\t\t\tvar isTilted = this._wrapperRotation % 180 !== 0;\r\n\r\n\t\t\t\t\t// image ratio\r\n\t\t\t\t\tvar imageRatio = isTilted ? this._input.height / this._input.width : this._input.width / this._input.height;\r\n\r\n\t\t\t\t\t// get dimensions of image wrapper\r\n\t\t\t\t\tvar width = this._wrapper.offsetWidth;\r\n\t\t\t\t\tvar height = this._wrapper.offsetHeight;\r\n\r\n\t\t\t\t\t// get space\r\n\t\t\t\t\tvar maxWidth = this._container.offsetWidth;\r\n\t\t\t\t\tvar maxHeight = this._container.offsetHeight;\r\n\r\n\t\t\t\t\t// rescale wrapper\r\n\t\t\t\t\tthis._updateWrapperScale();\r\n\r\n\t\t\t\t\t// position cropper container to fit wrapper\r\n\t\t\t\t\tvar sw = this._wrapperScale * (isTilted ? height : width);\r\n\t\t\t\t\tvar sh = this._wrapperScale * (isTilted ? width : height);\r\n\t\t\t\t\tvar sx = isTilted ? (maxWidth - sw) * .5 : this._wrapper.offsetLeft;\r\n\t\t\t\t\tvar sy = isTilted ? (maxHeight - sh) * .5 : this._wrapper.offsetTop;\r\n\r\n\t\t\t\t\tthis._stage.style.cssText = '\\n\\t\\t\\t\\tleft:' + sx + 'px;\\n\\t\\t\\t\\ttop:' + sy + 'px;\\n\\t\\t\\t\\twidth:' + sw + 'px;\\n\\t\\t\\t\\theight:' + sh + 'px;\\n\\t\\t\\t';\r\n\r\n\t\t\t\t\t// set new size limit for crops\r\n\t\t\t\t\t// use image ratio so we have exact amount of pixels\r\n\t\t\t\t\tthis._cropper.limit(sw, sw / imageRatio);\r\n\t\t\t\t\tthis._cropper.offset(sx + this._element.offsetLeft, sy + this._element.offsetTop);\r\n\r\n\t\t\t\t\t// set min and max height of cropper\r\n\t\t\t\t\tthis._cropper.minWidth = this._wrapperScale * this._options.minSize.width * this.scalar;\r\n\t\t\t\t\tthis._cropper.minHeight = this._wrapperScale * this._options.minSize.height * this.scalar;\r\n\r\n\t\t\t\t\t// set crop rect\r\n\t\t\t\t\tvar crop = null;\r\n\t\t\t\t\tif (rect) {\r\n\t\t\t\t\t\tcrop = {\r\n\t\t\t\t\t\t\tx: rect.x * sw,\r\n\t\t\t\t\t\t\ty: rect.y * sh,\r\n\t\t\t\t\t\t\twidth: rect.width * sw,\r\n\t\t\t\t\t\t\theight: rect.height * sh\r\n\t\t\t\t\t\t};\r\n\t\t\t\t\t} else {\r\n\t\t\t\t\t\tcrop = getAutoCropRect(sw, sh, this._ratio || sh / sw);\r\n\t\t\t\t\t}\r\n\r\n\t\t\t\t\tthis._cropper.resize(crop.x, crop.y, crop.width, crop.height);\r\n\t\t\t\t}\r\n\t\t\t}, {\r\n\t\t\t\tkey: '_redraw',\r\n\t\t\t\tvalue: function _redraw() {\r\n\r\n\t\t\t\t\t// image ratio\r\n\t\t\t\t\tvar ratio = this._input.height / this._input.width;\r\n\r\n\t\t\t\t\t// determine rounded size\r\n\t\t\t\t\tvar maxWidth = this._container.clientWidth;\r\n\t\t\t\t\tvar maxHeight = this._container.clientHeight;\r\n\r\n\t\t\t\t\tvar width = maxWidth;\r\n\t\t\t\t\tvar height = width * ratio;\r\n\r\n\t\t\t\t\tif (height > maxHeight) {\r\n\t\t\t\t\t\theight = maxHeight;\r\n\t\t\t\t\t\twidth = height / ratio;\r\n\t\t\t\t\t}\r\n\r\n\t\t\t\t\twidth = Math.round(width);\r\n\t\t\t\t\theight = Math.round(height);\r\n\r\n\t\t\t\t\t// rescale and recenter wrapper\r\n\t\t\t\t\tvar x = (maxWidth - width) / 2;\r\n\t\t\t\t\tvar y = (maxHeight - height) / 2;\r\n\r\n\t\t\t\t\tthis._wrapper.style.cssText = '\\n\\t\\t\\t\\tleft:' + x + 'px;\\n\\t\\t\\t\\ttop:' + y + 'px;\\n\\t\\t\\t\\twidth:' + width + 'px;\\n\\t\\t\\t\\theight:' + height + 'px;\\n\\t\\t\\t';\r\n\r\n\t\t\t\t\t// set image size based on container dimensions\r\n\t\t\t\t\tthis._previewBlurred.style.cssText = '\\n\\t\\t\\t\\twidth:' + width + 'px;\\n\\t\\t\\t\\theight:' + height + 'px;\\n\\t\\t\\t';\r\n\r\n\t\t\t\t\tthis._preview.style.cssText = '\\n\\t\\t\\t\\twidth:' + width + 'px;\\n\\t\\t\\t\\theight:' + height + 'px;\\n\\t\\t\\t';\r\n\r\n\t\t\t\t\tthis._previewSize = {\r\n\t\t\t\t\t\twidth: width,\r\n\t\t\t\t\t\theight: height\r\n\t\t\t\t\t};\r\n\r\n\t\t\t\t\t// scale and blur the blurry preview\r\n\t\t\t\t\tif (!this._blurredPreview) {\r\n\r\n\t\t\t\t\t\tthis._previewBlurred.width = 300;\r\n\t\t\t\t\t\tthis._previewBlurred.height = this._previewBlurred.width * ratio;\r\n\r\n\t\t\t\t\t\tcopyCanvas(this._input, this._previewBlurred);\r\n\r\n\t\t\t\t\t\tblurCanvas(this._previewBlurred, 3);\r\n\r\n\t\t\t\t\t\tthis._blurredPreview = true;\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t}, {\r\n\t\t\t\tkey: 'show',\r\n\t\t\t\tvalue: function show() {\r\n\t\t\t\t\tvar callback = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : function () { };\r\n\r\n\r\n\t\t\t\t\t// test if window size has changed since previous showing\r\n\t\t\t\t\tif (this._currentWindowSize.width !== window.innerWidth || this._currentWindowSize.height !== window.innerHeight) {\r\n\r\n\t\t\t\t\t\t// if so, reposition elements\r\n\t\t\t\t\t\tthis._redraw();\r\n\r\n\t\t\t\t\t\t// redraw cropper position\r\n\t\t\t\t\t\tthis._redrawCropper(this._cropper.area);\r\n\t\t\t\t\t}\r\n\r\n\t\t\t\t\t// listen to keydown so we can close or confirm with RETURN / ESC\r\n\t\t\t\t\tdocument.addEventListener('keydown', this);\r\n\r\n\t\t\t\t\t// when window is scaled we want to resize the editor\r\n\t\t\t\t\twindow.addEventListener('resize', this);\r\n\r\n\t\t\t\t\t// fade in preview\r\n\t\t\t\t\tvar rotation = this._wrapperRotation * (Math.PI / 180);\r\n\t\t\t\t\tsnabbt(this._previewWrapper, {\r\n\t\t\t\t\t\tfromRotation: [0, 0, rotation],\r\n\t\t\t\t\t\trotation: [0, 0, rotation],\r\n\t\t\t\t\t\tfromPosition: [0, 0, 0],\r\n\t\t\t\t\t\tposition: [0, 0, 0],\r\n\t\t\t\t\t\tfromOpacity: 0,\r\n\t\t\t\t\t\topacity: 1,\r\n\t\t\t\t\t\tfromScale: [this._wrapperScale - .02, this._wrapperScale - .02],\r\n\t\t\t\t\t\tscale: [this._wrapperScale, this._wrapperScale],\r\n\t\t\t\t\t\teasing: 'spring',\r\n\t\t\t\t\t\tspringConstant: .3,\r\n\t\t\t\t\t\tspringDeceleration: .85,\r\n\t\t\t\t\t\tdelay: 450,\r\n\t\t\t\t\t\tcomplete: function complete() {\r\n\t\t\t\t\t\t\t// don't reset transforms because we need rotation to stick\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t});\r\n\r\n\t\t\t\t\tif (this._cropper.dirty) {\r\n\r\n\t\t\t\t\t\t// now show cropper\r\n\t\t\t\t\t\tsnabbt(this._stage, {\r\n\t\t\t\t\t\t\tfromPosition: [0, 0, 0],\r\n\t\t\t\t\t\t\tposition: [0, 0, 0],\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\tduration: 250,\r\n\t\t\t\t\t\t\tdelay: 850,\r\n\t\t\t\t\t\t\tcomplete: function complete() {\r\n\t\t\t\t\t\t\t\tresetTransforms(this);\r\n\t\t\t\t\t\t\t\tcallback();\r\n\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t});\r\n\t\t\t\t\t} else {\r\n\r\n\t\t\t\t\t\t// now show cropper\r\n\t\t\t\t\t\tsnabbt(this._stage, {\r\n\t\t\t\t\t\t\tfromPosition: [0, 0, 0],\r\n\t\t\t\t\t\t\tposition: [0, 0, 0],\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\tduration: 250,\r\n\t\t\t\t\t\t\tdelay: 1000,\r\n\t\t\t\t\t\t\tcomplete: function complete() {\r\n\t\t\t\t\t\t\t\tresetTransforms(this);\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// now show buttons\r\n\t\t\t\t\tsnabbt(this._btnGroup.childNodes, {\r\n\t\t\t\t\t\tfromScale: [.9, .9],\r\n\t\t\t\t\t\tscale: [1, 1],\r\n\t\t\t\t\t\tfromOpacity: 0,\r\n\t\t\t\t\t\topacity: 1,\r\n\t\t\t\t\t\tdelay: function delay(i) {\r\n\t\t\t\t\t\t\treturn 1000 + i * 100;\r\n\t\t\t\t\t\t},\r\n\t\t\t\t\t\teasing: 'spring',\r\n\t\t\t\t\t\tspringConstant: .3,\r\n\t\t\t\t\t\tspringDeceleration: .85,\r\n\t\t\t\t\t\tcomplete: function complete() {\r\n\t\t\t\t\t\t\tresetTransforms(this);\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t});\r\n\r\n\t\t\t\t\tsnabbt(this._utilsGroup.childNodes, {\r\n\t\t\t\t\t\tfromScale: [.9, .9],\r\n\t\t\t\t\t\tscale: [1, 1],\r\n\t\t\t\t\t\tfromOpacity: 0,\r\n\t\t\t\t\t\topacity: 1,\r\n\t\t\t\t\t\teasing: 'spring',\r\n\t\t\t\t\t\tspringConstant: .3,\r\n\t\t\t\t\t\tspringDeceleration: .85,\r\n\t\t\t\t\t\tdelay: 1250,\r\n\t\t\t\t\t\tcomplete: function complete() {\r\n\t\t\t\t\t\t\tresetTransforms(this);\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\t\tkey: 'hide',\r\n\t\t\t\tvalue: function hide() {\r\n\t\t\t\t\tvar callback = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : function () { };\r\n\r\n\r\n\t\t\t\t\t// no more need to listen to keydown\r\n\t\t\t\t\tdocument.removeEventListener('keydown', this);\r\n\r\n\t\t\t\t\t// no more need to resize editor when window is scaled\r\n\t\t\t\t\twindow.removeEventListener('resize', this);\r\n\r\n\t\t\t\t\t// fade out buttons\r\n\t\t\t\t\tsnabbt(this._utilsGroup.childNodes, {\r\n\t\t\t\t\t\tfromOpacity: 1,\r\n\t\t\t\t\t\topacity: 0,\r\n\t\t\t\t\t\tduration: 250\r\n\t\t\t\t\t});\r\n\r\n\t\t\t\t\tsnabbt(this._btnGroup.childNodes, {\r\n\t\t\t\t\t\tfromOpacity: 1,\r\n\t\t\t\t\t\topacity: 0,\r\n\t\t\t\t\t\tdelay: 200,\r\n\t\t\t\t\t\tduration: 350\r\n\t\t\t\t\t});\r\n\r\n\t\t\t\t\tsnabbt([this._stage, this._previewWrapper], {\r\n\t\t\t\t\t\tfromPosition: [0, 0, 0],\r\n\t\t\t\t\t\tposition: [0, -250, 0],\r\n\t\t\t\t\t\tfromOpacity: 1,\r\n\t\t\t\t\t\topacity: 0,\r\n\t\t\t\t\t\teasing: 'spring',\r\n\t\t\t\t\t\tspringConstant: .3,\r\n\t\t\t\t\t\tspringDeceleration: .75,\r\n\t\t\t\t\t\tdelay: 250,\r\n\t\t\t\t\t\tallDone: function allDone() {\r\n\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\t\t\t}, {\r\n\t\t\t\tkey: 'destroy',\r\n\t\t\t\tvalue: function destroy() {\r\n\t\t\t\t\tvar _this6 = this;\r\n\r\n\t\t\t\t\tnodeListToArray(this._btnGroup.children).forEach(function (btn) {\r\n\t\t\t\t\t\tbtn.removeEventListener('click', _this6);\r\n\t\t\t\t\t});\r\n\r\n\t\t\t\t\tCropAreaEvents.forEach(function (e) {\r\n\t\t\t\t\t\t_this6._cropper.element.removeEventListener(e, _this6);\r\n\t\t\t\t\t});\r\n\r\n\t\t\t\t\tthis._cropper.destroy();\r\n\r\n\t\t\t\t\t// if still attached to DOM, detach\r\n\t\t\t\t\tif (this._element.parentNode) {\r\n\t\t\t\t\t\tremoveElement(this._element);\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t}, {\r\n\t\t\t\tkey: 'showRotateButton',\r\n\t\t\t\tset: function set(enabled) {\r\n\t\t\t\t\tif (enabled) {\r\n\t\t\t\t\t\tthis._element.classList.remove('slim-rotation-disabled');\r\n\t\t\t\t\t} else {\r\n\t\t\t\t\t\tthis._element.classList.add('slim-rotation-disabled');\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t}, {\r\n\t\t\t\tkey: 'element',\r\n\t\t\t\tget: function get() {\r\n\t\t\t\t\treturn this._element;\r\n\t\t\t\t}\r\n\t\t\t}, {\r\n\t\t\t\tkey: 'ratio',\r\n\t\t\t\tget: function get() {\r\n\t\t\t\t\tif (this._ratio === 'input') {\r\n\t\t\t\t\t\treturn this._input.height / this._input.width;\r\n\t\t\t\t\t}\r\n\t\t\t\t\treturn this._ratio;\r\n\t\t\t\t}\r\n\t\t\t}, {\r\n\t\t\t\tkey: 'offset',\r\n\t\t\t\tget: function get() {\r\n\t\t\t\t\treturn this._element.getBoundingClientRect();\r\n\t\t\t\t}\r\n\t\t\t}, {\r\n\t\t\t\tkey: 'original',\r\n\t\t\t\tget: function get() {\r\n\t\t\t\t\treturn this._input;\r\n\t\t\t\t}\r\n\t\t\t}, {\r\n\t\t\t\tkey: 'scalar',\r\n\t\t\t\tget: function get() {\r\n\t\t\t\t\treturn this._previewSize.width / this._input.width;\r\n\t\t\t\t}\r\n\t\t\t}], [{\r\n\t\t\t\tkey: 'options',\r\n\t\t\t\tvalue: function options() {\r\n\r\n\t\t\t\t\treturn {\r\n\t\t\t\t\t\tbuttonCancelClassName: null,\r\n\t\t\t\t\t\tbuttonConfirmClassName: null,\r\n\t\t\t\t\t\tbuttonCancelLabel: 'Cancel',\r\n\t\t\t\t\t\tbuttonConfirmLabel: 'Confirm',\r\n\t\t\t\t\t\tbuttonCancelTitle: null,\r\n\t\t\t\t\t\tbuttonConfirmTitle: null,\r\n\r\n\t\t\t\t\t\tbuttonRotateTitle: 'Rotate',\r\n\t\t\t\t\t\tbuttonRotateClassName: null,\r\n\r\n\t\t\t\t\t\tminSize: {\r\n\t\t\t\t\t\t\twidth: 0,\r\n\t\t\t\t\t\t\theight: 0\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\r\n\t\t\treturn ImageEditor;\r\n\t\t}();\r\n\r\n\t\tImageEditor.Buttons = ['cancel', 'confirm'];\r\n\r\n\t\treturn ImageEditor;\r\n\t}(CropArea);\r\n\tvar FileHopper = function () {\r\n\r\n\t\t/**\r\n\t * FileHopper\r\n\t * @param element\r\n\t * @param options\r\n\t * @constructor\r\n\t */\r\n\t\tvar DragDropEvents = ['dragover', 'dragleave', 'drop'];\r\n\r\n\t\treturn function () {\r\n\t\t\tfunction FileHopper() {\r\n\t\t\t\tvar element = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : document.createElement('div');\r\n\r\n\t\t\t\t_classCallCheck(this, FileHopper);\r\n\r\n\t\t\t\tthis._element = element;\r\n\t\t\t\tthis._accept = [];\r\n\t\t\t\tthis._allowURLs = false;\r\n\r\n\t\t\t\tthis._dragPath = null;\r\n\r\n\t\t\t\tthis._init();\r\n\t\t\t}\r\n\r\n\t\t\t// public properties\r\n\r\n\r\n\t\t\t_createClass(FileHopper, [{\r\n\t\t\t\tkey: 'isValidDataTransfer',\r\n\t\t\t\tvalue: function isValidDataTransfer(dataTransfer) {\r\n\r\n\t\t\t\t\tif (dataTransfer.files && dataTransfer.files.length) {\r\n\t\t\t\t\t\treturn this.areValidDataTransferFiles(dataTransfer.files);\r\n\t\t\t\t\t}\r\n\r\n\t\t\t\t\tif (dataTransfer.items && dataTransfer.items.length) {\r\n\t\t\t\t\t\treturn this.areValidDataTransferItems(dataTransfer.items);\r\n\t\t\t\t\t}\r\n\r\n\t\t\t\t\treturn null;\r\n\t\t\t\t}\r\n\t\t\t}, {\r\n\t\t\t\tkey: 'areValidDataTransferFiles',\r\n\t\t\t\tvalue: function areValidDataTransferFiles(files) {\r\n\t\t\t\t\tif (this._accept.length && files) {\r\n\t\t\t\t\t\treturn this._accept.indexOf(files[0].type) !== -1;\r\n\t\t\t\t\t}\r\n\t\t\t\t\treturn true;\r\n\t\t\t\t}\r\n\t\t\t}, {\r\n\t\t\t\tkey: 'areValidDataTransferItems',\r\n\t\t\t\tvalue: function areValidDataTransferItems(items) {\r\n\r\n\t\t\t\t\tif (this._accept.length && items) {\r\n\r\n\t\t\t\t\t\t// is possibly dropping url\r\n\t\t\t\t\t\tif (this._allowURLs && items[0].kind === 'string') {\r\n\t\t\t\t\t\t\treturn null;\r\n\t\t\t\t\t\t}\r\n\r\n\t\t\t\t\t\t// is http website so firefox will not return file type\r\n\t\t\t\t\t\tif (items[0].type && items[0].type.indexOf('application') === 0) {\r\n\t\t\t\t\t\t\treturn null;\r\n\t\t\t\t\t\t}\r\n\r\n\t\t\t\t\t\treturn this._accept.indexOf(items[0].type) !== -1;\r\n\t\t\t\t\t}\r\n\r\n\t\t\t\t\treturn true;\r\n\t\t\t\t}\r\n\r\n\t\t\t\t// public methods\r\n\r\n\t\t\t}, {\r\n\t\t\t\tkey: 'reset',\r\n\t\t\t\tvalue: function reset() {\r\n\t\t\t\t\tthis._element.files = null;\r\n\t\t\t\t}\r\n\r\n\t\t\t\t// private\r\n\r\n\t\t\t}, {\r\n\t\t\t\tkey: '_init',\r\n\t\t\t\tvalue: function _init() {\r\n\t\t\t\t\tvar _this7 = this;\r\n\r\n\t\t\t\t\tthis._element.className = 'slim-file-hopper';\r\n\r\n\t\t\t\t\tDragDropEvents.forEach(function (e) {\r\n\t\t\t\t\t\t_this7._element.addEventListener(e, _this7);\r\n\t\t\t\t\t});\r\n\t\t\t\t}\r\n\r\n\t\t\t\t// the input has changed\r\n\r\n\t\t\t}, {\r\n\t\t\t\tkey: 'handleEvent',\r\n\t\t\t\tvalue: function handleEvent(e) {\r\n\r\n\t\t\t\t\tswitch (e.type) {\r\n\t\t\t\t\t\tcase 'dragover':\r\n\t\t\t\t\t\t\tthis._onDragOver(e);\r\n\t\t\t\t\t\t\tbreak;\r\n\t\t\t\t\t\tcase 'dragleave':\r\n\t\t\t\t\t\t\tthis._onDragLeave(e);\r\n\t\t\t\t\t\t\tbreak;\r\n\t\t\t\t\t\tcase 'drop':\r\n\t\t\t\t\t\t\tthis._onDrop(e);\r\n\t\t\t\t\t\t\tbreak;\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t}, {\r\n\t\t\t\tkey: '_onDrop',\r\n\t\t\t\tvalue: function _onDrop(e) {\r\n\r\n\t\t\t\t\t// prevents browser from opening image\r\n\t\t\t\t\te.preventDefault();\r\n\r\n\t\t\t\t\t// test if a url was dropped\r\n\t\t\t\t\tvar remote = null;\r\n\r\n\t\t\t\t\tif (this._allowURLs) {\r\n\r\n\t\t\t\t\t\tvar url = void 0;\r\n\t\t\t\t\t\tvar meta = void 0;\r\n\t\t\t\t\t\ttry {\r\n\t\t\t\t\t\t\turl = e.dataTransfer.getData('url');\r\n\t\t\t\t\t\t\tmeta = e.dataTransfer.getData('text/html');\r\n\t\t\t\t\t\t} catch (e) {\r\n\t\t\t\t\t\t\t// nope nope nope (ie11 trouble)\r\n\t\t\t\t\t\t}\r\n\r\n\t\t\t\t\t\tif (meta && meta.length) {\r\n\t\t\t\t\t\t\tvar parsed = meta.match(/src\\s*=\\s*\"(.+?)\"/);\r\n\t\t\t\t\t\t\tif (parsed) {\r\n\t\t\t\t\t\t\t\tremote = parsed[1];\r\n\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t} else if (url && url.length) {\r\n\t\t\t\t\t\t\tremote = url;\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t}\r\n\r\n\t\t\t\t\tif (remote) {\r\n\t\t\t\t\t\tthis._element.files = [{ remote: remote }];\r\n\t\t\t\t\t}\r\n\t\t\t\t\t// nope, must have been a file\r\n\t\t\t\t\telse {\r\n\r\n\t\t\t\t\t\t// test type in older browsers\r\n\t\t\t\t\t\tvar filesValidity = this.isValidDataTransfer(e.dataTransfer);\r\n\t\t\t\t\t\tif (!filesValidity) {\r\n\r\n\t\t\t\t\t\t\t// invalid files, stop here\r\n\t\t\t\t\t\t\tthis._element.dispatchEvent(new CustomEvent('file-invalid-drop'));\r\n\r\n\t\t\t\t\t\t\t// no longer hovering\r\n\t\t\t\t\t\t\tthis._dragPath = null;\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\t// store dropped files on element files property, so can be accessed by same function as file input handler\r\n\t\t\t\t\t\tthis._element.files = e.dataTransfer.files;\r\n\t\t\t\t\t}\r\n\r\n\t\t\t\t\t// file has been dropped\r\n\t\t\t\t\tthis._element.dispatchEvent(new CustomEvent('file-drop', {\r\n\t\t\t\t\t\tdetail: getOffsetByEvent(e)\r\n\t\t\t\t\t}));\r\n\r\n\t\t\t\t\t// file list has changed, let's notify others\r\n\t\t\t\t\tthis._element.dispatchEvent(new CustomEvent('change'));\r\n\r\n\t\t\t\t\t// no longer hovering\r\n\t\t\t\t\tthis._dragPath = null;\r\n\t\t\t\t}\r\n\t\t\t}, {\r\n\t\t\t\tkey: '_onDragOver',\r\n\t\t\t\tvalue: function _onDragOver(e) {\r\n\r\n\t\t\t\t\t// prevents browser from opening image\r\n\t\t\t\t\te.preventDefault();\r\n\r\n\t\t\t\t\t// set drop effect\r\n\t\t\t\t\te.dataTransfer.dropEffect = 'copy';\r\n\r\n\t\t\t\t\t// determin if is valid data\r\n\t\t\t\t\tvar dataValidity = this.isValidDataTransfer(e.dataTransfer);\r\n\t\t\t\t\t// if validity is null is undetermined\r\n\t\t\t\t\tif (dataValidity !== null && !dataValidity) {\r\n\r\n\t\t\t\t\t\t// indicate drop mode to user\r\n\t\t\t\t\t\te.dataTransfer.dropEffect = 'none';\r\n\r\n\t\t\t\t\t\t// invalid files, stop here\r\n\t\t\t\t\t\tthis._element.dispatchEvent(new CustomEvent('file-invalid'));\r\n\t\t\t\t\t\treturn;\r\n\t\t\t\t\t}\r\n\r\n\t\t\t\t\t// now hovering file over the area\r\n\t\t\t\t\tif (!this._dragPath) {\r\n\t\t\t\t\t\tthis._dragPath = [];\r\n\t\t\t\t\t}\r\n\r\n\t\t\t\t\t// push location\r\n\t\t\t\t\tthis._dragPath.push(getOffsetByEvent(e));\r\n\r\n\t\t\t\t\t// file is hovering over element\r\n\t\t\t\t\tthis._element.dispatchEvent(new CustomEvent('file-over', {\r\n\t\t\t\t\t\tdetail: {\r\n\t\t\t\t\t\t\tx: last(this._dragPath).x,\r\n\t\t\t\t\t\t\ty: last(this._dragPath).y\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\t\tkey: '_onDragLeave',\r\n\t\t\t\tvalue: function _onDragLeave(e) {\r\n\r\n\t\t\t\t\t// user has dragged file out of element area\r\n\t\t\t\t\tthis._element.dispatchEvent(new CustomEvent('file-out', {\r\n\t\t\t\t\t\tdetail: getOffsetByEvent(e)\r\n\t\t\t\t\t}));\r\n\r\n\t\t\t\t\t// now longer hovering file\r\n\t\t\t\t\tthis._dragPath = null;\r\n\t\t\t\t}\r\n\t\t\t}, {\r\n\t\t\t\tkey: 'destroy',\r\n\t\t\t\tvalue: function destroy() {\r\n\t\t\t\t\tvar _this8 = this;\r\n\r\n\t\t\t\t\tDragDropEvents.forEach(function (e) {\r\n\t\t\t\t\t\t_this8._element.removeEventListener(e, _this8);\r\n\t\t\t\t\t});\r\n\r\n\t\t\t\t\tremoveElement(this._element);\r\n\r\n\t\t\t\t\tthis._element = null;\r\n\t\t\t\t\tthis._dragPath = null;\r\n\t\t\t\t\tthis._accept = null;\r\n\t\t\t\t}\r\n\t\t\t}, {\r\n\t\t\t\tkey: 'element',\r\n\t\t\t\tget: function get() {\r\n\t\t\t\t\treturn this._element;\r\n\t\t\t\t}\r\n\t\t\t}, {\r\n\t\t\t\tkey: 'dragPath',\r\n\t\t\t\tget: function get() {\r\n\t\t\t\t\treturn this._dragPath;\r\n\t\t\t\t}\r\n\t\t\t}, {\r\n\t\t\t\tkey: 'enabled',\r\n\t\t\t\tget: function get() {\r\n\t\t\t\t\treturn this._element.style.display === '';\r\n\t\t\t\t},\r\n\t\t\t\tset: function set(value) {\r\n\t\t\t\t\tthis._element.style.display = value ? '' : 'none';\r\n\t\t\t\t}\r\n\t\t\t}, {\r\n\t\t\t\tkey: 'allowURLs',\r\n\t\t\t\tset: function set(value) {\r\n\t\t\t\t\tthis._allowURLs = value;\r\n\t\t\t\t}\r\n\t\t\t}, {\r\n\t\t\t\tkey: 'accept',\r\n\t\t\t\tset: function set(mimetypes) {\r\n\t\t\t\t\tthis._accept = mimetypes;\r\n\t\t\t\t},\r\n\t\t\t\tget: function get() {\r\n\t\t\t\t\treturn this._accept;\r\n\t\t\t\t}\r\n\t\t\t}]);\r\n\r\n\t\t\treturn FileHopper;\r\n\t\t}();\r\n\t}();\r\n\tvar Popover = function () {\r\n\r\n\t\t/**\r\n\t * Popover\r\n\t */\r\n\t\treturn function () {\r\n\t\t\tfunction Popover() {\r\n\t\t\t\t_classCallCheck(this, Popover);\r\n\r\n\t\t\t\tthis._element = null;\r\n\t\t\t\tthis._inner = null;\r\n\r\n\t\t\t\tthis._init();\r\n\t\t\t}\r\n\r\n\t\t\t_createClass(Popover, [{\r\n\t\t\t\tkey: '_init',\r\n\t\t\t\tvalue: function _init() {\r\n\r\n\t\t\t\t\tthis._element = create('div', 'slim-popover');\r\n\t\t\t\t\tthis._element.setAttribute('data-state', 'off');\r\n\t\t\t\t\tdocument.body.appendChild(this._element);\r\n\t\t\t\t}\r\n\t\t\t}, {\r\n\t\t\t\tkey: 'show',\r\n\t\t\t\tvalue: function show() {\r\n\t\t\t\t\tvar _this9 = this;\r\n\r\n\t\t\t\t\tvar callback = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : function () { };\r\n\r\n\r\n\t\t\t\t\t// turn on\r\n\t\t\t\t\tthis._element.setAttribute('data-state', 'on');\r\n\r\n\t\t\t\t\t// show and animate in\r\n\t\t\t\t\tsnabbt(this._element, {\r\n\t\t\t\t\t\tfromOpacity: 0,\r\n\t\t\t\t\t\topacity: 1,\r\n\t\t\t\t\t\tduration: 350,\r\n\t\t\t\t\t\tcomplete: function complete() {\r\n\r\n\t\t\t\t\t\t\t// clean up transforms\r\n\t\t\t\t\t\t\tresetTransforms(_this9._element);\r\n\r\n\t\t\t\t\t\t\t// ready!\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\t\t\t}, {\r\n\t\t\t\tkey: 'hide',\r\n\t\t\t\tvalue: function hide() {\r\n\t\t\t\t\tvar _this10 = this;\r\n\r\n\t\t\t\t\tvar callback = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : function () { };\r\n\r\n\r\n\t\t\t\t\t// animate out and hide\r\n\t\t\t\t\tsnabbt(this._element, {\r\n\t\t\t\t\t\tfromOpacity: 1,\r\n\t\t\t\t\t\topacity: 0,\r\n\t\t\t\t\t\tduration: 500,\r\n\t\t\t\t\t\tcomplete: function complete() {\r\n\r\n\t\t\t\t\t\t\t// clean up transforms\r\n\t\t\t\t\t\t\tresetTransforms(_this10._element);\r\n\r\n\t\t\t\t\t\t\t// hide the editor\r\n\t\t\t\t\t\t\t_this10._element.setAttribute('data-state', 'off');\r\n\r\n\t\t\t\t\t\t\t// ready!\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\t\t\t}, {\r\n\t\t\t\tkey: 'destroy',\r\n\t\t\t\tvalue: function destroy() {\r\n\t\t\t\t\tif (!this._element.parentNode) {\r\n\t\t\t\t\t\treturn;\r\n\t\t\t\t\t}\r\n\t\t\t\t\tthis._element.parentNode.removeChild(this._element);\r\n\t\t\t\t\tthis._element = null;\r\n\t\t\t\t\tthis._inner = null;\r\n\t\t\t\t}\r\n\t\t\t}, {\r\n\t\t\t\tkey: 'inner',\r\n\t\t\t\tset: function set(element) {\r\n\r\n\t\t\t\t\tthis._inner = element;\r\n\t\t\t\t\tif (this._element.firstChild) {\r\n\t\t\t\t\t\tthis._element.removeChild(this._element.firstChild);\r\n\t\t\t\t\t}\r\n\t\t\t\t\tthis._element.appendChild(this._inner);\r\n\t\t\t\t}\r\n\t\t\t}]);\r\n\r\n\t\t\treturn Popover;\r\n\t\t}();\r\n\t}();\r\n\tvar intSplit = function intSplit(v, c) {\r\n\t\treturn v.split(c).map(function (v) {\r\n\t\t\treturn parseInt(v, 10);\r\n\t\t});\r\n\t};\r\n\r\n\tvar isWrapper = function isWrapper(element) {\r\n\t\treturn element.nodeName === 'DIV' || element.nodeName === 'SPAN';\r\n\t};\r\n\r\n\tvar CropType = {\r\n\t\tAUTO: 'auto',\r\n\t\tINITIAL: 'initial',\r\n\t\tMANUAL: 'manual'\r\n\t};\r\n\r\n\tvar Rect = ['x', 'y', 'width', 'height'];\r\n\r\n\tvar HopperEvents = ['file-invalid-drop', 'file-invalid', 'file-drop', 'file-over', 'file-out', 'click'];\r\n\r\n\tvar ImageEditorEvents = ['cancel', 'confirm'];\r\n\r\n\tvar SlimButtons = ['remove', 'edit', 'download', 'upload'];\r\n\r\n\tvar SlimPopover = null;\r\n\tvar SlimCount = 0;\r\n\r\n\tvar SlimLoaderHTML = '\\n
\\n\\t\\n\\t\\t\\n\\t\\t\\n\\t\\n
\\n';\r\n\r\n\tvar SlimUploadStatusHTML = '\\n
\\n';\r\n\r\n\tvar stringToSize = function stringToSize(str) {\r\n\t\tvar size = str.split(',');\r\n\t\treturn {\r\n\t\t\twidth: parseInt(size[0], 10),\r\n\t\t\theight: parseInt(size[1], 10)\r\n\t\t};\r\n\t};\r\n\r\n\tvar Slim = function () {\r\n\t\tfunction Slim(element) {\r\n\t\t\tvar options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\r\n\r\n\t\t\t_classCallCheck(this, Slim);\r\n\r\n\t\t\t// create popover element if not already created\r\n\t\t\tif (!SlimPopover) {\r\n\t\t\t\tSlimPopover = new Popover();\r\n\t\t\t}\r\n\r\n\t\t\t// we create a new counter, we use this counter to determine if we need to clean up the popover\r\n\t\t\tthis._uid = SlimCount++;\r\n\r\n\t\t\t// the options to use\r\n\t\t\tthis._options = mergeOptions(Slim.options(), options);\r\n\r\n\t\t\t// test options correctness\r\n\t\t\tif (this._options.forceSize) {\r\n\t\t\t\tif (typeof this._options.forceSize === 'string') {\r\n\t\t\t\t\tthis._options.forceSize = stringToSize(this._options.forceSize);\r\n\t\t\t\t}\r\n\t\t\t\tthis._options.ratio = this._options.forceSize.width + ':' + this._options.forceSize.height;\r\n\t\t\t\tthis._options.size = clone(this._options.forceSize);\r\n\t\t\t}\r\n\r\n\t\t\t// test for size set as string\r\n\t\t\tif (typeof this._options.size === 'string') {\r\n\t\t\t\tthis._options.size = stringToSize(this._options.size);\r\n\t\t\t}\r\n\r\n\t\t\t// test for size set as string\r\n\t\t\tif (typeof this._options.minSize === 'string') {\r\n\t\t\t\tthis._options.minSize = stringToSize(this._options.minSize);\r\n\t\t\t}\r\n\r\n\t\t\t// reference to original element so we can restore original situation\r\n\t\t\tthis._originalElement = element;\r\n\t\t\tthis._originalElementInner = element.innerHTML;\r\n\t\t\tthis._originalElementAttributes = getElementAttributes(element);\r\n\r\n\t\t\t// should be file input, image or slim wrapper, if not wrapper, wrap\r\n\t\t\tif (!isWrapper(element)) {\r\n\r\n\t\t\t\tthis._element = wrap(element);\r\n\t\t\t\tthis._element.className = element.className;\r\n\t\t\t\telement.className = '';\r\n\r\n\t\t\t\t// ratio is used for CSS so let's set default attribute\r\n\t\t\t\tthis._element.setAttribute('data-ratio', this._options.ratio);\r\n\t\t\t} else {\r\n\t\t\t\tthis._element = element;\r\n\t\t\t}\r\n\t\t\tthis._element.classList.add('slim');\r\n\t\t\tthis._element.setAttribute('data-state', 'init');\r\n\r\n\t\t\t// editor state\r\n\t\t\tthis._state = [];\r\n\r\n\t\t\t// internal timer array for async processes\r\n\t\t\tthis._timers = [];\r\n\r\n\t\t\t// the source element (can either be an input or an img)\r\n\t\t\tthis._input = null;\r\n\r\n\t\t\t// the source element unique name if is input type file\r\n\t\t\tthis._inputReference = null;\r\n\r\n\t\t\t// the output element (hidden input that contains the resulting json object)\r\n\t\t\tthis._output = null;\r\n\r\n\t\t\t// current image ratio\r\n\t\t\tthis._ratio = null;\r\n\r\n\t\t\t// was required field\r\n\t\t\tthis._isRequired = false;\r\n\r\n\t\t\t// components\r\n\t\t\tthis._imageHopper = null;\r\n\t\t\tthis._imageEditor = null;\r\n\r\n\t\t\t// progress path\r\n\t\t\tthis._progressEnabled = true;\r\n\r\n\t\t\t// resulting data\r\n\t\t\tthis._data = {};\r\n\t\t\tthis._resetData();\r\n\r\n\t\t\t// the circle below the mouse hover point\r\n\t\t\tthis._drip = null;\r\n\r\n\t\t\t// had initial image\r\n\t\t\tthis._hasInitialImage = false;\r\n\r\n\t\t\t// initial crop\r\n\t\t\tthis._initialCrop = this._options.crop;\r\n\r\n\t\t\t// initial rotation\r\n\t\t\tthis._initialRotation = this._options.rotation && this._options.rotation % 90 === 0 ? this._options.rotation : null;\r\n\r\n\t\t\t// set to true when destroy method is called, used to halt any timeouts or async processes\r\n\t\t\tthis._isBeingDestroyed = false;\r\n\r\n\t\t\t// stop here if not supported\r\n\t\t\tif (!Slim.supported) {\r\n\t\t\t\tthis._fallback();\r\n\t\t\t} else {\r\n\t\t\t\t// let's go!\r\n\t\t\t\tthis._init();\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\t_createClass(Slim, [{\r\n\t\t\tkey: 'setRotation',\r\n\t\t\tvalue: function setRotation(rotation, callback) {\r\n\r\n\t\t\t\tif (typeof rotation !== 'number' && rotation % 90 !== 0) {\r\n\t\t\t\t\treturn;\r\n\t\t\t\t}\r\n\r\n\t\t\t\tthis._data.actions.rotation = rotation;\r\n\t\t\t\tvar isTilted = this._data.actions.rotation % 180 !== 0;\r\n\r\n\t\t\t\tif (this._data.input.image) {\r\n\t\t\t\t\tvar w = isTilted ? this._data.input.image.height : this._data.input.image.width;\r\n\t\t\t\t\tvar h = isTilted ? this._data.input.image.width : this._data.input.image.height;\r\n\t\t\t\t\tthis._data.actions.crop = getAutoCropRect(w, h, 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\tif (this._data.input.image && callback) {\r\n\t\t\t\t\tthis._manualTransform(callback);\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}, {\r\n\t\t\tkey: 'setSize',\r\n\t\t\tvalue: function setSize(dimensions, callback) {\r\n\r\n\t\t\t\tif (typeof dimensions === 'string') {\r\n\t\t\t\t\tdimensions = stringToSize(dimensions);\r\n\t\t\t\t}\r\n\r\n\t\t\t\tif (!dimensions || !dimensions.width || !dimensions.height) {\r\n\t\t\t\t\treturn;\r\n\t\t\t\t}\r\n\r\n\t\t\t\tthis._options.size = clone(dimensions);\r\n\t\t\t\tthis._data.actions.size = clone(dimensions);\r\n\r\n\t\t\t\t// if a crop area is set do re-crop to conform to size\r\n\t\t\t\tif (this._data.input.image && callback) {\r\n\t\t\t\t\tthis._manualTransform(callback);\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}, {\r\n\t\t\tkey: 'setRatio',\r\n\t\t\tvalue: function setRatio(ratio, callback) {\r\n\t\t\t\tvar _this11 = this;\r\n\r\n\t\t\t\tif (!ratio || typeof ratio !== 'string') {\r\n\t\t\t\t\treturn;\r\n\t\t\t\t}\r\n\r\n\t\t\t\tthis._options.ratio = ratio;\r\n\r\n\t\t\t\tif (this._isFixedRatio()) {\r\n\r\n\t\t\t\t\tvar parts = intSplit(this._options.ratio, ':');\r\n\t\t\t\t\tthis._ratio = parts[1] / parts[0];\r\n\r\n\t\t\t\t\tif (this._data.input.image && callback) {\r\n\t\t\t\t\t\tthis._cropAuto(function (data) {\r\n\t\t\t\t\t\t\t_this11._scaleDropArea(_this11._ratio);\r\n\t\t\t\t\t\t\tif (callback) {\r\n\t\t\t\t\t\t\t\tcallback(data);\r\n\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t});\r\n\t\t\t\t\t} else {\r\n\r\n\t\t\t\t\t\tif (this._data.input.image) {\r\n\t\t\t\t\t\t\tthis._data.actions.crop = getAutoCropRect(this._data.input.image.width, this._data.input.image.height, this._ratio);\r\n\t\t\t\t\t\t\tthis._data.actions.crop.type = CropType.AUTO;\r\n\t\t\t\t\t\t}\r\n\r\n\t\t\t\t\t\tthis._scaleDropArea(this._ratio);\r\n\r\n\t\t\t\t\t\tif (callback) {\r\n\t\t\t\t\t\t\tcallback(null);\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t}\r\n\t\t\t\t} else {\r\n\t\t\t\t\tthis._scaleDropArea();\r\n\t\t\t\t}\r\n\t\t\t}\r\n\r\n\t\t\t// methods\r\n\t\t\t// Test if this Slim object has been bound to the given element\r\n\r\n\t\t}, {\r\n\t\t\tkey: 'isAttachedTo',\r\n\t\t\tvalue: function isAttachedTo(element) {\r\n\t\t\t\treturn this._element === element || this._originalElement === element;\r\n\t\t\t}\r\n\t\t}, {\r\n\t\t\tkey: 'isDetached',\r\n\t\t\tvalue: function isDetached() {\r\n\t\t\t\treturn this._element.parentNode === null;\r\n\t\t\t}\r\n\t\t}, {\r\n\t\t\tkey: 'load',\r\n\t\t\tvalue: function load(src) {\r\n\t\t\t\tvar options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\r\n\t\t\t\tvar callback = arguments[2];\r\n\r\n\r\n\t\t\t\tif (typeof options === 'function') {\r\n\t\t\t\t\tcallback = options;\r\n\t\t\t\t} else {\r\n\r\n\t\t\t\t\t// store in options\r\n\t\t\t\t\tthis._options.crop = options.crop;\r\n\r\n\t\t\t\t\t// set rotation\r\n\t\t\t\t\tthis._options.rotation = options.rotation;\r\n\r\n\t\t\t\t\t// initial rotation\r\n\t\t\t\t\tthis._initialRotation = options.rotation && options.rotation % 90 === 0 ? options.rotation : null;\r\n\r\n\t\t\t\t\t// set initial crop\r\n\t\t\t\t\tthis._initialCrop = this._options.crop;\r\n\t\t\t\t}\r\n\r\n\t\t\t\tthis._load(src, callback);\r\n\t\t\t}\r\n\t\t}, {\r\n\t\t\tkey: 'upload',\r\n\t\t\tvalue: function upload(callback) {\r\n\t\t\t\tthis._doUpload(callback);\r\n\t\t\t}\r\n\t\t}, {\r\n\t\t\tkey: 'download',\r\n\t\t\tvalue: function download() {\r\n\t\t\t\tthis._doDownload();\r\n\t\t\t}\r\n\t\t}, {\r\n\t\t\tkey: 'remove',\r\n\t\t\tvalue: function remove() {\r\n\t\t\t\treturn this._doRemove(true);\r\n\t\t\t}\r\n\t\t}, {\r\n\t\t\tkey: 'destroy',\r\n\t\t\tvalue: function destroy() {\r\n\t\t\t\tthis._doDestroy();\r\n\t\t\t}\r\n\t\t}, {\r\n\t\t\tkey: 'edit',\r\n\t\t\tvalue: function edit() {\r\n\t\t\t\tthis._doEdit();\r\n\t\t\t}\r\n\t\t}, {\r\n\t\t\tkey: 'crop',\r\n\t\t\tvalue: function crop(rect, callback) {\r\n\t\t\t\tthis._crop(rect.x, rect.y, rect.width, rect.height, callback);\r\n\t\t\t}\r\n\t\t}, {\r\n\t\t\tkey: 'containsImage',\r\n\t\t\tvalue: function containsImage() {\r\n\t\t\t\treturn this._data.input.name !== null;\r\n\t\t\t}\r\n\r\n\t\t\t/**\r\n\t * State Related\r\n\t */\r\n\r\n\t\t}, {\r\n\t\t\tkey: '_canInstantEdit',\r\n\t\t\tvalue: function _canInstantEdit() {\r\n\t\t\t\treturn this._options.instantEdit && !this._isInitialising;\r\n\t\t\t}\r\n\t\t}, {\r\n\t\t\tkey: '_getFileInput',\r\n\t\t\tvalue: function _getFileInput() {\r\n\t\t\t\treturn this._element.querySelector('input[type=file]');\r\n\t\t\t}\r\n\t\t}, {\r\n\t\t\tkey: '_getInitialImage',\r\n\t\t\tvalue: function _getInitialImage() {\r\n\t\t\t\treturn this._element.querySelector('img');\r\n\t\t\t}\r\n\t\t}, {\r\n\t\t\tkey: '_getInputElement',\r\n\t\t\tvalue: function _getInputElement() {\r\n\t\t\t\treturn this._getFileInput() || this._getInitialImage();\r\n\t\t\t}\r\n\t\t}, {\r\n\t\t\tkey: '_getRatioSpacerElement',\r\n\t\t\tvalue: function _getRatioSpacerElement() {\r\n\t\t\t\treturn this._element.children[0];\r\n\t\t\t}\r\n\t\t}, {\r\n\t\t\tkey: '_isImageOnly',\r\n\t\t\tvalue: function _isImageOnly() {\r\n\t\t\t\treturn this._input.nodeName !== 'INPUT';\r\n\t\t\t}\r\n\t\t}, {\r\n\t\t\tkey: '_isFixedRatio',\r\n\t\t\tvalue: function _isFixedRatio() {\r\n\t\t\t\treturn this._options.ratio.indexOf(':') !== -1;\r\n\t\t\t}\r\n\t\t}, {\r\n\t\t\tkey: '_isAutoCrop',\r\n\t\t\tvalue: function _isAutoCrop() {\r\n\t\t\t\treturn this._data.actions.crop.type === CropType.AUTO;\r\n\t\t\t}\r\n\t\t}, {\r\n\t\t\tkey: '_toggleButton',\r\n\t\t\tvalue: function _toggleButton(action, state) {\r\n\t\t\t\ttoggleDisplayBySelector('.slim-btn[data-action=\"' + action + '\"]', state, this._element);\r\n\t\t\t}\r\n\t\t}, {\r\n\t\t\tkey: '_clearState',\r\n\t\t\tvalue: function _clearState() {\r\n\t\t\t\tthis._state = [];\r\n\t\t\t\tthis._updateState();\r\n\t\t\t}\r\n\t\t}, {\r\n\t\t\tkey: '_removeState',\r\n\t\t\tvalue: function _removeState(state) {\r\n\t\t\t\tthis._state = this._state.filter(function (item) {\r\n\t\t\t\t\treturn item !== state;\r\n\t\t\t\t});\r\n\t\t\t\tthis._updateState();\r\n\t\t\t}\r\n\t\t}, {\r\n\t\t\tkey: '_addState',\r\n\t\t\tvalue: function _addState(state) {\r\n\t\t\t\tif (inArray(state, this._state)) {\r\n\t\t\t\t\treturn;\r\n\t\t\t\t}\r\n\t\t\t\tthis._state.push(state);\r\n\t\t\t\tthis._updateState();\r\n\t\t\t}\r\n\t\t}, {\r\n\t\t\tkey: '_updateState',\r\n\t\t\tvalue: function _updateState() {\r\n\t\t\t\tif (!this._element) {\r\n\t\t\t\t\treturn;\r\n\t\t\t\t}\r\n\t\t\t\tthis._element.setAttribute('data-state', this._state.join(','));\r\n\t\t\t}\r\n\t\t}, {\r\n\t\t\tkey: '_resetData',\r\n\t\t\tvalue: function _resetData() {\r\n\r\n\t\t\t\t// resets data object\r\n\t\t\t\tthis._data = {\r\n\t\t\t\t\tserver: null,\r\n\t\t\t\t\tmeta: clone(this._options.meta),\r\n\t\t\t\t\tinput: {\r\n\t\t\t\t\t\tfield: this._inputReference,\r\n\t\t\t\t\t\tname: null,\r\n\t\t\t\t\t\ttype: null,\r\n\t\t\t\t\t\twidth: 0,\r\n\t\t\t\t\t\theight: 0,\r\n\t\t\t\t\t\tfile: null\r\n\t\t\t\t\t},\r\n\t\t\t\t\toutput: {\r\n\t\t\t\t\t\timage: null,\r\n\t\t\t\t\t\twidth: 0,\r\n\t\t\t\t\t\theight: 0\r\n\t\t\t\t\t},\r\n\t\t\t\t\tactions: {\r\n\t\t\t\t\t\trotation: null,\r\n\t\t\t\t\t\tcrop: null,\r\n\t\t\t\t\t\tsize: null\r\n\t\t\t\t\t}\r\n\t\t\t\t};\r\n\r\n\t\t\t\t// resets hidden input clone (has not yet been created when reset call in constructor, hence the check)\r\n\t\t\t\tif (this._output) {\r\n\t\t\t\t\tthis._output.value = '';\r\n\t\t\t\t}\r\n\r\n\t\t\t\t// should reset file input\r\n\t\t\t\tresetFileInput(this._getFileInput());\r\n\t\t\t}\r\n\r\n\t\t\t/**\r\n\t * Initialisation\r\n\t */\r\n\r\n\t\t}, {\r\n\t\t\tkey: '_init',\r\n\t\t\tvalue: function _init() {\r\n\t\t\t\tvar _this12 = this;\r\n\r\n\t\t\t\t// busy initialising\r\n\t\t\t\tthis._isInitialising = true;\r\n\r\n\t\t\t\t// cropper root is not file input\r\n\t\t\t\tthis._addState('empty');\r\n\r\n\t\t\t\t// define input reference field name\r\n\t\t\t\tif (inArray('input', this._options.post)) {\r\n\t\t\t\t\tthis._inputReference = 'slim_input_' + this._uid;\r\n\t\t\t\t}\r\n\r\n\t\t\t\t// get input element\r\n\t\t\t\tthis._input = this._getInputElement();\r\n\r\n\t\t\t\t// if no input supplied we'll automatically create one\r\n\t\t\t\tif (!this._input) {\r\n\t\t\t\t\tthis._input = create('input');\r\n\t\t\t\t\tthis._input.type = 'file';\r\n\t\t\t\t\tthis._element.appendChild(this._input);\r\n\t\t\t\t}\r\n\r\n\t\t\t\t// get required state of input element\r\n\t\t\t\tthis._isRequired = this._input.required === true;\r\n\r\n\t\t\t\t// set or create output field\r\n\t\t\t\tthis._output = this._element.querySelector('input[type=hidden]');\r\n\r\n\t\t\t\t// if no output element defined we'll create one automagically\r\n\t\t\t\tif (!this._output) {\r\n\t\t\t\t\tthis._output = create('input');\r\n\t\t\t\t\tthis._output.type = 'hidden';\r\n\t\t\t\t\tthis._output.name = this._input.name || this._options.defaultInputName;\r\n\t\t\t\t\tthis._element.appendChild(this._output);\r\n\t\t\t\t}\r\n\r\n\t\t\t\t// prevent the original file input field from posting (value will be duplicated to output field)\r\n\t\t\t\tthis._input.removeAttribute('name');\r\n\r\n\t\t\t\t// create drop area\r\n\t\t\t\tvar area = create('div', 'slim-area');\r\n\r\n\t\t\t\t// test if contains initial image\r\n\t\t\t\tvar initialImage = this._getInitialImage();\r\n\t\t\t\tvar initialImageSrc = (initialImage || {}).src;\r\n\t\t\t\tif (initialImageSrc) {\r\n\t\t\t\t\tthis._hasInitialImage = true;\r\n\t\t\t\t} else {\r\n\t\t\t\t\tthis._initialCrop = null;\r\n\t\t\t\t\tthis._initialRotation = null;\r\n\t\t\t\t}\r\n\r\n\t\t\t\tvar resultHTML = '\\n\\t\\t
\\n\\t\\t\\t\\n\\t\\t
';\r\n\r\n\t\t\t\t// add drop overlay\r\n\t\t\t\tif (this._isImageOnly()) {\r\n\t\t\t\t\tarea.innerHTML = '\\n\\t\\t\\t\\t' + SlimLoaderHTML + '\\n\\t\\t\\t\\t' + SlimUploadStatusHTML + '\\n\\t\\t\\t\\t' + resultHTML + '\\n\\t\\t\\t\\t
' + (this._options.labelLoading || '') + '
\\n\\t\\t\\t';\r\n\t\t\t\t} else {\r\n\r\n\t\t\t\t\t// if should post input data\r\n\t\t\t\t\tif (inArray('input', this._options.post)) {\r\n\r\n\t\t\t\t\t\tthis._data.input.field = this._inputReference;\r\n\r\n\t\t\t\t\t\t// if is sync post\r\n\t\t\t\t\t\t// and should post input data\r\n\t\t\t\t\t\tif (!this._options.service) {\r\n\t\t\t\t\t\t\tthis._input.name = this._inputReference;\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t}\r\n\r\n\t\t\t\t\t// set common image mime type to the accept attribute\r\n\t\t\t\t\tvar mimetypes = void 0;\r\n\t\t\t\t\tif (!this._input.hasAttribute('accept') || this._input.getAttribute('accept') === 'image/*') {\r\n\t\t\t\t\t\tmimetypes = getCommonMimeTypes();\r\n\t\t\t\t\t\tthis._input.setAttribute('accept', mimetypes.join(','));\r\n\t\t\t\t\t} else {\r\n\t\t\t\t\t\tmimetypes = this._input.accept.split(',').map(function (mimetype) {\r\n\t\t\t\t\t\t\treturn mimetype.trim();\r\n\t\t\t\t\t\t}).filter(function (mimetype) {\r\n\t\t\t\t\t\t\treturn mimetype.length > 0;\r\n\t\t\t\t\t\t});\r\n\t\t\t\t\t}\r\n\r\n\t\t\t\t\t// setup hopper\r\n\t\t\t\t\tthis._imageHopper = new FileHopper();\r\n\t\t\t\t\tthis._imageHopper.accept = mimetypes;\r\n\t\t\t\t\tthis._imageHopper.allowURLs = typeof this._options.fetcher === 'string';\r\n\t\t\t\t\tthis._element.appendChild(this._imageHopper.element);\r\n\t\t\t\t\tHopperEvents.forEach(function (e) {\r\n\t\t\t\t\t\t_this12._imageHopper.element.addEventListener(e, _this12);\r\n\t\t\t\t\t});\r\n\r\n\t\t\t\t\t// render area\r\n\t\t\t\t\tarea.innerHTML = '\\n\\t\\t\\t\\t' + SlimLoaderHTML + '\\n\\t\\t\\t\\t' + SlimUploadStatusHTML + '\\n\\t\\t\\t\\t
\\n\\t\\t\\t\\t
' + (this._options.label || '') + '
' + (this._options.labelLoading || '') + '
\\n\\t\\t\\t\\t' + resultHTML + '\\n\\t\\t\\t';\r\n\r\n\t\t\t\t\t// start listening for events so we can load image on file input change\r\n\t\t\t\t\tthis._input.addEventListener('change', this);\r\n\t\t\t\t}\r\n\r\n\t\t\t\t// add area node\r\n\t\t\t\tthis._element.appendChild(area);\r\n\r\n\t\t\t\t// add button group\r\n\t\t\t\tthis._btnGroup = create('div', 'slim-btn-group');\r\n\t\t\t\tthis._btnGroup.style.display = 'none';\r\n\t\t\t\tthis._element.appendChild(this._btnGroup);\r\n\t\t\t\tSlimButtons.filter(function (c) {\r\n\t\t\t\t\treturn _this12._isButtonAllowed(c);\r\n\t\t\t\t}).forEach(function (c) {\r\n\t\t\t\t\tvar prop = capitalizeFirstLetter(c);\r\n\t\t\t\t\tvar label = _this12._options['button' + prop + 'Label'];\r\n\t\t\t\t\tvar title = _this12._options['button' + prop + 'Title'] || label;\r\n\t\t\t\t\tvar className = _this12._options['button' + prop + 'ClassName'];\r\n\t\t\t\t\tvar btn = create('button', 'slim-btn slim-btn-' + c + (className ? ' ' + className : ''));\r\n\t\t\t\t\tbtn.innerHTML = label;\r\n\t\t\t\t\tbtn.title = title;\r\n\t\t\t\t\tbtn.type = 'button';\r\n\t\t\t\t\tbtn.addEventListener('click', _this12);\r\n\t\t\t\t\tbtn.setAttribute('data-action', c);\r\n\t\t\t\t\t_this12._btnGroup.appendChild(btn);\r\n\t\t\t\t});\r\n\r\n\t\t\t\t// add ratio padding\r\n\t\t\t\tif (this._isFixedRatio()) {\r\n\t\t\t\t\tvar parts = intSplit(this._options.ratio, ':');\r\n\t\t\t\t\tthis._ratio = parts[1] / parts[0];\r\n\t\t\t\t\tthis._scaleDropArea(this._ratio);\r\n\t\t\t\t}\r\n\r\n\t\t\t\t// setup loader\r\n\t\t\t\tthis._updateProgress(.5);\r\n\r\n\t\t\t\t// preload source\r\n\t\t\t\tif (initialImageSrc) {\r\n\r\n\t\t\t\t\tthis._load(initialImageSrc, function () {\r\n\t\t\t\t\t\t_this12._onInit();\r\n\t\t\t\t\t});\r\n\t\t\t\t} else {\r\n\t\t\t\t\tthis._onInit();\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}, {\r\n\t\t\tkey: '_onInit',\r\n\t\t\tvalue: function _onInit() {\r\n\t\t\t\tvar _this13 = this;\r\n\r\n\t\t\t\t// we're done initialising\r\n\t\t\t\tthis._isInitialising = false;\r\n\r\n\t\t\t\t// done initialising now, else is only called after image load\r\n\t\t\t\tvar done = function done() {\r\n\t\t\t\t\t// we call this async so the constructor of Slim has returned before the onInit is called, allowing clean immidiate destroy\r\n\t\t\t\t\tvar timer = setTimeout(function () {\r\n\t\t\t\t\t\t_this13._options.didInit.apply(_this13, [_this13.data]);\r\n\t\t\t\t\t}, 0);\r\n\t\t\t\t\t_this13._timers.push(timer);\r\n\t\t\t\t};\r\n\r\n\t\t\t\t// save initial image\r\n\t\t\t\tif (this._options.saveInitialImage && this.containsImage()) {\r\n\r\n\t\t\t\t\tif (!this._options.service) {\r\n\t\t\t\t\t\tthis._save(function () {\r\n\t\t\t\t\t\t\tdone();\r\n\t\t\t\t\t\t}, false);\r\n\t\t\t\t\t}\r\n\t\t\t\t} else {\r\n\r\n\t\t\t\t\t// by default upload button is disabled for existing images\r\n\t\t\t\t\tif (this._options.service && this.containsImage()) {\r\n\t\t\t\t\t\tthis._toggleButton('upload', false);\r\n\t\t\t\t\t}\r\n\r\n\t\t\t\t\tdone();\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}, {\r\n\t\t\tkey: '_updateProgress',\r\n\t\t\tvalue: function _updateProgress(progress) {\r\n\r\n\t\t\t\tif (isNaN(progress)) {\r\n\t\t\t\t\treturn;\r\n\t\t\t\t}\r\n\r\n\t\t\t\tprogress = Math.min(.99999, progress);\r\n\r\n\t\t\t\tif (!this._element) {\r\n\t\t\t\t\treturn;\r\n\t\t\t\t}\r\n\r\n\t\t\t\tif (!this._progressEnabled) {\r\n\t\t\t\t\treturn;\r\n\t\t\t\t}\r\n\r\n\t\t\t\tvar loader = this._element.querySelector('.slim-loader');\r\n\t\t\t\tif (!loader) {\r\n\t\t\t\t\treturn;\r\n\t\t\t\t}\r\n\r\n\t\t\t\tvar size = loader.offsetWidth;\r\n\t\t\t\tvar paths = loader.querySelectorAll('path');\r\n\t\t\t\tvar ringWidth = parseInt(paths[0].getAttribute('stroke-width'), 10);\r\n\r\n\t\t\t\tpaths[0].setAttribute('d', percentageArc(size * .5, size * .5, size * .5 - ringWidth, .9999));\r\n\r\n\t\t\t\tpaths[1].setAttribute('d', percentageArc(size * .5, size * .5, size * .5 - ringWidth, progress));\r\n\t\t\t}\r\n\t\t}, {\r\n\t\t\tkey: '_startProgress',\r\n\t\t\tvalue: function _startProgress(cb) {\r\n\t\t\t\tvar _this14 = this;\r\n\r\n\t\t\t\tif (!this._element) {\r\n\t\t\t\t\treturn;\r\n\t\t\t\t}\r\n\r\n\t\t\t\tthis._progressEnabled = false;\r\n\r\n\t\t\t\tvar loader = this._element.querySelector('.slim-loader');\r\n\t\t\t\tif (!loader) {\r\n\t\t\t\t\treturn;\r\n\t\t\t\t}\r\n\t\t\t\tvar ring = loader.children[0];\r\n\r\n\t\t\t\tthis._stopProgressLoop(function () {\r\n\r\n\t\t\t\t\tloader.removeAttribute('style');\r\n\t\t\t\t\tring.removeAttribute('style');\r\n\r\n\t\t\t\t\t_this14._progressEnabled = true;\r\n\r\n\t\t\t\t\t_this14._updateProgress(0);\r\n\r\n\t\t\t\t\t_this14._progressEnabled = false;\r\n\r\n\t\t\t\t\tsnabbt(ring, {\r\n\r\n\t\t\t\t\t\tfromOpacity: 0,\r\n\t\t\t\t\t\topacity: 1,\r\n\t\t\t\t\t\tduration: 250,\r\n\t\t\t\t\t\tcomplete: function complete() {\r\n\t\t\t\t\t\t\t_this14._progressEnabled = true;\r\n\t\t\t\t\t\t\tif (cb) {\r\n\t\t\t\t\t\t\t\tcb();\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\t\t\t\t});\r\n\t\t\t}\r\n\t\t}, {\r\n\t\t\tkey: '_stopProgress',\r\n\t\t\tvalue: function _stopProgress() {\r\n\t\t\t\tvar _this15 = this;\r\n\r\n\t\t\t\tif (!this._element) {\r\n\t\t\t\t\treturn;\r\n\t\t\t\t}\r\n\r\n\t\t\t\tvar loader = this._element.querySelector('.slim-loader');\r\n\t\t\t\tif (!loader) {\r\n\t\t\t\t\treturn;\r\n\t\t\t\t}\r\n\t\t\t\tvar ring = loader.children[0];\r\n\r\n\t\t\t\tthis._updateProgress(1);\r\n\r\n\t\t\t\tsnabbt(ring, {\r\n\t\t\t\t\tfromOpacity: 1,\r\n\t\t\t\t\topacity: 0,\r\n\t\t\t\t\tduration: 250,\r\n\t\t\t\t\tcomplete: function complete() {\r\n\r\n\t\t\t\t\t\tloader.removeAttribute('style');\r\n\t\t\t\t\t\tring.removeAttribute('style');\r\n\r\n\t\t\t\t\t\t_this15._updateProgress(.5);\r\n\r\n\t\t\t\t\t\t_this15._progressEnabled = false;\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: '_startProgressLoop',\r\n\t\t\tvalue: function _startProgressLoop() {\r\n\r\n\t\t\t\tif (!this._element) {\r\n\t\t\t\t\treturn;\r\n\t\t\t\t}\r\n\r\n\t\t\t\t// start loading animation\r\n\t\t\t\tvar loader = this._element.querySelector('.slim-loader');\r\n\t\t\t\tif (!loader) {\r\n\t\t\t\t\treturn;\r\n\t\t\t\t}\r\n\r\n\t\t\t\tvar ring = loader.children[0];\r\n\t\t\t\tloader.removeAttribute('style');\r\n\t\t\t\tring.removeAttribute('style');\r\n\r\n\t\t\t\t// set infinite load state\r\n\t\t\t\tthis._updateProgress(.5);\r\n\r\n\t\t\t\t// repeat!\r\n\t\t\t\tvar repeat = 1000;\r\n\r\n\t\t\t\tsnabbt(loader, 'stop');\r\n\r\n\t\t\t\tsnabbt(loader, {\r\n\t\t\t\t\trotation: [0, 0, -(Math.PI * 2) * repeat],\r\n\t\t\t\t\teasing: 'linear',\r\n\t\t\t\t\tduration: repeat * 1000\r\n\t\t\t\t});\r\n\r\n\t\t\t\tsnabbt(ring, {\r\n\t\t\t\t\tfromOpacity: 0,\r\n\t\t\t\t\topacity: 1,\r\n\t\t\t\t\tduration: 250\r\n\t\t\t\t});\r\n\t\t\t}\r\n\t\t}, {\r\n\t\t\tkey: '_stopProgressLoop',\r\n\t\t\tvalue: function _stopProgressLoop(callback) {\r\n\r\n\t\t\t\tif (!this._element) {\r\n\t\t\t\t\treturn;\r\n\t\t\t\t}\r\n\r\n\t\t\t\tvar loader = this._element.querySelector('.slim-loader');\r\n\t\t\t\tif (!loader) {\r\n\t\t\t\t\treturn;\r\n\t\t\t\t}\r\n\r\n\t\t\t\tvar ring = loader.children[0];\r\n\r\n\t\t\t\tsnabbt(ring, {\r\n\t\t\t\t\tfromOpacity: parseFloat(ring.style.opacity),\r\n\t\t\t\t\topacity: 0,\r\n\t\t\t\t\tduration: 250,\r\n\t\t\t\t\tcomplete: function complete() {\r\n\r\n\t\t\t\t\t\tsnabbt(loader, 'stop');\r\n\r\n\t\t\t\t\t\tloader.removeAttribute('style');\r\n\t\t\t\t\t\tring.removeAttribute('style');\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\t\t\t\t});\r\n\t\t\t}\r\n\t\t}, {\r\n\t\t\tkey: '_isButtonAllowed',\r\n\t\t\tvalue: function _isButtonAllowed(button) {\r\n\r\n\t\t\t\tif (button === 'edit') {\r\n\t\t\t\t\treturn this._options.edit;\r\n\t\t\t\t}\r\n\r\n\t\t\t\tif (button === 'download') {\r\n\t\t\t\t\treturn this._options.download;\r\n\t\t\t\t}\r\n\r\n\t\t\t\tif (button === 'upload') {\r\n\r\n\t\t\t\t\t// if no service defined upload button makes no sense\r\n\t\t\t\t\tif (!this._options.service) {\r\n\t\t\t\t\t\treturn false;\r\n\t\t\t\t\t}\r\n\r\n\t\t\t\t\t// if push mode is set, no need for upload button\r\n\t\t\t\t\tif (this._options.push) {\r\n\t\t\t\t\t\treturn false;\r\n\t\t\t\t\t}\r\n\r\n\t\t\t\t\t// set upload button\r\n\t\t\t\t\treturn true;\r\n\t\t\t\t}\r\n\r\n\t\t\t\tif (button === 'remove') {\r\n\t\t\t\t\treturn !this._isImageOnly();\r\n\t\t\t\t}\r\n\r\n\t\t\t\treturn true;\r\n\t\t\t}\r\n\t\t}, {\r\n\t\t\tkey: '_fallback',\r\n\t\t\tvalue: function _fallback() {\r\n\r\n\t\t\t\t// create status area\r\n\t\t\t\tvar area = create('div', 'slim-area');\r\n\t\t\t\tarea.innerHTML = '\\n\\t\\t\\t
' + (this._options.label || '') + '
\\n\\t\\t';\r\n\t\t\t\tthis._element.appendChild(area);\r\n\r\n\t\t\t\tthis._throwError(this._options.statusNoSupport);\r\n\t\t\t}\r\n\r\n\t\t\t/**\r\n\t * Event routing\r\n\t */\r\n\r\n\t\t}, {\r\n\t\t\tkey: 'handleEvent',\r\n\t\t\tvalue: function handleEvent(e) {\r\n\r\n\t\t\t\tswitch (e.type) {\r\n\t\t\t\t\tcase 'click':\r\n\t\t\t\t\t\tthis._onClick(e);\r\n\t\t\t\t\t\tbreak;\r\n\t\t\t\t\tcase 'change':\r\n\t\t\t\t\t\tthis._onChange(e);\r\n\t\t\t\t\t\tbreak;\r\n\t\t\t\t\tcase 'cancel':\r\n\t\t\t\t\t\tthis._onCancel(e);\r\n\t\t\t\t\t\tbreak;\r\n\t\t\t\t\tcase 'confirm':\r\n\t\t\t\t\t\tthis._onConfirm(e);\r\n\t\t\t\t\t\tbreak;\r\n\t\t\t\t\tcase 'file-over':\r\n\t\t\t\t\t\tthis._onFileOver(e);\r\n\t\t\t\t\t\tbreak;\r\n\t\t\t\t\tcase 'file-out':\r\n\t\t\t\t\t\tthis._onFileOut(e);\r\n\t\t\t\t\t\tbreak;\r\n\t\t\t\t\tcase 'file-drop':\r\n\t\t\t\t\t\tthis._onDropFile(e);\r\n\t\t\t\t\t\tbreak;\r\n\t\t\t\t\tcase 'file-invalid':\r\n\t\t\t\t\t\tthis._onInvalidFile(e);\r\n\t\t\t\t\t\tbreak;\r\n\t\t\t\t\tcase 'file-invalid-drop':\r\n\t\t\t\t\t\tthis._onInvalidFileDrop(e);\r\n\t\t\t\t\t\tbreak;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}, {\r\n\t\t\tkey: '_getIntro',\r\n\t\t\tvalue: function _getIntro() {\r\n\t\t\t\treturn this._element.querySelector('.slim-result .in');\r\n\t\t\t}\r\n\t\t}, {\r\n\t\t\tkey: '_getOutro',\r\n\t\t\tvalue: function _getOutro() {\r\n\t\t\t\treturn this._element.querySelector('.slim-result .out');\r\n\t\t\t}\r\n\t\t}, {\r\n\t\t\tkey: '_getInOut',\r\n\t\t\tvalue: function _getInOut() {\r\n\t\t\t\treturn this._element.querySelectorAll('.slim-result img');\r\n\t\t\t}\r\n\t\t}, {\r\n\t\t\tkey: '_getDrip',\r\n\t\t\tvalue: function _getDrip() {\r\n\t\t\t\tif (!this._drip) {\r\n\t\t\t\t\tthis._drip = this._element.querySelector('.slim-drip > span');\r\n\t\t\t\t}\r\n\t\t\t\treturn this._drip;\r\n\t\t\t}\r\n\r\n\t\t\t// errors\r\n\r\n\t\t}, {\r\n\t\t\tkey: '_throwError',\r\n\t\t\tvalue: function _throwError(error) {\r\n\r\n\t\t\t\tthis._addState('error');\r\n\r\n\t\t\t\tthis._element.querySelector('.slim-label').style.display = 'none';\r\n\r\n\t\t\t\tvar node = this._element.querySelector('.slim-error');\r\n\t\t\t\tif (!node) {\r\n\t\t\t\t\tnode = create('div', 'slim-error');\r\n\t\t\t\t\tthis._element.querySelector('.slim-status').appendChild(node);\r\n\t\t\t\t}\r\n\r\n\t\t\t\tnode.innerHTML = error;\r\n\t\t\t}\r\n\t\t}, {\r\n\t\t\tkey: '_removeError',\r\n\t\t\tvalue: function _removeError() {\r\n\r\n\t\t\t\tthis._removeState('error');\r\n\t\t\t\tthis._element.querySelector('.slim-label').style.display = '';\r\n\r\n\t\t\t\tvar error = this._element.querySelector('.slim-error');\r\n\t\t\t\tif (error) {\r\n\t\t\t\t\terror.parentNode.removeChild(error);\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}, {\r\n\t\t\tkey: '_openFileDialog',\r\n\t\t\tvalue: function _openFileDialog() {\r\n\t\t\t\tthis._removeError();\r\n\t\t\t\tthis._input.click();\r\n\t\t\t}\r\n\r\n\t\t\t// drop area clicked\r\n\r\n\t\t}, {\r\n\t\t\tkey: '_onClick',\r\n\t\t\tvalue: function _onClick(e) {\r\n\t\t\t\tvar _this16 = this;\r\n\r\n\t\t\t\tvar list = e.target.classList;\r\n\t\t\t\tvar target = e.target;\r\n\r\n\t\t\t\t// no preview, so possible to drop file\r\n\t\t\t\tif (list.contains('slim-file-hopper')) {\r\n\t\t\t\t\tthis._openFileDialog();\r\n\t\t\t\t\treturn;\r\n\t\t\t\t}\r\n\r\n\t\t\t\t// decide what button was clicked\r\n\t\t\t\tswitch (target.getAttribute('data-action')) {\r\n\t\t\t\t\tcase 'remove':\r\n\t\t\t\t\t\tthis._options.willRemove.apply(this, [this.data, function () {\r\n\t\t\t\t\t\t\t_this16._doRemove(true);\r\n\t\t\t\t\t\t}]);\r\n\t\t\t\t\t\tbreak;\r\n\t\t\t\t\tcase 'edit':\r\n\t\t\t\t\t\tthis._doEdit();\r\n\t\t\t\t\t\tbreak;\r\n\t\t\t\t\tcase 'download':\r\n\t\t\t\t\t\tthis._doDownload();\r\n\t\t\t\t\t\tbreak;\r\n\t\t\t\t\tcase 'upload':\r\n\t\t\t\t\t\tthis._doUpload();\r\n\t\t\t\t\t\tbreak;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}, {\r\n\t\t\tkey: '_onInvalidFileDrop',\r\n\t\t\tvalue: function _onInvalidFileDrop() {\r\n\r\n\t\t\t\tthis._onInvalidFile();\r\n\r\n\t\t\t\tthis._removeState('file-over');\r\n\r\n\t\t\t\t// animate out drip\r\n\t\t\t\tvar drip = this._getDrip();\r\n\t\t\t\tsnabbt(drip.firstChild, {\r\n\t\t\t\t\tfromScale: [.5, .5],\r\n\t\t\t\t\tscale: [0, 0],\r\n\t\t\t\t\tfromOpacity: .5,\r\n\t\t\t\t\topacity: 0,\r\n\t\t\t\t\tduration: 150,\r\n\t\t\t\t\tcomplete: function complete() {\r\n\r\n\t\t\t\t\t\t// clean up transforms\r\n\t\t\t\t\t\tresetTransforms(drip.firstChild);\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: '_onInvalidFile',\r\n\t\t\tvalue: function _onInvalidFile() {\r\n\r\n\t\t\t\tvar types = this._imageHopper.accept.map(getExtensionByMimeType);\r\n\t\t\t\tvar error = this._options.statusFileType.replace('$0', types.join(', '));\r\n\t\t\t\tthis._throwError(error);\r\n\t\t\t}\r\n\t\t}, {\r\n\t\t\tkey: '_onImageTooSmall',\r\n\t\t\tvalue: function _onImageTooSmall() {\r\n\r\n\t\t\t\tvar error = this._options.statusImageTooSmall.replace('$0', this._options.minSize.width + ' \\xD7 ' + this._options.minSize.height);\r\n\t\t\t\tthis._throwError(error);\r\n\t\t\t}\r\n\t\t}, {\r\n\t\t\tkey: '_onOverWeightFile',\r\n\t\t\tvalue: function _onOverWeightFile() {\r\n\r\n\t\t\t\tvar error = this._options.statusFileSize.replace('$0', this._options.maxFileSize);\r\n\t\t\t\tthis._throwError(error);\r\n\t\t\t}\r\n\t\t}, {\r\n\t\t\tkey: '_onRemoteURLProblem',\r\n\t\t\tvalue: function _onRemoteURLProblem(error) {\r\n\t\t\t\tthis._throwError(error);\r\n\t\t\t}\r\n\t\t}, {\r\n\t\t\tkey: '_onFileOver',\r\n\t\t\tvalue: function _onFileOver(e) {\r\n\r\n\t\t\t\tthis._addState('file-over');\r\n\t\t\t\tthis._removeError();\r\n\r\n\t\t\t\t// animations\r\n\t\t\t\tvar drip = this._getDrip();\r\n\r\n\t\t\t\t// move around drip\r\n\t\t\t\tvar matrix = snabbt.createMatrix();\r\n\t\t\t\tmatrix.translate(e.detail.x, e.detail.y, 0);\r\n\t\t\t\tsnabbt.setElementTransform(drip, matrix);\r\n\r\n\t\t\t\t// on first entry fade in blob\r\n\t\t\t\tif (this._imageHopper.dragPath.length == 1) {\r\n\r\n\t\t\t\t\t// show\r\n\t\t\t\t\tdrip.style.opacity = 1;\r\n\r\n\t\t\t\t\t// animate in\r\n\t\t\t\t\tsnabbt(drip.firstChild, {\r\n\t\t\t\t\t\tfromOpacity: 0,\r\n\t\t\t\t\t\topacity: .5,\r\n\t\t\t\t\t\tfromScale: [0, 0],\r\n\t\t\t\t\t\tscale: [.5, .5],\r\n\t\t\t\t\t\tduration: 150\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: '_onFileOut',\r\n\t\t\tvalue: function _onFileOut(e) {\r\n\r\n\t\t\t\tthis._removeState('file-over');\r\n\t\t\t\tthis._removeState('file-invalid');\r\n\t\t\t\tthis._removeError();\r\n\r\n\t\t\t\t// move to last position\r\n\t\t\t\tvar drip = this._getDrip();\r\n\t\t\t\tvar matrix = snabbt.createMatrix();\r\n\t\t\t\tmatrix.translate(e.detail.x, e.detail.y, 0);\r\n\t\t\t\tsnabbt.setElementTransform(drip, matrix);\r\n\r\n\t\t\t\t// animate out\r\n\t\t\t\tsnabbt(drip.firstChild, {\r\n\t\t\t\t\tfromScale: [.5, .5],\r\n\t\t\t\t\tscale: [0, 0],\r\n\t\t\t\t\tfromOpacity: .5,\r\n\t\t\t\t\topacity: 0,\r\n\t\t\t\t\tduration: 150,\r\n\t\t\t\t\tcomplete: function complete() {\r\n\r\n\t\t\t\t\t\t// clean up transforms\r\n\t\t\t\t\t\tresetTransforms(drip.firstChild);\r\n\t\t\t\t\t}\r\n\t\t\t\t});\r\n\t\t\t}\r\n\r\n\t\t\t/**\r\n\t * When a file was literally dropped on the drop area\r\n\t * @param e\r\n\t * @private\r\n\t */\r\n\r\n\t\t}, {\r\n\t\t\tkey: '_onDropFile',\r\n\t\t\tvalue: function _onDropFile(e) {\r\n\t\t\t\tvar _this17 = this;\r\n\r\n\t\t\t\tthis._removeState('file-over');\r\n\r\n\t\t\t\t// get drip node reference and set to last position\r\n\t\t\t\tvar drip = this._getDrip();\r\n\t\t\t\tvar matrix = snabbt.createMatrix();\r\n\t\t\t\tmatrix.translate(e.detail.x, e.detail.y, 0);\r\n\t\t\t\tsnabbt.setElementTransform(drip, matrix);\r\n\r\n\t\t\t\t// get element minimum 10 entries distant from the last entry so we can calculate velocity of movement\r\n\t\t\t\tvar l = this._imageHopper.dragPath.length;\r\n\t\t\t\tvar jump = this._imageHopper.dragPath[l - Math.min(10, l)];\r\n\r\n\t\t\t\t// velocity\r\n\t\t\t\tvar dx = e.detail.x - jump.x;\r\n\t\t\t\tvar dy = e.detail.y - jump.y;\r\n\r\n\t\t\t\tsnabbt(drip, {\r\n\t\t\t\t\tfromPosition: [e.detail.x, e.detail.y, 0],\r\n\t\t\t\t\tposition: [e.detail.x + dx, e.detail.y + dy, 0],\r\n\t\t\t\t\tduration: 200\r\n\t\t\t\t});\r\n\r\n\t\t\t\t// animate out drip\r\n\t\t\t\tsnabbt(drip.firstChild, {\r\n\r\n\t\t\t\t\tfromScale: [.5, .5],\r\n\t\t\t\t\tscale: [2, 2],\r\n\t\t\t\t\tfromOpacity: 1,\r\n\t\t\t\t\topacity: 0,\r\n\t\t\t\t\tduration: 200,\r\n\r\n\t\t\t\t\tcomplete: function complete() {\r\n\r\n\t\t\t\t\t\t// clean up transforms\r\n\t\t\t\t\t\tresetTransforms(drip.firstChild);\r\n\r\n\t\t\t\t\t\t// load dropped resource\r\n\t\t\t\t\t\t_this17._load(e.target.files[0]);\r\n\t\t\t\t\t}\r\n\t\t\t\t});\r\n\t\t\t}\r\n\r\n\t\t\t/**\r\n\t * When a file has been selected after a click on the drop area\r\n\t * @param e\r\n\t * @private\r\n\t */\r\n\r\n\t\t}, {\r\n\t\t\tkey: '_onChange',\r\n\t\t\tvalue: function _onChange(e) {\r\n\r\n\t\t\t\tif (e.target.files.length) {\r\n\t\t\t\t\tthis._load(e.target.files[0]);\r\n\t\t\t\t}\r\n\t\t\t}\r\n\r\n\t\t\t/**\r\n\t * Loads a resource (blocking operation)\r\n\t * @param resource\r\n\t * @param callback(err)\r\n\t * @private\r\n\t */\r\n\r\n\t\t}, {\r\n\t\t\tkey: '_load',\r\n\t\t\tvalue: function _load(resource, callback) {\r\n\t\t\t\tvar _this18 = this;\r\n\r\n\t\t\t\t// stop here\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// if currently contains image, remove it\r\n\t\t\t\tif (this.containsImage()) {\r\n\r\n\t\t\t\t\tclearTimeout(this._replaceTimeout);\r\n\r\n\t\t\t\t\tthis._doRemove(false, function () {\r\n\r\n\t\t\t\t\t\t_this18._replaceTimeout = setTimeout(function () {\r\n\t\t\t\t\t\t\t_this18._load(resource, callback);\r\n\t\t\t\t\t\t}, 100);\r\n\t\t\t\t\t});\r\n\r\n\t\t\t\t\treturn;\r\n\t\t\t\t}\r\n\r\n\t\t\t\t// no longer empty\r\n\t\t\t\tthis._removeState('empty');\r\n\t\t\t\tthis._addState('busy');\r\n\r\n\t\t\t\t// start loading indicator\r\n\t\t\t\tthis._startProgressLoop();\r\n\r\n\t\t\t\t// can't drop any other image while loading\r\n\t\t\t\tif (this._imageHopper) {\r\n\t\t\t\t\tthis._imageHopper.enabled = false;\r\n\t\t\t\t}\r\n\r\n\t\t\t\tclearTimeout(this._loadTimeout);\r\n\t\t\t\tvar load = function load() {\r\n\t\t\t\t\tclearTimeout(_this18._loadTimeout);\r\n\t\t\t\t\t_this18._loadTimeout = setTimeout(function () {\r\n\r\n\t\t\t\t\t\tif (_this18._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\t_this18._addState('loading');\r\n\r\n\t\t\t\t\t\tsnabbt(_this18._element.querySelector('.slim-label-loading'), {\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\tduration: 250\r\n\t\t\t\t\t\t});\r\n\t\t\t\t\t}, 500);\r\n\t\t\t\t};\r\n\r\n\t\t\t\t// early exit\r\n\t\t\t\tvar exit = function exit() {\r\n\t\t\t\t\tif (_this18._imageHopper) {\r\n\t\t\t\t\t\t_this18._imageHopper.enabled = true;\r\n\t\t\t\t\t}\r\n\t\t\t\t\t_this18._removeState('loading');\r\n\t\t\t\t\t_this18._removeState('busy');\r\n\t\t\t\t\t_this18._addState('empty');\r\n\t\t\t\t\t_this18._stopProgressLoop();\r\n\t\t\t\t};\r\n\r\n\t\t\t\t// turn string based resources (url / base64) into file objects\r\n\t\t\t\tif (typeof resource === 'string') {\r\n\r\n\t\t\t\t\tif (resourceIsBase64Data(resource)) {\r\n\t\t\t\t\t\t// resource is base64 data, turn into file\r\n\t\t\t\t\t\tthis._load(base64ToBlob(resource), callback);\r\n\t\t\t\t\t} else {\r\n\r\n\t\t\t\t\t\t// will take a while, show loading indicator\r\n\t\t\t\t\t\tload();\r\n\r\n\t\t\t\t\t\t// resource is url, load with XHR\r\n\t\t\t\t\t\tloadURL(resource, function (file) {\r\n\t\t\t\t\t\t\t// continue with file object\r\n\t\t\t\t\t\t\t_this18._load(file, callback);\r\n\t\t\t\t\t\t});\r\n\t\t\t\t\t}\r\n\r\n\t\t\t\t\t// don't continue, wait for load\r\n\t\t\t\t\treturn;\r\n\t\t\t\t} else if (typeof resource.remote !== 'undefined' && this._options.fetcher) {\r\n\r\n\t\t\t\t\tloadRemoteURL(this._options.fetcher, resource.remote, function (error) {\r\n\r\n\t\t\t\t\t\texit();\r\n\r\n\t\t\t\t\t\t_this18._onRemoteURLProblem('

' + 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 \"\" : [[\"googol\"], 1e100, \"prefix\"],\r\n \"\" : [[\"Ki\",\"Kibi\",\"kibi\"], Math.pow(2,10), \"prefix\"],\r\n \"\" : [[\"Mi\",\"Mebi\",\"mebi\"], Math.pow(2,20), \"prefix\"],\r\n \"\" : [[\"Gi\",\"Gibi\",\"gibi\"], Math.pow(2,30), \"prefix\"],\r\n \"\" : [[\"Ti\",\"Tebi\",\"tebi\"], Math.pow(2,40), \"prefix\"],\r\n \"\" : [[\"Pi\",\"Pebi\",\"pebi\"], Math.pow(2,50), \"prefix\"],\r\n \"\" : [[\"Ei\",\"Exi\",\"exi\"], Math.pow(2,60), \"prefix\"],\r\n \"\" : [[\"Zi\",\"Zebi\",\"zebi\"], Math.pow(2,70), \"prefix\"],\r\n \"\" : [[\"Yi\",\"Yebi\",\"yebi\"], Math.pow(2,80), \"prefix\"],\r\n \"\" : [[\"Y\",\"Yotta\",\"yotta\"], 1e24, \"prefix\"],\r\n \"\" : [[\"Z\",\"Zetta\",\"zetta\"], 1e21, \"prefix\"],\r\n \"\" : [[\"E\",\"Exa\",\"exa\"], 1e18, \"prefix\"],\r\n \"\" : [[\"P\",\"Peta\",\"peta\"], 1e15, \"prefix\"],\r\n \"\" : [[\"T\",\"Tera\",\"tera\"], 1e12, \"prefix\"],\r\n \"\" : [[\"G\",\"Giga\",\"giga\"], 1e9, \"prefix\"],\r\n \"\" : [[\"M\",\"Mega\",\"mega\"], 1e6, \"prefix\"],\r\n \"\" : [[\"k\",\"kilo\"], 1e3, \"prefix\"],\r\n \"\" : [[\"h\",\"Hecto\",\"hecto\"], 1e2, \"prefix\"],\r\n \"\" : [[\"da\",\"Deca\",\"deca\",\"deka\"], 1e1, \"prefix\"],\r\n \"\" : [[\"d\",\"Deci\",\"deci\"], 1e-1, \"prefix\"],\r\n \"\" : [[\"c\",\"Centi\",\"centi\"], 1e-2, \"prefix\"],\r\n \"\" : [[\"m\",\"Milli\",\"milli\"], 1e-3, \"prefix\"],\r\n \"\" : [\r\n [\"u\",\"\\u03BC\"/*µ as greek letter*/,\"\\u00B5\"/*µ as micro sign*/,\"Micro\",\"mc\",\"micro\"],\r\n 1e-6,\r\n \"prefix\"\r\n ],\r\n \"\" : [[\"n\",\"Nano\",\"nano\"], 1e-9, \"prefix\"],\r\n \"\" : [[\"p\",\"Pico\",\"pico\"], 1e-12, \"prefix\"],\r\n \"\" : [[\"f\",\"Femto\",\"femto\"], 1e-15, \"prefix\"],\r\n \"\" : [[\"a\",\"Atto\",\"atto\"], 1e-18, \"prefix\"],\r\n \"\" : [[\"z\",\"Zepto\",\"zepto\"], 1e-21, \"prefix\"],\r\n \"\" : [[\"y\",\"Yocto\",\"yocto\"], 1e-24, \"prefix\"],\r\n\r\n \"<1>\" : [[\"1\", \"<1>\"], 1, \"\"],\r\n /* length units */\r\n \"\" : [[\"m\",\"meter\",\"meters\",\"metre\",\"metres\"], 1.0, \"length\", [\"\"] ],\r\n \"\" : [[\"in\",\"inch\",\"inches\",\"\\\"\"], 0.0254, \"length\", [\"\"]],\r\n \"\" : [[\"ft\",\"foot\",\"feet\",\"'\"], 0.3048, \"length\", [\"\"]],\r\n \"\" : [[\"yd\",\"yard\",\"yards\"], 0.9144, \"length\", [\"\"]],\r\n \"\" : [[\"mi\",\"mile\",\"miles\"], 1609.344, \"length\", [\"\"]],\r\n \"\" : [[\"nmi\"], 1852, \"length\", [\"\"]],\r\n \"\": [[\"league\",\"leagues\"], 4828, \"length\", [\"\"]],\r\n \"\": [[\"furlong\",\"furlongs\"], 201.2, \"length\", [\"\"]],\r\n \"\" : [[\"rd\",\"rod\",\"rods\"], 5.029, \"length\", [\"\"]],\r\n \"\" : [[\"mil\",\"mils\"], 0.0000254, \"length\", [\"\"]],\r\n \"\" :[[\"ang\",\"angstrom\",\"angstroms\"], 1e-10, \"length\", [\"\"]],\r\n \"\" : [[\"fathom\",\"fathoms\"], 1.829, \"length\", [\"\"]],\r\n \"\" : [[\"pica\",\"picas\"], 0.00423333333, \"length\", [\"\"]],\r\n \"\" : [[\"pt\",\"point\",\"points\"], 0.000352777778, \"length\", [\"\"]],\r\n \"\" : [[\"z\",\"red-shift\", \"redshift\"], 1.302773e26, \"length\", [\"\"]],\r\n \"\" : [[\"AU\",\"astronomical-unit\"], 149597900000, \"length\", [\"\"]],\r\n \"\":[[\"ls\",\"light-second\"], 299792500, \"length\", [\"\"]],\r\n \"\":[[\"lmin\",\"light-minute\"], 17987550000, \"length\", [\"\"]],\r\n \"\" : [[\"ly\",\"light-year\"], 9460528000000000, \"length\", [\"\"]],\r\n \"\" : [[\"pc\",\"parsec\",\"parsecs\"], 30856780000000000, \"length\", [\"\"]],\r\n \"\" : [[\"DM\"], 1828.8, \"length\", [\"\"]],\r\n\r\n /* mass */\r\n \"\" : [[\"kg\",\"kilogram\",\"kilograms\"], 1.0, \"mass\", [\"\"]],\r\n \"\" : [[\"u\",\"AMU\",\"amu\"], 1.660538921e-27, \"mass\", [\"\"]],\r\n \"\" : [[\"Da\",\"Dalton\",\"Daltons\",\"dalton\",\"daltons\"], 1.660538921e-27, \"mass\", [\"\"]],\r\n \"\" : [[\"slug\",\"slugs\"], 14.5939029, \"mass\", [\"\"]],\r\n \"\" : [[\"tn\",\"ton\"], 907.18474, \"mass\", [\"\"]],\r\n \"\":[[\"tonne\"], 1000, \"mass\", [\"\"]],\r\n \"\" : [[\"ct\",\"carat\",\"carats\"], 0.0002, \"mass\", [\"\"]],\r\n \"\" : [[\"lbs\",\"lb\",\"pound\",\"pounds\",\"#\"], 0.45359237, \"mass\", [\"\"]],\r\n \"\" : [[\"oz\",\"ounce\",\"ounces\"], 0.0283495231, \"mass\", [\"\"]],\r\n \"\" : [[\"g\",\"gram\",\"grams\",\"gramme\",\"grammes\"], 1e-3, \"mass\", [\"\"]],\r\n \"\" : [[\"grain\",\"grains\",\"gr\"], 6.479891e-5, \"mass\", [\"\"]],\r\n \"\" : [[\"dram\",\"drams\",\"dr\"], 0.0017718452, \"mass\",[\"\"]],\r\n \"\" : [[\"stone\",\"stones\",\"st\"],6.35029318, \"mass\",[\"\"]],\r\n\r\n /* area */\r\n \"\":[[\"hectare\"], 10000, \"area\", [\"\",\"\"]],\r\n \"\":[[\"acre\",\"acres\"], 4046.85642, \"area\", [\"\",\"\"]],\r\n \"\":[[\"sqft\"], 1, \"area\", [\"\",\"\"]],\r\n\r\n /* volume */\r\n \"\" : [[\"l\",\"L\",\"liter\",\"liters\",\"litre\",\"litres\"], 0.001, \"volume\", [\"\",\"\",\"\"]],\r\n \"\": [[\"gal\",\"gallon\",\"gallons\"], 0.0037854118, \"volume\", [\"\",\"\",\"\"]],\r\n \"\": [[\"qt\",\"quart\",\"quarts\"], 0.00094635295, \"volume\", [\"\",\"\",\"\"]],\r\n \"\": [[\"pt\",\"pint\",\"pints\"], 0.000473176475, \"volume\", [\"\",\"\",\"\"]],\r\n \"\": [[\"cu\",\"cup\",\"cups\"], 0.000236588238, \"volume\", [\"\",\"\",\"\"]],\r\n \"\": [[\"floz\",\"fluid-ounce\",\"fluid-ounces\"], 2.95735297e-5, \"volume\", [\"\",\"\",\"\"]],\r\n \"\": [[\"tb\",\"tbsp\",\"tbs\",\"tablespoon\",\"tablespoons\"], 1.47867648e-5, \"volume\", [\"\",\"\",\"\"]],\r\n \"\": [[\"tsp\",\"teaspoon\",\"teaspoons\"], 4.92892161e-6, \"volume\", [\"\",\"\",\"\"]],\r\n \"\": [[\"bu\",\"bsh\",\"bushel\",\"bushels\"], 0.035239072, \"volume\", [\"\",\"\",\"\"]],\r\n\r\n /* speed */\r\n \"\" : [[\"kph\"], 0.277777778, \"speed\", [\"\"], [\"\"]],\r\n \"\" : [[\"mph\"], 0.44704, \"speed\", [\"\"], [\"\"]],\r\n \"\" : [[\"kt\",\"kn\",\"kts\",\"knot\",\"knots\"], 0.514444444, \"speed\", [\"\"], [\"\"]],\r\n \"\" : [[\"fps\"], 0.3048, \"speed\", [\"\"], [\"\"]],\r\n\r\n /* acceleration */\r\n \"\" : [[\"gee\"], 9.80665, \"acceleration\", [\"\"], [\"\",\"\"]],\r\n\r\n /* temperature_difference */\r\n \"\" : [[\"degK\",\"kelvin\"], 1.0, \"temperature\", [\"\"]],\r\n \"\" : [[\"degC\",\"celsius\",\"celsius\",\"centigrade\"], 1.0, \"temperature\", [\"\"]],\r\n \"\" : [[\"degF\",\"fahrenheit\"], 5 / 9, \"temperature\", [\"\"]],\r\n \"\" : [[\"degR\",\"rankine\"], 5 / 9, \"temperature\", [\"\"]],\r\n \"\" : [[\"tempK\"], 1.0, \"temperature\", [\"\"]],\r\n \"\" : [[\"tempC\"], 1.0, \"temperature\", [\"\"]],\r\n \"\" : [[\"tempF\"], 5 / 9, \"temperature\", [\"\"]],\r\n \"\" : [[\"tempR\"], 5 / 9, \"temperature\", [\"\"]],\r\n\r\n /* time */\r\n \"\": [[\"s\",\"sec\",\"secs\",\"second\",\"seconds\"], 1.0, \"time\", [\"\"]],\r\n \"\": [[\"min\",\"mins\",\"minute\",\"minutes\"], 60.0, \"time\", [\"\"]],\r\n \"\": [[\"h\",\"hr\",\"hrs\",\"hour\",\"hours\"], 3600.0, \"time\", [\"\"]],\r\n \"\": [[\"d\",\"day\",\"days\"], 3600 * 24, \"time\", [\"\"]],\r\n \"\": [[\"wk\",\"week\",\"weeks\"], 7 * 3600 * 24, \"time\", [\"\"]],\r\n \"\": [[\"fortnight\",\"fortnights\"], 1209600, \"time\", [\"\"]],\r\n \"\": [[\"y\",\"yr\",\"year\",\"years\",\"annum\"], 31556926, \"time\", [\"\"]],\r\n \"\":[[\"decade\",\"decades\"], 315569260, \"time\", [\"\"]],\r\n \"\":[[\"century\",\"centuries\"], 3155692600, \"time\", [\"\"]],\r\n\r\n /* pressure */\r\n \"\" : [[\"Pa\",\"pascal\",\"Pascal\"], 1.0, \"pressure\", [\"\"],[\"\",\"\",\"\"]],\r\n \"\" : [[\"bar\",\"bars\"], 100000, \"pressure\", [\"\"],[\"\",\"\",\"\"]],\r\n \"\" : [[\"mmHg\"], 133.322368, \"pressure\", [\"\"],[\"\",\"\",\"\"]],\r\n \"\" : [[\"inHg\"], 3386.3881472, \"pressure\", [\"\"],[\"\",\"\",\"\"]],\r\n \"\" : [[\"torr\"], 133.322368, \"pressure\", [\"\"],[\"\",\"\",\"\"]],\r\n \"\" : [[\"atm\",\"ATM\",\"atmosphere\",\"atmospheres\"], 101325, \"pressure\", [\"\"],[\"\",\"\",\"\"]],\r\n \"\" : [[\"psi\"], 6894.76, \"pressure\", [\"\"],[\"\",\"\",\"\"]],\r\n \"\" : [[\"cmH2O\"], 98.0638, \"pressure\", [\"\"],[\"\",\"\",\"\"]],\r\n \"\" : [[\"inH2O\"], 249.082052, \"pressure\", [\"\"],[\"\",\"\",\"\"]],\r\n\r\n /* viscosity */\r\n \"\" : [[\"P\",\"poise\"], 0.1, \"viscosity\", [\"\"],[\"\",\"\"] ],\r\n \"\" : [[\"St\",\"stokes\"], 1e-4, \"viscosity\", [\"\",\"\"], [\"\"]],\r\n\r\n /* substance */\r\n \"\" : [[\"mol\",\"mole\"], 1.0, \"substance\", [\"\"]],\r\n\r\n /* concentration */\r\n \"\" : [[\"M\",\"molar\"], 1000, \"concentration\", [\"\"], [\"\",\"\",\"\"]],\r\n \"\" : [[\"wt%\",\"wtpercent\"], 10, \"concentration\", [\"\"], [\"\",\"\",\"\"]],\r\n\r\n /* activity */\r\n \"\" : [[\"kat\",\"katal\",\"Katal\"], 1.0, \"activity\", [\"\"], [\"\"]],\r\n \"\" : [[\"U\",\"enzUnit\"], 16.667e-16, \"activity\", [\"\"], [\"\"]],\r\n\r\n /* capacitance */\r\n \"\" : [[\"F\",\"farad\",\"Farad\"], 1.0, \"capacitance\", [\"\",\"\",\"\",\"\",\"\",\"\"], [\"\", \"\", \"\"]],\r\n\r\n /* charge */\r\n \"\" : [[\"C\",\"coulomb\",\"Coulomb\"], 1.0, \"charge\", [\"\",\"\"]],\r\n \"\" : [[\"Ah\"], 3600, \"charge\", [\"\",\"\"]],\r\n\r\n /* current */\r\n \"\" : [[\"A\",\"Ampere\",\"ampere\",\"amp\",\"amps\"], 1.0, \"current\", [\"\"]],\r\n\r\n /* conductance */\r\n \"\" : [[\"S\",\"Siemens\",\"siemens\"], 1.0, \"conductance\", [\"\",\"\",\"\",\"\",\"\"], [\"\",\"\",\"\"]],\r\n\r\n /* inductance */\r\n \"\" : [[\"H\",\"Henry\",\"henry\"], 1.0, \"inductance\", [\"\",\"\",\"\"], [\"\",\"\",\"\",\"\"]],\r\n\r\n /* potential */\r\n \"\" : [[\"V\",\"Volt\",\"volt\",\"volts\"], 1.0, \"potential\", [\"\",\"\",\"\"], [\"\",\"\",\"\",\"\"]],\r\n\r\n /* resistance */\r\n \"\" : [\r\n [\"Ohm\",\"ohm\",\"\\u03A9\"/*Ω as greek letter*/,\"\\u2126\"/*Ω as ohm sign*/],\r\n 1.0,\r\n \"resistance\",\r\n [\"\",\"\",\"\"],[\"\",\"\",\"\",\"\",\"\"]\r\n ],\r\n /* magnetism */\r\n \"\" : [[\"Wb\",\"weber\",\"webers\"], 1.0, \"magnetism\", [\"\",\"\",\"\"], [\"\",\"\",\"\"]],\r\n \"\" : [[\"T\",\"tesla\",\"teslas\"], 1.0, \"magnetism\", [\"\"], [\"\",\"\",\"\"]],\r\n \"\" : [[\"G\",\"gauss\"], 1e-4, \"magnetism\", [\"\"], [\"\",\"\",\"\"]],\r\n \"\" : [[\"Mx\",\"maxwell\",\"maxwells\"], 1e-8, \"magnetism\", [\"\",\"\",\"\"], [\"\",\"\",\"\"]],\r\n \"\" : [[\"Oe\",\"oersted\",\"oersteds\"], 250.0 / Math.PI, \"magnetism\", [\"\"], [\"\"]],\r\n\r\n /* energy */\r\n \"\" : [[\"J\",\"joule\",\"Joule\",\"joules\"], 1.0, \"energy\", [\"\",\"\",\"\"], [\"\",\"\"]],\r\n \"\" : [[\"erg\",\"ergs\"], 1e-7, \"energy\", [\"\",\"\",\"\"], [\"\",\"\"]],\r\n \"\" : [[\"BTU\",\"btu\",\"BTUs\"], 1055.056, \"energy\", [\"\",\"\",\"\"], [\"\",\"\"]],\r\n \"\" : [[\"cal\",\"calorie\",\"calories\"], 4.18400, \"energy\",[\"\",\"\",\"\"], [\"\",\"\"]],\r\n \"\" : [[\"Cal\",\"Calorie\",\"Calories\"], 4184.00, \"energy\",[\"\",\"\",\"\"], [\"\",\"\"]],\r\n \"\" : [[\"th\",\"therm\",\"therms\",\"Therm\"], 105480400, \"energy\",[\"\",\"\",\"\"], [\"\",\"\"]],\r\n \"\" : [[\"Wh\"], 3600, \"energy\",[\"\",\"\",\"\"], [\"\",\"\"]],\r\n\r\n /* force */\r\n \"\" : [[\"N\",\"Newton\",\"newton\"], 1.0, \"force\", [\"\",\"\"], [\"\",\"\"]],\r\n \"\" : [[\"dyn\",\"dyne\"], 1e-5, \"force\", [\"\",\"\"], [\"\",\"\"]],\r\n \"\" : [[\"lbf\",\"pound-force\"], 4.448222, \"force\", [\"\",\"\"], [\"\",\"\"]],\r\n\r\n /* frequency */\r\n \"\" : [[\"Hz\",\"hertz\",\"Hertz\"], 1.0, \"frequency\", [\"<1>\"], [\"\"]],\r\n\r\n /* angle */\r\n \"\" :[[\"rad\",\"radian\",\"radians\"], 1.0, \"angle\", [\"\"]],\r\n \"\" :[[\"deg\",\"degree\",\"degrees\"], Math.PI / 180.0, \"angle\", [\"\"]],\r\n \"\" :[[\"gon\",\"grad\",\"gradian\",\"grads\"], Math.PI / 200.0, \"angle\", [\"\"]],\r\n \"\" : [[\"sr\",\"steradian\",\"steradians\"], 1.0, \"solid_angle\", [\"\"]],\r\n\r\n /* rotation */\r\n \"\" : [[\"rotation\"], 2.0 * Math.PI, \"angle\", [\"\"]],\r\n \"\" :[[\"rpm\"], 2.0 * Math.PI / 60.0, \"angular_velocity\", [\"\"], [\"\"]],\r\n\r\n /* information */\r\n \"\" :[[\"B\",\"byte\",\"bytes\"], 1.0, \"information\", [\"\"]],\r\n \"\" :[[\"b\",\"bit\",\"bits\"], 0.125, \"information\", [\"\"]],\r\n\r\n /* information rate */\r\n \"\" : [[\"Bps\"], 1.0, \"information_rate\", [\"\"], [\"\"]],\r\n \"\" : [[\"bps\"], 0.125, \"information_rate\", [\"\"], [\"\"]],\r\n\r\n /* currency */\r\n \"\":[[\"USD\",\"dollar\"], 1.0, \"currency\", [\"\"]],\r\n \"\" :[[\"cents\"], 0.01, \"currency\", [\"\"]],\r\n\r\n /* luminosity */\r\n \"\" : [[\"cd\",\"candela\"], 1.0, \"luminosity\", [\"\"]],\r\n \"\" : [[\"lm\",\"lumen\"], 1.0, \"luminous_power\", [\"\",\"\"]],\r\n \"\" :[[\"lux\"], 1.0, \"illuminance\", [\"\",\"\"], [\"\",\"\"]],\r\n\r\n /* power */\r\n \"\" : [[\"W\",\"watt\",\"watts\"], 1.0, \"power\", [\"\",\"\",\"\"], [\"\",\"\",\"\"]],\r\n \"\" : [[\"VA\"], 1.0, \"power\", [\"\",\"\",\"\"], [\"\",\"\",\"\"]],\r\n \"\" : [[\"var\",\"Var\",\"VAr\",\"VAR\"], 1.0, \"power\", [\"\",\"\",\"\"], [\"\",\"\",\"\"]],\r\n \"\" : [[\"hp\",\"horsepower\"], 745.699872, \"power\", [\"\",\"\",\"\"], [\"\",\"\",\"\"]],\r\n\r\n /* radiation */\r\n \"\" : [[\"Gy\",\"gray\",\"grays\"], 1.0, \"radiation\", [\"\",\"\"], [\"\",\"\"]],\r\n \"\" : [[\"R\",\"roentgen\"], 0.009330, \"radiation\", [\"\",\"\"], [\"\",\"\"]],\r\n \"\" : [[\"Sv\",\"sievert\",\"sieverts\"], 1.0, \"radiation\", [\"\",\"\"], [\"\",\"\"]],\r\n \"\" : [[\"Bq\",\"bequerel\",\"bequerels\"], 1.0, \"radiation\", [\"<1>\"],[\"\"]],\r\n \"\" : [[\"Ci\",\"curie\",\"curies\"], 3.7e10, \"radiation\", [\"<1>\"],[\"\"]],\r\n\r\n /* rate */\r\n \"\" : [[\"cpm\"], 1.0 / 60.0, \"rate\", [\"\"],[\"\"]],\r\n \"\" : [[\"dpm\"], 1.0 / 60.0, \"rate\", [\"\"],[\"\"]],\r\n \"\" : [[\"bpm\"], 1.0 / 60.0, \"rate\", [\"\"],[\"\"]],\r\n\r\n /* resolution / typography */\r\n \"\" : [[\"dot\",\"dots\"], 1, \"resolution\", [\"\"]],\r\n \"\" : [[\"pixel\",\"px\"], 1, \"resolution\", [\"\"]],\r\n \"\" : [[\"ppi\"], 1, \"resolution\", [\"\"], [\"\"]],\r\n \"\" : [[\"dpi\"], 1, \"typography\", [\"\"], [\"\"]],\r\n\r\n /* other */\r\n \"\" : [[\"cells\",\"cell\"], 1, \"counting\", [\"\"]],\r\n \"\" : [[\"each\"], 1.0, \"counting\", [\"\"]],\r\n \"\" : [[\"count\"], 1.0, \"counting\", [\"\"]],\r\n \"\" : [[\"bp\"], 1.0, \"counting\", [\"\"]],\r\n \"\" : [[\"nt\"], 1.0, \"counting\", [\"\"]],\r\n \"\" : [[\"molecule\",\"molecules\"], 1.0, \"counting\", [\"<1>\"]],\r\n \"\" : [[\"doz\",\"dz\",\"dozen\"],12.0,\"prefix_only\", [\"\"]],\r\n \"\": [[\"%\",\"percent\"], 0.01, \"prefix_only\", [\"<1>\"]],\r\n \"\" : [[\"ppm\"],1e-6, \"prefix_only\", [\"<1>\"]],\r\n \"\" : [[\"ppt\"],1e-9, \"prefix_only\", [\"<1>\"]],\r\n \"\" : [[\"gr\",\"gross\"],144.0, \"prefix_only\", [\"\",\"\"]],\r\n \"\" : [[\"dB\",\"decibel\",\"decibels\"], 1.0, \"logarithmic\", [\"\"]]\r\n};\r\n\r\nvar BASE_UNITS = [\"\",\"\",\"\",\"\", \"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\"];\r\n\r\nvar UNITY = \"<1>\";\r\nvar UNITY_ARRAY = [UNITY];\r\n\r\n// Setup\r\n\r\n/**\r\n * Asserts unit definition is valid\r\n *\r\n * @param {string} unitDef - Name of unit to test\r\n * @param {Object} definition - Definition of unit to test\r\n *\r\n * @throws {QtyError} if unit definition is not valid\r\n */\r\nfunction validateUnitDefinition(unitDef, definition) {\r\n var scalar = definition[1];\r\n var numerator = definition[3] || [];\r\n var denominator = definition[4] || [];\r\n if (!isNumber(scalar)) {\r\n throw new QtyError(unitDef + \": Invalid unit definition. \" +\r\n \"'scalar' must be a number\");\r\n }\r\n\r\n numerator.forEach(function(unit) {\r\n if (UNITS[unit] === undefined) {\r\n throw new QtyError(unitDef + \": Invalid unit definition. \" +\r\n \"Unit \" + unit + \" in 'numerator' is not recognized\");\r\n }\r\n });\r\n\r\n denominator.forEach(function(unit) {\r\n if (UNITS[unit] === undefined) {\r\n throw new QtyError(unitDef + \": Invalid unit definition. \" +\r\n \"Unit \" + unit + \" in 'denominator' is not recognized\");\r\n }\r\n });\r\n}\r\n\r\nvar PREFIX_VALUES = {};\r\nvar PREFIX_MAP = {};\r\nvar UNIT_VALUES = {};\r\nvar UNIT_MAP = {};\r\nvar OUTPUT_MAP = {};\r\nfor (var unitDef in UNITS) {\r\n if (UNITS.hasOwnProperty(unitDef)) {\r\n var definition = UNITS[unitDef];\r\n if (definition[2] === \"prefix\") {\r\n PREFIX_VALUES[unitDef] = definition[1];\r\n for (var i = 0; i < definition[0].length; i++) {\r\n PREFIX_MAP[definition[0][i]] = unitDef;\r\n }\r\n }\r\n else {\r\n validateUnitDefinition(unitDef, definition);\r\n UNIT_VALUES[unitDef] = {\r\n scalar: definition[1],\r\n numerator: definition[3],\r\n denominator: definition[4]\r\n };\r\n for (var j = 0; j < definition[0].length; j++) {\r\n UNIT_MAP[definition[0][j]] = unitDef;\r\n }\r\n }\r\n OUTPUT_MAP[unitDef] = definition[0][0];\r\n }\r\n}\r\n\r\n/**\r\n * Returns a list of available units of kind\r\n *\r\n * @param {string} [kind]\r\n * @returns {array} names of units\r\n * @throws {QtyError} if kind is unknown\r\n */\r\nfunction getUnits (kind) {\r\n var i;\r\n var units = [];\r\n var unitKeys = Object.keys(UNITS);\r\n if (typeof kind === \"undefined\") {\r\n for (i = 0; i < unitKeys.length; i++) {\r\n if ([\"\", \"prefix\"].indexOf(UNITS[unitKeys[i]][2]) === -1) {\r\n units.push(unitKeys[i].substr(1, unitKeys[i].length - 2));\r\n }\r\n }\r\n }\r\n else if (Qty$1.getKinds().indexOf(kind) === -1) {\r\n throw new QtyError(\"Kind not recognized\");\r\n }\r\n else {\r\n for (i = 0; i < unitKeys.length; i++) {\r\n if (UNITS[unitKeys[i]][2] === kind) {\r\n units.push(unitKeys[i].substr(1, unitKeys[i].length - 2));\r\n }\r\n }\r\n }\r\n\r\n return units.sort(function(a, b) {\r\n if (a.toLowerCase() < b.toLowerCase()) {\r\n return -1;\r\n }\r\n if (a.toLowerCase() > b.toLowerCase()) {\r\n return 1;\r\n }\r\n return 0;\r\n });\r\n}\r\n\r\n/**\r\n * Returns a list of alternative names for a unit\r\n *\r\n * @param {string} unitName\r\n * @returns {string[]} aliases for unit\r\n * @throws {QtyError} if unit is unknown\r\n */\r\nfunction getAliases(unitName) {\r\n if (!UNIT_MAP[unitName]) {\r\n throw new QtyError(\"Unit not recognized\");\r\n }\r\n return UNITS[UNIT_MAP[unitName]][0];\r\n}\r\n\r\nvar SIGNATURE_VECTOR = [\"length\", \"time\", \"temperature\", \"mass\", \"current\", \"substance\", \"luminosity\", \"currency\", \"information\", \"angle\"];\r\n\r\n/*\r\ncalculates the unit signature id for use in comparing compatible units and simplification\r\nthe signature is based on a simple classification of units and is based on the following publication\r\n\r\nNovak, G.S., Jr. \"Conversion of units of measurement\", IEEE Transactions on Software Engineering,\r\n21(8), Aug 1995, pp.651-661\r\ndoi://10.1109/32.403789\r\nhttp://ieeexplore.ieee.org/Xplore/login.jsp?url=/iel1/32/9079/00403789.pdf?isnumber=9079&prod=JNL&arnumber=403789&arSt=651&ared=661&arAuthor=Novak%2C+G.S.%2C+Jr.\r\n*/\r\nfunction unitSignature() {\r\n if (this.signature) {\r\n return this.signature;\r\n }\r\n var vector = unitSignatureVector.call(this);\r\n for (var i = 0; i < vector.length; i++) {\r\n vector[i] *= Math.pow(20, i);\r\n }\r\n\r\n return vector.reduce(\r\n function(previous, current) {\r\n return previous + current;\r\n },\r\n 0\r\n );\r\n}\r\n\r\n// calculates the unit signature vector used by unit_signature\r\nfunction unitSignatureVector() {\r\n if (!this.isBase()) {\r\n return unitSignatureVector.call(this.toBase());\r\n }\r\n\r\n var vector = new Array(SIGNATURE_VECTOR.length);\r\n for (var i = 0; i < vector.length; i++) {\r\n vector[i] = 0;\r\n }\r\n var r, n;\r\n for (var j = 0; j < this.numerator.length; j++) {\r\n if ((r = UNITS[this.numerator[j]])) {\r\n n = SIGNATURE_VECTOR.indexOf(r[2]);\r\n if (n >= 0) {\r\n vector[n] = vector[n] + 1;\r\n }\r\n }\r\n }\r\n\r\n for (var k = 0; k < this.denominator.length; k++) {\r\n if ((r = UNITS[this.denominator[k]])) {\r\n n = SIGNATURE_VECTOR.indexOf(r[2]);\r\n if (n >= 0) {\r\n vector[n] = vector[n] - 1;\r\n }\r\n }\r\n }\r\n return vector;\r\n}\r\n\r\nvar SIGN = \"[+-]\";\r\nvar INTEGER = \"\\\\d+\";\r\nvar SIGNED_INTEGER = SIGN + \"?\" + INTEGER;\r\nvar FRACTION = \"\\\\.\" + INTEGER;\r\nvar FLOAT = \"(?:\" + INTEGER + \"(?:\" + FRACTION + \")?\" + \")\" +\r\n \"|\" +\r\n \"(?:\" + FRACTION + \")\";\r\nvar EXPONENT = \"[Ee]\" + SIGNED_INTEGER;\r\nvar SCI_NUMBER = \"(?:\" + FLOAT + \")(?:\" + EXPONENT + \")?\";\r\nvar SIGNED_NUMBER = SIGN + \"?\\\\s*\" + SCI_NUMBER;\r\nvar QTY_STRING = \"(\" + SIGNED_NUMBER + \")?\" + \"\\\\s*([^/]*)(?:\\/(.+))?\";\r\nvar QTY_STRING_REGEX = new RegExp(\"^\" + QTY_STRING + \"$\");\r\n\r\nvar POWER_OP = \"\\\\^|\\\\*{2}\";\r\n// Allow unit powers representing scalar, length, area, volume; 4 is for some\r\n// special case representations in SI base units.\r\nvar SAFE_POWER = \"[01234]\";\r\nvar TOP_REGEX = new RegExp (\"([^ \\\\*\\\\d]+?)(?:\" + POWER_OP + \")?(-?\" + SAFE_POWER + \"(?![a-zA-Z]))\");\r\nvar BOTTOM_REGEX = new RegExp(\"([^ \\\\*\\\\d]+?)(?:\" + POWER_OP + \")?(\" + SAFE_POWER + \"(?![a-zA-Z]))\");\r\n\r\n/* parse a string into a unit object.\r\n * Typical formats like :\r\n * \"5.6 kg*m/s^2\"\r\n * \"5.6 kg*m*s^-2\"\r\n * \"5.6 kilogram*meter*second^-2\"\r\n * \"2.2 kPa\"\r\n * \"37 degC\"\r\n * \"1\" -- creates a unitless constant with value 1\r\n * \"GPa\" -- creates a unit with scalar 1 with units 'GPa'\r\n * 6'4\" -- recognized as 6 feet + 4 inches\r\n * 8 lbs 8 oz -- recognized as 8 lbs + 8 ounces\r\n */\r\nfunction parse(val) {\r\n if (!isString(val)) {\r\n val = val.toString();\r\n }\r\n val = val.trim();\r\n\r\n var result = QTY_STRING_REGEX.exec(val);\r\n if (!result) {\r\n throw new QtyError(val + \": Quantity not recognized\");\r\n }\r\n\r\n var scalarMatch = result[1];\r\n if (scalarMatch) {\r\n // Allow whitespaces between sign and scalar for loose parsing\r\n scalarMatch = scalarMatch.replace(/\\s/g, \"\");\r\n this.scalar = parseFloat(scalarMatch);\r\n }\r\n else {\r\n this.scalar = 1;\r\n }\r\n var top = result[2];\r\n var bottom = result[3];\r\n\r\n var n, x, nx;\r\n // TODO DRY me\r\n while ((result = TOP_REGEX.exec(top))) {\r\n n = parseFloat(result[2]);\r\n if (isNaN(n)) {\r\n // Prevents infinite loops\r\n throw new QtyError(\"Unit exponent is not a number\");\r\n }\r\n // Disallow unrecognized unit even if exponent is 0\r\n if (n === 0 && !UNIT_TEST_REGEX.test(result[1])) {\r\n throw new QtyError(\"Unit not recognized\");\r\n }\r\n x = result[1] + \" \";\r\n nx = \"\";\r\n for (var i = 0; i < Math.abs(n) ; i++) {\r\n nx += x;\r\n }\r\n if (n >= 0) {\r\n top = top.replace(result[0], nx);\r\n }\r\n else {\r\n bottom = bottom ? bottom + nx : nx;\r\n top = top.replace(result[0], \"\");\r\n }\r\n }\r\n\r\n while ((result = BOTTOM_REGEX.exec(bottom))) {\r\n n = parseFloat(result[2]);\r\n if (isNaN(n)) {\r\n // Prevents infinite loops\r\n throw new QtyError(\"Unit exponent is not a number\");\r\n }\r\n // Disallow unrecognized unit even if exponent is 0\r\n if (n === 0 && !UNIT_TEST_REGEX.test(result[1])) {\r\n throw new QtyError(\"Unit not recognized\");\r\n }\r\n x = result[1] + \" \";\r\n nx = \"\";\r\n for (var j = 0; j < n ; j++) {\r\n nx += x;\r\n }\r\n\r\n bottom = bottom.replace(result[0], nx);\r\n }\r\n\r\n if (top) {\r\n this.numerator = parseUnits(top.trim());\r\n }\r\n if (bottom) {\r\n this.denominator = parseUnits(bottom.trim());\r\n }\r\n}\r\n\r\nvar PREFIX_REGEX = Object.keys(PREFIX_MAP).sort(function(a, b) {\r\n return b.length - a.length;\r\n}).join(\"|\");\r\nvar UNIT_REGEX = Object.keys(UNIT_MAP).sort(function(a, b) {\r\n return b.length - a.length;\r\n}).join(\"|\");\r\n/*\r\n * Minimal boundary regex to support units with Unicode characters\r\n * \\b only works for ASCII\r\n */\r\nvar BOUNDARY_REGEX = \"\\\\b|$\";\r\nvar UNIT_MATCH = \"(\" + PREFIX_REGEX + \")??(\" +\r\n UNIT_REGEX +\r\n \")(?:\" + BOUNDARY_REGEX + \")\";\r\nvar UNIT_TEST_REGEX = new RegExp(\"^\\\\s*(\" + UNIT_MATCH + \"[\\\\s\\\\*]*)+$\");\r\nvar UNIT_MATCH_REGEX = new RegExp(UNIT_MATCH, \"g\"); // g flag for multiple occurences\r\nvar parsedUnitsCache = {};\r\n/**\r\n * Parses and converts units string to normalized unit array.\r\n * Result is cached to speed up next calls.\r\n *\r\n * @param {string} units Units string\r\n * @returns {string[]} Array of normalized units\r\n *\r\n * @example\r\n * // Returns [\"\", \"\", \"\"]\r\n * parseUnits(\"s m s\");\r\n *\r\n */\r\nfunction parseUnits(units) {\r\n var cached = parsedUnitsCache[units];\r\n if (cached) {\r\n return cached;\r\n }\r\n\r\n var unitMatch, normalizedUnits = [];\r\n\r\n // Scan\r\n if (!UNIT_TEST_REGEX.test(units)) {\r\n throw new QtyError(\"Unit not recognized\");\r\n }\r\n\r\n while ((unitMatch = UNIT_MATCH_REGEX.exec(units))) {\r\n normalizedUnits.push(unitMatch.slice(1));\r\n }\r\n\r\n normalizedUnits = normalizedUnits.map(function(item) {\r\n return PREFIX_MAP[item[0]] ? [PREFIX_MAP[item[0]], UNIT_MAP[item[1]]] : [UNIT_MAP[item[1]]];\r\n });\r\n\r\n // Flatten and remove null elements\r\n normalizedUnits = normalizedUnits.reduce(function(a,b) {\r\n return a.concat(b);\r\n }, []);\r\n normalizedUnits = normalizedUnits.filter(function(item) {\r\n return item;\r\n });\r\n\r\n parsedUnitsCache[units] = normalizedUnits;\r\n\r\n return normalizedUnits;\r\n}\r\n\r\n/**\r\n * Parses a string as a quantity\r\n * @param {string} value - quantity as text\r\n * @throws if value is not a string\r\n * @returns {Qty|null} Parsed quantity or null if unrecognized\r\n */\r\nfunction globalParse(value) {\r\n if (!isString(value)) {\r\n throw new QtyError(\"Argument should be a string\");\r\n }\r\n\r\n try {\r\n return Qty$1(value);\r\n }\r\n catch (e) {\r\n return null;\r\n }\r\n}\r\n\r\nfunction Qty$1(initValue, initUnits) {\r\n assertValidConstructorArgs.apply(null, arguments);\r\n\r\n if (!(isQty(this))) {\r\n return new Qty$1(initValue, initUnits);\r\n }\r\n\r\n this.scalar = null;\r\n this.baseScalar = null;\r\n this.signature = null;\r\n this._conversionCache = {};\r\n this.numerator = UNITY_ARRAY;\r\n this.denominator = UNITY_ARRAY;\r\n\r\n if (isDefinitionObject(initValue)) {\r\n this.scalar = initValue.scalar;\r\n this.numerator = (initValue.numerator && initValue.numerator.length !== 0) ? initValue.numerator : UNITY_ARRAY;\r\n this.denominator = (initValue.denominator && initValue.denominator.length !== 0) ? initValue.denominator : UNITY_ARRAY;\r\n }\r\n else if (initUnits) {\r\n parse.call(this, initUnits);\r\n this.scalar = initValue;\r\n }\r\n else {\r\n parse.call(this, initValue);\r\n }\r\n\r\n // math with temperatures is very limited\r\n if (this.denominator.join(\"*\").indexOf(\"temp\") >= 0) {\r\n throw new QtyError(\"Cannot divide with temperatures\");\r\n }\r\n if (this.numerator.join(\"*\").indexOf(\"temp\") >= 0) {\r\n if (this.numerator.length > 1) {\r\n throw new QtyError(\"Cannot multiply by temperatures\");\r\n }\r\n if (!compareArray(this.denominator, UNITY_ARRAY)) {\r\n throw new QtyError(\"Cannot divide with temperatures\");\r\n }\r\n }\r\n\r\n this.initValue = initValue;\r\n updateBaseScalar.call(this);\r\n\r\n if (this.isTemperature() && this.baseScalar < 0) {\r\n throw new QtyError(\"Temperatures must not be less than absolute zero\");\r\n }\r\n}\r\n\r\nQty$1.prototype = {\r\n // Properly set up constructor\r\n constructor: Qty$1,\r\n};\r\n\r\n/**\r\n * Asserts constructor arguments are valid\r\n *\r\n * @param {*} value - Value to test\r\n * @param {string} [units] - Optional units when value is passed as a number\r\n *\r\n * @throws {QtyError} if constructor arguments are invalid\r\n */\r\nfunction assertValidConstructorArgs(value, units) {\r\n if (units) {\r\n if (!(isNumber(value) && isString(units))) {\r\n throw new QtyError(\"Only number accepted as initialization value \" +\r\n \"when units are explicitly provided\");\r\n }\r\n }\r\n else {\r\n if (!(isString(value) ||\r\n isNumber(value) ||\r\n isQty(value) ||\r\n isDefinitionObject(value))) {\r\n throw new QtyError(\"Only string, number or quantity accepted as \" +\r\n \"single initialization value\");\r\n }\r\n }\r\n}\r\n\r\n/**\r\n * Tests if a value is a Qty definition object\r\n *\r\n * @param {*} value - Value to test\r\n *\r\n * @returns {boolean} true if value is a definition object, false otherwise\r\n */\r\nfunction isDefinitionObject(value) {\r\n return value && typeof value === \"object\" && value.hasOwnProperty(\"scalar\");\r\n}\r\n\r\nfunction updateBaseScalar() {\r\n if (this.baseScalar) {\r\n return this.baseScalar;\r\n }\r\n if (this.isBase()) {\r\n this.baseScalar = this.scalar;\r\n this.signature = unitSignature.call(this);\r\n }\r\n else {\r\n var base = this.toBase();\r\n this.baseScalar = base.scalar;\r\n this.signature = base.signature;\r\n }\r\n}\r\n\r\nvar KINDS = {\r\n \"-312078\": \"elastance\",\r\n \"-312058\": \"resistance\",\r\n \"-312038\": \"inductance\",\r\n \"-152058\": \"potential\",\r\n \"-152040\": \"magnetism\",\r\n \"-152038\": \"magnetism\",\r\n \"-7997\": \"specific_volume\",\r\n \"-79\": \"snap\",\r\n \"-59\": \"jolt\",\r\n \"-39\": \"acceleration\",\r\n \"-38\": \"radiation\",\r\n \"-20\": \"frequency\",\r\n \"-19\": \"speed\",\r\n \"-18\": \"viscosity\",\r\n \"-17\": \"volumetric_flow\",\r\n \"-1\": \"wavenumber\",\r\n \"0\": \"unitless\",\r\n \"1\": \"length\",\r\n \"2\": \"area\",\r\n \"3\": \"volume\",\r\n \"20\": \"time\",\r\n \"400\": \"temperature\",\r\n \"7941\": \"yank\",\r\n \"7942\": \"power\",\r\n \"7959\": \"pressure\",\r\n \"7961\": \"force\",\r\n \"7962\": \"energy\",\r\n \"7979\": \"viscosity\",\r\n \"7981\": \"momentum\",\r\n \"7982\": \"angular_momentum\",\r\n \"7997\": \"density\",\r\n \"7998\": \"area_density\",\r\n \"8000\": \"mass\",\r\n \"152020\": \"radiation_exposure\",\r\n \"159999\": \"magnetism\",\r\n \"160000\": \"current\",\r\n \"160020\": \"charge\",\r\n \"312058\": \"conductance\",\r\n \"312078\": \"capacitance\",\r\n \"3199980\": \"activity\",\r\n \"3199997\": \"molar_concentration\",\r\n \"3200000\": \"substance\",\r\n \"63999998\": \"illuminance\",\r\n \"64000000\": \"luminous_power\",\r\n \"1280000000\": \"currency\",\r\n \"25599999980\": \"information_rate\",\r\n \"25600000000\": \"information\",\r\n \"511999999980\": \"angular_velocity\",\r\n \"512000000000\": \"angle\"\r\n};\r\n\r\n/**\r\n * Returns the list of available well-known kinds of units, e.g.\r\n * \"radiation\" or \"length\".\r\n *\r\n * @returns {string[]} names of kinds of units\r\n */\r\nfunction getKinds() {\r\n return uniq(Object.keys(KINDS).map(function(knownSignature) {\r\n return KINDS[knownSignature];\r\n }));\r\n}\r\n\r\nQty$1.prototype.kind = function() {\r\n return KINDS[this.signature.toString()];\r\n};\r\n\r\nassign(Qty$1.prototype, {\r\n isDegrees: function() {\r\n // signature may not have been calculated yet\r\n return (this.signature === null || this.signature === 400) &&\r\n this.numerator.length === 1 &&\r\n compareArray(this.denominator, UNITY_ARRAY) &&\r\n (this.numerator[0].match(//) || this.numerator[0].match(/<(kelvin|celsius|rankine|fahrenheit)>/));\r\n },\r\n\r\n isTemperature: function() {\r\n return this.isDegrees() && this.numerator[0].match(//);\r\n }\r\n});\r\n\r\nfunction subtractTemperatures(lhs,rhs) {\r\n var lhsUnits = lhs.units();\r\n var rhsConverted = rhs.to(lhsUnits);\r\n var dstDegrees = Qty$1(getDegreeUnits(lhsUnits));\r\n return Qty$1({\"scalar\": lhs.scalar - rhsConverted.scalar, \"numerator\": dstDegrees.numerator, \"denominator\": dstDegrees.denominator});\r\n}\r\n\r\nfunction subtractTempDegrees(temp,deg) {\r\n var tempDegrees = deg.to(getDegreeUnits(temp.units()));\r\n return Qty$1({\"scalar\": temp.scalar - tempDegrees.scalar, \"numerator\": temp.numerator, \"denominator\": temp.denominator});\r\n}\r\n\r\nfunction addTempDegrees(temp,deg) {\r\n var tempDegrees = deg.to(getDegreeUnits(temp.units()));\r\n return Qty$1({\"scalar\": temp.scalar + tempDegrees.scalar, \"numerator\": temp.numerator, \"denominator\": temp.denominator});\r\n}\r\n\r\nfunction getDegreeUnits(units) {\r\n if (units === \"tempK\") {\r\n return \"degK\";\r\n }\r\n else if (units === \"tempC\") {\r\n return \"degC\";\r\n }\r\n else if (units === \"tempF\") {\r\n return \"degF\";\r\n }\r\n else if (units === \"tempR\") {\r\n return \"degR\";\r\n }\r\n else {\r\n throw new QtyError(\"Unknown type for temp conversion from: \" + units);\r\n }\r\n}\r\n\r\nfunction toDegrees(src,dst) {\r\n var srcDegK = toDegK(src);\r\n var dstUnits = dst.units();\r\n var dstScalar;\r\n\r\n if (dstUnits === \"degK\") {\r\n dstScalar = srcDegK.scalar;\r\n }\r\n else if (dstUnits === \"degC\") {\r\n dstScalar = srcDegK.scalar ;\r\n }\r\n else if (dstUnits === \"degF\") {\r\n dstScalar = srcDegK.scalar * 9 / 5;\r\n }\r\n else if (dstUnits === \"degR\") {\r\n dstScalar = srcDegK.scalar * 9 / 5;\r\n }\r\n else {\r\n throw new QtyError(\"Unknown type for degree conversion to: \" + dstUnits);\r\n }\r\n\r\n return Qty$1({\"scalar\": dstScalar, \"numerator\": dst.numerator, \"denominator\": dst.denominator});\r\n}\r\n\r\nfunction toDegK(qty) {\r\n var units = qty.units();\r\n var q;\r\n if (units.match(/(deg)[CFRK]/)) {\r\n q = qty.baseScalar;\r\n }\r\n else if (units === \"tempK\") {\r\n q = qty.scalar;\r\n }\r\n else if (units === \"tempC\") {\r\n q = qty.scalar;\r\n }\r\n else if (units === \"tempF\") {\r\n q = qty.scalar * 5 / 9;\r\n }\r\n else if (units === \"tempR\") {\r\n q = qty.scalar * 5 / 9;\r\n }\r\n else {\r\n throw new QtyError(\"Unknown type for temp conversion from: \" + units);\r\n }\r\n\r\n return Qty$1({\"scalar\": q, \"numerator\": [\"\"], \"denominator\": UNITY_ARRAY});\r\n}\r\n\r\nfunction toTemp(src,dst) {\r\n var dstUnits = dst.units();\r\n var dstScalar;\r\n\r\n if (dstUnits === \"tempK\") {\r\n dstScalar = src.baseScalar;\r\n }\r\n else if (dstUnits === \"tempC\") {\r\n dstScalar = src.baseScalar - 273.15;\r\n }\r\n else if (dstUnits === \"tempF\") {\r\n dstScalar = (src.baseScalar * 9 / 5) - 459.67;\r\n }\r\n else if (dstUnits === \"tempR\") {\r\n dstScalar = src.baseScalar * 9 / 5;\r\n }\r\n else {\r\n throw new QtyError(\"Unknown type for temp conversion to: \" + dstUnits);\r\n }\r\n\r\n return Qty$1({\"scalar\": dstScalar, \"numerator\": dst.numerator, \"denominator\": dst.denominator});\r\n}\r\n\r\nfunction toTempK(qty) {\r\n var units = qty.units();\r\n var q;\r\n if (units.match(/(deg)[CFRK]/)) {\r\n q = qty.baseScalar;\r\n }\r\n else if (units === \"tempK\") {\r\n q = qty.scalar;\r\n }\r\n else if (units === \"tempC\") {\r\n q = qty.scalar + 273.15;\r\n }\r\n else if (units === \"tempF\") {\r\n q = (qty.scalar + 459.67) * 5 / 9;\r\n }\r\n else if (units === \"tempR\") {\r\n q = qty.scalar * 5 / 9;\r\n }\r\n else {\r\n throw new QtyError(\"Unknown type for temp conversion from: \" + units);\r\n }\r\n\r\n return Qty$1({\"scalar\": q, \"numerator\": [\"\"], \"denominator\": UNITY_ARRAY});\r\n}\r\n\r\nassign(Qty$1.prototype, {\r\n /**\r\n * Converts to other compatible units.\r\n * Instance's converted quantities are cached for faster subsequent calls.\r\n *\r\n * @param {(string|Qty)} other - Target units as string or retrieved from\r\n * other Qty instance (scalar is ignored)\r\n *\r\n * @returns {Qty} New converted Qty instance with target units\r\n *\r\n * @throws {QtyError} if target units are incompatible\r\n *\r\n * @example\r\n * var weight = Qty(\"25 kg\");\r\n * weight.to(\"lb\"); // => Qty(\"55.11556554621939 lbs\");\r\n * weight.to(Qty(\"3 g\")); // => Qty(\"25000 g\"); // scalar of passed Qty is ignored\r\n */\r\n to: function(other) {\r\n var cached, target;\r\n\r\n if (other === undefined || other === null) {\r\n return this;\r\n }\r\n\r\n if (!isString(other)) {\r\n return this.to(other.units());\r\n }\r\n\r\n cached = this._conversionCache[other];\r\n if (cached) {\r\n return cached;\r\n }\r\n\r\n // Instantiating target to normalize units\r\n target = Qty$1(other);\r\n if (target.units() === this.units()) {\r\n return this;\r\n }\r\n\r\n if (!this.isCompatible(target)) {\r\n if (this.isInverse(target)) {\r\n target = this.inverse().to(other);\r\n }\r\n else {\r\n throwIncompatibleUnits(this.units(), target.units());\r\n }\r\n }\r\n else {\r\n if (target.isTemperature()) {\r\n target = toTemp(this,target);\r\n }\r\n else if (target.isDegrees()) {\r\n target = toDegrees(this,target);\r\n }\r\n else {\r\n var q = divSafe(this.baseScalar, target.baseScalar);\r\n target = Qty$1({\"scalar\": q, \"numerator\": target.numerator, \"denominator\": target.denominator});\r\n }\r\n }\r\n\r\n this._conversionCache[other] = target;\r\n return target;\r\n },\r\n\r\n // convert to base SI units\r\n // results of the conversion are cached so subsequent calls to this will be fast\r\n toBase: function() {\r\n if (this.isBase()) {\r\n return this;\r\n }\r\n\r\n if (this.isTemperature()) {\r\n return toTempK(this);\r\n }\r\n\r\n var cached = baseUnitCache[this.units()];\r\n if (!cached) {\r\n cached = toBaseUnits(this.numerator,this.denominator);\r\n baseUnitCache[this.units()] = cached;\r\n }\r\n return cached.mul(this.scalar);\r\n },\r\n\r\n // Converts the unit back to a float if it is unitless. Otherwise raises an exception\r\n toFloat: function() {\r\n if (this.isUnitless()) {\r\n return this.scalar;\r\n }\r\n throw new QtyError(\"Can't convert to Float unless unitless. Use Unit#scalar\");\r\n },\r\n\r\n /**\r\n * Returns the nearest multiple of quantity passed as\r\n * precision\r\n *\r\n * @param {(Qty|string|number)} precQuantity - Quantity, string formated\r\n * quantity or number as expected precision\r\n *\r\n * @returns {Qty} Nearest multiple of precQuantity\r\n *\r\n * @example\r\n * Qty('5.5 ft').toPrec('2 ft'); // returns 6 ft\r\n * Qty('0.8 cu').toPrec('0.25 cu'); // returns 0.75 cu\r\n * Qty('6.3782 m').toPrec('cm'); // returns 6.38 m\r\n * Qty('1.146 MPa').toPrec('0.1 bar'); // returns 1.15 MPa\r\n *\r\n */\r\n toPrec: function(precQuantity) {\r\n if (isString(precQuantity)) {\r\n precQuantity = Qty$1(precQuantity);\r\n }\r\n if (isNumber(precQuantity)) {\r\n precQuantity = Qty$1(precQuantity + \" \" + this.units());\r\n }\r\n\r\n if (!this.isUnitless()) {\r\n precQuantity = precQuantity.to(this.units());\r\n }\r\n else if (!precQuantity.isUnitless()) {\r\n throwIncompatibleUnits(this.units(), precQuantity.units());\r\n }\r\n\r\n if (precQuantity.scalar === 0) {\r\n throw new QtyError(\"Divide by zero\");\r\n }\r\n\r\n var precRoundedResult = mulSafe(Math.round(this.scalar / precQuantity.scalar),\r\n precQuantity.scalar);\r\n\r\n return Qty$1(precRoundedResult + this.units());\r\n }\r\n});\r\n\r\n/**\r\n * Configures and returns a fast function to convert\r\n * Number values from units to others.\r\n * Useful to efficiently convert large array of values\r\n * with same units into others with iterative methods.\r\n * Does not take care of rounding issues.\r\n *\r\n * @param {string} srcUnits Units of values to convert\r\n * @param {string} dstUnits Units to convert to\r\n *\r\n * @returns {Function} Converting function accepting Number value\r\n * and returning converted value\r\n *\r\n * @throws \"Incompatible units\" if units are incompatible\r\n *\r\n * @example\r\n * // Converting large array of numbers with the same units\r\n * // into other units\r\n * var converter = Qty.swiftConverter(\"m/h\", \"ft/s\");\r\n * var convertedSerie = largeSerie.map(converter);\r\n *\r\n */\r\nfunction swiftConverter(srcUnits, dstUnits) {\r\n var srcQty = Qty$1(srcUnits);\r\n var dstQty = Qty$1(dstUnits);\r\n\r\n if (srcQty.eq(dstQty)) {\r\n return identity;\r\n }\r\n\r\n var convert;\r\n if (!srcQty.isTemperature()) {\r\n convert = function(value) {\r\n return value * srcQty.baseScalar / dstQty.baseScalar;\r\n };\r\n }\r\n else {\r\n convert = function(value) {\r\n // TODO Not optimized\r\n return srcQty.mul(value).to(dstQty).scalar;\r\n };\r\n }\r\n\r\n return function converter(value) {\r\n var i,\r\n length,\r\n result;\r\n if (!Array.isArray(value)) {\r\n return convert(value);\r\n }\r\n else {\r\n length = value.length;\r\n result = [];\r\n for (i = 0; i < length; i++) {\r\n result.push(convert(value[i]));\r\n }\r\n return result;\r\n }\r\n };\r\n}\r\n\r\nvar baseUnitCache = {};\r\n\r\nfunction toBaseUnits (numerator,denominator) {\r\n var num = [];\r\n var den = [];\r\n var q = 1;\r\n var unit;\r\n for (var i = 0; i < numerator.length; i++) {\r\n unit = numerator[i];\r\n if (PREFIX_VALUES[unit]) {\r\n // workaround to fix\r\n // 0.1 * 0.1 => 0.010000000000000002\r\n q = mulSafe(q, PREFIX_VALUES[unit]);\r\n }\r\n else {\r\n if (UNIT_VALUES[unit]) {\r\n q *= UNIT_VALUES[unit].scalar;\r\n\r\n if (UNIT_VALUES[unit].numerator) {\r\n num.push(UNIT_VALUES[unit].numerator);\r\n }\r\n if (UNIT_VALUES[unit].denominator) {\r\n den.push(UNIT_VALUES[unit].denominator);\r\n }\r\n }\r\n }\r\n }\r\n for (var j = 0; j < denominator.length; j++) {\r\n unit = denominator[j];\r\n if (PREFIX_VALUES[unit]) {\r\n q /= PREFIX_VALUES[unit];\r\n }\r\n else {\r\n if (UNIT_VALUES[unit]) {\r\n q /= UNIT_VALUES[unit].scalar;\r\n\r\n if (UNIT_VALUES[unit].numerator) {\r\n den.push(UNIT_VALUES[unit].numerator);\r\n }\r\n if (UNIT_VALUES[unit].denominator) {\r\n num.push(UNIT_VALUES[unit].denominator);\r\n }\r\n }\r\n }\r\n }\r\n\r\n // Flatten\r\n num = num.reduce(function(a,b) {\r\n return a.concat(b);\r\n }, []);\r\n den = den.reduce(function(a,b) {\r\n return a.concat(b);\r\n }, []);\r\n\r\n return Qty$1({\"scalar\": q, \"numerator\": num, \"denominator\": den});\r\n}\r\n\r\nQty$1.parse = globalParse;\r\n\r\nQty$1.getUnits = getUnits;\r\nQty$1.getAliases = getAliases;\r\n\r\nQty$1.mulSafe = mulSafe;\r\nQty$1.divSafe = divSafe;\r\n\r\nQty$1.getKinds = getKinds;\r\n\r\nQty$1.swiftConverter = swiftConverter;\r\n\r\nQty$1.Error = QtyError;\r\n\r\nassign(Qty$1.prototype, {\r\n // Returns new instance with units of this\r\n add: function(other) {\r\n if (isString(other)) {\r\n other = Qty$1(other);\r\n }\r\n\r\n if (!this.isCompatible(other)) {\r\n throwIncompatibleUnits(this.units(), other.units());\r\n }\r\n\r\n if (this.isTemperature() && other.isTemperature()) {\r\n throw new QtyError(\"Cannot add two temperatures\");\r\n }\r\n else if (this.isTemperature()) {\r\n return addTempDegrees(this, other);\r\n }\r\n else if (other.isTemperature()) {\r\n return addTempDegrees(other, this);\r\n }\r\n\r\n return Qty$1({\"scalar\": this.scalar + other.to(this).scalar, \"numerator\": this.numerator, \"denominator\": this.denominator});\r\n },\r\n\r\n sub: function(other) {\r\n if (isString(other)) {\r\n other = Qty$1(other);\r\n }\r\n\r\n if (!this.isCompatible(other)) {\r\n throwIncompatibleUnits(this.units(), other.units());\r\n }\r\n\r\n if (this.isTemperature() && other.isTemperature()) {\r\n return subtractTemperatures(this,other);\r\n }\r\n else if (this.isTemperature()) {\r\n return subtractTempDegrees(this,other);\r\n }\r\n else if (other.isTemperature()) {\r\n throw new QtyError(\"Cannot subtract a temperature from a differential degree unit\");\r\n }\r\n\r\n return Qty$1({\"scalar\": this.scalar - other.to(this).scalar, \"numerator\": this.numerator, \"denominator\": this.denominator});\r\n },\r\n\r\n mul: function(other) {\r\n if (isNumber(other)) {\r\n return Qty$1({\"scalar\": mulSafe(this.scalar, other), \"numerator\": this.numerator, \"denominator\": this.denominator});\r\n }\r\n else if (isString(other)) {\r\n other = Qty$1(other);\r\n }\r\n\r\n if ((this.isTemperature()||other.isTemperature()) && !(this.isUnitless()||other.isUnitless())) {\r\n throw new QtyError(\"Cannot multiply by temperatures\");\r\n }\r\n\r\n // Quantities should be multiplied with same units if compatible, with base units else\r\n var op1 = this;\r\n var op2 = other;\r\n\r\n // so as not to confuse results, multiplication and division between temperature degrees will maintain original unit info in num/den\r\n // multiplication and division between deg[CFRK] can never factor each other out, only themselves: \"degK*degC/degC^2\" == \"degK/degC\"\r\n if (op1.isCompatible(op2) && op1.signature !== 400) {\r\n op2 = op2.to(op1);\r\n }\r\n var numden = cleanTerms(op1.numerator.concat(op2.numerator), op1.denominator.concat(op2.denominator));\r\n\r\n return Qty$1({\"scalar\": mulSafe(op1.scalar, op2.scalar), \"numerator\": numden[0], \"denominator\": numden[1]});\r\n },\r\n\r\n div: function(other) {\r\n if (isNumber(other)) {\r\n if (other === 0) {\r\n throw new QtyError(\"Divide by zero\");\r\n }\r\n return Qty$1({\"scalar\": this.scalar / other, \"numerator\": this.numerator, \"denominator\": this.denominator});\r\n }\r\n else if (isString(other)) {\r\n other = Qty$1(other);\r\n }\r\n\r\n if (other.scalar === 0) {\r\n throw new QtyError(\"Divide by zero\");\r\n }\r\n\r\n if (other.isTemperature()) {\r\n throw new QtyError(\"Cannot divide with temperatures\");\r\n }\r\n else if (this.isTemperature() && !other.isUnitless()) {\r\n throw new QtyError(\"Cannot divide with temperatures\");\r\n }\r\n\r\n // Quantities should be multiplied with same units if compatible, with base units else\r\n var op1 = this;\r\n var op2 = other;\r\n\r\n // so as not to confuse results, multiplication and division between temperature degrees will maintain original unit info in num/den\r\n // multiplication and division between deg[CFRK] can never factor each other out, only themselves: \"degK*degC/degC^2\" == \"degK/degC\"\r\n if (op1.isCompatible(op2) && op1.signature !== 400) {\r\n op2 = op2.to(op1);\r\n }\r\n var numden = cleanTerms(op1.numerator.concat(op2.denominator), op1.denominator.concat(op2.numerator));\r\n\r\n return Qty$1({\"scalar\": op1.scalar / op2.scalar, \"numerator\": numden[0], \"denominator\": numden[1]});\r\n },\r\n\r\n // Returns a Qty that is the inverse of this Qty,\r\n inverse: function() {\r\n if (this.isTemperature()) {\r\n throw new QtyError(\"Cannot divide with temperatures\");\r\n }\r\n if (this.scalar === 0) {\r\n throw new QtyError(\"Divide by zero\");\r\n }\r\n return Qty$1({\"scalar\": 1 / this.scalar, \"numerator\": this.denominator, \"denominator\": this.numerator});\r\n }\r\n});\r\n\r\nfunction cleanTerms(num, den) {\r\n num = num.filter(function(val) {\r\n return val !== UNITY;\r\n });\r\n den = den.filter(function(val) {\r\n return val !== UNITY;\r\n });\r\n\r\n var combined = {};\r\n\r\n var k;\r\n for (var i = 0; i < num.length; i++) {\r\n if (PREFIX_VALUES[num[i]]) {\r\n k = [num[i], num[i + 1]];\r\n i++;\r\n }\r\n else {\r\n k = num[i];\r\n }\r\n if (k && k !== UNITY) {\r\n if (combined[k]) {\r\n combined[k][0]++;\r\n }\r\n else {\r\n combined[k] = [1, k];\r\n }\r\n }\r\n }\r\n\r\n for (var j = 0; j < den.length; j++) {\r\n if (PREFIX_VALUES[den[j]]) {\r\n k = [den[j], den[j + 1]];\r\n j++;\r\n }\r\n else {\r\n k = den[j];\r\n }\r\n if (k && k !== UNITY) {\r\n if (combined[k]) {\r\n combined[k][0]--;\r\n }\r\n else {\r\n combined[k] = [-1, k];\r\n }\r\n }\r\n }\r\n\r\n num = [];\r\n den = [];\r\n\r\n for (var prop in combined) {\r\n if (combined.hasOwnProperty(prop)) {\r\n var item = combined[prop];\r\n var n;\r\n if (item[0] > 0) {\r\n for (n = 0; n < item[0]; n++) {\r\n num.push(item[1]);\r\n }\r\n }\r\n else if (item[0] < 0) {\r\n for (n = 0; n < -item[0]; n++) {\r\n den.push(item[1]);\r\n }\r\n }\r\n }\r\n }\r\n\r\n if (num.length === 0) {\r\n num = UNITY_ARRAY;\r\n }\r\n if (den.length === 0) {\r\n den = UNITY_ARRAY;\r\n }\r\n\r\n // Flatten\r\n num = num.reduce(function(a,b) {\r\n return a.concat(b);\r\n }, []);\r\n den = den.reduce(function(a,b) {\r\n return a.concat(b);\r\n }, []);\r\n\r\n return [num, den];\r\n}\r\n\r\nassign(Qty$1.prototype, {\r\n eq: function(other) {\r\n return this.compareTo(other) === 0;\r\n },\r\n\r\n lt: function(other) {\r\n return this.compareTo(other) === -1;\r\n },\r\n\r\n lte: function(other) {\r\n return this.eq(other) || this.lt(other);\r\n },\r\n\r\n gt: function(other) {\r\n return this.compareTo(other) === 1;\r\n },\r\n\r\n gte: function(other) {\r\n return this.eq(other) || this.gt(other);\r\n },\r\n\r\n // Compare two Qty objects. Throws an exception if they are not of compatible types.\r\n // Comparisons are done based on the value of the quantity in base SI units.\r\n //\r\n // NOTE: We cannot compare inverses as that breaks the general compareTo contract:\r\n // if a.compareTo(b) < 0 then b.compareTo(a) > 0\r\n // if a.compareTo(b) == 0 then b.compareTo(a) == 0\r\n //\r\n // Since \"10S\" == \".1ohm\" (10 > .1) and \"10ohm\" == \".1S\" (10 > .1)\r\n // Qty(\"10S\").inverse().compareTo(\"10ohm\") == -1\r\n // Qty(\"10ohm\").inverse().compareTo(\"10S\") == -1\r\n //\r\n // If including inverses in the sort is needed, I suggest writing: Qty.sort(qtyArray,units)\r\n compareTo: function(other) {\r\n if (isString(other)) {\r\n return this.compareTo(Qty$1(other));\r\n }\r\n if (!this.isCompatible(other)) {\r\n throwIncompatibleUnits(this.units(), other.units());\r\n }\r\n if (this.baseScalar < other.baseScalar) {\r\n return -1;\r\n }\r\n else if (this.baseScalar === other.baseScalar) {\r\n return 0;\r\n }\r\n else if (this.baseScalar > other.baseScalar) {\r\n return 1;\r\n }\r\n },\r\n\r\n // Return true if quantities and units match\r\n // Unit(\"100 cm\").same(Unit(\"100 cm\")) # => true\r\n // Unit(\"100 cm\").same(Unit(\"1 m\")) # => false\r\n same: function(other) {\r\n return (this.scalar === other.scalar) && (this.units() === other.units());\r\n }\r\n});\r\n\r\nassign(Qty$1.prototype, {\r\n // returns true if no associated units\r\n // false, even if the units are \"unitless\" like 'radians, each, etc'\r\n isUnitless: function() {\r\n return [this.numerator, this.denominator].every(function(item) {\r\n return compareArray(item, UNITY_ARRAY);\r\n });\r\n },\r\n\r\n /*\r\n check to see if units are compatible, but not the scalar part\r\n this check is done by comparing signatures for performance reasons\r\n if passed a string, it will create a unit object with the string and then do the comparison\r\n this permits a syntax like:\r\n unit =~ \"mm\"\r\n if you want to do a regexp on the unit string do this ...\r\n unit.units =~ /regexp/\r\n */\r\n isCompatible: function(other) {\r\n if (isString(other)) {\r\n return this.isCompatible(Qty$1(other));\r\n }\r\n\r\n if (!(isQty(other))) {\r\n return false;\r\n }\r\n\r\n if (other.signature !== undefined) {\r\n return this.signature === other.signature;\r\n }\r\n else {\r\n return false;\r\n }\r\n },\r\n\r\n /*\r\n check to see if units are inverse of each other, but not the scalar part\r\n this check is done by comparing signatures for performance reasons\r\n if passed a string, it will create a unit object with the string and then do the comparison\r\n this permits a syntax like:\r\n unit =~ \"mm\"\r\n if you want to do a regexp on the unit string do this ...\r\n unit.units =~ /regexp/\r\n */\r\n isInverse: function(other) {\r\n return this.inverse().isCompatible(other);\r\n },\r\n\r\n // Returns 'true' if the Unit is represented in base units\r\n isBase: function() {\r\n if (this._isBase !== undefined) {\r\n return this._isBase;\r\n }\r\n if (this.isDegrees() && this.numerator[0].match(/<(kelvin|temp-K)>/)) {\r\n this._isBase = true;\r\n return this._isBase;\r\n }\r\n\r\n this.numerator.concat(this.denominator).forEach(function(item) {\r\n if (item !== UNITY && BASE_UNITS.indexOf(item) === -1 ) {\r\n this._isBase = false;\r\n }\r\n }, this);\r\n if (this._isBase === false) {\r\n return this._isBase;\r\n }\r\n this._isBase = true;\r\n return this._isBase;\r\n }\r\n});\r\n\r\nfunction NestedMap() {}\r\n\r\nNestedMap.prototype.get = function(keys) {\r\n\r\n // Allows to pass key1, key2, ... instead of [key1, key2, ...]\r\n if (arguments.length > 1) {\r\n // Slower with Firefox but faster with Chrome than\r\n // Array.prototype.slice.call(arguments)\r\n // See http://jsperf.com/array-apply-versus-array-prototype-slice-call\r\n keys = Array.apply(null, arguments);\r\n }\r\n\r\n return keys.reduce(function(map, key, index) {\r\n if (map) {\r\n\r\n var childMap = map[key];\r\n\r\n if (index === keys.length - 1) {\r\n return childMap ? childMap.data : undefined;\r\n }\r\n else {\r\n return childMap;\r\n }\r\n }\r\n },\r\n this);\r\n};\r\n\r\nNestedMap.prototype.set = function(keys, value) {\r\n\r\n if (arguments.length > 2) {\r\n keys = Array.prototype.slice.call(arguments, 0, -1);\r\n value = arguments[arguments.length - 1];\r\n }\r\n\r\n return keys.reduce(function(map, key, index) {\r\n\r\n var childMap = map[key];\r\n if (childMap === undefined) {\r\n childMap = map[key] = {};\r\n }\r\n\r\n if (index === keys.length - 1) {\r\n childMap.data = value;\r\n return value;\r\n }\r\n else {\r\n return childMap;\r\n }\r\n }, this);\r\n};\r\n\r\n/**\r\n * Default formatter\r\n *\r\n * @param {number} scalar\r\n * @param {string} units\r\n *\r\n * @returns {string} formatted result\r\n */\r\nfunction defaultFormatter(scalar, units) {\r\n return (scalar + \" \" + units).trim();\r\n}\r\n\r\n/**\r\n *\r\n * Configurable Qty default formatter\r\n *\r\n * @type {function}\r\n *\r\n * @param {number} scalar\r\n * @param {string} units\r\n *\r\n * @returns {string} formatted result\r\n */\r\nQty$1.formatter = defaultFormatter;\r\n\r\nassign(Qty$1.prototype, {\r\n\r\n // returns the 'unit' part of the Unit object without the scalar\r\n units: function() {\r\n if (this._units !== undefined) {\r\n return this._units;\r\n }\r\n\r\n var numIsUnity = compareArray(this.numerator, UNITY_ARRAY),\r\n denIsUnity = compareArray(this.denominator, UNITY_ARRAY);\r\n if (numIsUnity && denIsUnity) {\r\n this._units = \"\";\r\n return this._units;\r\n }\r\n\r\n var numUnits = stringifyUnits(this.numerator),\r\n denUnits = stringifyUnits(this.denominator);\r\n this._units = numUnits + (denIsUnity ? \"\" : (\"/\" + denUnits));\r\n return this._units;\r\n },\r\n\r\n /**\r\n * Stringifies the quantity\r\n * Deprecation notice: only units parameter is supported.\r\n *\r\n * @param {(number|string|Qty)} targetUnitsOrMaxDecimalsOrPrec -\r\n * target units if string,\r\n * max number of decimals if number,\r\n * passed to #toPrec before converting if Qty\r\n *\r\n * @param {number=} maxDecimals - Maximum number of decimals of\r\n * formatted output\r\n *\r\n * @returns {string} reparseable quantity as string\r\n */\r\n toString: function(targetUnitsOrMaxDecimalsOrPrec, maxDecimals) {\r\n var targetUnits;\r\n if (isNumber(targetUnitsOrMaxDecimalsOrPrec)) {\r\n targetUnits = this.units();\r\n maxDecimals = targetUnitsOrMaxDecimalsOrPrec;\r\n }\r\n else if (isString(targetUnitsOrMaxDecimalsOrPrec)) {\r\n targetUnits = targetUnitsOrMaxDecimalsOrPrec;\r\n }\r\n else if (isQty(targetUnitsOrMaxDecimalsOrPrec)) {\r\n return this.toPrec(targetUnitsOrMaxDecimalsOrPrec).toString(maxDecimals);\r\n }\r\n\r\n var out = this.to(targetUnits);\r\n\r\n var outScalar = maxDecimals !== undefined ? round(out.scalar, maxDecimals) : out.scalar;\r\n out = (outScalar + \" \" + out.units()).trim();\r\n return out;\r\n },\r\n\r\n /**\r\n * Format the quantity according to optional passed target units\r\n * and formatter\r\n *\r\n * @param {string} [targetUnits=current units] -\r\n * optional units to convert to before formatting\r\n *\r\n * @param {function} [formatter=Qty.formatter] -\r\n * delegates formatting to formatter callback.\r\n * formatter is called back with two parameters (scalar, units)\r\n * and should return formatted result.\r\n * If unspecified, formatting is delegated to default formatter\r\n * set to Qty.formatter\r\n *\r\n * @example\r\n * var roundingAndLocalizingFormatter = function(scalar, units) {\r\n * // localize or limit scalar to n max decimals for instance\r\n * // return formatted result\r\n * };\r\n * var qty = Qty('1.1234 m');\r\n * qty.format(); // same units, default formatter => \"1.234 m\"\r\n * qty.format(\"cm\"); // converted to \"cm\", default formatter => \"123.45 cm\"\r\n * qty.format(roundingAndLocalizingFormatter); // same units, custom formatter => \"1,2 m\"\r\n * qty.format(\"cm\", roundingAndLocalizingFormatter); // convert to \"cm\", custom formatter => \"123,4 cm\"\r\n *\r\n * @returns {string} quantity as string\r\n */\r\n format: function(targetUnits, formatter) {\r\n if (arguments.length === 1) {\r\n if (typeof targetUnits === \"function\") {\r\n formatter = targetUnits;\r\n targetUnits = undefined;\r\n }\r\n }\r\n\r\n formatter = formatter || Qty$1.formatter;\r\n var targetQty = this.to(targetUnits);\r\n return formatter.call(this, targetQty.scalar, targetQty.units());\r\n }\r\n});\r\n\r\nvar stringifiedUnitsCache = new NestedMap();\r\n/**\r\n * Returns a string representing a normalized unit array\r\n *\r\n * @param {string[]} units Normalized unit array\r\n * @returns {string} String representing passed normalized unit array and\r\n * suitable for output\r\n *\r\n */\r\nfunction stringifyUnits(units) {\r\n\r\n var stringified = stringifiedUnitsCache.get(units);\r\n if (stringified) {\r\n return stringified;\r\n }\r\n\r\n var isUnity = compareArray(units, UNITY_ARRAY);\r\n if (isUnity) {\r\n stringified = \"1\";\r\n }\r\n else {\r\n stringified = simplify(getOutputNames(units)).join(\"*\");\r\n }\r\n\r\n // Cache result\r\n stringifiedUnitsCache.set(units, stringified);\r\n\r\n return stringified;\r\n}\r\n\r\nfunction getOutputNames(units) {\r\n var unitNames = [], token, tokenNext;\r\n for (var i = 0; i < units.length; i++) {\r\n token = units[i];\r\n tokenNext = units[i + 1];\r\n if (PREFIX_VALUES[token]) {\r\n unitNames.push(OUTPUT_MAP[token] + OUTPUT_MAP[tokenNext]);\r\n i++;\r\n }\r\n else {\r\n unitNames.push(OUTPUT_MAP[token]);\r\n }\r\n }\r\n return unitNames;\r\n}\r\n\r\nfunction simplify (units) {\r\n // this turns ['s','m','s'] into ['s2','m']\r\n\r\n var unitCounts = units.reduce(function(acc, unit) {\r\n var unitCounter = acc[unit];\r\n if (!unitCounter) {\r\n acc.push(unitCounter = acc[unit] = [unit, 0]);\r\n }\r\n\r\n unitCounter[1]++;\r\n\r\n return acc;\r\n }, []);\r\n\r\n return unitCounts.map(function(unitCount) {\r\n return unitCount[0] + (unitCount[1] > 1 ? unitCount[1] : \"\");\r\n });\r\n}\r\n\r\nQty$1.version = \"1.7.0\";\r\n\r\nreturn Qty$1;\r\n\r\n})));\n/*! @preserve\r\n * numeral.js\r\n * version : 2.0.6\r\n * author : Adam Draper\r\n * license : MIT\r\n * http://adamwdraper.github.com/Numeral-js/\r\n */\r\n\r\n(function (global, factory) {\r\n if (typeof define === 'function' && define.amd) {\r\n define(factory);\r\n } else if (typeof module === 'object' && module.exports) {\r\n module.exports = factory();\r\n } else {\r\n global.numeral = factory();\r\n }\r\n}(this, function () {\r\n /************************************\r\n Variables\r\n ************************************/\r\n\r\n var numeral,\r\n _,\r\n VERSION = '2.0.6',\r\n formats = {},\r\n locales = {},\r\n defaults = {\r\n currentLocale: 'en',\r\n zeroFormat: null,\r\n nullFormat: null,\r\n defaultFormat: '0,0',\r\n scalePercentBy100: true\r\n },\r\n options = {\r\n currentLocale: defaults.currentLocale,\r\n zeroFormat: defaults.zeroFormat,\r\n nullFormat: defaults.nullFormat,\r\n defaultFormat: defaults.defaultFormat,\r\n scalePercentBy100: defaults.scalePercentBy100\r\n };\r\n\r\n\r\n /************************************\r\n Constructors\r\n ************************************/\r\n\r\n // Numeral prototype object\r\n function Numeral(input, number) {\r\n this._input = input;\r\n\r\n this._value = number;\r\n }\r\n\r\n numeral = function(input) {\r\n var value,\r\n kind,\r\n unformatFunction,\r\n regexp;\r\n\r\n if (numeral.isNumeral(input)) {\r\n value = input.value();\r\n } else if (input === 0 || typeof input === 'undefined') {\r\n value = 0;\r\n } else if (input === null || _.isNaN(input)) {\r\n value = null;\r\n } else if (typeof input === 'string') {\r\n if (options.zeroFormat && input === options.zeroFormat) {\r\n value = 0;\r\n } else if (options.nullFormat && input === options.nullFormat || !input.replace(/[^0-9]+/g, '').length) {\r\n value = null;\r\n } else {\r\n for (kind in formats) {\r\n regexp = typeof formats[kind].regexps.unformat === 'function' ? formats[kind].regexps.unformat() : formats[kind].regexps.unformat;\r\n\r\n if (regexp && input.match(regexp)) {\r\n unformatFunction = formats[kind].unformat;\r\n\r\n break;\r\n }\r\n }\r\n\r\n unformatFunction = unformatFunction || numeral._.stringToNumber;\r\n\r\n value = unformatFunction(input);\r\n }\r\n } else {\r\n value = Number(input)|| null;\r\n }\r\n\r\n return new Numeral(input, value);\r\n };\r\n\r\n // version number\r\n numeral.version = VERSION;\r\n\r\n // compare numeral object\r\n numeral.isNumeral = function(obj) {\r\n return obj instanceof Numeral;\r\n };\r\n\r\n // helper functions\r\n numeral._ = _ = {\r\n // formats numbers separators, decimals places, signs, abbreviations\r\n numberToFormat: function(value, format, roundingFunction) {\r\n var locale = locales[numeral.options.currentLocale],\r\n negP = false,\r\n optDec = false,\r\n leadingCount = 0,\r\n abbr = '',\r\n trillion = 1000000000000,\r\n billion = 1000000000,\r\n million = 1000000,\r\n thousand = 1000,\r\n decimal = '',\r\n neg = false,\r\n abbrForce, // force abbreviation\r\n abs,\r\n min,\r\n max,\r\n power,\r\n int,\r\n precision,\r\n signed,\r\n thousands,\r\n output;\r\n\r\n // make sure we never format a null value\r\n value = value || 0;\r\n\r\n abs = Math.abs(value);\r\n\r\n // see if we should use parentheses for negative number or if we should prefix with a sign\r\n // if both are present we default to parentheses\r\n if (numeral._.includes(format, '(')) {\r\n negP = true;\r\n format = format.replace(/[\\(|\\)]/g, '');\r\n } else if (numeral._.includes(format, '+') || numeral._.includes(format, '-')) {\r\n signed = numeral._.includes(format, '+') ? format.indexOf('+') : value < 0 ? format.indexOf('-') : -1;\r\n format = format.replace(/[\\+|\\-]/g, '');\r\n }\r\n\r\n // see if abbreviation is wanted\r\n if (numeral._.includes(format, 'a')) {\r\n abbrForce = format.match(/a(k|m|b|t)?/);\r\n\r\n abbrForce = abbrForce ? abbrForce[1] : false;\r\n\r\n // check for space before abbreviation\r\n if (numeral._.includes(format, ' a')) {\r\n abbr = ' ';\r\n }\r\n\r\n format = format.replace(new RegExp(abbr + 'a[kmbt]?'), '');\r\n\r\n if (abs >= trillion && !abbrForce || abbrForce === 't') {\r\n // trillion\r\n abbr += locale.abbreviations.trillion;\r\n value = value / trillion;\r\n } else if (abs < trillion && abs >= billion && !abbrForce || abbrForce === 'b') {\r\n // billion\r\n abbr += locale.abbreviations.billion;\r\n value = value / billion;\r\n } else if (abs < billion && abs >= million && !abbrForce || abbrForce === 'm') {\r\n // million\r\n abbr += locale.abbreviations.million;\r\n value = value / million;\r\n } else if (abs < million && abs >= thousand && !abbrForce || abbrForce === 'k') {\r\n // thousand\r\n abbr += locale.abbreviations.thousand;\r\n value = value / thousand;\r\n }\r\n }\r\n\r\n // check for optional decimals\r\n if (numeral._.includes(format, '[.]')) {\r\n optDec = true;\r\n format = format.replace('[.]', '.');\r\n }\r\n\r\n // break number and format\r\n int = value.toString().split('.')[0];\r\n precision = format.split('.')[1];\r\n thousands = format.indexOf(',');\r\n leadingCount = (format.split('.')[0].split(',')[0].match(/0/g) || []).length;\r\n\r\n if (precision) {\r\n if (numeral._.includes(precision, '[')) {\r\n precision = precision.replace(']', '');\r\n precision = precision.split('[');\r\n decimal = numeral._.toFixed(value, (precision[0].length + precision[1].length), roundingFunction, precision[1].length);\r\n } else {\r\n decimal = numeral._.toFixed(value, precision.length, roundingFunction);\r\n }\r\n\r\n int = decimal.split('.')[0];\r\n\r\n if (numeral._.includes(decimal, '.')) {\r\n decimal = locale.delimiters.decimal + decimal.split('.')[1];\r\n } else {\r\n decimal = '';\r\n }\r\n\r\n if (optDec && Number(decimal.slice(1)) === 0) {\r\n decimal = '';\r\n }\r\n } else {\r\n int = numeral._.toFixed(value, 0, roundingFunction);\r\n }\r\n\r\n // check abbreviation again after rounding\r\n if (abbr && !abbrForce && Number(int) >= 1000 && abbr !== locale.abbreviations.trillion) {\r\n int = String(Number(int) / 1000);\r\n\r\n switch (abbr) {\r\n case locale.abbreviations.thousand:\r\n abbr = locale.abbreviations.million;\r\n break;\r\n case locale.abbreviations.million:\r\n abbr = locale.abbreviations.billion;\r\n break;\r\n case locale.abbreviations.billion:\r\n abbr = locale.abbreviations.trillion;\r\n break;\r\n }\r\n }\r\n\r\n\r\n // format number\r\n if (numeral._.includes(int, '-')) {\r\n int = int.slice(1);\r\n neg = true;\r\n }\r\n\r\n if (int.length < leadingCount) {\r\n for (var i = leadingCount - int.length; i > 0; i--) {\r\n int = '0' + int;\r\n }\r\n }\r\n\r\n if (thousands > -1) {\r\n int = int.toString().replace(/(\\d)(?=(\\d{3})+(?!\\d))/g, '$1' + locale.delimiters.thousands);\r\n }\r\n\r\n if (format.indexOf('.') === 0) {\r\n int = '';\r\n }\r\n\r\n output = int + decimal + (abbr ? abbr : '');\r\n\r\n if (negP) {\r\n output = (negP && neg ? '(' : '') + output + (negP && neg ? ')' : '');\r\n } else {\r\n if (signed >= 0) {\r\n output = signed === 0 ? (neg ? '-' : '+') + output : output + (neg ? '-' : '+');\r\n } else if (neg) {\r\n output = '-' + output;\r\n }\r\n }\r\n\r\n return output;\r\n },\r\n // unformats numbers separators, decimals places, signs, abbreviations\r\n stringToNumber: function(string) {\r\n var locale = locales[options.currentLocale],\r\n stringOriginal = string,\r\n abbreviations = {\r\n thousand: 3,\r\n million: 6,\r\n billion: 9,\r\n trillion: 12\r\n },\r\n abbreviation,\r\n value,\r\n i,\r\n regexp;\r\n\r\n if (options.zeroFormat && string === options.zeroFormat) {\r\n value = 0;\r\n } else if (options.nullFormat && string === options.nullFormat || !string.replace(/[^0-9]+/g, '').length) {\r\n value = null;\r\n } else {\r\n value = 1;\r\n\r\n if (locale.delimiters.decimal !== '.') {\r\n string = string.replace(/\\./g, '').replace(locale.delimiters.decimal, '.');\r\n }\r\n\r\n for (abbreviation in abbreviations) {\r\n regexp = new RegExp('[^a-zA-Z]' + locale.abbreviations[abbreviation] + '(?:\\\\)|(\\\\' + locale.currency.symbol + ')?(?:\\\\))?)?$');\r\n\r\n if (stringOriginal.match(regexp)) {\r\n value *= Math.pow(10, abbreviations[abbreviation]);\r\n break;\r\n }\r\n }\r\n\r\n // check for negative number\r\n value *= (string.split('-').length + Math.min(string.split('(').length - 1, string.split(')').length - 1)) % 2 ? 1 : -1;\r\n\r\n // remove non numbers\r\n string = string.replace(/[^0-9\\.]+/g, '');\r\n\r\n value *= Number(string);\r\n }\r\n\r\n return value;\r\n },\r\n isNaN: function(value) {\r\n return typeof value === 'number' && isNaN(value);\r\n },\r\n includes: function(string, search) {\r\n return string.indexOf(search) !== -1;\r\n },\r\n insert: function(string, subString, start) {\r\n return string.slice(0, start) + subString + string.slice(start);\r\n },\r\n reduce: function(array, callback /*, initialValue*/) {\r\n if (this === null) {\r\n throw new TypeError('Array.prototype.reduce called on null or undefined');\r\n }\r\n\r\n if (typeof callback !== 'function') {\r\n throw new TypeError(callback + ' is not a function');\r\n }\r\n\r\n var t = Object(array),\r\n len = t.length >>> 0,\r\n k = 0,\r\n value;\r\n\r\n if (arguments.length === 3) {\r\n value = arguments[2];\r\n } else {\r\n while (k < len && !(k in t)) {\r\n k++;\r\n }\r\n\r\n if (k >= len) {\r\n throw new TypeError('Reduce of empty array with no initial value');\r\n }\r\n\r\n value = t[k++];\r\n }\r\n for (; k < len; k++) {\r\n if (k in t) {\r\n value = callback(value, t[k], k, t);\r\n }\r\n }\r\n return value;\r\n },\r\n /**\r\n * Computes the multiplier necessary to make x >= 1,\r\n * effectively eliminating miscalculations caused by\r\n * finite precision.\r\n */\r\n multiplier: function (x) {\r\n var parts = x.toString().split('.');\r\n\r\n return parts.length < 2 ? 1 : Math.pow(10, parts[1].length);\r\n },\r\n /**\r\n * Given a variable number of arguments, returns the maximum\r\n * multiplier that must be used to normalize an operation involving\r\n * all of them.\r\n */\r\n correctionFactor: function () {\r\n var args = Array.prototype.slice.call(arguments);\r\n\r\n return args.reduce(function(accum, next) {\r\n var mn = _.multiplier(next);\r\n return accum > mn ? accum : mn;\r\n }, 1);\r\n },\r\n /**\r\n * Implementation of toFixed() that treats floats more like decimals\r\n *\r\n * Fixes binary rounding issues (eg. (0.615).toFixed(2) === '0.61') that present\r\n * problems for accounting- and finance-related software.\r\n */\r\n toFixed: function(value, maxDecimals, roundingFunction, optionals) {\r\n var splitValue = value.toString().split('.'),\r\n minDecimals = maxDecimals - (optionals || 0),\r\n boundedPrecision,\r\n optionalsRegExp,\r\n power,\r\n output;\r\n\r\n // Use the smallest precision value possible to avoid errors from floating point representation\r\n if (splitValue.length === 2) {\r\n boundedPrecision = Math.min(Math.max(splitValue[1].length, minDecimals), maxDecimals);\r\n } else {\r\n boundedPrecision = minDecimals;\r\n }\r\n\r\n power = Math.pow(10, boundedPrecision);\r\n\r\n // Multiply up by precision, round accurately, then divide and use native toFixed():\r\n output = (roundingFunction(value + 'e+' + boundedPrecision) / power).toFixed(boundedPrecision);\r\n\r\n if (optionals > maxDecimals - boundedPrecision) {\r\n optionalsRegExp = new RegExp('\\\\.?0{1,' + (optionals - (maxDecimals - boundedPrecision)) + '}$');\r\n output = output.replace(optionalsRegExp, '');\r\n }\r\n\r\n return output;\r\n }\r\n };\r\n\r\n // avaliable options\r\n numeral.options = options;\r\n\r\n // avaliable formats\r\n numeral.formats = formats;\r\n\r\n // avaliable formats\r\n numeral.locales = locales;\r\n\r\n // This function sets the current locale. If\r\n // no arguments are passed in, it will simply return the current global\r\n // locale key.\r\n numeral.locale = function(key) {\r\n if (key) {\r\n options.currentLocale = key.toLowerCase();\r\n }\r\n\r\n return options.currentLocale;\r\n };\r\n\r\n // This function provides access to the loaded locale data. If\r\n // no arguments are passed in, it will simply return the current\r\n // global locale object.\r\n numeral.localeData = function(key) {\r\n if (!key) {\r\n return locales[options.currentLocale];\r\n }\r\n\r\n key = key.toLowerCase();\r\n\r\n if (!locales[key]) {\r\n throw new Error('Unknown locale : ' + key);\r\n }\r\n\r\n return locales[key];\r\n };\r\n\r\n numeral.reset = function() {\r\n for (var property in defaults) {\r\n options[property] = defaults[property];\r\n }\r\n };\r\n\r\n numeral.zeroFormat = function(format) {\r\n options.zeroFormat = typeof(format) === 'string' ? format : null;\r\n };\r\n\r\n numeral.nullFormat = function (format) {\r\n options.nullFormat = typeof(format) === 'string' ? format : null;\r\n };\r\n\r\n numeral.defaultFormat = function(format) {\r\n options.defaultFormat = typeof(format) === 'string' ? format : '0.0';\r\n };\r\n\r\n numeral.register = function(type, name, format) {\r\n name = name.toLowerCase();\r\n\r\n if (this[type + 's'][name]) {\r\n throw new TypeError(name + ' ' + type + ' already registered.');\r\n }\r\n\r\n this[type + 's'][name] = format;\r\n\r\n return format;\r\n };\r\n\r\n\r\n numeral.validate = function(val, culture) {\r\n var _decimalSep,\r\n _thousandSep,\r\n _currSymbol,\r\n _valArray,\r\n _abbrObj,\r\n _thousandRegEx,\r\n localeData,\r\n temp;\r\n\r\n //coerce val to string\r\n if (typeof val !== 'string') {\r\n val += '';\r\n\r\n if (console.warn) {\r\n console.warn('Numeral.js: Value is not string. It has been co-erced to: ', val);\r\n }\r\n }\r\n\r\n //trim whitespaces from either sides\r\n val = val.trim();\r\n\r\n //if val is just digits return true\r\n if (!!val.match(/^\\d+$/)) {\r\n return true;\r\n }\r\n\r\n //if val is empty return false\r\n if (val === '') {\r\n return false;\r\n }\r\n\r\n //get the decimal and thousands separator from numeral.localeData\r\n try {\r\n //check if the culture is understood by numeral. if not, default it to current locale\r\n localeData = numeral.localeData(culture);\r\n } catch (e) {\r\n localeData = numeral.localeData(numeral.locale());\r\n }\r\n\r\n //setup the delimiters and currency symbol based on culture/locale\r\n _currSymbol = localeData.currency.symbol;\r\n _abbrObj = localeData.abbreviations;\r\n _decimalSep = localeData.delimiters.decimal;\r\n if (localeData.delimiters.thousands === '.') {\r\n _thousandSep = '\\\\.';\r\n } else {\r\n _thousandSep = localeData.delimiters.thousands;\r\n }\r\n\r\n // validating currency symbol\r\n temp = val.match(/^[^\\d]+/);\r\n if (temp !== null) {\r\n val = val.substr(1);\r\n if (temp[0] !== _currSymbol) {\r\n return false;\r\n }\r\n }\r\n\r\n //validating abbreviation symbol\r\n temp = val.match(/[^\\d]+$/);\r\n if (temp !== null) {\r\n val = val.slice(0, -1);\r\n if (temp[0] !== _abbrObj.thousand && temp[0] !== _abbrObj.million && temp[0] !== _abbrObj.billion && temp[0] !== _abbrObj.trillion) {\r\n return false;\r\n }\r\n }\r\n\r\n _thousandRegEx = new RegExp(_thousandSep + '{2}');\r\n\r\n if (!val.match(/[^\\d.,]/g)) {\r\n _valArray = val.split(_decimalSep);\r\n if (_valArray.length > 2) {\r\n return false;\r\n } else {\r\n if (_valArray.length < 2) {\r\n return ( !! _valArray[0].match(/^\\d+.*\\d$/) && !_valArray[0].match(_thousandRegEx));\r\n } else {\r\n if (_valArray[0].length === 1) {\r\n return ( !! _valArray[0].match(/^\\d+$/) && !_valArray[0].match(_thousandRegEx) && !! _valArray[1].match(/^\\d+$/));\r\n } else {\r\n return ( !! _valArray[0].match(/^\\d+.*\\d$/) && !_valArray[0].match(_thousandRegEx) && !! _valArray[1].match(/^\\d+$/));\r\n }\r\n }\r\n }\r\n }\r\n\r\n return false;\r\n };\r\n\r\n\r\n /************************************\r\n Numeral Prototype\r\n ************************************/\r\n\r\n numeral.fn = Numeral.prototype = {\r\n clone: function() {\r\n return numeral(this);\r\n },\r\n format: function(inputString, roundingFunction) {\r\n var value = this._value,\r\n format = inputString || options.defaultFormat,\r\n kind,\r\n output,\r\n formatFunction;\r\n\r\n // make sure we have a roundingFunction\r\n roundingFunction = roundingFunction || Math.round;\r\n\r\n // format based on value\r\n if (value === 0 && options.zeroFormat !== null) {\r\n output = options.zeroFormat;\r\n } else if (value === null && options.nullFormat !== null) {\r\n output = options.nullFormat;\r\n } else {\r\n for (kind in formats) {\r\n if (format.match(formats[kind].regexps.format)) {\r\n formatFunction = formats[kind].format;\r\n\r\n break;\r\n }\r\n }\r\n\r\n formatFunction = formatFunction || numeral._.numberToFormat;\r\n\r\n output = formatFunction(value, format, roundingFunction);\r\n }\r\n\r\n return output;\r\n },\r\n value: function() {\r\n return this._value;\r\n },\r\n input: function() {\r\n return this._input;\r\n },\r\n set: function(value) {\r\n this._value = Number(value);\r\n\r\n return this;\r\n },\r\n add: function(value) {\r\n var corrFactor = _.correctionFactor.call(null, this._value, value);\r\n\r\n function cback(accum, curr, currI, O) {\r\n return accum + Math.round(corrFactor * curr);\r\n }\r\n\r\n this._value = _.reduce([this._value, value], cback, 0) / corrFactor;\r\n\r\n return this;\r\n },\r\n subtract: function(value) {\r\n var corrFactor = _.correctionFactor.call(null, this._value, value);\r\n\r\n function cback(accum, curr, currI, O) {\r\n return accum - Math.round(corrFactor * curr);\r\n }\r\n\r\n this._value = _.reduce([value], cback, Math.round(this._value * corrFactor)) / corrFactor;\r\n\r\n return this;\r\n },\r\n multiply: function(value) {\r\n function cback(accum, curr, currI, O) {\r\n var corrFactor = _.correctionFactor(accum, curr);\r\n return Math.round(accum * corrFactor) * Math.round(curr * corrFactor) / Math.round(corrFactor * corrFactor);\r\n }\r\n\r\n this._value = _.reduce([this._value, value], cback, 1);\r\n\r\n return this;\r\n },\r\n divide: function(value) {\r\n function cback(accum, curr, currI, O) {\r\n var corrFactor = _.correctionFactor(accum, curr);\r\n return Math.round(accum * corrFactor) / Math.round(curr * corrFactor);\r\n }\r\n\r\n this._value = _.reduce([this._value, value], cback);\r\n\r\n return this;\r\n },\r\n difference: function(value) {\r\n return Math.abs(numeral(this._value).subtract(value).value());\r\n }\r\n };\r\n\r\n /************************************\r\n Default Locale && Format\r\n ************************************/\r\n\r\n numeral.register('locale', 'en', {\r\n delimiters: {\r\n thousands: ',',\r\n decimal: '.'\r\n },\r\n abbreviations: {\r\n thousand: 'k',\r\n million: 'm',\r\n billion: 'b',\r\n trillion: 't'\r\n },\r\n ordinal: function(number) {\r\n var b = number % 10;\r\n return (~~(number % 100 / 10) === 1) ? 'th' :\r\n (b === 1) ? 'st' :\r\n (b === 2) ? 'nd' :\r\n (b === 3) ? 'rd' : 'th';\r\n },\r\n currency: {\r\n symbol: '$'\r\n }\r\n });\r\n\r\n \r\n\r\n(function() {\r\n numeral.register('format', 'bps', {\r\n regexps: {\r\n format: /(BPS)/,\r\n unformat: /(BPS)/\r\n },\r\n format: function(value, format, roundingFunction) {\r\n var space = numeral._.includes(format, ' BPS') ? ' ' : '',\r\n output;\r\n\r\n value = value * 10000;\r\n\r\n // check for space before BPS\r\n format = format.replace(/\\s?BPS/, '');\r\n\r\n output = numeral._.numberToFormat(value, format, roundingFunction);\r\n\r\n if (numeral._.includes(output, ')')) {\r\n output = output.split('');\r\n\r\n output.splice(-1, 0, space + 'BPS');\r\n\r\n output = output.join('');\r\n } else {\r\n output = output + space + 'BPS';\r\n }\r\n\r\n return output;\r\n },\r\n unformat: function(string) {\r\n return +(numeral._.stringToNumber(string) * 0.0001).toFixed(15);\r\n }\r\n });\r\n})();\r\n\r\n\r\n(function() {\r\n var decimal = {\r\n base: 1000,\r\n suffixes: ['B', 'KB', 'MB', 'GB', 'TB', 'PB', 'EB', 'ZB', 'YB']\r\n },\r\n binary = {\r\n base: 1024,\r\n suffixes: ['B', 'KiB', 'MiB', 'GiB', 'TiB', 'PiB', 'EiB', 'ZiB', 'YiB']\r\n };\r\n\r\n var allSuffixes = decimal.suffixes.concat(binary.suffixes.filter(function (item) {\r\n return decimal.suffixes.indexOf(item) < 0;\r\n }));\r\n var unformatRegex = allSuffixes.join('|');\r\n // Allow support for BPS (http://www.investopedia.com/terms/b/basispoint.asp)\r\n unformatRegex = '(' + unformatRegex.replace('B', 'B(?!PS)') + ')';\r\n\r\n numeral.register('format', 'bytes', {\r\n regexps: {\r\n format: /([0\\s]i?b)/,\r\n unformat: new RegExp(unformatRegex)\r\n },\r\n format: function(value, format, roundingFunction) {\r\n var output,\r\n bytes = numeral._.includes(format, 'ib') ? binary : decimal,\r\n suffix = numeral._.includes(format, ' b') || numeral._.includes(format, ' ib') ? ' ' : '',\r\n power,\r\n min,\r\n max;\r\n\r\n // check for space before\r\n format = format.replace(/\\s?i?b/, '');\r\n\r\n for (power = 0; power <= bytes.suffixes.length; power++) {\r\n min = Math.pow(bytes.base, power);\r\n max = Math.pow(bytes.base, power + 1);\r\n\r\n if (value === null || value === 0 || value >= min && value < max) {\r\n suffix += bytes.suffixes[power];\r\n\r\n if (min > 0) {\r\n value = value / min;\r\n }\r\n\r\n break;\r\n }\r\n }\r\n\r\n output = numeral._.numberToFormat(value, format, roundingFunction);\r\n\r\n return output + suffix;\r\n },\r\n unformat: function(string) {\r\n var value = numeral._.stringToNumber(string),\r\n power,\r\n bytesMultiplier;\r\n\r\n if (value) {\r\n for (power = decimal.suffixes.length - 1; power >= 0; power--) {\r\n if (numeral._.includes(string, decimal.suffixes[power])) {\r\n bytesMultiplier = Math.pow(decimal.base, power);\r\n\r\n break;\r\n }\r\n\r\n if (numeral._.includes(string, binary.suffixes[power])) {\r\n bytesMultiplier = Math.pow(binary.base, power);\r\n\r\n break;\r\n }\r\n }\r\n\r\n value *= (bytesMultiplier || 1);\r\n }\r\n\r\n return value;\r\n }\r\n });\r\n})();\r\n\r\n\r\n(function() {\r\n numeral.register('format', 'currency', {\r\n regexps: {\r\n format: /(\\$)/\r\n },\r\n format: function(value, format, roundingFunction) {\r\n var locale = numeral.locales[numeral.options.currentLocale],\r\n symbols = {\r\n before: format.match(/^([\\+|\\-|\\(|\\s|\\$]*)/)[0],\r\n after: format.match(/([\\+|\\-|\\)|\\s|\\$]*)$/)[0]\r\n },\r\n output,\r\n symbol,\r\n i;\r\n\r\n // strip format of spaces and $\r\n format = format.replace(/\\s?\\$\\s?/, '');\r\n\r\n // format the number\r\n output = numeral._.numberToFormat(value, format, roundingFunction);\r\n\r\n // update the before and after based on value\r\n if (value >= 0) {\r\n symbols.before = symbols.before.replace(/[\\-\\(]/, '');\r\n symbols.after = symbols.after.replace(/[\\-\\)]/, '');\r\n } else if (value < 0 && (!numeral._.includes(symbols.before, '-') && !numeral._.includes(symbols.before, '('))) {\r\n symbols.before = '-' + symbols.before;\r\n }\r\n\r\n // loop through each before symbol\r\n for (i = 0; i < symbols.before.length; i++) {\r\n symbol = symbols.before[i];\r\n\r\n switch (symbol) {\r\n case '$':\r\n output = numeral._.insert(output, locale.currency.symbol, i);\r\n break;\r\n case ' ':\r\n output = numeral._.insert(output, ' ', i + locale.currency.symbol.length - 1);\r\n break;\r\n }\r\n }\r\n\r\n // loop through each after symbol\r\n for (i = symbols.after.length - 1; i >= 0; i--) {\r\n symbol = symbols.after[i];\r\n\r\n switch (symbol) {\r\n case '$':\r\n output = i === symbols.after.length - 1 ? output + locale.currency.symbol : numeral._.insert(output, locale.currency.symbol, -(symbols.after.length - (1 + i)));\r\n break;\r\n case ' ':\r\n output = i === symbols.after.length - 1 ? output + ' ' : numeral._.insert(output, ' ', -(symbols.after.length - (1 + i) + locale.currency.symbol.length - 1));\r\n break;\r\n }\r\n }\r\n\r\n\r\n return output;\r\n }\r\n });\r\n})();\r\n\r\n\r\n(function() {\r\n numeral.register('format', 'exponential', {\r\n regexps: {\r\n format: /(e\\+|e-)/,\r\n unformat: /(e\\+|e-)/\r\n },\r\n format: function(value, format, roundingFunction) {\r\n var output,\r\n exponential = typeof value === 'number' && !numeral._.isNaN(value) ? value.toExponential() : '0e+0',\r\n parts = exponential.split('e');\r\n\r\n format = format.replace(/e[\\+|\\-]{1}0/, '');\r\n\r\n output = numeral._.numberToFormat(Number(parts[0]), format, roundingFunction);\r\n\r\n return output + 'e' + parts[1];\r\n },\r\n unformat: function(string) {\r\n var parts = numeral._.includes(string, 'e+') ? string.split('e+') : string.split('e-'),\r\n value = Number(parts[0]),\r\n power = Number(parts[1]);\r\n\r\n power = numeral._.includes(string, 'e-') ? power *= -1 : power;\r\n\r\n function cback(accum, curr, currI, O) {\r\n var corrFactor = numeral._.correctionFactor(accum, curr),\r\n num = (accum * corrFactor) * (curr * corrFactor) / (corrFactor * corrFactor);\r\n return num;\r\n }\r\n\r\n return numeral._.reduce([value, Math.pow(10, power)], cback, 1);\r\n }\r\n });\r\n})();\r\n\r\n\r\n(function() {\r\n numeral.register('format', 'ordinal', {\r\n regexps: {\r\n format: /(o)/\r\n },\r\n format: function(value, format, roundingFunction) {\r\n var locale = numeral.locales[numeral.options.currentLocale],\r\n output,\r\n ordinal = numeral._.includes(format, ' o') ? ' ' : '';\r\n\r\n // check for space before\r\n format = format.replace(/\\s?o/, '');\r\n\r\n ordinal += locale.ordinal(value);\r\n\r\n output = numeral._.numberToFormat(value, format, roundingFunction);\r\n\r\n return output + ordinal;\r\n }\r\n });\r\n})();\r\n\r\n\r\n(function() {\r\n numeral.register('format', 'percentage', {\r\n regexps: {\r\n format: /(%)/,\r\n unformat: /(%)/\r\n },\r\n format: function(value, format, roundingFunction) {\r\n var space = numeral._.includes(format, ' %') ? ' ' : '',\r\n output;\r\n\r\n if (numeral.options.scalePercentBy100) {\r\n value = value * 100;\r\n }\r\n\r\n // check for space before %\r\n format = format.replace(/\\s?\\%/, '');\r\n\r\n output = numeral._.numberToFormat(value, format, roundingFunction);\r\n\r\n if (numeral._.includes(output, ')')) {\r\n output = output.split('');\r\n\r\n output.splice(-1, 0, space + '%');\r\n\r\n output = output.join('');\r\n } else {\r\n output = output + space + '%';\r\n }\r\n\r\n return output;\r\n },\r\n unformat: function(string) {\r\n var number = numeral._.stringToNumber(string);\r\n if (numeral.options.scalePercentBy100) {\r\n return number * 0.01;\r\n }\r\n return number;\r\n }\r\n });\r\n})();\r\n\r\n\r\n(function() {\r\n numeral.register('format', 'time', {\r\n regexps: {\r\n format: /(:)/,\r\n unformat: /(:)/\r\n },\r\n format: function(value, format, roundingFunction) {\r\n var hours = Math.floor(value / 60 / 60),\r\n minutes = Math.floor((value - (hours * 60 * 60)) / 60),\r\n seconds = Math.round(value - (hours * 60 * 60) - (minutes * 60));\r\n\r\n return hours + ':' + (minutes < 10 ? '0' + minutes : minutes) + ':' + (seconds < 10 ? '0' + seconds : seconds);\r\n },\r\n unformat: function(string) {\r\n var timeArray = string.split(':'),\r\n seconds = 0;\r\n\r\n // turn hours and minutes into seconds and add them all up\r\n if (timeArray.length === 3) {\r\n // hours\r\n seconds = seconds + (Number(timeArray[0]) * 60 * 60);\r\n // minutes\r\n seconds = seconds + (Number(timeArray[1]) * 60);\r\n // seconds\r\n seconds = seconds + Number(timeArray[2]);\r\n } else if (timeArray.length === 2) {\r\n // minutes\r\n seconds = seconds + (Number(timeArray[0]) * 60);\r\n // seconds\r\n seconds = seconds + Number(timeArray[1]);\r\n }\r\n return Number(seconds);\r\n }\r\n });\r\n})();\r\n\r\nreturn numeral;\r\n}));\r\n\n/*! @preserve\r\n * numeral.js\r\n * locales : 2.0.6\r\n * license : MIT\r\n * http://adamwdraper.github.com/Numeral-js/\r\n */\r\n\r\n(function (global, factory) {\r\n if (typeof define === 'function' && define.amd) {\r\n define(['numeral'], factory);\r\n } else if (typeof module === 'object' && module.exports) {\r\n factory(require('./numeral'));\r\n } else {\r\n factory(global.numeral);\r\n }\r\n}(this, function (numeral) {\r\n \r\n(function() {\r\n numeral.register('locale', 'bg', {\r\n delimiters: {\r\n thousands: ' ',\r\n decimal: ','\r\n },\r\n abbreviations: { // I found these here http://www.unicode.org/cldr/charts/28/verify/numbers/bg.html\r\n thousand: 'хил',\r\n million: 'млн',\r\n billion: 'млрд',\r\n trillion: 'трлн'\r\n },\r\n ordinal: function (number) {\r\n // google translate suggests:\r\n // 1st=1-ви; 2nd=2-ри; 7th=7-ми;\r\n // 8th=8-ми and many others end with -ти\r\n // for example 3rd=3-ти\r\n // However since I've seen suggestions that in\r\n // Bulgarian the ordinal can be taken in\r\n // different forms (masculine, feminine, neuter)\r\n // I've opted to wimp out on commiting that to code\r\n return '';\r\n },\r\n currency: {\r\n symbol: 'лв'\r\n }\r\n });\r\n})();\r\n\r\n\r\n(function() {\r\n \r\n numeral.register('locale', 'chs', {\r\n delimiters: {\r\n thousands: ',',\r\n decimal: '.'\r\n },\r\n abbreviations: {\r\n thousand: '千',\r\n million: '百万',\r\n billion: '十亿',\r\n trillion: '兆'\r\n },\r\n ordinal: function (number) {\r\n return '.';\r\n },\r\n currency: {\r\n symbol: '¥'\r\n }\r\n });\r\n})();\r\n\r\n\r\n(function() {\r\n numeral.register('locale', 'cs', {\r\n delimiters: {\r\n thousands: ' ',\r\n decimal: ','\r\n },\r\n abbreviations: {\r\n thousand: 'tis.',\r\n million: 'mil.',\r\n billion: 'b',\r\n trillion: 't'\r\n },\r\n ordinal: function () {\r\n return '.';\r\n },\r\n currency: {\r\n symbol: 'Kč'\r\n }\r\n });\r\n})();\r\n\r\n\r\n(function() {\r\n numeral.register('locale', 'da-dk', {\r\n delimiters: {\r\n thousands: '.',\r\n decimal: ','\r\n },\r\n abbreviations: {\r\n thousand: 'k',\r\n million: 'mio',\r\n billion: 'mia',\r\n trillion: 'b'\r\n },\r\n ordinal: function (number) {\r\n return '.';\r\n },\r\n currency: {\r\n symbol: 'DKK'\r\n }\r\n });\r\n})();\r\n\r\n\r\n(function() {\r\n numeral.register('locale', 'de-ch', {\r\n delimiters: {\r\n thousands: ' ',\r\n decimal: ','\r\n },\r\n abbreviations: {\r\n thousand: 'k',\r\n million: 'm',\r\n billion: 'b',\r\n trillion: 't'\r\n },\r\n ordinal: function (number) {\r\n return '.';\r\n },\r\n currency: {\r\n symbol: 'CHF'\r\n }\r\n });\r\n})();\r\n\r\n\r\n(function() {\r\n numeral.register('locale', 'de', {\r\n delimiters: {\r\n thousands: ' ',\r\n decimal: ','\r\n },\r\n abbreviations: {\r\n thousand: 'k',\r\n million: 'm',\r\n billion: 'b',\r\n trillion: 't'\r\n },\r\n ordinal: function (number) {\r\n return '.';\r\n },\r\n currency: {\r\n symbol: '€'\r\n }\r\n });\r\n})();\r\n\r\n\r\n(function() {\r\n numeral.register('locale', 'en-au', {\r\n delimiters: {\r\n thousands: ',',\r\n decimal: '.'\r\n },\r\n abbreviations: {\r\n thousand: 'k',\r\n million: 'm',\r\n billion: 'b',\r\n trillion: 't'\r\n },\r\n ordinal: function (number) {\r\n var b = number % 10;\r\n return (~~ (number % 100 / 10) === 1) ? 'th' :\r\n (b === 1) ? 'st' :\r\n (b === 2) ? 'nd' :\r\n (b === 3) ? 'rd' : 'th';\r\n },\r\n currency: {\r\n symbol: '$'\r\n }\r\n });\r\n})();\r\n\r\n\r\n(function() {\r\n numeral.register('locale', 'en-gb', {\r\n delimiters: {\r\n thousands: ',',\r\n decimal: '.'\r\n },\r\n abbreviations: {\r\n thousand: 'k',\r\n million: 'm',\r\n billion: 'b',\r\n trillion: 't'\r\n },\r\n ordinal: function (number) {\r\n var b = number % 10;\r\n return (~~ (number % 100 / 10) === 1) ? 'th' :\r\n (b === 1) ? 'st' :\r\n (b === 2) ? 'nd' :\r\n (b === 3) ? 'rd' : 'th';\r\n },\r\n currency: {\r\n symbol: '£'\r\n }\r\n });\r\n})();\r\n\r\n\r\n(function() {\r\n numeral.register('locale', 'en-za', {\r\n delimiters: {\r\n thousands: ' ',\r\n decimal: ','\r\n },\r\n abbreviations: {\r\n thousand: 'k',\r\n million: 'm',\r\n billion: 'b',\r\n trillion: 't'\r\n },\r\n ordinal: function (number) {\r\n var b = number % 10;\r\n return (~~ (number % 100 / 10) === 1) ? 'th' :\r\n (b === 1) ? 'st' :\r\n (b === 2) ? 'nd' :\r\n (b === 3) ? 'rd' : 'th';\r\n },\r\n currency: {\r\n symbol: 'R'\r\n }\r\n });\r\n})();\r\n\r\n\r\n(function() {\r\n numeral.register('locale', 'es-es', {\r\n delimiters: {\r\n thousands: '.',\r\n decimal: ','\r\n },\r\n abbreviations: {\r\n thousand: 'k',\r\n million: 'mm',\r\n billion: 'b',\r\n trillion: 't'\r\n },\r\n ordinal: function (number) {\r\n var b = number % 10;\r\n return (b === 1 || b === 3) ? 'er' :\r\n (b === 2) ? 'do' :\r\n (b === 7 || b === 0) ? 'mo' :\r\n (b === 8) ? 'vo' :\r\n (b === 9) ? 'no' : 'to';\r\n },\r\n currency: {\r\n symbol: '€'\r\n }\r\n });\r\n})();\r\n\r\n\r\n(function() {\r\n numeral.register('locale', 'es', {\r\n delimiters: {\r\n thousands: '.',\r\n decimal: ','\r\n },\r\n abbreviations: {\r\n thousand: 'k',\r\n million: 'mm',\r\n billion: 'b',\r\n trillion: 't'\r\n },\r\n ordinal: function (number) {\r\n var b = number % 10;\r\n return (b === 1 || b === 3) ? 'er' :\r\n (b === 2) ? 'do' :\r\n (b === 7 || b === 0) ? 'mo' :\r\n\t\t(b === 8) ? 'vo' :\r\n\t\t(b === 9) ? 'no' : 'to';\r\n },\r\n currency: {\r\n symbol: '$'\r\n }\r\n });\r\n})();\r\n\r\n\r\n(function() {\r\n numeral.register('locale', 'et', {\r\n delimiters: {\r\n thousands: ' ',\r\n decimal: ','\r\n },\r\n abbreviations: {\r\n thousand: ' tuh',\r\n million: ' mln',\r\n billion: ' mld',\r\n trillion: ' trl'\r\n },\r\n ordinal: function (number) {\r\n return '.';\r\n },\r\n currency: {\r\n symbol: '€'\r\n }\r\n });\r\n})();\r\n\r\n\r\n(function() {\r\n numeral.register('locale', 'fi', {\r\n delimiters: {\r\n thousands: ' ',\r\n decimal: ','\r\n },\r\n abbreviations: {\r\n thousand: 'k',\r\n million: 'M',\r\n billion: 'G',\r\n trillion: 'T'\r\n },\r\n ordinal: function (number) {\r\n return '.';\r\n },\r\n currency: {\r\n symbol: '€'\r\n }\r\n });\r\n})();\r\n\r\n\r\n(function() {\r\n numeral.register('locale', 'fr-ca', {\r\n delimiters: {\r\n thousands: ' ',\r\n decimal: ','\r\n },\r\n abbreviations: {\r\n thousand: 'k',\r\n million: 'M',\r\n billion: 'G',\r\n trillion: 'T'\r\n },\r\n ordinal : function (number) {\r\n return number === 1 ? 'er' : 'e';\r\n },\r\n currency: {\r\n symbol: '$'\r\n }\r\n });\r\n})();\r\n\r\n\r\n(function() {\r\n numeral.register('locale', 'fr-ch', {\r\n delimiters: {\r\n thousands: '\\'',\r\n decimal: '.'\r\n },\r\n abbreviations: {\r\n thousand: 'k',\r\n million: 'm',\r\n billion: 'b',\r\n trillion: 't'\r\n },\r\n ordinal : function (number) {\r\n return number === 1 ? 'er' : 'e';\r\n },\r\n currency: {\r\n symbol: 'CHF'\r\n }\r\n });\r\n})();\r\n\r\n\r\n(function() {\r\n numeral.register('locale', 'fr', {\r\n delimiters: {\r\n thousands: ' ',\r\n decimal: ','\r\n },\r\n abbreviations: {\r\n thousand: 'k',\r\n million: 'm',\r\n billion: 'b',\r\n trillion: 't'\r\n },\r\n ordinal : function (number) {\r\n return number === 1 ? 'er' : 'e';\r\n },\r\n currency: {\r\n symbol: '€'\r\n }\r\n });\r\n})();\r\n\r\n\r\n(function() {\r\n numeral.register('locale', 'hu', {\r\n delimiters: {\r\n thousands: ' ',\r\n decimal: ','\r\n },\r\n abbreviations: {\r\n thousand: 'E', // ezer\r\n million: 'M', // millió\r\n billion: 'Mrd', // milliárd\r\n trillion: 'T' // trillió\r\n },\r\n ordinal: function (number) {\r\n return '.';\r\n },\r\n currency: {\r\n symbol: ' Ft'\r\n }\r\n });\r\n})();\r\n\r\n\r\n(function() {\r\n numeral.register('locale', 'it', {\r\n delimiters: {\r\n thousands: '.',\r\n decimal: ','\r\n },\r\n abbreviations: {\r\n thousand: 'mila',\r\n million: 'mil',\r\n billion: 'b',\r\n trillion: 't'\r\n },\r\n ordinal: function (number) {\r\n return 'º';\r\n },\r\n currency: {\r\n symbol: '€'\r\n }\r\n });\r\n})();\r\n\r\n\r\n(function() {\r\n numeral.register('locale', 'ja', {\r\n delimiters: {\r\n thousands: ',',\r\n decimal: '.'\r\n },\r\n abbreviations: {\r\n thousand: '千',\r\n million: '百万',\r\n billion: '十億',\r\n trillion: '兆'\r\n },\r\n ordinal: function (number) {\r\n return '.';\r\n },\r\n currency: {\r\n symbol: '¥'\r\n }\r\n });\r\n})();\r\n\r\n\r\n(function() {\r\n numeral.register('locale', 'lv', {\r\n delimiters: {\r\n thousands: ' ',\r\n decimal: ','\r\n },\r\n abbreviations: {\r\n thousand: ' tūkst.',\r\n million: ' milj.',\r\n billion: ' mljrd.',\r\n trillion: ' trilj.'\r\n },\r\n ordinal: function (number) {\r\n return '.';\r\n },\r\n currency: {\r\n symbol: '€'\r\n }\r\n });\r\n})();\r\n\r\n\r\n(function() {\r\n numeral.register('locale', 'nl-be', {\r\n delimiters: {\r\n thousands: ' ',\r\n decimal : ','\r\n },\r\n abbreviations: {\r\n thousand : 'k',\r\n million : ' mln',\r\n billion : ' mld',\r\n trillion : ' bln'\r\n },\r\n ordinal : function (number) {\r\n var remainder = number % 100;\r\n\r\n return (number !== 0 && remainder <= 1 || remainder === 8 || remainder >= 20) ? 'ste' : 'de';\r\n },\r\n currency: {\r\n symbol: '€ '\r\n }\r\n });\r\n})();\r\n\r\n\r\n(function() {\r\n numeral.register('locale', 'nl-nl', {\r\n delimiters: {\r\n thousands: '.',\r\n decimal : ','\r\n },\r\n abbreviations: {\r\n thousand : 'k',\r\n million : 'mln',\r\n billion : 'mrd',\r\n trillion : 'bln'\r\n },\r\n ordinal : function (number) {\r\n var remainder = number % 100;\r\n return (number !== 0 && remainder <= 1 || remainder === 8 || remainder >= 20) ? 'ste' : 'de';\r\n },\r\n currency: {\r\n symbol: '€ '\r\n }\r\n });\r\n})();\r\n\r\n\r\n(function() {\r\n numeral.register('locale', 'no', {\r\n delimiters: {\r\n thousands: ' ',\r\n decimal: ','\r\n },\r\n abbreviations: {\r\n thousand: 'k',\r\n million: 'm',\r\n billion: 'b',\r\n trillion: 't'\r\n },\r\n ordinal: function (number) {\r\n return '.';\r\n },\r\n currency: {\r\n symbol: 'kr'\r\n }\r\n });\r\n})();\r\n\r\n\r\n(function() {\r\n numeral.register('locale', 'pl', {\r\n delimiters: {\r\n thousands: ' ',\r\n decimal: ','\r\n },\r\n abbreviations: {\r\n thousand: 'tys.',\r\n million: 'mln',\r\n billion: 'mld',\r\n trillion: 'bln'\r\n },\r\n ordinal: function (number) {\r\n return '.';\r\n },\r\n currency: {\r\n symbol: 'PLN'\r\n }\r\n });\r\n})();\r\n\r\n\r\n(function() {\r\n numeral.register('locale', 'pt-br', {\r\n delimiters: {\r\n thousands: '.',\r\n decimal: ','\r\n },\r\n abbreviations: {\r\n thousand: 'mil',\r\n million: 'milhões',\r\n billion: 'b',\r\n trillion: 't'\r\n },\r\n ordinal: function (number) {\r\n return 'º';\r\n },\r\n currency: {\r\n symbol: 'R$'\r\n }\r\n });\r\n})();\r\n\r\n\r\n(function() {\r\n numeral.register('locale', 'pt-pt', {\r\n delimiters: {\r\n thousands: ' ',\r\n decimal: ','\r\n },\r\n abbreviations: {\r\n thousand: 'k',\r\n million: 'm',\r\n billion: 'b',\r\n trillion: 't'\r\n },\r\n ordinal : function (number) {\r\n return 'º';\r\n },\r\n currency: {\r\n symbol: '€'\r\n }\r\n });\r\n})();\r\n\r\n\r\n(function() {\r\n numeral.register('locale', 'ru-ua', {\r\n delimiters: {\r\n thousands: ' ',\r\n decimal: ','\r\n },\r\n abbreviations: {\r\n thousand: 'тыс.',\r\n million: 'млн',\r\n billion: 'b',\r\n trillion: 't'\r\n },\r\n ordinal: function () {\r\n // not ideal, but since in Russian it can taken on\r\n // different forms (masculine, feminine, neuter)\r\n // this is all we can do\r\n return '.';\r\n },\r\n currency: {\r\n symbol: '\\u20B4'\r\n }\r\n });\r\n})();\r\n\r\n\r\n(function() {\r\n numeral.register('locale', 'ru', {\r\n delimiters: {\r\n thousands: ' ',\r\n decimal: ','\r\n },\r\n abbreviations: {\r\n thousand: 'тыс.',\r\n million: 'млн.',\r\n billion: 'млрд.',\r\n trillion: 'трлн.'\r\n },\r\n ordinal: function () {\r\n // not ideal, but since in Russian it can taken on\r\n // different forms (masculine, feminine, neuter)\r\n // this is all we can do\r\n return '.';\r\n },\r\n currency: {\r\n symbol: 'руб.'\r\n }\r\n });\r\n})();\r\n\r\n\r\n(function() {\r\n numeral.register('locale', 'sk', {\r\n delimiters: {\r\n thousands: ' ',\r\n decimal: ','\r\n },\r\n abbreviations: {\r\n thousand: 'tis.',\r\n million: 'mil.',\r\n billion: 'b',\r\n trillion: 't'\r\n },\r\n ordinal: function () {\r\n return '.';\r\n },\r\n currency: {\r\n symbol: '€'\r\n }\r\n });\r\n})();\r\n\r\n\r\n(function() {\r\n numeral.register('locale', 'sl', {\r\n delimiters: {\r\n thousands: '.',\r\n decimal: ','\r\n },\r\n abbreviations: {\r\n thousand: 'k',\r\n million: 'mio',\r\n billion: 'mrd',\r\n trillion: 'trilijon'\r\n },\r\n ordinal: function () {\r\n return '.';\r\n },\r\n currency: {\r\n symbol: '€'\r\n }\r\n });\r\n})();\r\n\r\n\r\n(function() {\r\n \r\n\r\n numeral.register('locale', 'th', {\r\n delimiters: {\r\n thousands: ',',\r\n decimal: '.'\r\n },\r\n abbreviations: {\r\n thousand: 'พัน',\r\n million: 'ล้าน',\r\n billion: 'พันล้าน',\r\n trillion: 'ล้านล้าน'\r\n },\r\n ordinal: function (number) {\r\n return '.';\r\n },\r\n currency: {\r\n symbol: '฿'\r\n }\r\n });\r\n})();\r\n\r\n\r\n(function() {\r\n var suffixes = {\r\n 1: '\\'inci',\r\n 5: '\\'inci',\r\n 8: '\\'inci',\r\n 70: '\\'inci',\r\n 80: '\\'inci',\r\n\r\n 2: '\\'nci',\r\n 7: '\\'nci',\r\n 20: '\\'nci',\r\n 50: '\\'nci',\r\n\r\n 3: '\\'üncü',\r\n 4: '\\'üncü',\r\n 100: '\\'üncü',\r\n\r\n 6: '\\'ncı',\r\n\r\n 9: '\\'uncu',\r\n 10: '\\'uncu',\r\n 30: '\\'uncu',\r\n\r\n 60: '\\'ıncı',\r\n 90: '\\'ıncı'\r\n };\r\n\r\n numeral.register('locale', 'tr', {\r\n delimiters: {\r\n thousands: '.',\r\n decimal: ','\r\n },\r\n abbreviations: {\r\n thousand: 'bin',\r\n million: 'milyon',\r\n billion: 'milyar',\r\n trillion: 'trilyon'\r\n },\r\n ordinal: function (number) {\r\n if (number === 0) { // special case for zero\r\n return '\\'ıncı';\r\n }\r\n\r\n var a = number % 10,\r\n b = number % 100 - a,\r\n c = number >= 100 ? 100 : null;\r\n\r\n return suffixes[a] || suffixes[b] || suffixes[c];\r\n },\r\n currency: {\r\n symbol: '\\u20BA'\r\n }\r\n });\r\n})();\r\n\r\n\r\n(function() {\r\n numeral.register('locale', 'uk-ua', {\r\n delimiters: {\r\n thousands: ' ',\r\n decimal: ','\r\n },\r\n abbreviations: {\r\n thousand: 'тис.',\r\n million: 'млн',\r\n billion: 'млрд',\r\n trillion: 'блн'\r\n },\r\n ordinal: function () {\r\n // not ideal, but since in Ukrainian it can taken on\r\n // different forms (masculine, feminine, neuter)\r\n // this is all we can do\r\n return '';\r\n },\r\n currency: {\r\n symbol: '\\u20B4'\r\n }\r\n });\r\n})();\r\n\r\n\r\n(function() {\r\n \r\n numeral.register('locale', 'vi', {\r\n delimiters: {\r\n thousands: '.',\r\n decimal: ','\r\n },\r\n abbreviations: {\r\n thousand: ' nghìn',\r\n million: ' triệu',\r\n billion: ' tỷ',\r\n trillion: ' nghìn tỷ'\r\n },\r\n ordinal: function () {\r\n return '.';\r\n },\r\n currency: {\r\n symbol: '₫'\r\n }\r\n });\r\n})();\r\n\r\n\r\n}));\r\n\n/// Knockout Mapping plugin v2.4.0\r\n/// (c) 2013 Steven Sanderson, Roy Jacobs - http://knockoutjs.com/\r\n/// License: MIT (http://www.opensource.org/licenses/mit-license.php)\r\n(function (factory) {\r\n\t// Module systems magic dance.\r\n\r\n\tif (typeof require === \"function\" && typeof exports === \"object\" && typeof module === \"object\") {\r\n\t\t// CommonJS or Node: hard-coded dependency on \"knockout\"\r\n\t\tfactory(require(\"knockout\"), exports);\r\n\t} else if (typeof define === \"function\" && define[\"amd\"]) {\r\n\t\t// AMD anonymous module with hard-coded dependency on \"knockout\"\r\n\t\tdefine([\"knockout\", \"exports\"], factory);\r\n\t} else {\r\n\t\t//