Skip to content
Projeler
Gruplar
Parçacıklar
Yardım
Yükleniyor...
Oturum aç / Kaydol
Gezinmeyi değiştir
C
core
Proje
Proje
Ayrıntılar
Etkinlik
Cycle Analytics
Depo (repository)
Depo (repository)
Dosyalar
Kayıtlar (commit)
Dallar (branch)
Etiketler
Katkıda bulunanlar
Grafik
Karşılaştır
Grafikler
Konular (issue)
0
Konular (issue)
0
Liste
Pano
Etiketler
Kilometre Taşları
Birleştirme (merge) Talepleri
0
Birleştirme (merge) Talepleri
0
CI / CD
CI / CD
İş akışları (pipeline)
İşler
Zamanlamalar
Grafikler
Paketler
Paketler
Wiki
Wiki
Parçacıklar
Parçacıklar
Üyeler
Üyeler
Collapse sidebar
Close sidebar
Etkinlik
Grafik
Grafikler
Yeni bir konu (issue) oluştur
İşler
Kayıtlar (commit)
Konu (issue) Panoları
Kenar çubuğunu aç
LibreOffice
core
Commits
86b90004
Kaydet (Commit)
86b90004
authored
Haz 11, 2001
tarafından
Nikolai Pretzell
Dosyalara gözat
Seçenekler
Dosyalara Gözat
İndir
Eposta Yamaları
Sade Fark
New parser for generic info lists.
üst
25b9d581
Expand all
Hide whitespace changes
Inline
Side-by-side
Showing
15 changed files
with
2123 additions
and
0 deletions
+2123
-0
gen_info.cxx
soltools/giparser/gen_info.cxx
+119
-0
gi_list.cxx
soltools/giparser/gi_list.cxx
+267
-0
gi_parse.cxx
soltools/giparser/gi_parse.cxx
+411
-0
makefile.mk
soltools/giparser/makefile.mk
+95
-0
st_gilrw.cxx
soltools/giparser/st_gilrw.cxx
+211
-0
gen_info.hxx
soltools/inc/gen_info.hxx
+123
-0
gi_list.hxx
soltools/inc/gi_list.hxx
+239
-0
gi_parse.hxx
soltools/inc/gi_parse.hxx
+197
-0
gilacces.hxx
soltools/inc/gilacces.hxx
+138
-0
simstr.hxx
soltools/inc/simstr.hxx
+0
-0
st_gilrw.hxx
soltools/inc/st_gilrw.hxx
+159
-0
st_list.hxx
soltools/inc/st_list.hxx
+0
-0
st_types.hxx
soltools/inc/st_types.hxx
+74
-0
makefile.mk
soltools/support/makefile.mk
+90
-0
simstr.cxx
soltools/support/simstr.cxx
+0
-0
No files found.
soltools/giparser/gen_info.cxx
0 → 100644
Dosyayı görüntüle @
86b90004
/*************************************************************************
*
* $RCSfile: gen_info.cxx,v $
*
* $Revision: 1.1 $
*
* last change: $Author: np $ $Date: 2001-06-11 16:04:51 $
*
* The Contents of this file are made available subject to the terms of
* either of the following licenses
*
* - GNU Lesser General Public License Version 2.1
* - Sun Industry Standards Source License Version 1.1
*
* Sun Microsystems Inc., October, 2000
*
* GNU Lesser General Public License Version 2.1
* =============================================
* Copyright 2000 by Sun Microsystems, Inc.
* 901 San Antonio Road, Palo Alto, CA 94303, USA
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License version 2.1, as published by the Free Software Foundation.
*
* This library 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
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston,
* MA 02111-1307 USA
*
*
* Sun Industry Standards Source License Version 1.1
* =================================================
* The contents of this file are subject to the Sun Industry Standards
* Source License Version 1.1 (the "License"); You may not use this file
* except in compliance with the License. You may obtain a copy of the
* License at http://www.openoffice.org/license.html.
*
* Software provided under this License is provided on an "AS IS" basis,
* WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
* WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
* MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
* See the License for the specific provisions governing your rights and
* obligations concerning the Software.
*
* The Initial Developer of the Original Code is: Sun Microsystems, Inc.
*
* Copyright: 2000 by Sun Microsystems, Inc.
*
* All Rights Reserved.
*
* Contributor(s): _______________________________________
*
*
************************************************************************/
#include <gen_info.hxx>
#include <gi_list.hxx>
GenericInfo
::
GenericInfo
(
const
Simstr
&
i_sKey
,
const
Simstr
&
i_sValue
,
const
Simstr
&
i_sComment
)
:
sKey
(
i_sKey
),
sValue
(
i_sValue
),
sComment
(
i_sComment
),
dpSubList
(
0
)
{
}
GenericInfo
::
GenericInfo
(
const
GenericInfo
&
i_rInfo
)
:
sKey
(
i_rInfo
.
sKey
),
sValue
(
i_rInfo
.
sValue
),
sComment
(
i_rInfo
.
sComment
),
dpSubList
(
0
)
{
if
(
i_rInfo
.
HasSubList
()
)
{
dpSubList
=
new
List_GenericInfo
(
i_rInfo
.
SubList
());
}
}
GenericInfo
::~
GenericInfo
()
{
if
(
dpSubList
!=
0
)
delete
dpSubList
;
}
GenericInfo
&
GenericInfo
::
operator
=
(
const
GenericInfo
&
i_rInfo
)
{
sKey
=
i_rInfo
.
sKey
;
sValue
=
i_rInfo
.
sValue
;
sComment
=
i_rInfo
.
sComment
;
if
(
dpSubList
!=
0
)
delete
dpSubList
;
if
(
i_rInfo
.
HasSubList
()
)
{
dpSubList
=
new
List_GenericInfo
(
i_rInfo
.
SubList
());
}
else
dpSubList
=
0
;
return
*
this
;
}
List_GenericInfo
&
GenericInfo
::
CreateMyList
()
const
{
return
*
(
const_cast
<
GenericInfo
&>
(
*
this
).
dpSubList
=
new
List_GenericInfo
);
}
soltools/giparser/gi_list.cxx
0 → 100644
Dosyayı görüntüle @
86b90004
/*************************************************************************
*
* $RCSfile: gi_list.cxx,v $
*
* $Revision: 1.1 $
*
* last change: $Author: np $ $Date: 2001-06-11 16:04:51 $
*
* The Contents of this file are made available subject to the terms of
* either of the following licenses
*
* - GNU Lesser General Public License Version 2.1
* - Sun Industry Standards Source License Version 1.1
*
* Sun Microsystems Inc., October, 2000
*
* GNU Lesser General Public License Version 2.1
* =============================================
* Copyright 2000 by Sun Microsystems, Inc.
* 901 San Antonio Road, Palo Alto, CA 94303, USA
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License version 2.1, as published by the Free Software Foundation.
*
* This library 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
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston,
* MA 02111-1307 USA
*
*
* Sun Industry Standards Source License Version 1.1
* =================================================
* The contents of this file are subject to the Sun Industry Standards
* Source License Version 1.1 (the "License"); You may not use this file
* except in compliance with the License. You may obtain a copy of the
* License at http://www.openoffice.org/license.html.
*
* Software provided under this License is provided on an "AS IS" basis,
* WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
* WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
* MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
* See the License for the specific provisions governing your rights and
* obligations concerning the Software.
*
* The Initial Developer of the Original Code is: Sun Microsystems, Inc.
*
* Copyright: 2000 by Sun Microsystems, Inc.
*
* All Rights Reserved.
*
* Contributor(s): _______________________________________
*
*
************************************************************************/
#include <gi_list.hxx>
#include <gen_info.hxx>
const
char
C_cKeySeparator
=
'/'
;
List_GenericInfo
::
List_GenericInfo
()
{
}
List_GenericInfo
::
List_GenericInfo
(
const
List_GenericInfo
&
i_rList
)
:
aChildren
(
i_rList
.
aChildren
)
{
}
List_GenericInfo
::~
List_GenericInfo
()
{
}
List_GenericInfo
&
List_GenericInfo
::
operator
=
(
const
List_GenericInfo
&
i_rList
)
{
aChildren
=
i_rList
.
aChildren
;
return
*
this
;
}
const
GenericInfo
*
List_GenericInfo
::
operator
[](
KeyPath
i_sKeyPath
)
const
{
return
const_cast
<
List_GenericInfo
&
>
(
*
this
)[
i_sKeyPath
];
}
GenericInfo
*
List_GenericInfo
::
operator
[](
KeyPath
i_sKeyPath
)
{
bool
bExists
=
false
;
const
char
*
sNextPathSegment
=
0
;
sub_iterator
it
=
lower_bound
(
bExists
,
sNextPathSegment
,
i_sKeyPath
);
if
(
bExists
)
{
if
(
sNextPathSegment
==
0
)
return
(
*
it
);
else
return
(
*
it
)
->
SubList
()[
sNextPathSegment
];
}
else
{
return
0
;
}
}
bool
List_GenericInfo
::
InsertInfo
(
GenericInfo
*
let_dpInfo
,
bool
i_bOverwrite
)
{
if
(
let_dpInfo
==
0
)
return
false
;
bool
bExists
=
false
;
const
char
*
sNextPathSegment
=
0
;
sub_iterator
it
=
lower_bound
(
bExists
,
sNextPathSegment
,
let_dpInfo
->
Key
()
);
if
(
!
bExists
)
{
aChildren
.
insert
(
it
,
let_dpInfo
);
}
else
if
(
i_bOverwrite
)
{
delete
(
*
it
);
(
*
it
)
=
let_dpInfo
;
}
else
{
delete
let_dpInfo
;
return
false
;
}
return
true
;
}
bool
List_GenericInfo
::
InsertInfoByPath
(
GenericInfo
*
let_dpInfo
,
KeyPath
i_sKeyPath
,
bool
i_bCreatePath
,
bool
i_bOverwrite
)
{
if
(
let_dpInfo
==
0
)
return
false
;
if
(
i_sKeyPath
==
0
?
true
:
*
i_sKeyPath
==
0
)
return
InsertInfo
(
let_dpInfo
,
i_bOverwrite
);
bool
bExists
=
false
;
const
char
*
sNextPathSegment
=
0
;
sub_iterator
it
=
lower_bound
(
bExists
,
sNextPathSegment
,
i_sKeyPath
);
if
(
bExists
)
{
return
(
*
it
)
->
SubList
().
InsertInfoByPath
(
let_dpInfo
,
sNextPathSegment
,
i_bCreatePath
,
i_bOverwrite
);
}
else
if
(
i_bCreatePath
)
{
Simstr
aKey
(
i_sKeyPath
,
0
,
sNextPathSegment
-
(
*
sNextPathSegment
==
0
?
0
:
1
)
-
i_sKeyPath
);
GenericInfo
*
pNew
=
new
GenericInfo
(
aKey
);
InsertInfo
(
pNew
,
false
);
return
pNew
->
SubList
().
InsertInfoByPath
(
let_dpInfo
,
sNextPathSegment
,
i_bCreatePath
,
i_bOverwrite
);
}
else
{
delete
let_dpInfo
;
return
false
;
}
return
true
;
}
GenericInfo
*
List_GenericInfo
::
ReleaseInfo
(
KeyPath
i_sKeyPath
)
{
bool
bExists
=
false
;
const
char
*
sNextPathSegment
=
0
;
sub_iterator
it
=
lower_bound
(
bExists
,
sNextPathSegment
,
i_sKeyPath
);
if
(
bExists
)
{
if
(
*
sNextPathSegment
==
0
)
return
(
*
it
);
else
return
(
*
it
)
->
SubList
().
ReleaseInfo
(
sNextPathSegment
);
}
else
{
return
0
;
}
}
void
List_GenericInfo
::
DeleteInfo
(
KeyPath
i_sKeyPath
)
{
bool
bExists
=
false
;
const
char
*
sNextPathSegment
=
0
;
sub_iterator
it
=
lower_bound
(
bExists
,
sNextPathSegment
,
i_sKeyPath
);
if
(
bExists
)
{
if
(
*
sNextPathSegment
==
0
)
{
aChildren
.
remove
(
it
);
}
else
{
(
*
it
)
->
SubList
().
DeleteInfo
(
sNextPathSegment
);
}
}
}
List_GenericInfo
::
sub_iterator
List_GenericInfo
::
lower_bound
(
bool
&
o_bExists
,
const
char
*
&
o_sNextPathSegment
,
KeyPath
i_sKeyPath
)
{
o_sNextPathSegment
=
strchr
(
i_sKeyPath
,
'/'
);
Simstr
sKey
(
i_sKeyPath
,
(
o_sNextPathSegment
==
0
?
strlen
(
i_sKeyPath
)
:
o_sNextPathSegment
++
-
i_sKeyPath
)
);
GenericInfo
aSearch
(
sKey
);
unsigned
low
=
0
;
unsigned
high
=
aChildren
.
size
();
for
(
unsigned
cur
=
high
/
2
;
high
>
low
;
cur
=
(
low
+
high
)
/
2
)
{
if
(
*
aChildren
[
cur
]
<
aSearch
)
{
low
=
cur
+
1
;
}
else
{
high
=
cur
;
}
}
// end for
o_bExists
=
low
<
aChildren
.
size
()
?
!
(
aSearch
<
*
aChildren
[
low
]
)
:
false
;
return
&
aChildren
[
low
];
}
soltools/giparser/gi_parse.cxx
0 → 100644
Dosyayı görüntüle @
86b90004
/*************************************************************************
*
* $RCSfile: gi_parse.cxx,v $
*
* $Revision: 1.1 $
*
* last change: $Author: np $ $Date: 2001-06-11 16:04:51 $
*
* The Contents of this file are made available subject to the terms of
* either of the following licenses
*
* - GNU Lesser General Public License Version 2.1
* - Sun Industry Standards Source License Version 1.1
*
* Sun Microsystems Inc., October, 2000
*
* GNU Lesser General Public License Version 2.1
* =============================================
* Copyright 2000 by Sun Microsystems, Inc.
* 901 San Antonio Road, Palo Alto, CA 94303, USA
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License version 2.1, as published by the Free Software Foundation.
*
* This library 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
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston,
* MA 02111-1307 USA
*
*
* Sun Industry Standards Source License Version 1.1
* =================================================
* The contents of this file are subject to the Sun Industry Standards
* Source License Version 1.1 (the "License"); You may not use this file
* except in compliance with the License. You may obtain a copy of the
* License at http://www.openoffice.org/license.html.
*
* Software provided under this License is provided on an "AS IS" basis,
* WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
* WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
* MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
* See the License for the specific provisions governing your rights and
* obligations concerning the Software.
*
* The Initial Developer of the Original Code is: Sun Microsystems, Inc.
*
* Copyright: 2000 by Sun Microsystems, Inc.
*
* All Rights Reserved.
*
* Contributor(s): _______________________________________
*
*
************************************************************************/
#include <gi_parse.hxx>
#include <stdio.h>
#include <string.h>
#include <fstream>
#include <gilacces.hxx>
using
namespace
std
;
const
char
*
C_sLineEnd
=
"
\r\n
"
;
inline
void
WriteStr
(
ostream
&
o_rOut
,
const
Simstr
&
i_rStr
)
{
o_rOut
.
write
(
i_rStr
.
str
(),
i_rStr
.
l
()
);
}
inline
void
WriteStr
(
ostream
&
o_rOut
,
const
char
*
i_rStr
)
{
o_rOut
.
write
(
i_rStr
,
strlen
(
i_rStr
)
);
}
inline
void
GenericInfo_Parser
::
SetError
(
E_Error
i_eError
)
{
eErrorCode
=
i_eError
;
nErrorLine
=
nCurLine
;
}
GenericInfo_Parser
::
GenericInfo_Parser
()
:
sCurParsePosition
(
""
),
nCurLine
(
0
),
nLevel
(
0
),
bGoon
(
false
),
// sCurComment,
eErrorCode
(
ok
),
nErrorLine
(
0
),
pResult
(
0
),
pResource
(
0
)
{
}
GenericInfo_Parser
::~
GenericInfo_Parser
()
{
}
bool
GenericInfo_Parser
::
LoadList
(
GenericInfoList_Builder
&
o_rResult
,
const
Simstr
&
i_sSourceFileName
)
{
ifstream
aFile
(
i_sSourceFileName
.
str
()
);
if
(
aFile
.
fail
()
)
{
SetError
(
cannot_open
);
return
false
;
}
ResetState
(
o_rResult
);
for
(
ReadLine
(
aFile
);
bGoon
;
ReadLine
(
aFile
)
)
{
bool
bOk
=
InterpretLine
();
if
(
!
bOk
)
{
SetError
(
syntax_error
);
break
;
}
}
if
(
nLevel
>
0
&&
eErrorCode
==
ok
)
{
SetError
(
unexpected_eof
);
}
else
if
(
nLevel
<
0
)
{
SetError
(
unexpected_list_end
);
}
aFile
.
close
();
return
eErrorCode
==
ok
;
}
bool
GenericInfo_Parser
::
SaveList
(
const
Simstr
&
i_rOutputFile
,
GenericInfoList_Browser
&
io_rListBrowser
)
{
ofstream
aFile
(
i_rOutputFile
.
str
()
);
if
(
aFile
.
fail
()
)
{
SetError
(
cannot_open
);
return
false
;
}
ResetState
(
io_rListBrowser
);
WriteList
(
aFile
);
aFile
.
close
();
return
eErrorCode
==
ok
;
}
void
GenericInfo_Parser
::
ResetState
(
GenericInfoList_Builder
&
io_rResult
)
{
sCurParsePosition
=
""
;
nCurLine
=
0
;
nLevel
=
0
;
bGoon
=
true
;
sCurComment
=
""
;
eErrorCode
=
ok
;
nErrorLine
=
0
;
pResult
=
&
io_rResult
;
pResource
=
0
;
}
void
GenericInfo_Parser
::
ResetState
(
GenericInfoList_Browser
&
io_rSrc
)
{
sCurParsePosition
=
""
;
nCurLine
=
0
;
nLevel
=
0
;
bGoon
=
false
;
sCurComment
=
""
;
eErrorCode
=
ok
;
nErrorLine
=
0
;
pResult
=
0
;
pResource
=
&
io_rSrc
;
}
void
GenericInfo_Parser
::
ReadLine
(
istream
&
i_rSrc
)
{
const
int
nInputSize
=
32000
;
static
char
sInput
[
nInputSize
];
i_rSrc
.
get
(
sInput
,
nInputSize
);
UINT32
nGot
=
UINT32
(
i_rSrc
.
gcount
());
if
(
nGot
==
0
)
{
bGoon
=
false
;
return
;
}
nCurLine
++
;
#if 0
if ( sInput[ nGot-1 ] == '\r' )
sInput[ nGot-1 ] = '\0';
#endif
i_rSrc
.
get
();
for
(
sCurParsePosition
=
&
sInput
[
0
];
*
sCurParsePosition
>
0
&&
*
sCurParsePosition
<=
32
;
++
sCurParsePosition
);
for
(
char
*
sEnd
=
const_cast
<
char
*
>
(
strchr
(
sCurParsePosition
,
'\0'
));
sEnd
!=
sCurParsePosition
?
*
(
sEnd
-
1
)
<=
32
:
false
;
--
sEnd
)
{
*
(
sEnd
-
1
)
=
'\0'
;
}
}
bool
GenericInfo_Parser
::
InterpretLine
()
{
switch
(
ClassifyLine
()
)
{
case
lt_key
:
ReadKey
();
break
;
case
lt_open_list
:
PushLevel_Read
();
break
;
case
lt_close_list
:
PopLevel_Read
();
break
;
case
lt_comment
:
AddCurLine2CurComment
();
break
;
case
lt_empty
:
AddCurLine2CurComment
();
break
;
default
:
return
false
;
}
return
true
;
}
GenericInfo_Parser
::
E_LineType
GenericInfo_Parser
::
ClassifyLine
()
{
switch
(
*
sCurParsePosition
)
{
case
'{'
:
return
lt_open_list
;
case
'}'
:
return
lt_close_list
;
case
'#'
:
return
lt_comment
;
case
'0'
:
return
lt_empty
;
}
return
lt_key
;
}
void
GenericInfo_Parser
::
ReadKey
()
{
const
char
*
pSearch
=
sCurParsePosition
;
for
(
;
*
pSearch
>
32
;
++
pSearch
);
UINT32
nKeyLength
=
pSearch
-
sCurParsePosition
;
for
(
;
*
pSearch
<=
32
&&
*
pSearch
>
'\0'
;
++
pSearch
);
pResult
->
AddKey
(
sCurParsePosition
,
nKeyLength
,
pSearch
,
strlen
(
pSearch
),
sCurComment
.
str
(),
sCurComment
.
l
()
);
}
void
GenericInfo_Parser
::
PushLevel_Read
()
{
nLevel
++
;
pResult
->
OpenList
();
}
void
GenericInfo_Parser
::
PopLevel_Read
()
{
nLevel
--
;
pResult
->
CloseList
();
}
void
GenericInfo_Parser
::
AddCurLine2CurComment
()
{
sCurComment
+=
sCurParsePosition
;
sCurComment
+=
C_sLineEnd
;
}
void
GenericInfo_Parser
::
WriteList
(
ostream
&
o_rFile
)
{
static
char
sBuffer
[
32000
];
for
(
bGoon
=
pResource
->
Start_CurList
();
bGoon
;
bGoon
=
pResource
->
NextOf_CurList
()
)
{
pResource
->
Get_CurComment
(
&
sBuffer
[
0
]);
WriteComment
(
o_rFile
,
sBuffer
);
pResource
->
Get_CurKey
(
&
sBuffer
[
0
]);
WriteKey
(
o_rFile
,
sBuffer
);
pResource
->
Get_CurValue
(
&
sBuffer
[
0
]);
WriteValue
(
o_rFile
,
sBuffer
);
if
(
pResource
->
HasSubList_CurKey
()
)
{
PushLevel_Write
();
/*
WriteIndentation();
o_rFile.write("{",1);
o_rFile.write(C_sLineEnd, C_nLineEndLength);
*/
WriteList
(
o_rFile
);
/*
WriteIndentation();
o_rFile.write("}",1);
o_rFile.write(C_sLineEnd, C_nLineEndLength);
*/
PopLevel_Write
();
}
}
// end for
}
void
GenericInfo_Parser
::
PushLevel_Write
()
{
nLevel
++
;
pResource
->
Push_CurList
();
}
void
GenericInfo_Parser
::
PopLevel_Write
()
{
nLevel
--
;
pResource
->
Pop_CurList
();