<html>

<head><script async src="//pagead2.googlesyndication.com/pagead/js/adsbygoogle.js"></script>
<!-- MyFirstUnitAd -->
<ins class="adsbygoogle"
     style="display:inline-block;width:970px;height:250px"
     data-ad-client="ca-pub-5778386704669218"
     data-ad-slot="1503492166"></ins>
<script>
(adsbygoogle = window.adsbygoogle || []).push({});
</script>

<meta http-equiv="Content-Language" content="zh-cn">
<meta http-equiv="Content-Type" content="text/html; charset=gb2312">
<meta name="GENERATOR" content="Microsoft FrontPage 5.0">
<meta name="ProgId" content="FrontPage.Editor.Document">
<title>Dependency</title>
</head>

<body>



<p align="left"><span lang="en-ca"><font size="6" color="#FF0000"><b>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
Dependency(candidateKey)</b></font></span></p>

<div align="left">
  <pre><b><font color="#ff0000" size="5">A. <span lang="en-ca">Third</span> Edition</font></b></pre>
</div>
<div align="left">
  <pre><span lang="en-ca"><b>This is the third edition of my &quot;dependency&quot; and I implemented the &quot;findKey&quot; method which calculates the </b></span></pre>
</div>
<div align="left">
  <pre><span lang="en-ca"><b>candidate key of relation schema.</b></span></pre>
</div>
<div align="left">
  <pre><b><font color="#ff0000" size="5"><span lang="en-ca">B</span>.<span lang="en-ca"><a name="problem"></a>The problem</span></font></b></pre>
</div>
<p ALIGN="LEFT"><span lang="en-ca"><font size="2"><b>&quot;Function dependency&quot; is a 
very important issue in database theory. And what's more, it is the essence of 
all.</b></font></span></p>
<p ALIGN="LEFT"><span lang="en-ca"><font size="2"><b>Because I think it is the 
key of knowledge: the world is described by relations and relations of 
relations.</b></font></span></p>
<div align="left">
  <p ALIGN="LEFT">　</div>
<div align="left">
  <b><font color="#ff0000" size="5"><span lang="en-ca"><a name="explain"></a>C</span>.<span lang="en-ca">The
  </span></font></b><span lang="en-ca"><font size="5" color="#FF0000"><b>idea of 
  program</b></font></span></div>
<div align="left">
  　</div>
<div align="left">
  <span lang="en-ca"><font size="2"><b>Candidate key is calculated this way:</b></font></span></div>
<div align="left">
  　</div>
<div align="left">
  <span lang="en-ca"><font size="2"><b>1. Find all attributes that doesn't 
  appear right-hand-side of any dependency.</b></font></span></div>
<div align="left">
  　</div>
<div align="left">
  <span lang="en-ca"><font size="2"><b>2. From '1' get its complement set, and 
  for all its subset, union with '1' to calculate its closure. If the </b>
  </font></span></div>
<div align="left">
  　</div>
<div align="left">
  <span lang="en-ca"><font size="2"><b>closure is equal to whole set of 
  attributes, it is a superkey. </b></font></span></div>
<div align="left">
  　</div>
<div align="left">
  <span lang="en-ca"><font size="2"><b>3. In order to be a candidate key, make 
  sure the subset of superkey is not a candidate key. So, at '2', starting</b></font></span></div>
<div align="left">
  　</div>
<div align="left">
  <span lang="en-ca"><font size="2"><b>from the smallest subset---empty set. 
  Whenever you get a union from subset, test if it contains any found </b>
  </font></span></div>
<div align="left">
  　</div>
<div align="left">
  <span lang="en-ca"><font size="2"><b>candidate key. If yes, skip it. </b>
  </font></span></div>
<div align="left">
  　</div>
<div align="left">
  <pre><b><font color="#ff0000" size="5">D.<span lang="en-ca"><a name="Method"></a>The </span>major functions</font></b></pre>
</div>
<div align="left">
  <pre><span lang="en-ca"><b>Now you will find it is extremely useful for me to overload those operators for &quot;Set&quot;.</b></span></pre>
</div>
<div align="left">
  <pre><b><font color="#ff0000" size="5"><span lang="en-ca">E</span>.</font></b><span lang="en-ca"><font size="5" color="#FF0000"><b>Further improvement</b></font></span></pre>
</div>
<div align="left">
  <pre>　</pre>
</div>
<div align="left">
  <pre><b><font color="#ff0000" size="5"><span lang="en-ca">F</span>.</font></b><span lang="en-ca"><font size="5" color="#FF0000"><b>File listing</b></font></span></pre>
</div>
<div align="left" style="width: 898; height: 86">
  <pre><font size="3"><b>1<span lang="en-ca">. rules.h </span></b></font></pre>
  <pre><span lang="en-ca"><font size="3"><b>2</b></font></span><font size="3"><b><span lang="en-ca">. rules.</span></b></font><span lang="en-ca"><font size="3"><b>cpp</b></font></span></pre>
  <pre><span lang="en-ca"><font size="3"><b>3</b></font></span><font size="3"><b><span lang="en-ca">. set.h</span></b></font></pre>
  <pre><span lang="en-ca"><font size="3"><b>4</b></font></span><font size="3"><b><span lang="en-ca">. set.</span></b></font><span lang="en-ca"><font size="3"><b>cpp</b></font></span></pre>
  <pre><span lang="en-ca"><font size="3"><b>5</b></font></span><font size="3"><b><span lang="en-ca">. main.cpp (main)</span></b></font></pre>
</div>
<div align="left">
  <pre><span lang="en-ca"><font size="3" color="#FF0000"><b>file name: set.h</b></font></span></pre>
</div>
<pre>#ifndef SET_H
#define SET_H

#include &lt;iostream&gt;
#include &lt;bitset&gt;

using namespace std;


const int MaxAttrNumber=20;

class Set
{
	//this is a long-pain for me, I have no other way to 
	//let compiler recognize this &quot;friend&quot; function outside declaration
	friend ostream&amp; operator&lt;&lt;(ostream&amp; out, const Set&amp; dummy)	
	{
		for (int i=0; i&lt;dummy.size; i++)
		{
			if (dummy.theSet.test(i))
			{
				out&lt;&lt;'1';
			}
			else
			{
				out&lt;&lt;'0';
			}
		}
		return out;
	}
private:
	bitset&lt;MaxAttrNumber&gt; theSet;
	int size;
	int current;
public:
	void setSize(const Set&amp; dummy);
	int getSize(){ return size;}
	int next(int current);
	int first();	
	int count();
	Set intersection(const Set&amp; dummy);
	Set unionSet(const Set&amp; dummy);
	Set difference(const Set&amp; dummy);
	
	//I am crazy about operator overloading!!!:)
	Set operator-(const Set&amp; dummy);
	Set operator+(const Set&amp; dummy);
	Set operator*(const Set&amp; dummy);
	void operator=(const Set&amp; dummy);
	bool operator==(const Set&amp; dummy);
	bool operator!=(const Set&amp; dummy);
	bool operator&gt;(const Set&amp; dummy);
	bool operator&gt;=(const Set&amp; dummy);
	bool operator&lt;(const Set&amp; dummy);
	bool operator&lt;=(const Set&amp; dummy);
	void set(int pos);
	void forEachSubSet(Set&amp; dummy);//must be called before &quot;eachSub()&quot;
	bool eachSub(Set&amp; dummy);
	void set();
	void reset(int pos);
	void reset();
	bool test(int pos) const;
	bool isIn(const Set&amp; dummy);
	void setSize(int theSize) {size=theSize;}
	Set(int theSize=10);
};

#endif</pre>
<pre>　</pre>
  <pre><span lang="en-ca"><font size="3" color="#FF0000"><b>file name: set.cpp</b></font></span></pre>
<pre>#include &quot;Set.h&quot;

bool Set::isIn(const Set&amp; dummy)
{
	for (int i=0; i&lt;size; i++)
	{
		if (theSet.test(i))
		{
			if (!dummy.test(i))//here I use Set.test() instead of set.test()
			{
				return false;
			}
		}
	}
	return true;		
}

bool Set::test(int pos) const
{
	return (pos&lt;size&amp;&amp;theSet.test(pos));
}

//current=-1;//initialize to -1 to prepare for being called
int Set::next(int current)
{
	for (int i=current+1; i&lt;size; i++)//include situation current&gt;=size
	{
		if (theSet.test(i))
		{
			return i;
		}
	}
	return -1;//not found
}

bool Set::operator !=(const Set&amp; dummy)
{
	return !(this-&gt;operator ==(dummy));
}

bool Set::operator &lt;(const Set&amp; dummy)
{
	return (this-&gt;isIn(dummy)&amp;&amp;this-&gt;operator !=(dummy));
}

bool Set::operator &lt;=(const Set&amp; dummy)
{
	return isIn(dummy);
}

bool Set::operator &gt;(const Set&amp; dummy)
{
	return !(this-&gt;operator &lt;=(dummy));
}

bool Set::operator &gt;=(const Set&amp; dummy)
{
	return !(this-&gt;operator &lt;(dummy));
}

bool Set::operator ==(const Set&amp; dummy)
{
	for (int i=0; i&lt;(size&gt;dummy.size?size:dummy.size); i++)
	{
		if (test(i)^dummy.test(i))
		{
			return false;
		}
	}
	return true;
}

void Set::setSize(const Set&amp; dummy)
{
	size=dummy.size;
}

void Set::operator =(const Set&amp; dummy)
{
	size=dummy.size;
	for (int i=0; i&lt;size; i++)
	{
		if (dummy.test(i))
		{
			theSet.set(i);
		}
		else
		{
			theSet.reset(i);
		}
	}
}


Set::Set(int theSize)
{
	size=theSize;
	reset();
}

void Set::reset()
{
	for (int i=0; i&lt;size; i++)
	{
		theSet.reset(i);
	}
}

void Set::reset(int pos)
{
	if (pos&lt;size)
	{
		theSet.reset(pos);
	}
}

void Set::set()
{
	theSet.set();
}

void Set::set(int pos)
{
	theSet.set(pos);
}
	
void Set::forEachSubSet(Set&amp; dummy)
{
	dummy.size=size;
	dummy.reset();//emptyset
}


bool Set::eachSub(Set&amp; dummy)
{
	int index=first();//starting from very first

	while (index!=-1)//not exceeding boundery
	{
		if (dummy.test(index))
		{
			dummy.reset(index);
			index=next(index);
		}
		else
		{
			dummy.set(index);
			if (dummy&lt;*this)
			{
				return true;
			}
		}
	}
	return false;
}

int Set::first()
{
	return next(-1);
}

int Set::count()
{
	return theSet.count();
}

Set Set::unionSet(const Set&amp; dummy)
{
	Set result;
	result.size=size&gt;dummy.size?size:dummy.size;
	for (int i=0; i&lt;result.size; i++)
	{
		if (test(i)||dummy.test(i))
		{
			result.set(i);
		}
	}
	return result;//this is a temparory object;
}

Set Set::difference(const Set&amp; dummy)
{
	Set result;
	result.size=size&gt;dummy.size?size:dummy.size;
	for (int i=0; i&lt;result.size; i++)
	{
		if (test(i)&amp;&amp;!dummy.test(i))
		{
			result.set(i);
		}
	}
	return result;
}

Set Set::operator +(const Set&amp; dummy)
{
	return unionSet(dummy);
}

Set Set::operator -(const Set&amp; dummy)
{
	return difference(dummy);
}

Set Set::intersection(const Set&amp; dummy)
{
	Set result;
	result.size=size&lt;dummy.size?size:dummy.size;
	for (int i=0; i&lt;result.size; i++)
	{
		if (test(i)&amp;&amp;dummy.test(i))
		{
			result.set(i);
		}
	}
	return result;
}

Set Set::operator *(const Set&amp; dummy)
{
	return intersection(dummy);
}

</pre>
<pre>
</pre>
<pre></pre>
  <pre><span lang="en-ca"><font size="3" color="#FF0000"><b>file name: rules.h </b></font></span></pre>
<pre>#include &lt;iostream&gt;
#include &lt;bitset&gt;
#include &quot;set.h&quot;

using namespace std;

//make it simple, the first line must list all variables or attributes
//&quot;relation&quot;(A,B,C...)
const int MaxNameLength=5;
const int MaxRuleNumber=100;
const int MaxKeyNumber=10;




class Rule
{
	friend class Rules;
private:
	Set lhs;
	Set rhs;	
public:	
	Rule();
	bool test(int pos, bool isLeft);
	void lhsSet(int pos);
	void rhsSet(int pos);
	void setSize(int theSize);
	void set(int pos, bool isLeft);
	void setRule(const Set&amp; left, const Set&amp; right);
	void operator=(const Rule&amp; dummy);
};

class Rules
{
private:
	Set leftSet;
	Set rightSet;
	Set attrClosure[MaxAttrNumber];
	char attributes[MaxAttrNumber][MaxNameLength+1];
	char relationName[MaxNameLength+1];
	int keyCount;
	int attrCount;
	int attrFound[MaxAttrNumber];
	int numberFound;
	int searchByChar(char ch, int step);
	void ruleReading(FILE* stream);
	Rule rules[MaxRuleNumber];
	int ruleNumber;
	void displayRule(int index);
	
	void calcClosure();
	//void doCalcClosure(Set&amp; attrSet, int maskedRule);
	void addRule(const Set&amp; left, const Set&amp; right);
	int extractNames(FILE* stream, char* delimeters, char endChar='\n');
	void closure(Set&amp; attrSet, int maskedRule);
public:
	void split();
	Set candidateKey[MaxKeyNumber];
	void addRule(const Rule&amp; dummy);
	void readFile(const char* fileName);
	void display();
	void display(const Set&amp; attrSet);
	int findKey();
	bool eachKey(Set&amp; dummy);
	Rules();
};
</pre>

<pre><span lang="en-ca"><font size="3" color="#FF0000"><b>file name: rules.cpp </b></font></span></pre>

<pre>#include &quot;Rules.h&quot;

int Rules::findKey()
{
	Set theLeft, theRight;
	bool isSub;
	leftSet.setSize(attrCount);
	rightSet.setSize(attrCount);
	leftSet.set();//the universal set
	rightSet.reset();//the empty set
	for (int i=0; i&lt;ruleNumber; i++)
	{
		rightSet= rightSet+rules[i].rhs;
	}
	rightSet=leftSet-rightSet;//rightSet is the minimum part of candidate key
	leftSet=leftSet-rightSet;//leftSet is the difference of rightSet,should be added to key
	keyCount=0;
	theRight=rightSet;
	theLeft=leftSet;

	closure(theRight, -1);
	if (theRight.count()==attrCount)//the only key
	{
		candidateKey[keyCount++]=rightSet;		
	}
	else
	{
		leftSet.forEachSubSet(theLeft);
		while (leftSet.eachSub(theLeft))
		{
			isSub=false;
			theRight=rightSet;
			theRight=theRight+theLeft;
			for (int i=0; i&lt;keyCount; i++)
			{
				//display(theRight);
				//display(candidateKey[i]);
				if (candidateKey[i]&lt;theRight)
				{
					isSub=true;
					break;
				}
			}
			if (isSub)
			{
				continue;//if subset of any candidate key, no need to test
			}
			Set temp;
			temp=theRight;
			closure(temp, -1);
			if (temp.count()==attrCount)
			{
				candidateKey[keyCount++]=theRight;
			}

		}
	}	
	return keyCount;
}

void Rules::calcClosure()
{
	for (int i=0; i&lt;attrCount; i++)
	{
		attrClosure[i].setSize(attrCount);
		attrClosure[i].reset();
		attrClosure[i].set(i);
		closure(attrClosure[i], -1);
	}
}

void  Rules::closure(Set&amp; attrSet, int maskedRule)
{
	bool found=false;
	int i=0;
	do 
	{
		i=0;
		found=false;
		while (i&lt;ruleNumber)
		{
			if (i!=maskedRule)//this rule will not be calculated
			{
				if (rules[i].lhs&lt;=attrSet)//lhs is contained
				{
					if ((attrSet*rules[i].rhs)!=rules[i].rhs)
					{
						attrSet=attrSet+rules[i].rhs;
						found=true;
					}
				}
			}
			i++;
		}
	}
	while (found);
}

void Rules::display(const Set&amp; attrSet)
{
	bool first=true;
	cout&lt;&lt;&quot;{&quot;;
	for (int i=0; i&lt;attrCount; i++)
	{
		
		if (attrSet.test(i))
		{
			if (first)
			{
				first=false;
			}
			else
			{
				cout&lt;&lt;&quot;,&quot;;
			}
			cout&lt;&lt;attributes[i];
		}
	}
	cout&lt;&lt;&quot;}&quot;;
}

void Rules::display()
{
	cout&lt;&lt;&quot;\nnow display\n&quot;;
	cout&lt;&lt;relationName&lt;&lt;&quot;(&quot;;
	for (int i=0; i&lt;attrCount; i++)
	{
		cout&lt;&lt;attributes[i];
		if (i!=attrCount-1)
		{
			cout&lt;&lt;&quot;,&quot;;
		}
		else
		{
			cout&lt;&lt;&quot;);\n&quot;;
		}
	}
	for (i=0; i&lt;ruleNumber; i++)
	{
		displayRule(i);
	}
}


bool Rule::test(int pos, bool isLeft)
{
	if (isLeft)
	{
		return lhs.test(pos);
	}
	else
	{
		return rhs.test(pos);
	}
}


void Rules::displayRule(int index)
{
	for (int i=0; i&lt;attrCount; i++)
	{
		if (rules[index].test(i, true))
		{
			cout&lt;&lt;attributes[i];
		}
	}
	cout&lt;&lt;&quot; -&gt; &quot;;
	for (i=0; i&lt;attrCount; i++)
	{
		if (rules[index].test(i, false))
		{
			cout&lt;&lt;attributes[i];
		}
	}
	cout&lt;&lt;&quot;;\n&quot;;
}


void Rule::set(int pos, bool isLeft)
{
	if (isLeft)
	{
		lhsSet(pos);
	}
	else
	{
		rhsSet(pos);
	}
}

void Rule::rhsSet(int pos)
{
	rhs.set(pos);
}

void Rule::lhsSet(int pos)
{
	lhs.set(pos);
}

Rule::Rule()
{
	lhs.reset();
	rhs.reset();
	
}


void Rules::readFile(const char* fileName)
{
	FILE* stream;
	stream=fopen(fileName, &quot;r&quot;);
	attrCount=extractNames(stream, &quot;=,()&quot;, ';');//ignore the first relation name
	ruleReading(stream);

}

void Rules::ruleReading(FILE* stream)
{
	char ch;
	int step=0;
	ruleNumber=0;//initialize
	bool isLeft=true;
	rules[ruleNumber].setSize(attrCount);//do twice!!
	while (!feof(stream))
	{		
		ch=fgetc(stream);
		if (ch==';'||ch==',')
		{
			ruleNumber++;
			rules[ruleNumber].setSize(attrCount);//do twice!!
			isLeft=true;
		}
		else
		{
			if (ch=='-'||ch=='&gt;')
			{
				isLeft=false;
			}
			else
			{
				if (isalpha(ch))
				{
					searchByChar(ch, step);
					if (numberFound!=1)
					{
						if (step&lt;MaxNameLength)
						{
							step++;
						}
						else
						{
							cout&lt;&lt;&quot;illegal attribute stated!\n&quot;;
							exit(1);
						}
					}
					else
					{
						step=0;
						
						rules[ruleNumber].set(attrFound[0], isLeft);
					}
				}
			}
		}
	}
}

void Rule::setSize(int theSize)
{
	lhs.setSize(theSize);
	rhs.setSize(theSize);
}
	

int Rules::searchByChar(char ch, int step)
{
	if (step==0)//this is first time, and all attributes are searched
	{
		numberFound=0;
		for (int i=0; i&lt;attrCount; i++)//
		{
			if (ch==attributes[i][step])
			{
				attrFound[numberFound]=i;
				numberFound++;
			}
		}
	}
	else
	{
		int number=0;//new 'attrFound' re-counting
		for (int i=0; i&lt;numberFound; i++)
		{
			if (ch==attributes[attrFound[i]][step])
			{
				attrFound[number]=i;
				number++;
			}
		}
		numberFound=number;
	}
	return numberFound;
}


int findChar(char ch, char* str)
{
	int index=0;
	while (str[index]!='\0')
	{
		if (str[index]==ch)
		{
			return index;
		}
		index++;
	}
	return -1;
}

//extract names from a line delimetered by various chars, like ',','(',')'....
int Rules::extractNames(FILE* stream, char* delimeters, char endChar)
{
	int findChar(char ch, char* str);
	char ch;
	int nameIndex=0;
	char buffer[MaxNameLength+1];
	char* ptr=buffer;

	while (!feof(stream))
	{
		ch=getc(stream);
		if (ch==endChar)
		{
			if (ptr!=buffer)
			{
				*ptr='\0';
				strcpy(attributes[nameIndex], buffer);
			}
			break;
		}

		if (findChar(ch, delimeters)&gt;0)//deli reached
		{
			//skip the consecutive deli
			if (ptr!=buffer)
			{
				*ptr='\0';	
				if (ch=='(')//the very first one
				{
					strcpy(relationName, buffer);
				}
				else
				{
					strcpy(attributes[nameIndex], buffer);
					nameIndex++;
				}
				ptr=buffer;//restart
			}
		}
		else
		{
			*ptr=ch;
			ptr++;
		}
	}
	return nameIndex;
}		

Rules::Rules()
{
	numberFound=attrCount=0;
}
	
void Rule::operator =(const Rule&amp; dummy)
{
	lhs=dummy.lhs;
	rhs=dummy.rhs;
}

void Rules::addRule(const Rule&amp; dummy)
{
	rules[ruleNumber++]=dummy;
}

void Rules::addRule(const Set&amp; left, const Set&amp; right)
{
	rules[ruleNumber++].setRule(left, right);
}

void Rule::setRule(const Set&amp; left, const Set&amp; right)
{
	lhs=left;
	rhs=right;
}

void Rules::split()
{
	int index;
	for (int i=0; i&lt;ruleNumber; i++)
	{
		if (rules[i].rhs.count()&gt;1)
		{			
			index=rules[i].rhs.first();
			index=rules[i].rhs.next(index);//starting from second one
			while (index!=-1)
			{
				Set right;				
				right.setSize(rules[i].rhs);
				right.set(index);
				rules[i].rhs.reset(index);//remove from old rule
				addRule(rules[i].lhs, right);
				index=rules[i].rhs.next(index);
			}
		}
	}
}

</pre>

<pre><span lang="en-ca"><font size="3" color="#FF0000"><b>file name: main.cpp (main)</b></font></span></pre>

<pre>#include &quot;Rules.h&quot;
#include &quot;set.h&quot;

int main()
{
	int number;
	Rules R;
	R.readFile(&quot;d:\\rules.txt&quot;);
	R.split();
	R.display();
	
	
	number=R.findKey();
	for (int i=0; i&lt;number; i++)
	{
		R.display(R.candidateKey[i]);
		cout&lt;&lt;&quot;\n&quot;;
	}
	R.display();



	return 0;
}</pre>
<pre>　</pre>

<pre><b><font color="#FF0000"><span lang="en-ca">The testing rules is like this: (name of file is &quot;rules.txt&quot;)</span></font></b></pre>

<pre><span lang="en-ca">R(A,B,C,D,E,H);
A-&gt;B;
DE-&gt;A;
BC-&gt;E;
BCD-&gt;A;
AED-&gt;BH;</span></pre>

<pre><b><font color="#FF0000"><span lang="en-ca">The result of program is: (Please note that &quot;split&quot; is for calculating canonical cover which is to be finished.)</span></font></b></pre>

<pre><span lang="en-ca">
now display
R(A,B,C,D,E,H);
A -&gt; B;
DE -&gt; A;
BC -&gt; E;
BCD -&gt; A;
ADE -&gt; B;
ADE -&gt; H;
{A,C,D}
{B,C,D}
{C,D,E}

now display
R(A,B,C,D,E,H);
A -&gt; B;
DE -&gt; A;
BC -&gt; E;
BCD -&gt; A;
ADE -&gt; B;
ADE -&gt; H;
Press any key to continue</span></pre>

<pre>　</pre>

<pre>　</pre>

<pre></pre>

<pre></pre>

<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;                                   
&nbsp;&nbsp;&nbsp; <a href="game24.htm">                  







                       <img src="picture/back.gif" style="border: medium none" alt="back.gif (341 bytes)" width="32" height="35"></a>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
<a href="index.htm">
<img src="picture/up.gif" style="border: medium none" alt="up.gif (335 bytes)" width="35" height="32"></a>       &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;                         
<img src="picture/next.gif" style="border: medium none" alt="next.gif (337 bytes)" width="32" height="35">          


</p>

</body>

</html>