ibm-information-center/dist/eclipse/plugins/i5OS.ic.apis_5.4.0.1/clcntcrtc.htm

758 lines
23 KiB
HTML
Raw Normal View History

2024-04-02 14:02:31 +00:00
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<meta name="Copyright" content="Copyright (c) 2006 by IBM Corporation">
<title>Create Cluster (QcstCreateCluster) API</title>
<!-- Begin Header Records ========================================== -->
<!-- All rights reserved. Licensed Materials Property of IBM -->
<!-- US Government Users Restricted Rights -->
<!-- Use, duplication or disclosure restricted by -->
<!-- GSA ADP Schedule Contract with IBM Corp. -->
<!-- Change History: -->
<!-- YYMMDD USERID Change description -->
<!-- CLUST2A SCRIPT A converted by B2H R4.1 (346) (CMS) by NLJONES at -->
<!-- RCHVMX on 24 Feb 1999 at 17:15:51 -->
<!-- Edited by Kersten Oct 2001 -->
<!-- End Header Records -->
<!-- -->
<!-- -->
<!-- -->
<!-- Begin Developer Note ========================================== -->
<!-- NOTE: If you are adding, changing, or removing ANY requirements -->
<!-- for this API chance are good that the GUI code need to change -->
<!-- also. The Cluster GUI code is built on top of this API and it -->
<!-- does a certain amount of explicit and implicit validation -->
<!-- checking of user data prior to the API call being made. Please -->
<!-- have the Cluster GUI developer check the -->
<!--/as400/v5r4m0.guix/cur/cmvc/java.pgm/ugcl.guix/com/ibm/as400/opnav/ugcl/ClGuiActionsManager.java/ClGuiActionsManager.java -->
<!-- part to determine if any Cluster GUI code changes are needed. -->
<!-- End Developer Note -->
<link rel="stylesheet" type="text/css" href="../rzahg/ic.css">
</head>
<body>
<!--Java sync-link-->
<script type="text/javascript" language="Javascript" src="../rzahg/synch.js">
</script>
<a name="Top_Of_Page"></a>
<h2>Create Cluster (QcstCreateCluster) API</h2>
<div class="box" style="width: 70%;">
<br>
&nbsp;&nbsp;Required Parameter Group:<br>
<!-- iddvc RMBR -->
<br>
<table width="100%">
<tr>
<td align="center" valign="TOP" width="10%">1</td>
<td align="LEFT" valign="TOP" width="50%">Request handle</td>
<td align="LEFT" valign="TOP" width="20%">Output</td>
<td align="LEFT" valign="TOP" width="20%">Char(16)</td>
</tr>
<tr>
<td align="center" valign="TOP">2</td>
<td align="LEFT" valign="TOP">Cluster name</td>
<td align="LEFT" valign="TOP">Input</td>
<td align="LEFT" valign="TOP">Char(10)</td>
</tr>
<tr>
<td align="center" valign="TOP">3</td>
<td align="LEFT" valign="TOP">Cluster membership information</td>
<td align="LEFT" valign="TOP">Input</td>
<td align="LEFT" valign="TOP">Char(*)</td>
</tr>
<tr>
<td align="center" valign="TOP">4</td>
<td align="LEFT" valign="TOP">Number of cluster membership entries</td>
<td align="LEFT" valign="TOP">Input</td>
<td align="LEFT" valign="TOP">Binary(4)</td>
</tr>
<tr>
<td align="center" valign="TOP">5</td>
<td align="LEFT" valign="TOP">Start indicator</td>
<td align="LEFT" valign="TOP">Input</td>
<td align="LEFT" valign="TOP">Binary(4)</td>
</tr>
<tr>
<td align="center" valign="TOP">6</td>
<td align="LEFT" valign="TOP">Format name</td>
<td align="LEFT" valign="TOP">Input</td>
<td align="LEFT" valign="TOP">Char(8)</td>
</tr>
<tr>
<td align="center" valign="TOP">7</td>
<td align="LEFT" valign="TOP">Results information</td>
<td align="LEFT" valign="TOP">Input</td>
<td align="LEFT" valign="TOP">Char(30)</td>
</tr>
<tr>
<td align="center" valign="TOP">8</td>
<td align="LEFT" valign="TOP">Error code</td>
<td align="LEFT" valign="TOP">I/O</td>
<td align="LEFT" valign="TOP">Char(*)</td>
</tr>
</table>
<br>
&nbsp;&nbsp;Service Program: QCSTCTL<br>
<!-- iddvc RMBR -->
<br>
&nbsp;&nbsp;Default Public Authority: *EXCLUDE<br>
<!-- iddvc RMBR -->
<br>
&nbsp;&nbsp;Threadsafe: Yes<br>
<!-- iddvc RMBR -->
<br>
</div>
<p>The Create Cluster (QcstCreateCluster) API is used to create a new cluster
of one or more nodes. Each node specified on the &quot;Cluster membership
information&quot; parameter will be placed in the cluster membership list.</p>
<p>If the "Start indicator" parameter is set to 0, each node that is being
added will have a status of New and Cluster Resource Services will not be
started on any node. In order to start Cluster Resource Services, the <a href=
"clcntstcn.htm">Start Cluster Node (QcstStartClusterNode) API</a> must be
called from a program running on the node that ran the Create Cluster API. The
Start Cluster Node API may be used to start nodes in the cluster membership
list.</p>
<p>If the "Start indicator" parameter is set to 1, the cluster can contain only
one node. Cluster Resource Services will be started on the node being defined.
If Cluster Resource Services is successfully started, the status for the node
will be set to Active. If Cluster Resource Services is not successfully
started, the status of the node remains New. If a list of nodes is specified,
the start indicator is ignored.</p>
<p>If the NODE0100 format is chosen, the current cluster version will be set
equal to the requesting node's potential node version.</p>
<p>After Cluster Resource Services has been started on the original node,
additional nodes can only be started by calling the Start Cluster Node API on
the original node. If Cluster Resource Services is active on more than one
node, additional nodes may be started by calling the Start Cluster Node API on
any node that has a status of Active.</p>
<p>Once the cluster has been created, the <a href="clcntaddcne.htm">Add Cluster
Node Entry (QcstAddClusterNodeEntry) API</a> can be used to add additional
nodes to the cluster membership list. The Add Cluster Node Entry API can be
called from a program running on any node in the cluster that has a status of
Active or from the node on which the cluster was originally created.</p>
<p>The following conditions apply to this API:</p>
<ul>
<li>A node can be a member of only one cluster.</li>
<li>At least one node must be specified in the cluster membership list. A
cluster cannot be created with an empty membership list.</li>
</ul>
<p>This API operates in an asynchronous mode. See <a href=
"clust1a3.htm#HDRASYMOD">Behavior of Cluster Resource Services APIs</a> for
more information.</p>
<p><strong>Restriction:</strong> This API cannot be called from a cluster
resource group exit program.<br>
</p>
<h3>Authorities and Locks</h3>
<p>The program that calls this API must be running under a user profile with
*IOSYSCFG special authority.</p>
<dl>
<dt><em>User Queue Authority</em></dt>
<dd>*OBJOPR and *ADD</dd>
<dt><em>User Queue Library Authority</em></dt>
<dd>*EXECUTE</dd>
<dt><em>User Queue Lock</em></dt>
<dd>*EXCLRD</dd>
</dl>
<br>
<h3>Required Parameter Group</h3>
<dl>
<dt><strong>Request handle</strong></dt>
<dd>OUTPUT; CHAR(16)
<p>A unique string or handle that identifies this API call. It is used to
associate this call to any responses placed on the user queue specified in the
results information parameter.</p>
</dd>
<dt><strong>Cluster name</strong></dt>
<dd>INPUT; CHAR(10)
<p>The name of the cluster which is being created. This must be a valid simple
name.</p>
</dd>
<dt><strong>Cluster membership information</strong></dt>
<dd>INPUT; CHAR(*)
<p>This parameter contains information about the cluster and the list of nodes
which will be placed in the cluster membership list.</p>
</dd>
<dt><strong>Number of cluster membership entries</strong></dt>
<dd>INPUT; BINARY(4)
<p>The number of nodes in the cluster membership array. Must be greater than or
equal to 1 and less than or equal to 128.</p>
</dd>
<dt><strong>Start indicator</strong></dt>
<dd>INPUT; BINARY(4)
<p>An indicator which specifies whether or not Cluster Resource Services is to
be started on the node being defined.</p>
<table cellpadding="5">
<!-- cols="5 95" -->
<tr>
<td align="left" valign="top"><em>0</em></td>
<td align="left" valign="top">Cluster Resource Services will not be started on
any node.</td>
</tr>
<tr>
<td align="left" valign="top"><em>1</em></td>
<td align="left" valign="top">Cluster Resource Services will be started on the
node.</td>
</tr>
</table>
<br>
</dd>
<dt><strong>Format name</strong></dt>
<dd>INPUT; CHAR(8)
<p>The content and format of the information supplied in the cluster membership
information parameter. The possible format names are:</p>
<table cellpadding="5">
<!-- cols="25 75" -->
<tr>
<td align="left" valign="top"><em><a href="#node0100">NODE0100</a></em></td>
<td align="left" valign="top">Cluster membership information</td>
</tr>
<tr>
<td align="left" valign="top"><em><a href="#node0200">NODE0200</a></em></td>
<td align="left" valign="top">Cluster membership information plus additional
information</td>
</tr>
</table>
<br>
</dd>
<dt><strong>Results information</strong></dt>
<dd>INPUT; CHAR(30)
<p>A library qualified user queue name followed by a reserved field.</p>
<p>Library qualified user queue: A user queue, which exists on the node from
which the API was called, that receives results information after the function
has completed on all active nodes in the cluster. See the <a href=
"#usage_notes">Usage Notes</a> section of this API for a description of the
data that is placed on this queue. This is a 20 character field. The first 10
characters contain the user queue name and the second 10 characters contain the
user queue library name. No special values are supported. QTEMP, *LIBL, and
*CURLIB are not valid for the library name. The attributes of this user queue
must be keyed.</p>
<p>Reserved: The last 10 characters of results information are reserved and
must be set to hexadecimal zero.</p>
</dd>
<dt><strong>Error code</strong></dt>
<dd>I/O; CHAR(*)
<p>The structure in which to return error information. For the format of the
structure, see <a href="../apiref/error.htm#hdrerrcod">Error Code parameter</a>.</p>
</dd>
</dl>
<br>
<h3><a name="node0100">NODE0100 Format</a></h3>
<strong>Note:</strong> These fields
are repeated for each node entry.
<table border width="80%">
<tr>
<th align="center" valign="bottom" colspan="2">Offset</th>
<th align="left" valign="bottom" rowspan="2">Type</th>
<th align="left" valign="bottom" rowspan="2">Field</th>
</tr>
<tr>
<th align="center" valign="bottom">Dec</th>
<th align="center" valign="bottom">Hex</th>
</tr>
<tr>
<td align="center" valign="top" width="10%">&nbsp;</td>
<td align="center" valign="top" width="10%">&nbsp;</td>
<td align="left" valign="top" width="20%">BINARY(4)</td>
<td align="left" valign="top" width="60%">Length of node entry</td>
</tr>
<tr>
<td align="center" valign="top">&nbsp;</td>
<td align="center" valign="top">&nbsp;</td>
<td align="left" valign="top">CHAR(8)</td>
<td align="left" valign="top">Node id</td>
</tr>
<tr>
<td align="center" valign="top">&nbsp;</td>
<td align="center" valign="top">&nbsp;</td>
<td align="left" valign="top">BINARY(4)</td>
<td align="left" valign="top">Offset to first cluster interface entry</td>
</tr>
<tr>
<td align="center" valign="top">&nbsp;</td>
<td align="center" valign="top">&nbsp;</td>
<td align="left" valign="top">BINARY(4)</td>
<td align="left" valign="top">Number of cluster interfaces</td>
</tr>
<tr>
<td colspan="2">This field is repeated for each
cluster interface.</td>
<td align="left" valign="top">CHAR(16)</td>
<td align="left" valign="top">Cluster interface address</td>
</tr>
</table>
<br>
<br>
<h3><a name="node0200">NODE0200 Format</a></h3>
<table border width="80%">
<tr>
<th align="center" valign="bottom" colspan="2">Offset</th>
<th align="left" valign="bottom" rowspan="2">Type</th>
<th align="left" valign="bottom" rowspan="2">Field</th>
</tr>
<tr>
<th align="center" valign="bottom">Dec</th>
<th align="center" valign="bottom">Hex</th>
</tr>
<tr>
<td align="center" valign="top" width="10%">0</td>
<td align="center" valign="top" width="10%">0</td>
<td align="left" valign="top" width="20%">BINARY(4)</td>
<td align="left" valign="top" width="60%">Target cluster version</td>
</tr>
<tr>
<td align="center" valign="top">4</td>
<td align="center" valign="top">4</td>
<td align="left" valign="top">BINARY(4)</td>
<td align="left" valign="top">Offset to first node entry</td>
</tr>
<tr>
<td align="center" valign="top">8</td>
<td align="center" valign="top">8</td>
<td align="left" valign="top">BINARY(4)</td>
<td align="left" valign="top">Offset to additional fields</td>
</tr>
<tr>
<td align="center" valign="top">12</td>
<td align="center" valign="top">C</td>
<td align="left" valign="top">BINARY(4)</td>
<td align="left" valign="top">Length of additional fields</td>
</tr>
<tr>
<td align="LEFT" valign="TOP" colspan="4"><strong>Note:</strong> These fields
are repeated for each node entry.</td>
</tr>
<tr>
<td align="center" valign="top">&nbsp;</td>
<td align="center" valign="top">&nbsp;</td>
<td align="left" valign="top">BINARY(4)</td>
<td align="left" valign="top">Length of node entry</td>
</tr>
<tr>
<td align="center" valign="top">&nbsp;</td>
<td align="center" valign="top">&nbsp;</td>
<td align="left" valign="top">CHAR(8)</td>
<td align="left" valign="top">Node id</td>
</tr>
<tr>
<td align="center" valign="top">&nbsp;</td>
<td align="center" valign="top">&nbsp;</td>
<td align="left" valign="top">BINARY(4)</td>
<td align="left" valign="top">Offset to first cluster interface entry</td>
</tr>
<tr>
<td align="center" valign="top">&nbsp;</td>
<td align="center" valign="top">&nbsp;</td>
<td align="left" valign="top">BINARY(4)</td>
<td align="left" valign="top">Number of cluster interfaces</td>
</tr>
<tr>
<td align="LEFT" valign="TOP" colspan="2">This field is repeated for each
cluster interface.</td>
<td align="left" valign="top">CHAR(16)</td>
<td align="left" valign="top">Cluster interface address</td>
</tr>
</table>
<br>
<br>
<h3>Field Descriptions</h3>
<p><strong>Cluster interface address.</strong> The cluster interface address is
an IP address that is used by Cluster Resource Services to communicate with
other nodes in the cluster. The address is in dotted decimal format and is a
null-terminated string.</p>
<p><strong>Note:</strong> Cluster Resource Services uses existing IP interfaces
configured for an iSeries. See <a href="../rzai2/rzai2kickoff.htm">TCP/IP</a> for
instructions for configuring IP interfaces on the iSeries. The IP addresses
defined as cluster interface addresses can be used by other applications. If an
IP address is reconfigured through the TCP/IP configuration functions, the <a
href="clcntchgcne.htm">Change Cluster Node Entry (QcstChangeClusterNodeEntry)
API</a> should be used to make the corresponding change to the cluster
interface address. A mismatch will cause cluster errors to occur.</p>
<p><strong>Length of additional fields.</strong> The length of the additional
fields. This must be set to hexadecimal zeros. It will be used in a future
release.</p>
<p><strong>Length of node entry.</strong> The length of the node entry.</p>
<p><strong>Node id.</strong> A simple valid name that uniquely identifies a
node.</p>
<p><strong>Number of cluster interfaces.</strong> The number of IP interfaces
that are to be used by Cluster Resource Services. It is limited to 1 or 2
entries only.</p>
<p><strong>Offset to additional fields.</strong> The offset from the beginning
of the structure to the additional fields. This must be set to hexadecimal
zeros. It will be used in a future release.</p>
<p><strong>Offset to first cluster interface entry.</strong> The offset from
the beginning of the structure to the first cluster interface entry.</p>
<p><strong>Offset to first node entry.</strong> The offset from the beginning
of the structure to the first node entry.</p>
<p><strong>Target cluster version.</strong> The version the cluster will use in
conversation with the other nodes in the cluster. This also determines the
potential node version of the nodes allowed to join the cluster. The following
possible values are based on the node originating the request.</p>
<table cellpadding="5">
<!-- cols="5 95" -->
<tr>
<td align="left" valign="top"><em>0</em></td>
<td align="left" valign="top">The cluster will communicate at the requesting
node's potential node version. In addition, nodes with a potential node version
less than the requesting node will not be allowed to join the cluster.</td>
</tr>
<tr>
<td align="left" valign="top" nowrap><em>-1</em></td>
<td align="left" valign="top">The cluster will communicate at the requesting
node's potential node version minus 1. This allows nodes at a previous
potential node version to join the cluster. However, no new cluster function on
the node which has a newer version of the system software will be allowed to be
used.</td>
</tr>
</table>
<br>
<h3><a name="usage_notes">Usage Notes</a></h3>
<h4>Results Information User Queue</h4>
<p>Asynchronous results are returned to a user queue specified by the Results
Information parameter of the API. See <a href="clust1a4.htm">Cluster APIs Use of User Queues</a>
and <a href="clust1a5.htm">Using Results Information</a> for details on how to create the
results information user queue, the format of the entries, and how to use the
data placed on the queue. The data is sent to the user queue in the form of a
message identifier and the substitution data for the message (if any exists).
The following identifies the data sent to the user queue (excluding the message
text).</p>
<table width="100%" cellpadding="5">
<!-- cols="15 85" -->
<tr>
<th align="left" valign="top">Message ID</th>
<th align="left" valign="top">Message Text</th>
</tr>
<tr>
<td align="left" valign="top">CPCBB01 C</td>
<td align="left" valign="top">Cluster Resource Services API &amp;1
completed.</td>
</tr>
<tr>
<td align="left" valign="top">CPF3CF2 D</td>
<td align="left" valign="top">Error(s) occurred during running of &amp;1 API.</td>
</tr>
<tr>
<td align="left" valign="top">CPFBB05 D</td>
<td align="left" valign="top">Cluster node &amp;1 cannot be started.</td>
</tr>
<tr>
<td align="left" valign="top">CPFBB10 D</td>
<td align="left" valign="top">Specified cluster interface not defined on this system.</td>
</tr>
<tr>
<td align="left" valign="top">CPFBB12 D</td>
<td align="left" valign="top">Cluster node &amp;1 in cluster &amp;2 could not be
started.</td>
</tr>
<tr>
<td align="left" valign="top">CPFBB2D D</td>
<td align="left" valign="top">Timeout detected while waiting for a response.</td>
</tr>
<tr>
<td align="left" valign="top">CPFBB46 D</td>
<td align="left" valign="top">Cluster Resource Services internal error.</td>
</tr>
<tr>
<td align="left" valign="top">CPIBB01 I</td>
<td align="left" valign="top">Cluster &amp;1 created.</td>
</tr>
<tr>
<td align="left" valign="top">CPIBB03 I</td>
<td align="left" valign="top">Cluster node &amp;1 added to cluster &amp;2.</td>
</tr>
<tr>
<td align="left" valign="top">CPIBB05 I</td>
<td align="left" valign="top">Cluster node &amp;1 started in cluster &amp;2.</td>
</tr>
</table>
<br>
<h3>Error Messages</h3>
<p>Messages that are delivered
through the error code parameter are listed here. The data (messages) sent to
the results information user queue are listed in the <a href=
"#usage_notes">Usage Notes</a> above.</p>
<table width="100%" cellpadding="5">
<!-- cols="15 85" -->
<tr>
<th align="left" valign="top">Message ID</th>
<th align="left" valign="top">Error Message Text</th>
</tr>
<tr>
<td align="left" valign="top">CPF2113 E</td>
<td align="left" valign="top">Cannot allocate library &amp;1.</td>
</tr>
<tr>
<td align="left" valign="top">CPF3C1E E</td>
<td align="left" valign="top">Required parameter &amp;1 omitted.</td>
</tr>
<tr>
<td align="left" valign="top">CPF3C21 E</td>
<td align="left" valign="top">Format name &amp;1 is not valid.</td>
</tr>
<tr>
<td align="left" valign="top">CPF3C29 E</td>
<td align="left" valign="top">Object name &amp;1 is not valid.</td>
</tr>
<tr>
<td align="left" valign="top">CPF3C39 E</td>
<td align="left" valign="top">Value for reserved field not valid.</td>
</tr>
<tr>
<td align="left" valign="top">CPF3CF1 E</td>
<td align="left" valign="top">Error code parameter not valid.</td>
</tr>
<tr>
<td align="left" valign="top">CPF3CF2 E</td>
<td align="left" valign="top">Error(s) occurred during running of &amp;1 API.</td>
</tr>
<tr>
<td align="left" valign="top">CPF9801 E</td>
<td align="left" valign="top">Object &amp;2 in library &amp;3 not found.</td>
</tr>
<tr>
<td align="left" valign="top">CPF9802 E</td>
<td align="left" valign="top">Not authorized to object &amp;2 in &amp;3.</td>
</tr>
<tr>
<td align="left" valign="top">CPF9804 E</td>
<td align="left" valign="top">Object &amp;2 in library &amp;3 damaged.</td>
</tr>
<tr>
<td align="left" valign="top">CPF980C E</td>
<td align="left" valign="top">Object &amp;1 in library &amp;2 cannot be in an independent
auxiliary storage pool.</td>
</tr>
<tr>
<td align="left" valign="top">CPF9810 E</td>
<td align="left" valign="top">Library &amp;1 not found.</td>
</tr>
<tr>
<td align="left" valign="top">CPF9820 E</td>
<td align="left" valign="top">Not authorized to use library &amp;1.</td>
</tr>
<tr>
<td align="left" valign="top">CPF9872 E</td>
<td align="left" valign="top">Program or service program &amp;1 in library &amp;2 ended.
Reason code &amp;3.</td>
</tr>
<tr>
<td align="left" valign="top">CPFBB01 E</td>
<td align="left" valign="top">Cluster already exists.</td>
</tr>
<tr>
<td align="left" valign="top">CPFBB03 E</td>
<td align="left" valign="top">Number of cluster node entries not valid.</td>
</tr>
<tr>
<td align="left" valign="top">CPFBB04 E</td>
<td align="left" valign="top">Number of cluster interface addresses not valid.</td>
</tr>
<tr>
<td align="left" valign="top">CPFBB0C E</td>
<td align="left" valign="top">Cluster node ID &amp;1 specified more than once.</td>
</tr>
<tr>
<td align="left" valign="top">CPFBB0D E</td>
<td align="left" valign="top">Cluster interface address &amp;1 specified more than
once.</td>
</tr>
<tr>
<td align="left" valign="top">CPFBB32 E</td>
<td align="left" valign="top">Attributes of user queue &amp;1 in library &amp;2 are not
valid.</td>
</tr>
<tr>
<td align="left" valign="top">CPFBB39 E</td>
<td align="left" valign="top">Current user does not have IOSYSCFG special authority.</td>
</tr>
<tr>
<td align="left" valign="top">CPFBB44 E</td>
<td align="left" valign="top">&amp;1 API cannot be called from a cluster resource group exit
program.</td>
</tr>
<tr>
<td align="left" valign="top">CPFBB46 E</td>
<td align="left" valign="top">Cluster Resource Services internal error.</td>
</tr>
<tr>
<td align="left" valign="top">CPFBB55 E</td>
<td align="left" valign="top">Value &amp;1 specified for start indicator not valid.</td>
</tr>
<tr>
<td align="left" valign="top">CPFBB56 E</td>
<td align="left" valign="top">Length of node entry not valid.</td>
</tr>
<tr>
<td align="left" valign="top">CPFBB57 E</td>
<td align="left" valign="top">Offset to cluster interface entry not valid.</td>
</tr>
<tr>
<td align="left" valign="top">CPFBB5F E</td>
<td align="left" valign="top">Field value within structure is not valid.</td>
</tr>
<tr>
<td align="left" valign="top">TCP1901 E</td>
<td align="left" valign="top">Internet address &amp;1 not valid.</td>
</tr>
</table>
<br>
<hr>
API introduced: V4R4
<hr>
<center>
<table cellpadding="2" cellspacing="2">
<tr align="center">
<td valign="middle" align="center"><a href="#Top_Of_Page">Top</a> |
<a href="clust1a1.htm">Cluster APIs</a> | <a href="aplist.htm">APIs by
category</a></td>
</tr>
</table>
</center>
</body>
</html>