You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
544 lines
14 KiB
544 lines
14 KiB
14 years ago
|
/*==LICENSE==*
|
||
|
|
||
|
CyanWorlds.com Engine - MMOG client, server and tools
|
||
|
Copyright (C) 2011 Cyan Worlds, Inc.
|
||
|
|
||
|
This program is free software: you can redistribute it and/or modify
|
||
|
it under the terms of the GNU General Public License as published by
|
||
|
the Free Software Foundation, either version 3 of the License, or
|
||
|
(at your option) any later version.
|
||
|
|
||
|
This program is distributed in the hope that it will be useful,
|
||
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||
|
GNU General Public License for more details.
|
||
|
|
||
|
You should have received a copy of the GNU General Public License
|
||
|
along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||
|
|
||
|
You can contact Cyan Worlds, Inc. by email legal@cyan.com
|
||
|
or by snail mail at:
|
||
|
Cyan Worlds, Inc.
|
||
|
14617 N Newport Hwy
|
||
|
Mead, WA 99021
|
||
|
|
||
|
*==LICENSE==*/
|
||
|
//////////////////////////////////////////////
|
||
|
//
|
||
|
//
|
||
|
///////////////////////////////////////////////
|
||
|
|
||
|
#include "pyKey.h"
|
||
|
|
||
|
#include "../pfGameGUIMgr/pfGUIMultiLineEditCtrl.h"
|
||
|
|
||
|
#include "pyGUIControlMultiLineEdit.h"
|
||
|
#include "pyColor.h"
|
||
|
|
||
|
pyGUIControlMultiLineEdit::pyGUIControlMultiLineEdit(pyKey& gckey) : pyGUIControl(gckey)
|
||
|
{
|
||
|
}
|
||
|
|
||
|
pyGUIControlMultiLineEdit::pyGUIControlMultiLineEdit(plKey objkey) : pyGUIControl(objkey)
|
||
|
{
|
||
|
}
|
||
|
|
||
|
hsBool pyGUIControlMultiLineEdit::IsGUIControlMultiLineEdit(pyKey& gckey)
|
||
|
{
|
||
|
if ( gckey.getKey() && pfGUIMultiLineEditCtrl::ConvertNoRef(gckey.getKey()->ObjectIsLoaded()) )
|
||
|
return true;
|
||
|
return false;
|
||
|
}
|
||
|
|
||
|
|
||
|
void pyGUIControlMultiLineEdit::SetScrollPosition( Int32 topLine )
|
||
|
{
|
||
|
if ( fGCkey )
|
||
|
{
|
||
|
// get the pointer to the modifier
|
||
|
pfGUIMultiLineEditCtrl* pbmod = pfGUIMultiLineEditCtrl::ConvertNoRef(fGCkey->ObjectIsLoaded());
|
||
|
if ( pbmod )
|
||
|
{
|
||
|
pbmod->SetScrollPosition(topLine);
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
void pyGUIControlMultiLineEdit::MoveCursor( Int32 dir)
|
||
|
{
|
||
|
if ( fGCkey )
|
||
|
{
|
||
|
// get the pointer to the modifier
|
||
|
pfGUIMultiLineEditCtrl* pbmod = pfGUIMultiLineEditCtrl::ConvertNoRef(fGCkey->ObjectIsLoaded());
|
||
|
if ( pbmod )
|
||
|
{
|
||
|
pbmod->MoveCursor((enum pfGUIMultiLineEditCtrl::Direction)dir);
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
|
||
|
void pyGUIControlMultiLineEdit::ClearBuffer( void )
|
||
|
{
|
||
|
if ( fGCkey )
|
||
|
{
|
||
|
// get the pointer to the modifier
|
||
|
pfGUIMultiLineEditCtrl* pbmod = pfGUIMultiLineEditCtrl::ConvertNoRef(fGCkey->ObjectIsLoaded());
|
||
|
if ( pbmod )
|
||
|
{
|
||
|
pbmod->ClearBuffer();
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
void pyGUIControlMultiLineEdit::SetText( const char *asciiText )
|
||
|
{
|
||
|
if ( fGCkey )
|
||
|
{
|
||
|
// get the pointer to the modifier
|
||
|
pfGUIMultiLineEditCtrl* pbmod = pfGUIMultiLineEditCtrl::ConvertNoRef(fGCkey->ObjectIsLoaded());
|
||
|
if ( pbmod )
|
||
|
{
|
||
|
pbmod->SetBuffer(asciiText);
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
void pyGUIControlMultiLineEdit::SetTextW( const wchar_t *asciiText )
|
||
|
{
|
||
|
if ( fGCkey )
|
||
|
{
|
||
|
// get the pointer to the modifier
|
||
|
pfGUIMultiLineEditCtrl* pbmod = pfGUIMultiLineEditCtrl::ConvertNoRef(fGCkey->ObjectIsLoaded());
|
||
|
if ( pbmod )
|
||
|
{
|
||
|
pbmod->SetBuffer(asciiText);
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
const char* pyGUIControlMultiLineEdit::GetText( void )
|
||
|
{
|
||
|
// up to the caller to free the string... but when?
|
||
|
if ( fGCkey )
|
||
|
{
|
||
|
// get the pointer to the modifier
|
||
|
pfGUIMultiLineEditCtrl* pbmod = pfGUIMultiLineEditCtrl::ConvertNoRef(fGCkey->ObjectIsLoaded());
|
||
|
if ( pbmod )
|
||
|
{
|
||
|
const char* text = pbmod->GetNonCodedBuffer();
|
||
|
// convert string to a PyObject (which also copies the string)
|
||
|
return text;
|
||
|
}
|
||
|
}
|
||
|
// return None on error
|
||
|
return nil;
|
||
|
}
|
||
|
|
||
|
const wchar_t* pyGUIControlMultiLineEdit::GetTextW( void )
|
||
|
{
|
||
|
// up to the caller to free the string... but when?
|
||
|
if ( fGCkey )
|
||
|
{
|
||
|
// get the pointer to the modifier
|
||
|
pfGUIMultiLineEditCtrl* pbmod = pfGUIMultiLineEditCtrl::ConvertNoRef(fGCkey->ObjectIsLoaded());
|
||
|
if ( pbmod )
|
||
|
{
|
||
|
const wchar_t* text = pbmod->GetNonCodedBufferW();
|
||
|
// convert string to a PyObject (which also copies the string)
|
||
|
return text;
|
||
|
}
|
||
|
}
|
||
|
// return None on error
|
||
|
return nil;
|
||
|
}
|
||
|
|
||
|
//
|
||
|
// set the encoded buffer - encoded with style and color
|
||
|
//
|
||
|
void pyGUIControlMultiLineEdit::SetEncodedBuffer( PyObject* buffer_object )
|
||
|
{
|
||
|
if ( fGCkey )
|
||
|
{
|
||
|
// get the pointer to the modifier
|
||
|
pfGUIMultiLineEditCtrl* pbmod = pfGUIMultiLineEditCtrl::ConvertNoRef(fGCkey->ObjectIsLoaded());
|
||
|
if ( pbmod )
|
||
|
{
|
||
|
// something to do here... later
|
||
|
UInt8* daBuffer = nil;
|
||
|
int length;
|
||
|
PyObject_AsReadBuffer( buffer_object, (const void**)&daBuffer, &length);
|
||
|
if ( daBuffer != nil )
|
||
|
{
|
||
|
// don't alter the user's buffer... but into a copy of our own
|
||
|
UInt8* altBuffer = TRACKED_NEW UInt8[length];
|
||
|
// =====> temp>> change 0xFEs back into '\0's
|
||
|
int i;
|
||
|
for ( i=0 ; i<length ; i++ )
|
||
|
{
|
||
|
if ( daBuffer[i] == 254 )
|
||
|
altBuffer[i] = 0; // change into a 0xFE
|
||
|
else
|
||
|
altBuffer[i] = daBuffer[i];
|
||
|
}
|
||
|
// =====> temp>> change 0xFEs back into '\0's
|
||
|
pbmod->SetBuffer( altBuffer, length );
|
||
|
delete [] altBuffer;
|
||
|
|
||
|
pbmod->SetCursorToLoc(0);
|
||
|
pbmod->SetScrollPosition(0);
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
void pyGUIControlMultiLineEdit::SetEncodedBufferW( PyObject* buffer_object )
|
||
|
{
|
||
|
if ( fGCkey )
|
||
|
{
|
||
|
// get the pointer to the modifier
|
||
|
pfGUIMultiLineEditCtrl* pbmod = pfGUIMultiLineEditCtrl::ConvertNoRef(fGCkey->ObjectIsLoaded());
|
||
|
if ( pbmod )
|
||
|
{
|
||
|
// something to do here... later
|
||
|
UInt16* daBuffer = nil;
|
||
|
int length;
|
||
|
PyObject_AsReadBuffer( buffer_object, (const void**)&daBuffer, &length);
|
||
|
if ( daBuffer != nil )
|
||
|
{
|
||
|
// don't alter the user's buffer... but into a copy of our own
|
||
|
UInt16* altBuffer = TRACKED_NEW UInt16[length];
|
||
|
// =====> temp>> change 0xFFFEs back into '\0's
|
||
|
int i;
|
||
|
for ( i=0 ; i<length ; i++ )
|
||
|
{
|
||
|
if ( daBuffer[i] == 0xFFFE )
|
||
|
altBuffer[i] = 0; // change into a 0
|
||
|
else
|
||
|
altBuffer[i] = daBuffer[i];
|
||
|
}
|
||
|
// =====> temp>> change 0xFFFEs back into '\0's
|
||
|
pbmod->SetBuffer( altBuffer, length );
|
||
|
delete [] altBuffer;
|
||
|
|
||
|
pbmod->SetCursorToLoc(0);
|
||
|
pbmod->SetScrollPosition(0);
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
const char* pyGUIControlMultiLineEdit::GetEncodedBuffer()
|
||
|
{
|
||
|
if ( fGCkey )
|
||
|
{
|
||
|
// get the pointer to the modifier
|
||
|
pfGUIMultiLineEditCtrl* pbmod = pfGUIMultiLineEditCtrl::ConvertNoRef(fGCkey->ObjectIsLoaded());
|
||
|
if ( pbmod )
|
||
|
{
|
||
|
UInt32 length;
|
||
|
UInt8* daBuffer = pbmod->GetCodedBuffer( length );
|
||
|
if ( daBuffer )
|
||
|
{
|
||
|
UInt8* altBuffer = TRACKED_NEW UInt8[length+1];
|
||
|
// =====> temp>> to get rid of '\0's (change into 0xFEs)
|
||
|
int i;
|
||
|
for ( i=0 ; i<length ; i++ )
|
||
|
{
|
||
|
if ( daBuffer[i] == 0 )
|
||
|
altBuffer[i] = 254; // change into a 0xFE
|
||
|
else
|
||
|
altBuffer[i] = daBuffer[i];
|
||
|
}
|
||
|
// add '\0' top end of string
|
||
|
altBuffer[length] = 0;
|
||
|
// =====> temp>> to get rid of '\0's (change into 0xFEs)
|
||
|
delete [] daBuffer;
|
||
|
// May have to use a string object instead of a buffer
|
||
|
// (String makes its own copy of the string)
|
||
|
return (const char*)altBuffer;
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
// return None on error
|
||
|
return nil;
|
||
|
}
|
||
|
|
||
|
const wchar_t* pyGUIControlMultiLineEdit::GetEncodedBufferW()
|
||
|
{
|
||
|
if ( fGCkey )
|
||
|
{
|
||
|
// get the pointer to the modifier
|
||
|
pfGUIMultiLineEditCtrl* pbmod = pfGUIMultiLineEditCtrl::ConvertNoRef(fGCkey->ObjectIsLoaded());
|
||
|
if ( pbmod )
|
||
|
{
|
||
|
UInt32 length;
|
||
|
UInt16* daBuffer = pbmod->GetCodedBufferW( length );
|
||
|
if ( daBuffer )
|
||
|
{
|
||
|
UInt16* altBuffer = TRACKED_NEW UInt16[length+1];
|
||
|
// =====> temp>> to get rid of '\0's (change into 0xFFFEs)
|
||
|
int i;
|
||
|
for ( i=0 ; i<length ; i++ )
|
||
|
{
|
||
|
if ( daBuffer[i] == 0 )
|
||
|
altBuffer[i] = 0xFFFE; // change into a 0xFFFE
|
||
|
else
|
||
|
altBuffer[i] = daBuffer[i];
|
||
|
}
|
||
|
// add '\0' top end of string
|
||
|
altBuffer[length] = 0;
|
||
|
delete [] daBuffer;
|
||
|
// =====> temp>> to get rid of '\0's (change into 0xFEs)
|
||
|
// May have to use a string object instead of a buffer
|
||
|
// (String makes its own copy of the string)
|
||
|
return (const wchar_t*)altBuffer;
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
// return None on error
|
||
|
return nil;
|
||
|
}
|
||
|
|
||
|
UInt32 pyGUIControlMultiLineEdit::GetBufferSize()
|
||
|
{
|
||
|
if ( fGCkey )
|
||
|
{
|
||
|
// get the pointer to the modifier
|
||
|
pfGUIMultiLineEditCtrl* pbmod = pfGUIMultiLineEditCtrl::ConvertNoRef(fGCkey->ObjectIsLoaded());
|
||
|
if ( pbmod )
|
||
|
{
|
||
|
return pbmod->GetBufferSize();
|
||
|
}
|
||
|
}
|
||
|
return 0;
|
||
|
}
|
||
|
|
||
|
|
||
|
|
||
|
void pyGUIControlMultiLineEdit::InsertChar( char c )
|
||
|
{
|
||
|
if ( fGCkey )
|
||
|
{
|
||
|
// get the pointer to the modifier
|
||
|
pfGUIMultiLineEditCtrl* pbmod = pfGUIMultiLineEditCtrl::ConvertNoRef(fGCkey->ObjectIsLoaded());
|
||
|
if ( pbmod )
|
||
|
{
|
||
|
pbmod->InsertChar(c);
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
void pyGUIControlMultiLineEdit::InsertCharW( wchar_t c )
|
||
|
{
|
||
|
if ( fGCkey )
|
||
|
{
|
||
|
// get the pointer to the modifier
|
||
|
pfGUIMultiLineEditCtrl* pbmod = pfGUIMultiLineEditCtrl::ConvertNoRef(fGCkey->ObjectIsLoaded());
|
||
|
if ( pbmod )
|
||
|
{
|
||
|
pbmod->InsertChar(c);
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
void pyGUIControlMultiLineEdit::InsertString( const char *string )
|
||
|
{
|
||
|
if ( fGCkey )
|
||
|
{
|
||
|
// get the pointer to the modifier
|
||
|
pfGUIMultiLineEditCtrl* pbmod = pfGUIMultiLineEditCtrl::ConvertNoRef(fGCkey->ObjectIsLoaded());
|
||
|
if ( pbmod )
|
||
|
{
|
||
|
pbmod->InsertString(string);
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
void pyGUIControlMultiLineEdit::InsertStringW( const wchar_t *string )
|
||
|
{
|
||
|
if ( fGCkey )
|
||
|
{
|
||
|
// get the pointer to the modifier
|
||
|
pfGUIMultiLineEditCtrl* pbmod = pfGUIMultiLineEditCtrl::ConvertNoRef(fGCkey->ObjectIsLoaded());
|
||
|
if ( pbmod )
|
||
|
{
|
||
|
pbmod->InsertString(string);
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
void pyGUIControlMultiLineEdit::InsertColor( pyColor& color )
|
||
|
{
|
||
|
if ( fGCkey )
|
||
|
{
|
||
|
// get the pointer to the modifier
|
||
|
pfGUIMultiLineEditCtrl* pbmod = pfGUIMultiLineEditCtrl::ConvertNoRef(fGCkey->ObjectIsLoaded());
|
||
|
if ( pbmod )
|
||
|
{
|
||
|
pbmod->InsertColor(color.getColor());
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
void pyGUIControlMultiLineEdit::InsertStyle( UInt8 fontStyle )
|
||
|
{
|
||
|
if ( fGCkey )
|
||
|
{
|
||
|
// get the pointer to the modifier
|
||
|
pfGUIMultiLineEditCtrl* pbmod = pfGUIMultiLineEditCtrl::ConvertNoRef(fGCkey->ObjectIsLoaded());
|
||
|
if ( pbmod )
|
||
|
{
|
||
|
pbmod->InsertStyle(fontStyle);
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
void pyGUIControlMultiLineEdit::DeleteChar( void )
|
||
|
{
|
||
|
if ( fGCkey )
|
||
|
{
|
||
|
// get the pointer to the modifier
|
||
|
pfGUIMultiLineEditCtrl* pbmod = pfGUIMultiLineEditCtrl::ConvertNoRef(fGCkey->ObjectIsLoaded());
|
||
|
if ( pbmod )
|
||
|
{
|
||
|
pbmod->DeleteChar();
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
void pyGUIControlMultiLineEdit::Lock( void )
|
||
|
{
|
||
|
if ( fGCkey )
|
||
|
{
|
||
|
// get the pointer to the modifier
|
||
|
pfGUIMultiLineEditCtrl* pbmod = pfGUIMultiLineEditCtrl::ConvertNoRef(fGCkey->ObjectIsLoaded());
|
||
|
if ( pbmod )
|
||
|
pbmod->Lock();
|
||
|
}
|
||
|
}
|
||
|
|
||
|
void pyGUIControlMultiLineEdit::Unlock( void )
|
||
|
{
|
||
|
if ( fGCkey )
|
||
|
{
|
||
|
// get the pointer to the modifier
|
||
|
pfGUIMultiLineEditCtrl* pbmod = pfGUIMultiLineEditCtrl::ConvertNoRef(fGCkey->ObjectIsLoaded());
|
||
|
if ( pbmod )
|
||
|
pbmod->Unlock();
|
||
|
}
|
||
|
}
|
||
|
|
||
|
hsBool pyGUIControlMultiLineEdit::IsLocked( void )
|
||
|
{
|
||
|
if ( fGCkey )
|
||
|
{
|
||
|
// get the pointer to the modifier
|
||
|
pfGUIMultiLineEditCtrl* pbmod = pfGUIMultiLineEditCtrl::ConvertNoRef(fGCkey->ObjectIsLoaded());
|
||
|
if ( pbmod )
|
||
|
return pbmod->IsLocked();
|
||
|
}
|
||
|
// don't know... must false then
|
||
|
return false;
|
||
|
}
|
||
|
|
||
|
void pyGUIControlMultiLineEdit::Clickable( void )
|
||
|
{
|
||
|
if ( fGCkey )
|
||
|
{
|
||
|
// get the pointer to the modifier
|
||
|
pfGUIMultiLineEditCtrl* pbmod = pfGUIMultiLineEditCtrl::ConvertNoRef(fGCkey->ObjectIsLoaded());
|
||
|
if ( pbmod )
|
||
|
pbmod->ClearFlag(pfGUIControlMod::kIntangible);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
void pyGUIControlMultiLineEdit::Unclickable( void )
|
||
|
{
|
||
|
if ( fGCkey )
|
||
|
{
|
||
|
// get the pointer to the modifier
|
||
|
pfGUIMultiLineEditCtrl* pbmod = pfGUIMultiLineEditCtrl::ConvertNoRef(fGCkey->ObjectIsLoaded());
|
||
|
if ( pbmod )
|
||
|
pbmod->SetFlag(pfGUIControlMod::kIntangible);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
void pyGUIControlMultiLineEdit::SetBufferLimit(Int32 limit)
|
||
|
{
|
||
|
if ( fGCkey )
|
||
|
{
|
||
|
// get the pointer to the modifier
|
||
|
pfGUIMultiLineEditCtrl* pbmod = pfGUIMultiLineEditCtrl::ConvertNoRef(fGCkey->ObjectIsLoaded());
|
||
|
if ( pbmod )
|
||
|
pbmod->SetBufferLimit(limit);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
Int32 pyGUIControlMultiLineEdit::GetBufferLimit()
|
||
|
{
|
||
|
if ( fGCkey )
|
||
|
{
|
||
|
// get the pointer to the modifier
|
||
|
pfGUIMultiLineEditCtrl* pbmod = pfGUIMultiLineEditCtrl::ConvertNoRef(fGCkey->ObjectIsLoaded());
|
||
|
if ( pbmod )
|
||
|
return pbmod->GetBufferLimit();
|
||
|
}
|
||
|
return 0;
|
||
|
}
|
||
|
|
||
|
void pyGUIControlMultiLineEdit::EnableScrollControl()
|
||
|
{
|
||
|
if ( fGCkey )
|
||
|
{
|
||
|
// get the pointer to the modifier
|
||
|
pfGUIMultiLineEditCtrl* pbmod = pfGUIMultiLineEditCtrl::ConvertNoRef(fGCkey->ObjectIsLoaded());
|
||
|
if ( pbmod )
|
||
|
pbmod->SetScrollEnable(true);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
void pyGUIControlMultiLineEdit::DisableScrollControl()
|
||
|
{
|
||
|
if ( fGCkey )
|
||
|
{
|
||
|
// get the pointer to the modifier
|
||
|
pfGUIMultiLineEditCtrl* pbmod = pfGUIMultiLineEditCtrl::ConvertNoRef(fGCkey->ObjectIsLoaded());
|
||
|
if ( pbmod )
|
||
|
pbmod->SetScrollEnable(false);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
void pyGUIControlMultiLineEdit::DeleteLinesFromTop( int lines )
|
||
|
{
|
||
|
if (fGCkey)
|
||
|
{
|
||
|
// get the pointer to the modifier
|
||
|
pfGUIMultiLineEditCtrl* pbmod = pfGUIMultiLineEditCtrl::ConvertNoRef(fGCkey->ObjectIsLoaded());
|
||
|
if ( pbmod )
|
||
|
pbmod->DeleteLinesFromTop(lines);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
UInt32 pyGUIControlMultiLineEdit::GetFontSize()
|
||
|
{
|
||
|
if (fGCkey)
|
||
|
{
|
||
|
// get the pointer to the modifier
|
||
|
pfGUIMultiLineEditCtrl* pbmod = pfGUIMultiLineEditCtrl::ConvertNoRef(fGCkey->ObjectIsLoaded());
|
||
|
if ( pbmod )
|
||
|
return pbmod->GetFontSize();
|
||
|
}
|
||
|
return 12; // something relatively sane
|
||
|
}
|
||
|
|
||
|
void pyGUIControlMultiLineEdit::SetFontSize( UInt32 fontsize )
|
||
|
{
|
||
|
if (fGCkey)
|
||
|
{
|
||
|
// get the pointer to the modifier
|
||
|
pfGUIMultiLineEditCtrl* pbmod = pfGUIMultiLineEditCtrl::ConvertNoRef(fGCkey->ObjectIsLoaded());
|
||
|
if ( pbmod )
|
||
|
pbmod->SetFontSize((UInt8)fontsize);
|
||
|
}
|
||
|
}
|