<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<HTML><HEAD>
<META content="text/html; charset=us-ascii" http-equiv=Content-Type>
<META name=GENERATOR content="MSHTML 8.00.7600.16722"></HEAD>
<BODY>
<DIV dir=ltr align=left><FONT color=#0000ff size=2 face=Verdana><SPAN
class=420542514-13042011>You can use the </SPAN></FONT></DIV>
<DIV dir=ltr align=left><FONT color=#0000ff size=2 face=Verdana><SPAN
class=420542514-13042011></SPAN></FONT> </DIV>
<DIV dir=ltr align=left><FONT color=#0000ff><SPAN class=420542514-13042011><FONT
color=#808080><FONT color=#808080>
<P><FONT size=2 face=Verdana>itkMemoryProbesCollectorBase</FONT></P>
<P><SPAN class=420542514-13042011><FONT color=#0000ff size=2 face=Verdana>to
watch your memory. I also use time probe. Define following as global on top of
your code:</FONT></SPAN></P>
<P><SPAN class=420542514-13042011><FONT color=#808080><FONT color=#808080><FONT
size=2>itk::MemoryProbesCollectorBase g_oMemorymeter;</FONT></P><FONT
color=#808080><FONT color=#808080 size=2>
<P>itk::TimeProbesCollectorBase g_oChronometer; </P></FONT></FONT><FONT
color=#808080><FONT color=#808080>
<P><FONT size=2>#define itkProbesStart( text ) std::cout << "Begin: "
<< text << std::endl; g_oChronometer.Start( text );
g_oMemorymeter.Start( text )</FONT></P>
<P><FONT size=2>#define itkProbesStop( text ) std::cout << "End: "
<< text << std::endl; g_oChronometer.Stop( text );
g_oMemorymeter.Stop( text )</FONT></P>
<P><FONT size=2>#define itkProbesReport( stream ) g_oChronometer.Report( stream
); g_oMemorymeter.Report( stream )</FONT></P></FONT></FONT>
<P><FONT color=#0000ff size=2 face=Verdana><SPAN class=420542514-13042011>In
your code you can use it like this</SPAN></FONT></P><FONT color=#0000ff><SPAN
class=420542514-13042011>
<P><FONT color=#808080 size=2 face=Verdana>itkProbesStart( <SPAN
class=420542514-13042011>"Step1"</SPAN>)</FONT></P>
<P><SPAN class=420542514-13042011><FONT color=#808080 size=2 face=Verdana>do
something</FONT></SPAN></P>
<P><FONT color=#808080 size=2 face=Verdana>itkProbesStart( <SPAN
class=420542514-13042011>"Step1-1"</SPAN>)</FONT></P>
<P><SPAN class=420542514-13042011><FONT color=#808080 size=2 face=Verdana>do
something</FONT></SPAN></P><SPAN class=420542514-13042011>
<P><FONT color=#808080 size=2 face=Verdana>itkProbesSt<SPAN
class=420542514-13042011>op</SPAN>( <SPAN
class=420542514-13042011>"Step1-1</SPAN> )</FONT></P></SPAN>
<P><FONT color=#808080 size=2 face=Verdana>itkProbesStart( <SPAN
class=420542514-13042011>"Step1-2</SPAN> )</FONT></P>
<P><SPAN class=420542514-13042011><FONT color=#808080 size=2 face=Verdana>do
something</FONT></SPAN></P><SPAN class=420542514-13042011>
<P><FONT color=#808080 size=2 face=Verdana>itkProbesSt<SPAN
class=420542514-13042011>op</SPAN>( <SPAN
class=420542514-13042011>"Step1-2</SPAN> )</FONT></P>
<P><FONT color=#808080 size=2 face=Verdana>itkProbesSt<SPAN
class=420542514-13042011>op</SPAN>( <SPAN
class=420542514-13042011>"Step1</SPAN> )</FONT></P></SPAN>
<P><FONT color=#808080 size=2 face=Verdana>itkProbesStart( <SPAN
class=420542514-13042011>"Step2"</SPAN>)</FONT></P>
<P><FONT color=#808080 size=2 face=Verdana>itkProbesSt<SPAN
class=420542514-13042011>op</SPAN>( <SPAN
class=420542514-13042011>"Step2"</SPAN>)</FONT></P></SPAN></FONT>
<P><FONT size=2><SPAN
class=420542514-13042011>itkProbesReport(std::cout);</SPAN></FONT></P></FONT></FONT></SPAN></FONT></FONT></SPAN></FONT></DIV>
<DIV><FONT color=#0000ff size=2 face=Verdana></FONT> </DIV>
<DIV><FONT color=#808080 size=2></FONT> </DIV>
<DIV><FONT color=#808080 size=2></FONT> </DIV>
<DIV><BR></DIV>
<DIV dir=ltr lang=de class=OutlookMessageHeader align=left>
<HR tabIndex=-1>
<FONT size=2 face=Tahoma><B>Von:</B> insight-users-bounces@itk.org
[mailto:insight-users-bounces@itk.org] <B>Im Auftrag von </B>Melanie
Uks<BR><B>Gesendet:</B> Mittwoch, 13. April 2011 16:25<BR><B>An:</B>
insight-users@itk.org<BR><B>Betreff:</B> Re: [Insight-users] Memory
problem<BR></FONT><BR></DIV>
<DIV></DIV>Thanks for your replies.<BR><BR>Neil, I splitted the image and
repeated the process (see the code at the end of my e-mail). The strange thing I
totally don't understand is why the processing is working when I run just this
processing in a separate programm and not when I include the processing as a
"function" in my acutal program.In the separate program it is just working when
I split the image in 4 parts.<BR><BR>Gerald, I used now for every filter:
filter->SetReleaseDataFlag(true);<BR>There was no difference... unfortunately
:-(<BR><BR><BR>
<DIV class=gmail_quote>2011/4/13 Lodron, Gerald <SPAN dir=ltr><<A
href="mailto:Gerald.Lodron@joanneum.at">Gerald.Lodron@joanneum.at</A>></SPAN><BR>
<BLOCKQUOTE
style="BORDER-LEFT: #ccc 1px solid; MARGIN: 0px 0px 0px 0.8ex; PADDING-LEFT: 1ex"
class=gmail_quote>
<DIV>
<DIV dir=ltr align=left><SPAN><FONT color=#0000ff size=2 face=Verdana>itk uses
pipelining which means that there is one image in memory after each filtering.
So when you have</FONT></SPAN></DIV>
<DIV dir=ltr align=left><SPAN><FONT color=#0000ff size=2
face=Verdana></FONT></SPAN> </DIV>
<DIV dir=ltr align=left><SPAN><FONT color=#0000ff size=2
face=Verdana>->image->filter1->filter2->filter3</FONT></SPAN></DIV>
<DIV dir=ltr align=left><SPAN><FONT color=#0000ff size=2
face=Verdana></FONT></SPAN> </DIV>
<DIV dir=ltr align=left><SPAN><FONT color=#0000ff size=2 face=Verdana>you get
the memory of the image 4 times. If you want to release the memory after each
filter step you can use the release data flag of each filter
(SetReleaseDataFlagOn). Then you hage the memory only one
time</FONT></SPAN></DIV>
<DIV dir=ltr align=left><SPAN><FONT color=#0000ff size=2
face=Verdana></FONT></SPAN> </DIV>
<DIV dir=ltr align=left><SPAN><FONT color=#0000ff size=2 face=Verdana>If you
have an image of 300x300x512x3 with float (4 byte) you have 527 MB memory per
image, windows 32 theoretically only allows propgramms 2GB (in my tests this
theoretically is 1.2 GB in practice) so you only can have the image stored
into two vairables, in the third time the allocation will
fail!</FONT></SPAN></DIV>
<DIV dir=ltr align=left><SPAN><FONT color=#0000ff size=2
face=Verdana></FONT></SPAN> </DIV>
<DIV dir=ltr align=left><SPAN><FONT color=#0000ff size=2 face=Verdana>Another
solution is to use the RequestedRegion instead of largestpossibleregion but
this is not supported for all filters. here only a part of an image is loaded
and processed...I have no experience with this</FONT></SPAN></DIV>
<DIV dir=ltr align=left><SPAN><FONT color=#0000ff size=2
face=Verdana></FONT></SPAN> </DIV>
<DIV dir=ltr align=left><SPAN></SPAN><SPAN><FONT color=#0000ff size=2
face=Verdana>best regards</FONT></SPAN></DIV><BR>
<DIV dir=ltr lang=de align=left>
<HR>
<FONT size=2 face=Tahoma><B>Von:</B> <A
href="mailto:insight-users-bounces@itk.org"
target=_blank>insight-users-bounces@itk.org</A> [mailto:<A
href="mailto:insight-users-bounces@itk.org"
target=_blank>insight-users-bounces@itk.org</A>] <B>Im Auftrag von </B>Melanie
Uks<BR><B>Gesendet:</B> Mittwoch, 13. April 2011 15:34<BR><B>An:</B> <A
href="mailto:insight-users@itk.org"
target=_blank>insight-users@itk.org</A><BR><B>Betreff:</B> Re: [Insight-users]
Memory problem<BR></FONT><BR></DIV>
<DIV>
<DIV></DIV>
<DIV class=h5>
<DIV></DIV>Sorry, I don't have that much expertice: what does "individual
chunks" mean and how to implement?<BR><BR>
<DIV class=gmail_quote>2011/4/13 Neil Panjwani <SPAN dir=ltr><<A
href="mailto:paniwani@gmail.com"
target=_blank>paniwani@gmail.com</A>></SPAN><BR>
<BLOCKQUOTE
style="BORDER-LEFT: #ccc 1px solid; MARGIN: 0px 0px 0px 0.8ex; PADDING-LEFT: 1ex"
class=gmail_quote>I had similar memory allocation problems when running
several CT slices in 32 bit. If you can, using 64-bit should solve your
memory problems.
<DIV><BR></DIV>
<DIV>Otherwise, I think you'd have to apply your algorithm on individual
chunks at a time and combine them at the end.
<DIV>
<DIV></DIV>
<DIV><BR><BR>
<DIV class=gmail_quote>On Wed, Apr 13, 2011 at 9:22 AM, Melanie Uks <SPAN
dir=ltr><<A href="mailto:meluks2010@googlemail.com"
target=_blank>meluks2010@googlemail.com</A>></SPAN> wrote:<BR>
<BLOCKQUOTE
style="BORDER-LEFT: #ccc 1px solid; MARGIN: 0px 0px 0px 0.8ex; PADDING-LEFT: 1ex"
class=gmail_quote>I am running 32 bit.
<DIV>
<DIV></DIV>
<DIV><BR><BR>
<DIV class=gmail_quote>2011/4/13 Neil Panjwani <SPAN dir=ltr><<A
href="mailto:paniwani@gmail.com"
target=_blank>paniwani@gmail.com</A>></SPAN><BR>
<BLOCKQUOTE
style="BORDER-LEFT: #ccc 1px solid; MARGIN: 0px 0px 0px 0.8ex; PADDING-LEFT: 1ex"
class=gmail_quote>Are you running in 32 or 64 bit?<BR><BR>
<DIV class=gmail_quote>
<DIV>
<DIV></DIV>
<DIV>On Wed, Apr 13, 2011 at 4:47 AM, Melanie Uks <SPAN dir=ltr><<A
href="mailto:meluks2010@googlemail.com"
target=_blank>meluks2010@googlemail.com</A>></SPAN>
wrote:<BR></DIV></DIV>
<BLOCKQUOTE
style="BORDER-LEFT: #ccc 1px solid; MARGIN: 0px 0px 0px 0.8ex; PADDING-LEFT: 1ex"
class=gmail_quote>
<DIV>
<DIV></DIV>
<DIV>Hi all,<BR><BR>I tried to filter a 3D image (300x300x512) with
the CannyEdgeFilter. I had the problem that I could not allocate the
memory for the filtering. Anyway I don't like the CannyEdgeFilter
Implementation as one has to guess which values to take for the
thresholding before the gradientmagnitude image exists... Therefore I
wanted to write my own edge detection routine.<BR><BR>The steps:<BR>I
generate a image (size: 300x300x512)<BR>I generate a vector image
(size: 300x300x512, vector dimension:3)<BR>a) I split the image,
process the imagepart with GradientRecursiveGaussianImageFilter<BR>b)
I paste the processed imagepart in the vector image with the
PasteImageFilter<BR>I repeat a) and b) until the whole image is
processed<BR><BR>Now the first question: Why can't I process the
complete image. I have to split the image and get a result... This is
the error I get:<BR><FONT size=1><I>itk::ExceptionObject
(0151C728)<BR>Location: "class itk::CovariantVector<float,3>
*__thiscall itk::ImportImageConta<BR>iner<unsigned long,class
itk::CovariantVector<float,3>
>::AllocateElements(unsig<BR>ned long) const"<BR>File:
h:\itk\insighttoolkit-3.16.0\code\common\itkImportImageContainer.txx<BR>Line:
188<BR>Description: Failed to allocate memory for
image.</I></FONT><BR><BR>Ok, if I accept that I have to split the
image, I have a second question: I was able to run my example programm
(code at the end of this mail). Then I copied the code into my actual
program. It is a programm with several itk functions and Qt GUI. The
only difference is that the image is saved as global variable. I was
not able to run the processing. I always had the memory error.
Why???<BR><BR>Here now the code for the example
processing:<BR><BR>edgetest.cxx<BR><BR><FONT size=1>#include
"conio.h"<BR><BR>#include "itkImageFileWriter.h"<BR>#include
"itkImageFileReader.h"<BR>#include
"itkRegionOfInterestImageFilter.h"<BR>#include
"itkGradientRecursiveGaussianImageFilter.h"<BR>#include
"itkGradientToMagnitudeImageFilter.h"<BR>#include
"itkPasteImageFilter.h"<BR>#include "itkImage.h"<BR><BR>int main(int
argc, char* argv[])<BR>{ <BR> // Verify number of
parameters in command line<BR> // if( argc < 3
)<BR> // {<BR> // std::cerr
<< "Usage: " << std::endl;<BR> //
std::cerr << argv[0] << " inputImageFile
outputVectorImageFile " << std::endl;<BR> //
return EXIT_FAILURE;<BR> // }<BR> typedef
float PixelType;<BR> typedef float
ComponentType;<BR> static const unsigned int Dimension =
3;<BR> typedef itk::Image< PixelType, Dimension >
ImageType;<BR> typedef itk::CovariantVector< ComponentType,
<BR>
Dimension
> OutputPixelType;<BR> typedef
itk::Image< OutputPixelType, Dimension >
OutputImageType;<BR><BR><BR> ImageType::Pointer image =
ImageType::New();<BR><BR> ImageType::IndexType start;<BR>
for(int i = 0; i < Dimension; i++)<BR>
start[i]=0;<BR><BR> ImageType::SizeType size;<BR> size[0]
= 300;<BR> size[1] = 300;<BR> size[2] = 512;<BR>
<BR> ImageType::RegionType region;<BR>
region.SetSize(size);<BR> region.SetIndex(start);<BR>
<BR> ImageType::SpacingType spacing;<BR> spacing[0] =
20;<BR> spacing[1] = 20;<BR> spacing[2] =
4.00493;<BR> <BR> image->SetRegions(region);<BR>
image->SetSpacing(spacing);<BR>
image->Allocate();<BR><BR> std::cout << region <<
std::endl;<BR><BR> OutputImageType::Pointer vec_image =
OutputImageType::New();<BR> OutputImageType::RegionType
vecregion;<BR> <BR> OutputImageType::SizeType
vecsize; //Size<BR>
vecsize[0] =
(image->GetLargestPossibleRegion().GetSize())[0];<BR>
vecsize[1] =
(image->GetLargestPossibleRegion().GetSize())[1];<BR>
vecsize[2] =
(image->GetLargestPossibleRegion().GetSize())[2];<BR>
std::cout<<"size0: "<< vecsize[0]<< " size1:
"<< vecsize[1] << " size2: " << vecsize[2]
<<std::endl;<BR> vecregion.SetSize( vecsize
);<BR><BR> OutputImageType::IndexType
vecstart; //Start<BR>
vecstart[0] = (image->GetOrigin())[0];<BR> vecstart[1] =
(image->GetOrigin())[1];<BR> vecstart[2] =
(image->GetOrigin())[2];<BR> std::cout<<" start0:
"<< vecstart[0]<< " start1: "<< vecstart[1] <<
" start2: " << vecstart[2] <<std::endl;<BR>
vecregion.SetIndex( vecstart );<BR> <BR>
vec_image->SetRegions(vecregion);<BR>
vec_image->SetSpacing(image->GetSpacing());<BR>
vec_image->Allocate();<BR><BR> // The image
buffer is initialized to a particular value<BR>
OutputImageType::PixelType initialValue;<BR><BR> // A
vector can initialize all its components to the<BR> // same
value by using the Fill() method.<BR> initialValue.Fill( 0.0
);<BR><BR> // Now the image buffer can be initialized with
this<BR> // vector value.<BR> vec_image->FillBuffer(
initialValue );<BR> std::cout<< "Allocate" <<
std::endl;<BR><BR> typedef itk::RegionOfInterestImageFilter<
ImageType, ImageType > ROIFilterType;<BR>
ROIFilterType::Pointer roifilter = ROIFilterType::New();<BR><BR>
// Number of Regions<BR> int splitcnt_x = 2;<BR> int
splitcnt_y = 2;<BR> int overlap = 15;<BR><BR> int
stepcnt_x = (int) (size[0]*1.0/splitcnt_x + 0.5);<BR> int
stepcnt_y = (int) (size[1]*1.0/splitcnt_y + 0.5);<BR><BR><BR>
ImageType::IndexType roistart;<BR> roistart[2]=0;<BR>
ImageType::SizeType roisize;<BR> roisize[2]=512;<BR>
ImageType::RegionType roiregion;<BR><BR><BR> for (int cnt_x = 0;
cnt_x < splitcnt_x; cnt_x++)<BR> {<BR> for
(int cnt_y = 0; cnt_y < splitcnt_y; cnt_y++)<BR>
{<BR> roistart[0]=
cnt_x*stepcnt_x - overlap;<BR>
roistart[1]= cnt_y*stepcnt_y - overlap;<BR>
if(cnt_x == 0)<BR>
{<BR>
roistart[0] = 0;<BR>
roisize[0] = stepcnt_x +
overlap;<BR>
}<BR> else<BR>
{<BR>
roisize[0] = stepcnt_x +
2*overlap;<BR>
}<BR> if(roisize[0]+roistart[0]
> size[0])<BR>
{<BR>
roisize[0] = size[0]-roistart[0];<BR>
}<BR> if(cnt_y
== 0)<BR> {<BR>
roistart[1] =
0;<BR>
roisize[1] = stepcnt_y + overlap;<BR>
}<BR>
else<BR> {<BR>
roisize[1] = stepcnt_y +
2*overlap;<BR>
}<BR> if(roisize[1]+roistart[1]
> size[1])<BR>
{<BR>
roisize[1] = size[1]-roistart[1];<BR>
}<BR><BR>
<BR>
roiregion.SetSize(roisize);<BR>
roiregion.SetIndex(roistart);<BR><BR>
std::cout << "cnt_x: " << cnt_x
<< " cnt_y: " << cnt_y <<
std::endl;<BR><BR> std::cout
<< roiregion << std::endl;<BR><BR>
std::cout << "ROI region inside image region
is " << region.IsInside(roiregion) <<
std::endl;<BR><BR>
roifilter->SetRegionOfInterest(roiregion);<BR>
roifilter->SetInput(image);<BR><BR>
//Filter class is
instantiated<BR> typedef
itk::GradientRecursiveGaussianImageFilter<ImageType,
OutputImageType> GradFilterType;<BR><BR>
GradFilterType::Pointer gradfilter =
GradFilterType::New();<BR>
<BR> //sigma is specified in
millimeters<BR>
gradfilter->SetSigma( 1.5 ); <BR>
<BR> //
processing pipeline:<BR>
gradfilter->SetInput(roifilter->GetOutput());<BR>
<BR><BR> typedef
itk::PasteImageFilter <OutputImageType, OutputImageType >
PasteImageFilterType;<BR> // The
SetDestinationIndex() method prescribes where in the
first<BR> // input to start
pasting data from the second input.<BR>
// The SetSourceRegion method prescribes the
section of the second<BR> //
image to paste into the first.<BR>
<BR>
OutputImageType::IndexType destinationIndex;<BR>
destinationIndex[0] =
cnt_x*stepcnt_x;<BR>
destinationIndex[1] = cnt_y*stepcnt_y;<BR>
destinationIndex[2] = 0;<BR>
<BR>
PasteImageFilterType::Pointer pasteFilter = PasteImageFilterType::New
();<BR>
pasteFilter->SetSourceImage(gradfilter->GetOutput());<BR>
pasteFilter->SetDestinationImage(vec_image);<BR>
<BR>
OutputImageType::RegionType pasteregion;<BR>
OutputImageType::IndexType
pastestart;<BR>
pastestart[2]=0;<BR>
OutputImageType::SizeType pastesize;<BR>
pastesize[2]=512;<BR><BR>
pastestart[0]= overlap;<BR>
pastestart[1]= overlap;<BR>
pastesize[0] = stepcnt_x;<BR>
pastesize[1] = stepcnt_y;<BR><BR>
if(cnt_x == 0)<BR>
{<BR>
pastestart[0] = 0;<BR>
}<BR> if(cnt_y
== 0)<BR> {<BR>
pastestart[1] =
0;<BR>
}<BR><BR>
pasteregion.SetIndex(pastestart);<BR>
pasteregion.SetSize(pastesize);<BR><BR>
pasteFilter->SetSourceRegion(pasteregion);<BR>
pasteFilter->SetDestinationIndex(destinationIndex);<BR><BR>
try<BR>
{<BR>
pasteFilter->Update();<BR>
}<BR> catch( itk::ExceptionObject
& err )<BR>
{<BR>
std::cerr << "ExceptionObject caught !" <<
std::endl;<BR>
std::cerr << err << std::endl;<BR>
return
EXIT_SUCCESS;<BR>
}<BR> }<BR> typedef
itk::GradientToMagnitudeImageFilter< OutputImageType, ImageType
> MagFilterType;<BR> MagFilterType::Pointer
magfilter = MagFilterType::New();<BR><BR>
magfilter->SetInput(vec_image);<BR><BR>
try<BR> {<BR>
magfilter->Update();<BR> image
= magfilter->GetOutput();<BR>
}<BR> catch( itk::ExceptionObject & err
)<BR> {<BR>
std::cerr << "ExceptionObject caught !" <<
std::endl;<BR> std::cerr <<
err << std::endl;<BR>
return EXIT_SUCCESS;<BR> }<BR><BR>
}<BR> <BR> getch();<BR> return
EXIT_SUCCESS;<BR>}</FONT><BR><BR></DIV></DIV>_____________________________________<BR>Powered
by <A href="http://www.kitware.com"
target=_blank>www.kitware.com</A><BR><BR>Visit other Kitware
open-source projects at<BR><A
href="http://www.kitware.com/opensource/opensource.html"
target=_blank>http://www.kitware.com/opensource/opensource.html</A><BR><BR>Kitware
offers ITK Training Courses, for more information visit:<BR><A
href="http://www.kitware.com/products/protraining.html"
target=_blank>http://www.kitware.com/products/protraining.html</A><BR><BR>Please
keep messages on-topic and check the ITK FAQ at:<BR><A
href="http://www.itk.org/Wiki/ITK_FAQ"
target=_blank>http://www.itk.org/Wiki/ITK_FAQ</A><BR><BR>Follow this
link to subscribe/unsubscribe:<BR><A
href="http://www.itk.org/mailman/listinfo/insight-users"
target=_blank>http://www.itk.org/mailman/listinfo/insight-users</A><BR><BR></BLOCKQUOTE></DIV><BR></BLOCKQUOTE></DIV><BR></DIV></DIV><BR>_____________________________________<BR>Powered
by <A href="http://www.kitware.com"
target=_blank>www.kitware.com</A><BR><BR>Visit other Kitware open-source
projects at<BR><A href="http://www.kitware.com/opensource/opensource.html"
target=_blank>http://www.kitware.com/opensource/opensource.html</A><BR><BR>Kitware
offers ITK Training Courses, for more information visit:<BR><A
href="http://www.kitware.com/products/protraining.html"
target=_blank>http://www.kitware.com/products/protraining.html</A><BR><BR>Please
keep messages on-topic and check the ITK FAQ at:<BR><A
href="http://www.itk.org/Wiki/ITK_FAQ"
target=_blank>http://www.itk.org/Wiki/ITK_FAQ</A><BR><BR>Follow this link
to subscribe/unsubscribe:<BR><A
href="http://www.itk.org/mailman/listinfo/insight-users"
target=_blank>http://www.itk.org/mailman/listinfo/insight-users</A><BR><BR></BLOCKQUOTE></DIV><BR></DIV></DIV></DIV></BLOCKQUOTE></DIV><BR></DIV></DIV></DIV></BLOCKQUOTE></DIV><BR></BODY></HTML>