Author: solomax
Date: Thu May  9 19:08:48 2013
New Revision: 1480741

URL: http://svn.apache.org/r1480741
Log:
[OPENMEETINGS-620] Registration dialog is able to register users;
        code clean-up;

Modified:
    
openmeetings/trunk/singlewebapp/src/org/apache/openmeetings/data/user/UserManager.java
    
openmeetings/trunk/singlewebapp/src/org/apache/openmeetings/installation/ImportInitvalues.java
    
openmeetings/trunk/singlewebapp/src/org/apache/openmeetings/persistence/beans/basic/Configuration.java
    
openmeetings/trunk/singlewebapp/src/org/apache/openmeetings/remote/MainService.java
    
openmeetings/trunk/singlewebapp/src/org/apache/openmeetings/utils/UserHelper.java
    
openmeetings/trunk/singlewebapp/src/org/apache/openmeetings/web/components/GeneralUserForm.java
    
openmeetings/trunk/singlewebapp/src/org/apache/openmeetings/web/components/admin/users/UserForm.java
    
openmeetings/trunk/singlewebapp/src/org/apache/openmeetings/web/pages/auth/RegisterDialog.java

Modified: 
openmeetings/trunk/singlewebapp/src/org/apache/openmeetings/data/user/UserManager.java
URL: 
http://svn.apache.org/viewvc/openmeetings/trunk/singlewebapp/src/org/apache/openmeetings/data/user/UserManager.java?rev=1480741&r1=1480740&r2=1480741&view=diff
==============================================================================
--- 
openmeetings/trunk/singlewebapp/src/org/apache/openmeetings/data/user/UserManager.java
 (original)
+++ 
openmeetings/trunk/singlewebapp/src/org/apache/openmeetings/data/user/UserManager.java
 Thu May  9 19:08:48 2013
@@ -20,6 +20,7 @@ package org.apache.openmeetings.data.use
 
 import static 
org.apache.openmeetings.persistence.beans.basic.Configuration.DEFAUT_LANG_KEY;
 import static 
org.apache.openmeetings.persistence.beans.basic.Configuration.FRONTEND_REGISTER_KEY;
+import static 
org.apache.openmeetings.persistence.beans.basic.Configuration.LOGIN_MIN_LENGTH_KEY;
 
 import java.util.Arrays;
 import java.util.Date;
@@ -871,7 +872,7 @@ public class UserManager {
                if (authLevelUtil.checkModLevel(user_level)) {
 
                        Integer userLoginMinimumLength = 
configurationDao.getConfValue(
-                                       "user.login.minimum.length", 
Integer.class, "4");
+                                       LOGIN_MIN_LENGTH_KEY, Integer.class, 
"4");
                        if (userLoginMinimumLength == null) {
                                throw new Exception(
                                                "user.login.minimum.length 
problem");

Modified: 
openmeetings/trunk/singlewebapp/src/org/apache/openmeetings/installation/ImportInitvalues.java
URL: 
http://svn.apache.org/viewvc/openmeetings/trunk/singlewebapp/src/org/apache/openmeetings/installation/ImportInitvalues.java?rev=1480741&r1=1480740&r2=1480741&view=diff
==============================================================================
--- 
openmeetings/trunk/singlewebapp/src/org/apache/openmeetings/installation/ImportInitvalues.java
 (original)
+++ 
openmeetings/trunk/singlewebapp/src/org/apache/openmeetings/installation/ImportInitvalues.java
 Thu May  9 19:08:48 2013
@@ -24,6 +24,7 @@ import static org.apache.openmeetings.pe
 import static 
org.apache.openmeetings.persistence.beans.basic.Configuration.DASHBOARD_SHOW_RSS_KEY;
 import static 
org.apache.openmeetings.persistence.beans.basic.Configuration.DEFAUT_LANG_KEY;
 import static 
org.apache.openmeetings.persistence.beans.basic.Configuration.FRONTEND_REGISTER_KEY;
+import static 
org.apache.openmeetings.persistence.beans.basic.Configuration.LOGIN_MIN_LENGTH_KEY;
 import static 
org.apache.openmeetings.persistence.beans.basic.Configuration.MAX_UPLOAD_SIZE_KEY;
 import static 
org.apache.openmeetings.persistence.beans.basic.Configuration.PASS_MIN_LENGTH_KEY;
 import static 
org.apache.openmeetings.persistence.beans.basic.Configuration.RSS_FEED1_KEY;
@@ -444,7 +445,7 @@ public class ImportInitvalues {
                                                null,
                                                "The number of minutes before 
reminder emails are send. Set to 0 to disable reminder emails");
 
-               configurationDao.add("user.login.minimum.length", ""
+               configurationDao.add(LOGIN_MIN_LENGTH_KEY, ""
                                + InstallationConfig.USER_LOGIN_MINIMUM_LENGTH, 
null,
                                "Number of chars needed in a user login");
 

Modified: 
openmeetings/trunk/singlewebapp/src/org/apache/openmeetings/persistence/beans/basic/Configuration.java
URL: 
http://svn.apache.org/viewvc/openmeetings/trunk/singlewebapp/src/org/apache/openmeetings/persistence/beans/basic/Configuration.java?rev=1480741&r1=1480740&r2=1480741&view=diff
==============================================================================
--- 
openmeetings/trunk/singlewebapp/src/org/apache/openmeetings/persistence/beans/basic/Configuration.java
 (original)
+++ 
openmeetings/trunk/singlewebapp/src/org/apache/openmeetings/persistence/beans/basic/Configuration.java
 Thu May  9 19:08:48 2013
@@ -66,6 +66,7 @@ public class Configuration implements Se
        public static final String RSS_FEED2_KEY = "rss_feed2";
        public static final String FRONTEND_REGISTER_KEY = 
"allow_frontend_register";
        public static final String PASS_MIN_LENGTH_KEY = 
"user.pass.minimum.length";
+       public static final String LOGIN_MIN_LENGTH_KEY = 
"user.login.minimum.length";
 
        @Id
        @GeneratedValue(strategy = GenerationType.IDENTITY)

Modified: 
openmeetings/trunk/singlewebapp/src/org/apache/openmeetings/remote/MainService.java
URL: 
http://svn.apache.org/viewvc/openmeetings/trunk/singlewebapp/src/org/apache/openmeetings/remote/MainService.java?rev=1480741&r1=1480740&r2=1480741&view=diff
==============================================================================
--- 
openmeetings/trunk/singlewebapp/src/org/apache/openmeetings/remote/MainService.java
 (original)
+++ 
openmeetings/trunk/singlewebapp/src/org/apache/openmeetings/remote/MainService.java
 Thu May  9 19:08:48 2013
@@ -21,6 +21,7 @@ package org.apache.openmeetings.remote;
 import static 
org.apache.openmeetings.persistence.beans.basic.Configuration.DASHBOARD_SHOW_MYROOMS_KEY;
 import static 
org.apache.openmeetings.persistence.beans.basic.Configuration.DASHBOARD_SHOW_RSS_KEY;
 import static 
org.apache.openmeetings.persistence.beans.basic.Configuration.FRONTEND_REGISTER_KEY;
+import static 
org.apache.openmeetings.persistence.beans.basic.Configuration.LOGIN_MIN_LENGTH_KEY;
 import static 
org.apache.openmeetings.persistence.beans.basic.Configuration.MAX_UPLOAD_SIZE_KEY;
 import static 
org.apache.openmeetings.persistence.beans.basic.Configuration.PASS_MIN_LENGTH_KEY;
 
@@ -731,7 +732,7 @@ public class MainService implements IPen
        public List<Configuration> getLoginOptions(String SID) {
                try {
                        return configurationDao.get(FRONTEND_REGISTER_KEY, 
"show.facebook.login",
-                                       "user.login.minimum.length", 
PASS_MIN_LENGTH_KEY, PASS_MIN_LENGTH_KEY,
+                                       LOGIN_MIN_LENGTH_KEY, 
PASS_MIN_LENGTH_KEY, PASS_MIN_LENGTH_KEY,
                                        "ldap_default_id");
                } catch (Exception err) {
                        log.error("[getLoginOptions]", err);

Modified: 
openmeetings/trunk/singlewebapp/src/org/apache/openmeetings/utils/UserHelper.java
URL: 
http://svn.apache.org/viewvc/openmeetings/trunk/singlewebapp/src/org/apache/openmeetings/utils/UserHelper.java?rev=1480741&r1=1480740&r2=1480741&view=diff
==============================================================================
--- 
openmeetings/trunk/singlewebapp/src/org/apache/openmeetings/utils/UserHelper.java
 (original)
+++ 
openmeetings/trunk/singlewebapp/src/org/apache/openmeetings/utils/UserHelper.java
 Thu May  9 19:08:48 2013
@@ -18,12 +18,18 @@
  */
 package org.apache.openmeetings.utils;
 
+import static 
org.apache.openmeetings.installation.InstallationConfig.USER_LOGIN_MINIMUM_LENGTH;
 import static 
org.apache.openmeetings.installation.InstallationConfig.USER_PASSWORD_MINIMUM_LENGTH;
+import static 
org.apache.openmeetings.persistence.beans.basic.Configuration.LOGIN_MIN_LENGTH_KEY;
 import static 
org.apache.openmeetings.persistence.beans.basic.Configuration.PASS_MIN_LENGTH_KEY;
 
 import org.apache.openmeetings.data.basic.dao.ConfigurationDao;
 
 public class UserHelper {
+       public static int getMinLoginLength(ConfigurationDao cfgDao) {
+               return cfgDao.getConfValue(LOGIN_MIN_LENGTH_KEY, Integer.class, 
"" + USER_LOGIN_MINIMUM_LENGTH);
+       }
+       
        public static int getMinPasswdLength(ConfigurationDao cfgDao) {
                return cfgDao.getConfValue(PASS_MIN_LENGTH_KEY, Integer.class, 
"" + USER_PASSWORD_MINIMUM_LENGTH);
        }

Modified: 
openmeetings/trunk/singlewebapp/src/org/apache/openmeetings/web/components/GeneralUserForm.java
URL: 
http://svn.apache.org/viewvc/openmeetings/trunk/singlewebapp/src/org/apache/openmeetings/web/components/GeneralUserForm.java?rev=1480741&r1=1480740&r2=1480741&view=diff
==============================================================================
--- 
openmeetings/trunk/singlewebapp/src/org/apache/openmeetings/web/components/GeneralUserForm.java
 (original)
+++ 
openmeetings/trunk/singlewebapp/src/org/apache/openmeetings/web/components/GeneralUserForm.java
 Thu May  9 19:08:48 2013
@@ -18,6 +18,7 @@
  */
 package org.apache.openmeetings.web.components;
 
+import static org.apache.openmeetings.utils.UserHelper.getMinPasswdLength;
 import static org.apache.openmeetings.web.app.Application.getBean;
 import static org.apache.openmeetings.web.app.WebSession.getLanguage;
 
@@ -25,7 +26,9 @@ import java.util.ArrayList;
 import java.util.List;
 
 import org.apache.openmeetings.data.basic.FieldLanguageDao;
+import org.apache.openmeetings.data.basic.dao.ConfigurationDao;
 import org.apache.openmeetings.data.basic.dao.OmTimeZoneDao;
+import org.apache.openmeetings.data.user.EmailManager;
 import org.apache.openmeetings.data.user.OrganisationManager;
 import org.apache.openmeetings.data.user.dao.SalutationDao;
 import org.apache.openmeetings.data.user.dao.StateDao;
@@ -36,9 +39,11 @@ import org.apache.openmeetings.persisten
 import org.apache.openmeetings.persistence.beans.user.Salutation;
 import org.apache.openmeetings.persistence.beans.user.State;
 import org.apache.openmeetings.persistence.beans.user.User;
+import org.apache.openmeetings.web.app.WebSession;
 import org.apache.wicket.ajax.AjaxRequestTarget;
 import org.apache.wicket.ajax.form.AjaxFormComponentUpdatingBehavior;
 import org.apache.wicket.extensions.markup.html.form.DateTextField;
+import 
org.apache.wicket.extensions.validation.validator.RfcCompliantEmailAddressValidator;
 import org.apache.wicket.extensions.yui.calendar.DatePicker;
 import org.apache.wicket.markup.html.form.CheckBox;
 import org.apache.wicket.markup.html.form.ChoiceRenderer;
@@ -54,7 +59,7 @@ import org.apache.wicket.markup.html.pan
 import org.apache.wicket.model.IModel;
 import org.apache.wicket.model.Model;
 import org.apache.wicket.model.PropertyModel;
-import org.apache.wicket.validation.validator.EmailAddressValidator;
+import org.apache.wicket.validation.validator.StringValidator;
 
 public class GeneralUserForm extends Form<User> {
        private static final long serialVersionUID = 5360667099083510234L;
@@ -67,7 +72,8 @@ public class GeneralUserForm extends For
 
                //TODO should throw exception if non admin User edit somebody 
else (or make all fields read-only)
                add(passwordField = new PasswordTextField("password", new 
Model<String>()));
-               passwordField.setRequired(false);
+               ConfigurationDao cfgDao = getBean(ConfigurationDao.class);
+               
passwordField.setRequired(false).add(StringValidator.minimumLength(getMinPasswdLength(cfgDao)));
 
                SalutationDao salutDao = getBean(SalutationDao.class);
                FieldLanguageDao langDao = getBean(FieldLanguageDao.class);
@@ -104,7 +110,7 @@ public class GeneralUserForm extends For
                                }
                        }));
 
-               add(new 
RequiredTextField<String>("adresses.email").add(EmailAddressValidator.getInstance()));
+               add(new 
RequiredTextField<String>("adresses.email").add(RfcCompliantEmailAddressValidator.getInstance()));
                add(new TextField<String>("adresses.phone"));
                add(new CheckBox("sendSMS"));
                DateTextField age = new DateTextField("age");
@@ -143,6 +149,14 @@ public class GeneralUserForm extends For
                                new 
ChoiceRenderer<Organisation_Users>("organisation.name", 
"organisation.organisation_id"));
                add(orgChoiceList.setEnabled(isAdminForm));
        }
+
+       @Override
+       protected void onValidate() {
+               
if(getBean(EmailManager.class).checkUserEMail(getModelObject().getAdresses().getEmail()))
 {
+                       error(WebSession.getString(1000));
+               }
+               super.onValidate();
+       }
        
        public PasswordTextField getPasswordField() {
                return passwordField;

Modified: 
openmeetings/trunk/singlewebapp/src/org/apache/openmeetings/web/components/admin/users/UserForm.java
URL: 
http://svn.apache.org/viewvc/openmeetings/trunk/singlewebapp/src/org/apache/openmeetings/web/components/admin/users/UserForm.java?rev=1480741&r1=1480740&r2=1480741&view=diff
==============================================================================
--- 
openmeetings/trunk/singlewebapp/src/org/apache/openmeetings/web/components/admin/users/UserForm.java
 (original)
+++ 
openmeetings/trunk/singlewebapp/src/org/apache/openmeetings/web/components/admin/users/UserForm.java
 Thu May  9 19:08:48 2013
@@ -18,6 +18,7 @@
  */
 package org.apache.openmeetings.web.components.admin.users;
 
+import static org.apache.openmeetings.utils.UserHelper.getMinLoginLength;
 import static org.apache.openmeetings.web.app.Application.getBean;
 import static org.apache.openmeetings.web.app.WebSession.getUserId;
 
@@ -127,11 +128,10 @@ public class UserForm extends AdminBaseF
         * Add the fields to the form
         */
        private void addFormFields() {
-
+               ConfigurationDao cfgDao = getBean(ConfigurationDao.class);
                RequiredTextField<String> login = new 
RequiredTextField<String>("login");
-               login.add(new StringValidator(4, null));
                // login.setLabel(new Model<String>("testname"));
-               add(login);
+               
add(login.add(StringValidator.minimumLength(getMinLoginLength(cfgDao))));
 
                add(generalForm = new GeneralUserForm("general", getModel(), 
true));
 
@@ -192,4 +192,10 @@ public class UserForm extends AdminBaseF
                add(new ComunityUserForm("comunity", getModel()));
        }
 
+       @Override
+       protected void onValidate() {
+               
if(getBean(UsersDao.class).checkUserLogin(getModelObject().getLogin())) {
+                       error(WebSession.getString(105));
+               }
+       }
 }

Modified: 
openmeetings/trunk/singlewebapp/src/org/apache/openmeetings/web/pages/auth/RegisterDialog.java
URL: 
http://svn.apache.org/viewvc/openmeetings/trunk/singlewebapp/src/org/apache/openmeetings/web/pages/auth/RegisterDialog.java?rev=1480741&r1=1480740&r2=1480741&view=diff
==============================================================================
--- 
openmeetings/trunk/singlewebapp/src/org/apache/openmeetings/web/pages/auth/RegisterDialog.java
 (original)
+++ 
openmeetings/trunk/singlewebapp/src/org/apache/openmeetings/web/pages/auth/RegisterDialog.java
 Thu May  9 19:08:48 2013
@@ -18,20 +18,27 @@
  */
 package org.apache.openmeetings.web.pages.auth;
 
+import static org.apache.openmeetings.utils.UserHelper.getMinLoginLength;
+import static org.apache.openmeetings.utils.UserHelper.getMinPasswdLength;
 import static org.apache.openmeetings.web.app.Application.getBean;
 
 import java.util.Arrays;
 import java.util.List;
 
 import org.apache.openmeetings.data.basic.FieldLanguageDao;
+import org.apache.openmeetings.data.basic.dao.ConfigurationDao;
 import org.apache.openmeetings.data.basic.dao.OmTimeZoneDao;
+import org.apache.openmeetings.data.user.EmailManager;
+import org.apache.openmeetings.data.user.UserManager;
 import org.apache.openmeetings.data.user.dao.StateDao;
+import org.apache.openmeetings.data.user.dao.UsersDao;
 import org.apache.openmeetings.persistence.beans.basic.OmTimeZone;
 import org.apache.openmeetings.persistence.beans.lang.FieldLanguage;
 import org.apache.openmeetings.persistence.beans.user.State;
 import org.apache.openmeetings.web.app.WebSession;
 import org.apache.wicket.ajax.AjaxRequestTarget;
 import org.apache.wicket.ajax.markup.html.form.AjaxButton;
+import 
org.apache.wicket.extensions.validation.validator.RfcCompliantEmailAddressValidator;
 import org.apache.wicket.markup.html.form.ChoiceRenderer;
 import org.apache.wicket.markup.html.form.DropDownChoice;
 import org.apache.wicket.markup.html.form.Form;
@@ -41,6 +48,7 @@ import org.apache.wicket.markup.html.for
 import org.apache.wicket.markup.html.panel.FeedbackPanel;
 import org.apache.wicket.model.Model;
 import org.apache.wicket.model.PropertyModel;
+import org.apache.wicket.validation.validator.StringValidator;
 
 import com.googlecode.wicket.jquery.ui.widget.dialog.AbstractFormDialog;
 import com.googlecode.wicket.jquery.ui.widget.dialog.DialogButton;
@@ -49,6 +57,7 @@ public class RegisterDialog extends Abst
        private static final long serialVersionUID = -8333305491376538792L;
        private DialogButton cancelBtn = new 
DialogButton(WebSession.getString(122));
        private DialogButton registerBtn = new 
DialogButton(WebSession.getString(121));
+       private FeedbackPanel feedback = new FeedbackPanel("feedback");
        private Form<String> form;
        private SignInDialog s;
     private String firstName;
@@ -80,7 +89,6 @@ public class RegisterDialog extends Abst
        }
        
        public void onClose(AjaxRequestTarget target, DialogButton button) {
-               // TODO Auto-generated method stub
                s.open(target);
        }
 
@@ -96,41 +104,53 @@ public class RegisterDialog extends Abst
 
        @Override
        protected void onError(AjaxRequestTarget target) {
-               // TODO messages
-               
+               target.add(feedback);
        }
 
        @Override
        protected void onSubmit(AjaxRequestTarget target) {
-               // TODO Register + validation
-               
+               //FIXME need to be refactored
+               getBean(UserManager.class).registerUser(login, password, 
lastName
+                               , firstName, email, null, ""/*street*/, 
""/*additionalname*/, ""/*fax*/, ""/*zip*/
+                               , state.getState_id(), ""/*town*/, 
lang.getLanguage_id(), ""/*phone*/, false/*sendSMS*/
+                               , ""/*baseURL FIXME*/, false, tz.getJname());
        }
        
        class RegisterForm extends StatelessForm<String> {
                private static final long serialVersionUID = 
1701373326213602431L;
            private PasswordTextField confirmPassword;
+               private PasswordTextField passwordField;
+               private RequiredTextField<String> emailField;
+               private RequiredTextField<String> loginField;
 
                public RegisterForm(String id) {
                        super(id);
-                       add(new FeedbackPanel("feedback"));
+                       add(feedback.setOutputMarkupId(true));
+                       ConfigurationDao cfgDao = 
getBean(ConfigurationDao.class);
                        add(new RequiredTextField<String>("firstName", new 
PropertyModel<String>(RegisterDialog.this, "firstName")));
                        add(new RequiredTextField<String>("lastName", new 
PropertyModel<String>(RegisterDialog.this, "lastName")));
-                       add(new RequiredTextField<String>("login", new 
PropertyModel<String>(RegisterDialog.this, "login")));
-                       add(new PasswordTextField("password", new 
PropertyModel<String>(RegisterDialog.this, "password")).setResetPassword(true));
+                       add(loginField = new RequiredTextField<String>("login", 
new PropertyModel<String>(RegisterDialog.this, "login")));
+                       
loginField.add(StringValidator.minimumLength(getMinLoginLength(cfgDao)));
+                       add(passwordField = new PasswordTextField("password", 
new PropertyModel<String>(RegisterDialog.this, "password")));
+                       
passwordField.setResetPassword(true).add(StringValidator.minimumLength(getMinPasswdLength(cfgDao)));
                        add(confirmPassword = new 
PasswordTextField("confirmPassword", new 
Model<String>()).setResetPassword(true));
-                       add(new RequiredTextField<String>("email", new 
PropertyModel<String>(RegisterDialog.this, "email")));
+                       add(emailField = new RequiredTextField<String>("email", 
new PropertyModel<String>(RegisterDialog.this, "email")));
+                       
emailField.add(RfcCompliantEmailAddressValidator.getInstance());
                        add(new DropDownChoice<FieldLanguage>("lang"
                                        , new 
PropertyModel<FieldLanguage>(RegisterDialog.this, "lang")
                                        , 
getBean(FieldLanguageDao.class).getLanguages()
-                                       , new 
ChoiceRenderer<FieldLanguage>("name", "language_id")));
+                                       , new 
ChoiceRenderer<FieldLanguage>("name", "language_id"))
+                               
.setRequired(true).setLabel(Model.of(WebSession.getString(111))));
                        add(new DropDownChoice<OmTimeZone>("tz"
                                        , new 
PropertyModel<OmTimeZone>(RegisterDialog.this, "tz")
                                        , 
getBean(OmTimeZoneDao.class).getOmTimeZones()
-                                       , new 
ChoiceRenderer<OmTimeZone>("frontEndLabel", "jname")));
+                                       , new 
ChoiceRenderer<OmTimeZone>("frontEndLabel", "jname"))
+                               
.setRequired(true).setLabel(Model.of(WebSession.getString(1143))));
                        add(new DropDownChoice<State>("state"
-                                       , new 
PropertyModel<State>(RegisterDialog.this, "tz")
+                                       , new 
PropertyModel<State>(RegisterDialog.this, "state")
                                        , getBean(StateDao.class).getStates()
-                                       , new ChoiceRenderer<State>("name", 
"state_id")));
+                                       , new ChoiceRenderer<State>("name", 
"state_id"))
+                               
.setRequired(true).setLabel(Model.of(WebSession.getString(120))));
                        
                        add(new AjaxButton("submit") { //FAKE button so 
"submit-on-enter" works as expected
                                private static final long serialVersionUID = 
-3612671587183668912L;
@@ -142,7 +162,6 @@ public class RegisterDialog extends Abst
                                
                                @Override
                                protected void onError(AjaxRequestTarget 
target, Form<?> form) {
-                                       // TODO Auto-generated method stub
                                        RegisterDialog.this.onError(target);
                                }
                        });
@@ -150,8 +169,16 @@ public class RegisterDialog extends Abst
                
                @Override
                protected void onValidate() {
-                       // TODO Auto-generated method stub
-                       super.onValidate();
+                       if (passwordField.getConvertedInput() == null
+                                       || 
!passwordField.getConvertedInput().equals(confirmPassword.getConvertedInput())) 
{
+                               error(WebSession.getString(232));
+                       }
+                       
if(!getBean(EmailManager.class).checkUserEMail(emailField.getConvertedInput())) 
{
+                               error(WebSession.getString(1000));
+                       }
+                       
if(!getBean(UsersDao.class).checkUserLogin(loginField.getConvertedInput())) {
+                               error(WebSession.getString(105));
+                       }
                }
        }
 }


Reply via email to