001/* ---------------------------------------------------------------------------- 002 * This file was automatically generated by SWIG (http://www.swig.org). 003 * Version 3.0.10 004 * 005 * Do not make changes to this file unless you know what you are doing--modify 006 * the SWIG interface file instead. 007 * ----------------------------------------------------------------------------- */ 008 009package org.sbml.libsbml; 010 011/** 012 * <span class="pkg-marker pkg-color-comp"><a href="group__comp.html">comp</a></span> 013 A reference to an externally-defined model. 014 <p> 015 * The {@link ExternalModelDefinition} class was introduced by the SBML Level 3 016 * <a href='../../../extensions-summary.html#comp'>Hierarchical Model Composition</a> (“comp”) package to define references to {@link Model} 017 * objects defined in other files. 018 <p> 019 * {@link ExternalModelDefinition} objects are model definitions—in and of 020 * themselves, they are definitions of models but not uses of those models. 021 * The class provides a way to declare and identify them so that {@link Model} 022 * objects in the present SBML document can use them in {@link Submodel} objects. 023 <p> 024 * {@link ExternalModelDefinition} contains two required attributes 025 * ('source' and 'id') and three optional attributes 026 * ('modelRef', 'md5' and 'name'). 027 <p> 028 * The 'id' attribute serves to provide a handle for the external 029 * model reference so that {@link Submodel} objects can refer to it. Crucially, 030 * it is not the identifier of the model being referenced; rather, 031 * it is an identifier for this {@link ExternalModelDefinition} object within the 032 * current SBML document. The 'id' attribute takes a required value 033 * of type SId, and must be unique across all {@link Model} and {@link ExternalModelDefinition} 034 * objects present in the document. 035 <p> 036 * {@link ExternalModelDefinition} also has an optional 'name' attribute, of 037 * type 'string'. The 'name' attribute may be used to provide 038 * a human-readable description of the ExternalModelDefintion object. 039 <p> 040 * The required attribute 'source' is used to locate the SBML document 041 * containing an external model definition. The value of this attribute must 042 * be of type anyURI. Since URIs may be either URLs, URNs, or relative or 043 * absolute file locations, this offers flexibility in referencing SBML 044 * documents. In all cases, the 'source' attribute value must refer 045 * specifically to an SBML Level 3 Version 1 document; prior 046 * Levels/Versions of SBML are not supported by this package. The entire 047 * file at the given location is referenced. The 'source' attribute must 048 * have a value for every {@link ExternalModelDefinition} instance. 049 <p> 050 * {@link ExternalModelDefinition}'s optional attribute 'modelRef', of type 051 * SIdRef, is used to identify a {@link Model} or 052 * {@link ExternalModelDefinition} object within the SBML document located at 053 * 'source'. The object referenced may be the main model in the 054 * document, or it may be a model definition contained in the SBML 055 * document's {@link ListOfModelDefinitions} or 056 * {@link ListOfExternalModelDefinitions} lists. Loops are not allowed: it 057 * must be possible to follow a chain of {@link ExternalModelDefinition} objects 058 * to its end in a {@link Model} object. 059 <p> 060 * In core SBML, the 'id' on {@link Model} is an optional attribute, and therefore, 061 * it is possible that the {@link Model} object in a given SBML document does not 062 * have an identifier. In that case, there is no value to give to the 063 * 'modelRef' attribute in {@link ExternalModelDefinition}. If 'modelRef' does not 064 * have a value, then the main model (i.e., the <code><model></code> 065 * element within the <code><sbml></code> element) in the referenced 066 * file is interpreted as being the model referenced by this 067 * {@link ExternalModelDefinition} instance. 068 <p> 069 * Finally, the optional 'md5' attribute takes a string value. If 070 * set, it must be an MD5 checksum value computed over the document 071 * referenced by 'source'. This checksum can serve as a data 072 * integrity check over the contents of the 'source'. Applications 073 * may use this to verify that the contents have not changed since the time 074 * that the {@link ExternalModelDefinition} reference was constructed. 075 */ 076 077public class ExternalModelDefinition extends CompBase { 078 private long swigCPtr; 079 080 protected ExternalModelDefinition(long cPtr, boolean cMemoryOwn) 081 { 082 super(libsbmlJNI.ExternalModelDefinition_SWIGUpcast(cPtr), cMemoryOwn); 083 swigCPtr = cPtr; 084 } 085 086 protected static long getCPtr(ExternalModelDefinition obj) 087 { 088 return (obj == null) ? 0 : obj.swigCPtr; 089 } 090 091 protected static long getCPtrAndDisown (ExternalModelDefinition obj) 092 { 093 long ptr = 0; 094 095 if (obj != null) 096 { 097 ptr = obj.swigCPtr; 098 obj.swigCMemOwn = false; 099 } 100 101 return ptr; 102 } 103 104 protected void finalize() { 105 delete(); 106 } 107 108 public synchronized void delete() { 109 if (swigCPtr != 0) { 110 if (swigCMemOwn) { 111 swigCMemOwn = false; 112 libsbmlJNI.delete_ExternalModelDefinition(swigCPtr); 113 } 114 swigCPtr = 0; 115 } 116 super.delete(); 117 } 118 119 120/** 121 * Creates a new {@link ExternalModelDefinition} with the given level, version, and 122 * package version. 123 <p> 124 * @param level the SBML Level 125 * @param version the Version within the SBML Level 126 * @param pkgVersion the version of the package 127 */ public 128 ExternalModelDefinition(long level, long version, long pkgVersion) throws org.sbml.libsbml.SBMLConstructorException { 129 this(libsbmlJNI.new_ExternalModelDefinition__SWIG_0(level, version, pkgVersion), true); 130 } 131 132 133/** 134 * Creates a new {@link ExternalModelDefinition} with the given level, version, and 135 * package version. 136 <p> 137 * @param level the SBML Level 138 * @param version the Version within the SBML Level 139 * @param pkgVersion the version of the package 140 */ public 141 ExternalModelDefinition(long level, long version) throws org.sbml.libsbml.SBMLConstructorException { 142 this(libsbmlJNI.new_ExternalModelDefinition__SWIG_1(level, version), true); 143 } 144 145 146/** 147 * Creates a new {@link ExternalModelDefinition} with the given level, version, and 148 * package version. 149 <p> 150 * @param level the SBML Level 151 * @param version the Version within the SBML Level 152 * @param pkgVersion the version of the package 153 */ public 154 ExternalModelDefinition(long level) throws org.sbml.libsbml.SBMLConstructorException { 155 this(libsbmlJNI.new_ExternalModelDefinition__SWIG_2(level), true); 156 } 157 158 159/** 160 * Creates a new {@link ExternalModelDefinition} with the given level, version, and 161 * package version. 162 <p> 163 * @param level the SBML Level 164 * @param version the Version within the SBML Level 165 * @param pkgVersion the version of the package 166 */ public 167 ExternalModelDefinition() throws org.sbml.libsbml.SBMLConstructorException { 168 this(libsbmlJNI.new_ExternalModelDefinition__SWIG_3(), true); 169 } 170 171 172/** 173 * Creates a new {@link ExternalModelDefinition} with the given {@link CompPkgNamespaces} 174 * object. 175 <p> 176 * @param compns the namespace to use. 177 */ public 178 ExternalModelDefinition(CompPkgNamespaces compns) throws org.sbml.libsbml.SBMLConstructorException { 179 this(libsbmlJNI.new_ExternalModelDefinition__SWIG_4(CompPkgNamespaces.getCPtr(compns), compns), true); 180 } 181 182 183/** 184 * Copy constructor. 185 <p> 186 * @param source the object to copy. 187 */ public 188 ExternalModelDefinition(ExternalModelDefinition source) throws org.sbml.libsbml.SBMLConstructorException { 189 this(libsbmlJNI.new_ExternalModelDefinition__SWIG_5(ExternalModelDefinition.getCPtr(source), source), true); 190 } 191 192 193/** 194 * Creates and returns a deep copy of this {@link ExternalModelDefinition} object. 195 <p> 196 * @return a (deep) copy of this {@link ExternalModelDefinition} object 197 */ public 198 SBase cloneObject() { 199 long cPtr = libsbmlJNI.ExternalModelDefinition_cloneObject(swigCPtr, this); 200 return (cPtr == 0) ? null : new ExternalModelDefinition(cPtr, true); 201 } 202 203 204/** 205 * Sets the value of the 'id' attribute of this {@link ExternalModelDefinition}. 206 <p> 207 * This method fails if the <code>id</code> is not a valid syntax for an SId. 208 <p> 209 * @param id the identifier to use 210 <p> 211 * <p> 212 * @return integer value indicating success/failure of the 213 * function. The possible values 214 * returned by this function are: 215 * <ul> 216 * <li> {@link libsbmlConstants#LIBSBML_OPERATION_SUCCESS LIBSBML_OPERATION_SUCCESS} 217 * <li> {@link libsbmlConstants#LIBSBML_INVALID_ATTRIBUTE_VALUE LIBSBML_INVALID_ATTRIBUTE_VALUE} 218 * </ul> 219 */ public 220 int setId(String id) { 221 return libsbmlJNI.ExternalModelDefinition_setId(swigCPtr, this, id); 222 } 223 224 225/** 226 * Returns the value of the 'id' attribute of this {@link ExternalModelDefinition}. 227 <p> 228 * @return the name of this {@link ExternalModelDefinition}. 229 */ public 230 String getId() { 231 return libsbmlJNI.ExternalModelDefinition_getId(swigCPtr, this); 232 } 233 234 235/** 236 * Predicate returning <code>true</code> or <code>false</code> depending on whether this 237 * object's 'id' attribute has been set. 238 <p> 239 * <em>Some words of explanation about the</em> 240<code>set</code>/<code>unset</code>/<code>isSet</code> <em>methods</em>: 241The SBML specifications define certain attributes on some classes of 242objects as being optional. This requires an application to be careful 243about the distinction between two cases when reading a model: (1) a given 244attribute has <em>never</em> been set to a value, and therefore should be 245assumed to have the SBML-defined default value if one exists, and (2) a 246given attribute has been set to a value, but the value happens to be an 247empty string. The situation can be ambiguous when reading a model from a 248file or data stream and then examining the data objects that libSBML 249constructs as a result. LibSBML supports these distinctions by providing 250methods to set, unset, and query the status of attributes that are 251optional. The methods have names of the form <code>set</code><em><span 252class="placeholder">Attribute</span></em><code>(...)</code>, 253<code>unset</code><em><span 254class="placeholder">Attribute</span></em><code>()</code>, and 255<code>isSet</code><em><span 256class="placeholder">Attribute</span></em><code>()</code>, where <em><span 257class="placeholder">Attribute</span></em> is the the name of the optional 258attribute in question. 259 260 <p> 261 * @return <code>true</code> if the 'id' attribute of this object has been 262 * set, <code>false</code> otherwise. 263 */ public 264 boolean isSetId() { 265 return libsbmlJNI.ExternalModelDefinition_isSetId(swigCPtr, this); 266 } 267 268 269/** 270 * Unsets the value of the 'id' attribute of this {@link ExternalModelDefinition}. 271 <p> 272 * <p> 273 * @return integer value indicating success/failure of the 274 * function. The possible values 275 * returned by this function are: 276 * <ul> 277 * <li> {@link libsbmlConstants#LIBSBML_OPERATION_SUCCESS LIBSBML_OPERATION_SUCCESS} 278 * <li> {@link libsbmlConstants#LIBSBML_OPERATION_FAILED LIBSBML_OPERATION_FAILED} 279 * </ul> 280 */ public 281 int unsetId() { 282 return libsbmlJNI.ExternalModelDefinition_unsetId(swigCPtr, this); 283 } 284 285 286/** 287 * Sets the value of the 'name' attribute of this {@link ExternalModelDefinition}. 288 <p> 289 * The string in <code>name</code> is copied. 290 <p> 291 * @param name the new name for the {@link ExternalModelDefinition} 292 <p> 293 * <p> 294 * @return integer value indicating success/failure of the 295 * function. The possible values 296 * returned by this function are: 297 * <ul> 298 * <li> {@link libsbmlConstants#LIBSBML_OPERATION_SUCCESS LIBSBML_OPERATION_SUCCESS} 299 * <li> {@link libsbmlConstants#LIBSBML_INVALID_ATTRIBUTE_VALUE LIBSBML_INVALID_ATTRIBUTE_VALUE} 300 * </ul> 301 */ public 302 int setName(String name) { 303 return libsbmlJNI.ExternalModelDefinition_setName(swigCPtr, this, name); 304 } 305 306 307/** 308 * Returns the value of the 'name' attribute of this 309 * {@link ExternalModelDefinition}. 310 <p> 311 * @return the name of this {@link ExternalModelDefinition}. 312 */ public 313 String getName() { 314 return libsbmlJNI.ExternalModelDefinition_getName(swigCPtr, this); 315 } 316 317 318/** 319 * Predicate returning <code>true</code> or <code>false</code> depending on whether this 320 * object's 'name' attribute has been set. 321 <p> 322 * <em>Some words of explanation about the</em> 323<code>set</code>/<code>unset</code>/<code>isSet</code> <em>methods</em>: 324The SBML specifications define certain attributes on some classes of 325objects as being optional. This requires an application to be careful 326about the distinction between two cases when reading a model: (1) a given 327attribute has <em>never</em> been set to a value, and therefore should be 328assumed to have the SBML-defined default value if one exists, and (2) a 329given attribute has been set to a value, but the value happens to be an 330empty string. The situation can be ambiguous when reading a model from a 331file or data stream and then examining the data objects that libSBML 332constructs as a result. LibSBML supports these distinctions by providing 333methods to set, unset, and query the status of attributes that are 334optional. The methods have names of the form <code>set</code><em><span 335class="placeholder">Attribute</span></em><code>(...)</code>, 336<code>unset</code><em><span 337class="placeholder">Attribute</span></em><code>()</code>, and 338<code>isSet</code><em><span 339class="placeholder">Attribute</span></em><code>()</code>, where <em><span 340class="placeholder">Attribute</span></em> is the the name of the optional 341attribute in question. 342 343 <p> 344 * @return <code>true</code> if the 'name' attribute of this object has been 345 * set, <code>false</code> otherwise. 346 */ public 347 boolean isSetName() { 348 return libsbmlJNI.ExternalModelDefinition_isSetName(swigCPtr, this); 349 } 350 351 352/** 353 * Unsets the value of the 'name' attribute of this 354 * {@link ExternalModelDefinition}. 355 <p> 356 * <p> 357 * @return integer value indicating success/failure of the 358 * function. The possible values 359 * returned by this function are: 360 * <ul> 361 * <li> {@link libsbmlConstants#LIBSBML_OPERATION_SUCCESS LIBSBML_OPERATION_SUCCESS} 362 * <li> {@link libsbmlConstants#LIBSBML_OPERATION_FAILED LIBSBML_OPERATION_FAILED} 363 * </ul> 364 */ public 365 int unsetName() { 366 return libsbmlJNI.ExternalModelDefinition_unsetName(swigCPtr, this); 367 } 368 369 370/** 371 * Returns the value of the 'modelRef' attribute of this 372 * {@link ExternalModelDefinition}. 373 <p> 374 * @return the value of the 'modelRef' attribute of this 375 * {@link ExternalModelDefinition}. 376 */ public 377 String getModelRef() { 378 return libsbmlJNI.ExternalModelDefinition_getModelRef(swigCPtr, this); 379 } 380 381 382/** 383 * Predicate returning <code>true</code> or <code>false</code> depending on whether this 384 * {@link ExternalModelDefinition}'s 'modelRef' attribute has been set. 385 <p> 386 * @return <code>true</code> if this {@link ExternalModelDefinition}'s 'modelRef' attribute 387 * has been set, otherwise <code>false</code> is returned. 388 */ public 389 boolean isSetModelRef() { 390 return libsbmlJNI.ExternalModelDefinition_isSetModelRef(swigCPtr, this); 391 } 392 393 394/** 395 * Sets the value of the 'modelRef' attribute of this 396 * {@link ExternalModelDefinition}. Fails if the <code>id</code> is not a valid syntax for an 397 * SIdRef. 398 <p> 399 * <p> 400 * @return integer value indicating success/failure of the 401 * function. The possible values 402 * returned by this function are: 403 * <ul> 404 * <li> {@link libsbmlConstants#LIBSBML_OPERATION_SUCCESS LIBSBML_OPERATION_SUCCESS} 405 * <li> {@link libsbmlConstants#LIBSBML_INVALID_ATTRIBUTE_VALUE LIBSBML_INVALID_ATTRIBUTE_VALUE} 406 * </ul> 407 */ public 408 int setModelRef(String id) { 409 return libsbmlJNI.ExternalModelDefinition_setModelRef(swigCPtr, this, id); 410 } 411 412 413/** 414 * Unsets the value of the 'modelRef' attribute of this 415 * {@link ExternalModelDefinition}. 416 <p> 417 * <p> 418 * @return integer value indicating success/failure of the 419 * function. The possible values 420 * returned by this function are: 421 * <ul> 422 * <li> {@link libsbmlConstants#LIBSBML_OPERATION_SUCCESS LIBSBML_OPERATION_SUCCESS} 423 * <li> {@link libsbmlConstants#LIBSBML_OPERATION_FAILED LIBSBML_OPERATION_FAILED} 424 * </ul> 425 */ public 426 int unsetModelRef() { 427 return libsbmlJNI.ExternalModelDefinition_unsetModelRef(swigCPtr, this); 428 } 429 430 431/** 432 * Returns the value of the 'md5' attribute of this 433 * {@link ExternalModelDefinition}. 434 <p> 435 * @return the value of the 'md5' attribute of this 436 * {@link ExternalModelDefinition}. 437 */ public 438 String getMd5() { 439 return libsbmlJNI.ExternalModelDefinition_getMd5(swigCPtr, this); 440 } 441 442 443/** 444 * Predicate returning <code>true</code> or <code>false</code> depending on whether this 445 * {@link ExternalModelDefinition}'s 'md5' attribute has been set. 446 <p> 447 * @return <code>true</code> if this {@link ExternalModelDefinition}'s 'md5' attribute has 448 * been set, otherwise <code>false</code> is returned. 449 */ public 450 boolean isSetMd5() { 451 return libsbmlJNI.ExternalModelDefinition_isSetMd5(swigCPtr, this); 452 } 453 454 455/** 456 * Sets the value of the 'md5' attribute of this {@link ExternalModelDefinition}. 457 <p> 458 * <p> 459 * @return integer value indicating success/failure of the 460 * function. The possible values 461 * returned by this function are: 462 * <ul> 463 * <li> {@link libsbmlConstants#LIBSBML_OPERATION_SUCCESS LIBSBML_OPERATION_SUCCESS} 464 * <li> {@link libsbmlConstants#LIBSBML_INVALID_ATTRIBUTE_VALUE LIBSBML_INVALID_ATTRIBUTE_VALUE} 465 * </ul> 466 */ public 467 int setMd5(String md5) { 468 return libsbmlJNI.ExternalModelDefinition_setMd5(swigCPtr, this, md5); 469 } 470 471 472/** 473 * Unsets the value of the 'md5' attribute of this {@link ExternalModelDefinition}. 474 <p> 475 * <p> 476 * @return integer value indicating success/failure of the 477 * function. The possible values 478 * returned by this function are: 479 * <ul> 480 * <li> {@link libsbmlConstants#LIBSBML_OPERATION_SUCCESS LIBSBML_OPERATION_SUCCESS} 481 * <li> {@link libsbmlConstants#LIBSBML_OPERATION_FAILED LIBSBML_OPERATION_FAILED} 482 * </ul> 483 */ public 484 int unsetMd5() { 485 return libsbmlJNI.ExternalModelDefinition_unsetMd5(swigCPtr, this); 486 } 487 488 489/** 490 * Returns the value of the 'source' attribute of this 491 * {@link ExternalModelDefinition}. 492 <p> 493 * @return the value of the 'source' attribute of this 494 * {@link ExternalModelDefinition}. 495 */ public 496 String getSource() { 497 return libsbmlJNI.ExternalModelDefinition_getSource(swigCPtr, this); 498 } 499 500 501/** 502 * Predicate returning <code>true</code> or <code>false</code> depending on whether this 503 * {@link ExternalModelDefinition}'s 'source' attribute has been set. 504 <p> 505 * @return <code>true</code> if this {@link ExternalModelDefinition}'s 'source' attribute has 506 * been set, otherwise <code>false</code> is returned. 507 */ public 508 boolean isSetSource() { 509 return libsbmlJNI.ExternalModelDefinition_isSetSource(swigCPtr, this); 510 } 511 512 513/** 514 * Sets the value of the 'source' attribute of this 515 * {@link ExternalModelDefinition}. 516 <p> 517 * @param source the value to use for the 'source' attribute. 518 <p> 519 * <p> 520 * @return integer value indicating success/failure of the 521 * function. The possible values 522 * returned by this function are: 523 * <ul> 524 * <li> {@link libsbmlConstants#LIBSBML_OPERATION_SUCCESS LIBSBML_OPERATION_SUCCESS} 525 * <li> {@link libsbmlConstants#LIBSBML_INVALID_ATTRIBUTE_VALUE LIBSBML_INVALID_ATTRIBUTE_VALUE} 526 * </ul> 527 */ public 528 int setSource(String source) { 529 return libsbmlJNI.ExternalModelDefinition_setSource(swigCPtr, this, source); 530 } 531 532 533/** 534 * Unsets the value of the 'source' attribute of this 535 * {@link ExternalModelDefinition}. 536 <p> 537 * <p> 538 * @return integer value indicating success/failure of the 539 * function. The possible values 540 * returned by this function are: 541 * <ul> 542 * <li> {@link libsbmlConstants#LIBSBML_OPERATION_SUCCESS LIBSBML_OPERATION_SUCCESS} 543 * <li> {@link libsbmlConstants#LIBSBML_OPERATION_FAILED LIBSBML_OPERATION_FAILED} 544 * </ul> 545 */ public 546 int unsetSource() { 547 return libsbmlJNI.ExternalModelDefinition_unsetSource(swigCPtr, this); 548 } 549 550 551/** 552 * Returns true if the 'modelRef' and 'id' attributes are set, and false if not. 553 <p> 554 * This method does not check to see if the referred-to model actually 555 * exists. 556 <p> 557 * @return boolean: <code>true</code> if the attributes are correctly set; <code>false</code> 558 * if not. 559 */ public 560 boolean hasRequiredAttributes() { 561 return libsbmlJNI.ExternalModelDefinition_hasRequiredAttributes(swigCPtr, this); 562 } 563 564 565/** 566 * Returns the XML element name of this SBML object. 567 <p> 568 * @return the name of this element, as a text string. 569 */ public 570 String getElementName() { 571 return libsbmlJNI.ExternalModelDefinition_getElementName(swigCPtr, this); 572 } 573 574 575/** 576 * Returns the libSBML type code of this object instance. 577 <p> 578 * <p> 579 * LibSBML attaches an identifying code to every kind of SBML object. These 580 * are integer constants known as <em>SBML type codes</em>. The names of all 581 * the codes begin with the characters <code>SBML_</code>. 582 * In the Java language interface for libSBML, the 583 * type codes are defined as static integer constants in the interface class 584 * {@link libsbmlConstants}. Note that different Level 3 585 * package plug-ins may use overlapping type codes; to identify the package 586 * to which a given object belongs, call the <code>getPackageName()</code> 587 * method on the object. 588 <p> 589 * @return the SBML type code for this object: 590 * {@link libsbmlConstants#SBML_COMP_EXTERNALMODELDEFINITION SBML_COMP_EXTERNALMODELDEFINITION} 591 <p> 592 * <p> 593 * @warning <span class='warning'>The specific integer values of the possible 594 * type codes may be reused by different libSBML plug-ins for SBML Level 3. 595 * packages, To fully identify the correct code, <strong>it is necessary to 596 * invoke both getTypeCode() and getPackageName()</strong>.</span> 597 <p> 598 * @see #getElementName() 599 * @see #getPackageName() 600 */ public 601 int getTypeCode() { 602 return libsbmlJNI.ExternalModelDefinition_getTypeCode(swigCPtr, this); 603 } 604 605 606/** 607 * Resolves and returns the referenced {@link Model} object of this {@link ExternalModelDefinition}. 608 * If none can be found, an error is set and null is returned. The 609 * returned {@link Model} is a non-owning pointer to the model; the original 610 * {@link Model} is saved (along with the {@link SBMLDocument} from which it comes) as 611 * a child of the {@link CompSBMLDocumentPlugin} of the {@link SBMLDocument} to which this 612 * {@link Model} belongs. If this {@link ExternalModelDefinition} is not part of any 613 * {@link SBMLDocument}, null will be returned. 614 */ public 615 Model getReferencedModel() { 616 long cPtr = libsbmlJNI.ExternalModelDefinition_getReferencedModel(swigCPtr, this); 617 return (cPtr == 0) ? null : new Model(cPtr, false); 618 } 619 620}