// =================================================================== // Title: Device SCC Storage Extent Model 2.7 // Filename: Device27_SCCExtents.mof // Version: 2.7.0 // Release: Final // Date: 03/31/03 // =================================================================== // Copyright 1999-2003 Distributed Management Task Force, Inc. (DMTF). // All rights reserved. // DMTF is a not-for-profit association of industry members dedicated // to promoting enterprise and systems management and interoperability. // DMTF specifications and documents may be reproduced for uses // consistent with this purpose by members and non-members, // provided that correct attribution is given. // As DMTF specifications may be revised from time to time, // the particular version and release date should always be noted. // // Implementation of certain elements of this standard or proposed // standard may be subject to third party patent rights, including // provisional patent rights (herein "patent rights"). DMTF makes // no representations to users of the standard as to the existence // of such rights, and is not responsible to recognize, disclose, or // identify any or all such third party patent right, owners or // claimants, nor for any incomplete or inaccurate identification or // disclosure of such rights, owners or claimants. DMTF shall have no // liability to any party, in any manner or circumstance, under any // legal theory whatsoever, for failure to recognize, disclose, or // identify any such third party patent rights, or for such party's // reliance on the standard or incorporation thereof in its product, // protocols or testing procedures. DMTF shall have no liability to // any party implementing such standard, whether such implementation // is foreseeable or not, nor to any patent owner or claimant, and shall // have no liability or responsibility for costs or losses incurred if // a standard is withdrawn or modified after publication, and shall be // indemnified and held harmless by any party implementing the // standard from any and all claims of infringement by a patent owner // for such implementations. // // For information about patents held by third-parties which have // notified the DMTF that, in their opinion, such patent may relate to // or impact implementations of DMTF standards, visit // http://www.dmtf.org/about/policies/disclosures.php. // =================================================================== // Description: The Device Model extends the management concepts that // are related to LogicalDevices. This file describes // the modeling of SCC (SCSI Controller Commands) using // StorageExtents. // // The object classes below are listed in an order that // avoids forward references. Required objects, defined // by other working groups, are omitted. // ================================================================== // Change Log for v2.7 // CR722 - Deprecate PSExtentBaseOnPExtent, VolumeSetBasedOnPSExtent, // LogicalDiskBasedOnVolumeSet, AggregatePSExtent, // AggregatePSExtentBasedOnPExtent, // AggregatePSExtentBasedOnAggregatePExtent, // PExtentRedundancyComponent, AggregateRedundancyComponent, // PhysicalExtent, ProtectedSpaceExtent, VolumeSet, // AggregatePExtent, and AggregatePSExtent // CR846 - Deprecate RealizesPExtent and RealizesAggregatePExtent // CR861 - Add Deprecated qualifier to the individual properties of // the Deprecated SCC classes // CR882 - Deprecate Snapshot and SnapshotOfExtent. Therefore moved // definitions from StorageExtents.mof to here. // ================================================================== #pragma locale ("en_US") // =================================================================== // PhysicalExtent // =================================================================== [Deprecated {"CIMProtectedExtentBasedOn", "CIM_CompositeExtentBasedOn"}, Version ("2.7.0"), Description ( "Deprecated - use CIM_ProtectedExtentBasedOn or " "CIM_CompositeExtentBasedOn instead. The information on " "check and user data is better expressed in the association " "that layers the storage, than in the extent itself. " "A PhysicalExtent is used to model an SCC RAID " "implementation. It defines the consecutive addressable " "block addresses on a single storage device, that are " "treated as a single StorageExtent and that are in the " "same StorageRedundancyGroup. An alternate possibility, " "if automatic configuration is used, is to instantiate or " "extend the AggregatePExtent class.") ] class CIM_PhysicalExtent : CIM_StorageExtent { [Override ("BlockSize"), Deprecated {"CIM_CompositeExtentBasedOn.BlockSize", "CIM_ProtectedExtentBasedOn.BlockSize"}, MappingStrings {"MIF.DMTF|Physical Extent|001.4"} ] uint64 BlockSize; [Override ("NumberOfBlocks"), Deprecated {"CIM_CompositeExtentBasedOn.NumberOfBlocks", "CIM_ProtectedExtentBasedOn.NumberOfBlocks"}, MappingStrings {"MIF.DMTF|Physical Extent|001.3"} ] uint64 NumberOfBlocks; [Deprecated { "CIM_CompositeExtentBasedOn.UnitsBeforeCheckDataInterleave", "CIM_ProtectedExtentBasedOn.UnitsBeforeCheckDataInterleave"}, Description ( "Number of bytes of user data to skip before " "starting the check data interleave."), Units ("Bytes"), MappingStrings {"MIF.DMTF|Physical Extent|001.6"} ] uint64 UnitsBeforeCheckDataInterleave; [Deprecated {"CIM_CompositeExtentBasedOn.UnitsOfCheckData", "CIM_ProtectedExtentBasedOn.UnitsOfCheckData"}, Description ( "Number of bytes to be reserved for check data."), Units ("Bytes"), MappingStrings {"MIF.DMTF|Physical Extent|001.7"} ] uint64 UnitsOfCheckData; [Deprecated {"CIM_CompositeExtentBasedOn.UnitsOfUserData", "CIM_ProtectedExtentBasedOn.UnitsOfUserData"}, Description ( "Number of bytes to be reserved for user data."), Units ("Bytes"), MappingStrings {"MIF.DMTF|Physical Extent|001.8"} ] uint64 UnitsOfUserData; }; // =================================================================== // ProtectedSpaceExtent // =================================================================== [Deprecated {"CIM_ProtectedExtentBasedOn","CIM_CompositeExtentBasedOn"}, Version ("2.7.0"), Description ( "Deprecated - use CIM_ProtectedExtentBasedOn or " "CIM_CompositeExtentBasedOn instead. The information on " "check and user data is better expressed in the association " "that layers the storage, than in the extent itself. " "A ProtectedSpaceExtent is used to model an SCC RAID " "implementation. ProtectedSpaceExtent defines addressable " "logical block addresses, treated as a single Extent, located " "on one or more PhysicalExtents. ProtectedSpaceExtents exclude " "any logical blocks mapped as check data and contain user data " "stripe depth mapping information. An alternate possibility, " "if automatic configuration is used, is to instantiate or " "extend the AggregatePSExtent class.") ] class CIM_ProtectedSpaceExtent : CIM_StorageExtent { [Override ("BlockSize"), Deprecated {"CIM_CompositeExtentBasedOn.BlockSize", "CIM_ProtectedExtentBasedOn.BlockSize"}, MappingStrings {"MIF.DMTF|Protected Space Extent|001.4"} ] uint64 BlockSize; [Override ("NumberOfBlocks"), Deprecated {"CIM_CompositeExtentBasedOn.NumberOfBlocks", "CIM_ProtectedExtentBasedOn.NumberOfBlocks"}, Description ( "The number of user data blocks contained in this Extent."), MappingStrings {"MIF.DMTF|Protected Space Extent|001.3"} ] uint64 NumberOfBlocks; [Deprecated {"CIM_CompositeExtentBasedOn.UserDataStripeDepth"}, Description ( "For a ProtectedSpaceExtent that is allocated to a Volume" "Set (i.e. is named in a CIM_VolumeSetBasedOnPSExtent " "association), this property is the number of user data " "bytes placed on this ProtectedSpaceExtent before moving " "on to the next ProtectedSpaceExtent in the VolumeSet. " "Otherwise, this ProtectedSpaceExtent is considered to " "be unallocated, and this property shall be set to " "zero (0h.)"), Units ("Bytes"), MappingStrings {"MIF.DMTF|Protected Space Extent|001.6"} ] uint64 UserDataStripeDepth; }; // =================================================================== // PSExtentBasedOnPExtent // =================================================================== [Association, Version ("2.7.0"), Deprecated { "CIM_ProtectedExtentBasedOn", "CIM_CompositeExtentBasedOn"}, Description ( "Covered by ProtectedExtentBasedOn or CompositeExtentBasedOn, " "since PhysicalExtent itself is deprecated in lieu of these " "associations. ProtectedSpaceExtents are BasedOn a " "PhysicalExtent. This relationship is made explicit by this " "association.") ] class CIM_PSExtentBasedOnPExtent : CIM_BasedOn { [Override ("Antecedent"), Deprecated {"CIM_CompositeExtentBasedOn.Antecedent", "CIM_ProtectedExtentBasedOn.Antecedent"}, Description ( "The PhysicalExtent.") ] CIM_PhysicalExtent REF Antecedent; [Override ("Dependent"), Deprecated {"CIM_CompositeExtentBasedOn.Dependent", "CIM_ProtectedExtentBasedOn.Dependent"}, Description ( "The ProtectedSpaceExtent which is built on the Physical" "Extent.") ] CIM_ProtectedSpaceExtent REF Dependent; [Override ("StartingAddress"), Deprecated {"CIM_CompositeExtentBasedOn.StartingAddress", "CIM_ProtectedExtentBasedOn.StartingAddress"}, Description ( "The starting logical block address of the PhysicalExtent " "from which this ProtectedSpaceExtent is derived."), MappingStrings {"MIF.DMTF|Protected Space Extent|001.2"} ] uint64 StartingAddress; }; // =================================================================== // VolumeSet // =================================================================== [Deprecated {"CIM_CompositeExtent"}, Version ("2.7.0"), Description ( "VolumeSet is deprecated in lieu of CompositeExtent, which " "removes the restriction that the Set must be exported. " "A VolumeSet can be used to model an SCC RAID implementation. " "VolumeSets represent a contiguous range of logical blocks " "presented to the operating environment. VolumeSets may overlap. " "However, the underlying PhysicalExtents within the overlap " "shall not contain any check data. They are BasedOn one or more " "ProtectedSpaceExtents. These BasedOn associations should be " "instantiated or subclassed as needed.") ] class CIM_VolumeSet : CIM_StorageVolume { [Override ("NumberOfBlocks"), Deprecated {"CIM_CompositeExtent.NumberOfBlocks"}, MappingStrings {"MIF.DMTF|Volume Set|001.3"} ] uint64 NumberOfBlocks; [Deprecated {"CIM_CompositeExtent.ExtentStripeLength"}, Description ( "Number of contiguous ProtectedSpaceExtents counted " "before looping back to the first ProtectedSpaceExtent " "of the current stripe. It is the number of Extents " "forming the user data stripe."), MappingStrings {"MIF.DMTF|Volume Set|001.4"} ] uint64 PSExtentStripeLength; [Deprecated {"CIM_CompositeExtent.ExtentInterleaveDepth"}, Description ( "Number of ProtectedSpaceExtents to stripe as a collective " "set. In SCC, this value is defined as the number of " "stripes to count before continuing to map into the next " "contiguous set of Extents, beyond the current stripe."), MappingStrings {"MIF.DMTF|Volume Set|001.5"} ] uint64 PSExtentInterleaveDepth; [Deprecated {"No value"}, Description ( "VolumeSets in SCC have additional status information " "beyond that captured in the Availability and other " "properties, inherited from ManagedSystemElement. This " "additional information (for example, \"Protection Disabled\", " "value=9) is captured in the VolumeStatus property."), ValueMap {"0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14"}, Values {"Other", "Unknown", "None/Not Applicable", "Broken", "Data Lost", "Dynamic Reconfig", "Exposed", "Fractionally Exposed", "Partially Exposed", "Protection Disabled", // 10 "Readying", "Rebuild", "Recalculate", "Spare in Use", "Verify In Progress"} ] uint16 VolumeStatus; }; // =================================================================== // VolumeSetBasedOnPSExtent // =================================================================== [Association, Version ("2.7.0"), Deprecated {"CIM_CompositeExtentBasedOn"}, Description ( "This association is deprecated in lieu of " "CompositeExtentBasedOn, since VolumeSets and " "ProtectedSpaceExtents are themselves deprecated. " "The relationship describes that VolumeSets are BasedOn " "on one or more ProtectedSpaceExtents.") ] class CIM_VolumeSetBasedOnPSExtent : CIM_BasedOn { [Override ("Antecedent"), Min (1), Deprecated {"CIM_CompositeExtentBasedOn.Antecedent"}, Description ("The ProtectedSpaceExtent.") ] CIM_ProtectedSpaceExtent REF Antecedent; [Override ("Dependent"), Deprecated {"CIM_CompositeExtentBasedOn.Dependent"}, Description ( "The VolumeSet which is built on the ProtectedSpace" "Extent.") ] CIM_VolumeSet REF Dependent; [Deprecated {"CIM_CompositeExtentBasedOn.LBAsMappedByDecrementing"}, Description ( "True if logical blocks in the ProtectedSpaceExtent are " "mapped in decrementing order. This property corresponds " "to the INCDEC value in the SCC-2 Volume Set PS_Extent " "Descriptor.") ] boolean LBAsMappedByDecrementing; [Deprecated { "CIM_CompositeExtentBasedOn.LBAMappingIncludesCheckData"}, Description ( "True if the logical block mapping algorithm includes check " "data bytes. This property corresponds to the NOCHKSKIP " "attribute in the SCC-2 Volume Set PS_Extent Descriptor.") ] boolean LBAMappingIncludesCheckData; }; // =================================================================== // LogicalDiskBasedOnVolumeSet // =================================================================== [Association, Version ("2.7.0"), Deprecated {"CIM_BasedOn"}, Description ( "This association describes that LogicalDisks can be BasedOn " "a VolumeSet. However, there is no need for the specificity " "of this association. It is deprecated in lieu of the generic " "BasedOn relationship.") ] class CIM_LogicalDiskBasedOnVolumeSet : CIM_LogicalDiskBasedOnVolume { [Override ("Antecedent"), Max (1), Deprecated {"CIM_BasedOn.Antecedent"}, Description ("The VolumeSet.") ] CIM_VolumeSet REF Antecedent; }; // =================================================================== // AggregatePExtent // =================================================================== [Deprecated {"CIM_StorageExtent", "CIM_CompositeExtentBasedOn"}, Version ("2.7.0"), Description ( "This class is deprecated in lieu of the generic StorageExtent " "object and the ProtectedExtentBasedOn association. " "An AggregatePExtent is used to model an SCC RAID " "implementation. AggregatePExtents provide summary information " "about the addressable logical blocks which are in the same " "StorageRedundancyGroup and reside on the same storage device. " "This is an alternative grouping for PhysicalExtents, when " "only summary information is needed or when automatic " "configuration is used.") ] class CIM_AggregatePExtent : CIM_StorageExtent { [Override ("NumberOfBlocks"), Deprecated {"CIM_CompositeExtentBasedOn.NumberOfBlocks", "CIM_StorageExtent.NumberOfBlocks"}, Description ( "Total number of blocks (including the check data blocks) " "contained in this AggregatePExtent. The block size (an " "inherited property) should be set to the same value as for " "the MediaAccessDevice associated with this Extent."), MappingStrings {"MIF.DMTF|Aggregate Physical Extent|001.2"} ] uint64 NumberOfBlocks; [Deprecated {"CIM_CompositeExtentBasedOn.UnitsOfCheckData"}, Description ( "The number of blocks contained in this AggregatePExtent " "to be used as check data. If this AggregatePExtent is " "available, then this value shall be zero."), MappingStrings {"MIF.DMTF|Aggregate Physical Extent|001.3"} ] uint64 BlocksOfCheckData; }; // =================================================================== // AggregatePSExtent // =================================================================== [Deprecated {"CIM_StorageExtent", "CIM_CompositeExtentBasedOn"}, Version ("2.7.0"), Description ( "Similar to AggregatePExtent, this class is deprecated in " "lieu of the generic StorageExtent object and the " "ProtectedExtentBasedOn association. An AggregatePSExtent " "is used to model an SCC RAID implementation. AggregatePSExtents " "define the number of addressable logical blocks on a single " "storage device, excluding any logical blocks mapped as check " "data. This is an alternative grouping for ProtectedSpace" "Extents, when only summary information is needed or when " "automatic configuration is used.") ] class CIM_AggregatePSExtent : CIM_StorageExtent { [Override ("NumberOfBlocks"), Deprecated {"CIM_CompositeExtentBasedOn.NumberOfBlocks", "CIM_StorageExtent.NumberOfBlocks"}, Description ( "Total number of user data blocks that are contained in " "this Extent."), MappingStrings { "MIF.DMTF|Aggregate Protected Space Extent|001.2"} ] uint64 NumberOfBlocks; }; // =================================================================== // AggregatePSExtentBasedOnPExtent // =================================================================== [Association, Deprecated {"CIM_ProtectedSpaceBasedOn"}, Version ("2.7.0"), Description ( "This association is deprecated in lieu of " "ProtectedSpaceBasedOn, since PhysicalExtents and " "AggregatePSExtents are themselves deprecated. " "The association describes that AggregatePSExtents are " "BasedOn a single PhysicalExtent.") ] class CIM_AggregatePSExtentBasedOnPExtent : CIM_BasedOn { [Override ("Antecedent"), Max (1), Deprecated {"CIM_ProtectedSpaceBasedOn.Antecedent"}, Description ("The PhysicalExtent.") ] CIM_PhysicalExtent REF Antecedent; [Override ("Dependent"), Deprecated {"CIM_ProtectedSpaceBasedOn.Dependent"}, Description ( "The AggregatePSExtent which is built on the " "PhysicalExtent.") ] CIM_AggregatePSExtent REF Dependent; }; // =================================================================== // AggregatePSExtentBasedOnAggregatePExtent // =================================================================== [Association, Deprecated {"CIM_ProtectedSpaceBasedOn"}, Version ("2.7.0"), Description ( "This association is deprecated in lieu of " "ProtectedSpaceBasedOn, since AggregatePExtents and " "AggregatePSExtents are themselves deprecated. " "The association describes that AggregatePSExtents are " "BasedOn a single AggregatePExtent.") ] class CIM_AggregatePSExtentBasedOnAggregatePExtent : CIM_BasedOn { [Override ("Antecedent"), Max (1), Deprecated {"CIM_ProtectedSpaceBasedOn.Antecedent"}, Description ("The AggregatePExtent.") ] CIM_AggregatePExtent REF Antecedent; [Override ("Dependent"), Deprecated {"CIM_ProtectedSpaceBasedOn.Dependent"}, Description ( "The AggregatePSExtent which is built on the Aggregate" "PExtent.") ] CIM_AggregatePSExtent REF Dependent; }; // =================================================================== // PExtentRedundancyComponent // =================================================================== [Association, Aggregation, Deprecated {"CIM_ExtentRedundancyComponent"}, Version ("2.7.0"), Description ( "Describes the PhysicalExtents participating in a Storage" "RedundancyGroup. However, there is no need for the specificity " "of this association. It is deprecated in lieu of the generic " "ExtentRedundancyComponent relationship, its superclass.") ] class CIM_PExtentRedundancyComponent : CIM_ExtentRedundancyComponent { [Override ("GroupComponent"), Aggregate, Deprecated {"CIM_ExtentRedundancyComponent.GroupComponent"}, Description ("The StorageRedundancyGroup.") ] CIM_StorageRedundancyGroup REF GroupComponent; [Override ("PartComponent"), Deprecated {"CIM_ExtentRedundancyComponent.PartComponent"}, Description ( "The PhysicalExtent participating in the RedundancyGroup.") ] CIM_PhysicalExtent REF PartComponent; }; // =================================================================== // AggregateRedundancyComponent // =================================================================== [Association, Aggregation, Deprecated {"CIM_ExtentRedundancyComponent"}, Version ("2.7.0"), Description ( "Describes the AggregatePExtent in a StorageRedundancyGroup. " "However, there is no need for the specificity of this " "association. It is deprecated in lieu of the generic " "ExtentRedundancyComponent relationship, its superclass.") ] class CIM_AggregateRedundancyComponent : CIM_ExtentRedundancyComponent { [Override ("GroupComponent"), Aggregate, Deprecated {"CIM_ExtentRedundancyComponent.GroupComponent"}, Description ("The StorageRedundancyGroup.") ] CIM_StorageRedundancyGroup REF GroupComponent; [Override ("PartComponent"), Deprecated {"CIM_ExtentRedundancyComponent.PartComponent"}, Description ( "The AggregatePExtent participating in the " "RedundancyGroup.") ] CIM_AggregatePExtent REF PartComponent; }; // =================================================================== // RealizesPExtent // =================================================================== [Association, Version ("2.7.0"), Deprecated {"CIM_RealizesExtent"}, Description ( "PhysicalExtents are realized on a PhysicalMedia. This is " "described by RealizesPExtent. However, there is no " "need for the specificity of this association. It is " "deprecated in lieu of the generic RealizesExtent " "relationship.") ] class CIM_RealizesPExtent : CIM_RealizesExtent { [Override ("Antecedent"), Max (1), Deprecated {"CIM_RealizesExtent.Antecedent"}, Description ( "The PhysicalMedia on which the Extent is realized.") ] CIM_PhysicalMedia REF Antecedent; [Override ("Dependent"), Deprecated {"CIM_RealizesExtent.Dependent"}, Description ( "The PhysicalExtent that is located on the Media.") ] CIM_PhysicalExtent REF Dependent; }; // =================================================================== // RealizesAggregatePExtent // =================================================================== [Association, Version ("2.7.0"), Deprecated {"CIM_RealizesExtent"}, Description ( "AggregatePExtents are realized on a PhysicalMedia. This is " "described by RealizesAggregatePExtent. However, there is no " "need for the specificity of this association. It is " "deprecated in lieu of the generic RealizesExtent " "relationship.") ] class CIM_RealizesAggregatePExtent : CIM_RealizesExtent { [Override ("Antecedent"), Max (1), Deprecated {"CIM_RealizesExtent.Antecedent"}, Description ( "The PhysicalMedia on which the Extent is realized.") ] CIM_PhysicalMedia REF Antecedent; [Override ("Dependent"), Deprecated {"CIM_RealizesExtent.Dependent"}, Description ( "The AggregatePExtent that is located on the Media.") ] CIM_AggregatePExtent REF Dependent; }; // =================================================================== // Snapshot // =================================================================== [Version ("2.7.0"), Deprecated {"No Value"}, Description ( "Deprecated. Snapshots are now modeled in a more abstrct way " "using StorageExtent and StorageSynchronized. \n" "The Snapshot class is an optional construct. It can be " "used to represent an Extent that contains a full copy of " "another Extent, or the changes to that Extent when performing " "a delta-based (delta before or delta after) copy. \n" "Snapshot's definition in CIM is not equivalent to the act " "of creating a volume or file-based snapshot, or a point in " "time copy. It is at a much lower level and represents the " "use of storage to hold a copied image of an Extent, or to hold " "changes to an Extent. Use of the Snapshot object when making " "a full copy is only recommended if the purpose is to describe " "the existence of a copy. (This use will be very infrequent.) " "The problem with describing an Extent solely as a 'snapshot' " "is that when the snapshot/copy is broken, the object must be " "destroyed. Typically, this object still holds valid data, and " "would have to be reinstantiated. If the 'full copy' object " "is to be treated as a StorageVolume or more general Extent, " "then it should be modeled as such from the beginning - " "i.e., not as an instance of Snapshot but as an instance of a " "generic StorageExtent or StorageVolume. In this case, the " "Synchronized association would be used to describe that one " "StorageExtent is synchronized with another. \n" "When describing a delta-based snapshot/point in time copy, " "the Snapshot object represents the store holding the before/after " "image changes to the original Extent. For example, when doing a " "'delta before' Snapshot, the resultant target would be modeled " "as a StorageExtent that is BasedOn the original Extent and the " "instance of Snapshot (that holds the changes to the original " "Extent).") ] class CIM_Snapshot : CIM_StorageExtent { [Deprecated {"CIM_Synchronized.SyncMaintained"}, Description ( "True indicates that the snapshot is synced.") ] boolean IsSynced; [Deprecated {"CIM_Synchronized.WhenSynced"},Description ( "The time stamp indicating when the sync occurred.") ] datetime SyncTime; }; // =================================================================== // SnapshotOfExtent // =================================================================== [Association, Version ("2.7.0"), Deprecated {"No Value"}, Description ( "Deprecated. Snapshots are now modeled in a more abstract way " "using StorageExtent and CIM_StorageSynchronized.\n" "SnapshotOfExtent is an association between an Extent and " "its Snapshot. This relationship is made explicit in this " "association.") ] class CIM_SnapshotOfExtent : CIM_Dependency { [Deprecated {"No Value"}, Override ("Antecedent"), Max (1), Description ( "The StorageExtent.") ] CIM_StorageExtent REF Antecedent; [Deprecated {"No Value"}, Override ("Dependent"), Description ( "The Snapshot.") ] CIM_Snapshot REF Dependent; [Deprecated {"CIM_StorageSynchronized.CopyType"}, Description ("The type of snapshot."), ValueMap {"0", "1", "2", "3", "4"}, Values {"Other", "Unknown", "Copy", "Before Delta", "After Delta"} ] uint16 SnapshotType; }; // =================================================================== // end of file // ===================================================================