libNuML 1.1.1
Library for reading / writing NuML documents
|
This is the base class for all numl objects. More...
#include <NMBase.h>
Public Member Functions | |
virtual | ~NMBase () |
Destroy this object. More... | |
NMBase & | operator= (const NMBase &orig) |
Assignment operator for NMBase. More... | |
virtual bool | accept (NUMLVisitor &v) const =0 |
Accepts the given NUMLVisitor for this instance of NMBase. More... | |
virtual NMBase * | clone () const =0 |
Creates and returns a deep copy of this NMBase object. More... | |
const std::string & | getMetaId () const |
Returns the value of the "metaid" attribute of this object. More... | |
std::string & | getMetaId () |
Returns the value of the "metaid" attribute of this object. More... | |
virtual const std::string & | getId () const |
virtual const std::string & | getName () const |
virtual LIBSBML_CPP_NAMESPACE_QUALIFIER XMLNamespaces * | getNamespaces () const |
Returns the content of the "annotation" subelement of this object as a character string. More... | |
const NUMLDocument * | getNUMLDocument () const |
Returns the parent NUMLDocument object. More... | |
NUMLDocument * | getNUMLDocument () |
Returns the parent NUMLDocument object. More... | |
NMBase * | getParentNUMLObject () |
Returns the parent NUML object. More... | |
NMBase * | getAncestorOfType (NUMLTypeCode_t type) |
Returns the ancestor NUML object that corresponds to the given NUMLTypeCode_t. More... | |
unsigned int | getLine () const |
Returns the line number on which this object first appears in the XML representation of the NUML document. More... | |
unsigned int | getColumn () const |
Returns the column number on which this object first appears in the XML representation of the NUML document. More... | |
bool | isSetMetaId () const |
Predicate returning true or false depending on whether this object's "metaid" attribute has been set. More... | |
bool | isSetName () const |
int | setMetaId (const std::string &metaid) |
Sets the value of the "metaid" attribute of this object. More... | |
virtual int | setId (const std::string &sid) |
virtual void | setNUMLDocument (NUMLDocument *d) |
Sets the parent NUMLDocument of this NUML object. More... | |
virtual void | setParentNUMLObject (NMBase *sb) |
Sets the parent NUML object of this NUML object. More... | |
int | setNamespaces (LIBSBML_CPP_NAMESPACE_QUALIFIER XMLNamespaces *xmlns) |
Sets the namespaces relevant of this NUML object. More... | |
int | unsetMetaId () |
Unsets the value of the "metaid" attribute of this NUML object. More... | |
unsigned int | getLevel () const |
Returns the NUML Level of the overall NUML document. More... | |
unsigned int | getVersion () const |
Returns the Version within the NUML Level of the overall NUML document. More... | |
virtual NUMLTypeCode_t | getTypeCode () const |
Returns the libnuml type code for this object. More... | |
bool | hasValidLevelVersionNamespaceCombination () |
Predicate returning true or false depending on whether this object's level/version and namespace values correspond to a valid NUML specification. More... | |
virtual const std::string & | getElementName () const =0 |
Returns the XML element name of this object. More... | |
char * | toNUML () |
Returns a string that consists of the partial NUML describing this object. More... | |
void | read (LIBSBML_CPP_NAMESPACE_QUALIFIER XMLInputStream &stream) |
Reads (initializes) this NUML object by reading from XMLInputStream. More... | |
void | write (LIBSBML_CPP_NAMESPACE_QUALIFIER XMLOutputStream &stream) const |
Writes (serializes) this NUML object by writing it to XMLOutputStream. More... | |
virtual void | writeElements (LIBSBML_CPP_NAMESPACE_QUALIFIER XMLOutputStream &stream) const |
Subclasses should override this method to write out their contained NUML objects as XML elements. More... | |
virtual bool | hasRequiredAttributes () const |
virtual bool | hasRequiredElements () const |
void | setNUMLNamespaces (NUMLNamespaces *numlns) |
NUMLNamespaces * | getNUMLNamespaces () const |
void | syncAnnotation () |
bool | isSetNotes () const |
bool | isSetAnnotation () const |
virtual int | setAnnotation (const LIBSBML_CPP_NAMESPACE_QUALIFIER XMLNode *annotation) |
virtual int | setAnnotation (const std::string &annotation) |
virtual int | appendAnnotation (const LIBSBML_CPP_NAMESPACE_QUALIFIER XMLNode *annotation) |
virtual int | appendAnnotation (const std::string &annotation) |
int | removeTopLevelAnnotationElement (const std::string elementName, const std::string elementURI="") |
int | replaceTopLevelAnnotationElement (const LIBSBML_CPP_NAMESPACE_QUALIFIER XMLNode *annotation) |
int | replaceTopLevelAnnotationElement (const std::string &annotation) |
int | setNotes (const LIBSBML_CPP_NAMESPACE_QUALIFIER XMLNode *notes) |
int | setNotes (const std::string ¬es, bool addXHTMLMarkup=false) |
int | appendNotes (const LIBSBML_CPP_NAMESPACE_QUALIFIER XMLNode *notes) |
int | appendNotes (const std::string ¬es) |
int | unsetNotes () |
int | unsetAnnotation () |
LIBSBML_CPP_NAMESPACE_QUALIFIER XMLNode * | getNotes () const |
std::string | getNotesString () const |
LIBSBML_CPP_NAMESPACE_QUALIFIER XMLNode * | getAnnotation () const |
std::string | getAnnotationString () const |
Protected Member Functions | |
virtual void | writeXMLNS (LIBSBML_CPP_NAMESPACE_QUALIFIER XMLOutputStream &stream) const |
Subclasses should override this method to write their xmlns attriubutes (if any) to the XMLOutputStream. More... | |
NMBase (const std::string &id="", const std::string &name="") | |
Only subclasses may create NMBase objects. More... | |
NMBase (unsigned int level, unsigned int version) | |
Creates a new NMBase object with the given sboTerm. More... | |
NMBase (NUMLNamespaces *numlns) | |
Creates a new NMBase object with the given NUMLNamespaces. More... | |
NMBase (const NMBase &orig) | |
Copy constructor. More... | |
virtual NMBase * | createObject (LIBSBML_CPP_NAMESPACE_QUALIFIER XMLInputStream &stream) |
Subclasses should override this method to create, store, and then return an NUML object corresponding to the next XMLToken in the XMLInputStream. More... | |
virtual bool | readOtherXML (LIBSBML_CPP_NAMESPACE_QUALIFIER XMLInputStream &stream) |
Subclasses should override this method to read (and store) XHTML, MathML, etc. More... | |
virtual int | getElementPosition () const |
The NUML XML Schema is written such that the order of child elements is significant. More... | |
NUMLErrorLog * | getErrorLog () |
void | logError (unsigned int id, const unsigned int level=2, const unsigned int version=3, const std::string &details="") |
Convenience method for easily logging problems from within method implementations. More... | |
void | logUnknownAttribute (std::string attribute, const unsigned int level, const unsigned int version, const std::string element) |
Helper to log a common type of error. More... | |
void | logUnknownElement (const std::string element, const unsigned int level, const unsigned int version) |
Helper to log a common type of error. More... | |
void | logEmptyString (std::string attribute, const unsigned int level, const unsigned int version, std::string element) |
Helper to log a common type of error. More... | |
virtual void | readAttributes (const LIBSBML_CPP_NAMESPACE_QUALIFIER XMLAttributes &attributes) |
Subclasses should override this method to read values from the given XMLAttributes set into their specific fields. More... | |
virtual void | writeAttributes (LIBSBML_CPP_NAMESPACE_QUALIFIER XMLOutputStream &stream) const |
Subclasses should override this method to write their XML attributes to the XMLOutputStream. More... | |
void | checkOrderAndLogError (NMBase *object, int expected) |
Checks that NUML element has been read in the proper order. More... | |
void | checkNUMLListPopulated (NMBase *object) |
Checks that an NUML NUMLList element has been populated. More... | |
void | checkDefaultNamespace (const LIBSBML_CPP_NAMESPACE_QUALIFIER XMLNamespaces *xmlns, const std::string &elementName) |
Checks that the given default namespace in the given element is valid. More... | |
void | checkXHTML (const LIBSBML_CPP_NAMESPACE_QUALIFIER XMLNode *) |
Checks that the XHTML is valid. More... | |
void | checkAnnotation () |
Checks the annotation does not declare an numl namespace. More... | |
Protected Attributes | |
std::string | mMetaId |
std::string | mId |
std::string | mName |
NUMLDocument * | mNUML |
LIBSBML_CPP_NAMESPACE_QUALIFIER XMLNode * | mNotes |
LIBSBML_CPP_NAMESPACE_QUALIFIER XMLNode * | mAnnotation |
NUMLNamespaces * | mNUMLNamespaces |
unsigned int | mLine |
unsigned int | mColumn |
int | mDept |
NMBase * | mParentNUMLObject |
bool | mHasBeenDeleted |
std::string | mEmptyString |
Private Member Functions | |
void | setNMBaseFields (const LIBSBML_CPP_NAMESPACE_QUALIFIER XMLToken &element) |
Stores the location (line and column) and any XML namespaces (for roundtripping) declared on this NUML (XML) element. More... | |
bool | readAnnotation (LIBSBML_CPP_NAMESPACE_QUALIFIER XMLInputStream &stream) |
bool | readNotes (LIBSBML_CPP_NAMESPACE_QUALIFIER XMLInputStream &stream) |
bool | getHasBeenDeleted () |
This is the base class for all numl objects.
|
virtual |
Destroy this object.
|
protected |
Only subclasses may create NMBase objects.
@docnote The native C++ implementation of this method defines a default argument value. In the documentation generated for different libNUML language bindings, you may or may not see corresponding arguments in the method declarations. For example, in Java, a default argument is handled by declaring two separate methods, with one of them having the argument and the other one lacking the argument. However, the libNUML documentation will be identical for both methods. Consequently, if you are reading this and do not see an argument even though one is described, please look for descriptions of other variants of this method near where this one appears in the documentation.
|
protected |
|
protected |
Creates a new NMBase object with the given NUMLNamespaces.
Only subclasses may create NMBase objects.
|
protected |
Copy constructor.
Creates a copy of this NMBase object.
|
pure virtual |
Accepts the given NUMLVisitor for this instance of NMBase.
v | the NUMLVisitor instance to be used. |
v.visit()
. Implemented in AtomicDescription, AtomicValue, CompositeDescription, CompositeValue, Dimension, DimensionDescription, NUMLDocument, NUMLList, OntologyTerm, and ResultComponent.
|
virtual |
|
virtual |
int NMBase::appendNotes | ( | const LIBSBML_CPP_NAMESPACE_QUALIFIER XMLNode * | notes | ) |
int NMBase::appendNotes | ( | const std::string & | notes | ) |
|
protected |
Checks the annotation does not declare an numl namespace.
If the annotation declares an numl namespace an error is logged.
|
protected |
Checks that the given default namespace in the given element is valid.
If the given default namespace is not valid, an error is logged.
|
protected |
|
protected |
Checks that NUML element has been read in the proper order.
If object is not in the expected position, an error is logged.
|
protected |
Checks that the XHTML is valid.
If the xhtml does not conform to the specification of valid xhtml within an numl document, an error is logged.
|
pure virtual |
Creates and returns a deep copy of this NMBase object.
Implemented in AtomicDescription, AtomicValue, CompositeDescription, CompositeValue, Dimension, DimensionDescription, NUMLDocument, NUMLList, OntologyTerm, OntologyTerms, ResultComponent, ResultComponents, Tuple, and TupleDescription.
|
protectedvirtual |
Subclasses should override this method to create, store, and then return an NUML object corresponding to the next XMLToken in the XMLInputStream.
Reimplemented in CompositeDescription, CompositeValue, Dimension, DimensionDescription, NUMLDocument, OntologyTerms, ResultComponent, ResultComponents, Tuple, and TupleDescription.
NMBase * NMBase::getAncestorOfType | ( | NUMLTypeCode_t | type | ) |
Returns the ancestor NUML object that corresponds to the given NUMLTypeCode_t.
This function allows any object to determine its exact location/function within a model. For example a StoichiometryMath object has ancestors of type SpeciesReference, ListOfProducts/ListOfReactants/ListOfModifiers, Reaction, ListOfReactions and Model; any of which can be accessed via this function.
type | the NUMLTypeCode_t of the ancestor to be returned. |
XMLNode * NMBase::getAnnotation | ( | ) | const |
std::string NMBase::getAnnotationString | ( | ) | const |
unsigned int NMBase::getColumn | ( | ) | const |
Returns the column number on which this object first appears in the XML representation of the NUML document.
|
pure virtual |
Returns the XML element name of this object.
This is overridden by subclasses to return a string appropriate to the NUML component. For example, Model defines it as returning "model", CompartmentType defines it as returning "compartmentType", etc.
Implemented in AtomicDescription, AtomicValue, CompositeDescription, CompositeValue, Dimension, DimensionDescription, NUMLDocument, NUMLList, OntologyTerm, OntologyTerms, ResultComponent, ResultComponents, Tuple, and TupleDescription.
|
protectedvirtual |
The NUML XML Schema is written such that the order of child elements is significant.
LibNUML can read elements out of order. If you override this method to indicate the ordinal position of element with respect to its siblings, libNUML will log an error if the element is read out of order.
Reimplemented in Dimension, DimensionDescription, NUMLDocument, OntologyTerms, ResultComponents, Tuple, and TupleDescription.
|
protected |
|
private |
|
virtual |
Reimplemented in AtomicDescription, CompositeDescription, DimensionDescription, OntologyTerm, ResultComponent, and TupleDescription.
unsigned int NMBase::getLevel | ( | ) | const |
Returns the NUML Level of the overall NUML document.
unsigned int NMBase::getLine | ( | ) | const |
Returns the line number on which this object first appears in the XML representation of the NUML document.
string & NMBase::getMetaId | ( | ) |
Returns the value of the "metaid" attribute of this object.
The optional attribute named "metaid", present on every major NUML component type, is for supporting metadata annotations using RDF (Resource Description Format). The attribute value has the data type XML ID, the XML identifier type, which means each "metaid" value must be globally unique within an NUML file. (Importantly, this uniqueness criterion applies across any attribute with type XML ID, not just the "metaid" attribute used by NUML—something to be aware of if your application-specific XML content inside the "annotation" subelement happens to use XML ID.) The "metaid" value serves to identify a model component for purposes such as referencing that component from metadata placed within "annotation" subelements.
const string & NMBase::getMetaId | ( | ) | const |
Returns the value of the "metaid" attribute of this object.
The optional attribute named "metaid", present on every major NUML component type, is for supporting metadata annotations using RDF (Resource Description Format). The attribute value has the data type XML ID, the XML identifier type, which means each "metaid" value must be globally unique within an NUML file. (Importantly, this uniqueness criterion applies across any attribute with type XML ID, not just the "metaid" attribute used by NUML—something to be aware of if your application-specific XML content inside the "annotation" subelement happens to use XML ID.) The "metaid" value serves to identify a model component for purposes such as referencing that component from metadata placed within "annotation" subelements.
|
virtual |
Reimplemented in AtomicDescription, CompositeDescription, and DimensionDescription.
|
virtual |
Returns the content of the "annotation" subelement of this object as a character string.
Whereas the NMBase "notes" subelement is a container for content to be shown directly to humans, the "annotation" element is a container for optional software-generated content not meant to be shown to humans. Every object derived from NMBase can have its own value for "annotation". The element's content type is XML type any
, allowing essentially arbitrary well-formed XML data content.
NUML places a few restrictions on the organization of the content of annotations; these are intended to help software tools read and write the data as well as help reduce conflicts between annotations added by different tools. Please see the NUML specifications for more details.
The annotations returned by this method will be in string form.
Reimplemented in NUMLDocument.
XMLNode * NMBase::getNotes | ( | ) | const |
std::string NMBase::getNotesString | ( | ) | const |
NUMLDocument * NMBase::getNUMLDocument | ( | ) |
Returns the parent NUMLDocument object.
LibNUML uses the class NUMLDocument as a top-level container for storing NUML content and data associated with it (such as warnings and error messages). An NUML model in libNUML is contained inside an NUMLDocument object. NUMLDocument corresponds roughly to the class Sbrml defined in the NUML Level 2 specification, but it does not have a direct correspondence in NUML Level 1. (But, it is created by libNUML no matter whether the model is Level 1 or Level 2.)
This method allows the NUMLDocument for the current object to be retrieved.
const NUMLDocument * NMBase::getNUMLDocument | ( | ) | const |
Returns the parent NUMLDocument object.
LibNUML uses the class NUMLDocument as a top-level container for storing NUML content and data associated with it (such as warnings and error messages). An NUML model in libNUML is contained inside an NUMLDocument object. NUMLDocument corresponds roughly to the class Sbrml defined in the NUML Level 2 specification, but it does not have a direct correspondence in NUML Level 1. (But, it is created by libNUML no matter whether the model is Level 1 or Level 2.)
This method allows the NUMLDocument for the current object to be retrieved.
NUMLNamespaces * NMBase::getNUMLNamespaces | ( | ) | const |
NMBase * NMBase::getParentNUMLObject | ( | ) |
Returns the parent NUML object.
This method is convenient when holding an object nested inside other objects in an NUML model. It allows direct access to the <model>
element containing it.
|
virtual |
Returns the libnuml type code for this object.
This method may return the type code of this NUML object, or it may return NUML_UNKNOWN. This is because subclasses of NMBase are not required to implement this method to return a type code. This method is meant primarily for the LibNUML C interface, in which class and subclass information is not readily available.
Reimplemented in AtomicDescription, AtomicValue, CompositeDescription, CompositeValue, Dimension, DimensionDescription, NUMLDocument, NUMLList, OntologyTerm, OntologyTerms, ResultComponent, ResultComponents, Tuple, and TupleDescription.
unsigned int NMBase::getVersion | ( | ) | const |
Returns the Version within the NUML Level of the overall NUML document.
|
virtual |
|
virtual |
bool NMBase::hasValidLevelVersionNamespaceCombination | ( | ) |
Predicate returning true
or false
depending on whether this object's level/version and namespace values correspond to a valid NUML specification.
The valid combinations of NUML Level, Version and Namespace as of this release of libNUML are the following:
true
if the level, version and namespace values of this NUML object correspond to a valid set of values, false
otherwise. bool NMBase::isSetAnnotation | ( | ) | const |
bool NMBase::isSetMetaId | ( | ) | const |
Predicate returning true
or false
depending on whether this object's "metaid" attribute has been set.
The optional attribute named "metaid", present on every major NUML component type, is for supporting metadata annotations using RDF (Resource Description Format). The attribute value has the data type XML ID, the XML identifier type, which means each "metaid" value must be globally unique within an NUML file. (Importantly, this uniqueness criterion applies across any attribute with type XML ID, not just the "metaid" attribute used by NUML—something to be aware of if your application-specific XML content inside the "annotation" subelement happens to use XML ID.) The "metaid" value serves to identify a model component for purposes such as referencing that component from metadata placed within "annotation" subelements.
true
if the "metaid" attribute of this NUML object has been set, false
otherwise.bool NMBase::isSetName | ( | ) | const |
bool NMBase::isSetNotes | ( | ) | const |
|
protected |
Helper to log a common type of error.
|
protected |
Convenience method for easily logging problems from within method implementations.
This is essentially a short form of getErrorLog()->logError(...)
@docnote The native C++ implementation of this method defines a default argument value. In the documentation generated for different libNUML language bindings, you may or may not see corresponding arguments in the method declarations. For example, in Java, a default argument is handled by declaring two separate methods, with one of them having the argument and the other one lacking the argument. However, the libNUML documentation will be identical for both methods. Consequently, if you are reading this and do not see an argument even though one is described, please look for descriptions of other variants of this method near where this one appears in the documentation.
|
protected |
Helper to log a common type of error.
|
protected |
Helper to log a common type of error.
void NMBase::read | ( | LIBSBML_CPP_NAMESPACE_QUALIFIER XMLInputStream & | stream | ) |
Reads (initializes) this NUML object by reading from XMLInputStream.
|
private |
|
protectedvirtual |
Subclasses should override this method to read values from the given XMLAttributes set into their specific fields.
Be sure to call your parents implementation of this method as well.
Reimplemented in AtomicDescription, AtomicValue, CompositeDescription, CompositeValue, NUMLDocument, NUMLList, OntologyTerm, ResultComponent, Tuple, and TupleDescription.
|
private |
|
protectedvirtual |
Subclasses should override this method to read (and store) XHTML, MathML, etc.
directly from the XMLInputStream.
int NMBase::removeTopLevelAnnotationElement | ( | const std::string | elementName, |
const std::string | elementURI = "" |
||
) |
int NMBase::replaceTopLevelAnnotationElement | ( | const LIBSBML_CPP_NAMESPACE_QUALIFIER XMLNode * | annotation | ) |
int NMBase::replaceTopLevelAnnotationElement | ( | const std::string & | annotation | ) |
|
virtual |
|
virtual |
|
virtual |
Reimplemented in AtomicDescription, CompositeDescription, DimensionDescription, TupleDescription, OntologyTerm, and ResultComponent.
int NMBase::setMetaId | ( | const std::string & | metaid | ) |
Sets the value of the "metaid" attribute of this object.
The string metaid
is copied. The value of metaid
must be an identifier conforming to the syntax defined by the XML 1.0 data type ID. Among other things, this type requires that a value is unique among all the values of type XML ID in an NUMLDocument. Although NUML only uses XML ID for the "metaid" attribute, callers should be careful if they use XML ID's in XML portions of a model that are not defined by NUML, such as in the application-specific content of the "annotation" subelement.
metaid | the identifier string to use as the value of the "metaid" attribute |
int NMBase::setNamespaces | ( | LIBSBML_CPP_NAMESPACE_QUALIFIER XMLNamespaces * | xmlns | ) |
Sets the namespaces relevant of this NUML object.
xmlns | the namespaces to set |
|
private |
Stores the location (line and column) and any XML namespaces (for roundtripping) declared on this NUML (XML) element.
int NMBase::setNotes | ( | const LIBSBML_CPP_NAMESPACE_QUALIFIER XMLNode * | notes | ) |
int NMBase::setNotes | ( | const std::string & | notes, |
bool | addXHTMLMarkup = false |
||
) |
|
virtual |
Sets the parent NUMLDocument of this NUML object.
d | the NUMLDocument object to use |
Reimplemented in NUMLDocument, NUMLList, and ResultComponent.
void NMBase::setNUMLNamespaces | ( | NUMLNamespaces * | numlns | ) |
|
virtual |
Sets the parent NUML object of this NUML object.
sb | the NUML object to use |
Reimplemented in NUMLDocument, NUMLList, and ResultComponent.
void NMBase::syncAnnotation | ( | ) |
char * NMBase::toNUML | ( | ) |
Returns a string that consists of the partial NUML describing this object.
This is primarily provided for testing and debugging purposes. It may be removed in a future version of libNUML.
int NMBase::unsetAnnotation | ( | ) |
int NMBase::unsetMetaId | ( | ) |
Unsets the value of the "metaid" attribute of this NUML object.
The optional attribute named "metaid", present on every major NUML component type, is for supporting metadata annotations using RDF (Resource Description Format). The attribute value has the data type XML ID, the XML identifier type, which means each "metaid" value must be globally unique within an NUML file. (Importantly, this uniqueness criterion applies across any attribute with type XML ID, not just the "metaid" attribute used by NUML—something to be aware of if your application-specific XML content inside the "annotation" subelement happens to use XML ID.) The "metaid" value serves to identify a model component for purposes such as referencing that component from metadata placed within "annotation" subelements.
int NMBase::unsetNotes | ( | ) |
void NMBase::write | ( | LIBSBML_CPP_NAMESPACE_QUALIFIER XMLOutputStream & | stream | ) | const |
Writes (serializes) this NUML object by writing it to XMLOutputStream.
|
protectedvirtual |
Subclasses should override this method to write their XML attributes to the XMLOutputStream.
Be sure to call your parents implementation of this method as well. For example:
NMBase::writeAttributes(stream); stream.writeAttribute( "id" , mId ); stream.writeAttribute( "name", mName ); ...
Reimplemented in AtomicDescription, AtomicValue, CompositeDescription, CompositeValue, NUMLDocument, NUMLList, OntologyTerm, ResultComponent, Tuple, and TupleDescription.
|
virtual |
Subclasses should override this method to write out their contained NUML objects as XML elements.
Be sure to call your parents implementation of this method as well. For example:
NMBase::writeElements(stream); mTuples.write(stream); mResultComponents.write(stream); ...
Reimplemented in NUMLDocument, NUMLList, and ResultComponent.
|
protectedvirtual |
Subclasses should override this method to write their xmlns attriubutes (if any) to the XMLOutputStream.
Reimplemented in DimensionDescription.
|
protected |
|
protected |
|
protected |
|
protected |
|
protected |
|
protected |
|
protected |
|
protected |
|
protected |
|
protected |
|
protected |
|
protected |
|
protected |