Method for managing multiple versions of multiple subsystems in a distributed computing environment5956515Abstract A method for use in a parallel distributed computing system having a plurality of processors connected in a network of nodes, each node having software installed thereon, and a control workstation controlling the nodes in the network. A list of the levels of the software installed at each node is stored at the control workstation. A list of software subsystems affected by a command to be executed is stored at the nodes of the network, including the control workstation. In addition, a control script for each of said software subsystems is stored at the nodes, including the control workstation. Each control script provides a routine to be followed for the associated subsystem on the associated node or control workstation during the execution of the command. Since the control scripts are compatible with the level of software installed on the target node, the command will be performed such as to be compatible with the software installed on the target node. Claims Having thus described our invention, what we claim as new, and desire to secure by Letters Patent is: Description BACKGROUND OF THE INVENTION
TABLE 1
______________________________________
Node AIX Level
PSSP Level
______________________________________
1 AIX-414 PSSP-2.1
2 AIX-420 PSSP-2.2
3 AIX-325 PSSP-1.2
. . .
. . .
. . .
n AIX-414 PSSP-2.2
______________________________________
As shown in the example of Table 1, node 1 of partition 202 is running AIX-414 and PSSP-2.1, while node 2 is running AIX-420 and PSSP-2.2, node 3 is running AIX-325 and PSSP-1.2, and node n is running AIX-414 and PSSP-2.2. In the present embodiment, the level data for the operating system and the PSSP support software is written into the levels data file 201 using the "spbootins" command, as described in IBM Parallel System Support Programs for AIX Command and Technical Reference, GC23-3900-01, available from IBM and well understood by those in the art. Typically the AIX and PSSP levels are changed in the levels file 201 on a new install or migration from one level to another, as will be explained. In order to effectively manage the system partition 202 which may include nodes running multiple levels of the AIX operating system and PSSP support software, as illustrated in levels data file 201, a command "splst.sub.-- versions" is provided to analyze the software level information about one or more nodes in the system partition as recorded in the SDR files of 114, and report that information to the requester. The definition of the "splst.sub.-- versions" command is as follows:
______________________________________
splst.sub.-- versions
Purpose
splst.sub.-- versions--Returns information about the
PSSP code version installed on nodes in the
SP system.
Syntax
n node.sub.-- num!ons ›-G! ›
h! ›node.sub.-- group! ›
Flags
G Causes the command to look at all system
partitions rather than just the current
system partition (but not the control
workstation).
1 Returns the latest PSSP version for the
nodes that are the target of the
command.
e Returns the earliest PSSP version for
the nodes that are the target of the
command.
n node_.sub.-- num
Returns the PSSP code version for
node.sub.-- num. Use node.sub.-- num O to specify the
control workstation.
N node.sub.-- group
Returns a list of PSSP versions for
node.sub.-- group. If -G is supplied, a global
node group is used. Otherwise, a
partitioned-bound node group is used.
t Returns the node number and PSSP version
in two columns.
h Displays usage information.
______________________________________
Description Use this command to return a list of PSSP code versions that are installed on the nodes in the current system partition. The PSSP version and release numbers are included in the output. The modification level and fix level are not returned as part of the output. Node number 0 (zero) is considered the control workstation and is not evaluated as part of any system partition. The output is sorted in ascending order by version. If the -t flag is omitted, there will be only one record for each version present. If the -t flag is used, there will be a record for each node. Examples
______________________________________
1. To list each PSSP version represented in
the current system partition, enter:
prompt> splst.sub.-- versions
PSSP-1.2
PSSP-2.2
2. To list each node in the system
partition and its PSSP code version,
enter:
prompt> splst.sub.-- versions -t
1 PSSP-2.1
5 PSSP-2.1
6 PSSP-2.1
9 PSSP-2.2
3. To list the earliest and latest PSSP
code versions in a system partition,
enter:
prompt> splst.sub.-- versions -1 -e
PSSP-2.1/* this case has mixed
partitions */
PSSP-2.2
______________________________________
The following will be the output if only PSSP-2.2 exists in the system partition:
______________________________________
prompt> splst.sub.-- versions -1 -e
PSSP-2.2/* this case has only 2.2
in partition */
______________________________________
It will be understood that the splst.sub.-- versions command allows the ability to display the application software level for a particular node, the earliest application software level for a group of nodes or a system partition, or the latest application software level for a group of nodes or a system partition. This is important as it allows the function to determine what's running (and hence, what will "work") on a particular node. It also allows the function to determine what degree of compatibility exits between groups of nodes, particularly the group of nodes which comprise a system partition. FIG. 3 is a block diagram illustrating the use of the splst.sub.-- versions command. The splst.sub.-- versions command, in the embodiment of FIG. 3, is issued by a node 106 with the flag -n and node number 2. The command splst.sub.-- versions causes the entry for node 2 in the levels data file 201 in the SDR 200 to be read, and the level of the support program (PSSP-2.2 in the present example) to be displayed at 250 for the requester. Returning to FIG. 2, support subsystems running within the system partition 202 typically require running subsystems daemons on each node 106 in the partition 202 to provide services to/from that node to/from the other nodes in the system partition 202. The software level of the subsystem daemon is usually dictated by a combination of the level of operating system and support software running on the node. On the control node 112, a subsystem daemon for the level or levels of the subsystem (for instance, many subsystems are downward compatible with older levels) must be run in order to communicate with the different levels of subsystem daemons running throughout the system partitions. The new command called the "Syspar Controller" (syspar.sub.-- ctrl) provides the interface to manage the starting, stopping, refreshing, etc. of subsystem daemons throughout the nodes, including the control workstation 112. A file "syspar.sub.-- subsystems" shown at 204 is included on the DASD device 114 for use by the control workstation 112, and on each DASD device 107 for use by its associated node 106. The syspar.sub.-- subsystems file is read by the Syspar Controller command being executed by the workstation or associated node, as will be explained. The "syspar.sub.-- subsystems" file 204 contains the list of subsystem names under control of the Syspar Controller command program along with the pathname to an associated control script 206 for each subsystem on that node 106 or the control workstation 112, as the case may be. In the case of the control workstation 112, the control script file 206 is stored on the DASD device 114. For each of the other nodes 106, the control script file 206 is stored on its associated DASD device 107. There is a different syspar.sub.-- subsystems file 204 for each level of PSSP support software. The appropriate syspar.sub.-- subsystems file 204 and control scripts file 206 will be installed on the control workstation 112 during installation of the control workstation operating system and PSSP support software for the CWS. Likewise, the appropriate syspar.sub.-- subsystem file 204 and control script file 206 will be installed on the node 106 during installation or migration on that node. It will be understood that migration means migrating from one version or level of the operating system or PSSP support software to another version or level. An example of the syspar.sub.-- subsystems file 204 is shown in Table 2.
TABLE 2
______________________________________
hats /usr/lpp/ssp/bin/hatsctrl
hb /usr/lpp/ssp/bin/hbctrl
hags /usr/lpp/ssp/bin/hagsctrl
haem /usr/lpp/ssp/bin/haemctrl
hr /usr/lpp/ssp/bin/hrctrl
pman /usr/lpp/ssp/bin/pmanctrl
emon /usr/lpp/ssp/bin/emonctrl
sp.sub.-- configd /usr/lpp/ssp/bin/sp.sub.-- configdctrl
emcond /usr/lpp/ssp/bin/emconditionctrl
spdmd /usr/lpp/ptpe/bin/spdmdctrl
______________________________________
The Syspar Controller command is invoked with a function code (option flag) by the administrator or by an administrative function of the support software PSSP as necessary. The Syspar Controller command invokes the control script 206 for each subsystem under its control (as found in the syspar.sub.-- subsystems file 204) passing the function code along for interpretation by each subsystems' control script 206. The control script 206 for each subsystem is responsible for performing whatever processing is required to implement that function in the subsystem throughout the system. In this way, the administrator is relieved of the responsibility of managing the potentially many and different levels of subsystem daemons with their varying options throughout the collection of nodes which comprise the system partition 202. The Syspar Controller command completes its tasks by invoking an appropriate control script for each target subsystem listed in the syspar.sub.-- subsystems file. Each control script is a program which is specific to the subsystem it controls. Typically, a subsystem controls one daemon, but it may control more than one. The control script has intimate knowledge of the interface requirements of its subsystem daemon--how to start it, stop it, refresh it, etc. Every control script (regardless of subsystem) is invoked by the Syspar Controller command with the same function code to accomplish the same task (e.g., -s for start, -k for stop, -r for refresh, etc.). The control script turns the generic function code into the specific command invocation required to perform that function on the level of subsystem daemon running on the node or control node. This mechanism relieves the administrator from issuing individual (and potentially different) commands throughout nodes in a system partition 202 when a function is required to be performed on them. The administrator need only ensure that the correct level information has been recorded in the central repository file 201. The Syspar Controller (syspar.sub.-- ctrl) command is defined as follows:
______________________________________
syspar.sub.-- ctrl
Purpose
syspar.sub.-- ctrl - Starts, stops, adds, deletes, and
refreshes the system partition-sensitive
subsystems installed on the SP system.
Syntax
o.vertline.. ctrl ›-G! ›
R} ›subsystem.sub.-- name!
______________________________________
Flags -h (help) Displays usage information. If a subsystem name is specified, help is provided only for the specified subsystem's control script. Help is displayed as a syntax description and is written to standard output. Once help is displayed, no other action is taken even if other valid options are entered with the -h flag. -a (add) Adds all subsystems. If a subsystem name is specified, only the specified subsystem is added. Each subsystem's control script 206 is invoked with the -a flag. Typically, this causes each subsystem's control script 206 to add itself to the System Resource Controller (SRC) subsystem, /etc/inittab and /etc/services. The SRC is At described in the publication AIX Version 4.1 System Management Guide: Operating System and Devices, SC23-2544, available from IBM. The actual function that is performed depends on whether the underlying control script runs on the control workstation or on a node. -A (add and start) Adds and starts all subsystems. If a subsystem.sub.-- name is specified, only the specified subsystem is added and started. Each subsystem's control script 206 is invoked with the -a flag followed by the -s flag. This is a convenience option that provides the same function as first calling syspar.sub.-- ctrl with the -a flag followed by the -s flag. -c (clean) Cleans up after all of the subsystems. If a subsystem.sub.-- name is specified, only the specified subsystem is cleaned up. Each subsystem's control script 206 is invoked with the -c flag. Typically, this causes each subsystem's control script 206 to stop any subsystem daemons that may be running and clean or remove all entries for this subsystem from the SRC, /etc/inittab, /etc/services. This flag is similar to the -d (delete) flag, but independent of system partitions. Cleaning up the subsystems is done in the reverse order of how the subsystems are listed in the Syspar Controller subsystems file. This option is used to clean up subsystem information while trying to get back to some preexisting state, such as when an old System Data Repository (SDR) is restored and the old system partitioning needs to be restored. -d (delete) Deletes all subsystems. If a subsystem.sub.-- name is specified, the specified subsystem is deleted. Each subsystem's control script 206 is invoked with the -d flag. Typically, this causes each subsystem's control script 206 to delete itself from the SRC subsystem, /etc/inittab and /etc/services. Deleting subsystems is done in the reverse order of how the subsystems are listed in the Syspar Controller subsystems file. The actual function that is performed depends on whether the underlying control script runs on the control workstation 112 or on a node 106. -D (stop and delete) Stops and deletes all subsystems. If a subsystem.sub.-- name is specified, that subsystem is stopped and deleted. Each subsystem's control script 206 is invoked with the -k flag followed by the -d flag. This is a convenience option that provides the same function as first calling syspar.sub.-- ctrl with the -k flag followed by the -d flag. -E (examine) Examines all subsystems. If a subsystem.sub.-- name is specified, the specified subsystem is examined in the Syspar Controller subsystems file. Each subsystem name--control script (204-206) pair in the subsystems file is examined and displayed. Entries that are not valid are noted. An entry is not valid when the control script 206 for a particular subsystem 204 does not exist at the specified location or does not have the correct read and execute permissions. -G (global) Invokes the appropriate underlying subsystem's control scripts 206 for each system partition 202. If the -G flag is not specified, the appropriate underlying subsystem's control script 206 is run only in the current system partition (SP.sub.-- NAME). -k (kill or stop) Stops all subsystems. If a subsystem.sub.-- name is specified, only the specified subsystem is stopped. Each subsystem's control script 206 is invoked with the -k flag. Typically, this causes each subsystem's control script 206 to stop any daemons associated with this particular subsystem. Stopping subsystems is done in the reverse order of how the subsystems are listed in the Syspar Controller's subsystem file. The actual function that is performed depends on whether the underlying control script 206 runs on the control workstation 112 or on a node 106. -r (refresh) Refreshes all subsystems. If a subsystem.sub.-- name is provided, only the specified subsystem is refreshed. Each subsystem's control script 206 is invoked with the -r flag. Typically, this causes each subsystem's control script 206 to rebuild configuration data and refresh any daemons associated with this particular subsystem. Subsystems may need to be refreshed when nodes are added to an existing system or the nodes PSSP version changes. The actual function that is performed depends on the subsystem. This option is only meaningful when run on the control workstation 112. -R (restore) Restores all subsystems. If a subsystem.sub.-- name is specified, only the specified subsystem is restored. All subsystems are stopped and deleted before they are added and started. Each subsystem's control script 206 is invoked with the -k flag followed by the -d flag, then the -a flag followed by the -s flag. This is a convenience option that provides the same function as first calling syspar.sub.-- ctrl with the -D flag followed by the -A flag. -s (start) Starts all subsystems. If a subsystem name is specified, only the specified subsystem is started. Each subsystem's control script 206 is invoked with the -s flag. Typically, this causes each subsystem's control script 206 to start any daemons associated with this particular subsystem. The actual function that is performed depends on whether the underlying control script runs on the control workstation 112 or on a node 106. -t (trace on) Turns the trace option on for all subsystems. If a subsystem.sub.-- name is specified, the trace option is turned on only for the specified subsystem. Each subsystem's control script 206 is invoked with the -t flag. Note: It is recommended to only turn on a particular subsystem's trace by providing a subsystem name. If the trace is turned on for all subsystems, the volume of data produced may quickly fill up /var. -o (trace off) Turns the trace option off for all subsystems. If a subsystem.sub.-- name is specified, the trace option is turned off only for the specified subsystem. Each subsystem's control script 206 is invoked with the -o flag. -V (verbose) Turns verbose mode on in the syspar.sub.-- ctrl script which then prints out the actual calls it makes to the underlying subsystem control scripts 206. It also prints out additional information that is useful for debugging. Operands subsystem.sub.-- name Specifies the subsystem name that you want the command to act on. If a subsystem.sub.-- name is not provided, this command is run for all subsystems that are listed in the Syspar Controller subsystems file (syspar.sub.-- subsystems 204). For example, to only run this command on the Event Management subsystem, enter: syspar.sub.-- ctrl option haem Description This command acts as an interface to the system partition-sensitive subsystems supporting the functions that are shared by all subsystems. This command is also referred to as the Syspar Controller. It can be used to add or delete, start or stop, refresh or restore the subsystems, and various other functions. When used on the control workstation 112, it works with the subsystems on the control workstation 112. When used on the nodes 106, it works with the subsystems on the nodes 106. The refresh option is an exception. In order to refresh some subsystems, the subsystem must be refreshed on both the control workstation and on the nodes. In this case, the refresh on the control workstation will execute an appropriate refresh command from the control workstation to the appropriate nodes, typically via the "dsh" command, as explained in the aforementioned GC23-3900-01 manual. This command supports two types of options: primitive options and macro options. Primitive options are passed directly to the underlying control scripts, for example, -a (add), -d (delete), -r (refresh). Macro options conveniently group a commonly used set of primitive options into one option, for example, -R (restore). All of the subsystems and each subsystem's control script that are managed by the Syspar Controller are listed in the Syspar Controller subsystems file. By default, all of the control scripts 206 listed in the Syspar Controller subsystems file 204 will be called unless a subsystem.sub.-- name is provided. In that case, the control script for just the specified subsystem will be called. This command is automatically called when the system is partitioned (spapply.sub.-- config) to first stop and delete the system partition-sensitive subsystems from system partitions that are being removed, and then to add and start the system partition-sensitive subsystems (for example, hats, hb, and hr) in new system partitions. The Syspar Controller is also called when restoring the SDR with sprestore.sub.-- config to first clean up and then add and start the system partition-sensitive subsystems (for example, hats, hb and hr) in each system partition 202. The Syspar Controller also needs to be called with refresh flag (-r) by the System Administrator using the command line whenever a node is added or deleted from the system, or a node's PSSP support software level changes. Files syspar.sub.-- subsystems 204 Lists all of the system partition sensitive subsystems and their control scripts that are controlled by the Syspar Controller. Only the syspar.sub.-- ctrl command should read this file. This file is located in the directory /usr/lpp/ssp/config/cmi. Security Must be running with an effective user ID of root. Environment Variables SP.sub.-- NAME syspar.sub.-- ctrl sets the SP.sub.-- NAME environment variable prior to calling the underlying subsystems. Typically, SP.sub.-- NAME is set to the value returned from the spget.sub.-- syspar -n command. However, when syspar.sub.-- ctrl is called with the -G flag, syspar.sub.-- ctrl sets SP.sub.-- NAME in turn to each value returned by the splst.sub.-- syspars -n command. The -c flag ignores system partition boundaries while all other options respect system partition boundaries. Exit Values O Indicates the successful completion of the command. 1 Indicates that the command failed. Most likely a subsystem's control script returned a bad return code. Implementation Specifics This command is part of the IBM Parallel System Support Programs (PSSP) Licensed Program Product (LPP). Location /usr/lpp/ssp/bin/syspar.sub.-- ctrl Related Information Commands: emonctrl, hatsctrl, hbctrl, hrctrl, haemctrl, hagsctrl, pmanctrl, sp.sub.-- configdctrl, spapply.sub.-- config, spcw.sub.-- apps, sprestore.sub.-- config Examples 1. To add and start all of the system partitions subsystems in each of the system partitions, enter: syspar.sub.-- ctrl -G -A 2. To stop and delete all of the system partition subsystems in each of the system partitions, enter: syspar.sub.-- ctrl -G -D 3. To refresh all of the system partition subsystems in the current system partition, enter: syspar.sub.-- ctrl -r 4. To restore all of the system partition subsystems running in the current system partition, enter: syspar ctrl -R 5. To stop all of the system partition subsystems running in the current system partition, enter: syspar.sub.-- ctrl -k 6. To get help for the event manager subsystem (haem) control script, enter: syspar.sub.-- ctrl -h haem 7. To display a list of all subsystems managed by the Syspar Controller, enter: syspar.sub.-- ctrl -E 8. To see the state of the system partition subsystems controlled by the Syspar Controller for system partition spp1, enter the commands: lssrc -a .vertline. grep spp1 Note: The SDR is not managed by the Syspar Controller. FIG. 4 is a block diagram illustrating how the syspar.sub.-- ctrl command locates the proper control script to perform the task designated by the flag included in the command. In FIG. 4, when the syspar.sub.-- ctrl command is issued, either by the control workstation 112 or a node 106, the associated syspar-subsystems file 204 is accessed. Depending on the flag, one or more of the subsystems might be affected. The entry includes an address which points to the control script 206a-206n to be used with that subsystem. For instance, the flag -s starts all subsystems in the file 204, unless a specific subsystem is specified. In the example of FIG. 4, the control script for the hats subsystem shown in 204 is the hatsctrl control script 206a, the control script for hags is hagsctrl control script 206b, the control script for haem is haemctrl 206c, and the control script for spdmd is spdmdctrl 206n. It will be understood that, in this way, each syspar.sub.-- ctrl command will be tailored by the control scripts to perform the requested function or task dependent on the PSSP level of the node which is executing the syspar.sub.-- ctrl command. FIG. 5 is a flowchart showing the scenario wherein a new level of operating system and/or support software is introduced into the distributed system, or when the operating system and/or support software level is changed on one or more distributed systems. As shown in FIG. 5, the correct level of subsystems must be started on both the distributed system(s) and the control workstation 112. At 301, the control workstation 112 is up and running with access to the central data repository on DASD 114. At 302, the administrator plans levels of the operating system (AIX) and support software (PSSP) for each node 106 in the distributed system 100. At 303, these setting are recorded in the file 201 in the central data repository on 114. At 304, the distributed systems on nodes 106 are installed or started-up. The installation on the nodes 106 in the partition 202 is disclosed in U.S. patent application Ser. No. 08/896,866 filed on Jul. 18, 1999 by Russell et al. for MODULAR, PARALLEL, REMOTE SOFTWARE INSTALLATION WITH REPEATABLE, EXTERNALLY-INVOCABLE STEPS incorporated herein by reference, owned by the assignee of the present invention. In this installation, the correct level of subsystems is installed and started up. At 305, the correct levels of the subsystems are running on the distributed systems according to the operating system and support software running on the nodes, and as recorded in levels file 201. FIG. 6 is a flowchart for scenario 1 for examining the subsystems managed by the Syspar Controller command described. In scenario 1, the administrator wishes to see what subsystems are managed by the Syspar Controller. In addition the administrator wishes to see the order in which the subsystems will be added and started or stopped and deleted. The steps in the flowchart of FIG. 6 are self explanatory, and will not be described further. A sample output when running syspar.sub.-- ctrl -E on a PSSP 2.2 control workstation 112 is as follows:
______________________________________
>syspar.sub.-- ctrl -E
Syspar controller managed subsystems and control
scripts:
hats /usr/lpp/ssp/bin/hatsctrl
hb /usr/lpp/ssp/bin/hbctrl
hags /usr/lpp/ssp/bin/hagsctrl
haem /usr/lpp/ssp/bin/haernctrl
hr /usr/lpp/ssp/bin/hrctrl
pman /usr/lpp/ssp/bin/pmanctrl
emon /usr/lpp/ssp/bin/emonctrl
sp.sub.-- configd /usr/lpp/ssp/bin/sp.sub.-- configdctrl
emcond /usr/lpp/ssp/bin/emconditionctrl
spdmd /usr/lpp/ptpe/bin/spdmdctrl
______________________________________
It will be understood that this output is the same as the contents of the syspar.sub.-- subsystems file 204 shown in Table 2. One skilled in the art will understand the subsystems, control scripts, other commands referred to herein, as further explained in the aforementioned GC23-3900-01 manual, available from IBM. FIGS. 7a and 7b, when joined at a--a, form a flowchart for scenario 2a for performing a new install on the control workstation 112. The steps in FIGS. 7a and 7b are self explanatory, and will not be discussed further. FIGS. 8a, 8b and 8c, when joined at b--b and c--c, form a flowchart for scenario 2b for performing a new install on a node 106. The steps in FIGS. 8a-8c are self explanatory, and will not be discussed further. FIGS. 9a, 9b, 9c and 9d, when joined at d--d, e--e and f--f, form a flowchart for scenario 3a for performing a system partition change on the control workstation (CWS) 112. The steps in FIGS. 9a-9d are self explanatory, and will not be discussed further. FIGS. 10a, 10b and 10c, when joined at g--g and h--h, form a flowchart for scenario 3b for performing a system partition change on a node 106. The steps in FIGS. 10a-10c are self explanatory, and will not be discussed further. FIGS. 11a, 11b and 11c, joined at i--i and j--j, form a flowchart for scenario 4a for migrating the control workstation 112 of the latest level of PSSP. The steps in FIGS. 11a and 11c are self explanatory, and will not be discussed further. FIGS. 12a, 12b, 12c, 12d and 12e, joined at k--k, 1--l, m--m and n--n, form a flowchart for scenario 4b for migrating a node 106 to the latest level of PSSP. The steps in FIGS. 12a-12e are self explanatory, and will not be discussed further. FIGS. 13a and 13b, joined at o--o, form a flowchart for scenario 5 for restoring a previously archived SDR and PSSP partitioning environment. The steps in FIGS. 13a-13b are self explanatory, and will not be discussed further. It will be understood that the present Syspar Controller uses a common interface, and control scripts that also preserve this common interface so that the partition sensitive subsystems can be managed on a single control workstation, on multiple heterogenous nodes, and from a control workstation that actually distributes appropriate commands to the nodes. The disclosed Syspar Controller may perform functions on the node it is being run on. In the case of the control workstation, Syspar Controller may perform functions just on the control workstation, or it may actually start Syspar Controller functions on particular nodes or execute the underlying control scripts to be run on particular nodes. Which nodes the functions are performed on may depend on what level of PSSP is running on that node. What functions of the Syspar Controller (-c, -a, -k, etc.) are supported in the underlying control scripts on the control workstation or nodes is dependent on the PSSP version, AIX version, and whether the control script is running on a node or, possibly, the control workstation. Functions that aren't supported do not return an error message, and simply do nothing. While we have illustrated and described the preferred embodiment of our invention, it is to be understood that we do not limit ourselves to the precise construction herein disclosed, and the right is reserved to all changes and modifications coming within the scope of the invention as defined in the appended claims.
|
Same subclass Same class Consider this |
||||||||||
