-2

I try to make a registration process but these happened, I got some errors.
May anyone help me.. since i dont know what to do, I've done search on others similar case but still.. didn't get it..

logcat

11-21 15:30:30.762: D/dalvikvm(3859): GC_FOR_ALLOC freed 126K, 10% free 3294K/3636K, paused 7ms, total 7ms
11-21 15:30:53.194: E/ini(3859): bisa
11-21 15:30:53.234: D/dalvikvm(3859): GC_FOR_ALLOC freed 161K, 10% free 3503K/3884K, paused 11ms, total 11ms
11-21 15:30:53.234: I/dalvikvm-heap(3859): Grow heap (frag case) to 4.705MB for 1127532-byte allocation
11-21 15:30:53.250: D/dalvikvm(3859): GC_FOR_ALLOC freed 1K, 8% free 4602K/4988K, paused 9ms, total 14ms
11-21 15:30:53.270: E/ini(3859): bisa
11-21 15:30:53.310: D/request!(3859): starting
11-21 15:30:53.330: W/EGL_genymotion(3859): eglSurfaceAttrib not implemented
11-21 15:31:01.970: E/JSON Parser(3859): Error parsing data org.json.JSONException: Value <br of type java.lang.String cannot be converted to JSONObject
11-21 15:31:01.974: W/dalvikvm(3859): threadid=15: thread exiting with uncaught exception (group=0xa4b74648)
11-21 15:31:01.982: E/AndroidRuntime(3859): FATAL EXCEPTION: AsyncTask #5
11-21 15:31:01.982: E/AndroidRuntime(3859): java.lang.RuntimeException: An error occured while executing doInBackground()
11-21 15:31:01.982: E/AndroidRuntime(3859):     at android.os.AsyncTask$3.done(AsyncTask.java:299)
11-21 15:31:01.982: E/AndroidRuntime(3859):     at java.util.concurrent.FutureTask.finishCompletion(FutureTask.java:352)
11-21 15:31:01.982: E/AndroidRuntime(3859):     at java.util.concurrent.FutureTask.setException(FutureTask.java:219)
11-21 15:31:01.982: E/AndroidRuntime(3859):     at java.util.concurrent.FutureTask.run(FutureTask.java:239)
11-21 15:31:01.982: E/AndroidRuntime(3859):     at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:230)
11-21 15:31:01.982: E/AndroidRuntime(3859):     at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1080)
11-21 15:31:01.982: E/AndroidRuntime(3859):     at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:573)
11-21 15:31:01.982: E/AndroidRuntime(3859):     at java.lang.Thread.run(Thread.java:841)
11-21 15:31:01.982: E/AndroidRuntime(3859): Caused by: java.lang.NullPointerException
11-21 15:31:01.982: E/AndroidRuntime(3859):     at com.android.GoTrip.Register$CreateUser.doInBackground(Register.java:147)
11-21 15:31:01.982: E/AndroidRuntime(3859):     at com.android.GoTrip.Register$CreateUser.doInBackground(Register.java:1)
11-21 15:31:01.982: E/AndroidRuntime(3859):     at android.os.AsyncTask$2.call(AsyncTask.java:287)
11-21 15:31:01.982: E/AndroidRuntime(3859):     at java.util.concurrent.FutureTask.run(FutureTask.java:234)
11-21 15:31:01.982: E/AndroidRuntime(3859):     ... 4 more
11-21 15:31:02.350: W/EGL_genymotion(3859): eglSurfaceAttrib not implemented
11-21 15:31:02.814: E/WindowManager(3859): Activity com.android.GoTrip.Register has leaked window com.android.internal.policy.impl.PhoneWindow$DecorView{52784ba4 V.E..... R......D 0,0-684,192} that was originally added here
11-21 15:31:02.814: E/WindowManager(3859): android.view.WindowLeaked: Activity com.android.GoTrip.Register has leaked window com.android.internal.policy.impl.PhoneWindow$DecorView{52784ba4 V.E..... R......D 0,0-684,192} that was originally added here
11-21 15:31:02.814: E/WindowManager(3859):  at android.view.ViewRootImpl.<init>(ViewRootImpl.java:345)
11-21 15:31:02.814: E/WindowManager(3859):  at android.view.WindowManagerGlobal.addView(WindowManagerGlobal.java:239)
11-21 15:31:02.814: E/WindowManager(3859):  at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:69)
11-21 15:31:02.814: E/WindowManager(3859):  at android.app.Dialog.show(Dialog.java:281)
11-21 15:31:02.814: E/WindowManager(3859):  at com.android.GoTrip.Register$CreateUser.onPreExecute(Register.java:103)
11-21 15:31:02.814: E/WindowManager(3859):  at android.os.AsyncTask.executeOnExecutor(AsyncTask.java:586)
11-21 15:31:02.814: E/WindowManager(3859):  at android.os.AsyncTask.execute(AsyncTask.java:534)
11-21 15:31:02.814: E/WindowManager(3859):  at com.android.GoTrip.Register.btnRegister(Register.java:83)
11-21 15:31:02.814: E/WindowManager(3859):  at java.lang.reflect.Method.invokeNative(Native Method)
11-21 15:31:02.814: E/WindowManager(3859):  at java.lang.reflect.Method.invoke(Method.java:525)
11-21 15:31:02.814: E/WindowManager(3859):  at android.view.View$1.onClick(View.java:3628)
11-21 15:31:02.814: E/WindowManager(3859):  at android.view.View.performClick(View.java:4240)
11-21 15:31:02.814: E/WindowManager(3859):  at android.view.View$PerformClick.run(View.java:17721)
11-21 15:31:02.814: E/WindowManager(3859):  at android.os.Handler.handleCallback(Handler.java:730)
11-21 15:31:02.814: E/WindowManager(3859):  at android.os.Handler.dispatchMessage(Handler.java:92)
11-21 15:31:02.814: E/WindowManager(3859):  at android.os.Looper.loop(Looper.java:137)
11-21 15:31:02.814: E/WindowManager(3859):  at android.app.ActivityThread.main(ActivityThread.java:5103)
11-21 15:31:02.814: E/WindowManager(3859):  at java.lang.reflect.Method.invokeNative(Native Method)
11-21 15:31:02.814: E/WindowManager(3859):  at java.lang.reflect.Method.invoke(Method.java:525)
11-21 15:31:02.814: E/WindowManager(3859):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:737)
11-21 15:31:02.814: E/WindowManager(3859):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:553)
11-21 15:31:02.814: E/WindowManager(3859):  at dalvik.system.NativeStart.main(Native Method)
11-21 15:31:04.154: I/Process(3859): Sending signal. PID: 3859 SIG: 9

JSON praser

   public class JSONParser {
static InputStream is = null;
static String json = "";
static JSONObject jObj = null;

public static JSONObject getJSONfromURL(String url) {
    String result = "";
    JSONObject jArray = null;
    Log.d("Json", "1");
    // http post
    try {
        HttpClient httpclient = new DefaultHttpClient();
        HttpPost httppost = new HttpPost(url);
        HttpResponse response = httpclient.execute(httppost);
        HttpEntity entity = response.getEntity();
        is = entity.getContent();

    } catch (Exception e) {
        Log.e("log_tag", "Error in http connection " + e.toString());
    }
    // convert response to string
    try {
        BufferedReader reader = new BufferedReader(new InputStreamReader(
                is, "iso-8859-1"), 8);
        StringBuilder sb = new StringBuilder();
        String line = null;
        while ((line = reader.readLine()) != null) {
            sb.append(line + "\n");
        }
        is.close();
        result = sb.toString();
    } catch (Exception e) {
        Log.e("log_tag", "Error converting result " + e.toString());
    }
    Log.d("Json", "2");
    Log.d("Json", result);
    try {

        jArray = new JSONObject(result);
    } catch (JSONException e) {
        Log.e("log_tag", "Error parsing data " + e.toString());
    }

    return jArray;
}

public static JSONObject makeHttpRequest(String url, String method,
        List<NameValuePair> params) {
    try {
        // check for request method
        if (method == "POST") {
            // request method is POST
            // defaultHttpClient
            DefaultHttpClient httpClient = new DefaultHttpClient();
            HttpPost httpPost = new HttpPost(url);
            httpPost.setEntity(new UrlEncodedFormEntity(params));
            HttpResponse httpResponse = httpClient.execute(httpPost);
            HttpEntity httpEntity = httpResponse.getEntity();
            is = httpEntity.getContent();
        } else if (method == "GET") {
            // request method is GET
            DefaultHttpClient httpClient = new DefaultHttpClient();
            String paramString = URLEncodedUtils.format(params, "utf-8");
            url += "?" + paramString;
            HttpGet httpGet = new HttpGet(url);
            HttpResponse httpResponse = httpClient.execute(httpGet);
            HttpEntity httpEntity = httpResponse.getEntity();
            is = httpEntity.getContent();
        }
    } catch (UnsupportedEncodingException e) {
        e.printStackTrace();
    } catch (ClientProtocolException e) {
        e.printStackTrace();
    } catch (IOException e) {
        e.printStackTrace();
    }
    try {
        BufferedReader reader = new BufferedReader(new InputStreamReader(
                is, "iso-8859-1"), 8);
        StringBuilder sb = new StringBuilder();
        String line = null;
        while ((line = reader.readLine()) != null) {
            sb.append(line + "\n");
        }
        is.close();
        json = sb.toString();
    } catch (Exception e) {
        Log.e("Buffer Error", "Error converting result " + e.toString());
    }
    // try parse the string to a JSON object
    try {
        jObj = new JSONObject(json);
    } catch (JSONException e) {
        Log.e("JSON Parser", "Error parsing data " + e.toString());
    }
    // return JSON String
    return jObj;
}
}

register.java

    public class Register  extends Activity {


EditText inputUsername;
EditText inputNama;
EditText inputEmail;
EditText inputPassword;
EditText inputPassword2;
Button btnRegister;
Button btnLogin;


private ProgressDialog pDialog; 

JSONParser jsonParser = new JSONParser();

private static final String LOGIN_URL = "http://10.0.3.2/1aaa/register.php";

private static final String TAG_SUCCESS = "success";
private static final String TAG_MESSAGE = "message";

@Override
public void onCreate(Bundle icicle) {
    super.onCreate(icicle);
    setContentView(R.layout.register);

    inputUsername = (EditText) findViewById(R.id.username);
    inputNama = (EditText) findViewById(R.id.name);
    inputEmail = (EditText) findViewById(R.id.email);
    inputPassword = (EditText) findViewById(R.id.password);
    inputPassword2 = (EditText) findViewById(R.id.password2);


    btnRegister = (Button) findViewById(R.id.btnRegister);

    btnLogin = (Button) findViewById(R.id.btnLinkToLogin);


}



    public void btnRegister(View v) {
        // TODO Auto-generated method stub

        Log.e("ini", "bisa");
        new CreateUser().execute();
        Log.e("ini", "bisa");

    }


    class CreateUser extends AsyncTask<String, String, String> {

         /**
         * Before starting background thread Show Progress Dialog
         * */
        boolean failure = false;

        @Override
        protected void onPreExecute() {
            super.onPreExecute();
            pDialog = new ProgressDialog(Register.this);
            pDialog.setMessage("Creating User...");
            pDialog.setIndeterminate(false);
            pDialog.setCancelable(true);
            pDialog.show();
        }

        @SuppressWarnings("static-access")
        @Override
        protected String doInBackground(String... args) {
            // TODO Auto-generated method stub
             // Check for success tag
            int success;

                String username = inputUsername.getText().toString();
                String name = inputNama.getText().toString();
                String email = inputEmail.getText().toString();
                String password = inputPassword.getText().toString();
                String password2 = inputPassword2.getText().toString();
                Encrypt a = new Encrypt();
                a.encrrypte(password);
                String encpassword = a.GetHashtext();
                a.encrrypte(password2);
                String encretypepwd = a.GetHashtext();
                Date c = Calendar.getInstance().getTime();
                SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");
                String output = formatter.format(c);

                    try {
                        // Building Parameters
                        List<NameValuePair> params = new ArrayList<NameValuePair>();
                        params.add(new BasicNameValuePair("username", username));
                        params.add(new BasicNameValuePair("name", name));
                        params.add(new BasicNameValuePair("email", email));
                        params.add(new BasicNameValuePair("password", encpassword));
                        params.add(new BasicNameValuePair("password2", encretypepwd));

                        params.add(new BasicNameValuePair("ctime",  output));
                        params.add(new BasicNameValuePair("date_edit_profile", "0000-00-00 00:00:00"));


                        Log.d("request!", "starting");

                        //Posting user data to script 
                        JSONObject json = jsonParser.makeHttpRequest(
                               LOGIN_URL, "POST", params);

                        // full json response
                        Log.d("Login attempt", json.toString());

                        // json success element
                        success = json.getInt(TAG_SUCCESS);
                        if (success == 1) {
                            Log.d("User Created!", json.toString());                
                            finish();
                            return json.getString(TAG_MESSAGE);
                        }else{
                            Log.d("Login Failure!", json.getString(TAG_MESSAGE));
                            return json.getString(TAG_MESSAGE);

                        }
                    } catch (JSONException e) {
                        e.printStackTrace();
                    }

                    return null;

                }
                /**
                 * After completing background task Dismiss the progress dialog
                 * **/


                    protected void onPostExecute(String file_url) {
                    // dismiss the dialog once product deleted
                    pDialog.dismiss();
                    if (file_url != null){
                        Toast.makeText(Register.this, file_url, Toast.LENGTH_LONG).show();
                    }

                }
    }

    public void btnLogin(View v){
        Intent s = new Intent(this, Login.class);
        startActivity(s);
    }



            public class Encrypt{
                private String hashtext= "";
                public void encrrypte(String yourString){
                    try {
                        byte[] bytesOfMessage = yourString.getBytes("UTF-8");
                        MessageDigest md = MessageDigest.getInstance("MD5");
                        byte[] thedigest = md.digest(bytesOfMessage);
                        BigInteger bigInt = new BigInteger(1,thedigest);
                        hashtext = bigInt.toString(16);
                        // Now we need to zero pad it if you actually want the full 32 chars.
                        while(hashtext.length() < 32 ){
                          hashtext = "0"+hashtext;
                        }
                    } catch (UnsupportedEncodingException e1) {
                        // TODO Auto-generated catch block
                        e1.printStackTrace();
                    } catch (NoSuchAlgorithmException e) {
                        // TODO Auto-generated catch block
                        e.printStackTrace();
                    }
                }
                public String GetHashtext(){
                    return hashtext;
                }

            }
    }

register.php

<?php

require("config.php");
$email="";
function test_input($data){
$data = trim($data);
$data = stripslashes($data);
$data = htmlspecialchars($data);
return $data;
}

if (!empty($_POST)) {


if (empty($_POST['username'])) {
    // Create some data that will be the JSON response 
    $response["success"] = 0;
    $response["message"] = "Please input username";

    die(json_encode($response));
}  

if (empty($_POST['name'])) {
  $response["success"] = 0;
    $response["message"] = "Please input your name";
    die(json_encode($response));
} 

if (empty($_POST['email'])) {
    $response["success"] = 0;
    $response["message"] = "Please input your email address";
    die(json_encode($response));
}  
else{
    $email = test_input($_POST['email']);
    if(!preg_match("/([\w\-]+\@[\w\-]+\.[\w\-]+)/",$email)){
    $response["success"] = 0;
    $response["message"] = "Input the correct email address form";
    die(json_encode($response));
    }
}

if (empty($_POST['password'])) {
    $response["success"] = 0;
    $response["message"] = "Please input a Password.";
    die(json_encode($response));
} 
else{
    if(strlen($_POST['password'])<6){
            $response["success"] = 0;
            $response["message"] = "password length should be longer than 6 characters";
            die(json_encode($response));
    }
    else{
        if ($_POST['password']!=$_POST['password2']){
            $response["success"] = 0;
            $response["message"] = "Password doesn't match";
            die(json_encode($response));
        }
    }
}




$query        = " SELECT 1 FROM user WHERE username = :user";
$query_params = array(
    ':user' => $_POST['username']
);

try {
    // These two statements run the query against your database table. 
    $stmt   = $db->prepare($query);
    $result = $stmt->execute($query_params);
}
catch (PDOException $ex) {

    $response["success"] = 0;
    $response["message"] = "Database Error1. Please Try Again!";
    die(json_encode($response));
}


$row = $stmt->fetch();
if ($row) {

    $response["success"] = 0;
    $response["message"] = "I'm sorry, this username is already in use";
    die(json_encode($response));
}


$query = ("INSERT INTO user ( username, name, password, email, role_id,ctime) VALUES ( :user, :name, :password, :email , :role_id, :ctime) ");

//Again, we need to update our tokens with the actual data:
$query_params = array(
    ':user' => $_POST['username'],
    ':name' => $_POST['name'],
    ':password' => $_POST['password'],
    ':email' => $_POST['email'],
    ':role_id'  => '2',
    ':ctime' => $_POST['ctime'],
    );


try {
    $stmt   = $db->prepare($query);
    $result = $stmt->execute($query_params);
}
catch (PDOException $ex) {

    $response["success"] = 0;
    $response["message"] = "Database Error2. Please Try Again!";
    die(json_encode($response));
}


$response["success"] = 1;
$response["message"] = "Username Successfully Added!";
echo json_encode($response);




} else {
?>
<h1>Register</h1> 
<form action="register.php" method="post"> 
    Username:<br /> 
    <input type="text" name="username" value="" /> 
    <br /><br />

     Name:<br /> 
    <input type="text" name="name" value="" /> 
    <br /><br /> 

    Email:<br /> 
    <input type="text" name="email" value="" /> 
    <br /><br /> 

    Password:<br /> 
    <input type="password" name="password" value="" /> 
    <br /><br />
    Confirm Your Password:<br /> 
    <input type="password" name="password2" value="" /> 
    <br /><br />

    <input type="submit" value="Register New User" /> 
</form>
<?php
}
?>

register.xml

 <!-- View Title Label -->
 <LinearLayout
     android:layout_width="match_parent"
     android:layout_height="wrap_content"
     android:layout_marginLeft="7dp"
     android:layout_marginRight="7dp"
     android:layout_marginTop="15dp"
     android:gravity="center_horizontal"
     android:orientation="vertical" >

<TextView
    android:id="@+id/TextView1"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:layout_alignParentTop="true"
    android:layout_marginBottom="10dip"
    android:text="REGISTER"
    android:textSize="25dip"
    android:textStyle="bold" />
<!-- Name Label -->

<TextView
    android:id="@+id/TextView2"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:layout_alignParentLeft="true"
    android:layout_below="@+id/TextView1"
    android:text="Username" />
<!-- Name TextField -->

<EditText
    android:id="@+id/username"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:layout_alignParentLeft="true"
    android:layout_below="@+id/TextView2" />

<TextView
    android:id="@+id/TextView3"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:layout_alignParentLeft="true"
    android:layout_below="@+id/username"
    android:text="Name" />

<!-- NAME TextField -->

<EditText
    android:id="@+id/name"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:layout_alignParentLeft="true"
    android:layout_below="@+id/TextView3" />
 <!-- Email Label -->

<TextView
    android:id="@+id/TextView4"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:layout_alignParentLeft="true"
    android:layout_below="@+id/name"
    android:text="Email" />

<!-- Email TextField -->

<EditText
    android:id="@+id/email"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:layout_alignParentLeft="true"
    android:layout_below="@+id/TextView4" />

<!-- Password Label -->

<TextView
    android:id="@+id/TextView5"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:layout_alignParentLeft="true"
    android:layout_below="@+id/registerEmail"
    android:text="Password" />
<!-- Password TextField -->

<EditText
    android:id="@+id/password"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:layout_alignParentLeft="true"
    android:layout_below="@+id/TextView5"
    android:password="true" />

<!-- Password Label -->

<TextView
    android:id="@+id/TextView6"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:layout_alignParentLeft="true"
    android:layout_below="@+id/registerEmail"
    android:text="Re-type Password" />
<!-- Password TextField -->

<EditText
    android:id="@+id/password2"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:layout_alignParentLeft="true"
    android:layout_below="@+id/TextView5"
    android:password="true" />

<!-- Error message -->



<!-- Login Button -->

<Button
    android:id="@+id/btnRegister"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:layout_alignParentLeft="true"
    android:layout_below="@+id/register_error"
    android:layout_marginTop="2dip"
    android:text="Register"
    android:onClick="btnRegister" />

<!-- Link to Login Screen -->

<Button
    android:id="@+id/btnLinkToLogin"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:layout_alignParentLeft="true"
    android:layout_below="@+id/btnRegister"
    android:layout_marginTop="4dip"
    android:background="@null"
    android:text="Already registered. Login Me!"
    android:textColor="#c90505"
    android:textStyle="bold"
    android:onClick="btnLogin" />
   </LinearLayout>

<LinearLayout
    android:id="@+id/footer"
    android:layout_width="fill_parent"
    android:layout_height="65dip"
    android:layout_alignParentBottom="true"
    android:background="@layout/zfooter"
    android:orientation="vertical" >
</LinearLayout>

please help me :(

meruvi
  • 11
  • 8
  • possible duplicate of [What is a Null Pointer Exception, and how do I fix it?](http://stackoverflow.com/questions/218384/what-is-a-null-pointer-exception-and-how-do-i-fix-it) – ToYonos Nov 21 '14 at 09:11
  • It's difficult to find a NullPointerException if you removed lines from your posted code, so the line numbers in the exception do not match the lines in your code. Read the Exception, go to the specified line in your class Register and look what may be null there. – Udo Nov 21 '14 at 09:15

2 Answers2

1

The following error is root of your problem -

11-21 15:31:01.970: E/JSON Parser(3859): Error parsing data org.json.JSONException: Value <br of type java.lang.String cannot be converted to JSONObject

NullPointerException is a result of the JSON parser failing to parse the response from the URL.

You have to verify if the POST response you are receiving from http://10.0.3.2/1aaa/register.php is in JSON format.

From the error code, looks like there is a <br /> in the response which is resulting in a parsing error.

Tushar Nallan
  • 784
  • 6
  • 16
  • Just check it in a browser. For instance, open chrome and press F12 for developer toolbar, and open the Network Pane. Then enter your form and press on register. Check the POST response you're receiving. – Tushar Nallan Nov 21 '14 at 09:30
  • i've done it and it's worked for .php, the problem is when i try to collaborate them, i thought i had problem in my .java but i can't figure it out.. – meruvi Nov 21 '14 at 09:37
  • Can you post response from register.php? You can do that by replacing Log.e("JSON Parser", "Error parsing data " + e.toString()); in JSON Parset to Log.e("JSON Parser", "Error parsing data " + json); – Tushar Nallan Nov 21 '14 at 09:44
  • i'm sorry to put you on my problem.. i just check it .. i have different variable for one thing, now the registration process is done.. but i got the problem with the login process, anyway.. thank you so much – meruvi Nov 21 '14 at 09:52
0
Caused by: java.lang.NullPointerException
    at com.android.GoTrip.Register$CreateUser.doInBackground(Register.java:147)

Maybe this is because json.getInt(TAG_SUCCESS) is storing a null value in success, due to the parser not getting a correct response from register.php, or you using the wrong key (TAG_SUCCESS does not exist in the response).

For debugging you can try removing the if block and printing out the value of success and json.toString() directly.

udiboy1209
  • 1,472
  • 1
  • 15
  • 33