All Downloads are FREE. Search and download functionalities are using the official Maven repository.

xml.area004-v001-Monitor-and-Control.xml Maven / Gradle / Ivy

The newest version!
<?xml version="1.0" encoding="UTF-8"?>
<mal:specification xmlns:com="http://www.ccsds.org/schema/COMSchema"
                   xmlns:svg="http://www.w3.org/2000/svg"
                   xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
                   xmlns:mal="http://www.ccsds.org/schema/ServiceSchema">
  <mal:area name="MC" number="4" version="1"
            comment="This section details the MC services, the structures used by the services are detailed in section 4. Both the services and structures are defined in terms of the MO MAL, which is defined in [2], so it is possible to deploy them over any supported protocol and message transport.&#xA;The services defined here are also specified in terms of the COM, which is defined in [3].&#xA;To aid comprehension, several tables are included for each service and operation definition. The table formats are briefly described in section 1.6.3.2 and are the same as those used for the specification of the MO COM services in [3]. &#xA;All service specifications in this document are part of the MC area, which has a short form number of '4'.">
    <mal:service xsi:type="com:ExtendedServiceType" name="Action" number="1"
                 comment="The action service allows consumers to submit an action for execution and to subsequently monitor the execution progress of these actions via the COM activity tracking pattern. The progress of the action is split into two parts, firstly transfer from the consumer to the provider, and secondly execution in the provider.&#xA;An action is submitted to the provider using the submitAction operation, the progress of which can be monitored using the COM activity tracking pattern, which completes when the action has been delivered to the provider. The action is then executed in the provider which can also be monitored using the activity tracking pattern. The submitAction operation takes the object instance identifier of the submitted action and uses that to populate the source fields of the activity tracking events. Coordination may be required between action service consumers to ensure the action object instance identifiers are unique. How this is done is outside the scope of this specification however a good approach is the use of a central COM archive as that can provide the unique instance identifiers.&#xA;The nominal sequence of action submission and execution monitoring are shown in Figure 3-1:&#xA; insert sequence diag here &#xA;The consumer is responsible for creating and archiving the action instance object and then using the submitAction operation to submit it to the action provider for execution. The action provider reports, using the COM ActivityTracking service, both the execution progress of the submitAction operation and also the execution of the action itself. Once the supplied action instance details have been checked and execution of the action started by the submitAction operation, that operation finishes, whilst the execution of the action possibly continues (depends on the actual action). The final interaction in the sequence shows the execution events of the executing action instance, the '*' at the start of that line indicates zero to many events being published.&#xA;If the execution of an action fails with an error, the action service provider can publish an ActionFailure COM event to hold the error code being reported by the failure. If no error code is required to be reported then there is no need to publish the event as the normal COM ActivityTracking event contains a success indication.&#xA;The service also includes an operation, preCheckAction, which checks that an action would be accepted for execution without actually submitting it for execution. It is expected to be provided by local action proxies, rather than the remote system, to allow for localised checking of things such as link state, argument values, action safety, before sending the action over long and slow space links.&#xA;The action service defines three types of objects, the first type is the ActionIdentity object that holds the name of an action. The second type is the ActionDefinition object that holds the description of an action with the list of required/optional arguments. The third type is the ActionInstance object that holds details of a specific action instance namely a value for each of the arguments of the action.">
      <mal:documentation name="High Level Requirements" order="1">The action service shall provide:
&lt;ol&gt;
 &lt;li&gt;the capability for submitting actions for execution;&lt;/li&gt;
 &lt;li&gt;the capability for submitting actions for check without execution;&lt;/li&gt;
 &lt;li&gt;the capability for listing the numeric identifiers for the action definitions;&lt;/li&gt;
 &lt;li&gt;the capability for defining a new definition;&lt;/li&gt;
 &lt;li&gt;the capability for updating an existing definition;&lt;/li&gt;
 &lt;li&gt;the capability for removing an existing definition.&lt;/li&gt;
&lt;/ol&gt;
The list of actions that are supported by the action service shall be declared when deploying that service.
Each action submission shall include:
&lt;ol&gt;
 &lt;li&gt;the action definition numeric identifier;&lt;/li&gt;
 &lt;li&gt;the action instance numeric identifier;&lt;/li&gt;
 &lt;li&gt;the ordered list of action arguments.&lt;/li&gt;
&lt;/ol&gt;</mal:documentation>
      <mal:documentation name="Functional Requirements" order="2">The submitAction operation shall be used to submit a new action instance for execution.
</mal:documentation>
      <mal:capabilitySet number="1">
        <mal:submitIP name="submitAction" number="1" supportInReplay="false"
                      comment="The submitAction operation allows a consumer to submit an action to a provider for remote execution.">
          <mal:messages>
            <mal:submit>
              <mal:field name="actionInstId"
                         comment="The actionInstId field of the submission shall contain the object instance identifier of the ActionInstance to be used for activity tracking events.">
                <mal:type name="Long" area="MAL"/>
              </mal:field>
              <mal:field name="actionDetails"
                         comment="The actionDetails part of the submission shall contain the argument values and related information of the action instance to be executed.&#xA;If the defInstId of the supplied actionDetails field does not match a known ActionDefinition object then an UNKNOWN error shall be returned.&#xA;The size of the argumentValues list of the ActionInstanceDetails structure shall be compared to the size of the argument list in the matched ActionDefinition object and an INVALID error shall be returned if they are not the same.&#xA;If the ActionInstanceDetails structure contains an argumentIds field value then this shall be compared to the same field in the matched ActionDefinition object and must be the same size and contain the same values, an INVALID error shall be returned if this is not the case.&#xA;If the ActionInstanceDetails structure contains an isRawValue field value then the size of this list shall be compared to the size of the argument list in the matched ActionDefinition object and an INVALID error shall be returned if they are not the same.&#xA;If the supplied argument values do not match the attribute type specified in the action definition then an INVALID error shall be returned.&#xA;A service provider may apply some deployment specific checks to the action instance and can return an INVALID error if they fail.&#xA;If an error is raised then no action shall be executed.&#xA;The SUBMIT acknowledgement shall be returned once the action has been accepted for execution but before execution starts.">
                <mal:type name="ActionInstanceDetails" service="Action" area="MC"/>
              </mal:field>
            </mal:submit>
          </mal:messages>
          <mal:errors>
            <mal:errorRef comment="The list sizes held in the ActionInstanceDetails do not match the argument definitions or it contains one or more invalid argument values.&#xA;If the two lists are not the same length then the extra information field shall contain the first index of the element in the largest list which does not have corresponding element in the other list.">
              <mal:type name="INVALID" area="COM"/>
              <mal:extraInformation comment="The extra information field contains a list of the indexes of the erroneous values from the originating list supplied.">
                <mal:type list="true" name="UInteger" area="MAL"/>
              </mal:extraInformation>
            </mal:errorRef>
            <mal:errorRef comment="Submitted action definition is unknown.">
              <mal:type name="UNKNOWN" area="MAL"/>
            </mal:errorRef>
          </mal:errors>
        </mal:submitIP>
        <mal:requestIP name="preCheckAction" number="2" supportInReplay="false"
                       comment="The preCheckAction operation allows a consumer to check that an action would be successfully accepted for execution without actually submitting the action. The operation is expected to be provided by local action proxies rather than the remote system to allow for quick local checks before sending the action over long and slow space links.">
          <mal:messages>
            <mal:request>
              <mal:field name="actionDetails"
                         comment="The actionDetails part of the submission shall contain the argument values and related information of the action instance to be executed.&#xA;If the ActionInstanceDetails structure contains an argumentIds field value then this shall be compared to the same field in the matched ActionDefinition object and must be the same size and contain the same values, an INVALID error shall be returned if this is not the case.&#xA;If the supplied argument values do not match the attribute type specified in the action definition then an INVALID error shall be returned.&#xA;A service provider may apply some deployment specific checks to the action instance and can return an INVALID error if they fail.">
                <mal:type name="ActionInstanceDetails" service="Action" area="MC"/>
              </mal:field>
            </mal:request>
            <mal:response>
              <mal:field name="accepted"
                         comment="The returned Boolean shall be set to TRUE if the action would be accepted successfully; otherwise the operation shall return FALSE.">
                <mal:type name="Boolean" area="MAL"/>
              </mal:field>
            </mal:response>
          </mal:messages>
          <mal:errors>
            <mal:errorRef comment="The argument list contains one or more invalid arguments.">
              <mal:type name="INVALID" area="COM"/>
              <mal:extraInformation comment="The extra information field contains a list of the indexes of the erroneous values from the originating list supplied.">
                <mal:type list="true" name="UInteger" area="MAL"/>
              </mal:extraInformation>
            </mal:errorRef>
            <mal:errorRef comment="Submitted action definition is unknown.">
              <mal:type name="UNKNOWN" area="MAL"/>
            </mal:errorRef>
          </mal:errors>
        </mal:requestIP>
      </mal:capabilitySet>
      <mal:capabilitySet number="2">
        <mal:requestIP name="listDefinition" number="3" supportInReplay="true"
                       comment="The listDefinition operation allows a consumer to request the object instance identifiers of the latest ActionIdentity and ActionDefinition objects for the supported actions of the provider.">
          <mal:messages>
            <mal:request>
              <mal:field name="actionNames"
                         comment="The actionNames field shall contain a list of action names to retrieve the ActionIdentity and ActionDefinition object instance identifiers for.&#xA;The request may contain the wildcard value of '*' to return all supported ActionIdentity and ActionDefinition objects.&#xA;The wildcard value should be checked for first, if found no other checks of supplied identifiers shall be made.&#xA;If a provided identifier does not include a wildcard and does not match an existing ActionIdentity object then this operation shall fail with an UNKNOWN error.">
                <mal:type list="true" name="Identifier" area="MAL"/>
              </mal:field>
            </mal:request>
            <mal:response>
              <mal:field name="actionInstIds"
                         comment="The response shall contain a list of matching ActionIdentity and ActionDefinition object instance identifiers.&#xA;The returned list shall maintain the same order as the submitted list unless the wildcard value was included in the request.">
                <mal:type list="true" name="ObjectInstancePair" area="MC"/>
              </mal:field>
            </mal:response>
          </mal:messages>
          <mal:errors>
            <mal:errorRef comment="One of the supplied identifiers is unknown.">
              <mal:type name="UNKNOWN" area="MAL"/>
              <mal:extraInformation comment="A list of the indexes of the error values shall be contained in the extra information field.">
                <mal:type list="true" name="UInteger" area="MAL"/>
              </mal:extraInformation>
            </mal:errorRef>
          </mal:errors>
        </mal:requestIP>
      </mal:capabilitySet>
      <mal:capabilitySet number="3">
        <mal:requestIP name="addAction" number="4" supportInReplay="false"
                       comment="The addAction operation allows a consumer to define one or more actions that do not currently exist. The new ActionIdentity and ActionDefinition objects are expected to be stored in the COM archive by the provider of the action service.">
          <mal:messages>
            <mal:request>
              <mal:field name="actionDefDetails"
                         comment="The actionDefDetails field shall hold the name and definitions to be added.&#xA;The name field must not be the wildcard '*', or empty (an INVALID error shall be returned in this case).&#xA;The supplied name must be unique among all ActionIdentity objects for the domain of the provider otherwise a DUPLICATE error shall be raised.&#xA;If an error is raised then no new identities and definitions shall be added as a result of this operation call.&#xA;If the supplied name matches an existing, but removed, ActionIdentity then that ActionIdentity shall be reused otherwise a new ActionIdentity shall be created.&#xA;The provider shall create a new ActionDefinition object and store it, and any new ActionIdentity objects, in the COM archive.">
                <mal:type list="true" name="ActionCreationRequest" service="Action" area="MC"/>
              </mal:field>
            </mal:request>
            <mal:response>
              <mal:field name="newObjInstIds"
                         comment="The response shall contain the list of object instance identifiers for the ActionIdentity and new ActionDefinition objects.&#xA;The returned list shall maintain the same order as the submitted definitions.">
                <mal:type list="true" name="ObjectInstancePair" area="MC"/>
              </mal:field>
            </mal:response>
          </mal:messages>
          <mal:errors>
            <mal:errorRef comment="One of the supplied ActionIdentity objects contains an invalid action name.">
              <mal:type name="INVALID" area="COM"/>
              <mal:extraInformation comment="The extra information field contains a list of the indexes of the erroneous values from the originating list supplied.">
                <mal:type list="true" name="UInteger" area="MAL"/>
              </mal:extraInformation>
            </mal:errorRef>
            <mal:errorRef comment="One or more of the ActionIdentity objects being added has supplied an action name that is already in use in the domain.">
              <mal:type name="DUPLICATE" area="COM"/>
              <mal:extraInformation comment="The extra information field contains a list of the indexes of the erroneous values from the originating request list.">
                <mal:type list="true" name="UInteger" area="MAL"/>
              </mal:extraInformation>
            </mal:errorRef>
          </mal:errors>
        </mal:requestIP>
        <mal:requestIP name="updateDefinition" number="5" supportInReplay="false"
                       comment="The updateDefinition operation allows a consumer to update a definition for one or more actions.&#xA;This differs from deleting an existing action and adding a new definition with the same name in the fact that the ActionIdentity object is not changed between the two definitions.&#xA;The replacement definition should be stored in the COM archive by the service provider. The operation does not remove the previous ActionDefinition object from the COM archive, merely removes the object from the provider. This permits existing, and completed, ActionInstance objects to continue to reference the correct ActionIdentity and ActionDefinition objects in the COM archive.">
          <mal:messages>
            <mal:request>
              <mal:field name="actionObjInstIds"
                         comment="The actionObjInstIds field shall contain the list of object instance identifiers of the ActionIdentity objects to be updated.&#xA;The supplied object instance identifiers shall match existing identity objects, an UNKNOWN error shall be raised if this is not the case.&#xA;If the actionObjInstIds list contains either NULL or '0' an INVALID error shall be raised.">
                <mal:type list="true" name="Long" area="MAL"/>
              </mal:field>
              <mal:field name="actionDefDetails"
                         comment="The actionDefDetails field shall contain the replacement ActionDefinitionDetails.&#xA;The two lists shall be ordered the same.&#xA;The number of entries in the two lists shall be the same size otherwise an INVALID error shall be returned.&#xA;If an error is raised then no definitions shall be modified as a result of this operation call.&#xA;The provider shall create a new ActionDefinition object and store it in the COM archive.&#xA;The new ActionDefinition object shall be the current ActionDefinition used for the specific ActionIdentity.">
                <mal:type list="true" name="ActionDefinitionDetails" service="Action" area="MC"/>
              </mal:field>
            </mal:request>
            <mal:response>
              <mal:field name="newDefInstIds"
                         comment="The response shall contain the list of object instance identifiers for the new ActionDefinition objects.&#xA;The returned list shall maintain the same order as the submitted definitions.">
                <mal:type list="true" name="Long" area="MAL"/>
              </mal:field>
            </mal:response>
          </mal:messages>
          <mal:errors>
            <mal:errorRef comment="The supplied object instance identifiers list contains either a NULL or '0' or the two supplied lists are not the same length.&#xA;If the two lists are not the same length then the extra information field shall contain the first index of the element in the largest list which does not have corresponding element in the other list.">
              <mal:type name="INVALID" area="COM"/>
              <mal:extraInformation comment="The extra information field contains a list of the indexes of the erroneous values from the originating list supplied.">
                <mal:type list="true" name="UInteger" area="MAL"/>
              </mal:extraInformation>
            </mal:errorRef>
            <mal:errorRef comment="One of the supplied ActionIdentity object instance identifiers is unknown.">
              <mal:type name="UNKNOWN" area="MAL"/>
              <mal:extraInformation comment="A list of the indexes of the error values shall be contained in the extra information field.">
                <mal:type list="true" name="UInteger" area="MAL"/>
              </mal:extraInformation>
            </mal:errorRef>
          </mal:errors>
        </mal:requestIP>
        <mal:submitIP name="removeAction" number="6" supportInReplay="false"
                      comment="The removeAction operation allows a consumer to remove one or more actions from the list of actions supported by the action provider.&#xA;The operation does not remove the ActionIdentity or ActionDefinition object from the COM archive, merely removes the objects from the provider. This permits existing, and completed, ActionInstance objects to continue to reference the correct ActionIdentity and ActionDefinition objects in the COM archive.">
          <mal:messages>
            <mal:submit>
              <mal:field name="actionInstIds"
                         comment="The actionInstIds field shall hold the object instance identifiers of the ActionIdentity objects to be removed from the provider.&#xA;The wildcard value of '0' in the list of object instance identifiers shall be supported and matches all actions of the provider.&#xA;The wildcard value should be checked for first, if found no other checks of supplied object instance identifiers shall be made.&#xA;If a provided ActionIdentity object instance identifier does not include a wildcard and does not match an existing ActionIdentity object then this operation shall fail with an UNKNOWN error.&#xA;If a matched definition is still being used by an executing action instance then this operation shall not fail because of this reason.&#xA;Matched ActionIdentity objects shall not be removed from the COM archive only the list of ActionIdentity objects in the provider.&#xA;Removed ActionIdentity object shall not be allowed to be referenced by new action instances.&#xA;If an error is raised then no actions shall be removed as a result of this operation call.">
                <mal:type list="true" name="Long" area="MAL"/>
              </mal:field>
            </mal:submit>
          </mal:messages>
          <mal:errors>
            <mal:errorRef comment="One of the supplied ActionIdentity object instance identifiers is unknown.">
              <mal:type name="UNKNOWN" area="MAL"/>
              <mal:extraInformation comment="A list of the indexes of the error values shall be contained in the extra information field.">
                <mal:type list="true" name="UInteger" area="MAL"/>
              </mal:extraInformation>
            </mal:errorRef>
          </mal:errors>
        </mal:submitIP>
      </mal:capabilitySet>
      <mal:dataTypes>
        <mal:enumeration name="ActionCategory" shortFormPart="4"
                         comment="Contains the default Action category values. It is implementation specific what the meaning of the values are in a particular context.">
          <mal:item value="DEFAULT" nvalue="1" comment="Default category"/>
          <mal:item value="HIPRIORITY" nvalue="2" comment="Category for high priority actions"/>
          <mal:item value="CRITICAL" nvalue="3" comment="Category for critical actions"/>
        </mal:enumeration>
        <mal:composite name="ActionDefinitionDetails" shortFormPart="1"
                       comment="The ActionDefinitionDetails structure holds the definition information of an action.">
          <mal:extends>
            <mal:type name="Composite" area="MAL"/>
          </mal:extends>
          <mal:field name="description" canBeNull="false" comment="The description of the action.">
            <mal:type name="String" area="MAL"/>
          </mal:field>
          <mal:field name="category" canBeNull="false"
                     comment="Category of the action. Value taken from ActionCategory enumeration, although the use of a UOctet allows deployment specific extension. Extensions must use values greater than 127.">
            <mal:type name="UOctet" area="MAL"/>
          </mal:field>
          <mal:field name="progressStepCount" canBeNull="false"
                     comment="Total number of steps that will be reported if PROGRESS reporting is selected in the sent Action. 0 if PROGRESS reporting is not used.">
            <mal:type name="UShort" area="MAL"/>
          </mal:field>
          <mal:field name="arguments"
                     comment="The list of argument definitions. If no arguments are defined, then the complete list is replaced with a NULL.">
            <mal:type list="true" name="ArgumentDefinitionDetails" area="MC"/>
          </mal:field>
        </mal:composite>
        <mal:composite name="ActionInstanceDetails" shortFormPart="2"
                       comment="The ActionInstanceDetails structure holds the information required for an instance of an Action such as the argument values to use.">
          <mal:extends>
            <mal:type name="Composite" area="MAL"/>
          </mal:extends>
          <mal:field name="defInstId" canBeNull="false"
                     comment="The object instance identifier of the ActionDefinition to be used.">
            <mal:type name="Long" area="MAL"/>
          </mal:field>
          <mal:field name="stageStartedRequired" canBeNull="false"
                     comment="If TRUE, then an activity event of type Execution is required for the STARTED stage.">
            <mal:type name="Boolean" area="MAL"/>
          </mal:field>
          <mal:field name="stageProgressRequired" canBeNull="false"
                     comment="If TRUE, then activity events of type Execution are required for the PROGRESS stages.">
            <mal:type name="Boolean" area="MAL"/>
          </mal:field>
          <mal:field name="stageCompletedRequired" canBeNull="false"
                     comment="If TRUE, then an activity event of type Execution is required for the COMPLETION stage.">
            <mal:type name="Boolean" area="MAL"/>
          </mal:field>
          <mal:field name="argumentValues"
                     comment="List containing the values of the arguments. The ordering of the list matches that of the definition. If a value for a particular entry is not being supplied, then its position is filled with a NULL value. If no arguments are defined, then the complete list is replaced with a NULL.">
            <mal:type list="true" name="AttributeValue" area="MC"/>
          </mal:field>
          <mal:field name="argumentIds"
                     comment="Optional list of argument definition identifiers. Allows the provider to verify that the correct arguments are being supplied. The ordering of the list matches that of the argument list of the action definition.">
            <mal:type list="true" name="Identifier" area="MAL"/>
          </mal:field>
          <mal:field name="isRawValue"
                     comment="Optional list of Booleans that determine whether the supplied argument values are raw or converted. If the Boolean for a particular value is TRUE or NULL then that value is assumed to be raw. If the complete isRawValue list is NULL then all arguments are assumed to be raw values.&#xA;The ordering of the list matches that of the argument list of the action definition.">
            <mal:type list="true" name="Boolean" area="MAL"/>
          </mal:field>
        </mal:composite>
        <mal:composite name="ActionCreationRequest" shortFormPart="3"
                       comment="The ActionCreationRequest contains all the fields required when creating a new action in a provider.">
          <mal:extends>
            <mal:type name="Composite" area="MAL"/>
          </mal:extends>
          <mal:field name="name" canBeNull="false"
                     comment="The name of the action. Must not be empty or the wildcard value.">
            <mal:type name="Identifier" area="MAL"/>
          </mal:field>
          <mal:field name="actionDefDetails" canBeNull="false"
                     comment="The action definition details.">
            <mal:type name="ActionDefinitionDetails" service="Action" area="MC"/>
          </mal:field>
        </mal:composite>
      </mal:dataTypes>
      <com:features>
        <mal:diagram name="ActionObjects">
          <svg:svg width="717" height="390" version="1.1">
            <svg:rect x="390" y="70" fill="#FCF2E3" stroke="black" stroke-width="2" width="180"
                      height="70"/>
            <svg:text x="480" y="88" font-family="Verdana" font-size="12" fill="navy"
                      text-anchor="middle"
                      alignment-baseline="middle">COM_UNSPECIFIED</svg:text>
            <svg:text x="480" y="110" font-family="Verdana" font-size="12" fill="navy"
                      text-anchor="middle"
                      alignment-baseline="middle">COM::UNSPECIFIED_OBJECT</svg:text>
            <svg:text x="480" y="122" font-family="Verdana" font-size="12" fill="navy"
                      text-anchor="middle"
                      alignment-baseline="middle"/>
            <svg:text x="480" y="134" font-family="Verdana" font-size="12" fill="navy"
                      text-anchor="middle"
                      alignment-baseline="middle"/>
            <svg:rect x="20" y="170" fill="#FCF2E3" stroke="black" stroke-width="2" width="137"
                      height="60"/>
            <svg:text x="88.5" y="188" font-family="Verdana" font-size="12" fill="navy"
                      text-anchor="middle"
                      alignment-baseline="middle">COM OBJECT</svg:text>
            <svg:text x="88.5" y="210" font-family="Verdana" font-size="12" fill="navy"
                      text-anchor="middle"
                      alignment-baseline="middle">ActionDefinition</svg:text>
            <svg:text x="88.5" y="222" font-family="Verdana" font-size="12" fill="navy"
                      text-anchor="middle"
                      alignment-baseline="middle">2</svg:text>
            <svg:text x="88.5" y="234" font-family="Verdana" font-size="12" fill="navy"
                      text-anchor="middle"
                      alignment-baseline="middle">ActionDefinitionDetails</svg:text>
            <svg:rect x="290" y="310" fill="#FCF2E3" stroke="black" stroke-width="2" width="137"
                      height="60"/>
            <svg:text x="358.5" y="328" font-family="Verdana" font-size="12" fill="navy"
                      text-anchor="middle"
                      alignment-baseline="middle">COM EVENT</svg:text>
            <svg:text x="358.5" y="350" font-family="Verdana" font-size="12" fill="navy"
                      text-anchor="middle"
                      alignment-baseline="middle">ActionFailure</svg:text>
            <svg:text x="358.5" y="362" font-family="Verdana" font-size="12" fill="navy"
                      text-anchor="middle"
                      alignment-baseline="middle">6</svg:text>
            <svg:text x="358.5" y="374" font-family="Verdana" font-size="12" fill="navy"
                      text-anchor="middle"
                      alignment-baseline="middle">MAL::UInteger</svg:text>
            <svg:rect x="560" y="310" fill="#FCF2E3" stroke="black" stroke-width="2" width="137"
                      height="60"/>
            <svg:text x="628.5" y="328" font-family="Verdana" font-size="12" fill="navy"
                      text-anchor="middle"
                      alignment-baseline="middle">COM EVENT</svg:text>
            <svg:text x="628.5" y="350" font-family="Verdana" font-size="12" fill="navy"
                      text-anchor="middle"
                      alignment-baseline="middle">COM::ActivityTracking::Execution</svg:text>
            <svg:text x="628.5" y="362" font-family="Verdana" font-size="12" fill="navy"
                      text-anchor="middle"
                      alignment-baseline="middle">5</svg:text>
            <svg:text x="628.5" y="374" font-family="Verdana" font-size="12" fill="navy"
                      text-anchor="middle"
                      alignment-baseline="middle">COM::ActivityTracking::ActivityExecution</svg:text>
            <svg:rect x="20" y="310" fill="#FCF2E3" stroke="black" stroke-width="2" width="137"
                      height="60"/>
            <svg:text x="88.5" y="328" font-family="Verdana" font-size="12" fill="navy"
                      text-anchor="middle"
                      alignment-baseline="middle">COM OBJECT</svg:text>
            <svg:text x="88.5" y="350" font-family="Verdana" font-size="12" fill="navy"
                      text-anchor="middle"
                      alignment-baseline="middle">ActionInstance</svg:text>
            <svg:text x="88.5" y="362" font-family="Verdana" font-size="12" fill="navy"
                      text-anchor="middle"
                      alignment-baseline="middle">3</svg:text>
            <svg:text x="88.5" y="374" font-family="Verdana" font-size="12" fill="navy"
                      text-anchor="middle"
                      alignment-baseline="middle">ActionInstanceDetails</svg:text>
            <svg:rect x="20" y="20" fill="#FCF2E3" stroke="black" stroke-width="2" width="137"
                      height="60"/>
            <svg:text x="88.5" y="38" font-family="Verdana" font-size="12" fill="navy"
                      text-anchor="middle"
                      alignment-baseline="middle">COM OBJECT</svg:text>
            <svg:text x="88.5" y="60" font-family="Verdana" font-size="12" fill="navy"
                      text-anchor="middle"
                      alignment-baseline="middle">ActionIdentity</svg:text>
            <svg:text x="88.5" y="72" font-family="Verdana" font-size="12" fill="navy"
                      text-anchor="middle"
                      alignment-baseline="middle">1</svg:text>
            <svg:text x="88.5" y="84" font-family="Verdana" font-size="12" fill="navy"
                      text-anchor="middle"
                      alignment-baseline="middle">MAL::Identifier</svg:text>
          </svg:svg>
        </mal:diagram>
        <com:objects comment="Each action of a provider shall be represented by an ActionIdentity COM object.&#xA;The body of the ActionIdentity COM object shall hold the name of the action.&#xA;The definitions of the actions shall be represented as ActionDefinition COM objects.&#xA;The ActionDefinition object shall use the related link to indicate which ActionIdentity object it uses.&#xA;The source link of the ActionIdentity object should be the object that caused it to be created, most likely a COM OperationActivity object or an operator login in the case of off-line editors being used.&#xA;The source link of the ActionDefinition object should be the object that caused it to be created, most likely a COM OperationActivity object or an operator login in the case of off-line editors being used.&#xA;Instances of an action that are submitted to a provider using the submitAction operation shall be represented as ActionInstance COM object.&#xA;The object instance identifier for an ActionInstance object shall be populated by the consumer.&#xA;The ActionInstance object shall use the related link to indicate which ActionDefinition object it uses.&#xA;Instances of an action that are submitted to a provider using the submitAction operation shall link to the submitAction OperationActivity object using the source link.&#xA;The source link of the submitAction OperationActivity object should be the object that caused it to be created, most likely an operator login or automated procedure object.">
          <com:object name="ActionIdentity" number="1">
            <com:objectType>
              <mal:type name="Identifier" area="MAL"/>
            </com:objectType>
            <com:sourceObject comment="The object that caused it to be created, most likely a COM OperationActivity object or an operator login in the case of off-line editors being used"/>
          </com:object>
          <com:object name="ActionDefinition" number="2">
            <com:objectType>
              <mal:type name="ActionDefinitionDetails" service="Action" area="MC"/>
            </com:objectType>
            <com:relatedObject>
              <com:objectType number="1" service="Action" area="MC"/>
            </com:relatedObject>
            <com:sourceObject comment="The object that caused it to be created, most likely a COM OperationActivity object or an operator login in the case of off-line editors being used"/>
          </com:object>
          <com:object name="ActionInstance" number="3">
            <com:objectType>
              <mal:type name="ActionInstanceDetails" service="Action" area="MC"/>
            </com:objectType>
            <com:relatedObject>
              <com:objectType number="2" service="Action" area="MC"/>
            </com:relatedObject>
            <com:sourceObject comment="The object that caused it to be created, most likely a COM OperationActivity object if created by the submitAction operation"/>
          </com:object>
        </com:objects>
        <com:events comment="Execution progress of an action shall be reported using COM ActivityTracking Execution events.&#xA;The Execution event may be reported many times as it is used to report each stage in the execution of the action. It is implementation specific when a progress step is reached and the Execution event will be reported.&#xA;If the execution of an action fails then that failure shall be reported using the normal COM ActivityTracking event pattern, specifically an ActivityTracking Execution event with the success field set to FALSE.&#xA;If the execution of an action fails with an error code then that error code shall be reported using an ActionFailure COM event in addition to the ActivityTracking event used to report the action failure.&#xA;The source of the ActionFailure event shall be the ActivityTracking Execution event that represents the failure stage of the action execution.&#xA;The related field of the ActionFailure event shall link to the ActionInstance object that failed.&#xA;The body of the event shall hold a numeric failure code that is either a MAL error number or a deployment specific code.&#xA;The specification of the deployment specific failure code is outside the scope of this specification and is expected to be agreed out of band.">
          <com:event name="ActionFailure" number="6"
                     comment="An ActionFailure event is used to hold the error code of the execution failure.">
            <com:objectType>
              <mal:type name="UInteger" area="MAL"/>
            </com:objectType>
            <com:relatedObject>
              <com:objectType number="3" service="Action" area="MC"/>
            </com:relatedObject>
            <com:sourceObject>
              <com:objectType number="5" service="ActivityTracking" area="COM"/>
            </com:sourceObject>
          </com:event>
        </com:events>
        <com:archiveUsage comment="ActionIdentity objects should be stored in the COM archive.&#xA;ActionDefinition objects should be stored in the COM archive.&#xA;Before an action is sent with the submitAction operation, the ActionInstance object should be stored in the COM archive by the consumer.&#xA;The COM activity tracking events associated with the submission and execution of the action should be stored in the COM archive.&#xA;Any ActionFailure COM event objects should be stored in the COM archive."/>
        <com:activityUsage comment="The COM Activity service should be used to monitor the transfer and execution of the submitAction operation.&#xA;The COM Activity service should be used to monitor the transfer and execution of ActionInstance objects.&#xA;The COM activity events for the submitAction operation shall be generated as defined in the COM activity tracking service.&#xA;A Release activity event for the action instance shall be generated when an ActionInstance object is released from a consumer using the submitAction operation.&#xA;The Acceptance activity event for the ActionInstance object, separate from the Acceptance activity event generated for the submitAction operation, shall be generated when an action is received by the destination provider and after any pre-execution checks have been performed.&#xA;The body of the ActionInstance ActivityAcceptance event object shall be populated with the pre-execution checks result.&#xA;The source link of the activity events for the ActionInstance shall be the ActionInstance object.&#xA;The related link of the activity events for the ActionInstance shall be set to NULL.&#xA;In all activity execution events for the action instance the ActivityExecution.stageCount field shall be set to 2 plus the total number of progress stages.&#xA;In the activity execution event, when notification of an action starting is requested, the ActivityExecution.executionStage field shall be set to 1.&#xA;In the activity execution event, when notification of an action progress is requested, the ActivityExecution.executionStage field shall be set to 1 plus the current progress stage. &#xA;In the activity execution event, when notification of an action completion is requested, the ActivityExecution.executionStage field shall be set to 2 plus the total number of progress stages."/>
      </com:features>
    </mal:service>
    <mal:service xsi:type="com:ExtendedServiceType" name="Parameter" number="2"
                 comment="The parameter service allows the user to subscribe to parameter value report and optionally be able to set new values. A single PUBSUB operation is provided for monitoring and publishing of parameter values.&#xA;A parameter value also contains a calculation of the validity of the parameter, the flow chart for this calculation is provided in Figure 3-3:&#xA; validity calculation flow chart &#xA;&#xA;This standard supports the concept of non-standard invalidity states but the meaning and calculation of these is outside the scope of this standard.&#xA;The generation of value reports can be controlled using the enableGeneration operation, which supports the use of groups. Groups must reference parameter identities or groups of parameter identities only.&#xA;The parameter service does not include any value checking, this is delegated to the check service.&#xA;Parameter definitions are maintained using the operations defined in this service but storage of definitions is delegated to the COM archive.">
      <mal:documentation name="High Level Requirements" order="1">The parameter service shall provide:
&lt;ol&gt;
 &lt;li&gt;the capability for periodic reporting of predefined parameter values;&lt;/li&gt;
 &lt;li&gt;the capability for setting the raw parameter value of a set of parameters;&lt;/li&gt;
 &lt;li&gt;the capability for requesting the current value of a set of parameters;&lt;/li&gt;
 &lt;li&gt;the capability for controlling reporting of the parameter values;&lt;/li&gt;
 &lt;li&gt;the capability for maintaining the list of parameter definitions.&lt;/li&gt;
&lt;/ol&gt;
Each parameter value report shall contain:
&lt;ol&gt;
 &lt;li&gt;The validity of the parameter value;&lt;/li&gt;
 &lt;li&gt;The raw value of the parameter;&lt;/li&gt;
 &lt;li&gt;The converted value of the parameter, if applicable.&lt;/li&gt;
&lt;/ol&gt;
The validity of parameter shall be calculated against validity criteria in the parameter definition.
It shall be possible to update, delete, and add parameter definitions.
The list of the parameters definitions may be requested.</mal:documentation>
      <mal:documentation name="Functional Requirements" order="2">The generation of reports of the parameter shall be controlled by the generationEnabled Boolean value in the ParameterDefinitionDetails.
Setting the generationEnabled field to TRUE shall enable generation of reports for a specific parameter.
If a parameter is required to send periodic reports then the time between these reports shall be controlled using the reportInterval Duration value in the ParameterDefinitionDetails.
A reportInterval value of '0' shall mean no periodic reports shall be sent; reports must be triggered by another implementation-specific mechanism in this case.
The generationEnabled values can be set by using the enableGeneration operation.
The generationEnabled and reportInterval values can be set by using the updateDefinition operation.
For onboard parameters, the interval should be a multiple of the minimum sampling interval of those parameters.
If an interval that is not supported by the provider is requested, then an INVALID error shall be returned, and the change rejected.
If the parameter is periodic and reported via a periodic aggregation, and a new report has not been received in the aggregation period, then the validity shall be set to EXPIRED by setting the ParameterValue validityState field to '1'.
If the parameter raw value cannot be obtained, or calculated for synthetic parameters, then the validity state shall be INVALID_RAW by setting the ParameterValue validityState field to '2' and the rawValue set to NULL.
If the validityExpression field is NULL, or the validity expression evaluates to TRUE, and the ParameterDefinitionDetails either does not contain a conversion or the conversion is successful, then the validity state shall be set to VALID by setting the ParameterValue validityState field to '0'.
If the validityExpression field is NULL, or the validity expression evaluates to TRUE, and the conversion of the parameter value fails (for example an unexpected value for a discrete conversion), then the validity state shall be INVALID_CONVERSION by setting the ParameterValue validityState field to '3'.
If the validityExpression field is not NULL and the parameters used to determine the expression are not VALID, then the validity state shall be set to UNVERIFIED by setting the ParameterValue validityState field to '4'.
If the validityExpression field is not NULL and the validity expression evaluates to FALSE, then the validity state shall be set to INVALID by setting the ParameterValue validityState field to '5'.
If the validity of the parameter is INVALID_CONVERSION then the convertedValue of the ParameterValue shall be set to NULL.
If the validity of the parameter is either UNVERIFIED or INVALID and the ParameterDefinitionDetails contains a conversion, then the convertedValue of the ParameterValue shall contain the converted value.
It is supported that other, implementation specific, mechanisms may be used to determine parameter validity.
It is supported that other, deployment specific, validityState values be used however the meaning of those values is deployment specific and outside the scope of this standard. They must use values greater than 127.</mal:documentation>
      <mal:capabilitySet number="1">
        <mal:pubsubIP name="monitorValue" number="1" supportInReplay="true"
                      comment="The monitorValue operation allows a consumer to subscribe for parameter value reports.">
          <mal:messages>
            <mal:publishNotify>
              <mal:field name="objId"
                         comment="The MAL EntityKey.firstSubKey shall contain the parameter name.&#xA;The MAL EntityKey.secondSubKey shall contain the ParameterIdentity object instance identifier.&#xA;The MAL EntityKey.thirdSubKey shall contain the ParameterDefinition object instance identifier.&#xA;The MAL EntityKey.fourthSubKey shall contain the new ParameterValueInstance object instance identifier.&#xA;The timestamp of the ParameterValueInstance report shall be taken from the publish message and shall be the time of the parameter value update.&#xA;The publish message shall include the ObjectId of the source link of the report.&#xA;If no source link is needed then the ObjectId shall be replaced with a NULL.">
                <mal:type name="ObjectId" area="COM"/>
              </mal:field>
              <mal:field name="newValue"
                         comment="The second part of the publish message shall be the ParameterValueInstance object value.">
                <mal:type name="ParameterValue" service="Parameter" area="MC"/>
              </mal:field>
            </mal:publishNotify>
          </mal:messages>
        </mal:pubsubIP>
      </mal:capabilitySet>
      <mal:capabilitySet number="2">
        <mal:requestIP name="getValue" number="2" supportInReplay="true"
                       comment="The getValue operation returns the latest received value for a requested parameter.">
          <mal:messages>
            <mal:request>
              <mal:field name="paramInstIds"
                         comment="The paramInstIds field shall provide the list of ParameterIdentity object instance identifiers.&#xA;The wildcard value of '0' shall be supported and matches all parameters of the provider.&#xA;The wildcard value should be checked for first, if found no other checks of supplied object instance identifiers shall be made.&#xA;If a requested parameter is unknown then an UNKNOWN error shall be returned.&#xA;If a parameter is being reported periodically, using the operation shall not reset the reportInterval timer.">
                <mal:type list="true" name="Long" area="MAL"/>
              </mal:field>
            </mal:request>
            <mal:response>
              <mal:field name="paramValDetails"
                         comment="The response shall contain a list of returned ParameterIdentity and ParameterDefinition object instance identifier pairs and a matching list of parameter values.&#xA;The new value shall not be published via the monitorValue operation.">
                <mal:type list="true" name="ParameterValueDetails" service="Parameter" area="MC"/>
              </mal:field>
            </mal:response>
          </mal:messages>
          <mal:errors>
            <mal:errorRef comment="One or more of the requested parameters is unknown.">
              <mal:type name="UNKNOWN" area="MAL"/>
              <mal:extraInformation comment="A list of the indexes of the error values shall be contained in the extra information field.">
                <mal:type list="true" name="UInteger" area="MAL"/>
              </mal:extraInformation>
            </mal:errorRef>
          </mal:errors>
        </mal:requestIP>
      </mal:capabilitySet>
      <mal:capabilitySet number="3">
        <mal:submitIP name="setValue" number="3" supportInReplay="false"
                      comment="The setValue operation allows a consumer to set the raw value for one or more parameters.">
          <mal:messages>
            <mal:submit>
              <mal:field name="newRawValues"
                         comment="The submitted newRawValues shall hold a list of ParameterRawValues that contain the ParameterIdentity object instance identifier and the respective raw value to be set.&#xA;If the paramInstId field contains the wildcard value of '0' then an INVALID error shall be returned.&#xA;If a requested ParameterIdentity is unknown then an UNKNOWN error shall be returned.&#xA;If a request ParameterIdentity is not settable due to it being read only then a READONLY error shall be returned.&#xA;The rawValue shall contain the new parameter raw value to be set.&#xA;If the supplied new parameter raw value does not match the defined type for the ParameterIdentity then an INVALID error shall be returned.&#xA;If an error is raised then no modifications shall be made as a result of this operation call.&#xA;The parameter values shall be set concurrently, by this it is meant that all values are set at the same time without interleaving of other values being (ATOMIC behaviour). How this is implemented is an implementation detail.&#xA;The service provider shall create new ParameterValueInstance objects for the updated parameter values, store these in the COM Archive, and publish these new values.">
                <mal:type list="true" name="ParameterRawValue" service="Parameter" area="MC"/>
              </mal:field>
            </mal:submit>
          </mal:messages>
          <mal:errors>
            <mal:errorRef comment="One or more of the referenced parameters is unknown.">
              <mal:type name="UNKNOWN" area="MAL"/>
              <mal:extraInformation comment="A list of the indexes of the error values shall be contained in the extra information field.">
                <mal:type list="true" name="UInteger" area="MAL"/>
              </mal:extraInformation>
            </mal:errorRef>
            <mal:errorRef comment="One or more of the parameters being set is read only.">
              <mal:type name="READONLY" area="MC"/>
              <mal:extraInformation comment="A list of the indexes of the error values shall be contained in the extra information field.">
                <mal:type list="true" name="UInteger" area="MAL"/>
              </mal:extraInformation>
            </mal:errorRef>
            <mal:errorRef comment="One of the supplied parameter values contains an invalid value.">
              <mal:type name="INVALID" area="COM"/>
              <mal:extraInformation comment="The extra information field contains a list of the indexes of the erroneous values from the originating list supplied.">
                <mal:type list="true" name="UInteger" area="MAL"/>
              </mal:extraInformation>
            </mal:errorRef>
          </mal:errors>
        </mal:submitIP>
      </mal:capabilitySet>
      <mal:capabilitySet number="4">
        <mal:requestIP name="enableGeneration" number="4" supportInReplay="false"
                       comment="The enableGeneration operation allows a consumer to control whether reports for specific parameters are generated or not. The operation allows the consumer to select the parameters directly or indirectly using groups.">
          <mal:messages>
            <mal:request>
              <mal:field name="isGroupIds"
                         comment="If the isGroupIds field is TRUE then the enableInstances field shall contain GroupIdentity object instance identifiers, otherwise the field contains ParameterIdentity object instance identifiers.&#xA;The ParameterIdentity objects referenced, either directly or indirectly via groups, by the enableInstances field shall be the ParameterIdentity objects to match.&#xA;The id of the enableInstances field shall support the wildcard value of '0' and matches all ParameterIdentity objects of the provider.&#xA;The service provider shall check for the wildcard value in the list of object instance identifiers in the enableInstances field first and if found no other checks of supplied object instance identifiers shall be made.&#xA;If the enableInstances field contains a value of TRUE then reports for matching ParameterIdentity objects shall be generated, a value of FALSE requests that reports will not be generated.&#xA;No error shall be raised if the enableInstances Boolean value supplied is the same as the current generationEnabled field of the definition for a matched ParameterIdentity object i.e. enabling an already enabled parameter will not result in an error.&#xA;If a requested ParameterIdentity or GroupIdentity object is unknown then an UNKNOWN error shall be returned.&#xA;If a requested Group, or the Group objects referenced by that Group, does not contain ParameterIdentity objects then an INVALID error shall be returned.&#xA;If an error is raised then no modifications shall be made as a result of this operation call.&#xA;The provider shall create and store a new ParameterDefinition object in the COM archive if the generationEnabled field is changed.&#xA;If a new ParameterDefinition object is created then that new object shall be the current ParameterDefinition used for the specific ParameterIdentity.">
                <mal:type name="Boolean" area="MAL"/>
              </mal:field>
              <mal:field name="enableInstances"
                         comment="If the generation of reports is being enabled, and the parameter is defined as being periodic, then the provider shall generate a report immediately and start the report interval from that report.">
                <mal:type list="true" name="InstanceBooleanPair" area="COM"/>
              </mal:field>
            </mal:request>
            <mal:response>
              <mal:field name="newObjInstIds"
                         comment="The response shall contain the list of object instance identifiers for the new ParameterDefinition objects.">
                <mal:type list="true" name="Long" area="MAL"/>
              </mal:field>
            </mal:response>
          </mal:messages>
          <mal:errors>
            <mal:errorRef comment="One or more of the requested parameters or groups is unknown.">
              <mal:type name="UNKNOWN" area="MAL"/>
              <mal:extraInformation comment="A list of the indexes of the error values shall be contained in the extra information field.">
                <mal:type list="true" name="UInteger" area="MAL"/>
              </mal:extraInformation>
            </mal:errorRef>
            <mal:errorRef comment="One of the supplied groups is either not a group of groups or a group of ParameterIdentity objects.">
              <mal:type name="INVALID" area="COM"/>
              <mal:extraInformation comment="The extra information field contains a list of the indexes of the erroneous values from the originating list supplied.">
                <mal:type list="true" name="UInteger" area="MAL"/>
              </mal:extraInformation>
            </mal:errorRef>
          </mal:errors>
        </mal:requestIP>
      </mal:capabilitySet>
      <mal:capabilitySet number="5">
        <mal:requestIP name="listDefinition" number="5" supportInReplay="true"
                       comment="The listDefinition operation allows a consumer to request the latest object instance identifiers of the ParameterIdentity and ParameterDefinition objects for the supported parameters of the provider.">
          <mal:messages>
            <mal:request>
              <mal:field name="paramNames"
                         comment="The paramNames field shall contain a list of parameter names to retrieve the ParameterIdentity and ParameterDefinition object instance identifiers for.&#xA;The paramNames field may contain the wildcard value of '*' to return all supported ParameterIdentity and ParameterDefinition objects.&#xA;The wildcard value should be checked for first, if found no other checks of supplied identifiers shall be made.&#xA;If a provided identifier does not include a wildcard and does not match an existing ParameterIdentity object then this operation shall fail with an UNKNOWN error.">
                <mal:type list="true" name="Identifier" area="MAL"/>
              </mal:field>
            </mal:request>
            <mal:response>
              <mal:field name="objInstIds"
                         comment="The response shall contain a list of matching ParameterIdentity and ParameterDefinition object instance identifier pairs.&#xA;The returned list shall maintain the same order as the submitted list unless the wildcard value was included in the request.">
                <mal:type list="true" name="ObjectInstancePair" area="MC"/>
              </mal:field>
            </mal:response>
          </mal:messages>
          <mal:errors>
            <mal:errorRef comment="One of the supplied identifiers is unknown.">
              <mal:type name="UNKNOWN" area="MAL"/>
              <mal:extraInformation comment="A list of the indexes of the error values shall be contained in the extra information field.">
                <mal:type list="true" name="UInteger" area="MAL"/>
              </mal:extraInformation>
            </mal:errorRef>
          </mal:errors>
        </mal:requestIP>
      </mal:capabilitySet>
      <mal:capabilitySet number="6">
        <mal:requestIP name="addParameter" number="6" supportInReplay="false"
                       comment="The addParameter operation allows a consumer to define one or more parameters that do not currently exist.&#xA;The new ParameterIdentity and ParameterDefinition objects are expected to be stored in the COM archive by the provider of the parameter service.">
          <mal:messages>
            <mal:request>
              <mal:field name="paramDefDetails"
                         comment="The paramDefDetails field shall hold the name and the ParameterDefinitionDetails to be added.&#xA;The name field must not be the wildcard '*', or empty (an INVALID error shall be returned in this case).&#xA;If the supplied reportInterval value is not supported by the provider then an INVALID error shall be returned.&#xA;The supplied name must be unique among all ParameterIdentity objects for the domain of the provider otherwise a DUPLICATE error shall be raised.&#xA;If an error is raised then no new identities and definitions shall be added as a result of this operation call.&#xA;If the supplied name matches an existing, but removed, ParameterIdentity then that ParameterIdentity shall be reused otherwise a new ParameterIdentity shall be created.&#xA;The provider shall create a new ParameterDefinition object and store it, and any new ParameterIdentity objects, in the COM archive.">
                <mal:type list="true" name="ParameterCreationRequest" service="Parameter" area="MC"/>
              </mal:field>
            </mal:request>
            <mal:response>
              <mal:field name="newObjInstIds"
                         comment="The response shall contain the list of object instance identifiers for the ParameterIdentity and new ParameterDefinition objects.&#xA;The returned list shall maintain the same order as the submitted definitions.">
                <mal:type list="true" name="ObjectInstancePair" area="MC"/>
              </mal:field>
            </mal:response>
          </mal:messages>
          <mal:errors>
            <mal:errorRef comment="One of the supplied ParameterIdentity objects contains an invalid name or a supplied interval is not supported by the provider.">
              <mal:type name="INVALID" area="COM"/>
              <mal:extraInformation comment="The extra information field contains a list of the indexes of the erroneous values from the originating list supplied.">
                <mal:type list="true" name="UInteger" area="MAL"/>
              </mal:extraInformation>
            </mal:errorRef>
            <mal:errorRef comment="One or more of the ParameterIdentity objects being added has supplied a parameter name that is already in use in the domain.">
              <mal:type name="DUPLICATE" area="COM"/>
              <mal:extraInformation comment="The extra information field contains a list of the indexes of the erroneous values from the originating request list.">
                <mal:type list="true" name="UInteger" area="MAL"/>
              </mal:extraInformation>
            </mal:errorRef>
          </mal:errors>
        </mal:requestIP>
        <mal:requestIP name="updateDefinition" number="7" supportInReplay="false"
                       comment="The updateDefinition operation allows a consumer to update a definition for one or more parameters.&#xA;This differs from deleting an existing parameter and adding a new definition with the same parameter name in the fact that the ParameterIdentity object is not changed between the two definitions.&#xA;The replacement definition should be stored in the COM archive by the service provider. The operation does not remove the previous object from the COM archive, merely removes the object from the provider.">
          <mal:messages>
            <mal:request>
              <mal:field name="paramInstIds"
                         comment="The paramInstIds field shall contain the object instance identifiers of the ParameterIdentity objects to be updated.&#xA;The supplied object instance identifiers shall match existing identity objects, an UNKNOWN error shall be raised if this is not the case.&#xA;If the paramInstIds list contains either NULL or '0' an INVALID error shall be raised.">
                <mal:type list="true" name="Long" area="MAL"/>
              </mal:field>
              <mal:field name="paramDefDetails"
                         comment="The paramDefDetails field shall contain the replacement ParameterDefinitionDetails.&#xA;The two lists shall be ordered the same.&#xA;The number of entries in the two lists shall be the same size otherwise an INVALID error shall be returned.&#xA;If the supplied reportInterval value is not supported by the provider then an INVALID error shall be returned.&#xA;If an error is raised then no definitions shall be updated as a result of this operation call.&#xA;The provider shall create a new ParameterDefinition object and store it in the COM archive.&#xA;The new ParameterDefinition object shall be the current ParameterDefinition used for the specific ParameterIdentity.">
                <mal:type list="true" name="ParameterDefinitionDetails" service="Parameter" area="MC"/>
              </mal:field>
            </mal:request>
            <mal:response>
              <mal:field name="newObjInstIds"
                         comment="The response shall contain the list of object instance identifiers for the new ParameterDefinition objects.&#xA;The returned list shall maintain the same order as the submitted definitions.">
                <mal:type list="true" name="Long" area="MAL"/>
              </mal:field>
            </mal:response>
          </mal:messages>
          <mal:errors>
            <mal:errorRef comment="The supplied object instance identifiers list contains either a NULL or '0' or the two supplied lists are not the same length or a supplied interval is not supported by the provider.&#xA;If the two lists are not the same length then the extra information field shall contain the first index of the element in the largest list which does not have corresponding element in the other list.">
              <mal:type name="INVALID" area="COM"/>
              <mal:extraInformation comment="The extra information field contains a list of the indexes of the erroneous values from the originating list supplied.">
                <mal:type list="true" name="UInteger" area="MAL"/>
              </mal:extraInformation>
            </mal:errorRef>
            <mal:errorRef comment="One of the supplied ParameterIdentity object instance identifiers is unknown.">
              <mal:type name="UNKNOWN" area="MAL"/>
              <mal:extraInformation comment="A list of the indexes of the error values shall be contained in the extra information field.">
                <mal:type list="true" name="UInteger" area="MAL"/>
              </mal:extraInformation>
            </mal:errorRef>
          </mal:errors>
        </mal:requestIP>
        <mal:submitIP name="removeParameter" number="8" supportInReplay="false"
                      comment="The removeParameter operation allows a consumer to remove one or more parameters from the list of parameters supported by the parameter provider.&#xA;The operation does not remove the ParameterIdentity or ParameterDefinition objects from the COM archive, merely removes the objects from the provider. This permits existing parameter values to continue to reference the correct ParameterIdentity and ParameterDefinition objects in the COM archive.">
          <mal:messages>
            <mal:submit>
              <mal:field name="paramInstIds"
                         comment="The paramInstIds field shall hold the object instance identifiers of the ParameterIdentity objects to be removed from the provider.&#xA;The list may contain the wildcard value of '0'.&#xA;The wildcard value should be checked for first, if found no other checks of supplied object instance identifiers shall be made.&#xA;If a provided ParameterIdentity object instance identifier does not include a wildcard and does not match an existing parameter identity object then this operation shall fail with an UNKNOWN error.&#xA;Matched ParameterIdentity and ParameterDefinition objects shall not be removed from the COM archive only the list of ParameterIdentity and ParameterDefinition objects from the provider.&#xA;If an error is raised then no parameters shall be removed as a result of this operation call.&#xA;If the operation succeeds then the provider shall not publish parameter values for the deleted ParameterIdentity objects anymore.">
                <mal:type list="true" name="Long" area="MAL"/>
              </mal:field>
            </mal:submit>
          </mal:messages>
          <mal:errors>
            <mal:errorRef comment="One of the supplied ParameterIdentity object instance identifiers is unknown.">
              <mal:type name="UNKNOWN" area="MAL"/>
              <mal:extraInformation comment="A list of the indexes of the error values shall be contained in the extra information field.">
                <mal:type list="true" name="UInteger" area="MAL"/>
              </mal:extraInformation>
            </mal:errorRef>
          </mal:errors>
        </mal:submitIP>
      </mal:capabilitySet>
      <mal:dataTypes>
        <mal:enumeration name="ValidityState" shortFormPart="4"
                         comment="Convenience enumeration that holds the validity states and their numeric values.">
          <mal:item value="VALID" nvalue="0" comment="Valid."/>
          <mal:item value="EXPIRED" nvalue="1"
                    comment="The parameter has a timeout associated which has expired"/>
          <mal:item value="INVALID_RAW" nvalue="2"
                    comment="The parameter raw value cannot be obtained, or calculated for synthetic parameters"/>
          <mal:item value="INVALID_CONVERSION" nvalue="3"
                    comment="The validity expression either has evaluated to TRUE or there is no validity defined, but the conversion of the parameter value has failed (for example an unexpected value for a discrete conversion)"/>
          <mal:item value="UNVERIFIED" nvalue="4"
                    comment="The validity of the validity expression has been evaluated to FALSE and therefore cannot be used to verify the current value"/>
          <mal:item value="INVALID" nvalue="5"
                    comment="The validity expression has been evaluated to FALSE"/>
        </mal:enumeration>
        <mal:composite name="ParameterDefinitionDetails" shortFormPart="1"
                       comment="The ParameterDefinitionDetails structure holds a parameter definition. The conversion field defines the conditions where the relevant conversion is applied. For onboard parameters, the report interval should be a multiple of the minimum sampling interval of that parameter.">
          <mal:extends>
            <mal:type name="Composite" area="MAL"/>
          </mal:extends>
          <mal:field name="description" canBeNull="false"
                     comment="The description of the parameter. May be empty.">
            <mal:type name="String" area="MAL"/>
          </mal:field>
          <mal:field name="rawType" canBeNull="false"
                     comment="Holds the attribute short form part of the raw type of the parameter, e.g., for a MAL::String parameter it shall hold 15.">
            <mal:type name="Octet" area="MAL"/>
          </mal:field>
          <mal:field name="rawUnit"
                     comment="The unit for the raw value. If NULL then raw type has no unit.">
            <mal:type name="String" area="MAL"/>
          </mal:field>
          <mal:field name="generationEnabled" canBeNull="false"
                     comment="Controls whether reports for this parameter are to be generated.">
            <mal:type name="Boolean" area="MAL"/>
          </mal:field>
          <mal:field name="reportInterval" canBeNull="false"
                     comment="Periodic report interval. No periodic reports to be generated if this is set to '0'.">
            <mal:type name="Duration" area="MAL"/>
          </mal:field>
          <mal:field name="validityExpression"
                     comment="Expression that determines this parameter's validity state. Can be NULL if no validity check is required or validity is calculated by implementation-specific mechanisms.">
            <mal:type name="ParameterExpression" area="MC"/>
          </mal:field>
          <mal:field name="conversion" comment="If present then parameter has a converted type.">
            <mal:type name="ParameterConversion" service="Parameter" area="MC"/>
          </mal:field>
        </mal:composite>
        <mal:composite name="ParameterValue" shortFormPart="2"
                       comment="This structure holds a specific value of the parameter. The type of the value shall match that specified in the parameter definition.">
          <mal:extends>
            <mal:type name="Composite" area="MAL"/>
          </mal:extends>
          <mal:field name="validityState" canBeNull="false"
                     comment="Holds the validity state for a parameter value. If the parameter is valid then this should be set to '0'.">
            <mal:type name="UOctet" area="MAL"/>
          </mal:field>
          <mal:field name="rawValue"
                     comment="The parameter raw value. The value of NULL is a valid value and carries no special significance in the parameter service.">
            <mal:type name="Attribute" area="MAL"/>
          </mal:field>
          <mal:field name="convertedValue" comment="The parameter converted value.">
            <mal:type name="Attribute" area="MAL"/>
          </mal:field>
        </mal:composite>
        <mal:composite name="ParameterConversion" shortFormPart="3"
                       comment="The ParameterConversion structure holds information about the conversions to be applied to a parameter.">
          <mal:extends>
            <mal:type name="Composite" area="MAL"/>
          </mal:extends>
          <mal:field name="convertedType" canBeNull="false"
                     comment="Holds the attribute short form part of the converted type of the parameter, e.g., for a MAL::String parameter it shall hold 15.">
            <mal:type name="Octet" area="MAL"/>
          </mal:field>
          <mal:field name="convertedUnit"
                     comment="The converted parameter unit. If NULL then converted type has no unit.">
            <mal:type name="String" area="MAL"/>
          </mal:field>
          <mal:field name="conditionalConversions" canBeNull="false"
                     comment="The conversions to be applied. Only the first TRUE conversion should be applied.">
            <mal:type list="true" name="ConditionalConversion" area="MC"/>
          </mal:field>
        </mal:composite>
        <mal:composite name="ParameterCreationRequest" shortFormPart="5"
                       comment="The ParameterCreationRequest contains all the fields required when creating a new parameter in a provider.">
          <mal:extends>
            <mal:type name="Composite" area="MAL"/>
          </mal:extends>
          <mal:field name="name" canBeNull="false"
                     comment="The name of the parameter. Must not be empty or the wildcard value.">
            <mal:type name="Identifier" area="MAL"/>
          </mal:field>
          <mal:field name="paramDefDetails" canBeNull="false"
                     comment="The parameter definition details.">
            <mal:type name="ParameterDefinitionDetails" service="Parameter" area="MC"/>
          </mal:field>
        </mal:composite>
        <mal:composite name="ParameterRawValue" shortFormPart="6"
                       comment="The ParameterRawValue structure holds a new raw value for a specific parameter.">
          <mal:extends>
            <mal:type name="Composite" area="MAL"/>
          </mal:extends>
          <mal:field name="paramInstId" canBeNull="false"
                     comment="The object instance identifier of the parameter identity.">
            <mal:type name="Long" area="MAL"/>
          </mal:field>
          <mal:field name="rawValue"
                     comment="The parameter raw value. The value of NULL is a valid value and carries no special significance in the parameter service.">
            <mal:type name="Attribute" area="MAL"/>
          </mal:field>
        </mal:composite>
        <mal:composite name="ParameterValueDetails" shortFormPart="7"
                       comment="This structure holds a specific time stamped value of the parameter. The type of the value shall match that specified in the parameter definition.">
          <mal:field name="paramId" canBeNull="false"
                     comment="The ParameterIdentity object instance identifier.">
            <mal:type name="Long" area="MAL"/>
          </mal:field>
          <mal:field name="defId" canBeNull="false"
                     comment="The ParameterDefinition object instance identifier.">
            <mal:type name="Long" area="MAL"/>
          </mal:field>
          <mal:field name="timestamp" canBeNull="false" comment="The timestamp of the value.">
            <mal:type name="Time" area="MAL"/>
          </mal:field>
          <mal:field name="value" canBeNull="false" comment="The parameter value.">
            <mal:type name="ParameterValue" service="Parameter" area="MC"/>
          </mal:field>
        </mal:composite>
      </mal:dataTypes>
      <com:features>
        <mal:diagram name="ParameterObjects">
          <svg:svg width="560" height="400" version="1.1">
            <svg:rect x="360" y="170" fill="#FCF2E3" stroke="black" stroke-width="2" width="180"
                      height="70"/>
            <svg:text x="450" y="188" font-family="Verdana" font-size="12" fill="navy"
                      text-anchor="middle"
                      alignment-baseline="middle">COM_UNSPECIFIED</svg:text>
            <svg:text x="450" y="210" font-family="Verdana" font-size="12" fill="navy"
                      text-anchor="middle"
                      alignment-baseline="middle">COM::UNSPECIFIED_OBJECT</svg:text>
            <svg:text x="450" y="222" font-family="Verdana" font-size="12" fill="navy"
                      text-anchor="middle"
                      alignment-baseline="middle"/>
            <svg:text x="450" y="234" font-family="Verdana" font-size="12" fill="navy"
                      text-anchor="middle"
                      alignment-baseline="middle"/>
            <svg:rect x="20" y="170" fill="#FCF2E3" stroke="black" stroke-width="2" width="170"
                      height="70"/>
            <svg:text x="105" y="188" font-family="Verdana" font-size="12" fill="navy"
                      text-anchor="middle"
                      alignment-baseline="middle">COM OBJECT</svg:text>
            <svg:text x="105" y="210" font-family="Verdana" font-size="12" fill="navy"
                      text-anchor="middle"
                      alignment-baseline="middle">ParameterDefinition</svg:text>
            <svg:text x="105" y="222" font-family="Verdana" font-size="12" fill="navy"
                      text-anchor="middle"
                      alignment-baseline="middle">2</svg:text>
            <svg:text x="105" y="234" font-family="Verdana" font-size="12" fill="navy"
                      text-anchor="middle"
                      alignment-baseline="middle">ParameterDefinitionDetails</svg:text>
            <svg:rect x="20" y="310" fill="#FCF2E3" stroke="black" stroke-width="2" width="170"
                      height="70"/>
            <svg:text x="105" y="328" font-family="Verdana" font-size="12" fill="navy"
                      text-anchor="middle"
                      alignment-baseline="middle">COM OBJECT</svg:text>
            <svg:text x="105" y="350" font-family="Verdana" font-size="12" fill="navy"
                      text-anchor="middle"
                      alignment-baseline="middle">ParameterValueInstance</svg:text>
            <svg:text x="105" y="362" font-family="Verdana" font-size="12" fill="navy"
                      text-anchor="middle"
                      alignment-baseline="middle">3</svg:text>
            <svg:text x="105" y="374" font-family="Verdana" font-size="12" fill="navy"
                      text-anchor="middle"
                      alignment-baseline="middle">ParameterValue</svg:text>
            <svg:rect x="20" y="20" fill="#FCF2E3" stroke="black" stroke-width="2" width="170"
                      height="70"/>
            <svg:text x="105" y="38" font-family="Verdana" font-size="12" fill="navy"
                      text-anchor="middle"
                      alignment-baseline="middle">COM OBJECT</svg:text>
            <svg:text x="105" y="60" font-family="Verdana" font-size="12" fill="navy"
                      text-anchor="middle"
                      alignment-baseline="middle">ParameterIdentity</svg:text>
            <svg:text x="105" y="72" font-family="Verdana" font-size="12" fill="navy"
                      text-anchor="middle"
                      alignment-baseline="middle">1</svg:text>
            <svg:text x="105" y="84" font-family="Verdana" font-size="12" fill="navy"
                      text-anchor="middle"
                      alignment-baseline="middle">MAL::Identifier</svg:text>
          </svg:svg>
        </mal:diagram>
        <com:objects comment="Each parameter of a provider shall be represented by a ParameterIdentity COM object.&#xA;The body of the ParameterIdentity COM object shall hold the name of the parameter.&#xA;The definitions of the parameters shall be represented as ParameterDefinition COM objects.&#xA;Parameter value report shall be represented as ParameterValueInstance COM objects.&#xA;The ParameterDefinition object shall use the related link to indicate which ParameterIdentity object it uses.&#xA;The ParameterValueInstance object shall use the related link to indicate which ParameterDefinition object it uses.&#xA;The source link of the ParameterIdentity object should be the object that caused it to be created, most likely a COM OperationActivity object or an operator login in the case of off-line editors being used.&#xA;The source link of the ParameterDefinition object should be the object that caused it to be created, most likely a COM OperationActivity object or an operator login in the case of off-line editors being used.&#xA;The source link of the ParameterValueInstance object should be the object that caused the report to be generated.&#xA;The source link of the ParameterValueInstance object shall be NULL for periodic reports.">
          <com:object name="ParameterIdentity" number="1">
            <com:objectType>
              <mal:type name="Identifier" area="MAL"/>
            </com:objectType>
            <com:sourceObject comment="The object that caused it to be created, most likely a COM OperationActivity object or an operator login in the case of off-line editors being used"/>
          </com:object>
          <com:object name="ParameterDefinition" number="2">
            <com:objectType>
              <mal:type name="ParameterDefinitionDetails" service="Parameter" area="MC"/>
            </com:objectType>
            <com:relatedObject>
              <com:objectType number="1" service="Parameter" area="MC"/>
            </com:relatedObject>
            <com:sourceObject comment="The object that caused it to be created, most likely a COM OperationActivity object or an operator login in the case of off-line editors being used"/>
          </com:object>
          <com:object name="ParameterValueInstance" number="3">
            <com:objectType>
              <mal:type name="ParameterValue" service="Parameter" area="MC"/>
            </com:objectType>
            <com:relatedObject>
              <com:objectType number="2" service="Parameter" area="MC"/>
            </com:relatedObject>
            <com:sourceObject comment="The object that caused the value to be generated or NULL for periodic reports"/>
          </com:object>
        </com:objects>
        <com:archiveUsage comment="ParameterIdentity and ParameterDefinition objects should be stored in the COM archive.&#xA;When a parameter value report is published, the ParameterValueInstance object should be stored in the COM archive."/>
      </com:features>
    </mal:service>
    <mal:service xsi:type="com:ExtendedServiceType" name="Alert" number="3"
                 comment="The alert service defines the structures and patterns for the publishing and monitoring of alerts. The alert service uses COM event service to monitor and publish alert events.&#xA;The generation of alerts can be controlled using the enableGeneration operation, which supports the use of groups. Groups must reference either other groups or alerts only.&#xA;Alert definitions are maintained using the operations defined in this service but storage of definitions is delegated to the COM archive.">
      <mal:documentation name="High Level Requirements" order="1">The alert service shall provide:
&lt;ol&gt;
 &lt;li&gt;the capability for reporting of alerts;&lt;/li&gt;
 &lt;li&gt;the capability for controlling reporting of alerts;&lt;/li&gt;
 &lt;li&gt;the capability for maintaining the list of alert definitions.&lt;/li&gt;
&lt;/ol&gt;
The alert reporting service shall provide the capability to enable and disable the generation of alert reports.
It shall be possible to update, delete, and add alert definitions.
The list of the alert definitions may be requested.</mal:documentation>
      <mal:documentation name="Functional Requirements" order="2">The generation of alerts shall be controlled by the generationEnabled Boolean value in the AlertDefinitionDetails.
Setting the generationEnabled field to TRUE shall enable generation of instances of that alert.
The generationEnabled value can be set by using either the enableGeneration or updateDefinition operations.
The alert instances shall be published as events using the COM event operations.</mal:documentation>
      <mal:capabilitySet number="1">
        <mal:requestIP name="enableGeneration" number="1" supportInReplay="false"
                       comment="The enableGeneration operation allows a consumer to control whether updates for specific alerts are generated or not. The operation allows the consumer to select the alerts directly or indirectly using groups.">
          <mal:messages>
            <mal:request>
              <mal:field name="isGroupIds"
                         comment="If the isGroupIds field is TRUE then the enableInstances field shall contain GroupIdentity object instance identifiers, otherwise the field contains AlertIdentity object instance identifiers.&#xA;The AlertIdentity objects referenced, either directly or indirectly via groups, by the enableInstances field shall be the AlertIdentity objects to match.&#xA;The id of the enableInstances field shall support the wildcard value of '0' and matches all AlertIdentity objects of the provider.&#xA;The service provider shall check for the wildcard value in the list of object instance identifiers in the enableInstances field first and if found no other checks of supplied object instance identifiers shall be made.&#xA;If the enableInstances field contains a value of TRUE then instances of matching AlertIdentity objects shall be generated, a value of FALSE requests that instances will not be generated.&#xA;No error shall be raised if the enableInstances Boolean value supplied is the same as the current generationEnabled field for an alert object i.e. enabling an already enabled alert will not result in an error.&#xA;If a requested AlertIdentity or GroupIdentity object is unknown then an UNKNOWN error shall be returned.&#xA;If a requested Group, or the Group objects referenced by that Group, does not contain AlertIdentity objects then an INVALID error shall be returned.&#xA;If an error is raised then no modifications shall be made as a result of this operation call.&#xA;The provider shall create and store a new AlertDefinition object in the COM archive if the generationEnabled field is changed.&#xA;If a new AlertDefinition object is created then that new object shall be the current AlertDefinition used for the specific AlertIdentity.">
                <mal:type name="Boolean" area="MAL"/>
              </mal:field>
              <mal:field name="enableInstances">
                <mal:type list="true" name="InstanceBooleanPair" area="COM"/>
              </mal:field>
            </mal:request>
            <mal:response>
              <mal:field name="newObjInstIds"
                         comment="The response shall contain the list of object instance identifiers for the new AlertDefinition objects.">
                <mal:type list="true" name="Long" area="MAL"/>
              </mal:field>
            </mal:response>
          </mal:messages>
          <mal:errors>
            <mal:errorRef comment="One of the supplied groups is either not a group of groups or a group of AlertIdentity objects.">
              <mal:type name="INVALID" area="COM"/>
              <mal:extraInformation comment="The extra information field contains a list of the indexes of the erroneous values from the originating list supplied.">
                <mal:type list="true" name="UInteger" area="MAL"/>
              </mal:extraInformation>
            </mal:errorRef>
            <mal:errorRef comment="One or more of the requested alerts or group objects is unknown.">
              <mal:type name="UNKNOWN" area="MAL"/>
              <mal:extraInformation comment="A list of the indexes of the error values shall be contained in the extra information field.">
                <mal:type list="true" name="UInteger" area="MAL"/>
              </mal:extraInformation>
            </mal:errorRef>
          </mal:errors>
        </mal:requestIP>
      </mal:capabilitySet>
      <mal:capabilitySet number="2">
        <mal:requestIP name="listDefinition" number="2" supportInReplay="true"
                       comment="The listDefinition operation allows a consumer to request the latest object instance identifiers of the AlertIdentity and AlertDefinition objects for the supported alerts of the provider.">
          <mal:messages>
            <mal:request>
              <mal:field name="alertNames"
                         comment="The alertNames field shall contain a list of alert names to retrieve the AlertIdentity and AlertDefinition object instance identifiers for.&#xA;The alertNames field may contain the wildcard value of '*' to return all supported AlertIdentity and AlertDefinition objects.&#xA;The wildcard value should be checked for first, if found no other checks of supplied identifiers shall be made.&#xA;If a provided identifier does not include a wildcard and does not match an existing AlertIdentity object then this operation shall fail with an UNKNOWN error.">
                <mal:type list="true" name="Identifier" area="MAL"/>
              </mal:field>
            </mal:request>
            <mal:response>
              <mal:field name="alertObjInstIds"
                         comment="The response shall contain a list of matching AlertIdentity and AlertDefinition object instance identifiers.&#xA;The returned list shall maintain the same order as the submitted list unless the wildcard value was included in the request.">
                <mal:type list="true" name="ObjectInstancePair" area="MC"/>
              </mal:field>
            </mal:response>
          </mal:messages>
          <mal:errors>
            <mal:errorRef comment="One of the supplied identifiers is unknown.">
              <mal:type name="UNKNOWN" area="MAL"/>
              <mal:extraInformation comment="A list of the indexes of the error values shall be contained in the extra information field.">
                <mal:type list="true" name="UInteger" area="MAL"/>
              </mal:extraInformation>
            </mal:errorRef>
          </mal:errors>
        </mal:requestIP>
      </mal:capabilitySet>
      <mal:capabilitySet number="3">
        <mal:requestIP name="addAlert" number="3" supportInReplay="false"
                       comment="The addAlert operation allows a consumer to define one or more alerts that do not currently exist.&#xA;The new AlertIdentity and AlertDefinition objects are expected to be stored in the COM archive by the provider of the alert service.">
          <mal:messages>
            <mal:request>
              <mal:field name="alertDefDetails"
                         comment="The alertDefDetails field shall hold the name and the AlertDefinitionDetails to be added.&#xA;The name field must not be the wildcard '*', or empty (an INVALID error shall be returned in this case).&#xA;The supplied name must be unique among all AlertIdentity objects for the domain of the provider otherwise a DUPLICATE error shall be raised.&#xA;If an error is raised then no new identities and definitions shall be added as a result of this operation call.&#xA;If the supplied name matches an existing, but removed, AlertIdentity then that AlertIdentity shall be reused otherwise a new AlertIdentity shall be created.&#xA;The provider shall create a new AlertDefinition object and store it, and any new AlertIdentity objects, in the COM archive.">
                <mal:type list="true" name="AlertCreationRequest" service="Alert" area="MC"/>
              </mal:field>
            </mal:request>
            <mal:response>
              <mal:field name="newObjInstIds"
                         comment="The response shall contain the list of object instance identifiers for the AlertIdentity and new AlertDefinition objects.&#xA;The returned list shall maintain the same order as the submitted definitions.">
                <mal:type list="true" name="ObjectInstancePair" area="MC"/>
              </mal:field>
            </mal:response>
          </mal:messages>
          <mal:errors>
            <mal:errorRef comment="One or more of the AlertIdentity objects being added has supplied an alert name that is already in use in the domain.">
              <mal:type name="DUPLICATE" area="COM"/>
              <mal:extraInformation comment="The extra information field contains a list of the indexes of the erroneous values from the originating request list.">
                <mal:type list="true" name="UInteger" area="MAL"/>
              </mal:extraInformation>
            </mal:errorRef>
            <mal:errorRef comment="One of the supplied AlertIdentity objects contains an invalid name.">
              <mal:type name="INVALID" area="COM"/>
              <mal:extraInformation comment="The extra information field contains a list of the indexes of the erroneous values from the originating list supplied.">
                <mal:type list="true" name="UInteger" area="MAL"/>
              </mal:extraInformation>
            </mal:errorRef>
          </mal:errors>
        </mal:requestIP>
        <mal:requestIP name="updateDefinition" number="4" supportInReplay="false"
                       comment="The updateDefinition operation allows a consumer to update a definition for one or more alerts.&#xA;This differs from deleting an existing alert and adding a new definition with the same alert name in the fact that the AlertIdentity object is not changed between the two definitions.&#xA;The replacement definition should be stored in the COM archive by the service provider. The operation does not remove the previous object from the COM archive, merely removes the object from the provider.">
          <mal:messages>
            <mal:request>
              <mal:field name="alertObjInstIds"
                         comment="The alertObjInstIds field shall contain the object instance identifiers of the AlertIdentity objects to be updated.&#xA;The supplied object instance identifiers shall match existing identity objects, an UNKNOWN error shall be raised if this is not the case.&#xA;If the alertObjInstIds list contains either NULL or '0' an INVALID error shall be raised.">
                <mal:type list="true" name="Long" area="MAL"/>
              </mal:field>
              <mal:field name="alertDefDetails"
                         comment="The alertDefDetails field shall contain the replacement AlertDefinitionDetails.&#xA;The two lists shall be ordered the same.&#xA;The number of entries in the two lists shall be the same size otherwise an INVALID error shall be returned.&#xA;If an error is raised then no definitions shall be updated as a result of this operation call.&#xA;The provider shall create a new AlertDefinition object and store it in the COM archive.&#xA;The new AlertDefinition object shall be the current AlertDefinition used for the specific AlertIdentity.">
                <mal:type list="true" name="AlertDefinitionDetails" service="Alert" area="MC"/>
              </mal:field>
            </mal:request>
            <mal:response>
              <mal:field name="newObjInstIds"
                         comment="The response shall contain the list of object instance identifiers for the new AlertDefinition objects.&#xA;The returned list shall maintain the same order as the submitted definitions.">
                <mal:type list="true" name="Long" area="MAL"/>
              </mal:field>
            </mal:response>
          </mal:messages>
          <mal:errors>
            <mal:errorRef comment="One of the supplied AlertDefinition objects contains an invalid value or the two supplied lists are not the same length.&#xA;If the two lists are not the same length then the extra information field shall contain the first index of the element in the largest list which does not have corresponding element in the other list.">
              <mal:type name="INVALID" area="COM"/>
              <mal:extraInformation comment="The extra information field contains a list of the indexes of the erroneous values from the originating list supplied.">
                <mal:type list="true" name="UInteger" area="MAL"/>
              </mal:extraInformation>
            </mal:errorRef>
            <mal:errorRef comment="One of the supplied AlertIdentity object instance identifiers is unknown.">
              <mal:type name="UNKNOWN" area="MAL"/>
              <mal:extraInformation comment="A list of the indexes of the error values shall be contained in the extra information field.">
                <mal:type list="true" name="UInteger" area="MAL"/>
              </mal:extraInformation>
            </mal:errorRef>
          </mal:errors>
        </mal:requestIP>
        <mal:submitIP name="removeAlert" number="5" supportInReplay="false"
                      comment="The removeAlert operation allows a consumer to remove one or more definitions from the list of alerts supported by the alert provider.&#xA;The operation does not remove the AlertIdentity or AlertDefinition objects from the COM archive, merely removes the objects from the provider. This permits existing AlertEvent objects to continue to reference the correct AlertDefinition object in the COM archive.">
          <mal:messages>
            <mal:submit>
              <mal:field name="alertInstIds"
                         comment="The alertInstIds field shall hold the object instance identifiers of the AlertIdentity objects to be removed from the provider.&#xA;The list may contain the wildcard value of '0'.&#xA;The wildcard value should be checked for first, if found no other checks of supplied object instance identifiers shall be made.&#xA;If a provided AlertIdentity object instance identifier does not include a wildcard and does not match an existing AlertIdentity object then this operation shall fail with an UNKNOWN error.&#xA;Matched AlertIdentity objects shall not be removed from the COM archive only the list of AlertIdentity objects in the provider.&#xA;If an error is raised then no alerts shall be removed as a result of this operation call.&#xA;If the operation succeeds then the provider shall not publish AlertEvent events for the deleted AlertIdentity objects anymore.">
                <mal:type list="true" name="Long" area="MAL"/>
              </mal:field>
            </mal:submit>
          </mal:messages>
          <mal:errors>
            <mal:errorRef comment="One of the supplied AlertIdentity object instance identifiers is unknown.">
              <mal:type name="UNKNOWN" area="MAL"/>
              <mal:extraInformation comment="A list of the indexes of the error values shall be contained in the extra information field.">
                <mal:type list="true" name="UInteger" area="MAL"/>
              </mal:extraInformation>
            </mal:errorRef>
          </mal:errors>
        </mal:submitIP>
      </mal:capabilitySet>
      <mal:dataTypes>
        <mal:composite name="AlertDefinitionDetails" shortFormPart="1"
                       comment="The AlertDefinitionDetails provides the definition of an alert including any argument definitions.">
          <mal:extends>
            <mal:type name="Composite" area="MAL"/>
          </mal:extends>
          <mal:field name="description" canBeNull="false" comment="The description of the alert.">
            <mal:type name="String" area="MAL"/>
          </mal:field>
          <mal:field name="severity" canBeNull="false" comment="Severity of the alert.">
            <mal:type name="Severity" area="MC"/>
          </mal:field>
          <mal:field name="generationEnabled" canBeNull="false"
                     comment="Controls whether instances of this alert are to be generated.">
            <mal:type name="Boolean" area="MAL"/>
          </mal:field>
          <mal:field name="arguments" canBeNull="false" comment="The list of argument definitions.">
            <mal:type list="true" name="ArgumentDefinitionDetails" area="MC"/>
          </mal:field>
        </mal:composite>
        <mal:composite name="AlertEventDetails" shortFormPart="2"
                       comment="The AlertEventDetails structure holds the details of an instance of an alert.">
          <mal:extends>
            <mal:type name="Composite" area="MAL"/>
          </mal:extends>
          <mal:field name="argumentValues"
                     comment="List containing the values of the arguments. The ordering of the list matches that of the definition. If a value for a particular entry is not being supplied, then its position is filled with a NULL value. If no arguments are defined, then the complete list is replaced with a NULL.">
            <mal:type list="true" name="AttributeValue" area="MC"/>
          </mal:field>
          <mal:field name="argumentIds"
                     comment="Optional list of argument definition identifiers. Allows the consumer to verify that the correct arguments are being supplied. The ordering of the list matches that of the argument list of the alert definition.">
            <mal:type list="true" name="Identifier" area="MAL"/>
          </mal:field>
        </mal:composite>
        <mal:composite name="AlertCreationRequest" shortFormPart="3"
                       comment="The AlertCreationRequest contains all the fields required when creating a new alert in a provider.">
          <mal:extends>
            <mal:type name="Composite" area="MAL"/>
          </mal:extends>
          <mal:field name="name" canBeNull="false"
                     comment="Alert name. Must not be empty or wildcard value.">
            <mal:type name="Identifier" area="MAL"/>
          </mal:field>
          <mal:field name="alertDefDetails" canBeNull="false"
                     comment="The alert definition details.">
            <mal:type name="AlertDefinitionDetails" service="Alert" area="MC"/>
          </mal:field>
        </mal:composite>
      </mal:dataTypes>
      <com:features>
        <mal:diagram name="AlertObjects">
          <svg:svg width="520" height="370" version="1.1">
            <svg:rect x="20" y="150" fill="#FCF2E3" stroke="black" stroke-width="2" width="137"
                      height="60"/>
            <svg:text x="88.5" y="168" font-family="Verdana" font-size="12" fill="navy"
                      text-anchor="middle"
                      alignment-baseline="middle">COM OBJECT</svg:text>
            <svg:text x="88.5" y="190" font-family="Verdana" font-size="12" fill="navy"
                      text-anchor="middle"
                      alignment-baseline="middle">AlertDefinition</svg:text>
            <svg:text x="88.5" y="202" font-family="Verdana" font-size="12" fill="navy"
                      text-anchor="middle"
                      alignment-baseline="middle">2</svg:text>
            <svg:text x="88.5" y="214" font-family="Verdana" font-size="12" fill="navy"
                      text-anchor="middle"
                      alignment-baseline="middle">AlertDefinitionDetails</svg:text>
            <svg:rect x="310" y="140" fill="#FCF2E3" stroke="black" stroke-width="2" width="190"
                      height="80"/>
            <svg:text x="405" y="158" font-family="Verdana" font-size="12" fill="navy"
                      text-anchor="middle"
                      alignment-baseline="middle">COM_UNSPECIFIED</svg:text>
            <svg:text x="405" y="180" font-family="Verdana" font-size="12" fill="navy"
                      text-anchor="middle"
                      alignment-baseline="middle">COM::UNSPECIFIED_OBJECT</svg:text>
            <svg:text x="405" y="192" font-family="Verdana" font-size="12" fill="navy"
                      text-anchor="middle"
                      alignment-baseline="middle"/>
            <svg:text x="405" y="204" font-family="Verdana" font-size="12" fill="navy"
                      text-anchor="middle"
                      alignment-baseline="middle"/>
            <svg:rect x="20" y="290" fill="#FCF2E3" stroke="black" stroke-width="2" width="137"
                      height="60"/>
            <svg:text x="88.5" y="308" font-family="Verdana" font-size="12" fill="navy"
                      text-anchor="middle"
                      alignment-baseline="middle">COM EVENT</svg:text>
            <svg:text x="88.5" y="330" font-family="Verdana" font-size="12" fill="navy"
                      text-anchor="middle"
                      alignment-baseline="middle">AlertEvent</svg:text>
            <svg:text x="88.5" y="342" font-family="Verdana" font-size="12" fill="navy"
                      text-anchor="middle"
                      alignment-baseline="middle">3</svg:text>
            <svg:text x="88.5" y="354" font-family="Verdana" font-size="12" fill="navy"
                      text-anchor="middle"
                      alignment-baseline="middle">AlertEventDetails</svg:text>
            <svg:rect x="20" y="20" fill="#FCF2E3" stroke="black" stroke-width="2" width="137"
                      height="60"/>
            <svg:text x="88.5" y="38" font-family="Verdana" font-size="12" fill="navy"
                      text-anchor="middle"
                      alignment-baseline="middle">COM OBJECT</svg:text>
            <svg:text x="88.5" y="60" font-family="Verdana" font-size="12" fill="navy"
                      text-anchor="middle"
                      alignment-baseline="middle">AlertIdentity</svg:text>
            <svg:text x="88.5" y="72" font-family="Verdana" font-size="12" fill="navy"
                      text-anchor="middle"
                      alignment-baseline="middle">1</svg:text>
            <svg:text x="88.5" y="84" font-family="Verdana" font-size="12" fill="navy"
                      text-anchor="middle"
                      alignment-baseline="middle">MAL::Identifier</svg:text>
          </svg:svg>
        </mal:diagram>
        <com:objects comment="Each alert of a provider shall be represented by an AlertIdentity COM object.&#xA;The body of the AlertIdentity COM object shall hold the name of the alert.&#xA;The definitions of the alerts shall be represented as AlertDefinition COM objects.&#xA;Instances of an alert shall be represented as an AlertEvent COM event.&#xA;The AlertDefinition object shall use the related link to indicate which AlertIdentity object it uses.&#xA;The AlertEvent object shall use the related link to indicate which AlertDefinition object it uses.&#xA;The source link of the AlertIdentity object should be the object that caused it to be created, most likely a COM OperationActivity object or an operator login in the case of off-line editors being used.&#xA;The source link of the AlertDefinition object should be the object that caused it to be created, most likely a COM OperationActivity object or an operator login in the case of off-line editors being used.">
          <com:object name="AlertIdentity" number="1">
            <com:objectType>
              <mal:type name="Identifier" area="MAL"/>
            </com:objectType>
            <com:sourceObject comment="The object that caused it to be created, most likely a COM OperationActivity object or an operator login in the case of off-line editors being used"/>
          </com:object>
          <com:object name="AlertDefinition" number="2">
            <com:objectType>
              <mal:type name="AlertDefinitionDetails" service="Alert" area="MC"/>
            </com:objectType>
            <com:relatedObject>
              <com:objectType number="1" service="Alert" area="MC"/>
            </com:relatedObject>
            <com:sourceObject comment="The object that caused it to be created, most likely a COM OperationActivity object or an operator login in the case of off-line editors being used"/>
          </com:object>
        </com:objects>
        <com:events comment="When an alert is generated it shall be represented as a COM event.&#xA;The event shall be published using the COM event service.&#xA;The source link of the AlertEvent object shall be the object that caused the event to be generated.">
          <com:event name="AlertEvent" number="3"
                     comment="The AlertEvent shall be raised when an enabled alert is published.">
            <com:objectType>
              <mal:type name="AlertEventDetails" service="Alert" area="MC"/>
            </com:objectType>
            <com:relatedObject>
              <com:objectType number="2" service="Alert" area="MC"/>
            </com:relatedObject>
            <com:sourceObject comment="The object that caused the event to be generated"/>
          </com:event>
        </com:events>
        <com:archiveUsage comment="AlertIdentity and AlertDefinition objects should be stored in the COM archive.&#xA;When an alert event is published, the AlertEvent object should be stored in the COM archive by the publisher."/>
      </com:features>
    </mal:service>
    <mal:service xsi:type="com:ExtendedServiceType" name="Check" number="4"
                 comment="The check service allows the user to monitor and control the checking of parameters values against check definitions including limit sets. Violations of these defined checks are published using the COM event service.&#xA;The check service allows the consumer to define checks and then link the check definition to a parameter to be monitored. Figure 3-6 shows the nominal sequence of operations for the check service:&#xA;---- check sequence diag ----&#xA;Check service nominal sequence&#xA;A consumer first subscribes for check events before linking some already existing checks to some parameters. The figure shows how check evaluation is normally triggered by either a periodic interval or a change in a monitored value, however, the service also supports the optional ability for consumers to trigger the evaluation of checks using the triggerCheck operation. Finally, if a check event has not been generated for a configurable period of time, known as the maximum reporting interval, an event is generated regardless of whether the check is in violation or not. This maximum reporting interval supports the situation where regular confirmation of the non-violating state of a check is required.&#xA;The list of currently violating checks can be obtained using the getCurrentTransitionList operation; to get a full report including non-violating checks the getSummaryReport operation should be used.&#xA;The following figure (3-7) shows the flow chart for determining the status of a check:&#xA;--- check state diag --- &#xA;Flow Chart for Determining the Status of a Check&#xA;Each time a check is evaluated, the procedure indicated in the flow chart depicted in figure 3-7 is performed to calculate the check result. Each check link can have a condition included which determines whether the check should be applied or not; this allows several checks to be associated to a single parameter and applied in different conditions.&#xA;The service defines five basic check types, constant, reference, delta, limit, and compound. A constant check is used to ensure that a parameter value either does not change or does not change from a set of specific values.&#xA;In the Reference and Delta checks, a value is compared against another value which serves as a reference value. The reference value can be taken from either another parameter or the parameter being checked, and can be the previous value or a value in the past, specified by using a delta time in the ReferenceValue composite. This does not affect the logic of the flow chart above.&#xA;Limit checks monitor parameters to see if the parameter value is either inside or outside a range of values.&#xA;The final check type, compound, monitors a set of previously defined checks and only violates when a specified number of those monitored checks violate themselves.&#xA;The service only publishes check results (as check transition events) when either the result changes from the previous value (for example a check starts to violate), or the maximum reporting interval expires. This reduces the amount of 'no change' reporting data being distributed. For situations where regular reporting of the check result is required, even when no change is detected, a low maximum reporting interval value should be specified.">
      <mal:documentation name="High Level Requirements" order="1">The check service shall provide:
&lt;ol&gt;
 &lt;li&gt;the capability for reporting the check transitions;&lt;/li&gt;
 &lt;li&gt;the capability for requesting the latest check transitions;&lt;/li&gt;
 &lt;li&gt;the capability for controlling the global check evaluation;&lt;/li&gt;
 &lt;li&gt;the capability for controlling the individual check reporting;&lt;/li&gt;
 &lt;li&gt;the capability for triggering the evaluation of checks;&lt;/li&gt;
 &lt;li&gt;the capability for adding check definitions;&lt;/li&gt;
 &lt;li&gt;the capability for modifying check definitions;&lt;/li&gt;
 &lt;li&gt;the capability for removing check definitions;&lt;/li&gt;
 &lt;li&gt;the capability for listing check definitions;&lt;/li&gt;
 &lt;li&gt;the capability for modifying the association of checks to parameters.&lt;/li&gt;
&lt;/ol&gt;
The check service shall use the event service for issuing the corresponding event generated by the check service.
The check may support the evaluation of the following check types:
&lt;ol&gt;
 &lt;li&gt;Constant check;&lt;/li&gt;
 &lt;li&gt;Reference check;&lt;/li&gt;
 &lt;li&gt;Delta check;&lt;/li&gt;
 &lt;li&gt;Limit check;&lt;/li&gt;
 &lt;li&gt;Compound check.&lt;/li&gt;
&lt;/ol&gt;
When performing a limit check, the check service shall:
&lt;ol&gt;
 &lt;li&gt;check that the value of a parameter lies within or on a pair of limit values if set to violate outside the range, or outside a pair of limits if set to violate in range;&lt;/li&gt;
 &lt;li&gt;declare the check successful when the expression evaluates to true for the correct number of successive valid samples.&lt;/li&gt;
&lt;/ol&gt;
When performing a constant check, the check service shall:
&lt;ol&gt;
 &lt;li&gt;check that the parameter value evaluates to one of the expected values;&lt;/li&gt;
 &lt;li&gt;declare the check successful when the expression evaluates to true for the correct number of successive valid samples.&lt;/li&gt;
&lt;/ol&gt;
When performing a referenced check, the check service shall:
&lt;ol&gt;
 &lt;li&gt;check that the parameter value evaluates to the referenced value;&lt;/li&gt;
 &lt;li&gt;declare the check successful when the expression evaluates to true for the correct number of successive valid samples.&lt;/li&gt;
&lt;/ol&gt;
When performing a delta check, the check service shall:
&lt;ol&gt;
 &lt;li&gt;calculate the difference, i.e., the delta value, as either an absolute or percentage depending on the check definition between two parameter values;&lt;/li&gt;
 &lt;li&gt;check that the difference lies within or on a pair of threshold values if set to violate in range, or outside a pair of thresholds if set to violate outside the range;&lt;/li&gt;
 &lt;li&gt;declare the check successful when the expression evaluates to true for the correct number of successive valid samples.&lt;/li&gt;
&lt;/ol&gt;
When performing a compound check, the check service shall:
&lt;ol&gt;
 &lt;li&gt;monitor the check links referenced by the compound check definition and count the number of referenced checks in violation;&lt;/li&gt;
 &lt;li&gt;declare the compound check violated when the number of referenced checks in violation equals or exceeds the defined count value.&lt;/li&gt;
&lt;/ol&gt;
The check service shall provide the capability to process several check definitions for the same parameter.
Each check definition shall contain:
&lt;ol&gt;
 &lt;li&gt;the identifier of the check definition;&lt;/li&gt;
 &lt;li&gt;the description of the check definition;&lt;/li&gt;
 &lt;li&gt;the details specific to that check type.&lt;/li&gt;
&lt;/ol&gt;
A check definition shall be applied to a specific parameter using a check link.
Each check link shall contain:
&lt;ol&gt;
 &lt;li&gt;the identifier of the check definition to use;&lt;/li&gt;
 &lt;li&gt;the identifier of the parameter to monitor;&lt;/li&gt;
 &lt;li&gt;a Boolean that controls whether the check is evaluated;&lt;/li&gt;
 &lt;li&gt;a Boolean that indicates whether the check should be evaluated when the parameter value changes;&lt;/li&gt;
 &lt;li&gt;a Boolean indicating whether the check should apply to the raw or converted value;&lt;/li&gt;
 &lt;li&gt;the checking interval;&lt;/li&gt;
 &lt;li&gt;an optional check validity condition that yielding false prevents the check being performed.&lt;/li&gt;
&lt;/ol&gt;
Each check validity condition shall contain:
&lt;ol&gt;
 &lt;li&gt;the identifier of a parameter to use as a validity parameter;&lt;/li&gt;
 &lt;li&gt;an expression operator;&lt;/li&gt;
 &lt;li&gt;a Boolean indicating whether the expression should apply to the raw or converted value;&lt;/li&gt;
 &lt;li&gt;a value to evaluate against.&lt;/li&gt;
&lt;/ol&gt;</mal:documentation>
      <mal:documentation name="Functional Requirements" order="2">Global check evaluation shall be controlled by the enableService operation.
Disabling the check service globally shall pause all check evaluations.
Enabling the check service globally shall resume all check evaluations as they were when they were paused.
The addParameterCheck operation shall be used to create a link between a check definition and the parameter to be checked.
Individual check evaluation shall be controlled by the checkEnabled Boolean value in the CheckLinkDefinition object.
Setting the checkEnabled field to TRUE shall enable check evaluation for a specific CheckLink object.
The checkEnabled value may be set by using the enableCheck operation.
If the checkOnChange value is TRUE, any change in the state (such as validity becoming VALID) or value of a parameter shall cause an evaluation of the parameter value against the check.
If the checkOnChange value is TRUE, any change in the state (such as validity becoming VALID) or the value of the parameter referenced by a check condition shall cause an evaluation of the parameter value against the check.
If a check is required to be evaluated periodically, then the time between these evaluations shall be controlled using the checkInterval Duration value in the CheckLinkDefinition object.
For periodic check evaluations to occur the checkOnChange value must be FALSE, it is not possible to request periodic and change based checking concurrently.
A checkInterval value of '0' shall mean that no periodic check evaluation shall be performed, and checks will be triggered by another mechanism in this case.
The checkInterval value shall only be set when the CheckLinkDefinition object is created.
If a checkInterval or maxReportingInterval that is not supported by the provider is requested (both on creation and update of the check), then an INVALID error shall be returned, and the change shall be rejected.
The check shall be evaluated if the CheckLink object is enabled, the check condition as defined in the check link evaluates to TRUE, and the checked parameter is in a valid state.
The triggerCheck operation shall trigger a check evaluation and immediately publish the result in a CheckTransition event if the check violates.
If the latest CheckResult cannot be determined, for example a getSummaryReport operation call for a CheckLink object that has not been evaluated yet, the associated CheckResult shall contain UNCHECKED for the check states and a checked value of NULL.
In a CheckDefinitionDetails only one of nominalTime and nominalCount is permitted to be zero, an INVALID error shall be returned from the addCheck or updateDefinition operation if this is not the case.
In a CheckDefinitionDetails only one of violationTime and violationCount is permitted to be zero, an INVALID error shall be returned from the addCheck or updateDefinition operation if this is not the case.
If nominalTime is not zero, only when the nominalCount number of valid samples including the current one over a nominalTime time period of the checked parameter have passed the check evaluation shall a new check state and check result be calculated.
If nominalTime is zero, only when the nominalCount number of successive valid samples including the current one of the checked parameter have passed the check evaluation shall a new check state and check result be calculated.
If nominalTime is not zero, but nominalCount is zero, a new check result is always calculated (which then has a new timestamp).
If violationTime is not zero, only when the violationCount number of valid samples including the current one over a violationTime time period of the checked parameter have failed the check evaluation shall a new check state and check result be calculated.
If violationTime is zero, only when the violationCount number of successive valid samples including the current one of the checked parameter have failed the check evaluation shall a new check state and check result be calculated.
If violationTime is not zero, but violationCount is zero, a new check result is always calculated (which then has a new timestamp).
For reference and delta checks it shall be possible to define the check to compare against a reference value.
The reference value checked against shall be updated once validCount samples of that referenced parameter exist at deltaTime in the past from time now.
For a delta check, the delta value shall be calculated as the difference between the reference value and the check parameter and supports both positive and negative deltas.
For percentage based delta thresholds, the percentage is calculated as the arithmetic difference between the parameter value and the reference value, as a percentage of the first valid sample where the result of the calculation equal to 1.0 is interpreted as 100 per cent. For example, if the parameter value is 14 and the reference value is 8 then the calculation is (14 - 8) / 8 or 0.75 or 75%.
For percentage based delta thresholds, if reference value is zero then a divide by zero condition will occur, implementations shall detect this and the calculated delta will be +/- the maximum Float value.
For a constant check, the result of the constant check shall be declared successful only if the parameter value passes evaluation against one of constant values in the definition.
For a compound check, if the minimumChecksInViolation field is greater than '0', the result of the compound check shall be declared successful only if the count of referenced CheckLink objects currently in violation is less than the minimumChecksInViolation field.
For a compound check, if the minimumChecksInViolation field is set to '0', the result of the compound check shall be declared successful if any of the referenced CheckLink objects is nominal i.e. not currently in violation.
If the maxReportingInterval is not zero and if a CheckResult has not been generated in that time a CheckResult with the current check states shall be generated.
The maxReportingInterval value shall be set by using the updateDefinition operation.
Each transition in the state or the result of a check shall cause the generation of a CheckResult and a CheckTransition event.</mal:documentation>
      <mal:capabilitySet number="1">
        <mal:progressIP name="getCurrentTransitionList" number="1" supportInReplay="true"
                        comment="The getCurrentTransitionList operation allows a consumer to obtain the latest result of a number of checks filtering on check state.">
          <mal:messages>
            <mal:progress>
              <mal:field name="filter"
                         comment="The filter field shall contain a set of object instance identifiers for which the check result is required.&#xA;If the checkFilterViaGroups field is TRUE then the checkFilter field shall contain GroupIdentity object instance identifiers, otherwise the field contains CheckIdentity object instance identifiers.&#xA;The CheckIdentity objects referenced, either directly or indirectly via groups, by the checkFilter field shall be the CheckIdentity objects to match.&#xA;The checkFilter field shall support the wildcard value of '0' and shall match all CheckIdentity objects of the provider.&#xA;The service provider shall check for the wildcard value in the list of object instance identifiers in the checkFilter field first and if found no other checks of supplied CheckIdentity object instance identifiers shall be made.&#xA;If the parameterFilterViaGroups field is TRUE then the parameterFilter field shall contain GroupIdentity object instance identifiers, otherwise the field contains ParameterIdentity object instance identifiers.&#xA;The ParameterIdentity objects referenced, either directly or indirectly via groups, by the parameterFilter field shall be the ParameterIdentity objects to match.&#xA;The parameterFilter field shall support the wildcard value of '0' and shall match all ParameterIdentity objects of the provider.&#xA;The service provider shall check for the wildcard value in the list of object instance identifiers in the parameterFilter field first and if found no other checks of supplied ParameterIdentity object instance identifiers shall be made.&#xA;If a referenced GroupIdentity object is unknown then an UNKNOWN error shall be returned.&#xA;If a requested Group, or the Group objects referenced by that Group, does not contain CheckIdentity objects for the checkFilter or ParameterIdentity for the parameterFilter then an INVALID error shall be returned.&#xA;If a referenced CheckIdentity object, either directly or indirectly via groups, is unknown then an UNKNOWN error shall be returned.&#xA;If a referenced ParameterIdentity object, either directly or indirectly via groups, is unknown then an UNKNOWN error shall be returned.&#xA;The filter field shall also contain a list of CheckState enumerations of which states to filter on.&#xA;The supplied lists shall be AND'd together to form the complete filter.&#xA;If a CheckLink object matches the CheckIdentity filter, and the ParameterIdentity filter, and its state matches any of the supplied CheckState enumerations, then its latest CheckResult value shall be returned.&#xA;To report all checks, the wildcard values may be used in the CheckResultFilter.">
                <mal:type name="CheckResultFilter" service="Check" area="MC"/>
              </mal:field>
            </mal:progress>
            <mal:acknowledgement comment="If an UNKNOWN or INVALID error is being returned it shall be returned in the ACKNOWLEDGE message and the operation shall end."/>
            <mal:update>
              <mal:field name="updateSummaries"
                         comment="The returned list shall contain an entry for each matched check returning the object instance identifier and the latest CheckResult for that CheckLink object.">
                <mal:type list="true" name="CheckResultSummary" service="Check" area="MC"/>
              </mal:field>
            </mal:update>
            <mal:response>
              <mal:field name="responseSummaries"
                         comment="The PROGRESS pattern is used to allow the possibly large list of filtered check results to be split into several updates.&#xA;The size of the lists returned in each update and final response is implementation specific.">
                <mal:type list="true" name="CheckResultSummary" service="Check" area="MC"/>
              </mal:field>
            </mal:response>
          </mal:messages>
          <mal:errors>
            <mal:errorRef comment="One of the referenced groups does not contain the correct type of object.">
              <mal:type name="INVALID" area="COM"/>
              <mal:extraInformation comment="The extra information field contains a list of the indexes of the erroneous values from the originating list supplied.">
                <mal:type list="true" name="UInteger" area="MAL"/>
              </mal:extraInformation>
            </mal:errorRef>
            <mal:errorRef comment="One or more of the checks, parameters, or groups specified in the list do not exist.">
              <mal:type name="UNKNOWN" area="MAL"/>
              <mal:extraInformation comment="A list of the indexes of the error values shall be contained in the extra information field.">
                <mal:type list="true" name="UInteger" area="MAL"/>
              </mal:extraInformation>
            </mal:errorRef>
          </mal:errors>
        </mal:progressIP>
        <mal:progressIP name="getSummaryReport" number="2" supportInReplay="true"
                        comment="The getSummaryReport operation allows a consumer to obtain the status of a number of checks and the result of any check evaluations linked to them.">
          <mal:messages>
            <mal:progress>
              <mal:field name="objInstIds"
                         comment="The objInstIds field shall hold one or more CheckIdentity object instance identifiers of which a check report is required.&#xA;A wildcard value of '0' shall report on all checks.&#xA;The wildcard value should be checked for first, if found no other checks of supplied object instance identifiers shall be made.&#xA;If a requested check is unknown then an UNKNOWN error shall be returned in the ACKNOWLEDGE message and the operation shall end.">
                <mal:type list="true" name="Long" area="MAL"/>
              </mal:field>
            </mal:progress>
            <mal:acknowledgement/>
            <mal:update>
              <mal:field name="updateObjInstIds"
                         comment="The returned updates and final response shall contain an entry for each requested CheckIdentity.&#xA;The first part of the update shall be the CheckIdentity object instance identifier.&#xA;The second part shall be the list of all CheckLink object instance identifiers and CheckResults associated with that CheckIdentity.">
                <mal:type name="Long" area="MAL"/>
              </mal:field>
              <mal:field name="updateSummaries">
                <mal:type list="true" name="CheckResultSummary" service="Check" area="MC"/>
              </mal:field>
            </mal:update>
            <mal:response>
              <mal:field name="responseObjInstIds">
                <mal:type name="Long" area="MAL"/>
              </mal:field>
              <mal:field name="responseSummaries">
                <mal:type list="true" name="CheckResultSummary" service="Check" area="MC"/>
              </mal:field>
            </mal:response>
          </mal:messages>
          <mal:errors>
            <mal:errorRef comment="One or more of the checks specified in the list do not exist.">
              <mal:type name="UNKNOWN" area="MAL"/>
              <mal:extraInformation comment="A list of the indexes of the error values shall be contained in the extra information field.">
                <mal:type list="true" name="UInteger" area="MAL"/>
              </mal:extraInformation>
            </mal:errorRef>
          </mal:errors>
        </mal:progressIP>
      </mal:capabilitySet>
      <mal:capabilitySet number="2">
        <mal:submitIP name="enableService" number="3" supportInReplay="false"
                      comment="The enableService operation allows a consumer to globally control whether evaluation of all checks is performed or not.&#xA;It should be noted that no check reports will be generated if the service provider has been disabled via the enableService operation.">
          <mal:messages>
            <mal:submit>
              <mal:field name="enableService"
                         comment="If enableService is set to TRUE the service shall be enabled and evaluation and reporting of check will commence.&#xA;If enableService is set to FALSE then all evaluation of checks shall be suspended and no check transitions will be reported.&#xA;If the enableService value matches the current enabled state of the service then no change shall be made and no error reported. Enabling an already enabled service has no effect.">
                <mal:type name="Boolean" area="MAL"/>
              </mal:field>
            </mal:submit>
          </mal:messages>
        </mal:submitIP>
        <mal:requestIP name="getServiceStatus" number="4" supportInReplay="false"
                       comment="The getServiceStatus operation allows a consumer to determine the global check service enabled status.">
          <mal:messages>
            <mal:request/>
            <mal:response>
              <mal:field name="serviceEnabled"
                         comment="The operation shall return TRUE if the service is currently enabled or FALSE if the service is currently disabled.">
                <mal:type name="Boolean" area="MAL"/>
              </mal:field>
            </mal:response>
          </mal:messages>
        </mal:requestIP>
      </mal:capabilitySet>
      <mal:capabilitySet number="3">
        <mal:submitIP name="enableCheck" number="5" supportInReplay="false"
                      comment="The enableCheck operation allows a consumer to control whether evaluation of a set of checks is performed or not. The operation allows the consumer to select the checks directly or indirectly using groups.">
          <mal:messages>
            <mal:submit>
              <mal:field name="isGroupIds"
                         comment="If the isGroupIds field is TRUE then the enableInstances field shall contain GroupIdentity object instance identifiers, otherwise the field contains CheckLink object instance identifiers.&#xA;The CheckLink objects referenced, either directly or indirectly via groups, by the enableInstances field shall be the CheckLink objects to match.&#xA;The id of the enableInstances field shall support the wildcard value of '0' and matches all CheckLink objects of the provider.&#xA;The service provider shall check for the wildcard value in the list of object instance identifiers in the enableInstances field first and if found no other checks of supplied object instance identifiers shall be made.&#xA;If the enableInstances field contains a value of TRUE then evaluations of matching CheckLink objects shall be performed, a value of FALSE requests that evaluations will not be performed.&#xA;No error shall be raised if the enableInstances Boolean value supplied is the same as the current checkEnabled field for a CheckLink object i.e. enabling an already enabled check will not result in an error.&#xA;If a requested CheckLink or GroupIdentity object is unknown then an UNKNOWN error shall be returned.&#xA;If a requested Group, or the Group objects referenced by that Group, does not contain CheckLink objects then an INVALID error shall be returned.&#xA;If an error is raised then no modifications shall be made as a result of this operation call.&#xA;The provider shall create and store a new CheckLinkDefinition object in the COM archive if the checkEnabled field is changed.">
                <mal:type name="Boolean" area="MAL"/>
              </mal:field>
              <mal:field name="enableInstances"
                         comment="If the check is being enabled, and the check is defined as being periodic in the check link definition, then the provider shall generate a check result immediately and start the checking interval from that check.">
                <mal:type list="true" name="InstanceBooleanPair" area="COM"/>
              </mal:field>
            </mal:submit>
          </mal:messages>
          <mal:errors>
            <mal:errorRef comment="One or more of the requested groups or CheckLink objects is unknown.">
              <mal:type name="UNKNOWN" area="MAL"/>
              <mal:extraInformation comment="A list of the indexes of the error values shall be contained in the extra information field.">
                <mal:type list="true" name="UInteger" area="MAL"/>
              </mal:extraInformation>
            </mal:errorRef>
            <mal:errorRef comment="One of the supplied groups is not a group of either other group objects or CheckLink objects.">
              <mal:type name="INVALID" area="COM"/>
              <mal:extraInformation comment="The extra information field contains a list of the indexes of the erroneous values from the originating list supplied.">
                <mal:type list="true" name="UInteger" area="MAL"/>
              </mal:extraInformation>
            </mal:errorRef>
          </mal:errors>
        </mal:submitIP>
      </mal:capabilitySet>
      <mal:capabilitySet number="4">
        <mal:submitIP name="triggerCheck" number="6" supportInReplay="false"
                      comment="The triggerCheck operation allows a consumer to request the immediate evaluation of a number of checks. Any violations will cause appropriate events to be generated.&#xA;It should be noted that no check reports will be generated if the service provider has been disabled via the enableService operation.">
          <mal:messages>
            <mal:submit>
              <mal:field name="checkObjInstIds"
                         comment="The checkObjInstIds field shall hold a list of CheckIdentity object instance identifiers to trigger the evaluation of all linked checks.">
                <mal:type list="true" name="Long" area="MAL"/>
              </mal:field>
              <mal:field name="linkObjInstIds"
                         comment="The linkObjInstIds field shall hold a list of CheckLink object instance identifiers to trigger the evaluation of.&#xA;The wildcard value of '0' shall be permitted in either list.&#xA;The wildcard value should be checked for first, if found no other checks of supplied object instance identifiers shall be made.&#xA;If a requested CheckIdentity or CheckLink object is unknown then an UNKNOWN error shall be returned.&#xA;If an error is raised then no evaluations shall be made as a result of this operation call.&#xA;Either list may be empty in which case filtering on that aspect, check identity or specific check link, shall be ignored.&#xA;The two lists shall be combined using 'OR' logic, where a CheckLink is evaluated if the identity of a check is in the first list or if the link is directly listed in the second list.&#xA;Triggering a check shall ignore the nominalTime, nominalCount, violationTime and violationCount fields and requests an immediate evaluation of the checks.&#xA;Triggering a check during a periodic check shall not influence the periodic check (e.g. it does not reset the checkInterval timer, the successive valid samples that passed/violated the check or the maxReportingInterval timer).">
                <mal:type list="true" name="Long" area="MAL"/>
              </mal:field>
            </mal:submit>
          </mal:messages>
          <mal:errors>
            <mal:errorRef comment="One or more of the requested CheckIdentity or CheckLink objects is unknown.">
              <mal:type name="UNKNOWN" area="MAL"/>
              <mal:extraInformation comment="A list of the indexes of the error values shall be contained in the extra information field.">
                <mal:type list="true" name="UInteger" area="MAL"/>
              </mal:extraInformation>
            </mal:errorRef>
          </mal:errors>
        </mal:submitIP>
      </mal:capabilitySet>
      <mal:capabilitySet number="5">
        <mal:requestIP name="listDefinition" number="7" supportInReplay="false"
                       comment="The listDefinition operation allows a consumer to request the latest object instance identifiers of the CheckIdentity and actual check definition objects for the supported checks of the provider.">
          <mal:messages>
            <mal:request>
              <mal:field name="names"
                         comment="The names field shall hold a list of CheckIdentity names to retrieve the CheckIdentity and actual check definition object instance identifiers for.&#xA;The request may contain the wildcard value of '*' to return all supported check definitions.&#xA;The wildcard value should be checked for first, if found no other checks of supplied identifiers shall be made.&#xA;If a provided identifier does not include a wildcard and does not match an existing CheckIdentity object then this operation shall fail with an UNKNOWN error.">
                <mal:type list="true" name="Identifier" area="MAL"/>
              </mal:field>
            </mal:request>
            <mal:response>
              <mal:field name="objInstIds"
                         comment="The response shall contain a list of matching CheckIdentity and actual check definition object instance identifiers and the actual check definition object type.&#xA;The returned list shall maintain the same order as the submitted list unless the wildcard value was included in the request.">
                <mal:type list="true" name="CheckTypedInstance" service="Check" area="MC"/>
              </mal:field>
            </mal:response>
          </mal:messages>
          <mal:errors>
            <mal:errorRef comment="One of the supplied identifiers is unknown.">
              <mal:type name="UNKNOWN" area="MAL"/>
              <mal:extraInformation comment="A list of the indexes of the error values shall be contained in the extra information field.">
                <mal:type list="true" name="UInteger" area="MAL"/>
              </mal:extraInformation>
            </mal:errorRef>
          </mal:errors>
        </mal:requestIP>
        <mal:requestIP name="listCheckLinks" number="8" supportInReplay="false"
                       comment="The listCheckLinks operation allows a consumer to request the object instance identifiers of the CheckLink objects for the checks of the provider.">
          <mal:messages>
            <mal:request>
              <mal:field name="checkObjInstIds"
                         comment="The checkObjInstIds field shall hold a list of CheckIdentity object instance identifiers to retrieve the CheckLink object instance identifiers for.&#xA;The request may contain the wildcard value of '0' to return all supported check links.&#xA;The wildcard value should be checked for first, if found no other checks of supplied identifiers shall be made.&#xA;If a provided identifier does not include a wildcard and does not match an existing CheckIdentity object then this operation shall fail with an UNKNOWN error.">
                <mal:type list="true" name="Long" area="MAL"/>
              </mal:field>
            </mal:request>
            <mal:response>
              <mal:field name="chkLinkObjInstIds"
                         comment="The response shall contain a list of CheckLinkSummary that contain the object instance identifiers of the CheckLink, CheckIdentity, and ParameterIdentity for the matched CheckIdentity objects.">
                <mal:type list="true" name="CheckLinkSummary" service="Check" area="MC"/>
              </mal:field>
            </mal:response>
          </mal:messages>
          <mal:errors>
            <mal:errorRef comment="One of the supplied identifiers is unknown.">
              <mal:type name="UNKNOWN" area="MAL"/>
              <mal:extraInformation comment="A list of the indexes of the error values shall be contained in the extra information field.">
                <mal:type list="true" name="UInteger" area="MAL"/>
              </mal:extraInformation>
            </mal:errorRef>
          </mal:errors>
        </mal:requestIP>
      </mal:capabilitySet>
      <mal:capabilitySet number="6">
        <mal:requestIP name="addCheck" number="9" supportInReplay="false"
                       comment="The addCheck operation allows a consumer to define one or more checks that do not currently exist.&#xA;The new CheckIdentity and actual check definition objects are expected to be stored in the COM archive by the provider of the check service.">
          <mal:messages>
            <mal:request>
              <mal:field name="checkNames"
                         comment="The checkNames field shall hold the names of the checks to be added.&#xA;The checkNames field must not contain NULL, the wildcard '*', or empty value (an INVALID error shall be returned in this case).&#xA;The supplied names must be unique among all CheckIdentity objects for the domain of the provider otherwise a DUPLICATE error shall be raised.">
                <mal:type list="true" name="String" area="MAL"/>
              </mal:field>
              <mal:field name="checkDefDetails"
                         comment="The checkDefDetails field shall hold the CheckDefinitionDetails to be added.&#xA;The two lists shall be ordered the same.&#xA;The number of entries in the two lists shall be the same size otherwise an INVALID error shall be raised.&#xA;Only one of nominalTime and nominalCount is permitted to be zero, an INVALID error shall be returned if this is not the case.&#xA;Only one of violationTime and violationCount is permitted to be zero, an INVALID error shall be returned if this is not the case.&#xA;If an error is raised then no new identities and definitions shall be added as a result of this operation call.&#xA;If the supplied name matches an existing, but removed, CheckIdentity then that CheckIdentity shall be reused otherwise a new CheckIdentity shall be created.&#xA;The provider shall create a new actual check definition object and store it, and any new CheckIdentity objects, in the COM archive.">
                <mal:type list="true" name="CheckDefinitionDetails" service="Check" area="MC"/>
              </mal:field>
            </mal:request>
            <mal:response>
              <mal:field name="newObjInstIds"
                         comment="The response shall contain the list of object instance identifiers for the CheckIdentity and new actual definition objects.&#xA;The returned list shall maintain the same order as the submitted definitions.">
                <mal:type list="true" name="ObjectInstancePair" area="MC"/>
              </mal:field>
            </mal:response>
          </mal:messages>
          <mal:errors>
            <mal:errorRef comment="One of the supplied CheckIdentity objects contains an invalid name or the two lists are not the same size or there is an inconsistency in the time and count fields.&#xA;If the two lists are not the same length then the extra information field shall contain the first index of the element in the largest list which does not have corresponding element in the other list.">
              <mal:type name="INVALID" area="COM"/>
              <mal:extraInformation comment="The extra information field contains a list of the indexes of the erroneous values from the originating list supplied.">
                <mal:type list="true" name="UInteger" area="MAL"/>
              </mal:extraInformation>
            </mal:errorRef>
            <mal:errorRef comment="One or more of the CheckIdentity objects being added has supplied a check name that is already in use in the domain.">
              <mal:type name="DUPLICATE" area="COM"/>
              <mal:extraInformation comment="The extra information field contains a list of the indexes of the erroneous values from the originating request list.">
                <mal:type list="true" name="UInteger" area="MAL"/>
              </mal:extraInformation>
            </mal:errorRef>
          </mal:errors>
        </mal:requestIP>
        <mal:requestIP name="updateDefinition" number="10" supportInReplay="false"
                       comment="The updateDefinition operation allows a consumer to update a definition for one or more checks.&#xA;This differs from deleting an existing check and adding a new definition with the same check name in the fact that the CheckIdentity object is not changed between the two definitions.&#xA;The replacement definition should be stored in the COM archive by the service provider. The operation does not remove the previous object from the COM archive, merely removes the object from the provider.&#xA;The operation also cannot be used to update a check definition for a check that is currently being used i.e. has CheckLink objects linked to it. The CheckLink objects should first be removed using removeParameterCheck before calling this operation.">
          <mal:messages>
            <mal:request>
              <mal:field name="checkInstIds"
                         comment="The checkInstIds field shall hold the object instance identifiers of the CheckIdentity objects to be updated.&#xA;If the checkInstIds list contains either NULL or '0' an INVALID error shall be raised.&#xA;The supplied object instance identifiers shall match existing identity objects, an UNKNOWN error shall be raised if this is not the case.&#xA;If the check to be updated is currently being used by a CheckLink object, a REFERENCED error shall be raised.">
                <mal:type list="true" name="Long" area="MAL"/>
              </mal:field>
              <mal:field name="checkDefDetails"
                         comment="The checkDefDetails field shall contain the replacement CheckDefinitionDetails.&#xA;The two lists shall be ordered the same.&#xA;The number of entries in the two lists shall be the same size otherwise an INVALID error shall be raised.&#xA;Only one of nominalTime and nominalCount is permitted to be zero, an INVALID error shall be returned if this is not the case.&#xA;Only one of violationTime and violationCount is permitted to be zero, an INVALID error shall be returned if this is not the case.&#xA;If an error is raised then no definitions shall be updated as a result of this operation call.&#xA;The provider shall create new actual check definition objects and store them in the COM archive.&#xA;The new definition object shall be the current definition used for the specific CheckIdentity.">
                <mal:type list="true" name="CheckDefinitionDetails" service="Check" area="MC"/>
              </mal:field>
            </mal:request>
            <mal:response>
              <mal:field name="newObjInstIds"
                         comment="The response shall contain the list of object instance identifiers for the new check definition objects.&#xA;The returned list shall maintain the same order as the submitted definitions.">
                <mal:type list="true" name="Long" area="MAL"/>
              </mal:field>
            </mal:response>
          </mal:messages>
          <mal:errors>
            <mal:errorRef comment="One of the supplied CheckIdentity object instance identifiers is unknown.">
              <mal:type name="UNKNOWN" area="MAL"/>
              <mal:extraInformation comment="A list of the indexes of the error values shall be contained in the extra information field.">
                <mal:type list="true" name="UInteger" area="MAL"/>
              </mal:extraInformation>
            </mal:errorRef>
            <mal:errorRef comment="The supplied object instance identifiers list contains either a NULL or '0', or the two lists do not contain the same number of entries or there is an inconsistency in the time and count fields.&#xA;If the two lists are not the same length then the extra information field shall contain the first index of the element in the largest list which does not have corresponding element in the other list.">
              <mal:type name="INVALID" area="COM"/>
              <mal:extraInformation comment="The extra information field contains a list of the indexes of the erroneous values from the originating list supplied.">
                <mal:type list="true" name="UInteger" area="MAL"/>
              </mal:extraInformation>
            </mal:errorRef>
            <mal:errorRef comment="One of the check objects is currently being used by a CheckLink object.">
              <mal:type name="REFERENCED" area="MC"/>
              <mal:extraInformation comment="A list of the indexes of the error values shall be contained in the extra information field.">
                <mal:type list="true" name="UInteger" area="MAL"/>
              </mal:extraInformation>
            </mal:errorRef>
          </mal:errors>
        </mal:requestIP>
        <mal:submitIP name="removeCheck" number="11" supportInReplay="false"
                      comment="The removeCheck operation allows a consumer to remove one or more definitions from the list of checks supported by the check provider.&#xA;The operation does not remove the CheckIdentity and actual check definition objects from the COM archive, merely removes the objects from the provider. This permits existing CheckLink objects to continue to reference the correct check object in the COM archive.">
          <mal:messages>
            <mal:submit>
              <mal:field name="objInstIds"
                         comment="The objInstIds field holds the object instance identifiers of the CheckIdentity objects to be removed from the provider.&#xA;The list may contain the wildcard value of '0'.&#xA;The wildcard value should be checked for first, if found no other checks of supplied object instance identifiers shall be made.&#xA;If a provided CheckIdentity instance identifier does not include a wildcard and does not match an existing check then this operation shall fail with an UNKNOWN error.&#xA;If any of the matched CheckIdentity objects are being referenced by a CheckLink object then a REFERENCED error shall be returned.&#xA;Matched CheckIdentity objects shall not be removed from the COM archive only the list of available CheckIdentity objects in the provider.&#xA;If an error is raised then no CheckIdentity objects shall be removed as a result of this operation call.&#xA;If the operation succeeds then the provider shall not allow new CheckLink objects to be created for the matched CheckIdentity anymore, existing CheckLink objects are not affected.">
                <mal:type list="true" name="Long" area="MAL"/>
              </mal:field>
            </mal:submit>
          </mal:messages>
          <mal:errors>
            <mal:errorRef comment="One of the check objects is currently being used by a CheckLink object.">
              <mal:type name="REFERENCED" area="MC"/>
              <mal:extraInformation comment="A list of the indexes of the error values shall be contained in the extra information field.">
                <mal:type list="true" name="UInteger" area="MAL"/>
              </mal:extraInformation>
            </mal:errorRef>
            <mal:errorRef comment="One of the supplied CheckIdentity object instance identifiers is unknown.">
              <mal:type name="UNKNOWN" area="MAL"/>
              <mal:extraInformation comment="A list of the indexes of the error values shall be contained in the extra information field.">
                <mal:type list="true" name="UInteger" area="MAL"/>
              </mal:extraInformation>
            </mal:errorRef>
          </mal:errors>
        </mal:submitIP>
      </mal:capabilitySet>
      <mal:capabilitySet number="7">
        <mal:requestIP name="addParameterCheck" number="12" supportInReplay="false"
                       comment="The addParameterCheck operation allows a consumer to request that one or more parameters/check combinations are added to the list of checks that are being evaluated.&#xA;The new CheckLink and CheckLinkDefinition objects are expected to be stored in the COM archive by the provider of the check service.">
          <mal:messages>
            <mal:request>
              <mal:field name="linkDetails"
                         comment="The linkDetails field shall contain the new CheckLink details.&#xA;The linkRefs field shall contain the related and source links of the new CheckLink.&#xA;The related field of the ObjectDetails shall reference the object instance identifier of the CheckIdentity being used by the new CheckLink.&#xA;The source field of the ObjectDetails shall reference the ParameterIdentity that the check is being applied to.&#xA;The two lists must be ordered the same so that the correct ObjectDetails for a specific CheckLink can be determined.">
                <mal:type list="true" name="CheckLinkDetails" service="Check" area="MC"/>
              </mal:field>
              <mal:field name="linkRefs"
                         comment="If the requested CheckIdentity and ParameterIdentity do not exist then an UNKNOWN error shall be returned.&#xA;The number of entries in the two lists shall be the same size otherwise an INVALID error shall be raised.&#xA;If an interval that is not supported by the provider is requested then an INVALID error shall be returned.&#xA;If the checkInterval is not '0' and the checkOnChange Value is TRUE, then an INVALID error shall be returned.&#xA;The provider shall create new CheckLink and CheckLinkDefinition objects for each pair and store them in the COM archive.">
                <mal:type list="true" name="ObjectDetails" area="COM"/>
              </mal:field>
            </mal:request>
            <mal:response>
              <mal:field name="newObjInstIds"
                         comment="The response shall contain the list of object instance identifiers for the new CheckLink and CheckLinkDefinition objects.&#xA;The returned list shall maintain the same order as the submitted links.">
                <mal:type list="true" name="ObjectInstancePair" area="MC"/>
              </mal:field>
            </mal:response>
          </mal:messages>
          <mal:errors>
            <mal:errorRef comment="The supplied lists do not contain the same number of entries, the supplied interval is not supported by the provider, or a period check with changed based checking has been requested.&#xA;If the two lists are not the same length then the extra information field shall contain the first index of the element in the largest list which does not have corresponding element in the other list.">
              <mal:type name="INVALID" area="COM"/>
              <mal:extraInformation comment="The extra information field contains a list of the indexes of the erroneous values from the originating list supplied.">
                <mal:type list="true" name="UInteger" area="MAL"/>
              </mal:extraInformation>
            </mal:errorRef>
            <mal:errorRef comment="One of the supplied object instance identifiers is unknown.">
              <mal:type name="UNKNOWN" area="MAL"/>
              <mal:extraInformation comment="A list of the indexes of the error values shall be contained in the extra information field.">
                <mal:type list="true" name="UInteger" area="MAL"/>
              </mal:extraInformation>
            </mal:errorRef>
          </mal:errors>
        </mal:requestIP>
        <mal:submitIP name="removeParameterCheck" number="13" supportInReplay="false"
                      comment="The removeParameterCheck operation allows a consumer to remove one or more parameters from the list of parameters being checked by the check provider.&#xA;The operation does not remove the CheckLink or CheckLinkDefinition objects from the COM archive, merely removes them from the provider. This permits existing CheckTransition events to continue to reference the correct check link/definition objects in the COM archive.">
          <mal:messages>
            <mal:submit>
              <mal:field name="objInstIds"
                         comment="The objInstIds field holds the object instance identifiers of the CheckLink objects to be removed from the provider.&#xA;The list may contain the wildcard value of '0'.&#xA;The wildcard value should be checked for first, if found no other checks of supplied object instance identifiers shall be made.&#xA;If a provided CheckLink instance identifier does not include a wildcard and does not match an existing link then this operation shall fail with an UNKNOWN error.&#xA;Matched CheckLink objects shall not be removed from the COM archive only the list of available CheckLink objects in the provider.&#xA;If an error is raised then no CheckLink objects shall be removed as a result of this operation call.&#xA;If the operation succeeds then the provider shall not evaluate those parameter/check definition combinations for the deleted CheckLink objects anymore.">
                <mal:type list="true" name="Long" area="MAL"/>
              </mal:field>
            </mal:submit>
          </mal:messages>
          <mal:errors>
            <mal:errorRef comment="One of the supplied CheckLink object instance identifiers is unknown.">
              <mal:type name="UNKNOWN" area="MAL"/>
              <mal:extraInformation comment="A list of the indexes of the error values shall be contained in the extra information field.">
                <mal:type list="true" name="UInteger" area="MAL"/>
              </mal:extraInformation>
            </mal:errorRef>
          </mal:errors>
        </mal:submitIP>
      </mal:capabilitySet>
      <mal:dataTypes>
        <mal:enumeration name="CheckState" shortFormPart="6"
                         comment="The CheckState enumeration holds the possible basic states of a check. The meaning of the NOT_OK value is check specific and detailed in the relevant check type definition.">
          <mal:item value="DISABLED" nvalue="1" comment="The check is disabled."/>
          <mal:item value="UNCHECKED" nvalue="2"
                    comment="The check is enabled but has not passed the selection condition expression."/>
          <mal:item value="INVALID" nvalue="3"
                    comment="Check is enabled, has passed the selection condition, but the entity being checked is not in a valid state and therefore has not been checked."/>
          <mal:item value="OK" nvalue="4" comment="The check is OK."/>
          <mal:item value="NOT_OK" nvalue="5" comment="The check is not OK."/>
        </mal:enumeration>
        <mal:composite name="CheckDefinitionDetails"
                       comment="The CheckDefinitionDetails structure holds the definition of a check.">
          <mal:extends>
            <mal:type name="Composite" area="MAL"/>
          </mal:extends>
          <mal:field name="description" canBeNull="false"
                     comment="The description of the check. May be empty.">
            <mal:type name="String" area="MAL"/>
          </mal:field>
          <mal:field name="checkSeverity" canBeNull="false"
                     comment="Indicates the seriousness of the violation based on its possible negative consequences.">
            <mal:type name="Severity" area="MC"/>
          </mal:field>
          <mal:field name="maxReportingInterval" canBeNull="false"
                     comment="Maximum interval that can elapse between generations of CheckResult reports. If this value expires, then a CheckResult is generated with the same state for the previous and current state. If set to '0', then no maximum reporting interval shall be applied.">
            <mal:type name="Duration" area="MAL"/>
          </mal:field>
          <mal:field name="nominalCount" canBeNull="false"
                     comment="Number of consecutive valid samples passing the check for the check to be OK.">
            <mal:type name="UInteger" area="MAL"/>
          </mal:field>
          <mal:field name="nominalTime" canBeNull="false"
                     comment="If nominalCount is zero then this is duration that a parameter is continuously passing the check for the check to be OK. If nominalCount is not zero then this is the period over which samples will be used in the nominalCount calculation, i.e. samples further in the past than nominalTime are not considered.">
            <mal:type name="Duration" area="MAL"/>
          </mal:field>
          <mal:field name="violationCount" canBeNull="false"
                     comment="Number of consecutive valid samples violating the check for the check to be in violation.">
            <mal:type name="UInteger" area="MAL"/>
          </mal:field>
          <mal:field name="violationTime" canBeNull="false"
                     comment="If violationCount is zero then this is duration that a parameter is continuously violating the check for the check to be in violation. If violationCount not zero then this is the period over which samples will be used in the violationCount calculation, i.e. samples further in the past than violationTime are not considered.">
            <mal:type name="Duration" area="MAL"/>
          </mal:field>
        </mal:composite>
        <mal:composite name="CheckLinkDetails" shortFormPart="1"
                       comment="The CheckLinkDetails structure represents the link from a check definition to a check result for a specific parameter.">
          <mal:extends>
            <mal:type name="Composite" area="MAL"/>
          </mal:extends>
          <mal:field name="checkEnabled" canBeNull="false"
                     comment="TRUE if the check instance is enabled.">
            <mal:type name="Boolean" area="MAL"/>
          </mal:field>
          <mal:field name="checkOnChange" canBeNull="false"
                     comment="If TRUE then any change to state or value of the parameter, or the check condition will trigger a check evaluation. Ignored for Compound checks.">
            <mal:type name="Boolean" area="MAL"/>
          </mal:field>
          <mal:field name="useConverted" canBeNull="false"
                     comment="If set to TRUE the converted value field of the parameter value should be used, otherwise the raw value field should be used. Ignored for Compound checks.">
            <mal:type name="Boolean" area="MAL"/>
          </mal:field>
          <mal:field name="checkInterval" canBeNull="false"
                     comment="The interval that a check should be applied. Only applicable if checkOnChange is FALSE. If '0', then no periodic checking shall be performed, and a check will be triggered by another mechanism. Ignored for Compound checks.">
            <mal:type name="Duration" area="MAL"/>
          </mal:field>
          <mal:field name="condition"
                     comment="Should this check be applied, if NULL then always applied.">
            <mal:type name="ParameterExpression" area="MC"/>
          </mal:field>
        </mal:composite>
        <mal:composite name="CheckResult" shortFormPart="2"
                       comment="The CheckResult structure holds basic information about the check state and the value of the parameter at the time of the check. The timestamp of the event is the transition time of the check.">
          <mal:extends>
            <mal:type name="Composite" area="MAL"/>
          </mal:extends>
          <mal:field name="previousCheckState" canBeNull="false"
                     comment="The previous evaluation state of the check. Initially UNCHECKED for the first transition of a check. For check evaluations that do not detect a check transition, this value will be the same as the currentCheckState.">
            <mal:type name="CheckState" service="Check" area="MC"/>
          </mal:field>
          <mal:field name="currentCheckState" canBeNull="false"
                     comment="The current evaluation state of the check">
            <mal:type name="CheckState" service="Check" area="MC"/>
          </mal:field>
          <mal:field name="paramDefInstId"
                     comment="The object instance identifier of the ParameterDefinition used for the check evaluation. NULL if compound check.">
            <mal:type name="Long" area="MAL"/>
          </mal:field>
          <mal:field name="checkedValue"
                     comment="This is the value of the parameter or for a compound check the number of checks in violation at the time of a check state transition, or if it is a report due to the CheckDefinitionDetails maxReportingInterval expiring, then it is the value or the number when the interval expired.">
            <mal:type name="Attribute" area="MAL"/>
          </mal:field>
        </mal:composite>
        <mal:composite name="CheckLinkSummary" shortFormPart="3"
                       comment="The CheckLinkSummary structure holds the ids of a specific check link and the check and parameter it links to.">
          <mal:field name="checkId" canBeNull="false"
                     comment="The object instance identifier of the CheckIdentity object.">
            <mal:type name="Long" area="MAL"/>
          </mal:field>
          <mal:field name="linkId" canBeNull="false"
                     comment="The object instance identifier of the CheckLink object.">
            <mal:type name="Long" area="MAL"/>
          </mal:field>
          <mal:field name="linkDefinitionId" canBeNull="false"
                     comment="Contains the object instance identifier of the CheckLinkDefinition object.">
            <mal:type name="Long" area="MAL"/>
          </mal:field>
          <mal:field name="checkEnabled" canBeNull="false"
                     comment="TRUE if the check instance is enabled.">
            <mal:type name="Boolean" area="MAL"/>
          </mal:field>
          <mal:field name="parameterId"
                     comment="The object instance identifier of the ParameterIdentity object for the check link. NULL for Compound checks.">
            <mal:type name="ObjectKey" area="COM"/>
          </mal:field>
        </mal:composite>
        <mal:composite name="CheckResultSummary" shortFormPart="4"
                       comment="The CheckResultSummary structure holds details about a specific check link and its evaluated result.">
          <mal:extends>
            <mal:type name="Composite" area="MAL"/>
          </mal:extends>
          <mal:field name="linkId" canBeNull="false"
                     comment="The object instance identifier of the check link.">
            <mal:type name="Long" area="MAL"/>
          </mal:field>
          <mal:field name="checkEnabled" canBeNull="false"
                     comment="The current enabled state of the check link.">
            <mal:type name="Boolean" area="MAL"/>
          </mal:field>
          <mal:field name="parameterId"
                     comment="The object instance key of the ParameterIdentity being checked. NULL only for Compound checks.">
            <mal:type name="ObjectKey" area="COM"/>
          </mal:field>
          <mal:field name="evaluationTime" canBeNull="false"
                     comment="The timestamp of the check result. If as a result of max reporting interval expiring then it shall contain the expiration timestamp.">
            <mal:type name="Time" area="MAL"/>
          </mal:field>
          <mal:field name="result" canBeNull="false" comment="The check result value.">
            <mal:type name="CheckResult" service="Check" area="MC"/>
          </mal:field>
        </mal:composite>
        <mal:composite name="CheckResultFilter" shortFormPart="5"
                       comment="The CheckResultFilter structure holds a filter for the current check result transition information.">
          <mal:extends>
            <mal:type name="Composite" area="MAL"/>
          </mal:extends>
          <mal:field name="checkFilterViaGroups" canBeNull="false"
                     comment="If TRUE then the checkFilter field contains GroupIdentity object instance identifiers that link to CheckIdentity objects otherwise it contains CheckIdentity object instance identifiers directly.">
            <mal:type name="Boolean" area="MAL"/>
          </mal:field>
          <mal:field name="checkFilter" canBeNull="false"
                     comment="The list of GroupIdentity object instance identifiers if checkFilterViaGroups is TRUE otherwise the CheckIdentity object instance identifiers to filter on. A value of '0' means match all.">
            <mal:type list="true" name="Long" area="MAL"/>
          </mal:field>
          <mal:field name="parameterFilterViaGroups" canBeNull="false"
                     comment="If TRUE then the parameterFilter field contains GroupIdentity object instance identifiers that link to ParameterIdentity objects otherwise it contains ParameterIdentity object instance identifiers directly.">
            <mal:type name="Boolean" area="MAL"/>
          </mal:field>
          <mal:field name="parameterFilter" canBeNull="false"
                     comment="The list of GroupIdentity object instance identifiers if parameterFilterViaGroups is TRUE otherwise the ParameterIdentity object instance identifiers to filter on. A value of '0' means match all.">
            <mal:type list="true" name="Long" area="MAL"/>
          </mal:field>
          <mal:field name="stateFilter" canBeNull="false"
                     comment="The list of required check states to filter on. Empty list means match all.">
            <mal:type list="true" name="CheckState" service="Check" area="MC"/>
          </mal:field>
        </mal:composite>
        <mal:composite name="ReferenceValue" shortFormPart="7"
                       comment="The ReferenceValue structure defines a value to compare against. A validCount of '1' and deltaTime of '0' would compare against the previous sample value.">
          <mal:extends>
            <mal:type name="Composite" area="MAL"/>
          </mal:extends>
          <mal:field name="validCount" canBeNull="false"
                     comment="Number of valid samples that should be collected to update the reference value.">
            <mal:type name="UShort" area="MAL"/>
          </mal:field>
          <mal:field name="deltaTime" canBeNull="false"
                     comment="Delta time from now into the past from which the reference value should be sampled.">
            <mal:type name="Duration" area="MAL"/>
          </mal:field>
          <mal:field name="parameterId"
                     comment="The ParameterIdentity object to compare against. If NULL, then checked parameter should be compared against itself.">
            <mal:type name="ObjectKey" area="COM"/>
          </mal:field>
        </mal:composite>
        <mal:composite name="ConstantCheckDefinition" shortFormPart="8"
                       comment="The ConstantCheckDefinition structure holds the constant values to compare against for a consistency check.">
          <mal:extends>
            <mal:type name="CheckDefinitionDetails" service="Check" area="MC"/>
          </mal:extends>
          <mal:field name="operator" canBeNull="false"
                     comment="The operator to be used to perform the check.">
            <mal:type name="ExpressionOperator" service="Archive" area="COM"/>
          </mal:field>
          <mal:field name="values" canBeNull="false"
                     comment="The set of constant values to be checked against. An empty list means that any value change triggers the check.">
            <mal:type list="true" name="AttributeValue" area="MC"/>
          </mal:field>
        </mal:composite>
        <mal:composite name="ReferenceCheckDefinition" shortFormPart="9"
                       comment="The ReferenceCheckDefinition structure holds the key to another entity to compare against for a consistency check.">
          <mal:extends>
            <mal:type name="CheckDefinitionDetails" service="Check" area="MC"/>
          </mal:extends>
          <mal:field name="operator" canBeNull="false"
                     comment="The operator to be used to perform the check.">
            <mal:type name="ExpressionOperator" service="Archive" area="COM"/>
          </mal:field>
          <mal:field name="checkReference" canBeNull="false" comment="The value to check against.">
            <mal:type name="ReferenceValue" service="Check" area="MC"/>
          </mal:field>
        </mal:composite>
        <mal:composite name="DeltaCheckDefinition" shortFormPart="10"
                       comment="The DeltaCheckDefinition defines a delta transition check.">
          <mal:extends>
            <mal:type name="CheckDefinitionDetails" service="Check" area="MC"/>
          </mal:extends>
          <mal:field name="checkReference" canBeNull="false"
                     comment="The value to compare the current value against.">
            <mal:type name="ReferenceValue" service="Check" area="MC"/>
          </mal:field>
          <mal:field name="violateInRange" canBeNull="false"
                     comment="If TRUE, then the safe (non violating) values lie outside the specified threshold range.">
            <mal:type name="Boolean" area="MAL"/>
          </mal:field>
          <mal:field name="valueDelta" canBeNull="false"
                     comment="If TRUE, then the thresholds contain value deltas. If FALSE, they contain percentage deltas.">
            <mal:type name="Boolean" area="MAL"/>
          </mal:field>
          <mal:field name="lowerThreshold"
                     comment="The lower threshold of the delta value. Must be of the correct type for the entity being checked. Must be a Float if percentage threshold in the range (-1.0 to 1.0 representing +-100%).">
            <mal:type name="Attribute" area="MAL"/>
          </mal:field>
          <mal:field name="upperThreshold"
                     comment="The upper threshold of the delta value. Must be of the correct type for the entity being checked. Must be a Float if percentage threshold in the range (-1.0 to 1.0 representing +-100%).">
            <mal:type name="Attribute" area="MAL"/>
          </mal:field>
        </mal:composite>
        <mal:composite name="LimitCheckDefinition" shortFormPart="11"
                       comment="The LimitCheckDefinition defines a high and low limit check. It is valid to supply only one limit; the other limit is assumed to be the relevant maximum supported by the type being checked in this case.">
          <mal:extends>
            <mal:type name="CheckDefinitionDetails" service="Check" area="MC"/>
          </mal:extends>
          <mal:field name="violateInRange" canBeNull="false"
                     comment="If TRUE, then the safe (non violating) values lie outside the specified limits range.">
            <mal:type name="Boolean" area="MAL"/>
          </mal:field>
          <mal:field name="lowerLimit"
                     comment="The lower limit of the value. Must be of the correct type for the entity being checked.">
            <mal:type name="Attribute" area="MAL"/>
          </mal:field>
          <mal:field name="upperLimit"
                     comment="The upper limit of the value. Must be of the correct type for the entity being checked.">
            <mal:type name="Attribute" area="MAL"/>
          </mal:field>
        </mal:composite>
        <mal:composite name="CompoundCheckDefinition" shortFormPart="12"
                       comment="The CompoundCheckDefinition structure holds the object instance identifiers of one or more check link objects to monitor for a compound check.">
          <mal:extends>
            <mal:type name="CheckDefinitionDetails" service="Check" area="MC"/>
          </mal:extends>
          <mal:field name="minimumChecksInViolation" canBeNull="false"
                     comment="The number of referenced checks that must be in violation for this check to be considered in violation. If set to '0' then all referenced checks must be in violation.">
            <mal:type name="UInteger" area="MAL"/>
          </mal:field>
          <mal:field name="checkLinkIds" canBeNull="false"
                     comment="The set of CheckLink objects that form the compound check.">
            <mal:type list="true" name="Long" area="MAL"/>
          </mal:field>
        </mal:composite>
        <mal:composite name="CheckTypedInstance" shortFormPart="13"
                       comment="The CheckTypedInstance structure is used to hold the two COM object instance identifiers that form the identity and the body of the check definition in combination with the COM object type of the check body definition.">
          <mal:extends>
            <mal:type name="Composite" area="MAL"/>
          </mal:extends>
          <mal:field name="objDefCheckType" canBeNull="false"
                     comment="The COM object type of the check body.">
            <mal:type name="ObjectType" area="COM"/>
          </mal:field>
          <mal:field name="objInstIds" comment="The object instance identifiers.">
            <mal:type name="ObjectInstancePair" area="MC"/>
          </mal:field>
        </mal:composite>
      </mal:dataTypes>
      <com:features>
        <mal:diagram name="CheckObjects">
          <svg:svg width="750" height="780" version="1.1">
            <svg:rect x="260" y="380" fill="#FCF2E3" stroke="black" stroke-width="2" width="180"
                      height="70"/>
            <svg:text x="350" y="398" font-family="Verdana" font-size="12" fill="navy"
                      text-anchor="middle"
                      alignment-baseline="middle">COM OBJECT</svg:text>
            <svg:text x="350" y="420" font-family="Verdana" font-size="12" fill="navy"
                      text-anchor="middle"
                      alignment-baseline="middle">CheckLink</svg:text>
            <svg:text x="350" y="432" font-family="Verdana" font-size="12" fill="navy"
                      text-anchor="middle"
                      alignment-baseline="middle">2</svg:text>
            <svg:text x="350" y="444" font-family="Verdana" font-size="12" fill="navy"
                      text-anchor="middle"
                      alignment-baseline="middle"/>
            <svg:rect x="550" y="380" fill="#FCF2E3" stroke="black" stroke-width="2" width="180"
                      height="70"/>
            <svg:text x="640" y="398" font-family="Verdana" font-size="12" fill="navy"
                      text-anchor="middle"
                      alignment-baseline="middle">COM OBJECT</svg:text>
            <svg:text x="640" y="420" font-family="Verdana" font-size="12" fill="navy"
                      text-anchor="middle"
                      alignment-baseline="middle">ParameterIdentity</svg:text>
            <svg:text x="640" y="432" font-family="Verdana" font-size="12" fill="navy"
                      text-anchor="middle"
                      alignment-baseline="middle">1</svg:text>
            <svg:text x="640" y="444" font-family="Verdana" font-size="12" fill="navy"
                      text-anchor="middle"
                      alignment-baseline="middle">MAL::Identifier</svg:text>
            <svg:rect x="20" y="330" fill="#FCF2E3" stroke="black" stroke-width="2" width="150"
                      height="70"/>
            <svg:text x="95" y="348" font-family="Verdana" font-size="12" fill="navy"
                      text-anchor="middle"
                      alignment-baseline="middle">COM OBJECT</svg:text>
            <svg:text x="95" y="370" font-family="Verdana" font-size="12" fill="navy"
                      text-anchor="middle"
                      alignment-baseline="middle">CompoundCheck</svg:text>
            <svg:text x="95" y="382" font-family="Verdana" font-size="12" fill="navy"
                      text-anchor="middle"
                      alignment-baseline="middle">9</svg:text>
            <svg:text x="95" y="394" font-family="Verdana" font-size="12" fill="navy"
                      text-anchor="middle"
                      alignment-baseline="middle">CompoundCheckDefinition</svg:text>
            <svg:rect x="260" y="190" fill="#FCF2E3" stroke="black" stroke-width="2" width="180"
                      height="70"/>
            <svg:text x="350" y="208" font-family="Verdana" font-size="12" fill="navy"
                      text-anchor="middle"
                      alignment-baseline="middle">COM OBJECT</svg:text>
            <svg:text x="350" y="230" font-family="Verdana" font-size="12" fill="navy"
                      text-anchor="middle"
                      alignment-baseline="middle">CheckIdentity</svg:text>
            <svg:text x="350" y="242" font-family="Verdana" font-size="12" fill="navy"
                      text-anchor="middle"
                      alignment-baseline="middle">1</svg:text>
            <svg:text x="350" y="254" font-family="Verdana" font-size="12" fill="navy"
                      text-anchor="middle"
                      alignment-baseline="middle">MAL::Identifier</svg:text>
            <svg:rect x="260" y="690" fill="#FCF2E3" stroke="black" stroke-width="2" width="180"
                      height="70"/>
            <svg:text x="350" y="708" font-family="Verdana" font-size="12" fill="navy"
                      text-anchor="middle"
                      alignment-baseline="middle">COM EVENT</svg:text>
            <svg:text x="350" y="730" font-family="Verdana" font-size="12" fill="navy"
                      text-anchor="middle"
                      alignment-baseline="middle">CheckTransition</svg:text>
            <svg:text x="350" y="742" font-family="Verdana" font-size="12" fill="navy"
                      text-anchor="middle"
                      alignment-baseline="middle">4</svg:text>
            <svg:text x="350" y="754" font-family="Verdana" font-size="12" fill="navy"
                      text-anchor="middle"
                      alignment-baseline="middle">CheckResult</svg:text>
            <svg:rect x="20" y="250" fill="#FCF2E3" stroke="black" stroke-width="2" width="150"
                      height="70"/>
            <svg:text x="95" y="268" font-family="Verdana" font-size="12" fill="navy"
                      text-anchor="middle"
                      alignment-baseline="middle">COM OBJECT</svg:text>
            <svg:text x="95" y="290" font-family="Verdana" font-size="12" fill="navy"
                      text-anchor="middle"
                      alignment-baseline="middle">LimitCheck</svg:text>
            <svg:text x="95" y="302" font-family="Verdana" font-size="12" fill="navy"
                      text-anchor="middle"
                      alignment-baseline="middle">8</svg:text>
            <svg:text x="95" y="314" font-family="Verdana" font-size="12" fill="navy"
                      text-anchor="middle"
                      alignment-baseline="middle">LimitCheckDefinition</svg:text>
            <svg:rect x="20" y="170" fill="#FCF2E3" stroke="black" stroke-width="2" width="150"
                      height="70"/>
            <svg:text x="95" y="188" font-family="Verdana" font-size="12" fill="navy"
                      text-anchor="middle"
                      alignment-baseline="middle">COM OBJECT</svg:text>
            <svg:text x="95" y="210" font-family="Verdana" font-size="12" fill="navy"
                      text-anchor="middle"
                      alignment-baseline="middle">DeltaCheck</svg:text>
            <svg:text x="95" y="222" font-family="Verdana" font-size="12" fill="navy"
                      text-anchor="middle"
                      alignment-baseline="middle">7</svg:text>
            <svg:text x="95" y="234" font-family="Verdana" font-size="12" fill="navy"
                      text-anchor="middle"
                      alignment-baseline="middle">DeltaCheckDefinition</svg:text>
            <svg:rect x="20" y="90" fill="#FCF2E3" stroke="black" stroke-width="2" width="150"
                      height="70"/>
            <svg:text x="95" y="108" font-family="Verdana" font-size="12" fill="navy"
                      text-anchor="middle"
                      alignment-baseline="middle">COM OBJECT</svg:text>
            <svg:text x="95" y="130" font-family="Verdana" font-size="12" fill="navy"
                      text-anchor="middle"
                      alignment-baseline="middle">ReferenceCheck</svg:text>
            <svg:text x="95" y="142" font-family="Verdana" font-size="12" fill="navy"
                      text-anchor="middle"
                      alignment-baseline="middle">6</svg:text>
            <svg:text x="95" y="154" font-family="Verdana" font-size="12" fill="navy"
                      text-anchor="middle"
                      alignment-baseline="middle">ReferenceCheckDefinition</svg:text>
            <svg:rect x="20" y="10" fill="#FCF2E3" stroke="black" stroke-width="2" width="150"
                      height="70"/>
            <svg:text x="95" y="28" font-family="Verdana" font-size="12" fill="navy"
                      text-anchor="middle"
                      alignment-baseline="middle">COM OBJECT</svg:text>
            <svg:text x="95" y="50" font-family="Verdana" font-size="12" fill="navy"
                      text-anchor="middle"
                      alignment-baseline="middle">ConstantCheck</svg:text>
            <svg:text x="95" y="62" font-family="Verdana" font-size="12" fill="navy"
                      text-anchor="middle"
                      alignment-baseline="middle">5</svg:text>
            <svg:text x="95" y="74" font-family="Verdana" font-size="12" fill="navy"
                      text-anchor="middle"
                      alignment-baseline="middle">ConstantCheckDefinition</svg:text>
            <svg:rect x="260" y="540" fill="#FCF2E3" stroke="black" stroke-width="2" width="180"
                      height="70"/>
            <svg:text x="350" y="558" font-family="Verdana" font-size="12" fill="navy"
                      text-anchor="middle"
                      alignment-baseline="middle">COM OBJECT</svg:text>
            <svg:text x="350" y="580" font-family="Verdana" font-size="12" fill="navy"
                      text-anchor="middle"
                      alignment-baseline="middle">CheckLinkDefinition</svg:text>
            <svg:text x="350" y="592" font-family="Verdana" font-size="12" fill="navy"
                      text-anchor="middle"
                      alignment-baseline="middle">3</svg:text>
            <svg:text x="350" y="604" font-family="Verdana" font-size="12" fill="navy"
                      text-anchor="middle"
                      alignment-baseline="middle">CheckLinkDetails</svg:text>
            <svg:rect x="550" y="690" fill="#FCF2E3" stroke="black" stroke-width="2" width="180"
                      height="70"/>
            <svg:text x="640" y="708" font-family="Verdana" font-size="12" fill="navy"
                      text-anchor="middle"
                      alignment-baseline="middle">COM_UNSPECIFIED</svg:text>
            <svg:text x="640" y="730" font-family="Verdana" font-size="12" fill="navy"
                      text-anchor="middle"
                      alignment-baseline="middle">COM::UNSPECIFIED_OBJECT</svg:text>
            <svg:text x="640" y="742" font-family="Verdana" font-size="12" fill="navy"
                      text-anchor="middle"
                      alignment-baseline="middle"/>
            <svg:text x="640" y="754" font-family="Verdana" font-size="12" fill="navy"
                      text-anchor="middle"
                      alignment-baseline="middle"/>
          </svg:svg>
        </mal:diagram>
        <com:objects comment="Each check of a provider shall be represented by a CheckIdentity COM object.&#xA;The body of the CheckIdentity COM object shall hold the name of the check.&#xA;The check definition details shall be represented as one of the specific check definition COM objects (ConstantCheck, ReferenceCheck, DeltaCheck, LimitCheck, CompoundCheck).&#xA;The check definition object (ConstantCheck, ReferenceCheck, DeltaCheck, LimitCheck, CompoundCheck) shall use the related link to indicate which CheckIdentity object it uses.&#xA;The link between which parameters are being evaluated for each check shall be represented as CheckLink COM objects.&#xA;The CheckLink object shall use the related link to indicate which CheckIdentity object it uses.&#xA;If the CheckLink belongs to a compound check then the source link shall be set to NULL.&#xA;If the CheckLink object does not belong to a compound check then the source link shall be used to indicate which ParameterIdentity object it is checking.&#xA;The definitions of the check links shall be represented as CheckLinkDefinition COM objects.&#xA;The CheckLinkDefinition object shall use the related link to indicate which CheckLink object it defines.&#xA;Changes in the state or result of a check shall be represented as CheckTransition COM events.&#xA;The CheckTransition event objects shall use the related link to indicate which CheckLinkDefinition object it uses.&#xA;The CheckTransition event objects shall use the source link to indicate what object (if any) caused it to be evaluated, most likely the relevant ParameterValueInstance object or the COM OperationActivity object of a triggerCheck operation.&#xA;In the case of the maximum reporting interval expiring, the source link of the CheckTransition event object shall be set to NULL.">
          <com:object name="CheckIdentity" number="1">
            <com:objectType>
              <mal:type name="Identifier" area="MAL"/>
            </com:objectType>
          </com:object>
          <com:object name="CheckLink" number="2">
            <com:relatedObject>
              <com:objectType number="1" service="Check" area="MC"/>
            </com:relatedObject>
            <com:sourceObject>
              <com:objectType number="1" service="Parameter" area="MC"/>
            </com:sourceObject>
          </com:object>
          <com:object name="CheckLinkDefinition" number="3">
            <com:objectType>
              <mal:type name="CheckLinkDetails" service="Check" area="MC"/>
            </com:objectType>
            <com:relatedObject>
              <com:objectType number="2" service="Check" area="MC"/>
            </com:relatedObject>
          </com:object>
          <com:object name="ConstantCheck" number="5">
            <com:objectType>
              <mal:type name="ConstantCheckDefinition" service="Check" area="MC"/>
            </com:objectType>
            <com:relatedObject>
              <com:objectType number="1" service="Check" area="MC"/>
            </com:relatedObject>
          </com:object>
          <com:object name="ReferenceCheck" number="6">
            <com:objectType>
              <mal:type name="ReferenceCheckDefinition" service="Check" area="MC"/>
            </com:objectType>
            <com:relatedObject>
              <com:objectType number="1" service="Check" area="MC"/>
            </com:relatedObject>
          </com:object>
          <com:object name="DeltaCheck" number="7">
            <com:objectType>
              <mal:type name="DeltaCheckDefinition" service="Check" area="MC"/>
            </com:objectType>
            <com:relatedObject>
              <com:objectType number="1" service="Check" area="MC"/>
            </com:relatedObject>
          </com:object>
          <com:object name="LimitCheck" number="8">
            <com:objectType>
              <mal:type name="LimitCheckDefinition" service="Check" area="MC"/>
            </com:objectType>
            <com:relatedObject>
              <com:objectType number="1" service="Check" area="MC"/>
            </com:relatedObject>
          </com:object>
          <com:object name="CompoundCheck" number="9">
            <com:objectType>
              <mal:type name="CompoundCheckDefinition" service="Check" area="MC"/>
            </com:objectType>
            <com:relatedObject>
              <com:objectType number="1" service="Check" area="MC"/>
            </com:relatedObject>
          </com:object>
        </com:objects>
        <com:events comment="When a check is evaluated and its state changes, the change in state shall be represented as CheckTransition COM events.&#xA;When the maximum reporting interval expires the generated check result shall be represented as CheckTransition COM event.">
          <com:event name="CheckTransition" number="4">
            <com:objectType>
              <mal:type name="CheckResult" service="Check" area="MC"/>
            </com:objectType>
            <com:relatedObject>
              <com:objectType number="3" service="Check" area="MC"/>
            </com:relatedObject>
            <com:sourceObject comment="The object that caused the check evaluation to occur, most likely the relevant ParameterValueInstance object, but also be the COM OperationActivity object of a triggerCheck operation or NULL in the case of the maximum reporting interval expiring."/>
          </com:event>
        </com:events>
        <com:archiveUsage comment="CheckIdentity objects should be stored in the COM archive.&#xA;The COM objects that hold the check definition details (such as ConstantCheck, ReferenceCheck, DeltaCheck, LimitCheck, CompoundCheck) should be stored in the COM archive.&#xA;CheckLink objects should be stored in the COM archive.&#xA;CheckLinkDefinition objects should be stored in the COM archive.&#xA;When a check transition event is published, the event should be stored in the COM archive."/>
      </com:features>
    </mal:service>
    <mal:service xsi:type="com:ExtendedServiceType" name="Statistic" number="5"
                 comment="The statistic service allows the consumer to monitor and control the statistical evaluation (e.g., average) of parameters.&#xA;The statistic service allows the consumer to link the statistic function to a parameter to be evaluated. Figure 3-9 shows the nominal sequence of operations for the statistic service:&#xA;---- nominal sequence diag ----&#xA;Statistic service nominal sequence&#xA;For each statistics link the service allows a consumer to specify a sampling interval, a reporting interval, and a collection interval. &#xA;The sampling interval defines the interval between samples of the linked parameter, the reporting interval defines the interval between reports of the current statistic evaluation value, and the collection interval defines the period of time which parameter values are collected for the statistic function.&#xA;A consumer can create several links to the same parameter with different intervals, for example for the function 'Mean', a consumer might define two links with different collection intervals, one for an hour (D0) and one for four hours (D1). The consumer might also specify the reporting interval of half an hour for the first link and two hours for the second link. This would mean that the service provider would produce reports as shown in Figure 3-10.&#xA;--- timeline chart ---&#xA;Example Statistic interval reporting&#xA;If a statistic is defined to reset on collection interval expiration the currently calculated value, and any input collection of values, for the parameter being sampled is reset every collection interval, so if an hourly collection interval is defined for the function 'Mean' then every hour the current mean average value is reset (this does not affect the value reported by the Parameter service itself or any other links for the same function and parameter), the set of values used to calculate that mean average is cleared, and a report is generated containing the final value of the function just before the reset.&#xA;If a statistic is defined not to reset every collection interval, then the statistic maintains a moving evaluation for the collection interval. For example, if a collection interval of an hour is defined with a reset Boolean of FALSE for the function 'Maximum' then the evaluation will hold the maximum value obtained in the last hour.&#xA;The consumer is also able to define the sampling interval of the parameter for a link. This is independent of both the collection interval and the reporting interval. It makes sense for the sampling interval to be smaller than both the collection and reporting interval however it is perfectly possible to specify other values, as this is a deployment decision.&#xA;For the statistic service, the list of possible statistics functions is deployment-dependent, as any function would have to be implemented in the service provider. There are no operations for the creation, modification, or deletion of the statistic functions. The statistic service defines the evaluation of minimum, maximum, mean, and standard deviation functions, however the service supports the addition of other statistical functions by implementations.&#xA;NOTE: To ensure deterministic behaviour, implementations should endeavour to respect Nyquist�s theorem.">
      <mal:documentation name="High Level Requirements" order="1">The statistics service may provide the following capabilities:
&lt;ol&gt;
 &lt;li&gt;the capability for requesting the current statistics evaluation;&lt;/li&gt;
 &lt;li&gt;the capability for resetting the statistic evaluations;&lt;/li&gt;
 &lt;li&gt;the capability for periodic statistics reporting;&lt;/li&gt;
 &lt;li&gt;the capability to control generation of periodic statistics reporting;&lt;/li&gt;
 &lt;li&gt;the capability for maintaining the list of evaluated parameters.&lt;/li&gt;
&lt;/ol&gt;
The statistics service may support the evaluation of the following set of statistic functions:
&lt;ol&gt;
 &lt;li&gt;the maximum value;&lt;/li&gt;
 &lt;li&gt;the minimum value;&lt;/li&gt;
 &lt;li&gt;the mean value;&lt;/li&gt;
 &lt;li&gt;the standard deviation.&lt;/li&gt;
&lt;/ol&gt;
Whether the statistics reporting service supports a specific statistic function shall be declared when implementing that service.
The statistic service shall maintain a set of links between the statistic function and the parameter that shall be evaluated.
Each statistics link shall contain:
&lt;ol&gt;
 &lt;li&gt;the identification of the parameter for which statistics are evaluated;&lt;/li&gt;
 &lt;li&gt;the related collection interval;&lt;/li&gt;
 &lt;li&gt;whether the collection resets every collection interval;&lt;/li&gt;
 &lt;li&gt;the related reporting interval;&lt;/li&gt;
 &lt;li&gt;the related sampling interval.&lt;/li&gt;
&lt;/ol&gt;
The evaluation of a specific statistic shall be reset every collection interval if the reset on collection interval Boolean is TRUE.
The parameter referenced by a statistic link shall be sampled every sampling interval.
The statistics evaluation value shall be reported every reporting and collection interval if generation is enabled.
Each statistics value report shall contain:
&lt;ol&gt;
 &lt;li&gt;the start time of the evaluation;&lt;/li&gt;
 &lt;li&gt;the end time of the evaluation;&lt;/li&gt;
 &lt;li&gt;the time of the collected value if applicable;&lt;/li&gt;
 &lt;li&gt;the evaluated value;&lt;/li&gt;
 &lt;li&gt;the number of samples that contributed to the evaluation.&lt;/li&gt;
&lt;/ol&gt;
When resetting the statistics, the statistics service shall, in sequence:
&lt;ol&gt;
 &lt;li&gt;stop the evaluation of the statistics;&lt;/li&gt;
 &lt;li&gt;clear any results accumulated;&lt;/li&gt;
 &lt;li&gt;restart the evaluation process.&lt;/li&gt;
&lt;/ol&gt;
The statistics service shall provide the capability to enable periodic statistics reporting.
The statistics service shall provide the capability to disable the periodic statistics reporting.
For each valid instruction to disable periodic statistics reporting, the statistics service shall:
&lt;ol&gt;
 &lt;li&gt;set the statistics link status to disabled;&lt;/li&gt;
 &lt;li&gt;continue evaluating the parameter statistics.&lt;/li&gt;
&lt;/ol&gt;</mal:documentation>
      <mal:documentation name="Functional Requirements" order="2">The statistic value for a parameter shall be evaluated after each sampling of the parameter and after the collection interval is elapsed.
A consumer may request the latest status of the statistical evaluations using the getStatistics operation.
If a StatisticLink is required to send periodic reports, then the time between these reports shall be controlled using the reportingInterval duration value.
A reportingInterval value of '0' shall mean no periodic reports shall be sent; reports are required to be triggered by another mechanism in this case.
The reportingInterval value shall be modified using the updateParameterEvaluation operation.
If the reporting interval and the collection intervals align, for example report every minute with a five minute collection interval the fifth minute will align, then only a single report shall be generated in this case.
For onboard parameters the link sampling interval should be a multiple of the minimum sampling interval of those parameters.
If an interval that is not supported by the provider is requested, then an INVALID error shall be returned, and the change rejected.
For the 'Maximum' statistics function, the highest value shall be reported, in the case of multiple samples matching that, the first occurrence shall be report.
For the 'Minimum' statistics function, the smallest value shall be reported, in the case of multiple samples matching that, the first occurrence shall be report.
For the 'Mean average' statistics function, when used with integer parameters the result shall be reported using a Double type.
For the 'Standard deviation' statistics function, when used with integer parameters the result shall be reported using a Double type.</mal:documentation>
      <mal:capabilitySet number="1">
        <mal:requestIP name="getStatistics" number="1" supportInReplay="true"
                       comment="The getStatistics operation returns the latest value for a set of existing statistic evaluations.">
          <mal:messages>
            <mal:request>
              <mal:field name="funcObjInstIds"
                         comment="The funcObjInstIds field shall include a list of StatisticFunction object instance identifiers to match.&#xA;The funcObjInstIds field shall support the wildcard value of '0' and will match all functions of the provider.&#xA;The wildcard value should be checked for first, if found no other checks of supplied object instance identifiers shall be made.">
                <mal:type list="true" name="Long" area="MAL"/>
              </mal:field>
              <mal:field name="isGroup">
                <mal:type name="Boolean" area="MAL"/>
              </mal:field>
              <mal:field name="paramObjInstIds"
                         comment="If the isGroup field is TRUE then the paramObjInstIds field shall contain GroupIdentity object instance identifiers, otherwise the field shall contain ParameterIdentity object instance identifiers.&#xA;If the isGroup field is TRUE, the requested Group, or the Group objects referenced by that Group, must contain ParameterIdentity objects otherwise an INVALID error shall be returned.&#xA;The ParameterIdentity objects referenced, either directly or indirectly via groups, by the paramObjInstIds field shall be the parameters to match.&#xA;The paramObjInstIds field shall support the wildcard value of '0' and matches all parameters of the provider matched to the functions given in the funcObjInstIds field.&#xA;The wildcard value should be checked for first, if found no other checks of supplied object instance identifiers shall be made.&#xA;If a requested function, group or parameters is unknown then an UNKNOWN error shall be returned.&#xA;The sets of matched StatisticFunction objects and ParameterIdentity objects shall be matched to the set of existing StatisticLink objects to determine which StatisticLink objects to report on.">
                <mal:type list="true" name="ObjectKey" area="COM"/>
              </mal:field>
            </mal:request>
            <mal:response>
              <mal:field name="evaluations"
                         comment="The response shall contain a list of matching statistics evaluation values.&#xA;The operation shall trigger an evaluation of the statistical functions matched and return the new evaluation values.&#xA;If it is not possible to return an evaluation value for a matched evaluation (for example not enough samples available) then no entry for that evaluation shall be included.&#xA;The evaluation shall not trigger a report via the monitorStatistics operation.&#xA;Requesting an evaluation shall ignore the samplingInterval, reportingInterval, and collectionInterval fields and requests an immediate evaluation of the statistic.&#xA;Requesting an evaluation during a periodic evaluation shall not influence the periodic evaluation (e.g. it does not reset the samplingInterval, reportingInterval, and collectionInterval timers or the current periodic collection value).">
                <mal:type list="true" name="StatisticEvaluationReport" service="Statistic" area="MC"/>
              </mal:field>
            </mal:response>
          </mal:messages>
          <mal:errors>
            <mal:errorRef comment="One or more of the requested groups or parameters do not exist in the provider or statistic functions is not supported by the provider.">
              <mal:type name="UNKNOWN" area="MAL"/>
              <mal:extraInformation comment="A list of the indexes of the error values shall be contained in the extra information field.">
                <mal:type list="true" name="UInteger" area="MAL"/>
              </mal:extraInformation>
            </mal:errorRef>
            <mal:errorRef comment="One of the supplied groups is not a group of groups or ParameterIdentity objects.">
              <mal:type name="INVALID" area="COM"/>
              <mal:extraInformation comment="The extra information field contains a list of the indexes of the erroneous values from the originating list supplied.">
                <mal:type list="true" name="UInteger" area="MAL"/>
              </mal:extraInformation>
            </mal:errorRef>
          </mal:errors>
        </mal:requestIP>
        <mal:requestIP name="resetEvaluation" number="2" supportInReplay="false"
                       comment="The operation allows a consumer to reset the statistical evaluations so the evaluations restart from the current time (without changing the collection interval), optionally returning the evaluation up to that point. Resetting the evaluation will affect all consumers.">
          <mal:messages>
            <mal:request>
              <mal:field name="isStatLinkGroup"
                         comment="If the isStatLinkGroup field is TRUE then the objInstIds field shall contain GroupIdentity object instance identifiers, otherwise the field shall contain StatisticFunction object instance identifiers.&#xA;If the isStatLinkGroup field is TRUE, the requested Group, or the Group objects referenced by that Group, must contain StatisticLink objects otherwise an INVALID error shall be returned.&#xA;The StatisticLink objects referenced, either indirectly via statistic functions or indirectly via groups, by the objInstIds field shall be the StatisticLink objects to match.">
                <mal:type name="Boolean" area="MAL"/>
              </mal:field>
              <mal:field name="objInstIds"
                         comment="The objInstIds field shall support the wildcard value of '0' and matches all StatisticLink objects of the provider.&#xA;The wildcard value should be checked for first, if found no other checks of supplied object instance identifiers shall be made.&#xA;If a requested function or group is unknown then an UNKNOWN error shall be returned.">
                <mal:type list="true" name="Long" area="MAL"/>
              </mal:field>
              <mal:field name="returnLatestEval"
                         comment="If the returnLatestEval Boolean field is TRUE then the latest evaluation result for each of the matched links shall be returned before resetting, otherwise a NULL is returned.&#xA;If an error is raised then no resetting of evaluations shall be made as a result of this operation call.">
                <mal:type name="Boolean" area="MAL"/>
              </mal:field>
            </mal:request>
            <mal:response>
              <mal:field name="evaluations">
                <mal:type list="true" name="StatisticEvaluationReport" service="Statistic" area="MC"/>
              </mal:field>
            </mal:response>
          </mal:messages>
          <mal:errors>
            <mal:errorRef comment="One of the supplied groups is not a group of groups or StatisticLink objects.">
              <mal:type name="INVALID" area="COM"/>
              <mal:extraInformation comment="The extra information field contains a list of the indexes of the erroneous values from the originating list supplied.">
                <mal:type list="true" name="UInteger" area="MAL"/>
              </mal:extraInformation>
            </mal:errorRef>
            <mal:errorRef comment="One or more of the requested groups or functions is unknown.">
              <mal:type name="UNKNOWN" area="MAL"/>
              <mal:extraInformation comment="A list of the indexes of the error values shall be contained in the extra information field.">
                <mal:type list="true" name="UInteger" area="MAL"/>
              </mal:extraInformation>
            </mal:errorRef>
          </mal:errors>
        </mal:requestIP>
      </mal:capabilitySet>
      <mal:capabilitySet number="2">
        <mal:pubsubIP name="monitorStatistics" number="3" supportInReplay="true"
                      comment="The monitorStatistics operation allows a consumer to subscribe for statistical evaluation value reports.&#xA;It should be noted that no evaluation reports will be generated if the service provider has been disabled via the enableService operation.">
          <mal:messages>
            <mal:publishNotify>
              <mal:field name="relatedId"
                         comment="The MAL EntityKey.firstSubKey shall contain the statistic function name.&#xA;The MAL EntityKey.secondSubKey shall contain the StatisticLink object instance identifier.&#xA;The MAL EntityKey.thirdSubKey shall contain the ParameterIdentity object instance identifier.&#xA;The MAL EntityKey.fourthSubKey shall contain the new StatisticValueInstance object instance identifier.&#xA;The timestamp of the StatisticValueInstance report shall be taken from the publish message.&#xA;The related link of the update shall be held in the relatedId field.">
                <mal:type name="Long" area="MAL"/>
              </mal:field>
              <mal:field name="sourceId"
                         comment="The source link of the StatisticValueInstance shall be held in the sourceId field.&#xA;If no source link is needed then the sourceId shall be set to NULL.">
                <mal:type name="ObjectId" area="COM"/>
              </mal:field>
              <mal:field name="statisticValue"
                         comment="The second part of the publish message shall be the StatisticValueInstance object value.">
                <mal:type name="StatisticValue" service="Statistic" area="MC"/>
              </mal:field>
            </mal:publishNotify>
          </mal:messages>
        </mal:pubsubIP>
      </mal:capabilitySet>
      <mal:capabilitySet number="3">
        <mal:submitIP name="enableService" number="4" supportInReplay="false"
                      comment="The enableService operation allows a consumer to globally control whether evaluation of all statistics is performed or not.">
          <mal:messages>
            <mal:submit>
              <mal:field name="enableService"
                         comment="If enableService is set to TRUE the service shall be enabled and evaluation and reporting of statistics will be reset and commence.&#xA;If enableService is set to FALSE then all evaluation of statistics shall be suspended and no statistics will be reported.&#xA;If the enableService value matches the current enabled state of the service then no change shall be made and no error reported. Enabling an already enabled service has no effect.">
                <mal:type name="Boolean" area="MAL"/>
              </mal:field>
            </mal:submit>
          </mal:messages>
        </mal:submitIP>
        <mal:requestIP name="getServiceStatus" number="5" supportInReplay="false"
                       comment="The getServiceStatus operation allows a consumer to determine the global statistic service enabled status.">
          <mal:messages>
            <mal:request/>
            <mal:response>
              <mal:field name="serviceEnabled"
                         comment="The operation shall return TRUE if the service is currently enabled or FALSE if the service is currently disabled.">
                <mal:type name="Boolean" area="MAL"/>
              </mal:field>
            </mal:response>
          </mal:messages>
        </mal:requestIP>
      </mal:capabilitySet>
      <mal:capabilitySet number="4">
        <mal:submitIP name="enableReporting" number="6" supportInReplay="false"
                      comment="The enableReporting operation allows a consumer to control whether reports for specific statistical functions are generated or not. The operation allows the consumer to select the functions directly or indirectly using groups.">
          <mal:messages>
            <mal:submit>
              <mal:field name="isGroupIds"
                         comment="If the isGroupIds field is TRUE then the enableInstances field shall contain GroupIdentity object instance identifiers, otherwise the field contains StatisticFunction object instance identifiers.&#xA;If the isGroupIds field is TRUE, the requested Group, or the Group objects referenced by that Group, must contain StatisticLink objects otherwise an INVALID error shall be returned.&#xA;The StatisticLink objects referenced, either indirectly via StatisticFunction objects or indirectly via groups, by the enableInstances field shall be the StatisticLink objects to match.&#xA;The id of the enableInstances field shall support the wildcard value of '0' and matches all StatisticLink objects of the provider.&#xA;The service provider shall check for the wildcard value in the list of object instance identifiers in the enableInstances field first and if found no other checks of supplied object instance identifiers shall be made.&#xA;If the enableInstances field contains a value of TRUE then reports after the reporting and collection intervals for matching StatisticLink objects shall be generated, a value of FALSE requests that reports will not be generated.&#xA;No error shall be raised if the enableInstances Boolean value supplied is the same as the current reportingEnabled field for a StatisticLink object i.e. enabling an already enabled link will not result in an error.&#xA;If a requested StatisticFunction or GroupIdentity object is unknown then an UNKNOWN error shall be returned.&#xA;If an error is raised then no modifications shall be made as a result of this operation call.&#xA;The provider should create and store a new StatisticLinkDefinition object in the COM archive if the reportingEnabled field is changed.">
                <mal:type name="Boolean" area="MAL"/>
              </mal:field>
              <mal:field name="enableInstances"
                         comment="If the generation of reports is being enabled, then the provider shall generate a report immediately and start the report interval from that report.">
                <mal:type list="true" name="InstanceBooleanPair" area="COM"/>
              </mal:field>
            </mal:submit>
          </mal:messages>
          <mal:errors>
            <mal:errorRef comment="One or more of the requested StatisticFunction or Group objects is unknown.">
              <mal:type name="UNKNOWN" area="MAL"/>
              <mal:extraInformation comment="A list of the indexes of the error values shall be contained in the extra information field.">
                <mal:type list="true" name="UInteger" area="MAL"/>
              </mal:extraInformation>
            </mal:errorRef>
            <mal:errorRef comment="One of the supplied groups is not a group of groups or StatisticLink objects.">
              <mal:type name="INVALID" area="COM"/>
              <mal:extraInformation comment="The extra information field contains a list of the indexes of the erroneous values from the originating list supplied.">
                <mal:type list="true" name="UInteger" area="MAL"/>
              </mal:extraInformation>
            </mal:errorRef>
          </mal:errors>
        </mal:submitIP>
      </mal:capabilitySet>
      <mal:capabilitySet number="5">
        <mal:requestIP name="listParameterEvaluations" number="7" supportInReplay="false"
                       comment="The listParameterEvaluations operation allows a consumer to request the object instance identifiers of the StatisticLink objects for the evaluations of the provider.">
          <mal:messages>
            <mal:request>
              <mal:field name="statObjInstIds"
                         comment="The statObjInstIds field shall hold a list of StatisticFunction object instance identifiers to retrieve the StatisticLink object instance identifiers for.&#xA;The request may contain the wildcard value of '0' to return all supported statistic links.&#xA;The wildcard value should be checked for first, if found no other checks of supplied identifiers shall be made.&#xA;If a provided identifier does not include a wildcard and does not match an existing StatisticFunction object then this operation shall fail with an UNKNOWN error.">
                <mal:type list="true" name="Long" area="MAL"/>
              </mal:field>
            </mal:request>
            <mal:response>
              <mal:field name="statLinkObjInstIds"
                         comment="The response shall contain a list of StatisticLinkSummary that contain the object instance identifiers of the StatisticLink, StatisticFunction, and ParameterIdentity for the matched StatisticFunction objects.">
                <mal:type list="true" name="StatisticLinkSummary" service="Statistic" area="MC"/>
              </mal:field>
            </mal:response>
          </mal:messages>
          <mal:errors>
            <mal:errorRef comment="One of the supplied identifiers is unknown.">
              <mal:type name="UNKNOWN" area="MAL"/>
              <mal:extraInformation comment="A list of the indexes of the error values shall be contained in the extra information field.">
                <mal:type list="true" name="UInteger" area="MAL"/>
              </mal:extraInformation>
            </mal:errorRef>
          </mal:errors>
        </mal:requestIP>
      </mal:capabilitySet>
      <mal:capabilitySet number="6">
        <mal:requestIP name="addParameterEvaluation" number="8" supportInReplay="false"
                       comment="The addParameterEvaluation operation allows a consumer to request that one or more parameters/function combinations are added to the list of parameters that are being evaluated.&#xA;The new StatisticLink and StatisticLinkDefinition objects are expected to be stored in the COM archive by the provider of the statistic service.">
          <mal:messages>
            <mal:request>
              <mal:field name="newDetails"
                         comment="The newDetails field shall hold a StatisticCreationRequest for each new parameter to be sampled.&#xA;The statFuncInstId field of the StatisticCreationRequest shall reference the object instance identifier of the StatisticFunction to be used.&#xA;If the statFuncInstId field does not match an existing StatisticFunction then an UNKNOWN error shall be raised.&#xA;The parameterId shall reference the ParameterIdentity that the function is being applied to.&#xA;If the parameterId field does not match an existing ParameterIdentity then an UNKNOWN error shall be raised.&#xA;If the type of the matched parameter is not supported by the matched statistical function, for example Mean average of a String parameter, then an INVALID error shall be returned.&#xA;The samplingInterval field shall contain the sampling duration interval for the parameter.&#xA;If the supplied samplingInterval is not supported for the requested parameter then an INVALID error shall be returned.&#xA;If an error is raised then no new StatisticLink object shall be created and stored as a result of this operation call.&#xA;If no error is to be raised then StatisticLink and StatisticLinkDefinition objects shall be created for each function/parameter link and stored in the COM archive.&#xA;The referenced parameter shall be sampled immediately and the sampling, reporting and collection intervals started.">
                <mal:type list="true" name="StatisticCreationRequest" service="Statistic" area="MC"/>
              </mal:field>
            </mal:request>
            <mal:response>
              <mal:field name="newObjInstIds"
                         comment="The response shall contain the list of object instance identifiers for the new StatisticLink and StatisticLinkDefinition objects.&#xA;The object instance identifiers of the StatisticLink and StatisticLinkDefinition objects shall be held in the first and second fields of the ObjectInstancePair structure respectively.&#xA;The returned list shall maintain the same order as the submitted links.">
                <mal:type list="true" name="ObjectInstancePair" area="MC"/>
              </mal:field>
            </mal:response>
          </mal:messages>
          <mal:errors>
            <mal:errorRef comment="One or more of the supplied StatisticLink is either requesting an invalid sampling interval or invalid function for the request parameter.">
              <mal:type name="INVALID" area="COM"/>
              <mal:extraInformation comment="The extra information field contains a list of the indexes of the erroneous values from the originating list supplied.">
                <mal:type list="true" name="UInteger" area="MAL"/>
              </mal:extraInformation>
            </mal:errorRef>
            <mal:errorRef comment="One of the requested StatisticLink objects references either an unknown StatisticFunction object or an unknown ParameterIdentity object.">
              <mal:type name="UNKNOWN" area="MAL"/>
              <mal:extraInformation comment="A list of the indexes of the error values shall be contained in the extra information field.">
                <mal:type list="true" name="UInteger" area="MAL"/>
              </mal:extraInformation>
            </mal:errorRef>
          </mal:errors>
        </mal:requestIP>
        <mal:requestIP name="updateParameterEvaluation" number="9" supportInReplay="false"
                       comment="The updateParameterEvaluation operation allows a consumer to modify the intervals, reporting and reset Booleans for one or more statistical evaluation links.&#xA;The replacement StatisticLinkDefinition objects should be stored in the COM archive by the service provider. The operation does not remove the previous object from the COM archive, merely removes the object from the provider.">
          <mal:messages>
            <mal:request>
              <mal:field name="linkIds"
                         comment="The linkIds field shall contain the object instance identifiers of the StatisticLink objects to be updated.&#xA;If the linkIds list contains either NULL or '0' an INVALID error shall be raised.&#xA;The supplied object instance identifiers shall match existing link objects, an UNKNOWN error shall be raised if this is not the case.&#xA;If the supplied samplingInterval is not supported for the requested parameter then an INVALID error shall be returned.">
                <mal:type list="true" name="Long" area="MAL"/>
              </mal:field>
              <mal:field name="newDetails"
                         comment="The newDetails field shall contain the replacement StatisticLinkDetails.&#xA;The two lists shall be ordered the same.&#xA;The number of entries in the two lists shall be the same size otherwise an INVALID error shall be returned.&#xA;If an error is raised then no links shall be updated as a result of this operation call.&#xA;The provider shall create a new StatisticLinkDefinition object and store it in the COM archive.&#xA;If any of the intervals are updated then the service shall reset the relevant timer and use the new intervals immediately.">
                <mal:type list="true" name="StatisticLinkDetails" service="Statistic" area="MC"/>
              </mal:field>
            </mal:request>
            <mal:response>
              <mal:field name="newLinkDefIds"
                         comment="The response shall contain the list of object instance identifiers for the new StatisticLinkDefinition objects.&#xA;The returned list shall maintain the same order as the submitted links.">
                <mal:type list="true" name="Long" area="MAL"/>
              </mal:field>
            </mal:response>
          </mal:messages>
          <mal:errors>
            <mal:errorRef comment="One or more of the supplied StatisticLink object instance identifiers is unknown.">
              <mal:type name="UNKNOWN" area="MAL"/>
              <mal:extraInformation comment="A list of the indexes of the error values shall be contained in the extra information field.">
                <mal:type list="true" name="UInteger" area="MAL"/>
              </mal:extraInformation>
            </mal:errorRef>
            <mal:errorRef comment="One or more of the supplied object instance identifiers list contains either a NULL or '0' or is requesting an invalid sampling interval for the request parameter or the two supplied lists are not the same length.&#xA;If the two lists are not the same length then the extra information field shall contain the first index of the element in the largest list which does not have corresponding element in the other list.">
              <mal:type name="INVALID" area="COM"/>
              <mal:extraInformation comment="The extra information field contains a list of the indexes of the erroneous values from the originating list supplied.">
                <mal:type list="true" name="UInteger" area="MAL"/>
              </mal:extraInformation>
            </mal:errorRef>
          </mal:errors>
        </mal:requestIP>
        <mal:submitIP name="removeParameterEvaluation" number="10" supportInReplay="false"
                      comment="The removeParameterEvaluation operation allows a consumer to remove one or more parameters from the list of parameters being sampled by the statistic provider.&#xA;The operation does not remove the StatisticLink or StatisticLinkDefinition objects from the COM archive, merely removes them from the provider. This permits existing evaluation results to continue to reference the correct StatisticLink and StatisticLinkDefinition objects in the COM archive.">
          <mal:messages>
            <mal:submit>
              <mal:field name="objInstIds"
                         comment="The objInstIds field holds the object instance identifiers of the StatisticLink objects to be removed from the provider.&#xA;The list may contain the wildcard value of '0'.&#xA;The wildcard value should be checked for first, if found no other checks of supplied object instance identifiers shall be made.&#xA;If a provided StatisticLink object instance identifier does not include a wildcard and does not match an existing StatisticLink object then this operation shall fail with an UNKNOWN error.&#xA;Matched StatisticLink objects shall not be removed from the COM archive only the list of evaluated StatisticLink objects in the provider.&#xA;If an error is raised then no StatisticLink objects shall be removed as a result of this operation call.&#xA;If the operation succeeds then the provider shall not evaluate those parameter/function definition combinations for the deleted StatisticLink objects anymore.">
                <mal:type list="true" name="Long" area="MAL"/>
              </mal:field>
            </mal:submit>
          </mal:messages>
          <mal:errors>
            <mal:errorRef comment="One or more of the supplied StatisticLink object instance identifiers is unknown.">
              <mal:type name="UNKNOWN" area="MAL"/>
              <mal:extraInformation comment="A list of the indexes of the error values shall be contained in the extra information field.">
                <mal:type list="true" name="UInteger" area="MAL"/>
              </mal:extraInformation>
            </mal:errorRef>
          </mal:errors>
        </mal:submitIP>
      </mal:capabilitySet>
      <mal:dataTypes>
        <mal:composite name="StatisticFunctionDetails" shortFormPart="1"
                       comment="The StatisticFunctionDetails structure holds the details of the function.">
          <mal:extends>
            <mal:type name="Composite" area="MAL"/>
          </mal:extends>
          <mal:field name="name" canBeNull="false" comment="The name of the statistical function.">
            <mal:type name="Identifier" area="MAL"/>
          </mal:field>
          <mal:field name="description" canBeNull="false"
                     comment="The description of the statistical function.">
            <mal:type name="String" area="MAL"/>
          </mal:field>
        </mal:composite>
        <mal:composite name="StatisticLinkDetails" shortFormPart="2"
                       comment="The StatisticLinkDetails structure holds the sampling, reporting, and collection intervals for one parameter statistic function link.">
          <mal:extends>
            <mal:type name="Composite" area="MAL"/>
          </mal:extends>
          <mal:field name="samplingInterval" canBeNull="false"
                     comment="The interval between samples of the parameter.">
            <mal:type name="Duration" area="MAL"/>
          </mal:field>
          <mal:field name="reportingInterval" canBeNull="false"
                     comment="The interval between periodic reports being generated. If set to '0', then no periodic reports shall be sent.">
            <mal:type name="Duration" area="MAL"/>
          </mal:field>
          <mal:field name="collectionInterval" canBeNull="false"
                     comment="The collection and reset interval of the statistical evaluation for the linked parameter. If set to '0', then no periodic reset of the evaluation shall be performed.">
            <mal:type name="Duration" area="MAL"/>
          </mal:field>
          <mal:field name="resetEveryCollection" canBeNull="false"
                     comment="If TRUE the evaluation will reset its value every collection interval. If FALSE it will maintain a moving evaluation of the function for the collection interval.">
            <mal:type name="Boolean" area="MAL"/>
          </mal:field>
          <mal:field name="reportingEnabled" canBeNull="false"
                     comment="TRUE if reporting of the evaluation instance is enabled.">
            <mal:type name="Boolean" area="MAL"/>
          </mal:field>
          <mal:field name="useConverted" canBeNull="false"
                     comment="If TRUE then use the converted value of the Parameter, else use the raw value">
            <mal:type name="Boolean" area="MAL"/>
          </mal:field>
        </mal:composite>
        <mal:composite name="StatisticValue" shortFormPart="3"
                       comment="The StatisticValue structure holds the statistical result for a parameter.">
          <mal:extends>
            <mal:type name="Composite" area="MAL"/>
          </mal:extends>
          <mal:field name="paramDefInstId" canBeNull="false"
                     comment="The object instance identifier of the ParameterDefinition object used for the parameter.">
            <mal:type name="Long" area="MAL"/>
          </mal:field>
          <mal:field name="startTime"
                     comment="Time the statistic calculations started. This value can be NULL if the start time can be derived by other means, e.g., other start times in a set of StatisticValue structures.">
            <mal:type name="Time" area="MAL"/>
          </mal:field>
          <mal:field name="endTime"
                     comment="Time the statistic calculations ended. This value can be NULL if the time can be derived by other means, e.g., other times in a set of StatisticValue structures.">
            <mal:type name="Time" area="MAL"/>
          </mal:field>
          <mal:field name="valueTime"
                     comment="Time the statistic value was reached. The time is only applicable for particular statistic values such as min or max. Shall be NULL if not applicable for cases such as 'mean average'.">
            <mal:type name="Time" area="MAL"/>
          </mal:field>
          <mal:field name="value" comment="Value of the statistic.">
            <mal:type name="Attribute" area="MAL"/>
          </mal:field>
          <mal:field name="sampleCount" canBeNull="false"
                     comment="Holds the number of samples that contributed to the statistic value. For calculated values such as 'mean average' this holds the number of samples that were used to calculate the value, for non-calculated values such as 'min' then it is the number of samples that were in the set evaluated.">
            <mal:type name="UInteger" area="MAL"/>
          </mal:field>
        </mal:composite>
        <mal:composite name="StatisticCreationRequest" shortFormPart="4"
                       comment="The StatisticCreationRequest structure holds the link details for a specific parameter and function association.">
          <mal:extends>
            <mal:type name="Composite" area="MAL"/>
          </mal:extends>
          <mal:field name="statFuncInstId" canBeNull="false"
                     comment="The object instance identifier of the statistical function to be used.">
            <mal:type name="Long" area="MAL"/>
          </mal:field>
          <mal:field name="parameterId" canBeNull="false"
                     comment="The object key of the ParameterIdentity object being referenced.">
            <mal:type name="ObjectKey" area="COM"/>
          </mal:field>
          <mal:field name="linkDetails" canBeNull="false"
                     comment="The collection, reporting, and sampling intervals.">
            <mal:type name="StatisticLinkDetails" service="Statistic" area="MC"/>
          </mal:field>
        </mal:composite>
        <mal:composite name="StatisticLinkSummary" shortFormPart="5"
                       comment="The StatisticLinkSummary structure holds the ids of a specific statistic link and the function and parameter it links to.">
          <mal:field name="funcId" canBeNull="false"
                     comment="The object instance identifier of the StatisticFunction object.">
            <mal:type name="Long" area="MAL"/>
          </mal:field>
          <mal:field name="linkId" canBeNull="false"
                     comment="The object instance identifier of the StatisticLink object.">
            <mal:type name="Long" area="MAL"/>
          </mal:field>
          <mal:field name="linkDefId" canBeNull="false"
                     comment="The object instance identifier of the StatisticLinkDefinition object.">
            <mal:type name="Long" area="MAL"/>
          </mal:field>
          <mal:field name="reportingEnabled" canBeNull="false"
                     comment="TRUE if reporting of the evaluation instance is enabled.">
            <mal:type name="Boolean" area="MAL"/>
          </mal:field>
          <mal:field name="parameterId" canBeNull="false"
                     comment="The object instance identifier of the ParameterIdentity object for the statistic link.">
            <mal:type name="ObjectKey" area="COM"/>
          </mal:field>
        </mal:composite>
        <mal:composite name="StatisticEvaluationReport" shortFormPart="6"
                       comment="The StatisticEvaluationReport structure holds the set of statistical results.">
          <mal:extends>
            <mal:type name="Composite" area="MAL"/>
          </mal:extends>
          <mal:field name="linkId" canBeNull="false"
                     comment="The statistic link object instance identifier.">
            <mal:type name="Long" area="MAL"/>
          </mal:field>
          <mal:field name="value" canBeNull="false" comment="The statistical evaluation value.">
            <mal:type name="StatisticValue" service="Statistic" area="MC"/>
          </mal:field>
        </mal:composite>
      </mal:dataTypes>
      <com:features>
        <mal:diagram name="StatisticObjects">
          <svg:svg width="480" height="560" version="1.1">
            <svg:rect x="20" y="170" fill="#FCF2E3" stroke="black" stroke-width="2" width="150"
                      height="70"/>
            <svg:text x="95" y="188" font-family="Verdana" font-size="12" fill="navy"
                      text-anchor="middle"
                      alignment-baseline="middle">COM OBJECT</svg:text>
            <svg:text x="95" y="210" font-family="Verdana" font-size="12" fill="navy"
                      text-anchor="middle"
                      alignment-baseline="middle">StatisticLink</svg:text>
            <svg:text x="95" y="222" font-family="Verdana" font-size="12" fill="navy"
                      text-anchor="middle"
                      alignment-baseline="middle">2</svg:text>
            <svg:text x="95" y="234" font-family="Verdana" font-size="12" fill="navy"
                      text-anchor="middle"
                      alignment-baseline="middle"/>
            <svg:rect x="290" y="170" fill="#FCF2E3" stroke="black" stroke-width="2" width="170"
                      height="70"/>
            <svg:text x="375" y="188" font-family="Verdana" font-size="12" fill="navy"
                      text-anchor="middle"
                      alignment-baseline="middle">COM OBJECT</svg:text>
            <svg:text x="375" y="210" font-family="Verdana" font-size="12" fill="navy"
                      text-anchor="middle"
                      alignment-baseline="middle">ParameterIdentity</svg:text>
            <svg:text x="375" y="222" font-family="Verdana" font-size="12" fill="navy"
                      text-anchor="middle"
                      alignment-baseline="middle">1</svg:text>
            <svg:text x="375" y="234" font-family="Verdana" font-size="12" fill="navy"
                      text-anchor="middle"
                      alignment-baseline="middle">MAL::Identifier</svg:text>
            <svg:rect x="290" y="470" fill="#FCF2E3" stroke="black" stroke-width="2" width="170"
                      height="70"/>
            <svg:text x="375" y="488" font-family="Verdana" font-size="12" fill="navy"
                      text-anchor="middle"
                      alignment-baseline="middle">COM_UNSPECIFIED</svg:text>
            <svg:text x="375" y="510" font-family="Verdana" font-size="12" fill="navy"
                      text-anchor="middle"
                      alignment-baseline="middle">COM::UNSPECIFIED_OBJECT</svg:text>
            <svg:text x="375" y="522" font-family="Verdana" font-size="12" fill="navy"
                      text-anchor="middle"
                      alignment-baseline="middle"/>
            <svg:text x="375" y="534" font-family="Verdana" font-size="12" fill="navy"
                      text-anchor="middle"
                      alignment-baseline="middle"/>
            <svg:rect x="20" y="20" fill="#FCF2E3" stroke="black" stroke-width="2" width="150"
                      height="70"/>
            <svg:text x="95" y="38" font-family="Verdana" font-size="12" fill="navy"
                      text-anchor="middle"
                      alignment-baseline="middle">COM OBJECT</svg:text>
            <svg:text x="95" y="60" font-family="Verdana" font-size="12" fill="navy"
                      text-anchor="middle"
                      alignment-baseline="middle">StatisticFunction</svg:text>
            <svg:text x="95" y="72" font-family="Verdana" font-size="12" fill="navy"
                      text-anchor="middle"
                      alignment-baseline="middle">1</svg:text>
            <svg:text x="95" y="84" font-family="Verdana" font-size="12" fill="navy"
                      text-anchor="middle"
                      alignment-baseline="middle">StatisticFunctionDetails</svg:text>
            <svg:rect x="20" y="320" fill="#FCF2E3" stroke="black" stroke-width="2" width="150"
                      height="70"/>
            <svg:text x="95" y="338" font-family="Verdana" font-size="12" fill="navy"
                      text-anchor="middle"
                      alignment-baseline="middle">COM OBJECT</svg:text>
            <svg:text x="95" y="360" font-family="Verdana" font-size="12" fill="navy"
                      text-anchor="middle"
                      alignment-baseline="middle">StatisticLinkDefinition</svg:text>
            <svg:text x="95" y="372" font-family="Verdana" font-size="12" fill="navy"
                      text-anchor="middle"
                      alignment-baseline="middle">3</svg:text>
            <svg:text x="95" y="384" font-family="Verdana" font-size="12" fill="navy"
                      text-anchor="middle"
                      alignment-baseline="middle">StatisticLinkDetails</svg:text>
            <svg:rect x="20" y="470" fill="#FCF2E3" stroke="black" stroke-width="2" width="150"
                      height="70"/>
            <svg:text x="95" y="488" font-family="Verdana" font-size="12" fill="navy"
                      text-anchor="middle"
                      alignment-baseline="middle">COM OBJECT</svg:text>
            <svg:text x="95" y="510" font-family="Verdana" font-size="12" fill="navy"
                      text-anchor="middle"
                      alignment-baseline="middle">StatisticValueInstance</svg:text>
            <svg:text x="95" y="522" font-family="Verdana" font-size="12" fill="navy"
                      text-anchor="middle"
                      alignment-baseline="middle">4</svg:text>
            <svg:text x="95" y="534" font-family="Verdana" font-size="12" fill="navy"
                      text-anchor="middle"
                      alignment-baseline="middle">StatisticValue</svg:text>
          </svg:svg>
        </mal:diagram>
        <com:objects comment="The statistic functions shall be represented as StatisticFunction COM objects.&#xA;For a 'Maximum' statistics function, the object instance identifier of '1' and name of 'MAX' shall be used.&#xA;For a 'Minimum' statistics function, the object instance identifier of '2' and name of 'MIN' shall be used.&#xA;For a 'Mean average' statistics function, the object instance identifier of '3' and name of 'MEAN' shall be used.&#xA;For a 'Standard deviation' statistics function, the object instance identifier of '4' and name of 'SD' shall be used.&#xA;For non-standard statistics functions, i.e. ones not listed here, the name and object instance identifier shall be communicated through an out-of-band agreement.&#xA;The link between which parameters are being evaluated for each function shall be represented as StatisticLink COM objects.&#xA;The details of a statistic link, such as reportingInterval, shall be represented as a StatisticLinkDefinition COM object.&#xA;Statistic evaluations for a specific parameter and statistic function shall be represented as StatisticValueInstance COM objects.&#xA;The StatisticLink object shall use the related link to indicate which StatisticFunction object it uses.&#xA;The StatisticLink object shall use the source link to indicate which ParameterIdentity object it uses.&#xA;The StatisticLinkDefinition object shall use the related link to indicate which StatisticLink object it uses.&#xA;The StatisticValueInstance object shall use the related link to indicate which StatisticLinkDefinition object it uses.&#xA;The StatisticValueInstance object shall use the source link to indicate what object (if any) caused it to be evaluated.&#xA;If the StatisticValueInstance object was a result of a getStatistics operation call then the source link shall be the COM OperationActivity object of the operation.">
          <com:object name="StatisticFunction" number="1">
            <com:objectType>
              <mal:type name="StatisticFunctionDetails" service="Statistic" area="MC"/>
            </com:objectType>
          </com:object>
          <com:object name="StatisticLink" number="2">
            <com:relatedObject>
              <com:objectType number="1" service="Statistic" area="MC"/>
            </com:relatedObject>
            <com:sourceObject>
              <com:objectType number="1" service="Parameter" area="MC"/>
            </com:sourceObject>
          </com:object>
          <com:object name="StatisticLinkDefinition" number="3">
            <com:objectType>
              <mal:type name="StatisticLinkDetails" service="Statistic" area="MC"/>
            </com:objectType>
            <com:relatedObject>
              <com:objectType number="2" service="Statistic" area="MC"/>
            </com:relatedObject>
          </com:object>
          <com:object name="StatisticValueInstance" number="4">
            <com:objectType>
              <mal:type name="StatisticValue" service="Statistic" area="MC"/>
            </com:objectType>
            <com:relatedObject>
              <com:objectType number="3" service="Statistic" area="MC"/>
            </com:relatedObject>
            <com:sourceObject comment="The object that caused the statistical evaluation to occur, may be NULL if occurred due to evaluation period timeout."/>
          </com:object>
        </com:objects>
        <com:archiveUsage comment="StatisticFunction objects should be stored in the COM archive only if they are not one of the standard functions.&#xA;StatisticLink objects should be stored in the COM archive.&#xA;StatisticLinkDefinition objects should be stored in the COM archive.&#xA;When a StatisticValueInstance report is published, the object should be stored in the COM archive."/>
      </com:features>
    </mal:service>
    <mal:service xsi:type="com:ExtendedServiceType" name="Aggregation" number="6"
                 comment="The aggregation service allows the user to acquire several parameter values in a single request.&#xA;Aggregations are generated either periodically, on an ad-hoc basis, or after a configurable timeout when being filtered. Periodic is where they are generated at a specific generation interval; in this case the periodicity is an aspect of the aggregation rather than the contained parameters. Ad-hoc is when the aggregation generation is triggered by some other deployment-specific mechanism.&#xA;Filtering is where an aggregation is only generated when the change in the value of the filtered parameters exceeds a specified threshold or a timeout is passed. Filtering can be applied to both periodic and ad-hoc aggregations.&#xA;As there may be a large amount of time between reports of an aggregation when filtering is applied, the filtering concept also has a maximum reporting interval. If a report of the aggregation has not passed the filter in the maximum reporting interval a report is generated regardless. This allows there to be regular reports of an aggregation sent regardless of filtering.&#xA;It should be noted that applying a filter with a maximum reporting interval to an ad-hoc aggregation will cause the aggregation to generate reports in a periodic way if the maximum reporting interval is left to expire. This is expected behaviour.&#xA;There are a number of intervals defined in the structures of the service, the diagram in Figure 3-12 illustrates the use of these:&#xA; insert timing diagram &#xA;The diagram shows a single report of an aggregation being generated which contains two parameter sets. Each set of parameter values in the aggregation report contains two optional durations, delta time and interval time. &#xA;&lt;ul&gt;&#xA; &lt;li&gt;The timestamp of the first value of the first set (T1) is defined as the timestamp of the aggregation report plus the delta time of the first set.&lt;/li&gt;&#xA; &lt;li&gt;The timestamp of the second value of the first set (T2) is defined as the timestamp of the first parameter (T1) plus the interval time of the set.&lt;/li&gt;&#xA; &lt;li&gt;The timestamp of the first value of the second set (T3) is defined as the timestamp of the last value of the previous set (T2) plus the delta time of the second set.&lt;/li&gt;&#xA; &lt;li&gt;The timestamp of the second value of the second set (T4) is defined as the timestamp of the first parameter (T3) plus the interval time of the set.&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;The COM archive is used to hold the definitions of the aggregations.">
      <mal:documentation name="High Level Requirements" order="1">The aggregation service shall provide:
&lt;ol&gt;
 &lt;li&gt;the capability for periodic reporting of predefined aggregation values;&lt;/li&gt;
 &lt;li&gt;the capability for requesting the current value of a set of aggregations;&lt;/li&gt;
 &lt;li&gt;the capability for controlling reporting of the aggregation values;&lt;/li&gt;
 &lt;li&gt;the capability for maintaining the list of aggregation definitions.&lt;/li&gt;
&lt;/ol&gt;
Three modes of generating an aggregation value shall exist: periodic, ad-hoc, and filtered:
&lt;ol&gt;
 &lt;li&gt;Periodic reports for aggregations shall be generated once for each cycle of a specified interval.&lt;/li&gt;
 &lt;li&gt;Ad-hoc reports for aggregations shall be triggered by some other deployment-specific means.&lt;/li&gt;
 &lt;li&gt;Filtered reports for aggregations shall be generated only when the value of one or more parameters in the aggregation has changed by more than a given threshold since the previous generation or when a timeout expires.&lt;/li&gt;
&lt;/ol&gt;</mal:documentation>
      <mal:documentation name="Functional Requirements" order="2">The generation of reports for an aggregation shall be controlled by the generationEnabled Boolean value in the AggregationDefinitionDetails structure.
Setting the generationEnabled field to TRUE shall enable generation of reports for a specific aggregation.
The generationEnabled values can be set by using the enableGeneration operation.
The filtering of reports for an aggregation shall be controlled by the filterEnabled Boolean value in the AggregationDefinitionDetails structure.
Setting the filterEnabled field to TRUE shall enable filtering of reports for a specific aggregation.
The filterEnabled values can be set by using the enableFilter operation.
If an aggregation is required to send periodic reports, then the time between these reports shall be controlled using the reportInterval Duration value in the AggregationDefinitionDetails structure.
Periodic reports for aggregations shall set the generationMode field of the AggregationValueInstance to PERIODIC.
No periodic reports shall be generated when the reportInterval field is set to '0' and reports will be triggered by another ad-hoc implementation-specific mechanism in this case.
Ad-hoc reports for aggregations shall set the generationMode field of the AggregationValueInstance to ADHOC.
If an aggregation is filtered, reports shall be generated only when the value of one or more parameters in the aggregation have changed by more than a given threshold since the previous generated aggregation report.
The threshold for the filter shall be defined, on a per-parameter basis, either as a percentage or an (absolute) delta change in value.
Parameters in an aggregation that do not have a filter specified in the aggregation definition shall be ignored by the filter comparison process.
If filtering is enabled and a filtered timeout has been set for that aggregation, if no change has been detected in that time-out period, an aggregation value shall be generated with a generation mode of FILTERED_TIMEOUT. This measure ensures that extensive periods of time do not elapse without reports of an enabled aggregation.
The generationEnabled, filterEnabled, filteredTimeout, sendUnchanged and reportInterval values of an AggregationDefinition object can be set by using the updateDefinition operation.
If the filteredTimeout interval, reportInterval or one or more of the sampleIntervals requested are not supported by the provider then an INVALID error shall be returned and the creation or change rejected.
If the sendUnchanged field in the AggregationDefinition object is FALSE then parameter values that have not changed since the previous report shall be replaced by a NULL in the values list of the AggregationSetValue composite.
The ordering of the values in the AggregationValueInstance object shall match the ordering of parameters in the AggregationDefinitionDetails structure.</mal:documentation>
      <mal:capabilitySet number="1">
        <mal:pubsubIP name="monitorValue" number="1" supportInReplay="true"
                      comment="The monitorValue operation allows a consumer to subscribe for aggregation value reports.">
          <mal:messages>
            <mal:publishNotify>
              <mal:field name="objId"
                         comment="The MAL EntityKey.firstSubKey shall contain the aggregation name.&#xA;The MAL EntityKey.secondSubKey shall contain the AggregationIdentity object instance identifier.&#xA;The MAL EntityKey.thirdSubKey shall contain the AggregationDefinition object instance identifier.&#xA;The MAL EntityKey.fourthSubKey shall contain the new AggregationValueInstance object instance identifier.&#xA;The timestamp of the AggregationValueInstance report shall be taken from the publish message.&#xA;The publish message shall include the ObjectId of the source link of the report.&#xA;If no source link is needed then the ObjectId shall be replaced with a NULL.">
                <mal:type name="ObjectId" area="COM"/>
              </mal:field>
              <mal:field name="newValue"
                         comment="The second part of the publish message shall be the AggregationValue.">
                <mal:type name="AggregationValue" service="Aggregation" area="MC"/>
              </mal:field>
            </mal:publishNotify>
          </mal:messages>
        </mal:pubsubIP>
      </mal:capabilitySet>
      <mal:capabilitySet number="2">
        <mal:requestIP name="getValue" number="2" supportInReplay="true"
                       comment="The getValue operation returns the latest received value for a requested aggregation.">
          <mal:messages>
            <mal:request>
              <mal:field name="aggInstIds"
                         comment="The aggInstIds field shall provide the list of AggregationIdentity object instance identifiers.&#xA;The wildcard value of '0' shall be supported and matches all aggregations of the provider.&#xA;The wildcard value should be checked for first, if found no other checks of supplied object instance identifiers shall be made.&#xA;If a requested aggregation is unknown then an UNKNOWN error shall be returned.&#xA;The filter shall not be applied for the getValue operation.&#xA;If an aggregation is being reported periodically, using the operation shall not reset the reportInterval or filteredTimeout timer.">
                <mal:type list="true" name="Long" area="MAL"/>
              </mal:field>
            </mal:request>
            <mal:response>
              <mal:field name="aggValDetails"
                         comment="The response shall contain a list of returned AggregationIdentity and AggregationDefinition object instance identifier pairs and a matching list of AggregationValues.&#xA;The new value shall not be published via the monitorValue operation.">
                <mal:type list="true" name="AggregationValueDetails" service="Aggregation" area="MC"/>
              </mal:field>
            </mal:response>
          </mal:messages>
          <mal:errors>
            <mal:errorRef comment="One or more of the requested aggregations is unknown.">
              <mal:type name="UNKNOWN" area="MAL"/>
              <mal:extraInformation comment="A list of the indexes of the error values shall be contained in the extra information field.">
                <mal:type list="true" name="UInteger" area="MAL"/>
              </mal:extraInformation>
            </mal:errorRef>
          </mal:errors>
        </mal:requestIP>
      </mal:capabilitySet>
      <mal:capabilitySet number="3">
        <mal:requestIP name="enableGeneration" number="3" supportInReplay="false"
                       comment="The enableGeneration operation allows a consumer to control whether reports for specific aggregations are generated or not. The operation allows the consumer to select the aggregations directly or indirectly using groups. This affects all types of aggregations, periodic, filtered and ad-hoc.">
          <mal:messages>
            <mal:request>
              <mal:field name="isGroupIds"
                         comment="If the isGroupIds field is TRUE then the enableInstances field shall contain GroupIdentity object instance identifiers, otherwise the field contains AggregationIdentity object instance identifiers.&#xA;The AggregationIdentity objects referenced, either directly or indirectly via groups, by the enableInstances field shall be the AggregationIdentity objects to match.&#xA;The id of the enableInstances field shall support the wildcard value of '0' and matches all AggregationIdentity objects of the provider.&#xA;The service provider shall check for the wildcard value in the list of object instance identifiers in the enableInstances field first and if found no other checks of supplied object instance identifiers shall be made.&#xA;If the enableInstances field contains a value of TRUE then reports of matching AggregationIdentity objects shall be generated, a value of FALSE requests that reports will not be generated.&#xA;No error shall be raised if the enableInstances Boolean value supplied is the same as the current generationEnabled field of the definition for a matched AggregationIdentity object i.e. enabling an already enabled aggregation will not result in an error.&#xA;If a requested AggregationIdentity or GroupIdentity object is unknown then an UNKNOWN error shall be returned.&#xA;If a requested Group, or the Group objects referenced by that Group, does not contain AggregationIdentity objects then an INVALID error shall be returned.&#xA;If an error is raised then no modifications shall be made as a result of this operation call.&#xA;The provider shall create and store a new AggregationDefinition object in the COM archive if the generationEnabled field is changed.&#xA;If a new AggregationDefinition object is created then that new object shall be the current AggregationDefinition used for the specific AggregationIdentity.">
                <mal:type name="Boolean" area="MAL"/>
              </mal:field>
              <mal:field name="enableInstances"
                         comment="If the generation of reports is being enabled, and the aggregation is defined as being periodic, then the provider shall generate a report immediately and start the report interval from that report.">
                <mal:type list="true" name="InstanceBooleanPair" area="COM"/>
              </mal:field>
            </mal:request>
            <mal:response>
              <mal:field name="newObjInstIds"
                         comment="The response shall contain the list of object instance identifiers for the new AggregationDefinition objects.">
                <mal:type list="true" name="Long" area="MAL"/>
              </mal:field>
            </mal:response>
          </mal:messages>
          <mal:errors>
            <mal:errorRef comment="One or more of the requested aggregations or groups is unknown.">
              <mal:type name="UNKNOWN" area="MAL"/>
              <mal:extraInformation comment="A list of the indexes of the error values shall be contained in the extra information field.">
                <mal:type list="true" name="UInteger" area="MAL"/>
              </mal:extraInformation>
            </mal:errorRef>
            <mal:errorRef comment="One of the supplied groups is either not a group of groups or a group of AggregationIdentity objects.">
              <mal:type name="INVALID" area="COM"/>
              <mal:extraInformation comment="The extra information field contains a list of the indexes of the erroneous values from the originating list supplied.">
                <mal:type list="true" name="UInteger" area="MAL"/>
              </mal:extraInformation>
            </mal:errorRef>
          </mal:errors>
        </mal:requestIP>
        <mal:submitIP name="enableFilter" number="4" supportInReplay="false"
                      comment="The enableFilter operation allows a consumer to control whether reports for specific aggregations are filtered or not. The operation allows the consumer to select the aggregations directly or indirectly using groups. This affects both periodic and ad-hoc aggregations.">
          <mal:messages>
            <mal:submit>
              <mal:field name="isGroupIds"
                         comment="If the isGroupIds field is TRUE then the enableInstances field shall contain GroupIdentity object instance identifiers, otherwise the field contains AggregationIdentity object instance identifiers.&#xA;The AggregationIdentity objects referenced, either directly or indirectly via groups, by the enableInstances field shall be the AggregationIdentity objects to match.&#xA;The id of the enableInstances field shall support the wildcard value of '0' and matches all AggregationIdentity objects of the provider.&#xA;The service provider shall check for the wildcard value in the list of object instance identifiers in the enableInstances field first and if found no other checks of supplied object instance identifiers shall be made.&#xA;If the enableInstances field contains a value of TRUE then reports of matching AggregationIdentity objects shall be filtered, a value of FALSE requests that reports will not be filtered.&#xA;No error shall be raised if the enableInstances Boolean value supplied is the same as the current filterEnabled field of the definition for a matched AggregationIdentity object i.e. filtering an already filtered aggregation will not result in an error.&#xA;If a requested AggregationIdentity or GroupIdentity object is unknown then an UNKNOWN error shall be returned.&#xA;If a requested Group, or the Group objects referenced by that Group, does not contain AggregationIdentity objects then an INVALID error shall be returned.&#xA;If an error is raised then no modifications shall be made as a result of this operation call.&#xA;The provider shall create and store a new AggregationDefinition object in the COM archive if the filterEnabled field is changed.&#xA;If a new AggregationDefinition object is created then that new object shall be the current AggregationDefinition used for the specific AggregationIdentity.">
                <mal:type name="Boolean" area="MAL"/>
              </mal:field>
              <mal:field name="enableInstances">
                <mal:type list="true" name="InstanceBooleanPair" area="COM"/>
              </mal:field>
            </mal:submit>
          </mal:messages>
          <mal:errors>
            <mal:errorRef comment="One of the supplied groups is either not a group of groups or a group of AggregationIdentity objects.">
              <mal:type name="INVALID" area="COM"/>
              <mal:extraInformation comment="The extra information field contains a list of the indexes of the erroneous values from the originating list supplied.">
                <mal:type list="true" name="UInteger" area="MAL"/>
              </mal:extraInformation>
            </mal:errorRef>
            <mal:errorRef comment="One or more of the requested aggregations or groups is unknown.">
              <mal:type name="UNKNOWN" area="MAL"/>
              <mal:extraInformation comment="A list of the indexes of the error values shall be contained in the extra information field.">
                <mal:type list="true" name="UInteger" area="MAL"/>
              </mal:extraInformation>
            </mal:errorRef>
          </mal:errors>
        </mal:submitIP>
      </mal:capabilitySet>
      <mal:capabilitySet number="4">
        <mal:requestIP name="listDefinition" number="5" supportInReplay="true"
                       comment="The listDefinition operation allows a consumer to request the latest object instance identifiers of the AggregationIdentity and AggregationDefinition objects for the supported aggregations of the provider.">
          <mal:messages>
            <mal:request>
              <mal:field name="aggNames"
                         comment="The aggNames field shall contain a list of aggregation names to retrieve the AggregationIdentity and AggregationDefinition object instance identifiers for.&#xA;The aggNames field may contain the wildcard value of '*' to return all supported AggregationIdentity and AggregationDefinition objects.&#xA;The wildcard value should be checked for first, if found no other checks of supplied identifiers shall be made.&#xA;If a provided identifier does not include a wildcard and does not match an existing AggregationIdentity object then this operation shall fail with an UNKNOWN error.">
                <mal:type list="true" name="Identifier" area="MAL"/>
              </mal:field>
            </mal:request>
            <mal:response>
              <mal:field name="objInstIds"
                         comment="The response shall contain a list of matching AggregationIdentity and AggregationDefinition object instance identifiers.&#xA;The returned list shall maintain the same order as the submitted list unless the wildcard value was included in the request.">
                <mal:type list="true" name="ObjectInstancePair" area="MC"/>
              </mal:field>
            </mal:response>
          </mal:messages>
          <mal:errors>
            <mal:errorRef comment="One of the supplied identifiers is unknown.">
              <mal:type name="UNKNOWN" area="MAL"/>
              <mal:extraInformation comment="A list of the indexes of the error values shall be contained in the extra information field.">
                <mal:type list="true" name="UInteger" area="MAL"/>
              </mal:extraInformation>
            </mal:errorRef>
          </mal:errors>
        </mal:requestIP>
      </mal:capabilitySet>
      <mal:capabilitySet number="5">
        <mal:requestIP name="addAggregation" number="6" supportInReplay="false"
                       comment="The addAggregation operation allows a consumer to define one or more aggregations that do not currently exist.&#xA;The new AggregationIdentity and AggregationDefinition objects are expected to be stored in the COM archive by the provider of the aggregation service.">
          <mal:messages>
            <mal:request>
              <mal:field name="aggDefDetails"
                         comment="The aggDefDetails field shall hold the name and the AggregationDefinitionDetails to be added.&#xA;The name field must not be the wildcard '*', or empty (an INVALID error shall be returned in this case).&#xA;If the supplied reportInterval or sampleInterval values are not supported by the provider then an INVALID error shall be returned.&#xA;The supplied name must be unique among all AggregationIdentity objects for the domain of the provider otherwise a DUPLICATE error shall be raised.&#xA;If an error is raised then no new identities and definitions shall be added as a result of this operation call.&#xA;If the supplied name matches an existing, but removed, AggregationIdentity then that AggregationIdentity shall be reused otherwise a new AggregationIdentity shall be created.&#xA;The provider shall create a new AggregationDefinition object and store it, and any new AggregationIdentity objects, in the COM archive.">
                <mal:type list="true" name="AggregationCreationRequest" service="Aggregation" area="MC"/>
              </mal:field>
            </mal:request>
            <mal:response>
              <mal:field name="newObjInstIds"
                         comment="The response shall contain the list of object instance identifiers for the AggregationIdentity and new AggregationDefinition objects.&#xA;The returned list shall maintain the same order as the submitted definitions.">
                <mal:type list="true" name="ObjectInstancePair" area="MC"/>
              </mal:field>
            </mal:response>
          </mal:messages>
          <mal:errors>
            <mal:errorRef comment="One or more of the aggregation objects being added has supplied an aggregation name that is already in use in the domain.">
              <mal:type name="DUPLICATE" area="COM"/>
              <mal:extraInformation comment="The extra information field contains a list of the indexes of the erroneous values from the originating request list.">
                <mal:type list="true" name="UInteger" area="MAL"/>
              </mal:extraInformation>
            </mal:errorRef>
            <mal:errorRef comment="One of the supplied aggregation objects contains an invalid name or a supplied interval is not supported by the provider.">
              <mal:type name="INVALID" area="COM"/>
              <mal:extraInformation comment="The extra information field contains a list of the indexes of the erroneous values from the originating list supplied.">
                <mal:type list="true" name="UInteger" area="MAL"/>
              </mal:extraInformation>
            </mal:errorRef>
          </mal:errors>
        </mal:requestIP>
        <mal:requestIP name="updateDefinition" number="7" supportInReplay="false"
                       comment="The updateDefinition operation allows a consumer to update a definition for one or more aggregations.&#xA;This differs from deleting an existing aggregation and adding a new definition with the same aggregation name in the fact that the AggregationIdentity object is not changed between the two definitions.&#xA;The replacement definition should be stored in the COM archive by the service provider. The operation does not remove the previous object from the COM archive, merely removes the object from the provider.">
          <mal:messages>
            <mal:request>
              <mal:field name="aggInstIds"
                         comment="The aggInstIds field shall contain the object instance identifiers of the AggregationIdentity objects to be updated.&#xA;The supplied object instance identifiers shall match existing identity objects, an UNKNOWN error shall be raised if this is not the case.&#xA;If the aggInstIds list contains either NULL or '0' an INVALID error shall be raised.">
                <mal:type list="true" name="Long" area="MAL"/>
              </mal:field>
              <mal:field name="aggDefDetails"
                         comment="The aggDefDetails field shall contain the replacement AggregationDefinitionDetails.&#xA;The two lists shall be ordered the same.&#xA;The number of entries in the two lists shall be the same size otherwise an INVALID error shall be returned.&#xA;If the supplied reportInterval or sampleInterval values are not supported by the provider then an INVALID error shall be returned.&#xA;If an error is raised then no definitions shall be updated as a result of this operation call.&#xA;The provider shall create a new AggregationDefinition object and store it in the COM archive.&#xA;The new AggregationDefinition object shall be the current AggregationDefinition used for the specific AggregationIdentity.">
                <mal:type list="true" name="AggregationDefinitionDetails" service="Aggregation" area="MC"/>
              </mal:field>
            </mal:request>
            <mal:response>
              <mal:field name="newObjInstIds"
                         comment="The response shall contain the list of object instance identifiers for the new AggregationDefinition objects.&#xA;The returned list shall maintain the same order as the submitted definitions.">
                <mal:type list="true" name="Long" area="MAL"/>
              </mal:field>
            </mal:response>
          </mal:messages>
          <mal:errors>
            <mal:errorRef comment="One of the supplied AggregationIdentity object instance identifiers is unknown.">
              <mal:type name="UNKNOWN" area="MAL"/>
              <mal:extraInformation comment="A list of the indexes of the error values shall be contained in the extra information field.">
                <mal:type list="true" name="UInteger" area="MAL"/>
              </mal:extraInformation>
            </mal:errorRef>
            <mal:errorRef comment="The supplied object instance identifiers list contains either a NULL or '0' or the two supplied lists are not the same length or a supplied interval is not supported by the provider.&#xA;If the two lists are not the same length then the extra information field shall contain the first index of the element in the largest list which does not have corresponding element in the other list.">
              <mal:type name="INVALID" area="COM"/>
              <mal:extraInformation comment="The extra information field contains a list of the indexes of the erroneous values from the originating list supplied.">
                <mal:type list="true" name="UInteger" area="MAL"/>
              </mal:extraInformation>
            </mal:errorRef>
          </mal:errors>
        </mal:requestIP>
        <mal:submitIP name="removeAggregation" number="8" supportInReplay="false"
                      comment="The removeAggregation operation allows a consumer to remove one or more aggregations from the list of aggregations supported by the aggregation provider.&#xA;The operation does not remove the AggregationIdentity or AggregationDefinition objects from the COM archive, merely removes the objects from the provider. This permits existing AggregationValueInstance objects to continue to reference the correct AggregationDefinition object in the COM archive.">
          <mal:messages>
            <mal:submit>
              <mal:field name="aggInstIds"
                         comment="The aggInstIds field shall hold the object instance identifiers of the AggregationIdentity objects to be removed from the provider.&#xA;The list may contain the wildcard value of '0'.&#xA;The wildcard value should be checked for first, if found no other checks of supplied object instance identifiers shall be made.&#xA;If a provided AggregationIdentity object instance identifier does not include a wildcard and does not match an existing aggregation then this operation shall fail with an UNKNOWN error.&#xA;Matched AggregationIdentity and AggregationDefinition objects shall not be removed from the COM archive only the list of AggregationIdentity and AggregationDefinition objects in the provider.&#xA;If an error is raised then no aggregations shall be removed as a result of this operation call.&#xA;If the operation succeeds then the provider shall not publish aggregation values for the deleted AggregationIdentity objects anymore.">
                <mal:type list="true" name="Long" area="MAL"/>
              </mal:field>
            </mal:submit>
          </mal:messages>
          <mal:errors>
            <mal:errorRef comment="One of the supplied AggregationIdentity object instance identifiers is unknown.">
              <mal:type name="UNKNOWN" area="MAL"/>
              <mal:extraInformation comment="A list of the indexes of the error values shall be contained in the extra information field.">
                <mal:type list="true" name="UInteger" area="MAL"/>
              </mal:extraInformation>
            </mal:errorRef>
          </mal:errors>
        </mal:submitIP>
      </mal:capabilitySet>
      <mal:dataTypes>
        <mal:enumeration name="AggregationCategory" shortFormPart="7"
                         comment="AggregationCategory is an enumeration definition holding the categories of aggregations.">
          <mal:item value="GENERAL" nvalue="1" comment="General aggregation."/>
          <mal:item value="DIAGNOSTIC" nvalue="2" comment="Diagnostic aggregation."/>
        </mal:enumeration>
        <mal:enumeration name="ThresholdType" shortFormPart="8"
                         comment="ThresholdType is an enumeration definition holding the types of filtering thresholds.">
          <mal:item value="PERCENTAGE" nvalue="1" comment="Threshold value is a percentage."/>
          <mal:item value="DELTA" nvalue="2" comment="Threshold value is a delta."/>
        </mal:enumeration>
        <mal:enumeration name="GenerationMode" shortFormPart="9"
                         comment="GenerationMode is an enumeration definition holding the reasons for the aggregation to be generated.">
          <mal:item value="ADHOC" nvalue="1"
                    comment="The aggregation value was generated because of an ad-hoc implementation dependent reason."/>
          <mal:item value="PERIODIC" nvalue="2"
                    comment="The aggregation value was generated because of a periodic report."/>
          <mal:item value="FILTERED_TIMEOUT" nvalue="3"
                    comment="The item is filtered but it exceeded its timeout value."/>
        </mal:enumeration>
        <mal:composite name="AggregationDefinitionDetails" shortFormPart="1"
                       comment="The AggregationDefinitionDetails structure holds definition details of an aggregation.">
          <mal:extends>
            <mal:type name="Composite" area="MAL"/>
          </mal:extends>
          <mal:field name="description" canBeNull="false"
                     comment="The description of the parameter. May be empty.">
            <mal:type name="String" area="MAL"/>
          </mal:field>
          <mal:field name="category" canBeNull="false"
                     comment="Category of the aggregation. Value taken from AggregationCategory enumeration, although the use of a UOctet allows deployment specific extension. Extensions must use values greater than 127.">
            <mal:type name="UOctet" area="MAL"/>
          </mal:field>
          <mal:field name="reportInterval" canBeNull="false"
                     comment="The interval between periodic reports on this aggregation. If this aggregation is not periodic, this field must be '0'.">
            <mal:type name="Duration" area="MAL"/>
          </mal:field>
          <mal:field name="sendUnchanged" canBeNull="false"
                     comment="If TRUE reports will include all values regardless of whether changed, if FALSE values unchanged from previous report are replaced with a NULL.">
            <mal:type name="Boolean" area="MAL"/>
          </mal:field>
          <mal:field name="sendDefinitions" canBeNull="false"
                     comment="If TRUE reports will include the ParameterDefinition object instance identifier in the AggregationParameterValue, if FALSE it will be set to NULL.">
            <mal:type name="Boolean" area="MAL"/>
          </mal:field>
          <mal:field name="filterEnabled" canBeNull="false"
                     comment="Controls whether reports for this aggregation are to be filtered.">
            <mal:type name="Boolean" area="MAL"/>
          </mal:field>
          <mal:field name="filteredTimeout" canBeNull="false"
                     comment="The maximum duration between filtered reports. If this value is exceeded, then a report is sent regardless of filtered thresholds. Ignored if not filtered.">
            <mal:type name="Duration" area="MAL"/>
          </mal:field>
          <mal:field name="generationEnabled" canBeNull="false"
                     comment="Controls whether reports for this aggregation are to be generated.">
            <mal:type name="Boolean" area="MAL"/>
          </mal:field>
          <mal:field name="parameterSets" canBeNull="false"
                     comment="List containing the parameter sets which define the aggregation.">
            <mal:type list="true" name="AggregationParameterSet" service="Aggregation" area="MC"/>
          </mal:field>
        </mal:composite>
        <mal:composite name="AggregationParameterSet" shortFormPart="2"
                       comment="The AggregationParameterSet structure holds the identifier and optional filter for a parameter, or set of parameters, in an aggregation.">
          <mal:extends>
            <mal:type name="Composite" area="MAL"/>
          </mal:extends>
          <mal:field name="domain"
                     comment="The domain of the parameters being referenced in this set of parameters, NULL if the same domain as the aggregation.">
            <mal:type list="true" name="Identifier" area="MAL"/>
          </mal:field>
          <mal:field name="parameters" canBeNull="false"
                     comment="The list of object instance identifiers of the ParameterIdentity objects being included in the aggregation.">
            <mal:type list="true" name="Long" area="MAL"/>
          </mal:field>
          <mal:field name="sampleInterval" canBeNull="false"
                     comment="The interval between samples of the parameters in the set. If '0' then just a single sample of the parameters is required per aggregation report.">
            <mal:type name="Duration" area="MAL"/>
          </mal:field>
          <mal:field name="reportFilter"
                     comment="If the AggregationParameterSet contains a single parameter then this field contains the filter to apply for filtered reports when filters are applied. NULL if no filter required or this set contains more than one parameter.">
            <mal:type name="ThresholdFilter" service="Aggregation" area="MC"/>
          </mal:field>
        </mal:composite>
        <mal:composite name="AggregationValue" shortFormPart="3"
                       comment="The AggregationValue structure holds the values for one or more sets of parameter values. The value sets must be held in the same order as that defined in the matching AggregationDefinitionDetails.">
          <mal:extends>
            <mal:type name="Composite" area="MAL"/>
          </mal:extends>
          <mal:field name="generationMode" canBeNull="false"
                     comment="Reason for the aggregation being generated.">
            <mal:type name="GenerationMode" service="Aggregation" area="MC"/>
          </mal:field>
          <mal:field name="filtered" canBeNull="false"
                     comment="If a filter is enabled when the aggregation value is generated then this value shall be set to TRUE, else FALSE.">
            <mal:type name="Boolean" area="MAL"/>
          </mal:field>
          <mal:field name="parameterSetValues" canBeNull="false"
                     comment="The parameterSetValues list holds the sets of values of the aggregation. The sets must be held in the same order as that defined in the aggregation definition.">
            <mal:type list="true" name="AggregationSetValue" service="Aggregation" area="MC"/>
          </mal:field>
        </mal:composite>
        <mal:composite name="AggregationSetValue" shortFormPart="4"
                       comment="The AggregationSetValue structure holds the values for one set of parameter values. If the definition sendUnchanged field is set to FALSE parameter values that are unchanged since the previous report are replaced by a NULL in this list. The parameter values must be held in the same order as that defined in the matching AggregationDefinitionDetails.">
          <mal:extends>
            <mal:type name="Composite" area="MAL"/>
          </mal:extends>
          <mal:field name="deltaTime"
                     comment="Optional delta time, from the timestamp of the aggregation for the first parameter set of the aggregation or the last value of the previous parameter set otherwise, for the first parameter sample of this set. If NULL, then the first sample time is the same as the aggregation timestamp for the first parameter set of the aggregation or the last value of the previous parameter set otherwise.">
            <mal:type name="Duration" area="MAL"/>
          </mal:field>
          <mal:field name="intervalTime"
                     comment="Optional delta time between samples in this set. If NULL, then all samples in this set are given the same time. This is usually driven by the sampleInterval in the aggregation set definition.">
            <mal:type name="Duration" area="MAL"/>
          </mal:field>
          <mal:field name="values" canBeNull="false"
                     comment="List containing values of the parameters which are part of the aggregation. The ordering of the list entries shall match that of the definition of the aggregation. If there are more values than contained in the definition then it is assumed that the parameters cycle as a complete parameter set.">
            <mal:type list="true" name="AggregationParameterValue" service="Aggregation" area="MC"/>
          </mal:field>
        </mal:composite>
        <mal:composite name="AggregationParameterValue" shortFormPart="5"
                       comment="The structure holds a single parameter value with its definition instance identifier.">
          <mal:extends>
            <mal:type name="Composite" area="MAL"/>
          </mal:extends>
          <mal:field name="value" canBeNull="false" comment="The parameter value.">
            <mal:type name="ParameterValue" service="Parameter" area="MC"/>
          </mal:field>
          <mal:field name="paramDefInstId"
                     comment="The object instance identifier of the ParameterDefinition. NULL if sendDefinitions in the AggregationDefinitionDetails is FALSE.">
            <mal:type name="Long" area="MAL"/>
          </mal:field>
        </mal:composite>
        <mal:composite name="ThresholdFilter" shortFormPart="6"
                       comment="The ThresholdFilter structure holds the filter for a parameter.">
          <mal:extends>
            <mal:type name="Composite" area="MAL"/>
          </mal:extends>
          <mal:field name="thresholdType" canBeNull="false"
                     comment="The type of filter to apply for filtered periodic reports when filters are applied.">
            <mal:type name="ThresholdType" service="Aggregation" area="MC"/>
          </mal:field>
          <mal:field name="thresholdValue" canBeNull="false" comment="Threshold value to apply.">
            <mal:type name="Attribute" area="MAL"/>
          </mal:field>
          <mal:field name="useConverted" canBeNull="false"
                     comment="If true, and the relevant Parameter has a conversion, then use the converted value for the threshold comparison, otherwise use the raw value.">
            <mal:type name="Boolean" area="MAL"/>
          </mal:field>
        </mal:composite>
        <mal:composite name="AggregationCreationRequest" shortFormPart="10"
                       comment="The AggregationCreationRequest contains all the fields required when creating a new aggregation in a provider.">
          <mal:field name="name" canBeNull="false"
                     comment="The name of the aggregation. Must not be empty or the wildcard value.">
            <mal:type name="Identifier" area="MAL"/>
          </mal:field>
          <mal:field name="aggDefDetails" canBeNull="false"
                     comment="The aggregation definition details.">
            <mal:type name="AggregationDefinitionDetails" service="Aggregation" area="MC"/>
          </mal:field>
        </mal:composite>
        <mal:composite name="AggregationValueDetails" shortFormPart="11"
                       comment="This structure holds a specific time stamped value of the aggregation. ">
          <mal:field name="aggId" canBeNull="false"
                     comment="The AggregationIdentity object instance identifier.">
            <mal:type name="Long" area="MAL"/>
          </mal:field>
          <mal:field name="defId" canBeNull="false"
                     comment="The AggregationDefinition object instance identifier.">
            <mal:type name="Long" area="MAL"/>
          </mal:field>
          <mal:field name="timestamp" canBeNull="false"
                     comment="The timestamp of the value. Use for the calculation of the individual parameter value timestamps.">
            <mal:type name="Time" area="MAL"/>
          </mal:field>
          <mal:field name="value" canBeNull="false" comment="The aggregation value.">
            <mal:type name="AggregationValue" service="Aggregation" area="MC"/>
          </mal:field>
        </mal:composite>
      </mal:dataTypes>
      <com:features>
        <mal:diagram name="AggregationObjects">
          <svg:svg width="550" height="380" version="1.1">
            <svg:rect x="20" y="160" fill="#FCF2E3" stroke="black" stroke-width="2" width="180"
                      height="60"/>
            <svg:text x="110" y="178" font-family="Verdana" font-size="12" fill="navy"
                      text-anchor="middle"
                      alignment-baseline="middle">COM OBJECT</svg:text>
            <svg:text x="110" y="200" font-family="Verdana" font-size="12" fill="navy"
                      text-anchor="middle"
                      alignment-baseline="middle">AggregationDefinition</svg:text>
            <svg:text x="110" y="212" font-family="Verdana" font-size="12" fill="navy"
                      text-anchor="middle"
                      alignment-baseline="middle">2</svg:text>
            <svg:text x="110" y="224" font-family="Verdana" font-size="12" fill="navy"
                      text-anchor="middle"
                      alignment-baseline="middle">AggregationDefinitionDetails</svg:text>
            <svg:rect x="340" y="160" fill="#FCF2E3" stroke="black" stroke-width="2" width="190"
                      height="80"/>
            <svg:text x="435" y="178" font-family="Verdana" font-size="12" fill="navy"
                      text-anchor="middle"
                      alignment-baseline="middle">COM_UNSPECIFIED</svg:text>
            <svg:text x="435" y="200" font-family="Verdana" font-size="12" fill="navy"
                      text-anchor="middle"
                      alignment-baseline="middle">COM::UNSPECIFIED_OBJECT</svg:text>
            <svg:text x="435" y="212" font-family="Verdana" font-size="12" fill="navy"
                      text-anchor="middle"
                      alignment-baseline="middle"/>
            <svg:text x="435" y="224" font-family="Verdana" font-size="12" fill="navy"
                      text-anchor="middle"
                      alignment-baseline="middle"/>
            <svg:rect x="20" y="300" fill="#FCF2E3" stroke="black" stroke-width="2" width="180"
                      height="60"/>
            <svg:text x="110" y="318" font-family="Verdana" font-size="12" fill="navy"
                      text-anchor="middle"
                      alignment-baseline="middle">COM OBJECT</svg:text>
            <svg:text x="110" y="340" font-family="Verdana" font-size="12" fill="navy"
                      text-anchor="middle"
                      alignment-baseline="middle">AggregationValueInstance</svg:text>
            <svg:text x="110" y="352" font-family="Verdana" font-size="12" fill="navy"
                      text-anchor="middle"
                      alignment-baseline="middle">3</svg:text>
            <svg:text x="110" y="364" font-family="Verdana" font-size="12" fill="navy"
                      text-anchor="middle"
                      alignment-baseline="middle">AggregationValue</svg:text>
            <svg:rect x="20" y="20" fill="#FCF2E3" stroke="black" stroke-width="2" width="180"
                      height="60"/>
            <svg:text x="110" y="38" font-family="Verdana" font-size="12" fill="navy"
                      text-anchor="middle"
                      alignment-baseline="middle">COM OBJECT</svg:text>
            <svg:text x="110" y="60" font-family="Verdana" font-size="12" fill="navy"
                      text-anchor="middle"
                      alignment-baseline="middle">AggregationIdentity</svg:text>
            <svg:text x="110" y="72" font-family="Verdana" font-size="12" fill="navy"
                      text-anchor="middle"
                      alignment-baseline="middle">1</svg:text>
            <svg:text x="110" y="84" font-family="Verdana" font-size="12" fill="navy"
                      text-anchor="middle"
                      alignment-baseline="middle">MAL::Identifier</svg:text>
          </svg:svg>
        </mal:diagram>
        <com:objects comment="Each aggregation of a provider shall be represented by an AggregationIdentity COM object.&#xA;The body of the AggregationIdentity COM object shall hold the name of the aggregation.&#xA;The definitions of the aggregations shall be represented as AggregationDefinition COM objects.&#xA;Aggregation value reports shall be represented as AggregationValueInstance COM objects.&#xA;The AggregationDefinition object shall use the related link to indicate which AggregationIdentity object it uses.&#xA;The AggregationValueInstance object shall use the related link to indicate which AggregationDefinition object it uses.&#xA;The source link of the AggregationIdentity object should be the object that caused it to be created, most likely a COM OperationActivity object or an operator login in the case of off-line editors being used.&#xA;The source link of the AggregationDefinition object should be the object that caused it to be created, most likely a COM OperationActivity object or an operator login in the case of off-line editors being used.&#xA;The source link of the AggregationValueInstance object should be the object that caused the report to be generated.&#xA;The source link of the AggregationValueInstance object shall be NULL for periodic reports.">
          <com:object name="AggregationIdentity" number="1">
            <com:objectType>
              <mal:type name="Identifier" area="MAL"/>
            </com:objectType>
            <com:sourceObject comment="The object that caused it to be created, most likely a COM OperationActivity object or an operator login in the case of off-line editors being used"/>
          </com:object>
          <com:object name="AggregationDefinition" number="2">
            <com:objectType>
              <mal:type name="AggregationDefinitionDetails" service="Aggregation" area="MC"/>
            </com:objectType>
            <com:relatedObject>
              <com:objectType number="1" service="Aggregation" area="MC"/>
            </com:relatedObject>
            <com:sourceObject comment="The object that caused it to be created, most likely a COM OperationActivity object or an operator login in the case of off-line editors being used"/>
          </com:object>
          <com:object name="AggregationValueInstance" number="3">
            <com:objectType>
              <mal:type name="AggregationValue" service="Aggregation" area="MC"/>
            </com:objectType>
            <com:relatedObject>
              <com:objectType number="2" service="Aggregation" area="MC"/>
            </com:relatedObject>
            <com:sourceObject comment="The object that caused the value to be generated or NULL for periodic reports"/>
          </com:object>
        </com:objects>
        <com:archiveUsage comment="AggregationIdentity and AggregationDefinition objects should be stored in the COM archive.&#xA;When an aggregation value report is published, the AggregationValueInstance object should be stored in the COM archive."/>
      </com:features>
    </mal:service>
    <mal:service xsi:type="com:ExtendedServiceType" name="Conversion" number="7"
                 comment="The conversion service provides a set of basic conversion definition types that allows the specification of a conversion between two representations. These conversions are used by the other MC services (such as Action, Alert, and Parameter) to define conversions from raw field representations to some engineering representation.&#xA;Conversions are associated with other entities such as parameters or action/alert arguments through the configuration of the relevant service (action/alert/parameter).&#xA;The conversion service does not provide any operations directly, but allows consumers to add, remove, and modify conversion definitions via the COM archive.">
      <mal:documentation name="High Level Requirements" order="1">The conversion service shall provide the capability for maintaining the list of conversion definitions.
</mal:documentation>
      <mal:documentation name="Functional Requirements" order="2">The conversion service shall use the COM archive operations for maintaining the conversion definitions.
Updating a conversion definition shall be performed by adding a new conversion definition and referencing it in the service specific COM objects (such as ParameterDefinition).
A Discrete conversion must contain at least one pair of values in the mapping.
A Line conversion must contain at least two line points.
A Polynomial conversion must contain at least one pair of values in the points list.
A Range conversion must contain at least one pair of values in the points list.
The service that references a conversion should ensure that the conversion referenced is correct.
</mal:documentation>
      <mal:dataTypes>
        <mal:composite name="DiscreteConversionDetails" shortFormPart="1"
                       comment="The DiscreteConversionDetails structure holds a bidirectional conversion between raw and converted values. The first element of the pair is the raw value and the second is the converted value. Both sets of values must be unique.">
          <mal:extends>
            <mal:type name="Composite" area="MAL"/>
          </mal:extends>
          <mal:field name="mapping" canBeNull="false"
                     comment="Defines a mapping between raw and converted values as a discrete set of points. The first entry in the pair is the raw value, and the second entry is the converted value.">
            <mal:type list="true" name="Pair" area="MAL"/>
          </mal:field>
        </mal:composite>
        <mal:composite name="LineConversionDetails" shortFormPart="2"
                       comment="The LineConversionDetails structure is a bi-directional conversion between raw and converted values. It is defined by a series of points between which values are to be interpolated. The extrapolate attribute indicates if values can also be linearly extrapolated beyond the initial and final points.">
          <mal:extends>
            <mal:type name="Composite" area="MAL"/>
          </mal:extends>
          <mal:field name="extrapolate" canBeNull="false"
                     comment="Indicates whether or not values can be extrapolated beyond the start and the end of the points.">
            <mal:type name="Boolean" area="MAL"/>
          </mal:field>
          <mal:field name="points" canBeNull="false"
                     comment="Defines the bi-directional conversion. The first attribute of the point is a raw value, and the second attribute is the converted value.">
            <mal:type list="true" name="Pair" area="MAL"/>
          </mal:field>
        </mal:composite>
        <mal:composite name="PolyConversionDetails" shortFormPart="3"
                       comment="The PolyConversionDetails structure holds only forward (raw to converted) polynomial conversions. They are defined by a series of points for the polynomial coefficients.">
          <mal:extends>
            <mal:type name="Composite" area="MAL"/>
          </mal:extends>
          <mal:field name="points" canBeNull="false"
                     comment="The first attribute of a point is a MAL::Integer, being the degree of the polynomial; the second attribute is either a MAL::Float or a MAL::Double, being the coefficient of the term.">
            <mal:type list="true" name="Pair" area="MAL"/>
          </mal:field>
        </mal:composite>
        <mal:composite name="RangeConversionDetails" shortFormPart="4"
                       comment="The RangeConversionDetails structure holds a range for a one-way conversion to convert between a continuous range to a discrete value. A range is defined as from this point up to, but not including, the next point.">
          <mal:extends>
            <mal:type name="Composite" area="MAL"/>
          </mal:extends>
          <mal:field name="points" canBeNull="false"
                     comment="The first attribute in each pair is the raw range, and the second attribute is the converted value.">
            <mal:type list="true" name="Pair" area="MAL"/>
          </mal:field>
        </mal:composite>
      </mal:dataTypes>
      <com:features>
        <mal:diagram name="ConversionObjects">
          <svg:svg width="850" height="370" version="1.1">
            <svg:rect x="650" y="150" fill="#FCF2E3" stroke="black" stroke-width="2" width="180"
                      height="60"/>
            <svg:text x="740" y="168" font-family="Verdana" font-size="12" fill="navy"
                      text-anchor="middle"
                      alignment-baseline="middle">COM OBJECT</svg:text>
            <svg:text x="740" y="190" font-family="Verdana" font-size="12" fill="navy"
                      text-anchor="middle"
                      alignment-baseline="middle">ConversionIdentity</svg:text>
            <svg:text x="740" y="202" font-family="Verdana" font-size="12" fill="navy"
                      text-anchor="middle"
                      alignment-baseline="middle">1</svg:text>
            <svg:text x="740" y="214" font-family="Verdana" font-size="12" fill="navy"
                      text-anchor="middle"
                      alignment-baseline="middle">MAL::Identifier</svg:text>
            <svg:rect x="20" y="150" fill="#FCF2E3" stroke="black" stroke-width="2" width="180"
                      height="60"/>
            <svg:text x="110" y="168" font-family="Verdana" font-size="12" fill="navy"
                      text-anchor="middle"
                      alignment-baseline="middle">COM_UNSPECIFIED</svg:text>
            <svg:text x="110" y="190" font-family="Verdana" font-size="12" fill="navy"
                      text-anchor="middle"
                      alignment-baseline="middle">COM::UNSPECIFIED_OBJECT</svg:text>
            <svg:text x="110" y="202" font-family="Verdana" font-size="12" fill="navy"
                      text-anchor="middle"
                      alignment-baseline="middle"/>
            <svg:text x="110" y="214" font-family="Verdana" font-size="12" fill="navy"
                      text-anchor="middle"
                      alignment-baseline="middle"/>
            <svg:rect x="350" y="290" fill="#FCF2E3" stroke="black" stroke-width="2" width="180"
                      height="60"/>
            <svg:text x="440" y="308" font-family="Verdana" font-size="12" fill="navy"
                      text-anchor="middle"
                      alignment-baseline="middle">COM OBJECT</svg:text>
            <svg:text x="440" y="330" font-family="Verdana" font-size="12" fill="navy"
                      text-anchor="middle"
                      alignment-baseline="middle">RangeConversion</svg:text>
            <svg:text x="440" y="342" font-family="Verdana" font-size="12" fill="navy"
                      text-anchor="middle"
                      alignment-baseline="middle">5</svg:text>
            <svg:text x="440" y="354" font-family="Verdana" font-size="12" fill="navy"
                      text-anchor="middle"
                      alignment-baseline="middle">RangeConversionDetails</svg:text>
            <svg:rect x="350" y="200" fill="#FCF2E3" stroke="black" stroke-width="2" width="180"
                      height="60"/>
            <svg:text x="440" y="218" font-family="Verdana" font-size="12" fill="navy"
                      text-anchor="middle"
                      alignment-baseline="middle">COM OBJECT</svg:text>
            <svg:text x="440" y="240" font-family="Verdana" font-size="12" fill="navy"
                      text-anchor="middle"
                      alignment-baseline="middle">PolyConversion</svg:text>
            <svg:text x="440" y="252" font-family="Verdana" font-size="12" fill="navy"
                      text-anchor="middle"
                      alignment-baseline="middle">4</svg:text>
            <svg:text x="440" y="264" font-family="Verdana" font-size="12" fill="navy"
                      text-anchor="middle"
                      alignment-baseline="middle">PolyConversionDetails</svg:text>
            <svg:rect x="350" y="110" fill="#FCF2E3" stroke="black" stroke-width="2" width="180"
                      height="60"/>
            <svg:text x="440" y="128" font-family="Verdana" font-size="12" fill="navy"
                      text-anchor="middle"
                      alignment-baseline="middle">COM OBJECT</svg:text>
            <svg:text x="440" y="150" font-family="Verdana" font-size="12" fill="navy"
                      text-anchor="middle"
                      alignment-baseline="middle">LineConversion</svg:text>
            <svg:text x="440" y="162" font-family="Verdana" font-size="12" fill="navy"
                      text-anchor="middle"
                      alignment-baseline="middle">3</svg:text>
            <svg:text x="440" y="174" font-family="Verdana" font-size="12" fill="navy"
                      text-anchor="middle"
                      alignment-baseline="middle">LineConversionDetails</svg:text>
            <svg:rect x="350" y="20" fill="#FCF2E3" stroke="black" stroke-width="2" width="180"
                      height="60"/>
            <svg:text x="440" y="38" font-family="Verdana" font-size="12" fill="navy"
                      text-anchor="middle"
                      alignment-baseline="middle">COM OBJECT</svg:text>
            <svg:text x="440" y="60" font-family="Verdana" font-size="12" fill="navy"
                      text-anchor="middle"
                      alignment-baseline="middle">DiscreteConversion</svg:text>
            <svg:text x="440" y="72" font-family="Verdana" font-size="12" fill="navy"
                      text-anchor="middle"
                      alignment-baseline="middle">2</svg:text>
            <svg:text x="440" y="84" font-family="Verdana" font-size="12" fill="navy"
                      text-anchor="middle"
                      alignment-baseline="middle">DiscreteConversionDetails</svg:text>
          </svg:svg>
        </mal:diagram>
        <com:objects comment="Each conversion shall be represented by a ConversionIdentity COM object.&#xA;The body of the ConversionIdentity COM object shall hold the name of the conversion.&#xA;The definitions of the conversions shall be represented as either DiscreteConversion, LineConversion, PolyConversion, or RangeConversion COM objects.&#xA;The conversion definition object shall use the related link to indicate which ConversionIdentity object it uses.&#xA;The source link of the ConversionIdentity object should be the object that caused it to be created, most likely a COM OperationActivity object or an operator login in the case of off-line editors being used.&#xA;The source link of the conversion definition object should be the object that caused it to be created, most likely a COM OperationActivity object or an operator login in the case of off-line editors being used.&#xA;Other service objects shall reference instances of a conversion using the object instance identifier of the conversion definition.">
          <com:object name="ConversionIdentity" number="1">
            <com:objectType>
              <mal:type name="Identifier" area="MAL"/>
            </com:objectType>
            <com:sourceObject comment="The object that caused it to be created, most likely a COM OperationActivity object or an operator login in the case of off-line editors being used."/>
          </com:object>
          <com:object name="DiscreteConversion" number="2">
            <com:objectType>
              <mal:type name="DiscreteConversionDetails" service="Conversion" area="MC"/>
            </com:objectType>
            <com:relatedObject>
              <com:objectType number="1" service="Conversion" area="MC"/>
            </com:relatedObject>
            <com:sourceObject comment="The object that caused it to be created, most likely a COM OperationActivity object or an operator login in the case of off-line editors being used."/>
          </com:object>
          <com:object name="LineConversion" number="3">
            <com:objectType>
              <mal:type name="LineConversionDetails" service="Conversion" area="MC"/>
            </com:objectType>
            <com:relatedObject>
              <com:objectType number="1" service="Conversion" area="MC"/>
            </com:relatedObject>
            <com:sourceObject comment="The object that caused it to be created, most likely a COM OperationActivity object or an operator login in the case of off-line editors being used."/>
          </com:object>
          <com:object name="PolyConversion" number="4">
            <com:objectType>
              <mal:type name="PolyConversionDetails" service="Conversion" area="MC"/>
            </com:objectType>
            <com:relatedObject>
              <com:objectType number="1" service="Conversion" area="MC"/>
            </com:relatedObject>
            <com:sourceObject comment="The object that caused it to be created, most likely a COM OperationActivity object or an operator login in the case of off-line editors being used."/>
          </com:object>
          <com:object name="RangeConversion" number="5">
            <com:objectType>
              <mal:type name="RangeConversionDetails" service="Conversion" area="MC"/>
            </com:objectType>
            <com:relatedObject>
              <com:objectType number="1" service="Conversion" area="MC"/>
            </com:relatedObject>
            <com:sourceObject comment="The object that caused it to be created, most likely a COM OperationActivity object or an operator login in the case of off-line editors being used."/>
          </com:object>
        </com:objects>
        <com:archiveUsage comment="ConversionIdentity and conversion definition objects should be stored in the COM archive.&#xA;Each instance of a conversion definition shall be represented by an object instance held in the COM archive.&#xA;The COM archive service operations shall be used to add, update and remove conversions.&#xA;Other services should monitor the archive service for changes to conversions they reference."/>
      </com:features>
    </mal:service>
    <mal:service xsi:type="com:ExtendedServiceType" name="Group" number="8"
                 comment="The group service provides a mechanism for other services to reference sets of their own objects using a single group reference. These groups are used by the other MC services (such as Action, Alert, Check, Aggregation and Parameter) to reduce the complexity of operations by allowing consumers to reference groups of objects (such as parameters) in operations rather than having to supply large lists of object references.&#xA;Where operations of other service mention the use of groups in their operations, any reference to a group object instance identifier implicitly means a GroupIdentity object.&#xA;Groups of other groups is supported, however all objects within the group of groups should have the same object type as most operations expect a single type.&#xA;The creation of cyclic group of groups should also be avoided.&#xA;The group service does not provide any operations directly, but allows consumers to add, remove, and modify groups via the COM archive.">
      <mal:documentation name="High Level Requirements" order="1">The group service shall provide the capability for maintaining the list of groups.
</mal:documentation>
      <mal:documentation name="Functional Requirements" order="2">The group service shall use the COM archive operations for maintaining the group definitions.
Updating a group definition shall be performed by adding a new group definition and referencing it in the service specific COM objects.
</mal:documentation>
      <mal:dataTypes>
        <mal:composite name="GroupDetails" shortFormPart="1"
                       comment="The GroupDetails structure holds the object type, domain, and set of object instance identifiers for a set of objects from another service.">
          <mal:extends>
            <mal:type name="Composite" area="MAL"/>
          </mal:extends>
          <mal:field name="description" canBeNull="false" comment="Description of the group.">
            <mal:type name="String" area="MAL"/>
          </mal:field>
          <mal:field name="objectType" canBeNull="false"
                     comment="The object type of the objects referenced by this group.">
            <mal:type name="ObjectType" area="COM"/>
          </mal:field>
          <mal:field name="domain" canBeNull="false"
                     comment="The domain of the objects being referenced by this group.">
            <mal:type list="true" name="Identifier" area="MAL"/>
          </mal:field>
          <mal:field name="instanceIds" canBeNull="false"
                     comment="The list of object instance identifiers of the objects being referenced by this group.">
            <mal:type list="true" name="Long" area="MAL"/>
          </mal:field>
        </mal:composite>
      </mal:dataTypes>
      <com:features>
        <mal:diagram name="GroupObjects">
          <svg:svg width="510" height="270" version="1.1">
            <svg:rect x="20" y="190" fill="#FCF2E3" stroke="black" stroke-width="2" width="180"
                      height="60"/>
            <svg:text x="110" y="208" font-family="Verdana" font-size="12" fill="navy"
                      text-anchor="middle"
                      alignment-baseline="middle">COM OBJECT</svg:text>
            <svg:text x="110" y="230" font-family="Verdana" font-size="12" fill="navy"
                      text-anchor="middle"
                      alignment-baseline="middle">GroupDefinition</svg:text>
            <svg:text x="110" y="242" font-family="Verdana" font-size="12" fill="navy"
                      text-anchor="middle"
                      alignment-baseline="middle">2</svg:text>
            <svg:text x="110" y="254" font-family="Verdana" font-size="12" fill="navy"
                      text-anchor="middle"
                      alignment-baseline="middle">GroupDetails</svg:text>
            <svg:rect x="310" y="20" fill="#FCF2E3" stroke="black" stroke-width="2" width="180"
                      height="60"/>
            <svg:text x="400" y="38" font-family="Verdana" font-size="12" fill="navy"
                      text-anchor="middle"
                      alignment-baseline="middle">COM_UNSPECIFIED</svg:text>
            <svg:text x="400" y="60" font-family="Verdana" font-size="12" fill="navy"
                      text-anchor="middle"
                      alignment-baseline="middle">COM::UNSPECIFIED_OBJECT</svg:text>
            <svg:text x="400" y="72" font-family="Verdana" font-size="12" fill="navy"
                      text-anchor="middle"
                      alignment-baseline="middle"/>
            <svg:text x="400" y="84" font-family="Verdana" font-size="12" fill="navy"
                      text-anchor="middle"
                      alignment-baseline="middle"/>
            <svg:rect x="20" y="20" fill="#FCF2E3" stroke="black" stroke-width="2" width="180"
                      height="60"/>
            <svg:text x="110" y="38" font-family="Verdana" font-size="12" fill="navy"
                      text-anchor="middle"
                      alignment-baseline="middle">COM OBJECT</svg:text>
            <svg:text x="110" y="60" font-family="Verdana" font-size="12" fill="navy"
                      text-anchor="middle"
                      alignment-baseline="middle">GroupIdentity</svg:text>
            <svg:text x="110" y="72" font-family="Verdana" font-size="12" fill="navy"
                      text-anchor="middle"
                      alignment-baseline="middle">1</svg:text>
            <svg:text x="110" y="84" font-family="Verdana" font-size="12" fill="navy"
                      text-anchor="middle"
                      alignment-baseline="middle">MAL::Identifier</svg:text>
          </svg:svg>
        </mal:diagram>
        <com:objects comment="Each group shall be represented by a GroupIdentity COM object.&#xA;The body of the GroupIdentity COM object shall hold the name of the group.&#xA;The definitions of the groups shall be represented as GroupDefinition COM objects.&#xA;The GroupDefinition object shall use the related link to indicate which GroupIdentity object it uses.&#xA;The source link of the GroupIdentity object should be the object that caused it to be created, most likely a COM OperationActivity object or an operator login in the case of off-line editors being used.&#xA;The source link of the GroupDefinition object should be the object that caused it to be created, most likely a COM OperationActivity object or an operator login in the case of off-line editors being used.&#xA;Groups of groups shall reference instances of a group using the object instance identifier of the GroupIdentity.&#xA;Other service objects shall reference instances of a group using the object instance identifier of the GroupIdentity.">
          <com:object name="GroupIdentity" number="1">
            <com:objectType>
              <mal:type name="Identifier" area="MAL"/>
            </com:objectType>
            <com:sourceObject comment="The object that caused it to be created, most likely a COM OperationActivity object or an operator login in the case of off-line editors being used."/>
          </com:object>
          <com:object name="GroupDefinition" number="2">
            <com:objectType>
              <mal:type name="GroupDetails" service="Group" area="MC"/>
            </com:objectType>
            <com:relatedObject>
              <com:objectType number="1" service="Group" area="MC"/>
            </com:relatedObject>
            <com:sourceObject comment="The object that caused it to be created, most likely a COM OperationActivity object or an operator login in the case of off-line editors being used."/>
          </com:object>
        </com:objects>
        <com:archiveUsage comment="GroupIdentity and GroupDefinition objects should be stored in the COM archive.&#xA;The COM archive service operations shall be used to add, update and remove groups.&#xA;Other services should monitor the archive service for changes to groups they reference."/>
      </com:features>
    </mal:service>
    <mal:dataTypes>
      <mal:enumeration name="Severity" shortFormPart="6"
                       comment="The severity enumeration holds the possible values for a severity. The numerical value represents the increasing severity, therefore CRITICAL is more severe than ALARM. Normally, for checks, only the Warning and Critical ranges are used: the colour yellow is associated with Warning, and the colour red is associated with Critical.">
        <mal:item value="INFORMATIONAL" nvalue="1"
                  comment="Indicates a nominal situation with no consequences."/>
        <mal:item value="WARNING" nvalue="2"
                  comment="Indicates unexpected behaviour without directly threatening consequences."/>
        <mal:item value="ALARM" nvalue="3"
                  comment="Indicates behaviour of serious concern requiring the attention of an operator, but not necessarily a malfunction."/>
        <mal:item value="SEVERE" nvalue="4"
                  comment="Indicates that the monitored item has malfunctioned. Requires operator attention."/>
        <mal:item value="CRITICAL" nvalue="5"
                  comment="Indicates behaviour with mission threatening consequences. Requires operator attention."/>
      </mal:enumeration>
      <mal:composite name="ArgumentDefinitionDetails" shortFormPart="1"
                     comment="The ArgumentDefinitionDetails structure holds the details of an argument definition with a set of associated attributes, such as conversion used. The conditionalConversions define the conditions where a referenced conversion is applied. Only the first TRUE conversion should be applied.">
        <mal:extends>
          <mal:type name="Composite" area="MAL"/>
        </mal:extends>
        <mal:field name="argId" canBeNull="false"
                   comment="Holds the argument definition identifier.">
          <mal:type name="Identifier" area="MAL"/>
        </mal:field>
        <mal:field name="description" comment="Optional argument description.">
          <mal:type name="String" area="MAL"/>
        </mal:field>
        <mal:field name="rawType" canBeNull="false"
                   comment="Holds the attribute short form part of the raw type of the argument, e.g., for a MAL::String argument it shall hold 15.">
          <mal:type name="Octet" area="MAL"/>
        </mal:field>
        <mal:field name="rawUnit" comment="The unit for the raw value.">
          <mal:type name="String" area="MAL"/>
        </mal:field>
        <mal:field name="conditionalConversions"
                   comment="The conditional conversions to apply to the argument. Only the first TRUE conversion should be applied.">
          <mal:type list="true" name="ConditionalConversion" area="MC"/>
        </mal:field>
        <mal:field name="convertedType"
                   comment="Holds the attribute short form part of the converted type of the argument, e.g., for a MAL::String argument it shall hold 15. Must not be NULL if a conversion condition is supplied.">
          <mal:type name="Octet" area="MAL"/>
        </mal:field>
        <mal:field name="convertedUnit" comment="The converted argument units.">
          <mal:type name="String" area="MAL"/>
        </mal:field>
      </mal:composite>
      <mal:composite name="AttributeValue" shortFormPart="2"
                     comment="The AttributeValue structure holds an Attribute value. It allows a list of different Attribute types to be created whereas List of Attribute would require the values to be all of the same type.">
        <mal:extends>
          <mal:type name="Composite" area="MAL"/>
        </mal:extends>
        <mal:field name="value" canBeNull="false"
                   comment="The argument value. Must not be NULL. NULL may be represented by having a NULL in place of the complete AttributeValue composite.">
          <mal:type name="Attribute" area="MAL"/>
        </mal:field>
      </mal:composite>
      <mal:composite name="ConditionalConversion" shortFormPart="3"
                     comment="The ConditionalConversion structure holds a condition expression to be evaluated to determine if a specific Conversion should be used. In the case that no test is required, i.e., the conversion should always be used, then the condition field should be set to NULL.">
        <mal:extends>
          <mal:type name="Composite" area="MAL"/>
        </mal:extends>
        <mal:field name="condition"
                   comment="The expression indicates which entities are applicable for this check. If NULL, then the condition shall evaluate to TRUE.">
          <mal:type name="ParameterExpression" area="MC"/>
        </mal:field>
        <mal:field name="conversionId" canBeNull="false"
                   comment="The object instance identifier of the ConversionIdentity object to be used if the condition evaluates to TRUE or is NULL.">
          <mal:type name="ObjectKey" area="COM"/>
        </mal:field>
      </mal:composite>
      <mal:composite name="ParameterExpression" shortFormPart="4"
                     comment="The ParameterExpression structure represents a simple expression between a parameter and a value for that parameter.">
        <mal:extends>
          <mal:type name="Composite" area="MAL"/>
        </mal:extends>
        <mal:field name="parameterId" canBeNull="false"
                   comment="Holds the object instance identifier of the ParameterIdentity object to be used in the expression.">
          <mal:type name="ObjectKey" area="COM"/>
        </mal:field>
        <mal:field name="operator" canBeNull="false" comment="The expression operator.">
          <mal:type name="ExpressionOperator" service="Archive" area="COM"/>
        </mal:field>
        <mal:field name="useConverted" canBeNull="false"
                   comment="If set to TRUE the converted value field of the parameter value should be used, otherwise the raw value field should be used.">
          <mal:type name="Boolean" area="MAL"/>
        </mal:field>
        <mal:field name="value" comment="The value to be used in the expression.">
          <mal:type name="Attribute" area="MAL"/>
        </mal:field>
      </mal:composite>
      <mal:composite name="ObjectInstancePair" shortFormPart="7"
                     comment="The ObjectInstancePair structure is used to hold the object instance identifier of an Identity object with its associated Definition object.">
        <mal:extends>
          <mal:type name="Composite" area="MAL"/>
        </mal:extends>
        <mal:field name="objIdentityInstanceId" canBeNull="false"
                   comment="The object instance identifier of the Identity object.">
          <mal:type name="Long" area="MAL"/>
        </mal:field>
        <mal:field name="objDefInstanceId" canBeNull="false"
                   comment="The object instance identifier of the Definition object.">
          <mal:type name="Long" area="MAL"/>
        </mal:field>
      </mal:composite>
    </mal:dataTypes>
    <mal:errors>
      <mal:error name="READONLY" number="70020" comment="Operation specific"/>
      <mal:error name="REFERENCED" number="70021" comment="Operation specific"/>
    </mal:errors>
  </mal:area>
</mal:specification>




© 2015 - 2024 Weber Informatics LLC | Privacy Policy