diff options
98 files changed, 5364 insertions, 4245 deletions
diff --git a/src/client/rspamdclient.h b/src/client/rspamdclient.h index 9fced29af..dc274b7a8 100644 --- a/src/client/rspamdclient.h +++ b/src/client/rspamdclient.h @@ -20,6 +20,10 @@ #include "ucl.h" #include "contrib/libev/ev.h" +#ifdef __cplusplus +extern "C" { +#endif + struct rspamd_client_connection; struct rspamd_http_message; @@ -48,6 +52,7 @@ typedef void (*rspamd_client_callback) ( GError *err); struct rspamd_http_context; + /** * Start rspamd worker or controller command * @param ev_base event base @@ -56,7 +61,7 @@ struct rspamd_http_context; * @param timeout timeout in seconds * @return */ -struct rspamd_client_connection * rspamd_client_init ( +struct rspamd_client_connection *rspamd_client_init ( struct rspamd_http_context *http_ctx, struct ev_loop *ev_base, const gchar *name, @@ -92,4 +97,8 @@ gboolean rspamd_client_command ( */ void rspamd_client_destroy (struct rspamd_client_connection *conn); +#ifdef __cplusplus +} +#endif + #endif /* RSPAMDCLIENT_H_ */ diff --git a/src/libcryptobox/base64/base64.h b/src/libcryptobox/base64/base64.h index e7c639d58..e2be379b5 100644 --- a/src/libcryptobox/base64/base64.h +++ b/src/libcryptobox/base64/base64.h @@ -18,6 +18,14 @@ #include "config.h" -const char* base64_load (void); +#ifdef __cplusplus +extern "C" { +#endif + +const char *base64_load (void); + +#ifdef __cplusplus +} +#endif #endif /* SRC_LIBCRYPTOBOX_BASE64_BASE64_H_ */ diff --git a/src/libcryptobox/catena/catena.h b/src/libcryptobox/catena/catena.h index 56da560ea..bf81cc0f9 100644 --- a/src/libcryptobox/catena/catena.h +++ b/src/libcryptobox/catena/catena.h @@ -24,12 +24,16 @@ #define CATENA_HLEN 64 +#ifdef __cplusplus +extern "C" { +#endif + int -catena (const uint8_t *pwd, const uint32_t pwdlen, - const uint8_t *salt, const uint8_t saltlen, - const uint8_t *data, const uint32_t datalen, - const uint8_t lambda, const uint8_t min_garlic, - const uint8_t garlic, const uint8_t hashlen, uint8_t *hash); +catena (const uint8_t *pwd, const uint32_t pwdlen, + const uint8_t *salt, const uint8_t saltlen, + const uint8_t *data, const uint32_t datalen, + const uint8_t lambda, const uint8_t min_garlic, + const uint8_t garlic, const uint8_t hashlen, uint8_t *hash); /** * Simple interface for catena PBKDF @@ -43,13 +47,17 @@ catena (const uint8_t *pwd, const uint32_t pwdlen, * @return 0 if hash is generated, -1 in case of error */ int simple_catena (const uint8_t *pwd, const uint32_t pwdlen, - const uint8_t *salt, const uint8_t saltlen, - const uint8_t *data, const uint32_t datalen, - uint8_t hash[CATENA_HLEN]); + const uint8_t *salt, const uint8_t saltlen, + const uint8_t *data, const uint32_t datalen, + uint8_t hash[CATENA_HLEN]); /** * Run a quick test on catena implementation */ int catena_test (void); +#ifdef __cplusplus +} +#endif + #endif /* SRC_LIBCRYPTOBOX_CATENA_CATENA_H_ */ diff --git a/src/libcryptobox/chacha20/chacha.h b/src/libcryptobox/chacha20/chacha.h index 7f93a4517..02d6dba00 100644 --- a/src/libcryptobox/chacha20/chacha.h +++ b/src/libcryptobox/chacha20/chacha.h @@ -29,6 +29,10 @@ #define CHACHA_BLOCKBYTES 64 +#ifdef __cplusplus +extern "C" { +#endif + typedef struct chacha_state_internal_t { unsigned char s[48]; size_t rounds; @@ -53,26 +57,31 @@ typedef struct chacha_iv24_t { } chacha_iv24; void hchacha (const unsigned char key[32], const unsigned char iv[16], - unsigned char out[32], size_t rounds); + unsigned char out[32], size_t rounds); void chacha_init (chacha_state *S, const chacha_key *key, const chacha_iv *iv, - size_t rounds); + size_t rounds); void xchacha_init (chacha_state *S, const chacha_key *key, - const chacha_iv24 *iv, size_t rounds); + const chacha_iv24 *iv, size_t rounds); size_t chacha_update (chacha_state *S, const unsigned char *in, - unsigned char *out, size_t inlen); + unsigned char *out, size_t inlen); size_t chacha_final (chacha_state *S, unsigned char *out); void chacha (const chacha_key *key, const chacha_iv *iv, - const unsigned char *in, unsigned char *out, size_t inlen, - size_t rounds); + const unsigned char *in, unsigned char *out, size_t inlen, + size_t rounds); + void xchacha (const chacha_key *key, const chacha_iv24 *iv, - const unsigned char *in, unsigned char *out, size_t inlen, - size_t rounds); + const unsigned char *in, unsigned char *out, size_t inlen, + size_t rounds); + +const char *chacha_load (void); -const char* chacha_load (void); +#ifdef __cplusplus +} +#endif #endif /* CHACHA_H_ */ diff --git a/src/libcryptobox/cryptobox.h b/src/libcryptobox/cryptobox.h index df713d79b..d9e4f51cd 100644 --- a/src/libcryptobox/cryptobox.h +++ b/src/libcryptobox/cryptobox.h @@ -18,14 +18,18 @@ #include "config.h" +#ifdef __cplusplus +extern "C" { +#endif + struct rspamd_cryptobox_segment { guchar *data; gsize len; }; #if defined(__GNUC__) && \ - ((defined(__clang__) && (__clang_major__ >= 4 || (__clang_major__ >= 3 && __clang_minor__ >= 8))) || \ - ((__GNUC__ == 4) && (__GNUC_MINOR__ >= 8) || (__GNUC__ > 4))) + ((defined(__clang__) && (__clang_major__ >= 4 || (__clang_major__ >= 3 && __clang_minor__ >= 8))) || \ + ((__GNUC__ == 4) && (__GNUC_MINOR__ >= 8) || (__GNUC__ > 4))) #define RSPAMD_HAS_TARGET_ATTR 1 #endif @@ -81,7 +85,7 @@ struct rspamd_cryptobox_library_ctx { /** * Init cryptobox library */ -struct rspamd_cryptobox_library_ctx* rspamd_cryptobox_init (void); +struct rspamd_cryptobox_library_ctx *rspamd_cryptobox_init (void); /** * Generate new keypair @@ -89,7 +93,7 @@ struct rspamd_cryptobox_library_ctx* rspamd_cryptobox_init (void); * @param sk secret key buffer */ void rspamd_cryptobox_keypair (rspamd_pk_t pk, rspamd_sk_t sk, - enum rspamd_cryptobox_mode mode); + enum rspamd_cryptobox_mode mode); /** * Generate new keypair for signing @@ -97,7 +101,7 @@ void rspamd_cryptobox_keypair (rspamd_pk_t pk, rspamd_sk_t sk, * @param sk secret key buffer */ void rspamd_cryptobox_keypair_sig (rspamd_sig_pk_t pk, rspamd_sig_sk_t sk, - enum rspamd_cryptobox_mode mode); + enum rspamd_cryptobox_mode mode); /** * Encrypt data inplace adding signature to sig afterwards @@ -107,9 +111,9 @@ void rspamd_cryptobox_keypair_sig (rspamd_sig_pk_t pk, rspamd_sig_sk_t sk, * @param sig output signature */ void rspamd_cryptobox_encrypt_inplace (guchar *data, gsize len, - const rspamd_nonce_t nonce, - const rspamd_pk_t pk, const rspamd_sk_t sk, rspamd_mac_t sig, - enum rspamd_cryptobox_mode mode); + const rspamd_nonce_t nonce, + const rspamd_pk_t pk, const rspamd_sk_t sk, rspamd_mac_t sig, + enum rspamd_cryptobox_mode mode); /** * Encrypt segments of data inplace adding signature to sig afterwards @@ -120,10 +124,10 @@ void rspamd_cryptobox_encrypt_inplace (guchar *data, gsize len, * @param sig output signature */ void rspamd_cryptobox_encryptv_inplace (struct rspamd_cryptobox_segment *segments, - gsize cnt, - const rspamd_nonce_t nonce, - const rspamd_pk_t pk, const rspamd_sk_t sk, rspamd_mac_t sig, - enum rspamd_cryptobox_mode mode); + gsize cnt, + const rspamd_nonce_t nonce, + const rspamd_pk_t pk, const rspamd_sk_t sk, rspamd_mac_t sig, + enum rspamd_cryptobox_mode mode); /** @@ -136,9 +140,9 @@ void rspamd_cryptobox_encryptv_inplace (struct rspamd_cryptobox_segment *segment * @return TRUE if input has been verified successfully */ gboolean rspamd_cryptobox_decrypt_inplace (guchar *data, gsize len, - const rspamd_nonce_t nonce, - const rspamd_pk_t pk, const rspamd_sk_t sk, const rspamd_mac_t sig, - enum rspamd_cryptobox_mode mode); + const rspamd_nonce_t nonce, + const rspamd_pk_t pk, const rspamd_sk_t sk, const rspamd_mac_t sig, + enum rspamd_cryptobox_mode mode); /** * Encrypt segments of data inplace adding signature to sig afterwards @@ -149,9 +153,9 @@ gboolean rspamd_cryptobox_decrypt_inplace (guchar *data, gsize len, * @param sig output signature */ void rspamd_cryptobox_encrypt_nm_inplace (guchar *data, gsize len, - const rspamd_nonce_t nonce, - const rspamd_nm_t nm, rspamd_mac_t sig, - enum rspamd_cryptobox_mode mode); + const rspamd_nonce_t nonce, + const rspamd_nm_t nm, rspamd_mac_t sig, + enum rspamd_cryptobox_mode mode); /** * Encrypt segments of data inplace adding signature to sig afterwards @@ -162,10 +166,10 @@ void rspamd_cryptobox_encrypt_nm_inplace (guchar *data, gsize len, * @param sig output signature */ void rspamd_cryptobox_encryptv_nm_inplace (struct rspamd_cryptobox_segment *segments, - gsize cnt, - const rspamd_nonce_t nonce, - const rspamd_nm_t nm, rspamd_mac_t sig, - enum rspamd_cryptobox_mode mode); + gsize cnt, + const rspamd_nonce_t nonce, + const rspamd_nm_t nm, rspamd_mac_t sig, + enum rspamd_cryptobox_mode mode); /** @@ -178,9 +182,9 @@ void rspamd_cryptobox_encryptv_nm_inplace (struct rspamd_cryptobox_segment *segm * @return TRUE if input has been verified successfully */ gboolean rspamd_cryptobox_decrypt_nm_inplace (guchar *data, gsize len, - const rspamd_nonce_t nonce, - const rspamd_nm_t nm, const rspamd_mac_t sig, - enum rspamd_cryptobox_mode mode); + const rspamd_nonce_t nonce, + const rspamd_nm_t nm, const rspamd_mac_t sig, + enum rspamd_cryptobox_mode mode); /** * Generate shared secret from local sk and remote pk @@ -189,7 +193,7 @@ gboolean rspamd_cryptobox_decrypt_nm_inplace (guchar *data, gsize len, * @param sk local privkey */ void rspamd_cryptobox_nm (rspamd_nm_t nm, const rspamd_pk_t pk, - const rspamd_sk_t sk, enum rspamd_cryptobox_mode mode); + const rspamd_sk_t sk, enum rspamd_cryptobox_mode mode); /** * Create digital signature for the specified message and place result in `sig` @@ -200,9 +204,9 @@ void rspamd_cryptobox_nm (rspamd_nm_t nm, const rspamd_pk_t pk, * @param sk secret key */ void rspamd_cryptobox_sign (guchar *sig, gsize *siglen_p, - const guchar *m, gsize mlen, - const rspamd_sk_t sk, - enum rspamd_cryptobox_mode mode); + const guchar *m, gsize mlen, + const rspamd_sk_t sk, + enum rspamd_cryptobox_mode mode); /** * Verifies digital signature for the specified message using the specified @@ -214,18 +218,18 @@ void rspamd_cryptobox_sign (guchar *sig, gsize *siglen_p, * @return true if signature is valid, false otherwise */ bool rspamd_cryptobox_verify (const guchar *sig, - gsize siglen, - const guchar *m, - gsize mlen, - const rspamd_pk_t pk, - enum rspamd_cryptobox_mode mode); + gsize siglen, + const guchar *m, + gsize mlen, + const rspamd_pk_t pk, + enum rspamd_cryptobox_mode mode); /** * Securely clear the buffer specified * @param buf buffer to zero * @param buflen length of buffer */ -void rspamd_explicit_memzero (void * const buf, gsize buflen); +void rspamd_explicit_memzero (void *const buf, gsize buflen); /** * Constant time memcmp @@ -245,8 +249,8 @@ rspamd_cryptobox_memcmp (const void *const b1_, const void *const b2_, gsize len * @param k key (must be 16 bytes) */ void rspamd_cryptobox_siphash (unsigned char *out, const unsigned char *in, - unsigned long long inlen, - const rspamd_sipkey_t k); + unsigned long long inlen, + const rspamd_sipkey_t k); enum rspamd_cryptobox_pbkdf_type { RSPAMD_CRYPTOBOX_PBKDF2 = 0, @@ -266,10 +270,10 @@ enum rspamd_cryptobox_pbkdf_type { * @return TRUE in case of success and FALSE if failed */ gboolean rspamd_cryptobox_pbkdf (const char *pass, gsize pass_len, - const guint8 *salt, gsize salt_len, - guint8 *key, gsize key_len, - unsigned int complexity, - enum rspamd_cryptobox_pbkdf_type type); + const guint8 *salt, gsize salt_len, + guint8 *key, gsize key_len, + unsigned int complexity, + enum rspamd_cryptobox_pbkdf_type type); /** @@ -313,7 +317,7 @@ guint rspamd_cryptobox_mac_bytes (enum rspamd_cryptobox_mode mode); guint rspamd_cryptobox_signature_bytes (enum rspamd_cryptobox_mode mode); /* Hash IUF interface */ -typedef struct rspamd_cryptobox_hash_state_s { +typedef struct rspamd_cryptobox_hash_state_s { unsigned char opaque[256]; } rspamd_cryptobox_hash_state_t; @@ -338,10 +342,10 @@ void rspamd_cryptobox_hash_final (void *st, guchar *out); * One in all function */ void rspamd_cryptobox_hash (guchar *out, - const guchar *data, - gsize len, - const guchar *key, - gsize keylen); + const guchar *data, + gsize len, + const guchar *key, + gsize keylen); enum rspamd_cryptobox_fast_hash_type { RSPAMD_CRYPTOBOX_XXHASH64 = 0, @@ -353,7 +357,7 @@ enum rspamd_cryptobox_fast_hash_type { }; /* Non crypto hash IUF interface */ -typedef struct rspamd_cryptobox_fast_hash_state_s { +typedef struct rspamd_cryptobox_fast_hash_state_s { guint64 opaque[11]; enum rspamd_cryptobox_fast_hash_type type; } rspamd_cryptobox_fast_hash_state_t; @@ -364,7 +368,7 @@ typedef struct rspamd_cryptobox_fast_hash_state_s { * non-keyed hash is generated */ void rspamd_cryptobox_fast_hash_init (rspamd_cryptobox_fast_hash_state_t *st, - guint64 seed); + guint64 seed); /** * Init cryptobox hash state using key if needed, `st` must point to the buffer @@ -379,7 +383,7 @@ void rspamd_cryptobox_fast_hash_init_specific (rspamd_cryptobox_fast_hash_state_ * Update hash with data portion */ void rspamd_cryptobox_fast_hash_update (rspamd_cryptobox_fast_hash_state_t *st, - const void *data, gsize len); + const void *data, gsize len); /** * Output hash to the buffer of rspamd_cryptobox_HASHBYTES length @@ -390,7 +394,7 @@ guint64 rspamd_cryptobox_fast_hash_final (rspamd_cryptobox_fast_hash_state_t *st * One in all function */ guint64 rspamd_cryptobox_fast_hash (const void *data, - gsize len, guint64 seed); + gsize len, guint64 seed); /** * Platform independent version @@ -409,7 +413,7 @@ guint64 rspamd_cryptobox_fast_hash_specific ( * @return */ gboolean rspamd_cryptobox_base64_decode (const gchar *in, gsize inlen, - guchar *out, gsize *outlen); + guchar *out, gsize *outlen); /** * Returns TRUE if data looks like a valid base64 string @@ -419,4 +423,8 @@ gboolean rspamd_cryptobox_base64_decode (const gchar *in, gsize inlen, */ gboolean rspamd_cryptobox_base64_is_valid (const gchar *in, gsize inlen); +#ifdef __cplusplus +} +#endif + #endif /* CRYPTOBOX_H_ */ diff --git a/src/libcryptobox/curve25519/curve25519.h b/src/libcryptobox/curve25519/curve25519.h index 8b404f5c6..c75c355f8 100644 --- a/src/libcryptobox/curve25519/curve25519.h +++ b/src/libcryptobox/curve25519/curve25519.h @@ -3,11 +3,21 @@ #include "config.h" +#ifdef __cplusplus +extern "C" { +#endif + static const guchar curve25519_basepoint[32] = {9}; int curve25519 (guchar *mypublic, const guchar *secret, const guchar *basepoint); + /* Call for optimized implementation of scalarmult if needed */ int curve25519_base (guchar *mypublic, const guchar *secret); -const char* curve25519_load (void); + +const char *curve25519_load (void); + +#ifdef __cplusplus +} +#endif #endif diff --git a/src/libcryptobox/curve25519/fe.h b/src/libcryptobox/curve25519/fe.h index a64206026..44e8b44a6 100644 --- a/src/libcryptobox/curve25519/fe.h +++ b/src/libcryptobox/curve25519/fe.h @@ -18,25 +18,44 @@ #ifndef SRC_LIBCRYPTOBOX_CURVE25519_FE_H_ #define SRC_LIBCRYPTOBOX_CURVE25519_FE_H_ + +#ifdef __cplusplus +extern "C" { +#endif + typedef int32_t fe[10]; -void fe_frombytes(fe,const unsigned char *); -void fe_tobytes(unsigned char *,const fe); - -void fe_copy(fe,const fe); -int fe_isnonzero(const fe); -int fe_isnegative(const fe); -void fe_0(fe); -void fe_1(fe); -void fe_cmov(fe,const fe,unsigned int); -void fe_add(fe,const fe,const fe); -void fe_sub(fe,const fe,const fe); -void fe_neg(fe,const fe); -void fe_mul(fe,const fe,const fe); -void fe_sq(fe,const fe); -void fe_sq2(fe,const fe); -void fe_invert(fe,const fe); -void fe_pow22523(fe,const fe); +void fe_frombytes (fe, const unsigned char *); + +void fe_tobytes (unsigned char *, const fe); + +void fe_copy (fe, const fe); + +int fe_isnonzero (const fe); + +int fe_isnegative (const fe); + +void fe_0 (fe); + +void fe_1 (fe); + +void fe_cmov (fe, const fe, unsigned int); + +void fe_add (fe, const fe, const fe); + +void fe_sub (fe, const fe, const fe); + +void fe_neg (fe, const fe); + +void fe_mul (fe, const fe, const fe); + +void fe_sq (fe, const fe); + +void fe_sq2 (fe, const fe); + +void fe_invert (fe, const fe); + +void fe_pow22523 (fe, const fe); /* ge means group element. @@ -51,68 +70,90 @@ Representations: */ typedef struct { - fe X; - fe Y; - fe Z; + fe X; + fe Y; + fe Z; } ge_p2; typedef struct { - fe X; - fe Y; - fe Z; - fe T; + fe X; + fe Y; + fe Z; + fe T; } ge_p3; typedef struct { - fe X; - fe Y; - fe Z; - fe T; + fe X; + fe Y; + fe Z; + fe T; } ge_p1p1; typedef struct { - fe yplusx; - fe yminusx; - fe xy2d; + fe yplusx; + fe yminusx; + fe xy2d; } ge_precomp; typedef struct { - fe YplusX; - fe YminusX; - fe Z; - fe T2d; + fe YplusX; + fe YminusX; + fe Z; + fe T2d; } ge_cached; -void ge_tobytes(unsigned char *,const ge_p2 *); -void ge_p3_tobytes(unsigned char *,const ge_p3 *); -int ge_frombytes_negate_vartime(ge_p3 *,const unsigned char *); - -void ge_p2_0(ge_p2 *); -void ge_p3_0(ge_p3 *); -void ge_precomp_0(ge_precomp *); -void ge_p3_to_p2(ge_p2 *,const ge_p3 *); -void ge_p3_to_cached(ge_cached *,const ge_p3 *); -void ge_p1p1_to_p2(ge_p2 *,const ge_p1p1 *); -void ge_p1p1_to_p3(ge_p3 *,const ge_p1p1 *); -void ge_p2_dbl(ge_p1p1 *,const ge_p2 *); -void ge_p3_dbl(ge_p1p1 *,const ge_p3 *); - -void ge_madd(ge_p1p1 *,const ge_p3 *,const ge_precomp *); -void ge_msub(ge_p1p1 *,const ge_p3 *,const ge_precomp *); -void ge_add(ge_p1p1 *,const ge_p3 *,const ge_cached *); -void ge_sub(ge_p1p1 *,const ge_p3 *,const ge_cached *); -void ge_scalarmult_base(ge_p3 *,const unsigned char *); -void ge_double_scalarmult_vartime(ge_p2 *,const unsigned char *,const ge_p3 *,const unsigned char *); -void ge_scalarmult_vartime(ge_p3 *,const unsigned char *,const ge_p3 *); -int verify_32(const unsigned char *x, const unsigned char *y); +void ge_tobytes (unsigned char *, const ge_p2 *); + +void ge_p3_tobytes (unsigned char *, const ge_p3 *); + +int ge_frombytes_negate_vartime (ge_p3 *, const unsigned char *); + +void ge_p2_0 (ge_p2 *); + +void ge_p3_0 (ge_p3 *); + +void ge_precomp_0 (ge_precomp *); + +void ge_p3_to_p2 (ge_p2 *, const ge_p3 *); + +void ge_p3_to_cached (ge_cached *, const ge_p3 *); + +void ge_p1p1_to_p2 (ge_p2 *, const ge_p1p1 *); + +void ge_p1p1_to_p3 (ge_p3 *, const ge_p1p1 *); + +void ge_p2_dbl (ge_p1p1 *, const ge_p2 *); + +void ge_p3_dbl (ge_p1p1 *, const ge_p3 *); + +void ge_madd (ge_p1p1 *, const ge_p3 *, const ge_precomp *); + +void ge_msub (ge_p1p1 *, const ge_p3 *, const ge_precomp *); + +void ge_add (ge_p1p1 *, const ge_p3 *, const ge_cached *); + +void ge_sub (ge_p1p1 *, const ge_p3 *, const ge_cached *); + +void ge_scalarmult_base (ge_p3 *, const unsigned char *); + +void ge_double_scalarmult_vartime (ge_p2 *, const unsigned char *, const ge_p3 *, const unsigned char *); + +void ge_scalarmult_vartime (ge_p3 *, const unsigned char *, const ge_p3 *); + +int verify_32 (const unsigned char *x, const unsigned char *y); /* The set of scalars is \Z/l where l = 2^252 + 27742317777372353535851937790883648493. */ -void sc_reduce(unsigned char *); -void sc_muladd(unsigned char *,const unsigned char *,const unsigned char *,const unsigned char *); +void sc_reduce (unsigned char *); + +void sc_muladd (unsigned char *, const unsigned char *, const unsigned char *, const unsigned char *); + +#ifdef __cplusplus +} +#endif #endif /* SRC_LIBCRYPTOBOX_CURVE25519_FE_H_ */ diff --git a/src/libcryptobox/ed25519/ed25519.h b/src/libcryptobox/ed25519/ed25519.h index 0fbf7d6fe..a1f702c4a 100644 --- a/src/libcryptobox/ed25519/ed25519.h +++ b/src/libcryptobox/ed25519/ed25519.h @@ -20,15 +20,27 @@ #include <stdbool.h> #include <stddef.h> -const char* ed25519_load (void); +#ifdef __cplusplus +extern "C" { +#endif + +const char *ed25519_load (void); + void ed25519_keypair (unsigned char *pk, unsigned char *sk); + void ed25519_seed_keypair (unsigned char *pk, unsigned char *sk, unsigned char *seed); + void ed25519_sign (unsigned char *sig, size_t *siglen_p, - const unsigned char *m, size_t mlen, - const unsigned char *sk); + const unsigned char *m, size_t mlen, + const unsigned char *sk); + bool ed25519_verify (const unsigned char *sig, - const unsigned char *m, - size_t mlen, - const unsigned char *pk); + const unsigned char *m, + size_t mlen, + const unsigned char *pk); + +#ifdef __cplusplus +} +#endif #endif /* SRC_LIBCRYPTOBOX_ED25519_ED25519_H_ */ diff --git a/src/libcryptobox/keypair.h b/src/libcryptobox/keypair.h index 92af13b68..e2b20dc55 100644 --- a/src/libcryptobox/keypair.h +++ b/src/libcryptobox/keypair.h @@ -20,6 +20,10 @@ #include "cryptobox.h" #include "ucl.h" +#ifdef __cplusplus +extern "C" { +#endif + /** * Keypair type */ @@ -45,7 +49,7 @@ struct rspamd_cryptobox_pubkey; * @param alg algorithm for the keypair * @return fresh keypair generated */ -struct rspamd_cryptobox_keypair* rspamd_keypair_new ( +struct rspamd_cryptobox_keypair *rspamd_keypair_new ( enum rspamd_cryptobox_keypair_type type, enum rspamd_cryptobox_mode alg); @@ -54,7 +58,7 @@ struct rspamd_cryptobox_keypair* rspamd_keypair_new ( * @param kp * @return */ -struct rspamd_cryptobox_keypair* rspamd_keypair_ref ( +struct rspamd_cryptobox_keypair *rspamd_keypair_ref ( struct rspamd_cryptobox_keypair *kp); /** @@ -68,7 +72,7 @@ void rspamd_keypair_unref (struct rspamd_cryptobox_keypair *kp); * @param kp * @return */ -struct rspamd_cryptobox_pubkey* rspamd_pubkey_ref ( +struct rspamd_cryptobox_pubkey *rspamd_pubkey_ref ( struct rspamd_cryptobox_pubkey *kp); /** @@ -78,10 +82,10 @@ struct rspamd_cryptobox_pubkey* rspamd_pubkey_ref ( * @param alg algorithm of the key (nist or curve25519) * @return new pubkey or NULL in case of error */ -struct rspamd_cryptobox_pubkey* rspamd_pubkey_from_base32 (const gchar *b32, - gsize len, - enum rspamd_cryptobox_keypair_type type, - enum rspamd_cryptobox_mode alg); +struct rspamd_cryptobox_pubkey *rspamd_pubkey_from_base32 (const gchar *b32, + gsize len, + enum rspamd_cryptobox_keypair_type type, + enum rspamd_cryptobox_mode alg); /** * Load pubkey from hex string @@ -90,10 +94,10 @@ struct rspamd_cryptobox_pubkey* rspamd_pubkey_from_base32 (const gchar *b32, * @param alg algorithm of the key (nist or curve25519) * @return new pubkey or NULL in case of error */ -struct rspamd_cryptobox_pubkey* rspamd_pubkey_from_hex (const gchar *hex, - gsize len, - enum rspamd_cryptobox_keypair_type type, - enum rspamd_cryptobox_mode alg); +struct rspamd_cryptobox_pubkey *rspamd_pubkey_from_hex (const gchar *hex, + gsize len, + enum rspamd_cryptobox_keypair_type type, + enum rspamd_cryptobox_mode alg); /** * Load pubkey from raw chunk string @@ -102,10 +106,10 @@ struct rspamd_cryptobox_pubkey* rspamd_pubkey_from_hex (const gchar *hex, * @param alg algorithm of the key (nist or curve25519) * @return new pubkey or NULL in case of error */ -struct rspamd_cryptobox_pubkey* rspamd_pubkey_from_bin (const guchar *raw, - gsize len, - enum rspamd_cryptobox_keypair_type type, - enum rspamd_cryptobox_mode alg); +struct rspamd_cryptobox_pubkey *rspamd_pubkey_from_bin (const guchar *raw, + gsize len, + enum rspamd_cryptobox_keypair_type type, + enum rspamd_cryptobox_mode alg); /** @@ -119,6 +123,7 @@ void rspamd_pubkey_unref (struct rspamd_cryptobox_pubkey *kp); */ enum rspamd_cryptobox_keypair_type rspamd_keypair_type ( struct rspamd_cryptobox_keypair *kp); + /** * Get type of pubkey */ @@ -129,6 +134,7 @@ enum rspamd_cryptobox_keypair_type rspamd_pubkey_type ( * Get algorithm of keypair */ enum rspamd_cryptobox_mode rspamd_keypair_alg (struct rspamd_cryptobox_keypair *kp); + /** * Get algorithm of pubkey */ @@ -139,29 +145,30 @@ enum rspamd_cryptobox_mode rspamd_pubkey_alg (struct rspamd_cryptobox_pubkey *p) * @param p * @return */ -const guchar * rspamd_pubkey_get_nm (struct rspamd_cryptobox_pubkey *p, - struct rspamd_cryptobox_keypair *kp); +const guchar *rspamd_pubkey_get_nm (struct rspamd_cryptobox_pubkey *p, + struct rspamd_cryptobox_keypair *kp); /** * Calculate and store nm value for the specified local key (performs ECDH) * @param p * @return */ -const guchar * rspamd_pubkey_calculate_nm (struct rspamd_cryptobox_pubkey *p, - struct rspamd_cryptobox_keypair *kp); +const guchar *rspamd_pubkey_calculate_nm (struct rspamd_cryptobox_pubkey *p, + struct rspamd_cryptobox_keypair *kp); /** * Get raw public key id for a specified keypair (rspamd_cryptobox_HASHBYTES) * @param kp * @return */ -const guchar * rspamd_keypair_get_id (struct rspamd_cryptobox_keypair *kp); +const guchar *rspamd_keypair_get_id (struct rspamd_cryptobox_keypair *kp); + /** * Get raw public key id for a specified key (rspamd_cryptobox_HASHBYTES) * @param kp * @return */ -const guchar * rspamd_pubkey_get_id (struct rspamd_cryptobox_pubkey *pk); +const guchar *rspamd_pubkey_get_id (struct rspamd_cryptobox_pubkey *pk); /** * Get raw public key from pubkey opaque structure @@ -169,8 +176,8 @@ const guchar * rspamd_pubkey_get_id (struct rspamd_cryptobox_pubkey *pk); * @param len * @return */ -const guchar * rspamd_pubkey_get_pk (struct rspamd_cryptobox_pubkey *pk, - guint *len); +const guchar *rspamd_pubkey_get_pk (struct rspamd_cryptobox_pubkey *pk, + guint *len); /** Short ID characters count */ #define RSPAMD_KEYPAIR_SHORT_ID_LEN 5 @@ -187,6 +194,7 @@ const guchar * rspamd_pubkey_get_pk (struct rspamd_cryptobox_pubkey *pk, /** Human readable output */ #define RSPAMD_KEYPAIR_HUMAN 0x20 #define RSPAMD_KEYPAIR_HEX 0x40 + /** * Print keypair encoding it if needed * @param key key to print @@ -194,7 +202,7 @@ const guchar * rspamd_pubkey_get_pk (struct rspamd_cryptobox_pubkey *pk, * @return newly allocated string with keypair */ GString *rspamd_keypair_print (struct rspamd_cryptobox_keypair *kp, - guint how); + guint how); /** * Print pubkey encoding it if needed @@ -203,7 +211,7 @@ GString *rspamd_keypair_print (struct rspamd_cryptobox_keypair *kp, * @return newly allocated string with keypair */ GString *rspamd_pubkey_print (struct rspamd_cryptobox_pubkey *pk, - guint how); + guint how); /** Get keypair pubkey ID */ #define RSPAMD_KEYPAIR_COMPONENT_ID 0 @@ -211,6 +219,7 @@ GString *rspamd_pubkey_print (struct rspamd_cryptobox_pubkey *pk, #define RSPAMD_KEYPAIR_COMPONENT_PK 1 /** Get keypair private key */ #define RSPAMD_KEYPAIR_COMPONENT_SK 2 + /** * Get specific component of a keypair * @param kp keypair @@ -218,23 +227,23 @@ GString *rspamd_pubkey_print (struct rspamd_cryptobox_pubkey *pk, * @param len length of input * @return raw content of the component */ -const guchar * rspamd_keypair_component (struct rspamd_cryptobox_keypair *kp, - guint ncomp, guint *len); +const guchar *rspamd_keypair_component (struct rspamd_cryptobox_keypair *kp, + guint ncomp, guint *len); /** * Create a new keypair from ucl object * @param obj object to load * @return new structure or NULL if an object is invalid */ -struct rspamd_cryptobox_keypair * rspamd_keypair_from_ucl (const ucl_object_t *obj); +struct rspamd_cryptobox_keypair *rspamd_keypair_from_ucl (const ucl_object_t *obj); /** * Converts keypair to ucl object * @param kp * @return */ -ucl_object_t * rspamd_keypair_to_ucl (struct rspamd_cryptobox_keypair *kp, - gboolean is_hex); +ucl_object_t *rspamd_keypair_to_ucl (struct rspamd_cryptobox_keypair *kp, + gboolean is_hex); /** * Signs memory using the specified keypair @@ -247,8 +256,8 @@ ucl_object_t * rspamd_keypair_to_ucl (struct rspamd_cryptobox_keypair *kp, * @return TRUE if signature operation succeeded */ gboolean rspamd_keypair_sign (struct rspamd_cryptobox_keypair *kp, - const void *data, gsize len, guchar **sig, gsize *outlen, - GError **err); + const void *data, gsize len, guchar **sig, gsize *outlen, + GError **err); /*** * Verifies data using public key @@ -261,8 +270,8 @@ gboolean rspamd_keypair_sign (struct rspamd_cryptobox_keypair *kp, * @return TRUE if signature is valid */ gboolean rspamd_keypair_verify (struct rspamd_cryptobox_pubkey *pk, - const void *data, gsize len, const guchar *sig, gsize siglen, - GError **err); + const void *data, gsize len, const guchar *sig, gsize siglen, + GError **err); /** * Compares two public keys @@ -271,7 +280,7 @@ gboolean rspamd_keypair_verify (struct rspamd_cryptobox_pubkey *pk, * @return TRUE if two keys are equal */ gboolean rspamd_pubkey_equal (const struct rspamd_cryptobox_pubkey *k1, - const struct rspamd_cryptobox_pubkey *k2); + const struct rspamd_cryptobox_pubkey *k2); /** * Decrypts data using keypair and a pubkey stored in in, in must start from @@ -304,6 +313,7 @@ gboolean rspamd_keypair_encrypt (struct rspamd_cryptobox_keypair *kp, const guchar *in, gsize inlen, guchar **out, gsize *outlen, GError **err); + /** * Encrypts data usign specific pubkey (must have KEX type). * This method actually generates ephemeral local keypair, use public key from @@ -317,8 +327,12 @@ gboolean rspamd_keypair_encrypt (struct rspamd_cryptobox_keypair *kp, * @return TRUE if encryption has been completed, out must be freed in this case */ gboolean rspamd_pubkey_encrypt (struct rspamd_cryptobox_pubkey *pk, - const guchar *in, gsize inlen, - guchar **out, gsize *outlen, - GError **err); + const guchar *in, gsize inlen, + guchar **out, gsize *outlen, + GError **err); + +#ifdef __cplusplus +} +#endif #endif /* SRC_LIBCRYPTOBOX_KEYPAIR_H_ */ diff --git a/src/libcryptobox/keypair_private.h b/src/libcryptobox/keypair_private.h index 98af52b4c..8d259faaa 100644 --- a/src/libcryptobox/keypair_private.h +++ b/src/libcryptobox/keypair_private.h @@ -20,6 +20,9 @@ #include "ref.h" #include "cryptobox.h" +#ifdef __cplusplus +extern "C" { +#endif /* * KEX cached data */ @@ -32,7 +35,7 @@ struct rspamd_cryptobox_nm { /* * Generic keypair */ -struct rspamd_cryptobox_keypair { +struct rspamd_cryptobox_keypair { guchar id[rspamd_cryptobox_HASHBYTES]; enum rspamd_cryptobox_keypair_type type; enum rspamd_cryptobox_mode alg; @@ -127,7 +130,13 @@ struct rspamd_cryptobox_pubkey_sig_25519 { }; void rspamd_cryptobox_nm_dtor (struct rspamd_cryptobox_nm *nm); + void rspamd_cryptobox_keypair_dtor (struct rspamd_cryptobox_keypair *kp); + void rspamd_cryptobox_pubkey_dtor (struct rspamd_cryptobox_pubkey *p); +#ifdef __cplusplus +} +#endif + #endif /* KEYPAIR_PRIVATE_H_ */ diff --git a/src/libcryptobox/keypairs_cache.h b/src/libcryptobox/keypairs_cache.h index 3ee7c0d51..4f54b6c9d 100644 --- a/src/libcryptobox/keypairs_cache.h +++ b/src/libcryptobox/keypairs_cache.h @@ -19,6 +19,11 @@ #include "config.h" #include "keypair.h" + +#ifdef __cplusplus +extern "C" { +#endif + struct rspamd_keypair_cache; /** @@ -26,7 +31,7 @@ struct rspamd_keypair_cache; * @param max_items defines maximum count of elements in the cache * @return new cache */ -struct rspamd_keypair_cache * rspamd_keypair_cache_new (guint max_items); +struct rspamd_keypair_cache *rspamd_keypair_cache_new (guint max_items); /** @@ -36,8 +41,8 @@ struct rspamd_keypair_cache * rspamd_keypair_cache_new (guint max_items); * @param rk remote key */ void rspamd_keypair_cache_process (struct rspamd_keypair_cache *c, - struct rspamd_cryptobox_keypair *lk, - struct rspamd_cryptobox_pubkey *rk); + struct rspamd_cryptobox_keypair *lk, + struct rspamd_cryptobox_pubkey *rk); /** * Destroy old keypair cache @@ -45,5 +50,8 @@ void rspamd_keypair_cache_process (struct rspamd_keypair_cache *c, */ void rspamd_keypair_cache_destroy (struct rspamd_keypair_cache *c); +#ifdef __cplusplus +} +#endif #endif /* KEYPAIRS_CACHE_H_ */ diff --git a/src/libmime/archives.h b/src/libmime/archives.h index 6abfb857a..bb84d4298 100644 --- a/src/libmime/archives.h +++ b/src/libmime/archives.h @@ -18,6 +18,10 @@ #include "config.h" +#ifdef __cplusplus +extern "C" { +#endif + enum rspamd_archive_type { RSPAMD_ARCHIVE_ZIP, RSPAMD_ARCHIVE_RAR, @@ -57,6 +61,10 @@ void rspamd_archives_process (struct rspamd_task *task); /** * Get textual representation of an archive's type */ -const gchar * rspamd_archive_type_str (enum rspamd_archive_type type); +const gchar *rspamd_archive_type_str (enum rspamd_archive_type type); + +#ifdef __cplusplus +} +#endif #endif /* SRC_LIBMIME_ARCHIVES_H_ */ diff --git a/src/libmime/content_type.h b/src/libmime/content_type.h index 68b1b8107..2e3bf5e40 100644 --- a/src/libmime/content_type.h +++ b/src/libmime/content_type.h @@ -20,6 +20,10 @@ #include "libutil/fstring.h" #include "libutil/mem_pool.h" +#ifdef __cplusplus +extern "C" { +#endif + enum rspamd_content_type_flags { RSPAMD_CONTENT_TYPE_VALID = 0, RSPAMD_CONTENT_TYPE_BROKEN = 1 << 0, @@ -84,8 +88,8 @@ struct rspamd_content_disposition { void rspamd_content_type_add_param (rspamd_mempool_t *pool, struct rspamd_content_type *ct, - gchar *name_start, gchar *name_end, - gchar *value_start, gchar *value_end); + gchar *name_start, gchar *name_end, + gchar *value_start, gchar *value_end); /** * Parse content type from the header (performs copy + lowercase) @@ -94,8 +98,8 @@ rspamd_content_type_add_param (rspamd_mempool_t *pool, * @param pool * @return */ -struct rspamd_content_type * rspamd_content_type_parse (const gchar *in, - gsize len, rspamd_mempool_t *pool); +struct rspamd_content_type *rspamd_content_type_parse (const gchar *in, + gsize len, rspamd_mempool_t *pool); /** * Adds new param for content disposition header @@ -108,9 +112,9 @@ struct rspamd_content_type * rspamd_content_type_parse (const gchar *in, */ void rspamd_content_disposition_add_param (rspamd_mempool_t *pool, - struct rspamd_content_disposition *cd, - const gchar *name_start, const gchar *name_end, - const gchar *value_start, const gchar *value_end); + struct rspamd_content_disposition *cd, + const gchar *name_start, const gchar *name_end, + const gchar *value_start, const gchar *value_end); /** * Parse content-disposition header @@ -119,7 +123,12 @@ rspamd_content_disposition_add_param (rspamd_mempool_t *pool, * @param pool * @return */ -struct rspamd_content_disposition * rspamd_content_disposition_parse (const gchar *in, - gsize len, rspamd_mempool_t *pool); +struct rspamd_content_disposition *rspamd_content_disposition_parse (const gchar *in, + gsize len, + rspamd_mempool_t *pool); + +#ifdef __cplusplus +} +#endif #endif /* SRC_LIBMIME_CONTENT_TYPE_H_ */ diff --git a/src/libmime/email_addr.h b/src/libmime/email_addr.h index 666ded0e9..69aa2aa00 100644 --- a/src/libmime/email_addr.h +++ b/src/libmime/email_addr.h @@ -20,6 +20,11 @@ #include "libutil/mem_pool.h" #include "libutil/ref.h" + +#ifdef __cplusplus +extern "C" { +#endif + struct rspamd_mime_header; enum rspamd_email_address_flags { @@ -62,7 +67,7 @@ struct rspamd_task; * @param len length of string * @return */ -struct rspamd_email_address * rspamd_email_address_from_smtp ( +struct rspamd_email_address *rspamd_email_address_from_smtp ( const gchar *str, guint len); /** @@ -75,9 +80,9 @@ struct rspamd_email_address * rspamd_email_address_from_smtp ( * @return */ GPtrArray *rspamd_email_address_from_mime (rspamd_mempool_t *pool, - const gchar *hdr, - guint len, - GPtrArray *src); + const gchar *hdr, + guint len, + GPtrArray *src); /** * Destroys list of email addresses @@ -87,4 +92,9 @@ void rspamd_email_address_list_destroy (gpointer ptr); void rspamd_email_address_free (struct rspamd_email_address *addr); + +#ifdef __cplusplus +} +#endif + #endif /* SRC_LIBMIME_EMAIL_ADDR_H_ */ diff --git a/src/libmime/filter.h b/src/libmime/filter.h index f9218194a..8245f8c53 100644 --- a/src/libmime/filter.h +++ b/src/libmime/filter.h @@ -10,6 +10,10 @@ #include "rspamd_symcache.h" #include "task.h" +#ifdef __cplusplus +extern "C" { +#endif + struct rspamd_task; struct rspamd_settings; struct rspamd_classifier_config; @@ -67,14 +71,14 @@ struct kh_rspamd_symbols_group_hash_s; struct rspamd_metric_result { - double score; /**< total score */ - double grow_factor; /**< current grow factor */ + double score; /**< total score */ + double grow_factor; /**< current grow factor */ struct rspamd_passthrough_result *passthrough_result; guint npositive; guint nnegative; double positive_score; double negative_score; - struct kh_rspamd_symbols_hash_s *symbols; /**< symbols of metric */ + struct kh_rspamd_symbols_hash_s *symbols; /**< symbols of metric */ struct kh_rspamd_symbols_group_hash_s *sym_groups; /**< groups of symbols */ struct rspamd_action_result *actions_limits; guint nactions; @@ -85,7 +89,7 @@ struct rspamd_metric_result { * @param task task object * @return metric result or NULL if metric `name` has not been found */ -struct rspamd_metric_result * rspamd_create_metric_result (struct rspamd_task *task); +struct rspamd_metric_result *rspamd_create_metric_result (struct rspamd_task *task); /** * Adds a new passthrough result to a task @@ -118,16 +122,16 @@ enum rspamd_symbol_insert_flags { * @param weight numeric weight for symbol * @param opts list of symbol's options */ -struct rspamd_symbol_result* rspamd_task_insert_result_full (struct rspamd_task *task, - const gchar *symbol, - double weight, - const gchar *opts, - enum rspamd_symbol_insert_flags flags); +struct rspamd_symbol_result *rspamd_task_insert_result_full (struct rspamd_task *task, + const gchar *symbol, + double weight, + const gchar *opts, + enum rspamd_symbol_insert_flags flags); #define rspamd_task_insert_result_single(task, symbol, flag, opts) \ - rspamd_task_insert_result_full (task, symbol, flag, opts, RSPAMD_SYMBOL_INSERT_SINGLE) + rspamd_task_insert_result_full (task, symbol, flag, opts, RSPAMD_SYMBOL_INSERT_SINGLE) #define rspamd_task_insert_result(task, symbol, flag, opts) \ - rspamd_task_insert_result_full (task, symbol, flag, opts, RSPAMD_SYMBOL_INSERT_DEFAULT) + rspamd_task_insert_result_full (task, symbol, flag, opts, RSPAMD_SYMBOL_INSERT_DEFAULT) /** @@ -137,7 +141,7 @@ struct rspamd_symbol_result* rspamd_task_insert_result_full (struct rspamd_task * @param opt */ gboolean rspamd_task_add_result_option (struct rspamd_task *task, - struct rspamd_symbol_result *s, const gchar *opt); + struct rspamd_symbol_result *s, const gchar *opt); /** * Finds symbol result @@ -145,7 +149,7 @@ gboolean rspamd_task_add_result_option (struct rspamd_task *task, * @param sym * @return */ -struct rspamd_symbol_result* rspamd_task_find_symbol_result ( +struct rspamd_symbol_result *rspamd_task_find_symbol_result ( struct rspamd_task *task, const char *sym); /** @@ -166,8 +170,8 @@ void rspamd_task_symbol_result_foreach (struct rspamd_task *task, * @return result metric weight */ double rspamd_factor_consolidation_func (struct rspamd_task *task, - const gchar *metric_name, - const gchar *unused); + const gchar *metric_name, + const gchar *unused); /** @@ -175,6 +179,10 @@ double rspamd_factor_consolidation_func (struct rspamd_task *task, * @param task * @return */ -struct rspamd_action* rspamd_check_action_metric (struct rspamd_task *task); +struct rspamd_action *rspamd_check_action_metric (struct rspamd_task *task); + +#ifdef __cplusplus +} +#endif #endif diff --git a/src/libmime/filter_private.h b/src/libmime/filter_private.h index 82322a6bb..31def75e2 100644 --- a/src/libmime/filter_private.h +++ b/src/libmime/filter_private.h @@ -8,6 +8,10 @@ #include "filter.h" #include "contrib/libucl/khash.h" +#ifdef __cplusplus +extern "C" { +#endif + KHASH_MAP_INIT_STR (rspamd_options_hash, struct rspamd_symbol_option *); /** * Result of metric processing @@ -28,4 +32,8 @@ KHASH_INIT (rspamd_symbols_group_hash, rspamd_ptr_hash_func, rspamd_ptr_equal_func); +#ifdef __cplusplus +} +#endif + #endif //RSPAMD_FILTER_PRIVATE_H diff --git a/src/libmime/images.h b/src/libmime/images.h index 39a7dc8c5..bf1175b2a 100644 --- a/src/libmime/images.h +++ b/src/libmime/images.h @@ -4,6 +4,10 @@ #include "config.h" #include "fstring.h" +#ifdef __cplusplus +extern "C" { +#endif + struct html_image; struct rspamd_task; struct rspamd_mime_part; @@ -41,14 +45,18 @@ void rspamd_images_process (struct rspamd_task *task); * @param data * @return */ -struct rspamd_image* rspamd_maybe_process_image (rspamd_mempool_t *pool, - rspamd_ftok_t *data); +struct rspamd_image *rspamd_maybe_process_image (rspamd_mempool_t *pool, + rspamd_ftok_t *data); /* * Get textual representation of an image's type */ -const gchar * rspamd_image_type_str (enum rspamd_image_type type); +const gchar *rspamd_image_type_str (enum rspamd_image_type type); void rspamd_image_normalize (struct rspamd_task *task, struct rspamd_image *img); +#ifdef __cplusplus +} +#endif + #endif /* IMAGES_H_ */ diff --git a/src/libmime/lang_detection.h b/src/libmime/lang_detection.h index 517ab037e..3eaa4e286 100644 --- a/src/libmime/lang_detection.h +++ b/src/libmime/lang_detection.h @@ -22,6 +22,10 @@ #include "libstat/stat_api.h" #include "libmime/message.h" +#ifdef __cplusplus +extern "C" { +#endif + struct rspamd_lang_detector; struct rspamd_language_elt; struct rspamd_task; @@ -57,10 +61,11 @@ struct rspamd_lang_detector_res { * @param cfg * @return */ -struct rspamd_lang_detector* rspamd_language_detector_init (struct rspamd_config *cfg); +struct rspamd_lang_detector *rspamd_language_detector_init (struct rspamd_config *cfg); + +struct rspamd_lang_detector *rspamd_language_detector_ref (struct rspamd_lang_detector *d); -struct rspamd_lang_detector* rspamd_language_detector_ref (struct rspamd_lang_detector* d); -void rspamd_language_detector_unref (struct rspamd_lang_detector* d); +void rspamd_language_detector_unref (struct rspamd_lang_detector *d); /** * Try to detect language of words @@ -70,8 +75,8 @@ void rspamd_language_detector_unref (struct rspamd_lang_detector* d); * @return array of struct rspamd_lang_detector_res sorted by freq descending */ gboolean rspamd_language_detector_detect (struct rspamd_task *task, - struct rspamd_lang_detector *d, - struct rspamd_mime_text_part *part); + struct rspamd_lang_detector *d, + struct rspamd_mime_text_part *part); /** * Returns TRUE if the specified word is known to be a stop word @@ -81,6 +86,11 @@ gboolean rspamd_language_detector_detect (struct rspamd_task *task, * @return */ gboolean rspamd_language_detector_is_stop_word (struct rspamd_lang_detector *d, - const gchar *word, gsize wlen); + const gchar *word, gsize wlen); + + +#ifdef __cplusplus +} +#endif #endif diff --git a/src/libmime/message.h b/src/libmime/message.h index eb260cd77..17c4ec5b9 100644 --- a/src/libmime/message.h +++ b/src/libmime/message.h @@ -16,6 +16,10 @@ #include <unicode/uchar.h> #include <unicode/utext.h> +#ifdef __cplusplus +extern "C" { +#endif + struct rspamd_task; struct controller_session; struct html_content; @@ -106,9 +110,9 @@ struct rspamd_mime_text_part { GArray *utf_words; UText utf_stripped_text; /* Used by libicu to represent the utf8 content */ - GPtrArray *newlines; /**< positions of newlines in text, relative to content*/ + GPtrArray *newlines; /**< positions of newlines in text, relative to content*/ struct html_content *html; - GList *exceptions; /**< list of offsets of urls */ + GList *exceptions; /**< list of offsets of urls */ struct rspamd_mime_part *mime_part; guint flags; @@ -146,8 +150,9 @@ void rspamd_message_process (struct rspamd_task *task); * @return An array of header's values or NULL. It is NOT permitted to free array or values. */ GPtrArray *rspamd_message_get_header_array (struct rspamd_task *task, - const gchar *field, - gboolean strong); + const gchar *field, + gboolean strong); + /** * Get an array of mime parts header's values with specified header's name using raw headers * @param task worker task structure @@ -156,8 +161,8 @@ GPtrArray *rspamd_message_get_header_array (struct rspamd_task *task, * @return An array of header's values or NULL. It is NOT permitted to free array or values. */ GPtrArray *rspamd_message_get_mime_header_array (struct rspamd_task *task, - const gchar *field, - gboolean strong); + const gchar *field, + gboolean strong); /** * Get an array of header's values with specified header's name using raw headers @@ -167,9 +172,9 @@ GPtrArray *rspamd_message_get_mime_header_array (struct rspamd_task *task, * @return An array of header's values or NULL. It is NOT permitted to free array or values. */ GPtrArray *rspamd_message_get_header_from_hash (GHashTable *htb, - rspamd_mempool_t *pool, - const gchar *field, - gboolean strong); + rspamd_mempool_t *pool, + const gchar *field, + gboolean strong); /** @@ -184,6 +189,10 @@ enum rspamd_cte rspamd_cte_from_string (const gchar *str); * @param ct * @return */ -const gchar* rspamd_cte_to_string (enum rspamd_cte ct); +const gchar *rspamd_cte_to_string (enum rspamd_cte ct); + +#ifdef __cplusplus +} +#endif #endif diff --git a/src/libmime/mime_encoding.c b/src/libmime/mime_encoding.c index 7b897929e..8dc7da12e 100644 --- a/src/libmime/mime_encoding.c +++ b/src/libmime/mime_encoding.c @@ -18,6 +18,7 @@ #include "libutil/mem_pool.h" #include "libutil/regexp.h" #include "libutil/hash.h" +#include "libserver/cfg_file.h" #include "libserver/task.h" #include "mime_encoding.h" #include "message.h" diff --git a/src/libmime/mime_encoding.h b/src/libmime/mime_encoding.h index 1a61339ca..5224d33fb 100644 --- a/src/libmime/mime_encoding.h +++ b/src/libmime/mime_encoding.h @@ -21,6 +21,10 @@ #include "fstring.h" #include <unicode/uchar.h> +#ifdef __cplusplus +extern "C" { +#endif + struct rspamd_task; struct rspamd_mime_part; struct rspamd_mime_text_part; @@ -32,8 +36,8 @@ struct rspamd_charset_converter; * @param in * @return */ -const gchar * rspamd_mime_detect_charset (const rspamd_ftok_t *in, - rspamd_mempool_t *pool); +const gchar *rspamd_mime_detect_charset (const rspamd_ftok_t *in, + rspamd_mempool_t *pool); /** * Convert text chunk to utf-8. Input encoding is substituted using @@ -48,9 +52,9 @@ const gchar * rspamd_mime_detect_charset (const rspamd_ftok_t *in, * @param err * @return */ -gchar * rspamd_mime_text_to_utf8 (rspamd_mempool_t *pool, - gchar *input, gsize len, const gchar *in_enc, - gsize *olen, GError **err); +gchar *rspamd_mime_text_to_utf8 (rspamd_mempool_t *pool, + gchar *input, gsize len, const gchar *in_enc, + gsize *olen, GError **err); /** * Converts data from `in` to `out`, returns `FALSE` if `enc` is not a valid iconv charset @@ -60,7 +64,7 @@ gchar * rspamd_mime_text_to_utf8 (rspamd_mempool_t *pool, * @return */ gboolean rspamd_mime_to_utf8_byte_array (GByteArray *in, - GByteArray *out, const gchar *enc); + GByteArray *out, const gchar *enc); /** * Maybe convert part to utf-8 @@ -69,7 +73,7 @@ gboolean rspamd_mime_to_utf8_byte_array (GByteArray *in, * @return */ void rspamd_mime_text_part_maybe_convert (struct rspamd_task *task, - struct rspamd_mime_text_part *text_part); + struct rspamd_mime_text_part *text_part); /** * Checks utf8 charset and normalize/validate utf8 string @@ -79,7 +83,7 @@ void rspamd_mime_text_part_maybe_convert (struct rspamd_task *task, * @return */ gboolean rspamd_mime_charset_utf_check (rspamd_ftok_t *charset, - gchar *in, gsize len, gboolean content_check); + gchar *in, gsize len, gboolean content_check); /** * Ensure that all characters in string are valid utf8 chars or replace them @@ -125,5 +129,8 @@ rspamd_converter_to_uchars (struct rspamd_charset_converter *cnv, */ const char *rspamd_mime_charset_find_by_content (const gchar *in, gsize inlen); +#ifdef __cplusplus +} +#endif #endif /* SRC_LIBMIME_MIME_ENCODING_H_ */ diff --git a/src/libmime/mime_expressions.h b/src/libmime/mime_expressions.h index 2677b9968..935027482 100644 --- a/src/libmime/mime_expressions.h +++ b/src/libmime/mime_expressions.h @@ -10,6 +10,10 @@ #include "expression.h" #include "contrib/libucl/ucl.h" +#ifdef __cplusplus +extern "C" { +#endif + struct rspamd_task; struct rspamd_config; @@ -34,8 +38,8 @@ struct expression_argument { }; -typedef gboolean (*rspamd_internal_func_t)(struct rspamd_task *, - GArray *args, void *user_data); +typedef gboolean (*rspamd_internal_func_t) (struct rspamd_task *, + GArray *args, void *user_data); /** @@ -44,8 +48,8 @@ typedef gboolean (*rspamd_internal_func_t)(struct rspamd_task *, * @param func pointer to function */ void register_expression_function (const gchar *name, - rspamd_internal_func_t func, - void *user_data); + rspamd_internal_func_t func, + void *user_data); /** * Set global limit of regexp data size to be processed @@ -54,4 +58,8 @@ void register_expression_function (const gchar *name, */ guint rspamd_mime_expression_set_re_limit (guint limit); +#ifdef __cplusplus +} +#endif + #endif diff --git a/src/libmime/mime_headers.h b/src/libmime/mime_headers.h index 81fff96a2..5cb300978 100644 --- a/src/libmime/mime_headers.h +++ b/src/libmime/mime_headers.h @@ -20,6 +20,10 @@ #include "libutil/mem_pool.h" #include "libutil/addr.h" +#ifdef __cplusplus +extern "C" { +#endif + struct rspamd_task; enum rspamd_rfc2047_encoding { @@ -97,9 +101,9 @@ struct received_header { * @param check_newlines */ void rspamd_mime_headers_process (struct rspamd_task *task, GHashTable *target, - GQueue *order, - const gchar *in, gsize len, - gboolean check_newlines); + GQueue *order, + const gchar *in, gsize len, + gboolean check_newlines); /** * Perform rfc2047 decoding of a header @@ -108,8 +112,8 @@ void rspamd_mime_headers_process (struct rspamd_task *task, GHashTable *target, * @param inlen * @return */ -gchar * rspamd_mime_header_decode (rspamd_mempool_t *pool, const gchar *in, - gsize inlen, gboolean *invalid_utf); +gchar *rspamd_mime_header_decode (rspamd_mempool_t *pool, const gchar *in, + gsize inlen, gboolean *invalid_utf); /** * Encode mime header if needed @@ -117,13 +121,17 @@ gchar * rspamd_mime_header_decode (rspamd_mempool_t *pool, const gchar *in, * @param len * @return newly allocated encoded header */ -gchar * rspamd_mime_header_encode (const gchar *in, gsize len); +gchar *rspamd_mime_header_encode (const gchar *in, gsize len); /** * Generate new unique message id * @param fqdn * @return */ -gchar * rspamd_mime_message_id_generate (const gchar *fqdn); +gchar *rspamd_mime_message_id_generate (const gchar *fqdn); + +#ifdef __cplusplus +} +#endif #endif /* SRC_LIBMIME_MIME_HEADERS_H_ */ diff --git a/src/libmime/mime_parser.h b/src/libmime/mime_parser.h index 987ec1395..ed3fe5f87 100644 --- a/src/libmime/mime_parser.h +++ b/src/libmime/mime_parser.h @@ -18,6 +18,11 @@ #include "config.h" + +#ifdef __cplusplus +extern "C" { +#endif + struct rspamd_task; struct rspamd_mime_part; @@ -29,8 +34,13 @@ enum rspamd_mime_parse_error { }; enum rspamd_mime_parse_error rspamd_mime_parse_task (struct rspamd_task *task, - GError **err); + GError **err); void rspamd_mime_parser_calc_digest (struct rspamd_mime_part *part); + +#ifdef __cplusplus +} +#endif + #endif /* SRC_LIBMIME_MIME_PARSER_H_ */ diff --git a/src/libmime/smtp_parsers.h b/src/libmime/smtp_parsers.h index 6904bece0..b4fb825b4 100644 --- a/src/libmime/smtp_parsers.h +++ b/src/libmime/smtp_parsers.h @@ -22,21 +22,34 @@ #include "task.h" #include "message.h" + +#ifdef __cplusplus +extern "C" { +#endif + int rspamd_smtp_received_parse (struct rspamd_task *task, - const char *data, size_t len, struct received_header *rh); + const char *data, size_t len, + struct received_header *rh); + int rspamd_smtp_addr_parse (const char *data, size_t len, - struct rspamd_email_address *addr); + struct rspamd_email_address *addr); + gboolean rspamd_content_disposition_parser (const char *data, size_t len, - struct rspamd_content_disposition *cd, rspamd_mempool_t *pool); + struct rspamd_content_disposition *cd, + rspamd_mempool_t *pool); gboolean rspamd_rfc2047_parser (const gchar *in, gsize len, gint *pencoding, - const gchar **charset, gsize *charset_len, - const gchar **encoded, gsize *encoded_len); + const gchar **charset, gsize *charset_len, + const gchar **encoded, gsize *encoded_len); -rspamd_inet_addr_t* rspamd_parse_smtp_ip (const char *data, size_t len, - rspamd_mempool_t *pool); +rspamd_inet_addr_t *rspamd_parse_smtp_ip (const char *data, size_t len, + rspamd_mempool_t *pool); guint64 rspamd_parse_smtp_date (const char *data, size_t len); +#ifdef __cplusplus +} +#endif + #endif /* SRC_LIBMIME_SMTP_PARSERS_H_ */ diff --git a/src/libserver/async_session.h b/src/libserver/async_session.h index 92454158a..ad79769e9 100644 --- a/src/libserver/async_session.h +++ b/src/libserver/async_session.h @@ -19,11 +19,16 @@ #include "config.h" #include "mem_pool.h" +#ifdef __cplusplus +extern "C" { +#endif + struct rspamd_async_event; struct rspamd_async_session; -typedef void (*event_finalizer_t)(gpointer ud); -typedef gboolean (*session_finalizer_t)(gpointer user_data); +typedef void (*event_finalizer_t) (gpointer ud); + +typedef gboolean (*session_finalizer_t) (gpointer user_data); /** * Make new async session @@ -34,9 +39,9 @@ typedef gboolean (*session_finalizer_t)(gpointer user_data); * @param user_data abstract user data * @return */ -struct rspamd_async_session * rspamd_session_create (rspamd_mempool_t *pool, - session_finalizer_t fin, event_finalizer_t restore, - event_finalizer_t cleanup, gpointer user_data); +struct rspamd_async_session *rspamd_session_create (rspamd_mempool_t *pool, + session_finalizer_t fin, event_finalizer_t restore, + event_finalizer_t cleanup, gpointer user_data); /** * Insert new event to the session @@ -47,12 +52,13 @@ struct rspamd_async_session * rspamd_session_create (rspamd_mempool_t *pool, */ struct rspamd_async_event * rspamd_session_add_event_full (struct rspamd_async_session *session, - event_finalizer_t fin, - gpointer user_data, - const gchar *subsystem, - const gchar *loc); + event_finalizer_t fin, + gpointer user_data, + const gchar *subsystem, + const gchar *loc); + #define rspamd_session_add_event(session, fin, user_data, subsystem) \ - rspamd_session_add_event_full(session, fin, user_data, subsystem, G_STRLOC) + rspamd_session_add_event_full(session, fin, user_data, subsystem, G_STRLOC) /** * Remove normal event @@ -61,11 +67,12 @@ rspamd_session_add_event_full (struct rspamd_async_session *session, * @param ud user data object */ void rspamd_session_remove_event_full (struct rspamd_async_session *session, - event_finalizer_t fin, - gpointer ud, - const gchar *loc); + event_finalizer_t fin, + gpointer ud, + const gchar *loc); + #define rspamd_session_remove_event(session, fin, user_data) \ - rspamd_session_remove_event_full(session, fin, user_data, G_STRLOC) + rspamd_session_remove_event_full(session, fin, user_data, G_STRLOC) /** * Must be called at the end of session, it calls fin functions for all non-forced callbacks @@ -83,7 +90,7 @@ void rspamd_session_cleanup (struct rspamd_async_session *session); * @param session * @return */ -rspamd_mempool_t * rspamd_session_mempool (struct rspamd_async_session *session); +rspamd_mempool_t *rspamd_session_mempool (struct rspamd_async_session *session); /** * Check session for events pending and call fin callback if no events are pending @@ -107,4 +114,8 @@ guint rspamd_session_events_pending (struct rspamd_async_session *session); */ gboolean rspamd_session_blocked (struct rspamd_async_session *s); +#ifdef __cplusplus +} +#endif + #endif /*RSPAMD_ASYNC_SESSION_H*/ diff --git a/src/libserver/cfg_file.h b/src/libserver/cfg_file.h index 5f70ccda8..de00ab128 100644 --- a/src/libserver/cfg_file.h +++ b/src/libserver/cfg_file.h @@ -25,7 +25,7 @@ #include "ucl.h" #include "regexp.h" #include "libserver/re_cache.h" -#include "ref.h" +#include "libutil/ref.h" #include "libutil/radix.h" #include "monitored.h" #include "redis_pool.h" @@ -36,6 +36,10 @@ /* Default metric name */ #define DEFAULT_METRIC "default" +#ifdef __cplusplus +extern "C" { +#endif + struct expression; struct tokenizer; struct rspamd_stat_classifier; @@ -149,13 +153,13 @@ struct rspamd_statfile_config { gchar *label; /**< label of this statfile */ ucl_object_t *opts; /**< other options */ gboolean is_spam; /**< spam flag */ - struct rspamd_classifier_config *clcf; /**< parent pointer of classifier configuration */ - gpointer data; /**< opaque data */ + struct rspamd_classifier_config *clcf; /**< parent pointer of classifier configuration */ + gpointer data; /**< opaque data */ }; struct rspamd_tokenizer_config { const ucl_object_t *opts; /**< other options */ - const gchar *name; /**< name of tokenizer */ + const gchar *name; /**< name of tokenizer */ }; @@ -344,7 +348,7 @@ struct rspamd_config { gdouble grow_factor; /**< grow factor for metric */ GHashTable *symbols; /**< weights of symbols in metric */ const gchar *subject; /**< subject rewrite string */ - GHashTable * groups; /**< groups of symbols */ + GHashTable *groups; /**< groups of symbols */ struct rspamd_action *actions; /**< all actions of the metric */ gboolean raw_mode; /**< work in raw mode instead of utf one */ @@ -399,17 +403,17 @@ struct rspamd_config { ucl_object_t *config_comments; /**< comments saved from the config */ ucl_object_t *doc_strings; /**< documentation strings for config options */ GPtrArray *c_modules; /**< list of C modules */ - GHashTable * composite_symbols; /**< hash of composite symbols indexed by its name */ + GHashTable *composite_symbols; /**< hash of composite symbols indexed by its name */ GList *classifiers; /**< list of all classifiers defined */ GList *statfiles; /**< list of all statfiles in config file order */ GHashTable *classifiers_symbols; /**< hashtable indexed by symbol name of classifiers */ - GHashTable * cfg_params; /**< all cfg params indexed by its name in this structure */ + GHashTable *cfg_params; /**< all cfg params indexed by its name in this structure */ gchar *dynamic_conf; /**< path to dynamic configuration */ ucl_object_t *current_dynamic_conf; /**< currently loaded dynamic configuration */ - GHashTable * domain_settings; /**< settings per-domains */ - GHashTable * user_settings; /**< settings per-user */ - gchar * domain_settings_str; /**< string representation of settings */ - gchar * user_settings_str; + GHashTable *domain_settings; /**< settings per-domains */ + GHashTable *user_settings; /**< settings per-user */ + gchar *domain_settings_str; /**< string representation of settings */ + gchar *user_settings_str; gint clock_res; /**< resolution of clock used */ GList *maps; /**< maps active */ @@ -423,16 +427,16 @@ struct rspamd_config { struct rspamd_symcache *cache; /**< symbols cache object */ gchar *cache_filename; /**< filename of cache file */ gdouble cache_reload_time; /**< how often cache reload should be performed */ - gchar * checksum; /**< real checksum of config file */ - gchar * dump_checksum; /**< dump checksum of config file */ + gchar *checksum; /**< real checksum of config file */ + gchar *dump_checksum; /**< dump checksum of config file */ gpointer lua_state; /**< pointer to lua state */ gpointer lua_thread_pool; /**< pointer to lua thread (coroutine) pool */ - gchar * rrd_file; /**< rrd file to store statistics */ - gchar * history_file; /**< file to save rolling history */ - gchar * tld_file; /**< file to load effective tld list from */ - gchar * hs_cache_dir; /**< directory to save hyperscan databases */ - gchar * magic_file; /**< file to initialize libmagic */ + gchar *rrd_file; /**< rrd file to store statistics */ + gchar *history_file; /**< file to save rolling history */ + gchar *tld_file; /**< file to load effective tld list from */ + gchar *hs_cache_dir; /**< directory to save hyperscan databases */ + gchar *magic_file; /**< file to initialize libmagic */ gdouble dns_timeout; /**< timeout in milliseconds for waiting for dns reply */ guint32 dns_retransmits; /**< maximum retransmits count */ @@ -443,49 +447,49 @@ struct rspamd_config { guint32 dns_max_requests; /**< limit of DNS requests per task */ gboolean enable_dnssec; /**< enable dnssec stub resolver */ - guint upstream_max_errors; /**< upstream max errors before shutting off */ - gdouble upstream_error_time; /**< rate of upstream errors */ - gdouble upstream_revive_time; /**< revive timeout for upstreams */ - struct upstream_ctx *ups_ctx; /**< upstream context */ - struct rspamd_dns_resolver *dns_resolver; /**< dns resolver if loaded */ + guint upstream_max_errors; /**< upstream max errors before shutting off */ + gdouble upstream_error_time; /**< rate of upstream errors */ + gdouble upstream_revive_time; /**< revive timeout for upstreams */ + struct upstream_ctx *ups_ctx; /**< upstream context */ + struct rspamd_dns_resolver *dns_resolver; /**< dns resolver if loaded */ - guint min_word_len; /**< minimum length of the word to be considered */ - guint max_word_len; /**< maximum length of the word to be considered */ - guint words_decay; /**< limit for words for starting adaptive ignoring */ - guint history_rows; /**< number of history rows stored */ + guint min_word_len; /**< minimum length of the word to be considered */ + guint max_word_len; /**< maximum length of the word to be considered */ + guint words_decay; /**< limit for words for starting adaptive ignoring */ + guint history_rows; /**< number of history rows stored */ guint max_sessions_cache; /**< maximum number of sessions cache elts */ - guint lua_gc_step; /**< lua gc step */ - guint lua_gc_pause; /**< lua gc pause */ - guint full_gc_iters; /**< iterations between full gc cycle */ + guint lua_gc_step; /**< lua gc step */ + guint lua_gc_pause; /**< lua gc pause */ + guint full_gc_iters; /**< iterations between full gc cycle */ - GList *classify_headers; /**< list of headers using for statistics */ - struct module_s **compiled_modules; /**< list of compiled C modules */ - struct worker_s **compiled_workers; /**< list of compiled C modules */struct rspamd_log_format *log_format; /**< parsed log format */ - gchar *log_format_str; /**< raw log format string */ + GList *classify_headers; /**< list of headers using for statistics */ + struct module_s **compiled_modules; /**< list of compiled C modules */ + struct worker_s **compiled_workers; /**< list of compiled C modules */struct rspamd_log_format *log_format; /**< parsed log format */ + gchar *log_format_str; /**< raw log format string */ - struct rspamd_external_libs_ctx *libs_ctx; /**< context for external libraries */ - struct rspamd_monitored_ctx *monitored_ctx; /**< context for monitored resources */ - struct rspamd_redis_pool *redis_pool; /**< redis connectiosn pool */ + struct rspamd_external_libs_ctx *libs_ctx; /**< context for external libraries */ + struct rspamd_monitored_ctx *monitored_ctx; /**< context for monitored resources */ + struct rspamd_redis_pool *redis_pool; /**< redis connectiosn pool */ - struct rspamd_re_cache *re_cache; /**< static regexp cache */ + struct rspamd_re_cache *re_cache; /**< static regexp cache */ - GHashTable *trusted_keys; /**< list of trusted public keys */ + GHashTable *trusted_keys; /**< list of trusted public keys */ - struct rspamd_config_cfg_lua_script *on_load_scripts; /**< list of scripts executed on workers load */ - struct rspamd_config_cfg_lua_script *post_init_scripts; /**< list of scripts executed on config being fully loaded */ + struct rspamd_config_cfg_lua_script *on_load_scripts; /**< list of scripts executed on workers load */ + struct rspamd_config_cfg_lua_script *post_init_scripts; /**< list of scripts executed on config being fully loaded */ struct rspamd_config_cfg_lua_script *on_term_scripts; /**< list of callbacks called on worker's termination */ - struct rspamd_config_cfg_lua_script *config_unload_scripts; /**< list of scripts executed on config unload */ + struct rspamd_config_cfg_lua_script *config_unload_scripts; /**< list of scripts executed on config unload */ - gchar *ssl_ca_path; /**< path to CA certs */ - gchar *ssl_ciphers; /**< set of preferred ciphers */ - gchar *zstd_input_dictionary; /**< path to zstd input dictionary */ - gchar *zstd_output_dictionary; /**< path to zstd output dictionary */ - ucl_object_t *neighbours; /**< other servers in the cluster */ + gchar *ssl_ca_path; /**< path to CA certs */ + gchar *ssl_ciphers; /**< set of preferred ciphers */ + gchar *zstd_input_dictionary; /**< path to zstd input dictionary */ + gchar *zstd_output_dictionary; /**< path to zstd output dictionary */ + ucl_object_t *neighbours; /**< other servers in the cluster */ - struct rspamd_config_settings_elt *setting_ids; /**< preprocessed settings ids */ - struct rspamd_lang_detector *lang_det; /**< language detector */ + struct rspamd_config_settings_elt *setting_ids; /**< preprocessed settings ids */ + struct rspamd_lang_detector *lang_det; /**< language detector */ - ref_entry_t ref; /**< reference counter */ + ref_entry_t ref; /**< reference counter */ }; @@ -497,7 +501,7 @@ struct rspamd_config { * @return 1 if line was successfully parsed and 0 in case of error */ gboolean rspamd_parse_bind_line (struct rspamd_config *cfg, - struct rspamd_worker_conf *cf, const gchar *str); + struct rspamd_worker_conf *cf, const gchar *str); enum rspamd_config_init_flags { @@ -505,6 +509,7 @@ enum rspamd_config_init_flags { RSPAMD_CONFIG_INIT_SKIP_LUA = (1u << 0u), RSPAMD_CONFIG_INIT_WIPE_LUA_MEM = (1u << 1u), }; + /** * Init default values * @param cfg config file @@ -524,9 +529,9 @@ void rspamd_config_free (struct rspamd_config *cfg); * @param opt_name name of option to get * @return module value or NULL if option does not defined */ -const ucl_object_t * rspamd_config_get_module_opt (struct rspamd_config *cfg, - const gchar *module_name, - const gchar *opt_name); +const ucl_object_t *rspamd_config_get_module_opt (struct rspamd_config *cfg, + const gchar *module_name, + const gchar *opt_name); /** @@ -547,18 +552,18 @@ enum rspamd_post_load_options { }; #define RSPAMD_CONFIG_LOAD_ALL (RSPAMD_CONFIG_INIT_URL| \ - RSPAMD_CONFIG_INIT_LIBS| \ - RSPAMD_CONFIG_INIT_SYMCACHE| \ - RSPAMD_CONFIG_INIT_VALIDATE| \ - RSPAMD_CONFIG_INIT_PRELOAD_MAPS| \ - RSPAMD_CONFIG_INIT_POST_LOAD_LUA) + RSPAMD_CONFIG_INIT_LIBS| \ + RSPAMD_CONFIG_INIT_SYMCACHE| \ + RSPAMD_CONFIG_INIT_VALIDATE| \ + RSPAMD_CONFIG_INIT_PRELOAD_MAPS| \ + RSPAMD_CONFIG_INIT_POST_LOAD_LUA) /** * Do post load actions for config * @param cfg config file */ gboolean rspamd_config_post_load (struct rspamd_config *cfg, - enum rspamd_post_load_options opts); + enum rspamd_post_load_options opts); /** * Calculate checksum for config file @@ -576,20 +581,22 @@ void rspamd_config_unescape_quotes (gchar *line); /* * Convert comma separated string to a list of strings */ -GList * rspamd_config_parse_comma_list (rspamd_mempool_t *pool, - const gchar *line); +GList *rspamd_config_parse_comma_list (rspamd_mempool_t *pool, + const gchar *line); /* * Return a new classifier_config structure, setting default and non-conflicting attributes */ -struct rspamd_classifier_config * rspamd_config_new_classifier ( - struct rspamd_config *cfg, - struct rspamd_classifier_config *c); +struct rspamd_classifier_config *rspamd_config_new_classifier ( + struct rspamd_config *cfg, + struct rspamd_classifier_config *c); + /* * Return a new worker_conf structure, setting default and non-conflicting attributes */ -struct rspamd_worker_conf * rspamd_config_new_worker (struct rspamd_config *cfg, - struct rspamd_worker_conf *c); +struct rspamd_worker_conf *rspamd_config_new_worker (struct rspamd_config *cfg, + struct rspamd_worker_conf *c); + /* * Return a new metric structure, setting default and non-conflicting attributes */ @@ -598,15 +605,16 @@ void rspamd_config_init_metric (struct rspamd_config *cfg); /* * Return new symbols group definition */ -struct rspamd_symbols_group * rspamd_config_new_group ( +struct rspamd_symbols_group *rspamd_config_new_group ( struct rspamd_config *cfg, const gchar *name); + /* * Return a new statfile structure, setting default and non-conflicting attributes */ -struct rspamd_statfile_config * rspamd_config_new_statfile ( - struct rspamd_config *cfg, - struct rspamd_statfile_config *c); +struct rspamd_statfile_config *rspamd_config_new_statfile ( + struct rspamd_config *cfg, + struct rspamd_statfile_config *c); /* * Register symbols of classifiers inside metrics @@ -621,12 +629,12 @@ gboolean rspamd_config_check_statfiles (struct rspamd_classifier_config *cf); /* * Find classifier config by name */ -struct rspamd_classifier_config * rspamd_config_find_classifier ( - struct rspamd_config *cfg, - const gchar *name); +struct rspamd_classifier_config *rspamd_config_find_classifier ( + struct rspamd_config *cfg, + const gchar *name); void rspamd_ucl_add_conf_macros (struct ucl_parser *parser, - struct rspamd_config *cfg); + struct rspamd_config *cfg); void rspamd_ucl_add_conf_variables (struct ucl_parser *parser, GHashTable *vars); @@ -681,8 +689,8 @@ gboolean rspamd_config_add_symbol_group (struct rspamd_config *cfg, * @return TRUE if symbol has been inserted or FALSE if action already exists with higher priority */ gboolean rspamd_config_set_action_score (struct rspamd_config *cfg, - const gchar *action_name, - const ucl_object_t *obj); + const gchar *action_name, + const ucl_object_t *obj); /** * Check priority and maybe disable action completely @@ -709,7 +717,7 @@ gboolean rspamd_config_maybe_disable_action (struct rspamd_config *cfg, * @return TRUE if a module is enabled */ gboolean rspamd_config_is_module_enabled (struct rspamd_config *cfg, - const gchar *module_name); + const gchar *module_name); /* * Get action from a string @@ -719,8 +727,9 @@ gboolean rspamd_action_from_str (const gchar *data, gint *result); /* * Return textual representation of action enumeration */ -const gchar * rspamd_action_to_str (enum rspamd_action_type action); -const gchar * rspamd_action_to_str_alt (enum rspamd_action_type action); +const gchar *rspamd_action_to_str (enum rspamd_action_type action); + +const gchar *rspamd_action_to_str_alt (enum rspamd_action_type action); /* * Resort all actions (needed to operate with thresholds) @@ -736,11 +745,12 @@ void rspamd_actions_sort (struct rspamd_config *cfg); * @return */ struct rspamd_radix_map_helper; + gboolean rspamd_config_radix_from_ucl (struct rspamd_config *cfg, - const ucl_object_t *obj, - const gchar *description, - struct rspamd_radix_map_helper **target, - GError **err); + const ucl_object_t *obj, + const gchar *description, + struct rspamd_radix_map_helper **target, + GError **err); /** * Adds new settings id to be preprocessed @@ -789,11 +799,11 @@ struct rspamd_config_settings_elt *rspamd_config_find_settings_name_ref ( * @param name * @return */ -struct rspamd_action * rspamd_config_get_action (struct rspamd_config *cfg, - const gchar *name); +struct rspamd_action *rspamd_config_get_action (struct rspamd_config *cfg, + const gchar *name); -struct rspamd_action * rspamd_config_get_action_by_type (struct rspamd_config *cfg, - enum rspamd_action_type type); +struct rspamd_action *rspamd_config_get_action_by_type (struct rspamd_config *cfg, + enum rspamd_action_type type); #define msg_err_config(...) rspamd_default_log_function (G_LOG_LEVEL_CRITICAL, \ cfg->cfg_pool->tag.tagname, cfg->checksum, \ @@ -817,5 +827,8 @@ extern guint rspamd_config_log_id; G_STRFUNC, \ __VA_ARGS__) +#ifdef __cplusplus +} +#endif #endif /* ifdef CFG_FILE_H */ diff --git a/src/libserver/cfg_file_private.h b/src/libserver/cfg_file_private.h index 94cb9aa08..8a88f6e3e 100644 --- a/src/libserver/cfg_file_private.h +++ b/src/libserver/cfg_file_private.h @@ -22,6 +22,10 @@ #define HASH_CASELESS #include "uthash_strcase.h" +#ifdef __cplusplus +extern "C" { +#endif + /** * Action config definition */ @@ -35,4 +39,8 @@ struct rspamd_action { struct UT_hash_handle hh; /* Index by name */ }; +#ifdef __cplusplus +} +#endif + #endif diff --git a/src/libserver/cfg_rcl.h b/src/libserver/cfg_rcl.h index 8d957a402..7f97b100d 100644 --- a/src/libserver/cfg_rcl.h +++ b/src/libserver/cfg_rcl.h @@ -28,6 +28,10 @@ cfg_rcl_error_quark (void) return g_quark_from_static_string ("cfg-rcl-error-quark"); } +#ifdef __cplusplus +extern "C" { +#endif + struct rspamd_rcl_section; struct rspamd_config; struct rspamd_rcl_default_handler_data; @@ -491,4 +495,9 @@ gboolean rspamd_config_read (struct rspamd_config *cfg, GHashTable *vars, gboolean skip_jinja, gchar **lua_env); + +#ifdef __cplusplus +} +#endif + #endif /* CFG_RCL_H_ */ diff --git a/src/libserver/composites.h b/src/libserver/composites.h index a72effdf2..d9947a7dd 100644 --- a/src/libserver/composites.h +++ b/src/libserver/composites.h @@ -18,6 +18,10 @@ #include "config.h" +#ifdef __cplusplus +extern "C" { +#endif + struct rspamd_task; /** @@ -52,4 +56,8 @@ void rspamd_make_composites (struct rspamd_task *task); enum rspamd_composite_policy rspamd_composite_policy_from_str (const gchar *string); +#ifdef __cplusplus +} +#endif + #endif /* SRC_LIBSERVER_COMPOSITES_H_ */ diff --git a/src/libserver/dkim.h b/src/libserver/dkim.h index 57f761895..adc68403a 100644 --- a/src/libserver/dkim.h +++ b/src/libserver/dkim.h @@ -21,6 +21,7 @@ #include "dns.h" #include "ref.h" + /* Main types and definitions */ #define RSPAMD_DKIM_SIGNHEADER "DKIM-Signature" @@ -80,6 +81,10 @@ #define DKIM_SIGERROR_MISSING_V 44 /* v= tag missing */ #define DKIM_SIGERROR_EMPTY_V 45 /* v= tag empty */ +#ifdef __cplusplus +extern "C" { +#endif + /* Check results */ enum rspamd_dkim_check_rcode { DKIM_CONTINUE = 0, @@ -148,8 +153,8 @@ struct rspamd_dkim_check_result { /* Err MUST be freed if it is not NULL, key is allocated by slice allocator */ -typedef void (*dkim_key_handler_f)(rspamd_dkim_key_t *key, gsize keylen, - rspamd_dkim_context_t *ctx, gpointer ud, GError *err); +typedef void (*dkim_key_handler_f) (rspamd_dkim_key_t *key, gsize keylen, + rspamd_dkim_context_t *ctx, gpointer ud, GError *err); /** * Create new dkim context from signature @@ -159,11 +164,11 @@ typedef void (*dkim_key_handler_f)(rspamd_dkim_key_t *key, gsize keylen, * @param err pointer to error object * @return new context or NULL */ -rspamd_dkim_context_t * rspamd_create_dkim_context (const gchar *sig, - rspamd_mempool_t *pool, - guint time_jitter, - enum rspamd_dkim_type type, - GError **err); +rspamd_dkim_context_t *rspamd_create_dkim_context (const gchar *sig, + rspamd_mempool_t *pool, + guint time_jitter, + enum rspamd_dkim_type type, + GError **err); /** * Create new dkim context for making a signature @@ -172,13 +177,13 @@ rspamd_dkim_context_t * rspamd_create_dkim_context (const gchar *sig, * @param err * @return */ -rspamd_dkim_sign_context_t * rspamd_create_dkim_sign_context (struct rspamd_task *task, - rspamd_dkim_sign_key_t *priv_key, - gint headers_canon, - gint body_canon, - const gchar *dkim_headers, - enum rspamd_dkim_type type, - GError **err); +rspamd_dkim_sign_context_t *rspamd_create_dkim_sign_context (struct rspamd_task *task, + rspamd_dkim_sign_key_t *priv_key, + gint headers_canon, + gint body_canon, + const gchar *dkim_headers, + enum rspamd_dkim_type type, + GError **err); /** * Load dkim key @@ -186,9 +191,9 @@ rspamd_dkim_sign_context_t * rspamd_create_dkim_sign_context (struct rspamd_task * @param err * @return */ -rspamd_dkim_sign_key_t* rspamd_dkim_sign_key_load (const gchar *what, gsize len, - enum rspamd_dkim_key_format type, - GError **err); +rspamd_dkim_sign_key_t *rspamd_dkim_sign_key_load (const gchar *what, gsize len, + enum rspamd_dkim_key_format type, + GError **err); /** * Invalidate modified sign key @@ -196,7 +201,7 @@ rspamd_dkim_sign_key_t* rspamd_dkim_sign_key_load (const gchar *what, gsize len, * @return */ gboolean rspamd_dkim_sign_key_maybe_invalidate (rspamd_dkim_sign_key_t *key, - time_t mtime); + time_t mtime); /** * Make DNS request for specified context and obtain and parse key @@ -206,9 +211,9 @@ gboolean rspamd_dkim_sign_key_maybe_invalidate (rspamd_dkim_sign_key_t *key, * @return */ gboolean rspamd_get_dkim_key (rspamd_dkim_context_t *ctx, - struct rspamd_task *task, - dkim_key_handler_f handler, - gpointer ud); + struct rspamd_task *task, + dkim_key_handler_f handler, + gpointer ud); /** * Check task for dkim context using dkim key @@ -217,9 +222,9 @@ gboolean rspamd_get_dkim_key (rspamd_dkim_context_t *ctx, * @param task task to check * @return */ -struct rspamd_dkim_check_result * rspamd_dkim_check (rspamd_dkim_context_t *ctx, - rspamd_dkim_key_t *key, - struct rspamd_task *task); +struct rspamd_dkim_check_result *rspamd_dkim_check (rspamd_dkim_context_t *ctx, + rspamd_dkim_key_t *key, + struct rspamd_task *task); struct rspamd_dkim_check_result * rspamd_dkim_create_result (rspamd_dkim_context_t *ctx, @@ -235,13 +240,20 @@ GString *rspamd_dkim_sign (struct rspamd_task *task, const gchar *arc_cv, rspamd_dkim_sign_context_t *ctx); -rspamd_dkim_key_t * rspamd_dkim_key_ref (rspamd_dkim_key_t *k); +rspamd_dkim_key_t *rspamd_dkim_key_ref (rspamd_dkim_key_t *k); + void rspamd_dkim_key_unref (rspamd_dkim_key_t *k); -rspamd_dkim_sign_key_t * rspamd_dkim_sign_key_ref (rspamd_dkim_sign_key_t *k); + +rspamd_dkim_sign_key_t *rspamd_dkim_sign_key_ref (rspamd_dkim_sign_key_t *k); + void rspamd_dkim_sign_key_unref (rspamd_dkim_sign_key_t *k); -const gchar* rspamd_dkim_get_domain (rspamd_dkim_context_t *ctx); -const gchar* rspamd_dkim_get_selector (rspamd_dkim_context_t *ctx); -const gchar* rspamd_dkim_get_dns_key (rspamd_dkim_context_t *ctx); + +const gchar *rspamd_dkim_get_domain (rspamd_dkim_context_t *ctx); + +const gchar *rspamd_dkim_get_selector (rspamd_dkim_context_t *ctx); + +const gchar *rspamd_dkim_get_dns_key (rspamd_dkim_context_t *ctx); + guint rspamd_dkim_key_get_ttl (rspamd_dkim_key_t *k); /** @@ -252,9 +264,9 @@ guint rspamd_dkim_key_get_ttl (rspamd_dkim_key_t *k); * @param err * @return */ -rspamd_dkim_key_t * rspamd_dkim_make_key (const gchar *keydata, guint keylen, - enum rspamd_dkim_key_type type, - GError **err); +rspamd_dkim_key_t *rspamd_dkim_make_key (const gchar *keydata, guint keylen, + enum rspamd_dkim_key_type type, + GError **err); /** * Parse DKIM public key from a TXT record @@ -263,8 +275,8 @@ rspamd_dkim_key_t * rspamd_dkim_make_key (const gchar *keydata, guint keylen, * @param err * @return */ -rspamd_dkim_key_t * rspamd_dkim_parse_key (const gchar *txt, gsize *keylen, - GError **err); +rspamd_dkim_key_t *rspamd_dkim_parse_key (const gchar *txt, gsize *keylen, + GError **err); /** * Canonocalise header using relaxed algorithm @@ -275,9 +287,9 @@ rspamd_dkim_key_t * rspamd_dkim_parse_key (const gchar *txt, gsize *keylen, * @return */ goffset rspamd_dkim_canonize_header_relaxed_str (const gchar *hname, - const gchar *hvalue, - gchar *out, - gsize outlen); + const gchar *hvalue, + gchar *out, + gsize outlen); /** * Checks public and private keys for match @@ -296,4 +308,8 @@ gboolean rspamd_dkim_match_keys (rspamd_dkim_key_t *pk, */ void rspamd_dkim_key_free (rspamd_dkim_key_t *key); +#ifdef __cplusplus +} +#endif + #endif /* DKIM_H_ */ diff --git a/src/libserver/dns.h b/src/libserver/dns.h index c744ac42e..a9d822703 100644 --- a/src/libserver/dns.h +++ b/src/libserver/dns.h @@ -24,7 +24,12 @@ #include "rdns.h" #include "upstream.h" +#ifdef __cplusplus +extern "C" { +#endif + struct rspamd_config; +struct rspamd_task; struct rspamd_dns_resolver { struct rdns_resolver *r; @@ -40,10 +45,11 @@ struct rspamd_dns_resolver { /** * Init DNS resolver, params are obtained from a config file or system file /etc/resolv.conf */ -struct rspamd_dns_resolver * rspamd_dns_resolver_init (rspamd_logger_t *logger, - struct ev_loop *ev_base, struct rspamd_config *cfg); +struct rspamd_dns_resolver *rspamd_dns_resolver_init (rspamd_logger_t *logger, + struct ev_loop *ev_base, struct rspamd_config *cfg); struct rspamd_dns_request_ud; + /** * Make a DNS request * @param resolver resolver object @@ -55,13 +61,13 @@ struct rspamd_dns_request_ud; * @param ... string or ip address based on a request type * @return TRUE if request was sent. */ -struct rspamd_dns_request_ud * rspamd_dns_resolver_request (struct rspamd_dns_resolver *resolver, - struct rspamd_async_session *session, - rspamd_mempool_t *pool, - dns_callback_type cb, - gpointer ud, - enum rdns_request_type type, - const char *name); +struct rspamd_dns_request_ud *rspamd_dns_resolver_request (struct rspamd_dns_resolver *resolver, + struct rspamd_async_session *session, + rspamd_mempool_t *pool, + dns_callback_type cb, + gpointer ud, + enum rdns_request_type type, + const char *name); gboolean rspamd_dns_resolver_request_task (struct rspamd_task *task, dns_callback_type cb, @@ -75,4 +81,8 @@ gboolean rspamd_dns_resolver_request_task_forced (struct rspamd_task *task, enum rdns_request_type type, const char *name); +#ifdef __cplusplus +} +#endif + #endif diff --git a/src/libserver/dynamic_cfg.h b/src/libserver/dynamic_cfg.h index ebbc8b650..938fbb074 100644 --- a/src/libserver/dynamic_cfg.h +++ b/src/libserver/dynamic_cfg.h @@ -19,6 +19,11 @@ #include "config.h" #include "cfg_file.h" + +#ifdef __cplusplus +extern "C" { +#endif + /** * Init dynamic configuration using map logic and specific configuration * @param cfg config file @@ -41,13 +46,13 @@ gboolean dump_dynamic_config (struct rspamd_config *cfg); * @return */ gboolean add_dynamic_symbol (struct rspamd_config *cfg, - const gchar *metric, - const gchar *symbol, - gdouble value); + const gchar *metric, + const gchar *symbol, + gdouble value); gboolean remove_dynamic_symbol (struct rspamd_config *cfg, - const gchar *metric, - const gchar *symbol); + const gchar *metric, + const gchar *symbol); /** * Add action for specified metric @@ -58,15 +63,19 @@ gboolean remove_dynamic_symbol (struct rspamd_config *cfg, * @return */ gboolean add_dynamic_action (struct rspamd_config *cfg, - const gchar *metric, - guint action, - gdouble value); + const gchar *metric, + guint action, + gdouble value); /** * Removes dynamic action */ gboolean remove_dynamic_action (struct rspamd_config *cfg, - const gchar *metric, - guint action); + const gchar *metric, + guint action); + +#ifdef __cplusplus +} +#endif #endif /* DYNAMIC_CFG_H_ */ diff --git a/src/libserver/fuzzy_backend.h b/src/libserver/fuzzy_backend.h index 1519761e0..23b9b68ef 100644 --- a/src/libserver/fuzzy_backend.h +++ b/src/libserver/fuzzy_backend.h @@ -20,6 +20,10 @@ #include "contrib/libev/ev.h" #include "fuzzy_wire.h" +#ifdef __cplusplus +extern "C" { +#endif + struct rspamd_fuzzy_backend; struct rspamd_config; @@ -27,14 +31,18 @@ struct rspamd_config; * Callbacks for fuzzy methods */ typedef void (*rspamd_fuzzy_check_cb) (struct rspamd_fuzzy_reply *rep, void *ud); + typedef void (*rspamd_fuzzy_update_cb) (gboolean success, guint nadded, guint ndeleted, guint nextended, guint nignored, void *ud); + typedef void (*rspamd_fuzzy_version_cb) (guint64 rev, void *ud); + typedef void (*rspamd_fuzzy_count_cb) (guint64 count, void *ud); + typedef gboolean (*rspamd_fuzzy_periodic_cb) (void *ud); /** @@ -44,10 +52,10 @@ typedef gboolean (*rspamd_fuzzy_periodic_cb) (void *ud); * @param err * @return */ -struct rspamd_fuzzy_backend * rspamd_fuzzy_backend_create (struct ev_loop *ev_base, - const ucl_object_t *config, - struct rspamd_config *cfg, - GError **err); +struct rspamd_fuzzy_backend *rspamd_fuzzy_backend_create (struct ev_loop *ev_base, + const ucl_object_t *config, + struct rspamd_config *cfg, + GError **err); /** @@ -57,8 +65,8 @@ struct rspamd_fuzzy_backend * rspamd_fuzzy_backend_create (struct ev_loop *ev_ba * @param ud */ void rspamd_fuzzy_backend_check (struct rspamd_fuzzy_backend *bk, - const struct rspamd_fuzzy_cmd *cmd, - rspamd_fuzzy_check_cb cb, void *ud); + const struct rspamd_fuzzy_cmd *cmd, + rspamd_fuzzy_check_cb cb, void *ud); /** * Process updates for a specific queue @@ -67,8 +75,8 @@ void rspamd_fuzzy_backend_check (struct rspamd_fuzzy_backend *bk, * @param src */ void rspamd_fuzzy_backend_process_updates (struct rspamd_fuzzy_backend *bk, - GArray *updates, const gchar *src, rspamd_fuzzy_update_cb cb, - void *ud); + GArray *updates, const gchar *src, rspamd_fuzzy_update_cb cb, + void *ud); /** * Gets number of hashes from the backend @@ -77,7 +85,7 @@ void rspamd_fuzzy_backend_process_updates (struct rspamd_fuzzy_backend *bk, * @param ud */ void rspamd_fuzzy_backend_count (struct rspamd_fuzzy_backend *bk, - rspamd_fuzzy_count_cb cb, void *ud); + rspamd_fuzzy_count_cb cb, void *ud); /** * Returns number of revision for a specific source @@ -87,26 +95,27 @@ void rspamd_fuzzy_backend_count (struct rspamd_fuzzy_backend *bk, * @param ud */ void rspamd_fuzzy_backend_version (struct rspamd_fuzzy_backend *bk, - const gchar *src, - rspamd_fuzzy_version_cb cb, void *ud); + const gchar *src, + rspamd_fuzzy_version_cb cb, void *ud); /** * Returns unique id for backend * @param backend * @return */ -const gchar * rspamd_fuzzy_backend_id (struct rspamd_fuzzy_backend *backend); +const gchar *rspamd_fuzzy_backend_id (struct rspamd_fuzzy_backend *backend); /** * Starts expire process for the backend * @param backend */ void rspamd_fuzzy_backend_start_update (struct rspamd_fuzzy_backend *backend, - gdouble timeout, - rspamd_fuzzy_periodic_cb cb, - void *ud); + gdouble timeout, + rspamd_fuzzy_periodic_cb cb, + void *ud); + +struct ev_loop *rspamd_fuzzy_backend_event_base (struct rspamd_fuzzy_backend *backend); -struct ev_loop* rspamd_fuzzy_backend_event_base (struct rspamd_fuzzy_backend *backend); gdouble rspamd_fuzzy_backend_get_expire (struct rspamd_fuzzy_backend *backend); /** @@ -115,4 +124,8 @@ gdouble rspamd_fuzzy_backend_get_expire (struct rspamd_fuzzy_backend *backend); */ void rspamd_fuzzy_backend_close (struct rspamd_fuzzy_backend *backend); +#ifdef __cplusplus +} +#endif + #endif /* SRC_LIBSERVER_FUZZY_BACKEND_H_ */ diff --git a/src/libserver/fuzzy_backend_redis.h b/src/libserver/fuzzy_backend_redis.h index b10ac332d..544b20f60 100644 --- a/src/libserver/fuzzy_backend_redis.h +++ b/src/libserver/fuzzy_backend_redis.h @@ -19,31 +19,49 @@ #include "config.h" #include "fuzzy_backend.h" + +#ifdef __cplusplus +extern "C" { +#endif + /* * Subroutines for fuzzy_backend */ -void* rspamd_fuzzy_backend_init_redis (struct rspamd_fuzzy_backend *bk, - const ucl_object_t *obj, struct rspamd_config *cfg, GError **err); +void *rspamd_fuzzy_backend_init_redis (struct rspamd_fuzzy_backend *bk, + const ucl_object_t *obj, + struct rspamd_config *cfg, + GError **err); + void rspamd_fuzzy_backend_check_redis (struct rspamd_fuzzy_backend *bk, - const struct rspamd_fuzzy_cmd *cmd, - rspamd_fuzzy_check_cb cb, void *ud, - void *subr_ud); + const struct rspamd_fuzzy_cmd *cmd, + rspamd_fuzzy_check_cb cb, void *ud, + void *subr_ud); + void rspamd_fuzzy_backend_update_redis (struct rspamd_fuzzy_backend *bk, - GArray *updates, const gchar *src, - rspamd_fuzzy_update_cb cb, void *ud, - void *subr_ud); + GArray *updates, const gchar *src, + rspamd_fuzzy_update_cb cb, void *ud, + void *subr_ud); + void rspamd_fuzzy_backend_count_redis (struct rspamd_fuzzy_backend *bk, - rspamd_fuzzy_count_cb cb, void *ud, - void *subr_ud); + rspamd_fuzzy_count_cb cb, void *ud, + void *subr_ud); + void rspamd_fuzzy_backend_version_redis (struct rspamd_fuzzy_backend *bk, - const gchar *src, - rspamd_fuzzy_version_cb cb, void *ud, - void *subr_ud); -const gchar* rspamd_fuzzy_backend_id_redis (struct rspamd_fuzzy_backend *bk, - void *subr_ud); + const gchar *src, + rspamd_fuzzy_version_cb cb, void *ud, + void *subr_ud); + +const gchar *rspamd_fuzzy_backend_id_redis (struct rspamd_fuzzy_backend *bk, + void *subr_ud); + void rspamd_fuzzy_backend_expire_redis (struct rspamd_fuzzy_backend *bk, - void *subr_ud); + void *subr_ud); + void rspamd_fuzzy_backend_close_redis (struct rspamd_fuzzy_backend *bk, - void *subr_ud); + void *subr_ud); + +#ifdef __cplusplus +} +#endif #endif /* SRC_LIBSERVER_FUZZY_BACKEND_REDIS_H_ */ diff --git a/src/libserver/fuzzy_backend_sqlite.h b/src/libserver/fuzzy_backend_sqlite.h index 032d1e3cd..33dc94f30 100644 --- a/src/libserver/fuzzy_backend_sqlite.h +++ b/src/libserver/fuzzy_backend_sqlite.h @@ -19,6 +19,9 @@ #include "config.h" #include "fuzzy_wire.h" +#ifdef __cplusplus +extern "C" { +#endif struct rspamd_fuzzy_backend_sqlite; @@ -29,8 +32,8 @@ struct rspamd_fuzzy_backend_sqlite; * @return backend structure or NULL */ struct rspamd_fuzzy_backend_sqlite *rspamd_fuzzy_backend_sqlite_open (const gchar *path, - gboolean vacuum, - GError **err); + gboolean vacuum, + GError **err); /** * Check specified fuzzy in the backend @@ -47,7 +50,7 @@ struct rspamd_fuzzy_reply rspamd_fuzzy_backend_sqlite_check ( * Prepare storage for updates (by starting transaction) */ gboolean rspamd_fuzzy_backend_sqlite_prepare_update (struct rspamd_fuzzy_backend_sqlite *backend, - const gchar *source); + const gchar *source); /** * Add digest to the database @@ -56,7 +59,7 @@ gboolean rspamd_fuzzy_backend_sqlite_prepare_update (struct rspamd_fuzzy_backend * @return */ gboolean rspamd_fuzzy_backend_sqlite_add (struct rspamd_fuzzy_backend_sqlite *backend, - const struct rspamd_fuzzy_cmd *cmd); + const struct rspamd_fuzzy_cmd *cmd); /** * Delete digest from the database @@ -72,7 +75,7 @@ gboolean rspamd_fuzzy_backend_sqlite_del ( * Commit updates to storage */ gboolean rspamd_fuzzy_backend_sqlite_finish_update (struct rspamd_fuzzy_backend_sqlite *backend, - const gchar *source, gboolean version_bump); + const gchar *source, gboolean version_bump); /** * Sync storage @@ -80,8 +83,8 @@ gboolean rspamd_fuzzy_backend_sqlite_finish_update (struct rspamd_fuzzy_backend_ * @return */ gboolean rspamd_fuzzy_backend_sqlite_sync (struct rspamd_fuzzy_backend_sqlite *backend, - gint64 expire, - gboolean clean_orphaned); + gint64 expire, + gboolean clean_orphaned); /** * Close storage @@ -90,9 +93,15 @@ gboolean rspamd_fuzzy_backend_sqlite_sync (struct rspamd_fuzzy_backend_sqlite *b void rspamd_fuzzy_backend_sqlite_close (struct rspamd_fuzzy_backend_sqlite *backend); gsize rspamd_fuzzy_backend_sqlite_count (struct rspamd_fuzzy_backend_sqlite *backend); + gint rspamd_fuzzy_backend_sqlite_version (struct rspamd_fuzzy_backend_sqlite *backend, const gchar *source); + gsize rspamd_fuzzy_backend_sqlite_expired (struct rspamd_fuzzy_backend_sqlite *backend); -const gchar * rspamd_fuzzy_sqlite_backend_id (struct rspamd_fuzzy_backend_sqlite *backend); +const gchar *rspamd_fuzzy_sqlite_backend_id (struct rspamd_fuzzy_backend_sqlite *backend); + +#ifdef __cplusplus +} +#endif #endif /* FUZZY_BACKEND_H_ */ diff --git a/src/libserver/fuzzy_wire.h b/src/libserver/fuzzy_wire.h index 4a1dc3ed4..1723370e9 100644 --- a/src/libserver/fuzzy_wire.h +++ b/src/libserver/fuzzy_wire.h @@ -6,6 +6,10 @@ #include "shingles.h" #include "cryptobox.h" +#ifdef __cplusplus +extern "C" { +#endif + #define RSPAMD_FUZZY_VERSION 4 #define RSPAMD_FUZZY_KEYLEN 8 @@ -103,4 +107,8 @@ RSPAMD_PACKED(fuzzy_peer_cmd) { } cmd; }; +#ifdef __cplusplus +} +#endif + #endif diff --git a/src/libserver/html.h b/src/libserver/html.h index ada6dca68..86a266a62 100644 --- a/src/libserver/html.h +++ b/src/libserver/html.h @@ -8,6 +8,10 @@ #include "config.h" #include "mem_pool.h" +#ifdef __cplusplus +extern "C" { +#endif + /* * HTML content flags */ @@ -130,13 +134,13 @@ struct html_content { */ guint rspamd_html_decode_entitles_inplace (gchar *s, gsize len); -GByteArray* rspamd_html_process_part (rspamd_mempool_t *pool, - struct html_content *hc, - GByteArray *in); +GByteArray *rspamd_html_process_part (rspamd_mempool_t *pool, + struct html_content *hc, + GByteArray *in); -GByteArray* rspamd_html_process_part_full (rspamd_mempool_t *pool, - struct html_content *hc, - GByteArray *in, GList **exceptions, GHashTable *urls, GHashTable *emails); +GByteArray *rspamd_html_process_part_full (rspamd_mempool_t *pool, + struct html_content *hc, + GByteArray *in, GList **exceptions, GHashTable *urls, GHashTable *emails); /* * Returns true if a specified tag has been seen in a part @@ -148,7 +152,7 @@ gboolean rspamd_html_tag_seen (struct html_content *hc, const gchar *tagname); * @param id * @return */ -const gchar* rspamd_html_tag_by_id (gint id); +const gchar *rspamd_html_tag_by_id (gint id); /** * Returns HTML tag id by name @@ -165,8 +169,12 @@ gint rspamd_html_tag_by_name (const gchar *name); * @param comp * @return */ -struct rspamd_url * rspamd_html_process_url (rspamd_mempool_t *pool, - const gchar *start, guint len, - struct html_tag_component *comp); +struct rspamd_url *rspamd_html_process_url (rspamd_mempool_t *pool, + const gchar *start, guint len, + struct html_tag_component *comp); + +#ifdef __cplusplus +} +#endif #endif diff --git a/src/libserver/html_colors.h b/src/libserver/html_colors.h index 00fa6fed5..a22c5dc16 100644 --- a/src/libserver/html_colors.h +++ b/src/libserver/html_colors.h @@ -16,6 +16,10 @@ #ifndef SRC_LIBSERVER_HTML_COLORS_H_ #define SRC_LIBSERVER_HTML_COLORS_H_ +#ifdef __cplusplus +extern "C" { +#endif + struct rspamd_html_colorname { struct { guint8 r; @@ -26,682 +30,686 @@ struct rspamd_html_colorname { }; static const struct rspamd_html_colorname html_colornames[] = { - { {240, 248, 255}, "aliceblue"}, - { {250, 235, 215}, "antiquewhite"}, - { {255, 239, 219}, "antiquewhite1"}, - { {238, 223, 204}, "antiquewhite2"}, - { {205, 192, 176}, "antiquewhite3"}, - { {139, 131, 120}, "antiquewhite4"}, - { {0, 255, 255}, "aqua"}, - { {127, 255, 212}, "aquamarine"}, - { {127, 255, 212}, "aquamarine1"}, - { {118, 238, 198}, "aquamarine2"}, - { {102, 205, 170}, "aquamarine3"}, - { {69, 139, 116}, "aquamarine4"}, - { {240, 255, 255}, "azure"}, - { {240, 255, 255}, "azure1"}, - { {224, 238, 238}, "azure2"}, - { {193, 205, 205}, "azure3"}, - { {131, 139, 139}, "azure4"}, - { {245, 245, 220}, "beige"}, - { {255, 228, 196}, "bisque"}, - { {255, 228, 196}, "bisque1"}, - { {238, 213, 183}, "bisque2"}, - { {205, 183, 158}, "bisque3"}, - { {139, 125, 107}, "bisque4"}, - { {0, 0, 0}, "black"}, - { {255, 235, 205}, "blanchedalmond"}, - { {0, 0, 255}, "blue"}, - { {0, 0, 255}, "blue1"}, - { {0, 0, 238}, "blue2"}, - { {0, 0, 205}, "blue3"}, - { {0, 0, 139}, "blue4"}, - { {138, 43, 226}, "blueviolet"}, - { {165, 42, 42}, "brown"}, - { {255, 64, 64}, "brown1"}, - { {238, 59, 59}, "brown2"}, - { {205, 51, 51}, "brown3"}, - { {139, 35, 35}, "brown4"}, - { {222, 184, 135}, "burlywood"}, - { {255, 211, 155}, "burlywood1"}, - { {238, 197, 145}, "burlywood2"}, - { {205, 170, 125}, "burlywood3"}, - { {139, 115, 85}, "burlywood4"}, - { {95, 158, 160}, "cadetblue"}, - { {152, 245, 255}, "cadetblue1"}, - { {142, 229, 238}, "cadetblue2"}, - { {122, 197, 205}, "cadetblue3"}, - { {83, 134, 139}, "cadetblue4"}, - { {127, 255, 0}, "chartreuse"}, - { {127, 255, 0}, "chartreuse1"}, - { {118, 238, 0}, "chartreuse2"}, - { {102, 205, 0}, "chartreuse3"}, - { {69, 139, 0}, "chartreuse4"}, - { {210, 105, 30}, "chocolate"}, - { {255, 127, 36}, "chocolate1"}, - { {238, 118, 33}, "chocolate2"}, - { {205, 102, 29}, "chocolate3"}, - { {139, 69, 19}, "chocolate4"}, - { {255, 127, 80}, "coral"}, - { {255, 114, 86}, "coral1"}, - { {238, 106, 80}, "coral2"}, - { {205, 91, 69}, "coral3"}, - { {139, 62, 47}, "coral4"}, - { {100, 149, 237}, "cornflowerblue"}, - { {255, 248, 220}, "cornsilk"}, - { {255, 248, 220}, "cornsilk1"}, - { {238, 232, 205}, "cornsilk2"}, - { {205, 200, 177}, "cornsilk3"}, - { {139, 136, 120}, "cornsilk4"}, - { {220, 20, 60}, "crimson"}, - { {0, 255, 255}, "cyan"}, - { {0, 255, 255}, "cyan1"}, - { {0, 238, 238}, "cyan2"}, - { {0, 205, 205}, "cyan3"}, - { {0, 139, 139}, "cyan4"}, - { {0, 0, 139}, "darkblue"}, - { {0, 139, 139}, "darkcyan"}, - { {184, 134, 11}, "darkgoldenrod"}, - { {255, 185, 15}, "darkgoldenrod1"}, - { {238, 173, 14}, "darkgoldenrod2"}, - { {205, 149, 12}, "darkgoldenrod3"}, - { {139, 101, 8}, "darkgoldenrod4"}, - { {169, 169, 169}, "darkgray"}, - { {0, 100, 0}, "darkgreen"}, - { {169, 169, 169}, "darkgrey"}, - { {189, 183, 107}, "darkkhaki"}, - { {139, 0, 139}, "darkmagenta"}, - { {85, 107, 47}, "darkolivegreen"}, - { {202, 255, 112}, "darkolivegreen1"}, - { {188, 238, 104}, "darkolivegreen2"}, - { {162, 205, 90}, "darkolivegreen3"}, - { {110, 139, 61}, "darkolivegreen4"}, - { {255, 140, 0}, "darkorange"}, - { {255, 127, 0}, "darkorange1"}, - { {238, 118, 0}, "darkorange2"}, - { {205, 102, 0}, "darkorange3"}, - { {139, 69, 0}, "darkorange4"}, - { {153, 50, 204}, "darkorchid"}, - { {191, 62, 255}, "darkorchid1"}, - { {178, 58, 238}, "darkorchid2"}, - { {154, 50, 205}, "darkorchid3"}, - { {104, 34, 139}, "darkorchid4"}, - { {139, 0, 0}, "darkred"}, - { {233, 150, 122}, "darksalmon"}, - { {143, 188, 143}, "darkseagreen"}, - { {193, 255, 193}, "darkseagreen1"}, - { {180, 238, 180}, "darkseagreen2"}, - { {155, 205, 155}, "darkseagreen3"}, - { {105, 139, 105}, "darkseagreen4"}, - { {72, 61, 139}, "darkslateblue"}, - { {47, 79, 79}, "darkslategray"}, - { {151, 255, 255}, "darkslategray1"}, - { {141, 238, 238}, "darkslategray2"}, - { {121, 205, 205}, "darkslategray3"}, - { {82, 139, 139}, "darkslategray4"}, - { {47, 79, 79}, "darkslategrey"}, - { {0, 206, 209}, "darkturquoise"}, - { {148, 0, 211}, "darkviolet"}, - { {255, 20, 147}, "deeppink"}, - { {255, 20, 147}, "deeppink1"}, - { {238, 18, 137}, "deeppink2"}, - { {205, 16, 118}, "deeppink3"}, - { {139, 10, 80}, "deeppink4"}, - { {0, 191, 255}, "deepskyblue"}, - { {0, 191, 255}, "deepskyblue1"}, - { {0, 178, 238}, "deepskyblue2"}, - { {0, 154, 205}, "deepskyblue3"}, - { {0, 104, 139}, "deepskyblue4"}, - { {105, 105, 105}, "dimgray"}, - { {105, 105, 105}, "dimgrey"}, - { {30, 144, 255}, "dodgerblue"}, - { {30, 144, 255}, "dodgerblue1"}, - { {28, 134, 238}, "dodgerblue2"}, - { {24, 116, 205}, "dodgerblue3"}, - { {16, 78, 139}, "dodgerblue4"}, - { {178, 34, 34}, "firebrick"}, - { {255, 48, 48}, "firebrick1"}, - { {238, 44, 44}, "firebrick2"}, - { {205, 38, 38}, "firebrick3"}, - { {139, 26, 26}, "firebrick4"}, - { {255, 250, 240}, "floralwhite"}, - { {34, 139, 34}, "forestgreen"}, - { {255, 0, 255}, "fuchsia"}, - { {220, 220, 220}, "gainsboro"}, - { {248, 248, 255}, "ghostwhite"}, - { {255, 215, 0}, "gold"}, - { {255, 215, 0}, "gold1"}, - { {238, 201, 0}, "gold2"}, - { {205, 173, 0}, "gold3"}, - { {139, 117, 0}, "gold4"}, - { {218, 165, 32}, "goldenrod"}, - { {255, 193, 37}, "goldenrod1"}, - { {238, 180, 34}, "goldenrod2"}, - { {205, 155, 29}, "goldenrod3"}, - { {139, 105, 20}, "goldenrod4"}, - { {190, 190, 190}, "gray"}, - { {0, 0, 0}, "gray0"}, - { {3, 3, 3}, "gray1"}, - { {26, 26, 26}, "gray10"}, - { {255, 255, 255}, "gray100"}, - { {28, 28, 28}, "gray11"}, - { {31, 31, 31}, "gray12"}, - { {33, 33, 33}, "gray13"}, - { {36, 36, 36}, "gray14"}, - { {38, 38, 38}, "gray15"}, - { {41, 41, 41}, "gray16"}, - { {43, 43, 43}, "gray17"}, - { {46, 46, 46}, "gray18"}, - { {48, 48, 48}, "gray19"}, - { {5, 5, 5}, "gray2"}, - { {51, 51, 51}, "gray20"}, - { {54, 54, 54}, "gray21"}, - { {56, 56, 56}, "gray22"}, - { {59, 59, 59}, "gray23"}, - { {61, 61, 61}, "gray24"}, - { {64, 64, 64}, "gray25"}, - { {66, 66, 66}, "gray26"}, - { {69, 69, 69}, "gray27"}, - { {71, 71, 71}, "gray28"}, - { {74, 74, 74}, "gray29"}, - { {8, 8, 8}, "gray3"}, - { {77, 77, 77}, "gray30"}, - { {79, 79, 79}, "gray31"}, - { {82, 82, 82}, "gray32"}, - { {84, 84, 84}, "gray33"}, - { {87, 87, 87}, "gray34"}, - { {89, 89, 89}, "gray35"}, - { {92, 92, 92}, "gray36"}, - { {94, 94, 94}, "gray37"}, - { {97, 97, 97}, "gray38"}, - { {99, 99, 99}, "gray39"}, - { {10, 10, 10}, "gray4"}, - { {102, 102, 102}, "gray40"}, - { {105, 105, 105}, "gray41"}, - { {107, 107, 107}, "gray42"}, - { {110, 110, 110}, "gray43"}, - { {112, 112, 112}, "gray44"}, - { {115, 115, 115}, "gray45"}, - { {117, 117, 117}, "gray46"}, - { {120, 120, 120}, "gray47"}, - { {122, 122, 122}, "gray48"}, - { {125, 125, 125}, "gray49"}, - { {13, 13, 13}, "gray5"}, - { {127, 127, 127}, "gray50"}, - { {130, 130, 130}, "gray51"}, - { {133, 133, 133}, "gray52"}, - { {135, 135, 135}, "gray53"}, - { {138, 138, 138}, "gray54"}, - { {140, 140, 140}, "gray55"}, - { {143, 143, 143}, "gray56"}, - { {145, 145, 145}, "gray57"}, - { {148, 148, 148}, "gray58"}, - { {150, 150, 150}, "gray59"}, - { {15, 15, 15}, "gray6"}, - { {153, 153, 153}, "gray60"}, - { {156, 156, 156}, "gray61"}, - { {158, 158, 158}, "gray62"}, - { {161, 161, 161}, "gray63"}, - { {163, 163, 163}, "gray64"}, - { {166, 166, 166}, "gray65"}, - { {168, 168, 168}, "gray66"}, - { {171, 171, 171}, "gray67"}, - { {173, 173, 173}, "gray68"}, - { {176, 176, 176}, "gray69"}, - { {18, 18, 18}, "gray7"}, - { {179, 179, 179}, "gray70"}, - { {181, 181, 181}, "gray71"}, - { {184, 184, 184}, "gray72"}, - { {186, 186, 186}, "gray73"}, - { {189, 189, 189}, "gray74"}, - { {191, 191, 191}, "gray75"}, - { {194, 194, 194}, "gray76"}, - { {196, 196, 196}, "gray77"}, - { {199, 199, 199}, "gray78"}, - { {201, 201, 201}, "gray79"}, - { {20, 20, 20}, "gray8"}, - { {204, 204, 204}, "gray80"}, - { {207, 207, 207}, "gray81"}, - { {209, 209, 209}, "gray82"}, - { {212, 212, 212}, "gray83"}, - { {214, 214, 214}, "gray84"}, - { {217, 217, 217}, "gray85"}, - { {219, 219, 219}, "gray86"}, - { {222, 222, 222}, "gray87"}, - { {224, 224, 224}, "gray88"}, - { {227, 227, 227}, "gray89"}, - { {23, 23, 23}, "gray9"}, - { {229, 229, 229}, "gray90"}, - { {232, 232, 232}, "gray91"}, - { {235, 235, 235}, "gray92"}, - { {237, 237, 237}, "gray93"}, - { {240, 240, 240}, "gray94"}, - { {242, 242, 242}, "gray95"}, - { {245, 245, 245}, "gray96"}, - { {247, 247, 247}, "gray97"}, - { {250, 250, 250}, "gray98"}, - { {252, 252, 252}, "gray99"}, - { {0, 255, 0}, "green"}, - { {0, 255, 0}, "green1"}, - { {0, 238, 0}, "green2"}, - { {0, 205, 0}, "green3"}, - { {0, 139, 0}, "green4"}, - { {173, 255, 47}, "greenyellow"}, - { {190, 190, 190}, "grey"}, - { {0, 0, 0}, "grey0"}, - { {3, 3, 3}, "grey1"}, - { {26, 26, 26}, "grey10"}, - { {255, 255, 255}, "grey100"}, - { {28, 28, 28}, "grey11"}, - { {31, 31, 31}, "grey12"}, - { {33, 33, 33}, "grey13"}, - { {36, 36, 36}, "grey14"}, - { {38, 38, 38}, "grey15"}, - { {41, 41, 41}, "grey16"}, - { {43, 43, 43}, "grey17"}, - { {46, 46, 46}, "grey18"}, - { {48, 48, 48}, "grey19"}, - { {5, 5, 5}, "grey2"}, - { {51, 51, 51}, "grey20"}, - { {54, 54, 54}, "grey21"}, - { {56, 56, 56}, "grey22"}, - { {59, 59, 59}, "grey23"}, - { {61, 61, 61}, "grey24"}, - { {64, 64, 64}, "grey25"}, - { {66, 66, 66}, "grey26"}, - { {69, 69, 69}, "grey27"}, - { {71, 71, 71}, "grey28"}, - { {74, 74, 74}, "grey29"}, - { {8, 8, 8}, "grey3"}, - { {77, 77, 77}, "grey30"}, - { {79, 79, 79}, "grey31"}, - { {82, 82, 82}, "grey32"}, - { {84, 84, 84}, "grey33"}, - { {87, 87, 87}, "grey34"}, - { {89, 89, 89}, "grey35"}, - { {92, 92, 92}, "grey36"}, - { {94, 94, 94}, "grey37"}, - { {97, 97, 97}, "grey38"}, - { {99, 99, 99}, "grey39"}, - { {10, 10, 10}, "grey4"}, - { {102, 102, 102}, "grey40"}, - { {105, 105, 105}, "grey41"}, - { {107, 107, 107}, "grey42"}, - { {110, 110, 110}, "grey43"}, - { {112, 112, 112}, "grey44"}, - { {115, 115, 115}, "grey45"}, - { {117, 117, 117}, "grey46"}, - { {120, 120, 120}, "grey47"}, - { {122, 122, 122}, "grey48"}, - { {125, 125, 125}, "grey49"}, - { {13, 13, 13}, "grey5"}, - { {127, 127, 127}, "grey50"}, - { {130, 130, 130}, "grey51"}, - { {133, 133, 133}, "grey52"}, - { {135, 135, 135}, "grey53"}, - { {138, 138, 138}, "grey54"}, - { {140, 140, 140}, "grey55"}, - { {143, 143, 143}, "grey56"}, - { {145, 145, 145}, "grey57"}, - { {148, 148, 148}, "grey58"}, - { {150, 150, 150}, "grey59"}, - { {15, 15, 15}, "grey6"}, - { {153, 153, 153}, "grey60"}, - { {156, 156, 156}, "grey61"}, - { {158, 158, 158}, "grey62"}, - { {161, 161, 161}, "grey63"}, - { {163, 163, 163}, "grey64"}, - { {166, 166, 166}, "grey65"}, - { {168, 168, 168}, "grey66"}, - { {171, 171, 171}, "grey67"}, - { {173, 173, 173}, "grey68"}, - { {176, 176, 176}, "grey69"}, - { {18, 18, 18}, "grey7"}, - { {179, 179, 179}, "grey70"}, - { {181, 181, 181}, "grey71"}, - { {184, 184, 184}, "grey72"}, - { {186, 186, 186}, "grey73"}, - { {189, 189, 189}, "grey74"}, - { {191, 191, 191}, "grey75"}, - { {194, 194, 194}, "grey76"}, - { {196, 196, 196}, "grey77"}, - { {199, 199, 199}, "grey78"}, - { {201, 201, 201}, "grey79"}, - { {20, 20, 20}, "grey8"}, - { {204, 204, 204}, "grey80"}, - { {207, 207, 207}, "grey81"}, - { {209, 209, 209}, "grey82"}, - { {212, 212, 212}, "grey83"}, - { {214, 214, 214}, "grey84"}, - { {217, 217, 217}, "grey85"}, - { {219, 219, 219}, "grey86"}, - { {222, 222, 222}, "grey87"}, - { {224, 224, 224}, "grey88"}, - { {227, 227, 227}, "grey89"}, - { {23, 23, 23}, "grey9"}, - { {229, 229, 229}, "grey90"}, - { {232, 232, 232}, "grey91"}, - { {235, 235, 235}, "grey92"}, - { {237, 237, 237}, "grey93"}, - { {240, 240, 240}, "grey94"}, - { {242, 242, 242}, "grey95"}, - { {245, 245, 245}, "grey96"}, - { {247, 247, 247}, "grey97"}, - { {250, 250, 250}, "grey98"}, - { {252, 252, 252}, "grey99"}, - { {240, 255, 240}, "honeydew"}, - { {240, 255, 240}, "honeydew1"}, - { {224, 238, 224}, "honeydew2"}, - { {193, 205, 193}, "honeydew3"}, - { {131, 139, 131}, "honeydew4"}, - { {255, 105, 180}, "hotpink"}, - { {255, 110, 180}, "hotpink1"}, - { {238, 106, 167}, "hotpink2"}, - { {205, 96, 144}, "hotpink3"}, - { {139, 58, 98}, "hotpink4"}, - { {205, 92, 92}, "indianred"}, - { {255, 106, 106}, "indianred1"}, - { {238, 99, 99}, "indianred2"}, - { {205, 85, 85}, "indianred3"}, - { {139, 58, 58}, "indianred4"}, - { {75, 0, 130}, "indigo"}, - { {255, 255, 240}, "ivory"}, - { {255, 255, 240}, "ivory1"}, - { {238, 238, 224}, "ivory2"}, - { {205, 205, 193}, "ivory3"}, - { {139, 139, 131}, "ivory4"}, - { {240, 230, 140}, "khaki"}, - { {255, 246, 143}, "khaki1"}, - { {238, 230, 133}, "khaki2"}, - { {205, 198, 115}, "khaki3"}, - { {139, 134, 78}, "khaki4"}, - { {230, 230, 250}, "lavender"}, - { {255, 240, 245}, "lavenderblush"}, - { {255, 240, 245}, "lavenderblush1"}, - { {238, 224, 229}, "lavenderblush2"}, - { {205, 193, 197}, "lavenderblush3"}, - { {139, 131, 134}, "lavenderblush4"}, - { {124, 252, 0}, "lawngreen"}, - { {255, 250, 205}, "lemonchiffon"}, - { {255, 250, 205}, "lemonchiffon1"}, - { {238, 233, 191}, "lemonchiffon2"}, - { {205, 201, 165}, "lemonchiffon3"}, - { {139, 137, 112}, "lemonchiffon4"}, - { {173, 216, 230}, "lightblue"}, - { {191, 239, 255}, "lightblue1"}, - { {178, 223, 238}, "lightblue2"}, - { {154, 192, 205}, "lightblue3"}, - { {104, 131, 139}, "lightblue4"}, - { {240, 128, 128}, "lightcoral"}, - { {224, 255, 255}, "lightcyan"}, - { {224, 255, 255}, "lightcyan1"}, - { {209, 238, 238}, "lightcyan2"}, - { {180, 205, 205}, "lightcyan3"}, - { {122, 139, 139}, "lightcyan4"}, - { {238, 221, 130}, "lightgoldenrod"}, - { {255, 236, 139}, "lightgoldenrod1"}, - { {238, 220, 130}, "lightgoldenrod2"}, - { {205, 190, 112}, "lightgoldenrod3"}, - { {139, 129, 76}, "lightgoldenrod4"}, - { {250, 250, 210}, "lightgoldenrodyellow"}, - { {211, 211, 211}, "lightgray"}, - { {144, 238, 144}, "lightgreen"}, - { {211, 211, 211}, "lightgrey"}, - { {255, 182, 193}, "lightpink"}, - { {255, 174, 185}, "lightpink1"}, - { {238, 162, 173}, "lightpink2"}, - { {205, 140, 149}, "lightpink3"}, - { {139, 95, 101}, "lightpink4"}, - { {255, 160, 122}, "lightsalmon"}, - { {255, 160, 122}, "lightsalmon1"}, - { {238, 149, 114}, "lightsalmon2"}, - { {205, 129, 98}, "lightsalmon3"}, - { {139, 87, 66}, "lightsalmon4"}, - { {32, 178, 170}, "lightseagreen"}, - { {135, 206, 250}, "lightskyblue"}, - { {176, 226, 255}, "lightskyblue1"}, - { {164, 211, 238}, "lightskyblue2"}, - { {141, 182, 205}, "lightskyblue3"}, - { {96, 123, 139}, "lightskyblue4"}, - { {132, 112, 255}, "lightslateblue"}, - { {119, 136, 153}, "lightslategray"}, - { {119, 136, 153}, "lightslategrey"}, - { {176, 196, 222}, "lightsteelblue"}, - { {202, 225, 255}, "lightsteelblue1"}, - { {188, 210, 238}, "lightsteelblue2"}, - { {162, 181, 205}, "lightsteelblue3"}, - { {110, 123, 139}, "lightsteelblue4"}, - { {255, 255, 224}, "lightyellow"}, - { {255, 255, 224}, "lightyellow1"}, - { {238, 238, 209}, "lightyellow2"}, - { {205, 205, 180}, "lightyellow3"}, - { {139, 139, 122}, "lightyellow4"}, - { {0, 255, 0}, "lime"}, - { {50, 205, 50}, "limegreen"}, - { {250, 240, 230}, "linen"}, - { {255, 0, 255}, "magenta"}, - { {255, 0, 255}, "magenta1"}, - { {238, 0, 238}, "magenta2"}, - { {205, 0, 205}, "magenta3"}, - { {139, 0, 139}, "magenta4"}, - { {176, 48, 96}, "maroon"}, - { {255, 52, 179}, "maroon1"}, - { {238, 48, 167}, "maroon2"}, - { {205, 41, 144}, "maroon3"}, - { {139, 28, 98}, "maroon4"}, - { {102, 205, 170}, "mediumaquamarine"}, - { {0, 0, 205}, "mediumblue"}, - { {186, 85, 211}, "mediumorchid"}, - { {224, 102, 255}, "mediumorchid1"}, - { {209, 95, 238}, "mediumorchid2"}, - { {180, 82, 205}, "mediumorchid3"}, - { {122, 55, 139}, "mediumorchid4"}, - { {147, 112, 219}, "mediumpurple"}, - { {171, 130, 255}, "mediumpurple1"}, - { {159, 121, 238}, "mediumpurple2"}, - { {137, 104, 205}, "mediumpurple3"}, - { {93, 71, 139}, "mediumpurple4"}, - { {60, 179, 113}, "mediumseagreen"}, - { {123, 104, 238}, "mediumslateblue"}, - { {0, 250, 154}, "mediumspringgreen"}, - { {72, 209, 204}, "mediumturquoise"}, - { {199, 21, 133}, "mediumvioletred"}, - { {25, 25, 112}, "midnightblue"}, - { {245, 255, 250}, "mintcream"}, - { {255, 228, 225}, "mistyrose"}, - { {255, 228, 225}, "mistyrose1"}, - { {238, 213, 210}, "mistyrose2"}, - { {205, 183, 181}, "mistyrose3"}, - { {139, 125, 123}, "mistyrose4"}, - { {255, 228, 181}, "moccasin"}, - { {255, 222, 173}, "navajowhite"}, - { {255, 222, 173}, "navajowhite1"}, - { {238, 207, 161}, "navajowhite2"}, - { {205, 179, 139}, "navajowhite3"}, - { {139, 121, 94}, "navajowhite4"}, - { {0, 0, 128}, "navy"}, - { {0, 0, 128}, "navyblue"}, - { {253, 245, 230}, "oldlace"}, - { {128, 128, 0}, "olive"}, - { {107, 142, 35}, "olivedrab"}, - { {192, 255, 62}, "olivedrab1"}, - { {179, 238, 58}, "olivedrab2"}, - { {154, 205, 50}, "olivedrab3"}, - { {105, 139, 34}, "olivedrab4"}, - { {255, 165, 0}, "orange"}, - { {255, 165, 0}, "orange1"}, - { {238, 154, 0}, "orange2"}, - { {205, 133, 0}, "orange3"}, - { {139, 90, 0}, "orange4"}, - { {255, 69, 0}, "orangered"}, - { {255, 69, 0}, "orangered1"}, - { {238, 64, 0}, "orangered2"}, - { {205, 55, 0}, "orangered3"}, - { {139, 37, 0}, "orangered4"}, - { {218, 112, 214}, "orchid"}, - { {255, 131, 250}, "orchid1"}, - { {238, 122, 233}, "orchid2"}, - { {205, 105, 201}, "orchid3"}, - { {139, 71, 137}, "orchid4"}, - { {238, 232, 170}, "palegoldenrod"}, - { {152, 251, 152}, "palegreen"}, - { {154, 255, 154}, "palegreen1"}, - { {144, 238, 144}, "palegreen2"}, - { {124, 205, 124}, "palegreen3"}, - { {84, 139, 84}, "palegreen4"}, - { {175, 238, 238}, "paleturquoise"}, - { {187, 255, 255}, "paleturquoise1"}, - { {174, 238, 238}, "paleturquoise2"}, - { {150, 205, 205}, "paleturquoise3"}, - { {102, 139, 139}, "paleturquoise4"}, - { {219, 112, 147}, "palevioletred"}, - { {255, 130, 171}, "palevioletred1"}, - { {238, 121, 159}, "palevioletred2"}, - { {205, 104, 137}, "palevioletred3"}, - { {139, 71, 93}, "palevioletred4"}, - { {255, 239, 213}, "papayawhip"}, - { {255, 218, 185}, "peachpuff"}, - { {255, 218, 185}, "peachpuff1"}, - { {238, 203, 173}, "peachpuff2"}, - { {205, 175, 149}, "peachpuff3"}, - { {139, 119, 101}, "peachpuff4"}, - { {205, 133, 63}, "peru"}, - { {255, 192, 203}, "pink"}, - { {255, 181, 197}, "pink1"}, - { {238, 169, 184}, "pink2"}, - { {205, 145, 158}, "pink3"}, - { {139, 99, 108}, "pink4"}, - { {221, 160, 221}, "plum"}, - { {255, 187, 255}, "plum1"}, - { {238, 174, 238}, "plum2"}, - { {205, 150, 205}, "plum3"}, - { {139, 102, 139}, "plum4"}, - { {176, 224, 230}, "powderblue"}, - { {160, 32, 240}, "purple"}, - { {155, 48, 255}, "purple1"}, - { {145, 44, 238}, "purple2"}, - { {125, 38, 205}, "purple3"}, - { {85, 26, 139}, "purple4"}, - { {102, 51, 153}, "rebeccapurple"}, - { {255, 0, 0}, "red"}, - { {255, 0, 0}, "red1"}, - { {238, 0, 0}, "red2"}, - { {205, 0, 0}, "red3"}, - { {139, 0, 0}, "red4"}, - { {188, 143, 143}, "rosybrown"}, - { {255, 193, 193}, "rosybrown1"}, - { {238, 180, 180}, "rosybrown2"}, - { {205, 155, 155}, "rosybrown3"}, - { {139, 105, 105}, "rosybrown4"}, - { {65, 105, 225}, "royalblue"}, - { {72, 118, 255}, "royalblue1"}, - { {67, 110, 238}, "royalblue2"}, - { {58, 95, 205}, "royalblue3"}, - { {39, 64, 139}, "royalblue4"}, - { {139, 69, 19}, "saddlebrown"}, - { {250, 128, 114}, "salmon"}, - { {255, 140, 105}, "salmon1"}, - { {238, 130, 98}, "salmon2"}, - { {205, 112, 84}, "salmon3"}, - { {139, 76, 57}, "salmon4"}, - { {244, 164, 96}, "sandybrown"}, - { {46, 139, 87}, "seagreen"}, - { {84, 255, 159}, "seagreen1"}, - { {78, 238, 148}, "seagreen2"}, - { {67, 205, 128}, "seagreen3"}, - { {46, 139, 87}, "seagreen4"}, - { {255, 245, 238}, "seashell"}, - { {255, 245, 238}, "seashell1"}, - { {238, 229, 222}, "seashell2"}, - { {205, 197, 191}, "seashell3"}, - { {139, 134, 130}, "seashell4"}, - { {160, 82, 45}, "sienna"}, - { {255, 130, 71}, "sienna1"}, - { {238, 121, 66}, "sienna2"}, - { {205, 104, 57}, "sienna3"}, - { {139, 71, 38}, "sienna4"}, - { {192, 192, 192}, "silver"}, - { {135, 206, 235}, "skyblue"}, - { {135, 206, 255}, "skyblue1"}, - { {126, 192, 238}, "skyblue2"}, - { {108, 166, 205}, "skyblue3"}, - { {74, 112, 139}, "skyblue4"}, - { {106, 90, 205}, "slateblue"}, - { {131, 111, 255}, "slateblue1"}, - { {122, 103, 238}, "slateblue2"}, - { {105, 89, 205}, "slateblue3"}, - { {71, 60, 139}, "slateblue4"}, - { {112, 128, 144}, "slategray"}, - { {198, 226, 255}, "slategray1"}, - { {185, 211, 238}, "slategray2"}, - { {159, 182, 205}, "slategray3"}, - { {108, 123, 139}, "slategray4"}, - { {112, 128, 144}, "slategrey"}, - { {255, 250, 250}, "snow"}, - { {255, 250, 250}, "snow1"}, - { {238, 233, 233}, "snow2"}, - { {205, 201, 201}, "snow3"}, - { {139, 137, 137}, "snow4"}, - { {0, 255, 127}, "springgreen"}, - { {0, 255, 127}, "springgreen1"}, - { {0, 238, 118}, "springgreen2"}, - { {0, 205, 102}, "springgreen3"}, - { {0, 139, 69}, "springgreen4"}, - { {70, 130, 180}, "steelblue"}, - { {99, 184, 255}, "steelblue1"}, - { {92, 172, 238}, "steelblue2"}, - { {79, 148, 205}, "steelblue3"}, - { {54, 100, 139}, "steelblue4"}, - { {210, 180, 140}, "tan"}, - { {255, 165, 79}, "tan1"}, - { {238, 154, 73}, "tan2"}, - { {205, 133, 63}, "tan3"}, - { {139, 90, 43}, "tan4"}, - { {0, 128, 128}, "teal"}, - { {216, 191, 216}, "thistle"}, - { {255, 225, 255}, "thistle1"}, - { {238, 210, 238}, "thistle2"}, - { {205, 181, 205}, "thistle3"}, - { {139, 123, 139}, "thistle4"}, - { {255, 99, 71}, "tomato"}, - { {255, 99, 71}, "tomato1"}, - { {238, 92, 66}, "tomato2"}, - { {205, 79, 57}, "tomato3"}, - { {139, 54, 38}, "tomato4"}, - { {64, 224, 208}, "turquoise"}, - { {0, 245, 255}, "turquoise1"}, - { {0, 229, 238}, "turquoise2"}, - { {0, 197, 205}, "turquoise3"}, - { {0, 134, 139}, "turquoise4"}, - { {238, 130, 238}, "violet"}, - { {208, 32, 144}, "violetred"}, - { {255, 62, 150}, "violetred1"}, - { {238, 58, 140}, "violetred2"}, - { {205, 50, 120}, "violetred3"}, - { {139, 34, 82}, "violetred4"}, - { {128, 128, 128}, "webgray"}, - { {0, 128, 0}, "webgreen"}, - { {128, 128, 128}, "webgrey"}, - { {128, 0, 0}, "webmaroon"}, - { {128, 0, 128}, "webpurple"}, - { {245, 222, 179}, "wheat"}, - { {255, 231, 186}, "wheat1"}, - { {238, 216, 174}, "wheat2"}, - { {205, 186, 150}, "wheat3"}, - { {139, 126, 102}, "wheat4"}, - { {255, 255, 255}, "white"}, - { {245, 245, 245}, "whitesmoke"}, - { {190, 190, 190}, "x11gray"}, - { {0, 255, 0}, "x11green"}, - { {190, 190, 190}, "x11grey"}, - { {176, 48, 96}, "x11maroon"}, - { {160, 32, 240}, "x11purple"}, - { {255, 255, 0}, "yellow"}, - { {255, 255, 0}, "yellow1"}, - { {238, 238, 0}, "yellow2"}, - { {205, 205, 0}, "yellow3"}, - { {139, 139, 0}, "yellow4"}, - { {154, 205, 50}, "yellowgreen"}, + {{240, 248, 255}, "aliceblue"}, + {{250, 235, 215}, "antiquewhite"}, + {{255, 239, 219}, "antiquewhite1"}, + {{238, 223, 204}, "antiquewhite2"}, + {{205, 192, 176}, "antiquewhite3"}, + {{139, 131, 120}, "antiquewhite4"}, + {{0, 255, 255}, "aqua"}, + {{127, 255, 212}, "aquamarine"}, + {{127, 255, 212}, "aquamarine1"}, + {{118, 238, 198}, "aquamarine2"}, + {{102, 205, 170}, "aquamarine3"}, + {{69, 139, 116}, "aquamarine4"}, + {{240, 255, 255}, "azure"}, + {{240, 255, 255}, "azure1"}, + {{224, 238, 238}, "azure2"}, + {{193, 205, 205}, "azure3"}, + {{131, 139, 139}, "azure4"}, + {{245, 245, 220}, "beige"}, + {{255, 228, 196}, "bisque"}, + {{255, 228, 196}, "bisque1"}, + {{238, 213, 183}, "bisque2"}, + {{205, 183, 158}, "bisque3"}, + {{139, 125, 107}, "bisque4"}, + {{0, 0, 0}, "black"}, + {{255, 235, 205}, "blanchedalmond"}, + {{0, 0, 255}, "blue"}, + {{0, 0, 255}, "blue1"}, + {{0, 0, 238}, "blue2"}, + {{0, 0, 205}, "blue3"}, + {{0, 0, 139}, "blue4"}, + {{138, 43, 226}, "blueviolet"}, + {{165, 42, 42}, "brown"}, + {{255, 64, 64}, "brown1"}, + {{238, 59, 59}, "brown2"}, + {{205, 51, 51}, "brown3"}, + {{139, 35, 35}, "brown4"}, + {{222, 184, 135}, "burlywood"}, + {{255, 211, 155}, "burlywood1"}, + {{238, 197, 145}, "burlywood2"}, + {{205, 170, 125}, "burlywood3"}, + {{139, 115, 85}, "burlywood4"}, + {{95, 158, 160}, "cadetblue"}, + {{152, 245, 255}, "cadetblue1"}, + {{142, 229, 238}, "cadetblue2"}, + {{122, 197, 205}, "cadetblue3"}, + {{83, 134, 139}, "cadetblue4"}, + {{127, 255, 0}, "chartreuse"}, + {{127, 255, 0}, "chartreuse1"}, + {{118, 238, 0}, "chartreuse2"}, + {{102, 205, 0}, "chartreuse3"}, + {{69, 139, 0}, "chartreuse4"}, + {{210, 105, 30}, "chocolate"}, + {{255, 127, 36}, "chocolate1"}, + {{238, 118, 33}, "chocolate2"}, + {{205, 102, 29}, "chocolate3"}, + {{139, 69, 19}, "chocolate4"}, + {{255, 127, 80}, "coral"}, + {{255, 114, 86}, "coral1"}, + {{238, 106, 80}, "coral2"}, + {{205, 91, 69}, "coral3"}, + {{139, 62, 47}, "coral4"}, + {{100, 149, 237}, "cornflowerblue"}, + {{255, 248, 220}, "cornsilk"}, + {{255, 248, 220}, "cornsilk1"}, + {{238, 232, 205}, "cornsilk2"}, + {{205, 200, 177}, "cornsilk3"}, + {{139, 136, 120}, "cornsilk4"}, + {{220, 20, 60}, "crimson"}, + {{0, 255, 255}, "cyan"}, + {{0, 255, 255}, "cyan1"}, + {{0, 238, 238}, "cyan2"}, + {{0, 205, 205}, "cyan3"}, + {{0, 139, 139}, "cyan4"}, + {{0, 0, 139}, "darkblue"}, + {{0, 139, 139}, "darkcyan"}, + {{184, 134, 11}, "darkgoldenrod"}, + {{255, 185, 15}, "darkgoldenrod1"}, + {{238, 173, 14}, "darkgoldenrod2"}, + {{205, 149, 12}, "darkgoldenrod3"}, + {{139, 101, 8}, "darkgoldenrod4"}, + {{169, 169, 169}, "darkgray"}, + {{0, 100, 0}, "darkgreen"}, + {{169, 169, 169}, "darkgrey"}, + {{189, 183, 107}, "darkkhaki"}, + {{139, 0, 139}, "darkmagenta"}, + {{85, 107, 47}, "darkolivegreen"}, + {{202, 255, 112}, "darkolivegreen1"}, + {{188, 238, 104}, "darkolivegreen2"}, + {{162, 205, 90}, "darkolivegreen3"}, + {{110, 139, 61}, "darkolivegreen4"}, + {{255, 140, 0}, "darkorange"}, + {{255, 127, 0}, "darkorange1"}, + {{238, 118, 0}, "darkorange2"}, + {{205, 102, 0}, "darkorange3"}, + {{139, 69, 0}, "darkorange4"}, + {{153, 50, 204}, "darkorchid"}, + {{191, 62, 255}, "darkorchid1"}, + {{178, 58, 238}, "darkorchid2"}, + {{154, 50, 205}, "darkorchid3"}, + {{104, 34, 139}, "darkorchid4"}, + {{139, 0, 0}, "darkred"}, + {{233, 150, 122}, "darksalmon"}, + {{143, 188, 143}, "darkseagreen"}, + {{193, 255, 193}, "darkseagreen1"}, + {{180, 238, 180}, "darkseagreen2"}, + {{155, 205, 155}, "darkseagreen3"}, + {{105, 139, 105}, "darkseagreen4"}, + {{72, 61, 139}, "darkslateblue"}, + {{47, 79, 79}, "darkslategray"}, + {{151, 255, 255}, "darkslategray1"}, + {{141, 238, 238}, "darkslategray2"}, + {{121, 205, 205}, "darkslategray3"}, + {{82, 139, 139}, "darkslategray4"}, + {{47, 79, 79}, "darkslategrey"}, + {{0, 206, 209}, "darkturquoise"}, + {{148, 0, 211}, "darkviolet"}, + {{255, 20, 147}, "deeppink"}, + {{255, 20, 147}, "deeppink1"}, + {{238, 18, 137}, "deeppink2"}, + {{205, 16, 118}, "deeppink3"}, + {{139, 10, 80}, "deeppink4"}, + {{0, 191, 255}, "deepskyblue"}, + {{0, 191, 255}, "deepskyblue1"}, + {{0, 178, 238}, "deepskyblue2"}, + {{0, 154, 205}, "deepskyblue3"}, + {{0, 104, 139}, "deepskyblue4"}, + {{105, 105, 105}, "dimgray"}, + {{105, 105, 105}, "dimgrey"}, + {{30, 144, 255}, "dodgerblue"}, + {{30, 144, 255}, "dodgerblue1"}, + {{28, 134, 238}, "dodgerblue2"}, + {{24, 116, 205}, "dodgerblue3"}, + {{16, 78, 139}, "dodgerblue4"}, + {{178, 34, 34}, "firebrick"}, + {{255, 48, 48}, "firebrick1"}, + {{238, 44, 44}, "firebrick2"}, + {{205, 38, 38}, "firebrick3"}, + {{139, 26, 26}, "firebrick4"}, + {{255, 250, 240}, "floralwhite"}, + {{34, 139, 34}, "forestgreen"}, + {{255, 0, 255}, "fuchsia"}, + {{220, 220, 220}, "gainsboro"}, + {{248, 248, 255}, "ghostwhite"}, + {{255, 215, 0}, "gold"}, + {{255, 215, 0}, "gold1"}, + {{238, 201, 0}, "gold2"}, + {{205, 173, 0}, "gold3"}, + {{139, 117, 0}, "gold4"}, + {{218, 165, 32}, "goldenrod"}, + {{255, 193, 37}, "goldenrod1"}, + {{238, 180, 34}, "goldenrod2"}, + {{205, 155, 29}, "goldenrod3"}, + {{139, 105, 20}, "goldenrod4"}, + {{190, 190, 190}, "gray"}, + {{0, 0, 0}, "gray0"}, + {{3, 3, 3}, "gray1"}, + {{26, 26, 26}, "gray10"}, + {{255, 255, 255}, "gray100"}, + {{28, 28, 28}, "gray11"}, + {{31, 31, 31}, "gray12"}, + {{33, 33, 33}, "gray13"}, + {{36, 36, 36}, "gray14"}, + {{38, 38, 38}, "gray15"}, + {{41, 41, 41}, "gray16"}, + {{43, 43, 43}, "gray17"}, + {{46, 46, 46}, "gray18"}, + {{48, 48, 48}, "gray19"}, + {{5, 5, 5}, "gray2"}, + {{51, 51, 51}, "gray20"}, + {{54, 54, 54}, "gray21"}, + {{56, 56, 56}, "gray22"}, + {{59, 59, 59}, "gray23"}, + {{61, 61, 61}, "gray24"}, + {{64, 64, 64}, "gray25"}, + {{66, 66, 66}, "gray26"}, + {{69, 69, 69}, "gray27"}, + {{71, 71, 71}, "gray28"}, + {{74, 74, 74}, "gray29"}, + {{8, 8, 8}, "gray3"}, + {{77, 77, 77}, "gray30"}, + {{79, 79, 79}, "gray31"}, + {{82, 82, 82}, "gray32"}, + {{84, 84, 84}, "gray33"}, + {{87, 87, 87}, "gray34"}, + {{89, 89, 89}, "gray35"}, + {{92, 92, 92}, "gray36"}, + {{94, 94, 94}, "gray37"}, + {{97, 97, 97}, "gray38"}, + {{99, 99, 99}, "gray39"}, + {{10, 10, 10}, "gray4"}, + {{102, 102, 102}, "gray40"}, + {{105, 105, 105}, "gray41"}, + {{107, 107, 107}, "gray42"}, + {{110, 110, 110}, "gray43"}, + {{112, 112, 112}, "gray44"}, + {{115, 115, 115}, "gray45"}, + {{117, 117, 117}, "gray46"}, + {{120, 120, 120}, "gray47"}, + {{122, 122, 122}, "gray48"}, + {{125, 125, 125}, "gray49"}, + {{13, 13, 13}, "gray5"}, + {{127, 127, 127}, "gray50"}, + {{130, 130, 130}, "gray51"}, + {{133, 133, 133}, "gray52"}, + {{135, 135, 135}, "gray53"}, + {{138, 138, 138}, "gray54"}, + {{140, 140, 140}, "gray55"}, + {{143, 143, 143}, "gray56"}, + {{145, 145, 145}, "gray57"}, + {{148, 148, 148}, "gray58"}, + {{150, 150, 150}, "gray59"}, + {{15, 15, 15}, "gray6"}, + {{153, 153, 153}, "gray60"}, + {{156, 156, 156}, "gray61"}, + {{158, 158, 158}, "gray62"}, + {{161, 161, 161}, "gray63"}, + {{163, 163, 163}, "gray64"}, + {{166, 166, 166}, "gray65"}, + {{168, 168, 168}, "gray66"}, + {{171, 171, 171}, "gray67"}, + {{173, 173, 173}, "gray68"}, + {{176, 176, 176}, "gray69"}, + {{18, 18, 18}, "gray7"}, + {{179, 179, 179}, "gray70"}, + {{181, 181, 181}, "gray71"}, + {{184, 184, 184}, "gray72"}, + {{186, 186, 186}, "gray73"}, + {{189, 189, 189}, "gray74"}, + {{191, 191, 191}, "gray75"}, + {{194, 194, 194}, "gray76"}, + {{196, 196, 196}, "gray77"}, + {{199, 199, 199}, "gray78"}, + {{201, 201, 201}, "gray79"}, + {{20, 20, 20}, "gray8"}, + {{204, 204, 204}, "gray80"}, + {{207, 207, 207}, "gray81"}, + {{209, 209, 209}, "gray82"}, + {{212, 212, 212}, "gray83"}, + {{214, 214, 214}, "gray84"}, + {{217, 217, 217}, "gray85"}, + {{219, 219, 219}, "gray86"}, + {{222, 222, 222}, "gray87"}, + {{224, 224, 224}, "gray88"}, + {{227, 227, 227}, "gray89"}, + {{23, 23, 23}, "gray9"}, + {{229, 229, 229}, "gray90"}, + {{232, 232, 232}, "gray91"}, + {{235, 235, 235}, "gray92"}, + {{237, 237, 237}, "gray93"}, + {{240, 240, 240}, "gray94"}, + {{242, 242, 242}, "gray95"}, + {{245, 245, 245}, "gray96"}, + {{247, 247, 247}, "gray97"}, + {{250, 250, 250}, "gray98"}, + {{252, 252, 252}, "gray99"}, + {{0, 255, 0}, "green"}, + {{0, 255, 0}, "green1"}, + {{0, 238, 0}, "green2"}, + {{0, 205, 0}, "green3"}, + {{0, 139, 0}, "green4"}, + {{173, 255, 47}, "greenyellow"}, + {{190, 190, 190}, "grey"}, + {{0, 0, 0}, "grey0"}, + {{3, 3, 3}, "grey1"}, + {{26, 26, 26}, "grey10"}, + {{255, 255, 255}, "grey100"}, + {{28, 28, 28}, "grey11"}, + {{31, 31, 31}, "grey12"}, + {{33, 33, 33}, "grey13"}, + {{36, 36, 36}, "grey14"}, + {{38, 38, 38}, "grey15"}, + {{41, 41, 41}, "grey16"}, + {{43, 43, 43}, "grey17"}, + {{46, 46, 46}, "grey18"}, + {{48, 48, 48}, "grey19"}, + {{5, 5, 5}, "grey2"}, + {{51, 51, 51}, "grey20"}, + {{54, 54, 54}, "grey21"}, + {{56, 56, 56}, "grey22"}, + {{59, 59, 59}, "grey23"}, + {{61, 61, 61}, "grey24"}, + {{64, 64, 64}, "grey25"}, + {{66, 66, 66}, "grey26"}, + {{69, 69, 69}, "grey27"}, + {{71, 71, 71}, "grey28"}, + {{74, 74, 74}, "grey29"}, + {{8, 8, 8}, "grey3"}, + {{77, 77, 77}, "grey30"}, + {{79, 79, 79}, "grey31"}, + {{82, 82, 82}, "grey32"}, + {{84, 84, 84}, "grey33"}, + {{87, 87, 87}, "grey34"}, + {{89, 89, 89}, "grey35"}, + {{92, 92, 92}, "grey36"}, + {{94, 94, 94}, "grey37"}, + {{97, 97, 97}, "grey38"}, + {{99, 99, 99}, "grey39"}, + {{10, 10, 10}, "grey4"}, + {{102, 102, 102}, "grey40"}, + {{105, 105, 105}, "grey41"}, + {{107, 107, 107}, "grey42"}, + {{110, 110, 110}, "grey43"}, + {{112, 112, 112}, "grey44"}, + {{115, 115, 115}, "grey45"}, + {{117, 117, 117}, "grey46"}, + {{120, 120, 120}, "grey47"}, + {{122, 122, 122}, "grey48"}, + {{125, 125, 125}, "grey49"}, + {{13, 13, 13}, "grey5"}, + {{127, 127, 127}, "grey50"}, + {{130, 130, 130}, "grey51"}, + {{133, 133, 133}, "grey52"}, + {{135, 135, 135}, "grey53"}, + {{138, 138, 138}, "grey54"}, + {{140, 140, 140}, "grey55"}, + {{143, 143, 143}, "grey56"}, + {{145, 145, 145}, "grey57"}, + {{148, 148, 148}, "grey58"}, + {{150, 150, 150}, "grey59"}, + {{15, 15, 15}, "grey6"}, + {{153, 153, 153}, "grey60"}, + {{156, 156, 156}, "grey61"}, + {{158, 158, 158}, "grey62"}, + {{161, 161, 161}, "grey63"}, + {{163, 163, 163}, "grey64"}, + {{166, 166, 166}, "grey65"}, + {{168, 168, 168}, "grey66"}, + {{171, 171, 171}, "grey67"}, + {{173, 173, 173}, "grey68"}, + {{176, 176, 176}, "grey69"}, + {{18, 18, 18}, "grey7"}, + {{179, 179, 179}, "grey70"}, + {{181, 181, 181}, "grey71"}, + {{184, 184, 184}, "grey72"}, + {{186, 186, 186}, "grey73"}, + {{189, 189, 189}, "grey74"}, + {{191, 191, 191}, "grey75"}, + {{194, 194, 194}, "grey76"}, + {{196, 196, 196}, "grey77"}, + {{199, 199, 199}, "grey78"}, + {{201, 201, 201}, "grey79"}, + {{20, 20, 20}, "grey8"}, + {{204, 204, 204}, "grey80"}, + {{207, 207, 207}, "grey81"}, + {{209, 209, 209}, "grey82"}, + {{212, 212, 212}, "grey83"}, + {{214, 214, 214}, "grey84"}, + {{217, 217, 217}, "grey85"}, + {{219, 219, 219}, "grey86"}, + {{222, 222, 222}, "grey87"}, + {{224, 224, 224}, "grey88"}, + {{227, 227, 227}, "grey89"}, + {{23, 23, 23}, "grey9"}, + {{229, 229, 229}, "grey90"}, + {{232, 232, 232}, "grey91"}, + {{235, 235, 235}, "grey92"}, + {{237, 237, 237}, "grey93"}, + {{240, 240, 240}, "grey94"}, + {{242, 242, 242}, "grey95"}, + {{245, 245, 245}, "grey96"}, + {{247, 247, 247}, "grey97"}, + {{250, 250, 250}, "grey98"}, + {{252, 252, 252}, "grey99"}, + {{240, 255, 240}, "honeydew"}, + {{240, 255, 240}, "honeydew1"}, + {{224, 238, 224}, "honeydew2"}, + {{193, 205, 193}, "honeydew3"}, + {{131, 139, 131}, "honeydew4"}, + {{255, 105, 180}, "hotpink"}, + {{255, 110, 180}, "hotpink1"}, + {{238, 106, 167}, "hotpink2"}, + {{205, 96, 144}, "hotpink3"}, + {{139, 58, 98}, "hotpink4"}, + {{205, 92, 92}, "indianred"}, + {{255, 106, 106}, "indianred1"}, + {{238, 99, 99}, "indianred2"}, + {{205, 85, 85}, "indianred3"}, + {{139, 58, 58}, "indianred4"}, + {{75, 0, 130}, "indigo"}, + {{255, 255, 240}, "ivory"}, + {{255, 255, 240}, "ivory1"}, + {{238, 238, 224}, "ivory2"}, + {{205, 205, 193}, "ivory3"}, + {{139, 139, 131}, "ivory4"}, + {{240, 230, 140}, "khaki"}, + {{255, 246, 143}, "khaki1"}, + {{238, 230, 133}, "khaki2"}, + {{205, 198, 115}, "khaki3"}, + {{139, 134, 78}, "khaki4"}, + {{230, 230, 250}, "lavender"}, + {{255, 240, 245}, "lavenderblush"}, + {{255, 240, 245}, "lavenderblush1"}, + {{238, 224, 229}, "lavenderblush2"}, + {{205, 193, 197}, "lavenderblush3"}, + {{139, 131, 134}, "lavenderblush4"}, + {{124, 252, 0}, "lawngreen"}, + {{255, 250, 205}, "lemonchiffon"}, + {{255, 250, 205}, "lemonchiffon1"}, + {{238, 233, 191}, "lemonchiffon2"}, + {{205, 201, 165}, "lemonchiffon3"}, + {{139, 137, 112}, "lemonchiffon4"}, + {{173, 216, 230}, "lightblue"}, + {{191, 239, 255}, "lightblue1"}, + {{178, 223, 238}, "lightblue2"}, + {{154, 192, 205}, "lightblue3"}, + {{104, 131, 139}, "lightblue4"}, + {{240, 128, 128}, "lightcoral"}, + {{224, 255, 255}, "lightcyan"}, + {{224, 255, 255}, "lightcyan1"}, + {{209, 238, 238}, "lightcyan2"}, + {{180, 205, 205}, "lightcyan3"}, + {{122, 139, 139}, "lightcyan4"}, + {{238, 221, 130}, "lightgoldenrod"}, + {{255, 236, 139}, "lightgoldenrod1"}, + {{238, 220, 130}, "lightgoldenrod2"}, + {{205, 190, 112}, "lightgoldenrod3"}, + {{139, 129, 76}, "lightgoldenrod4"}, + {{250, 250, 210}, "lightgoldenrodyellow"}, + {{211, 211, 211}, "lightgray"}, + {{144, 238, 144}, "lightgreen"}, + {{211, 211, 211}, "lightgrey"}, + {{255, 182, 193}, "lightpink"}, + {{255, 174, 185}, "lightpink1"}, + {{238, 162, 173}, "lightpink2"}, + {{205, 140, 149}, "lightpink3"}, + {{139, 95, 101}, "lightpink4"}, + {{255, 160, 122}, "lightsalmon"}, + {{255, 160, 122}, "lightsalmon1"}, + {{238, 149, 114}, "lightsalmon2"}, + {{205, 129, 98}, "lightsalmon3"}, + {{139, 87, 66}, "lightsalmon4"}, + {{32, 178, 170}, "lightseagreen"}, + {{135, 206, 250}, "lightskyblue"}, + {{176, 226, 255}, "lightskyblue1"}, + {{164, 211, 238}, "lightskyblue2"}, + {{141, 182, 205}, "lightskyblue3"}, + {{96, 123, 139}, "lightskyblue4"}, + {{132, 112, 255}, "lightslateblue"}, + {{119, 136, 153}, "lightslategray"}, + {{119, 136, 153}, "lightslategrey"}, + {{176, 196, 222}, "lightsteelblue"}, + {{202, 225, 255}, "lightsteelblue1"}, + {{188, 210, 238}, "lightsteelblue2"}, + {{162, 181, 205}, "lightsteelblue3"}, + {{110, 123, 139}, "lightsteelblue4"}, + {{255, 255, 224}, "lightyellow"}, + {{255, 255, 224}, "lightyellow1"}, + {{238, 238, 209}, "lightyellow2"}, + {{205, 205, 180}, "lightyellow3"}, + {{139, 139, 122}, "lightyellow4"}, + {{0, 255, 0}, "lime"}, + {{50, 205, 50}, "limegreen"}, + {{250, 240, 230}, "linen"}, + {{255, 0, 255}, "magenta"}, + {{255, 0, 255}, "magenta1"}, + {{238, 0, 238}, "magenta2"}, + {{205, 0, 205}, "magenta3"}, + {{139, 0, 139}, "magenta4"}, + {{176, 48, 96}, "maroon"}, + {{255, 52, 179}, "maroon1"}, + {{238, 48, 167}, "maroon2"}, + {{205, 41, 144}, "maroon3"}, + {{139, 28, 98}, "maroon4"}, + {{102, 205, 170}, "mediumaquamarine"}, + {{0, 0, 205}, "mediumblue"}, + {{186, 85, 211}, "mediumorchid"}, + {{224, 102, 255}, "mediumorchid1"}, + {{209, 95, 238}, "mediumorchid2"}, + {{180, 82, 205}, "mediumorchid3"}, + {{122, 55, 139}, "mediumorchid4"}, + {{147, 112, 219}, "mediumpurple"}, + {{171, 130, 255}, "mediumpurple1"}, + {{159, 121, 238}, "mediumpurple2"}, + {{137, 104, 205}, "mediumpurple3"}, + {{93, 71, 139}, "mediumpurple4"}, + {{60, 179, 113}, "mediumseagreen"}, + {{123, 104, 238}, "mediumslateblue"}, + {{0, 250, 154}, "mediumspringgreen"}, + {{72, 209, 204}, "mediumturquoise"}, + {{199, 21, 133}, "mediumvioletred"}, + {{25, 25, 112}, "midnightblue"}, + {{245, 255, 250}, "mintcream"}, + {{255, 228, 225}, "mistyrose"}, + {{255, 228, 225}, "mistyrose1"}, + {{238, 213, 210}, "mistyrose2"}, + {{205, 183, 181}, "mistyrose3"}, + {{139, 125, 123}, "mistyrose4"}, + {{255, 228, 181}, "moccasin"}, + {{255, 222, 173}, "navajowhite"}, + {{255, 222, 173}, "navajowhite1"}, + {{238, 207, 161}, "navajowhite2"}, + {{205, 179, 139}, "navajowhite3"}, + {{139, 121, 94}, "navajowhite4"}, + {{0, 0, 128}, "navy"}, + {{0, 0, 128}, "navyblue"}, + {{253, 245, 230}, "oldlace"}, + {{128, 128, 0}, "olive"}, + {{107, 142, 35}, "olivedrab"}, + {{192, 255, 62}, "olivedrab1"}, + {{179, 238, 58}, "olivedrab2"}, + {{154, 205, 50}, "olivedrab3"}, + {{105, 139, 34}, "olivedrab4"}, + {{255, 165, 0}, "orange"}, + {{255, 165, 0}, "orange1"}, + {{238, 154, 0}, "orange2"}, + {{205, 133, 0}, "orange3"}, + {{139, 90, 0}, "orange4"}, + {{255, 69, 0}, "orangered"}, + {{255, 69, 0}, "orangered1"}, + {{238, 64, 0}, "orangered2"}, + {{205, 55, 0}, "orangered3"}, + {{139, 37, 0}, "orangered4"}, + {{218, 112, 214}, "orchid"}, + {{255, 131, 250}, "orchid1"}, + {{238, 122, 233}, "orchid2"}, + {{205, 105, 201}, "orchid3"}, + {{139, 71, 137}, "orchid4"}, + {{238, 232, 170}, "palegoldenrod"}, + {{152, 251, 152}, "palegreen"}, + {{154, 255, 154}, "palegreen1"}, + {{144, 238, 144}, "palegreen2"}, + {{124, 205, 124}, "palegreen3"}, + {{84, 139, 84}, "palegreen4"}, + {{175, 238, 238}, "paleturquoise"}, + {{187, 255, 255}, "paleturquoise1"}, + {{174, 238, 238}, "paleturquoise2"}, + {{150, 205, 205}, "paleturquoise3"}, + {{102, 139, 139}, "paleturquoise4"}, + {{219, 112, 147}, "palevioletred"}, + {{255, 130, 171}, "palevioletred1"}, + {{238, 121, 159}, "palevioletred2"}, + {{205, 104, 137}, "palevioletred3"}, + {{139, 71, 93}, "palevioletred4"}, + {{255, 239, 213}, "papayawhip"}, + {{255, 218, 185}, "peachpuff"}, + {{255, 218, 185}, "peachpuff1"}, + {{238, 203, 173}, "peachpuff2"}, + {{205, 175, 149}, "peachpuff3"}, + {{139, 119, 101}, "peachpuff4"}, + {{205, 133, 63}, "peru"}, + {{255, 192, 203}, "pink"}, + {{255, 181, 197}, "pink1"}, + {{238, 169, 184}, "pink2"}, + {{205, 145, 158}, "pink3"}, + {{139, 99, 108}, "pink4"}, + {{221, 160, 221}, "plum"}, + {{255, 187, 255}, "plum1"}, + {{238, 174, 238}, "plum2"}, + {{205, 150, 205}, "plum3"}, + {{139, 102, 139}, "plum4"}, + {{176, 224, 230}, "powderblue"}, + {{160, 32, 240}, "purple"}, + {{155, 48, 255}, "purple1"}, + {{145, 44, 238}, "purple2"}, + {{125, 38, 205}, "purple3"}, + {{85, 26, 139}, "purple4"}, + {{102, 51, 153}, "rebeccapurple"}, + {{255, 0, 0}, "red"}, + {{255, 0, 0}, "red1"}, + {{238, 0, 0}, "red2"}, + {{205, 0, 0}, "red3"}, + {{139, 0, 0}, "red4"}, + {{188, 143, 143}, "rosybrown"}, + {{255, 193, 193}, "rosybrown1"}, + {{238, 180, 180}, "rosybrown2"}, + {{205, 155, 155}, "rosybrown3"}, + {{139, 105, 105}, "rosybrown4"}, + {{65, 105, 225}, "royalblue"}, + {{72, 118, 255}, "royalblue1"}, + {{67, 110, 238}, "royalblue2"}, + {{58, 95, 205}, "royalblue3"}, + {{39, 64, 139}, "royalblue4"}, + {{139, 69, 19}, "saddlebrown"}, + {{250, 128, 114}, "salmon"}, + {{255, 140, 105}, "salmon1"}, + {{238, 130, 98}, "salmon2"}, + {{205, 112, 84}, "salmon3"}, + {{139, 76, 57}, "salmon4"}, + {{244, 164, 96}, "sandybrown"}, + {{46, 139, 87}, "seagreen"}, + {{84, 255, 159}, "seagreen1"}, + {{78, 238, 148}, "seagreen2"}, + {{67, 205, 128}, "seagreen3"}, + {{46, 139, 87}, "seagreen4"}, + {{255, 245, 238}, "seashell"}, + {{255, 245, 238}, "seashell1"}, + {{238, 229, 222}, "seashell2"}, + {{205, 197, 191}, "seashell3"}, + {{139, 134, 130}, "seashell4"}, + {{160, 82, 45}, "sienna"}, + {{255, 130, 71}, "sienna1"}, + {{238, 121, 66}, "sienna2"}, + {{205, 104, 57}, "sienna3"}, + {{139, 71, 38}, "sienna4"}, + {{192, 192, 192}, "silver"}, + {{135, 206, 235}, "skyblue"}, + {{135, 206, 255}, "skyblue1"}, + {{126, 192, 238}, "skyblue2"}, + {{108, 166, 205}, "skyblue3"}, + {{74, 112, 139}, "skyblue4"}, + {{106, 90, 205}, "slateblue"}, + {{131, 111, 255}, "slateblue1"}, + {{122, 103, 238}, "slateblue2"}, + {{105, 89, 205}, "slateblue3"}, + {{71, 60, 139}, "slateblue4"}, + {{112, 128, 144}, "slategray"}, + {{198, 226, 255}, "slategray1"}, + {{185, 211, 238}, "slategray2"}, + {{159, 182, 205}, "slategray3"}, + {{108, 123, 139}, "slategray4"}, + {{112, 128, 144}, "slategrey"}, + {{255, 250, 250}, "snow"}, + {{255, 250, 250}, "snow1"}, + {{238, 233, 233}, "snow2"}, + {{205, 201, 201}, "snow3"}, + {{139, 137, 137}, "snow4"}, + {{0, 255, 127}, "springgreen"}, + {{0, 255, 127}, "springgreen1"}, + {{0, 238, 118}, "springgreen2"}, + {{0, 205, 102}, "springgreen3"}, + {{0, 139, 69}, "springgreen4"}, + {{70, 130, 180}, "steelblue"}, + {{99, 184, 255}, "steelblue1"}, + {{92, 172, 238}, "steelblue2"}, + {{79, 148, 205}, "steelblue3"}, + {{54, 100, 139}, "steelblue4"}, + {{210, 180, 140}, "tan"}, + {{255, 165, 79}, "tan1"}, + {{238, 154, 73}, "tan2"}, + {{205, 133, 63}, "tan3"}, + {{139, 90, 43}, "tan4"}, + {{0, 128, 128}, "teal"}, + {{216, 191, 216}, "thistle"}, + {{255, 225, 255}, "thistle1"}, + {{238, 210, 238}, "thistle2"}, + {{205, 181, 205}, "thistle3"}, + {{139, 123, 139}, "thistle4"}, + {{255, 99, 71}, "tomato"}, + {{255, 99, 71}, "tomato1"}, + {{238, 92, 66}, "tomato2"}, + {{205, 79, 57}, "tomato3"}, + {{139, 54, 38}, "tomato4"}, + {{64, 224, 208}, "turquoise"}, + {{0, 245, 255}, "turquoise1"}, + {{0, 229, 238}, "turquoise2"}, + {{0, 197, 205}, "turquoise3"}, + {{0, 134, 139}, "turquoise4"}, + {{238, 130, 238}, "violet"}, + {{208, 32, 144}, "violetred"}, + {{255, 62, 150}, "violetred1"}, + {{238, 58, 140}, "violetred2"}, + {{205, 50, 120}, "violetred3"}, + {{139, 34, 82}, "violetred4"}, + {{128, 128, 128}, "webgray"}, + {{0, 128, 0}, "webgreen"}, + {{128, 128, 128}, "webgrey"}, + {{128, 0, 0}, "webmaroon"}, + {{128, 0, 128}, "webpurple"}, + {{245, 222, 179}, "wheat"}, + {{255, 231, 186}, "wheat1"}, + {{238, 216, 174}, "wheat2"}, + {{205, 186, 150}, "wheat3"}, + {{139, 126, 102}, "wheat4"}, + {{255, 255, 255}, "white"}, + {{245, 245, 245}, "whitesmoke"}, + {{190, 190, 190}, "x11gray"}, + {{0, 255, 0}, "x11green"}, + {{190, 190, 190}, "x11grey"}, + {{176, 48, 96}, "x11maroon"}, + {{160, 32, 240}, "x11purple"}, + {{255, 255, 0}, "yellow"}, + {{255, 255, 0}, "yellow1"}, + {{238, 238, 0}, "yellow2"}, + {{205, 205, 0}, "yellow3"}, + {{139, 139, 0}, "yellow4"}, + {{154, 205, 50}, "yellowgreen"}, }; +#ifdef __cplusplus +} +#endif + #endif /* SRC_LIBSERVER_HTML_COLORS_H_ */ diff --git a/src/libserver/html_entities.h b/src/libserver/html_entities.h index 1079f2b0e..d659fc4aa 100644 --- a/src/libserver/html_entities.h +++ b/src/libserver/html_entities.h @@ -17,6 +17,10 @@ #ifndef RSPAMD_HTML_ENTITIES_H #define RSPAMD_HTML_ENTITIES_H +#ifdef __cplusplus +extern "C" { +#endif + struct _entity; typedef struct _entity entity; @@ -27,2131 +31,2135 @@ struct _entity { }; static entity entities_defs[] = { - {"szlig", 223, "\xc3\x9f"}, - {"prime", 8242, "\xe2\x80\xb2"}, - {"lnsim", 8934, "\xe2\x8b\xa6"}, - {"nvDash", 8877, "\xe2\x8a\xad"}, - {"isinsv", 8947, "\xe2\x8b\xb3"}, - {"notin", 8713, "\xe2\x88\x89"}, - {"becaus", 8757, "\xe2\x88\xb5"}, - {"Leftrightarrow", 8660, "\xe2\x87\x94"}, - {"EmptySmallSquare", 9723, "\xe2\x97\xbb"}, - {"SquareUnion", 8852, "\xe2\x8a\x94"}, - {"subdot", 10941, "\xe2\xaa\xbd"}, - {"Dstrok", 272, "\xc4\x90"}, - {"rrarr", 8649, "\xe2\x87\x89"}, - {"rArr", 8658, "\xe2\x87\x92"}, - {"Aacute", 193, "\xc3\x81"}, - {"kappa", 954, "\xce\xba"}, - {"Iopf", 120128, "\xf0\x9d\x95\x80"}, - {"hyphen", 8208, "\xe2\x80\x90"}, - {"rarrbfs", 10528, "\xe2\xa4\xa0"}, - {"supsetneqq", 10956, "\xe2\xab\x8c"}, - {"gacute", 501, "\xc7\xb5"}, - {"VeryThinSpace", 8202, "\xe2\x80\x8a"}, - {"tint", 8749, "\xe2\x88\xad"}, - {"ffr", 120099, "\xf0\x9d\x94\xa3"}, - {"kgreen", 312, "\xc4\xb8"}, - {"nis", 8956, "\xe2\x8b\xbc"}, - {"NotRightTriangleBar", 10704, "\xe2\xa7\x90\xcc\xb8"}, - {"Eogon", 280, "\xc4\x98"}, - {"lbrke", 10635, "\xe2\xa6\x8b"}, - {"phi", 966, "\xcf\x86"}, - {"notnivc", 8957, "\xe2\x8b\xbd"}, - {"utilde", 361, "\xc5\xa9"}, - {"Fopf", 120125, "\xf0\x9d\x94\xbd"}, - {"Vcy", 1042, "\xd0\x92"}, - {"erDot", 8787, "\xe2\x89\x93"}, - {"nsubE", 10949, "\xe2\xab\x85\xcc\xb8"}, - {"egrave", 232, "\xc3\xa8"}, - {"Lcedil", 315, "\xc4\xbb"}, - {"lharul", 10602, "\xe2\xa5\xaa"}, - {"middot", 183, "\xc2\xb7"}, - {"ggg", 8921, "\xe2\x8b\x99"}, - {"NestedLessLess", 8810, "\xe2\x89\xaa"}, - {"tau", 964, "\xcf\x84"}, - {"setmn", 8726, "\xe2\x88\x96"}, - {"frac78", 8542, "\xe2\x85\x9e"}, - {"para", 182, "\xc2\xb6"}, - {"Rcedil", 342, "\xc5\x96"}, - {"propto", 8733, "\xe2\x88\x9d"}, - {"sqsubset", 8847, "\xe2\x8a\x8f"}, - {"ensp", 8194, "\xe2\x80\x82"}, - {"boxvH", 9578, "\xe2\x95\xaa"}, - {"NotGreaterTilde", 8821, "\xe2\x89\xb5"}, - {"ffllig", 64260, "\xef\xac\x84"}, - {"kcedil", 311, "\xc4\xb7"}, - {"omega", 969, "\xcf\x89"}, - {"sime", 8771, "\xe2\x89\x83"}, - {"LeftTriangleEqual", 8884, "\xe2\x8a\xb4"}, - {"bsemi", 8271, "\xe2\x81\x8f"}, - {"rdquor", 8221, "\xe2\x80\x9d"}, - {"Utilde", 360, "\xc5\xa8"}, - {"bsol", 92, "\x5c"}, - {"risingdotseq", 8787, "\xe2\x89\x93"}, - {"ultri", 9720, "\xe2\x97\xb8"}, - {"rhov", 1009, "\xcf\xb1"}, - {"TildeEqual", 8771, "\xe2\x89\x83"}, - {"jukcy", 1108, "\xd1\x94"}, - {"perp", 8869, "\xe2\x8a\xa5"}, - {"capbrcup", 10825, "\xe2\xa9\x89"}, - {"ltrie", 8884, "\xe2\x8a\xb4"}, - {"LessTilde", 8818, "\xe2\x89\xb2"}, - {"popf", 120161, "\xf0\x9d\x95\xa1"}, - {"dbkarow", 10511, "\xe2\xa4\x8f"}, - {"roang", 10221, "\xe2\x9f\xad"}, - {"brvbar", 166, "\xc2\xa6"}, - {"CenterDot", 183, "\xc2\xb7"}, - {"notindot", 8949, "\xe2\x8b\xb5\xcc\xb8"}, - {"supmult", 10946, "\xe2\xab\x82"}, - {"multimap", 8888, "\xe2\x8a\xb8"}, - {"frac34", 190, "\xc2\xbe"}, - {"mapsto", 8614, "\xe2\x86\xa6"}, - {"flat", 9837, "\xe2\x99\xad"}, - {"updownarrow", 8597, "\xe2\x86\x95"}, - {"gne", 10888, "\xe2\xaa\x88"}, - {"nrarrc", 10547, "\xe2\xa4\xb3\xcc\xb8"}, - {"suphsol", 10185, "\xe2\x9f\x89"}, - {"nGtv", 8811, "\xe2\x89\xab\xcc\xb8"}, - {"hopf", 120153, "\xf0\x9d\x95\x99"}, - {"pointint", 10773, "\xe2\xa8\x95"}, - {"glj", 10916, "\xe2\xaa\xa4"}, - {"LeftDoubleBracket", 10214, "\xe2\x9f\xa6"}, - {"NotSupersetEqual", 8841, "\xe2\x8a\x89"}, - {"dot", 729, "\xcb\x99"}, - {"tbrk", 9140, "\xe2\x8e\xb4"}, - {"LeftUpDownVector", 10577, "\xe2\xa5\x91"}, - {"uml", 168, "\xc2\xa8"}, - {"bbrk", 9141, "\xe2\x8e\xb5"}, - {"nearrow", 8599, "\xe2\x86\x97"}, - {"backsimeq", 8909, "\xe2\x8b\x8d"}, - {"dblac", 733, "\xcb\x9d"}, - {"circleddash", 8861, "\xe2\x8a\x9d"}, - {"ldsh", 8626, "\xe2\x86\xb2"}, - {"sce", 10928, "\xe2\xaa\xb0"}, - {"angst", 197, "\xc3\x85"}, - {"yen", 165, "\xc2\xa5"}, - {"nsupE", 10950, "\xe2\xab\x86\xcc\xb8"}, - {"Uscr", 119984, "\xf0\x9d\x92\xb0"}, - {"subplus", 10943, "\xe2\xaa\xbf"}, - {"nleqq", 8806, "\xe2\x89\xa6\xcc\xb8"}, - {"nprcue", 8928, "\xe2\x8b\xa0"}, - {"Ocirc", 212, "\xc3\x94"}, - {"disin", 8946, "\xe2\x8b\xb2"}, - {"EqualTilde", 8770, "\xe2\x89\x82"}, - {"YUcy", 1070, "\xd0\xae"}, - {"Kscr", 119974, "\xf0\x9d\x92\xa6"}, - {"lg", 8822, "\xe2\x89\xb6"}, - {"nLeftrightarrow", 8654, "\xe2\x87\x8e"}, - {"eplus", 10865, "\xe2\xa9\xb1"}, - {"les", 10877, "\xe2\xa9\xbd"}, - {"sfr", 120112, "\xf0\x9d\x94\xb0"}, - {"HumpDownHump", 8782, "\xe2\x89\x8e"}, - {"Fouriertrf", 8497, "\xe2\x84\xb1"}, - {"Updownarrow", 8661, "\xe2\x87\x95"}, - {"nrarr", 8603, "\xe2\x86\x9b"}, - {"radic", 8730, "\xe2\x88\x9a"}, - {"gnap", 10890, "\xe2\xaa\x8a"}, - {"zeta", 950, "\xce\xb6"}, - {"Qscr", 119980, "\xf0\x9d\x92\xac"}, - {"NotRightTriangleEqual", 8941, "\xe2\x8b\xad"}, - {"nshortmid", 8740, "\xe2\x88\xa4"}, - {"SHCHcy", 1065, "\xd0\xa9"}, - {"piv", 982, "\xcf\x96"}, - {"angmsdaa", 10664, "\xe2\xa6\xa8"}, - {"curlywedge", 8911, "\xe2\x8b\x8f"}, - {"sqcaps", 8851, "\xe2\x8a\x93\xef\xb8\x80"}, - {"sum", 8721, "\xe2\x88\x91"}, - {"rarrtl", 8611, "\xe2\x86\xa3"}, - {"gescc", 10921, "\xe2\xaa\xa9"}, - {"sup", 8835, "\xe2\x8a\x83"}, - {"smid", 8739, "\xe2\x88\xa3"}, - {"cularr", 8630, "\xe2\x86\xb6"}, - {"olcross", 10683, "\xe2\xa6\xbb"}, - {"GT", 62, "\x3e"}, - {"scap", 10936, "\xe2\xaa\xb8"}, - {"capcup", 10823, "\xe2\xa9\x87"}, - {"NotSquareSubsetEqual", 8930, "\xe2\x8b\xa2"}, - {"uhblk", 9600, "\xe2\x96\x80"}, - {"latail", 10521, "\xe2\xa4\x99"}, - {"smtes", 10924, "\xe2\xaa\xac\xef\xb8\x80"}, - {"RoundImplies", 10608, "\xe2\xa5\xb0"}, - {"wreath", 8768, "\xe2\x89\x80"}, - {"curlyvee", 8910, "\xe2\x8b\x8e"}, - {"uscr", 120010, "\xf0\x9d\x93\x8a"}, - {"nleftrightarrow", 8622, "\xe2\x86\xae"}, - {"ucy", 1091, "\xd1\x83"}, - {"nvge", 8805, "\xe2\x89\xa5\xe2\x83\x92"}, - {"bnot", 8976, "\xe2\x8c\x90"}, - {"alefsym", 8501, "\xe2\x84\xb5"}, - {"star", 9734, "\xe2\x98\x86"}, - {"boxHd", 9572, "\xe2\x95\xa4"}, - {"vsubnE", 10955, "\xe2\xab\x8b\xef\xb8\x80"}, - {"Popf", 8473, "\xe2\x84\x99"}, - {"simgE", 10912, "\xe2\xaa\xa0"}, - {"upsilon", 965, "\xcf\x85"}, - {"NoBreak", 8288, "\xe2\x81\xa0"}, - {"realine", 8475, "\xe2\x84\x9b"}, - {"frac38", 8540, "\xe2\x85\x9c"}, - {"YAcy", 1071, "\xd0\xaf"}, - {"bnequiv", 8801, "\xe2\x89\xa1\xe2\x83\xa5"}, - {"cudarrr", 10549, "\xe2\xa4\xb5"}, - {"lsime", 10893, "\xe2\xaa\x8d"}, - {"lowbar", 95, "\x5f"}, - {"utdot", 8944, "\xe2\x8b\xb0"}, - {"ReverseElement", 8715, "\xe2\x88\x8b"}, - {"nshortparallel", 8742, "\xe2\x88\xa6"}, - {"DJcy", 1026, "\xd0\x82"}, - {"nsube", 8840, "\xe2\x8a\x88"}, - {"VDash", 8875, "\xe2\x8a\xab"}, - {"Ncaron", 327, "\xc5\x87"}, - {"LeftUpVector", 8639, "\xe2\x86\xbf"}, - {"Kcy", 1050, "\xd0\x9a"}, - {"NotLeftTriangleEqual", 8940, "\xe2\x8b\xac"}, - {"nvHarr", 10500, "\xe2\xa4\x84"}, - {"lotimes", 10804, "\xe2\xa8\xb4"}, - {"RightFloor", 8971, "\xe2\x8c\x8b"}, - {"succ", 8827, "\xe2\x89\xbb"}, - {"Ucy", 1059, "\xd0\xa3"}, - {"darr", 8595, "\xe2\x86\x93"}, - {"lbarr", 10508, "\xe2\xa4\x8c"}, - {"xfr", 120117, "\xf0\x9d\x94\xb5"}, - {"zopf", 120171, "\xf0\x9d\x95\xab"}, - {"Phi", 934, "\xce\xa6"}, - {"ord", 10845, "\xe2\xa9\x9d"}, - {"iinfin", 10716, "\xe2\xa7\x9c"}, - {"Xfr", 120091, "\xf0\x9d\x94\x9b"}, - {"qint", 10764, "\xe2\xa8\x8c"}, - {"Upsilon", 933, "\xce\xa5"}, - {"NotSubset", 8834, "\xe2\x8a\x82\xe2\x83\x92"}, - {"gfr", 120100, "\xf0\x9d\x94\xa4"}, - {"notnivb", 8958, "\xe2\x8b\xbe"}, - {"Afr", 120068, "\xf0\x9d\x94\x84"}, - {"ge", 8805, "\xe2\x89\xa5"}, - {"iexcl", 161, "\xc2\xa1"}, - {"dfr", 120097, "\xf0\x9d\x94\xa1"}, - {"rsaquo", 8250, "\xe2\x80\xba"}, - {"xcap", 8898, "\xe2\x8b\x82"}, - {"Jopf", 120129, "\xf0\x9d\x95\x81"}, - {"Hstrok", 294, "\xc4\xa6"}, - {"ldca", 10550, "\xe2\xa4\xb6"}, - {"lmoust", 9136, "\xe2\x8e\xb0"}, - {"wcirc", 373, "\xc5\xb5"}, - {"DownRightVector", 8641, "\xe2\x87\x81"}, - {"LessFullEqual", 8806, "\xe2\x89\xa6"}, - {"dotsquare", 8865, "\xe2\x8a\xa1"}, - {"zhcy", 1078, "\xd0\xb6"}, - {"mDDot", 8762, "\xe2\x88\xba"}, - {"Prime", 8243, "\xe2\x80\xb3"}, - {"prec", 8826, "\xe2\x89\xba"}, - {"swnwar", 10538, "\xe2\xa4\xaa"}, - {"COPY", 169, "\xc2\xa9"}, - {"cong", 8773, "\xe2\x89\x85"}, - {"sacute", 347, "\xc5\x9b"}, - {"Nopf", 8469, "\xe2\x84\x95"}, - {"it", 8290, "\xe2\x81\xa2"}, - {"SOFTcy", 1068, "\xd0\xac"}, - {"uuarr", 8648, "\xe2\x87\x88"}, - {"iota", 953, "\xce\xb9"}, - {"notinE", 8953, "\xe2\x8b\xb9\xcc\xb8"}, - {"jfr", 120103, "\xf0\x9d\x94\xa7"}, - {"QUOT", 34, "\x22"}, - {"vsupnE", 10956, "\xe2\xab\x8c\xef\xb8\x80"}, - {"igrave", 236, "\xc3\xac"}, - {"bsim", 8765, "\xe2\x88\xbd"}, - {"npreceq", 10927, "\xe2\xaa\xaf\xcc\xb8"}, - {"zcaron", 382, "\xc5\xbe"}, - {"DD", 8517, "\xe2\x85\x85"}, - {"gamma", 947, "\xce\xb3"}, - {"homtht", 8763, "\xe2\x88\xbb"}, - {"NonBreakingSpace", 160, "\xc2\xa0"}, - {"Proportion", 8759, "\xe2\x88\xb7"}, - {"nedot", 8784, "\xe2\x89\x90\xcc\xb8"}, - {"nabla", 8711, "\xe2\x88\x87"}, - {"ac", 8766, "\xe2\x88\xbe"}, - {"nsupe", 8841, "\xe2\x8a\x89"}, - {"ell", 8467, "\xe2\x84\x93"}, - {"boxvR", 9566, "\xe2\x95\x9e"}, - {"LowerRightArrow", 8600, "\xe2\x86\x98"}, - {"boxHu", 9575, "\xe2\x95\xa7"}, - {"lE", 8806, "\xe2\x89\xa6"}, - {"dzigrarr", 10239, "\xe2\x9f\xbf"}, - {"rfloor", 8971, "\xe2\x8c\x8b"}, - {"gneq", 10888, "\xe2\xaa\x88"}, - {"rightleftharpoons", 8652, "\xe2\x87\x8c"}, - {"gtquest", 10876, "\xe2\xa9\xbc"}, - {"searhk", 10533, "\xe2\xa4\xa5"}, - {"gesdoto", 10882, "\xe2\xaa\x82"}, - {"cross", 10007, "\xe2\x9c\x97"}, - {"rdquo", 8221, "\xe2\x80\x9d"}, - {"sqsupset", 8848, "\xe2\x8a\x90"}, - {"divonx", 8903, "\xe2\x8b\x87"}, - {"lat", 10923, "\xe2\xaa\xab"}, - {"rmoustache", 9137, "\xe2\x8e\xb1"}, - {"succapprox", 10936, "\xe2\xaa\xb8"}, - {"nhpar", 10994, "\xe2\xab\xb2"}, - {"sharp", 9839, "\xe2\x99\xaf"}, - {"lrcorner", 8991, "\xe2\x8c\x9f"}, - {"Vscr", 119985, "\xf0\x9d\x92\xb1"}, - {"varsigma", 962, "\xcf\x82"}, - {"bsolb", 10693, "\xe2\xa7\x85"}, - {"cupcap", 10822, "\xe2\xa9\x86"}, - {"leftrightarrow", 8596, "\xe2\x86\x94"}, - {"LeftTee", 8867, "\xe2\x8a\xa3"}, - {"Sqrt", 8730, "\xe2\x88\x9a"}, - {"Odblac", 336, "\xc5\x90"}, - {"ocir", 8858, "\xe2\x8a\x9a"}, - {"eqslantless", 10901, "\xe2\xaa\x95"}, - {"supedot", 10948, "\xe2\xab\x84"}, - {"intercal", 8890, "\xe2\x8a\xba"}, - {"Gbreve", 286, "\xc4\x9e"}, - {"xrArr", 10233, "\xe2\x9f\xb9"}, - {"NotTildeEqual", 8772, "\xe2\x89\x84"}, - {"Bfr", 120069, "\xf0\x9d\x94\x85"}, - {"Iuml", 207, "\xc3\x8f"}, - {"leg", 8922, "\xe2\x8b\x9a"}, - {"boxhU", 9576, "\xe2\x95\xa8"}, - {"Gopf", 120126, "\xf0\x9d\x94\xbe"}, - {"af", 8289, "\xe2\x81\xa1"}, - {"xwedge", 8896, "\xe2\x8b\x80"}, - {"precapprox", 10935, "\xe2\xaa\xb7"}, - {"lcedil", 316, "\xc4\xbc"}, - {"between", 8812, "\xe2\x89\xac"}, - {"Oslash", 216, "\xc3\x98"}, - {"breve", 728, "\xcb\x98"}, - {"caps", 8745, "\xe2\x88\xa9\xef\xb8\x80"}, - {"vangrt", 10652, "\xe2\xa6\x9c"}, - {"lagran", 8466, "\xe2\x84\x92"}, - {"kopf", 120156, "\xf0\x9d\x95\x9c"}, - {"ReverseUpEquilibrium", 10607, "\xe2\xa5\xaf"}, - {"nlsim", 8820, "\xe2\x89\xb4"}, - {"Cap", 8914, "\xe2\x8b\x92"}, - {"angmsdac", 10666, "\xe2\xa6\xaa"}, - {"iocy", 1105, "\xd1\x91"}, - {"seswar", 10537, "\xe2\xa4\xa9"}, - {"dzcy", 1119, "\xd1\x9f"}, - {"nsubset", 8834, "\xe2\x8a\x82\xe2\x83\x92"}, - {"cup", 8746, "\xe2\x88\xaa"}, - {"npar", 8742, "\xe2\x88\xa6"}, - {"late", 10925, "\xe2\xaa\xad"}, - {"plussim", 10790, "\xe2\xa8\xa6"}, - {"Darr", 8609, "\xe2\x86\xa1"}, - {"nexist", 8708, "\xe2\x88\x84"}, - {"cent", 162, "\xc2\xa2"}, - {"khcy", 1093, "\xd1\x85"}, - {"smallsetminus", 8726, "\xe2\x88\x96"}, - {"ycirc", 375, "\xc5\xb7"}, - {"lharu", 8636, "\xe2\x86\xbc"}, - {"upuparrows", 8648, "\xe2\x87\x88"}, - {"sigmaf", 962, "\xcf\x82"}, - {"nltri", 8938, "\xe2\x8b\xaa"}, - {"mstpos", 8766, "\xe2\x88\xbe"}, - {"Zopf", 8484, "\xe2\x84\xa4"}, - {"dwangle", 10662, "\xe2\xa6\xa6"}, - {"bowtie", 8904, "\xe2\x8b\x88"}, - {"Dfr", 120071, "\xf0\x9d\x94\x87"}, - {"iacute", 237, "\xc3\xad"}, - {"njcy", 1114, "\xd1\x9a"}, - {"cfr", 120096, "\xf0\x9d\x94\xa0"}, - {"TripleDot", 8411, "\xe2\x83\x9b"}, - {"Or", 10836, "\xe2\xa9\x94"}, - {"blk34", 9619, "\xe2\x96\x93"}, - {"equiv", 8801, "\xe2\x89\xa1"}, - {"fflig", 64256, "\xef\xac\x80"}, - {"Rang", 10219, "\xe2\x9f\xab"}, - {"Wopf", 120142, "\xf0\x9d\x95\x8e"}, - {"boxUl", 9564, "\xe2\x95\x9c"}, - {"frac12", 189, "\xc2\xbd"}, - {"clubs", 9827, "\xe2\x99\xa3"}, - {"amalg", 10815, "\xe2\xa8\xbf"}, - {"Lang", 10218, "\xe2\x9f\xaa"}, - {"asymp", 8776, "\xe2\x89\x88"}, - {"models", 8871, "\xe2\x8a\xa7"}, - {"emptyset", 8709, "\xe2\x88\x85"}, - {"Tscr", 119983, "\xf0\x9d\x92\xaf"}, - {"nleftarrow", 8602, "\xe2\x86\x9a"}, - {"Omacr", 332, "\xc5\x8c"}, - {"gtrarr", 10616, "\xe2\xa5\xb8"}, - {"excl", 33, "\x21"}, - {"rarrw", 8605, "\xe2\x86\x9d"}, - {"abreve", 259, "\xc4\x83"}, - {"CircleTimes", 8855, "\xe2\x8a\x97"}, - {"aopf", 120146, "\xf0\x9d\x95\x92"}, - {"eqvparsl", 10725, "\xe2\xa7\xa5"}, - {"boxv", 9474, "\xe2\x94\x82"}, - {"SuchThat", 8715, "\xe2\x88\x8b"}, - {"varphi", 981, "\xcf\x95"}, - {"Ropf", 8477, "\xe2\x84\x9d"}, - {"rscr", 120007, "\xf0\x9d\x93\x87"}, - {"Rrightarrow", 8667, "\xe2\x87\x9b"}, - {"equest", 8799, "\xe2\x89\x9f"}, - {"ntilde", 241, "\xc3\xb1"}, - {"Escr", 8496, "\xe2\x84\xb0"}, - {"Lopf", 120131, "\xf0\x9d\x95\x83"}, - {"GreaterGreater", 10914, "\xe2\xaa\xa2"}, - {"pluscir", 10786, "\xe2\xa8\xa2"}, - {"nsupset", 8835, "\xe2\x8a\x83\xe2\x83\x92"}, - {"uArr", 8657, "\xe2\x87\x91"}, - {"nwarhk", 10531, "\xe2\xa4\xa3"}, - {"Ycirc", 374, "\xc5\xb6"}, - {"tdot", 8411, "\xe2\x83\x9b"}, - {"circledS", 9416, "\xe2\x93\x88"}, - {"lhard", 8637, "\xe2\x86\xbd"}, - {"iukcy", 1110, "\xd1\x96"}, - {"PrecedesSlantEqual", 8828, "\xe2\x89\xbc"}, - {"Sfr", 120086, "\xf0\x9d\x94\x96"}, - {"egs", 10902, "\xe2\xaa\x96"}, - {"oelig", 339, "\xc5\x93"}, - {"bigtriangledown", 9661, "\xe2\x96\xbd"}, - {"EmptyVerySmallSquare", 9643, "\xe2\x96\xab"}, - {"Backslash", 8726, "\xe2\x88\x96"}, - {"nscr", 120003, "\xf0\x9d\x93\x83"}, - {"uogon", 371, "\xc5\xb3"}, - {"circeq", 8791, "\xe2\x89\x97"}, - {"check", 10003, "\xe2\x9c\x93"}, - {"Sup", 8913, "\xe2\x8b\x91"}, - {"Rcaron", 344, "\xc5\x98"}, - {"lneqq", 8808, "\xe2\x89\xa8"}, - {"lrhar", 8651, "\xe2\x87\x8b"}, - {"ulcorn", 8988, "\xe2\x8c\x9c"}, - {"timesd", 10800, "\xe2\xa8\xb0"}, - {"Sum", 8721, "\xe2\x88\x91"}, - {"varpropto", 8733, "\xe2\x88\x9d"}, - {"Lcaron", 317, "\xc4\xbd"}, - {"lbrkslu", 10637, "\xe2\xa6\x8d"}, - {"AElig", 198, "\xc3\x86"}, - {"varr", 8597, "\xe2\x86\x95"}, - {"nvinfin", 10718, "\xe2\xa7\x9e"}, - {"leq", 8804, "\xe2\x89\xa4"}, - {"biguplus", 10756, "\xe2\xa8\x84"}, - {"rpar", 41, "\x29"}, - {"eng", 331, "\xc5\x8b"}, - {"NegativeThinSpace", 8203, "\xe2\x80\x8b"}, - {"lesssim", 8818, "\xe2\x89\xb2"}, - {"lBarr", 10510, "\xe2\xa4\x8e"}, - {"LeftUpTeeVector", 10592, "\xe2\xa5\xa0"}, - {"gnE", 8809, "\xe2\x89\xa9"}, - {"efr", 120098, "\xf0\x9d\x94\xa2"}, - {"barvee", 8893, "\xe2\x8a\xbd"}, - {"ee", 8519, "\xe2\x85\x87"}, - {"Uogon", 370, "\xc5\xb2"}, - {"gnapprox", 10890, "\xe2\xaa\x8a"}, - {"olcir", 10686, "\xe2\xa6\xbe"}, - {"boxUL", 9565, "\xe2\x95\x9d"}, - {"Gg", 8921, "\xe2\x8b\x99"}, - {"CloseCurlyQuote", 8217, "\xe2\x80\x99"}, - {"leftharpoondown", 8637, "\xe2\x86\xbd"}, - {"vfr", 120115, "\xf0\x9d\x94\xb3"}, - {"gvertneqq", 8809, "\xe2\x89\xa9\xef\xb8\x80"}, - {"ouml", 246, "\xc3\xb6"}, - {"raemptyv", 10675, "\xe2\xa6\xb3"}, - {"Zcaron", 381, "\xc5\xbd"}, - {"scE", 10932, "\xe2\xaa\xb4"}, - {"boxvh", 9532, "\xe2\x94\xbc"}, - {"ominus", 8854, "\xe2\x8a\x96"}, - {"oopf", 120160, "\xf0\x9d\x95\xa0"}, - {"nsucceq", 10928, "\xe2\xaa\xb0\xcc\xb8"}, - {"RBarr", 10512, "\xe2\xa4\x90"}, - {"iprod", 10812, "\xe2\xa8\xbc"}, - {"lvnE", 8808, "\xe2\x89\xa8\xef\xb8\x80"}, - {"andand", 10837, "\xe2\xa9\x95"}, - {"upharpoonright", 8638, "\xe2\x86\xbe"}, - {"ncongdot", 10861, "\xe2\xa9\xad\xcc\xb8"}, - {"drcrop", 8972, "\xe2\x8c\x8c"}, - {"nsimeq", 8772, "\xe2\x89\x84"}, - {"subsub", 10965, "\xe2\xab\x95"}, - {"hardcy", 1098, "\xd1\x8a"}, - {"leqslant", 10877, "\xe2\xa9\xbd"}, - {"uharl", 8639, "\xe2\x86\xbf"}, - {"expectation", 8496, "\xe2\x84\xb0"}, - {"mdash", 8212, "\xe2\x80\x94"}, - {"VerticalTilde", 8768, "\xe2\x89\x80"}, - {"rdldhar", 10601, "\xe2\xa5\xa9"}, - {"leftharpoonup", 8636, "\xe2\x86\xbc"}, - {"mu", 956, "\xce\xbc"}, - {"curarrm", 10556, "\xe2\xa4\xbc"}, - {"Cdot", 266, "\xc4\x8a"}, - {"NotTildeTilde", 8777, "\xe2\x89\x89"}, - {"boxul", 9496, "\xe2\x94\x98"}, - {"planckh", 8462, "\xe2\x84\x8e"}, - {"CapitalDifferentialD", 8517, "\xe2\x85\x85"}, - {"boxDL", 9559, "\xe2\x95\x97"}, - {"cupbrcap", 10824, "\xe2\xa9\x88"}, - {"boxdL", 9557, "\xe2\x95\x95"}, - {"supe", 8839, "\xe2\x8a\x87"}, - {"nvlt", 60, "\x3c\xe2\x83\x92"}, - {"par", 8741, "\xe2\x88\xa5"}, - {"InvisibleComma", 8291, "\xe2\x81\xa3"}, - {"ring", 730, "\xcb\x9a"}, - {"nvap", 8781, "\xe2\x89\x8d\xe2\x83\x92"}, - {"veeeq", 8794, "\xe2\x89\x9a"}, - {"Hfr", 8460, "\xe2\x84\x8c"}, - {"dstrok", 273, "\xc4\x91"}, - {"gesles", 10900, "\xe2\xaa\x94"}, - {"dash", 8208, "\xe2\x80\x90"}, - {"SHcy", 1064, "\xd0\xa8"}, - {"congdot", 10861, "\xe2\xa9\xad"}, - {"imagline", 8464, "\xe2\x84\x90"}, - {"ncy", 1085, "\xd0\xbd"}, - {"bigstar", 9733, "\xe2\x98\x85"}, - {"REG", 174, "\xc2\xae"}, - {"triangleq", 8796, "\xe2\x89\x9c"}, - {"rsqb", 93, "\x5d"}, - {"ddarr", 8650, "\xe2\x87\x8a"}, - {"csub", 10959, "\xe2\xab\x8f"}, - {"quest", 63, "\x3f"}, - {"Star", 8902, "\xe2\x8b\x86"}, - {"LT", 60, "\x3c"}, - {"ncong", 8775, "\xe2\x89\x87"}, - {"prnE", 10933, "\xe2\xaa\xb5"}, - {"bigtriangleup", 9651, "\xe2\x96\xb3"}, - {"Tilde", 8764, "\xe2\x88\xbc"}, - {"ltrif", 9666, "\xe2\x97\x82"}, - {"ldrdhar", 10599, "\xe2\xa5\xa7"}, - {"lcaron", 318, "\xc4\xbe"}, - {"equivDD", 10872, "\xe2\xa9\xb8"}, - {"lHar", 10594, "\xe2\xa5\xa2"}, - {"vBar", 10984, "\xe2\xab\xa8"}, - {"Mopf", 120132, "\xf0\x9d\x95\x84"}, - {"LeftArrow", 8592, "\xe2\x86\x90"}, - {"Rho", 929, "\xce\xa1"}, - {"Ccirc", 264, "\xc4\x88"}, - {"ifr", 120102, "\xf0\x9d\x94\xa6"}, - {"cacute", 263, "\xc4\x87"}, - {"centerdot", 183, "\xc2\xb7"}, - {"dollar", 36, "\x24"}, - {"lang", 10216, "\xe2\x9f\xa8"}, - {"curvearrowright", 8631, "\xe2\x86\xb7"}, - {"half", 189, "\xc2\xbd"}, - {"Ecy", 1069, "\xd0\xad"}, - {"rcub", 125, "\x7d"}, - {"rcy", 1088, "\xd1\x80"}, - {"isins", 8948, "\xe2\x8b\xb4"}, - {"bsolhsub", 10184, "\xe2\x9f\x88"}, - {"boxuL", 9563, "\xe2\x95\x9b"}, - {"shchcy", 1097, "\xd1\x89"}, - {"cwconint", 8754, "\xe2\x88\xb2"}, - {"euro", 8364, "\xe2\x82\xac"}, - {"lesseqqgtr", 10891, "\xe2\xaa\x8b"}, - {"sim", 8764, "\xe2\x88\xbc"}, - {"rarrc", 10547, "\xe2\xa4\xb3"}, - {"boxdl", 9488, "\xe2\x94\x90"}, - {"Epsilon", 917, "\xce\x95"}, - {"iiiint", 10764, "\xe2\xa8\x8c"}, - {"Rightarrow", 8658, "\xe2\x87\x92"}, - {"conint", 8750, "\xe2\x88\xae"}, - {"boxDl", 9558, "\xe2\x95\x96"}, - {"kappav", 1008, "\xcf\xb0"}, - {"profsurf", 8979, "\xe2\x8c\x93"}, - {"auml", 228, "\xc3\xa4"}, - {"heartsuit", 9829, "\xe2\x99\xa5"}, - {"eacute", 233, "\xc3\xa9"}, - {"gt", 62, "\x3e"}, - {"Gcedil", 290, "\xc4\xa2"}, - {"easter", 10862, "\xe2\xa9\xae"}, - {"Tcy", 1058, "\xd0\xa2"}, - {"swarrow", 8601, "\xe2\x86\x99"}, - {"lopf", 120157, "\xf0\x9d\x95\x9d"}, - {"Agrave", 192, "\xc3\x80"}, - {"Aring", 197, "\xc3\x85"}, - {"fpartint", 10765, "\xe2\xa8\x8d"}, - {"xoplus", 10753, "\xe2\xa8\x81"}, - {"LeftDownTeeVector", 10593, "\xe2\xa5\xa1"}, - {"int", 8747, "\xe2\x88\xab"}, - {"Zeta", 918, "\xce\x96"}, - {"loz", 9674, "\xe2\x97\x8a"}, - {"ncup", 10818, "\xe2\xa9\x82"}, - {"napE", 10864, "\xe2\xa9\xb0\xcc\xb8"}, - {"csup", 10960, "\xe2\xab\x90"}, - {"Ncedil", 325, "\xc5\x85"}, - {"cuwed", 8911, "\xe2\x8b\x8f"}, - {"Dot", 168, "\xc2\xa8"}, - {"SquareIntersection", 8851, "\xe2\x8a\x93"}, - {"map", 8614, "\xe2\x86\xa6"}, - {"aelig", 230, "\xc3\xa6"}, - {"RightArrow", 8594, "\xe2\x86\x92"}, - {"rightharpoondown", 8641, "\xe2\x87\x81"}, - {"bNot", 10989, "\xe2\xab\xad"}, - {"nsccue", 8929, "\xe2\x8b\xa1"}, - {"zigrarr", 8669, "\xe2\x87\x9d"}, - {"Sacute", 346, "\xc5\x9a"}, - {"orv", 10843, "\xe2\xa9\x9b"}, - {"RightVectorBar", 10579, "\xe2\xa5\x93"}, - {"nrarrw", 8605, "\xe2\x86\x9d\xcc\xb8"}, - {"nbump", 8782, "\xe2\x89\x8e\xcc\xb8"}, - {"iquest", 191, "\xc2\xbf"}, - {"wr", 8768, "\xe2\x89\x80"}, - {"UpArrow", 8593, "\xe2\x86\x91"}, - {"notinva", 8713, "\xe2\x88\x89"}, - {"ddagger", 8225, "\xe2\x80\xa1"}, - {"nLeftarrow", 8653, "\xe2\x87\x8d"}, - {"rbbrk", 10099, "\xe2\x9d\xb3"}, - {"RightTriangle", 8883, "\xe2\x8a\xb3"}, - {"leqq", 8806, "\xe2\x89\xa6"}, - {"Vert", 8214, "\xe2\x80\x96"}, - {"gesl", 8923, "\xe2\x8b\x9b\xef\xb8\x80"}, - {"LeftTeeVector", 10586, "\xe2\xa5\x9a"}, - {"Union", 8899, "\xe2\x8b\x83"}, - {"sc", 8827, "\xe2\x89\xbb"}, - {"ofr", 120108, "\xf0\x9d\x94\xac"}, - {"quatint", 10774, "\xe2\xa8\x96"}, - {"apacir", 10863, "\xe2\xa9\xaf"}, - {"profalar", 9006, "\xe2\x8c\xae"}, - {"subsetneq", 8842, "\xe2\x8a\x8a"}, - {"Vvdash", 8874, "\xe2\x8a\xaa"}, - {"ohbar", 10677, "\xe2\xa6\xb5"}, - {"Gt", 8811, "\xe2\x89\xab"}, - {"exist", 8707, "\xe2\x88\x83"}, - {"gtrapprox", 10886, "\xe2\xaa\x86"}, - {"euml", 235, "\xc3\xab"}, - {"Equilibrium", 8652, "\xe2\x87\x8c"}, - {"aacute", 225, "\xc3\xa1"}, - {"omid", 10678, "\xe2\xa6\xb6"}, - {"loarr", 8701, "\xe2\x87\xbd"}, - {"SucceedsSlantEqual", 8829, "\xe2\x89\xbd"}, - {"angsph", 8738, "\xe2\x88\xa2"}, - {"nsmid", 8740, "\xe2\x88\xa4"}, - {"lsquor", 8218, "\xe2\x80\x9a"}, - {"cemptyv", 10674, "\xe2\xa6\xb2"}, - {"rAarr", 8667, "\xe2\x87\x9b"}, - {"searr", 8600, "\xe2\x86\x98"}, - {"complexes", 8450, "\xe2\x84\x82"}, - {"UnderParenthesis", 9181, "\xe2\x8f\x9d"}, - {"nparsl", 11005, "\xe2\xab\xbd\xe2\x83\xa5"}, - {"Lacute", 313, "\xc4\xb9"}, - {"deg", 176, "\xc2\xb0"}, - {"Racute", 340, "\xc5\x94"}, - {"Verbar", 8214, "\xe2\x80\x96"}, - {"sqcups", 8852, "\xe2\x8a\x94\xef\xb8\x80"}, - {"Hopf", 8461, "\xe2\x84\x8d"}, - {"naturals", 8469, "\xe2\x84\x95"}, - {"Cedilla", 184, "\xc2\xb8"}, - {"exponentiale", 8519, "\xe2\x85\x87"}, - {"vnsup", 8835, "\xe2\x8a\x83\xe2\x83\x92"}, - {"leftrightarrows", 8646, "\xe2\x87\x86"}, - {"Laplacetrf", 8466, "\xe2\x84\x92"}, - {"vartriangleright", 8883, "\xe2\x8a\xb3"}, - {"rtri", 9657, "\xe2\x96\xb9"}, - {"gE", 8807, "\xe2\x89\xa7"}, - {"SmallCircle", 8728, "\xe2\x88\x98"}, - {"diamondsuit", 9830, "\xe2\x99\xa6"}, - {"Otilde", 213, "\xc3\x95"}, - {"lneq", 10887, "\xe2\xaa\x87"}, - {"lesdoto", 10881, "\xe2\xaa\x81"}, - {"ltquest", 10875, "\xe2\xa9\xbb"}, - {"thinsp", 8201, "\xe2\x80\x89"}, - {"barwed", 8965, "\xe2\x8c\x85"}, - {"elsdot", 10903, "\xe2\xaa\x97"}, - {"circ", 710, "\xcb\x86"}, - {"ni", 8715, "\xe2\x88\x8b"}, - {"mlcp", 10971, "\xe2\xab\x9b"}, - {"Vdash", 8873, "\xe2\x8a\xa9"}, - {"ShortRightArrow", 8594, "\xe2\x86\x92"}, - {"upharpoonleft", 8639, "\xe2\x86\xbf"}, - {"UnderBracket", 9141, "\xe2\x8e\xb5"}, - {"rAtail", 10524, "\xe2\xa4\x9c"}, - {"iopf", 120154, "\xf0\x9d\x95\x9a"}, - {"longleftarrow", 10229, "\xe2\x9f\xb5"}, - {"Zacute", 377, "\xc5\xb9"}, - {"duhar", 10607, "\xe2\xa5\xaf"}, - {"Mfr", 120080, "\xf0\x9d\x94\x90"}, - {"prnap", 10937, "\xe2\xaa\xb9"}, - {"eqcirc", 8790, "\xe2\x89\x96"}, - {"rarrlp", 8620, "\xe2\x86\xac"}, - {"le", 8804, "\xe2\x89\xa4"}, - {"Oscr", 119978, "\xf0\x9d\x92\xaa"}, - {"langd", 10641, "\xe2\xa6\x91"}, - {"Ucirc", 219, "\xc3\x9b"}, - {"precnapprox", 10937, "\xe2\xaa\xb9"}, - {"succcurlyeq", 8829, "\xe2\x89\xbd"}, - {"Tau", 932, "\xce\xa4"}, - {"larr", 8592, "\xe2\x86\x90"}, - {"neArr", 8663, "\xe2\x87\x97"}, - {"subsim", 10951, "\xe2\xab\x87"}, - {"DScy", 1029, "\xd0\x85"}, - {"preccurlyeq", 8828, "\xe2\x89\xbc"}, - {"NotLessLess", 8810, "\xe2\x89\xaa\xcc\xb8"}, - {"succnapprox", 10938, "\xe2\xaa\xba"}, - {"prcue", 8828, "\xe2\x89\xbc"}, - {"Downarrow", 8659, "\xe2\x87\x93"}, - {"angmsdah", 10671, "\xe2\xa6\xaf"}, - {"Emacr", 274, "\xc4\x92"}, - {"lsh", 8624, "\xe2\x86\xb0"}, - {"simne", 8774, "\xe2\x89\x86"}, - {"Bumpeq", 8782, "\xe2\x89\x8e"}, - {"RightUpTeeVector", 10588, "\xe2\xa5\x9c"}, - {"Sigma", 931, "\xce\xa3"}, - {"nvltrie", 8884, "\xe2\x8a\xb4\xe2\x83\x92"}, - {"lfr", 120105, "\xf0\x9d\x94\xa9"}, - {"emsp13", 8196, "\xe2\x80\x84"}, - {"parsl", 11005, "\xe2\xab\xbd"}, - {"ucirc", 251, "\xc3\xbb"}, - {"gsiml", 10896, "\xe2\xaa\x90"}, - {"xsqcup", 10758, "\xe2\xa8\x86"}, - {"Omicron", 927, "\xce\x9f"}, - {"gsime", 10894, "\xe2\xaa\x8e"}, - {"circlearrowleft", 8634, "\xe2\x86\xba"}, - {"sqsupe", 8850, "\xe2\x8a\x92"}, - {"supE", 10950, "\xe2\xab\x86"}, - {"dlcrop", 8973, "\xe2\x8c\x8d"}, - {"RightDownTeeVector", 10589, "\xe2\xa5\x9d"}, - {"Colone", 10868, "\xe2\xa9\xb4"}, - {"awconint", 8755, "\xe2\x88\xb3"}, - {"smte", 10924, "\xe2\xaa\xac"}, - {"lEg", 10891, "\xe2\xaa\x8b"}, - {"circledast", 8859, "\xe2\x8a\x9b"}, - {"ecolon", 8789, "\xe2\x89\x95"}, - {"rect", 9645, "\xe2\x96\xad"}, - {"Equal", 10869, "\xe2\xa9\xb5"}, - {"nwnear", 10535, "\xe2\xa4\xa7"}, - {"capdot", 10816, "\xe2\xa9\x80"}, - {"straightphi", 981, "\xcf\x95"}, - {"forkv", 10969, "\xe2\xab\x99"}, - {"ZHcy", 1046, "\xd0\x96"}, - {"Element", 8712, "\xe2\x88\x88"}, - {"rthree", 8908, "\xe2\x8b\x8c"}, - {"vzigzag", 10650, "\xe2\xa6\x9a"}, - {"hybull", 8259, "\xe2\x81\x83"}, - {"intprod", 10812, "\xe2\xa8\xbc"}, - {"HumpEqual", 8783, "\xe2\x89\x8f"}, - {"bigsqcup", 10758, "\xe2\xa8\x86"}, - {"mp", 8723, "\xe2\x88\x93"}, - {"lescc", 10920, "\xe2\xaa\xa8"}, - {"NotPrecedes", 8832, "\xe2\x8a\x80"}, - {"wedge", 8743, "\xe2\x88\xa7"}, - {"Supset", 8913, "\xe2\x8b\x91"}, - {"pm", 177, "\xc2\xb1"}, - {"kfr", 120104, "\xf0\x9d\x94\xa8"}, - {"ufisht", 10622, "\xe2\xa5\xbe"}, - {"ecaron", 283, "\xc4\x9b"}, - {"chcy", 1095, "\xd1\x87"}, - {"Esim", 10867, "\xe2\xa9\xb3"}, - {"fltns", 9649, "\xe2\x96\xb1"}, - {"nsce", 10928, "\xe2\xaa\xb0\xcc\xb8"}, - {"hookrightarrow", 8618, "\xe2\x86\xaa"}, - {"semi", 59, "\x3b"}, - {"ges", 10878, "\xe2\xa9\xbe"}, - {"approxeq", 8778, "\xe2\x89\x8a"}, - {"rarrsim", 10612, "\xe2\xa5\xb4"}, - {"boxhD", 9573, "\xe2\x95\xa5"}, - {"varpi", 982, "\xcf\x96"}, - {"larrb", 8676, "\xe2\x87\xa4"}, - {"copf", 120148, "\xf0\x9d\x95\x94"}, - {"Dopf", 120123, "\xf0\x9d\x94\xbb"}, - {"LeftVector", 8636, "\xe2\x86\xbc"}, - {"iff", 8660, "\xe2\x87\x94"}, - {"lnap", 10889, "\xe2\xaa\x89"}, - {"NotGreaterFullEqual", 8807, "\xe2\x89\xa7\xcc\xb8"}, - {"varrho", 1009, "\xcf\xb1"}, - {"NotSucceeds", 8833, "\xe2\x8a\x81"}, - {"ltrPar", 10646, "\xe2\xa6\x96"}, - {"nlE", 8806, "\xe2\x89\xa6\xcc\xb8"}, - {"Zfr", 8488, "\xe2\x84\xa8"}, - {"LeftArrowBar", 8676, "\xe2\x87\xa4"}, - {"boxplus", 8862, "\xe2\x8a\x9e"}, - {"sqsube", 8849, "\xe2\x8a\x91"}, - {"Re", 8476, "\xe2\x84\x9c"}, - {"Wfr", 120090, "\xf0\x9d\x94\x9a"}, - {"epsi", 949, "\xce\xb5"}, - {"oacute", 243, "\xc3\xb3"}, - {"bdquo", 8222, "\xe2\x80\x9e"}, - {"wscr", 120012, "\xf0\x9d\x93\x8c"}, - {"bullet", 8226, "\xe2\x80\xa2"}, - {"frown", 8994, "\xe2\x8c\xa2"}, - {"siml", 10909, "\xe2\xaa\x9d"}, - {"Rarr", 8608, "\xe2\x86\xa0"}, - {"Scaron", 352, "\xc5\xa0"}, - {"gtreqqless", 10892, "\xe2\xaa\x8c"}, - {"Larr", 8606, "\xe2\x86\x9e"}, - {"notniva", 8716, "\xe2\x88\x8c"}, - {"gg", 8811, "\xe2\x89\xab"}, - {"phmmat", 8499, "\xe2\x84\xb3"}, - {"boxVL", 9571, "\xe2\x95\xa3"}, - {"sigmav", 962, "\xcf\x82"}, - {"order", 8500, "\xe2\x84\xb4"}, - {"subsup", 10963, "\xe2\xab\x93"}, - {"afr", 120094, "\xf0\x9d\x94\x9e"}, - {"lbrace", 123, "\x7b"}, - {"urcorn", 8989, "\xe2\x8c\x9d"}, - {"Im", 8465, "\xe2\x84\x91"}, - {"CounterClockwiseContourIntegral", 8755, "\xe2\x88\xb3"}, - {"lne", 10887, "\xe2\xaa\x87"}, - {"chi", 967, "\xcf\x87"}, - {"cudarrl", 10552, "\xe2\xa4\xb8"}, - {"ang", 8736, "\xe2\x88\xa0"}, - {"isindot", 8949, "\xe2\x8b\xb5"}, - {"Lfr", 120079, "\xf0\x9d\x94\x8f"}, - {"Rsh", 8625, "\xe2\x86\xb1"}, - {"Ocy", 1054, "\xd0\x9e"}, - {"nvrArr", 10499, "\xe2\xa4\x83"}, - {"otimes", 8855, "\xe2\x8a\x97"}, - {"eqslantgtr", 10902, "\xe2\xaa\x96"}, - {"Rfr", 8476, "\xe2\x84\x9c"}, - {"blacktriangleleft", 9666, "\xe2\x97\x82"}, - {"Lsh", 8624, "\xe2\x86\xb0"}, - {"boxvr", 9500, "\xe2\x94\x9c"}, - {"scedil", 351, "\xc5\x9f"}, - {"iuml", 239, "\xc3\xaf"}, - {"NJcy", 1034, "\xd0\x8a"}, - {"Dagger", 8225, "\xe2\x80\xa1"}, - {"rarrap", 10613, "\xe2\xa5\xb5"}, - {"udblac", 369, "\xc5\xb1"}, - {"Sopf", 120138, "\xf0\x9d\x95\x8a"}, - {"scnsim", 8937, "\xe2\x8b\xa9"}, - {"hbar", 8463, "\xe2\x84\x8f"}, - {"frac15", 8533, "\xe2\x85\x95"}, - {"sup3", 179, "\xc2\xb3"}, - {"NegativeThickSpace", 8203, "\xe2\x80\x8b"}, - {"npr", 8832, "\xe2\x8a\x80"}, - {"doteq", 8784, "\xe2\x89\x90"}, - {"subrarr", 10617, "\xe2\xa5\xb9"}, - {"SquareSubset", 8847, "\xe2\x8a\x8f"}, - {"vprop", 8733, "\xe2\x88\x9d"}, - {"OpenCurlyQuote", 8216, "\xe2\x80\x98"}, - {"supseteq", 8839, "\xe2\x8a\x87"}, - {"nRightarrow", 8655, "\xe2\x87\x8f"}, - {"Longleftarrow", 10232, "\xe2\x9f\xb8"}, - {"lsquo", 8216, "\xe2\x80\x98"}, - {"hstrok", 295, "\xc4\xa7"}, - {"NotTilde", 8769, "\xe2\x89\x81"}, - {"ogt", 10689, "\xe2\xa7\x81"}, - {"block", 9608, "\xe2\x96\x88"}, - {"minusd", 8760, "\xe2\x88\xb8"}, - {"esdot", 8784, "\xe2\x89\x90"}, - {"nsim", 8769, "\xe2\x89\x81"}, - {"scsim", 8831, "\xe2\x89\xbf"}, - {"boxVl", 9570, "\xe2\x95\xa2"}, - {"ltimes", 8905, "\xe2\x8b\x89"}, - {"thkap", 8776, "\xe2\x89\x88"}, - {"vnsub", 8834, "\xe2\x8a\x82\xe2\x83\x92"}, - {"thetasym", 977, "\xcf\x91"}, - {"eopf", 120150, "\xf0\x9d\x95\x96"}, - {"image", 8465, "\xe2\x84\x91"}, - {"doteqdot", 8785, "\xe2\x89\x91"}, - {"Udblac", 368, "\xc5\xb0"}, - {"gnsim", 8935, "\xe2\x8b\xa7"}, - {"yicy", 1111, "\xd1\x97"}, - {"vopf", 120167, "\xf0\x9d\x95\xa7"}, - {"DDotrahd", 10513, "\xe2\xa4\x91"}, - {"Iota", 921, "\xce\x99"}, - {"GJcy", 1027, "\xd0\x83"}, - {"rightthreetimes", 8908, "\xe2\x8b\x8c"}, - {"nrtri", 8939, "\xe2\x8b\xab"}, - {"TildeFullEqual", 8773, "\xe2\x89\x85"}, - {"Dcaron", 270, "\xc4\x8e"}, - {"ccaron", 269, "\xc4\x8d"}, - {"lacute", 314, "\xc4\xba"}, - {"VerticalBar", 8739, "\xe2\x88\xa3"}, - {"Igrave", 204, "\xc3\x8c"}, - {"boxH", 9552, "\xe2\x95\x90"}, - {"Pfr", 120083, "\xf0\x9d\x94\x93"}, - {"equals", 61, "\x3d"}, - {"rbrack", 93, "\x5d"}, - {"OverParenthesis", 9180, "\xe2\x8f\x9c"}, - {"in", 8712, "\xe2\x88\x88"}, - {"llcorner", 8990, "\xe2\x8c\x9e"}, - {"mcomma", 10793, "\xe2\xa8\xa9"}, - {"NotGreater", 8815, "\xe2\x89\xaf"}, - {"midcir", 10992, "\xe2\xab\xb0"}, - {"Edot", 278, "\xc4\x96"}, - {"oplus", 8853, "\xe2\x8a\x95"}, - {"geqq", 8807, "\xe2\x89\xa7"}, - {"curvearrowleft", 8630, "\xe2\x86\xb6"}, - {"Poincareplane", 8460, "\xe2\x84\x8c"}, - {"yscr", 120014, "\xf0\x9d\x93\x8e"}, - {"ccaps", 10829, "\xe2\xa9\x8d"}, - {"rpargt", 10644, "\xe2\xa6\x94"}, - {"topfork", 10970, "\xe2\xab\x9a"}, - {"Gamma", 915, "\xce\x93"}, - {"umacr", 363, "\xc5\xab"}, - {"frac13", 8531, "\xe2\x85\x93"}, - {"cirfnint", 10768, "\xe2\xa8\x90"}, - {"xlArr", 10232, "\xe2\x9f\xb8"}, - {"digamma", 989, "\xcf\x9d"}, - {"Hat", 94, "\x5e"}, - {"lates", 10925, "\xe2\xaa\xad\xef\xb8\x80"}, - {"lgE", 10897, "\xe2\xaa\x91"}, - {"commat", 64, "\x40"}, - {"NotPrecedesSlantEqual", 8928, "\xe2\x8b\xa0"}, - {"phone", 9742, "\xe2\x98\x8e"}, - {"Ecirc", 202, "\xc3\x8a"}, - {"lt", 60, "\x3c"}, - {"intcal", 8890, "\xe2\x8a\xba"}, - {"xdtri", 9661, "\xe2\x96\xbd"}, - {"Abreve", 258, "\xc4\x82"}, - {"gopf", 120152, "\xf0\x9d\x95\x98"}, - {"Xopf", 120143, "\xf0\x9d\x95\x8f"}, - {"Iacute", 205, "\xc3\x8d"}, - {"Aopf", 120120, "\xf0\x9d\x94\xb8"}, - {"gbreve", 287, "\xc4\x9f"}, - {"nleq", 8816, "\xe2\x89\xb0"}, - {"xopf", 120169, "\xf0\x9d\x95\xa9"}, - {"SquareSupersetEqual", 8850, "\xe2\x8a\x92"}, - {"NotLessTilde", 8820, "\xe2\x89\xb4"}, - {"SubsetEqual", 8838, "\xe2\x8a\x86"}, - {"Sc", 10940, "\xe2\xaa\xbc"}, - {"sdote", 10854, "\xe2\xa9\xa6"}, - {"loplus", 10797, "\xe2\xa8\xad"}, - {"zfr", 120119, "\xf0\x9d\x94\xb7"}, - {"subseteqq", 10949, "\xe2\xab\x85"}, - {"Vdashl", 10982, "\xe2\xab\xa6"}, - {"integers", 8484, "\xe2\x84\xa4"}, - {"Umacr", 362, "\xc5\xaa"}, - {"dopf", 120149, "\xf0\x9d\x95\x95"}, - {"RightDownVectorBar", 10581, "\xe2\xa5\x95"}, - {"angmsdaf", 10669, "\xe2\xa6\xad"}, - {"Jfr", 120077, "\xf0\x9d\x94\x8d"}, - {"bernou", 8492, "\xe2\x84\xac"}, - {"lceil", 8968, "\xe2\x8c\x88"}, - {"nvsim", 8764, "\xe2\x88\xbc\xe2\x83\x92"}, - {"NotSucceedsSlantEqual", 8929, "\xe2\x8b\xa1"}, - {"hearts", 9829, "\xe2\x99\xa5"}, - {"vee", 8744, "\xe2\x88\xa8"}, - {"LJcy", 1033, "\xd0\x89"}, - {"nlt", 8814, "\xe2\x89\xae"}, - {"because", 8757, "\xe2\x88\xb5"}, - {"hairsp", 8202, "\xe2\x80\x8a"}, - {"comma", 44, "\x2c"}, - {"iecy", 1077, "\xd0\xb5"}, - {"npre", 10927, "\xe2\xaa\xaf\xcc\xb8"}, - {"NotSquareSubset", 8847, "\xe2\x8a\x8f\xcc\xb8"}, - {"mscr", 120002, "\xf0\x9d\x93\x82"}, - {"jopf", 120155, "\xf0\x9d\x95\x9b"}, - {"bumpE", 10926, "\xe2\xaa\xae"}, - {"thicksim", 8764, "\xe2\x88\xbc"}, - {"Nfr", 120081, "\xf0\x9d\x94\x91"}, - {"yucy", 1102, "\xd1\x8e"}, - {"notinvc", 8950, "\xe2\x8b\xb6"}, - {"lstrok", 322, "\xc5\x82"}, - {"robrk", 10215, "\xe2\x9f\xa7"}, - {"LeftTriangleBar", 10703, "\xe2\xa7\x8f"}, - {"hksearow", 10533, "\xe2\xa4\xa5"}, - {"bigcap", 8898, "\xe2\x8b\x82"}, - {"udhar", 10606, "\xe2\xa5\xae"}, - {"Yscr", 119988, "\xf0\x9d\x92\xb4"}, - {"smeparsl", 10724, "\xe2\xa7\xa4"}, - {"NotLess", 8814, "\xe2\x89\xae"}, - {"dcaron", 271, "\xc4\x8f"}, - {"ange", 10660, "\xe2\xa6\xa4"}, - {"dHar", 10597, "\xe2\xa5\xa5"}, - {"UpperRightArrow", 8599, "\xe2\x86\x97"}, - {"trpezium", 9186, "\xe2\x8f\xa2"}, - {"boxminus", 8863, "\xe2\x8a\x9f"}, - {"notni", 8716, "\xe2\x88\x8c"}, - {"dtrif", 9662, "\xe2\x96\xbe"}, - {"nhArr", 8654, "\xe2\x87\x8e"}, - {"larrpl", 10553, "\xe2\xa4\xb9"}, - {"simeq", 8771, "\xe2\x89\x83"}, - {"geqslant", 10878, "\xe2\xa9\xbe"}, - {"RightUpVectorBar", 10580, "\xe2\xa5\x94"}, - {"nsc", 8833, "\xe2\x8a\x81"}, - {"div", 247, "\xc3\xb7"}, - {"orslope", 10839, "\xe2\xa9\x97"}, - {"lparlt", 10643, "\xe2\xa6\x93"}, - {"trie", 8796, "\xe2\x89\x9c"}, - {"cirmid", 10991, "\xe2\xab\xaf"}, - {"wp", 8472, "\xe2\x84\x98"}, - {"dagger", 8224, "\xe2\x80\xa0"}, - {"utri", 9653, "\xe2\x96\xb5"}, - {"supnE", 10956, "\xe2\xab\x8c"}, - {"eg", 10906, "\xe2\xaa\x9a"}, - {"LeftDownVector", 8643, "\xe2\x87\x83"}, - {"NotLessEqual", 8816, "\xe2\x89\xb0"}, - {"Bopf", 120121, "\xf0\x9d\x94\xb9"}, - {"LongLeftRightArrow", 10231, "\xe2\x9f\xb7"}, - {"Gfr", 120074, "\xf0\x9d\x94\x8a"}, - {"sqsubseteq", 8849, "\xe2\x8a\x91"}, - {"ograve", 242, "\xc3\xb2"}, - {"larrhk", 8617, "\xe2\x86\xa9"}, - {"sigma", 963, "\xcf\x83"}, - {"NotSquareSupersetEqual", 8931, "\xe2\x8b\xa3"}, - {"gvnE", 8809, "\xe2\x89\xa9\xef\xb8\x80"}, - {"timesbar", 10801, "\xe2\xa8\xb1"}, - {"Iukcy", 1030, "\xd0\x86"}, - {"bscr", 119991, "\xf0\x9d\x92\xb7"}, - {"Exists", 8707, "\xe2\x88\x83"}, - {"tscr", 120009, "\xf0\x9d\x93\x89"}, - {"tcy", 1090, "\xd1\x82"}, - {"nwarr", 8598, "\xe2\x86\x96"}, - {"hoarr", 8703, "\xe2\x87\xbf"}, - {"lnapprox", 10889, "\xe2\xaa\x89"}, - {"nu", 957, "\xce\xbd"}, - {"bcy", 1073, "\xd0\xb1"}, - {"ndash", 8211, "\xe2\x80\x93"}, - {"smt", 10922, "\xe2\xaa\xaa"}, - {"scaron", 353, "\xc5\xa1"}, - {"IOcy", 1025, "\xd0\x81"}, - {"Ifr", 8465, "\xe2\x84\x91"}, - {"cularrp", 10557, "\xe2\xa4\xbd"}, - {"lvertneqq", 8808, "\xe2\x89\xa8\xef\xb8\x80"}, - {"nlarr", 8602, "\xe2\x86\x9a"}, - {"colon", 58, "\x3a"}, - {"ddotseq", 10871, "\xe2\xa9\xb7"}, - {"zacute", 378, "\xc5\xba"}, - {"DoubleVerticalBar", 8741, "\xe2\x88\xa5"}, - {"larrfs", 10525, "\xe2\xa4\x9d"}, - {"NotExists", 8708, "\xe2\x88\x84"}, - {"geq", 8805, "\xe2\x89\xa5"}, - {"Ffr", 120073, "\xf0\x9d\x94\x89"}, - {"divide", 247, "\xc3\xb7"}, - {"blank", 9251, "\xe2\x90\xa3"}, - {"IEcy", 1045, "\xd0\x95"}, - {"ordm", 186, "\xc2\xba"}, - {"fopf", 120151, "\xf0\x9d\x95\x97"}, - {"ecir", 8790, "\xe2\x89\x96"}, - {"complement", 8705, "\xe2\x88\x81"}, - {"top", 8868, "\xe2\x8a\xa4"}, - {"DoubleContourIntegral", 8751, "\xe2\x88\xaf"}, - {"nisd", 8954, "\xe2\x8b\xba"}, - {"bcong", 8780, "\xe2\x89\x8c"}, - {"plusdu", 10789, "\xe2\xa8\xa5"}, - {"TildeTilde", 8776, "\xe2\x89\x88"}, - {"lnE", 8808, "\xe2\x89\xa8"}, - {"DoubleLongRightArrow", 10233, "\xe2\x9f\xb9"}, - {"nsubseteqq", 10949, "\xe2\xab\x85\xcc\xb8"}, - {"DownTeeArrow", 8615, "\xe2\x86\xa7"}, - {"Cscr", 119966, "\xf0\x9d\x92\x9e"}, - {"NegativeVeryThinSpace", 8203, "\xe2\x80\x8b"}, - {"emsp", 8195, "\xe2\x80\x83"}, - {"vartriangleleft", 8882, "\xe2\x8a\xb2"}, - {"ropar", 10630, "\xe2\xa6\x86"}, - {"checkmark", 10003, "\xe2\x9c\x93"}, - {"Ycy", 1067, "\xd0\xab"}, - {"supset", 8835, "\xe2\x8a\x83"}, - {"gneqq", 8809, "\xe2\x89\xa9"}, - {"Lstrok", 321, "\xc5\x81"}, - {"AMP", 38, "\x26"}, - {"acE", 8766, "\xe2\x88\xbe\xcc\xb3"}, - {"sqsupseteq", 8850, "\xe2\x8a\x92"}, - {"nle", 8816, "\xe2\x89\xb0"}, - {"nesear", 10536, "\xe2\xa4\xa8"}, - {"LeftDownVectorBar", 10585, "\xe2\xa5\x99"}, - {"Integral", 8747, "\xe2\x88\xab"}, - {"Beta", 914, "\xce\x92"}, - {"nvdash", 8876, "\xe2\x8a\xac"}, - {"nges", 10878, "\xe2\xa9\xbe\xcc\xb8"}, - {"demptyv", 10673, "\xe2\xa6\xb1"}, - {"eta", 951, "\xce\xb7"}, - {"GreaterSlantEqual", 10878, "\xe2\xa9\xbe"}, - {"ccedil", 231, "\xc3\xa7"}, - {"pfr", 120109, "\xf0\x9d\x94\xad"}, - {"bbrktbrk", 9142, "\xe2\x8e\xb6"}, - {"mcy", 1084, "\xd0\xbc"}, - {"Not", 10988, "\xe2\xab\xac"}, - {"qscr", 120006, "\xf0\x9d\x93\x86"}, - {"zwj", 8205, "\xe2\x80\x8d"}, - {"ntrianglerighteq", 8941, "\xe2\x8b\xad"}, - {"permil", 8240, "\xe2\x80\xb0"}, - {"squarf", 9642, "\xe2\x96\xaa"}, - {"apos", 39, "\x27"}, - {"lrm", 8206, "\xe2\x80\x8e"}, - {"male", 9794, "\xe2\x99\x82"}, - {"agrave", 224, "\xc3\xa0"}, - {"Lt", 8810, "\xe2\x89\xaa"}, - {"capand", 10820, "\xe2\xa9\x84"}, - {"aring", 229, "\xc3\xa5"}, - {"Jukcy", 1028, "\xd0\x84"}, - {"bumpe", 8783, "\xe2\x89\x8f"}, - {"dd", 8518, "\xe2\x85\x86"}, - {"tscy", 1094, "\xd1\x86"}, - {"oS", 9416, "\xe2\x93\x88"}, - {"succeq", 10928, "\xe2\xaa\xb0"}, - {"xharr", 10231, "\xe2\x9f\xb7"}, - {"pluse", 10866, "\xe2\xa9\xb2"}, - {"rfisht", 10621, "\xe2\xa5\xbd"}, - {"HorizontalLine", 9472, "\xe2\x94\x80"}, - {"DiacriticalAcute", 180, "\xc2\xb4"}, - {"hfr", 120101, "\xf0\x9d\x94\xa5"}, - {"preceq", 10927, "\xe2\xaa\xaf"}, - {"rationals", 8474, "\xe2\x84\x9a"}, - {"Auml", 196, "\xc3\x84"}, - {"LeftRightArrow", 8596, "\xe2\x86\x94"}, - {"blacktriangleright", 9656, "\xe2\x96\xb8"}, - {"dharr", 8642, "\xe2\x87\x82"}, - {"isin", 8712, "\xe2\x88\x88"}, - {"ldrushar", 10571, "\xe2\xa5\x8b"}, - {"squ", 9633, "\xe2\x96\xa1"}, - {"rbrksld", 10638, "\xe2\xa6\x8e"}, - {"bigwedge", 8896, "\xe2\x8b\x80"}, - {"swArr", 8665, "\xe2\x87\x99"}, - {"IJlig", 306, "\xc4\xb2"}, - {"harr", 8596, "\xe2\x86\x94"}, - {"range", 10661, "\xe2\xa6\xa5"}, - {"urtri", 9721, "\xe2\x97\xb9"}, - {"NotVerticalBar", 8740, "\xe2\x88\xa4"}, - {"ic", 8291, "\xe2\x81\xa3"}, - {"solbar", 9023, "\xe2\x8c\xbf"}, - {"approx", 8776, "\xe2\x89\x88"}, - {"SquareSuperset", 8848, "\xe2\x8a\x90"}, - {"numsp", 8199, "\xe2\x80\x87"}, - {"nLt", 8810, "\xe2\x89\xaa\xe2\x83\x92"}, - {"tilde", 732, "\xcb\x9c"}, - {"rlarr", 8644, "\xe2\x87\x84"}, - {"langle", 10216, "\xe2\x9f\xa8"}, - {"nleqslant", 10877, "\xe2\xa9\xbd\xcc\xb8"}, - {"Nacute", 323, "\xc5\x83"}, - {"NotLeftTriangle", 8938, "\xe2\x8b\xaa"}, - {"sopf", 120164, "\xf0\x9d\x95\xa4"}, - {"xmap", 10236, "\xe2\x9f\xbc"}, - {"supne", 8843, "\xe2\x8a\x8b"}, - {"Int", 8748, "\xe2\x88\xac"}, - {"nsupseteqq", 10950, "\xe2\xab\x86\xcc\xb8"}, - {"circlearrowright", 8635, "\xe2\x86\xbb"}, - {"NotCongruent", 8802, "\xe2\x89\xa2"}, - {"Scedil", 350, "\xc5\x9e"}, - {"raquo", 187, "\xc2\xbb"}, - {"ycy", 1099, "\xd1\x8b"}, - {"notinvb", 8951, "\xe2\x8b\xb7"}, - {"andv", 10842, "\xe2\xa9\x9a"}, - {"nap", 8777, "\xe2\x89\x89"}, - {"shcy", 1096, "\xd1\x88"}, - {"ssetmn", 8726, "\xe2\x88\x96"}, - {"downarrow", 8595, "\xe2\x86\x93"}, - {"gesdotol", 10884, "\xe2\xaa\x84"}, - {"Congruent", 8801, "\xe2\x89\xa1"}, - {"pound", 163, "\xc2\xa3"}, - {"ZeroWidthSpace", 8203, "\xe2\x80\x8b"}, - {"rdca", 10551, "\xe2\xa4\xb7"}, - {"rmoust", 9137, "\xe2\x8e\xb1"}, - {"zcy", 1079, "\xd0\xb7"}, - {"Square", 9633, "\xe2\x96\xa1"}, - {"subE", 10949, "\xe2\xab\x85"}, - {"infintie", 10717, "\xe2\xa7\x9d"}, - {"Cayleys", 8493, "\xe2\x84\xad"}, - {"lsaquo", 8249, "\xe2\x80\xb9"}, - {"realpart", 8476, "\xe2\x84\x9c"}, - {"nprec", 8832, "\xe2\x8a\x80"}, - {"RightTriangleBar", 10704, "\xe2\xa7\x90"}, - {"Kopf", 120130, "\xf0\x9d\x95\x82"}, - {"Ubreve", 364, "\xc5\xac"}, - {"Uopf", 120140, "\xf0\x9d\x95\x8c"}, - {"trianglelefteq", 8884, "\xe2\x8a\xb4"}, - {"rotimes", 10805, "\xe2\xa8\xb5"}, - {"qfr", 120110, "\xf0\x9d\x94\xae"}, - {"gtcc", 10919, "\xe2\xaa\xa7"}, - {"fnof", 402, "\xc6\x92"}, - {"tritime", 10811, "\xe2\xa8\xbb"}, - {"andslope", 10840, "\xe2\xa9\x98"}, - {"harrw", 8621, "\xe2\x86\xad"}, - {"NotSquareSuperset", 8848, "\xe2\x8a\x90\xcc\xb8"}, - {"Amacr", 256, "\xc4\x80"}, - {"OpenCurlyDoubleQuote", 8220, "\xe2\x80\x9c"}, - {"thorn", 254, "\xc3\xbe"}, - {"ordf", 170, "\xc2\xaa"}, - {"natur", 9838, "\xe2\x99\xae"}, - {"xi", 958, "\xce\xbe"}, - {"infin", 8734, "\xe2\x88\x9e"}, - {"nspar", 8742, "\xe2\x88\xa6"}, - {"Jcy", 1049, "\xd0\x99"}, - {"DownLeftTeeVector", 10590, "\xe2\xa5\x9e"}, - {"rbarr", 10509, "\xe2\xa4\x8d"}, - {"Xi", 926, "\xce\x9e"}, - {"bull", 8226, "\xe2\x80\xa2"}, - {"cuesc", 8927, "\xe2\x8b\x9f"}, - {"backcong", 8780, "\xe2\x89\x8c"}, - {"frac35", 8535, "\xe2\x85\x97"}, - {"hscr", 119997, "\xf0\x9d\x92\xbd"}, - {"LessEqualGreater", 8922, "\xe2\x8b\x9a"}, - {"Implies", 8658, "\xe2\x87\x92"}, - {"ETH", 208, "\xc3\x90"}, - {"Yacute", 221, "\xc3\x9d"}, - {"shy", 173, "\xc2\xad"}, - {"Rarrtl", 10518, "\xe2\xa4\x96"}, - {"sup1", 185, "\xc2\xb9"}, - {"reals", 8477, "\xe2\x84\x9d"}, - {"blacklozenge", 10731, "\xe2\xa7\xab"}, - {"ncedil", 326, "\xc5\x86"}, - {"Lambda", 923, "\xce\x9b"}, - {"uopf", 120166, "\xf0\x9d\x95\xa6"}, - {"bigodot", 10752, "\xe2\xa8\x80"}, - {"ubreve", 365, "\xc5\xad"}, - {"drbkarow", 10512, "\xe2\xa4\x90"}, - {"els", 10901, "\xe2\xaa\x95"}, - {"shortparallel", 8741, "\xe2\x88\xa5"}, - {"Pcy", 1055, "\xd0\x9f"}, - {"dsol", 10742, "\xe2\xa7\xb6"}, - {"supsim", 10952, "\xe2\xab\x88"}, - {"Longrightarrow", 10233, "\xe2\x9f\xb9"}, - {"ThickSpace", 8287, "\xe2\x81\x9f\xe2\x80\x8a"}, - {"Itilde", 296, "\xc4\xa8"}, - {"nparallel", 8742, "\xe2\x88\xa6"}, - {"And", 10835, "\xe2\xa9\x93"}, - {"boxhd", 9516, "\xe2\x94\xac"}, - {"Dashv", 10980, "\xe2\xab\xa4"}, - {"NotSuperset", 8835, "\xe2\x8a\x83\xe2\x83\x92"}, - {"Eta", 919, "\xce\x97"}, - {"Qopf", 8474, "\xe2\x84\x9a"}, - {"period", 46, "\x2e"}, - {"angmsd", 8737, "\xe2\x88\xa1"}, - {"fllig", 64258, "\xef\xac\x82"}, - {"cuvee", 8910, "\xe2\x8b\x8e"}, - {"wedbar", 10847, "\xe2\xa9\x9f"}, - {"Fscr", 8497, "\xe2\x84\xb1"}, - {"veebar", 8891, "\xe2\x8a\xbb"}, - {"Longleftrightarrow", 10234, "\xe2\x9f\xba"}, - {"reg", 174, "\xc2\xae"}, - {"NegativeMediumSpace", 8203, "\xe2\x80\x8b"}, - {"Upsi", 978, "\xcf\x92"}, - {"Mellintrf", 8499, "\xe2\x84\xb3"}, - {"boxHU", 9577, "\xe2\x95\xa9"}, - {"bne", 61, "\x3d\xe2\x83\xa5"}, - {"frac56", 8538, "\xe2\x85\x9a"}, - {"utrif", 9652, "\xe2\x96\xb4"}, - {"LeftTriangle", 8882, "\xe2\x8a\xb2"}, - {"nsime", 8772, "\xe2\x89\x84"}, - {"rcedil", 343, "\xc5\x97"}, - {"aogon", 261, "\xc4\x85"}, - {"uHar", 10595, "\xe2\xa5\xa3"}, - {"ForAll", 8704, "\xe2\x88\x80"}, - {"prE", 10931, "\xe2\xaa\xb3"}, - {"boxV", 9553, "\xe2\x95\x91"}, - {"softcy", 1100, "\xd1\x8c"}, - {"hercon", 8889, "\xe2\x8a\xb9"}, - {"lmoustache", 9136, "\xe2\x8e\xb0"}, - {"Product", 8719, "\xe2\x88\x8f"}, - {"lsimg", 10895, "\xe2\xaa\x8f"}, - {"verbar", 124, "\x7c"}, - {"ofcir", 10687, "\xe2\xa6\xbf"}, - {"curlyeqprec", 8926, "\xe2\x8b\x9e"}, - {"ldquo", 8220, "\xe2\x80\x9c"}, - {"bot", 8869, "\xe2\x8a\xa5"}, - {"Psi", 936, "\xce\xa8"}, - {"OElig", 338, "\xc5\x92"}, - {"DownRightVectorBar", 10583, "\xe2\xa5\x97"}, - {"minusb", 8863, "\xe2\x8a\x9f"}, - {"Iscr", 8464, "\xe2\x84\x90"}, - {"Tcedil", 354, "\xc5\xa2"}, - {"ffilig", 64259, "\xef\xac\x83"}, - {"Gcy", 1043, "\xd0\x93"}, - {"oline", 8254, "\xe2\x80\xbe"}, - {"bottom", 8869, "\xe2\x8a\xa5"}, - {"nVDash", 8879, "\xe2\x8a\xaf"}, - {"lessdot", 8918, "\xe2\x8b\x96"}, - {"cups", 8746, "\xe2\x88\xaa\xef\xb8\x80"}, - {"gla", 10917, "\xe2\xaa\xa5"}, - {"hellip", 8230, "\xe2\x80\xa6"}, - {"hookleftarrow", 8617, "\xe2\x86\xa9"}, - {"Cup", 8915, "\xe2\x8b\x93"}, - {"upsi", 965, "\xcf\x85"}, - {"DownArrowBar", 10515, "\xe2\xa4\x93"}, - {"lowast", 8727, "\xe2\x88\x97"}, - {"profline", 8978, "\xe2\x8c\x92"}, - {"ngsim", 8821, "\xe2\x89\xb5"}, - {"boxhu", 9524, "\xe2\x94\xb4"}, - {"operp", 10681, "\xe2\xa6\xb9"}, - {"cap", 8745, "\xe2\x88\xa9"}, - {"Hcirc", 292, "\xc4\xa4"}, - {"Ncy", 1053, "\xd0\x9d"}, - {"zeetrf", 8488, "\xe2\x84\xa8"}, - {"cuepr", 8926, "\xe2\x8b\x9e"}, - {"supsetneq", 8843, "\xe2\x8a\x8b"}, - {"lfloor", 8970, "\xe2\x8c\x8a"}, - {"ngtr", 8815, "\xe2\x89\xaf"}, - {"ccups", 10828, "\xe2\xa9\x8c"}, - {"pscr", 120005, "\xf0\x9d\x93\x85"}, - {"Cfr", 8493, "\xe2\x84\xad"}, - {"dtri", 9663, "\xe2\x96\xbf"}, - {"icirc", 238, "\xc3\xae"}, - {"leftarrow", 8592, "\xe2\x86\x90"}, - {"vdash", 8866, "\xe2\x8a\xa2"}, - {"leftrightharpoons", 8651, "\xe2\x87\x8b"}, - {"rightrightarrows", 8649, "\xe2\x87\x89"}, - {"strns", 175, "\xc2\xaf"}, - {"intlarhk", 10775, "\xe2\xa8\x97"}, - {"downharpoonright", 8642, "\xe2\x87\x82"}, - {"yacute", 253, "\xc3\xbd"}, - {"boxUr", 9561, "\xe2\x95\x99"}, - {"triangleleft", 9667, "\xe2\x97\x83"}, - {"DiacriticalDot", 729, "\xcb\x99"}, - {"thetav", 977, "\xcf\x91"}, - {"OverBracket", 9140, "\xe2\x8e\xb4"}, - {"PrecedesTilde", 8830, "\xe2\x89\xbe"}, - {"rtrie", 8885, "\xe2\x8a\xb5"}, - {"Scirc", 348, "\xc5\x9c"}, - {"vsupne", 8843, "\xe2\x8a\x8b\xef\xb8\x80"}, - {"OverBrace", 9182, "\xe2\x8f\x9e"}, - {"Yfr", 120092, "\xf0\x9d\x94\x9c"}, - {"scnE", 10934, "\xe2\xaa\xb6"}, - {"simlE", 10911, "\xe2\xaa\x9f"}, - {"Proportional", 8733, "\xe2\x88\x9d"}, - {"edot", 279, "\xc4\x97"}, - {"loang", 10220, "\xe2\x9f\xac"}, - {"gesdot", 10880, "\xe2\xaa\x80"}, - {"DownBreve", 785, "\xcc\x91"}, - {"pcy", 1087, "\xd0\xbf"}, - {"Succeeds", 8827, "\xe2\x89\xbb"}, - {"mfr", 120106, "\xf0\x9d\x94\xaa"}, - {"Leftarrow", 8656, "\xe2\x87\x90"}, - {"boxDr", 9555, "\xe2\x95\x93"}, - {"Nscr", 119977, "\xf0\x9d\x92\xa9"}, - {"diam", 8900, "\xe2\x8b\x84"}, - {"CHcy", 1063, "\xd0\xa7"}, - {"boxdr", 9484, "\xe2\x94\x8c"}, - {"rlm", 8207, "\xe2\x80\x8f"}, - {"Coproduct", 8720, "\xe2\x88\x90"}, - {"RightTeeArrow", 8614, "\xe2\x86\xa6"}, - {"tridot", 9708, "\xe2\x97\xac"}, - {"ldquor", 8222, "\xe2\x80\x9e"}, - {"sol", 47, "\x2f"}, - {"ecirc", 234, "\xc3\xaa"}, - {"DoubleLeftArrow", 8656, "\xe2\x87\x90"}, - {"Gscr", 119970, "\xf0\x9d\x92\xa2"}, - {"ap", 8776, "\xe2\x89\x88"}, - {"rbrke", 10636, "\xe2\xa6\x8c"}, - {"LeftFloor", 8970, "\xe2\x8c\x8a"}, - {"blk12", 9618, "\xe2\x96\x92"}, - {"Conint", 8751, "\xe2\x88\xaf"}, - {"triangledown", 9663, "\xe2\x96\xbf"}, - {"Icy", 1048, "\xd0\x98"}, - {"backprime", 8245, "\xe2\x80\xb5"}, - {"longleftrightarrow", 10231, "\xe2\x9f\xb7"}, - {"ntriangleleft", 8938, "\xe2\x8b\xaa"}, - {"copy", 169, "\xc2\xa9"}, - {"mapstodown", 8615, "\xe2\x86\xa7"}, - {"seArr", 8664, "\xe2\x87\x98"}, - {"ENG", 330, "\xc5\x8a"}, - {"DoubleRightArrow", 8658, "\xe2\x87\x92"}, - {"tfr", 120113, "\xf0\x9d\x94\xb1"}, - {"rharul", 10604, "\xe2\xa5\xac"}, - {"bfr", 120095, "\xf0\x9d\x94\x9f"}, - {"origof", 8886, "\xe2\x8a\xb6"}, - {"Therefore", 8756, "\xe2\x88\xb4"}, - {"glE", 10898, "\xe2\xaa\x92"}, - {"leftarrowtail", 8610, "\xe2\x86\xa2"}, - {"NotEqual", 8800, "\xe2\x89\xa0"}, - {"LeftCeiling", 8968, "\xe2\x8c\x88"}, - {"lArr", 8656, "\xe2\x87\x90"}, - {"subseteq", 8838, "\xe2\x8a\x86"}, - {"larrbfs", 10527, "\xe2\xa4\x9f"}, - {"Gammad", 988, "\xcf\x9c"}, - {"rtriltri", 10702, "\xe2\xa7\x8e"}, - {"Fcy", 1060, "\xd0\xa4"}, - {"Vopf", 120141, "\xf0\x9d\x95\x8d"}, - {"lrarr", 8646, "\xe2\x87\x86"}, - {"delta", 948, "\xce\xb4"}, - {"xodot", 10752, "\xe2\xa8\x80"}, - {"larrtl", 8610, "\xe2\x86\xa2"}, - {"gsim", 8819, "\xe2\x89\xb3"}, - {"ratail", 10522, "\xe2\xa4\x9a"}, - {"vsubne", 8842, "\xe2\x8a\x8a\xef\xb8\x80"}, - {"boxur", 9492, "\xe2\x94\x94"}, - {"succsim", 8831, "\xe2\x89\xbf"}, - {"triplus", 10809, "\xe2\xa8\xb9"}, - {"nless", 8814, "\xe2\x89\xae"}, - {"uharr", 8638, "\xe2\x86\xbe"}, - {"lambda", 955, "\xce\xbb"}, - {"uuml", 252, "\xc3\xbc"}, - {"horbar", 8213, "\xe2\x80\x95"}, - {"ccirc", 265, "\xc4\x89"}, - {"sqcup", 8852, "\xe2\x8a\x94"}, - {"Pscr", 119979, "\xf0\x9d\x92\xab"}, - {"supsup", 10966, "\xe2\xab\x96"}, - {"Cacute", 262, "\xc4\x86"}, - {"upsih", 978, "\xcf\x92"}, - {"precsim", 8830, "\xe2\x89\xbe"}, - {"longrightarrow", 10230, "\xe2\x9f\xb6"}, - {"circledR", 174, "\xc2\xae"}, - {"UpTeeArrow", 8613, "\xe2\x86\xa5"}, - {"bepsi", 1014, "\xcf\xb6"}, - {"oast", 8859, "\xe2\x8a\x9b"}, - {"yfr", 120118, "\xf0\x9d\x94\xb6"}, - {"rdsh", 8627, "\xe2\x86\xb3"}, - {"Ograve", 210, "\xc3\x92"}, - {"LeftVectorBar", 10578, "\xe2\xa5\x92"}, - {"NotNestedLessLess", 10913, "\xe2\xaa\xa1\xcc\xb8"}, - {"Jscr", 119973, "\xf0\x9d\x92\xa5"}, - {"psi", 968, "\xcf\x88"}, - {"orarr", 8635, "\xe2\x86\xbb"}, - {"Subset", 8912, "\xe2\x8b\x90"}, - {"curarr", 8631, "\xe2\x86\xb7"}, - {"CirclePlus", 8853, "\xe2\x8a\x95"}, - {"gtrless", 8823, "\xe2\x89\xb7"}, - {"nvle", 8804, "\xe2\x89\xa4\xe2\x83\x92"}, - {"prop", 8733, "\xe2\x88\x9d"}, - {"gEl", 10892, "\xe2\xaa\x8c"}, - {"gtlPar", 10645, "\xe2\xa6\x95"}, - {"frasl", 8260, "\xe2\x81\x84"}, - {"nearr", 8599, "\xe2\x86\x97"}, - {"NotSubsetEqual", 8840, "\xe2\x8a\x88"}, - {"planck", 8463, "\xe2\x84\x8f"}, - {"Uuml", 220, "\xc3\x9c"}, - {"spadesuit", 9824, "\xe2\x99\xa0"}, - {"sect", 167, "\xc2\xa7"}, - {"cdot", 267, "\xc4\x8b"}, - {"boxVh", 9579, "\xe2\x95\xab"}, - {"zscr", 120015, "\xf0\x9d\x93\x8f"}, - {"nsqsube", 8930, "\xe2\x8b\xa2"}, - {"grave", 96, "\x60"}, - {"angrtvb", 8894, "\xe2\x8a\xbe"}, - {"MediumSpace", 8287, "\xe2\x81\x9f"}, - {"Ntilde", 209, "\xc3\x91"}, - {"solb", 10692, "\xe2\xa7\x84"}, - {"angzarr", 9084, "\xe2\x8d\xbc"}, - {"nopf", 120159, "\xf0\x9d\x95\x9f"}, - {"rtrif", 9656, "\xe2\x96\xb8"}, - {"nrightarrow", 8603, "\xe2\x86\x9b"}, - {"Kappa", 922, "\xce\x9a"}, - {"simrarr", 10610, "\xe2\xa5\xb2"}, - {"imacr", 299, "\xc4\xab"}, - {"vrtri", 8883, "\xe2\x8a\xb3"}, - {"part", 8706, "\xe2\x88\x82"}, - {"esim", 8770, "\xe2\x89\x82"}, - {"atilde", 227, "\xc3\xa3"}, - {"DownRightTeeVector", 10591, "\xe2\xa5\x9f"}, - {"jcirc", 309, "\xc4\xb5"}, - {"Ecaron", 282, "\xc4\x9a"}, - {"VerticalSeparator", 10072, "\xe2\x9d\x98"}, - {"rHar", 10596, "\xe2\xa5\xa4"}, - {"rcaron", 345, "\xc5\x99"}, - {"subnE", 10955, "\xe2\xab\x8b"}, - {"ii", 8520, "\xe2\x85\x88"}, - {"Cconint", 8752, "\xe2\x88\xb0"}, - {"Mcy", 1052, "\xd0\x9c"}, - {"eqcolon", 8789, "\xe2\x89\x95"}, - {"cupor", 10821, "\xe2\xa9\x85"}, - {"DoubleUpArrow", 8657, "\xe2\x87\x91"}, - {"boxbox", 10697, "\xe2\xa7\x89"}, - {"setminus", 8726, "\xe2\x88\x96"}, - {"Lleftarrow", 8666, "\xe2\x87\x9a"}, - {"nang", 8736, "\xe2\x88\xa0\xe2\x83\x92"}, - {"TRADE", 8482, "\xe2\x84\xa2"}, - {"urcorner", 8989, "\xe2\x8c\x9d"}, - {"lsqb", 91, "\x5b"}, - {"cupcup", 10826, "\xe2\xa9\x8a"}, - {"kjcy", 1116, "\xd1\x9c"}, - {"llhard", 10603, "\xe2\xa5\xab"}, - {"mumap", 8888, "\xe2\x8a\xb8"}, - {"iiint", 8749, "\xe2\x88\xad"}, - {"RightTee", 8866, "\xe2\x8a\xa2"}, - {"Tcaron", 356, "\xc5\xa4"}, - {"bigcirc", 9711, "\xe2\x97\xaf"}, - {"trianglerighteq", 8885, "\xe2\x8a\xb5"}, - {"NotLessGreater", 8824, "\xe2\x89\xb8"}, - {"hArr", 8660, "\xe2\x87\x94"}, - {"ocy", 1086, "\xd0\xbe"}, - {"tosa", 10537, "\xe2\xa4\xa9"}, - {"twixt", 8812, "\xe2\x89\xac"}, - {"square", 9633, "\xe2\x96\xa1"}, - {"Otimes", 10807, "\xe2\xa8\xb7"}, - {"Kcedil", 310, "\xc4\xb6"}, - {"beth", 8502, "\xe2\x84\xb6"}, - {"triminus", 10810, "\xe2\xa8\xba"}, - {"nlArr", 8653, "\xe2\x87\x8d"}, - {"Oacute", 211, "\xc3\x93"}, - {"zwnj", 8204, "\xe2\x80\x8c"}, - {"ll", 8810, "\xe2\x89\xaa"}, - {"smashp", 10803, "\xe2\xa8\xb3"}, - {"ngeqq", 8807, "\xe2\x89\xa7\xcc\xb8"}, - {"rnmid", 10990, "\xe2\xab\xae"}, - {"nwArr", 8662, "\xe2\x87\x96"}, - {"RightUpDownVector", 10575, "\xe2\xa5\x8f"}, - {"lbbrk", 10098, "\xe2\x9d\xb2"}, - {"compfn", 8728, "\xe2\x88\x98"}, - {"eDDot", 10871, "\xe2\xa9\xb7"}, - {"Jsercy", 1032, "\xd0\x88"}, - {"HARDcy", 1066, "\xd0\xaa"}, - {"nexists", 8708, "\xe2\x88\x84"}, - {"theta", 952, "\xce\xb8"}, - {"plankv", 8463, "\xe2\x84\x8f"}, - {"sup2", 178, "\xc2\xb2"}, - {"lessapprox", 10885, "\xe2\xaa\x85"}, - {"gdot", 289, "\xc4\xa1"}, - {"angmsdae", 10668, "\xe2\xa6\xac"}, - {"Superset", 8835, "\xe2\x8a\x83"}, - {"prap", 10935, "\xe2\xaa\xb7"}, - {"Zscr", 119989, "\xf0\x9d\x92\xb5"}, - {"nsucc", 8833, "\xe2\x8a\x81"}, - {"supseteqq", 10950, "\xe2\xab\x86"}, - {"UpTee", 8869, "\xe2\x8a\xa5"}, - {"LowerLeftArrow", 8601, "\xe2\x86\x99"}, - {"ssmile", 8995, "\xe2\x8c\xa3"}, - {"niv", 8715, "\xe2\x88\x8b"}, - {"bigvee", 8897, "\xe2\x8b\x81"}, - {"kscr", 120000, "\xf0\x9d\x93\x80"}, - {"xutri", 9651, "\xe2\x96\xb3"}, - {"caret", 8257, "\xe2\x81\x81"}, - {"caron", 711, "\xcb\x87"}, - {"Wedge", 8896, "\xe2\x8b\x80"}, - {"sdotb", 8865, "\xe2\x8a\xa1"}, - {"bigoplus", 10753, "\xe2\xa8\x81"}, - {"Breve", 728, "\xcb\x98"}, - {"ImaginaryI", 8520, "\xe2\x85\x88"}, - {"longmapsto", 10236, "\xe2\x9f\xbc"}, - {"boxVH", 9580, "\xe2\x95\xac"}, - {"lozenge", 9674, "\xe2\x97\x8a"}, - {"toea", 10536, "\xe2\xa4\xa8"}, - {"nbumpe", 8783, "\xe2\x89\x8f\xcc\xb8"}, - {"gcirc", 285, "\xc4\x9d"}, - {"NotHumpEqual", 8783, "\xe2\x89\x8f\xcc\xb8"}, - {"pre", 10927, "\xe2\xaa\xaf"}, - {"ascr", 119990, "\xf0\x9d\x92\xb6"}, - {"Acirc", 194, "\xc3\x82"}, - {"questeq", 8799, "\xe2\x89\x9f"}, - {"ncaron", 328, "\xc5\x88"}, - {"LeftTeeArrow", 8612, "\xe2\x86\xa4"}, - {"xcirc", 9711, "\xe2\x97\xaf"}, - {"swarr", 8601, "\xe2\x86\x99"}, - {"MinusPlus", 8723, "\xe2\x88\x93"}, - {"plus", 43, "\x2b"}, - {"NotDoubleVerticalBar", 8742, "\xe2\x88\xa6"}, - {"rppolint", 10770, "\xe2\xa8\x92"}, - {"NotTildeFullEqual", 8775, "\xe2\x89\x87"}, - {"ltdot", 8918, "\xe2\x8b\x96"}, - {"NotNestedGreaterGreater", 10914, "\xe2\xaa\xa2\xcc\xb8"}, - {"Lscr", 8466, "\xe2\x84\x92"}, - {"pitchfork", 8916, "\xe2\x8b\x94"}, - {"Eopf", 120124, "\xf0\x9d\x94\xbc"}, - {"ropf", 120163, "\xf0\x9d\x95\xa3"}, - {"Delta", 916, "\xce\x94"}, - {"lozf", 10731, "\xe2\xa7\xab"}, - {"RightTeeVector", 10587, "\xe2\xa5\x9b"}, - {"UpDownArrow", 8597, "\xe2\x86\x95"}, - {"bump", 8782, "\xe2\x89\x8e"}, - {"Rscr", 8475, "\xe2\x84\x9b"}, - {"slarr", 8592, "\xe2\x86\x90"}, - {"lcy", 1083, "\xd0\xbb"}, - {"Vee", 8897, "\xe2\x8b\x81"}, - {"Iogon", 302, "\xc4\xae"}, - {"minus", 8722, "\xe2\x88\x92"}, - {"GreaterFullEqual", 8807, "\xe2\x89\xa7"}, - {"xhArr", 10234, "\xe2\x9f\xba"}, - {"shortmid", 8739, "\xe2\x88\xa3"}, - {"DoubleDownArrow", 8659, "\xe2\x87\x93"}, - {"Wscr", 119986, "\xf0\x9d\x92\xb2"}, - {"rang", 10217, "\xe2\x9f\xa9"}, - {"lcub", 123, "\x7b"}, - {"mnplus", 8723, "\xe2\x88\x93"}, - {"ulcrop", 8975, "\xe2\x8c\x8f"}, - {"wfr", 120116, "\xf0\x9d\x94\xb4"}, - {"DifferentialD", 8518, "\xe2\x85\x86"}, - {"ThinSpace", 8201, "\xe2\x80\x89"}, - {"NotGreaterGreater", 8811, "\xe2\x89\xab\xcc\xb8"}, - {"Topf", 120139, "\xf0\x9d\x95\x8b"}, - {"sbquo", 8218, "\xe2\x80\x9a"}, - {"sdot", 8901, "\xe2\x8b\x85"}, - {"DoubleLeftTee", 10980, "\xe2\xab\xa4"}, - {"vBarv", 10985, "\xe2\xab\xa9"}, - {"subne", 8842, "\xe2\x8a\x8a"}, - {"gtrdot", 8919, "\xe2\x8b\x97"}, - {"opar", 10679, "\xe2\xa6\xb7"}, - {"apid", 8779, "\xe2\x89\x8b"}, - {"Cross", 10799, "\xe2\xa8\xaf"}, - {"lhblk", 9604, "\xe2\x96\x84"}, - {"capcap", 10827, "\xe2\xa9\x8b"}, - {"midast", 42, "\x2a"}, - {"lscr", 120001, "\xf0\x9d\x93\x81"}, - {"nGt", 8811, "\xe2\x89\xab\xe2\x83\x92"}, - {"Euml", 203, "\xc3\x8b"}, - {"blacktriangledown", 9662, "\xe2\x96\xbe"}, - {"Rcy", 1056, "\xd0\xa0"}, - {"dfisht", 10623, "\xe2\xa5\xbf"}, - {"dashv", 8867, "\xe2\x8a\xa3"}, - {"ast", 42, "\x2a"}, - {"ContourIntegral", 8750, "\xe2\x88\xae"}, - {"Ofr", 120082, "\xf0\x9d\x94\x92"}, - {"Lcy", 1051, "\xd0\x9b"}, - {"nltrie", 8940, "\xe2\x8b\xac"}, - {"ShortUpArrow", 8593, "\xe2\x86\x91"}, - {"acy", 1072, "\xd0\xb0"}, - {"rightarrow", 8594, "\xe2\x86\x92"}, - {"UnderBar", 95, "\x5f"}, - {"LongLeftArrow", 10229, "\xe2\x9f\xb5"}, - {"andd", 10844, "\xe2\xa9\x9c"}, - {"xlarr", 10229, "\xe2\x9f\xb5"}, - {"percnt", 37, "\x25"}, - {"rharu", 8640, "\xe2\x87\x80"}, - {"plusdo", 8724, "\xe2\x88\x94"}, - {"TScy", 1062, "\xd0\xa6"}, - {"kcy", 1082, "\xd0\xba"}, - {"boxVR", 9568, "\xe2\x95\xa0"}, - {"looparrowleft", 8619, "\xe2\x86\xab"}, - {"scirc", 349, "\xc5\x9d"}, - {"drcorn", 8991, "\xe2\x8c\x9f"}, - {"iiota", 8489, "\xe2\x84\xa9"}, - {"Zcy", 1047, "\xd0\x97"}, - {"frac58", 8541, "\xe2\x85\x9d"}, - {"alpha", 945, "\xce\xb1"}, - {"daleth", 8504, "\xe2\x84\xb8"}, - {"gtreqless", 8923, "\xe2\x8b\x9b"}, - {"tstrok", 359, "\xc5\xa7"}, - {"plusb", 8862, "\xe2\x8a\x9e"}, - {"odsold", 10684, "\xe2\xa6\xbc"}, - {"varsupsetneqq", 10956, "\xe2\xab\x8c\xef\xb8\x80"}, - {"otilde", 245, "\xc3\xb5"}, - {"gtcir", 10874, "\xe2\xa9\xba"}, - {"lltri", 9722, "\xe2\x97\xba"}, - {"rx", 8478, "\xe2\x84\x9e"}, - {"ljcy", 1113, "\xd1\x99"}, - {"parsim", 10995, "\xe2\xab\xb3"}, - {"NotElement", 8713, "\xe2\x88\x89"}, - {"plusmn", 177, "\xc2\xb1"}, - {"varsubsetneq", 8842, "\xe2\x8a\x8a\xef\xb8\x80"}, - {"subset", 8834, "\xe2\x8a\x82"}, - {"awint", 10769, "\xe2\xa8\x91"}, - {"laemptyv", 10676, "\xe2\xa6\xb4"}, - {"phiv", 981, "\xcf\x95"}, - {"sfrown", 8994, "\xe2\x8c\xa2"}, - {"DoubleUpDownArrow", 8661, "\xe2\x87\x95"}, - {"lpar", 40, "\x28"}, - {"frac45", 8536, "\xe2\x85\x98"}, - {"rBarr", 10511, "\xe2\xa4\x8f"}, - {"npolint", 10772, "\xe2\xa8\x94"}, - {"emacr", 275, "\xc4\x93"}, - {"maltese", 10016, "\xe2\x9c\xa0"}, - {"PlusMinus", 177, "\xc2\xb1"}, - {"ReverseEquilibrium", 8651, "\xe2\x87\x8b"}, - {"oscr", 8500, "\xe2\x84\xb4"}, - {"blacksquare", 9642, "\xe2\x96\xaa"}, - {"TSHcy", 1035, "\xd0\x8b"}, - {"gap", 10886, "\xe2\xaa\x86"}, - {"xnis", 8955, "\xe2\x8b\xbb"}, - {"Ll", 8920, "\xe2\x8b\x98"}, - {"PrecedesEqual", 10927, "\xe2\xaa\xaf"}, - {"incare", 8453, "\xe2\x84\x85"}, - {"nharr", 8622, "\xe2\x86\xae"}, - {"varnothing", 8709, "\xe2\x88\x85"}, - {"ShortDownArrow", 8595, "\xe2\x86\x93"}, - {"nbsp", 160, " "}, - {"asympeq", 8781, "\xe2\x89\x8d"}, - {"rbrkslu", 10640, "\xe2\xa6\x90"}, - {"rho", 961, "\xcf\x81"}, - {"Mscr", 8499, "\xe2\x84\xb3"}, - {"eth", 240, "\xc3\xb0"}, - {"suplarr", 10619, "\xe2\xa5\xbb"}, - {"Tab", 9, "\x09"}, - {"omicron", 959, "\xce\xbf"}, - {"blacktriangle", 9652, "\xe2\x96\xb4"}, - {"nldr", 8229, "\xe2\x80\xa5"}, - {"downharpoonleft", 8643, "\xe2\x87\x83"}, - {"circledcirc", 8858, "\xe2\x8a\x9a"}, - {"leftleftarrows", 8647, "\xe2\x87\x87"}, - {"NotHumpDownHump", 8782, "\xe2\x89\x8e\xcc\xb8"}, - {"nvgt", 62, "\x3e\xe2\x83\x92"}, - {"rhard", 8641, "\xe2\x87\x81"}, - {"nGg", 8921, "\xe2\x8b\x99\xcc\xb8"}, - {"lurdshar", 10570, "\xe2\xa5\x8a"}, - {"cirE", 10691, "\xe2\xa7\x83"}, - {"isinE", 8953, "\xe2\x8b\xb9"}, - {"eparsl", 10723, "\xe2\xa7\xa3"}, - {"RightAngleBracket", 10217, "\xe2\x9f\xa9"}, - {"hcirc", 293, "\xc4\xa5"}, - {"bumpeq", 8783, "\xe2\x89\x8f"}, - {"cire", 8791, "\xe2\x89\x97"}, - {"dotplus", 8724, "\xe2\x88\x94"}, - {"itilde", 297, "\xc4\xa9"}, - {"uwangle", 10663, "\xe2\xa6\xa7"}, - {"rlhar", 8652, "\xe2\x87\x8c"}, - {"rbrace", 125, "\x7d"}, - {"mid", 8739, "\xe2\x88\xa3"}, - {"el", 10905, "\xe2\xaa\x99"}, - {"KJcy", 1036, "\xd0\x8c"}, - {"odiv", 10808, "\xe2\xa8\xb8"}, - {"amacr", 257, "\xc4\x81"}, - {"qprime", 8279, "\xe2\x81\x97"}, - {"tcedil", 355, "\xc5\xa3"}, - {"UpArrowDownArrow", 8645, "\xe2\x87\x85"}, - {"spades", 9824, "\xe2\x99\xa0"}, - {"napos", 329, "\xc5\x89"}, - {"straightepsilon", 1013, "\xcf\xb5"}, - {"CupCap", 8781, "\xe2\x89\x8d"}, - {"Oopf", 120134, "\xf0\x9d\x95\x86"}, - {"sub", 8834, "\xe2\x8a\x82"}, - {"ohm", 937, "\xce\xa9"}, - {"UnderBrace", 9183, "\xe2\x8f\x9f"}, - {"looparrowright", 8620, "\xe2\x86\xac"}, - {"xotime", 10754, "\xe2\xa8\x82"}, - {"ntgl", 8825, "\xe2\x89\xb9"}, - {"minusdu", 10794, "\xe2\xa8\xaa"}, - {"rarrb", 8677, "\xe2\x87\xa5"}, - {"nvlArr", 10498, "\xe2\xa4\x82"}, - {"triangle", 9653, "\xe2\x96\xb5"}, - {"nacute", 324, "\xc5\x84"}, - {"boxHD", 9574, "\xe2\x95\xa6"}, - {"ratio", 8758, "\xe2\x88\xb6"}, - {"larrsim", 10611, "\xe2\xa5\xb3"}, - {"LessLess", 10913, "\xe2\xaa\xa1"}, - {"yacy", 1103, "\xd1\x8f"}, - {"ctdot", 8943, "\xe2\x8b\xaf"}, - {"and", 8743, "\xe2\x88\xa7"}, - {"lrtri", 8895, "\xe2\x8a\xbf"}, - {"eDot", 8785, "\xe2\x89\x91"}, - {"sqsub", 8847, "\xe2\x8a\x8f"}, - {"real", 8476, "\xe2\x84\x9c"}, - {"Dcy", 1044, "\xd0\x94"}, - {"vartheta", 977, "\xcf\x91"}, - {"nsub", 8836, "\xe2\x8a\x84"}, - {"DownTee", 8868, "\xe2\x8a\xa4"}, - {"acute", 180, "\xc2\xb4"}, - {"GreaterLess", 8823, "\xe2\x89\xb7"}, - {"supplus", 10944, "\xe2\xab\x80"}, - {"Vbar", 10987, "\xe2\xab\xab"}, - {"divideontimes", 8903, "\xe2\x8b\x87"}, - {"lsim", 8818, "\xe2\x89\xb2"}, - {"nearhk", 10532, "\xe2\xa4\xa4"}, - {"nLtv", 8810, "\xe2\x89\xaa\xcc\xb8"}, - {"RuleDelayed", 10740, "\xe2\xa7\xb4"}, - {"smile", 8995, "\xe2\x8c\xa3"}, - {"coprod", 8720, "\xe2\x88\x90"}, - {"imof", 8887, "\xe2\x8a\xb7"}, - {"ecy", 1101, "\xd1\x8d"}, - {"RightCeiling", 8969, "\xe2\x8c\x89"}, - {"dlcorn", 8990, "\xe2\x8c\x9e"}, - {"Nu", 925, "\xce\x9d"}, - {"frac18", 8539, "\xe2\x85\x9b"}, - {"diamond", 8900, "\xe2\x8b\x84"}, - {"Icirc", 206, "\xc3\x8e"}, - {"ngeq", 8817, "\xe2\x89\xb1"}, - {"epsilon", 949, "\xce\xb5"}, - {"fork", 8916, "\xe2\x8b\x94"}, - {"xrarr", 10230, "\xe2\x9f\xb6"}, - {"racute", 341, "\xc5\x95"}, - {"ntlg", 8824, "\xe2\x89\xb8"}, - {"xvee", 8897, "\xe2\x8b\x81"}, - {"LeftArrowRightArrow", 8646, "\xe2\x87\x86"}, - {"DownLeftRightVector", 10576, "\xe2\xa5\x90"}, - {"Eacute", 201, "\xc3\x89"}, - {"gimel", 8503, "\xe2\x84\xb7"}, - {"rtimes", 8906, "\xe2\x8b\x8a"}, - {"forall", 8704, "\xe2\x88\x80"}, - {"DiacriticalDoubleAcute", 733, "\xcb\x9d"}, - {"dArr", 8659, "\xe2\x87\x93"}, - {"fallingdotseq", 8786, "\xe2\x89\x92"}, - {"Aogon", 260, "\xc4\x84"}, - {"PartialD", 8706, "\xe2\x88\x82"}, - {"mapstoup", 8613, "\xe2\x86\xa5"}, - {"die", 168, "\xc2\xa8"}, - {"ngt", 8815, "\xe2\x89\xaf"}, - {"vcy", 1074, "\xd0\xb2"}, - {"fjlig", 0, "\x66\x6a"}, - {"submult", 10945, "\xe2\xab\x81"}, - {"ubrcy", 1118, "\xd1\x9e"}, - {"ovbar", 9021, "\xe2\x8c\xbd"}, - {"bsime", 8909, "\xe2\x8b\x8d"}, - {"precnsim", 8936, "\xe2\x8b\xa8"}, - {"DiacriticalTilde", 732, "\xcb\x9c"}, - {"cwint", 8753, "\xe2\x88\xb1"}, - {"Scy", 1057, "\xd0\xa1"}, - {"NotGreaterEqual", 8817, "\xe2\x89\xb1"}, - {"boxUR", 9562, "\xe2\x95\x9a"}, - {"LessSlantEqual", 10877, "\xe2\xa9\xbd"}, - {"Barwed", 8966, "\xe2\x8c\x86"}, - {"supdot", 10942, "\xe2\xaa\xbe"}, - {"gel", 8923, "\xe2\x8b\x9b"}, - {"iscr", 119998, "\xf0\x9d\x92\xbe"}, - {"doublebarwedge", 8966, "\xe2\x8c\x86"}, - {"Idot", 304, "\xc4\xb0"}, - {"DoubleDot", 168, "\xc2\xa8"}, - {"rsquo", 8217, "\xe2\x80\x99"}, - {"subsetneqq", 10955, "\xe2\xab\x8b"}, - {"UpEquilibrium", 10606, "\xe2\xa5\xae"}, - {"copysr", 8471, "\xe2\x84\x97"}, - {"RightDoubleBracket", 10215, "\xe2\x9f\xa7"}, - {"LeftRightVector", 10574, "\xe2\xa5\x8e"}, - {"DownLeftVectorBar", 10582, "\xe2\xa5\x96"}, - {"suphsub", 10967, "\xe2\xab\x97"}, - {"cedil", 184, "\xc2\xb8"}, - {"prurel", 8880, "\xe2\x8a\xb0"}, - {"imagpart", 8465, "\xe2\x84\x91"}, - {"Hscr", 8459, "\xe2\x84\x8b"}, - {"jmath", 567, "\xc8\xb7"}, - {"nrtrie", 8941, "\xe2\x8b\xad"}, - {"nsup", 8837, "\xe2\x8a\x85"}, - {"Ubrcy", 1038, "\xd0\x8e"}, - {"succnsim", 8937, "\xe2\x8b\xa9"}, - {"nesim", 8770, "\xe2\x89\x82\xcc\xb8"}, - {"varepsilon", 1013, "\xcf\xb5"}, - {"DoubleRightTee", 8872, "\xe2\x8a\xa8"}, - {"not", 172, "\xc2\xac"}, - {"lesdot", 10879, "\xe2\xa9\xbf"}, - {"backepsilon", 1014, "\xcf\xb6"}, - {"srarr", 8594, "\xe2\x86\x92"}, - {"varsubsetneqq", 10955, "\xe2\xab\x8b\xef\xb8\x80"}, - {"sqcap", 8851, "\xe2\x8a\x93"}, - {"rightleftarrows", 8644, "\xe2\x87\x84"}, - {"diams", 9830, "\xe2\x99\xa6"}, - {"boxdR", 9554, "\xe2\x95\x92"}, - {"ngeqslant", 10878, "\xe2\xa9\xbe\xcc\xb8"}, - {"boxDR", 9556, "\xe2\x95\x94"}, - {"sext", 10038, "\xe2\x9c\xb6"}, - {"backsim", 8765, "\xe2\x88\xbd"}, - {"nfr", 120107, "\xf0\x9d\x94\xab"}, - {"CloseCurlyDoubleQuote", 8221, "\xe2\x80\x9d"}, - {"npart", 8706, "\xe2\x88\x82\xcc\xb8"}, - {"dharl", 8643, "\xe2\x87\x83"}, - {"NewLine", 10, "\x0a"}, - {"bigotimes", 10754, "\xe2\xa8\x82"}, - {"lAtail", 10523, "\xe2\xa4\x9b"}, - {"frac14", 188, "\xc2\xbc"}, - {"or", 8744, "\xe2\x88\xa8"}, - {"subedot", 10947, "\xe2\xab\x83"}, - {"nmid", 8740, "\xe2\x88\xa4"}, - {"DownArrowUpArrow", 8693, "\xe2\x87\xb5"}, - {"icy", 1080, "\xd0\xb8"}, - {"num", 35, "\x23"}, - {"Gdot", 288, "\xc4\xa0"}, - {"urcrop", 8974, "\xe2\x8c\x8e"}, - {"epsiv", 1013, "\xcf\xb5"}, - {"topcir", 10993, "\xe2\xab\xb1"}, - {"ne", 8800, "\xe2\x89\xa0"}, - {"osol", 8856, "\xe2\x8a\x98"}, - {"amp", 38, "\x26"}, - {"ncap", 10819, "\xe2\xa9\x83"}, - {"Sscr", 119982, "\xf0\x9d\x92\xae"}, - {"sung", 9834, "\xe2\x99\xaa"}, - {"ltri", 9667, "\xe2\x97\x83"}, - {"frac25", 8534, "\xe2\x85\x96"}, - {"DZcy", 1039, "\xd0\x8f"}, - {"RightUpVector", 8638, "\xe2\x86\xbe"}, - {"rsquor", 8217, "\xe2\x80\x99"}, - {"uplus", 8846, "\xe2\x8a\x8e"}, - {"triangleright", 9657, "\xe2\x96\xb9"}, - {"lAarr", 8666, "\xe2\x87\x9a"}, - {"HilbertSpace", 8459, "\xe2\x84\x8b"}, - {"there4", 8756, "\xe2\x88\xb4"}, - {"vscr", 120011, "\xf0\x9d\x93\x8b"}, - {"cirscir", 10690, "\xe2\xa7\x82"}, - {"roarr", 8702, "\xe2\x87\xbe"}, - {"hslash", 8463, "\xe2\x84\x8f"}, - {"supdsub", 10968, "\xe2\xab\x98"}, - {"simg", 10910, "\xe2\xaa\x9e"}, - {"trade", 8482, "\xe2\x84\xa2"}, - {"searrow", 8600, "\xe2\x86\x98"}, - {"DownLeftVector", 8637, "\xe2\x86\xbd"}, - {"FilledSmallSquare", 9724, "\xe2\x97\xbc"}, - {"prod", 8719, "\xe2\x88\x8f"}, - {"oror", 10838, "\xe2\xa9\x96"}, - {"udarr", 8645, "\xe2\x87\x85"}, - {"jsercy", 1112, "\xd1\x98"}, - {"tprime", 8244, "\xe2\x80\xb4"}, - {"bprime", 8245, "\xe2\x80\xb5"}, - {"malt", 10016, "\xe2\x9c\xa0"}, - {"bigcup", 8899, "\xe2\x8b\x83"}, - {"oint", 8750, "\xe2\x88\xae"}, - {"female", 9792, "\xe2\x99\x80"}, - {"omacr", 333, "\xc5\x8d"}, - {"SquareSubsetEqual", 8849, "\xe2\x8a\x91"}, - {"SucceedsEqual", 10928, "\xe2\xaa\xb0"}, - {"plusacir", 10787, "\xe2\xa8\xa3"}, - {"Gcirc", 284, "\xc4\x9c"}, - {"lesdotor", 10883, "\xe2\xaa\x83"}, - {"escr", 8495, "\xe2\x84\xaf"}, - {"THORN", 222, "\xc3\x9e"}, - {"UpArrowBar", 10514, "\xe2\xa4\x92"}, - {"nvrtrie", 8885, "\xe2\x8a\xb5\xe2\x83\x92"}, - {"varkappa", 1008, "\xcf\xb0"}, - {"NotReverseElement", 8716, "\xe2\x88\x8c"}, - {"zdot", 380, "\xc5\xbc"}, - {"ExponentialE", 8519, "\xe2\x85\x87"}, - {"lesseqgtr", 8922, "\xe2\x8b\x9a"}, - {"cscr", 119992, "\xf0\x9d\x92\xb8"}, - {"Dscr", 119967, "\xf0\x9d\x92\x9f"}, - {"lthree", 8907, "\xe2\x8b\x8b"}, - {"Ccedil", 199, "\xc3\x87"}, - {"nge", 8817, "\xe2\x89\xb1"}, - {"UpperLeftArrow", 8598, "\xe2\x86\x96"}, - {"vDash", 8872, "\xe2\x8a\xa8"}, - {"efDot", 8786, "\xe2\x89\x92"}, - {"telrec", 8981, "\xe2\x8c\x95"}, - {"vellip", 8942, "\xe2\x8b\xae"}, - {"nrArr", 8655, "\xe2\x87\x8f"}, - {"ugrave", 249, "\xc3\xb9"}, - {"uring", 367, "\xc5\xaf"}, - {"Bernoullis", 8492, "\xe2\x84\xac"}, - {"nles", 10877, "\xe2\xa9\xbd\xcc\xb8"}, - {"macr", 175, "\xc2\xaf"}, - {"boxuR", 9560, "\xe2\x95\x98"}, - {"clubsuit", 9827, "\xe2\x99\xa3"}, - {"rightarrowtail", 8611, "\xe2\x86\xa3"}, - {"epar", 8917, "\xe2\x8b\x95"}, - {"ltcc", 10918, "\xe2\xaa\xa6"}, - {"twoheadleftarrow", 8606, "\xe2\x86\x9e"}, - {"aleph", 8501, "\xe2\x84\xb5"}, - {"Colon", 8759, "\xe2\x88\xb7"}, - {"vltri", 8882, "\xe2\x8a\xb2"}, - {"quaternions", 8461, "\xe2\x84\x8d"}, - {"rfr", 120111, "\xf0\x9d\x94\xaf"}, - {"Ouml", 214, "\xc3\x96"}, - {"rsh", 8625, "\xe2\x86\xb1"}, - {"emptyv", 8709, "\xe2\x88\x85"}, - {"sqsup", 8848, "\xe2\x8a\x90"}, - {"marker", 9646, "\xe2\x96\xae"}, - {"Efr", 120072, "\xf0\x9d\x94\x88"}, - {"DotEqual", 8784, "\xe2\x89\x90"}, - {"eqsim", 8770, "\xe2\x89\x82"}, - {"NotSucceedsEqual", 10928, "\xe2\xaa\xb0\xcc\xb8"}, - {"primes", 8473, "\xe2\x84\x99"}, - {"times", 215, "\xc3\x97"}, - {"rangd", 10642, "\xe2\xa6\x92"}, - {"rightharpoonup", 8640, "\xe2\x87\x80"}, - {"lrhard", 10605, "\xe2\xa5\xad"}, - {"ape", 8778, "\xe2\x89\x8a"}, - {"varsupsetneq", 8843, "\xe2\x8a\x8b\xef\xb8\x80"}, - {"larrlp", 8619, "\xe2\x86\xab"}, - {"NotPrecedesEqual", 10927, "\xe2\xaa\xaf\xcc\xb8"}, - {"ulcorner", 8988, "\xe2\x8c\x9c"}, - {"acd", 8767, "\xe2\x88\xbf"}, - {"Hacek", 711, "\xcb\x87"}, - {"xuplus", 10756, "\xe2\xa8\x84"}, - {"therefore", 8756, "\xe2\x88\xb4"}, - {"YIcy", 1031, "\xd0\x87"}, - {"Tfr", 120087, "\xf0\x9d\x94\x97"}, - {"Jcirc", 308, "\xc4\xb4"}, - {"LessGreater", 8822, "\xe2\x89\xb6"}, - {"Uring", 366, "\xc5\xae"}, - {"Ugrave", 217, "\xc3\x99"}, - {"rarr", 8594, "\xe2\x86\x92"}, - {"wopf", 120168, "\xf0\x9d\x95\xa8"}, - {"imath", 305, "\xc4\xb1"}, - {"Yopf", 120144, "\xf0\x9d\x95\x90"}, - {"colone", 8788, "\xe2\x89\x94"}, - {"csube", 10961, "\xe2\xab\x91"}, - {"odash", 8861, "\xe2\x8a\x9d"}, - {"olarr", 8634, "\xe2\x86\xba"}, - {"angrt", 8735, "\xe2\x88\x9f"}, - {"NotLeftTriangleBar", 10703, "\xe2\xa7\x8f\xcc\xb8"}, - {"GreaterEqual", 8805, "\xe2\x89\xa5"}, - {"scnap", 10938, "\xe2\xaa\xba"}, - {"pi", 960, "\xcf\x80"}, - {"lesg", 8922, "\xe2\x8b\x9a\xef\xb8\x80"}, - {"orderof", 8500, "\xe2\x84\xb4"}, - {"uacute", 250, "\xc3\xba"}, - {"Barv", 10983, "\xe2\xab\xa7"}, - {"Theta", 920, "\xce\x98"}, - {"leftrightsquigarrow", 8621, "\xe2\x86\xad"}, - {"Atilde", 195, "\xc3\x83"}, - {"cupdot", 8845, "\xe2\x8a\x8d"}, - {"ntriangleright", 8939, "\xe2\x8b\xab"}, - {"measuredangle", 8737, "\xe2\x88\xa1"}, - {"jscr", 119999, "\xf0\x9d\x92\xbf"}, - {"inodot", 305, "\xc4\xb1"}, - {"mopf", 120158, "\xf0\x9d\x95\x9e"}, - {"hkswarow", 10534, "\xe2\xa4\xa6"}, - {"lopar", 10629, "\xe2\xa6\x85"}, - {"thksim", 8764, "\xe2\x88\xbc"}, - {"bkarow", 10509, "\xe2\xa4\x8d"}, - {"rarrfs", 10526, "\xe2\xa4\x9e"}, - {"ntrianglelefteq", 8940, "\xe2\x8b\xac"}, - {"Bscr", 8492, "\xe2\x84\xac"}, - {"topf", 120165, "\xf0\x9d\x95\xa5"}, - {"Uacute", 218, "\xc3\x9a"}, - {"lap", 10885, "\xe2\xaa\x85"}, - {"djcy", 1106, "\xd1\x92"}, - {"bopf", 120147, "\xf0\x9d\x95\x93"}, - {"empty", 8709, "\xe2\x88\x85"}, - {"LeftAngleBracket", 10216, "\xe2\x9f\xa8"}, - {"Imacr", 298, "\xc4\xaa"}, - {"ltcir", 10873, "\xe2\xa9\xb9"}, - {"trisb", 10701, "\xe2\xa7\x8d"}, - {"gjcy", 1107, "\xd1\x93"}, - {"pr", 8826, "\xe2\x89\xba"}, - {"Mu", 924, "\xce\x9c"}, - {"ogon", 731, "\xcb\x9b"}, - {"pertenk", 8241, "\xe2\x80\xb1"}, - {"plustwo", 10791, "\xe2\xa8\xa7"}, - {"Vfr", 120089, "\xf0\x9d\x94\x99"}, - {"ApplyFunction", 8289, "\xe2\x81\xa1"}, - {"Sub", 8912, "\xe2\x8b\x90"}, - {"DoubleLeftRightArrow", 8660, "\xe2\x87\x94"}, - {"Lmidot", 319, "\xc4\xbf"}, - {"nwarrow", 8598, "\xe2\x86\x96"}, - {"angrtvbd", 10653, "\xe2\xa6\x9d"}, - {"fcy", 1092, "\xd1\x84"}, - {"ltlarr", 10614, "\xe2\xa5\xb6"}, - {"CircleMinus", 8854, "\xe2\x8a\x96"}, - {"angmsdab", 10665, "\xe2\xa6\xa9"}, - {"wedgeq", 8793, "\xe2\x89\x99"}, - {"iogon", 303, "\xc4\xaf"}, - {"laquo", 171, "\xc2\xab"}, - {"NestedGreaterGreater", 8811, "\xe2\x89\xab"}, - {"UnionPlus", 8846, "\xe2\x8a\x8e"}, - {"CircleDot", 8857, "\xe2\x8a\x99"}, - {"coloneq", 8788, "\xe2\x89\x94"}, - {"csupe", 10962, "\xe2\xab\x92"}, - {"tcaron", 357, "\xc5\xa5"}, - {"GreaterTilde", 8819, "\xe2\x89\xb3"}, - {"Map", 10501, "\xe2\xa4\x85"}, - {"DoubleLongLeftArrow", 10232, "\xe2\x9f\xb8"}, - {"Uparrow", 8657, "\xe2\x87\x91"}, - {"scy", 1089, "\xd1\x81"}, - {"llarr", 8647, "\xe2\x87\x87"}, - {"rangle", 10217, "\xe2\x9f\xa9"}, - {"sstarf", 8902, "\xe2\x8b\x86"}, - {"InvisibleTimes", 8290, "\xe2\x81\xa2"}, - {"egsdot", 10904, "\xe2\xaa\x98"}, - {"target", 8982, "\xe2\x8c\x96"}, - {"lesges", 10899, "\xe2\xaa\x93"}, - {"curren", 164, "\xc2\xa4"}, - {"yopf", 120170, "\xf0\x9d\x95\xaa"}, - {"frac23", 8532, "\xe2\x85\x94"}, - {"NotSucceedsTilde", 8831, "\xe2\x89\xbf\xcc\xb8"}, - {"napprox", 8777, "\xe2\x89\x89"}, - {"odblac", 337, "\xc5\x91"}, - {"gammad", 989, "\xcf\x9d"}, - {"dscr", 119993, "\xf0\x9d\x92\xb9"}, - {"SupersetEqual", 8839, "\xe2\x8a\x87"}, - {"squf", 9642, "\xe2\x96\xaa"}, - {"Because", 8757, "\xe2\x88\xb5"}, - {"sccue", 8829, "\xe2\x89\xbd"}, - {"KHcy", 1061, "\xd0\xa5"}, - {"Wcirc", 372, "\xc5\xb4"}, - {"uparrow", 8593, "\xe2\x86\x91"}, - {"lessgtr", 8822, "\xe2\x89\xb6"}, - {"thickapprox", 8776, "\xe2\x89\x88"}, - {"lbrksld", 10639, "\xe2\xa6\x8f"}, - {"oslash", 248, "\xc3\xb8"}, - {"NotCupCap", 8813, "\xe2\x89\xad"}, - {"elinters", 9191, "\xe2\x8f\xa7"}, - {"Assign", 8788, "\xe2\x89\x94"}, - {"ClockwiseContourIntegral", 8754, "\xe2\x88\xb2"}, - {"lfisht", 10620, "\xe2\xa5\xbc"}, - {"DownArrow", 8595, "\xe2\x86\x93"}, - {"Zdot", 379, "\xc5\xbb"}, - {"xscr", 120013, "\xf0\x9d\x93\x8d"}, - {"DiacriticalGrave", 96, "\x60"}, - {"DoubleLongLeftRightArrow", 10234, "\xe2\x9f\xba"}, - {"angle", 8736, "\xe2\x88\xa0"}, - {"race", 8765, "\xe2\x88\xbd\xcc\xb1"}, - {"Ascr", 119964, "\xf0\x9d\x92\x9c"}, - {"Xscr", 119987, "\xf0\x9d\x92\xb3"}, - {"acirc", 226, "\xc3\xa2"}, - {"otimesas", 10806, "\xe2\xa8\xb6"}, - {"gscr", 8458, "\xe2\x84\x8a"}, - {"gcy", 1075, "\xd0\xb3"}, - {"angmsdag", 10670, "\xe2\xa6\xae"}, - {"tshcy", 1115, "\xd1\x9b"}, - {"Acy", 1040, "\xd0\x90"}, - {"NotGreaterLess", 8825, "\xe2\x89\xb9"}, - {"dtdot", 8945, "\xe2\x8b\xb1"}, - {"quot", 34, "\x22"}, - {"micro", 181, "\xc2\xb5"}, - {"simplus", 10788, "\xe2\xa8\xa4"}, - {"nsupseteq", 8841, "\xe2\x8a\x89"}, - {"Ufr", 120088, "\xf0\x9d\x94\x98"}, - {"Pr", 10939, "\xe2\xaa\xbb"}, - {"napid", 8779, "\xe2\x89\x8b\xcc\xb8"}, - {"rceil", 8969, "\xe2\x8c\x89"}, - {"boxtimes", 8864, "\xe2\x8a\xa0"}, - {"erarr", 10609, "\xe2\xa5\xb1"}, - {"downdownarrows", 8650, "\xe2\x87\x8a"}, - {"Kfr", 120078, "\xf0\x9d\x94\x8e"}, - {"mho", 8487, "\xe2\x84\xa7"}, - {"scpolint", 10771, "\xe2\xa8\x93"}, - {"vArr", 8661, "\xe2\x87\x95"}, - {"Ccaron", 268, "\xc4\x8c"}, - {"NotRightTriangle", 8939, "\xe2\x8b\xab"}, - {"topbot", 9014, "\xe2\x8c\xb6"}, - {"qopf", 120162, "\xf0\x9d\x95\xa2"}, - {"eogon", 281, "\xc4\x99"}, - {"luruhar", 10598, "\xe2\xa5\xa6"}, - {"gtdot", 8919, "\xe2\x8b\x97"}, - {"Egrave", 200, "\xc3\x88"}, - {"roplus", 10798, "\xe2\xa8\xae"}, - {"Intersection", 8898, "\xe2\x8b\x82"}, - {"Uarr", 8607, "\xe2\x86\x9f"}, - {"dcy", 1076, "\xd0\xb4"}, - {"boxvl", 9508, "\xe2\x94\xa4"}, - {"RightArrowBar", 8677, "\xe2\x87\xa5"}, - {"yuml", 255, "\xc3\xbf"}, - {"parallel", 8741, "\xe2\x88\xa5"}, - {"succneqq", 10934, "\xe2\xaa\xb6"}, - {"bemptyv", 10672, "\xe2\xa6\xb0"}, - {"starf", 9733, "\xe2\x98\x85"}, - {"OverBar", 8254, "\xe2\x80\xbe"}, - {"Alpha", 913, "\xce\x91"}, - {"LeftUpVectorBar", 10584, "\xe2\xa5\x98"}, - {"ufr", 120114, "\xf0\x9d\x94\xb2"}, - {"swarhk", 10534, "\xe2\xa4\xa6"}, - {"GreaterEqualLess", 8923, "\xe2\x8b\x9b"}, - {"sscr", 120008, "\xf0\x9d\x93\x88"}, - {"Pi", 928, "\xce\xa0"}, - {"boxh", 9472, "\xe2\x94\x80"}, - {"frac16", 8537, "\xe2\x85\x99"}, - {"lbrack", 91, "\x5b"}, - {"vert", 124, "\x7c"}, - {"precneqq", 10933, "\xe2\xaa\xb5"}, - {"NotGreaterSlantEqual", 10878, "\xe2\xa9\xbe\xcc\xb8"}, - {"Omega", 937, "\xce\xa9"}, - {"uarr", 8593, "\xe2\x86\x91"}, - {"boxVr", 9567, "\xe2\x95\x9f"}, - {"ruluhar", 10600, "\xe2\xa5\xa8"}, - {"ShortLeftArrow", 8592, "\xe2\x86\x90"}, - {"Qfr", 120084, "\xf0\x9d\x94\x94"}, - {"olt", 10688, "\xe2\xa7\x80"}, - {"nequiv", 8802, "\xe2\x89\xa2"}, - {"fscr", 119995, "\xf0\x9d\x92\xbb"}, - {"rarrhk", 8618, "\xe2\x86\xaa"}, - {"nsqsupe", 8931, "\xe2\x8b\xa3"}, - {"nsubseteq", 8840, "\xe2\x8a\x88"}, - {"numero", 8470, "\xe2\x84\x96"}, - {"emsp14", 8197, "\xe2\x80\x85"}, - {"gl", 8823, "\xe2\x89\xb7"}, - {"ocirc", 244, "\xc3\xb4"}, - {"weierp", 8472, "\xe2\x84\x98"}, - {"boxvL", 9569, "\xe2\x95\xa1"}, - {"RightArrowLeftArrow", 8644, "\xe2\x87\x84"}, - {"Precedes", 8826, "\xe2\x89\xba"}, - {"RightVector", 8640, "\xe2\x87\x80"}, - {"xcup", 8899, "\xe2\x8b\x83"}, - {"angmsdad", 10667, "\xe2\xa6\xab"}, - {"gtrsim", 8819, "\xe2\x89\xb3"}, - {"natural", 9838, "\xe2\x99\xae"}, - {"nVdash", 8878, "\xe2\x8a\xae"}, - {"RightTriangleEqual", 8885, "\xe2\x8a\xb5"}, - {"dscy", 1109, "\xd1\x95"}, - {"leftthreetimes", 8907, "\xe2\x8b\x8b"}, - {"prsim", 8830, "\xe2\x89\xbe"}, - {"Bcy", 1041, "\xd0\x91"}, - {"Chi", 935, "\xce\xa7"}, - {"timesb", 8864, "\xe2\x8a\xa0"}, - {"Del", 8711, "\xe2\x88\x87"}, - {"lmidot", 320, "\xc5\x80"}, - {"RightDownVector", 8642, "\xe2\x87\x82"}, - {"simdot", 10858, "\xe2\xa9\xaa"}, - {"FilledVerySmallSquare", 9642, "\xe2\x96\xaa"}, - {"NotLessSlantEqual", 10877, "\xe2\xa9\xbd\xcc\xb8"}, - {"SucceedsTilde", 8831, "\xe2\x89\xbf"}, - {"duarr", 8693, "\xe2\x87\xb5"}, - {"apE", 10864, "\xe2\xa9\xb0"}, - {"odot", 8857, "\xe2\x8a\x99"}, - {"mldr", 8230, "\xe2\x80\xa6"}, - {"Uarrocir", 10569, "\xe2\xa5\x89"}, - {"nLl", 8920, "\xe2\x8b\x98\xcc\xb8"}, - {"rarrpl", 10565, "\xe2\xa5\x85"}, - {"cir", 9675, "\xe2\x97\x8b"}, - {"blk14", 9617, "\xe2\x96\x91"}, - {"VerticalLine", 124, "\x7c"}, - {"jcy", 1081, "\xd0\xb9"}, - {"filig", 64257, "\xef\xac\x81"}, - {"LongRightArrow", 10230, "\xe2\x9f\xb6"}, - {"beta", 946, "\xce\xb2"}, - {"ccupssm", 10832, "\xe2\xa9\x90"}, - {"supsub", 10964, "\xe2\xab\x94"}, - {"spar", 8741, "\xe2\x88\xa5"}, - {"Tstrok", 358, "\xc5\xa6"}, - {"isinv", 8712, "\xe2\x88\x88"}, - {"rightsquigarrow", 8605, "\xe2\x86\x9d"}, - {"Diamond", 8900, "\xe2\x8b\x84"}, - {"curlyeqsucc", 8927, "\xe2\x8b\x9f"}, - {"ijlig", 307, "\xc4\xb3"}, - {"puncsp", 8200, "\xe2\x80\x88"}, - {"hamilt", 8459, "\xe2\x84\x8b"}, - {"mapstoleft", 8612, "\xe2\x86\xa4"}, - {"Copf", 8450, "\xe2\x84\x82"}, - {"prnsim", 8936, "\xe2\x8b\xa8"}, - {"DotDot", 8412, "\xe2\x83\x9c"}, - {"lobrk", 10214, "\xe2\x9f\xa6"}, - {"twoheadrightarrow", 8608, "\xe2\x86\xa0"}, - {"ngE", 8807, "\xe2\x89\xa7\xcc\xb8"}, - {"cylcty", 9005, "\xe2\x8c\xad"}, - {"sube", 8838, "\xe2\x8a\x86"}, - {"NotEqualTilde", 8770, "\xe2\x89\x82\xcc\xb8"}, - {"Yuml", 376, "\xc5\xb8"}, - {"comp", 8705, "\xe2\x88\x81"}, - {"dotminus", 8760, "\xe2\x88\xb8"}, - {"crarr", 8629, "\xe2\x86\xb5"}, - {"imped", 437, "\xc6\xb5"}, - {"barwedge", 8965, "\xe2\x8c\x85"}, - {"harrcir", 10568, "\xe2\xa5\x88"}, + {"szlig", 223, "\xc3\x9f"}, + {"prime", 8242, "\xe2\x80\xb2"}, + {"lnsim", 8934, "\xe2\x8b\xa6"}, + {"nvDash", 8877, "\xe2\x8a\xad"}, + {"isinsv", 8947, "\xe2\x8b\xb3"}, + {"notin", 8713, "\xe2\x88\x89"}, + {"becaus", 8757, "\xe2\x88\xb5"}, + {"Leftrightarrow", 8660, "\xe2\x87\x94"}, + {"EmptySmallSquare", 9723, "\xe2\x97\xbb"}, + {"SquareUnion", 8852, "\xe2\x8a\x94"}, + {"subdot", 10941, "\xe2\xaa\xbd"}, + {"Dstrok", 272, "\xc4\x90"}, + {"rrarr", 8649, "\xe2\x87\x89"}, + {"rArr", 8658, "\xe2\x87\x92"}, + {"Aacute", 193, "\xc3\x81"}, + {"kappa", 954, "\xce\xba"}, + {"Iopf", 120128, "\xf0\x9d\x95\x80"}, + {"hyphen", 8208, "\xe2\x80\x90"}, + {"rarrbfs", 10528, "\xe2\xa4\xa0"}, + {"supsetneqq", 10956, "\xe2\xab\x8c"}, + {"gacute", 501, "\xc7\xb5"}, + {"VeryThinSpace", 8202, "\xe2\x80\x8a"}, + {"tint", 8749, "\xe2\x88\xad"}, + {"ffr", 120099, "\xf0\x9d\x94\xa3"}, + {"kgreen", 312, "\xc4\xb8"}, + {"nis", 8956, "\xe2\x8b\xbc"}, + {"NotRightTriangleBar", 10704, "\xe2\xa7\x90\xcc\xb8"}, + {"Eogon", 280, "\xc4\x98"}, + {"lbrke", 10635, "\xe2\xa6\x8b"}, + {"phi", 966, "\xcf\x86"}, + {"notnivc", 8957, "\xe2\x8b\xbd"}, + {"utilde", 361, "\xc5\xa9"}, + {"Fopf", 120125, "\xf0\x9d\x94\xbd"}, + {"Vcy", 1042, "\xd0\x92"}, + {"erDot", 8787, "\xe2\x89\x93"}, + {"nsubE", 10949, "\xe2\xab\x85\xcc\xb8"}, + {"egrave", 232, "\xc3\xa8"}, + {"Lcedil", 315, "\xc4\xbb"}, + {"lharul", 10602, "\xe2\xa5\xaa"}, + {"middot", 183, "\xc2\xb7"}, + {"ggg", 8921, "\xe2\x8b\x99"}, + {"NestedLessLess", 8810, "\xe2\x89\xaa"}, + {"tau", 964, "\xcf\x84"}, + {"setmn", 8726, "\xe2\x88\x96"}, + {"frac78", 8542, "\xe2\x85\x9e"}, + {"para", 182, "\xc2\xb6"}, + {"Rcedil", 342, "\xc5\x96"}, + {"propto", 8733, "\xe2\x88\x9d"}, + {"sqsubset", 8847, "\xe2\x8a\x8f"}, + {"ensp", 8194, "\xe2\x80\x82"}, + {"boxvH", 9578, "\xe2\x95\xaa"}, + {"NotGreaterTilde", 8821, "\xe2\x89\xb5"}, + {"ffllig", 64260, "\xef\xac\x84"}, + {"kcedil", 311, "\xc4\xb7"}, + {"omega", 969, "\xcf\x89"}, + {"sime", 8771, "\xe2\x89\x83"}, + {"LeftTriangleEqual", 8884, "\xe2\x8a\xb4"}, + {"bsemi", 8271, "\xe2\x81\x8f"}, + {"rdquor", 8221, "\xe2\x80\x9d"}, + {"Utilde", 360, "\xc5\xa8"}, + {"bsol", 92, "\x5c"}, + {"risingdotseq", 8787, "\xe2\x89\x93"}, + {"ultri", 9720, "\xe2\x97\xb8"}, + {"rhov", 1009, "\xcf\xb1"}, + {"TildeEqual", 8771, "\xe2\x89\x83"}, + {"jukcy", 1108, "\xd1\x94"}, + {"perp", 8869, "\xe2\x8a\xa5"}, + {"capbrcup", 10825, "\xe2\xa9\x89"}, + {"ltrie", 8884, "\xe2\x8a\xb4"}, + {"LessTilde", 8818, "\xe2\x89\xb2"}, + {"popf", 120161, "\xf0\x9d\x95\xa1"}, + {"dbkarow", 10511, "\xe2\xa4\x8f"}, + {"roang", 10221, "\xe2\x9f\xad"}, + {"brvbar", 166, "\xc2\xa6"}, + {"CenterDot", 183, "\xc2\xb7"}, + {"notindot", 8949, "\xe2\x8b\xb5\xcc\xb8"}, + {"supmult", 10946, "\xe2\xab\x82"}, + {"multimap", 8888, "\xe2\x8a\xb8"}, + {"frac34", 190, "\xc2\xbe"}, + {"mapsto", 8614, "\xe2\x86\xa6"}, + {"flat", 9837, "\xe2\x99\xad"}, + {"updownarrow", 8597, "\xe2\x86\x95"}, + {"gne", 10888, "\xe2\xaa\x88"}, + {"nrarrc", 10547, "\xe2\xa4\xb3\xcc\xb8"}, + {"suphsol", 10185, "\xe2\x9f\x89"}, + {"nGtv", 8811, "\xe2\x89\xab\xcc\xb8"}, + {"hopf", 120153, "\xf0\x9d\x95\x99"}, + {"pointint", 10773, "\xe2\xa8\x95"}, + {"glj", 10916, "\xe2\xaa\xa4"}, + {"LeftDoubleBracket", 10214, "\xe2\x9f\xa6"}, + {"NotSupersetEqual", 8841, "\xe2\x8a\x89"}, + {"dot", 729, "\xcb\x99"}, + {"tbrk", 9140, "\xe2\x8e\xb4"}, + {"LeftUpDownVector", 10577, "\xe2\xa5\x91"}, + {"uml", 168, "\xc2\xa8"}, + {"bbrk", 9141, "\xe2\x8e\xb5"}, + {"nearrow", 8599, "\xe2\x86\x97"}, + {"backsimeq", 8909, "\xe2\x8b\x8d"}, + {"dblac", 733, "\xcb\x9d"}, + {"circleddash", 8861, "\xe2\x8a\x9d"}, + {"ldsh", 8626, "\xe2\x86\xb2"}, + {"sce", 10928, "\xe2\xaa\xb0"}, + {"angst", 197, "\xc3\x85"}, + {"yen", 165, "\xc2\xa5"}, + {"nsupE", 10950, "\xe2\xab\x86\xcc\xb8"}, + {"Uscr", 119984, "\xf0\x9d\x92\xb0"}, + {"subplus", 10943, "\xe2\xaa\xbf"}, + {"nleqq", 8806, "\xe2\x89\xa6\xcc\xb8"}, + {"nprcue", 8928, "\xe2\x8b\xa0"}, + {"Ocirc", 212, "\xc3\x94"}, + {"disin", 8946, "\xe2\x8b\xb2"}, + {"EqualTilde", 8770, "\xe2\x89\x82"}, + {"YUcy", 1070, "\xd0\xae"}, + {"Kscr", 119974, "\xf0\x9d\x92\xa6"}, + {"lg", 8822, "\xe2\x89\xb6"}, + {"nLeftrightarrow", 8654, "\xe2\x87\x8e"}, + {"eplus", 10865, "\xe2\xa9\xb1"}, + {"les", 10877, "\xe2\xa9\xbd"}, + {"sfr", 120112, "\xf0\x9d\x94\xb0"}, + {"HumpDownHump", 8782, "\xe2\x89\x8e"}, + {"Fouriertrf", 8497, "\xe2\x84\xb1"}, + {"Updownarrow", 8661, "\xe2\x87\x95"}, + {"nrarr", 8603, "\xe2\x86\x9b"}, + {"radic", 8730, "\xe2\x88\x9a"}, + {"gnap", 10890, "\xe2\xaa\x8a"}, + {"zeta", 950, "\xce\xb6"}, + {"Qscr", 119980, "\xf0\x9d\x92\xac"}, + {"NotRightTriangleEqual", 8941, "\xe2\x8b\xad"}, + {"nshortmid", 8740, "\xe2\x88\xa4"}, + {"SHCHcy", 1065, "\xd0\xa9"}, + {"piv", 982, "\xcf\x96"}, + {"angmsdaa", 10664, "\xe2\xa6\xa8"}, + {"curlywedge", 8911, "\xe2\x8b\x8f"}, + {"sqcaps", 8851, "\xe2\x8a\x93\xef\xb8\x80"}, + {"sum", 8721, "\xe2\x88\x91"}, + {"rarrtl", 8611, "\xe2\x86\xa3"}, + {"gescc", 10921, "\xe2\xaa\xa9"}, + {"sup", 8835, "\xe2\x8a\x83"}, + {"smid", 8739, "\xe2\x88\xa3"}, + {"cularr", 8630, "\xe2\x86\xb6"}, + {"olcross", 10683, "\xe2\xa6\xbb"}, + {"GT", 62, "\x3e"}, + {"scap", 10936, "\xe2\xaa\xb8"}, + {"capcup", 10823, "\xe2\xa9\x87"}, + {"NotSquareSubsetEqual", 8930, "\xe2\x8b\xa2"}, + {"uhblk", 9600, "\xe2\x96\x80"}, + {"latail", 10521, "\xe2\xa4\x99"}, + {"smtes", 10924, "\xe2\xaa\xac\xef\xb8\x80"}, + {"RoundImplies", 10608, "\xe2\xa5\xb0"}, + {"wreath", 8768, "\xe2\x89\x80"}, + {"curlyvee", 8910, "\xe2\x8b\x8e"}, + {"uscr", 120010, "\xf0\x9d\x93\x8a"}, + {"nleftrightarrow", 8622, "\xe2\x86\xae"}, + {"ucy", 1091, "\xd1\x83"}, + {"nvge", 8805, "\xe2\x89\xa5\xe2\x83\x92"}, + {"bnot", 8976, "\xe2\x8c\x90"}, + {"alefsym", 8501, "\xe2\x84\xb5"}, + {"star", 9734, "\xe2\x98\x86"}, + {"boxHd", 9572, "\xe2\x95\xa4"}, + {"vsubnE", 10955, "\xe2\xab\x8b\xef\xb8\x80"}, + {"Popf", 8473, "\xe2\x84\x99"}, + {"simgE", 10912, "\xe2\xaa\xa0"}, + {"upsilon", 965, "\xcf\x85"}, + {"NoBreak", 8288, "\xe2\x81\xa0"}, + {"realine", 8475, "\xe2\x84\x9b"}, + {"frac38", 8540, "\xe2\x85\x9c"}, + {"YAcy", 1071, "\xd0\xaf"}, + {"bnequiv", 8801, "\xe2\x89\xa1\xe2\x83\xa5"}, + {"cudarrr", 10549, "\xe2\xa4\xb5"}, + {"lsime", 10893, "\xe2\xaa\x8d"}, + {"lowbar", 95, "\x5f"}, + {"utdot", 8944, "\xe2\x8b\xb0"}, + {"ReverseElement", 8715, "\xe2\x88\x8b"}, + {"nshortparallel", 8742, "\xe2\x88\xa6"}, + {"DJcy", 1026, "\xd0\x82"}, + {"nsube", 8840, "\xe2\x8a\x88"}, + {"VDash", 8875, "\xe2\x8a\xab"}, + {"Ncaron", 327, "\xc5\x87"}, + {"LeftUpVector", 8639, "\xe2\x86\xbf"}, + {"Kcy", 1050, "\xd0\x9a"}, + {"NotLeftTriangleEqual", 8940, "\xe2\x8b\xac"}, + {"nvHarr", 10500, "\xe2\xa4\x84"}, + {"lotimes", 10804, "\xe2\xa8\xb4"}, + {"RightFloor", 8971, "\xe2\x8c\x8b"}, + {"succ", 8827, "\xe2\x89\xbb"}, + {"Ucy", 1059, "\xd0\xa3"}, + {"darr", 8595, "\xe2\x86\x93"}, + {"lbarr", 10508, "\xe2\xa4\x8c"}, + {"xfr", 120117, "\xf0\x9d\x94\xb5"}, + {"zopf", 120171, "\xf0\x9d\x95\xab"}, + {"Phi", 934, "\xce\xa6"}, + {"ord", 10845, "\xe2\xa9\x9d"}, + {"iinfin", 10716, "\xe2\xa7\x9c"}, + {"Xfr", 120091, "\xf0\x9d\x94\x9b"}, + {"qint", 10764, "\xe2\xa8\x8c"}, + {"Upsilon", 933, "\xce\xa5"}, + {"NotSubset", 8834, "\xe2\x8a\x82\xe2\x83\x92"}, + {"gfr", 120100, "\xf0\x9d\x94\xa4"}, + {"notnivb", 8958, "\xe2\x8b\xbe"}, + {"Afr", 120068, "\xf0\x9d\x94\x84"}, + {"ge", 8805, "\xe2\x89\xa5"}, + {"iexcl", 161, "\xc2\xa1"}, + {"dfr", 120097, "\xf0\x9d\x94\xa1"}, + {"rsaquo", 8250, "\xe2\x80\xba"}, + {"xcap", 8898, "\xe2\x8b\x82"}, + {"Jopf", 120129, "\xf0\x9d\x95\x81"}, + {"Hstrok", 294, "\xc4\xa6"}, + {"ldca", 10550, "\xe2\xa4\xb6"}, + {"lmoust", 9136, "\xe2\x8e\xb0"}, + {"wcirc", 373, "\xc5\xb5"}, + {"DownRightVector", 8641, "\xe2\x87\x81"}, + {"LessFullEqual", 8806, "\xe2\x89\xa6"}, + {"dotsquare", 8865, "\xe2\x8a\xa1"}, + {"zhcy", 1078, "\xd0\xb6"}, + {"mDDot", 8762, "\xe2\x88\xba"}, + {"Prime", 8243, "\xe2\x80\xb3"}, + {"prec", 8826, "\xe2\x89\xba"}, + {"swnwar", 10538, "\xe2\xa4\xaa"}, + {"COPY", 169, "\xc2\xa9"}, + {"cong", 8773, "\xe2\x89\x85"}, + {"sacute", 347, "\xc5\x9b"}, + {"Nopf", 8469, "\xe2\x84\x95"}, + {"it", 8290, "\xe2\x81\xa2"}, + {"SOFTcy", 1068, "\xd0\xac"}, + {"uuarr", 8648, "\xe2\x87\x88"}, + {"iota", 953, "\xce\xb9"}, + {"notinE", 8953, "\xe2\x8b\xb9\xcc\xb8"}, + {"jfr", 120103, "\xf0\x9d\x94\xa7"}, + {"QUOT", 34, "\x22"}, + {"vsupnE", 10956, "\xe2\xab\x8c\xef\xb8\x80"}, + {"igrave", 236, "\xc3\xac"}, + {"bsim", 8765, "\xe2\x88\xbd"}, + {"npreceq", 10927, "\xe2\xaa\xaf\xcc\xb8"}, + {"zcaron", 382, "\xc5\xbe"}, + {"DD", 8517, "\xe2\x85\x85"}, + {"gamma", 947, "\xce\xb3"}, + {"homtht", 8763, "\xe2\x88\xbb"}, + {"NonBreakingSpace", 160, "\xc2\xa0"}, + {"Proportion", 8759, "\xe2\x88\xb7"}, + {"nedot", 8784, "\xe2\x89\x90\xcc\xb8"}, + {"nabla", 8711, "\xe2\x88\x87"}, + {"ac", 8766, "\xe2\x88\xbe"}, + {"nsupe", 8841, "\xe2\x8a\x89"}, + {"ell", 8467, "\xe2\x84\x93"}, + {"boxvR", 9566, "\xe2\x95\x9e"}, + {"LowerRightArrow", 8600, "\xe2\x86\x98"}, + {"boxHu", 9575, "\xe2\x95\xa7"}, + {"lE", 8806, "\xe2\x89\xa6"}, + {"dzigrarr", 10239, "\xe2\x9f\xbf"}, + {"rfloor", 8971, "\xe2\x8c\x8b"}, + {"gneq", 10888, "\xe2\xaa\x88"}, + {"rightleftharpoons", 8652, "\xe2\x87\x8c"}, + {"gtquest", 10876, "\xe2\xa9\xbc"}, + {"searhk", 10533, "\xe2\xa4\xa5"}, + {"gesdoto", 10882, "\xe2\xaa\x82"}, + {"cross", 10007, "\xe2\x9c\x97"}, + {"rdquo", 8221, "\xe2\x80\x9d"}, + {"sqsupset", 8848, "\xe2\x8a\x90"}, + {"divonx", 8903, "\xe2\x8b\x87"}, + {"lat", 10923, "\xe2\xaa\xab"}, + {"rmoustache", 9137, "\xe2\x8e\xb1"}, + {"succapprox", 10936, "\xe2\xaa\xb8"}, + {"nhpar", 10994, "\xe2\xab\xb2"}, + {"sharp", 9839, "\xe2\x99\xaf"}, + {"lrcorner", 8991, "\xe2\x8c\x9f"}, + {"Vscr", 119985, "\xf0\x9d\x92\xb1"}, + {"varsigma", 962, "\xcf\x82"}, + {"bsolb", 10693, "\xe2\xa7\x85"}, + {"cupcap", 10822, "\xe2\xa9\x86"}, + {"leftrightarrow", 8596, "\xe2\x86\x94"}, + {"LeftTee", 8867, "\xe2\x8a\xa3"}, + {"Sqrt", 8730, "\xe2\x88\x9a"}, + {"Odblac", 336, "\xc5\x90"}, + {"ocir", 8858, "\xe2\x8a\x9a"}, + {"eqslantless", 10901, "\xe2\xaa\x95"}, + {"supedot", 10948, "\xe2\xab\x84"}, + {"intercal", 8890, "\xe2\x8a\xba"}, + {"Gbreve", 286, "\xc4\x9e"}, + {"xrArr", 10233, "\xe2\x9f\xb9"}, + {"NotTildeEqual", 8772, "\xe2\x89\x84"}, + {"Bfr", 120069, "\xf0\x9d\x94\x85"}, + {"Iuml", 207, "\xc3\x8f"}, + {"leg", 8922, "\xe2\x8b\x9a"}, + {"boxhU", 9576, "\xe2\x95\xa8"}, + {"Gopf", 120126, "\xf0\x9d\x94\xbe"}, + {"af", 8289, "\xe2\x81\xa1"}, + {"xwedge", 8896, "\xe2\x8b\x80"}, + {"precapprox", 10935, "\xe2\xaa\xb7"}, + {"lcedil", 316, "\xc4\xbc"}, + {"between", 8812, "\xe2\x89\xac"}, + {"Oslash", 216, "\xc3\x98"}, + {"breve", 728, "\xcb\x98"}, + {"caps", 8745, "\xe2\x88\xa9\xef\xb8\x80"}, + {"vangrt", 10652, "\xe2\xa6\x9c"}, + {"lagran", 8466, "\xe2\x84\x92"}, + {"kopf", 120156, "\xf0\x9d\x95\x9c"}, + {"ReverseUpEquilibrium", 10607, "\xe2\xa5\xaf"}, + {"nlsim", 8820, "\xe2\x89\xb4"}, + {"Cap", 8914, "\xe2\x8b\x92"}, + {"angmsdac", 10666, "\xe2\xa6\xaa"}, + {"iocy", 1105, "\xd1\x91"}, + {"seswar", 10537, "\xe2\xa4\xa9"}, + {"dzcy", 1119, "\xd1\x9f"}, + {"nsubset", 8834, "\xe2\x8a\x82\xe2\x83\x92"}, + {"cup", 8746, "\xe2\x88\xaa"}, + {"npar", 8742, "\xe2\x88\xa6"}, + {"late", 10925, "\xe2\xaa\xad"}, + {"plussim", 10790, "\xe2\xa8\xa6"}, + {"Darr", 8609, "\xe2\x86\xa1"}, + {"nexist", 8708, "\xe2\x88\x84"}, + {"cent", 162, "\xc2\xa2"}, + {"khcy", 1093, "\xd1\x85"}, + {"smallsetminus", 8726, "\xe2\x88\x96"}, + {"ycirc", 375, "\xc5\xb7"}, + {"lharu", 8636, "\xe2\x86\xbc"}, + {"upuparrows", 8648, "\xe2\x87\x88"}, + {"sigmaf", 962, "\xcf\x82"}, + {"nltri", 8938, "\xe2\x8b\xaa"}, + {"mstpos", 8766, "\xe2\x88\xbe"}, + {"Zopf", 8484, "\xe2\x84\xa4"}, + {"dwangle", 10662, "\xe2\xa6\xa6"}, + {"bowtie", 8904, "\xe2\x8b\x88"}, + {"Dfr", 120071, "\xf0\x9d\x94\x87"}, + {"iacute", 237, "\xc3\xad"}, + {"njcy", 1114, "\xd1\x9a"}, + {"cfr", 120096, "\xf0\x9d\x94\xa0"}, + {"TripleDot", 8411, "\xe2\x83\x9b"}, + {"Or", 10836, "\xe2\xa9\x94"}, + {"blk34", 9619, "\xe2\x96\x93"}, + {"equiv", 8801, "\xe2\x89\xa1"}, + {"fflig", 64256, "\xef\xac\x80"}, + {"Rang", 10219, "\xe2\x9f\xab"}, + {"Wopf", 120142, "\xf0\x9d\x95\x8e"}, + {"boxUl", 9564, "\xe2\x95\x9c"}, + {"frac12", 189, "\xc2\xbd"}, + {"clubs", 9827, "\xe2\x99\xa3"}, + {"amalg", 10815, "\xe2\xa8\xbf"}, + {"Lang", 10218, "\xe2\x9f\xaa"}, + {"asymp", 8776, "\xe2\x89\x88"}, + {"models", 8871, "\xe2\x8a\xa7"}, + {"emptyset", 8709, "\xe2\x88\x85"}, + {"Tscr", 119983, "\xf0\x9d\x92\xaf"}, + {"nleftarrow", 8602, "\xe2\x86\x9a"}, + {"Omacr", 332, "\xc5\x8c"}, + {"gtrarr", 10616, "\xe2\xa5\xb8"}, + {"excl", 33, "\x21"}, + {"rarrw", 8605, "\xe2\x86\x9d"}, + {"abreve", 259, "\xc4\x83"}, + {"CircleTimes", 8855, "\xe2\x8a\x97"}, + {"aopf", 120146, "\xf0\x9d\x95\x92"}, + {"eqvparsl", 10725, "\xe2\xa7\xa5"}, + {"boxv", 9474, "\xe2\x94\x82"}, + {"SuchThat", 8715, "\xe2\x88\x8b"}, + {"varphi", 981, "\xcf\x95"}, + {"Ropf", 8477, "\xe2\x84\x9d"}, + {"rscr", 120007, "\xf0\x9d\x93\x87"}, + {"Rrightarrow", 8667, "\xe2\x87\x9b"}, + {"equest", 8799, "\xe2\x89\x9f"}, + {"ntilde", 241, "\xc3\xb1"}, + {"Escr", 8496, "\xe2\x84\xb0"}, + {"Lopf", 120131, "\xf0\x9d\x95\x83"}, + {"GreaterGreater", 10914, "\xe2\xaa\xa2"}, + {"pluscir", 10786, "\xe2\xa8\xa2"}, + {"nsupset", 8835, "\xe2\x8a\x83\xe2\x83\x92"}, + {"uArr", 8657, "\xe2\x87\x91"}, + {"nwarhk", 10531, "\xe2\xa4\xa3"}, + {"Ycirc", 374, "\xc5\xb6"}, + {"tdot", 8411, "\xe2\x83\x9b"}, + {"circledS", 9416, "\xe2\x93\x88"}, + {"lhard", 8637, "\xe2\x86\xbd"}, + {"iukcy", 1110, "\xd1\x96"}, + {"PrecedesSlantEqual", 8828, "\xe2\x89\xbc"}, + {"Sfr", 120086, "\xf0\x9d\x94\x96"}, + {"egs", 10902, "\xe2\xaa\x96"}, + {"oelig", 339, "\xc5\x93"}, + {"bigtriangledown", 9661, "\xe2\x96\xbd"}, + {"EmptyVerySmallSquare", 9643, "\xe2\x96\xab"}, + {"Backslash", 8726, "\xe2\x88\x96"}, + {"nscr", 120003, "\xf0\x9d\x93\x83"}, + {"uogon", 371, "\xc5\xb3"}, + {"circeq", 8791, "\xe2\x89\x97"}, + {"check", 10003, "\xe2\x9c\x93"}, + {"Sup", 8913, "\xe2\x8b\x91"}, + {"Rcaron", 344, "\xc5\x98"}, + {"lneqq", 8808, "\xe2\x89\xa8"}, + {"lrhar", 8651, "\xe2\x87\x8b"}, + {"ulcorn", 8988, "\xe2\x8c\x9c"}, + {"timesd", 10800, "\xe2\xa8\xb0"}, + {"Sum", 8721, "\xe2\x88\x91"}, + {"varpropto", 8733, "\xe2\x88\x9d"}, + {"Lcaron", 317, "\xc4\xbd"}, + {"lbrkslu", 10637, "\xe2\xa6\x8d"}, + {"AElig", 198, "\xc3\x86"}, + {"varr", 8597, "\xe2\x86\x95"}, + {"nvinfin", 10718, "\xe2\xa7\x9e"}, + {"leq", 8804, "\xe2\x89\xa4"}, + {"biguplus", 10756, "\xe2\xa8\x84"}, + {"rpar", 41, "\x29"}, + {"eng", 331, "\xc5\x8b"}, + {"NegativeThinSpace", 8203, "\xe2\x80\x8b"}, + {"lesssim", 8818, "\xe2\x89\xb2"}, + {"lBarr", 10510, "\xe2\xa4\x8e"}, + {"LeftUpTeeVector", 10592, "\xe2\xa5\xa0"}, + {"gnE", 8809, "\xe2\x89\xa9"}, + {"efr", 120098, "\xf0\x9d\x94\xa2"}, + {"barvee", 8893, "\xe2\x8a\xbd"}, + {"ee", 8519, "\xe2\x85\x87"}, + {"Uogon", 370, "\xc5\xb2"}, + {"gnapprox", 10890, "\xe2\xaa\x8a"}, + {"olcir", 10686, "\xe2\xa6\xbe"}, + {"boxUL", 9565, "\xe2\x95\x9d"}, + {"Gg", 8921, "\xe2\x8b\x99"}, + {"CloseCurlyQuote", 8217, "\xe2\x80\x99"}, + {"leftharpoondown", 8637, "\xe2\x86\xbd"}, + {"vfr", 120115, "\xf0\x9d\x94\xb3"}, + {"gvertneqq", 8809, "\xe2\x89\xa9\xef\xb8\x80"}, + {"ouml", 246, "\xc3\xb6"}, + {"raemptyv", 10675, "\xe2\xa6\xb3"}, + {"Zcaron", 381, "\xc5\xbd"}, + {"scE", 10932, "\xe2\xaa\xb4"}, + {"boxvh", 9532, "\xe2\x94\xbc"}, + {"ominus", 8854, "\xe2\x8a\x96"}, + {"oopf", 120160, "\xf0\x9d\x95\xa0"}, + {"nsucceq", 10928, "\xe2\xaa\xb0\xcc\xb8"}, + {"RBarr", 10512, "\xe2\xa4\x90"}, + {"iprod", 10812, "\xe2\xa8\xbc"}, + {"lvnE", 8808, "\xe2\x89\xa8\xef\xb8\x80"}, + {"andand", 10837, "\xe2\xa9\x95"}, + {"upharpoonright", 8638, "\xe2\x86\xbe"}, + {"ncongdot", 10861, "\xe2\xa9\xad\xcc\xb8"}, + {"drcrop", 8972, "\xe2\x8c\x8c"}, + {"nsimeq", 8772, "\xe2\x89\x84"}, + {"subsub", 10965, "\xe2\xab\x95"}, + {"hardcy", 1098, "\xd1\x8a"}, + {"leqslant", 10877, "\xe2\xa9\xbd"}, + {"uharl", 8639, "\xe2\x86\xbf"}, + {"expectation", 8496, "\xe2\x84\xb0"}, + {"mdash", 8212, "\xe2\x80\x94"}, + {"VerticalTilde", 8768, "\xe2\x89\x80"}, + {"rdldhar", 10601, "\xe2\xa5\xa9"}, + {"leftharpoonup", 8636, "\xe2\x86\xbc"}, + {"mu", 956, "\xce\xbc"}, + {"curarrm", 10556, "\xe2\xa4\xbc"}, + {"Cdot", 266, "\xc4\x8a"}, + {"NotTildeTilde", 8777, "\xe2\x89\x89"}, + {"boxul", 9496, "\xe2\x94\x98"}, + {"planckh", 8462, "\xe2\x84\x8e"}, + {"CapitalDifferentialD", 8517, "\xe2\x85\x85"}, + {"boxDL", 9559, "\xe2\x95\x97"}, + {"cupbrcap", 10824, "\xe2\xa9\x88"}, + {"boxdL", 9557, "\xe2\x95\x95"}, + {"supe", 8839, "\xe2\x8a\x87"}, + {"nvlt", 60, "\x3c\xe2\x83\x92"}, + {"par", 8741, "\xe2\x88\xa5"}, + {"InvisibleComma", 8291, "\xe2\x81\xa3"}, + {"ring", 730, "\xcb\x9a"}, + {"nvap", 8781, "\xe2\x89\x8d\xe2\x83\x92"}, + {"veeeq", 8794, "\xe2\x89\x9a"}, + {"Hfr", 8460, "\xe2\x84\x8c"}, + {"dstrok", 273, "\xc4\x91"}, + {"gesles", 10900, "\xe2\xaa\x94"}, + {"dash", 8208, "\xe2\x80\x90"}, + {"SHcy", 1064, "\xd0\xa8"}, + {"congdot", 10861, "\xe2\xa9\xad"}, + {"imagline", 8464, "\xe2\x84\x90"}, + {"ncy", 1085, "\xd0\xbd"}, + {"bigstar", 9733, "\xe2\x98\x85"}, + {"REG", 174, "\xc2\xae"}, + {"triangleq", 8796, "\xe2\x89\x9c"}, + {"rsqb", 93, "\x5d"}, + {"ddarr", 8650, "\xe2\x87\x8a"}, + {"csub", 10959, "\xe2\xab\x8f"}, + {"quest", 63, "\x3f"}, + {"Star", 8902, "\xe2\x8b\x86"}, + {"LT", 60, "\x3c"}, + {"ncong", 8775, "\xe2\x89\x87"}, + {"prnE", 10933, "\xe2\xaa\xb5"}, + {"bigtriangleup", 9651, "\xe2\x96\xb3"}, + {"Tilde", 8764, "\xe2\x88\xbc"}, + {"ltrif", 9666, "\xe2\x97\x82"}, + {"ldrdhar", 10599, "\xe2\xa5\xa7"}, + {"lcaron", 318, "\xc4\xbe"}, + {"equivDD", 10872, "\xe2\xa9\xb8"}, + {"lHar", 10594, "\xe2\xa5\xa2"}, + {"vBar", 10984, "\xe2\xab\xa8"}, + {"Mopf", 120132, "\xf0\x9d\x95\x84"}, + {"LeftArrow", 8592, "\xe2\x86\x90"}, + {"Rho", 929, "\xce\xa1"}, + {"Ccirc", 264, "\xc4\x88"}, + {"ifr", 120102, "\xf0\x9d\x94\xa6"}, + {"cacute", 263, "\xc4\x87"}, + {"centerdot", 183, "\xc2\xb7"}, + {"dollar", 36, "\x24"}, + {"lang", 10216, "\xe2\x9f\xa8"}, + {"curvearrowright", 8631, "\xe2\x86\xb7"}, + {"half", 189, "\xc2\xbd"}, + {"Ecy", 1069, "\xd0\xad"}, + {"rcub", 125, "\x7d"}, + {"rcy", 1088, "\xd1\x80"}, + {"isins", 8948, "\xe2\x8b\xb4"}, + {"bsolhsub", 10184, "\xe2\x9f\x88"}, + {"boxuL", 9563, "\xe2\x95\x9b"}, + {"shchcy", 1097, "\xd1\x89"}, + {"cwconint", 8754, "\xe2\x88\xb2"}, + {"euro", 8364, "\xe2\x82\xac"}, + {"lesseqqgtr", 10891, "\xe2\xaa\x8b"}, + {"sim", 8764, "\xe2\x88\xbc"}, + {"rarrc", 10547, "\xe2\xa4\xb3"}, + {"boxdl", 9488, "\xe2\x94\x90"}, + {"Epsilon", 917, "\xce\x95"}, + {"iiiint", 10764, "\xe2\xa8\x8c"}, + {"Rightarrow", 8658, "\xe2\x87\x92"}, + {"conint", 8750, "\xe2\x88\xae"}, + {"boxDl", 9558, "\xe2\x95\x96"}, + {"kappav", 1008, "\xcf\xb0"}, + {"profsurf", 8979, "\xe2\x8c\x93"}, + {"auml", 228, "\xc3\xa4"}, + {"heartsuit", 9829, "\xe2\x99\xa5"}, + {"eacute", 233, "\xc3\xa9"}, + {"gt", 62, "\x3e"}, + {"Gcedil", 290, "\xc4\xa2"}, + {"easter", 10862, "\xe2\xa9\xae"}, + {"Tcy", 1058, "\xd0\xa2"}, + {"swarrow", 8601, "\xe2\x86\x99"}, + {"lopf", 120157, "\xf0\x9d\x95\x9d"}, + {"Agrave", 192, "\xc3\x80"}, + {"Aring", 197, "\xc3\x85"}, + {"fpartint", 10765, "\xe2\xa8\x8d"}, + {"xoplus", 10753, "\xe2\xa8\x81"}, + {"LeftDownTeeVector", 10593, "\xe2\xa5\xa1"}, + {"int", 8747, "\xe2\x88\xab"}, + {"Zeta", 918, "\xce\x96"}, + {"loz", 9674, "\xe2\x97\x8a"}, + {"ncup", 10818, "\xe2\xa9\x82"}, + {"napE", 10864, "\xe2\xa9\xb0\xcc\xb8"}, + {"csup", 10960, "\xe2\xab\x90"}, + {"Ncedil", 325, "\xc5\x85"}, + {"cuwed", 8911, "\xe2\x8b\x8f"}, + {"Dot", 168, "\xc2\xa8"}, + {"SquareIntersection", 8851, "\xe2\x8a\x93"}, + {"map", 8614, "\xe2\x86\xa6"}, + {"aelig", 230, "\xc3\xa6"}, + {"RightArrow", 8594, "\xe2\x86\x92"}, + {"rightharpoondown", 8641, "\xe2\x87\x81"}, + {"bNot", 10989, "\xe2\xab\xad"}, + {"nsccue", 8929, "\xe2\x8b\xa1"}, + {"zigrarr", 8669, "\xe2\x87\x9d"}, + {"Sacute", 346, "\xc5\x9a"}, + {"orv", 10843, "\xe2\xa9\x9b"}, + {"RightVectorBar", 10579, "\xe2\xa5\x93"}, + {"nrarrw", 8605, "\xe2\x86\x9d\xcc\xb8"}, + {"nbump", 8782, "\xe2\x89\x8e\xcc\xb8"}, + {"iquest", 191, "\xc2\xbf"}, + {"wr", 8768, "\xe2\x89\x80"}, + {"UpArrow", 8593, "\xe2\x86\x91"}, + {"notinva", 8713, "\xe2\x88\x89"}, + {"ddagger", 8225, "\xe2\x80\xa1"}, + {"nLeftarrow", 8653, "\xe2\x87\x8d"}, + {"rbbrk", 10099, "\xe2\x9d\xb3"}, + {"RightTriangle", 8883, "\xe2\x8a\xb3"}, + {"leqq", 8806, "\xe2\x89\xa6"}, + {"Vert", 8214, "\xe2\x80\x96"}, + {"gesl", 8923, "\xe2\x8b\x9b\xef\xb8\x80"}, + {"LeftTeeVector", 10586, "\xe2\xa5\x9a"}, + {"Union", 8899, "\xe2\x8b\x83"}, + {"sc", 8827, "\xe2\x89\xbb"}, + {"ofr", 120108, "\xf0\x9d\x94\xac"}, + {"quatint", 10774, "\xe2\xa8\x96"}, + {"apacir", 10863, "\xe2\xa9\xaf"}, + {"profalar", 9006, "\xe2\x8c\xae"}, + {"subsetneq", 8842, "\xe2\x8a\x8a"}, + {"Vvdash", 8874, "\xe2\x8a\xaa"}, + {"ohbar", 10677, "\xe2\xa6\xb5"}, + {"Gt", 8811, "\xe2\x89\xab"}, + {"exist", 8707, "\xe2\x88\x83"}, + {"gtrapprox", 10886, "\xe2\xaa\x86"}, + {"euml", 235, "\xc3\xab"}, + {"Equilibrium", 8652, "\xe2\x87\x8c"}, + {"aacute", 225, "\xc3\xa1"}, + {"omid", 10678, "\xe2\xa6\xb6"}, + {"loarr", 8701, "\xe2\x87\xbd"}, + {"SucceedsSlantEqual", 8829, "\xe2\x89\xbd"}, + {"angsph", 8738, "\xe2\x88\xa2"}, + {"nsmid", 8740, "\xe2\x88\xa4"}, + {"lsquor", 8218, "\xe2\x80\x9a"}, + {"cemptyv", 10674, "\xe2\xa6\xb2"}, + {"rAarr", 8667, "\xe2\x87\x9b"}, + {"searr", 8600, "\xe2\x86\x98"}, + {"complexes", 8450, "\xe2\x84\x82"}, + {"UnderParenthesis", 9181, "\xe2\x8f\x9d"}, + {"nparsl", 11005, "\xe2\xab\xbd\xe2\x83\xa5"}, + {"Lacute", 313, "\xc4\xb9"}, + {"deg", 176, "\xc2\xb0"}, + {"Racute", 340, "\xc5\x94"}, + {"Verbar", 8214, "\xe2\x80\x96"}, + {"sqcups", 8852, "\xe2\x8a\x94\xef\xb8\x80"}, + {"Hopf", 8461, "\xe2\x84\x8d"}, + {"naturals", 8469, "\xe2\x84\x95"}, + {"Cedilla", 184, "\xc2\xb8"}, + {"exponentiale", 8519, "\xe2\x85\x87"}, + {"vnsup", 8835, "\xe2\x8a\x83\xe2\x83\x92"}, + {"leftrightarrows", 8646, "\xe2\x87\x86"}, + {"Laplacetrf", 8466, "\xe2\x84\x92"}, + {"vartriangleright", 8883, "\xe2\x8a\xb3"}, + {"rtri", 9657, "\xe2\x96\xb9"}, + {"gE", 8807, "\xe2\x89\xa7"}, + {"SmallCircle", 8728, "\xe2\x88\x98"}, + {"diamondsuit", 9830, "\xe2\x99\xa6"}, + {"Otilde", 213, "\xc3\x95"}, + {"lneq", 10887, "\xe2\xaa\x87"}, + {"lesdoto", 10881, "\xe2\xaa\x81"}, + {"ltquest", 10875, "\xe2\xa9\xbb"}, + {"thinsp", 8201, "\xe2\x80\x89"}, + {"barwed", 8965, "\xe2\x8c\x85"}, + {"elsdot", 10903, "\xe2\xaa\x97"}, + {"circ", 710, "\xcb\x86"}, + {"ni", 8715, "\xe2\x88\x8b"}, + {"mlcp", 10971, "\xe2\xab\x9b"}, + {"Vdash", 8873, "\xe2\x8a\xa9"}, + {"ShortRightArrow", 8594, "\xe2\x86\x92"}, + {"upharpoonleft", 8639, "\xe2\x86\xbf"}, + {"UnderBracket", 9141, "\xe2\x8e\xb5"}, + {"rAtail", 10524, "\xe2\xa4\x9c"}, + {"iopf", 120154, "\xf0\x9d\x95\x9a"}, + {"longleftarrow", 10229, "\xe2\x9f\xb5"}, + {"Zacute", 377, "\xc5\xb9"}, + {"duhar", 10607, "\xe2\xa5\xaf"}, + {"Mfr", 120080, "\xf0\x9d\x94\x90"}, + {"prnap", 10937, "\xe2\xaa\xb9"}, + {"eqcirc", 8790, "\xe2\x89\x96"}, + {"rarrlp", 8620, "\xe2\x86\xac"}, + {"le", 8804, "\xe2\x89\xa4"}, + {"Oscr", 119978, "\xf0\x9d\x92\xaa"}, + {"langd", 10641, "\xe2\xa6\x91"}, + {"Ucirc", 219, "\xc3\x9b"}, + {"precnapprox", 10937, "\xe2\xaa\xb9"}, + {"succcurlyeq", 8829, "\xe2\x89\xbd"}, + {"Tau", 932, "\xce\xa4"}, + {"larr", 8592, "\xe2\x86\x90"}, + {"neArr", 8663, "\xe2\x87\x97"}, + {"subsim", 10951, "\xe2\xab\x87"}, + {"DScy", 1029, "\xd0\x85"}, + {"preccurlyeq", 8828, "\xe2\x89\xbc"}, + {"NotLessLess", 8810, "\xe2\x89\xaa\xcc\xb8"}, + {"succnapprox", 10938, "\xe2\xaa\xba"}, + {"prcue", 8828, "\xe2\x89\xbc"}, + {"Downarrow", 8659, "\xe2\x87\x93"}, + {"angmsdah", 10671, "\xe2\xa6\xaf"}, + {"Emacr", 274, "\xc4\x92"}, + {"lsh", 8624, "\xe2\x86\xb0"}, + {"simne", 8774, "\xe2\x89\x86"}, + {"Bumpeq", 8782, "\xe2\x89\x8e"}, + {"RightUpTeeVector", 10588, "\xe2\xa5\x9c"}, + {"Sigma", 931, "\xce\xa3"}, + {"nvltrie", 8884, "\xe2\x8a\xb4\xe2\x83\x92"}, + {"lfr", 120105, "\xf0\x9d\x94\xa9"}, + {"emsp13", 8196, "\xe2\x80\x84"}, + {"parsl", 11005, "\xe2\xab\xbd"}, + {"ucirc", 251, "\xc3\xbb"}, + {"gsiml", 10896, "\xe2\xaa\x90"}, + {"xsqcup", 10758, "\xe2\xa8\x86"}, + {"Omicron", 927, "\xce\x9f"}, + {"gsime", 10894, "\xe2\xaa\x8e"}, + {"circlearrowleft", 8634, "\xe2\x86\xba"}, + {"sqsupe", 8850, "\xe2\x8a\x92"}, + {"supE", 10950, "\xe2\xab\x86"}, + {"dlcrop", 8973, "\xe2\x8c\x8d"}, + {"RightDownTeeVector", 10589, "\xe2\xa5\x9d"}, + {"Colone", 10868, "\xe2\xa9\xb4"}, + {"awconint", 8755, "\xe2\x88\xb3"}, + {"smte", 10924, "\xe2\xaa\xac"}, + {"lEg", 10891, "\xe2\xaa\x8b"}, + {"circledast", 8859, "\xe2\x8a\x9b"}, + {"ecolon", 8789, "\xe2\x89\x95"}, + {"rect", 9645, "\xe2\x96\xad"}, + {"Equal", 10869, "\xe2\xa9\xb5"}, + {"nwnear", 10535, "\xe2\xa4\xa7"}, + {"capdot", 10816, "\xe2\xa9\x80"}, + {"straightphi", 981, "\xcf\x95"}, + {"forkv", 10969, "\xe2\xab\x99"}, + {"ZHcy", 1046, "\xd0\x96"}, + {"Element", 8712, "\xe2\x88\x88"}, + {"rthree", 8908, "\xe2\x8b\x8c"}, + {"vzigzag", 10650, "\xe2\xa6\x9a"}, + {"hybull", 8259, "\xe2\x81\x83"}, + {"intprod", 10812, "\xe2\xa8\xbc"}, + {"HumpEqual", 8783, "\xe2\x89\x8f"}, + {"bigsqcup", 10758, "\xe2\xa8\x86"}, + {"mp", 8723, "\xe2\x88\x93"}, + {"lescc", 10920, "\xe2\xaa\xa8"}, + {"NotPrecedes", 8832, "\xe2\x8a\x80"}, + {"wedge", 8743, "\xe2\x88\xa7"}, + {"Supset", 8913, "\xe2\x8b\x91"}, + {"pm", 177, "\xc2\xb1"}, + {"kfr", 120104, "\xf0\x9d\x94\xa8"}, + {"ufisht", 10622, "\xe2\xa5\xbe"}, + {"ecaron", 283, "\xc4\x9b"}, + {"chcy", 1095, "\xd1\x87"}, + {"Esim", 10867, "\xe2\xa9\xb3"}, + {"fltns", 9649, "\xe2\x96\xb1"}, + {"nsce", 10928, "\xe2\xaa\xb0\xcc\xb8"}, + {"hookrightarrow", 8618, "\xe2\x86\xaa"}, + {"semi", 59, "\x3b"}, + {"ges", 10878, "\xe2\xa9\xbe"}, + {"approxeq", 8778, "\xe2\x89\x8a"}, + {"rarrsim", 10612, "\xe2\xa5\xb4"}, + {"boxhD", 9573, "\xe2\x95\xa5"}, + {"varpi", 982, "\xcf\x96"}, + {"larrb", 8676, "\xe2\x87\xa4"}, + {"copf", 120148, "\xf0\x9d\x95\x94"}, + {"Dopf", 120123, "\xf0\x9d\x94\xbb"}, + {"LeftVector", 8636, "\xe2\x86\xbc"}, + {"iff", 8660, "\xe2\x87\x94"}, + {"lnap", 10889, "\xe2\xaa\x89"}, + {"NotGreaterFullEqual", 8807, "\xe2\x89\xa7\xcc\xb8"}, + {"varrho", 1009, "\xcf\xb1"}, + {"NotSucceeds", 8833, "\xe2\x8a\x81"}, + {"ltrPar", 10646, "\xe2\xa6\x96"}, + {"nlE", 8806, "\xe2\x89\xa6\xcc\xb8"}, + {"Zfr", 8488, "\xe2\x84\xa8"}, + {"LeftArrowBar", 8676, "\xe2\x87\xa4"}, + {"boxplus", 8862, "\xe2\x8a\x9e"}, + {"sqsube", 8849, "\xe2\x8a\x91"}, + {"Re", 8476, "\xe2\x84\x9c"}, + {"Wfr", 120090, "\xf0\x9d\x94\x9a"}, + {"epsi", 949, "\xce\xb5"}, + {"oacute", 243, "\xc3\xb3"}, + {"bdquo", 8222, "\xe2\x80\x9e"}, + {"wscr", 120012, "\xf0\x9d\x93\x8c"}, + {"bullet", 8226, "\xe2\x80\xa2"}, + {"frown", 8994, "\xe2\x8c\xa2"}, + {"siml", 10909, "\xe2\xaa\x9d"}, + {"Rarr", 8608, "\xe2\x86\xa0"}, + {"Scaron", 352, "\xc5\xa0"}, + {"gtreqqless", 10892, "\xe2\xaa\x8c"}, + {"Larr", 8606, "\xe2\x86\x9e"}, + {"notniva", 8716, "\xe2\x88\x8c"}, + {"gg", 8811, "\xe2\x89\xab"}, + {"phmmat", 8499, "\xe2\x84\xb3"}, + {"boxVL", 9571, "\xe2\x95\xa3"}, + {"sigmav", 962, "\xcf\x82"}, + {"order", 8500, "\xe2\x84\xb4"}, + {"subsup", 10963, "\xe2\xab\x93"}, + {"afr", 120094, "\xf0\x9d\x94\x9e"}, + {"lbrace", 123, "\x7b"}, + {"urcorn", 8989, "\xe2\x8c\x9d"}, + {"Im", 8465, "\xe2\x84\x91"}, + {"CounterClockwiseContourIntegral", 8755, "\xe2\x88\xb3"}, + {"lne", 10887, "\xe2\xaa\x87"}, + {"chi", 967, "\xcf\x87"}, + {"cudarrl", 10552, "\xe2\xa4\xb8"}, + {"ang", 8736, "\xe2\x88\xa0"}, + {"isindot", 8949, "\xe2\x8b\xb5"}, + {"Lfr", 120079, "\xf0\x9d\x94\x8f"}, + {"Rsh", 8625, "\xe2\x86\xb1"}, + {"Ocy", 1054, "\xd0\x9e"}, + {"nvrArr", 10499, "\xe2\xa4\x83"}, + {"otimes", 8855, "\xe2\x8a\x97"}, + {"eqslantgtr", 10902, "\xe2\xaa\x96"}, + {"Rfr", 8476, "\xe2\x84\x9c"}, + {"blacktriangleleft", 9666, "\xe2\x97\x82"}, + {"Lsh", 8624, "\xe2\x86\xb0"}, + {"boxvr", 9500, "\xe2\x94\x9c"}, + {"scedil", 351, "\xc5\x9f"}, + {"iuml", 239, "\xc3\xaf"}, + {"NJcy", 1034, "\xd0\x8a"}, + {"Dagger", 8225, "\xe2\x80\xa1"}, + {"rarrap", 10613, "\xe2\xa5\xb5"}, + {"udblac", 369, "\xc5\xb1"}, + {"Sopf", 120138, "\xf0\x9d\x95\x8a"}, + {"scnsim", 8937, "\xe2\x8b\xa9"}, + {"hbar", 8463, "\xe2\x84\x8f"}, + {"frac15", 8533, "\xe2\x85\x95"}, + {"sup3", 179, "\xc2\xb3"}, + {"NegativeThickSpace", 8203, "\xe2\x80\x8b"}, + {"npr", 8832, "\xe2\x8a\x80"}, + {"doteq", 8784, "\xe2\x89\x90"}, + {"subrarr", 10617, "\xe2\xa5\xb9"}, + {"SquareSubset", 8847, "\xe2\x8a\x8f"}, + {"vprop", 8733, "\xe2\x88\x9d"}, + {"OpenCurlyQuote", 8216, "\xe2\x80\x98"}, + {"supseteq", 8839, "\xe2\x8a\x87"}, + {"nRightarrow", 8655, "\xe2\x87\x8f"}, + {"Longleftarrow", 10232, "\xe2\x9f\xb8"}, + {"lsquo", 8216, "\xe2\x80\x98"}, + {"hstrok", 295, "\xc4\xa7"}, + {"NotTilde", 8769, "\xe2\x89\x81"}, + {"ogt", 10689, "\xe2\xa7\x81"}, + {"block", 9608, "\xe2\x96\x88"}, + {"minusd", 8760, "\xe2\x88\xb8"}, + {"esdot", 8784, "\xe2\x89\x90"}, + {"nsim", 8769, "\xe2\x89\x81"}, + {"scsim", 8831, "\xe2\x89\xbf"}, + {"boxVl", 9570, "\xe2\x95\xa2"}, + {"ltimes", 8905, "\xe2\x8b\x89"}, + {"thkap", 8776, "\xe2\x89\x88"}, + {"vnsub", 8834, "\xe2\x8a\x82\xe2\x83\x92"}, + {"thetasym", 977, "\xcf\x91"}, + {"eopf", 120150, "\xf0\x9d\x95\x96"}, + {"image", 8465, "\xe2\x84\x91"}, + {"doteqdot", 8785, "\xe2\x89\x91"}, + {"Udblac", 368, "\xc5\xb0"}, + {"gnsim", 8935, "\xe2\x8b\xa7"}, + {"yicy", 1111, "\xd1\x97"}, + {"vopf", 120167, "\xf0\x9d\x95\xa7"}, + {"DDotrahd", 10513, "\xe2\xa4\x91"}, + {"Iota", 921, "\xce\x99"}, + {"GJcy", 1027, "\xd0\x83"}, + {"rightthreetimes", 8908, "\xe2\x8b\x8c"}, + {"nrtri", 8939, "\xe2\x8b\xab"}, + {"TildeFullEqual", 8773, "\xe2\x89\x85"}, + {"Dcaron", 270, "\xc4\x8e"}, + {"ccaron", 269, "\xc4\x8d"}, + {"lacute", 314, "\xc4\xba"}, + {"VerticalBar", 8739, "\xe2\x88\xa3"}, + {"Igrave", 204, "\xc3\x8c"}, + {"boxH", 9552, "\xe2\x95\x90"}, + {"Pfr", 120083, "\xf0\x9d\x94\x93"}, + {"equals", 61, "\x3d"}, + {"rbrack", 93, "\x5d"}, + {"OverParenthesis", 9180, "\xe2\x8f\x9c"}, + {"in", 8712, "\xe2\x88\x88"}, + {"llcorner", 8990, "\xe2\x8c\x9e"}, + {"mcomma", 10793, "\xe2\xa8\xa9"}, + {"NotGreater", 8815, "\xe2\x89\xaf"}, + {"midcir", 10992, "\xe2\xab\xb0"}, + {"Edot", 278, "\xc4\x96"}, + {"oplus", 8853, "\xe2\x8a\x95"}, + {"geqq", 8807, "\xe2\x89\xa7"}, + {"curvearrowleft", 8630, "\xe2\x86\xb6"}, + {"Poincareplane", 8460, "\xe2\x84\x8c"}, + {"yscr", 120014, "\xf0\x9d\x93\x8e"}, + {"ccaps", 10829, "\xe2\xa9\x8d"}, + {"rpargt", 10644, "\xe2\xa6\x94"}, + {"topfork", 10970, "\xe2\xab\x9a"}, + {"Gamma", 915, "\xce\x93"}, + {"umacr", 363, "\xc5\xab"}, + {"frac13", 8531, "\xe2\x85\x93"}, + {"cirfnint", 10768, "\xe2\xa8\x90"}, + {"xlArr", 10232, "\xe2\x9f\xb8"}, + {"digamma", 989, "\xcf\x9d"}, + {"Hat", 94, "\x5e"}, + {"lates", 10925, "\xe2\xaa\xad\xef\xb8\x80"}, + {"lgE", 10897, "\xe2\xaa\x91"}, + {"commat", 64, "\x40"}, + {"NotPrecedesSlantEqual", 8928, "\xe2\x8b\xa0"}, + {"phone", 9742, "\xe2\x98\x8e"}, + {"Ecirc", 202, "\xc3\x8a"}, + {"lt", 60, "\x3c"}, + {"intcal", 8890, "\xe2\x8a\xba"}, + {"xdtri", 9661, "\xe2\x96\xbd"}, + {"Abreve", 258, "\xc4\x82"}, + {"gopf", 120152, "\xf0\x9d\x95\x98"}, + {"Xopf", 120143, "\xf0\x9d\x95\x8f"}, + {"Iacute", 205, "\xc3\x8d"}, + {"Aopf", 120120, "\xf0\x9d\x94\xb8"}, + {"gbreve", 287, "\xc4\x9f"}, + {"nleq", 8816, "\xe2\x89\xb0"}, + {"xopf", 120169, "\xf0\x9d\x95\xa9"}, + {"SquareSupersetEqual", 8850, "\xe2\x8a\x92"}, + {"NotLessTilde", 8820, "\xe2\x89\xb4"}, + {"SubsetEqual", 8838, "\xe2\x8a\x86"}, + {"Sc", 10940, "\xe2\xaa\xbc"}, + {"sdote", 10854, "\xe2\xa9\xa6"}, + {"loplus", 10797, "\xe2\xa8\xad"}, + {"zfr", 120119, "\xf0\x9d\x94\xb7"}, + {"subseteqq", 10949, "\xe2\xab\x85"}, + {"Vdashl", 10982, "\xe2\xab\xa6"}, + {"integers", 8484, "\xe2\x84\xa4"}, + {"Umacr", 362, "\xc5\xaa"}, + {"dopf", 120149, "\xf0\x9d\x95\x95"}, + {"RightDownVectorBar", 10581, "\xe2\xa5\x95"}, + {"angmsdaf", 10669, "\xe2\xa6\xad"}, + {"Jfr", 120077, "\xf0\x9d\x94\x8d"}, + {"bernou", 8492, "\xe2\x84\xac"}, + {"lceil", 8968, "\xe2\x8c\x88"}, + {"nvsim", 8764, "\xe2\x88\xbc\xe2\x83\x92"}, + {"NotSucceedsSlantEqual", 8929, "\xe2\x8b\xa1"}, + {"hearts", 9829, "\xe2\x99\xa5"}, + {"vee", 8744, "\xe2\x88\xa8"}, + {"LJcy", 1033, "\xd0\x89"}, + {"nlt", 8814, "\xe2\x89\xae"}, + {"because", 8757, "\xe2\x88\xb5"}, + {"hairsp", 8202, "\xe2\x80\x8a"}, + {"comma", 44, "\x2c"}, + {"iecy", 1077, "\xd0\xb5"}, + {"npre", 10927, "\xe2\xaa\xaf\xcc\xb8"}, + {"NotSquareSubset", 8847, "\xe2\x8a\x8f\xcc\xb8"}, + {"mscr", 120002, "\xf0\x9d\x93\x82"}, + {"jopf", 120155, "\xf0\x9d\x95\x9b"}, + {"bumpE", 10926, "\xe2\xaa\xae"}, + {"thicksim", 8764, "\xe2\x88\xbc"}, + {"Nfr", 120081, "\xf0\x9d\x94\x91"}, + {"yucy", 1102, "\xd1\x8e"}, + {"notinvc", 8950, "\xe2\x8b\xb6"}, + {"lstrok", 322, "\xc5\x82"}, + {"robrk", 10215, "\xe2\x9f\xa7"}, + {"LeftTriangleBar", 10703, "\xe2\xa7\x8f"}, + {"hksearow", 10533, "\xe2\xa4\xa5"}, + {"bigcap", 8898, "\xe2\x8b\x82"}, + {"udhar", 10606, "\xe2\xa5\xae"}, + {"Yscr", 119988, "\xf0\x9d\x92\xb4"}, + {"smeparsl", 10724, "\xe2\xa7\xa4"}, + {"NotLess", 8814, "\xe2\x89\xae"}, + {"dcaron", 271, "\xc4\x8f"}, + {"ange", 10660, "\xe2\xa6\xa4"}, + {"dHar", 10597, "\xe2\xa5\xa5"}, + {"UpperRightArrow", 8599, "\xe2\x86\x97"}, + {"trpezium", 9186, "\xe2\x8f\xa2"}, + {"boxminus", 8863, "\xe2\x8a\x9f"}, + {"notni", 8716, "\xe2\x88\x8c"}, + {"dtrif", 9662, "\xe2\x96\xbe"}, + {"nhArr", 8654, "\xe2\x87\x8e"}, + {"larrpl", 10553, "\xe2\xa4\xb9"}, + {"simeq", 8771, "\xe2\x89\x83"}, + {"geqslant", 10878, "\xe2\xa9\xbe"}, + {"RightUpVectorBar", 10580, "\xe2\xa5\x94"}, + {"nsc", 8833, "\xe2\x8a\x81"}, + {"div", 247, "\xc3\xb7"}, + {"orslope", 10839, "\xe2\xa9\x97"}, + {"lparlt", 10643, "\xe2\xa6\x93"}, + {"trie", 8796, "\xe2\x89\x9c"}, + {"cirmid", 10991, "\xe2\xab\xaf"}, + {"wp", 8472, "\xe2\x84\x98"}, + {"dagger", 8224, "\xe2\x80\xa0"}, + {"utri", 9653, "\xe2\x96\xb5"}, + {"supnE", 10956, "\xe2\xab\x8c"}, + {"eg", 10906, "\xe2\xaa\x9a"}, + {"LeftDownVector", 8643, "\xe2\x87\x83"}, + {"NotLessEqual", 8816, "\xe2\x89\xb0"}, + {"Bopf", 120121, "\xf0\x9d\x94\xb9"}, + {"LongLeftRightArrow", 10231, "\xe2\x9f\xb7"}, + {"Gfr", 120074, "\xf0\x9d\x94\x8a"}, + {"sqsubseteq", 8849, "\xe2\x8a\x91"}, + {"ograve", 242, "\xc3\xb2"}, + {"larrhk", 8617, "\xe2\x86\xa9"}, + {"sigma", 963, "\xcf\x83"}, + {"NotSquareSupersetEqual", 8931, "\xe2\x8b\xa3"}, + {"gvnE", 8809, "\xe2\x89\xa9\xef\xb8\x80"}, + {"timesbar", 10801, "\xe2\xa8\xb1"}, + {"Iukcy", 1030, "\xd0\x86"}, + {"bscr", 119991, "\xf0\x9d\x92\xb7"}, + {"Exists", 8707, "\xe2\x88\x83"}, + {"tscr", 120009, "\xf0\x9d\x93\x89"}, + {"tcy", 1090, "\xd1\x82"}, + {"nwarr", 8598, "\xe2\x86\x96"}, + {"hoarr", 8703, "\xe2\x87\xbf"}, + {"lnapprox", 10889, "\xe2\xaa\x89"}, + {"nu", 957, "\xce\xbd"}, + {"bcy", 1073, "\xd0\xb1"}, + {"ndash", 8211, "\xe2\x80\x93"}, + {"smt", 10922, "\xe2\xaa\xaa"}, + {"scaron", 353, "\xc5\xa1"}, + {"IOcy", 1025, "\xd0\x81"}, + {"Ifr", 8465, "\xe2\x84\x91"}, + {"cularrp", 10557, "\xe2\xa4\xbd"}, + {"lvertneqq", 8808, "\xe2\x89\xa8\xef\xb8\x80"}, + {"nlarr", 8602, "\xe2\x86\x9a"}, + {"colon", 58, "\x3a"}, + {"ddotseq", 10871, "\xe2\xa9\xb7"}, + {"zacute", 378, "\xc5\xba"}, + {"DoubleVerticalBar", 8741, "\xe2\x88\xa5"}, + {"larrfs", 10525, "\xe2\xa4\x9d"}, + {"NotExists", 8708, "\xe2\x88\x84"}, + {"geq", 8805, "\xe2\x89\xa5"}, + {"Ffr", 120073, "\xf0\x9d\x94\x89"}, + {"divide", 247, "\xc3\xb7"}, + {"blank", 9251, "\xe2\x90\xa3"}, + {"IEcy", 1045, "\xd0\x95"}, + {"ordm", 186, "\xc2\xba"}, + {"fopf", 120151, "\xf0\x9d\x95\x97"}, + {"ecir", 8790, "\xe2\x89\x96"}, + {"complement", 8705, "\xe2\x88\x81"}, + {"top", 8868, "\xe2\x8a\xa4"}, + {"DoubleContourIntegral", 8751, "\xe2\x88\xaf"}, + {"nisd", 8954, "\xe2\x8b\xba"}, + {"bcong", 8780, "\xe2\x89\x8c"}, + {"plusdu", 10789, "\xe2\xa8\xa5"}, + {"TildeTilde", 8776, "\xe2\x89\x88"}, + {"lnE", 8808, "\xe2\x89\xa8"}, + {"DoubleLongRightArrow", 10233, "\xe2\x9f\xb9"}, + {"nsubseteqq", 10949, "\xe2\xab\x85\xcc\xb8"}, + {"DownTeeArrow", 8615, "\xe2\x86\xa7"}, + {"Cscr", 119966, "\xf0\x9d\x92\x9e"}, + {"NegativeVeryThinSpace", 8203, "\xe2\x80\x8b"}, + {"emsp", 8195, "\xe2\x80\x83"}, + {"vartriangleleft", 8882, "\xe2\x8a\xb2"}, + {"ropar", 10630, "\xe2\xa6\x86"}, + {"checkmark", 10003, "\xe2\x9c\x93"}, + {"Ycy", 1067, "\xd0\xab"}, + {"supset", 8835, "\xe2\x8a\x83"}, + {"gneqq", 8809, "\xe2\x89\xa9"}, + {"Lstrok", 321, "\xc5\x81"}, + {"AMP", 38, "\x26"}, + {"acE", 8766, "\xe2\x88\xbe\xcc\xb3"}, + {"sqsupseteq", 8850, "\xe2\x8a\x92"}, + {"nle", 8816, "\xe2\x89\xb0"}, + {"nesear", 10536, "\xe2\xa4\xa8"}, + {"LeftDownVectorBar", 10585, "\xe2\xa5\x99"}, + {"Integral", 8747, "\xe2\x88\xab"}, + {"Beta", 914, "\xce\x92"}, + {"nvdash", 8876, "\xe2\x8a\xac"}, + {"nges", 10878, "\xe2\xa9\xbe\xcc\xb8"}, + {"demptyv", 10673, "\xe2\xa6\xb1"}, + {"eta", 951, "\xce\xb7"}, + {"GreaterSlantEqual", 10878, "\xe2\xa9\xbe"}, + {"ccedil", 231, "\xc3\xa7"}, + {"pfr", 120109, "\xf0\x9d\x94\xad"}, + {"bbrktbrk", 9142, "\xe2\x8e\xb6"}, + {"mcy", 1084, "\xd0\xbc"}, + {"Not", 10988, "\xe2\xab\xac"}, + {"qscr", 120006, "\xf0\x9d\x93\x86"}, + {"zwj", 8205, "\xe2\x80\x8d"}, + {"ntrianglerighteq", 8941, "\xe2\x8b\xad"}, + {"permil", 8240, "\xe2\x80\xb0"}, + {"squarf", 9642, "\xe2\x96\xaa"}, + {"apos", 39, "\x27"}, + {"lrm", 8206, "\xe2\x80\x8e"}, + {"male", 9794, "\xe2\x99\x82"}, + {"agrave", 224, "\xc3\xa0"}, + {"Lt", 8810, "\xe2\x89\xaa"}, + {"capand", 10820, "\xe2\xa9\x84"}, + {"aring", 229, "\xc3\xa5"}, + {"Jukcy", 1028, "\xd0\x84"}, + {"bumpe", 8783, "\xe2\x89\x8f"}, + {"dd", 8518, "\xe2\x85\x86"}, + {"tscy", 1094, "\xd1\x86"}, + {"oS", 9416, "\xe2\x93\x88"}, + {"succeq", 10928, "\xe2\xaa\xb0"}, + {"xharr", 10231, "\xe2\x9f\xb7"}, + {"pluse", 10866, "\xe2\xa9\xb2"}, + {"rfisht", 10621, "\xe2\xa5\xbd"}, + {"HorizontalLine", 9472, "\xe2\x94\x80"}, + {"DiacriticalAcute", 180, "\xc2\xb4"}, + {"hfr", 120101, "\xf0\x9d\x94\xa5"}, + {"preceq", 10927, "\xe2\xaa\xaf"}, + {"rationals", 8474, "\xe2\x84\x9a"}, + {"Auml", 196, "\xc3\x84"}, + {"LeftRightArrow", 8596, "\xe2\x86\x94"}, + {"blacktriangleright", 9656, "\xe2\x96\xb8"}, + {"dharr", 8642, "\xe2\x87\x82"}, + {"isin", 8712, "\xe2\x88\x88"}, + {"ldrushar", 10571, "\xe2\xa5\x8b"}, + {"squ", 9633, "\xe2\x96\xa1"}, + {"rbrksld", 10638, "\xe2\xa6\x8e"}, + {"bigwedge", 8896, "\xe2\x8b\x80"}, + {"swArr", 8665, "\xe2\x87\x99"}, + {"IJlig", 306, "\xc4\xb2"}, + {"harr", 8596, "\xe2\x86\x94"}, + {"range", 10661, "\xe2\xa6\xa5"}, + {"urtri", 9721, "\xe2\x97\xb9"}, + {"NotVerticalBar", 8740, "\xe2\x88\xa4"}, + {"ic", 8291, "\xe2\x81\xa3"}, + {"solbar", 9023, "\xe2\x8c\xbf"}, + {"approx", 8776, "\xe2\x89\x88"}, + {"SquareSuperset", 8848, "\xe2\x8a\x90"}, + {"numsp", 8199, "\xe2\x80\x87"}, + {"nLt", 8810, "\xe2\x89\xaa\xe2\x83\x92"}, + {"tilde", 732, "\xcb\x9c"}, + {"rlarr", 8644, "\xe2\x87\x84"}, + {"langle", 10216, "\xe2\x9f\xa8"}, + {"nleqslant", 10877, "\xe2\xa9\xbd\xcc\xb8"}, + {"Nacute", 323, "\xc5\x83"}, + {"NotLeftTriangle", 8938, "\xe2\x8b\xaa"}, + {"sopf", 120164, "\xf0\x9d\x95\xa4"}, + {"xmap", 10236, "\xe2\x9f\xbc"}, + {"supne", 8843, "\xe2\x8a\x8b"}, + {"Int", 8748, "\xe2\x88\xac"}, + {"nsupseteqq", 10950, "\xe2\xab\x86\xcc\xb8"}, + {"circlearrowright", 8635, "\xe2\x86\xbb"}, + {"NotCongruent", 8802, "\xe2\x89\xa2"}, + {"Scedil", 350, "\xc5\x9e"}, + {"raquo", 187, "\xc2\xbb"}, + {"ycy", 1099, "\xd1\x8b"}, + {"notinvb", 8951, "\xe2\x8b\xb7"}, + {"andv", 10842, "\xe2\xa9\x9a"}, + {"nap", 8777, "\xe2\x89\x89"}, + {"shcy", 1096, "\xd1\x88"}, + {"ssetmn", 8726, "\xe2\x88\x96"}, + {"downarrow", 8595, "\xe2\x86\x93"}, + {"gesdotol", 10884, "\xe2\xaa\x84"}, + {"Congruent", 8801, "\xe2\x89\xa1"}, + {"pound", 163, "\xc2\xa3"}, + {"ZeroWidthSpace", 8203, "\xe2\x80\x8b"}, + {"rdca", 10551, "\xe2\xa4\xb7"}, + {"rmoust", 9137, "\xe2\x8e\xb1"}, + {"zcy", 1079, "\xd0\xb7"}, + {"Square", 9633, "\xe2\x96\xa1"}, + {"subE", 10949, "\xe2\xab\x85"}, + {"infintie", 10717, "\xe2\xa7\x9d"}, + {"Cayleys", 8493, "\xe2\x84\xad"}, + {"lsaquo", 8249, "\xe2\x80\xb9"}, + {"realpart", 8476, "\xe2\x84\x9c"}, + {"nprec", 8832, "\xe2\x8a\x80"}, + {"RightTriangleBar", 10704, "\xe2\xa7\x90"}, + {"Kopf", 120130, "\xf0\x9d\x95\x82"}, + {"Ubreve", 364, "\xc5\xac"}, + {"Uopf", 120140, "\xf0\x9d\x95\x8c"}, + {"trianglelefteq", 8884, "\xe2\x8a\xb4"}, + {"rotimes", 10805, "\xe2\xa8\xb5"}, + {"qfr", 120110, "\xf0\x9d\x94\xae"}, + {"gtcc", 10919, "\xe2\xaa\xa7"}, + {"fnof", 402, "\xc6\x92"}, + {"tritime", 10811, "\xe2\xa8\xbb"}, + {"andslope", 10840, "\xe2\xa9\x98"}, + {"harrw", 8621, "\xe2\x86\xad"}, + {"NotSquareSuperset", 8848, "\xe2\x8a\x90\xcc\xb8"}, + {"Amacr", 256, "\xc4\x80"}, + {"OpenCurlyDoubleQuote", 8220, "\xe2\x80\x9c"}, + {"thorn", 254, "\xc3\xbe"}, + {"ordf", 170, "\xc2\xaa"}, + {"natur", 9838, "\xe2\x99\xae"}, + {"xi", 958, "\xce\xbe"}, + {"infin", 8734, "\xe2\x88\x9e"}, + {"nspar", 8742, "\xe2\x88\xa6"}, + {"Jcy", 1049, "\xd0\x99"}, + {"DownLeftTeeVector", 10590, "\xe2\xa5\x9e"}, + {"rbarr", 10509, "\xe2\xa4\x8d"}, + {"Xi", 926, "\xce\x9e"}, + {"bull", 8226, "\xe2\x80\xa2"}, + {"cuesc", 8927, "\xe2\x8b\x9f"}, + {"backcong", 8780, "\xe2\x89\x8c"}, + {"frac35", 8535, "\xe2\x85\x97"}, + {"hscr", 119997, "\xf0\x9d\x92\xbd"}, + {"LessEqualGreater", 8922, "\xe2\x8b\x9a"}, + {"Implies", 8658, "\xe2\x87\x92"}, + {"ETH", 208, "\xc3\x90"}, + {"Yacute", 221, "\xc3\x9d"}, + {"shy", 173, "\xc2\xad"}, + {"Rarrtl", 10518, "\xe2\xa4\x96"}, + {"sup1", 185, "\xc2\xb9"}, + {"reals", 8477, "\xe2\x84\x9d"}, + {"blacklozenge", 10731, "\xe2\xa7\xab"}, + {"ncedil", 326, "\xc5\x86"}, + {"Lambda", 923, "\xce\x9b"}, + {"uopf", 120166, "\xf0\x9d\x95\xa6"}, + {"bigodot", 10752, "\xe2\xa8\x80"}, + {"ubreve", 365, "\xc5\xad"}, + {"drbkarow", 10512, "\xe2\xa4\x90"}, + {"els", 10901, "\xe2\xaa\x95"}, + {"shortparallel", 8741, "\xe2\x88\xa5"}, + {"Pcy", 1055, "\xd0\x9f"}, + {"dsol", 10742, "\xe2\xa7\xb6"}, + {"supsim", 10952, "\xe2\xab\x88"}, + {"Longrightarrow", 10233, "\xe2\x9f\xb9"}, + {"ThickSpace", 8287, "\xe2\x81\x9f\xe2\x80\x8a"}, + {"Itilde", 296, "\xc4\xa8"}, + {"nparallel", 8742, "\xe2\x88\xa6"}, + {"And", 10835, "\xe2\xa9\x93"}, + {"boxhd", 9516, "\xe2\x94\xac"}, + {"Dashv", 10980, "\xe2\xab\xa4"}, + {"NotSuperset", 8835, "\xe2\x8a\x83\xe2\x83\x92"}, + {"Eta", 919, "\xce\x97"}, + {"Qopf", 8474, "\xe2\x84\x9a"}, + {"period", 46, "\x2e"}, + {"angmsd", 8737, "\xe2\x88\xa1"}, + {"fllig", 64258, "\xef\xac\x82"}, + {"cuvee", 8910, "\xe2\x8b\x8e"}, + {"wedbar", 10847, "\xe2\xa9\x9f"}, + {"Fscr", 8497, "\xe2\x84\xb1"}, + {"veebar", 8891, "\xe2\x8a\xbb"}, + {"Longleftrightarrow", 10234, "\xe2\x9f\xba"}, + {"reg", 174, "\xc2\xae"}, + {"NegativeMediumSpace", 8203, "\xe2\x80\x8b"}, + {"Upsi", 978, "\xcf\x92"}, + {"Mellintrf", 8499, "\xe2\x84\xb3"}, + {"boxHU", 9577, "\xe2\x95\xa9"}, + {"bne", 61, "\x3d\xe2\x83\xa5"}, + {"frac56", 8538, "\xe2\x85\x9a"}, + {"utrif", 9652, "\xe2\x96\xb4"}, + {"LeftTriangle", 8882, "\xe2\x8a\xb2"}, + {"nsime", 8772, "\xe2\x89\x84"}, + {"rcedil", 343, "\xc5\x97"}, + {"aogon", 261, "\xc4\x85"}, + {"uHar", 10595, "\xe2\xa5\xa3"}, + {"ForAll", 8704, "\xe2\x88\x80"}, + {"prE", 10931, "\xe2\xaa\xb3"}, + {"boxV", 9553, "\xe2\x95\x91"}, + {"softcy", 1100, "\xd1\x8c"}, + {"hercon", 8889, "\xe2\x8a\xb9"}, + {"lmoustache", 9136, "\xe2\x8e\xb0"}, + {"Product", 8719, "\xe2\x88\x8f"}, + {"lsimg", 10895, "\xe2\xaa\x8f"}, + {"verbar", 124, "\x7c"}, + {"ofcir", 10687, "\xe2\xa6\xbf"}, + {"curlyeqprec", 8926, "\xe2\x8b\x9e"}, + {"ldquo", 8220, "\xe2\x80\x9c"}, + {"bot", 8869, "\xe2\x8a\xa5"}, + {"Psi", 936, "\xce\xa8"}, + {"OElig", 338, "\xc5\x92"}, + {"DownRightVectorBar", 10583, "\xe2\xa5\x97"}, + {"minusb", 8863, "\xe2\x8a\x9f"}, + {"Iscr", 8464, "\xe2\x84\x90"}, + {"Tcedil", 354, "\xc5\xa2"}, + {"ffilig", 64259, "\xef\xac\x83"}, + {"Gcy", 1043, "\xd0\x93"}, + {"oline", 8254, "\xe2\x80\xbe"}, + {"bottom", 8869, "\xe2\x8a\xa5"}, + {"nVDash", 8879, "\xe2\x8a\xaf"}, + {"lessdot", 8918, "\xe2\x8b\x96"}, + {"cups", 8746, "\xe2\x88\xaa\xef\xb8\x80"}, + {"gla", 10917, "\xe2\xaa\xa5"}, + {"hellip", 8230, "\xe2\x80\xa6"}, + {"hookleftarrow", 8617, "\xe2\x86\xa9"}, + {"Cup", 8915, "\xe2\x8b\x93"}, + {"upsi", 965, "\xcf\x85"}, + {"DownArrowBar", 10515, "\xe2\xa4\x93"}, + {"lowast", 8727, "\xe2\x88\x97"}, + {"profline", 8978, "\xe2\x8c\x92"}, + {"ngsim", 8821, "\xe2\x89\xb5"}, + {"boxhu", 9524, "\xe2\x94\xb4"}, + {"operp", 10681, "\xe2\xa6\xb9"}, + {"cap", 8745, "\xe2\x88\xa9"}, + {"Hcirc", 292, "\xc4\xa4"}, + {"Ncy", 1053, "\xd0\x9d"}, + {"zeetrf", 8488, "\xe2\x84\xa8"}, + {"cuepr", 8926, "\xe2\x8b\x9e"}, + {"supsetneq", 8843, "\xe2\x8a\x8b"}, + {"lfloor", 8970, "\xe2\x8c\x8a"}, + {"ngtr", 8815, "\xe2\x89\xaf"}, + {"ccups", 10828, "\xe2\xa9\x8c"}, + {"pscr", 120005, "\xf0\x9d\x93\x85"}, + {"Cfr", 8493, "\xe2\x84\xad"}, + {"dtri", 9663, "\xe2\x96\xbf"}, + {"icirc", 238, "\xc3\xae"}, + {"leftarrow", 8592, "\xe2\x86\x90"}, + {"vdash", 8866, "\xe2\x8a\xa2"}, + {"leftrightharpoons", 8651, "\xe2\x87\x8b"}, + {"rightrightarrows", 8649, "\xe2\x87\x89"}, + {"strns", 175, "\xc2\xaf"}, + {"intlarhk", 10775, "\xe2\xa8\x97"}, + {"downharpoonright", 8642, "\xe2\x87\x82"}, + {"yacute", 253, "\xc3\xbd"}, + {"boxUr", 9561, "\xe2\x95\x99"}, + {"triangleleft", 9667, "\xe2\x97\x83"}, + {"DiacriticalDot", 729, "\xcb\x99"}, + {"thetav", 977, "\xcf\x91"}, + {"OverBracket", 9140, "\xe2\x8e\xb4"}, + {"PrecedesTilde", 8830, "\xe2\x89\xbe"}, + {"rtrie", 8885, "\xe2\x8a\xb5"}, + {"Scirc", 348, "\xc5\x9c"}, + {"vsupne", 8843, "\xe2\x8a\x8b\xef\xb8\x80"}, + {"OverBrace", 9182, "\xe2\x8f\x9e"}, + {"Yfr", 120092, "\xf0\x9d\x94\x9c"}, + {"scnE", 10934, "\xe2\xaa\xb6"}, + {"simlE", 10911, "\xe2\xaa\x9f"}, + {"Proportional", 8733, "\xe2\x88\x9d"}, + {"edot", 279, "\xc4\x97"}, + {"loang", 10220, "\xe2\x9f\xac"}, + {"gesdot", 10880, "\xe2\xaa\x80"}, + {"DownBreve", 785, "\xcc\x91"}, + {"pcy", 1087, "\xd0\xbf"}, + {"Succeeds", 8827, "\xe2\x89\xbb"}, + {"mfr", 120106, "\xf0\x9d\x94\xaa"}, + {"Leftarrow", 8656, "\xe2\x87\x90"}, + {"boxDr", 9555, "\xe2\x95\x93"}, + {"Nscr", 119977, "\xf0\x9d\x92\xa9"}, + {"diam", 8900, "\xe2\x8b\x84"}, + {"CHcy", 1063, "\xd0\xa7"}, + {"boxdr", 9484, "\xe2\x94\x8c"}, + {"rlm", 8207, "\xe2\x80\x8f"}, + {"Coproduct", 8720, "\xe2\x88\x90"}, + {"RightTeeArrow", 8614, "\xe2\x86\xa6"}, + {"tridot", 9708, "\xe2\x97\xac"}, + {"ldquor", 8222, "\xe2\x80\x9e"}, + {"sol", 47, "\x2f"}, + {"ecirc", 234, "\xc3\xaa"}, + {"DoubleLeftArrow", 8656, "\xe2\x87\x90"}, + {"Gscr", 119970, "\xf0\x9d\x92\xa2"}, + {"ap", 8776, "\xe2\x89\x88"}, + {"rbrke", 10636, "\xe2\xa6\x8c"}, + {"LeftFloor", 8970, "\xe2\x8c\x8a"}, + {"blk12", 9618, "\xe2\x96\x92"}, + {"Conint", 8751, "\xe2\x88\xaf"}, + {"triangledown", 9663, "\xe2\x96\xbf"}, + {"Icy", 1048, "\xd0\x98"}, + {"backprime", 8245, "\xe2\x80\xb5"}, + {"longleftrightarrow", 10231, "\xe2\x9f\xb7"}, + {"ntriangleleft", 8938, "\xe2\x8b\xaa"}, + {"copy", 169, "\xc2\xa9"}, + {"mapstodown", 8615, "\xe2\x86\xa7"}, + {"seArr", 8664, "\xe2\x87\x98"}, + {"ENG", 330, "\xc5\x8a"}, + {"DoubleRightArrow", 8658, "\xe2\x87\x92"}, + {"tfr", 120113, "\xf0\x9d\x94\xb1"}, + {"rharul", 10604, "\xe2\xa5\xac"}, + {"bfr", 120095, "\xf0\x9d\x94\x9f"}, + {"origof", 8886, "\xe2\x8a\xb6"}, + {"Therefore", 8756, "\xe2\x88\xb4"}, + {"glE", 10898, "\xe2\xaa\x92"}, + {"leftarrowtail", 8610, "\xe2\x86\xa2"}, + {"NotEqual", 8800, "\xe2\x89\xa0"}, + {"LeftCeiling", 8968, "\xe2\x8c\x88"}, + {"lArr", 8656, "\xe2\x87\x90"}, + {"subseteq", 8838, "\xe2\x8a\x86"}, + {"larrbfs", 10527, "\xe2\xa4\x9f"}, + {"Gammad", 988, "\xcf\x9c"}, + {"rtriltri", 10702, "\xe2\xa7\x8e"}, + {"Fcy", 1060, "\xd0\xa4"}, + {"Vopf", 120141, "\xf0\x9d\x95\x8d"}, + {"lrarr", 8646, "\xe2\x87\x86"}, + {"delta", 948, "\xce\xb4"}, + {"xodot", 10752, "\xe2\xa8\x80"}, + {"larrtl", 8610, "\xe2\x86\xa2"}, + {"gsim", 8819, "\xe2\x89\xb3"}, + {"ratail", 10522, "\xe2\xa4\x9a"}, + {"vsubne", 8842, "\xe2\x8a\x8a\xef\xb8\x80"}, + {"boxur", 9492, "\xe2\x94\x94"}, + {"succsim", 8831, "\xe2\x89\xbf"}, + {"triplus", 10809, "\xe2\xa8\xb9"}, + {"nless", 8814, "\xe2\x89\xae"}, + {"uharr", 8638, "\xe2\x86\xbe"}, + {"lambda", 955, "\xce\xbb"}, + {"uuml", 252, "\xc3\xbc"}, + {"horbar", 8213, "\xe2\x80\x95"}, + {"ccirc", 265, "\xc4\x89"}, + {"sqcup", 8852, "\xe2\x8a\x94"}, + {"Pscr", 119979, "\xf0\x9d\x92\xab"}, + {"supsup", 10966, "\xe2\xab\x96"}, + {"Cacute", 262, "\xc4\x86"}, + {"upsih", 978, "\xcf\x92"}, + {"precsim", 8830, "\xe2\x89\xbe"}, + {"longrightarrow", 10230, "\xe2\x9f\xb6"}, + {"circledR", 174, "\xc2\xae"}, + {"UpTeeArrow", 8613, "\xe2\x86\xa5"}, + {"bepsi", 1014, "\xcf\xb6"}, + {"oast", 8859, "\xe2\x8a\x9b"}, + {"yfr", 120118, "\xf0\x9d\x94\xb6"}, + {"rdsh", 8627, "\xe2\x86\xb3"}, + {"Ograve", 210, "\xc3\x92"}, + {"LeftVectorBar", 10578, "\xe2\xa5\x92"}, + {"NotNestedLessLess", 10913, "\xe2\xaa\xa1\xcc\xb8"}, + {"Jscr", 119973, "\xf0\x9d\x92\xa5"}, + {"psi", 968, "\xcf\x88"}, + {"orarr", 8635, "\xe2\x86\xbb"}, + {"Subset", 8912, "\xe2\x8b\x90"}, + {"curarr", 8631, "\xe2\x86\xb7"}, + {"CirclePlus", 8853, "\xe2\x8a\x95"}, + {"gtrless", 8823, "\xe2\x89\xb7"}, + {"nvle", 8804, "\xe2\x89\xa4\xe2\x83\x92"}, + {"prop", 8733, "\xe2\x88\x9d"}, + {"gEl", 10892, "\xe2\xaa\x8c"}, + {"gtlPar", 10645, "\xe2\xa6\x95"}, + {"frasl", 8260, "\xe2\x81\x84"}, + {"nearr", 8599, "\xe2\x86\x97"}, + {"NotSubsetEqual", 8840, "\xe2\x8a\x88"}, + {"planck", 8463, "\xe2\x84\x8f"}, + {"Uuml", 220, "\xc3\x9c"}, + {"spadesuit", 9824, "\xe2\x99\xa0"}, + {"sect", 167, "\xc2\xa7"}, + {"cdot", 267, "\xc4\x8b"}, + {"boxVh", 9579, "\xe2\x95\xab"}, + {"zscr", 120015, "\xf0\x9d\x93\x8f"}, + {"nsqsube", 8930, "\xe2\x8b\xa2"}, + {"grave", 96, "\x60"}, + {"angrtvb", 8894, "\xe2\x8a\xbe"}, + {"MediumSpace", 8287, "\xe2\x81\x9f"}, + {"Ntilde", 209, "\xc3\x91"}, + {"solb", 10692, "\xe2\xa7\x84"}, + {"angzarr", 9084, "\xe2\x8d\xbc"}, + {"nopf", 120159, "\xf0\x9d\x95\x9f"}, + {"rtrif", 9656, "\xe2\x96\xb8"}, + {"nrightarrow", 8603, "\xe2\x86\x9b"}, + {"Kappa", 922, "\xce\x9a"}, + {"simrarr", 10610, "\xe2\xa5\xb2"}, + {"imacr", 299, "\xc4\xab"}, + {"vrtri", 8883, "\xe2\x8a\xb3"}, + {"part", 8706, "\xe2\x88\x82"}, + {"esim", 8770, "\xe2\x89\x82"}, + {"atilde", 227, "\xc3\xa3"}, + {"DownRightTeeVector", 10591, "\xe2\xa5\x9f"}, + {"jcirc", 309, "\xc4\xb5"}, + {"Ecaron", 282, "\xc4\x9a"}, + {"VerticalSeparator", 10072, "\xe2\x9d\x98"}, + {"rHar", 10596, "\xe2\xa5\xa4"}, + {"rcaron", 345, "\xc5\x99"}, + {"subnE", 10955, "\xe2\xab\x8b"}, + {"ii", 8520, "\xe2\x85\x88"}, + {"Cconint", 8752, "\xe2\x88\xb0"}, + {"Mcy", 1052, "\xd0\x9c"}, + {"eqcolon", 8789, "\xe2\x89\x95"}, + {"cupor", 10821, "\xe2\xa9\x85"}, + {"DoubleUpArrow", 8657, "\xe2\x87\x91"}, + {"boxbox", 10697, "\xe2\xa7\x89"}, + {"setminus", 8726, "\xe2\x88\x96"}, + {"Lleftarrow", 8666, "\xe2\x87\x9a"}, + {"nang", 8736, "\xe2\x88\xa0\xe2\x83\x92"}, + {"TRADE", 8482, "\xe2\x84\xa2"}, + {"urcorner", 8989, "\xe2\x8c\x9d"}, + {"lsqb", 91, "\x5b"}, + {"cupcup", 10826, "\xe2\xa9\x8a"}, + {"kjcy", 1116, "\xd1\x9c"}, + {"llhard", 10603, "\xe2\xa5\xab"}, + {"mumap", 8888, "\xe2\x8a\xb8"}, + {"iiint", 8749, "\xe2\x88\xad"}, + {"RightTee", 8866, "\xe2\x8a\xa2"}, + {"Tcaron", 356, "\xc5\xa4"}, + {"bigcirc", 9711, "\xe2\x97\xaf"}, + {"trianglerighteq", 8885, "\xe2\x8a\xb5"}, + {"NotLessGreater", 8824, "\xe2\x89\xb8"}, + {"hArr", 8660, "\xe2\x87\x94"}, + {"ocy", 1086, "\xd0\xbe"}, + {"tosa", 10537, "\xe2\xa4\xa9"}, + {"twixt", 8812, "\xe2\x89\xac"}, + {"square", 9633, "\xe2\x96\xa1"}, + {"Otimes", 10807, "\xe2\xa8\xb7"}, + {"Kcedil", 310, "\xc4\xb6"}, + {"beth", 8502, "\xe2\x84\xb6"}, + {"triminus", 10810, "\xe2\xa8\xba"}, + {"nlArr", 8653, "\xe2\x87\x8d"}, + {"Oacute", 211, "\xc3\x93"}, + {"zwnj", 8204, "\xe2\x80\x8c"}, + {"ll", 8810, "\xe2\x89\xaa"}, + {"smashp", 10803, "\xe2\xa8\xb3"}, + {"ngeqq", 8807, "\xe2\x89\xa7\xcc\xb8"}, + {"rnmid", 10990, "\xe2\xab\xae"}, + {"nwArr", 8662, "\xe2\x87\x96"}, + {"RightUpDownVector", 10575, "\xe2\xa5\x8f"}, + {"lbbrk", 10098, "\xe2\x9d\xb2"}, + {"compfn", 8728, "\xe2\x88\x98"}, + {"eDDot", 10871, "\xe2\xa9\xb7"}, + {"Jsercy", 1032, "\xd0\x88"}, + {"HARDcy", 1066, "\xd0\xaa"}, + {"nexists", 8708, "\xe2\x88\x84"}, + {"theta", 952, "\xce\xb8"}, + {"plankv", 8463, "\xe2\x84\x8f"}, + {"sup2", 178, "\xc2\xb2"}, + {"lessapprox", 10885, "\xe2\xaa\x85"}, + {"gdot", 289, "\xc4\xa1"}, + {"angmsdae", 10668, "\xe2\xa6\xac"}, + {"Superset", 8835, "\xe2\x8a\x83"}, + {"prap", 10935, "\xe2\xaa\xb7"}, + {"Zscr", 119989, "\xf0\x9d\x92\xb5"}, + {"nsucc", 8833, "\xe2\x8a\x81"}, + {"supseteqq", 10950, "\xe2\xab\x86"}, + {"UpTee", 8869, "\xe2\x8a\xa5"}, + {"LowerLeftArrow", 8601, "\xe2\x86\x99"}, + {"ssmile", 8995, "\xe2\x8c\xa3"}, + {"niv", 8715, "\xe2\x88\x8b"}, + {"bigvee", 8897, "\xe2\x8b\x81"}, + {"kscr", 120000, "\xf0\x9d\x93\x80"}, + {"xutri", 9651, "\xe2\x96\xb3"}, + {"caret", 8257, "\xe2\x81\x81"}, + {"caron", 711, "\xcb\x87"}, + {"Wedge", 8896, "\xe2\x8b\x80"}, + {"sdotb", 8865, "\xe2\x8a\xa1"}, + {"bigoplus", 10753, "\xe2\xa8\x81"}, + {"Breve", 728, "\xcb\x98"}, + {"ImaginaryI", 8520, "\xe2\x85\x88"}, + {"longmapsto", 10236, "\xe2\x9f\xbc"}, + {"boxVH", 9580, "\xe2\x95\xac"}, + {"lozenge", 9674, "\xe2\x97\x8a"}, + {"toea", 10536, "\xe2\xa4\xa8"}, + {"nbumpe", 8783, "\xe2\x89\x8f\xcc\xb8"}, + {"gcirc", 285, "\xc4\x9d"}, + {"NotHumpEqual", 8783, "\xe2\x89\x8f\xcc\xb8"}, + {"pre", 10927, "\xe2\xaa\xaf"}, + {"ascr", 119990, "\xf0\x9d\x92\xb6"}, + {"Acirc", 194, "\xc3\x82"}, + {"questeq", 8799, "\xe2\x89\x9f"}, + {"ncaron", 328, "\xc5\x88"}, + {"LeftTeeArrow", 8612, "\xe2\x86\xa4"}, + {"xcirc", 9711, "\xe2\x97\xaf"}, + {"swarr", 8601, "\xe2\x86\x99"}, + {"MinusPlus", 8723, "\xe2\x88\x93"}, + {"plus", 43, "\x2b"}, + {"NotDoubleVerticalBar", 8742, "\xe2\x88\xa6"}, + {"rppolint", 10770, "\xe2\xa8\x92"}, + {"NotTildeFullEqual", 8775, "\xe2\x89\x87"}, + {"ltdot", 8918, "\xe2\x8b\x96"}, + {"NotNestedGreaterGreater", 10914, "\xe2\xaa\xa2\xcc\xb8"}, + {"Lscr", 8466, "\xe2\x84\x92"}, + {"pitchfork", 8916, "\xe2\x8b\x94"}, + {"Eopf", 120124, "\xf0\x9d\x94\xbc"}, + {"ropf", 120163, "\xf0\x9d\x95\xa3"}, + {"Delta", 916, "\xce\x94"}, + {"lozf", 10731, "\xe2\xa7\xab"}, + {"RightTeeVector", 10587, "\xe2\xa5\x9b"}, + {"UpDownArrow", 8597, "\xe2\x86\x95"}, + {"bump", 8782, "\xe2\x89\x8e"}, + {"Rscr", 8475, "\xe2\x84\x9b"}, + {"slarr", 8592, "\xe2\x86\x90"}, + {"lcy", 1083, "\xd0\xbb"}, + {"Vee", 8897, "\xe2\x8b\x81"}, + {"Iogon", 302, "\xc4\xae"}, + {"minus", 8722, "\xe2\x88\x92"}, + {"GreaterFullEqual", 8807, "\xe2\x89\xa7"}, + {"xhArr", 10234, "\xe2\x9f\xba"}, + {"shortmid", 8739, "\xe2\x88\xa3"}, + {"DoubleDownArrow", 8659, "\xe2\x87\x93"}, + {"Wscr", 119986, "\xf0\x9d\x92\xb2"}, + {"rang", 10217, "\xe2\x9f\xa9"}, + {"lcub", 123, "\x7b"}, + {"mnplus", 8723, "\xe2\x88\x93"}, + {"ulcrop", 8975, "\xe2\x8c\x8f"}, + {"wfr", 120116, "\xf0\x9d\x94\xb4"}, + {"DifferentialD", 8518, "\xe2\x85\x86"}, + {"ThinSpace", 8201, "\xe2\x80\x89"}, + {"NotGreaterGreater", 8811, "\xe2\x89\xab\xcc\xb8"}, + {"Topf", 120139, "\xf0\x9d\x95\x8b"}, + {"sbquo", 8218, "\xe2\x80\x9a"}, + {"sdot", 8901, "\xe2\x8b\x85"}, + {"DoubleLeftTee", 10980, "\xe2\xab\xa4"}, + {"vBarv", 10985, "\xe2\xab\xa9"}, + {"subne", 8842, "\xe2\x8a\x8a"}, + {"gtrdot", 8919, "\xe2\x8b\x97"}, + {"opar", 10679, "\xe2\xa6\xb7"}, + {"apid", 8779, "\xe2\x89\x8b"}, + {"Cross", 10799, "\xe2\xa8\xaf"}, + {"lhblk", 9604, "\xe2\x96\x84"}, + {"capcap", 10827, "\xe2\xa9\x8b"}, + {"midast", 42, "\x2a"}, + {"lscr", 120001, "\xf0\x9d\x93\x81"}, + {"nGt", 8811, "\xe2\x89\xab\xe2\x83\x92"}, + {"Euml", 203, "\xc3\x8b"}, + {"blacktriangledown", 9662, "\xe2\x96\xbe"}, + {"Rcy", 1056, "\xd0\xa0"}, + {"dfisht", 10623, "\xe2\xa5\xbf"}, + {"dashv", 8867, "\xe2\x8a\xa3"}, + {"ast", 42, "\x2a"}, + {"ContourIntegral", 8750, "\xe2\x88\xae"}, + {"Ofr", 120082, "\xf0\x9d\x94\x92"}, + {"Lcy", 1051, "\xd0\x9b"}, + {"nltrie", 8940, "\xe2\x8b\xac"}, + {"ShortUpArrow", 8593, "\xe2\x86\x91"}, + {"acy", 1072, "\xd0\xb0"}, + {"rightarrow", 8594, "\xe2\x86\x92"}, + {"UnderBar", 95, "\x5f"}, + {"LongLeftArrow", 10229, "\xe2\x9f\xb5"}, + {"andd", 10844, "\xe2\xa9\x9c"}, + {"xlarr", 10229, "\xe2\x9f\xb5"}, + {"percnt", 37, "\x25"}, + {"rharu", 8640, "\xe2\x87\x80"}, + {"plusdo", 8724, "\xe2\x88\x94"}, + {"TScy", 1062, "\xd0\xa6"}, + {"kcy", 1082, "\xd0\xba"}, + {"boxVR", 9568, "\xe2\x95\xa0"}, + {"looparrowleft", 8619, "\xe2\x86\xab"}, + {"scirc", 349, "\xc5\x9d"}, + {"drcorn", 8991, "\xe2\x8c\x9f"}, + {"iiota", 8489, "\xe2\x84\xa9"}, + {"Zcy", 1047, "\xd0\x97"}, + {"frac58", 8541, "\xe2\x85\x9d"}, + {"alpha", 945, "\xce\xb1"}, + {"daleth", 8504, "\xe2\x84\xb8"}, + {"gtreqless", 8923, "\xe2\x8b\x9b"}, + {"tstrok", 359, "\xc5\xa7"}, + {"plusb", 8862, "\xe2\x8a\x9e"}, + {"odsold", 10684, "\xe2\xa6\xbc"}, + {"varsupsetneqq", 10956, "\xe2\xab\x8c\xef\xb8\x80"}, + {"otilde", 245, "\xc3\xb5"}, + {"gtcir", 10874, "\xe2\xa9\xba"}, + {"lltri", 9722, "\xe2\x97\xba"}, + {"rx", 8478, "\xe2\x84\x9e"}, + {"ljcy", 1113, "\xd1\x99"}, + {"parsim", 10995, "\xe2\xab\xb3"}, + {"NotElement", 8713, "\xe2\x88\x89"}, + {"plusmn", 177, "\xc2\xb1"}, + {"varsubsetneq", 8842, "\xe2\x8a\x8a\xef\xb8\x80"}, + {"subset", 8834, "\xe2\x8a\x82"}, + {"awint", 10769, "\xe2\xa8\x91"}, + {"laemptyv", 10676, "\xe2\xa6\xb4"}, + {"phiv", 981, "\xcf\x95"}, + {"sfrown", 8994, "\xe2\x8c\xa2"}, + {"DoubleUpDownArrow", 8661, "\xe2\x87\x95"}, + {"lpar", 40, "\x28"}, + {"frac45", 8536, "\xe2\x85\x98"}, + {"rBarr", 10511, "\xe2\xa4\x8f"}, + {"npolint", 10772, "\xe2\xa8\x94"}, + {"emacr", 275, "\xc4\x93"}, + {"maltese", 10016, "\xe2\x9c\xa0"}, + {"PlusMinus", 177, "\xc2\xb1"}, + {"ReverseEquilibrium", 8651, "\xe2\x87\x8b"}, + {"oscr", 8500, "\xe2\x84\xb4"}, + {"blacksquare", 9642, "\xe2\x96\xaa"}, + {"TSHcy", 1035, "\xd0\x8b"}, + {"gap", 10886, "\xe2\xaa\x86"}, + {"xnis", 8955, "\xe2\x8b\xbb"}, + {"Ll", 8920, "\xe2\x8b\x98"}, + {"PrecedesEqual", 10927, "\xe2\xaa\xaf"}, + {"incare", 8453, "\xe2\x84\x85"}, + {"nharr", 8622, "\xe2\x86\xae"}, + {"varnothing", 8709, "\xe2\x88\x85"}, + {"ShortDownArrow", 8595, "\xe2\x86\x93"}, + {"nbsp", 160, " "}, + {"asympeq", 8781, "\xe2\x89\x8d"}, + {"rbrkslu", 10640, "\xe2\xa6\x90"}, + {"rho", 961, "\xcf\x81"}, + {"Mscr", 8499, "\xe2\x84\xb3"}, + {"eth", 240, "\xc3\xb0"}, + {"suplarr", 10619, "\xe2\xa5\xbb"}, + {"Tab", 9, "\x09"}, + {"omicron", 959, "\xce\xbf"}, + {"blacktriangle", 9652, "\xe2\x96\xb4"}, + {"nldr", 8229, "\xe2\x80\xa5"}, + {"downharpoonleft", 8643, "\xe2\x87\x83"}, + {"circledcirc", 8858, "\xe2\x8a\x9a"}, + {"leftleftarrows", 8647, "\xe2\x87\x87"}, + {"NotHumpDownHump", 8782, "\xe2\x89\x8e\xcc\xb8"}, + {"nvgt", 62, "\x3e\xe2\x83\x92"}, + {"rhard", 8641, "\xe2\x87\x81"}, + {"nGg", 8921, "\xe2\x8b\x99\xcc\xb8"}, + {"lurdshar", 10570, "\xe2\xa5\x8a"}, + {"cirE", 10691, "\xe2\xa7\x83"}, + {"isinE", 8953, "\xe2\x8b\xb9"}, + {"eparsl", 10723, "\xe2\xa7\xa3"}, + {"RightAngleBracket", 10217, "\xe2\x9f\xa9"}, + {"hcirc", 293, "\xc4\xa5"}, + {"bumpeq", 8783, "\xe2\x89\x8f"}, + {"cire", 8791, "\xe2\x89\x97"}, + {"dotplus", 8724, "\xe2\x88\x94"}, + {"itilde", 297, "\xc4\xa9"}, + {"uwangle", 10663, "\xe2\xa6\xa7"}, + {"rlhar", 8652, "\xe2\x87\x8c"}, + {"rbrace", 125, "\x7d"}, + {"mid", 8739, "\xe2\x88\xa3"}, + {"el", 10905, "\xe2\xaa\x99"}, + {"KJcy", 1036, "\xd0\x8c"}, + {"odiv", 10808, "\xe2\xa8\xb8"}, + {"amacr", 257, "\xc4\x81"}, + {"qprime", 8279, "\xe2\x81\x97"}, + {"tcedil", 355, "\xc5\xa3"}, + {"UpArrowDownArrow", 8645, "\xe2\x87\x85"}, + {"spades", 9824, "\xe2\x99\xa0"}, + {"napos", 329, "\xc5\x89"}, + {"straightepsilon", 1013, "\xcf\xb5"}, + {"CupCap", 8781, "\xe2\x89\x8d"}, + {"Oopf", 120134, "\xf0\x9d\x95\x86"}, + {"sub", 8834, "\xe2\x8a\x82"}, + {"ohm", 937, "\xce\xa9"}, + {"UnderBrace", 9183, "\xe2\x8f\x9f"}, + {"looparrowright", 8620, "\xe2\x86\xac"}, + {"xotime", 10754, "\xe2\xa8\x82"}, + {"ntgl", 8825, "\xe2\x89\xb9"}, + {"minusdu", 10794, "\xe2\xa8\xaa"}, + {"rarrb", 8677, "\xe2\x87\xa5"}, + {"nvlArr", 10498, "\xe2\xa4\x82"}, + {"triangle", 9653, "\xe2\x96\xb5"}, + {"nacute", 324, "\xc5\x84"}, + {"boxHD", 9574, "\xe2\x95\xa6"}, + {"ratio", 8758, "\xe2\x88\xb6"}, + {"larrsim", 10611, "\xe2\xa5\xb3"}, + {"LessLess", 10913, "\xe2\xaa\xa1"}, + {"yacy", 1103, "\xd1\x8f"}, + {"ctdot", 8943, "\xe2\x8b\xaf"}, + {"and", 8743, "\xe2\x88\xa7"}, + {"lrtri", 8895, "\xe2\x8a\xbf"}, + {"eDot", 8785, "\xe2\x89\x91"}, + {"sqsub", 8847, "\xe2\x8a\x8f"}, + {"real", 8476, "\xe2\x84\x9c"}, + {"Dcy", 1044, "\xd0\x94"}, + {"vartheta", 977, "\xcf\x91"}, + {"nsub", 8836, "\xe2\x8a\x84"}, + {"DownTee", 8868, "\xe2\x8a\xa4"}, + {"acute", 180, "\xc2\xb4"}, + {"GreaterLess", 8823, "\xe2\x89\xb7"}, + {"supplus", 10944, "\xe2\xab\x80"}, + {"Vbar", 10987, "\xe2\xab\xab"}, + {"divideontimes", 8903, "\xe2\x8b\x87"}, + {"lsim", 8818, "\xe2\x89\xb2"}, + {"nearhk", 10532, "\xe2\xa4\xa4"}, + {"nLtv", 8810, "\xe2\x89\xaa\xcc\xb8"}, + {"RuleDelayed", 10740, "\xe2\xa7\xb4"}, + {"smile", 8995, "\xe2\x8c\xa3"}, + {"coprod", 8720, "\xe2\x88\x90"}, + {"imof", 8887, "\xe2\x8a\xb7"}, + {"ecy", 1101, "\xd1\x8d"}, + {"RightCeiling", 8969, "\xe2\x8c\x89"}, + {"dlcorn", 8990, "\xe2\x8c\x9e"}, + {"Nu", 925, "\xce\x9d"}, + {"frac18", 8539, "\xe2\x85\x9b"}, + {"diamond", 8900, "\xe2\x8b\x84"}, + {"Icirc", 206, "\xc3\x8e"}, + {"ngeq", 8817, "\xe2\x89\xb1"}, + {"epsilon", 949, "\xce\xb5"}, + {"fork", 8916, "\xe2\x8b\x94"}, + {"xrarr", 10230, "\xe2\x9f\xb6"}, + {"racute", 341, "\xc5\x95"}, + {"ntlg", 8824, "\xe2\x89\xb8"}, + {"xvee", 8897, "\xe2\x8b\x81"}, + {"LeftArrowRightArrow", 8646, "\xe2\x87\x86"}, + {"DownLeftRightVector", 10576, "\xe2\xa5\x90"}, + {"Eacute", 201, "\xc3\x89"}, + {"gimel", 8503, "\xe2\x84\xb7"}, + {"rtimes", 8906, "\xe2\x8b\x8a"}, + {"forall", 8704, "\xe2\x88\x80"}, + {"DiacriticalDoubleAcute", 733, "\xcb\x9d"}, + {"dArr", 8659, "\xe2\x87\x93"}, + {"fallingdotseq", 8786, "\xe2\x89\x92"}, + {"Aogon", 260, "\xc4\x84"}, + {"PartialD", 8706, "\xe2\x88\x82"}, + {"mapstoup", 8613, "\xe2\x86\xa5"}, + {"die", 168, "\xc2\xa8"}, + {"ngt", 8815, "\xe2\x89\xaf"}, + {"vcy", 1074, "\xd0\xb2"}, + {"fjlig", 0, "\x66\x6a"}, + {"submult", 10945, "\xe2\xab\x81"}, + {"ubrcy", 1118, "\xd1\x9e"}, + {"ovbar", 9021, "\xe2\x8c\xbd"}, + {"bsime", 8909, "\xe2\x8b\x8d"}, + {"precnsim", 8936, "\xe2\x8b\xa8"}, + {"DiacriticalTilde", 732, "\xcb\x9c"}, + {"cwint", 8753, "\xe2\x88\xb1"}, + {"Scy", 1057, "\xd0\xa1"}, + {"NotGreaterEqual", 8817, "\xe2\x89\xb1"}, + {"boxUR", 9562, "\xe2\x95\x9a"}, + {"LessSlantEqual", 10877, "\xe2\xa9\xbd"}, + {"Barwed", 8966, "\xe2\x8c\x86"}, + {"supdot", 10942, "\xe2\xaa\xbe"}, + {"gel", 8923, "\xe2\x8b\x9b"}, + {"iscr", 119998, "\xf0\x9d\x92\xbe"}, + {"doublebarwedge", 8966, "\xe2\x8c\x86"}, + {"Idot", 304, "\xc4\xb0"}, + {"DoubleDot", 168, "\xc2\xa8"}, + {"rsquo", 8217, "\xe2\x80\x99"}, + {"subsetneqq", 10955, "\xe2\xab\x8b"}, + {"UpEquilibrium", 10606, "\xe2\xa5\xae"}, + {"copysr", 8471, "\xe2\x84\x97"}, + {"RightDoubleBracket", 10215, "\xe2\x9f\xa7"}, + {"LeftRightVector", 10574, "\xe2\xa5\x8e"}, + {"DownLeftVectorBar", 10582, "\xe2\xa5\x96"}, + {"suphsub", 10967, "\xe2\xab\x97"}, + {"cedil", 184, "\xc2\xb8"}, + {"prurel", 8880, "\xe2\x8a\xb0"}, + {"imagpart", 8465, "\xe2\x84\x91"}, + {"Hscr", 8459, "\xe2\x84\x8b"}, + {"jmath", 567, "\xc8\xb7"}, + {"nrtrie", 8941, "\xe2\x8b\xad"}, + {"nsup", 8837, "\xe2\x8a\x85"}, + {"Ubrcy", 1038, "\xd0\x8e"}, + {"succnsim", 8937, "\xe2\x8b\xa9"}, + {"nesim", 8770, "\xe2\x89\x82\xcc\xb8"}, + {"varepsilon", 1013, "\xcf\xb5"}, + {"DoubleRightTee", 8872, "\xe2\x8a\xa8"}, + {"not", 172, "\xc2\xac"}, + {"lesdot", 10879, "\xe2\xa9\xbf"}, + {"backepsilon", 1014, "\xcf\xb6"}, + {"srarr", 8594, "\xe2\x86\x92"}, + {"varsubsetneqq", 10955, "\xe2\xab\x8b\xef\xb8\x80"}, + {"sqcap", 8851, "\xe2\x8a\x93"}, + {"rightleftarrows", 8644, "\xe2\x87\x84"}, + {"diams", 9830, "\xe2\x99\xa6"}, + {"boxdR", 9554, "\xe2\x95\x92"}, + {"ngeqslant", 10878, "\xe2\xa9\xbe\xcc\xb8"}, + {"boxDR", 9556, "\xe2\x95\x94"}, + {"sext", 10038, "\xe2\x9c\xb6"}, + {"backsim", 8765, "\xe2\x88\xbd"}, + {"nfr", 120107, "\xf0\x9d\x94\xab"}, + {"CloseCurlyDoubleQuote", 8221, "\xe2\x80\x9d"}, + {"npart", 8706, "\xe2\x88\x82\xcc\xb8"}, + {"dharl", 8643, "\xe2\x87\x83"}, + {"NewLine", 10, "\x0a"}, + {"bigotimes", 10754, "\xe2\xa8\x82"}, + {"lAtail", 10523, "\xe2\xa4\x9b"}, + {"frac14", 188, "\xc2\xbc"}, + {"or", 8744, "\xe2\x88\xa8"}, + {"subedot", 10947, "\xe2\xab\x83"}, + {"nmid", 8740, "\xe2\x88\xa4"}, + {"DownArrowUpArrow", 8693, "\xe2\x87\xb5"}, + {"icy", 1080, "\xd0\xb8"}, + {"num", 35, "\x23"}, + {"Gdot", 288, "\xc4\xa0"}, + {"urcrop", 8974, "\xe2\x8c\x8e"}, + {"epsiv", 1013, "\xcf\xb5"}, + {"topcir", 10993, "\xe2\xab\xb1"}, + {"ne", 8800, "\xe2\x89\xa0"}, + {"osol", 8856, "\xe2\x8a\x98"}, + {"amp", 38, "\x26"}, + {"ncap", 10819, "\xe2\xa9\x83"}, + {"Sscr", 119982, "\xf0\x9d\x92\xae"}, + {"sung", 9834, "\xe2\x99\xaa"}, + {"ltri", 9667, "\xe2\x97\x83"}, + {"frac25", 8534, "\xe2\x85\x96"}, + {"DZcy", 1039, "\xd0\x8f"}, + {"RightUpVector", 8638, "\xe2\x86\xbe"}, + {"rsquor", 8217, "\xe2\x80\x99"}, + {"uplus", 8846, "\xe2\x8a\x8e"}, + {"triangleright", 9657, "\xe2\x96\xb9"}, + {"lAarr", 8666, "\xe2\x87\x9a"}, + {"HilbertSpace", 8459, "\xe2\x84\x8b"}, + {"there4", 8756, "\xe2\x88\xb4"}, + {"vscr", 120011, "\xf0\x9d\x93\x8b"}, + {"cirscir", 10690, "\xe2\xa7\x82"}, + {"roarr", 8702, "\xe2\x87\xbe"}, + {"hslash", 8463, "\xe2\x84\x8f"}, + {"supdsub", 10968, "\xe2\xab\x98"}, + {"simg", 10910, "\xe2\xaa\x9e"}, + {"trade", 8482, "\xe2\x84\xa2"}, + {"searrow", 8600, "\xe2\x86\x98"}, + {"DownLeftVector", 8637, "\xe2\x86\xbd"}, + {"FilledSmallSquare", 9724, "\xe2\x97\xbc"}, + {"prod", 8719, "\xe2\x88\x8f"}, + {"oror", 10838, "\xe2\xa9\x96"}, + {"udarr", 8645, "\xe2\x87\x85"}, + {"jsercy", 1112, "\xd1\x98"}, + {"tprime", 8244, "\xe2\x80\xb4"}, + {"bprime", 8245, "\xe2\x80\xb5"}, + {"malt", 10016, "\xe2\x9c\xa0"}, + {"bigcup", 8899, "\xe2\x8b\x83"}, + {"oint", 8750, "\xe2\x88\xae"}, + {"female", 9792, "\xe2\x99\x80"}, + {"omacr", 333, "\xc5\x8d"}, + {"SquareSubsetEqual", 8849, "\xe2\x8a\x91"}, + {"SucceedsEqual", 10928, "\xe2\xaa\xb0"}, + {"plusacir", 10787, "\xe2\xa8\xa3"}, + {"Gcirc", 284, "\xc4\x9c"}, + {"lesdotor", 10883, "\xe2\xaa\x83"}, + {"escr", 8495, "\xe2\x84\xaf"}, + {"THORN", 222, "\xc3\x9e"}, + {"UpArrowBar", 10514, "\xe2\xa4\x92"}, + {"nvrtrie", 8885, "\xe2\x8a\xb5\xe2\x83\x92"}, + {"varkappa", 1008, "\xcf\xb0"}, + {"NotReverseElement", 8716, "\xe2\x88\x8c"}, + {"zdot", 380, "\xc5\xbc"}, + {"ExponentialE", 8519, "\xe2\x85\x87"}, + {"lesseqgtr", 8922, "\xe2\x8b\x9a"}, + {"cscr", 119992, "\xf0\x9d\x92\xb8"}, + {"Dscr", 119967, "\xf0\x9d\x92\x9f"}, + {"lthree", 8907, "\xe2\x8b\x8b"}, + {"Ccedil", 199, "\xc3\x87"}, + {"nge", 8817, "\xe2\x89\xb1"}, + {"UpperLeftArrow", 8598, "\xe2\x86\x96"}, + {"vDash", 8872, "\xe2\x8a\xa8"}, + {"efDot", 8786, "\xe2\x89\x92"}, + {"telrec", 8981, "\xe2\x8c\x95"}, + {"vellip", 8942, "\xe2\x8b\xae"}, + {"nrArr", 8655, "\xe2\x87\x8f"}, + {"ugrave", 249, "\xc3\xb9"}, + {"uring", 367, "\xc5\xaf"}, + {"Bernoullis", 8492, "\xe2\x84\xac"}, + {"nles", 10877, "\xe2\xa9\xbd\xcc\xb8"}, + {"macr", 175, "\xc2\xaf"}, + {"boxuR", 9560, "\xe2\x95\x98"}, + {"clubsuit", 9827, "\xe2\x99\xa3"}, + {"rightarrowtail", 8611, "\xe2\x86\xa3"}, + {"epar", 8917, "\xe2\x8b\x95"}, + {"ltcc", 10918, "\xe2\xaa\xa6"}, + {"twoheadleftarrow", 8606, "\xe2\x86\x9e"}, + {"aleph", 8501, "\xe2\x84\xb5"}, + {"Colon", 8759, "\xe2\x88\xb7"}, + {"vltri", 8882, "\xe2\x8a\xb2"}, + {"quaternions", 8461, "\xe2\x84\x8d"}, + {"rfr", 120111, "\xf0\x9d\x94\xaf"}, + {"Ouml", 214, "\xc3\x96"}, + {"rsh", 8625, "\xe2\x86\xb1"}, + {"emptyv", 8709, "\xe2\x88\x85"}, + {"sqsup", 8848, "\xe2\x8a\x90"}, + {"marker", 9646, "\xe2\x96\xae"}, + {"Efr", 120072, "\xf0\x9d\x94\x88"}, + {"DotEqual", 8784, "\xe2\x89\x90"}, + {"eqsim", 8770, "\xe2\x89\x82"}, + {"NotSucceedsEqual", 10928, "\xe2\xaa\xb0\xcc\xb8"}, + {"primes", 8473, "\xe2\x84\x99"}, + {"times", 215, "\xc3\x97"}, + {"rangd", 10642, "\xe2\xa6\x92"}, + {"rightharpoonup", 8640, "\xe2\x87\x80"}, + {"lrhard", 10605, "\xe2\xa5\xad"}, + {"ape", 8778, "\xe2\x89\x8a"}, + {"varsupsetneq", 8843, "\xe2\x8a\x8b\xef\xb8\x80"}, + {"larrlp", 8619, "\xe2\x86\xab"}, + {"NotPrecedesEqual", 10927, "\xe2\xaa\xaf\xcc\xb8"}, + {"ulcorner", 8988, "\xe2\x8c\x9c"}, + {"acd", 8767, "\xe2\x88\xbf"}, + {"Hacek", 711, "\xcb\x87"}, + {"xuplus", 10756, "\xe2\xa8\x84"}, + {"therefore", 8756, "\xe2\x88\xb4"}, + {"YIcy", 1031, "\xd0\x87"}, + {"Tfr", 120087, "\xf0\x9d\x94\x97"}, + {"Jcirc", 308, "\xc4\xb4"}, + {"LessGreater", 8822, "\xe2\x89\xb6"}, + {"Uring", 366, "\xc5\xae"}, + {"Ugrave", 217, "\xc3\x99"}, + {"rarr", 8594, "\xe2\x86\x92"}, + {"wopf", 120168, "\xf0\x9d\x95\xa8"}, + {"imath", 305, "\xc4\xb1"}, + {"Yopf", 120144, "\xf0\x9d\x95\x90"}, + {"colone", 8788, "\xe2\x89\x94"}, + {"csube", 10961, "\xe2\xab\x91"}, + {"odash", 8861, "\xe2\x8a\x9d"}, + {"olarr", 8634, "\xe2\x86\xba"}, + {"angrt", 8735, "\xe2\x88\x9f"}, + {"NotLeftTriangleBar", 10703, "\xe2\xa7\x8f\xcc\xb8"}, + {"GreaterEqual", 8805, "\xe2\x89\xa5"}, + {"scnap", 10938, "\xe2\xaa\xba"}, + {"pi", 960, "\xcf\x80"}, + {"lesg", 8922, "\xe2\x8b\x9a\xef\xb8\x80"}, + {"orderof", 8500, "\xe2\x84\xb4"}, + {"uacute", 250, "\xc3\xba"}, + {"Barv", 10983, "\xe2\xab\xa7"}, + {"Theta", 920, "\xce\x98"}, + {"leftrightsquigarrow", 8621, "\xe2\x86\xad"}, + {"Atilde", 195, "\xc3\x83"}, + {"cupdot", 8845, "\xe2\x8a\x8d"}, + {"ntriangleright", 8939, "\xe2\x8b\xab"}, + {"measuredangle", 8737, "\xe2\x88\xa1"}, + {"jscr", 119999, "\xf0\x9d\x92\xbf"}, + {"inodot", 305, "\xc4\xb1"}, + {"mopf", 120158, "\xf0\x9d\x95\x9e"}, + {"hkswarow", 10534, "\xe2\xa4\xa6"}, + {"lopar", 10629, "\xe2\xa6\x85"}, + {"thksim", 8764, "\xe2\x88\xbc"}, + {"bkarow", 10509, "\xe2\xa4\x8d"}, + {"rarrfs", 10526, "\xe2\xa4\x9e"}, + {"ntrianglelefteq", 8940, "\xe2\x8b\xac"}, + {"Bscr", 8492, "\xe2\x84\xac"}, + {"topf", 120165, "\xf0\x9d\x95\xa5"}, + {"Uacute", 218, "\xc3\x9a"}, + {"lap", 10885, "\xe2\xaa\x85"}, + {"djcy", 1106, "\xd1\x92"}, + {"bopf", 120147, "\xf0\x9d\x95\x93"}, + {"empty", 8709, "\xe2\x88\x85"}, + {"LeftAngleBracket", 10216, "\xe2\x9f\xa8"}, + {"Imacr", 298, "\xc4\xaa"}, + {"ltcir", 10873, "\xe2\xa9\xb9"}, + {"trisb", 10701, "\xe2\xa7\x8d"}, + {"gjcy", 1107, "\xd1\x93"}, + {"pr", 8826, "\xe2\x89\xba"}, + {"Mu", 924, "\xce\x9c"}, + {"ogon", 731, "\xcb\x9b"}, + {"pertenk", 8241, "\xe2\x80\xb1"}, + {"plustwo", 10791, "\xe2\xa8\xa7"}, + {"Vfr", 120089, "\xf0\x9d\x94\x99"}, + {"ApplyFunction", 8289, "\xe2\x81\xa1"}, + {"Sub", 8912, "\xe2\x8b\x90"}, + {"DoubleLeftRightArrow", 8660, "\xe2\x87\x94"}, + {"Lmidot", 319, "\xc4\xbf"}, + {"nwarrow", 8598, "\xe2\x86\x96"}, + {"angrtvbd", 10653, "\xe2\xa6\x9d"}, + {"fcy", 1092, "\xd1\x84"}, + {"ltlarr", 10614, "\xe2\xa5\xb6"}, + {"CircleMinus", 8854, "\xe2\x8a\x96"}, + {"angmsdab", 10665, "\xe2\xa6\xa9"}, + {"wedgeq", 8793, "\xe2\x89\x99"}, + {"iogon", 303, "\xc4\xaf"}, + {"laquo", 171, "\xc2\xab"}, + {"NestedGreaterGreater", 8811, "\xe2\x89\xab"}, + {"UnionPlus", 8846, "\xe2\x8a\x8e"}, + {"CircleDot", 8857, "\xe2\x8a\x99"}, + {"coloneq", 8788, "\xe2\x89\x94"}, + {"csupe", 10962, "\xe2\xab\x92"}, + {"tcaron", 357, "\xc5\xa5"}, + {"GreaterTilde", 8819, "\xe2\x89\xb3"}, + {"Map", 10501, "\xe2\xa4\x85"}, + {"DoubleLongLeftArrow", 10232, "\xe2\x9f\xb8"}, + {"Uparrow", 8657, "\xe2\x87\x91"}, + {"scy", 1089, "\xd1\x81"}, + {"llarr", 8647, "\xe2\x87\x87"}, + {"rangle", 10217, "\xe2\x9f\xa9"}, + {"sstarf", 8902, "\xe2\x8b\x86"}, + {"InvisibleTimes", 8290, "\xe2\x81\xa2"}, + {"egsdot", 10904, "\xe2\xaa\x98"}, + {"target", 8982, "\xe2\x8c\x96"}, + {"lesges", 10899, "\xe2\xaa\x93"}, + {"curren", 164, "\xc2\xa4"}, + {"yopf", 120170, "\xf0\x9d\x95\xaa"}, + {"frac23", 8532, "\xe2\x85\x94"}, + {"NotSucceedsTilde", 8831, "\xe2\x89\xbf\xcc\xb8"}, + {"napprox", 8777, "\xe2\x89\x89"}, + {"odblac", 337, "\xc5\x91"}, + {"gammad", 989, "\xcf\x9d"}, + {"dscr", 119993, "\xf0\x9d\x92\xb9"}, + {"SupersetEqual", 8839, "\xe2\x8a\x87"}, + {"squf", 9642, "\xe2\x96\xaa"}, + {"Because", 8757, "\xe2\x88\xb5"}, + {"sccue", 8829, "\xe2\x89\xbd"}, + {"KHcy", 1061, "\xd0\xa5"}, + {"Wcirc", 372, "\xc5\xb4"}, + {"uparrow", 8593, "\xe2\x86\x91"}, + {"lessgtr", 8822, "\xe2\x89\xb6"}, + {"thickapprox", 8776, "\xe2\x89\x88"}, + {"lbrksld", 10639, "\xe2\xa6\x8f"}, + {"oslash", 248, "\xc3\xb8"}, + {"NotCupCap", 8813, "\xe2\x89\xad"}, + {"elinters", 9191, "\xe2\x8f\xa7"}, + {"Assign", 8788, "\xe2\x89\x94"}, + {"ClockwiseContourIntegral", 8754, "\xe2\x88\xb2"}, + {"lfisht", 10620, "\xe2\xa5\xbc"}, + {"DownArrow", 8595, "\xe2\x86\x93"}, + {"Zdot", 379, "\xc5\xbb"}, + {"xscr", 120013, "\xf0\x9d\x93\x8d"}, + {"DiacriticalGrave", 96, "\x60"}, + {"DoubleLongLeftRightArrow", 10234, "\xe2\x9f\xba"}, + {"angle", 8736, "\xe2\x88\xa0"}, + {"race", 8765, "\xe2\x88\xbd\xcc\xb1"}, + {"Ascr", 119964, "\xf0\x9d\x92\x9c"}, + {"Xscr", 119987, "\xf0\x9d\x92\xb3"}, + {"acirc", 226, "\xc3\xa2"}, + {"otimesas", 10806, "\xe2\xa8\xb6"}, + {"gscr", 8458, "\xe2\x84\x8a"}, + {"gcy", 1075, "\xd0\xb3"}, + {"angmsdag", 10670, "\xe2\xa6\xae"}, + {"tshcy", 1115, "\xd1\x9b"}, + {"Acy", 1040, "\xd0\x90"}, + {"NotGreaterLess", 8825, "\xe2\x89\xb9"}, + {"dtdot", 8945, "\xe2\x8b\xb1"}, + {"quot", 34, "\x22"}, + {"micro", 181, "\xc2\xb5"}, + {"simplus", 10788, "\xe2\xa8\xa4"}, + {"nsupseteq", 8841, "\xe2\x8a\x89"}, + {"Ufr", 120088, "\xf0\x9d\x94\x98"}, + {"Pr", 10939, "\xe2\xaa\xbb"}, + {"napid", 8779, "\xe2\x89\x8b\xcc\xb8"}, + {"rceil", 8969, "\xe2\x8c\x89"}, + {"boxtimes", 8864, "\xe2\x8a\xa0"}, + {"erarr", 10609, "\xe2\xa5\xb1"}, + {"downdownarrows", 8650, "\xe2\x87\x8a"}, + {"Kfr", 120078, "\xf0\x9d\x94\x8e"}, + {"mho", 8487, "\xe2\x84\xa7"}, + {"scpolint", 10771, "\xe2\xa8\x93"}, + {"vArr", 8661, "\xe2\x87\x95"}, + {"Ccaron", 268, "\xc4\x8c"}, + {"NotRightTriangle", 8939, "\xe2\x8b\xab"}, + {"topbot", 9014, "\xe2\x8c\xb6"}, + {"qopf", 120162, "\xf0\x9d\x95\xa2"}, + {"eogon", 281, "\xc4\x99"}, + {"luruhar", 10598, "\xe2\xa5\xa6"}, + {"gtdot", 8919, "\xe2\x8b\x97"}, + {"Egrave", 200, "\xc3\x88"}, + {"roplus", 10798, "\xe2\xa8\xae"}, + {"Intersection", 8898, "\xe2\x8b\x82"}, + {"Uarr", 8607, "\xe2\x86\x9f"}, + {"dcy", 1076, "\xd0\xb4"}, + {"boxvl", 9508, "\xe2\x94\xa4"}, + {"RightArrowBar", 8677, "\xe2\x87\xa5"}, + {"yuml", 255, "\xc3\xbf"}, + {"parallel", 8741, "\xe2\x88\xa5"}, + {"succneqq", 10934, "\xe2\xaa\xb6"}, + {"bemptyv", 10672, "\xe2\xa6\xb0"}, + {"starf", 9733, "\xe2\x98\x85"}, + {"OverBar", 8254, "\xe2\x80\xbe"}, + {"Alpha", 913, "\xce\x91"}, + {"LeftUpVectorBar", 10584, "\xe2\xa5\x98"}, + {"ufr", 120114, "\xf0\x9d\x94\xb2"}, + {"swarhk", 10534, "\xe2\xa4\xa6"}, + {"GreaterEqualLess", 8923, "\xe2\x8b\x9b"}, + {"sscr", 120008, "\xf0\x9d\x93\x88"}, + {"Pi", 928, "\xce\xa0"}, + {"boxh", 9472, "\xe2\x94\x80"}, + {"frac16", 8537, "\xe2\x85\x99"}, + {"lbrack", 91, "\x5b"}, + {"vert", 124, "\x7c"}, + {"precneqq", 10933, "\xe2\xaa\xb5"}, + {"NotGreaterSlantEqual", 10878, "\xe2\xa9\xbe\xcc\xb8"}, + {"Omega", 937, "\xce\xa9"}, + {"uarr", 8593, "\xe2\x86\x91"}, + {"boxVr", 9567, "\xe2\x95\x9f"}, + {"ruluhar", 10600, "\xe2\xa5\xa8"}, + {"ShortLeftArrow", 8592, "\xe2\x86\x90"}, + {"Qfr", 120084, "\xf0\x9d\x94\x94"}, + {"olt", 10688, "\xe2\xa7\x80"}, + {"nequiv", 8802, "\xe2\x89\xa2"}, + {"fscr", 119995, "\xf0\x9d\x92\xbb"}, + {"rarrhk", 8618, "\xe2\x86\xaa"}, + {"nsqsupe", 8931, "\xe2\x8b\xa3"}, + {"nsubseteq", 8840, "\xe2\x8a\x88"}, + {"numero", 8470, "\xe2\x84\x96"}, + {"emsp14", 8197, "\xe2\x80\x85"}, + {"gl", 8823, "\xe2\x89\xb7"}, + {"ocirc", 244, "\xc3\xb4"}, + {"weierp", 8472, "\xe2\x84\x98"}, + {"boxvL", 9569, "\xe2\x95\xa1"}, + {"RightArrowLeftArrow", 8644, "\xe2\x87\x84"}, + {"Precedes", 8826, "\xe2\x89\xba"}, + {"RightVector", 8640, "\xe2\x87\x80"}, + {"xcup", 8899, "\xe2\x8b\x83"}, + {"angmsdad", 10667, "\xe2\xa6\xab"}, + {"gtrsim", 8819, "\xe2\x89\xb3"}, + {"natural", 9838, "\xe2\x99\xae"}, + {"nVdash", 8878, "\xe2\x8a\xae"}, + {"RightTriangleEqual", 8885, "\xe2\x8a\xb5"}, + {"dscy", 1109, "\xd1\x95"}, + {"leftthreetimes", 8907, "\xe2\x8b\x8b"}, + {"prsim", 8830, "\xe2\x89\xbe"}, + {"Bcy", 1041, "\xd0\x91"}, + {"Chi", 935, "\xce\xa7"}, + {"timesb", 8864, "\xe2\x8a\xa0"}, + {"Del", 8711, "\xe2\x88\x87"}, + {"lmidot", 320, "\xc5\x80"}, + {"RightDownVector", 8642, "\xe2\x87\x82"}, + {"simdot", 10858, "\xe2\xa9\xaa"}, + {"FilledVerySmallSquare", 9642, "\xe2\x96\xaa"}, + {"NotLessSlantEqual", 10877, "\xe2\xa9\xbd\xcc\xb8"}, + {"SucceedsTilde", 8831, "\xe2\x89\xbf"}, + {"duarr", 8693, "\xe2\x87\xb5"}, + {"apE", 10864, "\xe2\xa9\xb0"}, + {"odot", 8857, "\xe2\x8a\x99"}, + {"mldr", 8230, "\xe2\x80\xa6"}, + {"Uarrocir", 10569, "\xe2\xa5\x89"}, + {"nLl", 8920, "\xe2\x8b\x98\xcc\xb8"}, + {"rarrpl", 10565, "\xe2\xa5\x85"}, + {"cir", 9675, "\xe2\x97\x8b"}, + {"blk14", 9617, "\xe2\x96\x91"}, + {"VerticalLine", 124, "\x7c"}, + {"jcy", 1081, "\xd0\xb9"}, + {"filig", 64257, "\xef\xac\x81"}, + {"LongRightArrow", 10230, "\xe2\x9f\xb6"}, + {"beta", 946, "\xce\xb2"}, + {"ccupssm", 10832, "\xe2\xa9\x90"}, + {"supsub", 10964, "\xe2\xab\x94"}, + {"spar", 8741, "\xe2\x88\xa5"}, + {"Tstrok", 358, "\xc5\xa6"}, + {"isinv", 8712, "\xe2\x88\x88"}, + {"rightsquigarrow", 8605, "\xe2\x86\x9d"}, + {"Diamond", 8900, "\xe2\x8b\x84"}, + {"curlyeqsucc", 8927, "\xe2\x8b\x9f"}, + {"ijlig", 307, "\xc4\xb3"}, + {"puncsp", 8200, "\xe2\x80\x88"}, + {"hamilt", 8459, "\xe2\x84\x8b"}, + {"mapstoleft", 8612, "\xe2\x86\xa4"}, + {"Copf", 8450, "\xe2\x84\x82"}, + {"prnsim", 8936, "\xe2\x8b\xa8"}, + {"DotDot", 8412, "\xe2\x83\x9c"}, + {"lobrk", 10214, "\xe2\x9f\xa6"}, + {"twoheadrightarrow", 8608, "\xe2\x86\xa0"}, + {"ngE", 8807, "\xe2\x89\xa7\xcc\xb8"}, + {"cylcty", 9005, "\xe2\x8c\xad"}, + {"sube", 8838, "\xe2\x8a\x86"}, + {"NotEqualTilde", 8770, "\xe2\x89\x82\xcc\xb8"}, + {"Yuml", 376, "\xc5\xb8"}, + {"comp", 8705, "\xe2\x88\x81"}, + {"dotminus", 8760, "\xe2\x88\xb8"}, + {"crarr", 8629, "\xe2\x86\xb5"}, + {"imped", 437, "\xc6\xb5"}, + {"barwedge", 8965, "\xe2\x8c\x85"}, + {"harrcir", 10568, "\xe2\xa5\x88"}, }; +#ifdef __cplusplus +} +#endif + #endif diff --git a/src/libserver/html_tags.h b/src/libserver/html_tags.h index c865fa21a..8f430204e 100644 --- a/src/libserver/html_tags.h +++ b/src/libserver/html_tags.h @@ -16,9 +16,12 @@ #ifndef SRC_LIBSERVER_HTML_TAGS_H_ #define SRC_LIBSERVER_HTML_TAGS_H_ +#ifdef __cplusplus +extern "C" { +#endif + /* Known HTML tags */ -typedef enum -{ +typedef enum { Tag_UNKNOWN, /**< Unknown tag! */ Tag_A, /**< A */ Tag_ABBR, /**< ABBR */ @@ -196,5 +199,8 @@ typedef enum /* Unique elements */ #define CM_UNIQUE (1 << 22) +#ifdef __cplusplus +} +#endif #endif /* SRC_LIBSERVER_HTML_TAGS_H_ */ diff --git a/src/libserver/milter.h b/src/libserver/milter.h index 7906aeadf..00fd38488 100644 --- a/src/libserver/milter.h +++ b/src/libserver/milter.h @@ -23,6 +23,10 @@ #include "contrib/libev/ev.h" #include "ref.h" +#ifdef __cplusplus +extern "C" { +#endif + enum rspamd_milter_reply { RSPAMD_MILTER_ADDRCPT = '+', RSPAMD_MILTER_DELRCPT = '-', @@ -69,10 +73,11 @@ struct rspamd_milter_session { }; typedef void (*rspamd_milter_finish) (gint fd, - struct rspamd_milter_session *session, void *ud); + struct rspamd_milter_session *session, void *ud); + typedef void (*rspamd_milter_error) (gint fd, - struct rspamd_milter_session *session, - void *ud, GError *err); + struct rspamd_milter_session *session, + void *ud, GError *err); /** * Handles socket with milter protocol @@ -83,9 +88,9 @@ typedef void (*rspamd_milter_error) (gint fd, * @return */ gboolean rspamd_milter_handle_socket (gint fd, ev_tstamp timeout, - rspamd_mempool_t *pool, - struct ev_loop *ev_base, rspamd_milter_finish finish_cb, - rspamd_milter_error error_cb, void *ud); + rspamd_mempool_t *pool, + struct ev_loop *ev_base, rspamd_milter_finish finish_cb, + rspamd_milter_error error_cb, void *ud); /** * Updates userdata for a session, returns previous userdata @@ -93,8 +98,8 @@ gboolean rspamd_milter_handle_socket (gint fd, ev_tstamp timeout, * @param ud * @return */ -void * rspamd_milter_update_userdata (struct rspamd_milter_session *session, - void *ud); +void *rspamd_milter_update_userdata (struct rspamd_milter_session *session, + void *ud); /** * Sets SMTP reply string @@ -105,9 +110,9 @@ void * rspamd_milter_update_userdata (struct rspamd_milter_session *session, * @return */ gboolean rspamd_milter_set_reply (struct rspamd_milter_session *session, - rspamd_fstring_t *rcode, - rspamd_fstring_t *xcode, - rspamd_fstring_t *reply); + rspamd_fstring_t *rcode, + rspamd_fstring_t *xcode, + rspamd_fstring_t *reply); /** * Send some action to the MTA @@ -117,7 +122,7 @@ gboolean rspamd_milter_set_reply (struct rspamd_milter_session *session, * @return */ gboolean rspamd_milter_send_action (struct rspamd_milter_session *session, - enum rspamd_milter_reply act, ...); + enum rspamd_milter_reply act, ...); /** * Adds some header @@ -127,7 +132,7 @@ gboolean rspamd_milter_send_action (struct rspamd_milter_session *session, * @return */ gboolean rspamd_milter_add_header (struct rspamd_milter_session *session, - GString *name, GString *value); + GString *name, GString *value); /** * Removes some header @@ -136,11 +141,11 @@ gboolean rspamd_milter_add_header (struct rspamd_milter_session *session, * @return */ gboolean rspamd_milter_del_header (struct rspamd_milter_session *session, - GString *name); + GString *name); void rspamd_milter_session_unref (struct rspamd_milter_session *session); -struct rspamd_milter_session * rspamd_milter_session_ref ( +struct rspamd_milter_session *rspamd_milter_session_ref ( struct rspamd_milter_session *session); /** @@ -148,7 +153,7 @@ struct rspamd_milter_session * rspamd_milter_session_ref ( * @param session * @return */ -struct rspamd_http_message * rspamd_milter_to_http ( +struct rspamd_http_message *rspamd_milter_to_http ( struct rspamd_milter_session *session); /** @@ -157,7 +162,7 @@ struct rspamd_http_message * rspamd_milter_to_http ( * @param results */ void rspamd_milter_send_task_results (struct rspamd_milter_session *session, - const ucl_object_t *results); + const ucl_object_t *results); /** * Init internal milter context @@ -173,4 +178,8 @@ void rspamd_milter_init_library (const struct rspamd_milter_context *ctx); rspamd_mempool_t *rspamd_milter_get_session_pool ( struct rspamd_milter_session *session); +#ifdef __cplusplus +} +#endif + #endif diff --git a/src/libserver/milter_internal.h b/src/libserver/milter_internal.h index 41862a169..fff6de38f 100644 --- a/src/libserver/milter_internal.h +++ b/src/libserver/milter_internal.h @@ -24,6 +24,10 @@ #include "libutil/str_util.h" #include "libutil/libev_helper.h" +#ifdef __cplusplus +extern "C" { +#endif + enum rspamd_milter_state { st_len_1 = 0, st_len_2, @@ -97,45 +101,45 @@ enum rspamd_milter_io_cmd { /* * Protocol flags */ -#define RSPAMD_MILTER_FLAG_NOUNKNOWN (1L<<8) /* filter does not want unknown cmd */ -#define RSPAMD_MILTER_FLAG_NODATA (1L<<9) /* filter does not want DATA */ -#define RSPAMD_MILTER_FLAG_NR_HDR (1L<<7) /* filter won't reply for header */ -#define RSPAMD_MILTER_FLAG_SKIP (1L<<10)/* MTA supports SMFIR_SKIP */ -#define RSPAMD_MILTER_FLAG_RCPT_REJ (1L<<11)/* filter wants rejected RCPTs */ -#define RSPAMD_MILTER_FLAG_NR_CONN (1L<<12)/* filter won't reply for connect */ -#define RSPAMD_MILTER_FLAG_NR_HELO (1L<<13)/* filter won't reply for HELO */ -#define RSPAMD_MILTER_FLAG_NR_MAIL (1L<<14)/* filter won't reply for MAIL */ -#define RSPAMD_MILTER_FLAG_NR_RCPT (1L<<15)/* filter won't reply for RCPT */ -#define RSPAMD_MILTER_FLAG_NR_DATA (1L<<16)/* filter won't reply for DATA */ -#define RSPAMD_MILTER_FLAG_NR_UNKN (1L<<17)/* filter won't reply for UNKNOWN */ -#define RSPAMD_MILTER_FLAG_NR_EOH (1L<<18)/* filter won't reply for eoh */ -#define RSPAMD_MILTER_FLAG_NR_BODY (1L<<19)/* filter won't reply for body chunk */ +#define RSPAMD_MILTER_FLAG_NOUNKNOWN (1L<<8) /* filter does not want unknown cmd */ +#define RSPAMD_MILTER_FLAG_NODATA (1L<<9) /* filter does not want DATA */ +#define RSPAMD_MILTER_FLAG_NR_HDR (1L<<7) /* filter won't reply for header */ +#define RSPAMD_MILTER_FLAG_SKIP (1L<<10)/* MTA supports SMFIR_SKIP */ +#define RSPAMD_MILTER_FLAG_RCPT_REJ (1L<<11)/* filter wants rejected RCPTs */ +#define RSPAMD_MILTER_FLAG_NR_CONN (1L<<12)/* filter won't reply for connect */ +#define RSPAMD_MILTER_FLAG_NR_HELO (1L<<13)/* filter won't reply for HELO */ +#define RSPAMD_MILTER_FLAG_NR_MAIL (1L<<14)/* filter won't reply for MAIL */ +#define RSPAMD_MILTER_FLAG_NR_RCPT (1L<<15)/* filter won't reply for RCPT */ +#define RSPAMD_MILTER_FLAG_NR_DATA (1L<<16)/* filter won't reply for DATA */ +#define RSPAMD_MILTER_FLAG_NR_UNKN (1L<<17)/* filter won't reply for UNKNOWN */ +#define RSPAMD_MILTER_FLAG_NR_EOH (1L<<18)/* filter won't reply for eoh */ +#define RSPAMD_MILTER_FLAG_NR_BODY (1L<<19)/* filter won't reply for body chunk */ /* * For now, we specify that we want to reply just after EOM */ #define RSPAMD_MILTER_FLAG_NOREPLY_MASK \ - (RSPAMD_MILTER_FLAG_NR_CONN | RSPAMD_MILTER_FLAG_NR_HELO | \ - RSPAMD_MILTER_FLAG_NR_MAIL | RSPAMD_MILTER_FLAG_NR_RCPT | \ - RSPAMD_MILTER_FLAG_NR_DATA | RSPAMD_MILTER_FLAG_NR_UNKN | \ - RSPAMD_MILTER_FLAG_NR_HDR | RSPAMD_MILTER_FLAG_NR_EOH | \ - RSPAMD_MILTER_FLAG_NR_BODY) + (RSPAMD_MILTER_FLAG_NR_CONN | RSPAMD_MILTER_FLAG_NR_HELO | \ + RSPAMD_MILTER_FLAG_NR_MAIL | RSPAMD_MILTER_FLAG_NR_RCPT | \ + RSPAMD_MILTER_FLAG_NR_DATA | RSPAMD_MILTER_FLAG_NR_UNKN | \ + RSPAMD_MILTER_FLAG_NR_HDR | RSPAMD_MILTER_FLAG_NR_EOH | \ + RSPAMD_MILTER_FLAG_NR_BODY) /* * Options that the filter may send at initial handshake time, and message * modifications that the filter may request at the end of the message body. */ -#define RSPAMD_MILTER_FLAG_ADDHDRS (1L<<0) /* filter may add headers */ -#define RSPAMD_MILTER_FLAG_CHGBODY (1L<<1) /* filter may replace body */ -#define RSPAMD_MILTER_FLAG_ADDRCPT (1L<<2) /* filter may add recipients */ -#define RSPAMD_MILTER_FLAG_DELRCPT (1L<<3) /* filter may delete recipients */ -#define RSPAMD_MILTER_FLAG_CHGHDRS (1L<<4) /* filter may change/delete headers */ -#define RSPAMD_MILTER_FLAG_QUARANTINE (1L<<5) /* filter may request quarantine */ +#define RSPAMD_MILTER_FLAG_ADDHDRS (1L<<0) /* filter may add headers */ +#define RSPAMD_MILTER_FLAG_CHGBODY (1L<<1) /* filter may replace body */ +#define RSPAMD_MILTER_FLAG_ADDRCPT (1L<<2) /* filter may add recipients */ +#define RSPAMD_MILTER_FLAG_DELRCPT (1L<<3) /* filter may delete recipients */ +#define RSPAMD_MILTER_FLAG_CHGHDRS (1L<<4) /* filter may change/delete headers */ +#define RSPAMD_MILTER_FLAG_QUARANTINE (1L<<5) /* filter may request quarantine */ #define RSPAMD_MILTER_ACTIONS_MASK \ - (RSPAMD_MILTER_FLAG_ADDHDRS | RSPAMD_MILTER_FLAG_ADDRCPT | \ - RSPAMD_MILTER_FLAG_DELRCPT | RSPAMD_MILTER_FLAG_CHGHDRS | \ - RSPAMD_MILTER_FLAG_QUARANTINE) + (RSPAMD_MILTER_FLAG_ADDHDRS | RSPAMD_MILTER_FLAG_ADDRCPT | \ + RSPAMD_MILTER_FLAG_DELRCPT | RSPAMD_MILTER_FLAG_CHGHDRS | \ + RSPAMD_MILTER_FLAG_QUARANTINE) enum rspamd_milter_connect_proto { RSPAMD_MILTER_CONN_UNKNOWN = 'U', @@ -163,4 +167,9 @@ enum rspamd_milter_connect_proto { #define RSPAMD_MILTER_SPAM_HEADER "X-Spam" #define RSPAMD_MILTER_DKIM_HEADER "DKIM-Signature" #define RSPAMD_MILTER_ACTION_HEADER "X-Rspamd-Action" + +#ifdef __cplusplus +} #endif + +#endif
\ No newline at end of file diff --git a/src/libserver/monitored.h b/src/libserver/monitored.h index 0189e0e6c..5b2b60d11 100644 --- a/src/libserver/monitored.h +++ b/src/libserver/monitored.h @@ -19,6 +19,10 @@ #include "config.h" #include "rdns.h" +#ifdef __cplusplus +extern "C" { +#endif + struct rspamd_monitored; struct rspamd_monitored_ctx; struct rspamd_config; @@ -41,8 +45,9 @@ enum rspamd_monitored_flags { struct rspamd_monitored_ctx *rspamd_monitored_ctx_init (void); typedef void (*mon_change_cb) (struct rspamd_monitored_ctx *ctx, - struct rspamd_monitored *m, gboolean alive, - void *ud); + struct rspamd_monitored *m, gboolean alive, + void *ud); + /** * Configure context for monitored objects * @param ctx context @@ -51,11 +56,11 @@ typedef void (*mon_change_cb) (struct rspamd_monitored_ctx *ctx, * @param resolver resolver object */ void rspamd_monitored_ctx_config (struct rspamd_monitored_ctx *ctx, - struct rspamd_config *cfg, - struct ev_loop *ev_base, - struct rdns_resolver *resolver, - mon_change_cb change_cb, - gpointer ud); + struct rspamd_config *cfg, + struct ev_loop *ev_base, + struct rdns_resolver *resolver, + mon_change_cb change_cb, + gpointer ud); struct ev_loop *rspamd_monitored_ctx_get_ev_base (struct rspamd_monitored_ctx *ctx); @@ -74,8 +79,9 @@ struct rspamd_monitored *rspamd_monitored_create_ ( enum rspamd_monitored_flags flags, const ucl_object_t *opts, const gchar *loc); + #define rspamd_monitored_create(ctx, line, type, flags, opts) \ - rspamd_monitored_create_(ctx, line, type, flags, opts, G_STRFUNC) + rspamd_monitored_create_(ctx, line, type, flags, opts, G_STRFUNC) /** * Return monitored by its tag @@ -83,8 +89,8 @@ struct rspamd_monitored *rspamd_monitored_create_ ( * @param tag * @return */ -struct rspamd_monitored * rspamd_monitored_by_tag (struct rspamd_monitored_ctx *ctx, - guchar tag[RSPAMD_MONITORED_TAG_LEN]); +struct rspamd_monitored *rspamd_monitored_by_tag (struct rspamd_monitored_ctx *ctx, + guchar tag[RSPAMD_MONITORED_TAG_LEN]); /** * Sets `tag_out` to the monitored tag @@ -92,7 +98,7 @@ struct rspamd_monitored * rspamd_monitored_by_tag (struct rspamd_monitored_ctx * * @param tag_out */ void rspamd_monitored_get_tag (struct rspamd_monitored *m, - guchar tag_out[RSPAMD_MONITORED_TAG_LEN]); + guchar tag_out[RSPAMD_MONITORED_TAG_LEN]); /** * Return TRUE if monitored object is alive @@ -134,6 +140,7 @@ gdouble rspamd_monitored_latency (struct rspamd_monitored *m); * @param m */ void rspamd_monitored_stop (struct rspamd_monitored *m); + /** * Explicitly enable monitored object * @param m @@ -146,4 +153,8 @@ void rspamd_monitored_start (struct rspamd_monitored *m); */ void rspamd_monitored_ctx_destroy (struct rspamd_monitored_ctx *ctx); +#ifdef __cplusplus +} +#endif + #endif /* SRC_LIBSERVER_MONITORED_H_ */ diff --git a/src/libserver/protocol.h b/src/libserver/protocol.h index 2059110fb..280ceedcb 100644 --- a/src/libserver/protocol.h +++ b/src/libserver/protocol.h @@ -11,6 +11,10 @@ #include "http_connection.h" #include "task.h" +#ifdef __cplusplus +extern "C" { +#endif + #define RSPAMD_BASE_ERROR 500 #define RSPAMD_FILTER_ERROR RSPAMD_BASE_ERROR + 1 #define RSPAMD_NETWORK_ERROR RSPAMD_BASE_ERROR + 2 @@ -40,7 +44,7 @@ struct rspamd_metric; * @return */ gboolean rspamd_protocol_handle_headers (struct rspamd_task *task, - struct rspamd_http_message *msg); + struct rspamd_http_message *msg); /** * Process control chunk and update task structure accordingly @@ -49,7 +53,7 @@ gboolean rspamd_protocol_handle_headers (struct rspamd_task *task, * @return */ gboolean rspamd_protocol_handle_control (struct rspamd_task *task, - const ucl_object_t *control); + const ucl_object_t *control); /** * Process HTTP request to the task structure @@ -58,7 +62,7 @@ gboolean rspamd_protocol_handle_control (struct rspamd_task *task, * @return */ gboolean rspamd_protocol_handle_request (struct rspamd_task *task, - struct rspamd_http_message *msg); + struct rspamd_http_message *msg); /** * Write task results to http message @@ -66,7 +70,8 @@ gboolean rspamd_protocol_handle_request (struct rspamd_task *task, * @param task */ void rspamd_protocol_http_reply (struct rspamd_http_message *msg, - struct rspamd_task *task, ucl_object_t **pobj); + struct rspamd_task *task, ucl_object_t **pobj); + /** * Write data to log pipes * @param task @@ -84,19 +89,20 @@ enum rspamd_protocol_flags { }; #define RSPAMD_PROTOCOL_DEFAULT (RSPAMD_PROTOCOL_BASIC| \ - RSPAMD_PROTOCOL_METRICS| \ - RSPAMD_PROTOCOL_MESSAGES| \ - RSPAMD_PROTOCOL_RMILTER| \ - RSPAMD_PROTOCOL_DKIM| \ - RSPAMD_PROTOCOL_EXTRA) + RSPAMD_PROTOCOL_METRICS| \ + RSPAMD_PROTOCOL_MESSAGES| \ + RSPAMD_PROTOCOL_RMILTER| \ + RSPAMD_PROTOCOL_DKIM| \ + RSPAMD_PROTOCOL_EXTRA) + /** * Write reply to ucl object filling log buffer * @param task * @param logbuf * @return */ -ucl_object_t * rspamd_protocol_write_ucl (struct rspamd_task *task, - enum rspamd_protocol_flags flags); +ucl_object_t *rspamd_protocol_write_ucl (struct rspamd_task *task, + enum rspamd_protocol_flags flags); /** * Write reply for specified task command @@ -112,9 +118,13 @@ void rspamd_protocol_write_reply (struct rspamd_task *task, ev_tstamp timeout); * @param out */ void rspamd_ucl_torspamc_output (const ucl_object_t *top, - rspamd_fstring_t **out); + rspamd_fstring_t **out); + +void rspamd_ucl_tospamc_output (const ucl_object_t *top, + rspamd_fstring_t **out); -void rspamd_ucl_tospamc_output (const ucl_object_t *top, - rspamd_fstring_t **out); +#ifdef __cplusplus +} +#endif #endif diff --git a/src/libserver/protocol_internal.h b/src/libserver/protocol_internal.h index fb2ee115a..1c49a04f2 100644 --- a/src/libserver/protocol_internal.h +++ b/src/libserver/protocol_internal.h @@ -17,6 +17,10 @@ #ifndef RSPAMD_PROTOCOL_INTERNAL_H #define RSPAMD_PROTOCOL_INTERNAL_H +#ifdef __cplusplus +extern "C" { +#endif + /* * Just check if the passed message is spam or not and reply as * described below @@ -85,4 +89,8 @@ #define MAILER_HEADER "Mailer" #define RAW_DATA_HEADER "Raw" +#ifdef __cplusplus +} +#endif + #endif //RSPAMD_PROTOCOL_INTERNAL_H diff --git a/src/libserver/re_cache.h b/src/libserver/re_cache.h index 15146c5dd..b9f80375e 100644 --- a/src/libserver/re_cache.h +++ b/src/libserver/re_cache.h @@ -19,6 +19,10 @@ #include "config.h" #include "libutil/regexp.h" +#ifdef __cplusplus +extern "C" { +#endif + struct rspamd_re_cache; struct rspamd_re_runtime; struct rspamd_task; @@ -76,14 +80,14 @@ rspamd_re_cache_add (struct rspamd_re_cache *cache, rspamd_regexp_t *re, * @param with regexp object to replace the origin */ void rspamd_re_cache_replace (struct rspamd_re_cache *cache, - rspamd_regexp_t *what, - rspamd_regexp_t *with); + rspamd_regexp_t *what, + rspamd_regexp_t *with); /** * Initialize and optimize re cache structure */ void rspamd_re_cache_init (struct rspamd_re_cache *cache, - struct rspamd_config *cfg); + struct rspamd_config *cfg); /** * Returns true when hyperscan is loaded @@ -95,13 +99,13 @@ gboolean rspamd_re_cache_is_hs_loaded (struct rspamd_re_cache *cache); /** * Get runtime data for a cache */ -struct rspamd_re_runtime* rspamd_re_cache_runtime_new (struct rspamd_re_cache *cache); +struct rspamd_re_runtime *rspamd_re_cache_runtime_new (struct rspamd_re_cache *cache); /** * Get runtime statistics */ const struct rspamd_re_cache_stat * - rspamd_re_cache_get_stat (struct rspamd_re_runtime *rt); +rspamd_re_cache_get_stat (struct rspamd_re_runtime *rt); /** * Process regexp runtime and return the result for a specific regexp @@ -114,17 +118,17 @@ const struct rspamd_re_cache_stat * * @param is_strong use case sensitive match when looking for headers */ gint rspamd_re_cache_process (struct rspamd_task *task, - rspamd_regexp_t *re, - enum rspamd_re_type type, - gconstpointer type_data, - gsize datalen, - gboolean is_strong); + rspamd_regexp_t *re, + enum rspamd_re_type type, + gconstpointer type_data, + gsize datalen, + gboolean is_strong); int rspamd_re_cache_process_ffi (void *ptask, - void *pre, - int type, - void *type_data, - int is_strong); + void *pre, + int type, + void *type_data, + int is_strong); /** * Destroy runtime data @@ -135,6 +139,7 @@ void rspamd_re_cache_runtime_destroy (struct rspamd_re_runtime *rt); * Unref re cache */ void rspamd_re_cache_unref (struct rspamd_re_cache *cache); + /** * Retain reference to re cache */ @@ -148,7 +153,7 @@ guint rspamd_re_cache_set_limit (struct rspamd_re_cache *cache, guint limit); /** * Convert re type to a human readable string (constant one) */ -const gchar * rspamd_re_cache_type_to_string (enum rspamd_re_type type); +const gchar *rspamd_re_cache_type_to_string (enum rspamd_re_type type); /** * Convert re type string to the type enum @@ -159,25 +164,30 @@ enum rspamd_re_type rspamd_re_cache_type_from_string (const char *str); * Compile expressions to the hyperscan tree and store in the `cache_dir` */ gint rspamd_re_cache_compile_hyperscan (struct rspamd_re_cache *cache, - const char *cache_dir, gdouble max_time, gboolean silent, - GError **err); + const char *cache_dir, gdouble max_time, gboolean silent, + GError **err); /** * Returns TRUE if the specified file is valid hyperscan cache */ gboolean rspamd_re_cache_is_valid_hyperscan_file (struct rspamd_re_cache *cache, - const char *path, gboolean silent, gboolean try_load); + const char *path, gboolean silent, gboolean try_load); /** * Loads all hyperscan regexps precompiled */ gboolean rspamd_re_cache_load_hyperscan (struct rspamd_re_cache *cache, - const char *cache_dir); + const char *cache_dir); /** * Registers lua selector in the cache */ void rspamd_re_cache_add_selector (struct rspamd_re_cache *cache, - const gchar *sname, gint ref); + const gchar *sname, gint ref); + +#ifdef __cplusplus +} +#endif + #endif diff --git a/src/libserver/redis_pool.h b/src/libserver/redis_pool.h index 7a9bf99ab..0df650326 100644 --- a/src/libserver/redis_pool.h +++ b/src/libserver/redis_pool.h @@ -18,6 +18,10 @@ #include "config.h" +#ifdef __cplusplus +extern "C" { +#endif + struct rspamd_redis_pool; struct rspamd_config; struct redisAsyncContext; @@ -35,8 +39,8 @@ struct rspamd_redis_pool *rspamd_redis_pool_init (void); * @param ev_base */ void rspamd_redis_pool_config (struct rspamd_redis_pool *pool, - struct rspamd_config *cfg, - struct ev_loop *ev_base); + struct rspamd_config *cfg, + struct ev_loop *ev_base); /** @@ -48,7 +52,7 @@ void rspamd_redis_pool_config (struct rspamd_redis_pool *pool, * @param port * @return */ -struct redisAsyncContext* rspamd_redis_pool_connect ( +struct redisAsyncContext *rspamd_redis_pool_connect ( struct rspamd_redis_pool *pool, const gchar *db, const gchar *password, const char *ip, int port); @@ -65,7 +69,8 @@ enum rspamd_redis_pool_release_type { * @param ctx */ void rspamd_redis_pool_release_connection (struct rspamd_redis_pool *pool, - struct redisAsyncContext *ctx, enum rspamd_redis_pool_release_type how); + struct redisAsyncContext *ctx, + enum rspamd_redis_pool_release_type how); /** * Stops redis pool and destroys it @@ -78,6 +83,10 @@ void rspamd_redis_pool_destroy (struct rspamd_redis_pool *pool); * @param type * @return */ -const gchar* rspamd_redis_type_to_string (int type); +const gchar *rspamd_redis_type_to_string (int type); + +#ifdef __cplusplus +} +#endif #endif /* SRC_LIBSERVER_REDIS_POOL_H_ */ diff --git a/src/libserver/roll_history.h b/src/libserver/roll_history.h index d0f140098..aeb731e82 100644 --- a/src/libserver/roll_history.h +++ b/src/libserver/roll_history.h @@ -19,6 +19,10 @@ #include "config.h" #include "mem_pool.h" +#ifdef __cplusplus +extern "C" { +#endif + /* * Roll history is a special cycled buffer for checked messages, it is designed for writing history messages * and displaying them in webui @@ -58,8 +62,8 @@ struct roll_history { * @param pool pool for shared memory * @return new structure */ -struct roll_history * rspamd_roll_history_new (rspamd_mempool_t *pool, - guint max_rows, struct rspamd_config *cfg); +struct roll_history *rspamd_roll_history_new (rspamd_mempool_t *pool, + guint max_rows, struct rspamd_config *cfg); /** * Update roll history with data from task @@ -67,7 +71,7 @@ struct roll_history * rspamd_roll_history_new (rspamd_mempool_t *pool, * @param task task object */ void rspamd_roll_history_update (struct roll_history *history, - struct rspamd_task *task); + struct rspamd_task *task); /** * Load previously saved history from file @@ -76,7 +80,7 @@ void rspamd_roll_history_update (struct roll_history *history, * @return TRUE if history has been loaded */ gboolean rspamd_roll_history_load (struct roll_history *history, - const gchar *filename); + const gchar *filename); /** * Save history to file @@ -85,6 +89,10 @@ gboolean rspamd_roll_history_load (struct roll_history *history, * @return TRUE if history has been saved */ gboolean rspamd_roll_history_save (struct roll_history *history, - const gchar *filename); + const gchar *filename); + +#ifdef __cplusplus +} +#endif #endif /* ROLL_HISTORY_H_ */ diff --git a/src/libserver/rspamd_control.h b/src/libserver/rspamd_control.h index 1928ab00f..08d3946c7 100644 --- a/src/libserver/rspamd_control.h +++ b/src/libserver/rspamd_control.h @@ -20,6 +20,10 @@ #include "mem_pool.h" #include "contrib/libev/ev.h" +#ifdef __cplusplus +extern "C" { +#endif + struct rspamd_main; struct rspamd_worker; @@ -179,42 +183,42 @@ struct rspamd_srv_reply { }; typedef gboolean (*rspamd_worker_control_handler) (struct rspamd_main *rspamd_main, - struct rspamd_worker *worker, - gint fd, - gint attached_fd, - struct rspamd_control_command *cmd, - gpointer ud); + struct rspamd_worker *worker, + gint fd, + gint attached_fd, + struct rspamd_control_command *cmd, + gpointer ud); typedef void (*rspamd_srv_reply_handler) (struct rspamd_worker *worker, - struct rspamd_srv_reply *rep, gint rep_fd, - gpointer ud); + struct rspamd_srv_reply *rep, gint rep_fd, + gpointer ud); /** * Process client socket connection */ void rspamd_control_process_client_socket (struct rspamd_main *rspamd_main, - gint fd, rspamd_inet_addr_t *addr); + gint fd, rspamd_inet_addr_t *addr); /** * Register default handlers for a worker */ void rspamd_control_worker_add_default_handler (struct rspamd_worker *worker, - struct ev_loop *ev_base); + struct ev_loop *ev_base); /** * Register custom handler for a specific control command for this worker */ void rspamd_control_worker_add_cmd_handler (struct rspamd_worker *worker, - enum rspamd_control_type type, - rspamd_worker_control_handler handler, - gpointer ud); + enum rspamd_control_type type, + rspamd_worker_control_handler handler, + gpointer ud); /** * Start watching on srv pipe */ void rspamd_srv_start_watching (struct rspamd_main *srv, - struct rspamd_worker *worker, - struct ev_loop *ev_base); + struct rspamd_worker *worker, + struct ev_loop *ev_base); /** @@ -222,9 +226,14 @@ void rspamd_srv_start_watching (struct rspamd_main *srv, * end */ void rspamd_srv_send_command (struct rspamd_worker *worker, - struct ev_loop *ev_base, - struct rspamd_srv_command *cmd, - gint attached_fd, - rspamd_srv_reply_handler handler, - gpointer ud); + struct ev_loop *ev_base, + struct rspamd_srv_command *cmd, + gint attached_fd, + rspamd_srv_reply_handler handler, + gpointer ud); + +#ifdef __cplusplus +} +#endif + #endif diff --git a/src/libserver/rspamd_symcache.h b/src/libserver/rspamd_symcache.h index 640a1c898..ce2f3f7bf 100644 --- a/src/libserver/rspamd_symcache.h +++ b/src/libserver/rspamd_symcache.h @@ -19,9 +19,14 @@ #include "config.h" #include "ucl.h" #include "cfg_file.h" -#include <lua.h> #include "contrib/libev/ev.h" +#include <lua.h> + +#ifdef __cplusplus +extern "C" { +#endif + struct rspamd_task; struct rspamd_config; struct rspamd_symcache; @@ -29,9 +34,9 @@ struct rspamd_worker; struct rspamd_symcache_item; struct rspamd_config_settings_elt; -typedef void (*symbol_func_t)(struct rspamd_task *task, - struct rspamd_symcache_item *item, - gpointer user_data); +typedef void (*symbol_func_t) (struct rspamd_task *task, + struct rspamd_symcache_item *item, + gpointer user_data); enum rspamd_symbol_type { SYMBOL_TYPE_NORMAL = (1u << 0u), @@ -67,7 +72,7 @@ struct rspamd_abstract_callback_data { * Creates new cache structure * @return */ -struct rspamd_symcache* rspamd_symcache_new (struct rspamd_config *cfg); +struct rspamd_symcache *rspamd_symcache_new (struct rspamd_config *cfg); /** * Remove the cache structure syncing data if needed @@ -112,6 +117,7 @@ gint rspamd_symcache_add_symbol (struct rspamd_symcache *cache, */ void rspamd_symcache_set_peak_callback (struct rspamd_symcache *cache, gint cbref); + /** * Add delayed condition to the specific symbol in cache. So symbol can be absent * to the moment of addition @@ -149,14 +155,15 @@ gboolean rspamd_symcache_stat_symbol (struct rspamd_symcache *cache, gdouble *freq_stddev, gdouble *tm, guint *nhits); + /** * Find symbol in cache by its id * @param cache * @param id * @return symbol's name or NULL */ -const gchar * rspamd_symcache_symbol_by_id (struct rspamd_symcache *cache, - gint id); +const gchar *rspamd_symcache_symbol_by_id (struct rspamd_symcache *cache, + gint id); /** * Returns number of symbols registered in symbols cache @@ -243,13 +250,14 @@ void rspamd_symcache_disable_symbol_perm (struct rspamd_symcache *cache, */ void rspamd_symcache_enable_symbol_perm (struct rspamd_symcache *cache, const gchar *symbol); + /** * Get abstract callback data for a symbol (or its parent symbol) * @param cache cache object * @param symbol symbol name * @return abstract callback data or NULL if symbol is absent or has no data attached */ -struct rspamd_abstract_callback_data* rspamd_symcache_get_cbdata ( +struct rspamd_abstract_callback_data *rspamd_symcache_get_cbdata ( struct rspamd_symcache *cache, const gchar *symbol); /** @@ -259,7 +267,7 @@ struct rspamd_abstract_callback_data* rspamd_symcache_get_cbdata ( * @return */ const gchar *rspamd_symcache_get_parent (struct rspamd_symcache *cache, - const gchar *symbol); + const gchar *symbol); /** * Adds flags to a symbol @@ -269,15 +277,16 @@ const gchar *rspamd_symcache_get_parent (struct rspamd_symcache *cache, * @return */ gboolean rspamd_symcache_add_symbol_flags (struct rspamd_symcache *cache, - const gchar *symbol, - guint flags); + const gchar *symbol, + guint flags); gboolean rspamd_symcache_set_symbol_flags (struct rspamd_symcache *cache, const gchar *symbol, guint flags); guint rspamd_symcache_get_symbol_flags (struct rspamd_symcache *cache, - const gchar *symbol); + const gchar *symbol); + /** * Process settings for task * @param task @@ -338,6 +347,7 @@ gboolean rspamd_symcache_enable_symbol (struct rspamd_task *task, gboolean rspamd_symcache_disable_symbol (struct rspamd_task *task, struct rspamd_symcache *cache, const gchar *symbol); + /** * Process specific function for each cache element (in order they are added) * @param cache @@ -377,20 +387,24 @@ void rspamd_symcache_finalize_item (struct rspamd_task *task, * Increase number of async events pending for an item */ guint rspamd_symcache_item_async_inc_full (struct rspamd_task *task, - struct rspamd_symcache_item *item, - const gchar *subsystem, - const gchar *loc); + struct rspamd_symcache_item *item, + const gchar *subsystem, + const gchar *loc); + #define rspamd_symcache_item_async_inc(task, item, subsystem) \ - rspamd_symcache_item_async_inc_full(task, item, subsystem, G_STRLOC) + rspamd_symcache_item_async_inc_full(task, item, subsystem, G_STRLOC) + /* * Decrease number of async events pending for an item, asserts if no events pending */ guint rspamd_symcache_item_async_dec_full (struct rspamd_task *task, - struct rspamd_symcache_item *item, - const gchar *subsystem, - const gchar *loc); + struct rspamd_symcache_item *item, + const gchar *subsystem, + const gchar *loc); + #define rspamd_symcache_item_async_dec(task, item, subsystem) \ - rspamd_symcache_item_async_dec_full(task, item, subsystem, G_STRLOC) + rspamd_symcache_item_async_dec_full(task, item, subsystem, G_STRLOC) + /** * Decrease number of async events pending for an item, asserts if no events pending * If no events are left, this function calls `rspamd_symbols_cache_finalize_item` and returns TRUE @@ -399,11 +413,12 @@ guint rspamd_symcache_item_async_dec_full (struct rspamd_task *task, * @return */ gboolean rspamd_symcache_item_async_dec_check_full (struct rspamd_task *task, - struct rspamd_symcache_item *item, - const gchar *subsystem, - const gchar *loc); + struct rspamd_symcache_item *item, + const gchar *subsystem, + const gchar *loc); + #define rspamd_symcache_item_async_dec_check(task, item, subsystem) \ - rspamd_symcache_item_async_dec_check_full(task, item, subsystem, G_STRLOC) + rspamd_symcache_item_async_dec_check_full(task, item, subsystem, G_STRLOC) /** * Disables execution of all symbols, excluding those specified in `skip_mask` @@ -446,9 +461,9 @@ bool rspamd_symcache_set_allowed_settings_ids (struct rspamd_symcache *cache, * @param nids */ bool rspamd_symcache_set_forbidden_settings_ids (struct rspamd_symcache *cache, - const gchar *symbol, - const guint32 *ids, - guint nids); + const gchar *symbol, + const guint32 *ids, + guint nids); /** * Returns allowed ids for a symbol as a constant array @@ -457,9 +472,10 @@ bool rspamd_symcache_set_forbidden_settings_ids (struct rspamd_symcache *cache, * @param nids * @return */ -const guint32* rspamd_symcache_get_allowed_settings_ids (struct rspamd_symcache *cache, +const guint32 *rspamd_symcache_get_allowed_settings_ids (struct rspamd_symcache *cache, const gchar *symbol, guint *nids); + /** * Returns denied ids for a symbol as a constant array * @param cache @@ -467,9 +483,9 @@ const guint32* rspamd_symcache_get_allowed_settings_ids (struct rspamd_symcache * @param nids * @return */ -const guint32* rspamd_symcache_get_forbidden_settings_ids (struct rspamd_symcache *cache, - const gchar *symbol, - guint *nids); +const guint32 *rspamd_symcache_get_forbidden_settings_ids (struct rspamd_symcache *cache, + const gchar *symbol, + guint *nids); /** @@ -499,4 +515,9 @@ gboolean rspamd_symcache_is_item_allowed (struct rspamd_task *task, * @return */ enum rspamd_symbol_type rspamd_symcache_item_flags (struct rspamd_symcache_item *item); + +#ifdef __cplusplus +} +#endif + #endif diff --git a/src/libserver/spf.h b/src/libserver/spf.h index 722e98c03..725d84fe4 100644 --- a/src/libserver/spf.h +++ b/src/libserver/spf.h @@ -5,11 +5,15 @@ #include "ref.h" #include "addr.h" +#ifdef __cplusplus +extern "C" { +#endif + struct rspamd_task; struct spf_resolved; -typedef void (*spf_cb_t)(struct spf_resolved *record, - struct rspamd_task *task, gpointer cbdata); +typedef void (*spf_cb_t) (struct spf_resolved *record, + struct rspamd_task *task, gpointer cbdata); typedef enum spf_mech_e { SPF_FAIL, @@ -74,18 +78,18 @@ struct spf_resolved { * Resolve spf record for specified task and call a callback after resolution fails/succeed */ gboolean rspamd_spf_resolve (struct rspamd_task *task, spf_cb_t callback, - gpointer cbdata); + gpointer cbdata); /* * Get a domain for spf for specified task */ -const gchar * rspamd_spf_get_domain (struct rspamd_task *task); +const gchar *rspamd_spf_get_domain (struct rspamd_task *task); /* * Increase refcount */ -struct spf_resolved * spf_record_ref (struct spf_resolved *rec); +struct spf_resolved *spf_record_ref (struct spf_resolved *rec); /* * Decrease refcount @@ -105,6 +109,11 @@ gchar *spf_addr_mask_to_string (struct spf_addr *addr); * @param rec * @return */ -struct spf_addr * spf_addr_match_task (struct rspamd_task *task, - struct spf_resolved *rec); +struct spf_addr *spf_addr_match_task (struct rspamd_task *task, + struct spf_resolved *rec); + +#ifdef __cplusplus +} +#endif + #endif diff --git a/src/libserver/task.h b/src/libserver/task.h index d581378b7..ac55dd910 100644 --- a/src/libserver/task.h +++ b/src/libserver/task.h @@ -24,6 +24,10 @@ #include "dns.h" #include "re_cache.h" +#ifdef __cplusplus +extern "C" { +#endif + enum rspamd_command { CMD_CHECK, CMD_SYMBOLS, @@ -58,33 +62,33 @@ enum rspamd_task_stage { }; #define RSPAMD_TASK_PROCESS_ALL (RSPAMD_TASK_STAGE_CONNECT | \ - RSPAMD_TASK_STAGE_ENVELOPE | \ - RSPAMD_TASK_STAGE_READ_MESSAGE | \ - RSPAMD_TASK_STAGE_PRE_FILTERS | \ - RSPAMD_TASK_STAGE_PROCESS_MESSAGE | \ - RSPAMD_TASK_STAGE_FILTERS | \ - RSPAMD_TASK_STAGE_CLASSIFIERS_PRE | \ - RSPAMD_TASK_STAGE_CLASSIFIERS | \ - RSPAMD_TASK_STAGE_CLASSIFIERS_POST | \ - RSPAMD_TASK_STAGE_COMPOSITES | \ - RSPAMD_TASK_STAGE_POST_FILTERS | \ - RSPAMD_TASK_STAGE_LEARN_PRE | \ - RSPAMD_TASK_STAGE_LEARN | \ - RSPAMD_TASK_STAGE_LEARN_POST | \ - RSPAMD_TASK_STAGE_COMPOSITES_POST | \ - RSPAMD_TASK_STAGE_IDEMPOTENT | \ - RSPAMD_TASK_STAGE_DONE) + RSPAMD_TASK_STAGE_ENVELOPE | \ + RSPAMD_TASK_STAGE_READ_MESSAGE | \ + RSPAMD_TASK_STAGE_PRE_FILTERS | \ + RSPAMD_TASK_STAGE_PROCESS_MESSAGE | \ + RSPAMD_TASK_STAGE_FILTERS | \ + RSPAMD_TASK_STAGE_CLASSIFIERS_PRE | \ + RSPAMD_TASK_STAGE_CLASSIFIERS | \ + RSPAMD_TASK_STAGE_CLASSIFIERS_POST | \ + RSPAMD_TASK_STAGE_COMPOSITES | \ + RSPAMD_TASK_STAGE_POST_FILTERS | \ + RSPAMD_TASK_STAGE_LEARN_PRE | \ + RSPAMD_TASK_STAGE_LEARN | \ + RSPAMD_TASK_STAGE_LEARN_POST | \ + RSPAMD_TASK_STAGE_COMPOSITES_POST | \ + RSPAMD_TASK_STAGE_IDEMPOTENT | \ + RSPAMD_TASK_STAGE_DONE) #define RSPAMD_TASK_PROCESS_LEARN (RSPAMD_TASK_STAGE_CONNECT | \ - RSPAMD_TASK_STAGE_ENVELOPE | \ - RSPAMD_TASK_STAGE_READ_MESSAGE | \ - RSPAMD_TASK_STAGE_PROCESS_MESSAGE | \ - RSPAMD_TASK_STAGE_CLASSIFIERS_PRE | \ - RSPAMD_TASK_STAGE_CLASSIFIERS | \ - RSPAMD_TASK_STAGE_CLASSIFIERS_POST | \ - RSPAMD_TASK_STAGE_LEARN_PRE | \ - RSPAMD_TASK_STAGE_LEARN | \ - RSPAMD_TASK_STAGE_LEARN_POST | \ - RSPAMD_TASK_STAGE_DONE) + RSPAMD_TASK_STAGE_ENVELOPE | \ + RSPAMD_TASK_STAGE_READ_MESSAGE | \ + RSPAMD_TASK_STAGE_PROCESS_MESSAGE | \ + RSPAMD_TASK_STAGE_CLASSIFIERS_PRE | \ + RSPAMD_TASK_STAGE_CLASSIFIERS | \ + RSPAMD_TASK_STAGE_CLASSIFIERS_POST | \ + RSPAMD_TASK_STAGE_LEARN_PRE | \ + RSPAMD_TASK_STAGE_LEARN | \ + RSPAMD_TASK_STAGE_LEARN_POST | \ + RSPAMD_TASK_STAGE_DONE) #define RSPAMD_TASK_FLAG_MIME (1u << 0u) #define RSPAMD_TASK_FLAG_JSON (1u << 1u) @@ -135,80 +139,82 @@ enum rspamd_newlines_type; * Worker task structure */ struct rspamd_task { - struct rspamd_worker *worker; /**< pointer to worker object */ - enum rspamd_command cmd; /**< command */ - gint sock; /**< socket descriptor */ - guint32 flags; /**< Bit flags */ - guint32 dns_requests; /**< number of DNS requests per this task */ - gulong message_len; /**< Message length */ - gchar *helo; /**< helo header value */ - gchar *queue_id; /**< queue id if specified */ - const gchar *message_id; /**< message id */ - rspamd_inet_addr_t *from_addr; /**< from addr for a task */ - rspamd_inet_addr_t *client_addr; /**< address of connected socket */ - gchar *deliver_to; /**< address to deliver */ - gchar *user; /**< user to deliver */ - gchar *subject; /**< subject (for non-mime) */ - const gchar *hostname; /**< hostname reported by MTA */ - GHashTable *request_headers; /**< HTTP headers in a request */ - GHashTable *reply_headers; /**< Custom reply headers */ + struct rspamd_worker *worker; /**< pointer to worker object */ + enum rspamd_command cmd; /**< command */ + gint sock; /**< socket descriptor */ + guint32 flags; /**< Bit flags */ + guint32 dns_requests; /**< number of DNS requests per this task */ + gulong message_len; /**< Message length */ + gchar *helo; /**< helo header value */ + gchar *queue_id; /**< queue id if specified */ + const gchar *message_id; /**< message id */ + rspamd_inet_addr_t *from_addr; /**< from addr for a task */ + rspamd_inet_addr_t *client_addr; /**< address of connected socket */ + gchar *deliver_to; /**< address to deliver */ + gchar *user; /**< user to deliver */ + gchar *subject; /**< subject (for non-mime) */ + const gchar *hostname; /**< hostname reported by MTA */ + GHashTable *request_headers; /**< HTTP headers in a request */ + GHashTable *reply_headers; /**< Custom reply headers */ struct { const gchar *begin; gsize len; gchar *fpath; - } msg; /**< message buffer */ - struct rspamd_http_connection *http_conn; /**< HTTP server connection */ - struct rspamd_async_session * s; /**< async session object */ - GPtrArray *parts; /**< list of parsed parts */ - GPtrArray *text_parts; /**< list of text parts */ + } msg; /**< message buffer */ + struct rspamd_http_connection *http_conn; /**< HTTP server connection */ + struct rspamd_async_session *s; /**< async session object */ + GPtrArray *parts; /**< list of parsed parts */ + GPtrArray *text_parts; /**< list of text parts */ struct { const gchar *begin; gsize len; const gchar *body_start; - } raw_headers_content; /**< list of raw headers */ - GPtrArray *received; /**< list of received headers */ - GHashTable *urls; /**< list of parsed urls */ - GHashTable *emails; /**< list of parsed emails */ - GHashTable *raw_headers; /**< list of raw headers */ - GQueue *headers_order; /**< order of raw headers */ - struct rspamd_metric_result *result; /**< Metric result */ - GHashTable *lua_cache; /**< cache of lua objects */ - GPtrArray *tokens; /**< statistics tokens */ - GArray *meta_words; /**< rspamd_stat_token_t produced from meta headers + } raw_headers_content; /**< list of raw headers */ + GPtrArray *received; /**< list of received headers */ + GHashTable *urls; /**< list of parsed urls */ + GHashTable *emails; /**< list of parsed emails */ + GHashTable *raw_headers; /**< list of raw headers */ + GQueue *headers_order; /**< order of raw headers */ + struct rspamd_metric_result *result; /**< Metric result */ + GHashTable *lua_cache; /**< cache of lua objects */ + GPtrArray *tokens; /**< statistics tokens */ + GArray *meta_words; /**< rspamd_stat_token_t produced from meta headers (e.g. Subject) */ GPtrArray *rcpt_mime; - GPtrArray *rcpt_envelope; /**< array of rspamd_email_address */ + GPtrArray *rcpt_envelope; /**< array of rspamd_email_address */ GPtrArray *from_mime; struct rspamd_email_address *from_envelope; - enum rspamd_newlines_type nlines_type; /**< type of newlines (detected on most of headers */ + enum rspamd_newlines_type nlines_type; /**< type of newlines (detected on most of headers */ - ucl_object_t *messages; /**< list of messages that would be reported */ - struct rspamd_re_runtime *re_rt; /**< regexp runtime */ - GPtrArray *stat_runtimes; /**< backend runtime */ - struct rspamd_config *cfg; /**< pointer to config object */ + ucl_object_t *messages; /**< list of messages that would be reported */ + struct rspamd_re_runtime *re_rt; /**< regexp runtime */ + GPtrArray *stat_runtimes; /**< backend runtime */ + struct rspamd_config *cfg; /**< pointer to config object */ GError *err; - rspamd_mempool_t *task_pool; /**< memory pool for task */ + rspamd_mempool_t *task_pool; /**< memory pool for task */ double time_virtual; double time_real_finish; double time_virtual_finish; ev_tstamp task_timestamp; - gboolean (*fin_callback)(struct rspamd_task *task, void *arg); - /**< callback for filters finalizing */ - void *fin_arg; /**< argument for fin callback */ - - struct rspamd_dns_resolver *resolver; /**< DNS resolver */ - struct ev_loop *event_loop; /**< Event base */ - struct ev_timer timeout_ev; /**< Global task timeout */ - struct ev_io guard_ev; /**< Event for input sanity guard */ - - gpointer checkpoint; /**< Opaque checkpoint data */ - ucl_object_t *settings; /**< Settings applied to task */ - guint32 processed_stages; /**< bits of stages that are processed */ - struct rspamd_config_settings_elt *settings_elt; /**< preprocessed settings id elt */ - - const gchar *classifier; /**< Classifier to learn (if needed) */ - struct rspamd_lang_detector *lang_det; /**< Languages detector */ + + gboolean (*fin_callback) (struct rspamd_task *task, void *arg); + + /**< callback for filters finalizing */ + void *fin_arg; /**< argument for fin callback */ + + struct rspamd_dns_resolver *resolver; /**< DNS resolver */ + struct ev_loop *event_loop; /**< Event base */ + struct ev_timer timeout_ev; /**< Global task timeout */ + struct ev_io guard_ev; /**< Event for input sanity guard */ + + gpointer checkpoint; /**< Opaque checkpoint data */ + ucl_object_t *settings; /**< Settings applied to task */ + guint32 processed_stages; /**< bits of stages that are processed */ + struct rspamd_config_settings_elt *settings_elt; /**< preprocessed settings id elt */ + + const gchar *classifier; /**< Classifier to learn (if needed) */ + struct rspamd_lang_detector *lang_det; /**< Languages detector */ guchar digest[16]; }; @@ -220,6 +226,7 @@ struct rspamd_task *rspamd_task_new (struct rspamd_worker *worker, rspamd_mempool_t *pool, struct rspamd_lang_detector *lang_det, struct ev_loop *event_loop); + /** * Destroy task object and remove its IO dispatcher if it exists */ @@ -245,7 +252,7 @@ gboolean rspamd_task_fin (void *arg); * @return */ gboolean rspamd_task_load_message (struct rspamd_task *task, - struct rspamd_http_message *msg, const gchar *start, gsize len); + struct rspamd_http_message *msg, const gchar *start, gsize len); /** * Process task @@ -259,7 +266,7 @@ gboolean rspamd_task_process (struct rspamd_task *task, guint stages); * @param task * @return */ -struct rspamd_email_address* rspamd_task_get_sender (struct rspamd_task *task); +struct rspamd_email_address *rspamd_task_get_sender (struct rspamd_task *task); /** * Return addresses in the following precedence: @@ -287,9 +294,9 @@ gboolean rspamd_task_add_recipient (struct rspamd_task *task, const gchar *rcpt) * @return true if learn succeed */ gboolean rspamd_learn_task_spam (struct rspamd_task *task, - gboolean is_spam, - const gchar *classifier, - GError **err); + gboolean is_spam, + const gchar *classifier, + GError **err); /** * Returns required score for a message (usually reject score) @@ -298,8 +305,9 @@ gboolean rspamd_learn_task_spam (struct rspamd_task *task, * @return */ struct rspamd_metric_result; + gdouble rspamd_task_get_required_score (struct rspamd_task *task, - struct rspamd_metric_result *m); + struct rspamd_metric_result *m); /** * Returns the first header as value for a header @@ -307,8 +315,8 @@ gdouble rspamd_task_get_required_score (struct rspamd_task *task, * @param name * @return */ -rspamd_ftok_t * rspamd_task_get_request_header (struct rspamd_task *task, - const gchar *name); +rspamd_ftok_t *rspamd_task_get_request_header (struct rspamd_task *task, + const gchar *name); /** * Returns all headers with the specific name @@ -316,8 +324,8 @@ rspamd_ftok_t * rspamd_task_get_request_header (struct rspamd_task *task, * @param name * @return */ -GPtrArray* rspamd_task_get_request_header_multiple (struct rspamd_task *task, - const gchar *name); +GPtrArray *rspamd_task_get_request_header_multiple (struct rspamd_task *task, + const gchar *name); /** * Adds a new request header to task (name and value should be mapped to fstring) @@ -326,7 +334,7 @@ GPtrArray* rspamd_task_get_request_header_multiple (struct rspamd_task *task, * @param value */ void rspamd_task_add_request_header (struct rspamd_task *task, - rspamd_ftok_t *name, rspamd_ftok_t *value); + rspamd_ftok_t *name, rspamd_ftok_t *value); /** * Write log line about the specified task if needed @@ -340,7 +348,7 @@ void rspamd_task_write_log (struct rspamd_task *task); * @param value */ void rspamd_task_profile_set (struct rspamd_task *task, const gchar *key, - gdouble value); + gdouble value); /** * Get value for a specific profiling key @@ -348,7 +356,7 @@ void rspamd_task_profile_set (struct rspamd_task *task, const gchar *key, * @param key * @return */ -gdouble* rspamd_task_profile_get (struct rspamd_task *task, const gchar *key); +gdouble *rspamd_task_profile_get (struct rspamd_task *task, const gchar *key); /** * Sets finishing time for a task if not yet set @@ -364,4 +372,8 @@ gboolean rspamd_task_set_finish_time (struct rspamd_task *task); */ const gchar *rspamd_task_stage_name (enum rspamd_task_stage stg); +#ifdef __cplusplus +} +#endif + #endif /* TASK_H_ */ diff --git a/src/libserver/url.h b/src/libserver/url.h index 734f48bbf..6f1ccf59f 100644 --- a/src/libserver/url.h +++ b/src/libserver/url.h @@ -6,6 +6,10 @@ #include "mem_pool.h" #include "fstring.h" +#ifdef __cplusplus +extern "C" { +#endif + struct rspamd_task; struct rspamd_mime_text_part; @@ -106,7 +110,9 @@ enum rspamd_url_find_type { * @param cfg */ void rspamd_url_init (const gchar *tld_file); + void rspamd_url_deinit (void); + /* * Parse urls inside text * @param pool memory pool @@ -147,10 +153,11 @@ gboolean rspamd_url_find (rspamd_mempool_t *pool, enum rspamd_url_find_type how, goffset *url_pos, gboolean *prefix_added); + /* * Return text representation of url parsing error */ -const gchar * rspamd_url_strerror (int err); +const gchar *rspamd_url_strerror (int err); /** @@ -163,7 +170,7 @@ const gchar * rspamd_url_strerror (int err); gboolean rspamd_url_find_tld (const gchar *in, gsize inlen, rspamd_ftok_t *out); typedef void (*url_insert_function) (struct rspamd_url *url, - gsize start_offset, gsize end_offset, void *ud); + gsize start_offset, gsize end_offset, void *ud); /** * Search for multiple urls in text and call `func` for each url found @@ -180,6 +187,7 @@ void rspamd_url_find_multiple (rspamd_mempool_t *pool, GPtrArray *nlines, url_insert_function func, gpointer ud); + /** * Search for a single url in text and call `func` for each url found * @param pool @@ -217,7 +225,9 @@ void rspamd_url_add_tag (struct rspamd_url *url, const gchar *tag, rspamd_mempool_t *pool); guint rspamd_url_hash (gconstpointer u); + guint rspamd_email_hash (gconstpointer u); + guint rspamd_url_host_hash (gconstpointer u); @@ -226,6 +236,7 @@ gboolean rspamd_emails_cmp (gconstpointer a, gconstpointer b); /* Compare two urls for building emails hash */ gboolean rspamd_urls_cmp (gconstpointer a, gconstpointer b); + gboolean rspamd_urls_host_cmp (gconstpointer a, gconstpointer b); /** @@ -244,8 +255,8 @@ gsize rspamd_url_decode (gchar *dst, const gchar *src, gsize size); * @param pool * @return */ -const gchar * rspamd_url_encode (struct rspamd_url *url, gsize *dlen, - rspamd_mempool_t *pool); +const gchar *rspamd_url_encode (struct rspamd_url *url, gsize *dlen, + rspamd_mempool_t *pool); /** @@ -260,7 +271,7 @@ gboolean rspamd_url_is_domain (int c); * @param proto * @return */ -const gchar* rspamd_url_protocol_name (enum rspamd_url_protocol proto); +const gchar *rspamd_url_protocol_name (enum rspamd_url_protocol proto); /** @@ -269,4 +280,9 @@ const gchar* rspamd_url_protocol_name (enum rspamd_url_protocol proto); * @return */ enum rspamd_url_protocol rspamd_url_protocol_from_string (const gchar *str); + +#ifdef __cplusplus +} +#endif + #endif diff --git a/src/libserver/worker_util.h b/src/libserver/worker_util.h index d3ea738aa..d0966e009 100644 --- a/src/libserver/worker_util.h +++ b/src/libserver/worker_util.h @@ -21,10 +21,16 @@ #include "http_connection.h" #include "rspamd.h" +#ifdef __cplusplus +extern "C" { +#endif + #ifndef HAVE_SA_SIGINFO typedef void (*rspamd_sig_handler_t) (gint); #else + typedef void (*rspamd_sig_handler_t) (gint, siginfo_t *, void *); + #endif struct rspamd_worker; @@ -37,7 +43,7 @@ struct rspamd_worker_signal_handler; */ void rspamd_worker_init_signals (struct rspamd_worker *worker, struct ev_loop *event_loop); -typedef void (*rspamd_accept_handler)(struct ev_loop *loop, ev_io *w, int revents); +typedef void (*rspamd_accept_handler) (struct ev_loop *loop, ev_io *w, int revents); /** * Prepare worker's startup @@ -55,10 +61,10 @@ rspamd_prepare_worker (struct rspamd_worker *worker, const char *name, * Set special signal handler for a worker */ void rspamd_worker_set_signal_handler (int signo, - struct rspamd_worker *worker, - struct ev_loop *event_loop, - rspamd_worker_signal_cb_t handler, - void *handler_data); + struct rspamd_worker *worker, + struct ev_loop *event_loop, + rspamd_worker_signal_cb_t handler, + void *handler_data); /** * Stop accepting new connections for a worker @@ -67,9 +73,9 @@ void rspamd_worker_set_signal_handler (int signo, void rspamd_worker_stop_accept (struct rspamd_worker *worker); typedef gint (*rspamd_controller_func_t) ( - struct rspamd_http_connection_entry *conn_ent, - struct rspamd_http_message *msg, - struct module_ctx *ctx); + struct rspamd_http_connection_entry *conn_ent, + struct rspamd_http_message *msg, + struct module_ctx *ctx); struct rspamd_custom_controller_command { const gchar *command; @@ -102,7 +108,7 @@ struct rspamd_controller_session { * @param error_msg error message */ void rspamd_controller_send_error (struct rspamd_http_connection_entry *entry, - gint code, const gchar *error_msg, ...); + gint code, const gchar *error_msg, ...); /** * Send a custom string using HTTP @@ -110,7 +116,7 @@ void rspamd_controller_send_error (struct rspamd_http_connection_entry *entry, * @param str string to send */ void rspamd_controller_send_string (struct rspamd_http_connection_entry *entry, - const gchar *str); + const gchar *str); /** * Send UCL using HTTP and JSON serialization @@ -118,14 +124,14 @@ void rspamd_controller_send_string (struct rspamd_http_connection_entry *entry, * @param obj object to send */ void rspamd_controller_send_ucl (struct rspamd_http_connection_entry *entry, - ucl_object_t *obj); + ucl_object_t *obj); /** * Return worker's control structure by its type * @param type * @return worker's control structure or NULL */ -worker_t * rspamd_get_worker_by_type (struct rspamd_config *cfg, GQuark type); +worker_t *rspamd_get_worker_by_type (struct rspamd_config *cfg, GQuark type); /** * Block signals before terminations @@ -162,8 +168,8 @@ gboolean rspamd_worker_is_primary_controller (struct rspamd_worker *w); * @param w * @return */ -void * rspamd_worker_session_cache_new (struct rspamd_worker *w, - struct ev_loop *ev_base); +void *rspamd_worker_session_cache_new (struct rspamd_worker *w, + struct ev_loop *ev_base); /** * Adds a new session identified by pointer @@ -173,7 +179,7 @@ void * rspamd_worker_session_cache_new (struct rspamd_worker *w, * @param ptr */ void rspamd_worker_session_cache_add (void *cache, const gchar *tag, - guint *pref, void *ptr); + guint *pref, void *ptr); /** * Removes session from cache @@ -202,8 +208,8 @@ void rspamd_set_crash_handler (struct rspamd_main *); * @param resolver */ void rspamd_worker_init_monitored (struct rspamd_worker *worker, - struct ev_loop *ev_base, - struct rspamd_dns_resolver *resolver); + struct ev_loop *ev_base, + struct rspamd_dns_resolver *resolver); /** * Performs throttling for accept events @@ -221,15 +227,17 @@ void rspamd_worker_throttle_accept_events (gint sock, void *data); * @return TRUE if refork is desired */ gboolean rspamd_check_termination_clause (struct rspamd_main *rspamd_main, - struct rspamd_worker *wrk, int status); + struct rspamd_worker *wrk, int status); #ifdef WITH_HYPERSCAN struct rspamd_control_command; + gboolean rspamd_worker_hyperscan_ready (struct rspamd_main *rspamd_main, struct rspamd_worker *worker, gint fd, gint attached_fd, struct rspamd_control_command *cmd, gpointer ud); + #endif #define msg_err_main(...) rspamd_default_log_function (G_LOG_LEVEL_CRITICAL, \ @@ -245,4 +253,8 @@ gboolean rspamd_worker_hyperscan_ready (struct rspamd_main *rspamd_main, G_STRFUNC, \ __VA_ARGS__) +#ifdef __cplusplus +} +#endif + #endif /* WORKER_UTIL_H_ */ diff --git a/src/libstat/backends/backends.h b/src/libstat/backends/backends.h index 025e9bf34..fa3785540 100644 --- a/src/libstat/backends/backends.h +++ b/src/libstat/backends/backends.h @@ -21,6 +21,10 @@ #define RSPAMD_DEFAULT_BACKEND "mmap" +#ifdef __cplusplus +extern "C" { +#endif + /* Forwarded declarations */ struct rspamd_classifier_config; struct rspamd_statfile_config; @@ -32,73 +36,93 @@ struct rspamd_task; struct rspamd_stat_backend { const char *name; - gpointer (*init)(struct rspamd_stat_ctx *ctx, struct rspamd_config *cfg, - struct rspamd_statfile *st); - gpointer (*runtime)(struct rspamd_task *task, - struct rspamd_statfile_config *stcf, gboolean learn, gpointer ctx); - gboolean (*process_tokens)(struct rspamd_task *task, GPtrArray *tokens, - gint id, - gpointer ctx); - gboolean (*finalize_process)(struct rspamd_task *task, - gpointer runtime, gpointer ctx); - gboolean (*learn_tokens)(struct rspamd_task *task, GPtrArray *tokens, - gint id, - gpointer ctx); - gulong (*total_learns)(struct rspamd_task *task, - gpointer runtime, gpointer ctx); - gboolean (*finalize_learn)(struct rspamd_task *task, - gpointer runtime, gpointer ctx, GError **err); - gulong (*inc_learns)(struct rspamd_task *task, - gpointer runtime, gpointer ctx); - gulong (*dec_learns)(struct rspamd_task *task, - gpointer runtime, gpointer ctx); - ucl_object_t* (*get_stat)(gpointer runtime, gpointer ctx); - void (*close)(gpointer ctx); - - gpointer (*load_tokenizer_config)(gpointer runtime, gsize *sz); + + gpointer (*init) (struct rspamd_stat_ctx *ctx, struct rspamd_config *cfg, + struct rspamd_statfile *st); + + gpointer (*runtime) (struct rspamd_task *task, + struct rspamd_statfile_config *stcf, gboolean learn, gpointer ctx); + + gboolean (*process_tokens) (struct rspamd_task *task, GPtrArray *tokens, + gint id, + gpointer ctx); + + gboolean (*finalize_process) (struct rspamd_task *task, + gpointer runtime, gpointer ctx); + + gboolean (*learn_tokens) (struct rspamd_task *task, GPtrArray *tokens, + gint id, + gpointer ctx); + + gulong (*total_learns) (struct rspamd_task *task, + gpointer runtime, gpointer ctx); + + gboolean (*finalize_learn) (struct rspamd_task *task, + gpointer runtime, gpointer ctx, GError **err); + + gulong (*inc_learns) (struct rspamd_task *task, + gpointer runtime, gpointer ctx); + + gulong (*dec_learns) (struct rspamd_task *task, + gpointer runtime, gpointer ctx); + + ucl_object_t *(*get_stat) (gpointer runtime, gpointer ctx); + + void (*close) (gpointer ctx); + + gpointer (*load_tokenizer_config) (gpointer runtime, gsize *sz); + gpointer ctx; }; #define RSPAMD_STAT_BACKEND_DEF(name) \ - gpointer rspamd_##name##_init (struct rspamd_stat_ctx *ctx, \ - struct rspamd_config *cfg, struct rspamd_statfile *st); \ - gpointer rspamd_##name##_runtime (struct rspamd_task *task, \ - struct rspamd_statfile_config *stcf, \ - gboolean learn, gpointer ctx); \ - gboolean rspamd_##name##_process_tokens (struct rspamd_task *task, \ + gpointer rspamd_##name##_init (struct rspamd_stat_ctx *ctx, \ + struct rspamd_config *cfg, struct rspamd_statfile *st); \ + gpointer rspamd_##name##_runtime (struct rspamd_task *task, \ + struct rspamd_statfile_config *stcf, \ + gboolean learn, gpointer ctx); \ + gboolean rspamd_##name##_process_tokens (struct rspamd_task *task, \ GPtrArray *tokens, gint id, \ - gpointer ctx); \ - gboolean rspamd_##name##_finalize_process (struct rspamd_task *task, \ - gpointer runtime, \ - gpointer ctx); \ - gboolean rspamd_##name##_learn_tokens (struct rspamd_task *task, \ + gpointer ctx); \ + gboolean rspamd_##name##_finalize_process (struct rspamd_task *task, \ + gpointer runtime, \ + gpointer ctx); \ + gboolean rspamd_##name##_learn_tokens (struct rspamd_task *task, \ GPtrArray *tokens, gint id, \ - gpointer ctx); \ - gboolean rspamd_##name##_finalize_learn (struct rspamd_task *task, \ - gpointer runtime, \ - gpointer ctx, GError **err); \ - gulong rspamd_##name##_total_learns (struct rspamd_task *task, \ - gpointer runtime, \ - gpointer ctx); \ - gulong rspamd_##name##_inc_learns (struct rspamd_task *task, \ - gpointer runtime, \ - gpointer ctx); \ - gulong rspamd_##name##_dec_learns (struct rspamd_task *task, \ - gpointer runtime, \ - gpointer ctx); \ - gulong rspamd_##name##_learns (struct rspamd_task *task, \ - gpointer runtime, \ - gpointer ctx); \ - ucl_object_t * rspamd_##name##_get_stat (gpointer runtime, \ - gpointer ctx); \ - gpointer rspamd_##name##_load_tokenizer_config (gpointer runtime, \ - gsize *len); \ - void rspamd_##name##_close (gpointer ctx) + gpointer ctx); \ + gboolean rspamd_##name##_finalize_learn (struct rspamd_task *task, \ + gpointer runtime, \ + gpointer ctx, GError **err); \ + gulong rspamd_##name##_total_learns (struct rspamd_task *task, \ + gpointer runtime, \ + gpointer ctx); \ + gulong rspamd_##name##_inc_learns (struct rspamd_task *task, \ + gpointer runtime, \ + gpointer ctx); \ + gulong rspamd_##name##_dec_learns (struct rspamd_task *task, \ + gpointer runtime, \ + gpointer ctx); \ + gulong rspamd_##name##_learns (struct rspamd_task *task, \ + gpointer runtime, \ + gpointer ctx); \ + ucl_object_t * rspamd_##name##_get_stat (gpointer runtime, \ + gpointer ctx); \ + gpointer rspamd_##name##_load_tokenizer_config (gpointer runtime, \ + gsize *len); \ + void rspamd_##name##_close (gpointer ctx) RSPAMD_STAT_BACKEND_DEF(mmaped_file); + RSPAMD_STAT_BACKEND_DEF(sqlite3); + #ifdef WITH_HIREDIS + RSPAMD_STAT_BACKEND_DEF(redis); + +#endif + +#ifdef __cplusplus +} #endif #endif /* BACKENDS_H_ */ diff --git a/src/libstat/classifiers/classifiers.h b/src/libstat/classifiers/classifiers.h index 738a5e8c9..4e159fb13 100644 --- a/src/libstat/classifiers/classifiers.h +++ b/src/libstat/classifiers/classifiers.h @@ -9,6 +9,10 @@ /* Consider this value as 0 */ #define ALPHA 0.0001 +#ifdef __cplusplus +extern "C" { +#endif + struct rspamd_classifier_config; struct rspamd_task; struct rspamd_config; @@ -18,49 +22,58 @@ struct token_node_s; struct rspamd_stat_classifier { char *name; - gboolean (*init_func)(struct rspamd_config *cfg, - struct ev_loop *ev_base, - struct rspamd_classifier *cl); - gboolean (*classify_func)(struct rspamd_classifier * ctx, - GPtrArray *tokens, - struct rspamd_task *task); - gboolean (*learn_spam_func)(struct rspamd_classifier * ctx, - GPtrArray *input, - struct rspamd_task *task, - gboolean is_spam, - gboolean unlearn, - GError **err); - void (*fin_func)(struct rspamd_classifier *cl); + + gboolean (*init_func) (struct rspamd_config *cfg, + struct ev_loop *ev_base, + struct rspamd_classifier *cl); + + gboolean (*classify_func) (struct rspamd_classifier *ctx, + GPtrArray *tokens, + struct rspamd_task *task); + + gboolean (*learn_spam_func) (struct rspamd_classifier *ctx, + GPtrArray *input, + struct rspamd_task *task, + gboolean is_spam, + gboolean unlearn, + GError **err); + + void (*fin_func) (struct rspamd_classifier *cl); }; /* Bayes algorithm */ gboolean bayes_init (struct rspamd_config *cfg, struct ev_loop *ev_base, struct rspamd_classifier *); + gboolean bayes_classify (struct rspamd_classifier *ctx, - GPtrArray *tokens, - struct rspamd_task *task); + GPtrArray *tokens, + struct rspamd_task *task); + gboolean bayes_learn_spam (struct rspamd_classifier *ctx, - GPtrArray *tokens, - struct rspamd_task *task, - gboolean is_spam, - gboolean unlearn, - GError **err); + GPtrArray *tokens, + struct rspamd_task *task, + gboolean is_spam, + gboolean unlearn, + GError **err); + void bayes_fin (struct rspamd_classifier *); /* Generic lua classifier */ gboolean lua_classifier_init (struct rspamd_config *cfg, struct ev_loop *ev_base, struct rspamd_classifier *); + gboolean lua_classifier_classify (struct rspamd_classifier *ctx, - GPtrArray *tokens, - struct rspamd_task *task); + GPtrArray *tokens, + struct rspamd_task *task); + gboolean lua_classifier_learn_spam (struct rspamd_classifier *ctx, - GPtrArray *tokens, - struct rspamd_task *task, - gboolean is_spam, - gboolean unlearn, - GError **err); + GPtrArray *tokens, + struct rspamd_task *task, + gboolean is_spam, + gboolean unlearn, + GError **err); extern guint rspamd_bayes_log_id; #define msg_debug_bayes(...) rspamd_conditional_debug_fast (NULL, task->from_addr, \ @@ -68,7 +81,9 @@ extern guint rspamd_bayes_log_id; G_STRFUNC, \ __VA_ARGS__) + +#ifdef __cplusplus +} +#endif + #endif -/* - * vi:ts=4 - */ diff --git a/src/libstat/learn_cache/learn_cache.h b/src/libstat/learn_cache/learn_cache.h index 6673d2239..1816c9f7a 100644 --- a/src/libstat/learn_cache/learn_cache.h +++ b/src/libstat/learn_cache/learn_cache.h @@ -19,6 +19,10 @@ #include "config.h" #include "ucl.h" +#ifdef __cplusplus +extern "C" { +#endif + #define RSPAMD_DEFAULT_CACHE "sqlite3" struct rspamd_task; @@ -28,40 +32,53 @@ struct rspamd_statfile; struct rspamd_stat_cache { const char *name; - gpointer (*init)(struct rspamd_stat_ctx *ctx, - struct rspamd_config *cfg, - struct rspamd_statfile *st, - const ucl_object_t *cf); - gpointer (*runtime)(struct rspamd_task *task, - gpointer ctx, gboolean learn); - gint (*check)(struct rspamd_task *task, - gboolean is_spam, - gpointer runtime); - gint (*learn)(struct rspamd_task *task, - gboolean is_spam, - gpointer runtime); + + gpointer (*init) (struct rspamd_stat_ctx *ctx, + struct rspamd_config *cfg, + struct rspamd_statfile *st, + const ucl_object_t *cf); + + gpointer (*runtime) (struct rspamd_task *task, + gpointer ctx, gboolean learn); + + gint (*check) (struct rspamd_task *task, + gboolean is_spam, + gpointer runtime); + + gint (*learn) (struct rspamd_task *task, + gboolean is_spam, + gpointer runtime); + void (*close) (gpointer ctx); + gpointer ctx; }; #define RSPAMD_STAT_CACHE_DEF(name) \ - gpointer rspamd_stat_cache_##name##_init (struct rspamd_stat_ctx *ctx, \ - struct rspamd_config *cfg, \ - struct rspamd_statfile *st, \ - const ucl_object_t *cf); \ - gpointer rspamd_stat_cache_##name##_runtime (struct rspamd_task *task, \ - gpointer ctx, gboolean learn); \ - gint rspamd_stat_cache_##name##_check (struct rspamd_task *task, \ - gboolean is_spam, \ - gpointer runtime); \ - gint rspamd_stat_cache_##name##_learn (struct rspamd_task *task, \ - gboolean is_spam, \ - gpointer runtime); \ - void rspamd_stat_cache_##name##_close (gpointer ctx) + gpointer rspamd_stat_cache_##name##_init (struct rspamd_stat_ctx *ctx, \ + struct rspamd_config *cfg, \ + struct rspamd_statfile *st, \ + const ucl_object_t *cf); \ + gpointer rspamd_stat_cache_##name##_runtime (struct rspamd_task *task, \ + gpointer ctx, gboolean learn); \ + gint rspamd_stat_cache_##name##_check (struct rspamd_task *task, \ + gboolean is_spam, \ + gpointer runtime); \ + gint rspamd_stat_cache_##name##_learn (struct rspamd_task *task, \ + gboolean is_spam, \ + gpointer runtime); \ + void rspamd_stat_cache_##name##_close (gpointer ctx) RSPAMD_STAT_CACHE_DEF(sqlite3); + #ifdef WITH_HIREDIS + RSPAMD_STAT_CACHE_DEF(redis); + +#endif + +#ifdef __cplusplus +} #endif #endif /* LEARN_CACHE_H_ */ diff --git a/src/libstat/stat_api.h b/src/libstat/stat_api.h index 40a6bc716..f91c8b79a 100644 --- a/src/libstat/stat_api.h +++ b/src/libstat/stat_api.h @@ -18,9 +18,13 @@ #include "config.h" #include "task.h" -#include <lua.h> +#include "lua/lua_common.h" #include "contrib/libev/ev.h" +#ifdef __cplusplus +extern "C" { +#endif + /** * @file stat_api.h * High level statistics API @@ -89,7 +93,7 @@ void rspamd_stat_close (void); * @param task */ void rspamd_stat_process_tokenize (struct rspamd_stat_ctx *st_ctx, - struct rspamd_task *task); + struct rspamd_task *task); /** * Classify the task specified and insert symbols if needed @@ -99,7 +103,7 @@ void rspamd_stat_process_tokenize (struct rspamd_stat_ctx *st_ctx, * @return TRUE if task has been classified */ rspamd_stat_result_t rspamd_stat_classify (struct rspamd_task *task, - lua_State *L, guint stage, GError **err); + lua_State *L, guint stage, GError **err); /** @@ -119,9 +123,9 @@ gboolean rspamd_stat_check_autolearn (struct rspamd_task *task); * @return TRUE if task has been learned */ rspamd_stat_result_t rspamd_stat_learn (struct rspamd_task *task, - gboolean spam, lua_State *L, const gchar *classifier, - guint stage, - GError **err); + gboolean spam, lua_State *L, const gchar *classifier, + guint stage, + GError **err); /** * Get the overall statistics for all statfile backends @@ -130,10 +134,14 @@ rspamd_stat_result_t rspamd_stat_learn (struct rspamd_task *task, * @return array of statistical information */ rspamd_stat_result_t rspamd_stat_statistics (struct rspamd_task *task, - struct rspamd_config *cfg, - guint64 *total_learns, - ucl_object_t **res); + struct rspamd_config *cfg, + guint64 *total_learns, + ucl_object_t **res); void rspamd_stat_unload (void); +#ifdef __cplusplus +} +#endif + #endif /* STAT_API_H_ */ diff --git a/src/libstat/stat_internal.h b/src/libstat/stat_internal.h index 50dbae9c1..967a3c4d6 100644 --- a/src/libstat/stat_internal.h +++ b/src/libstat/stat_internal.h @@ -24,6 +24,10 @@ #include "backends/backends.h" #include "learn_cache/learn_cache.h" +#ifdef __cplusplus +extern "C" { +#endif + struct rspamd_statfile_runtime { struct rspamd_statfile_config *st; gpointer backend_runtime; @@ -54,10 +58,11 @@ struct rspamd_statfile { struct rspamd_stat_async_elt; -typedef void (*rspamd_stat_async_handler)(struct rspamd_stat_async_elt *elt, - gpointer ud); -typedef void (*rspamd_stat_async_cleanup)(struct rspamd_stat_async_elt *elt, - gpointer ud); +typedef void (*rspamd_stat_async_handler) (struct rspamd_stat_async_elt *elt, + gpointer ud); + +typedef void (*rspamd_stat_async_cleanup) (struct rspamd_stat_async_elt *elt, + gpointer ud); struct rspamd_stat_async_elt { rspamd_stat_async_handler handler; @@ -102,18 +107,26 @@ typedef enum rspamd_learn_cache_result { RSPAMD_LEARN_INGORE } rspamd_learn_t; -struct rspamd_stat_ctx * rspamd_stat_get_ctx (void); -struct rspamd_stat_classifier * rspamd_stat_get_classifier (const gchar *name); -struct rspamd_stat_backend * rspamd_stat_get_backend (const gchar *name); -struct rspamd_stat_tokenizer * rspamd_stat_get_tokenizer (const gchar *name); -struct rspamd_stat_cache * rspamd_stat_get_cache (const gchar *name); -struct rspamd_stat_async_elt* rspamd_stat_ctx_register_async ( +struct rspamd_stat_ctx *rspamd_stat_get_ctx (void); + +struct rspamd_stat_classifier *rspamd_stat_get_classifier (const gchar *name); + +struct rspamd_stat_backend *rspamd_stat_get_backend (const gchar *name); + +struct rspamd_stat_tokenizer *rspamd_stat_get_tokenizer (const gchar *name); + +struct rspamd_stat_cache *rspamd_stat_get_cache (const gchar *name); + +struct rspamd_stat_async_elt *rspamd_stat_ctx_register_async ( rspamd_stat_async_handler handler, rspamd_stat_async_cleanup cleanup, gpointer d, gdouble timeout); -static GQuark rspamd_stat_quark (void) -{ +static GQuark rspamd_stat_quark (void) { return g_quark_from_static_string ("rspamd-statistics"); } +#ifdef __cplusplus +} +#endif + #endif /* STAT_INTERNAL_H_ */ diff --git a/src/libstat/tokenizers/tokenizers.h b/src/libstat/tokenizers/tokenizers.h index 784426d31..bf4987c7a 100644 --- a/src/libstat/tokenizers/tokenizers.h +++ b/src/libstat/tokenizers/tokenizers.h @@ -11,20 +11,26 @@ #define RSPAMD_DEFAULT_TOKENIZER "osb" +#ifdef __cplusplus +extern "C" { +#endif + struct rspamd_tokenizer_runtime; struct rspamd_stat_ctx; /* Common tokenizer structure */ struct rspamd_stat_tokenizer { gchar *name; + gpointer (*get_config) (rspamd_mempool_t *pool, struct rspamd_tokenizer_config *cf, gsize *len); - gint (*tokenize_func)(struct rspamd_stat_ctx *ctx, - struct rspamd_task *task, - GArray *words, - gboolean is_utf, - const gchar *prefix, - GPtrArray *result); + + gint (*tokenize_func) (struct rspamd_stat_ctx *ctx, + struct rspamd_task *task, + GArray *words, + gboolean is_utf, + const gchar *prefix, + GPtrArray *result); }; enum rspamd_tokenize_type { @@ -38,13 +44,13 @@ gint token_node_compare_func (gconstpointer a, gconstpointer b); /* Tokenize text into array of words (rspamd_stat_token_t type) */ -GArray * rspamd_tokenize_text (const gchar *text, gsize len, - const UText *utxt, - enum rspamd_tokenize_type how, - struct rspamd_config *cfg, - GList *exceptions, - guint64 *hash, - GArray *cur_words); +GArray *rspamd_tokenize_text (const gchar *text, gsize len, + const UText *utxt, + enum rspamd_tokenize_type how, + struct rspamd_config *cfg, + GList *exceptions, + guint64 *hash, + GArray *cur_words); /* OSB tokenize function */ gint rspamd_tokenizer_osb (struct rspamd_stat_ctx *ctx, @@ -59,14 +65,19 @@ gpointer rspamd_tokenizer_osb_get_config (rspamd_mempool_t *pool, gsize *len); struct rspamd_lang_detector; + void rspamd_normalize_single_word (rspamd_stat_token_t *tok, rspamd_mempool_t *pool); + void rspamd_normalize_words (GArray *words, rspamd_mempool_t *pool); + void rspamd_stem_words (GArray *words, rspamd_mempool_t *pool, const gchar *language, struct rspamd_lang_detector *d); void rspamd_tokenize_meta_words (struct rspamd_task *task); + +#ifdef __cplusplus +} +#endif + #endif -/* - * vi:ts=4 - */ diff --git a/src/libutil/addr.h b/src/libutil/addr.h index 7efa5e318..fe00ccc86 100644 --- a/src/libutil/addr.h +++ b/src/libutil/addr.h @@ -35,6 +35,10 @@ #include "mem_pool.h" +#ifdef __cplusplus +extern "C" { +#endif + /** * Opaque structure */ @@ -43,6 +47,7 @@ typedef struct rspamd_inet_addr_s rspamd_inet_addr_t; struct rspamd_radix_map_helper; struct rspamd_radix_map_helper **rspamd_inet_library_init (void); + void rspamd_inet_library_destroy (void); /** @@ -51,7 +56,7 @@ void rspamd_inet_library_destroy (void); * @param init * @return new inet addr */ -rspamd_inet_addr_t * rspamd_inet_address_new (int af, const void *init); +rspamd_inet_addr_t *rspamd_inet_address_new (int af, const void *init); /** * Create new inet address structure from struct sockaddr @@ -59,15 +64,15 @@ rspamd_inet_addr_t * rspamd_inet_address_new (int af, const void *init); * @param slen * @return */ -rspamd_inet_addr_t * rspamd_inet_address_from_sa (const struct sockaddr *sa, - socklen_t slen); +rspamd_inet_addr_t *rspamd_inet_address_from_sa (const struct sockaddr *sa, + socklen_t slen); /** * Create new inet address from rdns reply * @param rep reply element * @return new ipv4 or ipv6 addr (port is NOT set) */ -rspamd_inet_addr_t * rspamd_inet_address_from_rnds ( +rspamd_inet_addr_t *rspamd_inet_address_from_rnds ( const struct rdns_reply_entry *rep); /** @@ -79,7 +84,7 @@ rspamd_inet_addr_t * rspamd_inet_address_from_rnds ( * @return TRUE if the address has been parsed, otherwise `target` content is undefined */ gboolean rspamd_parse_inet_address_ip6 (const guchar *text, gsize len, - gpointer target); + gpointer target); /** * Parse string with ipv4 address of length `len` to `target` which should be @@ -90,7 +95,7 @@ gboolean rspamd_parse_inet_address_ip6 (const guchar *text, gsize len, * @return TRUE if the address has been parsed, otherwise `target` content is undefined */ gboolean rspamd_parse_inet_address_ip4 (const guchar *text, gsize len, - gpointer target); + gpointer target); /** * Parse ipv4 or ipv6 address to a static buffer `target`. Does not support Unix sockets @@ -100,7 +105,7 @@ gboolean rspamd_parse_inet_address_ip4 (const guchar *text, gsize len, * @return */ gboolean rspamd_parse_inet_address_ip (const char *src, - gsize srclen, rspamd_inet_addr_t *target); + gsize srclen, rspamd_inet_addr_t *target); /** * Try to parse address from string @@ -109,8 +114,8 @@ gboolean rspamd_parse_inet_address_ip (const char *src, * @return TRUE if addr has been parsed */ gboolean rspamd_parse_inet_address (rspamd_inet_addr_t **target, - const char *src, - gsize srclen); + const char *src, + gsize srclen); /** * Use memory pool allocated inet address @@ -119,23 +124,23 @@ gboolean rspamd_parse_inet_address (rspamd_inet_addr_t **target, * @param pool * @return */ -rspamd_inet_addr_t* rspamd_parse_inet_address_pool (const char *src, - gsize srclen, - rspamd_mempool_t *pool); +rspamd_inet_addr_t *rspamd_parse_inet_address_pool (const char *src, + gsize srclen, + rspamd_mempool_t *pool); /** * Returns string representation of inet address * @param addr * @return statically allocated string pointer (not thread safe) */ -const char * rspamd_inet_address_to_string (const rspamd_inet_addr_t *addr); +const char *rspamd_inet_address_to_string (const rspamd_inet_addr_t *addr); /** * Returns pretty string representation of inet address * @param addr * @return statically allocated string pointer (not thread safe) */ -const char * rspamd_inet_address_to_string_pretty (const rspamd_inet_addr_t *addr); +const char *rspamd_inet_address_to_string_pretty (const rspamd_inet_addr_t *addr); /** * Returns port number for the specified inet address in host byte order @@ -157,8 +162,8 @@ gint rspamd_inet_address_get_af (const rspamd_inet_addr_t *addr); * @param sz * @return */ -struct sockaddr* rspamd_inet_address_get_sa (const rspamd_inet_addr_t *addr, - socklen_t *sz); +struct sockaddr *rspamd_inet_address_get_sa (const rspamd_inet_addr_t *addr, + socklen_t *sz); /** * Makes a radix key from inet address @@ -166,7 +171,7 @@ struct sockaddr* rspamd_inet_address_get_sa (const rspamd_inet_addr_t *addr, * @param klen * @return */ -guchar * rspamd_inet_address_get_hash_key (const rspamd_inet_addr_t *addr, guint *klen); +guchar *rspamd_inet_address_get_hash_key (const rspamd_inet_addr_t *addr, guint *klen); /** * Receive data from an unconnected socket and fill the inet_addr structure if needed @@ -177,7 +182,7 @@ guchar * rspamd_inet_address_get_hash_key (const rspamd_inet_addr_t *addr, guint * @return same as recvfrom(2) */ gssize rspamd_inet_address_recvfrom (gint fd, void *buf, gsize len, gint fl, - rspamd_inet_addr_t **target); + rspamd_inet_addr_t **target); /** * Send data via unconnected socket using the specified inet_addr structure @@ -188,7 +193,7 @@ gssize rspamd_inet_address_recvfrom (gint fd, void *buf, gsize len, gint fl, * @return */ gssize rspamd_inet_address_sendto (gint fd, const void *buf, gsize len, gint fl, - const rspamd_inet_addr_t *addr); + const rspamd_inet_addr_t *addr); /** * Set port for inet address @@ -202,7 +207,7 @@ void rspamd_inet_address_set_port (rspamd_inet_addr_t *addr, uint16_t port); * @return newly created and connected socket */ int rspamd_inet_address_connect (const rspamd_inet_addr_t *addr, gint type, - gboolean async); + gboolean async); /** * Listen on a specified inet address @@ -212,7 +217,8 @@ int rspamd_inet_address_connect (const rspamd_inet_addr_t *addr, gint type, * @return */ int rspamd_inet_address_listen (const rspamd_inet_addr_t *addr, gint type, - gboolean async); + gboolean async); + /** * Check whether specified ip is valid (not INADDR_ANY or INADDR_NONE) for ipv4 or ipv6 * @param ptr pointer to struct in_addr or struct in6_addr @@ -221,7 +227,8 @@ int rspamd_inet_address_listen (const rspamd_inet_addr_t *addr, gint type, */ gboolean rspamd_ip_is_valid (const rspamd_inet_addr_t *addr); -typedef void (*rspamd_accept_throttling_handler)(gint, void *); +typedef void (*rspamd_accept_throttling_handler) (gint, void *); + /** * Accept from listening socket filling addr structure * @param sock listening socket @@ -241,9 +248,9 @@ gint rspamd_accept_from_socket (gint sock, * @return TRUE if string was parsed */ gboolean rspamd_parse_host_port_priority (const gchar *str, - GPtrArray **addrs, - guint *priority, gchar **name, guint default_port, - rspamd_mempool_t *pool); + GPtrArray **addrs, + guint *priority, gchar **name, guint default_port, + rspamd_mempool_t *pool); /** * Destroy the specified IP address @@ -265,7 +272,7 @@ void rspamd_inet_address_apply_mask (rspamd_inet_addr_t *addr, guint mask); * @return */ gint rspamd_inet_address_compare (const rspamd_inet_addr_t *a1, - const rspamd_inet_addr_t *a2, gboolean compare_ports); + const rspamd_inet_addr_t *a2, gboolean compare_ports); /** * Utility function to compare addresses by in g_ptr_array @@ -274,7 +281,8 @@ gint rspamd_inet_address_compare (const rspamd_inet_addr_t *a1, * @return */ gint rspamd_inet_address_compare_ptr (gconstpointer a1, - gconstpointer a2); + gconstpointer a2); + /** * Performs deep copy of rspamd inet addr * @param addr @@ -286,19 +294,21 @@ rspamd_inet_addr_t *rspamd_inet_address_copy (const rspamd_inet_addr_t *addr); * Returns hash for inet address (ignoring port) */ guint rspamd_inet_address_hash (gconstpointer a); + guint rspamd_inet_address_port_hash (gconstpointer a); /** * Returns true if two address are equal */ gboolean rspamd_inet_address_equal (gconstpointer a, gconstpointer b); + gboolean rspamd_inet_address_port_equal (gconstpointer a, gconstpointer b); /** * Returns TRUE if an address belongs to some local address */ gboolean rspamd_inet_address_is_local (const rspamd_inet_addr_t *addr, - gboolean check_laddrs); + gboolean check_laddrs); /** * Returns size of storage required to store a complete IP address @@ -306,4 +316,8 @@ gboolean rspamd_inet_address_is_local (const rspamd_inet_addr_t *addr, */ gsize rspamd_inet_address_storage_size (void); +#ifdef __cplusplus +} +#endif + #endif /* ADDR_H_ */ diff --git a/src/libutil/expression.h b/src/libutil/expression.h index bd336b87b..bd18fa75f 100644 --- a/src/libutil/expression.h +++ b/src/libutil/expression.h @@ -20,6 +20,10 @@ #include "mem_pool.h" #include "fstring.h" +#ifdef __cplusplus +extern "C" { +#endif + #define RSPAMD_EXPRESSION_MAX_PRIORITY 1024 #define RSPAMD_EXPRESSION_FLAG_NOOPT (1 << 0) @@ -56,17 +60,20 @@ typedef struct rspamd_expression_atom_s { gint priority; } rspamd_expression_atom_t; -typedef gdouble (*rspamd_expression_process_cb)(gpointer runtime_data, - rspamd_expression_atom_t *atom); +typedef gdouble (*rspamd_expression_process_cb) (gpointer runtime_data, + rspamd_expression_atom_t *atom); struct rspamd_atom_subr { /* Parses atom from string and returns atom structure */ - rspamd_expression_atom_t * (*parse)(const gchar *line, gsize len, - rspamd_mempool_t *pool, gpointer ud, GError **err); + rspamd_expression_atom_t *(*parse) (const gchar *line, gsize len, + rspamd_mempool_t *pool, gpointer ud, GError **err); + /* Process atom via the opaque pointer (e.g. struct rspamd_task *) */ rspamd_expression_process_cb process; + /* Calculates the relative priority of the expression */ gint (*priority) (rspamd_expression_atom_t *atom); + void (*destroy) (rspamd_expression_atom_t *atom); }; @@ -85,9 +92,9 @@ struct rspamd_expression; * @return TRUE if an expression have been parsed */ gboolean rspamd_parse_expression (const gchar *line, gsize len, - const struct rspamd_atom_subr *subr, gpointer subr_data, - rspamd_mempool_t *pool, GError **err, - struct rspamd_expression **target); + const struct rspamd_atom_subr *subr, gpointer subr_data, + rspamd_mempool_t *pool, GError **err, + struct rspamd_expression **target); /** * Process the expression and return its value using atom 'process' functions with the specified data pointer @@ -124,6 +131,7 @@ gdouble rspamd_process_expression_closure (struct rspamd_expression *expr, gint flags, gpointer runtime_ud, GPtrArray **track); + /** * Shows string representation of an expression * @param expr expression to show @@ -136,7 +144,7 @@ GString *rspamd_expression_tostring (struct rspamd_expression *expr); * and should not be modified within callback */ typedef void (*rspamd_expression_atom_foreach_cb) (const rspamd_ftok_t *atom, - gpointer ud); + gpointer ud); /** * Traverse over all atoms in the expression @@ -145,7 +153,7 @@ typedef void (*rspamd_expression_atom_foreach_cb) (const rspamd_ftok_t *atom, * @param ud opaque data passed to `cb` */ void rspamd_expression_atom_foreach (struct rspamd_expression *expr, - rspamd_expression_atom_foreach_cb cb, gpointer cbdata); + rspamd_expression_atom_foreach_cb cb, gpointer cbdata); /** * Checks if a specified node in AST is the specified operation @@ -155,4 +163,8 @@ void rspamd_expression_atom_foreach (struct rspamd_expression *expr, */ gboolean rspamd_expression_node_is_op (GNode *node, enum rspamd_expression_op op); +#ifdef __cplusplus +} +#endif + #endif /* SRC_LIBUTIL_EXPRESSION_H_ */ diff --git a/src/libutil/fstring.h b/src/libutil/fstring.h index 1a4d25eb9..6102215d4 100644 --- a/src/libutil/fstring.h +++ b/src/libutil/fstring.h @@ -20,6 +20,10 @@ #include "mem_pool.h" #include <unicode/uchar.h> +#ifdef __cplusplus +extern "C" { +#endif + /** * Fixed strings library * These strings are NOT null-terminated for speed @@ -47,26 +51,26 @@ typedef struct f_str_unicode_tok { /** * Create new fixed length string */ -rspamd_fstring_t* rspamd_fstring_new (void) - G_GNUC_WARN_UNUSED_RESULT; +rspamd_fstring_t *rspamd_fstring_new (void) +G_GNUC_WARN_UNUSED_RESULT; /** * Create new fixed length string with preallocated size */ rspamd_fstring_t *rspamd_fstring_sized_new (gsize initial_size) - G_GNUC_WARN_UNUSED_RESULT; +G_GNUC_WARN_UNUSED_RESULT; /** * Create new fixed length string and initialize it with the initial data */ rspamd_fstring_t *rspamd_fstring_new_init (const gchar *init, gsize len) - G_GNUC_WARN_UNUSED_RESULT; +G_GNUC_WARN_UNUSED_RESULT; /** * Assign new value to fixed string */ rspamd_fstring_t *rspamd_fstring_assign (rspamd_fstring_t *str, - const gchar *init, gsize len) G_GNUC_WARN_UNUSED_RESULT; + const gchar *init, gsize len) G_GNUC_WARN_UNUSED_RESULT; /** * Free fixed length string @@ -76,14 +80,14 @@ void rspamd_fstring_free (rspamd_fstring_t *str); /** * Append data to a fixed length string */ -rspamd_fstring_t* rspamd_fstring_append (rspamd_fstring_t *str, - const char *in, gsize len) G_GNUC_WARN_UNUSED_RESULT; +rspamd_fstring_t *rspamd_fstring_append (rspamd_fstring_t *str, + const char *in, gsize len) G_GNUC_WARN_UNUSED_RESULT; /** * Append `len` repeated chars `c` to string `str` */ rspamd_fstring_t *rspamd_fstring_append_chars (rspamd_fstring_t *str, - char c, gsize len) G_GNUC_WARN_UNUSED_RESULT; + char c, gsize len) G_GNUC_WARN_UNUSED_RESULT; /** * Erase `len` characters at position `pos` @@ -96,14 +100,16 @@ void rspamd_fstring_erase (rspamd_fstring_t *str, gsize pos, gsize len); * Convert fixed string to a zero terminated string. This string must be * freed by a caller */ -char * rspamd_fstring_cstr (const rspamd_fstring_t *str) - G_GNUC_WARN_UNUSED_RESULT; +char *rspamd_fstring_cstr (const rspamd_fstring_t *str) +G_GNUC_WARN_UNUSED_RESULT; + /** * Convert fixed string usign ftok_t to a zero terminated string. This string must be * freed by a caller */ -char * rspamd_ftok_cstr (const rspamd_ftok_t *str) - G_GNUC_WARN_UNUSED_RESULT; +char *rspamd_ftok_cstr (const rspamd_ftok_t *str) +G_GNUC_WARN_UNUSED_RESULT; + /* * Return fast hash value for fixed string converted to lowercase */ @@ -113,31 +119,31 @@ guint32 rspamd_fstrhash_lc (const rspamd_ftok_t *str, gboolean is_utf); * Return true if two strings are equal */ gboolean rspamd_fstring_equal (const rspamd_fstring_t *s1, - const rspamd_fstring_t *s2); + const rspamd_fstring_t *s2); /** * Compare two fixed strings ignoring case */ gint rspamd_fstring_casecmp (const rspamd_fstring_t *s1, - const rspamd_fstring_t *s2); + const rspamd_fstring_t *s2); /** * Compare two fixed strings */ gint rspamd_fstring_cmp (const rspamd_fstring_t *s1, - const rspamd_fstring_t *s2); + const rspamd_fstring_t *s2); /** * Compare two fixed tokens ignoring case */ gint rspamd_ftok_casecmp (const rspamd_ftok_t *s1, - const rspamd_ftok_t *s2); + const rspamd_ftok_t *s2); /** * Compare two fixed tokens */ gint rspamd_ftok_cmp (const rspamd_ftok_t *s1, - const rspamd_ftok_t *s2); + const rspamd_ftok_t *s2); /** * Returns true if `s1` starts with `s2` @@ -152,7 +158,7 @@ gboolean rspamd_ftok_starts_with (const rspamd_ftok_t *s1, * Return TRUE if ftok is equal to specified C string */ gboolean rspamd_ftok_cstr_equal (const rspamd_ftok_t *s, - const gchar *pat, gboolean icase); + const gchar *pat, gboolean icase); /** * Free fstring_t that is mapped to ftok_t @@ -184,8 +190,8 @@ gsize rspamd_fstring_suggest_size (gsize len, gsize allocated, gsize needed_len) * @param needed_len * @return */ -rspamd_fstring_t * rspamd_fstring_grow (rspamd_fstring_t *str, - gsize needed_len) G_GNUC_WARN_UNUSED_RESULT; +rspamd_fstring_t *rspamd_fstring_grow (rspamd_fstring_t *str, + gsize needed_len) G_GNUC_WARN_UNUSED_RESULT; /** * Copies ftok to zero terminated string (must be freed using g_free) @@ -203,14 +209,17 @@ gchar *rspamd_fstringdup (const rspamd_fstring_t *src) G_GNUC_WARN_UNUSED_RESULT #define RSPAMD_FTOK_ASSIGN(t, lit) do { (t)->begin = (lit); (t)->len = sizeof(lit) - 1; } while (0) #define RSPAMD_FTOK_FROM_STR(t, str) do { \ - if (G_LIKELY(str)) { \ - (t)->begin = (const char*)(str); \ - (t)->len = strlen (str); \ - } \ - else { \ - (t)->begin = NULL; \ - (t)->len = 0; \ - } \ + if (G_LIKELY(str)) { \ + (t)->begin = (const char*)(str); \ + (t)->len = strlen (str); \ + } \ + else { \ + (t)->begin = NULL; \ + (t)->len = 0; \ + } \ } while (0) +#ifdef __cplusplus +} +#endif #endif diff --git a/src/libutil/hash.h b/src/libutil/hash.h index bae3cacfa..e1284a885 100644 --- a/src/libutil/hash.h +++ b/src/libutil/hash.h @@ -9,6 +9,10 @@ #include "config.h" +#ifdef __cplusplus +extern "C" { +#endif + struct rspamd_lru_hash_s; typedef struct rspamd_lru_hash_s rspamd_lru_hash_t; struct rspamd_lru_element_s; @@ -23,9 +27,9 @@ typedef struct rspamd_lru_element_s rspamd_lru_element_t; * @param key_equal_func pointer to function for comparing keys * @return new rspamd_hash object */ -rspamd_lru_hash_t * rspamd_lru_hash_new (gint maxsize, - GDestroyNotify key_destroy, - GDestroyNotify value_destroy); +rspamd_lru_hash_t *rspamd_lru_hash_new (gint maxsize, + GDestroyNotify key_destroy, + GDestroyNotify value_destroy); /** @@ -36,11 +40,11 @@ rspamd_lru_hash_t * rspamd_lru_hash_new (gint maxsize, * @param key_equal_func pointer to function for comparing keys * @return new rspamd_hash object */ -rspamd_lru_hash_t * rspamd_lru_hash_new_full (gint maxsize, - GDestroyNotify key_destroy, - GDestroyNotify value_destroy, - GHashFunc hfunc, - GEqualFunc eqfunc); +rspamd_lru_hash_t *rspamd_lru_hash_new_full (gint maxsize, + GDestroyNotify key_destroy, + GDestroyNotify value_destroy, + GHashFunc hfunc, + GEqualFunc eqfunc); /** * Lookup item from hash @@ -60,6 +64,7 @@ gpointer rspamd_lru_hash_lookup (rspamd_lru_hash_t *hash, */ gboolean rspamd_lru_hash_remove (rspamd_lru_hash_t *hash, gconstpointer key); + /** * Insert item in hash * @param hash hash object @@ -88,7 +93,7 @@ void rspamd_lru_hash_destroy (rspamd_lru_hash_t *hash); * @return new it or -1 if iteration has been reached over */ int rspamd_lru_hash_foreach (rspamd_lru_hash_t *hash, int it, gpointer *k, - gpointer *v); + gpointer *v); /** * Returns number of elements in a hash @@ -101,4 +106,9 @@ guint rspamd_lru_hash_size (rspamd_lru_hash_t *hash); * @param hash hash object */ guint rspamd_lru_hash_capacity (rspamd_lru_hash_t *hash); + +#ifdef __cplusplus +} +#endif + #endif diff --git a/src/libutil/heap.h b/src/libutil/heap.h index 7d6ef4fff..94501a740 100644 --- a/src/libutil/heap.h +++ b/src/libutil/heap.h @@ -18,6 +18,10 @@ #include "config.h" +#ifdef __cplusplus +extern "C" { +#endif + /** * Binary minimal heap interface based on glib */ @@ -44,14 +48,14 @@ struct rspamd_min_heap *rspamd_min_heap_create (gsize reserved_size); * @param elt element to push */ void rspamd_min_heap_push (struct rspamd_min_heap *heap, - struct rspamd_min_heap_elt *elt); + struct rspamd_min_heap_elt *elt); /** * Pops the minimum element from the heap and reorder the queue * @param heap heap structure * @return minimum element */ -struct rspamd_min_heap_elt* rspamd_min_heap_pop (struct rspamd_min_heap *heap); +struct rspamd_min_heap_elt *rspamd_min_heap_pop (struct rspamd_min_heap *heap); /** * Updates priority for the element. It must be in queue (so `idx` should be sane) @@ -60,7 +64,7 @@ struct rspamd_min_heap_elt* rspamd_min_heap_pop (struct rspamd_min_heap *heap); * @param npri new priority */ void rspamd_min_heap_update_elt (struct rspamd_min_heap *heap, - struct rspamd_min_heap_elt *elt, guint npri); + struct rspamd_min_heap_elt *elt, guint npri); /** @@ -69,7 +73,7 @@ void rspamd_min_heap_update_elt (struct rspamd_min_heap *heap, * @param elt */ void rspamd_min_heap_remove_elt (struct rspamd_min_heap *heap, - struct rspamd_min_heap_elt *elt); + struct rspamd_min_heap_elt *elt); /** * Destroys heap (elements are not destroyed themselves) @@ -83,7 +87,11 @@ void rspamd_min_heap_destroy (struct rspamd_min_heap *heap); * @param idx * @return */ -struct rspamd_min_heap_elt* rspamd_min_heap_index (struct rspamd_min_heap *heap, - guint idx); +struct rspamd_min_heap_elt *rspamd_min_heap_index (struct rspamd_min_heap *heap, + guint idx); + +#ifdef __cplusplus +} +#endif #endif /* SRC_LIBUTIL_HEAP_H_ */ diff --git a/src/libutil/http_connection.h b/src/libutil/http_connection.h index fc1303446..1923e5953 100644 --- a/src/libutil/http_connection.h +++ b/src/libutil/http_connection.h @@ -33,6 +33,10 @@ #include "contrib/libev/ev.h" +#ifdef __cplusplus +extern "C" { +#endif + enum rspamd_http_connection_type { RSPAMD_HTTP_SERVER, RSPAMD_HTTP_CLIENT @@ -88,15 +92,15 @@ enum rspamd_http_options { }; typedef int (*rspamd_http_body_handler_t) (struct rspamd_http_connection *conn, - struct rspamd_http_message *msg, - const gchar *chunk, - gsize len); + struct rspamd_http_message *msg, + const gchar *chunk, + gsize len); typedef void (*rspamd_http_error_handler_t) (struct rspamd_http_connection *conn, - GError *err); + GError *err); typedef int (*rspamd_http_finish_handler_t) (struct rspamd_http_connection *conn, - struct rspamd_http_message *msg); + struct rspamd_http_message *msg); /** * HTTP connection structure @@ -195,14 +199,14 @@ struct rspamd_http_connection *rspamd_http_connection_new_client_socket ( * @param key opaque key structure */ void rspamd_http_connection_set_key (struct rspamd_http_connection *conn, - struct rspamd_cryptobox_keypair *key); + struct rspamd_cryptobox_keypair *key); /** * Get peer's public key * @param conn connection structure * @return pubkey structure or NULL */ -const struct rspamd_cryptobox_pubkey* rspamd_http_connection_get_peer_key ( +const struct rspamd_cryptobox_pubkey *rspamd_http_connection_get_peer_key ( struct rspamd_http_connection *conn); /** @@ -263,8 +267,7 @@ void rspamd_http_connection_free (struct rspamd_http_connection *conn); * @return */ static inline struct rspamd_http_connection * -rspamd_http_connection_ref (struct rspamd_http_connection *conn) -{ +rspamd_http_connection_ref (struct rspamd_http_connection *conn) { conn->ref++; return conn; } @@ -274,8 +277,7 @@ rspamd_http_connection_ref (struct rspamd_http_connection *conn) * @param conn */ static void -rspamd_http_connection_unref (struct rspamd_http_connection *conn) -{ +rspamd_http_connection_unref (struct rspamd_http_connection *conn) { if (--conn->ref <= 0) { rspamd_http_connection_free (conn); } @@ -292,8 +294,12 @@ void rspamd_http_connection_reset (struct rspamd_http_connection *conn); * @param sz */ void rspamd_http_connection_set_max_size (struct rspamd_http_connection *conn, - gsize sz); + gsize sz); void rspamd_http_connection_disable_encryption (struct rspamd_http_connection *conn); +#ifdef __cplusplus +} +#endif + #endif /* HTTP_H_ */ diff --git a/src/libutil/http_context.h b/src/libutil/http_context.h index c610ffbbd..f7697c406 100644 --- a/src/libutil/http_context.h +++ b/src/libutil/http_context.h @@ -23,6 +23,10 @@ #include "contrib/libev/ev.h" +#ifdef __cplusplus +extern "C" { +#endif + struct rspamd_http_context; struct rspamd_config; struct rspamd_http_message; @@ -44,20 +48,21 @@ struct rspamd_http_context_cfg { * @param ev_base event base * @return new context used for both client and server HTTP connections */ -struct rspamd_http_context* rspamd_http_context_create (struct rspamd_config *cfg, - struct ev_loop *ev_base, struct upstream_ctx *ctx); +struct rspamd_http_context *rspamd_http_context_create (struct rspamd_config *cfg, + struct ev_loop *ev_base, struct upstream_ctx *ctx); -struct rspamd_http_context* rspamd_http_context_create_config ( +struct rspamd_http_context *rspamd_http_context_create_config ( struct rspamd_http_context_cfg *cfg, struct ev_loop *ev_base, struct upstream_ctx *ctx); + /** * Destroys context * @param ctx */ void rspamd_http_context_free (struct rspamd_http_context *ctx); -struct rspamd_http_context* rspamd_http_context_default (void); +struct rspamd_http_context *rspamd_http_context_default (void); /** * Returns preserved keepalive connection if it's available. @@ -67,7 +72,7 @@ struct rspamd_http_context* rspamd_http_context_default (void); * @param host * @return */ -struct rspamd_http_connection* rspamd_http_context_check_keepalive ( +struct rspamd_http_connection *rspamd_http_context_check_keepalive ( struct rspamd_http_context *ctx, const rspamd_inet_addr_t *addr, const gchar *host); @@ -83,6 +88,7 @@ void rspamd_http_context_prepare_keepalive (struct rspamd_http_context *ctx, struct rspamd_http_connection *conn, const rspamd_inet_addr_t *addr, const gchar *host); + /** * Pushes a connection to keepalive pool after client request is finished, * keepalive key *must* be prepared before using of this function @@ -95,4 +101,8 @@ void rspamd_http_context_push_keepalive (struct rspamd_http_context *ctx, struct rspamd_http_message *msg, struct ev_loop *ev_base); +#ifdef __cplusplus +} +#endif + #endif diff --git a/src/libutil/http_message.h b/src/libutil/http_message.h index c9e6abfce..e13c7427c 100644 --- a/src/libutil/http_message.h +++ b/src/libutil/http_message.h @@ -22,16 +22,23 @@ #include "fstring.h" #include "ref.h" + +#ifdef __cplusplus +extern "C" { +#endif + struct rspamd_http_connection; -enum rspamd_http_message_type { HTTP_REQUEST = 0, HTTP_RESPONSE }; +enum rspamd_http_message_type { + HTTP_REQUEST = 0, HTTP_RESPONSE +}; /** * Extract the current message from a connection to deal with separately * @param conn * @return */ -struct rspamd_http_message * rspamd_http_connection_steal_msg ( +struct rspamd_http_message *rspamd_http_connection_steal_msg ( struct rspamd_http_connection *conn); /** @@ -39,7 +46,7 @@ struct rspamd_http_message * rspamd_http_connection_steal_msg ( * @param conn * @return */ -struct rspamd_http_message * rspamd_http_connection_copy_msg ( +struct rspamd_http_message *rspamd_http_connection_copy_msg ( struct rspamd_http_message *msg, GError **err); /** @@ -47,14 +54,15 @@ struct rspamd_http_message * rspamd_http_connection_copy_msg ( * @param type request or response * @return new http message */ -struct rspamd_http_message * rspamd_http_new_message (enum rspamd_http_message_type type); +struct rspamd_http_message *rspamd_http_new_message (enum rspamd_http_message_type type); /** * Increase refcount number for an HTTP message * @param msg message to use * @return */ -struct rspamd_http_message * rspamd_http_message_ref (struct rspamd_http_message *msg); +struct rspamd_http_message *rspamd_http_message_ref (struct rspamd_http_message *msg); + /** * Decrease number of refcounts for http message * @param msg @@ -68,12 +76,13 @@ void rspamd_http_message_unref (struct rspamd_http_message *msg); */ void rspamd_http_message_set_peer_key (struct rspamd_http_message *msg, struct rspamd_cryptobox_pubkey *pk); + /** * Create HTTP message from URL * @param url * @return new message or NULL */ -struct rspamd_http_message* rspamd_http_message_from_url (const gchar *url); +struct rspamd_http_message *rspamd_http_message_from_url (const gchar *url); /** * Returns body for a message @@ -101,6 +110,7 @@ gboolean rspamd_http_message_set_body (struct rspamd_http_message *msg, */ void rspamd_http_message_set_method (struct rspamd_http_message *msg, const gchar *method); + /** * Maps fd as message's body * @param msg @@ -162,7 +172,7 @@ void rspamd_http_message_add_header_fstr (struct rspamd_http_message *msg, * @param msg message * @param name name of header */ -const rspamd_ftok_t * rspamd_http_message_find_header ( +const rspamd_ftok_t *rspamd_http_message_find_header ( struct rspamd_http_message *msg, const gchar *name); @@ -172,7 +182,7 @@ const rspamd_ftok_t * rspamd_http_message_find_header ( * @param name * @return list of rspamd_ftok_t * with values */ -GPtrArray* rspamd_http_message_find_header_multiple ( +GPtrArray *rspamd_http_message_find_header_multiple ( struct rspamd_http_message *msg, const gchar *name); @@ -198,13 +208,14 @@ void rspamd_http_message_free (struct rspamd_http_message *msg); * @return new GHashTable which maps rspamd_ftok_t* to rspamd_ftok_t* * (table must be freed by a caller) */ -GHashTable* rspamd_http_message_parse_query (struct rspamd_http_message *msg); +GHashTable *rspamd_http_message_parse_query (struct rspamd_http_message *msg); /** * Increase refcount for shared file (if any) to prevent early memory unlinking * @param msg */ -struct rspamd_storage_shmem* rspamd_http_message_shmem_ref (struct rspamd_http_message *msg); +struct rspamd_storage_shmem *rspamd_http_message_shmem_ref (struct rspamd_http_message *msg); + /** * Decrease external ref for shmem segment associated with a message * @param msg @@ -218,4 +229,8 @@ void rspamd_http_message_shmem_unref (struct rspamd_storage_shmem *p); */ guint rspamd_http_message_get_flags (struct rspamd_http_message *msg); +#ifdef __cplusplus +} +#endif + #endif diff --git a/src/libutil/http_private.h b/src/libutil/http_private.h index f5a7dd9cc..53c9a81f2 100644 --- a/src/libutil/http_private.h +++ b/src/libutil/http_private.h @@ -27,6 +27,10 @@ #define HASH_CASELESS #include "uthash_strcase.h" +#ifdef __cplusplus +extern "C" { +#endif + /** * HTTP header structure */ @@ -84,9 +88,10 @@ struct rspamd_keepalive_hash_key { GQueue conns; }; -gint32 rspamd_keep_alive_key_hash (struct rspamd_keepalive_hash_key* k); -bool rspamd_keep_alive_key_equal (struct rspamd_keepalive_hash_key* k1, - struct rspamd_keepalive_hash_key* k2); +gint32 rspamd_keep_alive_key_hash (struct rspamd_keepalive_hash_key *k); + +bool rspamd_keep_alive_key_equal (struct rspamd_keepalive_hash_key *k1, + struct rspamd_keepalive_hash_key *k2); KHASH_INIT (rspamd_keep_alive_hash, struct rspamd_keepalive_hash_key *, char, 0, rspamd_keep_alive_key_hash, rspamd_keep_alive_key_equal); @@ -106,10 +111,16 @@ struct rspamd_http_context { }; #define HTTP_ERROR http_error_quark () + GQuark http_error_quark (void); void rspamd_http_message_storage_cleanup (struct rspamd_http_message *msg); + gboolean rspamd_http_message_grow_body (struct rspamd_http_message *msg, gsize len); +#ifdef __cplusplus +} +#endif + #endif /* SRC_LIBUTIL_HTTP_PRIVATE_H_ */ diff --git a/src/libutil/http_router.h b/src/libutil/http_router.h index b946067b7..115ee9b8a 100644 --- a/src/libutil/http_router.h +++ b/src/libutil/http_router.h @@ -19,14 +19,20 @@ #include "config.h" #include "http_connection.h" +#ifdef __cplusplus +extern "C" { +#endif + struct rspamd_http_connection_router; struct rspamd_http_connection_entry; typedef int (*rspamd_http_router_handler_t) (struct rspamd_http_connection_entry *conn_ent, struct rspamd_http_message *msg); + typedef void (*rspamd_http_router_error_handler_t) (struct rspamd_http_connection_entry *conn_ent, GError *err); + typedef void (*rspamd_http_router_finish_handler_t) (struct rspamd_http_connection_entry *conn_ent); @@ -62,7 +68,7 @@ struct rspamd_http_connection_router { * the specified directory * @return */ -struct rspamd_http_connection_router * rspamd_http_router_new ( +struct rspamd_http_connection_router *rspamd_http_router_new ( rspamd_http_router_error_handler_t eh, rspamd_http_router_finish_handler_t fh, ev_tstamp timeout, @@ -109,6 +115,7 @@ void rspamd_http_router_insert_headers (struct rspamd_http_connection_router *ro struct rspamd_http_message *msg); struct rspamd_regexp_s; + /** * Adds new pattern to router, regexp object is refcounted by this function * @param router @@ -117,6 +124,7 @@ struct rspamd_regexp_s; */ void rspamd_http_router_add_regexp (struct rspamd_http_connection_router *router, struct rspamd_regexp_s *re, rspamd_http_router_handler_t handler); + /** * Handle new accepted socket * @param router router object @@ -134,4 +142,8 @@ void rspamd_http_router_handle_socket ( */ void rspamd_http_router_free (struct rspamd_http_connection_router *router); +#ifdef __cplusplus +} +#endif + #endif diff --git a/src/libutil/http_util.h b/src/libutil/http_util.h index 30d806ae0..7a22ffb16 100644 --- a/src/libutil/http_util.h +++ b/src/libutil/http_util.h @@ -19,6 +19,10 @@ #include "config.h" +#ifdef __cplusplus +extern "C" { +#endif + /** * Parse HTTP date header and return it as time_t * @param header HTTP date header @@ -45,4 +49,8 @@ glong rspamd_http_date_format (gchar *buf, gsize len, time_t time); */ void rspamd_http_normalize_path_inplace (gchar *path, guint len, guint *nlen); +#ifdef __cplusplus +} +#endif + #endif diff --git a/src/libutil/libev_helper.h b/src/libutil/libev_helper.h index cf52db557..8502043e6 100644 --- a/src/libutil/libev_helper.h +++ b/src/libutil/libev_helper.h @@ -20,12 +20,17 @@ #include "config.h" #include "contrib/libev/ev.h" + +#ifdef __cplusplus +extern "C" { +#endif + /* * This module is a little helper to simplify libevent->libev transition * It allows to create timed IO watchers utilising both */ -typedef void (*rspamd_ev_cb)(int fd, short what, void *ud); +typedef void (*rspamd_ev_cb) (int fd, short what, void *ud); struct rspamd_io_ev { ev_io io; @@ -45,7 +50,7 @@ struct rspamd_io_ev { * @param ud */ void rspamd_ev_watcher_init (struct rspamd_io_ev *ev, - int fd, short what, rspamd_ev_cb cb, void *ud); + int fd, short what, rspamd_ev_cb cb, void *ud); /** * Start watcher with the specific timeout @@ -75,4 +80,8 @@ void rspamd_ev_watcher_reschedule (struct ev_loop *loop, struct rspamd_io_ev *ev, short what); +#ifdef __cplusplus +} +#endif + #endif diff --git a/src/libutil/logger.h b/src/libutil/logger.h index 7347e67b1..e56c37aad 100644 --- a/src/libutil/logger.h +++ b/src/libutil/logger.h @@ -2,23 +2,28 @@ #define RSPAMD_LOGGER_H #include "config.h" -#include "cfg_file.h" #include "radix.h" #include "util.h" +#ifdef __cplusplus +extern "C" { +#endif + #ifndef G_LOG_LEVEL_USER_SHIFT #define G_LOG_LEVEL_USER_SHIFT 8 #endif +struct rspamd_config; + enum rspamd_log_flags { RSPAMD_LOG_FORCED = (1 << G_LOG_LEVEL_USER_SHIFT), RSPAMD_LOG_ENCRYPTED = (1 << (G_LOG_LEVEL_USER_SHIFT + 1)), - RSPAMD_LOG_LEVEL_MASK = ~(RSPAMD_LOG_FORCED|RSPAMD_LOG_ENCRYPTED) + RSPAMD_LOG_LEVEL_MASK = ~(RSPAMD_LOG_FORCED | RSPAMD_LOG_ENCRYPTED) }; typedef void (*rspamd_log_func_t) (const gchar *module, const gchar *id, - const gchar *function, - gint level_flags, const gchar *message, gpointer arg); + const gchar *function, + gint level_flags, const gchar *message, gpointer arg); typedef struct rspamd_logger_s rspamd_logger_t; @@ -28,9 +33,9 @@ typedef struct rspamd_logger_s rspamd_logger_t; * Init logger */ void rspamd_set_logger (struct rspamd_config *cfg, - GQuark ptype, - rspamd_logger_t **plogger, - rspamd_mempool_t *pool); + GQuark ptype, + rspamd_logger_t **plogger, + rspamd_mempool_t *pool); /** * Open log file or initialize other structures @@ -76,7 +81,7 @@ void rspamd_log_flush (rspamd_logger_t *logger); * Log function that is compatible for glib messages */ void rspamd_glib_log_function (const gchar *log_domain, - GLogLevelFlags log_level, const gchar *message, gpointer arg); + GLogLevelFlags log_level, const gchar *message, gpointer arg); /** * Log function for printing glib assertions @@ -87,13 +92,13 @@ void rspamd_glib_printerr_function (const gchar *message); * Function with variable number of arguments support */ void rspamd_common_log_function (rspamd_logger_t *logger, - gint level_flags, - const gchar *module, const gchar *id, - const gchar *function, const gchar *fmt, ...); + gint level_flags, + const gchar *module, const gchar *id, + const gchar *function, const gchar *fmt, ...); void rspamd_common_logv (rspamd_logger_t *logger, gint level_flags, - const gchar *module, const gchar *id, const gchar *function, - const gchar *fmt, va_list args); + const gchar *module, const gchar *id, const gchar *function, + const gchar *fmt, va_list args); /** * Add new logging module, returns module ID @@ -106,15 +111,15 @@ guint rspamd_logger_add_debug_module (const gchar *mod); * Macro to use for faster debug modules */ #define INIT_LOG_MODULE(mname) \ - static guint rspamd_##mname##_log_id = (guint)-1; \ - RSPAMD_CONSTRUCTOR(rspamd_##mname##_log_init) { \ - rspamd_##mname##_log_id = rspamd_logger_add_debug_module(#mname); \ + static guint rspamd_##mname##_log_id = (guint)-1; \ + RSPAMD_CONSTRUCTOR(rspamd_##mname##_log_init) { \ + rspamd_##mname##_log_id = rspamd_logger_add_debug_module(#mname); \ } #define INIT_LOG_MODULE_PUBLIC(mname) \ - guint rspamd_##mname##_log_id = (guint)-1; \ - RSPAMD_CONSTRUCTOR(rspamd_##mname##_log_init) { \ - rspamd_##mname##_log_id = rspamd_logger_add_debug_module(#mname); \ + guint rspamd_##mname##_log_id = (guint)-1; \ + RSPAMD_CONSTRUCTOR(rspamd_##mname##_log_init) { \ + rspamd_##mname##_log_id = rspamd_logger_add_debug_module(#mname); \ } void rspamd_logger_configure_modules (GHashTable *mods_enabled); @@ -123,22 +128,22 @@ void rspamd_logger_configure_modules (GHashTable *mods_enabled); * Conditional debug function */ void rspamd_conditional_debug (rspamd_logger_t *logger, - rspamd_inet_addr_t *addr, const gchar *module, const gchar *id, - const gchar *function, const gchar *fmt, ...); + rspamd_inet_addr_t *addr, const gchar *module, const gchar *id, + const gchar *function, const gchar *fmt, ...); void rspamd_conditional_debug_fast (rspamd_logger_t *logger, - rspamd_inet_addr_t *addr, - guint mod_id, const gchar *module, const gchar *id, - const gchar *function, const gchar *fmt, ...); + rspamd_inet_addr_t *addr, + guint mod_id, const gchar *module, const gchar *id, + const gchar *function, const gchar *fmt, ...); /** * Function with variable number of arguments support that uses static default logger */ void rspamd_default_log_function (gint level_flags, - const gchar *module, const gchar *id, - const gchar *function, - const gchar *fmt, - ...); + const gchar *module, const gchar *id, + const gchar *function, + const gchar *fmt, + ...); /** * Varargs version of default log function @@ -148,10 +153,10 @@ void rspamd_default_log_function (gint level_flags, * @param args */ void rspamd_default_logv (gint level_flags, - const gchar *module, const gchar *id, - const gchar *function, - const gchar *fmt, - va_list args); + const gchar *module, const gchar *id, + const gchar *function, + const gchar *fmt, + va_list args); /** * Temporary turn on debug @@ -180,20 +185,20 @@ void rspamd_log_lock (rspamd_logger_t *logger); * 2 - info messages * 3 - debug messages */ -const guint64* rspamd_log_counters (rspamd_logger_t *logger); +const guint64 *rspamd_log_counters (rspamd_logger_t *logger); /** * Returns errors ring buffer as ucl array * @param logger * @return */ -ucl_object_t * rspamd_log_errorbuf_export (const rspamd_logger_t *logger); +ucl_object_t *rspamd_log_errorbuf_export (const rspamd_logger_t *logger); /** * Returns the current logger object * @return */ -rspamd_logger_t* rspamd_logger_get_singleton (void); +rspamd_logger_t *rspamd_logger_get_singleton (void); /* Typical functions */ @@ -282,7 +287,7 @@ extern guint rspamd_task_log_id; G_STRFUNC, \ __VA_ARGS__) #define msg_debug_task_check(...) rspamd_conditional_debug_fast (NULL, \ - task ? task->from_addr : NULL, \ + task ? task->from_addr : NULL, \ rspamd_task_log_id, "task", task ? task->task_pool->tag.uid : NULL, \ G_STRFUNC, \ __VA_ARGS__) @@ -310,7 +315,7 @@ extern guint rspamd_task_log_id; G_STRFUNC, \ __VA_ARGS__) #define msg_warn_pool_check(...) rspamd_default_log_function (G_LOG_LEVEL_WARNING, \ - pool ? pool->tag.tagname : NULL, pool ? pool->tag.uid : NULL, \ + pool ? pool->tag.tagname : NULL, pool ? pool->tag.uid : NULL, \ G_STRFUNC, \ __VA_ARGS__) #define msg_info_pool_check(...) rspamd_default_log_function (G_LOG_LEVEL_INFO, \ @@ -318,7 +323,12 @@ extern guint rspamd_task_log_id; G_STRFUNC, \ __VA_ARGS__) #define msg_debug_pool_check(...) rspamd_conditional_debug (NULL, NULL, \ - pool ? pool->tag.tagname : NULL, pool ? pool->tag.uid : NULL, \ - G_STRFUNC, \ - __VA_ARGS__) + pool ? pool->tag.tagname : NULL, pool ? pool->tag.uid : NULL, \ + G_STRFUNC, \ + __VA_ARGS__) + +#ifdef __cplusplus +} +#endif + #endif diff --git a/src/libutil/map.h b/src/libutil/map.h index 9f04d4c6c..9e09ab8fe 100644 --- a/src/libutil/map.h +++ b/src/libutil/map.h @@ -9,26 +9,34 @@ #include "radix.h" #include "dns.h" +#ifdef __cplusplus +extern "C" { +#endif + /** * Maps API is designed to load lists data from different dynamic sources. * It monitor files and HTTP locations for modifications and reload them if they are * modified. */ struct map_cb_data; +struct rspamd_worker; /** * Callback types */ -typedef gchar * (*map_cb_t)(gchar *chunk, gint len, - struct map_cb_data *data, gboolean final); -typedef void (*map_fin_cb_t)(struct map_cb_data *data, void **target); -typedef void (*map_dtor_t)(struct map_cb_data *data); +typedef gchar *(*map_cb_t) (gchar *chunk, gint len, + struct map_cb_data *data, gboolean final); + +typedef void (*map_fin_cb_t) (struct map_cb_data *data, void **target); + +typedef void (*map_dtor_t) (struct map_cb_data *data); -typedef gboolean (*rspamd_map_traverse_cb)(gconstpointer key, - gconstpointer value, gsize hits, gpointer ud); -typedef void (*rspamd_map_traverse_function)(void *data, - rspamd_map_traverse_cb cb, - gpointer cbdata, gboolean reset_hits); +typedef gboolean (*rspamd_map_traverse_cb) (gconstpointer key, + gconstpointer value, gsize hits, gpointer ud); + +typedef void (*rspamd_map_traverse_function) (void *data, + rspamd_map_traverse_cb cb, + gpointer cbdata, gboolean reset_hits); /** * Common map object @@ -56,7 +64,7 @@ gboolean rspamd_map_is_map (const gchar *map_line); /** * Add map from line */ -struct rspamd_map* rspamd_map_add (struct rspamd_config *cfg, +struct rspamd_map *rspamd_map_add (struct rspamd_config *cfg, const gchar *map_line, const gchar *description, map_cb_t read_callback, @@ -67,7 +75,7 @@ struct rspamd_map* rspamd_map_add (struct rspamd_config *cfg, /** * Add map from ucl */ -struct rspamd_map* rspamd_map_add_from_ucl (struct rspamd_config *cfg, +struct rspamd_map *rspamd_map_add_from_ucl (struct rspamd_config *cfg, const ucl_object_t *obj, const gchar *description, map_cb_t read_callback, @@ -111,6 +119,10 @@ rspamd_map_traverse_function rspamd_map_get_traverse_function (struct rspamd_map * @return */ void rspamd_map_traverse (struct rspamd_map *map, rspamd_map_traverse_cb cb, - gpointer cbdata, gboolean reset_hits); + gpointer cbdata, gboolean reset_hits); + +#ifdef __cplusplus +} +#endif #endif diff --git a/src/libutil/map_helpers.h b/src/libutil/map_helpers.h index 4645024e3..4f7b5b804 100644 --- a/src/libutil/map_helpers.h +++ b/src/libutil/map_helpers.h @@ -27,6 +27,11 @@ * Defines helper structures to deal with different map types */ + +#ifdef __cplusplus +extern "C" { +#endif + /** * Common structures, abstract for simplicity */ @@ -42,56 +47,64 @@ enum rspamd_regexp_map_flags { }; typedef void (*insert_func) (gpointer st, gconstpointer key, - gconstpointer value); + gconstpointer value); /** * Radix list is a list like ip/mask */ -gchar * rspamd_radix_read ( +gchar *rspamd_radix_read ( gchar *chunk, gint len, struct map_cb_data *data, gboolean final); + void rspamd_radix_fin (struct map_cb_data *data, void **target); + void rspamd_radix_dtor (struct map_cb_data *data); /** * Kv list is an ordinal list of keys and values separated by whitespace */ -gchar * rspamd_kv_list_read ( +gchar *rspamd_kv_list_read ( gchar *chunk, gint len, struct map_cb_data *data, gboolean final); + void rspamd_kv_list_fin (struct map_cb_data *data, void **target); + void rspamd_kv_list_dtor (struct map_cb_data *data); /** * Regexp list is a list of regular expressions */ -gchar * rspamd_regexp_list_read_single ( +gchar *rspamd_regexp_list_read_single ( gchar *chunk, gint len, struct map_cb_data *data, gboolean final); -gchar * rspamd_regexp_list_read_multiple ( + +gchar *rspamd_regexp_list_read_multiple ( gchar *chunk, gint len, struct map_cb_data *data, gboolean final); -gchar * rspamd_glob_list_read_single ( +gchar *rspamd_glob_list_read_single ( gchar *chunk, gint len, struct map_cb_data *data, gboolean final); -gchar * rspamd_glob_list_read_multiple ( + +gchar *rspamd_glob_list_read_multiple ( gchar *chunk, gint len, struct map_cb_data *data, gboolean final); + void rspamd_regexp_list_fin (struct map_cb_data *data, void **target); + void rspamd_regexp_list_dtor (struct map_cb_data *data); /** @@ -99,7 +112,7 @@ void rspamd_regexp_list_dtor (struct map_cb_data *data); */ gchar * rspamd_parse_kv_list ( - gchar * chunk, + gchar *chunk, gint len, struct map_cb_data *data, insert_func func, @@ -115,7 +128,7 @@ rspamd_parse_kv_list ( * @return */ gconstpointer rspamd_match_regexp_map_single (struct rspamd_regexp_map_helper *map, - const gchar *in, gsize len); + const gchar *in, gsize len); /** * Find a multiple (all) matching regexp for the specified text or NULL if @@ -125,8 +138,8 @@ gconstpointer rspamd_match_regexp_map_single (struct rspamd_regexp_map_helper *m * @param len * @return */ -GPtrArray* rspamd_match_regexp_map_all (struct rspamd_regexp_map_helper *map, - const gchar *in, gsize len); +GPtrArray *rspamd_match_regexp_map_all (struct rspamd_regexp_map_helper *map, + const gchar *in, gsize len); /** * Find value matching specific key in a hash map @@ -136,7 +149,7 @@ GPtrArray* rspamd_match_regexp_map_all (struct rspamd_regexp_map_helper *map, * @return */ gconstpointer rspamd_match_hash_map (struct rspamd_hash_map_helper *map, - const gchar *in); + const gchar *in); /** * Find value matching specific key in a hash map @@ -146,10 +159,10 @@ gconstpointer rspamd_match_hash_map (struct rspamd_hash_map_helper *map, * @return */ gconstpointer rspamd_match_radix_map (struct rspamd_radix_map_helper *map, - const guchar *in, gsize inlen); + const guchar *in, gsize inlen); gconstpointer rspamd_match_radix_map_addr (struct rspamd_radix_map_helper *map, - const rspamd_inet_addr_t *addr); + const rspamd_inet_addr_t *addr); /** * Creates radix map helper @@ -157,6 +170,7 @@ gconstpointer rspamd_match_radix_map_addr (struct rspamd_radix_map_helper *map, * @return */ struct rspamd_radix_map_helper *rspamd_map_helper_new_radix (struct rspamd_map *map); + /** * Inserts new value into radix map * @param st @@ -164,6 +178,7 @@ struct rspamd_radix_map_helper *rspamd_map_helper_new_radix (struct rspamd_map * * @param value */ void rspamd_map_helper_insert_radix (gpointer st, gconstpointer key, gconstpointer value); + /** * Inserts new value into radix map performing synchronous resolving * @param st @@ -171,7 +186,8 @@ void rspamd_map_helper_insert_radix (gpointer st, gconstpointer key, gconstpoint * @param value */ void rspamd_map_helper_insert_radix_resolve (gpointer st, gconstpointer key, - gconstpointer value); + gconstpointer value); + /** * Destroys radix map helper * @param r @@ -185,6 +201,7 @@ void rspamd_map_helper_destroy_radix (struct rspamd_radix_map_helper *r); * @return */ struct rspamd_hash_map_helper *rspamd_map_helper_new_hash (struct rspamd_map *map); + /** * Inserts a new value into a hash map * @param st @@ -192,6 +209,7 @@ struct rspamd_hash_map_helper *rspamd_map_helper_new_hash (struct rspamd_map *ma * @param value */ void rspamd_map_helper_insert_hash (gpointer st, gconstpointer key, gconstpointer value); + /** * Destroys hash map helper * @param r @@ -204,8 +222,9 @@ void rspamd_map_helper_destroy_hash (struct rspamd_hash_map_helper *r); * @param flags * @return */ -struct rspamd_regexp_map_helper * rspamd_map_helper_new_regexp (struct rspamd_map *map, - enum rspamd_regexp_map_flags flags); +struct rspamd_regexp_map_helper *rspamd_map_helper_new_regexp (struct rspamd_map *map, + enum rspamd_regexp_map_flags flags); + /** * Inserts a new regexp into regexp map * @param st @@ -213,10 +232,15 @@ struct rspamd_regexp_map_helper * rspamd_map_helper_new_regexp (struct rspamd_ma * @param value */ void rspamd_map_helper_insert_re (gpointer st, gconstpointer key, gconstpointer value); + /** * Destroy regexp map * @param re_map */ void rspamd_map_helper_destroy_regexp (struct rspamd_regexp_map_helper *re_map); +#ifdef __cplusplus +} +#endif + #endif diff --git a/src/libutil/map_private.h b/src/libutil/map_private.h index e08c2dce3..de84322ec 100644 --- a/src/libutil/map_private.h +++ b/src/libutil/map_private.h @@ -23,18 +23,23 @@ #include "map.h" #include "ref.h" +#ifdef __cplusplus +extern "C" { +#endif + typedef void (*rspamd_map_tmp_dtor) (gpointer p); + extern guint rspamd_map_log_id; #define msg_err_map(...) rspamd_default_log_function (G_LOG_LEVEL_CRITICAL, \ - "map", map->tag, \ + "map", map->tag, \ G_STRFUNC, \ __VA_ARGS__) #define msg_warn_map(...) rspamd_default_log_function (G_LOG_LEVEL_WARNING, \ - "map", map->tag, \ + "map", map->tag, \ G_STRFUNC, \ __VA_ARGS__) #define msg_info_map(...) rspamd_default_log_function (G_LOG_LEVEL_INFO, \ - "map", map->tag, \ + "map", map->tag, \ G_STRFUNC, \ __VA_ARGS__) #define msg_debug_map(...) rspamd_conditional_debug_fast (NULL, NULL, \ @@ -209,4 +214,8 @@ struct http_callback_data { ref_entry_t ref; }; +#ifdef __cplusplus +} +#endif + #endif /* SRC_LIBUTIL_MAP_PRIVATE_H_ */ diff --git a/src/libutil/mem_pool.h b/src/libutil/mem_pool.h index 0a2e86b6d..5a663e35f 100644 --- a/src/libutil/mem_pool.h +++ b/src/libutil/mem_pool.h @@ -13,13 +13,17 @@ #define RSPAMD_MEM_POOL_H #include "config.h" + + #if defined(HAVE_PTHREAD_PROCESS_SHARED) && !defined(DISABLE_PTHREAD_MUTEX) #include <pthread.h> #endif -struct f_str_s; - +#ifdef __cplusplus +extern "C" { +#endif +struct f_str_s; #ifdef __has_attribute # if __has_attribute(alloc_size) @@ -60,7 +64,7 @@ enum rspamd_mempool_chain_type { /** * Destructor type definition */ -typedef void (*rspamd_mempool_destruct_t)(void *ptr); +typedef void (*rspamd_mempool_destruct_t) (void *ptr); /** * Pool mutex structure @@ -122,7 +126,7 @@ typedef struct memory_pool_s { GArray *destructors; GPtrArray *trash_stack; GHashTable *variables; /**< private memory pool variables */ - gsize elt_len; /**< size of an element */ + gsize elt_len; /**< size of an element */ struct rspamd_mempool_entry_point *entry; struct rspamd_mempool_tag tag; /**< memory pool tag */ } rspamd_mempool_t; @@ -142,13 +146,13 @@ typedef struct memory_pool_stat_s { } rspamd_mempool_stat_t; - /** * Allocate new memory poll * @param size size of pool's page * @return new memory pool object */ -rspamd_mempool_t * rspamd_mempool_new_ (gsize size, const gchar *tag, const gchar *loc); +rspamd_mempool_t *rspamd_mempool_new_ (gsize size, const gchar *tag, const gchar *loc); + #define rspamd_mempool_new(size, tag) rspamd_mempool_new_((size), (tag), G_STRLOC) /** @@ -157,8 +161,8 @@ rspamd_mempool_t * rspamd_mempool_new_ (gsize size, const gchar *tag, const gcha * @param size bytes to allocate * @return pointer to allocated object */ -void * rspamd_mempool_alloc (rspamd_mempool_t * pool, gsize size) - RSPAMD_ATTR_ALLOC_SIZE(2) RSPAMD_ATTR_ALLOC_ALIGN(MIN_MEM_ALIGNMENT) RSPAMD_ATTR_RETURNS_NONNUL; +void *rspamd_mempool_alloc (rspamd_mempool_t *pool, gsize size) +RSPAMD_ATTR_ALLOC_SIZE(2) RSPAMD_ATTR_ALLOC_ALIGN(MIN_MEM_ALIGNMENT) RSPAMD_ATTR_RETURNS_NONNUL; /** * Get memory from temporary pool @@ -166,7 +170,7 @@ void * rspamd_mempool_alloc (rspamd_mempool_t * pool, gsize size) * @param size bytes to allocate * @return pointer to allocated object */ -void * rspamd_mempool_alloc_tmp (rspamd_mempool_t * pool, gsize size) RSPAMD_ATTR_RETURNS_NONNUL; +void *rspamd_mempool_alloc_tmp (rspamd_mempool_t *pool, gsize size) RSPAMD_ATTR_RETURNS_NONNUL; /** * Get memory and set it to zero @@ -174,8 +178,8 @@ void * rspamd_mempool_alloc_tmp (rspamd_mempool_t * pool, gsize size) RSPAMD_ATT * @param size bytes to allocate * @return pointer to allocated object */ -void * rspamd_mempool_alloc0 (rspamd_mempool_t * pool, gsize size) - RSPAMD_ATTR_ALLOC_SIZE(2) RSPAMD_ATTR_ALLOC_ALIGN(MIN_MEM_ALIGNMENT) RSPAMD_ATTR_RETURNS_NONNUL; +void *rspamd_mempool_alloc0 (rspamd_mempool_t *pool, gsize size) +RSPAMD_ATTR_ALLOC_SIZE(2) RSPAMD_ATTR_ALLOC_ALIGN(MIN_MEM_ALIGNMENT) RSPAMD_ATTR_RETURNS_NONNUL; /** * Get memory and set it to zero @@ -183,12 +187,12 @@ void * rspamd_mempool_alloc0 (rspamd_mempool_t * pool, gsize size) * @param size bytes to allocate * @return pointer to allocated object */ -void * rspamd_mempool_alloc0_tmp (rspamd_mempool_t * pool, gsize size) RSPAMD_ATTR_RETURNS_NONNUL; +void *rspamd_mempool_alloc0_tmp (rspamd_mempool_t *pool, gsize size) RSPAMD_ATTR_RETURNS_NONNUL; /** * Cleanup temporary data in pool */ -void rspamd_mempool_cleanup_tmp (rspamd_mempool_t * pool); +void rspamd_mempool_cleanup_tmp (rspamd_mempool_t *pool); /** * Make a copy of string in pool @@ -196,8 +200,8 @@ void rspamd_mempool_cleanup_tmp (rspamd_mempool_t * pool); * @param src source string * @return pointer to newly created string that is copy of src */ -gchar * rspamd_mempool_strdup (rspamd_mempool_t * pool, const gchar *src) - RSPAMD_ATTR_ALLOC_ALIGN(MIN_MEM_ALIGNMENT); +gchar *rspamd_mempool_strdup (rspamd_mempool_t *pool, const gchar *src) +RSPAMD_ATTR_ALLOC_ALIGN(MIN_MEM_ALIGNMENT); /** * Make a copy of fixed string in pool as null terminated string @@ -205,8 +209,8 @@ gchar * rspamd_mempool_strdup (rspamd_mempool_t * pool, const gchar *src) * @param src source string * @return pointer to newly created string that is copy of src */ -gchar * rspamd_mempool_fstrdup (rspamd_mempool_t * pool, - const struct f_str_s *src) RSPAMD_ATTR_ALLOC_ALIGN(MIN_MEM_ALIGNMENT); +gchar *rspamd_mempool_fstrdup (rspamd_mempool_t *pool, + const struct f_str_s *src) RSPAMD_ATTR_ALLOC_ALIGN(MIN_MEM_ALIGNMENT); struct f_str_tok; @@ -216,18 +220,20 @@ struct f_str_tok; * @param src source string * @return pointer to newly created string that is copy of src */ -gchar * rspamd_mempool_ftokdup (rspamd_mempool_t *pool, - const struct f_str_tok *src) RSPAMD_ATTR_ALLOC_ALIGN(MIN_MEM_ALIGNMENT); +gchar *rspamd_mempool_ftokdup (rspamd_mempool_t *pool, + const struct f_str_tok *src) RSPAMD_ATTR_ALLOC_ALIGN(MIN_MEM_ALIGNMENT); /** * Allocate piece of shared memory * @param pool memory pool object * @param size bytes to allocate */ -void * rspamd_mempool_alloc_shared (rspamd_mempool_t * pool, gsize size) - RSPAMD_ATTR_ALLOC_SIZE(2) RSPAMD_ATTR_ALLOC_ALIGN(MIN_MEM_ALIGNMENT) RSPAMD_ATTR_RETURNS_NONNUL; -void * rspamd_mempool_alloc0_shared (rspamd_mempool_t *pool, gsize size) - RSPAMD_ATTR_ALLOC_SIZE(2) RSPAMD_ATTR_ALLOC_ALIGN(MIN_MEM_ALIGNMENT) RSPAMD_ATTR_RETURNS_NONNUL; +void *rspamd_mempool_alloc_shared (rspamd_mempool_t *pool, gsize size) +RSPAMD_ATTR_ALLOC_SIZE(2) RSPAMD_ATTR_ALLOC_ALIGN(MIN_MEM_ALIGNMENT) RSPAMD_ATTR_RETURNS_NONNUL; + +void *rspamd_mempool_alloc0_shared (rspamd_mempool_t *pool, gsize size) +RSPAMD_ATTR_ALLOC_SIZE(2) RSPAMD_ATTR_ALLOC_ALIGN(MIN_MEM_ALIGNMENT) RSPAMD_ATTR_RETURNS_NONNUL; + /** * Add destructor callback to pool * @param pool memory pool object @@ -235,14 +241,14 @@ void * rspamd_mempool_alloc0_shared (rspamd_mempool_t *pool, gsize size) * @param data pointer to data that would be passed to destructor */ void rspamd_mempool_add_destructor_full (rspamd_mempool_t *pool, - rspamd_mempool_destruct_t func, - void *data, - const gchar *function, - const gchar *line); + rspamd_mempool_destruct_t func, + void *data, + const gchar *function, + const gchar *line); /* Macros for common usage */ #define rspamd_mempool_add_destructor(pool, func, data) \ - rspamd_mempool_add_destructor_full (pool, func, data, G_STRFUNC, G_STRLOC) + rspamd_mempool_add_destructor_full (pool, func, data, G_STRFUNC, G_STRLOC) /** * Replace destructor callback to pool for specified pointer @@ -252,7 +258,7 @@ void rspamd_mempool_add_destructor_full (rspamd_mempool_t *pool, * @param new_data pointer to data that would be passed to destructor */ void rspamd_mempool_replace_destructor (rspamd_mempool_t *pool, - rspamd_mempool_destruct_t func, void *old_data, void *new_data); + rspamd_mempool_destruct_t func, void *old_data, void *new_data); /** * Calls all destructors associated with the specific memory pool without removing @@ -272,7 +278,7 @@ void rspamd_mempool_delete (rspamd_mempool_t *pool); * @param pool memory pool object * @return mutex object */ -rspamd_mempool_mutex_t * rspamd_mempool_get_mutex (rspamd_mempool_t *pool); +rspamd_mempool_mutex_t *rspamd_mempool_get_mutex (rspamd_mempool_t *pool); /** * Lock mutex @@ -291,7 +297,7 @@ void rspamd_mempool_unlock_mutex (rspamd_mempool_mutex_t *mutex); * @param pool memory pool object * @return rwlock object */ -rspamd_mempool_rwlock_t * rspamd_mempool_get_rwlock (rspamd_mempool_t *pool); +rspamd_mempool_rwlock_t *rspamd_mempool_get_rwlock (rspamd_mempool_t *pool); /** * Acquire read lock @@ -333,6 +339,7 @@ void rspamd_mempool_stat_reset (void); * @return size of memory page in system */ #define rspamd_mempool_suggest_size() rspamd_mempool_suggest_size_(G_STRLOC) + gsize rspamd_mempool_suggest_size_ (const char *loc); /** @@ -343,7 +350,7 @@ gsize rspamd_mempool_suggest_size_ (const char *loc); * @param destructor pointer to function-destructor */ void rspamd_mempool_set_variable (rspamd_mempool_t *pool, const gchar *name, - gpointer value, rspamd_mempool_destruct_t destructor); + gpointer value, rspamd_mempool_destruct_t destructor); /** * Get memory pool variable @@ -352,7 +359,7 @@ void rspamd_mempool_set_variable (rspamd_mempool_t *pool, const gchar *name, * @return NULL or pointer to variable data */ gpointer rspamd_mempool_get_variable (rspamd_mempool_t *pool, - const gchar *name); + const gchar *name); /** * Removes variable from memory pool @@ -360,7 +367,8 @@ gpointer rspamd_mempool_get_variable (rspamd_mempool_t *pool, * @param name name of variable */ void rspamd_mempool_remove_variable (rspamd_mempool_t *pool, - const gchar *name); + const gchar *name); + /** * Prepend element to a list creating it in the memory pool * @param l @@ -368,7 +376,8 @@ void rspamd_mempool_remove_variable (rspamd_mempool_t *pool, * @return */ GList *rspamd_mempool_glist_prepend (rspamd_mempool_t *pool, - GList *l, gpointer p) G_GNUC_WARN_UNUSED_RESULT; + GList *l, gpointer p) G_GNUC_WARN_UNUSED_RESULT; + /** * Append element to a list creating it in the memory pool * @param l @@ -376,6 +385,10 @@ GList *rspamd_mempool_glist_prepend (rspamd_mempool_t *pool, * @return */ GList *rspamd_mempool_glist_append (rspamd_mempool_t *pool, - GList *l, gpointer p) G_GNUC_WARN_UNUSED_RESULT; + GList *l, gpointer p) G_GNUC_WARN_UNUSED_RESULT; + +#ifdef __cplusplus +} +#endif #endif diff --git a/src/libutil/multipattern.h b/src/libutil/multipattern.h index 785c09e3d..959b13455 100644 --- a/src/libutil/multipattern.h +++ b/src/libutil/multipattern.h @@ -26,13 +26,17 @@ * hyperscan and ac-trie */ +#ifdef __cplusplus +extern "C" { +#endif + enum rspamd_multipattern_flags { RSPAMD_MULTIPATTERN_DEFAULT = 0, RSPAMD_MULTIPATTERN_ICASE = (1 << 0), RSPAMD_MULTIPATTERN_UTF8 = (1 << 1), RSPAMD_MULTIPATTERN_TLD = (1 << 2), /* Not supported by acism */ - RSPAMD_MULTIPATTERN_GLOB = (1 << 3), + RSPAMD_MULTIPATTERN_GLOB = (1 << 3), RSPAMD_MULTIPATTERN_RE = (1 << 4), }; @@ -50,12 +54,12 @@ struct rspamd_cryptobox_library_ctx; * @return if 0 then search for another pattern, otherwise return this value to caller */ typedef gint (*rspamd_multipattern_cb_t) (struct rspamd_multipattern *mp, - guint strnum, - gint match_start, - gint match_pos, - const gchar *text, - gsize len, - void *context); + guint strnum, + gint match_start, + gint match_pos, + const gchar *text, + gsize len, + void *context); /** * Init multipart library and set the appropriate cache dir @@ -78,7 +82,7 @@ struct rspamd_multipattern *rspamd_multipattern_create ( * @return */ struct rspamd_multipattern *rspamd_multipattern_create_sized (guint reserved, - enum rspamd_multipattern_flags flags); + enum rspamd_multipattern_flags flags); /** * Creates new multipattern structure @@ -98,7 +102,7 @@ struct rspamd_multipattern *rspamd_multipattern_create_full ( * @param pattern */ void rspamd_multipattern_add_pattern (struct rspamd_multipattern *mp, - const gchar *pattern, gint flags); + const gchar *pattern, gint flags); /** * Adds new pattern from arbitrary string @@ -108,7 +112,7 @@ void rspamd_multipattern_add_pattern (struct rspamd_multipattern *mp, * @param flags */ void rspamd_multipattern_add_pattern_len (struct rspamd_multipattern *mp, - const gchar *pattern, gsize patlen, gint flags); + const gchar *pattern, gsize patlen, gint flags); /** * Compiles multipattern structure @@ -116,7 +120,7 @@ void rspamd_multipattern_add_pattern_len (struct rspamd_multipattern *mp, * @return */ gboolean rspamd_multipattern_compile (struct rspamd_multipattern *mp, - GError **err); + GError **err); /** * Lookups for patterns in a text using the specified callback function @@ -128,16 +132,17 @@ gboolean rspamd_multipattern_compile (struct rspamd_multipattern *mp, * @return */ gint rspamd_multipattern_lookup (struct rspamd_multipattern *mp, - const gchar *in, gsize len, rspamd_multipattern_cb_t cb, - gpointer ud, guint *pnfound); + const gchar *in, gsize len, rspamd_multipattern_cb_t cb, + gpointer ud, guint *pnfound); + /** * Get pattern string from multipattern identified by index * @param mp * @param index * @return */ -const gchar* rspamd_multipattern_get_pattern (struct rspamd_multipattern *mp, - guint index); +const gchar *rspamd_multipattern_get_pattern (struct rspamd_multipattern *mp, + guint index); /** * Returns number of patterns in a multipattern matcher @@ -158,4 +163,8 @@ void rspamd_multipattern_destroy (struct rspamd_multipattern *mp); */ gboolean rspamd_multipattern_has_hyperscan (void); +#ifdef __cplusplus +} +#endif + #endif /* SRC_LIBUTIL_MULTIPATTERN_H_ */ diff --git a/src/libutil/printf.h b/src/libutil/printf.h index 86947f67c..008e08245 100644 --- a/src/libutil/printf.h +++ b/src/libutil/printf.h @@ -19,6 +19,9 @@ #include "config.h" #include "fstring.h" +#ifdef __cplusplus +extern "C" { +#endif /* * supported formats: * %[0][width][x][X]O off_t @@ -59,24 +62,35 @@ * @param ud opaque pointer * @return number of characters written */ -typedef glong (*rspamd_printf_append_func)(const gchar *buf, glong buflen, - gpointer ud); +typedef glong (*rspamd_printf_append_func) (const gchar *buf, glong buflen, + gpointer ud); glong rspamd_fprintf (FILE *f, const gchar *fmt, ...); + glong rspamd_printf (const gchar *fmt, ...); + glong rspamd_log_fprintf (FILE *f, const gchar *fmt, ...); + glong rspamd_snprintf (gchar *buf, glong max, const gchar *fmt, ...); -gchar * rspamd_vsnprintf (gchar *buf, glong max, const gchar *fmt, - va_list args); + +gchar *rspamd_vsnprintf (gchar *buf, glong max, const gchar *fmt, + va_list args); + glong rspamd_printf_gstring (GString *s, const gchar *fmt, ...); + glong rspamd_vprintf_gstring (GString *s, const gchar *fmt, va_list args); glong rspamd_printf_fstring (rspamd_fstring_t **s, const gchar *fmt, ...); + glong rspamd_vprintf_fstring (rspamd_fstring_t **s, const gchar *fmt, va_list args); glong rspamd_vprintf_common (rspamd_printf_append_func func, - gpointer apd, - const gchar *fmt, - va_list args); + gpointer apd, + const gchar *fmt, + va_list args); + +#ifdef __cplusplus +} +#endif #endif /* PRINTF_H_ */ diff --git a/src/libutil/radix.h b/src/libutil/radix.h index be75b1b7f..f08b6cc1b 100644 --- a/src/libutil/radix.h +++ b/src/libutil/radix.h @@ -22,6 +22,9 @@ #define RADIX_NO_VALUE (uintptr_t)-1 +#ifdef __cplusplus +extern "C" { +#endif typedef struct radix_tree_compressed radix_compressed_t; @@ -35,10 +38,10 @@ typedef struct radix_tree_compressed radix_compressed_t; * @return previous value of the key or `RADIX_NO_VALUE` */ uintptr_t -radix_insert_compressed (radix_compressed_t * tree, - guint8 *key, gsize keylen, - gsize masklen, - uintptr_t value); +radix_insert_compressed (radix_compressed_t *tree, + guint8 *key, gsize keylen, + gsize masklen, + uintptr_t value); /** * Find a key in a radix trie @@ -47,8 +50,8 @@ radix_insert_compressed (radix_compressed_t * tree, * @param keylen length of a key * @return opaque pointer or `RADIX_NO_VALUE` if no value has been found */ -uintptr_t radix_find_compressed (radix_compressed_t * tree, const guint8 *key, - gsize keylen); +uintptr_t radix_find_compressed (radix_compressed_t *tree, const guint8 *key, + gsize keylen); /** * Find specified address in tree (works for IPv4 or IPv6 addresses) @@ -57,7 +60,7 @@ uintptr_t radix_find_compressed (radix_compressed_t * tree, const guint8 *key, * @return */ uintptr_t radix_find_compressed_addr (radix_compressed_t *tree, - const rspamd_inet_addr_t *addr); + const rspamd_inet_addr_t *addr); /** * Destroy the complete radix trie @@ -81,14 +84,14 @@ radix_compressed_t *radix_create_compressed_with_pool (rspamd_mempool_t *pool); * @return number of elements inserted */ gint rspamd_radix_add_iplist (const gchar *list, const gchar *separators, - radix_compressed_t *tree, gconstpointer value, gboolean resolve); + radix_compressed_t *tree, gconstpointer value, gboolean resolve); /** * Generic version of @see rspamd_radix_add_iplist. This function creates tree * if `tree` is NULL. */ gboolean radix_add_generic_iplist (const gchar *ip_list, - radix_compressed_t **tree, gboolean resolve); + radix_compressed_t **tree, gboolean resolve); /** * Returns number of elements in the tree @@ -102,11 +105,15 @@ gsize radix_get_size (radix_compressed_t *tree); * @param tree * @return constant string */ -const gchar * radix_get_info (radix_compressed_t *tree); +const gchar *radix_get_info (radix_compressed_t *tree); /** * Returns memory pool associated with the radix tree */ -rspamd_mempool_t* radix_get_pool (radix_compressed_t *tree); +rspamd_mempool_t *radix_get_pool (radix_compressed_t *tree); + +#ifdef __cplusplus +} +#endif #endif diff --git a/src/libutil/ref.h b/src/libutil/ref.h index 1e2fc30b5..99498ac31 100644 --- a/src/libutil/ref.h +++ b/src/libutil/ref.h @@ -19,6 +19,8 @@ #ifdef HAVE_CONFIG_H #include "config.h" #endif + + /** * @file ref.h * A set of macros to handle refcounts diff --git a/src/libutil/regexp.h b/src/libutil/regexp.h index b982c08f6..f7ed05dad 100644 --- a/src/libutil/regexp.h +++ b/src/libutil/regexp.h @@ -35,6 +35,11 @@ #define RSPAMD_REGEXP_FLAG_DISABLE_JIT (1 << 5) #define RSPAMD_REGEXP_FLAG_UTF (1 << 6) + +#ifdef __cplusplus +extern "C" { +#endif + struct rspamd_config; typedef struct rspamd_regexp_s rspamd_regexp_t; @@ -51,8 +56,8 @@ struct rspamd_re_capture { * @param err error pointer set if compilation failed * @return new regexp object */ -rspamd_regexp_t* rspamd_regexp_new (const gchar *pattern, const gchar *flags, - GError **err); +rspamd_regexp_t *rspamd_regexp_new (const gchar *pattern, const gchar *flags, + GError **err); /** * Search the specified regexp in the text @@ -66,9 +71,9 @@ rspamd_regexp_t* rspamd_regexp_new (const gchar *pattern, const gchar *flags, * @return */ gboolean rspamd_regexp_search (rspamd_regexp_t *re, - const gchar *text, gsize len, - const gchar **start, const gchar **end, gboolean raw, - GArray *captures); + const gchar *text, gsize len, + const gchar **start, const gchar **end, gboolean raw, + GArray *captures); /** @@ -79,12 +84,12 @@ gboolean rspamd_regexp_search (rspamd_regexp_t *re, * @return */ gboolean rspamd_regexp_match (rspamd_regexp_t *re, - const gchar *text, gsize len, gboolean raw); + const gchar *text, gsize len, gboolean raw); /** * Increase refcount for a regexp object */ -rspamd_regexp_t* rspamd_regexp_ref (rspamd_regexp_t *re); +rspamd_regexp_t *rspamd_regexp_ref (rspamd_regexp_t *re); /** * Unref regexp object @@ -118,12 +123,13 @@ gpointer rspamd_regexp_get_id (rspamd_regexp_t *re); * @param re * @return */ -const char* rspamd_regexp_get_pattern (rspamd_regexp_t *re); +const char *rspamd_regexp_get_pattern (rspamd_regexp_t *re); /** * Get PCRE flags for the regexp */ guint rspamd_regexp_get_pcre_flags (rspamd_regexp_t *re); + /** * Get rspamd flags for the regexp */ @@ -179,7 +185,7 @@ gpointer rspamd_regexp_set_class (rspamd_regexp_t *re, gpointer re_class); * Create new regexp cache * @return */ -struct rspamd_regexp_cache* rspamd_regexp_cache_new (void); +struct rspamd_regexp_cache *rspamd_regexp_cache_new (void); /** * Query rspamd cache for a specified regexp @@ -188,9 +194,9 @@ struct rspamd_regexp_cache* rspamd_regexp_cache_new (void); * @param flags * @return */ -rspamd_regexp_t* rspamd_regexp_cache_query (struct rspamd_regexp_cache* cache, - const gchar *pattern, - const gchar *flags); +rspamd_regexp_t *rspamd_regexp_cache_query (struct rspamd_regexp_cache *cache, + const gchar *pattern, + const gchar *flags); /** * Insert item to the cache using custom pattern and flags @@ -199,9 +205,9 @@ rspamd_regexp_t* rspamd_regexp_cache_query (struct rspamd_regexp_cache* cache, * @param flags * @param re */ -void rspamd_regexp_cache_insert (struct rspamd_regexp_cache* cache, - const gchar *pattern, - const gchar *flags, rspamd_regexp_t *re); +void rspamd_regexp_cache_insert (struct rspamd_regexp_cache *cache, + const gchar *pattern, + const gchar *flags, rspamd_regexp_t *re); /** * Create or get cached regexp from the specified cache @@ -211,9 +217,9 @@ void rspamd_regexp_cache_insert (struct rspamd_regexp_cache* cache, * @param err error pointer set if compilation failed * @return new regexp object */ -rspamd_regexp_t* rspamd_regexp_cache_create (struct rspamd_regexp_cache *cache, - const gchar *pattern, - const gchar *flags, GError **err); +rspamd_regexp_t *rspamd_regexp_cache_create (struct rspamd_regexp_cache *cache, + const gchar *pattern, + const gchar *flags, GError **err); /** * Remove regexp from the cache @@ -222,7 +228,7 @@ rspamd_regexp_t* rspamd_regexp_cache_create (struct rspamd_regexp_cache *cache, * @return TRUE if a regexp has been removed */ gboolean rspamd_regexp_cache_remove (struct rspamd_regexp_cache *cache, - rspamd_regexp_t *re); + rspamd_regexp_t *re); /** * Destroy regexp cache and unref all elements inside it @@ -268,4 +274,8 @@ void rspamd_regexp_library_finalize (void); */ rspamd_regexp_t *rspamd_regexp_from_glob (const gchar *gl, gsize sz, GError **err); +#ifdef __cplusplus +} +#endif + #endif /* REGEXP_H_ */ diff --git a/src/libutil/rrd.c b/src/libutil/rrd.c index d17e823e6..9208c71da 100644 --- a/src/libutil/rrd.c +++ b/src/libutil/rrd.c @@ -16,6 +16,7 @@ #include "config.h" #include "rrd.h" #include "util.h" +#include "cfg_file.h" #include "logger.h" #include "unix-std.h" #include "cryptobox.h" diff --git a/src/libutil/rrd.h b/src/libutil/rrd.h index d24249965..ffffa921d 100644 --- a/src/libutil/rrd.h +++ b/src/libutil/rrd.h @@ -26,6 +26,10 @@ #define RRD_VERSION "0003" #define RRD_FLOAT_COOKIE ((double)8.642135E130) +#ifdef __cplusplus +extern "C" { +#endif + typedef union { unsigned long lv; double dv; @@ -139,41 +143,41 @@ enum rrd_cdp_param { CDP_val = 0, /* the base_interval is always an * average */ - CDP_unkn_pdp_cnt, + CDP_unkn_pdp_cnt, /* how many unknown pdp were * integrated. This and the cdp_xff * will decide if this is going to * be a UNKNOWN or a valid value */ - CDP_hw_intercept, + CDP_hw_intercept, /* Current intercept coefficient for the Holt-Winters * prediction algorithm. */ - CDP_hw_last_intercept, + CDP_hw_last_intercept, /* Last iteration intercept coefficient for the Holt-Winters * prediction algorihtm. */ - CDP_hw_slope, + CDP_hw_slope, /* Current slope coefficient for the Holt-Winters * prediction algorithm. */ - CDP_hw_last_slope, + CDP_hw_last_slope, /* Last iteration slope coeffient. */ - CDP_null_count, + CDP_null_count, /* Number of sequential Unknown (DNAN) values + 1 preceding * the current prediction. * */ - CDP_last_null_count, + CDP_last_null_count, /* Last iteration count of Unknown (DNAN) values. */ - CDP_primary_val = 8, + CDP_primary_val = 8, /* optimization for bulk updates: the value of the first CDP * value to be written in the bulk update. */ - CDP_secondary_val = 9, + CDP_secondary_val = 9, /* optimization for bulk updates: the value of subsequent * CDP values to be written in the bulk update. */ - CDP_hw_seasonal = CDP_hw_intercept, + CDP_hw_seasonal = CDP_hw_intercept, /* Current seasonal coefficient for the Holt-Winters * prediction algorithm. This is stored in CDP prep to avoid * redundant seek operations. */ - CDP_hw_last_seasonal = CDP_hw_last_intercept, + CDP_hw_last_seasonal = CDP_hw_last_intercept, /* Last iteration seasonal coefficient. */ - CDP_seasonal_deviation = CDP_hw_intercept, + CDP_seasonal_deviation = CDP_hw_intercept, CDP_last_seasonal_deviation = CDP_hw_last_intercept, CDP_init_seasonal = CDP_null_count }; @@ -200,7 +204,7 @@ struct rspamd_rrd_file { gdouble *rrd_value; /* list of rrd values */ gchar *filename; - guint8 * map; /* mmapped area */ + guint8 *map; /* mmapped area */ gsize size; /* its size */ gboolean finalized; gchar *id; @@ -216,7 +220,7 @@ struct rspamd_rrd_file { * @param err error pointer * @return rrd file structure */ -struct rspamd_rrd_file * rspamd_rrd_open (const gchar *filename, GError **err); +struct rspamd_rrd_file *rspamd_rrd_open (const gchar *filename, GError **err); /** * Create basic header for rrd file @@ -228,11 +232,11 @@ struct rspamd_rrd_file * rspamd_rrd_open (const gchar *filename, GError **err); * @return TRUE if file has been created */ struct rspamd_rrd_file *rspamd_rrd_create (const gchar *filename, - gulong ds_count, - gulong rra_count, - gulong pdp_step, - gdouble initial_ticks, - GError **err); + gulong ds_count, + gulong rra_count, + gulong pdp_step, + gdouble initial_ticks, + GError **err); /** * Add data sources to rrd file @@ -241,9 +245,9 @@ struct rspamd_rrd_file *rspamd_rrd_create (const gchar *filename, * @param err error pointer * @return TRUE if data sources were added */ -gboolean rspamd_rrd_add_ds (struct rspamd_rrd_file * file, - GArray *ds, - GError **err); +gboolean rspamd_rrd_add_ds (struct rspamd_rrd_file *file, + GArray *ds, + GError **err); /** * Add round robin archives to rrd file @@ -253,8 +257,8 @@ gboolean rspamd_rrd_add_ds (struct rspamd_rrd_file * file, * @return TRUE if archives were added */ gboolean rspamd_rrd_add_rra (struct rspamd_rrd_file *file, - GArray *rra, - GError **err); + GArray *rra, + GError **err); /** * Finalize rrd file header and initialize all RRA in the file @@ -272,16 +276,16 @@ gboolean rspamd_rrd_finalize (struct rspamd_rrd_file *file, GError **err); * @return TRUE if a row has been added */ gboolean rspamd_rrd_add_record (struct rspamd_rrd_file *file, - GArray *points, - gdouble ticks, - GError **err); + GArray *points, + gdouble ticks, + GError **err); /** * Close rrd file * @param file * @return */ -gint rspamd_rrd_close (struct rspamd_rrd_file * file); +gint rspamd_rrd_close (struct rspamd_rrd_file *file); /* * Conversion functions @@ -291,18 +295,21 @@ gint rspamd_rrd_close (struct rspamd_rrd_file * file); * Convert rrd dst type from string to numeric value */ enum rrd_dst_type rrd_dst_from_string (const gchar *str); + /** * Convert numeric presentation of dst to string */ -const gchar * rrd_dst_to_string (enum rrd_dst_type type); +const gchar *rrd_dst_to_string (enum rrd_dst_type type); + /** * Convert rrd consolidation function type from string to numeric value */ enum rrd_cf_type rrd_cf_from_string (const gchar *str); + /** * Convert numeric presentation of cf to string */ -const gchar * rrd_cf_to_string (enum rrd_cf_type type); +const gchar *rrd_cf_to_string (enum rrd_cf_type type); /* Default RRA and DS */ @@ -310,23 +317,23 @@ const gchar * rrd_cf_to_string (enum rrd_cf_type type); * Create default RRA */ void rrd_make_default_rra (const gchar *cf_name, - gulong pdp_cnt, - gulong rows, - struct rrd_rra_def *rra); + gulong pdp_cnt, + gulong rows, + struct rrd_rra_def *rra); /** * Create default DS */ void rrd_make_default_ds (const gchar *name, - const gchar *type, - gulong pdp_step, - struct rrd_ds_def *ds); + const gchar *type, + gulong pdp_step, + struct rrd_ds_def *ds); /** * Open or create the default rspamd rrd file */ struct rspamd_rrd_file *rspamd_rrd_file_default (const gchar *path, - GError **err); + GError **err); /** * Returned by querying rrd database @@ -346,6 +353,11 @@ struct rspamd_rrd_query_result { * @param rra_num number of rra to return data for * @return query result structure, that should be freed (using g_slice_free1) after usage */ -struct rspamd_rrd_query_result * rspamd_rrd_query (struct rspamd_rrd_file *file, - gulong rra_num); +struct rspamd_rrd_query_result *rspamd_rrd_query (struct rspamd_rrd_file *file, + gulong rra_num); + +#ifdef __cplusplus +} +#endif + #endif /* RRD_H_ */ diff --git a/src/libutil/shingles.h b/src/libutil/shingles.h index 5a107bdc4..2b2af9737 100644 --- a/src/libutil/shingles.h +++ b/src/libutil/shingles.h @@ -21,6 +21,10 @@ #define RSPAMD_SHINGLE_SIZE 32 +#ifdef __cplusplus +extern "C" { +#endif + struct rspamd_shingle { guint64 hashes[RSPAMD_SHINGLE_SIZE]; }; @@ -39,7 +43,7 @@ enum rspamd_shingle_alg { * @return shingle value */ typedef guint64 (*rspamd_shingles_filter) (guint64 *input, gsize count, - gint shno, const guchar *key, gpointer ud); + gint shno, const guchar *key, gpointer ud); /** * Generate shingles from the input of fixed size strings using lemmatizer @@ -51,12 +55,12 @@ typedef guint64 (*rspamd_shingles_filter) (guint64 *input, gsize count, * @param filterd opaque data for filtering function * @return shingles array */ -struct rspamd_shingle* rspamd_shingles_from_text (GArray *input, - const guchar key[16], - rspamd_mempool_t *pool, - rspamd_shingles_filter filter, - gpointer filterd, - enum rspamd_shingle_alg alg); +struct rspamd_shingle *rspamd_shingles_from_text (GArray *input, + const guchar key[16], + rspamd_mempool_t *pool, + rspamd_shingles_filter filter, + gpointer filterd, + enum rspamd_shingle_alg alg); /** * Generate shingles from the DCT matrix of an image @@ -67,12 +71,12 @@ struct rspamd_shingle* rspamd_shingles_from_text (GArray *input, * @param filterd opaque data for filtering function * @return shingles array */ -struct rspamd_shingle* rspamd_shingles_from_image (guchar *dct, - const guchar key[16], - rspamd_mempool_t *pool, - rspamd_shingles_filter filter, - gpointer filterd, - enum rspamd_shingle_alg alg); +struct rspamd_shingle *rspamd_shingles_from_image (guchar *dct, + const guchar key[16], + rspamd_mempool_t *pool, + rspamd_shingles_filter filter, + gpointer filterd, + enum rspamd_shingle_alg alg); /** * Compares two shingles and return result as a floating point value - 1.0 @@ -82,12 +86,16 @@ struct rspamd_shingle* rspamd_shingles_from_image (guchar *dct, * @return */ gdouble rspamd_shingles_compare (const struct rspamd_shingle *a, - const struct rspamd_shingle *b); + const struct rspamd_shingle *b); /** * Default filtering function */ guint64 rspamd_shingles_default_filter (guint64 *input, gsize count, - gint shno, const guchar *key, gpointer ud); + gint shno, const guchar *key, gpointer ud); + +#ifdef __cplusplus +} +#endif #endif /* SHINGLES_H_ */ diff --git a/src/libutil/sqlite_utils.h b/src/libutil/sqlite_utils.h index 78ee26fc6..53f13747c 100644 --- a/src/libutil/sqlite_utils.h +++ b/src/libutil/sqlite_utils.h @@ -22,6 +22,10 @@ #define RSPAMD_SQLITE3_STMT_MULTIPLE (1 << 0) +#ifdef __cplusplus +extern "C" { +#endif + struct rspamd_sqlite3_prstmt { gint idx; const gchar *sql; @@ -39,10 +43,10 @@ struct rspamd_sqlite3_prstmt { * @param err * @return new prepared statements array or NULL */ -GArray* rspamd_sqlite3_init_prstmt (sqlite3 *db, - struct rspamd_sqlite3_prstmt *init_stmt, - gint max_idx, - GError **err); +GArray *rspamd_sqlite3_init_prstmt (sqlite3 *db, + struct rspamd_sqlite3_prstmt *init_stmt, + gint max_idx, + GError **err); /** * Run prepared statements by its index getting parameters and setting results from @@ -53,7 +57,7 @@ GArray* rspamd_sqlite3_init_prstmt (sqlite3 *db, * @return */ gint rspamd_sqlite3_run_prstmt (rspamd_mempool_t *pool, sqlite3 *db, GArray *stmts, - gint idx, ...); + gint idx, ...); /** * Close and free prepared statements @@ -68,8 +72,9 @@ void rspamd_sqlite3_close_prstmt (sqlite3 *db, GArray *stmts); * @param create_sql * @return */ -sqlite3 * rspamd_sqlite3_open_or_create (rspamd_mempool_t *pool, const gchar *path, const - gchar *create_sql, guint32 version, GError **err); +sqlite3 *rspamd_sqlite3_open_or_create (rspamd_mempool_t *pool, + const gchar *path, const gchar *create_sql, + guint32 version, GError **err); /** @@ -78,4 +83,8 @@ sqlite3 * rspamd_sqlite3_open_or_create (rspamd_mempool_t *pool, const gchar *pa */ gboolean rspamd_sqlite3_sync (sqlite3 *db, gint *wal_frames, gint *wal_checkpoints); +#ifdef __cplusplus +} +#endif + #endif /* SRC_LIBUTIL_SQLITE_UTILS_H_ */ diff --git a/src/libutil/ssl_util.h b/src/libutil/ssl_util.h index f7f1652de..75436f2cc 100644 --- a/src/libutil/ssl_util.h +++ b/src/libutil/ssl_util.h @@ -20,18 +20,23 @@ #include "libutil/addr.h" #include "libutil/libev_helper.h" +#ifdef __cplusplus +extern "C" { +#endif + struct rspamd_ssl_connection; -typedef void (*rspamd_ssl_handler_t)(gint fd, short what, gpointer d); -typedef void (*rspamd_ssl_error_handler_t)(gpointer d, GError *err); +typedef void (*rspamd_ssl_handler_t) (gint fd, short what, gpointer d); + +typedef void (*rspamd_ssl_error_handler_t) (gpointer d, GError *err); /** * Creates a new ssl connection data structure * @param ssl_ctx initialized SSL_CTX structure * @return opaque connection data */ -struct rspamd_ssl_connection * rspamd_ssl_connection_new (gpointer ssl_ctx, - struct ev_loop *ev_base, gboolean verify_peer); +struct rspamd_ssl_connection *rspamd_ssl_connection_new (gpointer ssl_ctx, + struct ev_loop *ev_base, gboolean verify_peer); /** * Connects SSL session using the specified (connected) FD @@ -45,9 +50,9 @@ struct rspamd_ssl_connection * rspamd_ssl_connection_new (gpointer ssl_ctx, * @return TRUE if a session has been connected */ gboolean rspamd_ssl_connect_fd (struct rspamd_ssl_connection *conn, gint fd, - const gchar *hostname, struct rspamd_io_ev *ev, ev_tstamp timeout, - rspamd_ssl_handler_t handler, rspamd_ssl_error_handler_t err_handler, - gpointer handler_data); + const gchar *hostname, struct rspamd_io_ev *ev, ev_tstamp timeout, + rspamd_ssl_handler_t handler, rspamd_ssl_error_handler_t err_handler, + gpointer handler_data); /** * Perform async read from SSL socket @@ -57,7 +62,7 @@ gboolean rspamd_ssl_connect_fd (struct rspamd_ssl_connection *conn, gint fd, * @return */ gssize rspamd_ssl_read (struct rspamd_ssl_connection *conn, gpointer buf, - gsize buflen); + gsize buflen); /** * Perform async write to ssl buffer @@ -69,7 +74,7 @@ gssize rspamd_ssl_read (struct rspamd_ssl_connection *conn, gpointer buf, * @return */ gssize rspamd_ssl_write (struct rspamd_ssl_connection *conn, gconstpointer buf, - gsize buflen); + gsize buflen); /** * Emulate writev by copying iovec to a temporary buffer @@ -79,7 +84,7 @@ gssize rspamd_ssl_write (struct rspamd_ssl_connection *conn, gconstpointer buf, * @return */ gssize rspamd_ssl_writev (struct rspamd_ssl_connection *conn, struct iovec *iov, - gsize iovlen); + gsize iovlen); /** * Removes connection data @@ -87,4 +92,8 @@ gssize rspamd_ssl_writev (struct rspamd_ssl_connection *conn, struct iovec *iov, */ void rspamd_ssl_connection_free (struct rspamd_ssl_connection *conn); +#ifdef __cplusplus +} +#endif + #endif /* SRC_LIBUTIL_SSL_UTIL_H_ */ diff --git a/src/libutil/str_util.h b/src/libutil/str_util.h index 6fbb11ccf..c820bd10c 100644 --- a/src/libutil/str_util.h +++ b/src/libutil/str_util.h @@ -20,6 +20,9 @@ #include "ucl.h" #include "fstring.h" +#ifdef __cplusplus +extern "C" { +#endif enum rspamd_newlines_type { RSPAMD_TASK_NEWLINES_CR, @@ -37,6 +40,7 @@ gint rspamd_lc_cmp (const gchar *s, const gchar *d, gsize l); * Convert string to lowercase in-place using ASCII conversion */ void rspamd_str_lc (gchar *str, guint size); + /** * Convert string to lowercase in-place using utf (limited) conversion */ @@ -46,13 +50,16 @@ void rspamd_str_lc_utf8 (gchar *str, guint size); * Hash table utility functions for case insensitive hashing */ guint64 rspamd_icase_hash (const gchar *in, gsize len, guint64 seed); + guint rspamd_strcase_hash (gconstpointer key); + gboolean rspamd_strcase_equal (gconstpointer v, gconstpointer v2); /* * Hash table utility functions for case sensitive hashing */ guint rspamd_str_hash (gconstpointer key); + gboolean rspamd_str_equal (gconstpointer v, gconstpointer v2); @@ -60,10 +67,15 @@ gboolean rspamd_str_equal (gconstpointer v, gconstpointer v2); * Hash table utility functions for hashing fixed strings */ guint rspamd_ftok_icase_hash (gconstpointer key); + gboolean rspamd_ftok_icase_equal (gconstpointer v, gconstpointer v2); + guint rspamd_ftok_hash (gconstpointer key); + gboolean rspamd_ftok_equal (gconstpointer v, gconstpointer v2); + guint rspamd_gstring_icase_hash (gconstpointer key); + gboolean rspamd_gstring_icase_equal (gconstpointer v, gconstpointer v2); /** @@ -77,6 +89,7 @@ gboolean rspamd_gstring_icase_equal (gconstpointer v, gconstpointer v2); * @return bytes copied */ gsize rspamd_strlcpy_fast (gchar *dst, const gchar *src, gsize siz); + gsize rspamd_strlcpy_safe (gchar *dst, const gchar *src, gsize siz); #if defined(__has_feature) @@ -133,7 +146,7 @@ gpointer rspamd_str_pool_copy (gconstpointer data, gpointer ud); * @param inlen input length * @return freshly allocated base32 encoding of a specified string */ -gchar * rspamd_encode_base32 (const guchar *in, gsize inlen); +gchar *rspamd_encode_base32 (const guchar *in, gsize inlen); /** * Decode string using base32 encoding @@ -141,7 +154,7 @@ gchar * rspamd_encode_base32 (const guchar *in, gsize inlen); * @param inlen input length * @return freshly allocated base32 decoded value or NULL if input is invalid */ -guchar* rspamd_decode_base32 (const gchar *in, gsize inlen, gsize *outlen); +guchar *rspamd_decode_base32 (const gchar *in, gsize inlen, gsize *outlen); /** * Encode string using hex encoding @@ -149,7 +162,7 @@ guchar* rspamd_decode_base32 (const gchar *in, gsize inlen, gsize *outlen); * @param inlen input length * @return freshly allocated base32 encoding of a specified string */ -gchar * rspamd_encode_hex (const guchar *in, gsize inlen); +gchar *rspamd_encode_hex (const guchar *in, gsize inlen); /** * Decode string using hex encoding @@ -157,7 +170,7 @@ gchar * rspamd_encode_hex (const guchar *in, gsize inlen); * @param inlen input length * @return freshly allocated base32 decoded value or NULL if input is invalid */ -guchar* rspamd_decode_hex (const gchar *in, gsize inlen); +guchar *rspamd_decode_hex (const gchar *in, gsize inlen); /** * Encode string using base32 encoding @@ -168,7 +181,7 @@ guchar* rspamd_decode_hex (const gchar *in, gsize inlen); * @return encoded len if `outlen` is enough to encode `inlen` */ gint rspamd_encode_base32_buf (const guchar *in, gsize inlen, gchar *out, - gsize outlen); + gsize outlen); /** * Decode string using base32 encoding @@ -179,7 +192,7 @@ gint rspamd_encode_base32_buf (const guchar *in, gsize inlen, gchar *out, * @return decoded len if in is valid base32 and `outlen` is enough to encode `inlen` */ gint rspamd_decode_base32_buf (const gchar *in, gsize inlen, - guchar *out, gsize outlen); + guchar *out, gsize outlen); /** * Encode string using hex encoding @@ -190,7 +203,7 @@ gint rspamd_decode_base32_buf (const gchar *in, gsize inlen, * @return encoded len if `outlen` is enough to encode `inlen` */ gint rspamd_encode_hex_buf (const guchar *in, gsize inlen, gchar *out, - gsize outlen); + gsize outlen); /** @@ -202,7 +215,7 @@ gint rspamd_encode_hex_buf (const guchar *in, gsize inlen, gchar *out, * @return decoded len if in is valid hex and `outlen` is enough to encode `inlen` */ gssize rspamd_decode_hex_buf (const gchar *in, gsize inlen, - guchar *out, gsize outlen); + guchar *out, gsize outlen); /** * Common version of base64 encoder @@ -221,6 +234,7 @@ rspamd_encode_base64_common (const guchar *in, gsize *outlen, gboolean fold, enum rspamd_newlines_type how); + /** * Encode string using base64 encoding * @param in input @@ -228,8 +242,8 @@ rspamd_encode_base64_common (const guchar *in, * @param str_len maximum string length (if <= 0 then no lines are split) * @return freshly allocated base64 encoded value or NULL if input is invalid */ -gchar * rspamd_encode_base64 (const guchar *in, gsize inlen, gint str_len, - gsize *outlen); +gchar *rspamd_encode_base64 (const guchar *in, gsize inlen, gint str_len, + gsize *outlen); /** * Encode and fold string using base64 encoding @@ -238,8 +252,8 @@ gchar * rspamd_encode_base64 (const guchar *in, gsize inlen, gint str_len, * @param str_len maximum string length (if <= 0 then no lines are split) * @return freshly allocated base64 encoded value or NULL if input is invalid */ -gchar * rspamd_encode_base64_fold (const guchar *in, gsize inlen, gint str_len, - gsize *outlen, enum rspamd_newlines_type how); +gchar *rspamd_encode_base64_fold (const guchar *in, gsize inlen, gint str_len, + gsize *outlen, enum rspamd_newlines_type how); /** * Encode and fold string using quoted printable encoding @@ -248,8 +262,8 @@ gchar * rspamd_encode_base64_fold (const guchar *in, gsize inlen, gint str_len, * @param str_len maximum string length (if <= 0 then no lines are split) * @return freshly allocated base64 encoded value or NULL if input is invalid */ -gchar * rspamd_encode_qp_fold (const guchar *in, gsize inlen, gint str_len, - gsize *outlen, enum rspamd_newlines_type how); +gchar *rspamd_encode_qp_fold (const guchar *in, gsize inlen, gint str_len, + gsize *outlen, enum rspamd_newlines_type how); /** * Decode quoted-printable encoded buffer, input and output must not overlap @@ -260,7 +274,7 @@ gchar * rspamd_encode_qp_fold (const guchar *in, gsize inlen, gint str_len, * @return real size of decoded output or (-1) if outlen is not enough */ gssize rspamd_decode_qp_buf (const gchar *in, gsize inlen, - gchar *out, gsize outlen); + gchar *out, gsize outlen); /** * Decode quoted-printable encoded buffer using rfc2047 format, input and output must not overlap @@ -271,7 +285,7 @@ gssize rspamd_decode_qp_buf (const gchar *in, gsize inlen, * @return real size of decoded output or (-1) if outlen is not enough */ gssize rspamd_decode_qp2047_buf (const gchar *in, gsize inlen, - gchar *out, gsize outlen); + gchar *out, gsize outlen); /** * Encode quoted-printable buffer using rfc2047 format, input and output must not overlap @@ -282,7 +296,7 @@ gssize rspamd_decode_qp2047_buf (const gchar *in, gsize inlen, * @return */ gssize rspamd_encode_qp2047_buf (const gchar *in, gsize inlen, - gchar *out, gsize outlen); + gchar *out, gsize outlen); #ifndef g_tolower # define g_tolower(x) (((x) >= 'A' && (x) <= 'Z') ? (x) - 'A' + 'a' : (x)) @@ -297,7 +311,7 @@ gssize rspamd_encode_qp2047_buf (const gchar *in, gsize inlen, * @return */ gint rspamd_strings_levenshtein_distance (const gchar *s1, gsize s1len, - const gchar *s2, gsize s2len, guint replace_cost); + const gchar *s2, gsize s2len, guint replace_cost); /** * Fold header using rfc822 rules, return new GString from the previous one @@ -309,10 +323,10 @@ gint rspamd_strings_levenshtein_distance (const gchar *s1, gsize s1len, * @return new GString with the folded value */ GString *rspamd_header_value_fold (const gchar *name, - const gchar *value, - guint fold_max, - enum rspamd_newlines_type how, - const gchar *fold_on_chars); + const gchar *value, + guint fold_max, + enum rspamd_newlines_type how, + const gchar *fold_on_chars); /** * Search for a substring `srch` in the text `in` using Apostolico-Crochemore algorithm @@ -324,7 +338,7 @@ GString *rspamd_header_value_fold (const gchar *name, * @return position of the first substring match or (-1) if not found */ goffset rspamd_substring_search (const gchar *in, gsize inlen, - const gchar *srch, gsize srchlen); + const gchar *srch, gsize srchlen); /** * Search for a substring `srch` in the text `in` using Apostolico-Crochemore algorithm in caseless matter (ASCII only) @@ -336,7 +350,7 @@ goffset rspamd_substring_search (const gchar *in, gsize inlen, * @return position of the first substring match or (-1) if not found */ goffset rspamd_substring_search_caseless (const gchar *in, gsize inlen, - const gchar *srch, gsize srchlen); + const gchar *srch, gsize srchlen); /** * Search for end-of-headers mark in the input string. Returns position just after @@ -348,7 +362,8 @@ goffset rspamd_string_find_eoh (GString *input, goffset *body_start); #define rspamd_ucl_emit_gstring(o, t, target) \ - rspamd_ucl_emit_gstring_comments((o), (t), (target), NULL) + rspamd_ucl_emit_gstring_comments((o), (t), (target), NULL) + /** * Emit UCL object to gstring * @param obj object to emit @@ -357,12 +372,13 @@ goffset rspamd_string_find_eoh (GString *input, goffset *body_start); * @param target target string */ void rspamd_ucl_emit_gstring_comments (const ucl_object_t *obj, - enum ucl_emitter emit_type, - GString *target, - const ucl_object_t *comments); + enum ucl_emitter emit_type, + GString *target, + const ucl_object_t *comments); #define rspamd_ucl_emit_fstring(o, t, target) \ - rspamd_ucl_emit_fstring_comments((o), (t), (target), NULL) + rspamd_ucl_emit_fstring_comments((o), (t), (target), NULL) + /** * Emit UCL object to fstring * @param obj object to emit @@ -371,9 +387,9 @@ void rspamd_ucl_emit_gstring_comments (const ucl_object_t *obj, * @param target target string */ void rspamd_ucl_emit_fstring_comments (const ucl_object_t *obj, - enum ucl_emitter emit_type, - rspamd_fstring_t **target, - const ucl_object_t *comments); + enum ucl_emitter emit_type, + rspamd_fstring_t **target, + const ucl_object_t *comments); extern const guchar lc_map[256]; @@ -405,27 +421,26 @@ gsize rspamd_memcspn (const gchar *s, const gchar *e, gsize len); gsize rspamd_memspn (const gchar *s, const gchar *e, gsize len); /* https://graphics.stanford.edu/~seander/bithacks.html#HasMoreInWord */ -#define rspamd_str_hasmore(x,n) ((((x)+~0UL/255*(127-(n)))|(x))&~0UL/255*128) +#define rspamd_str_hasmore(x, n) ((((x)+~0UL/255*(127-(n)))|(x))&~0UL/255*128) static inline gboolean -rspamd_str_has_8bit (const guchar *beg, gsize len) -{ +rspamd_str_has_8bit (const guchar *beg, gsize len) { unsigned long *w; gsize i, leftover = len % sizeof (*w); - w = (unsigned long *)beg; + w = (unsigned long *) beg; - for (i = 0; i < len / sizeof (*w); i ++) { + for (i = 0; i < len / sizeof (*w); i++) { if (rspamd_str_hasmore (*w, 127)) { return TRUE; } - w ++; + w++; } - beg = (const guchar *)w; + beg = (const guchar *) w; - for (i = 0; i < leftover; i ++) { + for (i = 0; i < leftover; i++) { if (beg[i] > 127) { return TRUE; } @@ -435,9 +450,11 @@ rspamd_str_has_8bit (const guchar *beg, gsize len) } struct UConverter; + struct UConverter *rspamd_get_utf8_converter (void); struct UNormalizer2; + const struct UNormalizer2 *rspamd_get_unicode_normalizer (void); enum rspamd_normalise_result { @@ -456,7 +473,7 @@ enum rspamd_normalise_result { * @return TRUE if a string has been normalised */ enum rspamd_normalise_result rspamd_normalise_unicode_inplace (rspamd_mempool_t *pool, - gchar *start, guint *len); + gchar *start, guint *len); enum rspamd_regexp_escape_flags { RSPAMD_REGEXP_ESCAPE_ASCII = 0, @@ -464,6 +481,7 @@ enum rspamd_regexp_escape_flags { RSPAMD_REGEXP_ESCAPE_GLOB = 1u << 1, RSPAMD_REGEXP_ESCAPE_RE = 1u << 2, }; + /** * Escapes special characters when reading plain data to be processed in pcre * @param pattern pattern to process @@ -474,7 +492,7 @@ enum rspamd_regexp_escape_flags { */ gchar * rspamd_str_regexp_escape (const gchar *pattern, gsize slen, - gsize *dst_len, enum rspamd_regexp_escape_flags flags); + gsize *dst_len, enum rspamd_regexp_escape_flags flags); /** * Returns copy of src (zero terminated) where all unicode is made valid or replaced @@ -484,7 +502,7 @@ rspamd_str_regexp_escape (const gchar *pattern, gsize slen, * @param dstelen * @return */ -gchar * rspamd_str_make_utf_valid (const guchar *src, gsize slen, gsize *dstlen); +gchar *rspamd_str_make_utf_valid (const guchar *src, gsize slen, gsize *dstlen); /** * Strips characters in `strip_chars` from start and end of the GString @@ -498,19 +516,23 @@ gsize rspamd_gstring_strip (GString *s, const gchar *strip_chars); * @param s * @param strip_chars */ -const gchar* rspamd_string_len_strip (const gchar *in, - gsize *len, const gchar *strip_chars); +const gchar *rspamd_string_len_strip (const gchar *in, + gsize *len, const gchar *strip_chars); #define IS_ZERO_WIDTH_SPACE(uc) ((uc) == 0x200B || \ - (uc) == 0x200C || \ - (uc) == 0x200D || \ - (uc) == 0xFEFF) + (uc) == 0x200C || \ + (uc) == 0x200D || \ + (uc) == 0xFEFF) #define IS_OBSCURED_CHAR(uc) (((uc) >= 0x200B && (uc) <= 0x200F) || \ - ((uc) >= 0x2028 && (uc) <= 0x202F) || \ - ((uc) >= 0x205F && (uc) <= 0x206F) || \ - (uc) == 0xFEFF) + ((uc) >= 0x2028 && (uc) <= 0x202F) || \ + ((uc) >= 0x205F && (uc) <= 0x206F) || \ + (uc) == 0xFEFF) #define RSPAMD_LEN_CHECK_STARTS_WITH(s, len, lit) \ - ((len) >= sizeof(lit) - 1 && g_ascii_strncasecmp ((s), (lit), sizeof(lit) - 1) == 0) + ((len) >= sizeof(lit) - 1 && g_ascii_strncasecmp ((s), (lit), sizeof(lit) - 1) == 0) + +#ifdef __cplusplus +} +#endif #endif /* SRC_LIBUTIL_STR_UTIL_H_ */ diff --git a/src/libutil/upstream.h b/src/libutil/upstream.h index 89ac0ee9e..04ec6d984 100644 --- a/src/libutil/upstream.h +++ b/src/libutil/upstream.h @@ -6,6 +6,10 @@ #include "rdns.h" #include "ucl.h" +#ifdef __cplusplus +extern "C" { +#endif + enum rspamd_upstream_rotation { RSPAMD_UPSTREAM_RANDOM = 0, RSPAMD_UPSTREAM_HASHED, @@ -29,7 +33,7 @@ struct upstream_ctx; * Init upstreams library * @param resolver */ -struct upstream_ctx* rspamd_upstreams_library_init (void); +struct upstream_ctx *rspamd_upstreams_library_init (void); /** * Remove reference from upstreams library @@ -41,8 +45,8 @@ void rspamd_upstreams_library_unref (struct upstream_ctx *ctx); * @param cfg */ void rspamd_upstreams_library_config (struct rspamd_config *cfg, - struct upstream_ctx *ctx, struct ev_loop *event_loop, - struct rdns_resolver *resolver); + struct upstream_ctx *ctx, struct ev_loop *event_loop, + struct rdns_resolver *resolver); /** * Upstream error logic @@ -72,7 +76,7 @@ void rspamd_upstream_set_weight (struct upstream *up, guint weight); * Create new list of upstreams * @return */ -struct upstream_list* rspamd_upstreams_create (struct upstream_ctx *ctx); +struct upstream_list *rspamd_upstreams_create (struct upstream_ctx *ctx); /** * Sets specific flag to the upstream list @@ -80,7 +84,7 @@ struct upstream_list* rspamd_upstreams_create (struct upstream_ctx *ctx); * @param flags */ void rspamd_upstreams_set_flags (struct upstream_list *ups, - enum rspamd_upstream_flag flags); + enum rspamd_upstream_flag flags); /** * Sets custom limits for upstreams @@ -106,7 +110,7 @@ void rspamd_upstreams_set_limits (struct upstream_list *ups, * @param rot */ void rspamd_upstreams_set_rotation (struct upstream_list *ups, - enum rspamd_upstream_rotation rot); + enum rspamd_upstream_rotation rot); /** * Destroy list of upstreams @@ -142,8 +146,8 @@ enum rspamd_upstream_parse_type { * @return TRUE if upstream has been added */ gboolean rspamd_upstreams_add_upstream (struct upstream_list *ups, const gchar *str, - guint16 def_port, enum rspamd_upstream_parse_type parse_type, - void *data); + guint16 def_port, enum rspamd_upstream_parse_type parse_type, + void *data); /** * Add multiple upstreams from comma, semicolon or space separated line @@ -154,13 +158,14 @@ gboolean rspamd_upstreams_add_upstream (struct upstream_list *ups, const gchar * * @return TRUE if **any** of upstreams has been added */ gboolean rspamd_upstreams_parse_line (struct upstream_list *ups, - const gchar *str, guint16 def_port, void *data); + const gchar *str, guint16 def_port, void *data); gboolean rspamd_upstreams_parse_line_len (struct upstream_list *ups, const gchar *str, gsize len, guint16 def_port, void *data); + /** * Parse upstreams list from the UCL object * @param ups @@ -170,11 +175,11 @@ gboolean rspamd_upstreams_parse_line_len (struct upstream_list *ups, * @return */ gboolean rspamd_upstreams_from_ucl (struct upstream_list *ups, - const ucl_object_t *in, guint16 def_port, void *data); + const ucl_object_t *in, guint16 def_port, void *data); typedef void (*rspamd_upstream_traverse_func) (struct upstream *up, guint idx, - void *ud); + void *ud); /** * Traverse upstreams list calling the function specified @@ -183,7 +188,7 @@ typedef void (*rspamd_upstream_traverse_func) (struct upstream *up, guint idx, * @param ud */ void rspamd_upstreams_foreach (struct upstream_list *ups, - rspamd_upstream_traverse_func cb, void *ud); + rspamd_upstream_traverse_func cb, void *ud); enum rspamd_upstreams_watch_event { RSPAMD_UPSTREAM_WATCH_SUCCESS = 1u << 0, @@ -216,14 +221,14 @@ void rspamd_upstreams_add_watch_callback (struct upstream_list *ups, * @param up * @return */ -rspamd_inet_addr_t* rspamd_upstream_addr_next (struct upstream *up); +rspamd_inet_addr_t *rspamd_upstream_addr_next (struct upstream *up); /** * Returns the current IP address of the upstream * @param up * @return */ -rspamd_inet_addr_t* rspamd_upstream_addr_cur (const struct upstream *up); +rspamd_inet_addr_t *rspamd_upstream_addr_cur (const struct upstream *up); /** * Add custom address for an upstream (ownership of addr is transferred to upstream) @@ -231,14 +236,14 @@ rspamd_inet_addr_t* rspamd_upstream_addr_cur (const struct upstream *up); * @return */ gboolean rspamd_upstream_add_addr (struct upstream *up, - rspamd_inet_addr_t *addr); + rspamd_inet_addr_t *addr); /** * Returns the symbolic name of the upstream * @param up * @return */ -const gchar* rspamd_upstream_name (struct upstream *up); +const gchar *rspamd_upstream_name (struct upstream *up); /** * Sets opaque user data associated with this upstream @@ -261,9 +266,9 @@ gpointer rspamd_upstream_get_data (struct upstream *up); * @param type type of rotation algorithm, for `RSPAMD_UPSTREAM_HASHED` it is required to specify `key` and `keylen` as arguments * @return */ -struct upstream* rspamd_upstream_get (struct upstream_list *ups, - enum rspamd_upstream_rotation default_type, - const guchar *key, gsize keylen); +struct upstream *rspamd_upstream_get (struct upstream_list *ups, + enum rspamd_upstream_rotation default_type, + const guchar *key, gsize keylen); /** * Get new upstream from the list @@ -271,16 +276,17 @@ struct upstream* rspamd_upstream_get (struct upstream_list *ups, * @param type type of rotation algorithm, for `RSPAMD_UPSTREAM_HASHED` it is required to specify `key` and `keylen` as arguments * @return */ -struct upstream* rspamd_upstream_get_forced (struct upstream_list *ups, - enum rspamd_upstream_rotation forced_type, - const guchar *key, gsize keylen); +struct upstream *rspamd_upstream_get_forced (struct upstream_list *ups, + enum rspamd_upstream_rotation forced_type, + const guchar *key, gsize keylen); /** * Re-resolve addresses for all upstreams registered */ void rspamd_upstream_reresolve (struct upstream_ctx *ctx); +#ifdef __cplusplus +} +#endif + #endif /* UPSTREAM_H */ -/* - * vi:ts=4 - */ diff --git a/src/libutil/util.h b/src/libutil/util.h index 7f13ded06..7c9eb5f91 100644 --- a/src/libutil/util.h +++ b/src/libutil/util.h @@ -15,6 +15,10 @@ #include "contrib/libev/ev.h" #include <time.h> +#ifdef __cplusplus +extern "C" { +#endif + struct rspamd_config; struct rspamd_main; struct workq; @@ -28,10 +32,12 @@ struct workq; * @return socket FD or -1 in case of error */ gint rspamd_socket_create (gint af, gint type, gint protocol, gboolean async); + /* * Create socket and bind or connect it to specified address and port */ gint rspamd_socket_tcp (struct addrinfo *, gboolean is_server, gboolean async); + /* * Create socket and bind or connect it to specified address and port */ @@ -41,10 +47,10 @@ gint rspamd_socket_udp (struct addrinfo *, gboolean is_server, gboolean async); * Create and bind or connect unix socket */ gint rspamd_socket_unix (const gchar *, - struct sockaddr_un *, - gint type, - gboolean is_server, - gboolean async); + struct sockaddr_un *, + gint type, + gboolean is_server, + gboolean async); /** * Make a universal socket @@ -56,7 +62,7 @@ gint rspamd_socket_unix (const gchar *, * @param try_resolve try name resolution for a socket (BLOCKING) */ gint rspamd_socket (const gchar *credits, guint16 port, gint type, - gboolean async, gboolean is_server, gboolean try_resolve); + gboolean async, gboolean is_server, gboolean try_resolve); /** * Make a universal sockets @@ -67,12 +73,13 @@ gint rspamd_socket (const gchar *credits, guint16 port, gint type, * @param is_server make this socket as server socket * @param try_resolve try name resolution for a socket (BLOCKING) */ -GList * rspamd_sockets_list (const gchar *credits, - guint16 port, - gint type, - gboolean async, - gboolean is_server, - gboolean try_resolve); +GList *rspamd_sockets_list (const gchar *credits, + guint16 port, + gint type, + gboolean async, + gboolean is_server, + gboolean try_resolve); + /* * Create socketpair */ @@ -87,6 +94,7 @@ gint rspamd_write_pid (struct rspamd_main *); * Make specified socket non-blocking */ gint rspamd_socket_nonblocking (gint); + /* * Make specified socket blocking */ @@ -101,9 +109,11 @@ gint rspamd_socket_poll (gint fd, gint timeout, short events); * Init signals */ #ifdef HAVE_SA_SIGINFO -void rspamd_signals_init (struct sigaction *sa, void (*sig_handler)(gint, - siginfo_t *, - void *)); + +void rspamd_signals_init (struct sigaction *sa, void (*sig_handler) (gint, + siginfo_t *, + void *)); + #else void rspamd_signals_init (struct sigaction *sa, void (*sig_handler)(gint)); #endif @@ -111,14 +121,17 @@ void rspamd_signals_init (struct sigaction *sa, void (*sig_handler)(gint)); /* * Send specified signal to each worker */ -void rspamd_pass_signal (GHashTable *, gint ); +void rspamd_pass_signal (GHashTable *, gint); #ifndef HAVE_SETPROCTITLE + /* * Process title utility functions */ gint init_title (struct rspamd_main *, gint argc, gchar *argv[], gchar *envp[]); + gint setproctitle (const gchar *fmt, ...); + #endif #ifndef HAVE_PIDFILE @@ -137,12 +150,17 @@ typedef struct rspamd_pidfh_s { dev_t pf_dev; ino_t pf_ino; } rspamd_pidfh_t; -rspamd_pidfh_t * rspamd_pidfile_open (const gchar *path, - mode_t mode, - pid_t *pidptr); + +rspamd_pidfh_t *rspamd_pidfile_open (const gchar *path, + mode_t mode, + pid_t *pidptr); + gint rspamd_pidfile_write (rspamd_pidfh_t *pfh); + gint rspamd_pidfile_close (rspamd_pidfh_t *pfh); + gint rspamd_pidfile_remove (rspamd_pidfh_t *pfh); + #else typedef struct pidfh rspamd_pidfh_t; #define rspamd_pidfile_open pidfile_open @@ -154,10 +172,10 @@ typedef struct pidfh rspamd_pidfh_t; /* * Replace %r with rcpt value and %f with from value, new string is allocated in pool */ -gchar * resolve_stat_filename (rspamd_mempool_t *pool, - gchar *pattern, - gchar *rcpt, - gchar *from); +gchar *resolve_stat_filename (rspamd_mempool_t *pool, + gchar *pattern, + gchar *rcpt, + gchar *from); const gchar * rspamd_log_check_time (gdouble start, gdouble end, gint resolution); @@ -166,12 +184,14 @@ rspamd_log_check_time (gdouble start, gdouble end, gint resolution); * File locking functions */ gboolean rspamd_file_lock (gint fd, gboolean async); + gboolean rspamd_file_unlock (gint fd, gboolean async); /* * Google perf-tools initialization function */ void gperf_profiler_init (struct rspamd_config *cfg, const gchar *descr); + void gperf_profiler_stop (void); /* @@ -203,18 +223,18 @@ const gchar *g_environ_getenv (gchar **envp, const gchar *variable); * Convert milliseconds to timeval fields */ #define msec_to_tv(msec, tv) do { (tv)->tv_sec = (msec) / 1000; (tv)->tv_usec = \ - ((msec) - (tv)->tv_sec * 1000) * 1000; \ + ((msec) - (tv)->tv_sec * 1000) * 1000; \ } while (0) #define double_to_tv(dbl, tv) do { (tv)->tv_sec = (int)(dbl); (tv)->tv_usec = \ - ((dbl) - (int)(dbl)) * 1000 * 1000; \ + ((dbl) - (int)(dbl)) * 1000 * 1000; \ } while (0) #define double_to_ts(dbl, ts) do { (ts)->tv_sec = (int)(dbl); (ts)->tv_nsec = \ ((dbl) - (int)(dbl)) * 1e9; \ } while (0) #define tv_to_msec(tv) ((tv)->tv_sec * 1000LLU + (tv)->tv_usec / 1000LLU) #define tv_to_double(tv) ((double)(tv)->tv_sec + (tv)->tv_usec / 1.0e6) -#define ts_to_usec(ts) ((ts)->tv_sec * 1000000LLU + \ - (ts)->tv_nsec / 1000LLU) +#define ts_to_usec(ts) ((ts)->tv_sec * 1000000LLU + \ + (ts)->tv_nsec / 1000LLU) #define ts_to_double(tv) ((double)(tv)->tv_sec + (tv)->tv_nsec / 1.0e9) /** @@ -242,7 +262,7 @@ typedef struct rspamd_mutex_s { * Create new mutex * @return mutex or NULL */ -rspamd_mutex_t * rspamd_mutex_new (void); +rspamd_mutex_t *rspamd_mutex_new (void); /** * Lock mutex @@ -271,9 +291,9 @@ void rspamd_mutex_free (rspamd_mutex_t *mtx); * @param ud user data for copy functions */ void rspamd_hash_table_copy (GHashTable *src, GHashTable *dst, - gpointer (*key_copy_func)(gconstpointer data, gpointer ud), - gpointer (*value_copy_func)(gconstpointer data, gpointer ud), - gpointer ud); + gpointer (*key_copy_func) (gconstpointer data, gpointer ud), + gpointer (*value_copy_func) (gconstpointer data, gpointer ud), + gpointer ud); /** @@ -315,6 +335,7 @@ void rspamd_ptr_array_free_hard (gpointer p); * @param p */ void rspamd_array_free_hard (gpointer p); + /** * Special utility to help GString freeing in rspamd_mempool * @param p @@ -334,25 +355,28 @@ void rspamd_gerror_free_maybe (gpointer p); void rspamd_gstring_free_soft (gpointer p); struct rspamd_external_libs_ctx; + /** * Initialize rspamd libraries */ -struct rspamd_external_libs_ctx* rspamd_init_libs (void); +struct rspamd_external_libs_ctx *rspamd_init_libs (void); gpointer rspamd_init_ssl_ctx (void); + gpointer rspamd_init_ssl_ctx_noverify (void); /** * Configure libraries */ void rspamd_config_libs (struct rspamd_external_libs_ctx *ctx, - struct rspamd_config *cfg); + struct rspamd_config *cfg); /** * Reset and initialize decompressor * @param ctx */ gboolean rspamd_libs_reset_decompression (struct rspamd_external_libs_ctx *ctx); + /** * Reset and initialize compressor * @param ctx @@ -421,7 +445,7 @@ gboolean rspamd_constant_memcmp (const void *a, const void *b, gsize len); * @return fd or -1 in case of error */ int rspamd_file_xopen (const char *fname, int oflags, guint mode, - gboolean allow_symlink); + gboolean allow_symlink); /** * Map file without following symlinks or special stuff @@ -431,7 +455,7 @@ int rspamd_file_xopen (const char *fname, int oflags, guint mode, * @return pointer to memory (should be freed using munmap) or NULL in case of error */ gpointer rspamd_file_xmap (const char *fname, guint mode, gsize *size, - gboolean allow_symlink); + gboolean allow_symlink); /** * Map named shared memory segment @@ -441,7 +465,7 @@ gpointer rspamd_file_xmap (const char *fname, guint mode, gsize *size, * @return pointer to memory (should be freed using munmap) or NULL in case of error */ gpointer rspamd_shmem_xmap (const char *fname, guint mode, - gsize *size); + gsize *size); /** * Normalize probabilities using polynomial function @@ -521,4 +545,8 @@ double rspamd_set_counter_ema (struct rspamd_counter_data *cd, double rspamd_set_counter (struct rspamd_counter_data *cd, gdouble value); +#ifdef __cplusplus +} +#endif + #endif diff --git a/src/lua/lua_common.h b/src/lua/lua_common.h index 93bb5a28e..d14ebba54 100644 --- a/src/lua/lua_common.h +++ b/src/lua/lua_common.h @@ -2,7 +2,6 @@ #define RSPAMD_LUA_H #include "config.h" -#ifdef WITH_LUA #include <lua.h> #include <lauxlib.h> @@ -48,6 +47,10 @@ luaL_register (lua_State *L, const gchar *name, const struct luaL_reg *methods) lua_State * L) #define LUA_INTERFACE_DEF(class, name) { # name, lua_ ## class ## _ ## name } +#ifdef __cplusplus +extern "C" { +#endif + extern const luaL_reg null_reg[]; #define RSPAMD_LUA_API_VERSION 12 @@ -126,17 +129,17 @@ struct rspamd_lua_cached_entry { * Create and register new class */ void rspamd_lua_new_class (lua_State *L, - const gchar *classname, - const struct luaL_reg *methods); + const gchar *classname, + const struct luaL_reg *methods); /** * Create and register new class with static methods */ void rspamd_lua_new_class_full (lua_State *L, - const gchar *classname, - const gchar *static_name, - const struct luaL_reg *methods, - const struct luaL_reg *func); + const gchar *classname, + const gchar *static_name, + const struct luaL_reg *methods, + const struct luaL_reg *func); /** * Set class name for object at @param objidx position @@ -151,7 +154,7 @@ void rspamd_lua_table_set (lua_State *L, const gchar *index, const gchar *value) /** * Get string value of index in a table (return t['index']) */ -const gchar * rspamd_lua_table_get (lua_State *L, const gchar *index); +const gchar *rspamd_lua_table_get (lua_State *L, const gchar *index); /** * Convert classname to string @@ -169,6 +172,7 @@ gpointer rspamd_lua_check_class (lua_State *L, gint index, const gchar *name); lua_State *rspamd_lua_init (bool wipe_mem); void rspamd_lua_start_gc (struct rspamd_config *cfg); + /** * Sets field in a global variable * @param L @@ -178,7 +182,8 @@ void rspamd_lua_start_gc (struct rspamd_config *cfg); */ void rspamd_plugins_table_push_elt (lua_State *L, const gchar *field_name, - const gchar *new_elt); + const gchar *new_elt); + /** * Load and initialize lua plugins */ @@ -188,7 +193,8 @@ rspamd_init_lua_filters (struct rspamd_config *cfg, gboolean force_load); /** * Initialize new locked lua_State structure */ -struct lua_locked_state * rspamd_init_lua_locked (struct rspamd_config *cfg); +struct lua_locked_state *rspamd_init_lua_locked (struct rspamd_config *cfg); + /** * Free locked state structure */ @@ -207,11 +213,11 @@ void rspamd_lua_task_push (lua_State *L, struct rspamd_task *task); /** * Return lua ip structure at the specified address */ -struct rspamd_lua_ip * lua_check_ip (lua_State * L, gint pos); +struct rspamd_lua_ip *lua_check_ip (lua_State *L, gint pos); -struct rspamd_lua_text * lua_check_text (lua_State * L, gint pos); +struct rspamd_lua_text *lua_check_text (lua_State *L, gint pos); -struct rspamd_lua_regexp *lua_check_regexp (lua_State * L, gint pos); +struct rspamd_lua_regexp *lua_check_regexp (lua_State *L, gint pos); enum rspamd_lua_task_header_type { RSPAMD_TASK_HEADER_PUSH_SIMPLE = 0, @@ -223,6 +229,7 @@ enum rspamd_lua_task_header_type { gint rspamd_lua_push_header (lua_State *L, struct rspamd_mime_header *h, enum rspamd_lua_task_header_type how); + /** * Push specific header to lua */ @@ -233,10 +240,11 @@ gint rspamd_lua_push_header_array (lua_State *L, /** * Check for task at the specified position */ -struct rspamd_task *lua_check_task (lua_State * L, gint pos); -struct rspamd_task *lua_check_task_maybe (lua_State * L, gint pos); +struct rspamd_task *lua_check_task (lua_State *L, gint pos); + +struct rspamd_task *lua_check_task_maybe (lua_State *L, gint pos); -struct rspamd_lua_map *lua_check_map (lua_State * L, gint pos); +struct rspamd_lua_map *lua_check_map (lua_State *L, gint pos); /** * Push ip address from a string (nil is pushed if a string cannot be converted) @@ -257,74 +265,114 @@ int rspamd_lua_typerror (lua_State *L, int narg, const char *tname); void rspamd_lua_add_preload (lua_State *L, const gchar *name, lua_CFunction func); void luaopen_task (lua_State *L); + void luaopen_config (lua_State *L); + void luaopen_map (lua_State *L); -void luaopen_trie (lua_State * L); + +void luaopen_trie (lua_State *L); + void luaopen_textpart (lua_State *L); + void luaopen_mimepart (lua_State *L); + void luaopen_image (lua_State *L); + void luaopen_url (lua_State *L); + void luaopen_classifier (lua_State *L); -void luaopen_statfile (lua_State * L); + +void luaopen_statfile (lua_State *L); + void luaopen_regexp (lua_State *L); + void luaopen_cdb (lua_State *L); -void luaopen_xmlrpc (lua_State * L); -void luaopen_http (lua_State * L); -void luaopen_redis (lua_State * L); -void luaopen_upstream (lua_State * L); -void luaopen_mempool (lua_State * L); -void luaopen_dns_resolver (lua_State * L); -void luaopen_rsa (lua_State * L); -void luaopen_ip (lua_State * L); -void luaopen_expression (lua_State * L); -void luaopen_logger (lua_State * L); + +void luaopen_xmlrpc (lua_State *L); + +void luaopen_http (lua_State *L); + +void luaopen_redis (lua_State *L); + +void luaopen_upstream (lua_State *L); + +void luaopen_mempool (lua_State *L); + +void luaopen_dns_resolver (lua_State *L); + +void luaopen_rsa (lua_State *L); + +void luaopen_ip (lua_State *L); + +void luaopen_expression (lua_State *L); + +void luaopen_logger (lua_State *L); + void luaopen_text (lua_State *L); -void luaopen_util (lua_State * L); -void luaopen_tcp (lua_State * L); -void luaopen_html (lua_State * L); + +void luaopen_util (lua_State *L); + +void luaopen_tcp (lua_State *L); + +void luaopen_html (lua_State *L); + void luaopen_sqlite3 (lua_State *L); + void luaopen_cryptobox (lua_State *L); + void luaopen_dns (lua_State *L); -void luaopen_udp (lua_State * L); -void luaopen_worker (lua_State * L); -void luaopen_kann (lua_State * L); + +void luaopen_udp (lua_State *L); + +void luaopen_worker (lua_State *L); + +void luaopen_kann (lua_State *L); void rspamd_lua_dostring (const gchar *line); double rspamd_lua_normalize (struct rspamd_config *cfg, - long double score, - void *params); + long double score, + void *params); /* Config file functions */ void rspamd_lua_post_load_config (struct rspamd_config *cfg); + gboolean rspamd_lua_handle_param (struct rspamd_task *task, - gchar *mname, - gchar *optname, - enum lua_var_type expected_type, - gpointer *res); + gchar *mname, + gchar *optname, + enum lua_var_type expected_type, + gpointer *res); + gboolean rspamd_lua_check_condition (struct rspamd_config *cfg, - const gchar *condition); + const gchar *condition); + void rspamd_lua_dumpstack (lua_State *L); /* Set lua path according to the configuration */ void rspamd_lua_set_path (lua_State *L, const ucl_object_t *cfg_obj, - GHashTable *vars); + GHashTable *vars); /* Set some lua globals */ gboolean rspamd_lua_set_env (lua_State *L, GHashTable *vars, char **lua_env, - GError **err); + GError **err); + void rspamd_lua_set_globals (struct rspamd_config *cfg, lua_State *L); -struct memory_pool_s * rspamd_lua_check_mempool (lua_State * L, gint pos); -struct rspamd_config * lua_check_config (lua_State * L, gint pos); -struct rspamd_async_session* lua_check_session (lua_State * L, gint pos); -struct ev_loop* lua_check_ev_base (lua_State * L, gint pos); -struct rspamd_dns_resolver * lua_check_dns_resolver (lua_State * L, gint pos); +struct memory_pool_s *rspamd_lua_check_mempool (lua_State *L, gint pos); + +struct rspamd_config *lua_check_config (lua_State *L, gint pos); + +struct rspamd_async_session *lua_check_session (lua_State *L, gint pos); + +struct ev_loop *lua_check_ev_base (lua_State *L, gint pos); + +struct rspamd_dns_resolver *lua_check_dns_resolver (lua_State *L, gint pos); enum rspamd_lua_parse_arguments_flags { RSPAMD_LUA_PARSE_ARGUMENTS_DEFAULT = 0, RSPAMD_LUA_PARSE_ARGUMENTS_IGNORE_MISSING, }; + /** * Extract an arguments from lua table according to format string. Supported arguments are: * [*]key=S|I|N|B|V|U{a-z};[key=...] @@ -419,7 +467,7 @@ void *rspamd_lua_check_udata_maybe (lua_State *L, gint pos, const gchar *classna * @param task */ void lua_call_finish_script (struct rspamd_config_cfg_lua_script *sc, - struct rspamd_task *task); + struct rspamd_task *task); /** * Run post-load operations @@ -428,9 +476,10 @@ void lua_call_finish_script (struct rspamd_config_cfg_lua_script *sc, * @param ev_base */ void rspamd_lua_run_postloads (lua_State *L, struct rspamd_config *cfg, - struct ev_loop *ev_base, struct rspamd_worker *w); + struct ev_loop *ev_base, struct rspamd_worker *w); void rspamd_lua_run_config_post_init (lua_State *L, struct rspamd_config *cfg); + void rspamd_lua_run_config_unload (lua_State *L, struct rspamd_config *cfg); /** @@ -440,7 +489,7 @@ void rspamd_lua_run_config_unload (lua_State *L, struct rspamd_config *cfg); * @param ref */ void rspamd_lua_add_ref_dtor (lua_State *L, rspamd_mempool_t *pool, - gint ref); + gint ref); /** * Tries to load some module using `require` and get some method from it @@ -450,7 +499,7 @@ void rspamd_lua_add_ref_dtor (lua_State *L, rspamd_mempool_t *pool, * @return TRUE if function exists in that module, the function is pushed in stack, otherwise stack is unchanged and FALSE is returned */ gboolean rspamd_lua_require_function (lua_State *L, const gchar *modname, - const gchar *funcname); + const gchar *funcname); /** * Tries to load redis server definition from ucl object specified @@ -460,9 +509,10 @@ gboolean rspamd_lua_require_function (lua_State *L, const gchar *modname, * @return */ gboolean rspamd_lua_try_load_redis (lua_State *L, const ucl_object_t *obj, - struct rspamd_config *cfg, gint *ref_id); + struct rspamd_config *cfg, gint *ref_id); struct rspamd_stat_token_s; + /** * Pushes a single word into Lua * @param L @@ -477,6 +527,7 @@ enum rspamd_lua_words_type { RSPAMD_LUA_WORDS_FULL, RSPAMD_LUA_WORDS_MAX }; + /** * Pushes words (rspamd_stat_token_t) to Lua * @param L @@ -484,7 +535,7 @@ enum rspamd_lua_words_type { * @param how */ gint rspamd_lua_push_words (lua_State *L, GArray *words, - enum rspamd_lua_words_type how); + enum rspamd_lua_words_type how); /* Paths defs */ #define RSPAMD_CONFDIR_INDEX "CONFDIR" @@ -516,5 +567,8 @@ extern ucl_object_t *lua_traces; #define LUA_TRACE_POINT do {} while(0) #endif -#endif /* WITH_LUA */ +#ifdef __cplusplus +} +#endif + #endif /* RSPAMD_LUA_H */ diff --git a/src/lua/lua_map.h b/src/lua/lua_map.h index a44bd12e9..7b18df7a5 100644 --- a/src/lua/lua_map.h +++ b/src/lua/lua_map.h @@ -18,6 +18,10 @@ #include "lua_common.h" +#ifdef __cplusplus +extern "C" { +#endif + LUA_PUBLIC_FUNCTION_DEF (config, add_radix_map); LUA_PUBLIC_FUNCTION_DEF (config, radix_from_config); LUA_PUBLIC_FUNCTION_DEF (config, radix_from_ucl); @@ -27,4 +31,8 @@ LUA_PUBLIC_FUNCTION_DEF (config, add_kv_map); LUA_PUBLIC_FUNCTION_DEF (config, add_map); LUA_PUBLIC_FUNCTION_DEF (config, get_maps); +#ifdef __cplusplus +} +#endif + #endif /* SRC_LUA_LUA_MAP_H_ */ diff --git a/src/lua/lua_thread_pool.h b/src/lua/lua_thread_pool.h index d44eb0d54..be954271d 100644 --- a/src/lua/lua_thread_pool.h +++ b/src/lua/lua_thread_pool.h @@ -3,10 +3,15 @@ #include <lua.h> +#ifdef __cplusplus +extern "C" { +#endif + struct thread_entry; struct lua_thread_pool; typedef void (*lua_thread_finish_t) (struct thread_entry *thread, int ret); + typedef void (*lua_thread_error_t) (struct thread_entry *thread, int ret, const char *msg); struct thread_entry { @@ -37,7 +42,7 @@ struct lua_callback_state { * @return */ struct lua_thread_pool * -lua_thread_pool_new (lua_State * L); +lua_thread_pool_new (lua_State *L); /** * Destroys the pool @@ -80,8 +85,9 @@ void lua_thread_pool_return_full (struct lua_thread_pool *pool, struct thread_entry *thread_entry, const gchar *loc); + #define lua_thread_pool_return(pool, thread_entry) \ - lua_thread_pool_return_full (pool, thread_entry, G_STRLOC) + lua_thread_pool_return_full (pool, thread_entry, G_STRLOC) /** * Currently running thread. Typically needed in yielding point - to fill-up continuation. @@ -92,8 +98,10 @@ lua_thread_pool_return_full (struct lua_thread_pool *pool, struct thread_entry * lua_thread_pool_get_running_entry_full (struct lua_thread_pool *pool, const gchar *loc); + #define lua_thread_pool_get_running_entry(pool) \ - lua_thread_pool_get_running_entry_full (pool, G_STRLOC) + lua_thread_pool_get_running_entry_full (pool, G_STRLOC) + /** * Updates currently running thread * @@ -104,8 +112,10 @@ void lua_thread_pool_set_running_entry_full (struct lua_thread_pool *pool, struct thread_entry *thread_entry, const gchar *loc); + #define lua_thread_pool_set_running_entry(pool, thread_entry) \ - lua_thread_pool_set_running_entry_full (pool, thread_entry, G_STRLOC) + lua_thread_pool_set_running_entry_full (pool, thread_entry, G_STRLOC) + /** * Prevents yielded thread to be used for callback execution. lua_thread_pool_restore_callback() should be called afterwards. * @@ -114,9 +124,11 @@ lua_thread_pool_set_running_entry_full (struct lua_thread_pool *pool, */ void lua_thread_pool_prepare_callback_full (struct lua_thread_pool *pool, - struct lua_callback_state *cbs, const gchar *loc); + struct lua_callback_state *cbs, const gchar *loc); + #define lua_thread_pool_prepare_callback(pool, cbs) \ - lua_thread_pool_prepare_callback_full (pool, cbs, G_STRLOC) + lua_thread_pool_prepare_callback_full (pool, cbs, G_STRLOC) + /** * Restores state after lua_thread_pool_prepare_callback () usage * @@ -124,9 +136,10 @@ lua_thread_pool_prepare_callback_full (struct lua_thread_pool *pool, */ void lua_thread_pool_restore_callback_full (struct lua_callback_state *cbs, - const gchar *loc); + const gchar *loc); + #define lua_thread_pool_restore_callback(cbs) \ - lua_thread_pool_restore_callback_full (cbs, G_STRLOC) + lua_thread_pool_restore_callback_full (cbs, G_STRLOC) /** * Acts like lua_call but the tread is able to suspend execution. @@ -139,8 +152,9 @@ void lua_thread_call_full (struct thread_entry *thread_entry, int narg, const gchar *loc); + #define lua_thread_call(thread_entry, narg) \ - lua_thread_call_full (thread_entry, narg, G_STRLOC) + lua_thread_call_full (thread_entry, narg, G_STRLOC) /** * Yields thread. should be only called in return statement @@ -150,9 +164,10 @@ lua_thread_call_full (struct thread_entry *thread_entry, */ int lua_thread_yield_full (struct thread_entry *thread_entry, int nresults, - const gchar *loc); + const gchar *loc); + #define lua_thread_yield(thread_entry, narg) \ - lua_thread_yield_full (thread_entry, narg, G_STRLOC) + lua_thread_yield_full (thread_entry, narg, G_STRLOC) /** * Resumes suspended by lua_yield_thread () thread @@ -164,8 +179,13 @@ void lua_thread_resume_full (struct thread_entry *thread_entry, int narg, const gchar *loc); + #define lua_thread_resume(thread_entry, narg) \ - lua_thread_resume_full (thread_entry, narg, G_STRLOC) + lua_thread_resume_full (thread_entry, narg, G_STRLOC) + +#ifdef __cplusplus +} +#endif #endif /* LUA_THREAD_POOL_H_ */ diff --git a/src/rspamadm/rspamadm.h b/src/rspamadm/rspamadm.h index e8ed9c873..e1a638df7 100644 --- a/src/rspamadm/rspamadm.h +++ b/src/rspamadm/rspamadm.h @@ -22,6 +22,10 @@ #include <lauxlib.h> #include <lualib.h> +#ifdef __cplusplus +extern "C" { +#endif + extern GHashTable *ucl_vars; extern gchar **lua_env; extern struct rspamd_main *rspamd_main; @@ -29,10 +33,13 @@ extern struct rspamd_main *rspamd_main; GQuark rspamadm_error (void); struct rspamadm_command; -typedef const gchar* (*rspamadm_help_func) (gboolean full_help, + +typedef const gchar *(*rspamadm_help_func) (gboolean full_help, const struct rspamadm_command *cmd); + typedef void (*rspamadm_run_func) (gint argc, gchar **argv, const struct rspamadm_command *cmd); + typedef void (*rspamadm_lua_exports_func) (gpointer lua_state); #define RSPAMADM_FLAG_NOHELP (1 << 0) @@ -52,8 +59,10 @@ extern const struct rspamadm_command *commands[]; extern struct rspamadm_command help_command; const struct rspamadm_command *rspamadm_search_command (const gchar *name, - GPtrArray *all_commands); + GPtrArray *all_commands); + void rspamadm_fill_internal_commands (GPtrArray *dest); + void rspamadm_fill_lua_commands (lua_State *L, GPtrArray *dest); gboolean rspamadm_execute_lua_ucl_subr (gint argc, gchar **argv, @@ -62,6 +71,7 @@ gboolean rspamadm_execute_lua_ucl_subr (gint argc, gchar **argv, gboolean rspamadm_subcommand); struct thread_entry; + typedef void (*lua_thread_error_t) (struct thread_entry *thread, int ret, const char *msg); @@ -70,7 +80,12 @@ struct lua_call_data { gint ret; gpointer ud; }; + gint lua_repl_thread_call (struct thread_entry *thread, gint narg, - gpointer ud, lua_thread_error_t error_func); + gpointer ud, lua_thread_error_t error_func); + +#ifdef __cplusplus +} +#endif #endif diff --git a/src/rspamd.h b/src/rspamd.h index a56fab2b4..0a0fb45fc 100644 --- a/src/rspamd.h +++ b/src/rspamd.h @@ -25,11 +25,13 @@ #include "libutil/http_connection.h" #include "libutil/upstream.h" #include "libutil/radix.h" +#include "libserver/cfg_file.h" #include "libserver/url.h" #include "libserver/protocol.h" #include "libserver/async_session.h" #include "libserver/roll_history.h" #include "libserver/task.h" + #include <openssl/ssl.h> #include <magic.h> @@ -52,6 +54,10 @@ #define CR '\r' #define LF '\n' +#ifdef __cplusplus +extern "C" { +#endif + enum rspamd_worker_flags { RSPAMD_WORKER_HAS_SOCKET = (1 << 0), RSPAMD_WORKER_UNIQUE = (1 << 1), @@ -69,8 +75,8 @@ struct rspamd_worker_accept_event { struct rspamd_worker_accept_event *prev, *next; }; -typedef void (*rspamd_worker_term_cb)(EV_P_ ev_child *, struct rspamd_main *, - struct rspamd_worker *); +typedef void (*rspamd_worker_term_cb) (EV_P_ ev_child *, struct rspamd_main *, + struct rspamd_worker *); /** * Worker process structure @@ -114,6 +120,7 @@ struct rspamd_abstract_worker_ctx { }; struct rspamd_worker_signal_handler; + typedef gboolean (*rspamd_worker_signal_cb_t) ( struct rspamd_worker_signal_handler *, void *ud); @@ -147,10 +154,11 @@ struct rspamd_controller_pbkdf { * Common structure representing C module context */ struct module_s; + struct module_ctx { - gint (*filter)(struct rspamd_task *task); /**< pointer to headers process function */ - struct module_s *mod; /**< module pointer */ - gboolean enabled; /**< true if module is enabled in configuration */ + gint (*filter) (struct rspamd_task *task); /**< pointer to headers process function */ + struct module_s *mod; /**< module pointer */ + gboolean enabled; /**< true if module is enabled in configuration */ }; #ifndef WITH_HYPERSCAN @@ -178,28 +186,33 @@ struct module_ctx { #define RSPAMD_CUR_WORKER_VERSION 0x2 #define RSPAMD_FEATURES \ - RSPAMD_FEATURE_HYPERSCAN RSPAMD_FEATURE_PCRE2 \ - RSPAMD_FEATURE_FANN RSPAMD_FEATURE_SNOWBALL + RSPAMD_FEATURE_HYPERSCAN RSPAMD_FEATURE_PCRE2 \ + RSPAMD_FEATURE_FANN RSPAMD_FEATURE_SNOWBALL #define RSPAMD_MODULE_VER \ - RSPAMD_CUR_MODULE_VERSION, /* Module version */ \ - RSPAMD_VERSION_NUM, /* Rspamd version */ \ - RSPAMD_FEATURES /* Compilation features */ \ + RSPAMD_CUR_MODULE_VERSION, /* Module version */ \ + RSPAMD_VERSION_NUM, /* Rspamd version */ \ + RSPAMD_FEATURES /* Compilation features */ \ #define RSPAMD_WORKER_VER \ - RSPAMD_CUR_WORKER_VERSION, /* Worker version */ \ - RSPAMD_VERSION_NUM, /* Rspamd version */ \ - RSPAMD_FEATURES /* Compilation features */ \ + RSPAMD_CUR_WORKER_VERSION, /* Worker version */ \ + RSPAMD_VERSION_NUM, /* Rspamd version */ \ + RSPAMD_FEATURES /* Compilation features */ \ /** * Module */ typedef struct module_s { const gchar *name; - int (*module_init_func)(struct rspamd_config *cfg, struct module_ctx **ctx); - int (*module_config_func)(struct rspamd_config *cfg); - int (*module_reconfig_func)(struct rspamd_config *cfg); - int (*module_attach_controller_func)(struct module_ctx *ctx, - GHashTable *custom_commands); + + int (*module_init_func) (struct rspamd_config *cfg, struct module_ctx **ctx); + + int (*module_config_func) (struct rspamd_config *cfg); + + int (*module_reconfig_func) (struct rspamd_config *cfg); + + int (*module_attach_controller_func) (struct module_ctx *ctx, + GHashTable *custom_commands); + guint module_version; guint64 rspamd_version; const gchar *rspamd_features; @@ -220,8 +233,11 @@ struct rspamd_worker_listen_socket { typedef struct worker_s { const gchar *name; - gpointer (*worker_init_func)(struct rspamd_config *cfg); - void (*worker_start_func)(struct rspamd_worker *worker); + + gpointer (*worker_init_func) (struct rspamd_config *cfg); + + void (*worker_start_func) (struct rspamd_worker *worker); + int flags; int listen_type; guint worker_version; @@ -313,8 +329,9 @@ struct rspamd_process_exception { */ struct controller_command; struct controller_session; -typedef gboolean (*controller_func_t)(gchar **args, - struct controller_session *session); + +typedef gboolean (*controller_func_t) (gchar **args, + struct controller_session *session); struct controller_session { struct rspamd_worker *worker; /**< pointer to worker structure (controller in fact) */ @@ -322,7 +339,7 @@ struct controller_session { struct controller_command *cmd; /**< real command */ struct rspamd_config *cfg; /**< pointer to config file */ GList *parts; /**< extracted mime parts */ - struct rspamd_async_session * s; /**< async session object */ + struct rspamd_async_session *s; /**< async session object */ struct rspamd_dns_resolver *resolver; /**< DNS resolver */ struct ev_loop *ev_base; /**< Event base */ }; @@ -354,17 +371,20 @@ struct rspamd_external_libs_ctx { * Register custom controller function */ void register_custom_controller_command (const gchar *name, - controller_func_t handler, - gboolean privilleged, - gboolean require_message); + controller_func_t handler, + gboolean privilleged, + gboolean require_message); enum rspamd_pbkdf_version_id { RSPAMD_PBKDF_ID_V1 = 1, - RSPAMD_PBKDF_ID_V2= 2, + RSPAMD_PBKDF_ID_V2 = 2, RSPAMD_PBKDF_ID_MAX }; extern const struct rspamd_controller_pbkdf pbkdf_list[]; +#ifdef __cplusplus +} +#endif #endif
\ No newline at end of file diff --git a/src/worker_private.h b/src/worker_private.h index 6d0e763aa..cef2c9a19 100644 --- a/src/worker_private.h +++ b/src/worker_private.h @@ -23,6 +23,10 @@ #include "libserver/cfg_file.h" #include "libserver/rspamd_control.h" +#ifdef __cplusplus +extern "C" { +#endif + static const guint64 rspamd_worker_magic = 0xb48abc69d601dc1dULL; struct rspamd_lang_detector; @@ -52,13 +56,14 @@ struct rspamd_worker_ctx { /* Language detector */ struct rspamd_lang_detector *lang_det; }; + /* * Init scanning routines */ void rspamd_worker_init_scanner (struct rspamd_worker *worker, - struct ev_loop *ev_base, - struct rspamd_dns_resolver *resolver, - struct rspamd_lang_detector **plang_det); + struct ev_loop *ev_base, + struct rspamd_dns_resolver *resolver, + struct rspamd_lang_detector **plang_det); /* * Called on forced timeout @@ -70,4 +75,8 @@ void rspamd_task_timeout (EV_P_ ev_timer *w, int revents); */ void rspamd_worker_guard_handler (EV_P_ ev_io *w, int revents); +#ifdef __cplusplus +} +#endif + #endif diff --git a/test/tests.h b/test/tests.h index 56562ae8c..95eef354d 100644 --- a/test/tests.h +++ b/test/tests.h @@ -5,6 +5,10 @@ * Here are described test functions for rspamd test suite */ +#ifdef __cplusplus +extern "C" { +#endif + /* URL parser test */ void rspamd_url_test_func (void); @@ -38,6 +42,10 @@ void rspamd_cryptobox_test_func (void); void rspamd_heap_test_func (void); -void rspamd_lua_lua_pcall_vs_resume_test_func(void); +void rspamd_lua_lua_pcall_vs_resume_test_func (void); + +#ifdef __cplusplus +} +#endif #endif |