This is an automated email from the git hooks/post-receive script. New commit to branch feature/fix_ftl_datasource in repository observe. See https://gitlab.nuiton.org/codelutin/observe.git commit 53c33caa5787086b61b81654ca35feb64231557f Author: Samuel Maisonneuve <maisonneuve@codelutin.com> Date: Thu Sep 1 17:34:57 2016 +0200 Ajoute les templates traduits en anglais pour les wizzards de source de données (+ quelques corrections en français) fixes #8486 --- .../main/resources/ftl/connexionTestResult_en.ftl | 44 ++++++++ ...rt_fr.ftl => dataSourceConnectionReport_en.ftl} | 114 ++++++++++----------- .../ftl/dataSourceConnectionReport_fr.ftl | 6 +- .../resources/ftl/dataSourceInformation_en.ftl | 77 ++++++++++++++ .../src/main/resources/ftl/dataSourcePolicy_en.ftl | 53 ++++++++++ .../ftl/dataSourceSelectModeResume_en.ftl | 61 +++++++++++ .../ftl/storageModelDataSourceConfiguration_en.ftl | 76 ++++++++++++++ 7 files changed, 371 insertions(+), 60 deletions(-) diff --git a/application-swing/src/main/resources/ftl/connexionTestResult_en.ftl b/application-swing/src/main/resources/ftl/connexionTestResult_en.ftl new file mode 100644 index 0000000..0391e0e --- /dev/null +++ b/application-swing/src/main/resources/ftl/connexionTestResult_en.ftl @@ -0,0 +1,44 @@ +<#-- + #%L + ObServe :: Application Swing + %% + Copyright (C) 2008 - 2016 IRD, Codelutin, Tony Chemit + %% + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as + published by the Free Software Foundation, either version 3 of the + License, or (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public + License along with this program. If not, see + <http://www.gnu.org/licenses/gpl-3.0.html>. + #L% +--> +<html> +<body> + <#if connexionStatus.name() == "UNTESTED"> + + <h3>The connection is not valid or has been modified since the last connection test.</h3> + + <#elseif connexionStatus.name() == "FAILED"> + + <h3>the connection failed for the following reason :</h3> + + <ul> + <li>${connexionStatusError}</li> + </ul> + + <#elseif connexionStatus.name() == "SUCCESS"> + + Connection information : + <#import "storageModelDataSourceConfiguration_fr.ftl" as storageInfo> + <@storageInfo.storageModelDataSourceInformation storageModel=.data_model /> + + </#if> +</body> +</html> diff --git a/application-swing/src/main/resources/ftl/dataSourceConnectionReport_fr.ftl b/application-swing/src/main/resources/ftl/dataSourceConnectionReport_en.ftl similarity index 66% copy from application-swing/src/main/resources/ftl/dataSourceConnectionReport_fr.ftl copy to application-swing/src/main/resources/ftl/dataSourceConnectionReport_en.ftl index 99c8902..dd335f3 100644 --- a/application-swing/src/main/resources/ftl/dataSourceConnectionReport_fr.ftl +++ b/application-swing/src/main/resources/ftl/dataSourceConnectionReport_en.ftl @@ -26,18 +26,18 @@ <h2> <#if local> - Sauvegarde de la base locale + Local database backup <#elseif remote> - Sauvegarde de la base distante + Remote database backup <#elseif server> - Sauvegarde du serveur + Server backup </#if> </h2> <hr/> <h3> - Emplacement de la sauvegarde : + Backup location : <ul> <li>${backupFile.absolutePath}</li> </ul> @@ -45,29 +45,29 @@ <#if useSelectData && selectDataModel??> - <h3>Données à exporter :</h3> + <h3>Data to export :</h3> <ul> <li> <#if selectDataModel.isDataEmpty()> - Pas de données observateur à exporter + No data to export <#elseif selectDataModel.isDataFull()> - Toutes les données observateur sont à exporter + All observed data have to be exported (<#if selectDataModel.selectDataSize() == 1> - 1 marée + 1 trip <#else> - ${selectDataModel.selectDataSize()} marées + ${selectDataModel.selectDataSize()} trips </#if>). <#else> <#if selectDataModel.selectDataSize() == 1> - 1 marée + 1 trip <#else> - ${selectDataModel.selectDataSize()} marées + ${selectDataModel.selectDataSize()} trips </#if> à exporter @@ -103,7 +103,7 @@ </li> - <li>Le référentiel sera exporté</li> + <li>The referential will be exported</li> </ul> </#if> @@ -112,10 +112,10 @@ <#if dbMode.name() == "USE_LOCAL"> - <h2>Connection à la base locale</h2> + <h2>Connection to the local database</h2> <hr/> - <h3>Emplacement de la base locale :</h3> + <h3>Local database location:</h3> <ul> <li>${h2Config.directory.absolutePath}</li> @@ -125,20 +125,20 @@ <#if doBackup> - <h2>Sauvegarde de la base locale</h2> + <h2>Local database backup</h2> <hr/> - <h3>Emplacement de la sauvegarde :</h3> + <h3>Backup location :</h3> <ul> <li>${backupFile.absolutePath}</li> </ul> </#if> - <h2>Création de la base locale</h2> + <h2>Local database creation</h2> <hr/> <#if creationMode.name() == "IMPORT_INTERNAL_DUMP"> - <h3>Import depuis une le dernier référentiel téléchargé :</h3> + <h3>Referential Import from the last imported referential :</h3> <ul> <li>${initialDbDump.absolutePath}</li> @@ -146,7 +146,7 @@ <#elseif creationMode.name() == "IMPORT_EXTERNAL_DUMP"> - <h3>Import depuis une sauvegarde :</h3> + <h3>Backup import :</h3> <ul> <li>${dumpFile.absolutePath}</li> @@ -154,13 +154,13 @@ <#elseif creationMode.name() == "IMPORT_REMOTE_STORAGE"> - <h3>Import du référentiel depuis une base distante :</h3> + <h3>Referential import from a remote database :</h3> <@storageInfo.storageModelDataSourceInformation storageModel=.data_model /> <#elseif creationMode.name() == "IMPORT_SERVER_STORAGE"> - <h3>Import du référentiel depuis un serveur distant :</h3> + <h3>Referential import from a remote server :</h3> <@storageInfo.storageModelDataSourceInformation storageModel=.data_model /> @@ -170,10 +170,10 @@ <#elseif dbMode.name() == "USE_REMOTE"> <#if !adminAction??> - <h2>Connexion à une base distante</h2> + <h2>Remote database connection</h2> <hr/> - <h3>Informations sur la base distante à utiliser :</h3> + <h3>Remote database informations :</h3> <@storageInfo.storageModelDataSourceInformation storageModel=.data_model /> @@ -182,7 +182,7 @@ <h2>${adminActionLabel}</h2> <hr/> - <h3>Informations sur la connexion distance à utiliser :</h3> + <h3>Remote connection informations :</h3> <@storageInfo.storageModelDataSourceInformation storageModel=.data_model /> @@ -192,7 +192,7 @@ <#if referentielImportMode.name() == "IMPORT_EXTERNAL_DUMP"> - <h3>Import du référentiel depuis une sauvegarde :</h3> + <h3>Referential import from a backup :</h3> <ul> <li>${centralSourceModel.dumpFile.absolutePath}</li> @@ -200,27 +200,27 @@ <#elseif referentielImportMode.name() == "IMPORT_REMOTE_STORAGE"> - <h3>Import du référentiel depuis une base distante :</h3> + <h3>Referential import from a remote database :</h3> <@storageInfo.storageModelDataSourceInformation storageModel=centralSourceModel /> <#elseif referentielImportMode.name() == "IMPORT_SERVER_STORAGE"> - <h3>Import du référentiel depuis un serveur distant :</h3> + <h3>Referential import from a remote server :</h3> <@storageInfo.storageModelDataSourceInformation storageModel=centralSourceModel /> </#if> <#else> - <h3>Pas d'import de référentiel</h3> + <h3>No referential import</h3> </#if> <#if importData> <#if dataImportMode.name() == "IMPORT_EXTERNAL_DUMP"> - <h3>Import de données depuis une sauvegarde :</h3> + <h3>Data import from a backup :</h3> <ul> <li>${dataSourceModel.dumpFile.absolutePath}</li> @@ -228,31 +228,31 @@ <#elseif dataImportMode.name() == "IMPORT_REMOTE_STORAGE"> - <h3>Import de données depuis une base distante :</h3> + <h3>Data import from a remote database :</h3> <@storageInfo.storageModelDataSourceInformation storageModel=dataSourceModel /> <#elseif dataImportMode.name() == "IMPORT_SERVER_STORAGE"> - <h3>Import de données depuis un serveur distant :</h3> + <h3>Data import from a remote server :</h3> <@storageInfo.storageModelDataSourceInformation storageModel=dataSourceModel /> </#if> <#else> - <h3>Pas d'import de données</h3> + <h3>No data import</h3> </#if> </#if> - <h3>Sécurité</h3> + <h3>Security</h3> <ul> - <li><strong>Propriétaire : </strong>${securityModel.administrateur.name}</li> - <li><strong>Techniciens : </strong>${securityModel.technicalUserNames?join(", ")}</li> - <li><strong>Lecteurs : </strong>${securityModel.dataUserNames?join(", ")}</li> - <li><strong>Référentiels : </strong>${securityModel.referentialUserNames?join(", ")}</li> + <li><strong>Owner : </strong>${securityModel.administrateur.name}</li> + <li><strong>Technicians : </strong>${securityModel.technicalUserNames?join(", ")}</li> + <li><strong>Readers : </strong>${securityModel.dataUserNames?join(", ")}</li> + <li><strong>Referentials : </strong>${securityModel.referentialUserNames?join(", ")}</li> </ul> @@ -261,10 +261,10 @@ <#elseif dbMode.name() == "USE_SERVER"> <#if !adminAction??> - <h2>Connexion à un serveur distant</h2> + <h2>Remote server connection</h2> <hr/> - <h3>Informations sur le serveur connexion distant à utiliser :</h3> + <h3>Remote server informations :</h3> <@storageInfo.storageModelDataSourceInformation storageModel=.data_model /> @@ -273,7 +273,7 @@ <h2>${adminAction.label}</h2> <hr/> - <h3>Informations sur le serveur connexion distant à utiliser :</h3> + <h3>Remote server informations :</h3> <@storageInfo.storageModelDataSourceInformation storageModel=.data_model /> @@ -283,7 +283,7 @@ <#if referentielImportMode.name() == "IMPORT_EXTERNAL_DUMP"> - <h3>Import du référentiel depuis une sauvegarde :</h3> + <h3>Referential import from a backup :</h3> <ul> <li>${centralSourceModel.dumpFile.absolutePath}</li> @@ -291,27 +291,27 @@ <#elseif referentielImportMode.name() == "IMPORT_REMOTE_STORAGE"> - <h3>Import du référentiel depuis une base distante :</h3> + <h3>Referential import from a remote database :</h3> <@storageInfo.storageModelDataSourceInformation storageModel=centralSourceModel /> <#elseif referentielImportMode.name() == "IMPORT_SERVER_STORAGE"> - <h3>Import du référentiel depuis un serveur distant :</h3> + <h3>Referential import from a remote server :</h3> <@storageInfo.storageModelDataSourceInformation storageModel=centralSourceModel /> </#if> <#else> - <h3>Pas d'import de référentiel</h3> + <h3>No referential import</h3> </#if> <#if importData> <#if referentielImportMode.name() == "IMPORT_EXTERNAL_DUMP"> - <h3>Import du référentiel depuis une sauvegarde :</h3> + <h3>Referential import from a backup :</h3> <ul> <li>${centralSourceModel.dumpFile.absolutePath}</li> @@ -319,20 +319,20 @@ <#elseif referentielImportMode.name() == "IMPORT_REMOTE_STORAGE"> - <h3>Import du référentiel depuis une base distante :</h3> + <h3>Referential import from a remote database :</h3> <@storageInfo.storageModelDataSourceInformation storageModel=centralSourceModel /> <#elseif referentielImportMode.name() == "IMPORT_SERVER_STORAGE"> - <h3>Import du référentiel depuis un serveur distant :</h3> + <h3>Referential import from a remote server :</h3> <@storageInfo.storageModelDataSourceInformation storageModel=centralSourceModel /> </#if> <#else> - <h3>Pas d'import de données</h3> + <h3>No data import</h3> </#if> @@ -340,39 +340,39 @@ <h3>Sécurité</h3> <ul> - <li><strong>Propriétaire : </strong>${securityModel.administrateur.name}</li> - <li><strong>Techniciens : </strong>${securityModel.technicalUserNames?join(", ")}</li> - <li><strong>Lecteurs : </strong>${securityModel.dataUserNames?join(", ")}</li> - <li><strong>Référentiels : </strong>${securityModel.referentialUserNames?join(", ")}</li> + <li><strong>Owner : </strong>${securityModel.administrateur.name}</li> + <li><strong>Technicians : </strong>${securityModel.technicalUserNames?join(", ")}</li> + <li><strong>Readers : </strong>${securityModel.dataUserNames?join(", ")}</li> + <li><strong>Referentials : </strong>${securityModel.referentialUserNames?join(", ")}</li> </ul> </#if> </#if> - <h3>Politique de mise à jour</h3> + <h3>Update policy</h3> <ul> <#if canMigrate> - <li>Mise à jour si nécessaire (version actuelle : ${modelVersion})</li> + <li>Update if required (actual version : ${modelVersion})</li> <#if showMigrationProgression> - <li>Afficher la progression lors des mises à jour</li> + <li>Show update progression</li> </#if> <#if showMigrationSql> - <li>Afficher les requêtes sql lors des mises à jour</li> + <li>Show sql update queries</li> </#if> <#else> - <li>Pas de mise à jour possible</li> + <li>No update available</li> </#if> diff --git a/application-swing/src/main/resources/ftl/dataSourceConnectionReport_fr.ftl b/application-swing/src/main/resources/ftl/dataSourceConnectionReport_fr.ftl index 99c8902..b2895de 100644 --- a/application-swing/src/main/resources/ftl/dataSourceConnectionReport_fr.ftl +++ b/application-swing/src/main/resources/ftl/dataSourceConnectionReport_fr.ftl @@ -138,7 +138,7 @@ <hr/> <#if creationMode.name() == "IMPORT_INTERNAL_DUMP"> - <h3>Import depuis une le dernier référentiel téléchargé :</h3> + <h3>Import depuis le dernier référentiel téléchargé :</h3> <ul> <li>${initialDbDump.absolutePath}</li> @@ -264,7 +264,7 @@ <h2>Connexion à un serveur distant</h2> <hr/> - <h3>Informations sur le serveur connexion distant à utiliser :</h3> + <h3>Informations sur le serveur distant à utiliser :</h3> <@storageInfo.storageModelDataSourceInformation storageModel=.data_model /> @@ -273,7 +273,7 @@ <h2>${adminAction.label}</h2> <hr/> - <h3>Informations sur le serveur connexion distant à utiliser :</h3> + <h3>Informations sur le serveur distant à utiliser :</h3> <@storageInfo.storageModelDataSourceInformation storageModel=.data_model /> diff --git a/application-swing/src/main/resources/ftl/dataSourceInformation_en.ftl b/application-swing/src/main/resources/ftl/dataSourceInformation_en.ftl new file mode 100644 index 0000000..5cf99dd --- /dev/null +++ b/application-swing/src/main/resources/ftl/dataSourceInformation_en.ftl @@ -0,0 +1,77 @@ +<#-- + #%L + ObServe :: Application Swing + %% + Copyright (C) 2008 - 2016 IRD, Codelutin, Tony Chemit + %% + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as + published by the Free Software Foundation, either version 3 of the + License, or (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public + License along with this program. If not, see + <http://www.gnu.org/licenses/gpl-3.0.html>. + #L% +--> +<html> +<body> + +<#if configuration??> + <h3>${label}</h3> + <ul> + <#if isSqlDataSource() > + <#if configuration.h2Database??> + <li><strong>User : </strong>${configuration.username}</li> + <#elseif configuration.postgresDatabase??> + <li><strong>Jdbc url : </strong>${configuration.jdbcUrl}</li> + <li><strong>User : </strong>${configuration.username}</li> + <li><strong>SSL mode : </strong>${configuration.useSsl?then('Yes', 'No')}</li> + </#if> + <#else> + <li><strong>Server url : </strong>${configuration.serverUrl}</li> + <li><strong>User : </strong>${configuration.login}</li> + <#if configuration.optionalDatabaseName.present> + <li><strong>Database : </strong>${configuration.optionalDatabaseName.get()}</li> + </#if> + </#if> + </ul> + <h3>Rights</h3> + <li><strong>Referential : </strong> + <#if canReadReferential() > + Read + <#if canWriteReferential() > + / Write + </#if> + <#elseif canWriteReferential()> + Write + <#else> + No rights + </#if> + </li> + <li><strong>Données observateur : </strong> + <#if canReadData() > + Read + <#if canWriteData() > + / Write + </#if> + <#elseif canWriteData() > + Write + <#else> + No rights + </#if> + </li> + </ul> + <h3>Version</h3> + v ${connection.version} +<#else> + No datasource has been loaded +</#if> + +</body> +</html> diff --git a/application-swing/src/main/resources/ftl/dataSourcePolicy_en.ftl b/application-swing/src/main/resources/ftl/dataSourcePolicy_en.ftl new file mode 100644 index 0000000..eb18ef8 --- /dev/null +++ b/application-swing/src/main/resources/ftl/dataSourcePolicy_en.ftl @@ -0,0 +1,53 @@ +<#-- + #%L + ObServe :: Application Swing + %% + Copyright (C) 2008 - 2016 IRD, Codelutin, Tony Chemit + %% + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as + published by the Free Software Foundation, either version 3 of the + License, or (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public + License along with this program. If not, see + <http://www.gnu.org/licenses/gpl-3.0.html>. + #L% +--> +<html> +<body> +Droits : + +<strong> • Referential : </strong> +<#if canReadReferential() > + Read + <#if canWriteReferential() > + / Write + </#if> + <#elseif canWriteReferential()> + Write + <#else> + No rights +</#if> + +<strong> • Données observateur : </strong> +<#if canReadData() > + Read + <#if canWriteData() > + / Write + </#if> + <#elseif canWriteData() > + Write + <#else> + No rights +</#if> +<Strong> • Version : </Strong> + v ${version} + +</body> +</html> diff --git a/application-swing/src/main/resources/ftl/dataSourceSelectModeResume_en.ftl b/application-swing/src/main/resources/ftl/dataSourceSelectModeResume_en.ftl new file mode 100644 index 0000000..3a72026 --- /dev/null +++ b/application-swing/src/main/resources/ftl/dataSourceSelectModeResume_en.ftl @@ -0,0 +1,61 @@ +<#-- + #%L + ObServe :: Application Swing + %% + Copyright (C) 2008 - 2016 IRD, Codelutin, Tony Chemit + %% + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as + published by the Free Software Foundation, either version 3 of the + License, or (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public + License along with this program. If not, see + <http://www.gnu.org/licenses/gpl-3.0.html>. + #L% +--> +<html> +<body> + + <h3>Selected datasource type</h3> + + <#if dbMode.name() == "USE_LOCAL"> + Use a h2 local database + <#elseif dbMode.name() == "CREATE_LOCAL"> + Create a h2 local database + <#elseif dbMode.name() == "USE_REMOTE"> + Use a postgres remote database + <#elseif dbMode.name() == "USE_SERVER"> + Use a remote server + <#else> + No datasource type has been selected + </#if> + + <h3>Selected creation mode</h3> + + <#if dbMode.name() == "CREATE_LOCAL"> + <#if !creationMode??> + No creation mode has been selected + <#elseif creationMode.name() == "EMPTY"> + Generate a new empty local database. This database won't have referentials and you will have to import one after that... + <#elseif creationMode.name() == "IMPORT_INTERNAL_DUMP"> + Generate a new local database from the last version of the embedded database. + <#elseif creationMode.name() == "IMPORT_EXTERNAL_DUMP"> + Create a new local database from a previous backup. + <#elseif creationMode.name() == "IMPORT_LOCAL_STORAGE"> + Generate a new local database and import the referentials of another local database in it. + <#elseif creationMode.name() == "IMPORT_REMOTE_STORAGE"> + Generate a new local database and import the referentials of a remote database in it. + <#elseif creationMode.name() == "IMPORT_SERVER_STORAGE"> + Generate a new local database and import the referentials of a remote server in it. + </#if> + <#else> + Not required. + </#if> +</body> +</html> diff --git a/application-swing/src/main/resources/ftl/storageModelDataSourceConfiguration_en.ftl b/application-swing/src/main/resources/ftl/storageModelDataSourceConfiguration_en.ftl new file mode 100644 index 0000000..8261de5 --- /dev/null +++ b/application-swing/src/main/resources/ftl/storageModelDataSourceConfiguration_en.ftl @@ -0,0 +1,76 @@ +<#-- + #%L + ObServe :: Application Swing + %% + Copyright (C) 2008 - 2016 IRD, Codelutin, Tony Chemit + %% + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as + published by the Free Software Foundation, either version 3 of the + License, or (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public + License along with this program. If not, see + <http://www.gnu.org/licenses/gpl-3.0.html>. + #L% +--> +<#macro storageModelDataSourceInformation storageModel> +<#if storageModel??> + <ul> + <#if storageModel.editRemoteConfig> + <li><strong>Jdbc url : </strong>${storageModel.pgConfig.jdbcUrl}</li> + <li><strong>User : </strong>${storageModel.pgConfig.username}</li> + <li><strong>Password : </strong>*****</li> + <li><strong>SSL mode : </strong>${storageModel.pgConfig.useSsl?then('Yes', 'No')}</li> + <#elseif storageModel.editServerConfig> + <li><strong>Server url : </strong>${storageModel.restConfig.serverUrl}</li> + <li><strong>User : </strong>${storageModel.restConfig.login}</li> + <li><strong>Password : </strong>*****</li> + <#if storageModel.restConfig.optionalDatabaseName.present> + <li><strong>Database : </strong>${storageModel.restConfig.optionalDatabaseName.get()}</li> + </#if> + <#else> + <li><strong>User : </strong>${storageModel.h2Config.username}</li> + <li><strong>Password : </strong>*****</li> + </#if> + <li><strong>Rights : </strong> + <ul> + <li> + <em>Referential : </em> + <#if storageModel.dataSourceInformation.canReadReferential() > + Read + <#if storageModel.dataSourceInformation.canWriteReferential() > + / Write + </#if> + <#elseif storageModel.dataSourceInformation.canWriteReferential()> + Write + <#else> + No rights + </#if> + </li> + <li> + <em>Données observateur : </em> + <#if storageModel.dataSourceInformation.canReadData() > + Read + <#if storageModel.dataSourceInformation.canWriteData() > + / Write + </#if> + <#elseif storageModel.dataSourceInformation.canWriteData() > + Write + <#else> + No rights + </#if> + </li> + </ul> + </li> + </ul> + +<#else> + NO STORAGE MODEL +</#if> +</#macro> -- To stop receiving notification emails like this one, please contact codelutin.com SCM administrator <admin+scm@codelutin.com>.