Making sure that sample stub and skeleton classes inherit from a common interface
authorrtrimana <rtrimana@uci.edu>
Fri, 28 Oct 2016 16:01:50 +0000 (09:01 -0700)
committerrtrimana <rtrimana@uci.edu>
Fri, 28 Oct 2016 16:01:50 +0000 (09:01 -0700)
iotjava/iotrmi/C++/sample/TestClass.cpp
iotjava/iotrmi/C++/sample/TestClass.hpp
iotjava/iotrmi/C++/sample/TestClassInterface.hpp
iotjava/iotrmi/C++/sample/TestClass_Skeleton.hpp
iotjava/iotrmi/C++/sample/TestClass_Stub.cpp
iotjava/iotrmi/C++/sample/TestClass_Stub.hpp
iotjava/iotrmi/Java/sample/TestClass_Skeleton.java
iotjava/iotrmi/Java/sample/TestClass_Stub.java

index d9229ab079485286c0681f2ff0d63866b2a7c853..cbaeebab86a317eee9b88734615e3a9efe71ff30 100644 (file)
@@ -10,14 +10,14 @@ int main(int argc, char *argv[])
        TestClassInterface *tc = new TestClass();
        cout << "Return value: " << tc->setAndGetA(123) << endl;
        cout << "Return value: " << tc->setACAndGetA("string", 123) << endl;
        TestClassInterface *tc = new TestClass();
        cout << "Return value: " << tc->setAndGetA(123) << endl;
        cout << "Return value: " << tc->setACAndGetA("string", 123) << endl;
-       /*vector<string> input;
+       vector<string> input;
        input.push_back("123");
        input.push_back("456");
        input.push_back("123");
        input.push_back("456");
-       input.push_back("987");*/
-       vector<int> input;
+       input.push_back("987");
+       /*vector<int> input;
        input.push_back(123);
        input.push_back(456);
        input.push_back(123);
        input.push_back(456);
-       input.push_back(987);
+       input.push_back(987);*/
 
        cout << "Return value: " << tc->sumArray(input) << endl;
 
 
        cout << "Return value: " << tc->sumArray(input) << endl;
 
index 891e44e75d987b9f05883401953d74fe17a7e547..272f1c8c319a6c425e52c9823419aa858923e67f 100644 (file)
@@ -12,8 +12,8 @@ class TestClass : public TestClassInterface {
                void                            setA(int _int);
                void                            setB(float _float);
                void                            setC(string _string);
                void                            setA(int _int);
                void                            setB(float _float);
                void                            setC(string _string);
-               //string                                sumArray(vector<string> newA);
-               int64_t                         sumArray(vector<int> newA);
+               string                          sumArray(vector<string> newA);
+               //int64_t                               sumArray(vector<int> newA);
                int                                     setAndGetA(int newA);
                int                                     setACAndGetA(string newC, int newA);
                //void                          registerCallback(CallBackInterface _cb);
                int                                     setAndGetA(int newA);
                int                                     setACAndGetA(string newC, int newA);
                //void                          registerCallback(CallBackInterface _cb);
@@ -64,7 +64,7 @@ void TestClass::setC(string _string) {
 }
 
 
 }
 
 
-/*string TestClass::sumArray(vector<string> newA) {
+string TestClass::sumArray(vector<string> newA) {
 
        string sum = "";
        int len = newA.size();
 
        string sum = "";
        int len = newA.size();
@@ -72,10 +72,10 @@ void TestClass::setC(string _string) {
                sum = sum + newA[c];
        }
        return sum;
                sum = sum + newA[c];
        }
        return sum;
-}*/
+}
 
 
 
 
-int64_t TestClass::sumArray(vector<int> newA) {
+/*int64_t TestClass::sumArray(vector<int> newA) {
 
        int64_t sum = 0;
        int len = newA.size();
 
        int64_t sum = 0;
        int len = newA.size();
@@ -83,7 +83,7 @@ int64_t TestClass::sumArray(vector<int> newA) {
                sum = sum + newA[c];
        }
        return sum;
                sum = sum + newA[c];
        }
        return sum;
-}
+}*/
 
 
 int TestClass::setAndGetA(int newA) {
 
 
 int TestClass::setAndGetA(int newA) {
index 5ad53a87f49fc11b2c14625d875f27b167188887..9dc3e001c52ce199c7787b9324c6d95662661670 100644 (file)
@@ -8,8 +8,8 @@ class TestClassInterface {
                virtual void    setA(int _int) = 0;
                virtual void    setB(float _float) = 0;
                virtual void    setC(string _string) = 0;
                virtual void    setA(int _int) = 0;
                virtual void    setB(float _float) = 0;
                virtual void    setC(string _string) = 0;
-               //virtual string        sumArray(vector<string> newA) = 0;
-               virtual int64_t sumArray(vector<int> newA) = 0;
+               virtual string  sumArray(vector<string> newA) = 0;
+               //virtual int64_t       sumArray(vector<int> newA) = 0;
                virtual int             setAndGetA(int newA) = 0;
                virtual int             setACAndGetA(string newC, int newA) = 0;
                //virtual void  registerCallback(CallBackInterface _cb);
                virtual int             setAndGetA(int newA) = 0;
                virtual int             setACAndGetA(string newC, int newA) = 0;
                //virtual void  registerCallback(CallBackInterface _cb);
index 052737841dc16a0427f54635a04ef1391b9595d9..d5be54b0cfb9ff882279597b1e0edfca3611f7f3 100644 (file)
@@ -4,12 +4,21 @@
 
 using namespace std;
 
 
 using namespace std;
 
-class TestClass_Skeleton {
+class TestClass_Skeleton : public TestClassInterface {
        public:
                TestClass_Skeleton(TestClassInterface* _tc, int _port);
                ~TestClass_Skeleton();
 
                void    waitRequestInvokeMethod();
        public:
                TestClass_Skeleton(TestClassInterface* _tc, int _port);
                ~TestClass_Skeleton();
 
                void    waitRequestInvokeMethod();
+               void    setA(int _int);
+               void    setB(float _float);
+               void    setC(string _string);
+               string  sumArray(vector<string> newA);
+               //int64_t       sumArray(vector<int> newA);
+               int             setAndGetA(int newA);
+               int             setACAndGetA(string newC, int newA);
+               //void  registerCallback(CallBackInterface _cb);
+               //int   callBack();
 
        private:                
                TestClassInterface              *tc;
 
        private:                
                TestClassInterface              *tc;
@@ -22,8 +31,8 @@ class TestClass_Skeleton {
                        "voidsetA(int)",
                        "voidsetB(float)",
                        "voidsetC(string)",
                        "voidsetA(int)",
                        "voidsetB(float)",
                        "voidsetC(string)",
-                       //"sumArray(string[])",
-                       "sumArray(int[])",
+                       "sumArray(string[])",
+                       //"sumArray(int[])",
                        "intsetAndGetA(int)",
                        "intsetACAndGetA(string,int)",
                        "intcallBack()",
                        "intsetAndGetA(int)",
                        "intsetACAndGetA(string,int)",
                        "intcallBack()",
@@ -64,46 +73,46 @@ void TestClass_Skeleton::waitRequestInvokeMethod() {
                        int param1 = 0;
                        void* paramObj[] = { &param1 };
                        rmiObj->getMethodParams(paramCls, numParam, paramObj);
                        int param1 = 0;
                        void* paramObj[] = { &param1 };
                        rmiObj->getMethodParams(paramCls, numParam, paramObj);
-                       tc->setA(param1);
+                       setA(param1);
                } else if (methodSign.compare("voidsetB(float)") == 0) {
                        string paramCls[] = { "float" };
                        int numParam = 1;
                        float param1 = 0.0;
                        void* paramObj[] = { &param1 };
                        rmiObj->getMethodParams(paramCls, numParam, paramObj);
                } else if (methodSign.compare("voidsetB(float)") == 0) {
                        string paramCls[] = { "float" };
                        int numParam = 1;
                        float param1 = 0.0;
                        void* paramObj[] = { &param1 };
                        rmiObj->getMethodParams(paramCls, numParam, paramObj);
-                       tc->setB(param1);
+                       setB(param1);
                } else if (methodSign.compare("voidsetC(string)") == 0) {
                        string paramCls[] = { "string" };
                        int numParam = 1;
                        string param1 = "";
                        void* paramObj[] = { &param1 };
                        rmiObj->getMethodParams(paramCls, numParam, paramObj);
                } else if (methodSign.compare("voidsetC(string)") == 0) {
                        string paramCls[] = { "string" };
                        int numParam = 1;
                        string param1 = "";
                        void* paramObj[] = { &param1 };
                        rmiObj->getMethodParams(paramCls, numParam, paramObj);
-                       tc->setC(param1);
-               /*} else if (methodSign.compare("sumArray(string[])") == 0) {
+                       setC(param1);
+               } else if (methodSign.compare("sumArray(string[])") == 0) {
                        string paramCls[] = { "string[]" };
                        int numParam = 1;
                        vector<string> param1;
                        void* paramObj[] = { &param1 };
                        rmiObj->getMethodParams(paramCls, numParam, paramObj);
                        string paramCls[] = { "string[]" };
                        int numParam = 1;
                        vector<string> param1;
                        void* paramObj[] = { &param1 };
                        rmiObj->getMethodParams(paramCls, numParam, paramObj);
-                       string retVal = tc->sumArray(param1);
+                       string retVal = sumArray(param1);
                        void* retObj = &retVal;
                        void* retObj = &retVal;
-                       rmiObj->sendReturnObj(retObj, "string");*/
-               } else if (methodSign.compare("sumArray(int[])") == 0) {
+                       rmiObj->sendReturnObj(retObj, "string");
+               /*} else if (methodSign.compare("sumArray(int[])") == 0) {
                        string paramCls[] = { "int[]" };
                        int numParam = 1;
                        vector<int> param1;
                        void* paramObj[] = { &param1 };
                        rmiObj->getMethodParams(paramCls, numParam, paramObj);
                        string paramCls[] = { "int[]" };
                        int numParam = 1;
                        vector<int> param1;
                        void* paramObj[] = { &param1 };
                        rmiObj->getMethodParams(paramCls, numParam, paramObj);
-                       int64_t retVal = tc->sumArray(param1);          
+                       int64_t retVal = sumArray(param1);              
                        void* retObj = &retVal;
                        void* retObj = &retVal;
-                       rmiObj->sendReturnObj(retObj, "long");
+                       rmiObj->sendReturnObj(retObj, "long");*/
                } else if (methodSign.compare("intsetAndGetA(int)") == 0) {
                        string paramCls[] = { "int" };
                        int numParam = 1;
                        int param1 = 0;
                        void* paramObj[] = { &param1 };
                        rmiObj->getMethodParams(paramCls, numParam, paramObj);
                } else if (methodSign.compare("intsetAndGetA(int)") == 0) {
                        string paramCls[] = { "int" };
                        int numParam = 1;
                        int param1 = 0;
                        void* paramObj[] = { &param1 };
                        rmiObj->getMethodParams(paramCls, numParam, paramObj);
-                       int retVal = tc->setAndGetA(param1);
+                       int retVal = setAndGetA(param1);
                        void* retObj = &retVal;
                        rmiObj->sendReturnObj(retObj, "int");
                } else if (methodSign.compare("intsetACAndGetA(string,int)") == 0) {
                        void* retObj = &retVal;
                        rmiObj->sendReturnObj(retObj, "int");
                } else if (methodSign.compare("intsetACAndGetA(string,int)") == 0) {
@@ -113,7 +122,7 @@ void TestClass_Skeleton::waitRequestInvokeMethod() {
                        int param2 = 0;
                        void* paramObj[] = { &param1, &param2 };
                        rmiObj->getMethodParams(paramCls, numParam, paramObj);
                        int param2 = 0;
                        void* paramObj[] = { &param1, &param2 };
                        rmiObj->getMethodParams(paramCls, numParam, paramObj);
-                       int retVal = tc->setACAndGetA(param1, param2);
+                       int retVal = setACAndGetA(param1, param2);
                        void* retObj = &retVal;
                        rmiObj->sendReturnObj(retObj, "int");
                /*} else if (methodSign.compare("voidregisterCallBack(CallBackInterface)") == 0) {
                        void* retObj = &retVal;
                        rmiObj->sendReturnObj(retObj, "int");
                /*} else if (methodSign.compare("voidregisterCallBack(CallBackInterface)") == 0) {
@@ -128,14 +137,56 @@ void TestClass_Skeleton::waitRequestInvokeMethod() {
 }
 
 
 }
 
 
-/*void TestClass_Stub::registerCallback(CallBackInterface _cb) {
+void TestClass_Skeleton::setA(int _int) {
 
 
-       cb = _cb;
+       tc->setA(_int);
 }
 
 
 }
 
 
-int TestClass_Stub::callBack() {
+void TestClass_Skeleton::setB(float _float) {
 
 
-       return cb.printInt();
+       tc->setB(_float);
+}
+
+
+void TestClass_Skeleton::setC(string _string) {
+
+       tc->setC(_string);
+}
+
+
+string TestClass_Skeleton::sumArray(vector<string> newA) {
+
+       return tc->sumArray(newA);;
+}
+
+
+/*int64_t TestClass_Skeleton::sumArray(vector<int> newA) {
+
+       return tc->sumArray(newA);
+}*/
+
+
+int TestClass_Skeleton::setAndGetA(int newA) {
+
+       return tc->setAndGetA(newA);
+}
+
+
+int TestClass_Skeleton::setACAndGetA(string newC, int newA) {
+
+       return tc->setACAndGetA(newC, newA);
+}
+
+
+/*void TestClass_Skeleton::registerCallback(CallBackInterface _cb) {
+
+       tc->registerCallback(_cb);
+}
+
+
+int TestClass_Skeleton::callBack() {
+
+       return tc->callBack();
 }*/
 
 }*/
 
index 7870578175dabcc133043b2927313570c2bb3277..cfb7aa759dcc8aafd80faad7a18e45127e782a1a 100644 (file)
@@ -15,14 +15,14 @@ int main(int argc, char *argv[])
        TestClassInterface *tcStub = new TestClass_Stub(port, address, rev, &bResult);
        cout << "Return value: " << tcStub->setAndGetA(123) << endl;
        cout << "Return value: " << tcStub->setACAndGetA("string", 123) << endl;
        TestClassInterface *tcStub = new TestClass_Stub(port, address, rev, &bResult);
        cout << "Return value: " << tcStub->setAndGetA(123) << endl;
        cout << "Return value: " << tcStub->setACAndGetA("string", 123) << endl;
-       /*vector<string> input;
+       vector<string> input;
        input.push_back("123");
        input.push_back("456");
        input.push_back("123");
        input.push_back("456");
-       input.push_back("987");*/
-       vector<int> input;
+       input.push_back("987");
+       /*vector<int> input;
        input.push_back(123);
        input.push_back(456);
        input.push_back(123);
        input.push_back(456);
-       input.push_back(987);
+       input.push_back(987);*/
 
        cout << "Return value: " << tcStub->sumArray(input) << endl;
 
 
        cout << "Return value: " << tcStub->sumArray(input) << endl;
 
index 1d73cbe2a43d43cd231d2c00f116b067a5ba3b54..97d3db52556a2a0366c8657c7db50e2009e689f6 100644 (file)
@@ -13,8 +13,8 @@ class TestClass_Stub : public TestClassInterface {
                void                            setA(int _int);
                void                            setB(float _float);
                void                            setC(string _string);
                void                            setA(int _int);
                void                            setB(float _float);
                void                            setC(string _string);
-               //string                                sumArray(vector<string> newA);
-               int64_t                         sumArray(vector<int> newA);
+               string                          sumArray(vector<string> newA);
+               //int64_t                               sumArray(vector<int> newA);
                int                                     setAndGetA(int newA);
                int                                     setACAndGetA(string newC, int newA);
                //void                          registerCallback(CallBackInterface _cb);
                int                                     setAndGetA(int newA);
                int                                     setACAndGetA(string newC, int newA);
                //void                          registerCallback(CallBackInterface _cb);
@@ -90,7 +90,7 @@ void TestClass_Stub::setC(string _string) {
 }
 
 
 }
 
 
-/*string TestClass_Stub::sumArray(vector<string> newA) {
+string TestClass_Stub::sumArray(vector<string> newA) {
 
        int numParam = 1;
        string sign = "sumArray(string[])";
 
        int numParam = 1;
        string sign = "sumArray(string[])";
@@ -101,10 +101,10 @@ void TestClass_Stub::setC(string _string) {
        void* retObj = &retVal;
        rmiCall->remoteCall(sign, retType, paramCls, paramObj, numParam, retObj);
        return retVal;
        void* retObj = &retVal;
        rmiCall->remoteCall(sign, retType, paramCls, paramObj, numParam, retObj);
        return retVal;
-}*/
+}
 
 
 
 
-int64_t TestClass_Stub::sumArray(vector<int> newA) {
+/*int64_t TestClass_Stub::sumArray(vector<int> newA) {
 
        int numParam = 1;
        string sign = "sumArray(int[])";
 
        int numParam = 1;
        string sign = "sumArray(int[])";
@@ -115,7 +115,7 @@ int64_t TestClass_Stub::sumArray(vector<int> newA) {
        void* retObj = &retVal;
        rmiCall->remoteCall(sign, retType, paramCls, paramObj, numParam, retObj);
        return retVal;
        void* retObj = &retVal;
        rmiCall->remoteCall(sign, retType, paramCls, paramObj, numParam, retObj);
        return retVal;
-}
+}*/
 
 
 
 
 
 
index 07dbda879477e316a346209cc3b7ce8047d5d564..7856cdf48c1aceb6d169cc3599d25eb58bb61997 100644 (file)
@@ -6,7 +6,7 @@ import iotrmi.Java.IoTRMIObject;
 
 import java.util.Arrays;
 
 
 import java.util.Arrays;
 
-public class TestClass_Skeleton {
+public class TestClass_Skeleton implements TestClassInterface {
 
        private String[] methodSignatures = {
 
 
        private String[] methodSignatures = {
 
@@ -53,34 +53,34 @@ public class TestClass_Skeleton {
                        if (methodSign.equals("voidsetA(int)")) {
                                paramObj = rmiObj.getMethodParams(new Class<?>[] { int.class }, 
                                        new Class<?>[] { null }, new Class<?>[] { null });
                        if (methodSign.equals("voidsetA(int)")) {
                                paramObj = rmiObj.getMethodParams(new Class<?>[] { int.class }, 
                                        new Class<?>[] { null }, new Class<?>[] { null });
-                               tc.setA((int) paramObj[0]);
+                               setA((int) paramObj[0]);
                        } else if (methodSign.equals("voidsetB(float)")) {
                                paramObj = rmiObj.getMethodParams(new Class<?>[] { float.class }, 
                                        new Class<?>[] { null }, new Class<?>[] { null });
                        } else if (methodSign.equals("voidsetB(float)")) {
                                paramObj = rmiObj.getMethodParams(new Class<?>[] { float.class }, 
                                        new Class<?>[] { null }, new Class<?>[] { null });
-                               tc.setB((float) paramObj[0]);
+                               setB((float) paramObj[0]);
                        } else if (methodSign.equals("voidsetC(string)")) {
                                paramObj = rmiObj.getMethodParams(new Class<?>[] { String.class }, 
                                        new Class<?>[] { null }, new Class<?>[] { null });
                        } else if (methodSign.equals("voidsetC(string)")) {
                                paramObj = rmiObj.getMethodParams(new Class<?>[] { String.class }, 
                                        new Class<?>[] { null }, new Class<?>[] { null });
-                               tc.setC((String) paramObj[0]);
+                               setC((String) paramObj[0]);
                        } else if (methodSign.equals("sumArray(string[])")) {
                                paramObj = rmiObj.getMethodParams(new Class<?>[] { String[].class }, 
                                        new Class<?>[] { null }, new Class<?>[] { null });
                        } else if (methodSign.equals("sumArray(string[])")) {
                                paramObj = rmiObj.getMethodParams(new Class<?>[] { String[].class }, 
                                        new Class<?>[] { null }, new Class<?>[] { null });
-                               retObj = tc.sumArray((String[]) paramObj[0]);
+                               retObj = sumArray((String[]) paramObj[0]);
                        } else if (methodSign.equals("intsetAndGetA(int)")) {
                                paramObj = rmiObj.getMethodParams(new Class<?>[] { int.class }, 
                                        new Class<?>[] { null }, new Class<?>[] { null });
                        } else if (methodSign.equals("intsetAndGetA(int)")) {
                                paramObj = rmiObj.getMethodParams(new Class<?>[] { int.class }, 
                                        new Class<?>[] { null }, new Class<?>[] { null });
-                               retObj = tc.setAndGetA((int) paramObj[0]);
+                               retObj = setAndGetA((int) paramObj[0]);
                        } else if (methodSign.equals("intsetACAndGetA(string,int)")) {
                                paramObj = rmiObj.getMethodParams(new Class<?>[] { String.class, int.class }, 
                                        new Class<?>[] { null, null }, new Class<?>[] { null, null });
                        } else if (methodSign.equals("intsetACAndGetA(string,int)")) {
                                paramObj = rmiObj.getMethodParams(new Class<?>[] { String.class, int.class }, 
                                        new Class<?>[] { null, null }, new Class<?>[] { null, null });
-                               retObj = tc.setACAndGetA((String) paramObj[0], (int) paramObj[1]);
+                               retObj = setACAndGetA((String) paramObj[0], (int) paramObj[1]);
                        } else if (methodSign.equals("voidregisterCallBack(CallBackInterface)")) {
                                paramObj = rmiObj.getMethodParams(new Class<?>[] { int.class, String.class, int.class }, 
                                        new Class<?>[] { null, null, null }, new Class<?>[] { null, null, null });
                                CallBackInterface cbstub = new CallBack_Stub((int) paramObj[0], (String) paramObj[1], (int) paramObj[2]);
                        } else if (methodSign.equals("voidregisterCallBack(CallBackInterface)")) {
                                paramObj = rmiObj.getMethodParams(new Class<?>[] { int.class, String.class, int.class }, 
                                        new Class<?>[] { null, null, null }, new Class<?>[] { null, null, null });
                                CallBackInterface cbstub = new CallBack_Stub((int) paramObj[0], (String) paramObj[1], (int) paramObj[2]);
-                               tc.registerCallback((CallBackInterface) cbstub);
+                               registerCallback((CallBackInterface) cbstub);
                        } else if (methodSign.equals("intcallBack()")) {
                        } else if (methodSign.equals("intcallBack()")) {
-                               retObj = tc.callBack();
+                               retObj = callBack();
                        } else
                                throw new Error("Signature un-recognized!");
 
                        } else
                                throw new Error("Signature un-recognized!");
 
@@ -90,6 +90,54 @@ public class TestClass_Skeleton {
                        System.out.println("Servicing remote call for method: " + methodSign);
                }
        }
                        System.out.println("Servicing remote call for method: " + methodSign);
                }
        }
+       
+       
+       public void setA(int _int) {
+               
+               tc.setA(_int);
+       }
+       
+       
+       public void setB(float _float) {
+               
+               tc.setB(_float);
+       }
+       
+       
+       public void setC(String _string) {
+               
+               tc.setC(_string);
+       }
+       
+       
+       public String sumArray(String[] newA) {
+               
+               return tc.sumArray(newA);
+       }
+       
+       
+       public int setAndGetA(int newA) {
+               
+               return tc.setAndGetA(newA);
+       }
+       
+       
+       public int setACAndGetA(String newC, int newA) {
+               
+               return tc.setACAndGetA(newC, newA);
+       }
+       
+       
+       public void registerCallback(CallBackInterface _cb) {
+               
+               tc.registerCallback(_cb);
+       }
+       
+       
+       public int callBack() {
+               
+               return tc.callBack();
+       }
 
 
        public static void main(String[] args) throws Exception {
 
 
        public static void main(String[] args) throws Exception {
index 39411a75f64f8bc4927f7e11291923d203916231..31d20a2fc87e3e1ece8d29d0ab29659ae39185d5 100644 (file)
@@ -159,9 +159,9 @@ public class TestClass_Stub implements TestClassInterface {
                System.out.println("Return value: " + tcstub.setACAndGetA("string", 123));
                System.out.println("Return value: " + tcstub.sumArray(new String[] { "123", "456", "987" }));
 
                System.out.println("Return value: " + tcstub.setACAndGetA("string", 123));
                System.out.println("Return value: " + tcstub.sumArray(new String[] { "123", "456", "987" }));
 
-               CallBack cb = new CallBack(23);
+               /*CallBack cb = new CallBack(23);
                tcstub.registerCallback(cb);
                tcstub.registerCallback(cb);
-               System.out.println("Return value from callback: " + tcstub.callBack());
+               System.out.println("Return value from callback: " + tcstub.callBack());*/
                //System.out.println("Return value: " + tcstub.setAndGetA(1234));
        }
 }
                //System.out.println("Return value: " + tcstub.setAndGetA(1234));
        }
 }