You are viewing a plain text version of this content. The canonical link for it is here.
Posted to java-dev@axis.apache.org by na...@apache.org on 2006/03/29 05:09:43 UTC
svn commit: r389661 - in /webservices/axis2/trunk/c:
include/axis2_om_output.h include/axis2_om_text.h
modules/xml/om/axis2_om_output_format.h modules/xml/om/om_output.c
modules/xml/om/om_output_format.c
Author: nandika
Date: Tue Mar 28 19:09:41 2006
New Revision: 389661
URL: http://svn.apache.org/viewcvs?rev=389661&view=rev
Log:
om_output_format.c and .h files removed , the necessary functions in that file was moved to om_output.c file
Removed:
webservices/axis2/trunk/c/modules/xml/om/axis2_om_output_format.h
webservices/axis2/trunk/c/modules/xml/om/om_output_format.c
Modified:
webservices/axis2/trunk/c/include/axis2_om_output.h
webservices/axis2/trunk/c/include/axis2_om_text.h
webservices/axis2/trunk/c/modules/xml/om/om_output.c
Modified: webservices/axis2/trunk/c/include/axis2_om_output.h
URL: http://svn.apache.org/viewcvs/webservices/axis2/trunk/c/include/axis2_om_output.h?rev=389661&r1=389660&r2=389661&view=diff
==============================================================================
--- webservices/axis2/trunk/c/include/axis2_om_output.h (original)
+++ webservices/axis2/trunk/c/include/axis2_om_output.h Tue Mar 28 19:09:41 2006
@@ -51,10 +51,10 @@
{
/**
* free om_output
- *@param om_output om_output struct
- *@param env environment
- *@return status code AXIS2_SUCCESS on success,
- * AXIS2_FAILURE otherwise
+ * @param om_output om_output struct
+ * @param env environment
+ * @return status code AXIS2_SUCCESS on success,
+ * AXIS2_FAILURE otherwise
*/
axis2_status_t (AXIS2_CALL *
free_fn)(axis2_om_output_t *om_output,
@@ -62,6 +62,9 @@
/**
* If the xml to be serialized is soap 11, this property is set to true
+ * @param om_output pointer to om_output struct
+ * @param env environment must not be NULL
+ * @returns the output soap version
*/
axis2_bool_t (AXIS2_CALL *
is_soap11)(axis2_om_output_t *om_output,
@@ -127,10 +130,13 @@
*/
axis2_xml_writer_t* (AXIS2_CALL *
get_xml_writer)(axis2_om_output_t *om_output,
- axis2_env_t **env);
- /**
- * returns the content_type property
- */
+ axis2_env_t **env); /**
+ * returns the content type
+ * for soap11 'text/xml' etc..
+ * @param om_output
+ * @param env environemnt
+ * @returns content id
+ */
axis2_char_t* (AXIS2_CALL *
get_content_type)(axis2_om_output_t *om_output,
axis2_env_t **env);
@@ -142,13 +148,31 @@
write_xml_version_encoding)(axis2_om_output_t *om_output,
axis2_env_t **env);
- axis2_bool_t (AXIS2_CALL *is_optimized)
- (axis2_om_output_t *om_output,
- axis2_env_t **env);
-
- axis2_char_t* (AXIS2_CALL *get_next_content_id)
- (axis2_om_output_t *om_output,
- axis2_env_t **env);
+ /**
+ * @returns whether the output is to be optimized
+ */
+ axis2_bool_t (AXIS2_CALL *
+ is_optimized)(axis2_om_output_t *om_output,
+ axis2_env_t **env);
+
+ /** returns the next content id
+ */
+ axis2_char_t* (AXIS2_CALL *
+ get_next_content_id)(axis2_om_output_t *om_output,
+ axis2_env_t **env);
+
+ /**
+ * root content id
+ */
+ axis2_char_t* (AXIS2_CALL *
+ get_root_content_id)(axis2_om_output_t *om_output,
+ axis2_env_t **env);
+
+
+ axis2_char_t* (AXIS2_CALL *
+ get_mime_boundry)(axis2_om_output_t *om_output,
+ axis2_env_t **env);
+
};
@@ -236,6 +260,12 @@
#define AXIS2_OM_OUTPUT_GET_NEXT_CONTENT_ID(om_output, env) \
((om_output)->ops->get_next_content_id(om_output, env))
+
+#define AXIS2_OM_OUTPUT_GET_ROOT_CONTENT_ID(om_output, env) \
+ ((om_output)->ops->get_root_content_id(om_output, env))
+
+#define AXIS2_OM_OUTPUT_GET_MIME_BOUNDRY(om_output, env) \
+ ((om_output)->ops->get_mime_boundry(om_output, env))
/** @} */
Modified: webservices/axis2/trunk/c/include/axis2_om_text.h
URL: http://svn.apache.org/viewcvs/webservices/axis2/trunk/c/include/axis2_om_text.h?rev=389661&r1=389660&r2=389661&view=diff
==============================================================================
--- webservices/axis2/trunk/c/include/axis2_om_text.h (original)
+++ webservices/axis2/trunk/c/include/axis2_om_text.h Tue Mar 28 19:09:41 2006
@@ -90,16 +90,28 @@
axis2_char_t* (AXIS2_CALL *
get_value)(struct axis2_om_text *om_text,
axis2_env_t **env);
-
+ /**
+ * set optimized
+ * @param om_text pointer to om_text struct
+ * @param env environment
+ * @optimize optimize value
+ * @returns AXIS2_SUCCESS
+ */
axis2_status_t (AXIS2_CALL *
set_optimize)(struct axis2_om_text *om_text,
- axis2_env_t **env,
- const axis2_bool_t optimize);
+ axis2_env_t **env,
+ axis2_bool_t optimize);
+ /**
+ * @param om_text text value
+ * @param env environment
+ * @param is_binary
+ * @returns AXIS2_SUCCESS
+ */
axis2_status_t (AXIS2_CALL *
set_is_binary)(struct axis2_om_text *om_text,
- axis2_env_t **env,
- const axis2_bool_t is_binary);
+ axis2_env_t **env,
+ axis2_bool_t is_binary);
} axis2_om_text_ops_t;
@@ -145,13 +157,15 @@
/** set text value */
#define AXIS2_OM_TEXT_SET_VALUE(om_text, env, value) \
((om_text)->ops->set_value(om_text, env, value))
+
+/** set whether it is to be optimized */
#define AXIS2_OM_TEXT_SET_OPTIMIZE(om_text, env, optimize) \
((om_text)->ops->set_optimize(om_text, env, optimize))
+
+/** set whether it binary */
#define AXIS2_OM_TEXT_SET_IS_BINARY(om_text, env, is_binary) \
((om_text)->ops->set_is_binary(om_text, env, is_binary))
-
-
/** @} */
#ifdef __cplusplus
Modified: webservices/axis2/trunk/c/modules/xml/om/om_output.c
URL: http://svn.apache.org/viewcvs/webservices/axis2/trunk/c/modules/xml/om/om_output.c?rev=389661&r1=389660&r2=389661&view=diff
==============================================================================
--- webservices/axis2/trunk/c/modules/xml/om/om_output.c (original)
+++ webservices/axis2/trunk/c/modules/xml/om/om_output.c Tue Mar 28 19:09:41 2006
@@ -18,34 +18,49 @@
#include <stdarg.h>
#include <axis2_string.h>
#include <axis2_xml_writer.h>
-#include <axis2_mime_output.h>
-#include <axis2_om_output_format.h>
#include <axis2_om_text.h>
#include <axis2_array_list.h>
-/*#define AXIS2_DEFAULT_CHAR_SET_ENCODING "UTF-8"*/
-/*#define AXIS2_DEFAULT_CHAR_SET_ENCODING "ISO-8859-1"*/
+#include <axis2_uuid_gen.h>
+
+#define AXIS2_DEFAULT_CHAR_SET_ENCODING "UTF-8"
+/** also defined in axis2_soap.h */
+
+#define _AXIS2_SOAP11_CONTENT_TYPE "text/xml"
+#define _AXIS2_SOAP12_CONTEXT_TYPE "application/soap+xml"
+
+/** max args for om_output_write function */
#define MAX_ARGS 4
+
/****************************** impl struct ***********************************/
typedef struct axis2_om_output_impl_t
{
axis2_om_output_t om_output;
+
/** axis2_xml_writer. any xml writer which
implemet axis2_xml_writer.h interface */
axis2_xml_writer_t *xml_writer;
- /* following fields are not used currently but will be used in the future */
axis2_bool_t do_optimize;
+
axis2_char_t *mime_boundary;
+
axis2_char_t *root_content_id;
+
int next_id;
+
+ axis2_char_t *next_content_id;
+
axis2_bool_t is_soap11;
+
axis2_char_t *char_set_encoding;
- /* xml version */
+
axis2_char_t *xml_version;
+
axis2_bool_t ignore_xml_declaration;
axis2_array_list_t *binary_node_list;
+
}axis2_om_output_impl_t;
/************************ Macro ***********************************************/
@@ -63,13 +78,12 @@
axis2_env_t **env);
axis2_bool_t AXIS2_CALL
-axis2_om_output_is_ignore_xml_declaration
- (axis2_om_output_t *om_output,
- axis2_env_t **env);
+axis2_om_output_is_ignore_xml_declaration(axis2_om_output_t *om_output,
+ axis2_env_t **env);
axis2_status_t AXIS2_CALL
axis2_om_output_set_ignore_xml_declaration
- (axis2_om_output_t *om_output,
+ (axis2_om_output_t *om_output,
axis2_env_t **env,
axis2_bool_t ignore_xml_dec);
@@ -88,49 +102,63 @@
axis2_env_t **env);
axis2_status_t AXIS2_CALL
-axis2_om_output_set_char_set_encoding
- (axis2_om_output_t *om_output,
- axis2_env_t **env,
- axis2_char_t *char_set_encoding);
+axis2_om_output_set_char_set_encoding(axis2_om_output_t *om_output,
+ axis2_env_t **env,
+ axis2_char_t *char_set_encoding);
axis2_char_t* AXIS2_CALL
-axis2_om_output_get_char_set_encoding
- (axis2_om_output_t *om_output,
- axis2_env_t **env);
+axis2_om_output_get_char_set_encoding(axis2_om_output_t *om_output,
+ axis2_env_t **env);
axis2_status_t AXIS2_CALL
-axis2_om_output_set_do_optimize
- (axis2_om_output_t *om_output,
- axis2_env_t **env,
- axis2_bool_t optimize);
+axis2_om_output_set_do_optimize(axis2_om_output_t *om_output,
+ axis2_env_t **env,
+ axis2_bool_t optimize);
axis2_bool_t AXIS2_CALL
-axis2_om_output_is_optimized(axis2_om_output_t *om_output,axis2_env_t **env);
+axis2_om_output_is_optimized(axis2_om_output_t *om_output,
+ axis2_env_t **env);
axis2_xml_writer_t* AXIS2_CALL
-axis2_om_output_get_xml_writer
- (axis2_om_output_t *om_output,
- axis2_env_t **env);
-
+axis2_om_output_get_xml_writer(axis2_om_output_t *om_output,
+ axis2_env_t **env);
+
axis2_status_t AXIS2_CALL
axis2_om_output_write_xml_version_encoding(axis2_om_output_t *om_output,
axis2_env_t **env);
-axis2_status_t AXIS2_CALL
-axis2_om_output_flush(axis2_om_output_t *om_output,
- axis2_env_t **env);
axis2_char_t* AXIS2_CALL
axis2_om_output_get_next_content_id(axis2_om_output_t *om_output,
- axis2_env_t **env);
-
+ axis2_env_t **env);
+
+axis2_char_t* AXIS2_CALL
+axis2_om_output_get_root_content_id(axis2_om_output_t *om_output,
+ axis2_env_t **env);
+
+axis2_char_t* AXIS2_CALL
+axis2_om_output_get_mime_boundry(axis2_om_output_t *om_output,
+ axis2_env_t **env);
+
+axis2_status_t AXIS2_CALL
+axis2_om_output_flush(axis2_om_output_t *om_output,
+ axis2_env_t **env);
+
+axis2_char_t* AXIS2_CALL
+axis2_om_output_get_content_type(axis2_om_output_t *om_output,
+ axis2_env_t **env);
axis2_status_t AXIS2_CALL
axis2_om_output_write_optimized(axis2_om_output_t *om_output,
- axis2_env_t **env, axis2_om_text_t *om_text);
+ axis2_env_t **env,
+ axis2_om_text_t *om_text);
+
+
+
/*********************** end function prototypes ******************************/
AXIS2_DECLARE(axis2_om_output_t *)
-axis2_om_output_create (axis2_env_t **env, axis2_xml_writer_t *xml_writer)
+axis2_om_output_create (axis2_env_t **env,
+ axis2_xml_writer_t *xml_writer)
{
axis2_om_output_impl_t *om_output_impl = NULL;
AXIS2_ENV_CHECK(env, NULL);
@@ -149,17 +177,37 @@
om_output_impl->xml_writer = xml_writer;
om_output_impl->do_optimize = AXIS2_FALSE;
- om_output_impl->mime_boundary = 0;
- om_output_impl->root_content_id = 0;
+
+ om_output_impl->mime_boundary = NULL;
+
+ om_output_impl->root_content_id = NULL;
+
+ om_output_impl->next_content_id = NULL;
+
om_output_impl->next_id = 0;
+
om_output_impl->is_soap11 = AXIS2_TRUE;
+
om_output_impl->char_set_encoding = NULL;
+
om_output_impl->xml_version = NULL;
+
om_output_impl->ignore_xml_declaration = AXIS2_TRUE;
+
om_output_impl->binary_node_list = NULL;
om_output_impl->om_output.ops = NULL;
+ om_output_impl->char_set_encoding = AXIS2_STRDUP(
+ AXIS2_DEFAULT_CHAR_SET_ENCODING, env);
+
+ if(!(om_output_impl->char_set_encoding))
+ {
+ AXIS2_FREE((*env)->allocator, om_output_impl);
+ AXIS2_ERROR_SET((*env)->error, AXIS2_ERROR_NO_MEMORY, AXIS2_FAILURE);
+ return NULL;
+ }
+
om_output_impl->om_output.ops = (axis2_om_output_ops_t *)AXIS2_MALLOC(
(*env)->allocator,
sizeof(axis2_om_output_ops_t));
@@ -202,10 +250,18 @@
om_output_impl->om_output.ops->write_xml_version_encoding =
axis2_om_output_write_xml_version_encoding;
- om_output_impl->om_output.ops->get_next_content_id = axis2_om_output_get_next_content_id;
+ om_output_impl->om_output.ops->get_next_content_id = axis2_om_output_get_next_content_id;
+
+ om_output_impl->om_output.ops->get_content_type =
+ axis2_om_output_get_content_type;
+
+ om_output_impl->om_output.ops->get_root_content_id =
+ axis2_om_output_get_root_content_id;
- om_output_impl->char_set_encoding = AXIS2_STRDUP(
- AXIS2_DEFAULT_CHAR_SET_ENCODING, env);
+ om_output_impl->om_output.ops->get_mime_boundry =
+ axis2_om_output_get_mime_boundry;
+
+
return &(om_output_impl->om_output);
}
@@ -227,7 +283,23 @@
{
AXIS2_FREE((*env)->allocator, om_output_impl->char_set_encoding);
om_output_impl->char_set_encoding = NULL;
- }
+ }
+ if(NULL != om_output_impl->mime_boundary)
+ {
+ AXIS2_FREE((*env)->allocator, om_output_impl->mime_boundary);
+ om_output_impl->mime_boundary = NULL;
+ }
+ if(NULL != om_output_impl->next_content_id)
+ {
+ AXIS2_FREE((*env)->allocator, om_output_impl->next_content_id);
+ om_output_impl->next_content_id = NULL;
+ }
+ if(NULL != om_output_impl->root_content_id)
+ {
+ AXIS2_FREE((*env)->allocator, om_output_impl->root_content_id);
+ om_output_impl->root_content_id = NULL;
+ }
+
if(NULL != om_output_impl->xml_writer)
{
AXIS2_XML_WRITER_FREE(om_output_impl->xml_writer, env);
@@ -258,7 +330,6 @@
{
AXIS2_ENV_CHECK(env, AXIS2_FAILURE);
return AXIS2_INTF_TO_IMPL(om_output)->ignore_xml_declaration;
-
}
axis2_status_t AXIS2_CALL
@@ -367,10 +438,184 @@
{
AXIS2_ENV_CHECK(env, NULL);
return AXIS2_INTF_TO_IMPL(om_output)->xml_writer;
+}
+
+axis2_bool_t AXIS2_CALL
+axis2_om_output_is_optimized(axis2_om_output_t *om_output,
+ axis2_env_t **env)
+{
+ return AXIS2_INTF_TO_IMPL(om_output)->do_optimize;
+}
-}
+axis2_char_t* AXIS2_CALL
+axis2_om_output_get_content_type(axis2_om_output_t *om_output,
+ axis2_env_t **env)
+{
+ axis2_om_output_impl_t *om_output_impl = NULL;
+ axis2_char_t *soap_content_type = NULL;
+ AXIS2_ENV_CHECK(env, NULL);
+ om_output_impl = AXIS2_INTF_TO_IMPL(om_output);
+ if(AXIS2_TRUE == om_output_impl->do_optimize)
+ {
+ if(AXIS2_TRUE == om_output_impl->is_soap11)
+ {
+ soap_content_type = _AXIS2_SOAP11_CONTENT_TYPE;
+ }
+ else
+ {
+ soap_content_type = _AXIS2_SOAP12_CONTEXT_TYPE;
+ }
+ /**
+ to be implemented
+ return ;
+ */
+ }
+ else
+ {
+ if(AXIS2_TRUE == om_output_impl->is_soap11)
+ {
+ return _AXIS2_SOAP11_CONTENT_TYPE;
+ }
+ else
+ {
+ return _AXIS2_SOAP12_CONTEXT_TYPE;
+ }
+ }
+ return NULL;
+}
+
+axis2_status_t AXIS2_CALL
+axis2_om_output_write_optimized(axis2_om_output_t *om_output,
+ axis2_env_t **env,
+ axis2_om_text_t *om_text)
+{
+ axis2_om_output_impl_t *om_output_impl = NULL;
+ AXIS2_ENV_CHECK(env, AXIS2_FAILURE);
+ om_output_impl = AXIS2_INTF_TO_IMPL(om_output);
+ if(NULL != om_output_impl->binary_node_list)
+ {
+ AXIS2_ARRAY_LIST_ADD(om_output_impl->binary_node_list, env, om_text);
+ }
+ else
+ {
+ om_output_impl->binary_node_list = axis2_array_list_create(env, 5);
+ if(!(om_output_impl->binary_node_list))
+ return AXIS2_FAILURE;
+ AXIS2_ARRAY_LIST_ADD(om_output_impl->binary_node_list, env, om_text);
+ }
+ return AXIS2_SUCCESS;
+}
+
+
+axis2_char_t* AXIS2_CALL
+axis2_om_output_get_next_content_id(axis2_om_output_t *om_output,
+ axis2_env_t **env)
+{
+ axis2_om_output_impl_t *om_output_impl = NULL;
+ axis2_char_t *uuid = NULL;
+ axis2_char_t *temp_str = NULL;
+ axis2_char_t *temp_str1 = NULL;
+ axis2_char_t id[256];
+ AXIS2_ENV_CHECK(env, NULL);
+
+ om_output_impl = AXIS2_INTF_TO_IMPL(om_output_impl);
+
+ om_output_impl->next_id++;
+
+ /** free existing id */
+ if(NULL != om_output_impl->next_content_id)
+ {
+ AXIS2_FREE((*env)->allocator, om_output_impl->next_content_id);
+ om_output_impl->next_content_id = NULL;
+ }
+
+ uuid = axis2_uuid_gen(env);
+ if(!uuid)
+ return NULL;
+
+ sprintf(id, "%d", om_output_impl->next_id);
+
+ temp_str = AXIS2_STRACAT(id, ".", env);
+ temp_str1 = AXIS2_STRACAT(temp_str, uuid, env);
+ om_output_impl->next_content_id = AXIS2_STRACAT(temp_str1, "@apache.org", env);
+ if(NULL != temp_str)
+ {
+ AXIS2_FREE((*env)->allocator, temp_str);
+ temp_str = NULL;
+ }
+ if(NULL != temp_str1)
+ {
+ AXIS2_FREE((*env)->allocator, temp_str1);
+ temp_str1 = NULL;
+ }
+ if(NULL != uuid)
+ {
+ AXIS2_FREE((*env)->allocator, uuid);
+ uuid = NULL;
+ }
+ return om_output_impl->next_content_id;
+}
+axis2_char_t* AXIS2_CALL
+axis2_om_output_get_root_content_id(axis2_om_output_t *om_output,
+ axis2_env_t **env)
+{
+ axis2_om_output_impl_t *om_output_impl = NULL;
+ axis2_char_t *temp_str = NULL;
+ axis2_char_t *uuid = NULL;
+ AXIS2_ENV_CHECK(env, NULL);
+
+ om_output_impl = AXIS2_INTF_TO_IMPL(om_output);
+ if(NULL == om_output_impl->root_content_id)
+ {
+ uuid = axis2_uuid_gen(env);
+
+ temp_str = AXIS2_STRACAT("0.", uuid, env);
+
+ om_output_impl->root_content_id =
+ AXIS2_STRACAT(temp_str, "@apache.org", env);
+
+ if(NULL != temp_str)
+ {
+ AXIS2_FREE((*env)->allocator, temp_str);
+ temp_str = NULL;
+ }
+ if(NULL != uuid)
+ {
+ AXIS2_FREE((*env)->allocator, uuid);
+ uuid = NULL;
+ }
+ }
+
+ return om_output_impl->root_content_id;
+}
+
+axis2_char_t* AXIS2_CALL
+axis2_om_output_get_mime_boundry(axis2_om_output_t *om_output,
+ axis2_env_t **env)
+{
+ axis2_om_output_impl_t *om_output_impl = NULL;
+ axis2_char_t *uuid = NULL;
+
+ AXIS2_ENV_CHECK(env, NULL);
+
+ om_output_impl = AXIS2_INTF_TO_IMPL(om_output);
+
+ if(NULL == om_output_impl->mime_boundary)
+ {
+ uuid = axis2_uuid_gen(env);
+
+ om_output_impl->mime_boundary = AXIS2_STRACAT("MIMEBoundary", uuid, env);
+ if(NULL != uuid)
+ {
+ AXIS2_FREE((*env)->allocator, uuid);
+ uuid = NULL;
+ }
+ }
+ return om_output_impl->mime_boundary;
+}
+
/******************************************************************************/
AXIS2_DECLARE(axis2_status_t)
@@ -532,28 +777,11 @@
}
-/*=================================================*/
-axis2_bool_t AXIS2_CALL
-axis2_om_output_is_optimized(axis2_om_output_t *om_output,axis2_env_t **env)
-{
- axis2_bool_t is_optimized = AXIS2_FALSE;
- axis2_om_output_format_t *om_output_format = NULL;
- AXIS2_ENV_CHECK(env, AXIS2_FAILURE);
-
- om_output_format = axis2_om_output_format_create(env);
- is_optimized = AXIS2_OM_OUTPUT_FORMAT_IS_OPTIMIZED(om_output_format, env);
- return is_optimized;
-}
+
+
/*@TODO Following method method must be implemented*/
-axis2_status_t AXIS2_CALL
-axis2_om_output_flush(axis2_om_output_t *om_output,
- axis2_env_t **env)
-{
- AXIS2_ENV_CHECK(env, AXIS2_FAILURE);
-
- return AXIS2_SUCCESS;
-}
+
/*
public void flush() throws XMLStreamException {
xmlWriter.flush();
@@ -574,26 +802,7 @@
}
}
*/
-axis2_char_t* AXIS2_CALL
-axis2_om_output_get_next_content_id(axis2_om_output_t *om_output,
- axis2_env_t **env)
-{
- axis2_om_output_format_t *om_output_format = NULL;
- axis2_char_t *next_content_id = NULL;
- AXIS2_ENV_CHECK(env,NULL);
- om_output_format = axis2_om_output_format_create(env);
- next_content_id = AXIS2_OM_OUTPUT_FORMAT_GET_NEXT_CONTENT_ID(om_output_format, env);
- return next_content_id;
-}
-axis2_status_t AXIS2_CALL
-axis2_om_output_write_optimized(axis2_om_output_t *om_output, axis2_env_t **env, axis2_om_text_t *om_text)
-{
- axis2_om_output_impl_t *om_output_impl = NULL;
- AXIS2_ENV_CHECK(env, AXIS2_FAILURE);
- om_output_impl = AXIS2_INTF_TO_IMPL(om_output);
- om_output_impl->binary_node_list = axis2_array_list_create(env, 5);
- AXIS2_ARRAY_LIST_ADD(om_output_impl->binary_node_list, env, (void *)om_text);
- return AXIS2_SUCCESS;
-}
+
+