Skip to content
Projeler
Gruplar
Parçacıklar
Yardım
Yükleniyor...
Oturum aç / Kaydol
Gezinmeyi değiştir
C
cpython
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ç
Batuhan Osman TASKAYA
cpython
Commits
fc03a94a
Kaydet (Commit)
fc03a94a
authored
Ock 25, 2003
tarafından
Martin v. Löwis
Dosyalara gözat
Seçenekler
Dosyalara Gözat
İndir
Eposta Yamaları
Sade Fark
Incorporate Expat 1.95.6.
üst
5a772d32
Expand all
Show whitespace changes
Inline
Side-by-side
Showing
11 changed files
with
187 additions
and
78 deletions
+187
-78
ascii.h
Modules/expat/ascii.h
+2
-3
expat.h
Modules/expat/expat.h
+0
-0
internal.h
Modules/expat/internal.h
+73
-0
xmlparse.c
Modules/expat/xmlparse.c
+0
-0
xmlrole.c
Modules/expat/xmlrole.c
+0
-0
xmlrole.h
Modules/expat/xmlrole.h
+18
-4
xmltok.c
Modules/expat/xmltok.c
+0
-0
xmltok.h
Modules/expat/xmltok.h
+66
-50
xmltok_impl.c
Modules/expat/xmltok_impl.c
+0
-0
xmltok_ns.c
Modules/expat/xmltok_ns.c
+25
-17
setup.py
setup.py
+3
-4
No files found.
Modules/expat/ascii.h
Dosyayı görüntüle @
fc03a94a
/*
Copyright (c) 1998, 1999 Thai Open Source Software Center Ltd
See the file COPYING for copying permission.
/* Copyright (c) 1998, 1999 Thai Open Source Software Center Ltd
See the file COPYING for copying permission.
*/
#define ASCII_A 0x41
...
...
Modules/expat/expat.h
Dosyayı görüntüle @
fc03a94a
This diff is collapsed.
Click to expand it.
Modules/expat/internal.h
0 → 100644
Dosyayı görüntüle @
fc03a94a
/* internal.h
Internal definitions used by Expat. This is not needed to compile
client code.
The following calling convention macros are defined for frequently
called functions:
FASTCALL - Used for those internal functions that have a simple
body and a low number of arguments and local variables.
PTRCALL - Used for functions called though function pointers.
PTRFASTCALL - Like PTRCALL, but for low number of arguments.
inline - Used for selected internal functions for which inlining
may improve performance on some platforms.
Note: Use of these macros is based on judgement, not hard rules,
and therefore subject to change.
*/
#if defined(__GNUC__)
/* Instability reported with egcs on a RedHat Linux 7.3.
Let's comment it out:
#define FASTCALL __attribute__((stdcall, regparm(3)))
and let's try this:
*/
#define FASTCALL __attribute__((regparm(3)))
#define PTRCALL
#define PTRFASTCALL __attribute__((regparm(3)))
#elif defined(WIN32)
/* Using __fastcall seems to have an unexpected negative effect under
MS VC++, especially for function pointers, so we won't use it for
now on that platform. It may be reconsidered for a future release
if it can be made more effective.
Likely reason: __fastcall on Windows is like stdcall, therefore
the compiler cannot perform stack optimizations for call clusters.
*/
#define FASTCALL
#define PTRCALL
#define PTRFASTCALL
#endif
#ifndef FASTCALL
#define FASTCALL
#endif
#ifndef PTRCALL
#define PTRCALL
#endif
#ifndef PTRFASTCALL
#define PTRFASTCALL
#endif
#ifndef XML_MIN_SIZE
#if !defined(__cplusplus) && !defined(inline)
#ifdef __GNUC__
#define inline __inline
#endif
/* __GNUC__ */
#endif
#endif
/* XML_MIN_SIZE */
#ifdef __cplusplus
#define inline inline
#else
#ifndef inline
#define inline
#endif
#endif
Modules/expat/xmlparse.c
Dosyayı görüntüle @
fc03a94a
This diff is collapsed.
Click to expand it.
Modules/expat/xmlrole.c
Dosyayı görüntüle @
fc03a94a
This diff is collapsed.
Click to expand it.
Modules/expat/xmlrole.h
Dosyayı görüntüle @
fc03a94a
/*
Copyright (c) 1998, 1999 Thai Open Source Software Center Ltd
See the file COPYING for copying permission.
/* Copyright (c) 1998, 1999 Thai Open Source Software Center Ltd
See the file COPYING for copying permission.
*/
#ifndef XmlRole_INCLUDED
#define XmlRole_INCLUDED 1
#ifdef __VMS
/* 0 1 2 3 0 1 2 3
1234567890123456789012345678901 1234567890123456789012345678901 */
#define XmlPrologStateInitExternalEntity XmlPrologStateInitExternalEnt
#endif
#include "xmltok.h"
#ifdef __cplusplus
...
...
@@ -17,6 +22,7 @@ enum {
XML_ROLE_NONE
=
0
,
XML_ROLE_XML_DECL
,
XML_ROLE_INSTANCE_START
,
XML_ROLE_DOCTYPE_NONE
,
XML_ROLE_DOCTYPE_NAME
,
XML_ROLE_DOCTYPE_SYSTEM_ID
,
XML_ROLE_DOCTYPE_PUBLIC_ID
,
...
...
@@ -24,11 +30,13 @@ enum {
XML_ROLE_DOCTYPE_CLOSE
,
XML_ROLE_GENERAL_ENTITY_NAME
,
XML_ROLE_PARAM_ENTITY_NAME
,
XML_ROLE_ENTITY_NONE
,
XML_ROLE_ENTITY_VALUE
,
XML_ROLE_ENTITY_SYSTEM_ID
,
XML_ROLE_ENTITY_PUBLIC_ID
,
XML_ROLE_ENTITY_COMPLETE
,
XML_ROLE_ENTITY_NOTATION_NAME
,
XML_ROLE_NOTATION_NONE
,
XML_ROLE_NOTATION_NAME
,
XML_ROLE_NOTATION_SYSTEM_ID
,
XML_ROLE_NOTATION_NO_SYSTEM_ID
,
...
...
@@ -44,11 +52,13 @@ enum {
XML_ROLE_ATTRIBUTE_TYPE_NMTOKENS
,
XML_ROLE_ATTRIBUTE_ENUM_VALUE
,
XML_ROLE_ATTRIBUTE_NOTATION_VALUE
,
XML_ROLE_ATTLIST_NONE
,
XML_ROLE_ATTLIST_ELEMENT_NAME
,
XML_ROLE_IMPLIED_ATTRIBUTE_VALUE
,
XML_ROLE_REQUIRED_ATTRIBUTE_VALUE
,
XML_ROLE_DEFAULT_ATTRIBUTE_VALUE
,
XML_ROLE_FIXED_ATTRIBUTE_VALUE
,
XML_ROLE_ELEMENT_NONE
,
XML_ROLE_ELEMENT_NAME
,
XML_ROLE_CONTENT_ANY
,
XML_ROLE_CONTENT_EMPTY
,
...
...
@@ -64,6 +74,8 @@ enum {
XML_ROLE_CONTENT_ELEMENT_REP
,
XML_ROLE_CONTENT_ELEMENT_OPT
,
XML_ROLE_CONTENT_ELEMENT_PLUS
,
XML_ROLE_PI
,
XML_ROLE_COMMENT
,
#ifdef XML_DTD
XML_ROLE_TEXT_DECL
,
XML_ROLE_IGNORE_SECT
,
...
...
@@ -73,15 +85,17 @@ enum {
};
typedef
struct
prolog_state
{
int
(
*
handler
)
(
struct
prolog_state
*
state
,
int
(
PTRCALL
*
handler
)
(
struct
prolog_state
*
state
,
int
tok
,
const
char
*
ptr
,
const
char
*
end
,
const
ENCODING
*
enc
);
unsigned
level
;
int
role_none
;
#ifdef XML_DTD
unsigned
includeLevel
;
int
documentEntity
;
int
inEntityValue
;
#endif
/* XML_DTD */
}
PROLOG_STATE
;
...
...
Modules/expat/xmltok.c
Dosyayı görüntüle @
fc03a94a
This diff is collapsed.
Click to expand it.
Modules/expat/xmltok.h
Dosyayı görüntüle @
fc03a94a
/*
Copyright (c) 1998, 1999 Thai Open Source Software Center Ltd
See the file COPYING for copying permission.
/* Copyright (c) 1998, 1999 Thai Open Source Software Center Ltd
See the file COPYING for copying permission.
*/
#ifndef XmlTok_INCLUDED
...
...
@@ -11,9 +10,11 @@ extern "C" {
#endif
/* The following token may be returned by XmlContentTok */
#define XML_TOK_TRAILING_RSQB -5
/* ] or ]] at the end of the scan; might be start of
illegal ]]> sequence */
/* The following tokens may be returned by both XmlPrologTok and XmlContentTok */
#define XML_TOK_TRAILING_RSQB -5
/* ] or ]] at the end of the scan; might be
start of illegal ]]> sequence */
/* The following tokens may be returned by both XmlPrologTok and
XmlContentTok.
*/
#define XML_TOK_NONE -4
/* The string to be scanned is empty */
#define XML_TOK_TRAILING_CR -3
/* A CR at the end of the scan;
might be part of CRLF sequence */
...
...
@@ -22,8 +23,8 @@ extern "C" {
#define XML_TOK_INVALID 0
/* The following tokens are returned by XmlContentTok; some are also
returned by XmlAttributeValueTok, XmlEntityTok, XmlCdataSectionTok */
returned by XmlAttributeValueTok, XmlEntityTok, XmlCdataSectionTok.
*/
#define XML_TOK_START_TAG_WITH_ATTS 1
#define XML_TOK_START_TAG_NO_ATTS 2
#define XML_TOK_EMPTY_ELEMENT_WITH_ATTS 3
/* empty element tag <e/> */
...
...
@@ -35,7 +36,9 @@ extern "C" {
#define XML_TOK_ENTITY_REF 9
#define XML_TOK_CHAR_REF 10
/* numeric character reference */
/* The following tokens may be returned by both XmlPrologTok and XmlContentTok */
/* The following tokens may be returned by both XmlPrologTok and
XmlContentTok.
*/
#define XML_TOK_PI 11
/* processing instruction */
#define XML_TOK_XML_DECL 12
/* XML decl or text decl */
#define XML_TOK_COMMENT 13
...
...
@@ -75,8 +78,9 @@ extern "C" {
/* The following token is returned only by XmlCdataSectionTok */
#define XML_TOK_CDATA_SECT_CLOSE 40
/* With namespace processing this is returned by XmlPrologTok
for a name with a colon. */
/* With namespace processing this is returned by XmlPrologTok for a
name with a colon.
*/
#define XML_TOK_PREFIXED_NAME 41
#ifdef XML_DTD
...
...
@@ -121,37 +125,45 @@ typedef struct {
struct
encoding
;
typedef
struct
encoding
ENCODING
;
struct
encoding
{
int
(
*
scanners
[
XML_N_STATES
])(
const
ENCODING
*
,
typedef
int
(
PTRCALL
*
SCANNER
)(
const
ENCODING
*
,
const
char
*
,
const
char
*
,
const
char
**
);
int
(
*
literalScanners
[
XML_N_LITERAL_TYPES
])(
const
ENCODING
*
,
struct
encoding
{
SCANNER
scanners
[
XML_N_STATES
];
SCANNER
literalScanners
[
XML_N_LITERAL_TYPES
];
int
(
PTRCALL
*
sameName
)(
const
ENCODING
*
,
const
char
*
,
const
char
*
);
int
(
PTRCALL
*
nameMatchesAscii
)(
const
ENCODING
*
,
const
char
*
,
const
char
**
);
int
(
*
sameName
)(
const
ENCODING
*
,
const
char
*
,
const
char
*
);
int
(
*
nameMatchesAscii
)(
const
ENCODING
*
,
const
char
*
,
const
char
*
,
const
char
*
);
int
(
*
nameLength
)(
const
ENCODING
*
,
const
char
*
);
const
char
*
(
*
skipS
)(
const
ENCODING
*
,
const
char
*
);
int
(
*
getAtts
)(
const
ENCODING
*
enc
,
const
char
*
ptr
,
int
attsMax
,
ATTRIBUTE
*
atts
);
int
(
*
charRefNumber
)(
const
ENCODING
*
enc
,
const
char
*
ptr
);
int
(
*
predefinedEntityName
)(
const
ENCODING
*
,
const
char
*
,
const
char
*
);
void
(
*
updatePosition
)(
const
ENCODING
*
,
const
char
*
,
const
char
*
);
int
(
PTRFASTCALL
*
nameLength
)(
const
ENCODING
*
,
const
char
*
);
const
char
*
(
PTRFASTCALL
*
skipS
)(
const
ENCODING
*
,
const
char
*
);
int
(
PTRCALL
*
getAtts
)(
const
ENCODING
*
enc
,
const
char
*
ptr
,
int
attsMax
,
ATTRIBUTE
*
atts
);
int
(
PTRFASTCALL
*
charRefNumber
)(
const
ENCODING
*
enc
,
const
char
*
ptr
);
int
(
PTRCALL
*
predefinedEntityName
)(
const
ENCODING
*
,
const
char
*
,
const
char
*
);
void
(
PTRCALL
*
updatePosition
)(
const
ENCODING
*
,
const
char
*
ptr
,
const
char
*
end
,
POSITION
*
);
int
(
*
isPublicId
)(
const
ENCODING
*
enc
,
const
char
*
ptr
,
const
char
*
end
,
int
(
PTRCALL
*
isPublicId
)(
const
ENCODING
*
enc
,
const
char
*
ptr
,
const
char
*
end
,
const
char
**
badPtr
);
void
(
*
utf8Convert
)(
const
ENCODING
*
enc
,
void
(
PTRCALL
*
utf8Convert
)(
const
ENCODING
*
enc
,
const
char
**
fromP
,
const
char
*
fromLim
,
char
**
toP
,
const
char
*
toLim
);
void
(
*
utf16Convert
)(
const
ENCODING
*
enc
,
void
(
PTRCALL
*
utf16Convert
)(
const
ENCODING
*
enc
,
const
char
**
fromP
,
const
char
*
fromLim
,
unsigned
short
**
toP
,
...
...
@@ -161,24 +173,25 @@ struct encoding {
char
isUtf16
;
};
/*
Scan the string starting at ptr until the end of the next complete token,
but do not scan past eptr. Return an integer giving the
type of token.
/*
Scan the string starting at ptr until the end of the next complete
token, but do not scan past eptr. Return an integer giving the
type of token.
Return XML_TOK_NONE when ptr == eptr; nextTokPtr will not be set.
Return XML_TOK_NONE when ptr == eptr; nextTokPtr will not be set.
Return XML_TOK_PARTIAL when the string does not contain a complete token;
nextTokPtr will not be set.
Return XML_TOK_PARTIAL when the string does not contain a complete
token;
nextTokPtr will not be set.
Return XML_TOK_INVALID when the string does not start a valid token; nextTokPtr
will be set to point to the character which made the token invalid.
Return XML_TOK_INVALID when the string does not start a valid
token; nextTokPtr will be set to point to the character which made
the token invalid.
Otherwise the string starts with a valid token; nextTokPtr will be set to point
to the character following the end of that token.
Otherwise the string starts with a valid token; nextTokPtr will be
set to point
to the character following the end of that token.
Each data character counts as a single token, but adjacent data characters
may be returned together. Similarly for characters in the prolog outside
literals, comments and processing instructions.
Each data character counts as a single token, but adjacent data
characters may be returned together. Similarly for characters in
the prolog outside
literals, comments and processing instructions.
*/
...
...
@@ -201,9 +214,9 @@ literals, comments and processing instructions.
#endif
/* XML_DTD */
/* This is used for performing a 2nd-level tokenization on
the content of a literal that has already been returned by XmlTok. */
/* This is used for performing a 2nd-level tokenization on
the content
of a literal that has already been returned by XmlTok.
*/
#define XmlLiteralTok(enc, literalType, ptr, end, nextTokPtr) \
(((enc)->literalScanners[literalType])(enc, ptr, end, nextTokPtr))
...
...
@@ -264,14 +277,16 @@ int XmlParseXmlDecl(int isGeneralTextEntity,
int
XmlInitEncoding
(
INIT_ENCODING
*
,
const
ENCODING
**
,
const
char
*
name
);
const
ENCODING
*
XmlGetUtf8InternalEncoding
(
void
);
const
ENCODING
*
XmlGetUtf16InternalEncoding
(
void
);
int
XmlUtf8Encode
(
int
charNumber
,
char
*
buf
);
int
XmlUtf16Encode
(
int
charNumber
,
unsigned
short
*
buf
);
int
FASTCALL
XmlUtf8Encode
(
int
charNumber
,
char
*
buf
);
int
FASTCALL
XmlUtf16Encode
(
int
charNumber
,
unsigned
short
*
buf
);
int
XmlSizeOfUnknownEncoding
(
void
);
typedef
int
(
*
CONVERTER
)(
void
*
userData
,
const
char
*
p
);
ENCODING
*
XmlInitUnknownEncoding
(
void
*
mem
,
int
*
table
,
int
(
*
conv
)(
void
*
userData
,
const
char
*
p
)
,
CONVERTER
convert
,
void
*
userData
);
int
XmlParseXmlDeclNS
(
int
isGeneralTextEntity
,
...
...
@@ -284,13 +299,14 @@ int XmlParseXmlDeclNS(int isGeneralTextEntity,
const
char
**
encodingNamePtr
,
const
ENCODING
**
namedEncodingPtr
,
int
*
standalonePtr
);
int
XmlInitEncodingNS
(
INIT_ENCODING
*
,
const
ENCODING
**
,
const
char
*
name
);
const
ENCODING
*
XmlGetUtf8InternalEncodingNS
(
void
);
const
ENCODING
*
XmlGetUtf16InternalEncodingNS
(
void
);
ENCODING
*
XmlInitUnknownEncodingNS
(
void
*
mem
,
int
*
table
,
int
(
*
conv
)(
void
*
userData
,
const
char
*
p
)
,
CONVERTER
convert
,
void
*
userData
);
#ifdef __cplusplus
}
...
...
Modules/expat/xmltok_impl.c
Dosyayı görüntüle @
fc03a94a
This diff is collapsed.
Click to expand it.
Modules/expat/xmltok_ns.c
Dosyayı görüntüle @
fc03a94a
const
ENCODING
*
NS
(
XmlGetUtf8InternalEncoding
)(
void
)
const
ENCODING
*
NS
(
XmlGetUtf8InternalEncoding
)(
void
)
{
return
&
ns
(
internal_utf8_encoding
).
enc
;
}
const
ENCODING
*
NS
(
XmlGetUtf16InternalEncoding
)(
void
)
const
ENCODING
*
NS
(
XmlGetUtf16InternalEncoding
)(
void
)
{
#if
XML_BYTE_ORDER == 12
#if
BYTEORDER == 1234
return
&
ns
(
internal_little2_encoding
).
enc
;
#elif
XML_BYTE_ORDER ==
21
#elif
BYTEORDER == 43
21
return
&
ns
(
internal_big2_encoding
).
enc
;
#else
const
short
n
=
1
;
return
*
(
const
char
*
)
&
n
?
&
ns
(
internal_little2_encoding
).
enc
:
&
ns
(
internal_big2_encoding
).
enc
;
return
(
*
(
const
char
*
)
&
n
?
&
ns
(
internal_little2_encoding
).
enc
:
&
ns
(
internal_big2_encoding
).
enc
);
#endif
}
static
const
ENCODING
*
NS
(
encodings
)[]
=
{
static
const
ENCODING
*
NS
(
encodings
)[]
=
{
&
ns
(
latin1_encoding
).
enc
,
&
ns
(
ascii_encoding
).
enc
,
&
ns
(
utf8_encoding
).
enc
,
...
...
@@ -26,21 +29,25 @@ const ENCODING *NS(encodings)[] = {
&
ns
(
utf8_encoding
).
enc
/* NO_ENC */
};
static
int
NS
(
initScanProlog
)(
const
ENCODING
*
enc
,
const
char
*
ptr
,
const
char
*
end
,
static
int
PTRCALL
NS
(
initScanProlog
)(
const
ENCODING
*
enc
,
const
char
*
ptr
,
const
char
*
end
,
const
char
**
nextTokPtr
)
{
return
initScan
(
NS
(
encodings
),
(
const
INIT_ENCODING
*
)
enc
,
XML_PROLOG_STATE
,
ptr
,
end
,
nextTokPtr
);
return
initScan
(
NS
(
encodings
),
(
const
INIT_ENCODING
*
)
enc
,
XML_PROLOG_STATE
,
ptr
,
end
,
nextTokPtr
);
}
static
int
NS
(
initScanContent
)(
const
ENCODING
*
enc
,
const
char
*
ptr
,
const
char
*
end
,
static
int
PTRCALL
NS
(
initScanContent
)(
const
ENCODING
*
enc
,
const
char
*
ptr
,
const
char
*
end
,
const
char
**
nextTokPtr
)
{
return
initScan
(
NS
(
encodings
),
(
const
INIT_ENCODING
*
)
enc
,
XML_CONTENT_STATE
,
ptr
,
end
,
nextTokPtr
);
return
initScan
(
NS
(
encodings
),
(
const
INIT_ENCODING
*
)
enc
,
XML_CONTENT_STATE
,
ptr
,
end
,
nextTokPtr
);
}
int
NS
(
XmlInitEncoding
)(
INIT_ENCODING
*
p
,
const
ENCODING
**
encPtr
,
const
char
*
name
)
int
NS
(
XmlInitEncoding
)(
INIT_ENCODING
*
p
,
const
ENCODING
**
encPtr
,
const
char
*
name
)
{
int
i
=
getEncodingIndex
(
name
);
if
(
i
==
UNKNOWN_ENC
)
...
...
@@ -54,8 +61,8 @@ int NS(XmlInitEncoding)(INIT_ENCODING *p, const ENCODING **encPtr, const char *n
return
1
;
}
static
const
ENCODING
*
NS
(
findEncoding
)(
const
ENCODING
*
enc
,
const
char
*
ptr
,
const
char
*
end
)
static
const
ENCODING
*
NS
(
findEncoding
)(
const
ENCODING
*
enc
,
const
char
*
ptr
,
const
char
*
end
)
{
#define ENCODING_MAX 128
char
buf
[
ENCODING_MAX
];
...
...
@@ -73,7 +80,8 @@ const ENCODING *NS(findEncoding)(const ENCODING *enc, const char *ptr, const cha
return
NS
(
encodings
)[
i
];
}
int
NS
(
XmlParseXmlDecl
)(
int
isGeneralTextEntity
,
int
NS
(
XmlParseXmlDecl
)(
int
isGeneralTextEntity
,
const
ENCODING
*
enc
,
const
char
*
ptr
,
const
char
*
end
,
...
...
setup.py
Dosyayı görüntüle @
fc03a94a
...
...
@@ -690,9 +690,9 @@ class PyBuildExt(build_ext):
# More information on Expat can be found at www.libexpat.org.
#
if
sys
.
byteorder
==
"little"
:
xmlbo
=
"12"
xmlbo
=
"12
34
"
else
:
xmlbo
=
"21"
xmlbo
=
"
43
21"
expatinc
=
os
.
path
.
join
(
os
.
getcwd
(),
srcdir
,
'Modules'
,
'expat'
)
exts
.
append
(
Extension
(
'pyexpat'
,
sources
=
[
...
...
@@ -702,10 +702,9 @@ class PyBuildExt(build_ext):
'expat/xmltok.c'
,
],
define_macros
=
[
(
'HAVE_EXPAT_H'
,
None
),
(
'XML_NS'
,
'1'
),
(
'XML_DTD'
,
'1'
),
(
'
XML_BYTE_
ORDER'
,
xmlbo
),
(
'
BYTE
ORDER'
,
xmlbo
),
(
'XML_CONTEXT_BYTES'
,
'1024'
),
],
include_dirs
=
[
expatinc
]
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment