You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@cordova.apache.org by ag...@apache.org on 2014/03/07 02:33:06 UTC

[1/7] git commit: CB-6114 Incremented plugin version on dev branch.

Repository: cordova-plugin-inappbrowser
Updated Branches:
  refs/heads/master 4d3c7b17d -> a5dedae63


CB-6114 Incremented plugin version on dev branch.


Project: http://git-wip-us.apache.org/repos/asf/cordova-plugin-inappbrowser/repo
Commit: http://git-wip-us.apache.org/repos/asf/cordova-plugin-inappbrowser/commit/942d1798
Tree: http://git-wip-us.apache.org/repos/asf/cordova-plugin-inappbrowser/tree/942d1798
Diff: http://git-wip-us.apache.org/repos/asf/cordova-plugin-inappbrowser/diff/942d1798

Branch: refs/heads/master
Commit: 942d17981ee40463605b1f9c233806e7be3f0518
Parents: 17ba417
Author: Andrew Grieve <ag...@chromium.org>
Authored: Thu Feb 27 12:29:15 2014 -0500
Committer: Andrew Grieve <ag...@chromium.org>
Committed: Thu Feb 27 12:29:15 2014 -0500

----------------------------------------------------------------------
 plugin.xml | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/cordova-plugin-inappbrowser/blob/942d1798/plugin.xml
----------------------------------------------------------------------
diff --git a/plugin.xml b/plugin.xml
index 77adc5c..aeb8dbd 100644
--- a/plugin.xml
+++ b/plugin.xml
@@ -2,7 +2,7 @@
 
 <plugin xmlns="http://apache.org/cordova/ns/plugins/1.0"
            id="org.apache.cordova.inappbrowser"
-      version="0.3.2">
+      version="0.3.3-dev">
 
     <name>InAppBrowser</name>
     <description>Cordova InAppBrowser Plugin</description>


[7/7] git commit: Updated version and RELEASENOTES.md for release 0.3.3

Posted by ag...@apache.org.
Updated version and RELEASENOTES.md for release 0.3.3


Project: http://git-wip-us.apache.org/repos/asf/cordova-plugin-inappbrowser/repo
Commit: http://git-wip-us.apache.org/repos/asf/cordova-plugin-inappbrowser/commit/a5dedae6
Tree: http://git-wip-us.apache.org/repos/asf/cordova-plugin-inappbrowser/tree/a5dedae6
Diff: http://git-wip-us.apache.org/repos/asf/cordova-plugin-inappbrowser/diff/a5dedae6

Branch: refs/heads/master
Commit: a5dedae6310f8c211596455cbd5f4214b0c8c508
Parents: d0dd101
Author: Andrew Grieve <ag...@chromium.org>
Authored: Wed Mar 5 14:37:10 2014 -0500
Committer: Andrew Grieve <ag...@chromium.org>
Committed: Wed Mar 5 14:37:10 2014 -0500

----------------------------------------------------------------------
 RELEASENOTES.md | 4 ++++
 plugin.xml      | 2 +-
 2 files changed, 5 insertions(+), 1 deletion(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/cordova-plugin-inappbrowser/blob/a5dedae6/RELEASENOTES.md
----------------------------------------------------------------------
diff --git a/RELEASENOTES.md b/RELEASENOTES.md
index 293e125..2d40026 100644
--- a/RELEASENOTES.md
+++ b/RELEASENOTES.md
@@ -78,3 +78,7 @@
 * Validate that callbackId is correctly formed
 * CB-6035 Move js-module so it is not loaded on unsupported platforms
 * Removed some iOS6 Deprecations
+
+### 0.3.3 (Mar 5, 2014)
+* CB-6172 Fix broken install on case-sensitive file-systems
+

http://git-wip-us.apache.org/repos/asf/cordova-plugin-inappbrowser/blob/a5dedae6/plugin.xml
----------------------------------------------------------------------
diff --git a/plugin.xml b/plugin.xml
index e4b31aa..932ff83 100644
--- a/plugin.xml
+++ b/plugin.xml
@@ -2,7 +2,7 @@
 
 <plugin xmlns="http://apache.org/cordova/ns/plugins/1.0"
            id="org.apache.cordova.inappbrowser"
-      version="0.3.3-dev">
+      version="0.3.3">
 
     <name>InAppBrowser</name>
     <description>Cordova InAppBrowser Plugin</description>


[4/7] git commit: CB-5534: Updating the plugin.xml with the new Dialog class

Posted by ag...@apache.org.
CB-5534: Updating the plugin.xml with the new Dialog class


Project: http://git-wip-us.apache.org/repos/asf/cordova-plugin-inappbrowser/repo
Commit: http://git-wip-us.apache.org/repos/asf/cordova-plugin-inappbrowser/commit/497a23ef
Tree: http://git-wip-us.apache.org/repos/asf/cordova-plugin-inappbrowser/tree/497a23ef
Diff: http://git-wip-us.apache.org/repos/asf/cordova-plugin-inappbrowser/diff/497a23ef

Branch: refs/heads/master
Commit: 497a23efc77cf0262497071cdc5c30fb94e01d99
Parents: 6f373f7
Author: Joe Bowser <bo...@apache.org>
Authored: Fri Feb 28 14:03:57 2014 -0800
Committer: Joe Bowser <bo...@apache.org>
Committed: Fri Feb 28 14:04:25 2014 -0800

----------------------------------------------------------------------
 plugin.xml | 1 +
 1 file changed, 1 insertion(+)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/cordova-plugin-inappbrowser/blob/497a23ef/plugin.xml
----------------------------------------------------------------------
diff --git a/plugin.xml b/plugin.xml
index aeb8dbd..e4b31aa 100644
--- a/plugin.xml
+++ b/plugin.xml
@@ -27,6 +27,7 @@
         </config-file>
 
         <source-file src="src/android/InAppBrowser.java" target-dir="src/org/apache/cordova/inappbrowser" />
+        <source-file src="src/android/InAppBrowserDialog.java" target-dir="src/org/apache/cordova/inappbrowser" />
         <source-file src="src/android/InAppChromeClient.java" target-dir="src/org/apache/cordova/inappbrowser" />
 
         <!--  drawable src/android/resources -->


[3/7] git commit: Merge branch 'master' into dev

Posted by ag...@apache.org.
Merge branch 'master' into dev


Project: http://git-wip-us.apache.org/repos/asf/cordova-plugin-inappbrowser/repo
Commit: http://git-wip-us.apache.org/repos/asf/cordova-plugin-inappbrowser/commit/300f1e78
Tree: http://git-wip-us.apache.org/repos/asf/cordova-plugin-inappbrowser/tree/300f1e78
Diff: http://git-wip-us.apache.org/repos/asf/cordova-plugin-inappbrowser/diff/300f1e78

Branch: refs/heads/master
Commit: 300f1e782ef51b91cbeef5d2918c1543249359bd
Parents: a5201cc 4d3c7b1
Author: Andrew Grieve <ag...@chromium.org>
Authored: Thu Feb 27 16:04:39 2014 -0500
Committer: Andrew Grieve <ag...@chromium.org>
Committed: Thu Feb 27 16:04:39 2014 -0500

----------------------------------------------------------------------

----------------------------------------------------------------------



[2/7] git commit: Add NOTICE file

Posted by ag...@apache.org.
Add NOTICE file


Project: http://git-wip-us.apache.org/repos/asf/cordova-plugin-inappbrowser/repo
Commit: http://git-wip-us.apache.org/repos/asf/cordova-plugin-inappbrowser/commit/a5201cc1
Tree: http://git-wip-us.apache.org/repos/asf/cordova-plugin-inappbrowser/tree/a5201cc1
Diff: http://git-wip-us.apache.org/repos/asf/cordova-plugin-inappbrowser/diff/a5201cc1

Branch: refs/heads/master
Commit: a5201cc1e3adc11d47f5feba873231f677431b9b
Parents: 942d179
Author: Andrew Grieve <ag...@chromium.org>
Authored: Thu Feb 27 15:36:31 2014 -0500
Committer: Andrew Grieve <ag...@chromium.org>
Committed: Thu Feb 27 15:36:31 2014 -0500

----------------------------------------------------------------------
 NOTICE | 6 +++++-
 1 file changed, 5 insertions(+), 1 deletion(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/cordova-plugin-inappbrowser/blob/a5201cc1/NOTICE
----------------------------------------------------------------------
diff --git a/NOTICE b/NOTICE
index 4d37500..8ec56a5 100644
--- a/NOTICE
+++ b/NOTICE
@@ -1 +1,5 @@
-Icons used in ths plugin are reproduced from work created and shared by the Android Open Source Project and used according to terms described in the Creative Commons 2.5 Attribution License.
+Apache Cordova
+Copyright 2012 The Apache Software Foundation
+
+This product includes software developed at
+The Apache Software Foundation (http://www.apache.org/).


[6/7] git commit: CB-6172 Fix inappbrowser install failure on case-sensitive filesystems.

Posted by ag...@apache.org.
CB-6172 Fix inappbrowser install failure on case-sensitive filesystems.


Project: http://git-wip-us.apache.org/repos/asf/cordova-plugin-inappbrowser/repo
Commit: http://git-wip-us.apache.org/repos/asf/cordova-plugin-inappbrowser/commit/d0dd1010
Tree: http://git-wip-us.apache.org/repos/asf/cordova-plugin-inappbrowser/tree/d0dd1010
Diff: http://git-wip-us.apache.org/repos/asf/cordova-plugin-inappbrowser/diff/d0dd1010

Branch: refs/heads/master
Commit: d0dd10103c9e2ff7833e008188c26a6505ea6b96
Parents: 497a23e
Author: Andrew Grieve <ag...@chromium.org>
Authored: Wed Mar 5 12:33:31 2014 -0500
Committer: Andrew Grieve <ag...@chromium.org>
Committed: Wed Mar 5 12:34:31 2014 -0500

----------------------------------------------------------------------
 www/InAppBrowser.js | 96 ------------------------------------------------
 www/inappbrowser.js | 96 ++++++++++++++++++++++++++++++++++++++++++++++++
 2 files changed, 96 insertions(+), 96 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/cordova-plugin-inappbrowser/blob/d0dd1010/www/InAppBrowser.js
----------------------------------------------------------------------
diff --git a/www/InAppBrowser.js b/www/InAppBrowser.js
deleted file mode 100644
index ebcfa24..0000000
--- a/www/InAppBrowser.js
+++ /dev/null
@@ -1,96 +0,0 @@
-/*
- *
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- *
-*/
-
-var exec = require('cordova/exec');
-var channel = require('cordova/channel');
-var modulemapper = require('cordova/modulemapper');
-var urlutil = require('cordova/urlutil');
-
-function InAppBrowser() {
-   this.channels = {
-        'loadstart': channel.create('loadstart'),
-        'loadstop' : channel.create('loadstop'),
-        'loaderror' : channel.create('loaderror'),
-        'exit' : channel.create('exit')
-   };
-}
-
-InAppBrowser.prototype = {
-    _eventHandler: function (event) {
-        if (event.type in this.channels) {
-            this.channels[event.type].fire(event);
-        }
-    },
-    close: function (eventname) {
-        exec(null, null, "InAppBrowser", "close", []);
-    },
-    show: function (eventname) {
-      exec(null, null, "InAppBrowser", "show", []);
-    },
-    addEventListener: function (eventname,f) {
-        if (eventname in this.channels) {
-            this.channels[eventname].subscribe(f);
-        }
-    },
-    removeEventListener: function(eventname, f) {
-        if (eventname in this.channels) {
-            this.channels[eventname].unsubscribe(f);
-        }
-    },
-
-    executeScript: function(injectDetails, cb) {
-        if (injectDetails.code) {
-            exec(cb, null, "InAppBrowser", "injectScriptCode", [injectDetails.code, !!cb]);
-        } else if (injectDetails.file) {
-            exec(cb, null, "InAppBrowser", "injectScriptFile", [injectDetails.file, !!cb]);
-        } else {
-            throw new Error('executeScript requires exactly one of code or file to be specified');
-        }
-    },
-
-    insertCSS: function(injectDetails, cb) {
-        if (injectDetails.code) {
-            exec(cb, null, "InAppBrowser", "injectStyleCode", [injectDetails.code, !!cb]);
-        } else if (injectDetails.file) {
-            exec(cb, null, "InAppBrowser", "injectStyleFile", [injectDetails.file, !!cb]);
-        } else {
-            throw new Error('insertCSS requires exactly one of code or file to be specified');
-        }
-    }
-};
-
-module.exports = function(strUrl, strWindowName, strWindowFeatures) {
-    // Don't catch calls that write to existing frames (e.g. named iframes).
-    if (window.frames && window.frames[strWindowName]) {
-        var origOpenFunc = modulemapper.getOriginalSymbol(window, 'open');
-        return origOpenFunc.apply(window, arguments);
-    }
-
-    strUrl = urlutil.makeAbsolute(strUrl);
-    var iab = new InAppBrowser();
-    var cb = function(eventname) {
-       iab._eventHandler(eventname);
-    };
-
-    exec(cb, cb, "InAppBrowser", "open", [strUrl, strWindowName, strWindowFeatures]);
-    return iab;
-};
-

http://git-wip-us.apache.org/repos/asf/cordova-plugin-inappbrowser/blob/d0dd1010/www/inappbrowser.js
----------------------------------------------------------------------
diff --git a/www/inappbrowser.js b/www/inappbrowser.js
new file mode 100644
index 0000000..ebcfa24
--- /dev/null
+++ b/www/inappbrowser.js
@@ -0,0 +1,96 @@
+/*
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *
+*/
+
+var exec = require('cordova/exec');
+var channel = require('cordova/channel');
+var modulemapper = require('cordova/modulemapper');
+var urlutil = require('cordova/urlutil');
+
+function InAppBrowser() {
+   this.channels = {
+        'loadstart': channel.create('loadstart'),
+        'loadstop' : channel.create('loadstop'),
+        'loaderror' : channel.create('loaderror'),
+        'exit' : channel.create('exit')
+   };
+}
+
+InAppBrowser.prototype = {
+    _eventHandler: function (event) {
+        if (event.type in this.channels) {
+            this.channels[event.type].fire(event);
+        }
+    },
+    close: function (eventname) {
+        exec(null, null, "InAppBrowser", "close", []);
+    },
+    show: function (eventname) {
+      exec(null, null, "InAppBrowser", "show", []);
+    },
+    addEventListener: function (eventname,f) {
+        if (eventname in this.channels) {
+            this.channels[eventname].subscribe(f);
+        }
+    },
+    removeEventListener: function(eventname, f) {
+        if (eventname in this.channels) {
+            this.channels[eventname].unsubscribe(f);
+        }
+    },
+
+    executeScript: function(injectDetails, cb) {
+        if (injectDetails.code) {
+            exec(cb, null, "InAppBrowser", "injectScriptCode", [injectDetails.code, !!cb]);
+        } else if (injectDetails.file) {
+            exec(cb, null, "InAppBrowser", "injectScriptFile", [injectDetails.file, !!cb]);
+        } else {
+            throw new Error('executeScript requires exactly one of code or file to be specified');
+        }
+    },
+
+    insertCSS: function(injectDetails, cb) {
+        if (injectDetails.code) {
+            exec(cb, null, "InAppBrowser", "injectStyleCode", [injectDetails.code, !!cb]);
+        } else if (injectDetails.file) {
+            exec(cb, null, "InAppBrowser", "injectStyleFile", [injectDetails.file, !!cb]);
+        } else {
+            throw new Error('insertCSS requires exactly one of code or file to be specified');
+        }
+    }
+};
+
+module.exports = function(strUrl, strWindowName, strWindowFeatures) {
+    // Don't catch calls that write to existing frames (e.g. named iframes).
+    if (window.frames && window.frames[strWindowName]) {
+        var origOpenFunc = modulemapper.getOriginalSymbol(window, 'open');
+        return origOpenFunc.apply(window, arguments);
+    }
+
+    strUrl = urlutil.makeAbsolute(strUrl);
+    var iab = new InAppBrowser();
+    var cb = function(eventname) {
+       iab._eventHandler(eventname);
+    };
+
+    exec(cb, cb, "InAppBrowser", "open", [strUrl, strWindowName, strWindowFeatures]);
+    return iab;
+};
+


[5/7] git commit: fix for CB-5534

Posted by ag...@apache.org.
fix for CB-5534

Signed-off-by: Joe Bowser <bo...@apache.org>


Project: http://git-wip-us.apache.org/repos/asf/cordova-plugin-inappbrowser/repo
Commit: http://git-wip-us.apache.org/repos/asf/cordova-plugin-inappbrowser/commit/6f373f7e
Tree: http://git-wip-us.apache.org/repos/asf/cordova-plugin-inappbrowser/tree/6f373f7e
Diff: http://git-wip-us.apache.org/repos/asf/cordova-plugin-inappbrowser/diff/6f373f7e

Branch: refs/heads/master
Commit: 6f373f7ed9993b81f5b735e3ee347e516585a916
Parents: 300f1e7
Author: Oliver Moran <ol...@gmail.com>
Authored: Fri Feb 28 19:58:14 2014 +0000
Committer: Joe Bowser <bo...@apache.org>
Committed: Fri Feb 28 14:04:25 2014 -0800

----------------------------------------------------------------------
 src/android/InAppBrowser.java       | 29 ++++++++++-------
 src/android/InAppBrowserDialog.java | 54 ++++++++++++++++++++++++++++++++
 2 files changed, 72 insertions(+), 11 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/cordova-plugin-inappbrowser/blob/6f373f7e/src/android/InAppBrowser.java
----------------------------------------------------------------------
diff --git a/src/android/InAppBrowser.java b/src/android/InAppBrowser.java
index 16ecd70..796036f 100644
--- a/src/android/InAppBrowser.java
+++ b/src/android/InAppBrowser.java
@@ -19,9 +19,8 @@
 package org.apache.cordova.inappbrowser;
 
 import android.annotation.SuppressLint;
-import android.app.Dialog;
+import org.apache.cordova.inappbrowser.InAppBrowserDialog;
 import android.content.Context;
-import android.content.DialogInterface;
 import android.content.Intent;
 import android.content.res.Resources;
 import android.graphics.Bitmap;
@@ -80,7 +79,7 @@ public class InAppBrowser extends CordovaPlugin {
     private static final String CLEAR_ALL_CACHE = "clearcache";
     private static final String CLEAR_SESSION_CACHE = "clearsessioncache";
 
-    private Dialog dialog;
+    private InAppBrowserDialog dialog;
     private WebView inAppWebView;
     private EditText edittext;
     private CallbackContext callbackContext;
@@ -337,12 +336,21 @@ public class InAppBrowser extends CordovaPlugin {
         this.cordova.getActivity().runOnUiThread(new Runnable() {
             @Override
             public void run() {
-                childView.loadUrl("about:blank");
+                childView.setWebViewClient(new WebViewClient() {
+                    // NB: wait for about:blank before dismissing
+                    public void onPageFinished(WebView view, String url) {
                 if (dialog != null) {
                     dialog.dismiss();
                 }
             }
         });
+                // NB: From SDK 19: "If you call methods on WebView from any thread 
+                // other than your app's UI thread, it can cause unexpected results."
+                // http://developer.android.com/guide/webapps/migrating.html#Threads
+                childView.loadUrl("about:blank");
+            }
+        });
+
         try {
             JSONObject obj = new JSONObject();
             obj.put("type", EXIT_EVENT);
@@ -350,7 +358,6 @@ public class InAppBrowser extends CordovaPlugin {
         } catch (JSONException ex) {
             Log.d(LOG_TAG, "Should never happen");
         }
-        
     }
 
     /**
@@ -398,6 +405,10 @@ public class InAppBrowser extends CordovaPlugin {
         return this.showLocationBar;
     }
 
+    private InAppBrowser getInAppBrowser(){
+        return this;
+    }
+
     /**
      * Display a new browser with the specified URL.
      *
@@ -448,15 +459,11 @@ public class InAppBrowser extends CordovaPlugin {
 
             public void run() {
                 // Let's create the main dialog
-                dialog = new Dialog(cordova.getActivity(), android.R.style.Theme_NoTitleBar);
+                dialog = new InAppBrowserDialog(cordova.getActivity(), android.R.style.Theme_NoTitleBar);
                 dialog.getWindow().getAttributes().windowAnimations = android.R.style.Animation_Dialog;
                 dialog.requestWindowFeature(Window.FEATURE_NO_TITLE);
                 dialog.setCancelable(true);
-                dialog.setOnDismissListener(new DialogInterface.OnDismissListener() {
-                        public void onDismiss(DialogInterface dialog) {
-                            closeDialog();
-                        }
-                });
+                dialog.setInAppBroswer(getInAppBrowser());
 
                 // Main container layout
                 LinearLayout main = new LinearLayout(cordova.getActivity());

http://git-wip-us.apache.org/repos/asf/cordova-plugin-inappbrowser/blob/6f373f7e/src/android/InAppBrowserDialog.java
----------------------------------------------------------------------
diff --git a/src/android/InAppBrowserDialog.java b/src/android/InAppBrowserDialog.java
new file mode 100644
index 0000000..124e211
--- /dev/null
+++ b/src/android/InAppBrowserDialog.java
@@ -0,0 +1,54 @@
+/*
+       Licensed to the Apache Software Foundation (ASF) under one
+       or more contributor license agreements.  See the NOTICE file
+       distributed with this work for additional information
+       regarding copyright ownership.  The ASF licenses this file
+       to you under the Apache License, Version 2.0 (the
+       "License"); you may not use this file except in compliance
+       with the License.  You may obtain a copy of the License at
+
+         http://www.apache.org/licenses/LICENSE-2.0
+
+       Unless required by applicable law or agreed to in writing,
+       software distributed under the License is distributed on an
+       "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+       KIND, either express or implied.  See the License for the
+       specific language governing permissions and limitations
+       under the License.
+*/
+package org.apache.cordova.inappbrowser;
+
+import android.app.AlertDialog;
+import android.app.Dialog;
+import android.content.Context;
+import android.util.Log;
+
+import org.json.JSONException;
+import org.json.JSONObject;
+
+/**
+ * Created by Oliver on 22/11/2013.
+ */
+public class InAppBrowserDialog extends Dialog {
+    Context context;
+    InAppBrowser inAppBrowser = null;
+
+    public InAppBrowserDialog(Context context, int theme) {
+        super(context, theme);
+        this.context = context;
+    }
+
+    public void setInAppBroswer(InAppBrowser browser) {
+        this.inAppBrowser = browser;
+    }
+
+    public void onBackPressed () {
+        if (this.inAppBrowser == null) {
+            this.dismiss();
+        } else {
+            // better to go through the in inAppBrowser
+            // because it does a clean up
+            this.inAppBrowser.closeDialog();
+        }
+    }
+}